From c670d170ff2d521005e5e488889bcec2d7d4ce29 Mon Sep 17 00:00:00 2001 From: Camm Maguire Date: Sun, 13 Nov 2022 12:55:14 +0000 Subject: [PATCH] Import gcl_2.6.12-129.debian.tar.xz [dgit import tarball gcl 2.6.12-129 gcl_2.6.12-129.debian.tar.xz] --- debian/README.Debian | 28 + debian/changelog | 4222 + debian/compat | 1 + debian/control | 39 + debian/control. | 39 + debian/control.cvs | 39 + debian/copyright | 65 + debian/gcl.lintian-overrides | 9 + debian/gcl.sh | 28 + debian/gcl.templates | 38 + debian/in.gcl-doc.README.Debian | 9 + debian/in.gcl-doc.doc-base.main | 9 + debian/in.gcl-doc.doc-base.si | 12 + debian/in.gcl-doc.doc-base.tk | 12 + debian/in.gcl-doc.doc-base.xgcl | 15 + debian/in.gcl-doc.docs | 3 + debian/in.gcl-doc.info | 14 + debian/in.gcl-doc.install | 1 + debian/in.gcl.config | 19 + debian/in.gcl.docs | 2 + debian/in.gcl.emacsen-compat | 1 + debian/in.gcl.emacsen-install | 46 + debian/in.gcl.emacsen-remove | 15 + debian/in.gcl.emacsen-startup | 19 + debian/in.gcl.install | 3 + debian/in.gcl.manpages | 1 + debian/in.gcl.postinst | 41 + debian/in.gcl.postrm | 22 + debian/old.in.gcl-doc.doc-base.main | 12 + debian/patches/Version_2.6.13pre105 | 36 + debian/patches/Version_2.6.13pre106 | 10884 + debian/patches/Version_2.6.13pre107 | 36 + debian/patches/Version_2.6.13pre108 | 38 + debian/patches/Version_2.6.13pre109 | 2643 + debian/patches/Version_2.6.13pre110 | 33 + debian/patches/Version_2.6.13pre111 | 34 + debian/patches/Version_2.6.13pre112 | 36 + debian/patches/Version_2.6.13pre113 | 176 + debian/patches/Version_2.6.13pre114 | 64 + debian/patches/Version_2.6.13pre121 | 116 + debian/patches/Version_2.6.13pre96 | 297 + debian/patches/Version_2_6_13pre1 | 13167 + debian/patches/Version_2_6_13pre100 | 471 + debian/patches/Version_2_6_13pre101 | 87 + debian/patches/Version_2_6_13pre102 | 71 + debian/patches/Version_2_6_13pre103 | 142 + debian/patches/Version_2_6_13pre119 | 58 + debian/patches/Version_2_6_13pre12 | 1168 + debian/patches/Version_2_6_13pre120 | 347 + debian/patches/Version_2_6_13pre124 | 5468 + debian/patches/Version_2_6_13pre125 | 5896 + debian/patches/Version_2_6_13pre126 | 119 + debian/patches/Version_2_6_13pre128 | 2033 + debian/patches/Version_2_6_13pre129 | 31 + debian/patches/Version_2_6_13pre13 | 103 + debian/patches/Version_2_6_13pre16 | 2585 + debian/patches/Version_2_6_13pre17 | 76 + debian/patches/Version_2_6_13pre18 | 573 + debian/patches/Version_2_6_13pre19 | 92 + debian/patches/Version_2_6_13pre1a | 86 + debian/patches/Version_2_6_13pre1b | 36 + debian/patches/Version_2_6_13pre2 | 229 + debian/patches/Version_2_6_13pre20 | 45 + debian/patches/Version_2_6_13pre22 | 357 + debian/patches/Version_2_6_13pre25 | 185 + debian/patches/Version_2_6_13pre26 | 235 + debian/patches/Version_2_6_13pre27 | 161 + debian/patches/Version_2_6_13pre28 | 353 + debian/patches/Version_2_6_13pre29 | 47 + debian/patches/Version_2_6_13pre3 | 124 + debian/patches/Version_2_6_13pre30 | 111 + debian/patches/Version_2_6_13pre31 | 115 + debian/patches/Version_2_6_13pre32 | 57 + debian/patches/Version_2_6_13pre33 | 232 + debian/patches/Version_2_6_13pre34 | 34 + debian/patches/Version_2_6_13pre35 | 40 + debian/patches/Version_2_6_13pre36 | 89 + debian/patches/Version_2_6_13pre38 | 308 + debian/patches/Version_2_6_13pre39 | 53 + debian/patches/Version_2_6_13pre3a | 62 + debian/patches/Version_2_6_13pre4 | 647 + debian/patches/Version_2_6_13pre41 | 185 + debian/patches/Version_2_6_13pre45 | 253 + debian/patches/Version_2_6_13pre46 | 237 + debian/patches/Version_2_6_13pre47 | 36 + debian/patches/Version_2_6_13pre48 | 59 + debian/patches/Version_2_6_13pre49 | 33 + debian/patches/Version_2_6_13pre5 | 83 + debian/patches/Version_2_6_13pre50 | 223 + debian/patches/Version_2_6_13pre52 | 36 + debian/patches/Version_2_6_13pre54 | 2878 + debian/patches/Version_2_6_13pre55 | 132 + debian/patches/Version_2_6_13pre56 | 107 + debian/patches/Version_2_6_13pre57 | 36 + debian/patches/Version_2_6_13pre58 | 86 + debian/patches/Version_2_6_13pre59 | 88 + debian/patches/Version_2_6_13pre6 | 156 + debian/patches/Version_2_6_13pre60 | 61 + debian/patches/Version_2_6_13pre61 | 45 + debian/patches/Version_2_6_13pre62 | 113 + debian/patches/Version_2_6_13pre63 | 78 + debian/patches/Version_2_6_13pre64 | 169 + debian/patches/Version_2_6_13pre65 | 212 + debian/patches/Version_2_6_13pre66 | 132 + debian/patches/Version_2_6_13pre67 | 256 + debian/patches/Version_2_6_13pre68 | 35 + debian/patches/Version_2_6_13pre69 | 32 + debian/patches/Version_2_6_13pre7 | 163 + debian/patches/Version_2_6_13pre70 | 108 + debian/patches/Version_2_6_13pre71 | 59 + debian/patches/Version_2_6_13pre72 | 103 + debian/patches/Version_2_6_13pre73 | 130 + debian/patches/Version_2_6_13pre74 | 47 + debian/patches/Version_2_6_13pre76 | 446 + debian/patches/Version_2_6_13pre77 | 71 + debian/patches/Version_2_6_13pre78 | 38 + debian/patches/Version_2_6_13pre79 | 47 + debian/patches/Version_2_6_13pre80 | 111 + debian/patches/Version_2_6_13pre81 | 71 + debian/patches/Version_2_6_13pre82 | 40 + debian/patches/Version_2_6_13pre83 | 446 + debian/patches/Version_2_6_13pre84 | 45 + debian/patches/Version_2_6_13pre85 | 123 + debian/patches/Version_2_6_13pre86 | 45 + debian/patches/Version_2_6_13pre87 | 89 + debian/patches/Version_2_6_13pre88 | 151 + debian/patches/Version_2_6_13pre89 | 277 + debian/patches/Version_2_6_13pre8a | 1359 + debian/patches/Version_2_6_13pre8b | 43 + debian/patches/Version_2_6_13pre90 | 90 + debian/patches/Version_2_6_13pre92 | 53 + debian/patches/Version_2_6_13pre94 | 39 + debian/patches/Version_2_6_13pre95 | 67 + debian/patches/Version_2_6_13pre98 | 431 + debian/patches/Version_2_6_13pre99 | 419865 +++++++++++++++ debian/patches/ansi-test-clean-target | 33 + .../data_bss_offset-in-unexec-sparc64-fix | 83 + debian/patches/defined_real_maxpage | 71 + debian/patches/disable_gprof_aarch64 | 56 + debian/patches/list_order.1 | 8651 + debian/patches/list_order.11 | 600 + debian/patches/list_order.12 | 50 + debian/patches/list_order.13 | 36 + debian/patches/list_order.16 | 412 + debian/patches/list_order.17 | 1136 + debian/patches/list_order.18 | 60 + debian/patches/list_order.19 | 218 + debian/patches/list_order.20 | 72 + debian/patches/list_order.21 | 48 + debian/patches/list_order.22 | 62 + debian/patches/list_order.23 | 85 + debian/patches/list_order.24 | 44 + debian/patches/list_order.25 | 81 + debian/patches/list_order.4 | 36 + debian/patches/list_order.5 | 205 + debian/patches/list_order.6 | 103 + debian/patches/list_order.7 | 47 + debian/patches/list_order.8 | 78 + debian/patches/list_order.9 | 146 + debian/patches/pathnames1.1 | 18763 + debian/patches/pathnames1.11 | 246 + debian/patches/pathnames1.12 | 68 + debian/patches/pathnames1.13 | 40 + debian/patches/pathnames1.2 | 1196 + debian/patches/pathnames1.3 | 48 + debian/patches/pathnames1.4 | 36 + debian/patches/pathnames1.5 | 10494 + debian/patches/pathnames1.6 | 42 + debian/patches/pathnames1.7 | 601 + debian/patches/pathnames1.9 | 5609 + debian/patches/real_list_order.12 | 159 + debian/patches/series | 142 + debian/po/POTFILES.in | 1 + debian/po/cs.po | 139 + debian/po/da.po | 97 + debian/po/de.po | 139 + debian/po/es.po | 209 + debian/po/fi.po | 95 + debian/po/fr.po | 141 + debian/po/gl.po | 138 + debian/po/it.po | 102 + debian/po/ja.po | 96 + debian/po/nl.po | 101 + debian/po/pt.po | 99 + debian/po/pt_BR.po | 98 + debian/po/ru.po | 100 + debian/po/sv.po | 106 + debian/po/templates.pot | 82 + debian/po/vi.po | 98 + debian/rules | 281 + debian/source/format | 1 + debian/source/include-binaries | 4 + debian/source/lintian-overrides | 11 + debian/texi.awk | 27 + debian/upstream/signing-key.asc | 88 + debian/watch | 2 + info/gcl-si.pdf | Bin 0 -> 266557 bytes info/gcl-tk.pdf | Bin 0 -> 398098 bytes info/gcl.pdf | Bin 0 -> 2495991 bytes 199 files changed, 537680 insertions(+) create mode 100644 debian/README.Debian create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/control. create mode 100644 debian/control.cvs create mode 100644 debian/copyright create mode 100644 debian/gcl.lintian-overrides create mode 100755 debian/gcl.sh create mode 100644 debian/gcl.templates create mode 100644 debian/in.gcl-doc.README.Debian create mode 100644 debian/in.gcl-doc.doc-base.main create mode 100644 debian/in.gcl-doc.doc-base.si create mode 100644 debian/in.gcl-doc.doc-base.tk create mode 100644 debian/in.gcl-doc.doc-base.xgcl create mode 100644 debian/in.gcl-doc.docs create mode 100644 debian/in.gcl-doc.info create mode 100644 debian/in.gcl-doc.install create mode 100644 debian/in.gcl.config create mode 100644 debian/in.gcl.docs create mode 100644 debian/in.gcl.emacsen-compat create mode 100644 debian/in.gcl.emacsen-install create mode 100644 debian/in.gcl.emacsen-remove create mode 100644 debian/in.gcl.emacsen-startup create mode 100644 debian/in.gcl.install create mode 100644 debian/in.gcl.manpages create mode 100644 debian/in.gcl.postinst create mode 100644 debian/in.gcl.postrm create mode 100644 debian/old.in.gcl-doc.doc-base.main create mode 100644 debian/patches/Version_2.6.13pre105 create mode 100644 debian/patches/Version_2.6.13pre106 create mode 100644 debian/patches/Version_2.6.13pre107 create mode 100644 debian/patches/Version_2.6.13pre108 create mode 100644 debian/patches/Version_2.6.13pre109 create mode 100644 debian/patches/Version_2.6.13pre110 create mode 100644 debian/patches/Version_2.6.13pre111 create mode 100644 debian/patches/Version_2.6.13pre112 create mode 100644 debian/patches/Version_2.6.13pre113 create mode 100644 debian/patches/Version_2.6.13pre114 create mode 100644 debian/patches/Version_2.6.13pre121 create mode 100644 debian/patches/Version_2.6.13pre96 create mode 100644 debian/patches/Version_2_6_13pre1 create mode 100644 debian/patches/Version_2_6_13pre100 create mode 100644 debian/patches/Version_2_6_13pre101 create mode 100644 debian/patches/Version_2_6_13pre102 create mode 100644 debian/patches/Version_2_6_13pre103 create mode 100644 debian/patches/Version_2_6_13pre119 create mode 100644 debian/patches/Version_2_6_13pre12 create mode 100644 debian/patches/Version_2_6_13pre120 create mode 100644 debian/patches/Version_2_6_13pre124 create mode 100644 debian/patches/Version_2_6_13pre125 create mode 100644 debian/patches/Version_2_6_13pre126 create mode 100644 debian/patches/Version_2_6_13pre128 create mode 100644 debian/patches/Version_2_6_13pre129 create mode 100644 debian/patches/Version_2_6_13pre13 create mode 100644 debian/patches/Version_2_6_13pre16 create mode 100644 debian/patches/Version_2_6_13pre17 create mode 100644 debian/patches/Version_2_6_13pre18 create mode 100644 debian/patches/Version_2_6_13pre19 create mode 100644 debian/patches/Version_2_6_13pre1a create mode 100644 debian/patches/Version_2_6_13pre1b create mode 100644 debian/patches/Version_2_6_13pre2 create mode 100644 debian/patches/Version_2_6_13pre20 create mode 100644 debian/patches/Version_2_6_13pre22 create mode 100644 debian/patches/Version_2_6_13pre25 create mode 100644 debian/patches/Version_2_6_13pre26 create mode 100644 debian/patches/Version_2_6_13pre27 create mode 100644 debian/patches/Version_2_6_13pre28 create mode 100644 debian/patches/Version_2_6_13pre29 create mode 100644 debian/patches/Version_2_6_13pre3 create mode 100644 debian/patches/Version_2_6_13pre30 create mode 100644 debian/patches/Version_2_6_13pre31 create mode 100644 debian/patches/Version_2_6_13pre32 create mode 100644 debian/patches/Version_2_6_13pre33 create mode 100644 debian/patches/Version_2_6_13pre34 create mode 100644 debian/patches/Version_2_6_13pre35 create mode 100644 debian/patches/Version_2_6_13pre36 create mode 100644 debian/patches/Version_2_6_13pre38 create mode 100644 debian/patches/Version_2_6_13pre39 create mode 100644 debian/patches/Version_2_6_13pre3a create mode 100644 debian/patches/Version_2_6_13pre4 create mode 100644 debian/patches/Version_2_6_13pre41 create mode 100644 debian/patches/Version_2_6_13pre45 create mode 100644 debian/patches/Version_2_6_13pre46 create mode 100644 debian/patches/Version_2_6_13pre47 create mode 100644 debian/patches/Version_2_6_13pre48 create mode 100644 debian/patches/Version_2_6_13pre49 create mode 100644 debian/patches/Version_2_6_13pre5 create mode 100644 debian/patches/Version_2_6_13pre50 create mode 100644 debian/patches/Version_2_6_13pre52 create mode 100644 debian/patches/Version_2_6_13pre54 create mode 100644 debian/patches/Version_2_6_13pre55 create mode 100644 debian/patches/Version_2_6_13pre56 create mode 100644 debian/patches/Version_2_6_13pre57 create mode 100644 debian/patches/Version_2_6_13pre58 create mode 100644 debian/patches/Version_2_6_13pre59 create mode 100644 debian/patches/Version_2_6_13pre6 create mode 100644 debian/patches/Version_2_6_13pre60 create mode 100644 debian/patches/Version_2_6_13pre61 create mode 100644 debian/patches/Version_2_6_13pre62 create mode 100644 debian/patches/Version_2_6_13pre63 create mode 100644 debian/patches/Version_2_6_13pre64 create mode 100644 debian/patches/Version_2_6_13pre65 create mode 100644 debian/patches/Version_2_6_13pre66 create mode 100644 debian/patches/Version_2_6_13pre67 create mode 100644 debian/patches/Version_2_6_13pre68 create mode 100644 debian/patches/Version_2_6_13pre69 create mode 100644 debian/patches/Version_2_6_13pre7 create mode 100644 debian/patches/Version_2_6_13pre70 create mode 100644 debian/patches/Version_2_6_13pre71 create mode 100644 debian/patches/Version_2_6_13pre72 create mode 100644 debian/patches/Version_2_6_13pre73 create mode 100644 debian/patches/Version_2_6_13pre74 create mode 100644 debian/patches/Version_2_6_13pre76 create mode 100644 debian/patches/Version_2_6_13pre77 create mode 100644 debian/patches/Version_2_6_13pre78 create mode 100644 debian/patches/Version_2_6_13pre79 create mode 100644 debian/patches/Version_2_6_13pre80 create mode 100644 debian/patches/Version_2_6_13pre81 create mode 100644 debian/patches/Version_2_6_13pre82 create mode 100644 debian/patches/Version_2_6_13pre83 create mode 100644 debian/patches/Version_2_6_13pre84 create mode 100644 debian/patches/Version_2_6_13pre85 create mode 100644 debian/patches/Version_2_6_13pre86 create mode 100644 debian/patches/Version_2_6_13pre87 create mode 100644 debian/patches/Version_2_6_13pre88 create mode 100644 debian/patches/Version_2_6_13pre89 create mode 100644 debian/patches/Version_2_6_13pre8a create mode 100644 debian/patches/Version_2_6_13pre8b create mode 100644 debian/patches/Version_2_6_13pre90 create mode 100644 debian/patches/Version_2_6_13pre92 create mode 100644 debian/patches/Version_2_6_13pre94 create mode 100644 debian/patches/Version_2_6_13pre95 create mode 100644 debian/patches/Version_2_6_13pre98 create mode 100644 debian/patches/Version_2_6_13pre99 create mode 100644 debian/patches/ansi-test-clean-target create mode 100644 debian/patches/data_bss_offset-in-unexec-sparc64-fix create mode 100644 debian/patches/defined_real_maxpage create mode 100644 debian/patches/disable_gprof_aarch64 create mode 100644 debian/patches/list_order.1 create mode 100644 debian/patches/list_order.11 create mode 100644 debian/patches/list_order.12 create mode 100644 debian/patches/list_order.13 create mode 100644 debian/patches/list_order.16 create mode 100644 debian/patches/list_order.17 create mode 100644 debian/patches/list_order.18 create mode 100644 debian/patches/list_order.19 create mode 100644 debian/patches/list_order.20 create mode 100644 debian/patches/list_order.21 create mode 100644 debian/patches/list_order.22 create mode 100644 debian/patches/list_order.23 create mode 100644 debian/patches/list_order.24 create mode 100644 debian/patches/list_order.25 create mode 100644 debian/patches/list_order.4 create mode 100644 debian/patches/list_order.5 create mode 100644 debian/patches/list_order.6 create mode 100644 debian/patches/list_order.7 create mode 100644 debian/patches/list_order.8 create mode 100644 debian/patches/list_order.9 create mode 100644 debian/patches/pathnames1.1 create mode 100644 debian/patches/pathnames1.11 create mode 100644 debian/patches/pathnames1.12 create mode 100644 debian/patches/pathnames1.13 create mode 100644 debian/patches/pathnames1.2 create mode 100644 debian/patches/pathnames1.3 create mode 100644 debian/patches/pathnames1.4 create mode 100644 debian/patches/pathnames1.5 create mode 100644 debian/patches/pathnames1.6 create mode 100644 debian/patches/pathnames1.7 create mode 100644 debian/patches/pathnames1.9 create mode 100644 debian/patches/real_list_order.12 create mode 100644 debian/patches/series create mode 100644 debian/po/POTFILES.in create mode 100644 debian/po/cs.po create mode 100644 debian/po/da.po create mode 100644 debian/po/de.po create mode 100644 debian/po/es.po create mode 100644 debian/po/fi.po create mode 100644 debian/po/fr.po create mode 100644 debian/po/gl.po create mode 100644 debian/po/it.po create mode 100644 debian/po/ja.po create mode 100644 debian/po/nl.po create mode 100644 debian/po/pt.po create mode 100644 debian/po/pt_BR.po create mode 100644 debian/po/ru.po create mode 100644 debian/po/sv.po create mode 100644 debian/po/templates.pot create mode 100644 debian/po/vi.po create mode 100755 debian/rules create mode 100644 debian/source/format create mode 100644 debian/source/include-binaries create mode 100644 debian/source/lintian-overrides create mode 100755 debian/texi.awk create mode 100644 debian/upstream/signing-key.asc create mode 100644 debian/watch create mode 100644 info/gcl-si.pdf create mode 100644 info/gcl-tk.pdf create mode 100644 info/gcl.pdf diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..8174975 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,28 @@ +The Debian package gcl +---------------------- + +GCL is one of the oldest free common lisp systems still in use. Several +production systems have used it for over a decade. The common lisp +standard in effect when GCL was first released is known as "Common Lisp, +the Language" (CLtL1) after a book by Steele of the same name providing +this specification. Subsequently, a much expanded standard was adopted by +the American National Standards Institute (ANSI), which is still +considered the definitive common lisp language specification to this day. + +Debian GCL now installs both the small 'traditional' lisp image +designed to conform to a pre-ANSI Lisp standard, and an experimental +ANSI image. Please note that ANSI support in GCL is still +preliminary. On an ansi-test suite written by a GCL developer, GCL +fails on a little under 3 percent of the tests. Details can be found +in /usr/share/doc/gcl/test_results.gz. + +To toggle the use of the ANSI image, set the environment variable +GCL_ANSI to any non-empty string. + +New in 2.6.2 +------------ + +Please see the RELEASE-2.6.2.html file for release note information, +regression testing, and sample benchmarks. + + -- Camm Maguire , Wed Dec 14 18:55:19 2005 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..d0a13b4 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,4222 @@ +gcl (2.6.12-129) unstable; urgency=medium + + * Version_2.6.13pre129 + + -- Camm Maguire Sun, 13 Nov 2022 07:55:14 -0500 + +gcl (2.6.12-128) unstable; urgency=medium + + * Version_2.6.13pre128 + + -- Camm Maguire Sat, 12 Nov 2022 11:02:31 -0500 + +gcl (2.6.12-126) unstable; urgency=medium + + * Version_2.6.13pre126 + + -- Camm Maguire Tue, 08 Nov 2022 19:43:41 -0500 + +gcl (2.6.12-125) unstable; urgency=medium + + * Version_2.6.13pre125 + + -- Camm Maguire Tue, 08 Nov 2022 15:33:25 -0500 + +gcl (2.6.12-124) unstable; urgency=medium + + * Version_2.6.13pre124 + + -- Camm Maguire Thu, 11 Aug 2022 13:16:42 -0400 + +gcl (2.6.12-123) unstable; urgency=medium + + * Version_2.6.13pre123 + + -- Camm Maguire Mon, 08 Aug 2022 13:00:55 -0400 + +gcl (2.6.12-122) unstable; urgency=medium + + * Version_2.6.13pre122 + + -- Camm Maguire Mon, 08 Aug 2022 11:50:22 -0400 + +gcl (2.6.12-121) unstable; urgency=medium + + * Version_2.6.13pre121 + + -- Camm Maguire Mon, 08 Aug 2022 11:45:30 -0400 + +gcl (2.6.12-120) unstable; urgency=medium + + * Version_2.6.13pre120 + + -- Camm Maguire Sun, 07 Aug 2022 12:26:10 -0400 + +gcl (2.6.12-119) unstable; urgency=medium + + * Version_2.6.13pre119 + + -- Camm Maguire Sun, 31 Jul 2022 12:00:02 -0400 + +gcl (2.6.12-118) unstable; urgency=medium + + * Bug fix: "emacs dependency should be "emacs | emacsen"", + thanks to Adrian Bunk (Closes: #1006617). + * Bug fix: "Please remove dependency on install-info", thanks to + hille42@web.de; (Closes: #1013691). + * Version_2.6.13pre118 + + -- Camm Maguire Tue, 12 Jul 2022 17:17:09 -0400 + +gcl (2.6.12-117) unstable; urgency=medium + + * Version_2.6.13pre114 + + -- Camm Maguire Sat, 25 Dec 2021 11:38:16 -0500 + +gcl (2.6.12-116) unstable; urgency=medium + + * Version_2.6.13pre113 + + -- Camm Maguire Wed, 22 Dec 2021 19:52:18 +0000 + +gcl (2.6.12-115) unstable; urgency=medium + + * Version_2.6.13pre112 + + -- Camm Maguire Fri, 17 Dec 2021 16:08:45 +0000 + +gcl (2.6.12-114) unstable; urgency=medium + + * Version_2.6.13pre111 + + -- Camm Maguire Thu, 16 Dec 2021 11:35:04 +0000 + +gcl (2.6.12-113) unstable; urgency=medium + + * Version_2.6.13pre110 + + -- Camm Maguire Thu, 16 Dec 2021 11:35:04 +0000 + +gcl (2.6.12-112) unstable; urgency=medium + + * Version_2.6.13pre109 + + -- Camm Maguire Wed, 15 Dec 2021 19:39:42 +0000 + +gcl (2.6.12-111) unstable; urgency=medium + + * Version_2.6.13pre108 + + -- Camm Maguire Thu, 11 Nov 2021 17:10:43 +0000 + +gcl (2.6.12-110) unstable; urgency=medium + + * Version_2.6.13pre107 + + -- Camm Maguire Thu, 11 Nov 2021 01:34:07 +0000 + +gcl (2.6.12-109) unstable; urgency=medium + + * Version_2.6.13pre106 + + -- Camm Maguire Wed, 10 Nov 2021 18:57:21 +0000 + +gcl (2.6.12-108) unstable; urgency=medium + + * Version_2.6.13pre105 + + -- Camm Maguire Tue, 09 Nov 2021 18:22:58 +0000 + +gcl (2.6.12-107) unstable; urgency=medium + + * Version_2.6.13pre103 + + -- Camm Maguire Tue, 09 Nov 2021 10:21:05 +0000 + +gcl (2.6.12-106) unstable; urgency=medium + + * Version_2.6.13pre102 + + -- Camm Maguire Thu, 04 Nov 2021 14:33:53 +0000 + +gcl (2.6.12-105) unstable; urgency=medium + + * Version_2.6.13pre101 + * Bug fix: "fails to start with glibc 2.33", thanks to Andreas Kloeckner + (Closes: #995323). + + -- Camm Maguire Sun, 10 Oct 2021 13:18:39 +0000 + +gcl (2.6.12-104) unstable; urgency=medium + + * Version_2.6.13pre100 + * standardize cstack start address on 32bit arm + + -- Camm Maguire Sun, 10 Oct 2021 12:44:51 +0000 + +gcl (2.6.12-103) unstable; urgency=medium + + * Bug fix: "Fails to install in unstable", thanks to Samuel Thibault + (Closes: #993480). + + -- Camm Maguire Sat, 04 Sep 2021 19:23:26 +0000 + +gcl (2.6.12-102) unstable; urgency=medium + + * Version_2.6.13pre99 + * Bug fix: "describe fails because gcl-si.info does not exist", thanks + to Leo Butler (Closes: #980003). + + -- Camm Maguire Fri, 29 Jan 2021 19:08:05 +0000 + +gcl (2.6.12-101) unstable; urgency=medium + + * Version_2.6.13pre98 + + -- Camm Maguire Sun, 17 Jan 2021 16:25:34 +0000 + +gcl (2.6.12-100) unstable; urgency=medium + + * Version_2.6.13pre97 + + -- Camm Maguire Fri, 04 Dec 2020 14:51:41 +0000 + +gcl (2.6.12-99) unstable; urgency=medium + + * Version_2.6.13pre95 + + -- Camm Maguire Sat, 28 Nov 2020 15:50:42 +0000 + +gcl (2.6.12-98) unstable; urgency=medium + + * Version_2.6.13pre94 + + -- Camm Maguire Tue, 29 Sep 2020 18:29:10 +0000 + +gcl (2.6.12-97) unstable; urgency=medium + + * Bug fix: "Removal of obsolete debhelper compat 5 and 6 in bookworm", + thanks to Niels Thykier (Closes: #965543). + * Version_2.6.13pre93 + + -- Camm Maguire Sat, 29 Aug 2020 16:23:07 +0000 + +gcl (2.6.12-96) unstable; urgency=high + + * Version_2.6.13pre92: Work around armhf strip bug producing undefined + instruction in .plt + + -- Camm Maguire Sun, 23 Aug 2020 17:53:14 +0000 + +gcl (2.6.12-95) unstable; urgency=high + + * Version_2_6_13pre90 + * build under GCL_MEM_MULTIPLE=0.1 + * Bug fix: "FTBFS: Unrecoverable error: Segmentation violation..", + thanks to Lucas Nussbaum (Closes: #952334). + + -- Camm Maguire Fri, 01 May 2020 12:55:02 +0000 + +gcl (2.6.12-94) unstable; urgency=medium + + * re-release to overcome hopefully transient buildd failure + + -- Camm Maguire Mon, 24 Feb 2020 20:02:52 +0000 + +gcl (2.6.12-93) unstable; urgency=medium + + * Version_2_6_13pre90 + + -- Camm Maguire Fri, 21 Feb 2020 19:06:56 +0000 + +gcl (2.6.12-92) unstable; urgency=medium + + * Version_2_6_13pre89 + + -- Camm Maguire Mon, 30 Dec 2019 15:46:22 +0000 + +gcl (2.6.12-91) unstable; urgency=medium + + * Version_2_6_13pre88 + + -- Camm Maguire Wed, 18 Dec 2019 20:14:09 +0000 + +gcl (2.6.12-90) unstable; urgency=medium + + * Version_2_6_13pre87 + * latest standards + + -- Camm Maguire Sun, 08 Dec 2019 19:27:24 +0000 + +gcl (2.6.12-89) unstable; urgency=medium + + * Bug fix: "gcl - FTBFS on ppc64el - invalid relocation type 31", thanks + to thierry.fauck@fr.ibm.com; (Closes: #942312). + * Bug fix: "FTBFS on ppc64el", thanks to Ivo De Decker (Closes: + #944651). + + -- Camm Maguire Sat, 07 Dec 2019 23:27:53 +0000 + +gcl (2.6.12-88) unstable; urgency=medium + + * Source only upload + + -- Camm Maguire Fri, 11 Oct 2019 19:18:44 +0000 + +gcl (2.6.12-87) unstable; urgency=medium + + * Version_2_6_13pre84 + + -- Camm Maguire Sat, 06 Apr 2019 13:03:21 +0000 + +gcl (2.6.12-86) unstable; urgency=medium + + * Version_2_6_13pre83 + + -- Camm Maguire Tue, 02 Apr 2019 19:57:15 +0000 + +gcl (2.6.12-85) unstable; urgency=medium + + * Version_2_6_13pre82 + + -- Camm Maguire Thu, 28 Mar 2019 18:48:55 +0000 + +gcl (2.6.12-84) unstable; urgency=medium + + * Version_2_6_13pre80 + + -- Camm Maguire Thu, 21 Mar 2019 18:59:40 +0000 + +gcl (2.6.12-83) unstable; urgency=high + + * Version_2_6_13pre79 + * Fix acl2 arm builds (Closes: #919477). + + -- Camm Maguire Tue, 05 Feb 2019 21:54:42 +0000 + +gcl (2.6.12-82) unstable; urgency=high + + * Version_2_6_13pre74 + + -- Camm Maguire Sat, 02 Feb 2019 17:40:20 +0000 + +gcl (2.6.12-81) unstable; urgency=high + + * Version_2_6_13pre72 + * Fix to ppc64el for acl2 FTBFS bug + + -- Camm Maguire Mon, 21 Jan 2019 16:40:36 +0000 + +gcl (2.6.12-80) unstable; urgency=medium + + * Version_2_6_13pre71 + * Bug fix: "FTBFS on hppa - segmentation fault assembling gbc.s", thanks + to John David Anglin (Closes: #912071). + + -- Camm Maguire Tue, 30 Oct 2018 17:20:43 +0000 + +gcl (2.6.12-79) unstable; urgency=medium + + * Version_2_6_13pre70 + + -- Camm Maguire Mon, 29 Oct 2018 16:52:17 +0000 + +gcl (2.6.12-78) unstable; urgency=medium + + * rebuild against latest compilers and tools + * Version_2_6_13pre69 + + -- Camm Maguire Thu, 11 Oct 2018 16:40:48 +0000 + +gcl (2.6.12-77) unstable; urgency=medium + + * Version_2_6_13pre68 + * Bug fix: "GCL fails to load .o files it generates", thanks to Gong-Yi + Liao (Closes: #902475). Add support for R_X86_64_PLT32 relocs. + + -- Camm Maguire Tue, 24 Jul 2018 20:06:45 +0000 + +gcl (2.6.12-76) unstable; urgency=medium + + * Version_2_6_13pre67 + + -- Camm Maguire Fri, 23 Mar 2018 19:25:22 +0000 + +gcl (2.6.12-75) unstable; urgency=medium + + * Version_2_6_13pre65 + + -- Camm Maguire Wed, 21 Mar 2018 20:28:08 +0000 + +gcl (2.6.12-74) unstable; urgency=medium + + * Version_2_6_13pre63 + + -- Camm Maguire Sat, 17 Mar 2018 11:56:05 +0000 + +gcl (2.6.12-73) unstable; urgency=medium + + * Version_2_6_13pre62 + + -- Camm Maguire Wed, 14 Mar 2018 15:38:43 +0000 + +gcl (2.6.12-72) unstable; urgency=medium + + * Version_2_6_13pre61 + + -- Camm Maguire Tue, 13 Mar 2018 15:32:44 +0000 + +gcl (2.6.12-71) unstable; urgency=medium + + * Version_2_6_13pre60 + + -- Camm Maguire Mon, 12 Mar 2018 19:44:47 +0000 + +gcl (2.6.12-70) unstable; urgency=medium + + * Version_2_6_13pre59 + + -- Camm Maguire Mon, 12 Mar 2018 16:19:00 +0000 + +gcl (2.6.12-69) unstable; urgency=medium + + * Version_2_6_13pre58 + + -- Camm Maguire Fri, 09 Mar 2018 17:10:51 +0000 + +gcl (2.6.12-68) unstable; urgency=medium + + * Version_2_6_13pre57 + + -- Camm Maguire Sun, 04 Mar 2018 13:21:00 +0000 + +gcl (2.6.12-67) unstable; urgency=medium + + * Version_2_6_13pre55 + + -- Camm Maguire Sat, 03 Mar 2018 14:27:51 +0000 + +gcl (2.6.12-66) unstable; urgency=medium + + * Version_2_6_13pre54 + + -- Camm Maguire Fri, 02 Mar 2018 21:19:03 +0000 + +gcl (2.6.12-65) unstable; urgency=medium + + * Version_2_6_13pre52 + * Bug fix: "FTBFS on hurd-i386", thanks to svante.signell@gmail.com; + (Closes: #802593). + + -- Camm Maguire Fri, 23 Feb 2018 15:55:23 +0000 + +gcl (2.6.12-64) unstable; urgency=medium + + * list_order.24 + + -- Camm Maguire Sun, 04 Feb 2018 13:26:27 +0000 + +gcl (2.6.12-63) unstable; urgency=medium + + * list_order.23 + + -- Camm Maguire Thu, 01 Feb 2018 18:36:29 +0000 + +gcl (2.6.12-62) unstable; urgency=medium + + * list_order.22 + + -- Camm Maguire Thu, 01 Feb 2018 01:05:10 +0000 + +gcl (2.6.12-61) unstable; urgency=medium + + * list_order.21 + + -- Camm Maguire Tue, 30 Jan 2018 21:13:13 +0000 + +gcl (2.6.12-60) unstable; urgency=medium + + * list_order.19 + + -- Camm Maguire Tue, 23 Jan 2018 18:11:59 +0000 + +gcl (2.6.12-59) unstable; urgency=medium + + * list_order.16 + + -- Camm Maguire Fri, 12 Jan 2018 03:25:08 +0000 + +gcl (2.6.12-58) unstable; urgency=medium + + * list_order.14 + + -- Camm Maguire Mon, 18 Sep 2017 15:45:10 +0000 + +gcl (2.6.12-57) unstable; urgency=medium + + * list_order.13 + + -- Camm Maguire Fri, 25 Aug 2017 13:44:10 +0000 + +gcl (2.6.12-56) unstable; urgency=medium + + * list_order.12 + + -- Camm Maguire Thu, 24 Aug 2017 19:12:50 +0000 + +gcl (2.6.12-55) unstable; urgency=medium + + * disable gprof on aarch64 + * Bug fix: "gcl FTBFS on arm64: Unrecoverable error: Segmentation + violation..", thanks to Adrian Bunk (Closes: #873052). + + -- Camm Maguire Thu, 24 Aug 2017 16:37:07 +0000 + +gcl (2.6.12-54) unstable; urgency=medium + + * list_order.11 + + -- Camm Maguire Wed, 23 Aug 2017 22:19:14 +0000 + +gcl (2.6.12-53) unstable; urgency=medium + + * list_order.9 + + -- Camm Maguire Sun, 18 Jun 2017 18:32:30 +0000 + +gcl (2.6.12-52) unstable; urgency=medium + + * list_order.8 + + -- Camm Maguire Thu, 15 Jun 2017 18:04:41 +0000 + +gcl (2.6.12-51) unstable; urgency=medium + + * list_order.7 + + -- Camm Maguire Wed, 14 Jun 2017 18:30:46 +0000 + +gcl (2.6.12-50) unstable; urgency=medium + + * list_order.6 + + -- Camm Maguire Tue, 13 Jun 2017 22:38:52 +0000 + +gcl (2.6.12-49) unstable; urgency=medium + + * list_order.5 + + -- Camm Maguire Thu, 08 Jun 2017 17:21:01 +0000 + +gcl (2.6.12-48) unstable; urgency=medium + + * list_order.1 + + -- Camm Maguire Sun, 28 May 2017 01:42:29 +0000 + +gcl (2.6.12-47) unstable; urgency=high + + * pathnames1.13 + + -- Camm Maguire Tue, 22 Nov 2016 04:53:35 +0000 + +gcl (2.6.12-46) unstable; urgency=high + + * pathnames1.12 + * Bug fix: "maintainer script(s) do not start on #!", thanks to + treinen@debian.org; (Closes: #843303). + + -- Camm Maguire Fri, 18 Nov 2016 18:27:53 +0000 + +gcl (2.6.12-45) unstable; urgency=high + + * pathnames1.11 + + -- Camm Maguire Mon, 31 Oct 2016 22:57:27 +0000 + +gcl (2.6.12-44) unstable; urgency=high + + * pathnames1.9 + + -- Camm Maguire Fri, 28 Oct 2016 17:04:38 +0000 + +gcl (2.6.12-43) unstable; urgency=medium + + * pathnames1.7 + + -- Camm Maguire Thu, 27 Oct 2016 03:46:32 +0000 + +gcl (2.6.12-42) unstable; urgency=medium + + * pathnames1.6 + * Bug fix: "FTBFS with bindnow and PIE enabled", thanks to Balint Reczey + (Closes: #837481). + * Bug fix: "FTBFS with compilers that default to -fPIE (patch + attached)", thanks to Adam Conrad (Closes: #822820). + + -- Camm Maguire Wed, 26 Oct 2016 23:04:57 +0000 + +gcl (2.6.12-41) unstable; urgency=medium + + * pathnames1.4, kfreebsd fix + + -- Camm Maguire Fri, 14 Oct 2016 01:17:18 +0000 + +gcl (2.6.12-40) unstable; urgency=medium + + * pathnames1.2 + * Bug fix: "popen arguments not quoted causes trouble and security + issues", thanks to axel (Closes: #802203). + + -- Camm Maguire Wed, 12 Oct 2016 18:09:26 +0000 + +gcl (2.6.12-39) unstable; urgency=medium + + * pathnames1.1 + * ansi-test clean target + + -- Camm Maguire Wed, 12 Oct 2016 01:32:05 +0000 + +gcl (2.6.12-38) unstable; urgency=medium + + * Version_2_6_13pre50 + + -- Camm Maguire Tue, 04 Oct 2016 19:45:38 +0000 + +gcl (2.6.12-37) unstable; urgency=medium + + * Version_2_6_13pre49 + + -- Camm Maguire Mon, 03 Oct 2016 14:54:09 +0000 + +gcl (2.6.12-36) unstable; urgency=medium + + * Version_2_6_13pre48 + + -- Camm Maguire Sat, 01 Oct 2016 12:10:25 +0000 + +gcl (2.6.12-35) unstable; urgency=medium + + * Version_2_6_13pre47 + + -- Camm Maguire Fri, 30 Sep 2016 21:21:43 +0000 + +gcl (2.6.12-34) unstable; urgency=medium + + * Version_2_6_13pre45 + + -- Camm Maguire Fri, 23 Sep 2016 19:42:37 +0000 + +gcl (2.6.12-33) unstable; urgency=medium + + * Version_2_6_13pre43 + + -- Camm Maguire Tue, 03 May 2016 16:17:03 +0000 + +gcl (2.6.12-32) unstable; urgency=medium + + * Version_2_6_13pre40 + * Bug fix: "[INTL:pt_BR] Brazilian Portuguese debconf templates + translation", thanks to Adriano Rafael Gomes (Closes: #811523). + + -- Camm Maguire Wed, 20 Apr 2016 15:18:35 +0000 + +gcl (2.6.12-31) unstable; urgency=medium + + * Version_2_6_13pre39 + + -- Camm Maguire Mon, 11 Apr 2016 00:41:11 +0000 + +gcl (2.6.12-30) unstable; urgency=medium + + * Version_2_6_13pre38 + + -- Camm Maguire Wed, 06 Apr 2016 00:20:15 +0000 + +gcl (2.6.12-29) unstable; urgency=medium + + * Version_2_6_13pre35; support latest binutils + * Bug fix: "gcl ftbfs on amd64 and i386 with binutils from + experimental", thanks to Matthias Klose (Closes: #803214). + + -- Camm Maguire Thu, 29 Oct 2015 15:20:27 +0000 + +gcl (2.6.12-28) unstable; urgency=medium + + * Version_2_6_13pre35; restore hppa build + + -- Camm Maguire Tue, 27 Oct 2015 20:00:46 +0000 + +gcl (2.6.12-27) unstable; urgency=medium + + * Version_2_6_13pre34; mips64 relocs; stack saving tail-recursive equal. + + -- Camm Maguire Tue, 27 Oct 2015 16:35:06 +0000 + +gcl (2.6.12-26) unstable; urgency=medium + + * Version_2_6_13pre32 + + -- Camm Maguire Fri, 23 Oct 2015 00:03:34 +0000 + +gcl (2.6.12-25) unstable; urgency=medium + + * Version_2_6_13pre31, kfreebsd and mips64 FTBFS fix + + -- Camm Maguire Fri, 16 Oct 2015 15:03:03 +0000 + +gcl (2.6.12-24) unstable; urgency=medium + + * Version_2_6_13pre30 + + -- Camm Maguire Fri, 16 Oct 2015 02:44:23 +0000 + +gcl (2.6.12-23) unstable; urgency=medium + + * Version_2_6_13pre29 + + -- Camm Maguire Thu, 15 Oct 2015 18:09:59 +0000 + +gcl (2.6.12-22) unstable; urgency=medium + + * Version_2_6_13pre27 + + -- Camm Maguire Tue, 13 Oct 2015 14:38:53 +0000 + +gcl (2.6.12-21) unstable; urgency=medium + + * Version_2_6_13pre26 + + -- Camm Maguire Wed, 07 Oct 2015 15:14:27 +0000 + +gcl (2.6.12-20) unstable; urgency=medium + + * Version_2_6_13pre25 + + -- Camm Maguire Thu, 01 Oct 2015 15:16:14 +0000 + +gcl (2.6.12-19) unstable; urgency=medium + + * Use-dpkg-buidflags-opt-levels-in-debian-rules, -O3 has bug in 5.2.1 + * Version_2_6_13pre24 + + -- Camm Maguire Wed, 30 Sep 2015 15:45:20 +0000 + +gcl (2.6.12-18) unstable; urgency=medium + + * Version_2_6_13pre22 + + -- Camm Maguire Tue, 29 Sep 2015 16:51:03 +0000 + +gcl (2.6.12-17) unstable; urgency=medium + + * Version_2_6_13pre20 + + -- Camm Maguire Sat, 26 Sep 2015 10:34:23 -0400 + +gcl (2.6.12-16) unstable; urgency=medium + + * Version_2_6_13pre19 + + -- Camm Maguire Fri, 25 Sep 2015 18:39:52 -0400 + +gcl (2.6.12-15) unstable; urgency=medium + + * Version_2_6_13pre18 + + -- Camm Maguire Fri, 25 Sep 2015 15:08:50 +0000 + +gcl (2.6.12-14) unstable; urgency=medium + + * Version_2_6_13pre17 + + -- Camm Maguire Thu, 28 May 2015 03:37:47 +0000 + +gcl (2.6.12-13) unstable; urgency=medium + + * Version_2_6_13pre16 + + -- Camm Maguire Fri, 15 May 2015 18:09:38 +0000 + +gcl (2.6.12-12) unstable; urgency=medium + + * Version_2_6_13pre13 + + -- Camm Maguire Fri, 01 May 2015 11:08:46 -0400 + +gcl (2.6.12-11) unstable; urgency=medium + + * Version_2_6_13pre12 + + -- Camm Maguire Thu, 30 Apr 2015 12:49:16 -0400 + +gcl (2.6.12-10) unstable; urgency=medium + + * rebuild in clean sid environment + + -- Camm Maguire Mon, 27 Apr 2015 15:34:15 -0400 + +gcl (2.6.12-9) unstable; urgency=medium + + * Version_2_6_13pre8b + * Bug fix: "ftbfs with GCC-5", thanks to Matthias Klose (Closes: + #777866). + + -- Camm Maguire Mon, 27 Apr 2015 12:32:49 -0400 + +gcl (2.6.12-8) unstable; urgency=medium + + * Version_2_6_13pre7 + + -- Camm Maguire Fri, 24 Apr 2015 13:38:30 -0400 + +gcl (2.6.12-7) unstable; urgency=medium + + * Version_2_6_13pre6 + + -- Camm Maguire Thu, 23 Apr 2015 13:43:45 -0400 + +gcl (2.6.12-6) unstable; urgency=medium + + * Version_2_6_13pre5 + + -- Camm Maguire Wed, 22 Apr 2015 17:14:16 -0400 + +gcl (2.6.12-5) unstable; urgency=medium + + * Version_2_6_13pre4 + + -- Camm Maguire Wed, 22 Apr 2015 10:25:36 -0400 + +gcl (2.6.12-4) unstable; urgency=medium + + * Version_2_6_13pre3a + + -- Camm Maguire Mon, 20 Apr 2015 13:26:36 -0400 + +gcl (2.6.12-3) unstable; urgency=medium + + * Version_2_6_13pre2 + + -- Camm Maguire Fri, 17 Apr 2015 15:50:37 -0400 + +gcl (2.6.12-2) unstable; urgency=medium + + * Version_2_6_13pre1 + + -- Camm Maguire Wed, 26 Nov 2014 11:12:46 -0500 + +gcl (2.6.12-1) unstable; urgency=medium + + * New upstream release + + -- Camm Maguire Tue, 28 Oct 2014 09:56:15 -0400 + +gcl (2.6.11-6) unstable; urgency=medium + + * 2.6.12pre5 + + -- Camm Maguire Thu, 23 Oct 2014 17:33:22 -0400 + +gcl (2.6.11-5) unstable; urgency=medium + + * 2.6.12pre4 + + -- Camm Maguire Sat, 18 Oct 2014 09:46:34 -0400 + +gcl (2.6.11-4) unstable; urgency=medium + + * 2.6.12pre3 + + -- Camm Maguire Thu, 16 Oct 2014 11:56:15 -0400 + +gcl (2.6.11-3) unstable; urgency=medium + + * 2.6.12pre2 + + -- Camm Maguire Sun, 28 Sep 2014 20:56:18 -0400 + +gcl (2.6.11-2) unstable; urgency=medium + + * 2.6.12pre1 + + -- Camm Maguire Fri, 19 Sep 2014 14:49:25 -0400 + +gcl (2.6.11-1) unstable; urgency=medium + + * New upstream release + + -- Camm Maguire Sat, 06 Sep 2014 12:28:46 -0400 + +gcl (2.6.10-54) unstable; urgency=medium + + * remove-debug-message-from-BUGGY_MAXIMUM_SSCANF_LENGTH-code + + -- Camm Maguire Fri, 05 Sep 2014 10:35:46 -0400 + +gcl (2.6.10-53) unstable; urgency=medium + + * ppc64le-support-headers + + -- Camm Maguire Wed, 03 Sep 2014 15:02:12 -0400 + +gcl (2.6.10-52) unstable; urgency=medium + + * accept-TMP-paths-with-types-versions + + -- Camm Maguire Fri, 29 Aug 2014 17:51:04 -0400 + +gcl (2.6.10-51) unstable; urgency=medium + + * fix-match-function-proclaim-skew + + -- Camm Maguire Fri, 29 Aug 2014 16:40:30 +0000 + +gcl (2.6.10-50) unstable; urgency=medium + + * trial_selinux_support + + -- Camm Maguire Thu, 21 Aug 2014 17:29:50 +0000 + +gcl (2.6.10-49) unstable; urgency=medium + + * R_ARM_JUMP24 + + -- Camm Maguire Wed, 20 Aug 2014 17:08:23 +0000 + +gcl (2.6.10-48) unstable; urgency=medium + + * try-SGC-for-aarch64 + + -- Camm Maguire Tue, 19 Aug 2014 18:35:22 +0000 + +gcl (2.6.10-47) unstable; urgency=medium + + * set-stack_guard-after-alloc-setup + * Bug fix: "work around build failure on AArch64", thanks to Matthias + Klose (Closes: #758101). + + -- Camm Maguire Thu, 14 Aug 2014 19:36:48 +0000 + +gcl (2.6.10-46) unstable; urgency=medium + + * R_AARCH64_LDST128_ABS_LO12_NC + + -- Camm Maguire Wed, 13 Aug 2014 21:39:50 +0000 + +gcl (2.6.10-45) unstable; urgency=medium + + * fix sh4 CLEAR_CACHE + + -- Camm Maguire Sun, 10 Aug 2014 20:12:03 +0000 + +gcl (2.6.10-44) unstable; urgency=medium + + * clear_protect_memory on all elf machines + + -- Camm Maguire Sat, 09 Aug 2014 00:55:17 +0000 + +gcl (2.6.10-43) unstable; urgency=medium + + * mips uses builtin_clear_cache like mipsel + + -- Camm Maguire Fri, 08 Aug 2014 23:42:42 +0000 + +gcl (2.6.10-42) unstable; urgency=medium + + * backport travel_push_new from master + + -- Camm Maguire Wed, 06 Aug 2014 20:14:14 +0000 + +gcl (2.6.10-41) unstable; urgency=medium + + * protos and CFLAGS for axiom extensions + + -- Camm Maguire Wed, 06 Aug 2014 01:54:38 +0000 + +gcl (2.6.10-40) unstable; urgency=medium + + * better solaris unexec fix + + -- Camm Maguire Mon, 04 Aug 2014 22:00:54 +0000 + +gcl (2.6.10-39) unstable; urgency=medium + + * earlier prelink_init, phys_pages w/o malloc + + -- Camm Maguire Mon, 04 Aug 2014 16:52:09 +0000 + +gcl (2.6.10-38) unstable; urgency=medium + + * error on overflow of array dimensions + + -- Camm Maguire Fri, 01 Aug 2014 14:35:44 +0000 + +gcl (2.6.10-37) unstable; urgency=medium + + * FILE * casts for windows feof wrapper + + -- Camm Maguire Thu, 31 Jul 2014 02:17:11 +0000 + +gcl (2.6.10-36) unstable; urgency=medium + + * better casts for frs_jmpbuf + + -- Camm Maguire Wed, 30 Jul 2014 17:00:06 +0000 + +gcl (2.6.10-35) unstable; urgency=medium + + * find_sym_ptable typo fix + + -- Camm Maguire Tue, 29 Jul 2014 18:08:57 +0000 + +gcl (2.6.10-34) unstable; urgency=medium + + * --enable-prelink configure arg; stack_chk_guard for 68k + + -- Camm Maguire Fri, 25 Jul 2014 20:39:10 +0000 + +gcl (2.6.10-33) unstable; urgency=medium + + * hurd stack_guard, ppc64 C_GC_OFFSET + + -- Camm Maguire Thu, 24 Jul 2014 21:46:24 +0000 + +gcl (2.6.10-32) unstable; urgency=medium + + * __stack_chk_guard fix for arm/sh4 + + -- Camm Maguire Wed, 23 Jul 2014 18:12:56 +0000 + +gcl (2.6.10-31) unstable; urgency=medium + + * dpkg-buildflags trial + + -- Camm Maguire Tue, 22 Jul 2014 20:06:10 +0000 + +gcl (2.6.10-30) unstable; urgency=medium + + * fix offsets ppc + + -- Camm Maguire Tue, 22 Jul 2014 17:12:27 +0000 + +gcl (2.6.10-29) unstable; urgency=medium + + * fix unexec file offsets + + -- Camm Maguire Tue, 22 Jul 2014 15:36:45 +0000 + +gcl (2.6.10-28) unstable; urgency=high + + * enable prelink + + -- Camm Maguire Fri, 18 Jul 2014 19:24:38 +0000 + +gcl (2.6.10-27) unstable; urgency=high + + * protect closure calls from gc + + -- Camm Maguire Wed, 16 Jul 2014 16:15:33 +0000 + +gcl (2.6.10-26) unstable; urgency=high + + * Bug fix: "packages should not build-depend on binutils-dev", thanks to + Matthias Klose (Closes: #754840). Please note that gcl has long + depended on binutils-dev for good reason -- happily it is no longer + necessary + + -- Camm Maguire Tue, 15 Jul 2014 16:04:04 +0000 + +gcl (2.6.10-25) unstable; urgency=high + + * rebuild to get gcc fixes on i386 + + -- Camm Maguire Fri, 11 Jul 2014 03:14:45 +0000 + +gcl (2.6.10-24) unstable; urgency=high + + * try default gcc 4.9 + * access libopcodes without link dependency via dlopen + * Bug fix: "please switch to emacs24", thanks to Gabriele Giacone + (Closes: #754012). + + -- Camm Maguire Wed, 09 Jul 2014 17:34:21 +0000 + +gcl (2.6.10-23) unstable; urgency=high + + * rebuild latest binutils + + -- Camm Maguire Sat, 05 Jul 2014 23:19:27 +0000 + +gcl (2.6.10-22) unstable; urgency=high + + * gcc-4.8 on i386, 4.9 has bugs at present + + -- Camm Maguire Fri, 04 Jul 2014 01:36:06 +0000 + +gcl (2.6.10-21) unstable; urgency=high + + * 2.6.11pre test 20 + + -- Camm Maguire Mon, 30 Jun 2014 22:43:27 +0000 + +gcl (2.6.10-20) unstable; urgency=high + + * 2.6.11pre test 19 + + -- Camm Maguire Sun, 29 Jun 2014 17:59:59 +0000 + +gcl (2.6.10-19) unstable; urgency=high + + * 2.6.11pre test 18 + + -- Camm Maguire Sun, 29 Jun 2014 16:00:07 +0000 + +gcl (2.6.10-18) unstable; urgency=high + + * 2.6.11pre test 17 + + -- Camm Maguire Sat, 28 Jun 2014 16:57:54 +0000 + +gcl (2.6.10-17) unstable; urgency=high + + * 2.6.11pre test 16 + + -- Camm Maguire Thu, 26 Jun 2014 18:06:42 +0000 + +gcl (2.6.10-16) unstable; urgency=high + + * 2.6.11pre test 15 + + -- Camm Maguire Wed, 18 Jun 2014 17:37:36 +0000 + +gcl (2.6.10-15) unstable; urgency=high + + * 2.6.11pre test 14 + + -- Camm Maguire Tue, 17 Jun 2014 00:39:35 +0000 + +gcl (2.6.10-14) unstable; urgency=high + + * 2.6.11pre test 13 + + -- Camm Maguire Sat, 14 Jun 2014 13:43:57 +0000 + +gcl (2.6.10-13) unstable; urgency=high + + * 2.6.11pre test 12 + + -- Camm Maguire Tue, 20 May 2014 16:00:22 +0000 + +gcl (2.6.10-12) unstable; urgency=high + + * 2.6.11pre test 11 + + -- Camm Maguire Fri, 16 May 2014 17:41:33 +0000 + +gcl (2.6.10-11) unstable; urgency=high + + * 2.6.11pre test 10 + + -- Camm Maguire Fri, 16 May 2014 13:18:07 +0000 + +gcl (2.6.10-10) unstable; urgency=high + + * 2.6.11pre test 9 + + -- Camm Maguire Wed, 07 May 2014 17:10:30 +0000 + +gcl (2.6.10-9) unstable; urgency=high + + * 2.6.11pre test 8 + + -- Camm Maguire Fri, 25 Apr 2014 19:53:10 +0000 + +gcl (2.6.10-8) unstable; urgency=high + + * 2.6.11pre test 7 + + -- Camm Maguire Mon, 21 Apr 2014 14:09:37 +0000 + +gcl (2.6.10-7) unstable; urgency=high + + * 2.6.11pre test 6 + + -- Camm Maguire Sat, 19 Apr 2014 17:52:17 +0000 + +gcl (2.6.10-6) unstable; urgency=high + + * 2.6.11pre test 5 + + -- Camm Maguire Fri, 18 Apr 2014 15:06:09 +0000 + +gcl (2.6.10-5) unstable; urgency=high + + * 2.6.11pre test 4 + + -- Camm Maguire Tue, 15 Apr 2014 20:30:13 +0000 + +gcl (2.6.10-4) unstable; urgency=high + + * 2.6.11pre test 3 + * Bug fix: "debian/rules uses DEB_BUILD_* macros instead of DEB_HOST_* + macros", thanks to Matthias Klose (Closes: #743520). + + -- Camm Maguire Wed, 09 Apr 2014 13:15:32 +0000 + +gcl (2.6.10-3) unstable; urgency=high + + * 2.6.11pre test 2 + + -- Camm Maguire Thu, 03 Apr 2014 14:24:23 +0000 + +gcl (2.6.10-2) unstable; urgency=high + + * 2.6.11pre test 1 + * Bug fix: "FTBFS: gcl_readline.d:472:39: error: 'CPPFunction' + undeclared (first use in this function)", thanks to David Suárez + (Closes: #741819). + + -- Camm Maguire Mon, 24 Mar 2014 15:47:01 +0000 + +gcl (2.6.10-1) unstable; urgency=high + + * New upstream release + + -- Camm Maguire Wed, 13 Nov 2013 18:39:19 +0000 + +gcl (2.6.9-17) unstable; urgency=high + + * 2.6.10pre test 17 + + -- Camm Maguire Mon, 11 Nov 2013 19:41:45 +0000 + +gcl (2.6.9-16) unstable; urgency=high + + * 2.6.10pre test 16 + * Bug fix: "gcl 2.6.7+dfsga-20 needs 1 GB disk space on amd64", thanks + to Edi Meier (Closes: #714507). + * Bug fix: "[INTL:ja] New Japanese translation", thanks to victory + (Closes: #718925). + + -- Camm Maguire Sat, 09 Nov 2013 13:34:32 +0000 + +gcl (2.6.9-15) unstable; urgency=high + + * 2.6.10pre test 15 + + -- Camm Maguire Sat, 02 Nov 2013 22:21:16 +0000 + +gcl (2.6.9-14) unstable; urgency=high + + * 2.6.10pre test 14 + + -- Camm Maguire Wed, 23 Oct 2013 17:44:14 +0000 + +gcl (2.6.9-13) unstable; urgency=high + + * environment allocation unrandomize.h + + -- Camm Maguire Mon, 21 Oct 2013 00:20:16 +0000 + +gcl (2.6.9-12) unstable; urgency=high + + * 2.6.10pre test 13 + + -- Camm Maguire Fri, 18 Oct 2013 14:18:17 +0000 + +gcl (2.6.9-11) unstable; urgency=high + + * 2.6.10pre test 12, s390, mingw cleanup, make_bignum bug fix + + -- Camm Maguire Tue, 15 Oct 2013 23:32:09 +0000 + +gcl (2.6.9-10) unstable; urgency=high + + * fast-fixnums + + -- Camm Maguire Fri, 11 Oct 2013 15:05:58 +0000 + +gcl (2.6.9-9) unstable; urgency=high + + * 2.6.10pre test 10 and 11 + + -- Camm Maguire Wed, 02 Oct 2013 19:12:36 +0000 + +gcl (2.6.9-8) unstable; urgency=high + + * 2.6.10pre test 8 and 9 + + -- Camm Maguire Tue, 01 Oct 2013 21:00:19 +0000 + +gcl (2.6.9-7) unstable; urgency=high + + * 2.6.10pre test 6 and 7 + + -- Camm Maguire Mon, 30 Sep 2013 19:34:38 +0000 + +gcl (2.6.9-6) unstable; urgency=high + + * 2.6.10pre test 5 + + -- Camm Maguire Tue, 24 Sep 2013 17:03:24 +0000 + +gcl (2.6.9-5) unstable; urgency=high + + * 2.6.10pre test 4 + + -- Camm Maguire Mon, 23 Sep 2013 19:27:36 +0000 + +gcl (2.6.9-4) unstable; urgency=high + + * 2.6.10pre test 3 + + -- Camm Maguire Mon, 23 Sep 2013 16:30:09 +0000 + +gcl (2.6.9-3) unstable; urgency=high + + * 2.6.10pre test 2 + + -- Camm Maguire Sun, 22 Sep 2013 03:27:10 +0000 + +gcl (2.6.9-2) unstable; urgency=high + + * 2.6.10pre test + + -- Camm Maguire Sat, 21 Sep 2013 04:14:55 +0000 + +gcl (2.6.9-1) unstable; urgency=high + + * New upstream release + + -- Camm Maguire Wed, 28 Aug 2013 16:49:18 +0000 + +gcl (2.6.7+dfsga-40) unstable; urgency=high + + * fix allocate functions + + -- Camm Maguire Tue, 06 Aug 2013 22:36:37 +0000 + +gcl (2.6.7+dfsga-39) unstable; urgency=high + + * lower initial contiguous and relblock allocations, set *ihs-top* + properly on startup, protect memory->cfd.cfd_start initialization from + gc + + -- Camm Maguire Mon, 05 Aug 2013 17:38:22 +0000 + +gcl (2.6.7+dfsga-38) unstable; urgency=high + + * robustify near oom handling to fix axiom compile of EXPEXPAN on mips + + -- Camm Maguire Fri, 02 Aug 2013 16:25:16 +0000 + +gcl (2.6.7+dfsga-37) unstable; urgency=high + + * ppc64 gprof fix + + -- Camm Maguire Fri, 26 Jul 2013 23:40:14 +0000 + +gcl (2.6.7+dfsga-36) unstable; urgency=high + + * min_pagewidth=14 on mips + + -- Camm Maguire Fri, 26 Jul 2013 02:20:56 +0000 + +gcl (2.6.7+dfsga-35) unstable; urgency=high + + * latest gcc on all platforms, no gprof ppc64, -O1 ia64, -O0 alpha + + -- Camm Maguire Thu, 25 Jul 2013 14:42:48 +0000 + +gcl (2.6.7+dfsga-34) unstable; urgency=high + + * sgc link_array mark fix;rb_end across save fix;more stable gcc on older arches + + -- Camm Maguire Tue, 23 Jul 2013 17:11:23 +0000 + +gcl (2.6.7+dfsga-33) unstable; urgency=high + + * fix mark_link_array for marked sLAlink_arrayA->s.s_dbind + + -- Camm Maguire Mon, 22 Jul 2013 19:00:43 +0000 + +gcl (2.6.7+dfsga-32) unstable; urgency=high + + * protect mark_link_array in sgc + + -- Camm Maguire Sat, 20 Jul 2013 00:16:07 +0000 + +gcl (2.6.7+dfsga-31) unstable; urgency=high + + * properly clean link array on gc + + -- Camm Maguire Fri, 19 Jul 2013 20:34:34 +0000 + +gcl (2.6.7+dfsga-30) unstable; urgency=high + + * fix gcl.script compiler::link, darwin compile warnings + + -- Camm Maguire Mon, 15 Jul 2013 20:35:03 +0000 + +gcl (2.6.7+dfsga-29) unstable; urgency=high + + * fix compiler::link in presence of gcl.script + + -- Camm Maguire Mon, 15 Jul 2013 16:23:33 +0000 + +gcl (2.6.7+dfsga-28) unstable; urgency=high + + * install unixport/gcl.script + + -- Camm Maguire Sat, 13 Jul 2013 18:42:28 +0000 + +gcl (2.6.7+dfsga-27) unstable; urgency=high + + * workaround for ia64 and hurd brk issues + + -- Camm Maguire Fri, 12 Jul 2013 21:44:54 +0000 + +gcl (2.6.7+dfsga-26) unstable; urgency=high + + * -- command line support, map-shared in unexec + + -- Camm Maguire Fri, 12 Jul 2013 00:52:35 +0000 + +gcl (2.6.7+dfsga-25) unstable; urgency=high + + * alpha, mips, 68k + + -- Camm Maguire Wed, 10 Jul 2013 18:29:37 +0000 + +gcl (2.6.7+dfsga-24) unstable; urgency=high + + * sgc and reloc fixes + + -- Camm Maguire Mon, 08 Jul 2013 13:56:33 +0000 + +gcl (2.6.7+dfsga-23) unstable; urgency=high + + * fix for maxima on kfbsd and sparc + + -- Camm Maguire Wed, 03 Jul 2013 19:19:16 +0000 + +gcl (2.6.7+dfsga-22) unstable; urgency=high + + * fix stack definition issues on i386 + + -- Camm Maguire Tue, 02 Jul 2013 18:27:54 +0000 + +gcl (2.6.7+dfsga-21) unstable; urgency=high + + * near out of memory robustification + + -- Camm Maguire Tue, 02 Jul 2013 15:32:58 +0000 + +gcl (2.6.7+dfsga-20) unstable; urgency=high + + * fix 3GB workaround for gprof + + -- Camm Maguire Fri, 21 Jun 2013 11:09:01 -0400 + +gcl (2.6.7+dfsga-19) unstable; urgency=high + + * work around 3GB personality/alloca/malloc bug + + -- Camm Maguire Fri, 21 Jun 2013 02:46:49 +0000 + +gcl (2.6.7+dfsga-18) unstable; urgency=high + + * alpha NULL_OR_ON_C_STACK, attempt to get 32 immfix space with + ADDR_LIMIT_3GB|ADDR_COMPAT_LAYOUT personality, clean compile with no + immfix + + -- Camm Maguire Thu, 20 Jun 2013 20:24:29 +0000 + +gcl (2.6.7+dfsga-17) unstable; urgency=high + + * small optimizations, #= nil fix + + -- Camm Maguire Wed, 19 Jun 2013 16:23:27 +0000 + +gcl (2.6.7+dfsga-16) unstable; urgency=high + + * no linker script on hurd;fix OBJ_ALIGN + + -- Camm Maguire Thu, 13 Jun 2013 15:35:00 +0000 + +gcl (2.6.7+dfsga-15) unstable; urgency=high + + * ia64 fix + + -- Camm Maguire Thu, 13 Jun 2013 02:38:47 +0000 + +gcl (2.6.7+dfsga-14) unstable; urgency=high + + * eliminate maxpage/dbegin, restore windows and macosx builds + + -- Camm Maguire Wed, 12 Jun 2013 21:42:29 +0000 + +gcl (2.6.7+dfsga-13) unstable; urgency=low + + * ia64/hurd/s390 and SGC + + -- Camm Maguire Sun, 09 Jun 2013 00:23:51 +0000 + +gcl (2.6.7+dfsga-12) unstable; urgency=low + + * ia64/hurd/s390 + + -- Camm Maguire Sat, 08 Jun 2013 15:24:46 +0000 + +gcl (2.6.7+dfsga-11) unstable; urgency=high + + * 2.6.9 test + + -- Camm Maguire Fri, 07 Jun 2013 21:46:41 +0000 + +gcl (2.6.7+dfsga-10) unstable; urgency=high + + * output mips make bug text to stderr + + -- Camm Maguire Sat, 25 May 2013 12:24:35 +0000 + +gcl (2.6.7+dfsga-9) unstable; urgency=high + + * mips make bug workaround + + -- Camm Maguire Wed, 22 May 2013 14:23:43 +0000 + +gcl (2.6.7+dfsga-8) unstable; urgency=high + + * revert doubled default maxpage + * export *read-eval* + + -- Camm Maguire Tue, 21 May 2013 14:42:05 +0000 + +gcl (2.6.7+dfsga-7) unstable; urgency=high + + * export ansi symbols + + -- Camm Maguire Sat, 11 May 2013 21:36:56 +0000 + +gcl (2.6.7+dfsga-6) unstable; urgency=high + + * fast hash-equal in compiler + + -- Camm Maguire Sat, 11 May 2013 19:11:42 +0000 + +gcl (2.6.7+dfsga-5) unstable; urgency=high + + * Bug fix: "FTBFS: cp: cannot stat + 'debian/tmp/usr/share/info/gcl-si.info': No such file or + directory", thanks to Lucas Nussbaum (Closes: #707490). + + -- Camm Maguire Fri, 10 May 2013 18:09:14 +0000 + +gcl (2.6.7+dfsga-4) unstable; urgency=high + + * sgc-on fix with latest gcc + + -- Camm Maguire Tue, 23 Apr 2013 18:45:11 +0000 + +gcl (2.6.7+dfsga-3) unstable; urgency=high + + * hash depth bug fix + * new s390 reloc + + -- Camm Maguire Thu, 24 Jan 2013 19:46:30 +0000 + +gcl (2.6.7+dfsga-2) unstable; urgency=high + + * more arm relocs supported;check default timezone dynamically;follow + bash ~ semantics in user-homedir-pathname + + -- Camm Maguire Mon, 21 Jan 2013 18:41:06 +0000 + +gcl (2.6.7+dfsga-1) unstable; urgency=high + + * Acknowledge Non-maintainer upload. + (thanks David Prévot ) + * Remove unused and non DFSG-compliant gmp3/gmp.* from source. + (Closes: #695721) + * Show translated debconf templates, thanks to Denis Barbier for the + analysis and the proposed fixes. (Closes: #691946) + * trim excess digits from printed floats + + -- Camm Maguire Tue, 15 Jan 2013 20:46:25 +0000 + +gcl (2.6.7-108) unstable; urgency=high + + * Depend on emacs23 | emacsen to allow wheezy propagation + + -- Camm Maguire Mon, 08 Oct 2012 18:08:36 +0000 + +gcl (2.6.7-107) unstable; urgency=high + + * mode 644 on ucf newfile + + -- Camm Maguire Wed, 03 Oct 2012 20:38:43 +0000 + +gcl (2.6.7-106) unstable; urgency=high + + * Bug fix: "modifies conffiles (policy 10.7.3): /etc/default/gcl", + thanks to Andreas Beckmann (Closes: #688201). + + -- Camm Maguire Wed, 03 Oct 2012 16:52:10 +0000 + +gcl (2.6.7-105) unstable; urgency=high + + * restore #DEBHELPER# to postinst and postrm scripts + + -- Camm Maguire Mon, 01 Oct 2012 17:31:43 +0000 + +gcl (2.6.7-104) unstable; urgency=high + + * Bug fix: "modifies conffiles (policy 10.7.3): /etc/default/gcl", + thanks to Andreas Beckmann (Closes: #688201). + + -- Camm Maguire Mon, 01 Oct 2012 15:32:52 +0000 + +gcl (2.6.7-103) unstable; urgency=high + + * sfaslelf.c: FIX_HIDDEN_SYMBOLS + + -- Camm Maguire Wed, 22 Aug 2012 15:13:12 +0000 + +gcl (2.6.7-102) unstable; urgency=high + + * Fix hash key distribution bug, bitvector equal bug + * distinguish car position in equal-hash of lists + + -- Camm Maguire Mon, 20 Aug 2012 17:33:26 +0000 + +gcl (2.6.7-101) unstable; urgency=high + + * add alpha, ppc, ppc64, and ia64 to __builtin__clear_cache exception + list as per gcc maintainers + * lintian cleanups + + -- Camm Maguire Sat, 05 May 2012 23:18:56 +0000 + +gcl (2.6.7-100) unstable; urgency=high + + * nil case keylist support + * Bug fix: "[INTL:da] Danish translation of the debconf templates gcl", + thanks to Joe Dalton (Closes: #666528). + + -- Camm Maguire Fri, 20 Apr 2012 02:25:26 +0000 + +gcl (2.6.7-99) unstable; urgency=low + + * case default error checking + + -- Camm Maguire Fri, 23 Mar 2012 14:14:44 +0000 + +gcl (2.6.7-98) unstable; urgency=low + + * restore traditional make-sequence,make-array, and coerce, and + optimize replace, as 2.6.8 compiler is still too weak re: inlines + + -- Camm Maguire Fri, 20 Jan 2012 19:55:45 +0000 + +gcl (2.6.7-97) unstable; urgency=low + + * evade __builtin___clear_cache on hppa + * make-array;make-sequence;replace;coerce + + -- Camm Maguire Fri, 20 Jan 2012 05:13:22 +0000 + +gcl (2.6.7-96) unstable; urgency=low + + * better XDR detection; no __builtin_clear_cache on sh4 + + -- Camm Maguire Wed, 18 Jan 2012 01:32:43 +0000 + +gcl (2.6.7-95) unstable; urgency=low + + * clear_cache after mprotect + + -- Camm Maguire Tue, 17 Jan 2012 03:54:56 +0000 + +gcl (2.6.7-94) unstable; urgency=low + + * optimize unwind at O0 to workaround gcc bug; centralize on + __builtin__clear_cache when available;arm_thm_call reloc support + + -- Camm Maguire Mon, 16 Jan 2012 20:10:07 +0000 + +gcl (2.6.7-93) unstable; urgency=low + + * remove C_GC_OFFSET for sparc64 + * remove ncurses dependency for readline + * Bug fix: "FTBFS: dpkg-buildpackage: error: dpkg-source -b gcl-2.6.7 + gave error exit status 2", thanks to Didier Raboud (Closes: #643131). + * Bug fix: "drops readline support if rebuilt", thanks to Sven Joachim + (Closes: #646735). + * lower opts on sparc64 asof gcc 4.6.1 + + -- Camm Maguire Wed, 11 Jan 2012 21:04:23 +0000 + +gcl (2.6.7-92) unstable; urgency=low + + * remove gprof on arm as mcount calls are 24/22bit -- marginally + accessible + + -- Camm Maguire Sat, 07 Jan 2012 02:42:06 +0000 + +gcl (2.6.7-91) unstable; urgency=low + + * s390x reloc support + * lower C optimization on ia64, arm and mips for now + + -- Camm Maguire Thu, 05 Jan 2012 17:30:01 +0000 + +gcl (2.6.7-90) unstable; urgency=low + + * libtirpc check for newest glibc + * read_preserving_whitespace fix + * armhf reloc support + * s390x support + * try C_GC_OFFSET for sparc64 + + -- Camm Maguire Wed, 04 Jan 2012 19:51:13 +0000 + +gcl (2.6.7-89) unstable; urgency=low + + * support new mips relocs + * lower opt to work around gcc 4.6 bug on arm + + -- Camm Maguire Wed, 11 May 2011 20:06:04 +0000 + +gcl (2.6.7-88) unstable; urgency=low + + * Bug fix: "FTBFS: gcl_arraylib.c:4:42: error: 'VV' undeclared + (first use in this function)", thanks to Lucas Nussbaum (Closes: + #625032). + + -- Camm Maguire Mon, 09 May 2011 16:00:21 +0000 + +gcl (2.6.7-87) unstable; urgency=low + + * mips reloc fix;configure default dlopen fix;clean rules and makefiles + + -- Camm Maguire Fri, 05 Nov 2010 13:29:05 +0000 + +gcl (2.6.7-86) unstable; urgency=low + + * remove binutils subdir, configure and make changes + + -- Camm Maguire Thu, 04 Nov 2010 17:55:48 +0000 + +gcl (2.6.7-85) unstable; urgency=low + + * fix mips relocs for non-static clines + + -- Camm Maguire Tue, 02 Nov 2010 13:56:40 +0000 + +gcl (2.6.7-84) unstable; urgency=low + + * better mips relocs, fix link on mingw32 + + -- Camm Maguire Sat, 30 Oct 2010 00:07:39 +0000 + +gcl (2.6.7-83) unstable; urgency=low + + * fix alpha stubs; fix sparc64 typo; print armhf relocs + + -- Camm Maguire Thu, 28 Oct 2010 13:43:16 +0000 + +gcl (2.6.7-82) unstable; urgency=low + + * mips64 fixes + + -- Camm Maguire Tue, 26 Oct 2010 18:20:04 +0000 + +gcl (2.6.7-81) unstable; urgency=low + + * sparc64;mips64 + + -- Camm Maguire Tue, 26 Oct 2010 03:33:52 +0000 + +gcl (2.6.7-80) unstable; urgency=low + + * alpha stubs; sgc mips kernel bug test; mips GPREL32 reloc + + -- Camm Maguire Mon, 25 Oct 2010 19:52:51 +0000 + +gcl (2.6.7-79) unstable; urgency=low + + * mips ld_bind_now, disable sgc workaround mips SIGBUS bug + + -- Camm Maguire Wed, 20 Oct 2010 15:31:59 +0000 + +gcl (2.6.7-78) unstable; urgency=low + + * mips local got relocs + + -- Camm Maguire Tue, 12 Oct 2010 17:15:35 +0000 + +gcl (2.6.7-77) unstable; urgency=low + + * workaround gcc alpha bug + * fix alpha reloc + + -- Camm Maguire Fri, 01 Oct 2010 21:25:11 +0000 + +gcl (2.6.7-76) unstable; urgency=low + + * fix page_multiple usage for runtime pagesize variance and stable mipsel builds + * sparc64 support + + -- Camm Maguire Fri, 01 Oct 2010 19:18:47 +0000 + +gcl (2.6.7-75) unstable; urgency=low + + * fix alpha bug + + -- Camm Maguire Tue, 28 Sep 2010 20:23:21 +0000 + +gcl (2.6.7-74) unstable; urgency=low + + * fix alpha relocs for axiom + + -- Camm Maguire Tue, 28 Sep 2010 16:07:38 +0000 + +gcl (2.6.7-73) unstable; urgency=low + + * sparc reloc updates + * fast-link fix + + -- Camm Maguire Fri, 24 Sep 2010 19:23:16 +0000 + +gcl (2.6.7-72) unstable; urgency=low + + * remove unused symbols from gcl_cmpopt.lsp + * reloc updates + * clear gcc warning + * default tilde expansion to HOME env in absence of passwd + * configure typo fix + + -- Camm Maguire Wed, 22 Sep 2010 19:32:52 +0000 + +gcl (2.6.7-71) unstable; urgency=low + + * print sparc64 relocs + + -- Camm Maguire Sat, 28 Aug 2010 14:50:00 +0000 + +gcl (2.6.7-70) unstable; urgency=low + + * sparc64/m68k + + -- Camm Maguire Fri, 27 Aug 2010 16:54:11 +0000 + +gcl (2.6.7-69) unstable; urgency=low + + * Bug fix: "non-standard gcc/g++ used for build (gcc-4.3)", thanks to + Matthias Klose (Closes: #594280). + + -- Camm Maguire Thu, 26 Aug 2010 19:08:39 +0000 + +gcl (2.6.7-68) unstable; urgency=low + + * ppc/mips elf reloc fixes + + -- Camm Maguire Mon, 23 Aug 2010 20:54:30 +0000 + +gcl (2.6.7-67) unstable; urgency=low + + * Fix compiler::link ansi combo + + -- Camm Maguire Sat, 21 Aug 2010 02:05:37 +0000 + +gcl (2.6.7-66) unstable; urgency=low + + * ppc autobuild fix + * Bug fix: "FTBFS: sfasli.c:139: error: invalid initializer", thanks to + Lucas Nussbaum (Closes: #593037). + * Bug fix: "FTBFS on powerpc: Error: The function TK::GET-AUTOLOADS is + undefined.", thanks to Mehdi Dogguy (Closes: #593191). + + -- Camm Maguire Fri, 20 Aug 2010 01:25:09 +0000 + +gcl (2.6.7-65) unstable; urgency=low + + * autobuilder fixes + + -- Camm Maguire Sat, 14 Aug 2010 11:30:46 +0000 + +gcl (2.6.7-64) unstable; urgency=low + + * configure fix + + -- Camm Maguire Fri, 13 Aug 2010 23:26:07 +0000 + +gcl (2.6.7-63) unstable; urgency=low + + * macosx support, ppc, i386 and x86_64 -- sfaslmacho.c + * windows/wine support -- sfaslcoff.c + * better custreloc support obviating my_plt -- sfaslelf.c + * debian default custreloc build where supported, all but ia64 and hppa + * fix mingw/wine path issues + + -- Camm Maguire Fri, 13 Aug 2010 16:08:49 +0000 + +gcl (2.6.7-62) unstable; urgency=high + + * more stable sgc detection via h/tsgc.h + * fix plt.h bug on hppa + * sublis1-inline fix for acl2 + + -- Camm Maguire Mon, 26 Jul 2010 16:03:54 +0000 + +gcl (2.6.7-61) unstable; urgency=high + + * mac osx support + * fix undef sgc bug in cmpinclude.h + + -- Camm Maguire Tue, 20 Jul 2010 14:50:19 +0000 + +gcl (2.6.7-60) unstable; urgency=high + + * fix sh4 support + + -- Camm Maguire Thu, 29 Apr 2010 18:09:04 +0000 + +gcl (2.6.7-59) unstable; urgency=high + + * fix hurd support + + -- Camm Maguire Fri, 23 Apr 2010 17:12:54 +0000 + +gcl (2.6.7-58) unstable; urgency=high + + * hurd support + * sh4 support + + -- Camm Maguire Fri, 23 Apr 2010 05:09:29 +0000 + +gcl (2.6.7-57) unstable; urgency=high + + * static function pointer wrapper for gcl_gmp_allocfun, stabilizing gmp + on hppa/ia64 + + -- Camm Maguire Mon, 12 Apr 2010 22:28:41 +0000 + +gcl (2.6.7-56) unstable; urgency=high + + * __builtin___clear_cache on arm + * gcc-4.3 on alpha + + -- Camm Maguire Thu, 28 Jan 2010 00:32:16 +0000 + +gcl (2.6.7-55) unstable; urgency=low + + * SGC fix, debian override fix, xgcl update + * SGC fix for relocatable and contiguous gmp storage + * configure fix for arm and hppa + + -- Camm Maguire Tue, 26 Jan 2010 19:43:08 +0000 + +gcl (2.6.7-54) unstable; urgency=low + + * robustify user_match, unrandomize, read-char-no-hang for sockets + * SA_SIGINFO for 386-linux + * if cmpinclude.h is not available, use *cmpinclude-string* in compiler-pass2 + + -- Camm Maguire Wed, 20 Jan 2010 19:02:28 +0000 + +gcl (2.6.7-53) unstable; urgency=low + + * revert round ratio to nearest + + -- Camm Maguire Tue, 05 Jan 2010 03:06:59 +0000 + +gcl (2.6.7-52) unstable; urgency=low + + * SIGINFO for kfreebsd-386 + + -- Camm Maguire Mon, 04 Jan 2010 17:49:05 +0000 + +gcl (2.6.7-51) unstable; urgency=low + + * user_match exscapes once only + + -- Camm Maguire Sun, 03 Jan 2010 05:31:20 +0000 + +gcl (2.6.7-50) unstable; urgency=low + + * gcc 4.4 warning cleanups + + -- Camm Maguire Thu, 31 Dec 2009 20:43:39 +0000 + +gcl (2.6.7-49) unstable; urgency=low + + * Bug fix: "/bin/sh: line 6: /bin/gcl: Permission denied", thanks to + Nobuhiro Iwamatsu (Closes: #561554). + + -- Camm Maguire Wed, 30 Dec 2009 23:04:39 +0000 + +gcl (2.6.7-48) unstable; urgency=low + + * round to nearest in ratio to double + + -- Camm Maguire Wed, 16 Dec 2009 15:01:55 +0000 + +gcl (2.6.7-47) unstable; urgency=low + + * Bug fix: "configure: error: Need zlib for bfd linking", thanks to + Cyril Brulebois (Closes: #560761). + * Bug fix: "Disfunctional maintainer address", thanks to Joerg Jaspert + (Closes: #560752). + + -- Camm Maguire Mon, 14 Dec 2009 19:06:45 +0000 + +gcl (2.6.7-46) unstable; urgency=low + + * support newer binutils with output_bfd element + * Fix 64bit interrupt bug + * reader error fix + * Ensure plt entries are not blank + * plt table reading fix + * Bug fix: "FTBFS: current binutils static libs need -lz", thanks to + Daniel Schepler (Closes: #521929). + * Bug fix: "replacing libreadline5-dev build dependency with + libreadline-dev", thanks to Matthias Klose (Closes: #553761). + * Bug fix: "crash after ctrl-C", thanks to Miroslaw Kwasniak (Closes: + #519903). + * Bug fix: "FTBFS with binutils-gold", thanks to Peter Fritzsche + (Closes: #554418). -ldl added to bfd linker args + * Bug fix: "[INTL:es] Spanish debconf template translation for gcl", + thanks to Francisco Javier Cuadrado (Closes: #508728). + * Bug fix: "[INTL:it] Italian translation", thanks to Vincenzo + Campanella (Closes: #560364). + * gcc error/warning cleanups + * fix plt table awk + + -- Camm Maguire Fri, 11 Dec 2009 17:45:14 +0000 + +gcl (2.6.7-45) unstable; urgency=high + + * proper word order detection macro, fixes armel + + -- Camm Maguire Mon, 01 Sep 2008 13:48:16 +0000 + +gcl (2.6.7-44) unstable; urgency=high + + * backoff on arm opts + * more careful handling of GCL_GPROF_START + + -- Camm Maguire Sat, 23 Aug 2008 21:28:52 +0000 + +gcl (2.6.7-43) unstable; urgency=low + + * redo unrandomize.h to enable compilation under -O2 -- FIXME; Closes: 494153 + + -- Camm Maguire Wed, 20 Aug 2008 21:18:43 +0000 + +gcl (2.6.7-42) unstable; urgency=low + + * more div/rem symbols for alpha + + -- Camm Maguire Sun, 03 Aug 2008 11:18:51 +0000 + +gcl (2.6.7-41) unstable; urgency=low + + * more div/rem symbols for arm and hppa + + -- Camm Maguire Sat, 02 Aug 2008 00:36:07 +0000 + +gcl (2.6.7-40) unstable; urgency=low + + * default gcc with pic enabled on mips/mipsel + + -- Camm Maguire Fri, 01 Aug 2008 13:28:00 -0400 + +gcl (2.6.7-39) unstable; urgency=high + + * gcc 4.2 for mips/mipsel for now + * __divdi3 et. al. symbols for ia64 and arm + * clean some compiler warnings + + -- Camm Maguire Fri, 01 Aug 2008 12:53:07 -0400 + +gcl (2.6.7-38) unstable; urgency=low + + * No infinite unrandomization loops + + -- Camm Maguire Thu, 31 Jul 2008 15:18:37 -0400 + +gcl (2.6.7-37) unstable; urgency=low + + * Non-maintainer upload to fix pending l10n issues + * Debconf templates and debian/control reviewed by the debian-l10n- + english team as part of the Smith review project. Closes: #457025 + * [Debconf translation updates] + - Portuguese. Closes: #457576 + - Czech. Closes: #457677 + - French. Closes: #458120 + - Finnish. Closes: #458255 + - Galician. Closes: #458529 + - Vietnamese. Closes: #459008 + - Russian. Closes: #459308 + - Dutch. Closes: #459541 + - German. Closes: #459887 + * [Lintian] Correct FSF address in debian/copyright + * [Lintian] Remove extra whitespaces at the end of + debian/in.gcl-doc.doc-base.tk + * [Lintian] Correct section in doc-base documents from Apps/Programming + to Programming + * Accept NMU + * Bug fix: "[INTL:sv] po-debconf file for gcl", thanks to Martin Ågren + (Closes: #492241). + * Bug fix: "gcl: FTBFS [amd64]: cannot trap sbrk", thanks to Daniel + Schepler (Closes: #487435). Modified and applied personality handling + patch. + * Bug fix: "gcl: Builds broken package with gcc-4.3", thanks to Daniel + Schepler (Closes: #467474). Added sincos to plttest.c + + -- Camm Maguire Thu, 31 Jul 2008 15:18:15 -0400 + +gcl (2.6.7-36) unstable; urgency=low + + * statsysbfd in Debian, incoporating modules into libgcl.a for + compiler::link support + + -- Camm Maguire Fri, 30 Nov 2007 12:03:31 -0500 + +gcl (2.6.7-35) unstable; urgency=low + + * drop gcc-3.4 on arm, Closes: #440421 + * Depend on emacs22 | emacsen, Closes: #440190 + * debconf translations Closes: #410683, Closes: #419736, Closes: #423706, Closes: #441408 + + -- Camm Maguire Fri, 23 Nov 2007 10:25:23 -0500 + +gcl (2.6.7-34) unstable; urgency=low + + * add read-byte,read-sequence,write-byte,write-sequence support + * fix some float parsing inaccuracies + * support GNU_HASH sections, Closes: #426135 + * safety 2 for certain low level functions in gcl_listlib.lsp, CLoses: + #415266 + + -- Camm Maguire Wed, 4 Jul 2007 16:23:25 -0400 + +gcl (2.6.7-33) unstable; urgency=low + + * Fix leading underscore behavior of my_plt + * add sqrt to plttest.c + * disable-nls added to the binutils subconfigures to avoid msgfmt + dependency + * remove -lintl from powerpc-macosx.defs + * update to make-user-init from cvs head to support hol88, fix link on + mingw + * solaris-i386 support + * fix read-char-no-hang on mingw + * fast compile without wrap-literals + * sigaltstack support + * fix cerror + + -- Camm Maguire Wed, 16 May 2007 12:45:40 -0400 + +gcl (2.6.7-32) unstable; urgency=low + + * static function pointers for hppa + + -- Camm Maguire Sun, 29 Oct 2006 02:15:13 -0500 + +gcl (2.6.7-31) unstable; urgency=low + + * no C optimization on hppa, gcc 4.x on hppa + * update cs.po, Closes: #389211 + + -- Camm Maguire Fri, 27 Oct 2006 13:06:55 -0400 + +gcl (2.6.7-30) unstable; urgency=low + + * make sure *tmp-dir* is set + * makeinfo is optional + + -- Camm Maguire Wed, 25 Oct 2006 17:37:54 -0400 + +gcl (2.6.7-29) unstable; urgency=low + + * Fix build issues on hppa and m68k + + -- Camm Maguire Sat, 21 Oct 2006 15:10:41 -0400 + +gcl (2.6.7-28) unstable; urgency=low + + * si::gettimeofday function for HOL88 build;macosx fixes + + -- Camm Maguire Wed, 18 Oct 2006 13:21:26 -0400 + +gcl (2.6.7-27) unstable; urgency=low + + * unrestricted gcc for alpha + * more default stack space + + -- Camm Maguire Tue, 17 Oct 2006 16:33:43 -0400 + +gcl (2.6.7-26) unstable; urgency=low + + * Fix large float read bug in c1constant-value + + -- Camm Maguire Mon, 16 Oct 2006 12:41:03 -0400 + +gcl (2.6.7-25) unstable; urgency=low + + * build-dep on gcc3.4 where appropriate + * Newer standards + + -- Camm Maguire Thu, 12 Oct 2006 09:37:08 -0400 + +gcl (2.6.7-24) unstable; urgency=low + + * build-dep on gcc3.4 where appropriate + * Newer standards + + -- Camm Maguire Thu, 12 Oct 2006 02:22:04 -0400 + +gcl (2.6.7-23) unstable; urgency=low + + * backoff to gcc-3.4 on alpha,arm,hppa, and m68k + + -- Camm Maguire Wed, 11 Oct 2006 10:16:59 -0400 + +gcl (2.6.7-22) unstable; urgency=low + + * HAVE_SYS_SOCKIO_H for solaris + * autolocbfd for solaris + * no -Wall when no gcc + * no -fomit-frame-pointer on m68k + * no profiling on mips + * $(AWK) instead of awk + * si::stat function + * fix 'the boolean type coersion error + * no varargs on cygwin + * while eval macro + * gensym counter fixes + * xgcl updates + + + -- Camm Maguire Fri, 15 Sep 2006 13:48:28 -0400 + +gcl (2.6.7-21) unstable; urgency=low + + * Fix socket write error + + -- Camm Maguire Wed, 6 Sep 2006 09:59:50 -0400 + +gcl (2.6.7-20) unstable; urgency=low + + * fix ia64 build + + -- Camm Maguire Thu, 31 Aug 2006 15:14:18 -0400 + +gcl (2.6.7-19) unstable; urgency=low + + * xgcl upgrade + * parse_number from cvs head with *read-base* fixes + * fix object_to_string + * install xgcl-2/sysdef.lisp + * fix info dir and emacs site lisp dir installation + * New xgcl readme + * Remove bashism from debian/rules, Closes: #376806, Closes: #385176. + * Fix dwdoc doc-base error, Closes: #385126 + + -- Camm Maguire Wed, 30 Aug 2006 12:13:46 -0400 + +gcl (2.6.7-18) unstable; urgency=low + + * remove emacs build dependency + * synch xgcl-2 with Novak edits + * fix build errors + * Remove power of two limit to MAXPAGE;fix X lib paths + * configure cleanup + * delete-file works on directories;build xgcl the old way;latest xgcl + from Gordon Novak + + -- Camm Maguire Wed, 23 Aug 2006 14:19:51 -0400 + +gcl (2.6.7-17) unstable; urgency=low + + * Bug fix: "gcl: [INTL:sv] Swedish debconf templates translation", + thanks to Daniel Nylander (Closes: #343695). + * Bug fix: "gcl: French debconf templates translation update", thanks to + Sylvain Archenault (Closes: #344629). + * clean xgcl-2/gmon.out + * cleanup latest gcc type-punning warnings + * defentry C proclamations and xgcl cleanup + + -- Camm Maguire Mon, 26 Jun 2006 16:45:09 +0000 + +gcl (2.6.7-16) unstable; urgency=high + + * Add missing build dependencies, omit html generation to avoid non-free + dependencies, CLoses: #372574. + + -- Camm Maguire Mon, 19 Jun 2006 14:05:59 +0000 + +gcl (2.6.7-15) unstable; urgency=low + + * Use internal gettext for bfd + * Restore xgcl2 + * Set compiler::*tmp-dir* at runtime + * report tmp-dir setting with system-banner to enable clean -eval - + batch operation; fix listen on socket streams; use (abs (getpid)) in + tmp names for Windows + * fix configure unbalanced quotes + * support for bignums in nth et.al. + * Fix branch cut of atanh + * Fix typep on simple-arrays + * prevent nested free errors + * revert atanh branch cut change + * Fix function documentation wrapping by compile + * cond evalmacro from cvs head + * Fix fixnum declarations in new smallnthcdr/bignthcdr + * fix simple-array typep + * updates for lsp/sys-proclaim + * xgcl integration + + -- Camm Maguire Fri, 9 Jun 2006 17:52:22 +0000 + +gcl (2.6.7-14) unstable; urgency=low + + * Add mount declaration to plt.c + + -- Camm Maguire Sun, 18 Dec 2005 12:56:51 +0000 + +gcl (2.6.7-13) unstable; urgency=low + + * Add feof to plttest.c for macosx + * plt related fixes for macosx + * fix configure + * Cleanup LEADING_UNDERSCORE case in plt.c et.al for macosx et.al. + * pass devices if present in compiler::get-temp-dir, fix disassemble + for new gazonk name pattern + + -- Camm Maguire Sat, 17 Dec 2005 15:22:40 +0000 + +gcl (2.6.7-12) unstable; urgency=low + + * Fix read-char-no-hang + * Strip emacs warnings when finding site-lisp directory + * mach-o update for latest binutils + * Latext bfd mach-o support from Aurelien + * revert to locbfd default on ppc-macosx + * More ppc macosx fixes from Aurelien + * revert a few macosx changes + * default to void * prototype on my_sbrk for latest macosx pending + Aureliens #ifdef + * Fix plt.h parsing on macosx + * Fix leading_underscore detection on mac + * macosx name mangling fixes + * multi-process safe gazonk names in compiler::*tmp-dir* + * Add underscore-mangled setjmp calls to plttest.c for macosx + * Fix POTFILES.in, Closes: #336207. + * Update templates, Closes: #324636 + * New French and Swedish translations, Closes: #333654, Closes: #336757. + + -- Camm Maguire Wed, 14 Dec 2005 18:52:49 +0000 + +gcl (2.6.7-11) unstable; urgency=low + + * Remove gcc-3.3 for arm in debian/rules + * make default maxpage depend on SIZEOF_LONG and PAGEWIDTH in a sane + fashion + + -- Camm Maguire Thu, 20 Oct 2005 00:08:37 +0000 + +gcl (2.6.7-10) unstable; urgency=low + + * Fix long-call gcc configure bug for ppc, add fdollars in + identifiers on arm + * remove gcc restrictions on arm + * revert 64bit coersion (gmp_big.c, maybe_replace_big) and replace with + code in siLnani (main.c) to get addresses from bignums. 2.7.0 will + have 64bit fixnums on 64bit machines, but this should not be + backported to 2.6.x + + -- Camm Maguire Wed, 12 Oct 2005 23:11:12 +0000 + +gcl (2.6.7-9) unstable; urgency=low + + * 64bit fixnum fasd data format fix from cvs head + + -- Camm Maguire Wed, 5 Oct 2005 18:49:50 +0000 + +gcl (2.6.7-8) unstable; urgency=low + + * Fix 64bit fixnum coersion bug using code from cvs HEAD + + -- Camm Maguire Fri, 30 Sep 2005 22:14:38 +0000 + +gcl (2.6.7-7) unstable; urgency=high + + * Scan .o file for init name when using dlopen + * Set init name using .o file instead of source file by default + * wrap-literals function from cvs head to allow optimizations using + compile or compile-file + * ADDR_NO_RANDOMIZE fix + + -- Camm Maguire Thu, 29 Sep 2005 17:50:56 +0000 + +gcl (2.6.7-6) unstable; urgency=high + + * Build bfd snapshot locally, Closes: #318681 + + -- Camm Maguire Tue, 20 Sep 2005 17:53:17 +0000 + +gcl (2.6.7-5) unstable; urgency=high + + * gcc-3.3 for arm + + -- Camm Maguire Thu, 15 Sep 2005 20:33:00 +0000 + +gcl (2.6.7-4) unstable; urgency=high + + * gcc 3.4 on arm to work around reserved '$' identifiers. + * gcl: French translation update + * French translation added, Closes: #325214 + * Czech translation added, Closes: #325869 + + -- Camm Maguire Thu, 15 Sep 2005 13:45:11 +0000 + +gcl (2.6.7-3) unstable; urgency=low + + * static wraper for compiled_regexp for ia64 + + -- Camm Maguire Sat, 10 Sep 2005 11:26:37 +0000 + +gcl (2.6.7-2) unstable; urgency=high + + * rebuild against libgmp3c2, Closes: #323765 + * 2.6.7 fixes all gcc 4.0 issues. Closes: #323979 + + -- Camm Maguire Wed, 24 Aug 2005 00:44:48 +0000 + +gcl (2.6.7-1) unstable; urgency=high + + * Fix (listen) with readline on + * fix control-d with readline + * libreadline5 support for Debian + * Support for pre-compiled regexps and new texinfo format + * Reenable run-process + * Push function 'accept into lisp, use select for 'listen on socket + streams + * New Upstream release version + * Native-reloc feature + * Add daemon capabilities to server sockets, document socket and + accept + * Some gcl-tk fixes + * Update wrapt-literals strategy to be consistent with CVS head -- + wrap evreything but symbols and integers, don't wrap when keeping + the gazonk files for linking in different images, this is really a + compile-file operation + * gcltk demo cleanups + * Probe-file, open_stream, and the like fail on directories + * Resolve symlinks in truename + * Place prototypes for defcfun in header files + * Support for unique init names for compiler::link and the like + * libreadline5 for Debian + * remove _o from init-names + * gcc-4.0 fixups + * Bug fix: "gcl: depends on binutils-dev <<= 2.1.5-999), so + uninstallable in unstable", thanks to Steve Langasek (Closes: + #318681). Rebuild with new release to autocompute this dep + * Bug fix: "gcl: Please switch to po-debconf", thanks to Lucas Wall + (Closes: #295930). Apply po-debconf patch + * Newer standards + + -- Camm Maguire Thu, 11 Aug 2005 15:00:26 +0000 + +gcl (2.6.6-1) unstable; urgency=high + + * New upstream release + * Allow .data section to be first in executable, as on solaris. Also + allow for new bfd section size semantics + * Don't try to write map file when not using GNU ld. Also allow + compile-file to process pathnames with whitespace on Windows + * Fix corner case fixnum arithmetic on 64bit machines + * Rework gmp_wrappers semantics for older gcc + * Explicitly mprotect loaded code pages PROT_EXEC on x86 Linux, as FC3 + now requires it. + * lisp-implementation-version is GCL + * Reader extension patch allowing for foo::(bar foobar) semantics + * a shell script variable fix in "unixport/makefile" for MSYS + * __MINGW32__ malloc initialisation fix in "o/alloc.c" + * Windows file/directory fixes in "o/unixfsys.c" + * MinGW32 -march in configure - removes deprecation warnings + * MinGW32 directory fix - "o/mingfile.c". + * Allow for sysconf to determine clock granularity at compile time to + fix time errors on the Itanium + * Disable SGC on macosx until the sgc/save problem can be fixed. + * Fix fixnum print bug on 64bit + * Fix nil types in room report + * 64bit fixes to fixnum_add and fixnum_sub + * Fix Mac SGC/save bug, at least in part + + -- Camm Maguire Sun, 16 Jan 2005 02:28:50 +0000 + +gcl (2.6.5-1) unstable; urgency=high + + * New gmp_wrappers.{c,h} files that prevent all GBC within gmp, + obviating the need for gmp patches and a local gmp configure. FIXME + -- extend to all gmp functions in a systematic way, and write header + information for future use in the compiler, making sure that plt.c + carries the needed gmp symbols at this point + * Build support for gmp_wrappers + * Support for gmp_wrappers in alloc_relblock/alloc_contblock;Support + for GCL_GPROF_START define in gprof functions + * dynsysgmp on by default; configure backs off to local gmp configure + and build automatically if needed either because gmp not present or + patched symbols are needed; autodetect and set the _start symbol + when using gprof + * Fix (setf (get ...) ...) return bug when interpreted + * Fix overwrite end of sgc_type_map bug + * Versioned depends on binutils-dev manually installed by Debian build + process + * New upstream release + * Proper binutils dependency for Debian + * head -1l -> head -n 1 for freebsd + * Cleanup gmp_wrapper code, check for in-place calls as write in one + step is not guaranteed in gmp according to its developers + * Rebuild against binutils 2.15, Closes: #266253, Closes: #263983 + + -- Camm Maguire Tue, 17 Aug 2004 18:22:27 +0000 + +gcl (2.6.4-1) unstable; urgency=high + + * New upstream release + * Make disassemble work when original system directory is gone + * New debian/support files for debconf image default selection support + * More descriptive compiled C function names for use in gprof when + profiling is compiled in + * Compiler fix for proclaimed vararg functions + * Allow sharp numbers to be bignums + * lintian fix in string-match + * Prototype for alloca for lint + * Improve gprof support + * Improve sgc page allocation which optimize-maximum-pages is in + effect and the hole is overrun + * Build a profiling set of images as well for Debian, toggle between + all four by default via debconf + * reset-sys-paths lisp function for moving image installation + directories, show profiling support in banner if present + * Fix typo in sys docs + * reset sys paths on installation + + -- Camm Maguire Thu, 5 Aug 2004 22:48:56 +0000 + +gcl (2.6.3-1) unstable; urgency=high + + * Correctly parse gcc version strings in gmp3 subconfigure on arm + * Fix variable capture error in dotimes macro + * Better sed separator for LI-CC in unixport/makefile + * Fix segfault in string-match + * vs_top=sup -> (reset-top) where possible in compiler. FIXME: a few + items of a different form which need to set *sup-used* too. + * Correct room report to show proper percentages when sgc is on + * Read in RELOC environment variable if set as default in debian/rules + * Remove local bfd libraries from libs variables as their objects are + incorporated into libgcl and as the source directory may not be + available at runtime + * Remove pcl/pcl_gazonk*lsp build-generated files from source + + -- Camm Maguire Thu, 15 Jul 2004 14:26:44 -0400 + +gcl (2.6.2-3) unstable; urgency=low + + * Fix value stack leak in rare compiled call sequence + + -- Camm Maguire Tue, 13 Jul 2004 10:17:02 -0400 + +gcl (2.6.2-2) unstable; urgency=low + + * New upstream point release + + -- Camm Maguire Tue, 13 Jul 2004 10:08:53 -0400 + +gcl (2.6.2-1) unstable; urgency=low + + * gcc-3.4 support + * Proper isnormal default courtesy of Magnus Henoch + * gclclean makefile target and other small makefile changes + * Proper check for C stack array body address in gbc.c and sgbc.c + * New upstream release + * acconfig.h update for isnormal default + * Fix bug in setting elements (si::aset) of 0 rank arrays uncovered by + the random tester + * No -fomit-frame-pointer on mingw + * Backport minimal ansi-test patches from HEAD to enable running of + the random tester + * installed tcl/tk patch for mingw + * Fix banner license detection code in lsp/gcl_mislib.lsp as + 8features* entries are now keywords + * o/makefile changes to work around trailing slash -I arguments gcc + bug on mingw + * Patch to mingwin.c:fix_filename to close long standing 'maxima + ignore-errors filename corruption' bug on mingw + * Check for too large rank supplied to make-array1 + * Fix potential stack overwrite bug in quick_call_sfun/eval.c + * Add -mprferred-stack-boundary=8 on amd64, as constant integers used + in a call must be retrievable with va_arg(,fixnum) + * Revert preferred-stack-boundary option on amd64 as it does not play + well with external libraries, also eliminate -m64 to allow for user + settings. Cast fixnum constant C arguments in gcl_cmploc.lsp + explicitly to (long) to ensure they can be extracted via + va_arg(,fixnum) + * reenable SA_SIGINFO on amd64 to restore SGC there + * Include elf.h in FreeBSD.h + * Allow for elf_abi.h in FreeBSD.h + * Add README.openbsd file + * readme.mingw updates + * solaris.h updates for custreloc option + * Close possibility of malloc failure due to intervening gbc arising + from the misordering of allocation calls + * C_GC_OFFSET is 2 on m68k-linux + * Add release notes, remove gcl document presumably based on dpANS for + now + * Fixup bad extern declaration of signals_handled in usig.c + + -- Camm Maguire Fri, 25 Jun 2004 22:43:52 +0000 + +gcl (2.6.1-39) unstable; urgency=high + + * Fix segfault in referencing (sgc_)type_map out of bounds which can + occurr when C stack is below heap, as on alpha. + * Cleanup compiler warnings on bcmp.c bzero.c and bcopy.c + * Clean up compiler warning in file.d + * Ensure set TLDFLAGS are used in finding DBEGIN in copnfigure.in, for + OpenBSD + + -- Camm Maguire Fri, 7 May 2004 21:50:03 +0000 + +gcl (2.6.1-38) unstable; urgency=low + + * Make *features* entries keywords -- add canonical host cpu and + kernel-system to *features*, disable h files specific + ADDITIONAL_FEATURES macro in main.c + * Fix merge-pathanames bug in concatenating default and supplied + directory lists + * Minor pathname and *features* fixes + * Fix recently introduced configure.in syntax bug + * Minor patches to support big gcl images -- all page integers must be + long ints, need stack space limits that scale with MAXPAGES at least + to allow free_map stack array in sgc_start. FIXME -- right now can + handle situations where page numbers are ints, but npage*PAGESIZE is + a long, need to handle npage >MAX_INT later. This is to support the + 'billion cons element acl2 image' requested by a gcl user + * Revert winnt features and debugging aids in configure.in + * OpenBSD support, gcc warning cleanups for long page integers + + -- Camm Maguire Mon, 3 May 2004 21:34:57 +0000 + +gcl (2.6.1-37) unstable; urgency=high + + * mprotect pages PROT_EXEC as CLEAR_CACHE step on amd64-linux + * Prevent recursive malloc calls for OpenBSD error reporting + * Push dummy 0 time for child runtime on windows to be compatible with + other platforms for now + * Make sure pages are mprotected PROT_EXEC for amd64 support + + -- Camm Maguire Tue, 13 Apr 2004 21:00:22 +0000 + +gcl (2.6.1-36) unstable; urgency=low + + * Improve optimize-maximum-pages algorithm + + -- Camm Maguire Tue, 6 Apr 2004 03:23:40 +0000 + +gcl (2.6.1-35) unstable; urgency=low + + * Fix sigcontext autodetection on sparc + + -- Camm Maguire Sun, 4 Apr 2004 19:26:48 +0000 + +gcl (2.6.1-34) unstable; urgency=low + + * Fix GNU_LD autodetection in configure.in + * Eliminate C_INCLUDE_PATH from shell script wrapper + * Use lisp rather than 'system touch' to make empty map file in + compiler::link + * fix small bug when info is passed bad second argument + * Don't try to open map file if doesn't stat (macosx) + * Add earlier forgotten branch patch to sfaslbfd.c for macosx + * Backport new eval-when keyword support from 2.7 to run random tester + * Perhormance improvement to gcl_seqlib.lsp -- no inner loop over + bignums + * Proper contblock/relblock determination when expanding string + streams + * Proper string type determination for *link-array* + * .ini files depend on plt.h + * plttest.c cannot depend on include.h + * Address longstanding FIXmE in gensym, so that two strings are not + allocated for each gensym + * Fix rare infinite loop bug in array.c + * Import si::info into 'user + * , -> # as sed separator + * Minro warning removals and fixups + * Binary searches through ordered arrays of referred and changed + variables for dramatic compiler performance improvement in the large + case -- support declarations and thereby optimizations of the form + (declare ((vector t) foo)), etc. + * Better 'time macro + * rebuild pcl_gaz* files + * cleanup room report and give more space to modern large heaps + * room report formatting + * Properly gensymmed time macro + * Allow for white space chars in compiled filenames + * Autodetect and work around sbrk randomization, e.g. on Fedora 1 + * Probe for sbrk before probing for randomized sbrk + * Openbsd changes -- maximize data seg resource if possible, avoid + mallocing error message when allocation routines fails + * Fix sigcontext configure tests + * Rename loop-finish -> sloop-finish in sloop package so that sloop + and ansi loop can be used simultaneously + * Handle arguments which are zero in LCM + * Fix typo in configure.in + * Improved dotimes macro which avoids unnecessary fixnum garbage + generation + * Backport of ignorable declaration keyword for new dotimes macro + * si::*OPTIMIZE-MAXIMUM-PAGES* support + * rebuild pcl generated lisp files + + -- Camm Maguire Sat, 3 Apr 2004 19:27:18 +0000 + +gcl (2.6.1-33) unstable; urgency=low + + * Remove extraneous symbols from plt.h, autodetect and correct for + leading underscore in object symbols + * complete readline version detection commit + * Backport support for new eval-when keywords + * Autodetect GNU ld and add -Wl,-Map only when appropriate + + -- Camm Maguire Wed, 10 Mar 2004 22:51:44 +0000 + +gcl (2.6.1-32) unstable; urgency=low + + * Try to automatically determine the form used for the explicitly + compiled in external function addresses in plt.c + * No need to explicitly write cr-lf on windows + * Autodetection of machine on FreeBSD + * Updated defs and h files for FreeBSD courtesy of Mark Murray + * Minor ifdefs needed for FreeBSD + * Refer to exported non-static C stub of fSmake_vector1 in plt.c + (needed on ia64) + * Readline 4.1/4.3 configure magic + + -- Camm Maguire Tue, 9 Mar 2004 01:58:43 +0000 + +gcl (2.6.1-31) unstable; urgency=low + + * Adjustments to vs_top reset logic to clear (hopefully last) + remaining bug found by the random-tester + * Allow args-info-referred-vars to match replaced vars, clearing bug + report submitted by Matt Kauffman + * Rework plt code yet again to be compatible with compiler::link for + axiom, and mingw32 + + -- Camm Maguire Mon, 8 Mar 2004 12:16:46 +0000 + +gcl (2.6.1-30) unstable; urgency=low + + * Fix rsym generated symbol tables for 64 bit platforms + * Make sure 'unwind' in frame.c does nt go below frs_org + * Do not define symbols with no value, either in bfd/rsym, or in + plt.c. Generates a clear and explicit error of an undefined symbol + when we've missed an address + * Define the external symbols known to be written at present in plt.c + * fix some more compiler errors found by the random tester -- all + related to proper unwinding of temporary reductions of vs_top from + te local supremum + + -- Camm Maguire Sat, 6 Mar 2004 02:05:59 +0000 + +gcl (2.6.1-29) unstable; urgency=low + + * Remove implicit dependency on gawk, optimize plt.c a little + + -- Camm Maguire Wed, 3 Mar 2004 16:08:30 +0000 + +gcl (2.6.1-28) unstable; urgency=low + + * make sure bfd fasload initializes dum.sm.sm_object1 for + read_fasl_vector + * When a tagbody contains ccb reference tags, and hence i itself + marked ccb, mark all the clb tags therein ccb too, as the tagbody + environment will be consed in c2tagbody-ccb. FIXME -- review this + logic carefully + * fix typoe in o/sfaslbfd.c + * Add code to unwind redefinitions of the stack supremum in c2expr-top + (used in c2multiple-value-prog1 and c2multiple-value-call in + evaluating arguments) on non-local exit + * Use new temporarry variables holding lisp stack supremum for lint + * Eliminate extraneous warning message when allocating fewer pages + than already allocated + * Rework internal plt symbol address capture + * Cleanup sfaslelf compiler warning + + -- Camm Maguire Wed, 3 Mar 2004 00:27:08 +0000 + +gcl (2.6.1-27) unstable; urgency=low + + * Modify default banner slightly + * Homebrew plt-like mechanism for ensuring that valid internal + addresses exist to which undefined symbols in compiled lisp objects + referring to external shared libraries can be relocated + * Make configure demand gettext when choosing --enable-locbfd + * Make sure references to ldb1, a stub conventionally optimized away, + can be resonled when optimization is turned off + * completion_matches -> rl_completion_matches in gcl_readline.d, + which is what is exported in the headers + + -- Camm Maguire Fri, 27 Feb 2004 23:50:49 +0000 + +gcl (2.6.1-26) unstable; urgency=low + + * Rework compiler::*ld-libs*, compiler::link, and unixport/makefile to + accomodate mingw need for firstfile.o and lastfile.o + * Remove incompatible -fomit-frame-pointer when compiling with -pg + profiling + * Load sys-proclaim.lisp files forimproved linking and smaller object + size across the board, install same for use with compiler::link + * Use pathnames instead of strings in compiler::link, also in image + init files, for Windows + * small mod to unixport/makefile re filtering of firstfile and + lastfile + * Backport zero divisor error cnditions from HEAD for + floor,ceiling,truncate + * Default to debug mode on hppa to work around gcc compiler + optimization bugs + * Add missing m4 and automake files in binutils directory to enable + automake and autoconf here + * Add mach-o specific files from cvs head to local bfd tree + * Add bfd/po makefiles + * Macosx defaults in configure.in + * bfd make and configure file changes to handle mach-o backend + * *gcl-version* -> *gcl-minor-version*,*gcl-extra-version* + * Support for more informative banner reading features list + * Support for both sigbus and sigsegv in sgbc.c as is customary in .h + files + * mach-o compatible changes in sfaslbfd.c + * Support for new debugging section names in sfaslelf.c + * powerpc-macosx h and defs files from cvs head + + -- Camm Maguire Wed, 25 Feb 2004 23:08:59 +0000 + +gcl (2.6.1-25) unstable; urgency=low + + * rl_putc_em a carriage return after invoking readline to ensure the + prompt in rl_putc_em_line is cleared. + * use standard sgc fault recovery element for hppa as recommended by + hppa kernel experts + * Store banner in si::*system-banner* for possible modification + in compatibly licensed programs + * exit with -1 when standard in ends in lisp debug mode + * Backport macosx files from cvs HEAD + * Document system return codes + + -- Camm Maguire Fri, 13 Feb 2004 20:44:54 +0000 + +gcl (2.6.1-24) unstable; urgency=low + + * Revert unixport/makefile link order fix for windows, breaks + compiler::link, find another way + * runtime SGC fault recovery test + * Protect read/fread in case SGC is enabled with safe (restartable) + versions + * SGC on for arm and hppa + * remove fast-link workaround now fixed for windows + * Backport HEAD makefile changes to clean .{c,h,data} files and + new_decl.h, remove said from repository (generated files) + + -- Camm Maguire Thu, 12 Feb 2004 05:56:29 +0000 + +gcl (2.6.1-23) unstable; urgency=low + + * Remove calls to init-readline with new automatic readline setup + + -- Camm Maguire Tue, 27 Jan 2004 20:27:20 +0000 + +gcl (2.6.1-22) unstable; urgency=low + + * Build depend on emacs21 | emacsen + + -- Camm Maguire Fri, 23 Jan 2004 22:01:15 +0000 + +gcl (2.6.1-21) unstable; urgency=low + + * Automatic readline initialization + * Add watch file + * Prevent circular error loops + * Prevent automatic optimization added to CFLAGS by autoconf + * Rework documentation installation in and outside of Debian + * Support user deined predicates at an elementary level in the form + '(satisfies foop) in gcl_predlib.lsp + * Install binary gcd algorithm for ~10% performance increase + * Rescale some default allocation parameters -- bignum allocation by + relblocks by default, default growth parameters are 1 (min), + 0.1*MAXPAGE (max), 0.5 (increase), 0.3 (percent free), holepage is + 4*MAXPAGE/1024, INIT_HOLEPAGE, INIT_NRBPAGE and RB_GETA scale + accordingly + * Clean windows/sysdir.bat + * Check for zero args in new gcd code + * Default hole is maxpages/10, holesize configure option added + * Fix syntax errors in older reloaction code: sfaslelf.c + + -- Camm Maguire Fri, 16 Jan 2004 16:57:50 +0000 + +gcl (2.6.1-20) unstable; urgency=low + + * Fix gcl-doc doc-base files + + -- Camm Maguire Tue, 30 Dec 2003 22:30:39 +0000 + +gcl (2.6.1-19) unstable; urgency=low + + * Fix bug in compiler::c2labels in which *ccb-vs* was missing a ocal + rebind + * Remove duplicate tags from compiled C switch statements + * Minor merges for DARWIN support + * Path to configure to make --enable-emacsdir work + * Check for readline/readline.h header before configuring for readline + * Improve system bfd library location detection + * Make sure external gmp lib is compatible via __GNU_MP_VERSION, else + backoff to local gmp build; prepend externally defined CFLAGS into + output CFLAGS, FINAL_CFLAGS, and NIFLAGS + * Remove --enable-gmp configure option; gmp is required for GCL + * Use --enable-emacsdir in debian/rules, make sure --enable-emacsdir + and --enable-infodir work when arg contains ${prefix} + * Fix typo in chap-6.texi + * Make sure to export SGC define from config.h to cmpinclude.h -- Now + that we used optimized structures in the compiler, we need at least + the definition of SGC_TOUCH there to prevent GBC errors. FIXME -- + handle header dependencies more robustly. Thanks to Robert Boyer + for the report + * Improve SGC define extraction for cmpinclude.h + * Fix variable reference errors which were occurring for compiled + local functions defined within closure-generating or other + environment stack pushing functions when safety is set to 3 (thanks + Paul Dietz for the report.). When constructing local functions and + closures within a 'mother' function, *ccb-vs* will hold the number + of closure environments stacked at the point of each closure + creation or call to a local function. This value is stored as the + cadr of a list pushed onto *local-funs*, and is read when writing + out the C code for the local function or closure, where it is used + to initialize *ccb-vs* and *initial-ccb-vs* for subsequent + processing. The latter is used as the reference point when + addressing variables in wt-ccb-vs, as the former could be still + further incremented within the closure or local function itself. + Local functions as opposed to closures do not increment *ccb-vs* and + do not push the environment. When a local function is defined + within a closure-generating flet/labels, or a tagbody or block which + pushes the environment, the value of *ccb-vs* written to the list + corresponding to the local function can be erroneously incremented + beyond the *initial-ccb-vs* value established before any environment + pushing operations were processed. It is this latter value which is + appropriate for use in wt-ccb-vs, as the local functions, unlike the + closures, receive an environment level with the mother generating + function. We therefore push *initial-ccb-vs* onto the end the list + pushed onto *local-funs* only when defining a local function, and use + it to initialize an added optional variable initialize-ccb-vs in + t3local-fun and t3local-dcfun, which default to the original ccb-vs. + We then bind *initial-ccb-vs* to this new optional parameter instead + of the former *ccb-vs, which was only appropriate for closures. + * Put in rudimentary logic for the selection of stack vs. heap storage + for bignums depending on the frame context. FIXME, this logic is + too conservative at present. SETQ_II and SETQ_IO take an additional + parameter which is malloc when *unwind-exit* is bound and contains + 'frame and alloca otherwise. New macro bignum-expansion-storage. + FIXME, ensure that IDECL does not need similar modification. + * Cleanup a few compiler warnings in the compiler + * Cleanup compiler warning in alloc.c + * Eliminate unneeded transformatio of contniguous pages to other pages + on save-system. + * malloc -> gcl_gmp_alloc in recent setjmp frame protected bignum + allocation + * Add -Wa,--execstack if on an exec-shield enabled system, can be + explicitly added otherwise by setting the CFLAGS variable before the + configure step + * Better execstack flag handling in configure + * Allow for commas in CFLAGS in sed command writing *cc* + * Preliminary gprof profiling support + * Rework html documentation generation and installation, Closes: + #221774 + * Remove parentheses from setf class-name info node in chap-7.texi + + -- Camm Maguire Tue, 30 Dec 2003 16:26:45 +0000 + +gcl (2.6.1-18) unstable; urgency=low + + * Portability patches to makefiles to support non-GNU grep (no -q), + and non-bash sh, C_INCLUDE_PATH=...;export C_INCLUDE_PATH + * copy the global *info* parameter in c1flet and c1labels to prevent + accumulation of old data -- FIXME -- make sure there are no other + copies required, and eventually replace this global parameter with + local variables + * Turn on some optimization on hppa, -O only + * Make all C defined functions installed into lisp static functions to + work around dynamic function descriptors on ia64, Closes: #217484, + Closes: #204789, (STATIC_FUNCTION_POINTERS define in config.h) + + -- Camm Maguire Thu, 6 Nov 2003 15:40:25 +0000 + +gcl (2.6.1-17) unstable; urgency=low + + * Repair weak symbol addition to the bfd symbol table in sfasli.c + * Be more thorough about adding fun-info to call-local info in + gcl_cmpflet.lsp, accompanying simplifications in gcl_cmpeval.lsp + (call-global lists have info updated by args already in (c1args args + info)), small changes in add-info in gcl_cmpinline.lsp, FIXME -- + study rational for *info* special variable in certain places as + opposed to more common copy-info + + -- Camm Maguire Thu, 30 Oct 2003 20:03:22 -0500 + +gcl (2.6.1-16) unstable; urgency=low + + * Fix sh syntax in debian/gcl.sh + * init_or_load1 -> gcl_init_or_load1 in xgcl-2/sysinit.lsp + * Load weak symbols as well as undefined symbols in + bfd_build_symbol_table, for the purposes of the static build + possibility + * Map t and nil stream indicators properly in optimized compiled + references to read_char1 and read_byte1 (in read.d) + + -- Camm Maguire Thu, 23 Oct 2003 16:43:15 +0000 + +gcl (2.6.1-15) unstable; urgency=low + + * Remove imod/ifloor functions in cmpaux.c and directly inline their + fixed equivalents in gcl_cmpopt.lsp + + -- Camm Maguire Mon, 13 Oct 2003 15:04:24 +0000 + +gcl (2.6.1-14) unstable; urgency=low + + * generate less garbage in add-info (gcl_cmpinline.lsp), enabling + maxima compile to complete in a finite time :-) + + -- Camm Maguire Fri, 10 Oct 2003 22:14:04 +0000 + +gcl (2.6.1-13) unstable; urgency=low + + * Fix compiler optimization bug in gcl_cmpopt.lsp -- missing parens + around inliner for max and min + * collect info structures for local functions in flet and labels + processing (gcl_cmpflet.lsp), and pass upwards to call-local and + call-global (gcl_cmpeval.lsp) to fix certain inlining bugs in via + more proper operation of args-info-changed-vars (gcl_cmpinline.lsp, + inline-args, gcl_cmplet.lsp, c2let) + * Fix an obviou int overflow in ifloor (o/cmpaux.c), handle more + proper fixnum/integer determination from declarations later + + -- Camm Maguire Fri, 10 Oct 2003 02:34:11 +0000 + +gcl (2.6.1-12) unstable; urgency=low + + * Restore mpz_to_mpz{1} in gmp_big.c, can be written by compiler + * tk8.4 patches + * Prevent destructive modification of bignum arguments in log_op/mp_op + in gmp_big.c + * Make sure to push stack variables onto newly allocated C variable + when inlining args and args cause side effects, in inline-args, + gcl_cmpinline.lsp + * Fix bug related to gcc-3.3 fixes in set_exponent in num_co.c + * Remove pcl_methods.c patch. as is apparently no longer needed, TODO + -- make sure VOL modifier is inserted where needed to prevent + longjmp clobbers + + -- Camm Maguire Thu, 2 Oct 2003 14:26:43 +0000 + +gcl (2.6.1-11) unstable; urgency=low + + * Add compilation step of compiling all lsp and cmpnew .lsp files from + an interpreted only saved_pre_gcl before the creation of saved_gcl - + - this enables us to use full optimization on these files while + getting the STREF constants right on 32bit and 64bit + * remove 'attic' from comment in gcl_loop.lsp + * configure changes for sizeof(struct contblock) detection + + -- Camm Maguire Wed, 24 Sep 2003 16:09:44 +0000 + +gcl (2.6.1-10) unstable; urgency=low + + * Mac OSX GET_FULL_PATH_SELF + * Preliminary subtypep checking for 'satisfies + * preliminary 'satisfies support in subtypep, more predicate type + pairs and reverse checking + * small compiler change to remove unused C variables from optimized + compiled macros + * Optional compiler init file is called gcl_cmpinit + * fasdmacros.lsp -> gcl_fasdmacros.lsp + * All cmpinit.lsp files named gcl_cmpinit.lsp; allow full lisp + optimization in all directories + * collectfn -> gcl_collectfn in lsp/gcl_auto.lsp + * collectfn -> gcl_collectfn in cmpnew/gcl_make-fn.lsp + * Make sure makefiles can generate sys-proclaim.lsp, regenerate these + files and recompile from lsp + * Rebuild with opts enabled + * Iterate sys-proclaim/rebuild generation once more + * Iterate sys-proclaim/rebuild for pcl and clcs + + -- Camm Maguire Tue, 23 Sep 2003 19:33:27 +0000 + +gcl (2.6.1-9) unstable; urgency=low + + * Close streams in fasldlsym.c + + -- Camm Maguire Tue, 16 Sep 2003 14:57:20 +0000 + +gcl (2.6.1-8) unstable; urgency=low + + * Add processor flag variable to flags in configure.in + * Autoadd full path to kcl_self to enable save-system when user moves + executable and calls without script wrapper + * Add special variables si::*collect-binary-modules* and si::*binary- + modules* as a facility for discovering the list of fasloaded objects + preceding a save-system is required for a subsequent compiler::link + * Add collectfn.lsp to distro + * Rename some files and init_ functions to eliminate namespace + conflicts when building images with compiler::link + * Enable compressed info reading + * Make sure no opt flags are set when enable debug is specified + * Use NIFlAGS to compile new_init with lower opts on ppc to work + around gcc bug, restore full opts to other files + + -- Camm Maguire Sun, 14 Sep 2003 02:18:28 +0000 + +gcl (2.6.1-7) unstable; urgency=low + + * Fix permissions bug in temporary gzipped file handling + * Propagate control changes correctly with package extension + * Newer standards + + -- Camm Maguire Tue, 9 Sep 2003 17:06:56 +0000 + +gcl (2.6.1-6) unstable; urgency=low + + * Remove build-dependency on autoconf as a temporary work around to + Debian autoconf's dependency bug on emacsen-common + + -- Camm Maguire Tue, 9 Sep 2003 15:29:06 +0000 + +gcl (2.6.1-5) unstable; urgency=low + + * Redefine temporary files in elisp/makefile + + -- Camm Maguire Mon, 8 Sep 2003 21:49:09 +0000 + +gcl (2.6.1-4) unstable; urgency=low + + * Fix to sfasli.c to avoid defining symbols in other than *UND* + sections + * Remove some 64 bit warnings + * Turn off def_static on ia64 for now -- its broken + + -- Camm Maguire Sat, 6 Sep 2003 17:22:10 +0000 + +gcl (2.6.1-3) unstable; urgency=low + + * Fix static detection fr ia64; contblock size detection on arm + * Fix gcc verion checking in gmp3 subconfigure, esp. for arm + * Escape all sgc code with #ifdef SGC + + -- Camm Maguire Fri, 5 Sep 2003 21:32:47 +0000 + +gcl (2.6.1-2) unstable; urgency=low + + * Add windows/install.lsp to clean target + * Add in macosx files to stable and cvs head + * Fix bad debelper postinst, Closes: #208765 + + -- Camm Maguire Fri, 5 Sep 2003 13:15:11 +0000 + +gcl (2.6.1-1) unstable; urgency=low + + * New upstream release + * Type-punning warning fixes + * small_fixnum overflow fixes + * off by one fix in cerror + * Fix compiler error which had not recognized defpackage as a package + operation + * Fix tkl.lisp call to open-named-socket + * Make values-list and nreconc signal errors when they should on + dotted lists. + * Avoid use of windows.h types as macros. + * New config.{sub,guess} + * Windows installer updates from CVS HEAD + * fix potential longjmp clobber in read.d;add some windows files to + main makefile clean target; + * Darwin revealed fixes to usig.c and unixtime.c + * Fix gbc time calculation in case of recursive gbc calls + * Run patch_sharp in LSharp_exclamation_reader to handle new case of + defpackage ops at head of fasl vector, required for maxima build + * Special symbol Dotnil has ordinary list Cnil for plist and hpack + * Small fixes for profiling support + * Restore pp() function for debugging; print out undefined symbol + names + * Small patch for fix xgcl demo (thanks Michael Koehne) + * Better bfd symbol table strategy + * Fix bfd table symbol counting for combined_table profiling + * amd64 linux support + * O6 -> O3 + * static linking on ia64 to work around current mechanism for runtime + generated function descriptors + * enable-static configure option + * Fix debian/gcl-doc.docs for latest texinfo file splitting policy, + Closes: #206017 + * Fix typo in o/sfasli.c + * Rework debian package structure to handle stable and cvs packages + simultaneously + * Add gazonk*.lsp to clean target + * syntax fix to lsp/gprof.hc + * Add support for SGC contblock pages + * Fixes to debian/rules + * Remove unused definitions of Vcs + * Increase default maxpages and stack sizes + * Maintain a persisten *system-directory* binding + * Push installed /h directory onto -I flags on cc command line + * Escape old in-package behavior with #ifdef ANSI_COMMON_LISP + * define HAVE_XDR in linux.h + * reduce resolution of contblock mark_table in gbc.c to match new + minimum granularity introduced via CPTR_ALIGN + * Remove exit function in main.c + + -- Camm Maguire Thu, 4 Sep 2003 02:20:52 +0000 + +gcl (2.5.3-2) unstable; urgency=low + + * gcc-3.3 all platforms + + -- Camm Maguire Mon, 7 Jul 2003 16:10:25 +0000 + +gcl (2.5.3-1) unstable; urgency=low + + * New upstream release + * Restore object_to_float and object_to_double, cmpaux.c, Closes: #195470. + * Remove obsolete functiion multiply-bignum-stack from documentation, + si-defs.texi + * Unstatic object_to_float, object_to_double + + -- Camm Maguire Mon, 2 Jun 2003 12:38:03 -0400 + +gcl (2.5.2-1) unstable; urgency=low + + * New upstream release + * Cleanup xdrfuns.c for Axiom + * Reenable xgcl build + + -- Camm Maguire Thu, 20 Mar 2003 09:15:54 -0500 + +gcl (2.5.1-1) unstable; urgency=high + + * some optimization now on hppa + * Add RELEASE-2.5.1 file + * Add dedication notice to the memory of W. Schelter + + -- Camm Maguire Sun, 2 Mar 2003 10:20:26 -0500 + +gcl (2.5.0.cvs20020625-80) unstable; urgency=low + + * enable japi configure flag, defaults to no + * enable -mlongcall on ppc when using gcc 3.3 or higher + * int -> fixnum in DEFUN function arguments for safety -- ensures + pointers and integers passed by lisp are of same size + * MYmake_fixnum macro simplification + * ufixnum typedef + * Prototypes for cmod et.al. -- restoring maxima build on ia64 + * Fix unaligned access message on ia64 generated by DFLT_aet_fix + * Integer va_arg uses fixnum + * Define __*i3 symbols used by GCL, supplied by libc, and written into + some GCL compiled objects, restores ARM build with ANSI image + * num_log.c miscompilation on ia64 apparently fixed, Closes: #156291 + * Ensure cmpinclude.h up to date in main makefile + + -- Camm Maguire Sat, 1 Mar 2003 17:33:29 -0500 + +gcl (2.5.0.cvs20020625-79) unstable; urgency=low + + * Fix Debian package install bug + + -- Camm Maguire Thu, 27 Feb 2003 23:17:55 -0500 + +gcl (2.5.0.cvs20020625-78) unstable; urgency=low + + * Add config.log config.status and config.cache to clean target + * Remove xgcl-2/debian directory + * Update clcs/sys-proclaim.lisp + + -- Camm Maguire Thu, 27 Feb 2003 18:48:38 -0500 + +gcl (2.5.0.cvs20020625-77) unstable; urgency=low + + * Lintian cleanups + * Don't strip libansi_gcl.a, need .data at end of .o, as with libgcl.a + * Take newlines out of doc string for init-cmp-anon + * Cleanup gcc-3.2 compiler warning + * 64 bit STREF fixes + * pcl and clcs need to have C rebuilt afresh, as 64 bit machines write + different STREF offsets into the C files + * Rework Debian package build a bit + * README.Debian explaining the toggling of the ANSI image + * Typo in debian/rules + * Remove debian/gcl.conffiles + + -- Camm Maguire Thu, 27 Feb 2003 15:56:11 -0500 + +gcl (2.5.0.cvs20020625-76) unstable; urgency=low + + * Debian Priority is optional + * Configure lowest common denominator on m68k to m68020 -- gcc-3.2 + can't handle m68000 -- no __mulsi3 + * Fix bit array bug + * Add upgraded-array-element-type + * Misc typep and subtypep fixes + * Proper error handling in certain array.c functions + * First needs exactly one arg + * Proper error handlin in LAST + * bit array allocation fixes in num_log.c + * eliminate Iapply_fun_n1 + * Dummy system find-class in traditional image, overwritten by pcl + version in ANSI + * Invalid variable is a program error, not a symbol is a type error + * Attempt at uninterned symbol support as slot names + * defstruct changes for ANSI conc-name handling + * Rework ansi build to follow existing pattern for traditional image, + enabling preliminary ansi support on dlopen systems + * Fix broken mingw probe in main makefile + * Rename pcl and clcs files to avoid init name conflict on dlopen + systems + * sys-proclaim for clcs + * Compiler goto indentation + * Compiler pointer cast in call_or_link_closure + * *keep-gaz* compiler variable to save anonymously generated lisp + * si::init-cmp-anon function to initialize anonymously generated and + compiled lisp from .text section of running executable + * Debian/rules builds and ships both images + * Check for small fixnum in make_fixnum macro + * Pass real integers to array functions to minimize fixnum garbage + * Larger SHARP_EQ_CONTEXT_SIZE in read.d + * Shadowing-import instead of import dummy symbols into common-lisp in + ansi_cl.lisp + * Rework object definition in makefiles + * Remove old gmp directory + * Remove old tests directory + * Reinsert JAPI configuration + * Spruce up clean target + * Use saved_gcl to recompile cmpnew files + * Toggle ansi image with GCL_ANSI environment variable + * Version 2.5.1 + + -- Camm Maguire Wed, 26 Feb 2003 21:31:04 -0500 + +gcl (2.5.0.cvs20020625-75) unstable; urgency=low + + * Export truename for dlopen systems + + -- Camm Maguire Fri, 14 Feb 2003 23:31:15 -0500 + +gcl (2.5.0.cvs20020625-74) unstable; urgency=low + + * Remove duplicates in apropos a la clisp + * Use static where possible, remove unused functions, decrease global + symbol count by about 1/3 (~ 600 global functions) + * Inline optimize cmod,cplus,ctimes and cdifference like maxima + * eliminate make-pure-array from lfun_list.lsp, not defined + * Prototypes for all possible compiler generated function calls + * relative symlink for cmpinclude.h in Debian package + + -- Camm Maguire Fri, 14 Feb 2003 20:17:31 -0500 + +gcl (2.5.0.cvs20020625-73) unstable; urgency=low + + * typep fixes for class types + * m68k Build-depend on gcc-2.95 as a temporary work around to bug + 179807 + * gcc-3.2 warning cleanups + * bfd_boolean syntax support for newer binutils + * gcc-3.2 on powerpc can't yet handle -O2 and higher + * Reenable gcc-3.2 for m68k and do some guesswork in configure + + -- Camm Maguire Mon, 10 Feb 2003 13:47:00 -0500 + +gcl (2.5.0.cvs20020625-72) unstable; urgency=high + + * Fix to siLbit_array_op for 0 dimension arrays + * Fixed aref of short-float vector + * nconc can take dotted lists + * tailp returns t if first arg is nil + * Repair nconc and tailp fixes + * varargs->stdarg for gcc 3.3 and higher + + -- Camm Maguire Sun, 9 Feb 2003 16:57:33 -0500 + +gcl (2.5.0.cvs20020625-71) unstable; urgency=high + + * ansi changes to sloop.lsp and conditions.lisp to fix symbol tests + * :definition-before-pcl -> definition-before-pcl + * Allow spaces in pathnames + * Significant fixes to gmp_num_log.c affecting bitwise ops on bignums + * Fix test segfault arising from faulty structure-type-included-type- + name in gcl-low.lisp ; Thanks Peter + * aref1 -> row-major-aref + * Fixes to certain numerical functions to handle denormalized floating + point numbers + * Number of argument check in IapplyVector + * Print offset bit vectors correctly + * Correct precision for formatting short and long doubles + * Added si::modf + * Do not trigger error in IapplyVector if max args is zero + * Fixes to with-package-iterator to cleanup compiler warnings + * :invalid-variable is a type error + * No max arg checking if &key or &rest present + * proper defun declarations in listlib.lsp + * class specifiers in typep, subtypep and coerce + * Corrections to allow-other-key processing in bind.c + * eval sfuns with argument error checking (in one place) + * copy-structure takes only one arg + * si::classp, si::class-of, and si::class-precedence-list overwritten + by pcl analogs when compiling ansi + * recompiled core lsp and compiler files + * restore dvi and html doc build for non-mingw + + -- Camm Maguire Fri, 24 Jan 2003 13:55:11 -0500 + +gcl (2.5.0.cvs20020625-70) unstable; urgency=high + + * loop fixes + * configure fixes + * :common-lisp in *features* + * :definition-before-clcs -> definition-before-clcs + * protect against sgc segfault within fread in fasdump.c -- fixes m68k + acl2 build + * SGC for s390 + + -- Camm Maguire Thu, 5 Dec 2002 08:02:17 -0500 + +gcl (2.5.0.cvs20020625-69) unstable; urgency=high + + * eval fix + * \-mlong-calls for arm + + -- Camm Maguire Mon, 25 Nov 2002 08:35:27 -0500 + +gcl (2.5.0.cvs20020625-68) unstable; urgency=high + + * enable emacsdir configure option + * reordered configure X lib detection for solaris + * redo integer declarations for gmp bignums to avoid compiler warnings + * Clear large and negative count errors for remove/delete + * Loop error fixes + * cache flush with page granularity on m68k + + -- Camm Maguire Thu, 21 Nov 2002 17:44:30 -0500 + +gcl (2.5.0.cvs20020625-67) unstable; urgency=high + + * Align cache flushes for powerpc and m68k on 32 byte boundaries, + should fix acl2 build + * Removed diagnostic SIGILL trapping in cmpaux.c + + -- Camm Maguire Tue, 12 Nov 2002 23:25:49 -0500 + +gcl (2.5.0.cvs20020625-66) unstable; urgency=high + + * Fix SIGILL trap in cmpaux.c + + -- Camm Maguire Mon, 11 Nov 2002 11:14:07 -0500 + +gcl (2.5.0.cvs20020625-65) unstable; urgency=high + + * Miscellaneous Freebsd patches + * non-recursive with-package-iterator + * map-into fill-pointer fixes + * changes to the user-init mechanism for portable acl2 build + + -- Camm Maguire Sun, 10 Nov 2002 12:33:59 -0500 + +gcl (2.5.0.cvs20020625-64) unstable; urgency=low + + * Fix epsilon calculations again to reenable arm build + + -- Camm Maguire Fri, 1 Nov 2002 07:08:33 -0500 + +gcl (2.5.0.cvs20020625-63) unstable; urgency=low + + * Add versioned dependency on the gcc used to build gcl + + -- Camm Maguire Tue, 29 Oct 2002 16:20:22 -0500 + +gcl (2.5.0.cvs20020625-62) unstable; urgency=low + + * with-package-iterator modifications + * with-package-iterator uses labels to correctly provide for recursion + * Fix doc directory problem with install target in info/makefile + * Fix info dir setting in configure + * Priority extra + + -- Camm Maguire Mon, 28 Oct 2002 23:45:07 -0500 + +gcl (2.5.0.cvs20020625-61) unstable; urgency=low + + * Placeholder support for optional condition in find-restart + * defpackage error on importing non-existent symbols + * working with-package-iterator macro + * various package errors reported as :package-error + * Destructuring-bind fixes + * delete-package error fix + * pcl functions use pcl-destructuring-bind for now -- fix later + * Trigger error if function calls use too many 'values' + * Maximum values increased to 50 + * Enable previously failing tests in multiple-value-{setq,prog1}.lsp + * prototype for system_time_zone_helper + * Initial changes for solaris support + * make -> $(MAKE) in makefiles + * Incorporated main GCL (ANSI) Lisp Documentation in distribution + + -- Camm Maguire Mon, 28 Oct 2002 04:31:33 -0500 + +gcl (2.5.0.cvs20020625-60) unstable; urgency=low + + * Still better acosh, courtesy of Barton Willis + * Better epsilon contant determination in ieee case + * Implicit tagbody in do-symbols and do-all-symbols + * Better epsilon handling in ieee case + * Add setf (values ... support + * invalid-function errors are type errors + * ecase and ccase take t and otherwise clauses + * ECASE/CCASE test fixes + * setf values fixes to use setf instead of setq when target value is + not a symbol + * ETYPECASE/CTYPECASE can take t and otherwise + * Backout of restart-clusters export + * fix handler.lisp + * Fix to bfd/GBC interaction + + -- Camm Maguire Wed, 23 Oct 2002 08:38:08 -0400 + +gcl (2.5.0.cvs20020625-59) unstable; urgency=low + + * wrong number of arguments, keyword errors in lambda list bindings, + are program errors + * acosh fix at -1.0 + * New config.sub and config.guess files and automatic updates in + binutils, gmp, and gmp3 subdirs + + -- Camm Maguire Wed, 16 Oct 2002 11:38:56 -0400 + +gcl (2.5.0.cvs20020625-58) unstable; urgency=low + + * GENSYM fixes + * add complement and constantly + * import certain symbols into common-lisp package + * Fix makefile bug in install target + * Prepend instead of overwrite C_INCLUDE_PATH in shell wrapper + * More shell variable fixes in main makefile + * Corrected order of push and pushnew + * Set bfd_error appropriately + * Report function for package-error in condition-definitions.lisp;fix + internal-package-error deinition and handling;export *restart- + clusters* to user error code specified in handler-case;package-error + error formatting changes;dummy optional argument added to compute- + restarts (for now);Paul Dietz patch to defpackage.lsp fixing several + tests (thanks);export/unexport error handling fixes + * Recompile c,h and data files + * Fix number of argument errors in debug.lsp;documentation support for + packages in defpackage.lsp and module.lsp;do-symbols loops over + inherited symbols too in packlib.lsp + * Reworked EXTRAS variable handling in unixport/makefile + * Build-depend on autotools-dev and automatic update of config.sub and + config.guess;newer config.sub and config.guess in cvs tree; Closes: + #164526 + * Remove stray comments in package.d + * elt errors of type type error + * bad-sequence limit returns type error + + -- Camm Maguire Tue, 15 Oct 2002 15:39:19 -0400 + +gcl (2.5.0.cvs20020625-57) unstable; urgency=low + + * Capitalization changes to names of special characters;graphic-char-p + fix + * fix shadowing of existing symbols in package.d + * (simple-)base-string not a subtype of (simple-)vector + * add package-error condition(preliminary);hash conditions only by the + error name, not the format string;pass error types for both + correctable and non-correctable situations;eliminate duplicate + loading of clcs/package.lisp;Allow t doc-types in documentation + (returning nil) for now;fix final type errors in predlib.lsp + (regarding base-string);other error functions to pass continuable + errors (needs cleaning up);package designators can be + characters;delete-package added;make-package doesn't :use lisp by + default;in-package returns error if package does not exist instead + of making the package(relatively big change -- need to address + instances of in-package in .lsp code);call make-package on relevant + packages in init_gcl.lsp.in and pcl/sys-package.lisp; + * \-ffunction-sections for hppa with no-optimization -- enables first + maxima build here + * separate lisp variables to specify optimization flags for level 2 + and 3 + * symbol-name throws a type error on bad input + * tk8.2 -> tk8.3 + * Fix bug in main makefile + * Newlines at end of test files + + -- Camm Maguire Wed, 9 Oct 2002 15:04:41 -0400 + +gcl (2.5.0.cvs20020625-56) unstable; urgency=high + + * ansi-test corrections; extra-libs option to LINK function; LINK doc + change; subtypep and string changes to pass more tests + * Add method-combination and structure-object symbols for ansi;remove + unused variables in debug.lsp;remove in-package system from + defstruct.lsp;make-keyword and defmacro temporary function + placeholders in destructuring_bind.lsp;predlib changes to fix ansi- + test type errors;break-call takes 2 args (sys-proclaim.lisp);char + and char-set protected by string dimension not fillpointer in + string.d;fix bug in string.d:member_char for vector types;redefine + slot reader and writer functions in pcl/impl/gcl/gcl-low.lisp + + -- Camm Maguire Sat, 5 Oct 2002 14:33:46 -0400 + +gcl (2.5.0.cvs20020625-55) unstable; urgency=high + + * Add LINK documentation to info pages + * 0 length last support + * make-sequence error check for 'null type and non-zero size + * Dotted-list support in member + * Reworked dotnil definitions and support macros + * add compile-file-pathname + * setup C_INCLUDE_PATH env variable in gcl shell wrapper + * POSITIVE-FIXNUM variable type,simple-error->type error where + indicated by various ansi tests, eq->eql in ldiff and tailp;proper + lists only in member et. al. + * rev keyword for member1 to reverse test arguments + * specific-error function to pass a given type of error from lisp + * set-exclusive-or preserves order of test arguments + * type-errors where appropriate in make-sequence + * nil keys accepted in remove/delete et.al. + * Reworked linking command line to ensure that certain symbols are + resolved in libgcl.a as opposed to certain system libraries, e.g. + gmp + * new gmp for m68k;no -ffloat-store for m68k a requested by user due + to performance impact (will alter test results in maxima + accordingly) + * libgclp.a for objects to be overriden by the C library if necessary + * readably support + * boolean type + * Missing ansi type support + * subtype code for boolean + * add missing ansi types as known types + * other preliminary subtype code for missing ansi types + * rework result-type check in make-sequence + * :element-type support in make-string (preliminary) + * (char ignores fill-pointer + * remove -O4 from debian/rules + + -- Camm Maguire Thu, 3 Oct 2002 01:52:45 -0400 + +gcl (2.5.0.cvs20020625-54) unstable; urgency=high + + * Fix delete et. al. :from-end error; typo in gbc.c + * character and string-char equal in type hierarchy + * concatenate/make-sequence fixes + * merge takes nil key argument + * make-sequence checks size against result type + * install endp macro for dotted list support + + -- Camm Maguire Tue, 24 Sep 2002 14:57:44 -0400 + +gcl (2.5.0.cvs20020625-53) unstable; urgency=high + + * Sleep with (in principle) microsecond precision + * nth-value macro added + * \-ffloat\-store and warning cleanups for m68k + * Compile hppa with debugging, will get a build but a broken one, ok + for now, Closes: #159591 + + -- Camm Maguire Fri, 20 Sep 2002 09:48:35 -0400 + +gcl (2.5.0.cvs20020625-52) unstable; urgency=high + + * Fixed gcc version bug in debian/rules + + -- Camm Maguire Thu, 12 Sep 2002 18:00:50 -0400 + +gcl (2.5.0.cvs20020625-51) unstable; urgency=high + + * static gmp for m68k + + -- Camm Maguire Thu, 12 Sep 2002 09:33:03 -0400 + +gcl (2.5.0.cvs20020625-50) unstable; urgency=high + + * Reworked static gmp target for new libgcl.a;gcc-3.2 for + hppa,ia64,and arm;libgmp2-dev for m68k;no rsym with + dynsysbfd;build_symbol_table earlier to shrink table size; + + -- Camm Maguire Thu, 12 Sep 2002 00:39:17 -0400 + +gcl (2.5.0.cvs20020625-49) unstable; urgency=high + + * Use old gmp for m68k until can pin down test failure with gmp3 + + -- Camm Maguire Tue, 10 Sep 2002 00:36:10 -0400 + +gcl (2.5.0.cvs20020625-48) unstable; urgency=high + + * Rework build and install so that custom images can be made without + the source tree, even when using dlopen + + -- Camm Maguire Mon, 9 Sep 2002 23:26:47 -0400 + +gcl (2.5.0.cvs20020625-47) unstable; urgency=high + + * Install cmpinclude.h in system include directory + + -- Camm Maguire Thu, 29 Aug 2002 23:31:55 -0400 + +gcl (2.5.0.cvs20020625-46) unstable; urgency=high + + * Keep a *much* smaller piece of gmp.h in cmpinclude.h, reducing image + size by almost 100k + * Check for _SHORT_LIMB and _LONG_LONG_LIMB in configure + * Remove build specific include directories from compile command in + final executable + * Include local regexp.h explicitly in cmpinclude.h, to eliminate + intereference with system regexp.h, and to fix bug in which gcl + compilation depended on existing build directories + * Correctly add directory paths to extra gmp file targets in + unixport/makefile for m68k + + -- Camm Maguire Thu, 29 Aug 2002 21:56:28 -0400 + +gcl (2.5.0.cvs20020625-45) unstable; urgency=high + + * Fix typo in rshift target for m68k + + -- Camm Maguire Wed, 28 Aug 2002 18:02:00 -0400 + +gcl (2.5.0.cvs20020625-44) unstable; urgency=high + + * Handle second argument to last; treat dotted lists correctly in + ldiff et. al., tailp fix + * optional key argument for assoc-if et.al.;eval getf deflt if in setf + * Fix infinite loop in assoc-if et.al. + * X_LIBS and X_CFLAGS determination in configure script + + -- Camm Maguire Wed, 21 Aug 2002 18:22:37 -0400 + +gcl (2.5.0.cvs20020625-43) unstable; urgency=high + + * Larger ihs stack;fix array-total-size-limit;check negative + fillp;allow #P + * don't make common_lisp package when not configuring with --enable- + ansi + * Patch gmp3/mpn/m68k/{l,r}shift.asm, restore gmp3 to m68k build + * Dynamic libgmp support, overriding with patched functions from local + source where necessary + + -- Camm Maguire Sun, 18 Aug 2002 12:10:55 -0400 + +gcl (2.5.0.cvs20020625-42) unstable; urgency=high + + * copy ansidecl.h and symcat.h in h/ for local bfd builds + * localize bfd.h includes to sfaslbfd.c + * take bfd/po out of the build loop + * import xgcl-2, but don't build by default + * oldgmp configure option, and made default for m68k as temporary + workaround + + -- Camm Maguire Mon, 12 Aug 2002 23:49:09 -0400 + +gcl (2.5.0.cvs20020625-41) unstable; urgency=high + + * Minor rules revision for i164 + + -- Camm Maguire Sun, 11 Aug 2002 13:49:03 -0400 + +gcl (2.5.0.cvs20020625-40) unstable; urgency=high + + * revamp CONST configure test for certain bfd versions + + -- Camm Maguire Sun, 11 Aug 2002 12:31:35 -0400 + +gcl (2.5.0.cvs20020625-39) unstable; urgency=high + + * gcc-3.1 for ia64 fixes a compilation bug in num_co.c for -O3 and + higher -- code takes address of a variable kept in a register + * compile num_log.c with -O only on ia64 to work around compiler bug + + -- Camm Maguire Sun, 11 Aug 2002 08:53:03 -0400 + +gcl (2.5.0.cvs20020625-38) unstable; urgency=high + + * check for long c statck addresses, fixing NULL_OR_ON_C_STACK macro + for ia64 + * Remove error in clean target + + -- Camm Maguire Sat, 10 Aug 2002 13:20:08 -0400 + +gcl (2.5.0.cvs20020625-37) unstable; urgency=high + + * Replace tmpnam and mktemp with less dangerous mkstemp + + -- Camm Maguire Fri, 9 Aug 2002 19:45:52 -0400 + +gcl (2.5.0.cvs20020625-36) unstable; urgency=high + + * Fix rsym compilation when not using bfd + + -- Camm Maguire Fri, 9 Aug 2002 19:10:16 -0400 + +gcl (2.5.0.cvs20020625-35) unstable; urgency=high + + * Don't build bfd/po subdir + * Build-depend on automake and gettext + + -- Camm Maguire Fri, 9 Aug 2002 14:36:58 -0400 + +gcl (2.5.0.cvs20020625-34) unstable; urgency=high + + * fix zero length array support + * reverse configure order for bfd and libiberty + + -- Camm Maguire Fri, 9 Aug 2002 11:52:38 -0400 + +gcl (2.5.0.cvs20020625-33) unstable; urgency=high + + * chmod +x for subconfigures + * dlopen for appropriate arches in debian/rules + * add custreloc configure option + + -- Camm Maguire Fri, 9 Aug 2002 10:16:55 -0400 + +gcl (2.5.0.cvs20020625-32) unstable; urgency=high + + * Local bfd build option to prepare for arch-specific patches + * Try default gmp3 build on m68k + * Fix merge-pathnames + + -- Camm Maguire Fri, 9 Aug 2002 00:13:16 -0400 + +gcl (2.5.0.cvs20020625-31) unstable; urgency=high + + * #undef bool in object.h for some gcc-3.1 installations + * New number_tan implementation using real tan, so optimized compiled + code will find symbol in -lm + + -- Camm Maguire Tue, 6 Aug 2002 18:37:52 -0400 + +gcl (2.5.0.cvs20020625-30) unstable; urgency=high + + * fix bug in cmpif.lsp and recompile compiler + * \-O6 \-fomit\-frame\-pointer for Linux, speed gain of ~ 10% + * clean saved_gcl_pcl + + -- Camm Maguire Mon, 5 Aug 2002 16:34:33 -0400 + +gcl (2.5.0.cvs20020625-29) unstable; urgency=high + + * Back out of hppa assembler register flush for hppa, apparently issue + is cleared by long/object function declaration fix + * Remove ansi2knr.1 man page, Closes: #155067 + * hppa still has gc leak, possibly due to faulty setjmp. Try Lamont + Jones' latest assembler to flush regs + + -- Camm Maguire Fri, 2 Aug 2002 20:50:21 -0400 + +gcl (2.5.0.cvs20020625-28) unstable; urgency=high + + * SGC support for alpha + * generic gmp3 build for m68k + * compiler changes to declare all functions as returning object, with + functions that actually return long being cast appropriately + * back out of m68k hack in eval.c and funlink.c + + -- Camm Maguire Fri, 2 Aug 2002 18:22:04 -0400 + +gcl (2.5.0.cvs20020625-27) unstable; urgency=high + + * Use generic lshift.c in gmp3 for m68k + * use SGC for ia64 + * m68k workaround, cast (object(*)()) to (long(*)()) in funlink.c and + eval.c + * GBC register spiil asm for hppa + * fix hash_equal declaration error in hash.d + + -- Camm Maguire Thu, 1 Aug 2002 18:12:49 -0400 + +gcl (2.5.0.cvs20020625-26) unstable; urgency=high + + * Remove extra load of tkl.o in install target of main makefile + * gcc-3.1 for hppa + * Remove gcc version spec for m68k + * \-fPIC for hppa, needed for dlopen + * cleanup gcc 3.1 warning in funlink.c + * cc instead of ld for -shared linking in fasldlsym.c (needed for + hppa) + + -- Camm Maguire Wed, 31 Jul 2002 18:46:54 -0400 + +gcl (2.5.0.cvs20020625-25) unstable; urgency=high + + * Move chmod +x gmp3/* into debian/rules + * Remove gclm.bat from Debian package + * Build-Depend on autoconf, Closes: #154909 + + -- Camm Maguire Wed, 31 Jul 2002 09:44:20 -0400 + +gcl (2.5.0.cvs20020625-24) unstable; urgency=high + + * chmod +x gmp3/configure + + -- Camm Maguire Wed, 31 Jul 2002 07:55:17 -0400 + +gcl (2.5.0.cvs20020625-23) unstable; urgency=high + + * 64bit SGC support + * SGC on by default for sparc-linux and mips(el)-linux + * Optimized logxor funtion + * Check for MP_LIMB_SIZE in fasdump.c, for 64bit support + * gbc fix for ia64 + * gmp3 import for ia64 + * system bzero, bcmp, and bcopy function prototypes + + -- Camm Maguire Tue, 30 Jul 2002 23:11:58 -0400 + +gcl (2.5.0.cvs20020625-22) unstable; urgency=high + + * ElfW macros in rsym*.c for 64bit + * Allow for 8 byte gmp mp_limbs + + -- Camm Maguire Thu, 25 Jul 2002 18:52:37 -0400 + +gcl (2.5.0.cvs20020625-21) unstable; urgency=high + + * Support for dlopen object loading where bfd is not yet working -- + ./configure --enable-dlopen + + -- Camm Maguire Thu, 25 Jul 2002 15:08:05 -0400 + +gcl (2.5.0.cvs20020625-20) unstable; urgency=high + + * Cleanups for --disable-bfd option + + -- Camm Maguire Wed, 24 Jul 2002 15:05:28 -0400 + +gcl (2.5.0.cvs20020625-19) unstable; urgency=high + + * 64bit fixes + + -- Camm Maguire Wed, 24 Jul 2002 12:16:42 -0400 + +gcl (2.5.0.cvs20020625-18) unstable; urgency=high + + * misc. lintian cleanups, mostly for 64 bit + + -- Camm Maguire Tue, 23 Jul 2002 23:35:03 -0400 + +gcl (2.5.0.cvs20020625-17) unstable; urgency=high + + * Fixed typeo in error.c preventing arm compilation + + -- Camm Maguire Mon, 22 Jul 2002 17:18:18 -0400 + +gcl (2.5.0.cvs20020625-16) unstable; urgency=high + + * Fix bad on_stack_list_vector args + + -- Camm Maguire Mon, 22 Jul 2002 16:10:16 -0400 + +gcl (2.5.0.cvs20020625-15) unstable; urgency=high + + * More lint changes for sundry arches + * Fixed bug in Iapply_ap + + -- Camm Maguire Sat, 20 Jul 2002 23:40:33 -0400 + +gcl (2.5.0.cvs20020625-14) unstable; urgency=high + + * include stdarg.h when defining _GNU_SOURCE + + -- Camm Maguire Sat, 20 Jul 2002 18:47:43 -0400 + +gcl (2.5.0.cvs20020625-13) unstable; urgency=high + + * Proper va_dcl declarations + + -- Camm Maguire Sat, 20 Jul 2002 10:40:02 -0400 + +gcl (2.5.0.cvs20020625-12) unstable; urgency=high + + * cvs updates for missing ptrdiff_t + + -- Camm Maguire Sat, 20 Jul 2002 08:41:37 -0400 + +gcl (2.5.0.cvs20020625-11) unstable; urgency=high + + * cvs changes to compile cleanly with -Wall + + -- Camm Maguire Sat, 20 Jul 2002 02:59:33 -0400 + +gcl (2.5.0.cvs20020625-10) unstable; urgency=high + + * Architecture any, though still have some issues + + -- Camm Maguire Fri, 12 Jul 2002 19:02:09 -0400 + +gcl (2.5.0.cvs20020625-9) unstable; urgency=high + + * cvs commits for 64bit support + + -- Camm Maguire Fri, 12 Jul 2002 18:01:21 -0400 + +gcl (2.5.0.cvs20020625-8) unstable; urgency=high + + * NULL_OR_ON_C_STACK macro correction for m68k + + -- Camm Maguire Fri, 12 Jul 2002 14:37:48 -0400 + +gcl (2.5.0.cvs20020625-7) unstable; urgency=high + + * arm is bigendian + + -- Camm Maguire Wed, 10 Jul 2002 18:04:22 -0400 + +gcl (2.5.0.cvs20020625-6) unstable; urgency=high + + * cvs updates for arm build + + -- Camm Maguire Tue, 9 Jul 2002 16:09:26 -0400 + +gcl (2.5.0.cvs20020625-5) unstable; urgency=high + + * CC environment variable setting in debian/rules to aid in porting + * gcc 2.95 for m68k + + -- Camm Maguire Sat, 6 Jul 2002 23:00:23 -0400 + +gcl (2.5.0.cvs20020625-4) unstable; urgency=high + + * gcc 3.0 for arm + * cachectl header for m68k + + -- Camm Maguire Mon, 1 Jul 2002 15:47:53 -0400 + +gcl (2.5.0.cvs20020625-3) unstable; urgency=high + + * Better libbfd detection for arm/alpha + + -- Camm Maguire Wed, 26 Jun 2002 17:27:21 -0400 + +gcl (2.5.0.cvs20020625-2) unstable; urgency=high + + * s390 support + + -- Camm Maguire Tue, 25 Jun 2002 21:25:35 -0400 + +gcl (2.5.0.cvs20020625-1) unstable; urgency=high + + * CVS updates, new s390 arch + + -- Camm Maguire Tue, 25 Jun 2002 19:26:36 -0400 + +gcl (2.5.0.cvs20020610-2) unstable; urgency=high + + * cvs updates + + -- Camm Maguire Thu, 13 Jun 2002 08:42:32 -0400 + +gcl (2.5.0.cvs20020610-1) unstable; urgency=high + + * cvs updates + + -- Camm Maguire Wed, 12 Jun 2002 23:04:57 -0400 + +gcl (2.5.0.cvs20020523-2) unstable; urgency=high + + * configure updates for better tk detection + + -- Camm Maguire Fri, 24 May 2002 18:50:22 -0400 + +gcl (2.5.0.cvs20020523-1) unstable; urgency=high + + * New upstream release + + -- Camm Maguire Fri, 24 May 2002 18:50:22 -0400 + +gcl (2.5.0.cvs20020429-1) unstable; urgency=high + + * Build-Depend on tk8.2-dev, Closes: #144330 + * New cvs updates + * Added sparc to arch list, Closes: #143465 + + -- Camm Maguire Mon, 29 Apr 2002 23:07:36 -0400 + +gcl (2.5.0.cvs20020219-2) unstable; urgency=medium + + * flavor ->debian-emacs-flavor in emacsen-startup + + -- Camm Maguire Mon, 4 Mar 2002 14:29:59 -0500 + +gcl (2.5.0.cvs20020219-1) unstable; urgency=medium + + * Updated package descriptions, Closes: #134402 + * Static linking of libbfd, Closes: #134647 + * Gcl currently only available on i386, arm and m68k as specified in + the Architecture control field, Closes: #133912 + + -- Camm Maguire Tue, 19 Feb 2002 12:04:29 -0500 + +gcl (2.5.0.cvs-3) unstable; urgency=medium + + * Build-depend on texi2html, Closes: #133699 + + -- Camm Maguire Wed, 13 Feb 2002 16:22:35 -0500 + +gcl (2.5.0.cvs-2) unstable; urgency=medium + + * Put in versioned dependency on binutils for libbfd support, rebuilt + with latest binutils, Closes: #133004 + + -- Camm Maguire Tue, 12 Feb 2002 13:19:12 -0500 + +gcl (2.5.0.cvs-1) unstable; urgency=medium + + * Latest patches from CVS, enabling libbfd relocations, among other + things + * /etc/emacs/site-start.d/50gcl.el as conffile, Closes: #132137 + * limited arm and m68k support + + -- Camm Maguire Mon, 4 Feb 2002 09:32:29 -0500 + +gcl (2.5.0-1) unstable; urgency=medium + + * New maintainer + * New upstream release + * New release so far builds only on i386, Closes: #116070, Closes: + #123371 + * New release so far builds only on i386, Closes: #115041 + * Gcl must currently use its own copy of gmp, as the upstream version + of gmp uses malloc, which interferes with gcl's garbage collection + and relocation scheme. The change from malloc to alloca has been + suggested to upstream gmp developers. Closes: #108910 + * Tcl/Tk support now in. Closes: #113197 + + -- Camm Maguire Fri, 21 Dec 2001 00:03:43 -0500 + +gcl (2.4.0-3) unstable; urgency=medium + + * Make gcl use libgmp3 package. (closes: #108910) + * Remove tk support. (closes: #108909) + * Fix stupid missing dependency line. (closes: #108907, #108908) + * Removed readme.mingw from the debian package, this package is not compiled under + mingw (windows gcc port). + * Close ITA bug. (closes: #112312) + + -- Baruch Even Sat, 22 Sep 2001 00:27:14 +0300 + +gcl (2.4.0-2) unstable; urgency=low + + * Change tclsh Build-Depends to tcl8.0 because apt is broken. (closes: #99261) + + -- JP Sugarbroad Wed, 30 May 2001 14:34:53 -0500 + +gcl (2.4.0-1) unstable; urgency=low + + * New upstream release + + -- JP Sugarbroad Sun, 13 May 2001 20:31:01 -0500 + +gcl (2.3.7+beta3-3) unstable; urgency=low + + * Move gcl-doc to section doc (closes: #78666) + + -- JP Sugarbroad Sun, 13 May 2001 20:26:28 -0500 + +gcl (2.3.7+beta3-2) unstable; urgency=low + + * Remove alpha from arch list + * Move tcl/tk from Depends to Suggests + + -- JP Sugarbroad Fri, 4 May 2001 16:24:11 -0500 + +gcl (2.3.7+beta3-1) unstable; urgency=low + + * New maintainer + * Repackaged with debhelper (closes: #42045, #86097, #91475, #91478) + * New upstream release (closes: #59577, #71096) + * Added sparc+alpha, removed m68k (closes: #87407) + + -- JP Sugarbroad Mon, 30 Apr 2001 19:07:49 -0500 + +gcl (2.2.1-6) unstable; urgency=low + + * Disable stripping of "saved_gcl" binary. (#45778) + + -- Steve Dunham Fri, 24 Sep 1999 14:39:15 -0400 + +gcl (2.2.1-5) unstable; urgency=low + + * Fix m68k build + + -- Steve Dunham Tue, 6 Jul 1999 09:45:09 -0400 + +gcl (2.2.1-4) unstable; urgency=low + + * Fix bug #31718 + + -- Steve Dunham Fri, 2 Jul 1999 11:11:12 -0400 + +gcl (2.2.1-3) unstable; urgency=low + + * Add m68k patches + + -- Steve Dunham Wed, 16 Dec 1998 14:25:46 -0500 + +gcl (2.2.1-2) unstable; urgency=low + + * Compile against libc6. New maintainer. + + -- Steve Dunham Wed, 5 Nov 1997 10:09:12 -0500 + +gcl (2.2.1-1) unstable; urgency=low + + * New upstream release; suggests tcl76, tk42. + * gcl-doc contains gcl-si and gcl-tk info pages. + * debian/rules: clean target removes temporary files from h and o + subdirectories (bug #5984). + + -- Karl Sackett Fri, 3 Jan 1997 10:16:40 -0600 + +gcl (2.2-5) unstable; urgency=low + + * Converted package to 2.1.1.0 standard. + * Stripped gcltkaux (bug #5074). + * gcl-si and gcl-tk info pages converted to HTML. + + -- Karl Sackett Tue, 5 Nov 1996 13:30:30 -0600 + +2.2-4 + * add-defs: patched locates for tk.tcl, init.tcl + * gcl-tk/tkAppInit.c: patched for tk4.1 support + * gcl-tk/tkMain.c: patched for tk4.1 support +2.2-3 + * Debian support files now partily architecture independent. + There are, however, no add-defs files except for 386-linux. + * Rebuilt package to correct corrupted upload problem. +2.2-2 + * Removed tk support from distribution. This was written to + use tk-3.6 and doesn't support tk-4.0 or tk-4.1. I am not aware + of any plans to upgrade the code. (Closes bug #2865) +2.2-1 + * Added Debian support files + * h/386-linux.defs: set OFLAG = -O2 + * h/386-linux.h: undid patch that swaped signal.h for sigcontext.h diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b1bd38b --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +13 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..687792e --- /dev/null +++ b/debian/control @@ -0,0 +1,39 @@ +Source: gcl +Section: lisp +Priority: optional +Maintainer: Camm Maguire +Homepage: http://gnu.org/software/gcl +Build-Depends: debhelper (>= 13), libeditreadline-dev, m4, tk8.6-dev, libgmp-dev, libxmu-dev, libxaw7-dev, po-debconf, zlib1g-dev, tcl, gcc-11 +Standards-Version: 4.5.0 + +Package: gcl +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, ${gcc}, debconf (>= 1.2.0), emacs | emacsen, ucf +Breaks: emacsen-common (<< 2.0.0) +Suggests: gcl-doc +Description: GNU Common Lisp compiler + GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter + implemented in C, and complying mostly with the standard set + forth in the book "Common Lisp, the Language I". It attempts + to strike a useful middle ground in performance and portability + from its design around C. + . + This package contains the Lisp system itself. Documentation + is provided in the gcl-doc package. + +Package: gcl-doc +Section: doc +Architecture: all +Conflicts: gclinfo +Replaces: gclinfo +Depends: dpkg (>= 1.15.4), ${misc:Depends} +Description: Documentation for GNU Common Lisp + GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter + implemented in C, and complying mostly with the standard set + forth in the book "Common Lisp, the Language I". It attempts + to strike a useful middle ground in performance and portability + from its design around C. + . + This package contains Documentation in info format of both the + system internals, as well as the graphical interface currently + implemented in Tcl/Tk. diff --git a/debian/control. b/debian/control. new file mode 100644 index 0000000..687792e --- /dev/null +++ b/debian/control. @@ -0,0 +1,39 @@ +Source: gcl +Section: lisp +Priority: optional +Maintainer: Camm Maguire +Homepage: http://gnu.org/software/gcl +Build-Depends: debhelper (>= 13), libeditreadline-dev, m4, tk8.6-dev, libgmp-dev, libxmu-dev, libxaw7-dev, po-debconf, zlib1g-dev, tcl, gcc-11 +Standards-Version: 4.5.0 + +Package: gcl +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, ${gcc}, debconf (>= 1.2.0), emacs | emacsen, ucf +Breaks: emacsen-common (<< 2.0.0) +Suggests: gcl-doc +Description: GNU Common Lisp compiler + GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter + implemented in C, and complying mostly with the standard set + forth in the book "Common Lisp, the Language I". It attempts + to strike a useful middle ground in performance and portability + from its design around C. + . + This package contains the Lisp system itself. Documentation + is provided in the gcl-doc package. + +Package: gcl-doc +Section: doc +Architecture: all +Conflicts: gclinfo +Replaces: gclinfo +Depends: dpkg (>= 1.15.4), ${misc:Depends} +Description: Documentation for GNU Common Lisp + GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter + implemented in C, and complying mostly with the standard set + forth in the book "Common Lisp, the Language I". It attempts + to strike a useful middle ground in performance and portability + from its design around C. + . + This package contains Documentation in info format of both the + system internals, as well as the graphical interface currently + implemented in Tcl/Tk. diff --git a/debian/control.cvs b/debian/control.cvs new file mode 100644 index 0000000..83eb81d --- /dev/null +++ b/debian/control.cvs @@ -0,0 +1,39 @@ +Source: gclcvs +Section: lisp +Priority: optional +Maintainer: Camm Maguire +Homepage: http://gnu.org/software/gcl +Build-Depends: debhelper (>= 13), libeditreadline-dev, m4, tk8.6-dev, libgmp-dev, libxmu-dev, libxaw7-dev, po-debconf, zlib1g-dev, tcl, gcc-11 +Standards-Version: 4.5.0 + +Package: gclcvs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, ${gcc}, debconf (>= 1.2.0), emacs | emacsen, ucf +Breaks: emacsen-common (<< 2.0.0) +Suggests: gclcvs-doc +Description: GNU Common Lisp compiler, CVS snapshot + GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter + implemented in C, and complying mostly with the standard set + forth in the book "Common Lisp, the Language I". It attempts + to strike a useful middle ground in performance and portability + from its design around C. + . + This package contains the Lisp system itself. Documentation + is provided in the gclcvs-doc package. + +Package: gclcvs-doc +Section: doc +Architecture: all +Conflicts: gclinfo +Replaces: gclinfo +Depends: dpkg (>= 1.15.4), ${misc:Depends} +Description: Documentation for GNU Common Lisp, CVS snapshot + GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter + implemented in C, and complying mostly with the standard set + forth in the book "Common Lisp, the Language I". It attempts + to strike a useful middle ground in performance and portability + from its design around C. + . + This package contains Documentation in info format of both the + system internals, as well as the graphical interface currently + implemented in Tcl/Tk. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..c58a983 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,65 @@ +This package was debianized by JP Sugarbroad on +Mon, 30 Apr 2001 19:07:49 -0500. + +It was downloaded from http://savannah.gnu.org/projects/gcl + +Upstream Author: Bill Schelter + +Copyright: + + This package 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 of the License, or (at your option) any later version. + + This package 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 package; if not, write to the Free + Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + 02110-1301, USA. + +On Debian GNU/Linux systems, the complete text of the GNU Lesser General +Public License can be found in `/usr/share/common-licenses/LGPL-2'. + +The source under xgcl-2 is + +Copyright (c) 1995 Gordon S. Novak Jr., Hiep Huu Nguyen, William F. Schelter, +and The University of Texas at Austin. + +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 1, or (at your option) +any later version. + +and + +;;********************************************************** +;;Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, +;;and the Massachusetts Institute of Technology, Cambridge, Massachusetts. + +;; All Rights Reserved + +;;Permission to use, copy, modify, and distribute this software and its +;;documentation for any purpose and without fee is hereby granted, +;;provided that the above copyright notice appear in all copies and that +;;both that copyright notice and this permission notice appear in +;;supporting documentation, and that the names of Digital or MIT not be +;;used in advertising or publicity pertaining to distribution of the +;;software without specific, written prior permission. + +;;DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +;;ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +;;DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +;;ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +;;WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +;;ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +;;SOFTWARE. + +;;***************************************************************** + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL-1'. diff --git a/debian/gcl.lintian-overrides b/debian/gcl.lintian-overrides new file mode 100644 index 0000000..67fb247 --- /dev/null +++ b/debian/gcl.lintian-overrides @@ -0,0 +1,9 @@ +gcl: binary-compiled-with-profiling-enabled [usr/lib/gcl-2.6.12-prof/unixport/saved_ansi_gcl] +gcl: binary-compiled-with-profiling-enabled [usr/lib/gcl-2.6.12-prof/unixport/saved_gcl] +gcl: binary-compiled-with-profiling-enabled [usr/lib/gcl-2.6.12/unixport/saved_ansi_gcl] +gcl: binary-compiled-with-profiling-enabled [usr/lib/gcl-2.6.12/unixport/saved_gcl] +gcl: hardening-no-pie [usr/lib/gcl-2.6.12-prof/unixport/saved_ansi_gcl] +gcl: hardening-no-pie [usr/lib/gcl-2.6.12-prof/unixport/saved_gcl] +gcl: hardening-no-pie [usr/lib/gcl-2.6.12/unixport/saved_ansi_gcl] +gcl: hardening-no-pie [usr/lib/gcl-2.6.12/unixport/saved_gcl] +gcl: emacsen-common-without-dh-elpa diff --git a/debian/gcl.sh b/debian/gcl.sh new file mode 100755 index 0000000..9ea8018 --- /dev/null +++ b/debian/gcl.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +EXT=@EXT@ +VERS=@VERS@ + +. /etc/default/gcl$EXT +if ! set | grep -q -w GCL_ANSI ; then GCL_ANSI=$DEFAULT_GCL_ANSI ; fi +if ! set | grep -q -w GCL_PROF ; then GCL_PROF=$DEFAULT_GCL_PROF ; fi + +if [ "$GCL_PROF" = "" ] ; then + DIR=/usr/lib/gcl-$VERS ; +else + DIR=/usr/lib/gcl-$VERS-prof ; +fi + +if [ "$GCL_ANSI" = "" ] ; then + EXE=saved_gcl; +else + EXE=saved_ansi_gcl; +fi +SYS=$DIR/unixport + +exec $SYS/$EXE -dir $SYS/ -libdir $DIR/ \ + -eval '(setq si::*allow-gzipped-file* t)' \ + -eval '(setq si::*tk-library* "/usr/lib/tk@TKVERS@")' \ + "$@" + +# other options: -load /tmp/foo.o -load jo.lsp -eval "(joe 3)" diff --git a/debian/gcl.templates b/debian/gcl.templates new file mode 100644 index 0000000..3bc069d --- /dev/null +++ b/debian/gcl.templates @@ -0,0 +1,38 @@ +# These templates have been reviewed by the debian-l10n-english +# team +# +# If modifications/additions/rewording are needed, please ask +# debian-l10n-english@lists.debian.org for advice. +# +# Even minor modifications require translation updates and such +# changes should be coordinated with translators and reviewers. + +Template: gcl@EXT@/default_gcl_ansi +Type: boolean +_Description: Use the work-in-progress ANSI build by default? + GCL is in the process of providing an ANSI compliant image in addition to + its traditional CLtL1 image still in production use. + . + Please see the README.Debian file for a brief description of these terms. + Choosing this option will determine which image will be used by default + when executing 'gcl@EXT@'. + . + This setting may be overridden by setting the GCL_ANSI + environment variable to any non-empty string for the ANSI build, and to + the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The + currently enforced build flavor will be reported in the initial startup + banner. + +Template: gcl@EXT@/default_gcl_prof +Type: boolean +_Description: Use the profiling build by default? + GCL has optional support for profiling via gprof. + . + Please see the documentation for si::gprof-start and si::gprof-quit + for details. As this build is slower than builds without gprof + support, it is not recommended for final production use. + . + Set the GCL_PROF environment variable to the empty string for more + optimized builds, or any non-empty string for profiling support; e.g. + GCL_PROF=t gcl@EXT@. If profiling is enabled, this will be reported + in the initial startup banner. diff --git a/debian/in.gcl-doc.README.Debian b/debian/in.gcl-doc.README.Debian new file mode 100644 index 0000000..b8d01a6 --- /dev/null +++ b/debian/in.gcl-doc.README.Debian @@ -0,0 +1,9 @@ +New in 2.6.2 +------------ + +The gcl.texi files and the resulting html, info, and pdf outputs have +been removed pending an enquiry into the copyright and license status +of the dpANS documents upon which they are presumably based. + + + -- Camm Maguire , Fri, 9 May 2014 19:08:59 +0000 diff --git a/debian/in.gcl-doc.doc-base.main b/debian/in.gcl-doc.doc-base.main new file mode 100644 index 0000000..e15579b --- /dev/null +++ b/debian/in.gcl-doc.doc-base.main @@ -0,0 +1,9 @@ +Document: gcl@EXT@-doc +Title: GNU Common Lisp Documentation +Author: W. Schelter +Abstract: A Common Lisp compiler and interpreter based on C +Section: Programming + +Format: HTML +Index: /usr/share/doc/gcl@EXT@-doc/gcl/index.html +Files: /usr/share/doc/gcl@EXT@-doc/gcl/*.html diff --git a/debian/in.gcl-doc.doc-base.si b/debian/in.gcl-doc.doc-base.si new file mode 100644 index 0000000..faa0bc6 --- /dev/null +++ b/debian/in.gcl-doc.doc-base.si @@ -0,0 +1,12 @@ +Document: gcl@EXT@-si-doc +Title: GNU Common Lisp Documentation -- System Internals +Author: W. Schelter +Abstract: Documentation on GCL-specific Lisp system functions +Section: Programming + +Format: PDF +Files: /usr/share/doc/gcl@EXT@-doc/gcl-si*.pdf.gz /usr/share/doc/gcl@EXT@-doc/gcl-si*.pdf.gz + +Format: HTML +Index: /usr/share/doc/gcl@EXT@-doc/gcl-si/index.html +Files: /usr/share/doc/gcl@EXT@-doc/gcl-si/*.html diff --git a/debian/in.gcl-doc.doc-base.tk b/debian/in.gcl-doc.doc-base.tk new file mode 100644 index 0000000..23d74ee --- /dev/null +++ b/debian/in.gcl-doc.doc-base.tk @@ -0,0 +1,12 @@ +Document: gcl@EXT@-tk-doc +Title: GNU Common Lisp Tk Interface Documentation +Author: W. Schelter +Abstract: Documentation for Graphical Interface to GCL using TCL/Tk +Section: Programming + +Format: PDF +Files: /usr/share/doc/gcl@EXT@-doc/gcl-tk*.pdf.gz /usr/share/doc/gcl@EXT@-doc/gcl-tk*.pdf.gz + +Format: HTML +Index: /usr/share/doc/gcl@EXT@-doc/gcl-tk/index.html +Files: /usr/share/doc/gcl@EXT@-doc/gcl-tk/*.html diff --git a/debian/in.gcl-doc.doc-base.xgcl b/debian/in.gcl-doc.doc-base.xgcl new file mode 100644 index 0000000..a78b27b --- /dev/null +++ b/debian/in.gcl-doc.doc-base.xgcl @@ -0,0 +1,15 @@ +Document: gcl@EXT@-xgcl-doc +Title: GNU Common Lisp Documentation -- System Internals +Author: W. Schelter +Abstract: Documentation on GCL-specific Lisp system functions +Section: Programming + +Format: Text +Files: /usr/share/doc/gcl@EXT@-doc/dwdoc.tex.gz + +Format: PDF +Files: /usr/share/doc/gcl@EXT@-doc/dwdoc.pdf.gz + +Format: HTML +Index: /usr/share/doc/gcl@EXT@-doc/dwdoc/dwdoc1.html +Files: /usr/share/doc/gcl@EXT@-doc/dwdoc/*.html diff --git a/debian/in.gcl-doc.docs b/debian/in.gcl-doc.docs new file mode 100644 index 0000000..2757ff2 --- /dev/null +++ b/debian/in.gcl-doc.docs @@ -0,0 +1,3 @@ +faq +readme +readme.xgcl diff --git a/debian/in.gcl-doc.info b/debian/in.gcl-doc.info new file mode 100644 index 0000000..b8f188c --- /dev/null +++ b/debian/in.gcl-doc.info @@ -0,0 +1,14 @@ +debian/tmp/usr/share/info/gcl@EXT@-si.info +debian/tmp/usr/share/info/gcl@EXT@-tk.info +debian/tmp/usr/share/info/gcl@EXT@-tk.info-1 +debian/tmp/usr/share/info/gcl@EXT@-tk.info-2 +debian/tmp/usr/share/info/gcl@EXT@.info +debian/tmp/usr/share/info/gcl@EXT@.info-1 +debian/tmp/usr/share/info/gcl@EXT@.info-2 +debian/tmp/usr/share/info/gcl@EXT@.info-3 +debian/tmp/usr/share/info/gcl@EXT@.info-4 +debian/tmp/usr/share/info/gcl@EXT@.info-5 +debian/tmp/usr/share/info/gcl@EXT@.info-6 +debian/tmp/usr/share/info/gcl@EXT@.info-7 +debian/tmp/usr/share/info/gcl@EXT@.info-8 +debian/tmp/usr/share/info/gcl@EXT@.info-9 diff --git a/debian/in.gcl-doc.install b/debian/in.gcl-doc.install new file mode 100644 index 0000000..8e31d17 --- /dev/null +++ b/debian/in.gcl-doc.install @@ -0,0 +1 @@ +debian/tmp/usr/share/doc/gcl@EXT@-doc diff --git a/debian/in.gcl.config b/debian/in.gcl.config new file mode 100644 index 0000000..0d960b1 --- /dev/null +++ b/debian/in.gcl.config @@ -0,0 +1,19 @@ +#!/bin/sh +CONFIGFILE=/etc/default/gcl@EXT@ +set -e +. /usr/share/debconf/confmodule + +# Load config file, if it exists. +if [ -e $CONFIGFILE ]; then + . $CONFIGFILE || true + + # Store values from config file into + # debconf db. + db_set gcl@EXT@/default_gcl_ansi $DEFAULT_GCL_ANSI + db_set gcl@EXT@/default_gcl_prof $DEFAULT_GCL_PROF +fi + +# Ask questions. +db_input medium gcl@EXT@/default_gcl_ansi || true +db_input medium gcl@EXT@/default_gcl_prof || true +db_go || true diff --git a/debian/in.gcl.docs b/debian/in.gcl.docs new file mode 100644 index 0000000..b50c945 --- /dev/null +++ b/debian/in.gcl.docs @@ -0,0 +1,2 @@ +ansi-tests/test_results +RELEASE-2.6.2.html diff --git a/debian/in.gcl.emacsen-compat b/debian/in.gcl.emacsen-compat new file mode 100644 index 0000000..573541a --- /dev/null +++ b/debian/in.gcl.emacsen-compat @@ -0,0 +1 @@ +0 diff --git a/debian/in.gcl.emacsen-install b/debian/in.gcl.emacsen-install new file mode 100644 index 0000000..ed97209 --- /dev/null +++ b/debian/in.gcl.emacsen-install @@ -0,0 +1,46 @@ +#! /bin/sh -e +# /usr/lib/emacsen-common/packages/install/#PACKAGE# + +# Written by Jim Van Zandt , borrowing heavily +# from the install scripts for gettext by Santiago Vila +# and octave by Dirk Eddelbuettel . + +FLAVOR=$1 +PACKAGE=gcl@EXT@ + +if [ ${FLAVOR} = emacs ]; then exit 0; fi + +echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR} + +#FLAVORTEST=`echo $FLAVOR | cut -c-6` +#if [ ${FLAVORTEST} = xemacs ] ; then +# SITEFLAG="-no-site-file" +#else +# SITEFLAG="--no-site-file" +#fi +FLAGS="${SITEFLAG} -q -batch -l path.el -f batch-byte-compile" + +ELDIR=/usr/share/emacs/site-lisp/${PACKAGE} +ELCDIR=/usr/share/${FLAVOR}/site-lisp/${PACKAGE} + +# Install-info-altdir does not actually exist. +# Maybe somebody will write it. +if test -x /usr/sbin/install-info-altdir; then + echo install/${PACKAGE}: install Info links for ${FLAVOR} + install-info-altdir --quiet --section "" "" --dirname=${FLAVOR} /usr/info/${PACKAGE}.info.gz +fi + +install -m 755 -d ${ELCDIR} +cd ${ELDIR} +FILES=`echo *.el` +cp ${FILES} ${ELCDIR} +cd ${ELCDIR} + +cat << EOF > path.el +(setq load-path (cons "." load-path) byte-compile-warnings nil) +EOF +${FLAVOR} ${FLAGS} ${FILES} +rm -f *.el path.el + +exit 0 + diff --git a/debian/in.gcl.emacsen-remove b/debian/in.gcl.emacsen-remove new file mode 100644 index 0000000..699eca1 --- /dev/null +++ b/debian/in.gcl.emacsen-remove @@ -0,0 +1,15 @@ +#!/bin/sh -e +# /usr/lib/emacsen-common/packages/remove/#PACKAGE# + +FLAVOR=$1 +PACKAGE=gcl@EXT@ + +if [ ${FLAVOR} != emacs ]; then + if test -x /usr/sbin/install-info-altdir; then + echo remove/${PACKAGE}: removing Info links for ${FLAVOR} + install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/info/#PACKAGE#.info.gz + fi + + echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR} + rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE} +fi diff --git a/debian/in.gcl.emacsen-startup b/debian/in.gcl.emacsen-startup new file mode 100644 index 0000000..e64d9a8 --- /dev/null +++ b/debian/in.gcl.emacsen-startup @@ -0,0 +1,19 @@ +;; -*-emacs-lisp-*- +;; +;; Emacs startup file for the Debian GNU/Linux #PACKAGE# package +;; +;; Originally contributed by Nils Naumann +;; Modified by Dirk Eddelbuettel +;; Adapted for dh-make by Jim Van Zandt + +;; The #PACKAGE# package follows the Debian/GNU Linux 'emacsen' policy and +;; byte-compiles its elisp files for each 'emacs flavor' (emacs19, +;; xemacs19, emacs20, xemacs20...). The compiled code is then +;; installed in a subdirectory of the respective site-lisp directory. +;; We have to add this to the load-path: +(setq load-path (cons (concat "/usr/share/" + (symbol-name debian-emacs-flavor) + "/site-lisp/gcl@EXT@") load-path)) + +(autoload 'run@EXT@ "gcl@EXT@" "" t) +(autoload 'dbl@EXT@ "dbl@EXT@" "" t) diff --git a/debian/in.gcl.install b/debian/in.gcl.install new file mode 100644 index 0000000..731600b --- /dev/null +++ b/debian/in.gcl.install @@ -0,0 +1,3 @@ +debian/tmp/usr/lib +debian/tmp/usr/bin +debian/tmp/usr/share/emacs diff --git a/debian/in.gcl.manpages b/debian/in.gcl.manpages new file mode 100644 index 0000000..0b22534 --- /dev/null +++ b/debian/in.gcl.manpages @@ -0,0 +1 @@ +debian/tmp/usr/share/man/man1/gcl@EXT@.1 diff --git a/debian/in.gcl.postinst b/debian/in.gcl.postinst new file mode 100644 index 0000000..aa02a19 --- /dev/null +++ b/debian/in.gcl.postinst @@ -0,0 +1,41 @@ +#!/bin/sh +case "$1" in + configure) + +# CONFIGFILE=$(tempfile -m 644) + CONFIGFILE=$(mktemp) + set -e + . /usr/share/debconf/confmodule + + if [ "$1" = "configure" ] || [ "$1" = "reconfigure" ] ; then + + db_get gcl@EXT@/default_gcl_ansi + + if [ "$RET" = "true" ] ; then + DEFAULT_GCL_ANSI=t + else + DEFAULT_GCL_ANSI= + fi + + db_get gcl@EXT@/default_gcl_prof + + if [ "$RET" = "true" ] ; then + DEFAULT_GCL_PROF=y + else + DEFAULT_GCL_PROF= + fi + + echo "DEFAULT_GCL_ANSI=$DEFAULT_GCL_ANSI" >> $CONFIGFILE + echo "DEFAULT_GCL_PROF=$DEFAULT_GCL_PROF" >> $CONFIGFILE + + fi + + ucf --debconf-ok $CONFIGFILE /etc/default/gcl@EXT@ + ucfr gcl@EXT@ /etc/default/gcl@EXT@ + + chmod 644 /etc/default/gcl@EXT@ + +esac + +#DEBHELPER# + diff --git a/debian/in.gcl.postrm b/debian/in.gcl.postrm new file mode 100644 index 0000000..5360f7d --- /dev/null +++ b/debian/in.gcl.postrm @@ -0,0 +1,22 @@ +#!/bin/sh + +set -e + +case "$1" in + purge) + for ext in '~' '%' .bak .ucf-new .ucf-old .ucf-dist; do + rm -f /etc/default/gcl@EXT@$ext + done + + rm -f /etc/default/gcl@EXT@ + + if which ucf >/dev/null; then + ucf --purge /etc/default/gcl@EXT@ + fi + if which ucfr >/dev/null; then + ucfr --purge gcl@EXT@ /etc/default/gcl@EXT@ + fi + ;; +esac + +#DEBHELPER# diff --git a/debian/old.in.gcl-doc.doc-base.main b/debian/old.in.gcl-doc.doc-base.main new file mode 100644 index 0000000..2d6f3d1 --- /dev/null +++ b/debian/old.in.gcl-doc.doc-base.main @@ -0,0 +1,12 @@ +Document: gcl@EXT@-doc +Title: GNU Common Lisp Documentation +Author: W. Schelter +Abstract: A Common Lisp compiler and interpreter based on C +Section: Apps/Programming + +Format: DVI +Files: /usr/share/doc/gcl@EXT@-doc/gcl.dvi.gz /usr/share/doc/gcl@EXT@-doc/gcl.dvi + +Format: HTML +Index: /usr/share/doc/gcl@EXT@-doc/gcl/index.html +Files: /usr/share/doc/gcl@EXT@-doc/gcl/*.html diff --git a/debian/patches/Version_2.6.13pre105 b/debian/patches/Version_2.6.13pre105 new file mode 100644 index 0000000..c98696b --- /dev/null +++ b/debian/patches/Version_2.6.13pre105 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-108) unstable; urgency=medium + . + * Version_2.6.13pre105 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-11-09 + +--- gcl-2.6.12.orig/o/number.c ++++ gcl-2.6.12/o/number.c +@@ -65,7 +65,7 @@ struct {int min,max;} bigger_fixnums; + struct fixnum_struct *bigger_fixnum_table; + #if !defined(IM_FIX_BASE) || defined(USE_SAFE_CDR) + #define STATIC_BIGGER_FIXNUM_TABLE_BITS 10 +-static struct fixnum_struct bigger_fixnum_table1[1<<(STATIC_BIGGER_FIXNUM_TABLE_BITS+1)]; ++static struct fixnum_struct bigger_fixnum_table1[1<<(STATIC_BIGGER_FIXNUM_TABLE_BITS+1)] OBJ_ALIGN; + #endif + + DEFUN_NEW("ALLOCATE-BIGGER-FIXNUM-RANGE",object,fSallocate_bigger_fixnum_range,SI,2,2,NONE,OI,IO,OO,OO,(fixnum min,fixnum max),"") { diff --git a/debian/patches/Version_2.6.13pre106 b/debian/patches/Version_2.6.13pre106 new file mode 100644 index 0000000..d9bd2af --- /dev/null +++ b/debian/patches/Version_2.6.13pre106 @@ -0,0 +1,10884 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-109) unstable; urgency=medium + . + * Version_2.6.13pre106 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-11-10 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -99,6 +99,7 @@ + ;; *split-files* long, with the + ;; will be performed for separate chunks of the lisp files. + (defvar *split-files* nil) ;; if ++(defvar *compile-file-truename*) + + (defun compile-file (filename &rest args + &aux (*print-pretty* nil) +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -1,9 +1,10 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.69. ++# Generated by GNU Autoconf 2.71. + # + # +-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. ++# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, ++# Inc. + # + # + # This configure script is free software; the Free Software Foundation +@@ -14,14 +15,16 @@ + + # Be more Bourne compatible + DUALCASE=1; export DUALCASE # for MKS sh +-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : ++as_nop=: ++if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 ++then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +-else ++else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( +@@ -31,46 +34,46 @@ esac + fi + + ++ ++# Reset variables that may have inherited troublesome values from ++# the environment. ++ ++# IFS needs to be set, to space, tab, and newline, in precisely that order. ++# (If _AS_PATH_WALK were called with IFS unset, it would have the ++# side effect of setting IFS to empty, thus disabling word splitting.) ++# Quoting is to prevent editors from complaining about space-tab. + as_nl=' + ' + export as_nl +-# Printing a long string crashes Solaris 7 /usr/bin/printf. +-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +-# Prefer a ksh shell builtin over an external printf program on Solaris, +-# but without wasting forks for bash or zsh. +-if test -z "$BASH_VERSION$ZSH_VERSION" \ +- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='print -r --' +- as_echo_n='print -rn --' +-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='printf %s\n' +- as_echo_n='printf %s' +-else +- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then +- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' +- as_echo_n='/usr/ucb/echo -n' +- else +- as_echo_body='eval expr "X$1" : "X\\(.*\\)"' +- as_echo_n_body='eval +- arg=$1; +- case $arg in #( +- *"$as_nl"*) +- expr "X$arg" : "X\\(.*\\)$as_nl"; +- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; +- esac; +- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" +- ' +- export as_echo_n_body +- as_echo_n='sh -c $as_echo_n_body as_echo' +- fi +- export as_echo_body +- as_echo='sh -c $as_echo_body as_echo' +-fi ++IFS=" "" $as_nl" ++ ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# Ensure predictable behavior from utilities with locale-dependent output. ++LC_ALL=C ++export LC_ALL ++LANGUAGE=C ++export LANGUAGE ++ ++# We cannot yet rely on "unset" to work, but we need these variables ++# to be unset--not just set to an empty or harmless value--now, to ++# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct ++# also avoids known problems related to "unset" and subshell syntax ++# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). ++for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH ++do eval test \${$as_var+y} \ ++ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : ++done ++ ++# Ensure that fds 0, 1, and 2 are open. ++if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi ++if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + + # The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then ++if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || +@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; + fi + + +-# IFS +-# We need space, tab and new line, in precisely that order. Quoting is +-# there to prevent editors from complaining about space-tab. +-# (If _AS_PATH_WALK were called with IFS unset, it would disable word +-# splitting by setting IFS to empty value.) +-IFS=" "" $as_nl" +- + # Find who we are. Look in the path if we contain no directory separator. + as_myself= + case $0 in #(( +@@ -94,8 +90,12 @@ case $0 in #(( + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done + IFS=$as_save_IFS + +@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then +- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 ++ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 + fi + +-# Unset variables that we do not need and which cause bugs (e.g. in +-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +-# suppresses any "Segmentation fault" message there. '((' could +-# trigger a bug in pdksh 5.2.14. +-for as_var in BASH_ENV ENV MAIL MAILPATH +-do eval test x\${$as_var+set} = xset \ +- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +-done +-PS1='$ ' +-PS2='> ' +-PS4='+ ' +- +-# NLS nuisances. +-LC_ALL=C +-export LC_ALL +-LANGUAGE=C +-export LANGUAGE +- +-# CDPATH. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + # Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. +@@ -152,20 +132,22 @@ esac + exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} + # Admittedly, this is quite paranoid, since all the known shells bail + # out after a failed `exec'. +-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +-as_fn_exit 255 ++printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 ++exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} + if test "x$CONFIG_SHELL" = x; then +- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : ++ as_bourne_compatible="as_nop=: ++if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 ++then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +-else ++else \$as_nop + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( +@@ -185,42 +167,53 @@ as_fn_success || { exitcode=1; echo as_f + as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } + as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } + as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : ++if ( set x; as_fn_ret_success y && test x = \"\$1\" ) ++then : + +-else ++else \$as_nop + exitcode=1; echo positional parameters were not saved. + fi + test x\$exitcode = x0 || exit 1 ++blah=\$(echo \$(echo blah)) ++test x\"\$blah\" = xblah || exit 1 + test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + test \$(( 1 + 1 )) = 2 || exit 1" +- if (eval "$as_required") 2>/dev/null; then : ++ if (eval "$as_required") 2>/dev/null ++then : + as_have_required=yes +-else ++else $as_nop + as_have_required=no + fi +- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : ++ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null ++then : + +-else ++else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + as_found=false + for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. +- as_shell=$as_dir/$as_base ++ as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && +- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : ++ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null ++then : + CONFIG_SHELL=$as_shell as_have_required=yes +- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : ++ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null ++then : + break 2 + fi + fi +@@ -228,14 +221,21 @@ fi + esac + as_found=false + done +-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : +- CONFIG_SHELL=$SHELL as_have_required=yes +-fi; } + IFS=$as_save_IFS ++if $as_found ++then : ++ ++else $as_nop ++ if { test -f "$SHELL" || test -f "$SHELL.exe"; } && ++ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null ++then : ++ CONFIG_SHELL=$SHELL as_have_required=yes ++fi ++fi + + +- if test "x$CONFIG_SHELL" != x; then : ++ if test "x$CONFIG_SHELL" != x ++then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also +@@ -253,18 +253,19 @@ esac + exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} + # Admittedly, this is quite paranoid, since all the known shells bail + # out after a failed `exec'. +-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 ++printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 + exit 255 + fi + +- if test x$as_have_required = xno; then : +- $as_echo "$0: This script requires a shell more modern than all" +- $as_echo "$0: the shells that I found on your system." +- if test x${ZSH_VERSION+set} = xset ; then +- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" +- $as_echo "$0: be upgraded to zsh 4.3.4 or later." ++ if test x$as_have_required = xno ++then : ++ printf "%s\n" "$0: This script requires a shell more modern than all" ++ printf "%s\n" "$0: the shells that I found on your system." ++ if test ${ZSH_VERSION+y} ; then ++ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" ++ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else +- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, ++ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, + $0: including any error possibly output before this + $0: message. Then install a modern shell, or manually run + $0: the script under such a shell if you do have one." +@@ -291,6 +292,7 @@ as_fn_unset () + } + as_unset=as_fn_unset + ++ + # as_fn_set_status STATUS + # ----------------------- + # Set $? to STATUS, without forking. +@@ -308,6 +310,14 @@ as_fn_exit () + as_fn_set_status $1 + exit $1 + } # as_fn_exit ++# as_fn_nop ++# --------- ++# Do nothing but, unlike ":", preserve the value of $?. ++as_fn_nop () ++{ ++ return $? ++} ++as_nop=as_fn_nop + + # as_fn_mkdir_p + # ------------- +@@ -322,7 +332,7 @@ as_fn_mkdir_p () + as_dirs= + while :; do + case $as_dir in #( +- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( ++ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" +@@ -331,7 +341,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_dir" | ++printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q +@@ -370,12 +380,13 @@ as_fn_executable_p () + # advantage of any shell optimizations that allow amortized linear growth over + # repeated appends, instead of the typical quadratic growth present in naive + # implementations. +-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : ++if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null ++then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +-else ++else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 +@@ -387,18 +398,27 @@ fi # as_fn_append + # Perform arithmetic evaluation on the ARGs, and store the result in the + # global $as_val. Take advantage of shells that can avoid forks. The arguments + # must be portable across $(()) and expr. +-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : ++if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null ++then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +-else ++else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } + fi # as_fn_arith + ++# as_fn_nop ++# --------- ++# Do nothing but, unlike ":", preserve the value of $?. ++as_fn_nop () ++{ ++ return $? ++} ++as_nop=as_fn_nop + + # as_fn_error STATUS ERROR [LINENO LOG_FD] + # ---------------------------------------- +@@ -410,9 +430,9 @@ as_fn_error () + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi +- $as_echo "$as_me: error: $2" >&2 ++ printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + +@@ -439,7 +459,7 @@ as_me=`$as_basename -- "$0" || + $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X/"$0" | ++printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q +@@ -483,7 +503,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || +- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } ++ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall +@@ -497,6 +517,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits + exit + } + ++ ++# Determine whether it's possible to make 'echo' print without a newline. ++# These variables are no longer used directly by Autoconf, but are AC_SUBSTed ++# for compatibility with existing Makefiles. + ECHO_C= ECHO_N= ECHO_T= + case `echo -n x` in #((((( + -n*) +@@ -510,6 +534,13 @@ case `echo -n x` in #((((( + ECHO_N='-n';; + esac + ++# For backward compatibility with old third-party macros, we provide ++# the shell variables $as_echo and $as_echo_n. New code should use ++# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. ++as_echo='printf %s\n' ++as_echo_n='printf %s' ++ ++ + rm -f conf$$ conf$$.exe conf$$.file + if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +@@ -575,49 +606,45 @@ MFLAGS= + MAKEFLAGS= + + # Identity of this package. +-PACKAGE_NAME= +-PACKAGE_TARNAME= +-PACKAGE_VERSION= +-PACKAGE_STRING= +-PACKAGE_BUGREPORT= +-PACKAGE_URL= ++PACKAGE_NAME='' ++PACKAGE_TARNAME='' ++PACKAGE_VERSION='' ++PACKAGE_STRING='' ++PACKAGE_BUGREPORT='' ++PACKAGE_URL='' + + # Factoring default headers for most tests. + ac_includes_default="\ +-#include +-#ifdef HAVE_SYS_TYPES_H +-# include ++#include ++#ifdef HAVE_STDIO_H ++# include + #endif +-#ifdef HAVE_SYS_STAT_H +-# include +-#endif +-#ifdef STDC_HEADERS ++#ifdef HAVE_STDLIB_H + # include +-# include +-#else +-# ifdef HAVE_STDLIB_H +-# include +-# endif + #endif + #ifdef HAVE_STRING_H +-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +-# include +-# endif + # include + #endif +-#ifdef HAVE_STRINGS_H +-# include +-#endif + #ifdef HAVE_INTTYPES_H + # include + #endif + #ifdef HAVE_STDINT_H + # include + #endif ++#ifdef HAVE_STRINGS_H ++# include ++#endif ++#ifdef HAVE_SYS_TYPES_H ++# include ++#endif ++#ifdef HAVE_SYS_STAT_H ++# include ++#endif + #ifdef HAVE_UNISTD_H + # include + #endif" + ++ac_header_c_list= + ac_subst_vars='LTLIBOBJS + LIBOBJS + use +@@ -656,6 +683,8 @@ HAVE_SETENV + NO_PROFILE + RL_LIB + RL_OBJS ++EGREP ++GREP + CLSTANDARD + SYSTEM + FLISP +@@ -673,8 +702,6 @@ XMKMF + GMPDIR + GMP + HAVE_MALLOC_ZONE_MEMALIGN +-EGREP +-GREP + MAKEINFO + AWK + GCL_CC +@@ -850,8 +877,6 @@ do + *) ac_optarg=yes ;; + esac + +- # Accept the important Cygnus configure options, so we can diagnose typos. +- + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; +@@ -892,9 +917,9 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` ++ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "enable_$ac_useropt" +@@ -918,9 +943,9 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid feature name: $ac_useropt" ++ as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` ++ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "enable_$ac_useropt" +@@ -1131,9 +1156,9 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` ++ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "with_$ac_useropt" +@@ -1147,9 +1172,9 @@ do + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid package name: $ac_useropt" ++ as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` ++ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" + "with_$ac_useropt" +@@ -1193,9 +1218,9 @@ Try \`$0 --help' for more information" + + *) + # FIXME: should be removed in autoconf 3.0. +- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 ++ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && +- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 ++ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + +@@ -1211,7 +1236,7 @@ if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; +- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; ++ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac + fi + +@@ -1275,7 +1300,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//* + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_myself" | ++printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q +@@ -1476,9 +1501,9 @@ if test "$ac_init_help" = "recursive"; t + case "$ac_dir" in + .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) +- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` ++ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. +- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` ++ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; +@@ -1506,7 +1531,8 @@ esac + ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } +- # Check for guested configure. ++ # Check for configure.gnu first; this name is used for a wrapper for ++ # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive +@@ -1514,7 +1540,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_ + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else +- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 ++ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +@@ -1524,9 +1550,9 @@ test -n "$ac_init_help" && exit $ac_stat + if $ac_init_version; then + cat <<\_ACEOF + configure +-generated by GNU Autoconf 2.69 ++generated by GNU Autoconf 2.71 + +-Copyright (C) 2012 Free Software Foundation, Inc. ++Copyright (C) 2021 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF +@@ -1543,14 +1569,14 @@ fi + ac_fn_c_try_compile () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext ++ rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" + case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then +@@ -1558,14 +1584,15 @@ $as_echo "$ac_try_echo"; } >&5 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err +- } && test -s conftest.$ac_objext; then : ++ } && test -s conftest.$ac_objext ++then : + ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 ++else $as_nop ++ printf "%s\n" "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +@@ -1587,7 +1614,7 @@ case "(($ac_try" in + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then +@@ -1595,14 +1622,15 @@ $as_echo "$ac_try_echo"; } >&5 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err +- }; then : ++ } ++then : + ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 ++else $as_nop ++ printf "%s\n" "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +@@ -1614,8 +1642,8 @@ fi + + # ac_fn_c_try_run LINENO + # ---------------------- +-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +-# that executables *can* be run. ++# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that ++# executables *can* be run. + ac_fn_c_try_run () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +@@ -1625,25 +1653,26 @@ case "(($ac_try" in + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then : ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; } ++then : + ac_retval=0 +-else +- $as_echo "$as_me: program exited with status $ac_status" >&5 +- $as_echo "$as_me: failed program was:" >&5 ++else $as_nop ++ printf "%s\n" "$as_me: program exited with status $ac_status" >&5 ++ printf "%s\n" "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +@@ -1654,93 +1683,6 @@ fi + + } # ac_fn_c_try_run + +-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +-# ------------------------------------------------------- +-# Tests whether HEADER exists, giving a warning if it cannot be compiled using +-# the include files in INCLUDES and setting the cache variable VAR +-# accordingly. +-ac_fn_c_check_header_mongrel () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval \${$3+:} false; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-else +- # Is the header compilable? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +-$as_echo_n "checking $2 usability... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-#include <$2> +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_header_compiler=yes +-else +- ac_header_compiler=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +-$as_echo "$ac_header_compiler" >&6; } +- +-# Is the header present? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +-$as_echo_n "checking $2 presence... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include <$2> +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- ac_header_preproc=yes +-else +- ac_header_preproc=no +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +-$as_echo "$ac_header_preproc" >&6; } +- +-# So? What about this header? +-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( +- yes:no: ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +- ;; +- no:yes:* ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=\$ac_header_compiler" +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} # ac_fn_c_check_header_mongrel +- + # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES + # ------------------------------------------------------- + # Tests whether HEADER exists and can be compiled using the include files in +@@ -1748,26 +1690,28 @@ fi + ac_fn_c_check_header_compile () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++printf %s "checking for $2... " >&6; } ++if eval test \${$3+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + #include <$2> + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + eval "$3=yes" +-else ++else $as_nop + eval "$3=no" + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_header_compile +@@ -1779,16 +1723,17 @@ $as_echo "$ac_res" >&6; } + ac_fn_c_check_member () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +-$as_echo_n "checking for $2.$3... " >&6; } +-if eval \${$4+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 ++printf %s "checking for $2.$3... " >&6; } ++if eval test \${$4+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $5 + int +-main () ++main (void) + { + static $2 ac_aggr; + if (ac_aggr.$3) +@@ -1797,14 +1742,15 @@ return 0; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + eval "$4=yes" +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $5 + int +-main () ++main (void) + { + static $2 ac_aggr; + if (sizeof ac_aggr.$3) +@@ -1813,18 +1759,19 @@ return 0; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + eval "$4=yes" +-else ++else $as_nop + eval "$4=no" + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + eval ac_res=\$$4 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_member +@@ -1835,14 +1782,14 @@ $as_echo "$ac_res" >&6; } + ac_fn_c_try_link () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext conftest$ac_exeext ++ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" + case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then +@@ -1850,17 +1797,18 @@ $as_echo "$ac_try_echo"; } >&5 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext +- }; then : ++ } ++then : + ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 ++else $as_nop ++ printf "%s\n" "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +@@ -1881,11 +1829,12 @@ fi + ac_fn_c_check_func () + { + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++printf %s "checking for $2... " >&6; } ++if eval test \${$3+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + /* Define $2 to an innocuous variant, in case declares $2. +@@ -1893,16 +1842,9 @@ else + #define $2 innocuous_$2 + + /* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $2 (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ +- +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif ++ which can conflict with char $2 (); below. */ + ++#include + #undef $2 + + /* Override any GCC internal prototype to avoid an error. +@@ -1920,24 +1862,25 @@ choke me + #endif + + int +-main () ++main (void) + { + return $2 (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + eval "$3=yes" +-else ++else $as_nop + eval "$3=no" + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_func +@@ -1956,7 +1899,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + static int test_array [1 - 2 * !(($2) >= 0)]; + test_array [0] = 0; +@@ -1966,14 +1909,15 @@ return test_array [0]; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + static int test_array [1 - 2 * !(($2) <= $ac_mid)]; + test_array [0] = 0; +@@ -1983,9 +1927,10 @@ return test_array [0]; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_hi=$ac_mid; break +-else ++else $as_nop + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= +@@ -1993,14 +1938,14 @@ else + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + static int test_array [1 - 2 * !(($2) < 0)]; + test_array [0] = 0; +@@ -2010,14 +1955,15 @@ return test_array [0]; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + static int test_array [1 - 2 * !(($2) >= $ac_mid)]; + test_array [0] = 0; +@@ -2027,9 +1973,10 @@ return test_array [0]; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_lo=$ac_mid; break +-else ++else $as_nop + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= +@@ -2037,14 +1984,14 @@ else + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done +-else ++else $as_nop + ac_lo= ac_hi= + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + # Binary search between lo and hi bounds. + while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val +@@ -2052,7 +1999,7 @@ while test "x$ac_lo" != "x$ac_hi"; do + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + static int test_array [1 - 2 * !(($2) <= $ac_mid)]; + test_array [0] = 0; +@@ -2062,12 +2009,13 @@ return test_array [0]; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_hi=$ac_mid +-else ++else $as_nop + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + case $ac_lo in #(( + ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +@@ -2077,12 +2025,12 @@ esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 +-static long int longval () { return $2; } +-static unsigned long int ulongval () { return $2; } ++static long int longval (void) { return $2; } ++static unsigned long int ulongval (void) { return $2; } + #include + #include + int +-main () ++main (void) + { + + FILE *f = fopen ("conftest.val", "w"); +@@ -2110,9 +2058,10 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + echo >>conftest.val; read $3 &5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 ++printf %s "checking for $2... " >&6; } ++if eval test \${$3+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + if (sizeof ($2)) + return 0; +@@ -2150,12 +2100,13 @@ if (sizeof ($2)) + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $4 + int +-main () ++main (void) + { + if (sizeof (($2))) + return 0; +@@ -2163,29 +2114,50 @@ if (sizeof (($2))) + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-else ++else $as_nop + eval "$3=yes" + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 ++printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + + } # ac_fn_c_check_type ++ac_configure_args_raw= ++for ac_arg ++do ++ case $ac_arg in ++ *\'*) ++ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ esac ++ as_fn_append ac_configure_args_raw " '$ac_arg'" ++done ++ ++case $ac_configure_args_raw in ++ *$as_nl*) ++ ac_safe_unquote= ;; ++ *) ++ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ++ ac_unsafe_a="$ac_unsafe_z#~" ++ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ++ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; ++esac ++ + cat >config.log <<_ACEOF + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + + It was created by $as_me, which was +-generated by GNU Autoconf 2.69. Invocation command line was ++generated by GNU Autoconf 2.71. Invocation command line was + +- $ $0 $@ ++ $ $0$ac_configure_args_raw + + _ACEOF + exec 5>>config.log +@@ -2218,8 +2190,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- $as_echo "PATH: $as_dir" ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ printf "%s\n" "PATH: $as_dir" + done + IFS=$as_save_IFS + +@@ -2254,7 +2230,7 @@ do + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) +- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; +@@ -2289,11 +2265,13 @@ done + # WARNING: Use '\'' to represent an apostrophe within the trap. + # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. + trap 'exit_status=$? ++ # Sanitize IFS. ++ IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + +- $as_echo "## ---------------- ## ++ printf "%s\n" "## ---------------- ## + ## Cache variables. ## + ## ---------------- ##" + echo +@@ -2304,8 +2282,8 @@ trap 'exit_status=$? + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( +- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ++ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 ++printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( +@@ -2329,7 +2307,7 @@ $as_echo "$as_me: WARNING: cache variabl + ) + echo + +- $as_echo "## ----------------- ## ++ printf "%s\n" "## ----------------- ## + ## Output variables. ## + ## ----------------- ##" + echo +@@ -2337,14 +2315,14 @@ $as_echo "$as_me: WARNING: cache variabl + do + eval ac_val=\$$ac_var + case $ac_val in +- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; ++ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac +- $as_echo "$ac_var='\''$ac_val'\''" ++ printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then +- $as_echo "## ------------------- ## ++ printf "%s\n" "## ------------------- ## + ## File substitutions. ## + ## ------------------- ##" + echo +@@ -2352,15 +2330,15 @@ $as_echo "$as_me: WARNING: cache variabl + do + eval ac_val=\$$ac_var + case $ac_val in +- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; ++ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac +- $as_echo "$ac_var='\''$ac_val'\''" ++ printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then +- $as_echo "## ----------- ## ++ printf "%s\n" "## ----------- ## + ## confdefs.h. ## + ## ----------- ##" + echo +@@ -2368,8 +2346,8 @@ $as_echo "$as_me: WARNING: cache variabl + echo + fi + test "$ac_signal" != 0 && +- $as_echo "$as_me: caught signal $ac_signal" +- $as_echo "$as_me: exit $exit_status" ++ printf "%s\n" "$as_me: caught signal $ac_signal" ++ printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && +@@ -2383,63 +2361,48 @@ ac_signal=0 + # confdefs.h avoids OS command line length limits that DEFS can exceed. + rm -f -r conftest* confdefs.h + +-$as_echo "/* confdefs.h */" > confdefs.h ++printf "%s\n" "/* confdefs.h */" > confdefs.h + + # Predefined preprocessor variables. + +-cat >>confdefs.h <<_ACEOF +-#define PACKAGE_NAME "$PACKAGE_NAME" +-_ACEOF ++printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +-cat >>confdefs.h <<_ACEOF +-#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +-_ACEOF ++printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +-cat >>confdefs.h <<_ACEOF +-#define PACKAGE_VERSION "$PACKAGE_VERSION" +-_ACEOF ++printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +-cat >>confdefs.h <<_ACEOF +-#define PACKAGE_STRING "$PACKAGE_STRING" +-_ACEOF ++printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +-cat >>confdefs.h <<_ACEOF +-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +-_ACEOF ++printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +-cat >>confdefs.h <<_ACEOF +-#define PACKAGE_URL "$PACKAGE_URL" +-_ACEOF ++printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + + # Let the site file select an alternate cache file if it wants to. + # Prefer an explicitly selected file to automatically selected ones. +-ac_site_file1=NONE +-ac_site_file2=NONE + if test -n "$CONFIG_SITE"; then +- # We do not want a PATH search for config.site. +- case $CONFIG_SITE in #(( +- -*) ac_site_file1=./$CONFIG_SITE;; +- */*) ac_site_file1=$CONFIG_SITE;; +- *) ac_site_file1=./$CONFIG_SITE;; +- esac ++ ac_site_files="$CONFIG_SITE" + elif test "x$prefix" != xNONE; then +- ac_site_file1=$prefix/share/config.site +- ac_site_file2=$prefix/etc/config.site ++ ac_site_files="$prefix/share/config.site $prefix/etc/config.site" + else +- ac_site_file1=$ac_default_prefix/share/config.site +- ac_site_file2=$ac_default_prefix/etc/config.site ++ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +-for ac_site_file in "$ac_site_file1" "$ac_site_file2" ++ ++for ac_site_file in $ac_site_files + do +- test "x$ac_site_file" = xNONE && continue +- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +-$as_echo "$as_me: loading site script $ac_site_file" >&6;} ++ case $ac_site_file in #( ++ */*) : ++ ;; #( ++ *) : ++ ac_site_file=./$ac_site_file ;; ++esac ++ if test -f "$ac_site_file" && test -r "$ac_site_file"; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 ++printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ +- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "failed to load site script $ac_site_file + See \`config.log' for more details" "$LINENO" 5; } + fi +@@ -2449,19 +2412,434 @@ if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +-$as_echo "$as_me: loading cache $cache_file" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 ++printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +-$as_echo "$as_me: creating cache $cache_file" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 ++printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file + fi + ++# Test code for whether the C compiler supports C89 (global declarations) ++ac_c_conftest_c89_globals=' ++/* Does the compiler advertise C89 conformance? ++ Do not test the value of __STDC__, because some compilers set it to 0 ++ while being otherwise adequately conformant. */ ++#if !defined __STDC__ ++# error "Compiler does not advertise C89 conformance" ++#endif ++ ++#include ++#include ++struct stat; ++/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ ++struct buf { int x; }; ++struct buf * (*rcsopen) (struct buf *, struct stat *, int); ++static char *e (p, i) ++ char **p; ++ int i; ++{ ++ return p[i]; ++} ++static char *f (char * (*g) (char **, int), char **p, ...) ++{ ++ char *s; ++ va_list v; ++ va_start (v,p); ++ s = g (p, va_arg (v,int)); ++ va_end (v); ++ return s; ++} ++ ++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has ++ function prototypes and stuff, but not \xHH hex character constants. ++ These do not provoke an error unfortunately, instead are silently treated ++ as an "x". The following induces an error, until -std is added to get ++ proper ANSI mode. Curiously \x00 != x always comes out true, for an ++ array size at least. It is necessary to write \x00 == 0 to get something ++ that is true only with -std. */ ++int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; ++ ++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters ++ inside strings and character constants. */ ++#define FOO(x) '\''x'\'' ++int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; ++ ++int test (int i, double x); ++struct s1 {int (*f) (int a);}; ++struct s2 {int (*f) (double a);}; ++int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), ++ int, int);' ++ ++# Test code for whether the C compiler supports C89 (body of main). ++ac_c_conftest_c89_main=' ++ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ++' ++ ++# Test code for whether the C compiler supports C99 (global declarations) ++ac_c_conftest_c99_globals=' ++// Does the compiler advertise C99 conformance? ++#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L ++# error "Compiler does not advertise C99 conformance" ++#endif ++ ++#include ++extern int puts (const char *); ++extern int printf (const char *, ...); ++extern int dprintf (int, const char *, ...); ++extern void *malloc (size_t); ++ ++// Check varargs macros. These examples are taken from C99 6.10.3.5. ++// dprintf is used instead of fprintf to avoid needing to declare ++// FILE and stderr. ++#define debug(...) dprintf (2, __VA_ARGS__) ++#define showlist(...) puts (#__VA_ARGS__) ++#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) ++static void ++test_varargs_macros (void) ++{ ++ int x = 1234; ++ int y = 5678; ++ debug ("Flag"); ++ debug ("X = %d\n", x); ++ showlist (The first, second, and third items.); ++ report (x>y, "x is %d but y is %d", x, y); ++} ++ ++// Check long long types. ++#define BIG64 18446744073709551615ull ++#define BIG32 4294967295ul ++#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) ++#if !BIG_OK ++ #error "your preprocessor is broken" ++#endif ++#if BIG_OK ++#else ++ #error "your preprocessor is broken" ++#endif ++static long long int bignum = -9223372036854775807LL; ++static unsigned long long int ubignum = BIG64; ++ ++struct incomplete_array ++{ ++ int datasize; ++ double data[]; ++}; ++ ++struct named_init { ++ int number; ++ const wchar_t *name; ++ double average; ++}; ++ ++typedef const char *ccp; ++ ++static inline int ++test_restrict (ccp restrict text) ++{ ++ // See if C++-style comments work. ++ // Iterate through items via the restricted pointer. ++ // Also check for declarations in for loops. ++ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) ++ continue; ++ return 0; ++} ++ ++// Check varargs and va_copy. ++static bool ++test_varargs (const char *format, ...) ++{ ++ va_list args; ++ va_start (args, format); ++ va_list args_copy; ++ va_copy (args_copy, args); ++ ++ const char *str = ""; ++ int number = 0; ++ float fnumber = 0; ++ ++ while (*format) ++ { ++ switch (*format++) ++ { ++ case '\''s'\'': // string ++ str = va_arg (args_copy, const char *); ++ break; ++ case '\''d'\'': // int ++ number = va_arg (args_copy, int); ++ break; ++ case '\''f'\'': // float ++ fnumber = va_arg (args_copy, double); ++ break; ++ default: ++ break; ++ } ++ } ++ va_end (args_copy); ++ va_end (args); ++ ++ return *str && number && fnumber; ++} ++' ++ ++# Test code for whether the C compiler supports C99 (body of main). ++ac_c_conftest_c99_main=' ++ // Check bool. ++ _Bool success = false; ++ success |= (argc != 0); ++ ++ // Check restrict. ++ if (test_restrict ("String literal") == 0) ++ success = true; ++ char *restrict newvar = "Another string"; ++ ++ // Check varargs. ++ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); ++ test_varargs_macros (); ++ ++ // Check flexible array members. ++ struct incomplete_array *ia = ++ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ++ ia->datasize = 10; ++ for (int i = 0; i < ia->datasize; ++i) ++ ia->data[i] = i * 1.234; ++ ++ // Check named initializers. ++ struct named_init ni = { ++ .number = 34, ++ .name = L"Test wide string", ++ .average = 543.34343, ++ }; ++ ++ ni.number = 58; ++ ++ int dynamic_array[ni.number]; ++ dynamic_array[0] = argv[0][0]; ++ dynamic_array[ni.number - 1] = 543; ++ ++ // work around unused variable warnings ++ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' ++ || dynamic_array[ni.number - 1] != 543); ++' ++ ++# Test code for whether the C compiler supports C11 (global declarations) ++ac_c_conftest_c11_globals=' ++// Does the compiler advertise C11 conformance? ++#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L ++# error "Compiler does not advertise C11 conformance" ++#endif ++ ++// Check _Alignas. ++char _Alignas (double) aligned_as_double; ++char _Alignas (0) no_special_alignment; ++extern char aligned_as_int; ++char _Alignas (0) _Alignas (int) aligned_as_int; ++ ++// Check _Alignof. ++enum ++{ ++ int_alignment = _Alignof (int), ++ int_array_alignment = _Alignof (int[100]), ++ char_alignment = _Alignof (char) ++}; ++_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); ++ ++// Check _Noreturn. ++int _Noreturn does_not_return (void) { for (;;) continue; } ++ ++// Check _Static_assert. ++struct test_static_assert ++{ ++ int x; ++ _Static_assert (sizeof (int) <= sizeof (long int), ++ "_Static_assert does not work in struct"); ++ long int y; ++}; ++ ++// Check UTF-8 literals. ++#define u8 syntax error! ++char const utf8_literal[] = u8"happens to be ASCII" "another string"; ++ ++// Check duplicate typedefs. ++typedef long *long_ptr; ++typedef long int *long_ptr; ++typedef long_ptr long_ptr; ++ ++// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. ++struct anonymous ++{ ++ union { ++ struct { int i; int j; }; ++ struct { int k; long int l; } w; ++ }; ++ int m; ++} v1; ++' ++ ++# Test code for whether the C compiler supports C11 (body of main). ++ac_c_conftest_c11_main=' ++ _Static_assert ((offsetof (struct anonymous, i) ++ == offsetof (struct anonymous, w.k)), ++ "Anonymous union alignment botch"); ++ v1.i = 2; ++ v1.w.k = 5; ++ ok |= v1.i != 5; ++' ++ ++# Test code for whether the C compiler supports C11 (complete). ++ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ++${ac_c_conftest_c99_globals} ++${ac_c_conftest_c11_globals} ++ ++int ++main (int argc, char **argv) ++{ ++ int ok = 0; ++ ${ac_c_conftest_c89_main} ++ ${ac_c_conftest_c99_main} ++ ${ac_c_conftest_c11_main} ++ return ok; ++} ++" ++ ++# Test code for whether the C compiler supports C99 (complete). ++ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ++${ac_c_conftest_c99_globals} ++ ++int ++main (int argc, char **argv) ++{ ++ int ok = 0; ++ ${ac_c_conftest_c89_main} ++ ${ac_c_conftest_c99_main} ++ return ok; ++} ++" ++ ++# Test code for whether the C compiler supports C89 (complete). ++ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} ++ ++int ++main (int argc, char **argv) ++{ ++ int ok = 0; ++ ${ac_c_conftest_c89_main} ++ return ok; ++} ++" ++ ++as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" ++as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" ++as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" ++as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" ++as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" ++as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" ++as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" ++as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" ++as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" ++ ++# Auxiliary files required by this configure script. ++ac_aux_files="config.guess config.sub" ++ ++# Locations in which to look for auxiliary files. ++ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." ++ ++# Search for a directory containing all of the required auxiliary files, ++# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. ++# If we don't find one directory that contains all the files we need, ++# we report the set of missing files from the *first* directory in ++# $ac_aux_dir_candidates and give up. ++ac_missing_aux_files="" ++ac_first_candidate=: ++printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++as_found=false ++for as_dir in $ac_aux_dir_candidates ++do ++ IFS=$as_save_IFS ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ as_found=: ++ ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ++ ac_aux_dir_found=yes ++ ac_install_sh= ++ for ac_aux in $ac_aux_files ++ do ++ # As a special case, if "install-sh" is required, that requirement ++ # can be satisfied by any of "install-sh", "install.sh", or "shtool", ++ # and $ac_install_sh is set appropriately for whichever one is found. ++ if test x"$ac_aux" = x"install-sh" ++ then ++ if test -f "${as_dir}install-sh"; then ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ++ ac_install_sh="${as_dir}install-sh -c" ++ elif test -f "${as_dir}install.sh"; then ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ++ ac_install_sh="${as_dir}install.sh -c" ++ elif test -f "${as_dir}shtool"; then ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ++ ac_install_sh="${as_dir}shtool install -c" ++ else ++ ac_aux_dir_found=no ++ if $ac_first_candidate; then ++ ac_missing_aux_files="${ac_missing_aux_files} install-sh" ++ else ++ break ++ fi ++ fi ++ else ++ if test -f "${as_dir}${ac_aux}"; then ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 ++ else ++ ac_aux_dir_found=no ++ if $ac_first_candidate; then ++ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" ++ else ++ break ++ fi ++ fi ++ fi ++ done ++ if test "$ac_aux_dir_found" = yes; then ++ ac_aux_dir="$as_dir" ++ break ++ fi ++ ac_first_candidate=false ++ ++ as_found=false ++done ++IFS=$as_save_IFS ++if $as_found ++then : ++ ++else $as_nop ++ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ++fi ++ ++ ++# These three variables are undocumented and unsupported, ++# and are intended to be withdrawn in a future Autoconf release. ++# They can cause serious problems if a builder's source tree is in a directory ++# whose full name contains unusual characters. ++if test -f "${ac_aux_dir}config.guess"; then ++ ac_config_guess="$SHELL ${ac_aux_dir}config.guess" ++fi ++if test -f "${ac_aux_dir}config.sub"; then ++ ac_config_sub="$SHELL ${ac_aux_dir}config.sub" ++fi ++if test -f "$ac_aux_dir/configure"; then ++ ac_configure="$SHELL ${ac_aux_dir}configure" ++fi ++ + # Check that the precious variables saved in the cache have kept the same + # value. + ac_cache_corrupted=false +@@ -2472,12 +2850,12 @@ for ac_var in $ac_precious_vars; do + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 ++printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 ++printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) +@@ -2486,24 +2864,24 @@ $as_echo "$as_me: error: \`$ac_var' was + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 ++printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 ++printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 ++printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 ++printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in +- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; ++ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in +@@ -2513,11 +2891,12 @@ $as_echo "$as_me: current value: \`$ac + fi + done + if $ac_cache_corrupted; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 ++printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} ++ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' ++ and start over" "$LINENO" 5 + fi + ## -------------------- ## + ## Main body of script. ## +@@ -2543,55 +2922,30 @@ VERSION=`cat majvers`.`cat minvers` + # + + +-ac_aux_dir= +-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +- if test -f "$ac_dir/install-sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install-sh -c" +- break +- elif test -f "$ac_dir/install.sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install.sh -c" +- break +- elif test -f "$ac_dir/shtool"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/shtool install -c" +- break +- fi +-done +-if test -z "$ac_aux_dir"; then +- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +-fi + +-# These three variables are undocumented and unsupported, +-# and are intended to be withdrawn in a future Autoconf release. +-# They can cause serious problems if a builder's source tree is in a directory +-# whose full name contains unusual characters. +-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +-# Make sure we can run config.sub. +-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +-$as_echo_n "checking build system type... " >&6; } +-if ${ac_cv_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ # Make sure we can run config.sub. ++$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || ++ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 ++ ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 ++printf %s "checking build system type... " >&6; } ++if test ${ac_cv_build+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_build_alias=$build_alias + test "x$ac_build_alias" = x && +- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` ++ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` + test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 ++ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || ++ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +-$as_echo "$ac_cv_build" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 ++printf "%s\n" "$ac_cv_build" >&6; } + case $ac_cv_build in + *-*-*) ;; + *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +@@ -2610,21 +2964,22 @@ IFS=$ac_save_IFS + case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +-$as_echo_n "checking host system type... " >&6; } +-if ${ac_cv_host+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 ++printf %s "checking host system type... " >&6; } ++if test ${ac_cv_host+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build + else +- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 ++ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || ++ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 + fi + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +-$as_echo "$ac_cv_host" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 ++printf "%s\n" "$ac_cv_host" >&6; } + case $ac_cv_host in + *-*-*) ;; + *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +@@ -2664,8 +3019,8 @@ _ACEOF + + fi + ## host=CPU-COMPANY-SYSTEM +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: host=$host" >&5 +-$as_echo "host=$host" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: host=$host" >&5 ++printf "%s\n" "host=$host" >&6; } + + use=unknown + case $canonical in +@@ -2701,13 +3056,14 @@ case $canonical in + esac + + # Check whether --enable-machine was given. +-if test "${enable_machine+set}" = set; then : ++if test ${enable_machine+y} ++then : + enableval=$enable_machine; echo enable_machine=$enableval ; use=$enableval + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: use=$use" >&5 +-$as_echo "use=$use" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: use=$use" >&5 ++printf "%s\n" "use=$use" >&6; } + + def_dlopen="no" + def_statsysbfd="no" +@@ -2732,23 +3088,26 @@ case $use in + esac + + # Check whether --enable-widecons was given. +-if test "${enable_widecons+set}" = set; then : ++if test ${enable_widecons+y} ++then : + enableval=$enable_widecons; if test "$enableval" = "yes" ; then +-$as_echo "#define WIDE_CONS 1" >>confdefs.h ++printf "%s\n" "#define WIDE_CONS 1" >>confdefs.h + fi + fi + + + # Check whether --enable-safecdr was given. +-if test "${enable_safecdr+set}" = set; then : ++if test ${enable_safecdr+y} ++then : + enableval=$enable_safecdr; if test "$enableval" = "yes" ; then + +-$as_echo "#define USE_SAFE_CDR 1" >>confdefs.h ++printf "%s\n" "#define USE_SAFE_CDR 1" >>confdefs.h + + # Check whether --enable-safecdrdbg was given. +-if test "${enable_safecdrdbg+set}" = set; then : ++if test ${enable_safecdrdbg+y} ++then : + enableval=$enable_safecdrdbg; if test "$enableval" = "yes" ; then +-$as_echo "#define DEBUG_SAFE_CDR 1" >>confdefs.h ++printf "%s\n" "#define DEBUG_SAFE_CDR 1" >>confdefs.h + fi + fi + +@@ -2757,122 +3116,129 @@ fi + + + # Check whether --enable-prelink was given. +-if test "${enable_prelink+set}" = set; then : ++if test ${enable_prelink+y} ++then : + enableval=$enable_prelink; if test "$enable_prelink" = "yes" ; then PRELINK_CHECK=t; fi + fi + + + + # Check whether --enable-vssize was given. +-if test "${enable_vssize+set}" = set; then : ++if test ${enable_vssize+y} ++then : + enableval=$enable_vssize; +-cat >>confdefs.h <<_ACEOF +-#define VSSIZE $enableval +-_ACEOF ++printf "%s\n" "#define VSSIZE $enableval" >>confdefs.h + + fi + + # Check whether --enable-bdssize was given. +-if test "${enable_bdssize+set}" = set; then : ++if test ${enable_bdssize+y} ++then : + enableval=$enable_bdssize; +-cat >>confdefs.h <<_ACEOF +-#define BDSSIZE $enableval +-_ACEOF ++printf "%s\n" "#define BDSSIZE $enableval" >>confdefs.h + + fi + + # Check whether --enable-ihssize was given. +-if test "${enable_ihssize+set}" = set; then : ++if test ${enable_ihssize+y} ++then : + enableval=$enable_ihssize; +-cat >>confdefs.h <<_ACEOF +-#define IHSSIZE $enableval +-_ACEOF ++printf "%s\n" "#define IHSSIZE $enableval" >>confdefs.h + + fi + + # Check whether --enable-frssize was given. +-if test "${enable_frssize+set}" = set; then : ++if test ${enable_frssize+y} ++then : + enableval=$enable_frssize; +-cat >>confdefs.h <<_ACEOF +-#define FRSSIZE $enableval +-_ACEOF ++printf "%s\n" "#define FRSSIZE $enableval" >>confdefs.h + + fi + + + # Check whether --enable-infodir was given. +-if test "${enable_infodir+set}" = set; then : ++if test ${enable_infodir+y} ++then : + enableval=$enable_infodir; INFO_DIR=$enableval +-else ++else $as_nop + INFO_DIR=$prefix/share/info + fi + + INFO_DIR=`eval echo $INFO_DIR/` + + # Check whether --enable-emacsdir was given. +-if test "${enable_emacsdir+set}" = set; then : ++if test ${enable_emacsdir+y} ++then : + enableval=$enable_emacsdir; EMACS_SITE_LISP=$enableval +-else ++else $as_nop + EMACS_SITE_LISP=$prefix/share/emacs/site-lisp + fi + + EMACS_SITE_LISP=`eval echo $EMACS_SITE_LISP/` + + # Check whether --enable-xgcl was given. +-if test "${enable_xgcl+set}" = set; then : ++if test ${enable_xgcl+y} ++then : + enableval=$enable_xgcl; +-else ++else $as_nop + enable_xgcl=yes + fi + + + # Check whether --enable-dlopen was given. +-if test "${enable_dlopen+set}" = set; then : ++if test ${enable_dlopen+y} ++then : + enableval=$enable_dlopen; +-else ++else $as_nop + enable_dlopen=$def_dlopen + fi + + # Check whether --enable-statsysbfd was given. +-if test "${enable_statsysbfd+set}" = set; then : ++if test ${enable_statsysbfd+y} ++then : + enableval=$enable_statsysbfd; +-else ++else $as_nop + enable_statsysbfd=$def_statsysbfd + fi + + # Check whether --enable-dynsysbfd was given. +-if test "${enable_dynsysbfd+set}" = set; then : ++if test ${enable_dynsysbfd+y} ++then : + enableval=$enable_dynsysbfd; +-else ++else $as_nop + enable_dynsysbfd=no + fi + + # Check whether --enable-custreloc was given. +-if test "${enable_custreloc+set}" = set; then : ++if test ${enable_custreloc+y} ++then : + enableval=$enable_custreloc; +-else ++else $as_nop + enable_custreloc=$def_custreloc + fi + + + # Check whether --enable-debug was given. +-if test "${enable_debug+set}" = set; then : ++if test ${enable_debug+y} ++then : + enableval=$enable_debug; +-else ++else $as_nop + enable_debug=$def_debug + fi + + # Check whether --enable-static was given. +-if test "${enable_static+set}" = set; then : ++if test ${enable_static+y} ++then : + enableval=$enable_static; +-else ++else $as_nop + enable_static=$def_static + fi + + # Check whether --enable-pic was given. +-if test "${enable_pic+set}" = set; then : ++if test ${enable_pic+y} ++then : + enableval=$enable_pic; +-else ++else $as_nop + enable_pic=$def_pic + fi + +@@ -2923,6 +3289,15 @@ if test "$LDFLAGS" = "" ; then + LDFLAGS=" " + fi + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -2931,11 +3306,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. + set dummy ${ac_tool_prefix}gcc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else +@@ -2943,11 +3319,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -2958,11 +3338,11 @@ fi + fi + CC=$ac_cv_prog_CC + if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++printf "%s\n" "$CC" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -2971,11 +3351,12 @@ if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. + set dummy gcc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_ac_ct_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + else +@@ -2983,11 +3364,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -2998,11 +3383,11 @@ fi + fi + ac_ct_CC=$ac_cv_prog_ac_ct_CC + if test -n "$ac_ct_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +-$as_echo "$ac_ct_CC" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 ++printf "%s\n" "$ac_ct_CC" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + if test "x$ac_ct_CC" = x; then +@@ -3010,8 +3395,8 @@ fi + else + case $cross_compiling:$ac_tool_warned in + yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} + ac_tool_warned=yes ;; + esac + CC=$ac_ct_CC +@@ -3024,11 +3409,12 @@ if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. + set dummy ${ac_tool_prefix}cc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else +@@ -3036,11 +3422,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -3051,11 +3441,11 @@ fi + fi + CC=$ac_cv_prog_CC + if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++printf "%s\n" "$CC" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -3064,11 +3454,12 @@ fi + if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. + set dummy cc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else +@@ -3077,15 +3468,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ++ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -3101,18 +3496,18 @@ if test $ac_prog_rejected = yes; then + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift +- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" ++ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi + fi + fi + fi + CC=$ac_cv_prog_CC + if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++printf "%s\n" "$CC" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -3123,11 +3518,12 @@ if test -z "$CC"; then + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. + set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. + else +@@ -3135,11 +3531,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -3150,11 +3550,11 @@ fi + fi + CC=$ac_cv_prog_CC + if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++printf "%s\n" "$CC" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -3167,11 +3567,12 @@ if test -z "$CC"; then + do + # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_ac_ct_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. + else +@@ -3179,11 +3580,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -3194,11 +3599,11 @@ fi + fi + ac_ct_CC=$ac_cv_prog_ac_ct_CC + if test -n "$ac_ct_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +-$as_echo "$ac_ct_CC" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 ++printf "%s\n" "$ac_ct_CC" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -3210,34 +3615,138 @@ done + else + case $cross_compiling:$ac_tool_warned in + yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ CC=$ac_ct_CC ++ fi ++fi ++ ++fi ++if test -z "$CC"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. ++set dummy ${ac_tool_prefix}clang; ac_word=$2 ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ++ ac_cv_prog_CC="${ac_tool_prefix}clang" ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++CC=$ac_cv_prog_CC ++if test -n "$CC"; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++printf "%s\n" "$CC" >&6; } ++else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_prog_CC"; then ++ ac_ct_CC=$CC ++ # Extract the first word of "clang", so it can be a program name with args. ++set dummy clang; ac_word=$2 ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_ac_ct_CC+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if test -n "$ac_ct_CC"; then ++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_CC="clang" ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_CC=$ac_cv_prog_ac_ct_CC ++if test -n "$ac_ct_CC"; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 ++printf "%s\n" "$ac_ct_CC" >&6; } ++else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++fi ++ ++ if test "x$ac_ct_CC" = x; then ++ CC="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} + ac_tool_warned=yes ;; + esac + CC=$ac_ct_CC + fi ++else ++ CC="$ac_cv_prog_CC" + fi + + fi + + +-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "no acceptable C compiler found in \$PATH + See \`config.log' for more details" "$LINENO" 5; } + + # Provide some information about the compiler. +-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 ++printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 + set X $ac_compile + ac_compiler=$2 +-for ac_option in --version -v -V -qversion; do ++for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" + case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then +@@ -3247,7 +3756,7 @@ $as_echo "$ac_try_echo"; } >&5 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + done + +@@ -3255,7 +3764,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; +@@ -3267,9 +3776,9 @@ ac_clean_files="$ac_clean_files a.out a. + # Try to create an executable without -o first, disregard a.out. + # It will help us diagnose broken compilers, and finding out an intuition + # of exeext. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +-$as_echo_n "checking whether the C compiler works... " >&6; } +-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 ++printf %s "checking whether the C compiler works... " >&6; } ++ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + + # The possible output files: + ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" +@@ -3290,11 +3799,12 @@ case "(($ac_try" in + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. + # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' + # in a Makefile. We should not override ac_cv_exeext if it was cached, +@@ -3311,7 +3821,7 @@ do + # certainly right. + break;; + *.* ) +- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; ++ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi +@@ -3327,44 +3837,46 @@ do + done + test "$ac_cv_exeext" = no && ac_cv_exeext= + +-else ++else $as_nop + ac_file='' + fi +-if test -z "$ac_file"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-$as_echo "$as_me: failed program was:" >&5 ++if test -z "$ac_file" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++printf "%s\n" "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + +-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error 77 "C compiler cannot create executables + See \`config.log' for more details" "$LINENO" 5; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +-$as_echo_n "checking for C compiler default output file name... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +-$as_echo "$ac_file" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++fi ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 ++printf %s "checking for C compiler default output file name... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 ++printf "%s\n" "$ac_file" >&6; } + ac_exeext=$ac_cv_exeext + + rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out + ac_clean_files=$ac_clean_files_save +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +-$as_echo_n "checking for suffix of executables... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 ++printf %s "checking for suffix of executables... " >&6; } + if { { ac_try="$ac_link" + case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) + # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will + # work properly (i.e., refer to `conftest.exe'), while it won't with +@@ -3378,15 +3890,15 @@ for ac_file in conftest.exe conftest con + * ) break;; + esac + done +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++else $as_nop ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot compute suffix of executables: cannot compile and link + See \`config.log' for more details" "$LINENO" 5; } + fi + rm -f conftest conftest$ac_cv_exeext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +-$as_echo "$ac_cv_exeext" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 ++printf "%s\n" "$ac_cv_exeext" >&6; } + + rm -f conftest.$ac_ext + EXEEXT=$ac_cv_exeext +@@ -3395,7 +3907,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* end confdefs.h. */ + #include + int +-main () ++main (void) + { + FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; +@@ -3407,8 +3919,8 @@ _ACEOF + ac_clean_files="$ac_clean_files conftest.out" + # Check that the compiler produces executables we can run. If not, either + # the compiler is broken, or we cross compile. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +-$as_echo_n "checking whether we are cross compiling... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 ++printf %s "checking whether we are cross compiling... " >&6; } + if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" + case "(($ac_try" in +@@ -3416,10 +3928,10 @@ case "(($ac_try" in + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in +@@ -3427,39 +3939,40 @@ $as_echo "$ac_try_echo"; } >&5 + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run C compiled programs. ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error 77 "cannot run C compiled programs. + If you meant to cross compile, use \`--host'. + See \`config.log' for more details" "$LINENO" 5; } + fi + fi + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +-$as_echo "$cross_compiling" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 ++printf "%s\n" "$cross_compiling" >&6; } + + rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out + ac_clean_files=$ac_clean_files_save +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +-$as_echo_n "checking for suffix of object files... " >&6; } +-if ${ac_cv_objext+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 ++printf %s "checking for suffix of object files... " >&6; } ++if test ${ac_cv_objext+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; +@@ -3473,11 +3986,12 @@ case "(($ac_try" in + *) ac_try_echo=$ac_try;; + esac + eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 ++printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } ++then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in +@@ -3486,31 +4000,32 @@ $as_echo "$ac_try_echo"; } >&5 + break;; + esac + done +-else +- $as_echo "$as_me: failed program was:" >&5 ++else $as_nop ++ printf "%s\n" "$as_me: failed program was:" >&5 + sed 's/^/| /' conftest.$ac_ext >&5 + +-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot compute suffix of object files: cannot compile + See \`config.log' for more details" "$LINENO" 5; } + fi + rm -f conftest.$ac_cv_objext conftest.$ac_ext + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +-$as_echo "$ac_cv_objext" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 ++printf "%s\n" "$ac_cv_objext" >&6; } + OBJEXT=$ac_cv_objext + ac_objext=$OBJEXT +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if ${ac_cv_c_compiler_gnu+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 ++printf %s "checking whether the compiler supports GNU C... " >&6; } ++if test ${ac_cv_c_compiler_gnu+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + #ifndef __GNUC__ + choke me +@@ -3520,29 +4035,33 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_compiler_gnu=yes +-else ++else $as_nop + ac_compiler_gnu=no + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_c_compiler_gnu=$ac_compiler_gnu + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +-$as_echo "$ac_cv_c_compiler_gnu" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 ++printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ++ac_compiler_gnu=$ac_cv_c_compiler_gnu ++ + if test $ac_compiler_gnu = yes; then + GCC=yes + else + GCC= + fi +-ac_test_CFLAGS=${CFLAGS+set} ++ac_test_CFLAGS=${CFLAGS+y} + ac_save_CFLAGS=$CFLAGS +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +-$as_echo_n "checking whether $CC accepts -g... " >&6; } +-if ${ac_cv_prog_cc_g+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 ++printf %s "checking whether $CC accepts -g... " >&6; } ++if test ${ac_cv_prog_cc_g+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no +@@ -3551,57 +4070,60 @@ else + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_cv_prog_cc_g=yes +-else ++else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-else ++else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + ac_cv_prog_cc_g=yes + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +-$as_echo "$ac_cv_prog_cc_g" >&6; } +-if test "$ac_test_CFLAGS" = set; then ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 ++printf "%s\n" "$ac_cv_prog_cc_g" >&6; } ++if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS + elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then +@@ -3616,94 +4138,144 @@ else + CFLAGS= + fi + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c89=no ++ac_prog_cc_stdc=no ++if test x$ac_prog_cc_stdc = xno ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 ++printf %s "checking for $CC option to enable C11 features... " >&6; } ++if test ${ac_cv_prog_cc_c11+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ ac_cv_prog_cc_c11=no + ac_save_CC=$CC + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +-#include +-struct stat; +-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +-struct buf { int x; }; +-FILE * (*rcsopen) (struct buf *, struct stat *, int); +-static char *e (p, i) +- char **p; +- int i; +-{ +- return p[i]; +-} +-static char *f (char * (*g) (char **, int), char **p, ...) +-{ +- char *s; +- va_list v; +- va_start (v,p); +- s = g (p, va_arg (v,int)); +- va_end (v); +- return s; +-} +- +-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has +- function prototypes and stuff, but not '\xHH' hex character constants. +- These don't provoke an error unfortunately, instead are silently treated +- as 'x'. The following induces an error, until -std is added to get +- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an +- array size at least. It's necessary to write '\x00'==0 to get something +- that's true only with -std. */ +-int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++$ac_c_conftest_c11_program ++_ACEOF ++for ac_arg in '' -std=gnu11 ++do ++ CC="$ac_save_CC $ac_arg" ++ if ac_fn_c_try_compile "$LINENO" ++then : ++ ac_cv_prog_cc_c11=$ac_arg ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam ++ test "x$ac_cv_prog_cc_c11" != "xno" && break ++done ++rm -f conftest.$ac_ext ++CC=$ac_save_CC ++fi + +-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters +- inside strings and character constants. */ +-#define FOO(x) 'x' +-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; ++if test "x$ac_cv_prog_cc_c11" = xno ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 ++printf "%s\n" "unsupported" >&6; } ++else $as_nop ++ if test "x$ac_cv_prog_cc_c11" = x ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 ++printf "%s\n" "none needed" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 ++printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } ++ CC="$CC $ac_cv_prog_cc_c11" ++fi ++ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ++ ac_prog_cc_stdc=c11 ++fi ++fi ++if test x$ac_prog_cc_stdc = xno ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 ++printf %s "checking for $CC option to enable C99 features... " >&6; } ++if test ${ac_cv_prog_cc_c99+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ ac_cv_prog_cc_c99=no ++ac_save_CC=$CC ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$ac_c_conftest_c99_program ++_ACEOF ++for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= ++do ++ CC="$ac_save_CC $ac_arg" ++ if ac_fn_c_try_compile "$LINENO" ++then : ++ ac_cv_prog_cc_c99=$ac_arg ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam ++ test "x$ac_cv_prog_cc_c99" != "xno" && break ++done ++rm -f conftest.$ac_ext ++CC=$ac_save_CC ++fi + +-int test (int i, double x); +-struct s1 {int (*f) (int a);}; +-struct s2 {int (*f) (double a);}; +-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +-int argc; +-char **argv; +-int +-main () +-{ +-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +- ; +- return 0; +-} ++if test "x$ac_cv_prog_cc_c99" = xno ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 ++printf "%s\n" "unsupported" >&6; } ++else $as_nop ++ if test "x$ac_cv_prog_cc_c99" = x ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 ++printf "%s\n" "none needed" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 ++printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } ++ CC="$CC $ac_cv_prog_cc_c99" ++fi ++ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ++ ac_prog_cc_stdc=c99 ++fi ++fi ++if test x$ac_prog_cc_stdc = xno ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 ++printf %s "checking for $CC option to enable C89 features... " >&6; } ++if test ${ac_cv_prog_cc_c89+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ ac_cv_prog_cc_c89=no ++ac_save_CC=$CC ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++$ac_c_conftest_c89_program + _ACEOF +-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ +- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" ++for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" + do + CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : ++ if ac_fn_c_try_compile "$LINENO" ++then : + ac_cv_prog_cc_c89=$ac_arg + fi +-rm -f core conftest.err conftest.$ac_objext ++rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break + done + rm -f conftest.$ac_ext + CC=$ac_save_CC +- + fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c89" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c89" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c89" != xno; then : + ++if test "x$ac_cv_prog_cc_c89" = xno ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 ++printf "%s\n" "unsupported" >&6; } ++else $as_nop ++ if test "x$ac_cv_prog_cc_c89" = x ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 ++printf "%s\n" "none needed" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 ++printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } ++ CC="$CC $ac_cv_prog_cc_c89" ++fi ++ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ++ ac_prog_cc_stdc=c89 ++fi + fi + + ac_ext=c +@@ -3717,40 +4289,36 @@ ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +-$as_echo_n "checking how to run the C preprocessor... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 ++printf %s "checking how to run the C preprocessor... " >&6; } + # On Suns, sometimes $CPP names a directory. + if test -n "$CPP" && test -d "$CPP"; then + CPP= + fi + if test -z "$CPP"; then +- if ${ac_cv_prog_CPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CPP needs to be expanded +- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" ++ if test ${ac_cv_prog_CPP+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ # Double quotes because $CC needs to be expanded ++ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false + for ac_c_preproc_warn_flag in '' yes + do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif ++#include + Syntax error + _ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : ++if ac_fn_c_try_cpp "$LINENO" ++then : + +-else ++else $as_nop + # Broken: fails on valid input. + continue + fi +@@ -3762,10 +4330,11 @@ rm -f conftest.err conftest.i conftest.$ + /* end confdefs.h. */ + #include + _ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : ++if ac_fn_c_try_cpp "$LINENO" ++then : + # Broken: success on invalid input. + continue +-else ++else $as_nop + # Passes both tests. + ac_preproc_ok=: + break +@@ -3775,7 +4344,8 @@ rm -f conftest.err conftest.i conftest.$ + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. + rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : ++if $ac_preproc_ok ++then : + break + fi + +@@ -3787,29 +4357,24 @@ fi + else + ac_cv_prog_CPP=$CPP + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +-$as_echo "$CPP" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 ++printf "%s\n" "$CPP" >&6; } + ac_preproc_ok=false + for ac_c_preproc_warn_flag in '' yes + do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif ++#include + Syntax error + _ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : ++if ac_fn_c_try_cpp "$LINENO" ++then : + +-else ++else $as_nop + # Broken: fails on valid input. + continue + fi +@@ -3821,10 +4386,11 @@ rm -f conftest.err conftest.i conftest.$ + /* end confdefs.h. */ + #include + _ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : ++if ac_fn_c_try_cpp "$LINENO" ++then : + # Broken: success on invalid input. + continue +-else ++else $as_nop + # Passes both tests. + ac_preproc_ok=: + break +@@ -3834,11 +4400,12 @@ rm -f conftest.err conftest.i conftest.$ + done + # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. + rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : ++if $ac_preproc_ok ++then : + +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++else $as_nop ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "C preprocessor \"$CPP\" fails sanity check + See \`config.log' for more details" "$LINENO" 5; } + fi +@@ -3858,32 +4425,34 @@ fi + + add_arg_to_cflags() { + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAG $1" >&5 +-$as_echo_n "checking for CFLAG $1... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFLAG $1" >&5 ++printf %s "checking for CFLAG $1... " >&6; } + CFLAGS_ORI=$CFLAGS + CFLAGS="$CFLAGS -Werror $1 `echo $1|sed 's,-Wno-,-W,1'`" + +-if test "$cross_compiling" = yes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-else ++if test "$cross_compiling" = yes ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- CFLAGS="$CFLAGS_ORI $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; };return 0 +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ CFLAGS="$CFLAGS_ORI $1";{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; };return 0 ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -3895,8 +4464,8 @@ fi + } + + assert_arg_to_cflags() { +- if ! add_arg_to_cflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5 +-$as_echo "cannot add $1 to CFLAGS" >&6; }; exit 1 ; fi ++ if ! add_arg_to_cflags $1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5 ++printf "%s\n" "cannot add $1 to CFLAGS" >&6; }; exit 1 ; fi + return 0 + } + +@@ -3910,31 +4479,33 @@ add_args_to_cflags() { + + add_arg_to_ldflags() { + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LDFLAG $1" >&5 +-$as_echo_n "checking for LDFLAG $1... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LDFLAG $1" >&5 ++printf %s "checking for LDFLAG $1... " >&6; } + LDFLAGS_ORI=$LDFLAGS + LDFLAGS="$LDFLAGS -Werror $1" +- if test "$cross_compiling" = yes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-else ++ if test "$cross_compiling" = yes ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- LDFLAGS="$LDFLAGS_ORI $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; };return 0 +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ LDFLAGS="$LDFLAGS_ORI $1";{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; };return 0 ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -3946,8 +4517,8 @@ fi + } + + assert_arg_to_ldflags() { +- if ! add_arg_to_ldflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to LDFLAGS" >&5 +-$as_echo "cannot add $1 to LDFLAGS" >&6; }; exit 1 ; fi ++ if ! add_arg_to_ldflags $1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to LDFLAGS" >&5 ++printf "%s\n" "cannot add $1 to LDFLAGS" >&6; }; exit 1 ; fi + return 0 + } + +@@ -3966,8 +4537,8 @@ remove_arg_from_ldflags() { + if ! test "$i" = "$1" ; then + NEW_LDFLAGS="$NEW_LDFLAGS $i" + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: removing $1 from LDFLAGS" >&5 +-$as_echo "removing $1 from LDFLAGS" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: removing $1 from LDFLAGS" >&5 ++printf "%s\n" "removing $1 from LDFLAGS" >&6; } + fi + done + LDFLAGS=$NEW_LDFLAGS +@@ -3983,16 +4554,17 @@ add_args_to_cflags -fsigned-char -pipe + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ + -Wno-unused-but-set-variable + +-add_args_to_ldflags -no-pie -Wl,-z,lazy ++add_args_to_ldflags -no-pie # -Wl,-z,lazy + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 +-$as_echo_n "checking for clang... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 ++printf %s "checking for clang... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -4003,7 +4575,7 @@ else + #endif + + int +-main () ++main (void) + { + + return RET; +@@ -4012,17 +4584,18 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + clang="yes" + remove_arg_from_ldflags -pie + +-$as_echo "#define CLANG 1" >>confdefs.h ++printf "%s\n" "#define CLANG 1" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -4057,7 +4630,7 @@ if test "$enable_static" = "yes" ; then + assert_arg_to_ldflags -static + assert_arg_to_ldflags -Wl,-zmuldefs + +-$as_echo "#define STATIC_LINKING 1" >>confdefs.h ++printf "%s\n" "#define STATIC_LINKING 1" >>confdefs.h + + fi + +@@ -4077,11 +4650,12 @@ for ac_prog in gawk nawk awk + do + # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AWK+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_AWK+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. + else +@@ -4089,11 +4663,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -4104,11 +4682,11 @@ fi + fi + AWK=$ac_cv_prog_AWK + if test -n "$AWK"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +-$as_echo "$AWK" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 ++printf "%s\n" "$AWK" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -4117,10 +4695,11 @@ done + + + # Check whether --enable-gprof was given. +-if test "${enable_gprof+set}" = set; then : ++if test ${enable_gprof+y} ++then : + enableval=$enable_gprof; if test "$enableval" = "yes" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking working gprof" >&5 +-$as_echo_n "checking working gprof... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking working gprof" >&5 ++printf %s "checking working gprof... " >&6; } + case $use in + powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; + s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 +@@ -4134,18 +4713,18 @@ $as_echo_n "checking working gprof... " + esac + GP_FLAG="" + if test "$enableval" != "yes" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +-$as_echo "disabled" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 ++printf "%s\n" "disabled" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +-$as_echo "ok" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 ++printf "%s\n" "ok" >&6; } + OLD_CFLAGS=$CFLAGS # Do not run configure tests with -pg + assert_arg_to_cflags -pg + GP_FLAG="-pg" + CFLAGS=$OLD_CFLAGS + TFPFLAG="" + +-$as_echo "#define GCL_GPROF 1" >>confdefs.h ++printf "%s\n" "#define GCL_GPROF 1" >>confdefs.h + + fi + fi +@@ -4190,12 +4769,12 @@ case $use in + ;; + arm*) + +-$as_echo "#define SET_STACK_POINTER \"mov %%sp,%0\\n\\t\"" >>confdefs.h ++printf "%s\n" "#define SET_STACK_POINTER \"mov %%sp,%0\\n\\t\"" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to set stack pointer" >&5 +-$as_echo_n "checking how to set stack pointer... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +-$as_echo "done" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to set stack pointer" >&5 ++printf %s "checking how to set stack pointer... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 ++printf "%s\n" "done" >&6; } + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +@@ -4257,11 +4836,12 @@ for ac_prog in makeinfo + do + # Extract the first word of "$ac_prog", so it can be a program name with args. + set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_MAKEINFO+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_MAKEINFO+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$MAKEINFO"; then + ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. + else +@@ -4269,11 +4849,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MAKEINFO="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -4284,11 +4868,11 @@ fi + fi + MAKEINFO=$ac_cv_prog_MAKEINFO + if test -n "$MAKEINFO"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 +-$as_echo "$MAKEINFO" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5 ++printf "%s\n" "$MAKEINFO" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -4298,8 +4882,8 @@ test -n "$MAKEINFO" || MAKEINFO=""false" + + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking system version (for dynamic loading)" >&5 +-$as_echo_n "checking system version (for dynamic loading)... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking system version (for dynamic loading)" >&5 ++printf %s "checking system version (for dynamic loading)... " >&6; } + if machine=`uname -m` ; then true; else machine=unknown ; fi + + if test -f /usr/lib/NextStep/software_version; then +@@ -4307,8 +4891,8 @@ if test -f /usr/lib/NextStep/software_ve + else + system=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown (cannot find uname command)" >&5 +-$as_echo "unknown (cannot find uname command)" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unknown (cannot find uname command)" >&5 ++printf "%s\n" "unknown (cannot find uname command)" >&6; } + system=unknown + else + # Special check for weird MP-RAS system (uname returns weird +@@ -4320,294 +4904,62 @@ $as_echo "unknown (cannot find uname com + if test "`uname -s`" = "AIX" ; then + system=AIX-`uname -v`.`uname -r` + fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $system" >&5 +-$as_echo "$system" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $system" >&5 ++printf "%s\n" "$system" >&6; } + fi + fi + + case $use in + *macosx) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +-$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if ${ac_cv_path_GREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$GREP"; then +- ac_path_GREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++ ac_header= ac_cache= ++for ac_item in $ac_header_c_list + do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in grep ggrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_GREP" || continue +-# Check for GNU ac_path_GREP and select it if it is found. +- # Check for GNU $ac_path_GREP +-case `"$ac_path_GREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'GREP' >> "conftest.nl" +- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_GREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_GREP="$ac_path_GREP" +- ac_path_GREP_max=$ac_count ++ if test $ac_cache; then ++ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" ++ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then ++ printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_GREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_GREP"; then +- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_GREP=$GREP +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +-$as_echo "$ac_cv_path_GREP" >&6; } +- GREP="$ac_cv_path_GREP" +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +-$as_echo_n "checking for egrep... " >&6; } +-if ${ac_cv_path_EGREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +- then ac_cv_path_EGREP="$GREP -E" +- else +- if test -z "$EGREP"; then +- ac_path_EGREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in egrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_EGREP" || continue +-# Check for GNU ac_path_EGREP and select it if it is found. +- # Check for GNU $ac_path_EGREP +-case `"$ac_path_EGREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'EGREP' >> "conftest.nl" +- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_EGREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_EGREP="$ac_path_EGREP" +- ac_path_EGREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_EGREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_EGREP"; then +- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ ac_header= ac_cache= ++ elif test $ac_header; then ++ ac_cache=$ac_item ++ else ++ ac_header=$ac_item + fi +-else +- ac_cv_path_EGREP=$EGREP +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +-$as_echo "$ac_cv_path_EGREP" >&6; } +- EGREP="$ac_cv_path_EGREP" +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +-$as_echo_n "checking for ANSI C header files... " >&6; } +-if ${ac_cv_header_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include ++done + +-int +-main () +-{ + +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_stdc=yes +-else +- ac_cv_header_stdc=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +-if test $ac_cv_header_stdc = yes; then +- # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include + +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "memchr" >/dev/null 2>&1; then : + +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* + +-fi + +-if test $ac_cv_header_stdc = yes; then +- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include + +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "free" >/dev/null 2>&1; then : ++if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes ++then : + +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* ++printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + + fi +- +-if test $ac_cv_header_stdc = yes; then +- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +- if test "$cross_compiling" = yes; then : +- : +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#if ((' ' & 0x0FF) == 0x020) +-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +-#else +-# define ISLOWER(c) \ +- (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) +-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +-#endif +- +-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +-int +-main () +-{ +- int i; +- for (i = 0; i < 256; i++) +- if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) +- return 2; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +-$as_echo "$ac_cv_header_stdc" >&6; } +-if test $ac_cv_header_stdc = yes; then +- +-$as_echo "#define STDC_HEADERS 1" >>confdefs.h +- +-fi +- +-# On IRIX 5.3, sys/types and inttypes.h are conflicting. +-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ +- inttypes.h stdint.h unistd.h ++ for ac_header in malloc/malloc.h + do : +- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +-" +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +-_ACEOF +- +-fi ++ ac_fn_c_check_header_compile "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" ++if test "x$ac_cv_header_malloc_malloc_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_MALLOC_MALLOC_H 1" >>confdefs.h + +-done +- +- +-for ac_header in malloc/malloc.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "malloc/malloc.h" "ac_cv_header_malloc_malloc_h" "$ac_includes_default" +-if test "x$ac_cv_header_malloc_malloc_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_MALLOC_MALLOC_H 1 +-_ACEOF +- +-else ++else $as_nop + as_fn_error $? "need malloc.h on macosx" "$LINENO" 5 + fi + + done +- + ac_fn_c_check_member "$LINENO" "struct _malloc_zone_t" "memalign" "ac_cv_member_struct__malloc_zone_t_memalign" " + #include + + " +-if test "x$ac_cv_member_struct__malloc_zone_t_memalign" = xyes; then : ++if test "x$ac_cv_member_struct__malloc_zone_t_memalign" = xyes ++then : + +-$as_echo "#define HAVE_MALLOC_ZONE_MEMALIGN 1" >>confdefs.h ++printf "%s\n" "#define HAVE_MALLOC_ZONE_MEMALIGN 1" >>confdefs.h + + fi + +@@ -4615,21 +4967,21 @@ fi + ;; + esac + +-for ac_header in setjmp.h ++ for ac_header in setjmp.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "setjmp.h" "ac_cv_header_setjmp_h" "$ac_includes_default" +-if test "x$ac_cv_header_setjmp_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_SETJMP_H 1 +-_ACEOF +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof jmp_buf" >&5 +-$as_echo_n "checking sizeof jmp_buf... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ ac_fn_c_check_header_compile "$LINENO" "setjmp.h" "ac_cv_header_setjmp_h" "$ac_includes_default" ++if test "x$ac_cv_header_setjmp_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_SETJMP_H 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking sizeof jmp_buf" >&5 ++printf %s "checking sizeof jmp_buf... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -4637,7 +4989,7 @@ else + #include + + int +-main () ++main (void) + { + + FILE *fp=fopen("conftest1","w"); +@@ -4648,18 +5000,17 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + sizeof_jmp_buf=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_jmp_buf" >&5 +-$as_echo "$sizeof_jmp_buf" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $sizeof_jmp_buf" >&5 ++printf "%s\n" "$sizeof_jmp_buf" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define SIZEOF_JMP_BUF $sizeof_jmp_buf +-_ACEOF ++printf "%s\n" "#define SIZEOF_JMP_BUF $sizeof_jmp_buf" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -4669,20 +5020,19 @@ fi + + done + +- + # sysconf +-for ac_header in unistd.h ++ for ac_header in unistd.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +-if test "x$ac_cv_header_unistd_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_UNISTD_H 1 +-_ACEOF +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysconf in -lc" >&5 +-$as_echo_n "checking for sysconf in -lc... " >&6; } +-if ${ac_cv_lib_c_sysconf+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" ++if test "x$ac_cv_header_unistd_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysconf in -lc" >&5 ++printf %s "checking for sysconf in -lc... " >&6; } ++if test ${ac_cv_lib_c_sysconf+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lc $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -4691,39 +5041,39 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char sysconf (); + int +-main () ++main (void) + { + return sysconf (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_c_sysconf=yes +-else ++else $as_nop + ac_cv_lib_c_sysconf=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sysconf" >&5 +-$as_echo "$ac_cv_lib_c_sysconf" >&6; } +-if test "x$ac_cv_lib_c_sysconf" = xyes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking _SC_CLK_TCK" >&5 +-$as_echo_n "checking _SC_CLK_TCK... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_sysconf" >&5 ++printf "%s\n" "$ac_cv_lib_c_sysconf" >&6; } ++if test "x$ac_cv_lib_c_sysconf" = xyes ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking _SC_CLK_TCK" >&5 ++printf %s "checking _SC_CLK_TCK... " >&6; } + hz=0 +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -4731,7 +5081,7 @@ else + #include + + int +-main () ++main (void) + { + + FILE *fp=fopen("conftest1","w"); +@@ -4742,15 +5092,16 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hz" >&5 +-$as_echo "$hz" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hz" >&5 ++printf "%s\n" "$hz" >&6; } + fi + + fi +@@ -4758,28 +5109,28 @@ fi + done + + +- + rm -f makedefsafter + + # Check whether --enable-dynsysgmp was given. +-if test "${enable_dynsysgmp+set}" = set; then : ++if test ${enable_dynsysgmp+y} ++then : + enableval=$enable_dynsysgmp; + fi + + + if test "$enable_dynsysgmp" != "no" ; then +- for ac_header in gmp.h ++ for ac_header in gmp.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" +-if test "x$ac_cv_header_gmp_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_GMP_H 1 +-_ACEOF +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 +-$as_echo_n "checking for __gmpz_init in -lgmp... " >&6; } +-if ${ac_cv_lib_gmp___gmpz_init+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ ac_fn_c_check_header_compile "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" ++if test "x$ac_cv_header_gmp_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_GMP_H 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init in -lgmp" >&5 ++printf %s "checking for __gmpz_init in -lgmp... " >&6; } ++if test ${ac_cv_lib_gmp___gmpz_init+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lgmp $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -4788,45 +5139,45 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char __gmpz_init (); + int +-main () ++main (void) + { + return __gmpz_init (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_gmp___gmpz_init=yes +-else ++else $as_nop + ac_cv_lib_gmp___gmpz_init=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 +-$as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } +-if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for external gmp version" >&5 +-$as_echo_n "checking for external gmp version... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 ++printf "%s\n" "$ac_cv_lib_gmp___gmpz_init" >&6; } ++if test "x$ac_cv_lib_gmp___gmpz_init" = xyes ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for external gmp version" >&5 ++printf %s "checking for external gmp version... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + #if __GNU_MP_VERSION > 3 +@@ -4839,9 +5190,10 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: good" >&5 +-$as_echo "good" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: good" >&5 ++printf "%s\n" "good" >&6; } + TLIBS="$TLIBS -lgmp" + echo "#include \"gmp.h\"" >foo.c + echo "int main() {return 0;}" >>foo.c +@@ -4858,10 +5210,9 @@ fi + + done + +- + if test "$MP_INCLUDE" = "" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cannot use dynamic gmp lib" >&5 +-$as_echo "Cannot use dynamic gmp lib" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Cannot use dynamic gmp lib" >&5 ++printf "%s\n" "Cannot use dynamic gmp lib" >&6; } + fi + + fi +@@ -4870,8 +5221,8 @@ fi + if test "$MP_INCLUDE" = "" ; then + + GMPDIR=gmp4 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking doing configure in gmp directory" >&5 +-$as_echo_n "checking doing configure in gmp directory... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking doing configure in gmp directory" >&5 ++printf %s "checking doing configure in gmp directory... " >&6; } + echo + echo "#" + echo "#" +@@ -4901,8 +5252,8 @@ $as_echo_n "checking doing configure in + fi + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for leading underscore in object symbols" >&5 +-$as_echo_n "checking for leading underscore in object symbols... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for leading underscore in object symbols" >&5 ++printf %s "checking for leading underscore in object symbols... " >&6; } + cat>foo.c < + #include +@@ -4912,43 +5263,44 @@ $CC -c foo.c -o foo.o + if nm foo.o |grep " U " | grep "_cos" >/dev/null || nm foo.o |grep " U " | grep " _getc" >/dev/null ; then + LEADING_UNDERSCORE=1 + +-$as_echo "#define LEADING_UNDERSCORE 1" >>confdefs.h ++printf "%s\n" "#define LEADING_UNDERSCORE 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 +-$as_echo "\"yes\"" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 ++printf "%s\n" "\"yes\"" >&6; } + else + LEADING_UNDERSCORE="" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 +-$as_echo "\"no\"" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 ++printf "%s\n" "\"no\"" >&6; } + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking \"for GNU ld option -Map\"" >&5 +-$as_echo_n "checking \"for GNU ld option -Map\"... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking \"for GNU ld option -Map\"" >&5 ++printf %s "checking \"for GNU ld option -Map\"... " >&6; } + touch map + $CC -o foo -Wl,-Map map foo.o >/dev/null 2>&1 + if test `cat map | wc -l` != "0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 +-$as_echo "\"yes\"" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 ++printf "%s\n" "\"yes\"" >&6; } + +-$as_echo "#define HAVE_GNU_LD 1" >>confdefs.h ++printf "%s\n" "#define HAVE_GNU_LD 1" >>confdefs.h + + GNU_LD=1 + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 +-$as_echo "\"no\"" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 ++printf "%s\n" "\"no\"" >&6; } + GNU_LD= + fi + rm -f foo.c foo.o foo map + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for size of gmp limbs" >&5 +-$as_echo_n "checking for size of gmp limbs... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for size of gmp limbs" >&5 ++printf %s "checking for size of gmp limbs... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -4956,7 +5308,7 @@ else + #include "$MP_INCLUDE" + + int +-main () ++main (void) + { + + FILE *fp=fopen("conftest1","w"); +@@ -4967,9 +5319,10 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + mpsize=`cat conftest1` +-else ++else $as_nop + as_fn_error $? "Cannot determine mpsize" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -4977,21 +5330,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-cat >>confdefs.h <<_ACEOF +-#define MP_LIMB_BYTES $mpsize +-_ACEOF ++printf "%s\n" "#define MP_LIMB_BYTES $mpsize" >>confdefs.h + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpsize" >&5 +-$as_echo "$mpsize" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $mpsize" >&5 ++printf "%s\n" "$mpsize" >&6; } + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking _SHORT_LIMB" >&5 +-$as_echo_n "checking _SHORT_LIMB... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking _SHORT_LIMB" >&5 ++printf %s "checking _SHORT_LIMB... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -4999,7 +5351,7 @@ else + #include "$MP_INCLUDE" + + int +-main () ++main (void) + { + + #ifdef _SHORT_LIMB +@@ -5012,28 +5364,30 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define __SHORT_LIMB 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++printf "%s\n" "#define __SHORT_LIMB 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking _LONG_LONG_LIMB" >&5 +-$as_echo_n "checking _LONG_LONG_LIMB... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking _LONG_LONG_LIMB" >&5 ++printf %s "checking _LONG_LONG_LIMB... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5041,7 +5395,7 @@ else + #include "$MP_INCLUDE" + + int +-main () ++main (void) + { + + #ifdef _LONG_LONG_LIMB +@@ -5054,14 +5408,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define __LONG_LONG_LIMB 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++printf "%s\n" "#define __LONG_LONG_LIMB 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -5070,7 +5425,7 @@ fi + + GMP=1 + +-$as_echo "#define GMP 1" >>confdefs.h ++printf "%s\n" "#define GMP 1" >>confdefs.h + + + +@@ -5087,12 +5442,14 @@ echo >> makedefsafter + + if test "$enable_xgcl" = "yes" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +-$as_echo_n "checking for X... " >&6; } ++ ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for X" >&5 ++printf %s "checking for X... " >&6; } + + + # Check whether --with-x was given. +-if test "${with_x+set}" = set; then : ++if test ${with_x+y} ++then : + withval=$with_x; + fi + +@@ -5103,12 +5460,41 @@ if test "x$with_x" = xno; then + else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( +- *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ *,NONE | NONE,*) if test ${ac_cv_have_x+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + # One or both of the vars are not set, and there is no cached value. +-ac_x_includes=no ac_x_libraries=no +-rm -f -r conftest.dir ++ac_x_includes=no ++ac_x_libraries=no ++# Do we need to do anything special at all? ++ac_save_LIBS=$LIBS ++LIBS="-lX11 $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++#include ++int ++main (void) ++{ ++XrmInitialize () ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO" ++then : ++ # We can compile and link X programs with no special options. ++ ac_x_includes= ++ ac_x_libraries= ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS="$ac_save_LIBS" ++# If that didn't work, only try xmkmf and file system searches ++# for native compilation. ++if test x"$ac_x_includes" = xno && test "$cross_compiling" = no ++then : ++ rm -f -r conftest.dir + if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +@@ -5147,7 +5533,7 @@ _ACEOF + rm -f -r conftest.dir + fi + +-# Standard set of common directories for X headers. ++ # Standard set of common directories for X headers. + # Check X11 before X11Rn because it is often a symlink to the current release. + ac_x_header_dirs=' + /usr/X11/include +@@ -5174,6 +5560,8 @@ ac_x_header_dirs=' + /usr/local/include/X11R5 + /usr/local/include/X11R4 + ++/opt/X11/include ++ + /usr/X386/include + /usr/x386/include + /usr/XFree86/include/X11 +@@ -5195,10 +5583,11 @@ if test "$ac_x_includes" = no; then + /* end confdefs.h. */ + #include + _ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : ++if ac_fn_c_try_cpp "$LINENO" ++then : + # We can compile using X headers with no special include directory. + ac_x_includes= +-else ++else $as_nop + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir +@@ -5219,20 +5608,21 @@ if test "$ac_x_libraries" = no; then + /* end confdefs.h. */ + #include + int +-main () ++main (void) + { + XrmInitialize () + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + LIBS=$ac_save_LIBS + # We can link X programs with no special library path. + ac_x_libraries= +-else ++else $as_nop + LIBS=$ac_save_LIBS +-for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` ++for ac_dir in `printf "%s\n" "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` + do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do +@@ -5243,19 +5633,21 @@ do + done + done + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi # $ac_x_libraries = no + ++fi ++# Record the results. + case $ac_x_includes,$ac_x_libraries in #( +- no,* | *,no | *\'*) ++ no,* | *,no | *\'*) : + # Didn't find X, or a directory has "'" in its name. +- ac_cv_have_x="have_x=no";; #( +- *) ++ ac_cv_have_x="have_x=no" ;; #( ++ *) : + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ +- ac_x_libraries='$ac_x_libraries'" ++ ac_x_libraries='$ac_x_libraries'" ;; + esac + fi + ;; #( +@@ -5265,8 +5657,8 @@ fi + fi # $with_x != no + + if test "$have_x" != yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +-$as_echo "$have_x" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 ++printf "%s\n" "$have_x" >&6; } + no_x=yes + else + # If each of the values was on the command line, it overrides each guess. +@@ -5276,16 +5668,17 @@ else + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +-$as_echo "libraries $x_libraries, headers $x_includes" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 ++printf "%s\n" "libraries $x_libraries, headers $x_includes" >&6; } + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 +-$as_echo_n "checking for main in -lX11... " >&6; } +-if ${ac_cv_lib_X11_main+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 ++printf %s "checking for main in -lX11... " >&6; } ++if test ${ac_cv_lib_X11_main+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5293,31 +5686,33 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + + + int +-main () ++main (void) + { + return main (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_X11_main=yes +-else ++else $as_nop + ac_cv_lib_X11_main=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_main" >&5 +-$as_echo "$ac_cv_lib_X11_main" >&6; } +-if test "x$ac_cv_lib_X11_main" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_main" >&5 ++printf "%s\n" "$ac_cv_lib_X11_main" >&6; } ++if test "x$ac_cv_lib_X11_main" = xyes ++then : + X_LIBS="$X_LIBS -lX11" +-$as_echo "#define HAVE_XGCL 1" >>confdefs.h ++printf "%s\n" "#define HAVE_XGCL 1" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: missing x libraries -- cannot compile xgcl" >&5 +-$as_echo "missing x libraries -- cannot compile xgcl" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: missing x libraries -- cannot compile xgcl" >&5 ++printf "%s\n" "missing x libraries -- cannot compile xgcl" >&6; } + fi + + +@@ -5333,11 +5728,12 @@ fi + + if test "$enable_dlopen" = "yes" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +-$as_echo_n "checking for dlopen in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 ++printf %s "checking for dlopen in -ldl... " >&6; } ++if test ${ac_cv_lib_dl_dlopen+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldl $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5346,37 +5742,34 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char dlopen (); + int +-main () ++main (void) + { + return dlopen (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_dl_dlopen=yes +-else ++else $as_nop + ac_cv_lib_dl_dlopen=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +-$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_LIBDL 1 +-_ACEOF ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 ++printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } ++if test "x$ac_cv_lib_dl_dlopen" = xyes ++then : ++ printf "%s\n" "#define HAVE_LIBDL 1" >>confdefs.h + + LIBS="-ldl $LIBS" + +-else ++else $as_nop + as_fn_error $? "Cannot find dlopen" "$LINENO" 5 + fi + +@@ -5384,24 +5777,24 @@ fi + TLIBS="$TLIBS -ldl -rdynamic" + assert_arg_to_cflags -fPIC + +-$as_echo "#define USE_DLOPEN 1" >>confdefs.h ++printf "%s\n" "#define USE_DLOPEN 1" >>confdefs.h + + + fi + + if test "$enable_statsysbfd" = "yes" || test "$enable_dynsysbfd" = "yes" ; then +- for ac_header in bfd.h ++ for ac_header in bfd.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" +-if test "x$ac_cv_header_bfd_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_BFD_H 1 +-_ACEOF +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bfd_init in -lbfd" >&5 +-$as_echo_n "checking for bfd_init in -lbfd... " >&6; } +-if ${ac_cv_lib_bfd_bfd_init+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ ac_fn_c_check_header_compile "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" ++if test "x$ac_cv_header_bfd_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_BFD_H 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bfd_init in -lbfd" >&5 ++printf %s "checking for bfd_init in -lbfd... " >&6; } ++if test ${ac_cv_lib_bfd_bfd_init+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lbfd -liberty $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5410,38 +5803,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char bfd_init (); + int +-main () ++main (void) + { + return bfd_init (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_bfd_bfd_init=yes +-else ++else $as_nop + ac_cv_lib_bfd_bfd_init=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bfd_bfd_init" >&5 +-$as_echo "$ac_cv_lib_bfd_bfd_init" >&6; } +-if test "x$ac_cv_lib_bfd_bfd_init" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bfd_bfd_init" >&5 ++printf "%s\n" "$ac_cv_lib_bfd_bfd_init" >&6; } ++if test "x$ac_cv_lib_bfd_bfd_init" = xyes ++then : + # + # Old binutils appear to need CONST defined to const + # +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking need to define CONST for bfd" >&5 +-$as_echo_n "checking need to define CONST for bfd... " >&6; } +- if test "$cross_compiling" = yes; then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking need to define CONST for bfd" >&5 ++printf %s "checking need to define CONST for bfd... " >&6; } ++ if test "$cross_compiling" = yes ++then : + as_fn_error $? "cannot use bfd" "$LINENO" 5 +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5449,7 +5842,7 @@ else + #include + + int +-main () ++main (void) + { + + symbol_info t; +@@ -5458,13 +5851,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-else +- if test "$cross_compiling" = yes; then : ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++else $as_nop ++ if test "$cross_compiling" = yes ++then : + as_fn_error $? "cannot use bfd" "$LINENO" 5 +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5473,7 +5868,7 @@ else + #include + + int +-main () ++main (void) + { + + symbol_info t; +@@ -5482,13 +5877,14 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + +-$as_echo "#define NEED_CONST 1" >>confdefs.h ++printf "%s\n" "#define NEED_CONST 1" >>confdefs.h + +-else ++else $as_nop + as_fn_error $? "cannot use bfd" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -5508,22 +5904,22 @@ fi + done + + +- +-$as_echo "#define HAVE_LIBBFD 1" >>confdefs.h ++printf "%s\n" "#define HAVE_LIBBFD 1" >>confdefs.h + + + # + # BFD boolean syntax + # + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for useable bfd_boolean" >&5 +-$as_echo_n "checking for useable bfd_boolean... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for useable bfd_boolean" >&5 ++printf %s "checking for useable bfd_boolean... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5532,22 +5928,23 @@ else + bfd_boolean foo() {return FALSE;} + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + +-$as_echo "#define HAVE_BFD_BOOLEAN 1" >>confdefs.h ++printf "%s\n" "#define HAVE_BFD_BOOLEAN 1" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -5563,9 +5960,10 @@ fi + #include + + " +-if test "x$ac_cv_member_struct_bfd_link_info_output_bfd" = xyes; then : ++if test "x$ac_cv_member_struct_bfd_link_info_output_bfd" = xyes ++then : + +-$as_echo "#define HAVE_OUTPUT_BFD 1" >>confdefs.h ++printf "%s\n" "#define HAVE_OUTPUT_BFD 1" >>confdefs.h + + fi + +@@ -5589,11 +5987,12 @@ fi + as_fn_error $? "cannot locate external libiberty.a" "$LINENO" 5 + fi + BUILD_BFD=copy_bfd +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 +-$as_echo_n "checking for inflate in -lz... " >&6; } +-if ${ac_cv_lib_z_inflate+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 ++printf %s "checking for inflate in -lz... " >&6; } ++if test ${ac_cv_lib_z_inflate+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lz $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5602,40 +6001,40 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char inflate (); + int +-main () ++main (void) + { + return inflate (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_z_inflate=yes +-else ++else $as_nop + ac_cv_lib_z_inflate=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 +-$as_echo "$ac_cv_lib_z_inflate" >&6; } +-if test "x$ac_cv_lib_z_inflate" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5 ++printf "%s\n" "$ac_cv_lib_z_inflate" >&6; } ++if test "x$ac_cv_lib_z_inflate" = xyes ++then : + TLIBS="$TLIBS -lz" +-else ++else $as_nop + as_fn_error $? "Need zlib for bfd linking" "$LINENO" 5 + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 +-$as_echo_n "checking for dlsym in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlsym+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 ++printf %s "checking for dlsym in -ldl... " >&6; } ++if test ${ac_cv_lib_dl_dlsym+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldl $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5644,32 +6043,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char dlsym (); + int +-main () ++main (void) + { + return dlsym (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_dl_dlsym=yes +-else ++else $as_nop + ac_cv_lib_dl_dlsym=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlsym" >&5 +-$as_echo "$ac_cv_lib_dl_dlsym" >&6; } +-if test "x$ac_cv_lib_dl_dlsym" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlsym" >&5 ++printf "%s\n" "$ac_cv_lib_dl_dlsym" >&6; } ++if test "x$ac_cv_lib_dl_dlsym" = xyes ++then : + TLIBS="$TLIBS -ldl" +-else ++else $as_nop + as_fn_error $? "Need libdl for bfd linking" "$LINENO" 5 + fi + +@@ -5683,7 +6081,8 @@ fi + fi + + # Check whether --enable-xdr was given. +-if test "${enable_xdr+set}" = set; then : ++if test ${enable_xdr+y} ++then : + enableval=$enable_xdr; + fi + +@@ -5691,14 +6090,16 @@ fi + if test "$enable_xdr" != "no" ; then + XDR_LIB="" + ac_fn_c_check_func "$LINENO" "xdr_double" "ac_cv_func_xdr_double" +-if test "x$ac_cv_func_xdr_double" = xyes; then : ++if test "x$ac_cv_func_xdr_double" = xyes ++then : + XDR_LIB=" " +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -ltirpc" >&5 +-$as_echo_n "checking for xdr_double in -ltirpc... " >&6; } +-if ${ac_cv_lib_tirpc_xdr_double+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -ltirpc" >&5 ++printf %s "checking for xdr_double in -ltirpc... " >&6; } ++if test ${ac_cv_lib_tirpc_xdr_double+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-ltirpc $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5707,37 +6108,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char xdr_double (); + int +-main () ++main (void) + { + return xdr_double (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_tirpc_xdr_double=yes +-else ++else $as_nop + ac_cv_lib_tirpc_xdr_double=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdr_double" >&5 +-$as_echo "$ac_cv_lib_tirpc_xdr_double" >&6; } +-if test "x$ac_cv_lib_tirpc_xdr_double" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdr_double" >&5 ++printf "%s\n" "$ac_cv_lib_tirpc_xdr_double" >&6; } ++if test "x$ac_cv_lib_tirpc_xdr_double" = xyes ++then : + XDR_LIB=tirpc +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lgssrpc" >&5 +-$as_echo_n "checking for xdr_double in -lgssrpc... " >&6; } +-if ${ac_cv_lib_gssrpc_xdr_double+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lgssrpc" >&5 ++printf %s "checking for xdr_double in -lgssrpc... " >&6; } ++if test ${ac_cv_lib_gssrpc_xdr_double+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lgssrpc $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5746,37 +6147,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char xdr_double (); + int +-main () ++main (void) + { + return xdr_double (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_gssrpc_xdr_double=yes +-else ++else $as_nop + ac_cv_lib_gssrpc_xdr_double=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssrpc_xdr_double" >&5 +-$as_echo "$ac_cv_lib_gssrpc_xdr_double" >&6; } +-if test "x$ac_cv_lib_gssrpc_xdr_double" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssrpc_xdr_double" >&5 ++printf "%s\n" "$ac_cv_lib_gssrpc_xdr_double" >&6; } ++if test "x$ac_cv_lib_gssrpc_xdr_double" = xyes ++then : + XDR_LIB=gssrpc +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lrpc" >&5 +-$as_echo_n "checking for xdr_double in -lrpc... " >&6; } +-if ${ac_cv_lib_rpc_xdr_double+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lrpc" >&5 ++printf %s "checking for xdr_double in -lrpc... " >&6; } ++if test ${ac_cv_lib_rpc_xdr_double+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lrpc $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5785,37 +6186,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char xdr_double (); + int +-main () ++main (void) + { + return xdr_double (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_rpc_xdr_double=yes +-else ++else $as_nop + ac_cv_lib_rpc_xdr_double=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rpc_xdr_double" >&5 +-$as_echo "$ac_cv_lib_rpc_xdr_double" >&6; } +-if test "x$ac_cv_lib_rpc_xdr_double" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rpc_xdr_double" >&5 ++printf "%s\n" "$ac_cv_lib_rpc_xdr_double" >&6; } ++if test "x$ac_cv_lib_rpc_xdr_double" = xyes ++then : + XDR_LIB=rpc +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -loncrpc" >&5 +-$as_echo_n "checking for xdr_double in -loncrpc... " >&6; } +-if ${ac_cv_lib_oncrpc_xdr_double+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -loncrpc" >&5 ++printf %s "checking for xdr_double in -loncrpc... " >&6; } ++if test ${ac_cv_lib_oncrpc_xdr_double+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-loncrpc $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -5824,30 +6225,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char xdr_double (); + int +-main () ++main (void) + { + return xdr_double (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_oncrpc_xdr_double=yes +-else ++else $as_nop + ac_cv_lib_oncrpc_xdr_double=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_oncrpc_xdr_double" >&5 +-$as_echo "$ac_cv_lib_oncrpc_xdr_double" >&6; } +-if test "x$ac_cv_lib_oncrpc_xdr_double" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_oncrpc_xdr_double" >&5 ++printf "%s\n" "$ac_cv_lib_oncrpc_xdr_double" >&6; } ++if test "x$ac_cv_lib_oncrpc_xdr_double" = xyes ++then : + XDR_LIB=oncrpc + fi + +@@ -5862,7 +6262,7 @@ fi + + if test "$XDR_LIB" != ""; then + +-$as_echo "#define HAVE_XDR 1" >>confdefs.h ++printf "%s\n" "#define HAVE_XDR 1" >>confdefs.h + + if test "$XDR_LIB" != " "; then + TLIBS="$TLIBS -l$XDR_LIB" +@@ -5872,14 +6272,15 @@ $as_echo "#define HAVE_XDR 1" >>confdefs + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __builtin_clzl" >&5 +-$as_echo_n "checking __builtin_clzl... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking __builtin_clzl" >&5 ++printf %s "checking __builtin_clzl... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5887,7 +6288,7 @@ else + #include + + int +-main () ++main (void) + { + + unsigned long u; +@@ -5902,29 +6303,31 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + +-$as_echo "#define HAVE_CLZL 1" >>confdefs.h ++printf "%s\n" "#define HAVE_CLZL 1" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking __builtin_ctzl" >&5 +-$as_echo_n "checking __builtin_ctzl... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking __builtin_ctzl" >&5 ++printf %s "checking __builtin_ctzl... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5932,7 +6335,7 @@ else + #include + + int +-main () ++main (void) + { + + unsigned long u; +@@ -5947,15 +6350,16 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- +-$as_echo "#define HAVE_CTZL 1" >>confdefs.h +- +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++ ++printf "%s\n" "#define HAVE_CTZL 1" >>confdefs.h ++ ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -5970,19 +6374,20 @@ case $use in + alpha*) ;; #FIXME + ia64*) ;; #FIXME + *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking __builtin___clear_cache" >&5 +-$as_echo_n "checking __builtin___clear_cache... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking __builtin___clear_cache" >&5 ++printf %s "checking __builtin___clear_cache... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + void *v,*ve; +@@ -5992,15 +6397,16 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define HAVE_BUILTIN_CLEAR_CACHE 1" >>confdefs.h ++printf "%s\n" "#define HAVE_BUILTIN_CLEAR_CACHE 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -6018,17 +6424,19 @@ esac + # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects + # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. + # This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +-$as_echo_n "checking size of long... " >&6; } +-if ${ac_cv_sizeof_long+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 ++printf %s "checking size of long... " >&6; } ++if test ${ac_cv_sizeof_long+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" ++then : + +-else ++else $as_nop + if test "$ac_cv_type_long" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error 77 "cannot compute sizeof (long) + See \`config.log' for more details" "$LINENO" 5; } + else +@@ -6037,32 +6445,31 @@ See \`config.log' for more details" "$LI + fi + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +-$as_echo "$ac_cv_sizeof_long" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 ++printf "%s\n" "$ac_cv_sizeof_long" >&6; } + + + +-cat >>confdefs.h <<_ACEOF +-#define SIZEOF_LONG $ac_cv_sizeof_long +-_ACEOF ++printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h + + + + #### Memory areas and alignment + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for byte order" >&5 +-$as_echo_n "checking for byte order... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for byte order" >&5 ++printf %s "checking for byte order... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + /* Are we little or big endian? Adapted from Harbison&Steele. */ +@@ -6074,15 +6481,16 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: little" >&5 +-$as_echo "little" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: big" >&5 +-$as_echo "big" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: little" >&5 ++printf "%s\n" "little" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: big" >&5 ++printf "%s\n" "big" >&6; } + +-$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ++printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6092,19 +6500,20 @@ fi + + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for word order" >&5 +-$as_echo_n "checking for word order... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for word order" >&5 ++printf %s "checking for word order... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + /* Are we little or big endian? Adapted from Harbison&Steele. */ +@@ -6116,14 +6525,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: little" >&5 +-$as_echo "little" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: big" >&5 +-$as_echo "big" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: little" >&5 ++printf "%s\n" "little" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: big" >&5 ++printf "%s\n" "big" >&6; } + +-$as_echo "#define DOUBLE_BIGENDIAN 1" >>confdefs.h ++printf "%s\n" "#define DOUBLE_BIGENDIAN 1" >>confdefs.h + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6133,18 +6543,19 @@ fi + + + # pagewidth +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pagewidth" >&5 +-$as_echo_n "checking for pagewidth... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pagewidth" >&5 ++printf %s "checking for pagewidth... " >&6; } + case $use in + mips*) min_pagewidth=14;; + *) min_pagewidth=12;; + esac +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6155,7 +6566,7 @@ else + #endif + + int +-main () ++main (void) + { + + size_t i=getpagesize(),j; +@@ -6168,32 +6579,32 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + PAGEWIDTH=`cat conftest1` +-else ++else $as_nop + PAGEWIDTH=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAGEWIDTH" >&5 +-$as_echo "$PAGEWIDTH" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PAGEWIDTH" >&5 ++printf "%s\n" "$PAGEWIDTH" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define PAGEWIDTH $PAGEWIDTH +-_ACEOF ++printf "%s\n" "#define PAGEWIDTH $PAGEWIDTH" >>confdefs.h + + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for required object alignment" >&5 +-$as_echo_n "checking for required object alignment... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for required object alignment" >&5 ++printf %s "checking for required object alignment... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6209,7 +6620,7 @@ else + #include "./h/object.h" + + int +-main () ++main (void) + { + + unsigned long i; +@@ -6224,16 +6635,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + obj_align=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $obj_align" >&5 +-$as_echo "$obj_align" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $obj_align" >&5 ++printf "%s\n" "$obj_align" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define OBJ_ALIGNMENT $obj_align +-_ACEOF ++printf "%s\n" "#define OBJ_ALIGNMENT $obj_align" >>confdefs.h + +-else ++else $as_nop + as_fn_error $? "Cannot find object alignent" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6241,19 +6651,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C extension variable alignment" >&5 +-$as_echo_n "checking for C extension variable alignment... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C extension variable alignment" >&5 ++printf %s "checking for C extension variable alignment... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + char *v __attribute__ ((aligned ($obj_align))); +@@ -6262,36 +6673,36 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + obj_align="__attribute__ ((aligned ($obj_align)))" +-else ++else $as_nop + as_fn_error $? "Need alignment attributes" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $obj_align" >&5 +-$as_echo "$obj_align" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $obj_align" >&5 ++printf "%s\n" "$obj_align" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define OBJ_ALIGN $obj_align +-_ACEOF ++printf "%s\n" "#define OBJ_ALIGN $obj_align" >>confdefs.h + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C extension noreturn function attribute" >&5 +-$as_echo_n "checking for C extension noreturn function attribute... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C extension noreturn function attribute" >&5 ++printf %s "checking for C extension noreturn function attribute... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + int +-main () ++main (void) + { + + extern int v() __attribute__ ((noreturn)); +@@ -6300,29 +6711,29 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + no_return="__attribute__ ((noreturn))" +-else ++else $as_nop + no_return= + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $no_return" >&5 +-$as_echo "$no_return" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $no_return" >&5 ++printf "%s\n" "$no_return" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define NO_RETURN $no_return +-_ACEOF ++printf "%s\n" "#define NO_RETURN $no_return" >>confdefs.h + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof struct contblock" >&5 +-$as_echo_n "checking sizeof struct contblock... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking sizeof struct contblock" >&5 ++printf %s "checking sizeof struct contblock... " >&6; } + +-if test "$cross_compiling" = yes; then : ++if test "$cross_compiling" = yes ++then : + as_fn_error $? "Cannot find sizeof struct contblock" "$LINENO" 5 +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6337,7 +6748,7 @@ else + #include "h/object.h" + + int +-main () ++main (void) + { + + FILE *f=fopen("conftest1","w"); +@@ -6348,9 +6759,10 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + sizeof_contblock=`cat conftest1` +-else ++else $as_nop + as_fn_error $? "Cannot find sizeof struct contblock" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6358,21 +6770,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_contblock" >&5 +-$as_echo "$sizeof_contblock" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $sizeof_contblock" >&5 ++printf "%s\n" "$sizeof_contblock" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define SIZEOF_CONTBLOCK $sizeof_contblock +-_ACEOF ++printf "%s\n" "#define SIZEOF_CONTBLOCK $sizeof_contblock" >>confdefs.h + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sbrk" >&5 +-$as_echo_n "checking for sbrk... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sbrk" >&5 ++printf %s "checking for sbrk... " >&6; } + HAVE_SBRK="" +-if test "$cross_compiling" = yes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&5 +-$as_echo "no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&6; } +-else ++if test "$cross_compiling" = yes ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&5 ++printf "%s\n" "no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&6; } ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6380,7 +6791,7 @@ else + #include + + int +-main () ++main (void) + { + + FILE *f; +@@ -6392,12 +6803,13 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- HAVE_SBRK=1;{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&5 +-$as_echo "no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ HAVE_SBRK=1;{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&5 ++printf "%s\n" "no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -6405,21 +6817,22 @@ fi + + + if test "$use" = "386-macosx" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: emulating sbrk for mac" >&5 +-$as_echo "emulating sbrk for mac" >&6; }; ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: emulating sbrk for mac" >&5 ++printf "%s\n" "emulating sbrk for mac" >&6; }; + HAVE_SBRK=0 + fi + + if test "$HAVE_SBRK" = "1" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_NO_RANDOMIZE constant" >&5 +-$as_echo_n "checking for ADDR_NO_RANDOMIZE constant... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ADDR_NO_RANDOMIZE constant" >&5 ++printf %s "checking for ADDR_NO_RANDOMIZE constant... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6427,7 +6840,7 @@ else + #include + + int +-main () ++main (void) + { + + FILE *f; +@@ -6438,18 +6851,17 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + ADDR_NO_RANDOMIZE=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_NO_RANDOMIZE" >&5 +-$as_echo "yes $ADDR_NO_RANDOMIZE" >&6; } +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_NO_RANDOMIZE" >&5 ++printf "%s\n" "yes $ADDR_NO_RANDOMIZE" >&6; } ++else $as_nop + ADDR_NO_RANDOMIZE=0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no assuming 0x40000" >&5 +-$as_echo "no assuming 0x40000" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no assuming 0x40000" >&5 ++printf "%s\n" "no assuming 0x40000" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define ADDR_NO_RANDOMIZE 0x40000 +-_ACEOF ++printf "%s\n" "#define ADDR_NO_RANDOMIZE 0x40000" >>confdefs.h + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6457,14 +6869,15 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_COMPAT_LAYOUT constant" >&5 +-$as_echo_n "checking for ADDR_COMPAT_LAYOUT constant... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ADDR_COMPAT_LAYOUT constant" >&5 ++printf %s "checking for ADDR_COMPAT_LAYOUT constant... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6472,7 +6885,7 @@ else + #include + + int +-main () ++main (void) + { + + FILE *f; +@@ -6483,18 +6896,17 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + ADDR_COMPAT_LAYOUT=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_COMPAT_LAYOUT" >&5 +-$as_echo "yes $ADDR_COMPAT_LAYOUT" >&6; } +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_COMPAT_LAYOUT" >&5 ++printf "%s\n" "yes $ADDR_COMPAT_LAYOUT" >&6; } ++else $as_nop + ADDR_COMPAT_LAYOUT=0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define ADDR_COMPAT_LAYOUT 0 +-_ACEOF ++printf "%s\n" "#define ADDR_COMPAT_LAYOUT 0" >>confdefs.h + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6502,14 +6914,15 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_LIMIT_3GB constant" >&5 +-$as_echo_n "checking for ADDR_LIMIT_3GB constant... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ADDR_LIMIT_3GB constant" >&5 ++printf %s "checking for ADDR_LIMIT_3GB constant... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6517,7 +6930,7 @@ else + #include + + int +-main () ++main (void) + { + + FILE *f; +@@ -6528,18 +6941,17 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + ADDR_LIMIT_3GB=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_LIMIT_3GB" >&5 +-$as_echo "yes $ADDR_LIMIT_3GB" >&6; } +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_LIMIT_3GB" >&5 ++printf "%s\n" "yes $ADDR_LIMIT_3GB" >&6; } ++else $as_nop + ADDR_LIMIT_3GB=0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define ADDR_LIMIT_3GB 0 +-_ACEOF ++printf "%s\n" "#define ADDR_LIMIT_3GB 0" >>confdefs.h + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6547,14 +6959,15 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for personality(ADDR_NO_RANDOMIZE) support" >&5 +-$as_echo_n "checking for personality(ADDR_NO_RANDOMIZE) support... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for personality(ADDR_NO_RANDOMIZE) support" >&5 ++printf %s "checking for personality(ADDR_NO_RANDOMIZE) support... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6566,30 +6979,32 @@ else + } + + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + +-$as_echo "#define CAN_UNRANDOMIZE_SBRK 1" >>confdefs.h ++printf "%s\n" "#define CAN_UNRANDOMIZE_SBRK 1" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking that sbrk is (now) non-random" >&5 +-$as_echo_n "checking that sbrk is (now) non-random... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that sbrk is (now) non-random" >&5 ++printf %s "checking that sbrk is (now) non-random... " >&6; } + SBRK=0 +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6607,7 +7022,8 @@ else + } + + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + SBRK=`cat conftest1` + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6619,12 +7035,13 @@ fi + fi + + SBRK1=0 +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6641,7 +7058,8 @@ else + } + + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + SBRK1=`cat conftest1` + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6652,11 +7070,11 @@ fi + as_fn_error $? "cannot trap sbrk" "$LINENO" 5 + fi + if test "$SBRK" = "$SBRK1" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + echo "Cannot build with randomized sbrk. Your options:" + echo " - upgrade to a kernel/libc that knows about personality(ADDR_NO_RANDOMIZE)" + echo " - recompile your kernel with CONFIG_COMPAT_BRK (if it has that option)" +@@ -6665,14 +7083,15 @@ $as_echo "no" >&6; } + fi + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_DIRECTION" >&5 +-$as_echo_n "checking CSTACK_DIRECTION... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking CSTACK_DIRECTION" >&5 ++printf %s "checking CSTACK_DIRECTION... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6688,9 +7107,10 @@ else + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + cstack_direction=`cat conftest1` +-else ++else $as_nop + cstack_direction=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6698,21 +7118,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-cat >>confdefs.h <<_ACEOF +-#define CSTACK_DIRECTION $cstack_direction +-_ACEOF ++printf "%s\n" "#define CSTACK_DIRECTION $cstack_direction" >>confdefs.h + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_direction" >&5 +-$as_echo "$cstack_direction" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cstack_direction" >&5 ++printf "%s\n" "$cstack_direction" >&6; } + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking finding CSTACK_ALIGNMENT" >&5 +-$as_echo_n "checking finding CSTACK_ALIGNMENT... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking finding CSTACK_ALIGNMENT" >&5 ++printf %s "checking finding CSTACK_ALIGNMENT... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6734,9 +7153,10 @@ else + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + cstack_alignment=`cat conftest1` +-else ++else $as_nop + cstack_alignment=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6744,32 +7164,30 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-cat >>confdefs.h <<_ACEOF +-#define CSTACK_ALIGNMENT $cstack_alignment +-_ACEOF ++printf "%s\n" "#define CSTACK_ALIGNMENT $cstack_alignment" >>confdefs.h + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_alignment" >&5 +-$as_echo "$cstack_alignment" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cstack_alignment" >&5 ++printf "%s\n" "$cstack_alignment" >&6; } + + # Check whether --enable-cstackmax was given. +-if test "${enable_cstackmax+set}" = set; then : ++if test ${enable_cstackmax+y} ++then : + enableval=$enable_cstackmax; if test "$enableval" != "" ; then +-cat >>confdefs.h <<_ACEOF +-#define CSTACKMAX $enableval +-_ACEOF ++printf "%s\n" "#define CSTACKMAX $enableval" >>confdefs.h + fi + fi + + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_ADDRESS" >&5 +-$as_echo_n "checking CSTACK_ADDRESS... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking CSTACK_ADDRESS" >&5 ++printf %s "checking CSTACK_ADDRESS... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6796,9 +7214,10 @@ else + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + cstack_address=`cat conftest1` +-else ++else $as_nop + cstack_address=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6806,21 +7225,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-cat >>confdefs.h <<_ACEOF +-#define CSTACK_ADDRESS $cstack_address +-_ACEOF ++printf "%s\n" "#define CSTACK_ADDRESS $cstack_address" >>confdefs.h + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_address" >&5 +-$as_echo "$cstack_address" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cstack_address" >&5 ++printf "%s\n" "$cstack_address" >&6; } + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking cstack bits" >&5 +-$as_echo_n "checking cstack bits... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking cstack bits" >&5 ++printf %s "checking cstack bits... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6830,7 +7248,7 @@ else + main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); +- unsigned long i,j; ++ long i,j; + + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" +@@ -6838,7 +7256,7 @@ else + j=1; + j<<=$PAGEWIDTH; + j<<=16; +- i=(unsigned long)&v; ++ i=(long)&v; + if ($cstack_direction==1) i-=j; + j--; + i+=j; +@@ -6849,9 +7267,10 @@ else + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + cstack_bits=`cat conftest1` +-else ++else $as_nop + cstack_bits=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6859,21 +7278,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-cat >>confdefs.h <<_ACEOF +-#define CSTACK_BITS $cstack_bits +-_ACEOF ++printf "%s\n" "#define CSTACK_BITS $cstack_bits" >>confdefs.h + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_bits" >&5 +-$as_echo "$cstack_bits" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cstack_bits" >&5 ++printf "%s\n" "$cstack_bits" >&6; } + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking NEG_CSTACK_ADDRESS" >&5 +-$as_echo_n "checking NEG_CSTACK_ADDRESS... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking NEG_CSTACK_ADDRESS" >&5 ++printf %s "checking NEG_CSTACK_ADDRESS... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -6887,16 +7305,17 @@ else + return (long)$cstack_address<0 ? 0 : -1; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } + neg_cstack_address=1 + +-$as_echo "#define NEG_CSTACK_ADDRESS 1" >>confdefs.h ++printf "%s\n" "#define NEG_CSTACK_ADDRESS 1" >>confdefs.h + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + neg_cstack_address=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -6905,15 +7324,17 @@ fi + + + # Check whether --enable-immfix was given. +-if test "${enable_immfix+set}" = set; then : ++if test ${enable_immfix+y} ++then : + enableval=$enable_immfix; + fi + + + # Check whether --enable-fastimmfix was given. +-if test "${enable_fastimmfix+set}" = set; then : ++if test ${enable_fastimmfix+y} ++then : + enableval=$enable_fastimmfix; +-else ++else $as_nop + enable_fastimmfix=64 + fi + +@@ -6921,19 +7342,19 @@ fi + + if test "$use" != "386-gnu" ; then #hurd can push .data below C stack, but sbrk(0) remains above, foiling unexec + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding default linker script" >&5 +-$as_echo_n "checking finding default linker script... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking finding default linker script" >&5 ++printf %s "checking finding default linker script... " >&6; } + touch unixport/gcl.script + echo "int main() {return 0;}" >foo.c + $CC $LDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ +- $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script ++ $AWK '/==================================================/ {i=1-i;next} {if (i) print}' >gcl.script + rm -rf foo.c foo + + if test "`cat gcl.script | wc -l`" != "0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: got it" >&5 +-$as_echo "got it" >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: trying to adjust text start" >&5 +-$as_echo "$as_me: trying to adjust text start" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: got it" >&5 ++printf "%s\n" "got it" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying to adjust text start" >&5 ++printf "%s\n" "$as_me: trying to adjust text start" >&6;} + cp gcl.script gcl.script.def + + n=-1; +@@ -6955,16 +7376,16 @@ $as_echo "$as_me: trying to adjust text + n=`$AWK 'END {print n+1}' n=$n &5 +-$as_echo "$as_me: min log text start $min" >&6;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: max log text start $max" >&5 +-$as_echo "$as_me: max log text start $max" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: min log text start $min" >&5 ++printf "%s\n" "$as_me: min log text start $min" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: max log text start $max" >&5 ++printf "%s\n" "$as_me: max log text start $max" >&6;} + + if test $neg_cstack_address -eq 1 ; then #FIXME test this + if test $cstack_bits -lt $max ; then + max=$cstack_bits; +- { $as_echo "$as_me:${as_lineno-$LINENO}: max log text start reduced to $max considering c stack address" >&5 +-$as_echo "$as_me: max log text start reduced to $max considering c stack address" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: max log text start reduced to $max considering c stack address" >&5 ++printf "%s\n" "$as_me: max log text start reduced to $max considering c stack address" >&6;} + fi + fi + +@@ -6974,82 +7395,78 @@ $as_echo "$as_me: max log text start red + if test $max -ge $enable_fastimmfix && test "$enable_immfix" != "no" ; then + j=`$AWK 'END {for (i=j=0;j<=n;j++) i=i ? i*2 : 1;printf("%x\n",3*i)}' n=$max &5 +-$as_echo "$as_me: raising log text to $j for a $max bit wide low immfix table" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: raising log text to $j for a $max bit wide low immfix table" >&5 ++printf "%s\n" "$as_me: raising log text to $j for a $max bit wide low immfix table" >&6;} + else + j=`$AWK 'END {for (i=j=0;j<=n;j++) i=i ? i*2 : 1;printf("%x\n",3*i)}' n=$min &5 +-$as_echo "$as_me: lowering log text to $j to maximize data area" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: lowering log text to $j to maximize data area" >&5 ++printf "%s\n" "$as_me: lowering log text to $j to maximize data area" >&6;} + fi + fi + + if test "$low_shft" != "" ; then + +-cat >>confdefs.h <<_ACEOF +-#define LOW_SHFT $low_shft +-_ACEOF ++printf "%s\n" "#define LOW_SHFT $low_shft" >>confdefs.h + + +-cat >>confdefs.h <<_ACEOF +-#define OBJNULL (object)0x$j +-_ACEOF ++printf "%s\n" "#define OBJNULL (object)0x$j" >>confdefs.h + + else + +-cat >>confdefs.h <<_ACEOF +-#define OBJNULL NULL +-_ACEOF ++printf "%s\n" "#define OBJNULL NULL" >>confdefs.h + + fi + + # echo $j; +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking our linker script" >&5 +-$as_echo_n "checking our linker script... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking our linker script" >&5 ++printf %s "checking our linker script... " >&6; } + if test "$j" -ne "-1" ; then + cat gcl.script.def | $AWK '/SIZEOF_HEADERS/ {gsub("0x[0-9]*","0x" j,$0);} {print}' j=$j >gcl.script +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +-$as_echo "done" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 ++printf "%s\n" "done" >&6; } + rm -f gcl.script.def + assert_arg_to_ldflags -Wl,-T,gcl.script + cp gcl.script unixport + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none found or not needed" >&5 +-$as_echo "none found or not needed" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none found or not needed" >&5 ++printf "%s\n" "none found or not needed" >&6; } + rm -f gcl.script gcl.script.def + fi + rm -rf foo.c foo + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +-$as_echo "not found" >&6; } ++ ++printf "%s\n" "#define OBJNULL NULL" >>confdefs.h ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 ++printf "%s\n" "not found" >&6; } + fi + + else + + +-cat >>confdefs.h <<_ACEOF +-#define OBJNULL NULL +-_ACEOF ++printf "%s\n" "#define OBJNULL NULL" >>confdefs.h + + + fi + + mem_top=0 + mem_range=0 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking mem top" >&5 +-$as_echo_n "checking mem top... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking mem top" >&5 ++printf %s "checking mem top... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + unsigned long i,j,k,l; +@@ -7074,34 +7491,36 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + mem_top=`cat conftest1` +-else ++else $as_nop + mem_top="0x0" + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $mem_top" >&5 +-$as_echo "$mem_top" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $mem_top" >&5 ++printf "%s\n" "$mem_top" >&6; } + + if test "$mem_top" != "0x0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding upper mem half range" >&5 +-$as_echo_n "checking finding upper mem half range... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking finding upper mem half range" >&5 ++printf %s "checking finding upper mem half range... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + unsigned long j; +@@ -7116,27 +7535,24 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + mem_range=`cat conftest1` +-else ++else $as_nop + mem_range="0x0" + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mem_range" >&5 +-$as_echo "$mem_range" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $mem_range" >&5 ++printf "%s\n" "$mem_range" >&6; } + if test "$mem_range" != "0x0" ; then + +-cat >>confdefs.h <<_ACEOF +-#define MEM_TOP $mem_top +-_ACEOF ++printf "%s\n" "#define MEM_TOP $mem_top" >>confdefs.h + + +-cat >>confdefs.h <<_ACEOF +-#define MEM_RANGE $mem_range +-_ACEOF ++printf "%s\n" "#define MEM_RANGE $mem_range" >>confdefs.h + + fi + fi +@@ -7145,34 +7561,31 @@ if test "$enable_immfix" != "no" ; then + if test "$mem_top" != "0x0" ; then + if test "$mem_range" != "0x0" ; then + +-cat >>confdefs.h <<_ACEOF +-#define IM_FIX_BASE $mem_top +-_ACEOF ++printf "%s\n" "#define IM_FIX_BASE $mem_top" >>confdefs.h + + +-cat >>confdefs.h <<_ACEOF +-#define IM_FIX_LIM $mem_range +-_ACEOF ++printf "%s\n" "#define IM_FIX_LIM $mem_range" >>confdefs.h + + fi + fi + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof long long int" >&5 +-$as_echo_n "checking sizeof long long int... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking sizeof long long int" >&5 ++printf %s "checking sizeof long long int... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + if (sizeof(long long int) == 2*sizeof(long)) return 0; +@@ -7182,14 +7595,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -7198,26 +7612,26 @@ fi + + + +-for ac_header in dirent.h ++ for ac_header in dirent.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +-if test "x$ac_cv_header_dirent_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_DIRENT_H 1 +-_ACEOF +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for d_type" >&5 +-$as_echo_n "checking for d_type... " >&6; } +- if test "$cross_compiling" = yes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-else ++ ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" ++if test "x$ac_cv_header_dirent_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for d_type" >&5 ++printf %s "checking for d_type... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + struct dirent d; +@@ -7227,14 +7641,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-$as_echo "#define HAVE_D_TYPE 1" >>confdefs.h +- +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++printf "%s\n" "#define HAVE_D_TYPE 1" >>confdefs.h ++ ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -7244,12 +7659,12 @@ fi + + done + +- + # ansi lisp + SYSTEM=ansi_gcl + CLSTANDARD=ANSI + # Check whether --enable-ansi was given. +-if test "${enable_ansi+set}" = set; then : ++if test ${enable_ansi+y} ++then : + enableval=$enable_ansi; if test "$enable_ansi" = "no" ; then + SYSTEM=gcl + CLSTANDARD=CLtL1 +@@ -7267,87 +7682,71 @@ FLISP="saved_$SYSTEM" + + + # Check if Posix compliant getcwd exists, if not we'll use getwd. +-for ac_func in getcwd +-do : +- ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" +-if test "x$ac_cv_func_getcwd" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_GETCWD 1 +-_ACEOF ++ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" ++if test "x$ac_cv_func_getcwd" = xyes ++then : ++ printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h + + fi +-done + +-for ac_func in getwd +-do : +- ac_fn_c_check_func "$LINENO" "getwd" "ac_cv_func_getwd" +-if test "x$ac_cv_func_getwd" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_GETWD 1 +-_ACEOF ++ac_fn_c_check_func "$LINENO" "getwd" "ac_cv_func_getwd" ++if test "x$ac_cv_func_getwd" = xyes ++then : ++ printf "%s\n" "#define HAVE_GETWD 1" >>confdefs.h + + fi +-done + + ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname" +-if test "x$ac_cv_func_uname" = xyes; then : ++if test "x$ac_cv_func_uname" = xyes ++then : + +-else ++else $as_nop + +-$as_echo "#define NO_UNAME 1" >>confdefs.h ++printf "%s\n" "#define NO_UNAME 1" >>confdefs.h + + fi + + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +-if test "x$ac_cv_func_gettimeofday" = xyes; then : ++if test "x$ac_cv_func_gettimeofday" = xyes ++then : + +-else +- $as_echo "#define NO_GETTOD 1" >>confdefs.h ++else $as_nop ++ printf "%s\n" "#define NO_GETTOD 1" >>confdefs.h + + fi + + + +-for ac_header in sys/ioctl.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +-if test "x$ac_cv_header_sys_ioctl_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_SYS_IOCTL_H 1 +-_ACEOF ++ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" ++if test "x$ac_cv_header_sys_ioctl_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + + fi + +-done +- + + # OpenBSD has elf_abi.h instead of elf.h +-for ac_header in elf.h elf_abi.h +-do : +- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +-_ACEOF ++ac_fn_c_check_header_compile "$LINENO" "elf.h" "ac_cv_header_elf_h" "$ac_includes_default" ++if test "x$ac_cv_header_elf_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_ELF_H 1" >>confdefs.h + + fi ++ac_fn_c_check_header_compile "$LINENO" "elf_abi.h" "ac_cv_header_elf_abi_h" "$ac_includes_default" ++if test "x$ac_cv_header_elf_abi_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_ELF_ABI_H 1" >>confdefs.h + +-done ++fi + + +-for ac_header in sys/sockio.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" +-if test "x$ac_cv_header_sys_sockio_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_SYS_SOCKIO_H 1 +-_ACEOF ++ac_fn_c_check_header_compile "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" ++if test "x$ac_cv_header_sys_sockio_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_SYS_SOCKIO_H 1" >>confdefs.h + + fi + +-done +- + + + #-------------------------------------------------------------------- +@@ -7362,25 +7761,169 @@ done + #-------------------------------------------------------------------- + + ac_fn_c_check_func "$LINENO" "BSDgettimeofday" "ac_cv_func_BSDgettimeofday" +-if test "x$ac_cv_func_BSDgettimeofday" = xyes; then : ++if test "x$ac_cv_func_BSDgettimeofday" = xyes ++then : + +-$as_echo "#define HAVE_BSDGETTIMEOFDAY 1" >>confdefs.h ++printf "%s\n" "#define HAVE_BSDGETTIMEOFDAY 1" >>confdefs.h + +-else ++else $as_nop + ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +-if test "x$ac_cv_func_gettimeofday" = xyes; then : ++if test "x$ac_cv_func_gettimeofday" = xyes ++then : + +-else ++else $as_nop ++ ++printf "%s\n" "#define NO_GETTOD 1" >>confdefs.h ++ ++fi ++ ++fi + +-$as_echo "#define NO_GETTOD 1" >>confdefs.h + ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettimeofday declaration" >&5 ++printf %s "checking for gettimeofday declaration... " >&6; } ++ ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 ++printf %s "checking for grep that handles long lines and -e... " >&6; } ++if test ${ac_cv_path_GREP+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if test -z "$GREP"; then ++ ac_path_GREP_found=false ++ # Loop through the user's path and test for each of PROGNAME-LIST ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++do ++ IFS=$as_save_IFS ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ for ac_prog in grep ggrep ++ do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" ++ as_fn_executable_p "$ac_path_GREP" || continue ++# Check for GNU ac_path_GREP and select it if it is found. ++ # Check for GNU $ac_path_GREP ++case `"$ac_path_GREP" --version 2>&1` in ++*GNU*) ++ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; ++*) ++ ac_count=0 ++ printf %s 0123456789 >"conftest.in" ++ while : ++ do ++ cat "conftest.in" "conftest.in" >"conftest.tmp" ++ mv "conftest.tmp" "conftest.in" ++ cp "conftest.in" "conftest.nl" ++ printf "%s\n" 'GREP' >> "conftest.nl" ++ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break ++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ++ as_fn_arith $ac_count + 1 && ac_count=$as_val ++ if test $ac_count -gt ${ac_path_GREP_max-0}; then ++ # Best one so far, save it but keep looking for a better one ++ ac_cv_path_GREP="$ac_path_GREP" ++ ac_path_GREP_max=$ac_count ++ fi ++ # 10*(2^10) chars as input seems more than enough ++ test $ac_count -gt 10 && break ++ done ++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; ++esac ++ ++ $ac_path_GREP_found && break 3 ++ done ++ done ++ done ++IFS=$as_save_IFS ++ if test -z "$ac_cv_path_GREP"; then ++ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ fi ++else ++ ac_cv_path_GREP=$GREP + fi + + fi ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 ++printf "%s\n" "$ac_cv_path_GREP" >&6; } ++ GREP="$ac_cv_path_GREP" ++ ++ ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 ++printf %s "checking for egrep... " >&6; } ++if test ${ac_cv_path_EGREP+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 ++ then ac_cv_path_EGREP="$GREP -E" ++ else ++ if test -z "$EGREP"; then ++ ac_path_EGREP_found=false ++ # Loop through the user's path and test for each of PROGNAME-LIST ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin ++do ++ IFS=$as_save_IFS ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ for ac_prog in egrep ++ do ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" ++ as_fn_executable_p "$ac_path_EGREP" || continue ++# Check for GNU ac_path_EGREP and select it if it is found. ++ # Check for GNU $ac_path_EGREP ++case `"$ac_path_EGREP" --version 2>&1` in ++*GNU*) ++ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; ++*) ++ ac_count=0 ++ printf %s 0123456789 >"conftest.in" ++ while : ++ do ++ cat "conftest.in" "conftest.in" >"conftest.tmp" ++ mv "conftest.tmp" "conftest.in" ++ cp "conftest.in" "conftest.nl" ++ printf "%s\n" 'EGREP' >> "conftest.nl" ++ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break ++ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ++ as_fn_arith $ac_count + 1 && ac_count=$as_val ++ if test $ac_count -gt ${ac_path_EGREP_max-0}; then ++ # Best one so far, save it but keep looking for a better one ++ ac_cv_path_EGREP="$ac_path_EGREP" ++ ac_path_EGREP_max=$ac_count ++ fi ++ # 10*(2^10) chars as input seems more than enough ++ test $ac_count -gt 10 && break ++ done ++ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; ++esac ++ ++ $ac_path_EGREP_found && break 3 ++ done ++ done ++ done ++IFS=$as_save_IFS ++ if test -z "$ac_cv_path_EGREP"; then ++ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 ++ fi ++else ++ ac_cv_path_EGREP=$EGREP ++fi + ++ fi ++fi ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 ++printf "%s\n" "$ac_cv_path_EGREP" >&6; } ++ EGREP="$ac_cv_path_EGREP" + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday declaration" >&5 +-$as_echo_n "checking for gettimeofday declaration... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +@@ -7388,25 +7931,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + + _ACEOF + if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "gettimeofday" >/dev/null 2>&1; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: present" >&5 +-$as_echo "present" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: missing" >&5 +-$as_echo "missing" >&6; } ++ $EGREP "gettimeofday" >/dev/null 2>&1 ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: present" >&5 ++printf "%s\n" "present" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: missing" >&5 ++printf "%s\n" "missing" >&6; } + +-$as_echo "#define GETTOD_NOT_DECLARED 1" >>confdefs.h ++printf "%s\n" "#define GETTOD_NOT_DECLARED 1" >>confdefs.h + + fi +-rm -f conftest* ++rm -rf conftest* + + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 +-$as_echo_n "checking for sin in -lm... " >&6; } +-if ${ac_cv_lib_m_sin+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 ++printf %s "checking for sin in -lm... " >&6; } ++if test ${ac_cv_lib_m_sin+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lm $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -7415,40 +7960,40 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char sin (); + int +-main () ++main (void) + { + return sin (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_m_sin=yes +-else ++else $as_nop + ac_cv_lib_m_sin=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 +-$as_echo "$ac_cv_lib_m_sin" >&6; } +-if test "x$ac_cv_lib_m_sin" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 ++printf "%s\n" "$ac_cv_lib_m_sin" >&6; } ++if test "x$ac_cv_lib_m_sin" = xyes ++then : + LIBS="${LIBS} -lm" +-else ++else $as_nop + true + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lmingwex" >&5 +-$as_echo_n "checking for main in -lmingwex... " >&6; } +-if ${ac_cv_lib_mingwex_main+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lmingwex" >&5 ++printf %s "checking for main in -lmingwex... " >&6; } ++if test ${ac_cv_lib_mingwex_main+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lmingwex $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -7456,46 +8001,49 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + + + int +-main () ++main (void) + { + return main (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_mingwex_main=yes +-else ++else $as_nop + ac_cv_lib_mingwex_main=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mingwex_main" >&5 +-$as_echo "$ac_cv_lib_mingwex_main" >&6; } +-if test "x$ac_cv_lib_mingwex_main" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mingwex_main" >&5 ++printf "%s\n" "$ac_cv_lib_mingwex_main" >&6; } ++if test "x$ac_cv_lib_mingwex_main" = xyes ++then : + LIBS="${LIBS} -lmingwex" +-else ++else $as_nop + true + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for buggy maximum sscanf length" >&5 +-$as_echo_n "checking for buggy maximum sscanf length... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for buggy maximum sscanf length" >&5 ++printf %s "checking for buggy maximum sscanf length... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404"; +@@ -7513,17 +8061,16 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +-$as_echo "none" >&6; } +-else ++if ac_fn_c_try_run "$LINENO" ++then : ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 ++printf "%s\n" "none" >&6; } ++else $as_nop + buggy_maximum_sscanf_length=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $buggy_maximum_sscanf_length" >&5 +-$as_echo "$buggy_maximum_sscanf_length" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $buggy_maximum_sscanf_length" >&5 ++printf "%s\n" "$buggy_maximum_sscanf_length" >&6; } + +-cat >>confdefs.h <<_ACEOF +-#define BUGGY_MAXIMUM_SSCANF_LENGTH $buggy_maximum_sscanf_length +-_ACEOF ++printf "%s\n" "#define BUGGY_MAXIMUM_SSCANF_LENGTH $buggy_maximum_sscanf_length" >>confdefs.h + + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -7534,23 +8081,22 @@ fi + + EXTRA_LOBJS= + # Check whether --enable-japi was given. +-if test "${enable_japi+set}" = set; then : ++if test ${enable_japi+y} ++then : + enableval=$enable_japi; if test "$enable_japi" = "yes" ; then +- for ac_header in japi.h ++ for ac_header in japi.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "japi.h" "ac_cv_header_japi_h" "$ac_includes_default" +-if test "x$ac_cv_header_japi_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_JAPI_H 1 +-_ACEOF +- $as_echo "#define HAVE_JAPI_H 1" >>confdefs.h ++ ac_fn_c_check_header_compile "$LINENO" "japi.h" "ac_cv_header_japi_h" "$ac_includes_default" ++if test "x$ac_cv_header_japi_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_JAPI_H 1" >>confdefs.h ++ printf "%s\n" "#define HAVE_JAPI_H 1" >>confdefs.h + + EXTRA_LOBJS="${EXTRA_LOBJS} gcl_japi.o" + LIBS="${LIBS} -ljapi -lwsock32" + fi + + done +- + fi + fi + +@@ -7558,84 +8104,77 @@ fi + # Should really find a way to check for prototypes, but this + # basically works for now. CM + # +-for ac_header in math.h ++ for ac_header in math.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" +-if test "x$ac_cv_header_math_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_MATH_H 1 +-_ACEOF ++ ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" ++if test "x$ac_cv_header_math_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_MATH_H 1" >>confdefs.h + +-$as_echo "#define HAVE_MATH_H 1" >>confdefs.h ++printf "%s\n" "#define HAVE_MATH_H 1" >>confdefs.h + + fi + + done +- +-for ac_header in complex.h ++ for ac_header in complex.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "complex.h" "ac_cv_header_complex_h" "$ac_includes_default" +-if test "x$ac_cv_header_complex_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_COMPLEX_H 1 +-_ACEOF ++ ac_fn_c_check_header_compile "$LINENO" "complex.h" "ac_cv_header_complex_h" "$ac_includes_default" ++if test "x$ac_cv_header_complex_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_COMPLEX_H 1" >>confdefs.h + +-$as_echo "#define HAVE_COMPLEX_H 1" >>confdefs.h ++printf "%s\n" "#define HAVE_COMPLEX_H 1" >>confdefs.h + + fi + + done + +- + # + # For DBL_MAX et. al. on (only) certain Linux arches, apparently CM + # +-for ac_header in values.h ++ for ac_header in values.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" +-if test "x$ac_cv_header_values_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_VALUES_H 1 +-_ACEOF ++ ac_fn_c_check_header_compile "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" ++if test "x$ac_cv_header_values_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_VALUES_H 1" >>confdefs.h + +-$as_echo "#define HAVE_VALUES_H 1" >>confdefs.h ++printf "%s\n" "#define HAVE_VALUES_H 1" >>confdefs.h + + fi + + done + +- + # + # Sparc solaris keeps this in float.h, rework either/or with values.h later + # +-for ac_header in float.h ++ for ac_header in float.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" +-if test "x$ac_cv_header_float_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_FLOAT_H 1 +-_ACEOF ++ ac_fn_c_check_header_compile "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" ++if test "x$ac_cv_header_float_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_FLOAT_H 1" >>confdefs.h + +-$as_echo "#define HAVE_FLOAT_H 1" >>confdefs.h ++printf "%s\n" "#define HAVE_FLOAT_H 1" >>confdefs.h + + fi + + done + +- + # + # The second alternative is for solaris. This needs to be + # a more comprehensive later, i.e. checking that the fpclass + # test makes sense. CM + # +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnormal" >&5 +-$as_echo_n "checking for isnormal... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for isnormal" >&5 ++printf %s "checking for isnormal... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -7643,7 +8182,7 @@ else + #include + + int +-main () ++main (void) + { + + float f; +@@ -7653,27 +8192,29 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define HAVE_ISNORMAL 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass of ieeefp.h" >&5 +-$as_echo_n "checking for fpclass of ieeefp.h... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++printf "%s\n" "#define HAVE_ISNORMAL 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fpclass of ieeefp.h" >&5 ++printf %s "checking for fpclass of ieeefp.h... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + float f; +@@ -7683,14 +8224,15 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define HAVE_IEEEFP 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++printf "%s\n" "#define HAVE_IEEEFP 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +@@ -7702,14 +8244,15 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5 +-$as_echo_n "checking for isfinite... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5 ++printf %s "checking for isfinite... " >&6; } ++if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -7717,7 +8260,7 @@ else + #include + + int +-main () ++main (void) + { + + float f; +@@ -7727,20 +8270,22 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define HAVE_ISFINITE 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite()" >&5 +-$as_echo_n "checking for finite()... " >&6; } +- if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++printf "%s\n" "#define HAVE_ISFINITE 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for finite()" >&5 ++printf %s "checking for finite()... " >&6; } ++ if test "$cross_compiling" = yes ++then : ++ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling + See \`config.log' for more details" "$LINENO" 5; } +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -7748,7 +8293,7 @@ else + #include + + int +-main () ++main (void) + { + + float f; +@@ -7758,12 +8303,13 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + +-$as_echo "#define HAVE_FINITE 1" >>confdefs.h +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else ++printf "%s\n" "#define HAVE_FINITE 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop + as_fn_error $? "no" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -7793,22 +8339,24 @@ fi + # To get around this problem, check for both libraries together + # if -lsocket doesn't work by itself. + #-------------------------------------------------------------------- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockets" >&5 +-$as_echo_n "checking for sockets... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sockets" >&5 ++printf %s "checking for sockets... " >&6; } + tcl_checkBoth=0 + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +-if test "x$ac_cv_func_connect" = xyes; then : ++if test "x$ac_cv_func_connect" = xyes ++then : + tcl_checkSocket=0 +-else ++else $as_nop + tcl_checkSocket=1 + fi + + if test "$tcl_checkSocket" = 1; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lsocket" >&5 +-$as_echo_n "checking for main in -lsocket... " >&6; } +-if ${ac_cv_lib_socket_main+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lsocket" >&5 ++printf %s "checking for main in -lsocket... " >&6; } ++if test ${ac_cv_lib_socket_main+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lsocket $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -7816,27 +8364,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + + + int +-main () ++main (void) + { + return main (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_socket_main=yes +-else ++else $as_nop + ac_cv_lib_socket_main=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_main" >&5 +-$as_echo "$ac_cv_lib_socket_main" >&6; } +-if test "x$ac_cv_lib_socket_main" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_main" >&5 ++printf "%s\n" "$ac_cv_lib_socket_main" >&6; } ++if test "x$ac_cv_lib_socket_main" = xyes ++then : + TLIBS="$TLIBS -lsocket" +-else ++else $as_nop + tcl_checkBoth=1 + fi + +@@ -7847,22 +8397,25 @@ if test "$tcl_checkBoth" = 1; then + tk_oldLibs=$TLIBS + TLIBS="$TLIBS -lsocket -lnsl" + ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" +-if test "x$ac_cv_func_accept" = xyes; then : ++if test "x$ac_cv_func_accept" = xyes ++then : + tcl_checkNsl=0 +-else ++else $as_nop + TLIBS=$tk_oldLibs + fi + + fi + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +-if test "x$ac_cv_func_gethostbyname" = xyes; then : ++if test "x$ac_cv_func_gethostbyname" = xyes ++then : + +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5 +-$as_echo_n "checking for main in -lnsl... " >&6; } +-if ${ac_cv_lib_nsl_main+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5 ++printf %s "checking for main in -lnsl... " >&6; } ++if test ${ac_cv_lib_nsl_main+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lnsl $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -7870,25 +8423,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + + + int +-main () ++main (void) + { + return main (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_nsl_main=yes +-else ++else $as_nop + ac_cv_lib_nsl_main=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5 +-$as_echo "$ac_cv_lib_nsl_main" >&6; } +-if test "x$ac_cv_lib_nsl_main" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5 ++printf "%s\n" "$ac_cv_lib_nsl_main" >&6; } ++if test "x$ac_cv_lib_nsl_main" = xyes ++then : + TLIBS="$TLIBS -lnsl" + fi + +@@ -7897,7 +8452,8 @@ fi + + # readline + # Check whether --enable-readline was given. +-if test "${enable_readline+set}" = set; then : ++if test ${enable_readline+y} ++then : + enableval=$enable_readline; + fi + +@@ -7907,18 +8463,18 @@ if test "$use" = "mingw" ; then + fi + + if test "$enable_readline" != "no" ; then +- for ac_header in readline/readline.h ++ for ac_header in readline/readline.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +-if test "x$ac_cv_header_readline_readline_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_READLINE_READLINE_H 1 +-_ACEOF +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_initialize in -lreadline" >&5 +-$as_echo_n "checking for rl_initialize in -lreadline... " >&6; } +-if ${ac_cv_lib_readline_rl_initialize+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" ++if test "x$ac_cv_header_readline_readline_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_initialize in -lreadline" >&5 ++printf %s "checking for rl_initialize in -lreadline... " >&6; } ++if test ${ac_cv_lib_readline_rl_initialize+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lreadline $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -7927,38 +8483,38 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char rl_initialize (); + int +-main () ++main (void) + { + return rl_initialize (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_readline_rl_initialize=yes +-else ++else $as_nop + ac_cv_lib_readline_rl_initialize=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_initialize" >&5 +-$as_echo "$ac_cv_lib_readline_rl_initialize" >&6; } +-if test "x$ac_cv_lib_readline_rl_initialize" = xyes; then : +- +-$as_echo "#define USE_READLINE 1" >>confdefs.h +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for el_getc in -lreadline" >&5 +-$as_echo_n "checking for el_getc in -lreadline... " >&6; } +-if ${ac_cv_lib_readline_el_getc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_initialize" >&5 ++printf "%s\n" "$ac_cv_lib_readline_rl_initialize" >&6; } ++if test "x$ac_cv_lib_readline_rl_initialize" = xyes ++then : ++ ++printf "%s\n" "#define USE_READLINE 1" >>confdefs.h ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for el_getc in -lreadline" >&5 ++printf %s "checking for el_getc in -lreadline... " >&6; } ++if test ${ac_cv_lib_readline_el_getc+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lreadline $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -7967,41 +8523,41 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char el_getc (); + int +-main () ++main (void) + { + return el_getc (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_readline_el_getc=yes +-else ++else $as_nop + ac_cv_lib_readline_el_getc=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_el_getc" >&5 +-$as_echo "$ac_cv_lib_readline_el_getc" >&6; } +-if test "x$ac_cv_lib_readline_el_getc" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_el_getc" >&5 ++printf "%s\n" "$ac_cv_lib_readline_el_getc" >&6; } ++if test "x$ac_cv_lib_readline_el_getc" = xyes ++then : + +-$as_echo "#define READLINE_IS_EDITLINE 1" >>confdefs.h ++printf "%s\n" "#define READLINE_IS_EDITLINE 1" >>confdefs.h + + fi + + # These tests discover differences between readline 4.1 and 4.3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 +-$as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } +-if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 ++printf %s "checking for rl_completion_matches in -lreadline... " >&6; } ++if test ${ac_cv_lib_readline_rl_completion_matches+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lreadline $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -8010,35 +8566,34 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char rl_completion_matches (); + int +-main () ++main (void) + { + return rl_completion_matches (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_readline_rl_completion_matches=yes +-else ++else $as_nop + ac_cv_lib_readline_rl_completion_matches=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_matches" >&5 +-$as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; } +-if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_matches" >&5 ++printf "%s\n" "$ac_cv_lib_readline_rl_completion_matches" >&6; } ++if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes ++then : + +-$as_echo "#define HAVE_DECL_RL_COMPLETION_MATCHES 1" >>confdefs.h ++printf "%s\n" "#define HAVE_DECL_RL_COMPLETION_MATCHES 1" >>confdefs.h + + +-$as_echo "#define HAVE_RL_COMPENTRY_FUNC_T 1" >>confdefs.h ++printf "%s\n" "#define HAVE_RL_COMPENTRY_FUNC_T 1" >>confdefs.h + + fi + +@@ -8049,7 +8604,6 @@ fi + fi + + done +- + fi + + +@@ -8057,8 +8611,8 @@ fi + + # sockets + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking For network code for nsocket.c" >&5 +-$as_echo_n "checking For network code for nsocket.c... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking For network code for nsocket.c" >&5 ++printf %s "checking For network code for nsocket.c... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -8080,7 +8634,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + #include /* gethostbyname() */ + + int +-main () ++main (void) + { + + connect(0,(struct sockaddr *)0,0); +@@ -8091,22 +8645,23 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + +-$as_echo "#define HAVE_NSOCKET 1" >>confdefs.h ++printf "%s\n" "#define HAVE_NSOCKET 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking check for listen using fcntl" >&5 +-$as_echo_n "checking check for listen using fcntl... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking check for listen using fcntl" >&5 ++printf %s "checking check for listen using fcntl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -8114,7 +8669,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + #include + + int +-main () ++main (void) + { + + FILE *fp=fopen("configure.in","r"); +@@ -8126,44 +8681,48 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-$as_echo "#define LISTEN_USE_FCNTL 1" >>confdefs.h ++printf "%s\n" "#define LISTEN_USE_FCNTL 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + + ac_fn_c_check_func "$LINENO" "profil" "ac_cv_func_profil" +-if test "x$ac_cv_func_profil" = xyes; then : ++if test "x$ac_cv_func_profil" = xyes ++then : + +-else ++else $as_nop + +-$as_echo "#define NO_PROFILE 1" >>confdefs.h ++printf "%s\n" "#define NO_PROFILE 1" >>confdefs.h + + fi + + + ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" +-if test "x$ac_cv_func_setenv" = xyes; then : ++if test "x$ac_cv_func_setenv" = xyes ++then : + +-$as_echo "#define HAVE_SETENV 1" >>confdefs.h ++printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h + +-else ++else $as_nop + no_setenv=1 + fi + + + if test "$no_setenv" = "1" ; then + ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" +-if test "x$ac_cv_func_putenv" = xyes; then : ++if test "x$ac_cv_func_putenv" = xyes ++then : + +-$as_echo "#define HAVE_PUTENV 1" >>confdefs.h ++printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h + + fi + +@@ -8171,49 +8730,50 @@ fi + fi + + ac_fn_c_check_func "$LINENO" "_cleanup" "ac_cv_func__cleanup" +-if test "x$ac_cv_func__cleanup" = xyes; then : ++if test "x$ac_cv_func__cleanup" = xyes ++then : + +-$as_echo "#define USE_CLEANUP 1" >>confdefs.h ++printf "%s\n" "#define USE_CLEANUP 1" >>confdefs.h + + fi + + + gcl_ok=no + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5 +-$as_echo_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5 ++printf %s "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O... " >&6; } + + case $system in + OSF*) + +-$as_echo "#define USE_FIONBIO 1" >>confdefs.h ++printf "%s\n" "#define USE_FIONBIO 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 +-$as_echo "FIONBIO" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 ++printf "%s\n" "FIONBIO" >&6; } + ;; + SunOS-4*) + +-$as_echo "#define USE_FIONBIO 1" >>confdefs.h ++printf "%s\n" "#define USE_FIONBIO 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 +-$as_echo "FIONBIO" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 ++printf "%s\n" "FIONBIO" >&6; } + ;; + ULTRIX-4.*) + +-$as_echo "#define USE_FIONBIO 1" >>confdefs.h ++printf "%s\n" "#define USE_FIONBIO 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 +-$as_echo "FIONBIO" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 ++printf "%s\n" "FIONBIO" >&6; } + ;; + *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: O_NONBLOCK" >&5 +-$as_echo "O_NONBLOCK" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: O_NONBLOCK" >&5 ++printf "%s\n" "O_NONBLOCK" >&6; } + ;; + esac + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking check for SV_ONSTACK" >&5 +-$as_echo_n "checking check for SV_ONSTACK... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking check for SV_ONSTACK" >&5 ++printf %s "checking check for SV_ONSTACK... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -8221,28 +8781,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + int joe=SV_ONSTACK; + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-$as_echo "#define HAVE_SV_ONSTACK 1" >>confdefs.h ++printf "%s\n" "#define HAVE_SV_ONSTACK 1" >>confdefs.h + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking check for SIGSYS" >&5 +-$as_echo_n "checking check for SIGSYS... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking check for SIGSYS" >&5 ++printf %s "checking check for SIGSYS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -8250,29 +8811,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + int joe=SIGSYS; + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-$as_echo "#define HAVE_SIGSYS 1" >>confdefs.h ++printf "%s\n" "#define HAVE_SIGSYS 1" >>confdefs.h + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking check for SIGEMT" >&5 +-$as_echo_n "checking check for SIGEMT... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking check for SIGEMT" >&5 ++printf %s "checking check for SIGEMT... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -8280,62 +8842,55 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + int joe=SIGEMT; + + int +-main () ++main (void) + { + + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-$as_echo "#define HAVE_SIGEMT 1" >>confdefs.h ++printf "%s\n" "#define HAVE_SIGEMT 1" >>confdefs.h + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +-for ac_func in sigaltstack +-do : +- ac_fn_c_check_func "$LINENO" "sigaltstack" "ac_cv_func_sigaltstack" +-if test "x$ac_cv_func_sigaltstack" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_SIGALTSTACK 1 +-_ACEOF ++ac_fn_c_check_func "$LINENO" "sigaltstack" "ac_cv_func_sigaltstack" ++if test "x$ac_cv_func_sigaltstack" = xyes ++then : ++ printf "%s\n" "#define HAVE_SIGALTSTACK 1" >>confdefs.h + + fi +-done + +-for ac_func in feenableexcept +-do : +- ac_fn_c_check_func "$LINENO" "feenableexcept" "ac_cv_func_feenableexcept" +-if test "x$ac_cv_func_feenableexcept" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_FEENABLEEXCEPT 1 +-_ACEOF ++ac_fn_c_check_func "$LINENO" "feenableexcept" "ac_cv_func_feenableexcept" ++if test "x$ac_cv_func_feenableexcept" = xyes ++then : ++ printf "%s\n" "#define HAVE_FEENABLEEXCEPT 1" >>confdefs.h + + fi +-done + + +-for ac_header in dis-asm.h ++ for ac_header in dis-asm.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "dis-asm.h" "ac_cv_header_dis_asm_h" "$ac_includes_default" +-if test "x$ac_cv_header_dis_asm_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_DIS_ASM_H 1 +-_ACEOF ++ ac_fn_c_check_header_compile "$LINENO" "dis-asm.h" "ac_cv_header_dis_asm_h" "$ac_includes_default" ++if test "x$ac_cv_header_dis_asm_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_DIS_ASM_H 1" >>confdefs.h + MLIBS=$LIBS +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for init_disassemble_info in -lopcodes" >&5 +-$as_echo_n "checking for init_disassemble_info in -lopcodes... " >&6; } +-if ${ac_cv_lib_opcodes_init_disassemble_info+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for init_disassemble_info in -lopcodes" >&5 ++printf %s "checking for init_disassemble_info in -lopcodes... " >&6; } ++if test ${ac_cv_lib_opcodes_init_disassemble_info+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-lopcodes $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -8344,43 +8899,41 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char init_disassemble_info (); + int +-main () ++main (void) + { + return init_disassemble_info (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_opcodes_init_disassemble_info=yes +-else ++else $as_nop + ac_cv_lib_opcodes_init_disassemble_info=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_opcodes_init_disassemble_info" >&5 +-$as_echo "$ac_cv_lib_opcodes_init_disassemble_info" >&6; } +-if test "x$ac_cv_lib_opcodes_init_disassemble_info" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_LIBOPCODES 1 +-_ACEOF ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_opcodes_init_disassemble_info" >&5 ++printf "%s\n" "$ac_cv_lib_opcodes_init_disassemble_info" >&6; } ++if test "x$ac_cv_lib_opcodes_init_disassemble_info" = xyes ++then : ++ printf "%s\n" "#define HAVE_LIBOPCODES 1" >>confdefs.h + + LIBS="-lopcodes $LIBS" + + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +-$as_echo_n "checking for dlopen in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 ++printf %s "checking for dlopen in -ldl... " >&6; } ++if test ${ac_cv_lib_dl_dlopen+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-ldl $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -8389,83 +8942,71 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + /* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif + char dlopen (); + int +-main () ++main (void) + { + return dlopen (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_dl_dlopen=yes +-else ++else $as_nop + ac_cv_lib_dl_dlopen=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +-$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 ++printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } ++if test "x$ac_cv_lib_dl_dlopen" = xyes ++then : + #opcodes changes too quickly to link directly +- for ac_func in print_insn_i386 ++ ++ for ac_func in print_insn_i386 + do : + ac_fn_c_check_func "$LINENO" "print_insn_i386" "ac_cv_func_print_insn_i386" +-if test "x$ac_cv_func_print_insn_i386" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_PRINT_INSN_I386 1 +-_ACEOF ++if test "x$ac_cv_func_print_insn_i386" = xyes ++then : ++ printf "%s\n" "#define HAVE_PRINT_INSN_I386 1" >>confdefs.h + LIBS="$MLIBS -ldl" + fi +-done + ++done + fi + + fi + + done + +- + #if test $use = "386-linux" ; then +-for ac_header in asm/sigcontext.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "asm/sigcontext.h" "ac_cv_header_asm_sigcontext_h" "$ac_includes_default" +-if test "x$ac_cv_header_asm_sigcontext_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_ASM_SIGCONTEXT_H 1 +-_ACEOF ++ac_fn_c_check_header_compile "$LINENO" "asm/sigcontext.h" "ac_cv_header_asm_sigcontext_h" "$ac_includes_default" ++if test "x$ac_cv_header_asm_sigcontext_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_ASM_SIGCONTEXT_H 1" >>confdefs.h + + fi + +-done +- +-for ac_header in asm/signal.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "asm/signal.h" "ac_cv_header_asm_signal_h" "$ac_includes_default" +-if test "x$ac_cv_header_asm_signal_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_ASM_SIGNAL_H 1 +-_ACEOF ++ac_fn_c_check_header_compile "$LINENO" "asm/signal.h" "ac_cv_header_asm_signal_h" "$ac_includes_default" ++if test "x$ac_cv_header_asm_signal_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_ASM_SIGNAL_H 1" >>confdefs.h + + fi + +-done +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 +-$as_echo_n "checking for sigcontext...... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 ++printf %s "checking for sigcontext...... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + + #include + + int +-main () ++main (void) + { + + struct sigcontext foo; +@@ -8474,17 +9015,18 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-$as_echo "#define SIGNAL_H_HAS_SIGCONTEXT 1" >>confdefs.h ++printf "%s\n" "#define SIGNAL_H_HAS_SIGCONTEXT 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext of signal.h" >&5 +-$as_echo "sigcontext of signal.h" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext NOT of signal.h" >&5 +-$as_echo "sigcontext NOT of signal.h" >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 +-$as_echo_n "checking for sigcontext...... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: sigcontext of signal.h" >&5 ++printf "%s\n" "sigcontext of signal.h" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: sigcontext NOT of signal.h" >&5 ++printf "%s\n" "sigcontext NOT of signal.h" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 ++printf %s "checking for sigcontext...... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -8497,7 +9039,7 @@ $as_echo_n "checking for sigcontext..... + #endif + + int +-main () ++main (void) + { + + struct sigcontext foo; +@@ -8506,27 +9048,29 @@ main () + return 0; + } + _ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : ++if ac_fn_c_try_compile "$LINENO" ++then : + +-$as_echo "#define HAVE_SIGCONTEXT 1" >>confdefs.h ++printf "%s\n" "#define HAVE_SIGCONTEXT 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext asm files" >&5 +-$as_echo "sigcontext asm files" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no sigcontext found" >&5 +-$as_echo "no sigcontext found" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: sigcontext asm files" >&5 ++printf "%s\n" "sigcontext asm files" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no sigcontext found" >&5 ++printf "%s\n" "no sigcontext found" >&6; } + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + # Extract the first word of "emacs", so it can be a program name with args. + set dummy emacs; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_path_EMACS+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_path_EMACS+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + case $EMACS in + [\\/]* | ?:[\\/]*) + ac_cv_path_EMACS="$EMACS" # Let the user override the test with a path. +@@ -8536,11 +9080,15 @@ else + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_path_EMACS="$as_dir/$ac_word$ac_exec_ext" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ++ ac_cv_path_EMACS="$as_dir$ac_word$ac_exec_ext" ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -8552,11 +9100,11 @@ esac + fi + EMACS=$ac_cv_path_EMACS + if test -n "$EMACS"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EMACS" >&5 +-$as_echo "$EMACS" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $EMACS" >&5 ++printf "%s\n" "$EMACS" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -8575,8 +9123,8 @@ cat >> conftest.el <&5 +-$as_echo_n "checking emacs site lisp directory... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking emacs site lisp directory" >&5 ++printf %s "checking emacs site lisp directory... " >&6; } + if [ "$EMACS_SITE_LISP" = "unknown" ] ; then + if [ "$EMACS" != "" ] ; then + EMACS_SITE_LISP=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` +@@ -8584,8 +9132,8 @@ if [ "$EMACS_SITE_LISP" = "unknown" ] ; + EMACS_SITE_LISP="" + fi + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $EMACS_SITE_LISP" >&5 +-$as_echo "$EMACS_SITE_LISP" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $EMACS_SITE_LISP" >&5 ++printf "%s\n" "$EMACS_SITE_LISP" >&6; } + + + # check for where the emacs site lisp default.el is +@@ -8600,8 +9148,8 @@ cat >> conftest.el <&5 +-$as_echo_n "checking emacs default.el... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking emacs default.el" >&5 ++printf %s "checking emacs default.el... " >&6; } + if [ "$EMACS" != "" ] ; then + EMACS_DEFAULT_EL=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` + else +@@ -8612,8 +9160,8 @@ if test -f "${EMACS_DEFAULT_EL}" ; the + EMACS_DEFAULT_EL=${EMACS_SITE_LISP}/default.el + fi + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $EMACS_DEFAULT_EL" >&5 +-$as_echo "$EMACS_DEFAULT_EL" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $EMACS_DEFAULT_EL" >&5 ++printf "%s\n" "$EMACS_DEFAULT_EL" >&6; } + + + +@@ -8630,8 +9178,8 @@ cat >> conftest.el <&5 +-$as_echo_n "checking emacs info/dir... " >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking emacs info/dir" >&5 ++printf %s "checking emacs info/dir... " >&6; } + if test "$use" = "mingw" ; then + INFO_DIR=\$\(prefix\)/lib/gcl-$VERSION/info/ + else +@@ -8640,44 +9188,48 @@ else + fi + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INFO_DIR" >&5 +-$as_echo "$INFO_DIR" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INFO_DIR" >&5 ++printf "%s\n" "$INFO_DIR" >&6; } + + + # Check whether --enable-tcltk was given. +-if test "${enable_tcltk+set}" = set; then : ++if test ${enable_tcltk+y} ++then : + enableval=$enable_tcltk; + fi + + # Check whether --enable-tkconfig was given. +-if test "${enable_tkconfig+set}" = set; then : ++if test ${enable_tkconfig+y} ++then : + enableval=$enable_tkconfig; TK_CONFIG_PREFIX=$enableval +-else ++else $as_nop + TK_CONFIG_PREFIX=unknown + fi + + # Check whether --enable-tclconfig was given. +-if test "${enable_tclconfig+set}" = set; then : ++if test ${enable_tclconfig+y} ++then : + enableval=$enable_tclconfig; TCL_CONFIG_PREFIX=$enableval +-else ++else $as_nop + TCL_CONFIG_PREFIX=unknown + fi + + + if test "$enable_tcltk" != "no" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tcl/tk" >&5 +-$as_echo_n "checking for tcl/tk... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcl/tk" >&5 ++printf %s "checking for tcl/tk... " >&6; } + + if test -d "${TCL_CONFIG_PREFIX}" ; then true ; else + + # Extract the first word of "tclsh", so it can be a program name with args. + set dummy tclsh; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_TCLSH+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++printf %s "checking for $ac_word... " >&6; } ++if test ${ac_cv_prog_TCLSH+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + if test -n "$TCLSH"; then + ac_cv_prog_TCLSH="$TCLSH" # Let the user override the test. + else +@@ -8685,11 +9237,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac + for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_TCLSH="tclsh" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi + done +@@ -8701,11 +9257,11 @@ fi + fi + TCLSH=$ac_cv_prog_TCLSH + if test -n "$TCLSH"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLSH" >&5 +-$as_echo "$TCLSH" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TCLSH" >&5 ++printf "%s\n" "$TCLSH" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } + fi + + +@@ -8779,11 +9335,12 @@ EOF + TCL_LIBS="-L${TK_CONFIG_PREFIX}/../bin -ltk${TCL_VERSION_DOT_FREE} -ltcl${TCL_VERSION_DOT_FREE}" + TCL_STUB_LIBS="-L${TK_CONFIG_PREFIX}/lib -ltkstub${TCL_VERSION_DOT_FREE} -ltclstub${TCL_VERSION_DOT_FREE}" + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -llieee" >&5 +-$as_echo_n "checking for main in -llieee... " >&6; } +-if ${ac_cv_lib_lieee_main+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -llieee" >&5 ++printf %s "checking for main in -llieee... " >&6; } ++if test ${ac_cv_lib_lieee_main+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + ac_check_lib_save_LIBS=$LIBS + LIBS="-llieee $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +@@ -8791,27 +9348,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + + + int +-main () ++main (void) + { + return main (); + ; + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_lib_lieee_main=yes +-else ++else $as_nop + ac_cv_lib_lieee_main=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lieee_main" >&5 +-$as_echo "$ac_cv_lib_lieee_main" >&6; } +-if test "x$ac_cv_lib_lieee_main" = xyes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lieee_main" >&5 ++printf "%s\n" "$ac_cv_lib_lieee_main" >&6; } ++if test "x$ac_cv_lib_lieee_main" = xyes ++then : + have_ieee=1 +-else ++else $as_nop + have_ieee=0 + fi + +@@ -8844,15 +9403,16 @@ fi + + + if test -d "${TK_CONFIG_PREFIX}" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&5 +-$as_echo "using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&5 ++printf "%s\n" "using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +-$as_echo "not found" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 ++printf "%s\n" "not found" >&6; } + fi + + # Check whether --enable-notify was given. +-if test "${enable_notify+set}" = set; then : ++if test ${enable_notify+y} ++then : + enableval=$enable_notify; NOTIFY=$enable_notify + + fi +@@ -8862,63 +9422,52 @@ fi + # for sgbc the mprotect capabilities. + + # the time handling for unixtime, add timezone +-for ac_header in sys/mman.h ++ for ac_header in sys/mman.h + do : +- ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +-if test "x$ac_cv_header_sys_mman_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_SYS_MMAN_H 1 +-_ACEOF +- for ac_func in mprotect +-do : +- ac_fn_c_check_func "$LINENO" "mprotect" "ac_cv_func_mprotect" +-if test "x$ac_cv_func_mprotect" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_MPROTECT 1 +-_ACEOF ++ ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" ++if test "x$ac_cv_header_sys_mman_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_SYS_MMAN_H 1" >>confdefs.h ++ ac_fn_c_check_func "$LINENO" "mprotect" "ac_cv_func_mprotect" ++if test "x$ac_cv_func_mprotect" = xyes ++then : ++ printf "%s\n" "#define HAVE_MPROTECT 1" >>confdefs.h + + fi +-done + + fi + + done +- +-for ac_header in alloca.h +-do : +- ac_fn_c_check_header_mongrel "$LINENO" "alloca.h" "ac_cv_header_alloca_h" "$ac_includes_default" +-if test "x$ac_cv_header_alloca_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-#define HAVE_ALLOCA_H 1 +-_ACEOF ++ac_fn_c_check_header_compile "$LINENO" "alloca.h" "ac_cv_header_alloca_h" "$ac_includes_default" ++if test "x$ac_cv_header_alloca_h" = xyes ++then : ++ printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h + + fi + +-done +- + ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +-if test "x$ac_cv_type_size_t" = xyes; then : ++if test "x$ac_cv_type_size_t" = xyes ++then : + +-else ++else $as_nop + +-cat >>confdefs.h <<_ACEOF +-#define size_t unsigned int +-_ACEOF ++printf "%s\n" "#define size_t unsigned int" >>confdefs.h + + fi + + # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works + # for constant arguments. Useless! +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +-$as_echo_n "checking for working alloca.h... " >&6; } +-if ${ac_cv_working_alloca_h+:} false; then : +- $as_echo_n "(cached) " >&6 +-else ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 ++printf %s "checking for working alloca.h... " >&6; } ++if test ${ac_cv_working_alloca_h+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + #include + int +-main () ++main (void) + { + char *p = (char *) alloca (2 * sizeof (int)); + if (p) return 0; +@@ -8926,52 +9475,52 @@ char *p = (char *) alloca (2 * sizeof (i + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_working_alloca_h=yes +-else ++else $as_nop + ac_cv_working_alloca_h=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 +-$as_echo "$ac_cv_working_alloca_h" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 ++printf "%s\n" "$ac_cv_working_alloca_h" >&6; } + if test $ac_cv_working_alloca_h = yes; then + +-$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h ++printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h + + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 +-$as_echo_n "checking for alloca... " >&6; } +-if ${ac_cv_func_alloca_works+:} false; then : +- $as_echo_n "(cached) " >&6 ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 ++printf %s "checking for alloca... " >&6; } ++if test ${ac_cv_func_alloca_works+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if test $ac_cv_working_alloca_h = yes; then ++ ac_cv_func_alloca_works=yes + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#ifdef __GNUC__ +-# define alloca __builtin_alloca +-#else +-# ifdef _MSC_VER ++#include ++#include ++#ifndef alloca ++# ifdef __GNUC__ ++# define alloca __builtin_alloca ++# elif defined _MSC_VER + # include + # define alloca _alloca + # else +-# ifdef HAVE_ALLOCA_H +-# include +-# else +-# ifdef _AIX +- #pragma alloca +-# else +-# ifndef alloca /* predefined by HP cc +Olibcalls */ +-void *alloca (size_t); +-# endif +-# endif ++# ifdef __cplusplus ++extern "C" + # endif ++void *alloca (size_t); + # endif + #endif + + int +-main () ++main (void) + { + char *p = (char *) alloca (1); + if (p) return 0; +@@ -8979,20 +9528,22 @@ char *p = (char *) alloca (1); + return 0; + } + _ACEOF +-if ac_fn_c_try_link "$LINENO"; then : ++if ac_fn_c_try_link "$LINENO" ++then : + ac_cv_func_alloca_works=yes +-else ++else $as_nop + ac_cv_func_alloca_works=no + fi +-rm -f core conftest.err conftest.$ac_objext \ ++rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 +-$as_echo "$ac_cv_func_alloca_works" >&6; } ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 ++printf "%s\n" "$ac_cv_func_alloca_works" >&6; } ++fi + + if test $ac_cv_func_alloca_works = yes; then + +-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h ++printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h + + else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +@@ -9002,58 +9553,19 @@ else + + ALLOCA=\${LIBOBJDIR}alloca.$ac_objext + +-$as_echo "#define C_ALLOCA 1" >>confdefs.h +- ++printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 +-$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } +-if ${ac_cv_os_cray+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#if defined CRAY && ! defined CRAY2 +-webecray +-#else +-wenotbecray +-#endif +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "webecray" >/dev/null 2>&1; then : +- ac_cv_os_cray=yes +-else +- ac_cv_os_cray=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 +-$as_echo "$ac_cv_os_cray" >&6; } +-if test $ac_cv_os_cray = yes; then +- for ac_func in _getb67 GETB67 getb67; do +- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + +-cat >>confdefs.h <<_ACEOF +-#define CRAY_STACKSEG_END $ac_func +-_ACEOF +- +- break +-fi +- +- done +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 +-$as_echo_n "checking stack direction for C alloca... " >&6; } +-if ${ac_cv_c_stack_direction+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$cross_compiling" = yes; then : ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 ++printf %s "checking stack direction for C alloca... " >&6; } ++if test ${ac_cv_c_stack_direction+y} ++then : ++ printf %s "(cached) " >&6 ++else $as_nop ++ if test "$cross_compiling" = yes ++then : + ac_cv_c_stack_direction=0 +-else ++else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + $ac_includes_default +@@ -9074,9 +9586,10 @@ main (int argc, char **argv) + return find_stack_direction (0, argc + !argv + 20) < 0; + } + _ACEOF +-if ac_fn_c_try_run "$LINENO"; then : ++if ac_fn_c_try_run "$LINENO" ++then : + ac_cv_c_stack_direction=1 +-else ++else $as_nop + ac_cv_c_stack_direction=-1 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +@@ -9084,11 +9597,9 @@ rm -f core *.core core.conftest.* gmon.o + fi + + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 +-$as_echo "$ac_cv_c_stack_direction" >&6; } +-cat >>confdefs.h <<_ACEOF +-#define STACK_DIRECTION $ac_cv_c_stack_direction +-_ACEOF ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 ++printf "%s\n" "$ac_cv_c_stack_direction" >&6; } ++printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h + + + fi +@@ -9147,8 +9658,8 @@ _ACEOF + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( +- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ++ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 ++printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( +@@ -9178,15 +9689,15 @@ $as_echo "$as_me: WARNING: cache variabl + /^ac_cv_env_/b end + t clear + :clear +- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ ++ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache + if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +-$as_echo "$as_me: updating cache $cache_file" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 ++printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else +@@ -9200,8 +9711,8 @@ $as_echo "$as_me: updating cache $cache_ + fi + fi + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 ++printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi + fi + rm -f confcache +@@ -9218,7 +9729,7 @@ U= + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +- ac_i=`$as_echo "$ac_i" | sed "$ac_script"` ++ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" +@@ -9234,8 +9745,8 @@ LTLIBOBJS=$ac_ltlibobjs + ac_write_fail=0 + ac_clean_files_save=$ac_clean_files + ac_clean_files="$ac_clean_files $CONFIG_STATUS" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 ++printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} + as_write_fail=0 + cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 + #! $SHELL +@@ -9258,14 +9769,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_wri + + # Be more Bourne compatible + DUALCASE=1; export DUALCASE # for MKS sh +-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : ++as_nop=: ++if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 ++then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +-else ++else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( +@@ -9275,46 +9788,46 @@ esac + fi + + ++ ++# Reset variables that may have inherited troublesome values from ++# the environment. ++ ++# IFS needs to be set, to space, tab, and newline, in precisely that order. ++# (If _AS_PATH_WALK were called with IFS unset, it would have the ++# side effect of setting IFS to empty, thus disabling word splitting.) ++# Quoting is to prevent editors from complaining about space-tab. + as_nl=' + ' + export as_nl +-# Printing a long string crashes Solaris 7 /usr/bin/printf. +-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +-# Prefer a ksh shell builtin over an external printf program on Solaris, +-# but without wasting forks for bash or zsh. +-if test -z "$BASH_VERSION$ZSH_VERSION" \ +- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='print -r --' +- as_echo_n='print -rn --' +-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='printf %s\n' +- as_echo_n='printf %s' +-else +- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then +- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' +- as_echo_n='/usr/ucb/echo -n' +- else +- as_echo_body='eval expr "X$1" : "X\\(.*\\)"' +- as_echo_n_body='eval +- arg=$1; +- case $arg in #( +- *"$as_nl"*) +- expr "X$arg" : "X\\(.*\\)$as_nl"; +- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; +- esac; +- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" +- ' +- export as_echo_n_body +- as_echo_n='sh -c $as_echo_n_body as_echo' +- fi +- export as_echo_body +- as_echo='sh -c $as_echo_body as_echo' +-fi ++IFS=" "" $as_nl" ++ ++PS1='$ ' ++PS2='> ' ++PS4='+ ' ++ ++# Ensure predictable behavior from utilities with locale-dependent output. ++LC_ALL=C ++export LC_ALL ++LANGUAGE=C ++export LANGUAGE ++ ++# We cannot yet rely on "unset" to work, but we need these variables ++# to be unset--not just set to an empty or harmless value--now, to ++# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct ++# also avoids known problems related to "unset" and subshell syntax ++# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). ++for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH ++do eval test \${$as_var+y} \ ++ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : ++done ++ ++# Ensure that fds 0, 1, and 2 are open. ++if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi ++if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + + # The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then ++if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || +@@ -9323,13 +9836,6 @@ if test "${PATH_SEPARATOR+set}" != set; + fi + + +-# IFS +-# We need space, tab and new line, in precisely that order. Quoting is +-# there to prevent editors from complaining about space-tab. +-# (If _AS_PATH_WALK were called with IFS unset, it would disable word +-# splitting by setting IFS to empty value.) +-IFS=" "" $as_nl" +- + # Find who we are. Look in the path if we contain no directory separator. + as_myself= + case $0 in #(( +@@ -9338,8 +9844,12 @@ case $0 in #(( + for as_dir in $PATH + do + IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break ++ case $as_dir in #((( ++ '') as_dir=./ ;; ++ */) ;; ++ *) as_dir=$as_dir/ ;; ++ esac ++ test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done + IFS=$as_save_IFS + +@@ -9351,30 +9861,10 @@ if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then +- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 ++ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 + fi + +-# Unset variables that we do not need and which cause bugs (e.g. in +-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +-# suppresses any "Segmentation fault" message there. '((' could +-# trigger a bug in pdksh 5.2.14. +-for as_var in BASH_ENV ENV MAIL MAILPATH +-do eval test x\${$as_var+set} = xset \ +- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +-done +-PS1='$ ' +-PS2='> ' +-PS4='+ ' +- +-# NLS nuisances. +-LC_ALL=C +-export LC_ALL +-LANGUAGE=C +-export LANGUAGE +- +-# CDPATH. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + + # as_fn_error STATUS ERROR [LINENO LOG_FD] +@@ -9387,13 +9877,14 @@ as_fn_error () + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 ++ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi +- $as_echo "$as_me: error: $2" >&2 ++ printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status + } # as_fn_error + + ++ + # as_fn_set_status STATUS + # ----------------------- + # Set $? to STATUS, without forking. +@@ -9420,18 +9911,20 @@ as_fn_unset () + { eval $1=; unset $1;} + } + as_unset=as_fn_unset ++ + # as_fn_append VAR VALUE + # ---------------------- + # Append the text in VALUE to the end of the definition contained in VAR. Take + # advantage of any shell optimizations that allow amortized linear growth over + # repeated appends, instead of the typical quadratic growth present in naive + # implementations. +-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : ++if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null ++then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +-else ++else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 +@@ -9443,12 +9936,13 @@ fi # as_fn_append + # Perform arithmetic evaluation on the ARGs, and store the result in the + # global $as_val. Take advantage of shells that can avoid forks. The arguments + # must be portable across $(()) and expr. +-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : ++if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null ++then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +-else ++else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` +@@ -9479,7 +9973,7 @@ as_me=`$as_basename -- "$0" || + $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X/"$0" | ++printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q +@@ -9501,6 +9995,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTE + as_cr_digits='0123456789' + as_cr_alnum=$as_cr_Letters$as_cr_digits + ++ ++# Determine whether it's possible to make 'echo' print without a newline. ++# These variables are no longer used directly by Autoconf, but are AC_SUBSTed ++# for compatibility with existing Makefiles. + ECHO_C= ECHO_N= ECHO_T= + case `echo -n x` in #((((( + -n*) +@@ -9514,6 +10012,12 @@ case `echo -n x` in #((((( + ECHO_N='-n';; + esac + ++# For backward compatibility with old third-party macros, we provide ++# the shell variables $as_echo and $as_echo_n. New code should use ++# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. ++as_echo='printf %s\n' ++as_echo_n='printf %s' ++ + rm -f conf$$ conf$$.exe conf$$.file + if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +@@ -9555,7 +10059,7 @@ as_fn_mkdir_p () + as_dirs= + while :; do + case $as_dir in #( +- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( ++ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" +@@ -9564,7 +10068,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_dir" | ++printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q +@@ -9627,7 +10131,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri + # values after options handling. + ac_log=" + This file was extended by $as_me, which was +-generated by GNU Autoconf 2.69. Invocation command line was ++generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -9685,14 +10189,16 @@ $config_headers + Report bugs to the package provider." + + _ACEOF ++ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ++ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ++ac_cs_config='$ac_cs_config_escaped' + ac_cs_version="\\ + config.status +-configured by $0, generated by GNU Autoconf 2.69, ++configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +-Copyright (C) 2012 Free Software Foundation, Inc. ++Copyright (C) 2021 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + +@@ -9729,15 +10235,15 @@ do + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) +- $as_echo "$ac_cs_version"; exit ;; ++ printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) +- $as_echo "$ac_cs_config"; exit ;; ++ printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in +- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" +@@ -9745,7 +10251,7 @@ do + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in +- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; ++ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; +@@ -9754,7 +10260,7 @@ do + as_fn_error $? "ambiguous option: \`$1' + Try \`$0 --help' for more information.";; + --help | --hel | -h ) +- $as_echo "$ac_cs_usage"; exit ;; ++ printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; +@@ -9782,7 +10288,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ + if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift +- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 ++ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +@@ -9796,7 +10302,7 @@ exec 5>>config.log + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX + ## Running $as_me. ## + _ASBOX +- $as_echo "$ac_log" ++ printf "%s\n" "$ac_log" + } >&5 + + _ACEOF +@@ -9825,8 +10331,8 @@ done + # We use the long form for the default assignment because of an extremely + # bizarre bug on SunOS 4.1.3. + if $ac_need_defaults; then +- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers ++ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files ++ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + fi + + # Have a temporary directory for convenience. Make it in the build tree +@@ -10162,7 +10668,7 @@ do + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac +- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ++ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + +@@ -10170,17 +10676,17 @@ do + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` +- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' ++ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" +- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +-$as_echo "$as_me: creating $ac_file" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 ++printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) +- ac_sed_conf_input=`$as_echo "$configure_input" | ++ ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac +@@ -10197,7 +10703,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$ac_file" | ++printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q +@@ -10221,9 +10727,9 @@ $as_echo X"$ac_file" | + case "$ac_dir" in + .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) +- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` ++ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. +- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` ++ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; +@@ -10276,8 +10782,8 @@ ac_sed_dataroot=' + case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in + *datarootdir*) ac_datarootdir_seen=yes;; + *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 ++printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + _ACEOF + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' +@@ -10319,9 +10825,9 @@ test -z "$ac_datarootdir_hack$ac_dataroo + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + which seems to be undefined. Please make sure it is defined" >&5 +-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' ++printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' + which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" +@@ -10337,20 +10843,20 @@ which seems to be undefined. Please mak + # + if test x"$ac_file" != x-; then + { +- $as_echo "/* $configure_input */" \ ++ printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +-$as_echo "$as_me: $ac_file is unchanged" >&6;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 ++printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else +- $as_echo "/* $configure_input */" \ ++ printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +@@ -10391,8 +10897,8 @@ if test "$no_create" != yes; then + $ac_cs_success || as_fn_exit 1 + fi + if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 ++printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + fi + + echo makedefc +@@ -10405,3 +10911,4 @@ else + echo "Unable to guess machine type" + echo use configure --enable-machine=XXX, for XXX such that h/XXX.defs exists, ie in h/*.defs + fi ++ +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1,6 +1,6 @@ +-AC_INIT() +-AC_PREREQ([2.61]) +-AC_CONFIG_HEADER(h/gclincl.h) ++AC_INIT ++AC_PREREQ([2.71]) ++AC_CONFIG_HEADERS([h/gclincl.h]) + + VERSION=`cat majvers`.`cat minvers` + AC_SUBST(VERSION) +@@ -265,7 +265,7 @@ add_args_to_cflags -fsigned-char -pipe + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ + -Wno-unused-but-set-variable + +-add_args_to_ldflags -no-pie -Wl,-z,lazy ++add_args_to_ldflags -no-pie # -Wl,-z,lazy + + AC_MSG_CHECKING([for clang]) + AC_RUN_IFELSE( +@@ -1277,7 +1277,7 @@ AC_RUN_IFELSE( + main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); +- unsigned long i,j; ++ long i,j; + + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" +@@ -1285,7 +1285,7 @@ AC_RUN_IFELSE( + j=1; + j<<=$PAGEWIDTH; + j<<=16; +- i=(unsigned long)&v; ++ i=(long)&v; + if ($cstack_direction==1) i-=j; + j--; + i+=j; +@@ -1329,7 +1329,7 @@ if test "$use" != "386-gnu" ; then #hurd + touch unixport/gcl.script + echo "int main() {return 0;}" >foo.c + $CC $LDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ +- $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script ++ $AWK '/==================================================/ {i=1-i;next} {if (i) print}' >gcl.script + rm -rf foo.c foo + + if test "`cat gcl.script | wc -l`" != "0" ; then +@@ -1400,6 +1400,7 @@ if test "$use" != "386-gnu" ; then #hurd + fi + rm -rf foo.c foo + else ++ AC_DEFINE_UNQUOTED(OBJNULL,NULL,[lowest address non-object]) + AC_MSG_RESULT([not found]) + fi + +@@ -2121,7 +2122,8 @@ AC_SUBST(GNU_LD) + if test -f h/$use.defs ; then + + AC_SUBST(use) +- AC_OUTPUT(makedefc windows/gcl.iss windows/sysdir.bat windows/install.lsp ) ++ AC_CONFIG_FILES([makedefc windows/gcl.iss windows/sysdir.bat windows/install.lsp ]) ++AC_OUTPUT + echo makedefc + cat makedefc + +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -179,6 +179,7 @@ EXTER object sLAterminal_ioA; + EXTER object sLAtrace_outputA; + EXTER object terminal_io; + EXTER object standard_io; ++EXTER object standard_error; + + EXTER object sLAload_verboseA; + EXTER object FASL_string; +--- gcl-2.6.12.orig/h/compdefs.h ++++ gcl-2.6.12/h/compdefs.h +@@ -58,6 +58,7 @@ NULL + FALSE + TRUE + is_imm_fixnum(x) ++is_unmrkd_imm_fixnum(x) + aref1 + VFUN_NARGS + KEYTYPE +--- gcl-2.6.12.orig/h/fixnum.h ++++ gcl-2.6.12/h/fixnum.h +@@ -3,7 +3,7 @@ + #define LOW_IM_FIX (1L<<(LOW_SHFT-1)) + #define INT_IN_BITS(a_,b_) ({fixnum _a=(fixnum)(a_);_a>>(b_)==_a>>(CHAR_SIZE*SIZEOF_LONG-1);}) + +-#define make_imm_fixnum(a_) ((object)a_) ++#define make_imm_fixnum(a_) ((object)(fixnum)a_) + #define fix_imm_fixnum(a_) ((fixnum)a_) + #define mark_imm_fixnum(a_) ((a_)=((object)((fixnum)(a_)+(LOW_IM_FIX<<1)))) + #define unmark_imm_fixnum(a_) ((a_)=((object)((fixnum)(a_)-(LOW_IM_FIX<<1)))) +--- gcl-2.6.12.orig/h/immnum.h ++++ gcl-2.6.12/h/immnum.h +@@ -202,8 +202,7 @@ fixnum_bitp(fixnum p,fixnum x) {return f + INLINE bool + immnum_bitp(object x,object y) {return iif2(x,y) ? fixnum_bitp(fif(x),fif(y)) : integer_bitp(x,y);} + +- +-#define immnum_comp(x,y,c) iif2(x,y) ? (x c y) : (number_compare(x,y) c 0) ++#define immnum_comp(x,y,c) iif2(x,y) ? ((fixnum)x c (fixnum)y) : (number_compare(x,y) c 0) + + INLINE bool + immnum_lt(object x,object y) {return immnum_comp(x,y,<);} +@@ -219,19 +218,19 @@ INLINE bool + immnum_ge(object x,object y) {return immnum_comp(x,y,>=);} + + INLINE bool +-immnum_minusp(object x) {return iif(x) ? ((ufixnum)x)<((ufixnum)make_fixnum(0)) : number_minusp(x);} ++immnum_minusp(object x) {return iif(x) ? ((fixnum)x)<((fixnum)make_fixnum(0)) : number_minusp(x);} + INLINE bool +-immnum_plusp(object x) {return iif(x) ? ((ufixnum)x)>((ufixnum)make_fixnum(0)) : number_plusp(x);} ++immnum_plusp(object x) {return iif(x) ? ((fixnum)x)>((fixnum)make_fixnum(0)) : number_plusp(x);} + INLINE bool +-immnum_zerop(object x) {return iif(x) ? ((ufixnum)x)==((ufixnum)make_fixnum(0)) : number_zerop(x);} ++immnum_zerop(object x) {return iif(x) ? ((fixnum)x)==((fixnum)make_fixnum(0)) : number_zerop(x);} + INLINE bool +-immnum_evenp(object x) {return iif(x) ? !(((ufixnum)x)&0x1) : number_evenp(x);} ++immnum_evenp(object x) {return iif(x) ? !(((fixnum)x)&0x1) : number_evenp(x);} + INLINE bool +-immnum_oddp(object x) {return iif(x) ? (((ufixnum)x)&0x1) : number_oddp(x);} ++immnum_oddp(object x) {return iif(x) ? (((fixnum)x)&0x1) : number_oddp(x);} + + INLINE object + immnum_signum(object x) { +- ufixnum ux=(ufixnum)x,uz=((ufixnum)make_fixnum(0)); ++ fixnum ux=(fixnum)x,uz=((fixnum)make_fixnum(0)); + return iif(x) ? (ux=(ufixnum)y ? x : y) : (number_compare(x,y)>=0?x:y);} ++immnum_max(object x,object y) {return iif2(x,y) ? ((fixnum)x>=(fixnum)y ? x : y) : (number_compare(x,y)>=0?x:y);} + INLINE object +-immnum_min(object x,object y) {return iif2(x,y) ? ((ufixnum)x<=(ufixnum)y ? x : y) : (number_compare(x,y)<=0?x:y);} ++immnum_min(object x,object y) {return iif2(x,y) ? ((fixnum)x<=(fixnum)y ? x : y) : (number_compare(x,y)<=0?x:y);} + + INLINE bool + immnum_logt(object x,object y) {return iif2(x,y) ? fixnum_boole(BOOLAND,fif(x),fif(y))!=0 : !number_zerop(log_op2(BOOLAND,x,y));} +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -283,10 +283,12 @@ gcl_init_cmp_anon(void); + #ifdef SGC + #define SAFE_READ(a_,b_,c_) \ + ({int _a=(a_),_c=(c_);char *_b=(b_);extern int sgc_enabled;\ +- if (sgc_enabled) memset(_b,0,_c);read(_a,_b,_c);}) ++ if (sgc_enabled) memset(_b,0,_c); \ ++ read(_a,_b,_c);}) + #define SAFE_FREAD(a_,b_,c_,d_) \ + ({int _b=(b_),_c=(c_);char *_a=(a_);FILE *_d=(d_);extern int sgc_enabled; \ +- if (sgc_enabled) memset(_a,0,_b*_c);fread(_a,_b,_c,_d);}) ++ if (sgc_enabled) memset(_a,0,_b*_c); \ ++ fread(_a,_b,_c,_d);}) + #else + #define SAFE_READ(a_,b_,c_) read((a_),(b_),(c_)) + #define SAFE_FREAD(a_,b_,c_,d_) fread((a_),(b_),(c_),(d_)) +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1974,3 +1974,6 @@ new_cfdata(void); + + int + home_namestring1(const char *,int,char *,int); ++ ++object ++gcl_make_hash_table(object); +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -387,7 +387,7 @@ DEFUN_NEW("UNIVERSAL-ERROR-HANDLER",obje + int i; + /* 5 args */ + for (i = 0; i < error_fmt_string->st.st_fillp; i++) +- fputc(error_fmt_string->st.st_self[i],stdout); ++ fputc(error_fmt_string->st.st_self[i],stderr); + printf("\nLisp initialization failed.\n"); + do_gcl_abort(); + RETURN1(x0); +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -586,7 +586,7 @@ DEFUN_NEW("OPEN-FASD",object,fSopen_fasd + check_type(tabl,t_vector);} + if(direction==sKoutput) + {str=coerce_stream(stream,1); +- if(tabl==Cnil) tabl=funcall_cfun(Lmake_hash_table,2,sKtest,sLeq); ++ if(tabl==Cnil) tabl=gcl_make_hash_table(sLeq); + else + check_type(tabl,t_hashtable);} + massert(str==stream); +@@ -1026,7 +1026,7 @@ grow_vector(object ar) + ar->v.v_dim= ar->v.v_fillp=nl; + while(--nl >=len) + ar->v.v_self[nl]=Cnil; +- END_NO_INTERRUPT;}} ++ END_NO_INTERRUPT;}} + } + + static void +--- gcl-2.6.12.orig/o/fat_string.c ++++ gcl-2.6.12/o/fat_string.c +@@ -274,11 +274,13 @@ endar=aar+dim; + + + DEFUN_NEW("DISPLAY-PROFILE",object,fSdisplay_profile,SI +- ,2,2,NONE,OO,OO,OO,OO,(object start_addr,object scal),"") +-{if (!combined_table.ptable) +- FEerror("must symbols first",0); +- /* 2 args */ +- {unsigned int prev,next,upto,dim,total; ++ ,2,2,NONE,OO,OO,OO,OO,(object start_addr,object scal),"") { ++ ++ if (!combined_table.ptable) ++ FEerror("must symbols first",0); ++ /* 2 args */ ++ { ++ unsigned int prev,next,upto,dim,total; + int j,scale,count; + unsigned char *ar; + object obj_ar; +@@ -292,35 +294,42 @@ DEFUN_NEW("DISPLAY-PROFILE",object,fSdis + dim= (obj_ar->ust.ust_dim); + + total=string_sum(ar,dim); +- ++ + j=0; +- {int i, finish = combined_table.length-1; +- for(i =0,prev=SYM_ADDRESS(combined_table,i); i< finish; +- prev=next) +- { ++i; +- next=SYM_ADDRESS(combined_table,i); +- if ( prev < prof_start) continue; +- upto=prof_ind(next,scale); +- if (upto >= dim) upto=dim; +- {const char *name; unsigned long uname; ++ { ++ int i, finish = combined_table.length-1; ++ for(i =0,prev=SYM_ADDRESS(combined_table,i); i< finish;prev=next) { ++ ++i; ++ next=SYM_ADDRESS(combined_table,i); ++ if (prev= dim) ++ upto=dim; ++ { ++ const char *name; unsigned long uname; + count=0; +- for( ; j 0) { + name=SYM_STRING(combined_table,i-1); + uname = (unsigned long) name; + printf("\n%6.2f%% (%5d): ",(100.0*count)/total, count); + fflush(stdout); +- if (CF_FLAG & uname) +- {if (~CF_FLAG & uname) prin1( ((object) (~CF_FLAG & uname))->cf.cf_name,Cnil);} +- else if (name ) printf("%s",name);}; ++ if (CF_FLAG & uname) { ++ if (~CF_FLAG & uname) ++ prin1( ((object) (~CF_FLAG & uname))->cf.cf_name,Cnil); ++ } else if (name ) ++ printf("%s",name);}; + if (upto==dim) goto TOTALS ; +- +- }}} +- TOTALS: +- printf("\nTotal ticks %d",total);fflush(stdout); ++ ++ } ++ } ++ } ++ TOTALS: ++ printf("\nTotal ticks %d",total);fflush(stdout); + } +- RETURN1(start_addr); ++ RETURN1(start_addr); + } + + +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -524,7 +524,7 @@ close_stream(object strm) { + + switch (strm->sm.sm_mode) { + case smm_output: +- if (strm->sm.sm_fp == stdout) ++ if (strm->sm.sm_fp == stdout || strm->sm.sm_fp == stderr) + FEerror("Cannot close the standard output.", 0); + fflush(strm->sm.sm_fp); + deallocate_stream_buffer(strm); +@@ -2226,9 +2226,10 @@ DEF_ORDINARY("SOCKET",sSsocket,SI,""); + #endif /* HAVE_NSOCKET */ + + object standard_io; ++object standard_error; + DEFVAR("*STANDARD-INPUT*",sLAstandard_inputA,LISP,(gcl_init_file(),standard_io),""); + DEFVAR("*STANDARD-OUTPUT*",sLAstandard_outputA,LISP,standard_io,""); +-DEFVAR("*ERROR-OUTPUT*",sLAerror_outputA,LISP,standard_io,""); ++DEFVAR("*ERROR-OUTPUT*",sLAerror_outputA,LISP,standard_error,""); + DEFVAR("*TERMINAL-IO*",sLAterminal_ioA,LISP,terminal_io,""); + DEFVAR("*QUERY-IO*",sLAquery_ioA,LISP, + (standard_io->sm.sm_object0 = sLAterminal_ioA, +@@ -2268,6 +2269,19 @@ gcl_init_file(void) + standard_output->sm.sm_int = 0; /* unused */ + standard_output->sm.sm_flags=0; + ++ standard_error = alloc_object(t_stream); ++ standard_error->sm.sm_mode = (short)smm_output; ++ standard_error->sm.sm_fp = stderr; ++ standard_error->sm.sm_buffer = 0; ++ standard_error->sm.sm_object0 = sLcharacter; ++ standard_error->sm.sm_object1 ++#ifdef UNIX ++ = make_simple_string("stderr"); ++#endif ++ standard_error->sm.sm_int = 0; /* unused */ ++ standard_error->sm.sm_flags=0; ++ enter_mark_origin(&standard_error); ++ + terminal_io = standard + = make_two_way_stream(standard_input, standard_output); + enter_mark_origin(&terminal_io); +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -1099,7 +1099,7 @@ GBC(enum type t) { + if (tm->tm_type==v->type) + for (x=pagetochar(page(v)),j=tm->tm_nppage;j--;x+=tm->tm_size) { + object o=x; +- if (type_of(o)==t_stream && !is_free(o) && o->sm.sm_fp && o->sm.sm_fp!=stdin && o->sm.sm_fp!=stdout) ++ if (type_of(o)==t_stream && !is_free(o) && o->sm.sm_fp && o->sm.sm_fp!=stdin && o->sm.sm_fp!=stdout && o->sm.sm_fp!=stderr) + close_stream(o); + } + +--- gcl-2.6.12.orig/o/hash.d ++++ gcl-2.6.12/o/hash.d +@@ -313,67 +313,87 @@ DEFVAR("*DEFAULT-HASH-TABLE-SIZE*",sSAde + DEFVAR("*DEFAULT-HASH-TABLE-REHASH-SIZE*",sSAdefault_hash_table_rehash_sizeA,SI,make_shortfloat((shortfloat)1.5),""); + DEFVAR("*DEFAULT-HASH-TABLE-REHASH-THRESHOLD*",sSAdefault_hash_table_rehash_thresholdA,SI,make_shortfloat((shortfloat)0.7),""); + +-@(defun make_hash_table (&key (test sLeql) +- (size `sSAdefault_hash_table_sizeA->s.s_dbind`) +- (rehash_size +- `sSAdefault_hash_table_rehash_sizeA->s.s_dbind`) +- (rehash_threshold +- `sSAdefault_hash_table_rehash_thresholdA->s.s_dbind`) +- (static `Cnil`) +- &aux h) +- enum httest htt=0; +- int i; +-@ +- if (test == sLeq || test == sLeq->s.s_gfdef) +- htt = htt_eq; +- else if (test == sLeql || test == sLeql->s.s_gfdef) +- htt = htt_eql; +- else if (test == sLequal || test == sLequal->s.s_gfdef) +- htt = htt_equal; +- else +- FEerror("~S is an illegal hash-table test function.", +- 1, test); +- if (type_of(size) != t_fixnum || 0 < fix(size)) +- ; +- else +- FEerror("~S is an illegal hash-table size.", 1, size); +- if ((type_of(rehash_size) == t_fixnum && 0 < fix(rehash_size)) || +- (type_of(rehash_size) == t_shortfloat && 1.0 < sf(rehash_size)) || +- (type_of(rehash_size) == t_longfloat && 1.0 < lf(rehash_size))) +- ; +- else +- FEerror("~S is an illegal hash-table rehash-size.", +- 1, rehash_size); +- if ((type_of(rehash_threshold) == t_fixnum && +- 0 < fix(rehash_threshold) && fix(rehash_threshold) < fix(size)) || +- (type_of(rehash_threshold) == t_shortfloat && +- 0.0 < sf(rehash_threshold) && sf(rehash_threshold) < 1.0) || +- (type_of(rehash_threshold) == t_longfloat && +- 0.0 < lf(rehash_threshold) && lf(rehash_threshold) < 1.0)) +- ; +- else +- FEerror("~S is an illegal hash-table rehash-threshold.", +- 1, rehash_threshold); +- {BEGIN_NO_INTERRUPT; +- h = alloc_object(t_hashtable); +- h->ht.ht_test = (short)htt; +- h->ht.ht_size = fix(size); +- h->ht.ht_rhsize = rehash_size; +- h->ht.ht_rhthresh = rehash_threshold; +- h->ht.ht_cache=NULL; +- h->ht.ht_nent = 0; +- h->ht.ht_static = static!=Cnil ? 1 : 0; +- h->ht.ht_self = NULL; +- h->ht.ht_self = h->ht.ht_static ? +- (struct htent *)alloc_contblock(fix(size) * sizeof(struct htent)) : +- (struct htent *)alloc_relblock(fix(size) * sizeof(struct htent)); +- for(i = 0; i < fix(size); i++) { +- h->ht.ht_self[i].hte_key = OBJNULL; +- h->ht.ht_self[i].hte_value = OBJNULL; +- } +- END_NO_INTERRUPT;} +- @(return h) +-@) ++DEFUN_NEW("MAKE-HASH-TABLE",object,fLmake_hash_table,LISP,0,63,NONE,OO,OO,OO,OO,(object first,...),"") { ++ ++ int i=0,nargs=VFUN_NARGS; ++ object *base=vs_top,test,size,rehash_size,rehash_threshold,staticp,h; ++ enum httest htt=0; ++ va_list ap; ++ ++ if (nargs>0) { ++ vs_push(first); ++ va_start(ap,first); ++ for (i++;is.s_dbind : *base;base++; ++ rehash_size=base[5]==Cnil ? sSAdefault_hash_table_rehash_sizeA->s.s_dbind : *base;base++; ++ rehash_threshold=base[5]==Cnil ? sSAdefault_hash_table_rehash_thresholdA->s.s_dbind : *base;base++; ++ staticp=base[5]==Cnil ? Cnil : *base; ++ vs_top=base; ++ ++ if (test == sLeq || test == sLeq->s.s_gfdef) ++ htt = htt_eq; ++ else if (test == sLeql || test == sLeql->s.s_gfdef) ++ htt = htt_eql; ++ else if (test == sLequal || test == sLequal->s.s_gfdef) ++ htt = htt_equal; ++ else ++ FEerror("~S is an illegal hash-table test function.", ++ 1, test); ++ if (type_of(size) != t_fixnum || 0 < fix(size)) ++ ; ++ else ++ FEerror("~S is an illegal hash-table size.", 1, size); ++ if ((type_of(rehash_size) == t_fixnum && 0 < fix(rehash_size)) || ++ (type_of(rehash_size) == t_shortfloat && 1.0 < sf(rehash_size)) || ++ (type_of(rehash_size) == t_longfloat && 1.0 < lf(rehash_size))) ++ ; ++ else ++ FEerror("~S is an illegal hash-table rehash-size.", ++ 1, rehash_size); ++ if ((type_of(rehash_threshold) == t_fixnum && ++ 0 < fix(rehash_threshold) && fix(rehash_threshold) < fix(size)) || ++ (type_of(rehash_threshold) == t_shortfloat && ++ 0.0 < sf(rehash_threshold) && sf(rehash_threshold) < 1.0) || ++ (type_of(rehash_threshold) == t_longfloat && ++ 0.0 < lf(rehash_threshold) && lf(rehash_threshold) < 1.0)) ++ ; ++ else ++ FEerror("~S is an illegal hash-table rehash-threshold.", ++ 1, rehash_threshold); ++ {BEGIN_NO_INTERRUPT; ++ h = alloc_object(t_hashtable); ++ h->ht.ht_test = (short)htt; ++ h->ht.ht_size = fix(size); ++ h->ht.ht_rhsize = rehash_size; ++ h->ht.ht_rhthresh = rehash_threshold; ++ h->ht.ht_cache=NULL; ++ h->ht.ht_nent = 0; ++ h->ht.ht_static = staticp!=Cnil ? 1 : 0; ++ h->ht.ht_self = NULL; ++ h->ht.ht_self = h->ht.ht_static ? ++ (struct htent *)alloc_contblock(fix(size) * sizeof(struct htent)) : ++ (struct htent *)alloc_relblock(fix(size) * sizeof(struct htent)); ++ for(i = 0; i < fix(size); i++) { ++ h->ht.ht_self[i].hte_key = OBJNULL; ++ h->ht.ht_self[i].hte_value = OBJNULL; ++ } ++ END_NO_INTERRUPT;} ++ ++ RETURN1(h); ++ ++} ++ ++object ++gcl_make_hash_table(object test) { ++ return (VFUN_NARGS=2,fLmake_hash_table(sKtest,test)); ++} ++ + + LFD(Lhash_table_p)(void) + { +@@ -550,7 +570,6 @@ gcl_init_hash() + sKrehash_threshold = make_keyword("REHASH-THRESHOLD"); + sKstatic = make_keyword("STATIC"); + +- make_function("MAKE-HASH-TABLE", Lmake_hash_table); + make_function("HASH-TABLE-P", Lhash_table_p); + make_function("GETHASH", Lgethash); + make_function("REMHASH", Lremhash); +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -80,6 +80,7 @@ char *system_directory; + #define EXTRA_BUFSIZE 8 + char stdin_buf[BUFSIZ + EXTRA_BUFSIZE]; + char stdout_buf[BUFSIZ + EXTRA_BUFSIZE]; ++char stderr_buf[BUFSIZ + EXTRA_BUFSIZE]; + + #include "stacks.h" + +@@ -531,6 +532,7 @@ main(int argc, char **argv, char **envp) + + setbuf(stdin, stdin_buf); + setbuf(stdout, stdout_buf); ++ setbuf(stderr, stderr_buf); + #ifdef _WIN32 + _fmode = _O_BINARY; + _setmode( _fileno( stdin ), _O_BINARY ); +@@ -566,9 +568,6 @@ main(int argc, char **argv, char **envp) + + } else { + +- terminal_io->sm.sm_object0->sm.sm_fp = stdin; +- terminal_io->sm.sm_object1->sm.sm_fp = stdout; +- + gcl_init_big1(); + #ifdef USE_READLINE + gcl_init_readline_function(); +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -343,7 +343,7 @@ truncate_double(char *b,double d,int dp) + + strcpy(c,n); + for (p=c;*p && *p!='e';p++); +- if (p[-1]!='.' && char_inc(c,p-1) && COMP(c,&pp,d,dp)) { ++ if (p>c && p[-1]!='.' && char_inc(c,p-1) && COMP(c,&pp,d,dp)) { + j=truncate_double(c,d,dp); + if (j<=k) { + k=j; +@@ -1521,7 +1521,7 @@ setupPRINTcircle(object x,int dogensyms) + + travel(x,dogensyms,PRINTarray); + +- h=vs_top>vp ? funcall_cfun(Lmake_hash_table,2,sKtest,sLeq) : Cnil; ++ h=vs_top>vp ? gcl_make_hash_table(sLeq) : Cnil; + for (j=0;vhte_key==OBJNULL) + sethash(*v,h,make_fixnum((j++)<<1)); diff --git a/debian/patches/Version_2.6.13pre107 b/debian/patches/Version_2.6.13pre107 new file mode 100644 index 0000000..7b5b0be --- /dev/null +++ b/debian/patches/Version_2.6.13pre107 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-110) unstable; urgency=medium + . + * Version_2.6.13pre107 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-11-11 + +--- gcl-2.6.12.orig/o/hash.d ++++ gcl-2.6.12/o/hash.d +@@ -391,7 +391,7 @@ DEFUN_NEW("MAKE-HASH-TABLE",object,fLmak + + object + gcl_make_hash_table(object test) { +- return (VFUN_NARGS=2,fLmake_hash_table(sKtest,test)); ++ return (VFUN_NARGS=2,FFN(fLmake_hash_table)(sKtest,test)); + } + + diff --git a/debian/patches/Version_2.6.13pre108 b/debian/patches/Version_2.6.13pre108 new file mode 100644 index 0000000..f997ad5 --- /dev/null +++ b/debian/patches/Version_2.6.13pre108 @@ -0,0 +1,38 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-111) unstable; urgency=medium + . + * Version_2.6.13pre108 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-11-11 + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -568,6 +568,10 @@ main(int argc, char **argv, char **envp) + + } else { + ++ terminal_io->sm.sm_object0->sm.sm_fp = stdin; ++ terminal_io->sm.sm_object1->sm.sm_fp = stdout; ++ standard_error->sm.sm_fp = stderr; ++ + gcl_init_big1(); + #ifdef USE_READLINE + gcl_init_readline_function(); diff --git a/debian/patches/Version_2.6.13pre109 b/debian/patches/Version_2.6.13pre109 new file mode 100644 index 0000000..d301d9f --- /dev/null +++ b/debian/patches/Version_2.6.13pre109 @@ -0,0 +1,2643 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-112) unstable; urgency=medium + . + * Version_2.6.13pre109 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-12-15 + +--- gcl-2.6.12.orig/config.guess ++++ gcl-2.6.12/config.guess +@@ -1,8 +1,8 @@ + #! /bin/sh + # Attempt to guess a canonical system name. +-# Copyright 1992-2015 Free Software Foundation, Inc. ++# Copyright 1992-2018 Free Software Foundation, Inc. + +-timestamp='2015-08-20' ++timestamp='2018-02-24' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -15,7 +15,7 @@ timestamp='2015-08-20' + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, see . ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +@@ -27,7 +27,7 @@ timestamp='2015-08-20' + # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. + # + # You can get the latest version of this script from: +-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD ++# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess + # + # Please send patches to . + +@@ -39,7 +39,7 @@ Usage: $0 [OPTION] + + Output the configuration name of the system \`$me' is run on. + +-Operation modes: ++Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit +@@ -50,7 +50,7 @@ version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright 1992-2015 Free Software Foundation, Inc. ++Copyright 1992-2018 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -107,9 +107,9 @@ trap "rm -f \$tmpfiles 2>/dev/null; rmdi + dummy=$tmp/dummy ; + tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; + case $CC_FOR_BUILD,$HOST_CC,$CC in +- ,,) echo "int x;" > $dummy.c ; ++ ,,) echo "int x;" > "$dummy.c" ; + for c in cc gcc c89 c99 ; do +- if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then ++ if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; +@@ -132,14 +132,14 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` | + UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +-case "${UNAME_SYSTEM}" in ++case "$UNAME_SYSTEM" in + Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + +- eval $set_cc_for_build +- cat <<-EOF > $dummy.c ++ eval "$set_cc_for_build" ++ cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc +@@ -149,13 +149,20 @@ Linux|GNU|GNU/*) + LIBC=gnu + #endif + EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ++ eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" ++ ++ # If ldd exists, use it to detect musl libc. ++ if command -v ldd >/dev/null && \ ++ ldd --version 2>&1 | grep -q ^musl ++ then ++ LIBC=musl ++ fi + ;; + esac + + # Note: order is significant - the case branches are not exclusive. + +-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, +@@ -169,27 +176,30 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ +- /sbin/$sysctl 2>/dev/null || \ +- /usr/sbin/$sysctl 2>/dev/null || \ ++ "/sbin/$sysctl" 2>/dev/null || \ ++ "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` +- case "${UNAME_MACHINE_ARCH}" in ++ case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) +- arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` +- endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` +- machine=${arch}${endian}-unknown ++ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` ++ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` ++ machine="${arch}${endian}"-unknown + ;; +- *) machine=${UNAME_MACHINE_ARCH}-unknown ;; ++ *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched +- # to ELF recently, or will in the future. +- case "${UNAME_MACHINE_ARCH}" in +- arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) +- eval $set_cc_for_build ++ # to ELF recently (or will in the future) and ABI. ++ case "$UNAME_MACHINE_ARCH" in ++ earm*) ++ os=netbsdelf ++ ;; ++ arm*|i386|m68k|ns32k|sh3*|sparc|vax) ++ eval "$set_cc_for_build" + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then +@@ -205,10 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + ;; + esac + # Determine ABI tags. +- case "${UNAME_MACHINE_ARCH}" in ++ case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' +- abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ++ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release +@@ -216,42 +226,55 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. +- case "${UNAME_VERSION}" in ++ case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) +- release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ++ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. +- echo "${machine}-${os}${release}${abi}" ++ echo "$machine-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` +- echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} ++ echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` +- echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} ++ echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" ++ exit ;; ++ *:LibertyBSD:*:*) ++ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` ++ echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" ++ exit ;; ++ *:MidnightBSD:*:*) ++ echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) +- echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) +- echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) +- echo powerpc-unknown-mirbsd${UNAME_RELEASE} ++ echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) +- echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) +- echo ${UNAME_MACHINE}-unknown-sortix ++ echo "$UNAME_MACHINE"-unknown-sortix + exit ;; ++ *:Redox:*:*) ++ echo "$UNAME_MACHINE"-unknown-redox ++ exit ;; ++ mips:OSF1:*.*) ++ echo mips-dec-osf1 ++ exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) +@@ -268,63 +291,54 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") +- UNAME_MACHINE="alpha" ;; ++ UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") +- UNAME_MACHINE="alpha" ;; ++ UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") +- UNAME_MACHINE="alpha" ;; ++ UNAME_MACHINE=alpha ;; + "EV5 (21164)") +- UNAME_MACHINE="alphaev5" ;; ++ UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") +- UNAME_MACHINE="alphaev56" ;; ++ UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") +- UNAME_MACHINE="alphapca56" ;; ++ UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") +- UNAME_MACHINE="alphapca57" ;; ++ UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") +- UNAME_MACHINE="alphaev6" ;; ++ UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") +- UNAME_MACHINE="alphaev67" ;; ++ UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") +- UNAME_MACHINE="alphaev68" ;; ++ UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") +- UNAME_MACHINE="alphaev68" ;; ++ UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") +- UNAME_MACHINE="alphaev68" ;; ++ UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") +- UNAME_MACHINE="alphaev69" ;; ++ UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") +- UNAME_MACHINE="alphaev7" ;; ++ UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") +- UNAME_MACHINE="alphaev79" ;; ++ UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. +- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ++ echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; +- Alpha\ *:Windows_NT*:*) +- # How do we know it's Interix rather than the generic POSIX subsystem? +- # Should we change UNAME_MACHINE based on the output of uname instead +- # of the specific Alpha model? +- echo alpha-pc-interix +- exit ;; +- 21064:Windows_NT:50:3) +- echo alpha-dec-winnt3.5 +- exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) +- echo ${UNAME_MACHINE}-unknown-amigaos ++ echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) +- echo ${UNAME_MACHINE}-unknown-morphos ++ echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition +@@ -336,7 +350,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) +- echo arm-acorn-riscix${UNAME_RELEASE} ++ echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos +@@ -363,38 +377,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) +- echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) +- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) +- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) +- echo i386-pc-auroraux${UNAME_RELEASE} ++ echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) +- eval $set_cc_for_build +- SUN_ARCH="i386" ++ eval "$set_cc_for_build" ++ SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. +- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ +- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then +- SUN_ARCH="x86_64" ++ SUN_ARCH=x86_64 + fi + fi +- echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. +- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in +@@ -403,25 +417,25 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. +- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` ++ echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) +- echo m68k-sun-sunos${UNAME_RELEASE} ++ echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` +- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 ++ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) +- echo m68k-sun-sunos${UNAME_RELEASE} ++ echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) +- echo sparc-sun-sunos${UNAME_RELEASE} ++ echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) +- echo sparc-auspex-sunos${UNAME_RELEASE} ++ echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not +@@ -432,44 +446,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) +- echo m68k-milan-mint${UNAME_RELEASE} ++ echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) +- echo m68k-hades-mint${UNAME_RELEASE} ++ echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) +- echo m68k-unknown-mint${UNAME_RELEASE} ++ echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) +- echo m68k-apple-machten${UNAME_RELEASE} ++ echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) +- echo powerpc-apple-machten${UNAME_RELEASE} ++ echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) +- echo mips-dec-ultrix${UNAME_RELEASE} ++ echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) +- echo vax-dec-ultrix${UNAME_RELEASE} ++ echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) +- echo clipper-intergraph-clix${UNAME_RELEASE} ++ echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ eval "$set_cc_for_build" ++ sed 's/^ //' << EOF > "$dummy.c" + #ifdef __cplusplus + #include /* for printf() prototype */ + int main (int argc, char *argv[]) { +@@ -478,23 +492,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + #endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) +- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); ++ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) +- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); ++ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) +- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); ++ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c && +- dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && +- SYSTEM_NAME=`$dummy $dummyarg` && ++ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && ++ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && ++ SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } +- echo mips-mips-riscos${UNAME_RELEASE} ++ echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax +@@ -520,17 +534,17 @@ EOF + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` +- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] ++ if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then +- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ +- [ ${TARGET_BINARY_INTERFACE}x = x ] ++ if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ ++ [ "$TARGET_BINARY_INTERFACE"x = x ] + then +- echo m88k-dg-dgux${UNAME_RELEASE} ++ echo m88k-dg-dgux"$UNAME_RELEASE" + else +- echo m88k-dg-dguxbcs${UNAME_RELEASE} ++ echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else +- echo i586-dg-dgux${UNAME_RELEASE} ++ echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) +@@ -547,7 +561,7 @@ EOF + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) +- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` ++ echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id +@@ -559,14 +573,14 @@ EOF + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else +- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} ++ IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi +- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} ++ echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ eval "$set_cc_for_build" ++ sed 's/^ //' << EOF > "$dummy.c" + #include + + main() +@@ -577,7 +591,7 @@ EOF + exit(0); + } + EOF +- if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` ++ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else +@@ -591,7 +605,7 @@ EOF + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` +- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then ++ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc +@@ -600,18 +614,18 @@ EOF + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else +- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} ++ IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi +- echo ${IBM_ARCH}-ibm-aix${IBM_REV} ++ echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; +- ibmrt:4.4BSD:*|romp-ibm:BSD:*) ++ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and +- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to ++ echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx +@@ -626,28 +640,28 @@ EOF + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) +- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` +- case "${UNAME_MACHINE}" in +- 9000/31? ) HP_ARCH=m68000 ;; +- 9000/[34]?? ) HP_ARCH=m68k ;; ++ HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` ++ case "$UNAME_MACHINE" in ++ 9000/31?) HP_ARCH=m68000 ;; ++ 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` +- case "${sc_cpu_version}" in +- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 +- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 ++ case "$sc_cpu_version" in ++ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 ++ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 +- case "${sc_kernel_bits}" in +- 32) HP_ARCH="hppa2.0n" ;; +- 64) HP_ARCH="hppa2.0w" ;; +- '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 ++ case "$sc_kernel_bits" in ++ 32) HP_ARCH=hppa2.0n ;; ++ 64) HP_ARCH=hppa2.0w ;; ++ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi +- if [ "${HP_ARCH}" = "" ]; then +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ if [ "$HP_ARCH" = "" ]; then ++ eval "$set_cc_for_build" ++ sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include +@@ -680,13 +694,13 @@ EOF + exit (0); + } + EOF +- (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` ++ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac +- if [ ${HP_ARCH} = "hppa2.0w" ] ++ if [ "$HP_ARCH" = hppa2.0w ] + then +- eval $set_cc_for_build ++ eval "$set_cc_for_build" + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler +@@ -697,23 +711,23 @@ EOF + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + +- if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | ++ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then +- HP_ARCH="hppa2.0w" ++ HP_ARCH=hppa2.0w + else +- HP_ARCH="hppa64" ++ HP_ARCH=hppa64 + fi + fi +- echo ${HP_ARCH}-hp-hpux${HPUX_REV} ++ echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) +- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` +- echo ia64-hp-hpux${HPUX_REV} ++ HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` ++ echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ eval "$set_cc_for_build" ++ sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () +@@ -738,11 +752,11 @@ EOF + exit (0); + } + EOF +- $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && ++ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; +- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) ++ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) +@@ -751,7 +765,7 @@ EOF + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; +- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) ++ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) +@@ -759,9 +773,9 @@ EOF + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then +- echo ${UNAME_MACHINE}-unknown-osf1mk ++ echo "$UNAME_MACHINE"-unknown-osf1mk + else +- echo ${UNAME_MACHINE}-unknown-osf1 ++ echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) +@@ -786,127 +800,109 @@ EOF + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) +- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) +- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ ++ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) +- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) +- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) +- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) +- echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) +- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` ++ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` ++ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` ++ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` ++ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` ++ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) +- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) +- echo sparc-unknown-bsdi${UNAME_RELEASE} ++ echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) +- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` +- case ${UNAME_PROCESSOR} in ++ case "$UNAME_PROCESSOR" in + amd64) +- echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; +- *) +- echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ UNAME_PROCESSOR=x86_64 ;; ++ i386) ++ UNAME_PROCESSOR=i586 ;; + esac ++ echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) +- echo ${UNAME_MACHINE}-pc-cygwin ++ echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) +- echo ${UNAME_MACHINE}-pc-mingw64 ++ echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) +- echo ${UNAME_MACHINE}-pc-mingw32 ++ echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) +- echo ${UNAME_MACHINE}-pc-msys +- exit ;; +- i*:windows32*:*) +- # uname -m includes "-pc" on this system. +- echo ${UNAME_MACHINE}-mingw32 ++ echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) +- echo ${UNAME_MACHINE}-pc-pw32 ++ echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) +- case ${UNAME_MACHINE} in ++ case "$UNAME_MACHINE" in + x86) +- echo i586-pc-interix${UNAME_RELEASE} ++ echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) +- echo x86_64-unknown-interix${UNAME_RELEASE} ++ echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) +- echo ia64-unknown-interix${UNAME_RELEASE} ++ echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; +- [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) +- echo i${UNAME_MACHINE}-pc-mks +- exit ;; +- 8664:Windows_NT:*) +- echo x86_64-pc-mks +- exit ;; +- i*:Windows_NT*:* | Pentium*:Windows_NT*:*) +- # How do we know it's Interix rather than the generic POSIX subsystem? +- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we +- # UNAME_MACHINE based on the output of uname instead of i386? +- echo i586-pc-interix +- exit ;; + i*:UWIN*:*) +- echo ${UNAME_MACHINE}-pc-uwin ++ echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; +- p*:CYGWIN*:*) +- echo powerpcle-unknown-cygwin +- exit ;; + prep*:SunOS:5.*:*) +- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system +- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` ++ echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland +- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} ++ echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + i*86:Minix:*:*) +- echo ${UNAME_MACHINE}-pc-minix ++ echo "$UNAME_MACHINE"-pc-minix + exit ;; + aarch64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in +@@ -919,61 +915,64 @@ EOF + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 +- if test "$?" = 0 ; then LIBC="gnulibc1" ; fi +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) +- eval $set_cc_for_build ++ eval "$set_cc_for_build" + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) +- echo ${UNAME_MACHINE}-axis-linux-${LIBC} ++ echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) +- echo ${UNAME_MACHINE}-axis-linux-${LIBC} ++ echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) +- echo ${UNAME_MACHINE}-pc-linux-${LIBC} ++ echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" ++ exit ;; ++ k1om:Linux:*:*) ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ eval "$set_cc_for_build" ++ sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el +@@ -987,64 +986,74 @@ EOF + #endif + #endif + EOF +- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` +- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ++ eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" ++ test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } + ;; ++ mips64el:Linux:*:*) ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" ++ exit ;; + openrisc*:Linux:*:*) +- echo or1k-unknown-linux-${LIBC} ++ echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) +- echo sparc-unknown-linux-${LIBC} ++ echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) +- echo hppa64-unknown-linux-${LIBC} ++ echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in +- PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; +- PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; +- *) echo hppa-unknown-linux-${LIBC} ;; ++ PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; ++ PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; ++ *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) +- echo powerpc64-unknown-linux-${LIBC} ++ echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) +- echo powerpc-unknown-linux-${LIBC} ++ echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) +- echo powerpc64le-unknown-linux-${LIBC} ++ echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) +- echo powerpcle-unknown-linux-${LIBC} ++ echo powerpcle-unknown-linux-"$LIBC" ++ exit ;; ++ riscv32:Linux:*:* | riscv64:Linux:*:*) ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) +- echo ${UNAME_MACHINE}-ibm-linux-${LIBC} ++ echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) +- echo ${UNAME_MACHINE}-dec-linux-${LIBC} ++ echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) +- echo ${UNAME_MACHINE}-pc-linux-${LIBC} ++ if objdump -f /bin/sh | grep -q elf32-x86-64; then ++ echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 ++ else ++ echo "$UNAME_MACHINE"-pc-linux-"$LIBC" ++ fi + exit ;; + xtensa*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. +@@ -1058,34 +1067,34 @@ EOF + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. +- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} ++ echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. +- echo ${UNAME_MACHINE}-pc-os2-emx ++ echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) +- echo ${UNAME_MACHINE}-unknown-stop ++ echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) +- echo ${UNAME_MACHINE}-unknown-atheos ++ echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) +- echo ${UNAME_MACHINE}-pc-syllable ++ echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) +- echo i386-unknown-lynxos${UNAME_RELEASE} ++ echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) +- echo ${UNAME_MACHINE}-pc-msdosdjgpp ++ echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; +- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) +- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` ++ i*86:*:4.*:*) ++ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then +- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} ++ echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else +- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} ++ echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) +@@ -1095,12 +1104,12 @@ EOF + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac +- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ++ echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 +@@ -1110,9 +1119,9 @@ EOF + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 +- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL ++ echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else +- echo ${UNAME_MACHINE}-pc-sysv32 ++ echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) +@@ -1120,7 +1129,7 @@ EOF + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub +- # prints for the "djgpp" host, or else GDB configury will decide that ++ # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; +@@ -1132,9 +1141,9 @@ EOF + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then +- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 ++ echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. +- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 ++ echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) +@@ -1154,9 +1163,9 @@ EOF + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && { echo i486-ncr-sysv4.3${OS_REL}; exit; } ++ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ +- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; ++ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; +@@ -1165,28 +1174,28 @@ EOF + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && { echo i486-ncr-sysv4.3${OS_REL}; exit; } ++ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ +- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ++ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ +- && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; ++ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) +- echo m68k-unknown-lynxos${UNAME_RELEASE} ++ echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) +- echo sparc-unknown-lynxos${UNAME_RELEASE} ++ echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) +- echo rs6000-unknown-lynxos${UNAME_RELEASE} ++ echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) +- echo powerpc-unknown-lynxos${UNAME_RELEASE} ++ echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) +- echo mips-dde-sysv${UNAME_RELEASE} ++ echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 +@@ -1197,7 +1206,7 @@ EOF + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` +- echo ${UNAME_MACHINE}-sni-sysv4 ++ echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi +@@ -1217,23 +1226,23 @@ EOF + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. +- echo ${UNAME_MACHINE}-stratus-vos ++ echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) +- echo m68k-apple-aux${UNAME_RELEASE} ++ echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then +- echo mips-nec-sysv${UNAME_RELEASE} ++ echo mips-nec-sysv"$UNAME_RELEASE" + else +- echo mips-unknown-sysv${UNAME_RELEASE} ++ echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. +@@ -1252,46 +1261,56 @@ EOF + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) +- echo sx4-nec-superux${UNAME_RELEASE} ++ echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) +- echo sx5-nec-superux${UNAME_RELEASE} ++ echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) +- echo sx6-nec-superux${UNAME_RELEASE} ++ echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) +- echo sx7-nec-superux${UNAME_RELEASE} ++ echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) +- echo sx8-nec-superux${UNAME_RELEASE} ++ echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) +- echo sx8r-nec-superux${UNAME_RELEASE} ++ echo sx8r-nec-superux"$UNAME_RELEASE" ++ exit ;; ++ SX-ACE:SUPER-UX:*:*) ++ echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) +- echo powerpc-apple-rhapsody${UNAME_RELEASE} ++ echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) +- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown +- eval $set_cc_for_build ++ eval "$set_cc_for_build" + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi +- if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then +- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then ++ if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ +- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ +- grep IS_64BIT_ARCH >/dev/null ++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi ++ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc ++ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ ++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_PPC >/dev/null ++ then ++ UNAME_PROCESSOR=powerpc ++ fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub +@@ -1302,27 +1321,33 @@ EOF + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi +- echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} ++ echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` +- if test "$UNAME_PROCESSOR" = "x86"; then ++ if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi +- echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} ++ echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; +- NEO-?:NONSTOP_KERNEL:*:*) +- echo neo-tandem-nsk${UNAME_RELEASE} ++ NEO-*:NONSTOP_KERNEL:*:*) ++ echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) +- echo nse-tandem-nsk${UNAME_RELEASE} ++ echo nse-tandem-nsk"$UNAME_RELEASE" ++ exit ;; ++ NSR-*:NONSTOP_KERNEL:*:*) ++ echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; +- NSR-?:NONSTOP_KERNEL:*:*) +- echo nsr-tandem-nsk${UNAME_RELEASE} ++ NSV-*:NONSTOP_KERNEL:*:*) ++ echo nsv-tandem-nsk"$UNAME_RELEASE" ++ exit ;; ++ NSX-*:NONSTOP_KERNEL:*:*) ++ echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux +@@ -1331,18 +1356,18 @@ EOF + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) +- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} ++ echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. +- if test "$cputype" = "386"; then ++ if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi +- echo ${UNAME_MACHINE}-unknown-plan9 ++ echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 +@@ -1363,14 +1388,14 @@ EOF + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) +- echo mips-sei-seiux${UNAME_RELEASE} ++ echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) +- echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ++ echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` +- case "${UNAME_MACHINE}" in ++ case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; +@@ -1379,34 +1404,48 @@ EOF + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) +- echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' ++ echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) +- echo ${UNAME_MACHINE}-pc-rdos ++ echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) +- echo ${UNAME_MACHINE}-pc-aros ++ echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) +- echo ${UNAME_MACHINE}-unknown-esx ++ echo "$UNAME_MACHINE"-unknown-esx ++ exit ;; ++ amd64:Isilon\ OneFS:*:*) ++ echo x86_64-unknown-onefs + exit ;; + esac + ++echo "$0: unable to guess system type" >&2 ++ ++case "$UNAME_MACHINE:$UNAME_SYSTEM" in ++ mips:Linux | mips64:Linux) ++ # If we got here on MIPS GNU/Linux, output extra information. ++ cat >&2 <&2 < in order to provide the needed +-information to handle your system. ++If $0 has already been updated, send the following data and any ++information you think might be pertinent to config-patches@gnu.org to ++provide the necessary information to handle your system. + + config.guess timestamp = $timestamp + +@@ -1425,16 +1464,16 @@ hostinfo = `(hostinfo) 2>/ + /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` + /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +-UNAME_MACHINE = ${UNAME_MACHINE} +-UNAME_RELEASE = ${UNAME_RELEASE} +-UNAME_SYSTEM = ${UNAME_SYSTEM} +-UNAME_VERSION = ${UNAME_VERSION} ++UNAME_MACHINE = "$UNAME_MACHINE" ++UNAME_RELEASE = "$UNAME_RELEASE" ++UNAME_SYSTEM = "$UNAME_SYSTEM" ++UNAME_VERSION = "$UNAME_VERSION" + EOF + + exit 1 + + # Local variables: +-# eval: (add-hook 'write-file-hooks 'time-stamp) ++# eval: (add-hook 'write-file-functions 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" +--- gcl-2.6.12.orig/config.sub ++++ gcl-2.6.12/config.sub +@@ -1,8 +1,8 @@ + #! /bin/sh + # Configuration validation subroutine script. +-# Copyright 1992-2015 Free Software Foundation, Inc. ++# Copyright 1992-2018 Free Software Foundation, Inc. + +-timestamp='2015-08-20' ++timestamp='2018-02-22' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -15,7 +15,7 @@ timestamp='2015-08-20' + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, see . ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a +@@ -33,7 +33,7 @@ timestamp='2015-08-20' + # Otherwise, we print the canonical config type on stdout and succeed. + + # You can get the latest version of this script from: +-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD ++# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + + # This file is supposed to be the same for all GNU packages + # and recognize all the CPU types, system types and aliases +@@ -53,12 +53,11 @@ timestamp='2015-08-20' + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ +-Usage: $0 [OPTION] CPU-MFR-OPSYS +- $0 [OPTION] ALIAS ++Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + + Canonicalize a configuration name. + +-Operation modes: ++Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit +@@ -68,7 +67,7 @@ Report bugs and patches to &2 ++ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. +@@ -388,7 +385,7 @@ case $basic_machine in + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ +- | i*86-* | i860-* | i960-* | ia64-* \ ++ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ +@@ -429,6 +426,7 @@ case $basic_machine in + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ ++ | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ +@@ -445,6 +443,7 @@ case $basic_machine in + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ ++ | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ +@@ -458,7 +457,7 @@ case $basic_machine in + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) +- basic_machine=i386-unknown ++ basic_machine=i386-pc + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) +@@ -492,7 +491,7 @@ case $basic_machine in + basic_machine=x86_64-pc + ;; + amd64-*) +- basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl +@@ -521,7 +520,7 @@ case $basic_machine in + basic_machine=i386-pc + os=-aros + ;; +- asmjs) ++ asmjs) + basic_machine=asmjs-unknown + ;; + aux) +@@ -537,7 +536,7 @@ case $basic_machine in + os=-linux + ;; + blackfin-*) +- basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) +@@ -545,13 +544,13 @@ case $basic_machine in + os=-cnk + ;; + c54x-*) +- basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c55x-*) +- basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c6x-*) +- basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray +@@ -640,10 +639,18 @@ case $basic_machine in + basic_machine=rs6000-bull + os=-bosx + ;; +- dpx2* | dpx2*-bull) ++ dpx2*) + basic_machine=m68k-bull + os=-sysv3 + ;; ++ e500v[12]) ++ basic_machine=powerpc-unknown ++ os=$os"spe" ++ ;; ++ e500v[12]-*) ++ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ os=$os"spe" ++ ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon +@@ -733,9 +740,6 @@ case $basic_machine in + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; +- hppa-next) +- os=-nextstep3 +- ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf +@@ -748,26 +752,26 @@ case $basic_machine in + basic_machine=i370-ibm + ;; + i*86v32) +- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` ++ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) +- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` ++ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) +- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` ++ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) +- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` ++ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; +- i386-vsta | vsta) ++ vsta) + basic_machine=i386-unknown + os=-vsta + ;; +@@ -786,19 +790,16 @@ case $basic_machine in + os=-sysv + ;; + leon-*|leon[3-9]-*) +- basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ++ basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) +- basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; +- m88k-omron*) +- basic_machine=m88k-omron +- ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv +@@ -830,10 +831,10 @@ case $basic_machine in + os=-mint + ;; + mips3*-*) +- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ++ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` + ;; + mips3*) +- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ++ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k +@@ -852,7 +853,7 @@ case $basic_machine in + os=-msdos + ;; + ms1-*) +- basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ++ basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc +@@ -894,7 +895,7 @@ case $basic_machine in + basic_machine=v70-nec + os=-sysv + ;; +- next | m*-next ) ++ next | m*-next) + basic_machine=m68k-next + case $os in + -nextstep* ) +@@ -939,6 +940,12 @@ case $basic_machine in + nsr-tandem) + basic_machine=nsr-tandem + ;; ++ nsv-tandem) ++ basic_machine=nsv-tandem ++ ;; ++ nsx-tandem) ++ basic_machine=nsx-tandem ++ ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf +@@ -971,7 +978,7 @@ case $basic_machine in + os=-linux + ;; + parisc-*) +- basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) +@@ -987,7 +994,7 @@ case $basic_machine in + basic_machine=i386-pc + ;; + pc98-*) +- basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc +@@ -1002,16 +1009,16 @@ case $basic_machine in + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) +- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) +- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) +- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pentium4-*) +- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould +@@ -1021,23 +1028,23 @@ case $basic_machine in + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) +- basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; +- ppcle | powerpclittle | ppc-le | powerpc-little) ++ ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) +- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; +- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; +- ppc64le | powerpc64little | ppc64-le | powerpc64-little) ++ ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) +- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm +@@ -1091,17 +1098,10 @@ case $basic_machine in + sequent) + basic_machine=i386-sequent + ;; +- sh) +- basic_machine=sh-hitachi +- os=-hms +- ;; + sh5el) + basic_machine=sh5le-unknown + ;; +- sh64) +- basic_machine=sh64-unknown +- ;; +- sparclite-wrs | simso-wrs) ++ simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; +@@ -1120,7 +1120,7 @@ case $basic_machine in + os=-sysv4 + ;; + strongarm-* | thumb-*) +- basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun +@@ -1242,6 +1242,9 @@ case $basic_machine in + basic_machine=hppa1.1-winbond + os=-proelf + ;; ++ x64) ++ basic_machine=x86_64-pc ++ ;; + xbox) + basic_machine=i686-pc + os=-mingw32 +@@ -1250,20 +1253,12 @@ case $basic_machine in + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) +- basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ++ basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; +- z8k-*-coff) +- basic_machine=z8k-unknown +- os=-sim +- ;; +- z80-*-coff) +- basic_machine=z80-unknown +- os=-sim +- ;; + none) + basic_machine=none-none + os=-none +@@ -1292,10 +1287,6 @@ case $basic_machine in + vax) + basic_machine=vax-dec + ;; +- pdp10) +- # there are many clones, so DEC is not a safe bet +- basic_machine=pdp10-unknown +- ;; + pdp11) + basic_machine=pdp11-dec + ;; +@@ -1305,9 +1296,6 @@ case $basic_machine in + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; +- sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) +- basic_machine=sparc-sun +- ;; + cydra) + basic_machine=cydra-cydrome + ;; +@@ -1327,7 +1315,7 @@ case $basic_machine in + # Make sure to match an already-canonicalized machine name. + ;; + *) +- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 ++ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 + exit 1 + ;; + esac +@@ -1335,10 +1323,10 @@ esac + # Here we canonicalize certain aliases for manufacturers. + case $basic_machine in + *-digital*) +- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ++ basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` + ;; + *-commodore*) +- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ++ basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +@@ -1349,8 +1337,8 @@ esac + if [ x"$os" != x"" ] + then + case $os in +- # First match some system type aliases +- # that might get confused with valid system types. ++ # First match some system type aliases that might get confused ++ # with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux +@@ -1361,18 +1349,19 @@ case $os in + -solaris) + os=-solaris2 + ;; +- -svr4*) +- os=-sysv4 +- ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; +- # First accept the basic system types. ++ # es1800 is here to avoid being matched by es* (a different OS) ++ -es1800*) ++ os=-ose ++ ;; ++ # Now accept the basic system types. + # The portable systems comes first. +- # Each alternative MUST END IN A *, to match a version number. ++ # Each alternative MUST end in a * to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ +@@ -1382,24 +1371,26 @@ case $os in + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ +- | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ +- | -bitrig* | -openbsd* | -solidbsd* \ ++ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ ++ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ +- | -chorusos* | -chorusrdb* | -cegcc* \ ++ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ ++ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ +- | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ ++ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ +- | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ ++ | -morphos* | -superux* | -rtmk* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ +- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) ++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ ++ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ ++ | -midnightbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) +@@ -1416,12 +1407,12 @@ case $os in + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; +- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ +- | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ ++ -sim | -xray | -os68k* | -v88r* \ ++ | -windows* | -osx | -abug | -netware* | -os9* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) +- os=`echo $os | sed -e 's|mac|macos|'` ++ os=`echo "$os" | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc +@@ -1430,10 +1421,10 @@ case $os in + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) +- os=`echo $os | sed -e 's|sunos5|solaris2|'` ++ os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) +- os=`echo $os | sed -e 's|sunos6|solaris3|'` ++ os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition +@@ -1444,12 +1435,6 @@ case $os in + -wince*) + os=-wince + ;; +- -osfrose*) +- os=-osfrose +- ;; +- -osf*) +- os=-osf +- ;; + -utek*) + os=-bsd + ;; +@@ -1474,7 +1459,7 @@ case $os in + -nova*) + os=-rtmk-nova + ;; +- -ns2 ) ++ -ns2) + os=-nextstep2 + ;; + -nsk*) +@@ -1496,7 +1481,7 @@ case $os in + -oss*) + os=-sysv3 + ;; +- -svr4) ++ -svr4*) + os=-sysv4 + ;; + -svr3) +@@ -1511,32 +1496,38 @@ case $os in + -ose*) + os=-ose + ;; +- -es1800*) +- os=-ose +- ;; +- -xenix) +- os=-xenix +- ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; +- -aros*) +- os=-aros +- ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; ++ -pikeos*) ++ # Until real need of OS specific support for ++ # particular features comes up, bare metal ++ # configurations are quite functional. ++ case $basic_machine in ++ arm*) ++ os=-eabi ++ ;; ++ *) ++ os=-elf ++ ;; ++ esac ++ ;; + -nacl*) + ;; ++ -ios) ++ ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` +- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 ++ echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + exit 1 + ;; + esac +@@ -1626,12 +1617,12 @@ case $basic_machine in + sparc-* | *-sun) + os=-sunos4.1.1 + ;; ++ pru-*) ++ os=-elf ++ ;; + *-be) + os=-beos + ;; +- *-haiku) +- os=-haiku +- ;; + *-ibm) + os=-aix + ;; +@@ -1671,7 +1662,7 @@ case $basic_machine in + m88k-omron*) + os=-luna + ;; +- *-next ) ++ *-next) + os=-nextstep + ;; + *-sequent) +@@ -1686,9 +1677,6 @@ case $basic_machine in + i370-*) + os=-mvs + ;; +- *-next) +- os=-nextstep3 +- ;; + *-gould) + os=-sysv + ;; +@@ -1798,15 +1786,15 @@ case $basic_machine in + vendor=stratus + ;; + esac +- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ++ basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` + ;; + esac + +-echo $basic_machine$os ++echo "$basic_machine$os" + exit + + # Local variables: +-# eval: (add-hook 'write-file-hooks 'time-stamp) ++# eval: (add-hook 'write-file-functions 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -3028,6 +3028,7 @@ case $canonical in + *x86_64*linux*) use=amd64-linux;; + *x86_64*kfreebsd*) use=amd64-kfreebsd;; + *86*linux*) use=386-linux;; ++ *riscv64*linux*) use=riscv64-linux;; + *86*kfreebsd*) use=386-kfreebsd;; + *86*gnu*) use=386-gnu;; + m68k*linux*) use=m68k-linux;; +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -29,6 +29,7 @@ case $canonical in + *x86_64*linux*) use=amd64-linux;; + *x86_64*kfreebsd*) use=amd64-kfreebsd;; + *86*linux*) use=386-linux;; ++ *riscv64*linux*) use=riscv64-linux;; + *86*kfreebsd*) use=386-kfreebsd;; + *86*gnu*) use=386-gnu;; + m68k*linux*) use=m68k-linux;; +--- /dev/null ++++ gcl-2.6.12/h/elf64_riscv64_reloc.h +@@ -0,0 +1,26 @@ ++#define riscv_high(a_) ((a_)+(((a_)&0x800) ? (1<<12) : 0)) ++ ++ case R_RISCV_HI20: ++ store_val(where,MASK(20)<<12,riscv_high(s+a)); ++ break; ++ case R_RISCV_RELAX:/*FIXME figure out how to delete instructions efficiently*/ ++ break; ++ case R_RISCV_LO12_I: ++ store_val(where,MASK(12)<<20,(s+a)<<20); ++ break; ++ case R_RISCV_LO12_S: ++ store_val(where,MASK(5)<<7,(s+a)<<7); ++ store_val(where,MASK(7)<<25,(s+a)<<20); ++ break; ++ case R_RISCV_CALL: ++ store_val(where,MASK(20)<<12,riscv_high(s+a-p)); ++ store_val((void *)where+4,MASK(12)<<20,(s+a-p)<<20); ++ break; ++ case R_RISCV_BRANCH: ++ case R_RISCV_RVC_BRANCH: ++ case R_RISCV_RVC_JUMP: ++ case R_RISCV_JAL: ++ break; ++ case R_RISCV_64: ++ store_val(where,MASK(64),(s+a)); ++ break; +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -733,7 +733,7 @@ void + write_string(object,object); + + void +-edit_double(int, double, int *, char *, int *); ++edit_double(int, double, int *, char *, int *,int); + + void + sethash(object,object,object); +--- /dev/null ++++ gcl-2.6.12/h/riscv64-linux.h +@@ -0,0 +1,24 @@ ++#include "linux.h" ++ ++#ifdef IN_GBC ++#undef MPROTECT_ACTION_FLAGS ++#define MPROTECT_ACTION_FLAGS SA_RESTART|SA_SIGINFO ++#define GET_FAULT_ADDR(sig,code,sv,a) \ ++ ((siginfo_t *)code)->si_addr ++#endif ++ ++/*#define NULL_OR_ON_C_STACK(x) ((x)==0 || ((unsigned int)x) > (unsigned int)(pagetochar(MAXPAGE+1)))*/ ++ ++/* #define ADDITIONAL_FEATURES \ */ ++/* ADD_FEATURE("BSD386"); \ */ ++/* ADD_FEATURE("MC68020") */ ++ ++ ++/* #define I386 */ ++#define SGC ++ ++/* Apparently stack pointers can be 4 byte aligned, at least &argc -- CM */ ++#define C_GC_OFFSET 4 ++ ++#define RELOC_H "elf64_riscv64_reloc.h" ++/* #define MAX_CODE_ADDRESS (1L<<31)/\*large memory model broken gcc 4.8*\/ */ +--- gcl-2.6.12.orig/o/format.c ++++ gcl-2.6.12/o/format.c +@@ -1033,7 +1033,7 @@ fmt_character(bool colon, bool atsign) + static void + fmt_fix_float(bool colon, bool atsign) + { +- int w=0, d=0, k=0, overflowchar=0, padchar=0; ++ int w=0, d=0, k=0, overflowchar=0, padchar=0,dp; + double f; + int sign; + char *buff, *b, *buff1; +@@ -1080,14 +1080,15 @@ fmt_fix_float(bool colon, bool atsign) + vs_reset; + return; + } +- if (type_of(x) == t_longfloat) +-/* n = 16; */ +- n = 17; +- else +-/* n = 7; */ +- n = 8; ++ if (type_of(x) == t_longfloat) { ++ n = 17; ++ dp=1; ++ } else { ++ n = 8; ++ dp=0; ++ } + f = number_to_double(x); +- edit_double(n, f, &sign, buff, &exp); ++ edit_double(n, f, &sign, buff, &exp, dp); + if (exp + k > 100 || exp + k < -100 || d > 100) { + prin1(x, fmt_stream); + vs_reset; +@@ -1115,7 +1116,7 @@ fmt_fix_float(bool colon, bool atsign) + n = m = 0; + } else if (m < n) { + n = m; +- edit_double(n, f, &sign, buff, &exp); ++ edit_double(n, f, &sign, buff, &exp, dp); + } + while (n >= 0) + if (buff[n - 1] == '0') +@@ -1228,7 +1229,7 @@ fmt_exponent1(int e) + static void + fmt_exponential_float(bool colon, bool atsign) + { +- int w=0, d=0, e=0, k=0, overflowchar=0, padchar=0, exponentchar=0; ++ int w=0, d=0, e=0, k=0, overflowchar=0, padchar=0, exponentchar=0,dp; + double f; + int sign; + char buff[256], *b, buff1[256]; +@@ -1278,14 +1279,20 @@ fmt_exponential_float(bool colon, bool a + vs_reset; + return; + } +- if (type_of(x) == t_longfloat) +-/* n = 16; */ +- n = 17; +- else +-/* n = 7; */ +- n = 8; ++ if (type_of(x) == t_longfloat) { ++ n = 17; ++ dp=1; ++ } else { ++ n = 8; ++ dp=0; ++ } + f = number_to_double(x); +- edit_double(n, f, &sign, buff, &exp); ++ edit_double(n, f, &sign, buff, &exp, dp); ++ if (exp + k > 100 || exp + k < -100 || d > 100) { ++ prin1(x, fmt_stream); ++ vs_reset; ++ return; ++ } + if (d >= 0) { + if (k > 0) { + if (!(k < d + 2)) +@@ -1318,7 +1325,7 @@ fmt_exponential_float(bool colon, bool a + n = m = 0; + } else if (m < n) { + n = m; +- edit_double(n, f, &sign, buff, &exp); ++ edit_double(n, f, &sign, buff, &exp, dp); + } + while (n >= 0) + if (buff[n - 1] == '0') +@@ -1432,7 +1439,7 @@ OVER: + static void + fmt_general_float(bool colon, bool atsign) + { +- int w=0, d=0, e=0, k, overflowchar, padchar=0, exponentchar; ++ int w=0, d=0, e=0, k, overflowchar, padchar=0, exponentchar,dp; + int sign, exp; + char buff[256]; + object x; +@@ -1470,13 +1477,14 @@ fmt_general_float(bool colon, bool atsig + vs_reset; + return; + } +- if (type_of(x) == t_longfloat) +-/* q = 16; */ +- q = 17; +- else +-/* q = 7; */ +- q = 8; +- edit_double(q, number_to_double(x), &sign, buff, &exp); ++ if (type_of(x) == t_longfloat) { ++ q = 17; ++ dp=1; ++ } else { ++ q = 8; ++ dp=0; ++ } ++ edit_double(q, number_to_double(x), &sign, buff, &exp, dp); + n = exp + 1; + while (q > 0) + if (buff[q - 1] == '0') +@@ -1524,7 +1532,7 @@ fmt_general_float(bool colon, bool atsig + static void + fmt_dollars_float(bool colon, bool atsign) + { +- int d=0, n=0, w=0, padchar=0; ++ int d=0, n=0, w=0, padchar=0,dp; + double f; + int sign; + char buff[256]; +@@ -1557,15 +1565,16 @@ fmt_dollars_float(bool colon, bool atsig + vs_reset; + return; + } +-/* q = 7; */ + q = 8; +- if (type_of(x) == t_longfloat) +-/* q = 16; */ ++ dp=0; ++ if (type_of(x) == t_longfloat) { + q = 17; ++ dp=1; ++ } + f = number_to_double(x); +- edit_double(q, f, &sign, buff, &exp); ++ edit_double(q, f, &sign, buff, &exp, dp); + if ((q = exp + d + 1) > 0) +- edit_double(q, f, &sign, buff, &exp); ++ edit_double(q, f, &sign, buff, &exp, dp); + exp++; + if (w > 100 || exp > 100 || exp < -100) { + fmt_nparam = 6; +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -306,10 +306,10 @@ static int + char_inc(char *b,char *p) { + + if (b==p) { +- if (*p=='-') { +- p++; +- memmove(p+1,p,strlen(p)+1); +- } ++ /* if (*p=='-') { */ ++ /* p++; */ ++ /* memmove(p+1,p,strlen(p)+1); */ ++ /* } */ + *p='1'; + } else if (*p=='9') { + *p='0'; +@@ -357,15 +357,15 @@ truncate_double(char *b,double d,int dp) + } + + void +-edit_double(int n, double d, int *sp, char *s, int *ep) { ++edit_double(int n,double d,int *sp,char *s,int *ep,int dp) { + +- char *p, b[FPRC + 9]; ++ char *p, b[FPRC+9]; + int i; + + if (!ISFINITE(d)) { + if (sSAprint_nansA->s.s_dbind !=Cnil) { + sprintf(s, "%e",d); +- *sp = 2; ++ *sp=2; + return; + } + else +@@ -374,30 +374,36 @@ edit_double(int n, double d, int *sp, ch + sprintf(b, "%*.*e",FPRC+8,FPRC,d); + if (b[FPRC+3] != 'e') { + sprintf(b, "%*.*e",FPRC+7,FPRC,d); +- *ep = (b[FPRC+5]-'0')*10 + (b[FPRC+6]-'0'); ++ *ep=(b[FPRC+5]-'0')*10+(b[FPRC+6]-'0'); + } else +- *ep = (b[FPRC+5]-'0')*100 + (b[FPRC+6]-'0')*10 + (b[FPRC+7]-'0'); ++ *ep=(b[FPRC+5]-'0')*100+(b[FPRC+6]-'0')*10+(b[FPRC+7]-'0'); + +- *sp = 1; +- if (b[0] == '-') +- *sp *= -1; +- if (b[FPRC+4] == '-') +- *ep *= -1; ++ *sp=1; ++ if (b[0]=='-') { ++ *sp*=-1; ++ b[0]=' '; ++ }if (b[FPRC+4]=='-') ++ *ep*=-1; ++ ++ truncate_double(b,d,dp); ++ if ((p=strchr(b,'e'))) ++ *p=0; + +- truncate_double(b,d,n!=7); ++ if (n+2='5') ++ char_inc(b,b+n+1); + + if (isdigit((int)b[0])) { + b[1]=b[0]; + (*ep)++; + } +- if (b[2]=='0') (*ep)++; +- b[2] = b[1]; +- p = b + 2; +- for (i=0;i'); diff --git a/debian/patches/Version_2.6.13pre110 b/debian/patches/Version_2.6.13pre110 new file mode 100644 index 0000000..9b2628e --- /dev/null +++ b/debian/patches/Version_2.6.13pre110 @@ -0,0 +1,33 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-113) unstable; urgency=medium + . + * Version_2.6.13pre110 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-12-16 + +--- gcl-2.6.12.orig/h/riscv64-linux.h ++++ gcl-2.6.12/h/riscv64-linux.h +@@ -22,3 +22,5 @@ + + #define RELOC_H "elf64_riscv64_reloc.h" + /* #define MAX_CODE_ADDRESS (1L<<31)/\*large memory model broken gcc 4.8*\/ */ ++ ++#define NEED_STACK_CHK_GUARD diff --git a/debian/patches/Version_2.6.13pre111 b/debian/patches/Version_2.6.13pre111 new file mode 100644 index 0000000..9542589 --- /dev/null +++ b/debian/patches/Version_2.6.13pre111 @@ -0,0 +1,34 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-114) unstable; urgency=medium + . + * Version_2.6.13pre111 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-12-16 + +--- gcl-2.6.12.orig/h/elf64_riscv64_reloc.h ++++ gcl-2.6.12/h/elf64_riscv64_reloc.h +@@ -24,3 +24,6 @@ + case R_RISCV_64: + store_val(where,MASK(64),(s+a)); + break; ++ case R_RISCV_32: ++ store_val(where,MASK(32),(s+a)); ++ break; diff --git a/debian/patches/Version_2.6.13pre112 b/debian/patches/Version_2.6.13pre112 new file mode 100644 index 0000000..59b9702 --- /dev/null +++ b/debian/patches/Version_2.6.13pre112 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-115) unstable; urgency=medium + . + * Version_2.6.13pre112 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-12-17 + +--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp ++++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp +@@ -156,7 +156,7 @@ + (DEFSYSFUN 'TYPE-OF "Ltype_of" '(T) 'T NIL NIL) + (DEFSYSFUN 'BUTLAST "Lbutlast" '(T *) 'T NIL NIL) + (DEFSYSFUN '1- "Lone_minus" '(T) 'T NIL NIL) +-(DEFSYSFUN 'MAKE-HASH-TABLE "Lmake_hash_table" '(*) 'T NIL NIL) ++;(DEFSYSFUN 'MAKE-HASH-TABLE "Lmake_hash_table" '(*) 'T NIL NIL) + (DEFSYSFUN 'STRING/= "Lstring_neq" '(T T *) 'T NIL NIL) + (DEFSYSFUN '<= "Lmonotonically_nondecreasing" '(T *) 'T NIL T) + (DEFSYSFUN 'MAKE-BROADCAST-STREAM "Lmake_broadcast_stream" '(*) 'T NIL diff --git a/debian/patches/Version_2.6.13pre113 b/debian/patches/Version_2.6.13pre113 new file mode 100644 index 0000000..dc88590 --- /dev/null +++ b/debian/patches/Version_2.6.13pre113 @@ -0,0 +1,176 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-116) unstable; urgency=medium + . + * Version_2.6.13pre113 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-12-22 + +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -75,7 +75,7 @@ + (defun decode-universal-time (ut &optional (tz (current-timezone) tzp) + &aux (dstp (unless tzp (current-dstp))) (ut (- ut (* tz 3600)))) + (declare (optimize (safety 2))) +- (check-type ut (integer 0)) ++ (check-type ut integer) + (check-type tz rational) + (multiple-value-bind + (d ut) (floor ut seconds-per-day) +@@ -100,7 +100,7 @@ + (check-type h (integer 0 23)) + (check-type d (integer 1 31)) + (check-type m (integer 1 12)) +- (check-type y (integer 1900)) ++ (check-type y integer) + (check-type tz rational) + (when (<= 0 y 99) + (multiple-value-bind +--- gcl-2.6.12.orig/o/format.c ++++ gcl-2.6.12/o/format.c +@@ -1089,7 +1089,7 @@ fmt_fix_float(bool colon, bool atsign) + } + f = number_to_double(x); + edit_double(n, f, &sign, buff, &exp, dp); +- if (exp + k > 100 || exp + k < -100 || d > 100) { ++ if (sign==2) { + prin1(x, fmt_stream); + vs_reset; + return; +@@ -1288,7 +1288,7 @@ fmt_exponential_float(bool colon, bool a + } + f = number_to_double(x); + edit_double(n, f, &sign, buff, &exp, dp); +- if (exp + k > 100 || exp + k < -100 || d > 100) { ++ if (sign==2) { + prin1(x, fmt_stream); + vs_reset; + return; +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -74,10 +74,11 @@ $(DPP): ../bin/dpp.c + ${CC} ${DEFS} -o $@ $< + + new_init.c: ${INI_FILES} +- echo '#include "make-init.h"' > new_init.c +- echo 'void NewInit(void){' >> new_init.c +- cat ${INI_FILES} >> new_init.c +- echo '}' >> new_init.c ++ echo '#include "make-init.h"' > $@ ++ echo 'void NewInit(void){' >> $@ ++ cat ${INI_FILES} >> $@ ++ echo '}' >> $@ ++ ! cat $@ | awk -F, '/DEFUN/ {print $2}' | grep -v object || (rm $@ && false) + + ifneq ($(NIFLAGS),) + new_init.o: new_init.c $(DECL) +--- gcl-2.6.12.orig/o/num_sfun.c ++++ gcl-2.6.12/o/num_sfun.c +@@ -434,7 +434,7 @@ number_atan2(object y, object x) + if (dy > 0.0) + dz = PI / 2.0; + else if (dy == 0.0) +- FEerror("Logarithmic singularity.", 0); ++ dz = 0.0; + else + dz = -PI / 2.0; + else +--- gcl-2.6.12.orig/o/usig.c ++++ gcl-2.6.12/o/usig.c +@@ -160,7 +160,7 @@ DEFUN_NEW("*DOUBLE",object,fSAdouble,SI, + RETURN1(make_longfloat(*(double *)addr)); + } + +-DEFUN_NEW("FEENABLEEXCEPT",fixnum,fSfeenableexcept,SI,1,1,NONE,II,OO,OO,OO,(fixnum x),"") { ++DEFUN_NEW("FEENABLEEXCEPT",object,fSfeenableexcept,SI,1,1,NONE,II,OO,OO,OO,(fixnum x),"") { + + #ifdef HAVE_FEENABLEEXCEPT + +@@ -180,11 +180,11 @@ DEFUN_NEW("FEENABLEEXCEPT",fixnum,fSfeen + } + #endif + +- RETURN1(x); ++ RETURN1((object)x); + + } + +-DEFUN_NEW("FEDISABLEEXCEPT",fixnum,fSfedisableexcept,SI,0,0,NONE,IO,OO,OO,OO,(void),"") { ++DEFUN_NEW("FEDISABLEEXCEPT",object,fSfedisableexcept,SI,0,0,NONE,IO,OO,OO,OO,(void),"") { + + fixnum x; + +@@ -205,33 +205,33 @@ DEFUN_NEW("FEDISABLEEXCEPT",fixnum,fSfed + } + #endif + +- RETURN1(x); ++ RETURN1((object)x); + } + + #if defined(__x86_64__) || defined(__i386__) + + #define FE_TEST(x87sw_,mxcsr_,excepts_) ((x87sw_)&(excepts_))|(~((mxcsr_)>>7)&excepts_) + +-DEFUN_NEW("FPE_CODE",fixnum,fSfpe_code,SI,2,2,NONE,II,OO,OO,OO,(fixnum x87sw,fixnum mxcsr),"") { ++DEFUN_NEW("FPE_CODE",object,fSfpe_code,SI,2,2,NONE,II,OO,OO,OO,(fixnum x87sw,fixnum mxcsr),"") { + +- RETURN1(FE_TEST(x87sw,mxcsr,FE_INVALID) ? FPE_FLTINV : +- (FE_TEST(x87sw,mxcsr,FE_DIVBYZERO) ? FPE_FLTDIV : +- (FE_TEST(x87sw,mxcsr,FE_OVERFLOW) ? FPE_FLTOVF : +- (FE_TEST(x87sw,mxcsr,FE_UNDERFLOW) ? FPE_FLTUND : +- (FE_TEST(x87sw,mxcsr,FE_INEXACT) ? FPE_FLTRES : 0))))); ++ RETURN1((object)(FE_TEST(x87sw,mxcsr,FE_INVALID) ? FPE_FLTINV : ++ (FE_TEST(x87sw,mxcsr,FE_DIVBYZERO) ? FPE_FLTDIV : ++ (FE_TEST(x87sw,mxcsr,FE_OVERFLOW) ? FPE_FLTOVF : ++ (FE_TEST(x87sw,mxcsr,FE_UNDERFLOW) ? FPE_FLTUND : ++ (FE_TEST(x87sw,mxcsr,FE_INEXACT) ? FPE_FLTRES : 0)))))); + } + + #if defined(__MINGW32__) || defined(__CYGWIN__) + +-DEFUN_NEW("FNSTSW",fixnum,fSfnstsw,SI,0,0,NONE,II,OO,OO,OO,(void),"") { ++DEFUN_NEW("FNSTSW",object,fSfnstsw,SI,0,0,NONE,II,OO,OO,OO,(void),"") { + volatile unsigned short t; + ASM ("fnstsw %0" :: "m" (t)); +- RETURN1(t); ++ RETURN1((object)t); + } +-DEFUN_NEW("STMXCSR",fixnum,fSstmxcsr,SI,0,0,NONE,II,OO,OO,OO,(void),"") { ++DEFUN_NEW("STMXCSR",object,fSstmxcsr,SI,0,0,NONE,II,OO,OO,OO,(void),"") { + volatile unsigned int t; + ASM ("stmxcsr %0" :: "m" (t)); +- RETURN1(t); ++ RETURN1((object)t); + } + + #endif +--- gcl-2.6.12.orig/xgcl-2/sysdef.lisp ++++ gcl-2.6.12/xgcl-2/sysdef.lisp +@@ -41,6 +41,9 @@ + + + (defun compile-xgcl() ++ #+m68k(progn (trace si::readdir si::opendir si::closedir si::pathname-match-p) ++ (print (directory "*.c")) ++ (untrace si::readdir si::opendir si::closedir si::pathname-match-p)) + (mapc (lambda (x) + (let ((x (concatenate 'string compiler::*cc* " -I../h " (namestring x)))) + (unless (zerop (system x)) diff --git a/debian/patches/Version_2.6.13pre114 b/debian/patches/Version_2.6.13pre114 new file mode 100644 index 0000000..5b52cb5 --- /dev/null +++ b/debian/patches/Version_2.6.13pre114 @@ -0,0 +1,64 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-117) unstable; urgency=medium + . + * Version_2.6.13pre114 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-12-25 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -7630,13 +7630,16 @@ else $as_nop + /* end confdefs.h. */ + + #include ++ #include + + int + main (void) + { + +- struct dirent d; +- return d.d_type=0; ++ struct dirent *d; ++ DIR *r=opendir("./"); ++ for (;(d=readdir(r)) && strcmp("configure",d->d_name);); ++ return d && d->d_type==DT_REG ? 0 : -1; + + ; + return 0; +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1495,10 +1495,13 @@ AC_CHECK_HEADERS([dirent.h], + [AC_LANG_PROGRAM( + [[ + #include ++ #include + ]], + [[ +- struct dirent d; +- return d.d_type=0; ++ struct dirent *d; ++ DIR *r=opendir("./"); ++ for (;(d=readdir(r)) && strcmp("configure",d->d_name);); ++ return d && d->d_type==DT_REG ? 0 : -1; + ]])], + [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_D_TYPE,1,[have struct dirent d_type field])], + AC_MSG_RESULT([no]),AC_MSG_RESULT([no]))) diff --git a/debian/patches/Version_2.6.13pre121 b/debian/patches/Version_2.6.13pre121 new file mode 100644 index 0000000..93552e2 --- /dev/null +++ b/debian/patches/Version_2.6.13pre121 @@ -0,0 +1,116 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-121) unstable; urgency=medium + . + * Version_2.6.13pre121 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-08-08 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4552,15 +4552,12 @@ add_args_to_cflags -fsigned-char -pipe + + add_args_to_ldflags -no-pie # -Wl,-z,lazy + +-CC=gcc +-GCL_CC=gcc +- + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline semantics" >&5 + printf %s "checking for inline semantics... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- extern inline int foo(int i) {return i;} ++ inline int foo(int i) {return i;} + + int + bar(int i) {return foo(i);} +@@ -4568,17 +4565,14 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ + _ACEOF + if ac_fn_c_try_compile "$LINENO" + then : +- if ! `nm conftest.o |grep -q "T foo"` ; then +- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: old" >&5 +-printf "%s\n" "old" >&6; } +- +-printf "%s\n" "#define OLD_INLINE 1" >>confdefs.h +- ++ if `nm conftest.o |grep foo |awk '{if (NF==3) exit(-1)}'` ; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: new" >&5 ++printf "%s\n" "new" >&6; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- inline int foo(int i) {return i;} ++ extern inline int foo(int i) {return i;} + + int + bar(int i) {return foo(i);} +@@ -4586,9 +4580,12 @@ printf "%s\n" "#define OLD_INLINE 1" >>c + _ACEOF + if ac_fn_c_try_compile "$LINENO" + then : +- if ! `nm conftest.o |grep -q "T foo"` ; then +- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: new" >&5 +-printf "%s\n" "new" >&6; } ++ if `nm conftest.o |grep foo |awk '{if (NF==3) exit(-1)}'` ; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: old" >&5 ++printf "%s\n" "old" >&6; } ++ ++printf "%s\n" "#define OLD_INLINE 1" >>confdefs.h ++ + else + as_fn_error $? "need working inline semantics" "$LINENO" 5 + fi +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -266,24 +266,24 @@ add_args_to_ldflags -no-pie # -Wl,-z,laz + AC_MSG_CHECKING([for inline semantics]) + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE([[ +- extern inline int foo(int i) {return i;} ++ inline int foo(int i) {return i;} + + int + bar(int i) {return foo(i);} + ]])], +- [if ! `nm conftest.o |grep -q "T foo"` ; then +- AC_MSG_RESULT([old]) +- AC_DEFINE([OLD_INLINE],[1],[extern inline semantics]) ++ [if `nm conftest.o |grep foo |awk '{if (NF==3) exit(-1)}'` ; then ++ AC_MSG_RESULT([new]) + else + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE([[ +- inline int foo(int i) {return i;} ++ extern inline int foo(int i) {return i;} + + int + bar(int i) {return foo(i);} + ]])], +- [if ! `nm conftest.o |grep -q "T foo"` ; then +- AC_MSG_RESULT([new]) ++ [if `nm conftest.o |grep foo |awk '{if (NF==3) exit(-1)}'` ; then ++ AC_MSG_RESULT([old]) ++ AC_DEFINE([OLD_INLINE],[1],[extern inline semantics]) + else + AC_MSG_ERROR([need working inline semantics]) + fi], diff --git a/debian/patches/Version_2.6.13pre96 b/debian/patches/Version_2.6.13pre96 new file mode 100644 index 0000000..eac6f65 --- /dev/null +++ b/debian/patches/Version_2.6.13pre96 @@ -0,0 +1,297 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-99) unstable; urgency=medium + . + * Version_2.6.13pre95 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2020-12-04 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmulti.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmulti.lsp +@@ -168,14 +168,16 @@ + (let ((*value-to-go* 'top)*top-data*) + (c2expr* form) (setq top-data *top-data*)) + (and *record-call-info* (record-call-info nil (car top-data))) +- (wt-nl "if(vs_base>vs_top) vs_top=vs_base;*vs_top=Cnil;") ++ (wt-nl "if(vs_base>vs_top) vs_top=vs_base;") ++ (wt-nl "*vs_top=Cnil;") + (do ((vs vrefs (cdr vs))) + ((endp vs)) + (let ((vref (car vs))) + (set-var 'fun-val (car vref) (cadr vref)) + (unless (endp (cdr vs)) (wt-nl "if(vs_basevs_top) vs_top=vs_base;*vs_top=Cnil;") ++ (wt-nl "if(vs_base>vs_top) vs_top=vs_base;") ++ (wt-nl "*vs_top=Cnil;") + (do ((vs vars (cdr vs))) + ((endp vs)) + (c2bind-loc (car vs) '(vs-base 0)) +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -3979,7 +3979,7 @@ add_args_to_cflags -fsigned-char -pipe - + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ +- -Wno-unused-but-set-variable -Wno-misleading-indentation ++ -Wno-unused-but-set-variable + + add_args_to_ldflags -no-pie -Wl,-z,lazy + +@@ -7946,19 +7946,10 @@ fi + $as_echo "$ac_cv_lib_readline_rl_initialize" >&6; } + if test "x$ac_cv_lib_readline_rl_initialize" = xyes; then : + +-$as_echo "#define HAVE_READLINE 1" >>confdefs.h ++$as_echo "#define USE_READLINE 1" >>confdefs.h + +- TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware +- RL_OBJS=gcl_readline.o +-fi +- +-fi +- +-done +- +- +- # These tests discover differences between readline 4.1 and 4.3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 ++ # These tests discover differences between readline 4.1 and 4.3 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 + $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } + if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -8003,6 +7994,14 @@ $as_echo "#define HAVE_RL_COMPENTRY_FUNC + + fi + ++ TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware ++ RL_OBJS=gcl_readline.o ++fi ++ ++fi ++ ++done ++ + fi + + +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -263,7 +263,7 @@ add_args_to_cflags -fsigned-char -pipe - + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ +- -Wno-unused-but-set-variable -Wno-misleading-indentation ++ -Wno-unused-but-set-variable + + add_args_to_ldflags -no-pie -Wl,-z,lazy + +@@ -1713,15 +1713,14 @@ fi + + if test "$enable_readline" != "no" ; then + AC_CHECK_HEADERS([readline/readline.h], +- AC_CHECK_LIB([readline],[rl_initialize], +- [AC_DEFINE(HAVE_READLINE,1,[have readline library]) +- TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware +- RL_OBJS=gcl_readline.o])) +- +- # These tests discover differences between readline 4.1 and 4.3 +- AC_CHECK_LIB([readline],[rl_completion_matches], +- [AC_DEFINE(HAVE_DECL_RL_COMPLETION_MATCHES,1,[have readline completion matches]) +- AC_DEFINE(HAVE_RL_COMPENTRY_FUNC_T,1,[have readline completion matches])]) ++ AC_CHECK_LIB([readline],[rl_initialize], ++ [AC_DEFINE(USE_READLINE,1,[use readline library]) ++ # These tests discover differences between readline 4.1 and 4.3 ++ AC_CHECK_LIB([readline],[rl_completion_matches], ++ [AC_DEFINE(HAVE_DECL_RL_COMPLETION_MATCHES,1,[have readline completion matches]) ++ AC_DEFINE(HAVE_RL_COMPENTRY_FUNC_T,1,[have readline completion matches])]) ++ TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware ++ RL_OBJS=gcl_readline.o])) + fi + + AC_SUBST(RL_OBJS) +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -186,9 +186,6 @@ + /* have putenv call */ + #undef HAVE_PUTENV + +-/* have readline library */ +-#undef HAVE_READLINE +- + /* Define to 1 if you have the header file. */ + #undef HAVE_READLINE_READLINE_H + +@@ -374,6 +371,9 @@ + /* use fionbio for non-blocking io */ + #undef USE_FIONBIO + ++/* use readline library */ ++#undef USE_READLINE ++ + /* protect cdr from immfix and speed up type processing */ + #undef USE_SAFE_CDR + +--- gcl-2.6.12.orig/h/include.h ++++ gcl-2.6.12/h/include.h +@@ -99,7 +99,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + #ifdef HAVE_ALLOCA_H + #include + #endif +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + #include + #endif + +--- gcl-2.6.12.orig/h/prelink.h ++++ gcl-2.6.12/h/prelink.h +@@ -27,7 +27,7 @@ PRELINK_EXTER FILE *my_stdin; + PRELINK_EXTER FILE *my_stdout; + PRELINK_EXTER FILE *my_stderr; + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + PRELINK_EXTER rl_compentry_func_t **my_rl_completion_entry_function_ptr; + PRELINK_EXTER const char **my_rl_readline_name_ptr; + #endif +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -38,7 +38,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + #define IN_FILE + #include "include.h" + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + #define kclgetc(FP) rl_getc_em(((FILE *)FP)) + #define kclungetc(C, FP) rl_ungetc_em(C, ((FILE *)FP)) + #define kclputc(C, FP) rl_putc_em(C, ((FILE *)FP)) +@@ -46,7 +46,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + #define kclgetc(FP) getc(((FILE *)FP)) + #define kclungetc(C, FP) ungetc(C, ((FILE *)FP)) + #define kclputc(C, FP) putc(C, ((FILE *)FP)) +-#endif /* HAVE_READLINE */ ++#endif /* USE_READLINE */ + + #define xkclfeof(c,FP) feof(((FILE *)FP)) + +@@ -109,7 +109,7 @@ feof1(fp) + FILE *fp; + { + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + if (rl_stream_p(fp) && rl_eof_p(fp)) + return TRUE; + #endif +@@ -1258,7 +1258,7 @@ BEGIN: + case smm_input: + case smm_io: + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + if (rl_stream_p(strm->sm.sm_fp)) + return rl_pending_buffered_input_p(strm->sm.sm_fp); + #endif +@@ -2372,7 +2372,7 @@ gcl_init_file_function() + make_si_function("USER-STREAM-STATE", siLuser_stream_state); + #endif + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + gcl_init_readline_function(); + #endif + } +--- gcl-2.6.12.orig/o/gcl_readline.d ++++ gcl-2.6.12/o/gcl_readline.d +@@ -27,7 +27,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + #define IN_READLINE + #include "include.h" + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + + /* Here begins GNU Readline support. It was designed for Maxima, + * but it works with GCL fine too. If you want to include word completion +@@ -391,4 +391,4 @@ gcl_init_readline(void) { + make_si_function("READLINE-OFF", siLreadline_off); + } + +-#endif /* HAVE_READLINE */ ++#endif /* USE_READLINE */ +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -555,7 +555,7 @@ main(int argc, char **argv, char **envp) + terminal_io->sm.sm_object1->sm.sm_fp = stdout; + + gcl_init_big1(); +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + gcl_init_readline_function(); + #endif + #ifdef NEED_STACK_CHK_GUARD +@@ -755,7 +755,7 @@ initlisp(void) { + #ifdef CMAC + gcl_init_cmac(); + #endif +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + gcl_init_readline(); + #endif + +@@ -1185,7 +1185,7 @@ init_main(void) { + } } + #endif + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + ADD_FEATURE("READLINE"); + #endif + #if !defined(USE_DLOPEN) +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -7,7 +7,7 @@ extern FILE *stdin __attribute__((weak)) + extern FILE *stderr __attribute__((weak)); + extern FILE *stdout __attribute__((weak)); + +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + #if RL_READLINE_VERSION < 0x0600 + extern Function *rl_completion_entry_function __attribute__((weak)); + extern char *rl_readline_name __attribute__((weak)); +@@ -24,7 +24,7 @@ prelink_init(void) { + my_stdin=stdin; + my_stdout=stdout; + my_stderr=stderr; +-#ifdef HAVE_READLINE ++#ifdef USE_READLINE + my_rl_completion_entry_function_ptr=(void *)&rl_completion_entry_function; + my_rl_readline_name_ptr=(void *)&rl_readline_name; + #endif diff --git a/debian/patches/Version_2_6_13pre1 b/debian/patches/Version_2_6_13pre1 new file mode 100644 index 0000000..2599262 --- /dev/null +++ b/debian/patches/Version_2_6_13pre1 @@ -0,0 +1,13167 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-2) unstable; urgency=medium + . + * Version_2_6_13pre1 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/clcs/package.lisp ++++ gcl-2.6.12/clcs/package.lisp +@@ -20,3 +20,4 @@ + (defvar *this-package* (find-package :conditions)) + + ++(import 'si::(clines defentry defcfun object void int double)) +--- gcl-2.6.12.orig/clcs/sys-proclaim.lisp ++++ gcl-2.6.12/clcs/sys-proclaim.lisp +@@ -1,45 +1,46 @@ + +-(IN-PACKAGE "CONDITIONS") +-(PROCLAIM +- '(FTYPE (FUNCTION (T) T) CONDITION-CLASS-P IS-WARNING CONDITIONP +- IS-CONDITION ESCAPE-SPECIAL-CASES-REPLACE +- SIMPLE-CONDITION-CLASS-P INTERNAL-SIMPLE-CONDITION-CLASS-P)) +-(PROCLAIM '(FTYPE (FUNCTION (*) *) CLCS-COMPILE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) T) ASSERT-REPORT SYMCAT COERCE-TO-FN +- SLOT-SYM)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T *) *) CLCS-LOAD CLCS-OPEN CLCS-COMPILE-FILE +- MAKE-CONDITION)) +-(PROCLAIM '(FTYPE (FUNCTION (T) (*)) SIMPLE-ASSERTION-FAILURE)) +-(PROCLAIM '(FTYPE (FUNCTION (T T T) T) ACCUMULATE-CASES)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) T) +- |(PCL::FAST-METHOD PRINT-OBJECT (CONDITION T))|)) +-(PROCLAIM '(FTYPE (FUNCTION (T T) *) ASSERT-PROMPT)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) *) +- |(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-WARNING T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (FILE-ERROR T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-ERROR T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))| +- COERCE-TO-CONDITION +- |(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))| +- |(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))|)) +-(PROCLAIM +- '(FTYPE (FUNCTION NIL T) REVERT-CLCS-SYMBOLS INSTALL-CLCS-SYMBOLS +- READ-EVALUATED-FORM)) +-(MAPC (LAMBDA (COMPILER::X) +- (SETF (GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) T)) +- '(INSTALL-SYMBOL REVERT-SYMBOL)) +\ No newline at end of file ++(COMMON-LISP::IN-PACKAGE "CONDITIONS") ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ CONDITIONS::IS-WARNING CONDITIONS::DEFAULT-REPORT ++ CONDITIONS::IS-CONDITION CONDITIONS::CONDITIONP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (FILE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD MAKE-LOAD-FORM (CONDITION))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ CONDITIONS::COERCE-TO-FN CONDITIONS::SLOT-SYM)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::MAKE-CONDITION)) +\ No newline at end of file +--- gcl-2.6.12.orig/cmpnew/gcl_cmpbind.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpbind.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'bds-bind 'set-bds-bind 'set-loc) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpblock.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpblock.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'block 'c1block 'c1special) + (si:putprop 'block 'c2block 'c2) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpcall.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpcall.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar *ifuncall* nil) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpcatch.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpcatch.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'catch 'c1catch 'c1special) + (si:putprop 'catch 'c2catch 'c2) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpenv.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpenv.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar *safe-compile* nil) + (defvar *compiler-check-args* nil) +@@ -337,7 +337,7 @@ + readtable sequence short-float simple-array simple-bit-vector + simple-string simple-vector single-float standard-char stream string + dynamic-extent :dynamic-extent +- string-char symbol t vector signed-byte unsigned-byte) ++ symbol t vector signed-byte unsigned-byte) + (proclaim-var (car decl) (cdr decl))) + (otherwise + (unless (member (car decl) *alien-declarations*) +@@ -366,6 +366,12 @@ + (t + (warn "The variable name ~s is not a symbol." var))))) + ++(defun mexpand-deftype (tp &aux (l (listp tp))(i (when l (cdr tp)))(tp (if l (car tp) tp))) ++ (when (symbolp tp) ++ (let ((fn (get tp 'si::deftype-definition))) ++ (when fn ++ (apply fn i))))) ++ + (defun c1body (body doc-p &aux (ss nil) (is nil) (ts nil) (others nil) + doc form) + (loop +@@ -383,10 +389,8 @@ + ;;; 20040320 CM + (cmpck (not (consp decl)) + "The declaration ~s is illegal." decl) +- (let* ((dtype (car decl))) +-;; Can process user deftypes here in the future -- 20040318 CM +-;; (dft (and (symbolp dtype) (get dtype 'si::deftype-definition))) +-;; (dtype (or (and dft (funcall dft)) dtype))) ++ (let* ((dtype (car decl)) ++ (dtype (or (mexpand-deftype dtype) dtype))) + (if (consp dtype) + (let ((stype (car dtype))) + (cmpck (or (not (symbolp stype)) (cdddr dtype)) "The declaration ~s is illegal." decl) +@@ -449,7 +453,7 @@ + integer keyword list long-float nil null number package pathname + random-state ratio rational readtable sequence simple-array + simple-bit-vector simple-string simple-base-string simple-vector single-float +- standard-char stream string string-char symbol t vector ++ standard-char stream string symbol t vector + signed-byte unsigned-byte) + (let ((type (type-filter stype))) + (when type +@@ -667,7 +671,7 @@ + readtable sequence short-float simple-array simple-bit-vector + simple-string simple-vector single-float standard-char stream string + dynamic-extent :dynamic-extent +- string-char symbol t vector signed-byte unsigned-byte) ++ symbol t vector signed-byte unsigned-byte) + (let ((type (type-filter (car decl)))) + (dolist** (var (cdr decl) t) + (if (symbolp var) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpeval.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpeval.lsp +@@ -23,9 +23,9 @@ + + (export '(si::define-compiler-macro + si::undef-compiler-macro +- si::define-inline-function) 'system) ++ si::define-inline-function) :system) + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'progn 'c1progn 'c1special) + (si:putprop 'progn 'c2progn 'c2) +@@ -180,9 +180,8 @@ + + + (defun result-type-from-args(f args &aux tem) +- (when (and (setq tem (get f 'return-type)) +- (not (eq tem '*)) +- (not (consp tem))) ++ (when (if (setq tem (get f 'return-type)) ++ (and (not (eq tem '*)) (not (consp tem))) t) + (dolist (v '(inline-always inline-unsafe)) + (dolist (w (get f v)) + (fix-opt w) +@@ -486,19 +485,22 @@ + + (defun c1structure-ref1 (form name index &aux (info (make-info))) + ;;; Explicitly called from c1expr and c1structure-ref. +- (declare (special *aet-types*)) + (cond (*safe-compile* (c1expr `(si::structure-ref ,form ',name ,index))) +- (t +- (let* ((sd (get name 'si::s-data)) +- (aet-type (aref (si::s-data-raw sd) index)) +- ) +- (setf (info-type info) (type-filter (aref *aet-types* aet-type))) +- (list 'structure-ref info +- (c1expr* form info) +- (add-symbol name) +- index sd) +- +- )))) ++ ((let* ((sd (get name 'si::s-data)) ++ (aet-type (aref (si::s-data-raw sd) index)) ++ (sym (find-symbol (si::string-concatenate ++ (or (si::s-data-conc-name sd) "") ++ (car (nth index (si::s-data-slot-descriptions sd)))))) ++ (tp (if sym (get-return-type sym) '*)) ++ (tp (type-filter (type-and tp (aref *aet-types* aet-type))))) ++ ++ (setf (info-type info) (if (and (eq name 'si::s-data) (= index 2));;FIXME -- this belongs somewhere else. CM 20050106 ++ '(vector unsigned-char) ++ tp)) ++ (list 'structure-ref info ++ (c1expr* form info) ++ (add-symbol name) ++ index sd))))) + + (defun coerce-loc-structure-ref (arg type-wanted &aux (form (cdr arg))) + (let* ((sd (fourth form)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpflet.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpflet.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'flet 'c1flet 'c1special) + (si:putprop 'flet 'c2flet 'c2) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpfun.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpfun.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'princ 'c1princ 'c1) + (si:putprop 'princ 'c2princ 'c2) +@@ -565,7 +565,7 @@ + (equal (third type) '(*))))) + (setq tem (si::best-array-element-type + (second type))) +- (cond ((eq tem 'string-char) `(stringp ,x)) ++ (cond ((eq tem 'character) `(stringp ,x)) + ((eq tem 'bit) `(bit-vector-p ,x)) + ((setq tem (position tem *aet-types*)) + `(the boolean (vector-type ,x ,tem))))) +@@ -803,7 +803,7 @@ + + + (defvar *aet-types* +- #(T STRING-CHAR SIGNED-CHAR FIXNUM SHORT-FLOAT LONG-FLOAT ++ #(T CHARACTER SIGNED-CHAR FIXNUM SHORT-FLOAT LONG-FLOAT + SIGNED-CHAR + UNSIGNED-CHAR SIGNED-SHORT UNSIGNED-SHORT)) + +@@ -811,7 +811,7 @@ + (defun aet-c-type (type) + (ecase type + ((t) "object") +- ((string-char signed-char) "char") ++ ((character signed-char) "char") + (fixnum "fixnum") + (unsigned-char "unsigned char") + (unsigned-short "unsigned short") +--- gcl-2.6.12.orig/cmpnew/gcl_cmpif.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpif.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'if 'c1if 'c1special) + (si:putprop 'if 'c2if 'c2) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpinline.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpinline.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + ;;; Pass 1 generates the internal form + ;;; ( id info-object . rest ) +--- gcl-2.6.12.orig/cmpnew/gcl_cmplabel.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmplabel.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar *last-label* 0) + (defvar *exit*) +--- gcl-2.6.12.orig/cmpnew/gcl_cmplam.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmplam.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + ;;; During Pass1, a lambda-list + ;;; +--- gcl-2.6.12.orig/cmpnew/gcl_cmplet.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmplet.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + (eval-when (compile) + (or (fboundp 'write-block-open) (load "cmplet.lsp"))) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmploc.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmploc.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar *value-to-go*) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -24,7 +24,7 @@ + ;;; ***************** + + +-(in-package 'compiler) ++(in-package :compiler) + + + (export '(*compile-print* *compile-verbose*)) +@@ -49,7 +49,11 @@ + (defvar *cmpinclude* "\"cmpinclude.h\"") + ;;If the following is a string, then it is inserted instead of + ;; the include file cmpinclude.h, EXCEPT for system-p calls. +-(defvar *cmpinclude-string* t) ++(defvar *cmpinclude-string* ++ (si::file-to-string ++ (namestring ++ (make-pathname :directory (append (pathname-directory si::*system-directory*) (list :parent "h")) ++ :name "cmpinclude" :type "h")))) + + + ;; Let the user write dump c-file etc to /dev/null. +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmap.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmap.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'mapcar 'c1mapcar 'c1) + (si:putprop 'maplist 'c1maplist 'c1) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmulti.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmulti.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'multiple-value-call 'c1multiple-value-call 'c1special) + (si:putprop 'multiple-value-call 'c2multiple-value-call 'c2) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpopt.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpopt.lsp +@@ -1,4 +1,4 @@ +-(in-package 'compiler) ++(in-package :compiler) + + ;; The optimizers have been redone to allow more flags + ;; The old style optimizations correspond to the first 2 +@@ -136,8 +136,11 @@ + (get 'system:aset 'inline-unsafe)) + (push '(((array t) fixnum t) t #.(flags set)"(#0)->v.v_self[#1]= (#2)") + (get 'system:aset 'inline-unsafe)) +-(push '(((array string-char) fixnum character) character #.(flags rfa set)"(#0)->ust.ust_self[#1]= (#2)") ++(push '(((array character) fixnum character) character #.(flags rfa set)"(#0)->ust.ust_self[#1]= (#2)") + (get 'system:aset 'inline-unsafe)) ++(push '(((array bit) fixnum fixnum) fixnum #.(flags rfa) ++ "({object _o=(#0);fixnum _i=(#1)+_o->bv.bv_offset;char _c=1<bv.bv_self+(_i>>3);bool _b=(#2);if (_b) *_d|=_c; else *_d&=~_c;_b;})") ++ (get 'si::aset 'inline-unsafe)) + (push '(((array fixnum) fixnum fixnum) fixnum #.(flags set rfa)"(#0)->fixa.fixa_self[#1]= (#2)") + (get 'system:aset 'inline-unsafe)) + (push '(((array signed-short) fixnum fixnum) fixnum #.(flags rfa set)"((short *)(#0)->ust.ust_self)[#1]=(#2)") +@@ -159,7 +162,7 @@ + (push '(((array t) fixnum fixnum t) t #.(flags set) + "@0;(#0)->a.a_self[(#1)*(#0)->a.a_dims[1]+#2]= (#3)") + (get 'system:aset 'inline-unsafe)) +-(push '(((array string-char) fixnum fixnum character) character ++(push '(((array character) fixnum fixnum character) character + #.(flags rfa set) + "@0;(#0)->ust.ust_self[(#1)*(#0)->a.a_dims[1]+#2]= (#3)") + (get 'system:aset 'inline-unsafe)) +@@ -433,7 +436,9 @@ + (get 'aref 'inline-unsafe)) + (push '(((array t) fixnum) t #.(flags)"(#0)->v.v_self[#1]") + (get 'aref 'inline-unsafe)) +-(push '(((array string-char) fixnum) character #.(flags rfa)"(#0)->ust.ust_self[#1]") ++(push '(((array character) fixnum) character #.(flags rfa)"(#0)->ust.ust_self[#1]") ++ (get 'aref 'inline-unsafe)) ++(push '(((array bit) fixnum) fixnum #.(flags rfa)"({object _o=(#0);fixnum _i=(#1)+(_o)->bv.bv_offset;(_o->bv.bv_self[_i>>3]>>BIT_ENDIAN(_i&0x7))&0x1;})") + (get 'aref 'inline-unsafe)) + (push '(((array fixnum) fixnum) fixnum #.(flags rfa)"(#0)->fixa.fixa_self[#1]") + (get 'aref 'inline-unsafe)) +@@ -456,7 +461,7 @@ + (push '(((array t) fixnum fixnum) t #.(flags ) + "@0;(#0)->a.a_self[(#1)*(#0)->a.a_dims[1]+#2]") + (get 'aref 'inline-unsafe)) +-(push '(((array string-char) fixnum fixnum) character #.(flags rfa) ++(push '(((array character) fixnum fixnum) character #.(flags rfa) + "@0;(#0)->ust.ust_self[(#1)*(#0)->a.a_dims[1]+#2]") + (get 'aref 'inline-unsafe)) + (push '(((array fixnum) fixnum fixnum) fixnum #.(flags rfa) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpspecial.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpspecial.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'quote 'c1quote 'c1special) + (si:putprop 'function 'c1function 'c1special) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptag.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptag.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + (import 'si::switch) + (import 'si::switch-finish) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmptest.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptest.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (defun self-compile () + (with-open-file (log "lsplog" :direction :output) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptop.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptop.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar *objects* (make-hash-table :test 'eq)) + ;(defvar *objects* nil) +@@ -572,7 +572,7 @@ + (defun make-inline-string (cfun args fname) + (if (null args) + (format nil "~d()" (c-function-name "LI" cfun fname)) +- (let ((o (make-array 100 :element-type 'string-char :fill-pointer 0 ++ (let ((o (make-array 100 :element-type 'character :fill-pointer 0 + :adjustable t ))) + (format o "~d(" (c-function-name "LI" cfun fname)) + (do ((l args (cdr l)) +@@ -696,7 +696,7 @@ + ))) + + (defun si::add-debug (fname x) +- (si::putprop fname x 'si::debug)) ++ (si::putprop fname x 'si::debugger)) + + (defun t3init-fun (fname cfun lambda-expr doc) + +@@ -1237,10 +1237,10 @@ + (si::fixnump (cdr (var-ref va)))) + (setf (nth (cdr (var-ref va)) locals) + (var-name va)))) +- (setf (get fname 'si::debug) locals) +- (let ((locals (get fname 'si::debug))) ++ (setf (get fname 'si::debugger) locals) ++ (let ((locals (get fname 'si::debugger))) + (if (and locals (or (cdr locals) (not (null (car locals))))) +- (add-init `(si::debug ',fname ',locals) ) ++ (add-init `(debug ',fname ',locals) ) + )) + )))) + +@@ -1406,7 +1406,7 @@ + ((and (consp form) + (symbolp (car form)) + (or (eq (car form) 'setq) +- (not (special-form-p (car form)))) ++ (not (special-operator-p (car form)))) + (do ((v (cdr form) (and (consp v) (cdr v))) + (i 1 (the fixnum (+ 1 i)))) + ((or (>= i 1000) +@@ -1457,7 +1457,7 @@ + (setf (get 'si::define-structure 't1) 't1define-structure) + + (defun t1define-structure (args) +- (maybe-eval t `(si::define-structure ,@args ,(not (maybe-eval nil nil)))) ++ (maybe-eval t `(si::define-structure ,@(copy-tree args) ,(not (maybe-eval nil nil))));FIXME + (t1ordinary (cons 'si::define-structure args))) + + +@@ -1484,7 +1484,7 @@ + (cond ((stringp s) (push s body)) + ((consp s) + (cond ((symbolp (car s)) +- (cmpck (special-form-p (car s)) ++ (cmpck (special-operator-p (car s)) + "Special form ~s is not allowed in defCfun." (car s)) + (push (list (cons (car s) (parse-cvspecs (cdr s)))) body)) + ((and (consp (car s)) (symbolp (caar s)) +@@ -1493,7 +1493,7 @@ + (not (endp (cddar s))) + (endp (cdr s)) + (not (endp (cddr s)))) +- (special-form-p (caar s))))) ++ (special-operator-p (caar s))))) + (push (cons (cons (caar s) + (if (eq (caar s) 'quote) + (list (add-object (cadar s))) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptype.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptype.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + ;;; CL-TYPE is any valid type specification of Common Lisp. + ;;; +@@ -51,7 +51,7 @@ + (let ((type (type-of thing))) + (case type + ((fixnum short-float long-float) type) +- ((string-char standard-char character) 'character) ++ ((standard-char character) 'character) + ((string bit-vector) type) + (vector (list 'vector (array-element-type thing))) + (array (list 'array (array-element-type thing))) +@@ -82,7 +82,7 @@ + (and (consp (caddr type)) + (= (length (caddr type)) 1)))) + (case element-type +- (string-char 'string) ++ (character 'string) + (bit 'bit-vector) + (t (list 'vector element-type)))) + (t (list 'array element-type)))) +@@ -109,8 +109,8 @@ + ((subtypep type '(vector long-float)) + '(vector long-float)) + ((subtypep type '(array t)) '(array t)) +- ((subtypep type '(array string-char)) +- '(array string-char)) ++ ((subtypep type '(array character)) ++ '(array character)) + ((subtypep type '(array bit)) '(array bit)) + ((subtypep type '(array fixnum)) '(array fixnum)) + ((subtypep type '(array short-float)) +@@ -142,11 +142,13 @@ + ((eq type1 t) type2) + ((eq type2 'object) type1) + ((eq type2 t) type1) +- ((consp type1) ++ ((subtypep type2 type1) type2) ++ ((subtypep type1 type2) type1) ++ ((consp type1) + (case (car type1) + (array + (case (cadr type1) +- (string-char (if (eq type2 'string) type2 nil)) ++ (character (if (eq type2 'string) type2 nil)) + (bit (if (eq type2 'bit-vector) type2 nil)) + (t (if (and (consp type2) + (eq (car type2) 'vector) +@@ -160,7 +162,7 @@ + (t (case type1 + (string + (if (and (consp type2) (eq (car type2) 'array) +- (eq (cadr type2) 'string-char)) ++ (eq (cadr type2) 'character)) + type1 nil)) + (bit-vector + (if (and (consp type2) (eq (car type2) 'array) +--- gcl-2.6.12.orig/cmpnew/gcl_cmputil.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmputil.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (export '(*suppress-compiler-warnings* + *suppress-compiler-notes* +@@ -204,7 +204,7 @@ + (do-macro-expansion '(macroexpand-1) form) + form)) + +-(defun cmp-expand-macro (fd fname args &aux env (form (cons fname args))) ++(defun cmp-expand-macro (fd fname args &aux (form (cons fname args))) + (if (macro-def-p form) + (do-macro-expansion `(funcall *macroexpand-hook* ',fd) form) + form)) +@@ -214,7 +214,7 @@ + (defun cmp-toplevel-eval (form) + (let* ((si::*ihs-base* si::*ihs-top*) + (si::*ihs-top* (1- (si::ihs-top))) +- (*break-enable* *compiler-break-enable*) ++ (si::*break-enable* *compiler-break-enable*) + (si::*break-hidden-packages* + (cons (find-package 'compiler) + si::*break-hidden-packages*))) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpvar.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpvar.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'var 'c2var 'c2) + (si:putprop 'location 'c2location 'c2) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpvs.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpvs.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (si:putprop 'vs 'set-vs 'set-loc) + (si:putprop 'vs 'wt-vs 'wt-loc) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpwt.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpwt.lsp +@@ -19,7 +19,7 @@ + ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + +-(in-package 'compiler) ++(in-package :compiler) + + (eval-when (compile eval) + (require 'FASDMACROS "../cmpnew/gcl_fasdmacros.lsp") +--- gcl-2.6.12.orig/cmpnew/gcl_collectfn.lsp ++++ gcl-2.6.12/cmpnew/gcl_collectfn.lsp +@@ -13,7 +13,7 @@ + ;; Additionally cross reference information about functions in the system is + ;; collected. + +-(in-package 'compiler) ++(in-package :compiler) + (import 'sloop::sloop) + + (defstruct fn +--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp ++++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp +@@ -3,7 +3,7 @@ + ;; and making the arglists correct if they have optional args. + ;; + +-(in-package 'compiler) ++(in-package :compiler) + + (DEFSYSFUN 'GENSYM "Lgensym" '(*) 'T NIL NIL) + (DEFSYSFUN 'SUBSEQ "Lsubseq" '(T T *) 'T NIL NIL) +@@ -129,7 +129,7 @@ + (DEFSYSFUN 'STRING-NOT-GREATERP "Lstring_not_greaterp" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'STRING> "Lstring_g" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'FINISH-OUTPUT "Lfinish_output" '(*) 'T NIL NIL) +-(DEFSYSFUN 'SPECIAL-FORM-P "Lspecial_form_p" '(T) 'T NIL T) ++(DEFSYSFUN 'SPECIAL-OPERATOR-P "Lspecial_operator_p" '(T) 'T NIL T) + (DEFSYSFUN 'STRINGP "Lstringp" '(T) 'T NIL T) + (DEFSYSFUN 'GET-INTERNAL-RUN-TIME "Lget_internal_run_time" 'NIL 'T NIL + NIL) +@@ -303,7 +303,7 @@ + (DEFSYSFUN '= "Lall_the_same" '(T *) 'T NIL T) + (DEFSYSFUN 'GENTEMP "Lgentemp" '(*) 'T NIL NIL) + (DEFSYSFUN 'RENAME-PACKAGE "Lrename_package" '(T T *) 'T NIL NIL) +-(DEFSYSFUN 'COMMONP "Lcommonp" '(T) 'T NIL T) ++(DEFSYSFUN 'COMMONP "siLcommonp" '(T) 'T NIL T) + (DEFSYSFUN 'NUMBERP "Lnumberp" '(T) 'T NIL T) + (DEFSYSFUN 'COPY-READTABLE "Lcopy_readtable" '(*) 'T NIL NIL) + (DEFSYSFUN 'RANDOM-STATE-P "Lrandom_state_p" '(T) 'T NIL T) +@@ -365,7 +365,7 @@ + (DEFSYSFUN 'ASSOC-IF "Lassoc_if" '(T T) 'T NIL NIL) + (DEFSYSFUN 'GET-PROPERTIES "Lget_properties" '(T T) '* NIL NIL) + (DEFSYSFUN 'STRING<= "Lstring_le" '(T T *) 'T NIL NIL) +-(DEFSYSFUN 'EVALHOOK "Levalhook" '(T T T *) 'T NIL NIL) ++(DEFSYSFUN 'EVALHOOK "siLevalhook" '(T T T *) 'T NIL NIL) + (DEFSYSFUN 'FILE-WRITE-DATE "Lfile_write_date" '(T) 'T NIL NIL) + (DEFSYSFUN 'LOGCOUNT "Llogcount" '(T) 'T NIL NIL) + (DEFSYSFUN 'MERGE-PATHNAMES "Lmerge_pathnames" '(T *) 'T NIL NIL) +--- gcl-2.6.12.orig/cmpnew/gcl_make_ufun.lsp ++++ gcl-2.6.12/cmpnew/gcl_make_ufun.lsp +@@ -20,13 +20,13 @@ + + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar gazonk (make-package 'symbol-table :use nil)) + (defvar eof (cons nil nil)) + (defvar *Ufun-out*) + +-(defvar *str* (make-array 128 :element-type 'string-char :fill-pointer 0)) ++(defvar *str* (make-array 128 :element-type 'character :fill-pointer 0)) + + (defun make-Ufun (in-files &key (out-file "Ufun_list.lsp")) + (with-open-file (*Ufun-out* out-file :direction :output) +--- gcl-2.6.12.orig/cmpnew/gcl_nocmpinc.lsp ++++ gcl-2.6.12/cmpnew/gcl_nocmpinc.lsp +@@ -1,6 +1,6 @@ + + +-(in-package 'compiler) ++(in-package :compiler) + + (defvar *cmpinclude-string* nil) + +@@ -20,4 +20,4 @@ + + + +- +\ No newline at end of file ++ +--- gcl-2.6.12.orig/cmpnew/sys-proclaim.lisp ++++ gcl-2.6.12/cmpnew/sys-proclaim.lisp +@@ -1,168 +1,377 @@ + +-(IN-PACKAGE "COMPILER") +-(MAPC (LAMBDA (X) (SETF (GET X 'PROCLAIMED-CLOSURE) T)) +- '(CMP-TMP-MACRO COMPILE DISASSEMBLE CMP-ANON)) +-(PROCLAIM '(FTYPE (FUNCTION (STRING *) T) TS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) T) VAR-REP-LOC C1FUNOB C1STRUCTURE-REF +- T1PROGN GET-RETURN-TYPE ADD-REG1 C1VAR C1ECASE +- C1SHARP-COMMA C1ASH LTVP CTOP-WRITE C2FUNCTION +- DECLARATION-TYPE C1TERPRI C1FUNCALL VAR-REGISTER C1ASSOC +- CONS-TO-LISTA WT-LIST C1NTHCDR-CONDITION +- C1MULTIPLE-VALUE-CALL CHECK-DOWNWARD TYPE-FILTER +- C2TAGBODY-LOCAL BLK-NAME C1FSET T1DEFENTRY C1MEMBER +- C1GETHASH C2GO-CCB SCH-LOCAL-FUN C1RPLACD C1RPLACA-NTHCDR +- INLINE-POSSIBLE C1MAPC C2VAR WT-FUNCALL-C C1ADD-GLOBALS +- FUN-NAME SAVE-FUNOB FUN-CFUN PROCLAIM TAG-REF-CCB +- FIXNUM-LOC-P UNWIND-NO-EXIT WT-H1 MAXARGS C1GO INFO-P TAG-P +- C1AND INLINE-TYPE VAR-REF-CCB C1MULTIPLE-VALUE-BIND C1THE +- C2DM-RESERVE-VL WT-DOWNWARD-CLOSURE-MACRO VAR-NAME C1THROW +- INFO-TYPE C1ASH-CONDITION LTVP-EVAL CHARACTER-LOC-P +- C2DOWNWARD-FUNCTION C1EXPR C1TAGBODY BLK-REF INFO-VOLATILE +- VAR-REF CONSTANT-FOLD-P WT-DATA-PACKAGE-OPERATION FUN-P +- VAR-LOC C1PROGN C1NTHCDR VOLATILE TAG-UNWIND-EXIT +- REPLACE-CONSTANT NAME-TO-SD SET-TOP C1GET PUSH-ARGS +- FUN-REF-CCB INLINE-BOOLE3-STRING C1SETQ C1LOCAL-CLOSURE +- CLINK GET-INCLUDED SET-PUSH-CATCH-FRAME FUNCTION-ARG-TYPES +- T2DECLARE OBJECT-TYPE CHECK-VREF COPY-INFO +- T1DEFINE-STRUCTURE C1BOOLE3 FUN-LEVEL C1NTH C2GET FIX-OPT +- C1OR FUNCTION-RETURN-TYPE T1DEFUN T1CLINES FLAGS-POS +- SAVE-AVMA WT-DOWN C2GO-CLB C1SWITCH WT-SWITCH-CASE +- C1FUNCTION C2RPLACD C1LABELS C1MULTIPLE-VALUE-SETQ WT-VV +- C2TAGBODY-CLB WT-CADR C1MAPCAR MACRO-DEF-P T1DEFMACRO +- SET-RETURN THE-PARAMETER BLK-REF-CCB AET-C-TYPE +- PUSH-ARGS-LISPCALL WRITE-BLOCK-OPEN SET-UP-VAR-CVS TAG-VAR +- INFO-SP-CHANGE ADD-LOOP-REGISTERS C1MULTIPLE-VALUE-PROG1 +- WT-VS C2LOCATION C1COMPILER-LET T3CLINES RESULT-TYPE +- PROCLAMATION C1MAPL C1PRINC TAG-LABEL C2FUNCALL-AUX BLK-VAR +- TAG-REF-CLB C2TAGBODY-CCB VERIFY-DATA-VECTOR C1MAPCAN +- BLK-EXIT WT-VS-BASE REGISTER UNDEFINED-VARIABLE +- SYSTEM:UNDEF-COMPILER-MACRO C1BLOCK C1MAPLIST +- ARGS-CAUSE-SIDE-EFFECT C2BIND C1LET WT-SYMBOL-FUNCTION +- CMP-MACRO-FUNCTION WT1 C1MEMQ BLK-REF-CLB ADD-ADDRESS +- GET-LOCAL-ARG-TYPES C1UNWIND-PROTECT REP-TYPE ADD-CONSTANT +- C1IF C1QUOTE C1FMLA-CONSTANT WT-DATA1 NAME-SD1 BLK-P +- C1CATCH CMP-MACROEXPAND SHORT-FLOAT-LOC-P T3ORDINARY +- C1LENGTH NEED-TO-SET-VS-POINTERS C1DOWNWARD-FUNCTION C1FLET +- TAG-SWITCH TAG-REF PARSE-CVSPECS TAG-NAME VAR-P VAR-KIND +- C1VREF C2GETHASH LONG-FLOAT-LOC-P C1MAPCON C1NTH-CONDITION +- WT-FUNCTION-LINK WT-VAR-DECL C1STACK-LET ADD-SYMBOL T1DEFLA +- C2EXPR* C1LOAD-TIME-VALUE C1DM-BAD-KEY C1PROGV FSET-FN-NAME +- C2VALUES FUN-REF C2VAR-KIND C1PSETQ VARARG-P T1ORDINARY +- C2GO-LOCAL C1LET* C2DM-RESERVE-V PUSH-DATA-INCF +- C1DEFINE-STRUCTURE DEFAULT-INIT MDELETE-FILE +- C1BOOLE-CONDITION C2RPLACA C1VALUES GET-ARG-TYPES WT-CAR +- FUN-INFO C1DECLARE C1STRUCTURE-SET WT-VS* CMP-MACROEXPAND-1 +- SCH-GLOBAL GET-LOCAL-RETURN-TYPE C1EVAL-WHEN C2TAGBODY-BODY +- C1APPLY C1LOCAL-FUN C1MACROLET ADD-OBJECT C1RETURN-FROM +- SAFE-SYSTEM RESET-INFO-TYPE T1DEFCFUN C1RPLACA WT-CDR +- VAR-TYPE T1MACROLET C1LIST-NTH INFO-CHANGED-ARRAY +- INFO-REFERRED-ARRAY BLK-VALUE-TO-GO ADD-OBJECT2 WT-CCB-VS)) +-(PROCLAIM '(FTYPE (FUNCTION (*) *) INLINE-BOOLE3)) +-(PROCLAIM '(FTYPE (FUNCTION (T) FIXNUM) F-TYPE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T (VECTOR T) FIXNUM T) FIXNUM) PUSH-ARRAY)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T (VECTOR T) FIXNUM FIXNUM T) FIXNUM) +- BSEARCHLEQ)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) *) C2EXPR WT-FIXNUM-LOC WT-LONG-FLOAT-LOC +- C2OR WT-SHORT-FLOAT-LOC CMP-EVAL C2PROGN WT-TO-STRING +- SET-LOC CMP-TOPLEVEL-EVAL VV-STR T1EXPR T1EVAL-WHEN WT-LOC +- C2AND WT-CHARACTER-LOC)) +-(PROCLAIM +- '(FTYPE (FUNCTION (*) T) FCALLN-INLINE MAKE-BLK MAKE-FUN +- LIST*-INLINE WT-CLINK COMPILE-FILE C2FSET MAKE-TAG CS-PUSH +- LIST-INLINE MAKE-VAR COMPILER-COMMAND MAKE-INFO)) +-(PROCLAIM +- '(FTYPE (FUNCTION (STRING FIXNUM FIXNUM) T) DASH-TO-UNDERSCORE-INT)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T) *) C2COMPILER-LET C2FLET C2LABELS C2IF +- WT-INLINE)) +-(PROCLAIM '(FTYPE (FUNCTION (T T *) *) T3DEFUN-AUX)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) *) C1DM-V C2RETURN-FROM C2DM C1DM-VL +- C2APPLY-OPTIMIZE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) T) C2APPLY C2RETURN-CCB C2BIND-INIT +- PROCLAIM-VAR PRIN1-CMP C2LAMBDA-EXPR-WITH-KEY +- SYSTEM::ADD-DEBUG C2LAMBDA-EXPR-WITHOUT-KEY C2STACK-LET +- MULTIPLE-VALUE-CHECK C1DECL-BODY COMPILER-CC C1EXPR* +- C2MULTIPLE-VALUE-PROG1 CO1VECTOR-PUSH +- ARGS-INFO-CHANGED-VARS C2DM-BIND-INIT C1PROGN* +- CO1WRITE-CHAR COERCE-LOC WT-FIXNUM-VALUE IS-REP-REFERRED +- C2MULTIPLE-VALUE-CALL CO1SPECIAL-FIX-DECL INLINE-PROC +- WT-CHARACTER-VALUE SET-VS C2PSETQ T3SHARP-COMMA +- STRUCT-TYPE-OPT WT-MAKE-DCLOSURE C2DM-BIND-VL SET-JUMP-TRUE +- DO-MACRO-EXPANSION CO1SCHAR C2BLOCK-CLB +- C2LIST-NTH-IMMEDIATE C2DM-BIND-LOC WT-LONG-FLOAT-VALUE +- CO1CONS COMPILER-CLEAR-COMPILER-PROPERTIES C2EXPR-TOP +- ARGS-INFO-REFERRED-VARS C2MEMBER!2 C2MULTIPLE-VALUE-SETQ +- C2SETQ ADD-DEBUG-INFO GET-INLINE-LOC RESULT-TYPE-FROM-ARGS +- C2BIND-LOC CO1STRUCTURE-PREDICATE C1ARGS SHIFT<< UNWIND-BDS +- MAYBE-EVAL C2UNWIND-PROTECT TYPE-AND C2CALL-LOCAL C2THROW +- CO1TYPEP SET-BDS-BIND C1SETQ1 C2CATCH TYPE>= C1LAMBDA-FUN +- NEED-TO-PROTECT C2ASSOC!2 CO1READ-BYTE CO1LDB +- CONVERT-CASE-TO-SWITCH FAST-READ MAKE-USER-INIT +- CO1CONSTANT-FOLD C1FMLA CHECK-FNAME-ARGS +- COERCE-LOC-STRUCTURE-REF WT-SHORT-FLOAT-VALUE C2BLOCK-CCB +- ADD-INFO CAN-BE-REPLACED CO1READ-CHAR C2CALL-LAMBDA +- CFAST-WRITE PUSH-CHANGED-VARS SHIFT>> JUMPS-TO-P CO1SUBLIS +- C1CONSTANT-VALUE C2RETURN-CLB WT-VAR CHECK-END C2EXPR-TOP* +- WT-V*-MACROS SET-JUMP-FALSE CMPFIX-ARGS SET-DBIND +- CO1WRITE-BYTE CO1EQL COMPILER-DEF-HOOK WT-REQUIREDS)) +-(PROCLAIM '(FTYPE (FUNCTION (T *) *) COMPILE-FILE1)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM FIXNUM) T) MLIN)) +-(PROCLAIM '(FTYPE (FUNCTION (STRING) T) DASH-TO-UNDERSCORE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) FIXNUM) PROCLAIMED-ARGD ANALYZE-REGS1 +- ANALYZE-REGS)) +-(PROCLAIM '(FTYPE (FUNCTION (T FIXNUM) T) MEMOIZED-HASH-EQUAL)) +-(PROCLAIM '(FTYPE (FUNCTION ((VECTOR T)) T) COPY-ARRAY)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) *) C2BLOCK-LOCAL C1SYMBOL-FUN C1BODY +- C2BLOCK C2DECL-BODY C2RETURN-LOCAL NCONC-FILES +- WT-INLINE-LOC COMPILER-BUILD)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T *) T) WT-CVAR C1LAMBDA-EXPR UNWIND-EXIT +- CMPWARN WT-COMMENT WT-INTEGER-LOC CMPERR ADD-INIT +- FAST-LINK-PROCLAIMED-TYPE-P CMPNOTE C1CASE INIT-NAME)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) T) T3DEFUN-VARARG C2STRUCTURE-REF +- C2CALL-UNKNOWN-GLOBAL C1MAKE-VAR C2SWITCH WT-GLOBAL-ENTRY +- C2CALL-GLOBAL T3INIT-FUN MY-CALL T3DEFUN-NORMAL)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T) T) CJT WT-INLINE-INTEGER CMP-EXPAND-MACRO +- CHECK-FORM-TYPE SET-VAR C2CASE ADD-FUNCTION-PROCLAMATION +- INLINE-TYPE-MATCHES T3DEFCFUN C2MAPCAN AND-FORM-TYPE +- C2PROGV C1DM WT-INLINE-CHARACTER C2MULTIPLE-VALUE-BIND +- C2FUNCALL-SFUN C2LET MYSUB C-FUNCTION-NAME WT-MAKE-CCLOSURE +- C2GO WT-INLINE-COND ADD-FAST-LINK C1STRUCTURE-REF1 C2MAPCAR +- BOOLE3 TOO-FEW-ARGS FIX-DOWN-ARGS COMPILER-PASS2 +- GET-INLINE-INFO C2LET* WT-INLINE-SHORT-FLOAT +- WT-IF-PROCLAIMED C2PRINC ASSIGN-DOWN-VARS +- WT-INLINE-LONG-FLOAT C2TAGBODY C1MAP-FUNCTIONS CHECK-VDECL +- MAKE-INLINE-STRING WT-INLINE-FIXNUM C2MAPC CAN-BE-REPLACED* +- SUBLIS1-INLINE TOO-MANY-ARGS ADD-FUNCTION-DECLARATION CJF)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T *) T) T3LOCAL-DCFUN T3LOCAL-FUN)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T) T) T2DEFUN T3DEFUN C2STRUCTURE-SET +- C1APPLY-OPTIMIZE T3DEFUN-LOCAL-ENTRY)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T *) T) WT-SIMPLE-CALL GET-OUTPUT-PATHNAME)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T *) T) INLINE-ARGS C2FUNCALL C2LAMBDA-EXPR +- LINK)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T) T) T3DEFMACRO DEFSYSFUN T2DEFENTRY +- T2DEFMACRO T3DEFENTRY)) +-(PROCLAIM +- '(FTYPE (FUNCTION NIL T) WT-DATA-BEGIN PRINT-COMPILER-INFO +- GAZONK-NAME CCB-VS-PUSH INC-INLINE-BLOCKS +- PRINT-CURRENT-FORM C1NIL WT-DATA-FILE +- ADD-LOAD-TIME-SHARP-COMMA CVS-PUSH RESET-TOP WT-CVARS +- BABOON WT-FASD-DATA-FILE WT-DATA-END INIT-ENV +- TAIL-RECURSION-POSSIBLE WFS-ERROR C1T VS-PUSH +- WT-NEXT-VAR-ARG WT-FIRST-VAR-ARG WT-C-PUSH +- CLOSE-INLINE-BLOCKS)) +\ No newline at end of file ++(COMMON-LISP::IN-PACKAGE "COMPILER") ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::STRING COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::TS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C1VALUES ++ COMPILER::C1RPLACA COMPILER::FUN-P ++ COMPILER::FUNCTION-ARG-TYPES COMPILER::C1STRUCTURE-REF ++ COMPILER::GET-RETURN-TYPE COMPILER::WT-FUNCALL-C ++ COMPILER::MACRO-DEF-P COMPILER::T1DEFUN COMPILER::C1ASSOC ++ COMPILER::SET-UP-VAR-CVS COMPILER::C2FUNCTION ++ COMPILER::C1DM-BAD-KEY COMPILER::ADD-OBJECT ++ COMPILER::WT-SWITCH-CASE COMPILER::VARARG-P ++ COMPILER::C1TAGBODY COMPILER::C2GET COMPILER::VAR-REF ++ COMPILER::SCH-LOCAL-FUN COMPILER::ADD-SYMBOL ++ COMPILER::TAG-UNWIND-EXIT COMPILER::C1MULTIPLE-VALUE-SETQ ++ COMPILER::C1PRINC COMPILER::WT-VAR-DECL COMPILER::C1QUOTE ++ COMPILER::C2RPLACD COMPILER::CHECK-VREF ++ COMPILER::PUSH-ARGS-LISPCALL COMPILER::C1MAPLIST ++ COMPILER::ADD-REG1 COMPILER::C1OR COMPILER::WT-SYMBOL-FUNCTION ++ COMPILER::TAG-P COMPILER::SAFE-SYSTEM COMPILER::C1ECASE ++ COMPILER::LTVP COMPILER::GET-INCLUDED COMPILER::INFO-P ++ COMPILER::FUN-INFO COMPILER::C1LOAD-TIME-VALUE ++ COMPILER::GET-LOCAL-ARG-TYPES COMPILER::BLK-P ++ COMPILER::BLK-EXIT COMPILER::C2VAR-KIND COMPILER::C2LOCATION ++ COMPILER::WT1 COMPILER::WT-CCB-VS ++ COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::BLK-REF-CCB ++ COMPILER::UNDEFINED-VARIABLE COMPILER::C1MULTIPLE-VALUE-CALL ++ COMPILER::VAR-LOC COMPILER::C1SETQ COMPILER::C1NTH-CONDITION ++ COMPILER::C2RPLACA COMPILER::FUN-REF COMPILER::C2VAR ++ COMPILER::WT-CAR COMPILER::WT-LIST COMPILER::WRITE-BLOCK-OPEN ++ COMPILER::INFO-VOLATILE COMPILER::GET-LOCAL-RETURN-TYPE ++ COMPILER::AET-C-TYPE COMPILER::PUSH-ARGS COMPILER::TAG-REF-CLB ++ COMPILER::BLK-REF COMPILER::VAR-P COMPILER::C1ADD-GLOBALS ++ COMPILER::T3ORDINARY COMPILER::ADD-OBJECT2 COMPILER::SET-TOP ++ COMPILER::T1DEFLA COMPILER::C1FUNCTION COMPILER::T3CLINES ++ COMPILER::T1DEFCFUN COMPILER::C1VREF COMPILER::C1ASH ++ COMPILER::BLK-NAME COMPILER::WT-CADR COMPILER::WT-DOWN ++ COMPILER::C1TERPRI COMPILER::C2GETHASH COMPILER::C2GO-CCB ++ COMPILER::SAVE-FUNOB COMPILER::T2DECLARE COMPILER::FUN-REF-CCB ++ COMPILER::C1MAPCAR COMPILER::T1DEFMACRO ++ COMPILER::C2TAGBODY-LOCAL COMPILER::C1STACK-LET ++ COMPILER::INFO-TYPE COMPILER::T1MACROLET COMPILER::C1LET* ++ COMPILER::C1RPLACD COMPILER::DECLARATION-TYPE ++ COMPILER::T1ORDINARY COMPILER::C2EXPR* COMPILER::C1LOCAL-FUN ++ COMPILER::WT-DATA-PACKAGE-OPERATION ++ COMPILER::C1BOOLE-CONDITION SYSTEM::UNDEF-COMPILER-MACRO ++ COMPILER::C2TAGBODY-BODY COMPILER::C1NTHCDR COMPILER::C1VAR ++ COMPILER::C1MULTIPLE-VALUE-PROG1 COMPILER::C1NTHCDR-CONDITION ++ COMPILER::CONSTANT-FOLD-P COMPILER::C1UNWIND-PROTECT ++ COMPILER::PROCLAMATION COMPILER::C1NTH COMPILER::C1RETURN-FROM ++ COMPILER::INFO-SP-CHANGE COMPILER::C1LENGTH ++ COMPILER::CMP-MACRO-FUNCTION COMPILER::BLK-REF-CLB ++ COMPILER::NAME-TO-SD COMPILER::CTOP-WRITE COMPILER::C1MAPCON ++ COMPILER::C1FUNOB COMPILER::FIX-OPT COMPILER::C1RPLACA-NTHCDR ++ COMPILER::C1FLET COMPILER::RESULT-TYPE COMPILER::C1CATCH ++ COMPILER::C2DM-RESERVE-V COMPILER::VAR-NAME ++ COMPILER::CMP-MACROEXPAND COMPILER::VERIFY-DATA-VECTOR ++ COMPILER::T1CLINES COMPILER::C1MAPL COMPILER::T1DEFENTRY ++ COMPILER::TAG-REF-CCB COMPILER::WT-VS ++ COMPILER::LONG-FLOAT-LOC-P COMPILER::C1MAPCAN ++ COMPILER::OBJECT-TYPE COMPILER::ADD-ADDRESS ++ COMPILER::RESET-INFO-TYPE COMPILER::C1BOOLE3 COMPILER::C1MEMQ ++ COMPILER::C1DEFINE-STRUCTURE COMPILER::TYPE-FILTER ++ COMPILER::UNWIND-NO-EXIT COMPILER::C1FMLA-CONSTANT ++ COMPILER::C2DM-RESERVE-VL COMPILER::C1FSET COMPILER::LTVP-EVAL ++ COMPILER::C1GO COMPILER::WT-VV COMPILER::INFO-CHANGED-ARRAY ++ COMPILER::C1FUNCALL COMPILER::C2TAGBODY-CCB ++ COMPILER::TAG-LABEL COMPILER::VAR-KIND COMPILER::WT-VS* ++ COMPILER::VAR-TYPE COMPILER::C2GO-LOCAL COMPILER::REGISTER ++ COMPILER::T1PROGN COMPILER::C1BLOCK COMPILER::TAG-SWITCH ++ COMPILER::VAR-REP-LOC COMPILER::C2BIND ++ COMPILER::SET-PUSH-CATCH-FRAME COMPILER::COPY-INFO ++ COMPILER::C1LIST-NTH COMPILER::CONS-TO-LISTA ++ COMPILER::FUN-LEVEL COMPILER::C1DOWNWARD-FUNCTION ++ COMPILER::THE-PARAMETER COMPILER::C2VALUES COMPILER::C1LABELS ++ COMPILER::MAXARGS COMPILER::VAR-REF-CCB COMPILER::MDELETE-FILE ++ COMPILER::WT-FUNCTION-LINK COMPILER::SAVE-AVMA ++ COMPILER::VOLATILE COMPILER::ADD-CONSTANT COMPILER::C1APPLY ++ COMPILER::C1GETHASH COMPILER::FUN-NAME COMPILER::DEFAULT-INIT ++ COMPILER::CLINK COMPILER::WT-CDR COMPILER::PARSE-CVSPECS ++ COMPILER::REP-TYPE COMPILER::C2GO-CLB ++ COMPILER::ARGS-CAUSE-SIDE-EFFECT COMPILER::PUSH-DATA-INCF ++ COMPILER::SCH-GLOBAL COMPILER::C1STRUCTURE-SET ++ COMPILER::TAG-NAME COMPILER::INFO-REFERRED-ARRAY ++ COMPILER::C1EXPR COMPILER::C1GET COMPILER::BLK-VAR ++ COMPILER::TAG-REF COMPILER::C1MAPC COMPILER::SET-RETURN ++ COMPILER::SHORT-FLOAT-LOC-P COMPILER::C1DECLARE ++ COMPILER::WT-DATA1 COMPILER::FLAGS-POS ++ COMPILER::BLK-VALUE-TO-GO COMPILER::NAME-SD1 ++ COMPILER::C2DOWNWARD-FUNCTION COMPILER::C1SHARP-COMMA ++ COMPILER::INLINE-POSSIBLE COMPILER::WT-H1 ++ COMPILER::FIXNUM-LOC-P COMPILER::C1LET COMPILER::C1IF ++ COMPILER::C1THE COMPILER::FUNCTION-RETURN-TYPE ++ COMPILER::GET-ARG-TYPES COMPILER::INLINE-TYPE ++ COMPILER::FUN-CFUN COMPILER::TAG-VAR COMPILER::CHARACTER-LOC-P ++ COMPILER::CHECK-DOWNWARD COMPILER::C1PSETQ ++ COMPILER::INLINE-BOOLE3-STRING COMPILER::C1THROW ++ COMPILER::FSET-FN-NAME COMPILER::T1DEFINE-STRUCTURE ++ COMPILER::NEED-TO-SET-VS-POINTERS COMPILER::C1PROGN ++ COMPILER::C2FUNCALL-AUX COMPILER::C1MACROLET COMPILER::C1AND ++ COMPILER::WT-VS-BASE COMPILER::ADD-LOOP-REGISTERS ++ COMPILER::VAR-REGISTER COMPILER::C1PROGV COMPILER::C1SWITCH ++ COMPILER::C1MEMBER COMPILER::C2TAGBODY-CLB ++ COMPILER::CMP-MACROEXPAND-1 COMMON-LISP::PROCLAIM ++ COMPILER::C1ASH-CONDITION COMPILER::C1EVAL-WHEN ++ COMPILER::C1LOCAL-CLOSURE COMPILER::REPLACE-CONSTANT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ COMPILER::INLINE-BOOLE3)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::C2DM COMPILER::C1DM-V COMPILER::C1DM-VL ++ COMPILER::C2RETURN-FROM COMPILER::C2APPLY-OPTIMIZE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::WT-INLINE COMPILER::C2IF COMPILER::C2LABELS ++ COMPILER::C2FLET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMPILER::T3DEFUN-AUX)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ COMPILER::F-TYPE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::STRING) COMMON-LISP::T) ++ COMPILER::DASH-TO-UNDERSCORE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::INIT-NAME COMPILER::ADD-INIT COMPILER::C1LAMBDA-EXPR ++ COMPILER::WT-CVAR COMPILER::C1CASE COMPILER::WT-COMMENT ++ COMPILER::CMPERR COMPILER::WT-INTEGER-LOC COMPILER::CMPNOTE ++ COMPILER::FAST-LINK-PROCLAIMED-TYPE-P COMPILER::UNWIND-EXIT ++ COMPILER::CMPWARN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::C2RETURN-LOCAL COMPILER::C2BLOCK-LOCAL ++ COMPILER::NCONC-FILES COMPILER::C1SYMBOL-FUN COMPILER::C2BLOCK ++ COMPILER::C1BODY COMPILER::COMPILER-BUILD ++ COMPILER::C2DECL-BODY COMPILER::WT-INLINE-LOC)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(COMPILER::CMP-ANON COMMON-LISP::COMPILE COMPILER::CMP-TMP-MACRO ++ COMMON-LISP::DISASSEMBLE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T (COMMON-LISP::VECTOR COMMON-LISP::T) ++ COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM ++ COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::BSEARCHLEQ)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T (COMMON-LISP::VECTOR COMMON-LISP::T) ++ COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PUSH-ARRAY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::AND-FORM-TYPE COMPILER::SET-VAR COMPILER::C2LET* ++ COMPILER::COMPILER-PASS2 COMPILER::ADD-FUNCTION-DECLARATION ++ COMPILER::BOOLE3 COMPILER::C1MAP-FUNCTIONS ++ COMPILER::TOO-MANY-ARGS COMPILER::CHECK-FORM-TYPE ++ COMPILER::C2LET COMPILER::C-FUNCTION-NAME ++ COMPILER::WT-INLINE-SHORT-FLOAT COMPILER::FIX-DOWN-ARGS ++ COMPILER::C2PRINC COMPILER::WT-IF-PROCLAIMED ++ COMPILER::ADD-FAST-LINK COMPILER::C2MULTIPLE-VALUE-BIND ++ COMPILER::C2MAPCAN COMPILER::CJT COMPILER::CHECK-VDECL ++ COMPILER::INLINE-TYPE-MATCHES COMPILER::WT-INLINE-LONG-FLOAT ++ COMPILER::C2GO COMPILER::CAN-BE-REPLACED* COMPILER::MYSUB ++ COMPILER::ASSIGN-DOWN-VARS COMPILER::C2MAPC ++ COMPILER::WT-INLINE-INTEGER COMPILER::GET-INLINE-INFO ++ COMPILER::CJF COMPILER::TOO-FEW-ARGS COMPILER::T3DEFCFUN ++ COMPILER::CMP-EXPAND-MACRO COMPILER::WT-MAKE-CCLOSURE ++ COMPILER::C2FUNCALL-SFUN COMPILER::C1DM ++ COMPILER::WT-INLINE-COND COMPILER::C2TAGBODY ++ COMPILER::WT-INLINE-CHARACTER COMPILER::C2PROGV ++ COMPILER::C2MAPCAR COMPILER::C1STRUCTURE-REF1 COMPILER::C2CASE ++ COMPILER::ADD-FUNCTION-PROCLAMATION ++ COMPILER::MAKE-INLINE-STRING COMPILER::SUBLIS1-INLINE ++ COMPILER::WT-INLINE-FIXNUM)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL COMPILER::LINK ++ COMPILER::INLINE-ARGS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::C2STRUCTURE-REF COMPILER::WT-GLOBAL-ENTRY ++ COMPILER::T3DEFUN-VARARG COMPILER::T3DEFUN-NORMAL ++ COMPILER::C2CALL-GLOBAL COMPILER::C1MAKE-VAR ++ COMPILER::C2CALL-UNKNOWN-GLOBAL COMPILER::C2SWITCH ++ COMPILER::T3INIT-FUN COMPILER::MY-CALL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::DEFSYSFUN COMPILER::T2DEFMACRO COMPILER::T2DEFENTRY ++ COMPILER::T3DEFMACRO COMPILER::T3DEFENTRY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::T2DEFUN COMPILER::C1APPLY-OPTIMIZE COMPILER::T3DEFUN ++ COMPILER::C2STRUCTURE-SET COMPILER::T3DEFUN-LOCAL-ENTRY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::WT-SIMPLE-CALL COMPILER::GET-OUTPUT-PATHNAME)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::T3LOCAL-FUN COMPILER::T3LOCAL-DCFUN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ COMPILER::C2PROGN COMPILER::WT-LONG-FLOAT-LOC COMPILER::C2EXPR ++ COMPILER::WT-FIXNUM-LOC COMPILER::WT-CHARACTER-LOC ++ COMPILER::C2AND COMPILER::T1EXPR COMPILER::CMP-TOPLEVEL-EVAL ++ COMPILER::WT-SHORT-FLOAT-LOC COMPILER::C2OR COMPILER::WT-LOC ++ COMPILER::CMP-EVAL COMPILER::T1EVAL-WHEN COMPILER::SET-LOC ++ COMPILER::VV-STR COMPILER::WT-TO-STRING)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMPILER::MAKE-FUN COMPILER::MAKE-BLK ++ COMMON-LISP::COMPILE-FILE COMPILER::FCALLN-INLINE ++ COMPILER::MAKE-INFO COMPILER::CS-PUSH COMPILER::MAKE-VAR ++ COMPILER::LIST-INLINE COMPILER::C2FSET COMPILER::WT-CLINK ++ COMPILER::COMPILER-COMMAND COMPILER::MAKE-TAG ++ COMPILER::LIST*-INLINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ((COMMON-LISP::VECTOR COMMON-LISP::T)) ++ COMMON-LISP::T) ++ COMPILER::COPY-ARRAY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::C2EXPR-TOP COMPILER::CO1SUBLIS ++ COMPILER::C2CALL-LAMBDA COMPILER::GET-INLINE-LOC ++ COMPILER::CHECK-END COMPILER::C2PSETQ COMPILER::TYPE-AND ++ COMPILER::TYPE>= COMPILER::C2MULTIPLE-VALUE-PROG1 ++ COMPILER::CO1SCHAR SYSTEM::ADD-DEBUG COMPILER::C2BLOCK-CCB ++ COMPILER::C2DM-BIND-VL COMPILER::MAKE-USER-INIT ++ COMPILER::NEED-TO-PROTECT COMPILER::FAST-READ ++ COMPILER::RESULT-TYPE-FROM-ARGS COMPILER::C2BIND-INIT ++ COMPILER::JUMPS-TO-P COMPILER::C2MEMBER!2 ++ COMPILER::C2CALL-LOCAL COMPILER::C2BLOCK-CLB ++ COMPILER::ARGS-INFO-CHANGED-VARS COMPILER::INLINE-PROC ++ COMPILER::C2THROW COMPILER::C1DECL-BODY ++ COMPILER::WT-MAKE-DCLOSURE COMPILER::CO1WRITE-CHAR ++ COMPILER::C1SETQ1 COMPILER::SET-JUMP-FALSE COMPILER::CO1CONS ++ COMPILER::CO1VECTOR-PUSH COMPILER::SET-VS COMPILER::SHIFT>> ++ COMPILER::COERCE-LOC-STRUCTURE-REF COMPILER::WT-FIXNUM-VALUE ++ COMPILER::C2CATCH COMPILER::C2RETURN-CCB COMPILER::MAYBE-EVAL ++ COMPILER::C2ASSOC!2 COMPILER::C2DM-BIND-INIT ++ COMPILER::C2STACK-LET COMPILER::C2LAMBDA-EXPR-WITH-KEY ++ COMPILER::ARGS-INFO-REFERRED-VARS ++ COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::C1PROGN* ++ COMPILER::WT-LONG-FLOAT-VALUE COMPILER::C2MULTIPLE-VALUE-CALL ++ COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::CO1CONSTANT-FOLD ++ COMPILER::C1CONSTANT-VALUE COMPILER::C1EXPR* ++ COMPILER::CO1SPECIAL-FIX-DECL COMPILER::C2RETURN-CLB ++ COMPILER::CMPFIX-ARGS COMPILER::PROCLAIM-VAR COMPILER::C2APPLY ++ COMPILER::DO-MACRO-EXPANSION COMPILER::CFAST-WRITE ++ COMPILER::PRIN1-CMP COMPILER::SHIFT<< COMPILER::WT-REQUIREDS ++ COMPILER::C2EXPR-TOP* COMPILER::UNWIND-BDS ++ COMPILER::MULTIPLE-VALUE-CHECK COMPILER::COERCE-LOC ++ COMPILER::STRUCT-TYPE-OPT COMPILER::CO1READ-CHAR ++ COMPILER::ADD-DEBUG-INFO COMPILER::C2LIST-NTH-IMMEDIATE ++ COMPILER::WT-VAR COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY ++ COMPILER::CHECK-FNAME-ARGS COMPILER::CAN-BE-REPLACED ++ COMPILER::WT-CHARACTER-VALUE COMPILER::C2UNWIND-PROTECT ++ COMPILER::SET-DBIND COMPILER::T3SHARP-COMMA ++ COMPILER::IS-REP-REFERRED COMPILER::C1FMLA ++ COMPILER::WT-V*-MACROS COMPILER::C2DM-BIND-LOC ++ COMPILER::C2BIND-LOC ++ COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES ++ COMPILER::ADD-INFO COMPILER::C2SETQ ++ COMPILER::PUSH-CHANGED-VARS COMPILER::CO1STRUCTURE-PREDICATE ++ COMPILER::SET-BDS-BIND COMPILER::SET-JUMP-TRUE ++ COMPILER::CO1READ-BYTE COMPILER::C1LAMBDA-FUN ++ COMPILER::CO1TYPEP COMPILER::CONVERT-CASE-TO-SWITCH ++ COMPILER::COMPILER-DEF-HOOK COMPILER::CO1LDB COMPILER::C1ARGS ++ COMPILER::CO1WRITE-BYTE COMPILER::CO1EQL ++ COMPILER::COMPILER-CC)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ COMPILER::MLIN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMPILER::COMPILE-FILE1)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ COMPILER::WT-DATA-BEGIN COMPILER::WT-C-PUSH COMPILER::WT-CVARS ++ COMPILER::C1T COMPILER::CVS-PUSH COMPILER::WT-DATA-FILE ++ COMPILER::ADD-LOAD-TIME-SHARP-COMMA ++ COMPILER::CLOSE-INLINE-BLOCKS COMPILER::WT-FASD-DATA-FILE ++ COMPILER::GAZONK-NAME COMPILER::WFS-ERROR ++ COMPILER::WT-NEXT-VAR-ARG COMPILER::WT-FIRST-VAR-ARG ++ COMPILER::C1NIL COMPILER::WT-DATA-END COMPILER::RESET-TOP ++ COMPILER::TAIL-RECURSION-POSSIBLE ++ COMPILER::PRINT-COMPILER-INFO COMPILER::CCB-VS-PUSH ++ COMPILER::BABOON COMPILER::INIT-ENV ++ COMPILER::PRINT-CURRENT-FORM COMPILER::VS-PUSH ++ COMPILER::INC-INLINE-BLOCKS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ COMPILER::MEMOIZED-HASH-EQUAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS1 ++ COMPILER::ANALYZE-REGS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::STRING COMMON-LISP::FIXNUM ++ COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ COMPILER::DASH-TO-UNDERSCORE-INT)) +\ No newline at end of file +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -7569,9 +7569,6 @@ fi + + if test "$enable_ansi" = "yes" ; then + SYSTEM=ansi_gcl +- +-$as_echo "#define ANSI_COMMON_LISP 1" >>confdefs.h +- + CLSTANDARD=ANSI + else + SYSTEM=gcl +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -2112,7 +2112,6 @@ AC_ARG_ENABLE(ansi,[--enable-ansi builds + + if test "$enable_ansi" = "yes" ; then + SYSTEM=ansi_gcl +- AC_DEFINE(ANSI_COMMON_LISP,1,[compile ansi compliant image]) + CLSTANDARD=ANSI + else + SYSTEM=gcl +--- gcl-2.6.12.orig/h/amd64-linux.h ++++ gcl-2.6.12/h/amd64-linux.h +@@ -21,3 +21,4 @@ + #define C_GC_OFFSET 4 + + #define RELOC_H "elf64_i386_reloc.h" ++#define MAX_CODE_ADDRESS (1L<<31)/*large memory model broken gcc 4.8*/ +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -145,8 +145,8 @@ object simple_lispcall(); + object simple_lispcall_no_event(); + object simple_symlispcall(); + object simple_symlispcall_no_event(); +-EXTER object Vevalhook; +-EXTER object Vapplyhook; ++EXTER object siVevalhook; ++EXTER object siVapplyhook; + object ieval(); + object ifuncall(object,int,...); + object ifuncall1(); +@@ -301,13 +301,13 @@ EXTER object sLquote; + + EXTER object sLlambda; + +-EXTER object sLlambda_block; +-EXTER object sLlambda_closure; +-EXTER object sLlambda_block_closure; ++EXTER object sSlambda_block; ++EXTER object sSlambda_closure; ++EXTER object sSlambda_block_closure; + + EXTER object sLfunction; +-EXTER object sLmacro; +-EXTER object sLtag; ++EXTER object sSmacro; ++EXTER object sStag; + EXTER object sLblock; + + +@@ -359,9 +359,6 @@ object shift_integer(); + /* package.d */ + EXTER object lisp_package; + EXTER object user_package; +-#ifdef ANSI_COMMON_LISP +-EXTER object common_lisp_package; +-#endif + EXTER object keyword_package; + EXTER object system_package; + EXTER object sLApackageA; +@@ -565,15 +562,13 @@ EXTER object sSfunction_documentation; + /* typespec.c */ + EXTER object sLcommon,sLnull,sLcons,sLlist,sLsymbol,sLarray,sLvector,sLbit_vector,sLstring; + EXTER object sLsequence,sLsimple_array,sLsimple_vector,sLsimple_bit_vector,sLsimple_string; +-EXTER object sLcompiled_function,sLpathname,sLcharacter,sLnumber,sLrational,sLfloat,sLstring_char; ++EXTER object sLcompiled_function,sLpathname,sLcharacter,sLnumber,sLrational,sLfloat; + EXTER object sLinteger,sLreal,sLratio,sLshort_float,sLstandard_char,sLfixnum,sLpositive_fixnum, sLcomplex; + EXTER object sLsingle_float,sLpackage,sLbignum,sLrandom_state,sLdouble_float,sLstream,sLbit,sLreadtable; + EXTER object sLlong_float,sLhash_table,sLstructure,sLboolean; + EXTER object sLdivision_by_zero,sLfloating_point_inexact,sLfloating_point_invalid_operation; + EXTER object sLfloating_point_overflow,sLfloating_point_underflow; + +-/* #ifdef ANSI_COMMON_LISP */ +-/* new ansi types */ + EXTER object sLarithmetic_error,sLbase_char,sLbase_string,sLbroadcast_stream,sLbuilt_in_class; + EXTER object sLcell_error,sLclass,sLconcatenated_stream,sLcondition,sLcontrol_error; + EXTER object sLecho_stream,sLend_of_file,sLerror,sLextended_char,sLfile_error,sLfile_stream; +@@ -584,7 +579,6 @@ EXTER object sLstandard_generic_function + EXTER object sLstream_error,sLstring_stream,sLstructure_class,sLstyle_warning,sLsynonym_stream; + EXTER object sLtwo_way_stream,sLtype_error,sLunbound_slot,sLunbound_variable,sLundefined_function,sLwarning; + EXTER object sLmethod_combination,sLstructure_object; +-/* #endif */ + + EXTER object sLsatisfies; + EXTER object sLmember; +@@ -595,10 +589,10 @@ EXTER object sLvalues; + EXTER object sLmod; + EXTER object sLsigned_byte; + EXTER object sLunsigned_byte; +-EXTER object sLsigned_char; +-EXTER object sLunsigned_char; +-EXTER object sLsigned_short; +-EXTER object sLunsigned_short; ++EXTER object sSsigned_char; ++EXTER object sSunsigned_char; ++EXTER object sSsigned_short; ++EXTER object sSunsigned_short; + EXTER object sLA; + EXTER object sLplusp; + EXTER object TSor_symbol_string; +--- gcl-2.6.12.orig/h/compdefs.h ++++ gcl-2.6.12/h/compdefs.h +@@ -114,3 +114,4 @@ stp_ordinary + SIGNED_CHAR(x) + FEerror(x,y...) + FEwrong_type_argument(x,y) ++BIT_ENDIAN(x) +--- gcl-2.6.12.orig/h/elf64_i386_reloc.h ++++ gcl-2.6.12/h/elf64_i386_reloc.h +@@ -8,5 +8,6 @@ + add_val(where,~0L,s+a); + break; + case R_X86_64_PC32: ++ massert(ovchks(s+a-p,~MASK(32))); + add_val(where,MASK(32),s+a-p); + break; +--- gcl-2.6.12.orig/h/lu.h ++++ gcl-2.6.12/h/lu.h +@@ -94,12 +94,12 @@ struct symbol { + object s_dbind; + void (*s_sfdef) (); + char *s_self; ++ short s_stype; ++ short s_mflag; + int s_fillp; + object s_gfdef; + object s_plist; + object s_hpack; +- short s_stype; +- short s_mflag; + SPAD; + + }; +@@ -142,6 +142,7 @@ struct hashtable { + int ht_nent; + int ht_size; + short ht_test; ++ short ht_static; + SPAD; + + }; +@@ -152,10 +153,10 @@ struct array { + short a_rank; + short a_elttype; + object *a_self; +- short a_adjustable; +- short a_offset; + int a_dim; + int *a_dims; ++ short a_adjustable; ++ short a_offset; + SPAD; + + }; +@@ -168,8 +169,8 @@ struct vector { + short v_hasfillp; + short v_elttype; + object *v_self; +- int v_fillp; + int v_dim; ++ int v_fillp; + short v_adjustable; + short v_offset; + SPAD; +@@ -181,8 +182,8 @@ struct string { + short st_hasfillp; + short st_adjustable; + char *st_self; +- int st_fillp; + int st_dim; ++ int st_fillp; + }; + + struct ustring { +@@ -191,8 +192,8 @@ struct ustring { + short ust_hasfillp; + short ust_adjustable; + unsigned char *ust_self; +- int ust_fillp; + int ust_dim; ++ int ust_fillp; + }; + + struct bitvector { +@@ -201,8 +202,8 @@ struct bitvector { + short bv_hasfillp; + short bv_elttype; + char *bv_self; +- int bv_fillp; + int bv_dim; ++ int bv_fillp; + short bv_adjustable; + short bv_offset; + SPAD; +@@ -214,10 +215,10 @@ struct fixarray { + short fixa_rank; + short fixa_elttype; + fixnum *fixa_self; +- short fixa_adjustable; +- short fixa_offset; + int fixa_dim; + int *fixa_dims; ++ short fixa_adjustable; ++ short fixa_offset; + SPAD; + }; + +@@ -227,10 +228,10 @@ struct sfarray { + short sfa_rank; + short sfa_elttype; + shortfloat *sfa_self; +- short sfa_adjustable; +- short sfa_offset; + int sfa_dim; + int *sfa_dims; ++ short sfa_adjustable; ++ short sfa_offset; + SPAD; + }; + +@@ -240,10 +241,10 @@ struct lfarray { + short lfa_rank; + short lfa_elttype; + longfloat *lfa_self; +- short lfa_adjustable; +- short lfa_offset; + int lfa_dim; + int *lfa_dims; ++ short lfa_adjustable; ++ short lfa_offset; + SPAD; + }; + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -22,9 +22,6 @@ void segmentation_catcher(); + EXTER int gc_enabled, saving_system; + + EXTER object lisp_package,user_package; +-#ifdef ANSI_COMMON_LISP +-EXTER object common_lisp_package; +-#endif + EXTER char *core_end; + EXTER int catch_fatal; + EXTER long real_maxpage; +@@ -105,6 +102,7 @@ void old(void) \ + #define make_function(a_,b_) make_function_internal(a_,FFN(b_)) + #define make_si_function(a_,b_) make_si_function_internal(a_,FFN(b_)) + #define make_special_form(a_,b_) make_special_form_internal(a_,FFN(b_)) ++#define make_si_special_form(a_,b_) make_si_special_form_internal(a_,FFN(b_)) + #define make_si_sfun(a_,b_,c_) make_si_sfun_internal(a_,FFN(b_),c_) + #define STATD static + #else +@@ -114,6 +112,7 @@ void old(void) \ + #define make_function(a_,b_) make_function_internal(a_,b_) + #define make_si_function(a_,b_) make_si_function_internal(a_,b_) + #define make_special_form(a_,b_) make_special_form_internal(a_,b_) ++#define make_si_special_form(a_,b_) make_si_special_form_internal(a_,b_) + #define make_si_sfun(a_,b_,c_) make_si_sfun_internal(a_,b_,c_) + #define STATD + #endif +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -77,7 +77,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + Definition of the type of LISP objects. + */ + typedef union int_object iobject; +-union int_object {object o; fixnum i;}; ++union int_object {object *o; fixnum i;}; + + #define SMALL_FIXNUM_LIMIT 1024 + +@@ -150,6 +150,12 @@ enum aelttype { /* array element type + #define SET_BV_OFFSET(x,val) ((type_of(x)==t_bitvector ? x->bv.bv_offset = val : \ + type_of(x)== t_array ? x->a.a_offset=val : (abort(),0))) + ++#if !defined(DOUBLE_BIGENDIAN) ++#define BIT_ENDIAN(a_) (7-(a_)) ++#else ++#define BIT_ENDIAN(a_) (a_) ++#endif ++ + + #define S_DATA(x) ((struct s_data *)((x)->str.str_self)) + #define SLOT_TYPE(def,i) (((S_DATA(def))->raw->ust.ust_self[i])) +@@ -304,9 +310,9 @@ EXTER struct typemanager tm_table[ 32 / + /* + Contiguous block header. + */ +-EXTER bool prefer_low_mem_contblock; ++EXTER ufixnum contblock_lim; + struct contblock { /* contiguous block header */ +- int cb_size; /* size in bytes */ ++ ufixnum cb_size; /* size in bytes */ + struct contblock + *cb_link; /* contiguous block link */ + }; +@@ -324,7 +330,6 @@ EXTER struct contblock *old_cb_pointer; + /* + Variables for memory management. + */ +-EXTER long ncb; /* number of contblocks */ + #define ncbpage tm_table[t_contiguous].tm_npage + #define maxcbpage tm_table[t_contiguous].tm_maxpage + #define cbgbccount tm_table[t_contiguous].tm_gbccount +@@ -337,15 +342,12 @@ EXTER long holepage; /* hole pages * + EXTER long new_holepage,starting_hole_div,starting_relb_heap_mult; + + +-#ifdef SGC +-EXTER char *old_rb_start; /* read-only relblock start */ +-#endif + EXTER char *rb_start; /* relblock start */ + EXTER char *rb_end; /* relblock end */ + EXTER char *rb_limit; /* relblock limit */ + EXTER char *rb_pointer; /* relblock pointer */ +-EXTER char *rb_start1; /* relblock start in copy space */ +-EXTER char *rb_pointer1; /* relblock pointer in copy space */ ++/* EXTER char *rb_start1; /\* relblock start in copy space *\/ */ ++/* EXTER char *rb_pointer1; /\* relblock pointer in copy space *\/ */ + + EXTER char *heap_end; /* heap end */ + EXTER char *core_end; /* core end */ +--- gcl-2.6.12.orig/h/page.h ++++ gcl-2.6.12/h/page.h +@@ -21,9 +21,6 @@ + #define PTR_ALIGN SIZEOF_LONG + #endif + +-#define ROUND_UP_PTR(n) (((long)(n) + (PTR_ALIGN-1)) & ~(PTR_ALIGN-1)) +-#define ROUND_DOWN_PTR(n) (((long)(n) & ~(PTR_ALIGN-1))) +- + /* minimum size required for contiguous pointers */ + #if PTR_ALIGN < SIZEOF_CONTBLOCK + #define CPTR_SIZE SIZEOF_CONTBLOCK +@@ -31,9 +28,10 @@ + #define CPTR_SIZE PTR_ALIGN + #endif + +-#define ROUND_UP_PTR_CONT(n) (((long)(n) + (CPTR_SIZE-1)) & ~(CPTR_SIZE-1)) +-#define ROUND_DOWN_PTR_CONT(n) (((long)(n) & ~(CPTR_SIZE-1))) +- ++#define FLR(x,r) (((x))&~(r-1)) ++#define CEI(x,r) FLR((x)+(r-1),r) ++#define PFLR(x,r) ((void *)FLR((ufixnum)x,r)) ++#define PCEI(x,r) ((void *)CEI((ufixnum)x,r)) + + #ifdef SGC + +@@ -47,33 +45,25 @@ + + #define SGC_WRITABLE (SGC_PERM_WRITABLE | SGC_PAGE_FLAG) + +-#define WRITABLE_PAGE_P(p) IS_WRITABLE(p) +-#define ON_WRITABLE_PAGE(x) WRITABLE_PAGE_P(page(x)) +- +-#define IF_WRITABLE(x,if_code) ({if (IS_WRITABLE(page(x))) {if_code;}})/*FIXME maxpage*/ +- +-#define sgc_mark_object(x) IF_WRITABLE(x,if(!is_marked(x)) sgc_mark_object1(x)) +- + /* When not 0, the free lists in the type manager are freelists + on SGC_PAGE's, for those types supporting sgc. + Marking and sweeping is done specially */ + + int sgc_on; + ++#define SGC_WHOLE_PAGE /* disallow old data on sgc pages*/ + ++#ifndef SGC_WHOLE_PAGE + /* for the S field of the FIRSTWORD */ + enum sgc_type { SGC_NORMAL, /* not allocated since the last sgc */ + SGC_RECENT /* allocated since last sgc */ + }; +- ++#define SGC_OR_M(x) (!TYPEWORD_TYPE_P(pageinfo(x)->type) ? pageinfo(x)->sgc_flags&SGC_PAGE_FLAG : ((object)x)->d.s) ++#endif + + #define TM_BASE_TYPE_P(i) (tm_table[i].tm_type == i) + +-/* check if a relblock address is new relblock */ +-#define SGC_RELBLOCK_P(x) ((char *)(x) >= rb_start) +- + /* is this an sgc cell? encompasses all free cells. Used where cell cannot yet be marked */ +-#define SGC_OR_M(x) (!TYPEWORD_TYPE_P(pageinfo(x)->type) ? pageinfo(x)->sgc_flags&SGC_PAGE_FLAG : ((object)x)->d.s) + + #ifndef SIGPROTV + #define SIGPROTV SIGSEGV +@@ -107,28 +97,26 @@ extern fixnum writable_pages; + + #define CLEAR_WRITABLE(i) set_writable(i,0) + #define SET_WRITABLE(i) set_writable(i,1) +-#define IS_WRITABLE(i) is_writable(i) ++#define WRITABLE_PAGE_P(i) is_writable(i) ++#define CACHED_WRITABLE_PAGE_P(i) is_writable_cached(i) ++#define ON_WRITABLE_PAGE(x) WRITABLE_PAGE_P(page(x)) ++#define ON_WRITABLE_PAGE_CACHED(x) CACHED_WRITABLE_PAGE_P(page(x)) ++ + + + EXTER long first_data_page,real_maxpage,phys_pages,available_pages; +-EXTER void *data_start; ++EXTER void *data_start,*initial_sbrk; + + #if !defined(IN_MAIN) && defined(SGC) + #include "writable.h" + #endif + +-#ifdef SGC +-#define REAL_RB_START (sgc_enabled ? old_rb_start : rb_start) +-#else +-#define REAL_RB_START rb_start +-#endif +- + #define CB_BITS CPTR_SIZE*CHAR_SIZE + #define ceil(a_,b_) (((a_)+(b_)-1)/(b_)) + #define npage(m_) ceil(m_,PAGESIZE) + #define cpage(m_) ({ufixnum _m=(m_);ceil(sizeof(struct pageinfo)+_m+2*ceil(_m,(CB_BITS-2)),PAGESIZE);}) + #define mbytes(p_) ceil((p_)*PAGESIZE-sizeof(struct pageinfo),CB_BITS) +-#define tpage(tm_,m_) (tm_->tm_type==t_relocatable ? npage(m_-(rb_limit-rb_pointer)) : (tm_->tm_type==t_contiguous ? cpage(m_) : npage(m_))) ++#define tpage(tm_,m_) (tm_->tm_type==t_relocatable ? npage(m_-(rb_limit-rb_pointer)+1) : (tm_->tm_type==t_contiguous ? cpage(m_) : npage(m_))) + + #define CB_DATA_SIZE(z_) ({fixnum _z=(z_);_z*PAGESIZE-2*mbytes(_z)-sizeof(struct pageinfo);}) + #define CB_MARK_START(pi_) ((void *)(pi_)+sizeof(struct pageinfo)) +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -7,7 +7,7 @@ + /* alloc.c:364:OF */ extern object on_stack_cons (object x, object y); /* (x, y) object x; object y; */ + /* alloc.c:376:OF */ extern object fSallocated (object typ); /* (typ) object typ; */ + /* alloc.c:401:OF */ extern object fSreset_number_used (object typ); /* (typ) object typ; */ +-/* alloc.c:480:OF */ extern void insert_contblock (char *p, int s); /* (p, s) char *p; int s; */ ++/* alloc.c:480:OF */ extern void insert_contblock (void *p, ufixnum s); /* (p, s) char *p; int s; */ + /* alloc.c:480:OF */ extern void insert_maybe_sgc_contblock (char *p, int s); /* (p, s) char *p; int s; */ + /* alloc.c:611:OF */ extern void set_maxpage (void); /* () */ + /* alloc.c:635:OF */ extern void gcl_init_alloc (void *); /* () */ +@@ -124,6 +124,7 @@ struct key {short n,allow_other_keys; + /* cfun.c:299:OF */ extern object make_si_sfun_internal (char *s, object (*f)(), int argd); /* (s, f, argd) char *s; int (*f)(); int argd; */ + /* cfun.c:322:OF */ extern object make_si_function_internal (char *s, void (*f) ()); /* (s, f) char *s; int (*f)(); */ + /* cfun.c:341:OF */ extern object make_special_form_internal (char *s, void (*f)()); /* (s, f) char *s; int (*f)(); */ ++/* cfun.c:341:OF */ extern object make_si_special_form_internal (char *s, void (*f)()); /* (s, f) char *s; int (*f)(); */ + /* cfun.c:352:OF */ extern object fScompiled_function_name (object fun); /* (fun) object fun; */ + /* cfun.c:371:OF */ extern void turbo_closure (object fun); /* (fun) object fun; */ + /* cfun.c:392:OF */ extern object fSturbo_closure (object funobj); /* (funobj) object funobj; */ +@@ -467,7 +468,7 @@ typedef void (*funcvoid)(void); + /* regexp.c:1588:OF */ extern void regerror (char *s); /* (s) char *s; */ + /* regexpr.c:48:OF */ extern object fSmatch_beginning (fixnum i); /* (i) int i; */ + /* regexpr.c:57:OF */ extern object fSmatch_end (fixnum i); /* (i) int i; */ +-/* save.c:17:OF */ extern void Lsave (void); /* () */ ++/* save.c:17:OF */ extern void siLsave (void); /* () */ + #include + /* sbrk.c:9:OF */ /* extern void * sbrk (int n); */ /* (n) int n; */ + /* strcspn.c:3:OF */ /* extern size_t strcspn (const char *s1, const char *s2); */ /* (s1, s2) char *s1; char *s2; */ +@@ -862,9 +863,6 @@ void + Lstandard_char_p(void); + + void +-Lstring_char_p(void); +- +-void + Lchar_code(void); + + void +@@ -955,9 +953,6 @@ void + Lstandard_char_p(void); + + void +-Lstring_char_p(void); +- +-void + Lcharacter(void); + + void +@@ -1405,7 +1400,6 @@ void Lforce_output(void); + void Lnthcdr(void); + void Llogior(void); + void Lchar_downcase(void); +-void Lstring_char_p(void); + void Lstream_element_type(void); + void Lpackage_used_by_list(void); + void Ldivide(void); +@@ -1923,3 +1917,21 @@ rl_stream_p(FILE *f); + + void + sigint(void); ++ ++void ++allocate_code_block_reserve(void); ++ ++inline void ++resize_hole(ufixnum,enum type); ++ ++inline void * ++alloc_contblock_no_gc(size_t); ++ ++inline void ++reset_contblock_freelist(void); ++ ++inline void ++empty_relblock(void); ++ ++fixnum ++check_avail_pages(void); +--- gcl-2.6.12.orig/h/symbol.h ++++ gcl-2.6.12/h/symbol.h +@@ -23,6 +23,6 @@ object sLquote; + + object sLlambda; + +-object sLlambda_block; +-object sLlambda_closure; +-object sLlambda_block_closure; ++object sSlambda_block; ++object sSlambda_closure; ++object sSlambda_block_closure; +--- gcl-2.6.12.orig/h/writable.h ++++ gcl-2.6.12/h/writable.h +@@ -1,11 +1,16 @@ ++EXTER fixnum last_page; ++EXTER int last_result; ++ + EXTER inline int +-set_writable(fixnum i,fixnum m) { ++set_writable(fixnum i,bool m) { + + fixnum j; + object v; + +- if (i=page(core_end)) +- error("out of core in set_writable"); ++ last_page=last_result=0; ++ ++ if (i=page(heap_end)) ++ error("out of heap in set_writable"); + + if ((v=sSAwritableA ? sSAwritableA->s.s_dbind : Cnil)==Cnil) + error("no wrimap in set_writable"); +@@ -16,13 +21,13 @@ set_writable(fixnum i,fixnum m) { + if ((void *)wrimap!=(void *)v->v.v_self) + error("set_writable called in gc"); + ++ writable_pages+=m-((wrimap[j/8]>>(j%8))&0x1); ++ + if (m) + wrimap[j/8]|=(1<<(j%8)); + else + wrimap[j/8]&=~(1<<(j%8)); + +- writable_pages+=m ? 1 : -1; +- + return 0; + + } +@@ -35,13 +40,24 @@ is_writable(fixnum i) { + + if (i=page(core_end)) + return 0; +- ++ + if ((v=sSAwritableA ? sSAwritableA->s.s_dbind : Cnil)==Cnil) + return 1; +- ++ + if ((j=i-first_data_page)<0 || j>=v->v.v_dim) + return 1; +- ++ + return (wrimap[j/8]>>(j%8))&0x1; ++ ++} ++ ++EXTER inline int ++is_writable_cached(fixnum i) { ++ ++ if (last_page==i) ++ return last_result; ++ ++ last_page=i; ++ return last_result=is_writable(i); + + } +--- gcl-2.6.12.orig/info/form.texi ++++ gcl-2.6.12/info/form.texi +@@ -8,18 +8,6 @@ List of all the lambda-list keywords use + + @end defvr + +-@defun GET-SETF-METHOD (form) +-Package:LISP +- +-Returns the five values (or five 'gangs') constituting the SETF method for +-FORM. See the doc of DEFINE-SETF-METHOD for the meanings of the gangs. It +-is an error if the third value (i.e., the list of store variables) is not a +-one-element list. See the doc of GET-SETF-METHOD-MULTIPLE-VALUE for +-comparison. +- +- +-@end defun +- + @deffn {Special Form} THE + Package:LISP + +--- gcl-2.6.12.orig/lsp/gcl_arraylib.lsp ++++ gcl-2.6.12/lsp/gcl_arraylib.lsp +@@ -22,23 +22,7 @@ + ;;;; array routines + + +-(in-package 'lisp) +- +- +-(export '(make-array array-displacement vector +- array-element-type array-rank array-dimension +- array-dimensions +- array-in-bounds-p array-row-major-index +- adjustable-array-p +- bit sbit +- bit-and bit-ior bit-xor bit-eqv bit-nand bit-nor +- bit-andc1 bit-andc2 bit-orc1 bit-orc2 bit-not +- array-has-fill-pointer-p fill-pointer +- vector-push vector-push-extend vector-pop +- adjust-array upgraded-array-element-type)) +- +-(in-package 'system) +- ++(in-package :si) + + (proclaim '(optimize (safety 2) (space 3))) + +@@ -47,7 +31,7 @@ + (or (gethash type *baet-hash*) + (setf (gethash type *baet-hash*) + (if type +- (car (member type '(string-char bit signed-char unsigned-char signed-short unsigned-short ++ (car (member type '(character bit signed-char unsigned-char signed-short unsigned-short + fixnum short-float long-float t) + :test 'subtypep)) t))))) + +--- gcl-2.6.12.orig/lsp/gcl_auto.lsp ++++ gcl-2.6.12/lsp/gcl_auto.lsp +@@ -1,4 +1,4 @@ +-(in-package 'si) ++(in-package :si) + ;;; Autoloaders. + + +--- gcl-2.6.12.orig/lsp/gcl_auto_new.lsp ++++ gcl-2.6.12/lsp/gcl_auto_new.lsp +@@ -1,4 +1,4 @@ +-(in-package 'si) ++(in-package :si) + ;;; Autoloaders. + + +@@ -67,8 +67,7 @@ + (autoload 'ftruncate '|gcl_numlib|) + #-unix (autoload 'get-decoded-time '|gcl_mislib|) + #+aosvs (autoload 'get-universal-time '|gcl_mislib|) +-(autoload 'get-setf-method '|gcl_setf|) +-(autoload 'get-setf-method-multiple-value '|gcl_setf|) ++(autoload 'get-setf-expansion '|gcl_setf|) + (autoload 'inspect '|gcl_describe|) + (autoload 'intersection '|gcl_listlib|) + (autoload 'isqrt '|gcl_numlib|) +--- gcl-2.6.12.orig/lsp/gcl_autoload.lsp ++++ gcl-2.6.12/lsp/gcl_autoload.lsp +@@ -21,8 +21,9 @@ + ;;;; AUTOLOAD + + +-;;; Go into LISP. +-(in-package 'lisp) ++(in-package :si) ++ ++(export '(clines defentry defcfun object void int double)) + + ;(defvar *features*) + +@@ -127,13 +128,13 @@ + + ;;; Allocator. + +-(import 'si::allocate) +-(export '(allocate ++;(import 'si::allocate) ++;(export '(allocate + ;allocated-pages maximum-allocatable-pages + ;allocate-contiguous-pages + ;allocated-contiguous-pages maximum-contiguous-pages + ;allocate-relocatable-pages allocated-relocatable-pages +- sfun gfun cfun cclosure spice structure)) ++; sfun gfun cfun cclosure spice structure)) + + ;(defvar type-character-alist + ; '((cons . #\.) +@@ -279,12 +280,12 @@ + ncbpage maxcbpage (if (zerop cbgbccount) nil cbgbccount) ncb) + (format t "~9T~D~35Thole~%" holepage) + (format t "~8D/~D~19T~6,1F%~@[~8D~]~35Trelocatable~%~%" +- nrbpage maxrbpage (/ rbused 0.01 (+ rbused rbfree)) ++ nrbpage maxrbpage (if (zerop (+ rbused rbfree)) 0.0 (/ rbused 0.01 (+ rbused rbfree))) + (if (zerop rbgbccount) nil rbgbccount)) + (format t "~10D pages for cells~%~%" npage) + (format t "~10D total pages in core~%" (+ npage ncbpage nrbpage)) + (format t "~10D current core maximum pages~%" (+ maxnpage maxcbpage maxrbpage)) +- (format t "~10D pages reserved for gc~%" maxrbpage) ++ (format t "~10D pages reserved for gc~%" nrbpage) + (format t "~10D pages available for adding to core~%" leftpage) + (format t "~10D pages reserved for core exhaustion~%~%" (- maxpage (+ maxnpage maxcbpage (ash maxrbpage 1) leftpage))) + (format t "~10D maximum pages~%" maxpage) +@@ -411,8 +412,8 @@ Good luck! The GCL Development Team" + (setf (get 'with-output-to-string 'si:pretty-print-format) 1) + + +-(in-package 'si) ++(in-package :si) + + (defvar *lib-directory* (namestring (truename "../"))) + +-(import '(*lib-directory* *load-path* *system-directory*) 'si::user) ++(import '(*lib-directory* *load-path* *system-directory*) :user) +--- gcl-2.6.12.orig/lsp/gcl_debug.lsp ++++ gcl-2.6.12/lsp/gcl_debug.lsp +@@ -1,8 +1,8 @@ + ;;Copyright William F. Schelter 1990, All Rights Reserved + + +-(In-package "SYSTEM") +-(import 'sloop::sloop) ++(In-package :si) ++(import '(sloop::sloop)) + + (eval-when (compile eval) + (proclaim '(optimize (safety 2) (space 3))) +@@ -98,7 +98,7 @@ + (cond ((compiled-function-p fun) + (setq name (compiled-function-name fun))) + (t (setq name fun))) +- (if (symbolp name)(setq args (get name 'debug))) ++ (if (symbolp name)(setq args (get name 'debugger))) + (let ((next (ihs-vs (f + 1 *current-ihs*)))) + (cond (next + (format *debug-io* ">> ~a():" name) +@@ -583,7 +583,7 @@ + ;; in other common lisps this should be a string output stream. + + (defvar *display-string* +- (make-array 100 :element-type 'string-char :fill-pointer 0 :adjustable t)) ++ (make-array 100 :element-type 'character :fill-pointer 0 :adjustable t)) + + (defun display-env (n env) + (do ((v (reverse env) (cdr v))) +@@ -625,7 +625,7 @@ + (mv-values nil j)) + (let + ((na (ihs-fname j))) +- (cond ((special-form-p na)) ++ (cond ((special-operator-p na)) + ((get na 'dbl-invisible)) + ((fboundp na)(return (mv-values na j))))))) + +@@ -677,7 +677,7 @@ + (vs (1+ k)) + (vs (+ k 2))) + ))))))) +- ((special-form-p na) nil) ++ ((special-operator-p na) nil) + ((get na 'dbl-invisible)) + ((fboundp na) + (mv-values i na nil nil +@@ -717,7 +717,7 @@ + (end (min (ihs-vs (1+ ihs)) (vs-top)))) + (format *display-string* "") + (do ((i base ) +- (v (get (ihs-fname ihs) 'debug) (cdr v))) ++ (v (get (ihs-fname ihs) 'debugger) (cdr v))) + ((or (fb >= i end)(fb > (fill-pointer *display-string*) plength))) + (format *display-string* "~a~@[~d~]=~s~@[,~]" + (or (car v) 'loc) (if (not (car v)) (f - i base)) (vs i) +--- gcl-2.6.12.orig/lsp/gcl_defmacro.lsp ++++ gcl-2.6.12/lsp/gcl_defmacro.lsp +@@ -22,11 +22,7 @@ + ;;;; defines SI:DEFMACRO*, the defmacro preprocessor + + +-(in-package 'lisp) +-(export '(&whole &environment &body)) +- +- +-(in-package 'system) ++(in-package :si) + + + (eval-when (compile) (proclaim '(optimize (safety 2) (space 3)))) +--- gcl-2.6.12.orig/lsp/gcl_defstruct.lsp ++++ gcl-2.6.12/lsp/gcl_defstruct.lsp +@@ -22,21 +22,13 @@ + ;;;; The structure routines. + + +-(in-package 'lisp) +-(export 'defstruct) +- +- +-(in-package 'system) ++(in-package :si) + + + (proclaim '(optimize (safety 2) (space 3))) + + + +-;(in-package 'system) +- +- +- + (defvar *accessors* (make-array 10 :adjustable t)) + (defvar *list-accessors* (make-array 2 :adjustable t)) + (defvar *vector-accessors* (make-array 2 :adjustable t)) +@@ -99,7 +91,10 @@ + (setq dont-overwrite t) + ) + (t (setf (get access-function 'structure-access) +- (cons (if type type name) offset))))))) ++ (cons (if type type name) offset)) ++ (when slot-type ++ (proclaim `(ftype (function (,name) ,slot-type) ,access-function))) ++ ))))) + nil)) + + +@@ -504,7 +499,7 @@ + ;bootstrapping code! + (setq def (make-s-data-structure + (make-array (* leng (size-of t)) +- :element-type 'string-char :static t) ++ :element-type 'character :static t) + (make-t-type leng nil slot-descriptions) + *standard-slot-positions* + slot-descriptions +@@ -569,9 +564,7 @@ + (setf (symbol-function predicate) + #'(lambda (x) + (si::structure-subtype-p x name)))) +- (setf (get predicate 'compiler::co1) +- 'compiler::co1structure-predicate) +- (setf (get predicate 'struct-predicate) name) ++ (proclaim `(ftype (function (,name) t) ,predicate));FIXME boolean is unboxed + ) + ) nil) + +--- gcl-2.6.12.orig/lsp/gcl_describe.lsp ++++ gcl-2.6.12/lsp/gcl_describe.lsp +@@ -22,12 +22,7 @@ + ;;;; DESCRIBE and INSPECT + + +-(in-package 'lisp) +- +-(export '(describe inspect)) +- +- +-(in-package 'system) ++(in-package :si) + + + (proclaim '(optimize (safety 2) (space 3))) +@@ -191,7 +186,6 @@ + (defun inspect-character (character) + (format t + (cond ((standard-char-p character) "~S - standard character") +- ((string-char-p character) "~S - string character") + (t "~S - character")) + character) + (inspect-print "code: #x~X" (char-code character)) +@@ -353,7 +347,7 @@ + (find-package "SYSTEM") + *package*))) + +- (cond ((special-form-p symbol) ++ (cond ((special-operator-p symbol) + (doc1 (or (documentation symbol 'function) "") + (if (macro-function symbol) + "[Special form and Macro]" +--- gcl-2.6.12.orig/lsp/gcl_destructuring_bind.lsp ++++ gcl-2.6.12/lsp/gcl_destructuring_bind.lsp +@@ -8,9 +8,7 @@ + ;;; in DEFMACRO are the reason this isn't as easy as it sounds. + ;;; + +-(in-package 'lisp) +- +-(export '(destructuring-bind)) ++(in-package :si) + + (defvar *arg-tests* () + "A list of tests that do argument counting at expansion time.") +--- gcl-2.6.12.orig/lsp/gcl_doc-file.lsp ++++ gcl-2.6.12/lsp/gcl_doc-file.lsp +@@ -13,7 +13,7 @@ + for w in-package v + when (setq doc (documentation w 'function)) + do (format st "F~a~%~ain ~a package:~a" w +- (cond ((special-form-p w) "Special Form ") ++ (cond ((special-operator-p w) "Special Form ") + ((functionp w) "Function ") + ((macro-function w) "Macro ") + (t "")) +--- gcl-2.6.12.orig/lsp/gcl_evalmacros.lsp ++++ gcl-2.6.12/lsp/gcl_evalmacros.lsp +@@ -20,11 +20,7 @@ + ;;;; evalmacros.lsp + + +-(in-package "LISP") +- +-(export '(defvar defparameter defconstant)) +- +-(in-package "SYSTEM") ++(in-package :si) + + + (eval-when (compile) (proclaim '(optimize (safety 2) (space 3)))) +--- gcl-2.6.12.orig/lsp/gcl_export.lsp ++++ gcl-2.6.12/lsp/gcl_export.lsp +@@ -21,313 +21,468 @@ + ;;;; + ;;;; Exporting external symbols of LISP package + +- +-(in-package 'lisp) +- ++(in-package :common-lisp) + + (export '( +- +-&whole +-&environment +-&body +-* +-** +-*** +-*break-enable* +-*break-on-warnings* +-*features* +-*modules* +-+ +-++ +-+++ +-- +-/ +-// +-/// +-COMMON +-KYOTO +-KCL +-abs +-acos +-acosh +-adjust-array +-adjustable-array-p +-apropos +-apropos-list +-array-dimension +-array-dimensions +-array-element-type +-array-has-fill-pointer-p +-array-in-bounds-p +-array-rank +-array-row-major-index +-asin +-asinh +-assert +-atanh +-bit +-bit-and +-bit-andc1 +-bit-andc2 +-bit-eqv +-bit-ior +-bit-nand +-bit-nor +-bit-not +-bit-orc1 +-bit-orc2 +-bit-xor +-break +-byte +-byte-position +-byte-size +-ccase +-cerror +-check-type +-cis +-coerce +-compile +-compile-file +-concatenate +-cosh +-count +-count-if +-count-if-not +-ctypecase +-decf +-declaim +-decode-universal-time +-defconstant +-define-modify-macro +-define-setf-method +-defparameter +-defsetf +-defstruct +-deftype +-defvar +-delete +-delete-duplicates +-delete-if +-delete-if-not +-deposit-field +-describe +-disassemble +-do* +-do-all-symbols +-do-external-symbols +-do-symbols +-documentation +-dolist +-dotimes +-dpb +-dribble +-ecase +-ed +-eighth +-encode-universal-time +-error +-etypecase +-eval-when +-every +-fceiling +-ffloor +-fifth +-fill +-fill-pointer +-find +-find-all-symbols +-find-if +-find-if-not +-first +-format +-fourth +-fround +-ftruncate +-get-decoded-time +-get-setf-method +-get-setf-method-multiple-value +-get-universal-time +-getf +-ignore +-ignorable +-incf +-inspect +-intersection +-isqrt +-ldb +-ldb-test +-lisp-implementation-type +-logandc1 +-logandc2 +-lognand +-lognor +-lognot +-logorc1 +-logorc2 +-logtest +-long-site-name +-machine-instance +-machine-type +-machine-version +-make-array +-make-sequence +-map +-mask-field +-merge +-mismatch +-mod +-multiple-value-setq +-nintersection +-ninth +-notany +-notevery +-nset-difference +-nset-exclusive-or +-nsubstitute +-nsubstitute-if +-nsubstitute-if-not +-nunion +-phase +-pop +-position +-position-if +-position-if-not +-prin1-to-string +-princ-to-string +-prog* +-provide +-psetf +-push +-pushnew +-rational +-rationalize +-real +-read-from-string +-reduce +-rem +-remf +-remove +-remove-duplicates +-remove-if +-remove-if-not +-replace +-require +-rotatef +-room +-sbit +-search +-second +-set-difference +-set-exclusive-or +-setf +-seventh +-shiftf +-short-site-name +-signum +-sinh +-sixth +-software-type +-software-version +-some +-sort +-stable-sort +-step +-structure +-subsetp +-substitute +-substitute-if +-substitute-if-not +-subtypep +-tanh +-tenth +-third +-time +-trace +-type +-typecase +-typep +-union +-untrace +-variable +-vector +-vector-pop +-vector-push +-vector-push-extend +-warn +-with-input-from-string +-with-open-file +-with-open-stream +-with-output-to-string +-write-to-string +-y-or-n-p +-yes-or-no-p +- +-proclaim +-proclamation +-special +-type +-ftype +-function +-inline +-notinline +-ignore +-optimize +-speed +-space +-safety +-compilation-speed +-declaration +- +-*eval-when-compile* +- +-clines +-defcfun +-defentry +-defla +- +-void +-object +-char +-int +-float +-double +- +-define-compiler-macro +-compiler-macro +-compiler-macro-function +- +-with-compilation-unit +-with-standard-io-syntax +-*print-lines* +-*print-miser-width* +-*print-pprint-dispatch* +-*print-right-margin* +- +-*read-eval* +- +-dynamic-extent +- +-loop +-check-type assert typecase etypecase ctypecase case ecase ccase +- +-restart-bind restart-case with-condition-restarts muffle-warning continue abort +- store-value use-value +- restart restart-name restart-function restart-report-function +- restart-interactive-function restart-test-function +- compute-restarts find-restart invoke-restart invoke-restart-interactively +- with-simple-restart signal +- +-simple-condition simple-error simple-warning invoke-debugger *debugger-hook* *break-on-signals* +- +-handler-case handler-bind ignore-errors define-condition make-condition +- condition warning serious-condition simple-condition-format-control simple-condition-format-arguments +- storage-condition stack-overflow storage-exhausted type-error +- type-error-datum type-error-expected-type simple-type-error +- program-error control-error stream-error stream-error-stream +- end-of-file file-error file-error-pathname cell-error cell-error-name +- unbound-variable undefined-function arithmetic-error +- arithmetic-error-operation arithmetic-error-operands +- package-error package-error-package +- division-by-zero floating-point-overflow floating-point-underflow +- +-)) ++ &allow-other-keys *print-miser-width* ++ &aux *print-pprint-dispatch* ++ &body *print-pretty* ++ &environment *print-radix* ++ &key *print-readably* ++ &optional *print-right-margin* ++ &rest *query-io* ++ &whole *random-state* ++ * *read-base* ++ ** *read-default-float-format* ++ *** *read-eval* ++ *break-on-signals* *read-suppress* ++ *compile-file-pathname* *readtable* ++ *compile-file-truename* *standard-input* ++ *compile-print* *standard-output* ++ *compile-verbose* *terminal-io* ++ *debug-io* *trace-output* ++ *debugger-hook* + ++ *default-pathname-defaults* ++ ++ *error-output* +++ ++ *features* - ++ *gensym-counter* / ++ *load-pathname* // ++ *load-print* /// ++ *load-truename* /= ++ *load-verbose* 1+ ++ *macroexpand-hook* 1- ++ *modules* < ++ *package* <= ++ *print-array* = ++ *print-base* > ++ *print-case* >= ++ *print-circle* abort ++ *print-escape* abs ++ *print-gensym* acons ++ *print-length* acos ++ *print-level* acosh ++ *print-lines* add-method ++ ++ adjoin atom boundp ++ adjust-array base-char break ++ adjustable-array-p base-string broadcast-stream ++ allocate-instance bignum broadcast-stream-streams ++ alpha-char-p bit built-in-class ++ alphanumericp bit-and butlast ++ and bit-andc1 byte ++ append bit-andc2 byte-position ++ apply bit-eqv byte-size ++ apropos bit-ior caaaar ++ apropos-list bit-nand caaadr ++ aref bit-nor caaar ++ arithmetic-error bit-not caadar ++ arithmetic-error-operands bit-orc1 caaddr ++ arithmetic-error-operation bit-orc2 caadr ++ array bit-vector caar ++ array-dimension bit-vector-p cadaar ++ array-dimension-limit bit-xor cadadr ++ array-dimensions block cadar ++ array-displacement boole caddar ++ array-element-type boole-1 cadddr ++ array-has-fill-pointer-p boole-2 caddr ++ array-in-bounds-p boole-and cadr ++ array-rank boole-andc1 call-arguments-limit ++ array-rank-limit boole-andc2 call-method ++ array-row-major-index boole-c1 call-next-method ++ array-total-size boole-c2 car ++ array-total-size-limit boole-clr case ++ arrayp boole-eqv catch ++ ash boole-ior ccase ++ asin boole-nand cdaaar ++ asinh boole-nor cdaadr ++ assert boole-orc1 cdaar ++ assoc boole-orc2 cdadar ++ assoc-if boole-set cdaddr ++ assoc-if-not boole-xor cdadr ++ atan boolean cdar ++ atanh both-case-p cddaar ++ ++ cddadr clear-input copy-tree ++ cddar clear-output cos ++ cdddar close cosh ++ cddddr clrhash count ++ cdddr code-char count-if ++ cddr coerce count-if-not ++ cdr compilation-speed ctypecase ++ ceiling compile debug ++ cell-error compile-file decf ++ cell-error-name compile-file-pathname declaim ++ cerror compiled-function declaration ++ change-class compiled-function-p declare ++ char compiler-macro decode-float ++ char-code compiler-macro-function decode-universal-time ++ char-code-limit complement defclass ++ char-downcase complex defconstant ++ char-equal complexp defgeneric ++ char-greaterp compute-applicable-methods define-compiler-macro ++ char-int compute-restarts define-condition ++ char-lessp concatenate define-method-combination ++ char-name concatenated-stream define-modify-macro ++ char-not-equal concatenated-stream-streams define-setf-expander ++ char-not-greaterp cond define-symbol-macro ++ char-not-lessp condition defmacro ++ char-upcase conjugate defmethod ++ char/= cons defpackage ++ char< consp defparameter ++ char<= constantly defsetf ++ char= constantp defstruct ++ char> continue deftype ++ char>= control-error defun ++ character copy-alist defvar ++ characterp copy-list delete ++ check-type copy-pprint-dispatch delete-duplicates ++ cis copy-readtable delete-file ++ class copy-seq delete-if ++ class-name copy-structure delete-if-not ++ class-of copy-symbol delete-package ++ ++ denominator eq ++ deposit-field eql ++ describe equal ++ describe-object equalp ++ destructuring-bind error ++ digit-char etypecase ++ digit-char-p eval ++ directory eval-when ++ directory-namestring evenp ++ disassemble every ++ division-by-zero exp ++ do export ++ do* expt ++ do-all-symbols extended-char ++ do-external-symbols fboundp ++ do-symbols fceiling ++ documentation fdefinition ++ dolist ffloor ++ dotimes fifth ++ double-float file-author ++ double-float-epsilon file-error ++ double-float-negative-epsilon file-error-pathname ++ dpb file-length ++ dribble file-namestring ++ dynamic-extent file-position ++ ecase file-stream ++ echo-stream file-string-length ++ echo-stream-input-stream file-write-date ++ echo-stream-output-stream fill ++ ed fill-pointer ++ eighth find ++ elt find-all-symbols ++ encode-universal-time find-class ++ end-of-file find-if ++ endp find-if-not ++ enough-namestring find-method ++ ensure-directories-exist find-package ++ ensure-generic-function find-restart ++ ++ find-symbol get-internal-run-time ++ finish-output get-macro-character ++ first get-output-stream-string ++ fixnum get-properties ++ flet get-setf-expansion ++ float get-universal-time ++ float-digits getf ++ float-precision gethash ++ float-radix go ++ float-sign graphic-char-p ++ floating-point-inexact handler-bind ++ floating-point-invalid-operation handler-case ++ floating-point-overflow hash-table ++ floating-point-underflow hash-table-count ++ floatp hash-table-p ++ floor hash-table-rehash-size ++ fmakunbound hash-table-rehash-threshold ++ force-output hash-table-size ++ format hash-table-test ++ formatter host-namestring ++ fourth identity ++ fresh-line if ++ fround ignorable ++ ftruncate ignore ++ ftype ignore-errors ++ funcall imagpart ++ function import ++ function-keywords in-package ++ function-lambda-expression incf ++ functionp initialize-instance ++ gcd inline ++ generic-function input-stream-p ++ gensym inspect ++ gentemp integer ++ get integer-decode-float ++ get-decoded-time integer-length ++ get-dispatch-macro-character integerp ++ get-internal-real-time interactive-stream-p ++ ++ intern lisp-implementation-type ++ internal-time-units-per-second lisp-implementation-version ++ intersection list ++ invalid-method-error list* ++ invoke-debugger list-all-packages ++ invoke-restart list-length ++ invoke-restart-interactively listen ++ isqrt listp ++ keyword load ++ keywordp load-logical-pathname-translations ++ labels load-time-value ++ lambda locally ++ lambda-list-keywords log ++ lambda-parameters-limit logand ++ last logandc1 ++ lcm logandc2 ++ ldb logbitp ++ ldb-test logcount ++ ldiff logeqv ++ least-negative-double-float logical-pathname ++ least-negative-long-float logical-pathname-translations ++ least-negative-normalized-double-float logior ++ least-negative-normalized-long-float lognand ++ least-negative-normalized-short-float lognor ++ least-negative-normalized-single-float lognot ++ least-negative-short-float logorc1 ++ least-negative-single-float logorc2 ++ least-positive-double-float logtest ++ least-positive-long-float logxor ++ least-positive-normalized-double-float long-float ++ least-positive-normalized-long-float long-float-epsilon ++ least-positive-normalized-short-float long-float-negative-epsilon ++ least-positive-normalized-single-float long-site-name ++ least-positive-short-float loop ++ least-positive-single-float loop-finish ++ length lower-case-p ++ let machine-instance ++ let* machine-type ++ ++ machine-version mask-field ++ macro-function max ++ macroexpand member ++ macroexpand-1 member-if ++ macrolet member-if-not ++ make-array merge ++ make-broadcast-stream merge-pathnames ++ make-concatenated-stream method ++ make-condition method-combination ++ make-dispatch-macro-character method-combination-error ++ make-echo-stream method-qualifiers ++ make-hash-table min ++ make-instance minusp ++ make-instances-obsolete mismatch ++ make-list mod ++ make-load-form most-negative-double-float ++ make-load-form-saving-slots most-negative-fixnum ++ make-method most-negative-long-float ++ make-package most-negative-short-float ++ make-pathname most-negative-single-float ++ make-random-state most-positive-double-float ++ make-sequence most-positive-fixnum ++ make-string most-positive-long-float ++ make-string-input-stream most-positive-short-float ++ make-string-output-stream most-positive-single-float ++ make-symbol muffle-warning ++ make-synonym-stream multiple-value-bind ++ make-two-way-stream multiple-value-call ++ makunbound multiple-value-list ++ map multiple-value-prog1 ++ map-into multiple-value-setq ++ mapc multiple-values-limit ++ mapcan name-char ++ mapcar namestring ++ mapcon nbutlast ++ maphash nconc ++ mapl next-method-p ++ maplist nil ++ ++ nintersection package-error ++ ninth package-error-package ++ no-applicable-method package-name ++ no-next-method package-nicknames ++ not package-shadowing-symbols ++ notany package-use-list ++ notevery package-used-by-list ++ notinline packagep ++ nreconc pairlis ++ nreverse parse-error ++ nset-difference parse-integer ++ nset-exclusive-or parse-namestring ++ nstring-capitalize pathname ++ nstring-downcase pathname-device ++ nstring-upcase pathname-directory ++ nsublis pathname-host ++ nsubst pathname-match-p ++ nsubst-if pathname-name ++ nsubst-if-not pathname-type ++ nsubstitute pathname-version ++ nsubstitute-if pathnamep ++ nsubstitute-if-not peek-char ++ nth phase ++ nth-value pi ++ nthcdr plusp ++ null pop ++ number position ++ numberp position-if ++ numerator position-if-not ++ nunion pprint ++ oddp pprint-dispatch ++ open pprint-exit-if-list-exhausted ++ open-stream-p pprint-fill ++ optimize pprint-indent ++ or pprint-linear ++ otherwise pprint-logical-block ++ output-stream-p pprint-newline ++ package pprint-pop ++ ++ pprint-tab read-char ++ pprint-tabular read-char-no-hang ++ prin1 read-delimited-list ++ prin1-to-string read-from-string ++ princ read-line ++ princ-to-string read-preserving-whitespace ++ print read-sequence ++ print-not-readable reader-error ++ print-not-readable-object readtable ++ print-object readtable-case ++ print-unreadable-object readtablep ++ probe-file real ++ proclaim realp ++ prog realpart ++ prog* reduce ++ prog1 reinitialize-instance ++ prog2 rem ++ progn remf ++ program-error remhash ++ progv remove ++ provide remove-duplicates ++ psetf remove-if ++ psetq remove-if-not ++ push remove-method ++ pushnew remprop ++ quote rename-file ++ random rename-package ++ random-state replace ++ random-state-p require ++ rassoc rest ++ rassoc-if restart ++ rassoc-if-not restart-bind ++ ratio restart-case ++ rational restart-name ++ rationalize return ++ rationalp return-from ++ read revappend ++ read-byte reverse ++ ++ room simple-bit-vector ++ rotatef simple-bit-vector-p ++ round simple-condition ++ row-major-aref simple-condition-format-arguments ++ rplaca simple-condition-format-control ++ rplacd simple-error ++ safety simple-string ++ satisfies simple-string-p ++ sbit simple-type-error ++ scale-float simple-vector ++ schar simple-vector-p ++ search simple-warning ++ second sin ++ sequence single-float ++ serious-condition single-float-epsilon ++ set single-float-negative-epsilon ++ set-difference sinh ++ set-dispatch-macro-character sixth ++ set-exclusive-or sleep ++ set-macro-character slot-boundp ++ set-pprint-dispatch slot-exists-p ++ set-syntax-from-char slot-makunbound ++ setf slot-missing ++ setq slot-unbound ++ seventh slot-value ++ shadow software-type ++ shadowing-import software-version ++ shared-initialize some ++ shiftf sort ++ short-float space ++ short-float-epsilon special ++ short-float-negative-epsilon special-operator-p ++ short-site-name speed ++ signal sqrt ++ signed-byte stable-sort ++ signum standard ++ simple-array standard-char ++ simple-base-string standard-char-p ++ ++ standard-class sublis ++ standard-generic-function subseq ++ standard-method subsetp ++ standard-object subst ++ step subst-if ++ storage-condition subst-if-not ++ store-value substitute ++ stream substitute-if ++ stream-element-type substitute-if-not ++ stream-error subtypep ++ stream-error-stream svref ++ stream-external-format sxhash ++ streamp symbol ++ string symbol-function ++ string-capitalize symbol-macrolet ++ string-downcase symbol-name ++ string-equal symbol-package ++ string-greaterp symbol-plist ++ string-left-trim symbol-value ++ string-lessp symbolp ++ string-not-equal synonym-stream ++ string-not-greaterp synonym-stream-symbol ++ string-not-lessp t ++ string-right-trim tagbody ++ string-stream tailp ++ string-trim tan ++ string-upcase tanh ++ string/= tenth ++ string< terpri ++ string<= the ++ string= third ++ string> throw ++ string>= time ++ stringp trace ++ structure translate-logical-pathname ++ structure-class translate-pathname ++ structure-object tree-equal ++ style-warning truename ++ ++ truncate values-list ++ two-way-stream variable ++ two-way-stream-input-stream vector ++ two-way-stream-output-stream vector-pop ++ type vector-push ++ type-error vector-push-extend ++ type-error-datum vectorp ++ type-error-expected-type warn ++ type-of warning ++ typecase when ++ typep wild-pathname-p ++ unbound-slot with-accessors ++ unbound-slot-instance with-compilation-unit ++ unbound-variable with-condition-restarts ++ undefined-function with-hash-table-iterator ++ unexport with-input-from-string ++ unintern with-open-file ++ union with-open-stream ++ unless with-output-to-string ++ unread-char with-package-iterator ++ unsigned-byte with-simple-restart ++ untrace with-slots ++ unuse-package with-standard-io-syntax ++ unwind-protect write ++ update-instance-for-different-class write-byte ++ update-instance-for-redefined-class write-char ++ upgraded-array-element-type write-line ++ upgraded-complex-part-type write-sequence ++ upper-case-p write-string ++ use-package write-to-string ++ use-value y-or-n-p ++ user-homedir-pathname yes-or-no-p ++ values zerop)) +--- gcl-2.6.12.orig/lsp/gcl_fpe.lsp ++++ gcl-2.6.12/lsp/gcl_fpe.lsp +@@ -1,8 +1,8 @@ +-(in-package :fpe :use '(:lisp)) ++(in-package :fpe) + + (import 'si::(disassemble-instruction feenableexcept fedisableexcept fld *fixnum *float *double + +fe-list+ +mc-context-offsets+ floating-point-error +- function-by-address)) ++ function-by-address clines defentry)) + (export '(break-on-floating-point-exceptions read-instruction)) + + (eval-when +--- gcl-2.6.12.orig/lsp/gcl_info.lsp ++++ gcl-2.6.12/lsp/gcl_info.lsp +@@ -1,4 +1,4 @@ +-(in-package "SI" ) ++(in-package :si) + + (eval-when (compile eval) + (defmacro while (test &body body) +@@ -11,7 +11,7 @@ + (eval-when (compile eval load) + (defun sharp-u-reader (stream subchar arg) + subchar arg +- (let ((tem (make-array 10 :element-type 'string-char :fill-pointer 0))) ++ (let ((tem (make-array 10 :element-type 'character :fill-pointer 0))) + (or (eql (read-char stream) #\") + (error "sharp-u-reader reader needs a \" right after it")) + (loop +@@ -44,7 +44,7 @@ + (or (and (<= 0 start ) (<= start len)) + (error "illegal file start ~a" start)) + (let ((tem (make-array (- len start) +- :element-type 'string-char))) ++ :element-type 'character))) + (if (> start 0) (file-position st start)) + (si::fread tem 0 (length tem) st) tem))) + +@@ -105,7 +105,7 @@ + ((> extra 0) + (setq tem + (make-array (f + (length x) extra) +- :element-type 'string-char :fill-pointer 0)) ++ :element-type 'character :fill-pointer 0)) + (setq i 0) + (go AGAIN)) + (t (setq tem x))) +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -22,21 +22,7 @@ + ;;;; The IO library. + + +-(in-package 'lisp) +- +- +-(export '(with-open-stream with-input-from-string with-output-to-string +- ensure-directories-exist wild-pathname-p +- read-byte write-byte read-sequence write-sequence)) +-(export '(read-from-string)) +-(export '(write-to-string prin1-to-string princ-to-string)) +-(export 'with-open-file) +-(export '(y-or-n-p yes-or-no-p)) +-(export 'dribble) +- +- +-(in-package 'system) +- ++(in-package :si) + + (proclaim '(optimize (safety 2) (space 3))) + +--- gcl-2.6.12.orig/lsp/gcl_listlib.lsp ++++ gcl-2.6.12/lsp/gcl_listlib.lsp +@@ -25,13 +25,7 @@ + ; rather than recursion, as needed for large data sets. + + +-(in-package 'lisp) +- +-(export '(union nunion intersection nintersection +- set-difference nset-difference set-exclusive-or nset-exclusive-or +- subsetp nth nth-value nthcdr first second third fourth fifth sixth seventh eighth ninth tenth)) +- +-(in-package 'system) ++(in-package :si) + + (eval-when (compile) + (proclaim '(optimize (safety 0) (space 3))) +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -20,15 +20,7 @@ + ;;;; This file is IMPLEMENTATION-DEPENDENT. + + +-(in-package 'lisp) +- +- +-(export 'time) +-(export '(reset-sys-paths decode-universal-time encode-universal-time compile-file-pathname complement constantly)) +- +- +-(in-package 'system) +- ++(in-package :si) + + (proclaim '(optimize (safety 2) (space 3))) + +@@ -37,13 +29,13 @@ + (let ((real-start (gensym)) (real-end (gensym)) (gbc-time-start (gensym)) + (gbc-time (gensym)) (x (gensym)) (run-start (gensym)) (run-end (gensym)) + (child-run-start (gensym)) (child-run-end (gensym))) +- `(let (,real-start ,real-end (,gbc-time-start (si::gbc-time)) ,gbc-time ,x) ++ `(let (,real-start ,real-end (,gbc-time-start (gbc-time)) ,gbc-time ,x) + (setq ,real-start (get-internal-real-time)) + (multiple-value-bind (,run-start ,child-run-start) (get-internal-run-time) +- (si::gbc-time 0) ++ (gbc-time 0) + (setq ,x (multiple-value-list ,form)) +- (setq ,gbc-time (si::gbc-time)) +- (si::gbc-time (+ ,gbc-time-start ,gbc-time)) ++ (setq ,gbc-time (gbc-time)) ++ (gbc-time (+ ,gbc-time-start ,gbc-time)) + (multiple-value-bind (,run-end ,child-run-end) (get-internal-run-time) + (setq ,real-end (get-internal-real-time)) + (fresh-line *trace-output*) +@@ -139,7 +131,7 @@ x)) + *gcl-major-version* *gcl-minor-version* *gcl-extra-version* + (if (member :ansi-cl *features*) "ANSI" "CLtL1") + (if (member :gprof *features*) "profiling" "") +- (si::gcl-compile-time) ++ (gcl-compile-time) + "Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)" + "Binary License: " + (if gpled-modules (format nil "GPL due to GPL'ed components: ~a" gpled-modules) +@@ -150,13 +142,13 @@ x)) + + (defun lisp-implementation-version nil + (format nil "GCL ~a.~a.~a" +- si::*gcl-major-version* +- si::*gcl-minor-version* +- si::*gcl-extra-version*)) ++ *gcl-major-version* ++ *gcl-minor-version* ++ *gcl-extra-version*)) + + (defun objlt (x y) + (declare (object x y)) +- (let ((x (si::address x)) (y (si::address y))) ++ (let ((x (address x)) (y (address y))) + (declare (fixnum x y)) + (if (< y 0) + (if (< x 0) (< x y) t) +@@ -164,10 +156,10 @@ x)) + + (defun reset-sys-paths (s) + (declare (string s)) +- (setq si::*lib-directory* s) +- (setq si::*system-directory* (si::string-concatenate s "unixport/")) ++ (setq *lib-directory* s) ++ (setq *system-directory* (string-concatenate s "unixport/")) + (let (nl) + (dolist (l '("cmpnew/" "gcl-tk/" "lsp/" "xgcl-2/")) +- (push (si::string-concatenate s l) nl)) +- (setq si::*load-path* nl)) ++ (push (string-concatenate s l) nl)) ++ (setq *load-path* nl)) + nil) +--- gcl-2.6.12.orig/lsp/gcl_module.lsp ++++ gcl-2.6.12/lsp/gcl_module.lsp +@@ -22,13 +22,7 @@ + ;;;; module routines + + +-(in-package 'lisp) +- +-(export '(*modules* provide require)) +-(export 'documentation) +-(export '(variable function structure type setf)) +- +-(in-package 'system) ++(in-package :si) + + + (eval-when (compile) (proclaim '(optimize (safety 2) (space 3)))) +--- gcl-2.6.12.orig/lsp/gcl_numlib.lsp ++++ gcl-2.6.12/lsp/gcl_numlib.lsp +@@ -22,20 +22,7 @@ + ;;;; number routines + + +-(in-package 'lisp) +-(export +- '(isqrt abs phase signum cis asin acos sinh cosh tanh +- asinh acosh atanh +- rational rationalize +- ffloor fround ftruncate fceiling +- lognand lognor logandc1 logandc2 logorc1 logorc2 +- lognot logtest +- byte byte-size byte-position +- ldb ldb-test mask-field dpb deposit-field +- )) +- +- +-(in-package 'system) ++(in-package :si) + + + (proclaim '(optimize (safety 2) (space 3))) +--- gcl-2.6.12.orig/lsp/gcl_packlib.lsp ++++ gcl-2.6.12/lsp/gcl_packlib.lsp +@@ -22,14 +22,7 @@ + ;;;; package routines + + +-(in-package 'lisp) +- +- +-(export '(find-all-symbols do-symbols do-external-symbols do-all-symbols with-package-iterator)) +-(export '(apropos apropos-list)) +- +- +-(in-package 'system) ++(in-package :si) + + + (proclaim '(optimize (safety 2) (space 3))) +@@ -121,7 +114,7 @@ + (defun print-symbol-apropos (symbol) + (prin1 symbol) + (when (fboundp symbol) +- (if (special-form-p symbol) ++ (if (special-operator-p symbol) + (princ " Special form") + (if (macro-function symbol) + (princ " Macro") +--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp ++++ gcl-2.6.12/lsp/gcl_predlib.lsp +@@ -22,9 +22,7 @@ + ;;;; predicate routines + + +-(in-package 'system) +- +-(export '(lisp::deftype lisp::typep lisp::subtypep lisp::coerce) 'lisp) ++(in-package :si) + + (eval-when (compile) + (proclaim '(optimize (safety 2) (space 3))) +@@ -87,7 +85,7 @@ + (deftype vector (&optional element-type size) + `(array ,element-type (,size))) + (deftype string (&optional size) +- `(vector string-char ,size)) ++ `(vector character ,size)) + (deftype base-string (&optional size) + `(vector base-char ,size)) + (deftype bit-vector (&optional size) +@@ -96,7 +94,7 @@ + (deftype simple-vector (&optional size) + `(simple-array t (,size))) + (deftype simple-string (&optional size) +- `(simple-array string-char (,size))) ++ `(simple-array character (,size))) + (deftype simple-base-string (&optional size) + `(simple-array base-char (,size))) + (deftype simple-bit-vector (&optional size) +@@ -206,8 +204,8 @@ + (ratio (eq (type-of object) 'ratio)) + (standard-char + (and (characterp object) (standard-char-p object))) +- ((base-char string-char) +- (and (characterp object) (string-char-p object))) ++ ((base-char character) ++ (characterp object)) + (integer + (and (integerp object) (in-interval-p object i))) + (rational +@@ -309,7 +307,7 @@ + signed-char unsigned-char signed-short unsigned-short + number integer bignum rational ratio float method-combination + short-float single-float double-float long-float complex +- character standard-char string-char real ++ character standard-char character real + package stream pathname readtable hash-table random-state + structure array simple-array function compiled-function + arithmetic-error base-char base-string broadcast-stream +@@ -583,23 +581,23 @@ + (if (sub-interval-p '(* *) i2) (values t t) (values nil t))) + (t (values nil ntp2)))) + (standard-char +- (if (member t2 '(base-char string-char character)) ++ (if (member t2 '(base-char character character)) + (values t t) + (values nil ntp2))) + (base-char +- (if (member t2 '(character string-char)) ++ (if (member t2 '(character character)) + (values t t) + (values nil ntp2))) + (extended-char +- (if (member t2 '(character string-char)) ++ (if (member t2 '(character character)) + (values t t) + (values nil ntp2))) +- (string-char ++ (character + (if (eq t2 'character) + (values t t) + (values nil ntp2))) + (character +- (if (eq t2 'string-char) ++ (if (eq t2 'character) + (values t t) + (values nil ntp2))) + (integer +@@ -635,7 +633,7 @@ + (unless (or (equal (car i1) (car i2)) + ; FIXME + (and (eq (car i1) 'base-char) +- (eq (car i2) 'string-char))) ++ (eq (car i2) 'character))) + ;; Unless the element type matches, + ;; return NIL T. + ;; Is this too strict? +@@ -658,7 +656,7 @@ + (unless (or (equal (car i1) (car i2)) + ; FIXME + (and (eq (car i1) 'base-char) +- (eq (car i2) 'string-char))) ++ (eq (car i2) 'character))) + (return-from subtypep + (values nil t))))) + (when (or (endp (cdr i1)) (eq (cadr i1) '*)) +--- gcl-2.6.12.orig/lsp/gcl_profile.lsp ++++ gcl-2.6.12/lsp/gcl_profile.lsp +@@ -1,5 +1,5 @@ + +-(in-package 'si) ++(in-package :si) + (use-package "SLOOP") + + ;; Sample Usage: +--- gcl-2.6.12.orig/lsp/gcl_seq.lsp ++++ gcl-2.6.12/lsp/gcl_seq.lsp +@@ -22,11 +22,7 @@ + ;;;; sequence routines + + +-(in-package 'lisp) +- +-(export '(make-sequence concatenate map some every notany notevery)) +- +-(in-package 'system) ++(in-package :si) + + + (proclaim '(optimize (safety 2) (space 3))) +@@ -40,7 +36,7 @@ + (if iesp + (make-list size :initial-element initial-element) + (make-list size)))) +- ((or (eq type 'simple-string) (eq type 'string)) 'string-char) ++ ((or (eq type 'simple-string) (eq type 'string)) 'character) + ((or (eq type 'simple-bit-vector) (eq type 'bit-vector)) 'bit) + ((or (eq type 'simple-vector) (eq type 'vector)) t) + (t +--- gcl-2.6.12.orig/lsp/gcl_seqlib.lsp ++++ gcl-2.6.12/lsp/gcl_seqlib.lsp +@@ -22,24 +22,7 @@ + ;;;; sequence routines + + +-(in-package 'lisp) +- +- +-(export '(reduce fill replace +- remove remove-if remove-if-not +- delete delete-if delete-if-not +- count count-if count-if-not +- substitute substitute-if substitute-if-not +- nsubstitute nsubstitute-if nsubstitute-if-not +- find find-if find-if-not +- position position-if position-if-not +- remove-duplicates delete-duplicates +- mismatch search +- with-hash-table-iterator +- sort stable-sort merge map-into)) +- +- +-(in-package 'system) ++(in-package :si) + + + (proclaim '(optimize (safety 2) (space 3))) +--- gcl-2.6.12.orig/lsp/gcl_serror.lsp ++++ gcl-2.6.12/lsp/gcl_serror.lsp +@@ -100,6 +100,8 @@ + args)))) + ("unknown error"))) + ++(defvar *break-on-warnings* nil) ++ + (defun warn (datum &rest arguments) + (declare (optimize (safety 2))) + (let ((c (process-error datum arguments 'simple-warning))) +--- gcl-2.6.12.orig/lsp/gcl_setf.lsp ++++ gcl-2.6.12/lsp/gcl_setf.lsp +@@ -22,16 +22,7 @@ + ;;;; setf routines + + +-(in-package 'lisp) +- +- +-(export '(setf psetf shiftf rotatef +- define-modify-macro defsetf +- getf remf incf decf push pushnew pop +- define-setf-method get-setf-method get-setf-method-multiple-value)) +- +- +-(in-package 'system) ++(in-package :si) + + + (eval-when (compile) (proclaim '(optimize (safety 2) (space 3)))) +@@ -86,10 +77,10 @@ + ',access-fn)) + + +-;;; GET-SETF-METHOD. ++;;; GET-SETF-EXPANSION. + ;;; It just calls GET-SETF-METHOD-MULTIPLE-VALUE + ;;; and checks the number of the store variable. +-(defun get-setf-method (form &optional env) ++(defun get-setf-expansion (form &optional env) + (multiple-value-bind (vars vals stores store-form access-form) + (get-setf-method-multiple-value form env) + (unless (= (list-length stores) 1) +@@ -218,7 +209,7 @@ + + (define-setf-method getf (&environment env place indicator &optional default) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method place env) ++ (get-setf-expansion place env) + (let ((itemp (gensym)) (store (gensym))) + (values `(,@vars ,itemp) + `(,@vals ,indicator) +@@ -234,7 +225,7 @@ + + (define-setf-method the (&environment env type form) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method form env) ++ (get-setf-expansion form env) + (let ((store (gensym))) + (values vars vals (list store) + `(let ((,(car stores) (the ,type ,store))) ,store-form) +@@ -246,7 +237,7 @@ + (null (cddr fn))) + (error "Can't get the setf-method of ~S." fn)) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method (cons (cadr fn) rest) env) ++ (get-setf-expansion (cons (cadr fn) rest) env) + (unless (eq (car (last store-form)) (car (last vars))) + (error "Can't get the setf-method of ~S." fn)) + (values vars vals stores +@@ -261,7 +252,7 @@ + (null (cddr fn))) + (error "Can't get the setf-method of ~S." fn)) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method (cons (cadr fn) rest) env) ++ (get-setf-expansion (cons (cadr fn) rest) env) + (cond ((eq (car (last store-form)) (car (last vars))) + (values vars vals stores + `(apply #',(car store-form) ,@(cdr store-form)) +@@ -277,7 +268,7 @@ + + (define-setf-method char-bit (&environment env char name) + (multiple-value-bind (temps vals stores store-form access-form) +- (get-setf-method char env) ++ (get-setf-expansion char env) + (let ((ntemp (gensym)) + (store (gensym)) + (stemp (first stores))) +@@ -290,7 +281,7 @@ + + (define-setf-method ldb (&environment env bytespec int) + (multiple-value-bind (temps vals stores store-form access-form) +- (get-setf-method int env) ++ (get-setf-expansion int env) + (let ((btemp (gensym)) + (store (gensym)) + (stemp (first stores))) +@@ -303,7 +294,7 @@ + + (define-setf-method mask-field (&environment env bytespec int) + (multiple-value-bind (temps vals stores store-form access-form) +- (get-setf-method int env) ++ (get-setf-expansion int env) + (let ((btemp (gensym)) + (store (gensym)) + (stemp (first stores))) +@@ -346,7 +337,7 @@ + (setf-structure-access (cadr place) (car g) (cdr g) newvalue)))) + + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method place env) ++ (get-setf-expansion place env) + (declare (ignore access-form)) + `(let* ,(mapcar #'list + (append vars stores) +@@ -397,7 +388,7 @@ + nil)) + (when (endp (cdr r)) (error "~S is an illegal PSETF form." rest)) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method (car r) env) ++ (get-setf-expansion (car r) env) + (declare (ignore access-form)) + (setq store-forms (cons store-form store-forms)) + (setq pairs +@@ -426,7 +417,7 @@ + ,@store-forms + ,g)) + (multiple-value-bind (vars vals stores1 store-form access-form) +- (get-setf-method (car r) env) ++ (get-setf-expansion (car r) env) + (setq pairs (nconc pairs (mapcar #'list vars vals))) + (setq stores (cons (car stores1) stores)) + (setq store-forms (cons store-form store-forms)) +@@ -451,7 +442,7 @@ + nil + )) + (multiple-value-bind (vars vals stores1 store-form access-form) +- (get-setf-method (car r) env) ++ (get-setf-expansion (car r) env) + (setq pairs (nconc pairs (mapcar #'list vars vals))) + (setq stores (cons (car stores1) stores)) + (setq store-forms (cons store-form store-forms)) +@@ -480,7 +471,7 @@ + (let ((access-form reference)) + (list 'setq reference ,update-form)))) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method reference env) ++ (get-setf-expansion reference env) + (list 'let* + (mapcar #'list + (append vars stores) +@@ -492,7 +483,7 @@ + + (defmacro remf (&environment env place indicator) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method place env) ++ (get-setf-expansion place env) + `(let* ,(mapcar #'list vars vals) + (multiple-value-bind (,(car stores) flag) + (si:rem-f ,access-form ,indicator) +@@ -508,7 +499,7 @@ + (return-from push `(let* ((,myitem ,item)) + (setq ,place (cons ,myitem ,place))))) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method place env) ++ (get-setf-expansion place env) + `(let* ,(mapcar #'list + (append (list myitem) vars stores) + (append (list item) vals (list (list 'cons myitem access-form)))) +@@ -520,7 +511,7 @@ + (return-from pushnew `(let* ((,myitem ,item)) + (setq ,place (adjoin ,myitem ,place ,@rest)))))) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method place env) ++ (get-setf-expansion place env) + `(let* ,(mapcar #'list + (append (list myitem) vars stores) + (append (list item) vals +@@ -535,7 +526,7 @@ + (setq ,place (cdr ,place)) + ,temp)))) + (multiple-value-bind (vars vals stores store-form access-form) +- (get-setf-method place env) ++ (get-setf-expansion place env) + `(let* ,(mapcar #'list + (append vars stores) + (append vals (list (list 'cdr access-form)))) +--- gcl-2.6.12.orig/lsp/gcl_sloop.lsp ++++ gcl-2.6.12/lsp/gcl_sloop.lsp +@@ -71,7 +71,7 @@ + ;;; some other package. + + +-(in-package "SLOOP" :use '(LISP)) ++(in-package "SLOOP" :use '(:LISP)) + (eval-when (compile eval load) + + (export '(loop-return sloop def-loop-collect def-loop-map +--- gcl-2.6.12.orig/lsp/gcl_stack-problem.lsp ++++ gcl-2.6.12/lsp/gcl_stack-problem.lsp +@@ -1,4 +1,4 @@ +-(in-package 'si) ++(in-package :si) + + (defvar *old-handler* #'si::universal-error-handler) + +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -24,24 +24,14 @@ + ;;;; Revised on July 11, by Carl Hoffman. + + +-(in-package "LISP") +-;(export 'lisp) +-(export '(+ ++ +++ - * ** *** / // ///)) +-(export '(break warn)) +-(export '*break-on-warnings*) +-(export '*break-enable*) +- +-(in-package 'system) ++(in-package :si) + + (export '*break-readtable*) + (export '(loc *debug-print-level*)) + + (export '(vs ihs-vs ihs-fun frs-vs frs-bds frs-ihs bds-var bds-val super-go)) + +-(eval-when +- (compile) +- (proclaim '(optimize (safety 2) (space 3))) +- (defvar *command-args* nil)) ++(defvar *command-args* nil) + + (defvar +) + (defvar ++) +@@ -75,8 +65,6 @@ + (defvar *break-enable* t) + (defvar *break-message* "") + +-(defvar *break-on-warnings* nil) +- + (defvar *break-readtable* nil) + + (defvar *top-level-hook* nil) +@@ -330,7 +318,7 @@ + (lambda-block-closure (cddddr fun)) + (t (cond + ((and (symbolp (car fun)) +- (or (special-form-p(car fun)) ++ (or (special-operator-p(car fun)) + (fboundp (car fun)))) + (car fun)) + (t '(:zombi)))))) +@@ -384,7 +372,7 @@ + (lambda-block-closure (nth 4 fun)) + (lambda-closure 'lambda-closure) + (t (if (and (symbolp (car fun)) +- (or (special-form-p (car fun)) ++ (or (special-operator-p (car fun)) + (fboundp (car fun)))) + (car fun) :zombi) + ))) +--- gcl-2.6.12.orig/lsp/gcl_trace.lsp ++++ gcl-2.6.12/lsp/gcl_trace.lsp +@@ -27,13 +27,7 @@ + ;; If you are working in another package you should (import 'si::arglist) + ;; to avoid typing the si:: + +-(in-package 'lisp) +- +-(export '(trace untrace)) +-(export 'step) +- +- +-(in-package 'system) ++(in-package :si) + + ;;(proclaim '(optimize (safety 2) (space 3))) + +@@ -169,7 +163,7 @@ + (when (null (fboundp fname)) + (format *trace-output* "The function ~S is not defined.~%" fname) + (return-from trace-one nil)) +- (when (special-form-p fname) ++ (when (special-operator-p fname) + (format *trace-output* "~S is a special form.~%" fname) + (return-from trace-one nil)) + (when (macro-function fname) +--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp ++++ gcl-2.6.12/lsp/sys-proclaim.lisp +@@ -1,294 +1,522 @@ + +-(IN-PACKAGE "SYSTEM") +-(MAPC (LAMBDA (COMPILER::X) +- (SETF (GET COMPILER::X 'PROCLAIMED-CLOSURE) T)) +- '(SI-CLASS-PRECEDENCE-LIST BREAK-ON-FLOATING-POINT-EXCEPTIONS +- SI-FIND-CLASS AUTOLOAD SI-CLASS-NAME TRACE-ONE SI-CLASSP +- SIMPLE-CONDITION-CLASS-P CONDITIONP MAKE-ACCESS-FUNCTION +- UNTRACE-ONE WARNINGP DEFINE-STRUCTURE CONDITION-CLASS-P +- SI-CLASS-OF AUTOLOAD-MACRO)) +-(PROCLAIM '(FTYPE (FUNCTION (T) (VALUES T T)) LISP::MAKE-KEYWORD)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) T) S-DATA-HAS-HOLES CONSTANTLY +- COMPUTING-ARGS-P ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS +- ANSI-LOOP::LOOP-COLLECTOR-NAME FIRST INSPECT-SYMBOL +- CONTEXT-P ANSI-LOOP::LOOP-MAKE-PSETQ TENTH +- COMPILER-MACRO-FUNCTION ANSI-LOOP::LOOP-COLLECTOR-DATA +- ARRAY-DIMENSIONS ASINH FPE::XMM-LOOKUP KNOWN-TYPE-P +- CONTEXT-VEC CONTEXT-HASH SHOW-ENVIRONMENT +- CHECK-DECLARATIONS BKPT-FILE-LINE PROVIDE +- ANSI-LOOP::LOOP-PATH-P DWIM RESTART-P FPE::LOOKUP ACOSH +- PRINT-SYMBOL-APROPOS SIGNUM ANSI-LOOP::LOOP-UNIVERSE-ANSI +- IHS-NOT-INTERPRETED-ENV BYTE-SIZE THIRD RESTART-FUNCTION +- ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS DO-F +- ANSI-LOOP::LOOP-EMIT-BODY COSH S-DATA-CONC-NAME +- INSTREAM-STREAM-NAME PATCH-SHARP INSPECT-STRING +- S-DATA-INCLUDES SHOW-BREAK-POINT FPE::GREF +- FIND-KCL-TOP-RESTART RESTART-REPORT-FUNCTION S-DATA-NAMED +- S-DATA-CONSTRUCTORS S-DATA-P SLOOP::PARSE-LOOP +- INSPECT-STRUCTURE BKPT-FORM PHASE SETUP-INFO +- ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS +- RESET-TRACE-DECLARATIONS SLOOP::SLOOP-SLOOP-MACRO EIGHTH +- SECOND SLOOP::TRANSLATE-NAME +- ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE NINTH +- ANSI-LOOP::LOOP-COLLECTOR-P MAKE-KCL-TOP-RESTART +- SEARCH-STACK ANSI-LOOP::LOOP-COLLECTOR-DTYPE ACOS +- ANSI-LOOP::LOOP-MAXMIN-COLLECTION MAKE-DEFPACKAGE-FORM +- INSPECT-NUMBER SINH ANSI-LOOP::LOOP-HACK-ITERATION +- INSTREAM-STREAM WALK-THROUGH PRINT-IHS SIXTH S-DATA-FROZEN +- INSPECT-CHARACTER SLOOP::RETURN-SLOOP-MACRO +- FREEZE-DEFSTRUCT NEXT-STACK-FRAME +- SLOOP::LOOP-COLLECT-KEYWORD-P DM-BAD-KEY +- COMPILE-FILE-PATHNAME SEVENTH +- ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD +- SLOOP::PARSE-LOOP-INITIALLY TERMINAL-INTERRUPT +- ANSI-LOOP::LOOP-EMIT-FINAL-VALUE FRS-KIND CHECK-TRACE-SPEC +- CONTEXT-SPICE ANSI-LOOP::DESTRUCTURING-SIZE +- ANSI-LOOP::LOOP-MINIMAX-OPERATIONS INSPECT-VECTOR ATANH +- ANSI-LOOP::LOOP-PATH-NAMES S-DATA-OFFSET +- SLOOP::REPEAT-SLOOP-MACRO FIND-ALL-SYMBOLS +- ANSI-LOOP::LOOP-PATH-FUNCTION REWRITE-RESTART-CASE-CLAUSE +- ANSI-LOOP::LOOP-COLLECTOR-CLASS +- RESTART-INTERACTIVE-FUNCTION DM-KEY-NOT-ALLOWED +- INSPECT-PACKAGE S-DATA-PRINT-FUNCTION NODE-OFFSET +- RESTART-NAME RATIONAL NORMALIZE-TYPE +- SLOOP::SUBSTITUTE-SLOOP-BODY FIFTH INFO-GET-TAGS S-DATA-RAW +- RE-QUOTE-STRING SHORT-NAME LOGNOT INSPECT-ARRAY +- TRACE-ONE-PREPROCESS SIMPLE-ARRAY-P FIND-DOCUMENTATION +- BKPT-FUNCTION ANSI-LOOP::LOOP-PATH-USER-DATA EVAL-FEATURE +- ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA ABS S-DATA-STATICP +- ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE INSERT-BREAK-POINT +- S-DATA-DOCUMENTATION PRINT-FRS IHS-VISIBLE GET-INSTREAM +- INFO-GET-FILE GET-NEXT-VISIBLE-FUN DBL-EVAL FOURTH +- ANSI-LOOP::LOOP-COLLECTOR-HISTORY BYTE-POSITION +- ANSI-LOOP::LOOP-TYPED-INIT ASIN +- ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS FIX-LOAD-PATH BKPT-FILE +- VECTOR-POP IDESCRIBE UNIQUE-ID +- ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS +- ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED +- SLOOP::POINTER-FOR-COLLECT FPE::ST-LOOKUP +- ANSI-LOOP::LOOP-CONSTANTP ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS +- ADD-TO-HOTLIST ANSI-LOOP::LOOP-DO-THEREIS +- ANSI-LOOP::LOOP-LIST-COLLECTION S-DATA-TYPE +- SLOOP::LOOP-LET-BINDINGS +- ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED +- BREAK-FORWARD-SEARCH-STACK ISQRT S-DATA-SLOT-POSITION +- BREAK-BACKWARD-SEARCH-STACK +- ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE RESTART-TEST-FUNCTION +- INVOKE-DEBUGGER SLOOP::PARSE-NO-BODY +- ANSI-LOOP::LOOP-MAKE-DESETQ +- ANSI-LOOP::LOOP-CONSTRUCT-RETURN COMPLEMENT +- ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS TANH INSTREAM-P +- NODES-FROM-INDEX ANSI-LOOP::LOOP-PSEUDO-BODY +- S-DATA-INCLUDED ANSI-LOOP::LOOP-MINIMAX-TYPE +- NUMBER-OF-DAYS-FROM-1900 INFO-NODE-FROM-POSITION +- ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE +- ANSI-LOOP::LOOP-MINIMAX-P BEST-ARRAY-ELEMENT-TYPE +- S-DATA-NAME SLOOP::AVERAGING-SLOOP-MACRO +- ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS CIS SEQTYPE +- LEAP-YEAR-P GET-BYTE-STREAM-NCHARS IHS-FNAME +- ANSI-LOOP::LOOP-UNIVERSE-P INSPECT-CONS +- S-DATA-SLOT-DESCRIPTIONS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (*) *) INFO-ERROR BREAK-PREVIOUS BREAK-NEXT +- CONTINUE BREAK-LOCAL SHOW-BREAK-VARIABLES BREAK-BDS +- MUFFLE-WARNING DBL-BACKTRACE ANSI-LOOP::LOOP-OPTIONAL-TYPE +- IHS-BACKTRACE BREAK-QUIT BREAK-VS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (FIXNUM) FIXNUM) FPE::FE-ENABLE DBL-WHAT-FRAME)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) FIXNUM) INSTREAM-LINE FPE::REG-LOOKUP +- S-DATA-SIZE S-DATA-LENGTH THE-START)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM) T) PUSH-CONTEXT GET-CONTEXT)) +-(PROCLAIM '(FTYPE (FUNCTION (STRING FIXNUM) FIXNUM) ATOI)) +-(PROCLAIM +- '(FTYPE (FUNCTION (*) T) ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE +- MAYBE-CLEAR-INPUT ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL +- DRIBBLE ANSI-LOOP::MAKE-LOOP-COLLECTOR +- ANSI-LOOP::MAKE-LOOP-UNIVERSE Y-OR-N-P COMPUTE-RESTARTS +- DESCRIBE-ENVIRONMENT TRANSFORM-KEYWORDS +- SLOOP::PARSE-LOOP-DECLARE MAKE-RESTART MAKE-INSTREAM +- ANSI-LOOP::LOOP-GENTEMP DBL-READ LOC CURRENT-STEP-FUN +- VECTOR YES-OR-NO-P BREAK +- ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL STEP-INTO MAKE-CONTEXT +- ANSI-LOOP::MAKE-LOOP-PATH MAKE-S-DATA BREAK-LOCALS ABORT +- SLOOP::PARSE-LOOP-WITH STEP-NEXT)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) *) PRINC-TO-STRING GET-&ENVIRONMENT DESCRIBE +- INSPECT ANSI-LOOP::NAMED-VARIABLE WAITING +- ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES PRIN1-TO-STRING +- BREAK-LEVEL-INVOKE-RESTART END-WAITING +- ANSI-LOOP::LOOP-LIST-STEP ALOAD INSTREAM-NAME +- INVOKE-RESTART-INTERACTIVELY FIND-DECLARATIONS BREAK-GO +- INSPECT-OBJECT INFO-SUBFILE)) +-(PROCLAIM '(FTYPE (FUNCTION (T FIXNUM T T) T) BIGNTHCDR)) +-(PROCLAIM '(FTYPE (FUNCTION (T FIXNUM FIXNUM T T) T) QUICK-SORT)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T) *) SHARP-S-READER SHARP---READER +- ANSI-LOOP::LOOP-GET-COLLECTION-INFO SHARP-+-READER +- LIST-MERGE-SORT LISP::VERIFY-KEYWORDS READ-INSPECT-COMMAND +- RESTART-PRINT)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T *) *) REDUCE SUBTYPEP SORT +- SLOOP::FIND-IN-ORDERED-LIST STABLE-SORT LISP::PARSE-BODY)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T *) *) LISP::PARSE-DEFMACRO-LAMBDA-LIST +- LISP::PARSE-DEFMACRO)) +-(PROCLAIM '(FTYPE (FUNCTION (T T T *) *) MASET)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T T T) *) LISP::PUSH-OPTIONAL-BINDING)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T *) *) DECODE-UNIVERSAL-TIME STEPPER USE-VALUE +- FROUND INFO SHOW-INFO INVOKE-RESTART FCEILING +- PARSE-BODY-HEADER ENSURE-DIRECTORIES-EXIST PRINT-DOC +- APROPOS-DOC WRITE-TO-STRING FFLOOR NLOAD BREAK-FUNCTION +- REQUIRE APROPOS GET-SETF-METHOD APROPOS-LIST +- ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE STORE-VALUE +- GET-SETF-METHOD-MULTIPLE-VALUE READ-FROM-STRING +- WILD-PATHNAME-P FTRUNCATE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) T) QUOTATION-READER +- SLOOP::IN-PACKAGE-SLOOP-MAP SLOOP::NEVER-SLOOP-COLLECT +- MATCH-DIMENSIONS OBJLT ANSI-LOOP::LOOP-TEQUAL DBL-UP +- GET-INFO-CHOICES NTHCDR ANSI-LOOP::LOOP-DECLARE-VARIABLE +- ANSI-LOOP::MAKE-LOOP-MINIMAX LDB +- OVERWRITE-SLOT-DESCRIPTIONS GET-LINE-OF-FORM DOCUMENTATION +- DM-NTH ANSI-LOOP::LOOP-LOOKUP-KEYWORD DM-NTH-CDR +- SLOOP::=-SLOOP-FOR LIST-DELQ SET-DIR LOGANDC2 +- SLOOP::IN-FRINGE-SLOOP-MAP DISPLAY-COMPILED-ENV SET-BACK +- SLOOP::LOGXOR-SLOOP-COLLECT LEFT-PARENTHESIS-READER +- ANSI-LOOP::LOOP-DO-IF FPE::%-READER LDB-TEST +- COMPILER::COMPILER-DEF-HOOK BYTE +- SLOOP::IN-CAREFULLY-SLOOP-FOR INCREMENT-CURSOR +- IN-INTERVAL-P LISP::LOOKUP-KEYWORD SUPER-GO WRITE-BYTE +- ANSI-LOOP::LOOP-DO-WHILE READ-INSTRUCTION LOGANDC1 +- SLOOP::THEREIS-SLOOP-COLLECT COERCE-TO-STRING LOGORC2 +- SEQUENCE-CURSOR LOGNOR FPE::READ-OPERANDS +- SLOOP::MAXIMIZE-SLOOP-COLLECT ALL-MATCHES +- SLOOP::IN-TABLE-SLOOP-MAP SLOOP::COLLATE-SLOOP-COLLECT +- CHECK-SEQ-START-END BREAK-STEP-NEXT FPE::RF +- SLOOP::PARSE-LOOP-MAP VECTOR-PUSH FPE::PAREN-READER +- FPE::0-READER ANSI-LOOP::LOOP-TASSOC SETF-HELPER +- SETF-EXPAND SLOOP::MINIMIZE-SLOOP-COLLECT ADD-FILE LOGORC1 +- SLOOP::COUNT-SLOOP-COLLECT SLOOP::MAKE-VALUE +- PARSE-SLOT-DESCRIPTION SLOOP::DESETQ1 +- ANSI-LOOP::LOOP-DO-ALWAYS SLOOP::L-EQUAL GET-MATCH +- SLOOP::SUM-SLOOP-COLLECT DM-V BREAK-STEP-INTO LOGNAND NTH +- SUBSTRINGP INFO-AUX SUB-INTERVAL-P *BREAK-POINTS* SAFE-EVAL +- ANSI-LOOP::HIDE-VARIABLE-REFERENCES COERCE +- ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION CONDITION-PASS +- GET-NODES ANSI-LOOP::LOOP-TMEMBER +- SLOOP::ALWAYS-SLOOP-COLLECT DISPLAY-ENV SLOOP::THE-TYPE +- ANSI-LOOP::LOOP-MAYBE-BIND-FORM ITERATE-OVER-BKPTS LOGTEST +- LISP::KEYWORD-SUPPLIED-P)) +-(PROCLAIM '(FTYPE (FUNCTION (T T T T T T T) *) TRACE-CALL)) +-(PROCLAIM +- '(FTYPE (FUNCTION NIL *) GCL-TOP-LEVEL SIMPLE-BACKTRACE +- BREAK-CURRENT BREAK-MESSAGE ANSI-LOOP::LOOP-DO-FOR +- BREAK-HELP)) +-(PROCLAIM +- '(FTYPE (FUNCTION (STRING) T) RESET-SYS-PATHS +- COERCE-SLASH-TERMINATED)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) FIXNUM) RELATIVE-LINE GET-NODE-INDEX +- ANSI-LOOP::DUPLICATABLE-CODE-P THE-END)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM T) T) SMALLNTHCDR)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM FIXNUM) FIXNUM) ROUND-UP)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T *) T) +- ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES SBIT +- INFO-SEARCH PROCESS-ARGS LIST-MATCHES ARRAY-ROW-MAJOR-INDEX +- FIND-RESTART SLOOP::LOOP-ADD-TEMPS ANSI-LOOP::LOOP-WARN +- ANSI-LOOP::LOOP-ERROR BAD-SEQ-LIMIT ARRAY-IN-BOUNDS-P +- MAKE-ARRAY SIGNAL BIT PROCESS-SOME-ARGS CONCATENATE ERROR +- REMOVE-DUPLICATES SLOOP::ADD-FROM-DATA READ-BYTE +- FILE-SEARCH FILE-TO-STRING UPGRADED-ARRAY-ELEMENT-TYPE WARN +- BREAK-LEVEL BIT-NOT NTH-STACK-FRAME DELETE-DUPLICATES)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) *) ANSI-LOOP::ESTIMATE-CODE-SIZE-1 NEWLINE +- FIND-DOC RESTART-REPORT ANSI-LOOP::ESTIMATE-CODE-SIZE +- NEW-SEMI-COLON-READER)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T *) T) NOTANY BIT-ORC1 +- ANSI-LOOP::LOOP-CHECK-DATA-TYPE REMOVE BIT-ANDC1 +- INTERNAL-COUNT-IF-NOT READ-SEQUENCE SUBSETP +- VECTOR-PUSH-EXTEND TYPEP CERROR REPLACE COUNT-IF +- NSET-DIFFERENCE DELETE REMOVE-IF NSET-EXCLUSIVE-OR +- PROCESS-ERROR INTERNAL-COUNT SLOOP::IN-ARRAY-SLOOP-FOR +- SEARCH MAKE-SEQUENCE ADJUST-ARRAY BIT-NAND FIND-IF +- NINTERSECTION FILL BIT-ORC2 BIT-XOR UNION DELETE-IF-NOT +- SLOOP::PARSE-LOOP-MACRO WRITE-SEQUENCE SOME COUNT-IF-NOT +- MAP-INTO FIND FIND-IF-NOT BIT-NOR BIT-ANDC2 POSITION-IF +- NOTEVERY NUNION SET-DIFFERENCE INTERSECTION POSITION-IF-NOT +- EVERY POSITION FIND-IHS BIT-EQV REMOVE-IF-NOT MISMATCH +- BIT-AND INTERNAL-COUNT-IF DELETE-IF COUNT BREAK-CALL +- SET-EXCLUSIVE-OR SLOOP::LOOP-ADD-BINDING BIT-IOR)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T) T) ANSI-LOOP::LOOP-FOR-IN +- FLOATING-POINT-ERROR CHECK-TRACE-ARGS +- ANSI-LOOP::HIDE-VARIABLE-REFERENCE SETF-EXPAND-1 +- MAKE-BREAK-POINT FPE::REF SHARP-A-READER SHARP-U-READER DPB +- DM-VL CHECK-S-DATA ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE +- APPLY-DISPLAY-FUN ANSI-LOOP::LOOP-STANDARD-EXPANSION +- ANSI-LOOP::LOOP-TRANSLATE DEPOSIT-FIELD +- ANSI-LOOP::LOOP-ANSI-FOR-EQUALS +- SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS +- ANSI-LOOP::LOOP-FOR-ON GET-SLOT-POS +- ANSI-LOOP::PRINT-LOOP-UNIVERSE DEFMACRO* WARN-VERSION +- RESTART-CASE-EXPRESSION-CONDITION MAKE-T-TYPE +- ANSI-LOOP::LOOP-SUM-COLLECTION ANSI-LOOP::LOOP-FOR-BEING +- ANSI-LOOP::LOOP-FOR-ACROSS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T *) T) CHECK-TYPE-SYMBOL +- ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH NSUBSTITUTE-IF +- SUBSTITUTE-IF +- ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH NSUBSTITUTE +- ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH +- LISP::PUSH-LET-BINDING ANSI-LOOP::ADD-LOOP-PATH +- SUBSTITUTE-IF-NOT MAP SLOOP::LOOP-DECLARE-BINDING +- SUBSTITUTE ANSI-LOOP::LOOP-MAKE-VARIABLE NSUBSTITUTE-IF-NOT +- COMPLETE-PROP)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T) T) LISP::DO-ARG-COUNT-ERROR +- LISP::PUSH-SUB-LIST-BINDING)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T) T) MAKE-CONSTRUCTOR MAKE-PREDICATE +- DO-BREAK-LEVEL)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T *) T) PRINT-STACK-FRAME MERGE +- SLOOP::DEF-LOOP-INTERNAL)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T FIXNUM) T) SHARP-EQ-READER +- SHARP-SHARP-READER)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) T) CALL-TEST COERCE-TO-CONDITION +- FIND-LINE-IN-FUN ANSI-LOOP::LOOP-FOR-ARITHMETIC MAYBE-BREAK +- SLOOP::FIRST-USE-SLOOP-FOR SLOOP::FIRST-SLOOP-FOR +- SETF-STRUCTURE-ACCESS)) +-(PROCLAIM '(FTYPE (FUNCTION (T T T T T T *) T) ENCODE-UNIVERSAL-TIME)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T T T T T) T) +- ANSI-LOOP::LOOP-SEQUENCER)) +-(PROCLAIM '(FTYPE (FUNCTION (T T T T T *) T) UNIVERSAL-ERROR-HANDLER)) +-(PROCLAIM +- '(FTYPE (FUNCTION NIL T) ANSI-LOOP::LOOP-DO-NAMED +- SLOOP::LOOP-UN-POP ANSI-LOOP::LOOP-DO-INITIALLY +- SLOOP::PARSE-LOOP-WHEN SLOOP::LOOP-POP SLOOP::LOOP-PEEK +- SLOOP::PARSE-LOOP-DO SET-ENV ANSI-LOOP::LOOP-DO-REPEAT +- READ-EVALUATED-FORM ANSI-LOOP::LOOP-DO-RETURN +- ANSI-LOOP::LOOP-GET-FORM ANSI-LOOP::LOOP-DO-FINALLY +- SET-CURRENT DEFAULT-SYSTEM-BANNER DM-TOO-FEW-ARGUMENTS +- ANSI-LOOP::LOOP-DO-DO SLOOP::PARSE-ONE-WHEN-CLAUSE +- DEFAULT-INFO-HOTLIST KCL-TOP-RESTARTS TYPE-ERROR +- SET-UP-TOP-LEVEL INSPECT-INDENT GET-INDEX-NODE +- ALL-TRACE-DECLARATIONS DBL ANSI-LOOP::LOOP-GET-PROGN +- INIT-BREAK-POINTS STEP-READ-LINE +- ANSI-LOOP::LOOP-ITERATION-DRIVER GET-SIG-FN-NAME +- SETUP-LINEINFO CLEANUP ANSI-LOOP::LOOP-WHEN-IT-VARIABLE +- ANSI-LOOP::LOOP-DO-WITH SHOW-RESTARTS +- SLOOP::PARSE-LOOP-COLLECT INSPECT-READ-LINE +- DM-TOO-MANY-ARGUMENTS INSPECT-INDENT-1 +- ANSI-LOOP::LOOP-POP-SOURCE TEST-ERROR SLOOP::PARSE-LOOP1 +- ANSI-LOOP::LOOP-CONTEXT ANSI-LOOP::LOOP-BIND-BLOCK +- WINE-TMP-REDIRECT ILLEGAL-BOA SLOOP::PARSE-LOOP-FOR +- TOP-LEVEL LISP-IMPLEMENTATION-VERSION GET-TEMP-DIR)) +\ No newline at end of file ++(COMMON-LISP::IN-PACKAGE "SYSTEM") ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ ANSI-LOOP::LOOP-EMIT-FINAL-VALUE SYSTEM::INSPECT-CHARACTER ++ SYSTEM::INSPECT-STRUCTURE SYSTEM::PRINT-IHS ++ SYSTEM::RESTART-FUNCTION COMMON-LISP::TANH COMMON-LISP::FIFTH ++ SLOOP::PARSE-LOOP-INITIALLY SYSTEM::NEXT-STACK-FRAME ++ SYSTEM::IDESCRIBE SYSTEM::PROCESS-ARGS SYSTEM::LEAP-YEAR-P ++ SLOOP::AVERAGING-SLOOP-MACRO SYSTEM::FIX-LOAD-PATH ++ SLOOP::SUBSTITUTE-SLOOP-BODY SYSTEM::RESTART-REPORT-FUNCTION ++ COMMON-LISP::NINTH SLOOP::SLOOP-SLOOP-MACRO ++ SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::FREEZE-DEFSTRUCT ++ COMMON-LISP::EIGHTH SYSTEM::FIND-DOCUMENTATION ++ ANSI-LOOP::LOOP-PSEUDO-BODY COMMON-LISP::RATIONAL ++ ANSI-LOOP::LOOP-EMIT-BODY COMMON-LISP::ASIN ++ COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::S-DATA-P ++ SYSTEM::BKPT-FUNCTION SYSTEM::TRACE-ONE-PREPROCESS ++ COMMON-LISP::LOGNOT SYSTEM::SIMPLE-ARRAY-P SYSTEM::BKPT-FILE ++ SYSTEM::S-DATA-STATICP COMMON-LISP::ISQRT SYSTEM::INSTREAM-P ++ COMMON-LISP::SEVENTH SYSTEM::S-DATA-NAMED ++ ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::INSPECT-NUMBER ++ COMMON-LISP::ATANH SYSTEM::RESTART-TEST-FUNCTION ++ SYSTEM::S-DATA-INCLUDES SYSTEM::S-DATA-HAS-HOLES ++ SYSTEM::CONTEXT-VEC FPE::XMM-LOOKUP SYSTEM::S-DATA-RAW ++ ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS ++ SYSTEM::RESTART-INTERACTIVE-FUNCTION ++ ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS ++ ANSI-LOOP::LOOP-COLLECTOR-NAME ANSI-LOOP::LOOP-PATH-NAMES ++ ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE ++ SYSTEM::S-DATA-INCLUDED SYSTEM::S-DATA-SLOT-DESCRIPTIONS ++ SYSTEM::S-DATA-OFFSET SLOOP::REPEAT-SLOOP-MACRO ++ SYSTEM::S-DATA-PRINT-FUNCTION ANSI-LOOP::LOOP-PATH-USER-DATA ++ COMMON-LISP::FIND-ALL-SYMBOLS COMMON-LISP::FIRST ++ SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::BKPT-FORM ++ SYSTEM::NODES-FROM-INDEX SYSTEM::INSPECT-SYMBOL ++ SYSTEM::KNOWN-TYPE-P ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE ++ SYSTEM::MAKE-DEFPACKAGE-FORM COMMON-LISP::ARRAY-DIMENSIONS ++ SYSTEM::INSERT-BREAK-POINT SLOOP::PARSE-LOOP ++ ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED ++ ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS SYSTEM::SHORT-NAME ++ SYSTEM::CHECK-TRACE-SPEC ANSI-LOOP::DESTRUCTURING-SIZE ++ SYSTEM::BEST-ARRAY-ELEMENT-TYPE SYSTEM::CONTEXT-HASH ++ COMMON-LISP::SIXTH SYSTEM::IHS-VISIBLE SYSTEM::INSPECT-ARRAY ++ COMMON-LISP::BYTE-SIZE ANSI-LOOP::LOOP-COLLECTOR-CLASS ++ ANSI-LOOP::LOOP-HACK-ITERATION ++ ANSI-LOOP::LOOP-CONSTRUCT-RETURN SYSTEM::S-DATA-SLOT-POSITION ++ ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE SYSTEM::INSPECT-STRING ++ COMMON-LISP::PROVIDE COMMON-LISP::CIS ++ ANSI-LOOP::LOOP-MINIMAX-OPERATIONS ++ SYSTEM::BREAK-BACKWARD-SEARCH-STACK ++ ANSI-LOOP::LOOP-COLLECTOR-DTYPE ++ SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::SEARCH-STACK ++ COMMON-LISP::TENTH ANSI-LOOP::LOOP-DO-THEREIS ++ ANSI-LOOP::LOOP-MAXMIN-COLLECTION ++ ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA ++ ANSI-LOOP::LOOP-MAKE-PSETQ SYSTEM::ADD-TO-HOTLIST ++ SYSTEM::INSPECT-CONS ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS ++ SYSTEM::INSPECT-VECTOR COMMON-LISP::CONSTANTLY ++ SYSTEM::REWRITE-RESTART-CASE-CLAUSE SYSTEM::DM-BAD-KEY ++ SYSTEM::PRINT-SYMBOL-APROPOS SYSTEM::FRS-KIND FPE::ST-LOOKUP ++ COMMON-LISP::FOURTH SYSTEM::TERMINAL-INTERRUPT ++ SYSTEM::DM-KEY-NOT-ALLOWED SYSTEM::UNIQUE-ID ++ SYSTEM::S-DATA-FROZEN SLOOP::POINTER-FOR-COLLECT ++ SYSTEM::INSPECT-PACKAGE SYSTEM::DBL-EVAL ++ ANSI-LOOP::LOOP-MINIMAX-TYPE ANSI-LOOP::LOOP-UNIVERSE-ANSI ++ ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS SYSTEM::DWIM ++ SYSTEM::INSTREAM-STREAM-NAME SLOOP::RETURN-SLOOP-MACRO ++ SYSTEM::PATCH-SHARP SYSTEM::CONTEXT-P SYSTEM::INFO-GET-FILE ++ SYSTEM::RESTART-P COMMON-LISP::COSH COMMON-LISP::SINH ++ SYSTEM::GET-NEXT-VISIBLE-FUN SYSTEM::CHECK-DECLARATIONS ++ SYSTEM::GET-INSTREAM ++ ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD SYSTEM::S-DATA-NAME ++ ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS ++ SYSTEM::S-DATA-DOCUMENTATION SYSTEM::SHOW-BREAK-POINT ++ COMMON-LISP::ACOS COMMON-LISP::INVOKE-DEBUGGER ++ SYSTEM::BKPT-FILE-LINE ANSI-LOOP::LOOP-COLLECTOR-DATA ++ COMMON-LISP::THIRD SYSTEM::S-DATA-CONC-NAME ++ COMMON-LISP::SIGNUM ++ ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED ++ SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-TYPED-INIT ++ ANSI-LOOP::LOOP-PATH-FUNCTION SYSTEM::INFO-NODE-FROM-POSITION ++ COMMON-LISP::ASINH SYSTEM::RE-QUOTE-STRING ++ SLOOP::LOOP-COLLECT-KEYWORD-P SYSTEM::PRINT-FRS ++ SYSTEM::EVAL-FEATURE ANSI-LOOP::LOOP-COLLECTOR-P ++ ANSI-LOOP::LOOP-COLLECTOR-HISTORY ++ ANSI-LOOP::LOOP-LIST-COLLECTION ++ SYSTEM::BREAK-FORWARD-SEARCH-STACK COMMON-LISP::RESTART-NAME ++ SLOOP::PARSE-NO-BODY ANSI-LOOP::LOOP-UNIVERSE-P ++ SYSTEM::NUMBER-OF-DAYS-FROM-1900 SYSTEM::NODE-OFFSET ++ ANSI-LOOP::LOOP-MINIMAX-P SYSTEM::IHS-FNAME FPE::LOOKUP ++ SLOOP::LOOP-LET-BINDINGS FPE::GREF COMMON-LISP::PHASE ++ COMMON-LISP::BYTE-POSITION SYSTEM::INSTREAM-STREAM ++ ANSI-LOOP::LOOP-PATH-P SYSTEM::SEQTYPE COMMON-LISP::ACOSH ++ COMMON-LISP::ABS COMMON-LISP::COMPLEMENT ++ ANSI-LOOP::LOOP-CONSTANTP SYSTEM::WALK-THROUGH ++ SYSTEM::SETUP-INFO SYSTEM::COMPUTING-ARGS-P ++ SYSTEM::CONTEXT-SPICE SYSTEM::MAKE-KCL-TOP-RESTART ++ COMMON-LISP::COMPILER-MACRO-FUNCTION ++ ANSI-LOOP::LOOP-MAKE-DESETQ SYSTEM::SHOW-ENVIRONMENT ++ SLOOP::TRANSLATE-NAME SYSTEM::INFO-GET-TAGS ++ COMMON-LISP::SECOND SYSTEM::RESET-TRACE-DECLARATIONS ++ SYSTEM::S-DATA-TYPE SYSTEM::FIND-KCL-TOP-RESTART ++ ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::DO-F ++ ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS COMMON-LISP::VECTOR-POP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ SYSTEM::IHS-BACKTRACE SYSTEM::BREAK-NEXT SYSTEM::BREAK-QUIT ++ SYSTEM::SHOW-BREAK-VARIABLES SYSTEM::BREAK-BDS ++ COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-PREVIOUS ++ SYSTEM::INFO-ERROR ANSI-LOOP::LOOP-OPTIONAL-TYPE ++ SYSTEM::DBL-BACKTRACE SYSTEM::BREAK-LOCAL SYSTEM::BREAK-VS ++ COMMON-LISP::CONTINUE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::DBL-WHAT-FRAME FPE::FE-ENABLE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::SUBTYPEP COMMON-LISP::REDUCE SYSTEM::PARSE-BODY ++ COMMON-LISP::STABLE-SORT COMMON-LISP::SORT ++ SLOOP::FIND-IN-ORDERED-LIST)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::VERIFY-KEYWORDS SYSTEM::RESTART-PRINT ++ ANSI-LOOP::LOOP-GET-COLLECTION-INFO SYSTEM::LIST-MERGE-SORT ++ SYSTEM::READ-INSPECT-COMMAND SYSTEM::SHARP---READER ++ SYSTEM::SHARP-+-READER SYSTEM::SHARP-S-READER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::PUSH-OPTIONAL-BINDING)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::TRACE-CALL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::MASET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE SYSTEM::THE-START ++ SYSTEM::S-DATA-LENGTH SYSTEM::S-DATA-SIZE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ SYSTEM::PUSH-CONTEXT SYSTEM::GET-CONTEXT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ SYSTEM::BREAK-CURRENT SYSTEM::GCL-TOP-LEVEL ++ SYSTEM::BREAK-MESSAGE SYSTEM::BREAK-RESUME ++ ANSI-LOOP::LOOP-DO-FOR SYSTEM::SIMPLE-BACKTRACE ++ SYSTEM::BREAK-HELP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::STRING) COMMON-LISP::T) ++ SYSTEM::COERCE-SLASH-TERMINATED SYSTEM::RESET-SYS-PATHS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::BIT COMMON-LISP::READ-BYTE ++ COMMON-LISP::CONCATENATE SYSTEM::INFO-SEARCH ++ COMMON-LISP::ARRAY-IN-BOUNDS-P ANSI-LOOP::LOOP-ERROR ++ ANSI-LOOP::LOOP-WARN COMMON-LISP::REMOVE-DUPLICATES ++ SYSTEM::BAD-SEQ-LIMIT SYSTEM::PROCESS-SOME-ARGS ++ ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES ++ SLOOP::LOOP-ADD-TEMPS COMMON-LISP::BIT-NOT COMMON-LISP::SIGNAL ++ SYSTEM::NTH-STACK-FRAME COMMON-LISP::ARRAY-ROW-MAJOR-INDEX ++ COMMON-LISP::MAKE-ARRAY SYSTEM::FILE-SEARCH ++ SYSTEM::LIST-MATCHES COMMON-LISP::FIND-RESTART ++ SYSTEM::BREAK-LEVEL COMMON-LISP::DELETE-DUPLICATES ++ SLOOP::ADD-FROM-DATA COMMON-LISP::ERROR COMMON-LISP::WARN ++ SYSTEM::FILE-TO-STRING ++ COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE COMMON-LISP::SBIT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::FIND-DOC SYSTEM::RESTART-REPORT ++ ANSI-LOOP::ESTIMATE-CODE-SIZE-1 SYSTEM::NEWLINE ++ ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEW-SEMI-COLON-READER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ SYSTEM::MAKE-KEYWORD)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASSP ++ SYSTEM::SIMPLE-CONDITION-CLASS-P SYSTEM::UNTRACE-ONE ++ SYSTEM::CONDITIONP SYSTEM::CONDITION-CLASS-P ++ SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SI-CLASS-NAME ++ SYSTEM::AUTOLOAD-MACRO SYSTEM::AUTOLOAD SYSTEM::SI-CLASS-OF ++ SYSTEM::WARNINGP SYSTEM::DEFINE-STRUCTURE ++ FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS SYSTEM::SI-FIND-CLASS ++ SYSTEM::TRACE-ONE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::QUICK-SORT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::BIGNTHCDR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE ANSI-LOOP::LOOP-FOR-IN ++ SYSTEM::DEFMACRO* SYSTEM::APPLY-DISPLAY-FUN ++ SYSTEM::WARN-VERSION ANSI-LOOP::HIDE-VARIABLE-REFERENCE ++ SYSTEM::SHARP-U-READER ANSI-LOOP::LOOP-FOR-ACROSS ++ SYSTEM::DM-VL SYSTEM::GET-SLOT-POS ++ SYSTEM::RESTART-CASE-EXPRESSION-CONDITION ++ SYSTEM::CHECK-TRACE-ARGS ANSI-LOOP::LOOP-FOR-ON FPE::REF ++ ANSI-LOOP::PRINT-LOOP-UNIVERSE ANSI-LOOP::LOOP-ANSI-FOR-EQUALS ++ SYSTEM::SETF-EXPAND-1 ANSI-LOOP::LOOP-SUM-COLLECTION ++ ANSI-LOOP::LOOP-STANDARD-EXPANSION SYSTEM::MAKE-T-TYPE ++ COMMON-LISP::DEPOSIT-FIELD SYSTEM::MAKE-BREAK-POINT ++ ANSI-LOOP::LOOP-FOR-BEING ANSI-LOOP::LOOP-TRANSLATE ++ SYSTEM::SHARP-A-READER COMMON-LISP::DPB ++ SYSTEM::FLOATING-POINT-ERROR SYSTEM::CHECK-S-DATA ++ SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ SLOOP::FIRST-USE-SLOOP-FOR SYSTEM::COERCE-TO-CONDITION ++ SLOOP::FIRST-SLOOP-FOR ANSI-LOOP::LOOP-FOR-ARITHMETIC ++ SYSTEM::MAYBE-BREAK SYSTEM::SETF-STRUCTURE-ACCESS ++ SYSTEM::CALL-TEST SYSTEM::FIND-LINE-IN-FUN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::COUNT-IF COMMON-LISP::BIT-ANDC2 ++ COMMON-LISP::REMOVE SYSTEM::INTERNAL-COUNT-IF ++ SLOOP::LOOP-ADD-BINDING COMMON-LISP::MAP-INTO ++ COMMON-LISP::FIND-IF COMMON-LISP::NSET-DIFFERENCE ++ COMMON-LISP::UNION COMMON-LISP::NUNION ++ COMMON-LISP::MAKE-SEQUENCE COMMON-LISP::NOTANY ++ COMMON-LISP::POSITION COMMON-LISP::DELETE-IF ++ COMMON-LISP::BIT-ORC2 COMMON-LISP::REPLACE COMMON-LISP::DELETE ++ SYSTEM::BREAK-CALL COMMON-LISP::NINTERSECTION ++ COMMON-LISP::POSITION-IF SYSTEM::FIND-IHS COMMON-LISP::BIT-AND ++ COMMON-LISP::DELETE-IF-NOT ANSI-LOOP::LOOP-CHECK-DATA-TYPE ++ COMMON-LISP::REMOVE-IF COMMON-LISP::READ-SEQUENCE ++ SLOOP::PARSE-LOOP-MACRO COMMON-LISP::BIT-NAND ++ SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::SUBSETP ++ COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::EVERY ++ COMMON-LISP::SOME COMMON-LISP::WRITE-SEQUENCE ++ COMMON-LISP::MISMATCH COMMON-LISP::SET-EXCLUSIVE-OR ++ COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::BIT-NOR ++ COMMON-LISP::BIT-XOR COMMON-LISP::BIT-EQV COMMON-LISP::SEARCH ++ COMMON-LISP::SET-DIFFERENCE COMMON-LISP::FILL ++ COMMON-LISP::CERROR COMMON-LISP::ADJUST-ARRAY ++ COMMON-LISP::BIT-ORC1 SYSTEM::INTERNAL-COUNT ++ COMMON-LISP::TYPEP SYSTEM::PROCESS-ERROR ++ COMMON-LISP::COUNT-IF-NOT COMMON-LISP::INTERSECTION ++ SLOOP::IN-ARRAY-SLOOP-FOR COMMON-LISP::FIND-IF-NOT ++ COMMON-LISP::BIT-ANDC1 COMMON-LISP::POSITION-IF-NOT ++ COMMON-LISP::NOTEVERY COMMON-LISP::NSET-EXCLUSIVE-OR ++ COMMON-LISP::FIND COMMON-LISP::COUNT COMMON-LISP::BIT-IOR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::PUSH-SUB-LIST-BINDING SYSTEM::DO-ARG-COUNT-ERROR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ ANSI-LOOP::ADD-LOOP-PATH COMMON-LISP::MAP ++ ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH ++ ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH ++ COMMON-LISP::SUBSTITUTE COMMON-LISP::NSUBSTITUTE ++ COMMON-LISP::NSUBSTITUTE-IF-NOT ANSI-LOOP::LOOP-MAKE-VARIABLE ++ COMMON-LISP::SUBSTITUTE-IF-NOT ++ ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH ++ SYSTEM::PUSH-LET-BINDING COMMON-LISP::SUBSTITUTE-IF ++ SYSTEM::CHECK-TYPE-SYMBOL SLOOP::LOOP-DECLARE-BINDING ++ SYSTEM::COMPLETE-PROP COMMON-LISP::NSUBSTITUTE-IF)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::MAKE-PREDICATE SYSTEM::DO-BREAK-LEVEL ++ SYSTEM::MAKE-CONSTRUCTOR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ SYSTEM::UNIVERSAL-ERROR-HANDLER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ SYSTEM::SHARP-SHARP-READER SYSTEM::SHARP-EQ-READER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ SLOOP::DEF-LOOP-INTERNAL SYSTEM::PRINT-STACK-FRAME ++ COMMON-LISP::MERGE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::ENCODE-UNIVERSAL-TIME)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ ANSI-LOOP::LOOP-SEQUENCER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::STRING COMMON-LISP::FIXNUM) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ATOI)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::STEP-NEXT ++ COMMON-LISP::BREAK COMMON-LISP::ABORT SYSTEM::MAKE-S-DATA ++ ANSI-LOOP::MAKE-LOOP-COLLECTOR SLOOP::PARSE-LOOP-DECLARE ++ ANSI-LOOP::LOOP-GENTEMP SYSTEM::MAKE-INSTREAM ++ SYSTEM::MAYBE-CLEAR-INPUT ++ ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL COMMON-LISP::Y-OR-N-P ++ SYSTEM::CURRENT-STEP-FUN ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL ++ COMMON-LISP::DRIBBLE SYSTEM::MAKE-RESTART ++ SLOOP::PARSE-LOOP-WITH SYSTEM::LOC COMMON-LISP::YES-OR-NO-P ++ SYSTEM::TRANSFORM-KEYWORDS SYSTEM::MAKE-CONTEXT ++ COMMON-LISP::COMPUTE-RESTARTS SYSTEM::DBL-READ ++ SYSTEM::STEP-INTO ANSI-LOOP::MAKE-LOOP-UNIVERSE ++ SYSTEM::BREAK-LOCALS ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE ++ COMMON-LISP::VECTOR ANSI-LOOP::MAKE-LOOP-PATH)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ ANSI-LOOP::LOOP-LIST-STEP SYSTEM::INSPECT-OBJECT ++ COMMON-LISP::DESCRIBE ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES ++ SYSTEM::BREAK-GO SYSTEM::GET-&ENVIRONMENT ++ COMMON-LISP::PRINC-TO-STRING SYSTEM::WAITING ++ SYSTEM::INSTREAM-NAME ANSI-LOOP::NAMED-VARIABLE ++ COMMON-LISP::PRIN1-TO-STRING SYSTEM::INFO-SUBFILE ++ COMMON-LISP::INSPECT SYSTEM::END-WAITING ++ SYSTEM::FIND-DECLARATIONS ++ COMMON-LISP::INVOKE-RESTART-INTERACTIVELY ++ SYSTEM::BREAK-LEVEL-INVOKE-RESTART SYSTEM::ALOAD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ ANSI-LOOP::MAKE-LOOP-MINIMAX COMMON-LISP::LDB ++ SYSTEM::LIST-DELQ FPE::RF SLOOP::L-EQUAL ++ ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::DISPLAY-COMPILED-ENV ++ SYSTEM::SET-BACK ANSI-LOOP::HIDE-VARIABLE-REFERENCES ++ SYSTEM::GET-LINE-OF-FORM SYSTEM::BREAK-STEP-INTO ++ SLOOP::THE-TYPE SLOOP::COUNT-SLOOP-COLLECT ++ SYSTEM::KEYWORD-SUPPLIED-P COMMON-LISP::LOGANDC2 ++ ANSI-LOOP::LOOP-MAYBE-BIND-FORM SYSTEM::SET-DIR ++ SYSTEM::COERCE-TO-STRING COMMON-LISP::VECTOR-PUSH ++ SYSTEM::DM-NTH-CDR SLOOP::IN-FRINGE-SLOOP-MAP ++ SLOOP::MAXIMIZE-SLOOP-COLLECT SYSTEM::ADD-FILE ++ SYSTEM::ALL-MATCHES SYSTEM::DM-NTH ++ SLOOP::IN-CAREFULLY-SLOOP-FOR SYSTEM::PARSE-SLOT-DESCRIPTION ++ ANSI-LOOP::LOOP-LOOKUP-KEYWORD FPE::0-READER ++ ANSI-LOOP::LOOP-TMEMBER COMPILER::COMPILER-DEF-HOOK ++ SYSTEM::INFO-AUX COMMON-LISP::NTH SYSTEM::QUOTATION-READER ++ SYSTEM::CHECK-SEQ-START-END COMMON-LISP::LOGNAND ++ SYSTEM::SUBSTRINGP COMMON-LISP::LOGORC2 ++ ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION SYSTEM::SAFE-EVAL ++ ANSI-LOOP::LOOP-DO-IF SLOOP::THEREIS-SLOOP-COLLECT ++ SYSTEM::MATCH-DIMENSIONS SYSTEM::GET-MATCH ++ SYSTEM::SUB-INTERVAL-P FPE::PAREN-READER ++ SLOOP::IN-TABLE-SLOOP-MAP COMMON-LISP::LOGTEST ++ SLOOP::LOGXOR-SLOOP-COLLECT SYSTEM::DM-V ++ SYSTEM::GET-INFO-CHOICES SLOOP::COLLATE-SLOOP-COLLECT ++ SYSTEM::BREAK-STEP-NEXT ANSI-LOOP::LOOP-TEQUAL ++ COMMON-LISP::WRITE-BYTE COMMON-LISP::NTHCDR ++ SYSTEM::SETF-HELPER SLOOP::NEVER-SLOOP-COLLECT SLOOP::DESETQ1 ++ ANSI-LOOP::LOOP-DO-WHILE COMMON-LISP::DOCUMENTATION ++ FPE::%-READER SYSTEM::IN-INTERVAL-P SLOOP::SUM-SLOOP-COLLECT ++ SYSTEM::OBJLT COMMON-LISP::LDB-TEST SLOOP::PARSE-LOOP-MAP ++ SYSTEM::GET-NODES SLOOP::MAKE-VALUE SYSTEM::CONDITION-PASS ++ SLOOP::IN-PACKAGE-SLOOP-MAP SYSTEM::INCREMENT-CURSOR ++ ANSI-LOOP::LOOP-DO-ALWAYS SYSTEM::DISPLAY-ENV SYSTEM::SUPER-GO ++ SLOOP::MINIMIZE-SLOOP-COLLECT COMMON-LISP::LOGNOR ++ COMMON-LISP::LOGANDC1 COMMON-LISP::BYTE SYSTEM::DBL-UP ++ SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::LOGORC1 ++ FPE::READ-OPERANDS SLOOP::ALWAYS-SLOOP-COLLECT ++ SYSTEM::SETF-EXPAND SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS ++ SYSTEM::*BREAK-POINTS* SYSTEM::LOOKUP-KEYWORD ++ ANSI-LOOP::LOOP-TASSOC SYSTEM::LEFT-PARENTHESIS-READER ++ SLOOP::=-SLOOP-FOR FPE::READ-INSTRUCTION COMMON-LISP::COERCE ++ SYSTEM::SEQUENCE-CURSOR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::FFLOOR SYSTEM::BREAK-FUNCTION ++ COMMON-LISP::APROPOS-LIST COMMON-LISP::DECODE-UNIVERSAL-TIME ++ SYSTEM::STEPPER COMMON-LISP::REQUIRE SYSTEM::APROPOS-DOC ++ SYSTEM::PRINT-DOC SYSTEM::INFO COMMON-LISP::USE-VALUE ++ COMMON-LISP::WRITE-TO-STRING COMMON-LISP::FCEILING ++ SYSTEM::GET-SETF-METHOD ++ ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE SYSTEM::NLOAD ++ COMMON-LISP::ENSURE-DIRECTORIES-EXIST ++ COMMON-LISP::WILD-PATHNAME-P COMMON-LISP::FTRUNCATE ++ COMMON-LISP::FROUND SYSTEM::PARSE-BODY-HEADER ++ COMMON-LISP::INVOKE-RESTART SYSTEM::SHOW-INFO ++ COMMON-LISP::READ-FROM-STRING ++ SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE COMMON-LISP::APROPOS ++ COMMON-LISP::STORE-VALUE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ ANSI-LOOP::LOOP-DO-WITH SYSTEM::WINE-TMP-REDIRECT ++ SLOOP::PARSE-ONE-WHEN-CLAUSE COMMON-LISP::TYPE-ERROR ++ SYSTEM::INSPECT-INDENT SYSTEM::SET-CURRENT SYSTEM::TEST-ERROR ++ SLOOP::LOOP-POP ANSI-LOOP::LOOP-DO-REPEAT ++ ANSI-LOOP::LOOP-GET-PROGN SYSTEM::DM-TOO-FEW-ARGUMENTS ++ ANSI-LOOP::LOOP-CONTEXT SYSTEM::READ-EVALUATED-FORM ++ SYSTEM::ALL-TRACE-DECLARATIONS ++ COMMON-LISP::LISP-IMPLEMENTATION-VERSION ++ SYSTEM::DEFAULT-SYSTEM-BANNER ANSI-LOOP::LOOP-DO-RETURN ++ SYSTEM::INSPECT-INDENT-1 SYSTEM::STEP-READ-LINE ++ SYSTEM::SET-ENV SYSTEM::DM-TOO-MANY-ARGUMENTS ++ ANSI-LOOP::LOOP-BIND-BLOCK SLOOP::PARSE-LOOP1 ++ ANSI-LOOP::LOOP-DO-NAMED SLOOP::PARSE-LOOP-COLLECT ++ SYSTEM::KCL-TOP-RESTARTS SYSTEM::INSPECT-READ-LINE ++ SYSTEM::SET-UP-TOP-LEVEL SYSTEM::SHOW-RESTARTS SYSTEM::DBL ++ SLOOP::PARSE-LOOP-FOR ANSI-LOOP::LOOP-ITERATION-DRIVER ++ ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ANSI-LOOP::LOOP-DO-DO ++ SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::GET-TEMP-DIR ++ ANSI-LOOP::LOOP-POP-SOURCE SLOOP::LOOP-UN-POP ++ SYSTEM::TOP-LEVEL ANSI-LOOP::LOOP-DO-FINALLY ++ ANSI-LOOP::LOOP-DO-INITIALLY SYSTEM::GET-INDEX-NODE ++ SYSTEM::SETUP-LINEINFO SLOOP::PARSE-LOOP-WHEN SYSTEM::CLEANUP ++ ANSI-LOOP::LOOP-GET-FORM SLOOP::PARSE-LOOP-DO ++ SYSTEM::INIT-BREAK-POINTS SLOOP::LOOP-PEEK ++ SYSTEM::GET-SIG-FN-NAME SYSTEM::ILLEGAL-BOA)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::SMALLNTHCDR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::THE-END ANSI-LOOP::DUPLICATABLE-CODE-P ++ SYSTEM::RELATIVE-LINE SYSTEM::GET-NODE-INDEX)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ROUND-UP)) +\ No newline at end of file +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -68,7 +68,7 @@ sbrk1(n) + long starting_hole_div=10; + long starting_relb_heap_mult=2; + long new_holepage; +-long resv_pages=40; ++long resv_pages=0; + + #ifdef BSD + #include +@@ -186,14 +186,45 @@ int reserve_pages_for_signal_handler=30; + If not in_signal_handler then try to keep a minimum of + reserve_pages_for_signal_handler pages on hand in the hole + */ ++ ++inline void ++empty_relblock(void) { ++ ++ object o=sSAleaf_collection_thresholdA->s.s_dbind; ++ ++ sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(0); ++ for (;rb_pointer!=rb_start&&rb_pointer!=rb_end;) ++ GBC(t_relocatable); ++ sSAleaf_collection_thresholdA->s.s_dbind=o; ++ ++} ++ ++inline void ++resize_hole(ufixnum hp,enum type tp) { ++ ++ char *new_start=heap_end+hp*PAGESIZE; ++ char *start=rb_pointer=start) || (new_start=start+size)) { ++ fprintf(stderr,"Toggling relblock when resizing hole to %lu\n",hp); ++ fflush(stderr); ++ tm_table[t_relocatable].tm_adjgbccnt--; ++ GBC(t_relocatable); ++ return resize_hole(hp,tp); ++ } ++ ++ holepage=hp; ++ tm_of(tp)->tm_adjgbccnt--; ++ GBC(tp); ++ ++} ++ + inline void * + alloc_page(long n) { + +- void *e=heap_end; + fixnum d,m; +-#ifdef SGC +- int in_sgc=sgc_enabled; +-#endif ++ + if (n>=0) { + + if (n>(holepage - (in_signal_handler? 0 : +@@ -215,25 +246,8 @@ eg to add 20 more do (si::set-hole-size + d=d<0 ? 0 : d; + d=new_holepagetm_type==t_relocatable,j=tm->tm_maxpage,z=(n-j)*(r ? 2 : 1); + if (z>available_pages) return 0; +- if (r && 2*n+page(REAL_RB_START)>real_maxpage) return 0; ++ if (r && 2*n+page(rb_start)>real_maxpage) return 0; + available_pages-=z; +- tm->tm_adjgbccnt*=((double)j)/n; ++ tm->tm_adjgbccnt*=((double)j+1)/(n+1); + tm->tm_maxpage=n; +- return n; ++ /* massert(!check_avail_pages()); */ ++ return 1; + } + + +@@ -317,8 +355,11 @@ add_page_to_freelist(char *p, struct typ + + if (sgc_enabled && tm->tm_sgc) + pp->sgc_flags=SGC_PAGE_FLAG; ++ ++#ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(pp->type)) + x->d.s=(sgc_enabled && tm->tm_sgc) ? SGC_RECENT : SGC_NORMAL; ++#endif + + /* array headers must be always writable, since a write to the + body does not touch the header. It may be desirable if there +@@ -410,17 +451,61 @@ grow_linear(fixnum old, fixnum fract, fi + DEFVAR("*OPTIMIZE-MAXIMUM-PAGES*",sSAoptimize_maximum_pagesA,SI,sLnil,""); + #define OPTIMIZE_MAX_PAGES (sSAoptimize_maximum_pagesA ==0 || sSAoptimize_maximum_pagesA->s.s_dbind !=sLnil) + DEFVAR("*NOTIFY-OPTIMIZE-MAXIMUM-PAGES*",sSAnotify_optimize_maximum_pagesA,SI,sLnil,""); +-#define MMAX_PG(a_) (a_)->tm_maxpage ++#define MMAX_PG(a_) (a_)->tm_maxpage-(a_)->tm_alt_npage ++ ++static int ++rebalance_maxpages(struct typemanager *my_tm,fixnum z) { ++ ++ fixnum d; ++ ufixnum i,j; ++ ++ ++ d=(z-my_tm->tm_maxpage)*(my_tm->tm_type==t_relocatable ? 2 : 1); ++ j=sum_maxpages(); ++ ++ if (j+d>phys_pages) { ++ ++ ufixnum k=0; ++ ++ for (i=t_start;ik+phys_pages-j ? k+phys_pages-j : d; ++ if (d<=0) ++ return 0; ++ ++ for (i=t_start;i((double)phys_pages/(j+d))*(tm_table+i==my_tm ? z : tm_table[i].tm_maxpage)) */ ++ /* return 0; */ ++ /* for (i=t_start;i0 && page(heap_end)-first_data_page+nrbpage>=phys_pages) +- return 0; ++ long mro=0,tro=0,j; + + if (page(core_end)>0.8*real_maxpage) + return 0; +@@ -437,22 +522,27 @@ opt_maxpage(struct typemanager *my_tm) { + } + #endif + +- z=my_tm->tm_adjgbccnt-1; ++ z=my_tm->tm_adjgbccnt/* -1 */; + z/=(1+x-0.9*my_tm->tm_adjgbccnt); + z*=(y-mmax_page)*mmax_page; + z=sqrt(z); + z=z-mmax_page>available_pages ? mmax_page+available_pages : z; +- my_tm->tm_opt_maxpage=(long)z>my_tm->tm_opt_maxpage ? (long)z : my_tm->tm_opt_maxpage; ++ my_tm->tm_opt_maxpage=(long)(z+my_tm->tm_alt_npage)>my_tm->tm_opt_maxpage ? (long)(z+my_tm->tm_alt_npage) : my_tm->tm_opt_maxpage; + + if (z<=mmax_page) + return 0; + + r=((x-my_tm->tm_adjgbccnt)+ my_tm->tm_adjgbccnt*mmax_page/z)*(y-mmax_page+z); + r/=x*y; ++ ++ j=r<=0.95 && rebalance_maxpages(my_tm,z+mro+my_tm->tm_alt_npage); ++ + if (sSAnotify_optimize_maximum_pagesA->s.s_dbind!=sLnil) +- printf("[type %u max %lu(%lu) opt %lu y %lu(%lu) gbcrat %f sav %f]\n", +- my_tm->tm_type,mmax_page,mro,(long)z,(long)y,tro,(my_tm->tm_adjgbccnt-1)/(1+x-0.9*my_tm->tm_adjgbccnt),r); +- return r<=0.95 && set_tm_maxpage(my_tm,z+mro) ? 1 : 0; ++ printf("[type %u max %lu(%lu) opt %lu y %lu(%lu) gbcrat %f sav %f new %lu sum %lu phys %lu]\n", ++ my_tm->tm_type,mmax_page,mro,(long)z,(long)y,tro,(my_tm->tm_adjgbccnt/* -1 */)/(1+x-0.9*my_tm->tm_adjgbccnt),r, ++ my_tm->tm_maxpage,sum_maxpages(),phys_pages); ++ ++ return j ? 1 : 0; + + } + +@@ -483,41 +573,200 @@ Use ALLOCATE to expand the space.", + #else + #define TOTAL_THIS_TYPE(tm) (tm->tm_nppage * tm->tm_npage) + #endif +-bool prefer_low_mem_contblock=FALSE; ++ ++static object cbv=Cnil; ++#define cbsrch1 ((struct contblock ***)cbv->v.v_self) ++#define cbsrche (cbsrch1+cbv->v.v_fillp) ++ ++static inline void ++expand_contblock_index_space(void) { ++ ++ if (cbv==Cnil) { ++ cbv=(VFUN_NARGS=4,fSmake_vector1(make_fixnum(16),make_fixnum(aet_fix),Cnil,make_fixnum(0))); ++ cbv->v.v_self[0]=(object)&cb_pointer; ++ enter_mark_origin(&cbv); ++ } ++ ++ if (cbv->v.v_fillp+1==cbv->v.v_dim) { ++ ++ void *v=alloc_relblock(2*cbv->v.v_dim*sizeof(fixnum)); ++ ++ memcpy(v,cbv->v.v_self,cbv->v.v_dim*sizeof(fixnum)); ++ cbv->v.v_self=v; ++ cbv->v.v_dim*=2; ++ ++ } ++ ++} ++ ++static inline void * ++expand_contblock_index(struct contblock ***cbppp) { ++ ++ ufixnum i=cbppp-cbsrch1; ++ ++ expand_contblock_index_space(); ++ ++ cbppp=cbsrch1+i; ++ memmove(cbppp+1,cbppp,(cbsrche-cbppp+1)*sizeof(*cbppp)); ++ cbv->v.v_fillp++; ++ ++ return cbppp; ++ ++} ++ ++static inline void ++contract_contblock_index(struct contblock ***cbppp) { ++ ++ memmove(cbppp+1,cbppp+2,(cbsrche-cbppp-1)*sizeof(*cbppp)); ++ cbv->v.v_fillp--; ++ ++} ++ ++static inline int ++cbcomp(const void *v1,const void *v2) { ++ ++ ufixnum u1=(**(struct contblock ** const *)v1)->cb_size; ++ ufixnum u2=(**(struct contblock ** const *)v2)->cb_size; ++ ++ return u1>1; ++ void *v=v1+nn*s; ++ int j=c(i,v); ++ ++ if (nn) ++ return !j ? v : (j>0 ? bsearchleq(i,v,n-nn,s,c) : bsearchleq(i,v1,nn,s,c)); ++ else ++ return j<=0 ? v : v+s; ++ ++} ++ ++ ++static inline struct contblock *** ++find_cbppp(struct contblock *cbp) { ++ ++ struct contblock **cbpp=&cbp; ++ ++ return cbsrche==cbsrch1 ? cbsrch1 : bsearchleq(&cbpp,cbsrch1,cbsrche-cbsrch1,sizeof(*cbsrch1),cbcomp); ++ ++} ++ ++static inline struct contblock *** ++find_cbppp_by_n(ufixnum n) { ++ ++ struct contblock cb={n,NULL}; ++ ++ return find_cbppp(&cb); ++ ++} ++ ++static inline struct contblock ** ++find_cbpp(struct contblock ***cbppp,ufixnum n) { ++ ++ return *cbppp; ++ ++} ++ ++ ++static inline struct contblock ** ++find_contblock(ufixnum n,void **p) { ++ ++ *p=find_cbppp_by_n(n); ++ return find_cbpp(*p,n); ++} ++ ++inline void ++print_cb(int print) { ++ ++ struct contblock *cbp,***cbppp,**cbpp=&cb_pointer; ++ ufixnum k; ++ ++ for (cbp=cb_pointer,cbppp=cbsrch1;cbp;cbppp++) { ++ massert(cbpppcb_size==(**cbppp)->cb_size;cbpp=&cbp->cb_link,cbp=cbp->cb_link,k++); ++ if (print) ++ fprintf(stderr,"%lu %p %p %lu %lu\n",cbppp-cbsrch1,*cbppp,**cbppp,(**cbppp)->cb_size,k); ++ } ++ massert(cbppp==cbsrche); ++ massert(*cbppp==cbpp); ++ massert(!**cbppp); ++ ++ fflush(stderr); ++ ++} ++ ++inline void ++insert_contblock(void *p,ufixnum s) { ++ ++ struct contblock *cbp=p,**cbpp,***cbppp; ++ ++ cbpp=find_contblock(s,(void **)&cbppp); ++ ++ cbp->cb_size=s; ++ cbp->cb_link=*cbpp; ++ *cbpp=cbp; ++ ++ if ((!cbp->cb_link || cbp->cb_link->cb_size!=s)) { ++ cbppp=expand_contblock_index(cbppp); ++ cbppp[1]=&cbp->cb_link; ++ } ++ ++} ++ ++static inline void ++delete_contblock(void *p,struct contblock **cbpp) { ++ ++ struct contblock ***cbppp=p; ++ ufixnum s=(*cbpp)->cb_size; ++ ++ (*cbpp)=(*cbpp)->cb_link; ++ ++ if ((!(*cbpp) || (*cbpp)->cb_size!=s)) ++ contract_contblock_index(cbppp); ++ ++} ++ ++inline void ++reset_contblock_freelist(void) { ++ ++ cb_pointer=NULL; ++ cbv->v.v_fillp=0; ++ ++} + + inline void * + alloc_from_freelist(struct typemanager *tm,fixnum n) { + +- void *p,*v,*vp; +- struct contblock **cbpp; +- fixnum i; ++ void *p; + + switch (tm->tm_type) { + + case t_contiguous: +- for (cbpp= &cb_pointer,v=(void *)-1,vp=NULL; (*cbpp)!=NULL; cbpp= &(*cbpp)->cb_link) +- if ((*cbpp)->cb_size >= n) { +- if (!prefer_low_mem_contblock) { +- vp=cbpp; +- break; +- } else if ((void *)(*cbpp)cb_size; ++ delete_contblock(pp,cbpp); ++ if (ncb_size-n; +- *cbpp=(*cbpp)->cb_link; +- --ncb; +- insert_contblock(p+n,i); +- return(p); ++ return p; + } + break; + + case t_relocatable: +- if (rb_limit-rb_pointer>=n) ++ if (rb_pointer>rb_end && rb_pointer+n>rb_limit && rb_pointer+nn) + return ((rb_pointer+=n)-n); + break; + +@@ -554,7 +803,7 @@ too_full_p(struct typemanager *tm) { + + switch (tm->tm_type) { + case t_relocatable: +- return 100*(rb_limit-rb_pointer)cb_link) k+=cbp->cb_size; +@@ -575,7 +824,7 @@ too_full_p(struct typemanager *tm) { + inline void * + alloc_after_gc(struct typemanager *tm,fixnum n) { + +- if (tm->tm_npage+tpage(tm,n)>=tm->tm_maxpage && GBC_enable) { ++ if (tm->tm_npage+tpage(tm,n)>tm->tm_maxpage && GBC_enable) { + + switch (jmp_gmp) { + case 0: /* not in gmp call*/ +@@ -618,11 +867,16 @@ add_pages(struct typemanager *tm,fixnum + + case t_relocatable: + ++ if (rb_pointer>rb_end) { ++ fprintf(stderr,"Moving relblock low before expanding relblock pages\n"); ++ fflush(stderr); ++ GBC(t_relocatable); ++ } + nrbpage+=m; +- rb_end=heap_end+(holepage+nrbpage)*PAGESIZE; +- rb_limit=rb_end-2*RB_GETA; ++ rb_end+=m*PAGESIZE; ++ rb_limit+=m*PAGESIZE; + +- alloc_page(-(nrbpage+holepage)); ++ alloc_page(-(2*nrbpage+holepage)); + + break; + +@@ -656,7 +910,7 @@ alloc_after_adding_pages(struct typemana + + } + +- m=tm->tm_maxpage-tm->tm_npage; ++ /* m=tm->tm_maxpage-tm->tm_npage; */ + add_pages(tm,m); + + return alloc_from_freelist(tm,n); +@@ -670,15 +924,15 @@ alloc_after_reclaiming_pages(struct type + + if (tm->tm_type>=t_end) return NULL; + +- reloc_min=npage(rb_pointer-REAL_RB_START); ++ reloc_min=npage(rb_pointer-rb_start); + + if (m<2*(nrbpage-reloc_min)) { + + set_tm_maxpage(tm_table+t_relocatable,reloc_min); + nrbpage=reloc_min; + +- GBC(t_relocatable); + tm_table[t_relocatable].tm_adjgbccnt--; ++ GBC(t_relocatable); + + return alloc_after_adding_pages(tm,n); + +@@ -742,13 +996,31 @@ alloc_object(enum type t) { + + inline void * + alloc_contblock(size_t n) { +- return alloc_mem(tm_of(t_contiguous),ROUND_UP_PTR_CONT(n)); ++ return alloc_mem(tm_of(t_contiguous),CEI(n,CPTR_SIZE)); ++} ++ ++inline void * ++alloc_contblock_no_gc(size_t n) { ++ ++ struct typemanager *tm=tm_of(t_contiguous); ++ void *p; ++ ++ n=CEI(n,CPTR_SIZE); ++ ++ if ((p=alloc_from_freelist(tm,n))) ++ return p; ++ ++ if (tpage(tm,n)<(rb_start-heap_end)>>PAGEWIDTH && (p=alloc_after_adding_pages(tm,n))) ++ return p; ++ ++ return NULL; ++ + } + + inline void * + alloc_relblock(size_t n) { + +- return alloc_mem(tm_of(t_relocatable),ROUND_UP_PTR(n)); ++ return alloc_mem(tm_of(t_relocatable),CEI(n,PTR_ALIGN)); + + } + +@@ -789,7 +1061,7 @@ DEFUNM_NEW("ALLOCATED",object,fSallocate + tm = & tm_table[tm->tm_type]; + if (tm->tm_type == t_relocatable) + { tm->tm_npage = (rb_end-rb_start)/PAGESIZE; +- tm->tm_nfree = rb_end -rb_pointer; ++ tm->tm_nfree = rb_limit -rb_pointer; + } + else if (tm->tm_type == t_contiguous) + { int cbfree =0; +@@ -808,45 +1080,6 @@ DEFUNM_NEW("ALLOCATED",object,fSallocate + )); + } + +-/* DEFUN_NEW("RESET-NUMBER-USED",object,fSreset_number_used,SI,0,1,NONE,OO,OO,OO,OO,(object typ),"") */ +-/* {int i; */ +-/* if (VFUN_NARGS == 1) */ +-/* { tm_table[t_from_type(typ)].tm_nused = 0;} */ +-/* else */ +-/* for (i=0; i <= t_relocatable ; i++) */ +-/* { tm_table[i].tm_nused = 0;} */ +-/* RETURN1(sLnil); */ +-/* } */ +- +-#define IN_CONTBLOCK_P(p,pi) ((void *)p>=(void *)pi && (void *)p<(void *)pi+pi->in_use*PAGESIZE) +- +-/* SGC cont pages: explicit free calls can come at any time, and we +- must make sure to add the newly deallocated block to the right +- list. CM 20030827*/ +-#ifdef SGC +-void +-insert_maybe_sgc_contblock(char *p,int s) { +- +- struct contblock *tmp_cb_pointer; +- struct pageinfo *pi; +- +- for (pi=contblock_list_head;pi && !IN_CONTBLOCK_P(p,pi);pi=pi->next); +- massert(pi); +- +- if (sgc_enabled && ! (pi->sgc_flags&SGC_PAGE_FLAG)) { +- tmp_cb_pointer=cb_pointer; +- cb_pointer=old_cb_pointer; +- sgc_enabled=0; +- insert_contblock(p,s); +- sgc_enabled=1; +- old_cb_pointer=cb_pointer; +- cb_pointer=tmp_cb_pointer; +- } else +- insert_contblock(p,s); +- +-} +-#endif +- + #ifdef SGC_CONT_DEBUG + extern void overlap_check(struct contblock *,struct contblock *); + #endif +@@ -856,78 +1089,17 @@ DEFUN_NEW("PRINT-FREE-CONTBLOCK-LIST",ob + struct contblock *cbp,*cbp1; + + for (cbp=cb_pointer;cbp;cbp=cbp->cb_link) { +- printf("%p %d\n",cbp,cbp->cb_size); ++ printf("%p %lu\n",cbp,cbp->cb_size); + for (cbp1=cbp;cbp1;cbp1=cbp1->cb_link) + if ((void *)cbp+cbp->cb_size==(void *)cbp1 || + (void *)cbp1+cbp1->cb_size==(void *)cbp) +- printf(" adjacent to %p %d\n",cbp1,cbp1->cb_size); ++ printf(" adjacent to %p %lu\n",cbp1,cbp1->cb_size); + } + + return Cnil; + + } + +-void +-insert_contblock(char *p, int s) { +- +- struct contblock **cbpp, *cbp; +- +- /* SGC cont pages: This used to return when scb_size = ROUND_UP_PTR_CONT(s); +- +- for (cbpp=&cb_pointer;*cbpp;) { +- if ((void *)(*cbpp)+(*cbpp)->cb_size==(void *)cbp) { +- /* printf("Merge contblock %p %d %p %d\n",cbp,cbp->cb_size,*cbpp,(*cbpp)->cb_size); */ +- /* fflush(stdout); */ +- (*cbpp)->cb_size+=cbp->cb_size; +- cbp=*cbpp; +- *cbpp=(*cbpp)->cb_link; +- } else if ((void *)(*cbpp)==(void *)cbp+cbp->cb_size) { +- /* printf("Merge contblock %p %d %p %d\n",cbp,cbp->cb_size,*cbpp,(*cbpp)->cb_size); */ +- /* fflush(stdout); */ +- cbp->cb_size+=(*cbpp)->cb_size; +- *cbpp=(*cbpp)->cb_link; +- } else +- cbpp=&(*cbpp)->cb_link; +- } +- s=cbp->cb_size; +- +- for (cbpp = &cb_pointer; *cbpp; cbpp = &((*cbpp)->cb_link)) +- if ((*cbpp)->cb_size >= s) { +-#ifdef SGC_CONT_DEBUG +- if (*cbpp==cbp) { +- fprintf(stderr,"Trying to install a circle at %p\n",cbp); +- exit(1); +- } +- if (sgc_enabled) +- overlap_check(old_cb_pointer,cb_pointer); +-#endif +- cbp->cb_link = *cbpp; +- *cbpp = cbp; +-#ifdef SGC_CONT_DEBUG +- if (sgc_enabled) +- overlap_check(old_cb_pointer,cb_pointer); +-#endif +- return; +- } +- cbp->cb_link = NULL; +- *cbpp = cbp; +-#ifdef SGC_CONT_DEBUG +- if (sgc_enabled) +- overlap_check(old_cb_pointer,cb_pointer); +-#endif +- +-} +- + /* Add a tm_distinct field to prevent page type sharing if desired. + Not used now, as its never desirable from an efficiency point of + view, and as the only known place one must separate is cons and +@@ -961,7 +1133,7 @@ init_tm(enum type t, char *name, int els + return; + } + tm_table[(int)t].tm_type = t; +- tm_table[(int)t].tm_size = elsize ? ROUND_UP_PTR(elsize) : 1; ++ tm_table[(int)t].tm_size = elsize ? CEI(elsize,PTR_ALIGN) : 1; + tm_table[(int)t].tm_nppage = (PAGESIZE-sizeof(struct pageinfo))/tm_table[(int)t].tm_size; + tm_table[(int)t].tm_free = OBJNULL; + tm_table[(int)t].tm_nfree = 0; +@@ -1096,13 +1268,19 @@ gcl_init_alloc(void *cs_start) { + + update_real_maxpage(); + +- if (gcl_alloc_initialized) return; ++ if (gcl_alloc_initialized) { ++ massert(rb_start==heap_end &&rb_end==heap_end && rb_limit==heap_end && rb_pointer==heap_end); ++ holepage=new_holepage; ++ alloc_page(-holepage); ++ rb_start=rb_end=rb_limit=rb_pointer=heap_end+(holepage< sizeof(baby_malloc_data)) + { +@@ -1642,11 +1821,11 @@ free(void *ptr) { + for (p = &malloc_list,pp=*p; pp && !endp(pp); p = &((pp)->c.c_cdr),pp=pp->c.c_cdr) + if ((pp)->c.c_car->st.st_self == ptr) { + /* SGC contblock pages: Its possible this is on an old page CM 20030827 */ +-#ifdef SGC +- insert_maybe_sgc_contblock((pp)->c.c_car->st.st_self,(pp)->c.c_car->st.st_dim); +-#else +- insert_contblock((pp)->c.c_car->st.st_self,(pp)->c.c_car->st.st_dim); +-#endif ++/* #ifdef SGC */ ++/* insert_maybe_sgc_contblock((pp)->c.c_car->st.st_self,(pp)->c.c_car->st.st_dim); */ ++/* #else */ ++/* insert_contblock((pp)->c.c_car->st.st_self,(pp)->c.c_car->st.st_dim); */ ++/* #endif */ + (pp)->c.c_car->st.st_self = NULL; + *p = pp->c.c_cdr; + #ifdef GCL_GPROF +@@ -1707,11 +1886,11 @@ realloc(void *ptr, size_t size) { + for (i = 0; i < size; i++) + x->st.st_self[i] = ((char *)ptr)[i]; + /* SGC contblock pages: Its possible this is on an old page CM 20030827 */ +-#ifdef SGC +- insert_maybe_sgc_contblock(ptr, j); +-#else +- insert_contblock(ptr, j); +-#endif ++/* #ifdef SGC */ ++/* insert_maybe_sgc_contblock(ptr, j); */ ++/* #else */ ++/* insert_contblock(ptr, j); */ ++/* #endif */ + return(x->st.st_self); + } + } +--- gcl-2.6.12.orig/o/array.c ++++ gcl-2.6.12/o/array.c +@@ -457,15 +457,15 @@ static longfloat DFLT_aet_lf = 0.0; + static object Iname_t = sLt; + static struct { char * dflt; object *namep;} aet_types[] = + { {(char *) &DFLT_aet_object, &Iname_t,}, /* t */ +- {(char *) &DFLT_aet_ch, &sLstring_char,},/* string-char */ ++ {(char *) &DFLT_aet_ch, &sLcharacter,},/* character */ + {(char *) &DFLT_aet_fix, &sLbit,}, /* bit */ + {(char *) &DFLT_aet_fix, &sLfixnum,}, /* fixnum */ + {(char *) &DFLT_aet_sf, &sLshort_float,}, /* short-float */ + {(char *) &DFLT_aet_lf, &sLlong_float,}, /* long-float */ +- {(char *) &DFLT_aet_char,&sLsigned_char,}, /* signed char */ +- {(char *) &DFLT_aet_char,&sLunsigned_char,}, /* unsigned char */ +- {(char *) &DFLT_aet_short,&sLsigned_short,}, /* signed short */ +- {(char *) &DFLT_aet_short, &sLunsigned_short}, /* unsigned short */ ++ {(char *) &DFLT_aet_char,&sSsigned_char,}, /* signed char */ ++ {(char *) &DFLT_aet_char,&sSunsigned_char,}, /* unsigned char */ ++ {(char *) &DFLT_aet_short,&sSsigned_short,}, /* signed short */ ++ {(char *) &DFLT_aet_short, &sSunsigned_short}, /* unsigned short */ + }; + + DEFUN_NEW("GET-AELTTYPE",object,fSget_aelttype,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") +--- gcl-2.6.12.orig/o/assignment.c ++++ gcl-2.6.12/o/assignment.c +@@ -172,7 +172,7 @@ DEFUNO_NEW("FSET",object,fSfset,SI + sym->s.s_mflag = FALSE; + } else if (car(function) == sLspecial) + FEerror("Cannot define a special form.", 0); +- else if (function->c.c_car == sLmacro) { ++ else if (function->c.c_car == sSmacro) { + sym->s.s_gfdef = function->c.c_cdr; + sym->s.s_mflag = TRUE; + } else { +--- gcl-2.6.12.orig/o/bind.c ++++ gcl-2.6.12/o/bind.c +@@ -918,8 +918,8 @@ parse_key_new_new(int n, object *base, s + /* from here down identical to parse_key_rest */ + new = new + n ; + {int j=keys->n; +- object *p= (object *)(keys->defaults); +- while (--j >=0) base[j]=p[j]; ++ object **p= (object **)(keys->defaults); ++ while (--j >=0) base[j]=*(p[j]); + } + {if (n==0){ return 0;} + {int allow = keys->allow_other_keys; +@@ -939,7 +939,7 @@ parse_key_new_new(int n, object *base, s + new = new -2; + k = *new; + while(--i >= 0) +- {if ((*(ke++)).o == k) ++ {if (*(*(ke++)).o == k) + {base[i]= new[1]; + n=n-2; + goto top; +@@ -1026,8 +1026,7 @@ parse_key_rest_new(object rest, int n, o + + new = new + n ; + {int j=keys->n; +- object *p= (object *)(keys->defaults); +- while (--j >=0) base[j]=p[j]; ++ while (--j >=0) base[j]=*keys->defaults[j].o; + } + {if (n==0){ return 0;} + {int allow = keys->allow_other_keys; +@@ -1047,7 +1046,7 @@ parse_key_rest_new(object rest, int n, o + new = new -2; + k = *new; + while(--i >= 0) +- {if ((*(ke++)).o == k) ++ {if (*(*(ke++)).o == k) + {base[i]= new[1]; + n=n-2; + goto top; +@@ -1066,18 +1065,19 @@ parse_key_rest_new(object rest, int n, o + return -1; + }}} + ++static object foo[2]={Cnil,OBJNULL}; + + void + set_key_struct(struct key *ks, object data) + {int i=ks->n; + while (--i >=0) +- {ks->keys[i].o = data->cfd.cfd_self[ ks->keys[i].i ]; ++ {ks->keys[i].o = data->cfd.cfd_self+ks->keys[i].i; + if (ks->defaults != (void *)Cstd_key_defaults) + {fixnum m=ks->defaults[i].i; + ks->defaults[i].o= +- (m==-2 ? Cnil : +- m==-1 ? OBJNULL : +- data->cfd.cfd_self[m]);} ++ (m==-2 ? foo : ++ m==-1 ? foo+1 : ++ data->cfd.cfd_self+m);} + }} + + #undef AUX +--- gcl-2.6.12.orig/o/cfun.c ++++ gcl-2.6.12/o/cfun.c +@@ -306,6 +306,15 @@ make_special_form_internal(char *s, void + return(x); + } + ++object ++make_si_special_form_internal(char *s, void (*f)()) ++{ ++ object x; ++ x = make_si_ordinary(s); ++ x->s.s_sfdef = f; ++ return(x); ++} ++ + DEFUN_NEW("COMPILED-FUNCTION-NAME",object,fScompiled_function_name,SI + ,1,1,NONE,OO,OO,OO,OO,(object fun),"") + +--- gcl-2.6.12.orig/o/character.d ++++ gcl-2.6.12/o/character.d +@@ -50,14 +50,6 @@ Foundation, 675 Mass Ave, Cambridge, MA + @(return Cnil) + @) + +-@(defun string_char_p (c) +-@ +- check_type_character(&c); +- if (char_font(c) != 0 || char_bits(c) != 0) +- @(return Cnil) +- @(return Ct) +-@) +- + @(defun alpha_char_p (c) + int i; + @ +@@ -358,18 +350,6 @@ BEGIN: + @(return `make_fixnum(char_code(c))`) + @) + +-@(defun char_bits (c) +-@ +- check_type_character(&c); +- @(return `small_fixnum(char_bits(c))`) +-@) +- +-@(defun char_font (c) +-@ +- check_type_character(&c); +- @(return `small_fixnum(char_font(c))`) +-@) +- + @(defun code_char (c &o (b `make_fixnum(0)`) (f `make_fixnum(0)`)) + object x; + @ +@@ -393,29 +373,6 @@ BEGIN: + @(return x) + @) + +-@(defun make_char (c &o (b `make_fixnum(0)`) (f `make_fixnum(0)`)) +- object x; +- int code; +-@ +- check_type_character(&c); +- code = char_code(c); +- check_type_non_negative_integer(&b); +- check_type_non_negative_integer(&f); +- if (type_of(b) == t_bignum) +- @(return Cnil) +- if (type_of(f) == t_bignum) +- @(return Cnil) +- if (fix(b)>=CHBITSLIM || fix(f)>=CHFONTLIM) +- @(return Cnil) +- if (fix(b) == 0 && fix(f) == 0) +- @(return `code_char(code)`) +- x = alloc_object(t_character); +- char_code(x) = code; +- char_bits(x) = fix(b); +- char_font(x) = fix(f); +- @(return x) +-@) +- + @(defun char_upcase (c) + @ + check_type_character(&c); +@@ -489,30 +446,6 @@ int w, r; + @(return `make_fixnum(i)`) + @) + +-@(defun int_char (x) +- int i, c, b, f; +-@ +- check_type_non_negative_integer(&x); +- if (type_of(x) == t_bignum) +- @(return Cnil) +- i = fix(x); +- c = i % CHCODELIM; +- i /= CHCODELIM; +- b = i % CHBITSLIM; +- i /= CHBITSLIM; +- f = i % CHFONTLIM; +- i /= CHFONTLIM; +- if (i > 0) +- @(return Cnil) +- if (b == 0 && f == 0) +- @(return `code_char(c)`) +- x = alloc_object(t_character); +- char_code(x) = c; +- char_bits(x) = b; +- char_font(x) = f; +- @(return x) +-@) +- + @(defun char_name (c) + @ + check_type_character(&c); +@@ -563,18 +496,6 @@ int w, r; + @(return Cnil) + @) + +-@(defun char_bit (c n) +-@ +- check_type_character(&c); +- FEerror("Cannot get char-bit of ~S.", 1, c); +-@) +- +-@(defun set_char_bit (c n v) +-@ +- check_type_character(&c); +- FEerror("Cannot set char-bit of ~S.", 1, c); +-@) +- + void + gcl_init_character() + { +@@ -599,8 +520,8 @@ gcl_init_character() + #endif + + make_constant("CHAR-CODE-LIMIT", make_fixnum(CHCODELIM)); +- make_constant("CHAR-FONT-LIMIT", make_fixnum(CHFONTLIM)); +- make_constant("CHAR-BITS-LIMIT", make_fixnum(CHBITSLIM)); ++ make_si_constant("CHAR-FONT-LIMIT", make_fixnum(CHFONTLIM)); ++ make_si_constant("CHAR-BITS-LIMIT", make_fixnum(CHBITSLIM)); + + STreturn = make_simple_string("Return"); + enter_mark_origin(&STreturn); +@@ -620,18 +541,97 @@ gcl_init_character() + STnewline = make_simple_string("Newline"); + enter_mark_origin(&STnewline); + +- make_constant("CHAR-CONTROL-BIT", make_fixnum(0)); +- make_constant("CHAR-META-BIT", make_fixnum(0)); +- make_constant("CHAR-SUPER-BIT", make_fixnum(0)); +- make_constant("CHAR-HYPER-BIT", make_fixnum(0)); ++ make_si_constant("CHAR-CONTROL-BIT", make_fixnum(0)); ++ make_si_constant("CHAR-META-BIT", make_fixnum(0)); ++ make_si_constant("CHAR-SUPER-BIT", make_fixnum(0)); ++ make_si_constant("CHAR-HYPER-BIT", make_fixnum(0)); ++ + } + ++@(defun make_char (c &o (b `make_fixnum(0)`) (f `make_fixnum(0)`)) ++ object x; ++ int code; ++@ ++ check_type_character(&c); ++ code = char_code(c); ++ check_type_non_negative_integer(&b); ++ check_type_non_negative_integer(&f); ++ if (type_of(b) == t_bignum) ++ @(return Cnil) ++ if (type_of(f) == t_bignum) ++ @(return Cnil) ++ if (fix(b)>=CHBITSLIM || fix(f)>=CHFONTLIM) ++ @(return Cnil) ++ if (fix(b) == 0 && fix(f) == 0) ++ @(return `code_char(code)`) ++ x = alloc_object(t_character); ++ char_code(x) = code; ++ char_bits(x) = fix(b); ++ char_font(x) = fix(f); ++ @(return x) ++@) ++ ++@(defun char_bits (c) ++@ ++ check_type_character(&c); ++ @(return `small_fixnum(char_bits(c))`) ++@) ++ ++@(defun char_font (c) ++@ ++ check_type_character(&c); ++ @(return `small_fixnum(char_font(c))`) ++@) ++ ++@(defun char_bit (c n) ++@ ++ check_type_character(&c); ++ FEerror("Cannot get char-bit of ~S.", 1, c); ++@) ++ ++@(defun set_char_bit (c n v) ++@ ++ check_type_character(&c); ++ FEerror("Cannot set char-bit of ~S.", 1, c); ++@) ++ ++@(defun string_char_p (c) ++@ ++ check_type_character(&c); ++ if (char_font(c) != 0 || char_bits(c) != 0) ++ @(return Cnil) ++ @(return Ct) ++@) ++ ++@(defun int_char (x) ++ int i, c, b, f; ++@ ++ check_type_non_negative_integer(&x); ++ if (type_of(x) == t_bignum) ++ @(return Cnil) ++ i = fix(x); ++ c = i % CHCODELIM; ++ i /= CHCODELIM; ++ b = i % CHBITSLIM; ++ i /= CHBITSLIM; ++ f = i % CHFONTLIM; ++ i /= CHFONTLIM; ++ if (i > 0) ++ @(return Cnil) ++ if (b == 0 && f == 0) ++ @(return `code_char(c)`) ++ x = alloc_object(t_character); ++ char_code(x) = c; ++ char_bits(x) = b; ++ char_font(x) = f; ++ @(return x) ++@) ++ + void + gcl_init_character_function() + { + make_function("STANDARD-CHAR-P", Lstandard_char_p); + make_function("GRAPHIC-CHAR-P", Lgraphic_char_p); +- make_function("STRING-CHAR-P", Lstring_char_p); + make_function("ALPHA-CHAR-P", Lalpha_char_p); + make_function("UPPER-CASE-P", Lupper_case_p); + make_function("LOWER-CASE-P", Llower_case_p); +@@ -652,17 +652,18 @@ gcl_init_character_function() + make_function("CHAR-NOT-LESSP", Lchar_not_lessp); + make_function("CHARACTER", Lcharacter); + make_function("CHAR-CODE", Lchar_code); +- make_function("CHAR-BITS", Lchar_bits); +- make_function("CHAR-FONT", Lchar_font); + make_function("CODE-CHAR", Lcode_char); +- make_function("MAKE-CHAR", Lmake_char); + make_function("CHAR-UPCASE", Lchar_upcase); + make_function("CHAR-DOWNCASE", Lchar_downcase); + make_function("DIGIT-CHAR", Ldigit_char); + make_function("CHAR-INT", Lchar_int); +- make_function("INT-CHAR", Lint_char); + make_function("CHAR-NAME", Lchar_name); + make_function("NAME-CHAR", Lname_char); +- make_function("CHAR-BIT", Lchar_bit); +- make_function("SET-CHAR-BIT", Lset_char_bit); ++ make_si_function("INT-CHAR", Lint_char); ++ make_si_function("MAKE-CHAR", Lmake_char); ++ make_si_function("CHAR-BITS", Lchar_bits); ++ make_si_function("CHAR-FONT", Lchar_font); ++ make_si_function("CHAR-BIT", Lchar_bit); ++ make_si_function("SET-CHAR-BIT", Lset_char_bit); ++ make_si_function("STRING-CHAR-P", Lstring_char_p); + } +--- gcl-2.6.12.orig/o/cmpaux.c ++++ gcl-2.6.12/o/cmpaux.c +@@ -48,7 +48,7 @@ DEFUNO_NEW("SPECIALP",object,fSspecialp, + RETURN1(sym); + } + +-DEF_ORDINARY("DEBUG",sSdebug,SI,""); ++DEF_ORDINARY("DEBUGGER",sSdebugger,SI,""); + + DEFUN_NEW("DEFVAR1",object,fSdefvar1,SI + ,2,3,NONE,OO,OO,OO,OO,(object sym,object val,...),"") +@@ -71,10 +71,10 @@ DEFUN_NEW("DEFVAR1",object,fSdefvar1,SI + } + + +-DEFUN_NEW("DEBUG",object,fSdebug,SI ++DEFUN_NEW("DEBUG",object,fLdebug,LISP + ,2,2,NONE,OO,OO,OO,OO,(object sym,object val),"") + { /* 2 args */ +- putprop(sym,val,sSdebug); ++ putprop(sym,val,sSdebugger); + RETURN1(sym); + } + +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -67,27 +67,27 @@ ihs_function_name(object x) + y = x->c.c_car; + if (y == sLlambda) + return(sLlambda); +- if (y == sLlambda_closure) +- return(sLlambda_closure); +- if (y == sLlambda_block || y == sSlambda_block_expanded) { ++ if (y == sSlambda_closure) ++ return(sSlambda_closure); ++ if (y == sSlambda_block || y == sSlambda_block_expanded) { + x = x->c.c_cdr; + if (type_of(x) != t_cons) +- return(sLlambda_block); ++ return(sSlambda_block); + return(x->c.c_car); + } +- if (y == sLlambda_block_closure) { ++ if (y == sSlambda_block_closure) { + x = x->c.c_cdr; + if (type_of(x) != t_cons) +- return(sLlambda_block_closure); ++ return(sSlambda_block_closure); + x = x->c.c_cdr; + if (type_of(x) != t_cons) +- return(sLlambda_block_closure); ++ return(sSlambda_block_closure); + x = x->c.c_cdr; + if (type_of(x) != t_cons) +- return(sLlambda_block_closure); ++ return(sSlambda_block_closure); + x = x->c.c_cdr; + if (type_of(x) != t_cons) +- return(sLlambda_block_closure); ++ return(sSlambda_block_closure); + return(x->c.c_car); + } + /* a general special form */ +--- gcl-2.6.12.orig/o/eval.c ++++ gcl-2.6.12/o/eval.c +@@ -227,7 +227,7 @@ funcall(object fun) + c = FALSE; + fun = fun->c.c_cdr; + +- }else if (x == sLlambda_block) { ++ }else if (x == sSlambda_block) { + b = TRUE; + c = FALSE; + if(sSlambda_block_expanded->s.s_dbind!=OBJNULL) +@@ -237,14 +237,14 @@ funcall(object fun) + + + +- } else if (x == sLlambda_closure) { ++ } else if (x == sSlambda_closure) { + b = FALSE; + c = TRUE; + fun = fun->c.c_cdr; + } else if (x == sLlambda) { + b = c = FALSE; + fun = fun->c.c_cdr; +- } else if (x == sLlambda_block_closure) { ++ } else if (x == sSlambda_block_closure) { + b = c = TRUE; + fun = fun->c.c_cdr; + } else +@@ -644,13 +644,13 @@ EVAL: + + vs_check; + +- if (Vevalhook->s.s_dbind != Cnil && eval1 == 0) ++ if (siVevalhook->s.s_dbind != Cnil && eval1 == 0) + { + bds_ptr old_bds_top = bds_top; +- object hookfun = symbol_value(Vevalhook); ++ object hookfun = symbol_value(siVevalhook); + /* check if Vevalhook is unbound */ + +- bds_bind(Vevalhook, Cnil); ++ bds_bind(siVevalhook, Cnil); + form = Ifuncall_n(hookfun,2,form,list(3,lex_env[0],lex_env[1],lex_env[2])); + bds_unwind(old_bds_top); + return form; +@@ -721,7 +721,7 @@ APPLICATION: + for (x = lex_env[1]; type_of(x) == t_cons; x = x->c.c_cdr) + if (x->c.c_car->c.c_car == fun) { + x = x->c.c_car; +- if (MMcadr(x) == sLmacro) { ++ if (MMcadr(x) == sSmacro) { + x = MMcaddr(x); + goto EVAL_MACRO; + } +@@ -755,10 +755,10 @@ EVAL_ARGS: + vs_top = ++top; + form = MMcdr(form);} + n =top - base; /* number of args */ +- if (Vapplyhook->s.s_dbind != Cnil) { ++ if (siVapplyhook->s.s_dbind != Cnil) { + base[0]= (object)n; + base[0] = c_apply_n(list,n+1,base); +- x = Ifuncall_n(Vapplyhook->s.s_dbind,3, ++ x = Ifuncall_n(siVapplyhook->s.s_dbind,3, + x, /* the function */ + base[0], /* the arg list */ + list(3,lex_env[0],lex_env[1],lex_env[2])); +@@ -775,7 +775,7 @@ EVAL_ARGS: + + LAMBDA: + if (type_of(fun) == t_cons && MMcar(fun) == sLlambda) { +- x = listA(4,sLlambda_closure,lex_env[0],lex_env[1],lex_env[2],Mcdr(fun)); ++ x = listA(4,sSlambda_closure,lex_env[0],lex_env[1],lex_env[2],Mcdr(fun)); + goto EVAL_ARGS; + } + FEinvalid_function(fun); +@@ -805,13 +805,13 @@ EVAL: + + vs_check; + +- if (Vevalhook->s.s_dbind != Cnil && eval1 == 0) ++ if (siVevalhook->s.s_dbind != Cnil && eval1 == 0) + { + bds_ptr old_bds_top = bds_top; +- object hookfun = symbol_value(Vevalhook); +- /* check if Vevalhook is unbound */ ++ object hookfun = symbol_value(siVevalhook); ++ /* check if siVevalhook is unbound */ + +- bds_bind(Vevalhook, Cnil); ++ bds_bind(siVevalhook, Cnil); + vs_base = vs_top; + vs_push(form); + vs_push(lex_env[0]); +@@ -903,7 +903,7 @@ APPLICATION: + for (x = lex_env[1]; type_of(x) == t_cons; x = x->c.c_cdr) + if (x->c.c_car->c.c_car == fun) { + x = x->c.c_car; +- if (MMcadr(x) == sLmacro) { ++ if (MMcadr(x) == sSmacro) { + x = MMcaddr(x); + goto EVAL_MACRO; + } +@@ -940,7 +940,7 @@ EVAL_ARGS: + form = MMcdr(form); + } + vs_base = base; +- if (Vapplyhook->s.s_dbind != Cnil) { ++ if (siVapplyhook->s.s_dbind != Cnil) { + call_applyhook(fun); + return; + } +@@ -959,7 +959,7 @@ LAMBDA: + temporary = make_cons(lex_env[2], fun->c.c_cdr); + temporary = make_cons(lex_env[1], temporary); + temporary = make_cons(lex_env[0], temporary); +- x = make_cons(sLlambda_closure, temporary); ++ x = make_cons(sSlambda_closure, temporary); + vs_push(x); + goto EVAL_ARGS; + } +@@ -972,7 +972,7 @@ call_applyhook(object fun) + object ah; + object *v; + +- ah = symbol_value(Vapplyhook); ++ ah = symbol_value(siVapplyhook); + v = vs_base + 1; + vs_push(Cnil); + while (vs_top > v) +@@ -1040,7 +1040,7 @@ DEFUNOM_NEW("EVAL",object,fLeval,LISP + return Ivs_values(); + } + +-LFD(Levalhook)(void) ++LFD(siLevalhook)(void) + { + object env; + bds_ptr old_bds_top = bds_top; +@@ -1062,15 +1062,15 @@ LFD(Levalhook)(void) + vs_push(car(env)); + } else + too_many_arguments(); +- bds_bind(Vevalhook, vs_base[1]); +- bds_bind(Vapplyhook, vs_base[2]); ++ bds_bind(siVevalhook, vs_base[1]); ++ bds_bind(siVapplyhook, vs_base[2]); + eval1 = 1; + eval(vs_base[0]); + lex_env = lex; + bds_unwind(old_bds_top); + } + +-LFD(Lapplyhook)(void) ++LFD(siLapplyhook)(void) + { + + object env; +@@ -1094,8 +1094,8 @@ LFD(Lapplyhook)(void) + vs_push(car(env)); + } else + too_many_arguments(); +- bds_bind(Vevalhook, vs_base[2]); +- bds_bind(Vapplyhook, vs_base[3]); ++ bds_bind(siVevalhook, vs_base[2]); ++ bds_bind(siVapplyhook, vs_base[3]); + z = vs_top; + for (l = vs_base[1]; !endp(l); l = l->c.c_cdr) + vs_push(l->c.c_car); +@@ -1392,15 +1392,15 @@ gcl_init_eval(void) + make_constant("CALL-ARGUMENTS-LIMIT", make_fixnum(64)); + + +- Vevalhook = make_special("*EVALHOOK*", Cnil); +- Vapplyhook = make_special("*APPLYHOOK*", Cnil); ++ siVevalhook = make_si_special("*EVALHOOK*", Cnil); ++ siVapplyhook = make_si_special("*APPLYHOOK*", Cnil); + + + three_nils.nil3_self[0] = Cnil; + three_nils.nil3_self[1] = Cnil; + three_nils.nil3_self[2] = Cnil; + +- make_function("EVALHOOK", Levalhook); +- make_function("APPLYHOOK", Lapplyhook); ++ make_si_function("EVALHOOK", siLevalhook); ++ make_si_function("APPLYHOOK", siLapplyhook); + + } +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -345,14 +345,14 @@ getd(str) + #define READ_BYTE1() getc(fas_stream) + + #define GET8(varx ) \ +- do{unsigned long var=(unsigned long)READ_BYTE1(); \ +- var |= ((unsigned long)READ_BYTE1() << SIZE_BYTE); \ +- var |= ((unsigned long)READ_BYTE1() << (2*SIZE_BYTE)); \ +- var |= ((unsigned long)READ_BYTE1() << (3*SIZE_BYTE)); \ +- var |= ((unsigned long)READ_BYTE1() << (4*SIZE_BYTE)); \ +- var |= ((unsigned long)READ_BYTE1() << (5*SIZE_BYTE)); \ +- var |= ((unsigned long)READ_BYTE1() << (6*SIZE_BYTE)); \ +- var |= ((unsigned long)READ_BYTE1() << (7*SIZE_BYTE)); \ ++ do{unsigned long long var=READ_BYTE1(); \ ++ var |= ((unsigned long long)READ_BYTE1() << SIZE_BYTE); \ ++ var |= ((unsigned long long)READ_BYTE1() << (2*SIZE_BYTE)); \ ++ var |= ((unsigned long long)READ_BYTE1() << (3*SIZE_BYTE)); \ ++ var |= ((unsigned long long)READ_BYTE1() << (4*SIZE_BYTE)); \ ++ var |= ((unsigned long long)READ_BYTE1() << (5*SIZE_BYTE)); \ ++ var |= ((unsigned long long)READ_BYTE1() << (6*SIZE_BYTE)); \ ++ var |= ((unsigned long long)READ_BYTE1() << (7*SIZE_BYTE)); \ + DPRINTF("{8byte:varx= %ld}", var); \ + varx=var;} while (0) + +@@ -386,7 +386,7 @@ getd(str) + #define GETFIX(v_) Join(GET,SIZEOF_LONG)(v_) + + #define PUT8(varx ) \ +- do{unsigned long var= varx ; \ ++ do{unsigned long long var= varx ; \ + DPRINTF("{8byte:varx= %ld}", var); \ + WRITE_BYTEI(var,0); \ + WRITE_BYTEI(var,1); \ +@@ -808,7 +808,7 @@ write_fasd(object obj) + {int l = MP(obj)->_mp_size; + int m = (l >= 0 ? l : -l); + +- unsigned long *u = (unsigned long *) MP(obj)->_mp_d; ++ mp_limb_t *u = MP(obj)->_mp_d; + /* fix this */ + /* if (sizeof(mp_limb_t) != 4) { FEerror("fix for gmp",0);} */ + PUT4(l); +@@ -1279,7 +1279,7 @@ read_fasd1(int i, object *loc) + case DP( d_bignum:) + {int j,m; + object tem; +- unsigned long *u; ++ mp_limb_t *u; + GET4(j); + #ifdef GMP + tem = new_bignum(); +@@ -1287,7 +1287,7 @@ read_fasd1(int i, object *loc) + _mpz_realloc(MP(tem),m); + MP(tem)->_mp_size = j; + j = m; +- u = (unsigned long *) MP(tem)->_mp_d; ++ u = MP(tem)->_mp_d; + #else + { BEGIN_NO_INTERRUPT; + tem = alloc_object(t_bignum); +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -268,7 +268,7 @@ BEGIN: + return(strm->sm.sm_object0); + + case smm_socket: +- return (sLstring_char); ++ return (sLcharacter); + + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); +@@ -295,10 +295,10 @@ BEGIN: + return(stream_element_type(STREAM_INPUT_STREAM(strm))); + + case smm_string_input: +- return(sLstring_char); ++ return(sLcharacter); + + case smm_string_output: +- return(sLstring_char); ++ return(sLcharacter); + + default: + error("illegal stream mode"); +@@ -512,7 +512,7 @@ object if_exists, if_does_not_exist; + x->sm.sm_fp = fp; + + x->sm.sm_buffer = 0; +- x->sm.sm_object0 = (unzipped ? make_cons(sSAallow_gzipped_fileA,unzipped) : sLstring_char); ++ x->sm.sm_object0 = (unzipped ? make_cons(sSAallow_gzipped_fileA,unzipped) : sLcharacter); + x->sm.sm_object1 = fn; + x->sm.sm_int0 = x->sm.sm_int1 = 0; + vs_push(x); +@@ -1715,7 +1715,7 @@ LFD(Lstream_element_type)() + + @(static defun open (filename + &key (direction sKinput) +- (element_type sLstring_char) ++ (element_type sLcharacter) + (if_exists Cnil iesp) + (if_does_not_exist Cnil idnesp) + &aux strm) +@@ -1800,7 +1800,7 @@ LFD(Lfile_length)() + vs_base[0] = make_fixnum(i); + } + +-object sSAload_pathnameA; ++object sLAload_pathnameA; + DEFVAR("*COLLECT-BINARY-MODULES*",sSAcollect_binary_modulesA,SI,sLnil,""); + DEFVAR("*BINARY-MODULES*",sSAbinary_modulesA,SI,Cnil,""); + +@@ -1861,7 +1861,7 @@ DEFVAR("*BINARY-MODULES*",sSAbinary_modu + } + package = symbol_value(sLApackageA); + bds_bind(sLApackageA, package); +- bds_bind(sSAload_pathnameA,fasl_filename); ++ bds_bind(sLAload_pathnameA,fasl_filename); + if (sSAcollect_binary_modulesA->s.s_dbind==Ct) { + object _x=sSAbinary_modulesA->s.s_dbind; + object _y=Cnil; +@@ -1920,7 +1920,7 @@ DEFVAR("*BINARY-MODULES*",sSAbinary_modu + flush_stream(PRINTstream); + } + package = symbol_value(sLApackageA); +- bds_bind(sSAload_pathnameA,pathname); ++ bds_bind(sLAload_pathnameA,pathname); + bds_bind(sLApackageA, package); + bds_bind(sLAstandard_inputA, strm); + frs_push(FRS_PROTECT, Cnil); +@@ -2534,7 +2534,7 @@ gcl_init_file(void) + standard_input->sm.sm_mode = (short)smm_input; + standard_input->sm.sm_fp = stdin; + standard_input->sm.sm_buffer = 0; +- standard_input->sm.sm_object0 = sLstring_char; ++ standard_input->sm.sm_object0 = sLcharacter; + standard_input->sm.sm_object1 + #ifdef UNIX + = make_simple_string("stdin"); +@@ -2546,7 +2546,7 @@ gcl_init_file(void) + standard_output->sm.sm_mode = (short)smm_output; + standard_output->sm.sm_fp = stdout; + standard_output->sm.sm_buffer = 0; +- standard_output->sm.sm_object0 = sLstring_char; ++ standard_output->sm.sm_object0 = sLcharacter; + standard_output->sm.sm_object1 + #ifdef UNIX + = make_simple_string("stdout"); +@@ -2571,7 +2571,7 @@ gcl_init_file(void) + } + + DEFVAR("*IGNORE-EOF-ON-TERMINAL-IO*",sSAignore_eof_on_terminal_ioA,SI,Cnil,""); +-DEFVAR("*LOAD-PATHNAME*",sSAload_pathnameA,SI,Cnil,""); ++DEFVAR("*LOAD-PATHNAME*",sLAload_pathnameA,LISP,Cnil,""); + DEFVAR("*LOAD-VERBOSE*",sLAload_verboseA,LISP,Ct,""); + + DEF_ORDINARY("ABORT",sKabort,KEYWORD,""); +--- gcl-2.6.12.orig/o/funlink.c ++++ gcl-2.6.12/o/funlink.c +@@ -19,7 +19,7 @@ typedef object (*object_func)(); + static int + vpush_extend(void *,object); + +-object sLAlink_arrayA; ++object sSAlink_arrayA; + int Rset = 0; + + DEFVAR("*LINK-LIST*",sSAlink_listA,SI,0,""); +@@ -67,8 +67,8 @@ call_or_link(object sym, void **link) { + if (Rset==0) + funcall(fun); + else if (type_of(fun) == t_cfun) { +- (void) vpush_extend( link,sLAlink_arrayA->s.s_dbind); +- (void) vpush_extend( *link,sLAlink_arrayA->s.s_dbind); ++ (void) vpush_extend( link,sSAlink_arrayA->s.s_dbind); ++ (void) vpush_extend( *link,sSAlink_arrayA->s.s_dbind); + *link = (void *) (fun->cf.cf_self); + (*(void (*)())(fun->cf.cf_self))(); + } else { +@@ -89,8 +89,8 @@ call_or_link_closure(object sym, void ** + } + if (type_of(fun) == t_cclosure && (fun->cc.cc_turbo)) { + if (Rset) { +- (void) vpush_extend( link,sLAlink_arrayA->s.s_dbind); +- (void) vpush_extend( *link,sLAlink_arrayA->s.s_dbind); ++ (void) vpush_extend( link,sSAlink_arrayA->s.s_dbind); ++ (void) vpush_extend( *link,sSAlink_arrayA->s.s_dbind); + *ptr = (void *)fun; + *link = (void *) (fun->cf.cf_self); + MMccall(fun); +@@ -105,8 +105,8 @@ call_or_link_closure(object sym, void ** + /* can't do this if invoking foo(a) is illegal when foo is not defined + to take any arguments. In the majority of C's this is legal */ + else if (type_of(fun) == t_cfun) { +- (void) vpush_extend(link,sLAlink_arrayA->s.s_dbind); +- (void) vpush_extend(*link,sLAlink_arrayA->s.s_dbind); ++ (void) vpush_extend(link,sSAlink_arrayA->s.s_dbind); ++ (void) vpush_extend(*link,sSAlink_arrayA->s.s_dbind); + *link = (void *)fun->cf.cf_self; + (*(void (*)())fun->cf.cf_self)(); + } else { +@@ -129,7 +129,7 @@ vpush_extend(void *item, object ar) + return(ar->v.v_fillp = ind);} + else + { +- int newdim= ROUND_UP_PTR((2 + (int) (1.3 * ind))); ++ int newdim= CEI((2 + (int) (1.3 * ind)),PTR_ALIGN); + unsigned char *newself; + newself = (void *)alloc_relblock(newdim); + bcopy(ar->ust.ust_self,newself,ind); +@@ -180,8 +180,8 @@ is supplied and FLAG is nil, then this f + LDEFAULT2: sym = Cnil ; + LEND_VARARG: va_end(ap);} + +- if (sLAlink_arrayA ==0) RETURN1(Cnil); +- link_ar = sLAlink_arrayA->s.s_dbind; ++ if (sSAlink_arrayA ==0) RETURN1(Cnil); ++ link_ar = sSAlink_arrayA->s.s_dbind; + if (link_ar==Cnil && flag==Cnil) RETURN1(Cnil); + check_type_array(&link_ar); + if (type_of(link_ar) != t_string) +@@ -339,8 +339,8 @@ call_proc(object sym, void **link, int a + + } + +- (void) vpush_extend(link,sLAlink_arrayA->s.s_dbind); +- (void) vpush_extend(*link,sLAlink_arrayA->s.s_dbind); ++ (void) vpush_extend(link,sSAlink_arrayA->s.s_dbind); ++ (void) vpush_extend(*link,sSAlink_arrayA->s.s_dbind); + *link = (void *)fn; + + AFTER_LINK: +@@ -443,8 +443,8 @@ call_proc_new(object sym, void **link, i + + } + +- (void) vpush_extend(link,sLAlink_arrayA->s.s_dbind); +- (void) vpush_extend(*link,sLAlink_arrayA->s.s_dbind); ++ (void) vpush_extend(link,sSAlink_arrayA->s.s_dbind); ++ (void) vpush_extend(*link,sSAlink_arrayA->s.s_dbind); + *link = (void *)fn; + + AFTER_LINK: +@@ -607,7 +607,7 @@ FFN(mv_ref)(unsigned int i) + #include "xdrfuns.c" + + DEF_ORDINARY("CDEFN",sScdefn,SI,""); +-DEFVAR("*LINK-ARRAY*",sLAlink_arrayA,LISP,Cnil,""); ++DEFVAR("*LINK-ARRAY*",sSAlink_arrayA,SI,Cnil,""); + + void + gcl_init_links(void) +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -24,7 +24,7 @@ + IMPLEMENTATION-DEPENDENT + */ + +-#define DEBUG ++/* #define DEBUG */ + + #define IN_GBC + #define NEED_MP_H +@@ -45,7 +45,7 @@ static void + sgc_mark_phase(void); + + static fixnum +-sgc_count_writable(void); ++sgc_count_read_only(void); + + #endif + +@@ -55,10 +55,6 @@ mark_c_stack(jmp_buf, int, void (*)(void + static void + mark_contblock(void *, int); + +-static void +-mark_object(object); +- +- + /* the following in line definitions seem to be twice as fast (at + least on mc68020) as going to the assembly function calls in bitop.c so + since this is more portable and faster lets use them --W. Schelter +@@ -75,6 +71,31 @@ mark_object(object); + #error Do not recognize CPTR_SIZE + #endif + ++void * ++cb_in(void *p) { ++ struct contblock **cbpp; ++ int i; ++ ++ for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) { ++ if ((void *)*cbpp<=p && ((void *)(*cbpp)+(*cbpp)->cb_size) >p) ++ return *cbpp; ++ } ++ return NULL; ++} ++ ++int ++cb_print(void) { ++ struct contblock **cbpp; ++ int i; ++ ++ for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) { ++ fprintf(stderr,"%lu at %p\n",(*cbpp)->cb_size,*cbpp); ++ fflush(stderr); ++ } ++ fprintf(stderr,"%u blocks\n",i); ++ return 0; ++} ++ + #ifdef CONTBLOCK_MARK_DEBUG + int + cb_check(void) { +@@ -121,13 +142,48 @@ off_check(void *v,void *ve,fixnum i,stru + } + #endif + ++void **contblock_stack_list=NULL; ++ ++static inline bool ++pageinfo_p(void *v) { ++ ++ struct pageinfo *pi=v; ++ ++ return pi->magic==PAGE_MAGIC && pi->type<=t_contiguous && ++ (!pi->next || (void *)pi->next>=v+(pi->type==t_contiguous ? pi->in_use : 1)*PAGESIZE); ++ ++} ++ ++static inline bool ++in_contblock_stack_list(void *p,void ***ap) { ++ void **a; ++ for (a=*ap;a && a[0]>p;a=a[1]); ++ *ap=a; ++ /* if (a && a[0]==p) fprintf(stderr,"Skipping %p\n",p); */ ++ return a && a[0]==p; ++} + + inline struct pageinfo * + get_pageinfo(void *x) { +- struct pageinfo *v=contblock_list_head;void *vv; +- for (;(vv=v) && (vv>=x || vv+v->in_use*PAGESIZE<=x);v=v->next); +- return v; ++ ++ void *p=pageinfo(x),**a=contblock_stack_list; ++ struct pageinfo *v; ++ ++ for (;!pageinfo_p(p) || in_contblock_stack_list(p,&a);p-=PAGESIZE); ++ ++ v=p; ++ massert(v->type==t_contiguous && p+v->in_use*PAGESIZE>x); ++ ++ return p; ++ + } ++ ++/* inline struct pageinfo * */ ++/* get_pageinfo(void *x) { */ ++/* struct pageinfo *v=contblock_list_head;void *vv; */ ++/* for (;(vv=v) && (vv>=x || vv+v->in_use*PAGESIZE<=x);v=v->next); */ ++/* return v; */ ++/* } */ + + inline char + get_bit(char *v,struct pageinfo *pi,void *x) { +@@ -300,21 +356,6 @@ enter_mark_origin(object *p) { + + } + +-inline void +-mark_cons(object x) { +- +- do { +- object d=x->c.c_cdr; +- mark(x); +- mark_object(x->c.c_car); +- x=d; +- if (NULL_OR_ON_C_STACK(x) || is_marked_or_free(x))/*catches Cnil*/ +- return; +- } while (cdr_listp(x)); +- mark_object(x); +- +-} +- + /* Whenever two arrays are linked together by displacement, + if one is live, the other will be made live */ + #define mark_displaced_field(ar) mark_object(ar->a.a_displaced) +@@ -336,27 +377,17 @@ mark_link_array(void *v,void *ve) { + if (NULL_OR_ON_C_STACK(v)) + return; + +- if (sLAlink_arrayA->s.s_dbind==Cnil) ++ if (sSAlink_arrayA->s.s_dbind==Cnil) + return; + +- p=(void *)sLAlink_arrayA->s.s_dbind->v.v_self; +- pe=(void *)p+sLAlink_arrayA->s.s_dbind->v.v_fillp; +- +- if (is_marked(sLAlink_arrayA->s.s_dbind) && COLLECT_RELBLOCK_P +-#ifdef SGC +- && (!sgc_enabled || SGC_RELBLOCK_P(sLAlink_arrayA->s.s_dbind->v.v_self)) +-#endif +- ) { +- fixnum j=rb_pointer1-rb_pointer; +- p=(void *)p+j; +- pe=(void *)pe+j; +- } ++ p=(void *)sSAlink_arrayA->s.s_dbind->v.v_self; ++ pe=(void *)p+sSAlink_arrayA->s.s_dbind->v.v_fillp; + + for (;p=v && *ps.s_dbind==Cnil) ++ if (sSAlink_arrayA->s.s_dbind==Cnil) + return; + +- ne=n=p=(void *)sLAlink_arrayA->s.s_dbind->v.v_self; +- pe=(void *)p+sLAlink_arrayA->s.s_dbind->v.v_fillp; ++ ne=n=p=(void *)sSAlink_arrayA->s.s_dbind->v.v_self; ++ pe=(void *)p+sSAlink_arrayA->s.s_dbind->v.v_fillp; + + while (ps.s_dbind->v.v_fillp=(ne-n)*sizeof(*n); ++ sSAlink_arrayA->s.s_dbind->v.v_fillp=(ne-n)*sizeof(*n); + + } + +@@ -392,11 +423,11 @@ sweep_link_array(void) { + + void ***p,***pe; + +- if (sLAlink_arrayA->s.s_dbind==Cnil) ++ if (sSAlink_arrayA->s.s_dbind==Cnil) + return; + +- p=(void *)sLAlink_arrayA->s.s_dbind->v.v_self; +- pe=(void *)p+sLAlink_arrayA->s.s_dbind->v.v_fillp; ++ p=(void *)sSAlink_arrayA->s.s_dbind->v.v_self; ++ pe=(void *)p+sSAlink_arrayA->s.s_dbind->v.v_fillp; + for (;pst.st_self) && */ ++ /* (dp=PCEI(lcv->st.st_self,r)) && dp+s<=(dpe=lcv->st.st_self+lcv->st.st_dim) */ ++ /* && x && x->d.st>=ngc_thresh) { */ ++ ++ if (what_to_collect!=t_contiguous && ++ x && x->d.st>=ngc_thresh && ++ (dp=alloc_contblock_no_gc(s))) { ++ ++ /* fprintf(stderr,"Promoting %p,%lu to %p\n",p,s,dp); */ ++ /* fflush(stderr); */ ++ ++ *pp=memcpy(dp,p,s); ++ /* lcv->st.st_fillp=lcv->st.st_dim=(dpe-(void *)(lcv->st.st_self=dp+s)); */ ++ x->d.st=0; + +- if (tp==t_cons) { +- mark_cons(x); + return; ++ ++ } ++ ++ if (x && x->d.std.st++; ++ ++ if (p>=(void *)heap_end) ++ *pp=(void *)copy_relblock(p,s); ++ else ++ mark_contblock(p,s); ++ ++} ++ ++static void mark_object1(object); ++#define mark_object(x) if (marking(x)) mark_object1(x) ++ ++static inline void ++mark_object_address(object *o,int f) { ++ ++ static ufixnum lp; ++ static ufixnum lr; ++ ++ ufixnum p=page(o); ++ ++ if (lp!=p || !f) { ++ lp=p; ++ lr=sgc_enabled ? WRITABLE_PAGE_P(lp) : 1; + } + ++ if (lr) ++ mark_object(*o); ++ ++} ++ ++static inline void ++mark_object_array(object *o,object *oe) { ++ int f=0; ++ ++ if (o) ++ for (;oc.c_car); ++ mark_object(Scdr(x));/*FIXME*/ ++ break; + + case t_fixnum: + break; + ++ case t_bignum: ++ MARK_LEAF_DATA(x,MP_SELF(x),MP_ALLOCATED(x)*MP_LIMB_SIZE); ++ break; ++ + case t_ratio: + mark_object(x->rat.rat_num); +- x = x->rat.rat_den; +- goto BEGIN; ++ mark_object(x->rat.rat_den); + + case t_shortfloat: + break; +@@ -456,8 +565,7 @@ mark_object(object x) { + + case t_complex: + mark_object(x->cmp.cmp_imag); +- x = x->cmp.cmp_real; +- goto BEGIN; ++ mark_object(x->cmp.cmp_real); + + case t_character: + break; +@@ -466,13 +574,7 @@ mark_object(object x) { + mark_object(x->s.s_plist); + mark_object(x->s.s_gfdef); + mark_object(x->s.s_dbind); +- if (x->s.s_self == NULL) +- break; +- if (inheap(x->s.s_self)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(x->s.s_self,x->s.s_fillp); +- } else if (COLLECT_RELBLOCK_P) +- x->s.s_self = copy_relblock(x->s.s_self, x->s.s_fillp); ++ MARK_LEAF_DATA(x,x->s.s_self,x->s.s_fillp); + break; + + case t_package: +@@ -481,197 +583,88 @@ mark_object(object x) { + mark_object(x->p.p_shadowings); + mark_object(x->p.p_uselist); + mark_object(x->p.p_usedbylist); +- if (what_to_collect != t_contiguous) +- break; +- if (x->p.p_internal != NULL) +- mark_contblock((char *)(x->p.p_internal), +- x->p.p_internal_size*sizeof(object)); +- if (x->p.p_external != NULL) +- mark_contblock((char *)(x->p.p_external), +- x->p.p_external_size*sizeof(object)); ++ mark_object_array(x->p.p_internal,x->p.p_internal+x->p.p_internal_size); ++ MARK_LEAF_DATA(x,x->p.p_internal,x->p.p_internal_size*sizeof(object)); ++ mark_object_array(x->p.p_external,x->p.p_external+x->p.p_external_size); ++ MARK_LEAF_DATA(x,x->p.p_external,x->p.p_external_size*sizeof(object)); + break; + + case t_hashtable: + mark_object(x->ht.ht_rhsize); + mark_object(x->ht.ht_rhthresh); +- if (x->ht.ht_self == NULL) +- break; +- for (i = 0, j = x->ht.ht_size; i < j; i++) { +- mark_object(x->ht.ht_self[i].hte_key); +- mark_object(x->ht.ht_self[i].hte_value); +- } +- if (inheap(x->ht.ht_self)) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)x->ht.ht_self,j*sizeof(struct htent)); +- } else if (COLLECT_RELBLOCK_P) +- x->ht.ht_self=(void *)copy_relblock((char *)x->ht.ht_self,j*sizeof(struct htent));; ++ if (x->ht.ht_self) ++ for (i=0;iht.ht_size;i++) ++ if (x->ht.ht_self[i].hte_key!=OBJNULL) { ++ mark_object_address(&x->ht.ht_self[i].hte_key,i); ++ mark_object_address(&x->ht.ht_self[i].hte_value,i+1); ++ } ++ MARK_LEAF_DATA(x,x->ht.ht_self,x->ht.ht_size*sizeof(*x->ht.ht_self)); + break; + + case t_array: +- if ((x->a.a_displaced) != Cnil) +- mark_displaced_field(x); +- if (x->a.a_dims != NULL) { +- if (inheap(x->a.a_dims)) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->a.a_dims),sizeof(int)*x->a.a_rank); +- } else if (COLLECT_RELBLOCK_P) +- x->a.a_dims = (int *) copy_relblock((char *)(x->a.a_dims),sizeof(int)*x->a.a_rank); +- } +- if ((enum aelttype)x->a.a_elttype == aet_ch) +- goto CASE_STRING; +- if ((enum aelttype)x->a.a_elttype == aet_bit) +- goto CASE_BITVECTOR; +- if ((enum aelttype)x->a.a_elttype == aet_object) +- goto CASE_GENERAL; +- +- CASE_SPECIAL: +- cp = (char *)(x->fixa.fixa_self); +- if (cp == NULL) +- break; +- /* set j to the size in char of the body of the array */ +- +- switch((enum aelttype)x->a.a_elttype){ +-#define ROUND_RB_POINTERS_DOUBLE \ +-{int tem = ((long)rb_pointer1) & (sizeof(double)-1); \ +- if (tem) \ +- { rb_pointer += (sizeof(double) - tem); \ +- rb_pointer1 += (sizeof(double) - tem); \ +- }} ++ MARK_LEAF_DATA(x,x->a.a_dims,sizeof(int)*x->a.a_rank); ++ ++ case t_vector: ++ case t_bitvector: ++ ++ switch(j ? j : (enum aelttype)x->v.v_elttype) { ++ + case aet_lf: +- j= sizeof(longfloat)*x->lfa.lfa_dim; +- if ((COLLECT_RELBLOCK_P) && !(inheap(cp))) +- ROUND_RB_POINTERS_DOUBLE;/*FIXME gc space violation*/ ++ j= sizeof(longfloat)*x->v.v_dim; ++ if ((COLLECT_RELBLOCK_P) && (void *)x->v.v_self>=(void *)heap_end) ++ rb_pointer=PCEI(rb_pointer,sizeof(double)); /*FIXME GC space violation*/ + break; ++ ++ case aet_bit: ++#define W_SIZE (8*sizeof(fixnum)) ++ j= sizeof(fixnum)*((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); ++ break; ++ + case aet_char: + case aet_uchar: +- j=sizeof(char)*x->a.a_dim; ++ j=sizeof(char)*x->v.v_dim; + break; ++ + case aet_short: + case aet_ushort: +- j=sizeof(short)*x->a.a_dim; ++ j=sizeof(short)*x->v.v_dim; + break; ++ ++ case aet_object: ++ if (x->v.v_displaced->c.c_car==Cnil) ++ mark_object_array(x->v.v_self,x->v.v_self+x->v.v_dim); ++ + default: +- j=sizeof(fixnum)*x->fixa.fixa_dim;} +- +- goto COPY; +- +- CASE_GENERAL: +- p = x->a.a_self; +- if (p == NULL +-#ifdef HAVE_ALLOCA +- || (char *)p >= core_end +-#endif +- ) +- break; +- j=0; +- if (x->a.a_displaced->c.c_car == Cnil) +- for (i = 0, j = x->a.a_dim; i < j; i++) +- mark_object(p[i]); +- cp = (char *)p; +- j *= sizeof(object); +- COPY: +- if (inheap(cp)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(cp, j); +- } else if (COLLECT_RELBLOCK_P) { +- if (x->a.a_displaced == Cnil) { +-#ifdef HAVE_ALLOCA +- if (!NULL_OR_ON_C_STACK(cp)) /* only if body of array not on C stack */ +-#endif +- x->a.a_self = (object *)copy_relblock(cp, j); +- } else if (x->a.a_displaced->c.c_car == Cnil) { +- i = (long)(object *)copy_relblock(cp, j) - (long)(x->a.a_self); +- adjust_displaced(x, i); +- } ++ j=sizeof(fixnum)*x->v.v_dim; ++ + } +- break; +- +- case t_vector: +- if ((x->v.v_displaced) != Cnil) +- mark_displaced_field(x); +- if ((enum aelttype)x->v.v_elttype == aet_object) +- goto CASE_GENERAL; +- else +- goto CASE_SPECIAL; +- +- case t_bignum: +-#ifndef GMP_USE_MALLOC +- if ((int)what_to_collect >= (int)t_contiguous) { +- j = MP_ALLOCATED(x); +- cp = (char *)MP_SELF(x); +- if (cp == 0) +- break; +-#ifdef PARI +- if (j != lg(MP(x)) && +- /* we don't bother to zero this register, +- and its contents may get over written */ +- ! (x == big_register_1 && +- (int)(cp) <= top && +- (int) cp >= bot)) +- printf("bad length 0x%x ",x); +-#endif +- j = j * MP_LIMB_SIZE; +- if (inheap(cp)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(cp, j); +- } else if (COLLECT_RELBLOCK_P) { +- MP_SELF(x) = (void *) copy_relblock(cp, j);}} +-#endif /* not GMP_USE_MALLOC */ +- break; +- +- CASE_STRING: +- case t_string: +- if ((x->st.st_displaced) != Cnil) +- mark_displaced_field(x); +- j = x->st.st_dim; +- cp = x->st.st_self; +- if (cp == NULL) +- break; +- COPY_STRING: +- if (inheap(cp)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(cp, j); +- } else if (COLLECT_RELBLOCK_P) { +- if (x->st.st_displaced == Cnil) +- x->st.st_self = copy_relblock(cp, j); +- else if (x->st.st_displaced->c.c_car == Cnil) { +- i = copy_relblock(cp, j) - cp; +- adjust_displaced(x, i); ++ ++ case t_string:/*FIXME*/ ++ j=j ? j : x->st.st_dim; ++ ++ if (x->v.v_displaced->c.c_car==Cnil) { ++ void *p=x->v.v_self; ++ MARK_LEAF_DATA(x,x->v.v_self,j); ++ if (x->v.v_displaced!=Cnil) { ++ j=(void *)x->v.v_self-p; ++ x->v.v_self=p; ++ adjust_displaced(x,j); + } +- } ++ } ++ mark_object(x->v.v_displaced); + break; + +- CASE_BITVECTOR: +- case t_bitvector: +- if ((x->bv.bv_displaced) != Cnil) +- mark_displaced_field(x); +- /* We make bitvectors multiple of sizeof(int) in size allocated +- Assume 8 = number of bits in char */ +- +-#define W_SIZE (8*sizeof(fixnum)) +- j= sizeof(fixnum) * +- ((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); +- cp = x->bv.bv_self; +- if (cp == NULL) +- break; +- goto COPY_STRING; +- + case t_structure: +- mark_object(x->str.str_def); +- p = x->str.str_self; +- if (p == NULL) +- break; + { + object def=x->str.str_def; +- unsigned char * s_type = &SLOT_TYPE(def,0); +- unsigned short *s_pos= & SLOT_POS(def,0); +- for (i = 0, j = S_DATA(def)->length; i < j; i++) +- if (s_type[i]==0) mark_object(STREF(object,x,s_pos[i])); +- if (inheap(x->str.str_self)) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)p,S_DATA(def)->size); +- } else if (COLLECT_RELBLOCK_P) +- x->str.str_self = (object *)copy_relblock((char *)p, S_DATA(def)->size); ++ unsigned char *s_type= &SLOT_TYPE(def,0); ++ unsigned short *s_pos= &SLOT_POS(def,0); ++ mark_object(x->str.str_def); ++ if (x->str.str_self) ++ for (i=0,j=S_DATA(def)->length;istr.str_self,S_DATA(def)->size); + } + break; + +@@ -684,12 +677,11 @@ mark_object(object x) { + case smm_probe: + mark_object(x->sm.sm_object0); + mark_object(x->sm.sm_object1); +- if (what_to_collect == t_contiguous && +- x->sm.sm_fp && +- x->sm.sm_buffer) +- mark_contblock(x->sm.sm_buffer, BUFSIZ); ++ if (x->sm.sm_fp) { ++ MARK_LEAF_DATA(x,x->sm.sm_buffer,BUFSIZ); ++ } + break; +- ++ + case smm_synonym: + mark_object(x->sm.sm_object0); + break; +@@ -720,44 +712,20 @@ mark_object(object x) { + } + break; + +-#define MARK_CP(a_,b_) {fixnum _t=(b_);if (inheap(a_)) {\ +- if (what_to_collect == t_contiguous) mark_contblock((void *)(a_),_t); \ +- } else if (COLLECT_RELBLOCK_P) (a_)=(void *)copy_relblock((void *)(a_),_t);} +- +-#define MARK_MP(a_) {if ((a_)->_mp_d) \ +- MARK_CP((a_)->_mp_d,(a_)->_mp_alloc*MP_LIMB_SIZE);} +- + case t_random: +- if ((int)what_to_collect >= (int)t_contiguous) { +- MARK_MP(x->rnd.rnd_state._mp_seed); +-#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 2) +- if (x->rnd.rnd_state._mp_algdata._mp_lc) { +- MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_a); +- if (!x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m2exp) MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m); +- MARK_CP(x->rnd.rnd_state._mp_algdata._mp_lc,sizeof(*x->rnd.rnd_state._mp_algdata._mp_lc)); +- } +-#endif +- } ++ MARK_LEAF_DATA_ALIGNED(x,x->rnd.rnd_state._mp_seed->_mp_d,x->rnd.rnd_state._mp_seed->_mp_alloc*MP_LIMB_SIZE,MP_LIMB_SIZE); + break; + + case t_readtable: +- if (x->rt.rt_self == NULL) +- break; +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->rt.rt_self), +- RTABSIZE*sizeof(struct rtent)); +- for (i = 0; i < RTABSIZE; i++) { +- mark_object(x->rt.rt_self[i].rte_macro); +- if (x->rt.rt_self[i].rte_dtab != NULL) { +- /**/ +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->rt.rt_self[i].rte_dtab), +- RTABSIZE*sizeof(object)); +- for (j = 0; j < RTABSIZE; j++) +- mark_object(x->rt.rt_self[i].rte_dtab[j]); +- /**/ ++ if (x->rt.rt_self) { ++ for (i=0;irt.rt_self[i].rte_macro,i); ++ for (i=0;irt.rt_self[i].rte_dtab,x->rt.rt_self[i].rte_dtab+RTABSIZE); ++ MARK_LEAF_DATA(x,x->rt.rt_self[i].rte_dtab,RTABSIZE*sizeof(object)); + } + } ++ MARK_LEAF_DATA(x,x->rt.rt_self,RTABSIZE*sizeof(struct rtent)); + break; + + case t_pathname: +@@ -770,13 +738,8 @@ mark_object(object x) { + break; + + case t_closure: +- { +- int i ; +- for (i= 0 ; i < x->cl.cl_envdim ; i++) +- mark_object(x->cl.cl_env[i]); +- if (COLLECT_RELBLOCK_P) +- x->cl.cl_env=(void *)copy_relblock((void *)x->cl.cl_env,x->cl.cl_envdim*sizeof(object)); +- } ++ mark_object_array(x->cl.cl_env,x->cl.cl_env+x->cl.cl_envdim); ++ MARK_LEAF_DATA(x,x->cl.cl_env,x->cl.cl_envdim*sizeof(object)); + + case t_cfun: + case t_sfun: +@@ -789,48 +752,40 @@ mark_object(object x) { + + case t_cfdata: + +- if (x->cfd.cfd_self != NULL) +- {int i=x->cfd.cfd_fillp; +- while(i-- > 0) +- mark_object(x->cfd.cfd_self[i]);} +- if (what_to_collect == t_contiguous) { +- mark_contblock(x->cfd.cfd_start, x->cfd.cfd_size); ++ mark_object_array(x->cfd.cfd_self,x->cfd.cfd_self+x->cfd.cfd_fillp); ++ if (what_to_collect == t_contiguous) + mark_link_array(x->cfd.cfd_start,x->cfd.cfd_start+x->cfd.cfd_size); +- } ++ MARK_LEAF_DATA(NULL,x->cfd.cfd_start,x->cfd.cfd_size);/*Code cannot move*/ + break; +- case t_cclosure: ++ ++ case t_cclosure: + mark_object(x->cc.cc_name); + mark_object(x->cc.cc_env); + mark_object(x->cc.cc_data); +- if (x->cc.cc_turbo!=NULL) { +- mark_object(*(x->cc.cc_turbo-1)); +- if (COLLECT_RELBLOCK_P) +- x->cc.cc_turbo=(void *)copy_relblock((char *)(x->cc.cc_turbo-1),(1+fix(*(x->cc.cc_turbo-1)))*sizeof(object))+sizeof(object); ++ if (x->cc.cc_turbo) { ++ x->cc.cc_turbo--; ++ mark_object_array(x->cc.cc_turbo,x->cc.cc_turbo+fix(x->cc.cc_turbo[0])); ++ MARK_LEAF_DATA(x,x->cc.cc_turbo,(1+fix(x->cc.cc_turbo[0]))*sizeof(*x->cc.cc_turbo)); ++ x->cc.cc_turbo++; + } + break; + + case t_spice: + break; +- default: ++ ++ default: + #ifdef DEBUG + if (debug) + printf("\ttype = %d\n", type_of(x)); + #endif + error("mark botch"); ++ + } ++ + } + + static long *c_stack_where; + +-void **contblock_stack_list=NULL; +- +-#define PAGEINFO_P(pi) (pi->magic==PAGE_MAGIC && pi->type<=t_contiguous) +- +-#ifdef SGC +-static void +-sgc_mark_object1(object); +-#endif +- + static void + mark_stack_carefully(void *topv, void *bottomv, int offset) { + +@@ -865,10 +820,9 @@ mark_stack_carefully(void *topv, void *b + + pageoffset=v-(void *)pagetochar(p); + pi=pagetoinfo(p); +- if (!PAGEINFO_P(pi)) continue; ++ if (!pageinfo_p(pi)) continue; + +- for (a=contblock_stack_list;a && a[0]!=pi;a=a[1]); +- if (a) continue; ++ if ((a=contblock_stack_list) && in_contblock_stack_list(pi,&a)) continue; + + tm=tm_of(pi->type); + if (tm->tm_type>=t_end) continue; +@@ -879,13 +833,10 @@ mark_stack_carefully(void *topv, void *b + + if (is_marked_or_free(x)) continue; + +-#ifdef SGC +- if (sgc_enabled) +- sgc_mark_object(x); +- else +-#endif +- mark_object(x); ++ mark_object(x); ++ + } ++ + } + + +@@ -930,10 +881,6 @@ mark_phase(void) { + + for (pp = pack_pointer; pp != NULL; pp = pp->p_link) + mark_object((object)pp); +-#ifdef KCLOVM +- if (ovm_process_created) +- mark_all_stacks(); +-#endif + + #ifdef DEBUG + if (debug) { +@@ -947,18 +894,18 @@ mark_phase(void) { + (int)what_to_collect < (int)t_contiguous) { + */ + +- {int size; ++ /* {int size; */ + +- for (pp = pack_pointer; pp != NULL; pp = pp->p_link) { +- size = pp->p_internal_size; +- if (pp->p_internal != NULL) +- for (i = 0; i < size; i++) +- mark_object(pp->p_internal[i]); +- size = pp->p_external_size; +- if (pp->p_external != NULL) +- for (i = 0; i < size; i++) +- mark_object(pp->p_external[i]); +- }} ++ /* for (pp = pack_pointer; pp != NULL; pp = pp->p_link) { */ ++ /* size = pp->p_internal_size; */ ++ /* if (pp->p_internal != NULL) */ ++ /* for (i = 0; i < size; i++) */ ++ /* mark_object(pp->p_internal[i]); */ ++ /* size = pp->p_external_size; */ ++ /* if (pp->p_external != NULL) */ ++ /* for (i = 0; i < size; i++) */ ++ /* mark_object(pp->p_external[i]); */ ++ /* }} */ + + /* mark the c stack */ + #ifndef N_RECURSION_REQD +@@ -1055,42 +1002,27 @@ mark_c_stack(jmp_buf env1, int n, void ( + #ifndef C_GC_OFFSET + #define C_GC_OFFSET 0 + #endif +- { +- struct pageinfo *v,*tv;void **a; +- fixnum i; +- for (v=contblock_list_head,contblock_stack_list=NULL;v;v=v->next) +- for (i=1;iin_use;i++) { +- tv=pagetoinfo(page(v)+i); +- if (PAGEINFO_P(tv)) { +- a=contblock_stack_list; +- /* printf("%p\n",tv); */ +- contblock_stack_list=alloca(2*sizeof(a)); +- contblock_stack_list[0]=tv; +- contblock_stack_list[1]=a; +- }} +- +- if (&where > cs_org) +- (*fn)(0,cs_org,C_GC_OFFSET); +- else +- (*fn)(cs_org,0,C_GC_OFFSET); ++ if (&where > cs_org) ++ (*fn)(0,cs_org,C_GC_OFFSET); ++ else ++ (*fn)(cs_org,0,C_GC_OFFSET); + +- contblock_stack_list=NULL; +- }} ++ } + + #if defined(__ia64__) +- { +- extern void * __libc_ia64_register_backing_store_base; +- void * bst=GC_save_regs_in_stack(); +- void * bsb=__libc_ia64_register_backing_store_base; +- +- if (bsb>bst) +- (*fn)(bsb,bst,C_GC_OFFSET); +- else +- (*fn)(bst,bsb,C_GC_OFFSET); +- +- } ++ { ++ extern void * __libc_ia64_register_backing_store_base; ++ void * bst=GC_save_regs_in_stack(); ++ void * bsb=__libc_ia64_register_backing_store_base; ++ ++ if (bsb>bst) ++ (*fn)(bsb,bst,C_GC_OFFSET); ++ else ++ (*fn)(bst,bsb,C_GC_OFFSET); ++ ++ } + #endif +- ++ + } + + static void +@@ -1136,12 +1068,10 @@ static void + contblock_sweep_phase(void) { + + STATIC char *s, *e, *p, *q; +- STATIC struct contblock *cbp; + STATIC struct pageinfo *v; ++ ++ reset_contblock_freelist(); + +- cb_pointer = NULL; +- ncb = 0; +- + for (v=contblock_list_head;v;v=v->next) { + bool z; + +@@ -1163,7 +1093,7 @@ contblock_sweep_phase(void) { + #ifdef DEBUG + if (debug) { + for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link) +- printf("%d-byte contblock\n", cbp->cb_size); ++ printf("%lud-byte contblock\n", cbp->cb_size); + fflush(stdout); + } + #endif +@@ -1175,7 +1105,6 @@ contblock_sweep_phase(void) { + + int (*GBC_enter_hook)() = NULL; + int (*GBC_exit_hook)() = NULL; +-char *old_rb_start; + + /* void */ + /* ttss(void) { */ +@@ -1201,10 +1130,6 @@ fixnum fault_pages=0; + void + GBC(enum type t) { + +- long i,j; +-#ifdef SGC +- int in_sgc = sgc_enabled; +-#endif + #ifdef DEBUG + int tm=0; + #endif +@@ -1216,6 +1141,26 @@ GBC(enum type t) { + t=t_contiguous; + } + ++ ngc_thresh=fix(sSAleaf_collection_thresholdA->s.s_dbind); ++ ++ { /*FIXME try to get this below the setjmp in mark_c_stack*/ ++ struct pageinfo *v,*tv; ++ ufixnum i; ++ void *a; ++ ++ for (v=contblock_list_head,contblock_stack_list=NULL;v;v=v->next) ++ for (i=1;iin_use;i++) { ++ tv=pagetoinfo(page(v)+i); ++ if (pageinfo_p(tv)) { ++ a=contblock_stack_list; ++ /* fprintf(stderr,"pushing %p\n",tv); */ ++ contblock_stack_list=alloca(2*sizeof(a)); ++ contblock_stack_list[0]=tv; ++ contblock_stack_list[1]=a; ++ } ++ } ++ } ++ + if (in_signal_handler && t == t_relocatable) + error("cant gc relocatable in signal handler"); + +@@ -1241,10 +1186,8 @@ GBC(enum type t) { + close_stream(o); + } + +- t = t_relocatable; gc_time = -1; +-#ifdef SGC +- if(sgc_enabled) sgc_quit(); +-#endif ++ /* t = t_relocatable; */ ++ gc_time = -1; + } + + +@@ -1257,10 +1200,15 @@ GBC(enum type t) { + tm_table[(int)t].tm_gbccount++; + tm_table[(int)t].tm_adjgbccnt++; + ++ if (sSAnotify_gbcA->s.s_dbind != Cnil + #ifdef DEBUG +- if (debug || (sSAnotify_gbcA->s.s_dbind != Cnil)) { +- +- if (gc_time < 0) gc_time=0; ++ || debug ++#endif ++ ) { ++ ++ if (gc_time < 0) ++ gc_time=0; ++ + #ifdef SGC + printf("[%s for %ld %s pages..", + (sgc_enabled ? "SGC" : "GC"), +@@ -1272,48 +1220,33 @@ GBC(enum type t) { + (tm_of(t)->tm_npage), + (tm_table[(int)t].tm_name)+1); + #endif ++ + #ifdef SGC + if(sgc_enabled) +- printf("(%ld faulted pages, %ld writable, %ld read only)..",fault_pages,sgc_count_writable(), +- (page(core_end)-first_data_page)-(page(old_rb_start)-page(heap_end))-sgc_count_writable()); ++ printf("(%ld faulted pages, %ld writable, %ld read only)..", ++ fault_pages,(page(core_end)-first_data_page)-(page(rb_start)-page(heap_end))-sgc_count_read_only(), ++ sgc_count_read_only()); + #endif ++ + fflush(stdout); ++ + } +-#endif ++ + if (gc_time >=0 && !gc_recursive++) {gc_start=runtime();} + +- /* maxpage = page(heap_end); */ +- + if (COLLECT_RELBLOCK_P) { + +- i=rb_pointer-REAL_RB_START+PAGESIZE;/*FIXME*/ +- +-#ifdef SGC +- if (sgc_enabled==0) +-#endif +- rb_start = heap_end + PAGESIZE*holepage; ++ char *new_start=heap_end+holepage*PAGESIZE,*new_end=new_start+nrbpage*PAGESIZE; + +- rb_end = heap_end + (holepage + nrbpage) *PAGESIZE; +- +- if (rb_start < rb_pointer) +- rb_start1 = (char *) +- ((long)(rb_pointer + PAGESIZE-1) & -(unsigned long)PAGESIZE); +- else +- rb_start1 = rb_start; +- +- /* as we walk through marking data, we replace the +- relocatable pointers +- in objects by the rb_pointer, advance that +- by the size, and copy the actual +- data there to rb_pointer1, and advance it by the size +- at the end [rb_start1,rb_pointer1] is copied +- to [rb_start,rb_pointer] +- */ +- rb_pointer = rb_start; /* where the new relblock will start */ +- rb_pointer1 = rb_start1;/* where we will copy it to during gc*/ +- +- i = (rb_end < (rb_start1 + i) ? (rb_start1 + i) : rb_end) - heap_end; +- alloc_page(-(i + PAGESIZE - 1)/PAGESIZE); ++ if (new_start!=rb_start) { ++ rb_pointer=new_start; ++ rb_limit=new_end; ++ } else { ++ rb_pointer=(rb_pointertm_sgc == 0) +- {sgc_quit(); +- if (sSAnotify_gbcA->s.s_dbind != Cnil) +- {fprintf(stdout, " (doing full gc)"); +- fflush(stdout);} +- mark_phase();} +- else +- sgc_mark_phase();} ++ sgc_mark_phase(); + else + #endif + mark_phase(); +@@ -1365,27 +1291,16 @@ GBC(enum type t) { + #endif + + if (COLLECT_RELBLOCK_P) { ++ ++ rb_start = heap_end + PAGESIZE*holepage; ++ rb_end = heap_end + (holepage + nrbpage) *PAGESIZE; + +- if (rb_start < rb_start1) { +- j = (rb_pointer-rb_start + PAGESIZE - 1)/PAGESIZE; +- memmove(rb_start,rb_start1,j*PAGESIZE); +- } +- ++ + #ifdef SGC + if (sgc_enabled) + wrimap=(void *)sSAwritableA->s.s_dbind->v.v_self; + #endif + +-#ifdef SGC +- /* we don't know which pages have relblock on them */ +- if(sgc_enabled) { +- fixnum i; +- for (i=page(rb_start);ipromotion_pointer1) { */ ++/* object *p,st; */ ++/* promoting=1; */ ++/* st=alloc_simple_string(""); */ ++/* for (p=promotion_pointer1;pst.st_dim; */ ++ ++/* else switch (x->v.v_elttype) { */ ++ ++/* case aet_lf: */ ++/* j=sizeof(longfloat)*x->v.v_dim; */ ++/* break; */ ++/* case aet_bit: */ ++/* #define W_SIZE (8*sizeof(fixnum)) */ ++/* j=sizeof(fixnum)*((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); */ ++/* break; */ ++/* case aet_char: */ ++/* case aet_uchar: */ ++/* j=sizeof(char)*x->v.v_dim; */ ++/* break; */ ++/* case aet_short: */ ++/* case aet_ushort: */ ++/* j=sizeof(short)*x->v.v_dim; */ ++/* break; */ ++/* default: */ ++/* j=sizeof(fixnum)*x->v.v_dim; */ ++/* } */ ++ ++/* st->st.st_dim=j; */ ++/* st->st.st_self=alloc_contblock(st->st.st_dim); */ ++/* fprintf(stderr,"Promoting vector leaf bytes %lu at %p, %p -> %p\n",j,x,x->v.v_self,st->st.st_self); */ ++/* fflush(stderr); */ ++/* memcpy(st->st.st_self,x->v.v_self,st->st.st_dim); */ ++/* x->v.v_self=(void *)st->st.st_self; */ ++/* } */ ++/* promoting=0; */ ++/* } */ ++/* } */ ++ ++ + #ifdef DEBUG + if (debug) { + for (i = 0, j = 0; i < (int)t_end; i++) { +@@ -1437,11 +1400,6 @@ GBC(enum type t) { + + interrupt_enable = TRUE; + +-#ifdef SGC +- if (in_sgc && sgc_enabled==0) +- sgc_start(); +-#endif +- + if (GBC_exit_hook != NULL) + (*GBC_exit_hook)(); + +@@ -1468,6 +1426,23 @@ GBC(enum type t) { + + } + ++ /* {static int mv; */ ++ /* if (!mv && COLLECT_RELBLOCK_P) { */ ++ /* mv=1; */ ++ /* if (relb_copied) { */ ++ /* sSAstatic_promotion_areaA->s.s_dbind=(VFUN_NARGS=4,fSmake_vector1(make_fixnum(relb_copied),make_fixnum(aet_char),Ct,make_fixnum(0))); */ ++ /* fprintf(stderr,"Making static promotion area %lu bytes\n",relb_copied); */ ++ /* fflush(stderr); */ ++ /* relb_copied=0; */ ++ /* } else { */ ++ /* fprintf(stderr,"Releasing static promotion area\n"); */ ++ /* fflush(stderr); */ ++ /* sSAstatic_promotion_areaA->s.s_dbind=Cnil; */ ++ /* } */ ++ /* mv=0; */ ++ /* } */ ++ /* } */ ++ + collect_both=0; + + END_NO_INTERRUPT; +@@ -1524,11 +1499,16 @@ FFN(siLroom_report)(void) { + vs_push(make_fixnum(available_pages)); + vs_push(make_fixnum(ncbpage)); + vs_push(make_fixnum(maxcbpage)); +- vs_push(make_fixnum(ncb)); ++ { ++ ufixnum ncb; ++ struct contblock *cbp; ++ for (ncb=0,cbp=cb_pointer;cbp;cbp=cbp->cb_link,ncb++); ++ vs_push(make_fixnum(ncb)); ++ } + vs_push(make_fixnum(cbgbccount)); + vs_push(make_fixnum(holepage)); +- vs_push(make_fixnum(rb_pointer - rb_start)); +- vs_push(make_fixnum(rb_end - rb_pointer)); ++ vs_push(make_fixnum(rb_pointer - (rb_pointer= 0) */ +- /* { *q++ = *p++;} */ +- +- return res; ++ memmove(q,p,s);/*FIXME memcpy*/ ++ ++ return q; ++ + } + + +@@ -1595,18 +1572,124 @@ mark_contblock(void *p, int s) { + q = p + s; + /* SGC cont pages: contblock pages must be no smaller than + sizeof(struct contblock). CM 20030827 */ +- x = (char *)ROUND_DOWN_PTR_CONT(p); +- y = (char *)ROUND_UP_PTR_CONT(q); ++ x = (char *)PFLR(p,CPTR_SIZE); ++ y = (char *)PCEI(q,CPTR_SIZE); + v=get_pageinfo(x); + #ifdef SGC + if (!sgc_enabled || (v->sgc_flags&SGC_PAGE_FLAG)) + #endif +- set_mark_bits(v,x,y); ++ set_mark_bits(v,x,y); ++ } ++ ++DEFUN_NEW("CONTIGUOUS-REPORT",object,fScontiguous_report,SI,1,1,NONE,OO,OO,OO,OO,(void),"") { ++ ++ struct contblock **cbpp; ++ struct pageinfo *v; ++ ufixnum i,j,k,s; ++ struct typemanager *tm=tm_of(t_cfdata); ++ void *p; ++ ++ for (i=j=0,cbpp=&cb_pointer;(*cbpp);) { ++ for (k=0,s=(*cbpp)->cb_size,p=*cbpp;*cbpp && (*cbpp)->cb_size==s;i+=(*cbpp)->cb_size,j++,k++,cbpp=&(*cbpp)->cb_link); ++ fprintf(stderr,"%lu %lu starting at %p\n",k,s,p); ++ } ++ fprintf(stderr,"\nTotal free %lu in %lu pieces\n\n",i,j); ++ ++ for (i=j=0,v=contblock_list_head;v;i+=v->in_use,j++,v=v->next) ++ fprintf(stderr,"%lu pages at %p\n",(unsigned long)v->in_use,v); ++ fprintf(stderr,"\nTotal pages %lu in %lu pieces\n\n",i,j); ++ ++ for (i=j=0,v=cell_list_head;v;v=v->next) ++ if (tm->tm_type==v->type) { ++ void *p; ++ ufixnum k; ++ for (p=pagetochar(page(v)),k=0;ktm_nppage;k++,p+=tm->tm_size) { ++ object o=p; ++ if (!is_free(o) && type_of(o)==t_cfdata && (void *)o->cfd.cfd_start>=data_start) { ++ fprintf(stderr,"%lu code bytes at %p\n",(unsigned long)o->cfd.cfd_size,o->cfd.cfd_start); ++ i+=o->cfd.cfd_size; ++ j++; ++ } ++ } ++ } ++ fprintf(stderr,"\nTotal code bytes %lu in %lu pieces\n",i,j); ++ ++ for (i=j=0,v=cell_list_head;v;v=v->next) { ++ struct typemanager *tm=tm_of(v->type); ++ void *p; ++ ufixnum k; ++ for (p=pagetochar(page(v)),k=0;ktm_nppage;k++,p+=tm->tm_size) { ++ object o=p; ++ void *d=NULL; ++ ufixnum s=0; ++ if (!is_free(o)) { ++ switch (type_of(o)) { ++ case t_array: ++ case t_vector: ++ d=o->a.a_self; ++ s=o->a.a_dim*sizeof(object); ++ break; ++ case t_hashtable: ++ d=o->ht.ht_self; ++ s=o->ht.ht_size*sizeof(object)*2; ++ break; ++ case t_symbol: ++ d=o->s.s_self; ++ s=o->s.s_fillp; ++ break; ++ case t_string: ++ case t_bitvector: ++ d=o->a.a_self; ++ s=o->a.a_dim; ++ break; ++ case t_package: ++ d=o->p.p_external; ++ s=(o->p.p_external_size+o->p.p_internal_size)*sizeof(object); ++ break; ++ case t_bignum: ++ d=o->big.big_mpz_t._mp_d; ++ s=o->big.big_mpz_t._mp_alloc*MP_LIMB_SIZE; ++ break; ++ case t_structure: ++ d=o->str.str_self; ++ s=S_DATA(o->str.str_def)->length*sizeof(object); ++ break; ++ case t_random: ++ d=o->rnd.rnd_state._mp_seed->_mp_d; ++ s=o->rnd.rnd_state._mp_seed->_mp_alloc*MP_LIMB_SIZE; ++ break; ++ case t_cclosure: ++ d=o->cc.cc_turbo; ++ s=fix(o->cc.cc_turbo[-1]); ++ break; ++ case t_cfdata: ++ d=o->cfd.cfd_start; ++ s=o->cfd.cfd_size; ++ break; ++ case t_readtable: ++ d=o->rt.rt_self; ++ s=RTABSIZE*(sizeof(struct rtent));/*FIXME*/ ++ break; ++ default: ++ break; ++ } ++ if (d>=data_start && d<(void *)heap_end && s) { ++ fprintf(stderr,"%lu %s bytes at %p\n",s,tm_table[type_of(o)].tm_name,d); ++ i+=s; ++ j++; ++ } ++ } ++ } ++ } ++ fprintf(stderr,"\nTotal leaf bytes %lu in %lu pieces\n",i,j); ++ ++ return Cnil; ++ + } + +-DEFUN_NEW("GBC",object,fLgbc,LISP,1,1,NONE,OO,OO,OO,OO,(object x0),"") { ++DEFUN_NEW("GBC",object,fSgbc,SI,1,1,NONE,OO,OO,OO,OO,(object x0),"") { + +- /* 1 args */ ++ /* 1 args */ + + if (x0 == Ct) + GBC(t_other); +@@ -1650,5 +1733,5 @@ gcl_init_GBC(void) { + #ifdef SGC + make_si_function("SGC-ON",siLsgc_on); + #endif +- ++ + } +--- gcl-2.6.12.orig/o/gmp.c ++++ gcl-2.6.12/o/gmp.c +@@ -18,12 +18,12 @@ static void *gcl_gmp_realloc(void *oldme + MP_SELF(big_gcprotect)=0; + bcopy(old,new,oldsize); + /* SGC contblock pages: Its possible this is on an old page CM 20030827 */ +- if (inheap(oldmem)) +-#ifdef SGC +- insert_maybe_sgc_contblock(oldmem,oldsize); +-#else +- insert_contblock(oldmem,oldsize); +-#endif ++/* if (inheap(oldmem)) */ ++/* #ifdef SGC */ ++/* insert_maybe_sgc_contblock(oldmem,oldsize); */ ++/* #else */ ++/* insert_contblock(oldmem,oldsize); */ ++/* #endif */ + + return new; + } +--- gcl-2.6.12.orig/o/hash.d ++++ gcl-2.6.12/o/hash.d +@@ -30,6 +30,7 @@ object sLequal; + object sKsize; + object sKrehash_size; + object sKrehash_threshold; ++object sKstatic; + + #define MHSH(a_) ((a_) & ~(1UL<<(sizeof(a_)*CHAR_SIZE-1))) + +@@ -295,8 +296,9 @@ object hashtable; + hashtable->ht.ht_rhthresh = + make_fixnum(fix(hashtable->ht.ht_rhthresh) + + (new_size - old->ht.ht_size)); +- hashtable->ht.ht_self = +- (struct htent *)alloc_relblock(new_size * sizeof(struct htent)); ++ hashtable->ht.ht_self = hashtable->ht.ht_static ? ++ (struct htent *)alloc_contblock(new_size * sizeof(struct htent)) : ++ (struct htent *)alloc_relblock(new_size * sizeof(struct htent)); + for (i = 0; i < new_size; i++) { + hashtable->ht.ht_self[i].hte_key = OBJNULL; + hashtable->ht.ht_self[i].hte_value = OBJNULL; +@@ -322,6 +324,7 @@ DEFVAR("*DEFAULT-HASH-TABLE-REHASH-THRES + `sSAdefault_hash_table_rehash_sizeA->s.s_dbind`) + (rehash_threshold + `sSAdefault_hash_table_rehash_thresholdA->s.s_dbind`) ++ (static `Cnil`) + &aux h) + enum httest htt=0; + int i; +@@ -363,9 +366,11 @@ DEFVAR("*DEFAULT-HASH-TABLE-REHASH-THRES + h->ht.ht_rhsize = rehash_size; + h->ht.ht_rhthresh = rehash_threshold; + h->ht.ht_nent = 0; ++ h->ht.ht_static = static!=Cnil ? 1 : 0; + h->ht.ht_self = NULL; +- h->ht.ht_self = (struct htent *) +- alloc_relblock(fix(size) * sizeof(struct htent)); ++ h->ht.ht_self = h->ht.ht_static ? ++ (struct htent *)alloc_contblock(fix(size) * sizeof(struct htent)) : ++ (struct htent *)alloc_relblock(fix(size) * sizeof(struct htent)); + for(i = 0; i < fix(size); i++) { + h->ht.ht_self[i].hte_key = OBJNULL; + h->ht.ht_self[i].hte_value = OBJNULL; +@@ -547,6 +552,7 @@ gcl_init_hash() + sKtest = make_keyword("TEST"); + sKrehash_size = make_keyword("REHASH-SIZE"); + sKrehash_threshold = make_keyword("REHASH-THRESHOLD"); ++ sKstatic = make_keyword("STATIC"); + + make_function("MAKE-HASH-TABLE", Lmake_hash_table); + make_function("HASH-TABLE-P", Lhash_table_p); +--- gcl-2.6.12.orig/o/let.c ++++ gcl-2.6.12/o/let.c +@@ -226,7 +226,7 @@ is an illegal function definition in FLE + top[0] = MMcons(lex[2], def); + top[0] = MMcons(lex[1], top[0]); + top[0] = MMcons(lex[0], top[0]); +- top[0] = MMcons(sLlambda_block_closure, top[0]); ++ top[0] = MMcons(sSlambda_block_closure, top[0]); + lex_fun_bind(MMcar(def), top[0]); + def_list = MMcdr(def_list); + } +@@ -262,7 +262,7 @@ is an illegal function definition in LAB + top[0] = MMcons(Cnil, top[0]); + top[1] = MMcons(top[0], top[1]); + top[0] = MMcons(lex[0], top[0]); +- top[0] = MMcons(sLlambda_block_closure, top[0]); ++ top[0] = MMcons(sSlambda_block_closure, top[0]); + lex_fun_bind(MMcar(def), top[0]); + def_list = MMcdr(def_list); + } +@@ -315,8 +315,8 @@ gcl_init_let(void) + make_special_form("LET", Flet); + make_special_form("LET*", FletA); + make_special_form("MULTIPLE-VALUE-BIND", Fmultiple_value_bind); +- make_special_form("COMPILER-LET", Fcompiler_let); + make_special_form("FLET",Fflet); + make_special_form("LABELS",Flabels); + make_special_form("MACROLET",Fmacrolet); ++ make_si_special_form("COMPILER-LET", Fcompiler_let); + } +--- gcl-2.6.12.orig/o/lex.c ++++ gcl-2.6.12/o/lex.c +@@ -58,7 +58,7 @@ lex_macro_bind(object name, object exp_f + { + object *top = vs_top; + vs_push(make_cons(exp_fun, Cnil)); +- top[0] = make_cons(sLmacro, top[0]); ++ top[0] = make_cons(sSmacro, top[0]); + top[0] = make_cons(name, top[0]); + lex_env[1]=make_cons(top[0], lex_env[1]); + vs_top = top; +@@ -70,7 +70,7 @@ lex_tag_bind(object tag, object id) + object *top = vs_top; + + vs_push(make_cons(id, Cnil)); +- top[0] = make_cons(sLtag, top[0]); ++ top[0] = make_cons(sStag, top[0]); + top[0] = make_cons(tag, top[0]); + lex_env[2] =make_cons(top[0], lex_env[2]); + vs_top = top; +@@ -95,7 +95,7 @@ lex_tag_sch(object tag) + object alist = lex_env[2]; + + while (!endp(alist)) { +- if (eql(MMcaar(alist), tag) && MMcadar(alist) == sLtag) ++ if (eql(MMcaar(alist), tag) && MMcadar(alist) == sStag) + return(MMcar(alist)); + alist = MMcdr(alist); + } +@@ -120,10 +120,10 @@ gcl_init_lex(void) + { + /* sLfunction = make_ordinary("FUNCTION"); */ + /* enter_mark_origin(&sLfunction); */ +- sLmacro = make_ordinary("MACRO"); +- enter_mark_origin(&sLmacro); +- sLtag = make_ordinary("TAG"); +- enter_mark_origin(&sLtag); ++ sSmacro = make_si_ordinary("MACRO"); ++ enter_mark_origin(&sSmacro); ++ sStag = make_si_ordinary("TAG"); ++ enter_mark_origin(&sStag); + sLblock = make_ordinary("BLOCK"); + enter_mark_origin(&sLblock); + } +--- gcl-2.6.12.orig/o/macros.c ++++ gcl-2.6.12/o/macros.c +@@ -161,7 +161,7 @@ macro_def(object form) + return(head->s.s_gfdef); + else + return(Cnil); +- else if (MMcadr(fd) == sLmacro) ++ else if (MMcadr(fd) == sSmacro) + return(MMcaddr(fd)); + else + return(Cnil); +@@ -279,7 +279,7 @@ macro_expand(object form) + exp_fun = head->s.s_gfdef; + else + return(form); +- else if (MMcadr(fd) == sLmacro) ++ else if (MMcadr(fd) == sSmacro) + exp_fun = MMcaddr(fd); + else + return(form); +@@ -316,7 +316,7 @@ LOOP: + exp_fun = head->s.s_gfdef; + else + goto END; +- else if (MMcadr(fd) == sLmacro) ++ else if (MMcadr(fd) == sSmacro) + exp_fun = MMcaddr(fd); + else + goto END; +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -182,30 +182,41 @@ get_phys_pages_no_malloc(void) { + #else + + ufixnum +-get_phys_pages_no_malloc(void) { +- int l; ++get_proc_meminfo_value_in_pages(const char *k) { ++ int l,m; + char b[PAGESIZE],*c; +- const char *k="MemTotal:",*f="/proc/meminfo"; +- ufixnum res=0,n; ++ ufixnum n; + +- if ((l=open(f,O_RDONLY))!=-1) { +- if ((n=read(l,b,sizeof(b)))>(PAGEWIDTH-10); ++ massert((l=open("/proc/meminfo",O_RDONLY))!=-1); ++ massert((n=read(l,b,sizeof(b)))>(PAGEWIDTH-10); ++} ++ ++ufixnum ++get_phys_pages_no_malloc(char freep) { ++ return freep ? ++ get_proc_meminfo_value_in_pages("MemFree:")+ ++ get_proc_meminfo_value_in_pages("Buffers:")+ ++ get_proc_meminfo_value_in_pages("Cached:") : ++ get_proc_meminfo_value_in_pages("MemTotal:"); + } + + #endif + ++void *initial_sbrk=NULL; ++ + int + update_real_maxpage(void) { + + ufixnum i,j,k; + void *end,*cur,*beg; ++ ufixnum free_phys_pages=get_phys_pages_no_malloc(1),maxpages; + #ifdef __MINGW32__ + static fixnum n; + +@@ -215,6 +226,8 @@ update_real_maxpage(void) { + } + #endif + ++ phys_pages=get_phys_pages_no_malloc(1); ++ + massert(cur=sbrk(0)); + beg=data_start ? data_start : cur; + for (i=0,j=(1L<PAGESIZE;j>>=1) +@@ -225,30 +238,46 @@ update_real_maxpage(void) { + } + massert(!mbrk(cur)); + +- phys_pages=get_phys_pages_no_malloc(); ++/* phys_pages=get_phys_pages_no_malloc(0); */ + +-#ifdef BRK_DOES_NOT_GUARANTEE_ALLOCATION +- if (phys_pages>0 && real_maxpage>phys_pages+page(beg)) real_maxpage=phys_pages+page(beg); +-#endif ++/* #ifdef BRK_DOES_NOT_GUARANTEE_ALLOCATION */ ++/* if (phys_pages>0 && real_maxpage>phys_pages+page(beg)) real_maxpage=phys_pages+page(beg); */ ++/* #endif */ ++ ++ maxpages=real_maxpage-page(beg); + +- available_pages=real_maxpage-page(beg); ++ free_phys_pages=free_phys_pages>maxpages ? maxpages : free_phys_pages; ++ ++ resv_pages=available_pages=0; ++ available_pages=check_avail_pages(); ++ + for (i=t_start,j=0;is.s_dbind!=Cnil) { + +- new_holepage=available_pages/starting_hole_div; +- k=available_pages/20; +- j*=starting_relb_heap_mult; +- j=j>1); ++ } ++ ++ new_holepage=0; ++ for (i=t_start;i= dend) { + minimize_image(); + log_maxpage_bound=l; +@@ -352,6 +369,8 @@ gcl_mprotect(void *v,unsigned long l,int + } + #endif + ++DEFVAR("*CODE-BLOCK-RESERVE*",sSAcode_block_reserveA,SI,Cnil,""); ++ + int + main(int argc, char **argv, char **envp) { + +@@ -430,9 +449,10 @@ main(int argc, char **argv, char **envp) + gcl_init_readline_function(); + #endif + #ifdef NEED_STACK_CHK_GUARD +- __stack_chk_guard=random_ulong();/*Cannot be safely set inside a function which returns*/ ++ __stack_chk_guard=random_ulong();/*Cannot be safely set inside a function which returns*/ + #endif +- ++ allocate_code_block_reserve(); ++ + } + + #ifdef _WIN32 +@@ -549,22 +569,10 @@ initlisp(void) { + import(Ct, lisp_package); + export(Ct, lisp_package); + +-#ifdef ANSI_COMMON_LISP +-/* Cnil->s.s_hpack = common_lisp_package; */ +- import(Cnil, common_lisp_package); +- export(Cnil, common_lisp_package); +- +-/* Ct->s.s_hpack = common_lisp_package; */ +- import(Ct, common_lisp_package); +- export(Ct, common_lisp_package); +-#endif +- +-/* sLquote = make_ordinary("QUOTE"); */ +-/* sLfunction = make_ordinary("FUNCTION"); */ + sLlambda = make_ordinary("LAMBDA"); +- sLlambda_block = make_ordinary("LAMBDA-BLOCK"); +- sLlambda_closure = make_ordinary("LAMBDA-CLOSURE"); +- sLlambda_block_closure = make_ordinary("LAMBDA-BLOCK-CLOSURE"); ++ sSlambda_block = make_si_ordinary("LAMBDA-BLOCK"); ++ sSlambda_closure = make_si_ordinary("LAMBDA-CLOSURE"); ++ sSlambda_block_closure = make_si_ordinary("LAMBDA-BLOCK-CLOSURE"); + sLspecial = make_ordinary("SPECIAL"); + + +@@ -702,7 +710,7 @@ segmentation_catcher(int i) { + /* error("end of file"); */ + /* } */ + +-DEFUNO_NEW("BYE",object,fLbye,LISP ++DEFUNO_NEW("BYE",object,fSbye,SI + ,0,1,NONE,OO,OO,OO,OO,void,Lby,(object exitc),"") + { int n=VFUN_NARGS; + int exit_code; +@@ -714,9 +722,9 @@ DEFUNO_NEW("BYE",object,fLbye,LISP + } + + +-DEFUN_NEW("QUIT",object,fLquit,LISP ++DEFUN_NEW("QUIT",object,fSquit,SI + ,0,1,NONE,OO,OO,OO,OO,(object exitc),"") +-{ return FFN(fLbye)(exitc); } ++{ return FFN(fSbye)(exitc); } + + /* DEFUN_NEW("EXIT",object,fLexit,LISP */ + /* ,0,1,NONE,OI,OO,OO,OO,(fixnum exitc),"") */ +@@ -976,8 +984,8 @@ FFN(siLsave_system)(void) { + + saving_system = FALSE; + +- Lsave(); +- alloc_page(-(holepage+nrbpage)); ++ siLsave(); ++ alloc_page(-(holepage+2*nrbpage)); + + } + +@@ -990,7 +998,7 @@ DEFVAR("*COMMAND-ARGS*",sSAcommand_argsA + static void + init_main(void) { + +- make_function("BY", Lby); ++ make_si_function("BY", Lby); + make_si_function("ARGC", siLargc); + make_si_function("ARGV", siLargv); + +--- gcl-2.6.12.orig/o/package.d ++++ gcl-2.6.12/o/package.d +@@ -1159,17 +1159,12 @@ gcl_init_package() + { + + lisp_package +- = make_package(make_simple_string("LISP"), +- Cnil, Cnil,47,509); ++ = make_package(make_simple_string("COMMON-LISP"), ++ list(2,make_simple_string("CL"),make_simple_string("LISP")),Cnil,47,509); + user_package +- = make_package(make_simple_string("USER"), +- Cnil, ++ = make_package(make_simple_string("COMMON-LISP-USER"), ++ list(2,make_simple_string("CL-USER"),make_simple_string("USER")), + make_cons(lisp_package, Cnil),509,97); +-#ifdef ANSI_COMMON_LISP +- common_lisp_package +- = make_package(make_simple_string("COMMON-LISP"), +- Cnil, Cnil,47,509); +-#endif + keyword_package + = make_package(make_simple_string("KEYWORD"), + Cnil, Cnil,11,509); +--- gcl-2.6.12.orig/o/predicate.c ++++ gcl-2.6.12/o/predicate.c +@@ -341,9 +341,9 @@ DEFUNO_NEW("FUNCTIONP",object,fLfunction + x0 = Cnil; } + else if (t == t_cons) { + x = x0->c.c_car; +- if (x == sLlambda || x == sLlambda_block || ++ if (x == sLlambda || x == sSlambda_block || + x == sSlambda_block_expanded || +- x == sLlambda_closure || x == sLlambda_block_closure) ++ x == sSlambda_closure || x == sSlambda_block_closure) + x0 = Ct; + else + x0 = Cnil; +@@ -358,6 +358,14 @@ fLfunctionp(object x) { + #endif + + ++DEFUNO_NEW("COMMONP",object,fScommonp,SI,1,1,NONE,OO,OO,OO,OO,void,siLcommonp,(object x0),"") { ++ if (type_of(x0) != t_spice) ++ x0 = Ct; ++ else ++ x0 = Cnil; ++ RETURN1(x0); ++} ++ + DEFUNO_NEW("COMPILED-FUNCTION-P",object,fLcompiled_function_p,LISP + ,1,1,NONE,OO,OO,OO,OO,void,Lcompiled_function_p,(object x0),"") + +@@ -377,18 +385,6 @@ DEFUNO_NEW("COMPILED-FUNCTION-P",object, + x0 = Ct; + else + x0 = Cnil; +-RETURN1(x0);} +- +-DEFUNO_NEW("COMMONP",object,fLcommonp,LISP +- ,1,1,NONE,OO,OO,OO,OO,void,Lcommonp,(object x0),"") +- +-{ +- /* 1 args */; +- +- if (type_of(x0) != t_spice) +- x0 = Ct; +- else +- x0 = Cnil; + RETURN1(x0);} + + DEFUN_NEW("EQ",object,fLeq,LISP,2,2,NONE,OO,OO,OO,OO,(object x0,object x1),"") { +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -2152,7 +2152,8 @@ LFD(Lreadtablep)() + rdtbl->rt.rt_self[c].rte_chattrib + = cat_terminating; + rdtbl->rt.rt_self[c].rte_macro = fnc; +- @(return Ct) ++ SGC_TOUCH(rdtbl); ++ @(return Ct) + @) + + @(defun get_macro_character (chr &optional (rdtbl `current_readtable()`)) +--- gcl-2.6.12.orig/o/reference.c ++++ gcl-2.6.12/o/reference.c +@@ -82,7 +82,7 @@ LFD(Lsymbol_function)(void) + FEundefined_function(sym); + if (sym->s.s_mflag) { + vs_push(sym->s.s_gfdef); +- vs_base[0] = sLmacro; ++ vs_base[0] = sSmacro; + stack_cons(); + return; + } +@@ -131,7 +131,7 @@ FFN(Ffunction)(object form) + vs_base[0] = MMcons(lex_env[2], vs_base[0]); + vs_base[0] = MMcons(lex_env[1], vs_base[0]); + vs_base[0] = MMcons(lex_env[0], vs_base[0]); +- vs_base[0] = MMcons(sLlambda_closure, vs_base[0]); ++ vs_base[0] = MMcons(sSlambda_closure, vs_base[0]); + } else + FEinvalid_function(fun); + } +@@ -173,7 +173,7 @@ LFD(Lmacro_function)(void) + vs_base[0] = Cnil; + } + +-LFD(Lspecial_form_p)(void) ++LFD(Lspecial_operator_p)(void) + { + check_arg(1); + if (type_of(vs_base[0]) != t_symbol) +@@ -194,7 +194,6 @@ gcl_init_reference(void) + make_function("SYMBOL-VALUE", Lsymbol_value); + make_function("BOUNDP", Lboundp); + make_function("MACRO-FUNCTION", Lmacro_function); +- make_function("SPECIAL-FORM-P", Lspecial_form_p); +- make_function("SPECIAL-OPERATOR-P", Lspecial_form_p); ++ make_function("SPECIAL-OPERATOR-P", Lspecial_operator_p); + } + +--- gcl-2.6.12.orig/o/run_process.c ++++ gcl-2.6.12/o/run_process.c +@@ -432,7 +432,7 @@ enum smmode smm; + stream->sm.sm_fp = fp; + stream->sm.sm_buffer = 0; + +- stream->sm.sm_object0 = sLstring_char; ++ stream->sm.sm_object0 = sLcharacter; + stream->sm.sm_object1 = host_l; + stream->sm.sm_int0 = stream->sm.sm_int1 = 0; + vs_push(stream); +--- gcl-2.6.12.orig/o/save.c ++++ gcl-2.6.12/o/save.c +@@ -16,11 +16,12 @@ memory_save(char *original_file, char *s + extern void _cleanup(); + #endif + +-LFD(Lsave)(void) { ++LFD(siLsave)(void) { + + char filename[256]; + extern char *kcl_self; +- ++ extern void *initial_sbrk; ++ + check_arg(1); + check_type_or_pathname_string_symbol_stream(&vs_base[0]); + coerce_to_filename(vs_base[0], filename); +@@ -33,7 +34,8 @@ LFD(Lsave)(void) { + + raw_image=FALSE; + cs_org=0; +- ++ initial_sbrk=core_end; ++ + #ifdef MEMORY_SAVE + MEMORY_SAVE(kcl_self,filename); + #else +--- gcl-2.6.12.orig/o/sfaslbfd.c ++++ gcl-2.6.12/o/sfaslbfd.c +@@ -212,7 +212,7 @@ fasload(object faslfile) { + + set_type_of(&dum,t_stream); + dum.sm.sm_mode=smm_input; +- dum.sm.sm_object0=sLstring_char; ++ dum.sm.sm_object0=sLcharacter; + + link_callbacks.add_archive_element=madd_archive_element; + link_callbacks.multiple_definition=mmultiple_definition; +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -58,7 +58,7 @@ License for more details. + #define LOAD_SYM(sym) ({ul _b=ELF_ST_BIND(sym->st_info),_t=ELF_ST_TYPE(sym->st_info); \ + sym->st_value && (_b==STB_GLOBAL || _b==STB_WEAK || (_t>=STT_LOPROC && _t<=STT_HIPROC));}) + +-#define MASK(n) (~(~0L << (n))) ++#define MASK(n) (~(~0ULL << (n))) + + + +@@ -242,6 +242,46 @@ relocate_symbols(Sym *sym,Sym *syme,Shdr + + } + ++#ifndef MAX_CODE_ADDRESS ++#define MAX_CODE_ADDRESS -1UL ++#endif ++ ++static void * ++alloc_memory(ul sz) { ++ ++ void *v; ++ ++ if (sSAcode_block_reserveA && ++ sSAcode_block_reserveA->s.s_dbind!=Cnil && sSAcode_block_reserveA->s.s_dbind->st.st_dim>=sz) { ++ ++ v=sSAcode_block_reserveA->s.s_dbind->st.st_self; ++ sSAcode_block_reserveA->s.s_dbind->st.st_self+=sz; ++ sSAcode_block_reserveA->s.s_dbind->st.st_dim-=sz; ++ sSAcode_block_reserveA->s.s_dbind->st.st_fillp=sSAcode_block_reserveA->s.s_dbind->st.st_dim; ++ ++ } else ++ v=alloc_contblock(sz); ++ ++ massert(v && (ul)(v+sz)s.s_dbind=alloc_simple_string(n); ++ sSAcode_block_reserveA->s.s_dbind->st.st_self=alloc_memory(n); ++ ++} ++ + static object + load_memory(Shdr *sec1,Shdr *sece,void *v1,ul **got,ul **gote) { + +@@ -275,9 +315,7 @@ load_memory(Shdr *sec1,Shdr *sece,void * + memory->cfd.cfd_size=sz; + memory->cfd.cfd_self=0; + memory->cfd.cfd_start=0; +- prefer_low_mem_contblock=TRUE; +- memory->cfd.cfd_start=alloc_contblock(sz); +- prefer_low_mem_contblock=FALSE; ++ memory->cfd.cfd_start=alloc_memory(sz); + + a=(ul)memory->cfd.cfd_start; + a=(a+ma)&~ma; +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -7,9 +7,6 @@ + + */ + +-static void +-sgc_mark_object1(object); +- + #ifdef BSD + /* ulong may have been defined in mp.h but the define is no longer needed */ + #undef ulong +@@ -51,81 +48,12 @@ int gclmprotect ( void *addr, size_t len + + #include + +-/* void segmentation_catcher(void); */ +- +- +-#define sgc_mark_pack_list(u) \ +-do {register object xtmp = u; \ +- while (xtmp != Cnil) \ +- {if (ON_WRITABLE_PAGE(xtmp)) {mark(xtmp);} \ +- sgc_mark_object(xtmp->c.c_car); \ +- xtmp=Scdr(xtmp);}}while(0) +- +- + #ifdef SDEBUG + object sdebug; + joe1(){;} + joe() {;} + #endif + +-/* static void */ +-/* sgc_mark_cons(object x) { */ +- +-/* cs_check(x); */ +- +-/* /\* x is already marked. *\/ */ +- +-/* BEGIN: */ +-/* #ifdef SDEBUG */ +-/* if(x==sdebug) joe1(); */ +-/* #endif */ +-/* sgc_mark_object(x->c.c_car); */ +-/* #ifdef OLD */ +-/* IF_WRITABLE(x->c.c_car, goto MARK_CAR;); */ +-/* goto MARK_CDR; */ +- +-/* MARK_CAR: */ +-/* if (!is_marked_or_free(x->c.c_car)) { */ +-/* if (consp(x->c.c_car)) { */ +-/* mark(x->c.c_car); */ +-/* sgc_mark_cons(x->c.c_car); */ +-/* } else */ +-/* sgc_mark_object1(x->c.c_car);} */ +-/* MARK_CDR: */ +-/* #endif */ +-/* /\* if (is_imm_fixnum(x->c.c_cdr)) return; *\/ */ +-/* x = Scdr(x); */ +-/* IF_WRITABLE(x, goto WRITABLE_CDR;); */ +-/* return; */ +-/* WRITABLE_CDR: */ +-/* if (is_marked_or_free(x)) return; */ +-/* if (consp(x)) { */ +-/* mark(x); */ +-/* goto BEGIN; */ +-/* } */ +-/* sgc_mark_object1(x); */ +-/* } */ +- +-inline void +-sgc_mark_cons(object x) { +- +- do { +- object d=x->c.c_cdr; +- mark(x); +- sgc_mark_object(x->c.c_car); +- x=d; +- if (!IS_WRITABLE(page(x)) || is_marked_or_free(x))/*catches Cnil*/ +- return; +- } while (cdr_listp(x)); +- sgc_mark_object(x); +- +-} +- +-/* Whenever two arrays are linked together by displacement, +- if one is live, the other will be made live */ +-#define sgc_mark_displaced_field(ar) sgc_mark_object(ar->a.a_displaced) +- +- + /* structures and arrays of type t, need to be marked if their + bodies are not write protected even if the headers are. + So we should keep these on pages particular to them. +@@ -134,415 +62,6 @@ sgc_mark_cons(object x) { + This takes only 1.47 as opposed to 1.33 microseconds per set. + */ + static void +-sgc_mark_object1(object x) { +- +- fixnum i,j; +- object *p; +- char *cp; +- enum type tp; +- +- cs_check(x); +- BEGIN: +-#ifdef SDEBUG +- if (x == OBJNULL || !ON_WRITABLE_PAGE(x)) +- return; +- IF_WRITABLE(x,goto OK); +- joe(); +- OK: +-#endif +- if (is_marked_or_free(x)) +- return; +-#ifdef SDEBUG +- if(x==sdebug) joe1(); +-#endif +- +- tp=type_of(x); +- +- if (tp==t_cons) { +- sgc_mark_cons(x); +- return; +- } +- +- mark(x); +- +- switch (tp) { +- +- case t_fixnum: +- break; +- +- case t_ratio: +- sgc_mark_object(x->rat.rat_num); +- x = x->rat.rat_den; +- IF_WRITABLE(x,if(!is_marked_or_free(x)) goto BEGIN); +- +- case t_shortfloat: +- break; +- +- case t_longfloat: +- break; +- +- case t_complex: +- sgc_mark_object(x->cmp.cmp_imag); +- x = x->cmp.cmp_real; +- IF_WRITABLE(x,if(!is_marked_or_free(x)) goto BEGIN); +- +- case t_character: +- break; +- +- case t_symbol: +- IF_WRITABLE(x->s.s_plist,if(!is_marked_or_free(x->s.s_plist)) +- {/* mark(x->s.s_plist); */ +- sgc_mark_cons(x->s.s_plist);}); +- sgc_mark_object(x->s.s_gfdef); +- sgc_mark_object(x->s.s_dbind); +- if (x->s.s_self == NULL) +- break; +- /* to do */ +- if (inheap(x->s.s_self)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(x->s.s_self,x->s.s_fillp); +- } else if (SGC_RELBLOCK_P(x->s.s_self) && COLLECT_RELBLOCK_P) +- x->s.s_self = copy_relblock(x->s.s_self, x->s.s_fillp); +- break; +- +- case t_package: +- sgc_mark_object(x->p.p_name); +- sgc_mark_object(x->p.p_nicknames); +- sgc_mark_object(x->p.p_shadowings); +- sgc_mark_object(x->p.p_uselist); +- sgc_mark_object(x->p.p_usedbylist); +- if (what_to_collect == t_contiguous) { +- if (x->p.p_internal != NULL) +- mark_contblock((char *)(x->p.p_internal), +- x->p.p_internal_size*sizeof(object)); +- if (x->p.p_external != NULL) +- mark_contblock((char *)(x->p.p_external), +- x->p.p_external_size*sizeof(object)); +- } +- break; +- +- case t_hashtable: +- sgc_mark_object(x->ht.ht_rhsize); +- sgc_mark_object(x->ht.ht_rhthresh); +- if (x->ht.ht_self == NULL) +- break; +- for (i = 0, j = x->ht.ht_size; i < j; i++) { +- if (ON_WRITABLE_PAGE(&x->ht.ht_self[i])) { +- sgc_mark_object(x->ht.ht_self[i].hte_key); +- sgc_mark_object(x->ht.ht_self[i].hte_value); +- } +- } +- if (inheap(x->ht.ht_self)) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->ht.ht_self),j * sizeof(struct htent)); +- } else if (SGC_RELBLOCK_P(x->ht.ht_self) && COLLECT_RELBLOCK_P) +- x->ht.ht_self=(void *)copy_relblock((char *)x->ht.ht_self,j*sizeof(struct htent));; +- break; +- +- case t_array: +- if ((x->a.a_displaced) != Cnil) +- sgc_mark_displaced_field(x); +- if (x->a.a_dims != NULL) { +- if (inheap(x->a.a_dims)) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->a.a_dims),sizeof(int)*x->a.a_rank); +- } else if (SGC_RELBLOCK_P(x->a.a_dims) && COLLECT_RELBLOCK_P) +- x->a.a_dims = (int *) copy_relblock((char *)(x->a.a_dims),sizeof(int)*x->a.a_rank); +- } +- if ((enum aelttype)x->a.a_elttype == aet_ch) +- goto CASE_STRING; +- if ((enum aelttype)x->a.a_elttype == aet_bit) +- goto CASE_BITVECTOR; +- if ((enum aelttype)x->a.a_elttype == aet_object) +- goto CASE_GENERAL; +- +- CASE_SPECIAL: +- cp = (char *)(x->fixa.fixa_self); +- if (cp == NULL) +- break; +- /* set j to the size in char of the body of the array */ +- +- switch((enum aelttype)x->a.a_elttype){ +- case aet_lf: +- j= sizeof(longfloat)*x->lfa.lfa_dim; +- if ((COLLECT_RELBLOCK_P) && !(inheap(cp)) && SGC_RELBLOCK_P(x->a.a_self)) +- ROUND_RB_POINTERS_DOUBLE;/*FIXME gc space violation*/ +- break; +- case aet_char: +- case aet_uchar: +- j=sizeof(char)*x->a.a_dim; +- break; +- case aet_short: +- case aet_ushort: +- j=sizeof(short)*x->a.a_dim; +- break; +- default: +- j=sizeof(fixnum)*x->fixa.fixa_dim;} +- +- goto COPY; +- +- CASE_GENERAL: +- p = x->a.a_self; +- if (p == NULL +-#ifdef HAVE_ALLOCA +- || (char *)p >= core_end +-#endif +- +- ) +- break; +- j=0; +- if (x->a.a_displaced->c.c_car == Cnil) +- for (i = 0, j = x->a.a_dim; i < j; i++) +- if (ON_WRITABLE_PAGE(&p[i])) +- sgc_mark_object(p[i]); +- cp = (char *)p; +- j *= sizeof(object); +- COPY: +- if (inheap(cp)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(cp, j); +- } else if (SGC_RELBLOCK_P(cp) && COLLECT_RELBLOCK_P) { +- if (x->a.a_displaced == Cnil) { +-#ifdef HAVE_ALLOCA +- if (!NULL_OR_ON_C_STACK(cp)) /* only if body of array not on C stack */ +-#endif +- x->a.a_self = (object *)copy_relblock(cp, j); +- } else if (x->a.a_displaced->c.c_car == Cnil) { +- i = (long)(object *)copy_relblock(cp, j) - (long)(x->a.a_self); +- adjust_displaced(x, i); +- } +- } +- break; +- +- case t_vector: +- if ((x->v.v_displaced) != Cnil) +- sgc_mark_displaced_field(x); +- if ((enum aelttype)x->v.v_elttype == aet_object) +- goto CASE_GENERAL; +- else +- goto CASE_SPECIAL; +- +- case t_bignum: +-#ifdef SDEBUG +- if (TYPE_MAP(page(x->big.big_self)) < t_contiguous) +- printf("bad body for %x (%x)\n",x,cp); +-#endif +-#ifndef GMP_USE_MALLOC +- j = MP_ALLOCATED(x); +- cp = (char *)MP_SELF(x); +- if (cp == 0) +- break; +- j = j * MP_LIMB_SIZE; +- if (inheap(cp)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(cp, j); +- } else if (SGC_RELBLOCK_P(cp) && COLLECT_RELBLOCK_P) +- MP_SELF(x) = (void *) copy_relblock(cp, j); +-#endif /* not GMP_USE_MALLOC */ +- break; +- +- +- CASE_STRING: +- case t_string: +- if ((x->st.st_displaced) != Cnil) +- sgc_mark_displaced_field(x); +- j = x->st.st_dim; +- cp = x->st.st_self; +- if (cp == NULL) +- break; +- +- COPY_STRING: +- if (inheap(cp)) { +- if (what_to_collect == t_contiguous) +- mark_contblock(cp, j); +- } else if (SGC_RELBLOCK_P(cp) && COLLECT_RELBLOCK_P) { +- if (x->st.st_displaced == Cnil) +- x->st.st_self = copy_relblock(cp, j); +- else if (x->st.st_displaced->c.c_car == Cnil) { +- i = copy_relblock(cp, j) - cp; +- adjust_displaced(x, i); +- } +- } +- break; +- +- CASE_BITVECTOR: +- case t_bitvector: +- if ((x->bv.bv_displaced) != Cnil) +- sgc_mark_displaced_field(x); +- /* We make bitvectors multiple of sizeof(int) in size allocated +- Assume 8 = number of bits in char */ +- +-#define W_SIZE (8*sizeof(fixnum)) +- j= sizeof(fixnum) * +- ((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); +- cp = x->bv.bv_self; +- if (cp == NULL) +- break; +- goto COPY_STRING; +- +- case t_structure: +- sgc_mark_object(x->str.str_def); +- p = x->str.str_self; +- if (p == NULL) +- break; +- { +- object def=x->str.str_def; +- unsigned char *s_type = &SLOT_TYPE(def,0); +- unsigned short *s_pos = &SLOT_POS (def,0); +- for (i = 0, j = S_DATA(def)->length; i < j; i++) +- if (s_type[i]==0 && ON_WRITABLE_PAGE(&STREF(object,x,s_pos[i]))) +- sgc_mark_object(STREF(object,x,s_pos[i])); +- if (inheap(x->str.str_self)) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)p,S_DATA(def)->size); +- } else if (SGC_RELBLOCK_P(p) && (COLLECT_RELBLOCK_P)) +- x->str.str_self = (object *) copy_relblock((char *)p, S_DATA(def)->size); +- } +- break; +- +- case t_stream: +- switch (x->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_io: +- case smm_socket: +- case smm_probe: +- sgc_mark_object(x->sm.sm_object0); +- sgc_mark_object(x->sm.sm_object1); +- if (what_to_collect == t_contiguous && +- x->sm.sm_fp && +- x->sm.sm_buffer) +- mark_contblock(x->sm.sm_buffer, BUFSIZ); +- break; +- +- case smm_synonym: +- sgc_mark_object(x->sm.sm_object0); +- break; +- +- case smm_broadcast: +- case smm_concatenated: +- sgc_mark_object(x->sm.sm_object0); +- break; +- +- case smm_two_way: +- case smm_echo: +- sgc_mark_object(x->sm.sm_object0); +- sgc_mark_object(x->sm.sm_object1); +- break; +- +- case smm_string_input: +- case smm_string_output: +- sgc_mark_object(x->sm.sm_object0); +- break; +-#ifdef USER_DEFINED_STREAMS +- case smm_user_defined: +- sgc_mark_object(x->sm.sm_object0); +- sgc_mark_object(x->sm.sm_object1); +- break; +-#endif +- default: +- error("mark stream botch"); +- } +- break; +- +-#define SGC_MARK_CP(a_,b_) {fixnum _t=(b_);if (inheap((a_))) {\ +- if (what_to_collect == t_contiguous) mark_contblock((void *)(a_),_t); \ +- } else if (SGC_RELBLOCK_P((a_)) && COLLECT_RELBLOCK_P) (a_)=(void *)copy_relblock((void *)(a_),_t);} +- +-#define SGC_MARK_MP(a_) {if ((a_)->_mp_d) SGC_MARK_CP((a_)->_mp_d,(a_)->_mp_alloc*MP_LIMB_SIZE);} +- +- case t_random: +- SGC_MARK_MP(x->rnd.rnd_state._mp_seed); +-#if __GNU_MP_VERSION < 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR < 2) +- if (x->rnd.rnd_state._mp_algdata._mp_lc) { +- SGC_MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_a); +- if (!x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m2exp) SGC_MARK_MP(x->rnd.rnd_state._mp_algdata._mp_lc->_mp_m); +- SGC_MARK_CP(x->rnd.rnd_state._mp_algdata._mp_lc,sizeof(*x->rnd.rnd_state._mp_algdata._mp_lc)); +- } +-#endif +- break; +- +- case t_readtable: +- if (x->rt.rt_self == NULL) +- break; +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->rt.rt_self),RTABSIZE*sizeof(struct rtent)); +- for (i = 0; i < RTABSIZE; i++) { +- sgc_mark_object(x->rt.rt_self[i].rte_macro); +- if (x->rt.rt_self[i].rte_dtab != NULL) { +- if (what_to_collect == t_contiguous) +- mark_contblock((char *)(x->rt.rt_self[i].rte_dtab),RTABSIZE*sizeof(object)); +- for (j = 0; j < RTABSIZE; j++) +- sgc_mark_object(x->rt.rt_self[i].rte_dtab[j]); +- } +- } +- break; +- +- case t_pathname: +- sgc_mark_object(x->pn.pn_host); +- sgc_mark_object(x->pn.pn_device); +- sgc_mark_object(x->pn.pn_directory); +- sgc_mark_object(x->pn.pn_name); +- sgc_mark_object(x->pn.pn_type); +- sgc_mark_object(x->pn.pn_version); +- break; +- +- case t_closure: +- { +- int i ; +- for (i= 0 ; i < x->cl.cl_envdim ; i++) +- sgc_mark_object(x->cl.cl_env[i]); +- if (SGC_RELBLOCK_P(x->cl.cl_env) && COLLECT_RELBLOCK_P) +- x->cl.cl_env=(void *)copy_relblock((void *)x->cl.cl_env,x->cl.cl_envdim*sizeof(object)); +- +- } +- +- case t_cfun: +- case t_sfun: +- case t_vfun: +- case t_afun: +- case t_gfun: +- sgc_mark_object(x->cf.cf_name); +- sgc_mark_object(x->cf.cf_data); +- break; +- +- case t_cfdata: +- +- if (x->cfd.cfd_self != NULL) { +- int i=x->cfd.cfd_fillp; +- while(i-- > 0) +- sgc_mark_object(x->cfd.cfd_self[i]); +- } +- if (what_to_collect == t_contiguous) { +- mark_contblock(x->cfd.cfd_start, x->cfd.cfd_size); +- mark_link_array(x->cfd.cfd_start,x->cfd.cfd_start+x->cfd.cfd_size); +- } +- break; +- case t_cclosure: +- sgc_mark_object(x->cc.cc_name); +- sgc_mark_object(x->cc.cc_env); +- sgc_mark_object(x->cc.cc_data); +- if (x->cc.cc_turbo!=NULL) { +- sgc_mark_object(*(x->cc.cc_turbo-1)); +- if (SGC_RELBLOCK_P(x->cc.cc_turbo) && COLLECT_RELBLOCK_P) +- x->cc.cc_turbo=(void *)copy_relblock((char *)(x->cc.cc_turbo-1),(1+fix(*(x->cc.cc_turbo-1)))*sizeof(object))+sizeof(object); +- } +- break; +- +- case t_spice: +- break; +- +- default: +-#ifdef DEBUG +- if (debug) +- printf("\ttype = %d\n", type_of(x)); +-#endif +- error("mark botch"); +- } +- +-} +- +-static void + sgc_mark_phase(void) { + + STATIC fixnum i, j; +@@ -552,8 +71,8 @@ sgc_mark_phase(void) { + STATIC ihs_ptr ihsp; + STATIC struct pageinfo *v; + +- sgc_mark_object(Cnil->s.s_plist); +- sgc_mark_object(Ct->s.s_plist); ++ mark_object(Cnil->s.s_plist); ++ mark_object(Ct->s.s_plist); + + /* mark all non recent data on writable pages */ + { +@@ -563,15 +82,17 @@ sgc_mark_phase(void) { + + for (v=cell_list_head;v;v=v->next) { + i=page(v); +- if (!WRITABLE_PAGE_P(i)) continue; ++ if (v->sgc_flags&SGC_PAGE_FLAG || !WRITABLE_PAGE_P(i)) continue; + + t=v->type; + tm=tm_of(t); + p=pagetochar(i); + for (j = tm->tm_nppage; --j >= 0; p += tm->tm_size) { + object x = (object) p; +- if (SGC_OR_M(x)) continue; +- sgc_mark_object1(x); ++#ifndef SGC_WHOLE_PAGE ++ if (TYPEWORD_TYPE_P(v->type) && x->d.s) continue; ++#endif ++ mark_object1(x); + } + } + } +@@ -595,24 +116,24 @@ sgc_mark_phase(void) { + mark_stack_carefully(MVloc+(sizeof(MVloc)/sizeof(object)),MVloc,0); + + for (bdp = bds_org; bdp<=bds_top; bdp++) { +- sgc_mark_object(bdp->bds_sym); +- sgc_mark_object(bdp->bds_val); ++ mark_object(bdp->bds_sym); ++ mark_object(bdp->bds_val); + } + + for (frp = frs_org; frp <= frs_top; frp++) +- sgc_mark_object(frp->frs_val); ++ mark_object(frp->frs_val); + + for (ihsp = ihs_org; ihsp <= ihs_top; ihsp++) +- sgc_mark_object(ihsp->ihs_function); ++ mark_object(ihsp->ihs_function); + + for (i = 0; i < mark_origin_max; i++) +- sgc_mark_object(*mark_origin[i]); ++ mark_object(*mark_origin[i]); + for (i = 0; i < mark_origin_block_max; i++) + for (j = 0; j < mark_origin_block[i].mob_size; j++) +- sgc_mark_object(mark_origin_block[i].mob_addr[j]); ++ mark_object(mark_origin_block[i].mob_addr[j]); + + for (pp = pack_pointer; pp != NULL; pp = pp->p_link) +- sgc_mark_object((object)pp); ++ mark_object((object)pp); + #ifdef KCLOVM + if (ovm_process_created) + sgc_mark_all_stacks(); +@@ -624,20 +145,6 @@ sgc_mark_phase(void) { + fflush(stdout); + } + #endif +- { +- int size; +- +- for (pp = pack_pointer; pp != NULL; pp = pp->p_link) { +- size = pp->p_internal_size; +- if (pp->p_internal != NULL) +- for (i = 0; i < size; i++) +- sgc_mark_pack_list(pp->p_internal[i]); +- size = pp->p_external_size; +- if (pp->p_external != NULL) +- for (i = 0; i < size; i++) +- sgc_mark_pack_list(pp->p_external[i]); +- } +- } + + mark_c_stack(0,N_RECURSION_REQD,mark_stack_carefully); + +@@ -657,9 +164,6 @@ sgc_sweep_phase(void) { + + tm = tm_of((enum type)v->type); + +- if (!WRITABLE_PAGE_P(page(v))) +- continue; +- + p = pagetochar(page(v)); + f = tm->tm_free; + k = 0; +@@ -678,14 +182,18 @@ sgc_sweep_phase(void) { + continue; + } + +- if (TYPEWORD_TYPE_P(pageinfo(x)->type) && x->d.s == SGC_NORMAL) ++#ifndef SGC_WHOLE_PAGE ++ if (TYPEWORD_TYPE_P(v->type) && x->d.s == SGC_NORMAL) + continue; ++#endif + + /* it is ok to free x */ + + SET_LINK(x,f); + make_free(x); ++#ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(v->type)) x->d.s = SGC_RECENT; ++#endif + f = x; + k++; + +@@ -694,7 +202,7 @@ sgc_sweep_phase(void) { + tm->tm_nfree += k; + v->in_use-=k; + +- } else /*non sgc_page */ ++ } else if (WRITABLE_PAGE_P(page(v))) /*non sgc_page */ + for (j = tm->tm_nppage; --j >= 0; p += size) { + x = (object)p; + if (is_marked(x) && !is_free(x)) { +@@ -711,9 +219,9 @@ sgc_contblock_sweep_phase(void) { + + STATIC char *s, *e, *p, *q; + STATIC struct pageinfo *v; ++ ++ reset_contblock_freelist(); + +- cb_pointer = NULL; +- ncb = 0; + for (v=contblock_list_head;v;v=v->next) { + bool z; + +@@ -739,13 +247,6 @@ sgc_contblock_sweep_phase(void) { + + } + +- +- +-#define PAGE_ROUND_UP(adr) \ +- ((char *)(PAGESIZE*(((long)(adr)+PAGESIZE -1) >> PAGEWIDTH))) +- +-/* char *old_rb_start; */ +- + #undef tm + + #ifdef SDEBUG +@@ -763,11 +264,11 @@ sgc_count(object yy) { + + fixnum writable_pages=0; + +-/* count writable pages excluding the hole */ ++/* count read-only pages */ + static fixnum +-sgc_count_writable(void) { ++sgc_count_read_only(void) { + +- return page(core_end)-page(rb_start)+writable_pages-(page(old_rb_start)-page(heap_end)); ++ return sgc_enabled ? sSAwritableA->s.s_dbind->v.v_dim-writable_pages : 0; + + } + +@@ -1031,7 +532,11 @@ memprotect_test_reset(void) { + /* If opt_maxpage is set, add full pages to the sgc set if needed + too. 20040804 CM*/ + /* #define FSGC(tm) (tm->tm_type==t_cons ? tm->tm_nppage : (tm->tm_opt_maxpage ? 0 : tm->tm_sgc_minfree)) */ ++#ifdef SGC_WHOLE_PAGE ++#define FSGC(tm) tm->tm_nppage ++#else + #define FSGC(tm) (!TYPEWORD_TYPE_P(tm->tm_type) ? tm->tm_nppage : tm->tm_sgc_minfree) ++#endif + + DEFVAR("*WRITABLE*",sSAwritableA,SI,Cnil,""); + +@@ -1047,13 +552,16 @@ sgc_start(void) { + object omp=sSAoptimize_maximum_pagesA->s.s_dbind; + double tmp,scale; + ++ allocate_more_pages=0; ++ if (sgc_enabled) ++ return 1; ++ + sSAoptimize_maximum_pagesA->s.s_dbind=Cnil; + + if (memprotect_result!=memprotect_success && do_memprotect_test()) + return 0; + +- if (sgc_enabled) +- return 1; ++ empty_relblock(); + + /* Reset maxpage statistics if not invoked automatically on a hole + overrun. 20040804 CM*/ +@@ -1193,26 +701,7 @@ sgc_start(void) { + + } + +- /* Now allocate the sgc relblock. We do this as the tail +- end of the ordinary rb. */ +- { +- char *new; +- tm=tm_of(t_relocatable); +- +- { +- old_rb_start=rb_start; +- if(((unsigned long)WSGC(tm)) && allocate_more_pages) { +- new=alloc_relblock(((unsigned long)WSGC(tm))*PAGESIZE); +- /* the above may cause a gc, shifting the relblock */ +- old_rb_start=rb_start; +- new= PAGE_ROUND_UP(new); +- } else new=PAGE_ROUND_UP(rb_pointer); +- rb_start=rb_pointer=new; +- } +- } +- /* the relblock has been allocated */ +- +- sSAwritableA->s.s_dbind=fSmake_vector1_1((page(rb_start)-first_data_page),aet_bit,Cnil); ++ sSAwritableA->s.s_dbind=fSmake_vector1_1((page(heap_end)-first_data_page),aet_bit,Ct); + wrimap=(void *)sSAwritableA->s.s_dbind->v.v_self; + + /* now move the sgc free lists into place. alt_free should +@@ -1231,12 +720,16 @@ sgc_start(void) { + #endif + if (pageinfo(f)->sgc_flags&SGC_PAGE_FLAG) { + SET_LINK(f,x); ++#ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(pageinfo(f)->type)) f->d.s = SGC_RECENT; ++#endif + x=f; + count++; + } else { + SET_LINK(f,y); ++#ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(pageinfo(f)->type)) f->d.s = SGC_NORMAL; ++#endif + y=f; + } + f=next; +@@ -1253,9 +746,12 @@ sgc_start(void) { + + { + +- struct contblock *new_cb_pointer=NULL,*tmp_cb_pointer=NULL,**cbpp; ++ struct contblock **cbpp; + void *p=NULL,*pe; + struct pageinfo *pi; ++ ++ old_cb_pointer=cb_pointer; ++ reset_contblock_freelist(); + + for (pi=contblock_list_head;pi;pi=pi->next) { + +@@ -1264,26 +760,17 @@ sgc_start(void) { + p=CB_DATA_START(pi); + pe=p+CB_DATA_SIZE(pi->in_use); + +- for (cbpp=&cb_pointer;*cbpp;) ++ for (cbpp=&old_cb_pointer;*cbpp;) + if ((void *)*cbpp>=p && (void *)*cbppcb_size,*l=(*cbpp)->cb_link; + set_sgc_bits(pi,s,e); +- tmp_cb_pointer=cb_pointer; +- cb_pointer=new_cb_pointer; + insert_contblock(s,e-s); +- new_cb_pointer=cb_pointer; +- cb_pointer=tmp_cb_pointer; + *cbpp=l; + } else + cbpp=&(*cbpp)->cb_link; + + } + +- /* SGC contblock pages: switch to new free SGC contblock list. CM +- 20030827 */ +- old_cb_pointer=cb_pointer; +- cb_pointer=new_cb_pointer; +- + #ifdef SGC_CONT_DEBUG + overlap_check(old_cb_pointer,cb_pointer); + #endif +@@ -1315,11 +802,13 @@ sgc_start(void) { + SET_WRITABLE(i); + } + +- for (i=page(heap_end);itm_alt_npage=page(rb_start)-page(old_rb_start); +- for (i=page(rb_start);is.s_dbind; ++ for (i=page(v->v.v_self);i<=page(v->v.v_self+CEI(v->bv.bv_offset+v->v.v_dim-1,8*sizeof(fixnum))/(8*sizeof(fixnum)));i++) + SET_WRITABLE(i); ++ } ++ ++ tm_of(t_relocatable)->tm_alt_npage=0; + + fault_pages=0; + +@@ -1363,8 +852,7 @@ sgc_quit(void) { + + struct typemanager *tm; + struct contblock *tmp_cb_pointer,*next; +- unsigned long i,j,np; +- char *p; ++ unsigned long i,np; + struct pageinfo *v; + + memory_protect(0); +@@ -1379,7 +867,6 @@ sgc_quit(void) { + wrimap=NULL; + + sgc_enabled=0; +- rb_start = old_rb_start; + + /* SGC cont pages: restore contblocks, each tmp_cb_pointer coming + from the new list is guaranteed not to be on the old. Need to +@@ -1389,9 +876,7 @@ sgc_quit(void) { + #ifdef SGC_CONT_DEBUG + overlap_check(old_cb_pointer,cb_pointer); + #endif +- tmp_cb_pointer=cb_pointer; +- cb_pointer=old_cb_pointer; +- for (;tmp_cb_pointer; tmp_cb_pointer=next) { ++ for (tmp_cb_pointer=old_cb_pointer;tmp_cb_pointer; tmp_cb_pointer=next) { + next=tmp_cb_pointer->cb_link; + insert_contblock((void *)tmp_cb_pointer,tmp_cb_pointer->cb_size); + } +@@ -1440,11 +925,13 @@ sgc_quit(void) { + + /*FIXME*/ + /* remove the recent flag from any objects on sgc pages */ +- for (v=cell_list_head;v;v=v->next) ++#ifndef SGC_WHOLE_PAGE ++ for (v=cell_list_head;v;v=v->next) + if (v->type==(tm=tm_of(v->type))->tm_type && TYPEWORD_TYPE_P(v->type) && v->sgc_flags & SGC_PAGE_FLAG) + for (p=pagetochar(page(v)),j=tm->tm_nppage;j>0;--j,p+=tm->tm_size) +- ((object) p)->d.s=SGC_NORMAL; +- ++ ((object) p)->d.s=SGC_NORMAL; ++#endif ++ + for (v=contblock_list_head;v;v=v->next) + if (v->sgc_flags&SGC_PAGE_FLAG) + bzero(CB_SGCF_START(v),CB_DATA_START(v)-CB_SGCF_START(v)); +@@ -1488,7 +975,6 @@ memprotect_handler(int sig, long code, v + faddr = addr; + #endif + p = page(faddr); +- /* p = ROUND_DOWN_PAGE_NO(p); */ + if (p >= first_protectable_page + && faddr < (void *)core_end + && !(WRITABLE_PAGE_P(p))) { +@@ -1560,10 +1046,10 @@ memory_protect(int on) { + INSTALL_MPROTECT_HANDLER; + + beg=first_protectable_page; +- writable = IS_WRITABLE(beg); ++ writable = WRITABLE_PAGE_P(beg); + for (i=beg ; ++i<= end; ) { + +- if (writable==IS_WRITABLE(i) && i<=end) continue; ++ if (writable==WRITABLE_PAGE_P(i) && ist.st_self = alloc_relblock(fix(size)); +--- gcl-2.6.12.orig/o/structure.c ++++ gcl-2.6.12/o/structure.c +@@ -257,7 +257,7 @@ LFD(siLmake_structure)(void) + } + + static void +-FFN(siLcopy_structure)(void) ++FFN(Lcopy_structure)(void) + { + object x, y; + struct s_data *def; +@@ -452,7 +452,7 @@ gcl_init_structure_function(void) + + make_si_function("MAKE-STRUCTURE", siLmake_structure); + make_si_function("MAKE-S-DATA-STRUCTURE",siLmake_s_data_structure); +- make_si_function("COPY-STRUCTURE", siLcopy_structure); ++ make_function("COPY-STRUCTURE", Lcopy_structure); + make_si_function("STRUCTURE-NAME", siLstructure_name); + /* make_si_function("STRUCTURE-REF", siLstructure_ref); */ + /* make_si_function("STRUCTURE-DEF", siLstructure_def); */ +--- gcl-2.6.12.orig/o/toplevel.c ++++ gcl-2.6.12/o/toplevel.c +@@ -68,12 +68,12 @@ FFN(Fdefun)(object args) + } + vs_base = vs_top; + if (lex_env[0] == Cnil && lex_env[1] == Cnil && lex_env[2] == Cnil) { +- vs_push(MMcons(sLlambda_block, args)); ++ vs_push(MMcons(sSlambda_block, args)); + } else { + vs_push(MMcons(lex_env[2], args)); + vs_base[0] = MMcons(lex_env[1], vs_base[0]); + vs_base[0] = MMcons(lex_env[0], vs_base[0]); +- vs_base[0] = MMcons(sLlambda_block_closure, vs_base[0]); ++ vs_base[0] = MMcons(sSlambda_block_closure, vs_base[0]); + } + {object fname = clear_compiler_properties(name,vs_base[0]); + fname->s.s_gfdef = vs_base[0]; +--- gcl-2.6.12.orig/o/typespec.c ++++ gcl-2.6.12/o/typespec.c +@@ -73,7 +73,7 @@ LFD(Ltype_of)(void) + if ((' ' <= i && i < '\177') || i == '\n') + vs_base[0] = sLstandard_char; + else +- vs_base[0] = sLstring_char; ++ vs_base[0] = sLcharacter; + } + break; + +@@ -176,7 +176,6 @@ LFD(Ltype_of)(void) + DEF_ORDINARY("PROCLAIMED-ARG-TYPES",sSproclaimed_arg_types,SI,""); + DEF_ORDINARY("PROCLAIMED-RETURN-TYPE",sSproclaimed_return_type,SI,""); + DEF_ORDINARY("PROCLAIMED-FUNCTION",sSproclaimed_function,SI,""); +-DEF_ORDINARY("COMMON",sLcommon,LISP,""); + DEF_ORDINARY("NULL",sLnull,LISP,""); + DEF_ORDINARY("CONS",sLcons,LISP,""); + DEF_ORDINARY("LIST",sLlist,LISP,""); +@@ -197,7 +196,6 @@ DEF_ORDINARY("CHARACTER",sLcharacter,LIS + DEF_ORDINARY("NUMBER",sLnumber,LISP,""); + DEF_ORDINARY("RATIONAL",sLrational,LISP,""); + DEF_ORDINARY("FLOAT",sLfloat,LISP,""); +-DEF_ORDINARY("STRING-CHAR",sLstring_char,LISP,""); + DEF_ORDINARY("REAL",sLreal,LISP,""); + DEF_ORDINARY("INTEGER",sLinteger,LISP,""); + DEF_ORDINARY("RATIO",sLratio,LISP,""); +@@ -205,7 +203,6 @@ DEF_ORDINARY("SHORT-FLOAT",sLshort_float + DEF_ORDINARY("STANDARD-CHAR",sLstandard_char,LISP,""); + DEF_ORDINARY("BOOLEAN",sLboolean,LISP,""); + DEF_ORDINARY("FIXNUM",sLfixnum,LISP,""); +-DEF_ORDINARY("POSITIVE-FIXNUM",sLpositive_fixnum,LISP,""); + DEF_ORDINARY("COMPLEX",sLcomplex,LISP,""); + DEF_ORDINARY("SINGLE-FLOAT",sLsingle_float,LISP,""); + DEF_ORDINARY("PACKAGE",sLpackage,LISP,""); +@@ -228,10 +225,10 @@ DEF_ORDINARY("VALUES",sLvalues,LISP,""); + DEF_ORDINARY("MOD",sLmod,LISP,""); + DEF_ORDINARY("SIGNED-BYTE",sLsigned_byte,LISP,""); + DEF_ORDINARY("UNSIGNED-BYTE",sLunsigned_byte,LISP,""); +-DEF_ORDINARY("SIGNED-CHAR",sLsigned_char,LISP,""); +-DEF_ORDINARY("UNSIGNED-CHAR",sLunsigned_char,LISP,""); +-DEF_ORDINARY("SIGNED-SHORT",sLsigned_short,LISP,""); +-DEF_ORDINARY("UNSIGNED-SHORT",sLunsigned_short,LISP,""); ++DEF_ORDINARY("SIGNED-CHAR",sSsigned_char,SI,""); ++DEF_ORDINARY("UNSIGNED-CHAR",sSunsigned_char,SI,""); ++DEF_ORDINARY("SIGNED-SHORT",sSsigned_short,SI,""); ++DEF_ORDINARY("UNSIGNED-SHORT",sSunsigned_short,SI,""); + DEF_ORDINARY("*",sLA,LISP,""); + DEF_ORDINARY("PLUSP",sLplusp,LISP,""); + DEF_ORDINARY("DIVISION-BY-ZERO",sLdivision_by_zero,LISP,""); +@@ -244,8 +241,6 @@ DEF_ORDINARY("UNDEFINED-FUNCTION",sLunde + DEF_ORDINARY("UNBOUND-VARIABLE",sLunbound_variable,LISP,""); + DEF_ORDINARY("PACKAGE-ERROR",sLpackage_error,LISP,""); + +-/* #ifdef ANSI_COMMON_LISP */ +-/* New ansi types */ + DEF_ORDINARY("METHOD-COMBINATION",sLmethod_combination,LISP,""); + DEF_ORDINARY("ARITHMETIC-ERROR",sLarithmetic_error,LISP,""); + DEF_ORDINARY("BASE-CHAR",sLbase_char,LISP,""); +@@ -290,7 +285,6 @@ DEF_ORDINARY("TWO-WAY-STREAM",sLtwo_way_ + DEF_ORDINARY("TYPE-ERROR",sLtype_error,LISP,""); + DEF_ORDINARY("UNBOUND-SLOT",sLunbound_slot,LISP,""); + DEF_ORDINARY("WARNING",sLwarning,LISP,""); +-/* #endif */ + + DEFCONST("CHAR-SIZE",sSchar_size,SI,small_fixnum(CHAR_SIZE),"Size in bits of a character"); + DEFCONST("SHORT-SIZE",sSshort_size,SI,small_fixnum(CHAR_SIZE*sizeof(short)),"Size in bits of a short integer"); +--- gcl-2.6.12.orig/o/unexelf.c ++++ gcl-2.6.12/o/unexelf.c +@@ -634,7 +634,7 @@ find_section (char *name, char *section_ + static void + unexec (char *new_name, char *old_name, unsigned int data_start, unsigned int bss_start, unsigned int entry_address) + { +- int new_file, old_file, new_file_size; ++ int new_file, old_file; + + /* Pointers to the base of the image of the two files. */ + caddr_t old_base, new_base; +@@ -654,17 +654,14 @@ unexec (char *new_name, char *old_name, + /* Point to the section name table in the old file */ + char *old_section_names; + +- ElfW(Addr) old_bss_addr, new_bss_addr; +- ElfW(Word) old_bss_size, new_data2_size,old_bss_offset; +- ElfW(Off) new_data2_offset; +- ElfW(Addr) new_data2_addr; ++ ElfW(Addr) old_bss_addr, new_bss_addr,new_data2_addr; ++ ElfW(Off) old_bss_size, new_data2_size,old_bss_offset,new_data2_offset,old_file_size,new_file_size; + + int n, nn; + int old_bss_index, old_sbss_index; + int old_data_index, new_data2_index; + int old_mdebug_index; + struct stat stat_buf; +- int old_file_size; + + /* Open the old file, allocate a buffer of the right size, and read + in the file contents. */ +--- gcl-2.6.12.orig/o/unixsave.c ++++ gcl-2.6.12/o/unixsave.c +@@ -140,7 +140,7 @@ char *original_file, *save_file; + + extern void _cleanup(); + +-LFD(Lsave)() { ++LFD(siLsave)() { + char filename[256]; + + check_arg(1); +@@ -159,6 +159,6 @@ LFD(Lsave)() { + void + gcl_init_unixsave(void) + { +- make_function("SAVE", Lsave); ++ make_si_function("SAVE", siLsave); + } + +--- gcl-2.6.12.orig/o/unixsys.c ++++ gcl-2.6.12/o/unixsys.c +@@ -169,7 +169,7 @@ msystem(const char *s) { + } + + static void +-FFN(Lsystem)(void) ++FFN(siLsystem)(void) + { + char command[32768]; + int i; +@@ -284,6 +284,6 @@ un_mmap(void *v1,void *ve) { + void + gcl_init_unixsys(void) { + +- make_function("SYSTEM", Lsystem); ++ make_si_function("SYSTEM", siLsystem); + + } +--- gcl-2.6.12.orig/o/unixtime.c ++++ gcl-2.6.12/o/unixtime.c +@@ -282,7 +282,7 @@ DEFUN_NEW("CURRENT-TIMEZONE",object,fScu + localtime_r(&_t, <); + return (object)(gt.tm_hour-lt.tm_hour+24*(gt.tm_yday!=lt.tm_yday ? (gt.tm_year>lt.tm_year||gt.tm_yday>lt.tm_yday ? 1 : -1) : 0)); + #else +- fixnum _t=time(0); ++ time_t _t=time(0); + return (object)(-localtime(&_t)->tm_gmtoff/3600); + #endif + } +@@ -296,7 +296,7 @@ DEFUN_NEW("CURRENT-DSTP",object,fScurren + #elif defined NO_SYSTEM_TIME_ZONE /*solaris*/ + return Cnil; + #else +- fixnum _t=time(0); ++ time_t _t=time(0); + return localtime(&_t)->tm_isdst > 0 ? Ct : Cnil; + #endif + } +--- gcl-2.6.12.orig/pcl/defsys.lisp ++++ gcl-2.6.12/pcl/defsys.lisp +@@ -52,24 +52,10 @@ + + (in-package :user) + +-#+kcl (in-package :walker :use '(:lisp)) +-#+kcl (in-package :iterate :use '(:lisp :walker)) +-#+kcl (in-package :pcl :use '(:walker :iterate :lisp)) ++(load "package.lisp") + + (eval-when (compile load eval) + +-(if (find-package ':walker) +- (use-package '(:lisp) ':walker) +- (make-package ':walker :use '(:lisp))) +- +-(if (find-package ':iterate) +- (use-package '(:lisp :walker) ':iterate) +- (make-package ':iterate :use '(:lisp :walker))) +- +-(if (find-package ':pcl) +- (use-package '(:walker :iterate :lisp) ':pcl) +- (make-package ':pcl :use '(:walker :iterate :lisp))) +- + (export (intern (symbol-name :iterate) ;Have to do this here, + (find-package :iterate)) ;because in the defsystem + (find-package :iterate)) ;(later in this file) +@@ -90,7 +76,7 @@ + + (eval-when (compile load eval) + (defvar *pcl-proclaim* +- '(optimize (speed 3) (safety #+kcl 0 #-kcl 1) (space 0) ++ '(optimize (speed 3) (safety 1) (space 0) + #+lucid (compilation-speed 0))) + ) + +@@ -261,7 +247,6 @@ and load your system with: + #+Xerox-Medley (Xerox-Medley xerox) + #+TI TI + #+(and dec vax common) Vaxlisp +- #+KCL KCL + #+IBCL IBCL + #+gcl gcl + #+excl (excl franz) +@@ -305,7 +290,6 @@ and load your system with: + #+Cloe-Runtime ("l" . "fasl") + #+(and dec common vax (not ultrix)) ("LSP" . "FAS") + #+(and dec common vax ultrix) ("lsp" . "fas") +- #+KCL ("lsp" . "o") + #+IBCL ("lsp" . "o") + #+Xerox ("lisp" . "dfasl") + #+(and Lucid MC68000) ("lisp" . "lbin") +@@ -675,7 +659,7 @@ and load your system with: + ;; 3.0 it's in the LUCID-COMMON-LISP package. + ;; + #+LUCID (or lucid::*source-pathname* (bad-time)) +- #+akcl si:*load-pathname* ++ #+akcl *load-pathname* + #+cmu17 *load-truename* + #-(or Lispm excl Xerox (and dec vax common) LUCID akcl cmu17) nil)) + +--- gcl-2.6.12.orig/pcl/gcl_pcl_pkg.lisp ++++ gcl-2.6.12/pcl/gcl_pcl_pkg.lisp +@@ -176,11 +176,8 @@ + + nil)) + +-#+kcl +-(progn +-(import '(si:structurep si:structure-def si:structure-ref)) +-(shadow 'lisp:dotimes) +-) ++#+kcl(import '(si:structurep si:structure-def si:structure-ref)) ++ + #+kcl + (in-package "SI") + #+kcl +--- gcl-2.6.12.orig/pcl/gcl_pcl_walk.lisp ++++ gcl-2.6.12/pcl/gcl_pcl_walk.lisp +@@ -608,7 +608,7 @@ + (push `(,(car f) . (function . (,#'unbound-lexical-function . nil))) + lexicals)) + (dolist (m macros) +- (push `(,(car m) . (macro . ( ,(cadr m) . nil))) ++ (push `(,(car m) . (si::macro . ( ,(cadr m) . nil))) + lexicals)) + (list first lexicals third))) + +@@ -623,7 +623,7 @@ + (when env + (let ((entry (assoc macro (second env)))) + (and entry +- (eq (cadr entry) 'macro) ++ (eq (cadr entry) 'si::macro) + (caddr entry))))) + );#+(or KCL IBCL) + +@@ -1202,7 +1202,7 @@ + + #+(or KCL IBCL) + (progn +- (define-walker-template lambda-block walk-named-lambda);Not really right, ++ (define-walker-template si::lambda-block walk-named-lambda);Not really right, + ;we don't hack block + ;names anyways. + ) +@@ -1367,7 +1367,7 @@ + #+cmu17 + (special-operator-p fn) + #-cmu17 +- (special-form-p fn)) ++ (special-operator-p fn)) + (error + "~S is a special form, not defined in the CommonLisp.~%~ + manual This code walker doesn't know how to walk it.~%~ +--- gcl-2.6.12.orig/pcl/impl/gcl/gcl_pcl_impl_low.lisp ++++ gcl-2.6.12/pcl/impl/gcl/gcl_pcl_impl_low.lisp +@@ -277,17 +277,17 @@ static object set_cclosure (object resul + (fourth slotd)) + + (defun renew-sys-files() +- ;; packages: +- (compiler::get-packages "sys-package.lisp") +- (with-open-file (st "sys-package.lisp" +- :direction :output +- :if-exists :append) +- (format st "(lisp::in-package \"SI\") +-(export '(%structure-name +- %compiled-function-name +- %set-compiled-function-name)) +-(in-package \"PCL\") +-")) ++;; ;; packages: ++;; (compiler::get-packages "sys-package.lisp") ++;; (with-open-file (st "sys-package.lisp" ++;; :direction :output ++;; :if-exists :append) ++;; (format st "(lisp::in-package \"SI\") ++;; (export '(%structure-name ++;; %compiled-function-name ++;; %set-compiled-function-name)) ++;; (in-package \"PCL\") ++;; ")) + + ;; proclaims + (compiler::make-all-proclaims "*.fn") +--- gcl-2.6.12.orig/pcl/makefile ++++ gcl-2.6.12/pcl/makefile +@@ -9,9 +9,7 @@ GFILES:=$(addprefix gcl_pcl_gazonk,$(GFI + + AFILES:=$(FILES) $(GFILES) + +-SETUP='(load "sys-package.lisp")' \ +- '(setq *features* (delete (quote :kcl) *features*))'\ +- '(load "defsys.lisp")(push (quote :kcl) *features*)' \ ++SETUP='(load "defsys.lisp")' \ + '(setq pcl::*default-pathname-extensions* (cons "lisp" "o"))' \ + '(setq pcl::*pathname-extensions* (cons "lisp" "o"))' \ + '(load "sys-proclaim.lisp")' \ +--- /dev/null ++++ gcl-2.6.12/pcl/package.lisp +@@ -0,0 +1,21 @@ ++(in-package :user) ++ ++(eval-when (compile load eval) ++ ++(if (find-package :walker) ++ (use-package '(:lisp) :walker) ++ (make-package :walker :use '(:lisp))) ++ ++(if (find-package :iterate) ++ (use-package '(:lisp :walker) :iterate) ++ (make-package :iterate :use '(:lisp :walker))) ++ ++(if (find-package :pcl) ++ (use-package '(:walker :iterate :lisp) :pcl) ++ (make-package :pcl :use '(:walker :iterate :lisp)))) ++ ++(in-package :pcl) ++(defvar *the-pcl-package* (find-package :pcl)) ++(defun load-truename (&optional errorp) *load-pathname*) ++(import 'si::(clines defentry defcfun object void int double)) ++(import 'si::compiler-let :walker) +--- gcl-2.6.12.orig/pcl/sys-proclaim.lisp ++++ gcl-2.6.12/pcl/sys-proclaim.lisp +@@ -1,775 +1,1044 @@ + +-(IN-PACKAGE "PCL") +-(PROCLAIM +- '(FTYPE (FUNCTION NIL T) +- INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST MAKE-ARG-INFO +- RENEW-SYS-FILES ALLOCATE-FUNCALLABLE-INSTANCE-1 +- SHOW-DFUN-CONSTRUCTORS MAKE-CACHE SHOW-EMF-CALL-TRACE +- INITIAL-DISPATCH-DFUN-INFO DISPATCH-DFUN-INFO +- IN-THE-COMPILER-P UPDATE-DISPATCH-DFUNS +- SHOW-FREE-CACHE-VECTORS NO-METHODS-DFUN-INFO +- %%ALLOCATE-INSTANCE--CLASS DEFAULT-METHOD-ONLY-DFUN-INFO +- BOOTSTRAP-META-BRAID GET-EFFECTIVE-METHOD-GENSYM +- STRUCTURE-FUNCTIONS-EXIST-P LIST-ALL-DFUNS MAKE-CPD +- CACHES-TO-ALLOCATE INITIAL-DFUN-INFO +- ALLOCATE-FUNCALLABLE-INSTANCE-2 BOOTSTRAP-BUILT-IN-CLASSES)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) *) DEFAULT-CODE-CONVERTER +- MAKE-FINAL-DISPATCH-DFUN PROTOTYPES-FOR-MAKE-METHOD-LAMBDA +- FIND-STRUCTURE-CLASS EARLY-COLLECT-INHERITANCE +- EMIT-ONE-INDEX-WRITERS NET-CODE-CONVERTER +- MAKE-DISPATCH-DFUN *NORMALIZE-TYPE COMPILE-IIS-FUNCTIONS +- GENERIC-FUNCTION-NAME-P EMIT-IN-CHECKING-CACHE-P +- EMIT-ONE-CLASS-READER GET-GENERIC-FUNCTION-INFO +- COMPUTE-APPLICABLE-METHODS-EMF ANALYZE-LAMBDA-LIST +- EMIT-ONE-INDEX-READERS EARLY-METHOD-FUNCTION PCL-DESCRIBE +- TYPE-FROM-SPECIALIZER FIND-WRAPPER METHOD-PROTOTYPE-FOR-GF +- SPECIALIZER-FROM-TYPE STRUCTURE-WRAPPER +- GET-DISPATCH-FUNCTION EMIT-TWO-CLASS-READER +- PARSE-METHOD-GROUP-SPECIFIER CLASS-EQ-TYPE +- EMIT-CONSTANT-VALUE EMIT-TWO-CLASS-WRITER +- CONVERT-TO-SYSTEM-TYPE PARSE-DEFMETHOD +- EMIT-ONE-CLASS-WRITER)) +-(PROCLAIM +- '(FTYPE (FUNCTION (*) T) |__si::MAKE-CACHING| |__si::MAKE-N-N| +- MAKE-INITIALIZE-INFO |__si::MAKE-NO-METHODS| +- |__si::MAKE-TWO-CLASS| INTERN-PV-TABLE +- |__si::MAKE-ARG-INFO| |__si::MAKE-ONE-INDEX-DFUN-INFO| +- FIX-EARLY-GENERIC-FUNCTIONS CALLED-FIN-WITHOUT-FUNCTION +- MAKE-FAST-METHOD-CALL STRING-APPEND |__si::MAKE-ONE-INDEX| +- |__si::MAKE-INITIAL| |__si::MAKE-CHECKING| ZERO +- |__si::MAKE-PV-TABLE| MAKE-PROGN FALSE MAKE-PV-TABLE +- WALKER::UNBOUND-LEXICAL-FUNCTION |__si::MAKE-DISPATCH| +- USE-PACKAGE-PCL TRUE |__si::MAKE-DEFAULT-METHOD-ONLY| +- |__si::MAKE-INITIAL-DISPATCH| |__si::MAKE-CONSTANT-VALUE| +- |__si::MAKE-DFUN-INFO| |__si::MAKE-STD-INSTANCE| +- MAKE-METHOD-CALL |__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| +- MAKE-FAST-INSTANCE-BOUNDP |__si::MAKE-ACCESSOR-DFUN-INFO| +- |STRUCTURE-OBJECT class constructor| |__si::MAKE-CACHE| +- |__si::MAKE-ONE-CLASS| PV-WRAPPERS-FROM-PV-ARGS)) +-(PROCLAIM '(FTYPE (FUNCTION (T) (OR CACHE NULL)) PV-TABLE-CACHE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T *) *) MAKE-METHOD-FUNCTION-INTERNAL +- PARSE-METHOD-OR-SPEC MAKE-METHOD-LAMBDA-INTERNAL +- COERCE-TO-CLASS MAKE-FINAL-DFUN-INTERNAL GET-FUNCTION +- EXTRACT-DECLARATIONS COMPILE-LAMBDA GET-FUNCTION1 +- MAKE-CACHING-DFUN GET-METHOD-FUNCTION DISPATCH-DFUN-COST +- MACROEXPAND-ALL PARSE-SPECIALIZED-LAMBDA-LIST ENSURE-CLASS +- WALK-FORM MAKE-INSTANCE-1 GET-DFUN-CONSTRUCTOR +- MAP-ALL-CLASSES ENSURE-GENERIC-FUNCTION +- MAKE-CONSTANT-VALUE-DFUN)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) T) ACCESSOR-MISS-FUNCTION ADD-TO-CVECTOR +- QUALIFIER-CHECK-RUNTIME SET-FUNCTION-PRETTY-ARGLIST +- ADD-DIRECT-SUBCLASSES REMOVE-METHOD SET-WRAPPER +- DOCTOR-DFUN-FOR-THE-DEBUGGER MAKE-PLIST +- SYMBOL-OR-CONS-LESSP MAKE-STD-BOUNDP-METHOD-FUNCTION +- UPDATE-CPL METHODS-CONVERTER MAKE-DFUN-ARG-LIST +- MAKE-DISCRIMINATING-FUNCTION-ARGLIST +- STANDARD-INSTANCE-ACCESS REMTAIL DO-SATISFIES-DEFTYPE +- CPL-FORWARD-REFERENCED-CLASS-ERROR FIND-STANDARD-II-METHOD +- MAKE-UNORDERED-METHODS-EMF UPDATE-INITIALIZE-INFO-INTERNAL +- ADD-METHOD COMPUTE-PV |SETF PCL FIND-CLASS-PREDICATE| +- PROCLAIM-DEFMETHOD UPDATE-ALL-PV-TABLE-CACHES +- ITERATE::SIMPLE-EXPAND-ITERATE-FORM CLASS-MIGHT-PRECEDE-P +- MEC-ALL-CLASSES SET-FUNCALLABLE-INSTANCE-FUNCTION +- MAKE-DFUN-LAMBDA-LIST CHECKING-DFUN-INFO +- METHOD-FUNCTION-RETURNING-T PV-WRAPPERS-FROM-ALL-WRAPPERS +- SET-METHODS ITERATE::MV-SETQ SUPERCLASSES-COMPATIBLE-P +- SLOT-EXISTS-P SWAP-WRAPPERS-AND-SLOTS DESCRIBE-PACKAGE +- VALUE-FOR-CACHING SAUT-NOT-PROTOTYPE +- SET-STANDARD-SVUC-METHOD PLIST-VALUE AUGMENT-TYPE +- UPDATE-CLASS N-N-DFUN-INFO VARIABLE-SPECIAL-P +- UPDATE-STD-OR-STR-METHODS ADD-FORMS MAKE-CAXR +- MAKE-DLAP-LAMBDA-LIST REDIRECT-EARLY-FUNCTION-INTERNAL +- GET-KEY-ARG1 EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- MAKE-INTERNAL-READER-METHOD-FUNCTION |SETF PCL FIND-CLASS| +- COMPUTE-CALLS PROCLAIM-DEFGENERIC WALKER::NOTE-DECLARATION +- SYSTEM:%SET-COMPILED-FUNCTION-NAME VARIABLE-LEXICAL-P +- CANONICALIZE-DEFCLASS-OPTION RAISE-METATYPE +- PARSE-QUALIFIER-PATTERN SAUT-NOT-CLASS-EQ +- MAKE-PV-TABLE-INTERNAL WALKER::ENVIRONMENT-FUNCTION +- COMPUTE-APPLICABLE-METHODS-FUNCTION +- EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- PV-TABLE-LOOKUP VARIABLE-CLASS +- MAKE-FAST-METHOD-CALL-LAMBDA-LIST |SETF PCL GDEFINITION| +- NET-CONSTANT-CONVERTER WALKER::VARIABLE-SYMBOL-MACRO-P +- SYMBOL-LESSP GF-MAKE-FUNCTION-FROM-EMF +- REMOVE-DIRECT-SUBCLASSES UPDATE-INITS +- |SETF PCL METHOD-FUNCTION-PLIST| COMPUTE-STD-CPL +- CPL-INCONSISTENT-ERROR CHANGE-CLASS-INTERNAL +- FIND-SLOT-DEFINITION COMPUTE-LAYOUT NO-SLOT +- %SET-CCLOSURE-ENV COMPUTE-CONSTANTS +- SET-STRUCTURE-SVUC-METHOD GET-KEY-ARG REMOVE-SLOT-ACCESSORS +- MAKE-CDXR MEMF-CONSTANT-CONVERTER BOOTSTRAP-SLOT-INDEX +- CLASS-CAN-PRECEDE-P MEC-ALL-CLASSES-INTERNAL +- CLASSES-HAVE-COMMON-SUBCLASS-P MAKE-CLASS-PREDICATE +- SAUT-NOT-CLASS DESTRUCTURE-INTERNAL +- ITERATE::EXTRACT-SPECIAL-BINDINGS MAKE-EARLY-ACCESSOR +- MAP-PV-TABLE-REFERENCES-OF MAKE-STD-WRITER-METHOD-FUNCTION +- FUNCALLABLE-STANDARD-INSTANCE-ACCESS +- METHOD-FUNCTION-RETURNING-NIL MEC-ALL-CLASS-LISTS +- ADD-SLOT-ACCESSORS EMIT-1-NIL-DLAP +- MAKE-STD-READER-METHOD-FUNCTION +- CANONICALIZE-SLOT-SPECIFICATION LIST-EQ REAL-REMOVE-METHOD +- WALKER::ENVIRONMENT-MACRO SAUT-NOT-EQL UPDATE-SLOTS +- DEAL-WITH-ARGUMENTS-OPTION PRINTING-RANDOM-THING-INTERNAL +- WALKER::WALK-REPEAT-EVAL +- PV-WRAPPERS-FROM-ALL-ARGS WALKER::NOTE-LEXICAL-BINDING)) +-(PROCLAIM '(FTYPE (FUNCTION (T) (INTEGER 1 255)) CACHE-NKEYS)) +-(PROCLAIM '(FTYPE (FUNCTION (T) (INTEGER 1 256)) CACHE-LINE-SIZE)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM T T) *) COMPUTE-CACHE-PARAMETERS)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM T *) *) FIND-FREE-CACHE-LINE)) +-(PROCLAIM '(FTYPE (FUNCTION (T) FIELD-TYPE) CACHE-FIELD)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) FUNCTION) CACHE-LIMIT-FN +- FAST-METHOD-CALL-FUNCTION METHOD-CALL-FUNCTION)) +-(MAPC (LAMBDA (COMPILER::X) +- (SETF (GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) T)) +- '(TRACE-METHOD-INTERNAL FDEFINE-CAREFULLY DO-STANDARD-DEFSETF-1 +- REDEFINE-FUNCTION)) +-(PROCLAIM +- '(FTYPE (FUNCTION (FIXNUM FIXNUM T) FIXNUM) +- COMPUTE-PRIMARY-CACHE-LOCATION)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T FIXNUM *) T) GET-CACHE-FROM-CACHE +- COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) (VALUES T T)) MAKE-KEYWORD +- MAKE-CLASS-PREDICATE-NAME)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T *) T) FIND-CLASS-PREDICATE FIND-CLASS-CELL +- USE-CONSTANT-VALUE-DFUN-P MAKE-EARLY-GF ITERATE::MAYBE-WARN +- TRACE-METHOD ALLOCATE-FUNCALLABLE-INSTANCE WALKER::RELIST +- UPDATE-DFUN USE-DISPATCH-DFUN-P PV-TABLE-LOOKUP-PV-ARGS +- MAKE-WRAPPER EARLY-METHOD-SPECIALIZERS +- INITIALIZE-METHOD-FUNCTION MAKE-FINAL-DFUN +- WALKER::WALKER-ENVIRONMENT-BIND-1 MAKE-TYPE-PREDICATE-NAME +- ALLOCATE-STRUCTURE-INSTANCE MAKE-SPECIALIZABLE +- CAPITALIZE-WORDS SET-DFUN ITERATE::FUNCTION-LAMBDA-P +- FIND-CLASS INITIALIZE-INTERNAL-SLOT-GFS SET-ARG-INFO +- WALKER::RELIST* ALLOCATE-STANDARD-INSTANCE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T) *) SAUT-NOT ENSURE-CLASS-VALUES +- EMIT-CHECKING EMIT-DEFAULT-ONLY-FUNCTION EMIT-DEFAULT-ONLY +- SAUT-CLASS CLASS-APPLICABLE-USING-CLASS-P EMIT-CACHING +- DESTRUCTURE GET-NEW-FUNCTION-GENERATOR-INTERNAL +- COMPUTE-TEST MAKE-DIRECT-SLOTD SLOT-NAME-LISTS-FROM-SLOTS +- SAUT-EQL INSURE-DFUN CHECK-INITARGS-VALUES +- SET-FUNCTION-NAME INITIAL-DFUN COMPUTE-STD-CPL-PHASE-1 +- *SUBTYPEP COMPUTE-APPLICABLE-METHODS-USING-TYPES +- SDFUN-FOR-CACHING INVOKE-EMF SPLIT-DECLARATIONS +- GENERATE-FAST-CLASS-SLOT-ACCESS-P COMPUTE-CODE SLOT-VALUE +- SPECIALIZER-APPLICABLE-USING-TYPE-P SLOT-BOUNDP +- FORM-LIST-TO-LISP ITERATE::PARSE-DECLARATIONS +- MAKE-INSTANCE-FUNCTION-TRAP SAUT-PROTOTYPE +- MUTATE-SLOTS-AND-CALLS SAUT-AND SAUT-CLASS-EQ +- FIND-SUPERCLASS-CHAIN SLOT-UNBOUND-INTERNAL +- UPDATE-SLOT-VALUE-GF-INFO SLOT-MAKUNBOUND)) +-(PROCLAIM +- '(FTYPE (FUNCTION NIL *) EMIT-N-N-WRITERS EMIT-N-N-READERS +- COUNT-ALL-DFUNS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) T) CHECKING-FUNCTION +- METHOD-CALL-CALL-METHOD-ARGS EARLY-COLLECT-CPL +- METHOD-FUNCTION-PV-TABLE ECD-OTHER-INITARGS +- BOOTSTRAP-CLASS-PREDICATES CONSTANT-SYMBOL-P GDEFINITION +- %FBOUNDP INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION +- MAKE-INSTANCE-FUNCTION-SYMBOL FGEN-TEST +- GF-PRECOMPUTE-DFUN-AND-EMF-P VARIABLE-GLOBALLY-SPECIAL-P +- SLOT-INITARGS-FROM-STRUCTURE-SLOTD ARG-INFO-P +- STRUCTURE-TYPE-INTERNAL-SLOTDS CCLOSUREP CHECKING-CACHE +- GF-LAMBDA-LIST +- MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- STRUCTURE-SVUC-METHOD DISPATCH-CACHE +- BOOTSTRAP-ACCESSOR-DEFINITIONS FINAL-ACCESSOR-DFUN-TYPE +- SETFBOUNDP ONE-CLASS-P EARLY-GF-P UPDATE-C-A-M-GF-INFO +- FGEN-GENSYMS SORT-SLOTS MAKE-CLASS-EQ-PREDICATE N-N-CACHE +- SFUN-P DFUN-ARG-SYMBOL +- INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION +- EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME +- MAKE-TYPE-PREDICATE SORT-CALLS +- MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION TWO-CLASS-WRAPPER1 +- USE-DEFAULT-METHOD-ONLY-DFUN-P FGEN-SYSTEM +- CACHING-DFUN-COST CPD-CLASS CACHING-CACHE +- INITIAL-DISPATCH-P LOOKUP-FGEN +- COMPUTE-APPLICABLE-METHODS-EMF-STD-P COMPUTE-LINE-SIZE +- GF-INFO-STATIC-C-A-M-EMF FAST-INSTANCE-BOUNDP-P +- N-N-ACCESSOR-TYPE KEYWORD-SPEC-NAME DEFAULT-TEST-CONVERTER +- RESET-INITIALIZE-INFO INITIAL-P +- INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL +- EXPAND-MAKE-INSTANCE-FORM STRUCTURE-SLOT-BOUNDP +- STANDARD-SVUC-METHOD TWO-CLASS-INDEX +- EARLY-CLASS-PRECEDENCE-LIST MAKE-INITIAL-DFUN GMAKUNBOUND +- METHODS-CONTAIN-EQL-SPECIALIZER-P EXPAND-SHORT-DEFCOMBIN +- ACCESSOR-DFUN-INFO-CACHE MAKE-CALL-METHODS +- STRUCTURE-SLOTD-NAME ALLOCATE-CACHE-VECTOR +- RESET-CLASS-INITIALIZE-INFO GET-SETF-FUNCTION-NAME +- METHOD-CALL-P LEGAL-CLASS-NAME-P EXTRACT-PARAMETERS +- EARLY-SLOT-DEFINITION-NAME ECD-METACLASS DISPATCH-P +- METHOD-FUNCTION-PLIST %STD-INSTANCE-SLOTS +- CANONICAL-SLOT-NAME CONSTANT-VALUE-DFUN-INFO +- FUNCTION-RETURNING-T FUNCTION-PRETTY-ARGLIST +- STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST CHECK-WRAPPER-VALIDITY +- INITIALIZE-INFO-P CPD-AFTER +- MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- ONE-INDEX-INDEX WALKER::ENV-DECLARATIONS +- STRUCTURE-SLOTD-TYPE MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION +- EVAL-FORM LIST-DFUN +- INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION +- CACHE-OWNER FAST-METHOD-CALL-PV-CELL DFUN-INFO-P +- UPDATE-PV-TABLE-CACHE-INFO EARLY-CLASS-SLOTDS +- FUNCTION-RETURNING-NIL ECD-CLASS-NAME +- TWO-CLASS-ACCESSOR-TYPE EARLY-CLASS-DEFINITION +- FAST-METHOD-CALL-P INITIALIZE-INFO-CACHED-RI-VALID-P +- COMPUTE-MCASE-PARAMETERS GF-DFUN-INFO +- INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST +- EARLY-METHOD-LAMBDA-LIST ONE-CLASS-WRAPPER0 +- CLASS-PRECEDENCE-DESCRIPTION-P GET-MAKE-INSTANCE-FUNCTIONS +- EXPAND-LONG-DEFCOMBIN MAP-SPECIALIZERS +- EARLY-CLASS-DIRECT-SUBCLASSES WALKER::ENV-WALK-FORM +- STRUCTURE-TYPE-INCLUDED-TYPE-NAME +- ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE GBOUNDP ECD-SOURCE +- CLASS-FROM-TYPE INITIALIZE-INFO-CACHED-NEW-KEYS +- ARG-INFO-NKEYS DEFAULT-CONSTANT-CONVERTER +- INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION +- STORE-FGEN EARLY-METHOD-STANDARD-ACCESSOR-P +- INTERN-FUNCTION-NAME NET-TEST-CONVERTER ARG-INFO-KEY/REST-P +- COMPLICATED-INSTANCE-CREATION-METHOD +- FTYPE-DECLARATION-FROM-LAMBDA-LIST +- GENERIC-CLOBBERS-FUNCTION DEFAULT-STRUCTUREP +- GF-INFO-C-A-M-EMF-STD-P ARG-INFO-VALID-P +- FORMAT-CYCLE-REASONS FAST-METHOD-CALL-ARG-INFO +- GET-MAKE-INSTANCE-FUNCTION-SYMBOL %STD-INSTANCE-WRAPPER +- SLOT-BOUNDP-SYMBOL INITIAL-CACHE +- METHOD-FUNCTION-NEEDS-NEXT-METHODS-P +- SYSTEM:%COMPILED-FUNCTION-NAME MAKE-CALLS-TYPE-DECLARATION +- UPDATE-CLASS-CAN-PRECEDE-P SLOT-READER-SYMBOL FREE-CACHE +- DNET-METHODS-P CONSTANT-VALUE-CACHE +- GET-BUILT-IN-CLASS-SYMBOL UPDATE-GFS-OF-CLASS +- ONE-CLASS-CACHE STD-INSTANCE-P ONE-INDEX-CACHE +- STRUCTURE-SLOTD-WRITER-FUNCTION FGEN-GENERATOR-LAMBDA +- EXTRACT-SPECIALIZER-NAMES EARLY-SLOT-DEFINITION-LOCATION +- DO-STANDARD-DEFSETFS-FOR-DEFCLASS %CCLOSURE-ENV +- EARLY-ACCESSOR-METHOD-SLOT-NAME ACCESSOR-DFUN-INFO-P +- INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS SLOT-WRITER-SYMBOL +- ARG-INFO-KEYWORDS INITIALIZE-INFO-WRAPPER +- FAST-METHOD-CALL-NEXT-METHOD-CALL INITIAL-DISPATCH-CACHE +- NEXT-WRAPPER-FIELD +- INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST CHECKING-P +- EXTRACT-REQUIRED-PARAMETERS GET-BUILT-IN-WRAPPER-SYMBOL +- INITIALIZE-INFO-CACHED-CONSTANTS +- STRUCTURE-SLOTD-READER-FUNCTION EARLY-METHOD-CLASS +- STRUCTURE-OBJECT-P DEFAULT-METHOD-ONLY-CACHE +- PARSE-SPECIALIZERS INTERN-EQL-SPECIALIZER +- COMPILE-LAMBDA-DEFERRED MAKE-CONSTANT-FUNCTION +- MAKE-PV-TYPE-DECLARATION ARG-INFO-APPLYP +- GET-PV-CELL-FOR-CLASS ONE-INDEX-DFUN-INFO-INDEX +- UNENCAPSULATED-FDEFINITION CHECK-CACHE +- WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE +- INITIALIZE-INFO-KEY ONE-CLASS-INDEX SYSTEM:%STRUCTURE-NAME +- SLOT-VECTOR-SYMBOL MAKE-PV-TABLE-TYPE-DECLARATION +- TWO-CLASS-CACHE PROCLAIM-INCOMPATIBLE-SUPERCLASSES +- BUILT-IN-OR-STRUCTURE-WRAPPER1 ECD-SUPERCLASS-NAMES +- STRUCTURE-TYPE CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P +- N-N-P INTERNED-SYMBOL-P DEFAULT-METHOD-ONLY-P +- EARLY-CLASS-SLOTS NO-METHODS-P ARG-INFO-NUMBER-OPTIONAL +- ONE-INDEX-P GET-MAKE-INSTANCE-FUNCTION EARLY-CLASS-NAME +- METHOD-FUNCTION-FROM-FAST-FUNCTION MAKE-PERMUTATION-VECTOR +- ONE-CLASS-ACCESSOR-TYPE TWO-CLASS-P BUILT-IN-WRAPPER-OF +- FREE-CACHE-VECTOR GET-CACHE-VECTOR ARG-INFO-LAMBDA-LIST +- UPDATE-GF-INFO ONE-INDEX-DFUN-INFO-CACHE %SYMBOL-FUNCTION +- ACCESSOR-DFUN-INFO-ACCESSOR-TYPE FUNCALLABLE-INSTANCE-P +- ECD-CANONICAL-SLOTS EARLY-COLLECT-SLOTS +- INITIALIZE-INFO-CACHED-VALID-P UNPARSE-SPECIALIZERS +- GF-INFO-FAST-MF-P +- MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- EARLY-CLASS-NAME-OF GF-DFUN-CACHE CLASS-PREDICATE +- EXTRACT-LAMBDA-LIST CLASS-OF COPY-CACHE SYMBOL-PKG-NAME +- ONE-INDEX-DFUN-INFO-P WRAPPER-OF METHOD-FUNCTION-METHOD +- CPD-SUPERS DEFAULT-STRUCTURE-INSTANCE-P +- STRUCTURE-SLOTD-INIT-FORM EARLY-METHOD-QUALIFIERS +- LIST-LARGE-CACHE UPDATE-GF-SIMPLE-ACCESSOR-TYPE TYPE-CLASS +- MAKE-EQL-PREDICATE EARLY-GF-NAME UPDATE-ALL-C-A-M-GF-INFO +- FLUSH-CACHE-VECTOR-INTERNAL ITERATE::SEQUENCE-ACCESSOR +- MAP-ALL-GENERIC-FUNCTIONS STRUCTURE-TYPE-P +- FIND-CYCLE-REASONS DEFAULT-STRUCTURE-TYPE +- COMPUTE-CLASS-SLOTS WRAPPER-FOR-STRUCTURE +- INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION +- USE-CACHING-DFUN-P EARLY-COLLECT-DEFAULT-INITARGS +- DEFAULT-SECONDARY-DISPATCH-FUNCTION ONE-INDEX-ACCESSOR-TYPE +- WALKER::ENV-WALK-FUNCTION WALKER::ENV-LOCK +- STRUCTURE-SLOTD-ACCESSOR-SYMBOL +- METHOD-LL->GENERIC-FUNCTION-LL CACHE-P WRAPPER-FIELD +- INITIALIZE-INFO-BOUND-SLOTS DEFAULT-CONSTANTP +- MAKE-FUNCTION-INLINE COMPUTE-STD-CPL-PHASE-2 +- CACHING-DFUN-INFO CONSTANT-VALUE-P +- WALKER::GET-WALKER-TEMPLATE ARG-INFO-METATYPES COUNT-DFUN +- MAKE-INITFUNCTION WALKER::ENV-LEXICAL-VARIABLES PV-TABLEP +- COMPILE-LAMBDA-UNCOMPILED UNDEFMETHOD-1 +- GF-INFO-SIMPLE-ACCESSOR-TYPE FORCE-CACHE-FLUSHES +- DFUN-INFO-CACHE GFS-OF-TYPE TWO-CLASS-WRAPPER0 +- ITERATE::VARIABLES-FROM-LET SHOW-DFUN-COSTS +- ARG-INFO-PRECEDENCE FGEN-GENERATOR +- RESET-CLASS-INITIALIZE-INFO-1 CACHING-P NO-METHODS-CACHE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (*) *) INVALID-METHOD-ERROR +- METHOD-COMBINATION-ERROR UNTRACE-METHOD +- UPDATE-MAKE-INSTANCE-FUNCTION-TABLE LIST-LARGE-CACHES)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) LIST) CACHE-OVERFLOW PV-TABLE-SLOT-NAME-LISTS +- PV-TABLE-CALL-LIST)) +-(PROCLAIM '(FTYPE (FUNCTION (T) BOOLEAN) CACHE-VALUEP)) +-(PROCLAIM '(FTYPE (FUNCTION NIL FIXNUM) GET-WRAPPER-CACHE-NUMBER)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM T) T) %CCLOSURE-ENV-NTHCDR)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T) *) +- COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL +- WALK-METHOD-LAMBDA +- |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- ADD-METHOD-DECLARATIONS +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- MAKE-TWO-CLASS-ACCESSOR-DFUN +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| +- |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))|)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T T) *) +- |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| +- ITERATE::ITERATE-TRANSFORM-BODY)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T *) *) ITERATE::RENAME-LET-BINDINGS +- MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE1)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T) *) CONSTANT-VALUE-MISS +- EMIT-ONE-OR-N-INDEX-READER/WRITER CACHING-MISS +- CACHE-MISS-VALUES +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| +- WALKER::WALK-FORM-INTERNAL +- GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION +- SLOT-VALUE-USING-CLASS-DFUN SLOT-BOUNDP-USING-CLASS-DFUN +- |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| +- |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| +- |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- MAKE-FINAL-CONSTANT-VALUE-DFUN CHECK-METHOD-ARG-INFO +- MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION +- MAKE-FINAL-CACHING-DFUN EMIT-READER/WRITER-FUNCTION +- SET-SLOT-VALUE +- |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| +- WALKER::WALK-LET-IF ACCESSOR-VALUES1 +- |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| +- ITERATE::EXPAND-INTO-LET OPTIMIZE-SLOT-VALUE-BY-CLASS-P +- ITERATE::RENAME-VARIABLES +- EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION CHECKING-MISS +- |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- ACCESSOR-VALUES-INTERNAL GET-CLASS-SLOT-VALUE-1 +- LOAD-LONG-DEFCOMBIN +- |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| +- |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| +- MAKE-OPTIMIZED-STD-WRITER-METHOD-FUNCTION +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| +- MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION +- EMIT-READER/WRITER GENERATING-LISP +- MAKE-FINAL-N-N-ACCESSOR-DFUN +- |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- ITERATE::WALK-GATHERING-BODY +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- CONVERT-METHODS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) *) BOOTSTRAP-ACCESSOR-DEFINITION +- INITIALIZE-INSTANCE-SIMPLE-FUNCTION +- |(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| +- ORDER-SPECIALIZERS MAKE-ONE-CLASS-ACCESSOR-DFUN +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| +- GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION +- |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- SETF-SLOT-VALUE-USING-CLASS-DFUN +- GENERATE-DISCRIMINATION-NET +- MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN +- |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (T T))| ACCESSOR-VALUES +- LOAD-SHORT-DEFCOMBIN SET-CLASS-SLOT-VALUE-1 +- |(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- REAL-MAKE-METHOD-LAMBDA EMIT-CHECKING-OR-CACHING-FUNCTION +- |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- MAKE-SHARED-INITIALIZE-FORM-LIST +- |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| +- ACCESSOR-MISS |(FAST-METHOD NO-APPLICABLE-METHOD (T))| +- MAKE-FINAL-CHECKING-DFUN +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- GET-ACCESSOR-METHOD-FUNCTION +- |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| +- |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| +- |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| +- EMIT-CHECKING-OR-CACHING)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T) *) MEMF-CODE-CONVERTER +- |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- GENERATE-DISCRIMINATION-NET-INTERNAL +- DO-SHORT-METHOD-COMBINATION +- MAKE-LONG-METHOD-COMBINATION-FUNCTION +- CACHE-MISS-VALUES-INTERNAL)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T *) *) MAKE-ONE-INDEX-ACCESSOR-DFUN +- WALKER::WALK-DECLARATIONS GET-SECONDARY-DISPATCH-FUNCTION)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T *) *) SLOT-VALUE-OR-DEFAULT NESTED-WALK-FORM +- LOAD-DEFGENERIC MAKE-ACCESSOR-TABLE +- MAKE-DEFAULT-INITARGS-FORM-LIST +- GET-EFFECTIVE-METHOD-FUNCTION MAKE-CHECKING-DFUN +- GET-COMPLEX-INITIALIZATION-FUNCTIONS MAKE-N-N-ACCESSOR-DFUN +- GET-SIMPLE-INITIALIZATION-FUNCTION MAKE-FINAL-ACCESSOR-DFUN +- TYPES-FROM-ARGUMENTS MAKE-EFFECTIVE-METHOD-FUNCTION +- COMPUTE-SECONDARY-DISPATCH-FUNCTION)) +-(PROCLAIM '(FTYPE (FUNCTION (T T T T T T *) *) REAL-MAKE-A-METHOD)) +-(PROCLAIM '(FTYPE (FUNCTION (T) SIMPLE-VECTOR) CACHE-VECTOR)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T) T) BOOTSTRAP-MAKE-SLOT-DEFINITION +- |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- LOAD-DEFCLASS MAKE-EARLY-CLASS-DEFINITION +- WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 OPTIMIZE-GF-CALL +- EMIT-SLOT-ACCESS REAL-LOAD-DEFCLASS SET-ARG-INFO1)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T) T) +- |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| +- |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- EXPAND-EMF-CALL-METHOD +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- COMPUTE-PV-SLOT +- |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- UPDATE-SLOTS-IN-PV BOOTSTRAP-MAKE-SLOT-DEFINITIONS +- WALKER::WALK-TEMPLATE-HANDLE-REPEAT WALKER::WALK-BINDINGS-1 +- OPTIMIZE-ACCESSOR-CALL REAL-MAKE-METHOD-INITARGS-FORM +- |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| +- MAKE-EMF-CACHE MAKE-METHOD-INITARGS-FORM-INTERNAL1 +- BOOTSTRAP-ACCESSOR-DEFINITIONS1 +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- MAKE-INSTANCE-FUNCTION-COMPLEX MAKE-FGEN +- |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- MAKE-FINAL-ORDINARY-DFUN-INTERNAL +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- MAKE-INSTANCE-FUNCTION-SIMPLE OPTIMIZE-INSTANCE-ACCESS +- MAKE-PARAMETER-REFERENCES +- GET-MAKE-INSTANCE-FUNCTION-INTERNAL +- |(FAST-METHOD SLOT-UNBOUND (T T T))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| +- |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- LOAD-FUNCTION-GENERATOR +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| +- OPTIMIZE-GENERIC-FUNCTION-CALL)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T *) T) EMIT-FETCH-WRAPPER FILL-CACHE +- GET-METHOD CHECK-INITARGS-2-PLIST MAKE-EMF-CALL +- CHECK-INITARGS-1 WALKER::WALK-ARGLIST REAL-GET-METHOD +- CAN-OPTIMIZE-ACCESS1 CHECK-INITARGS-2-LIST)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T) T) ONE-CLASS-DFUN-INFO +- |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| SORT-METHODS +- OPTIMIZE-GF-CALL-INTERNAL WALKER::WALK-LABELS +- |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- WALKER::WALK-DO +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| +- ITERATE::RENAME-AND-CAPTURE-VARIABLES EXPAND-DEFGENERIC +- |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- FLUSH-CACHE-TRAP WALKER::WALK-MACROLET +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- COMPUTE-EFFECTIVE-METHOD OPTIMIZE-SET-SLOT-VALUE +- WALKER::WALK-SYMBOL-MACROLET OPTIMIZE-SLOT-BOUNDP +- |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- GET-FUNCTION-GENERATOR FIX-SLOT-ACCESSORS +- SET-FUNCTION-NAME-1 WALKER::WALK-LET EMIT-BOUNDP-CHECK +- INITIALIZE-INTERNAL-SLOT-GFS* PRINT-CACHE WALKER::WALK-IF +- WALKER::WALK-SETQ WALKER::RELIST-INTERNAL +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- EMIT-1-T-DLAP CAN-OPTIMIZE-ACCESS WALKER::WALK-COMPILER-LET +- |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| +- |SETF PCL METHOD-FUNCTION-GET| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| +- GET-NEW-FUNCTION-GENERATOR WALKER::WALK-UNEXPECTED-DECLARE +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- VARIABLE-DECLARATION +- |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| +- MAP-ALL-ORDERS ONE-INDEX-DFUN-INFO WALKER::WALK-LAMBDA +- |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- NOTE-PV-TABLE-REFERENCE WALKER::RECONS +- STANDARD-COMPUTE-EFFECTIVE-METHOD +- |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- |SETF PCL PLIST-VALUE| EMIT-GREATER-THAN-1-DLAP +- MAKE-METHOD-SPEC ITERATE::OPTIMIZE-GATHERING-FORM +- OPTIMIZE-SLOT-VALUE PRINT-STD-INSTANCE COMPUTE-PRECEDENCE +- WALKER::WALK-TAGBODY WALKER::WALK-NAMED-LAMBDA +- |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- SKIP-FAST-SLOT-ACCESS-P TRACE-EMF-CALL-INTERNAL +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- ITERATE::SIMPLE-EXPAND-GATHERING-FORM +- |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- SORT-APPLICABLE-METHODS SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P +- OBSOLETE-INSTANCE-TRAP WALKER::WALK-PROG +- |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- INVALIDATE-WRAPPER +- |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- ENTRY-IN-CACHE-P WALKER::WALK-TAGBODY-1 +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- WALKER::WALK-LOCALLY WALKER::WALK-MULTIPLE-VALUE-BIND +- |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| +- WRAP-METHOD-GROUP-SPECIFIER-BINDINGS WALKER::WALK-LET* +- |(FAST-METHOD CLASS-PREDICATE-NAME (T))| +- |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- EMIT-SLOT-READ-FORM FIRST-FORM-TO-LISP +- MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL +- WALKER::WALK-PROG* WALKER::WALK-FLET +- |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| +- MAKE-METHOD-INITARGS-FORM-INTERNAL WALKER::WALK-DO* +- MAKE-TOP-LEVEL-FORM +- |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| +- ITERATE::OPTIMIZE-ITERATE-FORM DECLARE-STRUCTURE +- MAKE-DFUN-CALL ITERATE::VARIABLE-SAME-P +- |(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- WALKER::WALK-MULTIPLE-VALUE-SETQ CONVERT-TABLE +- |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))|)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T) T) +- |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| +- EMIT-CHECKING-OR-CACHING-FUNCTION-PRELIMINARY +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- WALKER::WALK-LET/LET* +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE +- |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD DOCUMENTATION (T))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- MAYBE-EXPAND-ACCESSOR-FORM BOOTSTRAP-SET-SLOT +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- WALKER::WALK-TEMPLATE +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| +- GET-WRAPPERS-FROM-CLASSES +- |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- MAKE-EFFECTIVE-METHOD-FUNCTION1 +- |(FAST-METHOD PRINT-OBJECT (CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- EXPAND-CACHE EXPAND-DEFCLASS +- |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| +- |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| +- |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL +- |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| +- TWO-CLASS-DFUN-INFO +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (T T))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- FILL-CACHE-P MEMF-TEST-CONVERTER +- |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- WALKER::WALK-BINDINGS-2 +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| +- |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- WALKER::WALK-DO/DO* ADJUST-CACHE +- |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| +- OPTIMIZE-READER +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- EXPAND-SYMBOL-MACROLET-INTERNAL +- |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| +- |(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| +- MAKE-DISPATCH-LAMBDA +- |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| +- INITIALIZE-INSTANCE-SIMPLE +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- OPTIMIZE-WRITER +- |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- LOAD-PRECOMPILED-IIS-ENTRY +- LOAD-PRECOMPILED-DFUN-CONSTRUCTOR +- |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| +- WALKER::WALK-PROG/PROG* +- |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD MAKE-INSTANCE (CLASS))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))|)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T *) T) COMPUTE-SECONDARY-DISPATCH-FUNCTION1 +- FIND-CLASS-PREDICATE-FROM-CELL +- ENSURE-GENERIC-FUNCTION-USING-CLASS GET-DECLARATION +- METHOD-FUNCTION-GET CPL-ERROR EMIT-MISS +- PRECOMPUTE-EFFECTIVE-METHODS GET-METHOD-FUNCTION-PV-CELL +- MAP-CACHE EXPAND-EFFECTIVE-METHOD-FUNCTION +- MAKE-EMF-FROM-METHOD GET-EFFECTIVE-METHOD-FUNCTION1 +- REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION +- NAMED-OBJECT-PRINT-FUNCTION +- MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE PROBE-CACHE +- INITIALIZE-INFO REAL-ENSURE-GF-USING-CLASS--NULL +- FIND-CLASS-FROM-CELL WALKER::CONVERT-MACRO-TO-LAMBDA +- REAL-ADD-METHOD RECORD-DEFINITION)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T *) T) MAKE-DEFMETHOD-FORM +- MAKE-DEFMETHOD-FORM-INTERNAL LOAD-DEFMETHOD +- EARLY-MAKE-A-METHOD)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T *) T) EMIT-DLAP +- GET-SECONDARY-DISPATCH-FUNCTION1)) +-(PROCLAIM '(FTYPE (FUNCTION (T T FIXNUM) T) COMPUTE-STD-CPL-PHASE-3)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T T T) T) +- GET-SECONDARY-DISPATCH-FUNCTION2)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T *) T) REAL-ADD-NAMED-METHOD +- EARLY-ADD-NAMED-METHOD FILL-DFUN-CACHE)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T T) T) +- |(FAST-METHOD SLOT-MISSING (T T T T))| +- LOAD-DEFMETHOD-INTERNAL EXPAND-DEFMETHOD)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T FIXNUM) T) GET-CACHE +- FILL-CACHE-FROM-CACHE-P)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T T T T T T T T T *) T) +- BOOTSTRAP-INITIALIZE-CLASS)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) FIXNUM) N-N-ACCESSORS-LIMIT-FN +- FAST-INSTANCE-BOUNDP-INDEX PV-TABLE-PV-SIZE +- ARG-INFO-NUMBER-REQUIRED EARLY-CLASS-SIZE DEFAULT-LIMIT-FN +- CHECKING-LIMIT-FN ONE-INDEX-LIMIT-FN CPD-COUNT CACHE-COUNT +- PV-CACHE-LIMIT-FN CACHING-LIMIT-FN)) +-(PROCLAIM '(FTYPE (FUNCTION (FIXNUM) T) POWER-OF-TWO-CEILING)) +-(PROCLAIM '(FTYPE (FUNCTION (T T *) (VALUES T T)) SYMBOL-APPEND)) +-(PROCLAIM '(FTYPE (FUNCTION (T STREAM T) T) PRINT-DFUN-INFO)) +-(PROCLAIM +- '(FTYPE (FUNCTION (T) NON-NEGATIVE-FIXNUM) CACHE-NLINES CACHE-MASK +- CACHE-MAX-LOCATION CACHE-SIZE)) ++(COMMON-LISP::IN-PACKAGE "PCL") ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) ++ PCL::CACHE-LIMIT-FN PCL::FAST-METHOD-CALL-FUNCTION ++ PCL::METHOD-CALL-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ PCL::DISPATCH-DFUN-INFO PCL::DEFAULT-METHOD-ONLY-DFUN-INFO ++ PCL::MAKE-CACHE PCL::BOOTSTRAP-BUILT-IN-CLASSES ++ PCL::RENEW-SYS-FILES PCL::SHOW-EMF-CALL-TRACE PCL::MAKE-CPD ++ PCL::BOOTSTRAP-META-BRAID PCL::CACHES-TO-ALLOCATE ++ PCL::LIST-ALL-DFUNS PCL::INITIAL-DISPATCH-DFUN-INFO ++ PCL::INITIAL-DFUN-INFO PCL::%%ALLOCATE-INSTANCE--CLASS ++ PCL::MAKE-ARG-INFO PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2 ++ PCL::SHOW-FREE-CACHE-VECTORS PCL::UPDATE-DISPATCH-DFUNS ++ PCL::GET-EFFECTIVE-METHOD-GENSYM PCL::IN-THE-COMPILER-P ++ PCL::SHOW-DFUN-CONSTRUCTORS PCL::NO-METHODS-DFUN-INFO ++ PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 ++ PCL::STRUCTURE-FUNCTIONS-EXIST-P)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) ++ PCL::CACHE-FIELD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ COMMON-LISP::SIMPLE-VECTOR) ++ PCL::CACHE-VECTOR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 256)) ++ PCL::CACHE-LINE-SIZE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 255)) ++ PCL::CACHE-NKEYS)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(PCL::REDEFINE-FUNCTION PCL::DO-STANDARD-DEFSETF-1 ++ PCL::FDEFINE-CAREFULLY PCL::TRACE-METHOD-INTERNAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::SYMBOL-APPEND)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL ++ PCL::GENERIC-CLOBBERS-FUNCTION PCL::STRUCTURE-SLOTD-TYPE ++ WALKER::GET-WALKER-TEMPLATE PCL::COMPILE-LAMBDA-UNCOMPILED ++ PCL::EXTRACT-LAMBDA-LIST PCL::DEFAULT-METHOD-ONLY-P ++ PCL::DISPATCH-CACHE PCL::STRUCTURE-SLOTD-NAME ++ PCL::FAST-METHOD-CALL-P PCL::SFUN-P ++ PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST ++ PCL::EARLY-CLASS-DEFINITION PCL::CONSTANT-SYMBOL-P ++ PCL::ARG-INFO-LAMBDA-LIST WALKER::ENV-LEXICAL-VARIABLES ++ PCL::INTERN-EQL-SPECIALIZER PCL::PARSE-SPECIALIZERS ++ PCL::%STD-INSTANCE-WRAPPER PCL::UPDATE-ALL-C-A-M-GF-INFO ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION ++ PCL::STORE-FGEN PCL::COMPUTE-MCASE-PARAMETERS ++ PCL::INTERNED-SYMBOL-P PCL::MAKE-CALL-METHODS ++ PCL::USE-CACHING-DFUN-P PCL::LEGAL-CLASS-NAME-P ++ WALKER::VARIABLE-GLOBALLY-SPECIAL-P PCL::FUNCTION-RETURNING-T ++ PCL::METHOD-FUNCTION-METHOD PCL::GET-BUILT-IN-CLASS-SYMBOL ++ PCL::DEFAULT-STRUCTURE-TYPE PCL::GF-DFUN-INFO PCL::CACHING-P ++ PCL::FREE-CACHE-VECTOR PCL::ONE-CLASS-CACHE ++ PCL::DEFAULT-TEST-CONVERTER PCL::UNDEFMETHOD-1 ++ PCL::MAKE-INITFUNCTION PCL::GET-CACHE-VECTOR ++ PCL::CLASS-PRECEDENCE-DESCRIPTION-P PCL::GF-INFO-FAST-MF-P ++ PCL::ECD-SOURCE PCL::INITIAL-P PCL::ARG-INFO-APPLYP ++ PCL::ARG-INFO-KEYWORDS ++ PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION ++ PCL::CACHING-DFUN-COST PCL::INITIAL-DISPATCH-P PCL::EVAL-FORM ++ PCL::MAKE-CONSTANT-FUNCTION PCL::FUNCTION-RETURNING-NIL ++ PCL::INITIALIZE-INFO-BOUND-SLOTS PCL::FGEN-GENSYMS ++ PCL::EXPAND-SHORT-DEFCOMBIN WALKER::ENV-LOCK ++ PCL::INITIALIZE-INFO-CACHED-CONSTANTS ++ PCL::INITIALIZE-INFO-WRAPPER ++ PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME PCL::TWO-CLASS-INDEX ++ PCL::ONE-INDEX-ACCESSOR-TYPE ++ PCL::EARLY-COLLECT-DEFAULT-INITARGS WALKER::ENV-WALK-FORM ++ PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS PCL::MAKE-FUNCTION-INLINE ++ PCL::FLUSH-CACHE-VECTOR-INTERNAL ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION ++ PCL::FGEN-GENERATOR PCL::CONSTANT-VALUE-P ++ PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION ++ PCL::EARLY-CLASS-PRECEDENCE-LIST PCL::SLOT-BOUNDP-SYMBOL ++ PCL::ARG-INFO-NUMBER-OPTIONAL ++ PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P PCL::GET-PV-CELL-FOR-CLASS ++ PCL::CHECKING-FUNCTION PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P ++ PCL::INITIAL-DISPATCH-CACHE PCL::STRUCTURE-SVUC-METHOD ++ PCL::NO-METHODS-CACHE PCL::GF-DFUN-CACHE PCL::%CCLOSURE-ENV ++ PCL::CONSTANT-VALUE-CACHE PCL::BUILT-IN-WRAPPER-OF ++ PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P ++ PCL::EARLY-COLLECT-CPL COMMON-LISP::CLASS-OF ++ PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL PCL::SYMBOL-PKG-NAME ++ PCL::GDEFINITION ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION ++ PCL::ACCESSOR-DFUN-INFO-CACHE PCL::EXTRACT-SPECIALIZER-NAMES ++ PCL::CHECK-WRAPPER-VALIDITY PCL::MAKE-INITIAL-DFUN ++ PCL::WRAPPER-FIELD PCL::EARLY-SLOT-DEFINITION-LOCATION ++ PCL::EARLY-GF-P PCL::GF-INFO-STATIC-C-A-M-EMF PCL::LOOKUP-FGEN ++ PCL::MAKE-PV-TYPE-DECLARATION ++ PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS ++ PCL::EARLY-METHOD-CLASS ++ PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION ++ WALKER::ENV-DECLARATIONS PCL::ALLOCATE-CACHE-VECTOR ++ PCL::FUNCTION-PRETTY-ARGLIST ++ PCL::EARLY-CLASS-DIRECT-SUBCLASSES ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P ++ PCL::MAKE-CLASS-EQ-PREDICATE PCL::ECD-OTHER-INITARGS ++ PCL::GBOUNDP PCL::METHOD-FUNCTION-PV-TABLE ++ WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE ++ PCL::MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::FIND-CYCLE-REASONS PCL::FGEN-TEST ++ PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD PCL::FREE-CACHE ++ PCL::TYPE-CLASS PCL::INITIAL-CACHE ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS ++ PCL::STRUCTURE-SLOTD-WRITER-FUNCTION ++ PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION ++ PCL::EARLY-COLLECT-SLOTS PCL::LIST-DFUN ++ PCL::EXPAND-MAKE-INSTANCE-FORM PCL::N-N-CACHE ++ PCL::MAKE-TYPE-PREDICATE PCL::INTERN-FUNCTION-NAME ++ PCL::GET-MAKE-INSTANCE-FUNCTIONS WALKER::ENV-WALK-FUNCTION ++ PCL::TWO-CLASS-CACHE PCL::MAKE-CALLS-TYPE-DECLARATION ++ PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION ++ PCL::INITIALIZE-INFO-KEY PCL::GF-LAMBDA-LIST ++ ITERATE::VARIABLES-FROM-LET PCL::COMPUTE-CLASS-SLOTS ++ PCL::DFUN-ARG-SYMBOL PCL::CHECKING-P PCL::ARG-INFO-P ++ PCL::INITIALIZE-INFO-CACHED-RI-VALID-P PCL::CHECKING-CACHE ++ PCL::METHOD-FUNCTION-PLIST PCL::STRUCTURE-OBJECT-P ++ PCL::ARG-INFO-PRECEDENCE PCL::ONE-CLASS-INDEX ++ PCL::STD-INSTANCE-P PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::EARLY-SLOT-DEFINITION-NAME PCL::UNPARSE-SPECIALIZERS ++ PCL::STRUCTURE-TYPE-P PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE ++ PCL::PV-TABLEP PCL::CLASS-FROM-TYPE ++ PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE PCL::STRUCTURE-TYPE ++ PCL::MAKE-EQL-PREDICATE PCL::TWO-CLASS-ACCESSOR-TYPE ++ PCL::DEFAULT-STRUCTURE-INSTANCE-P ++ PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME ++ PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE PCL::GFS-OF-TYPE ++ PCL::DEFAULT-STRUCTUREP PCL::EARLY-CLASS-NAME-OF ++ PCL::%STD-INSTANCE-SLOTS PCL::ONE-INDEX-INDEX PCL::WRAPPER-OF ++ PCL::ARG-INFO-VALID-P PCL::KEYWORD-SPEC-NAME ++ PCL::METHOD-CALL-P PCL::SHOW-DFUN-COSTS PCL::DFUN-INFO-CACHE ++ PCL::DEFAULT-CONSTANT-CONVERTER ITERATE::SEQUENCE-ACCESSOR ++ PCL::COUNT-DFUN PCL::EXPAND-LONG-DEFCOMBIN ++ PCL::CACHING-DFUN-INFO PCL::INITIALIZE-INFO-CACHED-VALID-P ++ PCL::FAST-INSTANCE-BOUNDP-P PCL::ARG-INFO-METATYPES ++ PCL::EXTRACT-PARAMETERS PCL::GF-INFO-C-A-M-EMF-STD-P ++ PCL::FINAL-ACCESSOR-DFUN-TYPE PCL::GMAKUNBOUND ++ PCL::FAST-METHOD-CALL-ARG-INFO PCL::COMPUTE-LINE-SIZE ++ PCL::ONE-INDEX-CACHE PCL::NO-METHODS-P ++ PCL::COMPUTE-STD-CPL-PHASE-2 ++ PCL::COMPLICATED-INSTANCE-CREATION-METHOD ++ PCL::MAKE-PERMUTATION-VECTOR PCL::CONSTANT-VALUE-DFUN-INFO ++ PCL::TWO-CLASS-WRAPPER1 PCL::MAP-ALL-GENERIC-FUNCTIONS ++ PCL::CLASS-PREDICATE SYSTEM::%STRUCTURE-NAME ++ PCL::RESET-CLASS-INITIALIZE-INFO ++ PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 PCL::EARLY-CLASS-NAME ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::UPDATE-PV-TABLE-CACHE-INFO PCL::SLOT-READER-SYMBOL ++ PCL::ARG-INFO-NKEYS PCL::METHOD-CALL-CALL-METHOD-ARGS ++ PCL::CCLOSUREP PCL::DEFAULT-METHOD-ONLY-CACHE ++ PCL::NEXT-WRAPPER-FIELD PCL::SLOT-WRITER-SYMBOL ++ PCL::ACCESSOR-DFUN-INFO-P ++ PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::EXTRACT-REQUIRED-PARAMETERS PCL::FORMAT-CYCLE-REASONS ++ PCL::UNENCAPSULATED-FDEFINITION ++ PCL::GET-BUILT-IN-WRAPPER-SYMBOL PCL::ONE-CLASS-P ++ PCL::ECD-METACLASS PCL::METHOD-LL->GENERIC-FUNCTION-LL ++ PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES PCL::ONE-INDEX-P ++ PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST ++ PCL::ECD-CANONICAL-SLOTS ++ PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P ++ PCL::INITIALIZE-INFO-CACHED-NEW-KEYS ++ PCL::STRUCTURE-SLOTD-READER-FUNCTION ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST ++ PCL::DISPATCH-P PCL::LIST-LARGE-CACHE ++ PCL::FAST-METHOD-CALL-PV-CELL PCL::GET-MAKE-INSTANCE-FUNCTION ++ PCL::DNET-METHODS-P PCL::STRUCTURE-SLOTD-INIT-FORM ++ PCL::UPDATE-CLASS-CAN-PRECEDE-P PCL::ONE-CLASS-ACCESSOR-TYPE ++ PCL::RESET-INITIALIZE-INFO PCL::STANDARD-SVUC-METHOD ++ PCL::DEFAULT-CONSTANTP PCL::UPDATE-C-A-M-GF-INFO ++ PCL::ONE-INDEX-DFUN-INFO-CACHE PCL::EARLY-CLASS-SLOTS ++ PCL::CPD-SUPERS PCL::FGEN-GENERATOR-LAMBDA ++ PCL::ECD-SUPERCLASS-NAMES PCL::ECD-CLASS-NAME PCL::SETFBOUNDP ++ PCL::GET-SETF-FUNCTION-NAME PCL::DFUN-INFO-P ++ PCL::SLOT-VECTOR-SYMBOL PCL::INITIALIZE-INFO-P ++ PCL::TWO-CLASS-P PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE ++ PCL::COPY-CACHE PCL::MAKE-PV-TABLE-TYPE-DECLARATION ++ PCL::SORT-CALLS PCL::STRUCTURE-SLOT-BOUNDP PCL::%FBOUNDP ++ PCL::RESET-CLASS-INITIALIZE-INFO-1 PCL::UPDATE-GF-INFO ++ PCL::WRAPPER-FOR-STRUCTURE PCL::FUNCALLABLE-INSTANCE-P ++ PCL::CPD-CLASS PCL::EARLY-METHOD-STANDARD-ACCESSOR-P ++ PCL::SORT-SLOTS PCL::CANONICAL-SLOT-NAME ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME PCL::%SYMBOL-FUNCTION ++ PCL::EARLY-METHOD-LAMBDA-LIST PCL::ONE-INDEX-DFUN-INFO-INDEX ++ PCL::N-N-ACCESSOR-TYPE PCL::CACHING-CACHE ++ PCL::EARLY-CLASS-SLOTDS PCL::ONE-INDEX-DFUN-INFO-P ++ SYSTEM::%COMPILED-FUNCTION-NAME ++ PCL::BOOTSTRAP-CLASS-PREDICATES PCL::NET-TEST-CONVERTER ++ PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS PCL::TWO-CLASS-WRAPPER0 ++ PCL::MAP-SPECIALIZERS PCL::EARLY-GF-NAME PCL::N-N-P ++ PCL::FGEN-SYSTEM PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P ++ PCL::UPDATE-GFS-OF-CLASS PCL::ONE-CLASS-WRAPPER0 ++ PCL::CPD-AFTER ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION ++ PCL::CACHE-P PCL::EARLY-METHOD-QUALIFIERS PCL::CHECK-CACHE ++ PCL::FORCE-CACHE-FLUSHES PCL::CACHE-OWNER ++ PCL::COMPILE-LAMBDA-DEFERRED PCL::ARG-INFO-KEY/REST-P)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ COMMON-LISP::INVALID-METHOD-ERROR PCL::LIST-LARGE-CACHES ++ PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::UNTRACE-METHOD ++ COMMON-LISP::METHOD-COMBINATION-ERROR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ PCL::NON-NEGATIVE-FIXNUM) ++ PCL::CACHE-MAX-LOCATION PCL::CACHE-NLINES PCL::CACHE-SIZE ++ PCL::CACHE-MASK)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION ++ ITERATE::SIMPLE-EXPAND-ITERATE-FORM PCL::ADD-DIRECT-SUBCLASSES ++ PCL::PROCLAIM-DEFMETHOD PCL::UPDATE-INITIALIZE-INFO-INTERNAL ++ PCL::RAISE-METATYPE PCL::CLASS-CAN-PRECEDE-P ++ WALKER::VARIABLE-SPECIAL-P PCL::GF-MAKE-FUNCTION-FROM-EMF ++ PCL::|SETF PCL METHOD-FUNCTION-PLIST| ++ PCL::SET-FUNCTION-PRETTY-ARGLIST ++ PCL::FUNCALLABLE-STANDARD-INSTANCE-ACCESS ++ PCL::MAKE-DISCRIMINATING-FUNCTION-ARGLIST ++ PCL::DEAL-WITH-ARGUMENTS-OPTION WALKER::NOTE-DECLARATION ++ PCL::MAKE-CLASS-PREDICATE PCL::VALUE-FOR-CACHING ++ PCL::EMIT-1-NIL-DLAP PCL::MAKE-CAXR PCL::SYMBOL-LESSP ++ PCL::GET-KEY-ARG1 PCL::ADD-FORMS ++ PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION ++ PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER ++ PCL::CLASSES-HAVE-COMMON-SUBCLASS-P PCL::N-N-DFUN-INFO ++ PCL::CANONICALIZE-SLOT-SPECIFICATION ++ PCL::REDIRECT-EARLY-FUNCTION-INTERNAL ++ PCL::UPDATE-STD-OR-STR-METHODS PCL::%SET-CCLOSURE-ENV ++ PCL::QUALIFIER-CHECK-RUNTIME ++ PCL::MAKE-STD-READER-METHOD-FUNCTION ++ PCL::ADD-SLOT-ACCESSORS PCL::ADD-TO-CVECTOR ++ PCL::COMPUTE-LAYOUT PCL::DESTRUCTURE-INTERNAL ++ PCL::SUPERCLASSES-COMPATIBLE-P ++ PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION ITERATE::MV-SETQ ++ PCL::COMPUTE-STD-CPL PCL::SET-METHODS PCL::CHECKING-DFUN-INFO ++ ITERATE::EXTRACT-SPECIAL-BINDINGS PCL::SWAP-WRAPPERS-AND-SLOTS ++ PCL::CANONICALIZE-DEFCLASS-OPTION PCL::MAKE-CDXR ++ PCL::PRINTING-RANDOM-THING-INTERNAL COMMON-LISP::ADD-METHOD ++ PCL::STANDARD-INSTANCE-ACCESS ++ SYSTEM::%SET-COMPILED-FUNCTION-NAME PCL::FIND-SLOT-DEFINITION ++ PCL::CLASS-MIGHT-PRECEDE-P ++ PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION PCL::SAUT-NOT-EQL ++ PCL::SET-WRAPPER PCL::SET-STANDARD-SVUC-METHOD ++ PCL::SAUT-NOT-PROTOTYPE PCL::ACCESSOR-MISS-FUNCTION ++ PCL::NO-SLOT PCL::REMTAIL PCL::PV-WRAPPERS-FROM-ALL-ARGS ++ PCL::UPDATE-CLASS PCL::AUGMENT-TYPE PCL::MAKE-EARLY-ACCESSOR ++ PCL::MAKE-PLIST PCL::MEC-ALL-CLASSES-INTERNAL ++ PCL::MAKE-STD-WRITER-METHOD-FUNCTION ++ PCL::PARSE-QUALIFIER-PATTERN PCL::MEMF-CONSTANT-CONVERTER ++ PCL::|SETF PCL FIND-CLASS-PREDICATE| ++ PCL::MAKE-UNORDERED-METHODS-EMF WALKER::ENVIRONMENT-FUNCTION ++ PCL::MEC-ALL-CLASS-LISTS PCL::SAUT-NOT-CLASS-EQ ++ PCL::DO-SATISFIES-DEFTYPE PCL::SET-STRUCTURE-SVUC-METHOD ++ PCL::MAKE-DLAP-LAMBDA-LIST PCL::METHOD-FUNCTION-RETURNING-T ++ PCL::COMPUTE-CALLS PCL::REMOVE-SLOT-ACCESSORS ++ PCL::UPDATE-ALL-PV-TABLE-CACHES PCL::MAKE-DFUN-LAMBDA-LIST ++ WALKER::NOTE-LEXICAL-BINDING PCL::REMOVE-DIRECT-SUBCLASSES ++ PCL::MAP-PV-TABLE-REFERENCES-OF PCL::COMPUTE-CONSTANTS ++ PCL::METHOD-FUNCTION-RETURNING-NIL PCL::METHODS-CONVERTER ++ PCL::PV-TABLE-LOOKUP PCL::DESCRIBE-PACKAGE ++ COMMON-LISP::SLOT-EXISTS-P PCL::MAKE-PV-TABLE-INTERNAL ++ PCL::SAUT-NOT-CLASS PCL::|SETF PCL FIND-CLASS| ++ PCL::UPDATE-INITS PCL::UPDATE-CPL ++ PCL::EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION ++ PCL::COMPUTE-PV WALKER::VARIABLE-LEXICAL-P ++ PCL::PROCLAIM-DEFGENERIC PCL::MAKE-DFUN-ARG-LIST ++ PCL::GET-KEY-ARG COMMON-LISP::REMOVE-METHOD ++ PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS PCL::VARIABLE-CLASS ++ PCL::UPDATE-SLOTS PCL::SYMBOL-OR-CONS-LESSP ++ PCL::MEC-ALL-CLASSES PCL::LIST-EQ ++ PCL::SET-FUNCALLABLE-INSTANCE-FUNCTION ++ WALKER::WALK-REPEAT-EVAL WALKER::ENVIRONMENT-MACRO ++ WALKER::VARIABLE-SYMBOL-MACRO-P ++ PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST ++ PCL::BOOTSTRAP-SLOT-INDEX PCL::PLIST-VALUE ++ PCL::CHANGE-CLASS-INTERNAL PCL::NET-CONSTANT-CONVERTER ++ PCL::|SETF PCL GDEFINITION| PCL::FIND-STANDARD-II-METHOD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ WALKER::WALK-FORM PCL::MAKE-INSTANCE-1 ++ PCL::EXTRACT-DECLARATIONS PCL::GET-FUNCTION ++ WALKER::MACROEXPAND-ALL PCL::ALLOCATE-STRUCTURE-INSTANCE ++ PCL::MAKE-FINAL-DFUN-INTERNAL PCL::GET-METHOD-FUNCTION ++ PCL::COERCE-TO-CLASS PCL::MAP-ALL-CLASSES PCL::ENSURE-CLASS ++ PCL::PARSE-METHOD-OR-SPEC COMMON-LISP::ENSURE-GENERIC-FUNCTION ++ PCL::MAKE-CACHING-DFUN PCL::GET-FUNCTION1 ++ PCL::GET-DFUN-CONSTRUCTOR PCL::MAKE-CONSTANT-VALUE-DFUN ++ PCL::MAKE-METHOD-FUNCTION-INTERNAL PCL::COMPILE-LAMBDA ++ PCL::PARSE-SPECIALIZED-LAMBDA-LIST PCL::DISPATCH-DFUN-COST ++ PCL::MAKE-METHOD-LAMBDA-INTERNAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::MAKE-CLASS-PREDICATE-NAME PCL::MAKE-KEYWORD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::FIND-CLASS-FROM-CELL PCL::GET-METHOD-FUNCTION-PV-CELL ++ PCL::PROBE-CACHE PCL::NAMED-OBJECT-PRINT-FUNCTION ++ PCL::PRECOMPUTE-EFFECTIVE-METHODS ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION1 PCL::MAKE-EMF-FROM-METHOD ++ PCL::EMIT-MISS PCL::REAL-ENSURE-GF-USING-CLASS--NULL ++ PCL::RECORD-DEFINITION WALKER::CONVERT-MACRO-TO-LAMBDA ++ PCL::INITIALIZE-INFO PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION ++ PCL::METHOD-FUNCTION-GET PCL::FIND-CLASS-PREDICATE-FROM-CELL ++ PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 PCL::GET-DECLARATION ++ PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION ++ PCL::MAP-CACHE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| ++ WALKER::WALK-PROG/PROG* ++ PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ WALKER::WALK-BINDINGS-2 ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ WALKER::WALK-DO/DO* ++ PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD DOCUMENTATION (T))| ++ PCL::|(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ PCL::INITIALIZE-INSTANCE-SIMPLE PCL::BOOTSTRAP-SET-SLOT ++ PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ PCL::FILL-CACHE-P ++ PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ PCL::|(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| ++ PCL::OPTIMIZE-WRITER PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL ++ PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION1 ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| ++ PCL::ADJUST-CACHE ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ PCL::MEMF-TEST-CONVERTER ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| ++ WALKER::WALK-TEMPLATE PCL::TWO-CLASS-DFUN-INFO ++ PCL::EXPAND-CACHE ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ PCL::GET-WRAPPERS-FROM-CLASSES ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::LOAD-PRECOMPILED-IIS-ENTRY ++ PCL::|(FAST-METHOD PRINT-OBJECT (T T))| ++ PCL::EXPAND-SYMBOL-MACROLET-INTERNAL ++ PCL::MAYBE-EXPAND-ACCESSOR-FORM ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRELIMINARY ++ PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::EXPAND-DEFCLASS ++ PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ WALKER::WALK-LET/LET* PCL::MAKE-DISPATCH-LAMBDA ++ PCL::|(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| ++ PCL::OPTIMIZE-READER ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::OPTIMIZE-SET-SLOT-VALUE ++ PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| ++ PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ PCL::PRINT-CACHE WALKER::WALK-UNEXPECTED-DECLARE ++ ITERATE::OPTIMIZE-ITERATE-FORM ++ PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| ++ WALKER::WALK-MULTIPLE-VALUE-SETQ PCL::FIRST-FORM-TO-LISP ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| ++ WALKER::WALK-LABELS ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ PCL::ONE-CLASS-DFUN-INFO PCL::GET-FUNCTION-GENERATOR ++ WALKER::RELIST-INTERNAL PCL::NOTE-PV-TABLE-REFERENCE ++ WALKER::WALK-LAMBDA PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS ++ PCL::ONE-INDEX-DFUN-INFO PCL::MAP-ALL-ORDERS ++ PCL::OPTIMIZE-GF-CALL-INTERNAL PCL::COMPUTE-PRECEDENCE ++ WALKER::WALK-DO PCL::PRINT-STD-INSTANCE ++ PCL::OBSOLETE-INSTANCE-TRAP PCL::SORT-APPLICABLE-METHODS ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::EMIT-GREATER-THAN-1-DLAP ++ PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ WALKER::WALK-FLET ++ PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| ++ PCL::|SETF PCL PLIST-VALUE| WALKER::WALK-PROG* ++ WALKER::VARIABLE-DECLARATION ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| ++ PCL::SKIP-FAST-SLOT-ACCESS-P PCL::SET-FUNCTION-NAME-1 ++ WALKER::WALK-MACROLET PCL::CAN-OPTIMIZE-ACCESS ++ WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P ++ PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ PCL::EMIT-BOUNDP-CHECK PCL::|SETF PCL METHOD-FUNCTION-GET| ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| ++ PCL::MAKE-METHOD-SPEC PCL::FLUSH-CACHE-TRAP WALKER::WALK-IF ++ PCL::OPTIMIZE-SLOT-BOUNDP ++ PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD ++ WALKER::WALK-MULTIPLE-VALUE-BIND ++ ITERATE::RENAME-AND-CAPTURE-VARIABLES WALKER::WALK-LET* ++ WALKER::WALK-DO* ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ PCL::INVALIDATE-WRAPPER ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ ITERATE::SIMPLE-EXPAND-GATHERING-FORM PCL::ENTRY-IN-CACHE-P ++ WALKER::WALK-LOCALLY PCL::OPTIMIZE-SLOT-VALUE ++ PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL ++ PCL::|(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ PCL::TRACE-EMF-CALL-INTERNAL WALKER::WALK-SYMBOL-MACROLET ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ PCL::CONVERT-TABLE ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS* ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| ++ WALKER::WALK-SETQ PCL::EXPAND-DEFGENERIC ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ ITERATE::OPTIMIZE-GATHERING-FORM PCL::FIX-SLOT-ACCESSORS ++ PCL::EMIT-SLOT-READ-FORM WALKER::WALK-PROG ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| ++ WALKER::WALK-NAMED-LAMBDA PCL::GET-NEW-FUNCTION-GENERATOR ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ WALKER::WALK-TAGBODY ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ WALKER::WALK-COMPILER-LET PCL::DECLARE-STRUCTURE ++ WALKER::WALK-LET ITERATE::VARIABLE-SAME-P ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| ++ PCL::EMIT-1-T-DLAP PCL::MAKE-DFUN-CALL ++ PCL::COMPUTE-EFFECTIVE-METHOD PCL::SORT-METHODS ++ WALKER::WALK-TAGBODY-1 ++ PCL::|(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ PCL::MAKE-TOP-LEVEL-FORM ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| ++ WALKER::RECONS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::UPDATE-SLOTS-IN-PV PCL::MAKE-INSTANCE-FUNCTION-COMPLEX ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::GET-MAKE-INSTANCE-FUNCTION-INTERNAL ++ PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::MAKE-INSTANCE-FUNCTION-SIMPLE ++ PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| ++ PCL::COMPUTE-PV-SLOT PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 ++ PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| ++ PCL::OPTIMIZE-INSTANCE-ACCESS ++ PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| ++ PCL::REAL-MAKE-METHOD-INITARGS-FORM ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T T))| ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| ++ PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| ++ PCL::MAKE-PARAMETER-REFERENCES ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::OPTIMIZE-ACCESSOR-CALL ++ WALKER::WALK-TEMPLATE-HANDLE-REPEAT WALKER::WALK-BINDINGS-1 ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::MAKE-FGEN ++ PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| ++ PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::OPTIMIZE-GENERIC-FUNCTION-CALL ++ PCL::LOAD-FUNCTION-GENERATOR PCL::MAKE-EMF-CACHE ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::EXPAND-EMF-CALL-METHOD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::EXPAND-DEFMETHOD PCL::LOAD-DEFMETHOD-INTERNAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::FILL-CACHE PCL::CAN-OPTIMIZE-ACCESS1 PCL::MAKE-EMF-CALL ++ PCL::EMIT-FETCH-WRAPPER PCL::CHECK-INITARGS-2-LIST ++ PCL::GET-METHOD PCL::CHECK-INITARGS-2-PLIST ++ PCL::CHECK-INITARGS-1 PCL::REAL-GET-METHOD ++ WALKER::WALK-ARGLIST)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION2)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::LOAD-DEFMETHOD PCL::MAKE-DEFMETHOD-FORM ++ PCL::EARLY-MAKE-A-METHOD PCL::MAKE-DEFMETHOD-FORM-INTERNAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::SET-ARG-INFO1 PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION ++ PCL::LOAD-DEFCLASS PCL::REAL-LOAD-DEFCLASS ++ PCL::OPTIMIZE-GF-CALL WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 ++ PCL::EMIT-SLOT-ACCESS PCL::MAKE-EARLY-CLASS-DEFINITION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::EMIT-DLAP PCL::GET-SECONDARY-DISPATCH-FUNCTION1)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::EARLY-ADD-NAMED-METHOD PCL::FILL-DFUN-CACHE ++ PCL::REAL-ADD-NAMED-METHOD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::BOOTSTRAP-INITIALIZE-CLASS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ PCL::COMPUTE-STD-CPL-PHASE-3)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ PCL::FILL-CACHE-FROM-CACHE-P PCL::GET-CACHE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) ++ PCL::PV-TABLE-CALL-LIST PCL::CACHE-OVERFLOW ++ PCL::PV-TABLE-SLOT-NAME-LISTS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::COMPUTE-CACHE-PARAMETERS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::FIND-FREE-CACHE-LINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) ++ PCL::CACHE-VALUEP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ PCL::DEFAULT-CODE-CONVERTER PCL::EMIT-IN-CHECKING-CACHE-P ++ PCL::METHOD-PROTOTYPE-FOR-GF PCL::EMIT-TWO-CLASS-WRITER ++ PCL::PARSE-METHOD-GROUP-SPECIFIER PCL::EMIT-ONE-CLASS-WRITER ++ PCL::EMIT-ONE-INDEX-WRITERS PCL::FIND-STRUCTURE-CLASS ++ PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA PCL::MAKE-DISPATCH-DFUN ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF PCL::EARLY-METHOD-FUNCTION ++ PCL::NET-CODE-CONVERTER PCL::GET-DISPATCH-FUNCTION ++ PCL::STRUCTURE-WRAPPER PCL::FIND-WRAPPER PCL::CLASS-EQ-TYPE ++ PCL::TYPE-FROM-SPECIALIZER PCL::SPECIALIZER-FROM-TYPE ++ PCL::PCL-DESCRIBE PCL::PARSE-DEFMETHOD ++ PCL::ANALYZE-LAMBDA-LIST PCL::EMIT-ONE-CLASS-READER ++ PCL::EARLY-COLLECT-INHERITANCE PCL::GET-GENERIC-FUNCTION-INFO ++ PCL::COMPILE-IIS-FUNCTIONS PCL::EMIT-CONSTANT-VALUE ++ PCL::EMIT-ONE-INDEX-READERS PCL::GENERIC-FUNCTION-NAME-P ++ PCL::CONVERT-TO-SYSTEM-TYPE PCL::MAKE-FINAL-DISPATCH-DFUN ++ PCL::EMIT-TWO-CLASS-READER PCL::*NORMALIZE-TYPE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| ++ PCL::MAKE-FAST-INSTANCE-BOUNDP PCL::MAKE-INITIALIZE-INFO ++ PCL::|STRUCTURE-OBJECT class constructor| ++ PCL::|__si::MAKE-CACHE| PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| ++ PCL::TRUE PCL::|__si::MAKE-PV-TABLE| ++ PCL::|__si::MAKE-ONE-INDEX| WALKER::UNBOUND-LEXICAL-FUNCTION ++ PCL::|__si::MAKE-CHECKING| PCL::MAKE-PV-TABLE ++ PCL::|__si::MAKE-NO-METHODS| PCL::MAKE-METHOD-CALL ++ PCL::CALLED-FIN-WITHOUT-FUNCTION PCL::USE-PACKAGE-PCL ++ PCL::INTERN-PV-TABLE PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| ++ PCL::|__si::MAKE-DISPATCH| ++ PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| ++ PCL::|__si::MAKE-ARG-INFO| PCL::FIX-EARLY-GENERIC-FUNCTIONS ++ PCL::ZERO PCL::MAKE-PROGN PCL::|__si::MAKE-INITIAL| ++ PCL::|__si::MAKE-ONE-CLASS| PCL::|__si::MAKE-DFUN-INFO| ++ PCL::|__si::MAKE-CONSTANT-VALUE| ++ PCL::|__si::MAKE-STD-INSTANCE| PCL::PV-WRAPPERS-FROM-PV-ARGS ++ PCL::|__si::MAKE-TWO-CLASS| PCL::|__si::MAKE-N-N| ++ PCL::|__si::MAKE-CACHING| PCL::FALSE PCL::STRING-APPEND ++ PCL::|__si::MAKE-INITIAL-DISPATCH| PCL::MAKE-FAST-METHOD-CALL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ PCL::ARG-INFO-NUMBER-REQUIRED PCL::PV-TABLE-PV-SIZE ++ PCL::CACHE-COUNT PCL::PV-CACHE-LIMIT-FN PCL::CHECKING-LIMIT-FN ++ PCL::CACHING-LIMIT-FN PCL::N-N-ACCESSORS-LIMIT-FN ++ PCL::DEFAULT-LIMIT-FN PCL::EARLY-CLASS-SIZE PCL::CPD-COUNT ++ PCL::ONE-INDEX-LIMIT-FN PCL::FAST-INSTANCE-BOUNDP-INDEX)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ PCL::POWER-OF-TWO-CEILING)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::MAKE-TYPE-PREDICATE-NAME PCL::MAKE-FINAL-DFUN ++ PCL::CAPITALIZE-WORDS PCL::SET-DFUN ITERATE::MAYBE-WARN ++ PCL::MAKE-EARLY-GF PCL::USE-DISPATCH-DFUN-P WALKER::RELIST ++ PCL::MAKE-SPECIALIZABLE PCL::PV-TABLE-LOOKUP-PV-ARGS ++ PCL::ALLOCATE-STANDARD-INSTANCE ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE ++ PCL::USE-CONSTANT-VALUE-DFUN-P ITERATE::FUNCTION-LAMBDA-P ++ PCL::UPDATE-DFUN PCL::SET-ARG-INFO ++ PCL::EARLY-METHOD-SPECIALIZERS PCL::MAKE-WRAPPER ++ PCL::FIND-CLASS-CELL WALKER::WALKER-ENVIRONMENT-BIND-1 ++ PCL::TRACE-METHOD WALKER::RELIST* COMMON-LISP::FIND-CLASS ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS PCL::FIND-CLASS-PREDICATE ++ PCL::INITIALIZE-METHOD-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::SAUT-NOT PCL::INVOKE-EMF PCL::SAUT-PROTOTYPE ++ PCL::COMPUTE-CODE ITERATE::PARSE-DECLARATIONS ++ PCL::SDFUN-FOR-CACHING ++ PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES ++ PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL ++ PCL::SLOT-NAME-LISTS-FROM-SLOTS PCL::DESTRUCTURE ++ PCL::SPLIT-DECLARATIONS PCL::MAKE-DIRECT-SLOTD ++ PCL::FORM-LIST-TO-LISP PCL::EMIT-CHECKING ++ PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR PCL::COMPUTE-TEST ++ PCL::SET-FUNCTION-NAME COMMON-LISP::SLOT-BOUNDP PCL::SAUT-AND ++ PCL::EMIT-CACHING PCL::INITIAL-DFUN ++ COMMON-LISP::SLOT-MAKUNBOUND COMMON-LISP::SLOT-VALUE ++ PCL::UPDATE-SLOT-VALUE-GF-INFO ++ PCL::CLASS-APPLICABLE-USING-CLASS-P ++ PCL::CPL-INCONSISTENT-ERROR PCL::*SUBTYPEP ++ PCL::SLOT-UNBOUND-INTERNAL ++ PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P ++ PCL::CHECK-INITARGS-VALUES PCL::ENSURE-CLASS-VALUES ++ PCL::SAUT-EQL PCL::REAL-REMOVE-METHOD PCL::EMIT-DEFAULT-ONLY ++ PCL::INSURE-DFUN PCL::EMIT-DEFAULT-ONLY-FUNCTION ++ PCL::MUTATE-SLOTS-AND-CALLS PCL::FIND-SUPERCLASS-CHAIN ++ PCL::SAUT-CLASS PCL::MAKE-INSTANCE-FUNCTION-TRAP ++ PCL::SAUT-CLASS-EQ PCL::COMPUTE-STD-CPL-PHASE-1 ++ PCL::SPECIALIZER-APPLICABLE-USING-TYPE-P)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) ++ PCL::PV-TABLE-CACHE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ WALKER::WALK-DECLARATIONS PCL::GET-SECONDARY-DISPATCH-FUNCTION ++ PCL::MAKE-ONE-INDEX-ACCESSOR-DFUN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::MAKE-SHARED-INITIALIZE-FORM-LIST PCL::ACCESSOR-MISS ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| ++ PCL::|(FAST-METHOD NO-APPLICABLE-METHOD (T))| ++ PCL::SET-CLASS-SLOT-VALUE-1 ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| ++ PCL::GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION ++ PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION ++ PCL::MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN ++ PCL::LOAD-SHORT-DEFCOMBIN PCL::EMIT-CHECKING-OR-CACHING ++ PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| ++ PCL::MAKE-FINAL-CHECKING-DFUN ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ PCL::ACCESSOR-VALUES ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ PCL::REAL-MAKE-METHOD-LAMBDA ++ PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| ++ PCL::GET-ACCESSOR-METHOD-FUNCTION ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ PCL::ORDER-SPECIALIZERS ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| ++ PCL::GENERATE-DISCRIMINATION-NET ++ PCL::|(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| ++ PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| ++ PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (T T))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITION ++ PCL::INITIALIZE-INSTANCE-SIMPLE-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION ++ PCL::MAKE-OPTIMIZED-STD-WRITER-METHOD-FUNCTION ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ PCL::MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION ++ PCL::CONVERT-METHODS WALKER::WALK-LET-IF ++ PCL::EMIT-READER/WRITER-FUNCTION PCL::ACCESSOR-VALUES-INTERNAL ++ PCL::|(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ PCL::LOAD-LONG-DEFCOMBIN PCL::CHECK-METHOD-ARG-INFO ++ PCL::ACCESSOR-VALUES1 ++ PCL::|(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| ++ PCL::GENERATING-LISP PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN ++ WALKER::WALK-FORM-INTERNAL PCL::CONSTANT-VALUE-MISS ++ PCL::SLOT-VALUE-USING-CLASS-DFUN PCL::CACHING-MISS ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ PCL::SLOT-BOUNDP-USING-CLASS-DFUN PCL::CHECKING-MISS ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| ++ PCL::EMIT-READER/WRITER ITERATE::EXPAND-INTO-LET ++ PCL::GET-CLASS-SLOT-VALUE-1 ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION ++ PCL::MAKE-FINAL-CACHING-DFUN ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| ++ PCL::|(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P PCL::SET-SLOT-VALUE ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER ++ ITERATE::RENAME-VARIABLES ++ PCL::|(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| ++ ITERATE::WALK-GATHERING-BODY PCL::CACHE-MISS-VALUES ++ PCL::MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION ++ PCL::MAKE-FINAL-CONSTANT-VALUE-DFUN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::DO-SHORT-METHOD-COMBINATION PCL::MEMF-CODE-CONVERTER ++ PCL::GENERATE-DISCRIMINATION-NET-INTERNAL ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION ++ PCL::CACHE-MISS-VALUES-INTERNAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ PCL::ADD-METHOD-DECLARATIONS ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| ++ PCL::COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ PCL::MAKE-TWO-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::WALK-METHOD-LAMBDA ++ PCL::|(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::REAL-MAKE-A-METHOD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::MAKE-DEFAULT-INITARGS-FORM-LIST ++ PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS ++ PCL::SLOT-VALUE-OR-DEFAULT ++ PCL::GET-SIMPLE-INITIALIZATION-FUNCTION PCL::REAL-ADD-METHOD ++ PCL::LOAD-DEFGENERIC PCL::CPL-ERROR ++ PCL::MAKE-FINAL-ACCESSOR-DFUN PCL::MAKE-N-N-ACCESSOR-DFUN ++ PCL::TYPES-FROM-ARGUMENTS PCL::MAKE-ACCESSOR-TABLE ++ PCL::MAKE-CHECKING-DFUN WALKER::NESTED-WALK-FORM ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ ITERATE::ITERATE-TRANSFORM-BODY ++ PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE1 ++ ITERATE::RENAME-LET-BINDINGS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION ++ PCL::GET-CACHE-FROM-CACHE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::%CCLOSURE-ENV-NTHCDR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::PRINT-DFUN-INFO)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ PCL::COUNT-ALL-DFUNS PCL::EMIT-N-N-WRITERS ++ PCL::EMIT-N-N-READERS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) ++ PCL::GET-WRAPPER-CACHE-NUMBER)) + (IN-PACKAGE "PCL") + +-(DOLIST (V '(DISASSEMBLE |(FAST-WRITER-METHOD SLOT-OBJECT OPTIONS)| +- |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT METHODS)| +- |(FAST-WRITER-METHOD SLOT-CLASS DIRECT-SLOTS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SLOTS)| +- |(FAST-WRITER-METHOD SLOT-CLASS SLOTS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT SLOTS)| ++(DOLIST (V '(|(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-METHODS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| +- |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT SLOTS)| ++ |(FAST-WRITER-METHOD SLOT-CLASS SLOTS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SLOTS)| ++ |(FAST-WRITER-METHOD SLOT-CLASS DIRECT-SLOTS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT METHODS)| ++ |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT OPTIONS)| + |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| + ADD-READER-METHOD + SHORT-COMBINATION-IDENTITY-WITH-ONE-ARGUMENT +- REMOVE-READER-METHOD |LISP::T class predicate| +- EQL-SPECIALIZER-P |(SETF GENERIC-FUNCTION-NAME)| +- OBJECT-PLIST SLOT-DEFINITION-DEFSTRUCT-ACCESSOR-SYMBOL +- |PCL::STANDARD-METHOD-COMBINATION class predicate| +- |PCL::STANDARD-EFFECTIVE-SLOT-DEFINITION class predicate| +- |PCL::STANDARD-DIRECT-SLOT-DEFINITION class predicate| ++ REMOVE-READER-METHOD EQL-SPECIALIZER-P ++ |(SETF GENERIC-FUNCTION-NAME)| OBJECT-PLIST ++ SLOT-DEFINITION-DEFSTRUCT-ACCESSOR-SYMBOL + |PCL::STANDARD-SLOT-DEFINITION class predicate| +- |PCL::STANDARD-OBJECT class predicate| ++ |PCL::STANDARD-DIRECT-SLOT-DEFINITION class predicate| ++ |PCL::STANDARD-EFFECTIVE-SLOT-DEFINITION class predicate| ++ |PCL::STANDARD-METHOD-COMBINATION class predicate| + |(FAST-READER-METHOD SLOT-OBJECT METHOD)| +- |PCL::BUILT-IN-CLASS class predicate| SPECIALIZER-TYPE +- |LISP::RATIONAL class predicate| +- |LISP::RATIO class predicate| GF-DFUN-STATE ++ SPECIALIZER-TYPE GF-DFUN-STATE + |(SETF GENERIC-FUNCTION-METHOD-CLASS)| +- |(FAST-READER-METHOD STRUCTURE-SLOT-DEFINITION DEFSTRUCT-ACCESSOR-SYMBOL)| + |(FAST-READER-METHOD SLOT-OBJECT DEFSTRUCT-ACCESSOR-SYMBOL)| ++ |(FAST-READER-METHOD STRUCTURE-SLOT-DEFINITION DEFSTRUCT-ACCESSOR-SYMBOL)| + |(SETF GENERIC-FUNCTION-METHOD-COMBINATION)| + CLASS-DEFSTRUCT-CONSTRUCTOR +- |(FAST-READER-METHOD DEFINITION-SOURCE-MIXIN SOURCE)| + |(FAST-READER-METHOD SLOT-OBJECT SOURCE)| ++ |(FAST-READER-METHOD DEFINITION-SOURCE-MIXIN SOURCE)| + METHOD-FAST-FUNCTION |(SETF GENERIC-FUNCTION-METHODS)| + |(SETF GF-PRETTY-ARGLIST)| +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION ARG-INFO)| +- |(FAST-READER-METHOD SLOT-OBJECT ARG-INFO)| +- |(FAST-READER-METHOD SLOT-CLASS INITIALIZE-INFO)| + |(FAST-READER-METHOD SLOT-OBJECT INITIALIZE-INFO)| ++ |(FAST-READER-METHOD SLOT-CLASS INITIALIZE-INFO)| ++ |(FAST-READER-METHOD SLOT-OBJECT ARG-INFO)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION ARG-INFO)| + SPECIALIZERP EXACT-CLASS-SPECIALIZER-P +- |(FAST-READER-METHOD PCL-CLASS WRAPPER)| + |(FAST-READER-METHOD SLOT-OBJECT WRAPPER)| +- |(FAST-READER-METHOD SLOT-DEFINITION INITARGS)| ++ |(FAST-READER-METHOD PCL-CLASS WRAPPER)| + |(FAST-READER-METHOD SLOT-OBJECT INITARGS)| +- |(FAST-READER-METHOD STRUCTURE-CLASS DEFSTRUCT-CONSTRUCTOR)| +- |(FAST-READER-METHOD SLOT-OBJECT DEFSTRUCT-CONSTRUCTOR)| +- |(FAST-READER-METHOD SLOT-OBJECT OPERATOR)| ++ |(FAST-READER-METHOD SLOT-DEFINITION INITARGS)| + |(FAST-READER-METHOD SHORT-METHOD-COMBINATION OPERATOR)| +- |LISP::CHARACTER class predicate| ++ |(FAST-READER-METHOD SLOT-OBJECT OPERATOR)| ++ |(FAST-READER-METHOD SLOT-OBJECT DEFSTRUCT-CONSTRUCTOR)| ++ |(FAST-READER-METHOD STRUCTURE-CLASS DEFSTRUCT-CONSTRUCTOR)| + COMPATIBLE-META-CLASS-CHANGE-P +- |LISP::SEQUENCE class predicate| +- |(FAST-READER-METHOD CLASS CLASS-EQ-SPECIALIZER)| + |(FAST-READER-METHOD SLOT-OBJECT CLASS-EQ-SPECIALIZER)| ++ |(FAST-READER-METHOD CLASS CLASS-EQ-SPECIALIZER)| + |(BOUNDP READER-FUNCTION)| TRACE-METHOD-INTERNAL + |(BOUNDP PREDICATE-NAME)| |(BOUNDP READERS)| + UPDATE-GF-DFUN |(BOUNDP CLASS-PRECEDENCE-LIST)| +- |(BOUNDP ACCESSOR-FLAGS)| |(BOUNDP DOCUMENTATION)| +- |(BOUNDP LOCATION)| SPECIALIZER-OBJECT ++ |(BOUNDP ACCESSOR-FLAGS)| |(BOUNDP LOCATION)| ++ |(BOUNDP DOCUMENTATION)| SPECIALIZER-OBJECT + |(BOUNDP INCOMPATIBLE-SUPERCLASS-LIST)| + ACCESSOR-METHOD-SLOT-NAME |(BOUNDP SPECIALIZERS)| + |(BOUNDP IDENTITY-WITH-ONE-ARGUMENT)| +@@ -783,158 +1052,146 @@ + CLASS-EQ-SPECIALIZER-P + |(FAST-BOUNDP-METHOD SLOT-OBJECT SOURCE)| SLOTS-FETCHER + |(SETF SLOT-ACCESSOR-STD-P)| REMOVE-WRITER-METHOD +- |(BOUNDP INITFUNCTION)| |(BOUNDP WRITER-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT ARG-INFO)| ++ |(BOUNDP WRITER-FUNCTION)| |(BOUNDP INITFUNCTION)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT INITIALIZE-INFO)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT ARG-INFO)| + STRUCTURE-CLASS-P |(BOUNDP WRITERS)| +- |(BOUNDP INITFORM)| ++ |(BOUNDP INITFORM)| |SETF COMMON-LISP CLASS-NAME| + |(FAST-BOUNDP-METHOD SLOT-OBJECT WRAPPER)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT INITARGS)| +- |LISP::BIT-VECTOR class predicate| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DEFSTRUCT-CONSTRUCTOR)| + UPDATE-CONSTRUCTORS |(BOUNDP SLOT-NAME)| + |(SETF SLOT-DEFINITION-INITARGS)| |(BOUNDP ALLOCATION)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT CLASS-EQ-SPECIALIZER)| +- DOCUMENTATION |(BOUNDP GENERIC-FUNCTION)| +- |(BOUNDP FUNCTION)| |(BOUNDP LAMBDA-LIST)| ++ DOCUMENTATION |(BOUNDP FUNCTION)| ++ |(BOUNDP GENERIC-FUNCTION)| |(BOUNDP LAMBDA-LIST)| + METHOD-PRETTY-ARGLIST |(BOUNDP SLOT-DEFINITION)| +- |LISP::ARRAY class predicate| + |(BOUNDP CAN-PRECEDE-LIST)| |(BOUNDP PROTOTYPE)| + CLASS-EQ-SPECIALIZER INFORM-TYPE-SYSTEM-ABOUT-CLASS + |PCL::DEFINITION-SOURCE-MIXIN class predicate| +- |(BOUNDP DFUN-STATE)| +- |LISP::STRUCTURE-OBJECT class predicate| +- |(BOUNDP FROM-DEFCLASS-P)| COMPILE |(READER METHOD)| +- |LISP::STANDARD-OBJECT class predicate| ++ |(BOUNDP DFUN-STATE)| |(BOUNDP FROM-DEFCLASS-P)| ++ |(READER METHOD)| + |(CALL STANDARD-COMPUTE-EFFECTIVE-METHOD)| +- |(BOUNDP FAST-FUNCTION)| +- |LISP::COMPLEX class predicate| |(BOUNDP METHOD-CLASS)| +- |(READER SOURCE)| |(BOUNDP METHOD-COMBINATION)| ++ |(BOUNDP FAST-FUNCTION)| |(BOUNDP METHOD-CLASS)| ++ |(READER SOURCE)| |(BOUNDP INTERNAL-WRITER-FUNCTION)| + |(BOUNDP INTERNAL-READER-FUNCTION)| +- |(BOUNDP INTERNAL-WRITER-FUNCTION)| +- ACCESSOR-METHOD-CLASS |(BOUNDP DIRECT-METHODS)| +- |(BOUNDP DIRECT-SLOTS)| |(BOUNDP BOUNDP-FUNCTION)| +- |(BOUNDP DIRECT-SUPERCLASSES)| +- |(BOUNDP DIRECT-SUBCLASSES)| |(BOUNDP OPTIONS)| +- |(BOUNDP METHODS)| |(WRITER METHOD)| +- |LISP::BUILT-IN-CLASS class predicate| ++ |(BOUNDP METHOD-COMBINATION)| ACCESSOR-METHOD-CLASS ++ |(BOUNDP DIRECT-SLOTS)| |(BOUNDP DIRECT-METHODS)| ++ |(BOUNDP BOUNDP-FUNCTION)| |(BOUNDP DIRECT-SUBCLASSES)| ++ |(BOUNDP DIRECT-SUPERCLASSES)| |(BOUNDP METHODS)| ++ |(BOUNDP OPTIONS)| |(WRITER METHOD)| + |PCL::DEPENDENT-UPDATE-MIXIN class predicate| + GENERIC-FUNCTION-PRETTY-ARGLIST |(WRITER SOURCE)| ++ |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| + |(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| +- |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| + |(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| ++ |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| + |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| + |(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| + |(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| + MAKE-BOUNDP-METHOD-FUNCTION +- |LISP::STRING class predicate| + |(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| + |(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| + |PCL::METAOBJECT class predicate| +- |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| ++ |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| ++ |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| + |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| + |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| + |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| + |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| + |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| + |(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| + |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| +- |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| +- |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| +- |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| +- |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| + |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| +- |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD MAKE-INSTANCE (CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| + |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| ++ |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| + |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| + |(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| + |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| +- |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| + |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| +- |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| ++ |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ |(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| ++ |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| + CLASS-PREDICATE-NAME +- |PCL::STRUCTURE-EFFECTIVE-SLOT-DEFINITION class predicate| +- |PCL::STRUCTURE-DIRECT-SLOT-DEFINITION class predicate| + |PCL::STRUCTURE-SLOT-DEFINITION class predicate| +- |PCL::STRUCTURE-OBJECT class predicate| +- |LISP::SYMBOL class predicate| ++ |PCL::STRUCTURE-DIRECT-SLOT-DEFINITION class predicate| ++ |PCL::STRUCTURE-EFFECTIVE-SLOT-DEFINITION class predicate| + |PCL::EFFECTIVE-SLOT-DEFINITION class predicate| + |(COMBINED-METHOD SHARED-INITIALIZE)| + LEGAL-QUALIFIERS-P ADD-BOUNDP-METHOD +- LEGAL-LAMBDA-LIST-P |LISP::VECTOR class predicate| +- |SETF PCL GENERIC-FUNCTION-NAME| ++ LEGAL-LAMBDA-LIST-P |SETF PCL GENERIC-FUNCTION-NAME| + |(READER READER-FUNCTION)| |(READER PREDICATE-NAME)| +- |(READER READERS)| DESCRIBE-OBJECT +- |(READER CLASS-PRECEDENCE-LIST)| +- |(READER ACCESSOR-FLAGS)| |(READER DOCUMENTATION)| +- |(READER LOCATION)| CLASS-INITIALIZE-INFO ++ |(READER READERS)| |(READER CLASS-PRECEDENCE-LIST)| ++ |(READER ACCESSOR-FLAGS)| |(READER LOCATION)| ++ |(READER DOCUMENTATION)| CLASS-INITIALIZE-INFO + |(SETF CLASS-SLOT-VALUE)| MAKE-WRITER-METHOD-FUNCTION + |SETF PCL GF-DFUN-STATE| + |(READER INCOMPATIBLE-SUPERCLASS-LIST)| +@@ -942,75 +1199,75 @@ + |(READER IDENTITY-WITH-ONE-ARGUMENT)| + |(SETF CLASS-INITIALIZE-INFO)| + |(READER PRETTY-ARGLIST)| |(READER DEFSTRUCT-FORM)| +- |SETF PCL CLASS-NAME| |SETF PCL SLOT-DEFINITION-NAME| ++ |SETF PCL SLOT-DEFINITION-NAME| + |(WRITER READER-FUNCTION)| + |(SETF CLASS-DEFSTRUCT-CONSTRUCTOR)| + |(WRITER PREDICATE-NAME)| |(WRITER READERS)| +- |(READER INITFUNCTION)| |(READER WRITER-FUNCTION)| ++ |(READER WRITER-FUNCTION)| |(READER INITFUNCTION)| + INITIALIZE-INTERNAL-SLOT-FUNCTIONS +- |SETF PCL SLOT-DEFINITION-TYPE| +- |(WRITER CLASS-PRECEDENCE-LIST)| |(READER WRITERS)| ++ |SETF PCL SLOT-DEFINITION-TYPE| |(READER WRITERS)| ++ |(WRITER CLASS-PRECEDENCE-LIST)| + |(WRITER ACCESSOR-FLAGS)| |(READER INITFORM)| +- METHOD-COMBINATION-P |(WRITER DOCUMENTATION)| +- |(WRITER LOCATION)| ++ METHOD-COMBINATION-P |(WRITER LOCATION)| ++ |(WRITER DOCUMENTATION)| + |(CALL REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION)| +- |SETF PCL METHOD-GENERIC-FUNCTION| +- |SETF PCL GENERIC-FUNCTION-METHOD-COMBINATION| + |SETF PCL GENERIC-FUNCTION-METHODS| +- |(READER SLOT-NAME)| ++ |SETF PCL GENERIC-FUNCTION-METHOD-COMBINATION| ++ |SETF PCL METHOD-GENERIC-FUNCTION| |(READER SLOT-NAME)| + |(WRITER INCOMPATIBLE-SUPERCLASS-LIST)| + |SETF PCL SLOT-ACCESSOR-STD-P| + |(CALL REAL-MAKE-METHOD-INITARGS-FORM)| + |(READER ALLOCATION)| |(WRITER SPECIALIZERS)| + |(CALL REAL-ENSURE-GF-USING-CLASS--NULL)| + |(WRITER IDENTITY-WITH-ONE-ARGUMENT)| +- |(SETF METHOD-GENERIC-FUNCTION)| LEGAL-SPECIALIZERS-P +- |(WRITER PRETTY-ARGLIST)| |SETF PCL OBJECT-PLIST| +- |LISP::FLOAT class predicate| |(WRITER DEFSTRUCT-FORM)| +- |(READER GENERIC-FUNCTION)| |(READER FUNCTION)| ++ |(SETF METHOD-GENERIC-FUNCTION)| ++ |(WRITER PRETTY-ARGLIST)| LEGAL-SPECIALIZERS-P ++ |SETF PCL OBJECT-PLIST| |(WRITER DEFSTRUCT-FORM)| ++ |(READER FUNCTION)| |(READER GENERIC-FUNCTION)| + |(READER LAMBDA-LIST)| |(READER SLOT-DEFINITION)| + |PCL::CLASS-PROTOTYPE-SPECIALIZER class predicate| +- |SETF PCL CLASS-DEFSTRUCT-FORM| + |SETF PCL SLOT-DEFINITION-INITFORM| ++ |SETF PCL CLASS-DEFSTRUCT-FORM| + |(READER CAN-PRECEDE-LIST)| + |SETF PCL GENERIC-FUNCTION-METHOD-CLASS| +- |(READER PROTOTYPE)| |(WRITER INITFUNCTION)| +- |(WRITER WRITER-FUNCTION)| |(WRITER WRITERS)| ++ |(READER PROTOTYPE)| |(WRITER WRITER-FUNCTION)| ++ |(WRITER INITFUNCTION)| |(WRITER WRITERS)| + SLOT-ACCESSOR-STD-P |(WRITER INITFORM)| + |(READER DFUN-STATE)| |(READER FROM-DEFCLASS-P)| + |SETF PCL GF-PRETTY-ARGLIST| +- |SETF PCL SLOT-DEFINITION-INITFUNCTION| +- |SETF PCL SLOT-DEFINITION-ALLOCATION| +- |SETF PCL SLOT-DEFINITION-INTERNAL-WRITER-FUNCTION| +- |SETF PCL SLOT-DEFINITION-INTERNAL-READER-FUNCTION| +- |SETF PCL SLOT-DEFINITION-BOUNDP-FUNCTION| +- |SETF PCL SLOT-DEFINITION-WRITER-FUNCTION| +- |SETF PCL SLOT-DEFINITION-READER-FUNCTION| ++ |SETF PCL SLOT-ACCESSOR-FUNCTION| + |SETF PCL SLOT-DEFINITION-LOCATION| +- |SETF PCL SLOT-ACCESSOR-FUNCTION| |(WRITER SLOT-NAME)| +- |(BOUNDP NAME)| |(WRITER ALLOCATION)| +- |(READER FAST-FUNCTION)| |(READER METHOD-CLASS)| +- |(SETF OBJECT-PLIST)| |(READER METHOD-COMBINATION)| +- |(READER INTERNAL-READER-FUNCTION)| ++ |SETF PCL SLOT-DEFINITION-READER-FUNCTION| ++ |SETF PCL SLOT-DEFINITION-WRITER-FUNCTION| ++ |SETF PCL SLOT-DEFINITION-BOUNDP-FUNCTION| ++ |SETF PCL SLOT-DEFINITION-INTERNAL-READER-FUNCTION| ++ |SETF PCL SLOT-DEFINITION-INTERNAL-WRITER-FUNCTION| ++ |SETF PCL SLOT-DEFINITION-ALLOCATION| ++ |SETF PCL SLOT-DEFINITION-INITFUNCTION| ++ |(WRITER SLOT-NAME)| |(BOUNDP NAME)| ++ |(READER FAST-FUNCTION)| |(WRITER ALLOCATION)| ++ |(READER METHOD-CLASS)| |(SETF OBJECT-PLIST)| + |(READER INTERNAL-WRITER-FUNCTION)| +- METHOD-COMBINATION-OPTIONS |(READER DIRECT-METHODS)| +- |(READER DIRECT-SLOTS)| +- |SETF PCL SLOT-DEFINITION-READERS| +- |(READER BOUNDP-FUNCTION)| |(WRITER GENERIC-FUNCTION)| +- |(WRITER FUNCTION)| |(READER DIRECT-SUPERCLASSES)| +- |(READER DIRECT-SUBCLASSES)| |SETF PCL DOCUMENTATION| +- |(WRITER LAMBDA-LIST)| |LISP::LIST class predicate| +- FUNCALLABLE-STANDARD-CLASS-P |(BOUNDP CLASS)| ++ |(READER INTERNAL-READER-FUNCTION)| ++ |(READER METHOD-COMBINATION)| ++ METHOD-COMBINATION-OPTIONS |(READER DIRECT-SLOTS)| ++ |(READER DIRECT-METHODS)| ++ |SETF PCL SLOT-DEFINITION-READERS| |(WRITER FUNCTION)| ++ |(WRITER GENERIC-FUNCTION)| |(READER BOUNDP-FUNCTION)| ++ |SETF PCL DOCUMENTATION| |(READER DIRECT-SUBCLASSES)| ++ |(READER DIRECT-SUPERCLASSES)| |(WRITER LAMBDA-LIST)| ++ FUNCALLABLE-STANDARD-CLASS-P + |(FAST-WRITER-METHOD SLOT-OBJECT METHOD)| +- |(WRITER SLOT-DEFINITION)| |(READER OPTIONS)| +- |(READER METHODS)| |(WRITER CAN-PRECEDE-LIST)| +- |SETF PCL SLOT-VALUE-USING-CLASS| ++ |(BOUNDP CLASS)| |(WRITER SLOT-DEFINITION)| ++ |(READER METHODS)| |(READER OPTIONS)| ++ |(WRITER CAN-PRECEDE-LIST)| + |SETF PCL SLOT-DEFINITION-CLASS| +- |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION DEFSTRUCT-ACCESSOR-SYMBOL)| ++ |SETF PCL SLOT-VALUE-USING-CLASS| + |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-ACCESSOR-SYMBOL)| +- |(WRITER PROTOTYPE)| |(BOUNDP OBJECT)| |(BOUNDP TYPE)| +- CLASS-CAN-PRECEDE-LIST |SETF PCL CLASS-SLOTS| +- |SETF PCL CLASS-DIRECT-SLOTS| SLOT-ACCESSOR-FUNCTION ++ |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION DEFSTRUCT-ACCESSOR-SYMBOL)| ++ |(WRITER PROTOTYPE)| |(BOUNDP TYPE)| |(BOUNDP OBJECT)| ++ CLASS-CAN-PRECEDE-LIST |SETF PCL CLASS-DIRECT-SLOTS| ++ |SETF PCL CLASS-SLOTS| SLOT-ACCESSOR-FUNCTION + |(BOUNDP PLIST)| + |SETF PCL CLASS-INCOMPATIBLE-SUPERCLASS-LIST| + |SETF PCL SLOT-DEFINITION-WRITERS| +@@ -1018,290 +1275,287 @@ + |(WRITER DFUN-STATE)| |(WRITER FROM-DEFCLASS-P)| + |(BOUNDP SLOTS)| SLOT-CLASS-P + MAKE-READER-METHOD-FUNCTION LEGAL-METHOD-FUNCTION-P +- |(FAST-WRITER-METHOD SLOT-OBJECT ARG-INFO)| +- |(FAST-WRITER-METHOD SLOT-CLASS INITIALIZE-INFO)| + |(FAST-WRITER-METHOD SLOT-OBJECT INITIALIZE-INFO)| ++ |(FAST-WRITER-METHOD SLOT-CLASS INITIALIZE-INFO)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT ARG-INFO)| + |PCL::PLIST-MIXIN class predicate| + |(WRITER FAST-FUNCTION)| |(WRITER METHOD-CLASS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT WRAPPER)| +- |(WRITER METHOD-COMBINATION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT WRAPPER)| GET-METHOD ++ |(WRITER INTERNAL-WRITER-FUNCTION)| + |(WRITER INTERNAL-READER-FUNCTION)| +- |(WRITER INTERNAL-WRITER-FUNCTION)| GET-METHOD +- |(WRITER DIRECT-METHODS)| |(WRITER DIRECT-SLOTS)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION INITARGS)| ++ |(WRITER METHOD-COMBINATION)| |(WRITER DIRECT-SLOTS)| ++ |(WRITER DIRECT-METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT INITARGS)| +- |(FAST-WRITER-METHOD STRUCTURE-CLASS DEFSTRUCT-CONSTRUCTOR)| +- |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-CONSTRUCTOR)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION INITARGS)| + |(FAST-WRITER-METHOD SLOT-OBJECT OPERATOR)| +- |(WRITER BOUNDP-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-CONSTRUCTOR)| ++ |(FAST-WRITER-METHOD STRUCTURE-CLASS DEFSTRUCT-CONSTRUCTOR)| ++ |(WRITER BOUNDP-FUNCTION)| |(WRITER DIRECT-SUBCLASSES)| + |(WRITER DIRECT-SUPERCLASSES)| +- |(WRITER DIRECT-SUBCLASSES)| + |(FAST-WRITER-METHOD SLOT-OBJECT CLASS-EQ-SPECIALIZER)| +- |(WRITER OPTIONS)| |(WRITER METHODS)| ++ |(WRITER METHODS)| |(WRITER OPTIONS)| + SHORT-METHOD-COMBINATION-P GF-ARG-INFO + SPECIALIZER-METHOD-TABLE MAKE-METHOD-INITARGS-FORM + CLASS-DEFSTRUCT-FORM +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION NAME)| +- |(FAST-READER-METHOD SLOT-OBJECT NAME)| +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION DFUN-STATE)| +- |(FAST-READER-METHOD SLOT-OBJECT DFUN-STATE)| +- |(FAST-READER-METHOD STANDARD-ACCESSOR-METHOD SLOT-NAME)| +- |(FAST-READER-METHOD SLOT-OBJECT SLOT-NAME)| +- |(FAST-READER-METHOD SLOT-DEFINITION NAME)| +- |(FAST-READER-METHOD CLASS NAME)| +- |(FAST-READER-METHOD CLASS PREDICATE-NAME)| + |(FAST-READER-METHOD SLOT-OBJECT PREDICATE-NAME)| +- |LISP::INTEGER class predicate| GF-PRETTY-ARGLIST +- SAME-SPECIALIZER-P +- SLOT-DEFINITION-INTERNAL-READER-FUNCTION +- SLOT-DEFINITION-INTERNAL-WRITER-FUNCTION +- SLOT-DEFINITION-READER-FUNCTION +- SLOT-DEFINITION-WRITER-FUNCTION ++ |(FAST-READER-METHOD CLASS PREDICATE-NAME)| ++ |(FAST-READER-METHOD CLASS NAME)| ++ |(FAST-READER-METHOD SLOT-DEFINITION NAME)| ++ |(FAST-READER-METHOD SLOT-OBJECT SLOT-NAME)| ++ |(FAST-READER-METHOD STANDARD-ACCESSOR-METHOD SLOT-NAME)| ++ |(FAST-READER-METHOD SLOT-OBJECT DFUN-STATE)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION DFUN-STATE)| ++ |(FAST-READER-METHOD SLOT-OBJECT NAME)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION NAME)| ++ GF-PRETTY-ARGLIST SAME-SPECIALIZER-P + SLOT-DEFINITION-BOUNDP-FUNCTION +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHOD-CLASS)| +- |(FAST-READER-METHOD SLOT-OBJECT METHOD-CLASS)| +- |(FAST-READER-METHOD SLOT-OBJECT ACCESSOR-FLAGS)| +- |(FAST-READER-METHOD SLOT-DEFINITION CLASS)| +- |(FAST-READER-METHOD SLOT-OBJECT CLASS)| +- |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION DOCUMENTATION)| +- |(FAST-READER-METHOD SLOT-OBJECT DOCUMENTATION)| +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHOD-COMBINATION)| +- |(FAST-READER-METHOD SLOT-OBJECT METHOD-COMBINATION)| +- |(FAST-READER-METHOD STANDARD-ACCESSOR-METHOD SLOT-DEFINITION)| +- |(FAST-READER-METHOD SLOT-OBJECT SLOT-DEFINITION)| +- |(FAST-READER-METHOD STANDARD-METHOD GENERIC-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT GENERIC-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT FUNCTION)| +- |(FAST-READER-METHOD STANDARD-METHOD FAST-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT FAST-FUNCTION)| +- |(FAST-READER-METHOD STANDARD-EFFECTIVE-SLOT-DEFINITION LOCATION)| +- |(FAST-READER-METHOD SLOT-OBJECT LOCATION)| +- |(FAST-READER-METHOD EFFECTIVE-SLOT-DEFINITION READER-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT READER-FUNCTION)| +- |(FAST-READER-METHOD EFFECTIVE-SLOT-DEFINITION WRITER-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT WRITER-FUNCTION)| +- |(FAST-READER-METHOD EFFECTIVE-SLOT-DEFINITION BOUNDP-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT BOUNDP-FUNCTION)| +- |(FAST-READER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-READER-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT INTERNAL-READER-FUNCTION)| +- |(FAST-READER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-WRITER-FUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT INTERNAL-WRITER-FUNCTION)| +- |(FAST-READER-METHOD STANDARD-SLOT-DEFINITION ALLOCATION)| +- |(FAST-READER-METHOD SLOT-OBJECT ALLOCATION)| +- |(FAST-READER-METHOD SLOT-DEFINITION INITFUNCTION)| +- |(FAST-READER-METHOD SLOT-OBJECT INITFUNCTION)| +- |(FAST-READER-METHOD LONG-METHOD-COMBINATION FUNCTION)| +- |(FAST-READER-METHOD TRACED-METHOD FUNCTION)| ++ SLOT-DEFINITION-WRITER-FUNCTION ++ SLOT-DEFINITION-READER-FUNCTION ++ SLOT-DEFINITION-INTERNAL-WRITER-FUNCTION ++ SLOT-DEFINITION-INTERNAL-READER-FUNCTION ++ |(FAST-READER-METHOD SLOT-OBJECT CLASS)| ++ |(FAST-READER-METHOD SLOT-DEFINITION CLASS)| ++ |(FAST-READER-METHOD SLOT-OBJECT ACCESSOR-FLAGS)| ++ |(FAST-READER-METHOD SLOT-OBJECT METHOD-CLASS)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHOD-CLASS)| + |(FAST-READER-METHOD TRACED-METHOD GENERIC-FUNCTION)| +- |(FAST-READER-METHOD STANDARD-METHOD SPECIALIZERS)| +- |(FAST-READER-METHOD SLOT-OBJECT SPECIALIZERS)| +- |(FAST-READER-METHOD SLOT-DEFINITION READERS)| +- |(FAST-READER-METHOD SLOT-OBJECT READERS)| +- |(FAST-READER-METHOD SLOT-DEFINITION WRITERS)| ++ |(FAST-READER-METHOD TRACED-METHOD FUNCTION)| ++ |(FAST-READER-METHOD LONG-METHOD-COMBINATION FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT INITFUNCTION)| ++ |(FAST-READER-METHOD SLOT-DEFINITION INITFUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT ALLOCATION)| ++ |(FAST-READER-METHOD STANDARD-SLOT-DEFINITION ALLOCATION)| ++ |(FAST-READER-METHOD SLOT-OBJECT INTERNAL-WRITER-FUNCTION)| ++ |(FAST-READER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-WRITER-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT INTERNAL-READER-FUNCTION)| ++ |(FAST-READER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-READER-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT BOUNDP-FUNCTION)| ++ |(FAST-READER-METHOD EFFECTIVE-SLOT-DEFINITION BOUNDP-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT WRITER-FUNCTION)| ++ |(FAST-READER-METHOD EFFECTIVE-SLOT-DEFINITION WRITER-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT READER-FUNCTION)| ++ |(FAST-READER-METHOD EFFECTIVE-SLOT-DEFINITION READER-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT LOCATION)| ++ |(FAST-READER-METHOD STANDARD-EFFECTIVE-SLOT-DEFINITION LOCATION)| ++ |(FAST-READER-METHOD SLOT-OBJECT FAST-FUNCTION)| ++ |(FAST-READER-METHOD STANDARD-METHOD FAST-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT GENERIC-FUNCTION)| ++ |(FAST-READER-METHOD STANDARD-METHOD GENERIC-FUNCTION)| ++ |(FAST-READER-METHOD SLOT-OBJECT SLOT-DEFINITION)| ++ |(FAST-READER-METHOD STANDARD-ACCESSOR-METHOD SLOT-DEFINITION)| ++ |(FAST-READER-METHOD SLOT-OBJECT METHOD-COMBINATION)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHOD-COMBINATION)| ++ |(FAST-READER-METHOD SLOT-OBJECT DOCUMENTATION)| ++ |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION DOCUMENTATION)| + |(FAST-READER-METHOD SLOT-OBJECT WRITERS)| +- |(FAST-READER-METHOD EQL-SPECIALIZER OBJECT)| +- |(FAST-READER-METHOD SLOT-OBJECT OBJECT)| +- |(FAST-READER-METHOD CLASS-PROTOTYPE-SPECIALIZER OBJECT)| +- |(FAST-READER-METHOD CLASS-EQ-SPECIALIZER OBJECT)| +- |(FAST-READER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| +- |(FAST-READER-METHOD SHORT-METHOD-COMBINATION IDENTITY-WITH-ONE-ARGUMENT)| +- |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION TYPE)| +- |(FAST-READER-METHOD SLOT-OBJECT TYPE)| +- |(FAST-READER-METHOD SLOT-DEFINITION TYPE)| +- |(FAST-READER-METHOD PCL-CLASS PROTOTYPE)| +- |(FAST-READER-METHOD SLOT-OBJECT PROTOTYPE)| ++ |(FAST-READER-METHOD SLOT-DEFINITION WRITERS)| ++ |(FAST-READER-METHOD SLOT-OBJECT READERS)| ++ |(FAST-READER-METHOD SLOT-DEFINITION READERS)| ++ |(FAST-READER-METHOD SLOT-OBJECT SPECIALIZERS)| ++ |(FAST-READER-METHOD STANDARD-METHOD SPECIALIZERS)| + |(FAST-READER-METHOD SPECIALIZER TYPE)| +- |(FAST-READER-METHOD SLOT-DEFINITION INITFORM)| +- |(FAST-READER-METHOD SLOT-OBJECT INITFORM)| +- |(FAST-READER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| ++ |(FAST-READER-METHOD SLOT-OBJECT PROTOTYPE)| ++ |(FAST-READER-METHOD PCL-CLASS PROTOTYPE)| ++ |(FAST-READER-METHOD SLOT-DEFINITION TYPE)| ++ |(FAST-READER-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION TYPE)| ++ |(FAST-READER-METHOD SHORT-METHOD-COMBINATION IDENTITY-WITH-ONE-ARGUMENT)| ++ |(FAST-READER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| ++ |(FAST-READER-METHOD CLASS-EQ-SPECIALIZER OBJECT)| ++ |(FAST-READER-METHOD CLASS-PROTOTYPE-SPECIALIZER OBJECT)| ++ |(FAST-READER-METHOD SLOT-OBJECT OBJECT)| ++ |(FAST-READER-METHOD EQL-SPECIALIZER OBJECT)| + |(FAST-READER-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION PRETTY-ARGLIST)| +- |(FAST-READER-METHOD SLOT-OBJECT PRETTY-ARGLIST)| +- |(FAST-READER-METHOD STANDARD-METHOD LAMBDA-LIST)| +- |(FAST-READER-METHOD SLOT-OBJECT LAMBDA-LIST)| +- |(FAST-READER-METHOD PCL-CLASS CLASS-PRECEDENCE-LIST)| +- |(FAST-READER-METHOD SLOT-OBJECT CLASS-PRECEDENCE-LIST)| +- |(FAST-READER-METHOD PCL-CLASS CAN-PRECEDE-LIST)| +- |(FAST-READER-METHOD SLOT-OBJECT CAN-PRECEDE-LIST)| +- |(FAST-READER-METHOD PCL-CLASS INCOMPATIBLE-SUPERCLASS-LIST)| +- |(FAST-READER-METHOD SLOT-OBJECT INCOMPATIBLE-SUPERCLASS-LIST)| +- |(FAST-READER-METHOD PLIST-MIXIN PLIST)| ++ |(FAST-READER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| ++ |(FAST-READER-METHOD SLOT-OBJECT INITFORM)| ++ |(FAST-READER-METHOD SLOT-DEFINITION INITFORM)| + |(FAST-READER-METHOD SLOT-OBJECT PLIST)| +- |(FAST-READER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| +- |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION OPTIONS)| +- |(FAST-READER-METHOD SLOT-OBJECT OPTIONS)| +- |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| +- |(FAST-READER-METHOD SLOT-OBJECT METHODS)| +- |(FAST-READER-METHOD SLOT-CLASS DIRECT-SLOTS)| +- |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SLOTS)| +- |(FAST-READER-METHOD SLOT-CLASS SLOTS)| +- |(FAST-READER-METHOD SLOT-OBJECT SLOTS)| ++ |(FAST-READER-METHOD PLIST-MIXIN PLIST)| ++ |(FAST-READER-METHOD SLOT-OBJECT INCOMPATIBLE-SUPERCLASS-LIST)| ++ |(FAST-READER-METHOD PCL-CLASS INCOMPATIBLE-SUPERCLASS-LIST)| ++ |(FAST-READER-METHOD SLOT-OBJECT CAN-PRECEDE-LIST)| ++ |(FAST-READER-METHOD PCL-CLASS CAN-PRECEDE-LIST)| ++ |(FAST-READER-METHOD SLOT-OBJECT CLASS-PRECEDENCE-LIST)| ++ |(FAST-READER-METHOD PCL-CLASS CLASS-PRECEDENCE-LIST)| ++ |(FAST-READER-METHOD SLOT-OBJECT LAMBDA-LIST)| ++ |(FAST-READER-METHOD STANDARD-METHOD LAMBDA-LIST)| ++ |(FAST-READER-METHOD SLOT-OBJECT PRETTY-ARGLIST)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION PRETTY-ARGLIST)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-METHODS)| +- |(FAST-READER-METHOD CLASS DIRECT-SUPERCLASSES)| +- |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| +- |(FAST-READER-METHOD CLASS DIRECT-SUBCLASSES)| ++ |(FAST-READER-METHOD SLOT-OBJECT SLOTS)| ++ |(FAST-READER-METHOD SLOT-CLASS SLOTS)| ++ |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SLOTS)| ++ |(FAST-READER-METHOD SLOT-CLASS DIRECT-SLOTS)| ++ |(FAST-READER-METHOD SLOT-OBJECT METHODS)| ++ |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| ++ |(FAST-READER-METHOD SLOT-OBJECT OPTIONS)| ++ |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION OPTIONS)| ++ |(FAST-READER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| ++ |(FAST-READER-METHOD CLASS DIRECT-SUBCLASSES)| ++ |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| ++ |(FAST-READER-METHOD CLASS DIRECT-SUPERCLASSES)| + SLOT-DEFINITION-CLASS EQL-SPECIALIZER-OBJECT + |PCL::DIRECT-SLOT-DEFINITION class predicate| + CLASS-CONSTRUCTORS |(BOUNDP WRAPPER)| SLOTS-TO-INSPECT +- |(FAST-BOUNDP-METHOD SLOT-OBJECT NAME)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT DFUN-STATE)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOT-NAME)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT PREDICATE-NAME)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOT-NAME)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT DFUN-STATE)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT NAME)| + |(BOUNDP DEFSTRUCT-ACCESSOR-SYMBOL)| + SPECIALIZER-DIRECT-GENERIC-FUNCTIONS + |(BOUNDP CLASS-EQ-SPECIALIZER)| + |(SETF SLOT-DEFINITION-NAME)| ADD-WRITER-METHOD +- |(FAST-BOUNDP-METHOD SLOT-OBJECT METHOD-CLASS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT ACCESSOR-FLAGS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT CLASS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT DOCUMENTATION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT METHOD-COMBINATION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOT-DEFINITION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT GENERIC-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT FAST-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT LOCATION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT READER-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT WRITER-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT BOUNDP-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT INTERNAL-READER-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT INTERNAL-WRITER-FUNCTION)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT ALLOCATION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT ACCESSOR-FLAGS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT METHOD-CLASS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT INITFUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT ALLOCATION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT INTERNAL-WRITER-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT INTERNAL-READER-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT BOUNDP-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT WRITER-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT READER-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT LOCATION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT FAST-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT GENERIC-FUNCTION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOT-DEFINITION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT METHOD-COMBINATION)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT DOCUMENTATION)| + |(BOUNDP OPERATOR)| |(BOUNDP ARG-INFO)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT SPECIALIZERS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT READERS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT WRITERS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT OBJECT)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT READERS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT SPECIALIZERS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT PROTOTYPE)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT INITFORM)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT OBJECT)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| +- |(SETF SLOT-DEFINITION-CLASS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT INITFORM)| + |(SETF SLOT-VALUE-USING-CLASS)| +- |(SETF SLOT-DEFINITION-LOCATION)| +- |(SETF SLOT-DEFINITION-READER-FUNCTION)| +- |(SETF SLOT-DEFINITION-WRITER-FUNCTION)| +- |(SETF SLOT-DEFINITION-BOUNDP-FUNCTION)| +- |(SETF SLOT-DEFINITION-INTERNAL-READER-FUNCTION)| +- |(SETF SLOT-DEFINITION-INTERNAL-WRITER-FUNCTION)| +- |(SETF SLOT-DEFINITION-ALLOCATION)| +- |(SETF SLOT-DEFINITION-INITFUNCTION)| ++ |(SETF SLOT-DEFINITION-CLASS)| + |(SETF SLOT-ACCESSOR-FUNCTION)| ++ |(SETF SLOT-DEFINITION-INITFUNCTION)| ++ |(SETF SLOT-DEFINITION-ALLOCATION)| ++ |(SETF SLOT-DEFINITION-INTERNAL-WRITER-FUNCTION)| ++ |(SETF SLOT-DEFINITION-INTERNAL-READER-FUNCTION)| ++ |(SETF SLOT-DEFINITION-BOUNDP-FUNCTION)| ++ |(SETF SLOT-DEFINITION-WRITER-FUNCTION)| ++ |(SETF SLOT-DEFINITION-READER-FUNCTION)| ++ |(SETF SLOT-DEFINITION-LOCATION)| + |(BOUNDP DEFSTRUCT-CONSTRUCTOR)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT PRETTY-ARGLIST)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT LAMBDA-LIST)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT CLASS-PRECEDENCE-LIST)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT CAN-PRECEDE-LIST)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT INCOMPATIBLE-SUPERCLASS-LIST)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT PLIST)| +- |(SETF SLOT-DEFINITION-READERS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT INCOMPATIBLE-SUPERCLASS-LIST)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT CAN-PRECEDE-LIST)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT CLASS-PRECEDENCE-LIST)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT LAMBDA-LIST)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT PRETTY-ARGLIST)| + |(SETF SLOT-DEFINITION-WRITERS)| ++ |(SETF SLOT-DEFINITION-READERS)| + |(SETF SLOT-DEFINITION-TYPE)| + |(SETF SLOT-DEFINITION-INITFORM)| + |(BOUNDP INITIALIZE-INFO)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT OPTIONS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT METHODS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SLOTS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOTS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-METHODS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-METHODS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOTS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SLOTS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT METHODS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT OPTIONS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| + |(FAST-INTERNAL-READER-METHOD STANDARD-GENERIC-FUNCTION ARG-INFO)| + |(BOUNDP INITARGS)| LONG-METHOD-COMBINATION-FUNCTION + GENERIC-FUNCTION-P +- |PCL::SLOT-DEFINITION class predicate| +- |LISP::NULL class predicate| |(READER NAME)| +- |(READER CLASS)| |(FAST-METHOD SLOT-MISSING (T T T T))| ++ |PCL::SLOT-DEFINITION class predicate| |(READER NAME)| ++ |(READER CLASS)| |(FAST-METHOD SLOT-UNBOUND (T T T))| + |(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| +- |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- |(FAST-METHOD SLOT-UNBOUND (T T T))| +- |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| + |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| + |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| + |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| ++ |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| ++ |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| ++ |(FAST-METHOD PRINT-OBJECT (T T))| ++ |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| ++ |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| ++ |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| ++ |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| + |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| + |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| + |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD DESCRIBE-OBJECT (T T))| +- |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| + |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| ++ |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| + |(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (T T))| + |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| + |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| + |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| + |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SLOT-MISSING (T T T T))| + |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (T T))| +- |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (CLASS T))| +- |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| +- |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- LEGAL-SLOT-NAME-P |(READER OBJECT)| |(READER TYPE)| ++ LEGAL-SLOT-NAME-P |(READER TYPE)| |(READER OBJECT)| + CLASS-WRAPPER |(READER PLIST)| +- |(FAST-METHOD NO-APPLICABLE-METHOD (T))| +- |(FAST-METHOD DOCUMENTATION (T))| + |(FAST-METHOD CLASS-PREDICATE-NAME (T))| ++ |(FAST-METHOD DOCUMENTATION (T))| ++ |(FAST-METHOD NO-APPLICABLE-METHOD (T))| + |(READER SLOTS)| |(WRITER NAME)| DEFINITION-SOURCE + |PCL::SLOT-OBJECT class predicate| DEFAULT-INITARGS +- |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER OBJECT)| +- |(WRITER TYPE)| ++ |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER TYPE)| ++ |(WRITER OBJECT)| + |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| + |(WRITER PLIST)| |(WRITER SLOTS)| + |PCL::DOCUMENTATION-MIXIN class predicate| +@@ -1309,37 +1563,55 @@ + LEGAL-QUALIFIER-P METHOD-P + |PCL::SPECIALIZER-WITH-OBJECT class predicate| + CLASS-SLOT-CELLS +- |(COMBINED-METHOD REINITIALIZE-INSTANCE)| + |(COMBINED-METHOD INITIALIZE-INSTANCE)| ++ |(COMBINED-METHOD REINITIALIZE-INSTANCE)| + STANDARD-ACCESSOR-METHOD-P |(SETF CLASS-NAME)| +- STANDARD-METHOD-P STANDARD-READER-METHOD-P +- STANDARD-GENERIC-FUNCTION-P |(READER WRAPPER)| ++ STANDARD-GENERIC-FUNCTION-P STANDARD-READER-METHOD-P ++ STANDARD-METHOD-P |(READER WRAPPER)| + |(READER DEFSTRUCT-ACCESSOR-SYMBOL)| + |(READER CLASS-EQ-SPECIALIZER)| +- COMPUTE-DEFAULT-INITARGS + COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS +- |(SETF CLASS-DEFSTRUCT-FORM)| ++ COMPUTE-DEFAULT-INITARGS |(SETF CLASS-DEFSTRUCT-FORM)| + |(CALL REAL-MAKE-METHOD-LAMBDA)| + |(SETF CLASS-INCOMPATIBLE-SUPERCLASS-LIST)| +- |SETF PCL CLASS-SLOT-VALUE| |(SETF CLASS-DIRECT-SLOTS)| +- |(SETF CLASS-SLOTS)| DO-STANDARD-DEFSETF-1 +- |(READER OPERATOR)| |(CALL REAL-ADD-METHOD)| +- |(CALL REAL-REMOVE-METHOD)| |(CALL REAL-GET-METHOD)| ++ |COMMON-LISP::NULL class predicate| ++ |COMMON-LISP::SYMBOL class predicate| ++ |COMMON-LISP::CHARACTER class predicate| ++ |COMMON-LISP::BIT-VECTOR class predicate| ++ |COMMON-LISP::STRING class predicate| ++ |COMMON-LISP::VECTOR class predicate| ++ |COMMON-LISP::ARRAY class predicate| ++ |COMMON-LISP::CONS class predicate| ++ |COMMON-LISP::LIST class predicate| ++ |COMMON-LISP::SEQUENCE class predicate| ++ |COMMON-LISP::RATIO class predicate| ++ |COMMON-LISP::INTEGER class predicate| ++ |COMMON-LISP::RATIONAL class predicate| ++ |COMMON-LISP::FLOAT class predicate| ++ |COMMON-LISP::COMPLEX class predicate| ++ |COMMON-LISP::NUMBER class predicate| ++ |COMMON-LISP::T class predicate| ++ |COMMON-LISP::STRUCTURE-OBJECT class predicate| ++ |COMMON-LISP::STANDARD-OBJECT class predicate| ++ |COMMON-LISP::BUILT-IN-CLASS class predicate| ++ |SETF PCL CLASS-SLOT-VALUE| |(SETF CLASS-SLOTS)| ++ |(SETF CLASS-DIRECT-SLOTS)| DO-STANDARD-DEFSETF-1 ++ |(READER OPERATOR)| |(CALL REAL-GET-METHOD)| ++ |(CALL REAL-REMOVE-METHOD)| |(CALL REAL-ADD-METHOD)| + |(READER ARG-INFO)| METHOD-COMBINATION-TYPE + |(READER DEFSTRUCT-CONSTRUCTOR)| + |(INTERNAL-READER-METHOD STANDARD-GENERIC-FUNCTION ARG-INFO)| + |(READER INITIALIZE-INFO)| |(WRITER WRAPPER)| +- STANDARD-CLASS-P |LISP::NUMBER class predicate| +- LEGAL-SPECIALIZER-P ++ STANDARD-CLASS-P LEGAL-SPECIALIZER-P + |PCL::LONG-METHOD-COMBINATION class predicate| + |(WRITER DEFSTRUCT-ACCESSOR-SYMBOL)| + COMPUTE-SLOT-ACCESSOR-INFO |(READER INITARGS)| + |(WRITER CLASS-EQ-SPECIALIZER)| + STANDARD-BOUNDP-METHOD-P FDEFINE-CAREFULLY + |(SETF DOCUMENTATION)| RAW-INSTANCE-ALLOCATOR +- |SETF PCL CLASS-INITIALIZE-INFO| + |SETF PCL SLOT-DEFINITION-DEFSTRUCT-ACCESSOR-SYMBOL| +- |(WRITER OPERATOR)| |(WRITER ARG-INFO)| ++ |SETF PCL CLASS-INITIALIZE-INFO| |(WRITER OPERATOR)| ++ |(WRITER ARG-INFO)| + COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO + STANDARD-WRITER-METHOD-P + CLASS-INCOMPATIBLE-SUPERCLASS-LIST +@@ -1349,78 +1621,77 @@ + METHOD-COMBINATION-DOCUMENTATION + |SETF PCL SLOT-DEFINITION-INITARGS| + REMOVE-BOUNDP-METHOD ADD-NAMED-METHOD +- |(WRITER INITARGS)| + |SETF PCL CLASS-DEFSTRUCT-CONSTRUCTOR| +- |LISP::CONS class predicate| |(BOUNDP METHOD)| +- |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION NAME)| +- |(FAST-WRITER-METHOD SLOT-OBJECT NAME)| +- |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION DFUN-STATE)| +- |(FAST-WRITER-METHOD SLOT-OBJECT DFUN-STATE)| +- |(FAST-WRITER-METHOD SLOT-OBJECT SLOT-NAME)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION NAME)| +- |(FAST-WRITER-METHOD CLASS NAME)| ++ |(WRITER INITARGS)| |(BOUNDP METHOD)| + |(FAST-WRITER-METHOD SLOT-OBJECT PREDICATE-NAME)| ++ |(FAST-WRITER-METHOD CLASS NAME)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION NAME)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT SLOT-NAME)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT DFUN-STATE)| ++ |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION DFUN-STATE)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT NAME)| ++ |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION NAME)| + |(BOUNDP SOURCE)| |(SETF GF-DFUN-STATE)| + SHORT-COMBINATION-OPERATOR +- |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHOD-CLASS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT METHOD-CLASS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT ACCESSOR-FLAGS)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION CLASS)| + |(FAST-WRITER-METHOD SLOT-OBJECT CLASS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT DOCUMENTATION)| +- |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHOD-COMBINATION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT METHOD-COMBINATION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT SLOT-DEFINITION)| +- |(FAST-WRITER-METHOD STANDARD-METHOD GENERIC-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT GENERIC-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT FAST-FUNCTION)| +- |(FAST-WRITER-METHOD STANDARD-EFFECTIVE-SLOT-DEFINITION LOCATION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT LOCATION)| +- |(FAST-WRITER-METHOD EFFECTIVE-SLOT-DEFINITION READER-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT READER-FUNCTION)| +- |(FAST-WRITER-METHOD EFFECTIVE-SLOT-DEFINITION WRITER-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT WRITER-FUNCTION)| +- |(FAST-WRITER-METHOD EFFECTIVE-SLOT-DEFINITION BOUNDP-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT BOUNDP-FUNCTION)| +- |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-READER-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT INTERNAL-READER-FUNCTION)| +- |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-WRITER-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT INTERNAL-WRITER-FUNCTION)| +- |(FAST-WRITER-METHOD STANDARD-SLOT-DEFINITION ALLOCATION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT ALLOCATION)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION INITFUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT INITFUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION CLASS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT ACCESSOR-FLAGS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT METHOD-CLASS)| ++ |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHOD-CLASS)| + |(FAST-WRITER-METHOD TRACED-METHOD GENERIC-FUNCTION)| +- |(FAST-WRITER-METHOD SLOT-OBJECT SPECIALIZERS)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION READERS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT READERS)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION WRITERS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT INITFUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION INITFUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT ALLOCATION)| ++ |(FAST-WRITER-METHOD STANDARD-SLOT-DEFINITION ALLOCATION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT INTERNAL-WRITER-FUNCTION)| ++ |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-WRITER-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT INTERNAL-READER-FUNCTION)| ++ |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION INTERNAL-READER-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT BOUNDP-FUNCTION)| ++ |(FAST-WRITER-METHOD EFFECTIVE-SLOT-DEFINITION BOUNDP-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT WRITER-FUNCTION)| ++ |(FAST-WRITER-METHOD EFFECTIVE-SLOT-DEFINITION WRITER-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT READER-FUNCTION)| ++ |(FAST-WRITER-METHOD EFFECTIVE-SLOT-DEFINITION READER-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT LOCATION)| ++ |(FAST-WRITER-METHOD STANDARD-EFFECTIVE-SLOT-DEFINITION LOCATION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT FAST-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT GENERIC-FUNCTION)| ++ |(FAST-WRITER-METHOD STANDARD-METHOD GENERIC-FUNCTION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT SLOT-DEFINITION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT METHOD-COMBINATION)| ++ |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHOD-COMBINATION)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT DOCUMENTATION)| + |(FAST-WRITER-METHOD SLOT-OBJECT WRITERS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT OBJECT)| +- |(FAST-WRITER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| +- |(FAST-WRITER-METHOD SLOT-OBJECT TYPE)| +- |(FAST-WRITER-METHOD SLOT-DEFINITION TYPE)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION WRITERS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT READERS)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION READERS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT SPECIALIZERS)| + |(FAST-WRITER-METHOD SLOT-OBJECT PROTOTYPE)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION TYPE)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT OBJECT)| + REMOVE-NAMED-METHOD +- |(FAST-WRITER-METHOD SLOT-DEFINITION INITFORM)| +- |(FAST-WRITER-METHOD SLOT-OBJECT INITFORM)| +- |(FAST-WRITER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| + |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| +- |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION PRETTY-ARGLIST)| +- |(FAST-WRITER-METHOD SLOT-OBJECT PRETTY-ARGLIST)| +- |(FAST-WRITER-METHOD SLOT-OBJECT LAMBDA-LIST)| +- |(FAST-WRITER-METHOD SLOT-OBJECT CLASS-PRECEDENCE-LIST)| +- |(FAST-WRITER-METHOD SLOT-OBJECT CAN-PRECEDE-LIST)| +- |(FAST-WRITER-METHOD PCL-CLASS INCOMPATIBLE-SUPERCLASS-LIST)| +- |(FAST-WRITER-METHOD SLOT-OBJECT INCOMPATIBLE-SUPERCLASS-LIST)| +- |(FAST-WRITER-METHOD PLIST-MIXIN PLIST)| ++ |(FAST-WRITER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT INITFORM)| ++ |(FAST-WRITER-METHOD SLOT-DEFINITION INITFORM)| + |(FAST-WRITER-METHOD SLOT-OBJECT PLIST)| ++ |(FAST-WRITER-METHOD PLIST-MIXIN PLIST)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT INCOMPATIBLE-SUPERCLASS-LIST)| ++ |(FAST-WRITER-METHOD PCL-CLASS INCOMPATIBLE-SUPERCLASS-LIST)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT CAN-PRECEDE-LIST)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT CLASS-PRECEDENCE-LIST)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT LAMBDA-LIST)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT PRETTY-ARGLIST)| ++ |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION PRETTY-ARGLIST)| + LEGAL-DOCUMENTATION-P CLASS-DIRECT-SUPERCLASSES + CLASS-DIRECT-SUBCLASSES CLASS-DIRECT-DEFAULT-INITARGS + SLOT-DEFINITION-READERS SLOT-VALUE-USING-CLASS +- COMPUTE-APPLICABLE-METHODS CLASS-NAME CLASSP +- CLASS-PROTOTYPE READER-METHOD-CLASS REMOVE-METHOD ++ COMPUTE-APPLICABLE-METHODS CLASS-NAME CLASS-PROTOTYPE ++ CLASSP READER-METHOD-CLASS REMOVE-METHOD + SLOT-DEFINITION-INITFORM + UPDATE-INSTANCE-FOR-REDEFINED-CLASS + UPDATE-INSTANCE-FOR-DIFFERENT-CLASS CHANGE-CLASS +@@ -1454,5 +1725,6 @@ + ENSURE-CLASS-USING-CLASS NO-APPLICABLE-METHOD + SLOT-DEFINITION-WRITERS + COMPUTE-APPLICABLE-METHODS-USING-CLASSES +- CLASS-PRECEDENCE-LIST)) ++ CLASS-PRECEDENCE-LIST DISASSEMBLE DESCRIBE-OBJECT ++ COMPILE)) + (SETF (GET V 'SYSTEM::PROCLAIMED-CLOSURE) T)) +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -69,42 +69,7 @@ $(LSPDIR)/auto_new.lsp: $(LSPDIR)/auto.l + [ "$(RL_OBJS)" = "" ] || \ + echo "(AUTOLOAD 'init-readline '|readline|)" >>$@ + +-init_gcl.lsp.tmp: init_gcl.lsp.in +- cp $< $@ +- +-init_pre_gcl.lsp.tmp: init_pre_gcl.lsp.in +- cp $< $@ +- +-init_mod_gcl.lsp.tmp: init_mod_gcl.lsp.in +- cp $< $@ +- +-init_xgcl.lsp.tmp: init_gcl.lsp.tmp +- ln -snf $< $@ +- +-init_pcl_gcl.lsp.tmp: init_pcl_gcl.lsp.in ../cmpnew/gcl_cmpmain.lsp \ +- ../pcl/sys-package.lisp ../clcs/package.lisp \ +- $(shell find ../clcs/ -name "clcs_*.lisp") +- +- awk '/^ *@LI-PCL-PACKAGE@/{i=1;next} {if (i==0) print}' $< >$@ +-# cat ../cmpnew/gcl_cmpmain.lsp >>$@ +- cat ../pcl/sys-package.lisp >>$@ +- awk '/^ *@LI-PCL-PACKAGE@/{i=1;next} {if (i==1) print}' $< >>$@ +- +-init_ansi_gcl.lsp.tmp: init_ansi_gcl.lsp.in ../cmpnew/gcl_cmpmain.lsp \ +- ../pcl/sys-package.lisp ../clcs/package.lisp +- +- awk '/^ *@LI-PCL-PACKAGE@/{i=1;next} \ +- /^ *@LI-CLCS-PACKAGE@/{i=2;next} {if (i==0) print}' $< >$@ +-# cat ../cmpnew/gcl_cmpmain.lsp >>$@ +- cat ../pcl/sys-package.lisp >>$@ +- awk '/^ *@LI-PCL-PACKAGE@/{i=1;next} \ +- /^ *@LI-CLCS-PACKAGE@/{i=2;next} {if (i==1) print}' $< >>$@ +- cat ../clcs/package.lisp >>$@ +- awk '/^ *@LI-PCL-PACKAGE@/{i=1;next} \ +- /^ *@LI-CLCS-PACKAGE@/{i=2;next} {if (i==2) print}' $< >>$@ +- +- +-init_%.lsp: init_%.lsp.tmp ++sys_init.lsp: sys_init.lsp.in + + cat $< | sed \ + -e "s#@LI-VERS@#(`cat ../majvers`.`cat ../minvers`) `date`#1" \ +@@ -118,14 +83,14 @@ init_%.lsp: init_%.lsp.tmp + -e "s#@LI-OPT-TWO@#\"$(O2FLAGS)\"#1" \ + -e "s#@LI-INIT-LSP@#\"$@\"#1" >$@ + +-saved_%:raw_% $(RSYM) init_%.lsp raw_%_map msys \ ++saved_%:raw_% $(RSYM) sys_init.lsp raw_%_map msys \ + $(CMPDIR)/gcl_cmpmain.lsp \ + $(CMPDIR)/gcl_lfun_list.lsp \ + $(CMPDIR)/gcl_cmpopt.lsp $(HDIR)/cmpinclude.h \ + $(LSPDIR)/gcl_auto_new.lsp + +- cp init_$*.lsp foo +- echo " (in-package \"USER\")(system:save-system \"$@\")" >>foo ++ cp sys_init.lsp foo ++ echo "(unless si::*quit-tags* (in-package \"USER\")(system:save-system \"$@\"))" >>foo + ar x lib$*.a $$(ar t lib$*.a |grep ^gcl_) + $(PORTDIR)/raw_$*$(EXE) $(PORTDIR)/ -libdir $(GCLDIR)/ < foo + # check that saved image can be prelinked +@@ -194,7 +159,7 @@ map_%: + clean: + rm -rf saved_*$(EXE) raw_*$(EXE) *.o core a.out $(RSYM) \ + $(LSPDIR)/auto_new.lsp foo *maxima* init_*.lsp lib*.a gmp* bfd* *.lsp.tmp \ +- gazonk*.lsp plt*h *_map saved_* lib* raw_* msys out* log* tmp* gcl.script ++ gazonk*.lsp plt*h *_map saved_* lib* raw_* msys out* log* tmp* gcl.script sys_init.lsp + + .INTERMEDIATE: init_ansi_gcl.lsp.tmp init_gcl.lsp.tmp raw_gcl raw_ansi_gcl + .PRECIOUS: init_pre_gcl.lsp init_gcl.lsp init_ansi_gcl.lsp +--- gcl-2.6.12.orig/unixport/sys_ansi_gcl.c ++++ gcl-2.6.12/unixport/sys_ansi_gcl.c +@@ -7,6 +7,10 @@ void + gcl_init_init() + { + ++ object features; ++ features=find_symbol(make_simple_string("*FEATURES*"),system_package); ++ features->s.s_dbind=make_cons(make_keyword("ANSI-CL"),make_cons(make_keyword("COMMON-LISP"),features->s.s_dbind)); ++ + build_symbol_table(); + + lsp_init("../lsp/gcl_export.lsp"); +@@ -86,7 +90,7 @@ gcl_init_system(object no_init) + ar_check_init(gcl_cmpmain,no_init); + + #ifdef HAVE_XGCL +- lsp_init("../xgcl-2/sysdef.lisp"); ++ lsp_init("../xgcl-2/package.lisp"); + ar_check_init(gcl_Xlib,no_init); + ar_check_init(gcl_Xutil,no_init); + ar_check_init(gcl_X,no_init); +--- gcl-2.6.12.orig/unixport/sys_gcl.c ++++ gcl-2.6.12/unixport/sys_gcl.c +@@ -83,7 +83,7 @@ gcl_init_system(object no_init) { + ar_check_init(gcl_cmpmain,no_init); + + #ifdef HAVE_XGCL +- lsp_init("../xgcl-2/sysdef.lisp"); ++ lsp_init("../xgcl-2/package.lisp"); + ar_check_init(gcl_Xlib,no_init); + ar_check_init(gcl_Xutil,no_init); + ar_check_init(gcl_X,no_init); +--- /dev/null ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -0,0 +1,82 @@ ++(make-package :compiler :use '(:lisp :si)) ++(make-package :sloop :use '(:lisp)) ++(make-package :ansi-loop :use'(:lisp)) ++(make-package :defpackage :use '(:lisp)) ++(make-package :tk :use '(:lisp :sloop)) ++(make-package :fpe :use '(:lisp)) ++(make-package :cltl1-compat) ++ ++(in-package :system) ++(use-package :fpe) ++ ++#+(or pcl ansi-cl)(load "../pcl/package.lisp") ++#+ansi-cl(load "../clcs/package.lisp") ++ ++(init-system) ++(in-package :si) ++(gbc t) ++ ++(unless *link-array* ++ (setq *link-array* (make-array (ash 1 11) :element-type 'character :fill-pointer 0))) ++(use-fast-links t) ++ ++(let* ((x (append (pathname-directory *system-directory*) (list :parent))) ++ (lsp (append x (list "lsp"))) ++ (cmpnew (append x (list "cmpnew"))) ++ (h (append x (list "h"))) ++ (xgcl-2 (append x (list "xgcl-2"))) ++ (pcl (append x (list "pcl"))) ++ (clcs (append x (list "clcs"))) ++ (gtk (append x (list "gcl-tk")))) ++ (dolist (d (list lsp cmpnew #-pre-gcl xgcl-2 #+(or pcl ansi-cl) pcl #+ansi-cl clcs)) ++ (load (make-pathname :name "sys-proclaim" :type "lisp" :directory d))) ++ (load (make-pathname :name "tk-package" :type "lsp" :directory gtk)) ++ (load (make-pathname :name "gcl_lfun_list" :type "lsp" :directory cmpnew)) ++ (load (make-pathname :name "gcl_cmpopt" :type "lsp" :directory cmpnew)) ++ (load (make-pathname :name "gcl_auto_new" :type "lsp" :directory lsp)) ++ ++ (gbc t)) ++ ++(setf (symbol-function 'clear-compiler-properties) ++ (symbol-function 'compiler::compiler-clear-compiler-properties)) ++ ++(terpri) ++(setq *inhibit-macro-special* t) ++(gbc t) ++(reset-gbc-count) ++ ++(defun top-level nil (gcl-top-level)) ++ ++(set-up-top-level) ++ ++(setq *gcl-extra-version* @LI-EXTVERS@ ++ *gcl-minor-version* @LI-MINVERS@ ++ *gcl-major-version* @LI-MAJVERS@) ++ ++(defvar *system-banner* (default-system-banner)) ++(setq *optimize-maximum-pages* t) ++ ++(fmakunbound 'init-cmp-anon) ++(when (fboundp 'user-init) (user-init)) ++(in-package :compiler) ++(setq *cc* @LI-CC@ ++ *ld* @LI-LD@ ++ *ld-libs* @LI-LD-LIBS@ ++ *opt-three* @LI-OPT-THREE@ ++ *opt-two* @LI-OPT-TWO@ ++ *init-lsp* @LI-INIT-LSP@) ++ ++(import 'si::(clines defentry defcfun object void int double ++ quit bye gbc system commonp ++ *break-on-warnings* ++ make-char char-bits char-font char-bit set-char-bit string-char-p int-char ++ char-font-limit char-bits-limit char-control-bit ++ char-meta-bit char-super-bit char-hyper-bit compiler-let) :cltl1-compat) ++(deftype cltl1-compat::string-char nil 'character) ++(do-symbols (s :cltl1-compat) (export s :cltl1-compat)) ++ ++#-ansi-cl(use-package :cltl1-compat :lisp) ++#-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp))) ++(export '*load-pathname* :si);For maxima, at least as of 5.34.1 ++ ++#+ansi-cl (use-package :pcl :user) +--- gcl-2.6.12.orig/unixport/sys_pcl_gcl.c ++++ gcl-2.6.12/unixport/sys_pcl_gcl.c +@@ -7,6 +7,10 @@ void + gcl_init_init() + { + ++ object features; ++ features=find_symbol(make_simple_string("*FEATURES*"),system_package); ++ features->s.s_dbind=make_cons(make_keyword("PCL"),features->s.s_dbind); ++ + build_symbol_table(); + + lsp_init("../lsp/gcl_export.lsp"); +@@ -86,7 +90,7 @@ gcl_init_system(object no_init) + ar_check_init(gcl_cmpmain,no_init); + + #ifdef HAVE_XGCL +- lsp_init("../xgcl-2/sysdef.lisp"); ++ lsp_init("../xgcl-2/package.lisp"); + ar_check_init(gcl_Xlib,no_init); + ar_check_init(gcl_Xutil,no_init); + ar_check_init(gcl_X,no_init); +--- gcl-2.6.12.orig/unixport/sys_pre_gcl.c ++++ gcl-2.6.12/unixport/sys_pre_gcl.c +@@ -4,6 +4,10 @@ void + gcl_init_init() + { + ++ object features; ++ features=find_symbol(make_simple_string("*FEATURES*"),system_package); ++ features->s.s_dbind=make_cons(make_keyword("PRE-GCL"),features->s.s_dbind); ++ + build_symbol_table(); + + lsp_init("../lsp/gcl_export.lsp"); +@@ -80,6 +84,7 @@ gcl_init_system(object no_init) + lsp_init("../cmpnew/gcl_cmpvar.lsp"); + lsp_init("../cmpnew/gcl_cmpvs.lsp"); + lsp_init("../cmpnew/gcl_cmpwt.lsp"); ++ lsp_init("../cmpnew/gcl_cmpmain.lsp"); + + + } +--- gcl-2.6.12.orig/xgcl-2/gcl_init_xgcl.lsp ++++ gcl-2.6.12/xgcl-2/gcl_init_xgcl.lsp +@@ -36,8 +36,8 @@ + (progn (allocate 'cons 100) (allocate 'string 40) + (system:init-system) (gbc t) + (si::multiply-bignum-stack 25) +- (or lisp::*link-array* +- (setq lisp::*link-array* ++ (or si::*link-array* ++ (setq si::*link-array* + (make-array 500 :element-type 'fixnum :fill-pointer 0))) + (use-fast-links t) + (setq compiler::*cmpinclude* "") (load #"../cmpnew/cmpmain.lsp") (gbc t) (load #"../cmpnew/lfun_list.lsp") +--- gcl-2.6.12.orig/xgcl-2/makefile ++++ gcl-2.6.12/xgcl-2/makefile +@@ -4,10 +4,13 @@ + all: objects #docs + + objects: $(LISP) +- echo '(load "sysdef.lisp")(xlib::compile-xgcl)' | $(LISP) ++ echo '(load "sysdef.lisp")(load "sys-proclaim.lisp")(xlib::compile-xgcl)' | $(LISP) + + saved_xgcl: $(LISP) +- echo '(load "sysdef.lisp")(xlib::compile-xgcl)(xlib::save-xgcl "$@")' | $(LISP) ++ echo '(load "sysdef.lisp")(load "sys-proclaim.lisp")(xlib::compile-xgcl)(xlib::save-xgcl "$@")' | $(LISP) ++ ++sys-proclaim.lisp: ++ echo '(load "sysdef.lisp")(compiler::emit-fn t)(xlib::compile-xgcl)(compiler::make-all-proclaims "*.fn")' | $(LISP) + + docs: dwdoc/dwdoccontents.html dwdoc.pdf + +@@ -22,7 +25,7 @@ dwdoc.pdf: dwdoc.tex + + clean: + rm -f *.o *.data saved_* cmpinclude.h dwdoc.aux dwdoc.log gmon.out +- rm -f gcl*c gcl*h gcl*data gcl_xrecompile* user-init* ++ rm -f gcl*c gcl*h gcl*data gcl_xrecompile* user-init* *fn + + clean-docs: + rm -rf dwdoc dwdoc.pdf +--- /dev/null ++++ gcl-2.6.12/xgcl-2/package.lisp +@@ -0,0 +1 @@ ++(make-package :XLIB :use '(:lisp :system)) +--- /dev/null ++++ gcl-2.6.12/xgcl-2/sys-proclaim.lisp +@@ -0,0 +1,287 @@ ++ ++(COMMON-LISP::IN-PACKAGE "COMMON-LISP-USER") ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ XLIB::WINDOW-UNSET XLIB::WINDOW-GET-GEOMETRY ++ XLIB::WINDOW-SET-INVERT XLIB::WINDOW-FONT-INFO ++ XLIB::GET-ST-POINT XLIB::EDITMENU-YANK ++ XLIB::WINDOW-INIT-MOUSE-POLL XLIB::WINDOW-SET-XOR ++ XLIB::WINDOW-TOP-NEG-Y XLIB::WINDOW-LEFT ++ XLIB::WINDOW-QUERY-POINTER XLIB::TEXTMENU-DRAW ++ XLIB::EDITMENU-CARAT XLIB::EDITMENU-DRAW ++ XLIB::WINDOW-STD-LINE-ATTR XLIB::WINDOW-UNMAP ++ XLIB::WINDOW-QUERY-POINTER-B XLIB::WINDOW-BACKGROUND ++ XLIB::EDITMENU-DELETE XLIB::WINDOW-MOVE XLIB::DOWINDOWCOM ++ XLIB::WINDOW-SYNC XLIB::PICMENU-DRAW XLIB::WINDOW-MAP ++ XLIB::WINDOW-RESET-COLOR XLIB::EDITMENU-KILL ++ XLIB::BARMENU-DRAW XLIB::WINDOW-GET-GEOMETRY-B ++ XLIB::MENU-CLEAR XLIB::WINDOW-RESET XLIB::WINDOW-WFUNCTION ++ XLIB::MENU-DRAW XLIB::WINDOW-FOREGROUND XLIB::WINDOW-CLEAR ++ XLIB::EDITMENU-BACKSPACE XLIB::WINDOW-DRAW-BORDER ++ XLIB::LISP-STRING XLIB::WINDOW-SET-ERASE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ XLIB::OPEN-WINDOW)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ XLIB::WINDOW-GET-ELLIPSE XLIB::EDITMENU-SELECT ++ XLIB::WINDOW-SET-XCOLOR XLIB::TEXTMENU-SELECT ++ XLIB::PICMENU-SELECT XLIB::MAKECONT XLIB::WINDOW-GET-CIRCLE ++ XLIB::MENU XLIB::WINDOW-GET-REGION XLIB::TEXTMENU-SET-TEXT ++ XLIB::MENU-SELECT XLIB::BARMENU-SELECT ++ XLIB::PICMENU-CREATE-FROM-SPEC XLIB::PRINTINDEX ++ XLIB::EDITMENU-EDIT XLIB::MENU-CREATE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::BARMENU-UPDATE-VALUE XLIB::WINDOW-FONT-STRING-WIDTH ++ XLIB::MENU-FIND-ITEM-WIDTH XLIB::WINDOW-STRING-WIDTH ++ XLIB::PICMENU-BOX-ITEM XLIB::WINDOW-SET-FOREGROUND ++ XLIB::WINDOW-INVERTAREA XLIB::PICMENU-UNBOX-ITEM ++ XLIB::PICMENU-DRAW-NAMED-BUTTON XLIB::WINDOW-SET-CURSOR ++ XLIB::WINDOW-SET-LINE-WIDTH XLIB::PICMENU-DELETE-NAMED-BUTTON ++ XLIB::EDITMENU-ERASE XLIB::PICMENU-DRAW-BUTTON ++ XLIB::WINDOW-SET-BACKGROUND)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ XLIB::XINIT XLIB::WINDOW-SCREEN-HEIGHT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ XLIB::WINDOW-CIRCLE-RADIUS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-XOR-BOX-XY XLIB::WINDOW-DRAW-BOX-CORNERS ++ XLIB::WINDOW-DRAW-LINE-XY XLIB::WINDOW-DRAW-ARROW2-XY ++ XLIB::WINDOW-DRAW-ARROW-XY XLIB::WINDOW-DRAW-ELLIPSE-XY ++ XLIB::WINDOW-ERASE-BOX-XY XLIB::WINDOW-DRAW-BOX-XY ++ XLIB::WINDOW-DRAW-ARROWHEAD-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-COPY-AREA-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-PRETTYPRINTAT XLIB::MENU-UNBOX-ITEM ++ XLIB::WINDOW-PRINTAT XLIB::WINDOW-DRAW-CROSSHAIRS-XY ++ XLIB::WINDOW-MOVETO-XY XLIB::WINDOW-INVERT-AREA ++ XLIB::WINDOW-DRAW-DOT-XY XLIB::WINDOW-DRAW-CARAT ++ XLIB::WINDOW-ERASE-AREA XLIB::MENU-BOX-ITEM ++ XLIB::WINDOW-DRAW-CROSS-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-CIRCLE-XY XLIB::WINDOW-PRINT-LINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-PRETTYPRINTAT-XY XLIB::WINDOW-DRAW-CIRCLE-PT ++ XLIB::EDITMENU-DISPLAY XLIB::WINDOW-PRINTAT-XY ++ XLIB::WINDOW-PROCESS-CHAR-EVENT XLIB::MENU-DISPLAY-ITEM)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-ADJ-BOX-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-ARC-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-ELLIPSE-PT XLIB::WINDOW-ERASE-AREA-XY ++ XLIB::WINDOW-INVERT-AREA-XY XLIB::WINDOW-DRAW-VECTOR-PT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-LINE XLIB::WINDOW-DRAW-BOX ++ XLIB::WINDOW-DRAW-CIRCLE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-RCBOX-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-LATEX-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-SET-LINE-ATTR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ XLIB::WINDOW-DRAW-BOX-LINE-XY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ XLIB::WINDOW-POSITIVE-Y XLIB::WINDOW-STRING-EXTENTS ++ XLIB::MENU-CHOOSE XLIB::WINDOW-SET-FONT XLIB::PUSHFONT ++ XLIB::WINDOW-STRING-HEIGHT XLIB::WORDLIST< ++ XLIB::EDITMENU-LINE-Y XLIB::MENU-ITEM-Y ++ XLIB::MENU-FIND-ITEM-HEIGHT XLIB::XFERCHARS ++ XLIB::WINDOW-CENTEROFFSET XLIB::MENU-FIND-ITEM-Y ++ XLIB::EDITMENU-CHAR XLIB::MENU-ITEM-VALUE ++ XLIB::MENU-FIND-ITEM)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ XLIB::WINDOW-FREE-COLOR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ XLIB::SEARCHFORALPHA XLIB::SAFE-CHAR XLIB::WINDOW-XINIT ++ XLIB::WINDOW-MENU XLIB::WINDOW-INIT-KEYMAP XLIB::PARSE-INT ++ XLIB::WINDOW-DESTROY-SELECTED-WINDOW ++ XLIB::WINDOW-GET-MOUSE-POSITION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) ++ XLIB::FLUSHLINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ XLIB::PICMENU-BUTTON-CONTAINSXY? XLIB::MENU-MOVETO-XY ++ XLIB::WINDOW-GET-BOX-SIZE XLIB::PRINTINDEXN ++ XLIB::WINDOW-GET-LINE-POSITION ++ XLIB::PICMENU-SET-NAMED-BUTTON-COLOR XLIB::EDITMENU-SETXY ++ XLIB::MENU-SELECT-B XLIB::MENU-REPOSITION-LINE ++ XLIB::WINDOW-GET-VECTOR-END)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ XLIB::WINDOW-CREATE XLIB::WINDOW-TRACK-MOUSE ++ XLIB::PICMENU-ITEM-POSITION XLIB::WINDOW-GET-CHARS ++ XLIB::TEXTMENU-CREATE XLIB::EDITMENU-CREATE XLIB::TOHTML ++ XLIB::WINDOW-SET-COLOR XLIB::MENU-ITEM-POSITION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ XLIB::WINDOW-INPUT-STRING XLIB::PICMENU-CREATE-SPEC ++ XLIB::WINDOW-SET-COLOR-RGB XLIB::WINDOW-PRINT-LINES ++ XLIB::PICMENU-CREATE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ XLIB::WINDOW-GET-ICON-POSITION XLIB::BARMENU-CREATE ++ XLIB::WINDOW-GET-LATEX-POSITION XLIB::WINDOW-GET-BOX-POSITION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ XLIB::WINDOW-EDIT XLIB::WINDOW-TRACK-MOUSE-IN-REGION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ XLIB::WINDOW-ADJUST-BOX-SIDE XLIB::EDITMENU-EDIT-FN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ XLIB::WINDOW-GET-BOX-LINE-POSITION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ XLIB::WINDOW-DESTROY XLIB::EDITMENU-CALCULATE-SIZE ++ XLIB::STRINGIFY XLIB::DOLINE XLIB::PUSHENV ++ XLIB::WINDOW-POLL-MOUSE XLIB::WINDOW-FONT XLIB::WINDOW-SIZE ++ XLIB::EDITMENU-END XLIB::WINDOW-PAINT XLIB::WINDOW-GEOMETRY ++ XLIB::MENU-DESTROY XLIB::WINDOW-LABEL ++ XLIB::PICMENU-CALCULATE-SIZE XLIB::POPENV XLIB::WINDOW-PARENT ++ XLIB::WINDOW-WAIT-UNMAP XLIB::EDITMENU-INIT ++ XLIB::WINDOW-GET-POINT XLIB::MENU-SELECT! ++ XLIB::MENU-CALCULATE-SIZE XLIB::BARMENU-INIT XLIB::DOCOMMAND ++ XLIB::MENU-INIT XLIB::WINDOW-OPEN XLIB::EDITMENU-META-B ++ XLIB::WINDOW-GET-RAW-CHAR XLIB::WINDOW-DRAWABLE-HEIGHT ++ XLIB::MENU-REPOSITION XLIB::WINDOW-YPOSITION ++ XLIB::EDITMENU-ALPHANUMBERICP XLIB::EDITMENU-NEXT ++ XLIB::MENU-SIZE XLIB::EDITMENU-PREVIOUS XLIB::EDITMENU-FORWARD ++ XLIB::EDITMENU-BEGINNING XLIB::PICMENU-DESTROY ++ XLIB::WINDOW-RESET-GEOMETRY XLIB::WINDOW-GCONTEXT ++ XLIB::EDITMENU-BACKWARD XLIB::TERMLINE ++ XLIB::WINDOW-DRAWABLE-WIDTH XLIB::WINDOW-GET-CROSSHAIRS ++ XLIB::BARMENU-CALCULATE-SIZE XLIB::WINDOW-CHAR-DECODE ++ XLIB::DOTABULAR XLIB::PICMENU-INIT XLIB::WINDOW-WAIT-EXPOSURE ++ XLIB::PARSE-WORD XLIB::TEXTMENU-INIT XLIB::SEARCHFOR ++ XLIB::MENU-OFFSET XLIB::MENU-ADJUST-OFFSET ++ XLIB::WINDOW-SET-COPY XLIB::TEXTMENU-CALCULATE-SIZE ++ XLIB::WINDOW-GET-CROSS XLIB::EDITMENU-META-F ++ XLIB::WINDOW-GET-CLICK XLIB::EDITMENU-CURRENT-CHAR ++ XLIB::DOHTML XLIB::WINDOW-CLOSE XLIB::EDITMENU-RETURN ++ XLIB::WINDOW-CODE-CHAR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ XLIB::WINDOW-FORCE-OUTPUT)) +\ No newline at end of file +--- gcl-2.6.12.orig/xgcl-2/sysdef.lisp ++++ gcl-2.6.12/xgcl-2/sysdef.lisp +@@ -19,9 +19,8 @@ + ; Some of the files that interface to the Xlib are adapted from DEC/MIT files. + ; See the file dec.copyright for details. + +-(make-package :XLIB) ++(load "package.lisp") + (in-package :XLIB) +-(sys::use-package '(:lisp :system :sys)) + + (defvar *files* '( "gcl_Xlib" + "gcl_Xutil" diff --git a/debian/patches/Version_2_6_13pre100 b/debian/patches/Version_2_6_13pre100 new file mode 100644 index 0000000..672fea6 --- /dev/null +++ b/debian/patches/Version_2_6_13pre100 @@ -0,0 +1,471 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-103) unstable; urgency=medium + . + * Bug fix: "Fails to install in unstable", thanks to Samuel Thibault + (Closes: #993480). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/993480 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-10-10 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -761,6 +761,7 @@ enable_gprof + enable_dynsysgmp + with_x + enable_xdr ++enable_cstackmax + enable_immfix + enable_fastimmfix + enable_ansi +@@ -1429,6 +1430,7 @@ Optional Features: + --enable-gprof builds gcl with -pg in CFLAGS to enable profiling with gprof + --enable-dynsysgmp will link against the system libgmp3 overriding certain functions with patched versions from the local source + --enable-xdr=yes will compile in support for XDR ++ --enable-cstackmax=xxxx will ensure that the cstack begins below xxxx or fail + --enable-immfix will enable an immediate fixnum table above the C stack + --enable-fastimmfix=XXXX will reject low immediate fixnums unless 2^XXX can be attained + --enable-ansi builds a large gcl aiming for ansi compliance +@@ -4186,11 +4188,14 @@ case $use in + ia64*) + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; +- armhf*) +- assert_arg_to_cflags -fdollars-in-identifiers +- assert_arg_to_cflags -g #? +- ;; + arm*) ++ ++$as_echo "#define SET_STACK_POINTER \"mov %%sp,%0\\n\\t\"" >>confdefs.h ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to set stack pointer" >&5 ++$as_echo_n "checking how to set stack pointer... " >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 ++$as_echo "done" >&6; } + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +@@ -6673,24 +6678,12 @@ else + + #include + #include +- +- unsigned long w; +- +- void +- foo(void) { +- int i; +- w=(unsigned long)&i; +- } +- +- int +- main(int argc,char **argv,char **envp) { +- void *b; ++ int main(int argc,char **argv,char **envp) { + FILE *fp = fopen("conftest1","w"); + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" + #endif +- foo(); +- fprintf(fp,"%d",((unsigned long) &b) > w ? -1 : 1); ++ fprintf(fp,"%d",(alloca(sizeof(void *))>alloca(sizeof(void *))) ? -1 : 1); + fclose(fp); + return 0; + } +@@ -6712,6 +6705,62 @@ _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_direction" >&5 + $as_echo "$cstack_direction" >&6; } + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking finding CSTACK_ALIGNMENT" >&5 ++$as_echo_n "checking finding CSTACK_ALIGNMENT... " >&6; } ++if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ #include ++ int main(int argc,char **argv,char **envp) { ++ void *b,*c; ++ FILE *fp = fopen("conftest1","w"); ++ long n; ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ b=alloca(sizeof(b)); ++ c=alloca(sizeof(c)); ++ n=b>c ? b-c : c-b; ++ n=n>sizeof(c) ? n : 1; ++ fprintf(fp,"%ld",n); ++ fclose(fp); ++ return 0; ++ } ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ cstack_alignment=`cat conftest1` ++else ++ cstack_alignment=0 ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define CSTACK_ALIGNMENT $cstack_alignment ++_ACEOF ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_alignment" >&5 ++$as_echo "$cstack_alignment" >&6; } ++ ++# Check whether --enable-cstackmax was given. ++if test "${enable_cstackmax+set}" = set; then : ++ enableval=$enable_cstackmax; if test "$enableval" != "" ; then ++cat >>confdefs.h <<_ACEOF ++#define CSTACKMAX $enableval ++_ACEOF ++ fi ++fi ++ ++ + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_ADDRESS" >&5 + $as_echo_n "checking CSTACK_ADDRESS... " >&6; } +@@ -6728,7 +6777,6 @@ else + #include + int + main(int argc,char **argv,char **envp) { +- void *v ; + FILE *fp = fopen("conftest1","w"); + unsigned long i,j; + +@@ -6738,7 +6786,7 @@ else + j=1; + j<<=$PAGEWIDTH; + j<<=16; +- i=(unsigned long)&v; ++ i=(unsigned long)alloca(sizeof(void *)); + if ($cstack_direction==1) i-=j; + j--; + i+=j; +@@ -6856,52 +6904,6 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking finding CSTACK_ALIGNMENT" >&5 +-$as_echo_n "checking finding CSTACK_ALIGNMENT... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run test program while cross compiling +-See \`config.log' for more details" "$LINENO" 5; } +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- void *b,*c; +- FILE *fp = fopen("conftest1","w"); +- long n; +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- b=alloca(sizeof(b)); +- c=alloca(sizeof(c)); +- n=b>c ? b-c : c-b; +- n=n>sizeof(c) ? n : 1; +- fprintf(fp,"%ld",n); +- fclose(fp); +- return 0; +- } +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- cstack_alignment=`cat conftest1` +-else +- cstack_alignment=0 +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +- +-cat >>confdefs.h <<_ACEOF +-#define CSTACK_ALIGNMENT $cstack_alignment +-_ACEOF +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_alignment" >&5 +-$as_echo "$cstack_alignment" >&6; } +- + # Check whether --enable-immfix was given. + if test "${enable_immfix+set}" = set; then : + enableval=$enable_immfix; +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -393,11 +393,10 @@ case $use in + ia64*) + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; +- armhf*) +- assert_arg_to_cflags -fdollars-in-identifiers +- assert_arg_to_cflags -g #? +- ;; + arm*) ++ AC_DEFINE([SET_STACK_POINTER],["mov %%sp,%0\n\t"],[asm string to set the stack pointer]) ++ AC_MSG_CHECKING([how to set stack pointer]) ++ AC_MSG_RESULT([done]) + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +@@ -1196,24 +1195,12 @@ AC_RUN_IFELSE( + [[ + #include + #include +- +- unsigned long w; +- +- void +- foo(void) { +- int i; +- w=(unsigned long)&i; +- } +- +- int +- main(int argc,char **argv,char **envp) { +- void *b; ++ int main(int argc,char **argv,char **envp) { + FILE *fp = fopen("conftest1","w"); + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" + #endif +- foo(); +- fprintf(fp,"%d",((unsigned long) &b) > w ? -1 : 1); ++ fprintf(fp,"%d",(alloca(sizeof(void *))>alloca(sizeof(void *))) ? -1 : 1); + fclose(fp); + return 0; + }]])], +@@ -1221,6 +1208,34 @@ AC_RUN_IFELSE( + AC_DEFINE_UNQUOTED(CSTACK_DIRECTION,$cstack_direction,[whether C stack grows up or down]) + AC_MSG_RESULT($cstack_direction) + ++AC_MSG_CHECKING([finding CSTACK_ALIGNMENT]) ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ int main(int argc,char **argv,char **envp) { ++ void *b,*c; ++ FILE *fp = fopen("conftest1","w"); ++ long n; ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ b=alloca(sizeof(b)); ++ c=alloca(sizeof(c)); ++ n=b>c ? b-c : c-b; ++ n=n>sizeof(c) ? n : 1; ++ fprintf(fp,"%ld",n); ++ fclose(fp); ++ return 0; ++ }]])], ++ [cstack_alignment=`cat conftest1`],[cstack_alignment=0]) ++AC_DEFINE_UNQUOTED(CSTACK_ALIGNMENT,$cstack_alignment,[C stack alignment]) ++AC_MSG_RESULT($cstack_alignment) ++ ++AC_ARG_ENABLE([cstackmax],[ --enable-cstackmax=xxxx will ensure that the cstack begins below xxxx or fail], ++ [if test "$enableval" != "" ; then AC_DEFINE_UNQUOTED([CSTACKMAX],$enableval,[cstack max]) fi]) ++ + + AC_MSG_CHECKING(CSTACK_ADDRESS) + AC_RUN_IFELSE( +@@ -1230,7 +1245,6 @@ AC_RUN_IFELSE( + #include + int + main(int argc,char **argv,char **envp) { +- void *v ; + FILE *fp = fopen("conftest1","w"); + unsigned long i,j; + +@@ -1240,7 +1254,7 @@ AC_RUN_IFELSE( + j=1; + j<<=$PAGEWIDTH; + j<<=16; +- i=(unsigned long)&v; ++ i=(unsigned long)alloca(sizeof(void *)); + if ($cstack_direction==1) i-=j; + j--; + i+=j; +@@ -1304,31 +1318,6 @@ AC_RUN_IFELSE( + [AC_MSG_RESULT(no) + neg_cstack_address=0]) + +-AC_MSG_CHECKING([finding CSTACK_ALIGNMENT]) +-AC_RUN_IFELSE( +- [AC_LANG_SOURCE( +- [[ +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- void *b,*c; +- FILE *fp = fopen("conftest1","w"); +- long n; +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- b=alloca(sizeof(b)); +- c=alloca(sizeof(c)); +- n=b>c ? b-c : c-b; +- n=n>sizeof(c) ? n : 1; +- fprintf(fp,"%ld",n); +- fclose(fp); +- return 0; +- }]])], +- [cstack_alignment=`cat conftest1`],[cstack_alignment=0]) +-AC_DEFINE_UNQUOTED(CSTACK_ALIGNMENT,$cstack_alignment,[C stack alignment]) +-AC_MSG_RESULT($cstack_alignment) +- + AC_ARG_ENABLE([immfix],[ --enable-immfix will enable an immediate fixnum table above the C stack]) + + AC_ARG_ENABLE([fastimmfix],[ --enable-fastimmfix=XXXX will reject low immediate fixnums unless 2^XXX can be attained],,[enable_fastimmfix=64]) +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -272,12 +272,7 @@ object macro_expand(); + + /* main.c */ + EXTER char* system_directory; +-EXTER int ARGC; +-EXTER char **ARGV; + void error(); +-#ifdef UNIX +-EXTER char **ENVP; +-#endif + object vs_overflow(void); + + EXTER object sSAsystem_directoryA; +--- gcl-2.6.12.orig/h/elf32_armhf_reloc.h ++++ gcl-2.6.12/h/elf32_armhf_reloc.h +@@ -4,7 +4,7 @@ + case R_ARM_THM_JUMP24: + { + long x=(long)(s+a-p); +- if (abs(x)&(~MASK(22))) { ++ if (abs(x)&(~MASK(23))) { + + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -26,6 +26,9 @@ + */ + #undef CRAY_STACKSEG_END + ++/* cstack max */ ++#undef CSTACKMAX ++ + /* starting C stack address */ + #undef CSTACK_ADDRESS + +@@ -336,6 +339,9 @@ + /* system pagewidth */ + #undef PAGEWIDTH + ++/* asm string to set the stack pointer */ ++#undef SET_STACK_POINTER ++ + /* have sigcontext of signal.h */ + #undef SIGNAL_H_HAS_SIGCONTEXT + +--- gcl-2.6.12.orig/h/unrandomize.h ++++ gcl-2.6.12/h/unrandomize.h +@@ -1,4 +1,5 @@ + #include ++#include + #include + #include + #include +@@ -61,5 +62,20 @@ + exit(-1); + } + } ++#if defined(CSTACKMAX) && CSTACK_DIRECTION < 0 ++ if ((void *)&argc > (void *)CSTACKMAX) { ++ if (mmap((void *)CSTACKMAX-(1L << PAGEWIDTH),(1L << PAGEWIDTH), ++ PROT_READ|PROT_WRITE|PROT_EXEC,MAP_FIXED|MAP_PRIVATE|MAP_ANON|MAP_STACK|MAP_GROWSDOWN,-1,0)==(void *)-1) { ++ printf("cannot mmap new stack %d\n",errno); ++ exit(-1); ++ } ++#ifdef SET_STACK_POINTER ++ {void *p=(void *)CSTACKMAX-4*CSTACK_ALIGNMENT;asm volatile (SET_STACK_POINTER::"r" (p):"memory");} ++#else ++#error Cannot set stack pointer ++#endif ++ } ++#endif ++ + } + } +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -503,6 +503,9 @@ which(const char *n,char *o) { + + #endif + ++static int ARGC; ++static char **ARGV; ++ + int + main(int argc, char **argv, char **envp) { + +@@ -515,7 +518,7 @@ main(int argc, char **argv, char **envp) + #include "unrandomize.h" + #endif + +- gcl_init_alloc(&argv); ++ gcl_init_alloc(alloca(1)); + + setbuf(stdin, stdin_buf); + setbuf(stdout, stdout_buf); +@@ -527,7 +530,6 @@ main(int argc, char **argv, char **envp) + #endif + ARGC = argc; + ARGV = argv; +- ENVP = envp; + + vs_top = vs_base = vs_org; + ihs_top = ihs_org-1; +@@ -539,9 +541,9 @@ main(int argc, char **argv, char **envp) + printf("GCL (GNU Common Lisp) %s %ld pages\n",LISP_IMPLEMENTATION_VERSION,real_maxpage); + fflush(stdout); + +- if (argc>1) { +- massert(argv[1][strlen(argv[1])-1]=='/'); +- system_directory=argv[1]; ++ if (ARGC>1) { ++ massert(ARGV[1][strlen(ARGV[1])-1]=='/'); ++ system_directory=ARGV[1]; + } + + initlisp(); diff --git a/debian/patches/Version_2_6_13pre101 b/debian/patches/Version_2_6_13pre101 new file mode 100644 index 0000000..1672d3f --- /dev/null +++ b/debian/patches/Version_2_6_13pre101 @@ -0,0 +1,87 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-104) unstable; urgency=medium + . + * Version_2.6.13pre100 + * standardize cstack start address on 32bit arm +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-10-10 + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -299,7 +299,7 @@ char FN1[PATH_MAX],FN2[PATH_MAX],FN3[PAT + #define coerce_to_filename(a_,b_) coerce_to_filename1(a_,b_,sizeof(b_)) + + #include +-#define massert(a_) ({errno=0;if (!(a_)||errno) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__);}) ++#define massert(a_) ({errno=0;if (!(a_)) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__);}) + + extern bool writable_malloc; + #define writable_malloc_wrap(f_,rt_,a_...) ({rt_ v;bool w=writable_malloc;writable_malloc=1;v=f_(a_);writable_malloc=w;v;}) +--- gcl-2.6.12.orig/lsp/gcl_directory.lsp ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -71,7 +71,7 @@ + (setq *current-directory* (current-directory-pathname)))) + + (defun which (s) +- (let ((r (with-open-file (s (apply 'string-concatenate "|" #-winnt "which " ++ (let ((r (with-open-file (s (apply 'string-concatenate "|" #-winnt "command -v " + #+winnt "for %i in (" s #+winnt ".exe) do @echo.%~$PATH:i" nil)) + (read-line s nil 'eof)))) + (unless (eq r 'eof) +--- gcl-2.6.12.orig/o/cmpaux.c ++++ gcl-2.6.12/o/cmpaux.c +@@ -560,3 +560,8 @@ DEFUN_NEW("FIND-INIT-NAME", object, fSfi + + } + ++DEFUN_NEW("SEEK-TO-END-OFILE",object,fSseek_to_end_ofile,SI,1,1,NONE,OO,OO,OO,OO,(object sm),"") { ++ check_type_stream(&sm); ++ SEEK_TO_END_OFILE(sm->sm.sm_fp); ++ RETURN1(sm); ++} +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -449,12 +449,21 @@ gcl_cleanup(int gc) { + /*gcc boolean expression tail position bug*/ + static char *stack_to_be_allocated; + +-void +-get_stack_to_be_allocated(unsigned long size) { +- stack_to_be_allocated=alloca(size); +- memset(stack_to_be_allocated,0,size); ++int ++stack_ret(char *s,unsigned long size) { ++ int r,i; ++ for (i=r=0;i + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-105) unstable; urgency=medium + . + * Version_2.6.13pre101 + * Bug fix: "fails to start with glibc 2.33", thanks to Andreas Kloeckner + (Closes: #995323). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/995323 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-11-04 + +--- gcl-2.6.12.orig/h/elf64_s390_reloc.h ++++ gcl-2.6.12/h/elf64_s390_reloc.h +@@ -8,5 +8,6 @@ + add_ivals((int *)where,MASK(32),s+a-p); + break; + case R_390_PC32DBL: ++ case R_390_PLT32DBL:/*FIXME think about this*/ + add_ivals((int *)where,MASK(32),(s+a-p)>>1); + break; +--- gcl-2.6.12.orig/o/number.c ++++ gcl-2.6.12/o/number.c +@@ -63,10 +63,21 @@ object small_fixnum ( int i ) { + struct {int min,max;} bigger_fixnums; + + struct fixnum_struct *bigger_fixnum_table; ++#if !defined(IM_FIX_BASE) || defined(USE_SAFE_CDR) ++#define STATIC_BIGGER_FIXNUM_TABLE_BITS 10 ++static struct fixnum_struct bigger_fixnum_table1[1<<(STATIC_BIGGER_FIXNUM_TABLE_BITS+1)]; ++#endif ++ + DEFUN_NEW("ALLOCATE-BIGGER-FIXNUM-RANGE",object,fSallocate_bigger_fixnum_range,SI,2,2,NONE,OI,IO,OO,OO,(fixnum min,fixnum max),"") { + int j; + if (min > max) FEerror("Need Min <= Max",0); +- bigger_fixnum_table=(void *)malloc(sizeof(struct fixnum_struct)*(max - min)); ++ ++#if !defined(IM_FIX_BASE) || defined(USE_SAFE_CDR) ++ if (min==-(1< + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-107) unstable; urgency=medium + . + * Version_2.6.13pre103 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-11-09 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -7954,6 +7954,48 @@ if test "x$ac_cv_lib_readline_rl_initial + + $as_echo "#define USE_READLINE 1" >>confdefs.h + ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for el_getc in -lreadline" >&5 ++$as_echo_n "checking for el_getc in -lreadline... " >&6; } ++if ${ac_cv_lib_readline_el_getc+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lreadline $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char el_getc (); ++int ++main () ++{ ++return el_getc (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_readline_el_getc=yes ++else ++ ac_cv_lib_readline_el_getc=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_el_getc" >&5 ++$as_echo "$ac_cv_lib_readline_el_getc" >&6; } ++if test "x$ac_cv_lib_readline_el_getc" = xyes; then : ++ ++$as_echo "#define READLINE_IS_EDITLINE 1" >>confdefs.h ++ ++fi ++ + # These tests discover differences between readline 4.1 and 4.3 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 + $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1707,7 +1707,8 @@ fi + if test "$enable_readline" != "no" ; then + AC_CHECK_HEADERS([readline/readline.h], + AC_CHECK_LIB([readline],[rl_initialize], +- [AC_DEFINE(USE_READLINE,1,[use readline library]) ++ [AC_DEFINE(USE_READLINE,1,[use readline library]) ++ AC_CHECK_LIB([readline],[el_getc],AC_DEFINE(READLINE_IS_EDITLINE,1,[readline is editline])) + # These tests discover differences between readline 4.1 and 4.3 + AC_CHECK_LIB([readline],[rl_completion_matches], + [AC_DEFINE(HAVE_DECL_RL_COMPLETION_MATCHES,1,[have readline completion matches]) +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -339,6 +339,9 @@ + /* system pagewidth */ + #undef PAGEWIDTH + ++/* readline is editline */ ++#undef READLINE_IS_EDITLINE ++ + /* asm string to set the stack pointer */ + #undef SET_STACK_POINTER + +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -148,6 +148,8 @@ Icall_gen_error_handler(object ci,object + + IapplyVector(sSuniversal_error_handler,n,b); + ++ while (1); ++ + } + + /* +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -1201,8 +1201,12 @@ init_main(void) { + #endif + + #ifdef USE_READLINE ++#ifdef READLINE_IS_EDITLINE ++ ADD_FEATURE("EDITLINE"); ++#else + ADD_FEATURE("READLINE"); + #endif ++#endif + #if !defined(USE_DLOPEN) + ADD_FEATURE("NATIVE-RELOC"); + #if defined(HAVE_LIBBFD) +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -8,7 +8,12 @@ extern FILE *stderr __attribute__((weak) + extern FILE *stdout __attribute__((weak)); + + #ifdef USE_READLINE +-#if RL_READLINE_VERSION < 0x0600 ++#ifdef READLINE_IS_EDITLINE ++#define MY_RL_VERSION 0x0600 ++#else ++#define MY_RL_VERSION RL_READLINE_VERSION ++#endif ++#if MY_RL_VERSION < 0x0600 + extern Function *rl_completion_entry_function __attribute__((weak)); + extern char *rl_readline_name __attribute__((weak)); + #else diff --git a/debian/patches/Version_2_6_13pre119 b/debian/patches/Version_2_6_13pre119 new file mode 100644 index 0000000..a9146cc --- /dev/null +++ b/debian/patches/Version_2_6_13pre119 @@ -0,0 +1,58 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-119) unstable; urgency=medium + . + * Version_2.6.13pre119 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-07-31 + +--- gcl-2.6.12.orig/h/alpha-linux.h ++++ gcl-2.6.12/h/alpha-linux.h +@@ -20,3 +20,5 @@ + #define imb() __asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory") + #define CLEAR_CACHE imb() + ++/*FIXME probe broken in recent kernels, no access*/ ++#define DEFINED_REAL_MAXPAGE (1UL<<18) /*FIXME brk probe broken*/ +--- gcl-2.6.12.orig/xgcl-2/sysdef.lisp ++++ gcl-2.6.12/xgcl-2/sysdef.lisp +@@ -41,14 +41,18 @@ + + + (defun compile-xgcl() +- #+m68k(progn (trace si::readdir si::opendir si::closedir si::pathname-match-p) +- (print (directory "*.c")) +- (untrace si::readdir si::opendir si::closedir si::pathname-match-p)) ++ #+(or m68k sh4) ++ (progn (trace si::readdir si::opendir si::closedir si::pathname-match-p) ++ (print (directory "*.c")) ++ (untrace si::readdir si::opendir si::closedir si::pathname-match-p)) + (mapc (lambda (x) + (let ((x (concatenate 'string compiler::*cc* " -I../h " (namestring x)))) + (unless (zerop (system x)) + (error "compile failure: ~s~%" x)))) +- (directory "*.c")) ++ (or (directory "*.c") ++ #+(or m68k sh4) ++ (progn (print "qemu/readdir issue still present") ++ (mapcar (lambda (x) (truename (merge-pathnames ".c" x))) '("XStruct-4" "general-c" "Xutil-2" "Events" "XStruct-2"))))) + (mapc (lambda (x) + (compile-file (format nil "~a.lsp" x) :system-p t)) *files*)) + diff --git a/debian/patches/Version_2_6_13pre12 b/debian/patches/Version_2_6_13pre12 new file mode 100644 index 0000000..8d55df8 --- /dev/null +++ b/debian/patches/Version_2_6_13pre12 @@ -0,0 +1,1168 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-10) unstable; urgency=medium + . + * rebuild in clean sid environment +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/bin/dpp.c ++++ gcl-2.6.12/bin/dpp.c +@@ -430,7 +430,8 @@ put_declaration() + { + int i; + +- fprintf(out, "\tint narg;\n"); ++ if (nopt || rest_flag || key_flag) ++ fprintf(out, "\tint narg;\n"); + fprintf(out, "\tregister object *DPPbase=vs_base;\n"); + + for (i = 0; i < nopt; i++) +@@ -453,12 +454,12 @@ put_declaration() + fprintf(out, "#define\t%s\tDPPbase[%d+%d+2*%d+%d]\n", + aux[i].a_var, nreq, nopt, nkey, i); + fprintf(out, "\n"); +- fprintf(out, "\tnarg = vs_top - vs_base;\n"); + if (nopt == 0 && !rest_flag && !key_flag) + fprintf(out, "\tcheck_arg(%d);\n", nreq); + else { +- fprintf(out, "\tif (narg < %d)\n", nreq); +- fprintf(out, "\t\ttoo_few_arguments();\n"); ++ fprintf(out, "\tnarg = vs_top - vs_base;\n"); ++ fprintf(out, "\tif (narg < %d)\n", nreq); ++ fprintf(out, "\t\ttoo_few_arguments();\n"); + } + for (i = 0; i < nopt; i++) + if (optional[i].o_svar != NULL) { +--- gcl-2.6.12.orig/cmpnew/gcl_cmpfun.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpfun.lsp +@@ -976,9 +976,13 @@ + (wt-nl "}}") + (wt-nl "vs_top=(vs_base=base+" base ")+" (- *vs* base) ";") + (unwind-exit 'fun-val nil (cons 'values 2)))) +- ((unwind-exit (get-inline-loc `((t t) t #.(flags rfa) +- ,(concatenate 'string +- "({struct htent *_z=gethash" +- (if *safe-compile* "_with_check" "") +- "(#0,#1);_z->hte_key==OBJNULL ? (#2) : _z->hte_value;})")) +- args))))) ++ ((let ((*inline-blocks* 0) ++ (*restore-avma* *restore-avma*) ++ (fd `((t t) t #.(flags rfa) ++ ,(concatenate 'string ++ "({struct htent *_z=gethash" ++ (if *safe-compile* "_with_check" "") ++ "(#0,#1);_z->hte_key==OBJNULL ? (#2) : _z->hte_value;})")))) ++ (save-avma fd) ++ (unwind-exit (get-inline-loc fd args)) ++ (close-inline-blocks))))) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptag.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptag.lsp +@@ -62,6 +62,7 @@ + ((and (eq (car clause) 'go) + (tag-p (setq tem (cadddr (cdr clause)))) + (eq (tag-name tem) tag-name))) ++ ((eq (car clause) 'location) nil) + (t (or (jumps-to-p (car clause) tag-name) + (jumps-to-p (cdr clause) tag-name))))) + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4171,18 +4171,52 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + #fi + # subst GCC not only under 386-linux, but where available -- CM + ++TCFLAGS="-fsigned-char" ++ + if test "$GCC" = "yes" ; then + +- TCFLAGS="-Wall -fsigned-char" ++ TCFLAGS="$TCFLAGS -Wall" + +- #FIXME -Wno-unused-but-set-variable when time +- TMPF=-Wno-unused-but-set-variable +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAG $TMPF" >&5 +-$as_echo_n "checking for CFLAG $TMPF... " >&6; } +- CFLAGS_ORI=$CFLAGS +- CFLAGS="$CFLAGS $TMPF" ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 ++$as_echo_n "checking for clang... " >&6; } + + if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ ++ int main() { ++ return ++ #ifdef __clang__ ++ 0 ++ #else ++ 1 ++ #endif ++ ;} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ clang="yes" ++ TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body" ++ ++$as_echo "#define CLANG 1" >>confdefs.h ++ ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ #FIXME -Wno-unused-but-set-variable when time ++ TMPF=-Wno-unused-but-set-variable ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAG $TMPF" >&5 ++$as_echo_n "checking for CFLAG $TMPF... " >&6; } ++ CFLAGS_ORI=$CFLAGS ++ CFLAGS="$CFLAGS $TMPF" ++ if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + else +@@ -4201,11 +4235,14 @@ rm -f core *.core core.conftest.* gmon.o + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- CFLAGS=$CFLAGS_ORI ++ CFLAGS=$CFLAGS_ORI ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi + +-else +- TCFLAGS="-fsigned-char" + fi ++ + if test "$GCC" = "yes" ; then + TCFLAGS="$TCFLAGS -pipe" + case $use in +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -483,21 +483,37 @@ AC_SUBST(CC) + #fi + # subst GCC not only under 386-linux, but where available -- CM + +-if test "$GCC" = "yes" ; then ++TCFLAGS="-fsigned-char" + +- TCFLAGS="-Wall -fsigned-char" ++if test "$GCC" = "yes" ; then + +- #FIXME -Wno-unused-but-set-variable when time +- TMPF=-Wno-unused-but-set-variable +- AC_MSG_CHECKING([for CFLAG $TMPF]) +- CFLAGS_ORI=$CFLAGS +- CFLAGS="$CFLAGS $TMPF" +- AC_TRY_RUN([int main() {return 0;}],TCFLAGS="$TCFLAGS $TMPF";AC_MSG_RESULT(yes),AC_MSG_RESULT(no),AC_MSG_RESULT(no)) +- CFLAGS=$CFLAGS_ORI ++ TCFLAGS="$TCFLAGS -Wall" + +-else +- TCFLAGS="-fsigned-char" ++ AC_MSG_CHECKING([for clang]) ++ AC_RUN_IFELSE([ ++ AC_LANG_SOURCE([[ ++ int main() { ++ return ++ #ifdef __clang__ ++ 0 ++ #else ++ 1 ++ #endif ++ ;}]])], ++ [AC_MSG_RESULT([yes]) ++ clang="yes" ++ TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body" ++ AC_DEFINE([CLANG],[1],[running clang compiler])], ++ [AC_MSG_RESULT([no]) ++ #FIXME -Wno-unused-but-set-variable when time ++ TMPF=-Wno-unused-but-set-variable ++ AC_MSG_CHECKING([for CFLAG $TMPF]) ++ CFLAGS_ORI=$CFLAGS ++ CFLAGS="$CFLAGS $TMPF" ++ AC_TRY_RUN([int main() {return 0;}],TCFLAGS="$TCFLAGS $TMPF";AC_MSG_RESULT(yes),AC_MSG_RESULT(no),AC_MSG_RESULT(no)) ++ CFLAGS=$CFLAGS_ORI]) + fi ++ + if test "$GCC" = "yes" ; then + TCFLAGS="$TCFLAGS -pipe" + case $use in +--- gcl-2.6.12.orig/gcl-tk/comm.c ++++ gcl-2.6.12/gcl-tk/comm.c +@@ -183,7 +183,7 @@ int m; + { bcopy(sfd->valid_data,sfd->read_buffer,sfd->valid_data_size); + sfd->valid_data=sfd->read_buffer;} + /* there is at least a packet size of space available */ +- if ((fix(FFN(fScheck_fd_for_input)(sfd->fd,sfd->write_timeout))>0)); ++ if ((fix(FFN(fScheck_fd_for_input)(sfd->fd,sfd->write_timeout))>0)) + again: + {char *start = sfd->valid_data+sfd->valid_data_size; + nread = SAFE_READ(sfd->fd,start, +--- gcl-2.6.12.orig/gcl-tk/guis.c ++++ gcl-2.6.12/gcl-tk/guis.c +@@ -455,7 +455,7 @@ struct connection_state *sfd; + int tot; + struct message_header *msg; + msg = (struct message_header *) buf; +- m= read1(sfd,msg,MESSAGE_HEADER_SIZE,DEFAULT_TIMEOUT_FOR_TK_READ); ++ m= read1(sfd,(void *)msg,MESSAGE_HEADER_SIZE,DEFAULT_TIMEOUT_FOR_TK_READ); + if (m == MESSAGE_HEADER_SIZE) + { + if ( msg->magic1!=MAGIC1 +@@ -468,7 +468,7 @@ struct connection_state *sfd; + if (tot >= bufleng) + {msg = (void *)malloc(tot+1); + bcopy(buf,msg,MESSAGE_HEADER_SIZE);} +- m = read1(sfd,&(msg->body), ++ m = read1(sfd,(void *)&(msg->body), + body_length,DEFAULT_TIMEOUT_FOR_TK_READ); + if (m == body_length) + { return msg;}} +--- gcl-2.6.12.orig/h/compbas.h ++++ gcl-2.6.12/h/compbas.h +@@ -4,7 +4,7 @@ + #define EXTER extern + #endif + #ifndef INLINE +-#if defined(__GNUC__) && __GNUC__ <= 4 ++#if (defined(__GNUC__) && __GNUC__ <= 4) && !defined __clang__ + #define INLINE extern inline + #else + #define INLINE inline +--- gcl-2.6.12.orig/h/fixnum.h ++++ gcl-2.6.12/h/fixnum.h +@@ -13,7 +13,7 @@ + #define is_imm_fix(a_) INT_IN_BITS(a_,LOW_SHFT-1) + #elif defined (IM_FIX_BASE) && defined(IM_FIX_LIM) + #define make_imm_fixnum(a_) ((object)((a_)+(IM_FIX_BASE+(IM_FIX_LIM>>1)))) +-#define fix_imm_fixnum(a_) (((fixnum)(a_))-(IM_FIX_BASE+(IM_FIX_LIM>>1))) ++#define fix_imm_fixnum(a_) ((fixnum)(((fixnum)(a_))-(IM_FIX_BASE+(IM_FIX_LIM>>1)))) + #define mark_imm_fixnum(a_) ((a_)=((object)(((fixnum)(a_)) | IM_FIX_LIM))) + #define unmark_imm_fixnum(a_) ((a_)=((object)(((fixnum)(a_)) &~ IM_FIX_LIM))) + #define is_imm_fixnum(a_) (((ufixnum)(a_))>=IM_FIX_BASE) +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -9,9 +9,6 @@ + /* punt guess for no randomize value */ + #undef ADDR_NO_RANDOMIZE + +-/* compile ansi compliant image */ +-#undef ANSI_COMMON_LISP +- + /* binding stack size */ + #undef BDSSIZE + +@@ -21,6 +18,9 @@ + /* can prevent sbrk from returning random values */ + #undef CAN_UNRANDOMIZE_SBRK + ++/* running clang compiler */ ++#undef CLANG ++ + /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -342,7 +342,8 @@ EXTER long holepage; /* hole pages * + EXTER long new_holepage,starting_hole_div,starting_relb_heap_mult; + + +-EXTER char *rb_start; /* relblock start */ ++EXTER char *new_rb_start; /* desired relblock start after next gc */ ++EXTER char *rb_start; /* relblock start */ + EXTER char *rb_end; /* relblock end */ + EXTER char *rb_limit; /* relblock limit */ + EXTER char *rb_pointer; /* relblock pointer */ +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1946,3 +1946,12 @@ get_pageinfo(void *); + + void + add_page_to_freelist(char *, struct typemanager *); ++ ++ufixnum ++sum_maxpages(void); ++ ++void ++resize_hole(ufixnum,enum type); ++ ++void ++setup_rb(void); +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -325,14 +325,29 @@ empty_relblock(void) { + + } + +-static inline void ++void ++setup_rb(void) { ++ ++ int init=new_rb_start!=rb_start || rb_pointer>=rb_end; ++ ++ rb_start=new_rb_start; ++ rb_end=rb_start+(nrbpage<>PAGEWIDTH))); ++ ++} ++ ++void + resize_hole(ufixnum hp,enum type tp) { + +- char *new_start=heap_end+hp*PAGESIZE; + char *start=rb_pointer=start) || (new_start=start+size)) { ++ new_rb_start=heap_end+hp*PAGESIZE; ++ ++ if ((new_rb_start=start) || (new_rb_start=start+size)) { + fprintf(stderr,"Toggling relblock when resizing hole to %lu\n",hp); + fflush(stderr); + tm_table[t_relocatable].tm_adjgbccnt--; +@@ -340,9 +355,11 @@ resize_hole(ufixnum hp,enum type tp) { + return resize_hole(hp,tp); + } + +- holepage=hp; +- tm_of(tp)->tm_adjgbccnt--; +- GBC(tp); ++ if (size) { ++ tm_of(tp)->tm_adjgbccnt--; ++ GBC(tp); ++ } else ++ setup_rb(); + + } + +@@ -355,7 +372,7 @@ alloc_page(long n) { + + if (!s) { + +- if (nn>holepage) { ++ if (nn>((rb_start-heap_end)>>PAGEWIDTH)) { + + + fixnum d=available_pages-nn; +@@ -373,12 +390,11 @@ alloc_page(long n) { + e=heap_end; + v=e+nn*PAGESIZE; + +- if (!s) { ++ if (!s) + +- holepage -= nn; + heap_end=v; + +- } else if (v>(void *)core_end) { ++ else if (v>(void *)core_end) { + + massert(!mbrk(v)); + core_end=v; +@@ -395,7 +411,7 @@ alloc_page(long n) { + + struct pageinfo *cell_list_head=NULL,*cell_list_tail=NULL;; + +-static inline ufixnum ++ufixnum + sum_maxpages(void) { + + ufixnum i,j; +@@ -516,7 +532,7 @@ rebalance_maxpages(struct typemanager *m + k+=(tm_table[i].tm_maxpage-tm_table[i].tm_npage)*(i==t_relocatable ? 2 : 1); + + e=e>k ? k : e; +- if (e+phys_pages-j<=0) ++ if (e+phys_pages<=j) + return 0; + + f=k ? 1.0-(double)e/k : 1.0; +@@ -895,17 +911,20 @@ add_pages(struct typemanager *tm,fixnum + + case t_relocatable: + +- if (rb_pointer>rb_end) { ++ if (rb_pointer>rb_end && m>((rb_start-heap_end)>>PAGEWIDTH)) { + fprintf(stderr,"Moving relblock low before expanding relblock pages\n"); + fflush(stderr); + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } + nrbpage+=m; +- rb_end+=m*PAGESIZE; + rb_limit+=m*PAGESIZE; ++ if (rb_pointer>rb_end) ++ rb_start-=m*PAGESIZE; ++ else ++ rb_end+=m*PAGESIZE; + +- alloc_page(-(2*nrbpage+holepage)); ++ alloc_page(-(2*nrbpage+((rb_start-heap_end)>>PAGEWIDTH))); + + break; + +@@ -1116,7 +1135,7 @@ DEFUNM_NEW("ALLOCATED",object,fSallocate + { struct typemanager *tm=(&tm_table[t_from_type(typ)]); + tm = & tm_table[tm->tm_type]; + if (tm->tm_type == t_relocatable) +- { tm->tm_npage = (rb_end-rb_start)/PAGESIZE; ++ { tm->tm_npage = (rb_end-rb_start)>>PAGEWIDTH; + tm->tm_nfree = rb_limit -rb_pointer; + } + else if (tm->tm_type == t_contiguous) +@@ -1242,11 +1261,8 @@ object malloc_list=Cnil; + + void + maybe_set_hole_from_maxpages(void) { +- if (rb_start==heap_end && rb_end==rb_start && rb_limit==rb_start && rb_pointer==rb_start) { +- holepage=new_holepage; +- alloc_page(-holepage); +- rb_start=rb_end=rb_limit=rb_pointer=heap_end+(holepage<= (void*)baby_malloc_data && ptr - (void*)baby_malloc_data st.st_fillp = size; + return(ptr); + } else { +- j = x->st.st_dim; + x->st.st_self = alloc_contblock(size); + x->st.st_fillp = x->st.st_dim = size; + for (i = 0; i < size; i++) + x->st.st_self[i] = ((char *)ptr)[i]; +-/* SGC contblock pages: Its possible this is on an old page CM 20030827 */ +-/* #ifdef SGC */ +-/* insert_maybe_sgc_contblock(ptr, j); */ +-/* #else */ +-/* insert_contblock(ptr, j); */ +-/* #endif */ + return(x->st.st_self); + } + } +--- gcl-2.6.12.orig/o/assignment.c ++++ gcl-2.6.12/o/assignment.c +@@ -259,7 +259,7 @@ DEFUNO_NEW("FMAKUNBOUND",object,fLfmakun + static void + FFN(Fsetf)(object form) + { +- object result,*t,*t1; ++ object *t,*t1; + if (endp(form)) { + vs_base = vs_top; + vs_push(Cnil); +@@ -269,7 +269,7 @@ FFN(Fsetf)(object form) + vs_top = top; + if (endp(MMcdr(form))) + FEinvalid_form("No value for ~S.", form->c.c_car); +- result = setf(MMcar(form), MMcadr(form)); ++ setf(MMcar(form), MMcadr(form)); + form = MMcddr(form); + } while (!endp(form)); + t=vs_base; +--- gcl-2.6.12.orig/o/cfun.c ++++ gcl-2.6.12/o/cfun.c +@@ -343,7 +343,8 @@ turbo_closure(object fun) + + if(1)/*(fun->cc.cc_turbo==NULL)*/ + {BEGIN_NO_INTERRUPT; +- for (n = 0, l = fun->cc.cc_env; !endp(l); n++, l = l->c.c_cdr); ++ for (n = 0, l = fun->cc.cc_env; !endp(l); n++, l = l->c.c_cdr) ++ ; + { + block= AR_ALLOC(alloc_relblock,(1+n),object); + *block=make_fixnum(n); +--- gcl-2.6.12.orig/o/format.c ++++ gcl-2.6.12/o/format.c +@@ -170,6 +170,22 @@ object sSAindent_formatted_outputA; + fmt_string = old_fmt_string ; \ + fmt_paramp = old_fmt_paramp + ++#define fmt_old1 VOL object old_fmt_stream; \ ++ VOL int old_ctl_origin; \ ++ VOL int old_ctl_index; \ ++ VOL int old_ctl_end; \ ++ jmp_bufp VOL old_fmt_jmp_bufp; \ ++ VOL int old_fmt_indents; \ ++ VOL object old_fmt_string ; \ ++ VOL format_parameter *old_fmt_paramp ++#define fmt_save1 old_fmt_stream = fmt_stream; \ ++ old_ctl_origin = ctl_origin; \ ++ old_ctl_index = ctl_index; \ ++ old_ctl_end = ctl_end; \ ++ old_fmt_jmp_bufp = fmt_jmp_bufp; \ ++ old_fmt_indents = fmt_indents; \ ++ old_fmt_string = fmt_string ; \ ++ old_fmt_paramp = fmt_paramp + #define fmt_restore1 fmt_stream = old_fmt_stream; \ + ctl_origin = old_ctl_origin; \ + ctl_index = old_ctl_index; \ +@@ -1776,7 +1792,7 @@ fmt_case(bool colon, bool atsign) + { + VOL object x; + VOL int i, j; +- fmt_old; ++ fmt_old1; + jmp_buf fmt_jmp_buf0; + int up_colon; + bool b; +@@ -1787,7 +1803,7 @@ fmt_case(bool colon, bool atsign) + j = fmt_skip(); + if (ctl_string[--j] != ')' || ctl_string[--j] != '~') + fmt_error("~) expected"); +- fmt_save; ++ fmt_save1; + fmt_jmp_bufp = &fmt_jmp_buf0; + if ((up_colon = setjmp(*fmt_jmp_bufp))) + ; +@@ -1850,7 +1866,7 @@ fmt_conditional(bool colon, bool atsign) + object x; + int n=0; + bool done; +- fmt_old; ++ fmt_old1; + + fmt_not_colon_atsign(colon, atsign); + if (colon) { +@@ -1863,11 +1879,11 @@ fmt_conditional(bool colon, bool atsign) + if (ctl_string[--k] != ']' || ctl_string[--k] != '~') + fmt_error("~] expected"); + if (fmt_advance() == Cnil) { +- fmt_save; ++ fmt_save1; + format(fmt_stream, ctl_origin + i, j - i); + fmt_restore1; + } else { +- fmt_save; ++ fmt_save1; + format(fmt_stream, ctl_origin + j + 2, k - (j + 2)); + fmt_restore1; + } +@@ -1880,7 +1896,7 @@ fmt_conditional(bool colon, bool atsign) + ; + else { + --fmt_index; +- fmt_save; ++ fmt_save1; + format(fmt_stream, ctl_origin + i, j - i); + fmt_restore1; + } +@@ -1899,7 +1915,7 @@ fmt_conditional(bool colon, bool atsign) + for (k = j; ctl_string[--k] != '~';) + ; + if (n == 0) { +- fmt_save; ++ fmt_save1; + format(fmt_stream, ctl_origin + i, k - i); + fmt_restore1; + done = TRUE; +@@ -1925,7 +1941,7 @@ fmt_conditional(bool colon, bool atsign) + if (ctl_string[--j] != ']' || ctl_string[--j] != '~') + fmt_error("~] expected"); + if (!done) { +- fmt_save; ++ fmt_save1; + format(fmt_stream, ctl_origin + i, j - i); + fmt_restore1; + } +@@ -2062,7 +2078,7 @@ fmt_justification(volatile bool colon, b + { + int mincol=0, colinc=0, minpad=0, padchar=0; + object fields[FORMAT_DIRECTIVE_LIMIT]; +- fmt_old; ++ fmt_old1; + jmp_buf fmt_jmp_buf0; + VOL int i,j,n,j0; + int k,l,m,l0; +@@ -2089,7 +2105,7 @@ fmt_justification(volatile bool colon, b + ; + fields[n] = make_string_output_stream(64); + vs_push(fields[n]); +- fmt_save; ++ fmt_save1; + fmt_jmp_bufp = &fmt_jmp_buf0; + if ((up_colon = setjmp(*fmt_jmp_bufp))) { + --n; +@@ -2116,7 +2132,7 @@ fmt_justification(volatile bool colon, b + special = 1; + for (j = j0; ctl_string[j] != '~'; --j) + ; +- fmt_save; ++ fmt_save1; + format(fmt_stream, ctl_origin + j, j0 - j + 2); + fmt_restore1; + spare_spaces = fmt_spare_spaces; +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -24,7 +24,7 @@ + IMPLEMENTATION-DEPENDENT + */ + +-/* #define DEBUG */ ++#define DEBUG + + #define IN_GBC + #define NEED_MP_H +@@ -149,15 +149,6 @@ pageinfo_p(void *v) { + + } + +-static inline bool +-in_contblock_stack_list(void *p,void ***ap) { +- void **a; +- for (a=*ap;a && a[0]>p;a=a[1]); +- *ap=a; +- /* if (a && a[0]==p) fprintf(stderr,"Skipping %p\n",p); */ +- return a && a[0]==p; +-} +- + static inline char + get_bit(char *v,struct pageinfo *pi,void *x) { + void *ve=CB_DATA_START(pi); +@@ -168,15 +159,15 @@ get_bit(char *v,struct pageinfo *pi,void + return (v[i]>>s)&0x1; + } + +-static inline void +-set_bit(char *v,struct pageinfo *pi,void *x) { +- void *ve=CB_DATA_START(pi); +- fixnum off=(x-ve)>>LOG_BYTES_CONTBLOCK,i=off>>LOG_BITS_CHAR,s=off&~(~0UL<>LOG_BYTES_CONTBLOCK,i=off>>LOG_BITS_CHAR,s=off&~(~0UL<>s)&0x1) + #define bit_set(v,i,s) (v[i]|=(1UL<cb_link,ncb++); ++ ++ return ncb; ++ ++} ++ ++ + void + GBC(enum type t) { + +@@ -1196,21 +1204,8 @@ GBC(enum type t) { + + if (gc_time >=0 && !gc_recursive++) {gc_start=runtime();} + +- if (COLLECT_RELBLOCK_P) { +- +- char *new_start=heap_end+holepage*PAGESIZE,*new_end=new_start+nrbpage*PAGESIZE; +- +- if (new_start!=rb_start) { +- rb_pointer=new_start; +- rb_limit=new_end; +- } else { +- rb_pointer=(rb_pointer>PAGEWIDTH)); + printf("relblock: %ld bytes used %ld bytes free %ld pages\n", + (long)(rb_pointer - rb_start), (long)(rb_end - rb_pointer), nrbpage); + printf("GBC ended\n"); +@@ -1425,10 +1421,10 @@ FFN(siLheap_report)(void) { + i=sizeof(fixnum)*CHAR_SIZE-2; + i=1<>1)); + vs_push(make_fixnum(CSTACK_ALIGNMENT)); +- vs_push(make_fixnum(abs(cs_limit-cs_org)));/*CSSIZE*/ ++ vs_push(make_fixnum(labs(cs_limit-cs_org)));/*CSSIZE*/ + #if defined(IM_FIX_BASE) && defined(IM_FIX_LIM) + #ifdef LOW_IM_FIX + vs_push(make_fixnum(-LOW_IM_FIX)); +@@ -1456,14 +1452,9 @@ FFN(siLroom_report)(void) { + vs_push(make_fixnum(available_pages)); + vs_push(make_fixnum(ncbpage)); + vs_push(make_fixnum(maxcbpage)); +- { +- ufixnum ncb; +- struct contblock *cbp; +- for (ncb=0,cbp=cb_pointer;cbp;cbp=cbp->cb_link,ncb++); +- vs_push(make_fixnum(ncb)); +- } ++ vs_push(make_fixnum(count_contblocks())); + vs_push(make_fixnum(cbgbccount)); +- vs_push(make_fixnum(holepage)); ++ vs_push(make_fixnum((rb_start-heap_end)>>PAGEWIDTH)); + vs_push(make_fixnum(rb_pointer - (rb_pointerc.c_car,depth)^rtb[abs(depth%(sizeof(rtb)/sizeof(*rtb)))]; ++ h^=ihash_equal(x->c.c_car,depth)^rtb[abs((int)(depth%(sizeof(rtb)/sizeof(*rtb))))];/*FIXME: clang faulty warning*/ + x = x->c.c_cdr; + goto BEGIN; + break; +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -207,11 +207,19 @@ get_proc_meminfo_value_in_pages(const ch + + static ufixnum + get_phys_pages_no_malloc(char freep) { +- return freep ? ++ ufixnum k=freep ? + get_proc_meminfo_value_in_pages("MemFree:")+ + get_proc_meminfo_value_in_pages("Buffers:")+ + get_proc_meminfo_value_in_pages("Cached:") : + get_proc_meminfo_value_in_pages("MemTotal:"); ++ const char *e=getenv("GCL_MEM_MULTIPLE"); ++ if (e) { ++ double d; ++ massert(sscanf(e,"%lf",&d)==1); ++ massert(d>=0.0); ++ k*=d; ++ } ++ return k; + } + + #endif +@@ -221,9 +229,9 @@ void *initial_sbrk=NULL; + int + update_real_maxpage(void) { + +- ufixnum i,j,k; ++ ufixnum i,j; + void *end,*cur,*beg; +- ufixnum free_phys_pages=get_phys_pages_no_malloc(1),maxpages; ++ ufixnum maxpages; + #ifdef __MINGW32__ + static fixnum n; + +@@ -233,7 +241,7 @@ update_real_maxpage(void) { + } + #endif + +- phys_pages=get_phys_pages_no_malloc(1); ++ phys_pages=get_phys_pages_no_malloc(0); + + massert(cur=sbrk(0)); + beg=data_start ? data_start : cur; +@@ -253,15 +261,14 @@ update_real_maxpage(void) { + + maxpages=real_maxpage-page(beg); + +- free_phys_pages=free_phys_pages>maxpages ? maxpages : free_phys_pages; ++ phys_pages=phys_pages>maxpages ? maxpages : phys_pages; + + resv_pages=available_pages=0; + available_pages=check_avail_pages(); + +- for (i=t_start,j=0;i>1); ++ if (j>1); + } + + new_holepage=0; +@@ -297,15 +302,15 @@ minimize_image(void) { + fixnum i; + + empty_relblock(); +- holepage=nrbpage=0; +- core_end=rb_start=rb_end=rb_limit=rb_pointer=heap_end; ++ nrbpage=0; ++ resize_hole(0,t_relocatable); + + #ifdef GCL_GPROF + gprof_cleanup(); + #endif + + #if defined(BSD) || defined(ATT) +- mbrk(core_end); ++ mbrk(core_end=heap_end); + #endif + + cbgbccount = tm_table[t_contiguous].tm_adjgbccnt = tm_table[t_contiguous].tm_opt_maxpage = 0; +@@ -992,7 +997,6 @@ FFN(siLsave_system)(void) { + saving_system = FALSE; + + siLsave(); +- alloc_page(-(holepage+2*nrbpage)); + + } + +--- gcl-2.6.12.orig/o/nfunlink.c ++++ gcl-2.6.12/o/nfunlink.c +@@ -212,19 +212,24 @@ IapplyVector(object fun, int nargs, obje + else { abase = vs_top; + for (i=0; i < nargs ; i++, atypes >>= F_TYPE_WIDTH) + { object next = base[i]; +- int atyp = atypes & MASK_RANGE(0,F_TYPE_WIDTH); +- if (atyp == F_object) +- next = next; +- else if (atyp == F_int) +- { ASSURE_TYPE(next,t_fixnum); +- next = COERCE_F_TYPE(next,F_object,F_int);} +- else if (atyp == F_shortfloat) +- { ASSURE_TYPE(next,t_shortfloat); +- next = COERCE_F_TYPE(next,F_object,F_shortfloat);} +- else if (atyp == F_double_ptr) +- { ASSURE_TYPE(next,t_longfloat); +- next = COERCE_F_TYPE(next,F_object,F_double_ptr);} +- else {FEerror("cant get here!",0);} ++ switch (atypes & MASK_RANGE(0,F_TYPE_WIDTH)) { ++ case F_object: ++ break; ++ case F_int: ++ ASSURE_TYPE(next,t_fixnum); ++ next = COERCE_F_TYPE(next,F_object,F_int); ++ break; ++ case F_shortfloat: ++ ASSURE_TYPE(next,t_shortfloat); ++ next = COERCE_F_TYPE(next,F_object,F_shortfloat); ++ break; ++ case F_double_ptr: ++ ASSURE_TYPE(next,t_longfloat); ++ next = COERCE_F_TYPE(next,F_object,F_double_ptr); ++ break; ++ default: ++ FEerror("cant get here!",0); ++ } + vs_push(next);} + + } +--- gcl-2.6.12.orig/o/nsocket.c ++++ gcl-2.6.12/o/nsocket.c +@@ -204,7 +204,7 @@ CreateSocket(int port, char *host, int s + * attempt to do an async connect. Otherwise + * do a synchronous connect or bind. */ + { +- int status, sock, asyncConnect, curState, origState; ++ int status, sock, /* asyncConnect, */curState, origState; + struct sockaddr_in sockaddr; /* socket address */ + struct sockaddr_in mysockaddr; /* Socket address for client */ + +@@ -230,7 +230,7 @@ CreateSocket(int port, char *host, int s + + fcntl(sock, F_SETFD, FD_CLOEXEC); + +- asyncConnect = 0; ++ /* asyncConnect = 0; */ + status = 0; + if (server) { + +@@ -285,7 +285,7 @@ CreateSocket(int port, char *host, int s + sizeof(sockaddr)); + if (status < 0) { + if (errno == EINPROGRESS) { +- asyncConnect = 1; ++ /* asyncConnect = 1; */ + status = 0; + } + } +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -5,8 +5,14 @@ + extern FILE *stdin __attribute__((weak)); + extern FILE *stderr __attribute__((weak)); + extern FILE *stdout __attribute__((weak)); ++ ++#if RL_READLINE_VERSION < 0x0600 ++extern Function *rl_completion_entry_function __attribute__((weak)); ++extern char *rl_readline_name __attribute__((weak)); ++#else + extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); + extern const char *rl_readline_name __attribute__((weak)); ++#endif + + void + prelink_init(void) { +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -341,7 +341,7 @@ truncate_double(char *b,double d,int dp) + for (p=c1;*p && *p!='e';p++); + pp=p>c1 && p[-1]!='.' ? p-1 : p; + for (;pp>c1 && pp[-1]=='0';pp--); +- strcpy(pp,p); ++ memmove(pp,p,1+strlen(p)); + if (pp!=p && COMP(c1,&pp,d,dp)) + k=truncate_double(n=c1,d,dp); + +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -2476,6 +2476,7 @@ object in; + + /* to prevent longjmp clobber */ + i=(long)&vsp; ++ i+=i; + vsp=&vspo; + old_READtable = READtable; + old_READdefault_float_format = READdefault_float_format; +--- gcl-2.6.12.orig/o/run_process.c ++++ gcl-2.6.12/o/run_process.c +@@ -354,7 +354,6 @@ static int open_connection(host,server) + char *host; + int server; + { +- int res; + int pid; + int sock; + struct hostent *hp; +@@ -396,9 +395,9 @@ int server; + } + + #ifdef OVM_IO +- res = fcntl(sock,F_SETFL,FASYNC | FNDELAY); ++ fcntl(sock,F_SETFL,FASYNC | FNDELAY); + #else +- res = fcntl(sock,F_SETFL,FASYNC); ++ fcntl(sock,F_SETFL,FASYNC); + #endif + return(sock); + } +--- gcl-2.6.12.orig/o/sockets.c ++++ gcl-2.6.12/o/sockets.c +@@ -338,7 +338,7 @@ DEFUN_NEW("OUR-READ-WITH-OFFSET",object, + OO,OI,II,OO,(object fd,object buffer,fixnum offset,fixnum nbytes,fixnum timeout), + "Read from STATE-FD into string BUFFER putting data at OFFSET and reading NBYTES, waiting for TIMEOUT before failing") + +-{ return make_fixnum(read1(OBJ_TO_CONNECTION_STATE(fd),&((buffer)->ust.ust_self[offset]),nbytes,timeout)); ++{ return make_fixnum(read1(OBJ_TO_CONNECTION_STATE(fd),&((buffer)->st.st_self[offset]),nbytes,timeout)); + } + + +--- gcl-2.6.12.orig/o/unexelf.c ++++ gcl-2.6.12/o/unexelf.c +@@ -660,7 +660,7 @@ unexec (char *new_name, char *old_name, + int n, nn; + int old_bss_index, old_sbss_index; + int old_data_index, new_data2_index; +- int old_mdebug_index; ++ /* int old_mdebug_index; */ + struct stat stat_buf; + + /* Open the old file, allocate a buffer of the right size, and read +@@ -703,8 +703,8 @@ unexec (char *new_name, char *old_name, + + /* Find the mdebug section, if any. */ + +- old_mdebug_index = find_section (".mdebug", old_section_names, +- old_name, old_file_h, old_section_h, 1); ++ /* old_mdebug_index = find_section (".mdebug", old_section_names, */ ++ /* old_name, old_file_h, old_section_h, 1); */ + + /* Find the old .bss section. Figure out parameters of the new + * data2 and bss sections. +--- gcl-2.6.12.orig/xgcl-2/gcl_general.lsp ++++ gcl-2.6.12/xgcl-2/gcl_general.lsp +@@ -61,7 +61,7 @@ + + ;; General routines. + (defCfun "object lisp_string(object a_string, fixnum c_string) " 0 +- "extern long strlen(const char *);" ++ "extern unsigned long strlen(const char *);" + "fixnum len = strlen((void *)c_string);" + "a_string->st.st_dim = len;" + "a_string->st.st_fillp = len;" diff --git a/debian/patches/Version_2_6_13pre120 b/debian/patches/Version_2_6_13pre120 new file mode 100644 index 0000000..98e754c --- /dev/null +++ b/debian/patches/Version_2_6_13pre120 @@ -0,0 +1,347 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-120) unstable; urgency=medium + . + * Version_2.6.13pre119 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-08-07 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -703,8 +703,8 @@ GMPDIR + GMP + HAVE_MALLOC_ZONE_MEMALIGN + MAKEINFO +-AWK + GCL_CC ++AWK + CPP + OBJEXT + EXEEXT +@@ -4418,11 +4418,6 @@ ac_link='$CC -o conftest$ac_exeext $CFLA + ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +-GCL_CC=`basename $CC` +-if echo $GCL_CC |grep gcc |grep -q win; then +- GCL_CC=gcc +-fi +- + + add_arg_to_cflags() { + +@@ -4557,6 +4552,56 @@ add_args_to_cflags -fsigned-char -pipe + + add_args_to_ldflags -no-pie # -Wl,-z,lazy + ++CC=gcc ++GCL_CC=gcc ++ ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline semantics" >&5 ++printf %s "checking for inline semantics... " >&6; } ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ extern inline int foo(int i) {return i;} ++ ++ int ++ bar(int i) {return foo(i);} ++ ++_ACEOF ++if ac_fn_c_try_compile "$LINENO" ++then : ++ if ! `nm conftest.o |grep -q "T foo"` ; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: old" >&5 ++printf "%s\n" "old" >&6; } ++ ++printf "%s\n" "#define OLD_INLINE 1" >>confdefs.h ++ ++ else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ inline int foo(int i) {return i;} ++ ++ int ++ bar(int i) {return foo(i);} ++ ++_ACEOF ++if ac_fn_c_try_compile "$LINENO" ++then : ++ if ! `nm conftest.o |grep -q "T foo"` ; then ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: new" >&5 ++printf "%s\n" "new" >&6; } ++ else ++ as_fn_error $? "need working inline semantics" "$LINENO" 5 ++ fi ++else $as_nop ++ as_fn_error $? "need to probe inline semantics" "$LINENO" 5 ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ++ fi ++else $as_nop ++ as_fn_error $? "need to probe inline semantics" "$LINENO" 5 ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ++ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 + printf %s "checking for clang... " >&6; } + if test "$cross_compiling" = yes +@@ -4694,6 +4739,12 @@ fi + test -n "$AWK" && break + done + ++GCL_CC_ARGS=`echo $CC | ${AWK} '{$1="";print}'` ++GCL_CC="`basename $CC` $GCL_CC_ARGS" ++if echo $GCL_CC |grep gcc |grep -q win; then ++ GCL_CC=gcc ++fi ++ + + # Check whether --enable-gprof was given. + if test ${enable_gprof+y} +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -181,11 +181,6 @@ fi + AC_PROG_CC + AC_PROG_CPP + AC_SUBST(CC) +-GCL_CC=`basename $CC` +-if echo $GCL_CC |grep gcc |grep -q win; then +- GCL_CC=gcc +-fi +-AC_SUBST(GCL_CC) + + add_arg_to_cflags() { + +@@ -268,6 +263,34 @@ add_args_to_cflags -fsigned-char -pipe + + add_args_to_ldflags -no-pie # -Wl,-z,lazy + ++AC_MSG_CHECKING([for inline semantics]) ++AC_COMPILE_IFELSE( ++ [AC_LANG_SOURCE([[ ++ extern inline int foo(int i) {return i;} ++ ++ int ++ bar(int i) {return foo(i);} ++ ]])], ++ [if ! `nm conftest.o |grep -q "T foo"` ; then ++ AC_MSG_RESULT([old]) ++ AC_DEFINE([OLD_INLINE],[1],[extern inline semantics]) ++ else ++ AC_COMPILE_IFELSE( ++ [AC_LANG_SOURCE([[ ++ inline int foo(int i) {return i;} ++ ++ int ++ bar(int i) {return foo(i);} ++ ]])], ++ [if ! `nm conftest.o |grep -q "T foo"` ; then ++ AC_MSG_RESULT([new]) ++ else ++ AC_MSG_ERROR([need working inline semantics]) ++ fi], ++ [AC_MSG_ERROR([need to probe inline semantics])]) ++ fi], ++ [AC_MSG_ERROR([need to probe inline semantics])]) ++ + AC_MSG_CHECKING([for clang]) + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([[ +@@ -329,6 +352,12 @@ case "$use" in + esac + + AC_CHECK_PROGS(AWK,[gawk nawk awk]) ++GCL_CC_ARGS=`echo $CC | ${AWK} '{$1="";print}'` ++GCL_CC="`basename $CC` $GCL_CC_ARGS" ++if echo $GCL_CC |grep gcc |grep -q win; then ++ GCL_CC=gcc ++fi ++AC_SUBST(GCL_CC) + + AC_ARG_ENABLE([gprof],[ --enable-gprof builds gcl with -pg in CFLAGS to enable profiling with gprof], + [if test "$enableval" = "yes" ; then +--- gcl-2.6.12.orig/h/compbas.h ++++ gcl-2.6.12/h/compbas.h +@@ -4,7 +4,7 @@ + #define EXTER extern + #endif + #ifndef INLINE +-#if (defined(__GNUC__) && __GNUC__ <= 4) && !defined __clang__ ++#ifdef OLD_INLINE + #define INLINE extern inline + #else + #define INLINE inline +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -21,11 +21,6 @@ + /* running clang compiler */ + #undef CLANG + +-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP +- systems. This function is required for `alloca.c' support on those systems. +- */ +-#undef CRAY_STACKSEG_END +- + /* cstack max */ + #undef CSTACKMAX + +@@ -41,7 +36,7 @@ + /* whether C stack grows up or down */ + #undef CSTACK_DIRECTION + +-/* Define to 1 if using `alloca.c'. */ ++/* Define to 1 if using 'alloca.c'. */ + #undef C_ALLOCA + + /* debug safecdr code */ +@@ -62,11 +57,10 @@ + /* using gmp */ + #undef GMP + +-/* Define to 1 if you have `alloca', as a function or macro. */ ++/* Define to 1 if you have 'alloca', as a function or macro. */ + #undef HAVE_ALLOCA + +-/* Define to 1 if you have and it should be used (not on Ultrix). +- */ ++/* Define to 1 if works. */ + #undef HAVE_ALLOCA_H + + /* Define to 1 if you have the header file. */ +@@ -171,9 +165,6 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_MATH_H + +-/* Define to 1 if you have the header file. */ +-#undef HAVE_MEMORY_H +- + /* Define to 1 if you have the `mprotect' function. */ + #undef HAVE_MPROTECT + +@@ -216,6 +207,9 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_STDINT_H + ++/* Define to 1 if you have the header file. */ ++#undef HAVE_STDIO_H ++ + /* Define to 1 if you have the header file. */ + #undef HAVE_STDLIB_H + +@@ -318,6 +312,9 @@ + /* needed object alignment bytes */ + #undef OBJ_ALIGNMENT + ++/* extern inline semantics */ ++#undef OLD_INLINE ++ + /* Define to the address where bug reports for this package should be sent. */ + #undef PACKAGE_BUGREPORT + +@@ -368,7 +365,9 @@ + /* staticly linked images */ + #undef STATIC_LINKING + +-/* Define to 1 if you have the ANSI C header files. */ ++/* Define to 1 if all of the C90 standard headers exist (not just the ones ++ required in a freestanding environment). This macro is provided for ++ backward compatibility; new code need not use it. */ + #undef STDC_HEADERS + + /* have _cleanup function */ +--- gcl-2.6.12.orig/h/linux.h ++++ gcl-2.6.12/h/linux.h +@@ -146,10 +146,10 @@ do { int c = 0; \ + + /* #define FPE_CODE(i_) make_fixnum((fixnum)SF(i_)->si_code) */ + #ifdef __i386__ +-#define FPE_CODE(i_,v_) make_fixnum(FFN(fSfpe_code)(UC(v_)->uc_mcontext.fpregs->sw,((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->mxcsr)) ++#define FPE_CODE(i_,v_) make_fixnum((long)FFN(fSfpe_code)(UC(v_)->uc_mcontext.fpregs->sw,((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->mxcsr)) + #define FPE_ADDR(i_,v_) make_fixnum((UC(v_)->uc_mcontext.fpregs->tag!=-1) ? UC(v_)->uc_mcontext.fpregs->ipoff : (fixnum)SF(i_)->si_addr) + #else +-#define FPE_CODE(i_,v_) make_fixnum(FFN(fSfpe_code)(UC(v_)->uc_mcontext.fpregs->swd,((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->mxcsr)) ++#define FPE_CODE(i_,v_) make_fixnum((long)FFN(fSfpe_code)(UC(v_)->uc_mcontext.fpregs->swd,((struct _fpstate *)UC(v_)->uc_mcontext.fpregs)->mxcsr)) + #define FPE_ADDR(i_,v_) make_fixnum(UC(v_)->uc_mcontext.fpregs->fop ? UC(v_)->uc_mcontext.fpregs->rip : (fixnum)SF(i_)->si_addr) + #endif + #define FPE_CTXT(v_) list(3,make_fixnum((fixnum)&UC(v_)->uc_mcontext.gregs), \ +--- gcl-2.6.12.orig/h/lu.h ++++ gcl-2.6.12/h/lu.h +@@ -13,6 +13,7 @@ typedef float shortfloat; + typedef double longfloat; + + typedef union lispunion *object; ++typedef union typeunion *hobj; + + #ifndef WORDS_BIGENDIAN + +@@ -431,3 +432,8 @@ union lispunion { + struct sfarray sfa; + struct lfarray lfa; + }; ++ ++union typeunion { ++ struct dummy d; ++ fixnum fw; ++}; +--- gcl-2.6.12.orig/h/type.h ++++ gcl-2.6.12/h/type.h +@@ -100,7 +100,7 @@ enum smmode { /* stream mode */ + #endif + + /*Note preserve sgc flag here VVV*/ +-#define set_type_of(x,y) ({object _x=(object)(x);enum type _y=(y);_x->d.f=0;\ ++#define set_type_of(x,y) ({hobj _x=(hobj)(x);enum type _y=(y);_x->d.f=0; \ + if (TYPEWORD_TYPE_P(_y)) {_x->d.e=1;_x->d.t=_y;_x->fw|=(fixnum)OBJNULL;}}) + + #ifndef WIDE_CONS +--- gcl-2.6.12.orig/o/usig.c ++++ gcl-2.6.12/o/usig.c +@@ -214,11 +214,11 @@ DEFUN_NEW("FEDISABLEEXCEPT",object,fSfed + + DEFUN_NEW("FPE_CODE",object,fSfpe_code,SI,2,2,NONE,II,OO,OO,OO,(fixnum x87sw,fixnum mxcsr),"") { + +- RETURN1((object)(FE_TEST(x87sw,mxcsr,FE_INVALID) ? FPE_FLTINV : +- (FE_TEST(x87sw,mxcsr,FE_DIVBYZERO) ? FPE_FLTDIV : +- (FE_TEST(x87sw,mxcsr,FE_OVERFLOW) ? FPE_FLTOVF : +- (FE_TEST(x87sw,mxcsr,FE_UNDERFLOW) ? FPE_FLTUND : +- (FE_TEST(x87sw,mxcsr,FE_INEXACT) ? FPE_FLTRES : 0)))))); ++ RETURN1((object)(long)(FE_TEST(x87sw,mxcsr,FE_INVALID) ? FPE_FLTINV : ++ (FE_TEST(x87sw,mxcsr,FE_DIVBYZERO) ? FPE_FLTDIV : ++ (FE_TEST(x87sw,mxcsr,FE_OVERFLOW) ? FPE_FLTOVF : ++ (FE_TEST(x87sw,mxcsr,FE_UNDERFLOW) ? FPE_FLTUND : ++ (FE_TEST(x87sw,mxcsr,FE_INEXACT) ? FPE_FLTRES : 0)))))); + } + + #if defined(__MINGW32__) || defined(__CYGWIN__) +--- gcl-2.6.12.orig/o/utils.c ++++ gcl-2.6.12/o/utils.c +@@ -69,9 +69,7 @@ Ifuncall_n(object fun,int n,...) { + va_list ap; + object *new; + va_start(ap,n); +- { +- COERCE_VA_LIST(new,ap,n); +- } ++ COERCE_VA_LIST(new,ap,n); + va_end(ap); + return IapplyVector(fun,n,new); + } diff --git a/debian/patches/Version_2_6_13pre124 b/debian/patches/Version_2_6_13pre124 new file mode 100644 index 0000000..ad8489b --- /dev/null +++ b/debian/patches/Version_2_6_13pre124 @@ -0,0 +1,5468 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-124) unstable; urgency=medium + . + * Version_2.6.13pre124 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-08-11 + +--- gcl-2.6.12.orig/config.guess ++++ gcl-2.6.12/config.guess +@@ -1,12 +1,14 @@ + #! /bin/sh + # Attempt to guess a canonical system name. +-# Copyright 1992-2018 Free Software Foundation, Inc. ++# Copyright 1992-2022 Free Software Foundation, Inc. + +-timestamp='2018-02-24' ++# shellcheck disable=SC2006,SC2268 # see below for rationale ++ ++timestamp='2022-01-09' + + # This file 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 3 of the License, or ++# the Free Software Foundation, either version 3 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but +@@ -27,11 +29,19 @@ timestamp='2018-02-24' + # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. + # + # You can get the latest version of this script from: +-# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess ++# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess + # + # Please send patches to . + + ++# The "shellcheck disable" line above the timestamp inhibits complaints ++# about features and limitations of the classic Bourne shell that were ++# superseded or lifted in POSIX. However, this script identifies a wide ++# variety of pre-POSIX systems that do not have POSIX shells at all, and ++# even some reasonably current systems (Solaris 10 as case-in-point) still ++# have a pre-POSIX /bin/sh. ++ ++ + me=`echo "$0" | sed -e 's,.*/,,'` + + usage="\ +@@ -50,7 +60,7 @@ version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright 1992-2018 Free Software Foundation, Inc. ++Copyright 1992-2022 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -84,7 +94,8 @@ if test $# != 0; then + exit 1 + fi + +-trap 'exit 1' 1 2 15 ++# Just in case it came from the environment. ++GUESS= + + # CC_FOR_BUILD -- compiler used by this script. Note that the use of a + # compiler to aid in system detection is discouraged as it requires +@@ -96,73 +107,90 @@ trap 'exit 1' 1 2 15 + + # Portable tmp directory creation inspired by the Autoconf team. + +-set_cc_for_build=' +-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +-: ${TMPDIR=/tmp} ; +- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || +- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || +- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || +- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +-dummy=$tmp/dummy ; +-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +-case $CC_FOR_BUILD,$HOST_CC,$CC in +- ,,) echo "int x;" > "$dummy.c" ; +- for c in cc gcc c89 c99 ; do +- if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then +- CC_FOR_BUILD="$c"; break ; +- fi ; +- done ; +- if test x"$CC_FOR_BUILD" = x ; then +- CC_FOR_BUILD=no_compiler_found ; +- fi +- ;; +- ,,*) CC_FOR_BUILD=$CC ;; +- ,*,*) CC_FOR_BUILD=$HOST_CC ;; +-esac ; set_cc_for_build= ;' ++tmp= ++# shellcheck disable=SC2172 ++trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 ++ ++set_cc_for_build() { ++ # prevent multiple calls if $tmp is already set ++ test "$tmp" && return 0 ++ : "${TMPDIR=/tmp}" ++ # shellcheck disable=SC2039,SC3028 ++ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || ++ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || ++ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || ++ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ++ dummy=$tmp/dummy ++ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ++ ,,) echo "int x;" > "$dummy.c" ++ for driver in cc gcc c89 c99 ; do ++ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then ++ CC_FOR_BUILD=$driver ++ break ++ fi ++ done ++ if test x"$CC_FOR_BUILD" = x ; then ++ CC_FOR_BUILD=no_compiler_found ++ fi ++ ;; ++ ,,*) CC_FOR_BUILD=$CC ;; ++ ,*,*) CC_FOR_BUILD=$HOST_CC ;; ++ esac ++} + + # This is needed to find uname on a Pyramid OSx when run in the BSD universe. + # (ghazi@noc.rutgers.edu 1994-08-24) +-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then ++if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH + fi + + UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown + UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown ++UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown + UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +-case "$UNAME_SYSTEM" in ++case $UNAME_SYSTEM in + Linux|GNU|GNU/*) +- # If the system lacks a compiler, then just pick glibc. +- # We could probably try harder. +- LIBC=gnu ++ LIBC=unknown + +- eval "$set_cc_for_build" ++ set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc +- #else ++ #elif defined(__GLIBC__) + LIBC=gnu ++ #else ++ #include ++ /* First heuristic to detect musl libc. */ ++ #ifdef __DEFINED_va_list ++ LIBC=musl ++ #endif + #endif + EOF +- eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" ++ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ++ eval "$cc_set_libc" + +- # If ldd exists, use it to detect musl libc. +- if command -v ldd >/dev/null && \ +- ldd --version 2>&1 | grep -q ^musl +- then +- LIBC=musl ++ # Second heuristic to detect musl libc. ++ if [ "$LIBC" = unknown ] && ++ command -v ldd >/dev/null && ++ ldd --version 2>&1 | grep -q ^musl; then ++ LIBC=musl ++ fi ++ ++ # If the system lacks a compiler, then just pick glibc. ++ # We could probably try harder. ++ if [ "$LIBC" = unknown ]; then ++ LIBC=gnu + fi + ;; + esac + + # Note: order is significant - the case branches are not exclusive. + +-case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ++case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, +@@ -174,12 +202,12 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". +- sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ +- "/sbin/$sysctl" 2>/dev/null || \ +- "/usr/sbin/$sysctl" 2>/dev/null || \ ++ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ ++ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` +- case "$UNAME_MACHINE_ARCH" in ++ case $UNAME_MACHINE_ARCH in ++ aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; +@@ -188,18 +216,18 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` +- machine="${arch}${endian}"-unknown ++ machine=${arch}${endian}-unknown + ;; +- *) machine="$UNAME_MACHINE_ARCH"-unknown ;; ++ *) machine=$UNAME_MACHINE_ARCH-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. +- case "$UNAME_MACHINE_ARCH" in ++ case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) +- eval "$set_cc_for_build" ++ set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then +@@ -215,7 +243,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + ;; + esac + # Determine ABI tags. +- case "$UNAME_MACHINE_ARCH" in ++ case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` +@@ -226,7 +254,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. +- case "$UNAME_VERSION" in ++ case $UNAME_VERSION in + Debian*) + release='-gnu' + ;; +@@ -237,45 +265,57 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. +- echo "$machine-${os}${release}${abi}" +- exit ;; ++ GUESS=$machine-${os}${release}${abi-} ++ ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` +- echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ++ ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` +- echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ++ ;; ++ *:SecBSD:*:*) ++ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` ++ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ++ ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` +- echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ++ ;; + *:MidnightBSD:*:*) +- echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ++ ;; + *:ekkoBSD:*:*) +- echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ++ ;; + *:SolidBSD:*:*) +- echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ++ ;; ++ *:OS108:*:*) ++ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ++ ;; + macppc:MirBSD:*:*) +- echo powerpc-unknown-mirbsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ++ ;; + *:MirBSD:*:*) +- echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ++ ;; + *:Sortix:*:*) +- echo "$UNAME_MACHINE"-unknown-sortix +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-sortix ++ ;; ++ *:Twizzler:*:*) ++ GUESS=$UNAME_MACHINE-unknown-twizzler ++ ;; + *:Redox:*:*) +- echo "$UNAME_MACHINE"-unknown-redox +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-redox ++ ;; + mips:OSF1:*.*) +- echo mips-dec-osf1 +- exit ;; ++ GUESS=mips-dec-osf1 ++ ;; + alpha:OSF1:*:*) ++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code. ++ trap '' 0 + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` +@@ -289,7 +329,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` +- case "$ALPHA_CPU_TYPE" in ++ case $ALPHA_CPU_TYPE in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") +@@ -326,117 +366,121 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. +- echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" +- # Reset EXIT trap before exiting to avoid spurious non-zero exit code. +- exitcode=$? +- trap '' 0 +- exit $exitcode ;; ++ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` ++ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ++ ;; + Amiga*:UNIX_System_V:4.0:*) +- echo m68k-unknown-sysv4 +- exit ;; ++ GUESS=m68k-unknown-sysv4 ++ ;; + *:[Aa]miga[Oo][Ss]:*:*) +- echo "$UNAME_MACHINE"-unknown-amigaos +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-amigaos ++ ;; + *:[Mm]orph[Oo][Ss]:*:*) +- echo "$UNAME_MACHINE"-unknown-morphos +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-morphos ++ ;; + *:OS/390:*:*) +- echo i370-ibm-openedition +- exit ;; ++ GUESS=i370-ibm-openedition ++ ;; + *:z/VM:*:*) +- echo s390-ibm-zvmoe +- exit ;; ++ GUESS=s390-ibm-zvmoe ++ ;; + *:OS400:*:*) +- echo powerpc-ibm-os400 +- exit ;; ++ GUESS=powerpc-ibm-os400 ++ ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) +- echo arm-acorn-riscix"$UNAME_RELEASE" +- exit ;; ++ GUESS=arm-acorn-riscix$UNAME_RELEASE ++ ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) +- echo arm-unknown-riscos +- exit ;; ++ GUESS=arm-unknown-riscos ++ ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) +- echo hppa1.1-hitachi-hiuxmpp +- exit ;; ++ GUESS=hppa1.1-hitachi-hiuxmpp ++ ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. +- if test "`(/bin/universe) 2>/dev/null`" = att ; then +- echo pyramid-pyramid-sysv3 +- else +- echo pyramid-pyramid-bsd +- fi +- exit ;; ++ case `(/bin/universe) 2>/dev/null` in ++ att) GUESS=pyramid-pyramid-sysv3 ;; ++ *) GUESS=pyramid-pyramid-bsd ;; ++ esac ++ ;; + NILE*:*:*:dcosx) +- echo pyramid-pyramid-svr4 +- exit ;; ++ GUESS=pyramid-pyramid-svr4 ++ ;; + DRS?6000:unix:4.0:6*) +- echo sparc-icl-nx6 +- exit ;; ++ GUESS=sparc-icl-nx6 ++ ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in +- sparc) echo sparc-icl-nx7; exit ;; +- esac ;; ++ sparc) GUESS=sparc-icl-nx7 ;; ++ esac ++ ;; + s390x:SunOS:*:*) +- echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` ++ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ++ ;; + sun4H:SunOS:5.*:*) +- echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` ++ GUESS=sparc-hal-solaris2$SUN_REL ++ ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) +- echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` ++ GUESS=sparc-sun-solaris2$SUN_REL ++ ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) +- echo i386-pc-auroraux"$UNAME_RELEASE" +- exit ;; ++ GUESS=i386-pc-auroraux$UNAME_RELEASE ++ ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) +- eval "$set_cc_for_build" ++ set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. +- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then ++ if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ +- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi +- echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` ++ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ++ ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. +- echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` ++ GUESS=sparc-sun-solaris3$SUN_REL ++ ;; + sun4*:SunOS:*:*) +- case "`/usr/bin/arch -k`" in ++ case `/usr/bin/arch -k` in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. +- echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` ++ GUESS=sparc-sun-sunos$SUN_REL ++ ;; + sun3*:SunOS:*:*) +- echo m68k-sun-sunos"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-sun-sunos$UNAME_RELEASE ++ ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 +- case "`/bin/arch`" in ++ case `/bin/arch` in + sun3) +- echo m68k-sun-sunos"$UNAME_RELEASE" ++ GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) +- echo sparc-sun-sunos"$UNAME_RELEASE" ++ GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac +- exit ;; ++ ;; + aushp:SunOS:*:*) +- echo sparc-auspex-sunos"$UNAME_RELEASE" +- exit ;; ++ GUESS=sparc-auspex-sunos$UNAME_RELEASE ++ ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor +@@ -446,43 +490,43 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAM + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-atari-mint$UNAME_RELEASE ++ ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-atari-mint$UNAME_RELEASE ++ ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) +- echo m68k-atari-mint"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-atari-mint$UNAME_RELEASE ++ ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) +- echo m68k-milan-mint"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-milan-mint$UNAME_RELEASE ++ ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) +- echo m68k-hades-mint"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-hades-mint$UNAME_RELEASE ++ ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) +- echo m68k-unknown-mint"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-unknown-mint$UNAME_RELEASE ++ ;; + m68k:machten:*:*) +- echo m68k-apple-machten"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-apple-machten$UNAME_RELEASE ++ ;; + powerpc:machten:*:*) +- echo powerpc-apple-machten"$UNAME_RELEASE" +- exit ;; ++ GUESS=powerpc-apple-machten$UNAME_RELEASE ++ ;; + RISC*:Mach:*:*) +- echo mips-dec-mach_bsd4.3 +- exit ;; ++ GUESS=mips-dec-mach_bsd4.3 ++ ;; + RISC*:ULTRIX:*:*) +- echo mips-dec-ultrix"$UNAME_RELEASE" +- exit ;; ++ GUESS=mips-dec-ultrix$UNAME_RELEASE ++ ;; + VAX*:ULTRIX*:*:*) +- echo vax-dec-ultrix"$UNAME_RELEASE" +- exit ;; ++ GUESS=vax-dec-ultrix$UNAME_RELEASE ++ ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) +- echo clipper-intergraph-clix"$UNAME_RELEASE" +- exit ;; ++ GUESS=clipper-intergraph-clix$UNAME_RELEASE ++ ;; + mips:*:*:UMIPS | mips:*:*:RISCos) +- eval "$set_cc_for_build" ++ set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __cplusplus + #include /* for printf() prototype */ +@@ -508,78 +552,79 @@ EOF + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } +- echo mips-mips-riscos"$UNAME_RELEASE" +- exit ;; ++ GUESS=mips-mips-riscos$UNAME_RELEASE ++ ;; + Motorola:PowerMAX_OS:*:*) +- echo powerpc-motorola-powermax +- exit ;; ++ GUESS=powerpc-motorola-powermax ++ ;; + Motorola:*:4.3:PL8-*) +- echo powerpc-harris-powermax +- exit ;; ++ GUESS=powerpc-harris-powermax ++ ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) +- echo powerpc-harris-powermax +- exit ;; ++ GUESS=powerpc-harris-powermax ++ ;; + Night_Hawk:Power_UNIX:*:*) +- echo powerpc-harris-powerunix +- exit ;; ++ GUESS=powerpc-harris-powerunix ++ ;; + m88k:CX/UX:7*:*) +- echo m88k-harris-cxux7 +- exit ;; ++ GUESS=m88k-harris-cxux7 ++ ;; + m88k:*:4*:R4*) +- echo m88k-motorola-sysv4 +- exit ;; ++ GUESS=m88k-motorola-sysv4 ++ ;; + m88k:*:3*:R3*) +- echo m88k-motorola-sysv3 +- exit ;; ++ GUESS=m88k-motorola-sysv3 ++ ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` +- if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] ++ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then +- if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ +- [ "$TARGET_BINARY_INTERFACE"x = x ] ++ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ ++ test "$TARGET_BINARY_INTERFACE"x = x + then +- echo m88k-dg-dgux"$UNAME_RELEASE" ++ GUESS=m88k-dg-dgux$UNAME_RELEASE + else +- echo m88k-dg-dguxbcs"$UNAME_RELEASE" ++ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else +- echo i586-dg-dgux"$UNAME_RELEASE" ++ GUESS=i586-dg-dgux$UNAME_RELEASE + fi +- exit ;; ++ ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) +- echo m88k-dolphin-sysv3 +- exit ;; ++ GUESS=m88k-dolphin-sysv3 ++ ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 +- echo m88k-motorola-sysv3 +- exit ;; ++ GUESS=m88k-motorola-sysv3 ++ ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) +- echo m88k-tektronix-sysv3 +- exit ;; ++ GUESS=m88k-tektronix-sysv3 ++ ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) +- echo m68k-tektronix-bsd +- exit ;; ++ GUESS=m68k-tektronix-bsd ++ ;; + *:IRIX*:*:*) +- echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" +- exit ;; ++ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` ++ GUESS=mips-sgi-irix$IRIX_REL ++ ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. +- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id +- exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' ++ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ++ ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) +- echo i386-ibm-aix +- exit ;; ++ GUESS=i386-ibm-aix ++ ;; + ia64:AIX:*:*) +- if [ -x /usr/bin/oslevel ] ; then ++ if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else +- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" ++ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi +- echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" +- exit ;; ++ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ++ ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then +- eval "$set_cc_for_build" ++ set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + +@@ -593,16 +638,16 @@ EOF + EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then +- echo "$SYSTEM_NAME" ++ GUESS=$SYSTEM_NAME + else +- echo rs6000-ibm-aix3.2.5 ++ GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then +- echo rs6000-ibm-aix3.2.4 ++ GUESS=rs6000-ibm-aix3.2.4 + else +- echo rs6000-ibm-aix3.2 ++ GUESS=rs6000-ibm-aix3.2 + fi +- exit ;; ++ ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then +@@ -610,57 +655,57 @@ EOF + else + IBM_ARCH=powerpc + fi +- if [ -x /usr/bin/lslpp ] ; then +- IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | ++ if test -x /usr/bin/lslpp ; then ++ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else +- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" ++ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi +- echo "$IBM_ARCH"-ibm-aix"$IBM_REV" +- exit ;; ++ GUESS=$IBM_ARCH-ibm-aix$IBM_REV ++ ;; + *:AIX:*:*) +- echo rs6000-ibm-aix +- exit ;; ++ GUESS=rs6000-ibm-aix ++ ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) +- echo romp-ibm-bsd4.4 +- exit ;; ++ GUESS=romp-ibm-bsd4.4 ++ ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and +- echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to +- exit ;; # report: romp-ibm BSD 4.3 ++ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ++ ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) +- echo rs6000-bull-bosx +- exit ;; ++ GUESS=rs6000-bull-bosx ++ ;; + DPX/2?00:B.O.S.:*:*) +- echo m68k-bull-sysv3 +- exit ;; ++ GUESS=m68k-bull-sysv3 ++ ;; + 9000/[34]??:4.3bsd:1.*:*) +- echo m68k-hp-bsd +- exit ;; ++ GUESS=m68k-hp-bsd ++ ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) +- echo m68k-hp-bsd4.4 +- exit ;; ++ GUESS=m68k-hp-bsd4.4 ++ ;; + 9000/[34678]??:HP-UX:*:*) +- HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` +- case "$UNAME_MACHINE" in ++ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` ++ case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) +- if [ -x /usr/bin/getconf ]; then ++ if test -x /usr/bin/getconf; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` +- case "$sc_cpu_version" in ++ case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 +- case "$sc_kernel_bits" in ++ case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi +- if [ "$HP_ARCH" = "" ]; then +- eval "$set_cc_for_build" ++ if test "$HP_ARCH" = ""; then ++ set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE +@@ -698,9 +743,9 @@ EOF + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac +- if [ "$HP_ARCH" = hppa2.0w ] ++ if test "$HP_ARCH" = hppa2.0w + then +- eval "$set_cc_for_build" ++ set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler +@@ -719,14 +764,14 @@ EOF + HP_ARCH=hppa64 + fi + fi +- echo "$HP_ARCH"-hp-hpux"$HPUX_REV" +- exit ;; ++ GUESS=$HP_ARCH-hp-hpux$HPUX_REV ++ ;; + ia64:HP-UX:*:*) +- HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` +- echo ia64-hp-hpux"$HPUX_REV" +- exit ;; ++ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` ++ GUESS=ia64-hp-hpux$HPUX_REV ++ ;; + 3050*:HI-UX:*:*) +- eval "$set_cc_for_build" ++ set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int +@@ -754,36 +799,36 @@ EOF + EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } +- echo unknown-hitachi-hiuxwe2 +- exit ;; ++ GUESS=unknown-hitachi-hiuxwe2 ++ ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) +- echo hppa1.1-hp-bsd +- exit ;; ++ GUESS=hppa1.1-hp-bsd ++ ;; + 9000/8??:4.3bsd:*:*) +- echo hppa1.0-hp-bsd +- exit ;; ++ GUESS=hppa1.0-hp-bsd ++ ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) +- echo hppa1.0-hp-mpeix +- exit ;; ++ GUESS=hppa1.0-hp-mpeix ++ ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) +- echo hppa1.1-hp-osf +- exit ;; ++ GUESS=hppa1.1-hp-osf ++ ;; + hp8??:OSF1:*:*) +- echo hppa1.0-hp-osf +- exit ;; ++ GUESS=hppa1.0-hp-osf ++ ;; + i*86:OSF1:*:*) +- if [ -x /usr/sbin/sysversion ] ; then +- echo "$UNAME_MACHINE"-unknown-osf1mk ++ if test -x /usr/sbin/sysversion ; then ++ GUESS=$UNAME_MACHINE-unknown-osf1mk + else +- echo "$UNAME_MACHINE"-unknown-osf1 ++ GUESS=$UNAME_MACHINE-unknown-osf1 + fi +- exit ;; ++ ;; + parisc*:Lites*:*:*) +- echo hppa1.1-hp-lites +- exit ;; ++ GUESS=hppa1.1-hp-lites ++ ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) +- echo c1-convex-bsd +- exit ;; ++ GUESS=c1-convex-bsd ++ ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd +@@ -791,17 +836,18 @@ EOF + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) +- echo c34-convex-bsd +- exit ;; ++ GUESS=c34-convex-bsd ++ ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) +- echo c38-convex-bsd +- exit ;; ++ GUESS=c38-convex-bsd ++ ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) +- echo c4-convex-bsd +- exit ;; ++ GUESS=c4-convex-bsd ++ ;; + CRAY*Y-MP:*:*:*) +- echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' +- exit ;; ++ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` ++ GUESS=ymp-cray-unicos$CRAY_REL ++ ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ +@@ -809,103 +855,129 @@ EOF + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) +- echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' +- exit ;; ++ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` ++ GUESS=t90-cray-unicos$CRAY_REL ++ ;; + CRAY*T3E:*:*:*) +- echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' +- exit ;; ++ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` ++ GUESS=alphaev5-cray-unicosmk$CRAY_REL ++ ;; + CRAY*SV1:*:*:*) +- echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' +- exit ;; ++ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` ++ GUESS=sv1-cray-unicos$CRAY_REL ++ ;; + *:UNICOS/mp:*:*) +- echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' +- exit ;; ++ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` ++ GUESS=craynv-cray-unicosmp$CRAY_REL ++ ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` +- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit ;; ++ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ++ ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` +- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit ;; ++ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ++ ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) +- echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ++ ;; + sparc*:BSD/OS:*:*) +- echo sparc-unknown-bsdi"$UNAME_RELEASE" +- exit ;; ++ GUESS=sparc-unknown-bsdi$UNAME_RELEASE ++ ;; + *:BSD/OS:*:*) +- echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ++ ;; ++ arm:FreeBSD:*:*) ++ UNAME_PROCESSOR=`uname -p` ++ set_cc_for_build ++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_PCS_VFP ++ then ++ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` ++ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi ++ else ++ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` ++ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf ++ fi ++ ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` +- case "$UNAME_PROCESSOR" in ++ case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac +- echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" +- exit ;; ++ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` ++ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ++ ;; + i*:CYGWIN*:*) +- echo "$UNAME_MACHINE"-pc-cygwin +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-cygwin ++ ;; + *:MINGW64*:*) +- echo "$UNAME_MACHINE"-pc-mingw64 +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-mingw64 ++ ;; + *:MINGW*:*) +- echo "$UNAME_MACHINE"-pc-mingw32 +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-mingw32 ++ ;; + *:MSYS*:*) +- echo "$UNAME_MACHINE"-pc-msys +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-msys ++ ;; + i*:PW*:*) +- echo "$UNAME_MACHINE"-pc-pw32 +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-pw32 ++ ;; ++ *:SerenityOS:*:*) ++ GUESS=$UNAME_MACHINE-pc-serenity ++ ;; + *:Interix*:*) +- case "$UNAME_MACHINE" in ++ case $UNAME_MACHINE in + x86) +- echo i586-pc-interix"$UNAME_RELEASE" +- exit ;; ++ GUESS=i586-pc-interix$UNAME_RELEASE ++ ;; + authenticamd | genuineintel | EM64T) +- echo x86_64-unknown-interix"$UNAME_RELEASE" +- exit ;; ++ GUESS=x86_64-unknown-interix$UNAME_RELEASE ++ ;; + IA64) +- echo ia64-unknown-interix"$UNAME_RELEASE" +- exit ;; ++ GUESS=ia64-unknown-interix$UNAME_RELEASE ++ ;; + esac ;; + i*:UWIN*:*) +- echo "$UNAME_MACHINE"-pc-uwin +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-uwin ++ ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) +- echo x86_64-unknown-cygwin +- exit ;; ++ GUESS=x86_64-pc-cygwin ++ ;; + prep*:SunOS:5.*:*) +- echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" +- exit ;; ++ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` ++ GUESS=powerpcle-unknown-solaris2$SUN_REL ++ ;; + *:GNU:*:*) + # the GNU system +- echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" +- exit ;; ++ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` ++ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` ++ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ++ ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland +- echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" +- exit ;; +- i*86:Minix:*:*) +- echo "$UNAME_MACHINE"-pc-minix +- exit ;; ++ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` ++ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` ++ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ++ ;; ++ *:Minix:*:*) ++ GUESS=$UNAME_MACHINE-unknown-minix ++ ;; + aarch64:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + alpha:Linux:*:*) +- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in ++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; +@@ -916,187 +988,225 @@ EOF + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; +- arc:Linux:*:* | arceb:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; ++ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + arm*:Linux:*:*) +- eval "$set_cc_for_build" ++ set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi ++ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf ++ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi +- exit ;; ++ ;; + avr32*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + cris:Linux:*:*) +- echo "$UNAME_MACHINE"-axis-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-axis-linux-$LIBC ++ ;; + crisv32:Linux:*:*) +- echo "$UNAME_MACHINE"-axis-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-axis-linux-$LIBC ++ ;; + e2k:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + frv:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + hexagon:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + i*86:Linux:*:*) +- echo "$UNAME_MACHINE"-pc-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-linux-$LIBC ++ ;; + ia64:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + k1om:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; ++ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + m32r*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + m68*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + mips:Linux:*:* | mips64:Linux:*:*) +- eval "$set_cc_for_build" ++ set_cc_for_build ++ IS_GLIBC=0 ++ test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU +- #undef ${UNAME_MACHINE} +- #undef ${UNAME_MACHINE}el ++ #undef mips ++ #undef mipsel ++ #undef mips64 ++ #undef mips64el ++ #if ${IS_GLIBC} && defined(_ABI64) ++ LIBCABI=gnuabi64 ++ #else ++ #if ${IS_GLIBC} && defined(_ABIN32) ++ LIBCABI=gnuabin32 ++ #else ++ LIBCABI=${LIBC} ++ #endif ++ #endif ++ ++ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 ++ CPU=mipsisa64r6 ++ #else ++ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 ++ CPU=mipsisa32r6 ++ #else ++ #if defined(__mips64) ++ CPU=mips64 ++ #else ++ CPU=mips ++ #endif ++ #endif ++ #endif ++ + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) +- CPU=${UNAME_MACHINE}el ++ MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) +- CPU=${UNAME_MACHINE} ++ MIPS_ENDIAN= + #else +- CPU= ++ MIPS_ENDIAN= + #endif + #endif + EOF +- eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" +- test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ++ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` ++ eval "$cc_set_vars" ++ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + openrisc*:Linux:*:*) +- echo or1k-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=or1k-unknown-linux-$LIBC ++ ;; + or32:Linux:*:* | or1k*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + padre:Linux:*:*) +- echo sparc-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=sparc-unknown-linux-$LIBC ++ ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) +- echo hppa64-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=hppa64-unknown-linux-$LIBC ++ ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in +- PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; +- PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; +- *) echo hppa-unknown-linux-"$LIBC" ;; ++ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; ++ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; ++ *) GUESS=hppa-unknown-linux-$LIBC ;; + esac +- exit ;; ++ ;; + ppc64:Linux:*:*) +- echo powerpc64-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=powerpc64-unknown-linux-$LIBC ++ ;; + ppc:Linux:*:*) +- echo powerpc-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=powerpc-unknown-linux-$LIBC ++ ;; + ppc64le:Linux:*:*) +- echo powerpc64le-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=powerpc64le-unknown-linux-$LIBC ++ ;; + ppcle:Linux:*:*) +- echo powerpcle-unknown-linux-"$LIBC" +- exit ;; +- riscv32:Linux:*:* | riscv64:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=powerpcle-unknown-linux-$LIBC ++ ;; ++ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + s390:Linux:*:* | s390x:Linux:*:*) +- echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ++ ;; + sh64*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + sh*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + sparc:Linux:*:* | sparc64:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + tile*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + vax:Linux:*:*) +- echo "$UNAME_MACHINE"-dec-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-dec-linux-$LIBC ++ ;; + x86_64:Linux:*:*) +- if objdump -f /bin/sh | grep -q elf32-x86-64; then +- echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 +- else +- echo "$UNAME_MACHINE"-pc-linux-"$LIBC" ++ set_cc_for_build ++ LIBCABI=$LIBC ++ if test "$CC_FOR_BUILD" != no_compiler_found; then ++ if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ ++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_X32 >/dev/null ++ then ++ LIBCABI=${LIBC}x32 ++ fi + fi +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ++ ;; + xtensa*:Linux:*:*) +- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ++ ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. +- echo i386-sequent-sysv4 +- exit ;; ++ GUESS=i386-sequent-sysv4 ++ ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. +- echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ++ ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. +- echo "$UNAME_MACHINE"-pc-os2-emx +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-os2-emx ++ ;; + i*86:XTS-300:*:STOP) +- echo "$UNAME_MACHINE"-unknown-stop +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-stop ++ ;; + i*86:atheos:*:*) +- echo "$UNAME_MACHINE"-unknown-atheos +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-atheos ++ ;; + i*86:syllable:*:*) +- echo "$UNAME_MACHINE"-pc-syllable +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-syllable ++ ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) +- echo i386-unknown-lynxos"$UNAME_RELEASE" +- exit ;; ++ GUESS=i386-unknown-lynxos$UNAME_RELEASE ++ ;; + i*86:*DOS:*:*) +- echo "$UNAME_MACHINE"-pc-msdosdjgpp +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-msdosdjgpp ++ ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then +- echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" ++ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else +- echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" ++ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi +- exit ;; ++ ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in +@@ -1104,12 +1214,12 @@ EOF + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac +- echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ++ ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 +@@ -1119,11 +1229,11 @@ EOF + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 +- echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" ++ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else +- echo "$UNAME_MACHINE"-pc-sysv32 ++ GUESS=$UNAME_MACHINE-pc-sysv32 + fi +- exit ;; ++ ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about +@@ -1131,31 +1241,31 @@ EOF + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. +- echo i586-pc-msdosdjgpp +- exit ;; ++ GUESS=i586-pc-msdosdjgpp ++ ;; + Intel:Mach:3*:*) +- echo i386-pc-mach3 +- exit ;; ++ GUESS=i386-pc-mach3 ++ ;; + paragon:*:*:*) +- echo i860-intel-osf1 +- exit ;; ++ GUESS=i860-intel-osf1 ++ ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then +- echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 ++ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. +- echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 ++ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi +- exit ;; ++ ;; + mini*:CTIX:SYS*5:*) + # "miniframe" +- echo m68010-convergent-sysv +- exit ;; ++ GUESS=m68010-convergent-sysv ++ ;; + mc68k:UNIX:SYSTEM5:3.51m) +- echo m68k-convergent-sysv +- exit ;; ++ GUESS=m68k-convergent-sysv ++ ;; + M680?0:D-NIX:5.3:*) +- echo m68k-diab-dnix +- exit ;; ++ GUESS=m68k-diab-dnix ++ ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) +@@ -1180,249 +1290,404 @@ EOF + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) +- echo m68k-unknown-lynxos"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-unknown-lynxos$UNAME_RELEASE ++ ;; + mc68030:UNIX_System_V:4.*:*) +- echo m68k-atari-sysv4 +- exit ;; ++ GUESS=m68k-atari-sysv4 ++ ;; + TSUNAMI:LynxOS:2.*:*) +- echo sparc-unknown-lynxos"$UNAME_RELEASE" +- exit ;; ++ GUESS=sparc-unknown-lynxos$UNAME_RELEASE ++ ;; + rs6000:LynxOS:2.*:*) +- echo rs6000-unknown-lynxos"$UNAME_RELEASE" +- exit ;; ++ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ++ ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) +- echo powerpc-unknown-lynxos"$UNAME_RELEASE" +- exit ;; ++ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ++ ;; + SM[BE]S:UNIX_SV:*:*) +- echo mips-dde-sysv"$UNAME_RELEASE" +- exit ;; ++ GUESS=mips-dde-sysv$UNAME_RELEASE ++ ;; + RM*:ReliantUNIX-*:*:*) +- echo mips-sni-sysv4 +- exit ;; ++ GUESS=mips-sni-sysv4 ++ ;; + RM*:SINIX-*:*:*) +- echo mips-sni-sysv4 +- exit ;; ++ GUESS=mips-sni-sysv4 ++ ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` +- echo "$UNAME_MACHINE"-sni-sysv4 ++ GUESS=$UNAME_MACHINE-sni-sysv4 + else +- echo ns32k-sni-sysv ++ GUESS=ns32k-sni-sysv + fi +- exit ;; ++ ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says +- echo i586-unisys-sysv4 +- exit ;; ++ GUESS=i586-unisys-sysv4 ++ ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm +- echo hppa1.1-stratus-sysv4 +- exit ;; ++ GUESS=hppa1.1-stratus-sysv4 ++ ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. +- echo i860-stratus-sysv4 +- exit ;; ++ GUESS=i860-stratus-sysv4 ++ ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. +- echo "$UNAME_MACHINE"-stratus-vos +- exit ;; ++ GUESS=$UNAME_MACHINE-stratus-vos ++ ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. +- echo hppa1.1-stratus-vos +- exit ;; ++ GUESS=hppa1.1-stratus-vos ++ ;; + mc68*:A/UX:*:*) +- echo m68k-apple-aux"$UNAME_RELEASE" +- exit ;; ++ GUESS=m68k-apple-aux$UNAME_RELEASE ++ ;; + news*:NEWS-OS:6*:*) +- echo mips-sony-newsos6 +- exit ;; ++ GUESS=mips-sony-newsos6 ++ ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) +- if [ -d /usr/nec ]; then +- echo mips-nec-sysv"$UNAME_RELEASE" ++ if test -d /usr/nec; then ++ GUESS=mips-nec-sysv$UNAME_RELEASE + else +- echo mips-unknown-sysv"$UNAME_RELEASE" ++ GUESS=mips-unknown-sysv$UNAME_RELEASE + fi +- exit ;; ++ ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. +- echo powerpc-be-beos +- exit ;; ++ GUESS=powerpc-be-beos ++ ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. +- echo powerpc-apple-beos +- exit ;; ++ GUESS=powerpc-apple-beos ++ ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. +- echo i586-pc-beos +- exit ;; ++ GUESS=i586-pc-beos ++ ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. +- echo i586-pc-haiku +- exit ;; ++ GUESS=i586-pc-haiku ++ ;; + x86_64:Haiku:*:*) +- echo x86_64-unknown-haiku +- exit ;; ++ GUESS=x86_64-unknown-haiku ++ ;; + SX-4:SUPER-UX:*:*) +- echo sx4-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sx4-nec-superux$UNAME_RELEASE ++ ;; + SX-5:SUPER-UX:*:*) +- echo sx5-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sx5-nec-superux$UNAME_RELEASE ++ ;; + SX-6:SUPER-UX:*:*) +- echo sx6-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sx6-nec-superux$UNAME_RELEASE ++ ;; + SX-7:SUPER-UX:*:*) +- echo sx7-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sx7-nec-superux$UNAME_RELEASE ++ ;; + SX-8:SUPER-UX:*:*) +- echo sx8-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sx8-nec-superux$UNAME_RELEASE ++ ;; + SX-8R:SUPER-UX:*:*) +- echo sx8r-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sx8r-nec-superux$UNAME_RELEASE ++ ;; + SX-ACE:SUPER-UX:*:*) +- echo sxace-nec-superux"$UNAME_RELEASE" +- exit ;; ++ GUESS=sxace-nec-superux$UNAME_RELEASE ++ ;; + Power*:Rhapsody:*:*) +- echo powerpc-apple-rhapsody"$UNAME_RELEASE" +- exit ;; ++ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ++ ;; + *:Rhapsody:*:*) +- echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ++ ;; ++ arm64:Darwin:*:*) ++ GUESS=aarch64-apple-darwin$UNAME_RELEASE ++ ;; + *:Darwin:*:*) +- UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown +- eval "$set_cc_for_build" +- if test "$UNAME_PROCESSOR" = unknown ; then +- UNAME_PROCESSOR=powerpc +- fi +- if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then +- if [ "$CC_FOR_BUILD" != no_compiler_found ]; then +- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ +- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ +- grep IS_64BIT_ARCH >/dev/null +- then +- case $UNAME_PROCESSOR in +- i386) UNAME_PROCESSOR=x86_64 ;; +- powerpc) UNAME_PROCESSOR=powerpc64 ;; +- esac +- fi +- # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc +- if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ +- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ +- grep IS_PPC >/dev/null +- then +- UNAME_PROCESSOR=powerpc +- fi ++ UNAME_PROCESSOR=`uname -p` ++ case $UNAME_PROCESSOR in ++ unknown) UNAME_PROCESSOR=powerpc ;; ++ esac ++ if command -v xcode-select > /dev/null 2> /dev/null && \ ++ ! xcode-select --print-path > /dev/null 2> /dev/null ; then ++ # Avoid executing cc if there is no toolchain installed as ++ # cc will be a stub that puts up a graphical alert ++ # prompting the user to install developer tools. ++ CC_FOR_BUILD=no_compiler_found ++ else ++ set_cc_for_build ++ fi ++ if test "$CC_FOR_BUILD" != no_compiler_found; then ++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ ++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null ++ then ++ case $UNAME_PROCESSOR in ++ i386) UNAME_PROCESSOR=x86_64 ;; ++ powerpc) UNAME_PROCESSOR=powerpc64 ;; ++ esac ++ fi ++ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc ++ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ ++ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_PPC >/dev/null ++ then ++ UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then +- # Avoid executing cc on OS X 10.9, as it ships with a stub +- # that puts up a graphical alert prompting to install +- # developer tools. Any system running Mac OS X 10.7 or +- # later (Darwin 11 and later) is required to have a 64-bit +- # processor. This is not true of the ARM version of Darwin +- # that Apple uses in portable devices. +- UNAME_PROCESSOR=x86_64 ++ # uname -m returns i386 or x86_64 ++ UNAME_PROCESSOR=$UNAME_MACHINE + fi +- echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ++ ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi +- echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ++ ;; + *:QNX:*:4*) +- echo i386-pc-qnx +- exit ;; ++ GUESS=i386-pc-qnx ++ ;; + NEO-*:NONSTOP_KERNEL:*:*) +- echo neo-tandem-nsk"$UNAME_RELEASE" +- exit ;; ++ GUESS=neo-tandem-nsk$UNAME_RELEASE ++ ;; + NSE-*:NONSTOP_KERNEL:*:*) +- echo nse-tandem-nsk"$UNAME_RELEASE" +- exit ;; ++ GUESS=nse-tandem-nsk$UNAME_RELEASE ++ ;; + NSR-*:NONSTOP_KERNEL:*:*) +- echo nsr-tandem-nsk"$UNAME_RELEASE" +- exit ;; ++ GUESS=nsr-tandem-nsk$UNAME_RELEASE ++ ;; + NSV-*:NONSTOP_KERNEL:*:*) +- echo nsv-tandem-nsk"$UNAME_RELEASE" +- exit ;; ++ GUESS=nsv-tandem-nsk$UNAME_RELEASE ++ ;; + NSX-*:NONSTOP_KERNEL:*:*) +- echo nsx-tandem-nsk"$UNAME_RELEASE" +- exit ;; ++ GUESS=nsx-tandem-nsk$UNAME_RELEASE ++ ;; + *:NonStop-UX:*:*) +- echo mips-compaq-nonstopux +- exit ;; ++ GUESS=mips-compaq-nonstopux ++ ;; + BS2000:POSIX*:*:*) +- echo bs2000-siemens-sysv +- exit ;; ++ GUESS=bs2000-siemens-sysv ++ ;; + DS/*:UNIX_System_V:*:*) +- echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" +- exit ;; ++ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ++ ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. +- if test "$cputype" = 386; then ++ if test "${cputype-}" = 386; then + UNAME_MACHINE=i386 +- else +- UNAME_MACHINE="$cputype" ++ elif test "x${cputype-}" != x; then ++ UNAME_MACHINE=$cputype + fi +- echo "$UNAME_MACHINE"-unknown-plan9 +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-plan9 ++ ;; + *:TOPS-10:*:*) +- echo pdp10-unknown-tops10 +- exit ;; ++ GUESS=pdp10-unknown-tops10 ++ ;; + *:TENEX:*:*) +- echo pdp10-unknown-tenex +- exit ;; ++ GUESS=pdp10-unknown-tenex ++ ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) +- echo pdp10-dec-tops20 +- exit ;; ++ GUESS=pdp10-dec-tops20 ++ ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) +- echo pdp10-xkl-tops20 +- exit ;; ++ GUESS=pdp10-xkl-tops20 ++ ;; + *:TOPS-20:*:*) +- echo pdp10-unknown-tops20 +- exit ;; ++ GUESS=pdp10-unknown-tops20 ++ ;; + *:ITS:*:*) +- echo pdp10-unknown-its +- exit ;; ++ GUESS=pdp10-unknown-its ++ ;; + SEI:*:*:SEIUX) +- echo mips-sei-seiux"$UNAME_RELEASE" +- exit ;; ++ GUESS=mips-sei-seiux$UNAME_RELEASE ++ ;; + *:DragonFly:*:*) +- echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" +- exit ;; ++ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` ++ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ++ ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` +- case "$UNAME_MACHINE" in +- A*) echo alpha-dec-vms ; exit ;; +- I*) echo ia64-dec-vms ; exit ;; +- V*) echo vax-dec-vms ; exit ;; ++ case $UNAME_MACHINE in ++ A*) GUESS=alpha-dec-vms ;; ++ I*) GUESS=ia64-dec-vms ;; ++ V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) +- echo i386-pc-xenix +- exit ;; ++ GUESS=i386-pc-xenix ++ ;; + i*86:skyos:*:*) +- echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" +- exit ;; ++ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` ++ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ++ ;; + i*86:rdos:*:*) +- echo "$UNAME_MACHINE"-pc-rdos +- exit ;; +- i*86:AROS:*:*) +- echo "$UNAME_MACHINE"-pc-aros +- exit ;; ++ GUESS=$UNAME_MACHINE-pc-rdos ++ ;; ++ i*86:Fiwix:*:*) ++ GUESS=$UNAME_MACHINE-pc-fiwix ++ ;; ++ *:AROS:*:*) ++ GUESS=$UNAME_MACHINE-unknown-aros ++ ;; + x86_64:VMkernel:*:*) +- echo "$UNAME_MACHINE"-unknown-esx +- exit ;; ++ GUESS=$UNAME_MACHINE-unknown-esx ++ ;; + amd64:Isilon\ OneFS:*:*) +- echo x86_64-unknown-onefs +- exit ;; ++ GUESS=x86_64-unknown-onefs ++ ;; ++ *:Unleashed:*:*) ++ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ++ ;; + esac + ++# Do we have a guess based on uname results? ++if test "x$GUESS" != x; then ++ echo "$GUESS" ++ exit ++fi ++ ++# No uname command or uname output not recognized. ++set_cc_for_build ++cat > "$dummy.c" < ++#include ++#endif ++#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) ++#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) ++#include ++#if defined(_SIZE_T_) || defined(SIGLOST) ++#include ++#endif ++#endif ++#endif ++main () ++{ ++#if defined (sony) ++#if defined (MIPSEB) ++ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, ++ I don't know.... */ ++ printf ("mips-sony-bsd\n"); exit (0); ++#else ++#include ++ printf ("m68k-sony-newsos%s\n", ++#ifdef NEWSOS4 ++ "4" ++#else ++ "" ++#endif ++ ); exit (0); ++#endif ++#endif ++ ++#if defined (NeXT) ++#if !defined (__ARCHITECTURE__) ++#define __ARCHITECTURE__ "m68k" ++#endif ++ int version; ++ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; ++ if (version < 4) ++ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); ++ else ++ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); ++ exit (0); ++#endif ++ ++#if defined (MULTIMAX) || defined (n16) ++#if defined (UMAXV) ++ printf ("ns32k-encore-sysv\n"); exit (0); ++#else ++#if defined (CMU) ++ printf ("ns32k-encore-mach\n"); exit (0); ++#else ++ printf ("ns32k-encore-bsd\n"); exit (0); ++#endif ++#endif ++#endif ++ ++#if defined (__386BSD__) ++ printf ("i386-pc-bsd\n"); exit (0); ++#endif ++ ++#if defined (sequent) ++#if defined (i386) ++ printf ("i386-sequent-dynix\n"); exit (0); ++#endif ++#if defined (ns32000) ++ printf ("ns32k-sequent-dynix\n"); exit (0); ++#endif ++#endif ++ ++#if defined (_SEQUENT_) ++ struct utsname un; ++ ++ uname(&un); ++ if (strncmp(un.version, "V2", 2) == 0) { ++ printf ("i386-sequent-ptx2\n"); exit (0); ++ } ++ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ ++ printf ("i386-sequent-ptx1\n"); exit (0); ++ } ++ printf ("i386-sequent-ptx\n"); exit (0); ++#endif ++ ++#if defined (vax) ++#if !defined (ultrix) ++#include ++#if defined (BSD) ++#if BSD == 43 ++ printf ("vax-dec-bsd4.3\n"); exit (0); ++#else ++#if BSD == 199006 ++ printf ("vax-dec-bsd4.3reno\n"); exit (0); ++#else ++ printf ("vax-dec-bsd\n"); exit (0); ++#endif ++#endif ++#else ++ printf ("vax-dec-bsd\n"); exit (0); ++#endif ++#else ++#if defined(_SIZE_T_) || defined(SIGLOST) ++ struct utsname un; ++ uname (&un); ++ printf ("vax-dec-ultrix%s\n", un.release); exit (0); ++#else ++ printf ("vax-dec-ultrix\n"); exit (0); ++#endif ++#endif ++#endif ++#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) ++#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) ++#if defined(_SIZE_T_) || defined(SIGLOST) ++ struct utsname *un; ++ uname (&un); ++ printf ("mips-dec-ultrix%s\n", un.release); exit (0); ++#else ++ printf ("mips-dec-ultrix\n"); exit (0); ++#endif ++#endif ++#endif ++ ++#if defined (alliant) && defined (i860) ++ printf ("i860-alliant-bsd\n"); exit (0); ++#endif ++ ++ exit (1); ++} ++EOF ++ ++$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && ++ { echo "$SYSTEM_NAME"; exit; } ++ ++# Apollos put the system type in the environment. ++test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } ++ + echo "$0: unable to guess system type" >&2 + +-case "$UNAME_MACHINE:$UNAME_SYSTEM" in ++case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 + exit 1 ;; + + *local*) +@@ -110,1223 +119,1186 @@ case $# in + exit 1;; + esac + +-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +-# Here we must recognize all the valid KERNEL-OS combinations. +-maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +-case $maybe_os in +- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ +- linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ +- knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ +- kopensolaris*-gnu* | cloudabi*-eabi* | \ +- storm-chaos* | os2-emx* | rtmk-nova*) +- os=-$maybe_os +- basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` +- ;; +- android-linux) +- os=-linux-android +- basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown +- ;; +- *) +- basic_machine=`echo "$1" | sed 's/-[^-]*$//'` +- if [ "$basic_machine" != "$1" ] +- then os=`echo "$1" | sed 's/.*-/-/'` +- else os=; fi +- ;; +-esac +- +-### Let's recognize common machines as not being operating systems so +-### that things like config.sub decstation-3100 work. We also +-### recognize some manufacturers as not being operating systems, so we +-### can provide default operating systems below. +-case $os in +- -sun*os*) +- # Prevent following clause from handling this invalid input. +- ;; +- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ +- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ +- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ +- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ +- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ +- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis | -knuth | -cray | -microblaze*) +- os= +- basic_machine=$1 +- ;; +- -bluegene*) +- os=-cnk +- ;; +- -sim | -cisco | -oki | -wec | -winbond) +- os= +- basic_machine=$1 +- ;; +- -scout) +- ;; +- -wrs) +- os=-vxworks +- basic_machine=$1 +- ;; +- -chorusos*) +- os=-chorusos +- basic_machine=$1 +- ;; +- -chorusrdb) +- os=-chorusrdb +- basic_machine=$1 +- ;; +- -hiux*) +- os=-hiuxwe2 +- ;; +- -sco6) +- os=-sco5v6 +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -sco5) +- os=-sco3.2v5 +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -sco4) +- os=-sco3.2v4 +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -sco3.2.[4-9]*) +- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -sco3.2v[4-9]*) +- # Don't forget version if it is 3.2v4 or newer. +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -sco5v6*) +- # Don't forget version if it is 3.2v4 or newer. +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -sco*) +- os=-sco3.2v2 +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -udk*) +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -isc) +- os=-isc2.2 +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -clix*) +- basic_machine=clipper-intergraph +- ;; +- -isc*) +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` +- ;; +- -lynx*178) +- os=-lynxos178 +- ;; +- -lynx*5) +- os=-lynxos5 ++# Split fields of configuration type ++# shellcheck disable=SC2162 ++saved_IFS=$IFS ++IFS="-" read field1 field2 field3 field4 <&2 ++ exit 1 + ;; +- -lynx*) +- os=-lynxos ++ *-*-*-*) ++ basic_machine=$field1-$field2 ++ basic_os=$field3-$field4 + ;; +- -ptx*) +- basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ++ *-*-*) ++ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two ++ # parts ++ maybe_os=$field2-$field3 ++ case $maybe_os in ++ nto-qnx* | linux-* | uclinux-uclibc* \ ++ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ ++ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ ++ | storm-chaos* | os2-emx* | rtmk-nova*) ++ basic_machine=$field1 ++ basic_os=$maybe_os ++ ;; ++ android-linux) ++ basic_machine=$field1-unknown ++ basic_os=linux-android ++ ;; ++ *) ++ basic_machine=$field1-$field2 ++ basic_os=$field3 ++ ;; ++ esac + ;; +- -psos*) +- os=-psos ++ *-*) ++ # A lone config we happen to match not fitting any pattern ++ case $field1-$field2 in ++ decstation-3100) ++ basic_machine=mips-dec ++ basic_os= ++ ;; ++ *-*) ++ # Second component is usually, but not always the OS ++ case $field2 in ++ # Prevent following clause from handling this valid os ++ sun*os*) ++ basic_machine=$field1 ++ basic_os=$field2 ++ ;; ++ zephyr*) ++ basic_machine=$field1-unknown ++ basic_os=$field2 ++ ;; ++ # Manufacturers ++ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ ++ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ ++ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ ++ | convergent* | ncr* | news | 32* | 3600* | 3100* \ ++ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ ++ | ultra | tti* | harris | dolphin | highlevel | gould \ ++ | cbm | ns | masscomp | apple | axis | knuth | cray \ ++ | microblaze* | sim | cisco \ ++ | oki | wec | wrs | winbond) ++ basic_machine=$field1-$field2 ++ basic_os= ++ ;; ++ *) ++ basic_machine=$field1 ++ basic_os=$field2 ++ ;; ++ esac ++ ;; ++ esac + ;; +- -mint | -mint[0-9]*) +- basic_machine=m68k-atari +- os=-mint ++ *) ++ # Convert single-component short-hands not valid as part of ++ # multi-component configurations. ++ case $field1 in ++ 386bsd) ++ basic_machine=i386-pc ++ basic_os=bsd ++ ;; ++ a29khif) ++ basic_machine=a29k-amd ++ basic_os=udi ++ ;; ++ adobe68k) ++ basic_machine=m68010-adobe ++ basic_os=scout ++ ;; ++ alliant) ++ basic_machine=fx80-alliant ++ basic_os= ++ ;; ++ altos | altos3068) ++ basic_machine=m68k-altos ++ basic_os= ++ ;; ++ am29k) ++ basic_machine=a29k-none ++ basic_os=bsd ++ ;; ++ amdahl) ++ basic_machine=580-amdahl ++ basic_os=sysv ++ ;; ++ amiga) ++ basic_machine=m68k-unknown ++ basic_os= ++ ;; ++ amigaos | amigados) ++ basic_machine=m68k-unknown ++ basic_os=amigaos ++ ;; ++ amigaunix | amix) ++ basic_machine=m68k-unknown ++ basic_os=sysv4 ++ ;; ++ apollo68) ++ basic_machine=m68k-apollo ++ basic_os=sysv ++ ;; ++ apollo68bsd) ++ basic_machine=m68k-apollo ++ basic_os=bsd ++ ;; ++ aros) ++ basic_machine=i386-pc ++ basic_os=aros ++ ;; ++ aux) ++ basic_machine=m68k-apple ++ basic_os=aux ++ ;; ++ balance) ++ basic_machine=ns32k-sequent ++ basic_os=dynix ++ ;; ++ blackfin) ++ basic_machine=bfin-unknown ++ basic_os=linux ++ ;; ++ cegcc) ++ basic_machine=arm-unknown ++ basic_os=cegcc ++ ;; ++ convex-c1) ++ basic_machine=c1-convex ++ basic_os=bsd ++ ;; ++ convex-c2) ++ basic_machine=c2-convex ++ basic_os=bsd ++ ;; ++ convex-c32) ++ basic_machine=c32-convex ++ basic_os=bsd ++ ;; ++ convex-c34) ++ basic_machine=c34-convex ++ basic_os=bsd ++ ;; ++ convex-c38) ++ basic_machine=c38-convex ++ basic_os=bsd ++ ;; ++ cray) ++ basic_machine=j90-cray ++ basic_os=unicos ++ ;; ++ crds | unos) ++ basic_machine=m68k-crds ++ basic_os= ++ ;; ++ da30) ++ basic_machine=m68k-da30 ++ basic_os= ++ ;; ++ decstation | pmax | pmin | dec3100 | decstatn) ++ basic_machine=mips-dec ++ basic_os= ++ ;; ++ delta88) ++ basic_machine=m88k-motorola ++ basic_os=sysv3 ++ ;; ++ dicos) ++ basic_machine=i686-pc ++ basic_os=dicos ++ ;; ++ djgpp) ++ basic_machine=i586-pc ++ basic_os=msdosdjgpp ++ ;; ++ ebmon29k) ++ basic_machine=a29k-amd ++ basic_os=ebmon ++ ;; ++ es1800 | OSE68k | ose68k | ose | OSE) ++ basic_machine=m68k-ericsson ++ basic_os=ose ++ ;; ++ gmicro) ++ basic_machine=tron-gmicro ++ basic_os=sysv ++ ;; ++ go32) ++ basic_machine=i386-pc ++ basic_os=go32 ++ ;; ++ h8300hms) ++ basic_machine=h8300-hitachi ++ basic_os=hms ++ ;; ++ h8300xray) ++ basic_machine=h8300-hitachi ++ basic_os=xray ++ ;; ++ h8500hms) ++ basic_machine=h8500-hitachi ++ basic_os=hms ++ ;; ++ harris) ++ basic_machine=m88k-harris ++ basic_os=sysv3 ++ ;; ++ hp300 | hp300hpux) ++ basic_machine=m68k-hp ++ basic_os=hpux ++ ;; ++ hp300bsd) ++ basic_machine=m68k-hp ++ basic_os=bsd ++ ;; ++ hppaosf) ++ basic_machine=hppa1.1-hp ++ basic_os=osf ++ ;; ++ hppro) ++ basic_machine=hppa1.1-hp ++ basic_os=proelf ++ ;; ++ i386mach) ++ basic_machine=i386-mach ++ basic_os=mach ++ ;; ++ isi68 | isi) ++ basic_machine=m68k-isi ++ basic_os=sysv ++ ;; ++ m68knommu) ++ basic_machine=m68k-unknown ++ basic_os=linux ++ ;; ++ magnum | m3230) ++ basic_machine=mips-mips ++ basic_os=sysv ++ ;; ++ merlin) ++ basic_machine=ns32k-utek ++ basic_os=sysv ++ ;; ++ mingw64) ++ basic_machine=x86_64-pc ++ basic_os=mingw64 ++ ;; ++ mingw32) ++ basic_machine=i686-pc ++ basic_os=mingw32 ++ ;; ++ mingw32ce) ++ basic_machine=arm-unknown ++ basic_os=mingw32ce ++ ;; ++ monitor) ++ basic_machine=m68k-rom68k ++ basic_os=coff ++ ;; ++ morphos) ++ basic_machine=powerpc-unknown ++ basic_os=morphos ++ ;; ++ moxiebox) ++ basic_machine=moxie-unknown ++ basic_os=moxiebox ++ ;; ++ msdos) ++ basic_machine=i386-pc ++ basic_os=msdos ++ ;; ++ msys) ++ basic_machine=i686-pc ++ basic_os=msys ++ ;; ++ mvs) ++ basic_machine=i370-ibm ++ basic_os=mvs ++ ;; ++ nacl) ++ basic_machine=le32-unknown ++ basic_os=nacl ++ ;; ++ ncr3000) ++ basic_machine=i486-ncr ++ basic_os=sysv4 ++ ;; ++ netbsd386) ++ basic_machine=i386-pc ++ basic_os=netbsd ++ ;; ++ netwinder) ++ basic_machine=armv4l-rebel ++ basic_os=linux ++ ;; ++ news | news700 | news800 | news900) ++ basic_machine=m68k-sony ++ basic_os=newsos ++ ;; ++ news1000) ++ basic_machine=m68030-sony ++ basic_os=newsos ++ ;; ++ necv70) ++ basic_machine=v70-nec ++ basic_os=sysv ++ ;; ++ nh3000) ++ basic_machine=m68k-harris ++ basic_os=cxux ++ ;; ++ nh[45]000) ++ basic_machine=m88k-harris ++ basic_os=cxux ++ ;; ++ nindy960) ++ basic_machine=i960-intel ++ basic_os=nindy ++ ;; ++ mon960) ++ basic_machine=i960-intel ++ basic_os=mon960 ++ ;; ++ nonstopux) ++ basic_machine=mips-compaq ++ basic_os=nonstopux ++ ;; ++ os400) ++ basic_machine=powerpc-ibm ++ basic_os=os400 ++ ;; ++ OSE68000 | ose68000) ++ basic_machine=m68000-ericsson ++ basic_os=ose ++ ;; ++ os68k) ++ basic_machine=m68k-none ++ basic_os=os68k ++ ;; ++ paragon) ++ basic_machine=i860-intel ++ basic_os=osf ++ ;; ++ parisc) ++ basic_machine=hppa-unknown ++ basic_os=linux ++ ;; ++ psp) ++ basic_machine=mipsallegrexel-sony ++ basic_os=psp ++ ;; ++ pw32) ++ basic_machine=i586-unknown ++ basic_os=pw32 ++ ;; ++ rdos | rdos64) ++ basic_machine=x86_64-pc ++ basic_os=rdos ++ ;; ++ rdos32) ++ basic_machine=i386-pc ++ basic_os=rdos ++ ;; ++ rom68k) ++ basic_machine=m68k-rom68k ++ basic_os=coff ++ ;; ++ sa29200) ++ basic_machine=a29k-amd ++ basic_os=udi ++ ;; ++ sei) ++ basic_machine=mips-sei ++ basic_os=seiux ++ ;; ++ sequent) ++ basic_machine=i386-sequent ++ basic_os= ++ ;; ++ sps7) ++ basic_machine=m68k-bull ++ basic_os=sysv2 ++ ;; ++ st2000) ++ basic_machine=m68k-tandem ++ basic_os= ++ ;; ++ stratus) ++ basic_machine=i860-stratus ++ basic_os=sysv4 ++ ;; ++ sun2) ++ basic_machine=m68000-sun ++ basic_os= ++ ;; ++ sun2os3) ++ basic_machine=m68000-sun ++ basic_os=sunos3 ++ ;; ++ sun2os4) ++ basic_machine=m68000-sun ++ basic_os=sunos4 ++ ;; ++ sun3) ++ basic_machine=m68k-sun ++ basic_os= ++ ;; ++ sun3os3) ++ basic_machine=m68k-sun ++ basic_os=sunos3 ++ ;; ++ sun3os4) ++ basic_machine=m68k-sun ++ basic_os=sunos4 ++ ;; ++ sun4) ++ basic_machine=sparc-sun ++ basic_os= ++ ;; ++ sun4os3) ++ basic_machine=sparc-sun ++ basic_os=sunos3 ++ ;; ++ sun4os4) ++ basic_machine=sparc-sun ++ basic_os=sunos4 ++ ;; ++ sun4sol2) ++ basic_machine=sparc-sun ++ basic_os=solaris2 ++ ;; ++ sun386 | sun386i | roadrunner) ++ basic_machine=i386-sun ++ basic_os= ++ ;; ++ sv1) ++ basic_machine=sv1-cray ++ basic_os=unicos ++ ;; ++ symmetry) ++ basic_machine=i386-sequent ++ basic_os=dynix ++ ;; ++ t3e) ++ basic_machine=alphaev5-cray ++ basic_os=unicos ++ ;; ++ t90) ++ basic_machine=t90-cray ++ basic_os=unicos ++ ;; ++ toad1) ++ basic_machine=pdp10-xkl ++ basic_os=tops20 ++ ;; ++ tpf) ++ basic_machine=s390x-ibm ++ basic_os=tpf ++ ;; ++ udi29k) ++ basic_machine=a29k-amd ++ basic_os=udi ++ ;; ++ ultra3) ++ basic_machine=a29k-nyu ++ basic_os=sym1 ++ ;; ++ v810 | necv810) ++ basic_machine=v810-nec ++ basic_os=none ++ ;; ++ vaxv) ++ basic_machine=vax-dec ++ basic_os=sysv ++ ;; ++ vms) ++ basic_machine=vax-dec ++ basic_os=vms ++ ;; ++ vsta) ++ basic_machine=i386-pc ++ basic_os=vsta ++ ;; ++ vxworks960) ++ basic_machine=i960-wrs ++ basic_os=vxworks ++ ;; ++ vxworks68) ++ basic_machine=m68k-wrs ++ basic_os=vxworks ++ ;; ++ vxworks29k) ++ basic_machine=a29k-wrs ++ basic_os=vxworks ++ ;; ++ xbox) ++ basic_machine=i686-pc ++ basic_os=mingw32 ++ ;; ++ ymp) ++ basic_machine=ymp-cray ++ basic_os=unicos ++ ;; ++ *) ++ basic_machine=$1 ++ basic_os= ++ ;; ++ esac + ;; + esac + +-# Decode aliases for certain CPU-COMPANY combinations. ++# Decode 1-component or ad-hoc basic machines + case $basic_machine in +- # Recognize the basic CPU types without company name. +- # Some are omitted here because they have special meanings below. +- 1750a | 580 \ +- | a29k \ +- | aarch64 | aarch64_be \ +- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ +- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ +- | am33_2.0 \ +- | arc | arceb \ +- | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ +- | avr | avr32 \ +- | ba \ +- | be32 | be64 \ +- | bfin \ +- | c4x | c8051 | clipper \ +- | d10v | d30v | dlx | dsp16xx \ +- | e2k | epiphany \ +- | fido | fr30 | frv | ft32 \ +- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ +- | hexagon \ +- | i370 | i860 | i960 | ia16 | ia64 \ +- | ip2k | iq2000 \ +- | k1om \ +- | le32 | le64 \ +- | lm32 \ +- | m32c | m32r | m32rle | m68000 | m68k | m88k \ +- | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ +- | mips | mipsbe | mipseb | mipsel | mipsle \ +- | mips16 \ +- | mips64 | mips64el \ +- | mips64octeon | mips64octeonel \ +- | mips64orion | mips64orionel \ +- | mips64r5900 | mips64r5900el \ +- | mips64vr | mips64vrel \ +- | mips64vr4100 | mips64vr4100el \ +- | mips64vr4300 | mips64vr4300el \ +- | mips64vr5000 | mips64vr5000el \ +- | mips64vr5900 | mips64vr5900el \ +- | mipsisa32 | mipsisa32el \ +- | mipsisa32r2 | mipsisa32r2el \ +- | mipsisa32r6 | mipsisa32r6el \ +- | mipsisa64 | mipsisa64el \ +- | mipsisa64r2 | mipsisa64r2el \ +- | mipsisa64r6 | mipsisa64r6el \ +- | mipsisa64sb1 | mipsisa64sb1el \ +- | mipsisa64sr71k | mipsisa64sr71kel \ +- | mipsr5900 | mipsr5900el \ +- | mipstx39 | mipstx39el \ +- | mn10200 | mn10300 \ +- | moxie \ +- | mt \ +- | msp430 \ +- | nds32 | nds32le | nds32be \ +- | nios | nios2 | nios2eb | nios2el \ +- | ns16k | ns32k \ +- | open8 | or1k | or1knd | or32 \ +- | pdp10 | pj | pjl \ +- | powerpc | powerpc64 | powerpc64le | powerpcle \ +- | pru \ +- | pyramid \ +- | riscv32 | riscv64 \ +- | rl78 | rx \ +- | score \ +- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ +- | sh64 | sh64le \ +- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ +- | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ +- | spu \ +- | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ +- | ubicom32 \ +- | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ +- | visium \ +- | wasm32 \ +- | x86 | xc16x | xstormy16 | xtensa \ +- | z8k | z80) +- basic_machine=$basic_machine-unknown +- ;; +- c54x) +- basic_machine=tic54x-unknown +- ;; +- c55x) +- basic_machine=tic55x-unknown +- ;; +- c6x) +- basic_machine=tic6x-unknown +- ;; +- leon|leon[3-9]) +- basic_machine=sparc-$basic_machine +- ;; +- m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) +- basic_machine=$basic_machine-unknown +- os=-none ++ # Here we handle the default manufacturer of certain CPU types. It is in ++ # some cases the only manufacturer, in others, it is the most popular. ++ w89k) ++ cpu=hppa1.1 ++ vendor=winbond + ;; +- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ++ op50n) ++ cpu=hppa1.1 ++ vendor=oki + ;; +- ms1) +- basic_machine=mt-unknown ++ op60c) ++ cpu=hppa1.1 ++ vendor=oki + ;; +- +- strongarm | thumb | xscale) +- basic_machine=arm-unknown ++ ibm*) ++ cpu=i370 ++ vendor=ibm + ;; +- xgate) +- basic_machine=$basic_machine-unknown +- os=-none ++ orion105) ++ cpu=clipper ++ vendor=highlevel + ;; +- xscaleeb) +- basic_machine=armeb-unknown ++ mac | mpw | mac-mpw) ++ cpu=m68k ++ vendor=apple + ;; +- +- xscaleel) +- basic_machine=armel-unknown ++ pmac | pmac-mpw) ++ cpu=powerpc ++ vendor=apple + ;; + +- # We use `pc' rather than `unknown' +- # because (1) that's what they normally are, and +- # (2) the word "unknown" tends to confuse beginning users. +- i*86 | x86_64) +- basic_machine=$basic_machine-pc +- ;; +- # Object if more than one company name word. +- *-*-*) +- echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 +- exit 1 +- ;; +- # Recognize the basic CPU types with company name. +- 580-* \ +- | a29k-* \ +- | aarch64-* | aarch64_be-* \ +- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ +- | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ +- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ +- | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ +- | avr-* | avr32-* \ +- | ba-* \ +- | be32-* | be64-* \ +- | bfin-* | bs2000-* \ +- | c[123]* | c30-* | [cjt]90-* | c4x-* \ +- | c8051-* | clipper-* | craynv-* | cydra-* \ +- | d10v-* | d30v-* | dlx-* \ +- | e2k-* | elxsi-* \ +- | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ +- | h8300-* | h8500-* \ +- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ +- | hexagon-* \ +- | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ +- | ip2k-* | iq2000-* \ +- | k1om-* \ +- | le32-* | le64-* \ +- | lm32-* \ +- | m32c-* | m32r-* | m32rle-* \ +- | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ +- | microblaze-* | microblazeel-* \ +- | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ +- | mips16-* \ +- | mips64-* | mips64el-* \ +- | mips64octeon-* | mips64octeonel-* \ +- | mips64orion-* | mips64orionel-* \ +- | mips64r5900-* | mips64r5900el-* \ +- | mips64vr-* | mips64vrel-* \ +- | mips64vr4100-* | mips64vr4100el-* \ +- | mips64vr4300-* | mips64vr4300el-* \ +- | mips64vr5000-* | mips64vr5000el-* \ +- | mips64vr5900-* | mips64vr5900el-* \ +- | mipsisa32-* | mipsisa32el-* \ +- | mipsisa32r2-* | mipsisa32r2el-* \ +- | mipsisa32r6-* | mipsisa32r6el-* \ +- | mipsisa64-* | mipsisa64el-* \ +- | mipsisa64r2-* | mipsisa64r2el-* \ +- | mipsisa64r6-* | mipsisa64r6el-* \ +- | mipsisa64sb1-* | mipsisa64sb1el-* \ +- | mipsisa64sr71k-* | mipsisa64sr71kel-* \ +- | mipsr5900-* | mipsr5900el-* \ +- | mipstx39-* | mipstx39el-* \ +- | mmix-* \ +- | mt-* \ +- | msp430-* \ +- | nds32-* | nds32le-* | nds32be-* \ +- | nios-* | nios2-* | nios2eb-* | nios2el-* \ +- | none-* | np1-* | ns16k-* | ns32k-* \ +- | open8-* \ +- | or1k*-* \ +- | orion-* \ +- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ +- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ +- | pru-* \ +- | pyramid-* \ +- | riscv32-* | riscv64-* \ +- | rl78-* | romp-* | rs6000-* | rx-* \ +- | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ +- | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ +- | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ +- | sparclite-* \ +- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ +- | tahoe-* \ +- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ +- | tile*-* \ +- | tron-* \ +- | ubicom32-* \ +- | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ +- | vax-* \ +- | visium-* \ +- | wasm32-* \ +- | we32k-* \ +- | x86-* | x86_64-* | xc16x-* | xps100-* \ +- | xstormy16-* | xtensa*-* \ +- | ymp-* \ +- | z8k-* | z80-*) +- ;; +- # Recognize the basic CPU types without company name, with glob match. +- xtensa*) +- basic_machine=$basic_machine-unknown +- ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. +- 386bsd) +- basic_machine=i386-pc +- os=-bsd +- ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) +- basic_machine=m68000-att ++ cpu=m68000 ++ vendor=att + ;; + 3b*) +- basic_machine=we32k-att +- ;; +- a29khif) +- basic_machine=a29k-amd +- os=-udi +- ;; +- abacus) +- basic_machine=abacus-unknown +- ;; +- adobe68k) +- basic_machine=m68010-adobe +- os=-scout +- ;; +- alliant | fx80) +- basic_machine=fx80-alliant +- ;; +- altos | altos3068) +- basic_machine=m68k-altos +- ;; +- am29k) +- basic_machine=a29k-none +- os=-bsd +- ;; +- amd64) +- basic_machine=x86_64-pc +- ;; +- amd64-*) +- basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- ;; +- amdahl) +- basic_machine=580-amdahl +- os=-sysv +- ;; +- amiga | amiga-*) +- basic_machine=m68k-unknown +- ;; +- amigaos | amigados) +- basic_machine=m68k-unknown +- os=-amigaos +- ;; +- amigaunix | amix) +- basic_machine=m68k-unknown +- os=-sysv4 +- ;; +- apollo68) +- basic_machine=m68k-apollo +- os=-sysv +- ;; +- apollo68bsd) +- basic_machine=m68k-apollo +- os=-bsd +- ;; +- aros) +- basic_machine=i386-pc +- os=-aros +- ;; +- asmjs) +- basic_machine=asmjs-unknown +- ;; +- aux) +- basic_machine=m68k-apple +- os=-aux +- ;; +- balance) +- basic_machine=ns32k-sequent +- os=-dynix +- ;; +- blackfin) +- basic_machine=bfin-unknown +- os=-linux +- ;; +- blackfin-*) +- basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- os=-linux ++ cpu=we32k ++ vendor=att + ;; + bluegene*) +- basic_machine=powerpc-ibm +- os=-cnk +- ;; +- c54x-*) +- basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- ;; +- c55x-*) +- basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- ;; +- c6x-*) +- basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- ;; +- c90) +- basic_machine=c90-cray +- os=-unicos +- ;; +- cegcc) +- basic_machine=arm-unknown +- os=-cegcc +- ;; +- convex-c1) +- basic_machine=c1-convex +- os=-bsd +- ;; +- convex-c2) +- basic_machine=c2-convex +- os=-bsd +- ;; +- convex-c32) +- basic_machine=c32-convex +- os=-bsd +- ;; +- convex-c34) +- basic_machine=c34-convex +- os=-bsd +- ;; +- convex-c38) +- basic_machine=c38-convex +- os=-bsd +- ;; +- cray | j90) +- basic_machine=j90-cray +- os=-unicos +- ;; +- craynv) +- basic_machine=craynv-cray +- os=-unicosmp +- ;; +- cr16 | cr16-*) +- basic_machine=cr16-unknown +- os=-elf +- ;; +- crds | unos) +- basic_machine=m68k-crds +- ;; +- crisv32 | crisv32-* | etraxfs*) +- basic_machine=crisv32-axis +- ;; +- cris | cris-* | etrax*) +- basic_machine=cris-axis +- ;; +- crx) +- basic_machine=crx-unknown +- os=-elf +- ;; +- da30 | da30-*) +- basic_machine=m68k-da30 +- ;; +- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) +- basic_machine=mips-dec ++ cpu=powerpc ++ vendor=ibm ++ basic_os=cnk + ;; + decsystem10* | dec10*) +- basic_machine=pdp10-dec +- os=-tops10 ++ cpu=pdp10 ++ vendor=dec ++ basic_os=tops10 + ;; + decsystem20* | dec20*) +- basic_machine=pdp10-dec +- os=-tops20 ++ cpu=pdp10 ++ vendor=dec ++ basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) +- basic_machine=m68k-motorola +- ;; +- delta88) +- basic_machine=m88k-motorola +- os=-sysv3 +- ;; +- dicos) +- basic_machine=i686-pc +- os=-dicos +- ;; +- djgpp) +- basic_machine=i586-pc +- os=-msdosdjgpp +- ;; +- dpx20 | dpx20-*) +- basic_machine=rs6000-bull +- os=-bosx ++ cpu=m68k ++ vendor=motorola + ;; + dpx2*) +- basic_machine=m68k-bull +- os=-sysv3 +- ;; +- e500v[12]) +- basic_machine=powerpc-unknown +- os=$os"spe" +- ;; +- e500v[12]-*) +- basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- os=$os"spe" +- ;; +- ebmon29k) +- basic_machine=a29k-amd +- os=-ebmon +- ;; +- elxsi) +- basic_machine=elxsi-elxsi +- os=-bsd ++ cpu=m68k ++ vendor=bull ++ basic_os=sysv3 + ;; + encore | umax | mmax) +- basic_machine=ns32k-encore ++ cpu=ns32k ++ vendor=encore + ;; +- es1800 | OSE68k | ose68k | ose | OSE) +- basic_machine=m68k-ericsson +- os=-ose ++ elxsi) ++ cpu=elxsi ++ vendor=elxsi ++ basic_os=${basic_os:-bsd} + ;; + fx2800) +- basic_machine=i860-alliant ++ cpu=i860 ++ vendor=alliant + ;; + genix) +- basic_machine=ns32k-ns +- ;; +- gmicro) +- basic_machine=tron-gmicro +- os=-sysv +- ;; +- go32) +- basic_machine=i386-pc +- os=-go32 ++ cpu=ns32k ++ vendor=ns + ;; + h3050r* | hiux*) +- basic_machine=hppa1.1-hitachi +- os=-hiuxwe2 +- ;; +- h8300hms) +- basic_machine=h8300-hitachi +- os=-hms +- ;; +- h8300xray) +- basic_machine=h8300-hitachi +- os=-xray +- ;; +- h8500hms) +- basic_machine=h8500-hitachi +- os=-hms +- ;; +- harris) +- basic_machine=m88k-harris +- os=-sysv3 +- ;; +- hp300-*) +- basic_machine=m68k-hp +- ;; +- hp300bsd) +- basic_machine=m68k-hp +- os=-bsd +- ;; +- hp300hpux) +- basic_machine=m68k-hp +- os=-hpux ++ cpu=hppa1.1 ++ vendor=hitachi ++ basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) +- basic_machine=hppa1.0-hp ++ cpu=hppa1.0 ++ vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) +- basic_machine=m68000-hp ++ cpu=m68000 ++ vendor=hp + ;; + hp9k3[2-9][0-9]) +- basic_machine=m68k-hp ++ cpu=m68k ++ vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) +- basic_machine=hppa1.0-hp ++ cpu=hppa1.0 ++ vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) +- basic_machine=hppa1.1-hp ++ cpu=hppa1.1 ++ vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp +- basic_machine=hppa1.1-hp ++ cpu=hppa1.1 ++ vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp +- basic_machine=hppa1.1-hp ++ cpu=hppa1.1 ++ vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) +- basic_machine=hppa1.1-hp ++ cpu=hppa1.1 ++ vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) +- basic_machine=hppa1.0-hp +- ;; +- hppaosf) +- basic_machine=hppa1.1-hp +- os=-osf +- ;; +- hppro) +- basic_machine=hppa1.1-hp +- os=-proelf +- ;; +- i370-ibm* | ibm*) +- basic_machine=i370-ibm ++ cpu=hppa1.0 ++ vendor=hp + ;; + i*86v32) +- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` +- os=-sysv32 ++ cpu=`echo "$1" | sed -e 's/86.*/86/'` ++ vendor=pc ++ basic_os=sysv32 + ;; + i*86v4*) +- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` +- os=-sysv4 ++ cpu=`echo "$1" | sed -e 's/86.*/86/'` ++ vendor=pc ++ basic_os=sysv4 + ;; + i*86v) +- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` +- os=-sysv ++ cpu=`echo "$1" | sed -e 's/86.*/86/'` ++ vendor=pc ++ basic_os=sysv + ;; + i*86sol2) +- basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` +- os=-solaris2 +- ;; +- i386mach) +- basic_machine=i386-mach +- os=-mach +- ;; +- vsta) +- basic_machine=i386-unknown +- os=-vsta ++ cpu=`echo "$1" | sed -e 's/86.*/86/'` ++ vendor=pc ++ basic_os=solaris2 ++ ;; ++ j90 | j90-cray) ++ cpu=j90 ++ vendor=cray ++ basic_os=${basic_os:-unicos} + ;; + iris | iris4d) +- basic_machine=mips-sgi +- case $os in +- -irix*) ++ cpu=mips ++ vendor=sgi ++ case $basic_os in ++ irix*) + ;; + *) +- os=-irix4 ++ basic_os=irix4 + ;; + esac + ;; +- isi68 | isi) +- basic_machine=m68k-isi +- os=-sysv +- ;; +- leon-*|leon[3-9]-*) +- basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` +- ;; +- m68knommu) +- basic_machine=m68k-unknown +- os=-linux +- ;; +- m68knommu-*) +- basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- os=-linux +- ;; +- magnum | m3230) +- basic_machine=mips-mips +- os=-sysv +- ;; +- merlin) +- basic_machine=ns32k-utek +- os=-sysv +- ;; +- microblaze*) +- basic_machine=microblaze-xilinx +- ;; +- mingw64) +- basic_machine=x86_64-pc +- os=-mingw64 +- ;; +- mingw32) +- basic_machine=i686-pc +- os=-mingw32 +- ;; +- mingw32ce) +- basic_machine=arm-unknown +- os=-mingw32ce +- ;; + miniframe) +- basic_machine=m68000-convergent +- ;; +- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) +- basic_machine=m68k-atari +- os=-mint ++ cpu=m68000 ++ vendor=convergent + ;; +- mips3*-*) +- basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` +- ;; +- mips3*) +- basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown +- ;; +- monitor) +- basic_machine=m68k-rom68k +- os=-coff +- ;; +- morphos) +- basic_machine=powerpc-unknown +- os=-morphos +- ;; +- moxiebox) +- basic_machine=moxie-unknown +- os=-moxiebox +- ;; +- msdos) +- basic_machine=i386-pc +- os=-msdos +- ;; +- ms1-*) +- basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` +- ;; +- msys) +- basic_machine=i686-pc +- os=-msys +- ;; +- mvs) +- basic_machine=i370-ibm +- os=-mvs +- ;; +- nacl) +- basic_machine=le32-unknown +- os=-nacl +- ;; +- ncr3000) +- basic_machine=i486-ncr +- os=-sysv4 +- ;; +- netbsd386) +- basic_machine=i386-unknown +- os=-netbsd +- ;; +- netwinder) +- basic_machine=armv4l-rebel +- os=-linux +- ;; +- news | news700 | news800 | news900) +- basic_machine=m68k-sony +- os=-newsos +- ;; +- news1000) +- basic_machine=m68030-sony +- os=-newsos ++ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) ++ cpu=m68k ++ vendor=atari ++ basic_os=mint + ;; + news-3600 | risc-news) +- basic_machine=mips-sony +- os=-newsos +- ;; +- necv70) +- basic_machine=v70-nec +- os=-sysv ++ cpu=mips ++ vendor=sony ++ basic_os=newsos + ;; + next | m*-next) +- basic_machine=m68k-next +- case $os in +- -nextstep* ) ++ cpu=m68k ++ vendor=next ++ case $basic_os in ++ openstep*) ++ ;; ++ nextstep*) + ;; +- -ns2*) +- os=-nextstep2 ++ ns2*) ++ basic_os=nextstep2 + ;; + *) +- os=-nextstep3 ++ basic_os=nextstep3 + ;; + esac + ;; +- nh3000) +- basic_machine=m68k-harris +- os=-cxux +- ;; +- nh[45]000) +- basic_machine=m88k-harris +- os=-cxux +- ;; +- nindy960) +- basic_machine=i960-intel +- os=-nindy +- ;; +- mon960) +- basic_machine=i960-intel +- os=-mon960 +- ;; +- nonstopux) +- basic_machine=mips-compaq +- os=-nonstopux +- ;; + np1) +- basic_machine=np1-gould +- ;; +- neo-tandem) +- basic_machine=neo-tandem +- ;; +- nse-tandem) +- basic_machine=nse-tandem +- ;; +- nsr-tandem) +- basic_machine=nsr-tandem +- ;; +- nsv-tandem) +- basic_machine=nsv-tandem +- ;; +- nsx-tandem) +- basic_machine=nsx-tandem ++ cpu=np1 ++ vendor=gould + ;; + op50n-* | op60c-*) +- basic_machine=hppa1.1-oki +- os=-proelf +- ;; +- openrisc | openrisc-*) +- basic_machine=or32-unknown +- ;; +- os400) +- basic_machine=powerpc-ibm +- os=-os400 +- ;; +- OSE68000 | ose68000) +- basic_machine=m68000-ericsson +- os=-ose +- ;; +- os68k) +- basic_machine=m68k-none +- os=-os68k ++ cpu=hppa1.1 ++ vendor=oki ++ basic_os=proelf + ;; + pa-hitachi) +- basic_machine=hppa1.1-hitachi +- os=-hiuxwe2 +- ;; +- paragon) +- basic_machine=i860-intel +- os=-osf +- ;; +- parisc) +- basic_machine=hppa-unknown +- os=-linux +- ;; +- parisc-*) +- basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` +- os=-linux ++ cpu=hppa1.1 ++ vendor=hitachi ++ basic_os=hiuxwe2 + ;; + pbd) +- basic_machine=sparc-tti ++ cpu=sparc ++ vendor=tti + ;; + pbb) +- basic_machine=m68k-tti ++ cpu=m68k ++ vendor=tti + ;; +- pc532 | pc532-*) +- basic_machine=ns32k-pc532 ++ pc532) ++ cpu=ns32k ++ vendor=pc532 + ;; +- pc98) +- basic_machine=i386-pc ++ pn) ++ cpu=pn ++ vendor=gould + ;; +- pc98-*) +- basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ power) ++ cpu=power ++ vendor=ibm + ;; +- pentium | p5 | k5 | k6 | nexgen | viac3) +- basic_machine=i586-pc ++ ps2) ++ cpu=i386 ++ vendor=ibm + ;; +- pentiumpro | p6 | 6x86 | athlon | athlon_*) +- basic_machine=i686-pc ++ rm[46]00) ++ cpu=mips ++ vendor=siemens + ;; +- pentiumii | pentium2 | pentiumiii | pentium3) +- basic_machine=i686-pc ++ rtpc | rtpc-*) ++ cpu=romp ++ vendor=ibm + ;; +- pentium4) +- basic_machine=i786-pc ++ sde) ++ cpu=mipsisa32 ++ vendor=sde ++ basic_os=${basic_os:-elf} + ;; +- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) +- basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ simso-wrs) ++ cpu=sparclite ++ vendor=wrs ++ basic_os=vxworks + ;; +- pentiumpro-* | p6-* | 6x86-* | athlon-*) +- basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ tower | tower-32) ++ cpu=m68k ++ vendor=ncr + ;; +- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) +- basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ vpp*|vx|vx-*) ++ cpu=f301 ++ vendor=fujitsu + ;; +- pentium4-*) +- basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ w65) ++ cpu=w65 ++ vendor=wdc + ;; +- pn) +- basic_machine=pn-gould ++ w89k-*) ++ cpu=hppa1.1 ++ vendor=winbond ++ basic_os=proelf + ;; +- power) basic_machine=power-ibm ++ none) ++ cpu=none ++ vendor=none + ;; +- ppc | ppcbe) basic_machine=powerpc-unknown ++ leon|leon[3-9]) ++ cpu=sparc ++ vendor=$basic_machine + ;; +- ppc-* | ppcbe-*) +- basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ++ leon-*|leon[3-9]-*) ++ cpu=sparc ++ vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; +- ppcle | powerpclittle) +- basic_machine=powerpcle-unknown ++ ++ *-*) ++ # shellcheck disable=SC2162 ++ saved_IFS=$IFS ++ IFS="-" read cpu vendor <&2 +- exit 1 ++ # Recognize the canonical CPU types that are allowed with any ++ # company name. ++ case $cpu in ++ 1750a | 580 \ ++ | a29k \ ++ | aarch64 | aarch64_be \ ++ | abacus \ ++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ ++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ ++ | alphapca5[67] | alpha64pca5[67] \ ++ | am33_2.0 \ ++ | amdgcn \ ++ | arc | arceb | arc32 | arc64 \ ++ | arm | arm[lb]e | arme[lb] | armv* \ ++ | avr | avr32 \ ++ | asmjs \ ++ | ba \ ++ | be32 | be64 \ ++ | bfin | bpf | bs2000 \ ++ | c[123]* | c30 | [cjt]90 | c4x \ ++ | c8051 | clipper | craynv | csky | cydra \ ++ | d10v | d30v | dlx | dsp16xx \ ++ | e2k | elxsi | epiphany \ ++ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ ++ | h8300 | h8500 \ ++ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | hexagon \ ++ | i370 | i*86 | i860 | i960 | ia16 | ia64 \ ++ | ip2k | iq2000 \ ++ | k1om \ ++ | le32 | le64 \ ++ | lm32 \ ++ | loongarch32 | loongarch64 | loongarchx32 \ ++ | m32c | m32r | m32rle \ ++ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ ++ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ ++ | m88110 | m88k | maxq | mb | mcore | mep | metag \ ++ | microblaze | microblazeel \ ++ | mips | mipsbe | mipseb | mipsel | mipsle \ ++ | mips16 \ ++ | mips64 | mips64eb | mips64el \ ++ | mips64octeon | mips64octeonel \ ++ | mips64orion | mips64orionel \ ++ | mips64r5900 | mips64r5900el \ ++ | mips64vr | mips64vrel \ ++ | mips64vr4100 | mips64vr4100el \ ++ | mips64vr4300 | mips64vr4300el \ ++ | mips64vr5000 | mips64vr5000el \ ++ | mips64vr5900 | mips64vr5900el \ ++ | mipsisa32 | mipsisa32el \ ++ | mipsisa32r2 | mipsisa32r2el \ ++ | mipsisa32r3 | mipsisa32r3el \ ++ | mipsisa32r5 | mipsisa32r5el \ ++ | mipsisa32r6 | mipsisa32r6el \ ++ | mipsisa64 | mipsisa64el \ ++ | mipsisa64r2 | mipsisa64r2el \ ++ | mipsisa64r3 | mipsisa64r3el \ ++ | mipsisa64r5 | mipsisa64r5el \ ++ | mipsisa64r6 | mipsisa64r6el \ ++ | mipsisa64sb1 | mipsisa64sb1el \ ++ | mipsisa64sr71k | mipsisa64sr71kel \ ++ | mipsr5900 | mipsr5900el \ ++ | mipstx39 | mipstx39el \ ++ | mmix \ ++ | mn10200 | mn10300 \ ++ | moxie \ ++ | mt \ ++ | msp430 \ ++ | nds32 | nds32le | nds32be \ ++ | nfp \ ++ | nios | nios2 | nios2eb | nios2el \ ++ | none | np1 | ns16k | ns32k | nvptx \ ++ | open8 \ ++ | or1k* \ ++ | or32 \ ++ | orion \ ++ | picochip \ ++ | pdp10 | pdp11 | pj | pjl | pn | power \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ ++ | pru \ ++ | pyramid \ ++ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \ ++ | rl78 | romp | rs6000 | rx \ ++ | s390 | s390x \ ++ | score \ ++ | sh | shl \ ++ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ ++ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ ++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ ++ | sparclite \ ++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ ++ | spu \ ++ | tahoe \ ++ | thumbv7* \ ++ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ ++ | tron \ ++ | ubicom32 \ ++ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ ++ | vax \ ++ | visium \ ++ | w65 \ ++ | wasm32 | wasm64 \ ++ | we32k \ ++ | x86 | x86_64 | xc16x | xgate | xps100 \ ++ | xstormy16 | xtensa* \ ++ | ymp \ ++ | z8k | z80) ++ ;; ++ ++ *) ++ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 ++ exit 1 ++ ;; ++ esac + ;; + esac + + # Here we canonicalize certain aliases for manufacturers. +-case $basic_machine in +- *-digital*) +- basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ++case $vendor in ++ digital*) ++ vendor=dec + ;; +- *-commodore*) +- basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ++ commodore*) ++ vendor=cbm + ;; + *) + ;; +@@ -1334,203 +1306,215 @@ esac + + # Decode manufacturer-specific aliases for certain operating systems. + +-if [ x"$os" != x"" ] ++if test x$basic_os != x + then ++ ++# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just ++# set os. ++case $basic_os in ++ gnu/linux*) ++ kernel=linux ++ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ++ ;; ++ os2-emx) ++ kernel=os2 ++ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ++ ;; ++ nto-qnx*) ++ kernel=nto ++ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ++ ;; ++ *-*) ++ # shellcheck disable=SC2162 ++ saved_IFS=$IFS ++ IFS="-" read kernel os <&2 +- exit 1 ++ # No normalization, but not necessarily accepted, that comes below. + ;; + esac ++ + else + + # Here we handle the default operating systems that come with various machines. +@@ -1543,258 +1527,363 @@ else + # will signal an error saying that MANUFACTURER isn't an operating + # system, and we'll never get to this point. + +-case $basic_machine in ++kernel= ++case $cpu-$vendor in + score-*) +- os=-elf ++ os=elf + ;; + spu-*) +- os=-elf ++ os=elf + ;; + *-acorn) +- os=-riscix1.2 ++ os=riscix1.2 + ;; + arm*-rebel) +- os=-linux ++ kernel=linux ++ os=gnu + ;; + arm*-semi) +- os=-aout ++ os=aout + ;; + c4x-* | tic4x-*) +- os=-coff ++ os=coff + ;; + c8051-*) +- os=-elf ++ os=elf ++ ;; ++ clipper-intergraph) ++ os=clix + ;; + hexagon-*) +- os=-elf ++ os=elf + ;; + tic54x-*) +- os=-coff ++ os=coff + ;; + tic55x-*) +- os=-coff ++ os=coff + ;; + tic6x-*) +- os=-coff ++ os=coff + ;; + # This must come before the *-dec entry. + pdp10-*) +- os=-tops20 ++ os=tops20 + ;; + pdp11-*) +- os=-none ++ os=none + ;; + *-dec | vax-*) +- os=-ultrix4.2 ++ os=ultrix4.2 + ;; + m68*-apollo) +- os=-domain ++ os=domain + ;; + i386-sun) +- os=-sunos4.0.2 ++ os=sunos4.0.2 + ;; + m68000-sun) +- os=-sunos3 ++ os=sunos3 + ;; + m68*-cisco) +- os=-aout ++ os=aout + ;; + mep-*) +- os=-elf ++ os=elf + ;; + mips*-cisco) +- os=-elf ++ os=elf + ;; + mips*-*) +- os=-elf ++ os=elf + ;; + or32-*) +- os=-coff ++ os=coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. +- os=-sysv3 ++ os=sysv3 + ;; + sparc-* | *-sun) +- os=-sunos4.1.1 ++ os=sunos4.1.1 + ;; + pru-*) +- os=-elf ++ os=elf + ;; + *-be) +- os=-beos ++ os=beos + ;; + *-ibm) +- os=-aix ++ os=aix + ;; + *-knuth) +- os=-mmixware ++ os=mmixware + ;; + *-wec) +- os=-proelf ++ os=proelf + ;; + *-winbond) +- os=-proelf ++ os=proelf + ;; + *-oki) +- os=-proelf ++ os=proelf + ;; + *-hp) +- os=-hpux ++ os=hpux + ;; + *-hitachi) +- os=-hiux ++ os=hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) +- os=-sysv ++ os=sysv + ;; + *-cbm) +- os=-amigaos ++ os=amigaos + ;; + *-dg) +- os=-dgux ++ os=dgux + ;; + *-dolphin) +- os=-sysv3 ++ os=sysv3 + ;; + m68k-ccur) +- os=-rtu ++ os=rtu + ;; + m88k-omron*) +- os=-luna ++ os=luna + ;; + *-next) +- os=-nextstep ++ os=nextstep + ;; + *-sequent) +- os=-ptx ++ os=ptx + ;; + *-crds) +- os=-unos ++ os=unos + ;; + *-ns) +- os=-genix ++ os=genix + ;; + i370-*) +- os=-mvs ++ os=mvs + ;; + *-gould) +- os=-sysv ++ os=sysv + ;; + *-highlevel) +- os=-bsd ++ os=bsd + ;; + *-encore) +- os=-bsd ++ os=bsd + ;; + *-sgi) +- os=-irix ++ os=irix + ;; + *-siemens) +- os=-sysv4 ++ os=sysv4 + ;; + *-masscomp) +- os=-rtu ++ os=rtu + ;; + f30[01]-fujitsu | f700-fujitsu) +- os=-uxpv ++ os=uxpv + ;; + *-rom68k) +- os=-coff ++ os=coff + ;; + *-*bug) +- os=-coff ++ os=coff + ;; + *-apple) +- os=-macos ++ os=macos + ;; + *-atari*) +- os=-mint ++ os=mint ++ ;; ++ *-wrs) ++ os=vxworks + ;; + *) +- os=-none ++ os=none + ;; + esac ++ + fi + ++# Now, validate our (potentially fixed-up) OS. ++case $os in ++ # Sometimes we do "kernel-libc", so those need to count as OSes. ++ musl* | newlib* | relibc* | uclibc*) ++ ;; ++ # Likewise for "kernel-abi" ++ eabi* | gnueabi*) ++ ;; ++ # VxWorks passes extra cpu info in the 4th filed. ++ simlinux | simwindows | spe) ++ ;; ++ # Now accept the basic system types. ++ # The portable systems comes first. ++ # Each alternative MUST end in a * to match a version number. ++ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ ++ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ ++ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ ++ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ ++ | hiux* | abug | nacl* | netware* | windows* \ ++ | os9* | macos* | osx* | ios* \ ++ | mpw* | magic* | mmixware* | mon960* | lnews* \ ++ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ ++ | aos* | aros* | cloudabi* | sortix* | twizzler* \ ++ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ ++ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ ++ | mirbsd* | netbsd* | dicos* | openedition* | ose* \ ++ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ ++ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ ++ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ ++ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ ++ | udi* | lites* | ieee* | go32* | aux* | hcos* \ ++ | chorusrdb* | cegcc* | glidix* | serenity* \ ++ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ ++ | midipix* | mingw32* | mingw64* | mint* \ ++ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ ++ | interix* | uwin* | mks* | rhapsody* | darwin* \ ++ | openstep* | oskit* | conix* | pw32* | nonstopux* \ ++ | storm-chaos* | tops10* | tenex* | tops20* | its* \ ++ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ ++ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ ++ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ ++ | skyos* | haiku* | rdos* | toppers* | drops* | es* \ ++ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ ++ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ ++ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ ++ | fiwix* ) ++ ;; ++ # This one is extra strict with allowed versions ++ sco3.2v2 | sco3.2v[4-9]* | sco5v6*) ++ # Don't forget version if it is 3.2v4 or newer. ++ ;; ++ none) ++ ;; ++ *) ++ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 ++ exit 1 ++ ;; ++esac ++ ++# As a final step for OS-related things, validate the OS-kernel combination ++# (given a valid OS), if there is a kernel. ++case $kernel-$os in ++ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ ++ | linux-musl* | linux-relibc* | linux-uclibc* ) ++ ;; ++ uclinux-uclibc* ) ++ ;; ++ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) ++ # These are just libc implementations, not actual OSes, and thus ++ # require a kernel. ++ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 ++ exit 1 ++ ;; ++ kfreebsd*-gnu* | kopensolaris*-gnu*) ++ ;; ++ vxworks-simlinux | vxworks-simwindows | vxworks-spe) ++ ;; ++ nto-qnx*) ++ ;; ++ os2-emx) ++ ;; ++ *-eabi* | *-gnueabi*) ++ ;; ++ -*) ++ # Blank kernel with real OS is always fine. ++ ;; ++ *-*) ++ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 ++ exit 1 ++ ;; ++esac ++ + # Here we handle the case where we know the os, and the CPU type, but not the + # manufacturer. We pick the logical manufacturer. +-vendor=unknown +-case $basic_machine in +- *-unknown) +- case $os in +- -riscix*) ++case $vendor in ++ unknown) ++ case $cpu-$os in ++ *-riscix*) + vendor=acorn + ;; +- -sunos*) ++ *-sunos*) + vendor=sun + ;; +- -cnk*|-aix*) ++ *-cnk* | *-aix*) + vendor=ibm + ;; +- -beos*) ++ *-beos*) + vendor=be + ;; +- -hpux*) ++ *-hpux*) + vendor=hp + ;; +- -mpeix*) ++ *-mpeix*) + vendor=hp + ;; +- -hiux*) ++ *-hiux*) + vendor=hitachi + ;; +- -unos*) ++ *-unos*) + vendor=crds + ;; +- -dgux*) ++ *-dgux*) + vendor=dg + ;; +- -luna*) ++ *-luna*) + vendor=omron + ;; +- -genix*) ++ *-genix*) + vendor=ns + ;; +- -mvs* | -opened*) ++ *-clix*) ++ vendor=intergraph ++ ;; ++ *-mvs* | *-opened*) ++ vendor=ibm ++ ;; ++ *-os400*) + vendor=ibm + ;; +- -os400*) ++ s390-* | s390x-*) + vendor=ibm + ;; +- -ptx*) ++ *-ptx*) + vendor=sequent + ;; +- -tpf*) ++ *-tpf*) + vendor=ibm + ;; +- -vxsim* | -vxworks* | -windiss*) ++ *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; +- -aux*) ++ *-aux*) + vendor=apple + ;; +- -hms*) ++ *-hms*) + vendor=hitachi + ;; +- -mpw* | -macos*) ++ *-mpw* | *-macos*) + vendor=apple + ;; +- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) ++ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; +- -vos*) ++ *-vos*) + vendor=stratus + ;; + esac +- basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` + ;; + esac + +-echo "$basic_machine$os" ++echo "$cpu-$vendor-${kernel:+$kernel-}$os" + exit + + # Local variables: +-# eval: (add-hook 'write-file-functions 'time-stamp) ++# eval: (add-hook 'before-save-hook 'time-stamp) + # time-stamp-start: "timestamp='" + # time-stamp-format: "%:y-%02m-%02d" + # time-stamp-end: "'" +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -7832,9 +7832,6 @@ fi + fi + + +-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettimeofday declaration" >&5 +-printf %s "checking for gettimeofday declaration... " >&6; } +- + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 + printf %s "checking for grep that handles long lines and -e... " >&6; } + if test ${ac_cv_path_GREP+y} +@@ -7985,10 +7982,14 @@ _ACEOF + if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "gettimeofday" >/dev/null 2>&1 + then : +- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: present" >&5 ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettimeofday declaration" >&5 ++printf %s "checking for gettimeofday declaration... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: present" >&5 + printf "%s\n" "present" >&6; } + else $as_nop +- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: missing" >&5 ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettimeofday declaration" >&5 ++printf %s "checking for gettimeofday declaration... " >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: missing" >&5 + printf "%s\n" "missing" >&6; } + + printf "%s\n" "#define GETTOD_NOT_DECLARED 1" >>confdefs.h +@@ -9269,9 +9270,6 @@ fi + + if test "$enable_tcltk" != "no" ; then + +- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcl/tk" >&5 +-printf %s "checking for tcl/tk... " >&6; } +- + if test -d "${TCL_CONFIG_PREFIX}" ; then true ; else + + # Extract the first word of "tclsh", so it can be a program name with args. +@@ -9454,6 +9452,8 @@ fi + + + ++{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcl/tk" >&5 ++printf %s "checking for tcl/tk... " >&6; } + if test -d "${TK_CONFIG_PREFIX}" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&5 + printf "%s\n" "using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&6; } +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1584,12 +1584,12 @@ AC_CHECK_FUNC([BSDgettimeofday], + [AC_CHECK_FUNC([gettimeofday], , + [AC_DEFINE([NO_GETTOD],1,[no gettimeofday call])])]) + +-AC_MSG_CHECKING([for gettimeofday declaration]) +- + AC_EGREP_HEADER([gettimeofday], + [sys/time.h], +- [AC_MSG_RESULT([present])], +- [AC_MSG_RESULT([missing]) ++ [AC_MSG_CHECKING([for gettimeofday declaration]) ++ AC_MSG_RESULT([present])], ++ [AC_MSG_CHECKING([for gettimeofday declaration]) ++ AC_MSG_RESULT([missing]) + AC_DEFINE(GETTOD_NOT_DECLARED,1,[No gettimeofday call -- fixme])]) + + +@@ -2009,8 +2009,6 @@ AC_ARG_ENABLE([tclconfig], + + if test "$enable_tcltk" != "no" ; then + +- AC_MSG_CHECKING([for tcl/tk]) +- + if test -d "${TCL_CONFIG_PREFIX}" ; then true ; else + + AC_CHECK_PROG(TCLSH,tclsh,tclsh,${TCLSH}) +@@ -2113,6 +2111,7 @@ AC_SUBST(TCL_LIBS) + + + ++AC_MSG_CHECKING([for tcl/tk]) + if test -d "${TK_CONFIG_PREFIX}" ; then + AC_MSG_RESULT([using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}]) + else +--- gcl-2.6.12.orig/lsp/gcl_make_pathname.lsp ++++ gcl-2.6.12/lsp/gcl_make_pathname.lsp +@@ -29,7 +29,7 @@ + + (defconstant +physical-pathname-defaults+ '(("" "" "") + #+winnt("" "([A-Za-z]:)?" ":") #-winnt("" "()" "") +- ("" #.(ads "(/?([^/]+/)*)") "" "" #.(ads "([^/]+/)") "/") ++ ("" #.(ads "(/?([^/]*/)*)") "" "" #.(ads "([^/]*/)") "/") + ("" #.(ads "([^/.]*)") "") + ("." #.(ads "(\\.[^/]*)?") "") + ("" "" ""))) +@@ -92,13 +92,17 @@ + (when (and (member d '(:up :back)) (member c '(:absolute :wild-inferiors))) + (return-from directory-list-check nil))) l)))) + +-(defun canonicalize-pathname-directory (l) ++(defun canonicalize-pathname-directory (l &aux x) + (cond ((eq l :wild) (canonicalize-pathname-directory '(:absolute :wild-inferiors))) + ((stringp l) (canonicalize-pathname-directory (list :absolute l))) +- ((mapl (lambda (x &aux (c (car x))) +- (when (and (or (stringp c) (eq c :wild)) (eq (cadr x) :back)) +- (return-from canonicalize-pathname-directory +- (canonicalize-pathname-directory (nconc (ldiff l x) (cddr x)))))) l)))) ++ ((and (eq (car l) :relative) (stringp (cadr l)) (plusp (length (cadr l))) (eql #\~ (aref (cadr l) 0))) ++ (canonicalize-pathname-directory (nconc (dir-parse (home-namestring (cadr l))) (cddr l)))) ++ ((setq x (member-if (lambda (x) (or (string-equal "" x) (string-equal "." x))) l)) ++ (canonicalize-pathname-directory (nconc (ldiff l x) (cdr x)))) ++ ((setq x (member :back l)) ++ (let* ((y (ldiff l x))(ll (car (last y)))) ++ (canonicalize-pathname-directory (if (or (stringp ll) (eq ll :wild)) (nconc (butlast y) (cdr x)) (nconc y (cons :up (cdr x))))))) ++ (l))) + + (defvar *default-pathname-defaults* (init-pathname nil nil nil nil nil nil "")) + (declaim (type pathname *default-pathname-defaults*)) +@@ -135,23 +139,24 @@ + (check-type case (member :common :local)) + ,(flet ((def? (k) `(let* (,@(when (eq k 'host) `((def (or def *default-pathname-defaults*)))) + (nk (if ,(strsym :si k "P") ,k (when def (,(strsym :si "C-PATHNAME-" k) def)))) ++ (nk (unless (equal "" nk) nk)) + (nk (progn (unless (eq ,k nk) (setq defaulted t)) nk)) + (nk (if (eq case :local) nk (progn (setq defaulted t) (toggle-case nk))))) +- nk))) +- `(let* ((h ,(def? 'host)) +- (h (let ((h1 (when (logical-pathname-host-p h) h))) (unless (eq h h1) (setq defaulted t)) h1)) +- (dev ,(def? 'device)) +- (d ,(def? 'directory)) +- (d (let ((d1 (canonicalize-pathname-directory d))) (unless (eq d d1) (setq defaulted t)) d1)) +- (n ,(def? 'name)) +- (typ ,(def? 'type)) +- (v ,(def? 'version)) +- (p (init-pathname h dev d n typ v +- (or (unless defaulted namestring) (to-regexp-or-namestring (list h dev d n typ v) nil h))))) +- (when h (c-set-t-tt p 1)) +- (unless (eq d (directory-list-check d)) +- (error 'file-error :pathname p :format-control "Bad directory list")) +- p))) ++ nk))) ++ `(let* ((h ,(def? 'host)) ++ (h (cond ((logical-pathname-host-p h) h)(h (setq defaulted t) nil))) ++ (dev ,(def? 'device)) ++ (d ,(def? 'directory)) ++ (d (let ((d1 (canonicalize-pathname-directory d))) (unless (eq d d1) (setq defaulted t)) d1)) ++ (n ,(def? 'name)) ++ (typ ,(def? 'type)) ++ (v ,(def? 'version)) ++ (p (init-pathname h dev d n typ v ++ (or (unless defaulted namestring) (to-regexp-or-namestring (list h dev d n typ v) nil h))))) ++ (when h (c-set-t-tt p 1)) ++ (unless (eq d (directory-list-check d)) ++ (error 'file-error :pathname p :format-control "Bad directory list")) ++ p))) + + (macrolet ((pn-accessor (k &aux (f (strsym :si "PATHNAME-" k)) (c (strsym :si "C-PATHNAME-" k))) + `(defun ,f (p &key (case :local) &aux (pn (pathname p))) +--- gcl-2.6.12.orig/lsp/gcl_parse_namestring.lsp ++++ gcl-2.6.12/lsp/gcl_parse_namestring.lsp +@@ -5,20 +5,16 @@ + (defun dir-conj (x) (if (eq x :relative) :absolute :relative)) + + (defvar *up-key* :up) +-(defvar *canonicalized* nil) + +-(defun mfr (x b i) (subseq x b i)); (make-array (- i b) :element-type 'character :displaced-to x :displaced-index-offset b) +- +-(defvar *sym-sub-alist* '((:host . nil) +- (:device . nil) +- (:directory . (("." . nil)(".." . :up)("*" . :wild)("**" . :wild-inferiors))) +- (:name . (("*" . :wild))) +- (:type . (("*" . :wild))) +- (:version . (("*" . :wild)("NEWEST" . :newest))))) +- +-(defun element (x b i key) +- (let* ((z (when (> i b) (mfr x b i))) +- (w (assoc z (cdr (assoc key *sym-sub-alist*)) :test 'string-equal)) ++(defun element (x b i key &optional def) ++ (let* ((z (if (> i b) (subseq x b i) def));(make-array (- i b) :element-type 'character :displaced-to x :displaced-index-offset b) ++ (w (assoc key '((:host . nil) ++ (:device . nil) ++ (:directory . ((".." . :up)("*" . :wild)("**" . :wild-inferiors))) ++ (:name . (("*" . :wild))) ++ (:type . (("*" . :wild))) ++ (:version . (("*" . :wild)("NEWEST" . :newest)))))) ++ (w (assoc z (cdr w) :test 'string-equal)) + (z (if w (cdr w) z))) + (if (eq z :up) *up-key* z))) + +@@ -26,11 +22,11 @@ + (when (stringp x) + (let ((i (string-match (if lp #v";" +dirsep+) x b))) + (unless (minusp i) +- (let* ((y (dir-parse x lp (1+ i))) +- (z (element x b i :directory)) +- (y (if z (cons z y) (progn (when (> i b) (setq *canonicalized* t)) y)))) ++ (let ((y (cons (element x b i :directory "") (dir-parse x lp (1+ i))))) + (if (zerop b) +- (cons (if (if lp (plusp i) (zerop i)) :absolute :relative) y) ++ (if (if lp (plusp i) (zerop i)) ++ (cons :absolute (cdr y)) ++ (cons :relative y)) + y)))))) + + (defun match-component (x i k &optional (boff 0) (eoff 0)) +@@ -38,8 +34,7 @@ + + (defun version-parse (x) + (typecase x +- (string (version-parse (parse-integer x))) +-; (integer (locally (check-type x (integer 1)) x)) ++ (string (when (plusp (length x)) (version-parse (parse-integer x)))) + (otherwise x))) + + (defconstant +generic-logical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +logical-pathname-defaults+)) t t))) +@@ -68,13 +63,13 @@ + (prog1 (append (dir-parse (home-namestring (cadr dir))) (cddr dir)) (setq *canonicalized* t)) + dir)) + +-(defun pathname-parse (x b e &aux (*canonicalized* nil)) ++(defun pathname-parse (x b e) + (when (and (eql b (string-match +generic-physical-pathname-regexp+ x b e)) (eql (match-end 0) e)) + (make-pathname :device (match-component x 1 :none 0 -1) + :name (match-component x 4 :name) + :type (match-component x 5 :type 1) +- :directory (expand-home-dir (dir-parse (match-component x 2 :none)));must be last +- :namestring (unless *canonicalized* (when (and (eql b 0) (eql e (length x))) x))))) ++ :directory (dir-parse (match-component x 2 :none));must be last ++ :namestring (when (and (eql b 0) (eql e (length x))) x)))) + + (defun path-stream-name (x) + (check-type x pathname-designator) diff --git a/debian/patches/Version_2_6_13pre125 b/debian/patches/Version_2_6_13pre125 new file mode 100644 index 0000000..8f63006 --- /dev/null +++ b/debian/patches/Version_2_6_13pre125 @@ -0,0 +1,5896 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-125) unstable; urgency=medium + . + * Version_2.6.13pre125 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-11-08 + +--- gcl-2.6.12.orig/clcs/sys-proclaim.lisp ++++ gcl-2.6.12/clcs/sys-proclaim.lisp +@@ -4,9 +4,9 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMMON-LISP::DEFINE-CONDITION COMMON-LISP::HANDLER-CASE +- COMMON-LISP::IGNORE-ERRORS COMMON-LISP::HANDLER-BIND +- CONDITIONS::SLOT-SYM CONDITIONS::COERCE-TO-FN)) ++ COMMON-LISP::HANDLER-BIND COMMON-LISP::DEFINE-CONDITION ++ COMMON-LISP::HANDLER-CASE COMMON-LISP::IGNORE-ERRORS ++ CONDITIONS::COERCE-TO-FN CONDITIONS::SLOT-SYM)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +@@ -17,32 +17,32 @@ + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) +- COMMON-LISP::T) +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CONDITION T))| +- CONDITIONS::|(PCL::FAST-METHOD MAKE-LOAD-FORM (CONDITION))|)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) + COMMON-LISP::*) +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (FILE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))|)) ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ CONDITIONS::|(PCL::FAST-METHOD MAKE-LOAD-FORM (CONDITION))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CONDITION T))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- CONDITIONS::CONDITIONP CONDITIONS::DEFAULT-REPORT +- CONDITIONS::IS-CONDITION CONDITIONS::IS-WARNING)) +\ No newline at end of file ++ CONDITIONS::CONDITIONP CONDITIONS::IS-CONDITION ++ CONDITIONS::IS-WARNING CONDITIONS::DEFAULT-REPORT)) +\ No newline at end of file +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -90,8 +90,10 @@ + (defvar *default-h-file* nil) + (defvar *default-data-file* nil) + (defvar *default-prof-p* nil) ++#+large-memory-model(defvar *default-large-memory-model-p* nil) + (defvar *keep-gaz* nil) + (defvar *prof-p* nil) ++#+large-memory-model(defvar *large-memory-model-p* nil) + + ;; (list section-length split-file-names next-section-start-file-position) + ;; Many c compilers cannot handle the large C files resulting from large lisp files. +@@ -153,11 +155,13 @@ + (c-debug nil) + (system-p *default-system-p*) + (prof-p *default-prof-p*) ++ #+large-memory-model(large-memory-model-p *default-large-memory-model-p*) + (print nil) + (load nil) + &aux + (*standard-output* *standard-output*) + (*prof-p* prof-p) ++ #+large-memory-model(*large-memory-model-p* large-memory-model-p) + (output-file (pathname output-file)) + (*error-output* *error-output*) + (*compiler-in-use* *compiler-in-use*) +@@ -480,7 +484,10 @@ Cannot compile ~a.~%" + (setq na (namestring + (make-pathname :name name :type (pathname-type(first args))))) + (format nil "~a ~a -I~a ~a ~a -c ~a -o ~a ~a" +- (if *prof-p* (remove-flag "-fomit-frame-pointer" *cc*) *cc*) ++ (concatenate 'string ++ (if *prof-p* (remove-flag "-fomit-frame-pointer" *cc*) *cc*) ++ #+large-memory-model(if *large-memory-model-p* " -mcmodel=large " "") ++ #-large-memory-model "") + (if *prof-p* " -pg " "") + (concatenate 'string si::*system-directory* "../h") + (if (and (boundp '*c-debug*) *c-debug*) " -g " "") +@@ -536,6 +543,8 @@ Cannot compile ~a.~%" + + )) + ++ #+large-memory-model(when *large-memory-model-p* (mark-as-large-memory-model o-pathname)) ++ + #+dont_need + (let ((cname (pathname-name c-pathname)) + (odir (pathname-directory o-pathname)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptop.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptop.lsp +@@ -99,6 +99,7 @@ + ;;; Package operations. + + (si:putprop 'in-package t 'eval-at-compile) ++(si:putprop 'si::in-package-internal t 'eval-at-compile) + + ;;; Pass 1 top-levels. + +--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp ++++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp +@@ -366,7 +366,7 @@ + (DEFSYSFUN 'FMAKUNBOUND "Lfmakunbound" '(T) 'T NIL NIL) + (DEFSYSFUN 'SLEEP "Lsleep" '(T) 'T NIL NIL) + (DEFSYSFUN 'PACKAGE-NAME "Lpackage_name" '(T) 'T NIL NIL) +-(DEFSYSFUN 'FIND-PACKAGE "Lfind_package" '(T) 'T NIL NIL) ++;(DEFSYSFUN 'FIND-PACKAGE "Lfind_package" '(T) 'T NIL NIL) + (DEFSYSFUN 'ASSOC "Lassoc" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'SET-CHAR-BIT "Lset_char_bit" '(T T T) 'CHARACTER NIL NIL) + (DEFSYSFUN 'FLOOR "Lfloor" '(T *) '(VALUES T T) NIL NIL) +--- gcl-2.6.12.orig/cmpnew/sys-proclaim.lisp ++++ gcl-2.6.12/cmpnew/sys-proclaim.lisp +@@ -2,178 +2,159 @@ + (COMMON-LISP::IN-PACKAGE "COMPILER") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::CMPERR COMPILER::CMPWARN COMPILER::WT-CVAR +- COMPILER::ADD-INIT COMPILER::INIT-NAME +- COMPILER::FAST-LINK-PROCLAIMED-TYPE-P COMPILER::C1CASE +- COMPILER::WT-INTEGER-LOC COMPILER::CMPNOTE +- COMPILER::UNWIND-EXIT COMPILER::WT-COMMENT +- COMPILER::C1LAMBDA-EXPR)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ COMPILER::WT-CHARACTER-LOC COMPILER::T1EXPR COMPILER::C2PROGN ++ COMPILER::WT-TO-STRING COMPILER::CMP-EVAL ++ COMPILER::WT-FIXNUM-LOC COMPILER::T1EVAL-WHEN ++ COMPILER::MEXPAND-DEFTYPE COMPILER::SET-LOC COMPILER::C2OR ++ COMPILER::C2AND COMPILER::WT-LOC COMPILER::CMP-TOPLEVEL-EVAL ++ COMPILER::WT-LONG-FLOAT-LOC COMPILER::WT-SHORT-FLOAT-LOC ++ COMPILER::C2EXPR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- COMPILER::C2RETURN-LOCAL COMPILER::WT-INLINE-LOC +- COMPILER::C1SYMBOL-FUN COMPILER::C2DECL-BODY +- COMPILER::COMPILER-BUILD COMPILER::NCONC-FILES +- COMPILER::C2BLOCK COMPILER::C1BODY COMPILER::C2BLOCK-LOCAL)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMPILER::MAKE-VAR COMPILER::C2FSET COMPILER::CS-PUSH ++ COMPILER::MAKE-FUN COMPILER::LIST-INLINE COMPILER::WT-CLINK ++ COMPILER::FCALLN-INLINE COMPILER::MAKE-INFO COMPILER::MAKE-TAG ++ COMPILER::LIST*-INLINE COMPILER::MAKE-BLK ++ COMPILER::COMPILER-COMMAND)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T ++ (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) + (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- COMPILER::MEMOIZED-HASH-EQUAL)) ++ 9223372036854775807) ++ COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PUSH-ARRAY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- COMPILER::MAKE-INIT-STRING)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T ++ (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::BSEARCHLEQ)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- COMPILER::MLIN)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ COMPILER::WT-FIRST-VAR-ARG COMPILER::CLOSE-INLINE-BLOCKS ++ COMPILER::WT-DATA-END COMPILER::CCB-VS-PUSH ++ COMPILER::INC-INLINE-BLOCKS COMPILER::CVS-PUSH COMPILER::C1NIL ++ COMPILER::MACRO-ENV COMPILER::WT-C-PUSH ++ COMPILER::TAIL-RECURSION-POSSIBLE COMPILER::VS-PUSH ++ COMPILER::WT-CVARS COMPILER::RESET-TOP COMPILER::WT-DATA-BEGIN ++ COMPILER::WFS-ERROR COMPILER::PRINT-CURRENT-FORM ++ COMPILER::INIT-ENV COMPILER::BABOON COMPILER::WT-NEXT-VAR-ARG ++ COMPILER::GAZONK-NAME COMPILER::ADD-LOAD-TIME-SHARP-COMMA ++ COMPILER::WT-DATA-FILE COMPILER::PRINT-COMPILER-INFO ++ COMPILER::C1T)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS +- COMPILER::ANALYZE-REGS1)) ++ COMMON-LISP::T) ++ COMPILER::GET-INLINE-LOC SYSTEM::ADD-DEBUG COMPILER::FAST-READ ++ COMPILER::WT-GO COMPILER::MAKE-USER-INIT COMPILER::C2THROW ++ COMPILER::C2MULTIPLE-VALUE-PROG1 COMPILER::NEXT-CFUN ++ COMPILER::TYPE>= COMPILER::C2DM-BIND-INIT ++ COMPILER::NCONC-FILES COMPILER::DO-CHANGED COMPILER::BASE-USED ++ COMPILER::COERCE-LOC COMPILER::NEXT-LABEL* ++ COMPILER::PUSH-CHANGED COMPILER::C2DM-BIND-VL ++ COMPILER::WT-FIXNUM-VALUE COMPILER::TYPE-AND ++ COMPILER::CAN-BE-REPLACED SYSTEM::DEFINE-INLINE-FUNCTION ++ COMPILER::CONVERT-CASE-TO-SWITCH COMPILER::SET-BDS-BIND ++ COMPILER::NEED-TO-PROTECT COMPILER::COMPILER-BUILD ++ COMPILER::SAFE-COMPILE COMPILER::C2EXPR-TOP* ++ COMPILER::IS-REFERRED COMPILER::C1FMLA COMPILER::CK-SPEC ++ COMPILER::CO1WRITE-BYTE COMPILER::CO1CONSTANT-FOLD ++ COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::CO1TYPEP ++ COMPILER::BIGNUM-EXPANSION-STORAGE COMPILER::C1CONSTANT-VALUE ++ COMPILER::CHANGED-LENGTH COMPILER::UNWIND-BDS ++ COMPILER::DOTIMES** COMPILER::CO1CONS ++ COMPILER::CO1STRUCTURE-PREDICATE COMPILER::DO-REFERRED ++ COMPILER::C2ASSOC!2 COMPILER::NEXT-LABEL ++ COMPILER::C2CALL-LAMBDA COMPILER::C1PROGN* COMPILER::FLAG-P ++ COMPILER::CFAST-WRITE COMPILER::T23EXPR ++ COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::CO1VECTOR-PUSH ++ COMPILER::WT-LABEL COMPILER::C2CATCH ++ COMPILER::CHECK-FNAME-ARGS COMPILER::SET-DBIND ++ COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY COMPILER::SET-VS ++ COMPILER::C1DECL-BODY COMPILER::C1ARGS ++ COMPILER::C2LIST-NTH-IMMEDIATE COMPILER::C2RETURN-CCB ++ COMPILER::IN-ARRAY COMMON-LISP::DEFINE-COMPILER-MACRO ++ COMPILER::C2APPLY COMPILER::CO1WRITE-CHAR ++ COMPILER::C2DM-BIND-LOC COMPILER::WT-NL ++ COMPILER::WT-LONG-FLOAT-VALUE COMPILER::CO1READ-BYTE ++ COMPILER::REMOVE-FLAG COMPILER::CO1LDB COMPILER::WT-VAR ++ COMPILER::COERCE-LOC-STRUCTURE-REF COMPILER::PUSH-CHANGED-VARS ++ COMPILER::C2PSETQ COMPILER::SHIFT>> COMPILER::PROCLAIM-VAR ++ COMPILER::IS-CHANGED COMPILER::ADD-DEBUG-INFO ++ COMPILER::CO1SUBLIS COMPILER::WT-CHARACTER-VALUE ++ COMPILER::C2EXPR-TOP COMPILER::WT-REQUIREDS COMPILER::DOTIMES* ++ COMPILER::PRIN1-CMP COMPILER::PUSH-CHANGED-WITH-START ++ COMPILER::DOLIST* COMPILER::C2BLOCK-CLB COMPILER::CMPCK ++ COMPILER::PUSH-REFERRED-WITH-START COMPILER::INLINE-PROC ++ COMPILER::CK-VL COMPILER::C1EXPR* COMPILER::WT-H ++ COMPILER::STRUCT-TYPE-OPT COMPILER::C2UNWIND-PROTECT ++ COMPILER::ARGS-INFO-CHANGED-VARS ++ COMPILER::C2LAMBDA-EXPR-WITH-KEY COMPILER::SET-JUMP-TRUE ++ COMPILER::WT-MAKE-DCLOSURE COMPILER::WT-NL1 COMPILER::CO1SCHAR ++ COMPILER::JUMPS-TO-P COMPILER::DOLIST** ++ COMPILER::COMPILER-DEF-HOOK COMPILER::NEXT-CMACRO ++ COMPILER::C2MEMBER!2 COMPILER::RESULT-TYPE-FROM-ARGS ++ COMPILER::CO1EQL COMPILER::C2CALL-LOCAL ++ COMPILER::SET-JUMP-FALSE COMPILER::C2MULTIPLE-VALUE-CALL ++ COMPILER::C2BIND-LOC COMPILER::C1SETQ1 COMPILER::CO1READ-CHAR ++ COMPILER::REFERRED-LENGTH COMPILER::C2STACK-LET COMPILER::WT ++ COMPILER::CMPFIX-ARGS COMPILER::NEXT-CVAR ++ COMPILER::ARGS-INFO-REFERRED-VARS ++ COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES SYSTEM::SWITCH ++ COMPILER::COMPILER-CC COMPILER::FLAGS COMPILER::T3SHARP-COMMA ++ COMPILER::C2SETQ COMPILER::C2RETURN-CLB COMPILER::C1LAMBDA-FUN ++ COMPILER::C2BLOCK-CCB COMPILER::IS-REP-REFERRED ++ COMPILER::MAYBE-WT-C2DM-BIND-VL COMPILER::WT-V*-MACROS ++ SYSTEM::SWITCH-FINISH COMPILER::STACK-LET COMPILER::SHIFT<< ++ COMPILER::DO-ARRAY COMPILER::MULTIPLE-VALUE-CHECK ++ COMPILER::DOWNWARD-FUNCTION COMPILER::EQL-NOT-NIL ++ COMPILER::ADD-INFO COMPILER::MAYBE-EVAL COMPILER::MIA ++ COMPILER::PUSH-REFERRED COMPILER::C2BIND-INIT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- COMPILER::DECL-BODY-SAFETY COMPILER::C2FUNCTION +- COMPILER::C1PROGN COMPILER::C1MAPCAR COMPILER::C1FLET +- COMPILER::C1EXPR COMPILER::C1LET COMPILER::ADD-OBJECT +- COMPILER::C1LABELS COMPILER::C1FMLA-CONSTANT COMPILER::C1ECASE +- COMPILER::C1LENGTH COMPILER::C1APPLY COMPILER::THE-PARAMETER +- COMPILER::C1TAGBODY COMPILER::T3CLINES +- COMPILER::VERIFY-DATA-VECTOR COMPILER::VAR-KIND +- COMPILER::INLINE-TYPE COMPILER::C1MULTIPLE-VALUE-CALL +- COMPILER::C2GET COMPILER::ADD-CONSTANT COMPILER::T1DEFMACRO +- COMPILER::C2EXPR* COMPILER::TAG-UNWIND-EXIT +- COMPILER::CHECK-DOWNWARD COMPILER::WT-CADR +- COMPILER::CHARACTER-LOC-P COMPILER::C1DECLARE +- COMPILER::AET-C-TYPE COMPILER::C1QUOTE COMPILER::CHECK-VREF +- COMPILER::VAR-LOC COMPILER::INLINE-POSSIBLE COMPILER::SET-TOP +- COMPILER::T1ORDINARY COMPILER::BLK-VAR COMPILER::SAVE-AVMA +- COMPILER::C1VREF COMPILER::WT-VV COMPILER::C2GO-LOCAL +- COMPILER::C1MEMBER COMPILER::LTVP-EVAL COMPILER::VV-STR +- COMPILER::TAG-REF-CLB COMPILER::T2DECLARE +- COMPILER::CMP-MACROEXPAND-1 COMPILER::T1DEFINE-STRUCTURE +- COMPILER::T1DEFENTRY COMPILER::ADD-OBJECT2 COMPILER::FUN-LEVEL +- COMPILER::VAR-P COMPILER::WT-DATA-PACKAGE-OPERATION +- COMPILER::PUSH-ARGS-LISPCALL COMPILER::C1PSETQ COMPILER::C1OR +- COMPILER::C1LOCAL-FUN COMPILER::WT-VS-BASE +- COMPILER::DEFAULT-INIT COMPILER::C1MAPCON COMPILER::C1GO +- COMPILER::INFO-REFERRED-ARRAY COMPILER::BLK-REF +- COMPILER::T1DEFLA COMPILER::INFO-CHANGED-ARRAY +- COMPILER::WT-VAR-DECL COMPILER::UNWIND-NO-EXIT +- COMPILER::BLK-VALUE-TO-GO COMPILER::C2GO-CLB +- COMPILER::FUNCTION-ARG-TYPES COMPILER::C1MAPC +- COMPILER::C2DOWNWARD-FUNCTION COMPILER::CMP-MACRO-FUNCTION +- COMPILER::C1SHARP-COMMA COMPILER::ADD-ADDRESS +- COMPILER::GET-LOCAL-RETURN-TYPE COMPILER::T1DEFUN +- COMPILER::C1ADD-GLOBALS COMPILER::C2DM-RESERVE-V +- COMPILER::C1ASH COMPILER::C1STACK-LET +- COMPILER::WT-SYMBOL-FUNCTION COMPILER::C2TAGBODY-CLB +- COMPILER::C1MAPLIST COMPILER::PUSH-DATA-INCF +- COMPILER::C2TAGBODY-LOCAL COMPILER::C1FSET COMPILER::WT1 +- COMPILER::VAR-REF-CCB COMPILER::INFO-P COMPILER::C1ASSOC +- COMPILER::C2GETHASH COMPILER::C1RPLACD COMPILER::C1EVAL-WHEN +- COMPILER::REP-TYPE COMPILER::C1FUNOB COMPILER::BLK-REF-CLB +- COMPILER::WT-VS* COMPILER::C1GET COMPILER::SCH-LOCAL-FUN +- COMPILER::SET-PUSH-CATCH-FRAME COMPILER::C1BOOLE3 +- COMPILER::BLK-EXIT COMPILER::T1DEFCFUN COMPILER::GET-ARG-TYPES +- COMPILER::WRITE-BLOCK-OPEN COMPILER::C1COMPILER-LET +- COMPILER::ADD-LOOP-REGISTERS COMPILER::INLINE-BOOLE3-STRING +- COMPILER::C1LOAD-TIME-VALUE COMPILER::VAR-TYPE +- COMPILER::REGISTER COMPILER::RESET-INFO-TYPE +- COMPILER::C1UNWIND-PROTECT COMPILER::C1IF +- COMPILER::SHORT-FLOAT-LOC-P COMPILER::C1VAR +- COMPILER::WT-FUNCALL-C COMPILER::C1THE COMPILER::FIX-OPT +- COMPILER::UNDEFINED-VARIABLE COMPILER::C2RPLACD +- COMPILER::C1BOOLE-CONDITION COMPILER::C1NTH COMPILER::VARARG-P +- COMPILER::OBJECT-TYPE COMPILER::VOLATILE COMPILER::FUN-P +- COMPILER::VAR-REF COMPILER::C1DEFINE-STRUCTURE +- COMPILER::MAXARGS COMPILER::LONG-FLOAT-LOC-P +- COMPILER::REPLACE-CONSTANT COMPILER::C2TAGBODY-BODY +- COMPILER::TAG-P COMPILER::C1RETURN-FROM COMPILER::WT-VS +- COMPILER::ARGS-CAUSE-SIDE-EFFECT COMPILER::C1LIST-NTH +- COMPILER::FSET-FN-NAME COMPILER::SAVE-FUNOB COMPILER::C1BLOCK +- COMPILER::C1AND COMPILER::C2TAGBODY-CCB COMPILER::GET-INCLUDED +- COMPILER::TAG-REF COMPILER::NEED-TO-SET-VS-POINTERS +- COMPILER::C1VALUES COMPILER::BLK-P COMPILER::COPY-INFO +- COMPILER::WT-CAR COMPILER::FUN-CFUN +- COMPILER::C1MULTIPLE-VALUE-PROG1 SYSTEM::UNDEF-COMPILER-MACRO +- COMPILER::C1DM-BAD-KEY COMPILER::FUN-REF COMPILER::NAME-SD1 +- COMPILER::MDELETE-FILE COMPILER::SAFE-SYSTEM +- COMPILER::WT-DATA2 COMPILER::WT-CDR COMPILER::C2GO-CCB +- COMPILER::C1ASH-CONDITION COMPILER::C1RPLACA +- COMPILER::WT-DATA1 COMPILER::C1RPLACA-NTHCDR +- COMPILER::NAME-TO-SD COMPILER::WT-LIST +- COMPILER::CMP-MACROEXPAND COMPILER::WT-SWITCH-CASE +- COMPILER::GET-LOCAL-ARG-TYPES COMPILER::SET-UP-VAR-CVS +- COMPILER::WT-FASD-ELEMENT COMPILER::RESULT-TYPE +- COMPILER::C1SWITCH COMPILER::FIXNUM-LOC-P +- COMPILER::C1NTHCDR-CONDITION COMPILER::TAG-VAR +- COMPILER::C1NTHCDR COMPILER::CLINK COMPILER::LTVP +- COMPILER::C1LET* COMPILER::TAG-NAME COMPILER::C1FUNCALL +- COMPILER::C2RPLACA COMPILER::MACRO-DEF-P +- COMPILER::C1STRUCTURE-REF COMPILER::GET-RETURN-TYPE +- COMPILER::C1DOWNWARD-FUNCTION COMPILER::T1CLINES +- COMPILER::TYPE-FILTER COMPILER::C1FUNCTION +- COMPILER::CONS-TO-LISTA COMPILER::C1NTH-CONDITION +- COMPILER::FUN-NAME COMPILER::PROCLAMATION COMPILER::VAR-NAME +- COMPILER::WT-CCB-VS COMPILER::FLAGS-POS COMPILER::C1CATCH +- COMPILER::CTOP-WRITE COMPILER::TAG-LABEL COMPILER::C1MEMQ +- COMPILER::C1GETHASH COMPILER::TAG-REF-CCB COMPILER::TAG-SWITCH +- COMPILER::C2BIND COMPILER::VERIFY-DATUM COMPILER::C1MAPCAN +- COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::C1TERPRI +- COMPILER::FUN-REF-CCB COMMON-LISP::PROCLAIM +- COMPILER::INFO-VOLATILE COMPILER::T3ORDINARY +- COMPILER::C2LOCATION COMPILER::BLK-NAME +- COMPILER::C1STRUCTURE-SET COMPILER::C2VAR +- COMPILER::C1LOCAL-CLOSURE COMPILER::C1MACROLET +- COMPILER::WT-FUNCTION-LINK COMPILER::C2VALUES +- COMPILER::T1MACROLET COMPILER::C1MULTIPLE-VALUE-BIND +- COMPILER::C2FUNCALL-AUX COMPILER::C1MULTIPLE-VALUE-SETQ +- COMPILER::PUSH-ARGS COMPILER::BLK-REF-CCB COMPILER::C1SETQ +- COMPILER::ADD-SYMBOL COMPILER::C2VAR-KIND COMPILER::C1THROW +- COMPILER::DECLARATION-TYPE COMPILER::C1PROGV +- COMPILER::INFO-TYPE COMPILER::CONSTANT-FOLD-P +- COMPILER::C1PRINC COMPILER::WT-DOWN COMPILER::SCH-GLOBAL +- COMPILER::T1PROGN COMPILER::INFO-SP-CHANGE +- COMPILER::C2DM-RESERVE-VL COMPILER::C1MAPL +- COMPILER::FUNCTION-RETURN-TYPE COMPILER::ADD-REG1 +- COMPILER::PARSE-CVSPECS COMPILER::FUN-INFO +- COMPILER::VAR-REGISTER COMPILER::SET-RETURN COMPILER::WT-H1 +- COMPILER::VAR-REP-LOC)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMPILER::COMPILE-FILE1 COMMON-LISP::COMPILE-FILE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- COMPILER::INLINE-BOOLE3)) ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*))) ++ COMMON-LISP::T) ++ COMPILER::COPY-ARRAY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- COMPILER::C2LABELS COMPILER::C2FLET COMPILER::C2IF +- COMPILER::WT-INLINE COMPILER::C2COMPILER-LET)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS ++ COMPILER::ANALYZE-REGS1)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(COMMON-LISP::DISASSEMBLE COMMON-LISP::COMPILE COMPILER::CMP-ANON ++ COMPILER::CMP-TMP-MACRO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::*) +- COMPILER::C1DM-V COMPILER::C1DM-VL COMPILER::C2APPLY-OPTIMIZE +- COMPILER::C2RETURN-FROM COMPILER::C2DM)) ++ COMPILER::C1DM-VL COMPILER::C2RETURN-FROM COMPILER::C2DM ++ COMPILER::C1DM-V COMPILER::C2APPLY-OPTIMIZE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -182,114 +163,34 @@ + COMPILER::T3DEFUN-AUX)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- COMPILER::F-TYPE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- COMPILER::C2RETURN-CCB +- COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES +- COMPILER::DO-CHANGED COMPILER::CO1STRUCTURE-PREDICATE +- COMPILER::RESULT-TYPE-FROM-ARGS COMPILER::CMPFIX-ARGS +- COMPILER::T3SHARP-COMMA COMPILER::FLAGS +- COMPILER::CO1WRITE-BYTE COMPILER::CHECK-FNAME-ARGS +- COMPILER::C2ASSOC!2 COMPILER::CK-SPEC +- COMPILER::COERCE-LOC-STRUCTURE-REF COMPILER::ADD-DEBUG-INFO +- COMPILER::C2LAMBDA-EXPR-WITH-KEY COMPILER::PRIN1-CMP +- COMPILER::PUSH-CHANGED-VARS COMPILER::SHIFT>> +- COMPILER::ARGS-INFO-REFERRED-VARS +- COMPILER::C2MULTIPLE-VALUE-CALL +- COMPILER::ARGS-INFO-CHANGED-VARS COMPILER::CO1SCHAR +- COMPILER::NEXT-CVAR COMPILER::C2RETURN-CLB +- COMPILER::CO1WRITE-CHAR COMPILER::SET-VS SYSTEM::SWITCH +- COMPILER::FLAG-P COMPILER::DO-ARRAY COMPILER::INLINE-PROC +- COMPILER::CO1CONS COMPILER::C2EXPR-TOP +- COMPILER::CHANGED-LENGTH COMPILER::C2MULTIPLE-VALUE-PROG1 +- COMPILER::REMOVE-FLAG COMPILER::CO1SUBLIS COMPILER::ADD-INFO +- COMPILER::C2BIND-INIT COMPILER::C2DM-BIND-VL COMPILER::C1FMLA +- COMPILER::C2CATCH COMPILER::WT-MAKE-DCLOSURE +- COMPILER::UNWIND-BDS COMPILER::IS-REP-REFERRED +- COMPILER::WT-LONG-FLOAT-VALUE COMPILER::WT-GO +- COMPILER::FAST-READ COMPILER::WT COMPILER::SAFE-COMPILE +- COMPILER::WT-H COMPILER::STRUCT-TYPE-OPT +- COMPILER::REFERRED-LENGTH COMPILER::TYPE-AND COMPILER::C2THROW +- COMPILER::NEED-TO-PROTECT COMPILER::COERCE-LOC +- COMPILER::TYPE>= COMPILER::WT-NL1 COMPILER::CHECK-END +- COMPILER::C2BLOCK-CCB COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY +- COMPILER::SET-BDS-BIND COMPILER::C2DM-BIND-INIT +- COMPILER::CAN-BE-REPLACED COMPILER::MAYBE-EVAL +- COMPILER::WT-VAR COMPILER::WT-REQUIREDS +- COMPILER::CONVERT-CASE-TO-SWITCH COMPILER::CO1TYPEP +- COMPILER::C1DECL-BODY COMPILER::DOWNWARD-FUNCTION +- COMPILER::MULTIPLE-VALUE-CHECK COMPILER::NEXT-CFUN +- SYSTEM::SWITCH-FINISH COMPILER::CO1READ-CHAR +- COMPILER::COMPILER-CC COMPILER::C1PROGN* +- COMPILER::C1LAMBDA-FUN COMPILER::MAKE-USER-INIT +- COMPILER::SHIFT<< COMPILER::C1ARGS COMPILER::CK-VL +- COMPILER::T23EXPR COMPILER::IS-CHANGED COMPILER::PUSH-REFERRED +- COMPILER::WT-CHARACTER-VALUE +- COMPILER::PUSH-REFERRED-WITH-START COMPILER::NEXT-LABEL* +- COMPILER::CMPCK COMPILER::C2DM-BIND-LOC +- COMPILER::WT-SHORT-FLOAT-VALUE +- COMPILER::PUSH-CHANGED-WITH-START COMPILER::C2EXPR-TOP* +- COMPILER::DOLIST* COMPILER::WT-LABEL COMPILER::PUSH-CHANGED +- COMPILER::BASE-USED COMPILER::CO1VECTOR-PUSH +- COMPILER::WT-V*-MACROS COMPILER::CO1CONSTANT-FOLD +- COMPILER::WT-FIXNUM-VALUE COMPILER::C2BLOCK-CLB +- SYSTEM::DEFINE-INLINE-FUNCTION COMPILER::SET-JUMP-TRUE +- COMPILER::C2BIND-LOC COMPILER::IN-ARRAY +- COMPILER::SET-JUMP-FALSE COMPILER::PROCLAIM-VAR +- COMMON-LISP::DEFINE-COMPILER-MACRO COMPILER::C1CONSTANT-VALUE +- COMPILER::COMPILER-DEF-HOOK COMPILER::CO1READ-BYTE +- COMPILER::MAYBE-WT-C2DM-BIND-VL COMPILER::IS-REFERRED +- COMPILER::DOTIMES** SYSTEM::ADD-DEBUG COMPILER::DO-REFERRED +- COMPILER::NEXT-LABEL COMPILER::C2CALL-LAMBDA COMPILER::C2APPLY +- COMPILER::C1EXPR* COMPILER::C2SETQ COMPILER::MIA +- COMPILER::C2PSETQ COMPILER::C1SETQ1 +- COMPILER::C2LIST-NTH-IMMEDIATE COMPILER::WT-NL +- COMPILER::CO1EQL COMPILER::CFAST-WRITE COMPILER::CO1LDB +- COMPILER::EQL-NOT-NIL COMPILER::JUMPS-TO-P +- COMPILER::C2CALL-LOCAL COMPILER::BIGNUM-EXPANSION-STORAGE +- COMPILER::STACK-LET COMPILER::C2MULTIPLE-VALUE-SETQ +- COMPILER::C2MEMBER!2 COMPILER::C2UNWIND-PROTECT +- COMPILER::DOLIST** COMPILER::SET-DBIND COMPILER::DOTIMES* +- COMPILER::NEXT-CMACRO COMPILER::GET-INLINE-LOC +- COMPILER::C2STACK-LET)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- COMPILER::COMPILE-FILE1)) ++ COMPILER::C2IF COMPILER::WT-INLINE COMPILER::C2FLET ++ COMPILER::C2LABELS COMPILER::C2COMPILER-LET)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::BSEARCHLEQ)) ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) ++ COMMON-LISP::T) ++ COMPILER::TS COMPILER::DASH-TO-UNDERSCORE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::PUSH-ARRAY)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::C2BLOCK-LOCAL COMPILER::C1SYMBOL-FUN ++ COMPILER::WT-INLINE-LOC COMPILER::C2RETURN-LOCAL ++ COMPILER::C2BLOCK COMPILER::C2DECL-BODY COMPILER::C1BODY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::TS COMPILER::DASH-TO-UNDERSCORE)) ++ COMPILER::WT-COMMENT COMPILER::INIT-NAME COMPILER::ADD-INIT ++ COMPILER::CMPWARN COMPILER::FAST-LINK-PROCLAIMED-TYPE-P ++ COMPILER::UNWIND-EXIT COMPILER::CMPNOTE COMPILER::C1CASE ++ COMPILER::WT-INTEGER-LOC COMPILER::C1LAMBDA-EXPR ++ COMPILER::WT-CVAR COMPILER::CMPERR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -303,121 +204,208 @@ + COMPILER::DASH-TO-UNDERSCORE-INT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- COMPILER::VS-PUSH COMPILER::WFS-ERROR COMPILER::MACRO-ENV +- COMPILER::C1T COMPILER::WT-CVARS COMPILER::WT-DATA-END +- COMPILER::GAZONK-NAME COMPILER::INIT-ENV +- COMPILER::ADD-LOAD-TIME-SHARP-COMMA COMPILER::CCB-VS-PUSH +- COMPILER::WT-DATA-FILE COMPILER::WT-FASD-DATA-FILE +- COMPILER::INC-INLINE-BLOCKS COMPILER::PRINT-CURRENT-FORM +- COMPILER::CLOSE-INLINE-BLOCKS COMPILER::WT-DATA-BEGIN +- COMPILER::BABOON COMPILER::WT-C-PUSH COMPILER::WT-NEXT-VAR-ARG +- COMPILER::WT-FIRST-VAR-ARG COMPILER::CVS-PUSH +- COMPILER::TAIL-RECURSION-POSSIBLE COMPILER::RESET-TOP +- COMPILER::C1NIL COMPILER::PRINT-COMPILER-INFO)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::WT-GLOBAL-ENTRY COMPILER::MY-CALL ++ COMPILER::C2CALL-GLOBAL COMPILER::C1MAKE-VAR ++ COMPILER::T3DEFUN-VARARG COMPILER::C2SWITCH ++ COMPILER::C2CALL-UNKNOWN-GLOBAL COMPILER::C2STRUCTURE-REF ++ COMPILER::T3DEFUN-NORMAL COMPILER::WT-IF-PROCLAIMED)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*))) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::COPY-ARRAY)) ++ COMPILER::T3LOCAL-FUN COMPILER::T2DEFUN ++ COMPILER::T3LOCAL-DCFUN COMPILER::T3DEFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- COMPILER::T1EXPR COMPILER::WT-TO-STRING COMPILER::C2OR +- COMPILER::WT-LOC COMPILER::SET-LOC COMPILER::MEXPAND-DEFTYPE +- COMPILER::C2EXPR COMPILER::C2PROGN COMPILER::C2AND +- COMPILER::WT-SHORT-FLOAT-LOC COMPILER::WT-CHARACTER-LOC +- COMPILER::CMP-EVAL COMPILER::T1EVAL-WHEN +- COMPILER::WT-LONG-FLOAT-LOC COMPILER::CMP-TOPLEVEL-EVAL +- COMPILER::WT-FIXNUM-LOC)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::MYSUB COMPILER::WT-INLINE-INTEGER COMPILER::C2MAPC ++ COMPILER::WT-INLINE-LONG-FLOAT COMPILER::C2PROGV ++ COMPILER::CHECK-VDECL COMPILER::AND-FORM-TYPE ++ COMPILER::WT-INLINE-CHARACTER COMPILER::C2MAPCAR ++ COMPILER::MAKE-INLINE-STRING COMPILER::C-FUNCTION-NAME ++ COMPILER::WT-INLINE-COND COMPILER::ADD-FUNCTION-DECLARATION ++ COMPILER::T3DEFCFUN COMPILER::C2MAPCAN COMPILER::C1DM ++ COMPILER::ASSIGN-DOWN-VARS COMPILER::CJT COMPILER::SET-VAR ++ COMPILER::COMPILER-PASS2 COMPILER::TOO-FEW-ARGS ++ COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2GO ++ COMPILER::C2FUNCALL-SFUN COMPILER::C2PRINC ++ COMPILER::WT-INLINE-SHORT-FLOAT COMPILER::C1STRUCTURE-REF1 ++ COMPILER::GET-INLINE-INFO COMPILER::CAN-BE-REPLACED* ++ COMPILER::CJF COMPILER::ADD-FUNCTION-PROCLAMATION ++ COMPILER::C2LET* COMPILER::C2TAGBODY ++ COMPILER::CMP-EXPAND-MACRO COMPILER::CHECK-FORM-TYPE ++ COMPILER::C2LET COMPILER::C2CASE COMPILER::WT-MAKE-CCLOSURE ++ COMPILER::TOO-MANY-ARGS COMPILER::BOOLE3 ++ COMPILER::SUBLIS1-INLINE COMPILER::WT-INLINE-FIXNUM ++ COMPILER::FIX-DOWN-ARGS COMPILER::C1MAP-FUNCTIONS ++ COMPILER::INLINE-TYPE-MATCHES COMPILER::ADD-FAST-LINK)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- COMPILER::FCALLN-INLINE COMPILER::CS-PUSH COMPILER::WT-CLINK +- COMPILER::COMPILER-COMMAND COMPILER::MAKE-INFO +- COMPILER::T2PROGN COMPILER::MAKE-TAG COMPILER::C2FSET +- COMPILER::MAKE-BLK COMPILER::LIST-INLINE +- COMMON-LISP::COMPILE-FILE COMPILER::MAKE-FUN +- COMPILER::MAKE-VAR COMPILER::T3PROGN COMPILER::LIST*-INLINE)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(COMMON-LISP::COMPILE COMMON-LISP::DISASSEMBLE COMPILER::CMP-ANON +- COMPILER::CMP-TMP-MACRO)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::C2LAMBDA-EXPR COMPILER::INLINE-ARGS ++ COMPILER::C2FUNCALL COMPILER::LINK)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::T3DEFUN-VARARG COMPILER::T3DEFUN-NORMAL +- COMPILER::C2CALL-GLOBAL COMPILER::C2SWITCH COMPILER::MY-CALL +- COMPILER::C1MAKE-VAR COMPILER::WT-IF-PROCLAIMED +- COMPILER::C2STRUCTURE-REF COMPILER::C2CALL-UNKNOWN-GLOBAL +- COMPILER::WT-GLOBAL-ENTRY)) ++ COMPILER::C2STRUCTURE-SET COMPILER::T3INIT-FUN ++ COMPILER::C1APPLY-OPTIMIZE COMPILER::T3DEFUN-LOCAL-ENTRY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::T2DEFENTRY COMPILER::T3DEFENTRY COMPILER::DEFSYSFUN)) ++ COMPILER::T2DEFENTRY COMPILER::DEFSYSFUN COMPILER::T3DEFENTRY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::C2PROGV COMPILER::WT-INLINE-COND COMPILER::C2TAGBODY +- COMPILER::CAN-BE-REPLACED* COMPILER::WT-INLINE-FIXNUM +- COMPILER::MAKE-INLINE-STRING COMPILER::WT-INLINE-SHORT-FLOAT +- COMPILER::C2LET* COMPILER::ADD-FAST-LINK +- COMPILER::C1STRUCTURE-REF1 COMPILER::GET-INLINE-INFO +- COMPILER::CHECK-FORM-TYPE COMPILER::C2MAPCAN +- COMPILER::FIX-DOWN-ARGS COMPILER::CMP-EXPAND-MACRO +- COMPILER::SUBLIS1-INLINE COMPILER::ADD-FUNCTION-PROCLAMATION +- COMPILER::ADD-FUNCTION-DECLARATION COMPILER::SET-VAR +- COMPILER::BOOLE3 COMPILER::CJF COMPILER::C2PRINC +- COMPILER::INLINE-TYPE-MATCHES COMPILER::C1MAP-FUNCTIONS +- COMPILER::C1DM COMPILER::WT-INLINE-CHARACTER +- COMPILER::WT-MAKE-CCLOSURE COMPILER::TOO-MANY-ARGS +- COMPILER::COMPILER-PASS2 COMPILER::WT-INLINE-INTEGER +- COMPILER::T3DEFCFUN COMPILER::MYSUB +- COMPILER::WT-INLINE-LONG-FLOAT COMPILER::TOO-FEW-ARGS +- COMPILER::CHECK-VDECL COMPILER::C2GO COMPILER::C2LET +- COMPILER::ASSIGN-DOWN-VARS COMPILER::C2CASE +- COMPILER::C2FUNCALL-SFUN COMPILER::AND-FORM-TYPE +- COMPILER::C-FUNCTION-NAME COMPILER::C2MAPCAR COMPILER::CJT +- COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2MAPC)) ++ COMPILER::GET-OUTPUT-PATHNAME COMPILER::WT-SIMPLE-CALL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- COMPILER::C1APPLY-OPTIMIZE COMPILER::T3DEFUN-LOCAL-ENTRY +- COMPILER::T3INIT-FUN COMPILER::C2STRUCTURE-SET)) ++ COMPILER::MLIN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- COMPILER::T3DEFUN COMPILER::T2DEFUN COMPILER::T3LOCAL-FUN +- COMPILER::T3LOCAL-DCFUN)) ++ COMPILER::MEMOIZED-HASH-EQUAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL COMPILER::LINK +- COMPILER::INLINE-ARGS)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ COMPILER::C1PSETQ COMPILER::ADD-LOOP-REGISTERS ++ COMPILER::FSET-FN-NAME COMPILER::CMP-MACRO-FUNCTION ++ COMPILER::C1PROGN COMPILER::C1SHARP-COMMA COMPILER::C1PRINC ++ COMPILER::C1EXPR COMPILER::CONS-TO-LISTA ++ COMPILER::RESET-INFO-TYPE COMPILER::WT-VS* ++ COMPILER::FUNCTION-RETURN-TYPE COMPILER::C2DM-RESERVE-VL ++ COMPILER::C1APPLY COMPILER::GET-INCLUDED COMPILER::BLK-REF-CCB ++ COMPILER::C1MACROLET COMPILER::ADD-OBJECT ++ COMPILER::C1ASH-CONDITION COMPILER::FUN-REF COMPILER::T1DEFLA ++ COMPILER::C1NTHCDR COMPILER::C1FUNCTION COMPILER::PROCLAMATION ++ COMPILER::C2FUNCALL-AUX COMPILER::MAXARGS ++ COMPILER::INFO-VOLATILE COMPILER::C1ASSOC COMPILER::C1MAPLIST ++ COMPILER::CLINK COMPILER::C1BOOLE-CONDITION COMPILER::C1VAR ++ COMPILER::VERIFY-DATUM COMPILER::C1OR ++ COMPILER::FUNCTION-ARG-TYPES COMPILER::C2FUNCTION ++ COMPILER::INLINE-POSSIBLE COMPILER::C2GO-LOCAL ++ COMPILER::C1COMPILER-LET COMPILER::NAME-SD1 COMPILER::C1LET ++ COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C1LOCAL-FUN ++ COMPILER::CHARACTER-LOC-P COMPILER::VARARG-P ++ COMPILER::FIXNUM-LOC-P COMPILER::SAVE-FUNOB COMPILER::BLK-VAR ++ COMPILER::C1STACK-LET COMPILER::C1FUNCALL ++ COMPILER::INFO-SP-CHANGE COMPILER::T1DEFINE-STRUCTURE ++ COMPILER::C1THROW COMPILER::T2PROGN COMPILER::GET-ARG-TYPES ++ COMMON-LISP::PROCLAIM COMPILER::C2LOCATION COMPILER::C1IF ++ COMPILER::CHECK-DOWNWARD COMPILER::TAG-REF-CCB ++ COMPILER::C1MEMBER COMPILER::VAR-REP-LOC COMPILER::VV-STR ++ COMPILER::C1RETURN-FROM COMPILER::SET-PUSH-CATCH-FRAME ++ COMPILER::C2TAGBODY-LOCAL COMPILER::C1MAPC COMPILER::C1LET* ++ COMPILER::WT1 COMPILER::C1PROGV COMPILER::C2TAGBODY-BODY ++ COMPILER::C1TERPRI COMPILER::FUN-INFO COMPILER::C1EVAL-WHEN ++ COMPILER::WT-CDR COMPILER::WT-VAR-DECL COMPILER::C1RPLACA ++ COMPILER::REPLACE-CONSTANT COMPILER::SET-TOP ++ COMPILER::OBJECT-TYPE COMPILER::C1TAGBODY COMPILER::T1ORDINARY ++ COMPILER::WT-VS-BASE COMPILER::CONSTANT-FOLD-P ++ COMPILER::C1RPLACD COMPILER::C1DOWNWARD-FUNCTION ++ COMPILER::TYPE-FILTER COMPILER::T3PROGN ++ COMPILER::C1LOCAL-CLOSURE COMPILER::C2RPLACD ++ COMPILER::TAG-UNWIND-EXIT COMPILER::PUSH-DATA-INCF ++ COMPILER::VAR-REF-CCB COMPILER::INFO-P ++ COMPILER::WT-SYMBOL-FUNCTION COMPILER::TAG-VAR ++ COMPILER::T1DEFMACRO COMPILER::CTOP-WRITE COMPILER::C1MAPCON ++ COMPILER::C1FUNOB COMPILER::C2BIND COMPILER::ADD-SYMBOL ++ COMPILER::SET-RETURN COMPILER::WT-CAR COMPILER::NAME-TO-SD ++ COMPILER::ADD-ADDRESS COMPILER::C2GETHASH COMPILER::C1FLET ++ COMPILER::C2TAGBODY-CLB COMPILER::C2VAR COMPILER::ADD-OBJECT2 ++ COMPILER::BLK-REF COMPILER::INLINE-TYPE COMPILER::C2RPLACA ++ COMPILER::C2GO-CCB COMPILER::WT-FUNCTION-LINK ++ COMPILER::T1DEFENTRY COMPILER::C1NTH COMPILER::COPY-INFO ++ COMPILER::WT-FASD-ELEMENT COMPILER::C1STRUCTURE-REF ++ COMPILER::LTVP-EVAL COMPILER::VAR-NAME COMPILER::C1BOOLE3 ++ COMPILER::C1STRUCTURE-SET COMPILER::WT-VS ++ COMPILER::INFO-CHANGED-ARRAY COMPILER::MACRO-DEF-P ++ COMPILER::TAG-P COMPILER::VAR-TYPE COMPILER::SHORT-FLOAT-LOC-P ++ COMPILER::AET-C-TYPE COMPILER::BLK-VALUE-TO-GO COMPILER::C1GET ++ COMPILER::C1AND COMPILER::C1SETQ COMPILER::C1LOAD-TIME-VALUE ++ COMPILER::C1ECASE COMPILER::C1MAPCAN COMPILER::T1DEFUN ++ COMPILER::C1DEFINE-STRUCTURE COMPILER::C1ASH ++ COMPILER::C1NTHCDR-CONDITION COMPILER::BLK-EXIT ++ COMPILER::FUN-P COMPILER::C1LABELS COMPILER::LONG-FLOAT-LOC-P ++ COMPILER::C1SWITCH COMPILER::T1CLINES ++ COMPILER::GET-RETURN-TYPE COMPILER::C1DM-BAD-KEY ++ COMPILER::T1PROGN COMPILER::C1QUOTE COMPILER::WT-SWITCH-CASE ++ COMPILER::FUN-LEVEL COMPILER::DECLARATION-TYPE ++ COMPILER::PARSE-CVSPECS COMPILER::WT-DATA1 COMPILER::REGISTER ++ COMPILER::C1FMLA-CONSTANT COMPILER::C1DECLARE COMPILER::VAR-P ++ COMPILER::ADD-REG1 COMPILER::C1UNWIND-PROTECT ++ COMPILER::C2VAR-KIND COMPILER::BLK-P COMPILER::INFO-TYPE ++ COMPILER::THE-PARAMETER COMPILER::C2VALUES ++ COMPILER::WRITE-BLOCK-OPEN COMPILER::C1NTH-CONDITION ++ COMPILER::C1MAPCAR COMPILER::VAR-LOC COMPILER::SCH-GLOBAL ++ COMPILER::WT-H1 COMPILER::SAVE-AVMA COMPILER::C1BLOCK ++ SYSTEM::UNDEF-COMPILER-MACRO COMPILER::C1MULTIPLE-VALUE-PROG1 ++ COMPILER::SAFE-SYSTEM COMPILER::DEFAULT-INIT ++ COMPILER::T3ORDINARY COMPILER::CMP-MACROEXPAND-1 ++ COMPILER::FUN-REF-CCB COMPILER::TAG-REF-CLB ++ COMPILER::C2DOWNWARD-FUNCTION COMPILER::C1THE ++ COMPILER::CHECK-VREF COMPILER::ARGS-CAUSE-SIDE-EFFECT ++ COMPILER::C1ADD-GLOBALS COMPILER::WT-LIST ++ COMPILER::SET-UP-VAR-CVS COMPILER::T1DEFCFUN ++ COMPILER::INLINE-BOOLE3-STRING COMPILER::FIX-OPT ++ COMPILER::VAR-REGISTER COMPILER::TAG-REF COMPILER::T2DECLARE ++ COMPILER::DECL-BODY-SAFETY COMPILER::C1VREF ++ COMPILER::C2DM-RESERVE-V COMPILER::BLK-NAME ++ COMPILER::C1RPLACA-NTHCDR COMPILER::VOLATILE ++ COMPILER::PUSH-ARGS COMPILER::C1FSET COMPILER::FLAGS-POS ++ COMPILER::TAG-LABEL COMPILER::C1MEMQ COMPILER::C1CATCH ++ COMPILER::GET-LOCAL-RETURN-TYPE COMPILER::WT-DATA2 ++ COMPILER::PUSH-ARGS-LISPCALL COMPILER::FUN-NAME ++ COMPILER::C2TAGBODY-CCB COMPILER::C2GET ++ COMPILER::INFO-REFERRED-ARRAY ++ COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::T1MACROLET ++ COMPILER::T3CLINES COMPILER::SCH-LOCAL-FUN COMPILER::C1LENGTH ++ COMPILER::WT-DOWN COMPILER::WT-FUNCALL-C COMPILER::RESULT-TYPE ++ COMPILER::MDELETE-FILE COMPILER::ADD-CONSTANT ++ COMPILER::C1VALUES COMPILER::C1GETHASH ++ COMPILER::CMP-MACROEXPAND COMPILER::FUN-CFUN COMPILER::C1MAPL ++ COMPILER::UNWIND-NO-EXIT COMPILER::BLK-REF-CLB COMPILER::WT-VV ++ COMPILER::VAR-KIND COMPILER::TAG-SWITCH COMPILER::WT-CCB-VS ++ COMPILER::REP-TYPE COMPILER::UNDEFINED-VARIABLE ++ COMPILER::C1MULTIPLE-VALUE-SETQ COMPILER::C2GO-CLB ++ COMPILER::NEED-TO-SET-VS-POINTERS COMPILER::LTVP ++ COMPILER::GET-LOCAL-ARG-TYPES COMPILER::COMPILE-ORDINARY-P ++ COMPILER::C1LIST-NTH COMPILER::C1GO ++ COMPILER::C1MULTIPLE-VALUE-CALL COMPILER::C2EXPR* ++ COMPILER::VAR-REF COMPILER::WT-CADR COMPILER::TAG-NAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::WT-SIMPLE-CALL COMPILER::GET-OUTPUT-PATHNAME)) +\ No newline at end of file ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ COMPILER::INLINE-BOOLE3)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ COMPILER::F-TYPE)) +\ No newline at end of file +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -7720,6 +7720,10 @@ then : + enableval=$enable_ansi; if test "$enable_ansi" = "no" ; then + SYSTEM=gcl + CLSTANDARD=CLtL1 ++ else ++ ++printf "%s\n" "#define ANSI_COMMON_LISP 1" >>confdefs.h ++ + fi + fi + +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1542,6 +1542,8 @@ AC_ARG_ENABLE([ansi],[ --enable-ansi bu + [if test "$enable_ansi" = "no" ; then + SYSTEM=gcl + CLSTANDARD=CLtL1 ++ else ++ AC_DEFINE([ANSI_COMMON_LISP],[1],[ANSI compliant image]) + fi]) + + FLISP="saved_$SYSTEM" +--- /dev/null ++++ gcl-2.6.12/git.tag +@@ -0,0 +1,2 @@ ++"Version_2_6_13pre125" ++ +--- gcl-2.6.12.orig/h/amd64-linux.h ++++ gcl-2.6.12/h/amd64-linux.h +@@ -22,3 +22,5 @@ + + #define RELOC_H "elf64_i386_reloc.h" + #define MAX_CODE_ADDRESS (1L<<31)/*large memory model broken gcc 4.8*/ ++#define MAX_DEFAULT_MEMORY_MODEL_CODE_ADDRESS (1UL<<31) ++#define LARGE_MEMORY_MODEL /*working -mcmodel=large giving unrestricted code load addresses*/ +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -9,6 +9,9 @@ + /* punt guess for no randomize value */ + #undef ADDR_NO_RANDOMIZE + ++/* ANSI compliant image */ ++#undef ANSI_COMMON_LISP ++ + /* binding stack size */ + #undef BDSSIZE + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -83,6 +83,7 @@ void old(void) \ + #undef FFD + #undef STATD + #undef make_function ++#undef make_macro_function + #undef make_si_function + #undef make_si_sfun + #undef make_special_form +@@ -91,6 +92,7 @@ void old(void) \ + #define LFD(a_) static void FFN(a_) (); void a_ () { FFN(a_)();} static void FFN(a_) + #define FFD(a_) static void FFN(a_) (object); void a_ (object x) { FFN(a_)(x);} static void FFN(a_) + #define make_function(a_,b_) make_function_internal(a_,FFN(b_)) ++#define make_macro_function(a_,b_) make_macro_internal(a_,FFN(b_)) + #define make_si_function(a_,b_) make_si_function_internal(a_,FFN(b_)) + #define make_special_form(a_,b_) make_special_form_internal(a_,FFN(b_)) + #define make_si_special_form(a_,b_) make_si_special_form_internal(a_,FFN(b_)) +@@ -101,6 +103,7 @@ void old(void) \ + #define LFD(a_) void a_ + #define FFD(a_) void a_ + #define make_function(a_,b_) make_function_internal(a_,b_) ++#define make_macro_function(a_,b_) make_macro_internal(a_,b_) + #define make_si_function(a_,b_) make_si_function_internal(a_,b_) + #define make_special_form(a_,b_) make_special_form_internal(a_,b_) + #define make_si_special_form(a_,b_) make_si_special_form_internal(a_,b_) +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -124,7 +124,8 @@ EXTER struct package *pack_pointer; /* + enum httest { /* hash table key test function */ + htt_eq, /* eq */ + htt_eql, /* eql */ +- htt_equal /* equal */ ++ htt_equal, /* equal */ ++ htt_equalp /* equalp */ + }; + + enum aelttype { /* array element type */ +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -120,6 +120,7 @@ struct key {short n,allow_other_keys; + /* cfun.c:221:OF */ extern object fSmf (object name, object addr); /* (name, addr) object name; object addr; */ + /* cfun.c:269:OF */ extern object fSmm (object name, object addr); /* (name, addr) object name; object addr; */ + /* cfun.c:283:OF */ extern object make_function_internal (char *s, void(*f)()); /* (s, f) char *s; int (*f)(); */ ++/* cfun.c:283:OF */ extern object make_macro_internal (char *s, void(*f)()); /* (s, f) char *s; int (*f)(); */ + /* cfun.c:299:OF */ extern object make_si_sfun_internal (char *s, object (*f)(), int argd); /* (s, f, argd) char *s; int (*f)(); int argd; */ + /* cfun.c:322:OF */ extern object make_si_function_internal (char *s, void (*f) ()); /* (s, f) char *s; int (*f)(); */ + /* cfun.c:341:OF */ extern object make_special_form_internal (char *s, void (*f)()); /* (s, f) char *s; int (*f)(); */ +@@ -203,6 +204,7 @@ typedef int (*FUNC)(); + /* eval.c:739:OF */ extern void super_funcall (object fun); /* (fun) object fun; */ + /* eval.c:752:OF */ extern void super_funcall_no_event (object fun); /* (fun) object fun; */ + /* eval.c:936:OF */ extern object Ieval (object form); /* (form) object form; */ ++#define Ieval1(x) Ieval(x) /*FIXME*/ + /* eval.c:944:OF */ extern void eval (object form); /* (form) object form; */ + /* eval.c:1189:OF */ extern void Leval (void); /* () */ + /* eval.c:1191:OF */ extern object fLeval (object x0); /* (x0) object x0; */ +@@ -1759,6 +1761,9 @@ gcl_isnormal_double(double); + int + gcl_isnormal_float(float); + ++int ++gcl_isnan(object); ++ + object + find_init_name1(char *,unsigned); + +@@ -1808,6 +1813,9 @@ find_init_string(const char *); + void * + get_mmap(FILE *,void **); + ++void * ++get_mmap_shared(FILE *,void **); ++ + int + un_mmap(void *,void *); + +@@ -1928,7 +1936,7 @@ void + maybe_set_hole_from_maxpages(void); + + void * +-alloc_code_space(size_t); ++alloc_code_space(size_t,ufixnum); + + object + fSmake_vector1_2(fixnum,fixnum,object,object); +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -129,11 +129,11 @@ + (dolist (l '(:unexec :bfd :readline :xgcl)) + (when (member l *features*) + (push l gpled-modules))) +- (format nil "GCL (GNU Common Lisp) ~a.~a.~a ~a ~a ~a~%~a~%~a ~a~%~a~%~a~%~%~a~%" +- *gcl-major-version* *gcl-minor-version* *gcl-extra-version* ++ (format nil "GCL (GNU Common Lisp) ~a.~a.~a ~a ~a ~a git: ~a~%~a~%~a ~a~%~a~%~a~%~%~a~%" ++ *gcl-major-version* *gcl-minor-version* *gcl-extra-version* *gcl-release-date* + (if (member :ansi-cl *features*) "ANSI" "CLtL1") + (if (member :gprof *features*) "profiling" "") +- *gcl-release-date* ++ *gcl-git-tag* + "Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)" + "Binary License: " + (if gpled-modules (format nil "GPL due to GPL'ed components: ~a" gpled-modules) +@@ -143,10 +143,11 @@ + "Use (help) to get some basic information on how to use GCL."))) + + (defun lisp-implementation-version nil +- (format nil "GCL ~a.~a.~a" ++ (format nil "GCL ~a.~a.~a git tag ~a" + *gcl-major-version* + *gcl-minor-version* +- *gcl-extra-version*)) ++ *gcl-extra-version* ++ *gcl-git-tag*)) + + (defun objlt (x y) + (declare (object x y)) +--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp ++++ gcl-2.6.12/lsp/gcl_predlib.lsp +@@ -824,6 +824,7 @@ + (defvar *gcl-extra-version* nil) + (defvar *gcl-minor-version* nil) + (defvar *gcl-major-version* nil) ++(defvar *gcl-git-tag* nil) + (defvar *gcl-release-date* nil) + + (defun warn-version (majvers minvers extvers) +--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp ++++ gcl-2.6.12/lsp/sys-proclaim.lisp +@@ -2,338 +2,271 @@ + (COMMON-LISP::IN-PACKAGE "SYSTEM") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T) +- COMMON-LISP::T) +- SYSTEM::SMALLNTHCDR)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- SYSTEM::NORMALIZE-TYPE SYSTEM::PNL1 +- ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS SYSTEM::DM-BAD-KEY +- SYSTEM::S-DATA-INCLUDES +- ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS +- COMMON-LISP::HOST-NAMESTRING +- COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM COMMON-LISP::LOGNOT +- SYSTEM::BREAK-FORWARD-SEARCH-STACK +- SLOOP::SUBSTITUTE-SLOOP-BODY +- COMMON-LISP::CONCATENATED-STREAM-STREAMS +- ANSI-LOOP::LOOP-MINIMAX-OPERATIONS SYSTEM::ADD-TO-HOTLIST +- SYSTEM::RESTART-REPORT-FUNCTION COMMON-LISP::THIRD +- SYSTEM::DWIM SYSTEM::GET-INSTREAM SYSTEM::TOGGLE-CASE +- SYSTEM::INSTREAM-P COMMON-LISP::DELETE-FILE +- SYSTEM::BEST-ARRAY-ELEMENT-TYPE COMMON-LISP::ISQRT +- SYSTEM::INSERT-BREAK-POINT SYSTEM::WILD-DIR-ELEMENT-P +- COMMON-LISP::ABS SYSTEM::WHICH COMMON-LISP::ACOS +- SYSTEM::COERCE-SLASH-TERMINATED +- COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS +- ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD +- COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM SYSTEM::DIR-P +- SYSTEM::SETUP-INFO SYSTEM::S-DATA-TYPE +- ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS +- SYSTEM::PRINT-SYMBOL-APROPOS SYSTEM::S-DATA-FROZEN +- SYSTEM::REAL-ASINH ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS +- SLOOP::PARSE-NO-BODY SYSTEM::INSPECT-STRING SYSTEM::PRINT-FRS +- SYSTEM::LEAP-YEAR-P SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE +- SYSTEM::RESTART-INTERACTIVE-FUNCTION +- SYSTEM::S-DATA-SLOT-DESCRIPTIONS SYSTEM::S-DATA-STATICP +- SYSTEM::INSPECT-STRUCTURE COMMON-LISP::ASINH +- ANSI-LOOP::LOOP-PATH-USER-DATA SYSTEM::RE-QUOTE-STRING +- SYSTEM::MLP SYSTEM::GET-STRING-INPUT-STREAM-INDEX +- SYSTEM::INFO-GET-FILE COMMON-LISP::EIGHTH +- SYSTEM::SHOW-BREAK-POINT SYSTEM::SIMPLE-ARRAY-P +- COMMON-LISP::RESTART-NAME SLOOP::POINTER-FOR-COLLECT +- COMMON-LISP::PHASE SYSTEM::LNP +- SYSTEM::REWRITE-RESTART-CASE-CLAUSE +- SLOOP::LOOP-COLLECT-KEYWORD-P SYSTEM::S-DATA-HAS-HOLES +- SYSTEM::EVAL-FEATURE ANSI-LOOP::DESTRUCTURING-SIZE +- COMMON-LISP::BROADCAST-STREAM-STREAMS +- ANSI-LOOP::LOOP-PATH-FUNCTION COMMON-LISP::BYTE-POSITION +- ANSI-LOOP::LOOP-MINIMAX-TYPE COMMON-LISP::TANH +- SYSTEM::BKPT-FILE SYSTEM::FRS-KIND +- SYSTEM::S-DATA-PRINT-FUNCTION SYSTEM::UNIQUE-ID +- SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::INSPECT-PACKAGE +- ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA SYSTEM::BKPT-FILE-LINE +- ANSI-LOOP::LOOP-EMIT-BODY SYSTEM::PATCH-SHARP +- ANSI-LOOP::LOOP-COLLECTOR-P SYSTEM::DIR-CONJ +- SYSTEM::CHECK-TRACE-SPEC ANSI-LOOP::LOOP-COLLECTOR-HISTORY +- ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS SYSTEM::FIX-LOAD-PATH +- ANSI-LOOP::LOOP-COLLECTOR-NAME SYSTEM::PATH-STREAM-NAME +- SLOOP::LOOP-LET-BINDINGS ANSI-LOOP::LOOP-TYPED-INIT +- FPE::ST-LOOKUP SYSTEM::IHS-VISIBLE SYSTEM::INFO-GET-TAGS +- SYSTEM::EXPAND-HOME-DIR SYSTEM::DM-KEY-NOT-ALLOWED +- ANSI-LOOP::LOOP-UNIVERSE-P +- SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY +- COMMON-LISP::CONSTANTLY SYSTEM::WILD-NAMESTRING-P +- SYSTEM::INSPECT-NUMBER SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P +- COMMON-LISP::FOURTH SYSTEM::NODES-FROM-INDEX +- SYSTEM::LOGICAL-PATHNAME-HOST-P SYSTEM::S-DATA-NAMED +- COMMON-LISP::INVOKE-DEBUGGER SYSTEM::INSPECT-VECTOR +- SYSTEM::VERSION-PARSE SYSTEM::WILD-PATH-ELEMENT-P +- SLOOP::RETURN-SLOOP-MACRO SYSTEM::REGEXP-CONV +- SYSTEM::NUMBER-OF-DAYS-FROM-1900 +- COMMON-LISP::ECHO-STREAM-INPUT-STREAM SYSTEM::CHDIR +- SYSTEM::DBL-RPL-LOOP COMMON-LISP::ASIN COMMON-LISP::RATIONAL +- ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED +- COMMON-LISP::NAMESTRING SYSTEM::TRACE-ONE-PREPROCESS +- SYSTEM::TERMINAL-INTERRUPT SYSTEM::SEQTYPE SYSTEM::S-DATA-RAW +- SYSTEM::GET-NEXT-VISIBLE-FUN FPE::XMM-LOOKUP +- SYSTEM::MAKE-KCL-TOP-RESTART ANSI-LOOP::LOOP-MINIMAX-P +- ANSI-LOOP::LOOP-MAXMIN-COLLECTION +- COMMON-LISP::COMPILER-MACRO-FUNCTION SYSTEM::BKPT-FUNCTION +- SYSTEM::DIRECTORY-LIST-CHECK SYSTEM::S-DATA-SLOT-POSITION +- SYSTEM::SHORT-NAME SYSTEM::DBL-EVAL +- ANSI-LOOP::LOOP-COLLECTOR-DATA SYSTEM::S-DATA-DOCUMENTATION +- ANSI-LOOP::LOOP-EMIT-FINAL-VALUE COMMON-LISP::NINTH +- SYSTEM::CHECK-DECLARATIONS ANSI-LOOP::LOOP-PATH-NAMES +- COMMON-LISP::LOGICAL-PATHNAME COMMON-LISP::SIGNUM +- COMMON-LISP::FIND-ALL-SYMBOLS COMMON-LISP::FIFTH +- SYSTEM::S-DATA-P ANSI-LOOP::LOOP-CONSTANTP SYSTEM::IDESCRIBE +- SYSTEM::BKPT-FORM ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE +- SLOOP::SLOOP-SLOOP-MACRO SYSTEM::NEXT-STACK-FRAME +- SYSTEM::INSPECT-CONS SYSTEM::KNOWN-TYPE-P +- SYSTEM::RESET-TRACE-DECLARATIONS COMMON-LISP::SINH +- ANSI-LOOP::LOOP-PATH-P COMMON-LISP::PROVIDE +- SYSTEM::INSPECT-SYMBOL SYSTEM::FIND-DOCUMENTATION +- ANSI-LOOP::LOOP-MAKE-DESETQ COMMON-LISP::TENTH +- SYSTEM::MAKE-DEFPACKAGE-FORM COMMON-LISP::FILE-WRITE-DATE +- COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM +- COMMON-LISP::TRUENAME COMMON-LISP::COMPLEMENT +- COMMON-LISP::FIRST ANSI-LOOP::LOOP-COLLECTOR-CLASS +- ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS COMMON-LISP::ATANH +- SYSTEM::LOGICAL-PATHNAMEP COMMON-LISP::DIRECTORY-NAMESTRING +- SYSTEM::RESTART-P ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE +- SYSTEM::FIND-KCL-TOP-RESTART COMMON-LISP::FILE-NAMESTRING +- COMMON-LISP::STREAM-EXTERNAL-FORMAT COMMON-LISP::SECOND +- COMMON-LISP::FILE-LENGTH SYSTEM::INSTREAM-STREAM +- ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE COMMON-LISP::PATHNAME +- SYSTEM::DO-F COMMON-LISP::FILE-AUTHOR +- SYSTEM::LOAD-PATHNAME-EXISTS SLOOP::AVERAGING-SLOOP-MACRO +- ANSI-LOOP::LOOP-CONSTRUCT-RETURN ANSI-LOOP::LOOP-UNIVERSE-ANSI +- ANSI-LOOP::LOOP-PSEUDO-BODY SLOOP::PARSE-LOOP +- ANSI-LOOP::LOOP-HACK-ITERATION SYSTEM::S-DATA-CONC-NAME +- SYSTEM::SEARCH-STACK ANSI-LOOP::LOOP-DO-THEREIS +- COMMON-LISP::BYTE-SIZE ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE +- COMMON-LISP::ACOSH SYSTEM::GET-PATH +- COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS +- SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::ENSURE-DIR-STRING +- SYSTEM::FREEZE-DEFSTRUCT SYSTEM::PRINT-IHS +- SYSTEM::INSPECT-CHARACTER COMMON-LISP::ARRAY-DIMENSIONS +- SLOOP::PARSE-LOOP-INITIALLY SYSTEM::COMPUTING-ARGS-P +- SYSTEM::INSTREAM-STREAM-NAME SYSTEM::PROCESS-ARGS FPE::GREF +- SYSTEM::S-DATA-NAME ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS +- SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::S-DATA-INCLUDED +- SYSTEM::WALK-THROUGH SYSTEM::RESTART-FUNCTION +- SLOOP::TRANSLATE-NAME +- ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED +- COMMON-LISP::SEVENTH COMMON-LISP::CIS FPE::LOOKUP +- COMMON-LISP::COSH COMMON-LISP::VECTOR-POP SYSTEM::IHS-FNAME +- SYSTEM::BREAK-BACKWARD-SEARCH-STACK SLOOP::REPEAT-SLOOP-MACRO +- COMMON-LISP::PROBE-FILE ANSI-LOOP::LOOP-LIST-COLLECTION +- SYSTEM::CONTEXT-P COMMON-LISP::SIXTH SYSTEM::NC +- SYSTEM::MAKE-FRAME COMMON-LISP::COMPILE-FILE-PATHNAME +- SYSTEM::INFO-NODE-FROM-POSITION SYSTEM::NODE-OFFSET +- SYSTEM::RESTART-TEST-FUNCTION SYSTEM::ALOAD +- ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS +- ANSI-LOOP::LOOP-COLLECTOR-DTYPE SYSTEM::S-DATA-OFFSET +- SYSTEM::SHOW-ENVIRONMENT COMMON-LISP::SYNONYM-STREAM-SYMBOL +- SYSTEM::INSPECT-ARRAY ANSI-LOOP::LOOP-MAKE-PSETQ)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- SYSTEM::BREAK-QUIT SYSTEM::DBL-BACKTRACE +- SYSTEM::BREAK-PREVIOUS SYSTEM::INFO-ERROR SYSTEM::BREAK-VS +- SYSTEM::BREAK-LOCAL SYSTEM::IHS-BACKTRACE +- ANSI-LOOP::LOOP-OPTIONAL-TYPE SYSTEM::BREAK-NEXT +- COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-BDS +- COMMON-LISP::CONTINUE SYSTEM::SHOW-BREAK-VARIABLES)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VECTOR COMMON-LISP::T)) +- SYSTEM::CONTEXT-VEC)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*)) +- COMMON-LISP::T) +- SYSTEM::RESET-SYS-PATHS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- SYSTEM::MAYBE-BREAK SYSTEM::MME3 SYSTEM::FIND-LINE-IN-FUN +- SYSTEM::SETF-STRUCTURE-ACCESS SYSTEM::EXPAND-RANGE +- SYSTEM::MINMAX SYSTEM::COERCE-TO-CONDITION +- SLOOP::FIRST-SLOOP-FOR SLOOP::FIRST-USE-SLOOP-FOR +- SYSTEM::DO-BREAK-LEVEL SYSTEM::ELSUB +- ANSI-LOOP::LOOP-FOR-ARITHMETIC SYSTEM::CALL-TEST +- SYSTEM::ELEMENT SYSTEM::LOAD-PATHNAME)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- SYSTEM::SHARP-P-READER ANSI-LOOP::HIDE-VARIABLE-REFERENCE +- SYSTEM::CHECK-TRACE-ARGS SYSTEM::SHARP-U-READER +- SYSTEM::FLOATING-POINT-ERROR ANSI-LOOP::LOOP-FOR-IN +- COMMON-LISP::DEPOSIT-FIELD SYSTEM::GET-SLOT-POS +- SYSTEM::SHARP-A-READER SYSTEM::SHARP-V-READER +- SYSTEM::PATHNAME-PARSE +- SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS SYSTEM::SETF-EXPAND-1 +- COMMON-LISP::DPB SYSTEM::RESTART-CASE-EXPRESSION-CONDITION +- SYSTEM::CHECK-S-DATA ANSI-LOOP::LOOP-FOR-BEING +- SYSTEM::TO-REGEXP-OR-NAMESTRING SYSTEM::APPLY-DISPLAY-FUN +- ANSI-LOOP::LOOP-ANSI-FOR-EQUALS ANSI-LOOP::LOOP-SUM-COLLECTION +- ANSI-LOOP::LOOP-FOR-ON SYSTEM::MFR +- ANSI-LOOP::LOOP-STANDARD-EXPANSION SYSTEM::PROG?* +- ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE +- SYSTEM::SHARP-DQ-READER SYSTEM::RECURSE-DIR SYSTEM::DM-VL +- ANSI-LOOP::LOOP-FOR-ACROSS ANSI-LOOP::PRINT-LOOP-UNIVERSE +- SYSTEM::WARN-VERSION ANSI-LOOP::LOOP-TRANSLATE +- SYSTEM::DEFMACRO* SYSTEM::MAKE-BREAK-POINT SYSTEM::MAKE-T-TYPE +- FPE::REF)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMMON-LISP::YES-OR-NO-P SYSTEM::GPROF-START ++ SYSTEM::BREAK-LOCALS ANSI-LOOP::MAKE-LOOP-UNIVERSE ++ SYSTEM::MAKE-CONTEXT SYSTEM::MAYBE-CLEAR-INPUT ++ COMMON-LISP::Y-OR-N-P SLOOP::PARSE-LOOP-DECLARE ++ SYSTEM::STEP-INTO SYSTEM::STEP-NEXT ++ COMMON-LISP::USER-HOMEDIR-PATHNAME COMMON-LISP::ABORT ++ SYSTEM::MAKE-INSTREAM COMMON-LISP::COMPUTE-RESTARTS ++ SYSTEM::LOC SYSTEM::NEXT-MATCH SLOOP::PARSE-LOOP-WITH ++ ANSI-LOOP::LOOP-GENTEMP SYSTEM::CURRENT-STEP-FUN ++ COMMON-LISP::BREAK ANSI-LOOP::MAKE-LOOP-COLLECTOR ++ SYSTEM::MAKE-RESTART COMMON-LISP::MAKE-PATHNAME ++ ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE SYSTEM::MAKE-S-DATA ++ SYSTEM::GPROF-QUIT SYSTEM::TRANSFORM-KEYWORDS ++ COMMON-LISP::DRIBBLE SYSTEM::DESCRIBE-ENVIRONMENT ++ COMMON-LISP::VECTOR SYSTEM::DBL-READ ++ ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL ++ ANSI-LOOP::MAKE-LOOP-PATH ++ ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- SYSTEM::MME2 COMMON-LISP::SUBSTITUTE-IF-NOT +- ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH +- COMMON-LISP::SUBSTITUTE SYSTEM::WALK-DIR +- SYSTEM::CHECK-TYPE-SYMBOL COMMON-LISP::TRANSLATE-PATHNAME +- ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH +- COMMON-LISP::MAP ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH +- ANSI-LOOP::ADD-LOOP-PATH SLOOP::LOOP-DECLARE-BINDING +- SYSTEM::COMPLETE-PROP SYSTEM::MATCH-COMPONENT +- COMMON-LISP::NSUBSTITUTE COMMON-LISP::NSUBSTITUTE-IF +- COMMON-LISP::SUBSTITUTE-IF COMMON-LISP::NSUBSTITUTE-IF-NOT +- SYSTEM::PUSH-LET-BINDING ANSI-LOOP::LOOP-MAKE-VARIABLE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ SYSTEM::BREAK-GO SYSTEM::END-WAITING ANSI-LOOP::NAMED-VARIABLE ++ ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES SYSTEM::INSPECT-OBJECT ++ SYSTEM::GET-&ENVIRONMENT SYSTEM::BREAK-LEVEL-INVOKE-RESTART ++ COMMON-LISP::INSPECT SYSTEM::DO-F COMMON-LISP::DESCRIBE ++ SYSTEM::WAITING SYSTEM::FIND-DECLARATIONS ++ COMMON-LISP::PRIN1-TO-STRING ANSI-LOOP::LOOP-LIST-STEP ++ SYSTEM::REWRITE-RESTART-CASE-CLAUSE SYSTEM::EXPAND-RANGES ++ SYSTEM::PARSE-BODY-HEADER ++ COMMON-LISP::INVOKE-RESTART-INTERACTIVELY SYSTEM::INFO-SUBFILE ++ COMMON-LISP::PRINC-TO-STRING SYSTEM::INSTREAM-NAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T) + COMMON-LISP::T) +- COMMON-LISP::DELETE-IF-NOT COMMON-LISP::FILL +- COMMON-LISP::SET-EXCLUSIVE-OR ANSI-LOOP::LOOP-CHECK-DATA-TYPE +- SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::SOME +- COMMON-LISP::COUNT COMMON-LISP::NOTANY SYSTEM::INTERNAL-COUNT +- COMMON-LISP::POSITION-IF-NOT COMMON-LISP::SET-DIFFERENCE +- SLOOP::IN-ARRAY-SLOOP-FOR COMMON-LISP::NUNION +- COMMON-LISP::BIT-NAND SYSTEM::PROCESS-ERROR +- COMMON-LISP::BIT-ANDC2 COMMON-LISP::POSITION-IF +- COMMON-LISP::NSET-DIFFERENCE COMMON-LISP::WRITE-SEQUENCE +- COMMON-LISP::BIT-XOR COMMON-LISP::READ-SEQUENCE +- COMMON-LISP::DELETE-IF COMMON-LISP::MAP-INTO +- COMMON-LISP::SUBSETP COMMON-LISP::REMOVE-IF-NOT +- COMMON-LISP::FIND-IF COMMON-LISP::INTERSECTION +- COMMON-LISP::REPLACE COMMON-LISP::VECTOR-PUSH-EXTEND +- COMMON-LISP::BIT-ORC2 COMMON-LISP::POSITION +- COMMON-LISP::CERROR COMMON-LISP::FIND COMMON-LISP::BIT-ORC1 +- SYSTEM::BREAK-CALL SLOOP::PARSE-LOOP-MACRO COMMON-LISP::EVERY +- COMMON-LISP::COUNT-IF-NOT COMMON-LISP::ADJUST-ARRAY +- COMMON-LISP::SEARCH COMMON-LISP::REMOVE-IF +- COMMON-LISP::NOTEVERY COMMON-LISP::TYPEP COMMON-LISP::COUNT-IF +- SYSTEM::WREADDIR SYSTEM::INTERNAL-COUNT-IF COMMON-LISP::DELETE +- COMMON-LISP::NSET-EXCLUSIVE-OR COMMON-LISP::UNION +- COMMON-LISP::BIT-EQV COMMON-LISP::NINTERSECTION +- COMMON-LISP::MISMATCH SYSTEM::FIND-IHS COMMON-LISP::REMOVE +- SYSTEM::VECTOR-PUSH-STRING COMMON-LISP::BIT-IOR +- COMMON-LISP::FIND-IF-NOT COMMON-LISP::MAKE-SEQUENCE +- COMMON-LISP::BIT-ANDC1 SLOOP::LOOP-ADD-BINDING +- COMMON-LISP::BIT-NOR COMMON-LISP::BIT-AND)) ++ SYSTEM::SMALLNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::DO-ARG-COUNT-ERROR SYSTEM::PUSH-SUB-LIST-BINDING)) ++ SYSTEM::QUICK-SORT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::MAKE-PREDICATE SYSTEM::DO?* SYSTEM::MAKE-CONSTRUCTOR)) ++ SYSTEM::BIGNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- ANSI-LOOP::LOOP-SEQUENCER)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ ANSI-LOOP::LOOP-DO-RETURN SLOOP::PARSE-LOOP-COLLECT ++ SYSTEM::READ-EVALUATED-FORM SYSTEM::INSPECT-INDENT-1 ++ SLOOP::PARSE-LOOP-WHEN SYSTEM::TEST-ERROR SLOOP::LOOP-POP ++ SYSTEM::DM-TOO-FEW-ARGUMENTS SYSTEM::INSPECT-READ-LINE ++ SYSTEM::GET-SIG-FN-NAME SLOOP::LOOP-PEEK ++ COMMON-LISP::TYPE-ERROR SYSTEM::SET-UP-TOP-LEVEL ++ ANSI-LOOP::LOOP-DO-REPEAT ANSI-LOOP::LOOP-GET-PROGN ++ SYSTEM::GET-TEMP-DIR SLOOP::PARSE-LOOP1 SYSTEM::SHOW-RESTARTS ++ SYSTEM::KCL-TOP-RESTARTS ++ COMMON-LISP::LISP-IMPLEMENTATION-VERSION SYSTEM::SET-ENV ++ SLOOP::PARSE-ONE-WHEN-CLAUSE SYSTEM::GET-INDEX-NODE ++ ANSI-LOOP::LOOP-DO-INITIALLY SYSTEM::INSPECT-INDENT ++ ANSI-LOOP::LOOP-BIND-BLOCK ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ++ SYSTEM::INIT-BREAK-POINTS SYSTEM::DEFAULT-INFO-HOTLIST ++ SYSTEM::ILLEGAL-BOA ANSI-LOOP::LOOP-DO-FINALLY ++ ANSI-LOOP::LOOP-GET-FORM SYSTEM::CURRENT-DIRECTORY-PATHNAME ++ ANSI-LOOP::LOOP-ITERATION-DRIVER ANSI-LOOP::LOOP-DO-WITH ++ SLOOP::PARSE-LOOP-FOR SLOOP::LOOP-UN-POP ++ ANSI-LOOP::LOOP-CONTEXT SYSTEM::DBL ANSI-LOOP::LOOP-DO-DO ++ SYSTEM::CLEANUP SYSTEM::DEFAULT-SYSTEM-BANNER ++ SYSTEM::STEP-READ-LINE SYSTEM::ALL-TRACE-DECLARATIONS ++ SLOOP::PARSE-LOOP-DO SYSTEM::SET-CURRENT ++ SYSTEM::DM-TOO-MANY-ARGUMENTS ANSI-LOOP::LOOP-DO-NAMED ++ ANSI-LOOP::LOOP-POP-SOURCE SYSTEM::SETUP-LINEINFO ++ SYSTEM::TOP-LEVEL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::EXPAND-WILD-DIRECTORY SLOOP::DEF-LOOP-INTERNAL +- COMMON-LISP::MERGE SYSTEM::PRINT-STACK-FRAME)) ++ COMMON-LISP::LOGORC2 COMMON-LISP::WITH-PACKAGE-ITERATOR ++ ANSI-LOOP::LOOP-DO-WHILE SLOOP::THEREIS-SLOOP-COLLECT ++ SYSTEM::ADD-FILE SLOOP::IN-CAREFULLY-SLOOP-FOR ++ SLOOP::IN-PACKAGE-SLOOP-MAP SYSTEM::MV-SETQ SYSTEM::IF-ERROR ++ SYSTEM::WITHOUT-INTERRUPTS SYSTEM::DM-NTH COMMON-LISP::CASE ++ ANSI-LOOP::LOOP-ACCUMULATE-MINIMAX-VALUE ++ COMMON-LISP::DEFINE-MODIFY-MACRO SLOOP::COUNT-SLOOP-COLLECT ++ SYSTEM::GET-MATCH COMMON-LISP::SHIFTF SYSTEM::*BREAK-POINTS* ++ COMMON-LISP::RETURN COMMON-LISP::LDB ++ COMMON-LISP::WITH-SIMPLE-RESTART COMMON-LISP::LOGORC1 ++ COMMON-LISP::MULTIPLE-VALUE-BIND FPE::RF ++ COMMON-LISP::WITH-STANDARD-IO-SYNTAX ++ SLOOP::MINIMIZE-SLOOP-COLLECT SYSTEM::DEFINE-SETF-METHOD ++ COMMON-LISP::ECASE COMMON-LISP::DOTIMES ++ SLOOP::DEF-LOOP-COLLECT COMMON-LISP::PROG1 ++ ANSI-LOOP::LOOP-LOOKUP-KEYWORD SYSTEM::SET-BACK ++ COMMON-LISP::LDB-TEST SYSTEM::OBJLT SLOOP::NEVER-SLOOP-COLLECT ++ COMMON-LISP::VECTOR-PUSH SYSTEM::DBL-UP COMMON-LISP::ASSERT ++ SYSTEM::MSUB ANSI-LOOP::LOOP-BODY SYSTEM::COERCE-TO-STRING ++ SYSTEM::GET-INFO-CHOICES SLOOP::IN-FRINGE-SLOOP-MAP ++ COMMON-LISP::PSETF SYSTEM::ALL-MATCHES COMMON-LISP::DO ++ ANSI-LOOP::MAKE-LOOP-MINIMAX SYSTEM::PARSE-SLOT-DESCRIPTION ++ SYSTEM::SET-PATH-STREAM-NAME COMMON-LISP::LOOP-FINISH ++ COMMON-LISP::NTHCDR COMMON-LISP::DO-ALL-SYMBOLS SYSTEM::SGEN ++ SYSTEM::PUT-AUX COMMON-LISP::CCASE SYSTEM::DM-V ++ COMMON-LISP::LOCALLY SLOOP::ALWAYS-SLOOP-COLLECT ++ COMMON-LISP::LAMBDA COMMON-LISP::DEFMACRO ++ ANSI-LOOP::LOOP-TMEMBER COMMON-LISP::WITH-OPEN-STREAM ++ SLOOP::MAXIMIZE-SLOOP-COLLECT SLOOP::DESETQ1 ++ COMMON-LISP::TRACE SYSTEM::CHECK-SEQ-START-END ++ COMMON-LISP::DEFTYPE SLOOP::MAKE-VALUE COMMON-LISP::TYPECASE ++ ANSI-LOOP::LOOP-TEQUAL ANSI-LOOP::LOOP-DO-ALWAYS ++ ANSI-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD SYSTEM::INFO-AUX ++ COMMON-LISP::WITH-OPEN-FILE COMMON-LISP::PROG2 ++ COMMON-LISP::DEFSTRUCT SLOOP::DESETQ SYSTEM::QUOTATION-READER ++ SYSTEM::DM-NTH-CDR SYSTEM::MATCH-DIMENSIONS COMMON-LISP::BYTE ++ FPE::READ-OPERANDS COMMON-LISP::TIME COMMON-LISP::COND ++ COMMON-LISP::DO-EXTERNAL-SYMBOLS ++ COMMON-LISP::WITH-HASH-TABLE-ITERATOR ++ COMMON-LISP::MULTIPLE-VALUE-SETQ COMMON-LISP::DEFCONSTANT ++ ANSI-LOOP::LOOP-DECLARE-VARIABLE COMMON-LISP::LOGNOR ++ ANSI-LOOP::LOOP-COLLECT-ANSWER COMMON-LISP::DEFVAR ++ SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS ++ SYSTEM::LOOKUP-KEYWORD SYSTEM::SEQUENCE-CURSOR ++ SLOOP::LOGXOR-SLOOP-COLLECT FPE::%-READER SLOOP::DEF-LOOP-FOR ++ COMMON-LISP::PSETQ SLOOP::COLLATE-SLOOP-COLLECT ++ SLOOP::PARSE-LOOP-MAP COMMON-LISP::NTH SYSTEM::SUBSTRINGP ++ SYSTEM::GET-NODES SYSTEM::COERCE-TO-PACKAGE ++ COMMON-LISP::PATHNAME-MATCH-P ++ ANSI-LOOP::HIDE-VARIABLE-REFERENCES ++ SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS ANSI-LOOP::LOOP-DO-IF ++ SYSTEM::INSPECT-PRINT SYSTEM::DOT-DIR-P SYSTEM::SETF-HELPER ++ COMMON-LISP::ROTATEF COMMON-LISP::FILE-STRING-LENGTH ++ COMMON-LISP::POP COMMON-LISP::DO-SYMBOLS ++ ANSI-LOOP::LOOP-MAYBE-BIND-FORM ++ COMMON-LISP::WITH-INPUT-FROM-STRING COMMON-LISP::PROG ++ SLOOP::=-SLOOP-FOR ANSI-LOOP::LOOP-COLLECT-RPLACD ++ COMMON-LISP::DOLIST SYSTEM::SET-DIR COMMON-LISP::WHEN ++ FPE::READ-INSTRUCTION SYSTEM::ITERATE-OVER-BKPTS ++ COMMON-LISP::OR COMMON-LISP::DEFPACKAGE COMMON-LISP::UNTRACE ++ COMMON-LISP::ETYPECASE COMMON-LISP::DO* COMMON-LISP::LOGTEST ++ SYSTEM::IN-INTERVAL-P SYSTEM::LEFT-PARENTHESIS-READER ++ SLOOP::DEF-LOOP-MACRO SLOOP::SLOOP SLOOP::L-EQUAL ++ SYSTEM::BREAK-STEP-NEXT COMMON-LISP::COERCE ++ SYSTEM::GPROF-OUTPUT SLOOP::SUM-SLOOP-COLLECT ++ COMMON-LISP::REMF ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION ++ SLOOP::LOCAL-FINISH COMMON-LISP::CHECK-TYPE ++ ANSI-LOOP::LOOP-COPYLIST* COMMON-LISP::WITH-OUTPUT-TO-STRING ++ SYSTEM::CONDITION-PASS SLOOP::DEF-LOOP-MAP ++ COMMON-LISP::DOCUMENTATION COMMON-LISP::DECF ++ COMMON-LISP::WRITE-BYTE COMMON-LISP::WITH-CONDITION-RESTARTS ++ SYSTEM::INSPECT-RECURSIVELY COMMON-LISP::PUSH ++ COMMON-LISP::MULTIPLE-VALUE-LIST ++ ANSI-LOOP::LOOP-STORE-TABLE-DATA SYSTEM::DISPLAY-ENV ++ SYSTEM::LIST-DELQ COMPILER::COMPILER-DEF-HOOK ++ SLOOP::LOOP-RETURN COMMON-LISP::PROG* SYSTEM::TP-ERROR ++ SYSTEM::LIST-TOGGLE-CASE COMMON-LISP::DECLAIM ++ SYSTEM::SAFE-EVAL COMMON-LISP::DEFSETF COMMON-LISP::LOGANDC1 ++ SYSTEM::SUPER-GO COMMON-LISP::LOGNAND SYSTEM::WHILE ++ SYSTEM::DISPLAY-COMPILED-ENV COMMON-LISP::AND ++ COMMON-LISP::PUSHNEW SYSTEM::INCREMENT-CURSOR ++ COMMON-LISP::INCF COMMON-LISP::NTH-VALUE FPE::0-READER ++ COMMON-LISP::DEFPARAMETER SYSTEM::?PUSH SYSTEM::NODE ++ FPE::PAREN-READER SLOOP::THE-TYPE COMMON-LISP::UNLESS ++ ANSI-LOOP::LOOP-TASSOC COMMON-LISP::LOOP ++ SYSTEM::GET-LINE-OF-FORM SLOOP::IN-TABLE-SLOOP-MAP ++ COMMON-LISP::RESTART-BIND SYSTEM::CHECK-TYPE-EVAL ++ COMMON-LISP::LOGANDC2 COMMON-LISP::STEP ++ SYSTEM::KEYWORD-SUPPLIED-P SLOOP::SLOOP-FINISH SLOOP::LCASE ++ ANSI-LOOP::WITH-MINIMAX-VALUE COMMON-LISP::DEFUN ++ COMMON-LISP::CTYPECASE COMMON-LISP::RESTART-CASE ++ SYSTEM::BREAK-STEP-INTO SLOOP::SLOOP-SWAP ++ COMMON-LISP::DESTRUCTURING-BIND SYSTEM::SUB-INTERVAL-P ++ SYSTEM::MV-VALUES COMMON-LISP::WITH-COMPILATION-UNIT ++ SYSTEM::SETF-EXPAND)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- SYSTEM::SHARP-EQ-READER SYSTEM::SHARP-SHARP-READER)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::FCEILING COMMON-LISP::WRITE-TO-STRING ++ COMMON-LISP::USE-VALUE COMMON-LISP::INVOKE-RESTART ++ COMMON-LISP::FROUND COMMON-LISP::ENSURE-DIRECTORIES-EXIST ++ COMMON-LISP::DECODE-UNIVERSAL-TIME SYSTEM::SHOW-INFO ++ SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE ++ COMMON-LISP::STORE-VALUE COMMON-LISP::PARSE-NAMESTRING ++ SYSTEM::BREAK-FUNCTION SYSTEM::INFO COMMON-LISP::APROPOS ++ COMMON-LISP::APROPOS-LIST ++ ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE ++ COMMON-LISP::READ-FROM-STRING COMMON-LISP::FFLOOR ++ SYSTEM::STEPPER COMMON-LISP::FTRUNCATE ++ COMMON-LISP::GET-SETF-EXPANSION SYSTEM::APROPOS-DOC ++ SYSTEM::PRINT-DOC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- COMMON-LISP::ENCODE-UNIVERSAL-TIME)) ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ATOI)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- SYSTEM::UNIVERSAL-ERROR-HANDLER)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::RELATIVE-LINE ANSI-LOOP::DUPLICATABLE-CODE-P ++ SYSTEM::FASLINK SYSTEM::LENEL SYSTEM::THE-END ++ SYSTEM::GET-NODE-INDEX)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(SYSTEM::CONDITIONP SYSTEM::TRACE-ONE SYSTEM::SI-FIND-CLASS ++ SYSTEM::SI-CLASS-OF SYSTEM::CONDITION-CLASS-P ++ FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS ++ SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::AUTOLOAD ++ SYSTEM::UNTRACE-ONE SYSTEM::MAKE-ACCESS-FUNCTION ++ SYSTEM::SI-CLASSP SYSTEM::AUTOLOAD-MACRO SYSTEM::WARNINGP ++ SYSTEM::SI-CLASS-NAME SYSTEM::SIMPLE-CONDITION-CLASS-P ++ SYSTEM::RECORD-FN SYSTEM::DEFINE-STRUCTURE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- SYSTEM::PARSE-DEFMACRO SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST)) ++ SLOOP::FIND-IN-ORDERED-LIST COMMON-LISP::STABLE-SORT ++ COMMON-LISP::SUBTYPEP SYSTEM::PARSE-BODY COMMON-LISP::REDUCE ++ COMMON-LISP::SORT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::*) + COMMON-LISP::*) +- COMMON-LISP::SUBST COMMON-LISP::SUBST-IF-NOT +- COMMON-LISP::SUBST-IF SYSTEM::MASET)) ++ COMMON-LISP::SUBST-IF COMMON-LISP::SUBST-IF-NOT ++ COMMON-LISP::SUBST SYSTEM::MASET)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- SYSTEM::READ-INSPECT-COMMAND SYSTEM::RESTART-PRINT +- ANSI-LOOP::LOOP-GET-COLLECTION-INFO SYSTEM::SHARP-+-READER +- SYSTEM::VERIFY-KEYWORDS SYSTEM::SHARP-S-READER +- SYSTEM::LIST-MERGE-SORT SYSTEM::SHARP---READER)) ++ SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- SYSTEM::PARSE-BODY COMMON-LISP::SORT +- SLOOP::FIND-IN-ORDERED-LIST COMMON-LISP::REDUCE +- COMMON-LISP::STABLE-SORT COMMON-LISP::SUBTYPEP)) ++ SYSTEM::SHARP---READER SYSTEM::LIST-MERGE-SORT ++ SYSTEM::RESTART-PRINT ANSI-LOOP::LOOP-GET-COLLECTION-INFO ++ SYSTEM::VERIFY-KEYWORDS SYSTEM::SHARP-+-READER ++ SYSTEM::READ-INSPECT-COMMAND SYSTEM::SHARP-S-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -352,54 +285,61 @@ + SYSTEM::PUSH-OPTIONAL-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- SYSTEM::MAKE-CONTEXT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE +- ANSI-LOOP::MAKE-LOOP-UNIVERSE SYSTEM::MAKE-S-DATA +- SYSTEM::NEXT-MATCH COMMON-LISP::USER-HOMEDIR-PATHNAME +- SYSTEM::STEP-NEXT ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL +- COMMON-LISP::VECTOR SLOOP::PARSE-LOOP-WITH +- COMMON-LISP::COMPUTE-RESTARTS COMMON-LISP::BREAK +- ANSI-LOOP::MAKE-LOOP-PATH ANSI-LOOP::LOOP-GENTEMP +- COMMON-LISP::ABORT COMMON-LISP::YES-OR-NO-P +- SYSTEM::MAKE-INSTREAM SYSTEM::DBL-READ +- SYSTEM::MAYBE-CLEAR-INPUT SYSTEM::MAKE-RESTART +- ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL COMMON-LISP::Y-OR-N-P +- SLOOP::PARSE-LOOP-DECLARE ANSI-LOOP::MAKE-LOOP-COLLECTOR +- SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::STEP-INTO +- SYSTEM::CURRENT-STEP-FUN COMMON-LISP::DRIBBLE +- COMMON-LISP::MAKE-PATHNAME SYSTEM::BREAK-LOCALS SYSTEM::LOC +- SYSTEM::TRANSFORM-KEYWORDS)) ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) ++ COMMON-LISP::T) ++ SYSTEM::RESET-SYS-PATHS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES +- COMMON-LISP::PRIN1-TO-STRING SYSTEM::GET-&ENVIRONMENT +- COMMON-LISP::INSPECT SYSTEM::BREAK-GO +- SYSTEM::PARSE-BODY-HEADER COMMON-LISP::PRINC-TO-STRING +- SYSTEM::EXPAND-RANGES ANSI-LOOP::NAMED-VARIABLE +- ANSI-LOOP::LOOP-LIST-STEP SYSTEM::INSTREAM-NAME +- SYSTEM::WAITING SYSTEM::END-WAITING COMMON-LISP::DESCRIBE +- SYSTEM::INFO-SUBFILE SYSTEM::FIND-DECLARATIONS +- SYSTEM::INSPECT-OBJECT SYSTEM::BREAK-LEVEL-INVOKE-RESTART +- COMMON-LISP::INVOKE-RESTART-INTERACTIVELY)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VECTOR COMMON-LISP::T)) ++ SYSTEM::CONTEXT-VEC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE +- SYSTEM::S-DATA-LENGTH SYSTEM::THE-START)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::AUTOLOAD +- SYSTEM::UNTRACE-ONE SYSTEM::TRACE-ONE SYSTEM::CONDITIONP +- SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SI-CLASS-NAME +- SYSTEM::SI-CLASSP SYSTEM::SI-CLASS-OF SYSTEM::SI-FIND-CLASS +- SYSTEM::CONDITION-CLASS-P SYSTEM::AUTOLOAD-MACRO +- SYSTEM::WARNINGP SYSTEM::DEFINE-STRUCTURE +- FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS +- SYSTEM::SIMPLE-CONDITION-CLASS-P)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::MAKE-STRING-INPUT-STREAM SYSTEM::FILE-TO-STRING ++ SYSTEM::LINK-EXPAND COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE ++ COMMON-LISP::DELETE-DUPLICATES COMMON-LISP::PATHNAME-HOST ++ COMMON-LISP::ARRAY-ROW-MAJOR-INDEX SYSTEM::BAD-SEQ-LIMIT ++ SYSTEM::LOGICAL-PATHNAME-PARSE COMMON-LISP::OPEN ++ SYSTEM::BREAK-LEVEL COMMON-LISP::DIRECTORY ++ SLOOP::LOOP-ADD-TEMPS SYSTEM::DIR-PARSE ++ COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME SYSTEM::MGSUB ++ COMMON-LISP::MERGE-PATHNAMES SYSTEM::MGLIST ++ SYSTEM::FILE-SEARCH SYSTEM::PROCESS-SOME-ARGS ++ COMMON-LISP::ARRAY-IN-BOUNDS-P COMMON-LISP::SBIT ++ COMMON-LISP::FILE-POSITION COMMON-LISP::PATHNAME-VERSION ++ COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::PATHNAME-DEVICE ++ SYSTEM::NLOAD COMMON-LISP::WARN COMMON-LISP::ENOUGH-NAMESTRING ++ SYSTEM::NTH-STACK-FRAME ++ ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES COMMON-LISP::BIT ++ COMMON-LISP::WILD-PATHNAME-P COMMON-LISP::READ-BYTE ++ COMMON-LISP::BIT-NOT COMMON-LISP::REQUIRE ++ ANSI-LOOP::LOOP-ERROR ANSI-LOOP::LOOP-WARN ++ COMMON-LISP::PATHNAME-NAME COMMON-LISP::MAKE-ARRAY ++ COMMON-LISP::REMOVE-DUPLICATES SYSTEM::INFO-SEARCH ++ SLOOP::ADD-FROM-DATA SYSTEM::TO-REGEXP COMMON-LISP::LOAD ++ COMMON-LISP::SIGNAL COMMON-LISP::PATHNAME-TYPE ++ COMMON-LISP::FIND-RESTART SYSTEM::LIST-MATCHES ++ COMMON-LISP::CONCATENATE COMMON-LISP::ERROR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::FIND-DOC COMMON-LISP::RENAME-FILE SYSTEM::DO-REPL ++ SYSTEM::RESTART-REPORT ANSI-LOOP::ESTIMATE-CODE-SIZE ++ ANSI-LOOP::LOOP-REALLY-DESETQ ANSI-LOOP::ESTIMATE-CODE-SIZE-1 ++ SYSTEM::NEW-SEMI-COLON-READER SYSTEM::SOURCE-PORTION ++ SYSTEM::NEWLINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ SYSTEM::BREAK-MESSAGE SYSTEM::GCL-TOP-LEVEL ++ SYSTEM::SIMPLE-BACKTRACE SYSTEM::BREAK-RESUME ++ ANSI-LOOP::LOOP-DO-FOR SYSTEM::BREAK-CURRENT ++ SYSTEM::BREAK-HELP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -411,257 +351,316 @@ + SYSTEM::ROUND-UP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::DBL-WHAT-FRAME FPE::FE-ENABLE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- COMMON-LISP::HASH-TABLE) +- SYSTEM::CONTEXT-SPICE)) ++ (COMMON-LISP::OR COMMON-LISP::NULL ++ COMMON-LISP::HASH-TABLE)) ++ SYSTEM::CONTEXT-HASH)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- SYSTEM::MAKE-KEYWORD)) ++ COMMON-LISP::HASH-TABLE) ++ SYSTEM::CONTEXT-SPICE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T COMMON-LISP::T) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- SYSTEM::QUICK-SORT)) ++ SYSTEM::GET-CONTEXT SYSTEM::PUSH-CONTEXT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::BIGNTHCDR)) ++ SYSTEM::EXPAND-RANGE SYSTEM::SETF-STRUCTURE-ACCESS ++ SYSTEM::MME3 SYSTEM::FIND-LINE-IN-FUN SYSTEM::LOAD-PATHNAME ++ SYSTEM::MINMAX SYSTEM::ELSUB SYSTEM::COERCE-TO-CONDITION ++ SYSTEM::DO-BREAK-LEVEL ANSI-LOOP::LOOP-FOR-ARITHMETIC ++ SLOOP::FIRST-USE-SLOOP-FOR SYSTEM::CALL-TEST ++ SLOOP::FIRST-SLOOP-FOR SYSTEM::MAYBE-BREAK)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::FIXNUM) +- SYSTEM::ATOI)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ SYSTEM::WALK-DIR SYSTEM::PUSH-LET-BINDING SYSTEM::MME2 ++ ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH ++ COMMON-LISP::SUBSTITUTE-IF-NOT ++ ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH SYSTEM::MATCH-COMPONENT ++ SYSTEM::COMPLETE-PROP COMMON-LISP::NSUBSTITUTE-IF-NOT ++ COMMON-LISP::SUBSTITUTE-IF COMMON-LISP::NSUBSTITUTE ++ ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH ++ SYSTEM::CHECK-TYPE-SYMBOL COMMON-LISP::MAP ++ COMMON-LISP::TRANSLATE-PATHNAME COMMON-LISP::SUBSTITUTE ++ ANSI-LOOP::ADD-LOOP-PATH ANSI-LOOP::LOOP-MAKE-VARIABLE ++ SLOOP::LOOP-DECLARE-BINDING COMMON-LISP::NSUBSTITUTE-IF)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- ANSI-LOOP::LOOP-DO-INITIALLY SYSTEM::GET-INDEX-NODE +- SLOOP::PARSE-ONE-WHEN-CLAUSE SYSTEM::STEP-READ-LINE +- SYSTEM::DM-TOO-MANY-ARGUMENTS SYSTEM::READ-EVALUATED-FORM +- SYSTEM::DM-TOO-FEW-ARGUMENTS SYSTEM::KCL-TOP-RESTARTS +- ANSI-LOOP::LOOP-ITERATION-DRIVER +- SYSTEM::CURRENT-DIRECTORY-PATHNAME SYSTEM::INSPECT-INDENT +- SYSTEM::CLEANUP ANSI-LOOP::LOOP-WHEN-IT-VARIABLE +- SLOOP::PARSE-LOOP-WHEN ANSI-LOOP::LOOP-DO-NAMED +- ANSI-LOOP::LOOP-GET-FORM SYSTEM::GET-TEMP-DIR +- SYSTEM::ILLEGAL-BOA SYSTEM::SET-UP-TOP-LEVEL +- SYSTEM::SETUP-LINEINFO ANSI-LOOP::LOOP-CONTEXT +- SYSTEM::TOP-LEVEL SYSTEM::DBL SLOOP::LOOP-UN-POP +- SYSTEM::SET-CURRENT ANSI-LOOP::LOOP-GET-PROGN +- ANSI-LOOP::LOOP-DO-REPEAT SYSTEM::INIT-BREAK-POINTS +- SLOOP::PARSE-LOOP-FOR SLOOP::LOOP-POP +- ANSI-LOOP::LOOP-POP-SOURCE ANSI-LOOP::LOOP-DO-WITH +- ANSI-LOOP::LOOP-DO-DO COMMON-LISP::LISP-IMPLEMENTATION-VERSION +- ANSI-LOOP::LOOP-DO-RETURN SLOOP::PARSE-LOOP-DO +- SLOOP::LOOP-PEEK ANSI-LOOP::LOOP-BIND-BLOCK +- SYSTEM::DEFAULT-SYSTEM-BANNER SLOOP::PARSE-LOOP1 +- SYSTEM::INSPECT-READ-LINE ANSI-LOOP::LOOP-DO-FINALLY +- SYSTEM::TEST-ERROR COMMON-LISP::TYPE-ERROR +- SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::SHOW-RESTARTS +- SYSTEM::SET-ENV SLOOP::PARSE-LOOP-COLLECT +- SYSTEM::ALL-TRACE-DECLARATIONS SYSTEM::GET-SIG-FN-NAME +- SYSTEM::INSPECT-INDENT-1)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::SHARP-V-READER COMMON-LISP::DEPOSIT-FIELD ++ ANSI-LOOP::LOOP-FOR-ON SYSTEM::SETF-EXPAND-1 ++ SYSTEM::SHARP-DQ-READER SYSTEM::CHECK-TRACE-ARGS ++ SYSTEM::PROG?* SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS ++ ANSI-LOOP::PRINT-LOOP-UNIVERSE ANSI-LOOP::LOOP-FOR-IN ++ SYSTEM::CHECK-S-DATA SYSTEM::WARN-VERSION ++ ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE SYSTEM::DEFMACRO* ++ ANSI-LOOP::LOOP-SUM-COLLECTION SYSTEM::PATHNAME-PARSE ++ SYSTEM::GET-SLOT-POS SYSTEM::MAKE-T-TYPE ++ SYSTEM::SHARP-A-READER ++ SYSTEM::RESTART-CASE-EXPRESSION-CONDITION SYSTEM::RECURSE-DIR ++ SYSTEM::SHARP-U-READER SYSTEM::APPLY-DISPLAY-FUN SYSTEM::DM-VL ++ ANSI-LOOP::HIDE-VARIABLE-REFERENCE SYSTEM::MAKE-BREAK-POINT ++ SYSTEM::TO-REGEXP-OR-NAMESTRING ANSI-LOOP::LOOP-FOR-BEING ++ SYSTEM::FLOATING-POINT-ERROR SYSTEM::SHARP-P-READER ++ ANSI-LOOP::LOOP-TRANSLATE COMMON-LISP::DPB ++ ANSI-LOOP::LOOP-FOR-ACROSS FPE::REF SYSTEM::WRITE-SYMTAB ++ ANSI-LOOP::LOOP-STANDARD-EXPANSION ++ ANSI-LOOP::LOOP-ANSI-FOR-EQUALS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::OR COMMON-LISP::NULL +- COMMON-LISP::HASH-TABLE)) +- SYSTEM::CONTEXT-HASH)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::DO?* SYSTEM::MAKE-PREDICATE SYSTEM::MAKE-CONSTRUCTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- SYSTEM::LENEL SYSTEM::GET-NODE-INDEX SYSTEM::FASLINK +- SYSTEM::THE-END ANSI-LOOP::DUPLICATABLE-CODE-P +- SYSTEM::RELATIVE-LINE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::NSET-DIFFERENCE COMMON-LISP::COUNT-IF ++ COMMON-LISP::FIND-IF-NOT SYSTEM::INTERNAL-COUNT-IF ++ COMMON-LISP::INTERSECTION COMMON-LISP::REMOVE-IF-NOT ++ SYSTEM::VECTOR-PUSH-STRING COMMON-LISP::EVERY ++ COMMON-LISP::POSITION COMMON-LISP::POSITION-IF-NOT ++ SYSTEM::FIND-IHS SYSTEM::INTERNAL-COUNT COMMON-LISP::BIT-ANDC2 ++ COMMON-LISP::DELETE-IF-NOT COMMON-LISP::BIT-ANDC1 ++ COMMON-LISP::UNION COMMON-LISP::NSET-EXCLUSIVE-OR ++ COMMON-LISP::BIT-XOR SYSTEM::WREADDIR COMMON-LISP::MISMATCH ++ COMMON-LISP::FIND-IF COMMON-LISP::BIT-ORC1 ++ COMMON-LISP::MAKE-SEQUENCE COMMON-LISP::REMOVE ++ COMMON-LISP::COUNT COMMON-LISP::BIT-NOR COMMON-LISP::MAP-INTO ++ COMMON-LISP::NOTEVERY SLOOP::PARSE-LOOP-MACRO ++ COMMON-LISP::FIND COMMON-LISP::BIT-AND COMMON-LISP::CERROR ++ ANSI-LOOP::LOOP-CHECK-DATA-TYPE COMMON-LISP::READ-SEQUENCE ++ COMMON-LISP::BIT-ORC2 COMMON-LISP::FILL COMMON-LISP::SOME ++ COMMON-LISP::NUNION SYSTEM::INTERNAL-COUNT-IF-NOT ++ COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::REPLACE ++ SLOOP::LOOP-ADD-BINDING COMMON-LISP::NOTANY ++ COMMON-LISP::SET-EXCLUSIVE-OR COMMON-LISP::ADJUST-ARRAY ++ COMMON-LISP::SET-DIFFERENCE COMMON-LISP::BIT-NAND ++ COMMON-LISP::DELETE COMMON-LISP::POSITION-IF ++ COMMON-LISP::SUBSETP COMMON-LISP::DELETE-IF SYSTEM::BREAK-CALL ++ COMMON-LISP::REMOVE-IF COMMON-LISP::WRITE-SEQUENCE ++ COMMON-LISP::BIT-IOR SLOOP::IN-ARRAY-SLOOP-FOR ++ COMMON-LISP::SEARCH COMMON-LISP::COUNT-IF-NOT ++ COMMON-LISP::TYPEP COMMON-LISP::NINTERSECTION ++ COMMON-LISP::BIT-EQV SYSTEM::PROCESS-ERROR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::FIXNUM) +- SYSTEM::DBL-WHAT-FRAME FPE::FE-ENABLE)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ SYSTEM::PRINT-STACK-FRAME COMMON-LISP::MERGE ++ SYSTEM::EXPAND-WILD-DIRECTORY SLOOP::DEF-LOOP-INTERNAL ++ SYSTEM::ELEMENT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- SYSTEM::GCL-TOP-LEVEL SYSTEM::BREAK-CURRENT +- SYSTEM::BREAK-RESUME SYSTEM::BREAK-HELP SYSTEM::BREAK-MESSAGE +- ANSI-LOOP::LOOP-DO-FOR SYSTEM::SIMPLE-BACKTRACE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ SYSTEM::SHARP-EQ-READER SYSTEM::SHARP-SHARP-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) + COMMON-LISP::T) +- SYSTEM::PROCESS-SOME-ARGS COMMON-LISP::CONCATENATE +- SYSTEM::TO-REGEXP COMMON-LISP::PATHNAME-DEVICE +- SYSTEM::LIST-MATCHES ANSI-LOOP::LOOP-WARN +- COMMON-LISP::REMOVE-DUPLICATES COMMON-LISP::PATHNAME-HOST +- COMMON-LISP::BIT COMMON-LISP::SBIT +- COMMON-LISP::ENOUGH-NAMESTRING SYSTEM::DIR-PARSE +- SYSTEM::FILE-SEARCH SYSTEM::BREAK-LEVEL ANSI-LOOP::LOOP-ERROR +- SYSTEM::MGLIST COMMON-LISP::PATHNAME-NAME +- COMMON-LISP::MAKE-STRING-INPUT-STREAM SLOOP::ADD-FROM-DATA +- COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME COMMON-LISP::DIRECTORY +- SYSTEM::FILE-TO-STRING COMMON-LISP::ARRAY-ROW-MAJOR-INDEX +- SYSTEM::NTH-STACK-FRAME SLOOP::LOOP-ADD-TEMPS +- COMMON-LISP::WARN +- ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES +- SYSTEM::LINK-EXPAND COMMON-LISP::PATHNAME-TYPE +- COMMON-LISP::OPEN COMMON-LISP::BIT-NOT +- COMMON-LISP::DELETE-DUPLICATES COMMON-LISP::ERROR +- COMMON-LISP::FILE-POSITION COMMON-LISP::PATHNAME-VERSION +- COMMON-LISP::ARRAY-IN-BOUNDS-P COMMON-LISP::REQUIRE +- SYSTEM::MGSUB COMMON-LISP::MERGE-PATHNAMES COMMON-LISP::LOAD +- COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::SIGNAL +- COMMON-LISP::WILD-PATHNAME-P COMMON-LISP::FIND-RESTART +- SYSTEM::INFO-SEARCH SYSTEM::LOGICAL-PATHNAME-PARSE +- SYSTEM::BAD-SEQ-LIMIT COMMON-LISP::READ-BYTE +- COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE SYSTEM::NLOAD +- COMMON-LISP::MAKE-ARRAY)) ++ COMMON-LISP::ENCODE-UNIVERSAL-TIME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- COMMON-LISP::RENAME-FILE ANSI-LOOP::ESTIMATE-CODE-SIZE-1 +- SYSTEM::FIND-DOC SYSTEM::SOURCE-PORTION SYSTEM::NEWLINE +- SYSTEM::DO-REPL SYSTEM::RESTART-REPORT +- ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEW-SEMI-COLON-READER)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::DO-ARG-COUNT-ERROR SYSTEM::PUSH-SUB-LIST-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::GET-CONTEXT SYSTEM::PUSH-CONTEXT)) ++ ANSI-LOOP::LOOP-SEQUENCER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMMON-LISP::PSETF COMMON-LISP::PROG* SYSTEM::BREAK-STEP-INTO +- SLOOP::IN-PACKAGE-SLOOP-MAP SLOOP::SLOOP-FINISH +- SYSTEM::CHECK-SEQ-START-END SLOOP::SLOOP +- COMMON-LISP::MULTIPLE-VALUE-SETQ COMMON-LISP::ASSERT +- SLOOP::MINIMIZE-SLOOP-COLLECT COMMON-LISP::ROTATEF +- SYSTEM::LIST-TOGGLE-CASE SYSTEM::INCREMENT-CURSOR +- ANSI-LOOP::LOOP-COLLECT-ANSWER COMMON-LISP::PROG2 +- SLOOP::SLOOP-SWAP COMMON-LISP::DEFTYPE +- SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS SYSTEM::?PUSH +- COMMON-LISP::DO-EXTERNAL-SYMBOLS +- ANSI-LOOP::LOOP-COLLECT-RPLACD COMMON-LISP::TRACE +- ANSI-LOOP::LOOP-DO-IF ANSI-LOOP::MAKE-LOOP-MINIMAX +- SYSTEM::SUBSTRINGP COMMON-LISP::LOGORC2 +- ANSI-LOOP::LOOP-DO-WHILE ANSI-LOOP::LOOP-LOOKUP-KEYWORD +- SLOOP::DEF-LOOP-COLLECT SYSTEM::SETF-HELPER +- COMMON-LISP::WITH-CONDITION-RESTARTS SYSTEM::INSPECT-PRINT +- SLOOP::PARSE-LOOP-MAP SYSTEM::KEYWORD-SUPPLIED-P +- COMMON-LISP::LOOP-FINISH ANSI-LOOP::LOOP-TASSOC +- SYSTEM::GET-LINE-OF-FORM ANSI-LOOP::LOOP-STORE-TABLE-DATA +- SLOOP::L-EQUAL COMMON-LISP::ETYPECASE +- SLOOP::THEREIS-SLOOP-COLLECT COMMON-LISP::RETURN +- SYSTEM::SUB-INTERVAL-P COMMON-LISP::ECASE +- COMMON-LISP::WRITE-BYTE SYSTEM::LOOKUP-KEYWORD +- COMMON-LISP::DEFSETF ANSI-LOOP::LOOP-DO-ALWAYS +- SYSTEM::PARSE-SLOT-DESCRIPTION COMMON-LISP::VECTOR-PUSH +- SYSTEM::GET-INFO-CHOICES SYSTEM::SETF-EXPAND +- SYSTEM::LEFT-PARENTHESIS-READER SLOOP::DEF-LOOP-FOR +- COMMON-LISP::PROG SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS +- SYSTEM::SUPER-GO COMMON-LISP::LDB SYSTEM::NODE +- SYSTEM::COERCE-TO-PACKAGE COMMON-LISP::DO SYSTEM::TP-ERROR +- SYSTEM::GET-NODES SLOOP::THE-TYPE ANSI-LOOP::LOOP-TMEMBER +- ANSI-LOOP::LOOP-TEQUAL COMMON-LISP::DEFPARAMETER +- COMMON-LISP::WITH-OPEN-STREAM SYSTEM::DEFINE-SETF-METHOD +- SYSTEM::IF-ERROR ANSI-LOOP::HIDE-VARIABLE-REFERENCES +- SLOOP::DESETQ1 COMMON-LISP::LOOP COMMON-LISP::CTYPECASE +- COMMON-LISP::DEFSTRUCT COMMON-LISP::CASE SYSTEM::DOT-DIR-P +- SYSTEM::INSPECT-RECURSIVELY COMMON-LISP::DOTIMES +- SYSTEM::BREAK-STEP-NEXT SYSTEM::ALL-MATCHES +- COMMON-LISP::LOCALLY SLOOP::IN-TABLE-SLOOP-MAP +- SYSTEM::DISPLAY-ENV COMMON-LISP::MULTIPLE-VALUE-LIST +- COMMON-LISP::LDB-TEST COMMON-LISP::DECLAIM +- COMMON-LISP::WITH-STANDARD-IO-SYNTAX SYSTEM::SGEN +- SLOOP::ALWAYS-SLOOP-COLLECT COMMON-LISP::PUSHNEW +- COMMON-LISP::MULTIPLE-VALUE-BIND FPE::%-READER +- COMMON-LISP::CCASE SLOOP::DEF-LOOP-MACRO +- ANSI-LOOP::LOOP-REALLY-DESETQ SYSTEM::IN-INTERVAL-P +- SYSTEM::DBL-UP SLOOP::DEF-LOOP-MAP ANSI-LOOP::LOOP-BODY +- SYSTEM::SEQUENCE-CURSOR COMMON-LISP::COERCE +- COMMON-LISP::PATHNAME-MATCH-P SYSTEM::OBJLT +- COMMON-LISP::RESTART-CASE +- COMMON-LISP::WITH-HASH-TABLE-ITERATOR COMMON-LISP::STEP +- SYSTEM::QUOTATION-READER SYSTEM::PUT-AUX COMMON-LISP::TYPECASE +- SYSTEM::*BREAK-POINTS* COMMON-LISP::LOGTEST +- SYSTEM::CONDITION-PASS COMMON-LISP::DEFVAR +- COMMON-LISP::WITH-OUTPUT-TO-STRING SYSTEM::SET-BACK +- COMMON-LISP::NTHCDR COMMON-LISP::DO-ALL-SYMBOLS +- SYSTEM::INFO-AUX COMMON-LISP::LOGANDC1 COMMON-LISP::PROG1 +- FPE::READ-OPERANDS SYSTEM::DISPLAY-COMPILED-ENV +- COMMON-LISP::DEFCONSTANT SYSTEM::DM-V SLOOP::LOOP-RETURN +- SYSTEM::ADD-FILE SYSTEM::WHILE SYSTEM::WITHOUT-INTERRUPTS +- COMMON-LISP::NTH-VALUE COMMON-LISP::OR +- ANSI-LOOP::LOOP-COPYLIST* SLOOP::IN-CAREFULLY-SLOOP-FOR +- ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::GET-MATCH +- ANSI-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD +- ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION SYSTEM::MV-SETQ +- SLOOP::COLLATE-SLOOP-COLLECT COMMON-LISP::LOGORC1 +- SYSTEM::DM-NTH-CDR COMPILER::COMPILER-DEF-HOOK +- SYSTEM::CHECK-TYPE-EVAL COMMON-LISP::DECF +- COMMON-LISP::WITH-PACKAGE-ITERATOR SYSTEM::COERCE-TO-STRING +- COMMON-LISP::DEFINE-MODIFY-MACRO FPE::0-READER +- COMMON-LISP::WITH-COMPILATION-UNIT COMMON-LISP::LOGNAND +- COMMON-LISP::CHECK-TYPE COMMON-LISP::INCF +- SLOOP::MAXIMIZE-SLOOP-COLLECT SYSTEM::ITERATE-OVER-BKPTS +- SLOOP::LOGXOR-SLOOP-COLLECT SLOOP::NEVER-SLOOP-COLLECT +- SYSTEM::MV-VALUES SYSTEM::MSUB COMMON-LISP::DO* +- SLOOP::=-SLOOP-FOR COMMON-LISP::UNLESS +- SYSTEM::MATCH-DIMENSIONS COMMON-LISP::DOLIST +- ANSI-LOOP::LOOP-MAYBE-BIND-FORM SLOOP::LOCAL-FINISH +- COMMON-LISP::PSETQ COMMON-LISP::COND +- COMMON-LISP::WITH-SIMPLE-RESTART COMMON-LISP::DO-SYMBOLS +- COMMON-LISP::FILE-STRING-LENGTH COMMON-LISP::LAMBDA +- ANSI-LOOP::LOOP-ACCUMULATE-MINIMAX-VALUE +- SLOOP::IN-FRINGE-SLOOP-MAP SYSTEM::SET-DIR +- COMMON-LISP::WITH-INPUT-FROM-STRING SYSTEM::LIST-DELQ +- COMMON-LISP::BYTE COMMON-LISP::DOCUMENTATION SYSTEM::SAFE-EVAL +- COMMON-LISP::DEFMACRO SLOOP::DESETQ COMMON-LISP::POP +- SLOOP::COUNT-SLOOP-COLLECT SLOOP::LCASE +- COMMON-LISP::DEFPACKAGE COMMON-LISP::DEFUN COMMON-LISP::TIME +- COMMON-LISP::LOGNOR COMMON-LISP::RESTART-BIND +- COMMON-LISP::PUSH COMMON-LISP::SHIFTF COMMON-LISP::AND +- COMMON-LISP::WHEN SYSTEM::DM-NTH COMMON-LISP::WITH-OPEN-FILE +- SLOOP::MAKE-VALUE COMMON-LISP::UNTRACE FPE::PAREN-READER +- ANSI-LOOP::WITH-MINIMAX-VALUE COMMON-LISP::NTH +- FPE::READ-INSTRUCTION SLOOP::SUM-SLOOP-COLLECT +- COMMON-LISP::REMF COMMON-LISP::DESTRUCTURING-BIND +- SYSTEM::SET-PATH-STREAM-NAME FPE::RF COMMON-LISP::LOGANDC2)) ++ SYSTEM::UNIVERSAL-ERROR-HANDLER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMMON-LISP::FCEILING COMMON-LISP::APROPOS-LIST +- COMMON-LISP::READ-FROM-STRING +- COMMON-LISP::ENSURE-DIRECTORIES-EXIST SYSTEM::APROPOS-DOC +- COMMON-LISP::FTRUNCATE SYSTEM::BREAK-FUNCTION +- SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE SYSTEM::STEPPER +- COMMON-LISP::DECODE-UNIVERSAL-TIME +- ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE +- COMMON-LISP::STORE-VALUE COMMON-LISP::GET-SETF-EXPANSION +- SYSTEM::PRINT-DOC SYSTEM::INFO COMMON-LISP::APROPOS +- COMMON-LISP::WRITE-TO-STRING COMMON-LISP::USE-VALUE +- COMMON-LISP::FROUND COMMON-LISP::PARSE-NAMESTRING +- COMMON-LISP::INVOKE-RESTART COMMON-LISP::FFLOOR +- SYSTEM::SHOW-INFO)) +\ No newline at end of file ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS SYSTEM::CHECK-DECLARATIONS ++ COMMON-LISP::RESTART-NAME ANSI-LOOP::LOOP-COLLECTOR-P ++ COMMON-LISP::LOGNOT ANSI-LOOP::LOOP-CONSTANTP ++ COMMON-LISP::COMPILER-MACRO-FUNCTION SYSTEM::IDESCRIBE ++ COMMON-LISP::FIRST ANSI-LOOP::LOOP-MAKE-DESETQ ++ ANSI-LOOP::LOOP-COLLECTOR-DTYPE SYSTEM::S-DATA-CONC-NAME ++ SYSTEM::VERSION-PARSE SYSTEM::IHS-NOT-INTERPRETED-ENV ++ SYSTEM::EXPAND-HOME-DIR SYSTEM::LOAD-PATHNAME-EXISTS ++ ANSI-LOOP::LOOP-UNIVERSE-P SYSTEM::SIMPLE-ARRAY-P ++ COMMON-LISP::FIFTH SYSTEM::BKPT-FILE-LINE ++ SYSTEM::TRACE-ONE-PREPROCESS ++ SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY ++ COMMON-LISP::PROBE-FILE COMMON-LISP::TRUENAME ++ COMMON-LISP::CONCATENATED-STREAM-STREAMS ++ SYSTEM::SHOW-ENVIRONMENT COMMON-LISP::NINTH ++ SYSTEM::INSPECT-NUMBER SYSTEM::DBL-RPL-LOOP ++ COMMON-LISP::PROVIDE SYSTEM::SETUP-INFO ++ SLOOP::AVERAGING-SLOOP-MACRO COMMON-LISP::ACOS SYSTEM::LNP ++ SYSTEM::COERCE-SLASH-TERMINATED SYSTEM::FIND-KCL-TOP-RESTART ++ ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::S-DATA-OFFSET ++ COMMON-LISP::SECOND COMMON-LISP::PHASE SYSTEM::EVAL-FEATURE ++ ANSI-LOOP::LOOP-PATH-USER-DATA ++ ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS ++ ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE SYSTEM::PATCH-SHARP ++ ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS ++ COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::DIR-P ++ SYSTEM::PATH-STREAM-NAME COMMON-LISP::CIS SYSTEM::S-DATA-RAW ++ SYSTEM::S-DATA-SLOT-DESCRIPTIONS SYSTEM::RESTART-TEST-FUNCTION ++ SYSTEM::KNOWN-TYPE-P ++ ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED ++ COMMON-LISP::FILE-WRITE-DATE COMMON-LISP::RATIONAL ++ ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS ++ SYSTEM::GET-NEXT-VISIBLE-FUN SLOOP::PARSE-LOOP-INITIALLY ++ SYSTEM::S-DATA-STATICP COMMON-LISP::BYTE-SIZE ++ COMMON-LISP::VECTOR-POP COMMON-LISP::PATHNAME ++ SYSTEM::DIRECTORY-LIST-CHECK ++ COMMON-LISP::BROADCAST-STREAM-STREAMS ++ COMMON-LISP::SYNONYM-STREAM-SYMBOL SYSTEM::PNL1 ++ COMMON-LISP::SEVENTH SYSTEM::INFO-GET-TAGS ++ ANSI-LOOP::LOOP-TYPED-INIT SYSTEM::WALK-THROUGH ++ SYSTEM::NUMBER-OF-DAYS-FROM-1900 ++ ANSI-LOOP::LOOP-EMIT-FINAL-VALUE COMMON-LISP::ASINH ++ SYSTEM::S-DATA-FROZEN SYSTEM::GET-STRING-INPUT-STREAM-INDEX ++ SYSTEM::INSTREAM-STREAM SLOOP::LOOP-LET-BINDINGS ++ COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM ++ ANSI-LOOP::LOOP-COLLECTOR-CLASS COMMON-LISP::DELETE-FILE ++ SYSTEM::GET-PATH SYSTEM::LEAP-YEAR-P SYSTEM::REGEXP-CONV ++ COMMON-LISP::SIXTH COMMON-LISP::ATANH SYSTEM::INFO-GET-FILE ++ SYSTEM::S-DATA-PRINT-FUNCTION ++ COMMON-LISP::DIRECTORY-NAMESTRING SYSTEM::INSPECT-CHARACTER ++ SYSTEM::S-DATA-CONSTRUCTORS ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE ++ SYSTEM::INSPECT-VECTOR ANSI-LOOP::LOOP-MINIMAX-TYPE ++ SYSTEM::BKPT-FILE SLOOP::REPEAT-SLOOP-MACRO COMMON-LISP::ABS ++ COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS ++ COMMON-LISP::SINH COMMON-LISP::TANH SYSTEM::RESTART-FUNCTION ++ SLOOP::POINTER-FOR-COLLECT ++ COMMON-LISP::ECHO-STREAM-INPUT-STREAM ++ SYSTEM::PRINT-SYMBOL-APROPOS SYSTEM::CHDIR SYSTEM::MLP ++ ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE FPE::GREF ++ COMMON-LISP::BYTE-POSITION SYSTEM::INSTREAM-STREAM-NAME ++ SYSTEM::BKPT-FUNCTION ANSI-LOOP::DESTRUCTURING-SIZE ++ SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-EMIT-BODY ++ SYSTEM::SEARCH-STACK SYSTEM::INSERT-BREAK-POINT ++ SYSTEM::S-DATA-INCLUDES COMMON-LISP::FOURTH ++ COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM FPE::ST-LOOKUP ++ SYSTEM::NODE-OFFSET SYSTEM::S-DATA-TYPE SYSTEM::INSPECT-SYMBOL ++ SLOOP::TRANSLATE-NAME SYSTEM::S-DATA-NAMED SYSTEM::REAL-ASINH ++ SYSTEM::TOGGLE-CASE SLOOP::SLOOP-SLOOP-MACRO ++ ANSI-LOOP::LOOP-DO-THEREIS FPE::LOOKUP SYSTEM::S-DATA-NAME ++ ANSI-LOOP::LOOP-COLLECTOR-DATA ++ SYSTEM::BREAK-FORWARD-SEARCH-STACK COMMON-LISP::EIGHTH ++ ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE ++ SYSTEM::S-DATA-SLOT-POSITION SYSTEM::INFO-NODE-FROM-POSITION ++ COMMON-LISP::THIRD SYSTEM::FRS-KIND ++ SYSTEM::WILD-PATH-ELEMENT-P ANSI-LOOP::LOOP-MAXMIN-COLLECTION ++ SYSTEM::PRINT-FRS SYSTEM::GET-INSTREAM ++ SLOOP::SUBSTITUTE-SLOOP-BODY SYSTEM::RESTART-P ++ COMMON-LISP::FILE-AUTHOR SYSTEM::ADD-TO-HOTLIST ++ SYSTEM::COMPUTING-ARGS-P COMMON-LISP::FILE-NAMESTRING ++ SYSTEM::ENSURE-DIR-STRING COMMON-LISP::FIND-ALL-SYMBOLS ++ SYSTEM::S-DATA-P SYSTEM::BREAK-BACKWARD-SEARCH-STACK ++ SYSTEM::GET-BYTE-STREAM-NCHARS ANSI-LOOP::LOOP-MAKE-PSETQ ++ SYSTEM::ALOAD ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA ++ SYSTEM::MAKE-DEFPACKAGE-FORM COMMON-LISP::ASIN ++ SYSTEM::WILD-DIR-ELEMENT-P SYSTEM::MAKE-FRAME ++ ANSI-LOOP::LOOP-PSEUDO-BODY SYSTEM::DIR-CONJ SYSTEM::DBL-EVAL ++ ANSI-LOOP::LOOP-COLLECTOR-NAME SYSTEM::INSPECT-ARRAY ++ SYSTEM::DM-KEY-NOT-ALLOWED COMMON-LISP::ARRAY-DIMENSIONS ++ ANSI-LOOP::LOOP-CONSTRUCT-RETURN COMMON-LISP::LOGICAL-PATHNAME ++ COMMON-LISP::ACOSH ANSI-LOOP::LOOP-PATH-NAMES ++ ANSI-LOOP::LOOP-PATH-FUNCTION SYSTEM::CHECK-TRACE-SPEC ++ COMMON-LISP::ISQRT SYSTEM::NODES-FROM-INDEX SYSTEM::PRINT-IHS ++ SYSTEM::INSPECT-CONS COMMON-LISP::CONSTANTLY ++ ANSI-LOOP::LOOP-PATH-P SYSTEM::WILD-NAMESTRING-P ++ SYSTEM::DM-BAD-KEY ANSI-LOOP::LOOP-MINIMAX-P SYSTEM::SEQTYPE ++ FPE::XMM-LOOKUP SYSTEM::LOGICAL-PATHNAME-HOST-P ++ COMMON-LISP::INVOKE-DEBUGGER ++ ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS SYSTEM::INSPECT-STRING ++ SYSTEM::NEXT-STACK-FRAME ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS ++ SYSTEM::LOGICAL-PATHNAMEP ++ ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED ++ SLOOP::LOOP-COLLECT-KEYWORD-P COMMON-LISP::SIGNUM ++ SYSTEM::WHICH ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD ++ SYSTEM::SHORT-NAME SYSTEM::SHOW-BREAK-POINT ++ SYSTEM::INSPECT-STRUCTURE SYSTEM::S-DATA-INCLUDED ++ SYSTEM::INSTREAM-P SYSTEM::RE-QUOTE-STRING ++ SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE ++ SYSTEM::RESTART-INTERACTIVE-FUNCTION ++ ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS SYSTEM::UNIQUE-ID ++ SYSTEM::FIX-LOAD-PATH SLOOP::RETURN-SLOOP-MACRO ++ ANSI-LOOP::LOOP-COLLECTOR-HISTORY SYSTEM::S-DATA-DOCUMENTATION ++ SYSTEM::TERMINAL-INTERRUPT COMMON-LISP::TENTH ++ COMMON-LISP::COMPLEMENT SYSTEM::BEST-ARRAY-ELEMENT-TYPE ++ SYSTEM::IHS-VISIBLE SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P ++ COMMON-LISP::COSH COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS ++ SYSTEM::BKPT-FORM SYSTEM::FREEZE-DEFSTRUCT ++ SYSTEM::INSPECT-PACKAGE ANSI-LOOP::LOOP-UNIVERSE-ANSI ++ SLOOP::PARSE-NO-BODY ANSI-LOOP::LOOP-MINIMAX-OPERATIONS ++ ANSI-LOOP::LOOP-LIST-COLLECTION SYSTEM::NC ++ SYSTEM::FIND-DOCUMENTATION SYSTEM::S-DATA-HAS-HOLES ++ COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM ++ COMMON-LISP::NAMESTRING COMMON-LISP::HOST-NAMESTRING ++ SYSTEM::DWIM SYSTEM::MAKE-KCL-TOP-RESTART SLOOP::PARSE-LOOP ++ SYSTEM::IHS-FNAME COMMON-LISP::STREAM-EXTERNAL-FORMAT ++ SYSTEM::RESTART-REPORT-FUNCTION COMMON-LISP::FILE-LENGTH ++ SYSTEM::PROCESS-ARGS ANSI-LOOP::LOOP-HACK-ITERATION ++ SYSTEM::CONTEXT-P SYSTEM::RESET-TRACE-DECLARATIONS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ SYSTEM::BREAK-LOCAL SYSTEM::BREAK-VS ++ ANSI-LOOP::LOOP-OPTIONAL-TYPE COMMON-LISP::CONTINUE ++ SYSTEM::BREAK-QUIT SYSTEM::BREAK-PREVIOUS ++ SYSTEM::DBL-BACKTRACE SYSTEM::INFO-ERROR ++ COMMON-LISP::MUFFLE-WARNING SYSTEM::SHOW-BREAK-VARIABLES ++ SYSTEM::BREAK-BDS SYSTEM::IHS-BACKTRACE SYSTEM::BREAK-NEXT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ SYSTEM::MAKE-KEYWORD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ SYSTEM::THE-START FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE ++ SYSTEM::S-DATA-LENGTH SYSTEM::S-DATA-SIZE)) +\ No newline at end of file +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1004,12 +1004,8 @@ alloc_contblock_no_gc(size_t n,char *lim + + } + +-#ifndef MAX_CODE_ADDRESS +-#define MAX_CODE_ADDRESS -1UL +-#endif +- + void * +-alloc_code_space(size_t sz) { ++alloc_code_space(size_t sz,ufixnum max_code_address) { + + void *v; + +@@ -1026,7 +1022,15 @@ alloc_code_space(size_t sz) { + } else + v=alloc_contblock(sz); + +- massert(v && (unsigned long)(v+sz)s.s_dbind); + + return v; + +--- gcl-2.6.12.orig/o/cfun.c ++++ gcl-2.6.12/o/cfun.c +@@ -316,6 +316,16 @@ make_si_special_form_internal(char *s, v + return(x); + } + ++object ++make_macro_internal(char *s, void (*f)()) ++{ ++ object x; ++ x = make_ordinary(s); ++ x->s.s_gfdef = make_cfun(f, x, Cnil, NULL, 0); ++ x->s.s_mflag=TRUE; ++ return(x); ++} ++ + DEFUN_NEW("COMPILED-FUNCTION-NAME",object,fScompiled_function_name,SI + ,1,1,NONE,OO,OO,OO,OO,(object fun),"") + +--- gcl-2.6.12.orig/o/cmac.c ++++ gcl-2.6.12/o/cmac.c +@@ -21,9 +21,17 @@ object *gclModulus; + + /* Note: the gclModulus is guaranteed > 0 */ + +-#define FIX_MOD(X,MOD) {register fixnum MOD_2; \ +- if (X > (MOD_2=(MOD >>1))) X=X-MOD; else \ +- if (X < -MOD_2) X=X+MOD;} ++#define FIX_MOD(X,MOD) { \ ++ register fixnum MOD_2; \ ++ if (X > (MOD_2=(MOD>>1))) \ ++ X=X-MOD; \ ++ else \ ++ if (X < -MOD_2) \ ++ X=X+MOD; \ ++ else \ ++ if (X == -MOD_2 && (MOD&0x1)==0) \ ++ X=X+MOD; \ ++ } + + + object ctimes(object a, object b),cplus(object a, object b),cdifference(object a, object b),cmod(object x); +--- gcl-2.6.12.orig/o/hash.d ++++ gcl-2.6.12/o/hash.d +@@ -26,6 +26,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + object sLeq; + object sLeql; + object sLequal; ++object sLequalp; + + object sKsize; + object sKrehash_size; +@@ -194,6 +195,144 @@ DEFUN_NEW("HASH-EQUAL",object,fShash_equ + RETURN1(make_fixnum(ihash_equal(x,depth))); + } + ++unsigned long ++ihash_equalp(object x,int depth) { ++ ++ enum type tx; ++ unsigned long h = 0,j; ++ long i; ++ ++ cs_check(x); ++ ++BEGIN: ++ if (depth++ <=3) ++ switch ((tx=type_of(x))) { ++ case t_cons: ++ h += ihash_equalp(x->c.c_car,depth); ++ x = x->c.c_cdr; ++ goto BEGIN; ++ break; ++ case t_symbol: ++ /* x=coerce_to_string(x); */ ++ { ++ ufixnum len=x->st.st_fillp; ++ uchar *s=(void *)x->st.st_self; ++ for (;len--;) ++ h^=rtb[toupper(*s++)]; ++ } ++ break; ++ ++ case t_package: ++ break; ++ ++ /* case t_simple_string: */ ++ case t_string: ++ /* case t_simple_bitvector: */ ++ /* case t_simple_vector: */ ++ case t_bitvector: ++ case t_vector: ++ h^=ufixhash(j=x->st.st_fillp); ++ j=j>10 ? 10 : j; ++ for (i=0;ia.a_rank); ++ for (i=0;ia.a_dims[i]); ++ j=x->a.a_dim; ++ j=j>10 ? 10 : j; ++ for (i=0;iht.ht_nent); ++ h^=ufixhash(x->ht.ht_test); ++ j=j>10 ? 10 : j; ++ for (i=0;iht.ht_self[i].hte_key!=OBJNULL) ++ switch (x->ht.ht_test) { ++ case htt_eq: ++ h^=(((unsigned long)x->ht.ht_self[i].hte_key)>>3) ^ ++ ihash_equalp(x->ht.ht_self[i].hte_value,depth); ++ break; ++ case htt_eql: ++ h^=hash_eql(x->ht.ht_self[i].hte_key) ^ ++ ihash_equalp(x->ht.ht_self[i].hte_value,depth); ++ break; ++ case htt_equal: ++ h^=ihash_equal(x->ht.ht_self[i].hte_key,depth) ^ ++ ihash_equalp(x->ht.ht_self[i].hte_value,depth); ++ break; ++ case htt_equalp: ++ h^=ihash_equalp(x->ht.ht_self[i].hte_key,depth) ^ ++ ihash_equalp(x->ht.ht_self[i].hte_value,depth); ++ break; ++ } ++ break; ++ ++ case t_pathname: ++ h^=ihash_equalp(x->pn.pn_host,depth); ++ h^=ihash_equalp(x->pn.pn_device,depth); ++ h^=ihash_equalp(x->pn.pn_directory,depth); ++ h^=ihash_equalp(x->pn.pn_name,depth); ++ h^=ihash_equalp(x->pn.pn_type,depth); ++ h^=ihash_equalp(x->pn.pn_version,depth); ++ break; ++ ++ case t_structure: ++ { ++ unsigned char *s_type; ++ struct s_data *def; ++ def=S_DATA(x->str.str_def); ++ s_type= & SLOT_TYPE(x->str.str_def,0); ++ h^=ihash_equalp(def->name,depth); ++ for (i=0;ilength;i++) ++ if (s_type[i]==aet_object) ++ h^=ihash_equalp(x->str.str_self[i],depth); ++ else ++ h^=ufixhash((long)x->str.str_self[i]); ++ break; ++ } ++ ++ case t_character: ++ { ++ vs_mark; /*FIXME*/ ++ object *base=vs_base; ++ vs_base=vs_top; ++ vs_push(x); ++ Lchar_upcase(); ++ x=vs_base[0]; ++ vs_base=base; ++ vs_reset; ++ h^=hash_eql(x); ++ break; ++ } ++ ++ case t_fixnum: ++ case t_bignum: ++ case t_ratio: ++ case t_shortfloat: ++ case t_longfloat: ++ ++ h^=hash_eql(make_longfloat(number_to_double(x))); ++ break; ++ ++ default: ++ h^=hash_eql(x); ++ break; ++ } ++ ++ return MHSH(h); ++ ++} ++ ++ ++DEFUN_NEW("HASH-EQUALP",object,fShash_equalp,SI,2,2,NONE,OO,IO,OO,OO,(object x,fixnum depth),"") { ++ RETURN1(make_fixnum(ihash_equalp(x,depth))); ++} + + struct htent * + gethash(object key, object ht) { +@@ -227,6 +366,9 @@ gethash(object key, object ht) { + case htt_equal: + hash_loop(equal,ihash_equal(key,0)); + break; ++ case htt_equalp: ++ hash_loop(equalp,ihash_equalp(key,0)); ++ break; + default: + FEerror( "gethash: Hash table not of type EQ, EQL, or EQUAL." ,0); + return &dummy; +@@ -341,7 +483,9 @@ DEFUN_NEW("MAKE-HASH-TABLE",object,fLmak + else if (test == sLeql || test == sLeql->s.s_gfdef) + htt = htt_eql; + else if (test == sLequal || test == sLequal->s.s_gfdef) +- htt = htt_equal; ++ htt = htt_equal; ++ else if (test == sLequalp || test == sLequalp->s.s_gfdef) ++ htt = htt_equalp; + else + FEerror("~S is an illegal hash-table test function.", + 1, test); +@@ -529,7 +673,10 @@ DEFUNM_NEW("NEXT-HASH-TABLE-ENTRY",objec + + DEFUN_NEW("HASH-TABLE-TEST",object,fLhash_table_test,LISP,1,1,NONE,OO,OO,OO,OO,(object table), + "Given a HASH-TABLE return a symbol which specifies the function used in its test") +-{ switch(table->ht.ht_test) { ++{ ++ check_type_hash_table(&table); ++ switch(table->ht.ht_test) { ++ case htt_equalp: RETURN1(sLequalp); + case htt_equal: RETURN1(sLequal); + case htt_eq: RETURN1(sLeq); + case htt_eql: RETURN1(sLeql); +@@ -540,6 +687,7 @@ DEFUN_NEW("HASH-TABLE-TEST",object,fLhas + + DEFUN_NEW("HASH-TABLE-SIZE",object,fLhash_table_size,LISP,1,1,NONE,OO,OO,OO,OO,(object table),"") + { ++ check_type_hash_table(&table); + RETURN1(make_fixnum(table->ht.ht_size)); + + } +@@ -564,6 +712,7 @@ gcl_init_hash() + sLeq = make_ordinary("EQ"); + sLeql = make_ordinary("EQL"); + sLequal = make_ordinary("EQUAL"); ++ sLequalp = make_ordinary("EQUALP"); + sKsize = make_keyword("SIZE"); + sKtest = make_keyword("TEST"); + sKrehash_size = make_keyword("REHASH-SIZE"); +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -1229,6 +1229,10 @@ init_main(void) { + ADD_FEATURE("STATIC"); + #endif + ++#ifdef LARGE_MEMORY_MODEL ++ ADD_FEATURE("LARGE-MEMORY-MODEL"); ++#endif ++ + make_special("*FEATURES*",features);} + + make_si_function("SAVE-SYSTEM", siLsave_system); +--- gcl-2.6.12.orig/o/num_co.c ++++ gcl-2.6.12/o/num_co.c +@@ -63,8 +63,9 @@ gcl_isnormal_double(double d) { + + } + +-int gcl_isnormal_float(float f) +-{ ++int ++gcl_isnormal_float(float f) { ++ + union {float f;int i;} u; + + if (!ISFINITE(f) || !f) +@@ -75,6 +76,44 @@ int gcl_isnormal_float(float f) + + } + ++static inline int ++gcl_isnan_double(double d) { ++ ++ if (ISFINITE(d)) ++ return 0; ++ if (d==d) ++ return 0; ++ return 1; ++ ++} ++ ++static inline int ++gcl_isnan_float(float f) { ++ ++ if (ISFINITE(f)) ++ return 0; ++ if (f==f) ++ return 0; ++ return 1; ++ ++} ++ ++int ++gcl_isnan(object x) { ++ ++ switch(type_of(x)) { ++ case t_shortfloat: ++ return gcl_isnan_float(sf(x)); ++ case t_longfloat: ++ return gcl_isnan_double(lf(x)); ++ default: ++ return 0; ++ } ++ ++} ++ ++ ++ + static void + integer_decode_double(double d, int *hp, int *lp, int *ep, int *sp) + { +--- gcl-2.6.12.orig/o/num_comp.c ++++ gcl-2.6.12/o/num_comp.c +@@ -257,8 +257,14 @@ Lnumber_compare(int s, int t) + narg = vs_top - vs_base; + if (narg == 0) + too_few_arguments(); +- for (i = 0; i < narg; i++) ++ for (i = 0; i < narg; i++) { + check_type_or_rational_float(&vs_base[i]); ++ if (gcl_isnan(vs_base[i])) { ++ vs_top = vs_base+1; ++ vs_base[0] = Cnil; ++ return; ++ } ++ } + for (i = 1; i < narg; i++) + if (s*number_compare(vs_base[i], vs_base[i-1]) < t) { + vs_top = vs_base+1; +--- gcl-2.6.12.orig/o/package.d ++++ gcl-2.6.12/o/package.d +@@ -37,27 +37,51 @@ void check_type_or_symbol_string_package + #define P_EXTERNAL(x,j) ((x)->p.p_external[(j) % (x)->p.p_external_size]) + + +- ++#define string_eq(a,b) \ ++ ((a)->st.st_fillp==(b)->st.st_fillp && \ ++ bcmp((a)->st.st_self,(b)->st.st_self,(a)->st.st_fillp)==0) + + static bool +-member_string_equal(x, l) ++member_string_eq(x, l) + object x, l; + { +- for (; type_of(l) == t_cons; l = l->c.c_cdr) +- if (string_equal(x, l->c.c_car)) ++ for (; consp(l); l = l->c.c_cdr) ++ if (string_eq(x, l->c.c_car)) + return(TRUE); + return(FALSE); + } + ++static inline object ++coerce_to_str(object x) { ++ ++ switch(type_of(x)) { ++ case t_string: ++ case t_symbol: ++ return x; ++ case t_fixnum: ++ case t_character: ++ return coerce_to_string(x); ++ /* printf("foobar\n");fflush(stdout); */ ++ /* token->st.st_self=(char *)&x->ch.ch_code;/\*FIXME*\/ */ ++ /* token->st.st_fillp=1; */ ++ /* return token; */ ++ default: ++ TYPE_ERROR(x,TSor_symbol_string); ++ return Cnil; ++ } ++ ++} ++ ++ + static bool + designate_package(object x,struct package *p) { + + switch(type_of(x)) { + case t_string: case t_symbol: +- return string_equal(x,p->p_name) || member_string_equal(x, p->p_nicknames); ++ return string_eq(x,p->p_name) || member_string_eq(x, p->p_nicknames); + break; + case t_character: +- return designate_package(coerce_to_string(x),p); ++ return designate_package(coerce_to_str(x),p); + break; + case t_package: + return x==(object)p; +@@ -74,7 +98,7 @@ designate_package(object x,struct packag + /* (memchr((a)->st.st_self,'-',(a)->st.st_fillp) || \ */ + /* ((a)->st.st_self[0]=='*' && (a)->st.st_fillp==1))) */ + +-#define check_package_designator(a) if (type_of(a)!=t_string && \ ++#define check_package_designator(a) if (!stringp(a) && \ + type_of(a)!=t_character && \ + type_of(a)!=t_symbol && \ + type_of(a)!=t_package) \ +@@ -82,10 +106,8 @@ designate_package(object x,struct packag + #define check_type_or_symbol_string_package(a) check_package_designator(*a) + + static void +-rehash_pack(ptab,n,m) +- object **ptab; +- int *n,m; +-{ object *ntab; ++rehash_pack(object **ptab,int *n,int m) { ++ object *ntab; + object *tab = *ptab; + object l,ll; + int k,i; +@@ -97,7 +119,7 @@ rehash_pack(ptab,n,m) + *n=m; + while(ic.c_car)%m; + ll=l->c.c_cdr; + l->c.c_cdr = ntab[j]; +@@ -127,11 +149,6 @@ suitable_package_size(int n) + and uses packages in list ul, which must be a list of packages + or package names i.e. strings or symbols. + */ +-static void +-package_already(object); +-static void +-no_package(object); +- + static object + make_package(n, ns, ul,isize,esize) + object n, ns, ul; +@@ -142,15 +159,13 @@ int isize,esize; + int i; + vs_mark; + { BEGIN_NO_INTERRUPT; +- if (type_of(n) == t_symbol) { +- vs_push(alloc_simple_string(n->s.s_fillp)); +- vs_head->st.st_self = n->s.s_self; +- n = vs_head; +- } +- if (type_of(n)==t_character) ++ BEGIN: + n=coerce_to_string(n); +- if (find_package(n) != Cnil) +- package_already(n); ++ if (find_package(n) != Cnil) { ++ PACKAGE_CERROR(n,"Input new package","Package already exists",0); ++ NEW_INPUT(n); ++ goto BEGIN; ++ } + x = alloc_object(t_package); + x->p.p_name = n; + x->p.p_nicknames = Cnil; +@@ -166,17 +181,13 @@ int isize,esize; + + vs_push(x); + for (; !endp(ns); ns = ns->c.c_cdr) { +- n = ns->c.c_car; +- if (type_of(n) == t_symbol) { +- vs_push(alloc_simple_string(n->s.s_fillp)); +- vs_head->st.st_self = n->s.s_self; +- n = vs_head; +- } +- if (type_of(n)==t_character) +- n=coerce_to_string(n); ++ n = ns->c.c_car; ++ n=coerce_to_string(n); + if (find_package(n) != Cnil) { + vs_reset; +- package_already(n); ++ PACKAGE_CERROR(n,"Input new nicknames list","Package already exists",0); ++ NEW_INPUT(ns); ++ goto BEGIN; + } + x->p.p_nicknames = make_cons(n, x->p.p_nicknames); + } +@@ -185,8 +196,10 @@ int isize,esize; + y = ul->c.c_car; + else { + y = find_package(ul->c.c_car); +- if (y == Cnil) +- no_package(ul->c.c_car); ++ if (y == Cnil) { ++ PACKAGE_CERROR(ul->c.c_car,"Continue anyway","No such package",0); ++ continue; ++ } + } + x->p.p_uselist = make_cons(y, x->p.p_uselist); + y->p.p_usedbylist = make_cons(x, y->p.p_usedbylist); +@@ -218,30 +231,32 @@ int isize,esize; + object x, y; + vs_mark; + ++ BEGIN: + x = find_package(n); + if (x == Cnil) { + #ifdef ANSI_COMMON_LISP +- FEpackage_error(n,"No such package"); +- return Cnil; ++ PACKAGE_CERROR(n,"Input new package","No such package",0); ++ NEW_INPUT(n); ++ goto BEGIN; ++ return Cnil; + #else +- x = make_package(n, ns, ul,isize,esize); +- goto L; ++ x = make_package(n, ns, ul,isize,esize); ++ goto L; + #endif + } + if (isize) rehash_pack(&(x->p.p_internal), + &x->p.p_internal_size,isize); + for (; !endp(ns); ns = ns->c.c_cdr) { + n = ns->c.c_car; +- if (type_of(n) == t_symbol) { +- vs_push(alloc_simple_string(n->s.s_fillp)); +- vs_head->st.st_self = n->s.s_self; +- n = vs_head; +- } ++ n=coerce_to_string(n); + y = find_package(n); + if (x == y) + continue; +- if (y != Cnil) +- package_already(n); ++ if (y != Cnil) { ++ PACKAGE_CERROR(n,"Input new nicknames list","Package already exists",0); ++ NEW_INPUT(ns); ++ goto BEGIN; ++ } + x->p.p_nicknames = make_cons(n, x->p.p_nicknames); + } + for (; !endp(ul); ul = ul->c.c_cdr) +@@ -262,32 +277,27 @@ object x, n, ns; + object y; + vs_mark; + +- if (type_of(n) == t_symbol) { +- vs_push(alloc_simple_string(n->s.s_fillp)); +- vs_head->st.st_self = n->s.s_self; +- n = vs_head; +- } +- if (type_of(n)==t_character) +- n=coerce_to_string(n); ++ BEGIN: ++ n=coerce_to_string(n); + if (!(equal(x->p.p_name,n)) && +- find_package(n) != Cnil) +- package_already(n); ++ find_package(n) != Cnil) { ++ PACKAGE_CERROR(n,"Input new package","Package already exists",0); ++ NEW_INPUT(n); ++ goto BEGIN; ++ } + x->p.p_name = n; + x->p.p_nicknames = Cnil; + for (; !endp(ns); ns = ns->c.c_cdr) { + n = ns->c.c_car; +- if (type_of(n) == t_symbol) { +- vs_push(alloc_simple_string(n->s.s_fillp)); +- vs_head->st.st_self = n->s.s_self; +- n = vs_head; +- } +- if (type_of(n)==t_character) +- n=coerce_to_string(n); ++ n=coerce_to_string(n); + y = find_package(n); + if (x == y) + continue; +- if (y != Cnil) +- package_already(n); ++ if (y != Cnil) { ++ PACKAGE_CERROR(n,"Input nicknames list","Package already exists",0); ++ NEW_INPUT(ns); ++ goto BEGIN; ++ } + x->p.p_nicknames = make_cons(n, x->p.p_nicknames); + } + vs_reset; +@@ -322,8 +332,11 @@ object p; + if (type_of(p) == t_package) + return(p); + pp = find_package(p); +- if (pp == Cnil) +- no_package(p); ++ if (pp == Cnil) { ++ PACKAGE_CERROR(p,"Input new package","No such package",0); ++ NEW_INPUT(p); ++ return coerce_to_package(p); ++ } + return(pp); + } + +@@ -350,7 +363,8 @@ int + pack_hash(x) + object x; + {unsigned int h=0; +- {int len=x->st.st_fillp; ++ x=coerce_to_str(x); ++ {int len=x->st.st_fillp; + char *s; + #define HADD(i,j,k,l) (h+=s[i],h+=s[j]<<8,h+=s[k]<<13,h+=s[l]<<23) + #define HADD2(i,j) (h+=s[i]<<5,h+=s[j]<<15) +@@ -378,7 +392,35 @@ object x; + return(h); + }} + ++DEFUN_NEW("PACK-HASH",fixnum,fSpack_hash,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") { ++ RETURN1(pack_hash(x)); ++} ++ ++DEFUN_NEW("SET-SYMBOL-HPACK",object,fSset_symbol_hpack,SI,2,2,NONE,OO,OO,OO,OO,(object p,object s),"") { ++ check_type_package(&p); ++ check_type_sym(&s); ++ RETURN1(s->s.s_hpack=p); ++} ++ ++/* DEFUN_NEW("PACKAGE-INTERNAL",object,fSpackage_internal,SI,2,2,NONE,OO,IO,OO,OO,(object x,fixnum i),"") { */ ++/* check_type_package(&x); */ ++/* RETURN1(x->p.p_internal[i]); */ ++/* } */ ++ ++DEFUN_NEW("PACKAGE-INTERNAL_SIZE",fixnum,fSpackage_internal_size,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") { ++ check_type_package(&x); ++ RETURN1(x->p.p_internal_size); ++} ++ ++/* DEFUN_NEW("PACKAGE-EXTERNAL",object,fSpackage_external,SI,2,2,NONE,OO,IO,OO,OO,(object x,fixnum i),"") { */ ++/* check_type_package(&x); */ ++/* RETURN1(x->p.p_external[i]); */ ++/* } */ + ++DEFUN_NEW("PACKAGE-EXTERNAL_SIZE",fixnum,fSpackage_external_size,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") { ++ check_type_package(&x); ++ RETURN1(x->p.p_external_size); ++} + + /* + Intern(st, p) interns string st in package p. +@@ -391,27 +433,25 @@ object st, p; + object x, *ip, *ep, l, ul; + vs_mark; + ++ st=coerce_to_str(st); + {BEGIN_NO_INTERRUPT; + j = pack_hash(st); + ip = &P_INTERNAL(p ,j); +-#define string_eq(a,b) \ +- ((a)->st.st_fillp==(b)->st.st_fillp && \ +- bcmp((a)->st.st_self,(b)->st.st_self,(a)->st.st_fillp)==0) + +- for (l = *ip; type_of(l) == t_cons; l = l->c.c_cdr) ++ for (l = *ip; consp(l); l = l->c.c_cdr) + if (string_eq(l->c.c_car, st)) { + intern_flag = INTERNAL; + END_NO_INTERRUPT;return(l->c.c_car); + } + ep = &P_EXTERNAL(p,j); +- for (l = *ep; type_of(l) == t_cons; l = l->c.c_cdr) ++ for (l = *ep; consp(l); l = l->c.c_cdr) + if (string_eq(l->c.c_car, st)) { + intern_flag = EXTERNAL; + END_NO_INTERRUPT;return(l->c.c_car); + } +- for (ul=p->p.p_uselist; type_of(ul)==t_cons; ul=ul->c.c_cdr) ++ for (ul=p->p.p_uselist; consp(ul); ul=ul->c.c_cdr) + for (l = P_EXTERNAL(ul->c.c_car,j); +- type_of(l) == t_cons; ++ consp(l); + l = l->c.c_cdr) + if (string_eq(l->c.c_car, st)) { + intern_flag = INHERITED; +@@ -448,23 +488,23 @@ object st, p; + int j; + object *ip, *ep, l, ul; + {BEGIN_NO_INTERRUPT; +- if (type_of(st)==t_character) st=coerce_to_string(st); ++ st=coerce_to_str(st); + j = pack_hash(st); + ip = &P_INTERNAL(p ,j); +- for (l = *ip; type_of(l) == t_cons; l = l->c.c_cdr) ++ for (l = *ip; consp(l); l = l->c.c_cdr) + if (string_eq(l->c.c_car, st)) { + intern_flag = INTERNAL; + END_NO_INTERRUPT;return(l->c.c_car); + } + ep = &P_EXTERNAL(p,j); +- for (l = *ep; type_of(l) == t_cons; l = l->c.c_cdr) ++ for (l = *ep; consp(l); l = l->c.c_cdr) + if (string_eq(l->c.c_car, st)) { + intern_flag = EXTERNAL; + END_NO_INTERRUPT;return(l->c.c_car); + } +- for (ul=p->p.p_uselist; type_of(ul)==t_cons; ul=ul->c.c_cdr) ++ for (ul=p->p.p_uselist; consp(ul); ul=ul->c.c_cdr) + for (l = P_EXTERNAL(ul->c.c_car,j); +- type_of(l) == t_cons; ++ consp(l); + l = l->c.c_cdr) + if (string_eq(l->c.c_car, st)) { + intern_flag = INHERITED; +@@ -499,14 +539,16 @@ object s, p; + + L: + x = OBJNULL; +- for (l = p->p.p_uselist; type_of(l) == t_cons; l = l->c.c_cdr) { ++ for (l = p->p.p_uselist; consp(l); l = l->c.c_cdr) { + y = find_symbol(s, l->c.c_car); + if (intern_flag == EXTERNAL) { + if (x == OBJNULL) + x = y; +- else if (x != y) +- FEpackage_error(p,"Cannot unintern the shadowing symbol"\ +- "as it will produce a name conflict"); ++ else if (x != y) { ++ PACKAGE_CERROR(p,"Input new symbol","Name conflict on unintern of shadowing symbol ~s",1,s); ++ NEW_INPUT(s); ++ goto L; ++ } + } + } + delete_eq(s, &p->p.p_shadowings); +@@ -541,15 +583,21 @@ BEGIN: + ip = &P_INTERNAL(p ,j); + else if (intern_flag == EXTERNAL) + return; +- } else +- FEpackage_error(p,"Symbol not accessible."); ++ } else { ++ PACKAGE_CERROR(p,"Input new symbol","Symbol ~s not accessible",1,s); ++ NEW_INPUT(s); ++ goto BEGIN; ++ } + for (l = p->p.p_usedbylist; +- type_of(l) == t_cons; ++ consp(l); + l = l->c.c_cdr) { +- x = find_symbol(s, l->c.c_car); ++ x = find_symbol(s, l->c.c_car); + if (intern_flag && s != x && +- !member_eq(x, l->c.c_car->p.p_shadowings)) +- FEpackage_error(p,"Cannot export symbol as it will produce a name conflict."); ++ !member_eq(x, l->c.c_car->p.p_shadowings)) { ++ PACKAGE_CERROR(p,"Input new symbol","Name conflict on exporting ~s",1,s); ++ NEW_INPUT(s); ++ goto BEGIN; ++ } + } + if (ip != NULL) + {delete_eq(s, ip); +@@ -566,11 +614,18 @@ object s, p; + object x, *ep, *ip; + int j; + +- if (p == keyword_package) +- FEpackage_error(p,"Cannot unexport a symbol from the keyword."); ++ BEGIN: ++ if (p == keyword_package) { ++ PACKAGE_CERROR(p,"Input new package","Cannot unexport a symbol from the keyword",0); ++ NEW_INPUT(p); ++ goto BEGIN; ++ } + x = find_symbol(s, p); +- if (/* intern_flag != EXTERNAL || */ x != s) +- FEpackage_error(p,"Symbol not in package."); ++ if (/* intern_flag != EXTERNAL || */ x != s) { ++ PACKAGE_CERROR(p,"Input new symbol","Symbol ~s not in package.",1,s); ++ NEW_INPUT(s); ++ goto BEGIN; ++ } + /* "Cannot unexport the symbol ~S~%\ */ + /* from ~S,~%\ */ + /* because the symbol is not an external symbol~%\ */ +@@ -591,17 +646,22 @@ object s, p; + int j; + object *ip; + ++ BEGIN: + x = find_symbol(s, p); + if (intern_flag) { +- if (x != s) +- FEpackage_error(p,"Cannot import symbol as it will produce a name conflict"); +- if (intern_flag == INTERNAL || intern_flag == EXTERNAL) +- return; ++ if (x != s) { ++ PACKAGE_CERROR(p,"Input new symbol","Name conflict on importing ~s",1,s); ++ NEW_INPUT(s); ++ goto BEGIN; ++ } ++ if (intern_flag == INTERNAL || intern_flag == EXTERNAL) ++ return; + } + j = pack_hash(s); + ip = &P_INTERNAL(p ,j); + p->p.p_internal_fp++; + *ip = make_cons(s, *ip); ++ if (s->s.s_hpack==Cnil) {if (p==keyword_package) s->s.tt=2;s->s.s_hpack=p;} + } + + static void +@@ -610,7 +670,7 @@ object s, p; + { + object x, *ip; + +- x = find_symbol(s, p); ++ x=find_symbol(s, p); + if (intern_flag && intern_flag != INHERITED) { + if (x == s) { + if (!member_eq(x, p->p.p_shadowings)) +@@ -640,12 +700,12 @@ shadow(s, p) + object s, p; + { + int j; +- object *ip; ++ object *ip,x; + +- if (type_of(s)==t_character) s=coerce_to_string(s); +- find_symbol(s, p); ++ s=coerce_to_str(s); ++ x=find_symbol(s, p); + if (intern_flag == INTERNAL || intern_flag == EXTERNAL) { +- p->p.p_shadowings = make_cons(s, p->p.p_shadowings); ++ p->p.p_shadowings = make_cons(x, p->p.p_shadowings); + return; + } + j = pack_hash(s); +@@ -666,27 +726,36 @@ object x0, p; + int i; + object y, l; + ++ BEGIN: + if (type_of(x) != t_package) { + x = find_package(x); +- if (x == Cnil) +- no_package(x0); ++ if (x == Cnil) { ++ PACKAGE_CERROR(x0,"Input new package","No such package",0); ++ NEW_INPUT(x0); ++ goto BEGIN; ++ } ++ } ++ if (x == keyword_package) { ++ PACKAGE_CERROR(x,"Input new package","Cannot use keyword package",0); ++ NEW_INPUT(x); ++ goto BEGIN; + } +- if (x == keyword_package) +- FEpackage_error(x,"Cannot use keyword package."); + if (p == x) + return; + if (member_eq(x, p->p.p_uselist)) + return; + for (i = 0; i < x->p.p_external_size; i++) + for (l = P_EXTERNAL(x ,i); +- type_of(l) == t_cons; ++ consp(l); + l = l->c.c_cdr) { + y = find_symbol(l->c.c_car, p); + if (intern_flag && l->c.c_car != y + && ! member_eq(y,p->p.p_shadowings) +- ) +- FEpackage_error(p,"Cannot use package as it will produce" +- " a name conflict"); ++ ) { ++ PACKAGE_CERROR(p,"Input new package","Name conflict on using ~s from ~s",2,p,y); ++ NEW_INPUT(p); ++ goto BEGIN; ++ } + } + p->p.p_uselist = make_cons(x, p->p.p_uselist); + x->p.p_usedbylist = make_cons(p, x->p.p_usedbylist); +@@ -698,10 +767,14 @@ object x0, p; + { + object x = x0; + ++ BEGIN: + if (type_of(x) != t_package) { + x = find_package(x); +- if (x == Cnil) +- no_package(x0); ++ if (x == Cnil) { ++ PACKAGE_CERROR(x0,"Input new package","No such package",0); ++ NEW_INPUT(x0); ++ goto BEGIN; ++ } + } + delete_eq(x, &p->p.p_uselist); + delete_eq(p, &x->p.p_usedbylist); +@@ -721,9 +794,11 @@ delete_package(object n) { + + if (p->p_usedbylist!=Cnil) { + +- FEpackage_error((object)p,"Package used by other packages."); ++ PACKAGE_CERROR((object)n,"Delete anyway","Package used by other packages",0); ++ + for (t=p->p_usedbylist;!endp(t);t=t->c.c_cdr) + unuse_package((object)p,t->c.c_car); ++ + } + + if (p->p_uselist!=Cnil) { +@@ -742,8 +817,11 @@ delete_package(object n) { + + } + +- if (type_of(n)!=t_package) +- FEpackage_error(n,"No such package."); ++ if (type_of(n)!=t_package) { ++ PACKAGE_CERROR(n,"Input new package","No such package",0); ++ NEW_INPUT(n); ++ return delete_package(n); ++ } + + return(Cnil); + +@@ -759,7 +837,6 @@ delete_package(object n) { + (external `small_fixnum(0)`) + ) + @ +- if (type_of(pack_name)==t_character) pack_name=coerce_to_string(pack_name); + check_type_or_string_symbol(&pack_name); + @(return `make_package(pack_name, nicknames, use, + fix(internal),fix(external))`) +@@ -770,18 +847,51 @@ delete_package(object n) { + (external `small_fixnum(0)`) + ) + @ +- if (type_of(pack_name)==t_character) pack_name=coerce_to_string(pack_name); + check_type_or_string_symbol(&pack_name); + if (find_package(pack_name) == Cnil && !(use_sp)) + use = make_cons(lisp_package, Cnil); + @(return `in_package(pack_name, nicknames, use,fix(internal),fix(external))`) + @) + +-LFD(Lfind_package)() +-{ +- check_arg(1); ++extern object sKuse; ++extern object sKnicknames; ++DEF_ORDINARY("IN-PACKAGE-INTERNAL",sSin_package_internal,SI,""); ++DEFUN_NEW("IN-PACKAGE-INTERNAL",object,fSin_package_internal,SI,2,2,NONE,OO,OO,OO,OO,(object p,object r),"") { ++ ++ object use=Cnil,nick=Cnil; ++ ++ /*fixme non-std error check?*/ ++ for (;consp(r) && consp(r->c.c_cdr);r=r->c.c_cdr->c.c_cdr) { ++ if (r->c.c_car==sKuse) ++ use=Ieval1(r->c.c_cdr->c.c_car); ++ if (r->c.c_car==sKnicknames) ++ nick=Ieval1(r->c.c_cdr->c.c_car); ++ } ++ ++ RETURN1(in_package(p,nick,use,0,0)); + +- vs_base[0] = find_package(vs_base[0]); ++} ++ ++#ifdef ANSI_COMMON_LISP ++ ++static void ++FFN(Fin_package)(void) { ++ ++ object x; ++ ++ if (vs_top-vs_base!=2) ++ FEwrong_no_args("Fin_package requires two arguments",make_fixnum(vs_top-vs_base)); ++ x=MMcadr(vs_base[0]); ++ x=type_of(x)==t_symbol ? list(2,sLquote,x) : x; ++ vs_base[0]=list(3,sSin_package_internal,x,list(2,sLquote,MMcddr(vs_base[0]))); ++ vs_top=vs_base+1; ++ ++} ++ ++#endif ++ ++DEFUN_NEW("FIND-PACKAGE",object,fLfind_package,LISP,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(find_package(x));/*FIXME p->p_link not exposable in lisp*/ + } + + LFD(Ldelete_package)() +@@ -816,7 +926,6 @@ LFD(Lpackage_nicknames)() + @ + check_package_designator(pack); + pack = coerce_to_package(pack); +- if (type_of(new_name)==t_character) new_name=coerce_to_string(new_name); + check_type_or_string_symbol(&new_name); + @(return `rename_package(pack, new_name, new_nicknames)`) + @) +@@ -921,9 +1030,11 @@ BEGIN: + break; + + case t_cons: +- for (l = symbols; !endp(l); l = l->c.c_cdr) +- export(l->c.c_car, pack); +- break; ++ for (l = symbols; !endp(l); l = l->c.c_cdr) { ++ check_type_sym(&l->c.c_car); ++ export(l->c.c_car, pack); ++ } ++ break; + + default: + check_type_sym(&symbols); +@@ -947,8 +1058,10 @@ BEGIN: + break; + + case t_cons: +- for (l = symbols; !endp(l); l = l->c.c_cdr) +- unexport(l->c.c_car, pack); ++ for (l = symbols; !endp(l); l = l->c.c_cdr) { ++ check_type_sym(&l->c.c_car); ++ unexport(l->c.c_car, pack); ++ } + break; + + default: +@@ -1123,20 +1236,6 @@ LFD(siLpackage_external)() + } + + static void +-no_package(n) +-object n; +-{ +- FEwrong_type_argument(TSor_symbol_string_package,n); +-} +- +-static void +-package_already(n) +-object n; +-{ +- FEpackage_error(n,"A package with this name already exists."); +-} +- +-static void + FFN(siLpackage_size)() + {object p; + p=vs_base[0]; +@@ -1188,8 +1287,12 @@ gcl_init_package_function() + { + make_function("MAKE-PACKAGE", Lmake_package); + make_function("DELETE-PACKAGE", Ldelete_package); ++#ifdef ANSI_COMMON_LISP ++ make_si_function("KCL-IN-PACKAGE", Lin_package); ++ make_macro_function("IN-PACKAGE", Fin_package); ++#else + make_function("IN-PACKAGE", Lin_package); +- make_function("FIND-PACKAGE", Lfind_package); ++#endif + make_function("PACKAGE-NAME", Lpackage_name); + make_function("PACKAGE-NICKNAMES", Lpackage_nicknames); + make_function("RENAME-PACKAGE", Lrename_package); +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -209,7 +209,7 @@ load_memory(struct scnhdr *sec1,struct s + + memory=new_cfdata(); + memory->cfd.cfd_size=sz; +- memory->cfd.cfd_start=alloc_code_space(sz); ++ memory->cfd.cfd_start=alloc_code_space(sz,-1UL); + + for (sec=sec1;secs_paddr+=(ul)memory->cfd.cfd_start; +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -243,6 +243,31 @@ relocate_symbols(Sym *sym,Sym *syme,Shdr + + } + ++#ifdef LARGE_MEMORY_MODEL ++ ++DEFUN_NEW("MARK-AS-LARGE-MEMORY-MODEL",object,fSmark_as_large_memory_model,SI,1,1, ++ NONE,OO,OO,OO,OO,(object x),"") { ++ ++ FILE *f; ++ void *ve; ++ Ehdr *fhp; ++ ++ coerce_to_filename(x,FN1); ++ ++ massert(f=fopen(FN1,"r+")); ++ massert(fhp=get_mmap_shared(f,&ve)); ++ ++ fhp->e_flags|=1; ++ ++ massert(!un_mmap(fhp,ve)); ++ massert(!fclose(f)); ++ ++ return Cnil; ++ ++} ++ ++#endif ++ + static object + load_memory(Shdr *sec1,Shdr *sece,void *v1,ul **got,ul **gote) { + +@@ -274,7 +299,17 @@ load_memory(Shdr *sec1,Shdr *sece,void * + + memory=new_cfdata(); + memory->cfd.cfd_size=sz; +- memory->cfd.cfd_start=alloc_code_space(sz); ++ memory->cfd.cfd_start=alloc_code_space(sz, ++#ifdef MAX_DEFAULT_MEMORY_MODEL_CODE_ADDRESS ++#ifdef LARGE_MEMORY_MODEL ++ (((Ehdr *)v1)->e_flags) ? -1UL : MAX_DEFAULT_MEMORY_MODEL_CODE_ADDRESS ++#else ++ MAX_DEFAULT_MEMORY_MODEL_CODE_ADDRESS ++#endif ++#else ++ -1UL ++#endif ++ ); + + a=(ul)memory->cfd.cfd_start; + a=(a+ma)&~ma; +--- gcl-2.6.12.orig/o/sfaslmacho.c ++++ gcl-2.6.12/o/sfaslmacho.c +@@ -205,7 +205,7 @@ load_memory(struct section *sec1,struct + + memory=new_cfdata(); + memory->cfd.cfd_size=sz; +- memory->cfd.cfd_start=alloc_code_space(sz); ++ memory->cfd.cfd_start=alloc_code_space(sz,-1UL); + + a=(ul)memory->cfd.cfd_start; + a=(a+ma)&~ma; +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -498,8 +498,8 @@ un_mmap(void *v1,void *ve) { + + #include + +-void * +-get_mmap(FILE *fp,void **ve) { ++static void * ++get_mmap_flags(FILE *fp,void **ve,int flags) { + + int n; + void *v1; +@@ -508,7 +508,7 @@ get_mmap(FILE *fp,void **ve) { + massert((n=fileno(fp))>2); + massert(!fstat(n,&ss)); + if (sSAload_with_freadA->s.s_dbind==Cnil) { +- massert((v1=mmap(0,ss.st_size,PROT_READ|PROT_WRITE,MAP_PRIVATE,n,0))!=(void *)-1); ++ massert((v1=mmap(0,ss.st_size,PROT_READ|PROT_WRITE,flags,n,0))!=(void *)-1); + } else { + massert(v1=malloc(ss.st_size)); + massert(fread(v1,ss.st_size,1,fp)==1); +@@ -519,6 +519,19 @@ get_mmap(FILE *fp,void **ve) { + + } + ++void * ++get_mmap(FILE *fp,void **ve) { ++ ++ return get_mmap_flags(fp,ve,MAP_PRIVATE); ++ ++} ++ ++void * ++get_mmap_shared(FILE *fp,void **ve) { ++ ++ return get_mmap_flags(fp,ve,MAP_SHARED); ++ ++} + + int + un_mmap(void *v1,void *ve) { +--- gcl-2.6.12.orig/pcl/sys-proclaim.lisp ++++ gcl-2.6.12/pcl/sys-proclaim.lisp +@@ -2,682 +2,178 @@ + (COMMON-LISP::IN-PACKAGE "PCL") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- PCL::NON-NEGATIVE-FIXNUM) +- PCL::CACHE-SIZE PCL::CACHE-MASK PCL::CACHE-NLINES +- PCL::CACHE-MAX-LOCATION)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- PCL::COMPILE-LAMBDA-DEFERRED +- PCL::EARLY-SLOT-DEFINITION-LOCATION PCL::FGEN-SYSTEM +- PCL::EARLY-CLASS-PRECEDENCE-LIST PCL::MAKE-CLASS-EQ-PREDICATE +- PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS PCL::USE-CACHING-DFUN-P +- WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE +- PCL::SFUN-P PCL::INTERN-EQL-SPECIALIZER +- PCL::ACCESSOR-DFUN-INFO-P WALKER::ENV-WALK-FORM +- PCL::ARG-INFO-NUMBER-OPTIONAL PCL::TWO-CLASS-ACCESSOR-TYPE +- PCL::FREE-CACHE PCL::SHOW-DFUN-COSTS PCL::CHECKING-CACHE +- PCL::EARLY-GF-P PCL::EARLY-COLLECT-CPL PCL::NO-METHODS-CACHE +- PCL::EXTRACT-PARAMETERS PCL::DEFAULT-CONSTANTP +- PCL::PARSE-SPECIALIZERS +- PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION +- PCL::DFUN-INFO-P PCL::CLASS-PRECEDENCE-DESCRIPTION-P +- PCL::%FBOUNDP PCL::ONE-INDEX-DFUN-INFO-INDEX +- PCL::ONE-CLASS-CACHE PCL::DEFAULT-STRUCTURE-INSTANCE-P +- PCL::CONSTANT-VALUE-CACHE PCL::STRUCTURE-SVUC-METHOD +- PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P +- PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P +- PCL::STRUCTURE-SLOTD-WRITER-FUNCTION PCL::CCLOSUREP +- PCL::COUNT-DFUN PCL::COMPUTE-STD-CPL-PHASE-2 +- PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME +- PCL::EARLY-SLOT-DEFINITION-NAME PCL::MAP-SPECIALIZERS +- PCL::MAKE-CONSTANT-FUNCTION PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P +- PCL::DEFAULT-TEST-CONVERTER +- PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES PCL::TWO-CLASS-INDEX +- PCL::CACHE-P PCL::ARG-INFO-PRECEDENCE +- PCL::STRUCTURE-SLOTD-INIT-FORM PCL::INITIAL-P +- PCL::EXTRACT-REQUIRED-PARAMETERS PCL::%STD-INSTANCE-WRAPPER +- PCL::FUNCTION-PRETTY-ARGLIST PCL::INTERN-FUNCTION-NAME +- PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST +- PCL::FLUSH-CACHE-VECTOR-INTERNAL PCL::TWO-CLASS-P +- PCL::CHECK-CACHE PCL::RESET-INITIALIZE-INFO +- PCL::ONE-INDEX-DFUN-INFO-P PCL::LEGAL-CLASS-NAME-P +- PCL::UPDATE-PV-TABLE-CACHE-INFO +- PCL::RESET-CLASS-INITIALIZE-INFO PCL::DISPATCH-P +- PCL::%STD-INSTANCE-SLOTS PCL::SETFBOUNDP PCL::LOOKUP-FGEN +- PCL::MAKE-INITFUNCTION PCL::FORCE-CACHE-FLUSHES +- PCL::COMPLICATED-INSTANCE-CREATION-METHOD +- PCL::NET-TEST-CONVERTER WALKER::ENV-DECLARATIONS +- SYSTEM::%STRUCTURE-NAME PCL::GMAKUNBOUND PCL::TWO-CLASS-CACHE +- PCL::STRUCTURE-TYPE PCL::CPD-CLASS PCL::CPD-AFTER +- PCL::FAST-METHOD-CALL-P PCL::FGEN-GENERATOR-LAMBDA +- PCL::CHECKING-FUNCTION PCL::DEFAULT-CONSTANT-CONVERTER +- PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 +- PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL PCL::EARLY-METHOD-CLASS +- PCL::BUILT-IN-WRAPPER-OF PCL::EXPAND-SHORT-DEFCOMBIN +- PCL::WRAPPER-OF +- PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION +- PCL::PV-TABLEP PCL::EARLY-CLASS-NAME-OF +- PCL::GET-MAKE-INSTANCE-FUNCTION PCL::ARG-INFO-KEY/REST-P +- PCL::MAKE-EQL-PREDICATE PCL::STRUCTURE-SLOTD-READER-FUNCTION +- PCL::CACHING-DFUN-INFO PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE +- PCL::N-N-ACCESSOR-TYPE PCL::FAST-METHOD-CALL-PV-CELL +- PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION +- PCL::EXTRACT-SPECIALIZER-NAMES PCL::MAKE-TYPE-PREDICATE +- PCL::GET-CACHE-VECTOR PCL::SORT-SLOTS +- PCL::DEFAULT-STRUCTURE-TYPE SYSTEM::%COMPILED-FUNCTION-NAME +- PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS WALKER::ENV-LOCK +- PCL::ONE-INDEX-DFUN-INFO-CACHE PCL::ONE-INDEX-P +- PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION +- PCL::STANDARD-SVUC-METHOD PCL::MAKE-FUNCTION-INLINE +- PCL::ALLOCATE-CACHE-VECTOR PCL::SLOT-BOUNDP-SYMBOL +- PCL::METHOD-CALL-P PCL::STD-INSTANCE-P +- PCL::GET-BUILT-IN-WRAPPER-SYMBOL PCL::FUNCALLABLE-INSTANCE-P +- PCL::ECD-CANONICAL-SLOTS PCL::GET-BUILT-IN-CLASS-SYMBOL +- PCL::FREE-CACHE-VECTOR PCL::GF-INFO-STATIC-C-A-M-EMF +- PCL::EARLY-GF-NAME PCL::UPDATE-CLASS-CAN-PRECEDE-P +- PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P +- PCL::ACCESSOR-DFUN-INFO-CACHE PCL::ARG-INFO-VALID-P +- PCL::ONE-CLASS-INDEX WALKER::GET-WALKER-TEMPLATE +- PCL::GFS-OF-TYPE PCL::N-N-P PCL::METHOD-CALL-CALL-METHOD-ARGS +- PCL::BOOTSTRAP-CLASS-PREDICATES PCL::MAKE-INITIAL-DFUN +- PCL::ONE-CLASS-WRAPPER0 PCL::ECD-OTHER-INITARGS +- PCL::TWO-CLASS-WRAPPER1 PCL::MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::FUNCTION-RETURNING-T PCL::STRUCTURE-SLOTD-TYPE +- PCL::ARG-INFO-APPLYP PCL::ECD-SUPERCLASS-NAMES +- PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME +- PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION +- PCL::FGEN-GENSYMS PCL::EARLY-METHOD-STANDARD-ACCESSOR-P +- PCL::DEFAULT-METHOD-ONLY-CACHE WALKER::ENV-LEXICAL-VARIABLES +- PCL::ECD-CLASS-NAME PCL::GET-MAKE-INSTANCE-FUNCTIONS +- PCL::EARLY-CLASS-DEFINITION PCL::ECD-METACLASS +- PCL::UNDEFMETHOD-1 PCL::MAKE-CALL-METHODS +- PCL::METHOD-LL->GENERIC-FUNCTION-LL PCL::SORT-CALLS +- ITERATE::VARIABLES-FROM-LET PCL::GF-LAMBDA-LIST +- PCL::INITIALIZE-INFO-KEY PCL::EARLY-CLASS-DIRECT-SUBCLASSES +- PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE +- PCL::MAKE-PERMUTATION-VECTOR PCL::EXTRACT-LAMBDA-LIST +- PCL::CONSTANT-VALUE-DFUN-INFO PCL::DNET-METHODS-P +- PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME +- PCL::UPDATE-GFS-OF-CLASS PCL::SLOT-VECTOR-SYMBOL +- PCL::COMPUTE-MCASE-PARAMETERS PCL::GBOUNDP +- PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD PCL::CONSTANT-SYMBOL-P +- PCL::CPD-SUPERS PCL::DEFAULT-METHOD-ONLY-P +- PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::CACHE-OWNER PCL::FAST-INSTANCE-BOUNDP-P +- PCL::INITIALIZE-INFO-WRAPPER +- PCL::INITIALIZE-INFO-CACHED-VALID-P PCL::EVAL-FORM +- PCL::DEFAULT-STRUCTUREP PCL::FUNCTION-RETURNING-NIL +- PCL::ONE-CLASS-P PCL::ARG-INFO-KEYWORDS +- PCL::EARLY-CLASS-SLOTDS PCL::GET-PV-CELL-FOR-CLASS +- PCL::ONE-CLASS-ACCESSOR-TYPE PCL::GENERIC-CLOBBERS-FUNCTION +- PCL::DFUN-INFO-CACHE PCL::MAKE-PV-TABLE-TYPE-DECLARATION +- PCL::RESET-CLASS-INITIALIZE-INFO-1 PCL::CLASS-FROM-TYPE +- PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST +- PCL::EARLY-METHOD-LAMBDA-LIST +- PCL::EARLY-COLLECT-DEFAULT-INITARGS +- PCL::COMPILE-LAMBDA-UNCOMPILED +- PCL::INITIALIZE-INFO-CACHED-RI-VALID-P PCL::STRUCTURE-TYPE-P +- PCL::%SYMBOL-FUNCTION PCL::MAKE-CALLS-TYPE-DECLARATION +- PCL::SLOT-READER-SYMBOL PCL::KEYWORD-SPEC-NAME +- PCL::FIND-CYCLE-REASONS PCL::UPDATE-ALL-C-A-M-GF-INFO +- PCL::INITIALIZE-INFO-P +- PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P +- PCL::INITIAL-DISPATCH-CACHE PCL::CACHING-CACHE +- PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS +- PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST +- PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS PCL::CONSTANT-VALUE-P +- PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL PCL::EARLY-CLASS-SLOTS +- PCL::UPDATE-C-A-M-GF-INFO PCL::GDEFINITION +- PCL::ARG-INFO-LAMBDA-LIST PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL +- PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION +- PCL::MAKE-PV-TYPE-DECLARATION +- PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P PCL::DISPATCH-CACHE +- PCL::ONE-INDEX-ACCESSOR-TYPE +- PCL::INITIALIZE-INFO-CACHED-CONSTANTS PCL::NO-METHODS-P +- PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION +- PCL::CACHING-DFUN-COST PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE +- PCL::COMPUTE-CLASS-SLOTS PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE +- PCL::GF-INFO-FAST-MF-P PCL::GF-INFO-C-A-M-EMF-STD-P +- PCL::FGEN-TEST PCL::STRUCTURE-SLOTD-NAME PCL::CLASS-PREDICATE +- PCL::STRUCTURE-SLOT-BOUNDP PCL::EARLY-CLASS-NAME +- PCL::LIST-LARGE-CACHE PCL::ONE-INDEX-CACHE +- PCL::SYMBOL-PKG-NAME PCL::INITIAL-CACHE +- PCL::UNENCAPSULATED-FDEFINITION PCL::STORE-FGEN +- PCL::FINAL-ACCESSOR-DFUN-TYPE +- PCL::INITIALIZE-INFO-CACHED-NEW-KEYS PCL::TYPE-CLASS +- PCL::%CCLOSURE-ENV PCL::INITIALIZE-INFO-BOUND-SLOTS +- PCL::GF-DFUN-CACHE PCL::EXPAND-LONG-DEFCOMBIN +- PCL::FGEN-GENERATOR PCL::DFUN-ARG-SYMBOL +- PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST +- PCL::EARLY-METHOD-QUALIFIERS +- WALKER::VARIABLE-GLOBALLY-SPECIAL-P COMMON-LISP::CLASS-OF +- PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION +- PCL::GET-SETF-FUNCTION-NAME PCL::ARG-INFO-P +- WALKER::ENV-WALK-FUNCTION PCL::LIST-DFUN +- PCL::CHECK-WRAPPER-VALIDITY PCL::ARG-INFO-METATYPES +- PCL::EXPAND-MAKE-INSTANCE-FORM PCL::STRUCTURE-OBJECT-P +- PCL::COMPUTE-LINE-SIZE PCL::CANONICAL-SLOT-NAME +- PCL::INITIAL-DISPATCH-P PCL::NEXT-WRAPPER-FIELD +- PCL::WRAPPER-FIELD PCL::WRAPPER-FOR-STRUCTURE +- PCL::METHOD-FUNCTION-PV-TABLE PCL::COPY-CACHE PCL::ECD-SOURCE +- PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::UNPARSE-SPECIALIZERS PCL::CHECKING-P +- PCL::FORMAT-CYCLE-REASONS PCL::N-N-CACHE +- PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION +- PCL::MAP-ALL-GENERIC-FUNCTIONS PCL::METHOD-FUNCTION-METHOD +- PCL::UPDATE-GF-INFO PCL::ARG-INFO-NKEYS +- PCL::TWO-CLASS-WRAPPER0 PCL::GF-DFUN-INFO PCL::ONE-INDEX-INDEX +- PCL::EARLY-COLLECT-SLOTS PCL::CACHING-P +- PCL::METHOD-FUNCTION-PLIST PCL::SLOT-WRITER-SYMBOL +- PCL::FAST-METHOD-CALL-ARG-INFO PCL::INTERNED-SYMBOL-P +- ITERATE::SEQUENCE-ACCESSOR)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- PCL::LIST-LARGE-CACHES +- PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::UNTRACE-METHOD +- COMMON-LISP::INVALID-METHOD-ERROR +- COMMON-LISP::METHOD-COMBINATION-ERROR)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| +- PCL::|__si::MAKE-TWO-CLASS| PCL::FALSE PCL::MAKE-PV-TABLE +- PCL::|__si::MAKE-DISPATCH| PCL::MAKE-INITIALIZE-INFO +- PCL::|__si::MAKE-PV-TABLE| PCL::MAKE-FAST-INSTANCE-BOUNDP +- PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| +- WALKER::UNBOUND-LEXICAL-FUNCTION +- PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| PCL::|__si::MAKE-N-N| +- PCL::USE-PACKAGE-PCL PCL::|__si::MAKE-CHECKING| +- PCL::|STRUCTURE-OBJECT class constructor| +- PCL::|__si::MAKE-CONSTANT-VALUE| +- PCL::CALLED-FIN-WITHOUT-FUNCTION PCL::|__si::MAKE-INITIAL| +- PCL::|__si::MAKE-CACHE| PCL::|__si::MAKE-ONE-INDEX| +- PCL::MAKE-PROGN PCL::TRUE PCL::MAKE-FAST-METHOD-CALL +- PCL::|__si::MAKE-ARG-INFO| PCL::INTERN-PV-TABLE +- PCL::|__si::MAKE-DFUN-INFO| PCL::|__si::MAKE-STD-INSTANCE| +- PCL::|__si::MAKE-CACHING| PCL::|__si::MAKE-ONE-CLASS| +- PCL::PV-WRAPPERS-FROM-PV-ARGS PCL::ZERO +- PCL::|__si::MAKE-INITIAL-DISPATCH| +- PCL::|__si::MAKE-NO-METHODS| PCL::STRING-APPEND +- PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| PCL::MAKE-METHOD-CALL +- PCL::FIX-EARLY-GENERIC-FUNCTIONS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- PCL::METHOD-PROTOTYPE-FOR-GF PCL::SPECIALIZER-FROM-TYPE +- PCL::EMIT-ONE-INDEX-WRITERS PCL::*NORMALIZE-TYPE +- PCL::COMPUTE-APPLICABLE-METHODS-EMF PCL::ANALYZE-LAMBDA-LIST +- PCL::PARSE-DEFMETHOD PCL::GET-DISPATCH-FUNCTION +- PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA +- PCL::EMIT-CONSTANT-VALUE PCL::FIND-WRAPPER +- PCL::MAKE-FINAL-DISPATCH-DFUN PCL::EARLY-COLLECT-INHERITANCE +- PCL::GENERIC-FUNCTION-NAME-P PCL::EMIT-TWO-CLASS-READER +- PCL::PARSE-METHOD-GROUP-SPECIFIER PCL::EMIT-ONE-CLASS-READER +- PCL::FIND-STRUCTURE-CLASS PCL::EMIT-TWO-CLASS-WRITER +- PCL::CONVERT-TO-SYSTEM-TYPE PCL::TYPE-FROM-SPECIALIZER +- PCL::EMIT-ONE-CLASS-WRITER PCL::EARLY-METHOD-FUNCTION +- PCL::MAKE-DISPATCH-DFUN PCL::NET-CODE-CONVERTER +- PCL::GET-GENERIC-FUNCTION-INFO PCL::DEFAULT-CODE-CONVERTER +- PCL::COMPILE-IIS-FUNCTIONS PCL::EMIT-ONE-INDEX-READERS +- PCL::STRUCTURE-WRAPPER PCL::CLASS-EQ-TYPE +- PCL::EMIT-IN-CHECKING-CACHE-P PCL::PCL-DESCRIBE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- ITERATE::RENAME-AND-CAPTURE-VARIABLES +- PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| +- WALKER::WALK-PROG PCL::INVALIDATE-WRAPPER +- PCL::COMPUTE-PRECEDENCE +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| +- WALKER::WALK-LAMBDA PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD +- PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- WALKER::WALK-MULTIPLE-VALUE-BIND +- PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- PCL::NOTE-PV-TABLE-REFERENCE +- PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| +- PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- WALKER::WALK-MULTIPLE-VALUE-SETQ PCL::CONVERT-TABLE +- WALKER::WALK-LET +- PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- PCL::|(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| +- PCL::SKIP-FAST-SLOT-ACCESS-P +- PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- PCL::OPTIMIZE-SLOT-BOUNDP PCL::TRACE-EMF-CALL-INTERNAL +- ITERATE::SIMPLE-EXPAND-GATHERING-FORM +- PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- WALKER::WALK-FLET PCL::ONE-CLASS-DFUN-INFO +- WALKER::WALK-COMPILER-LET +- PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- PCL::FIRST-FORM-TO-LISP WALKER::WALK-DO* +- PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- PCL::|(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- PCL::PRINT-STD-INSTANCE +- PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- WALKER::WALK-MACROLET PCL::GET-FUNCTION-GENERATOR +- PCL::INITIALIZE-INTERNAL-SLOT-GFS* +- PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- PCL::COMPUTE-EFFECTIVE-METHOD PCL::EXPAND-DEFGENERIC +- PCL::OBSOLETE-INSTANCE-TRAP WALKER::WALK-TAGBODY-1 +- PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL +- PCL::GET-NEW-FUNCTION-GENERATOR PCL::SORT-METHODS +- WALKER::WALK-DO PCL::MAKE-DFUN-CALL +- PCL::OPTIMIZE-GF-CALL-INTERNAL +- PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- PCL::OPTIMIZE-SET-SLOT-VALUE +- PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| +- PCL::ENTRY-IN-CACHE-P +- PCL::|(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| +- WALKER::WALK-IF PCL::MAKE-METHOD-SPEC PCL::SET-FUNCTION-NAME-1 +- WALKER::WALK-SETQ +- PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| +- PCL::DECLARE-STRUCTURE PCL::EMIT-BOUNDP-CHECK +- WALKER::WALK-LOCALLY +- PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- PCL::CAN-OPTIMIZE-ACCESS PCL::|SETF PCL PLIST-VALUE| +- WALKER::WALK-LABELS PCL::EMIT-1-T-DLAP +- PCL::|(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| +- PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- PCL::SORT-APPLICABLE-METHODS +- PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- WALKER::WALK-NAMED-LAMBDA ITERATE::OPTIMIZE-ITERATE-FORM +- PCL::MAP-ALL-ORDERS +- PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- ITERATE::OPTIMIZE-GATHERING-FORM +- PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- PCL::ONE-INDEX-DFUN-INFO +- PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- PCL::FLUSH-CACHE-TRAP WALKER::WALK-PROG* +- ITERATE::VARIABLE-SAME-P PCL::EMIT-SLOT-READ-FORM +- PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- PCL::EMIT-GREATER-THAN-1-DLAP +- PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS WALKER::WALK-LET* +- WALKER::WALK-SYMBOL-MACROLET WALKER::VARIABLE-DECLARATION +- PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- WALKER::RECONS +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| +- PCL::OPTIMIZE-SLOT-VALUE WALKER::RELIST-INTERNAL +- PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| +- PCL::|SETF PCL METHOD-FUNCTION-GET| WALKER::WALK-TAGBODY +- WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL +- PCL::|(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| +- PCL::PRINT-CACHE PCL::MAKE-TOP-LEVEL-FORM +- PCL::FIX-SLOT-ACCESSORS WALKER::WALK-UNEXPECTED-DECLARE +- PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P +- PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))|)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::GET-DECLARATION +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE +- PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION +- PCL::GET-METHOD-FUNCTION-PV-CELL +- PCL::NAMED-OBJECT-PRINT-FUNCTION +- PCL::FIND-CLASS-PREDICATE-FROM-CELL +- PCL::GET-EFFECTIVE-METHOD-FUNCTION1 PCL::RECORD-DEFINITION +- PCL::PROBE-CACHE PCL::INITIALIZE-INFO PCL::EMIT-MISS +- PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION +- PCL::FIND-CLASS-FROM-CELL PCL::PRECOMPUTE-EFFECTIVE-METHODS +- PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 +- PCL::METHOD-FUNCTION-GET PCL::MAP-CACHE +- WALKER::CONVERT-MACRO-TO-LAMBDA PCL::MAKE-EMF-FROM-METHOD +- PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS +- PCL::REAL-ENSURE-GF-USING-CLASS--NULL)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ PCL::RENEW-SYS-FILES PCL::MAKE-ARG-INFO PCL::INITIAL-DFUN-INFO ++ PCL::BOOTSTRAP-META-BRAID PCL::UPDATE-DISPATCH-DFUNS ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2 ++ PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST ++ PCL::STRUCTURE-FUNCTIONS-EXIST-P PCL::SHOW-DFUN-CONSTRUCTORS ++ PCL::DEFAULT-METHOD-ONLY-DFUN-INFO ++ PCL::INITIAL-DISPATCH-DFUN-INFO PCL::MAKE-CPD ++ PCL::%%ALLOCATE-INSTANCE--CLASS PCL::IN-THE-COMPILER-P ++ PCL::SHOW-EMF-CALL-TRACE PCL::DISPATCH-DFUN-INFO ++ PCL::BOOTSTRAP-BUILT-IN-CLASSES PCL::LIST-ALL-DFUNS ++ PCL::NO-METHODS-DFUN-INFO PCL::SHOW-FREE-CACHE-VECTORS ++ PCL::MAKE-CACHE PCL::GET-EFFECTIVE-METHOD-GENSYM ++ PCL::CACHES-TO-ALLOCATE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) +- COMMON-LISP::T) ++ COMMON-LISP::*) + PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL +- PCL::BOOTSTRAP-SET-SLOT +- PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| +- PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- PCL::|(FAST-METHOD PRINT-OBJECT (T T))| +- PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- WALKER::WALK-TEMPLATE +- PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- PCL::OPTIMIZE-WRITER +- PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- PCL::|(FAST-METHOD DOCUMENTATION (T))| +- PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION1 +- PCL::|(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- PCL::LOAD-PRECOMPILED-IIS-ENTRY PCL::ADJUST-CACHE +- WALKER::WALK-PROG/PROG* +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- PCL::OPTIMIZE-READER +- PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| +- WALKER::WALK-BINDINGS-2 PCL::MEMF-TEST-CONVERTER +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| +- PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR +- PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| +- PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- PCL::MAKE-DISPATCH-LAMBDA +- PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- WALKER::WALK-DO/DO* PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE +- PCL::|(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- PCL::GET-WRAPPERS-FROM-CLASSES +- PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::EXPAND-CACHE +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| +- PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- PCL::EXPAND-SYMBOL-MACROLET-INTERNAL +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))| +- WALKER::WALK-LET/LET* +- PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| +- PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| +- PCL::EXPAND-DEFCLASS PCL::INITIALIZE-INSTANCE-SIMPLE +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| +- PCL::|(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| +- PCL::MAYBE-EXPAND-ACCESSOR-FORM +- PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- PCL::FILL-CACHE-P +- PCL::|(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| +- PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION ++ PCL::LOAD-SHORT-DEFCOMBIN ++ PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| ++ PCL::|(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| ++ PCL::ACCESSOR-MISS PCL::EMIT-CHECKING-OR-CACHING ++ PCL::INITIALIZE-INSTANCE-SIMPLE-FUNCTION ++ PCL::MAKE-FINAL-CHECKING-DFUN ++ PCL::GET-ACCESSOR-METHOD-FUNCTION ++ PCL::MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ PCL::|(FAST-METHOD NO-APPLICABLE-METHOD (T))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITION ++ PCL::|(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| ++ PCL::EXPAND-CACHE PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| ++ PCL::|(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| ++ PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN ++ PCL::GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION + PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRELIMINARY +- PCL::TWO-CLASS-DFUN-INFO)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::EXPAND-EMF-CALL-METHOD +- PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS +- PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- PCL::MAKE-INSTANCE-FUNCTION-COMPLEX +- PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- PCL::UPDATE-SLOTS-IN-PV +- PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| +- PCL::MAKE-PARAMETER-REFERENCES +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 +- PCL::OPTIMIZE-INSTANCE-ACCESS PCL::OPTIMIZE-ACCESSOR-CALL +- PCL::OPTIMIZE-GENERIC-FUNCTION-CALL +- PCL::REAL-MAKE-METHOD-INITARGS-FORM +- PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| +- PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| +- PCL::COMPUTE-PV-SLOT PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 +- PCL::LOAD-FUNCTION-GENERATOR +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::GET-MAKE-INSTANCE-FUNCTION-INTERNAL +- PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- WALKER::WALK-BINDINGS-1 PCL::MAKE-INSTANCE-FUNCTION-SIMPLE +- PCL::MAKE-FGEN WALKER::WALK-TEMPLATE-HANDLE-REPEAT +- PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| +- PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- PCL::MAKE-EMF-CACHE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::BOOTSTRAP-INITIALIZE-CLASS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::REAL-LOAD-DEFCLASS PCL::LOAD-DEFCLASS +- PCL::OPTIMIZE-GF-CALL PCL::MAKE-EARLY-CLASS-DEFINITION +- WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 PCL::EMIT-SLOT-ACCESS +- PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION +- PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::SET-ARG-INFO1)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::FILL-CACHE PCL::REAL-GET-METHOD PCL::MAKE-EMF-CALL +- PCL::EMIT-FETCH-WRAPPER PCL::CHECK-INITARGS-1 +- PCL::CAN-OPTIMIZE-ACCESS1 PCL::CHECK-INITARGS-2-PLIST +- PCL::CHECK-INITARGS-2-LIST WALKER::WALK-ARGLIST +- PCL::GET-METHOD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::GET-SECONDARY-DISPATCH-FUNCTION1 PCL::EMIT-DLAP)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::FILL-DFUN-CACHE PCL::EARLY-ADD-NAMED-METHOD +- PCL::REAL-ADD-NAMED-METHOD)) ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ PCL::ACCESSOR-VALUES PCL::REAL-MAKE-METHOD-LAMBDA ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ PCL::GENERATE-DISCRIMINATION-NET ++ PCL::MAKE-SHARED-INITIALIZE-FORM-LIST PCL::ORDER-SPECIALIZERS ++ PCL::SET-CLASS-SLOT-VALUE-1 ++ PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (T T))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- PCL::ACCESSOR-VALUES1 PCL::CHECK-METHOD-ARG-INFO +- PCL::EMIT-READER/WRITER PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P + PCL::|(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ PCL::CACHING-MISS + PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION +- PCL::CACHE-MISS-VALUES +- PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::MAKE-FINAL-CACHING-DFUN +- PCL::MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION +- PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ PCL::MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION ++ PCL::EMIT-READER/WRITER ++ PCL::|(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| ++ PCL::ACCESSOR-VALUES1 PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER ++ PCL::FIX-SLOT-ACCESSORS PCL::CHECK-METHOD-ARG-INFO ++ PCL::EMIT-READER/WRITER-FUNCTION PCL::GET-CLASS-SLOT-VALUE-1 ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION + PCL::MAKE-FINAL-CONSTANT-VALUE-DFUN ++ PCL::MAKE-FINAL-CACHING-DFUN ITERATE::RENAME-VARIABLES ++ PCL::CHECKING-MISS PCL::GENERATING-LISP + PCL::|(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ WALKER::WALK-LET-IF PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P ++ PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION + PCL::|(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- PCL::ACCESSOR-VALUES-INTERNAL ITERATE::EXPAND-INTO-LET +- PCL::MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION +- PCL::CONSTANT-VALUE-MISS +- PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION +- WALKER::WALK-LET-IF ITERATE::WALK-GATHERING-BODY +- PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER +- PCL::|(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| +- PCL::CHECKING-MISS PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN +- PCL::GENERATING-LISP ITERATE::RENAME-VARIABLES +- PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| + PCL::CONVERT-METHODS PCL::SLOT-VALUE-USING-CLASS-DFUN +- PCL::EMIT-READER/WRITER-FUNCTION +- PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| +- PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| +- PCL::CACHING-MISS ++ PCL::MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION ++ WALKER::WALK-FORM-INTERNAL ITERATE::WALK-GATHERING-BODY ++ PCL::ACCESSOR-VALUES-INTERNAL PCL::CACHE-MISS-VALUES ++ PCL::CONSTANT-VALUE-MISS + PCL::MAKE-OPTIMIZED-STD-WRITER-METHOD-FUNCTION +- PCL::GET-CLASS-SLOT-VALUE-1 WALKER::WALK-FORM-INTERNAL +- PCL::SLOT-BOUNDP-USING-CLASS-DFUN PCL::LOAD-LONG-DEFCOMBIN +- PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ ITERATE::EXPAND-INTO-LET ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| + PCL::|(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ PCL::LOAD-LONG-DEFCOMBIN ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| ++ PCL::SLOT-BOUNDP-USING-CLASS-DFUN ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| + PCL::SET-SLOT-VALUE +- PCL::|(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))|)) ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| +- PCL::ORDER-SPECIALIZERS +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- PCL::EMIT-CHECKING-OR-CACHING +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| +- PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- PCL::|(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| +- PCL::GENERATE-DISCRIMINATION-NET +- PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| +- PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| +- PCL::GET-ACCESSOR-METHOD-FUNCTION +- PCL::|(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- PCL::MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN +- PCL::EMIT-CHECKING-OR-CACHING-FUNCTION PCL::ACCESSOR-MISS +- PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- PCL::LOAD-SHORT-DEFCOMBIN PCL::MAKE-FINAL-CHECKING-DFUN +- PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- PCL::MAKE-SHARED-INITIALIZE-FORM-LIST +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (T T))| +- PCL::INITIALIZE-INSTANCE-SIMPLE-FUNCTION +- PCL::|(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| +- PCL::ACCESSOR-VALUES PCL::REAL-MAKE-METHOD-LAMBDA +- PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| +- PCL::BOOTSTRAP-ACCESSOR-DEFINITION +- PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| +- PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN +- PCL::GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION +- PCL::|(FAST-METHOD NO-APPLICABLE-METHOD (T))| +- PCL::SET-CLASS-SLOT-VALUE-1)) ++ PCL::SLOT-VALUE-OR-DEFAULT ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE ++ PCL::LOAD-DEFGENERIC PCL::MAKE-DEFAULT-INITARGS-FORM-LIST ++ PCL::GET-SIMPLE-INITIALIZATION-FUNCTION ++ PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS PCL::CPL-ERROR ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION PCL::MAKE-CHECKING-DFUN ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION PCL::REAL-ADD-METHOD ++ PCL::MAKE-FINAL-ACCESSOR-DFUN ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION ++ PCL::MAKE-ACCESSOR-TABLE WALKER::NESTED-WALK-FORM ++ PCL::MAKE-N-N-ACCESSOR-DFUN PCL::TYPES-FROM-ARGUMENTS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| + PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| + PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::WALK-METHOD-LAMBDA +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| + PCL::COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL +- PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| + PCL::|(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ PCL::ADD-METHOD-DECLARATIONS PCL::WALK-METHOD-LAMBDA ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ PCL::MAKE-INSTANCE-FUNCTION-SIMPLE ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| + PCL::MAKE-TWO-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + PCL::|(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| ++ PCL::MAKE-INSTANCE-FUNCTION-COMPLEX + PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- PCL::ADD-METHOD-DECLARATIONS +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))|)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) +- PCL::PV-TABLE-CALL-LIST PCL::CACHE-OVERFLOW +- PCL::PV-TABLE-SLOT-NAME-LISTS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- PCL::MAKE-DEFAULT-INITARGS-FORM-LIST +- PCL::GET-EFFECTIVE-METHOD-FUNCTION PCL::LOAD-DEFGENERIC +- PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS +- PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION +- PCL::SLOT-VALUE-OR-DEFAULT PCL::MAKE-CHECKING-DFUN +- PCL::MAKE-FINAL-ACCESSOR-DFUN WALKER::NESTED-WALK-FORM +- PCL::MAKE-ACCESSOR-TABLE PCL::REAL-ADD-METHOD +- PCL::TYPES-FROM-ARGUMENTS +- PCL::GET-SIMPLE-INITIALIZATION-FUNCTION PCL::CPL-ERROR +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION +- PCL::MAKE-N-N-ACCESSOR-DFUN)) ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T) + COMMON-LISP::*) +- PCL::REAL-MAKE-A-METHOD)) ++ PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| ++ ITERATE::ITERATE-TRANSFORM-BODY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::LOAD-DEFMETHOD-INTERNAL PCL::EXPAND-DEFMETHOD)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ PCL::NON-NEGATIVE-FIXNUM) ++ PCL::CACHE-SIZE PCL::CACHE-NLINES PCL::CACHE-MAX-LOCATION ++ PCL::CACHE-MASK)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::EARLY-MAKE-A-METHOD PCL::LOAD-DEFMETHOD +- PCL::MAKE-DEFMETHOD-FORM PCL::MAKE-DEFMETHOD-FORM-INTERNAL)) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::DO-SHORT-METHOD-COMBINATION ++ PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION ++ PCL::GENERATE-DISCRIMINATION-NET-INTERNAL ++ PCL::MEMF-CODE-CONVERTER PCL::CACHE-MISS-VALUES-INTERNAL ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -690,415 +186,926 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::DO-SHORT-METHOD-COMBINATION +- PCL::GENERATE-DISCRIMINATION-NET-INTERNAL +- PCL::CACHE-MISS-VALUES-INTERNAL +- PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::MEMF-CODE-CONVERTER +- PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::*) + COMMON-LISP::*) +- WALKER::WALK-DECLARATIONS PCL::GET-SECONDARY-DISPATCH-FUNCTION ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION WALKER::WALK-DECLARATIONS + PCL::MAKE-ONE-INDEX-ACCESSOR-DFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::MAKE-CLASS-PREDICATE-NAME PCL::MAKE-KEYWORD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::GET-SECONDARY-DISPATCH-FUNCTION2)) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::*) + COMMON-LISP::*) +- ITERATE::ITERATE-TRANSFORM-BODY +- PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| +- PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))|)) ++ PCL::REAL-MAKE-A-METHOD)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(PCL::TRACE-METHOD-INTERNAL PCL::FDEFINE-CAREFULLY ++ PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST ++ PCL::DO-STANDARD-DEFSETF-1 PCL::REDEFINE-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) ++ PCL::METHOD-CALL-FUNCTION PCL::CACHE-LIMIT-FN ++ PCL::FAST-METHOD-CALL-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ PCL::GF-INFO-STATIC-C-A-M-EMF ++ PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL PCL::FGEN-SYSTEM ++ PCL::SETFBOUNDP PCL::ONE-CLASS-CACHE PCL::PARSE-SPECIALIZERS ++ PCL::UNENCAPSULATED-FDEFINITION PCL::INTERN-EQL-SPECIALIZER ++ PCL::ECD-OTHER-INITARGS SYSTEM::%STRUCTURE-NAME ++ PCL::UPDATE-PV-TABLE-CACHE-INFO PCL::DEFAULT-STRUCTURE-TYPE ++ WALKER::VARIABLE-GLOBALLY-SPECIAL-P PCL::INITIALIZE-INFO-P ++ PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES PCL::COUNT-DFUN ++ PCL::ONE-CLASS-INDEX PCL::ONE-INDEX-DFUN-INFO-P ++ PCL::ARG-INFO-LAMBDA-LIST PCL::DNET-METHODS-P ++ PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION ++ PCL::ARG-INFO-METATYPES PCL::UNDEFMETHOD-1 ++ WALKER::ENV-WALK-FORM PCL::INITIALIZE-INFO-CACHED-VALID-P ++ PCL::STRUCTURE-SVUC-METHOD ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::EVAL-FORM PCL::DEFAULT-CONSTANTP PCL::SLOT-BOUNDP-SYMBOL ++ PCL::MAKE-FUNCTION-INLINE PCL::CHECK-WRAPPER-VALIDITY ++ PCL::COMPUTE-LINE-SIZE PCL::STRUCTURE-SLOT-BOUNDP ++ PCL::DEFAULT-METHOD-ONLY-CACHE PCL::GF-DFUN-CACHE ++ PCL::MAKE-CALLS-TYPE-DECLARATION PCL::INITIAL-P ++ PCL::ACCESSOR-DFUN-INFO-CACHE PCL::EARLY-CLASS-SLOTS ++ PCL::COMPUTE-STD-CPL-PHASE-2 PCL::STRUCTURE-SLOTD-NAME ++ PCL::BOOTSTRAP-CLASS-PREDICATES PCL::EARLY-METHOD-QUALIFIERS ++ WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE ++ PCL::MAKE-CONSTANT-FUNCTION PCL::CPD-SUPERS ++ PCL::INITIAL-DISPATCH-P PCL::METHOD-FUNCTION-METHOD ++ PCL::MAP-ALL-GENERIC-FUNCTIONS ++ PCL::STRUCTURE-SLOTD-READER-FUNCTION ++ PCL::MAKE-PERMUTATION-VECTOR PCL::DISPATCH-P PCL::CHECKING-P ++ PCL::CHECKING-FUNCTION PCL::FGEN-GENERATOR ++ PCL::ARG-INFO-NUMBER-OPTIONAL PCL::EXTRACT-PARAMETERS ++ ITERATE::VARIABLES-FROM-LET PCL::STRUCTURE-TYPE-P ++ PCL::ONE-INDEX-INDEX PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 ++ PCL::TWO-CLASS-CACHE PCL::RESET-CLASS-INITIALIZE-INFO ++ PCL::GET-SETF-FUNCTION-NAME PCL::ARG-INFO-PRECEDENCE ++ PCL::INITIALIZE-INFO-CACHED-CONSTANTS ++ PCL::FUNCALLABLE-INSTANCE-P PCL::%FBOUNDP ++ COMMON-LISP::CLASS-OF PCL::EARLY-CLASS-DEFINITION ++ PCL::SORT-CALLS PCL::%CCLOSURE-ENV PCL::ACCESSOR-DFUN-INFO-P ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION ++ PCL::WRAPPER-FIELD PCL::STRUCTURE-SLOTD-INIT-FORM ++ PCL::CACHING-CACHE PCL::CHECK-CACHE PCL::TWO-CLASS-P ++ PCL::ECD-SOURCE PCL::EARLY-METHOD-STANDARD-ACCESSOR-P ++ PCL::TYPE-CLASS PCL::ECD-METACLASS ++ PCL::CONSTANT-VALUE-DFUN-INFO PCL::%STD-INSTANCE-WRAPPER ++ PCL::RESET-CLASS-INITIALIZE-INFO-1 ++ PCL::EARLY-COLLECT-DEFAULT-INITARGS PCL::COMPUTE-CLASS-SLOTS ++ PCL::UNPARSE-SPECIALIZERS PCL::CONSTANT-VALUE-CACHE ++ PCL::EARLY-COLLECT-CPL PCL::EXPAND-LONG-DEFCOMBIN ++ PCL::FUNCTION-RETURNING-T PCL::GET-BUILT-IN-CLASS-SYMBOL ++ PCL::FAST-METHOD-CALL-ARG-INFO PCL::SHOW-DFUN-COSTS ++ PCL::CANONICAL-SLOT-NAME PCL::ARG-INFO-APPLYP PCL::ONE-CLASS-P ++ PCL::FORMAT-CYCLE-REASONS PCL::STRUCTURE-TYPE ++ PCL::USE-CACHING-DFUN-P PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME ++ PCL::DFUN-INFO-P PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL ++ PCL::ECD-CANONICAL-SLOTS PCL::GET-PV-CELL-FOR-CLASS ++ PCL::ECD-CLASS-NAME PCL::SFUN-P PCL::EARLY-GF-NAME ++ PCL::DISPATCH-CACHE PCL::NO-METHODS-CACHE PCL::CCLOSUREP ++ PCL::ARG-INFO-VALID-P PCL::CACHING-DFUN-INFO ++ PCL::GET-MAKE-INSTANCE-FUNCTIONS PCL::SYMBOL-PKG-NAME ++ PCL::ARG-INFO-KEYWORDS PCL::UPDATE-C-A-M-GF-INFO ++ PCL::COPY-CACHE PCL::INITIALIZE-INFO-KEY PCL::CHECKING-CACHE ++ PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME ++ PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P ++ PCL::MAKE-PV-TYPE-DECLARATION PCL::STRUCTURE-OBJECT-P ++ PCL::STRUCTURE-SLOTD-WRITER-FUNCTION PCL::UPDATE-GF-INFO ++ PCL::WRAPPER-FOR-STRUCTURE PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE ++ PCL::CACHING-DFUN-COST PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE ++ PCL::DEFAULT-STRUCTURE-INSTANCE-P PCL::FREE-CACHE-VECTOR ++ PCL::GFS-OF-TYPE PCL::MAKE-CALL-METHODS ++ WALKER::GET-WALKER-TEMPLATE ++ PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION PCL::METHOD-CALL-P ++ ITERATE::SEQUENCE-ACCESSOR PCL::METHOD-LL->GENERIC-FUNCTION-LL ++ PCL::SLOT-WRITER-SYMBOL PCL::NEXT-WRAPPER-FIELD ++ PCL::DEFAULT-METHOD-ONLY-P ++ PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE PCL::TWO-CLASS-WRAPPER0 ++ PCL::WRAPPER-OF PCL::STD-INSTANCE-P PCL::GET-CACHE-VECTOR ++ PCL::EARLY-CLASS-DIRECT-SUBCLASSES PCL::FAST-METHOD-CALL-P ++ PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION ++ PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST PCL::N-N-P ++ PCL::TWO-CLASS-WRAPPER1 PCL::DEFAULT-CONSTANT-CONVERTER ++ PCL::ONE-INDEX-ACCESSOR-TYPE PCL::CONSTANT-VALUE-P ++ PCL::CPD-CLASS PCL::ARG-INFO-NKEYS PCL::GMAKUNBOUND ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::INITIAL-DISPATCH-CACHE PCL::GENERIC-CLOBBERS-FUNCTION ++ PCL::ECD-SUPERCLASS-NAMES PCL::LOOKUP-FGEN ++ PCL::FLUSH-CACHE-VECTOR-INTERNAL ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION ++ PCL::GDEFINITION PCL::UPDATE-ALL-C-A-M-GF-INFO ++ PCL::FAST-INSTANCE-BOUNDP-P PCL::N-N-ACCESSOR-TYPE ++ PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST ++ WALKER::ENV-WALK-FUNCTION PCL::CPD-AFTER ++ PCL::METHOD-FUNCTION-PLIST PCL::ONE-INDEX-DFUN-INFO-INDEX ++ PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL ++ PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P ++ PCL::FREE-CACHE SYSTEM::%COMPILED-FUNCTION-NAME ++ PCL::MAKE-INITFUNCTION PCL::SORT-SLOTS PCL::KEYWORD-SPEC-NAME ++ PCL::GF-DFUN-INFO PCL::DEFAULT-STRUCTUREP ++ PCL::LIST-LARGE-CACHE PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS ++ PCL::N-N-CACHE PCL::INTERNED-SYMBOL-P PCL::ONE-INDEX-P ++ PCL::NET-TEST-CONVERTER WALKER::ENV-LOCK ++ PCL::EXTRACT-LAMBDA-LIST PCL::COMPUTE-MCASE-PARAMETERS ++ PCL::LEGAL-CLASS-NAME-P PCL::GF-INFO-FAST-MF-P ++ PCL::ALLOCATE-CACHE-VECTOR PCL::ONE-CLASS-WRAPPER0 ++ PCL::EARLY-METHOD-LAMBDA-LIST ++ PCL::METHOD-CALL-CALL-METHOD-ARGS PCL::GBOUNDP ++ PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS PCL::SLOT-READER-SYMBOL ++ PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME PCL::CACHE-P ++ PCL::MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::MAKE-PV-TABLE-TYPE-DECLARATION ++ PCL::ONE-INDEX-DFUN-INFO-CACHE ++ PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION ++ PCL::MAKE-CLASS-EQ-PREDICATE PCL::%SYMBOL-FUNCTION ++ PCL::SLOT-VECTOR-SYMBOL PCL::MAKE-EQL-PREDICATE ++ PCL::CLASS-PREDICATE ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION ++ PCL::ONE-INDEX-CACHE PCL::EARLY-CLASS-PRECEDENCE-LIST ++ PCL::STANDARD-SVUC-METHOD PCL::EARLY-CLASS-NAME ++ PCL::INITIALIZE-INFO-WRAPPER ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS ++ PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE ++ PCL::EXPAND-MAKE-INSTANCE-FORM ++ PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P PCL::CONSTANT-SYMBOL-P ++ PCL::CACHE-OWNER PCL::FGEN-GENSYMS PCL::EARLY-COLLECT-SLOTS ++ PCL::FGEN-GENERATOR-LAMBDA ++ PCL::COMPLICATED-INSTANCE-CREATION-METHOD ++ PCL::RESET-INITIALIZE-INFO PCL::TWO-CLASS-ACCESSOR-TYPE ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P ++ PCL::EARLY-METHOD-CLASS PCL::METHOD-FUNCTION-PV-TABLE ++ PCL::LIST-DFUN PCL::INITIAL-CACHE PCL::PV-TABLEP ++ PCL::GF-INFO-C-A-M-EMF-STD-P PCL::DFUN-ARG-SYMBOL ++ PCL::GET-BUILT-IN-WRAPPER-SYMBOL ++ PCL::UPDATE-CLASS-CAN-PRECEDE-P PCL::TWO-CLASS-INDEX ++ PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS PCL::FGEN-TEST ++ PCL::FUNCTION-RETURNING-NIL PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P ++ PCL::INITIALIZE-INFO-BOUND-SLOTS PCL::ARG-INFO-P ++ PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST ++ PCL::CLASS-FROM-TYPE WALKER::ENV-LEXICAL-VARIABLES ++ PCL::DFUN-INFO-CACHE PCL::INTERN-FUNCTION-NAME ++ PCL::EARLY-SLOT-DEFINITION-LOCATION PCL::CACHING-P ++ PCL::NO-METHODS-P PCL::ARG-INFO-KEY/REST-P PCL::GF-LAMBDA-LIST ++ PCL::EXTRACT-SPECIALIZER-NAMES PCL::EXPAND-SHORT-DEFCOMBIN ++ PCL::STORE-FGEN PCL::BUILT-IN-WRAPPER-OF ++ PCL::INITIALIZE-INFO-CACHED-NEW-KEYS PCL::EARLY-CLASS-SLOTDS ++ PCL::FORCE-CACHE-FLUSHES PCL::EARLY-GF-P ++ PCL::STRUCTURE-SLOTD-TYPE ++ PCL::INITIALIZE-INFO-CACHED-RI-VALID-P ++ PCL::ONE-CLASS-ACCESSOR-TYPE ++ PCL::CLASS-PRECEDENCE-DESCRIPTION-P WALKER::ENV-DECLARATIONS ++ PCL::EARLY-SLOT-DEFINITION-NAME PCL::FAST-METHOD-CALL-PV-CELL ++ PCL::%STD-INSTANCE-SLOTS PCL::EXTRACT-REQUIRED-PARAMETERS ++ PCL::EARLY-CLASS-NAME-OF PCL::DEFAULT-TEST-CONVERTER ++ PCL::FUNCTION-PRETTY-ARGLIST)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::MAKE-PROGN ++ COMMON-LISP::METHOD-COMBINATION-ERROR PCL::UNTRACE-METHOD ++ PCL::LIST-LARGE-CACHES PCL::FIX-EARLY-GENERIC-FUNCTIONS ++ COMMON-LISP::INVALID-METHOD-ERROR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) ++ (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) + COMMON-LISP::T) +- PCL::COMPUTE-STD-CPL-PHASE-3)) ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION ++ PCL::GET-CACHE-FROM-CACHE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::FIXNUM) +- COMMON-LISP::T) +- PCL::FILL-CACHE-FROM-CACHE-P PCL::GET-CACHE)) ++ (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) +- PCL::GET-WRAPPER-CACHE-NUMBER)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 256)) ++ PCL::CACHE-LINE-SIZE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) +- PCL::METHOD-CALL-FUNCTION PCL::FAST-METHOD-CALL-FUNCTION +- PCL::CACHE-LIMIT-FN)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 255)) ++ PCL::CACHE-NKEYS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) ++ PCL::CACHE-FIELD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- PCL::MEC-ALL-CLASS-LISTS PCL::REMOVE-SLOT-ACCESSORS +- PCL::PARSE-GSPEC PCL::STANDARD-INSTANCE-ACCESS +- PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER +- PCL::UPDATE-STD-OR-STR-METHODS PCL::CLASS-MIGHT-PRECEDE-P +- PCL::ACCESSOR-SET-SLOT-VALUE PCL::DOPLIST +- PCL::ADD-SLOT-ACCESSORS PCL::DFUN-MISS +- PCL::FSC-INSTANCE-WRAPPER PCL::CLASS-EQ-TEST +- PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION +- PCL::MAKE-EARLY-ACCESSOR WALKER::ENVIRONMENT-MACRO +- PCL::WITH-DFUN-WRAPPERS PCL::WRAPPER-STATE +- PCL::DFUN-INFO-WRAPPER0 +- WALKER::WITH-NEW-DEFINITION-IN-ENVIRONMENT PCL::IF* +- PCL::CHECK-WRAPPER-VALIDITY1 +- PCL::INITIALIZE-INFO-MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::BUILT-IN-OR-STRUCTURE-WRAPPER +- PCL::FIND-CLASS-CELL-PREDICATE PCL::CLASS-CAN-PRECEDE-P +- COMMON-LISP::CALL-METHOD PCL::NET-CONSTANT-CONVERTER +- PCL::UPDATE-INITIALIZE-INFO-INTERNAL +- PCL::GET-CACHE-VECTOR-LOCK-COUNT PCL::UNDEFMETHOD +- PCL::%SET-SVREF PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS +- PCL::WRAPPER-NO-OF-INSTANCE-SLOTS PCL::CACHE-VECTOR-LOCK-COUNT +- WALKER::VARIABLE-LEXICAL-P PCL::FIN-LAMBDA-FN +- PCL::INITIAL-CLASSES-AND-WRAPPERS PCL::MLOOKUP +- PCL::RAISE-METATYPE ITERATE::WHILE PCL::EARLY-GF-ARG-INFO +- PCL::INVALID-WRAPPER-P WALKER::VARIABLE-SPECIAL-P +- PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRECOMPILED +- PCL::INSTANCE-WRITE-INTERNAL WALKER::WALK-REPEAT-EVAL +- WALKER::GET-WALKER-TEMPLATE-INTERNAL ITERATE::PLIST-ELEMENTS +- PCL::MAKE-FIND-CLASS-CELL COMMON-LISP::WITH-ACCESSORS +- PCL::MAKE-METHOD-FUNCTION PCL::SIMPLE-LEXICAL-METHOD-FUNCTIONS +- PCL::CANONICALIZE-DEFCLASS-OPTION PCL::UPDATE-INITS PCL::SCASE +- PCL::INSTANCE-BOUNDP-INTERNAL PCL::FMC-FUNCALL +- PCL::SET-METHODS PCL::CACHE-LOCK-COUNT PCL::GET-WRAPPER +- PCL::INVOKE-METHOD-CALL1 PCL::MAKE-CLASS-PREDICATE +- PCL::PRINTING-RANDOM-THING PCL::UPDATE-SLOTS +- PCL::FUNCTION-APPLY PCL::AUGMENT-TYPE ITERATE::WITH-GATHERING +- PCL::CHECKING-DFUN-INFO PCL::LIST-EQ PCL::CACHE-VECTOR-SIZE +- PCL::DESCRIBE-PACKAGE PCL::WRAPPER-REF PCL::PLIST-VALUE +- PCL::%INSTANCE-REF WALKER::NOTE-DECLARATION +- PCL::MAKE-STD-READER-METHOD-FUNCTION +- PCL::EMIT-READER/WRITER-MACRO WALKER::ENVIRONMENT-FUNCTION +- PCL::N-N-DFUN-INFO +- PCL::FIND-CLASS-CELL-MAKE-INSTANCE-FUNCTION-KEYS +- PCL::DEFCONSTRUCTOR PCL::INSTANCE-SLOT-INDEX +- PCL::CLASS-NO-OF-INSTANCE-SLOTS ITERATE::ELEMENTS +- PCL::NEXT-WRAPPER-CACHE-NUMBER-INDEX +- PCL::INITIALIZE-INFO-COMBINED-INITARGS-FORM-LIST +- COMMON-LISP::DEFINE-METHOD-COMBINATION PCL::MDOTIMES +- PCL::REMOVE-DIRECT-SUBCLASSES PCL::MAKE-WRAPPER-INTERNAL +- ITERATE::MAXIMIZING PCL::PV-OFFSET +- PCL::DEAL-WITH-ARGUMENTS-OPTION PCL::INSTANCE-READER +- PCL::ALLOCATE-STANDARD-INSTANCE--MACRO PCL::DEFINE-INLINES +- PCL::WRAPPER-CACHE-NUMBER-VECTOR PCL::GATHERING1 +- PCL::FIND-CLASS-CELL-CLASS PCL::SWAP-WRAPPERS-AND-SLOTS +- PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION PCL::PV-TABLE-LOOKUP +- PCL::WRAPPER-INSTANCE-SLOTS-LAYOUT +- WALKER::WALKER-ENVIRONMENT-BIND PCL::COPY-SLOTS PCL::MCASE +- PCL::ADD-TO-CVECTOR PCL::ADD-DIRECT-SUBCLASSES +- PCL::%SET-CCLOSURE-ENV PCL::PRECOMPILE-RANDOM-CODE-SEGMENTS +- PCL::UPDATE-CLASS PCL::SLOT-SYMBOL PCL::VALUE-FOR-CACHING +- PCL::EXPANDING-MAKE-INSTANCE-TOP-LEVEL PCL::REMTAIL +- PCL::MAKE-DISCRIMINATING-FUNCTION-ARGLIST +- PCL::CLASSES-HAVE-COMMON-SUBCLASS-P +- PCL::FIRST-WRAPPER-CACHE-NUMBER-INDEX +- PCL::INITIALIZE-INFO-INITARGS-FORM-LIST ++ PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST PCL::MODIFY-CACHE ++ PCL::CHECKING-DFUN-INFO WALKER::WALKER-ENVIRONMENT-BIND ++ PCL::INITIALIZE-INFO-COMBINED-INITIALIZE-FUNCTION ++ PCL::CACHE-LOCK-COUNT PCL::MAKE-PV-TABLE-INTERNAL ++ PCL::FIND-CLASS-CELL-CLASS PCL::MAKE-DFUN-LAMBDA-LIST ++ PCL::WRAPPER-REF PCL::SIMPLE-LEXICAL-METHOD-FUNCTIONS ++ PCL::INITIAL-CLASSES-AND-WRAPPERS PCL::UPDATE-SLOTS PCL::ASSQ ++ PCL::ADD-DIRECT-SUBCLASSES PCL::SAUT-NOT-CLASS-EQ ++ PCL::CHECK-MEMBER PCL::FIN-LAMBDA-FN PCL::INSTANCE-SLOT-INDEX ++ PCL::SAUT-NOT-CLASS WALKER::VARIABLE-SYMBOL-MACRO-P ++ COMMON-LISP::SYMBOL-MACROLET PCL::PV-TABLE-LOOKUP ++ PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION PCL::MCASE ++ PCL::PRINTING-RANDOM-THING PCL::MAYBE-CHECK-CACHE ++ WALKER::WITH-NEW-DEFINITION-IN-ENVIRONMENT + PCL::WITH-MAKE-INSTANCE-FUNCTION-VALID-P-CHECK +- PCL::FUNCALLABLE-INSTANCE-DATA-1 PCL::SAUT-NOT-EQL +- PCL::EARLY-GF-METHODS ITERATE::EXTRACT-SPECIAL-BINDINGS +- PCL::MEMQ PCL::DFUN-UPDATE +- PCL::MAKE-CHECKING-OR-CACHING-FUNCTION-LIST PCL::ONCE-ONLY +- PCL::GET-INSTANCE-WRAPPER-OR-NIL PCL::SYMBOL-LESSP +- PCL::|SETF PCL FIND-CLASS| PCL::PARSE-QUALIFIER-PATTERN +- ITERATE::SIMPLE-EXPAND-ITERATE-FORM +- PCL::INITIALIZE-INFO-SHARED-INITIALIZE-T-FUNCTION ++ PCL::WRAPPER-CLASS* PCL::FSC-INSTANCE-WRAPPER ++ PCL::FUNCALLABLE-INSTANCE-DATA-1 ++ PCL::|SETF PCL METHOD-FUNCTION-PLIST| ++ PCL::DEFINE-INITIALIZE-INFO ITERATE::LIST-ELEMENTS ++ PCL::INSTANCE-READ PCL::EMIT-1-NIL-DLAP + PCL::RESET-INITIALIZE-INFO-INTERNAL +- PCL::INITIALIZE-INFO-DEFAULT-INITARGS-FUNCTION +- PCL::DESTRUCTURE-INTERNAL PCL::DFUN-INFO-INDEX +- PCL::PRECOMPILE-IIS-FUNCTIONS PCL::INSTANCE-WRITE +- COMMON-LISP::DEFCLASS PCL::UPDATE-ALL-PV-TABLE-CACHES +- PCL::WRAPPER-CACHE-NUMBER-VECTOR-REF +- PCL::INITIALIZE-INFO-COMBINED-INITIALIZE-FUNCTION +- PCL::MODIFY-CACHE PCL::BOOTSTRAP-SLOT-INDEX +- PCL::SET-FUNCTION-PRETTY-ARGLIST PCL::COMPUTE-LAYOUT +- PCL::CALL-METHOD-LIST PCL::GET-KEY-ARG ITERATE::LIST-TAILS +- PCL::INITIALIZE-INFO-MAKE-INSTANCE-FUNCTION ITERATE::EACHTIME +- PCL::INSTANCE-REF PCL::WITH-EQ-HASH-TABLE +- PCL::QUALIFIER-CHECK-RUNTIME PCL::CALLSREF ITERATE::MV-SETQ +- PCL::PRINTING-RANDOM-THING-INTERNAL PCL::CHECK-MEMBER +- PCL::INSTANCE-WRITER PCL::CANONICALIZE-SLOT-SPECIFICATION +- PCL::BIND-LEXICAL-METHOD-FUNCTIONS ITERATE::LIST-ELEMENTS +- PCL::INVOKE-EFFECTIVE-METHOD-FUNCTION-FAST +- PCL::INVOKE-METHOD-CALL PCL::INITIALIZE-INFO-RI-VALID-P +- PCL::SET-WRAPPER PCL::STD-INSTANCE-CLASS +- PCL::EXPANDING-MAKE-INSTANCE PCL::BIND-ARGS +- PCL::INITIALIZE-INFO-VALID-P PCL::STD-INSTANCE-WRAPPER +- PCL::FSC-INSTANCE-SLOTS PCL::REAL-ENSURE-GF-INTERNAL PCL::NEQ +- PCL::PRECOMPILE-DFUN-CONSTRUCTORS PCL::MAKE-DLAP-LAMBDA-LIST +- PCL::FIND-SLOT-DEFINITION ++ PCL::QUALIFIER-CHECK-RUNTIME PCL::STD-INSTANCE-CLASS ++ PCL::EMIT-READER/WRITER-MACRO PCL::UNDEFMETHOD PCL::SCASE ++ PCL::EMIT-DEFAULT-ONLY-MACRO PCL::INSTANCE-WRITE ++ PCL::PV-BINDING PCL::DELQ PCL::FIND-STANDARD-II-METHOD ++ PCL::ACCESSOR-SLOT-VALUE PCL::SET-STANDARD-SVUC-METHOD ++ ITERATE::JOINING PCL::COMPUTE-STD-CPL ++ PCL::PCL-DESTRUCTURING-BIND PCL::FIND-CLASS-CELL-PREDICATE ++ PCL::UPDATE-STD-OR-STR-METHODS PCL::EARLY-GF-ARG-INFO ++ PCL::PRECOMPILE-DFUN-CONSTRUCTORS PCL::FUNCTION-FUNCALL ++ PCL::DFUN-INFO-FUNCTION PCL::CALLSREF ++ PCL::UPDATE-ALL-PV-TABLE-CACHES PCL::RASSQ ++ PCL::REMOVE-DIRECT-SUBCLASSES PCL::MEC-ALL-CLASS-LISTS ++ PCL::FUNCALLABLE-STANDARD-INSTANCE-ACCESS ITERATE::SUMMING ++ PCL::SET-METHODS PCL::WITH-HASH-TABLE ++ PCL::INITIALIZE-INFO-SHARED-INITIALIZE-NIL-FUNCTION ++ PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS ++ PCL::METHOD-FUNCTION-RETURNING-NIL PCL::WRAPPER-STATE ++ PCL::WITH-LOCAL-CACHE-FUNCTIONS PCL::DFUN-INFO-ACCESSOR-TYPE ++ PCL::CHECK-WRAPPER-VALIDITY1 PCL::INVALID-WRAPPER-P ++ PCL::INSTANCE-BOUNDP COMMON-LISP::DEFINE-METHOD-COMBINATION ++ PCL::DO-SATISFIES-DEFTYPE PCL::EQL-TEST ++ PCL::PRECOMPILE-IIS-FUNCTIONS ++ PCL::PRINTING-RANDOM-THING-INTERNAL ++ PCL::UPDATE-INITIALIZE-INFO-INTERNAL ITERATE::WITH-GATHERING ++ PCL::BOOTSTRAP-GET-SLOT PCL::INITIALIZE-INFO-CONSTANTS ++ PCL::GET-INSTANCE-WRAPPER-OR-NIL ++ PCL::BIND-LEXICAL-METHOD-FUNCTIONS PCL::VECTORIZING ++ PCL::N-N-DFUN-INFO PCL::INSTANCE-ACCESSOR-PARAMETER PCL::IF* ++ PCL::PV-OFFSET PCL::GET-SLOTS PCL::CACHE-NUMBER-VECTOR-REF ++ PCL::ALLOCATE-STANDARD-INSTANCE--MACRO ITERATE::MINIMIZING ++ PCL::%SET-CCLOSURE-ENV ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-SLOTS ++ WALKER::DEFINE-WALKER-TEMPLATE COMMON-LISP::WITH-ACCESSORS ++ PCL::MAKE-CDXR COMMON-LISP::DEFMETHOD PCL::SYMBOL-LESSP ++ PCL::INVOKE-FAST-METHOD-CALL + PCL::BIND-SIMPLE-LEXICAL-METHOD-MACROS +- PCL::ACCESSOR-SLOT-VALUE PCL::METHOD-FUNCTION-RETURNING-NIL +- PCL::MAKE-DFUN-LAMBDA-LIST WALKER::VARIABLE-SYMBOL-MACRO-P +- PCL::DFUN-INFO-FUNCTION COMMON-LISP::WITH-SLOTS +- PCL::FUNCTION-FUNCALL PCL::EQL-TEST +- PCL::INITIALIZE-INFO-CONSTANTS PCL::POSQ PCL::DOLIST-CAREFULLY +- PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-MACRO PCL::MAKE-CAXR +- ITERATE::ITERATE PCL::DEFINE-INITIALIZE-INFO PCL::ALIST-ENTRY +- PCL::WITH-LOCAL-CACHE-FUNCTIONS PCL::WRAPPER-OF-MACRO +- PCL::RASSQ PCL::SUPERCLASSES-COMPATIBLE-P +- PCL::METHOD-FUNCTION-RETURNING-T PCL::CHANGE-CLASS-INTERNAL +- PCL::PRECOMPILE-FUNCTION-GENERATORS +- WALKER::DEFINE-WALKER-TEMPLATE PCL::CACHE-VECTOR-REF +- PCL::GET-SLOTS PCL::MEC-ALL-CLASSES-INTERNAL +- COMMON-LISP::SLOT-EXISTS-P PCL::WITHOUT-INTERRUPTS +- PCL::MAKE-UNORDERED-METHODS-EMF PCL::GET-KEY-ARG1 +- PCL::MAKE-STD-WRITER-METHOD-FUNCTION PCL::COMPUTE-CONSTANTS +- PCL::BOOTSTRAP-GET-SLOT PCL::DEFINE-GF-PREDICATE ++ PCL::CANONICALIZE-DEFCLASS-OPTION PCL::DESCRIBE-PACKAGE ++ PCL::%SET-SVREF PCL::FSC-INSTANCE-P PCL::MAKE-DFUN-ARG-LIST ++ PCL::GET-SLOTS-OR-NIL PCL::WRAPPER-INSTANCE-SLOTS-LAYOUT ++ PCL::DO-STANDARD-DEFSETF PCL::STD-INSTANCE-SLOTS ++ PCL::INVOKE-METHOD-CALL1 PCL::PARSE-GSPEC ++ PCL::ACCESSOR-SET-SLOT-VALUE PCL::DEFINE-CACHED-READER ++ PCL::INITIALIZE-INFO-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::SET-WRAPPER PCL::SAUT-NOT-PROTOTYPE ++ PCL::MAKE-CLASS-PREDICATE ++ PCL::FIRST-WRAPPER-CACHE-NUMBER-INDEX PCL::MDOTIMES ++ PCL::FUNCTION-APPLY PCL::UPDATE-CLASS PCL::GET-KEY-ARG1 ++ WALKER::ENVIRONMENT-FUNCTION PCL::DOPLIST ++ PCL::WRAPPER-CLASS-SLOTS PCL::FMC-FUNCALL ++ WALKER::VARIABLE-LEXICAL-P COMMON-LISP::ADD-METHOD ++ PCL::INSTANCE-READER ITERATE::EACHTIME ++ PCL::CLASSES-HAVE-COMMON-SUBCLASS-P ++ PCL::INITIALIZE-INFO-INITARGS-FORM-LIST ++ PCL::REMOVE-SLOT-ACCESSORS PCL::DEFINE-GF-PREDICATE ++ PCL::CHANGE-CLASS-INTERNAL PCL::INVOKE-METHOD-CALL ++ PCL::PARSE-QUALIFIER-PATTERN COMMON-LISP::CALL-METHOD ++ PCL::IIS-BODY PCL::NO-SLOT PCL::WRAPPER-NO-OF-INSTANCE-SLOTS ++ PCL::SET-FUNCTION-PRETTY-ARGLIST PCL::INSTANCE-WRITE-INTERNAL ++ PCL::MEMQ PCL::MAP-PV-TABLE-REFERENCES-OF ++ PCL::|SETF PCL FIND-CLASS| COMMON-LISP::SLOT-EXISTS-P ++ PCL::WITH-DFUN-WRAPPERS PCL::CLASS-MIGHT-PRECEDE-P ++ PCL::BOOTSTRAP-SLOT-INDEX PCL::MEC-ALL-CLASSES-INTERNAL ++ PCL::%SVREF PCL::INITIALIZE-INFO-DEFAULT-INITARGS-FUNCTION ++ ITERATE::COLLECTING PCL::MAKE-FIND-CLASS-CELL PCL::COMPUTE-PV ++ PCL::SUPERCLASSES-COMPATIBLE-P + PCL::REDIRECT-EARLY-FUNCTION-INTERNAL +- PCL::SET-STRUCTURE-SVUC-METHOD PCL::WRAPPER-CLASS +- ITERATE::UNTIL PCL::PV-BINDING1 PCL::UPDATE-CPL PCL::PV-ENV +- PCL::PV-BINDING PCL::INSTANCE-READ-INTERNAL +- COMMON-LISP::DEFGENERIC ITERATE::COLLECTING +- WALKER::NOTE-LEXICAL-BINDING PCL::ORIGINAL-DEFINITION +- PCL::COLLECTING-ONCE PCL::GET-SLOTS-OR-NIL PCL::TRACE-EMF-CALL +- PCL::WITH-HASH-TABLE PCL::FUNCALLABLE-INSTANCE-MARKER +- PCL::INITIALIZE-INFO-NEW-KEYS PCL::STD-INSTANCE-SLOTS +- PCL::ACCESSOR-SLOT-BOUNDP PCL::SAUT-NOT-PROTOTYPE +- PCL::MAP-PV-TABLE-REFERENCES-OF COMMON-LISP::ADD-METHOD +- PCL::MAKE-CDXR PCL::CALL-INITIALIZE-FUNCTION PCL::ASV-FUNCALL +- PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION PCL::IIS-BODY +- COMMON-LISP::DEFMETHOD PCL::SYMBOL-OR-CONS-LESSP +- PCL::SAUT-NOT-CLASS-EQ PCL::METHODS-CONVERTER PCL::PVREF ++ WALKER::WITH-AUGMENTED-ENVIRONMENT PCL::WITHOUT-INTERRUPTS ++ PCL::CACHE-VECTOR-LOCK-COUNT ++ SYSTEM::%SET-COMPILED-FUNCTION-NAME PCL::MAKE-WRAPPER-INTERNAL ++ PCL::ASV-FUNCALL PCL::FUNCALLABLE-INSTANCE-DATA-POSITION ++ PCL::WRAPPER-CLASS PCL::DFUN-INFO-WRAPPER1 ITERATE::LIST-TAILS + PCL::EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- PCL::EMIT-CHECKING-OR-CACHING-MACRO ITERATE::SUMMING +- PCL::|SETF PCL GDEFINITION| PCL::ESETF PCL::COPY-PV +- PCL::WRAPPER-CLASS* COMMON-LISP::REMOVE-METHOD ++ PCL::DEFCONSTRUCTOR PCL::MAKE-METHOD-FUNCTION ++ PCL::VALUE-FOR-CACHING PCL::INITIALIZE-INFO-VALID-P ++ PCL::MAKE-DLAP-LAMBDA-LIST PCL::GET-WRAPPER PCL::*LIST-TAILS ++ PCL::UPDATE-CPL PCL::SET-STRUCTURE-SVUC-METHOD PCL::POSQ ++ PCL::SYMBOL-OR-CONS-LESSP PCL::FSC-INSTANCE-SLOTS ++ PCL::ADD-TO-CVECTOR PCL::AUGMENT-TYPE PCL::DFUN-MISS ++ PCL::INVOKE-EFFECTIVE-METHOD-FUNCTION-FAST PCL::ALIST-ENTRY ++ PCL::MEMF-CONSTANT-CONVERTER PCL::PROCLAIM-DEFGENERIC ++ WALKER::NOTE-LEXICAL-BINDING PCL::WRAPPER-OF-MACRO ++ ITERATE::MAXIMIZING ITERATE::ELEMENTS ++ PCL::EXPANDING-MAKE-INSTANCE ++ PCL::INITIALIZE-INFO-COMBINED-INITARGS-FORM-LIST ++ ITERATE::ITERATE PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION ++ WALKER::WALK-REPEAT-EVAL PCL::%INSTANCE-REF ++ PCL::INSTANCE-READ-INTERNAL PCL::DFUN-INFO-INDEX ++ ITERATE::GATHERING PCL::NEQ PCL::FIND-SLOT-DEFINITION ++ PCL::STD-INSTANCE-WRAPPER ++ PCL::%ALLOCATE-STATIC-SLOT-STORAGE--CLASS PCL::MEC-ALL-CLASSES ++ PCL::PVREF PCL::DESTRUCTURE-INTERNAL PCL::CALL-METHOD-LIST ++ PCL::STANDARD-INSTANCE-ACCESS ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-MACRO ++ PCL::WITH-EQ-HASH-TABLE PCL::LIST-EQ ++ WALKER::VARIABLE-SPECIAL-P PCL::SLOT-SYMBOL ++ PCL::EARLY-GF-METHODS COMMON-LISP::REMOVE-METHOD ++ PCL::INITIALIZE-INFO-MAKE-INSTANCE-FUNCTION PCL::COPY-PV ++ PCL::CALL-INITIALIZE-FUNCTION ITERATE::MV-SETQ ++ PCL::DFUN-INFO-WRAPPER0 PCL::METHOD-FUNCTION-RETURNING-T ++ PCL::EMIT-CHECKING-OR-CACHING-MACRO ++ PCL::PRECOMPILE-FUNCTION-GENERATORS PCL::MAKE-PLIST ++ PCL::COMPUTE-LAYOUT PCL::EXPANDING-MAKE-INSTANCE-TOP-LEVEL ++ PCL::DOLIST-CAREFULLY PCL::ACCESSOR-SLOT-BOUNDP ++ PCL::INITIALIZE-INFO-RI-VALID-P PCL::PV-BINDING1 ++ PCL::CANONICALIZE-SLOT-SPECIFICATION ++ PCL::REAL-ENSURE-GF-INTERNAL PCL::COPY-INSTANCE-INTERNAL ++ PCL::REMTAIL ITERATE::PLIST-ELEMENTS ++ PCL::INSTANCE-BOUNDP-INTERNAL PCL::COLLECTING-ONCE ++ PCL::CACHE-VECTOR-REF PCL::INSTANCE-REF PCL::MAKE-CAXR ++ PCL::ADD-FORMS PCL::CLASS-NO-OF-INSTANCE-SLOTS + PCL::|SETF PCL FIND-CLASS-PREDICATE| +- PCL::ACCESSOR-MISS-FUNCTION PCL::MEMF-CONSTANT-CONVERTER +- PCL::DELQ PCL::VECTORIZING PCL::MAKE-DFUN-ARG-LIST +- PCL::VARIABLE-CLASS PCL::INSTANCE-ACCESSOR-PARAMETER +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE-SLOTS +- PCL::EMIT-DEFAULT-ONLY-MACRO PCL::NO-SLOT +- PCL::MAYBE-CHECK-CACHE PCL::FUNCALLABLE-INSTANCE-DATA-POSITION +- PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST +- PCL::DO-STANDARD-DEFSETF PCL::SAUT-NOT-CLASS +- PCL::DFUN-INFO-ACCESSOR-TYPE PCL::DEFINE-CACHED-READER +- PCL::SET-STANDARD-SVUC-METHOD PCL::CLASS-TEST +- PCL::MAKE-PV-TABLE-INTERNAL PCL::PROCLAIM-DEFGENERIC +- PCL::GF-MAKE-FUNCTION-FROM-EMF PCL::COMPUTE-PV +- PCL::EMIT-1-NIL-DLAP PCL::FIND-STANDARD-II-METHOD +- PCL::BIND-FAST-LEXICAL-METHOD-MACROS PCL::DO-SATISFIES-DEFTYPE +- PCL::FAST-LEXICAL-METHOD-FUNCTIONS PCL::COMPUTE-CALLS +- PCL::COPY-INSTANCE-INTERNAL COMMON-LISP::SYMBOL-MACROLET +- PCL::FSC-INSTANCE-P PCL::MAKE-PLIST PCL::%SVREF +- PCL::PCL-DESTRUCTURING-BIND +- SYSTEM::%SET-COMPILED-FUNCTION-NAME ITERATE::JOINING +- ITERATE::MINIMIZING PCL::METHOD-FUNCTION-CLOSURE-GENERATOR +- PCL::PV-WRAPPERS-FROM-ALL-ARGS PCL::*LIST-ELEMENTS +- PCL::ADD-FORMS +- PCL::INITIALIZE-INFO-SHARED-INITIALIZE-NIL-FUNCTION +- ITERATE::INTERVAL PCL::INSTANCE-BOUNDP PCL::FSC-INSTANCE-CLASS +- WALKER::WITH-AUGMENTED-ENVIRONMENT +- PCL::CACHE-NUMBER-VECTOR-REF +- PCL::INVOKE-EFFECTIVE-METHOD-FUNCTION PCL::ASSQ ++ PCL::DEAL-WITH-ARGUMENTS-OPTION PCL::TRACE-EMF-CALL ++ PCL::COMPUTE-CALLS WALKER::ENVIRONMENT-MACRO ++ PCL::FSC-INSTANCE-CLASS PCL::ADD-SLOT-ACCESSORS ++ PCL::INSTANCE-WRITER PCL::SWAP-WRAPPERS-AND-SLOTS ++ PCL::GATHERING1 PCL::MAKE-DISCRIMINATING-FUNCTION-ARGLIST ++ PCL::BIND-ARGS PCL::MAKE-CHECKING-OR-CACHING-FUNCTION-LIST ++ PCL::UPDATE-INITS PCL::DFUN-UPDATE ITERATE::INTERVAL ++ PCL::COPY-SLOTS COMMON-LISP::DEFGENERIC ++ WALKER::GET-WALKER-TEMPLATE-INTERNAL PCL::CACHE-VECTOR-SIZE ++ PCL::VARIABLE-CLASS PCL::NEXT-WRAPPER-CACHE-NUMBER-INDEX ++ PCL::SAUT-NOT-EQL PCL::PV-WRAPPERS-FROM-ALL-ARGS ++ ITERATE::SIMPLE-EXPAND-ITERATE-FORM PCL::PLIST-VALUE ++ PCL::FUNCALLABLE-INSTANCE-MARKER ++ PCL::INVOKE-EFFECTIVE-METHOD-FUNCTION PCL::MAKE-EARLY-ACCESSOR ++ PCL::*LIST-ELEMENTS PCL::PROCLAIM-DEFMETHOD ++ PCL::|SETF PCL GDEFINITION| PCL::INITIALIZE-INFO-NEW-KEYS ++ COMMON-LISP::WITH-SLOTS PCL::ESETF PCL::CLASS-TEST ++ PCL::METHODS-CONVERTER PCL::FAST-LEXICAL-METHOD-FUNCTIONS ++ PCL::DEFINE-INLINES PCL::MLOOKUP PCL::CLASS-EQ-TEST ++ PCL::ONCE-ONLY PCL::CLASS-CAN-PRECEDE-P ++ WALKER::NOTE-DECLARATION PCL::WRAPPER-CACHE-NUMBER-VECTOR-REF ++ PCL::BUILT-IN-OR-STRUCTURE-WRAPPER ++ PCL::PRECOMPILE-RANDOM-CODE-SEGMENTS PCL::GET-KEY-ARG ++ COMMON-LISP::DEFCLASS PCL::ORIGINAL-DEFINITION + PCL::SET-FUNCALLABLE-INSTANCE-FUNCTION +- PCL::WRAPPER-CLASS-SLOTS PCL::MEC-ALL-CLASSES +- ITERATE::GATHERING PCL::INSTANCE-READ PCL::COMPUTE-STD-CPL +- PCL::PROCLAIM-DEFMETHOD +- PCL::%ALLOCATE-STATIC-SLOT-STORAGE--CLASS PCL::*LIST-TAILS +- PCL::|SETF PCL METHOD-FUNCTION-PLIST| +- PCL::FUNCALLABLE-STANDARD-INSTANCE-ACCESS +- PCL::DFUN-INFO-WRAPPER1 PCL::INVOKE-FAST-METHOD-CALL)) ++ PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER PCL::NET-CONSTANT-CONVERTER ++ PCL::RAISE-METATYPE PCL::METHOD-FUNCTION-CLOSURE-GENERATOR ++ PCL::FIND-CLASS-CELL-MAKE-INSTANCE-FUNCTION-KEYS ++ ITERATE::WHILE PCL::PV-ENV ITERATE::EXTRACT-SPECIAL-BINDINGS ++ ITERATE::UNTIL ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRECOMPILED ++ PCL::WRAPPER-CACHE-NUMBER-VECTOR ++ PCL::GET-CACHE-VECTOR-LOCK-COUNT ++ PCL::INITIALIZE-INFO-SHARED-INITIALIZE-T-FUNCTION ++ PCL::BIND-FAST-LEXICAL-METHOD-MACROS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- PCL::COMPILE-LAMBDA PCL::COERCE-TO-CLASS +- PCL::MAKE-METHOD-FUNCTION-INTERNAL +- PCL::MAKE-CONSTANT-VALUE-DFUN PCL::GET-FUNCTION ++ PCL::GET-DFUN-CONSTRUCTOR PCL::ALLOCATE-STRUCTURE-INSTANCE ++ PCL::COERCE-TO-CLASS WALKER::WALK-FORM ++ PCL::GET-METHOD-FUNCTION COMMON-LISP::ENSURE-GENERIC-FUNCTION ++ PCL::MAKE-SPECIALIZABLE PCL::PARSE-METHOD-OR-SPEC ++ PCL::COMPILE-LAMBDA WALKER::MACROEXPAND-ALL PCL::ENSURE-CLASS ++ PCL::EXTRACT-DECLARATIONS PCL::MAKE-CONSTANT-VALUE-DFUN + PCL::MAKE-CACHING-DFUN PCL::MAKE-INSTANCE-1 +- PCL::MAKE-FINAL-DFUN-INTERNAL WALKER::MACROEXPAND-ALL +- COMMON-LISP::ENSURE-GENERIC-FUNCTION PCL::MAP-ALL-CLASSES +- PCL::GET-METHOD-FUNCTION PCL::MAKE-METHOD-LAMBDA-INTERNAL +- PCL::PARSE-SPECIALIZED-LAMBDA-LIST PCL::GET-FUNCTION1 +- WALKER::WALK-FORM PCL::ALLOCATE-STRUCTURE-INSTANCE +- PCL::ENSURE-CLASS PCL::GET-DFUN-CONSTRUCTOR +- PCL::EXTRACT-DECLARATIONS PCL::DISPATCH-DFUN-COST +- PCL::PARSE-METHOD-OR-SPEC)) ++ PCL::MAKE-FINAL-DFUN-INTERNAL PCL::GET-FUNCTION ++ PCL::MAKE-METHOD-FUNCTION-INTERNAL ++ PCL::MAKE-METHOD-LAMBDA-INTERNAL PCL::GET-FUNCTION1 ++ PCL::PARSE-SPECIALIZED-LAMBDA-LIST PCL::DISPATCH-DFUN-COST ++ PCL::MAP-ALL-CLASSES)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) ++ PCL::CACHE-VALUEP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) ++ PCL::GET-WRAPPER-CACHE-NUMBER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::SYMBOL-APPEND)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ PCL::MAKE-PV-TABLE PCL::|__si::MAKE-N-N| ++ PCL::|__si::MAKE-ONE-CLASS| PCL::|__si::MAKE-ONE-INDEX| ++ PCL::MAKE-FAST-METHOD-CALL PCL::|__si::MAKE-CACHE| ++ PCL::|__si::MAKE-CACHING| PCL::|__si::MAKE-ARG-INFO| PCL::ZERO ++ PCL::MAKE-INITIALIZE-INFO PCL::|__si::MAKE-CONSTANT-VALUE| ++ WALKER::UNBOUND-LEXICAL-FUNCTION ++ PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| ++ PCL::PV-WRAPPERS-FROM-PV-ARGS PCL::FALSE ++ PCL::|__si::MAKE-DISPATCH| PCL::CALLED-FIN-WITHOUT-FUNCTION ++ PCL::|__si::MAKE-STD-INSTANCE| PCL::STRING-APPEND ++ PCL::MAKE-METHOD-CALL PCL::|__si::MAKE-DFUN-INFO| ++ PCL::|__si::MAKE-INITIAL| PCL::|__si::MAKE-PV-TABLE| ++ PCL::MAKE-FAST-INSTANCE-BOUNDP ++ PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| ++ PCL::|__si::MAKE-NO-METHODS| PCL::USE-PACKAGE-PCL ++ PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| ++ PCL::|STRUCTURE-OBJECT class constructor| ++ PCL::|__si::MAKE-INITIAL-DISPATCH| PCL::TRUE ++ PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| PCL::INTERN-PV-TABLE ++ PCL::|__si::MAKE-CHECKING| PCL::|__si::MAKE-TWO-CLASS|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ PCL::EMIT-ONE-INDEX-WRITERS PCL::ANALYZE-LAMBDA-LIST ++ PCL::FIND-CYCLE-REASONS PCL::MAKE-TYPE-PREDICATE ++ PCL::FINAL-ACCESSOR-DFUN-TYPE ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::COMPILE-LAMBDA-DEFERRED PCL::MAP-SPECIALIZERS ++ PCL::PARSE-DEFMETHOD PCL::CONVERT-TO-SYSTEM-TYPE ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::GET-MAKE-INSTANCE-FUNCTION PCL::*NORMALIZE-TYPE ++ PCL::EMIT-ONE-INDEX-READERS ++ PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION PCL::STRUCTURE-WRAPPER ++ PCL::NET-CODE-CONVERTER PCL::CLASS-EQ-TYPE ++ PCL::FIND-STRUCTURE-CLASS PCL::EMIT-TWO-CLASS-WRITER ++ PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA ++ PCL::SPECIALIZER-FROM-TYPE PCL::UPDATE-GFS-OF-CLASS ++ PCL::METHOD-PROTOTYPE-FOR-GF PCL::EMIT-CONSTANT-VALUE ++ PCL::EMIT-ONE-CLASS-WRITER PCL::EMIT-ONE-CLASS-READER ++ PCL::MAKE-INITIAL-DFUN PCL::COMPUTE-APPLICABLE-METHODS-EMF ++ PCL::COMPILE-LAMBDA-UNCOMPILED PCL::GET-GENERIC-FUNCTION-INFO ++ PCL::FIND-WRAPPER PCL::GET-DISPATCH-FUNCTION ++ PCL::EARLY-METHOD-FUNCTION PCL::MAKE-DISPATCH-DFUN ++ PCL::TYPE-FROM-SPECIALIZER PCL::PCL-DESCRIBE ++ PCL::EMIT-TWO-CLASS-READER PCL::MAKE-FINAL-DISPATCH-DFUN ++ PCL::EARLY-COLLECT-INHERITANCE PCL::EMIT-IN-CHECKING-CACHE-P ++ PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION ++ PCL::GENERIC-FUNCTION-NAME-P PCL::COMPILE-IIS-FUNCTIONS ++ PCL::PARSE-METHOD-GROUP-SPECIFIER PCL::DEFAULT-CODE-CONVERTER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::FIND-FREE-CACHE-LINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::COMPUTE-CACHE-PARAMETERS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) ++ PCL::PV-TABLE-SLOT-NAME-LISTS PCL::PV-TABLE-CALL-LIST ++ PCL::CACHE-OVERFLOW)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- PCL::SDFUN-FOR-CACHING PCL::SAUT-AND PCL::EMIT-CHECKING +- PCL::SPLIT-DECLARATIONS +- PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES PCL::COMPUTE-CODE +- PCL::*SUBTYPEP ITERATE::PARSE-DECLARATIONS +- PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P +- PCL::SLOT-NAME-LISTS-FROM-SLOTS COMMON-LISP::SLOT-VALUE +- PCL::COMPUTE-STD-CPL-PHASE-1 PCL::SAUT-CLASS ++ PCL::ENSURE-CLASS-VALUES ++ PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR ++ PCL::REAL-REMOVE-METHOD COMMON-LISP::SLOT-VALUE PCL::SAUT-AND ++ PCL::COMPUTE-STD-CPL-PHASE-1 PCL::INSURE-DFUN ++ PCL::CHECK-INITARGS-VALUES PCL::MUTATE-SLOTS-AND-CALLS ++ PCL::INVOKE-EMF PCL::MAKE-STD-READER-METHOD-FUNCTION ++ PCL::*SUBTYPEP PCL::MAKE-STD-WRITER-METHOD-FUNCTION ++ COMMON-LISP::SLOT-BOUNDP PCL::MAKE-INSTANCE-FUNCTION-TRAP ++ PCL::CLASS-APPLICABLE-USING-CLASS-P PCL::COMPUTE-TEST ++ PCL::COMPUTE-CODE PCL::UPDATE-SLOT-VALUE-GF-INFO ++ ITERATE::PARSE-DECLARATIONS COMMON-LISP::SLOT-MAKUNBOUND ++ PCL::SAUT-PROTOTYPE PCL::COMPUTE-CONSTANTS ++ PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION ++ PCL::ACCESSOR-MISS-FUNCTION PCL::SAUT-CLASS-EQ ++ PCL::SET-FUNCTION-NAME PCL::SAUT-CLASS ++ PCL::EMIT-DEFAULT-ONLY-FUNCTION PCL::SAUT-EQL + PCL::FORM-LIST-TO-LISP PCL::INITIAL-DFUN +- PCL::FIND-SUPERCLASS-CHAIN PCL::EMIT-CACHING PCL::SAUT-NOT +- PCL::CHECK-INITARGS-VALUES PCL::REAL-REMOVE-METHOD +- PCL::CPL-INCONSISTENT-ERROR COMMON-LISP::SLOT-BOUNDP ++ PCL::GF-MAKE-FUNCTION-FROM-EMF ++ PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL PCL::SAUT-NOT + PCL::SPECIALIZER-APPLICABLE-USING-TYPE-P +- PCL::MAKE-INSTANCE-FUNCTION-TRAP PCL::SAUT-CLASS-EQ +- PCL::SLOT-UNBOUND-INTERNAL PCL::SAUT-PROTOTYPE +- PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR +- PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL +- PCL::EMIT-DEFAULT-ONLY PCL::CLASS-APPLICABLE-USING-CLASS-P +- PCL::COMPUTE-TEST PCL::MUTATE-SLOTS-AND-CALLS +- PCL::EMIT-DEFAULT-ONLY-FUNCTION PCL::ENSURE-CLASS-VALUES +- PCL::INVOKE-EMF COMMON-LISP::SLOT-MAKUNBOUND +- PCL::MAKE-DIRECT-SLOTD PCL::INSURE-DFUN PCL::SET-FUNCTION-NAME +- PCL::DESTRUCTURE PCL::SAUT-EQL PCL::UPDATE-SLOT-VALUE-GF-INFO)) ++ PCL::CPL-INCONSISTENT-ERROR ++ PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P ++ PCL::SLOT-NAME-LISTS-FROM-SLOTS PCL::DESTRUCTURE ++ PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION ++ PCL::MAKE-DIRECT-SLOTD ++ PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES ++ PCL::MAKE-UNORDERED-METHODS-EMF PCL::EMIT-CACHING ++ PCL::EMIT-CHECKING PCL::FIND-SUPERCLASS-CHAIN ++ PCL::EMIT-DEFAULT-ONLY ++ PCL::SPLIT-DECLARATIONS PCL::SLOT-UNBOUND-INTERNAL ++ PCL::SDFUN-FOR-CACHING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- WALKER::RELIST* PCL::UPDATE-DFUN +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE PCL::MAKE-SPECIALIZABLE +- PCL::TRACE-METHOD PCL::ALLOCATE-STANDARD-INSTANCE +- WALKER::RELIST COMMON-LISP::FIND-CLASS PCL::MAKE-WRAPPER +- PCL::PV-TABLE-LOOKUP-PV-ARGS ITERATE::FUNCTION-LAMBDA-P +- PCL::SET-DFUN PCL::EARLY-METHOD-SPECIALIZERS +- WALKER::WALKER-ENVIRONMENT-BIND-1 +- PCL::INITIALIZE-METHOD-FUNCTION PCL::MAKE-TYPE-PREDICATE-NAME +- PCL::MAKE-FINAL-DFUN PCL::FIND-CLASS-CELL +- PCL::INITIALIZE-INTERNAL-SLOT-GFS PCL::MAKE-EARLY-GF +- PCL::USE-DISPATCH-DFUN-P ITERATE::MAYBE-WARN +- PCL::USE-CONSTANT-VALUE-DFUN-P PCL::FIND-CLASS-PREDICATE +- PCL::SET-ARG-INFO PCL::CAPITALIZE-WORDS)) ++ PCL::MAKE-FINAL-DFUN COMMON-LISP::FIND-CLASS WALKER::RELIST ++ PCL::EARLY-METHOD-SPECIALIZERS PCL::UPDATE-DFUN ++ PCL::FIND-CLASS-CELL PCL::MAKE-WRAPPER ITERATE::MAYBE-WARN ++ WALKER::RELIST* PCL::USE-DISPATCH-DFUN-P PCL::TRACE-METHOD ++ PCL::INITIALIZE-METHOD-FUNCTION ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS PCL::CAPITALIZE-WORDS ++ PCL::SET-DFUN PCL::PV-TABLE-LOOKUP-PV-ARGS ++ PCL::USE-CONSTANT-VALUE-DFUN-P PCL::ALLOCATE-STANDARD-INSTANCE ++ ITERATE::FUNCTION-LAMBDA-P PCL::MAKE-EARLY-GF ++ PCL::FIND-CLASS-PREDICATE WALKER::WALKER-ENVIRONMENT-BIND-1 ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE PCL::SET-ARG-INFO ++ PCL::MAKE-TYPE-PREDICATE-NAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- PCL::PRINT-DFUN-INFO)) ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::INITIALIZE-INSTANCE-SIMPLE ++ PCL::|(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| ++ PCL::MAYBE-EXPAND-ACCESSOR-FORM WALKER::WALK-LET/LET* ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (T T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ PCL::TWO-CLASS-DFUN-INFO ++ PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ WALKER::WALK-BINDINGS-2 ++ PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION1 ++ PCL::|(FAST-METHOD DOCUMENTATION (T))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::OPTIMIZE-READER ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| ++ PCL::OPTIMIZE-WRITER ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ PCL::MAKE-DISPATCH-LAMBDA ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| ++ PCL::MEMF-TEST-CONVERTER ++ PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::EXPAND-DEFCLASS ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::BOOTSTRAP-SET-SLOT ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR PCL::FILL-CACHE-P ++ PCL::GET-WRAPPERS-FROM-CLASSES ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::EXPAND-SYMBOL-MACROLET-INTERNAL ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ WALKER::WALK-PROG/PROG* ++ PCL::|(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ WALKER::WALK-DO/DO* ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ WALKER::WALK-TEMPLATE PCL::ADJUST-CACHE ++ PCL::LOAD-PRECOMPILED-IIS-ENTRY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- COMMON-LISP::SIMPLE-VECTOR) +- PCL::CACHE-VECTOR)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::CHECK-INITARGS-2-LIST WALKER::WALK-ARGLIST ++ PCL::EMIT-FETCH-WRAPPER PCL::REAL-GET-METHOD ++ PCL::CHECK-INITARGS-1 PCL::CAN-OPTIMIZE-ACCESS1 ++ PCL::FILL-CACHE PCL::GET-METHOD PCL::MAKE-EMF-CALL ++ PCL::CHECK-INITARGS-2-PLIST)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- PCL::SYMBOL-APPEND)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::REAL-ADD-NAMED-METHOD PCL::FILL-DFUN-CACHE ++ PCL::EARLY-ADD-NAMED-METHOD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) +- PCL::PV-TABLE-CACHE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::|(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| ++ WALKER::WALK-NAMED-LAMBDA WALKER::WALK-MACROLET ++ PCL::|(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| ++ PCL::GET-FUNCTION-GENERATOR ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ PCL::ENTRY-IN-CACHE-P PCL::COMPUTE-PRECEDENCE ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ PCL::TRACE-EMF-CALL-INTERNAL ++ ITERATE::SIMPLE-EXPAND-GATHERING-FORM ++ PCL::NOTE-PV-TABLE-REFERENCE ++ PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ PCL::OPTIMIZE-GF-CALL-INTERNAL ++ PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| ++ WALKER::WALK-COMPILER-LET ITERATE::VARIABLE-SAME-P ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ PCL::SET-FUNCTION-NAME-1 ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ PCL::MAKE-METHOD-SPEC ++ PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::MAP-ALL-ORDERS ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::EMIT-SLOT-READ-FORM WALKER::WALK-LABELS ++ PCL::EMIT-BOUNDP-CHECK PCL::ONE-CLASS-DFUN-INFO ++ WALKER::WALK-DO PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ WALKER::WALK-PROG PCL::MAKE-TOP-LEVEL-FORM ++ PCL::COMPUTE-EFFECTIVE-METHOD ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ WALKER::WALK-IF ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ PCL::MAKE-DFUN-CALL ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ WALKER::WALK-MULTIPLE-VALUE-SETQ WALKER::WALK-LAMBDA ++ PCL::OPTIMIZE-SET-SLOT-VALUE ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ PCL::EMIT-GREATER-THAN-1-DLAP WALKER::WALK-UNEXPECTED-DECLARE ++ WALKER::WALK-FLET WALKER::WALK-MULTIPLE-VALUE-BIND ++ PCL::EMIT-1-T-DLAP PCL::SKIP-FAST-SLOT-ACCESS-P ++ PCL::CAN-OPTIMIZE-ACCESS ++ PCL::|(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS* ++ PCL::|SETF PCL METHOD-FUNCTION-GET| WALKER::WALK-SETQ ++ PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P WALKER::WALK-PROG* ++ PCL::FIRST-FORM-TO-LISP ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| ++ PCL::PRINT-STD-INSTANCE ++ PCL::|(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ WALKER::WALK-LET* ++ PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| ++ PCL::OPTIMIZE-SLOT-VALUE PCL::FLUSH-CACHE-TRAP ++ WALKER::WALK-DO* ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| ++ PCL::|SETF PCL PLIST-VALUE| PCL::GET-NEW-FUNCTION-GENERATOR ++ PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ ITERATE::RENAME-AND-CAPTURE-VARIABLES PCL::EXPAND-DEFGENERIC ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| ++ WALKER::WALK-SYMBOL-MACROLET ++ PCL::|(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ WALKER::WALK-TAGBODY-1 ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ WALKER::WALK-LOCALLY PCL::INVALIDATE-WRAPPER ++ ITERATE::OPTIMIZE-ITERATE-FORM ++ PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| WALKER::WALK-LET ++ WALKER::RECONS PCL::OBSOLETE-INSTANCE-TRAP ++ WALKER::VARIABLE-DECLARATION WALKER::WALK-TAGBODY ++ PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::DECLARE-STRUCTURE PCL::SORT-APPLICABLE-METHODS ++ PCL::OPTIMIZE-SLOT-BOUNDP ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| ++ ITERATE::OPTIMIZE-GATHERING-FORM PCL::CONVERT-TABLE ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| ++ PCL::SORT-METHODS PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD ++ WALKER::RELIST-INTERNAL PCL::PRINT-CACHE ++ PCL::ONE-INDEX-DFUN-INFO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- PCL::FIND-FREE-CACHE-LINE)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::REAL-MAKE-METHOD-INITARGS-FORM PCL::COMPUTE-PV-SLOT ++ PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::OPTIMIZE-ACCESSOR-CALL ++ PCL::GET-MAKE-INSTANCE-FUNCTION-INTERNAL ++ WALKER::WALK-TEMPLATE-HANDLE-REPEAT ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ PCL::MAKE-EMF-CACHE ++ PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| ++ PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ WALKER::WALK-BINDINGS-1 ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ PCL::UPDATE-SLOTS-IN-PV ++ PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| ++ PCL::MAKE-PARAMETER-REFERENCES PCL::LOAD-FUNCTION-GENERATOR ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| ++ PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL ++ PCL::EXPAND-EMF-CALL-METHOD ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 ++ PCL::OPTIMIZE-GENERIC-FUNCTION-CALL PCL::MAKE-FGEN ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::OPTIMIZE-INSTANCE-ACCESS ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T T))| ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::COMPUTE-CACHE-PARAMETERS)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::OPTIMIZE-GF-CALL PCL::MAKE-EARLY-CLASS-DEFINITION ++ PCL::REAL-LOAD-DEFCLASS PCL::EMIT-SLOT-ACCESS ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION PCL::SET-ARG-INFO1 ++ PCL::LOAD-DEFCLASS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- PCL::GET-CACHE-FROM-CACHE +- PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION)) ++ PCL::GET-METHOD-FUNCTION-PV-CELL PCL::RECORD-DEFINITION ++ PCL::PROBE-CACHE PCL::FIND-CLASS-PREDICATE-FROM-CELL ++ PCL::EMIT-MISS PCL::INITIALIZE-INFO PCL::MAKE-EMF-FROM-METHOD ++ PCL::PRECOMPUTE-EFFECTIVE-METHODS ++ PCL::REAL-ENSURE-GF-USING-CLASS--NULL ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION1 ++ PCL::NAMED-OBJECT-PRINT-FUNCTION ++ WALKER::CONVERT-MACRO-TO-LAMBDA PCL::METHOD-FUNCTION-GET ++ PCL::GET-DECLARATION PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 PCL::MAP-CACHE ++ PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION ++ PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION ++ PCL::FIND-CLASS-FROM-CELL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- PCL::COMPUTE-PRIMARY-CACHE-LOCATION)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::MAKE-DEFMETHOD-FORM-INTERNAL PCL::MAKE-DEFMETHOD-FORM ++ PCL::LOAD-DEFMETHOD PCL::EARLY-MAKE-A-METHOD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- PCL::EMIT-N-N-WRITERS PCL::COUNT-ALL-DFUNS +- PCL::EMIT-N-N-READERS)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::EXPAND-DEFMETHOD PCL::LOAD-DEFMETHOD-INTERNAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- PCL::GET-EFFECTIVE-METHOD-GENSYM PCL::RENEW-SYS-FILES +- PCL::UPDATE-DISPATCH-DFUNS PCL::IN-THE-COMPILER-P +- PCL::SHOW-FREE-CACHE-VECTORS PCL::BOOTSTRAP-BUILT-IN-CLASSES +- PCL::MAKE-CACHE PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2 +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 +- PCL::STRUCTURE-FUNCTIONS-EXIST-P PCL::NO-METHODS-DFUN-INFO +- PCL::SHOW-EMF-CALL-TRACE PCL::INITIAL-DFUN-INFO +- PCL::DISPATCH-DFUN-INFO PCL::MAKE-ARG-INFO +- PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST +- PCL::%%ALLOCATE-INSTANCE--CLASS +- PCL::INITIAL-DISPATCH-DFUN-INFO PCL::CACHES-TO-ALLOCATE +- PCL::MAKE-CPD PCL::LIST-ALL-DFUNS PCL::SHOW-DFUN-CONSTRUCTORS +- PCL::BOOTSTRAP-META-BRAID PCL::DEFAULT-METHOD-ONLY-DFUN-INFO)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ PCL::COMPUTE-STD-CPL-PHASE-3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) +- PCL::CACHE-VALUEP)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ PCL::GET-CACHE PCL::FILL-CACHE-FROM-CACHE-P)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) +- PCL::CACHE-FIELD)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION2)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::BOOTSTRAP-INITIALIZE-CLASS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::EMIT-DLAP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::PRINT-DFUN-INFO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- PCL::ONE-INDEX-LIMIT-FN PCL::EARLY-CLASS-SIZE PCL::CACHE-COUNT +- PCL::PV-TABLE-PV-SIZE PCL::DEFAULT-LIMIT-FN +- PCL::CHECKING-LIMIT-FN PCL::CACHING-LIMIT-FN +- PCL::N-N-ACCESSORS-LIMIT-FN PCL::CPD-COUNT +- PCL::FAST-INSTANCE-BOUNDP-INDEX PCL::ARG-INFO-NUMBER-REQUIRED +- PCL::PV-CACHE-LIMIT-FN)) ++ PCL::CACHE-COUNT PCL::ARG-INFO-NUMBER-REQUIRED ++ PCL::PV-TABLE-PV-SIZE PCL::FAST-INSTANCE-BOUNDP-INDEX ++ PCL::CACHING-LIMIT-FN PCL::DEFAULT-LIMIT-FN ++ PCL::CHECKING-LIMIT-FN PCL::EARLY-CLASS-SIZE ++ PCL::ONE-INDEX-LIMIT-FN PCL::PV-CACHE-LIMIT-FN PCL::CPD-COUNT ++ PCL::N-N-ACCESSORS-LIMIT-FN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) + PCL::POWER-OF-TWO-CEILING)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(PCL::TRACE-METHOD-INTERNAL PCL::FDEFINE-CAREFULLY +- PCL::REDEFINE-FUNCTION PCL::DO-STANDARD-DEFSETF-1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- PCL::MAKE-CLASS-PREDICATE-NAME PCL::MAKE-KEYWORD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::INTEGER 1 255)) +- PCL::CACHE-NKEYS)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ PCL::COUNT-ALL-DFUNS PCL::EMIT-N-N-WRITERS ++ PCL::EMIT-N-N-READERS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::INTEGER 1 256)) +- PCL::CACHE-LINE-SIZE)) ++ COMMON-LISP::SIMPLE-VECTOR) ++ PCL::CACHE-VECTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) + COMMON-LISP::T) + PCL::%CCLOSURE-ENV-NTHCDR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) ++ PCL::PV-TABLE-CACHE)) + (IN-PACKAGE "PCL") + + (DOLIST (V '(|(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| +@@ -1196,104 +1203,104 @@ + |(BOUNDP OPTIONS)| |(WRITER METHOD)| + |PCL::DEPENDENT-UPDATE-MIXIN class predicate| + GENERIC-FUNCTION-PRETTY-ARGLIST |(WRITER SOURCE)| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| + |(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| +- |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| + |(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| + |(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| + |(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| + MAKE-BOUNDP-METHOD-FUNCTION + |(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| + |(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| + |PCL::METAOBJECT class predicate| ++ |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| ++ |(FAST-METHOD MAKE-INSTANCE (SYMBOL))| ++ |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| ++ |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| ++ |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| + |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| + |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| + |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| ++ |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| + |(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| + |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| +- |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| +- |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| +- |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| +- |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| +- |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| ++ |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| + |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- |(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| ++ |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| ++ |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| + |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ |(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| + |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| + |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| + |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| + |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| + |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| + |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- |(FAST-METHOD MAKE-INSTANCE (CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| +- |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| + CLASS-PREDICATE-NAME + |PCL::STRUCTURE-SLOT-DEFINITION class predicate| + |PCL::STRUCTURE-DIRECT-SLOT-DEFINITION class predicate| +@@ -1583,90 +1590,90 @@ + GENERIC-FUNCTION-P + |PCL::SLOT-DEFINITION class predicate| |(READER NAME)| + |(READER CLASS)| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| ++ |(FAST-METHOD SLOT-MISSING (T T T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| ++ |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (T T))| ++ |(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| ++ |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| ++ |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| ++ |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ |(FAST-METHOD (SETF DOCUMENTATION) (T T))| ++ |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| ++ |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- |(FAST-METHOD SLOT-UNBOUND (T T T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| +- |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| +- |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| ++ |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ |(FAST-METHOD SLOT-UNBOUND (T T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| + |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| + |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| + |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| + |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| + |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| + |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| + |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| + |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| + |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| ++ |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| + |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| + |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- |(FAST-METHOD PRINT-OBJECT (T T))| +- |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (T T))| +- |(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- |(FAST-METHOD SLOT-MISSING (T T T T))| +- |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| +- LEGAL-SLOT-NAME-P |(READER TYPE)| |(READER OBJECT)| +- CLASS-WRAPPER |(READER PLIST)| +- |(FAST-METHOD CLASS-PREDICATE-NAME (T))| +- |(FAST-METHOD DOCUMENTATION (T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (T T))| LEGAL-SLOT-NAME-P ++ |(READER TYPE)| |(READER OBJECT)| CLASS-WRAPPER ++ |(READER PLIST)| + |(FAST-METHOD NO-APPLICABLE-METHOD (T))| ++ |(FAST-METHOD DOCUMENTATION (T))| ++ |(FAST-METHOD CLASS-PREDICATE-NAME (T))| + |(READER SLOTS)| |(WRITER NAME)| DEFINITION-SOURCE + |PCL::SLOT-OBJECT class predicate| DEFAULT-INITARGS + |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER TYPE)| +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -76,6 +76,7 @@ sys_init.lsp: sys_init.lsp.in + -e "s#@LI-EXTVERS@#`cat ../minvers | cut -f2 -d.`#1" \ + -e "s#@LI-MINVERS@#`cat ../minvers | cut -f1 -d.`#1" \ + -e "s#@LI-MAJVERS@#`cat ../majvers`#1" \ ++ -e "s#@LI-GITTAG@#`cat ../git.tag`#1" \ + -e "s#@LI-RELEASE@#`cat ../release`#1" \ + -e "s#@LI-CC@#\"$(GCL_CC) -c $(filter-out -pg,$(FINAL_CFLAGS))\"#1" \ + -e "s#@LI-DFP@#\"$(filter -pg,$(FINAL_CFLAGS))\"#1" \ +@@ -92,6 +93,7 @@ saved_%:raw_% $(RSYM) sys_init.lsp raw_% + $(LSPDIR)/gcl_auto_new.lsp + + cp sys_init.lsp foo ++# [ "$(@F)" != "$(FLISP)" ] || echo "#+large-memory-model (setq compiler::*default-large-memory-model-p* t)" >>foo + echo "(unless si::*quit-tags* (in-package \"USER\")(system:save-system \"$@\"))" >>foo + j=$$(ar t lib$*.a |grep ^gcl_);[ "$$j" = "" ] || ar x lib$*.a $$j #accelerator + $(PORTDIR)/raw_$*$(EXE) $(PORTDIR)/ -libdir $(GCLDIR)/ < foo +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -49,6 +49,7 @@ + (setq *gcl-extra-version* @LI-EXTVERS@ + *gcl-minor-version* @LI-MINVERS@ + *gcl-major-version* @LI-MAJVERS@ ++ *gcl-git-tag* @LI-GITTAG@ + *gcl-release-date* "@LI-RELEASE@") + + (defvar *system-banner* (default-system-banner)) diff --git a/debian/patches/Version_2_6_13pre126 b/debian/patches/Version_2_6_13pre126 new file mode 100644 index 0000000..4eee67d --- /dev/null +++ b/debian/patches/Version_2_6_13pre126 @@ -0,0 +1,119 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-126) unstable; urgency=medium + . + * Version_2.6.13pre126 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-11-09 + +--- gcl-2.6.12.orig/git.tag ++++ gcl-2.6.12/git.tag +@@ -1,2 +1,2 @@ +-"Version_2_6_13pre125" ++"Version_2_6_13pre126" + +--- gcl-2.6.12.orig/h/compprotos.h ++++ gcl-2.6.12/h/compprotos.h +@@ -179,5 +179,6 @@ void gcl_init_or_load1(void (*)(void),co + char *gcl_gets(char *,int); + int gcl_puts(const char *); + int endp_error(object); +-object Icall_gen_error_handler(object,object,object,object,ufixnum,...) __attribute__((noreturn)); ++object Icall_gen_error_handler(object,object,object,object,ufixnum,...); ++object Icall_gen_error_handler_noreturn(object,object,object,object,ufixnum,...) __attribute__((noreturn)); + object file_stream(object); +--- gcl-2.6.12.orig/h/error.h ++++ gcl-2.6.12/h/error.h +@@ -2,7 +2,7 @@ + #define ERROR_H + + #define Icall_error_handler(a_,b_,c_,d_...) \ +- Icall_gen_error_handler(Cnil,null_string,a_,b_,c_,##d_) ++ Icall_gen_error_handler_noreturn(Cnil,null_string,a_,b_,c_,##d_) + #define Icall_continue_error_handler(a_,b_,c_,d_,e_...) \ + Icall_gen_error_handler(Ct,a_,b_,c_,d_,##e_) + +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -126,12 +126,11 @@ ihs_top_function_name(ihs_ptr h) + return(Cnil); + } + +-object +-Icall_gen_error_handler(object ci,object cs,object en,object es,ufixnum n,...) { ++static object ++Icall_gen_error_handler_ap(object ci,object cs,object en,object es,ufixnum n,va_list ap) { + + object *b; + ufixnum i; +- va_list ap; + + n+=5; + b=alloca(n*sizeof(*b)); +@@ -141,17 +140,47 @@ Icall_gen_error_handler(object ci,object + b[3] = cs; + b[4] = es; + +- va_start(ap,n); + for (i=5;i + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-128) unstable; urgency=medium + . + * Version_2.6.13pre128 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-11-12 + +--- gcl-2.6.12.orig/ChangeLog ++++ gcl-2.6.12/ChangeLog +@@ -115,13 +115,13 @@ + * /cvsroot/gcl/gcl/ChangeLog: *** empty log message *** + + * /cvsroot/gcl/gcl/unixport/makefile: +- Added DESTDIR to makefiles to support installing under arbitrary subdir; good 'clean' targets; correct building in absense of tcl/tk ++ Added DESTDIR to makefiles to support installing under arbitrary subdir; good 'clean' targets; correct building in absence of tcl/tk + + * /cvsroot/gcl/gcl/gcl-tk/makefile: + Add gcl-tk/demos/index.lsp to clean target + + * /cvsroot/gcl/gcl/o/makefile, /cvsroot/gcl/gcl/elisp/makefile, /cvsroot/gcl/gcl/info/makefile, /cvsroot/gcl/gcl/makefile: +- Added DESTDIR to makefiles to support installing under arbitrary subdir; good 'clean' targets; correct building in absense of tcl/tk ++ Added DESTDIR to makefiles to support installing under arbitrary subdir; good 'clean' targets; correct building in absence of tcl/tk + + * /cvsroot/gcl/gcl/configure, /cvsroot/gcl/gcl/configure.in, /cvsroot/gcl/gcl/elisp/makefile: + changes to configure.in and elisp/makefile to handle emacs not being present +--- gcl-2.6.12.orig/ChangeLog.old ++++ gcl-2.6.12/ChangeLog.old +@@ -8,7 +8,7 @@ + * Added DESTDIR to makefiles to support installing under arbitrary + subdir + * good 'clean' targets +- * correct building in absense of tcl/tk ++ * correct building in absence of tcl/tk + + + 2001-12-18 David Billinghurst +--- gcl-2.6.12.orig/ansi-tests/ansi-aux.lsp ++++ gcl-2.6.12/ansi-tests/ansi-aux.lsp +@@ -961,10 +961,10 @@ the condition to go uncaught if it canno + (format t "Found element of ~S not in ~S: ~S~%" + tp tp2 x) + t)) +- (condition (c) (format t "Error ~S occured: ~S~%" ++ (condition (c) (format t "Error ~S occurred: ~S~%" + c tp2) + t))))) +- (condition (c) (format t "Error ~S occured: ~S~%" c tp) ++ (condition (c) (format t "Error ~S occurred: ~S~%" c tp) + 1)))))))) + + (defun even-size-p (a) +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -1446,8 +1446,8 @@ Optional Features: + --enable-emacsdir=XXXX will manually specify the location for elisp files + --enable-xgcl=yes will compile in support for XGCL + --enable-dlopen uses dlopen for loading objects, which can then not be retained in saved images +- --enable-statsysbfd uses a static sytem bfd library for loading and relocationing object files +- --enable-dynsysbfd uses a dynamic shared sytem bfd library for loading and relocationing object files ++ --enable-statsysbfd uses a static system bfd library for loading and relocating object files ++ --enable-dynsysbfd uses a dynamic shared system bfd library for loading and relocating object files + --enable-custreloc uses custom gcl code if available for loading and relocationing object files + --enable-debug builds gcl with -g in CFLAGS to enable running under gdb + --enable-static will link your GCL against static as opposed to shared system libraries +@@ -8522,7 +8522,9 @@ fi + if test "$enable_readline" != "no" ; then + for ac_header in readline/readline.h + do : +- ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" ++ ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "#include ++ ++" + if test "x$ac_cv_header_readline_readline_h" = xyes + then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h +@@ -8654,7 +8656,122 @@ printf "%s\n" "#define HAVE_RL_COMPENTRY + + fi + +- TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION" >&5 ++printf %s "checking RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ extern Function *rl_completion_entry_function __attribute__((weak)); ++ ++int ++main (void) ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO" ++then : ++ ++printf "%s\n" "#define RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION 1" >>confdefs.h ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T" >&5 ++printf %s "checking RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); ++ ++int ++main (void) ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO" ++then : ++ ++printf "%s\n" "#define RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T 1" >>confdefs.h ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++ as_fn_error $? "Unknown rl_completion_entry_function return type" "$LINENO" 5 ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking RL_READLINE_NAME_TYPE_CHAR" >&5 ++printf %s "checking RL_READLINE_NAME_TYPE_CHAR... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ extern char *rl_readline_name __attribute__((weak)); ++ ++int ++main (void) ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO" ++then : ++ ++printf "%s\n" "#define RL_READLINE_NAME_TYPE_CHAR 1" >>confdefs.h ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking RL_READLINE_NAME_TYPE_CONST_CHAR" >&5 ++printf %s "checking RL_READLINE_NAME_TYPE_CONST_CHAR... " >&6; } ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ extern const char *rl_readline_name __attribute__((weak)); ++ ++int ++main (void) ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO" ++then : ++ ++printf "%s\n" "#define RL_READLINE_NAME_TYPE_CONST_CHAR 1" >>confdefs.h ++ ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++printf "%s\n" "yes" >&6; } ++else $as_nop ++ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++printf "%s\n" "no" >&6; } ++ as_fn_error $? "Unknown rl_readline_name return type" "$LINENO" 5 ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ++ TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware + RL_OBJS=gcl_readline.o + fi + +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1,5 +1,5 @@ + AC_INIT +-AC_PREREQ([2.71]) ++AC_PREREQ([2.69]) + AC_CONFIG_HEADERS([h/gclincl.h]) + + VERSION=`cat majvers`.`cat minvers` +@@ -119,9 +119,9 @@ AC_ARG_ENABLE([xgcl],[ --enable-xgcl=ye + + AC_ARG_ENABLE([dlopen],[ --enable-dlopen uses dlopen for loading objects, which can then not be retained in saved images], + ,[enable_dlopen=$def_dlopen]) +-AC_ARG_ENABLE([statsysbfd],[ --enable-statsysbfd uses a static sytem bfd library for loading and relocationing object files], ++AC_ARG_ENABLE([statsysbfd],[ --enable-statsysbfd uses a static system bfd library for loading and relocating object files], + ,[enable_statsysbfd=$def_statsysbfd]) +-AC_ARG_ENABLE([dynsysbfd],[ --enable-dynsysbfd uses a dynamic shared sytem bfd library for loading and relocationing object files], ++AC_ARG_ENABLE([dynsysbfd],[ --enable-dynsysbfd uses a dynamic shared system bfd library for loading and relocating object files], + ,[enable_dynsysbfd=no]) + AC_ARG_ENABLE([custreloc],[ --enable-custreloc uses custom gcl code if available for loading and relocationing object files], + ,[enable_custreloc=$def_custreloc]) +@@ -1749,8 +1749,56 @@ if test "$enable_readline" != "no" ; the + AC_CHECK_LIB([readline],[rl_completion_matches], + [AC_DEFINE(HAVE_DECL_RL_COMPLETION_MATCHES,1,[have readline completion matches]) + AC_DEFINE(HAVE_RL_COMPENTRY_FUNC_T,1,[have readline completion matches])]) +- TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware +- RL_OBJS=gcl_readline.o])) ++ AC_MSG_CHECKING([RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION]) ++ AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ extern Function *rl_completion_entry_function __attribute__((weak)); ++ ]], ++ [[]])], ++ [AC_DEFINE(RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION,1,[rl_completion_entry_function returns type Function]) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no]) ++ AC_MSG_CHECKING([RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T]) ++ AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); ++ ]], ++ [[]])], ++ [AC_DEFINE(RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T,1,[rl_completion_entry_function returns type rl_compentry_func_t]) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no]) ++ AC_MSG_ERROR([Unknown rl_completion_entry_function return type])])]) ++ ++ AC_MSG_CHECKING([RL_READLINE_NAME_TYPE_CHAR]) ++ AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ extern char *rl_readline_name __attribute__((weak)); ++ ]], ++ [[]])], ++ [AC_DEFINE(RL_READLINE_NAME_TYPE_CHAR,1,[rl_readline_name returns type char]) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no]) ++ AC_MSG_CHECKING([RL_READLINE_NAME_TYPE_CONST_CHAR]) ++ AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ extern const char *rl_readline_name __attribute__((weak)); ++ ]], ++ [[]])], ++ [AC_DEFINE(RL_READLINE_NAME_TYPE_CONST_CHAR,1,[rl_readline_name returns type const char]) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no]) ++ AC_MSG_ERROR([Unknown rl_readline_name return type])])]) ++ TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware ++ RL_OBJS=gcl_readline.o]), ++ [],[AC_INCLUDES_DEFAULT([#include ])]) + fi + + AC_SUBST(RL_OBJS) +--- gcl-2.6.12.orig/git.tag ++++ gcl-2.6.12/git.tag +@@ -1,2 +1,2 @@ +-"Version_2_6_13pre126" ++"Version_2_6_13pre128" + +--- gcl-2.6.12.orig/h/386-macosx.defs ++++ gcl-2.6.12/h/386-macosx.defs +@@ -30,6 +30,6 @@ INITFORM = (si::build-symbol-table) + # This is Apple's libtool, completely unrelated to GNU libtool. + # Other plateforms define this to be `ar rs`. + # This appears to be no longer necessary on Panther. +-ARRS = libtool -static -o ++ARRS = /usr/bin/libtool -static -o + + FINAL_CFLAGS := `echo $(FINAL_CFLAGS) | sed -e 's:-g::g'` +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -342,6 +342,18 @@ + /* readline is editline */ + #undef READLINE_IS_EDITLINE + ++/* rl_completion_entry_function returns type Function */ ++#undef RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION ++ ++/* rl_completion_entry_function returns type rl_compentry_func_t */ ++#undef RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T ++ ++/* rl_readline_name returns type char */ ++#undef RL_READLINE_NAME_TYPE_CHAR ++ ++/* rl_readline_name returns type const char */ ++#undef RL_READLINE_NAME_TYPE_CONST_CHAR ++ + /* asm string to set the stack pointer */ + #undef SET_STACK_POINTER + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1764,6 +1764,9 @@ gcl_isnormal_float(float); + int + gcl_isnan(object); + ++int ++gcl_is_not_finite(object); ++ + object + find_init_name1(char *,unsigned); + +--- gcl-2.6.12.orig/info/gcl-tk.info-1 ++++ gcl-2.6.12/info/gcl-tk.info-1 +@@ -330,7 +330,7 @@ of the other up to equal. + 1.4.3 Control Function Return Values + ------------------------------------ + +-The control funcions (*note Control::) do not return a value or wait ++The control functions (*note Control::) do not return a value or wait + unless requested to do so, using the ':return' keyword. The types and + method of specification are the same as for the Widget Functions in the + previous section. +--- gcl-2.6.12.orig/info/gcl-tk/Return-Values.html ++++ gcl-2.6.12/info/gcl-tk/Return-Values.html +@@ -142,7 +142,7 @@ functions one of the other up to equal. +

+

1.4.3 Control Function Return Values

+ +-

The control funcions (see Control) do not return a value ++

The control functions (see Control) do not return a value + or wait unless requested to do so, using the :return keyword. + The types and method of specification are the same as for the + Widget Functions in the previous section. +--- gcl-2.6.12.orig/info/general.texi ++++ gcl-2.6.12/info/general.texi +@@ -277,7 +277,7 @@ functions one of the other up to equal. + + @subsection Control Function Return Values + +-The @i{control} funcions (@pxref{Control}) do not return a value ++The @i{control} functions (@pxref{Control}) do not return a value + or wait unless requested to do so, using the @code{:return} keyword. + The types and method of specification are the same as for the + Widget Functions in the previous section. +--- gcl-2.6.12.orig/ltmain.sh ++++ gcl-2.6.12/ltmain.sh +@@ -2824,7 +2824,7 @@ EOF + fi + done + else +- # Error occured in the first compile. Let's try to salvage the situation: ++ # Error occurred in the first compile. Let's try to salvage the situation: + # Compile a seperate program for each library. + for i in $deplibs; do + name="`expr $i : '-l\(.*\)'`" +--- gcl-2.6.12.orig/o/num_co.c ++++ gcl-2.6.12/o/num_co.c +@@ -112,7 +112,18 @@ gcl_isnan(object x) { + + } + ++int ++gcl_is_not_finite(object x) { + ++ switch(type_of(x)) { ++ case t_shortfloat: ++ return !ISFINITE(sf(x)); ++ case t_longfloat: ++ return !ISFINITE(lf(x)); ++ default: ++ return 0; ++ } ++} + + static void + integer_decode_double(double d, int *hp, int *lp, int *ep, int *sp) +--- gcl-2.6.12.orig/o/num_sfun.c ++++ gcl-2.6.12/o/num_sfun.c +@@ -116,6 +116,9 @@ number_big_iexpt(object x,object y,fixnu + static inline object + number_zero_expt(object x,bool promote_short_p) { + ++ if (gcl_is_not_finite(x))/*FIXME, better place?*/ ++ return number_exp(number_times(number_nlog(x),small_fixnum(0))); ++ + switch (type_of(x)) { + case t_fixnum: + case t_bignum: +@@ -180,7 +183,7 @@ number_ump_expt(object x,object y) { + + static inline object + number_log_expt(object x,object y) { +- return number_zerop(y) ? number_zero_expt(y,type_of(x)==t_longfloat) : number_exp(number_times(number_nlog(x),y)); ++ return number_zerop(y) ? number_zero_expt(x,type_of(x)==t_longfloat) : number_exp(number_times(number_nlog(x),y)); + } + + static inline object +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -8,18 +8,23 @@ extern FILE *stderr __attribute__((weak) + extern FILE *stdout __attribute__((weak)); + + #ifdef USE_READLINE +-#ifdef READLINE_IS_EDITLINE +-#define MY_RL_VERSION 0x0600 ++ ++#if defined(RL_COMPLETION_ENTRY_FUNCTION_TYPE_FUNCTION) ++extern Function *rl_completion_entry_function __attribute__((weak)); ++#elif defined(RL_COMPLETION_ENTRY_FUNCTION_TYPE_RL_COMPENTRY_FUNC_T) ++extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); + #else +-#define MY_RL_VERSION RL_READLINE_VERSION ++#error Unknown rl_completion_entry_function return type + #endif +-#if MY_RL_VERSION < 0x0600 +-extern Function *rl_completion_entry_function __attribute__((weak)); ++ ++#if defined(RL_READLINE_NAME_TYPE_CHAR) + extern char *rl_readline_name __attribute__((weak)); +-#else +-extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); ++#elif defined(RL_READLINE_NAME_TYPE_CONST_CHAR) + extern const char *rl_readline_name __attribute__((weak)); ++#else ++#error Unknown rl_readline_name return type + #endif ++ + #endif + #endif + +--- gcl-2.6.12.orig/o/usig.c ++++ gcl-2.6.12/o/usig.c +@@ -261,9 +261,9 @@ DEF_ORDINARY("FLOATING-POINT-ERROR",sSfl + static void + sigpipe(void) + { +- gcl_signal(SIGPIPE, sigpipe); +- perror(""); +- FEerror("Broken pipe", 0); ++ unblock_signals(SIGPIPE,SIGPIPE); ++ perror(""); ++ FEerror("Broken pipe", 0); + } + + void +--- gcl-2.6.12.orig/pcl/impl/xerox/pcl-env.lisp ++++ gcl-2.6.12/pcl/impl/xerox/pcl-env.lisp +@@ -43,7 +43,7 @@ + (il:defprint 'il:compiled-closure 'il:print-closure)) + + (defun il:print-closure (x &optional stream depth) +- ;; See the IRM, section 25.3.3. Unfortunatly, that documentation is ++ ;; See the IRM, section 25.3.3. Unfortunately, that documentation is + ;; not correct. In particular, it makes no mention of the third argument. + (cond ((not (funcallable-instance-p x)) + ;; IL:\CCLOSURE.DEFPRINT is the orginal system function for +--- gcl-2.6.12.orig/pcl/impl/xerox/xerox-low.lisp ++++ gcl-2.6.12/pcl/impl/xerox/xerox-low.lisp +@@ -80,7 +80,7 @@ + ) + + (defun %print-std-instance (instance &optional stream depth) +- ;; See the IRM, section 25.3.3. Unfortunatly, that documentation is ++ ;; See the IRM, section 25.3.3. Unfortunately, that documentation is + ;; not correct. In particular, it makes no mention of the third argument. + (cond ((streamp stream) + ;; Use the standard PCL printing method, then return T to tell +--- gcl-2.6.12.orig/pcl/notes/get-pcl.text ++++ gcl-2.6.12/pcl/notes/get-pcl.text +@@ -113,7 +113,7 @@ distribution. + + For people who can't FTP from Internet (Arpanet) hosts, but who have + mail access to the BITNET, there exists a way to get the PCL files using +-the BITFTP service provided by Princeton Univerity. If you know exactly ++the BITFTP service provided by Princeton University. If you know exactly + where to find the files that interest you, this is quite easy. In + particular, you have to know: + +--- gcl-2.6.12.orig/readme ++++ gcl-2.6.12/readme +@@ -3,7 +3,7 @@ Description of GCL (GNU Common Lisp) sys + OVERVIEW: + + The GCL system contains C and Lisp source files to build a Common Lisp +-sytem. The original KCL system was written by Taiichi Yuasa and ++system. The original KCL system was written by Taiichi Yuasa and + Masami Hagiya in 1984. The AKCL system work was begun in 1987 by + William Schelter and continued through 1994. A number of people have + contributed ports and pieces. The file doc/contributors lists some of +--- gcl-2.6.12.orig/xbin/spp.c ++++ gcl-2.6.12/xbin/spp.c +@@ -2,7 +2,7 @@ + + /* + * spp.c +- * Extracts the symbol table from an HP-UX excutable file ++ * Extracts the symbol table from an HP-UX executable file + * to be used in a later pass of the linker. (ld does not + * support the -A option.) + */ +--- gcl-2.6.12.orig/xgcl-2/Events.c ++++ gcl-2.6.12/xgcl-2/Events.c +@@ -24,7 +24,7 @@ + #include + #include + +-/********* XKeyEvent funcions *****/ ++/********* XKeyEvent functions *****/ + + long make_XKeyEvent (){ + return ((long) calloc(1, sizeof(XKeyEvent))); +@@ -226,7 +226,7 @@ int j; + } + + +-/********* XButtonEvent funcions *****/ ++/********* XButtonEvent functions *****/ + + long make_XButtonEvent (){ + return ((long) calloc(1, sizeof(XButtonEvent))); +@@ -428,7 +428,7 @@ int j; + } + + +-/********* XMotionEvent funcions *****/ ++/********* XMotionEvent functions *****/ + + long make_XMotionEvent (){ + return ((long) calloc(1, sizeof(XMotionEvent))); +@@ -630,7 +630,7 @@ int j; + } + + +-/********* XCrossingEvent funcions *****/ ++/********* XCrossingEvent functions *****/ + + long make_XCrossingEvent (){ + return ((long) calloc(1, sizeof(XCrossingEvent))); +@@ -858,7 +858,7 @@ int j; + } + + +-/********* XFocusChangeEvent funcions *****/ ++/********* XFocusChangeEvent functions *****/ + + long make_XFocusChangeEvent (){ + return ((long) calloc(1, sizeof(XFocusChangeEvent))); +@@ -956,7 +956,7 @@ int j; + } + + +-/********* XKeymapEvent funcions *****/ ++/********* XKeymapEvent functions *****/ + + long make_XKeymapEvent (){ + return ((long) calloc(1, sizeof(XKeymapEvent))); +@@ -1033,7 +1033,7 @@ int j; + } + + +-/********* XExposeEvent funcions *****/ ++/********* XExposeEvent functions *****/ + + long make_XExposeEvent (){ + return ((long) calloc(1, sizeof(XExposeEvent))); +@@ -1170,7 +1170,7 @@ int j; + } + + +-/********* XGraphicsExposeEvent funcions *****/ ++/********* XGraphicsExposeEvent functions *****/ + + long make_XGraphicsExposeEvent (){ + return ((long) calloc(1, sizeof(XGraphicsExposeEvent))); +@@ -1333,7 +1333,7 @@ int j; + } + + +-/********* XNoExposeEvent funcions *****/ ++/********* XNoExposeEvent functions *****/ + + long make_XNoExposeEvent (){ + return ((long) calloc(1, sizeof(XNoExposeEvent))); +@@ -1431,7 +1431,7 @@ int j; + } + + +-/********* XVisibilityEvent funcions *****/ ++/********* XVisibilityEvent functions *****/ + + long make_XVisibilityEvent (){ + return ((long) calloc(1, sizeof(XVisibilityEvent))); +@@ -1516,7 +1516,7 @@ int j; + } + + +-/********* XCreateWindowEvent funcions *****/ ++/********* XCreateWindowEvent functions *****/ + + long make_XCreateWindowEvent (){ + return ((long) calloc(1, sizeof(XCreateWindowEvent))); +@@ -1679,7 +1679,7 @@ int j; + } + + +-/********* XDestroyWindowEvent funcions *****/ ++/********* XDestroyWindowEvent functions *****/ + + long make_XDestroyWindowEvent (){ + return ((long) calloc(1, sizeof(XDestroyWindowEvent))); +@@ -1764,7 +1764,7 @@ int j; + } + + +-/********* XUnmapEvent funcions *****/ ++/********* XUnmapEvent functions *****/ + + long make_XUnmapEvent (){ + return ((long) calloc(1, sizeof(XUnmapEvent))); +@@ -1862,7 +1862,7 @@ int j; + } + + +-/********* XMapEvent funcions *****/ ++/********* XMapEvent functions *****/ + + long make_XMapEvent (){ + return ((long) calloc(1, sizeof(XMapEvent))); +@@ -1960,7 +1960,7 @@ int j; + } + + +-/********* XMapRequestEvent funcions *****/ ++/********* XMapRequestEvent functions *****/ + + long make_XMapRequestEvent (){ + return ((long) calloc(1, sizeof(XMapRequestEvent))); +@@ -2045,7 +2045,7 @@ int j; + } + + +-/********* XReparentEvent funcions *****/ ++/********* XReparentEvent functions *****/ + + long make_XReparentEvent (){ + return ((long) calloc(1, sizeof(XReparentEvent))); +@@ -2182,7 +2182,7 @@ int j; + } + + +-/********* XConfigureEvent funcions *****/ ++/********* XConfigureEvent functions *****/ + + long make_XConfigureEvent (){ + return ((long) calloc(1, sizeof(XConfigureEvent))); +@@ -2358,7 +2358,7 @@ int j; + } + + +-/********* XGravityEvent funcions *****/ ++/********* XGravityEvent functions *****/ + + long make_XGravityEvent (){ + return ((long) calloc(1, sizeof(XGravityEvent))); +@@ -2469,7 +2469,7 @@ int j; + } + + +-/********* XResizeRequestEvent funcions *****/ ++/********* XResizeRequestEvent functions *****/ + + long make_XResizeRequestEvent (){ + return ((long) calloc(1, sizeof(XResizeRequestEvent))); +@@ -2567,7 +2567,7 @@ int j; + } + + +-/********* XConfigureRequestEvent funcions *****/ ++/********* XConfigureRequestEvent functions *****/ + + long make_XConfigureRequestEvent (){ + return ((long) calloc(1, sizeof(XConfigureRequestEvent))); +@@ -2756,7 +2756,7 @@ int j; + } + + +-/********* XCirculateEvent funcions *****/ ++/********* XCirculateEvent functions *****/ + + long make_XCirculateEvent (){ + return ((long) calloc(1, sizeof(XCirculateEvent))); +@@ -2854,7 +2854,7 @@ int j; + } + + +-/********* XCirculateRequestEvent funcions *****/ ++/********* XCirculateRequestEvent functions *****/ + + long make_XCirculateRequestEvent (){ + return ((long) calloc(1, sizeof(XCirculateRequestEvent))); +@@ -2952,7 +2952,7 @@ int j; + } + + +-/********* XPropertyEvent funcions *****/ ++/********* XPropertyEvent functions *****/ + + long make_XPropertyEvent (){ + return ((long) calloc(1, sizeof(XPropertyEvent))); +@@ -3063,7 +3063,7 @@ int j; + } + + +-/********* XSelectionClearEvent funcions *****/ ++/********* XSelectionClearEvent functions *****/ + + long make_XSelectionClearEvent (){ + return ((long) calloc(1, sizeof(XSelectionClearEvent))); +@@ -3161,7 +3161,7 @@ int j; + } + + +-/********* XSelectionRequestEvent funcions *****/ ++/********* XSelectionRequestEvent functions *****/ + + long make_XSelectionRequestEvent (){ + return ((long) calloc(1, sizeof(XSelectionRequestEvent))); +@@ -3298,7 +3298,7 @@ int j; + } + + +-/********* XSelectionEvent funcions *****/ ++/********* XSelectionEvent functions *****/ + + long make_XSelectionEvent (){ + return ((long) calloc(1, sizeof(XSelectionEvent))); +@@ -3422,7 +3422,7 @@ int j; + } + + +-/********* XColormapEvent funcions *****/ ++/********* XColormapEvent functions *****/ + + long make_XColormapEvent (){ + return ((long) calloc(1, sizeof(XColormapEvent))); +@@ -3533,7 +3533,7 @@ int j; + } + + +-/********* XClientMessageEvent funcions *****/ ++/********* XClientMessageEvent functions *****/ + + long make_XClientMessageEvent (){ + return ((long) calloc(1, sizeof(XClientMessageEvent))); +@@ -3632,7 +3632,7 @@ int j; + } + + +-/********* XMappingEvent funcions *****/ ++/********* XMappingEvent functions *****/ + + long make_XMappingEvent (){ + return ((long) calloc(1, sizeof(XMappingEvent))); +@@ -3743,7 +3743,7 @@ int j; + } + + +-/********* XErrorEvent funcions *****/ ++/********* XErrorEvent functions *****/ + + long make_XErrorEvent (){ + return ((long) calloc(1, sizeof(XErrorEvent))); +@@ -3841,7 +3841,7 @@ int j; + } + + +-/********* XAnyEvent funcions *****/ ++/********* XAnyEvent functions *****/ + + long make_XAnyEvent (){ + return ((long) calloc(1, sizeof(XAnyEvent))); +@@ -3913,7 +3913,7 @@ int j; + } + + +-/********* XEvent funcions *****/ ++/********* XEvent functions *****/ + + long make_XEvent (){ + return ((long) calloc(1, sizeof(XEvent))); +--- gcl-2.6.12.orig/xgcl-2/XStruct-2.c ++++ gcl-2.6.12/xgcl-2/XStruct-2.c +@@ -22,7 +22,7 @@ + ; See the file dec.copyright for details. */ + + +-/********* _XQEvent funcions *****/ ++/********* _XQEvent functions *****/ + #define NEED_EVENTS + #include + #include +@@ -60,7 +60,7 @@ long j; + } + + +-/********* XCharStruct funcions *****/ ++/********* XCharStruct functions *****/ + + long make_XCharStruct (){ + return ((long) calloc(1, sizeof(XCharStruct))); +@@ -145,7 +145,7 @@ int j; + } + + +-/********* XFontProp funcions *****/ ++/********* XFontProp functions *****/ + + long make_XFontProp (){ + return ((long) calloc(1, sizeof(XFontProp))); +@@ -178,7 +178,7 @@ int j; + } + + +-/********* XFontStruct funcions *****/ ++/********* XFontStruct functions *****/ + + long make_XFontStruct (){ + return ((long) calloc(1, sizeof(XFontStruct))); +@@ -390,7 +390,7 @@ long j; + } + + +-/********* XTextItem funcions *****/ ++/********* XTextItem functions *****/ + + long make_XTextItem (){ + return ((long) calloc(1, sizeof(XTextItem))); +@@ -449,7 +449,7 @@ long j; + } + + +-/********* XChar2b funcions *****/ ++/********* XChar2b functions *****/ + + long make_XChar2b (){ + return ((long) calloc(1, sizeof(XChar2b))); +@@ -482,7 +482,7 @@ char j; + } + + +-/********* XTextItem16 funcions *****/ ++/********* XTextItem16 functions *****/ + + long make_XTextItem16 (){ + return ((long) calloc(1, sizeof(XTextItem16))); +@@ -541,7 +541,7 @@ long j; + } + + +-/********* XEDataObject funcions *****/ ++/********* XEDataObject functions *****/ + + long make_XEDataObject (){ + return ((long) calloc(1, sizeof(XEDataObject))); +@@ -613,7 +613,7 @@ GC j; + } + + +-/********* XSizeHints funcions *****/ ++/********* XSizeHints functions *****/ + + long make_XSizeHints (){ + return ((long) calloc(1, sizeof(XSizeHints))); +@@ -856,7 +856,7 @@ int j; + } + + +-/********* XWMHints funcions *****/ ++/********* XWMHints functions *****/ + + long make_XWMHints (){ + return ((long) calloc(1, sizeof(XWMHints))); +@@ -980,7 +980,7 @@ int j; + } + + +-/********* XTextProperty funcions *****/ ++/********* XTextProperty functions *****/ + + long make_XTextProperty (){ + return ((long) calloc(1, sizeof(XTextProperty))); +@@ -1039,7 +1039,7 @@ long j; + } + + +-/********* XIconSize funcions *****/ ++/********* XIconSize functions *****/ + + long make_XIconSize (){ + return ((long) calloc(1, sizeof(XIconSize))); +@@ -1124,7 +1124,7 @@ int j; + } + + +-/********* XClassHint funcions *****/ ++/********* XClassHint functions *****/ + + long make_XClassHint (){ + return ((long) calloc(1, sizeof(XClassHint))); +@@ -1157,7 +1157,7 @@ long j; + } + + +-/********* XComposeStatus funcions *****/ ++/********* XComposeStatus functions *****/ + + long make_XComposeStatus (){ + return ((long) calloc(1, sizeof(XComposeStatus))); +@@ -1190,7 +1190,7 @@ long j; + } + + +-/********* XVisualInfo funcions *****/ ++/********* XVisualInfo functions *****/ + + long make_XVisualInfo (){ + return ((long) calloc(1, sizeof(XVisualInfo))); +@@ -1327,7 +1327,7 @@ long j; + } + + +-/********* XStandardColormap funcions *****/ ++/********* XStandardColormap functions *****/ + + long make_XStandardColormap (){ + return ((long) calloc(1, sizeof(XStandardColormap))); +--- gcl-2.6.12.orig/xgcl-2/XStruct-4.c ++++ gcl-2.6.12/xgcl-2/XStruct-4.c +@@ -27,7 +27,7 @@ + #include + + +-/********* XExtCodes funcions *****/ ++/********* XExtCodes functions *****/ + + long make_XExtCodes (){ + return ((long) calloc(1, sizeof(XExtCodes))); +@@ -86,7 +86,7 @@ int j; + } + + +-/********* XPixmapFormatValues funcions *****/ ++/********* XPixmapFormatValues functions *****/ + + long make_XPixmapFormatValues (){ + return ((long) calloc(1, sizeof(XPixmapFormatValues))); +@@ -132,7 +132,7 @@ int j; + } + + +-/********* XGCValues funcions *****/ ++/********* XGCValues functions *****/ + + long make_XGCValues (){ + return ((long) calloc(1, sizeof(XGCValues))); +@@ -438,7 +438,7 @@ int j; + } + + +-/********* GC funcions ***** ++/********* GC functions ***** + + int make_GC (){ + GC i; +@@ -525,7 +525,7 @@ int j; + + */ + +-/********* Visual funcions *****/ ++/********* Visual functions *****/ + + long make_Visual (){ + return ((long) calloc(1, sizeof(Visual))); +@@ -636,7 +636,7 @@ long j; + } + + +-/********* Depth funcions *****/ ++/********* Depth functions *****/ + + long make_Depth (){ + return ((long) calloc(1, sizeof(Depth))); +@@ -682,7 +682,7 @@ int j; + } + + +-/********* Screen funcions *****/ ++/********* Screen functions *****/ + + long make_Screen (){ + return ((long) calloc(1, sizeof(Screen))); +@@ -949,7 +949,7 @@ long j; + } + + +-/********* ScreenFormat funcions *****/ ++/********* ScreenFormat functions *****/ + + long make_ScreenFormat (){ + return ((long) calloc(1, sizeof(ScreenFormat))); +@@ -1008,7 +1008,7 @@ long j; + } + + +-/********* XSetWindowAttributes funcions *****/ ++/********* XSetWindowAttributes functions *****/ + + long make_XSetWindowAttributes (){ + return ((long) calloc(1, sizeof(XSetWindowAttributes))); +@@ -1210,7 +1210,7 @@ int j; + } + + +-/********* XWindowAttributes funcions *****/ ++/********* XWindowAttributes functions *****/ + + long make_XWindowAttributes (){ + return ((long) calloc(1, sizeof(XWindowAttributes))); +@@ -1516,7 +1516,7 @@ int j; + } + + +-/********* XHostAddress funcions *****/ ++/********* XHostAddress functions *****/ + + long make_XHostAddress (){ + return ((long) calloc(1, sizeof(XHostAddress))); +@@ -1562,7 +1562,7 @@ int j; + } + + +-/********* XImage funcions *****/ ++/********* XImage functions *****/ + + long make_XImage (){ + return ((long) calloc(1, sizeof(XImage))); +@@ -1777,7 +1777,7 @@ int j; + } + + +-/********* XWindowChanges funcions *****/ ++/********* XWindowChanges functions *****/ + + long make_XWindowChanges (){ + return ((long) calloc(1, sizeof(XWindowChanges))); +@@ -1875,7 +1875,7 @@ int j; + } + + +-/********* XColor funcions *****/ ++/********* XColor functions *****/ + + long make_XColor (){ + return ((long) calloc(1, sizeof(XColor))); +@@ -1960,7 +1960,7 @@ int j; + } + + +-/********* XSegment funcions *****/ ++/********* XSegment functions *****/ + + long make_XSegment (){ + return ((long) calloc(1, sizeof(XSegment))); +@@ -2019,7 +2019,7 @@ int j; + } + + +-/********* XPoint funcions *****/ ++/********* XPoint functions *****/ + + long make_XPoint (){ + return ((long) calloc(1, sizeof(XPoint))); +@@ -2052,7 +2052,7 @@ int j; + } + + +-/********* XRectangle funcions *****/ ++/********* XRectangle functions *****/ + + long make_XRectangle (){ + return ((long) calloc(1, sizeof(XRectangle))); +@@ -2111,7 +2111,7 @@ int j; + } + + +-/********* XArc funcions *****/ ++/********* XArc functions *****/ + + long make_XArc (){ + return ((long) calloc(1, sizeof(XArc))); +@@ -2196,7 +2196,7 @@ int j; + } + + +-/********* XKeyboardControl funcions *****/ ++/********* XKeyboardControl functions *****/ + + long make_XKeyboardControl (){ + return ((long) calloc(1, sizeof(XKeyboardControl))); +@@ -2307,7 +2307,7 @@ int j; + } + + +-/********* XKeyboardState funcions *****/ ++/********* XKeyboardState functions *****/ + + long make_XKeyboardState (){ + return ((long) calloc(1, sizeof(XKeyboardState))); +@@ -2405,7 +2405,7 @@ int j; + } + + +-/********* XTimeCoord funcions *****/ ++/********* XTimeCoord functions *****/ + + long make_XTimeCoord (){ + return ((long) calloc(1, sizeof(XTimeCoord))); +@@ -2451,7 +2451,7 @@ int j; + } + + +-/********* XModifierKeymap funcions *****/ ++/********* XModifierKeymap functions *****/ + + long make_XModifierKeymap (){ + return ((long) calloc(1, sizeof(XModifierKeymap))); +--- gcl-2.6.12.orig/xgcl-2/Xakcl.paper ++++ gcl-2.6.12/xgcl-2/Xakcl.paper +@@ -77,7 +77,7 @@ capabilities and the ease of lisp progra + It is assumed that the reader is familiar with Lisp, and has + some passing knowledge of C. Also familiarity with the Xwindows + library routines and programming conventions would be helpful but is +-not requiered. All X functions in Xakcl begins with the letter 'X' , ++not required. All X functions in Xakcl begin with the letter 'X' , + unless otherwise mentioned. The Syntax and names of Xakcl functions + are kept as closely to the X library functions as possible, so that a + user of the Xwindows' C libary will have no trouble in learning how to +@@ -94,8 +94,8 @@ A. Getting Started. + + + +- In order to start using graphics in Xakcl, a few initilization +-must take place. These initilization correspond to Xwindows call to ++ In order to start using graphics in Xakcl, a few initializations ++must take place. These initializations correspond to Xwindows call to + get the root window, the display, the current screen, the Graphics + Context and other properties needed by X. The use of these features + will be described further in later sections. +@@ -134,7 +134,7 @@ II. The Default Screen and the Root Wind + + The next steps in getting started is to get the desired screen + (usually the default screen), and the root window. These two operations +-are similiar to getting a display and is straight forward. Use the ++are similar to getting a display and is straight forward. Use the + + commands: + +@@ -243,7 +243,7 @@ B. Creating and Using Windows + + I. Creating a Window + +- To create windows in lisp two functions are avaialable, ++ To create windows in lisp two functions are available, + XCreateWindow and XCreateSimpleWindow. Even though XCreateWindow is a + more expansive function, for most applications XCreateSimpleWindow + will do. Below is an example of the use of XCreateSimpleWindow. +@@ -277,7 +277,7 @@ the screen. The user can tell the manag + aspects of a window or drawable by passing to the window manager size + hints. This is done by first creating a structure know as the + Xsizehints. Below are examples of creating an instance of this +-structure, and it's initilization. ++structure, and it's initialization. + + + +@@ -461,7 +461,7 @@ pixel-color. this informaion can be ext + pixel-xcolor). XAllocNamedColo also expects a colormap (the default + colormap will do), a display, and a String specifying the color (for a + list of colors see the file rgb.txt in /usr/lib/X11). Thus the +-following funciton will cause all drawings to be done the specify ++following function will cause all drawings to be done the specified + color. + + (Xsetforeground display GC (Xcolor-pixel pixel-xcolor)) +@@ -505,7 +505,7 @@ valid font is found, will set it in the + (format t "~%can't open font ~a" a-string)) + + First the font is loaded with XloadQueryFont. This function +-expects the display and a string whcih specifies the font (for ++expects the display and a string which specifies the font (for + complete font information see the directories /usr/lib/X11/fonts). + After loading the font must be set in the specified graphics context. + XSetFont expects the font id. This id resides in the XFontStruct +@@ -517,7 +517,7 @@ iv. XSetFunction + Xwindows draws by applying bit operations on the pixel vlaues + on the screen along with a mask that it creates called the plan_mask. + Most often only the pixel already on the screen is manipulated. This +-defualt logical operation is GXcopy (which is the default). However ++default logical operation is GXcopy (which is the default). However + to perform moer complicated operations such as drawing 'ghost' images + (drawing and erasing images with out affecting drawings in the + background) other functions could be used. These functions are +@@ -584,13 +584,13 @@ are the positions. In this case 'window + Thus with the specification in the GC, a line on a specified with will + be drawn. Its cap style will also be drawn accordingly. As in other + drawing request. the display must be specified and a call to Xflush +-must be made in order to request that the X server proccess the ++must be made in order to request that the X server process the + request. + + + II. Drawing Rectangles + +- Drawing Recatangles is similiar to drawing lines. The only ++ Drawing Rectangles is similar to drawing lines. The only + difference is that the size of the recatangle must be specified. + + +@@ -605,7 +605,7 @@ The function expects the x and y positio + II. Drawing Arcs. + + Arcs can form enclosed areas such as elipses or cirlces or +-they coould be a curved line. The funcion XDrawArc will draw arcs. ++they could be a curved line. The function XDrawArc will draw arcs. + + + (XdrawArc *default-display* a-window *default-GC* 100 100 10 10 0 (* 360 64)) +@@ -631,7 +631,7 @@ III. Drawing Text + With the font loaded in the Graphics Context as shown in + Section C, several functions can be called in order to draw text. + Only XDrawString will be dicussed here, but the other functions are +-similiar. ++similar. + + (XDrawString *default-display* a-window *default-GC* 10 15 (get-c-string "hello") 4) + (Xflush *default-display*) +@@ -676,7 +676,7 @@ position text precisely on the screen. + E. Handling Events + + So far only request to the X server to do output on the screen +-have been discussed. X also has a means of getting infomation about ++have been discussed. X also has a means of getting information about + what is inputed by a user as well. The inputs can range from moving + or clicking the mouse to keys being pressed on the keyboard. The + input also encompases events like a window being uncovered or exposed +@@ -700,7 +700,7 @@ the file X.lsp or X.h). + + After Specifiying the input, all events that occur in that + will go on the event queue. The event queue is a queue of what events +-have occured, the first one being on top. The client can both get ++have occurred, the first one being on top. The client can both get + information form the queue and manipulate the queue. + + II. Getting Information form the Event Queue +@@ -718,7 +718,7 @@ description. + XNextEvent is the most commonly used function, even though the + + other functions can be useful as well. Only the call to +-XNextEvent will be discribed because the other functions are similiar ++XNextEvent will be described because the other functions are similar + to XNextEvent. The following functions will get an event from the + queue and retrieve the type of the event along with the window that it + occurs in. +@@ -733,7 +733,7 @@ can occur. In order to handle an event + be assessed. For example, if the PointerMotion event needs to be + handled than the *default-event* must be assessed as a XMotionEvent + structure. Below is an example of getting the x and y position of the +-pointer when a PointerMotion Event has occured, and the pointer is in ++pointer when a PointerMotion Event has occurred, and the pointer is in + the correct window. + + (if (and (eql type MotionNotify) +@@ -751,7 +751,7 @@ III. Manipulating the Event Queue + + For most applications the client will never have to change the + event queue, besides removing events of the top or the queue, however +-sometimes the queue needs to be cleared by the client. The funciton ++sometimes the queue needs to be cleared by the client. The function + XSync can be used to do this. For example: + + (Xsync *default-display* 1) +@@ -765,11 +765,11 @@ XSync can be used to do this. For examp + With the commands demonstarted in this tutorial, most + applications can be managed. Windows can be created, and graphics + operations can be performed. For more complex applications a widget +-set can be created similiar to the X Intrinsics library and the Athena ++set can be created similar to the X Intrinsics library and the Athena + Widget Set. For a lisp like implementation of widgets and an advance + aplications see the GWM application, in the GWM Manual by Colas + Nahaboo. GWM is a generic window manager, that is similar to Xakcl. +-It supports objects that are similiar to Widgets in most C Xwindows ++It supports objects that are similar to Widgets in most C Xwindows + libraries. + + +--- gcl-2.6.12.orig/xgcl-2/gcl_XStruct_l_3.lsp ++++ gcl-2.6.12/xgcl-2/gcl_XStruct_l_3.lsp +@@ -25,7 +25,7 @@ + + + +-;;;;;; XExtCodes funcions ;;;;;; ++;;;;;; XExtCodes functions ;;;;;; + + (defentry make-XExtCodes () ( fixnum "make_XExtCodes" )) + (defentry XExtCodes-first_error (fixnum) ( fixnum "XExtCodes_first_error" )) +@@ -38,7 +38,7 @@ + (defentry set-XExtCodes-extension (fixnum fixnum) ( void "set_XExtCodes_extension" )) + + +-;;;;;; XPixmapFormatValues funcions ;;;;;; ++;;;;;; XPixmapFormatValues functions ;;;;;; + + (defentry make-XPixmapFormatValues () ( fixnum "make_XPixmapFormatValues" )) + (defentry XPixmapFormatValues-scanline_pad (fixnum) ( fixnum "XPixmapFormatValues_scanline_pad" )) +@@ -49,7 +49,7 @@ + (defentry set-XPixmapFormatValues-depth (fixnum fixnum) ( void "set_XPixmapFormatValues_depth" )) + + +-;;;;;; XGCValues funcions ;;;;;; ++;;;;;; XGCValues functions ;;;;;; + + (defentry make-XGCValues () ( fixnum "make_XGCValues" )) + (defentry XGCValues-dashes (fixnum) ( char "XGCValues_dashes" )) +@@ -100,7 +100,7 @@ + (defentry set-XGCValues-function (fixnum fixnum) ( void "set_XGCValues_function" )) + + +-;;;;;; *GC funcions ;;;;;; ++;;;;;; *GC functions ;;;;;; + + ;;(defentry make-*GC () ( fixnum "make_*GC" )) + ;;(defentry *GC-values (fixnum) ( fixnum "*GC_values" )) +@@ -117,7 +117,7 @@ + ;;(defentry set-*GC-ext_data (fixnum fixnum) ( void "set_*GC_ext_data" )) + + +-;;;;;; Visual funcions ;;;;;; ++;;;;;; Visual functions ;;;;;; + + (defentry make-Visual () ( fixnum "make_Visual" )) + (defentry Visual-map_entries (fixnum) ( fixnum "Visual_map_entries" )) +@@ -138,7 +138,7 @@ + (defentry set-Visual-ext_data (fixnum fixnum) ( void "set_Visual_ext_data" )) + + +-;;;;;; Depth funcions ;;;;;; ++;;;;;; Depth functions ;;;;;; + + (defentry make-Depth () ( fixnum "make_Depth" )) + (defentry Depth-visuals (fixnum) ( fixnum "Depth_visuals" )) +@@ -149,7 +149,7 @@ + (defentry set-Depth-depth (fixnum fixnum) ( void "set_Depth_depth" )) + + +-;;;;;; Screen funcions ;;;;;; ++;;;;;; Screen functions ;;;;;; + + (defentry make-Screen () ( fixnum "make_Screen" )) + (defentry Screen-root_input_mask (fixnum) ( fixnum "Screen_root_input_mask" )) +@@ -194,7 +194,7 @@ + (defentry set-Screen-ext_data (fixnum fixnum) ( void "set_Screen_ext_data" )) + + +-;;;;;; ScreenFormat funcions ;;;;;; ++;;;;;; ScreenFormat functions ;;;;;; + + (defentry make-ScreenFormat () ( fixnum "make_ScreenFormat" )) + (defentry ScreenFormat-scanline_pad (fixnum) ( fixnum "ScreenFormat_scanline_pad" )) +@@ -207,7 +207,7 @@ + (defentry set-ScreenFormat-ext_data (fixnum fixnum) ( void "set_ScreenFormat_ext_data" )) + + +-;;;;;; XSetWindowAttributes funcions ;;;;;; ++;;;;;; XSetWindowAttributes functions ;;;;;; + + (defentry make-XSetWindowAttributes () ( fixnum "make_XSetWindowAttributes" )) + (defentry XSetWindowAttributes-cursor (fixnum) ( fixnum "XSetWindowAttributes_cursor" )) +@@ -242,7 +242,7 @@ + (defentry set-XSetWindowAttributes-background_pixmap (fixnum fixnum) ( void "set_XSetWindowAttributes_background_pixmap" )) + + +-;;;;;; XWindowAttributes funcions ;;;;;; ++;;;;;; XWindowAttributes functions ;;;;;; + + (defentry make-XWindowAttributes () ( fixnum "make_XWindowAttributes" )) + (defentry XWindowAttributes-screen (fixnum) ( fixnum "XWindowAttributes_screen" )) +@@ -293,7 +293,7 @@ + (defentry set-XWindowAttributes-x (fixnum fixnum) ( void "set_XWindowAttributes_x" )) + + +-;;;;;; XHostAddress funcions ;;;;;; ++;;;;;; XHostAddress functions ;;;;;; + + (defentry make-XHostAddress () ( fixnum "make_XHostAddress" )) + (defentry XHostAddress-address (fixnum) ( fixnum "XHostAddress_address" )) +@@ -304,7 +304,7 @@ + (defentry set-XHostAddress-family (fixnum fixnum) ( void "set_XHostAddress_family" )) + + +-;;;;;; XImage funcions ;;;;;; ++;;;;;; XImage functions ;;;;;; + + (defentry make-XImage () ( fixnum "make_XImage" )) + ;;(defentry XImage-f (fixnum) ( fixnum "XImage_f" )) +@@ -343,7 +343,7 @@ + (defentry set-XImage-width (fixnum fixnum) ( void "set_XImage_width" )) + + +-;;;;;; XWindowChanges funcions ;;;;;; ++;;;;;; XWindowChanges functions ;;;;;; + + (defentry make-XWindowChanges () ( fixnum "make_XWindowChanges" )) + (defentry XWindowChanges-stack_mode (fixnum) ( fixnum "XWindowChanges_stack_mode" )) +@@ -362,7 +362,7 @@ + (defentry set-XWindowChanges-x (fixnum fixnum) ( void "set_XWindowChanges_x" )) + + +-;;;;;; XColor funcions ;;;;;; ++;;;;;; XColor functions ;;;;;; + + (defentry make-XColor () ( fixnum "make_XColor" )) + (defentry XColor-pad (fixnum) ( char "XColor_pad" )) +@@ -379,7 +379,7 @@ + (defentry set-XColor-pixel (fixnum fixnum) ( void "set_XColor_pixel" )) + + +-;;;;;; XSegment funcions ;;;;;; ++;;;;;; XSegment functions ;;;;;; + + (defentry make-XSegment () ( fixnum "make_XSegment" )) + (defentry XSegment-y2 (fixnum) ( fixnum "XSegment_y2" )) +@@ -392,7 +392,7 @@ + (defentry set-XSegment-x1 (fixnum fixnum) ( void "set_XSegment_x1" )) + + +-;;;;;; XPoint funcions ;;;;;; ++;;;;;; XPoint functions ;;;;;; + + (defentry make-XPoint () ( fixnum "make_XPoint" )) + (defentry XPoint-y (fixnum) ( fixnum "XPoint_y" )) +@@ -401,7 +401,7 @@ + (defentry set-XPoint-x (fixnum fixnum) ( void "set_XPoint_x" )) + + +-;;;;;; XRectangle funcions ;;;;;; ++;;;;;; XRectangle functions ;;;;;; + + (defentry make-XRectangle () ( fixnum "make_XRectangle" )) + (defentry XRectangle-height (fixnum) ( fixnum "XRectangle_height" )) +@@ -414,7 +414,7 @@ + (defentry set-XRectangle-x (fixnum fixnum) ( void "set_XRectangle_x" )) + + +-;;;;;; XArc funcions ;;;;;; ++;;;;;; XArc functions ;;;;;; + + (defentry make-XArc () ( fixnum "make_XArc" )) + (defentry XArc-angle2 (fixnum) ( fixnum "XArc_angle2" )) +@@ -431,7 +431,7 @@ + (defentry set-XArc-x (fixnum fixnum) ( void "set_XArc_x" )) + + +-;;;;;; XKeyboardControl funcions ;;;;;; ++;;;;;; XKeyboardControl functions ;;;;;; + + (defentry make-XKeyboardControl () ( fixnum "make_XKeyboardControl" )) + (defentry XKeyboardControl-auto_repeat_mode (fixnum) ( fixnum "XKeyboardControl_auto_repeat_mode" )) +@@ -452,7 +452,7 @@ + (defentry set-XKeyboardControl-key_click_percent (fixnum fixnum) ( void "set_XKeyboardControl_key_click_percent" )) + + +-;;;;;; XKeyboardState funcions ;;;;;; ++;;;;;; XKeyboardState functions ;;;;;; + + (defentry make-XKeyboardState () ( fixnum "make_XKeyboardState" )) + (defentry XKeyboardState-auto_repeats (fixnum) ( fixnum "XKeyboardState_auto_repeats" )) +@@ -471,7 +471,7 @@ + (defentry set-XKeyboardState-key_click_percent (fixnum fixnum) ( void "set_XKeyboardState_key_click_percent" )) + + +-;;;;;; XTimeCoord funcions ;;;;;; ++;;;;;; XTimeCoord functions ;;;;;; + + (defentry make-XTimeCoord () ( fixnum "make_XTimeCoord" )) + (defentry XTimeCoord-y (fixnum) ( fixnum "XTimeCoord_y" )) +@@ -482,7 +482,7 @@ + (defentry set-XTimeCoord-time (fixnum fixnum) ( void "set_XTimeCoord_time" )) + + +-;;;;;; XModifierKeymap funcions ;;;;;; ++;;;;;; XModifierKeymap functions ;;;;;; + + (defentry make-XModifierKeymap () ( fixnum "make_XModifierKeymap" )) + (defentry XModifierKeymap-modifiermap (fixnum) ( fixnum "XModifierKeymap_modifiermap" )) +--- gcl-2.6.12.orig/xgcl-2/gcl_Xakcl.example.lsp ++++ gcl-2.6.12/xgcl-2/gcl_Xakcl.example.lsp +@@ -136,8 +136,8 @@ + ;;;;;;;;;;;;;;;;;;;;;; + ;;this function tracks the mouse. when the mouse button is pressed a + ;;line is drawn from the previous position to the current position. +-;;this funciton also shows a way of handling exposure events. the +-;;positions are remebered in order to redraw the contents of the window ++;;this function also shows a way of handling exposure events. The ++;;positions are remembered in order to redraw the contents of the window + ;;when it is exposed. this function handles events in two windows, the + ;;quit window and the draw window. there is an example of setting the + ;;input for a window. the draw window can have button press events, +@@ -272,7 +272,7 @@ + ;;this function draws a ghst line by setting the X function to GXXor. and the + ;;foreground color to th logxor of the back and foreground pixel + ;;this function actually changes the graphics context. and does not change it back +-;;to use the ghost method and switch back to regular drawing. set the funciton ++;;to use the ghost method and switch back to regular drawing. set the function + ;;back to GXcopy and the foregorund pixel appropriately + + (defun do-ghost-line-1 (a-window) +--- gcl-2.6.12.orig/xgcl-2/gcl_Xinit.lsp ++++ gcl-2.6.12/xgcl-2/gcl_Xinit.lsp +@@ -30,10 +30,10 @@ + ;;a C struct in X starts with a 'make' followed by the structure name. all + ;;functions involved in getting a field of a C struct strats with the + ;;name of the C struct followed by the name of the field. the +-;;parameters it excepts is the varaible contaning the structure. all ++;;parameters it excepts is the variable contaning the structure. all + ;;functions to set a field of a C struct starts with 'set' followed by + ;;the C struct name followed by the field name. these functions accept +-;;as parameter, the varaible containing the struct and the value to be ++;;as parameter, the variable containing the struct and the value to be + ;;put in the field. + + ;;;; +@@ -82,7 +82,7 @@ + + + ;;;;;;;;;;;;;;;;;;;;;; +-;;this function initializes all varaibles needed by most applications. ++;;this function initializes all variables needed by most applications. + ;;it uses all defaults which is inherited from the root window, and + ;;screen. + +--- gcl-2.6.12.orig/xgcl-2/gcl_Xstruct.lsp ++++ gcl-2.6.12/xgcl-2/gcl_Xstruct.lsp +@@ -25,7 +25,7 @@ + + + +-;;;;;; _XQEvent funcions ;;;;;; ++;;;;;; _XQEvent functions ;;;;;; + + (defentry make-_XQEvent () ( fixnum "make__XQEvent" )) + (defentry _XQEvent-event (fixnum) ( fixnum "_XQEvent_event" )) +@@ -34,7 +34,7 @@ + (defentry set-_XQEvent-next (fixnum fixnum) ( void "set__XQEvent_next" )) + + +-;;;;;; XCharStruct funcions ;;;;;; ++;;;;;; XCharStruct functions ;;;;;; + + (defentry make-XCharStruct () ( fixnum "make_XCharStruct" )) + (defentry XCharStruct-attributes (fixnum) ( fixnum "XCharStruct_attributes" )) +@@ -51,7 +51,7 @@ + (defentry set-XCharStruct-lbearing (fixnum fixnum) ( void "set_XCharStruct_lbearing" )) + + +-;;;;;; XFontProp funcions ;;;;;; ++;;;;;; XFontProp functions ;;;;;; + + (defentry make-XFontProp () ( fixnum "make_XFontProp" )) + (defentry XFontProp-card32 (fixnum) ( fixnum "XFontProp_card32" )) +@@ -60,7 +60,7 @@ + (defentry set-XFontProp-name (fixnum fixnum) ( void "set_XFontProp_name" )) + + +-;;;;;; XFontStruct funcions ;;;;;; ++;;;;;; XFontStruct functions ;;;;;; + + (defentry make-XFontStruct () ( fixnum "make_XFontStruct" )) + (defentry XFontStruct-descent (fixnum) ( fixnum "XFontStruct_descent" )) +@@ -97,7 +97,7 @@ + (defentry set-XFontStruct-ext_data (fixnum fixnum) ( void "set_XFontStruct_ext_data" )) + + +-;;;;;; XTextItem funcions ;;;;;; ++;;;;;; XTextItem functions ;;;;;; + + (defentry make-XTextItem () ( fixnum "make_XTextItem" )) + (defentry XTextItem-font (fixnum) ( fixnum "XTextItem_font" )) +@@ -110,7 +110,7 @@ + (defentry set-XTextItem-chars (fixnum fixnum) ( void "set_XTextItem_chars" )) + + +-;;;;;; XChar2b funcions ;;;;;; ++;;;;;; XChar2b functions ;;;;;; + + (defentry make-XChar2b () ( fixnum "make_XChar2b" )) + (defentry XChar2b-byte2 (fixnum) ( char "XChar2b_byte2" )) +@@ -119,7 +119,7 @@ + (defentry set-XChar2b-byte1 (fixnum char) ( void "set_XChar2b_byte1" )) + + +-;;;;;; XTextItem16 funcions ;;;;;; ++;;;;;; XTextItem16 functions ;;;;;; + + (defentry make-XTextItem16 () ( fixnum "make_XTextItem16" )) + (defentry XTextItem16-font (fixnum) ( fixnum "XTextItem16_font" )) +@@ -132,7 +132,7 @@ + (defentry set-XTextItem16-chars (fixnum fixnum) ( void "set_XTextItem16_chars" )) + + +-;;;;;; XEDataObject funcions ;;;;;; ++;;;;;; XEDataObject functions ;;;;;; + + (defentry make-XEDataObject () ( fixnum "make_XEDataObject" )) + (defentry XEDataObject-font (fixnum) ( fixnum "XEDataObject_font" )) +@@ -147,7 +147,7 @@ + (defentry set-XEDataObject-gc (fixnum fixnum) ( void "set_XEDataObject_gc" )) + + +-;;;;;; XSizeHints funcions ;;;;;; ++;;;;;; XSizeHints functions ;;;;;; + + (defentry make-XSizeHints () ( fixnum "make_XSizeHints" )) + (defentry XSizeHints-win_gravity (fixnum) ( fixnum "XSizeHints_win_gravity" )) +@@ -190,7 +190,7 @@ + (defentry set-XSizeHints-flags (fixnum fixnum) ( void "set_XSizeHints_flags" )) + + +-;;;;;; XWMHints funcions ;;;;;; ++;;;;;; XWMHints functions ;;;;;; + + (defentry make-XWMHints () ( fixnum "make_XWMHints" )) + (defentry XWMHints-window_group (fixnum) ( fixnum "XWMHints_window_group" )) +@@ -213,7 +213,7 @@ + (defentry set-XWMHints-flags (fixnum fixnum) ( void "set_XWMHints_flags" )) + + +-;;;;;; XTextProperty funcions ;;;;;; ++;;;;;; XTextProperty functions ;;;;;; + + (defentry make-XTextProperty () ( fixnum "make_XTextProperty" )) + (defentry XTextProperty-nitems (fixnum) ( fixnum "XTextProperty_nitems" )) +@@ -226,7 +226,7 @@ + (defentry set-XTextProperty-value (fixnum fixnum) ( void "set_XTextProperty_value" )) + + +-;;;;;; XIconSize funcions ;;;;;; ++;;;;;; XIconSize functions ;;;;;; + + (defentry make-XIconSize () ( fixnum "make_XIconSize" )) + (defentry XIconSize-height_inc (fixnum) ( fixnum "XIconSize_height_inc" )) +@@ -243,7 +243,7 @@ + (defentry set-XIconSize-min_width (fixnum fixnum) ( void "set_XIconSize_min_width" )) + + +-;;;;;; XClassHint funcions ;;;;;; ++;;;;;; XClassHint functions ;;;;;; + + (defentry make-XClassHint () ( fixnum "make_XClassHint" )) + (defentry XClassHint-res_class (fixnum) ( fixnum "XClassHint_res_class" )) +@@ -252,7 +252,7 @@ + (defentry set-XClassHint-res_name (fixnum fixnum) ( void "set_XClassHint_res_name" )) + + +-;;;;;; XComposeStatus funcions ;;;;;; ++;;;;;; XComposeStatus functions ;;;;;; + + (defentry make-XComposeStatus () ( fixnum "make_XComposeStatus" )) + (defentry XComposeStatus-chars_matched (fixnum) ( fixnum "XComposeStatus_chars_matched" )) +@@ -261,7 +261,7 @@ + (defentry set-XComposeStatus-compose_ptr (fixnum fixnum) ( void "set_XComposeStatus_compose_ptr" )) + + +-;;;;;; XVisualInfo funcions ;;;;;; ++;;;;;; XVisualInfo functions ;;;;;; + + (defentry make-XVisualInfo () ( fixnum "make_XVisualInfo" )) + (defentry XVisualInfo-bits_per_rgb (fixnum) ( fixnum "XVisualInfo_bits_per_rgb" )) +@@ -286,7 +286,7 @@ + (defentry set-XVisualInfo-visual (fixnum fixnum) ( void "set_XVisualInfo_visual" )) + + +-;;;;;; XStandardColormap funcions ;;;;;; ++;;;;;; XStandardColormap functions ;;;;;; + + (defentry make-XStandardColormap () ( fixnum "make_XStandardColormap" )) + (defentry XStandardColormap-killid (fixnum) ( fixnum "XStandardColormap_killid" )) +--- gcl-2.6.12.orig/xgcl-2/gcl_defentry_events.lsp ++++ gcl-2.6.12/xgcl-2/gcl_defentry_events.lsp +@@ -23,7 +23,7 @@ + ; See the file dec.copyright for details. + + +-;;;;;; XKeyEvent funcions ;;;;;; ++;;;;;; XKeyEvent functions ;;;;;; + + (defentry make-XKeyEvent () ( fixnum "make_XKeyEvent" )) + (defentry XKeyEvent-same_screen (fixnum) ( fixnum "XKeyEvent_same_screen" )) +@@ -58,7 +58,7 @@ + (defentry set-XKeyEvent-type (fixnum fixnum) ( void "set_XKeyEvent_type" )) + + +-;;;;;; XButtonEvent funcions ;;;;;; ++;;;;;; XButtonEvent functions ;;;;;; + + (defentry make-XButtonEvent () ( fixnum "make_XButtonEvent" )) + (defentry XButtonEvent-same_screen (fixnum) ( fixnum "XButtonEvent_same_screen" )) +@@ -93,7 +93,7 @@ + (defentry set-XButtonEvent-type (fixnum fixnum) ( void "set_XButtonEvent_type" )) + + +-;;;;;; XMotionEvent funcions ;;;;;; ++;;;;;; XMotionEvent functions ;;;;;; + + (defentry make-XMotionEvent () ( fixnum "make_XMotionEvent" )) + (defentry XMotionEvent-same_screen (fixnum) ( fixnum "XMotionEvent_same_screen" )) +@@ -128,7 +128,7 @@ + (defentry set-XMotionEvent-type (fixnum fixnum) ( void "set_XMotionEvent_type" )) + + +-;;;;;; XCrossingEvent funcions ;;;;;; ++;;;;;; XCrossingEvent functions ;;;;;; + + (defentry make-XCrossingEvent () ( fixnum "make_XCrossingEvent" )) + (defentry XCrossingEvent-state (fixnum) ( fixnum "XCrossingEvent_state" )) +@@ -167,7 +167,7 @@ + (defentry set-XCrossingEvent-type (fixnum fixnum) ( void "set_XCrossingEvent_type" )) + + +-;;;;;; XFocusChangeEvent funcions ;;;;;; ++;;;;;; XFocusChangeEvent functions ;;;;;; + + (defentry make-XFocusChangeEvent () ( fixnum "make_XFocusChangeEvent" )) + (defentry XFocusChangeEvent-detail (fixnum) ( fixnum "XFocusChangeEvent_detail" )) +@@ -186,7 +186,7 @@ + (defentry set-XFocusChangeEvent-type (fixnum fixnum) ( void "set_XFocusChangeEvent_type" )) + + +-;;;;;; XKeymapEvent funcions ;;;;;; ++;;;;;; XKeymapEvent functions ;;;;;; + + (defentry make-XKeymapEvent () ( fixnum "make_XKeymapEvent" )) + ;;(defentry XKeymapEvent-key_vector[32] (fixnum) ( char "XKeymapEvent_key_vector[32]" )) +@@ -203,7 +203,7 @@ + (defentry set-XKeymapEvent-type (fixnum fixnum) ( void "set_XKeymapEvent_type" )) + + +-;;;;;; XExposeEvent funcions ;;;;;; ++;;;;;; XExposeEvent functions ;;;;;; + + (defentry make-XExposeEvent () ( fixnum "make_XExposeEvent" )) + (defentry XExposeEvent-count (fixnum) ( fixnum "XExposeEvent_count" )) +@@ -228,7 +228,7 @@ + (defentry set-XExposeEvent-type (fixnum fixnum) ( void "set_XExposeEvent_type" )) + + +-;;;;;; XGraphicsExposeEvent funcions ;;;;;; ++;;;;;; XGraphicsExposeEvent functions ;;;;;; + + (defentry make-XGraphicsExposeEvent () ( fixnum "make_XGraphicsExposeEvent" )) + (defentry XGraphicsExposeEvent-minor_code (fixnum) ( fixnum "XGraphicsExposeEvent_minor_code" )) +@@ -257,7 +257,7 @@ + (defentry set-XGraphicsExposeEvent-type (fixnum fixnum) ( void "set_XGraphicsExposeEvent_type" )) + + +-;;;;;; XNoExposeEvent funcions ;;;;;; ++;;;;;; XNoExposeEvent functions ;;;;;; + + (defentry make-XNoExposeEvent () ( fixnum "make_XNoExposeEvent" )) + (defentry XNoExposeEvent-minor_code (fixnum) ( fixnum "XNoExposeEvent_minor_code" )) +@@ -276,7 +276,7 @@ + (defentry set-XNoExposeEvent-type (fixnum fixnum) ( void "set_XNoExposeEvent_type" )) + + +-;;;;;; XVisibilityEvent funcions ;;;;;; ++;;;;;; XVisibilityEvent functions ;;;;;; + + (defentry make-XVisibilityEvent () ( fixnum "make_XVisibilityEvent" )) + (defentry XVisibilityEvent-state (fixnum) ( fixnum "XVisibilityEvent_state" )) +@@ -293,7 +293,7 @@ + (defentry set-XVisibilityEvent-type (fixnum fixnum) ( void "set_XVisibilityEvent_type" )) + + +-;;;;;; XCreateWindowEvent funcions ;;;;;; ++;;;;;; XCreateWindowEvent functions ;;;;;; + + (defentry make-XCreateWindowEvent () ( fixnum "make_XCreateWindowEvent" )) + (defentry XCreateWindowEvent-override_redirect (fixnum) ( fixnum "XCreateWindowEvent_override_redirect" )) +@@ -322,7 +322,7 @@ + (defentry set-XCreateWindowEvent-type (fixnum fixnum) ( void "set_XCreateWindowEvent_type" )) + + +-;;;;;; XDestroyWindowEvent funcions ;;;;;; ++;;;;;; XDestroyWindowEvent functions ;;;;;; + + (defentry make-XDestroyWindowEvent () ( fixnum "make_XDestroyWindowEvent" )) + (defentry XDestroyWindowEvent-window (fixnum) ( fixnum "XDestroyWindowEvent_window" )) +@@ -339,7 +339,7 @@ + (defentry set-XDestroyWindowEvent-type (fixnum fixnum) ( void "set_XDestroyWindowEvent_type" )) + + +-;;;;;; XUnmapEvent funcions ;;;;;; ++;;;;;; XUnmapEvent functions ;;;;;; + + (defentry make-XUnmapEvent () ( fixnum "make_XUnmapEvent" )) + (defentry XUnmapEvent-from_configure (fixnum) ( fixnum "XUnmapEvent_from_configure" )) +@@ -358,7 +358,7 @@ + (defentry set-XUnmapEvent-type (fixnum fixnum) ( void "set_XUnmapEvent_type" )) + + +-;;;;;; XMapEvent funcions ;;;;;; ++;;;;;; XMapEvent functions ;;;;;; + + (defentry make-XMapEvent () ( fixnum "make_XMapEvent" )) + (defentry XMapEvent-override_redirect (fixnum) ( fixnum "XMapEvent_override_redirect" )) +@@ -377,7 +377,7 @@ + (defentry set-XMapEvent-type (fixnum fixnum) ( void "set_XMapEvent_type" )) + + +-;;;;;; XMapRequestEvent funcions ;;;;;; ++;;;;;; XMapRequestEvent functions ;;;;;; + + (defentry make-XMapRequestEvent () ( fixnum "make_XMapRequestEvent" )) + (defentry XMapRequestEvent-window (fixnum) ( fixnum "XMapRequestEvent_window" )) +@@ -394,7 +394,7 @@ + (defentry set-XMapRequestEvent-type (fixnum fixnum) ( void "set_XMapRequestEvent_type" )) + + +-;;;;;; XReparentEvent funcions ;;;;;; ++;;;;;; XReparentEvent functions ;;;;;; + + (defentry make-XReparentEvent () ( fixnum "make_XReparentEvent" )) + (defentry XReparentEvent-override_redirect (fixnum) ( fixnum "XReparentEvent_override_redirect" )) +@@ -419,7 +419,7 @@ + (defentry set-XReparentEvent-type (fixnum fixnum) ( void "set_XReparentEvent_type" )) + + +-;;;;;; XConfigureEvent funcions ;;;;;; ++;;;;;; XConfigureEvent functions ;;;;;; + + (defentry make-XConfigureEvent () ( fixnum "make_XConfigureEvent" )) + (defentry XConfigureEvent-override_redirect (fixnum) ( fixnum "XConfigureEvent_override_redirect" )) +@@ -450,7 +450,7 @@ + (defentry set-XConfigureEvent-type (fixnum fixnum) ( void "set_XConfigureEvent_type" )) + + +-;;;;;; XGravityEvent funcions ;;;;;; ++;;;;;; XGravityEvent functions ;;;;;; + + (defentry make-XGravityEvent () ( fixnum "make_XGravityEvent" )) + (defentry XGravityEvent-y (fixnum) ( fixnum "XGravityEvent_y" )) +@@ -471,7 +471,7 @@ + (defentry set-XGravityEvent-type (fixnum fixnum) ( void "set_XGravityEvent_type" )) + + +-;;;;;; XResizeRequestEvent funcions ;;;;;; ++;;;;;; XResizeRequestEvent functions ;;;;;; + + (defentry make-XResizeRequestEvent () ( fixnum "make_XResizeRequestEvent" )) + (defentry XResizeRequestEvent-height (fixnum) ( fixnum "XResizeRequestEvent_height" )) +@@ -490,7 +490,7 @@ + (defentry set-XResizeRequestEvent-type (fixnum fixnum) ( void "set_XResizeRequestEvent_type" )) + + +-;;;;;; XConfigureRequestEvent funcions ;;;;;; ++;;;;;; XConfigureRequestEvent functions ;;;;;; + + (defentry make-XConfigureRequestEvent () ( fixnum "make_XConfigureRequestEvent" )) + (defentry XConfigureRequestEvent-value_mask (fixnum) ( fixnum "XConfigureRequestEvent_value_mask" )) +@@ -523,7 +523,7 @@ + (defentry set-XConfigureRequestEvent-type (fixnum fixnum) ( void "set_XConfigureRequestEvent_type" )) + + +-;;;;;; XCirculateEvent funcions ;;;;;; ++;;;;;; XCirculateEvent functions ;;;;;; + + (defentry make-XCirculateEvent () ( fixnum "make_XCirculateEvent" )) + (defentry XCirculateEvent-place (fixnum) ( fixnum "XCirculateEvent_place" )) +@@ -542,7 +542,7 @@ + (defentry set-XCirculateEvent-type (fixnum fixnum) ( void "set_XCirculateEvent_type" )) + + +-;;;;;; XCirculateRequestEvent funcions ;;;;;; ++;;;;;; XCirculateRequestEvent functions ;;;;;; + + (defentry make-XCirculateRequestEvent () ( fixnum "make_XCirculateRequestEvent" )) + (defentry XCirculateRequestEvent-place (fixnum) ( fixnum "XCirculateRequestEvent_place" )) +@@ -561,7 +561,7 @@ + (defentry set-XCirculateRequestEvent-type (fixnum fixnum) ( void "set_XCirculateRequestEvent_type" )) + + +-;;;;;; XPropertyEvent funcions ;;;;;; ++;;;;;; XPropertyEvent functions ;;;;;; + + (defentry make-XPropertyEvent () ( fixnum "make_XPropertyEvent" )) + (defentry XPropertyEvent-state (fixnum) ( fixnum "XPropertyEvent_state" )) +@@ -582,7 +582,7 @@ + (defentry set-XPropertyEvent-type (fixnum fixnum) ( void "set_XPropertyEvent_type" )) + + +-;;;;;; XSelectionClearEvent funcions ;;;;;; ++;;;;;; XSelectionClearEvent functions ;;;;;; + + (defentry make-XSelectionClearEvent () ( fixnum "make_XSelectionClearEvent" )) + (defentry XSelectionClearEvent-time (fixnum) ( fixnum "XSelectionClearEvent_time" )) +@@ -601,7 +601,7 @@ + (defentry set-XSelectionClearEvent-type (fixnum fixnum) ( void "set_XSelectionClearEvent_type" )) + + +-;;;;;; XSelectionRequestEvent funcions ;;;;;; ++;;;;;; XSelectionRequestEvent functions ;;;;;; + + (defentry make-XSelectionRequestEvent () ( fixnum "make_XSelectionRequestEvent" )) + (defentry XSelectionRequestEvent-time (fixnum) ( fixnum "XSelectionRequestEvent_time" )) +@@ -626,7 +626,7 @@ + (defentry set-XSelectionRequestEvent-type (fixnum fixnum) ( void "set_XSelectionRequestEvent_type" )) + + +-;;;;;; XSelectionEvent funcions ;;;;;; ++;;;;;; XSelectionEvent functions ;;;;;; + + (defentry make-XSelectionEvent () ( fixnum "make_XSelectionEvent" )) + (defentry XSelectionEvent-time (fixnum) ( fixnum "XSelectionEvent_time" )) +@@ -649,7 +649,7 @@ + (defentry set-XSelectionEvent-type (fixnum fixnum) ( void "set_XSelectionEvent_type" )) + + +-;;;;;; XColormapEvent funcions ;;;;;; ++;;;;;; XColormapEvent functions ;;;;;; + + (defentry make-XColormapEvent () ( fixnum "make_XColormapEvent" )) + (defentry XColormapEvent-state (fixnum) ( fixnum "XColormapEvent_state" )) +@@ -670,7 +670,7 @@ + (defentry set-XColormapEvent-type (fixnum fixnum) ( void "set_XColormapEvent_type" )) + + +-;;;;;; XClientMessageEvent funcions ;;;;;; ++;;;;;; XClientMessageEvent functions ;;;;;; + + (defentry make-XClientMessageEvent () ( fixnum "make_XClientMessageEvent" )) + (defentry XClientMessageEvent-format (fixnum) ( fixnum "XClientMessageEvent_format" )) +@@ -689,7 +689,7 @@ + (defentry set-XClientMessageEvent-type (fixnum fixnum) ( void "set_XClientMessageEvent_type" )) + + +-;;;;;; XMappingEvent funcions ;;;;;; ++;;;;;; XMappingEvent functions ;;;;;; + + (defentry make-XMappingEvent () ( fixnum "make_XMappingEvent" )) + (defentry XMappingEvent-count (fixnum) ( fixnum "XMappingEvent_count" )) +@@ -710,7 +710,7 @@ + (defentry set-XMappingEvent-type (fixnum fixnum) ( void "set_XMappingEvent_type" )) + + +-;;;;;; XErrorEvent funcions ;;;;;; ++;;;;;; XErrorEvent functions ;;;;;; + + (defentry make-XErrorEvent () ( fixnum "make_XErrorEvent" )) + (defentry XErrorEvent-minor_code (fixnum) ( char "XErrorEvent_minor_code" )) +@@ -729,7 +729,7 @@ + (defentry set-XErrorEvent-type (fixnum fixnum) ( void "set_XErrorEvent_type" )) + + +-;;;;;; XAnyEvent funcions ;;;;;; ++;;;;;; XAnyEvent functions ;;;;;; + + (defentry make-XAnyEvent () ( fixnum "make_XAnyEvent" )) + (defentry XAnyEvent-window (fixnum) ( fixnum "XAnyEvent_window" )) +@@ -744,7 +744,7 @@ + (defentry set-XAnyEvent-type (fixnum fixnum) ( void "set_XAnyEvent_type" )) + + +-;;;;;; XEvent funcions ;;;;;; ++;;;;;; XEvent functions ;;;;;; + + (defentry make-XEvent () ( fixnum "make_XEvent" )) + ;;(defentry XEvent-pad[24] (fixnum) ( fixnum "XEvent_pad[24]" )) +--- gcl-2.6.12.orig/xgcl-2/gcl_keysymdef.lsp ++++ gcl-2.6.12/xgcl-2/gcl_keysymdef.lsp +@@ -133,7 +133,7 @@ + + + ;; +- ; Auxilliary Functions; note the duplicate definitions for left and right ++ ; Auxiliary Functions; note the duplicate definitions for left and right + ; function keys; Sun keyboards and a few other manufactures have such + ; function key groups on the left and/or right sides of the keyboard. + ; We've not found a keyboard with more than 35 function keys total. diff --git a/debian/patches/Version_2_6_13pre129 b/debian/patches/Version_2_6_13pre129 new file mode 100644 index 0000000..5670e60 --- /dev/null +++ b/debian/patches/Version_2_6_13pre129 @@ -0,0 +1,31 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-129) unstable; urgency=medium + . + * Version_2.6.13pre129 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2022-11-13 + +--- gcl-2.6.12.orig/git.tag ++++ gcl-2.6.12/git.tag +@@ -1,2 +1,2 @@ +-"Version_2_6_13pre128" ++"Version_2_6_13pre129" + diff --git a/debian/patches/Version_2_6_13pre13 b/debian/patches/Version_2_6_13pre13 new file mode 100644 index 0000000..f019ef7 --- /dev/null +++ b/debian/patches/Version_2_6_13pre13 @@ -0,0 +1,103 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-12) unstable; urgency=medium + . + * Version_2_6_13pre13 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1918,7 +1918,7 @@ void + allocate_code_block_reserve(void); + + void * +-alloc_contblock_no_gc(size_t); ++alloc_contblock_no_gc(size_t,char *); + + void + reset_contblock_freelist(void); +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1047,7 +1047,7 @@ alloc_contblock(size_t n) { + } + + void * +-alloc_contblock_no_gc(size_t n) { ++alloc_contblock_no_gc(size_t n,char *limit) { + + struct typemanager *tm=tm_of(t_contiguous); + void *p; +@@ -1057,7 +1057,7 @@ alloc_contblock_no_gc(size_t n) { + if ((p=alloc_from_freelist(tm,n))) + return p; + +- if (tpage(tm,n)<(rb_start-heap_end)>>PAGEWIDTH && (p=alloc_after_adding_pages(tm,n))) ++ if (tpage(tm,n)<(limit-heap_end)>>PAGEWIDTH && (p=alloc_after_adding_pages(tm,n))) + return p; + + return NULL; +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -431,29 +431,21 @@ collecting(void *p) { + + static ufixnum ngc_thresh; + static union {struct dummy d;ufixnum f;} rst={.f=-1}; +-/* static object lcv=Cnil; */ ++static void *static_promotion_limit; + + static inline void + mark_leaf_data(object x,void **pp,ufixnum s,ufixnum r) { + +- void *p=*pp,*dp/* ,*dpe */; ++ void *p=*pp,*dp; + + if (!marking(p)||!collecting(p)) + return; + +- /* if (lcv!=Cnil && !collecting(lcv->st.st_self) && */ +- /* (dp=PCEI(lcv->st.st_self,r)) && dp+s<=(dpe=lcv->st.st_self+lcv->st.st_dim) */ +- /* && x && x->d.st>=ngc_thresh) { */ +- + if (what_to_collect!=t_contiguous && + x && x->d.st>=ngc_thresh && +- (dp=alloc_contblock_no_gc(s))) { ++ (dp=alloc_contblock_no_gc(s,static_promotion_limit))) { + +- /* fprintf(stderr,"Promoting %p,%lu to %p\n",p,s,dp); */ +- /* fflush(stderr); */ +- + *pp=memcpy(dp,p,s); +- /* lcv->st.st_fillp=lcv->st.st_dim=(dpe-(void *)(lcv->st.st_self=dp+s)); */ + x->d.st=0; + + return; +@@ -1204,8 +1196,10 @@ GBC(enum type t) { + + if (gc_time >=0 && !gc_recursive++) {gc_start=runtime();} + +- if (COLLECT_RELBLOCK_P) ++ if (COLLECT_RELBLOCK_P) { ++ static_promotion_limit=rb_start + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-12) unstable; urgency=medium + . + * Version_2_6_13pre13 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -2915,10 +2915,10 @@ case $canonical in + use=386-macosx + if test "$build_cpu" = "x86_64" ; then + CFLAGS="-m64 $CFLAGS"; +- LDFLAGS="-m64 -Wl,-headerpad,72 $LDFLAGS"; ++ LDFLAGS="-m64 -Wl,-headerpad,72 -Wl,-no_pie $LDFLAGS"; + else + CFLAGS="-m32 $CFLAGS"; +- LDFLAGS="-m32 -Wl,-headerpad,56 $LDFLAGS"; ++ LDFLAGS="-m32 -Wl,-headerpad,56 -Wl,-no_pie $LDFLAGS"; + fi;; + + alpha-dec-osf) +@@ -4203,7 +4203,7 @@ if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + clang="yes" +- TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body" ++ TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign" + + $as_echo "#define CLANG 1" >>confdefs.h + +@@ -4246,7 +4246,12 @@ fi + if test "$GCC" = "yes" ; then + TCFLAGS="$TCFLAGS -pipe" + case $use in +- *mingw*|*gnuwin*) ++ *mingw*) ++# echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." ++# echo " It is otherwise needed for the Unexec stuff to work." ++# if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi ++ TCFLAGS="$TCFLAGS -fno-zero-initialized-in-bss -mms-bitfields";; ++ *gnuwin*) + # echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." + # echo " It is otherwise needed for the Unexec stuff to work." + # if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi +@@ -5193,7 +5198,7 @@ $as_echo_n "checking \"for leading under + cat>foo.c < + #include +-int main() {FILE *f;double d=0.0;getc(f);cos(d);return 0;} ++int main() {FILE *f;double d=0.0;getc(f);d=cos(d);return 0;} + EOFF + $CC -c foo.c -o foo.o + if nm foo.o |grep " U " | grep "_cos" >/dev/null || nm foo.o |grep " U " | grep " _getc" >/dev/null ; then +@@ -6071,7 +6076,50 @@ $as_echo "$ac_cv_lib_tirpc_xdr_double" > + if test "x$ac_cv_lib_tirpc_xdr_double" = xyes; then : + + $as_echo "#define HAVE_XDR 1" >>confdefs.h +- TLIBS="$TLIBS -ltirpc" ++ ++ TLIBS="$TLIBS -ltirpc" TCFLAGS="$TCFLAGS -I/usr/include/tirpc" ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lgssrpc" >&5 ++$as_echo_n "checking for xdr_double in -lgssrpc... " >&6; } ++if ${ac_cv_lib_gssrpc_xdr_double+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lgssrpc $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char xdr_double (); ++int ++main () ++{ ++return xdr_double (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_gssrpc_xdr_double=yes ++else ++ ac_cv_lib_gssrpc_xdr_double=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssrpc_xdr_double" >&5 ++$as_echo "$ac_cv_lib_gssrpc_xdr_double" >&6; } ++if test "x$ac_cv_lib_gssrpc_xdr_double" = xyes; then : ++ ++$as_echo "#define HAVE_XDR 1" >>confdefs.h ++ ++ TLIBS="$TLIBS -lgssrpc" TCFLAGS="$TCFLAGS -I/usr/include/gssrpc" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lrpc" >&5 + $as_echo_n "checking for xdr_double in -lrpc... " >&6; } +@@ -6112,7 +6160,8 @@ $as_echo "$ac_cv_lib_rpc_xdr_double" >&6 + if test "x$ac_cv_lib_rpc_xdr_double" = xyes; then : + + $as_echo "#define HAVE_XDR 1" >>confdefs.h +- TLIBS="$TLIBS -lrpc" ++ ++ TLIBS="$TLIBS -lrpc" TCFLAGS="$TCFLAGS -I/usr/include/rpc" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -loncrpc" >&5 + $as_echo_n "checking for xdr_double in -loncrpc... " >&6; } +@@ -6153,7 +6202,10 @@ $as_echo "$ac_cv_lib_oncrpc_xdr_double" + if test "x$ac_cv_lib_oncrpc_xdr_double" = xyes; then : + + $as_echo "#define HAVE_XDR 1" >>confdefs.h +- TLIBS="$TLIBS -loncrpc" ++ ++ TLIBS="$TLIBS -loncrpc" TCFLAGS="$TCFLAGS -I/usr/include/oncrpc" ++fi ++ + fi + + fi +@@ -6870,7 +6922,6 @@ else + + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + #include "h/unrandomize.h" + return 0;} +@@ -6899,7 +6950,6 @@ else + /* end confdefs.h. */ + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK +@@ -6930,7 +6980,6 @@ else + /* end confdefs.h. */ + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK +@@ -6997,7 +7046,6 @@ else + return (void *)&i; + } + +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); +@@ -7055,7 +7103,6 @@ else + return (void *)&i; + } + +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); +@@ -7108,7 +7155,6 @@ else + + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" +@@ -7147,7 +7193,6 @@ else + + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + void *b,*c; + FILE *fp = fopen("conftest1","w"); +@@ -7200,7 +7245,6 @@ else + return (void *)&i; + } + +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + char *b; + FILE *fp = fopen("conftest1","w"); +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -195,10 +195,10 @@ case $canonical in + use=386-macosx + if test "$build_cpu" = "x86_64" ; then + CFLAGS="-m64 $CFLAGS"; +- LDFLAGS="-m64 -Wl,-headerpad,72 $LDFLAGS"; ++ LDFLAGS="-m64 -Wl,-headerpad,72 -Wl,-no_pie $LDFLAGS"; + else + CFLAGS="-m32 $CFLAGS"; +- LDFLAGS="-m32 -Wl,-headerpad,56 $LDFLAGS"; ++ LDFLAGS="-m32 -Wl,-headerpad,56 -Wl,-no_pie $LDFLAGS"; + fi;; + + alpha-dec-osf) +@@ -502,7 +502,7 @@ if test "$GCC" = "yes" ; then + ;}]])], + [AC_MSG_RESULT([yes]) + clang="yes" +- TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body" ++ TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign" + AC_DEFINE([CLANG],[1],[running clang compiler])], + [AC_MSG_RESULT([no]) + #FIXME -Wno-unused-but-set-variable when time +@@ -517,7 +517,12 @@ fi + if test "$GCC" = "yes" ; then + TCFLAGS="$TCFLAGS -pipe" + case $use in +- *mingw*|*gnuwin*) ++ *mingw*) ++# echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." ++# echo " It is otherwise needed for the Unexec stuff to work." ++# if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi ++ TCFLAGS="$TCFLAGS -fno-zero-initialized-in-bss -mms-bitfields";; ++ *gnuwin*) + # echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." + # echo " It is otherwise needed for the Unexec stuff to work." + # if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi +@@ -889,7 +894,7 @@ AC_MSG_CHECKING("for leading underscore + cat>foo.c < + #include +-int main() {FILE *f;double d=0.0;getc(f);cos(d);return 0;} ++int main() {FILE *f;double d=0.0;getc(f);d=cos(d);return 0;} + EOFF + $CC -c foo.c -o foo.o + if nm foo.o |grep " U " | grep "_cos" >/dev/null || nm foo.o |grep " U " | grep " _getc" >/dev/null ; then +@@ -1160,9 +1165,14 @@ fi + + if test "$enable_xdr" = "yes" ; then + AC_CHECK_FUNC(xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]), +- AC_CHECK_LIB(tirpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) TLIBS="$TLIBS -ltirpc", +- AC_CHECK_LIB(rpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) TLIBS="$TLIBS -lrpc", +- AC_CHECK_LIB(oncrpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) TLIBS="$TLIBS -loncrpc")))) ++ AC_CHECK_LIB(tirpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) ++ TLIBS="$TLIBS -ltirpc" TCFLAGS="$TCFLAGS -I/usr/include/tirpc", ++ AC_CHECK_LIB(gssrpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) ++ TLIBS="$TLIBS -lgssrpc" TCFLAGS="$TCFLAGS -I/usr/include/gssrpc", ++ AC_CHECK_LIB(rpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) ++ TLIBS="$TLIBS -lrpc" TCFLAGS="$TCFLAGS -I/usr/include/rpc", ++ AC_CHECK_LIB(oncrpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) ++ TLIBS="$TLIBS -loncrpc" TCFLAGS="$TCFLAGS -I/usr/include/oncrpc"))))) + fi + + +@@ -1442,7 +1452,6 @@ if test "$HAVE_SBRK" = "1" ; then + AC_LANG_SOURCE([[ + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + #include "h/unrandomize.h" + return 0;}]])], +@@ -1453,7 +1462,6 @@ if test "$HAVE_SBRK" = "1" ; then + AC_MSG_CHECKING([that sbrk is (now) non-random]) + AC_TRY_RUN([#include + #include +- void gprof_cleanup() {}; + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK +@@ -1468,7 +1476,6 @@ if test "$HAVE_SBRK" = "1" ; then + fi + AC_TRY_RUN([#include + #include +- void gprof_cleanup() {}; + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK +@@ -1552,7 +1559,6 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ + return (void *)&i; + } + +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); +@@ -1586,7 +1592,6 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ + return (void *)&i; + } + +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); +@@ -1615,7 +1620,6 @@ AC_MSG_CHECKING(NEG_CSTACK_ADDRESS) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" +@@ -1632,7 +1636,6 @@ AC_MSG_CHECKING([finding CSTACK_ALIGNMEN + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + void *b,*c; + FILE *fp = fopen("conftest1","w"); +@@ -1661,7 +1664,6 @@ AC_RUN_IFELSE([AC_LANG_SOURCE([[ + return (void *)&i; + } + +- void gprof_cleanup() {}; + int main(int argc,char **argv,char **envp) { + char *b; + FILE *fp = fopen("conftest1","w"); +--- gcl-2.6.12.orig/h/mingw.h ++++ gcl-2.6.12/h/mingw.h +@@ -243,3 +243,6 @@ extern int mingwlisten(FILE *); + #include + + ++#define NO_FILE_LOCKING /*FIXME*/ ++ ++#define sleep(n) Sleep(1000*n) +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -340,15 +340,68 @@ EXTER long holepage; /* hole pages * + #define maxrbpage tm_table[t_relocatable].tm_maxpage + #define rbgbccount tm_table[t_relocatable].tm_gbccount + EXTER long new_holepage,starting_hole_div,starting_relb_heap_mult; +- ++ ++EXTER ufixnum recent_allocation,wait_on_abort; ++EXTER double gc_alloc_min,mem_multiple,gc_page_min,gc_page_max; ++EXTER bool multiprocess_memory_pool; + + EXTER char *new_rb_start; /* desired relblock start after next gc */ + EXTER char *rb_start; /* relblock start */ + EXTER char *rb_end; /* relblock end */ + EXTER char *rb_limit; /* relblock limit */ + EXTER char *rb_pointer; /* relblock pointer */ +-/* EXTER char *rb_start1; /\* relblock start in copy space *\/ */ +-/* EXTER char *rb_pointer1; /\* relblock pointer in copy space *\/ */ ++ ++#ifndef INLINE ++#define INLINE ++#endif ++ ++INLINE ufixnum ++rb_size(void) { ++ return rb_end-rb_start; ++} ++ ++INLINE bool ++rb_high(void) { ++ return rb_pointer>=rb_end&&rb_size(); ++} ++ ++INLINE char * ++rb_begin(void) { ++ return rb_high() ? rb_end : rb_start; ++} ++ ++INLINE bool ++rb_emptyp(void) { ++ return rb_pointer == rb_begin(); ++} ++ ++INLINE ufixnum ++ufmin(ufixnum a,ufixnum b) { ++ return a<=b ? a : b; ++} ++ ++INLINE ufixnum ++ufmax(ufixnum a,ufixnum b) { ++ return a>=b ? a : b; ++} ++ ++#include ++#include ++#include ++INLINE int ++emsg(const char *s,...) { ++ va_list args; ++ ufixnum n=0; ++ void *v=NULL; ++ va_start(args,s); ++ n=vsnprintf(v,n,s,args)+1; ++ va_end(args); ++ v=alloca(n); ++ va_start(args,s); ++ vsnprintf(v,n,s,args); ++ va_end(args); ++ return write(2,v,n-1) ? n : -1; ++} + + EXTER char *heap_end; /* heap end */ + EXTER char *core_end; /* core end */ +--- /dev/null ++++ gcl-2.6.12/h/pool.h +@@ -0,0 +1,170 @@ ++static ufixnum ++data_pages(void) { ++ ++ return page(2*(rb_end-rb_start)+((void *)heap_end-data_start)); ++ ++} ++ ++#ifndef NO_FILE_LOCKING ++ ++#include ++#include ++#include ++#include ++#include ++ ++static int pool=-1; ++static struct pool { ++ ufixnum pid; ++ ufixnum n; ++ ufixnum s; ++} *Pool; ++ ++static struct flock pl; ++ ++static const char *gcl_pool="/tmp/gcl_pool"; ++ ++static int ++set_lock(void) { ++ ++ errno=0; ++ if (fcntl(pool,F_SETLKW,&pl)) { ++ if (errno==EINTR) ++ set_lock(); ++ return -1; ++ } ++ return 0; ++ ++} ++ ++static void ++lock_pool(void) { ++ ++ pl.l_type=F_WRLCK; ++ massert(!set_lock()); ++ ++} ++ ++static void ++unlock_pool(void) { ++ ++ pl.l_type=F_UNLCK; ++ massert(!set_lock()); ++ ++} ++ ++static void ++register_pool(int s) { ++ lock_pool(); ++ Pool->n+=s; ++ Pool->s+=s*data_pages(); ++ unlock_pool(); ++} ++ ++static void ++open_pool(void) { ++ ++ if (pool==-1) { ++ ++ struct flock f; ++ ++ massert((pool=open(gcl_pool,O_CREAT|O_RDWR,0644))!=-1); ++ massert(!ftruncate(pool,sizeof(struct pool))); ++ massert((Pool=mmap(NULL,sizeof(struct pool),PROT_READ|PROT_WRITE,MAP_SHARED,pool,0))!=(void *)-1); ++ ++ pl.l_type=F_WRLCK; ++ pl.l_whence=SEEK_SET; ++ pl.l_start=sizeof(Pool->pid);; ++ pl.l_len=0; ++ ++ f=pl; ++ f.l_start=0; ++ f.l_len=sizeof(Pool->pid); ++ ++ if (!fcntl(pool,F_SETLK,&f)) { ++ ++ Pool->pid=getpid(); ++ ++ lock_pool(); ++ Pool->n=0; ++ Pool->s=0; ++ unlock_pool(); ++ ++ f.l_type=F_UNLCK; ++ massert(!fcntl(pool,F_SETLK,&f)); ++ ++ fprintf(stderr,"Initializing pool\n"); ++ fflush(stderr); ++ ++ } ++ ++ f.l_type=F_RDLCK; ++ massert(!fcntl(pool,F_SETLK,&f)); ++ ++ register_pool(1); ++ massert(!atexit(close_pool)); ++ ++ } ++ ++} ++#endif ++ ++void ++close_pool(void) { ++ ++#ifndef NO_FILE_LOCKING ++ if (pool!=-1) { ++ register_pool(-1); ++ massert(!close(pool)); ++ massert(!munmap(Pool,sizeof(struct pool))); ++ pool=-1; ++ } ++#endif ++ ++} ++ ++static void ++update_pool(fixnum val) { ++ ++#ifndef NO_FILE_LOCKING ++ if (multiprocess_memory_pool) { ++ open_pool(); ++ lock_pool(); ++ Pool->s+=val; ++ unlock_pool(); ++ } ++#endif ++ ++} ++ ++static ufixnum ++get_pool(void) { ++ ++ ufixnum s; ++ ++#ifndef NO_FILE_LOCKING ++ if (multiprocess_memory_pool) { ++ ++ open_pool(); ++ lock_pool(); ++ s=Pool->s; ++ unlock_pool(); ++ ++ } else ++#endif ++ ++ s=data_pages(); ++ ++ return s; ++ ++} ++ ++ ++static void ++pool_check(void) { ++ ++ /* if (pool!=-1) */ ++ /* massert(get_pool()==data_pages() */ ++ /* ||!fprintf(stderr,"%lu %lu %lu\n",get_pool(),page((void *)heap_end-data_start),page(((rb_end-rb_start))))); */ ++ ++} +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1951,7 +1951,16 @@ ufixnum + sum_maxpages(void); + + void +-resize_hole(ufixnum,enum type); ++resize_hole(ufixnum,enum type,bool); + + void +-setup_rb(void); ++setup_rb(bool); ++ ++void ++close_pool(void); ++ ++void ++gcl_cleanup(int); ++ ++void ++do_gcl_abort(void); +--- gcl-2.6.12.orig/h/unrandomize.h ++++ gcl-2.6.12/h/unrandomize.h +@@ -49,10 +49,10 @@ + } + n[k]="GCL_UNRANDOMIZE=t"; + n[k+1]=0; +-#ifdef GCL_GPROF +- gprof_cleanup(); +-#endif + errno=0; ++#ifdef HAVE_GCL_CLEANUP ++ gcl_cleanup(0); ++#endif + execve(*a,a,n); + printf("execve failure %d\n",errno); + exit(-1); +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -89,7 +89,7 @@ + + (when (boundp '*system-banner*) + (format t *system-banner*) +- (format t "Temporary directory for compiler files set to ~a~%" *tmp-dir*)) ++ (format t "Temporary directory for compiler files:~%~a~%" *tmp-dir*)) + + (loop + (setq +++ ++ ++ + + -) +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -38,6 +38,8 @@ Foundation, 675 Mass Ave, Cambridge, MA + static int + t_from_type(object); + ++#include "pool.h" ++ + + DEFVAR("*AFTER-GBC-HOOK*",sSAafter_gbc_hookA,SI,sLnil,""); + DEFVAR("*IGNORE-MAXIMUM-PAGES*",sSAignore_maximum_pagesA,SI,sLt,""); +@@ -67,7 +69,6 @@ sbrk1(n) + + long starting_hole_div=10; + long starting_relb_heap_mult=2; +-long new_holepage; + long resv_pages=0; + + #ifdef BSD +@@ -317,7 +318,7 @@ empty_relblock(void) { + object o=sSAleaf_collection_thresholdA->s.s_dbind; + + sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(0); +- for (;rb_pointer!=rb_start&&rb_pointer!=rb_end;) { ++ for (;!rb_emptyp();) { + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } +@@ -326,40 +327,44 @@ empty_relblock(void) { + } + + void +-setup_rb(void) { ++setup_rb(bool preserve_rb_pointerp) { + +- int init=new_rb_start!=rb_start || rb_pointer>=rb_end; ++ int lowp=new_rb_start!=rb_start || rb_high(); + ++ update_pool(2*(nrbpage-page(rb_size()))); + rb_start=new_rb_start; + rb_end=rb_start+(nrbpage<>PAGEWIDTH))); + + } + + void +-resize_hole(ufixnum hp,enum type tp) { ++resize_hole(ufixnum hp,enum type tp,bool in_placep) { + +- char *start=rb_pointer=start) || (new_rb_start=start+size)) { +- fprintf(stderr,"Toggling relblock when resizing hole to %lu\n",hp); +- fflush(stderr); ++ if (!in_placep && ++ ((new_start<=start && starttm_adjgbccnt--; + GBC(tp); +- } else +- setup_rb(); ++ } + + } + +@@ -378,11 +383,13 @@ alloc_page(long n) { + fixnum d=available_pages-nn; + + d*=0.2; +- d=d<0.01*real_maxpage ? available_pages-n : d; ++ d=d<0.01*real_maxpage ? available_pages-nn : d; + d=d<0 ? 0 : d; +- d=new_holepage(void *)core_end) { ++ update_pool(nn); ++ pool_check(); ++ ++ } else if (v>(void *)core_end) { + + massert(!mbrk(v)); + core_end=v; +@@ -510,94 +519,6 @@ grow_linear(fixnum old, fixnum fract, fi + DEFVAR("*OPTIMIZE-MAXIMUM-PAGES*",sSAoptimize_maximum_pagesA,SI,sLnil,""); + #define OPTIMIZE_MAX_PAGES (sSAoptimize_maximum_pagesA ==0 || sSAoptimize_maximum_pagesA->s.s_dbind !=sLnil) + DEFVAR("*NOTIFY-OPTIMIZE-MAXIMUM-PAGES*",sSAnotify_optimize_maximum_pagesA,SI,sLnil,""); +-#define MMAX_PG(a_) (a_)->tm_maxpage-(a_)->tm_alt_npage +- +-static int +-rebalance_maxpages(struct typemanager *my_tm,fixnum z) { +- +- fixnum d; +- ufixnum i,j,r=(my_tm->tm_type==t_relocatable ? 2 : 1); +- +- +- d=(z-my_tm->tm_maxpage)*r; +- j=sum_maxpages(); +- +- if (j+d>phys_pages) { +- +- ufixnum k,e=j+d-phys_pages; +- double f; +- +- for (k=0,i=t_start;ik ? k : e; +- if (e+phys_pages<=j) +- return 0; +- +- f=k ? 1.0-(double)e/k : 1.0; +- +- for (i=t_start;itm_maxpage*r+(phys_pages-sum_maxpages()))/r)); +- +- return 1; +- +- } else +- +- return set_tm_maxpage(my_tm,z); +- +-} +- +-long +-opt_maxpage(struct typemanager *my_tm) { +- +- double x=0.0,y=0.0,z,r; +- long mmax_page; +- struct typemanager *tm,*tme; +- long mro=0,tro=0,j; +- +- if (page(core_end)>0.8*real_maxpage) +- return 0; +- +- for (tm=tm_table,tme=tm+sizeof(tm_table)/sizeof(*tm_table);tmtm_adjgbccnt; +- y+=MMAX_PG(tm); +- } +- mmax_page=MMAX_PG(my_tm); +-#if 0 +- if (sgc_enabled) { +- y-=(tro=sgc_count_read_only_type(-1)); +- mmax_page-=(mro=sgc_count_read_only_type(my_tm->tm_type)); +- } +-#endif +- +- z=my_tm->tm_adjgbccnt/* -1 */; +- z/=(1+x-0.9*my_tm->tm_adjgbccnt); +- z*=(y-mmax_page)*mmax_page; +- z=sqrt(z); +- z=z-mmax_page>available_pages ? mmax_page+available_pages : z; +- my_tm->tm_opt_maxpage=(long)(z+my_tm->tm_alt_npage)>my_tm->tm_opt_maxpage ? (long)(z+my_tm->tm_alt_npage) : my_tm->tm_opt_maxpage; +- +- if (z<=mmax_page) +- return 0; +- +- r=((x-my_tm->tm_adjgbccnt)+ my_tm->tm_adjgbccnt*mmax_page/z)*(y-mmax_page+z); +- r/=x*y; +- +- j=r<=0.95 && rebalance_maxpages(my_tm,z+mro+my_tm->tm_alt_npage); +- +- if (sSAnotify_optimize_maximum_pagesA->s.s_dbind!=sLnil) +- printf("[type %u max %lu(%lu) opt %lu y %lu(%lu) gbcrat %f sav %f new %lu sum %lu phys %lu]\n", +- my_tm->tm_type,mmax_page,mro,(long)z,(long)y,tro,(my_tm->tm_adjgbccnt/* -1 */)/(1+x-0.9*my_tm->tm_adjgbccnt),r, +- my_tm->tm_maxpage,sum_maxpages(),phys_pages); +- +- return j ? 1 : 0; +- +-} + + static object + exhausted_report(enum type t,struct typemanager *tm) { +@@ -735,14 +656,12 @@ print_cb(int print) { + massert(**cbppp==cbp); + for (k=0;cbp && cbp->cb_size==(**cbppp)->cb_size;cbpp=&cbp->cb_link,cbp=cbp->cb_link,k++); + if (print) +- fprintf(stderr,"%lu %p %p %lu %lu\n",(unsigned long)(cbppp-cbsrch1),*cbppp,**cbppp,(**cbppp)->cb_size,k); ++ emsg("%lu %p %p %lu %lu\n",(unsigned long)(cbppp-cbsrch1),*cbppp,**cbppp,(**cbppp)->cb_size,k); + } + massert(cbppp==cbsrche); + massert(*cbppp==cbpp); + massert(!**cbppp); + +- fflush(stderr); +- + } + + void +@@ -808,8 +727,8 @@ alloc_from_freelist(struct typemanager * + break; + + case t_relocatable: +- if (rb_pointer>rb_end && rb_pointer+n>rb_limit && rb_pointer+nrb_end && rb_pointer+n>rb_limit && rb_pointer+nn) + return ((rb_pointer+=n)-n); + break; +@@ -847,7 +766,7 @@ too_full_p(struct typemanager *tm) { + + switch (tm->tm_type) { + case t_relocatable: +- return 100*(rb_limit-rb_pointer)cb_link) k+=cbp->cb_size; +@@ -867,10 +786,31 @@ too_full_p(struct typemanager *tm) { + + } + ++static inline bool ++do_gc_p(struct typemanager *tm,fixnum n) { ++ ++ ufixnum cpool,pp; ++ ++ if (!GBC_enable) ++ return FALSE; ++ ++ if (!sSAoptimize_maximum_pagesA || sSAoptimize_maximum_pagesA->s.s_dbind==Cnil) ++ return tm->tm_npage+tpage(tm,n)>tm->tm_maxpage; ++ ++ if ((cpool=get_pool())<=gc_page_min*phys_pages) ++ return FALSE; ++ ++ pp=gc_page_max*phys_pages; ++ ++ return page(recent_allocation)>(1.0+gc_alloc_min-(double)ufmin(cpool,pp)/pp)*data_pages(); ++ ++} ++ ++ + static inline void * + alloc_after_gc(struct typemanager *tm,fixnum n) { + +- if (tm->tm_npage+tpage(tm,n)>tm->tm_maxpage && GBC_enable) { ++ if (do_gc_p(tm,n)) { + + switch (jmp_gmp) { + case 0: /* not in gmp call*/ +@@ -911,21 +851,13 @@ add_pages(struct typemanager *tm,fixnum + + case t_relocatable: + +- if (rb_pointer>rb_end && m>((rb_start-heap_end)>>PAGEWIDTH)) { +- fprintf(stderr,"Moving relblock low before expanding relblock pages\n"); +- fflush(stderr); ++ if (rb_high() && m>((rb_start-heap_end)>>PAGEWIDTH)) { ++ emsg("Moving relblock low before expanding relblock pages\n"); + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } + nrbpage+=m; +- rb_limit+=m*PAGESIZE; +- if (rb_pointer>rb_end) +- rb_start-=m*PAGESIZE; +- else +- rb_end+=m*PAGESIZE; +- +- alloc_page(-(2*nrbpage+((rb_start-heap_end)>>PAGEWIDTH))); +- ++ resize_hole(page(rb_start-heap_end)-(rb_high() ? m : 0),t_relocatable,1); + break; + + default: +@@ -1011,6 +943,8 @@ alloc_mem(struct typemanager *tm,fixnum + + CHECK_INTERRUPT; + ++ recent_allocation+=n; ++ + if ((p=alloc_from_freelist(tm,n))) + return p; + if ((p=alloc_after_gc(tm,n))) +@@ -1135,7 +1069,7 @@ DEFUNM_NEW("ALLOCATED",object,fSallocate + { struct typemanager *tm=(&tm_table[t_from_type(typ)]); + tm = & tm_table[tm->tm_type]; + if (tm->tm_type == t_relocatable) +- { tm->tm_npage = (rb_end-rb_start)>>PAGEWIDTH; ++ { tm->tm_npage = page(rb_size()); + tm->tm_nfree = rb_limit -rb_pointer; + } + else if (tm->tm_type == t_contiguous) +@@ -1262,7 +1196,7 @@ object malloc_list=Cnil; + void + maybe_set_hole_from_maxpages(void) { + if (rb_start==heap_end && rb_end==rb_start && rb_limit==rb_start && rb_pointer==rb_start) +- resize_hole(new_holepage,t_relocatable); ++ resize_hole(available_pages/3,t_relocatable,0); + } + + void +@@ -1361,10 +1295,10 @@ gcl_init_alloc(void *cs_start) { + initial_sbrk=data_start=heap_end; + first_data_page=page(data_start); + +-#ifdef GCL_GPROF +- if (new_holepage>PAGEWIDTH)); + } + + +@@ -1751,9 +1685,7 @@ DEFUN_NEW("SET-STARTING-RELBLOCK-HEAP-MU + + DEFUNM_NEW("SET-HOLE-SIZE",object,fSset_hole_size,SI,1,2,NONE,OO,OO,OO,OO,(object onpages,...),"") { + +- printf("This function is obsolete -- use SET-STARTING-HOLE-DIVISOR instead\n"); +- +- RETURN2(make_fixnum(new_holepage),make_fixnum(reserve_pages_for_signal_handler)); ++ RETURN2(make_fixnum((rb_start-heap_end)>>PAGEWIDTH),make_fixnum(reserve_pages_for_signal_handler)); + + } + +@@ -1811,7 +1743,7 @@ static char *baby_malloc(n) + if ((res +m-baby_malloc_data) > sizeof(baby_malloc_data)) + { + printf("failed in baby malloc"); +- exit(1); ++ do_gcl_abort(); + } + last_baby += m; + *((int *)res)=n; +@@ -1904,18 +1836,16 @@ free(void *ptr) { + #endif + return; + } +-#ifdef NOFREE_ERR +- return; +-#else + if (ptr!=initial_monstartup_pointer_echo) { + static void *old_ptr; + if (old_ptr==ptr) return; + old_ptr=ptr; ++#ifndef NOFREE_ERR + FEerror("free(3) error.",0); ++#endif + } + initial_monstartup_pointer_echo=NULL; + return; +-#endif + } + + void * +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -40,8 +40,8 @@ assert_error(const char *a,unsigned l,co + make_simple_string(a),make_fixnum(l), + make_simple_string(f),make_simple_string(n)); + else { +- fprintf(stderr,"The assertion %s on line %d of %s in function %s failed",a,l,f,n); +- exit(-1); ++ emsg("The assertion %s on line %d of %s in function %s failed",a,l,f,n); ++ do_gcl_abort(); + } + + } +@@ -386,7 +386,7 @@ DEFUN_NEW("UNIVERSAL-ERROR-HANDLER",obje + for (i = 0; i < error_fmt_string->st.st_fillp; i++) + fputc(error_fmt_string->st.st_self[i],stdout); + printf("\nLisp initialization failed.\n"); +- exit(0); ++ do_gcl_abort(); + RETURN1(x0); + } + +--- gcl-2.6.12.orig/o/fasldlsym.c ++++ gcl-2.6.12/o/fasldlsym.c +@@ -84,7 +84,7 @@ fasload(object faslfile) { + massert(!psystem(b)); + + if (!(dlp = dlopen(buf,RTLD_NOW))) { +- fputs(dlerror(),stderr); ++ emsg(dlerror()); + FEerror("Cannot open for dynamic link ~a",1,make_simple_string(filename)); + } + +@@ -94,7 +94,7 @@ fasload(object faslfile) { + memcpy(b,x->st.st_self,x->st.st_fillp); + b[x->st.st_fillp]=0; + if (!(fptr=dlsym(dlp,b))) { +- fputs(dlerror(),stderr); ++ emsg(dlerror()); + FEerror("Cannot lookup ~a in ~a",2,make_simple_string(b),make_simple_string(filename)); + } + +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -548,10 +548,8 @@ BEGIN: + + + case smm_socket: +- if (SOCKET_STREAM_FD(strm) < 2) { +- fprintf(stderr,"tried Clsing %d ! as scoket \n",SOCKET_STREAM_FD(strm)); +- fflush(stderr); +- } ++ if (SOCKET_STREAM_FD(strm) < 2) ++ emsg("tried Closing %d ! as socket \n",SOCKET_STREAM_FD(strm)); + else { + #ifdef HAVE_NSOCKET + if (GET_STREAM_FLAG(strm,gcl_sm_output)) +@@ -2180,10 +2178,7 @@ FFN(siLfp_input_stream)() + #ifdef HAVE_NSOCKET + + #ifdef DODEBUG +-#define dprintf(s,arg) \ +- do {fprintf(stderr,s,arg); \ +- fflush(stderr); }\ +- while(0) ++#define dprintf(s,arg) emsg(s,arg) + #else + #define dprintf(s,arg) + #endif +@@ -2457,7 +2452,7 @@ object x=Cnil; + exit(0); + break; + case -1: +- abort(); ++ do_gcl_abort(); + break; + default: + close_stream(y); +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -85,11 +85,9 @@ cb_print(void) { + struct contblock **cbpp; + int i; + +- for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) { +- fprintf(stderr,"%lu at %p\n",(*cbpp)->cb_size,*cbpp); +- fflush(stderr); +- } +- fprintf(stderr,"%u blocks\n",i); ++ for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) ++ emsg("%lu at %p\n",(*cbpp)->cb_size,*cbpp); ++ emsg("%u blocks\n",i); + return 0; + } + +@@ -285,7 +283,6 @@ long first_protectable_page =0; + static char *copy_relblock(char *p, int s); + + long real_maxpage; +-long new_holepage; + + struct apage { + char apage_self[PAGESIZE]; +@@ -1122,7 +1119,8 @@ GBC(enum type t) { + } + + ngc_thresh=fix(sSAleaf_collection_thresholdA->s.s_dbind); +- ++ recent_allocation=0; ++ + if (in_signal_handler && t == t_relocatable) + error("cant gc relocatable in signal handler"); + +@@ -1198,7 +1196,7 @@ GBC(enum type t) { + + if (COLLECT_RELBLOCK_P) { + static_promotion_limit=rb_starts.s_dbind->v.v_self; +@@ -1337,7 +1331,7 @@ GBC(enum type t) { + tm_table[(int)tm_table[i].tm_type].tm_name); + } + printf("contblock: %ld blocks %ld pages\n", count_contblocks(), ncbpage); +- printf("hole: %ld pages\n", ((rb_start-heap_end)>>PAGEWIDTH)); ++ printf("hole: %lu pages\n", (ufixnum)page(rb_start-heap_end)); + printf("relblock: %ld bytes used %ld bytes free %ld pages\n", + (long)(rb_pointer - rb_start), (long)(rb_end - rb_pointer), nrbpage); + printf("GBC ended\n"); +@@ -1362,34 +1356,6 @@ GBC(enum type t) { + + } + +- { +- extern long opt_maxpage(struct typemanager *); +- +-#define IGNORE_MAX_PAGES (sSAignore_maximum_pagesA ==0 || sSAignore_maximum_pagesA->s.s_dbind !=sLnil) +-#define OPTIMIZE_MAX_PAGES (sSAoptimize_maximum_pagesA ==0 || sSAoptimize_maximum_pagesA->s.s_dbind !=sLnil) +- +- if (IGNORE_MAX_PAGES && OPTIMIZE_MAX_PAGES) +- opt_maxpage(tm_table+t); +- +- } +- +- /* {static int mv; */ +- /* if (!mv && COLLECT_RELBLOCK_P) { */ +- /* mv=1; */ +- /* if (relb_copied) { */ +- /* sSAstatic_promotion_areaA->s.s_dbind=(VFUN_NARGS=4,fSmake_vector1(make_fixnum(relb_copied),make_fixnum(aet_char),Ct,make_fixnum(0))); */ +- /* fprintf(stderr,"Making static promotion area %lu bytes\n",relb_copied); */ +- /* fflush(stderr); */ +- /* relb_copied=0; */ +- /* } else { */ +- /* fprintf(stderr,"Releasing static promotion area\n"); */ +- /* fflush(stderr); */ +- /* sSAstatic_promotion_areaA->s.s_dbind=Cnil; */ +- /* } */ +- /* mv=0; */ +- /* } */ +- /* } */ +- + collect_both=0; + + END_NO_INTERRUPT; +@@ -1449,8 +1415,8 @@ FFN(siLroom_report)(void) { + vs_push(make_fixnum(count_contblocks())); + vs_push(make_fixnum(cbgbccount)); + vs_push(make_fixnum((rb_start-heap_end)>>PAGEWIDTH)); +- vs_push(make_fixnum(rb_pointer - (rb_pointercb_size,p=*cbpp;*cbpp && (*cbpp)->cb_size==s;i+=(*cbpp)->cb_size,j++,k++,cbpp=&(*cbpp)->cb_link); +- fprintf(stderr,"%lu %lu starting at %p\n",k,s,p); ++ emsg("%lu %lu starting at %p\n",k,s,p); + } +- fprintf(stderr,"\nTotal free %lu in %lu pieces\n\n",i,j); ++ emsg("\nTotal free %lu in %lu pieces\n\n",i,j); + + for (i=j=k=0;kv.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++) +- fprintf(stderr,"%lu pages at %p\n",(unsigned long)v->in_use,v); +- fprintf(stderr,"\nTotal pages %lu in %lu pieces\n\n",i,j); ++ emsg("%lu pages at %p\n",(unsigned long)v->in_use,v); ++ emsg("\nTotal pages %lu in %lu pieces\n\n",i,j); + + for (i=j=0,v=cell_list_head;v;v=v->next) + if (tm->tm_type==v->type) { +@@ -1548,13 +1514,13 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc + for (p=pagetochar(page(v)),k=0;ktm_nppage;k++,p+=tm->tm_size) { + object o=p; + if (!is_free(o) && type_of(o)==t_cfdata && (void *)o->cfd.cfd_start>=data_start) { +- fprintf(stderr,"%lu code bytes at %p\n",(unsigned long)o->cfd.cfd_size,o->cfd.cfd_start); ++ emsg("%lu code bytes at %p\n",(unsigned long)o->cfd.cfd_size,o->cfd.cfd_start); + i+=o->cfd.cfd_size; + j++; + } + } + } +- fprintf(stderr,"\nTotal code bytes %lu in %lu pieces\n",i,j); ++ emsg("\nTotal code bytes %lu in %lu pieces\n",i,j); + + for (i=j=0,v=cell_list_head;v;v=v->next) { + struct typemanager *tm=tm_of(v->type); +@@ -1616,14 +1582,14 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc + break; + } + if (d>=data_start && d<(void *)heap_end && s) { +- fprintf(stderr,"%lu %s bytes at %p\n",s,tm_table[type_of(o)].tm_name,d); ++ emsg("%lu %s bytes at %p\n",s,tm_table[type_of(o)].tm_name,d); + i+=s; + j++; + } + } + } + } +- fprintf(stderr,"\nTotal leaf bytes %lu in %lu pieces\n",i,j); ++ emsg("\nTotal leaf bytes %lu in %lu pieces\n",i,j); + + return Cnil; + +--- gcl-2.6.12.orig/o/gcl_readline.d ++++ gcl-2.6.12/o/gcl_readline.d +@@ -42,6 +42,8 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include + #include + #include ++#include ++#include + #include + #include + +--- gcl-2.6.12.orig/o/gmp.c ++++ gcl-2.6.12/o/gmp.c +@@ -9,7 +9,7 @@ static void *gcl_gmp_realloc(void *oldme + { + unsigned int *old,*new; + if (!jmp_gmp) { /* No gc in alloc if jmp_gmp */ +- if (MP_SELF(big_gcprotect)) abort(); ++ if (MP_SELF(big_gcprotect)) do_gcl_abort(); + MP_SELF(big_gcprotect)=oldmem; + MP_ALLOCATED(big_gcprotect)=oldsize/MP_LIMB_SIZE; + } +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -204,26 +204,89 @@ get_proc_meminfo_value_in_pages(const ch + massert(!strncmp(c+m," kB\n",4)); + return n>>(PAGEWIDTH-10); + } +- ++ + static ufixnum + get_phys_pages_no_malloc(char freep) { +- ufixnum k=freep ? ++ ++ return freep ? + get_proc_meminfo_value_in_pages("MemFree:")+ + get_proc_meminfo_value_in_pages("Buffers:")+ + get_proc_meminfo_value_in_pages("Cached:") : + get_proc_meminfo_value_in_pages("MemTotal:"); +- const char *e=getenv("GCL_MEM_MULTIPLE"); +- if (e) { +- double d; +- massert(sscanf(e,"%lf",&d)==1); +- massert(d>=0.0); +- k*=d; +- } +- return k; ++ + } + + #endif + ++static ufixnum ++get_phys_pages(char freep) { ++ ++ return get_phys_pages_no_malloc(freep); ++ ++} ++ ++static void ++get_gc_environ(void) { ++ ++ const char *e;; ++ ++ mem_multiple=1.0; ++ if ((e=getenv("GCL_MEM_MULTIPLE"))) { ++ massert(sscanf(e,"%lf",&mem_multiple)==1); ++ massert(mem_multiple>=0.0); ++ } ++ ++ gc_alloc_min=0.1; ++ if ((e=getenv("GCL_GC_ALLOC_MIN"))) { ++ massert(sscanf(e,"%lf",&gc_alloc_min)==1); ++ massert(gc_alloc_min>=0.0); ++ } ++ ++ gc_page_min=0.5; ++ if ((e=getenv("GCL_GC_PAGE_THRESH"))) { ++ massert(sscanf(e,"%lf",&gc_page_min)==1); ++ massert(gc_page_min>=0.0); ++ } ++ ++ gc_page_max=0.75; ++ if ((e=getenv("GCL_GC_PAGE_MAX"))) { ++ massert(sscanf(e,"%lf",&gc_page_max)==1); ++ massert(gc_page_max>=0.0); ++ } ++ ++ multiprocess_memory_pool=(e=getenv("GCL_MULTIPROCESS_MEMORY_POOL")) && *e; ++ ++ wait_on_abort=0; ++ if ((e=getenv("GCL_WAIT_ON_ABORT"))) ++ massert(sscanf(e,"%lu",&wait_on_abort)==1); ++ ++} ++ ++static void ++setup_maxpages(double scale) { ++ ++ void *beg=data_start ? data_start : sbrk(0); ++ ufixnum maxpages=real_maxpage-page(beg),npages,i; ++ ++ for (npages=0,i=t_start;i=npages); ++ ++ maxpages*=scale; ++ phys_pages*=scale; ++ real_maxpage=maxpages+page(beg); ++ ++ resv_pages=available_pages=0; ++ available_pages=check_avail_pages(); ++ ++ resv_pages=40PAGESIZE;j>>=1) +@@ -253,44 +313,11 @@ update_real_maxpage(void) { + } + massert(!mbrk(cur)); + +-/* phys_pages=get_phys_pages_no_malloc(0); */ +- +-/* #ifdef BRK_DOES_NOT_GUARANTEE_ALLOCATION */ +-/* if (phys_pages>0 && real_maxpage>phys_pages+page(beg)) real_maxpage=phys_pages+page(beg); */ +-/* #endif */ ++ phys_pages=ufmin(get_phys_pages(0)+page(beg),real_maxpage)-page(beg); + +- maxpages=real_maxpage-page(beg); +- +- phys_pages=phys_pages>maxpages ? maxpages : phys_pages; +- +- resv_pages=available_pages=0; +- available_pages=check_avail_pages(); ++ get_gc_environ(); ++ setup_maxpages(mem_multiple); + +- for (i=t_start;is.s_dbind!=Cnil) { +- +- for (i=t_start,j=0;i>1); +- } +- +- new_holepage=0; +- for (i=t_start;i= dend) { + minimize_image(); +- log_maxpage_bound=l; ++ log_maxpage_bound=l;/*FIXME maybe this should be under mem_multiple, not over*/ + update_real_maxpage(); + maybe_set_hole_from_maxpages(); + } +@@ -384,6 +410,43 @@ gcl_mprotect(void *v,unsigned long l,int + + DEFVAR("*CODE-BLOCK-RESERVE*",sSAcode_block_reserveA,SI,Cnil,""); + ++#define HAVE_GCL_CLEANUP ++ ++void ++gcl_cleanup(int gc) { ++ ++ if (getenv("GCL_WAIT")) ++ sleep(30); ++ ++#ifdef CLEANUP_CODE ++ CLEANUP_CODE ++#elif defined(USE_CLEANUP) ++ {extern void _cleanup(void);_cleanup();} ++#endif ++ ++#ifdef GCL_GPROF ++ gprof_cleanup(); ++#endif ++ ++ if (gc) { ++ ++ saving_system=TRUE; ++ GBC(t_other); ++ saving_system=FALSE; ++ ++ minimize_image(); ++ ++ raw_image=FALSE; ++ cs_org=0; ++ initial_sbrk=core_end; ++ ++ } ++ ++ close_pool(); ++ ++} ++ ++ + int + main(int argc, char **argv, char **envp) { + +@@ -497,6 +560,14 @@ void install_segmentation_catcher(void) + (void) gcl_signal(SIGBUS,segmentation_catcher); + } + ++void ++do_gcl_abort(void) { ++ if (wait_on_abort) ++ sleep(wait_on_abort); ++ gcl_cleanup(0); ++ abort(); ++} ++ + int catch_fatal=1; + void + error(char *s) +@@ -512,7 +583,7 @@ error(char *s) + FEerror("Caught fatal error [memory may be damaged]",0); } + printf("\nUnrecoverable error: %s.\n", s); + fflush(stdout); +- abort(); ++ do_gcl_abort(); + } + + static void +@@ -529,7 +600,7 @@ initlisp(void) { + || NULL_OR_ON_C_STACK(pagetoinfo(first_data_page)) + || NULL_OR_ON_C_STACK(core_end-1)) { + /* check person has correct definition of above */ +- fprintf(stderr,"%p %d " ++ emsg("%p %d " + #if defined(IM_FIX_BASE) + "%p %d %p %d " + #endif +@@ -941,7 +1012,7 @@ static void + FFN(siLinitialization_failure)(void) { + check_arg(0); + printf("lisp initialization failed\n"); +- exit(0); ++ do_gcl_abort(); + } + + DEFUNO_NEW("IDENTITY",object,fLidentity,LISP +@@ -970,7 +1041,6 @@ DEFUN_NEW("LISP-IMPLEMENTATION-VERSION", + RETURN1((make_simple_string(LISP_IMPLEMENTATION_VERSION))); + } + +- + static void + FFN(siLsave_system)(void) { + +@@ -990,12 +1060,6 @@ FFN(siLsave_system)(void) { + DO_BEFORE_SAVE + #endif + +- saving_system = TRUE; +- +- minimize_image(); +- +- saving_system = FALSE; +- + siLsave(); + + } +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -91,6 +91,9 @@ $(DECL): $(HDIR)/make-decl.h $(INI_FILES + grab_defs: grab_defs.c + ${CC} $(OFLAGS) -o grab_defs grab_defs.c + ++wpool: wpool.c ++ $(CC) $(CFLAGS) $(DEFS) -o $@ $< ++ + $(GCLIB): ${ALIB} + rm -f gcllib.a + $(AR) gcllib.a ${ALIB} +@@ -98,6 +101,6 @@ $(GCLIB): ${ALIB} + + clean: + rm -f $(OBJS) ${ALIB} new_init.o $(LAST_FILE) $(FIRST_FILE) *.a grab_defs$(EXE) *.ini tmpx foo.c +- rm -f cmpinclude.h new_init.c $(DECL) def undef udef.h void.h TAGS boot.h ++ rm -f cmpinclude.h new_init.c $(DECL) def undef udef.h void.h TAGS boot.h wpool + + .INTERMEDIATE: $(patsubst %.d,%.c,$(shell ls -1 *.d)) +--- gcl-2.6.12.orig/o/mingwin.c ++++ gcl-2.6.12/o/mingwin.c +@@ -8,10 +8,7 @@ + #include "stdlib.h" + + #ifdef DODEBUG +-#define dprintf(s,arg) \ +- do {fprintf(stderr,s,arg); \ +- fflush(stderr); }\ +- while(0) ++#define dprintf(s,arg) emsg(s,arg) + #else + #define dprintf(s,arg) + #endif +@@ -237,8 +234,7 @@ InitSockets() + * Initialize the winsock library and check the version number. + */ + if ((*winSock.WSAStartup)(MAKEWORD(2,2), &wsaData) != 0) { +- fprintf(stderr,"unloading"); +- fflush(stderr); ++ emsg("unloading"); + goto unloadLibrary; + } + #ifdef WSA_VERSION_REQD +@@ -380,10 +376,8 @@ CreateSocketAddress(sockaddrPtr, host, p + #ifdef DEBUG + static void myerr(char *s,int d) + { +- if (0) { +- fprintf(stderr,s,d); +- fflush(stderr); +- } ++ if (0) ++ emsg(s,d); + + } + #else +@@ -769,8 +763,7 @@ sigint() + #if 0 + BOOL WINAPI inthandler(DWORD i) + { +- fprintf(stderr,"in handler %d",i); +- fflush(stderr); ++ emsg("in handler %d",i); + terminal_interrupt(1); + return TRUE; + } +@@ -812,14 +805,14 @@ void sigterm() + #ifdef SIGABRT + void sigabrt() + { +- exit(SIGABRT); ++ do_gcl_abort(); + } + #endif + + + void sigkill() + { +- exit(SIGKILL); ++ do_gcl_abort(); + } + + +--- gcl-2.6.12.orig/o/nsocket.c ++++ gcl-2.6.12/o/nsocket.c +@@ -4,10 +4,7 @@ + #include + + #ifdef DODEBUG +-#define dprintf(s,arg) \ +- do {fprintf(stderr,s,arg); \ +- fflush(stderr); }\ +- while(0) ++#define dprintf(s,arg) emsg(s,arg) + #else + #define dprintf(s,arg) + #endif +@@ -65,7 +62,7 @@ + #endif + + #define VOID void +-#define ERROR_MESSAGE(msg) do{ fprintf(stderr,msg); exit(1) ; } while(0) ++#define ERROR_MESSAGE(msg) do{ emsg(msg); do_gcl_abort() ; } while(0) + + #ifdef STAND + +@@ -87,7 +84,7 @@ main(argc,argv) + fd = doConnect(argv[1],atoi(argv[2])); + if (fd < 0) { + perror("cant connect"); +- exit(1); ++ do_gcl_abort(); + } + + while (1) { int high; +@@ -512,8 +509,7 @@ getOneChar(FILE *fp) + int high; + /* fprintf(stderr,"",fp); + fflush(stderr); */ +- fprintf(stderr,"in getOneChar, fd=%d,fp=%p",fd,fp); +- fflush(stderr); ++ emsg("in getOneChar, fd=%d,fp=%p",fd,fp); + if (fd == 0) + { joe(fd); + return -1; +@@ -529,16 +525,14 @@ getOneChar(FILE *fp) + if (high > 0) + { + int ch ; +- fprintf(stderr,"in getOneChar, fd=%d,fp=%p",fd,fp); +- fflush(stderr); ++ emsg("in getOneChar, fd=%d,fp=%p",fd,fp); + ch = getc(fp); + if ( ch != EOF || feof(fp) ) { + /* fprintf(stderr,"< 0x%x returning %d,%c>\n",fp,ch,ch); + fflush(stderr); + */ + } +- fprintf(stderr,"in getOneChar, ch= %c,%d\n",ch,ch); +- fflush(stderr); ++ emsg("in getOneChar, ch= %c,%d\n",ch,ch); + CHECK_INTERRUPT; + if (ch != EOF) return ch; + if (feof(fp)) return EOF; +@@ -548,10 +542,7 @@ getOneChar(FILE *fp) + } + + #ifdef DODEBUG +-#define dprintf(s,arg) \ +- do {fprintf(stderr,s,arg); \ +- fflush(stderr); }\ +- while(0) ++#define dprintf(s,arg) emsg(s,arg) + #else + #define dprintf(s,arg) + #endif +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -2,6 +2,7 @@ + + #include "include.h" + ++#if !defined(__MINGW32__) && !defined(__CYGWIN__) + extern FILE *stdin __attribute__((weak)); + extern FILE *stderr __attribute__((weak)); + extern FILE *stdout __attribute__((weak)); +@@ -13,6 +14,7 @@ extern char *rl_readline_name __attribu + extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); + extern const char *rl_readline_name __attribute__((weak)); + #endif ++#endif + + void + prelink_init(void) { +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -390,14 +390,14 @@ edit_double(int n, double d, int *sp, ch + + truncate_double(b,d,n!=7); + +- if (isdigit(b[0])) { ++ if (isdigit((int)b[0])) { + b[1]=b[0]; + (*ep)++; + } + if (b[2]=='0') (*ep)++; + b[2] = b[1]; + p = b + 2; +- for (i=0;i sizeof(buf)) +- { fprintf(stderr,"wow that is badly defined regexp.."); +- exit(1);} ++ { emsg("wow that is badly defined regexp.."); ++ do_gcl_abort();} + regcp --; + { char *p=buf; + +@@ -567,8 +567,8 @@ regatom(int *flagp) + while (p < regcp) + { result[*(unsigned char *)p] = matches; + if (case_fold_search) +- {result[tolower(*p)] = matches; +- result[toupper(*p)] = matches; p++;} ++ {result[tolower((int)*p)] = matches; ++ result[toupper((int)*p)] = matches; p++;} + else + result[*(unsigned char *)p++] = matches; + +@@ -912,9 +912,9 @@ regexec(register regexp *prog, register + if (prog->regstart != '\0') + /* We know what char it must start with. */ + { if (case_fold_search) +- {char ch = tolower(prog->regstart); ++ {char ch = tolower((int)prog->regstart); + while (*s) +- { if (tolower(*s)==ch) ++ { if (tolower((int)*s)==ch) + {if (regtry(prog, s)) + RETURN_VAL(1);} + s++;}} +@@ -1025,12 +1025,12 @@ regmatch(char *prog) + scan = prog; + #ifdef DEBUG + if (scan != NULL && regnarrate) +- fprintf(stderr, "%s(\n", regprop(scan)); ++ emsg("%s(\n", regprop(scan)); + #endif + while (scan != NULL) { + #ifdef DEBUG + if (regnarrate) +- fprintf(stderr, "%s...\n", regprop(scan)); ++ emsg("%s...\n", regprop(scan)); + #endif + next = regnext(scan); + +@@ -1055,7 +1055,7 @@ regmatch(char *prog) + opnd = OPERAND(scan); + if (case_fold_search) + while (*opnd ) +- { if (tolower(*opnd) != tolower(*ch)) ++ { if (tolower((int)*opnd) != tolower((int)*ch)) + return 0; + else { ch++; opnd++;}} + else +@@ -1175,7 +1175,7 @@ regmatch(char *prog) + if (OP(next) == EXACTLY) + nextch = *OPERAND(next); + if (case_fold_search) +- nextch = tolower(nextch); ++ nextch = tolower((int)nextch); + min = (OP(scan) == STAR) ? 0 : 1; + save = reginput; + no = regrepeat(OPERAND(scan)); +@@ -1184,7 +1184,7 @@ regmatch(char *prog) + if (nextch == '\0' || + *reginput == nextch + || (case_fold_search && +- tolower(*reginput) == nextch)) ++ tolower((int)*reginput) == nextch)) + if (regmatch(next)) + return(1); + /* Couldn't or didn't -- back up. */ +@@ -1237,8 +1237,8 @@ regrepeat(char *p) + case EXACTLY: + { char ch = *opnd; + if (case_fold_search) +- { ch = tolower(*opnd); +- while (ch == tolower(*scan)) ++ { ch = tolower((int)*opnd); ++ while (ch == tolower((int)*scan)) + { + count++; + scan++;}} +@@ -1488,7 +1488,7 @@ min_initial_branch_length(regexp *x, uns + { op = OP(s); + next = (s) + NEXT(s); + if (op != END && op != BRANCH) +- abort(); ++ do_gcl_abort(); + s = s+3; + { int this = 0; + int anythis =0; +@@ -1509,8 +1509,8 @@ min_initial_branch_length(regexp *x, uns + n--; + while(1) + { if (case_fold_search) +- {MINIMIZE(buf[tolower(*ss)],n); +- MINIMIZE(buf[toupper(*ss)],n); ++ {MINIMIZE(buf[tolower((int)*ss)],n); ++ MINIMIZE(buf[toupper((int)*ss)],n); + } + else + { MINIMIZE(buf[*(unsigned char *)ss],n);} +@@ -1575,7 +1575,7 @@ min_initial_branch_length(regexp *x, uns + void + regerror(char *s) + { +- fprintf(stderr, "regexp error %s\n", s); ++ emsg("regexp error %s\n", s); + } + #endif + +--- gcl-2.6.12.orig/o/run_process.c ++++ gcl-2.6.12/o/run_process.c +@@ -140,19 +140,19 @@ void run_process ( char *name ) + if ( ! CloseHandle ( hChildStderrWrite ) ) DisplayError ( "CloseHandle: Error write" ); + + #if 0 +- fprintf ( stderr, "Before write\n" ); ++ emsg("Before write\n" ); + WriteFile ( hChildStdinWrite, chBuf, strlen ( chBuf ), + &dwWritten, NULL); + FlushFileBuffers ( hChildStdinWrite ); + FlushFileBuffers ( hChildStdoutRead ); +- fprintf ( stderr, "Before read\n" ); ++ emsg("Before read\n" ); + if ( ! ReadFile( hChildStdoutRead, chBuf, 2, &dwRead, NULL ) || + dwRead == 0 ) { + DisplayError ( "Nothing read\n" ); + } else { +- fprintf ( stderr, "Got Back: %s\n", chBuf ); ++ emsg("Got Back: %s\n", chBuf ); + } +- fprintf ( stderr, "After read\n" ); ++ emsg("After read\n" ); + #endif + + +@@ -168,8 +168,7 @@ void run_process ( char *name ) + fprintf ( ifp, "button .wibble\n" ); + fflush (ifp); + fgets ( buf, 2, ofp ); +- fprintf ( stderr, +- "run_process: ofd = %x, ofp = %x, ifd = %x, ifp = %x, buf[0] = %x, buf[1] = %x, buf = %s\n", ++ emsg("run_process: ofd = %x, ofp = %x, ifd = %x, ifp = %x, buf[0] = %x, buf[1] = %x, buf = %s\n", + ofd, ofp, ifd, ifp, buf[0], buf[1], buf ); + } + #endif +@@ -276,7 +275,7 @@ void siLrun_process() + strcat ( cmdline, " "); + } + strcat ( cmdline, vs_base[i]->st.st_self ); +- fprintf ( stderr, "siLrun_process: cmdline=%s\n", cmdline ); ++ emsg("siLrun_process: cmdline=%s\n", cmdline ); + argc++; + } + signals_allowed = sig_at_read; +@@ -540,12 +539,11 @@ char **argv; + massert(dup(fdin)>=0); + close(1); + massert(dup(fdout)>=0); +- fprintf(stderr, "\n***** Spawning process %s ", pname); ++ emsg("\n***** Spawning process %s ", pname); + if (execvp(pname, argv) == -1) + { +- fprintf(stderr, "\n***** Error in process spawning *******"); +- fflush(stderr); +- exit(1); ++ emsg("\n***** Error in process spawning *******"); ++ do_gcl_abort(); + } + } + +@@ -604,7 +602,7 @@ getpagesize() + } + + dlclose() +-{fprintf(stderr,"calling 'dl' function sun did not supply..exitting") ;exit(1);} ++{emsg("calling 'dl' function sun did not supply..exitting") ;do_gcl_abort();} + dgettext() + {dlclose();} + dlopen() +--- gcl-2.6.12.orig/o/save.c ++++ gcl-2.6.12/o/save.c +@@ -20,21 +20,12 @@ LFD(siLsave)(void) { + + char filename[256]; + extern char *kcl_self; +- extern void *initial_sbrk; + + check_arg(1); + check_type_or_pathname_string_symbol_stream(&vs_base[0]); + coerce_to_filename(vs_base[0], filename); + +-#ifdef CLEANUP_CODE +- CLEANUP_CODE +-#elif defined(USE_CLEANUP) +- _cleanup(); +-#endif +- +- raw_image=FALSE; +- cs_org=0; +- initial_sbrk=core_end; ++ gcl_cleanup(1); + + #ifdef MEMORY_SAVE + MEMORY_SAVE(kcl_self,filename); +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -175,7 +175,7 @@ relocate_symbols(struct syment *sym,stru + if ((answ=find_sym_ptable(s))) + sym->n_value=answ->address; + else +- massert(!fprintf(stderr,"Unrelocated non-local symbol: %s\n",s)); ++ massert(!emsg("Unrelocated non-local symbol: %s\n",s)); + + if (c) + sym->n.n_name[8]=c; +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -181,7 +181,7 @@ relocate(Sym *sym1,void *v,ul a,ul start + #include RELOC_H + + default: +- fprintf(stderr, "Unknown reloc type %lu\n", tp); ++ emsg("Unknown reloc type %lu\n", tp); + massert(tp&~tp); + + } +@@ -234,7 +234,7 @@ relocate_symbols(Sym *sym,Sym *syme,Shdr + sym->st_value=a->address; + + else if (ELF_ST_BIND(sym->st_info)!=STB_LOCAL) +- massert(!fprintf(stderr,"Unrelocated non-local symbol: %s\n",st1+sym->st_name)); ++ massert(!emsg("Unrelocated non-local symbol: %s\n",st1+sym->st_name)); + + } + +--- gcl-2.6.12.orig/o/sfasli.c ++++ gcl-2.6.12/o/sfasli.c +@@ -146,6 +146,15 @@ use_symbols(double d,...) { + + } + #endif ++#else ++int ++use_symbols(double d,...) { ++ ++ d=sin(d)+cos(d); ++ ++ return (int)d; ++ ++} + #endif + + void +--- gcl-2.6.12.orig/o/sfaslmacho.c ++++ gcl-2.6.12/o/sfaslmacho.c +@@ -144,7 +144,7 @@ relocate_symbols(struct nlist *n1,struct + else if ((nd=find_sym_ptable(st1+n->n_un.n_strx))) + n->n_value=nd->address; + else if (n->n_type&(N_PEXT|N_EXT)) +- massert(!fprintf(stderr,"Unrelocated non-local symbol: %s\n",st1+n->n_un.n_strx)); ++ massert(!emsg("Unrelocated non-local symbol: %s\n",st1+n->n_un.n_strx)); + + return 0; + +--- gcl-2.6.12.orig/o/sfaslmacosx.c ++++ gcl-2.6.12/o/sfaslmacosx.c +@@ -37,17 +37,7 @@ typedef int (*func) (); + /* Externalize the command line used to build loadable object files (a.k.a. bundles). */ + object sSAmacosx_ldcmdA = 0L; + +-static void sfasl_error (char *format, ...) +-{ +- va_list ap; +- +- va_start (ap, format); +- fprintf (stderr, "fasload: "); +- vfprintf (stderr, format, ap); +- fprintf (stderr, "\n"); +- va_end (ap); +- exit (1); +-} ++#define sfasl_error(a,b...) {emsg(a,b);do_gcl_abort();} + + /* static void get_init_name (object faslfile, char *init_fun) */ + /* { */ +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -266,32 +266,32 @@ overlap_check(struct contblock *t1,struc + + if (!inheap(t1)) { + fprintf(stderr,"%p not in heap\n",t1); +- exit(1); ++ do_gcl_abort(); + } + + for (p=t2;p;p=p->cb_link) { + + if (!inheap(p)) { + fprintf(stderr,"%p not in heap\n",t1); +- exit(1); ++ do_gcl_abort(); + } + + if ((p<=t1 && (void *)p+p->cb_size>(void *)t1) || + (t1<=p && (void *)t1+t1->cb_size>(void *)p)) { + fprintf(stderr,"Overlap %u %p %u %p\n",t1->cb_size,t1,p->cb_size,p); +- exit(1); ++ do_gcl_abort(); + } + + if (p==p->cb_link) { + fprintf(stderr,"circle detected at %p\n",p); +- exit(1); ++ do_gcl_abort(); + } + + } + + if (t1==t1->cb_link) { + fprintf(stderr,"circle detected at %p\n",t1); +- exit(1); ++ do_gcl_abort(); + } + + } +@@ -365,7 +365,7 @@ memprotect_handler_test(int sig, long co + + if (memprotect_handler_invocations) { + memprotect_result=memprotect_multiple_invocations; +- exit(-1); ++ do_gcl_abort(); + } + memprotect_handler_invocations=1; + if (faddr!=memprotect_test_address) +@@ -387,7 +387,7 @@ memprotect_test(void) { + return memprotect_result!=memprotect_success; + if (atexit(memprotect_print)) { + fprintf(stderr,"Cannot setup memprotect_print on exit\n"); +- exit(-1); ++ do_gcl_abort(); + } + + if (!(b1=alloca(2*p))) { +--- gcl-2.6.12.orig/o/sockets.c ++++ gcl-2.6.12/o/sockets.c +@@ -70,7 +70,7 @@ int w32_socket_init(void) + } else { + if (WSAStartup(0x0101, &WSAData)) { + w32_socket_initialisations = 0; +- fprintf ( stderr, "WSAStartup failed\n" ); ++ emsg("WSAStartup failed\n" ); + WSACleanup(); + rv = -1; + } +@@ -158,13 +158,9 @@ the socket. If PORT is zero do automati + #endif + (cRetry < BIND_MAX_RETRY)); + if (0) +- { +- fprintf(stderr, +- "\nAssigned automatic address to socket : port(%d), errno(%d), bind_rc(%d), iLastAddressUsed(%d), retries(%d)\n" ++ emsg("\nAssigned automatic address to socket : port(%d), errno(%d), bind_rc(%d), iLastAddressUsed(%d), retries(%d)\n" + , addr.sin_port, errno, rc, iLastAddressUsed, cRetry + ); +- fflush(stderr); +- } + } + else + { +@@ -221,8 +217,7 @@ and returns (list* named_socket fd name1 + fd = accept(fix(car(named_socket)) , (struct sockaddr *)&addr, &n); + if (fd < 0) + { +- perror("ERROR ! accept on socket failed in sock_accept_connection"); +- fflush(stderr); ++ emsg("ERROR ! accept on socket failed in sock_accept_connection"); + return Cnil; + } + x = alloc_simple_string(sizeof(struct connection_state)); +@@ -432,7 +427,7 @@ fill pointer, and this will be advanced. + + + break; +- default: abort(); ++ default: do_gcl_abort(); + } + + switch (t) { +@@ -446,7 +441,7 @@ fill pointer, and this will be advanced. + if (downcase) + while (--len>=0) + { char c = *p++; +- c=tolower(c); ++ c=tolower((int)c); + if(needs_quoting[(unsigned char)c]) + PUSH('\\'); + PUSH(c);} +--- gcl-2.6.12.orig/o/unexelf.c ++++ gcl-2.6.12/o/unexelf.c +@@ -401,7 +401,7 @@ Filesz Memsz Flags Alig + Instead we read the whole file, modify it, and write it out. */ + + #ifndef emacs +-#define fatal(a, b...) fprintf (stderr, a, ##b), exit (1) ++#define fatal(a, b...) emsg(a,##b),do_gcl_abort() + #else + #include "config.h" + extern void fatal (char *, ...); +@@ -604,7 +604,7 @@ find_section (char *name, char *section_ + for (idx = 1; idx < old_file_h->e_shnum; idx++) + { + #ifdef DEBUG +- fprintf (stderr, "Looking for %s - found %s\n", name, ++ emsg("Looking for %s - found %s\n", name, + section_names + OLD_SECTION_H (idx).sh_name); + #endif + if (!strcmp (section_names + OLD_SECTION_H (idx).sh_name, +@@ -752,13 +752,13 @@ unexec (char *new_name, char *old_name, + (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr); + + #ifdef DEBUG +- fprintf (stderr, "old_bss_index %d\n", old_bss_index); +- fprintf (stderr, "old_bss_addr %x\n", old_bss_addr); +- fprintf (stderr, "old_bss_size %x\n", old_bss_size); +- fprintf (stderr, "new_bss_addr %x\n", new_bss_addr); +- fprintf (stderr, "new_data2_addr %x\n", new_data2_addr); +- fprintf (stderr, "new_data2_size %x\n", new_data2_size); +- fprintf (stderr, "new_data2_offset %x\n", new_data2_offset); ++ emsg("old_bss_index %d\n", old_bss_index); ++ emsg("old_bss_addr %x\n", old_bss_addr); ++ emsg("old_bss_size %x\n", old_bss_size); ++ emsg("new_bss_addr %x\n", new_bss_addr); ++ emsg("new_data2_addr %x\n", new_data2_addr); ++ emsg("new_data2_size %x\n", new_data2_size); ++ emsg("new_data2_offset %x\n", new_data2_offset); + #endif + + if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size) +@@ -806,10 +806,10 @@ unexec (char *new_name, char *old_name, + new_file_h->e_shnum += 1; + + #ifdef DEBUG +- fprintf (stderr, "Old section offset %x\n", old_file_h->e_shoff); +- fprintf (stderr, "Old section count %d\n", old_file_h->e_shnum); +- fprintf (stderr, "New section offset %x\n", new_file_h->e_shoff); +- fprintf (stderr, "New section count %d\n", new_file_h->e_shnum); ++ emsg("Old section offset %x\n", old_file_h->e_shoff); ++ emsg("Old section count %d\n", old_file_h->e_shnum); ++ emsg("New section offset %x\n", new_file_h->e_shoff); ++ emsg("New section count %d\n", new_file_h->e_shnum); + #endif + + /* Fix up a new program header. Extend the writable data segment so +--- gcl-2.6.12.orig/o/unexmacosx.c ++++ gcl-2.6.12/o/unexmacosx.c +@@ -299,18 +299,7 @@ unexec_copy (off_t dest, off_t src, ssiz + + /* Debugging and informational messages routines. */ + +-static void +-unexec_error (char *format, ...) +-{ +- va_list ap; +- +- va_start (ap, format); +- fprintf (stderr, "unexec: "); +- vfprintf (stderr, format, ap); +- fprintf (stderr, "\n"); +- va_end (ap); +- exit (1); +-} ++#define unexec_error(a,b...) emsg(a,##b),do_gcl_abort() + + /* More informational messages routines. */ + +--- gcl-2.6.12.orig/o/unexnt.c ++++ gcl-2.6.12/o/unexnt.c +@@ -108,7 +108,7 @@ void recreate_heap1() + if (GetModuleFileName (NULL, executable_path, MAX_PATH) == 0) + { + printf ("Failed to find path for executable.\n"); +- exit (1); ++ do_gcl_abort(); + } + recreate_heap (executable_path); + } +@@ -156,7 +156,7 @@ _start (void) + if (GetModuleFileName (NULL, executable_path, MAX_PATH) == 0) + { + printf ("Failed to find path for executable.\n"); +- exit (1); ++ do_gcl_abort(); + } + + #if 1 +@@ -214,7 +214,7 @@ unexec (char *new_name, char *old_name, + void *entry_address) + { + #ifdef __CYGWIN32__ +- file_data in_file, out_file; ++ static file_data in_file, out_file; + char out_filename[MAX_PATH], in_filename[MAX_PATH]; + char filename[MAX_PATH]; + unsigned long size; +@@ -244,7 +244,7 @@ unexec (char *new_name, char *old_name, + strcat(filename, (strcmp (ptr, ".exe") && strcmp (ptr, ".EXE"))?".exe":""); + cygwin_conv_to_full_win32_path(filename,out_filename); + #else +- file_data in_file, out_file; ++ static file_data in_file, out_file; + char out_filename[MAX_PATH], in_filename[MAX_PATH]; + unsigned long size; + char *ptr; +@@ -284,7 +284,7 @@ unexec (char *new_name, char *old_name, + { + printf ("Failed to open %s (%ld)...bailing.\n", + in_filename, GetLastError ()); +- exit (1); ++ do_gcl_abort(); + } + + /* Get the interesting section info, like start and size of .bss... */ +@@ -305,7 +305,7 @@ unexec (char *new_name, char *old_name, + { + printf ("Failed to open %s (%ld)...bailing.\n", + out_filename, GetLastError ()); +- exit (1); ++ do_gcl_abort(); + } + + /* Set the flag (before dumping). */ +@@ -452,7 +452,7 @@ get_bss_info_from_map_file (file_data *p + { + printf ("Failed to open map file %s, error %d...bailing out.\n", + map_filename, GetLastError ()); +- exit (-1); ++ do_gcl_abort(); + } + + while (fgets (buffer, sizeof (buffer), map)) +@@ -463,7 +463,7 @@ get_bss_info_from_map_file (file_data *p + if (n != 2) + { + printf ("Failed to scan the .bss section line:\n%s", buffer); +- exit (-1); ++ do_gcl_abort(); + } + break; + } +@@ -534,7 +534,7 @@ get_section_info (file_data *p_infile) + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) + { + printf ("Unknown EXE header in %s...bailing.\n", p_infile->name); +- exit (1); ++ do_gcl_abort(); + } + nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) + + dos_header->e_lfanew); +@@ -542,7 +542,7 @@ get_section_info (file_data *p_infile) + { + printf ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n", + p_infile->name); +- exit (1); ++ do_gcl_abort(); + } + + /* Check the NT header signature ... */ +@@ -729,7 +729,7 @@ read_in_bss (char *filename) + if (file == INVALID_HANDLE_VALUE) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + /* Seek to where the .bss section is tucked away after the heap... */ +@@ -737,7 +737,7 @@ read_in_bss (char *filename) + if (SetFilePointer (file, index, NULL, FILE_BEGIN) == 0xFFFFFFFF) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + +@@ -746,7 +746,7 @@ read_in_bss (char *filename) + if (!ReadFile (file, bss_start, bss_size, &n_read, (void *)NULL)) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + CloseHandle (file); +@@ -767,7 +767,7 @@ map_in_heap (char *filename) + if (file == INVALID_HANDLE_VALUE) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + size = GetFileSize (file, &upper_size); +@@ -776,7 +776,7 @@ map_in_heap (char *filename) + if (!file_mapping) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + size = get_committed_heap_size (); +@@ -797,7 +797,7 @@ map_in_heap (char *filename) + MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE) == NULL) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + /* Seek to the location of the heap data in the executable. */ +@@ -805,7 +805,7 @@ map_in_heap (char *filename) + if (SetFilePointer (file, i, NULL, FILE_BEGIN) == 0xFFFFFFFF) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + /* Read in the data. */ +@@ -813,7 +813,7 @@ map_in_heap (char *filename) + get_committed_heap_size (), &n_read, (void *)NULL)) + { + i = GetLastError (); +- exit (1); ++ do_gcl_abort(); + } + + CloseHandle (file); +@@ -1009,7 +1009,7 @@ sbrk (ptrdiff_t increment) + if (((unsigned long) data_region_base & ~VALMASK) != 0) + { + printf ("Error: The heap was allocated in upper memory.\n"); +- exit (1); ++ do_gcl_abort(); + } + + data_region_end = data_region_base; +@@ -1090,7 +1090,7 @@ recreate_heap (char *executable_path) { + MEM_RESERVE, + PAGE_NOACCESS); + if (!tmp) +- exit (1); ++ do_gcl_abort(); + + /* We read in the data for the .bss section from the executable + first and map in the heap from the executable second to prevent +--- gcl-2.6.12.orig/o/unixsave.c ++++ gcl-2.6.12/o/unixsave.c +@@ -105,16 +105,16 @@ char *original_file, *save_file; + */ + + if (stdin != original || original->_file != 0) { +- fprintf(stderr, "Can't open the original file.\n"); +- exit(1); ++ emsg("Can't open the original file.\n"); ++ do_gcl_abort(); + } + setbuf(original, stdin_buf); + fclose(stdout); + unlink(save_file); + n = open(save_file, O_CREAT|O_WRONLY, 0777); + if (n != 1 || (save = fdopen(n, "w")) != stdout) { +- fprintf(stderr, "Can't open the save file.\n"); +- exit(1); ++ emsg("Can't open the save file.\n"); ++ do_gcl_abort(); + } + setbuf(save, stdout_buf); + +--- gcl-2.6.12.orig/o/unixsys.c ++++ gcl-2.6.12/o/unixsys.c +@@ -28,11 +28,6 @@ Foundation, 675 Mass Ave, Cambridge, MA + + #include "include.h" + +-#ifdef _WIN32 +-#include +-#define sleep(n) Sleep(1000 * n) +-#endif +- + #ifdef ATT3B2 + #include + int +--- gcl-2.6.12.orig/o/usig.c ++++ gcl-2.6.12/o/usig.c +@@ -295,12 +295,18 @@ sigio(void) + {ifuncall1(sSsigio_interrupt,Cnil);} + + ++static void ++sigterm(void) ++{do_gcl_abort();} ++ ++ + + void + install_default_signals(void) + { gcl_signal(SIGFPE, sigfpe3); + gcl_signal(SIGPIPE, sigpipe); + gcl_signal(SIGINT, sigint); ++ gcl_signal(SIGTERM, sigterm); + gcl_signal(SIGUSR1, sigusr1); + gcl_signal(SIGIO, sigio); + gcl_signal(SIGALRM, sigalrm); +--- gcl-2.6.12.orig/o/usig2.c ++++ gcl-2.6.12/o/usig2.c +@@ -259,7 +259,7 @@ before_interrupt(struct save_for_interru + /* #define XS(a) *pp++ = * (void **) (&a); */ + #include "usig2_aux.c" + if ((pp - (&(p->save_objects)[0])) >= (sizeof(p->save_objects)/sizeof(void *))) +- abort(); ++ do_gcl_abort(); + } + #define MINN(a,b) (atoken_st_dim = MINN(token->st.st_dim,tok_leng+1); +--- /dev/null ++++ gcl-2.6.12/o/wpool.c +@@ -0,0 +1,35 @@ ++#include ++ ++#define NO_PRELINK_UNEXEC_DIVERSION ++char *rb_end=NULL,*rb_start=NULL,*heap_end=NULL; ++void *data_start=NULL; ++int use_pool=1; ++ ++#include "include.h" ++#include "page.h" ++#include "pool.h" ++ ++/*lintian*/ ++void ++assert_error(const char *a,unsigned l,const char *f,const char *n) { ++ update_pool(0); ++ get_pool(); ++ pool_check(); ++} ++ ++int ++main(int argc,char * argv[],char * envp[]) { ++ ++ int s; ++ ++ sscanf(argv[1],"%d",&s); ++ open_pool(); ++ for (;;) { ++ lock_pool(); ++ fprintf(stderr,"master pid %lu %lu processess %lu pages\n",Pool->pid,Pool->n,Pool->s); ++ fflush(stderr); ++ unlock_pool(); ++ sleep(s); ++ } ++ return 0; ++} diff --git a/debian/patches/Version_2_6_13pre17 b/debian/patches/Version_2_6_13pre17 new file mode 100644 index 0000000..354686f --- /dev/null +++ b/debian/patches/Version_2_6_13pre17 @@ -0,0 +1,76 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-13) unstable; urgency=medium + . + * Version_2_6_13pre16 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -749,11 +749,15 @@ alloc_from_freelist(struct typemanager * + static inline void + grow_linear1(struct typemanager *tm) { + +- fixnum maxgro=resv_pages ? available_pages : 0; ++ if (!sSAoptimize_maximum_pagesA || sSAoptimize_maximum_pagesA->s.s_dbind==Cnil) { + +- if (tm->tm_type==t_relocatable) maxgro>>=1; ++ fixnum maxgro=resv_pages ? available_pages : 0; + +- set_tm_maxpage(tm,grow_linear(tm->tm_npage,tm->tm_growth_percent,tm->tm_min_grow, tm->tm_max_grow,maxgro)); ++ if (tm->tm_type==t_relocatable) maxgro>>=1; ++ ++ set_tm_maxpage(tm,grow_linear(tm->tm_npage,tm->tm_growth_percent,tm->tm_min_grow, tm->tm_max_grow,maxgro)); ++ ++ } + + } + +@@ -802,7 +806,8 @@ do_gc_p(struct typemanager *tm,fixnum n) + + pp=gc_page_max*phys_pages; + +- return page(recent_allocation)>(1.0+gc_alloc_min-(double)ufmin(cpool,pp)/pp)*data_pages(); ++ return page(recent_allocation)>(1.0+gc_alloc_min-(double)ufmin(cpool,pp)/pp)*data_pages() || ++ 2*tpage(tm,n)>available_pages; + + } + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -236,7 +236,7 @@ get_gc_environ(void) { + massert(mem_multiple>=0.0); + } + +- gc_alloc_min=0.1; ++ gc_alloc_min=0.05; + if ((e=getenv("GCL_GC_ALLOC_MIN"))) { + massert(sscanf(e,"%lf",&gc_alloc_min)==1); + massert(gc_alloc_min>=0.0); +@@ -280,7 +280,7 @@ setup_maxpages(double scale) { + resv_pages=available_pages=0; + available_pages=check_avail_pages(); + +- resv_pages=40 + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-14) unstable; urgency=medium + . + * Version_2_6_13pre17 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -82,7 +82,7 @@ + + (defun safe-system (string) + (multiple-value-bind +- (code result) (system (ts string)) ++ (code result) (system (mysub (ts string) "$" "\\$")) + (unless (and (zerop code) (zerop result)) + (cerror "Continues anyway." + "(SYSTEM ~S) returned a non-zero value ~D." +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -715,6 +715,7 @@ infodir + docdir + oldincludedir + includedir ++runstatedir + localstatedir + sharedstatedir + sysconfdir +@@ -821,6 +822,7 @@ datadir='${datarootdir}' + sysconfdir='${prefix}/etc' + sharedstatedir='${prefix}/com' + localstatedir='${prefix}/var' ++runstatedir='${localstatedir}/run' + includedir='${prefix}/include' + oldincludedir='/usr/include' + docdir='${datarootdir}/doc/${PACKAGE}' +@@ -1073,6 +1075,15 @@ do + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + ++ -runstatedir | --runstatedir | --runstatedi | --runstated \ ++ | --runstate | --runstat | --runsta | --runst | --runs \ ++ | --run | --ru | --r) ++ ac_prev=runstatedir ;; ++ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ ++ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ ++ | --run=* | --ru=* | --r=*) ++ runstatedir=$ac_optarg ;; ++ + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ +@@ -1210,7 +1221,7 @@ fi + for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ +- libdir localedir mandir ++ libdir localedir mandir runstatedir + do + eval ac_val=\$$ac_var + # Remove trailing slashes. +@@ -1363,6 +1374,7 @@ Fine tuning of the installation director + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] ++ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] +@@ -4423,6 +4435,7 @@ case $use in + # if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi + ;; + mips*) ++ TCFLAGS="$TCFLAGS -mplt" + # if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 + ;; + ia64*) +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -640,6 +640,7 @@ case $use in + # if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi + ;; + mips*) ++ TCFLAGS="$TCFLAGS -mplt" + # if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 + ;; + ia64*) +--- gcl-2.6.12.orig/h/elf32_mips_reloc.h ++++ gcl-2.6.12/h/elf32_mips_reloc.h +@@ -19,10 +19,7 @@ + case R_MIPS_CALL16: + gote=got+sym->st_size-1; + store_val(where,MASK(16),((void *)gote-(void *)got)); +- if (s>=ggot && sst_other) s=gpd=(ul)got-(sym->st_other==2 ? 0 : (ul)where); +@@ -37,7 +34,8 @@ + a+=(a&0x8000)<<1; + store_val(where,MASK(16),a); + a=0x10000|(a>>16); +- for (hr=hr ? hr : r;--r>=hr && ELF_R_TYPE(r->r_info)==R_MIPS_HI16;) +- relocate(sym1,r,a,start,got,gote); ++ for (hr=hr ? hr : r;--r>=hr;) ++ if (ELF_R_TYPE(r->r_info)==R_MIPS_HI16) ++ relocate(sym1,r,a,start,got,gote); + hr=NULL;gpd=0; + break; +--- gcl-2.6.12.orig/h/elf32_mips_reloc_special.h ++++ gcl-2.6.12/h/elf32_mips_reloc_special.h +@@ -1,65 +1,9 @@ +-static ul gpd,ggot,ggote; static Rel *hr; +- +-static int +-write_stub(ul s,ul *got,ul *gote) { +- +- *gote=(ul)(gote+2); +- *++gote=s; +- s=((void *)gote-(void *)got); +- *++gote=(0x23<<26)|(0x1c<<21)|(0x19<<16)|s; +- *++gote=(0x23<<26)|(0x19<<21)|(0x19<<16)|0; +- *++gote=0x03200008; +- *++gote=0x00200825; +- +- return 0; +- +-} +- +-static int +-make_got_room_for_stub(Shdr *sec1,Shdr *sece,Sym *sym,const char *st1,ul *gs) { +- +- Shdr *ssec=sec1+sym->st_shndx; +- struct node *a; +- if ((ssec>=sece || !ALLOC_SEC(ssec)) && +- (a=find_sym_ptable(st1+sym->st_name)) && +- a->address>=ggot && a->addresssh_addr,pe=p+sec->sh_size;psh_entsize) { +- q=p; +- if (q[0]==DT_MIPS_GOTSYM) +- gotsym=q[1]; +- if (q[0]==DT_MIPS_LOCAL_GOTNO) +- locgotno=q[1]; +- +- } +- massert(gotsym && locgotno); +- +- massert(sec=get_section(".MIPS.stubs",sec1,sece,sn)); +- stub=sec->sh_addr; +- stube=sec->sh_addr+sec->sh_size; +- +- massert(sec=get_section(".got",sec1,sece,sn)); +- ggot=sec->sh_addr+locgotno*sec->sh_entsize; +- ggote=sec->sh_addr+sec->sh_size; +- +- for (ds1+=gotsym,sym=ds1;symst_value || (sym->st_value>=stub && sym->st_valuest_value=ggot+(sym-ds1)*sec->sh_entsize; +- + return 0; + + } +@@ -74,7 +18,7 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + ul q; + + for (q=0,sym=sym1;symst_name; ++ const char *s=st1+sym->st_name; + if ((sym->st_other=strcmp(s,"_gp_disp") ? (strcmp(s,"__gnu_local_gp") ? 0 : 2) : 1)) { + q++; + sym->st_info=ELF_ST_INFO(STB_LOCAL,ELF_ST_TYPE(sym->st_info)); +@@ -94,10 +38,8 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + + sym=sym1+ELF_R_SYM(r->r_info); + +- if (!sym->st_size) { ++ if (!sym->st_size) + sym->st_size=++*gs; +- massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); +- } + + } + +--- gcl-2.6.12.orig/h/elf64_mips_reloc.h ++++ gcl-2.6.12/h/elf64_mips_reloc.h +@@ -15,10 +15,7 @@ + gote=got+(a>>32)-1; + a&=MASK(32); + store_val(where,MASK(16),((void *)gote-(void *)got)); +- if (s>=ggot && s=hr && ELF_R_TYPE(ra->r_info)==R_MIPS_HI16;) +- relocate(sym1,ra,ra->r_addend|(1L<<32)|(a<<32),start,got,gote); ++ for (hr=hr ? hr : (void *)ra;--ra>=hr;) ++ if (ELF_R_TYPE(ra->r_info)==R_MIPS_HI16) ++ relocate(sym1,ra,ra->r_addend|(1L<<32)|(a<<32),start,got,gote); + } + hr=NULL; + break; +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -1,4 +1,4 @@ +-static ul ggot,ggote; static Rela *hr; ++static Rela *hr; + + #undef ELF_R_SYM + #define ELF_R_SYM(a_) (a_&0xffffffff) +@@ -7,68 +7,9 @@ static ul ggot,ggote; static Rela *hr; + #define ELF_R_FTYPE(a_) ((a_>>56)&0xff) + + static int +-write_stub(ul s,ul *got,ul *gote) { +- +- int *goti; +- +- +- *gote=(ul)(goti=(void *)(gote+2)); +- *++gote=s; +- s=((void *)gote-(void *)got); +- *goti++=(0x37<<26)|(0x1c<<21)|(0x19<<16)|s; +- *goti++=(0x37<<26)|(0x19<<21)|(0x19<<16)|0; +- *goti++=0x03200008; +- *goti++=0x00200825; +- +- return 0; +- +-} +- +-static int +-make_got_room_for_stub(Shdr *sec1,Shdr *sece,Sym *sym,const char *st1,ul *gs) { +- +- Shdr *ssec=sec1+sym->st_shndx; +- struct node *a; +- if ((ssec>=sece || !ALLOC_SEC(ssec)) && +- (a=find_sym_ptable(st1+sym->st_name)) && +- a->address>=ggot && a->addresssh_addr,pe=p+sec->sh_size;psh_entsize) { +- q=p; +- if (q[0]==DT_MIPS_GOTSYM) +- gotsym=q[1]; +- if (q[0]==DT_MIPS_LOCAL_GOTNO) +- locgotno=q[1]; +- +- } +- massert(gotsym && locgotno); +- +- massert(sec=get_section(".MIPS.stubs",sec1,sece,sn)); +- stub=sec->sh_addr; +- stube=sec->sh_addr+sec->sh_size; +- +- massert(sec=get_section(".got",sec1,sece,sn)); +- ggot=sec->sh_addr+locgotno*sec->sh_entsize; +- ggote=sec->sh_addr+sec->sh_size; +- +- for (ds1+=gotsym,sym=ds1;symst_value || (sym->st_value>=stub && sym->st_valuest_value=ggot+(sym-ds1)*sec->sh_entsize; +- + return 0; + + } +@@ -104,8 +45,6 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + sym->st_size|=(q<<(a*16)); + } + +- massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); +- + } + + b=sizeof(r->r_addend)*4; +--- gcl-2.6.12.orig/h/mips-linux.h ++++ gcl-2.6.12/h/mips-linux.h +@@ -21,5 +21,4 @@ + #define SPECIAL_RELOC_H "elf64_mips_reloc_special.h" + #endif + +-/*Remove when .MIPS.stubs are replaced with callable .plt entries*/ +-#define LD_BIND_NOW ++#define NEED_STACK_CHK_GUARD +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -38,26 +38,24 @@ + + + (defmacro with-input-from-string ((var string &key index start end) . body) +- (if index +- (multiple-value-bind (ds b) +- (find-declarations body) +- `(let ((,var (make-string-input-stream ,string ,start ,end))) +- ,@ds +- (unwind-protect +- (progn ,@b) +- (setf ,index (si:get-string-input-stream-index ,var))))) +- `(let ((,var (make-string-input-stream ,string ,start ,end))) +- ,@body))) ++ (multiple-value-bind (ds b) ++ (find-declarations body) ++ `(let ((,var (make-string-input-stream ,string ,start ,end))) ++ ,@ds ++ (unwind-protect ++ (progn ,@b) ++ (when ,index (setf ,index (si:get-string-input-stream-index ,var))) ++ (when ,var (close ,var)))))) + ++(defmacro with-output-to-string ((var &optional string &key element-type) . body) ++ (multiple-value-bind (ds b) ++ (find-declarations body) ++ `(let ((,var ,(if string `(make-string-output-stream-from-string ,string) `(make-string-output-stream)))) ++ ,@ds ++ (unwind-protect ++ (progn ,@b ,@(unless string `((get-output-stream-string ,var)))) ++ (when ,var (close ,var)))))) + +-(defmacro with-output-to-string ((var &optional string) . body) +- (if string +- `(let ((,var (make-string-output-stream-from-string ,string))) +- ,@body) +- `(let ((,var (make-string-output-stream))) +- ,@body +- (get-output-stream-string ,var)))) +- + + (defun read-from-string (string + &optional (eof-error-p t) eof-value +--- gcl-2.6.12.orig/lsp/gcl_numlib.lsp ++++ gcl-2.6.12/lsp/gcl_numlib.lsp +@@ -71,29 +71,53 @@ + + (defun cis (x) (exp (* imag-one x))) + +-(defun asin (x) +- (let ((c (- (* imag-one +- (log (+ (* imag-one x) +- (sqrt (- 1.0d0 (* x x))))))))) +- (if (or (and (not (complexp x)) +- (<= x 1.0d0) +- (>= x -1.0d0) +- ) +- (zerop (imagpart c))) +- (realpart c) +- c))) +- +-(defun acos (x) +- (let ((c (- (* imag-one +- (log (+ x (* imag-one +- (sqrt (- 1.0d0 (* x x)))))))))) +- (if (or (and (not (complexp x)) +- (<= x 1.0d0) +- (>= x -1.0d0) +- ) +- (zerop (imagpart c))) +- (realpart c) +- c))) ++(defun real-asinh (x) ++ (declare (real x)) ++ (float (log (+ x (sqrt (+ 1.0 (* x x))))) (float x))) ++ ++(defun asin (z) ++ (declare (optimize (safety 1))) ++ (check-type z number) ++ (if (unless (complexp z) (<= -1 z 1)) ++ (atan z (sqrt (- 1 (* z z)))) ++ (let* ((a (sqrt (- 1 z))) ++ (b (sqrt (+ 1 z)))) ++ (complex (atan (realpart z) (realpart (* a b))) ++ (real-asinh (imagpart (* (conjugate a) b))))))) ++ ++(defun acos (z) ++ (declare (optimize (safety 1))) ++ (check-type z number) ++ (if (unless (complexp z) (<= -1 z 1)) ++ (* 2 (atan (- 1 z) (sqrt (- 1 (* z z))))) ++ (let* ((a (sqrt (- 1 z))) ++ (b (sqrt (+ 1 z)))) ++ (complex (* 2 (atan (realpart a) (realpart b))) ++ (real-asinh (imagpart (* (conjugate b) a))))))) ++ ++(defun asinh (x) ++ (declare (optimize (safety 1))) ++ (check-type x number) ++ (if (realp x) ++ (real-asinh x) ++ (let* ((r (asin (complex (- (imagpart x)) (realpart x))))) ++ (complex (imagpart r) (- (realpart r)))))) ++ ++(defun acosh (z) ++ (declare (optimize (safety 1))) ++ (check-type z number) ++ (if (unless (complexp z) (>= z 1)) ++ (real-asinh (sqrt (- (* z z) 1))) ++ (let* ((a (sqrt (- z 1))) ++ (b (sqrt (+ z 1)))) ++ (complex (real-asinh (realpart (* (conjugate a) b))) (* 2 (atan (imagpart a) (realpart b))))))) ++ ++(defun atanh (x) ++ (declare (optimize (safety 1))) ++ (check-type x number) ++ (if (unless (complexp x) (< -1 x 1)) ++ (/ (log (/ (+ 1 x) (- 1 x))) 2) ++ (/ (- (log (+ 1 x)) (log (- 1 x))) 2))) + + + (defun sinh (z) +@@ -140,27 +164,6 @@ + ;(defun cosh (x) (/ (+ (exp x) (exp (- x))) 2.0d0)) + (defun tanh (x) (/ (sinh x) (cosh x))) + +-(defun asinh (x) (log (+ x (sqrt (+ 1.0d0 (* x x)))))) +-;(defun acosh (x) +-; (log (+ x +-; (* (1+ x) +-; (sqrt (/ (1- x) (1+ x))))))) +-;(defun acosh (x) +-; (log (+ x +-; (sqrt (* (1- x) (1+ x)))))) +-(defun acosh (x) +- (* 2 (log (+ (sqrt (/ (1+ x) 2)) (sqrt (/ (1- x) 2)))))) +-(defun atanh (x) +- (when (or (= x 1.0d0) (= x -1.0d0)) +- (error "The argument, ~s, is a logarithmic singularity.~ +- ~%Don't be foolish, GLS." +- x)) +- (log (/ (1+ x) (sqrt (- 1 (* x x)))))) +-;; (let ((y (log (/ (1+ x) (sqrt (- 1 (* x x))))))) +-;; (if (and (= (imagpart x) 0) (complexp y)) +-;; (complex (realpart y) (- (imagpart y))) +-;; y))) +- + + (defun rational (x) + (etypecase x +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -523,7 +523,41 @@ object if_exists, if_does_not_exist; + + static void + gclFlushSocket(object); +-/* ++ ++ ++DEFUN_NEW("OPEN-STREAM-P",object,fLopen_stream_p,LISP,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ ++ check_type_stream(&x); ++ ++ switch(x->sm.sm_mode) { ++ case smm_output: ++ case smm_input: ++ case smm_io: ++ case smm_probe: ++ case smm_socket: ++ case smm_string_input: ++ case smm_string_output: ++ return x->d.tt==1 ? Cnil : Ct; ++ case smm_synonym: ++ return FFN(fLopen_stream_p)(symbol_value(x->sm.sm_object0)); ++ case smm_broadcast: ++ case smm_concatenated: ++ for (x=x->sm.sm_object0;!endp(x);x=x->c.c_cdr) ++ if (!FFN(fLopen_stream_p(x))) ++ return Cnil; ++ return Ct; ++ case smm_two_way: ++ case smm_echo: ++ if (FFN(fLopen_stream_p(STREAM_INPUT_STREAM(x)))==Cnil) ++ return Cnil; ++ return FFN(fLopen_stream_p(STREAM_OUTPUT_STREAM(x))); ++ default: ++ error("illegal stream mode"); ++ return Cnil; ++ } ++ ++} ++ /* + Close_stream(strm) closes stream strm. + The abort_flag is not used now. + */ +@@ -535,6 +569,8 @@ object strm; + object x; + + BEGIN: ++ strm->d.tt=1; ++ + switch (strm->sm.sm_mode) { + case smm_output: + if (strm->sm.sm_fp == stdout) +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -471,12 +471,6 @@ main(int argc, char **argv, char **envp) + #include "unrandomize.h" + #endif + +-#ifdef LD_BIND_NOW +-#include +-#include +-#include "ld_bind_now.h" +-#endif +- + setbuf(stdin, stdin_buf); + setbuf(stdout, stdout_buf); + #ifdef _WIN32 +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -349,7 +349,7 @@ truncate_double(char *b,double d,int dp) + for (p=c;*p && *p!='e';p++); + if (p[-1]!='.' && char_inc(c,p-1) && COMP(c,&pp,d,dp)) { + j=truncate_double(c,d,dp); +- if (j + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-15) unstable; urgency=medium + . + * Version_2_6_13pre18 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -38,23 +38,28 @@ + + + (defmacro with-input-from-string ((var string &key index start end) . body) +- (multiple-value-bind (ds b) +- (find-declarations body) +- `(let ((,var (make-string-input-stream ,string ,start ,end))) +- ,@ds +- (unwind-protect +- (progn ,@b) +- (when ,index (setf ,index (si:get-string-input-stream-index ,var))) +- (when ,var (close ,var)))))) +- ++ (let ((x (sgen "X"))) ++ (multiple-value-bind (ds b) ++ (find-declarations body) ++ `(let ((,var (make-string-input-stream ,string ,start ,end))) ++ ,@ds ++ (unwind-protect ++ ,(let ((f `(progn ,@b))) ++ (if index ++ `(let ((,x (multiple-value-list ,f))) (setf ,index (get-string-input-stream-index ,var)) (values-list ,x)) ++ f)) ++ (close ,var)))))) ++ + (defmacro with-output-to-string ((var &optional string &key element-type) . body) +- (multiple-value-bind (ds b) +- (find-declarations body) +- `(let ((,var ,(if string `(make-string-output-stream-from-string ,string) `(make-string-output-stream)))) +- ,@ds +- (unwind-protect +- (progn ,@b ,@(unless string `((get-output-stream-string ,var)))) +- (when ,var (close ,var)))))) ++ (let ((s (sgen "STRING"))(bl (sgen "BLOCK"))(e (sgen "ELEMENT-TYPE"))(x (sgen "X"))) ++ (multiple-value-bind (ds b) ++ (find-declarations body) ++ `(let* ((,s ,string)(,e ,element-type) ++ (,var (if ,s (make-string-output-stream-from-string ,s) (make-string-output-stream :element-type ,e)))) ++ ,@ds ++ (unwind-protect ++ (let ((,x (multiple-value-list (progn ,@b)))) (if ,s (values-list ,x) (get-output-stream-string ,var))) ++ (close ,var)))))) + + + (defun read-from-string (string +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -1668,12 +1668,11 @@ for the string ~S.", + 3, istart, iend, strng); + @) + +-static void +-FFN(Lmake_string_output_stream)() +-{ +- check_arg(0); +- vs_push(make_string_output_stream(64)); +-} ++@(static defun make_string_output_stream (&k element_type) ++@ ++ element_type=Cnil;/*FIXME*/ ++ @(return `make_string_output_stream(64)`) ++@) + + LFD(Lget_output_stream_string)() + { diff --git a/debian/patches/Version_2_6_13pre1a b/debian/patches/Version_2_6_13pre1a new file mode 100644 index 0000000..8144184 --- /dev/null +++ b/debian/patches/Version_2_6_13pre1a @@ -0,0 +1,86 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-2) unstable; urgency=medium + . + * Version_2_6_13pre1 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1269,10 +1269,11 @@ gcl_init_alloc(void *cs_start) { + update_real_maxpage(); + + if (gcl_alloc_initialized) { +- massert(rb_start==heap_end &&rb_end==heap_end && rb_limit==heap_end && rb_pointer==heap_end); +- holepage=new_holepage; +- alloc_page(-holepage); +- rb_start=rb_end=rb_limit=rb_pointer=heap_end+(holepage<c.c_cdr),pp=pp->c.c_cdr) + if ((pp)->c.c_car->st.st_self == ptr) { +- /* SGC contblock pages: Its possible this is on an old page CM 20030827 */ +-/* #ifdef SGC */ +-/* insert_maybe_sgc_contblock((pp)->c.c_car->st.st_self,(pp)->c.c_car->st.st_dim); */ +-/* #else */ +-/* insert_contblock((pp)->c.c_car->st.st_self,(pp)->c.c_car->st.st_dim); */ +-/* #endif */ + (pp)->c.c_car->st.st_self = NULL; + *p = pp->c.c_cdr; + #ifdef GCL_GPROF + if (initial_monstartup_pointer==ptr) { ++ initial_monstartup_pointer_echo=ptr; + initial_monstartup_pointer=NULL; +- if (core_end-heap_end>=sizeof(ptr)) +- *(void **)heap_end=ptr; + } + #endif + return; +@@ -1840,12 +1835,13 @@ free(void *ptr) { + #ifdef NOFREE_ERR + return; + #else +- if (core_end-heap_end + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-2) unstable; urgency=medium + . + * Version_2_6_13pre1 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/makefile ++++ gcl-2.6.12/makefile +@@ -195,7 +195,7 @@ install1: + if gcc --version | grep -i mingw >/dev/null 2>&1 ; then if grep -i oncrpc makedefs >/dev/null 2>&1 ; then cp /mingw/bin/oncrpc.dll $(DESTDIR)$(INSTALL_LIB_DIR)/$(PORTDIR); fi ; fi + cd $(DESTDIR)$(INSTALL_LIB_DIR)/$(PORTDIR) && \ + mv $(FLISP)$(EXE) temp$(EXE) && \ +- echo '(reset-sys-paths "$(INSTALL_LIB_DIR)/")(si::save-system "$(FLISP)$(EXE)")' | ./temp$(EXE) && \ ++ echo '(si::reset-sys-paths "$(INSTALL_LIB_DIR)/")(si::save-system "$(FLISP)$(EXE)")' | ./temp$(EXE) && \ + rm -f temp$(EXE) + if [ -e "unixport/rsym$(EXE)" ] ; then cp unixport/rsym$(EXE) $(DESTDIR)$(INSTALL_LIB_DIR)/unixport/ ; fi + # ln $(SYMB) $(INSTALL_LIB_DIR)/$(PORTDIR)/$(FLISP)$(EXE) \ diff --git a/debian/patches/Version_2_6_13pre2 b/debian/patches/Version_2_6_13pre2 new file mode 100644 index 0000000..c9a9763 --- /dev/null +++ b/debian/patches/Version_2_6_13pre2 @@ -0,0 +1,229 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-2) unstable; urgency=medium + . + * Version_2_6_13pre1 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/bsd.h ++++ gcl-2.6.12/h/bsd.h +@@ -33,39 +33,7 @@ filecpy(save, original, stsize - sizeof( + + extern char etext; + +- +- +- +-/* #define SET_REAL_MAXPAGE do { struct rlimit data_rlimit; \ */ +-/* extern char etext; \ */ +-/* real_maxpage = MAXPAGE ; \ */ +-/* getrlimit(RLIMIT_DATA, &data_rlimit); \ */ +-/* real_maxpage = ((unsigned int)&etext/PAGESIZE + data_rlimit.rlim_cur/PAGESIZE); \ */ +-/* if (real_maxpage > MAXPAGE) \ */ +-/* real_maxpage = MAXPAGE ; } while(0) */ +- +-#define ROUND_UP_SBRK(x) \ +- do {long i; \ +- if ((i = ((long)x & (PAGESIZE - 1)))) \ +- x=sbrk(PAGESIZE - i); } while(0); +- +-#define FIX_RANDOM_SBRK \ +-do {char *x=sbrk(0); \ +- if (core_end != x) \ +- { ROUND_UP_SBRK(x); x=sbrk(0);\ +- while (core_end < x) \ +- { \ +- core_end = core_end + PAGESIZE;} \ +- if (core_end !=x) error("Someone allocated my memory");}} while (0) +- +- +-#define INIT_ALLOC \ +- heap_end = sbrk(0); ROUND_UP_SBRK(heap_end);\ +- heap_end = core_end = sbrk(0); +- +-#define IF_ALLOCATE_ERR \ +- FIX_RANDOM_SBRK; \ +- if (core_end != sbrk(PAGESIZE*(n - m))) ++#define INIT_ALLOC heap_end = core_end = sbrk(0); + + #define SYM_EXTERNAL_P(sym) ((sym)->n_type & N_EXT) + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1935,3 +1935,6 @@ empty_relblock(void); + + fixnum + check_avail_pages(void); ++ ++inline int ++mbrk(void *); +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -223,61 +223,53 @@ resize_hole(ufixnum hp,enum type tp) { + inline void * + alloc_page(long n) { + +- fixnum d,m; +- +- if (n>=0) { ++ bool s=n<0; ++ ufixnum nn=s ? -n : n; ++ void *v,*e; ++ ++ if (!s) { + +- if (n>(holepage - (in_signal_handler? 0 : ++ if (nn>(holepage - (in_signal_handler? 0 : + available_pages-n<=reserve_pages_for_signal_handler ? 0 : + reserve_pages_for_signal_handler))) { + + +- if (in_signal_handler) { +- fprintf(stderr,"Cant do relocatable gc in signal handler. \ +-Try to allocate more space to save for allocation during signals: \ +-eg to add 20 more do (si::set-hole-size %ld %d)\n...start over ", +- new_holepage, 20+ reserve_pages_for_signal_handler); fflush(stderr); exit(1); +- } +- ++ fixnum d=available_pages-nn; + +- d=available_pages-n; + d*=0.2; + d=d<0.01*real_maxpage ? available_pages-n : d; + d=d<0 ? 0 : d; + d=new_holepagecb_size==(**cbppp)->cb_size;cbpp=&cbp->cb_link,cbp=cbp->cb_link,k++); + if (print) +- fprintf(stderr,"%lu %p %p %lu %lu\n",cbppp-cbsrch1,*cbppp,**cbppp,(**cbppp)->cb_size,k); ++ fprintf(stderr,"%lu %p %p %lu %lu\n",(unsigned long)(cbppp-cbsrch1),*cbppp,**cbppp,(**cbppp)->cb_size,k); + } + massert(cbppp==cbsrche); + massert(*cbppp==cbpp); +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -120,6 +120,7 @@ fixnum log_maxpage_bound=sizeof(fixnum)* + + inline int + mbrk(void *v) { ++ + ufixnum uv=(ufixnum)v,uc=(ufixnum)sbrk(0),ux,um; + fixnum m=((1UL<<(sizeof(fixnum)*8-1))-1); + +@@ -134,9 +135,12 @@ mbrk(void *v) { + um=uc; + ux=uv; + } ++ + if (((fixnum)(ux-um))<0) + return mbrk((void *)uc+(uvs.s_dbind=alloc_simple_string(n); +- sSAcode_block_reserveA->s.s_dbind->st.st_self=alloc_memory(n); +- +-} +- + static object + load_memory(Shdr *sec1,Shdr *sece,void *v1,ul **got,ul **gote) { + diff --git a/debian/patches/Version_2_6_13pre20 b/debian/patches/Version_2_6_13pre20 new file mode 100644 index 0000000..66ade45 --- /dev/null +++ b/debian/patches/Version_2_6_13pre20 @@ -0,0 +1,45 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-16) unstable; urgency=medium + . + * Version_2_6_13pre19 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -543,14 +543,14 @@ DEFUN_NEW("OPEN-STREAM-P",object,fLopen_ + case smm_broadcast: + case smm_concatenated: + for (x=x->sm.sm_object0;!endp(x);x=x->c.c_cdr) +- if (!FFN(fLopen_stream_p(x))) ++ if (!FFN(fLopen_stream_p)(x)) + return Cnil; + return Ct; + case smm_two_way: + case smm_echo: +- if (FFN(fLopen_stream_p(STREAM_INPUT_STREAM(x)))==Cnil) ++ if (FFN(fLopen_stream_p)(STREAM_INPUT_STREAM(x))==Cnil) + return Cnil; +- return FFN(fLopen_stream_p(STREAM_OUTPUT_STREAM(x))); ++ return FFN(fLopen_stream_p)(STREAM_OUTPUT_STREAM(x)); + default: + error("illegal stream mode"); + return Cnil; diff --git a/debian/patches/Version_2_6_13pre22 b/debian/patches/Version_2_6_13pre22 new file mode 100644 index 0000000..cf61cc6 --- /dev/null +++ b/debian/patches/Version_2_6_13pre22 @@ -0,0 +1,357 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-17) unstable; urgency=medium + . + * Version_2_6_13pre20 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -6553,6 +6553,7 @@ else + + #include + #define EXTER ++ #define INLINE + #include "$MP_INCLUDE" + #include "./h/enum.h" + #define OBJ_ALIGN +@@ -6681,6 +6682,7 @@ else + /* end confdefs.h. */ + #include + #define EXTER ++ #define INLINE + #include "$MP_INCLUDE" + #include "h/enum.h" + #include "h/type.h" +@@ -6710,6 +6712,7 @@ else + /* end confdefs.h. */ + #include + #define EXTER ++ #define INLINE + #include "$MP_INCLUDE" + #include "`pwd`/h/enum.h" + #include "`pwd`/h/type.h" +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1301,6 +1301,7 @@ AC_MSG_CHECKING([for required object ali + AC_RUN_IFELSE([AC_LANG_PROGRAM([[ + #include + #define EXTER ++ #define INLINE + #include "$MP_INCLUDE" + #include "./h/enum.h" + #define OBJ_ALIGN +@@ -1341,6 +1342,7 @@ AC_MSG_CHECKING(sizeof struct contblock) + if test "$use" = "mingw" ; then + AC_TRY_RUN([#include + #define EXTER ++ #define INLINE + #include "$MP_INCLUDE" + #include "h/enum.h" + #include "h/type.h" +@@ -1357,6 +1359,7 @@ AC_TRY_RUN([#include + else + AC_TRY_RUN([#include + #define EXTER ++ #define INLINE + #include "$MP_INCLUDE" + #include "`pwd`/h/enum.h" + #include "`pwd`/h/type.h" +--- gcl-2.6.12.orig/gcl-tk/guis.h ++++ gcl-2.6.12/gcl-tk/guis.h +@@ -7,6 +7,7 @@ + #define IMMNUM_H + #define GMP_WRAPPERS_H + #define ERROR_H ++#undef INLINE + + #include "include.h" + +--- gcl-2.6.12.orig/h/elf64_mips_reloc.h ++++ gcl-2.6.12/h/elf64_mips_reloc.h +@@ -15,7 +15,10 @@ + gote=got+(a>>32)-1; + a&=MASK(32); + store_val(where,MASK(16),((void *)gote-(void *)got)); +- *gote=s+(a&~MASK(16))+((a&0x8000)<<1); ++ if (s>=ggot && s>56)&0xff) + + static int ++write_stub(ul s,ul *got,ul *gote) { ++ ++ int *goti; ++ ++ *gote=(ul)(goti=(void *)(gote+2)); ++ *++gote=s; ++ s=((void *)gote-(void *)got); ++ *goti++=(0x37<<26)|(0x1c<<21)|(0x19<<16)|s; ++ *goti++=(0x37<<26)|(0x19<<21)|(0x19<<16)|0; ++ *goti++=0x03200008; ++ *goti++=0x00200825; ++ ++ return 0; ++ ++} ++ ++static int ++make_got_room_for_stub(Shdr *sec1,Shdr *sece,Sym *sym,const char *st1,ul *gs) { ++ ++ Shdr *ssec=sec1+sym->st_shndx; ++ struct node *a; ++ if ((ssec>=sece || !ALLOC_SEC(ssec)) && ++ (a=find_sym_ptable(st1+sym->st_name)) && ++ a->address>=ggot && a->addresssh_addr,pe=p+sec->sh_size;psh_entsize) { ++ q=p; ++ if (q[0]==DT_MIPS_GOTSYM) ++ gotsym=q[1]; ++ if (q[0]==DT_MIPS_LOCAL_GOTNO) ++ locgotno=q[1]; ++ } ++ massert(gotsym && locgotno); ++ ++ massert(sec=get_section(".MIPS.stubs",sec1,sece,sn)); ++ stub=sec->sh_addr; ++ stube=sec->sh_addr+sec->sh_size; ++ ++ massert(sec=get_section(".got",sec1,sece,sn)); ++ ggot=sec->sh_addr+locgotno*sec->sh_entsize; ++ ggote=sec->sh_addr+sec->sh_size; ++ ++ for (ds1+=gotsym,sym=ds1;symst_value || (sym->st_value>=stub && sym->st_valuest_value=ggot+(sym-ds1)*sec->sh_entsize; ++ + return 0; + + } +@@ -45,6 +102,8 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + sym->st_size|=(q<<(a*16)); + } + ++ massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); ++ + } + + b=sizeof(r->r_addend)*4; +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -364,3 +364,13 @@ extern bool writable_malloc; + #define pfork() prof_block(fork()) + + #include "error.h" ++ ++#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2) ++extern void __gmp_randget_mt (); ++extern void __gmp_randclear_mt (); ++extern void __gmp_randiset_mt (); ++ ++typedef struct {void *a,*b,*c,*d;} gmp_randfnptr_t; ++EXTER gmp_randfnptr_t Mersenne_Twister_Generator_Noseed; ++#endif ++ +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -349,11 +349,7 @@ EXTER char *new_rb_start; /* desired r + EXTER char *rb_start; /* relblock start */ + EXTER char *rb_end; /* relblock end */ + EXTER char *rb_limit; /* relblock limit */ +-EXTER char *rb_pointer; /* relblock pointer */ +- +-#ifndef INLINE +-#define INLINE +-#endif ++EXTER char *rb_pointer; /* relblock pointer */ + + INLINE ufixnum + rb_size(void) { +--- gcl-2.6.12.orig/o/big.c ++++ gcl-2.6.12/o/big.c +@@ -70,6 +70,32 @@ DEFUN_NEW("SET-GMP-ALLOCATE-RELOCATABLE" + RETURN1(flag); + } + ++#ifndef GMP_USE_MALLOC ++object big_gcprotect; ++object big_fixnum1; ++ ++#include "gmp.c" ++ ++void ++gcl_init_big1(void) { ++ ++ mp_set_memory_functions( gcl_gmp_alloc,gcl_gmp_realloc,gcl_gmp_free); ++ jmp_gmp=0; ++ ++#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2) ++ Mersenne_Twister_Generator_Noseed.b=__gmp_randget_mt; ++ Mersenne_Twister_Generator_Noseed.c=__gmp_randclear_mt; ++ Mersenne_Twister_Generator_Noseed.d=__gmp_randiset_mt; ++#endif ++ ++} ++ ++#else ++gcl_init_big1() ++{ ++} ++#endif ++ + #ifdef GMP + #include "gmp_big.c" + #else +@@ -93,7 +119,6 @@ void zero_big(object x) + ZERO_BIG(x); + } + +- + #ifndef HAVE_MP_COERCE_TO_STRING + + double digitsPerBit[37]={ 0,0, +--- gcl-2.6.12.orig/o/gmp_big.c ++++ gcl-2.6.12/o/gmp_big.c +@@ -81,27 +81,6 @@ static object verify_big_or_zero(object + #define verify_big_or_zero(x) + #endif + +- +- +- +- +-#ifndef GMP_USE_MALLOC +-object big_gcprotect; +-object big_fixnum1; +- +-#include "gmp.c" +-void +-gcl_init_big1(void) { +- mp_set_memory_functions( gcl_gmp_alloc,gcl_gmp_realloc,gcl_gmp_free); +- jmp_gmp=0; +-} +- +-#else +-gcl_init_big1() +-{ +-} +-#endif +- + object + new_bignum(void) + { object ans; +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -511,9 +511,7 @@ main(int argc, char **argv, char **envp) + + terminal_io->sm.sm_object0->sm.sm_fp = stdin; + terminal_io->sm.sm_object1->sm.sm_fp = stdout; +-#ifdef LD_BIND_NOW /*FIXME currently mips only, verify that these two requirements are the same*/ +- reinit_gmp(); +-#endif ++ + gcl_init_big1(); + #ifdef HAVE_READLINE + gcl_init_readline_function(); +--- gcl-2.6.12.orig/o/num_rand.c ++++ gcl-2.6.12/o/num_rand.c +@@ -104,34 +104,6 @@ trap_gcl_gmp_allocfun(size_t size){ + } + #endif + +-#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2) +-extern void +-__gmp_randget_mt (); +-extern void +-__gmp_randclear_mt (); +-extern void +-__gmp_randiset_mt (); +- +-typedef struct {void *a,*b,*c,*d;} gmp_randfnptr_t; +-static gmp_randfnptr_t Mersenne_Twister_Generator_Noseed = { +- NULL, +- __gmp_randget_mt, +- __gmp_randclear_mt, +- __gmp_randiset_mt +-}; +-#endif +- +-void +-reinit_gmp() { +- +-#if __GNU_MP_VERSION > 4 || (__GNU_MP_VERSION == 4 && __GNU_MP_VERSION_MINOR >= 2) +- Mersenne_Twister_Generator_Noseed.b=__gmp_randget_mt; +- Mersenne_Twister_Generator_Noseed.c=__gmp_randclear_mt; +- Mersenne_Twister_Generator_Noseed.d=__gmp_randiset_mt; +-#endif +- +-} +- + void + init_gmp_rnd_state(__gmp_randstate_struct *x) { + +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -66,9 +66,7 @@ + *opt-two* @LI-OPT-TWO@ + *init-lsp* @LI-INIT-LSP@) + +-(import 'si::(clines defentry defcfun object void int double +- quit bye gbc system commonp +- *break-on-warnings* ++(import 'si::(commonp *break-on-warnings* + make-char char-bits char-font char-bit set-char-bit string-char-p int-char + char-font-limit char-bits-limit char-control-bit + char-meta-bit char-super-bit char-hyper-bit compiler-let) :cltl1-compat) +@@ -79,3 +77,4 @@ + #-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp))) + + #+ansi-cl (use-package :pcl :user) ++(import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) diff --git a/debian/patches/Version_2_6_13pre25 b/debian/patches/Version_2_6_13pre25 new file mode 100644 index 0000000..6e13958 --- /dev/null +++ b/debian/patches/Version_2_6_13pre25 @@ -0,0 +1,185 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-19) unstable; urgency=medium + . + * Use-dpkg-buidflags-opt-levels-in-debian-rules, -O3 has bug in 5.2.1 + * Version_2_6_13pre24 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/config.guess ++++ gcl-2.6.12/config.guess +@@ -1,8 +1,8 @@ + #! /bin/sh + # Attempt to guess a canonical system name. +-# Copyright 1992-2014 Free Software Foundation, Inc. ++# Copyright 1992-2015 Free Software Foundation, Inc. + +-timestamp='2014-03-23' ++timestamp='2015-08-20' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -24,12 +24,12 @@ timestamp='2014-03-23' + # program. This Exception is an additional permission under section 7 + # of the GNU General Public License, version 3 ("GPLv3"). + # +-# Originally written by Per Bothner. ++# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. + # + # You can get the latest version of this script from: + # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + # +-# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++# Please send patches to . + + + me=`echo "$0" | sed -e 's,.*/,,'` +@@ -50,7 +50,7 @@ version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright 1992-2014 Free Software Foundation, Inc. ++Copyright 1992-2015 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" +- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ +- /usr/sbin/$sysctl 2>/dev/null || echo unknown)` ++ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ ++ /sbin/$sysctl 2>/dev/null || \ ++ /usr/sbin/$sysctl 2>/dev/null || \ ++ echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; ++ earmv*) ++ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` ++ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` ++ machine=${arch}${endian}-unknown ++ ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in +- arm*|i386|m68k|ns32k|sh3*|sparc|vax) ++ arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ +@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + os=netbsd + ;; + esac ++ # Determine ABI tags. ++ case "${UNAME_MACHINE_ARCH}" in ++ earm*) ++ expr='s/^earmv[0-9]/-eabi/;s/eb$//' ++ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ++ ;; ++ esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need +@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + release='-gnu' + ;; + *) +- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ++ release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. +- echo "${machine}-${os}${release}" ++ echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` +@@ -235,6 +249,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$ + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; ++ *:Sortix:*:*) ++ echo ${UNAME_MACHINE}-unknown-sortix ++ exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) +@@ -579,8 +596,9 @@ EOF + else + IBM_ARCH=powerpc + fi +- if [ -x /usr/bin/oslevel ] ; then +- IBM_REV=`/usr/bin/oslevel` ++ if [ -x /usr/bin/lslpp ] ; then ++ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | ++ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi +@@ -932,6 +950,9 @@ EOF + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; ++ e2k:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; +@@ -1020,7 +1041,7 @@ EOF + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -66,8 +66,9 @@ + *opt-two* @LI-OPT-TWO@ + *init-lsp* @LI-INIT-LSP@) + +-(import 'si::(commonp *break-on-warnings* +- make-char char-bits char-font char-bit set-char-bit string-char-p int-char ++(import 'si::(clines defentry defcfun object void int double quit bye gbc system ++ commonp *break-on-warnings* make-char char-bits char-font ++ char-bit set-char-bit string-char-p int-char + char-font-limit char-bits-limit char-control-bit + char-meta-bit char-super-bit char-hyper-bit compiler-let) :cltl1-compat) + (deftype cltl1-compat::string-char nil 'character) +@@ -77,4 +78,4 @@ + #-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp))) + + #+ansi-cl (use-package :pcl :user) +-(import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) ++#+ansi-cl (import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) diff --git a/debian/patches/Version_2_6_13pre26 b/debian/patches/Version_2_6_13pre26 new file mode 100644 index 0000000..798646d --- /dev/null +++ b/debian/patches/Version_2_6_13pre26 @@ -0,0 +1,235 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-20) unstable; urgency=medium + . + * Version_2_6_13pre25 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4435,7 +4435,6 @@ case $use in + # if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi + ;; + mips*) +- TCFLAGS="$TCFLAGS -mplt" + # if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 + ;; + ia64*) +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -640,7 +640,6 @@ case $use in + # if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi + ;; + mips*) +- TCFLAGS="$TCFLAGS -mplt" + # if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 + ;; + ia64*) +--- gcl-2.6.12.orig/h/elf32_mips_reloc.h ++++ gcl-2.6.12/h/elf32_mips_reloc.h +@@ -4,7 +4,12 @@ + add_val(where,~0L,s+a-(ul)got); + break; + case R_MIPS_26: +- add_val(where,MASK(26),(s+a)>>2); ++ if (((s+a)>>28)!=(((ul)where)>>28)) { ++ gote=got+sym->st_size-1; ++ massert(!write_26_stub(s+a,got,gote)); ++ store_val(where,MASK(26),((ul)gote)>>2); ++ } else ++ add_val(where,MASK(26),(s+a)>>2); + break; + case R_MIPS_32: + add_val(where,~0L,s+a); +@@ -19,7 +24,10 @@ + case R_MIPS_CALL16: + gote=got+sym->st_size-1; + store_val(where,MASK(16),((void *)gote-(void *)got)); +- *gote=s; ++ if (s>=ggot && sst_other) s=gpd=(ul)got-(sym->st_other==2 ? 0 : (ul)where); +--- gcl-2.6.12.orig/h/elf32_mips_reloc_special.h ++++ gcl-2.6.12/h/elf32_mips_reloc_special.h +@@ -1,9 +1,88 @@ +-static ul gpd; static Rel *hr; ++#include ++ ++static ul gpd,ggot,ggote,can_gp; static Rel *hr; ++ ++typedef struct { ++ ul addr_hi,addr_lo,jr,nop; ++} mips_26_tramp; ++ ++static int ++write_26_stub(ul s,ul *got,ul *gote) { ++ ++ static mips_26_tramp t1={(0xf<<26)|(0x0<<21)|(0x19<<16), /*lui t9*/ ++ (0xe<<26)|(0x19<<21)|(0x19<<16), /*ori t9,t9 */ ++ 0x03200008, /*jr t9*/ ++ 0x00200825}; /*mv at,at */; ++ mips_26_tramp *t=(void *)gote; ++ ++ *t=t1; ++ t->addr_hi|=s>>16; ++ t->addr_lo|=s&0xffff; ++ ++ return 0; ++ ++} ++ ++typedef struct { ++ ul entry,addr_hi,addr_lo,lw,jr,lwcan; ++} call_16_tramp; ++ ++static int ++write_stub(ul s,ul *got,ul *gote) { ++ ++ static call_16_tramp t1={0, ++ (0xf<<26)|(0x0<<21)|(0x19<<16), /*lui t9*/ ++ (0xe<<26)|(0x19<<21)|(0x19<<16), /*ori t9,t9 */ ++ (0x23<<26)|(0x19<<21)|(0x19<<16), /*lw t9,(0)t9*/ ++ 0x03200008, /*jr t9*/ ++ /*stub addresses need veneer setting gp to canonical*/ ++ (0x23<<26)|(0x1c<<21)|(0x1c<<16)};/*lw gp,(0)gp*/ ++ call_16_tramp *t=(void *)gote++; ++ ++ *t=t1; ++ *got=can_gp; ++ ++ t->entry=(ul)gote; ++ t->addr_hi|=s>>16; ++ t->addr_lo|=s&0xffff; ++ ++ return 0; ++ ++} + + static int + find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, + const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) { + ++ Shdr *sec; ++ ul *q,gotsym=0,locgotno=0,stub,stube; ++ void *p,*pe; ++ ++ massert(sec=get_section(".dynamic",sec1,sece,sn)); ++ for (p=(void *)sec->sh_addr,pe=p+sec->sh_size;psh_entsize) { ++ q=p; ++ if (q[0]==DT_MIPS_GOTSYM) ++ gotsym=q[1]; ++ if (q[0]==DT_MIPS_LOCAL_GOTNO) ++ locgotno=q[1]; ++ if (q[0]==DT_PLTGOT) ++ can_gp=q[1]+0x7ff0; ++ ++ } ++ massert(gotsym && locgotno && can_gp); ++ ++ massert(sec=get_section(".MIPS.stubs",sec1,sece,sn)); ++ stub=sec->sh_addr; ++ stube=sec->sh_addr+sec->sh_size; ++ ++ massert(sec=get_section(".got",sec1,sece,sn)); ++ ggot=sec->sh_addr+locgotno*sec->sh_entsize; ++ ggote=sec->sh_addr+sec->sh_size; ++ ++ for (ds1+=gotsym,sym=ds1;symst_value || (sym->st_value>=stub && sym->st_valuest_value=ggot+(sym-ds1)*sec->sh_entsize; ++ + return 0; + + } +@@ -13,9 +92,10 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + + Rel *r; + Sym *sym; +- Shdr *sec; ++ Shdr *sec,*ssec; + void *v,*ve; + ul q; ++ struct node *a; + + for (q=0,sym=sym1;symst_name; +@@ -29,20 +109,32 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + for (sym=sym1;symst_size=0; + +- for (*gs=0,sec=sec1;secsh_type==SHT_REL) ++ for (*gs=1,sec=sec1;secsh_type==SHT_REL)/*no addend*/ + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) + +- if (ELF_R_TYPE(r->r_info)==R_MIPS_CALL16|| +- ELF_R_TYPE(r->r_info)==R_MIPS_GOT16) { ++ if (!(sym=sym1+ELF_R_SYM(r->r_info))->st_size) + +- sym=sym1+ELF_R_SYM(r->r_info); ++ switch(ELF_R_TYPE(r->r_info)) { + +- if (!sym->st_size) +- sym->st_size=++*gs; ++ case R_MIPS_26: ++ if (((ul)(pagetochar(page(heap_end))+r->r_offset))>>28) { ++ sym->st_size=++*gs; ++ (*gs)+=sizeof(mips_26_tramp)/sizeof(ul)-1; ++ } ++ break; ++ case R_MIPS_CALL16: ++ sym->st_size=++*gs; ++ if (((ssec=sec1+sym->st_shndx)>=sece || !ALLOC_SEC(ssec)) && ++ (a=find_sym_ptable(st1+sym->st_name)) && ++ a->address>=ggot && a->addressst_size=++*gs; ++ break; ++ } + +- } +- + return 0; + + } +--- gcl-2.6.12.orig/o/nsocket.c ++++ gcl-2.6.12/o/nsocket.c +@@ -645,11 +645,11 @@ getCharGclSocket(object strm, object blo + { int high; + AGAIN: + /* under cygwin a too large timout like (1<<30) does not work */ +- timeout.tv_sec = (block != Ct ? 0 : 0); ++ timeout.tv_sec = 0; + timeout.tv_usec = 10000; + FD_ZERO(&readfds); + FD_SET(fd,&readfds); +- high = select(fd+1,&readfds,NULL,NULL,&timeout); ++ high = select(fd+1,&readfds,NULL,NULL,block==Ct ? NULL : &timeout); + if (high > 0) + { object bufp = SOCKET_STREAM_BUFFER(strm); + int n; diff --git a/debian/patches/Version_2_6_13pre27 b/debian/patches/Version_2_6_13pre27 new file mode 100644 index 0000000..fea955b --- /dev/null +++ b/debian/patches/Version_2_6_13pre27 @@ -0,0 +1,161 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-21) unstable; urgency=medium + . + * Version_2_6_13pre26 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -217,6 +217,10 @@ frame_ptr frs_sch_catch(); + /* gbc.c */ + EXTER bool GBC_enable; + ++#ifdef CAN_UNRANDOMIZE_SBRK ++EXTER bool gcl_unrandomized; ++#endif ++ + /* let.c */ + + /* lex.c */ +--- gcl-2.6.12.orig/h/gnuwin95.h ++++ gcl-2.6.12/h/gnuwin95.h +@@ -7,15 +7,6 @@ + #define DBEGIN_TY unsigned long + extern DBEGIN_TY _dbegin; + +- +- +-/* define if there is no _cleanup, do here what needs +- to be done before calling unexec +- */ +-#define CLEANUP_CODE \ +- setbuf(stdin,0); \ +- setbuf(stdout,0); +- + /* size to use for mallocs done */ + /* #define BABY_MALLOC_SIZE 0x5000 */ + +--- gcl-2.6.12.orig/h/linux.h ++++ gcl-2.6.12/h/linux.h +@@ -130,10 +130,6 @@ do { int c = 0; \ + + #define SET_SESSION_ID() (setpgrp() ? -1 : 0) + +-#define CLEANUP_CODE \ +- setbuf(stdin,0); \ +- setbuf(stdout,0); +- + #include + #include + #define GET_FULL_PATH_SELF(a_) do {\ +--- gcl-2.6.12.orig/h/mingw.h ++++ gcl-2.6.12/h/mingw.h +@@ -47,13 +47,6 @@ + #define DBEGIN_TY unsigned int + extern DBEGIN_TY _stacktop, _stackbottom, _dbegin; + +-/* define if there is no _cleanup, do here what needs +- to be done before calling unexec +- */ +-#define CLEANUP_CODE \ +- setbuf(stdin,0); \ +- setbuf(stdout,0); +- + #define NO_SYS_PARAM_H + #define NO_SYS_TIMES_H + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1796,6 +1796,10 @@ malloc(size_t size) { + + if (!gcl_alloc_initialized) + gcl_init_alloc(&size); ++#ifdef CAN_UNRANDOMIZE_SBRK ++ else if (!gcl_unrandomized) ++ return sbrk(size); ++#endif + + CHECK_INTERRUPT; + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -412,16 +412,18 @@ DEFVAR("*CODE-BLOCK-RESERVE*",sSAcode_bl + + #define HAVE_GCL_CLEANUP + ++#ifdef CAN_UNRANDOMIZE_SBRK ++bool gcl_unrandomized=FALSE; ++#endif ++ + void + gcl_cleanup(int gc) { + + if (getenv("GCL_WAIT")) + sleep(30); + +-#ifdef CLEANUP_CODE +- CLEANUP_CODE +-#elif defined(USE_CLEANUP) +- {extern void _cleanup(void);_cleanup();} ++#if defined(USE_CLEANUP) ++ {extern void _cleanup(void);_cleanup();} + #endif + + #ifdef GCL_GPROF +@@ -440,6 +442,10 @@ gcl_cleanup(int gc) { + cs_org=0; + initial_sbrk=core_end; + ++#ifdef CAN_UNRANDOMIZE_SBRK ++ gcl_unrandomized=FALSE; ++#endif ++ + } + + close_pool(); +@@ -450,6 +456,13 @@ gcl_cleanup(int gc) { + int + main(int argc, char **argv, char **envp) { + ++#ifdef CAN_UNRANDOMIZE_SBRK ++#include ++#include ++#include "unrandomize.h" ++ gcl_unrandomized=TRUE; ++#endif ++ + gcl_init_alloc(&argv); + + #ifdef GET_FULL_PATH_SELF +@@ -465,12 +478,6 @@ main(int argc, char **argv, char **envp) + #endif + *argv=kcl_self; + +-#ifdef CAN_UNRANDOMIZE_SBRK +-#include +-#include +-#include "unrandomize.h" +-#endif +- + setbuf(stdin, stdin_buf); + setbuf(stdout, stdout_buf); + #ifdef _WIN32 diff --git a/debian/patches/Version_2_6_13pre28 b/debian/patches/Version_2_6_13pre28 new file mode 100644 index 0000000..563b08d --- /dev/null +++ b/debian/patches/Version_2_6_13pre28 @@ -0,0 +1,353 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-23) unstable; urgency=medium + . + * Version_2_6_13pre28 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/linux.h ++++ gcl-2.6.12/h/linux.h +@@ -132,20 +132,18 @@ do { int c = 0; \ + + #include + #include +-#define GET_FULL_PATH_SELF(a_) do {\ +- char b[20];\ +- static char q[PATH_MAX];\ +- struct stat ss;\ +- if (snprintf(b,sizeof(b),"/proc/%d/exe",getpid())<=0)\ +- error("Cannot write proc exe pathname");\ +- if (stat(b,&ss)) \ +- (a_)=argv[0];\ +- else {\ +- if (!realpath(b,q)) \ +- error("realpath error");\ +- (a_)=q;\ +- }\ +-} while(0) ++#define GET_FULL_PATH_SELF(a_) do { \ ++ static char q[PATH_MAX]; \ ++ const char *s="/proc/self/exe"; \ ++ struct stat ss; \ ++ if (stat(s,&ss)) \ ++ (a_)=argv[0]; \ ++ else { \ ++ if (!realpath(s,q)) \ ++ error("realpath error"); \ ++ (a_)=q; \ ++ } \ ++ } while(0) + + + #define UC(a_) ((ucontext_t *)a_) +--- gcl-2.6.12.orig/h/unrandomize.h ++++ gcl-2.6.12/h/unrandomize.h +@@ -23,6 +23,7 @@ + int i,j,k; + char **n,**a; + void *v; ++ argv[0]="/proc/self/exe"; + for (i=j=0;argv[i];i++) + j+=strlen(argv[i])+1; + for (k=0;envp[k];k++) +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -351,7 +351,8 @@ resize_hole(ufixnum hp,enum type tp,bool + + if (!in_placep && + ((new_start<=start && starts.s_dbind != Cnil) ++ emsg("Toggling relblock when resizing hole to %lu\n",hp); + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + return resize_hole(hp,tp,in_placep); +@@ -387,7 +388,8 @@ alloc_page(long n) { + d=d<0 ? 0 : d; + d=(available_pages/3)s.s_dbind != Cnil) ++ emsg("Hole overrun\n"); + + resize_hole(d+nn,t_relocatable,0); + +@@ -857,7 +859,8 @@ add_pages(struct typemanager *tm,fixnum + case t_relocatable: + + if (rb_high() && m>((rb_start-heap_end)>>PAGEWIDTH)) { +- emsg("Moving relblock low before expanding relblock pages\n"); ++ if (sSAnotify_gbcA->s.s_dbind != Cnil) ++ emsg("Moving relblock low before expanding relblock pages\n"); + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } +@@ -1652,22 +1655,15 @@ DEFUN_NEW("GPROF-QUIT",object,fSgprof_qu + if (!gprof_on) + return Cnil; + +- if (!getcwd(b,sizeof(b))) +- FEerror("Cannot get working directory", 0); +- if (chdir(P_tmpdir)) +- FEerror("Cannot change directory to tmpdir", 0); ++ massert(getcwd(b,sizeof(b))); ++ massert(!chdir(P_tmpdir)); + _mcleanup(); +- if (snprintf(b1,sizeof(b1),"gprof %s",kcl_self)<=0) +- FEerror("Cannot write gprof command line", 0); +- if (!(pp=popen(b1,"r"))) +- FEerror("Cannot open gprof pipe", 0); ++ massert(snprintf(b1,sizeof(b1),"gprof %s",kcl_self)>0); ++ massert((pp=popen(b1,"r"))); + while ((n=fread(b1,1,sizeof(b1),pp))) +- if (!fwrite(b1,1,n,stdout)) +- FEerror("Cannot write gprof output",0); +- if (pclose(pp)<0) +- FEerror("Cannot close gprof pipe", 0); +- if (chdir(b)) +- FEerror("Cannot restore working directory", 0); ++ massert(fwrite(b1,1,n,stdout)); ++ massert(pclose(pp)>=0); ++ massert(!chdir(b)); + gprof_on=0; + + return Cnil; +@@ -1785,28 +1781,37 @@ static char *baby_malloc(n) + + bool writable_malloc=0; + +-void * +-malloc(size_t size) { +- +- static bool in_malloc; +- +- if (in_malloc) +- return NULL; +- in_malloc=1; ++static void * ++malloc_internal(size_t size) { + +- if (!gcl_alloc_initialized) +- gcl_init_alloc(&size); + #ifdef CAN_UNRANDOMIZE_SBRK +- else if (!gcl_unrandomized) +- return sbrk(size); ++ if (core_end && core_end!=sbrk(0))/*malloc before main in saved_image*/ ++ return sbrk(size);/*will never get to gcl_init_alloc, so brk point irrelevant*/ + #endif +- ++ if (!gcl_alloc_initialized) { ++ static bool recursive_malloc; ++ if (recursive_malloc) ++ error("Bad malloc"); ++ recursive_malloc=1; ++ gcl_init_alloc(&size); ++ recursive_malloc=0; ++ } ++ + CHECK_INTERRUPT; + + malloc_list = make_cons(alloc_simple_string(size), malloc_list); + malloc_list->c.c_car->st.st_self = alloc_contblock(size); + malloc_list->c.c_car->st.st_adjustable=writable_malloc; + ++ return(malloc_list->c.c_car->st.st_self); ++ ++} ++ ++void * ++malloc(size_t size) { ++ ++ void *v=malloc_internal(size);; ++ + /* FIXME: this is just to handle clean freeing of the + monstartup memory allocated automatically on raw image + startup. In saved images, monstartup memory is only +@@ -1814,12 +1819,11 @@ malloc(size_t size) { + #ifdef GCL_GPROF + if (raw_image && size>(textend-textstart) && !initial_monstartup_pointer) { + massert(!atexit(gprof_cleanup)); +- initial_monstartup_pointer=malloc_list->c.c_car->st.st_self; ++ initial_monstartup_pointer=v; + } + #endif + +- in_malloc=0; +- return(malloc_list->c.c_car->st.st_self); ++ return v; + + } + +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -35,7 +35,7 @@ object sSterminal_interrupt; + void + assert_error(const char *a,unsigned l,const char *f,const char *n) { + +- if (!raw_image) ++ if (!raw_image && core_end && core_end==sbrk(0)) + FEerror("The assertion ~a on line ~a of ~a in function ~a failed",4, + make_simple_string(a),make_fixnum(l), + make_simple_string(f),make_simple_string(n)); +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -1170,15 +1170,15 @@ GBC(enum type t) { + gc_time=0; + + #ifdef SGC +- printf("[%s for %ld %s pages..", +- (sgc_enabled ? "SGC" : "GC"), +- (sgc_enabled ? sgc_count_type(t) : tm_of(t)->tm_npage), +- (tm_table[(int)t].tm_name)+1); ++ emsg("[%s for %ld %s pages..", ++ (sgc_enabled ? "SGC" : "GC"), ++ (sgc_enabled ? sgc_count_type(t) : tm_of(t)->tm_npage), ++ (tm_table[(int)t].tm_name)+1); + #else +- printf("[%s for %ld %s pages..", +- ("GC"), +- (tm_of(t)->tm_npage), +- (tm_table[(int)t].tm_name)+1); ++ emsg("[%s for %ld %s pages..", ++ ("GC"), ++ (tm_of(t)->tm_npage), ++ (tm_table[(int)t].tm_name)+1); + #endif + + #ifdef SGC +@@ -1349,10 +1349,9 @@ GBC(enum type t) { + if (sSAnotify_gbcA->s.s_dbind != Cnil) { + + if (gc_recursive) +- fprintf(stdout, "(T=...).GC finished]\n"); ++ emsg("(T=...).GC finished]\n"); + else +- fprintf(stdout, "(T=%d).GC finished]\n",gc_start); +- fflush(stdout); ++ emsg("(T=%d).GC finished]\n",gc_start); + + } + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -205,21 +205,21 @@ get_proc_meminfo_value_in_pages(const ch + return n>>(PAGEWIDTH-10); + } + ++#include ++ + static ufixnum + get_phys_pages_no_malloc(char freep) { + +- return freep ? +- get_proc_meminfo_value_in_pages("MemFree:")+ +- get_proc_meminfo_value_in_pages("Buffers:")+ +- get_proc_meminfo_value_in_pages("Cached:") : +- get_proc_meminfo_value_in_pages("MemTotal:"); ++ struct sysinfo s; ++ sysinfo(&s); ++ return (freep ? s.freeram : s.totalram)>>PAGEWIDTH; + + } + + #endif + + static ufixnum +-get_phys_pages(char freep) { ++get_phys_pages1(char freep) { + + return get_phys_pages_no_malloc(freep); + +@@ -313,7 +313,7 @@ update_real_maxpage(void) { + } + massert(!mbrk(cur)); + +- phys_pages=ufmin(get_phys_pages(0)+page(beg),real_maxpage)-page(beg); ++ phys_pages=ufmin(get_phys_pages1(0)+page(beg),real_maxpage)-page(beg); + + get_gc_environ(); + setup_maxpages(mem_multiple); +@@ -412,10 +412,6 @@ DEFVAR("*CODE-BLOCK-RESERVE*",sSAcode_bl + + #define HAVE_GCL_CLEANUP + +-#ifdef CAN_UNRANDOMIZE_SBRK +-bool gcl_unrandomized=FALSE; +-#endif +- + void + gcl_cleanup(int gc) { + +@@ -442,10 +438,6 @@ gcl_cleanup(int gc) { + cs_org=0; + initial_sbrk=core_end; + +-#ifdef CAN_UNRANDOMIZE_SBRK +- gcl_unrandomized=FALSE; +-#endif +- + } + + close_pool(); +@@ -460,7 +452,6 @@ main(int argc, char **argv, char **envp) + #include + #include + #include "unrandomize.h" +- gcl_unrandomized=TRUE; + #endif + + gcl_init_alloc(&argv); +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -181,8 +181,7 @@ relocate(Sym *sym1,void *v,ul a,ul start + #include RELOC_H + + default: +- emsg("Unknown reloc type %lu\n", tp); +- massert(tp&~tp); ++ massert(!emsg("Unknown reloc type %lu\n", tp)); + + } + +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -789,10 +789,8 @@ sgc_start(void) { + sgc_enabled=1; + if (memory_protect(1)) + sgc_quit(); +- if (sSAnotify_gbcA->s.s_dbind != Cnil) { +- printf("[SGC on]"); +- fflush(stdout); +- } ++ if (sSAnotify_gbcA->s.s_dbind != Cnil) ++ emsg("[SGC on]"); + + sSAoptimize_maximum_pagesA->s.s_dbind=omp; + +@@ -826,7 +824,7 @@ sgc_quit(void) { + memory_protect(0); + + if(sSAnotify_gbcA->s.s_dbind != Cnil) +- printf("[SGC off]"); fflush(stdout); ++ emsg("[SGC off]"); + + if (sgc_enabled==0) + return 0; diff --git a/debian/patches/Version_2_6_13pre29 b/debian/patches/Version_2_6_13pre29 new file mode 100644 index 0000000..9752a18 --- /dev/null +++ b/debian/patches/Version_2_6_13pre29 @@ -0,0 +1,47 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-23) unstable; urgency=medium + . + * Version_2_6_13pre28 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1203,8 +1203,8 @@ object malloc_list=Cnil; + + void + maybe_set_hole_from_maxpages(void) { +- if (rb_start==heap_end && rb_end==rb_start && rb_limit==rb_start && rb_pointer==rb_start) +- resize_hole(available_pages/3,t_relocatable,0); ++ if (rb_pointer==rb_begin()) ++ resize_hole(ufmin(phys_pages,available_pages/3),t_relocatable,0); + } + + void +@@ -1358,7 +1358,7 @@ gcl_init_alloc(void *cs_start) { + set_tm_maxpage(tm_table+t_relocatable,1); + nrbpage=0; + +- resize_hole(ufmin(phys_pages,available_pages/3),t_relocatable,0); ++ maybe_set_hole_from_maxpages(); + #ifdef SGC + tm_table[(int)t_relocatable].tm_sgc = 50; + #endif diff --git a/debian/patches/Version_2_6_13pre3 b/debian/patches/Version_2_6_13pre3 new file mode 100644 index 0000000..e336079 --- /dev/null +++ b/debian/patches/Version_2_6_13pre3 @@ -0,0 +1,124 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-3) unstable; urgency=medium + . + * Version_2_6_13pre2 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1938,3 +1938,6 @@ check_avail_pages(void); + + inline int + mbrk(void *); ++ ++void ++maybe_set_hole_from_maxpages(void); +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -259,19 +259,15 @@ eg to add 20 more do (si::set-hole-size + + holepage -= nn; + heap_end=v; +- return e; + ++ } else if (v>(void *)core_end) { ++ ++ massert(!mbrk(v)); ++ core_end=v; ++ + } +- +- if (nn<=(core_end-heap_end)/PAGESIZE) +- return(heap_end); +- +- if (mbrk(v)) +- error("Can't allocate. Good-bye!"); +- +- core_end=v; +- +- return(heap_end); ++ ++ return(e); + + } + +@@ -1177,6 +1173,15 @@ object malloc_list=Cnil; + #include + + void ++maybe_set_hole_from_maxpages(void) { ++ if (rb_start==heap_end && rb_end==rb_start && rb_limit==rb_start && rb_pointer==rb_start) { ++ holepage=new_holepage; ++ alloc_page(-holepage); ++ rb_start=rb_end=rb_limit=rb_pointer=heap_end+(holepage<s.s_fillp = i; + sym->s.s_self = alloc_relblock(i); ++ sym->s.s_fillp = i; + i=this_gensym_prefix->st.st_fillp; + for (j = 0; j < i; j++) + sym->s.s_self[j] = this_gensym_prefix->st.st_self[j]; +--- gcl-2.6.12.orig/pcl/makefile ++++ gcl-2.6.12/pcl/makefile +@@ -17,6 +17,7 @@ SETUP='(load "defsys.lisp")' \ + '(setq compiler::*default-c-file* t)'\ + '(setq compiler::*default-data-file* t)'\ + '(setq compiler::*default-system-p* t)' \ ++ '(setq si::*code-block-reserve* (make-array 10000000 :element-type (quote character) :static t) a nil)' \ + '(setq compiler::*keep-gaz* t compiler::*tmp-dir* "")' + + all: $(addsuffix .c,$(AFILES)) $(addsuffix .o,$(AFILES)) diff --git a/debian/patches/Version_2_6_13pre30 b/debian/patches/Version_2_6_13pre30 new file mode 100644 index 0000000..20b2b33 --- /dev/null +++ b/debian/patches/Version_2_6_13pre30 @@ -0,0 +1,111 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-23) unstable; urgency=medium + . + * Version_2_6_13pre29 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4435,6 +4435,10 @@ case $use in + # if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi + ;; + mips*) ++ case $canonical in ++ mips64*linux*) ++ TLIBS="$TLIBS -Wl,-z -Wl,now";; ++ esac + # if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 + ;; + ia64*) +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -640,6 +640,10 @@ case $use in + # if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi + ;; + mips*) ++ case $canonical in ++ mips64*linux*) ++ TLIBS="$TLIBS -Wl,-z -Wl,now";; ++ esac + # if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 + ;; + ia64*) +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -6,18 +6,28 @@ static ul ggot,ggote; static Rela *hr; + #define ELF_R_TYPE(a_) (((a_>>40)&0xff) ? ((a_>>40)&0xff) : ((a_>>56)&0xff)) + #define ELF_R_FTYPE(a_) ((a_>>56)&0xff) + ++typedef struct { ++ ul entry,gotoff; ++ unsigned int ld_gotoff,lw,jr,lwcan; ++} call_16_tramp; ++ + static int + write_stub(ul s,ul *got,ul *gote) { + +- int *goti; +- +- *gote=(ul)(goti=(void *)(gote+2)); +- *++gote=s; +- s=((void *)gote-(void *)got); +- *goti++=(0x37<<26)|(0x1c<<21)|(0x19<<16)|s; +- *goti++=(0x37<<26)|(0x19<<21)|(0x19<<16)|0; +- *goti++=0x03200008; +- *goti++=0x00200825; ++ static call_16_tramp t1={0,0, ++ (0x37<<26)|(0x1c<<21)|(0x19<<16), /*ld t9,(0)gp*/ ++ (0x37<<26)|(0x19<<21)|(0x19<<16), /*ld t9,(0)t9*/ ++ 0x03200008, /*jr t9*/ ++ 0 /*nop*/ ++ }; ++ call_16_tramp *t=(void *)gote; ++ ++ *t=t1; ++ *got=can_gp; ++ ++ t->entry=(ul)(gote+2); ++ t->gotoff=s; ++ t->ld_gotoff|=((void *)(gote+1)-(void *)got); + + return 0; + +@@ -31,7 +41,7 @@ make_got_room_for_stub(Shdr *sec1,Shdr * + if ((ssec>=sece || !ALLOC_SEC(ssec)) && + (a=find_sym_ptable(st1+sym->st_name)) && + a->address>=ggot && a->address>PAGEWIDTH; ++ return ((freep ? s.freeram : s.totalram)>>PAGEWIDTH)*s.mem_unit; + + } + diff --git a/debian/patches/Version_2_6_13pre31 b/debian/patches/Version_2_6_13pre31 new file mode 100644 index 0000000..4ec9d79 --- /dev/null +++ b/debian/patches/Version_2_6_13pre31 @@ -0,0 +1,115 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-24) unstable; urgency=medium + . + * Version_2_6_13pre30 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/386-kfreebsd.h ++++ gcl-2.6.12/h/386-kfreebsd.h +@@ -46,3 +46,4 @@ + #define RELOC_H "elf32_i386_reloc.h" + + #define BRK_DOES_NOT_GUARANTEE_ALLOCATION ++#define FREEBSD +--- gcl-2.6.12.orig/h/amd64-kfreebsd.h ++++ gcl-2.6.12/h/amd64-kfreebsd.h +@@ -23,3 +23,4 @@ + #define RELOC_H "elf64_i386_reloc.h" + + #define BRK_DOES_NOT_GUARANTEE_ALLOCATION ++#define FREEBSD +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -23,7 +23,6 @@ write_stub(ul s,ul *got,ul *gote) { + call_16_tramp *t=(void *)gote; + + *t=t1; +- *got=can_gp; + + t->entry=(ul)(gote+2); + t->gotoff=s; +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -152,6 +152,7 @@ mbrk(void *v) { + + static ufixnum + get_phys_pages_no_malloc(char n) { ++ + MEMORYSTATUS m; + + m.dwLength=sizeof(m); +@@ -166,6 +167,7 @@ get_phys_pages_no_malloc(char n) { + + static ufixnum + get_phys_pages_no_malloc(char n) { ++ + uint64_t s; + size_t z=sizeof(s); + int m[2]={CTL_HW,HW_MEMSIZE}; +@@ -186,33 +188,30 @@ get_phys_pages_no_malloc(char n) { + + } + +-#else ++#elif defined(FREEBSD) ++ ++#include ++#include ++ ++static ufixnum ++get_phys_pages_no_malloc(char n) { ++ ++ size_t i,len=sizeof(i); + +-ufixnum +-get_proc_meminfo_value_in_pages(const char *k) { +- int l,m; +- char b[PAGESIZE],*c; +- ufixnum n; ++ return (sysctlbyname("hw.physmem",&i,&len,NULL,0) ? 0 : i)>>PAGEWIDTH; + +- massert((l=open("/proc/meminfo",O_RDONLY))!=-1); +- massert((n=read(l,b,sizeof(b)))>(PAGEWIDTH-10); + } + ++#else /*Linux*/ ++ + #include + + static ufixnum + get_phys_pages_no_malloc(char freep) { + + struct sysinfo s; +- sysinfo(&s); +- return ((freep ? s.freeram : s.totalram)>>PAGEWIDTH)*s.mem_unit; ++ ++ return sysinfo(&s) ? 0 : ((freep ? s.freeram : s.totalram)>>PAGEWIDTH)*s.mem_unit; + + } + diff --git a/debian/patches/Version_2_6_13pre32 b/debian/patches/Version_2_6_13pre32 new file mode 100644 index 0000000..4c42fbf --- /dev/null +++ b/debian/patches/Version_2_6_13pre32 @@ -0,0 +1,57 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-25) unstable; urgency=medium + . + * Version_2_6_13pre31, kfreebsd and mips64 FTBFS fix +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/elf64_mips_reloc.h ++++ gcl-2.6.12/h/elf64_mips_reloc.h +@@ -1,6 +1,7 @@ + case R_MIPS_JALR: + break; + case R_MIPS_64: ++ if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL32) s-=(ul)got; + add_val(where,~0L,s+a); + break; + case R_MIPS_GPREL32: +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -3,7 +3,7 @@ static ul ggot,ggote; static Rela *hr; + #undef ELF_R_SYM + #define ELF_R_SYM(a_) (a_&0xffffffff) + #undef ELF_R_TYPE +-#define ELF_R_TYPE(a_) (((a_>>40)&0xff) ? ((a_>>40)&0xff) : ((a_>>56)&0xff)) ++#define ELF_R_TYPE(a_) (((a_>>40)&0xff) ? ((a_>>40)&0xff) : (((a_>>48)&0xff) ? ((a_>>48)&0xff) : ((a_>>56)&0xff))) + #define ELF_R_FTYPE(a_) ((a_>>56)&0xff) + + typedef struct { +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -179,7 +179,7 @@ get_phys_pages_no_malloc(char n) { + + } + +-#elif defined(__sun__) ++#elif defined(__sun__) || defined(__GNU__) + + static ufixnum + get_phys_pages_no_malloc(char n) { diff --git a/debian/patches/Version_2_6_13pre33 b/debian/patches/Version_2_6_13pre33 new file mode 100644 index 0000000..3f91846 --- /dev/null +++ b/debian/patches/Version_2_6_13pre33 @@ -0,0 +1,232 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-26) unstable; urgency=medium + . + * Version_2_6_13pre32 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -161,7 +161,7 @@ + + + (defun compile-file1 (input-pathname +- &key (output-file input-pathname) ++ &key (output-file (truename input-pathname)) + (o-file t) + (c-file *default-c-file*) + (h-file *default-h-file*) +--- gcl-2.6.12.orig/h/elf64_mips_reloc.h ++++ gcl-2.6.12/h/elf64_mips_reloc.h +@@ -1,18 +1,28 @@ + case R_MIPS_JALR: + break; +- case R_MIPS_64: +- if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL32) s-=(ul)got; +- add_val(where,~0L,s+a); +- break; + case R_MIPS_GPREL32: ++ recurse(s+a-(ul)got); + add_val(where,MASK(32),s+a-(ul)got); + break; ++ case R_MIPS_GPREL16: ++ recurse(s+a-(ul)got); ++ add_val(where,MASK(16),s+a-(ul)got); ++ break; ++ case R_MIPS_SUB: ++ recurse(-(s+a)); ++ break;/*???*/ ++ case R_MIPS_64: ++ recurse(s+a); ++ add_val(where,~0L,s+a); ++ break; + case R_MIPS_32: ++ recurse(s+a); + add_val(where,MASK(32),s+a); + break; + case R_MIPS_GOT_DISP: + case R_MIPS_CALL16: + case R_MIPS_GOT_PAGE: ++ recurse(s+a); + gote=got+(a>>32)-1; + a&=MASK(32); + store_val(where,MASK(16),((void *)gote-(void *)got)); +@@ -22,28 +32,27 @@ + *gote=s+(a&~MASK(16))+((a&0x8000)<<1); + break; + case R_MIPS_GOT_OFST: ++ recurse(s+a); + store_val(where,MASK(16),a); + break; + case R_MIPS_HI16: +- s+=a&MASK(32); +- if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL16) s=(ul)got-s; ++ recurse(s+a); + if (!hr) hr=(void *)r; +- if (a&(1L<<32)) add_vals(where,MASK(16),(s+(a>>32))>>16); ++ if (lr)/*==(Rela *)r*/ ++ add_vals(where,MASK(16),(s+a+la)>>16); + break; + case R_MIPS_LO16: ++ recurse(s+a); + s+=a; +- if (ELF_R_FTYPE(r->r_info)==R_MIPS_GPREL16) s=(ul)got-s; + a=*where&MASK(16); + if (a&0x8000) a|=0xffffffffffff0000; + a+=s&MASK(16); + a+=(a&0x8000)<<1; + store_val(where,MASK(16),a); +- a&=~MASK(16); +- { +- Rela *ra=(void *)r; +- for (hr=hr ? hr : (void *)ra;--ra>=hr;) +- if (ELF_R_TYPE(ra->r_info)==R_MIPS_HI16) +- relocate(sym1,ra,ra->r_addend|(1L<<32)|(a<<32),start,got,gote); +- } +- hr=NULL; ++ for (la=a&~MASK(16),lr=(Rela *)r,hr=hr ? hr : lr;--lr>=hr;) ++ if (ELF_R_TYPE1(lr->r_info)==R_MIPS_HI16|| ++ ELF_R_TYPE2(lr->r_info)==R_MIPS_HI16|| ++ ELF_R_TYPE3(lr->r_info)==R_MIPS_HI16) ++ relocate(sym1,lr,lr->r_addend,start,got,gote); ++ hr=lr=NULL; + break; +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -1,10 +1,21 @@ +-static ul ggot,ggote; static Rela *hr; ++static ul ggot,ggote,la; static Rela *hr,*lr; + + #undef ELF_R_SYM + #define ELF_R_SYM(a_) (a_&0xffffffff) ++#define ELF_R_TYPE1(a_) ((a_>>56)&0xff) ++#define ELF_R_TYPE2(a_) ((a_>>48)&0xff) ++#define ELF_R_TYPE3(a_) ((a_>>40)&0xff) ++#define recurse(val) ({ \ ++ if (ELF_R_TYPE2(r->r_info)) { \ ++ ul i=r->r_info; \ ++ r->r_info=(((r->r_info>>32)&MASK(24))<<40)|(r->r_info&MASK(32)); \ ++ relocate(sym1,r,(val)-s,start,got,gote); \ ++ r->r_info=i; \ ++ break; \ ++ }}) ++ + #undef ELF_R_TYPE +-#define ELF_R_TYPE(a_) (((a_>>40)&0xff) ? ((a_>>40)&0xff) : (((a_>>48)&0xff) ? ((a_>>48)&0xff) : ((a_>>56)&0xff))) +-#define ELF_R_FTYPE(a_) ((a_>>56)&0xff) ++#define ELF_R_TYPE(a_) ELF_R_TYPE1(a_) + + typedef struct { + ul entry,gotoff; +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -568,6 +568,12 @@ EXTER unsigned plong signals_allowed, si + + #define IMMNIL(x) (is_imm_fixnum(x)||x==Cnil) + +-#define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&eql1(_a,_b));}) +-#define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&equal1(_a,_b));}) +-#define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (_a!=Cnil&&_b!=Cnil&&equalp1(_a,_b));}) ++/*gcc boolean expression tail position bug*/ ++ ++/* #define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&eql1(_a,_b));}) */ ++/* #define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&equal1(_a,_b));}) */ ++/* #define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (_a!=Cnil&&_b!=Cnil&&equalp1(_a,_b));}) */ ++ ++#define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (IMMNIL(_a)||IMMNIL(_b) ? FALSE : eql1(_a,_b));}) ++#define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (IMMNIL(_a)||IMMNIL(_b) ? FALSE : equal1(_a,_b));}) ++#define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (_a==Cnil||_b==Cnil ? FALSE : equalp1(_a,_b));}) +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -443,6 +443,23 @@ gcl_cleanup(int gc) { + + } + ++/*gcc boolean expression tail position bug*/ ++ ++void * ++cclear_stack(unsigned long size) { ++ void *v=alloca(size); ++ memset(v,0,size); ++ return v; ++} ++ ++DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",object,fSequal_tail_recursion_check,SI,1,1,NONE,II,OO,OO,OO,(fixnum s),"") { ++ object x0=make_list(s/sizeof(object)),x1=make_list(s/sizeof(object)); ++ char *u=cclear_stack(s),*w; ++ fLequal(x0,x1); ++ for (w=u;wc.c_car,y->c.c_car)) { +- x=x->c.c_cdr; +- y=y->c.c_cdr; +- if (x==y) return TRUE; +- if (IMMNIL(x)||IMMNIL(y)) return FALSE; +- goto BEGIN; +- } else +- return FALSE; +- } +-#else +- +- if (valid_cdr(x)) return valid_cdr(y)&&equal(x->c.c_car,y->c.c_car)&&equal(x->c.c_cdr,y->c.c_cdr); +- +-#endif ++ /*gcc boolean expression tail position bug*/ ++ /* if (valid_cdr(x)) return valid_cdr(y)&&equal(x->c.c_car,y->c.c_car)&&equal(x->c.c_cdr,y->c.c_cdr); */ ++ if (valid_cdr(x)) return !valid_cdr(y)||!equal(x->c.c_car,y->c.c_car) ? FALSE : equal(x->c.c_cdr,y->c.c_cdr); + + if (valid_cdr(y)) return FALSE; + +@@ -524,7 +510,9 @@ equalp1(register object x, register obje + + /*x and y are not == and not Cnil*/ + +- if (listp(x)) return listp(y)&&equalp(x->c.c_car,y->c.c_car)&&equalp(x->c.c_cdr,y->c.c_cdr); ++ /*gcc boolean expression tail position bug*/ ++ /* if (listp(x)) return listp(y)&&equalp(x->c.c_car,y->c.c_car)&&equalp(x->c.c_cdr,y->c.c_cdr); */ ++ if (listp(x)) return !listp(y)||!equalp(x->c.c_car,y->c.c_car) ? FALSE : equalp(x->c.c_cdr,y->c.c_cdr); + + if (listp(y)) return FALSE; + +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -79,3 +79,7 @@ + + #+ansi-cl (use-package :pcl :user) + #+ansi-cl (import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) ++ ++(let* ((i 4096)(j (si::equal-tail-recursion-check i))) ++ (unless (eql i j) ++ (warn "equal is not tail recursive ~s ~s" i j))) diff --git a/debian/patches/Version_2_6_13pre34 b/debian/patches/Version_2_6_13pre34 new file mode 100644 index 0000000..15aa00d --- /dev/null +++ b/debian/patches/Version_2_6_13pre34 @@ -0,0 +1,34 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-27) unstable; urgency=medium + . + * Version_2_6_13pre33; mips64 relocs; stack saving tail-recursive equal. +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -81,5 +81,5 @@ + #+ansi-cl (import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) + + (let* ((i 4096)(j (si::equal-tail-recursion-check i))) +- (unless (eql i j) ++ (unless (<= (ash i -1) j) + (warn "equal is not tail recursive ~s ~s" i j))) diff --git a/debian/patches/Version_2_6_13pre35 b/debian/patches/Version_2_6_13pre35 new file mode 100644 index 0000000..90ea7ea --- /dev/null +++ b/debian/patches/Version_2_6_13pre35 @@ -0,0 +1,40 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-27) unstable; urgency=medium + . + * Version_2_6_13pre34; mips64 relocs; stack saving tail-recursive equal. +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/predicate.c ++++ gcl-2.6.12/o/predicate.c +@@ -501,6 +501,12 @@ oequal(object x,object y) { + DEFUN_NEW("EQUAL",object,fLequal,LISP,2,2,NONE,OO,OO,OO,OO,(object x0,object x1),"") { + RETURN1(equal(x0, x1) ? Ct : Cnil); + } ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fLequal(object x,object y) { ++ return FFN(fLequal)(x,y); ++} ++#endif + + bool + equalp1(register object x, register object y) { diff --git a/debian/patches/Version_2_6_13pre36 b/debian/patches/Version_2_6_13pre36 new file mode 100644 index 0000000..ac9a53c --- /dev/null +++ b/debian/patches/Version_2_6_13pre36 @@ -0,0 +1,89 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-28) unstable; urgency=medium + . + * Version_2_6_13pre35; restore hppa build +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -34,7 +34,7 @@ boot.o: boot.c $(DECL) boot.h + $(CC) -c $(CFLAGS) $(DEFS) -fPIC $*.c $(AUX_INFO) + + prelink.o: prelink.c $(DECL) +- $(CC) -fPIE -c $(CFLAGS) $(DEFS) $*.c $(AUX_INFO) ++ $(CC) -fPIE -c $(filter-out -pg,$(CFLAGS)) $(DEFS) $*.c $(AUX_INFO) + + %.o: %.c $(DECL) + $(CC) -c $(CFLAGS) $(DEFS) $*.c $(AUX_INFO) +--- gcl-2.6.12.orig/o/sfasli.c ++++ gcl-2.6.12/o/sfasli.c +@@ -111,46 +111,17 @@ LFD(build_symbol_table)(void) { + + } + +-extern int mcount(); +-extern int _mcount(); +-extern int __divdi3(); +-extern int __moddi3(); +-extern int __udivdi3(); +-extern int __umoddi3(); +-extern void sincos(double,double *,double *); +-extern int __divsi3(); +-extern int __modsi3(); +-extern int __udivsi3(); +-extern int __umodsi3(); +-extern int $$divI(); +-extern int $$divU(); +-extern int $$remI(); +-extern int $$remU(); +-extern int __divq(); +-extern int __divqu(); +-extern int __remq(); +-extern int __remqu(); +- +-#ifndef DARWIN + #ifndef _WIN32 + int + use_symbols(double d,...) { + +- sincos(d,&d,&d); +- +-#ifdef GCL_GPROF +- _mcount(); +-#endif +- +- return (int)d; ++#ifndef DARWIN ++ extern void sincos(double,double *,double *); + +-} +-#endif ++ sincos(d,&d,&d); + #else +-int +-use_symbols(double d,...) { +- + d=sin(d)+cos(d); ++#endif + + return (int)d; + diff --git a/debian/patches/Version_2_6_13pre38 b/debian/patches/Version_2_6_13pre38 new file mode 100644 index 0000000..7feda75 --- /dev/null +++ b/debian/patches/Version_2_6_13pre38 @@ -0,0 +1,308 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-29) unstable; urgency=medium + . + * Version_2_6_13pre35; support latest binutils + * Bug fix: "gcl ftbfs on amd64 and i386 with binutils from + experimental", thanks to Matthias Klose (Closes: #803214). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/803214 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpvs.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpvs.lsp +@@ -75,8 +75,8 @@ + (defun wt-vs* (vs) + (wt "(" )(wt-vs vs) (wt "->c.c_car)")) + +-(defun wt-ccb-vs (ccb-vs) +- (wt "(fun->cc.cc_turbo[" (- *initial-ccb-vs* ccb-vs) "]->c.c_car)")) ++(defun wt-ccb-vs (ccb-vs);;FIXME harmonize *closure-p* with *clink* ++ (wt "(" (if *closure-p* "fun->cc.cc_turbo" "base0") "[" (- *initial-ccb-vs* ccb-vs) "]->c.c_car)")) + + (defun clink (vs) (setq *clink* vs)) + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -7663,7 +7663,7 @@ fi + if test "${enable_ansi+set}" = set; then : + enableval=$enable_ansi; + else +- enable_ansi="no" ++ enable_ansi="yes" + fi + + +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -2133,7 +2133,7 @@ AC_ARG_ENABLE(readline, + + # ansi lisp + AC_ARG_ENABLE(ansi,[--enable-ansi builds a large gcl aiming for ansi compliance, +- --disable-ansi builds the smaller traditional CLtL1 image],,enable_ansi="no") ++ --disable-ansi builds the smaller traditional CLtL1 image],,enable_ansi="yes") + + if test "$enable_ansi" = "yes" ; then + SYSTEM=ansi_gcl +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1241,7 +1241,7 @@ gcl_init_alloc(void *cs_start) { + + massert(!getrlimit(RLIMIT_STACK, &rl)); + if (rl.rlim_cur!=RLIM_INFINITY && (rl.rlim_max == RLIM_INFINITY || rl.rlim_max > rl.rlim_cur)) { +- rl.rlim_cur = rl.rlim_max == RLIM_INFINITY ? rl.rlim_max : rl.rlim_max/64; ++ rl.rlim_cur = rl.rlim_max; + massert(!setrlimit(RLIMIT_STACK,&rl)); + } + cssize = rl.rlim_cur/sizeof(*cs_org) - sizeof(*cs_org)*CSGETA; +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -2407,17 +2407,18 @@ object x=Cnil; + inPort = (myport == Cnil ? 0 : fix(Iis_fixnum(myport))); + + #ifdef BSD ++ + if (isServer && daemon != Cnil) { + + long pid,i; + struct rlimit r; +- struct sigaction sa; ++ struct sigaction sa,osa; + + sa.sa_handler=SIG_IGN; + sa.sa_flags=SA_NOCLDWAIT; + sigemptyset(&sa.sa_mask); + +- sigaction(SIGCHLD,&sa,NULL); ++ massert(!sigaction(SIGCHLD,&sa,&osa)); + + switch((pid=pfork())) { + case -1: +@@ -2425,8 +2426,7 @@ object x=Cnil; + break; + case 0: + +- if (setsid()<0) +- FEerror("setsid error", 0); ++ massert(setsid()>=0); + + if (daemon == sKpersistent) + switch(pfork()) { +@@ -2440,23 +2440,17 @@ object x=Cnil; + break; + } + ++ massert(!chdir("/")); ++ + memset(&r,0,sizeof(r)); +- if (getrlimit(RLIMIT_NOFILE,&r)) +- FEerror("Cannot get resourse usage",0); ++ massert(!getrlimit(RLIMIT_NOFILE,&r)); + + for (i=0;i=0); ++ massert((i=dup(i))>=0); ++ massert((i=dup(i))>=0); + + umask(0); + +@@ -2473,16 +2467,14 @@ object x=Cnil; + + FD_ZERO(&fds); + FD_SET(fd,&fds); +- i=select(fd+1,&fds,NULL,NULL,NULL); + +- if (i>0) { ++ if (select(fd+1,&fds,NULL,NULL,NULL)>0) { + + y=maccept(x); + +- sigaction(SIGCHLD,&sa,NULL); +- + switch((pid=pfork())) { + case 0: ++ massert(!sigaction(SIGCHLD,&osa,NULL)); + ifuncall1(server,y); + exit(0); + break; +@@ -2506,6 +2498,8 @@ object x=Cnil; + break; + } + ++ massert(!sigaction(SIGCHLD,&osa,NULL)); ++ + } else + + #endif +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -227,9 +227,9 @@ get_phys_pages1(char freep) { + static void + get_gc_environ(void) { + +- const char *e;; ++ const char *e; + +- mem_multiple=1.0; ++ mem_multiple=0.85; + if ((e=getenv("GCL_MEM_MULTIPLE"))) { + massert(sscanf(e,"%lf",&mem_multiple)==1); + massert(mem_multiple>=0.0); +--- gcl-2.6.12.orig/o/nsocket.c ++++ gcl-2.6.12/o/nsocket.c +@@ -630,50 +630,43 @@ doReverse(char *s, int n) + of the buffer may be changed. + */ + int +-getCharGclSocket(object strm, object block) +-{ +- object bufp = SOCKET_STREAM_BUFFER(strm); +- if (bufp->ust.ust_fillp > 0) { +- dprintf("getchar returns (%c)\n",bufp->ust.ust_self[-1+(bufp->ust.ust_fillp)]); ++getCharGclSocket(object strm, object block) { ++ ++ object bufp=SOCKET_STREAM_BUFFER(strm); ++ int fd=SOCKET_STREAM_FD(strm); ++ ++ if (bufp->ust.ust_fillp > 0) + return bufp->ust.ust_self[--(bufp->ust.ust_fillp)]; +- } +- else { ++ ++ if (fd>=0) { ++ + fd_set readfds; +- struct timeval timeout; +- int fd = SOCKET_STREAM_FD(strm); +- if (1) +- { int high; +- AGAIN: +- /* under cygwin a too large timout like (1<<30) does not work */ +- timeout.tv_sec = 0; +- timeout.tv_usec = 10000; +- FD_ZERO(&readfds); +- FD_SET(fd,&readfds); +- high = select(fd+1,&readfds,NULL,NULL,block==Ct ? NULL : &timeout); +- if (high > 0) +- { object bufp = SOCKET_STREAM_BUFFER(strm); +- int n; +- n = SAFE_READ(fd,bufp->st.st_self ,bufp->ust.ust_dim); ++ struct timeval t,t1={0,10000},*tp=block==Ct ? NULL : &t; ++ int high,n; ++ ++ FD_ZERO(&readfds); ++ FD_SET(fd,&readfds); ++ ++ for (;(errno=0,t=t1,high=select(fd+1,&readfds,NULL,NULL,tp))==-1 && !tp && errno==EINTR;); ++ ++ if (high > 0) { ++ ++ massert((n=SAFE_READ(fd,bufp->st.st_self,bufp->ust.ust_dim))>=0); ++ ++ if (n) { + doReverse(bufp->st.st_self,n); + bufp->ust.ust_fillp=n; +- if (n > 0) +- { +- dprintf("getchar returns (%c)\n",bufp->ust.ust_self[-1+(bufp->ust.ust_fillp)]); +- return bufp->ust.ust_self[--(bufp->ust.ust_fillp)]; +- } +- else +- { +- SOCKET_STREAM_FD(strm)=-1; +- return EOF; +- FEerror("select said there was stuff there but there was not",0); +- } +- } +- /* probably a signal interrupted us.. */ +- if (block == Ct) +- goto AGAIN; +- return EOF; +- } ++ } else ++ SOCKET_STREAM_FD(strm)=-1; ++ ++ return getCharGclSocket(strm,block); ++ ++ } ++ + } ++ ++ return EOF; ++ + } + + #else +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -7,6 +7,7 @@ extern FILE *stdin __attribute__((weak)) + extern FILE *stderr __attribute__((weak)); + extern FILE *stdout __attribute__((weak)); + ++#ifdef HAVE_READLINE + #if RL_READLINE_VERSION < 0x0600 + extern Function *rl_completion_entry_function __attribute__((weak)); + extern char *rl_readline_name __attribute__((weak)); +@@ -15,6 +16,7 @@ extern rl_compentry_func_t *rl_completio + extern const char *rl_readline_name __attribute__((weak)); + #endif + #endif ++#endif + + void + prelink_init(void) { +--- gcl-2.6.12.orig/o/sfasli.c ++++ gcl-2.6.12/o/sfasli.c +@@ -116,14 +116,20 @@ int + use_symbols(double d,...) { + + #ifndef DARWIN ++ + extern void sincos(double,double *,double *); ++ double d2; ++ ++ sincos(d,&d,&d2); + +- sincos(d,&d,&d); + #else ++ + d=sin(d)+cos(d); ++ d2=sin(d)+cos(d); ++ + #endif + +- return (int)d; ++ return (int)(d+d2); + + } + #endif diff --git a/debian/patches/Version_2_6_13pre39 b/debian/patches/Version_2_6_13pre39 new file mode 100644 index 0000000..5ffdcd0 --- /dev/null +++ b/debian/patches/Version_2_6_13pre39 @@ -0,0 +1,53 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-30) unstable; urgency=medium + . + * Version_2_6_13pre38 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4379,7 +4379,10 @@ $as_echo "Reducing optimization on profi + enable_debug=yes;; + esac + TCFLAGS="$TCFLAGS -pg"; +- TLIBS="$TLIBS -pg"; ++ case $use in ++ s390*) ;; # relocation truncation bug in gcc ++ *) TLIBS="$TLIBS -pg";; ++ esac + TFPFLAG="" + + $as_echo "#define GCL_GPROF 1" >>confdefs.h +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -587,7 +587,10 @@ if test "$enable_gprof" = "yes" ; then + enable_debug=yes;; + esac + TCFLAGS="$TCFLAGS -pg"; +- TLIBS="$TLIBS -pg"; ++ case $use in ++ s390*) ;; # relocation truncation bug in gcc ++ *) TLIBS="$TLIBS -pg";; ++ esac + TFPFLAG="" + AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) + else diff --git a/debian/patches/Version_2_6_13pre3a b/debian/patches/Version_2_6_13pre3a new file mode 100644 index 0000000..db3902c --- /dev/null +++ b/debian/patches/Version_2_6_13pre3a @@ -0,0 +1,62 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-4) unstable; urgency=medium + . + * Version_2_6_13pre3 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/bsd.h ++++ gcl-2.6.12/h/bsd.h +@@ -33,7 +33,7 @@ filecpy(save, original, stsize - sizeof( + + extern char etext; + +-#define INIT_ALLOC heap_end = core_end = sbrk(0); ++#define INIT_ALLOC heap_end = core_end = PCEI(sbrk(0),PAGESIZE); + + #define SYM_EXTERNAL_P(sym) ((sym)->n_type & N_EXT) + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -229,9 +229,7 @@ alloc_page(long n) { + + if (!s) { + +- if (nn>(holepage - (in_signal_handler? 0 : +- available_pages-n<=reserve_pages_for_signal_handler ? 0 : +- reserve_pages_for_signal_handler))) { ++ if (nn>holepage) { + + + fixnum d=available_pages-nn; +@@ -241,12 +239,6 @@ alloc_page(long n) { + d=d<0 ? 0 : d; + d=new_holepage + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-4) unstable; urgency=medium + . + * Version_2_6_13pre3a +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc_special.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc_special.h +@@ -15,8 +15,6 @@ find_special_params(void *v,Shdr *sec1,S + Shdr *sec; + Rela *r; + void *ve; +- ul j,*u; +- + + massert((sec=get_section(".rela.plt",sec1,sece,sn))); + +--- gcl-2.6.12.orig/h/page.h ++++ gcl-2.6.12/h/page.h +@@ -88,7 +88,8 @@ extern int reserve_pages_for_signal_hand + /* #define CONT_MARK_PAGE (((page(heap_end)-first_data_page)*(PAGESIZE/(CPTR_SIZE*CHAR_SIZE))+PAGESIZE-1)/PAGESIZE) */ + /* #define available_pages ((fixnum)(real_maxpage-page(heap_end)-2*nrbpage-CONT_MARK_PAGE-resv_pages)) */ + +-extern struct pageinfo *cell_list_head,*cell_list_tail,*contblock_list_head,*contblock_list_tail; ++extern struct pageinfo *cell_list_head,*cell_list_tail/* ,*contblock_list_head,*contblock_list_tail */; ++extern object contblock_array; + + #define PAGE_MAGIC 0x2e + +@@ -114,7 +115,7 @@ EXTER void *data_start,*initial_sbrk; + #define CB_BITS CPTR_SIZE*CHAR_SIZE + #define ceil(a_,b_) (((a_)+(b_)-1)/(b_)) + #define npage(m_) ceil(m_,PAGESIZE) +-#define cpage(m_) ({ufixnum _m=(m_);ceil(sizeof(struct pageinfo)+_m+2*ceil(_m,(CB_BITS-2)),PAGESIZE);}) ++#define cpage(m_) CEI(({ufixnum _m=(m_);ceil(sizeof(struct pageinfo)+_m+2*ceil(_m,(CB_BITS-2)),PAGESIZE);}),256) + #define mbytes(p_) ceil((p_)*PAGESIZE-sizeof(struct pageinfo),CB_BITS) + #define tpage(tm_,m_) (tm_->tm_type==t_relocatable ? npage(m_-(rb_limit-rb_pointer)+1) : (tm_->tm_type==t_contiguous ? cpage(m_) : npage(m_))) + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1941,3 +1941,12 @@ mbrk(void *); + + void + maybe_set_hole_from_maxpages(void); ++ ++void * ++alloc_code_space(size_t); ++ ++object ++fSmake_vector1_2(fixnum,fixnum,object,object); ++ ++inline struct pageinfo * ++get_pageinfo(void *); +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -78,6 +78,72 @@ struct rlimit data_rlimit; + #endif + #endif + ++static inline void * ++bsearchleq(void *i,void *v1,size_t n,size_t s,int (*c)(const void *,const void *)) { ++ ++ ufixnum nn=n>>1; ++ void *v=v1+nn*s; ++ int j=c(i,v); ++ ++ if (nn) ++ return !j ? v : (j>0 ? bsearchleq(i,v,n-nn,s,c) : bsearchleq(i,v1,nn,s,c)); ++ else ++ return j<=0 ? v : v+s; ++ ++} ++ ++ ++object contblock_array=Cnil; ++ ++static inline void ++expand_contblock_array(void) { ++ ++ if (contblock_array==Cnil) { ++ contblock_array=fSmake_vector1_2(16,aet_fix,Cnil,make_fixnum(0)); ++ contblock_array->v.v_self[0]=(object)&cb_pointer; ++ enter_mark_origin(&contblock_array); ++ } ++ ++ if (contblock_array->v.v_fillp==contblock_array->v.v_dim) { ++ ++ void *v=alloc_relblock(2*contblock_array->v.v_dim*sizeof(fixnum)); ++ ++ memcpy(v,contblock_array->v.v_self,contblock_array->v.v_dim*sizeof(fixnum)); ++ contblock_array->v.v_self=v; ++ contblock_array->v.v_dim*=2; ++ ++ } ++ ++} ++ ++static void ++contblock_array_push(void *p) { ++ ++ expand_contblock_array(); ++ contblock_array->v.v_self[contblock_array->v.v_fillp]=p; ++ contblock_array->v.v_fillp++; ++ ++} ++ ++static inline int ++acomp(const void *v1,const void *v2) { ++ ++ void *p1=*(void * const *)v1,*p2=*(void * const *)v2; ++ ++ return p1v.v_self,contblock_array->v.v_fillp,sizeof(*contblock_array->v.v_self),acomp); ++ struct pageinfo *p=(void *)pp>(void *)contblock_array->v.v_self ? pp[-1] : NULL; ++ ++ return p && (void *)p+p->in_use*PAGESIZE>x ? p : NULL; ++ ++} ++ + inline void + add_page_to_contblock_list(void *p,fixnum m) { + +@@ -89,13 +155,8 @@ add_page_to_contblock_list(void *p,fixnu + massert(pp->in_use==m); + pp->magic=PAGE_MAGIC; + +- if (contblock_list_head==NULL) +- contblock_list_tail=contblock_list_head=p; +- else if (pp > contblock_list_tail) { +- contblock_list_tail->next=p; +- contblock_list_tail=p; +- } +- ++ contblock_array_push(p); ++ + bzero(pagetochar(page(pp)),CB_DATA_START(pp)-(void *)pagetochar(page(pp))); + #ifdef SGC + if (sgc_enabled && tm_table[t_contiguous].tm_sgc) { +@@ -458,7 +519,7 @@ rebalance_maxpages(struct typemanager *m + for (i=t_start;iv.v_self[0]=(object)&cb_pointer; + enter_mark_origin(&cbv); + } +@@ -612,21 +673,6 @@ cbcomp(const void *v1,const void *v2) { + + } + +-static inline void * +-bsearchleq(void *i,void *v1,size_t n,size_t s,int (*c)(const void *,const void *)) { +- +- ufixnum nn=n>>1; +- void *v=v1+nn*s; +- int j=c(i,v); +- +- if (nn) +- return !j ? v : (j>0 ? bsearchleq(i,v,n-nn,s,c) : bsearchleq(i,v1,nn,s,c)); +- else +- return j<=0 ? v : v+s; +- +-} +- +- + static inline struct contblock *** + find_cbppp(struct contblock *cbp) { + +@@ -777,7 +823,7 @@ grow_linear1(struct typemanager *tm) { + static inline int + too_full_p(struct typemanager *tm) { + +- fixnum j,k,pf=tm->tm_percent_free ? tm->tm_percent_free : 30; ++ fixnum i,j,k,pf=tm->tm_percent_free ? tm->tm_percent_free : 30; + struct contblock *cbp; + struct pageinfo *pi; + +@@ -787,11 +833,13 @@ too_full_p(struct typemanager *tm) { + break; + case t_contiguous: + for (cbp=cb_pointer,k=0;cbp;cbp=cbp->cb_link) k+=cbp->cb_size; +- for (pi=contblock_list_head,j=0;pi;pi=pi->next) ++ for (i=j=0;iv.v_fillp;i++) { ++ pi=(void *)contblock_array->v.v_self[i]; + #ifdef SGC + if (!sgc_enabled || pi->sgc_flags&SGC_PAGE_FLAG) + #endif + j+=pi->in_use; ++ } + return 100*ktm_maxpage-tm->tm_npage; */ + add_pages(tm,m); + + return alloc_from_freelist(tm,n); +@@ -997,6 +1042,34 @@ alloc_contblock_no_gc(size_t n) { + + } + ++#ifndef MAX_CODE_ADDRESS ++#define MAX_CODE_ADDRESS -1UL ++#endif ++ ++void * ++alloc_code_space(size_t sz) { ++ ++ void *v; ++ ++ sz=CEI(sz,CPTR_SIZE); ++ ++ if (sSAcode_block_reserveA && ++ sSAcode_block_reserveA->s.s_dbind!=Cnil && sSAcode_block_reserveA->s.s_dbind->st.st_dim>=sz) { ++ ++ v=sSAcode_block_reserveA->s.s_dbind->st.st_self; ++ sSAcode_block_reserveA->s.s_dbind->st.st_self+=sz; ++ sSAcode_block_reserveA->s.s_dbind->st.st_dim-=sz; ++ sSAcode_block_reserveA->s.s_dbind->st.st_fillp=sSAcode_block_reserveA->s.s_dbind->st.st_dim; ++ ++ } else ++ v=alloc_contblock(sz); ++ ++ massert(v && (unsigned long)(v+sz)type==t_contiguous && p+v->in_use*PAGESIZE>x); +- +- return p; +- +-} +- +-/* inline struct pageinfo * */ +-/* get_pageinfo(void *x) { */ +-/* struct pageinfo *v=contblock_list_head;void *vv; */ +-/* for (;(vv=v) && (vv>=x || vv+v->in_use*PAGESIZE<=x);v=v->next); */ +-/* return v; */ +-/* } */ +- + inline char + get_bit(char *v,struct pageinfo *pi,void *x) { + void *ve=CB_DATA_START(pi); +@@ -811,7 +784,7 @@ mark_stack_carefully(void *topv, void *b + + for (j=top ; j >= bottom ; j--) { + +- void *v=(void *)(*j),**a; ++ void *v=(void *)(*j); + struct pageinfo *pi; + + if (!VALID_DATA_ADDRESS_P(v)) continue; +@@ -822,7 +795,7 @@ mark_stack_carefully(void *topv, void *b + pi=pagetoinfo(p); + if (!pageinfo_p(pi)) continue; + +- if ((a=contblock_stack_list) && in_contblock_stack_list(pi,&a)) continue; ++ if (get_pageinfo(pi)) continue; + + tm=tm_of(pi->type); + if (tm->tm_type>=t_end) continue; +@@ -1067,14 +1040,24 @@ sweep_phase(void) { + static void + contblock_sweep_phase(void) { + ++ struct pageinfo *v; + STATIC char *s, *e, *p, *q; +- STATIC struct pageinfo *v; ++ object o; ++ ufixnum i; + + reset_contblock_freelist(); +- +- for (v=contblock_list_head;v;v=v->next) { ++ ++ o=sSAleaf_collection_thresholdA->s.s_dbind; ++ sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(-1); ++ ++ for (i=0;iv.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++) { ++ + bool z; + ++#ifdef SGC ++ if (sgc_enabled && !(v->sgc_flags&SGC_PAGE_FLAG)) continue; ++#endif ++ + s=CB_DATA_START(v); + e=(void *)v+v->in_use*PAGESIZE; + +@@ -1090,14 +1073,9 @@ contblock_sweep_phase(void) { + bzero(CB_MARK_START(v),CB_SGCF_START(v)-CB_MARK_START(v)); + + } +-#ifdef DEBUG +- if (debug) { +- for (cbp = cb_pointer; cbp != NULL; cbp = cbp->cb_link) +- printf("%lud-byte contblock\n", cbp->cb_size); +- fflush(stdout); +- } +-#endif +- ++ ++ sSAleaf_collection_thresholdA->s.s_dbind=o; ++ + sweep_link_array(); + + } +@@ -1143,24 +1121,6 @@ GBC(enum type t) { + + ngc_thresh=fix(sSAleaf_collection_thresholdA->s.s_dbind); + +- { /*FIXME try to get this below the setjmp in mark_c_stack*/ +- struct pageinfo *v,*tv; +- ufixnum i; +- void *a; +- +- for (v=contblock_list_head,contblock_stack_list=NULL;v;v=v->next) +- for (i=1;iin_use;i++) { +- tv=pagetoinfo(page(v)+i); +- if (pageinfo_p(tv)) { +- a=contblock_stack_list; +- /* fprintf(stderr,"pushing %p\n",tv); */ +- contblock_stack_list=alloca(2*sizeof(a)); +- contblock_stack_list[0]=tv; +- contblock_stack_list[1]=a; +- } +- } +- } +- + if (in_signal_handler && t == t_relocatable) + error("cant gc relocatable in signal handler"); + +@@ -1312,12 +1272,7 @@ GBC(enum type t) { + } + #endif + +-#ifdef SGC +- if (sgc_enabled) +- sgc_contblock_sweep_phase(); +- else +-#endif +- contblock_sweep_phase(); ++ contblock_sweep_phase(); + #ifdef DEBUG + if (debug) + printf("contblock sweep ended (%d)\n", +@@ -1574,7 +1529,7 @@ mark_contblock(void *p, int s) { + sizeof(struct contblock). CM 20030827 */ + x = (char *)PFLR(p,CPTR_SIZE); + y = (char *)PCEI(q,CPTR_SIZE); +- v=get_pageinfo(x); ++ massert(v=get_pageinfo(x)); + #ifdef SGC + if (!sgc_enabled || (v->sgc_flags&SGC_PAGE_FLAG)) + #endif +@@ -1595,7 +1550,7 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc + } + fprintf(stderr,"\nTotal free %lu in %lu pieces\n\n",i,j); + +- for (i=j=0,v=contblock_list_head;v;i+=v->in_use,j++,v=v->next) ++ for (i=j=k=0;kv.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++) + fprintf(stderr,"%lu pages at %p\n",(unsigned long)v->in_use,v); + fprintf(stderr,"\nTotal pages %lu in %lu pieces\n\n",i,j); + +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -242,32 +242,6 @@ relocate_symbols(Sym *sym,Sym *syme,Shdr + + } + +-#ifndef MAX_CODE_ADDRESS +-#define MAX_CODE_ADDRESS -1UL +-#endif +- +-static void * +-alloc_memory(ul sz) { +- +- void *v; +- +- if (sSAcode_block_reserveA && +- sSAcode_block_reserveA->s.s_dbind!=Cnil && sSAcode_block_reserveA->s.s_dbind->st.st_dim>=sz) { +- +- v=sSAcode_block_reserveA->s.s_dbind->st.st_self; +- sSAcode_block_reserveA->s.s_dbind->st.st_self+=sz; +- sSAcode_block_reserveA->s.s_dbind->st.st_dim-=sz; +- sSAcode_block_reserveA->s.s_dbind->st.st_fillp=sSAcode_block_reserveA->s.s_dbind->st.st_dim; +- +- } else +- v=alloc_contblock(sz); +- +- massert(v && (ul)(v+sz)cfd.cfd_size=sz; + memory->cfd.cfd_self=0; + memory->cfd.cfd_start=0; +- memory->cfd.cfd_start=alloc_memory(sz); ++ memory->cfd.cfd_start=alloc_code_space(sz); + + a=(ul)memory->cfd.cfd_start; + a=(a+ma)&~ma; +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -99,7 +99,7 @@ sgc_mark_phase(void) { + + /* mark all non recent data on writable contiguous pages */ + if (what_to_collect == t_contiguous) +- for (v=contblock_list_head;v;v=v->next) ++ for (i=0;iv.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++) + if (v->sgc_flags&SGC_PAGE_FLAG) { + void *s=CB_DATA_START(v),*e=CB_DATA_END(v),*p,*q; + bool z=get_sgc_bit(v,s); +@@ -213,40 +213,6 @@ sgc_sweep_phase(void) { + } + } + +- +-static void +-sgc_contblock_sweep_phase(void) { +- +- STATIC char *s, *e, *p, *q; +- STATIC struct pageinfo *v; +- +- reset_contblock_freelist(); +- +- for (v=contblock_list_head;v;v=v->next) { +- bool z; +- +- if (!(v->sgc_flags&SGC_PAGE_FLAG)) continue; +- +- s=CB_DATA_START(v); +- e=CB_DATA_END(v); +- +- z=get_mark_bit(v,s); +- for (p=s;pnext) { ++ for (i=0;iv.v_fillp && (pi=(void *)contblock_array->v.v_self[i]) && countv.v_fillp; + + if (maxcbpagev.v_fillp); + +- contblock_list_tail->sgc_flags=SGC_PAGE_FLAG; ++ ((struct pageinfo *)contblock_array->v.v_self[fp])->sgc_flags=SGC_PAGE_FLAG; + + } + +@@ -743,17 +709,19 @@ sgc_start(void) { + { + + struct pageinfo *pi; +- ++ ufixnum j; ++ + { + + struct contblock **cbpp; + void *p=NULL,*pe; + struct pageinfo *pi; ++ ufixnum i; + + old_cb_pointer=cb_pointer; + reset_contblock_freelist(); + +- for (pi=contblock_list_head;pi;pi=pi->next) { ++ for (i=0;iv.v_fillp && (pi=(void *)contblock_array->v.v_self[i]);i++) { + + if (pi->sgc_flags!=SGC_PAGE_FLAG) continue; + +@@ -786,7 +754,7 @@ sgc_start(void) { + else + tm_of(pi->type)->tm_alt_npage++; + } +- for (pi=contblock_list_head;pi;pi=pi->next)/*FIXME*/ ++ for (j=0;jv.v_fillp && (pi=(void *)contblock_array->v.v_self[j]);j++) + if (pi->sgc_flags&SGC_WRITABLE) + for (i=0;iin_use;i++) + SET_WRITABLE(page(pi)+i); +@@ -932,7 +900,7 @@ sgc_quit(void) { + ((object) p)->d.s=SGC_NORMAL; + #endif + +- for (v=contblock_list_head;v;v=v->next) ++ for (i=0;iv.v_fillp &&(v=(void *)contblock_array->v.v_self[i]);i++) + if (v->sgc_flags&SGC_PAGE_FLAG) + bzero(CB_SGCF_START(v),CB_DATA_START(v)-CB_SGCF_START(v)); + +@@ -940,7 +908,7 @@ sgc_quit(void) { + struct pageinfo *pi; + for (pi=cell_list_head;pi;pi=pi->next) + pi->sgc_flags&=SGC_PERM_WRITABLE; +- for (pi=contblock_list_head;pi;pi=pi->next) ++ for (i=0;iv.v_fillp &&(pi=(void *)contblock_array->v.v_self[i]);i++) + pi->sgc_flags&=SGC_PERM_WRITABLE; + } + diff --git a/debian/patches/Version_2_6_13pre41 b/debian/patches/Version_2_6_13pre41 new file mode 100644 index 0000000..67e553e --- /dev/null +++ b/debian/patches/Version_2_6_13pre41 @@ -0,0 +1,185 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-32) unstable; urgency=medium + . + * Version_2_6_13pre40 + * Bug fix: "[INTL:pt_BR] Brazilian Portuguese debconf templates + translation", thanks to Adriano Rafael Gomes (Closes: #811523). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/811523 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -300,7 +300,8 @@ gcl_init_cmp_anon(void); + + #include "gmp_wrappers.h" + +-#define massert(a_) if (!(a_)) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__) ++#include ++#define massert(a_) ({errno=0;if (!(a_)||errno) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__);}) + + extern bool writable_malloc; + #define writable_malloc_wrap(f_,rt_,a_...) ({rt_ v;bool w=writable_malloc;writable_malloc=1;v=f_(a_);writable_malloc=w;v;}) +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -131,7 +131,7 @@ x)) + *gcl-major-version* *gcl-minor-version* *gcl-extra-version* + (if (member :ansi-cl *features*) "ANSI" "CLtL1") + (if (member :gprof *features*) "profiling" "") +- (gcl-compile-time) ++ *gcl-release-date* + "Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)" + "Binary License: " + (if gpled-modules (format nil "GPL due to GPL'ed components: ~a" gpled-modules) +--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp ++++ gcl-2.6.12/lsp/gcl_predlib.lsp +@@ -777,6 +777,7 @@ + (defvar *gcl-extra-version* nil) + (defvar *gcl-minor-version* nil) + (defvar *gcl-major-version* nil) ++(defvar *gcl-release-date* nil) + + (defun warn-version (majvers minvers extvers) + (and *gcl-major-version* *gcl-minor-version* *gcl-extra-version* +--- gcl-2.6.12.orig/makefile ++++ gcl-2.6.12/makefile +@@ -34,9 +34,9 @@ TESTDIR = ansi-tests + + VERSION=`cat majvers`.`cat minvers` + +-all: $(BUILD_BFD) system command cmpnew/gcl_collectfn.o lsp/gcl_info.o do-gcl-tk # do-info ++all: $(BUILD_BFD) system command cmpnew/gcl_collectfn.o lsp/gcl_info.o do-gcl-tk release # do-info + +-ASRC:=$(shell ls -1 o/*.c lsp/*.lsp cmpnew/*.lsp mod/*.lsp pcl/*sp clcs/*sp xgcl-2/*p) #o/*.d o/*.h h/*.h ++ASRC:=$(shell ls -1 o/*.c lsp/*.lsp cmpnew/*.lsp pcl/*sp clcs/*sp xgcl-2/*p) #o/*.d o/*.h h/*.h + TAGS: $(ASRC) + etags --regex='/\#.`(defun[ \n\t]+\([^ \n\t]+\)/' $^ + +@@ -44,6 +44,9 @@ system: $(PORTDIR)/$(FLISP) + # [ "$(X_LIBS)" == "" ] || (cd xgcl-2 && make saved_xgcl LISP=../$< && mv saved_xgcl ../$(PORTDIR)/$(FLISP)) + touch $@ + ++release: majvers minvers ++ date >$@ ++ + xgcl: $(PORTDIR)/saved_xgcl + + $(PORTDIR)/saved_xgcl: $(PORTDIR)/saved_gcl +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -27,6 +27,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + */ + + #include ++#include + #include "include.h" + object siSuniversal_error_handler; + +@@ -36,11 +37,11 @@ void + assert_error(const char *a,unsigned l,const char *f,const char *n) { + + if (!raw_image && core_end && core_end==sbrk(0)) +- FEerror("The assertion ~a on line ~a of ~a in function ~a failed",4, ++ FEerror("The assertion ~a on line ~a of ~a in function ~a failed: ~a",5, + make_simple_string(a),make_fixnum(l), +- make_simple_string(f),make_simple_string(n)); ++ make_simple_string(f),make_simple_string(n),make_simple_string(strerror(errno))); + else { +- emsg("The assertion %s on line %d of %s in function %s failed",a,l,f,n); ++ emsg("The assertion %s on line %d of %s in function %s failed: %s",a,l,f,n,strerror(errno)); + do_gcl_abort(); + } + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -242,7 +242,7 @@ get_gc_environ(void) { + } + + gc_page_min=0.5; +- if ((e=getenv("GCL_GC_PAGE_THRESH"))) { ++ if ((e=getenv("GCL_GC_PAGE_MIN"))) { + massert(sscanf(e,"%lf",&gc_page_min)==1); + massert(gc_page_min>=0.0); + } +@@ -1028,12 +1028,6 @@ DEFUNO_NEW("IDENTITY",object,fLidentity, + RETURN1 (x0); + } + +-DEFUNO_NEW("GCL-COMPILE-TIME",object,fSgcl_compile_time,SI +- ,0,0,NONE,OO,OO,OO,OO,void,Lgcl_compile_time,(void),"") +-{ +- RETURN1 (make_simple_string(__DATE__ " " __TIME__)); +-} +- + DEFUNO_NEW("LDB1",object,fSldb1,SI + ,3,3,NONE,OI,II,OO,OO,void,Lldb1,(fixnum a,fixnum b, fixnum c),"") + { +--- gcl-2.6.12.orig/o/sfasli.c ++++ gcl-2.6.12/o/sfasli.c +@@ -115,10 +115,9 @@ LFD(build_symbol_table)(void) { + int + use_symbols(double d,...) { + ++ double d2; + #ifndef DARWIN +- + extern void sincos(double,double *,double *); +- double d2; + + sincos(d,&d,&d2); + +--- /dev/null ++++ gcl-2.6.12/release +@@ -0,0 +1 @@ ++Fri Apr 22 15:51:11 UTC 2016 +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -72,10 +72,11 @@ $(LSPDIR)/auto_new.lsp: $(LSPDIR)/auto.l + sys_init.lsp: sys_init.lsp.in + + cat $< | sed \ +- -e "s#@LI-VERS@#(`cat ../majvers`.`cat ../minvers`) `date`#1" \ ++ -e "s#@LI-VERS@#(`cat ../majvers`.`cat ../minvers`) `cat ../release`#1" \ + -e "s#@LI-EXTVERS@#`cat ../minvers | cut -f2 -d.`#1" \ + -e "s#@LI-MINVERS@#`cat ../minvers | cut -f1 -d.`#1" \ + -e "s#@LI-MAJVERS@#`cat ../majvers`#1" \ ++ -e "s#@LI-RELEASE@#`cat ../release`#1" \ + -e "s#@LI-CC@#\"$(CC) -c $(FINAL_CFLAGS)\"#1" \ + -e "s#@LI-LD@#\"$(CC) $(LD_FLAGS) -o \"#1" \ + -e "s#@LI-LD-LIBS@#\" $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST)\"#1" \ +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -51,7 +51,8 @@ + + (setq *gcl-extra-version* @LI-EXTVERS@ + *gcl-minor-version* @LI-MINVERS@ +- *gcl-major-version* @LI-MAJVERS@) ++ *gcl-major-version* @LI-MAJVERS@ ++ *gcl-release-date* "@LI-RELEASE@") + + (defvar *system-banner* (default-system-banner)) + (setq *optimize-maximum-pages* t) +@@ -83,3 +84,5 @@ + (let* ((i 4096)(j (si::equal-tail-recursion-check i))) + (unless (<= (ash i -1) j) + (warn "equal is not tail recursive ~s ~s" i j))) ++ ++(format t "~s heap words available~%" (multiple-value-bind (a b c d) (si::heap-report) (/ (- d c) (/ a 8)))) diff --git a/debian/patches/Version_2_6_13pre45 b/debian/patches/Version_2_6_13pre45 new file mode 100644 index 0000000..4adb1a2 --- /dev/null +++ b/debian/patches/Version_2_6_13pre45 @@ -0,0 +1,253 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-34) unstable; urgency=medium + . + * Version_2_6_13pre45 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-09-23 + +--- gcl-2.6.12.orig/h/unrandomize.h ++++ gcl-2.6.12/h/unrandomize.h +@@ -23,7 +23,6 @@ + int i,j,k; + char **n,**a; + void *v; +- argv[0]="/proc/self/exe"; + for (i=j=0;argv[i];i++) + j+=strlen(argv[i])+1; + for (k=0;envp[k];k++) +--- gcl-2.6.12.orig/lsp/gcl_serror.lsp ++++ gcl-2.6.12/lsp/gcl_serror.lsp +@@ -174,7 +174,7 @@ + (format *error-output* "~&If continued: ") + (funcall (restart-report-function correctable) *error-output*)) + (force-output *error-output*) +- (break-level condition))) ++ (when *break-enable* (break-level condition)))) + + + (defun dbl-eval (- &aux (break-command t)) +@@ -186,54 +186,51 @@ + (t (setq break-command nil) (evalhook - nil nil *break-env*)))))) + (cons break-command val-list))) + +-(defun do-break-level (at env p-e-p debug-level break-level &aux (first t)) ++(defun dbl-rpl-loop (p-e-p) + +- (do nil (nil) +- +- (unless +- (with-simple-restart +- (abort "Return to debug level ~D." debug-level) +- (not +- (catch 'step-continue +- (let* ((*break-level* break-level) +- (*break-enable* (unless p-e-p *break-enable*)) +- (*readtable* (or *break-readtable* *readtable*)) +- *break-env* *read-suppress*); *error-stack*) +- +- (setq +++ ++ ++ + + -) +- +- (when first +- (catch-fatal 1) +- (setq *interrupt-enable* t first nil) +- (cond (p-e-p +- (format *debug-io* "~&~A~2%" at) +- (set-current) +- (setq *no-prompt* nil) +- (show-restarts)) +- ((set-back at env)))) +- +- (if *no-prompt* +- (setq *no-prompt* nil) +- (format *debug-io* "~&~a~a>~{~*>~}" +- (if p-e-p "" "dbl:") +- (if (eq *package* (find-package 'user)) "" (package-name *package*)) +- break-level)) +- (force-output *error-output*) +- +- (setq - (dbl-read *debug-io* nil *top-eof*)) +- (when (eq - *top-eof*) (bye -1)) +- (let* ((ev (dbl-eval -)) +- (break-command (car ev)) +- (values (cdr ev))) +- (and break-command (eq (car values) :resume)(return)) +- (setq /// // // / / values *** ** ** * * (car /)) +- (fresh-line *debug-io*) +- (dolist (val /) +- (prin1 val *debug-io*) +- (terpri *debug-io*))) +- nil)))) +- (terpri *debug-io*) +- (break-current)))) ++ (setq +++ ++ ++ + + -) ++ ++ (if *no-prompt* ++ (setq *no-prompt* nil) ++ (format *debug-io* "~&~a~a>~{~*>~}" ++ (if p-e-p "" "dbl:") ++ (if (eq *package* (find-package 'user)) "" (package-name *package*)) ++ *break-level*)) ++ (force-output *error-output*) ++ ++ (setq - (dbl-read *debug-io* nil *top-eof*)) ++ (when (eq - *top-eof*) (bye -1)) ++ (let* ((ev (dbl-eval -)) ++ (break-command (car ev)) ++ (values (cdr ev))) ++ (unless (and break-command (eq (car values) :resume)) ++ (setq /// // // / / values *** ** ** * * (car /)) ++ (fresh-line *debug-io*) ++ (dolist (val /) ++ (prin1 val *debug-io*) ++ (terpri *debug-io*)) ++ (dbl-rpl-loop p-e-p)))) ++ ++(defun do-break-level (at env p-e-p debug-level); break-level ++ ++ (unless ++ (with-simple-restart ++ (abort "Return to debug level ~D." debug-level) ++ ++ (catch-fatal 1) ++ (setq *interrupt-enable* t) ++ (cond (p-e-p ++ (format *debug-io* "~&~A~2%" at) ++ (set-current) ++ (setq *no-prompt* nil) ++ (show-restarts)) ++ ((set-back at env))) ++ ++ (not (catch 'step-continue (dbl-rpl-loop p-e-p)))) ++ ++ (terpri *debug-io*) ++ (break-current) ++ (do-break-level at env p-e-p debug-level))) + + + (defun break-level (at &optional env) +@@ -242,10 +239,10 @@ + (- -) + (* *) (** **) (*** ***) + (/ /) (// //) (/// ///) +- (break-level (if p-e-p (cons t *break-level*) *break-level*)) + (debug-level *debug-level*) + (*quit-tags* (cons (cons *break-level* *quit-tag*) *quit-tags*)) + *quit-tag* ++ (*break-level* (if p-e-p (cons t *break-level*) *break-level*)) + (*ihs-base* (1+ *ihs-top*)) + (*ihs-top* (ihs-top)) + (*frs-base* (or (sch-frs-base *frs-top* *ihs-base*) (1+ (frs-top)))) +@@ -255,9 +252,11 @@ + (*debug-restarts* (compute-restarts)) + (*debug-abort* (find-restart 'abort)) + (*debug-continue* (find-restart 'continue)) +- (*abort-restarts* (remove-if-not (lambda (x) (eq 'abort (restart-name x))) *debug-restarts*))) ++ (*abort-restarts* (remove-if-not (lambda (x) (eq 'abort (restart-name x))) *debug-restarts*)) ++ (*readtable* (or *break-readtable* *readtable*)) ++ *break-env* *read-suppress*) + +- (do-break-level at env p-e-p debug-level break-level))) ++ (do-break-level at env p-e-p debug-level))) + + (putprop 'break-level t 'compiler::cmp-notinline) + +@@ -278,6 +277,6 @@ + (setq message "")))) + (with-simple-restart + (continue "Return from break.") +- (let ((*break-enable* t)) (break-level message))) ++ (break-level message)) + nil) + (putprop 'break t 'compiler::cmp-notinline) +--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp ++++ gcl-2.6.12/lsp/sys-proclaim.lisp +@@ -4,7 +4,7 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) + ANSI-LOOP::LOOP-EMIT-FINAL-VALUE SYSTEM::INSPECT-CHARACTER +- SYSTEM::INSPECT-STRUCTURE SYSTEM::PRINT-IHS ++ SYSTEM::INSPECT-STRUCTURE SYSTEM::PRINT-IHS SYSTEM::DBL-RPL-LOOP + SYSTEM::RESTART-FUNCTION COMMON-LISP::TANH COMMON-LISP::FIFTH + SLOOP::PARSE-LOOP-INITIALLY SYSTEM::NEXT-STACK-FRAME + SYSTEM::IDESCRIBE SYSTEM::PROCESS-ARGS SYSTEM::LEAP-YEAR-P +@@ -268,7 +268,7 @@ + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::T) +- SLOOP::FIRST-USE-SLOOP-FOR SYSTEM::COERCE-TO-CONDITION ++ SLOOP::FIRST-USE-SLOOP-FOR SYSTEM::COERCE-TO-CONDITION SYSTEM::DO-BREAK-LEVEL + SLOOP::FIRST-SLOOP-FOR ANSI-LOOP::LOOP-FOR-ARITHMETIC + SYSTEM::MAYBE-BREAK SYSTEM::SETF-STRUCTURE-ACCESS + SYSTEM::CALL-TEST SYSTEM::FIND-LINE-IN-FUN)) +@@ -334,7 +334,7 @@ + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::MAKE-PREDICATE SYSTEM::DO-BREAK-LEVEL ++ SYSTEM::MAKE-PREDICATE + SYSTEM::MAKE-CONSTRUCTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +@@ -519,4 +519,4 @@ + (COMMON-LISP::FUNCTION + (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM) + COMMON-LISP::FIXNUM) +- SYSTEM::ROUND-UP)) +\ No newline at end of file ++ SYSTEM::ROUND-UP)) +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -464,19 +464,12 @@ DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",o + int + main(int argc, char **argv, char **envp) { + +-#ifdef CAN_UNRANDOMIZE_SBRK +-#include +-#include +-#include "unrandomize.h" +-#endif +- +- gcl_init_alloc(&argv); +- + #ifdef GET_FULL_PATH_SELF + GET_FULL_PATH_SELF(kcl_self); + #else + kcl_self = argv[0]; + #endif ++ + #ifdef __MINGW32__ + { + char *s=kcl_self; +@@ -485,6 +478,14 @@ main(int argc, char **argv, char **envp) + #endif + *argv=kcl_self; + ++#ifdef CAN_UNRANDOMIZE_SBRK ++#include ++#include ++#include "unrandomize.h" ++#endif ++ ++ gcl_init_alloc(&argv); ++ + setbuf(stdin, stdin_buf); + setbuf(stdout, stdout_buf); + #ifdef _WIN32 diff --git a/debian/patches/Version_2_6_13pre46 b/debian/patches/Version_2_6_13pre46 new file mode 100644 index 0000000..9551eed --- /dev/null +++ b/debian/patches/Version_2_6_13pre46 @@ -0,0 +1,237 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-34) unstable; urgency=medium + . + * Version_2_6_13pre45 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-09-30 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -28,7 +28,7 @@ + + + (export '(*compile-print* *compile-verbose*)) +-(import 'si::*tmp-dir* 'compiler) ++(import 'si::(*tmp-dir* *cc* *ld* *objdump*)) + (import 'si::*error-p* 'compiler) + + ;;; This had been true with Linux 1.2.13 a.out or even older +@@ -85,9 +85,8 @@ + (code result) (system (mysub (ts string) "$" "\\$")) + (unless (and (zerop code) (zerop result)) + (cerror "Continues anyway." +- "(SYSTEM ~S) returned a non-zero value ~D." +- string +- result) ++ "(SYSTEM ~S) returned a non-zero value ~D ~D." ++ string code result) + (setq *error-p* t)) + (values result))) + +@@ -428,8 +427,8 @@ Cannot compile ~a.~%" + (si::copy-stream st *standard-output*)) + (with-open-file (st hn) + (si::copy-stream st *standard-output*)) +- (when (zerop (system "which objdump >/dev/null")) +- (safe-system (si::string-concatenate "objdump --source " (namestring on)))) ++ (when (eql (aref *objdump* 0) #\/);program found at startup in path ++ (safe-system (si::string-concatenate *objdump* (namestring on)))) + (mdelete-file cn) + (mdelete-file dn) + (mdelete-file hn) +@@ -470,8 +469,6 @@ Cannot compile ~a.~%" + (terpri *compiler-output2*))))) + + +-(defvar *cc* "cc") +-(defvar *ld* "ld") + (defvar *ld-libs* "ld-libs") + (defvar *opt-three* "") + (defvar *opt-two* "") +@@ -489,7 +486,7 @@ Cannot compile ~a.~%" + (setq na (namestring + (make-pathname :name name :type (pathname-type(first args))))) + #+(or dos winnt) +- (format nil "~a -I~a ~a ~a -c -w ~s -o ~s" ++ (format nil "~a -I~a ~a ~a -c -w ~a -o ~a" + *cc* + (concatenate 'string si::*system-directory* "../h") + (if (and (boundp '*c-debug*) *c-debug*) " -g " "") +@@ -502,7 +499,7 @@ Cannot compile ~a.~%" + ) + + #-(or dos winnt) +- (format nil "~a -I~a ~a ~a -c ~s -o ~s ~a" ++ (format nil "~a -I~a ~a ~a -c ~a -o ~a ~a" + *cc* + (concatenate 'string si::*system-directory* "../h") + (if (and (boundp '*c-debug*) *c-debug*) " -g " "") +--- gcl-2.6.12.orig/h/elf32_mips_reloc_special.h ++++ gcl-2.6.12/h/elf32_mips_reloc_special.h +@@ -147,3 +147,6 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + (*(a_))->address=p->st_value; \ + break; \ + }}}) ++ ++#undef LOAD_SYM_BY_NAME ++#define LOAD_SYM_BY_NAME(sym,st1) (!strncmp(st1+sym->st_name,"__moddi3",8)) +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -361,7 +361,7 @@ extern bool writable_malloc; + #define prof_block(x) x + #endif + +-#define psystem(x) prof_block(system(x)) ++#define psystem(x) prof_block(vsystem(x)) + #define pfork() prof_block(fork()) + + #include "error.h" +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -601,9 +601,21 @@ First directory is checked for first nam + :device (pathname-device x) + :directory (append (pathname-directory x) y))))))))) + ++(defun get-path (s &aux (m (string-match "([^/ ]*)( |$)" s))(b (match-beginning 1))(e (match-end 1)) ++ (r (with-open-file (s (concatenate 'string "|which " (subseq s b e))) (read s nil 'eof)))) ++ (if (eq r 'eof) s (concatenate 'string (string-downcase r) (subseq s e)))) ++ ++ ++(defvar *cc* "cc") ++(defvar *ld* "ld") ++(defvar *objdump* "objdump --source ") ++ + (defun set-up-top-level (&aux (i (argc)) tem) + (declare (fixnum i)) +- (setq *tmp-dir* (get-temp-dir)) ++ (setq *tmp-dir* (get-temp-dir) ++ *cc* (get-path *cc*) ++ *ld* (get-path *ld*) ++ *objdump* (get-path *objdump*)) + (dotimes (j i) (push (argv j) tem)) + (setq *command-args* (nreverse tem)) + (setq tem *lib-directory*) +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -613,7 +613,8 @@ BEGIN: + else + fclose(strm->sm.sm_fp); + strm->sm.sm_fp = NULL; +- if (type_of(strm->sm.sm_object0 ) == t_cons && ++ if (strm->sm.sm_object0 && ++ type_of(strm->sm.sm_object0 ) == t_cons && + Mcar(strm->sm.sm_object0 ) == sSAallow_gzipped_fileA) + fLdelete_file(Mcdr(strm->sm.sm_object0)); + break; +--- gcl-2.6.12.orig/o/run_process.c ++++ gcl-2.6.12/o/run_process.c +@@ -502,6 +502,7 @@ make_socket_pair() + stream_in->sm.sm_buffer = 0; + stream_in->sm.sm_int0 = sockets_in[1]; + stream_in->sm.sm_int1 = 0; ++ stream_in->sm.sm_object0=stream_in->sm.sm_object1=OBJNULL; + stream_out = (object) alloc_object(t_stream); + stream_out->sm.sm_mode = smm_output; + stream_out->sm.sm_fp = fp2; +@@ -510,6 +511,7 @@ make_socket_pair() + setup_stream_buffer(stream_out); + stream_out->sm.sm_int0 = sockets_out[1]; + stream_out->sm.sm_int1 = 0; ++ stream_out->sm.sm_object0=stream_out->sm.sm_object1=OBJNULL; + stream = make_two_way_stream(stream_in, stream_out); + return(stream); + } +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -54,9 +54,10 @@ License for more details. + + #define ulmax(a_,b_) ({ul _a=a_,_b=b_;_a<_b ? _b : _a;}) + #define ALLOC_SEC(sec) (sec->sh_flags&SHF_ALLOC && (sec->sh_type==SHT_PROGBITS || sec->sh_type==SHT_NOBITS)) +-#define LOAD_SEC(sec) (sec->sh_flags&SHF_ALLOC && sec->sh_type==SHT_PROGBITS) +-#define LOAD_SYM(sym) ({ul _b=ELF_ST_BIND(sym->st_info),_t=ELF_ST_TYPE(sym->st_info); \ +- sym->st_value && (_b==STB_GLOBAL || _b==STB_WEAK || (_t>=STT_LOPROC && _t<=STT_HIPROC));}) ++#define LOAD_SEC(sec) (sec->sh_flags&SHF_ALLOC && sec->sh_type==SHT_PROGBITS) ++#define LOAD_SYM_BY_BIND(sym) ({ul _b=ELF_ST_BIND(sym->st_info); sym->st_value && (_b==STB_GLOBAL || _b==STB_WEAK);}) ++#define LOAD_SYM_BY_NAME(sym,st1) 0 ++#define LOAD_SYM(sym,st1) (LOAD_SYM_BY_BIND(sym)||LOAD_SYM_BY_NAME(sym,st1)) + + #define MASK(n) (~(~0ULL << (n))) + +@@ -410,7 +411,7 @@ calc_space(ul *ns,ul *sl,Sym *sym1,Sym * + + for (sym=sym1;sym + #include + #include +- ++#include + + #include "include.h" + ++int ++vsystem(const char *command) { ++ ++ unsigned j,n=strlen(command); ++ char *z=alloca(n+1),**p1,**pp,*c; ++ int s; ++ pid_t pid; ++ ++ memcpy(z,command,n+1); ++ for (j=0,c=z;strtok(c," \n\t");c=NULL,j++); ++ ++ memcpy(z,command,n+1); ++ p1=alloca((j+1)*sizeof(*p1)); ++ for (pp=p1,c=z;(*pp=strtok(c," \n\t"));c=NULL,pp++); ++ ++ if (!(pid=vfork())) { ++ execvp(*p1,p1); ++ _exit(2); ++ } ++ ++ massert(pid>0); ++ massert(pid==waitpid(pid,&s,0)); ++ ++ return s; ++ ++} ++ ++ + #ifdef ATT3B2 + #include + int diff --git a/debian/patches/Version_2_6_13pre47 b/debian/patches/Version_2_6_13pre47 new file mode 100644 index 0000000..ba92ac2 --- /dev/null +++ b/debian/patches/Version_2_6_13pre47 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-35) unstable; urgency=medium + . + * Version_2_6_13pre46 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-09-30 + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -229,7 +229,7 @@ get_gc_environ(void) { + + const char *e; + +- mem_multiple=0.85; ++ mem_multiple=1.0; + if ((e=getenv("GCL_MEM_MULTIPLE"))) { + massert(sscanf(e,"%lf",&mem_multiple)==1); + massert(mem_multiple>=0.0); diff --git a/debian/patches/Version_2_6_13pre48 b/debian/patches/Version_2_6_13pre48 new file mode 100644 index 0000000..e3a0761 --- /dev/null +++ b/debian/patches/Version_2_6_13pre48 @@ -0,0 +1,59 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-35) unstable; urgency=medium + . + * Version_2_6_13pre47 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-01 + +--- gcl-2.6.12.orig/h/elf32_hppa_reloc_special.h ++++ gcl-2.6.12/h/elf32_hppa_reloc_special.h +@@ -39,3 +39,6 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + return 0; + + } ++ ++#undef LOAD_SYM_BY_NAME ++#define LOAD_SYM_BY_NAME(sym,st1) (!strncmp(st1+sym->st_name,"$$dyncall",8)) +--- gcl-2.6.12.orig/o/unixsys.c ++++ gcl-2.6.12/o/unixsys.c +@@ -31,16 +31,16 @@ Foundation, 675 Mass Ave, Cambridge, MA + int + vsystem(const char *command) { + +- unsigned j,n=strlen(command); +- char *z=alloca(n+1),**p1,**pp,*c; ++ unsigned j,n=strlen(command)+1; ++ char *z=alloca(n),**p1,**pp,*c; + int s; + pid_t pid; + +- memcpy(z,command,n+1); +- for (j=0,c=z;strtok(c," \n\t");c=NULL,j++); ++ memcpy(z,command,n); ++ for (j=1,c=z;strtok(c," \n\t");c=NULL,j++); + +- memcpy(z,command,n+1); +- p1=alloca((j+1)*sizeof(*p1)); ++ memcpy(z,command,n); ++ p1=alloca(j*sizeof(*p1)); + for (pp=p1,c=z;(*pp=strtok(c," \n\t"));c=NULL,pp++); + + if (!(pid=vfork())) { diff --git a/debian/patches/Version_2_6_13pre49 b/debian/patches/Version_2_6_13pre49 new file mode 100644 index 0000000..7411707 --- /dev/null +++ b/debian/patches/Version_2_6_13pre49 @@ -0,0 +1,33 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-36) unstable; urgency=medium + . + * Version_2_6_13pre48 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-03 + +--- gcl-2.6.12.orig/h/elf32_hppa_reloc_special.h ++++ gcl-2.6.12/h/elf32_hppa_reloc_special.h +@@ -41,4 +41,4 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + } + + #undef LOAD_SYM_BY_NAME +-#define LOAD_SYM_BY_NAME(sym,st1) (!strncmp(st1+sym->st_name,"$$dyncall",8)) ++#define LOAD_SYM_BY_NAME(sym,st1) (!strncmp(st1+sym->st_name,"$$",2)) diff --git a/debian/patches/Version_2_6_13pre5 b/debian/patches/Version_2_6_13pre5 new file mode 100644 index 0000000..b164348 --- /dev/null +++ b/debian/patches/Version_2_6_13pre5 @@ -0,0 +1,83 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-5) unstable; urgency=medium + . + * Version_2_6_13pre4 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/page.h ++++ gcl-2.6.12/h/page.h +@@ -85,10 +85,8 @@ extern int sgc_enabled; + + extern long resv_pages; + extern int reserve_pages_for_signal_handler; +-/* #define CONT_MARK_PAGE (((page(heap_end)-first_data_page)*(PAGESIZE/(CPTR_SIZE*CHAR_SIZE))+PAGESIZE-1)/PAGESIZE) */ +-/* #define available_pages ((fixnum)(real_maxpage-page(heap_end)-2*nrbpage-CONT_MARK_PAGE-resv_pages)) */ + +-extern struct pageinfo *cell_list_head,*cell_list_tail/* ,*contblock_list_head,*contblock_list_tail */; ++extern struct pageinfo *cell_list_head,*cell_list_tail; + extern object contblock_array; + + #define PAGE_MAGIC 0x2e +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -506,31 +506,25 @@ rebalance_maxpages(struct typemanager *m + + if (j+d>phys_pages) { + +- ufixnum k=0; ++ ufixnum k,e=j+d-phys_pages; ++ double f; + +- for (i=t_start;ik+phys_pages-j ? k+phys_pages-j : d; +- if (d<=0) ++ e=e>k ? k : e; ++ if (e+phys_pages-j<=0) + return 0; + ++ f=1.0-(double)e/k; ++ + for (i=t_start;i((double)phys_pages/(j+d))*(tm_table+i==my_tm ? z : tm_table[i].tm_maxpage)) */ +- /* return 0; */ +- /* for (i=t_start;itm_maxpage+(phys_pages-sum_maxpages()))/(my_tm->tm_type==t_relocatable ? 2 : 1))); + + return 1; + diff --git a/debian/patches/Version_2_6_13pre50 b/debian/patches/Version_2_6_13pre50 new file mode 100644 index 0000000..e17b627 --- /dev/null +++ b/debian/patches/Version_2_6_13pre50 @@ -0,0 +1,223 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-37) unstable; urgency=medium + . + * Version_2_6_13pre49 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-04 + +--- gcl-2.6.12.orig/o/array.c ++++ gcl-2.6.12/o/array.c +@@ -850,31 +850,33 @@ raw_aet_ptr(object x, short int typ) + */ + + void +-gset(void *p1, void *val, int n, int typ) +-{ if (val==0) ++gset(void *p1, void *val, int n, int typ) { ++ ++ if (val==0) + val = aet_types[typ].dflt; +- switch (typ){ ++ ++ switch (typ){ + + #define GSET(p,n,typ,val) {typ x = *((typ *) val); GSET1(p,n,typ,x)} +-#define GSET1(p,n,typ,val) while (n-- > 0) \ ++#define GSET1(p,n,typ,val) while (n-- > 0) \ + { *((typ *) p) = val; \ +- p = p + sizeof(typ); \ +- } break; ++ p = p + sizeof(typ); \ ++ } break; + +- case aet_object: GSET(p1,n,object,val); +- case aet_ch: GSET(p1,n,char,val); +- /* Note n is number of fixnum WORDS for bit */ +- case aet_bit: GSET(p1,n,fixnum,val); +- case aet_fix: GSET(p1,n,fixnum,val); +- case aet_sf: GSET(p1,n,shortfloat,val); +- case aet_lf: GSET(p1,n,longfloat,val); +- case aet_char: GSET(p1,n,char,val); +- case aet_uchar: GSET(p1,n,unsigned char,val); +- case aet_short: GSET(p1,n,short,val); +- case aet_ushort: GSET(p1,n,unsigned short,val); +- default: FEerror("bad elttype",0); +- } ++ case aet_object: GSET(p1,n,object,val); ++ case aet_ch: GSET(p1,n,char,val); ++ /* Note n is number of fixnum WORDS for bit */ ++ case aet_bit: GSET(p1,n,fixnum,val); ++ case aet_fix: GSET(p1,n,fixnum,val); ++ case aet_sf: GSET(p1,n,shortfloat,val); ++ case aet_lf: GSET(p1,n,longfloat,val); ++ case aet_char: GSET(p1,n,char,val); ++ case aet_uchar: GSET(p1,n,unsigned char,val); ++ case aet_short: GSET(p1,n,short,val); ++ case aet_ushort: GSET(p1,n,unsigned short,val); ++ default: FEerror("bad elttype",0); + } ++} + + + #define W_SIZE (BV_BITS*sizeof(fixnum)) +@@ -894,38 +896,43 @@ implementation dependent results.") + int n1=fix(n1o),nc; + if (VFUN_NARGS==4) + { n1 = x->v.v_dim - i1;} +- if (typ1==aet_bit) +- {if (i1 % CHAR_SIZE) +- badcopy: +- FEerror("Bit copies only if aligned",0); +- else +- {int rest=n1%CHAR_SIZE; +- if (rest!=0 ) +- {if (typ2!=aet_bit) +- goto badcopy; +- {while(rest> 0) +- { fSaset1(y,i2+n1-rest,(fLrow_major_aref(x,i1+n1-rest))); +- rest--;} +- }} +- i1=i1/CHAR_SIZE ; +- n1=n1/CHAR_SIZE; +- typ1=aet_char; +- }}; +- if (typ2==aet_bit) +- {if (i2 % CHAR_SIZE) +- goto badcopy; +- i2=i2/CHAR_SIZE ;} +- if ((typ1 ==aet_object || +- typ2 ==aet_object) && typ1 != typ2) ++ if (typ1==aet_bit) { ++ if (i1 % CHAR_SIZE) ++ badcopy: ++ FEerror("Bit copies only if aligned",0); ++ else { ++ int rest=n1%CHAR_SIZE; ++ if (rest!=0) { ++ if (typ2!=aet_bit) ++ goto badcopy; ++ while(rest> 0) { ++ fSaset1(y,i2+n1-rest,(fLrow_major_aref(x,i1+n1-rest))); ++ rest--; ++ } ++ } ++ i1=i1/CHAR_SIZE ; ++ n1=n1/CHAR_SIZE; ++ typ1=aet_char; ++ } ++ } ++ ++ if (typ2==aet_bit) { ++ if (i2 % CHAR_SIZE) ++ goto badcopy; ++ i2=i2/CHAR_SIZE ; ++ } ++ ++ if ((typ1 ==aet_object || typ2 ==aet_object) && typ1 != typ2) + FEerror("Can't copy between different array types",0); + nc=n1 * aet_sizes[(int)typ1]; +- if (i1+n1 > x->a.a_dim +- || ((y->a.a_dim - i2) *aet_sizes[(int)typ2]) < nc) ++ if (i1+n1 > x->a.a_dim || ((y->a.a_dim - i2) *aet_sizes[(int)typ2]) < nc) + FEerror("Copy out of bounds",0); + bcopy(x->ust.ust_self + (i1*aet_sizes[(int)typ1]), + y->ust.ust_self + (i2*aet_sizes[(int)typ2]), + nc); ++ + return x; ++ + } + + /* X is the header of an array. This supplies the body which +--- gcl-2.6.12.orig/o/predicate.c ++++ gcl-2.6.12/o/predicate.c +@@ -744,14 +744,13 @@ BEGIN: + if (tx == t_complex) + return(contains_sharp_comma(x->cmp.cmp_real) || + contains_sharp_comma(x->cmp.cmp_imag)); +- if (tx == t_vector) +- { +- int i; +- if (x->v.v_elttype == aet_object) +- for (i = 0; i < x->v.v_fillp; i++) +- if (contains_sharp_comma(x->v.v_self[i])) +- return(TRUE); +- return(FALSE); ++ if (tx == t_vector) { ++ int i; ++ if (x->v.v_elttype == aet_object) ++ for (i = 0; i < x->v.v_fillp; i++) ++ if (contains_sharp_comma(x->v.v_self[i])) ++ return(TRUE); ++ return(FALSE); + } + if (tx == t_cons) { + if (x->c.c_car == siSsharp_comma) +--- gcl-2.6.12.orig/o/unixsys.c ++++ gcl-2.6.12/o/unixsys.c +@@ -32,25 +32,39 @@ int + vsystem(const char *command) { + + unsigned j,n=strlen(command)+1; +- char *z=alloca(n),**p1,**pp,*c; ++ char *z,*c; ++ const char *x1[]={"/bin/sh","-c",NULL,NULL},*spc=" \n\t",**p1,**pp; + int s; + pid_t pid; + +- memcpy(z,command,n); +- for (j=1,c=z;strtok(c," \n\t");c=NULL,j++); ++ if (strpbrk(command,"\"'$<>")) + +- memcpy(z,command,n); +- p1=alloca(j*sizeof(*p1)); +- for (pp=p1,c=z;(*pp=strtok(c," \n\t"));c=NULL,pp++); ++ (p1=x1)[2]=command; ++ ++ else { ++ ++ z=alloca(n); ++ memcpy(z,command,n); ++ for (j=1,c=z;strtok(c,spc);c=NULL,j++); ++ ++ memcpy(z,command,n); ++ p1=alloca(j*sizeof(*p1)); ++ for (pp=p1,c=z;(*pp=strtok(c,spc));c=NULL,pp++); ++ ++ } + + if (!(pid=vfork())) { +- execvp(*p1,p1); +- _exit(2); ++ errno=0; ++ execvp(*p1,(void *)p1); ++ _exit(128|(errno&0x7f)); + } + + massert(pid>0); + massert(pid==waitpid(pid,&s,0)); + ++ if ((s>>8)&128) ++ emsg("execvp failure when executing '%s': %s\n",command,strerror((s>>8)&0x7f)); ++ + return s; + + } diff --git a/debian/patches/Version_2_6_13pre52 b/debian/patches/Version_2_6_13pre52 new file mode 100644 index 0000000..ea69e84 --- /dev/null +++ b/debian/patches/Version_2_6_13pre52 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-65) unstable; urgency=medium + . + * list_order.25 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-02-22 + +--- gcl-2.6.12.orig/makefile ++++ gcl-2.6.12/makefile +@@ -149,7 +149,7 @@ command: + merge: + $(CC) -o merge merge.c + +-LISP_LIB=cmpnew/gcl_collectfn.o cmpnew/gcl_collectfn.lsp xgcl-2/sysdef.lisp xgcl-2/gcl_dwtest.lsp xgcl-2/gcl_dwtestcases.lsp lsp/gcl_gprof.lsp lsp/gcl_info.o lsp/gcl_profile.lsp lsp/gcl_export.lsp lsp/gcl_autoload.lsp cmpnew/gcl_cmpmain.lsp cmpnew/gcl_cmpopt.lsp cmpnew/gcl_lfun_list.lsp lsp/gcl_auto_new.lsp h/cmpinclude.h unixport/sys_init.lsp unixport/lib$(SYSTEM).a unixport/libgclp.a gcl-tk/tk-package.lsp $(TK_LISP_LIB) $(RL_LIB) $(FIRST_FILE) $(LAST_FILE) $(addsuffix /sys-proclaim.lisp,lsp cmpnew pcl clcs) unixport/gcl.script ++LISP_LIB=cmpnew/gcl_collectfn.o cmpnew/gcl_collectfn.lsp xgcl-2/package.lisp pcl/package.lisp clcs/package.lisp xgcl-2/sysdef.lisp xgcl-2/gcl_dwtest.lsp xgcl-2/gcl_dwtestcases.lsp lsp/gcl_gprof.lsp lsp/gcl_info.o lsp/gcl_profile.lsp lsp/gcl_export.lsp lsp/gcl_autoload.lsp cmpnew/gcl_cmpmain.lsp cmpnew/gcl_cmpopt.lsp cmpnew/gcl_lfun_list.lsp lsp/gcl_auto_new.lsp h/cmpinclude.h unixport/sys_init.lsp unixport/lib$(SYSTEM).a unixport/libgclp.a gcl-tk/tk-package.lsp $(TK_LISP_LIB) $(RL_LIB) $(FIRST_FILE) $(LAST_FILE) $(addsuffix /sys-proclaim.lisp,lsp cmpnew xgcl-2 pcl clcs) unixport/gcl.script + + install-command: + rm -f $(DESTDIR)$(prefix)/bin/gcl diff --git a/debian/patches/Version_2_6_13pre54 b/debian/patches/Version_2_6_13pre54 new file mode 100644 index 0000000..d5d69f7 --- /dev/null +++ b/debian/patches/Version_2_6_13pre54 @@ -0,0 +1,2878 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-65) unstable; urgency=medium + . + * Version_2_6_13pre52 + * Bug fix: "FTBFS on hurd-i386", thanks to svante.signell@gmail.com; + (Closes: #802593). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/802593 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-02 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpenv.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpenv.lsp +@@ -49,7 +49,6 @@ + (setq *reservations* nil) + (setq *closures* nil) + (setq *top-level-forms* nil) +- (setq *non-package-operation* nil) + (setq *function-declarations* nil) + (setq *inline-functions* nil) + (setq *inline-blocks* 0) +@@ -71,12 +70,10 @@ + (defun add-symbol (symbol) (add-object symbol)) + + (defun add-object2 (object) +- (let* ((init (when (si::contains-sharp-comma object) +- (if (when (consp object) (eq (car object) 'si::|#,|)) +- (cdr object) (si::string-to-object (wt-to-string object))))) ++ (let* ((init (if (when (consp object) (eq (car object) '|#,|)) (cdr object) `',object)) + (object (if (when (consp init) (eq (car init) 'si::nani)) (si::nani (cadr init)) object))) + (cond ((gethash object *objects*)) +- ((push-data-incf (unless init object)) ++ ((push-data-incf nil) + (when init (add-init `(si::setvv ,*next-vv* ,init))) + (setf (gethash object *objects*) *next-vv*))))) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -180,7 +180,7 @@ + (*compile-print* (or print *compile-print*)) + (*package* *package*) + (*DEFAULT-PATHNAME-DEFAULTS* #p"") +- (*data* (list (make-array 50 :fill-pointer 0 :adjustable t) nil nil)) ++ (*data* (list nil)) + *init-name* + (*fasd-data* *fasd-data*) + (*error-count* 0)) +@@ -281,10 +281,8 @@ Cannot compile ~a.~%" + (if (consp *split-files*) + (dolist (v (fourth *split-files*)) (t1expr v))) + (unwind-protect +- (do ((form (read *compiler-input* nil eof) +- (read *compiler-input* nil eof)) +- (load-flag (or (eq :defaults *eval-when-defaults*) +- (member 'load *eval-when-defaults*)))) ++ (do ((form (read *compiler-input* nil eof)(read *compiler-input* nil eof)) ++ (load-flag (if *eval-when-defaults* (member 'load *eval-when-defaults*) t))) + (nil) + (cond + ((eq form eof)) +@@ -292,7 +290,7 @@ Cannot compile ~a.~%" + ((maybe-eval nil form))) + (cond + ((and *split-files* (check-end form eof)) +- (setf (fourth *split-files*) (reverse (third *data*))) ++ (setf (fourth *split-files*) nil);(reverse (third *data*)) ;FIXME check this + (return nil)) + ((eq form eof) (return nil)))) + +--- gcl-2.6.12.orig/cmpnew/gcl_cmptop.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptop.lsp +@@ -72,7 +72,6 @@ + + + (defvar *top-level-forms* nil) +-(defvar *non-package-operation* nil) + + ;;; *top-level-forms* holds ( { top-level-form }* ). + ;;; +@@ -99,18 +98,7 @@ + + ;;; Package operations. + +-(si:putprop 'make-package t 'package-operation) +-(si:putprop 'in-package t 'package-operation) +-(si:putprop 'shadow t 'package-operation) +-(si:putprop 'shadowing-import t 'package-operation) +-(si:putprop 'export t 'package-operation) +-(si:putprop 'unexport t 'package-operation) +-(si:putprop 'use-package t 'package-operation) +-(si:putprop 'unuse-package t 'package-operation) +-(si:putprop 'import t 'package-operation) +-(si:putprop 'provide t 'package-operation) +-(si:putprop 'require t 'package-operation) +-(si:putprop 'defpackage:defpackage t 'package-operation) ++(si:putprop 'in-package t 'eval-at-compile) + + ;;; Pass 1 top-levels. + +@@ -135,6 +123,7 @@ + ;;; Pass 2 initializers. + + (si:putprop 'defun 't2defun 't2) ++(si:putprop 'progn 't2progn 't2) + (si:putprop 'declare 't2declare 't2) + (si:putprop 'defentry 't2defentry 't2) + (si:putprop 'si:putprop 't2putprop 't2) +@@ -142,6 +131,7 @@ + ;;; Pass 2 C function generators. + + (si:putprop 'defun 't3defun 't3) ++(si:putprop 'progn 't3progn 't3) + (si:putprop 'ordinary 't3ordinary 't3) + (si:putprop 'sharp-comma 't3sharp-comma 't3) + (si:putprop 'clines 't3clines 't3) +@@ -242,15 +232,6 @@ + ((symbolp fun) + (cond ((eq fun 'si:|#,|) + (cmperr "Sharp-comma-macro is in a bad place.")) +- ((get fun 'package-operation) +- (when *non-package-operation* +- (cmpwarn "The package operation ~s was in a bad place." +- form)) +- (let ((res (if (setq fd (macro-function fun)) +- (cmp-expand-macro fd fun (copy-list (cdr form))) +- form))) +- (maybe-eval t res) +- (wt-data-package-operation res))) + ((setq fd (get fun 't1)) + (when *compile-print* (print-current-form)) + (funcall fd args)) +@@ -278,11 +259,24 @@ + (defvar *vaddress-list*) ;; hold addresses of C functions, and other data + (defvar *vind*) ;; index in the VV array where the address is. + (defvar *Inits*) ++ ++(defun t23expr (form prop &aux (def (when (consp form) (get (car form) prop))) ++ *local-funs* (*first-error* t) *vcs-used*) ++ (when def ++ (apply def (cdr form))) ++ (when (eq prop 't3) ++ ;;; Local function and closure function definitions. ++ (block ++ nil ++ (loop ++ (when (endp *local-funs*) (return)) ++ (let (*vcs-used*) ++ (apply 't3local-fun (pop *local-funs*))))))) ++ + (defun ctop-write (name &aux +- def +- (*function-links* nil) *c-vars* (*volatile* " VOL ") +- *vaddress-list* (*vind* 0) *inits* +- *current-form* *vcs-used*) ++ (*function-links* nil) *c-vars* (*volatile* " VOL ") ++ *vaddress-list* (*vind* 0) *inits* ++ *current-form* *vcs-used*) + (declare (special *current-form* *vcs-used*)) + + (setq *top-level-forms* (nreverse *top-level-forms*)) +@@ -295,32 +289,19 @@ + + + ;; write all the inits. +- (dolist* (*current-form* *top-level-forms*) +- (setq *first-error* t) +- (setq *vcs-used* nil) +- (when (setq def (get (car *current-form*) 't2)) +- (apply def (cdr *current-form*)))) +- ++ (dolist (*current-form* *top-level-forms*) ++ (t23expr *current-form* 't2)) + + ;;; C function definitions. +- (dolist* (*current-form* *top-level-forms*) +- (setq *first-error* t) +- (setq *vcs-used* nil) +- (when (setq def (get (car *current-form*) 't3)) +- (apply def (cdr *current-form*)))) +- +- ;;; Local function and closure function definitions. +- (let (lf) +- (block local-fun-process +- (loop +- (when (endp *local-funs*) (return-from local-fun-process)) +- (setq lf (car *local-funs*)) +- (pop *local-funs*) +- (setq *vcs-used* nil) +- (apply 't3local-fun lf)))) ++ (dolist (*current-form* *top-level-forms*) ++ (let* ((inits (data-inits))) ++ (t23expr *current-form* 't3) ++ (unless (or (eq (data-inits) inits) (eq (cdr (data-inits)) inits)) ++ (let ((di (data-inits))) ++ (setf (data-inits) inits) ++ (add-init (cons 'progn (nreverse (mapcar 'cdr (ldiff di inits))))))))) + + ;;; Global entries for directly called functions. +- + (dolist* (x *global-entries*) + (setq *vcs-used* nil) + (apply 'wt-global-entry x)) +@@ -400,31 +381,27 @@ + ;; as I can make it. Valid values of *eval-when-defaults* are + ;; a sublist of '(compile eval load) + +-(defvar *eval-when-defaults* :defaults) +- +-(defun maybe-eval (default-action form) +- (or default-action (and (symbolp (car form)) +- (setq default-action (get (car form) 'eval-at-compile)))) +- (cond ((or (and default-action (eq :defaults *eval-when-defaults*)) +- (and (consp *eval-when-defaults*)(member 'compile *eval-when-defaults* ))) +- (if form (cmp-eval form)) +- t))) ++(defvar *eval-when-defaults* nil);:defaults + ++(defun maybe-eval (def form) ++ (when (or def ++ (intersection '(compile :compile-toplevel) *eval-when-defaults*) ++ (let ((c (car form))) (when (symbolp c) (get c 'eval-at-compile)))) ++ (when form ++ (cmp-eval form)) ++ t)) + + (defun t1eval-when (args &aux load-flag compile-flag) + (when (endp args) (too-few-args 'eval-when 1 0)) +- (dolist** (situation (car args)) ++ (dolist (situation (car args)) + (case situation + ((load :load-toplevel) (setq load-flag t)) + ((compile :compile-toplevel) (setq compile-flag t)) + ((eval :execute)) +- (otherwise (cmperr "The EVAL-WHEN situation ~s is illegal." +- situation)))) +- (let ((*eval-when-defaults* (car args))) +- (cond (load-flag +- (t1progn (cdr args))) +- (compile-flag +- (cmp-eval (cons 'progn (cdr args))))))) ++ (otherwise (cmperr "The EVAL-WHEN situation ~s is illegal." situation)))) ++ (let ((*eval-when-defaults* (or *eval-when-defaults* (car args)))) ++ (cond (load-flag (t1progn (cdr args))) ++ (compile-flag (cmp-eval (cons 'progn (cdr args))))))) + + (defun t1macrolet(args &aux (*funs* *funs*)) + (dolist (def (car args)) +@@ -441,7 +418,17 @@ + (let ((*compile-ordinaries* t)) + (t1progn (cdr args)))) + (t +- (dolist** (form args) (t1expr form))))) ++ (let ((f *top-level-forms*)) ++ (dolist (form args) (t1expr form)) ++ (setq *top-level-forms* (cons `(progn ,(nreverse (ldiff *top-level-forms* f))) f)))))) ++ ++(defun t3progn (args) ++ (dolist (arg args) ++ (t23expr arg 't3))) ++ ++(defun t2progn (args) ++ (dolist (arg args) ++ (t23expr arg 't2))) + + ;; (defun foo (x) .. -> (defun foo (g102 &aux (x g102)) ... + (defun cmpfix-args (args bind &aux tem (lam (copy-list (second args)))) +@@ -464,7 +451,6 @@ + (unless (macro-function (car args)) (maybe-eval nil (cons 'defun args))) + (tagbody + top +- (setq *non-package-operation* t) + (setq *local-functions* nil) + (let ((*vars* nil) (*funs* nil) (*blocks* nil) (*tags* nil) lambda-expr + (*special-binding* nil) +@@ -681,8 +667,8 @@ + (push (list a) *vaddress-list*) + (prog1 *vind* (incf *vind*))) + +-(defun t2defun (fname cfun lambda-expr doc sp) +- (declare (ignore cfun lambda-expr doc sp)) ++(defun t2defun (fname cfun lambda-expr doc sp &optional macro-p) ++ (declare (ignore cfun lambda-expr doc sp macro-p)) + (cond ((get fname 'no-global-entry)(return-from t2defun nil))) + (cond ((< *space* 2) + (setf (get fname 'debug-prop) t) +@@ -716,8 +702,7 @@ + (t (wt-h cfun "();") + (add-init `(si::mf ',fname ,(add-address (c-function-name "" cfun fname))))))) + +-(defun t3defun (fname cfun lambda-expr doc sp &aux inline-info +- (macro-p (equal `(mflag ,fname) (cadr (member *current-form* *top-level-forms*)))) ++(defun t3defun (fname cfun lambda-expr doc sp &optional macro-p &aux inline-info + (*current-form* (list 'defun fname)) + (*volatile* (volatile (second lambda-expr))) + *downward-closures*) +@@ -1333,47 +1318,29 @@ + (maybe-eval (not (macro-function n)) (cons 'defmacro w));FIXME? + (t1expr `(defun ,n ,@(if macp args (cddr (caddr (si::defmacro* n (pop args) args)))))) + (setf (symbol-plist n) l) +- (push `(mflag ,n) *top-level-forms*)) ++ (nconc (car *top-level-forms*) '(t))) ++ ++(defvar *compiling-ordinary* nil) + +-(defun t1ordinary (form &aux tem ) +- (setq *non-package-operation* t) +- ;; check for top level functions +- (cond ((or *compile-ordinaries* (when (listp form) (member (car form) '(let let* flet labels)))) ++(defun compile-ordinary-p (form) ++ (when (consp form) ++ (or (member (car form) '(lambda defun defmacro flet labels)) ++ (compile-ordinary-p (car form)) ++ (compile-ordinary-p (cdr form))))) ++ ++(defun t1ordinary (form) ++ (cond ((unless *compiling-ordinary* ++ (or *compile-ordinaries* (compile-ordinary-p form))) + (maybe-eval nil form) +- (let ((gen (gensym "progn 'compile"))) ++ (let ((gen (gensym))(*compiling-ordinary* t)) + (proclaim `(function ,gen nil t)) +- (t1expr `(defun ,gen (), form nil)) +- (push (list 'ordinary `(,gen) ) *top-level-forms*))) +- ;;Hack to things like (setq bil #'(lambda () ...)) or (foo nil #'(lambda () ..)) +- ;; but not (let ((x ..)) (setq bil #'(lambda () ..))) +- ;; for the latter you must use (progn 'compile ...) +- ((and (consp form) +- (symbolp (car form)) +- (or (eq (car form) 'setq) +- (not (special-operator-p (car form)))) +- (do ((v (cdr form) (and (consp v) (cdr v))) +- (i 1 (the fixnum (+ 1 i)))) +- ((or (>= i 1000) +- (not (consp v))) nil) +- (declare (fixnum i)) +- (cond ((and (consp (car v)) +- (eq (caar v) 'function) +- (consp (setq tem (second (car v)))) +- (eq (car tem) 'lambda)) +- (let ((gen (gensym))) +- (t1expr `(defun ,gen ,@ (cdr tem))) +- (return-from t1ordinary +- (t1ordinary (append +- (subseq form 0 i) +- `((symbol-function ', gen)) +- (nthcdr (+ 1 i) form)))))))))) ++ (t1expr `(progn (defun ,gen nil ,form nil) (,gen))))) + (t + (maybe-eval nil form) + (let ((*vars* nil) (*funs* nil) (*blocks* nil) (*tags* nil) + (*sharp-commas* nil)) + (push (list 'ordinary form) *top-level-forms*) +- nil +- )))) ++ nil)))) + + (defun t3ordinary (form) + (cond ((atom form)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmputil.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmputil.lsp +@@ -217,7 +217,7 @@ + (dolist (v '(si::cdefn lfun inline-safe inline-unsafe + inline-always c1conditional c2 c1 c1+ co1 + si::structure-access co1special +- top-level-macro t3 t2 t1 package-operation)) ++ top-level-macro t3 t2 t1)) + (si::putprop v t 'compiler-prop )) + + (defun compiler-def-hook (symbol code) symbol code nil) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpwt.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpwt.lsp +@@ -25,9 +25,7 @@ + (require 'FASDMACROS "../cmpnew/gcl_fasdmacros.lsp") + + +-(defmacro data-vector () `(car *data*)) +-(defmacro data-inits () `(second *data*)) +-(defmacro data-package-ops () `(third *data*)) ++(defmacro data-inits () `(first *data*)) + + ) + +@@ -69,7 +67,7 @@ + (defvar *fasd-data*) + + (defvar *hash-eq* nil) +-(defvar *run-hash-equal-data-checking* nil) ++(defvar *run-hash-equal-data-checking* t) + (defun memoized-hash-equal (x depth);FIXME implement all this in lisp + (declare (fixnum depth)) + (when *run-hash-equal-data-checking* +@@ -85,7 +83,6 @@ + (si::hash-equal x depth))))))) + + (defun push-data-incf (x) +- (vector-push-extend (cons (memoized-hash-equal x -1000) x) (data-vector)) + (incf *next-vv*)) + + (defun wt-data1 (expr) +@@ -105,58 +102,36 @@ + (terpri *compiler-output-data*) + (prin1 expr *compiler-output-data*))) + +-(defun verify-data-vector(vec &aux v) +- (dotimes (i (length vec)) +- (setq v (aref vec i)) +- (let ((has (memoized-hash-equal (cdr v) -1000))) +- (cond ((not (eql (car v) has)) +- (cmpwarn "A form or constant:~% ~s ~%has changed during the eval compile procedure!.~% The changed form will be the one put in the compiled file" (cdr v))))) +- (setf (aref vec i) (cdr v))) +- vec +- ) ++(defun add-init (x &optional endp &aux (tem (cons (memoized-hash-equal x -1000) x))) ++ (if endp ++ (nconc (data-inits) (list tem)) ++ (push tem (data-inits))) ++ x) ++ ++(defun verify-datum (v) ++ (unless (eql (pop v) (memoized-hash-equal v -1000)) ++ (cmpwarn "A form or constant:~% ~s ~%has changed during the eval compile procedure!.~% The changed form will be the one put in the compiled file" v)) ++ v) ++ ++(defun wt-fasd-element (x) ++ (si::find-sharing-top x (fasd-table (car *fasd-data*))) ++ (si::write-fasd-top x (car *fasd-data*))) + +-(defun add-init (x &optional endp) +- (let ((tem (cons (memoized-hash-equal x -1000) x))) +- (setf (data-inits) +- (if endp +- (nconc (data-inits) (list tem)) +- (cons tem (data-inits) ))) +- x)) ++(defun wt-data2 (x) ++ (if *fasd-data* ++ (wt-fasd-element x) ++ (wt-data1 x))) + +-(defun wt-data-file () ++(defun wt-data-file nil + (when *prof-p* (add-init `(si::mark-memory-as-profiling))) +- (verify-data-vector (data-vector)) +- (let* ((vec (coerce (nreverse (data-inits)) 'vector))) +- (verify-data-vector vec) +- (setf (aref (data-vector) (- (length (data-vector)) 1)) +- (cons 'si::%init vec)) +- (setf (data-package-ops) (nreverse (data-package-ops))) +- (cond (*fasd-data* +- (wt-fasd-data-file)) +- (t +- (format *compiler-output-data* " ~%#(") +- (dolist (v (data-package-ops)) +- (format *compiler-output-data* "#! ") +- (wt-data1 v)) +- (wt-data1 (data-vector)) +- (format *compiler-output-data* "~%)~%") +- )))) ++ (wt-data2 (1+ *next-vv*)) ++ (dolist (v (nreverse (data-inits))) ++ (wt-data2 (verify-datum v))) ++ (when *fasd-data* ++ (si::close-fasd (car *fasd-data*)))) + +-(defun wt-fasd-data-file ( &aux (x (data-vector)) tem) +-; (si::find-sharing-top (data-package-ops) (fasd-table (car *fasd-data*))) +- (si::find-sharing-top x (fasd-table (car *fasd-data*))) +- (cond ((setq tem (data-package-ops)) +- (dolist (v tem) +- (put-op d_eval_skip *compiler-output-data*) +- (si::write-fasd-top v (car *fasd-data*))))) +- (si::write-fasd-top x (car *fasd-data*)) +-; (sloop::sloop for (k v) in-table (fasd-table (car *fasd-data*)) +-; when (>= v 0) do (print (list k v))) +- (si::close-fasd (car *fasd-data*))) + (defun wt-data-begin ()) + (defun wt-data-end ()) +-(defun wt-data-package-operation (x) +- (push x (data-package-ops))) + + (defmacro wt (&rest forms &aux (fl nil)) + (dolist** (form forms (cons 'progn (reverse (cons nil fl)))) +--- gcl-2.6.12.orig/cmpnew/sys-proclaim.lisp ++++ gcl-2.6.12/cmpnew/sys-proclaim.lisp +@@ -2,197 +2,163 @@ + (COMMON-LISP::IN-PACKAGE "COMPILER") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- COMPILER::TAG-REF-CLB COMPILER::SET-TOP +- COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C1LIST-NTH +- COMPILER::C1RPLACA-NTHCDR COMPILER::C1DEFINE-STRUCTURE +- COMPILER::BLK-REF-CLB COMPILER::WT-VV COMPILER::C1LENGTH +- COMPILER::C1MAPC COMPILER::C1LOCAL-CLOSURE +- COMPILER::CHECK-VREF COMPILER::WT-VAR-DECL COMPILER::C1TAGBODY +- COMPILER::BLK-REF-CCB COMPILER::C1LOAD-TIME-VALUE +- COMPILER::C1ASH COMPILER::FUN-LEVEL COMPILER::COPY-INFO +- COMPILER::INLINE-POSSIBLE COMPILER::WT-VS-BASE +- COMPILER::T1DEFENTRY COMPILER::CHARACTER-LOC-P +- COMPILER::C2RPLACA COMPILER::RESET-INFO-TYPE +- COMPILER::TYPE-FILTER COMPILER::TAG-SWITCH +- COMPILER::DECL-BODY-SAFETY COMPILER::C1AND +- COMPILER::C1FMLA-CONSTANT COMPILER::C2GO-CLB +- COMPILER::C1FUNCTION COMPILER::C1MAPLIST COMPILER::VAR-TYPE +- COMPILER::CLINK COMPILER::UNWIND-NO-EXIT COMPILER::VAR-LOC +- COMPILER::C2RPLACD COMPILER::VERIFY-DATA-VECTOR +- COMPILER::TAG-REF-CCB COMPILER::C1RETURN-FROM +- COMPILER::T1DEFINE-STRUCTURE COMPILER::MDELETE-FILE +- COMPILER::OBJECT-TYPE COMPILER::WT-CAR COMPILER::TAG-P +- COMPILER::ADD-LOOP-REGISTERS COMPILER::C1MEMQ +- COMPILER::C2FUNCTION COMPILER::CMP-MACRO-FUNCTION +- COMPILER::C1BOOLE-CONDITION COMPILER::REP-TYPE COMPILER::C2GET +- COMPILER::C2VAR COMPILER::C2EXPR* COMPILER::C1ADD-GLOBALS +- COMPILER::WT1 COMPILER::C1BLOCK COMPILER::C1MAPL +- COMPILER::C1MAPCAR COMPILER::FSET-FN-NAME COMPILER::C2GO-CCB +- COMPILER::T1DEFLA COMPILER::C1NTH-CONDITION +- COMPILER::ADD-OBJECT2 COMPILER::VAR-NAME COMPILER::C1EXPR +- COMPILER::FUN-REF COMPILER::SCH-LOCAL-FUN +- COMPILER::FIXNUM-LOC-P COMPILER::BLK-VAR +- COMPILER::C1UNWIND-PROTECT COMPILER::C2BIND +- COMPILER::PARSE-CVSPECS COMPILER::C1NTH +- COMPILER::WT-SWITCH-CASE SYSTEM::UNDEF-COMPILER-MACRO +- COMPILER::SET-UP-VAR-CVS COMPILER::C1ECASE +- COMPILER::C1STRUCTURE-REF COMPILER::FUN-INFO +- COMPILER::C1MEMBER COMPILER::C1GET COMPILER::WT-FUNCTION-LINK +- COMPILER::C1ASH-CONDITION COMPILER::WT-CCB-VS COMPILER::INFO-P +- COMPILER::REGISTER COMPILER::TAG-VAR COMPILER::C1VAR +- COMPILER::C1TERPRI COMPILER::LTVP +- COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::C1MAPCON +- COMPILER::PUSH-ARGS-LISPCALL COMPILER::C1SETQ +- COMPILER::C2DOWNWARD-FUNCTION COMPILER::T3ORDINARY +- COMPILER::C1VREF COMPILER::WT-VS COMPILER::CONSTANT-FOLD-P +- COMPILER::C1MULTIPLE-VALUE-PROG1 COMPILER::BLK-EXIT +- COMPILER::T1DEFUN COMPILER::C1LABELS COMPILER::C1FSET +- COMPILER::T1MACROLET COMPILER::FUN-NAME COMPILER::C1APPLY +- COMPILER::FUN-P COMPILER::WT-DATA-PACKAGE-OPERATION +- COMPILER::C1FUNOB COMPILER::WT-SYMBOL-FUNCTION +- COMPILER::GET-RETURN-TYPE COMPILER::ADD-CONSTANT +- COMPILER::SAFE-SYSTEM COMPILER::BLK-VALUE-TO-GO +- COMPILER::NEED-TO-SET-VS-POINTERS COMPILER::C2TAGBODY-LOCAL +- COMPILER::C1DECLARE COMPILER::C1OR COMPILER::C1ASSOC +- COMPILER::ADD-ADDRESS COMPILER::VAR-KIND +- COMPILER::PROCLAMATION COMPILER::FIX-OPT COMPILER::WT-DATA1 +- COMPILER::INFO-SP-CHANGE COMPILER::ARGS-CAUSE-SIDE-EFFECT +- COMPILER::WRITE-BLOCK-OPEN COMPILER::C2TAGBODY-BODY +- COMPILER::CONS-TO-LISTA COMPILER::SAVE-FUNOB COMPILER::VAR-REF +- COMPILER::C1LOCAL-FUN COMPILER::VAR-REP-LOC +- COMPILER::SET-PUSH-CATCH-FRAME COMPILER::CTOP-WRITE +- COMPILER::C2TAGBODY-CLB COMPILER::T1CLINES +- COMPILER::ADD-OBJECT COMPILER::GET-LOCAL-RETURN-TYPE +- COMPILER::DEFAULT-INIT COMPILER::FUNCTION-ARG-TYPES +- COMPILER::C1STRUCTURE-SET COMPILER::CMP-MACROEXPAND-1 +- COMPILER::INLINE-TYPE COMPILER::VAR-REGISTER +- COMPILER::DECLARATION-TYPE COMPILER::C1CATCH COMPILER::C1LET +- COMPILER::T3CLINES COMPILER::UNDEFINED-VARIABLE COMPILER::C1GO +- COMPILER::TAG-NAME COMPILER::SCH-GLOBAL COMPILER::C1IF +- COMPILER::C1FLET COMPILER::INLINE-BOOLE3-STRING +- COMPILER::INFO-CHANGED-ARRAY COMPILER::C2FUNCALL-AUX +- COMPILER::FUN-REF-CCB COMPILER::WT-CADR COMPILER::FUN-CFUN +- COMPILER::WT-VS* COMPILER::WT-DOWN COMPILER::C2GETHASH +- COMPILER::ADD-REG1 COMPILER::REPLACE-CONSTANT +- COMPILER::C2DM-RESERVE-V COMPILER::RESULT-TYPE +- COMPILER::C1FUNCALL COMPILER::C1THE COMPILER::VARARG-P +- COMPILER::INFO-REFERRED-ARRAY COMPILER::C1PROGV +- COMPILER::T2DECLARE COMPILER::T1DEFCFUN COMPILER::C2VALUES +- COMPILER::C1SWITCH COMPILER::C1MAPCAN +- COMPILER::CMP-MACROEXPAND COMPILER::TAG-LABEL +- COMPILER::TAG-UNWIND-EXIT COMPILER::C1PRINC COMPILER::C1THROW +- COMPILER::SAVE-AVMA COMPILER::VOLATILE COMPILER::FLAGS-POS +- COMPILER::INFO-TYPE COMPILER::C1NTHCDR-CONDITION +- COMPILER::C1MULTIPLE-VALUE-SETQ COMPILER::WT-FUNCALL-C +- COMPILER::PUSH-ARGS COMPILER::C1DM-BAD-KEY +- COMPILER::T1ORDINARY COMPILER::C1PSETQ COMPILER::BLK-REF +- COMPILER::C2DM-RESERVE-VL COMPILER::C1MACROLET +- COMPILER::C1SHARP-COMMA COMPILER::C1RPLACA +- COMMON-LISP::PROCLAIM COMPILER::PUSH-DATA-INCF +- COMPILER::MACRO-DEF-P COMPILER::BLK-NAME COMPILER::C1VALUES +- COMPILER::C1DOWNWARD-FUNCTION COMPILER::T1DEFMACRO +- COMPILER::GET-ARG-TYPES COMPILER::ADD-SYMBOL +- COMPILER::NAME-SD1 COMPILER::C2GO-LOCAL +- COMPILER::C2TAGBODY-CCB COMPILER::WT-LIST +- COMPILER::GET-LOCAL-ARG-TYPES COMPILER::C1BOOLE3 +- COMPILER::C1STACK-LET COMPILER::WT-CDR COMPILER::C1QUOTE +- COMPILER::C1EVAL-WHEN COMPILER::VAR-P COMPILER::CHECK-DOWNWARD +- COMPILER::T1PROGN COMPILER::BLK-P COMPILER::C2LOCATION +- COMPILER::THE-PARAMETER COMPILER::C2VAR-KIND +- COMPILER::C1GETHASH COMPILER::LTVP-EVAL COMPILER::C1RPLACD +- COMPILER::INFO-VOLATILE COMPILER::LONG-FLOAT-LOC-P +- COMPILER::FUNCTION-RETURN-TYPE COMPILER::SHORT-FLOAT-LOC-P +- COMPILER::WT-H1 COMPILER::C1MULTIPLE-VALUE-CALL +- COMPILER::NAME-TO-SD COMPILER::C1PROGN COMPILER::SET-RETURN +- COMPILER::C1LET* COMPILER::AET-C-TYPE COMPILER::C1COMPILER-LET +- COMPILER::MAXARGS COMPILER::VAR-REF-CCB COMPILER::VV-STR +- COMPILER::C1NTHCDR COMPILER::TAG-REF COMPILER::GET-INCLUDED)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- COMPILER::INLINE-BOOLE3)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::TS COMPILER::DASH-TO-UNDERSCORE)) ++ COMPILER::CMPERR COMPILER::CMPWARN COMPILER::WT-CVAR ++ COMPILER::ADD-INIT COMPILER::INIT-NAME ++ COMPILER::FAST-LINK-PROCLAIMED-TYPE-P COMPILER::C1CASE ++ COMPILER::WT-INTEGER-LOC COMPILER::CMPNOTE ++ COMPILER::UNWIND-EXIT COMPILER::WT-COMMENT ++ COMPILER::C1LAMBDA-EXPR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- COMPILER::C2CALL-UNKNOWN-GLOBAL COMPILER::WT-IF-PROCLAIMED +- COMPILER::MY-CALL COMPILER::WT-GLOBAL-ENTRY +- COMPILER::T3DEFUN-NORMAL COMPILER::C2STRUCTURE-REF +- COMPILER::C2SWITCH COMPILER::C2CALL-GLOBAL +- COMPILER::T3DEFUN-VARARG COMPILER::C1MAKE-VAR)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::C2RETURN-LOCAL COMPILER::WT-INLINE-LOC ++ COMPILER::C1SYMBOL-FUN COMPILER::C2DECL-BODY ++ COMPILER::COMPILER-BUILD COMPILER::NCONC-FILES ++ COMPILER::C2BLOCK COMPILER::C1BODY COMPILER::C2BLOCK-LOCAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- COMPILER::LINK COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL +- COMPILER::INLINE-ARGS)) ++ COMPILER::MEMOIZED-HASH-EQUAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- COMPILER::WT-INLINE-INTEGER COMPILER::ADD-FUNCTION-DECLARATION +- COMPILER::C1STRUCTURE-REF1 COMPILER::ADD-FAST-LINK +- COMPILER::AND-FORM-TYPE COMPILER::C2PRINC COMPILER::C2MAPCAN +- COMPILER::CJT COMPILER::C2CASE COMPILER::WT-INLINE-LONG-FLOAT +- COMPILER::SUBLIS1-INLINE COMPILER::MYSUB +- COMPILER::ADD-FUNCTION-PROCLAMATION COMPILER::FIX-DOWN-ARGS +- COMPILER::TOO-MANY-ARGS COMPILER::CMP-EXPAND-MACRO +- COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2GO +- COMPILER::WT-INLINE-FIXNUM COMPILER::WT-INLINE-COND +- COMPILER::C1MAP-FUNCTIONS COMPILER::C1DM +- COMPILER::WT-MAKE-CCLOSURE COMPILER::CAN-BE-REPLACED* +- COMPILER::C-FUNCTION-NAME COMPILER::C2LET* COMPILER::CJF +- COMPILER::TOO-FEW-ARGS COMPILER::BOOLE3 COMPILER::T3DEFCFUN +- COMPILER::C2FUNCALL-SFUN COMPILER::C2MAPC +- COMPILER::CHECK-FORM-TYPE COMPILER::SET-VAR +- COMPILER::C2TAGBODY COMPILER::CHECK-VDECL +- COMPILER::GET-INLINE-INFO COMPILER::ASSIGN-DOWN-VARS +- COMPILER::C2LET COMPILER::INLINE-TYPE-MATCHES +- COMPILER::COMPILER-PASS2 COMPILER::C2PROGV COMPILER::C2MAPCAR +- COMPILER::MAKE-INLINE-STRING COMPILER::WT-INLINE-CHARACTER +- COMPILER::WT-INLINE-SHORT-FLOAT)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ COMPILER::MAKE-INIT-STRING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- COMPILER::T2DEFENTRY COMPILER::DEFSYSFUN COMPILER::T3DEFENTRY)) ++ COMPILER::MLIN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- COMPILER::T3DEFUN-LOCAL-ENTRY COMPILER::T3INIT-FUN +- COMPILER::T2DEFUN COMPILER::T3DEFUN COMPILER::C2STRUCTURE-SET +- COMPILER::C1APPLY-OPTIMIZE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS ++ COMPILER::ANALYZE-REGS1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::GET-OUTPUT-PATHNAME COMPILER::WT-SIMPLE-CALL)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ COMPILER::DECL-BODY-SAFETY COMPILER::C2FUNCTION ++ COMPILER::C1PROGN COMPILER::C1MAPCAR COMPILER::C1FLET ++ COMPILER::C1EXPR COMPILER::C1LET COMPILER::ADD-OBJECT ++ COMPILER::C1LABELS COMPILER::C1FMLA-CONSTANT COMPILER::C1ECASE ++ COMPILER::C1LENGTH COMPILER::C1APPLY COMPILER::THE-PARAMETER ++ COMPILER::C1TAGBODY COMPILER::T3CLINES ++ COMPILER::VERIFY-DATA-VECTOR COMPILER::VAR-KIND ++ COMPILER::INLINE-TYPE COMPILER::C1MULTIPLE-VALUE-CALL ++ COMPILER::C2GET COMPILER::ADD-CONSTANT COMPILER::T1DEFMACRO ++ COMPILER::C2EXPR* COMPILER::TAG-UNWIND-EXIT ++ COMPILER::CHECK-DOWNWARD COMPILER::WT-CADR ++ COMPILER::CHARACTER-LOC-P COMPILER::C1DECLARE ++ COMPILER::AET-C-TYPE COMPILER::C1QUOTE COMPILER::CHECK-VREF ++ COMPILER::VAR-LOC COMPILER::INLINE-POSSIBLE COMPILER::SET-TOP ++ COMPILER::T1ORDINARY COMPILER::BLK-VAR COMPILER::SAVE-AVMA ++ COMPILER::C1VREF COMPILER::WT-VV COMPILER::C2GO-LOCAL ++ COMPILER::C1MEMBER COMPILER::LTVP-EVAL COMPILER::VV-STR ++ COMPILER::TAG-REF-CLB COMPILER::T2DECLARE ++ COMPILER::CMP-MACROEXPAND-1 COMPILER::T1DEFINE-STRUCTURE ++ COMPILER::T1DEFENTRY COMPILER::ADD-OBJECT2 COMPILER::FUN-LEVEL ++ COMPILER::VAR-P COMPILER::WT-DATA-PACKAGE-OPERATION ++ COMPILER::PUSH-ARGS-LISPCALL COMPILER::C1PSETQ COMPILER::C1OR ++ COMPILER::C1LOCAL-FUN COMPILER::WT-VS-BASE ++ COMPILER::DEFAULT-INIT COMPILER::C1MAPCON COMPILER::C1GO ++ COMPILER::INFO-REFERRED-ARRAY COMPILER::BLK-REF ++ COMPILER::T1DEFLA COMPILER::INFO-CHANGED-ARRAY ++ COMPILER::WT-VAR-DECL COMPILER::UNWIND-NO-EXIT ++ COMPILER::BLK-VALUE-TO-GO COMPILER::C2GO-CLB ++ COMPILER::FUNCTION-ARG-TYPES COMPILER::C1MAPC ++ COMPILER::C2DOWNWARD-FUNCTION COMPILER::CMP-MACRO-FUNCTION ++ COMPILER::C1SHARP-COMMA COMPILER::ADD-ADDRESS ++ COMPILER::GET-LOCAL-RETURN-TYPE COMPILER::T1DEFUN ++ COMPILER::C1ADD-GLOBALS COMPILER::C2DM-RESERVE-V ++ COMPILER::C1ASH COMPILER::C1STACK-LET ++ COMPILER::WT-SYMBOL-FUNCTION COMPILER::C2TAGBODY-CLB ++ COMPILER::C1MAPLIST COMPILER::PUSH-DATA-INCF ++ COMPILER::C2TAGBODY-LOCAL COMPILER::C1FSET COMPILER::WT1 ++ COMPILER::VAR-REF-CCB COMPILER::INFO-P COMPILER::C1ASSOC ++ COMPILER::C2GETHASH COMPILER::C1RPLACD COMPILER::C1EVAL-WHEN ++ COMPILER::REP-TYPE COMPILER::C1FUNOB COMPILER::BLK-REF-CLB ++ COMPILER::WT-VS* COMPILER::C1GET COMPILER::SCH-LOCAL-FUN ++ COMPILER::SET-PUSH-CATCH-FRAME COMPILER::C1BOOLE3 ++ COMPILER::BLK-EXIT COMPILER::T1DEFCFUN COMPILER::GET-ARG-TYPES ++ COMPILER::WRITE-BLOCK-OPEN COMPILER::C1COMPILER-LET ++ COMPILER::ADD-LOOP-REGISTERS COMPILER::INLINE-BOOLE3-STRING ++ COMPILER::C1LOAD-TIME-VALUE COMPILER::VAR-TYPE ++ COMPILER::REGISTER COMPILER::RESET-INFO-TYPE ++ COMPILER::C1UNWIND-PROTECT COMPILER::C1IF ++ COMPILER::SHORT-FLOAT-LOC-P COMPILER::C1VAR ++ COMPILER::WT-FUNCALL-C COMPILER::C1THE COMPILER::FIX-OPT ++ COMPILER::UNDEFINED-VARIABLE COMPILER::C2RPLACD ++ COMPILER::C1BOOLE-CONDITION COMPILER::C1NTH COMPILER::VARARG-P ++ COMPILER::OBJECT-TYPE COMPILER::VOLATILE COMPILER::FUN-P ++ COMPILER::VAR-REF COMPILER::C1DEFINE-STRUCTURE ++ COMPILER::MAXARGS COMPILER::LONG-FLOAT-LOC-P ++ COMPILER::REPLACE-CONSTANT COMPILER::C2TAGBODY-BODY ++ COMPILER::TAG-P COMPILER::C1RETURN-FROM COMPILER::WT-VS ++ COMPILER::ARGS-CAUSE-SIDE-EFFECT COMPILER::C1LIST-NTH ++ COMPILER::FSET-FN-NAME COMPILER::SAVE-FUNOB COMPILER::C1BLOCK ++ COMPILER::C1AND COMPILER::C2TAGBODY-CCB COMPILER::GET-INCLUDED ++ COMPILER::TAG-REF COMPILER::NEED-TO-SET-VS-POINTERS ++ COMPILER::C1VALUES COMPILER::BLK-P COMPILER::COPY-INFO ++ COMPILER::WT-CAR COMPILER::FUN-CFUN ++ COMPILER::C1MULTIPLE-VALUE-PROG1 SYSTEM::UNDEF-COMPILER-MACRO ++ COMPILER::C1DM-BAD-KEY COMPILER::FUN-REF COMPILER::NAME-SD1 ++ COMPILER::MDELETE-FILE COMPILER::SAFE-SYSTEM ++ COMPILER::WT-DATA2 COMPILER::WT-CDR COMPILER::C2GO-CCB ++ COMPILER::C1ASH-CONDITION COMPILER::C1RPLACA ++ COMPILER::WT-DATA1 COMPILER::C1RPLACA-NTHCDR ++ COMPILER::NAME-TO-SD COMPILER::WT-LIST ++ COMPILER::CMP-MACROEXPAND COMPILER::WT-SWITCH-CASE ++ COMPILER::GET-LOCAL-ARG-TYPES COMPILER::SET-UP-VAR-CVS ++ COMPILER::WT-FASD-ELEMENT COMPILER::RESULT-TYPE ++ COMPILER::C1SWITCH COMPILER::FIXNUM-LOC-P ++ COMPILER::C1NTHCDR-CONDITION COMPILER::TAG-VAR ++ COMPILER::C1NTHCDR COMPILER::CLINK COMPILER::LTVP ++ COMPILER::C1LET* COMPILER::TAG-NAME COMPILER::C1FUNCALL ++ COMPILER::C2RPLACA COMPILER::MACRO-DEF-P ++ COMPILER::C1STRUCTURE-REF COMPILER::GET-RETURN-TYPE ++ COMPILER::C1DOWNWARD-FUNCTION COMPILER::T1CLINES ++ COMPILER::TYPE-FILTER COMPILER::C1FUNCTION ++ COMPILER::CONS-TO-LISTA COMPILER::C1NTH-CONDITION ++ COMPILER::FUN-NAME COMPILER::PROCLAMATION COMPILER::VAR-NAME ++ COMPILER::WT-CCB-VS COMPILER::FLAGS-POS COMPILER::C1CATCH ++ COMPILER::CTOP-WRITE COMPILER::TAG-LABEL COMPILER::C1MEMQ ++ COMPILER::C1GETHASH COMPILER::TAG-REF-CCB COMPILER::TAG-SWITCH ++ COMPILER::C2BIND COMPILER::VERIFY-DATUM COMPILER::C1MAPCAN ++ COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::C1TERPRI ++ COMPILER::FUN-REF-CCB COMMON-LISP::PROCLAIM ++ COMPILER::INFO-VOLATILE COMPILER::T3ORDINARY ++ COMPILER::C2LOCATION COMPILER::BLK-NAME ++ COMPILER::C1STRUCTURE-SET COMPILER::C2VAR ++ COMPILER::C1LOCAL-CLOSURE COMPILER::C1MACROLET ++ COMPILER::WT-FUNCTION-LINK COMPILER::C2VALUES ++ COMPILER::T1MACROLET COMPILER::C1MULTIPLE-VALUE-BIND ++ COMPILER::C2FUNCALL-AUX COMPILER::C1MULTIPLE-VALUE-SETQ ++ COMPILER::PUSH-ARGS COMPILER::BLK-REF-CCB COMPILER::C1SETQ ++ COMPILER::ADD-SYMBOL COMPILER::C2VAR-KIND COMPILER::C1THROW ++ COMPILER::DECLARATION-TYPE COMPILER::C1PROGV ++ COMPILER::INFO-TYPE COMPILER::CONSTANT-FOLD-P ++ COMPILER::C1PRINC COMPILER::WT-DOWN COMPILER::SCH-GLOBAL ++ COMPILER::T1PROGN COMPILER::INFO-SP-CHANGE ++ COMPILER::C2DM-RESERVE-VL COMPILER::C1MAPL ++ COMPILER::FUNCTION-RETURN-TYPE COMPILER::ADD-REG1 ++ COMPILER::PARSE-CVSPECS COMPILER::FUN-INFO ++ COMPILER::VAR-REGISTER COMPILER::SET-RETURN COMPILER::WT-H1 ++ COMPILER::VAR-REP-LOC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::T3LOCAL-DCFUN COMPILER::T3LOCAL-FUN)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ COMPILER::INLINE-BOOLE3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -206,8 +172,8 @@ + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::*) +- COMPILER::C2RETURN-FROM COMPILER::C2DM COMPILER::C1DM-VL +- COMPILER::C2APPLY-OPTIMIZE COMPILER::C1DM-V)) ++ COMPILER::C1DM-V COMPILER::C1DM-VL COMPILER::C2APPLY-OPTIMIZE ++ COMPILER::C2RETURN-FROM COMPILER::C2DM)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -216,40 +182,85 @@ + COMPILER::T3DEFUN-AUX)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- COMPILER::C2PROGN COMPILER::WT-LONG-FLOAT-LOC +- COMPILER::WT-CHARACTER-LOC COMPILER::WT-TO-STRING +- COMPILER::WT-LOC COMPILER::MEXPAND-DEFTYPE +- COMPILER::CMP-TOPLEVEL-EVAL COMPILER::T1EVAL-WHEN +- COMPILER::T1EXPR COMPILER::C2OR COMPILER::WT-FIXNUM-LOC +- COMPILER::C2EXPR COMPILER::C2AND COMPILER::CMP-EVAL +- COMPILER::SET-LOC COMPILER::WT-SHORT-FLOAT-LOC)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- COMPILER::MAKE-INFO COMPILER::FCALLN-INLINE +- COMPILER::LIST-INLINE COMPILER::LIST*-INLINE +- COMPILER::COMPILER-COMMAND COMPILER::MAKE-BLK +- COMPILER::MAKE-FUN COMPILER::WT-CLINK COMPILER::C2FSET +- COMPILER::MAKE-TAG COMPILER::CS-PUSH COMPILER::MAKE-VAR +- COMMON-LISP::COMPILE-FILE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) + COMPILER::F-TYPE)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(COMMON-LISP::DISASSEMBLE COMPILER::CMP-TMP-MACRO +- COMPILER::CMP-ANON COMMON-LISP::COMPILE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*))) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::COPY-ARRAY)) ++ COMPILER::C2RETURN-CCB ++ COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES ++ COMPILER::DO-CHANGED COMPILER::CO1STRUCTURE-PREDICATE ++ COMPILER::RESULT-TYPE-FROM-ARGS COMPILER::CMPFIX-ARGS ++ COMPILER::T3SHARP-COMMA COMPILER::FLAGS ++ COMPILER::CO1WRITE-BYTE COMPILER::CHECK-FNAME-ARGS ++ COMPILER::C2ASSOC!2 COMPILER::CK-SPEC ++ COMPILER::COERCE-LOC-STRUCTURE-REF COMPILER::ADD-DEBUG-INFO ++ COMPILER::C2LAMBDA-EXPR-WITH-KEY COMPILER::PRIN1-CMP ++ COMPILER::PUSH-CHANGED-VARS COMPILER::SHIFT>> ++ COMPILER::ARGS-INFO-REFERRED-VARS ++ COMPILER::C2MULTIPLE-VALUE-CALL ++ COMPILER::ARGS-INFO-CHANGED-VARS COMPILER::CO1SCHAR ++ COMPILER::NEXT-CVAR COMPILER::C2RETURN-CLB ++ COMPILER::CO1WRITE-CHAR COMPILER::SET-VS SYSTEM::SWITCH ++ COMPILER::FLAG-P COMPILER::DO-ARRAY COMPILER::INLINE-PROC ++ COMPILER::CO1CONS COMPILER::C2EXPR-TOP ++ COMPILER::CHANGED-LENGTH COMPILER::C2MULTIPLE-VALUE-PROG1 ++ COMPILER::REMOVE-FLAG COMPILER::CO1SUBLIS COMPILER::ADD-INFO ++ COMPILER::C2BIND-INIT COMPILER::C2DM-BIND-VL COMPILER::C1FMLA ++ COMPILER::C2CATCH COMPILER::WT-MAKE-DCLOSURE ++ COMPILER::UNWIND-BDS COMPILER::IS-REP-REFERRED ++ COMPILER::WT-LONG-FLOAT-VALUE COMPILER::WT-GO ++ COMPILER::FAST-READ COMPILER::WT COMPILER::SAFE-COMPILE ++ COMPILER::WT-H COMPILER::STRUCT-TYPE-OPT ++ COMPILER::REFERRED-LENGTH COMPILER::TYPE-AND COMPILER::C2THROW ++ COMPILER::NEED-TO-PROTECT COMPILER::COERCE-LOC ++ COMPILER::TYPE>= COMPILER::WT-NL1 COMPILER::CHECK-END ++ COMPILER::C2BLOCK-CCB COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY ++ COMPILER::SET-BDS-BIND COMPILER::C2DM-BIND-INIT ++ COMPILER::CAN-BE-REPLACED COMPILER::MAYBE-EVAL ++ COMPILER::WT-VAR COMPILER::WT-REQUIREDS ++ COMPILER::CONVERT-CASE-TO-SWITCH COMPILER::CO1TYPEP ++ COMPILER::C1DECL-BODY COMPILER::DOWNWARD-FUNCTION ++ COMPILER::MULTIPLE-VALUE-CHECK COMPILER::NEXT-CFUN ++ SYSTEM::SWITCH-FINISH COMPILER::CO1READ-CHAR ++ COMPILER::COMPILER-CC COMPILER::C1PROGN* ++ COMPILER::C1LAMBDA-FUN COMPILER::MAKE-USER-INIT ++ COMPILER::SHIFT<< COMPILER::C1ARGS COMPILER::CK-VL ++ COMPILER::T23EXPR COMPILER::IS-CHANGED COMPILER::PUSH-REFERRED ++ COMPILER::WT-CHARACTER-VALUE ++ COMPILER::PUSH-REFERRED-WITH-START COMPILER::NEXT-LABEL* ++ COMPILER::CMPCK COMPILER::C2DM-BIND-LOC ++ COMPILER::WT-SHORT-FLOAT-VALUE ++ COMPILER::PUSH-CHANGED-WITH-START COMPILER::C2EXPR-TOP* ++ COMPILER::DOLIST* COMPILER::WT-LABEL COMPILER::PUSH-CHANGED ++ COMPILER::BASE-USED COMPILER::CO1VECTOR-PUSH ++ COMPILER::WT-V*-MACROS COMPILER::CO1CONSTANT-FOLD ++ COMPILER::WT-FIXNUM-VALUE COMPILER::C2BLOCK-CLB ++ SYSTEM::DEFINE-INLINE-FUNCTION COMPILER::SET-JUMP-TRUE ++ COMPILER::C2BIND-LOC COMPILER::IN-ARRAY ++ COMPILER::SET-JUMP-FALSE COMPILER::PROCLAIM-VAR ++ COMMON-LISP::DEFINE-COMPILER-MACRO COMPILER::C1CONSTANT-VALUE ++ COMPILER::COMPILER-DEF-HOOK COMPILER::CO1READ-BYTE ++ COMPILER::MAYBE-WT-C2DM-BIND-VL COMPILER::IS-REFERRED ++ COMPILER::DOTIMES** SYSTEM::ADD-DEBUG COMPILER::DO-REFERRED ++ COMPILER::NEXT-LABEL COMPILER::C2CALL-LAMBDA COMPILER::C2APPLY ++ COMPILER::C1EXPR* COMPILER::C2SETQ COMPILER::MIA ++ COMPILER::C2PSETQ COMPILER::C1SETQ1 ++ COMPILER::C2LIST-NTH-IMMEDIATE COMPILER::WT-NL ++ COMPILER::CO1EQL COMPILER::CFAST-WRITE COMPILER::CO1LDB ++ COMPILER::EQL-NOT-NIL COMPILER::JUMPS-TO-P ++ COMPILER::C2CALL-LOCAL COMPILER::BIGNUM-EXPANSION-STORAGE ++ COMPILER::STACK-LET COMPILER::C2MULTIPLE-VALUE-SETQ ++ COMPILER::C2MEMBER!2 COMPILER::C2UNWIND-PROTECT ++ COMPILER::DOLIST** COMPILER::SET-DBIND COMPILER::DOTIMES* ++ COMPILER::NEXT-CMACRO COMPILER::GET-INLINE-LOC ++ COMPILER::C2STACK-LET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMPILER::COMPILE-FILE1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -257,9 +268,11 @@ + (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) + (COMMON-LISP::INTEGER -9223372036854775808 + 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) + COMMON-LISP::T) + COMMON-LISP::FIXNUM) +- COMPILER::PUSH-ARRAY)) ++ COMPILER::BSEARCHLEQ)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -267,11 +280,16 @@ + (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) + (COMMON-LISP::INTEGER -9223372036854775808 + 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) + COMMON-LISP::T) + COMMON-LISP::FIXNUM) +- COMPILER::BSEARCHLEQ)) ++ COMPILER::PUSH-ARRAY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) ++ COMMON-LISP::T) ++ COMPILER::TS COMPILER::DASH-TO-UNDERSCORE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -285,130 +303,121 @@ + COMPILER::DASH-TO-UNDERSCORE-INT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ COMPILER::VS-PUSH COMPILER::WFS-ERROR COMPILER::MACRO-ENV ++ COMPILER::C1T COMPILER::WT-CVARS COMPILER::WT-DATA-END ++ COMPILER::GAZONK-NAME COMPILER::INIT-ENV ++ COMPILER::ADD-LOAD-TIME-SHARP-COMMA COMPILER::CCB-VS-PUSH ++ COMPILER::WT-DATA-FILE COMPILER::WT-FASD-DATA-FILE ++ COMPILER::INC-INLINE-BLOCKS COMPILER::PRINT-CURRENT-FORM ++ COMPILER::CLOSE-INLINE-BLOCKS COMPILER::WT-DATA-BEGIN ++ COMPILER::BABOON COMPILER::WT-C-PUSH COMPILER::WT-NEXT-VAR-ARG ++ COMPILER::WT-FIRST-VAR-ARG COMPILER::CVS-PUSH ++ COMPILER::TAIL-RECURSION-POSSIBLE COMPILER::RESET-TOP ++ COMPILER::C1NIL COMPILER::PRINT-COMPILER-INFO)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) ++ ((COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*))) + COMMON-LISP::T) +- COMPILER::MLIN)) ++ COMPILER::COPY-ARRAY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ COMPILER::T1EXPR COMPILER::WT-TO-STRING COMPILER::C2OR ++ COMPILER::WT-LOC COMPILER::SET-LOC COMPILER::MEXPAND-DEFTYPE ++ COMPILER::C2EXPR COMPILER::C2PROGN COMPILER::C2AND ++ COMPILER::WT-SHORT-FLOAT-LOC COMPILER::WT-CHARACTER-LOC ++ COMPILER::CMP-EVAL COMPILER::T1EVAL-WHEN ++ COMPILER::WT-LONG-FLOAT-LOC COMPILER::CMP-TOPLEVEL-EVAL ++ COMPILER::WT-FIXNUM-LOC)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMPILER::FCALLN-INLINE COMPILER::CS-PUSH COMPILER::WT-CLINK ++ COMPILER::COMPILER-COMMAND COMPILER::MAKE-INFO ++ COMPILER::T2PROGN COMPILER::MAKE-TAG COMPILER::C2FSET ++ COMPILER::MAKE-BLK COMPILER::LIST-INLINE ++ COMMON-LISP::COMPILE-FILE COMPILER::MAKE-FUN ++ COMPILER::MAKE-VAR COMPILER::T3PROGN COMPILER::LIST*-INLINE)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(COMMON-LISP::COMPILE COMMON-LISP::DISASSEMBLE COMPILER::CMP-ANON ++ COMPILER::CMP-TMP-MACRO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::MEMOIZED-HASH-EQUAL)) ++ COMPILER::T3DEFUN-VARARG COMPILER::T3DEFUN-NORMAL ++ COMPILER::C2CALL-GLOBAL COMPILER::C2SWITCH COMPILER::MY-CALL ++ COMPILER::C1MAKE-VAR COMPILER::WT-IF-PROCLAIMED ++ COMPILER::C2STRUCTURE-REF COMPILER::C2CALL-UNKNOWN-GLOBAL ++ COMPILER::WT-GLOBAL-ENTRY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- COMPILER::MACRO-ENV COMPILER::C1T COMPILER::PRINT-CURRENT-FORM +- COMPILER::CCB-VS-PUSH COMPILER::C1NIL +- COMPILER::WT-FASD-DATA-FILE COMPILER::INIT-ENV +- COMPILER::WT-CVARS COMPILER::CVS-PUSH +- COMPILER::WT-FIRST-VAR-ARG COMPILER::WT-NEXT-VAR-ARG +- COMPILER::WT-DATA-FILE COMPILER::WT-C-PUSH +- COMPILER::GAZONK-NAME COMPILER::WT-DATA-END +- COMPILER::INC-INLINE-BLOCKS COMPILER::TAIL-RECURSION-POSSIBLE +- COMPILER::RESET-TOP COMPILER::CLOSE-INLINE-BLOCKS +- COMPILER::PRINT-COMPILER-INFO COMPILER::WFS-ERROR +- COMPILER::VS-PUSH COMPILER::BABOON COMPILER::WT-DATA-BEGIN +- COMPILER::ADD-LOAD-TIME-SHARP-COMMA)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::T2DEFENTRY COMPILER::T3DEFENTRY COMPILER::DEFSYSFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS1 +- COMPILER::ANALYZE-REGS)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::C2PROGV COMPILER::WT-INLINE-COND COMPILER::C2TAGBODY ++ COMPILER::CAN-BE-REPLACED* COMPILER::WT-INLINE-FIXNUM ++ COMPILER::MAKE-INLINE-STRING COMPILER::WT-INLINE-SHORT-FLOAT ++ COMPILER::C2LET* COMPILER::ADD-FAST-LINK ++ COMPILER::C1STRUCTURE-REF1 COMPILER::GET-INLINE-INFO ++ COMPILER::CHECK-FORM-TYPE COMPILER::C2MAPCAN ++ COMPILER::FIX-DOWN-ARGS COMPILER::CMP-EXPAND-MACRO ++ COMPILER::SUBLIS1-INLINE COMPILER::ADD-FUNCTION-PROCLAMATION ++ COMPILER::ADD-FUNCTION-DECLARATION COMPILER::SET-VAR ++ COMPILER::BOOLE3 COMPILER::CJF COMPILER::C2PRINC ++ COMPILER::INLINE-TYPE-MATCHES COMPILER::C1MAP-FUNCTIONS ++ COMPILER::C1DM COMPILER::WT-INLINE-CHARACTER ++ COMPILER::WT-MAKE-CCLOSURE COMPILER::TOO-MANY-ARGS ++ COMPILER::COMPILER-PASS2 COMPILER::WT-INLINE-INTEGER ++ COMPILER::T3DEFCFUN COMPILER::MYSUB ++ COMPILER::WT-INLINE-LONG-FLOAT COMPILER::TOO-FEW-ARGS ++ COMPILER::CHECK-VDECL COMPILER::C2GO COMPILER::C2LET ++ COMPILER::ASSIGN-DOWN-VARS COMPILER::C2CASE ++ COMPILER::C2FUNCALL-SFUN COMPILER::AND-FORM-TYPE ++ COMPILER::C-FUNCTION-NAME COMPILER::C2MAPCAR COMPILER::CJT ++ COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2MAPC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::UNWIND-EXIT COMPILER::WT-COMMENT COMPILER::CMPERR +- COMPILER::WT-CVAR COMPILER::FAST-LINK-PROCLAIMED-TYPE-P +- COMPILER::C1CASE COMPILER::CMPWARN COMPILER::ADD-INIT +- COMPILER::INIT-NAME COMPILER::WT-INTEGER-LOC COMPILER::CMPNOTE +- COMPILER::C1LAMBDA-EXPR)) ++ COMPILER::C1APPLY-OPTIMIZE COMPILER::T3DEFUN-LOCAL-ENTRY ++ COMPILER::T3INIT-FUN COMPILER::C2STRUCTURE-SET)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- COMPILER::C2BLOCK COMPILER::C1SYMBOL-FUN +- COMPILER::C2BLOCK-LOCAL COMPILER::C2DECL-BODY +- COMPILER::COMPILER-BUILD COMPILER::NCONC-FILES +- COMPILER::WT-INLINE-LOC COMPILER::C2RETURN-LOCAL +- COMPILER::C1BODY)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::T3DEFUN COMPILER::T2DEFUN COMPILER::T3LOCAL-FUN ++ COMPILER::T3LOCAL-DCFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::WT-FIXNUM-VALUE COMPILER::DOLIST** COMPILER::CO1LDB +- COMPILER::PUSH-REFERRED-WITH-START COMPILER::C2ASSOC!2 +- COMPILER::ADD-DEBUG-INFO COMPILER::WT-CHARACTER-VALUE +- COMPILER::MAYBE-WT-C2DM-BIND-VL COMPILER::C2BIND-LOC +- COMPILER::C2CATCH COMPILER::DO-REFERRED COMPILER::C2BLOCK-CLB +- COMPILER::CO1CONSTANT-FOLD COMPILER::C2CALL-LOCAL +- COMPILER::SHIFT<< COMPILER::C2UNWIND-PROTECT +- COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::C2DM-BIND-VL +- COMPILER::DOTIMES* COMPILER::REFERRED-LENGTH COMPILER::C1ARGS +- COMPILER::CK-SPEC COMPILER::C2MULTIPLE-VALUE-CALL +- COMPILER::C2CALL-LAMBDA COMPILER::CO1READ-BYTE +- COMPILER::CO1VECTOR-PUSH COMPILER::STACK-LET COMPILER::CMPCK +- COMPILER::MAYBE-EVAL COMPILER::COERCE-LOC COMPILER::C2PSETQ +- SYSTEM::DEFINE-INLINE-FUNCTION COMPILER::WT-MAKE-DCLOSURE +- COMPILER::COMPILER-CC COMPILER::WT-GO COMPILER::C1LAMBDA-FUN +- COMPILER::C2RETURN-CLB COMPILER::C1DECL-BODY +- COMPILER::PUSH-CHANGED-VARS COMPILER::GET-INLINE-LOC +- COMPILER::CO1SUBLIS COMPILER::CHANGED-LENGTH COMPILER::CO1CONS +- COMPILER::ARGS-INFO-REFERRED-VARS COMPILER::SET-JUMP-FALSE +- COMPILER::MAKE-USER-INIT COMPILER::NEXT-CVAR +- COMPILER::CAN-BE-REPLACED COMPILER::WT-V*-MACROS +- COMPILER::NEXT-CMACRO COMPILER::C2RETURN-CCB +- COMPILER::CO1SCHAR COMPILER::IS-CHANGED +- COMMON-LISP::DEFINE-COMPILER-MACRO COMPILER::SET-DBIND +- COMPILER::WT-H COMPILER::COERCE-LOC-STRUCTURE-REF +- COMPILER::C1EXPR* COMPILER::IS-REFERRED COMPILER::SHIFT>> +- COMPILER::WT COMPILER::TYPE-AND COMPILER::PRIN1-CMP +- COMPILER::C2BIND-INIT COMPILER::RESULT-TYPE-FROM-ARGS +- COMPILER::EQL-NOT-NIL COMPILER::C2APPLY COMPILER::C2BLOCK-CCB +- COMPILER::WT-NL1 COMPILER::CO1WRITE-CHAR COMPILER::CFAST-WRITE +- COMPILER::NEED-TO-PROTECT COMPILER::T3SHARP-COMMA +- SYSTEM::ADD-DEBUG COMPILER::BIGNUM-EXPANSION-STORAGE +- COMPILER::C2SETQ COMPILER::FLAG-P +- COMPILER::PUSH-CHANGED-WITH-START COMPILER::CMPFIX-ARGS +- COMPILER::CO1STRUCTURE-PREDICATE COMPILER::FAST-READ +- COMPILER::C1CONSTANT-VALUE COMPILER::BASE-USED +- COMPILER::PROCLAIM-VAR COMPILER::CO1TYPEP +- COMPILER::SET-JUMP-TRUE COMPILER::TYPE>= COMPILER::DOTIMES** +- COMPILER::CONVERT-CASE-TO-SWITCH COMPILER::C2MEMBER!2 +- COMPILER::DO-CHANGED COMPILER::ADD-INFO COMPILER::SET-VS +- COMPILER::CHECK-FNAME-ARGS +- COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES +- COMPILER::C2MULTIPLE-VALUE-PROG1 COMPILER::NEXT-LABEL* +- COMPILER::WT-VAR COMPILER::C2THROW COMPILER::INLINE-PROC +- COMPILER::PUSH-REFERRED COMPILER::C2LIST-NTH-IMMEDIATE +- COMPILER::C1FMLA COMPILER::PUSH-CHANGED +- COMPILER::MULTIPLE-VALUE-CHECK COMPILER::MIA +- COMPILER::WT-LABEL COMPILER::WT-NL +- COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::SET-BDS-BIND +- COMPILER::DO-ARRAY COMPILER::WT-REQUIREDS +- COMPILER::C2EXPR-TOP* COMPILER::C2DM-BIND-LOC +- COMPILER::DOLIST* SYSTEM::SWITCH-FINISH +- COMPILER::IS-REP-REFERRED COMPILER::WT-LONG-FLOAT-VALUE +- COMPILER::C1SETQ1 COMPILER::FLAGS COMPILER::CO1EQL +- COMPILER::CHECK-END COMPILER::NEXT-LABEL COMPILER::CK-VL +- COMPILER::ARGS-INFO-CHANGED-VARS COMPILER::C1PROGN* +- COMPILER::C2DM-BIND-INIT COMPILER::STRUCT-TYPE-OPT +- COMPILER::UNWIND-BDS COMPILER::SAFE-COMPILE +- COMPILER::CO1READ-CHAR COMPILER::JUMPS-TO-P SYSTEM::SWITCH +- COMPILER::NEXT-CFUN COMPILER::CO1WRITE-BYTE +- COMPILER::DOWNWARD-FUNCTION COMPILER::COMPILER-DEF-HOOK +- COMPILER::C2STACK-LET COMPILER::C2EXPR-TOP +- COMPILER::C2LAMBDA-EXPR-WITH-KEY COMPILER::IN-ARRAY +- COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY)) ++ COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL COMPILER::LINK ++ COMPILER::INLINE-ARGS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMPILER::COMPILE-FILE1)) +\ No newline at end of file ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::WT-SIMPLE-CALL COMPILER::GET-OUTPUT-PATHNAME)) +\ No newline at end of file +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -255,6 +255,21 @@ struct freelist { + + #define FREE (-1) /* free object */ + ++struct fasd { ++ object stream; /* lisp object of type stream */ ++ object table; /* hash table used in dumping or vector on input*/ ++ object eof; /* lisp object to be returned on coming to eof mark */ ++ object direction; /* holds Cnil or sKinput or sKoutput */ ++ object package; /* the package symbols are in by default */ ++ object index; /* integer. The current_dump index on write */ ++ object filepos; /* nil or the position of the start */ ++ object table_length; /* On read it is set to the size dump array needed ++ or 0 ++ */ ++ object evald_items; /* a list of items which have been eval'd and must ++ not be walked by fasd_patch_sharp */ ++}; ++ + /* + Storage manager for each type. + */ +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -144,7 +144,7 @@ struct key {short n,allow_other_keys; + /* cmpaux.c:185:OF */ extern fixnum object_to_fixnum (object x); /* (x) object x; */ + /* cmpaux.c:263:OF */ extern char *object_to_string (object x); /* (x) object x; */ + typedef int (*FUNC)(); +-/* cmpaux.c:294:OF */ extern void call_init (int init_address, object memory, object fasl_vec, FUNC fptr); /* (init_address, memory, fasl_vec, fptr) int init_address; object memory; object fasl_vec; FUNC fptr; */ ++/* cmpaux.c:294:OF */ extern void call_init (int init_address,object memory,object faslfile); /* (init_address, memory, fasl_vec, fptr) int init_address; object memory; object fasl_vec; FUNC fptr; */ + /* cmpaux.c:339:OF */ extern void do_init (object *statVV); /* (statVV) object *statVV; */ + /* cmpaux.c:416:OF */ extern void gcl_init_or_load1 (void (*fn) (void), const char *file); /* (fn, file) int (*fn)(); char *file; */ + /* conditional.c:200:OF */ extern void gcl_init_conditional (void); /* () */ +--- gcl-2.6.12.orig/o/cmpaux.c ++++ gcl-2.6.12/o/cmpaux.c +@@ -324,63 +324,18 @@ object_to_string(object x) { + /* } */ + /* #endif */ + ++ + void +-call_init(int init_address, object memory, object fasl_vec, FUNC fptr) +-{object form; +- FUNC at; +-/* #ifdef CLEAR_CACHE */ +-/* static int n; */ +-/* static sigset_t ss; */ +- +-/* if (!n) { */ +-/* struct sigaction sa={{(void *)sigh},{{0}},SA_RESTART|SA_SIGINFO,NULL}; */ +- +-/* sigaction(SIGILL,&sa,NULL); */ +-/* sigemptyset(&ss); */ +-/* sigaddset(&ss,SIGILL); */ +-/* sigprocmask(SIG_BLOCK,&ss,NULL); */ +-/* n=1; */ +-/* } */ +-/* #endif */ ++call_init(int init_address,object memory,object faslfile) { + ++ bds_bind(sSPmemory,memory); ++ bds_bind(sSPinit,faslfile); ++ ((FUNC)(memory->cfd.cfd_start+init_address))(); ++ bds_unwind1; ++ bds_unwind1; + +- check_type(fasl_vec,t_vector); +- form=(fasl_vec->v.v_self[fasl_vec->v.v_fillp -1]); ++} + +- if (fptr) at = fptr; +- else +- at=(FUNC)(memory->cfd.cfd_start+ init_address ); +- +-#ifdef VERIFY_INIT +- VERIFY_INIT +-#endif +- +- if (type_of(form)==t_cons && +- form->c.c_car == sSPinit) +- {bds_bind(sSPinit,fasl_vec); +- bds_bind(sSPmemory,memory); +-/* #ifdef CLEAR_CACHE */ +-/* sigprocmask(SIG_UNBLOCK,&ss,NULL); */ +-/* #endif */ +- (*at)(); +-/* #ifdef CLEAR_CACHE */ +-/* sigprocmask(SIG_BLOCK,&ss,NULL); */ +-/* #endif */ +- bds_unwind1; +- bds_unwind1; +- } +- else +- /* old style three arg init, with all init being done by C code. */ +- {memory->cfd.cfd_self = fasl_vec->v.v_self; +- memory->cfd.cfd_fillp = fasl_vec->v.v_fillp; +-/* #ifdef CLEAR_CACHE */ +-/* sigprocmask(SIG_UNBLOCK,&ss,NULL); */ +-/* #endif */ +- (*at)(memory->cfd.cfd_start, memory->cfd.cfd_size, memory); +-/* #ifdef CLEAR_CACHE */ +-/* sigprocmask(SIG_BLOCK,&ss,NULL); */ +-/* #endif */ +-}} + + /* statVV is the address of some static storage, which is used by the + cfunctions to refer to global variables,.. +@@ -393,48 +348,46 @@ call_init(int init_address, object memor + + */ + +-DEFUN_NEW("MARK-MEMORY-AS-PROFILING",object,fSmark_memory_as_profiling,SI,0,0, +- NONE,OO,OO,OO,OO,(void),"") { +- +- sSPmemory->s.s_dbind->cfd.cfd_prof=1; +- +- return Cnil; +- +-} +- + void +-do_init(object *statVV) +-{object fasl_vec=sSPinit->s.s_dbind; +- object data = sSPmemory->s.s_dbind; +- {object *p,*q,y; +- int n=fasl_vec->v.v_fillp -1; +- int i; +- object form; +- check_type(fasl_vec,t_vector); +- form = fasl_vec->v.v_self[n]; +- dcheck_type(form,t_cons); ++do_init(object *statVV) { ++ ++ object faslfile=sSPinit->s.s_dbind; ++ object data=sSPmemory->s.s_dbind; ++ object *p,*q,y; ++ int i,n; ++ object fasl_vec; ++ char ch; ++ ++ ch=readc_stream(faslfile); ++ unreadc_stream(ch,faslfile); ++ ++ if (ch!='\n') { ++ struct fasd * fd; ++ faslfile=FFN(fSopen_fasd)(faslfile,sKinput,OBJNULL,Cnil); ++ fd=(struct fasd *)faslfile->v.v_self; ++ n=fix(fd->table_length); ++ fd->table->v.v_self=alloca(n*sizeof(object)); ++ memset(fd->table->v.v_self,0,n*sizeof(object)); ++ fd->table->v.v_dim=faslfile->v.v_self[1]->v.v_fillp=n; ++ } + ++ n=fix(type_of(faslfile)==t_stream ? read_object(faslfile) : FFN(fSread_fasd_top)(faslfile)); ++ sSPinit->s.s_dbind=fasl_vec=fSmake_vector1_1(n,aet_object,Cnil); + + /* switch SPinit to point to a vector of function addresses */ +- ++ + fasl_vec->v.v_elttype = aet_fix; +- fasl_vec->v.v_dim *= (sizeof(object)/sizeof(fixnum)); +- fasl_vec->v.v_fillp *= (sizeof(object)/sizeof(fixnum)); +- ++ + /* swap the entries */ +- p = fasl_vec->v.v_self; ++ for (i=0,p=fasl_vec->v.v_self,q=statVV;icfd.cfd_self = statVV; +- data->cfd.cfd_fillp= n+1; +- statVV[n] = data; +- ++ data->cfd.cfd_fillp= n; ++ statVV[n-1] = data; + + /* So now the fasl_vec is a fixnum array, containing random addresses of c + functions and other stuff from the compiled code. +@@ -442,16 +395,20 @@ do_init(object *statVV) + */ + /* Now we can run the forms f1 f2 in form= (%init f1 f2 ...) */ + +- form=form->c.c_cdr; +- {object *top=vs_top; +- +- for(i=0 ; i< form->v.v_fillp; i++) +- { +- eval(form->v.v_self[i]); +- vs_top=top; +- } +- } +-}} ++ FFN(fSload_stream)(faslfile,Cnil); ++ if (type_of(faslfile)!=t_stream) ++ FFN(fSclose_fasd)(faslfile); ++ ++} ++ ++DEFUN_NEW("MARK-MEMORY-AS-PROFILING",object,fSmark_memory_as_profiling,SI,0,0, ++ NONE,OO,OO,OO,OO,(void),"") { ++ ++ sSPmemory->s.s_dbind->cfd.cfd_prof=1; ++ ++ return Cnil; ++ ++} + + #ifdef DOS + #define PATH_LIM 8 +@@ -498,14 +455,15 @@ gcl_init_or_load1(void (*fn)(void),const + if (file[strlen(file)-1]=='o') { + + object memory; +- object fasl_data; ++ object faslfile; + file=FIX_PATH_STRING(file); + + memory=new_cfdata(); + memory->cfd.cfd_start= (char *)fn; + printf("Initializing %s\n",file); fflush(stdout); +- fasl_data = read_fasl_data(file); +- call_init(0,memory,fasl_data,0); ++ faslfile=open_stream(make_simple_string(file),smm_input,Cnil,sKerror); ++ SEEK_TO_END_OFILE(faslfile->sm.sm_fp); ++ call_init(0,memory,faslfile); + + } else { + printf("loading %s\n",file); +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -35,22 +35,6 @@ object make_pathname (); + + static int needs_patching; + +- +-struct fasd { +- object stream; /* lisp object of type stream */ +- object table; /* hash table used in dumping or vector on input*/ +- object eof; /* lisp object to be returned on coming to eof mark */ +- object direction; /* holds Cnil or sKinput or sKoutput */ +- object package; /* the package symbols are in by default */ +- object index; /* integer. The current_dump index on write */ +- object filepos; /* nil or the position of the start */ +- object table_length; /* On read it is set to the size dump array needed +- or 0 +- */ +- object evald_items; /* a list of items which have been eval'd and must +- not be walked by fasd_patch_sharp */ +-}; +- + struct fasd current_fasd; + + +@@ -599,7 +583,7 @@ DEFUN_NEW("OPEN-FASD",object,fSopen_fasd + else + check_type(tabl,t_hashtable);} + massert(str==stream); +- result=alloc_simple_vector(sizeof(struct fasd)/sizeof(int),aet_object); ++ result=alloc_simple_vector(sizeof(struct fasd)/sizeof(object),aet_object); + array_allocself(result,1,Cnil); + {struct fasd *fd= (struct fasd *)result->v.v_self; + fd->table=tabl; +@@ -631,6 +615,7 @@ DEFUN_NEW("OPEN-FASD",object,fSopen_fasd + fd->index=make_fixnum(dump_index); + fd->filepos=current_fasd.filepos; + fd->package=current_fasd.package; ++ fd->table_length=current_fasd.table_length; + return result; + }} + +@@ -642,7 +627,7 @@ DEFUN_NEW("CLOSE-FASD",object,fSclose_fa + if (type_of(fd->table)==t_vector) + /* input uses a vector */ + {if (fd->table->v.v_self) +- gset(fd->table->v.v_self,0,fix(fd->index),aet_object); ++ fd->table->v.v_dim=0;/*self can be on the stack, and others write there*/ + } + else + if(fd->direction==sKoutput) +@@ -1402,66 +1387,6 @@ clrhash(object table) + table->ht.ht_self[i].hte_value = OBJNULL;} + table->ht.ht_nent =0;} + +- +- +-object read_fasl_vector1(); +-object +-read_fasl_vector(object in) +-{char ch; +- object orig = in; +- object d; +- int tem; +- if (((tem=getc(((FILE *)in->sm.sm_fp))) == EOF) && feof(((FILE *)in->sm.sm_fp))) +- { char *pf; +- coerce_to_filename(in,FN1); +- for (pf=FN1+strlen(FN1);pf>FN1 && pf[-1]!='.';pf--); +- if (pf==FN1) {pf=FN1+strlen(FN1);*pf++='.';} +- snprintf(pf,sizeof(FN1)-(pf-FN1),"data"); +- d=make_simple_string(FN1); +- in = open_stream(d,smm_input,Cnil,Cnil); +- if (in == Cnil) +- FEerror("Can't open file ~s",1,d); +- } +- else if (tem != EOF) +- { ungetc(tem,in->sm.sm_fp);} +- while (1) +- { ch=readc_stream(in); +- if (ch=='#') +- {unreadc_stream(ch,in); +- return read_fasl_vector1(in);} +- if (ch== d_begin_dump){ +- unreadc_stream(ch,in); +- break;}} +- {object ar=FFN(fSopen_fasd)(in,sKinput,0,Cnil); +- int n=fix(current_fasd.table_length); +- object result,last; +- { BEGIN_NO_INTERRUPT; +-#ifdef HAVE_ALLOCA +- current_fasd.table->v.v_self +- = (object *)alloca(n*sizeof(object)); +-#else +- current_fasd.table->v.v_self +- = (object *)alloc_relblock(n*sizeof(object)); +-#endif +- current_fasd.table->v.v_dim=n; +- current_fasd.table->v.v_fillp=n; +- gset( current_fasd.table->v.v_self,0,n,aet_object); +- END_NO_INTERRUPT; +- } +- result=FFN(fSread_fasd_top)(ar); +- if (type_of(result) !=t_vector) goto ERROR; +- last=result->v.v_self[result->v.v_fillp-1]; +- if(type_of(last)!=t_cons || last->c.c_car !=sSPinit) +- goto ERROR; +- current_fasd.table->v.v_self = 0; +- FFN(fSclose_fasd)(ar); +- if (orig != in) +- close_stream(in); +- return result; +- ERROR: FEerror("Bad fasd stream ~a",1,in); +- return Cnil; +-}} +- + object IfaslInStream; + /* static void */ + /* IreadFasdData(void) */ +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -1645,7 +1645,7 @@ DEFUN_NEW("LOAD-STREAM",object,fSload_st + for (;;) { + preserving_whitespace_flag = FALSE; + detect_eos_flag = TRUE; +- x = read_object_non_recursive(strm); ++ x = type_of(strm)==t_stream ? read_object_non_recursive(strm) : FFN(fSread_fasd_top)(strm); + if (x == OBJNULL) + break; + { +@@ -2371,75 +2371,3 @@ gcl_init_file_function() + gcl_init_readline_function(); + #endif + } +- +- +-object +-read_fasl_data(const char *str) { +- +- object faslfile, data; +-#ifndef SEEK_TO_END_OFILE +-#if defined(BSD) && defined(UNIX) +- FILE *fp; +- int i; +-#ifdef HAVE_AOUT +- struct exec header; +-#endif +-#endif +-#ifdef HAVE_FILEHDR +- struct filehdr fileheader; +-#endif +-#ifdef E15 +- struct exec header; +-#endif +-#endif +- vs_mark; +- +- faslfile = make_simple_string(str); +- vs_push(faslfile); +- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror); +- vs_push(faslfile); +- +-#ifdef SEEK_TO_END_OFILE +- SEEK_TO_END_OFILE(faslfile->sm.sm_fp); +-#else +- +-#ifdef BSD +- fp = faslfile->sm.sm_fp; +- fread(&header, sizeof(header), 1, fp); +- fseek(fp, +- header.a_text+header.a_data+ +- header.a_syms+header.a_trsize+header.a_drsize, +- 1); +- fread(&i, sizeof(i), 1, fp); +- fseek(fp, i - sizeof(i), 1); +-#endif +- +-#ifdef HAVE_FILEHDR +- fp = faslfile->sm.sm_fp; +- fread(&fileheader, sizeof(fileheader), 1, fp); +- fseek(fp, +- fileheader.f_symptr+fileheader.f_nsyms*SYMESZ, +- 0); +- fread(&i, sizeof(i), 1, fp); +- fseek(fp, i - sizeof(i), 1); +- while ((i = getc(fp)) == 0) +- ; +- ungetc(i, fp); +-#endif +- +-#ifdef E15 +- fp = faslfile->sm.sm_fp; +- fread(&header, sizeof(header), 1, fp); +- fseek(fp, +- header.a_text+header.a_data+ +- header.a_syms+header.a_trsize+header.a_drsize, +- 1); +-#endif +-#endif +- data = read_fasl_vector(faslfile); +- +- vs_push(data); +- close_stream(faslfile); +- vs_reset; +- return(data); +-} +--- gcl-2.6.12.orig/o/gprof.c ++++ gcl-2.6.12/o/gprof.c +@@ -5,6 +5,10 @@ + + static unsigned long gprof_on; + ++#ifdef DARWIN ++void _mcleanup() {} ++#endif ++ + DEFUN_NEW("MCLEANUP",object,fSmcleanup,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { + + extern void _mcleanup(void); +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -333,16 +333,16 @@ setup_READ() + backq_level = 0; + } + +-static void +-setup_standard_READ() +-{ +- READtable = standard_readtable; +- READdefault_float_format = 'F'; +- READbase = 10; +- READsuppress = FALSE; +- sSAsharp_eq_contextA->s.s_dbind=Cnil; +- backq_level = 0; +-} ++/* static void */ ++/* setup_standard_READ() */ ++/* { */ ++/* READtable = standard_readtable; */ ++/* READdefault_float_format = 'F'; */ ++/* READbase = 10; */ ++/* READsuppress = FALSE; */ ++/* sSAsharp_eq_contextA->s.s_dbind=Cnil; */ ++/* backq_level = 0; */ ++/* } */ + + object + read_char(in) +@@ -1393,28 +1393,6 @@ FFN(siLsharp_comma_reader_for_compiler)( + vs_base[0] = make_cons(siSsharp_comma, vs_base[0]); + } + +-/* +- For fasload. +-*/ +-static void +-Lsharp_exclamation_reader() +-{ +- check_arg(3); +- if(vs_base[2] != Cnil && !READsuppress) +- extra_argument('!'); +- vs_popp; +- vs_popp; +- if (READsuppress) { +- vs_base[0] = Cnil; +- return; +- } +- vs_base[0] = read_object(vs_base[0]); +- if (sSAsharp_eq_contextA->s.s_dbind!=Cnil) +- vs_base[0]=patch_sharp(vs_base[0]); +- ieval(vs_base[0]); +- vs_popp; +-} +- + static void + Lsharp_B_reader() + { +@@ -2327,8 +2305,6 @@ gcl_init_read() + dtab['*'] = make_cf(Lsharp_asterisk_reader); + dtab[':'] = make_cf(Lsharp_colon_reader); + dtab['.'] = make_cf(Lsharp_dot_reader); +- dtab['!'] = make_cf(Lsharp_exclamation_reader); +- /* Used for fasload only. */ + dtab[','] = make_cf(Lsharp_comma_reader); + dtab['B'] = dtab['b'] = make_cf(Lsharp_B_reader); + dtab['O'] = dtab['o'] = make_cf(Lsharp_O_reader); +@@ -2441,96 +2417,96 @@ gcl_init_read_function() + + object sSPinit; + +-object +-read_fasl_vector1(in) +-object in; +-{ +- int dimcount, dim; +- VOL object *vsp; +- object vspo; +- VOL object x; +- long i; +- bool e; +- object old_READtable; +- int old_READdefault_float_format; +- int old_READbase; +- int old_READsuppress; +- volatile object old_READcontext; +- int old_backq_level; +- +- /* to prevent longjmp clobber */ +- i=(long)&vsp; +- i+=i; +- vsp=&vspo; +- old_READtable = READtable; +- old_READdefault_float_format = READdefault_float_format; +- old_READbase = READbase; +- old_READsuppress = READsuppress; +- old_READcontext=sSAsharp_eq_contextA->s.s_dbind; +- /* BUG FIX by Toshiba */ +- vs_push(old_READtable); +- old_backq_level = backq_level; +- +- setup_standard_READ(); +- +- frs_push(FRS_PROTECT, Cnil); +- if (nlj_active) { +- e = TRUE; +- goto L; +- } +- +- while (readc_stream(in) != '#') +- ; +- while (readc_stream(in) != '(') +- ; +- vsp = vs_top; +- dimcount = 0; +- for (;;) { +- sSAsharp_eq_contextA->s.s_dbind=Cnil; +- backq_level = 0; +- delimiting_char = code_char(')'); +- preserving_whitespace_flag = FALSE; +- detect_eos_flag = FALSE; +- x = read_object(in); +- if (x == OBJNULL) +- break; +- vs_check_push(x); +- if (sSAsharp_eq_contextA->s.s_dbind!=Cnil) +- x = vs_head = patch_sharp(x); +- dimcount++; +- } +- if(dimcount==1 && type_of(vs_head)==t_vector) +- {/* new style where all read at once */ +- x=vs_head; +- goto DONE;} +- /* old style separately sharped, and no %init */ +- {BEGIN_NO_INTERRUPT; +- x=alloc_simple_vector(dimcount,aet_object); +- vs_push(x); +- x->v.v_self +- = (object *)alloc_relblock(dimcount * sizeof(object)); +- END_NO_INTERRUPT;} +- for (dim = 0; dim < dimcount; dim++) +- {SGC_TOUCH(x); +- x->cfd.cfd_self[dim] = vsp[dim];} ++/* object */ ++/* read_fasl_vector1(in) */ ++/* object in; */ ++/* { */ ++/* int dimcount, dim; */ ++/* VOL object *vsp; */ ++/* object vspo; */ ++/* VOL object x; */ ++/* long i; */ ++/* bool e; */ ++/* object old_READtable; */ ++/* int old_READdefault_float_format; */ ++/* int old_READbase; */ ++/* int old_READsuppress; */ ++/* volatile object old_READcontext; */ ++/* int old_backq_level; */ ++ ++/* /\* to prevent longjmp clobber *\/ */ ++/* i=(long)&vsp; */ ++/* i+=i; */ ++/* vsp=&vspo; */ ++/* old_READtable = READtable; */ ++/* old_READdefault_float_format = READdefault_float_format; */ ++/* old_READbase = READbase; */ ++/* old_READsuppress = READsuppress; */ ++/* old_READcontext=sSAsharp_eq_contextA->s.s_dbind; */ ++/* /\* BUG FIX by Toshiba *\/ */ ++/* vs_push(old_READtable); */ ++/* old_backq_level = backq_level; */ ++ ++/* setup_standard_READ(); */ ++ ++/* frs_push(FRS_PROTECT, Cnil); */ ++/* if (nlj_active) { */ ++/* e = TRUE; */ ++/* goto L; */ ++/* } */ ++ ++/* while (readc_stream(in) != '#') */ ++/* ; */ ++/* while (readc_stream(in) != '(') */ ++/* ; */ ++/* vsp = vs_top; */ ++/* dimcount = 0; */ ++/* for (;;) { */ ++/* sSAsharp_eq_contextA->s.s_dbind=Cnil; */ ++/* backq_level = 0; */ ++/* delimiting_char = code_char(')'); */ ++/* preserving_whitespace_flag = FALSE; */ ++/* detect_eos_flag = FALSE; */ ++/* x = read_object(in); */ ++/* if (x == OBJNULL) */ ++/* break; */ ++/* vs_check_push(x); */ ++/* if (sSAsharp_eq_contextA->s.s_dbind!=Cnil) */ ++/* x = vs_head = patch_sharp(x); */ ++/* dimcount++; */ ++/* } */ ++/* if(dimcount==1 && type_of(vs_head)==t_vector) */ ++/* {/\* new style where all read at once *\/ */ ++/* x=vs_head; */ ++/* goto DONE;} */ ++/* /\* old style separately sharped, and no %init *\/ */ ++/* {BEGIN_NO_INTERRUPT; */ ++/* x=alloc_simple_vector(dimcount,aet_object); */ ++/* vs_push(x); */ ++/* x->v.v_self */ ++/* = (object *)alloc_relblock(dimcount * sizeof(object)); */ ++/* END_NO_INTERRUPT;} */ ++/* for (dim = 0; dim < dimcount; dim++) */ ++/* {SGC_TOUCH(x); */ ++/* x->cfd.cfd_self[dim] = vsp[dim];} */ + + +- DONE: +- e = FALSE; ++/* DONE: */ ++/* e = FALSE; */ + +-L: +- frs_pop(); ++/* L: */ ++/* frs_pop(); */ + +- READtable = old_READtable; +- READdefault_float_format = old_READdefault_float_format; +- READbase = old_READbase; +- READsuppress = old_READsuppress; +- sSAsharp_eq_contextA->s.s_dbind=old_READcontext; +- backq_level = old_backq_level; +- if (e) { +- nlj_active = FALSE; +- unwind(nlj_fr, nlj_tag); +- } +- vs_top = (object *)vsp; +- return(x); +-} ++/* READtable = old_READtable; */ ++/* READdefault_float_format = old_READdefault_float_format; */ ++/* READbase = old_READbase; */ ++/* READsuppress = old_READsuppress; */ ++/* sSAsharp_eq_contextA->s.s_dbind=old_READcontext; */ ++/* backq_level = old_backq_level; */ ++/* if (e) { */ ++/* nlj_active = FALSE; */ ++/* unwind(nlj_fr, nlj_tag); */ ++/* } */ ++/* vs_top = (object *)vsp; */ ++/* return(x); */ ++/* } */ +--- gcl-2.6.12.orig/o/sfasl.c ++++ gcl-2.6.12/o/sfasl.c +@@ -80,619 +80,5 @@ DEFUN_NEW("FIND-SYM-PTABLE",object,fSfin + #ifdef SEPARATE_SFASL_FILE + #include SEPARATE_SFASL_FILE + #else +- +-#include "ext_sym.h" +-struct node * find_sym(); +-int node_compare(); +-#ifndef _WIN32 +-void *malloc(); +-void *bsearch(); +-#endif +- +-struct reloc relocation_info; +-/* next 5 static after debug */ +- +-int debug; +- +-#ifdef DEBUG +-#define debug sfasldebug +-int sfasldebug=0; +-#define dprintf(s,ar) if(debug) { printf(" ( s )",ar) ; fflush(stdout);} +-#define STAT +- +-#else /* end debug */ +-#define dprintf(s,ar) +-#define STAT static +-#endif +- +-#ifndef MAXPATHLEN +-#define MAXPATHLEN 256 +-#endif +-#define PTABLE_EXTRA 20 +- +-struct sfasl_info { +- struct syment *s_symbol_table; +- char *s_start_address; +- char *s_start_data; +- char *s_start_bss; +- char *s_my_string_table; +- int s_extra_bss; +- char *s_the_start; +- +-}; +-struct sfasl_info *sfaslp; +- +-#define symbol_table sfaslp->s_symbol_table +-#define start_address sfaslp->s_start_address +-#define my_string_table sfaslp->s_my_string_table +-#define extra_bss sfaslp->s_extra_bss +-#define the_start sfaslp->s_the_start +- +- +-#ifndef describe_sym +-#define describe_sym(a) +-#endif +- +-#ifdef STAND +-#include "rel_stand.c" +-#endif +- +-/* begin reloc_file */ +-#include RELOC_FILE +- +-/* end reloc_file */ +-int get_extra_bss ( struct syment *sym_table, int length, int start, int *ptr, int bsssize); +-void relocate_symbols ( unsigned int length ); +-void set_symbol_address ( struct syment *sym, char *string ); +- +-int +-fasload(faslfile) +-object faslfile; +-{ long fasl_vector_start; +- struct filehdr fileheader; +- struct sfasl_info sfasl_info_buf; +-#ifdef COFF +- struct scnhdr section[10]; +- struct aouthdr header; +-#endif +- int textsize, datasize, bsssize,nsyms; +-#if defined ( READ_IN_STRING_TABLE ) || defined ( HPUX ) +- int string_size=0; +-#endif +- +- object memory, data; +- FILE *fp; +- char filename[MAXPATHLEN]; +- int i; +- int init_address=0; +-#ifndef STAND +- object *old_vs_base = vs_base; +- object *old_vs_top = vs_top; +-#endif +- sfaslp = &sfasl_info_buf; +- +- extra_bss=0; +-#ifdef STAND +- strcpy(filename,faslfile); +- fp=fopen(filename,"r"); +-#else +- coerce_to_filename(faslfile, filename); +- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror); +- vs_push(faslfile); +- fp = faslfile->sm.sm_fp; +-#endif +- +- HEADER_SEEK(fp); +- if(!fread((char *)&fileheader, sizeof(struct filehdr), 1, fp)) +- FEerror("Could not get the header",0,0); +- nsyms = NSYMS(fileheader); +-#ifdef COFF +- +-#ifdef AIX3 +- setup_for_aix_load(); +-#endif +- +- fread(&header,1,fileheader.f_opthdr,fp); +- +- fread(§ion[1],fileheader.f_nscns,sizeof (struct scnhdr),fp); +- textsize = section[TEXT_NSCN].s_size; +- datasize = section[DATA_NSCN].s_size; +- if (strcmp(section[BSS_NSCN].s_name, ".bss") == 0) +- bsssize=section[BSS_NSCN].s_size; +- else bsssize=section[BSS_NSCN].s_size = 0; +-#endif +- +-#ifdef BSD +- textsize=fileheader.a_text; +- datasize=fileheader.a_data; +- bsssize=fileheader.a_bss; +-#endif +- symbol_table = +- (struct syment *) OUR_ALLOCA(sizeof(struct syment)* +- (unsigned int)nsyms); +- fseek(fp,(int)( N_SYMOFF(fileheader)), 0); +- { +- for (i = 0; i < nsyms; i++) +- { fread((char *)&symbol_table[i], SYMESZ, 1, fp); +- dprintf( symbol table %d , i); +- if (debug) describe_sym(i); +- dprintf( at %d , &symbol_table[i]); +-#ifdef HPUX +- symbol_table[i].n_un.n_strx = string_size; +- dprintf(string_size %d, string_size); +- string_size += symbol_table[i].n_length + 1; +- fseek(fp,(int)symbol_table[i].n_length,1); +-#endif +- } +- } +-/* +-on MP386 +-The sizeof(struct syment) = 20, while only SYMESZ =18. So we had to read +-one at a time. +-fread((char *)symbol_table, SYMESZ*fileheader.f_nsyms,1,fp); +-*/ +- +-#ifdef READ_IN_STRING_TABLE +- +-my_string_table=READ_IN_STRING_TABLE(fp,string_size); +- +-#else +-#ifdef MUST_SEEK_TO_STROFF +- fseek(fp,N_STROFF(fileheader),0); +-#endif +- {int ii=0; +- if (!fread((char *)&ii,sizeof(int),1,fp)) +- {FEerror("The string table of this file did not have any length",0, +- 0);} +- fseek(fp,-4,1); +- /* at present the string table is located just after the symbols */ +- my_string_table=OUR_ALLOCA((unsigned int)ii); +- dprintf( string table leng = %d, ii); +- +- if(ii!=fread(my_string_table,1,ii,fp)) +- FEerror("Could not read whole string table",0,0) ; +- } +-#endif +-#ifdef SEEK_TO_END_OFILE +-SEEK_TO_END_OFILE(fp); +-#else +- while ((i = getc(fp)) == 0) +- ; +- ungetc(i, fp); +-#endif +- +- fasl_vector_start=ftell(fp); +- +- if (!((c_table.ptable) && *(c_table.ptable))) +- build_symbol_table(); +- +-/* figure out if there is more bss space needed */ +- extra_bss=get_extra_bss(symbol_table,nsyms,datasize+textsize+bsssize, +- &init_address,bsssize); +- +-/* allocate some memory */ +-#ifndef STAND +- {BEGIN_NO_INTERRUPT; +- memory=new_cfdata(); +- memory->cfd.cfd_size = datasize+textsize+bsssize + extra_bss; +- vs_push(memory); +- the_start=start_address= +- memory->cfd.cfd_start= +- alloc_contblock(memory->cfd.cfd_size); +- sfaslp->s_start_data = start_address + textsize; +- sfaslp->s_start_bss = start_address + textsize + datasize; +- END_NO_INTERRUPT; +- } +-#else +- the_start = start_address +- = malloc ( datasize + textsize + bsssize + extra_bss ); +- sfaslp->s_start_data = start_address + textsize; +- sfaslp->s_start_bss = start_address + textsize + datasize; +-#endif +- +- dprintf( code size %d , datasize+textsize+bsssize + extra_bss); +- if (fseek(fp,N_TXTOFF(fileheader) ,0) < 0) +- FEerror("file seek error",0,0); +- SAFE_FREAD(the_start, textsize + datasize, 1, fp); +- dprintf(read into memory text +data %d bytes, textsize + datasize); +-/* relocate the actual loaded text */ +- +- dprintf( the_start %x, the_start); +- +- /* record which symbols are used */ +- +-#ifdef SYM_USED +- {int j=0; +- for(j=1; j< BSS_NSCN ; j++) +- { dprintf( relocating section %d \n,j); +- if (section[j].s_nreloc) fseek(fp,section[j].s_relptr,0); +- for(i=0; i < section[j].s_nreloc; i++) +- { struct syment *sym; +- fread(&relocation_info, RELSZ, 1, fp); +- sym = & symbol_table[relocation_info.r_symndx]; +- if (TC_SYMBOL_P(sym)) +- SYM_USED(sym) = 1; +- }}} +-#endif +- +- +- /* this looks up symbols in c.ptable and also adds new externals to +- that c.table */ +- relocate_symbols(NSYMS(fileheader)); +- +-#ifdef COFF +- {int j=0; +- for(j=1; j< BSS_NSCN ; j++) +- { dprintf( relocating section %d \n,j); +- if (section[j].s_nreloc) fseek(fp,section[j].s_relptr,0); +-#ifdef ADJUST_RELOC_START +-ADJUST_RELOC_START(j) +-#endif +- for(i=0; i < section[j].s_nreloc; i++) +- /* RELSZ = sizeof(relocation_info) */ +- {fread(&relocation_info, RELSZ, 1, fp); +- dprintf(relocating %d,i); +- relocate();}; +- }}; +-#endif +-#ifdef BSD +- fseek(fp,N_RELOFF(fileheader),0); +- {int nrel = (fileheader.a_trsize/sizeof(struct reloc)); +- for (i=0; i < nrel; i++) +- {fread((char *)&relocation_info, sizeof(struct reloc), +- 1, fp); +- dprintf(relocating %d,i); +- relocate(); +- } +- } +-#ifdef N_DRELOFF +- fseek (fp, N_DRELOFF(fileheader), 0); +-#endif +- {int nrel = (fileheader.a_drsize/sizeof(struct reloc)); +- the_start += fileheader.a_text; +- for (i=0; i < nrel; i++) +- +- {fread((char *)&relocation_info, sizeof(struct reloc), +- 1, fp); +- dprintf(relocating %d,i); +- relocate(); +- } +- } +-#endif +- +-/* end of relocation */ +- dprintf( END OF RELOCATION \n,0); +- dprintf( invoking init function at %x, start_address) +- dprintf( textsize is %x,textsize); +- dprintf( datasize is %x,datasize); +- +-/* read in the fasl vector */ +- fseek(fp,fasl_vector_start,0); +- if (feof(fp)) +- {data=0;} +- else{ +- data = read_fasl_vector(faslfile); +- vs_push(data); +-#ifdef COFF +- dprintf( read fasl now symbols %d , fileheader.f_nsyms); +-#endif +- } +- close_stream(faslfile); +- +-/* +- { +- int fd; +- +- fd = creat ("xsgcl.bits", 0777); +- write (fd, memory->cfd.cfd_start, textsize + datasize); +- close (fd); +- +- fd = open ("xsl2.bits", 0); +- read (fd, memory->cfd.cfd_start, memory->cfd.cfd_size); +- close (fd); +- } +-*/ +- +-#ifndef STAND +- ALLOCA_FREE(my_string_table); +- ALLOCA_FREE(symbol_table); +- +- +-#ifdef CLEAR_CACHE +- CLEAR_CACHE; +-#endif +- call_init(init_address,memory,data,0); +- +- vs_base = old_vs_base; +- vs_top = old_vs_top; +- if(symbol_value(sLAload_verboseA)!=Cnil) +- printf("start address -T %x ", memory->cfd.cfd_start); +- return(memory->cfd.cfd_size); +-#endif +- {FILE *out; +- out=fopen("/tmp/sfasltest","w"); +- fwrite((char *)&fileheader, sizeof(struct filehdr), 1, out); +- fwrite(start_address,sizeof(char),datasize+textsize,out); +- fclose(out);} +- printf("\n(start %x)\n",start_address); +- +-} +- +-int get_extra_bss(sym_table,length,start,ptr,bsssize) +- int length,bsssize; +- struct syment *sym_table; +- int *ptr; /* store init address offset here */ +-{ +- int result = start; +- +-#ifdef AIX3 +- int next_bss = start - bsssize; +-#endif +- +- struct syment *end,*sym; +- +-#ifdef BSD +- char tem[SYMNMLEN +1]; +-#endif +- +- end =sym_table + length; +- for(sym=sym_table; sym < end; sym++) +- { +- +-#ifdef FIND_INIT +- FIND_INIT +-#endif +- +-#ifdef AIX3 +- /* we later go through the relocation entries making this 1 +- for symbols used */ +-#ifdef SYM_USED +- if(TC_SYMBOL_P(sym)) +- {SYM_USED(sym) = 0;} +-#endif +- +- /* fix up the external refer to _ptrgl to be local ref */ +- if (sym->n_scnum == 0 && +- strcmp(sym->n_name,"_ptrgl")==0) +- {struct syment* s = +- get_symbol("._ptrgl",TEXT_NSCN,sym_table,length); +- if (s ==0) FEerror("bad glue",0,0); +- sym->n_value = next_bss ; +- ptrgl_offset = next_bss; +- ptrgl_text = s->n_value; +- next_bss += 0xc; +- sym->n_scnum = DATA_NSCN; +- ((union auxent *)(sym+1))->x_csect.x_scnlen = 0xc; +- +- } +- +- if(sym->n_scnum != BSS_NSCN) goto NEXT; +- if(SYM_EXTERNAL_P(sym)) +- {int val=sym->n_value; +- struct node joe; +- if (val && c_table.ptable) +- {struct node *answ; +- answ= find_sym(sym,0); +- if(answ) +- {sym->n_value = answ->address ; +- sym->n_scnum = N_UNDEF; +- val= ((union auxent *)(sym+1))->x_csect.x_scnlen; +- result -= val; +- goto NEXT; +- }} +- } +- /* reallocate the bss space */ +- if (sym->n_value == 0) +- {result += ((union auxent *)(sym+1))->x_csect.x_scnlen;} +- sym->n_value = next_bss; +- next_bss += ((union auxent *)(sym+1))->x_csect.x_scnlen; +- NEXT: +- ; +- /* end aix3 */ +-#endif +- +- +- +-#ifdef BSD +- tem; /* ignored */ +- if(SYM_EXTERNAL_P(sym) && SYM_UNDEF_P(sym)) +-#endif +-#ifdef COFF +- if(0) +- /* what we really want is +- if (sym->n_scnum==0 && sym->n_sclass == C_EXT +- && !(bsearch(..in ptable for this symbol))) +- Since this won't allow loading in of a new external array +- char foo[10] not ok +- static foo[10] ok. +- for the moment we give undefined symbol warning.. +- Should really go through the symbols, recording the external addr +- for ones found in ptable, and for the ones not in ptable +- set some flag, and add up the extra_bss required. Then +- when you have the new memory chunk in hand, +- you could make the pass setting the relative addresses. +- for the ones you flagged last time. +- */ +-#endif +- /* external bss so not included in size of bss for file */ +- {int val=sym->n_value; +- if (val && c_table.ptable +- && (0== find_sym(sym,0))) +- { sym->n_value=result; +- result += val;}} +- +- sym += NUM_AUX(sym); +- +- } +- return (result-start); +-} +- +- +- +-/* go through the symbol table changing the addresses of the symbols +-to reflect the current cfd_start */ +- +- +-void +-relocate_symbols(length) +-unsigned int length; +-{struct syment *end,*sym; +- unsigned int typ; +- char *str; +- char tem[SYMNMLEN +1]; +- tem[SYMNMLEN]=0; +- int n_value=(int)start_address; +- +- end =symbol_table + length; +- for(sym=symbol_table; sym < end; sym++) { +- typ=NTYPE(sym); +-#ifdef BSD +-#ifdef N_STAB +- if (N_STAB & sym->n_type) continue;/* skip: It is for dbx only */ +-#endif +- typ=N_SECTION(sym); +-/* if(sym->n_type & N_EXT) should add the symbol name, +- so it would be accessible by future loads */ +-#endif +- switch (typ) { +-#ifdef BSD +- case N_ABS : case N_TEXT: case N_DATA: case N_BSS: +-#endif +-#ifdef COFF +- case TEXT_NSCN : case DATA_NSCN: case BSS_NSCN : +-#ifdef _WIN32 +- if (typ==DATA_NSCN) +- n_value = (int)sfaslp->s_start_data; +- if (typ==BSS_NSCN) +- n_value = (int)sfaslp->s_start_bss; +- if (typ==TEXT_NSCN) +- n_value = (int)start_address; +-#endif /* _WIN32 */ +-#endif /* COFF */ +- str=SYM_NAME(sym); +- dprintf( for sym %s ,str) +- dprintf( new value will be start %x, start_address); +- +-#ifdef AIX3 +- if(N_SECTION(sym) == DATA_NSCN +- && NUM_AUX(sym) +- && allocate_toc(sym)) +- break; +-#endif +- sym->n_value = n_value; +- break; +- case N_UNDEF: +- str=SYM_NAME(sym); +- dprintf( undef symbol %s ,str); +- dprintf( symbol diff %d , sym - symbol_table); +- describe_sym(sym-symbol_table); +- set_symbol_address(sym,str); +- describe_sym(sym-symbol_table); +- break; +- default: +-#ifdef COFF +- dprintf(am ignoring a scnum %d,(sym->n_scnum)); +-#endif +- break; +- } +- sym += NUM_AUX(sym); +- } +-} +- +-/* +-STEPS: +-1) read in the symbol table from the file, +-2) go through the symbol table, relocating external entries. +-3) for i <=2 go thru the relocation information for this section +- relocating the text. +-4) done. +-*/ +- +-struct node * +-find_sym(sym,name) +- struct syment *sym; +- char *name; +-{ char tem[SYMNMLEN +1]; +- tem [SYMNMLEN] = 0; +- if (name==0) name = SYM_NAME(sym); +- return find_sym_ptable(name);} +- +-void +-set_symbol_address(sym,string) +-struct syment *sym; +-char *string; +-{struct node *answ; +- if (c_table.ptable) +- { +- dprintf(string %s, string); +- answ = find_sym(sym,string); +- dprintf(answ %d , (answ ? answ->address : -1)); +- if(answ) +- { +-#ifdef COFF +-#ifdef _AIX370 +- if (NTYPE(sym) == N_UNDEF) +- sym->n_value = answ->address; +- else +-#endif +- sym->n_value = answ->address -sym->n_value; +- /* for symbols in the local data,text and bss this gets added +- on when we add the current value */ +-#endif +-#ifdef BSD +- /* the old value of sym->n_value is the length of the common area +- starting at this address */ +- sym->n_value = answ->address; +-#endif +-#ifdef AIX3 +- fix_undef_toc_address(answ,sym,string); +-#endif +- +-} +- else +- { +-/* +-#ifdef BSD +- {char *name; +- name=malloc(1+strlen(string)); +- strcpy(name,string); +- sym->n_value = sym->n_value + (unsigned int) the_start; +- add_symbol(name,sym->n_value,NULL); +- } +-#endif +-*/ +- fprintf(stdout,"undefined %s symbol",string) +- ;fflush(stdout); +- +- }} +- +- else{FEerror("symbol table not loaded",0,0);}} +- +-/* include the machine independent stuff */ +-#include "sfasli.c" +- +- +-#ifdef DEBUG +-print_name(p) +- struct syment *p; +-{char tem[10],*name; +- name=SYM_NAME(p); +- name= (((p)->_n._n_n._n_zeroes == 0) ? +- &my_string_table[(p)->_n._n_n._n_offset] : +- ((p)->_n._n_name[SYMNMLEN -1] ? +- (strncpy(tem,(p)->_n._n_name, +- SYMNMLEN), +- (char *)tem) : +- (p)->_n._n_name )); +- +- printf("(name:|%s|)",name); +- printf("(sclass 0x%x)",p->n_sclass); +- printf("(external_p 0x%x)",SYM_EXTERNAL_P(p)); +- printf("(n_type 0x%x)",p->n_type); +- printf("(n_value 0x%x)",p->n_value); +- printf("(numaux 0x%x)\n",NUM_AUX(p)); +- fflush(stdout); +-} +-#endif +- ++#error must define SEPARATE_SFASL_FILE + #endif /* SEPARATE_SFASL_FILE */ +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -443,7 +443,6 @@ fasload(object faslfile) { + fseek(fp,(void *)ste-st,0); + while ((i = getc(fp)) == 0); + ungetc(i, fp); +- data = read_fasl_vector(faslfile); + + massert(!un_mmap(st,est)); + +@@ -451,7 +450,7 @@ fasload(object faslfile) { + CLEAR_CACHE; + #endif + +- call_init(init_address,memory,data,0); ++ call_init(init_address,memory,faslfile); + + if(symbol_value(sLAload_verboseA)!=Cnil) + printf("start address -T %p ", memory->cfd.cfd_start); +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -550,7 +550,7 @@ fasload(object faslfile) { + FILE *fp; + char *sn,*st1,*dst1; + ul init_address=0,end,gs=0,*got=&gs,*gote=got+1; +- object memory,data; ++ object memory; + Shdr *sec1,*sece; + Sym *sym1,*syme,*dsym1,*dsyme; + void *v1,*ve; +@@ -574,7 +574,6 @@ fasload(object faslfile) { + massert(!relocate_code(v1,sec1,sece,sym1,got,gote)); + + massert(!fseek(fp,end,SEEK_SET)); +- data=feof(fp) ? 0 : read_fasl_vector(faslfile); + + massert(!un_mmap(v1,ve)); + +@@ -587,7 +586,7 @@ fasload(object faslfile) { + #endif + + init_address-=(ul)memory->cfd.cfd_start; +- call_init(init_address,memory,data,0); ++ call_init(init_address,memory,faslfile); + + if(symbol_value(sLAload_verboseA)!=Cnil) + printf("start address -T %p ",memory->cfd.cfd_start); +--- gcl-2.6.12.orig/o/sfaslmacho.c ++++ gcl-2.6.12/o/sfaslmacho.c +@@ -421,7 +421,7 @@ load_self_symbols() { + + for (a=c_table.ptable,sym=sym1;symn_type & N_STAB || !(sym->n_type & N_EXT)) ++ if ((sym->n_type & N_STAB) || !(sym->n_type & N_EXT)) + continue; + + a->address=sym->n_value; +@@ -435,10 +435,9 @@ load_self_symbols() { + c_table.length=a-c_table.ptable; + qsort(c_table.ptable,c_table.length,sizeof(*c_table.ptable),node_compare); + +- c_table.local_ptable=a; +- for (a=c_table.ptable,sym=sym1;symn_type & N_STAB || sym->n_type & N_EXT) ++ if ((sym->n_type & N_STAB) || sym->n_type & N_EXT) + continue; + + a->address=sym->n_value; +@@ -536,7 +535,6 @@ int + fasload(object faslfile) { + + FILE *fp; +- object data; + ul init_address=-1; + object memory; + void *v1,*ve,*p; +@@ -564,7 +562,6 @@ fasload(object faslfile) { + relocate_code(v1,sec1,sece,&p,io1,n1,got,gote,start); + + fseek(fp,(void *)ste-v1,SEEK_SET); +- data = feof(fp) ? 0 : read_fasl_vector(faslfile); + + massert(!clear_protect_memory(memory)); + +@@ -575,7 +572,7 @@ fasload(object faslfile) { + massert(!un_mmap(v1,ve)); + + init_address-=(ul)memory->cfd.cfd_start; +- call_init(init_address,memory,data,0); ++ call_init(init_address,memory,faslfile); + + if(symbol_value(sLAload_verboseA)!=Cnil) + printf("start address -T %p ",memory->cfd.cfd_start); +--- gcl-2.6.12.orig/o/sfaslmacosx.c ++++ gcl-2.6.12/o/sfaslmacosx.c +@@ -228,8 +228,6 @@ int fasload (object faslfile) + sfasl_error ("error seeking to end of object file"); + } + +- data = read_fasl_vector (faslstream); +- + close_stream (faslstream); + + memory=new_cfdata(); +@@ -237,7 +235,7 @@ int fasload (object faslfile) + if (symbol_value (sLAload_verboseA) != Cnil) + printf (" start address (dynamic) %p ", fptr); + +- call_init (0, memory, data, fptr); ++ call_init (0,memory,faslstream); + + unlink (tmpfile); + +--- gcl-2.6.12.orig/o/unixfasl.c ++++ gcl-2.6.12/o/unixfasl.c +@@ -78,197 +78,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + #endif + + #ifndef SFASL +-int +-fasload(faslfile) +-object faslfile; +-{ +- +-#ifdef BSD +- struct exec header, newheader; +-#endif +- +-#ifdef ATT +- struct filehdr fileheader; +- struct scnhdr sectionheader; +- int textsize, datasize, bsssize; +- int textstart; +-#endif +- +-#ifdef E15 +- struct exec header; +-#define textsize header.a_text +-#define datasize header.a_data +-#define bsssize header.a_bss +-#define textstart sizeof(header) +-#endif +- +- object memory, data, tempfile; +- FILE *fp; +- char filename[MAXPATHLEN]; +- char tempfilename[32]; +- char command[MAXPATHLEN * 2]; +- int i; +- object *old_vs_base = vs_base; +- object *old_vs_top = vs_top; +-#ifdef IBMRT +- +-#endif +- +- coerce_to_filename(faslfile, filename); +- +- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror); +- vs_push(faslfile); +- fp = faslfile->sm.sm_fp; +- /* seek to beginning of the header */ +- +- HEADER_SEEK(fp); +- +-#ifdef BSD +- fread(&header, sizeof(header), 1, fp); +-#endif +-#ifdef ATT +- fread(&fileheader, sizeof(fileheader), 1, fp); +-#ifdef S3000 +- if(fileheader.f_opthdr != 0) fseek(fp,fileheader.f_opthdr,1); +-#endif +- fread(§ionheader, sizeof(sectionheader), 1, fp); +- textsize = sectionheader.s_size; +- textstart = sectionheader.s_scnptr; +- fread(§ionheader, sizeof(sectionheader), 1, fp); +- datasize = sectionheader.s_size; +- fread(§ionheader, sizeof(sectionheader), 1, fp); +- if (strcmp(sectionheader.s_name, ".bss") == 0) +- bsssize = sectionheader.s_size; +- else +- bsssize = 0; +-#endif +-#ifdef E15 +- fread(&header, sizeof(header), 1, fp); +-#endif +- +- memory=new_cfdata(); +- memory->cfd.cfd_size = textsize + datasize + bsssize; +- vs_push(memory); +- /* If the file is smaller than the space asked for, typically the file +- is an invalid object file */ +- if (file_len(fp)*4 < memory->cfd.cfd_size) +- FEerror("Invalid object file stream: ~a",1,faslfile); +- memory->cfd.cfd_start = ALLOC_ALIGNED(alloc_contblock, +- memory->cfd.cfd_size,sizeof(double)); +- +-#ifdef SEEK_TO_END_OFILE +-SEEK_TO_END_OFILE(fp); +-#else +-#ifdef BSD +- fseek(fp, +- header.a_text+header.a_data+ +- header.a_syms+header.a_trsize+header.a_drsize, +- 1); +- fread(&i, sizeof(i), 1, fp); +- fseek(fp, i - sizeof(i), 1); +-#endif +- +-#ifdef ATT +- fseek(fp, +- fileheader.f_symptr + SYMESZ*fileheader.f_nsyms, +- 0); +- fread(&i, sizeof(i), 1, fp); +- fseek(fp, i - sizeof(i), 1); +- while ((i = getc(fp)) == 0) +- ; +- ungetc(i, fp); +-#endif +- +-#ifdef E15 +- fseek(fp, +- header.a_text+header.a_data+ +- header.a_syms+header.a_trsize+header.a_drsize, +- 1); +-#endif +-#endif +- data = read_fasl_vector(faslfile); +- vs_push(data); +- close_stream(faslfile); +- +- sprintf(tempfilename, "/tmp/fasltemp%d", getpid()); +- +-AGAIN: +- +-#ifdef BSD +- LD_COMMAND(command, +- kcl_self, +- memory->cfd.cfd_start, +- filename, +- " ", +- tempfilename); +- if(symbol_value(sLAload_verboseA)!=Cnil) +- printf("start address -T %x ",memory->cfd.cfd_start); +-#endif +-#ifdef ATT +- coerce_to_filename(symbol_value(sSAsystem_directoryA), +- system_directory); +- sprintf(command, +- "%sild %s %d %s %s", +- system_directory, +- kcl_self, +- memory->cfd.cfd_start, +- filename, +- tempfilename); +-#endif +-#ifdef E15 +- coerce_to_filename(symbol_value(sSAsystem_directoryA), +- system_directory); +- sprintf(command, +- "%sild %s %d %s %s", +- system_directory, +- kcl_self, +- memory->cfd.cfd_start, +- filename, +- tempfilename); +-#endif +- +- if (system(command) != 0) +- FEerror("The linkage editor failed.", 0); +- +- tempfile = make_simple_string(tempfilename); +- vs_push(tempfile); +- tempfile = open_stream(tempfile, smm_input, Cnil, sKerror); +- vs_push(tempfile); +- fp = tempfile->sm.sm_fp; +- +- HEADER_SEEK(fp); +- +-#ifdef BSD +- fread(&newheader, sizeof(header), 1, fp); +- if (newbsssize != bsssize) { +- insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size); +- bsssize = newbsssize; +- memory->cfd.cfd_start = NULL; +- memory->cfd.cfd_size = textsize + datasize + bsssize; +- memory->cfd.cfd_start = ALLOC_ALIGNED(alloc_contblock,memory->cfd.cfd_size, +- sizeof( double)); +- close_stream(tempfile); +- unlink(tempfilename); +- goto AGAIN; +- } +-#endif +- +- if (fseek(fp, textstart, 0) < 0) +- error("file seek error"); +- +- fread(memory->cfd.cfd_start, textsize + datasize, 1, fp); +- +- close_stream(tempfile); +- +- unlink(tempfilename); +- +- call_init(0,memory,data,0); +- +- vs_base = old_vs_base; +- vs_top = old_vs_top; +- +- return(memory->cfd.cfd_size); +-} ++#error must define SFASL + #endif /* ifndef SFASL */ + + #ifndef __svr4__ diff --git a/debian/patches/Version_2_6_13pre55 b/debian/patches/Version_2_6_13pre55 new file mode 100644 index 0000000..6b4b782 --- /dev/null +++ b/debian/patches/Version_2_6_13pre55 @@ -0,0 +1,132 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-67) unstable; urgency=medium + . + * Version_2_6_13pre55 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-03 + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -374,3 +374,5 @@ EXTER gmp_randfnptr_t Mersenne_Twister_G + #endif + + #define collect(p_,f_) (p_)=&(*(p_)=(f_))->c.c_cdr ++#define READ_STREAM_OR_FASD(strm_) \ ++ type_of(strm_)==t_stream ? read_object_non_recursive(strm_) : fSread_fasd_top(strm_) +--- gcl-2.6.12.orig/o/cmpaux.c ++++ gcl-2.6.12/o/cmpaux.c +@@ -363,7 +363,7 @@ do_init(object *statVV) { + + if (ch!='\n') { + struct fasd * fd; +- faslfile=FFN(fSopen_fasd)(faslfile,sKinput,OBJNULL,Cnil); ++ faslfile=fSopen_fasd(faslfile,sKinput,OBJNULL,Cnil); + fd=(struct fasd *)faslfile->v.v_self; + n=fix(fd->table_length); + fd->table->v.v_self=alloca(n*sizeof(object)); +@@ -371,7 +371,7 @@ do_init(object *statVV) { + fd->table->v.v_dim=faslfile->v.v_self[1]->v.v_fillp=n; + } + +- n=fix(type_of(faslfile)==t_stream ? read_object(faslfile) : FFN(fSread_fasd_top)(faslfile)); ++ n=fix(READ_STREAM_OR_FASD(faslfile)); + sSPinit->s.s_dbind=fasl_vec=fSmake_vector1_1(n,aet_object,Cnil); + + /* switch SPinit to point to a vector of function addresses */ +@@ -395,9 +395,9 @@ do_init(object *statVV) { + */ + /* Now we can run the forms f1 f2 in form= (%init f1 f2 ...) */ + +- FFN(fSload_stream)(faslfile,Cnil); ++ fSload_stream(faslfile,Cnil); + if (type_of(faslfile)!=t_stream) +- FFN(fSclose_fasd)(faslfile); ++ fSclose_fasd(faslfile); + + } + +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -561,6 +561,13 @@ DEFUN_NEW("READ-FASD-TOP",object,fSread_ + { RESTORE_FASD; + return result;} + } ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fSread_fasd_top(object x) { ++ return FFN(fSread_fasd_top)(x); ++} ++#endif ++ + + object sLeq; + object sSPinit; +@@ -618,6 +625,12 @@ DEFUN_NEW("OPEN-FASD",object,fSopen_fasd + fd->table_length=current_fasd.table_length; + return result; + }} ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fSopen_fasd(object stream, object direction, object eof, object tabl) { ++ return FFN(fSopen_fasd)(stream,direction,eof,tabl); ++} ++#endif + + DEFUN_NEW("CLOSE-FASD",object,fSclose_fasd,SI,1,1,NONE,OO,OO,OO,OO,(object ar),"") + /* static object */ +@@ -649,6 +662,12 @@ DEFUN_NEW("CLOSE-FASD",object,fSclose_fa + return ar; + + } ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fSclose_fasd(object ar) { ++ return FFN(fSclose_fasd)(ar); ++} ++#endif + + + #define HASHP(x) 1 +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -1645,8 +1645,7 @@ DEFUN_NEW("LOAD-STREAM",object,fSload_st + for (;;) { + preserving_whitespace_flag = FALSE; + detect_eos_flag = TRUE; +- x = type_of(strm)==t_stream ? read_object_non_recursive(strm) : FFN(fSread_fasd_top)(strm); +- if (x == OBJNULL) ++ if ((x = READ_STREAM_OR_FASD(strm))==OBJNULL) + break; + { + object *base = vs_base, *top = vs_top, *lex = lex_env; +@@ -1672,6 +1671,12 @@ DEFUN_NEW("LOAD-STREAM",object,fSload_st + RETURN1(Ct); + + } ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fSload_stream(object strm,object print) { ++ return FFN(fSload_stream)(strm,print); ++} ++#endif + + DEFUN_NEW("LOAD-FASL",object,fSload_fasl,SI,2,2,NONE,OO,OO,OO,OO,(object fasl_filename,object print),"") { + diff --git a/debian/patches/Version_2_6_13pre56 b/debian/patches/Version_2_6_13pre56 new file mode 100644 index 0000000..94a7be8 --- /dev/null +++ b/debian/patches/Version_2_6_13pre56 @@ -0,0 +1,107 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-67) unstable; urgency=medium + . + * Version_2_6_13pre55 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-04 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc.h ++++ gcl-2.6.12/h/elf64_alpha_reloc.h +@@ -22,16 +22,14 @@ + store_val(where,MASK(32),s+a); + break; + case R_ALPHA_LITERAL: +- s+=a; +- if (a || !(sym->st_other&0x1)) {gotp+=1+(sym->st_other>>1);sym->st_other|=1;} +- gote=got+(a ? gotp : sym->st_size)-1; +- massert(s); ++ gote=got+(a>>32)-1; ++ a&=MASK(32); + if (s>=ggot1 && sst_other=sym->st_size=0; + ++ for (sec=sec1;secsh_type==SHT_RELA) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { ++ ++ sym=sym1+ELF_R_SYM(r->r_info); ++ ++ /*unlikely to save got space by recording possible holes in addend range*/ ++ if ((a=r->r_addend+1)>sym->st_other) ++ sym->st_other=a; ++ ++ } ++ + for (*gs=0,sec=sec1;secsh_type==SHT_RELA) + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) +@@ -78,13 +90,19 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + + sym=sym1+ELF_R_SYM(r->r_info); + +- if (!sym->st_size || r->r_addend) { +- q=++*gs; +- if (!sym->st_size) sym->st_size=q; ++ if (sym->st_other) { ++ sym->st_size=++*gs; + massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); +- sym->st_other=(*gs-q)<<1; ++ massert((*gs-sym->st_size) || !r->r_addend); ++ if (sym->st_other>1) ++ (*gs)+=sym->st_other-1; ++ sym->st_other=0; + } + ++ b=sizeof(r->r_addend)*4; ++ massert(!(r->r_addend>>b)); ++ r->r_addend|=((sym->st_size+r->r_addend)< + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-68) unstable; urgency=medium + . + * Version_2_6_13pre57 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-04 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h ++++ gcl-2.6.12/h/elf64_alpha_reloc_special.h +@@ -93,7 +93,7 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + if (sym->st_other) { + sym->st_size=++*gs; + massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); +- massert((*gs-sym->st_size) || !r->r_addend); ++ massert(!(*gs-sym->st_size) || !r->r_addend); + if (sym->st_other>1) + (*gs)+=sym->st_other-1; + sym->st_other=0; diff --git a/debian/patches/Version_2_6_13pre58 b/debian/patches/Version_2_6_13pre58 new file mode 100644 index 0000000..ec37b83 --- /dev/null +++ b/debian/patches/Version_2_6_13pre58 @@ -0,0 +1,86 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-68) unstable; urgency=medium + . + * Version_2_6_13pre57 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-09 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h ++++ gcl-2.6.12/h/elf64_alpha_reloc_special.h +@@ -65,7 +65,7 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + Sym *sym; + Shdr *sec; + void *v,*ve; +- ul q=0,a; ++ ul a,b; + + for (sym=sym1;symst_other=sym->st_size=0; +--- gcl-2.6.12.orig/o/cmpaux.c ++++ gcl-2.6.12/o/cmpaux.c +@@ -348,6 +348,8 @@ call_init(int init_address,object memory + + */ + ++object *min_cfd_self=NULL; ++ + void + do_init(object *statVV) { + +@@ -386,6 +388,8 @@ do_init(object *statVV) { + } + + data->cfd.cfd_self = statVV; ++ if (!min_cfd_self || data->cfd.cfd_selfcfd.cfd_self; + data->cfd.cfd_fillp= n; + statVV[n-1] = data; + +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -640,7 +640,7 @@ DEFUN_NEW("CLOSE-FASD",object,fSclose_fa + if (type_of(fd->table)==t_vector) + /* input uses a vector */ + {if (fd->table->v.v_self) +- fd->table->v.v_dim=0;/*self can be on the stack, and others write there*/ ++ gset(fd->table->v.v_self,0,fix(fd->index),aet_object); + } + else + if(fd->direction==sKoutput) +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -446,6 +446,7 @@ mark_object_address(object *o,int f) { + + static ufixnum lp; + static ufixnum lr; ++ extern object *min_cfd_self; + + ufixnum p=page(o); + +@@ -455,7 +456,7 @@ mark_object_address(object *o,int f) { + #ifdef SGC + sgc_enabled ? WRITABLE_PAGE_P(lp) : + #endif +- 1; ++ (o>=min_cfd_self && o<((object *)core_end)); + } + + if (lr) diff --git a/debian/patches/Version_2_6_13pre59 b/debian/patches/Version_2_6_13pre59 new file mode 100644 index 0000000..a5e7a2d --- /dev/null +++ b/debian/patches/Version_2_6_13pre59 @@ -0,0 +1,88 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-69) unstable; urgency=medium + . + * Version_2_6_13pre58 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-12 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h ++++ gcl-2.6.12/h/elf64_alpha_reloc_special.h +@@ -61,47 +61,30 @@ find_special_params(void *v,Shdr *sec1,S + static int + label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { + +- Rela *r; ++ Rela *r,*rr; + Sym *sym; + Shdr *sec; +- void *v,*ve; +- ul a,b; +- +- for (sym=sym1;symst_other=sym->st_size=0; +- +- for (sec=sec1;secsh_type==SHT_RELA) +- for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) +- if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { +- +- sym=sym1+ELF_R_SYM(r->r_info); +- +- /*unlikely to save got space by recording possible holes in addend range*/ +- if ((a=r->r_addend+1)>sym->st_other) +- sym->st_other=a; +- +- } ++ void *v,*ve,*vv; ++ ul b,q; + + for (*gs=0,sec=sec1;secsh_type==SHT_RELA) + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) + if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { + +- sym=sym1+ELF_R_SYM(r->r_info); +- +- if (sym->st_other) { +- sym->st_size=++*gs; +- massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); +- massert(!(*gs-sym->st_size) || !r->r_addend); +- if (sym->st_other>1) +- (*gs)+=sym->st_other-1; +- sym->st_other=0; +- } ++ for (rr=vv=v-sec->sh_entsize; ++ vv>=v1 && ++ (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) || ++ ELF_R_SYM(rr->r_info)!=ELF_R_SYM(r->r_info) || ++ rr->r_addend!=r->r_addend); ++ vv-=sec->sh_entsize,rr=vv); + + b=sizeof(r->r_addend)*4; ++ q=vv>=v1 ? (rr->r_addend>>b) : ++*gs; ++ massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); ++ massert(*gs==q || !r->r_addend); + massert(!(r->r_addend>>b)); +- r->r_addend|=((sym->st_size+r->r_addend)<r_addend|=(q< + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-6) unstable; urgency=medium + . + * Version_2_6_13pre5 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -254,8 +254,10 @@ empty_relblock(void) { + object o=sSAleaf_collection_thresholdA->s.s_dbind; + + sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(0); +- for (;rb_pointer!=rb_start&&rb_pointer!=rb_end;) ++ for (;rb_pointer!=rb_start&&rb_pointer!=rb_end;) { ++ tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); ++ } + sSAleaf_collection_thresholdA->s.s_dbind=o; + + } +@@ -498,10 +500,10 @@ static int + rebalance_maxpages(struct typemanager *my_tm,fixnum z) { + + fixnum d; +- ufixnum i,j; ++ ufixnum i,j,r=(my_tm->tm_type==t_relocatable ? 2 : 1); + + +- d=(z-my_tm->tm_maxpage)*(my_tm->tm_type==t_relocatable ? 2 : 1); ++ d=(z-my_tm->tm_maxpage)*r; + j=sum_maxpages(); + + if (j+d>phys_pages) { +@@ -517,14 +519,14 @@ rebalance_maxpages(struct typemanager *m + if (e+phys_pages-j<=0) + return 0; + +- f=1.0-(double)e/k; ++ f=k ? 1.0-(double)e/k : 1.0; + + for (i=t_start;itm_maxpage+(phys_pages-sum_maxpages()))/(my_tm->tm_type==t_relocatable ? 2 : 1))); ++ massert(set_tm_maxpage(my_tm,(my_tm->tm_maxpage*r+(phys_pages-sum_maxpages()))/r)); + + return 1; + +@@ -624,7 +626,12 @@ expand_contblock_index_space(void) { + + if (cbv->v.v_fillp+1==cbv->v.v_dim) { + +- void *v=alloc_relblock(2*cbv->v.v_dim*sizeof(fixnum)); ++ void *v; ++ object o=sSAleaf_collection_thresholdA->s.s_dbind; ++ ++ sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(-1); ++ v=alloc_relblock(2*cbv->v.v_dim*sizeof(fixnum)); ++ sSAleaf_collection_thresholdA->s.s_dbind=o; + + memcpy(v,cbv->v.v_self,cbv->v.v_dim*sizeof(fixnum)); + cbv->v.v_self=v; +@@ -731,13 +738,14 @@ insert_contblock(void *p,ufixnum s) { + + cbp->cb_size=s; + cbp->cb_link=*cbpp; +- *cbpp=cbp; + + if ((!cbp->cb_link || cbp->cb_link->cb_size!=s)) { + cbppp=expand_contblock_index(cbppp); + cbppp[1]=&cbp->cb_link; + } + ++ *cbpp=cbp; ++ + } + + static inline void +@@ -890,6 +898,7 @@ add_pages(struct typemanager *tm,fixnum + if (rb_pointer>rb_end) { + fprintf(stderr,"Moving relblock low before expanding relblock pages\n"); + fflush(stderr); ++ tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } + nrbpage+=m; +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -1042,14 +1042,10 @@ contblock_sweep_phase(void) { + + struct pageinfo *v; + STATIC char *s, *e, *p, *q; +- object o; + ufixnum i; + + reset_contblock_freelist(); + +- o=sSAleaf_collection_thresholdA->s.s_dbind; +- sSAleaf_collection_thresholdA->s.s_dbind=make_fixnum(-1); +- + for (i=0;iv.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++) { + + bool z; +@@ -1074,8 +1070,6 @@ contblock_sweep_phase(void) { + + } + +- sSAleaf_collection_thresholdA->s.s_dbind=o; +- + sweep_link_array(); + + } +@@ -1646,14 +1640,18 @@ DEFUN_NEW("GBC",object,fSgbc,SI,1,1,NONE + + /* 1 args */ + +- if (x0 == Ct) ++ if (x0 == Ct) { ++ tm_table[t_contiguous].tm_adjgbccnt--; + GBC(t_other); +- else if (x0 == Cnil) ++ } else if (x0 == Cnil) { ++ tm_table[t_cons].tm_adjgbccnt--; + GBC(t_cons); +- else if (eql(small_fixnum(0),x0)) ++ } else if (eql(small_fixnum(0),x0)) { ++ tm_table[t_contiguous].tm_adjgbccnt--; + GBC(t_contiguous); +- else { ++ } else { + x0 = small_fixnum(1); ++ tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } + RETURN1(x0); diff --git a/debian/patches/Version_2_6_13pre60 b/debian/patches/Version_2_6_13pre60 new file mode 100644 index 0000000..e580832 --- /dev/null +++ b/debian/patches/Version_2_6_13pre60 @@ -0,0 +1,61 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-70) unstable; urgency=medium + . + * Version_2_6_13pre59 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-12 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc.h ++++ gcl-2.6.12/h/elf64_alpha_reloc.h +@@ -29,7 +29,7 @@ + } else + *gote=s+a; + s=(gote-got)*sizeof(*got); +- massert(!(s&~MASK(16))); ++ massert(!(s&~MASK(15))); + store_val(where,MASK(16),s); + break; + case R_ALPHA_GPRELHIGH: +--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h ++++ gcl-2.6.12/h/elf64_alpha_reloc_special.h +@@ -62,7 +62,6 @@ static int + label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { + + Rela *r,*rr; +- Sym *sym; + Shdr *sec; + void *v,*ve,*vv; + ul b,q; +@@ -80,8 +79,12 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + vv-=sec->sh_entsize,rr=vv); + + b=sizeof(r->r_addend)*4; +- q=vv>=v1 ? (rr->r_addend>>b) : ++*gs; +- massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); ++ if (vv>=v1) ++ q=rr->r_addend>>b; ++ else { ++ q=++*gs; ++ massert(!make_got_room_for_stub(sec1,sece,sym1+ELF_R_SYM(r->r_info),st1,gs)); ++ } + massert(*gs==q || !r->r_addend); + massert(!(r->r_addend>>b)); + r->r_addend|=(q< + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-71) unstable; urgency=medium + . + * Version_2_6_13pre60 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-13 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4118,6 +4118,7 @@ if test "${enable_gprof+set}" = set; the + $as_echo_n "checking working gprof... " >&6; } + case $use in + powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; ++ s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -331,6 +331,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + AC_MSG_CHECKING([working gprof]) + case $use in + powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; ++ s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; diff --git a/debian/patches/Version_2_6_13pre62 b/debian/patches/Version_2_6_13pre62 new file mode 100644 index 0000000..c7d4c3c --- /dev/null +++ b/debian/patches/Version_2_6_13pre62 @@ -0,0 +1,113 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-72) unstable; urgency=medium + . + * Version_2_6_13pre61 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-14 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc.h ++++ gcl-2.6.12/h/elf64_alpha_reloc.h +@@ -22,12 +22,12 @@ + store_val(where,MASK(32),s+a); + break; + case R_ALPHA_LITERAL: +- gote=got+(a>>32)-1; +- a&=MASK(32); ++ massert(a || sym->st_size); ++ gote=got+(a ? (a>>32) : sym->st_size)-1; + if (s>=ggot1 && sst_size=0; + + for (*gs=0,sec=sec1;secsh_type==SHT_RELA) +- for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) +- if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { +- +- for (rr=vv=v-sec->sh_entsize; +- vv>=v1 && +- (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) || +- ELF_R_SYM(rr->r_info)!=ELF_R_SYM(r->r_info) || +- rr->r_addend!=r->r_addend); +- vv-=sec->sh_entsize,rr=vv); +- +- b=sizeof(r->r_addend)*4; +- if (vv>=v1) +- q=rr->r_addend>>b; +- else { +- q=++*gs; +- massert(!make_got_room_for_stub(sec1,sece,sym1+ELF_R_SYM(r->r_info),st1,gs)); ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ ++ if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { ++ ++ if (sec->sh_type!=SHT_RELA || !r->r_addend) { ++ ++ sym=sym1+ELF_R_SYM(r->r_info); ++ ++ if (!sym->st_size) { ++ sym->st_size=++*gs; ++ massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); + } +- massert(*gs==q || !r->r_addend); +- massert(!(r->r_addend>>b)); +- r->r_addend|=(q<sh_entsize; ++ vv>=v1 && (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) || ++ ELF_R_SYM(rr->r_info)!=ELF_R_SYM(r->r_info) || ++ rr->r_addend!=r->r_addend); ++ vv-=sec->sh_entsize,rr=vv); ++ ++ q=vvr_addend>>32; ++ massert(!(r->r_addend>>32)); ++ r->r_addend|=(q<<32); + + } +- ++ ++ } ++ + return 0; + + } diff --git a/debian/patches/Version_2_6_13pre63 b/debian/patches/Version_2_6_13pre63 new file mode 100644 index 0000000..ee53ae9 --- /dev/null +++ b/debian/patches/Version_2_6_13pre63 @@ -0,0 +1,78 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-73) unstable; urgency=medium + . + * Version_2_6_13pre62 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-17 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h ++++ gcl-2.6.12/h/elf64_alpha_reloc_special.h +@@ -71,20 +71,21 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + sym->st_size=0; + + for (*gs=0,sec=sec1;secsh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ if (sec->sh_type==SHT_RELA || sec->sh_type==SHT_REL) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) + +- if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { ++ if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { + +- if (sec->sh_type!=SHT_RELA || !r->r_addend) { ++ if (sec->sh_type!=SHT_RELA || !r->r_addend) { + +- sym=sym1+ELF_R_SYM(r->r_info); ++ sym=sym1+ELF_R_SYM(r->r_info); + +- if (!sym->st_size) { +- sym->st_size=++*gs; +- massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); +- } ++ if (!sym->st_size) { ++ sym->st_size=++*gs; ++ massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); ++ } + +- } else { ++ } else { + + for (rr=vv=v-sec->sh_entsize; + vv>=v1 && (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) || +@@ -96,9 +97,9 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + massert(!(r->r_addend>>32)); + r->r_addend|=(q<<32); + +- } ++ } + +- } ++ } + + return 0; + +--- gcl-2.6.12.orig/o/gprof.c ++++ gcl-2.6.12/o/gprof.c +@@ -1,3 +1,5 @@ ++#include ++ + #include "include.h" + #include "page.h" + #include "ptable.h" diff --git a/debian/patches/Version_2_6_13pre64 b/debian/patches/Version_2_6_13pre64 new file mode 100644 index 0000000..e0a6ae0 --- /dev/null +++ b/debian/patches/Version_2_6_13pre64 @@ -0,0 +1,169 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-74) unstable; urgency=medium + . + * Version_2_6_13pre63 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-21 + +--- gcl-2.6.12.orig/h/elf64_alpha_reloc.h ++++ gcl-2.6.12/h/elf64_alpha_reloc.h +@@ -1,16 +1,14 @@ + case R_ALPHA_GPDISP: +- s=(ul)got; +- s-=p; +- s+=(s&0x8000)<<1; +- store_val(where,MASK(16),s>>16); +- where=(void *)where+a; +- store_val(where,MASK(16),s); ++ gotoff=(ul)(got+(a>>32)); ++ s=gotoff-p; ++ store_val(where,MASK(16),(s-(short)s)>>16); ++ store_val((void *)where+(a&MASK(32)),MASK(16),s); + break; + case R_ALPHA_SREL32: + store_val(where,MASK(32),s+a-p); + break; + case R_ALPHA_GPREL32: +- store_val(where,MASK(32),s+a-(ul)got); ++ store_val(where,MASK(32),s+a-gotoff); + break; + case R_ALPHA_LITUSE: + case R_ALPHA_HINT: +@@ -22,23 +20,20 @@ + store_val(where,MASK(32),s+a); + break; + case R_ALPHA_LITERAL: +- massert(a || sym->st_size); +- gote=got+(a ? (a>>32) : sym->st_size)-1; ++ s+=a&MASK(32); ++ a=(a>>32)-1; + if (s>=ggot1 && s>16); ++ s+=a-gotoff; ++ store_val(where,MASK(16),(s-(short)s)>>16); + break; + case R_ALPHA_GPRELLOW: +- store_val(where,MASK(16),s+a-(ul)got); ++ store_val(where,MASK(16),s+a-gotoff); + break; + case R_ALPHA_TLS_GD_HI: + store_vals(where,MASK(21),((long)(s+a-(p+4)))>>2); +--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h ++++ gcl-2.6.12/h/elf64_alpha_reloc_special.h +@@ -1,4 +1,4 @@ +-static ul ggot1,ggote; ++static ul ggot1,ggote,gotoff; + + static int + write_stub(ul s,ul *got,ul *gote) { +@@ -61,44 +61,60 @@ find_special_params(void *v,Shdr *sec1,S + static int + label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { + +- Sym *sym; +- Rela *r,*rr; ++ Sym *sym,*fsym=sym1; ++ Rela *r; + Shdr *sec; +- void *v,*ve,*vv; +- ul q; ++ void *v,*ve; ++ ul q,gotp; + + for (sym=sym1;symst_size=0; + +- for (*gs=0,sec=sec1;secsh_type==SHT_RELA || sec->sh_type==SHT_REL) ++ for (*gs=gotp=0,sec=sec1;secsh_type==SHT_RELA) + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) + +- if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) { ++ switch(ELF_R_TYPE(r->r_info)) { ++ ++ case R_ALPHA_LITERAL: + +- if (sec->sh_type!=SHT_RELA || !r->r_addend) { ++ if (!r->r_addend) { + + sym=sym1+ELF_R_SYM(r->r_info); ++ q=(gotp-sym->st_size)*sizeof(*gs); + +- if (!sym->st_size) { ++ if (!sym->st_size || q!=(short)q) { + sym->st_size=++*gs; + massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); + } + +- } else { ++ q=sym->st_size; ++ ++ } else ++ ++ q=++*gs; ++ ++ massert(!(r->r_addend>>32)); ++ r->r_addend|=(q<<32); + +- for (rr=vv=v-sec->sh_entsize; +- vv>=v1 && (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) || +- ELF_R_SYM(rr->r_info)!=ELF_R_SYM(r->r_info) || +- rr->r_addend!=r->r_addend); +- vv-=sec->sh_entsize,rr=vv); +- +- q=vvr_addend>>32; +- massert(!(r->r_addend>>32)); +- r->r_addend|=(q<<32); ++ q=(q-gotp)*sizeof(*gs); ++ massert(q==(short)q); + ++ break; ++ ++ case R_ALPHA_GPDISP: ++ ++ for (sym=fsym;symst_shndx!=1 || sym->st_value!=r->r_offset);sym++); ++ ++ if (symr_addend|=(gotp<<32); ++ ++ break; ++ + } + + return 0; diff --git a/debian/patches/Version_2_6_13pre65 b/debian/patches/Version_2_6_13pre65 new file mode 100644 index 0000000..dbaef5d --- /dev/null +++ b/debian/patches/Version_2_6_13pre65 @@ -0,0 +1,212 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-75) unstable; urgency=medium + . + * Version_2_6_13pre64 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-22 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpif.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpif.lsp +@@ -428,9 +428,8 @@ + (wt-label label)))) + + (if (eq default 't) +- (progn (wt-nl "FEerror(\"The ECASE key value ~s is illegal.\",1,V" cvar ");") +- (unwind-exit nil 'jump)) +- (c2expr default)) ++ (wt-nl "FEerror(\"The ECASE key value ~s is illegal.\",1,V" cvar ");") ++ (c2expr default)) + + (wt "}") + (close-inline-blocks)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmulti.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmulti.lsp +@@ -221,56 +221,36 @@ + + + (defun c2multiple-value-bind (vars init-form body +- &aux (block-p nil) (labels nil) +- (*unwind-exit* *unwind-exit*) +- (*vs* *vs*) (*clink* *clink*) (*ccb-vs* *ccb-vs*) +- top-data) +- (declare (object block-p)) +- (multiple-value-check vars init-form) ++ &aux (block-p nil) ++ (*unwind-exit* *unwind-exit*) ++ (*vs* *vs*) (*clink* *clink*) (*ccb-vs* *ccb-vs*) ++ top-data) + +- (dolist** (var vars) ++ (multiple-value-check vars init-form) ++ ++ (dolist (var vars) + (let ((kind (c2var-kind var))) +- (declare (object kind)) + (if kind + (let ((cvar (next-cvar))) + (setf (var-kind var) kind) + (setf (var-loc var) cvar) + (wt-nl) + (unless block-p (wt "{") (setq block-p t)) +- (wt-var-decl var) +- ) +- (setf (var-ref var) (vs-push))))) ++ (wt-var-decl var)) ++ (setf (var-ref var) (vs-push))))) + + (let ((*value-to-go* 'top) *top-data*) + (c2expr* init-form) (setq top-data *top-data*)) ++ + (and *record-call-info* (record-call-info nil (car top-data))) +- (let ((*clink* *clink*) +- (*unwind-exit* *unwind-exit*) +- (*ccb-vs* *ccb-vs*)) +- (do ((vs vars (cdr vs))) +- ((endp vs)) +- (declare (object vs)) +- (push (next-label) labels) +- (wt-nl "if(vs_base>=vs_top){") +- (reset-top) +- (wt-go (car labels)) (wt "}") ++ ++ (wt-nl "if(vs_base>vs_top) vs_top=vs_base;*vs_top=Cnil;") ++ (do ((vs vars (cdr vs))) ++ ((endp vs)) + (c2bind-loc (car vs) '(vs-base 0)) +- (unless (endp (cdr vs)) (wt-nl "vs_base++;")))) ++ (unless (endp (cdr vs)) (wt-nl "if (vs_base>32)); ++ gotoff=(ul)(got+(a>>32)-1); + s=gotoff-p; + store_val(where,MASK(16),(s-(short)s)>>16); + store_val((void *)where+(a&MASK(32)),MASK(16),s); +@@ -23,7 +23,7 @@ + s+=a&MASK(32); + a=(a>>32)-1; + if (s>=ggot1 && sr_addend>>32)); ++ if (r->r_addend>>32) ++ fprintf(stderr,"zeroing high addend %lx\n",r->r_addend>>32); ++ r->r_addend&=0xffffffff; ++ massert((q&0xffffffff)==q); + r->r_addend|=(q<<32); + + q=(q-gotp)*sizeof(*gs); +@@ -111,6 +114,10 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + gotp=*gs+1; + } + ++ if (r->r_addend>>32) ++ fprintf(stderr,"zeroing high addend %lx\n",r->r_addend>>32); ++ r->r_addend&=0xffffffff; ++ massert((gotp&0xffffffff)==gotp); + r->r_addend|=(gotp<<32); + + break; diff --git a/debian/patches/Version_2_6_13pre66 b/debian/patches/Version_2_6_13pre66 new file mode 100644 index 0000000..667cee3 --- /dev/null +++ b/debian/patches/Version_2_6_13pre66 @@ -0,0 +1,132 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-75) unstable; urgency=medium + . + * Version_2_6_13pre65 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-23 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmulti.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmulti.lsp +@@ -164,27 +164,21 @@ + (cmpwarn "~A was proclaimed to have only one return value. ~%;But you appear to want multiple values." fname)))))) + + (defun c2multiple-value-setq (vrefs form &aux top-data) +- (multiple-value-check vrefs form) ++ (multiple-value-check vrefs form) + (let ((*value-to-go* 'top)*top-data*) + (c2expr* form) (setq top-data *top-data*)) + (and *record-call-info* (record-call-info nil (car top-data))) ++ (wt-nl "if(vs_base>vs_top) vs_top=vs_base;*vs_top=Cnil;") + (do ((vs vrefs (cdr vs))) + ((endp vs)) +- (declare (object vs)) + (let ((vref (car vs))) +- (declare (object vref)) +- (wt-nl "if(vs_base&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + $as_echo "ok" >&6; } +- assert_arg_to_cflags -pg ++ OLD_CFLAGS=$CFLAGS # Do not run configure tests with -pg ++ assert_arg_to_cflags -pg ++ CFLAGS=$OLD_CFLAGS + TFPFLAG="" + + $as_echo "#define GCL_GPROF 1" >>confdefs.h +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -334,6 +334,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; + ia64*) enableval="no";; ++ alpha*) enableval="no";;#write_stub currently depends on t12 set in call + hppa*) enableval="no";; + arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 +@@ -343,25 +344,11 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + AC_MSG_RESULT([disabled]) + else + AC_MSG_RESULT([ok]) +- assert_arg_to_cflags -pg ++ OLD_CFLAGS=$CFLAGS # Do not run configure tests with -pg ++ assert_arg_to_cflags -pg ++ CFLAGS=$OLD_CFLAGS + TFPFLAG="" + AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) +-dnl AC_MSG_CHECKING([for text start]) +-dnl echo 'int main () {return(0);}' >foo.c +-dnl $CC foo.c -o foo +-dnl GCL_GPROF_START=`nm foo | $AWK '/ *[[TD]] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc +-dnl rm -f foo.c foo +-dnl if test "$GCL_GPROF_START" != "" ; then +-dnl AC_MSG_RESULT($GCL_GPROF_START) +-dnl AC_DEFINE_UNQUOTED(GCL_GPROF_START,$GCL_GPROF_START,[starting address for gprof]) +-dnl assert_arg_to_cflags -pg +-dnl # case $use in +-dnl # s390*) ;; # relocation truncation bug in gcc +-dnl # *) TLIBS="$TLIBS -pg";; +-dnl # esac +-dnl TFPFLAG="" +-dnl AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) +-dnl fi + fi + fi]) + +--- gcl-2.6.12.orig/o/usig.c ++++ gcl-2.6.12/o/usig.c +@@ -150,7 +150,7 @@ DEFUN_NEW("FLD",object,fSfld,SI,1,1,NONE + + /* For now ignore last three args governing offsets and data modification, just to + support fpe sync with master*/ +-DEFUN_NEW("*FIXNUM",object,fSAfixnum,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") { ++DEFUN_NEW("*FIXNUM",object,fSAfixnum,SI,4,4,NONE,II,OO,OO,OO,(fixnum addr,object x,object y,object z),"") { + RETURN1((object)*(fixnum *)addr); + } + DEFUN_NEW("*FLOAT",object,fSAfloat,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") { diff --git a/debian/patches/Version_2_6_13pre67 b/debian/patches/Version_2_6_13pre67 new file mode 100644 index 0000000..274a39e --- /dev/null +++ b/debian/patches/Version_2_6_13pre67 @@ -0,0 +1,256 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-76) unstable; urgency=medium + . + * Version_2_6_13pre66 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-03-26 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4121,7 +4121,6 @@ $as_echo_n "checking working gprof... " + s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; + ia64*) enableval="no";; +- alpha*) enableval="no";;#write_stub currently depends on t12 set in call + hppa*) enableval="no";; + arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -334,7 +334,6 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; + ia64*) enableval="no";; +- alpha*) enableval="no";;#write_stub currently depends on t12 set in call + hppa*) enableval="no";; + arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 +--- gcl-2.6.12.orig/h/elf64_alpha_reloc.h ++++ gcl-2.6.12/h/elf64_alpha_reloc.h +@@ -1,14 +1,14 @@ + case R_ALPHA_GPDISP: +- gotoff=(ul)(got+(a>>32)-1); ++ gotoff=(ul)(got+HIGH(a)-1); + s=gotoff-p; + store_val(where,MASK(16),(s-(short)s)>>16); +- store_val((void *)where+(a&MASK(32)),MASK(16),s); ++ store_val((void *)where+LOW(a),MASK(16),s); + break; + case R_ALPHA_SREL32: + store_val(where,MASK(32),s+a-p); + break; + case R_ALPHA_GPREL32: +- store_val(where,MASK(32),s+a-gotoff); ++ store_val(where,MASK(32),s+LOW(a)-(ul)(got+HIGH(a)-1)); + break; + case R_ALPHA_LITUSE: + case R_ALPHA_HINT: +@@ -20,8 +20,8 @@ + store_val(where,MASK(32),s+a); + break; + case R_ALPHA_LITERAL: +- s+=a&MASK(32); +- a=(a>>32)-1; ++ s+=LOW(a); ++ a=HIGH(a)-1; + if (s>=ggot1 && s>16); /*ldah t12,(symhigh)(zero)*/ ++ *goti++=(0x8<<26)|(0x1b<<21)|(0x1b<<16)|(s&MASK(16)); /*lda t12,(symlow)(t12)*/ ++ *goti++=(0x29<<26)|(0x1b<<21)|(0x1b<<16)|0; /*ldq t12,0(t12)*/ ++ *goti++=(0x1a<<26)|(0x1f<<21)|(0x1b<<16)|0x4000; /*jsr zero,(t12),$pc+4*/ ++ *goti++=0; /*halt*/ ++ *goti++=0; /*halt*/ ++ ++ return 0; ++ ++} + + static int + write_stub(ul s,ul *gote) { + + unsigned int *goti; + ++ if (s==mcount) ++ return write_stub_mcount(mcount,gote); ++ + *gote=(ul)(goti=(void *)(gote+2)); + *++gote=s; + *goti++=(0x29<<26)|(0x1b<<21)|(0x1b<<16)|0xfff8; /*ldq t12,-8(t12)*/ +@@ -35,15 +57,19 @@ static int + find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, + const char *st1,Sym *ds1,Sym *dse,Sym *sym1,Sym *syme) { + ++ Sym *sym; + Shdr *sec; + Rela *r; +- void *ve; ++ void *ve,*dst1; + + massert((sec=get_section(".got",sec1,sece,sn))); + + ggot1=sec->sh_addr; + ggote=ggot1+sec->sh_size; + ++ massert(sec=get_section(".dynstr",sec1,sece,sn));/*FIXME pass as parameter*/ ++ dst1=v+sec->sh_offset; ++ + massert((sec=get_section(".rel.dyn",sec1,sece,sn))|| + (sec=get_section(".rela.dyn",sec1,sece,sn))); + +@@ -51,13 +77,20 @@ find_special_params(void *v,Shdr *sec1,S + ve=v+sec->sh_size; + + for (r=v;vsh_entsize,r=v) +- if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value) +- ds1[ELF_R_SYM(r->r_info)].st_value=r->r_offset; ++ if (ELF_R_TYPE(r->r_info) && !(sym=ds1+ELF_R_SYM(r->r_info))->st_value) { ++ sym->st_value=r->r_offset; ++ if (!strncmp("_mcount",dst1+sym->st_name,7)) ++ mcount=sym->st_value; ++ } + + return 0; + + } + ++#define HIGH(a_) ((a_)>>32) ++#define LOW(a_) ((a_)&MASK(32)) ++#define SET_HIGH(a_,b_) ({ul _a=(a_);(a_)=((b_)<<32)|LOW(_a);}) ++ + static int + label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { + +@@ -67,12 +100,18 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + void *v,*ve; + ul q,gotp; + +- for (sym=sym1;symst_size=0; ++ for (sym=sym1;symst_value)); ++ massert(!HIGH(sym->st_size)); ++ } + + for (*gs=gotp=0,sec=sec1;secsh_type==SHT_RELA) +- for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) { ++ ++ if (HIGH(r->r_addend)) ++ fprintf(stderr,"zeroing high addend %lx\n",HIGH(r->r_addend));/*never reached fix(Cnil) code, to be eliminated*/ ++ SET_HIGH(r->r_addend,0UL); + + switch(ELF_R_TYPE(r->r_info)) { + +@@ -81,49 +120,60 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + if (!r->r_addend) { + + sym=sym1+ELF_R_SYM(r->r_info); +- q=(gotp-sym->st_size)*sizeof(*gs); ++ q=(HIGH(sym->st_size)-gotp)*sizeof(*gs); + +- if (!sym->st_size || q!=(short)q) { +- sym->st_size=++*gs; ++ if (!HIGH(sym->st_size) || q!=(short)q) {/*new cached got entry if first or out of range*/ ++ SET_HIGH(sym->st_size,++*gs); + massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); + } + +- q=sym->st_size; ++ q=HIGH(sym->st_size); + + } else + + q=++*gs; + +- if (r->r_addend>>32) +- fprintf(stderr,"zeroing high addend %lx\n",r->r_addend>>32); +- r->r_addend&=0xffffffff; +- massert((q&0xffffffff)==q); +- r->r_addend|=(q<<32); ++ SET_HIGH(r->r_addend,q); + +- q=(q-gotp)*sizeof(*gs); ++ q=(q-gotp)*sizeof(*gs);/*check 16bit range gprel address in range*/ + massert(q==(short)q); + + break; + + case R_ALPHA_GPDISP: + +- for (sym=fsym;symst_shndx!=1 || sym->st_value!=r->r_offset);sym++); ++ for (sym=fsym;symst_shndx!=1 || LOW(sym->st_value)!=r->r_offset);sym++);/*ordered search*/ + + if (symst_value,gotp=*gs+1); + } + +- if (r->r_addend>>32) +- fprintf(stderr,"zeroing high addend %lx\n",r->r_addend>>32); +- r->r_addend&=0xffffffff; +- massert((gotp&0xffffffff)==gotp); +- r->r_addend|=(gotp<<32); ++ SET_HIGH(r->r_addend,gotp); ++ ++ break; ++ ++ case R_ALPHA_GPREL32: ++ ++ q=LOW(sym1[ELF_R_SYM(r->r_info)].st_value)+r->r_addend; ++ ++ /*unordered search*/ ++ for (sym=sym1;symst_shndx!=1 || LOW(sym->st_value)>q || LOW(sym->st_value)+LOW(sym->st_size)r_addend,HIGH(sym->st_value)); + + break; + + } + ++ } ++ ++ for (sym=sym1;symst_value,0UL); ++ SET_HIGH(sym->st_size,0UL); ++ } ++ + return 0; + + } diff --git a/debian/patches/Version_2_6_13pre68 b/debian/patches/Version_2_6_13pre68 new file mode 100644 index 0000000..3c62bd0 --- /dev/null +++ b/debian/patches/Version_2_6_13pre68 @@ -0,0 +1,35 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-76) unstable; urgency=medium + . + * Version_2_6_13pre67 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-07-24 + +--- gcl-2.6.12.orig/h/elf64_i386_reloc.h ++++ gcl-2.6.12/h/elf64_i386_reloc.h +@@ -8,6 +8,7 @@ + add_val(where,~0L,s+a); + break; + case R_X86_64_PC32: ++ case R_X86_64_PLT32: + massert(ovchks(s+a-p,~MASK(32))); + add_val(where,MASK(32),s+a-p); + break; diff --git a/debian/patches/Version_2_6_13pre69 b/debian/patches/Version_2_6_13pre69 new file mode 100644 index 0000000..37f5f68 --- /dev/null +++ b/debian/patches/Version_2_6_13pre69 @@ -0,0 +1,32 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-78) unstable; urgency=medium + . + * rebuild against latest compilers and tools +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-10-11 + +--- gcl-2.6.12.orig/h/386-gnu.h ++++ gcl-2.6.12/h/386-gnu.h +@@ -61,3 +61,4 @@ + #define NEED_STACK_CHK_GUARD + + #undef HAVE_D_TYPE /*FIXME defined, but not implemented in readdir*/ ++#define NO_FILE_LOCKING /*FIXME*/ diff --git a/debian/patches/Version_2_6_13pre7 b/debian/patches/Version_2_6_13pre7 new file mode 100644 index 0000000..ccbd1e4 --- /dev/null +++ b/debian/patches/Version_2_6_13pre7 @@ -0,0 +1,163 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-7) unstable; urgency=medium + . + * Version_2_6_13pre6 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -29,7 +29,7 @@ void *malloc(size_t); + void *realloc(void *,size_t); + /* void * memalign(size_t,size_t); */ + void *alloc_contblock(size_t); +-void *alloc_relblock(size_t); ++inline void *alloc_relblock(size_t); + /* object fSallocate_contiguous_pages(); */ + /* object fSallocate_relocatable_pages(); */ + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -7,7 +7,7 @@ + /* alloc.c:364:OF */ extern object on_stack_cons (object x, object y); /* (x, y) object x; object y; */ + /* alloc.c:376:OF */ extern object fSallocated (object typ); /* (typ) object typ; */ + /* alloc.c:401:OF */ extern object fSreset_number_used (object typ); /* (typ) object typ; */ +-/* alloc.c:480:OF */ extern void insert_contblock (void *p, ufixnum s); /* (p, s) char *p; int s; */ ++/* alloc.c:480:OF */ extern inline void insert_contblock (void *p, ufixnum s); /* (p, s) char *p; int s; */ + /* alloc.c:480:OF */ extern void insert_maybe_sgc_contblock (char *p, int s); /* (p, s) char *p; int s; */ + /* alloc.c:611:OF */ extern void set_maxpage (void); /* () */ + /* alloc.c:635:OF */ extern void gcl_init_alloc (void *); /* () */ +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -422,7 +422,11 @@ DEFVAR("*LEAF-COLLECTION-THRESHOLD*",sSA + + static inline bool + marking(void *p) { +- return (sgc_enabled ? ON_WRITABLE_PAGE_CACHED(p) : !NULL_OR_ON_C_STACK(p)); ++ return ( ++#ifdef SGC ++ sgc_enabled ? ON_WRITABLE_PAGE_CACHED(p) : ++#endif ++ !NULL_OR_ON_C_STACK(p)); + } + + static inline bool +@@ -483,7 +487,11 @@ mark_object_address(object *o,int f) { + + if (lp!=p || !f) { + lp=p; +- lr=sgc_enabled ? WRITABLE_PAGE_P(lp) : 1; ++ lr= ++#ifdef SGC ++ sgc_enabled ? WRITABLE_PAGE_P(lp) : ++#endif ++ 1; + } + + if (lr) +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -147,8 +147,8 @@ mbrk(void *v) { + + #include + +-ufixnum +-get_phys_pages_no_malloc(void) { ++static ufixnum ++get_phys_pages_no_malloc(char n) { + MEMORYSTATUS m; + + m.dwLength=sizeof(m); +@@ -161,8 +161,8 @@ get_phys_pages_no_malloc(void) { + + #include + +-ufixnum +-get_phys_pages_no_malloc(void) { ++static ufixnum ++get_phys_pages_no_malloc(char n) { + uint64_t s; + size_t z=sizeof(s); + int m[2]={CTL_HW,HW_MEMSIZE}; +@@ -176,8 +176,8 @@ get_phys_pages_no_malloc(void) { + + #elif defined(__sun__) + +-ufixnum +-get_phys_pages_no_malloc(void) { ++static ufixnum ++get_phys_pages_no_malloc(char n) { + + return sysconf(_SC_PHYS_PAGES); + +@@ -202,7 +202,7 @@ get_proc_meminfo_value_in_pages(const ch + return n>>(PAGEWIDTH-10); + } + +-ufixnum ++static ufixnum + get_phys_pages_no_malloc(char freep) { + return freep ? + get_proc_meminfo_value_in_pages("MemFree:")+ +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -205,9 +205,7 @@ load_memory(struct scnhdr *sec1,struct s + memory->cfd.cfd_size=sz; + memory->cfd.cfd_self=0; + memory->cfd.cfd_start=0; +- prefer_low_mem_contblock=TRUE; +- memory->cfd.cfd_start=alloc_contblock(sz); +- prefer_low_mem_contblock=FALSE; ++ memory->cfd.cfd_start=alloc_code_space(sz); + + for (sec=sec1;secs_paddr+=(ul)memory->cfd.cfd_start; +--- gcl-2.6.12.orig/o/sfaslmacho.c ++++ gcl-2.6.12/o/sfaslmacho.c +@@ -207,9 +207,7 @@ load_memory(struct section *sec1,struct + memory->cfd.cfd_size=sz; + memory->cfd.cfd_self=0; + memory->cfd.cfd_start=0; +- prefer_low_mem_contblock=TRUE; +- memory->cfd.cfd_start=alloc_contblock(sz); +- prefer_low_mem_contblock=FALSE; ++ memory->cfd.cfd_start=alloc_code_space(sz); + + a=(ul)memory->cfd.cfd_start; + a=(a+ma)&~ma; +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -28,7 +28,7 @@ + (pcl (append x (list "pcl"))) + (clcs (append x (list "clcs"))) + (gtk (append x (list "gcl-tk")))) +- (dolist (d (list lsp cmpnew #-pre-gcl xgcl-2 #+(or pcl ansi-cl) pcl #+ansi-cl clcs)) ++ (dolist (d (list lsp cmpnew #+(and xgcl (not pre-gcl)) xgcl-2 #+(or pcl ansi-cl) pcl #+ansi-cl clcs)) + (load (make-pathname :name "sys-proclaim" :type "lisp" :directory d))) + (load (make-pathname :name "tk-package" :type "lsp" :directory gtk)) + (load (make-pathname :name "gcl_lfun_list" :type "lsp" :directory cmpnew)) +@@ -77,6 +77,5 @@ + + #-ansi-cl(use-package :cltl1-compat :lisp) + #-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp))) +-(export '*load-pathname* :si);For maxima, at least as of 5.34.1 + + #+ansi-cl (use-package :pcl :user) diff --git a/debian/patches/Version_2_6_13pre70 b/debian/patches/Version_2_6_13pre70 new file mode 100644 index 0000000..cbcbe0a --- /dev/null +++ b/debian/patches/Version_2_6_13pre70 @@ -0,0 +1,108 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-78) unstable; urgency=medium + . + * rebuild against latest compilers and tools + * Version_2_6_13pre69 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-10-29 + +--- gcl-2.6.12.orig/h/linux.h ++++ gcl-2.6.12/h/linux.h +@@ -132,17 +132,10 @@ do { int c = 0; \ + + #include + #include +-#define GET_FULL_PATH_SELF(a_) do { \ +- static char q[PATH_MAX]; \ +- const char *s="/proc/self/exe"; \ +- struct stat ss; \ +- if (stat(s,&ss)) \ +- (a_)=argv[0]; \ +- else { \ +- if (!realpath(s,q)) \ +- error("realpath error"); \ +- (a_)=q; \ +- } \ ++#define GET_FULL_PATH_SELF(a_) do { \ ++ static char q[PATH_MAX]; \ ++ massert(which("/proc/self/exe",q) || which(argv[0],q)); \ ++ (a_)=q; \ + } while(0) + + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -460,18 +460,49 @@ DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",o + RETURN1((object)(w-u)); + } + ++static int ++mbin(const char *s,char *o) { ++ ++ struct stat ss; ++ ++ if (!stat(s,&ss) && (ss.st_mode&S_IFMT)==S_IFREG && !access(s,R_OK|X_OK)) { ++ massert(realpath(s,o)); ++ return 1; ++ } ++ ++ return 0; ++ ++} ++ ++static int ++which(const char *n,char *o) { ++ ++ char *s; ++ ++ if (strchr(n,'/')) ++ return mbin(n,o); ++ ++ massert(snprintf(FN1,sizeof(FN1),"%s",getenv("PATH"))>1); ++ for (s=NULL;(s=strtok(s ? NULL : FN1,":"));) { ++ ++ massert(snprintf(FN2,sizeof(FN2),"%s/%s",s,n)); ++ if (mbin(FN2,o)) ++ return 1; ++ ++ } ++ ++ return 0; ++ ++} ++ ++ + + int + main(int argc, char **argv, char **envp) { + +-#ifdef GET_FULL_PATH_SELF + GET_FULL_PATH_SELF(kcl_self); +-#else +- kcl_self = argv[0]; +-#endif +- + *argv=kcl_self; +- ++ + #ifdef CAN_UNRANDOMIZE_SBRK + #include + #include diff --git a/debian/patches/Version_2_6_13pre71 b/debian/patches/Version_2_6_13pre71 new file mode 100644 index 0000000..f0013e6 --- /dev/null +++ b/debian/patches/Version_2_6_13pre71 @@ -0,0 +1,59 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-79) unstable; urgency=medium + . + * Version_2_6_13pre70 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-10-30 + +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -879,9 +879,9 @@ void hppa_save_regs(struct regs); + + asm(".code"); + asm(".export hppa_save_regs, entry"); ++ asm(".label hppa_save_regs"); + asm(".proc"); + asm(".callinfo"); +- asm(".label hppa_save_regs"); + asm(".entry"); + + asm("stw %r3,0(%arg0)"); +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -242,7 +242,7 @@ get_gc_environ(void) { + } + + gc_page_min=0.5; +- if ((e=getenv("GCL_GC_PAGE_MIN"))) { ++ if ((e=getenv("GCL_GC_PAGE_MIN"))||(e=getenv("GCL_GC_PAGE_THRESH"))) {/*legacy support*/ + massert(sscanf(e,"%lf",&gc_page_min)==1); + massert(gc_page_min>=0.0); + } +@@ -253,7 +253,8 @@ get_gc_environ(void) { + massert(gc_page_max>=0.0); + } + +- multiprocess_memory_pool=(e=getenv("GCL_MULTIPROCESS_MEMORY_POOL")) && *e; ++ multiprocess_memory_pool= ++ (e=getenv("GCL_MULTIPROCESS_MEMORY_POOL")) && (*e=='t' || *e=='T'); + + wait_on_abort=0; + if ((e=getenv("GCL_WAIT_ON_ABORT"))) diff --git a/debian/patches/Version_2_6_13pre72 b/debian/patches/Version_2_6_13pre72 new file mode 100644 index 0000000..136954b --- /dev/null +++ b/debian/patches/Version_2_6_13pre72 @@ -0,0 +1,103 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-81) unstable; urgency=high + . + * Version_2_6_13pre72 + * Fix to ppc64el for acl2 FTBFS bug +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-01-21 + +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc_special.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc_special.h +@@ -1,12 +1,12 @@ + static Sym *toc; + +-/* static int tramp[]={0,0, */ +-/* (((0x3a<<10)|(0x9<<5)|0xc)<<16)|0xfff8,/\*ld r9,-8(r12)*\/ */ +-/* ((0x3a<<10)|(0x9<<5)|0x9)<<16, /\*ld r9,0(r9)*\/ */ +-/* 0x7d2c4b78, /\*mr r12,r9 *\/ */ +-/* 0x7d8903a6, /\*mtctr r12*\/ */ +-/* 0x4e800420 /\*bctrl*\/ */ +-/* }; */ ++static int tramp[]={0,0, ++ (((0x3a<<10)|(0x9<<5)|0xc)<<16)|0xfff8,/*ld r9,-8(r12)*/ ++ ((0x3a<<10)|(0x9<<5)|0x9)<<16, /*ld r9,0(r9)*/ ++ 0x7d2c4b78, /*mr r12,r9 */ ++ 0x7d8903a6, /*mtctr r12*/ ++ 0x4e800420 /*bctrl*/ ++}; + + static int + find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, +@@ -15,41 +15,29 @@ find_special_params(void *v,Shdr *sec1,S + Shdr *sec; + Rela *r; + void *ve; ++ ul *u,j; + + massert((sec=get_section(".rela.dyn",sec1,sece,sn))); + + v+=sec->sh_offset; + ve=v+sec->sh_size; + +- for (r=v;vsh_entsize,r=v) ++ for (j=0,r=v;vsh_entsize,r=v) + if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value) +- ds1[ELF_R_SYM(r->r_info)].st_value=*(ul *)r->r_offset; ++ j++; + +- return 0; +- +- +- /* massert((sec=get_section(".rel.dyn",sec1,sece,sn))|| */ +- /* (sec=get_section(".rela.dyn",sec1,sece,sn))); */ ++ massert(u=malloc(j*sizeof(tramp))); + +- /* v+=sec->sh_offset; */ +- /* ve=v+sec->sh_size; */ ++ v=ve-sec->sh_size; ++ for (r=v;vsh_entsize,r=v) ++ if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value) { ++ memcpy(u,tramp,sizeof(tramp)); ++ *u++=r->r_offset; ++ ds1[ELF_R_SYM(r->r_info)].st_value=(ul)u; ++ u=((void *)(u-1)+sizeof(tramp)); ++ } + +- /* for (j=0,r=v;vsh_entsize,r=v) */ +- /* if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value) */ +- /* j++; */ +- +- /* massert(u=malloc(j*sizeof(tramp))); */ +- +- /* v=ve-sec->sh_size; */ +- /* for (r=v;vsh_entsize,r=v) */ +- /* if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value) { */ +- /* memcpy(u,tramp,sizeof(tramp)); */ +- /* *u++=r->r_offset; */ +- /* ds1[ELF_R_SYM(r->r_info)].st_value=(ul)u; */ +- /* u=((void *)(u-1)+sizeof(tramp)); */ +- /* } */ +- +- /* return 0; */ ++ return 0; + + } + diff --git a/debian/patches/Version_2_6_13pre73 b/debian/patches/Version_2_6_13pre73 new file mode 100644 index 0000000..c64ecc4 --- /dev/null +++ b/debian/patches/Version_2_6_13pre73 @@ -0,0 +1,130 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-81) unstable; urgency=high + . + * Version_2_6_13pre72 + * Fix to ppc64el for acl2 FTBFS bug +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-02-02 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4181,7 +4181,7 @@ case $use in + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; + arm*) +- assert_arg_to_cflags -mlong-calls ++# assert_arg_to_cflags -mlong-calls + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -388,7 +388,7 @@ case $use in + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; + arm*) +- assert_arg_to_cflags -mlong-calls ++# assert_arg_to_cflags -mlong-calls + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +--- gcl-2.6.12.orig/h/arm-linux.h ++++ gcl-2.6.12/h/arm-linux.h +@@ -12,5 +12,6 @@ + #define SGC + + #define RELOC_H "elf32_arm_reloc.h" ++#define SPECIAL_RELOC_H "elf32_arm_reloc_special.h" + + #define NEED_STACK_CHK_GUARD +--- gcl-2.6.12.orig/h/elf32_arm_reloc.h ++++ gcl-2.6.12/h/elf32_arm_reloc.h +@@ -53,11 +53,21 @@ + break; + case R_ARM_CALL: + case R_ARM_JUMP24: +- add_vals(where,MASK(24),((long)(s+a-p))>>2); ++ massert(!a); ++ { ++ long x=((long)(s-p))/4; ++ if (abs(x)&(~MASK(23))) { ++ got+=(sym->st_size-1)*tz; ++ memcpy(got,tramp,sizeof(tramp)); ++ got[sizeof(tramp)/sizeof(*got)]=s; ++ x=((long)got-p)/4; ++ } ++ add_vals(where,MASK(24),x); ++ } + break; + case R_ARM_ABS32: +- add_val(where,~0L,s+a); ++ add_vals(where,~0L,s+a); + break; + case R_ARM_V4BX: +- add_val(where,~0L,s+a); ++ add_vals(where,~0L,s+a); + break; +--- /dev/null ++++ gcl-2.6.12/h/elf32_arm_reloc_special.h +@@ -0,0 +1,43 @@ ++/* #define R_AARCH64_TRAMP 1 */ ++static int tramp[]={0xe59fc000, /*ldr r12, [pc]*/ /*FIXME? Can this refer to an earlier address?*/ ++ 0xe12fff1c}; /*br r12*/ ++static ul tz=1+sizeof(tramp)/sizeof(ul); ++ ++ ++static int ++find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, ++ const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) { ++ ++ return 0; ++ ++} ++ ++static int ++label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { ++ ++ Rel *r; ++ Sym *sym; ++ Shdr *sec; ++ void *v,*ve; ++ ++ for (sym=sym1;symst_size=0; ++ ++ for (*gs=0,sec=sec1;secsh_type==SHT_REL) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ if (ELF_R_TYPE(r->r_info)==R_ARM_CALL || ++ ELF_R_TYPE(r->r_info)==R_ARM_JUMP24) { ++ ++ sym=sym1+ELF_R_SYM(r->r_info); ++ ++ if (!sym->st_size) ++ sym->st_size=++*gs; ++ ++ } ++ ++ (*gs)*=tz; ++ ++ return 0; ++ ++} diff --git a/debian/patches/Version_2_6_13pre74 b/debian/patches/Version_2_6_13pre74 new file mode 100644 index 0000000..e8e364f --- /dev/null +++ b/debian/patches/Version_2_6_13pre74 @@ -0,0 +1,47 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-82) unstable; urgency=high + . + * Version_2_6_13pre73 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-02-02 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4122,7 +4122,7 @@ $as_echo_n "checking working gprof... " + sh4*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; +- arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++# arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 + *gnu) enableval="no";; + esac +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -335,7 +335,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + sh4*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; +- arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++# arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 + *gnu) enableval="no";; + esac diff --git a/debian/patches/Version_2_6_13pre76 b/debian/patches/Version_2_6_13pre76 new file mode 100644 index 0000000..bac042b --- /dev/null +++ b/debian/patches/Version_2_6_13pre76 @@ -0,0 +1,446 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-83) unstable; urgency=high + . + * Version_2_6_13pre75 + * FIx acl2 arm builds (Closes: #919477). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/919477 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-02-05 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -2679,6 +2679,7 @@ case $canonical in + mipsel*linux*) use=mipsel-linux;; + sparc*linux*) use=sparc-linux;; + aarch64*linux*) use=aarch64-linux;; ++ arm*linux*hf) use=armhf-linux;; + arm*linux*) use=arm-linux;; + s390*linux*) use=s390-linux;; + ia64*linux*) use=ia64-linux;; +@@ -4122,11 +4123,12 @@ $as_echo_n "checking working gprof... " + sh4*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; +-# arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++# arm*) if echo $canonical |grep -q hf$; then enableval="no"; fi;;#FIXME CALL and JUMP24 veneers needed for thumb 20190201 #FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 + *gnu) enableval="no";; + esac +- if test "$enableval" != "yes" ; then ++ GP_FLAG="" ++ if test "$enableval" != "yes" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 + $as_echo "disabled" >&6; } + else +@@ -4134,7 +4136,8 @@ $as_echo "disabled" >&6; } + $as_echo "ok" >&6; } + OLD_CFLAGS=$CFLAGS # Do not run configure tests with -pg + assert_arg_to_cflags -pg +- CFLAGS=$OLD_CFLAGS ++ GP_FLAG="-pg" ++ CFLAGS=$OLD_CFLAGS + TFPFLAG="" + + $as_echo "#define GCL_GPROF 1" >>confdefs.h +@@ -4180,8 +4183,11 @@ case $use in + ia64*) + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; ++ armhf*) ++ assert_arg_to_cflags -fdollars-in-identifiers ++ assert_arg_to_cflags -g #? ++ ;; + arm*) +-# assert_arg_to_cflags -mlong-calls + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +@@ -9051,6 +9057,7 @@ LDFLAGS="`echo $LDFLAGS | sed 's,gcl.scr + + LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $LIBS $TLIBS" + ++CFLAGS="$CFLAGS $GP_FLAG" + FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS" + + # Work around bug with gcc on ppc -- CM +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -37,6 +37,7 @@ case $canonical in + mipsel*linux*) use=mipsel-linux;; + sparc*linux*) use=sparc-linux;; + aarch64*linux*) use=aarch64-linux;; ++ arm*linux*hf) use=armhf-linux;; + arm*linux*) use=arm-linux;; + s390*linux*) use=s390-linux;; + ia64*linux*) use=ia64-linux;; +@@ -335,17 +336,19 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + sh4*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; +-# arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++# arm*) if echo $canonical |grep -q hf$; then enableval="no"; fi;;#FIXME CALL and JUMP24 veneers needed for thumb 20190201 #FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible + aarch64*) enableval="no";;#unreproducible buildd bug 20170824 + *gnu) enableval="no";; + esac +- if test "$enableval" != "yes" ; then ++ GP_FLAG="" ++ if test "$enableval" != "yes" ; then + AC_MSG_RESULT([disabled]) + else + AC_MSG_RESULT([ok]) + OLD_CFLAGS=$CFLAGS # Do not run configure tests with -pg + assert_arg_to_cflags -pg +- CFLAGS=$OLD_CFLAGS ++ GP_FLAG="-pg" ++ CFLAGS=$OLD_CFLAGS + TFPFLAG="" + AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) + fi +@@ -387,8 +390,11 @@ case $use in + ia64*) + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; ++ armhf*) ++ assert_arg_to_cflags -fdollars-in-identifiers ++ assert_arg_to_cflags -g #? ++ ;; + arm*) +-# assert_arg_to_cflags -mlong-calls + assert_arg_to_cflags -fdollars-in-identifiers + assert_arg_to_cflags -g #? + ;; +@@ -2108,6 +2114,7 @@ LDFLAGS="`echo $LDFLAGS | sed 's,gcl.scr + AC_SUBST(LDFLAGS) + LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $LIBS $TLIBS" + AC_SUBST(LIBS) ++CFLAGS="$CFLAGS $GP_FLAG" + FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS" + AC_SUBST(FINAL_CFLAGS) + # Work around bug with gcc on ppc -- CM +--- /dev/null ++++ gcl-2.6.12/h/armhf-linux.h +@@ -0,0 +1,17 @@ ++#include "linux.h" ++ ++#ifdef IN_GBC ++#undef MPROTECT_ACTION_FLAGS ++#define MPROTECT_ACTION_FLAGS SA_RESTART|SA_SIGINFO ++#define GET_FAULT_ADDR(sig,code,sv,a) \ ++ ((siginfo_t *)code)->si_addr ++/* #define GET_FAULT_ADDR(sig,code,sv,a) \ */ ++/* ((void *)(*((char ***)(&code)))[44]) */ ++#endif ++ ++#define SGC ++ ++#define RELOC_H "elf32_armhf_reloc.h" ++#define SPECIAL_RELOC_H "elf32_armhf_reloc_special.h" ++ ++#define NEED_STACK_CHK_GUARD +--- gcl-2.6.12.orig/h/elf32_arm_reloc.h ++++ gcl-2.6.12/h/elf32_arm_reloc.h +@@ -1,44 +1,7 @@ +-#define R_ARM_THM_CALL 10 +-#define R_ARM_CALL 28 +-#define R_ARM_V4BX 40 +-#define R_ARM_THM_MOVW_ABS_NC 47 +-#define R_ARM_THM_MOVW_ABS 48 + #define R_ARM_MOVW_ABS_NC 43 + #define R_ARM_MOVT_ABS 44 +- case R_ARM_THM_JUMP24: +- s+=a; +- if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) s|=1; +- s-=p+4; /*FIXME maybe drop 4 and add_val below*/ +- s=((long)s>>1); +- massert(!(abs(s)&0xff000000)); +- store_val(where,MASK(11)<<16,(s&0x7ff)<<16); +- store_val(where,MASK(10),s>>11); +- store_val(where,MASK(1)<<(16+11),(~((s>>21&0x1)^(s>>23&0x1)))<<(16+11)); +- store_val(where,MASK(1)<<(16+13),(~((s>>22&0x1)^(s>>23&0x1)))<<(16+13)); +- store_val(where,MASK(1)<<10,(s>>23&0x1)<<10); +- break; +- case R_ARM_THM_CALL: +- s+=a; +- if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) s|=1; +- s-=p+4; /*FIXME maybe drop 4 and add_val below*/ +- s=((long)s>>1); +- massert(!(abs(s)&0xffc00000)); +- store_val(where,MASK(11),s>>11); +- store_val(where,MASK(11)<<16,(s&0x7ff)<<16); +- break; +- case R_ARM_THM_MOVW_ABS_NC: +- s+=a; +- if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) s|=1; +- s&=0xffff; +- s=((s>>12)&0xf)|(((s>>11)&0x1)<<10)|((s&0xff)<<16)|(((s>>8)&0x7)<<28); +- add_vals(where,~0L,s); +- break; +- case R_ARM_THM_MOVW_ABS: +- s+=a; +- s>>=16; +- s=((s>>12)&0xf)|(((s>>11)&0x1)<<10)|((s&0xff)<<16)|(((s>>8)&0x7)<<28); +- add_vals(where,~0L,s); +- break; ++#define R_ARM_CALL 28 ++#define R_ARM_V4BX 40 + case R_ARM_MOVW_ABS_NC: + s+=a; + s&=0xffff; +@@ -53,21 +16,21 @@ + break; + case R_ARM_CALL: + case R_ARM_JUMP24: +- massert(!a); + { +- long x=((long)(s-p))/4; +- if (abs(x)&(~MASK(23))) { ++ long x=((long)(s+a-p))/4; ++ if (abs(x)&(~MASK(23))) {/*24?*/ + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); ++ /*relocate*/ + got[sizeof(tramp)/sizeof(*got)]=s; + x=((long)got-p)/4; + } + add_vals(where,MASK(24),x); + } + break; +- case R_ARM_ABS32: ++ case R_ARM_V4BX: + add_vals(where,~0L,s+a); + break; +- case R_ARM_V4BX: ++ case R_ARM_ABS32: + add_vals(where,~0L,s+a); + break; +--- gcl-2.6.12.orig/h/elf32_arm_reloc_special.h ++++ gcl-2.6.12/h/elf32_arm_reloc_special.h +@@ -1,9 +1,7 @@ +-/* #define R_AARCH64_TRAMP 1 */ +-static int tramp[]={0xe59fc000, /*ldr r12, [pc]*/ /*FIXME? Can this refer to an earlier address?*/ +- 0xe12fff1c}; /*br r12*/ ++static int tramp[]={0xe59fc000, /*ldr r12, [pc]*/ /*FIXME? Can this refer to an earlier address?*/ ++ 0xe12fff1c}; /*br r12*/ + static ul tz=1+sizeof(tramp)/sizeof(ul); + +- + static int + find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, + const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) { +@@ -26,8 +24,10 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + for (*gs=0,sec=sec1;secsh_type==SHT_REL) + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) +- if (ELF_R_TYPE(r->r_info)==R_ARM_CALL || +- ELF_R_TYPE(r->r_info)==R_ARM_JUMP24) { ++ if ( ++ ELF_R_TYPE(r->r_info)==R_ARM_CALL || ++ ELF_R_TYPE(r->r_info)==R_ARM_JUMP24 ++ ) { + + sym=sym1+ELF_R_SYM(r->r_info); + +--- /dev/null ++++ gcl-2.6.12/h/elf32_armhf_reloc.h +@@ -0,0 +1,71 @@ ++#define R_ARM_THM_CALL 10 ++#define R_ARM_THM_MOVW_ABS_NC 47 ++#define R_ARM_THM_MOVW_ABS 48 ++ case R_ARM_THM_JUMP24: ++ { ++ long x=(long)(s+a-p); ++ if (1||abs(x)&(~MASK(25))) { ++ ++ got+=(sym->st_size-1)*tz; ++ memcpy(got,tramp,sizeof(tramp)); ++ ++ r->r_offset=(void *)got-(void *)start; ++ r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_ARM_THM_MOVW_ABS_NC); ++ relocate(sym1,r,0,start,got,gote); ++ ++ r->r_offset=(void *)(got+1)-(void *)start; ++ r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_ARM_THM_MOVW_ABS); ++ relocate(sym1,r,0,start,got,gote); ++ ++ x=((long)got-p); ++ } ++ if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) x|=1; ++ x-=4; /*FIXME maybe drop 4 and add_val below*/ ++ x=((long)x>>1); ++ store_val(where,MASK(11)<<16,(x&0x7ff)<<16); ++ store_val(where,MASK(10),x>>11); ++ store_val(where,MASK(1)<<(16+11),(~((x>>21&0x1)^(x>>23&0x1)))<<(16+11)); ++ store_val(where,MASK(1)<<(16+13),(~((x>>22&0x1)^(x>>23&0x1)))<<(16+13)); ++ store_val(where,MASK(1)<<10,(x>>23&0x1)<<10); ++ } ++ break; ++ case R_ARM_THM_CALL: ++ { ++ long x=(long)(s+a-p); ++ if (1||abs(x)&(~MASK(23))) {/*24?*/ ++ got+=(sym->st_size-1)*tz; ++ memcpy(got,tramp,sizeof(tramp)); ++ ++ r->r_offset=(void *)got-(void *)start; ++ r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_ARM_THM_MOVW_ABS_NC); ++ relocate(sym1,r,0,start,got,gote); ++ ++ r->r_offset=(void *)(got+1)-(void *)start; ++ r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_ARM_THM_MOVW_ABS); ++ relocate(sym1,r,0,start,got,gote); ++ ++ x=((long)got-p); ++ } ++ if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) x|=1; ++ x-=4; /*FIXME maybe drop 4 and add_val below*/ ++ x=((long)x>>1); ++ store_val(where,MASK(11),x>>11); ++ store_val(where,MASK(11)<<16,(x&0x7ff)<<16); ++ } ++ break; ++ case R_ARM_THM_MOVW_ABS_NC: ++ s+=a; ++ if (ELF_ST_TYPE(sym->st_info)==STT_FUNC) s|=1; ++ s&=0xffff; ++ s=((s>>12)&0xf)|(((s>>11)&0x1)<<10)|((s&0xff)<<16)|(((s>>8)&0x7)<<28); ++ add_vals(where,~0L,s); ++ break; ++ case R_ARM_THM_MOVW_ABS: ++ s+=a; ++ s>>=16; ++ s=((s>>12)&0xf)|(((s>>11)&0x1)<<10)|((s&0xff)<<16)|(((s>>8)&0x7)<<28); ++ add_vals(where,~0L,s); ++ break; ++ case R_ARM_ABS32: ++ add_vals(where,~0L,s+a); ++ break; +--- /dev/null ++++ gcl-2.6.12/h/elf32_armhf_reloc_special.h +@@ -0,0 +1,85 @@ ++static int tramp[]={0x0c00f240, /*movw r12, #0*/ ++ 0x0c00f2c0, /*movt r12, #0*/ ++ 0xbf004760}; /*bx r12 nop*/ ++static ul tz=sizeof(tramp)/sizeof(ul); ++ ++static ul * ++next_plt_entry(ul *p,ul *pe) { ++ ++ ul l0=0xe5bef000,/*ldr pc,[ip,#]*/ ++ l1=0xe5bcf000;/*ldr pc,[lr,#]*/ ++ ++ for (;psh_addr; ++ pe=(void *)p+psec->sh_size; ++ ++ massert((sec=get_section( ".rel.plt",sec1,sece,sn)) || ++ (sec=get_section(".rela.plt",sec1,sece,sn))); ++ ++ v+=sec->sh_offset; ++ ve=v+sec->sh_size; ++ ++ p=next_plt_entry(p,pe);/*plt0*/ ++ ++ for (r=v;vsh_entsize,r=v,p=next_plt_entry(p,pe)) { ++ if (!ds1[ELF_R_SYM(r->r_info)].st_value) ++ ds1[ELF_R_SYM(r->r_info)].st_value=(ul)p; ++ } ++ ++ massert(p==pe); ++ massert(v==ve); ++ ++ return 0; ++ ++} ++ ++static int ++label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { ++ ++ Rel *r; ++ Sym *sym; ++ Shdr *sec; ++ void *v,*ve; ++ ++ for (sym=sym1;symst_size=0; ++ ++ for (*gs=0,sec=sec1;secsh_type==SHT_REL) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ if ( ++#define R_ARM_THM_CALL 10 ++ ELF_R_TYPE(r->r_info)==R_ARM_THM_CALL || ++ ELF_R_TYPE(r->r_info)==R_ARM_THM_JUMP24 ++ ) { ++ ++ sym=sym1+ELF_R_SYM(r->r_info); ++ ++ if (!sym->st_size) ++ sym->st_size=++*gs; ++ ++ } ++ ++ (*gs)*=tz; ++ ++ return 0; ++ ++} +--- gcl-2.6.12.orig/makedefc.in ++++ gcl-2.6.12/makedefc.in +@@ -6,10 +6,6 @@ + # for main link of raw_gcl + LIBS=@LIBS@ + +-#The multi precision library stuff +-MPFILES=$(MPDIR)/@MPI_FILE@ $(MPDIR)/libmport.a +- +- + # root for the installation, eg /usr/local + # This would cause make install to create /usr/local/bin/gcl and + # /usr/local/lib/gcl-2-??/* with some basic files. +--- gcl-2.6.12.orig/o/unexelf.c ++++ gcl-2.6.12/o/unexelf.c +@@ -887,7 +887,7 @@ unexec (char *new_name, char *old_name, + + /* Walk through all section headers, insert the new data2 section right + before the new bss section. */ +- for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++) ++ for (n = 0, nn = 0; n < (int) old_file_h->e_shnum; n++, nn++) + { + caddr_t src; + /* If it is (s)bss section, insert the new data2 section before it. */ diff --git a/debian/patches/Version_2_6_13pre77 b/debian/patches/Version_2_6_13pre77 new file mode 100644 index 0000000..42293a8 --- /dev/null +++ b/debian/patches/Version_2_6_13pre77 @@ -0,0 +1,71 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-83) unstable; urgency=high + . + * Version_2_6_13pre76 + * FIx acl2 arm builds (Closes: #919477). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/919477 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-02-05 + +--- gcl-2.6.12.orig/h/elf32_arm_reloc.h ++++ gcl-2.6.12/h/elf32_arm_reloc.h +@@ -18,10 +18,10 @@ + case R_ARM_JUMP24: + { + long x=((long)(s+a-p))/4; +- if (abs(x)&(~MASK(23))) {/*24?*/ ++ if (abs(x)&(~MASK(24))) { + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); +- /*relocate*/ ++ /*recurse on relocate?*/ + got[sizeof(tramp)/sizeof(*got)]=s; + x=((long)got-p)/4; + } +@@ -29,8 +29,6 @@ + } + break; + case R_ARM_V4BX: +- add_vals(where,~0L,s+a); +- break; + case R_ARM_ABS32: + add_vals(where,~0L,s+a); + break; +--- gcl-2.6.12.orig/h/elf32_armhf_reloc.h ++++ gcl-2.6.12/h/elf32_armhf_reloc.h +@@ -4,7 +4,7 @@ + case R_ARM_THM_JUMP24: + { + long x=(long)(s+a-p); +- if (1||abs(x)&(~MASK(25))) { ++ if (abs(x)&(~MASK(24))) { + + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); +@@ -32,7 +32,7 @@ + case R_ARM_THM_CALL: + { + long x=(long)(s+a-p); +- if (1||abs(x)&(~MASK(23))) {/*24?*/ ++ if (abs(x)&(~MASK(23))) { + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); + diff --git a/debian/patches/Version_2_6_13pre78 b/debian/patches/Version_2_6_13pre78 new file mode 100644 index 0000000..8513646 --- /dev/null +++ b/debian/patches/Version_2_6_13pre78 @@ -0,0 +1,38 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-83) unstable; urgency=high + . + * Version_2_6_13pre77 + * FIx acl2 arm builds (Closes: #919477). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/919477 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-02-05 + +--- gcl-2.6.12.orig/h/elf32_arm_reloc.h ++++ gcl-2.6.12/h/elf32_arm_reloc.h +@@ -18,7 +18,7 @@ + case R_ARM_JUMP24: + { + long x=((long)(s+a-p))/4; +- if (abs(x)&(~MASK(24))) { ++ if (abs(x)&(~MASK(23))) { + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); + /*recurse on relocate?*/ diff --git a/debian/patches/Version_2_6_13pre79 b/debian/patches/Version_2_6_13pre79 new file mode 100644 index 0000000..6105d42 --- /dev/null +++ b/debian/patches/Version_2_6_13pre79 @@ -0,0 +1,47 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-83) unstable; urgency=high + . + * Version_2_6_13pre78 + * FIx acl2 arm builds (Closes: #919477). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/919477 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-02-06 + +--- gcl-2.6.12.orig/h/elf32_armhf_reloc.h ++++ gcl-2.6.12/h/elf32_armhf_reloc.h +@@ -4,7 +4,7 @@ + case R_ARM_THM_JUMP24: + { + long x=(long)(s+a-p); +- if (abs(x)&(~MASK(24))) { ++ if (abs(x)&(~MASK(23))) { + + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); +@@ -32,7 +32,7 @@ + case R_ARM_THM_CALL: + { + long x=(long)(s+a-p); +- if (abs(x)&(~MASK(23))) { ++ if (abs(x)&(~MASK(22))) { + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); + diff --git a/debian/patches/Version_2_6_13pre80 b/debian/patches/Version_2_6_13pre80 new file mode 100644 index 0000000..ad89d0d --- /dev/null +++ b/debian/patches/Version_2_6_13pre80 @@ -0,0 +1,111 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-83) unstable; urgency=high + . + * Version_2_6_13pre79 + * Fix acl2 arm builds (Closes: #919477). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/919477 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-03-21 + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -175,7 +175,7 @@ TS_MEMBER(t0,TS(t1)|TS(t2)|TS(t3)...) + #define TS(s) (1<tm_npage)); +- CEerror("The storage for ~A is exhausted.~%\ +-Currently, ~D pages are allocated.~% \ +-Use ALLOCATE to expand the space.", +- "Continues execution.", +- 2, vs_top[-2], vs_top[-1], Cnil, Cnil); +- +- vs_popp; +- vs_popp; ++ CEerror("Continues execution.", ++ "The storage for ~A is exhausted. ~D pages allocated. Use ALLOCATE to expand the space.", ++ 2, type_name(t), make_fixnum(tm->tm_npage)); + + call_after_gbc_hook(t); + +--- gcl-2.6.12.orig/o/array.c ++++ gcl-2.6.12/o/array.c +@@ -211,14 +211,18 @@ DEFUN_NEW("ASET1", object, fSaset1, SI, + break; + case aet_bit: + i += BV_OFFSET(x); +- AGAIN_BIT: + ASSURE_TYPE(val,t_fixnum); +- {int v = Mfix(val); +- if (v == 0) CLEAR_BITREF(x,i); +- else if (v == 1) SET_BITREF(x,i); +- else {val= fSincorrect_type(val,sLbit); +- goto AGAIN_BIT;} +- break;} ++ switch (Mfix(val)) { ++ case 0: ++ CLEAR_BITREF(x,i); ++ break; ++ case 1: ++ SET_BITREF(x,i); ++ break; ++ default: ++ TYPE_ERROR(val,sLbit); ++ } ++ break; + case aet_fix: + ASSURE_TYPE(val,t_fixnum); + (x->fixa.fixa_self[i]) = Mfix(val); +--- gcl-2.6.12.orig/o/utils.c ++++ gcl-2.6.12/o/utils.c +@@ -169,20 +169,6 @@ Ifuncall_n(object fun,int n,...) { + /* return res; */ + /* } */ + +-object +-Icheck_one_type(object x, enum type t) +-{ if (x->d.t != t) +- { return CEerror("Expected a ~a ","Supply right type",1,type_name(t),Cnil,Cnil,Cnil); +- } +- return x; +-} +- +- +-object +-fSincorrect_type(object val, object type) +-{ return CEerror("Got ~a,Expected a ~a","Supply a new one",1,val,type,Cnil,Cnil); +-} +- + /* static void */ + /* Ineed_in_image(object (*foo) (/\* ??? *\/)) */ + /* {;} */ diff --git a/debian/patches/Version_2_6_13pre81 b/debian/patches/Version_2_6_13pre81 new file mode 100644 index 0000000..63f2a28 --- /dev/null +++ b/debian/patches/Version_2_6_13pre81 @@ -0,0 +1,71 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-84) unstable; urgency=medium + . + * Version_2_6_13pre80 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-03-28 + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -329,7 +329,7 @@ empty_relblock(void) { + void + setup_rb(bool preserve_rb_pointerp) { + +- int lowp=new_rb_start!=rb_start || rb_high(); ++ int lowp=rb_high(); + + update_pool(2*(nrbpage-page(rb_size()))); + rb_start=new_rb_start; +@@ -349,10 +349,13 @@ resize_hole(ufixnum hp,enum type tp,bool + char *start=rb_begin(),*new_start=heap_end+hp*PAGESIZE; + ufixnum size=rb_pointer-start; + +- if (!in_placep && +- ((new_start<=start && startrb_end : ++ new_start+(nrbpage<s.s_dbind != Cnil) +- emsg("Toggling relblock when resizing hole to %lu\n",hp); ++ emsg("[GC Toggling relblock when resizing hole to %lu]\n",hp); + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + return resize_hole(hp,tp,in_placep); +@@ -389,7 +392,7 @@ alloc_page(long n) { + d=(available_pages/3)s.s_dbind != Cnil) +- emsg("Hole overrun\n"); ++ emsg("[GC Hole overrun]\n"); + + resize_hole(d+nn,t_relocatable,0); + +@@ -852,7 +855,7 @@ add_pages(struct typemanager *tm,fixnum + + if (rb_high() && m>((rb_start-heap_end)>>PAGEWIDTH)) { + if (sSAnotify_gbcA->s.s_dbind != Cnil) +- emsg("Moving relblock low before expanding relblock pages\n"); ++ emsg("[GC Moving relblock low before expanding relblock pages]\n"); + tm_table[t_relocatable].tm_adjgbccnt--; + GBC(t_relocatable); + } diff --git a/debian/patches/Version_2_6_13pre82 b/debian/patches/Version_2_6_13pre82 new file mode 100644 index 0000000..17a9f6f --- /dev/null +++ b/debian/patches/Version_2_6_13pre82 @@ -0,0 +1,40 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-85) unstable; urgency=medium + . + * Version_2_6_13pre81 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-03-28 + +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -349,9 +349,10 @@ resize_hole(ufixnum hp,enum type tp,bool + char *start=rb_begin(),*new_start=heap_end+hp*PAGESIZE; + ufixnum size=rb_pointer-start; + ++#define OVERLAP(c_,t_,s_) ((t_)<(c_)+(s_) && (c_)<(t_)+(s_)) + if (!in_placep && (rb_high() ? +- new_start+size>rb_end : +- new_start+(nrbpage<s.s_dbind != Cnil) diff --git a/debian/patches/Version_2_6_13pre83 b/debian/patches/Version_2_6_13pre83 new file mode 100644 index 0000000..585f44f --- /dev/null +++ b/debian/patches/Version_2_6_13pre83 @@ -0,0 +1,446 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-85) unstable; urgency=medium + . + * Version_2_6_13pre82 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-04-02 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -6375,7 +6375,7 @@ main () + FILE *f; + if (!(f=fopen("conftest1","w"))) + return -1; +- fprintf(f,"%u",sbrk(0)); ++ fprintf(f,"%p",sbrk(0)); + + ; + return 0; +@@ -6591,7 +6591,7 @@ else + #endif + if (!(f=fopen("conftest1","w"))) + return -1; +- fprintf(f,"%u",sbrk(0)); ++ fprintf(f,"%p",sbrk(0)); + return 0; + } + +@@ -6625,7 +6625,7 @@ else + #include "h/unrandomize.h" + #endif + if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%u",sbrk(0)); ++ fprintf(f,"%p",sbrk(0)); + return 0; + } + +@@ -6653,8 +6653,9 @@ $as_echo "no" >&6; } + as_fn_error $? "exiting" "$LINENO" 5 + fi + fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_ADDRESS" >&5 +-$as_echo_n "checking CSTACK_ADDRESS... " >&6; } ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_DIRECTION" >&5 ++$as_echo_n "checking CSTACK_DIRECTION... " >&6; } + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +@@ -6666,14 +6667,61 @@ else + + #include + #include +- void * +- foo() { ++ ++ unsigned long w; ++ ++ void ++ foo(void) { + int i; +- return (void *)&i; ++ w=(unsigned long)&i; + } + + int + main(int argc,char **argv,char **envp) { ++ void *b; ++ FILE *fp = fopen("conftest1","w"); ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ foo(); ++ fprintf(fp,"%d",((unsigned long) &b) > w ? -1 : 1); ++ fclose(fp); ++ return 0; ++ } ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ cstack_direction=`cat conftest1` ++else ++ cstack_direction=0 ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define CSTACK_DIRECTION $cstack_direction ++_ACEOF ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_direction" >&5 ++$as_echo "$cstack_direction" >&6; } ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_ADDRESS" >&5 ++$as_echo_n "checking CSTACK_ADDRESS... " >&6; } ++if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #include ++ #include ++ int ++ main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); + unsigned long i,j; +@@ -6685,13 +6733,13 @@ else + j<<=$PAGEWIDTH; + j<<=16; + i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- fprintf(fp,"0x%lx",i-1); +- fclose(fp); +- return 0; ++ if ($cstack_direction==1) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ fprintf(fp,"0x%lx",i-1); ++ fclose(fp); ++ return 0; + } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +@@ -6724,12 +6772,6 @@ else + + #include + #include +- void * +- foo() { +- int i; +- return (void *)&i; +- } +- + int + main(int argc,char **argv,char **envp) { + void *v ; +@@ -6743,14 +6785,14 @@ else + j<<=$PAGEWIDTH; + j<<=16; + i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); +- fprintf(fp,"%d",j); +- fclose(fp); +- return 0; ++ if ($cstack_direction==1) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); ++ fprintf(fp,"%ld",j); ++ fclose(fp); ++ return 0; + } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +@@ -6854,54 +6896,6 @@ _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_alignment" >&5 + $as_echo "$cstack_alignment" >&6; } + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_DIRECTION" >&5 +-$as_echo_n "checking CSTACK_DIRECTION... " >&6; } +-if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run test program while cross compiling +-See \`config.log' for more details" "$LINENO" 5; } +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +- #include +- #include +- void * +- foo(void) { +- int i; +- return (void *)&i; +- } +- +- int +- main(int argc,char **argv,char **envp) { +- char *b; +- FILE *fp = fopen("conftest1","w"); +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- fprintf(fp,"%d",((long) &b) > ((long) foo()) ? -1 : 1); +- fclose(fp); +- return 0; +- } +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- cstack_direction=`cat conftest1` +-else +- cstack_direction=0 +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +- +-cat >>confdefs.h <<_ACEOF +-#define CSTACK_DIRECTION $cstack_direction +-_ACEOF +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_direction" >&5 +-$as_echo "$cstack_direction" >&6; } +- + # Check whether --enable-immfix was given. + if test "${enable_immfix+set}" = set; then : + enableval=$enable_immfix; +@@ -7050,8 +7044,7 @@ int + main () + { + +- void *v; +- unsigned long i,j,k,l,m; ++ unsigned long i,j,k,l; + FILE *fp = fopen("conftest1","w"); + + for (i=2,k=1;i;k=i,i<<=1); +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -1049,7 +1049,7 @@ AC_RUN_IFELSE( + FILE *f; + if (!(f=fopen("conftest1","w"))) + return -1; +- fprintf(f,"%u",sbrk(0)); ++ fprintf(f,"%p",sbrk(0)); + ]])], + [HAVE_SBRK=1;AC_MSG_RESULT([yes])], + AC_MSG_RESULT([no: WARNING you must be able to emulate sbrk: as on mingw or macosx]), +@@ -1145,7 +1145,7 @@ if test "$HAVE_SBRK" = "1" ; then + #endif + if (!(f=fopen("conftest1","w"))) + return -1; +- fprintf(f,"%u",sbrk(0)); ++ fprintf(f,"%p",sbrk(0)); + return 0; + } + ]])],[SBRK=`cat conftest1`]) +@@ -1165,7 +1165,7 @@ if test "$HAVE_SBRK" = "1" ; then + #include "h/unrandomize.h" + #endif + if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%u",sbrk(0)); ++ fprintf(f,"%p",sbrk(0)); + return 0; + } + ]])],[SBRK1=`cat conftest1`]) +@@ -1183,20 +1183,47 @@ if test "$HAVE_SBRK" = "1" ; then + AC_MSG_ERROR([exiting]) + fi + fi +-AC_MSG_CHECKING(CSTACK_ADDRESS) ++ ++AC_MSG_CHECKING(CSTACK_DIRECTION) + AC_RUN_IFELSE( + [AC_LANG_SOURCE( + [[ + #include + #include +- void * +- foo() { ++ ++ unsigned long w; ++ ++ void ++ foo(void) { + int i; +- return (void *)&i; ++ w=(unsigned long)&i; + } + + int + main(int argc,char **argv,char **envp) { ++ void *b; ++ FILE *fp = fopen("conftest1","w"); ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ foo(); ++ fprintf(fp,"%d",((unsigned long) &b) > w ? -1 : 1); ++ fclose(fp); ++ return 0; ++ }]])], ++ [cstack_direction=`cat conftest1`],[cstack_direction=0]) ++AC_DEFINE_UNQUOTED(CSTACK_DIRECTION,$cstack_direction,[whether C stack grows up or down]) ++AC_MSG_RESULT($cstack_direction) ++ ++ ++AC_MSG_CHECKING(CSTACK_ADDRESS) ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ int ++ main(int argc,char **argv,char **envp) { + void *v ; + FILE *fp = fopen("conftest1","w"); + unsigned long i,j; +@@ -1208,13 +1235,13 @@ AC_RUN_IFELSE( + j<<=$PAGEWIDTH; + j<<=16; + i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- fprintf(fp,"0x%lx",i-1); +- fclose(fp); +- return 0; ++ if ($cstack_direction==1) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ fprintf(fp,"0x%lx",i-1); ++ fclose(fp); ++ return 0; + }]])], + [cstack_address=`cat conftest1`],[cstack_address=0]) + AC_DEFINE_UNQUOTED(CSTACK_ADDRESS,$cstack_address,[starting C stack address]) +@@ -1226,12 +1253,6 @@ AC_RUN_IFELSE( + [[ + #include + #include +- void * +- foo() { +- int i; +- return (void *)&i; +- } +- + int + main(int argc,char **argv,char **envp) { + void *v ; +@@ -1245,14 +1266,14 @@ AC_RUN_IFELSE( + j<<=$PAGEWIDTH; + j<<=16; + i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); +- fprintf(fp,"%d",j); +- fclose(fp); +- return 0; ++ if ($cstack_direction==1) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); ++ fprintf(fp,"%ld",j); ++ fclose(fp); ++ return 0; + }]])], + [cstack_bits=`cat conftest1`],[cstack_bits=0]) + AC_DEFINE_UNQUOTED(CSTACK_BITS,$cstack_bits,[log starting C stack address]) +@@ -1302,33 +1323,6 @@ AC_RUN_IFELSE( + AC_DEFINE_UNQUOTED(CSTACK_ALIGNMENT,$cstack_alignment,[C stack alignment]) + AC_MSG_RESULT($cstack_alignment) + +-AC_MSG_CHECKING(CSTACK_DIRECTION) +-AC_RUN_IFELSE( +- [AC_LANG_SOURCE( +- [[ +- #include +- #include +- void * +- foo(void) { +- int i; +- return (void *)&i; +- } +- +- int +- main(int argc,char **argv,char **envp) { +- char *b; +- FILE *fp = fopen("conftest1","w"); +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- fprintf(fp,"%d",((long) &b) > ((long) foo()) ? -1 : 1); +- fclose(fp); +- return 0; +- }]])], +- [cstack_direction=`cat conftest1`],[cstack_direction=0]) +-AC_DEFINE_UNQUOTED(CSTACK_DIRECTION,$cstack_direction,[whether C stack grows up or down]) +-AC_MSG_RESULT($cstack_direction) +- + AC_ARG_ENABLE([immfix],[ --enable-immfix will enable an immediate fixnum table above the C stack]) + + AC_ARG_ENABLE([fastimmfix],[ --enable-fastimmfix=XXXX will reject low immediate fixnums unless 2^XXX can be attained],,[enable_fastimmfix=64]) +@@ -1429,8 +1423,7 @@ AC_RUN_IFELSE( + #include + ]], + [[ +- void *v; +- unsigned long i,j,k,l,m; ++ unsigned long i,j,k,l; + FILE *fp = fopen("conftest1","w"); + + for (i=2,k=1;i;k=i,i<<=1); +--- gcl-2.6.12.orig/h/unrandomize.h ++++ gcl-2.6.12/h/unrandomize.h +@@ -14,7 +14,7 @@ + long pers = personality(READ_IMPLIES_EXEC|personality(0xffffffffUL)); + long flag = ADDR_NO_RANDOMIZE; + +- if (sizeof(long)==4) flag|=ADDR_LIMIT_3GB|ADDR_COMPAT_LAYOUT; ++ if (sizeof(long)==4) flag|=ADDR_LIMIT_3GB/* |ADDR_COMPAT_LAYOUT */; + + if (pers==-1) {printf("personality failure %d\n",errno);exit(-1);} + if ((pers & flag)!=flag && !getenv("GCL_UNRANDOMIZE")) { diff --git a/debian/patches/Version_2_6_13pre84 b/debian/patches/Version_2_6_13pre84 new file mode 100644 index 0000000..ce8c974 --- /dev/null +++ b/debian/patches/Version_2_6_13pre84 @@ -0,0 +1,45 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-86) unstable; urgency=medium + . + * Version_2_6_13pre83 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-04-06 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4121,6 +4121,7 @@ $as_echo_n "checking working gprof... " + powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; + s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; ++ m68k*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; + # arm*) if echo $canonical |grep -q hf$; then enableval="no"; fi;;#FIXME CALL and JUMP24 veneers needed for thumb 20190201 #FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -334,6 +334,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; + s390*) enableval="no";;#mcount smashes float args in make_shortfloat 20180313 + sh4*) enableval="no";; ++ m68k*) enableval="no";; + ia64*) enableval="no";; + hppa*) enableval="no";; + # arm*) if echo $canonical |grep -q hf$; then enableval="no"; fi;;#FIXME CALL and JUMP24 veneers needed for thumb 20190201 #FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible diff --git a/debian/patches/Version_2_6_13pre85 b/debian/patches/Version_2_6_13pre85 new file mode 100644 index 0000000..8f38b60 --- /dev/null +++ b/debian/patches/Version_2_6_13pre85 @@ -0,0 +1,123 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-88) unstable; urgency=medium + . + * Source only upload +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-12-07 + +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc.h +@@ -1,9 +1,25 @@ ++#define R_PPC64_PLTSEQ 119 /*FIXME not in elf.h*/ ++#define R_PPC64_PLTCALL 120 ++ + #define ha(x_) ((((x_) >> 16) + (((x_) & 0x8000) ? 1 : 0)) & 0xffff) + #define lo(x_) ((x_) & 0xffff) + + case R_PPC64_REL16_HA: + store_val(where,MASK(16),ha(s+a-p)); + break; ++ case R_PPC64_PLT16_HA: ++ gote=got+sym->st_size-1; ++ *gote=s+a; ++ store_val(where,MASK(16),ha((ul)gote-toc->st_value)); ++ break; ++ case R_PPC64_PLT16_LO_DS: ++ gote=got+sym->st_size-1; ++ *gote=s+a; ++ store_val(where,MASK(16),lo((ul)gote-toc->st_value));/*>>2*/ ++ break; ++ case R_PPC64_PLTSEQ: ++ case R_PPC64_PLTCALL: ++ break; + case R_PPC64_TOC16_HA: + store_val(where,MASK(16),ha(s+a-toc->st_value)); + break; +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc_special.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc_special.h +@@ -9,16 +9,12 @@ static int tramp[]={0,0, + }; + + static int +-find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, +- const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) { +- +- Shdr *sec; ++load_trampolines(void *v,Shdr *sec,Sym *ds1) { ++ + Rela *r; + void *ve; + ul *u,j; + +- massert((sec=get_section(".rela.dyn",sec1,sece,sn))); +- + v+=sec->sh_offset; + ve=v+sec->sh_size; + +@@ -42,8 +38,25 @@ find_special_params(void *v,Shdr *sec1,S + } + + static int ++find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, ++ const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) { ++ ++ Shdr *sec; ++ ++ massert((sec=get_section(".rela.dyn",sec1,sece,sn))); ++ massert(!load_trampolines(v,sec,ds1)); ++ if ((sec=get_section(".rela.plt",sec1,sece,sn))) ++ massert(!load_trampolines(v,sec,ds1)); ++ ++ return 0; ++ ++} ++ ++static int + label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { + ++ Rela *r; ++ void *v,*ve; + Shdr *sec; + Sym *sym; + +@@ -58,6 +71,22 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + } + } + ++ for (sym=sym1;symst_size=0; ++ ++ for (*gs=0,sec=sec1;secsh_type==SHT_RELA) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ if (ELF_R_TYPE(r->r_info)==R_PPC64_PLT16_HA|| ++ ELF_R_TYPE(r->r_info)==R_PPC64_PLT16_LO_DS) { ++ ++ sym=sym1+ELF_R_SYM(r->r_info); ++ ++ if (!sym->st_size) ++ sym->st_size=++*gs; ++ ++ } ++ + return 0; + + } diff --git a/debian/patches/Version_2_6_13pre86 b/debian/patches/Version_2_6_13pre86 new file mode 100644 index 0000000..9bc68f2 --- /dev/null +++ b/debian/patches/Version_2_6_13pre86 @@ -0,0 +1,45 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-88) unstable; urgency=medium + . + * Source only upload +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-12-07 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4194,6 +4194,7 @@ case $use in + ;; + powerpc*) + assert_arg_to_cflags -mlongcall ++ if test "$host_cpu" != "powerpc64le" ; then assert_arg_to_cflags -mno-pltseq; fi + ;; + esac;; + esac +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -401,6 +401,7 @@ case $use in + ;; + powerpc*) + assert_arg_to_cflags -mlongcall ++ if test "$host_cpu" != "powerpc64le" ; then assert_arg_to_cflags -mno-pltseq; fi + ;; + esac;; + esac diff --git a/debian/patches/Version_2_6_13pre87 b/debian/patches/Version_2_6_13pre87 new file mode 100644 index 0000000..b38d6b4 --- /dev/null +++ b/debian/patches/Version_2_6_13pre87 @@ -0,0 +1,89 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-89) unstable; urgency=medium + . + * Bug fix: "gcl - FTBFS on ppc64el - invalid relocation type 31", thanks + to thierry.fauck@fr.ibm.com; (Closes: #942312). + * Bug fix: "FTBFS on ppc64el", thanks to Ivo De Decker (Closes: + #944651). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/942312 +Bug-Debian: https://bugs.debian.org/944651 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-12-08 + +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc.h +@@ -10,32 +10,38 @@ + case R_PPC64_PLT16_HA: + gote=got+sym->st_size-1; + *gote=s+a; ++ massert(toc); + store_val(where,MASK(16),ha((ul)gote-toc->st_value)); + break; + case R_PPC64_PLT16_LO_DS: + gote=got+sym->st_size-1; + *gote=s+a; ++ massert(toc); + store_val(where,MASK(16),lo((ul)gote-toc->st_value));/*>>2*/ + break; + case R_PPC64_PLTSEQ: + case R_PPC64_PLTCALL: + break; + case R_PPC64_TOC16_HA: ++ massert(toc); + store_val(where,MASK(16),ha(s+a-toc->st_value)); + break; + case R_PPC64_TOC16_LO_DS: ++ massert(toc); + store_val(where,MASK(16),lo(s+a-toc->st_value));/*>>2*/ + break; + case R_PPC64_REL16_LO: + store_val(where,MASK(16),lo(s+a-p)); + break; + case R_PPC64_TOC16_LO: ++ massert(toc); + store_val(where,MASK(16),lo(s+a-toc->st_value)); + break; + case R_PPC64_ADDR64: + store_val(where,~0L,(s+a)); + break; + case R_PPC64_TOC: ++ massert(toc); + store_val(where,~0L,toc->st_value); + break; + case R_PPC64_REL32: +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc_special.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc_special.h +@@ -60,13 +60,12 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + Shdr *sec; + Sym *sym; + +- massert(sec=get_section(".toc",sec1,sece,sn)); +- +- for (sym=sym1;symst_name; + if (!strcmp(s,".TOC.") || !strcmp(s,".toc.")) { + toc=sym; + toc->st_info=ELF_ST_INFO(STB_LOCAL,ELF_ST_TYPE(sym->st_info)); ++ massert((sec=get_section(".bss",sec1,sece,sn))); + toc->st_shndx=sec-sec1; + } + } diff --git a/debian/patches/Version_2_6_13pre88 b/debian/patches/Version_2_6_13pre88 new file mode 100644 index 0000000..5701ceb --- /dev/null +++ b/debian/patches/Version_2_6_13pre88 @@ -0,0 +1,151 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-90) unstable; urgency=medium + . + * Version_2_6_13pre87 + * latest standards +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-12-18 + +--- gcl-2.6.12.orig/h/pool.h ++++ gcl-2.6.12/h/pool.h +@@ -20,9 +20,8 @@ static struct pool { + ufixnum s; + } *Pool; + +-static struct flock pl,*plp=&pl; +- +-static const char *gcl_pool="/tmp/gcl_pool"; ++static struct flock f,pl,*plp=&pl; ++static char gcl_pool[PATH_MAX]; + + static int + set_lock(void) { +@@ -66,8 +65,8 @@ open_pool(void) { + + if (pool==-1) { + +- struct flock f; +- ++ massert(!home_namestring1("~",1,FN1,sizeof(FN1))); ++ massert(snprintf(gcl_pool,sizeof(gcl_pool),"%sgcl_pool",FN1)>=0); + massert((pool=open(gcl_pool,O_CREAT|O_RDWR,0644))!=-1); + massert(!ftruncate(pool,sizeof(struct pool))); + massert((Pool=mmap(NULL,sizeof(struct pool),PROT_READ|PROT_WRITE,MAP_SHARED,pool,0))!=(void *)-1); +@@ -111,6 +110,9 @@ close_pool(void) { + + #ifndef NO_FILE_LOCKING + if (pool!=-1) { ++ f.l_type=F_WRLCK; ++ if (!fcntl(pool,F_SETLK,&f)) ++ massert(!unlink(gcl_pool)); + register_pool(-1); + massert(!close(pool)); + massert(!munmap(Pool,sizeof(struct pool))); +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1971,3 +1971,6 @@ travel_find_sharing(object,object); + + object + new_cfdata(void); ++ ++int ++home_namestring1(const char *,int,char *,int); +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -95,16 +95,20 @@ DEFUN_NEW("UID-TO-NAME",object,fSuid_to_ + #endif + } + +-DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") { ++int ++home_namestring1(const char *n,int s,char *o,int so) { + +-#ifndef __MINGW32__ ++ #ifndef __MINGW32__ + struct passwd *pwent,pw; + long r; + ++ massert(s>0); ++ massert(*n=='~'); ++ + massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); + massert(r<=sizeof(GETPW_BUF));/*FIXME maybe once at image startup*/ + +- if (nm->st.st_fillp==1) ++ if (s==1) + + if ((pw.pw_dir=getenv("HOME"))) + pwent=&pw; +@@ -113,26 +117,44 @@ DEFUN_NEW("HOME-NAMESTRING",object,fShom + + else { + +- massert(nm->st.st_fillpst.st_self+1,nm->st.st_fillp-1); +- FN2[nm->st.st_fillp-1]=0; ++ massert(spw_dir))+2pw_dir,r); +- FN3[r]='/'; +- FN3[r+1]=0; +- RETURN1(make_simple_string(FN3)); ++ massert((r=strlen(pwent->pw_dir))+2pw_dir,r); ++ o[r]='/'; ++ o[r+1]=0; ++ return 0; + #else +- massert(snprintf(FN1,sizeof(FN1)-1,"%s%s",getenv("SystemDrive"),getenv("HOMEPATH"))>=0); +- RETURN1(make_simple_string(FN1)); ++ massert(snprintf(o,so-1,"%s%s",getenv("SystemDrive"),getenv("HOMEPATH"))>=0); ++ return 0; + #endif + + } + ++ ++DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") { ++ ++ check_type_string(&nm); ++ ++ massert(!home_namestring1(nm->st.st_self,nm->st.st_fillp,FN1,sizeof(FN1))); ++ RETURN1(make_simple_string(FN1)); ++ ++} ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fShome_namestring(object x) { ++ return FFN(fShome_namestring)(x); ++} ++#endif ++ ++ ++ + #define FILE_EXISTS_P(a_,b_) !stat(a_,&b_) && S_ISREG(b_.st_mode) + #define DIR_EXISTS_P(a_,b_) !stat(a_,&b_) && S_ISDIR(b_.st_mode) + diff --git a/debian/patches/Version_2_6_13pre89 b/debian/patches/Version_2_6_13pre89 new file mode 100644 index 0000000..dec8596 --- /dev/null +++ b/debian/patches/Version_2_6_13pre89 @@ -0,0 +1,277 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-91) unstable; urgency=medium + . + * Version_2_6_13pre88 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-12-30 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -57,28 +57,19 @@ + + + ;; Let the user write dump c-file etc to /dev/null. +-(defun get-output-pathname (file ext name &optional (dir (pathname-directory *default-pathname-defaults*)) ++(defun get-output-pathname (file ext name &optional ++ (dir (pathname-directory *default-pathname-defaults*)) + (device (pathname-device *default-pathname-defaults*))) +- (cond +- ((equal file "/dev/null") (pathname file)) ++ (cond ((equal file "/dev/null") (pathname file)) + #+aix3 + ((and (equal name "float") + (equal ext "h")) + (get-output-pathname file ext "Float" )) +- (t +- (make-pathname :device (or (and (not (null file)) +- (not (eq file t)) +- (pathname-device file)) +- device) +- :directory (or (and (not (null file)) +- (not (eq file t)) +- (pathname-directory file)) +- dir) +- :name (or (and (not (null file)) +- (not (eq file t)) +- (pathname-name file)) +- name) +- :type ext)))) ++ ((let ((lf (and file (not (eq file t))))) ++ (let ((device (if lf (pathname-device file) device)) ++ (dir (if lf (pathname-directory file) dir)) ++ (name (if lf (pathname-name file) name))) ++ (make-pathname :device device :directory dir :name name :type ext)))))) + + (defun safe-system (string) + (multiple-value-bind +@@ -109,15 +100,7 @@ + ;; will be performed for separate chunks of the lisp files. + (defvar *split-files* nil) ;; if + +-(defun check-end (form eof) +- (cond ((eq form eof) +- (setf (third *split-files*) nil)) +- ((> (file-position *compiler-input*) +- (car *split-files*)) +- (setf (third *split-files*)(file-position *compiler-input*))))) +- +- +-(defun compile-file (&rest args ++(defun compile-file (filename &rest args + &aux (*print-pretty* nil) + (*package* *package*) (*split-files* *split-files*) + (*PRINT-CIRCLE* NIL) +@@ -131,17 +114,17 @@ + (*PRINT-BASE* 10) + (*PRINT-ESCAPE* T) + (section-length *split-files*) +- tem) ++ tem warnings failures ++ (filename (pathname filename)) ++ (*compile-file-pathname* (merge-pathnames filename #p".lsp")) ++ (*compile-file-truename* (truename *compile-file-pathname*))) + (loop + (compiler::init-env) +- (setq tem (apply 'compiler::compile-file1 args)) +- (cond ((atom *split-files*)(return tem)) +- ((and (consp *split-files*) +- (null (third *split-files*))) +- (let ((gaz (let ((*DEFAULT-PATHNAME-DEFAULTS* (car args))) +- (gazonk-name))) +- (*readtable* (si::standard-readtable))) +- (setq gaz (get-output-pathname gaz "lsp" (car args))) ++ (setq tem (apply 'compile-file1 filename args)) ++ (cond ((atom *split-files*) ++ (return (values (when tem (truename tem)) warnings failures))) ++ ((null (third *split-files*)) ++ (let ((gaz (gazonk-name))(*readtable* (si::standard-readtable))) + (with-open-file (st gaz :direction :output) + (print + `(eval-when (load eval) +@@ -149,16 +132,15 @@ + (load (merge-pathnames v si::*load-pathname*)))) + st)) + (setq *split-files* nil) +- (or (member :output-file args) +- (setq args (append args (list :output-file (car args))))) + (return +- (prog1 (apply 'compile-file gaz (cdr args)) +- (unless *keep-gaz* (mdelete-file gaz)))) +- )) +- (t nil)) +- (if (consp *split-files*) +- (setf (car *split-files*) (+ (third *split-files*) section-length))) +- )) ++ (let ((tem (apply 'compile-file gaz ++ (append args ++ (unless (member :output-file args) ++ (list :output-file ++ (get-output-pathname filename "o" nil nil nil))))))) ++ (unless *keep-gaz* (mdelete-file gaz)) ++ (values (when tem (truename tem)) warnings failures))))) ++ ((setf (car *split-files*) (+ (third *split-files*) section-length)))))) + + + (defun compile-file1 (input-pathname +@@ -172,13 +154,14 @@ + (prof-p *default-prof-p*) + (print nil) + (load nil) +- &aux (*standard-output* *standard-output*) +- (*prof-p* prof-p) ++ &aux ++ (*standard-output* *standard-output*) ++ (*prof-p* prof-p) ++ (output-file (pathname output-file)) + (*error-output* *error-output*) + (*compiler-in-use* *compiler-in-use*) + (*c-debug* c-debug) + (*compile-print* (or print *compile-print*)) +- (*package* *package*) + (*DEFAULT-PATHNAME-DEFAULTS* #p"") + (*data* (list nil)) + *init-name* +@@ -211,41 +194,30 @@ Cannot compile ~a.~%" + (*compiler-input* (merge-pathnames input-pathname #p".lsp")) + + +- (cond ((numberp *split-files*) +- (if (< (file-length *compiler-input*) *split-files*) +- (setq *split-files* nil) +- (setq *split-files* (list *split-files* nil 0 nil))))) ++ (when (numberp *split-files*) ++ (setq *split-files* (unless (< (file-length *compiler-input*) *split-files*) (list *split-files* nil 0 nil)))) + +- (cond ((consp *split-files*) +- (file-position *compiler-input* (third *split-files*)) +- (setq output-file +- (make-pathname :directory (pathname-directory output-file) +- :name (format nil "~a~a" (length (second *split-files*)) (pathname-name (pathname output-file))) +- :type "o")) +- +- (push (pathname-name output-file) (second *split-files*)))) ++ (when (consp *split-files*) ++ (file-position *compiler-input* (third *split-files*)) ++ (setq output-file ++ (make-pathname :directory (pathname-directory output-file) ++ :name (format nil "~a~a" ++ (pathname-name output-file) ++ (length (second *split-files*))) ++ :type "o"))) + + +- (let* ((eof (cons nil nil)) +- (dir (or (and (not (null output-file)) +- (pathname-directory output-file)) +- (pathname-directory input-pathname))) +- (name (or (and (not (null output-file)) +- (pathname-name output-file)) +- (pathname-name input-pathname))) +- (device (or (and (not (null output-file)) +- (pathname-device output-file)) +- (pathname-device input-pathname))) +- (typ (or (and (not (null output-file)) +- (pathname-type output-file)) +- "o")) +- +- (o-pathname (get-output-pathname o-file typ name dir device)) +- (c-pathname (get-output-pathname c-file "c" name dir device)) +- (h-pathname (get-output-pathname h-file "h" name dir device)) +- (data-pathname (get-output-pathname data-file "data" name dir device))) ++ (let* ((eof (cons nil nil)) ++ (dir (pathname-directory (or output-file input-pathname))) ++ (name (pathname-name (or output-file input-pathname))) ++ (device (pathname-device (or output-file input-pathname))) ++ (typ (pathname-type (or output-file #p".o"))) ++ (o-pathname (get-output-pathname o-file typ name dir device)) ++ (c-pathname (get-output-pathname c-file "c" name dir device)) ++ (h-pathname (get-output-pathname h-file "h" name dir device)) ++ (data-pathname (get-output-pathname data-file "data" name dir device))) + +- (declare (special dir name )) ++ (declare (special dir name)) + + (init-env) + +@@ -278,21 +250,32 @@ Cannot compile ~a.~%" + (setq prev nil)) + + ;; t1expr the package ops again.. +- (if (consp *split-files*) +- (dolist (v (fourth *split-files*)) (t1expr v))) ++ (when (consp *split-files*) ++ (dolist (v (fourth *split-files*)) (t1expr v))) ++ + (unwind-protect + (do ((form (read *compiler-input* nil eof)(read *compiler-input* nil eof)) +- (load-flag (if *eval-when-defaults* (member 'load *eval-when-defaults*) t))) ++ (load-flag (if *eval-when-defaults* ++ (or (member 'load *eval-when-defaults*) ++ (member :load-toplevel *eval-when-defaults*)) ++ t))) + (nil) +- (cond +- ((eq form eof)) +- (load-flag (t1expr form)) +- ((maybe-eval nil form))) +- (cond +- ((and *split-files* (check-end form eof)) +- (setf (fourth *split-files*) nil);(reverse (third *data*)) ;FIXME check this +- (return nil)) +- ((eq form eof) (return nil)))) ++ ++ (unless (eq form eof) ++ (if load-flag ++ (t1expr form) ++ (maybe-eval nil form))) ++ ++ (when (or (eq form eof) ++ (when *split-files* ++ (> (file-position *compiler-input*) (car *split-files*)))) ++ ++ (when *split-files* ++ (push (pathname-name output-file) (second *split-files*)) ++ (setf (third *split-files*) (unless (eq form eof) (file-position *compiler-input*))) ++ (setf (fourth *split-files*) nil));(reverse (third *data*)) ;FIXME check this ++ ++ (return nil))) + + (when prev (set-dispatch-macro-character #\# #\, prev rtb))))) + +@@ -331,7 +314,7 @@ Cannot compile ~a.~%" + (unless c-file (mdelete-file c-pathname)) + (unless h-file (mdelete-file h-pathname)) + (unless (or data-file #+ld-not-accept-data t system-p) (mdelete-file data-pathname)) +- o-pathname) ++ (when o-file o-pathname)) + + (progn + (when (probe-file c-pathname) (mdelete-file c-pathname)) +@@ -339,8 +322,7 @@ Cannot compile ~a.~%" + (when (probe-file data-pathname) (mdelete-file data-pathname)) + (format t "~&No FASL generated.~%") + (setq *error-p* t) +- (values) +- )))))) ++ (values)))))) + + (defun gazonk-name () + (dotimes (i 1000) diff --git a/debian/patches/Version_2_6_13pre8a b/debian/patches/Version_2_6_13pre8a new file mode 100644 index 0000000..1031df6 --- /dev/null +++ b/debian/patches/Version_2_6_13pre8a @@ -0,0 +1,1359 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-8) unstable; urgency=medium + . + * Version_2_6_13pre7 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/gcl-tk/comm.c ++++ gcl-2.6.12/gcl-tk/comm.c +@@ -66,7 +66,7 @@ fScheck_fd_for_input(fixnum fd,fixnum ti + + + struct connection_state * +-setup_connection_state(fd) ++setup_connection_state(int fd) + { struct connection_state * res; + res = (void *)malloc(sizeof(struct connection_state)); + bzero(res,sizeof(struct connection_state)); +--- gcl-2.6.12.orig/gcl-tk/guis.h ++++ gcl-2.6.12/gcl-tk/guis.h +@@ -4,6 +4,10 @@ + #include + + #define NO_PRELINK_UNEXEC_DIVERSION ++#define IMMNUM_H ++#define GMP_WRAPPERS_H ++#define ERROR_H ++ + #include "include.h" + + #ifdef NeXT +--- gcl-2.6.12.orig/gmp4/mpn/x86_64/k8/redc_1.asm ++++ gcl-2.6.12/gmp4/mpn/x86_64/k8/redc_1.asm +@@ -114,7 +114,7 @@ ifdef(`PIC',` + + JUMPTABSECT + ALIGN(8) +-L(tab): JMPENT( L(0m4), L(tab)) ++L(tab): JMPENT( L(0), L(tab)) + JMPENT( L(1), L(tab)) + JMPENT( L(2), L(tab)) + JMPENT( L(3), L(tab)) +@@ -397,6 +397,7 @@ L(le1): add %r10, (up) + + + ALIGN(16) ++L(0): + L(0m4): + L(lo0): mov (mp,nneg,8), %rax + mov nneg, i +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -29,7 +29,7 @@ void *malloc(size_t); + void *realloc(void *,size_t); + /* void * memalign(size_t,size_t); */ + void *alloc_contblock(size_t); +-inline void *alloc_relblock(size_t); ++void *alloc_relblock(size_t); + /* object fSallocate_contiguous_pages(); */ + /* object fSallocate_relocatable_pages(); */ + +@@ -291,9 +291,7 @@ EXTER object sSAsystem_directoryA; + #ifdef UNIX + EXTER char *kcl_self; + #endif +-#if !defined(IN_MAIN) || !defined(ATT) + EXTER bool raw_image; +-#endif + char *merge_system_directory(); + + +--- gcl-2.6.12.orig/h/cmpincl1.h ++++ gcl-2.6.12/h/cmpincl1.h +@@ -1,2 +1 @@ +-#define EXTER extern + #define CMPINCLUDE +--- gcl-2.6.12.orig/h/compbas.h ++++ gcl-2.6.12/h/compbas.h +@@ -1,2 +1,12 @@ + #include + #define _VA_LIST_DEFINED ++#ifndef EXTER ++#define EXTER extern ++#endif ++#ifndef INLINE ++#if defined(__GNUC__) && __GNUC__ <= 4 ++#define INLINE extern inline ++#else ++#define INLINE inline ++#endif ++#endif +--- gcl-2.6.12.orig/h/error.h ++++ gcl-2.6.12/h/error.h +@@ -1,4 +1,7 @@ +-#define Icall_error_handler(a_,b_,c_,d_...) \ ++#ifndef ERROR_H ++#define ERROR_H ++ ++#define Icall_error_handler(a_,b_,c_,d_...) \ + Icall_gen_error_handler(Cnil,null_string,a_,b_,c_,##d_) + #define Icall_continue_error_handler(a_,b_,c_,d_,e_...) \ + Icall_gen_error_handler(Ct,a_,b_,c_,d_,##e_) +@@ -8,12 +11,8 @@ extern enum type t_vtype; + extern int vtypep_fn(object); + extern void Check_type(object *,int (*)(object),object); + ++#define PFN(a_) INLINE int Join(a_,_fn)(object x) {return a_(x);} + +-#ifdef IN_MAIN +-#define PFN(a_) int Join(a_,_fn)(object x) {return a_(x);} +-#else +-#define PFN(a_) extern int Join(a_,_fn)(object x); +-#endif + PFN(integerp) + PFN(non_negative_integerp) + PFN(rationalp) +@@ -201,3 +200,4 @@ object ihs_top_function_name(ihs_ptr h); + abort();\ + }) + ++#endif /*ERROR_H*/ +--- gcl-2.6.12.orig/h/gmp_wrappers.h ++++ gcl-2.6.12/h/gmp_wrappers.h +@@ -1,12 +1,8 @@ +-#ifndef GMP_EXTERN +-#define GMP_EXTERN extern +-#endif +-#ifndef GMP_EXTERN_INLINE +-#define GMP_EXTERN_INLINE GMP_EXTERN __inline__ +-#endif ++#ifndef GMP_WRAPPERS_H ++#define GMP_WRAPPERS_H + +-GMP_EXTERN jmp_buf gmp_jmp; +-GMP_EXTERN int jmp_gmp,gmp_relocatable; ++EXTER jmp_buf gmp_jmp; ++EXTER int jmp_gmp,gmp_relocatable; + + #define join(a_,b_) a_ ## b_ + #define Join(a_,b_) join(a_,b_) +@@ -95,7 +91,7 @@ GMP_EXTERN int jmp_gmp,gmp_relocatable; + set to -1 otherwise. 20040815 CM*/ + + #define MEM_GMP_CALL(n_,rt_,a_,s_,b_...) \ +- GMP_EXTERN_INLINE Join(RF_,rt_) Join(m,a_)(Join(P,n_)(b_)) { \ ++ INLINE Join(RF_,rt_) Join(m,a_)(Join(P,n_)(b_)) { \ + int j;\ + Join(RD_,rt_);\ + if (gmp_relocatable) {\ +@@ -195,3 +191,5 @@ MEM_GMP_CALL(2,size_t,mpz_sizeinbase,0,m + /*#define __gmpz_realloc m__gmpz_realloc*/ + #define __gmpz_size m__gmpz_size + #define __gmpz_sizeinbase m__gmpz_sizeinbase ++ ++#endif /*GMP_WRAPPERS_H*/ +--- gcl-2.6.12.orig/h/immnum.h ++++ gcl-2.6.12/h/immnum.h +@@ -17,10 +17,10 @@ + #define iif2(x,y) is_imm_fixnum2(x,y) + + +-EXTER inline fixnum ++INLINE fixnum + lnabs(fixnum x) {return x<0 ? ~x : x;} + +-EXTER inline char ++INLINE char + clz(ufixnum x) { + #ifdef HAVE_CLZL + return x ? __builtin_clzl(x) : sizeof(x)*8; +@@ -29,7 +29,7 @@ clz(ufixnum x) { + #endif + } + +-EXTER inline char ++INLINE char + ctz(ufixnum x) { + #ifdef HAVE_CTZL + return __builtin_ctzl(x);/*x ? __builtin_clzl(x) : sizeof(x)*8;*/ +@@ -38,10 +38,10 @@ ctz(ufixnum x) { + #endif + } + +-EXTER inline char ++INLINE char + fixnum_length(fixnum x) {return sizeof(x)*8-clz(lnabs(x));} + +-EXTER inline object ++INLINE object + immnum_length(object x) {return iif(x) ? mif(fixnum_length(fif(x))) : integer_length(x);} + + +@@ -57,7 +57,7 @@ immnum_length(object x) {return iif(x) ? + #define POPD 0x3F + #endif + +-EXTER inline char ++INLINE char + fixnum_popcount(ufixnum x) { + x-=POPA&(x>>1); + x=(x&POPB)+((x>>2)&POPB); +@@ -70,33 +70,33 @@ fixnum_popcount(ufixnum x) { + return x&POPD; + } + +-EXTER inline char ++INLINE char + /* fixnum_count(fixnum x) {return __builtin_popcountl(lnabs(x));} */ + fixnum_count(fixnum x) {return fixnum_popcount(lnabs(x));} + +-EXTER inline object ++INLINE object + immnum_count(object x) {return iif(x) ? mif(fixnum_count(fif(x))) : integer_count(x);} + + /*bs=sizeof(long)*8; + lb=bs-clz(labs(x));|x*y|=|x|*|y|<2^(lbx+lby)<2^(bs-1); + 0 bounded by 2^0, +-1 by 2^1,mpf by 2^(bs-1), which is sign bit + protect labs from most negative fix, here all immfix ok*/ +-EXTER inline bool ++INLINE bool + fixnum_mul_safe_abs(fixnum x,fixnum y) {return clz(x)+clz(y)>sizeof(x)*8+1;} +-EXTER inline object ++INLINE object + safe_mul_abs(fixnum x,fixnum y) {return fixnum_mul_safe_abs(x,y) ? make_fixnum(x*y) : fixnum_times(x,y);} +-EXTER inline bool ++INLINE bool + fixnum_mul_safe(fixnum x,fixnum y) {return fixnum_mul_safe_abs(labs(x),labs(y));} +-EXTER inline object ++INLINE object + safe_mul(fixnum x,fixnum y) {return fixnum_mul_safe(x,y) ? make_fixnum(x*y) : fixnum_times(x,y);} +-EXTER inline object ++INLINE object + immnum_times(object x,object y) {return iif2(x,y) ? safe_mul(fif(x),fif(y)) : number_times(x,y);} + +-EXTER inline object ++INLINE object + immnum_plus(object x,object y) {return iif2(x,y) ? make_fixnum(fif(x)+fif(y)) : number_plus(x,y);} +-EXTER inline object ++INLINE object + immnum_minus(object x,object y) {return iif2(x,y) ? make_fixnum(fif(x)-fif(y)) : number_minus(x,y);} +-EXTER inline object ++INLINE object + immnum_negate(object x) {return iif(x) ? make_fixnum(-fif(x)) : number_negate(x);} + + #define BOOLCLR 0 +@@ -116,7 +116,7 @@ immnum_negate(object x) {return iif(x) ? + #define BOOLORC1 015 + #define BOOLORC2 013 + +-EXTER inline fixnum ++INLINE fixnum + fixnum_boole(fixnum op,fixnum x,fixnum y) { + switch(op) { + case BOOLCLR: return 0; +@@ -139,7 +139,7 @@ fixnum_boole(fixnum op,fixnum x,fixnum y + return 0;/*FIXME error*/ + } + +-EXTER inline object ++INLINE object + immnum_boole(fixnum o,object x,object y) {return iif2(x,y) ? mif(fixnum_boole(o,fif(x),fif(y))) : log_op2(o,x,y);} + + #define immnum_bool(o,x,y) immnum_boole(fixint(o),x,y) +@@ -156,93 +156,93 @@ immnum_boole(fixnum o,object x,object y) + #define immnum_orc1(x,y) immnum_boole(BOOLORC1,x,y) + #define immnum_orc2(x,y) immnum_boole(BOOLORC2,x,y) + +-EXTER inline fixnum ++INLINE fixnum + fixnum_div(fixnum x,fixnum y,fixnum d) { + fixnum z=x/y; + if (d && x!=y*z && (x*d>0 ? y>0 : y<0)) + z+=d; + return z; + } +-EXTER inline fixnum ++INLINE fixnum + fixnum_rem(fixnum x,fixnum y,fixnum d) { + fixnum z=x%y; + if (d && z && (x*d>0 ? y>0 : y<0)) + z+=y; + return z; + } +-EXTER inline object ++INLINE object + immnum_truncate(object x,object y) {return iif2(x,y)&&y!=make_fixnum(0) ? mif(fixnum_div(fif(x),fif(y),0)) : (intdivrem(x,y,0,&x,NULL),x);} +-EXTER inline object ++INLINE object + immnum_floor(object x,object y) {return iif2(x,y)&&y!=make_fixnum(0) ? mif(fixnum_div(fif(x),fif(y),-1)) : (intdivrem(x,y,-1,&x,NULL),x);} +-EXTER inline object ++INLINE object + immnum_ceiling(object x,object y) {return iif2(x,y)&&y!=make_fixnum(0) ? mif(fixnum_div(fif(x),fif(y),1)) : (intdivrem(x,y,1,&x,NULL),x);} +-EXTER inline object ++INLINE object + immnum_mod(object x,object y) {return iif2(x,y)&&y!=make_fixnum(0) ? mif(fixnum_rem(fif(x),fif(y),-1)) : (intdivrem(x,y,-1,NULL,&y),y);} +-EXTER inline object ++INLINE object + immnum_rem(object x,object y) {return iif2(x,y)&&y!=make_fixnum(0) ? mif(fixnum_rem(fif(x),fif(y),0)) : (intdivrem(x,y,0,NULL,&y),y);} + +-EXTER inline fixnum ++INLINE fixnum + fixnum_rshft(fixnum x,fixnum y) { + return y>=sizeof(x)*8 ? (x<0 ? -1 : 0) : x>>y; + } +-EXTER inline object ++INLINE object + fixnum_lshft(fixnum x,fixnum y) { + return clz(labs(x))>y ? make_fixnum(x<);} +-EXTER inline bool ++INLINE bool + immnum_ge(object x,object y) {return immnum_comp(x,y,>=);} + +-EXTER inline bool ++INLINE bool + immnum_minusp(object x) {return iif(x) ? ((ufixnum)x)<((ufixnum)make_fixnum(0)) : number_minusp(x);} +-EXTER inline bool ++INLINE bool + immnum_plusp(object x) {return iif(x) ? ((ufixnum)x)>((ufixnum)make_fixnum(0)) : number_plusp(x);} +-EXTER inline bool ++INLINE bool + immnum_zerop(object x) {return iif(x) ? ((ufixnum)x)==((ufixnum)make_fixnum(0)) : number_zerop(x);} +-EXTER inline bool ++INLINE bool + immnum_evenp(object x) {return iif(x) ? !(((ufixnum)x)&0x1) : number_evenp(x);} +-EXTER inline bool ++INLINE bool + immnum_oddp(object x) {return iif(x) ? (((ufixnum)x)&0x1) : number_oddp(x);} + +-EXTER inline object ++INLINE object + immnum_signum(object x) { + ufixnum ux=(ufixnum)x,uz=((ufixnum)make_fixnum(0)); + return iif(x) ? (ux=(ufixnum)y ? x : y) : (number_compare(x,y)>=0?x:y);} +-EXTER inline object ++INLINE object + immnum_min(object x,object y) {return iif2(x,y) ? ((ufixnum)x<=(ufixnum)y ? x : y) : (number_compare(x,y)<=0?x:y);} + +-EXTER inline bool ++INLINE bool + immnum_logt(object x,object y) {return iif2(x,y) ? fixnum_boole(BOOLAND,fif(x),fif(y))!=0 : !number_zerop(log_op2(BOOLAND,x,y));} + +-EXTER inline fixnum ++INLINE fixnum + fixnum_gcd(fixnum x,fixnum y) { + + fixnum t; +@@ -343,16 +343,16 @@ fixnum_gcd(fixnum x,fixnum y) { + + } + +-EXTER inline object ++INLINE object + immnum_gcd(object x,object y) {return iif2(x,y) ? mif(fixnum_gcd(labs(fif(x)),labs(fif(y)))) : get_gcd(x,y);} + +-EXTER inline object ++INLINE object + fixnum_lcm(fixnum x,fixnum y) { + fixnum g=fixnum_gcd(x,y); + return g ? safe_mul_abs(x,fixnum_div(y,g,0)) : make_fixnum(0); + } + +-EXTER inline object ++INLINE object + immnum_lcm(object x,object y) {return iif2(x,y) ? fixnum_lcm(labs(fif(x)),labs(fif(y))) : get_lcm(x,y);} + + #endif +--- gcl-2.6.12.orig/h/include.h ++++ gcl-2.6.12/h/include.h +@@ -87,12 +87,6 @@ Foundation, 675 Mass Ave, Cambridge, MA + #define isalphanum(x) isalnum(x) + #endif + +-#ifdef IN_MAIN +-#define EXTER +-#else +-#define EXTER extern +-#endif +- + #if defined(GMP) || defined(NEED_MP_H) + #include "../h/mp.h" + #endif +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -28,10 +28,7 @@ EXTER long real_maxpage; + char *getenv(); + EXTER char *this_lisp; + +-#ifndef IN_MAIN +-EXTER +-char stdin_buf[], stdout_buf[]; +-#endif ++EXTER char stdin_buf[],stdout_buf[]; + + EXTER object user_package; + +--- gcl-2.6.12.orig/h/page.h ++++ gcl-2.6.12/h/page.h +@@ -106,7 +106,7 @@ extern fixnum writable_pages; + EXTER long first_data_page,real_maxpage,phys_pages,available_pages; + EXTER void *data_start,*initial_sbrk; + +-#if !defined(IN_MAIN) && defined(SGC) ++#if defined(SGC) + #include "writable.h" + #endif + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1,13 +1,12 @@ + /* alloc.c:89:OF */ extern void *alloc_page (long n); /* (n) int n; */ +-/* alloc.c:149:OF */ inline void add_page_to_freelist (char *p, struct typemanager *tm); /* (p, tm) char *p; struct typemanager *tm; */ + /* alloc.c:196:OF */ extern object type_name (int t); /* (t) int t; */ +-/* alloc.c:213:OF */ inline object alloc_object (enum type t); /* (t) enum type t; */ +-/* alloc.c:213:OF */ inline void add_pages(struct typemanager *,fixnum); +-/* alloc.c:296:OF */ extern inline object make_cons (object a, object d); /* (a, d) object a; object d; */ ++/* alloc.c:213:OF */ object alloc_object (enum type t); /* (t) enum type t; */ ++/* alloc.c:213:OF */ void add_pages(struct typemanager *,fixnum); ++/* alloc.c:296:OF */ extern object make_cons (object a, object d); /* (a, d) object a; object d; */ + /* alloc.c:364:OF */ extern object on_stack_cons (object x, object y); /* (x, y) object x; object y; */ + /* alloc.c:376:OF */ extern object fSallocated (object typ); /* (typ) object typ; */ + /* alloc.c:401:OF */ extern object fSreset_number_used (object typ); /* (typ) object typ; */ +-/* alloc.c:480:OF */ extern inline void insert_contblock (void *p, ufixnum s); /* (p, s) char *p; int s; */ ++/* alloc.c:480:OF */ extern void insert_contblock (void *p, ufixnum s); /* (p, s) char *p; int s; */ + /* alloc.c:480:OF */ extern void insert_maybe_sgc_contblock (char *p, int s); /* (p, s) char *p; int s; */ + /* alloc.c:611:OF */ extern void set_maxpage (void); /* () */ + /* alloc.c:635:OF */ extern void gcl_init_alloc (void *); /* () */ +@@ -1841,43 +1840,40 @@ struct htent *gethash(object,object); + int + update_real_maxpage(void); + +-inline fixnum ++fixnum + set_tm_maxpage(struct typemanager *,fixnum); + + void + init_gmp_rnd_state(__gmp_randstate_struct *); + +-inline void +-set_sgc_bit(struct pageinfo *,void *); +- + void + reinit_gmp(void); + + object + mod(object,object); + +-inline void ++void + intdivrem(object,object,fixnum,object *,object *); + +-inline object ++object + integer_count(object); + +-inline object ++object + integer_length(object); + +-inline bool ++bool + integer_bitp(object,object); + +-inline object ++object + fixnum_times(fixnum,fixnum); + +-inline object ++object + log_op2(fixnum,object,object); + +-inline object ++object + fixnum_big_shift(fixnum,fixnum); + +-inline object ++object + integer_shift(object,object); + + object +@@ -1921,22 +1917,19 @@ sigint(void); + void + allocate_code_block_reserve(void); + +-inline void +-resize_hole(ufixnum,enum type); +- +-inline void * ++void * + alloc_contblock_no_gc(size_t); + +-inline void ++void + reset_contblock_freelist(void); + +-inline void ++void + empty_relblock(void); + + fixnum + check_avail_pages(void); + +-inline int ++int + mbrk(void *); + + void +@@ -1948,5 +1941,8 @@ alloc_code_space(size_t); + object + fSmake_vector1_2(fixnum,fixnum,object,object); + +-inline struct pageinfo * ++struct pageinfo * + get_pageinfo(void *); ++ ++void ++add_page_to_freelist(char *, struct typemanager *); +--- gcl-2.6.12.orig/h/writable.h ++++ gcl-2.6.12/h/writable.h +@@ -1,7 +1,7 @@ + EXTER fixnum last_page; + EXTER int last_result; + +-EXTER inline int ++INLINE int + set_writable(fixnum i,bool m) { + + fixnum j; +@@ -32,7 +32,7 @@ set_writable(fixnum i,bool m) { + + } + +-EXTER inline int ++INLINE int + is_writable(fixnum i) { + + fixnum j; +@@ -51,7 +51,7 @@ is_writable(fixnum i) { + + } + +-EXTER inline int ++INLINE int + is_writable_cached(fixnum i) { + + if (last_page==i) +--- gcl-2.6.12.orig/makefile ++++ gcl-2.6.12/makefile +@@ -265,7 +265,7 @@ $(HDIR)new_decl.h: + + $(HDIR)mcompdefs.h: $(HDIR)compdefs.h $(HDIR)new_decl.h + $(AWK) 'BEGIN {print "#include \"include.h\"";print "#include \"cmponly.h\"";print "---"} {a=$$1;gsub("\\.\\.\\.","",a);print "\"#define " $$1 "\" " a}' $< |\ +- $(CC) -E -I./$(HDIR) - |\ ++ $(CC) -E -P -I./$(HDIR) - |\ + $(AWK) '/^\-\-\-$$/ {i=1;next} {if (!i) next} {gsub("\"","");print}' >$@ + + $(HDIR)cmpinclude.h: $(HDIR)mcompdefs.h $(CMPINCLUDE_FILES) $(HDIR)config.h +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -134,7 +134,7 @@ acomp(const void *v1,const void *v2) { + + } + +-inline struct pageinfo * ++struct pageinfo * + get_pageinfo(void *x) { + + struct pageinfo **pp=bsearchleq(&x,contblock_array->v.v_self,contblock_array->v.v_fillp,sizeof(*contblock_array->v.v_self),acomp); +@@ -144,7 +144,7 @@ get_pageinfo(void *x) { + + } + +-inline void ++static inline void + add_page_to_contblock_list(void *p,fixnum m) { + + struct pageinfo *pp=pageinfo(p); +@@ -176,7 +176,70 @@ icomp(const void *v1,const void *v2) { + return *f1<*f2 ? -1 : *f1==*f2 ? 0 : +1; + } + +-inline void ++ ++void ++add_page_to_freelist(char *p, struct typemanager *tm) { ++ ++ short t,size; ++ long i=tm->tm_nppage,fw; ++ object x,f; ++ struct pageinfo *pp; ++ ++ t=tm->tm_type; ++ ++ size=tm->tm_size; ++ f=tm->tm_free; ++ pp=pageinfo(p); ++ bzero(pp,sizeof(*pp)); ++ pp->type=t; ++ pp->magic=PAGE_MAGIC; ++ ++ if (cell_list_head==NULL) ++ cell_list_tail=cell_list_head=pp; ++ else if (pp > cell_list_tail) { ++ cell_list_tail->next=pp; ++ cell_list_tail=pp; ++ } ++ ++ x= (object)pagetochar(page(p)); ++ /* set_type_of(x,t); */ ++ make_free(x); ++ ++#ifdef SGC ++ ++ if (sgc_enabled && tm->tm_sgc) ++ pp->sgc_flags=SGC_PAGE_FLAG; ++ ++#ifndef SGC_WHOLE_PAGE ++ if (TYPEWORD_TYPE_P(pp->type)) ++ x->d.s=(sgc_enabled && tm->tm_sgc) ? SGC_RECENT : SGC_NORMAL; ++#endif ++ ++ /* array headers must be always writable, since a write to the ++ body does not touch the header. It may be desirable if there ++ are many arrays in a system to make the headers not writable, ++ but just SGC_TOUCH the header each time you write to it. this ++ is what is done with t_structure */ ++ if (t==(tm_of(t_array)->tm_type)) ++ pp->sgc_flags|=SGC_PERM_WRITABLE; ++ ++#endif ++ ++ fw= *(fixnum *)x; ++ while (--i >= 0) { ++ *(fixnum *)x=fw; ++ SET_LINK(x,f); ++ f=x; ++ x= (object) ((char *)x + size); ++ } ++ ++ tm->tm_free=f; ++ tm->tm_nfree += tm->tm_nppage; ++ tm->tm_npage++; ++ ++} ++ ++static inline void + maybe_reallocate_page(struct typemanager *ntm,ufixnum count) { + + void **y,**n; +@@ -248,7 +311,7 @@ int reserve_pages_for_signal_handler=30; + reserve_pages_for_signal_handler pages on hand in the hole + */ + +-inline void ++void + empty_relblock(void) { + + object o=sSAleaf_collection_thresholdA->s.s_dbind; +@@ -262,7 +325,7 @@ empty_relblock(void) { + + } + +-inline void ++static inline void + resize_hole(ufixnum hp,enum type tp) { + + char *new_start=heap_end+hp*PAGESIZE; +@@ -283,7 +346,7 @@ resize_hole(ufixnum hp,enum type tp) { + + } + +-inline void * ++void * + alloc_page(long n) { + + bool s=n<0; +@@ -332,7 +395,7 @@ alloc_page(long n) { + + struct pageinfo *cell_list_head=NULL,*cell_list_tail=NULL;; + +-inline ufixnum ++static inline ufixnum + sum_maxpages(void) { + + ufixnum i,j; +@@ -352,7 +415,7 @@ check_avail_pages(void) { + } + + +-inline fixnum ++fixnum + set_tm_maxpage(struct typemanager *tm,fixnum n) { + + fixnum r=tm->tm_type==t_relocatable,j=tm->tm_maxpage,z=(n-j)*(r ? 2 : 1); +@@ -365,69 +428,6 @@ set_tm_maxpage(struct typemanager *tm,fi + return 1; + } + +- +-inline void +-add_page_to_freelist(char *p, struct typemanager *tm) { +- +- short t,size; +- long i=tm->tm_nppage,fw; +- object x,f; +- struct pageinfo *pp; +- +- t=tm->tm_type; +- +- size=tm->tm_size; +- f=tm->tm_free; +- pp=pageinfo(p); +- bzero(pp,sizeof(*pp)); +- pp->type=t; +- pp->magic=PAGE_MAGIC; +- +- if (cell_list_head==NULL) +- cell_list_tail=cell_list_head=pp; +- else if (pp > cell_list_tail) { +- cell_list_tail->next=pp; +- cell_list_tail=pp; +- } +- +- x= (object)pagetochar(page(p)); +- /* set_type_of(x,t); */ +- make_free(x); +- +-#ifdef SGC +- +- if (sgc_enabled && tm->tm_sgc) +- pp->sgc_flags=SGC_PAGE_FLAG; +- +-#ifndef SGC_WHOLE_PAGE +- if (TYPEWORD_TYPE_P(pp->type)) +- x->d.s=(sgc_enabled && tm->tm_sgc) ? SGC_RECENT : SGC_NORMAL; +-#endif +- +- /* array headers must be always writable, since a write to the +- body does not touch the header. It may be desirable if there +- are many arrays in a system to make the headers not writable, +- but just SGC_TOUCH the header each time you write to it. this +- is what is done with t_structure */ +- if (t==(tm_of(t_array)->tm_type)) +- pp->sgc_flags|=SGC_PERM_WRITABLE; +- +-#endif +- +- fw= *(fixnum *)x; +- while (--i >= 0) { +- *(fixnum *)x=fw; +- SET_LINK(x,f); +- f=x; +- x= (object) ((char *)x + size); +- } +- +- tm->tm_free=f; +- tm->tm_nfree += tm->tm_nppage; +- tm->tm_npage++; +- +-} +- + object + type_name(int t) { + return make_simple_string(tm_table[(int)t].tm_name+1); +@@ -435,7 +435,7 @@ type_name(int t) { + + + static void +-call_after_gbc_hook(t) { ++call_after_gbc_hook(int t) { + if (sSAafter_gbc_hookA && sSAafter_gbc_hookA->s.s_dbind!= Cnil) { + set_up_string_register(tm_table[(int)t].tm_name+1); + ifuncall1(sSAafter_gbc_hookA->s.s_dbind,intern(string_register,system_package)); +@@ -536,7 +536,7 @@ rebalance_maxpages(struct typemanager *m + + } + +-inline long ++long + opt_maxpage(struct typemanager *my_tm) { + + double x=0.0,y=0.0,z,r; +@@ -707,7 +707,7 @@ find_contblock(ufixnum n,void **p) { + return find_cbpp(*p,n); + } + +-inline void ++void + print_cb(int print) { + + struct contblock *cbp,***cbppp,**cbpp=&cb_pointer; +@@ -729,7 +729,7 @@ print_cb(int print) { + + } + +-inline void ++void + insert_contblock(void *p,ufixnum s) { + + struct contblock *cbp=p,**cbpp,***cbppp; +@@ -761,7 +761,7 @@ delete_contblock(void *p,struct contbloc + + } + +-inline void ++void + reset_contblock_freelist(void) { + + cb_pointer=NULL; +@@ -769,7 +769,7 @@ reset_contblock_freelist(void) { + + } + +-inline void * ++static inline void * + alloc_from_freelist(struct typemanager *tm,fixnum n) { + + void *p; +@@ -851,7 +851,7 @@ too_full_p(struct typemanager *tm) { + + } + +-inline void * ++static inline void * + alloc_after_gc(struct typemanager *tm,fixnum n) { + + if (tm->tm_npage+tpage(tm,n)>tm->tm_maxpage && GBC_enable) { +@@ -883,7 +883,7 @@ alloc_after_gc(struct typemanager *tm,fi + + } + +-inline void ++void + add_pages(struct typemanager *tm,fixnum m) { + + switch (tm->tm_type) { +@@ -923,7 +923,7 @@ add_pages(struct typemanager *tm,fixnum + + } + +-inline void * ++static inline void * + alloc_after_adding_pages(struct typemanager *tm,fixnum n) { + + fixnum m=tpage(tm,n); +@@ -945,7 +945,7 @@ alloc_after_adding_pages(struct typemana + + } + +-inline void * ++static inline void * + alloc_after_reclaiming_pages(struct typemanager *tm,fixnum n) { + + fixnum m=tpage(tm,n),reloc_min; +@@ -972,10 +972,10 @@ alloc_after_reclaiming_pages(struct type + + } + +-inline void *alloc_mem(struct typemanager *,fixnum); ++static inline void *alloc_mem(struct typemanager *,fixnum); + + #ifdef SGC +-inline void * ++static inline void * + alloc_after_turning_off_sgc(struct typemanager *tm,fixnum n) { + + if (!sgc_enabled) return NULL; +@@ -985,7 +985,7 @@ alloc_after_turning_off_sgc(struct typem + } + #endif + +-inline void * ++static inline void * + alloc_mem(struct typemanager *tm,fixnum n) { + + void *p; +@@ -1007,7 +1007,7 @@ alloc_mem(struct typemanager *tm,fixnum + return exhausted_report(tm->tm_type,tm); + } + +-inline object ++object + alloc_object(enum type t) { + + object obj; +@@ -1022,12 +1022,12 @@ alloc_object(enum type t) { + + } + +-inline void * ++void * + alloc_contblock(size_t n) { + return alloc_mem(tm_of(t_contiguous),CEI(n,CPTR_SIZE)); + } + +-inline void * ++void * + alloc_contblock_no_gc(size_t n) { + + struct typemanager *tm=tm_of(t_contiguous); +@@ -1073,7 +1073,7 @@ alloc_code_space(size_t sz) { + + } + +-inline void * ++void * + alloc_relblock(size_t n) { + + return alloc_mem(tm_of(t_relocatable),CEI(n,PTR_ALIGN)); +@@ -1089,7 +1089,7 @@ load_cons(object p,object a,object d) { + p->c.c_car=a; + } + +-inline object ++object + make_cons(object a,object d) { + + static struct typemanager *tm=tm_table+t_cons;/*FIXME*/ +@@ -1105,7 +1105,7 @@ make_cons(object a,object d) { + + + +-inline object on_stack_cons(object x, object y) { ++object on_stack_cons(object x, object y) { + object p = (object) alloca_val; + load_cons(p,x,y); + return p; +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -158,7 +158,7 @@ in_contblock_stack_list(void *p,void *** + return a && a[0]==p; + } + +-inline char ++static inline char + get_bit(char *v,struct pageinfo *pi,void *x) { + void *ve=CB_DATA_START(pi); + fixnum off=(x-ve)>>LOG_BYTES_CONTBLOCK,i=off>>LOG_BITS_CHAR,s=off&~(~0UL<>s)&0x1; + } + +-inline void ++static inline void + set_bit(char *v,struct pageinfo *pi,void *x) { + void *ve=CB_DATA_START(pi); + fixnum off=(x-ve)>>LOG_BYTES_CONTBLOCK,i=off>>LOG_BITS_CHAR,s=off&~(~0UL<>LOG_BYTES_CONTBLOCK;i=_o>>LOG_BITS_CHAR;s=_o&~(~0UL< + void change_contexts(); +@@ -47,6 +45,11 @@ int ovm_process_created; + void initialize_process(); + #endif + ++ ++#define EXTER ++#define INLINE ++ ++ + #include "include.h" + #include + #include "page.h" +@@ -118,7 +121,7 @@ cstack_dir(fixnum j) { + + fixnum log_maxpage_bound=sizeof(fixnum)*8-1; + +-inline int ++int + mbrk(void *v) { + + ufixnum uv=(ufixnum)v,uc=(ufixnum)sbrk(0),ux,um; +@@ -1120,10 +1123,6 @@ init_main(void) { + + } + +-#ifdef SGC +-#include "writable.h" +-#endif +- + #ifdef HAVE_PRINT_INSN_I386 + + #include "dis-asm.h" +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -20,7 +20,7 @@ OBJS:=$(addsuffix .o,typespec main alloc + num_pred num_comp num_arith num_sfun num_co num_log num_rand earith character sequence list hash\ + array string regexpr structure toplevel file read backq print format pathname unixfsys unixfasl\ + error unixtime unixsys unixsave funlink fat_string run_process nfunlink usig usig2 utils makefun\ +- sockets gmp_wrappers clxsocket init_pari nsocket sfasl prelink) ++ sockets clxsocket init_pari nsocket sfasl prelink) + OBJS:=$(OBJS) $(RL_OBJS) $(EXTRAS) + + INI_FILES=$(patsubst %.o,%.ini,${OBJS}) +--- gcl-2.6.12.orig/o/num_arith.c ++++ gcl-2.6.12/o/num_arith.c +@@ -62,7 +62,7 @@ object fixnum_sub(fixnum i, fixnum j) + } + } + +-inline object ++object + fixnum_times(fixnum i, fixnum j) { + + #ifdef HAVE_CLZL +--- gcl-2.6.12.orig/o/num_co.c ++++ gcl-2.6.12/o/num_co.c +@@ -277,7 +277,7 @@ LFD(Ldenominator)(void) + vs_base[0] = small_fixnum(1); + } + +-inline void ++void + intdivrem(object x,object y,fixnum d,object *q,object *r) { + + enum type tx=type_of(x),ty=type_of(y); +--- gcl-2.6.12.orig/o/num_log.c ++++ gcl-2.6.12/o/num_log.c +@@ -37,12 +37,12 @@ Foundation, 675 Mass Ave, Cambridge, MA + + + +-inline object ++object + fixnum_big_shift(fixnum x,fixnum w) { + MPOP(return,shifti,SI_TO_MP(x,big_fixnum1),w); + } + +-inline object ++object + integer_fix_shift(object x, fixnum w) { + if (type_of(x)==t_fixnum) { + fixnum fx=fix(x); +@@ -51,7 +51,7 @@ integer_fix_shift(object x, fixnum w) { + MPOP(return,shifti,MP(x),w); + } + +-inline object ++object + integer_shift(object x,object y) { + enum type tx=type_of(x),ty=type_of(y); + if (ty==t_fixnum) +@@ -66,12 +66,12 @@ integer_shift(object x,object y) { + } + } + +-inline object ++object + integer_length(object x) { + return make_fixnum(type_of(x)==t_fixnum ? fixnum_length(fix(x)) : MP_SIZE_IN_BASE2(MP(x))); + } + +-inline object ++object + integer_count(object x) { + return make_fixnum(type_of(x)==t_fixnum ? fixnum_count(fix(x)) : MP_BITCOUNT(MP(x))); + } +@@ -120,7 +120,7 @@ LFD(Lboole)(void) + + } + +-inline bool ++bool + integer_bitp(object p,object x) { + enum type tp=type_of(p),tx=type_of(x); + +--- gcl-2.6.12.orig/o/num_sfun.c ++++ gcl-2.6.12/o/num_sfun.c +@@ -94,7 +94,7 @@ number_exp(object x) + } + } + +-inline object ++static inline object + number_fix_iexpt(object x,fixnum y,fixnum ly,fixnum j) { + object z; + +@@ -103,7 +103,7 @@ number_fix_iexpt(object x,fixnum y,fixnu + return fixnum_bitp(j,y) ? number_times(x,z) : z; + } + +-inline object ++static inline object + number_big_iexpt(object x,object y,fixnum ly,fixnum j) { + object z; + +@@ -113,7 +113,7 @@ number_big_iexpt(object x,object y,fixnu + + } + +-inline object ++static inline object + number_zero_expt(object x,bool promote_short_p) { + + switch (type_of(x)) { +@@ -135,7 +135,7 @@ number_zero_expt(object x,bool promote_s + } + + +-inline object ++static inline object + number_ui_expt(object x,fixnum fy) { + + switch (type_of(x)) { +@@ -173,17 +173,17 @@ number_ui_expt(object x,fixnum fy) { + + } + +-inline object ++static inline object + number_ump_expt(object x,object y) { + return number_big_iexpt(x,y,fix(integer_length(y)),0); + } + +-inline object ++static inline object + number_log_expt(object x,object y) { + return number_zerop(y) ? number_zero_expt(y,type_of(x)==t_longfloat) : number_exp(number_times(number_nlog(x),y)); + } + +-inline object ++static inline object + number_invert(object x,object y,object z) { + + switch (type_of(z)) { +@@ -198,7 +198,7 @@ number_invert(object x,object y,object z + } + + +-inline object ++static inline object + number_si_expt(object x,object y) { + switch (type_of(y)) { + case t_fixnum: +--- gcl-2.6.12.orig/o/package.d ++++ gcl-2.6.12/o/package.d +@@ -114,7 +114,7 @@ static int package_sizes[]={ + 32749, 65521, 131071, 262139, 524287, 1048573}; + + static int +-suitable_package_size(n) ++suitable_package_size(int n) + {int *i=package_sizes; + if (n>= 1000000) return 1048573; + while(*i < n) { i++;} diff --git a/debian/patches/Version_2_6_13pre8b b/debian/patches/Version_2_6_13pre8b new file mode 100644 index 0000000..fef1bb0 --- /dev/null +++ b/debian/patches/Version_2_6_13pre8b @@ -0,0 +1,43 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-9) unstable; urgency=medium + . + * Version_2_6_13pre8a + * Bug fix: "ftbfs with GCC-5", thanks to Matthias Klose (Closes: + #777866). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/777866 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/prelink.c ++++ gcl-2.6.12/o/prelink.c +@@ -2,6 +2,12 @@ + + #include "include.h" + ++extern FILE *stdin __attribute__((weak)); ++extern FILE *stderr __attribute__((weak)); ++extern FILE *stdout __attribute__((weak)); ++extern rl_compentry_func_t *rl_completion_entry_function __attribute__((weak)); ++extern const char *rl_readline_name __attribute__((weak)); ++ + void + prelink_init(void) { + diff --git a/debian/patches/Version_2_6_13pre90 b/debian/patches/Version_2_6_13pre90 new file mode 100644 index 0000000..fe7aa97 --- /dev/null +++ b/debian/patches/Version_2_6_13pre90 @@ -0,0 +1,90 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-93) unstable; urgency=medium + . + * Version_2_6_13pre90 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2020-02-21 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -3974,7 +3974,7 @@ $as_echo "removing $1 from LDFLAGS" >&6; + + } + +-add_args_to_cflags -fsigned-char -pipe \ ++add_args_to_cflags -fsigned-char -pipe -fcommon \ + -fno-builtin-malloc -fno-builtin-free \ + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -258,7 +258,7 @@ remove_arg_from_ldflags() { + + } + +-add_args_to_cflags -fsigned-char -pipe \ ++add_args_to_cflags -fsigned-char -pipe -fcommon \ + -fno-builtin-malloc -fno-builtin-free \ + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -445,20 +445,21 @@ gcl_cleanup(int gc) { + } + + /*gcc boolean expression tail position bug*/ ++static char *stack_to_be_allocated; + +-void * +-cclear_stack(unsigned long size) { +- void *v=alloca(size); +- memset(v,0,size); +- return v; ++void ++get_stack_to_be_allocated(unsigned long size) { ++ stack_to_be_allocated=alloca(size); + } + + DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",object,fSequal_tail_recursion_check,SI,1,1,NONE,II,OO,OO,OO,(fixnum s),"") { + object x0=make_list(s/sizeof(object)),x1=make_list(s/sizeof(object)); +- char *u=cclear_stack(s),*w; ++ char *w; ++ get_stack_to_be_allocated(s); ++ memset(stack_to_be_allocated,0,s); + fLequal(x0,x1); +- for (w=u;w + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-95) unstable; urgency=high + . + * Version_2_6_13pre90 + * build under GCL_MEM_MULTIPLE=0.1 + * Bug fix: "FTBFS: Unrecoverable error: Segmentation violation..", + thanks to Lucas Nussbaum (Closes: #952334). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/952334 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2020-08-23 + +--- gcl-2.6.12.orig/h/elf32_armhf_reloc_special.h ++++ gcl-2.6.12/h/elf32_armhf_reloc_special.h +@@ -6,13 +6,15 @@ static ul tz=sizeof(tramp)/sizeof(ul); + static ul * + next_plt_entry(ul *p,ul *pe) { + +- ul l0=0xe5bef000,/*ldr pc,[ip,#]*/ +- l1=0xe5bcf000;/*ldr pc,[lr,#]*/ ++ /* 4778 bx pc */ /*optional*/ ++ /* e7fd b.n 20dd0 <__fprintf_chk@plt> */ /*optional*/ ++ /* above when stripped becomes undefined instruction*/ ++ /* e28fc601 add ip, pc, #1048576 ; 0x100000 */ ++ /* e28ccab0 add ip, ip, #176, 20 ; 0xb0000 */ ++ /* e5bcf914 ldr pc, [ip, #2324]! ; 0x914 */ + +- for (;p>20)!=0xe28;p++); ++ return p; + + } + diff --git a/debian/patches/Version_2_6_13pre94 b/debian/patches/Version_2_6_13pre94 new file mode 100644 index 0000000..1ad63f4 --- /dev/null +++ b/debian/patches/Version_2_6_13pre94 @@ -0,0 +1,39 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-97) unstable; urgency=medium + . + * Bug fix: "Removal of obsolete debhelper compat 5 and 6 in bookworm", + thanks to Niels Thykier (Closes: #965543). + * Version_2.6.13pre93 +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/965543 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2020-09-29 + +--- gcl-2.6.12.orig/o/regexpr.c ++++ gcl-2.6.12/o/regexpr.c +@@ -157,7 +157,7 @@ be over written. \ + + + str=string->st.st_self; +- if (str+end==(void *)core_end || str+end==(void *)compiled_regexp) { ++ if (NULL_OR_ON_C_STACK(str+end) || str+end==(void *)compiled_regexp) { + + if (!(str=alloca(string->st.st_fillp+1))) + FEerror("Cannot allocate memory on C stack",0); diff --git a/debian/patches/Version_2_6_13pre95 b/debian/patches/Version_2_6_13pre95 new file mode 100644 index 0000000..810239d --- /dev/null +++ b/debian/patches/Version_2_6_13pre95 @@ -0,0 +1,67 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-98) unstable; urgency=medium + . + * Version_2.6.13pre94 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2020-11-28 + +--- gcl-2.6.12.orig/h/compprotos.h ++++ gcl-2.6.12/h/compprotos.h +@@ -179,5 +179,5 @@ void gcl_init_or_load1(void (*)(void),co + char *gcl_gets(char *,int); + int gcl_puts(const char *); + int endp_error(object); +-object Icall_gen_error_handler(object,object,object,object,ufixnum,...); ++object Icall_gen_error_handler(object,object,object,object,ufixnum,...) __attribute__((noreturn)); + object file_stream(object); +--- gcl-2.6.12.orig/h/elf32_armhf_reloc.h ++++ gcl-2.6.12/h/elf32_armhf_reloc.h +@@ -4,7 +4,7 @@ + case R_ARM_THM_JUMP24: + { + long x=(long)(s+a-p); +- if (abs(x)&(~MASK(23))) { ++ if (abs(x)&(~MASK(22))) { + + got+=(sym->st_size-1)*tz; + memcpy(got,tramp,sizeof(tramp)); +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -391,9 +391,6 @@ emsg(const char *s,...) { + va_list args; + ufixnum n=0; + void *v=NULL; +-#ifndef vsnprintf +- extern int vsnprintf(); +-#endif + va_start(args,s); + n=vsnprintf(v,n,s,args)+1; + va_end(args); +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -1590,6 +1590,7 @@ object from, to; + if (to == Cnil) { + to = alloc_object(t_readtable); + to->rt.rt_self = NULL; ++ to->rt.rt_case = sKupcase; + /* For GBC not to go mad. */ + vs_push(to); + /* Saving for GBC. */ diff --git a/debian/patches/Version_2_6_13pre98 b/debian/patches/Version_2_6_13pre98 new file mode 100644 index 0000000..e0c659a --- /dev/null +++ b/debian/patches/Version_2_6_13pre98 @@ -0,0 +1,431 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-101) unstable; urgency=medium + . + * Version_2.6.13pre98 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-01-17 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -3974,7 +3974,7 @@ $as_echo "removing $1 from LDFLAGS" >&6; + + } + +-add_args_to_cflags -fsigned-char -pipe -fcommon \ ++add_args_to_cflags -fsigned-char -pipe -fcommon \ + -fno-builtin-malloc -fno-builtin-free \ + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ +@@ -4036,6 +4036,8 @@ case $use in + assert_arg_to_cflags -mms-bitfields + assert_arg_to_ldflags -Wl,--stack,8000000;; + 386-macosx) ++# assert_arg_to_cflags -Wno-error=implicit-function-declaration ++ add_arg_to_cflags -Wno-incomplete-setjmp-declaration + assert_arg_to_ldflags -Wl,-no_pie + if test "$build_cpu" = "x86_64" ; then + assert_arg_to_cflags -m64 +@@ -4246,10 +4248,6 @@ fi + # for the system. This can usually be done via the "uname" command, but + # there are a few systems, like Next, where this doesn't work. + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking system version (for dynamic loading)" >&5 +-$as_echo_n "checking system version (for dynamic loading)... " >&6; } +-if machine=`uname -m` ; then true; else machine=unknown ; fi +- + for ac_prog in makeinfo + do + # Extract the first word of "$ac_prog", so it can be a program name with args. +@@ -4295,6 +4293,10 @@ test -n "$MAKEINFO" || MAKEINFO=""false" + + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking system version (for dynamic loading)" >&5 ++$as_echo_n "checking system version (for dynamic loading)... " >&6; } ++if machine=`uname -m` ; then true; else machine=unknown ; fi ++ + if test -f /usr/lib/NextStep/software_version; then + system=NEXTSTEP-`${AWK} '/3/,/3/' /usr/lib/NextStep/software_version` + else +@@ -6191,6 +6193,7 @@ else + /* end confdefs.h. */ + + #include ++ #include + #define EXTER + #define INLINE + #include "$MP_INCLUDE" +@@ -6319,6 +6322,7 @@ else + /* end confdefs.h. */ + + #include ++ #include + #define EXTER + #define INLINE + #include "$MP_INCLUDE" +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -258,7 +258,7 @@ remove_arg_from_ldflags() { + + } + +-add_args_to_cflags -fsigned-char -pipe -fcommon \ ++add_args_to_cflags -fsigned-char -pipe -fcommon \ + -fno-builtin-malloc -fno-builtin-free \ + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ +@@ -294,6 +294,8 @@ case $use in + assert_arg_to_cflags -mms-bitfields + assert_arg_to_ldflags -Wl,--stack,8000000;; + 386-macosx) ++# assert_arg_to_cflags -Wno-error=implicit-function-declaration ++ add_arg_to_cflags -Wno-incomplete-setjmp-declaration + assert_arg_to_ldflags -Wl,-no_pie + if test "$build_cpu" = "x86_64" ; then + assert_arg_to_cflags -m64 +@@ -453,12 +455,12 @@ fi + # for the system. This can usually be done via the "uname" command, but + # there are a few systems, like Next, where this doesn't work. + +-AC_MSG_CHECKING([system version (for dynamic loading)]) +-if machine=`uname -m` ; then true; else machine=unknown ; fi +- + AC_CHECK_PROGS(MAKEINFO,makeinfo,"false") + AC_SUBST(MAKEINFO) + ++AC_MSG_CHECKING([system version (for dynamic loading)]) ++if machine=`uname -m` ; then true; else machine=unknown ; fi ++ + if test -f /usr/lib/NextStep/software_version; then + system=NEXTSTEP-`${AWK} '/3/,/3/' /usr/lib/NextStep/software_version` + else +@@ -971,6 +973,7 @@ AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include ++ #include + #define EXTER + #define INLINE + #include "$MP_INCLUDE" +@@ -1019,6 +1022,7 @@ AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[ + #include ++ #include + #define EXTER + #define INLINE + #include "$MP_INCLUDE" +--- gcl-2.6.12.orig/gmp4/acinclude.m4 ++++ gcl-2.6.12/gmp4/acinclude.m4 +@@ -610,10 +610,11 @@ GMP_PROG_CC_WORKS_PART([$1], [long long + #if defined (__GNUC__) && ! defined (__cplusplus) + typedef unsigned long long t1;typedef t1*t2; + static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0) +-{t1 c,x,r;int i;if(v0){c=1;for(i=1;iconftest.c < + int + main () + { +@@ -3886,6 +3888,7 @@ AC_DEFUN([GMP_PROG_EXEEXT_FOR_BUILD], + AC_CACHE_CHECK([for build system executable suffix], + gmp_cv_prog_exeext_for_build, + [cat >conftest.c < + int + main () + { +@@ -3922,6 +3925,7 @@ AC_DEFUN([GMP_C_FOR_BUILD_ANSI], + AC_CACHE_CHECK([whether build system compiler is ANSI], + gmp_cv_c_for_build_ansi, + [cat >conftest.c < + int + main (int argc, char **argv) + { +@@ -3956,6 +3960,7 @@ AC_DEFUN([GMP_CHECK_LIBM_FOR_BUILD], + AC_CACHE_CHECK([for build system compiler math library], + gmp_cv_check_libm_for_build, + [cat >conftest.c < + int + main () + { +--- gcl-2.6.12.orig/gmp4/configure ++++ gcl-2.6.12/gmp4/configure +@@ -808,6 +808,7 @@ infodir + docdir + oldincludedir + includedir ++runstatedir + localstatedir + sharedstatedir + sysconfdir +@@ -909,6 +910,7 @@ datadir='${datarootdir}' + sysconfdir='${prefix}/etc' + sharedstatedir='${prefix}/com' + localstatedir='${prefix}/var' ++runstatedir='${localstatedir}/run' + includedir='${prefix}/include' + oldincludedir='/usr/include' + docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +@@ -1161,6 +1163,15 @@ do + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + ++ -runstatedir | --runstatedir | --runstatedi | --runstated \ ++ | --runstate | --runstat | --runsta | --runst | --runs \ ++ | --run | --ru | --r) ++ ac_prev=runstatedir ;; ++ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ ++ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ ++ | --run=* | --ru=* | --r=*) ++ runstatedir=$ac_optarg ;; ++ + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ +@@ -1298,7 +1309,7 @@ fi + for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ +- libdir localedir mandir ++ libdir localedir mandir runstatedir + do + eval ac_val=\$$ac_var + # Remove trailing slashes. +@@ -1451,6 +1462,7 @@ Fine tuning of the installation director + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] ++ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] +@@ -6335,10 +6347,11 @@ if test "$gmp_prog_cc_works" = yes; then + #if defined (__GNUC__) && ! defined (__cplusplus) + typedef unsigned long long t1;typedef t1*t2; + static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0) +-{t1 c,x,r;int i;if(v0){c=1;for(i=1;iconftest.c < + int + main () + { +@@ -9748,6 +9763,7 @@ $as_echo_n "checking build system compil + # remove anything that might look like compiler output to our "||" expression + rm -f conftest* a.out b.out a.exe a_out.exe + cat >conftest.c < + int + main () + { +@@ -9781,6 +9797,7 @@ $as_echo_n "checking build system compil + # remove anything that might look like compiler output to our "||" expression + rm -f conftest* a.out b.out a.exe a_out.exe + cat >conftest.c < + int + main () + { +@@ -9860,6 +9877,7 @@ if ${gmp_cv_prog_exeext_for_build+:} fal + $as_echo_n "(cached) " >&6 + else + cat >conftest.c < + int + main () + { +@@ -9897,6 +9915,7 @@ if ${gmp_cv_c_for_build_ansi+:} false; t + $as_echo_n "(cached) " >&6 + else + cat >conftest.c < + int + main (int argc, char **argv) + { +@@ -9932,6 +9951,7 @@ if ${gmp_cv_check_libm_for_build+:} fals + $as_echo_n "(cached) " >&6 + else + cat >conftest.c < + int + main () + { +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -146,7 +146,7 @@ Icall_gen_error_handler(object ci,object + b[i]= va_arg(ap,object); + va_end(ap); + +- return IapplyVector(sSuniversal_error_handler,n,b); ++ IapplyVector(sSuniversal_error_handler,n,b); + + } + +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -28,6 +28,8 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include + #include + #include ++#include ++#include + + static void + init_main(void); +@@ -462,6 +464,8 @@ DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",o + RETURN1((object)(w-stack_to_be_allocated)); + } + ++#if !defined(DARWIN)&&!defined(__MINGW32__) ++ + static int + mbin(const char *s,char *o) { + +@@ -497,7 +501,7 @@ which(const char *n,char *o) { + + } + +- ++#endif + + int + main(int argc, char **argv, char **envp) { +--- gcl-2.6.12.orig/o/sfaslmacho.c ++++ gcl-2.6.12/o/sfaslmacho.c +@@ -31,7 +31,7 @@ + (_fl<=S_SYMBOL_STUBS || _fl==S_16BYTE_LITERALS) && _fl!=S_ZEROFILL;}) + + +-#define MASK(n) (~(~0L << (n))) ++#define MASK(n) (~(~0ULL << (n))) + + + +--- gcl-2.6.12.orig/o/string.d ++++ gcl-2.6.12/o/string.d +@@ -24,6 +24,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + string routines + */ + ++#include + #include "include.h" + + object sKstart1; +--- gcl-2.6.12.orig/o/unexmacosx.c ++++ gcl-2.6.12/o/unexmacosx.c +@@ -560,7 +560,7 @@ copy_data_segment (struct load_command * + sc.fileoff = curr_file_offset; + sc.filesize = core_end-mach_mapstart; + sc.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; +- sc.initprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE; ++ sc.initprot = VM_PROT_READ | VM_PROT_WRITE /* | VM_PROT_EXECUTE */; + sc.nsects = 0; + sc.flags = 0; + +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -85,7 +85,6 @@ sys_init.lsp: sys_init.lsp.in + -e "s#@LI-OPT-TWO@#\"$(O2FLAGS)\"#1" \ + -e "s#@LI-INIT-LSP@#\"$@\"#1" >$@ + +- + saved_%:raw_% $(RSYM) sys_init.lsp raw_%_map msys \ + $(CMPDIR)/gcl_cmpmain.lsp \ + $(CMPDIR)/gcl_lfun_list.lsp \ diff --git a/debian/patches/Version_2_6_13pre99 b/debian/patches/Version_2_6_13pre99 new file mode 100644 index 0000000..087ed47 --- /dev/null +++ b/debian/patches/Version_2_6_13pre99 @@ -0,0 +1,419865 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-102) unstable; urgency=medium + . + * Version_2.6.13pre99 + * Bug fix: "describe fails because gcl-si.info does not exist", thanks + to Leo Butler (Closes: #980003). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/980003 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2021-01-30 + +--- gcl-2.6.12.orig/gmp4/autom4te.cache/output.0 ++++ /dev/null +@@ -1,29966 +0,0 @@ +-@%:@! /bin/sh +-@%:@ From configure.ac Revision. +-@%:@ Guess values for system-dependent variables and create Makefiles. +-@%:@ Generated by GNU Autoconf 2.69 for GNU MP 6.0.0. +-@%:@ +-@%:@ Report bugs to . +-@%:@ +-@%:@ +-@%:@ +-@%:@ Copyright 1996-2014 Free Software Foundation, Inc. +-@%:@ +-@%:@ This file is part of the GNU MP Library. +-@%:@ +-@%:@ The GNU MP Library is free software; you can redistribute it and/or modify +-@%:@ it under the terms of either: +-@%:@ +-@%:@ * the GNU Lesser General Public License as published by the Free +-@%:@ Software Foundation; either version 3 of the License, or (at your +-@%:@ option) any later version. +-@%:@ +-@%:@ or +-@%:@ +-@%:@ * the GNU General Public License as published by the Free Software +-@%:@ Foundation; either version 2 of the License, or (at your option) any +-@%:@ later version. +-@%:@ +-@%:@ or both in parallel, as here. +-@%:@ +-@%:@ The GNU MP 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 General Public License +-@%:@ for more details. +-@%:@ +-@%:@ You should have received copies of the GNU General Public License and the +-@%:@ GNU Lesser General Public License along with the GNU MP Library. If not, +-@%:@ see https://www.gnu.org/licenses/. +-@%:@ +-@%:@ +-@%:@ +-@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +-@%:@ +-@%:@ +-@%:@ This configure script is free software; the Free Software Foundation +-@%:@ gives unlimited permission to copy, distribute and modify it. +-## -------------------- ## +-## M4sh Initialization. ## +-## -------------------- ## +- +-# Be more Bourne compatible +-DUALCASE=1; export DUALCASE # for MKS sh +-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +- emulate sh +- NULLCMD=: +- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '${1+"$@"}'='"$@"' +- setopt NO_GLOB_SUBST +-else +- case `(set -o) 2>/dev/null` in @%:@( +- *posix*) : +- set -o posix ;; @%:@( +- *) : +- ;; +-esac +-fi +- +- +-as_nl=' +-' +-export as_nl +-# Printing a long string crashes Solaris 7 /usr/bin/printf. +-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +-# Prefer a ksh shell builtin over an external printf program on Solaris, +-# but without wasting forks for bash or zsh. +-if test -z "$BASH_VERSION$ZSH_VERSION" \ +- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='print -r --' +- as_echo_n='print -rn --' +-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='printf %s\n' +- as_echo_n='printf %s' +-else +- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then +- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' +- as_echo_n='/usr/ucb/echo -n' +- else +- as_echo_body='eval expr "X$1" : "X\\(.*\\)"' +- as_echo_n_body='eval +- arg=$1; +- case $arg in @%:@( +- *"$as_nl"*) +- expr "X$arg" : "X\\(.*\\)$as_nl"; +- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; +- esac; +- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" +- ' +- export as_echo_n_body +- as_echo_n='sh -c $as_echo_n_body as_echo' +- fi +- export as_echo_body +- as_echo='sh -c $as_echo_body as_echo' +-fi +- +-# The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then +- PATH_SEPARATOR=: +- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { +- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || +- PATH_SEPARATOR=';' +- } +-fi +- +- +-# IFS +-# We need space, tab and new line, in precisely that order. Quoting is +-# there to prevent editors from complaining about space-tab. +-# (If _AS_PATH_WALK were called with IFS unset, it would disable word +-# splitting by setting IFS to empty value.) +-IFS=" "" $as_nl" +- +-# Find who we are. Look in the path if we contain no directory separator. +-as_myself= +-case $0 in @%:@(( +- *[\\/]* ) as_myself=$0 ;; +- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-# We did not find ourselves, most probably we were run as `sh COMMAND' +-# in which case we are not to be found in the path. +-if test "x$as_myself" = x; then +- as_myself=$0 +-fi +-if test ! -f "$as_myself"; then +- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 +- exit 1 +-fi +- +-# Unset variables that we do not need and which cause bugs (e.g. in +-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +-# suppresses any "Segmentation fault" message there. '((' could +-# trigger a bug in pdksh 5.2.14. +-for as_var in BASH_ENV ENV MAIL MAILPATH +-do eval test x\${$as_var+set} = xset \ +- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +-done +-PS1='$ ' +-PS2='> ' +-PS4='+ ' +- +-# NLS nuisances. +-LC_ALL=C +-export LC_ALL +-LANGUAGE=C +-export LANGUAGE +- +-# CDPATH. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-# Use a proper internal environment variable to ensure we don't fall +- # into an infinite loop, continuously re-executing ourselves. +- if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then +- _as_can_reexec=no; export _as_can_reexec; +- # We cannot yet assume a decent shell, so we have to provide a +-# neutralization value for shells without unset; and this also +-# works around shells that cannot unset nonexistent variables. +-# Preserve -v and -x to the replacement shell. +-BASH_ENV=/dev/null +-ENV=/dev/null +-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +-case $- in @%:@ (((( +- *v*x* | *x*v* ) as_opts=-vx ;; +- *v* ) as_opts=-v ;; +- *x* ) as_opts=-x ;; +- * ) as_opts= ;; +-esac +-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +-# Admittedly, this is quite paranoid, since all the known shells bail +-# out after a failed `exec'. +-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +-as_fn_exit 255 +- fi +- # We don't want this to propagate to other subprocesses. +- { _as_can_reexec=; unset _as_can_reexec;} +-if test "x$CONFIG_SHELL" = x; then +- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : +- emulate sh +- NULLCMD=: +- # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '\${1+\"\$@\"}'='\"\$@\"' +- setopt NO_GLOB_SUBST +-else +- case \`(set -o) 2>/dev/null\` in @%:@( +- *posix*) : +- set -o posix ;; @%:@( +- *) : +- ;; +-esac +-fi +-" +- as_required="as_fn_return () { (exit \$1); } +-as_fn_success () { as_fn_return 0; } +-as_fn_failure () { as_fn_return 1; } +-as_fn_ret_success () { return 0; } +-as_fn_ret_failure () { return 1; } +- +-exitcode=0 +-as_fn_success || { exitcode=1; echo as_fn_success failed.; } +-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +- +-else +- exitcode=1; echo positional parameters were not saved. +-fi +-test x\$exitcode = x0 || exit 1 +-test -x / || exit 1" +- as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO +- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO +- eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && +- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +-test \$(( 1 + 1 )) = 2 || exit 1 +- +- test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( +- ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO +- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO +- PATH=/empty FPATH=/empty; export PATH FPATH +- test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ +- || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" +- if (eval "$as_required") 2>/dev/null; then : +- as_have_required=yes +-else +- as_have_required=no +-fi +- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : +- +-else +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-as_found=false +-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- as_found=: +- case $as_dir in @%:@( +- /*) +- for as_base in sh bash ksh sh5; do +- # Try only shells that exist, to save several forks. +- as_shell=$as_dir/$as_base +- if { test -f "$as_shell" || test -f "$as_shell.exe"; } && +- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : +- CONFIG_SHELL=$as_shell as_have_required=yes +- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : +- break 2 +-fi +-fi +- done;; +- esac +- as_found=false +-done +-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : +- CONFIG_SHELL=$SHELL as_have_required=yes +-fi; } +-IFS=$as_save_IFS +- +- +- if test "x$CONFIG_SHELL" != x; then : +- export CONFIG_SHELL +- # We cannot yet assume a decent shell, so we have to provide a +-# neutralization value for shells without unset; and this also +-# works around shells that cannot unset nonexistent variables. +-# Preserve -v and -x to the replacement shell. +-BASH_ENV=/dev/null +-ENV=/dev/null +-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +-case $- in @%:@ (((( +- *v*x* | *x*v* ) as_opts=-vx ;; +- *v* ) as_opts=-v ;; +- *x* ) as_opts=-x ;; +- * ) as_opts= ;; +-esac +-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +-# Admittedly, this is quite paranoid, since all the known shells bail +-# out after a failed `exec'. +-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +-exit 255 +-fi +- +- if test x$as_have_required = xno; then : +- $as_echo "$0: This script requires a shell more modern than all" +- $as_echo "$0: the shells that I found on your system." +- if test x${ZSH_VERSION+set} = xset ; then +- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" +- $as_echo "$0: be upgraded to zsh 4.3.4 or later." +- else +- $as_echo "$0: Please tell bug-autoconf@gnu.org and +-$0: gmp-bugs@gmplib.org, see +-$0: https://gmplib.org/manual/Reporting-Bugs.html about +-$0: your system, including any error possibly output before +-$0: this message. Then install a modern shell, or manually +-$0: run the script under such a shell if you do have one." +- fi +- exit 1 +-fi +-fi +-fi +-SHELL=${CONFIG_SHELL-/bin/sh} +-export SHELL +-# Unset more variables known to interfere with behavior of common tools. +-CLICOLOR_FORCE= GREP_OPTIONS= +-unset CLICOLOR_FORCE GREP_OPTIONS +- +-## --------------------- ## +-## M4sh Shell Functions. ## +-## --------------------- ## +-@%:@ as_fn_unset VAR +-@%:@ --------------- +-@%:@ Portably unset VAR. +-as_fn_unset () +-{ +- { eval $1=; unset $1;} +-} +-as_unset=as_fn_unset +- +-@%:@ as_fn_set_status STATUS +-@%:@ ----------------------- +-@%:@ Set @S|@? to STATUS, without forking. +-as_fn_set_status () +-{ +- return $1 +-} @%:@ as_fn_set_status +- +-@%:@ as_fn_exit STATUS +-@%:@ ----------------- +-@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +-as_fn_exit () +-{ +- set +e +- as_fn_set_status $1 +- exit $1 +-} @%:@ as_fn_exit +- +-@%:@ as_fn_mkdir_p +-@%:@ ------------- +-@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +-as_fn_mkdir_p () +-{ +- +- case $as_dir in #( +- -*) as_dir=./$as_dir;; +- esac +- test -d "$as_dir" || eval $as_mkdir_p || { +- as_dirs= +- while :; do +- case $as_dir in #( +- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( +- *) as_qdir=$as_dir;; +- esac +- as_dirs="'$as_qdir' $as_dirs" +- as_dir=`$as_dirname -- "$as_dir" || +-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_dir" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- test -d "$as_dir" && break +- done +- test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" +- +- +-} @%:@ as_fn_mkdir_p +- +-@%:@ as_fn_executable_p FILE +-@%:@ ----------------------- +-@%:@ Test if FILE is an executable regular file. +-as_fn_executable_p () +-{ +- test -f "$1" && test -x "$1" +-} @%:@ as_fn_executable_p +-@%:@ as_fn_append VAR VALUE +-@%:@ ---------------------- +-@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +-@%:@ advantage of any shell optimizations that allow amortized linear growth over +-@%:@ repeated appends, instead of the typical quadratic growth present in naive +-@%:@ implementations. +-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +- eval 'as_fn_append () +- { +- eval $1+=\$2 +- }' +-else +- as_fn_append () +- { +- eval $1=\$$1\$2 +- } +-fi # as_fn_append +- +-@%:@ as_fn_arith ARG... +-@%:@ ------------------ +-@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +-@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +-@%:@ must be portable across @S|@(()) and expr. +-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +- eval 'as_fn_arith () +- { +- as_val=$(( $* )) +- }' +-else +- as_fn_arith () +- { +- as_val=`expr "$@" || test $? -eq 1` +- } +-fi # as_fn_arith +- +- +-@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +-@%:@ ---------------------------------------- +-@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +-@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-@%:@ script with STATUS, using 1 if that was 0. +-as_fn_error () +-{ +- as_status=$1; test $as_status -eq 0 && as_status=1 +- if test "$4"; then +- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 +- fi +- $as_echo "$as_me: error: $2" >&2 +- as_fn_exit $as_status +-} @%:@ as_fn_error +- +-if expr a : '\(a\)' >/dev/null 2>&1 && +- test "X`expr 00001 : '.*\(...\)'`" = X001; then +- as_expr=expr +-else +- as_expr=false +-fi +- +-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then +- as_basename=basename +-else +- as_basename=false +-fi +- +-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then +- as_dirname=dirname +-else +- as_dirname=false +-fi +- +-as_me=`$as_basename -- "$0" || +-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ +- X"$0" : 'X\(//\)$' \| \ +- X"$0" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X/"$0" | +- sed '/^.*\/\([^/][^/]*\)\/*$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- +-# Avoid depending upon Character Ranges. +-as_cr_letters='abcdefghijklmnopqrstuvwxyz' +-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +-as_cr_Letters=$as_cr_letters$as_cr_LETTERS +-as_cr_digits='0123456789' +-as_cr_alnum=$as_cr_Letters$as_cr_digits +- +- +- as_lineno_1=$LINENO as_lineno_1a=$LINENO +- as_lineno_2=$LINENO as_lineno_2a=$LINENO +- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && +- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { +- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) +- sed -n ' +- p +- /[$]LINENO/= +- ' <$as_myself | +- sed ' +- s/[$]LINENO.*/&-/ +- t lineno +- b +- :lineno +- N +- :loop +- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ +- t loop +- s/-\n.*// +- ' >$as_me.lineno && +- chmod +x "$as_me.lineno" || +- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } +- +- # If we had to re-execute with $CONFIG_SHELL, we're ensured to have +- # already done that, so ensure we don't try to do so again and fall +- # in an infinite loop. This has already happened in practice. +- _as_can_reexec=no; export _as_can_reexec +- # Don't try to exec as it changes $[0], causing all sort of problems +- # (the dirname of $[0] is not the place where we might find the +- # original and so on. Autoconf is especially sensitive to this). +- . "./$as_me.lineno" +- # Exit status is that of the last command. +- exit +-} +- +-ECHO_C= ECHO_N= ECHO_T= +-case `echo -n x` in @%:@((((( +--n*) +- case `echo 'xy\c'` in +- *c*) ECHO_T=' ';; # ECHO_T is single tab character. +- xy) ECHO_C='\c';; +- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null +- ECHO_T=' ';; +- esac;; +-*) +- ECHO_N='-n';; +-esac +- +-rm -f conf$$ conf$$.exe conf$$.file +-if test -d conf$$.dir; then +- rm -f conf$$.dir/conf$$.file +-else +- rm -f conf$$.dir +- mkdir conf$$.dir 2>/dev/null +-fi +-if (echo >conf$$.file) 2>/dev/null; then +- if ln -s conf$$.file conf$$ 2>/dev/null; then +- as_ln_s='ln -s' +- # ... but there are two gotchas: +- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. +- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -pR'. +- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -pR' +- elif ln conf$$.file conf$$ 2>/dev/null; then +- as_ln_s=ln +- else +- as_ln_s='cp -pR' +- fi +-else +- as_ln_s='cp -pR' +-fi +-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +-rmdir conf$$.dir 2>/dev/null +- +-if mkdir -p . 2>/dev/null; then +- as_mkdir_p='mkdir -p "$as_dir"' +-else +- test -d ./-p && rmdir ./-p +- as_mkdir_p=false +-fi +- +-as_test_x='test -x' +-as_executable_p=as_fn_executable_p +- +-# Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +- +-# Sed expression to map a string onto a valid variable name. +-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +- +-SHELL=${CONFIG_SHELL-/bin/sh} +- +- +-test -n "$DJDIR" || exec 7<&0 &1 +- +-# Name of the host. +-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +-# so uname gets run too. +-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` +- +-# +-# Initializations. +-# +-ac_default_prefix=/usr/local +-ac_clean_files= +-ac_config_libobj_dir=. +-LIB@&t@OBJS= +-cross_compiling=no +-subdirs= +-MFLAGS= +-MAKEFLAGS= +- +-# Identity of this package. +-PACKAGE_NAME='GNU MP' +-PACKAGE_TARNAME='gmp' +-PACKAGE_VERSION='6.0.0' +-PACKAGE_STRING='GNU MP 6.0.0' +-PACKAGE_BUGREPORT='gmp-bugs@gmplib.org, see https://gmplib.org/manual/Reporting-Bugs.html' +-PACKAGE_URL='http://www.gnu.org/software/gmp/' +- +-ac_unique_file="gmp-impl.h" +-# Factoring default headers for most tests. +-ac_includes_default="\ +-#include +-#ifdef HAVE_SYS_TYPES_H +-# include +-#endif +-#ifdef HAVE_SYS_STAT_H +-# include +-#endif +-#ifdef STDC_HEADERS +-# include +-# include +-#else +-# ifdef HAVE_STDLIB_H +-# include +-# endif +-#endif +-#ifdef HAVE_STRING_H +-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +-# include +-# endif +-# include +-#endif +-#ifdef HAVE_STRINGS_H +-# include +-#endif +-#ifdef HAVE_INTTYPES_H +-# include +-#endif +-#ifdef HAVE_STDINT_H +-# include +-#endif +-#ifdef HAVE_UNISTD_H +-# include +-#endif" +- +-ac_subst_vars='am__EXEEXT_FALSE +-am__EXEEXT_TRUE +-LTLIBOBJS +-LIB@&t@OBJS +-LEXLIB +-LEX_OUTPUT_ROOT +-LEX +-YFLAGS +-YACC +-LIBREADLINE +-WITH_READLINE_01 +-LIBCURSES +-HAVE_STACK_T_01 +-HAVE_SYS_RESOURCE_H_01 +-HAVE_SIGSTACK_01 +-HAVE_SIGALTSTACK_01 +-HAVE_SIGACTION_01 +-HAVE_GETTIMEOFDAY_01 +-HAVE_GETRUSAGE_01 +-HAVE_CPUTIME_01 +-HAVE_CLOCK_01 +-TUNE_SQR_OBJ +-gmp_srclinks +-mpn_objs_in_libgmp +-mpn_objects +-GMP_LIMB_BITS +-M4 +-TUNE_LIBS +-TAL_OBJECT +-LIBM +-ENABLE_STATIC_FALSE +-ENABLE_STATIC_TRUE +-OTOOL64 +-OTOOL +-LIPO +-NMEDIT +-DSYMUTIL +-MANIFEST_TOOL +-RANLIB +-ac_ct_AR +-LN_S +-LD +-FGREP +-SED +-LIBTOOL +-LIBGMP_DLL +-OBJDUMP +-DLLTOOL +-AS +-NM +-ac_ct_DUMPBIN +-DUMPBIN +-AR +-ASMFLAGS +-EGREP +-GREP +-CXXCPP +-WANT_CXX_FALSE +-WANT_CXX_TRUE +-ac_ct_CXX +-CXXFLAGS +-CXX +-CCAS +-LIBM_FOR_BUILD +-U_FOR_BUILD +-EXEEXT_FOR_BUILD +-CPP_FOR_BUILD +-CC_FOR_BUILD +-CPP +-OBJEXT +-EXEEXT +-ac_ct_CC +-CPPFLAGS +-LDFLAGS +-CFLAGS +-CC +-DEFN_LONG_LONG_LIMB +-CALLING_CONVENTIONS_OBJS +-SPEED_CYCLECOUNTER_OBJ +-LIBGMPXX_LDFLAGS +-LIBGMP_LDFLAGS +-GMP_LDFLAGS +-HAVE_HOST_CPU_FAMILY_powerpc +-HAVE_HOST_CPU_FAMILY_power +-ABI +-GMP_NAIL_BITS +-MAINT +-MAINTAINER_MODE_FALSE +-MAINTAINER_MODE_TRUE +-AM_BACKSLASH +-AM_DEFAULT_VERBOSITY +-AM_DEFAULT_V +-AM_V +-am__untar +-am__tar +-AMTAR +-am__leading_dot +-SET_MAKE +-AWK +-mkdir_p +-MKDIR_P +-INSTALL_STRIP_PROGRAM +-STRIP +-install_sh +-MAKEINFO +-AUTOHEADER +-AUTOMAKE +-AUTOCONF +-ACLOCAL +-VERSION +-PACKAGE +-CYGPATH_W +-am__isrc +-INSTALL_DATA +-INSTALL_SCRIPT +-INSTALL_PROGRAM +-host_os +-host_vendor +-host_cpu +-host +-build_os +-build_vendor +-build_cpu +-build +-target_alias +-host_alias +-build_alias +-LIBS +-ECHO_T +-ECHO_N +-ECHO_C +-DEFS +-mandir +-localedir +-libdir +-psdir +-pdfdir +-dvidir +-htmldir +-infodir +-docdir +-oldincludedir +-includedir +-localstatedir +-sharedstatedir +-sysconfdir +-datadir +-datarootdir +-libexecdir +-sbindir +-bindir +-program_transform_name +-prefix +-exec_prefix +-PACKAGE_URL +-PACKAGE_BUGREPORT +-PACKAGE_STRING +-PACKAGE_VERSION +-PACKAGE_TARNAME +-PACKAGE_NAME +-PATH_SEPARATOR +-SHELL' +-ac_subst_files='' +-ac_user_opts=' +-enable_option_checking +-enable_silent_rules +-enable_maintainer_mode +-enable_assert +-enable_alloca +-enable_cxx +-enable_assembly +-enable_fft +-enable_old_fft_full +-enable_nails +-enable_profiling +-with_readline +-enable_fat +-enable_minithres +-enable_fake_cpuid +-enable_shared +-enable_static +-with_pic +-enable_fast_install +-with_gnu_ld +-with_sysroot +-enable_libtool_lock +-' +- ac_precious_vars='build_alias +-host_alias +-target_alias +-ABI +-CC +-CFLAGS +-LDFLAGS +-LIBS +-CPPFLAGS +-CPP +-CC_FOR_BUILD +-CPP_FOR_BUILD +-CXX +-CXXFLAGS +-CCC +-CXXCPP +-M4 +-YACC +-YFLAGS' +- +- +-# Initialize some variables set by options. +-ac_init_help= +-ac_init_version=false +-ac_unrecognized_opts= +-ac_unrecognized_sep= +-# The variables have the same names as the options, with +-# dashes changed to underlines. +-cache_file=/dev/null +-exec_prefix=NONE +-no_create= +-no_recursion= +-prefix=NONE +-program_prefix=NONE +-program_suffix=NONE +-program_transform_name=s,x,x, +-silent= +-site= +-srcdir= +-verbose= +-x_includes=NONE +-x_libraries=NONE +- +-# Installation directory options. +-# These are left unexpanded so users can "make install exec_prefix=/foo" +-# and all the variables that are supposed to be based on exec_prefix +-# by default will actually change. +-# Use braces instead of parens because sh, perl, etc. also accept them. +-# (The list follows the same order as the GNU Coding Standards.) +-bindir='${exec_prefix}/bin' +-sbindir='${exec_prefix}/sbin' +-libexecdir='${exec_prefix}/libexec' +-datarootdir='${prefix}/share' +-datadir='${datarootdir}' +-sysconfdir='${prefix}/etc' +-sharedstatedir='${prefix}/com' +-localstatedir='${prefix}/var' +-includedir='${prefix}/include' +-oldincludedir='/usr/include' +-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +-infodir='${datarootdir}/info' +-htmldir='${docdir}' +-dvidir='${docdir}' +-pdfdir='${docdir}' +-psdir='${docdir}' +-libdir='${exec_prefix}/lib' +-localedir='${datarootdir}/locale' +-mandir='${datarootdir}/man' +- +-ac_prev= +-ac_dashdash= +-for ac_option +-do +- # If the previous option needs an argument, assign it. +- if test -n "$ac_prev"; then +- eval $ac_prev=\$ac_option +- ac_prev= +- continue +- fi +- +- case $ac_option in +- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; +- *=) ac_optarg= ;; +- *) ac_optarg=yes ;; +- esac +- +- # Accept the important Cygnus configure options, so we can diagnose typos. +- +- case $ac_dashdash$ac_option in +- --) +- ac_dashdash=yes ;; +- +- -bindir | --bindir | --bindi | --bind | --bin | --bi) +- ac_prev=bindir ;; +- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) +- bindir=$ac_optarg ;; +- +- -build | --build | --buil | --bui | --bu) +- ac_prev=build_alias ;; +- -build=* | --build=* | --buil=* | --bui=* | --bu=*) +- build_alias=$ac_optarg ;; +- +- -cache-file | --cache-file | --cache-fil | --cache-fi \ +- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) +- ac_prev=cache_file ;; +- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ +- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) +- cache_file=$ac_optarg ;; +- +- --config-cache | -C) +- cache_file=config.cache ;; +- +- -datadir | --datadir | --datadi | --datad) +- ac_prev=datadir ;; +- -datadir=* | --datadir=* | --datadi=* | --datad=*) +- datadir=$ac_optarg ;; +- +- -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ +- | --dataroo | --dataro | --datar) +- ac_prev=datarootdir ;; +- -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ +- | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) +- datarootdir=$ac_optarg ;; +- +- -disable-* | --disable-*) +- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid feature name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"enable_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval enable_$ac_useropt=no ;; +- +- -docdir | --docdir | --docdi | --doc | --do) +- ac_prev=docdir ;; +- -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) +- docdir=$ac_optarg ;; +- +- -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) +- ac_prev=dvidir ;; +- -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) +- dvidir=$ac_optarg ;; +- +- -enable-* | --enable-*) +- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid feature name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"enable_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval enable_$ac_useropt=\$ac_optarg ;; +- +- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ +- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ +- | --exec | --exe | --ex) +- ac_prev=exec_prefix ;; +- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ +- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ +- | --exec=* | --exe=* | --ex=*) +- exec_prefix=$ac_optarg ;; +- +- -gas | --gas | --ga | --g) +- # Obsolete; use --with-gas. +- with_gas=yes ;; +- +- -help | --help | --hel | --he | -h) +- ac_init_help=long ;; +- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) +- ac_init_help=recursive ;; +- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) +- ac_init_help=short ;; +- +- -host | --host | --hos | --ho) +- ac_prev=host_alias ;; +- -host=* | --host=* | --hos=* | --ho=*) +- host_alias=$ac_optarg ;; +- +- -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) +- ac_prev=htmldir ;; +- -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ +- | --ht=*) +- htmldir=$ac_optarg ;; +- +- -includedir | --includedir | --includedi | --included | --include \ +- | --includ | --inclu | --incl | --inc) +- ac_prev=includedir ;; +- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ +- | --includ=* | --inclu=* | --incl=* | --inc=*) +- includedir=$ac_optarg ;; +- +- -infodir | --infodir | --infodi | --infod | --info | --inf) +- ac_prev=infodir ;; +- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) +- infodir=$ac_optarg ;; +- +- -libdir | --libdir | --libdi | --libd) +- ac_prev=libdir ;; +- -libdir=* | --libdir=* | --libdi=* | --libd=*) +- libdir=$ac_optarg ;; +- +- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ +- | --libexe | --libex | --libe) +- ac_prev=libexecdir ;; +- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ +- | --libexe=* | --libex=* | --libe=*) +- libexecdir=$ac_optarg ;; +- +- -localedir | --localedir | --localedi | --localed | --locale) +- ac_prev=localedir ;; +- -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) +- localedir=$ac_optarg ;; +- +- -localstatedir | --localstatedir | --localstatedi | --localstated \ +- | --localstate | --localstat | --localsta | --localst | --locals) +- ac_prev=localstatedir ;; +- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ +- | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) +- localstatedir=$ac_optarg ;; +- +- -mandir | --mandir | --mandi | --mand | --man | --ma | --m) +- ac_prev=mandir ;; +- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) +- mandir=$ac_optarg ;; +- +- -nfp | --nfp | --nf) +- # Obsolete; use --without-fp. +- with_fp=no ;; +- +- -no-create | --no-create | --no-creat | --no-crea | --no-cre \ +- | --no-cr | --no-c | -n) +- no_create=yes ;; +- +- -no-recursion | --no-recursion | --no-recursio | --no-recursi \ +- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) +- no_recursion=yes ;; +- +- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ +- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ +- | --oldin | --oldi | --old | --ol | --o) +- ac_prev=oldincludedir ;; +- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ +- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ +- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) +- oldincludedir=$ac_optarg ;; +- +- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) +- ac_prev=prefix ;; +- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) +- prefix=$ac_optarg ;; +- +- -program-prefix | --program-prefix | --program-prefi | --program-pref \ +- | --program-pre | --program-pr | --program-p) +- ac_prev=program_prefix ;; +- -program-prefix=* | --program-prefix=* | --program-prefi=* \ +- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) +- program_prefix=$ac_optarg ;; +- +- -program-suffix | --program-suffix | --program-suffi | --program-suff \ +- | --program-suf | --program-su | --program-s) +- ac_prev=program_suffix ;; +- -program-suffix=* | --program-suffix=* | --program-suffi=* \ +- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) +- program_suffix=$ac_optarg ;; +- +- -program-transform-name | --program-transform-name \ +- | --program-transform-nam | --program-transform-na \ +- | --program-transform-n | --program-transform- \ +- | --program-transform | --program-transfor \ +- | --program-transfo | --program-transf \ +- | --program-trans | --program-tran \ +- | --progr-tra | --program-tr | --program-t) +- ac_prev=program_transform_name ;; +- -program-transform-name=* | --program-transform-name=* \ +- | --program-transform-nam=* | --program-transform-na=* \ +- | --program-transform-n=* | --program-transform-=* \ +- | --program-transform=* | --program-transfor=* \ +- | --program-transfo=* | --program-transf=* \ +- | --program-trans=* | --program-tran=* \ +- | --progr-tra=* | --program-tr=* | --program-t=*) +- program_transform_name=$ac_optarg ;; +- +- -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) +- ac_prev=pdfdir ;; +- -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) +- pdfdir=$ac_optarg ;; +- +- -psdir | --psdir | --psdi | --psd | --ps) +- ac_prev=psdir ;; +- -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) +- psdir=$ac_optarg ;; +- +- -q | -quiet | --quiet | --quie | --qui | --qu | --q \ +- | -silent | --silent | --silen | --sile | --sil) +- silent=yes ;; +- +- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) +- ac_prev=sbindir ;; +- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ +- | --sbi=* | --sb=*) +- sbindir=$ac_optarg ;; +- +- -sharedstatedir | --sharedstatedir | --sharedstatedi \ +- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ +- | --sharedst | --shareds | --shared | --share | --shar \ +- | --sha | --sh) +- ac_prev=sharedstatedir ;; +- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ +- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ +- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ +- | --sha=* | --sh=*) +- sharedstatedir=$ac_optarg ;; +- +- -site | --site | --sit) +- ac_prev=site ;; +- -site=* | --site=* | --sit=*) +- site=$ac_optarg ;; +- +- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) +- ac_prev=srcdir ;; +- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) +- srcdir=$ac_optarg ;; +- +- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ +- | --syscon | --sysco | --sysc | --sys | --sy) +- ac_prev=sysconfdir ;; +- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ +- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) +- sysconfdir=$ac_optarg ;; +- +- -target | --target | --targe | --targ | --tar | --ta | --t) +- ac_prev=target_alias ;; +- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) +- target_alias=$ac_optarg ;; +- +- -v | -verbose | --verbose | --verbos | --verbo | --verb) +- verbose=yes ;; +- +- -version | --version | --versio | --versi | --vers | -V) +- ac_init_version=: ;; +- +- -with-* | --with-*) +- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid package name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"with_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval with_$ac_useropt=\$ac_optarg ;; +- +- -without-* | --without-*) +- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid package name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"with_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval with_$ac_useropt=no ;; +- +- --x) +- # Obsolete; use --with-x. +- with_x=yes ;; +- +- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ +- | --x-incl | --x-inc | --x-in | --x-i) +- ac_prev=x_includes ;; +- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ +- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) +- x_includes=$ac_optarg ;; +- +- -x-libraries | --x-libraries | --x-librarie | --x-librari \ +- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) +- ac_prev=x_libraries ;; +- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ +- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) +- x_libraries=$ac_optarg ;; +- +- -*) as_fn_error $? "unrecognized option: \`$ac_option' +-Try \`$0 --help' for more information" +- ;; +- +- *=*) +- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` +- # Reject names that are not valid shell variable names. +- case $ac_envvar in #( +- '' | [0-9]* | *[!_$as_cr_alnum]* ) +- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; +- esac +- eval $ac_envvar=\$ac_optarg +- export $ac_envvar ;; +- +- *) +- # FIXME: should be removed in autoconf 3.0. +- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 +- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && +- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 +- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" +- ;; +- +- esac +-done +- +-if test -n "$ac_prev"; then +- ac_option=--`echo $ac_prev | sed 's/_/-/g'` +- as_fn_error $? "missing argument to $ac_option" +-fi +- +-if test -n "$ac_unrecognized_opts"; then +- case $enable_option_checking in +- no) ;; +- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; +- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; +- esac +-fi +- +-# Check all directory arguments for consistency. +-for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ +- datadir sysconfdir sharedstatedir localstatedir includedir \ +- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ +- libdir localedir mandir +-do +- eval ac_val=\$$ac_var +- # Remove trailing slashes. +- case $ac_val in +- */ ) +- ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` +- eval $ac_var=\$ac_val;; +- esac +- # Be sure to have absolute directory names. +- case $ac_val in +- [\\/$]* | ?:[\\/]* ) continue;; +- NONE | '' ) case $ac_var in *prefix ) continue;; esac;; +- esac +- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +-done +- +-# There might be people who depend on the old broken behavior: `$host' +-# used to hold the argument of --host etc. +-# FIXME: To remove some day. +-build=$build_alias +-host=$host_alias +-target=$target_alias +- +-# FIXME: To remove some day. +-if test "x$host_alias" != x; then +- if test "x$build_alias" = x; then +- cross_compiling=maybe +- elif test "x$build_alias" != "x$host_alias"; then +- cross_compiling=yes +- fi +-fi +- +-ac_tool_prefix= +-test -n "$host_alias" && ac_tool_prefix=$host_alias- +- +-test "$silent" = yes && exec 6>/dev/null +- +- +-ac_pwd=`pwd` && test -n "$ac_pwd" && +-ac_ls_di=`ls -di .` && +-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || +- as_fn_error $? "working directory cannot be determined" +-test "X$ac_ls_di" = "X$ac_pwd_ls_di" || +- as_fn_error $? "pwd does not report name of working directory" +- +- +-# Find the source files, if location was not specified. +-if test -z "$srcdir"; then +- ac_srcdir_defaulted=yes +- # Try the directory containing this script, then the parent directory. +- ac_confdir=`$as_dirname -- "$as_myself" || +-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_myself" : 'X\(//\)[^/]' \| \ +- X"$as_myself" : 'X\(//\)$' \| \ +- X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_myself" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- srcdir=$ac_confdir +- if test ! -r "$srcdir/$ac_unique_file"; then +- srcdir=.. +- fi +-else +- ac_srcdir_defaulted=no +-fi +-if test ! -r "$srcdir/$ac_unique_file"; then +- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." +- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +-fi +-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +-ac_abs_confdir=`( +- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" +- pwd)` +-# When building in place, set srcdir=. +-if test "$ac_abs_confdir" = "$ac_pwd"; then +- srcdir=. +-fi +-# Remove unnecessary trailing slashes from srcdir. +-# Double slashes in file names in object file debugging info +-# mess up M-x gdb in Emacs. +-case $srcdir in +-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +-esac +-for ac_var in $ac_precious_vars; do +- eval ac_env_${ac_var}_set=\${${ac_var}+set} +- eval ac_env_${ac_var}_value=\$${ac_var} +- eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} +- eval ac_cv_env_${ac_var}_value=\$${ac_var} +-done +- +-# +-# Report the --help message. +-# +-if test "$ac_init_help" = "long"; then +- # Omit some internal or obsolete options to make the list less imposing. +- # This message is too long to be a string in the A/UX 3.1 sh. +- cat <<_ACEOF +-\`configure' configures GNU MP 6.0.0 to adapt to many kinds of systems. +- +-Usage: $0 [OPTION]... [VAR=VALUE]... +- +-To assign environment variables (e.g., CC, CFLAGS...), specify them as +-VAR=VALUE. See below for descriptions of some of the useful variables. +- +-Defaults for the options are specified in brackets. +- +-Configuration: +- -h, --help display this help and exit +- --help=short display options specific to this package +- --help=recursive display the short help of all the included packages +- -V, --version display version information and exit +- -q, --quiet, --silent do not print \`checking ...' messages +- --cache-file=FILE cache test results in FILE [disabled] +- -C, --config-cache alias for \`--cache-file=config.cache' +- -n, --no-create do not create output files +- --srcdir=DIR find the sources in DIR [configure dir or \`..'] +- +-Installation directories: +- --prefix=PREFIX install architecture-independent files in PREFIX +- @<:@@S|@ac_default_prefix@:>@ +- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX +- @<:@PREFIX@:>@ +- +-By default, \`make install' will install all the files in +-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +-an installation prefix other than \`$ac_default_prefix' using \`--prefix', +-for instance \`--prefix=\$HOME'. +- +-For better control, use the options below. +- +-Fine tuning of the installation directories: +- --bindir=DIR user executables [EPREFIX/bin] +- --sbindir=DIR system admin executables [EPREFIX/sbin] +- --libexecdir=DIR program executables [EPREFIX/libexec] +- --sysconfdir=DIR read-only single-machine data [PREFIX/etc] +- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] +- --localstatedir=DIR modifiable single-machine data [PREFIX/var] +- --libdir=DIR object code libraries [EPREFIX/lib] +- --includedir=DIR C header files [PREFIX/include] +- --oldincludedir=DIR C header files for non-gcc [/usr/include] +- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] +- --datadir=DIR read-only architecture-independent data [DATAROOTDIR] +- --infodir=DIR info documentation [DATAROOTDIR/info] +- --localedir=DIR locale-dependent data [DATAROOTDIR/locale] +- --mandir=DIR man documentation [DATAROOTDIR/man] +- --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gmp@:>@ +- --htmldir=DIR html documentation [DOCDIR] +- --dvidir=DIR dvi documentation [DOCDIR] +- --pdfdir=DIR pdf documentation [DOCDIR] +- --psdir=DIR ps documentation [DOCDIR] +-_ACEOF +- +- cat <<\_ACEOF +- +-Program names: +- --program-prefix=PREFIX prepend PREFIX to installed program names +- --program-suffix=SUFFIX append SUFFIX to installed program names +- --program-transform-name=PROGRAM run sed PROGRAM on installed program names +- +-System types: +- --build=BUILD configure for building on BUILD [guessed] +- --host=HOST cross-compile to build programs to run on HOST [BUILD] +-_ACEOF +-fi +- +-if test -n "$ac_init_help"; then +- case $ac_init_help in +- short | recursive ) echo "Configuration of GNU MP 6.0.0:";; +- esac +- cat <<\_ACEOF +- +-Optional Features: +- --disable-option-checking ignore unrecognized --enable/--with options +- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) +- --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +- --enable-silent-rules less verbose build output (undo: "make V=1") +- --disable-silent-rules verbose build output (undo: "make V=0") +- --enable-maintainer-mode +- enable make rules and dependencies not useful (and +- sometimes confusing) to the casual installer +- --enable-assert enable ASSERT checking @<:@@<:@default=no@:>@@:>@ +- --enable-alloca how to get temp memory @<:@@<:@default=reentrant@:>@@:>@ +- --enable-cxx enable C++ support @<:@@<:@default=no@:>@@:>@ +- --enable-assembly enable the use of assembly loops @<:@@<:@default=yes@:>@@:>@ +- --enable-fft enable FFTs for multiplication @<:@@<:@default=yes@:>@@:>@ +- --enable-old-fft-full enable old mpn_mul_fft_full for multiplication +- @<:@@<:@default=no@:>@@:>@ +- --enable-nails use nails on limbs @<:@@<:@default=no@:>@@:>@ +- --enable-profiling build with profiler support @<:@@<:@default=no@:>@@:>@ +- --enable-fat build a fat binary on systems that support it +- @<:@@<:@default=no@:>@@:>@ +- --enable-minithres choose minimal thresholds for testing @<:@@<:@default=no@:>@@:>@ +- --enable-fake-cpuid enable GMP_CPU_TYPE faking cpuid @<:@@<:@default=no@:>@@:>@ +- --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ +- --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ +- --enable-fast-install@<:@=PKGS@:>@ +- optimize for fast installation @<:@default=yes@:>@ +- --disable-libtool-lock avoid locking (might break parallel builds) +- +-Optional Packages: +- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) +- --with-readline readline support in calc demo program +- @<:@@<:@default=detect@:>@@:>@ +- --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use +- both@:>@ +- --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ +- --with-sysroot=DIR Search for dependent libraries within DIR +- (or the compiler's sysroot if not specified). +- +-Some influential environment variables: +- ABI desired ABI (for processors supporting more than one ABI) +- CC C compiler command +- CFLAGS C compiler flags +- LDFLAGS linker flags, e.g. -L if you have libraries in a +- nonstandard directory +- LIBS libraries to pass to the linker, e.g. -l +- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if +- you have headers in a nonstandard directory +- CPP C preprocessor +- CC_FOR_BUILD +- build system C compiler +- CPP_FOR_BUILD +- build system C preprocessor +- CXX C++ compiler command +- CXXFLAGS C++ compiler flags +- CXXCPP C++ preprocessor +- M4 m4 macro processor +- YACC The `Yet Another Compiler Compiler' implementation to use. +- Defaults to the first program found out of: `bison -y', `byacc', +- `yacc'. +- YFLAGS The list of arguments that will be passed by default to @S|@YACC. +- This script will default YFLAGS to the empty string to avoid a +- default value of `-d' given by some make applications. +- +-Use these variables to override the choices made by `configure' or to help +-it to find libraries and programs with nonstandard names/locations. +- +-Report bugs to . +-GNU MP home page: . +-General help using GNU software: . +-_ACEOF +-ac_status=$? +-fi +- +-if test "$ac_init_help" = "recursive"; then +- # If there are subdirs, report their specific --help. +- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue +- test -d "$ac_dir" || +- { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || +- continue +- ac_builddir=. +- +-case "$ac_dir" in +-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +-*) +- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` +- # A ".." for each directory in $ac_dir_suffix. +- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` +- case $ac_top_builddir_sub in +- "") ac_top_builddir_sub=. ac_top_build_prefix= ;; +- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; +- esac ;; +-esac +-ac_abs_top_builddir=$ac_pwd +-ac_abs_builddir=$ac_pwd$ac_dir_suffix +-# for backward compatibility: +-ac_top_builddir=$ac_top_build_prefix +- +-case $srcdir in +- .) # We are building in place. +- ac_srcdir=. +- ac_top_srcdir=$ac_top_builddir_sub +- ac_abs_top_srcdir=$ac_pwd ;; +- [\\/]* | ?:[\\/]* ) # Absolute name. +- ac_srcdir=$srcdir$ac_dir_suffix; +- ac_top_srcdir=$srcdir +- ac_abs_top_srcdir=$srcdir ;; +- *) # Relative name. +- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix +- ac_top_srcdir=$ac_top_build_prefix$srcdir +- ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +-esac +-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix +- +- cd "$ac_dir" || { ac_status=$?; continue; } +- # Check for guested configure. +- if test -f "$ac_srcdir/configure.gnu"; then +- echo && +- $SHELL "$ac_srcdir/configure.gnu" --help=recursive +- elif test -f "$ac_srcdir/configure"; then +- echo && +- $SHELL "$ac_srcdir/configure" --help=recursive +- else +- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 +- fi || ac_status=$? +- cd "$ac_pwd" || { ac_status=$?; break; } +- done +-fi +- +-test -n "$ac_init_help" && exit $ac_status +-if $ac_init_version; then +- cat <<\_ACEOF +-GNU MP configure 6.0.0 +-generated by GNU Autoconf 2.69 +- +-Copyright (C) 2012 Free Software Foundation, Inc. +-This configure script is free software; the Free Software Foundation +-gives unlimited permission to copy, distribute and modify it. +- +- +- +-Copyright 1996-2014 Free Software Foundation, Inc. +- +-This file is part of the GNU MP Library. +- +-The GNU MP Library is free software; you can redistribute it and/or modify +-it under the terms of either: +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at your +- option) any later version. +- +-or +- +- * the GNU General Public License as published by the Free Software +- Foundation; either version 2 of the License, or (at your option) any +- later version. +- +-or both in parallel, as here. +- +-The GNU MP 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 General Public License +-for more details. +- +-You should have received copies of the GNU General Public License and the +-GNU Lesser General Public License along with the GNU MP Library. If not, +-see https://www.gnu.org/licenses/. +- +-_ACEOF +- exit +-fi +- +-## ------------------------ ## +-## Autoconf initialization. ## +-## ------------------------ ## +- +-@%:@ ac_fn_c_try_compile LINENO +-@%:@ -------------------------- +-@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_c_try_compile () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext +- if { { ac_try="$ac_compile" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compile") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_c_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest.$ac_objext; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_compile +- +-@%:@ ac_fn_c_try_cpp LINENO +-@%:@ ---------------------- +-@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_c_try_cpp () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { { ac_try="$ac_cpp conftest.$ac_ext" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } > conftest.i && { +- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || +- test ! -s conftest.err +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_cpp +- +-@%:@ ac_fn_cxx_try_compile LINENO +-@%:@ ---------------------------- +-@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_cxx_try_compile () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext +- if { { ac_try="$ac_compile" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compile") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_cxx_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest.$ac_objext; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_cxx_try_compile +- +-@%:@ ac_fn_cxx_try_cpp LINENO +-@%:@ ------------------------ +-@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_cxx_try_cpp () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { { ac_try="$ac_cpp conftest.$ac_ext" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } > conftest.i && { +- test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || +- test ! -s conftest.err +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_cxx_try_cpp +- +-@%:@ ac_fn_c_try_link LINENO +-@%:@ ----------------------- +-@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_c_try_link () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext conftest$ac_exeext +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_c_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest$ac_exeext && { +- test "$cross_compiling" = yes || +- test -x conftest$ac_exeext +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information +- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would +- # interfere with the next link command; also delete a directory that is +- # left behind by Apple's compiler. We do this before executing the actions. +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_link +- +-@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +-@%:@ ------------------------------------------------------- +-@%:@ Tests whether HEADER exists and can be compiled using the include files in +-@%:@ INCLUDES, setting the cache variable VAR accordingly. +-ac_fn_c_check_header_compile () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-@%:@include <$2> +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$3=yes" +-else +- eval "$3=no" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_header_compile +- +-@%:@ ac_fn_c_try_run LINENO +-@%:@ ---------------------- +-@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +-@%:@ that executables *can* be run. +-ac_fn_c_try_run () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' +- { { case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_try") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: program exited with status $ac_status" >&5 +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=$ac_status +-fi +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_run +- +-@%:@ ac_fn_c_check_func LINENO FUNC VAR +-@%:@ ---------------------------------- +-@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +-ac_fn_c_check_func () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-/* Define $2 to an innocuous variant, in case declares $2. +- For example, HP-UX 11i declares gettimeofday. */ +-#define $2 innocuous_$2 +- +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $2 (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ +- +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif +- +-#undef $2 +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char $2 (); +-/* 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_$2 || defined __stub___$2 +-choke me +-#endif +- +-int +-main () +-{ +-return $2 (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- eval "$3=yes" +-else +- eval "$3=no" +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_func +- +-@%:@ ac_fn_cxx_try_link LINENO +-@%:@ ------------------------- +-@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_cxx_try_link () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext conftest$ac_exeext +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_cxx_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest$ac_exeext && { +- test "$cross_compiling" = yes || +- test -x conftest$ac_exeext +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information +- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would +- # interfere with the next link command; also delete a directory that is +- # left behind by Apple's compiler. We do this before executing the actions. +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_cxx_try_link +- +-@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +-@%:@ ------------------------------------------------------- +-@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +-@%:@ the include files in INCLUDES and setting the cache variable VAR +-@%:@ accordingly. +-ac_fn_c_check_header_mongrel () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval \${$3+:} false; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-else +- # Is the header compilable? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +-$as_echo_n "checking $2 usability... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-@%:@include <$2> +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_header_compiler=yes +-else +- ac_header_compiler=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +-$as_echo "$ac_header_compiler" >&6; } +- +-# Is the header present? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +-$as_echo_n "checking $2 presence... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include <$2> +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- ac_header_preproc=yes +-else +- ac_header_preproc=no +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +-$as_echo "$ac_header_preproc" >&6; } +- +-# So? What about this header? +-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( +- yes:no: ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +- ;; +- no:yes:* ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +-( $as_echo "## ssssssssssssssssssssssssssssssssss ## +-## Report this to gmp-bugs@gmplib.org ## +-## ssssssssssssssssssssssssssssssssss ##" +- ) | sed "s/^/$as_me: WARNING: /" >&2 +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=\$ac_header_compiler" +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_header_mongrel +- +-@%:@ ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +-@%:@ --------------------------------------------- +-@%:@ Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +-@%:@ accordingly. +-ac_fn_c_check_decl () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- as_decl_name=`echo $2|sed 's/ *(.*//'` +- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +-$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-@%:@ifndef $as_decl_name +-@%:@ifdef __cplusplus +- (void) $as_decl_use; +-@%:@else +- (void) $as_decl_name; +-@%:@endif +-@%:@endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$3=yes" +-else +- eval "$3=no" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_decl +- +-@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +-@%:@ ------------------------------------------- +-@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +-@%:@ variable VAR accordingly. +-ac_fn_c_check_type () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=no" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof ($2)) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof (($2))) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- eval "$3=yes" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_type +- +-@%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +-@%:@ ---------------------------------------------------- +-@%:@ Tries to find if the field MEMBER exists in type AGGR, after including +-@%:@ INCLUDES, setting cache variable VAR accordingly. +-ac_fn_c_check_member () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +-$as_echo_n "checking for $2.$3... " >&6; } +-if eval \${$4+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$5 +-int +-main () +-{ +-static $2 ac_aggr; +-if (ac_aggr.$3) +-return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$4=yes" +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$5 +-int +-main () +-{ +-static $2 ac_aggr; +-if (sizeof ac_aggr.$3) +-return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$4=yes" +-else +- eval "$4=no" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$4 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_member +- +-@%:@ ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +-@%:@ --------------------------------------------------------- +-@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +-@%:@ the include files in INCLUDES and setting the cache variable VAR +-@%:@ accordingly. +-ac_fn_cxx_check_header_mongrel () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval \${$3+:} false; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-else +- # Is the header compilable? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +-$as_echo_n "checking $2 usability... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-@%:@include <$2> +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_header_compiler=yes +-else +- ac_header_compiler=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +-$as_echo "$ac_header_compiler" >&6; } +- +-# Is the header present? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +-$as_echo_n "checking $2 presence... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include <$2> +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- ac_header_preproc=yes +-else +- ac_header_preproc=no +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +-$as_echo "$ac_header_preproc" >&6; } +- +-# So? What about this header? +-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( +- yes:no: ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +- ;; +- no:yes:* ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +-( $as_echo "## ssssssssssssssssssssssssssssssssss ## +-## Report this to gmp-bugs@gmplib.org ## +-## ssssssssssssssssssssssssssssssssss ##" +- ) | sed "s/^/$as_me: WARNING: /" >&2 +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=\$ac_header_compiler" +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_cxx_check_header_mongrel +- +-@%:@ ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES +-@%:@ --------------------------------------------- +-@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +-@%:@ variable VAR accordingly. +-ac_fn_cxx_check_type () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=no" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof ($2)) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof (($2))) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- +-else +- eval "$3=yes" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_cxx_check_type +- +-@%:@ ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +-@%:@ -------------------------------------------- +-@%:@ Tries to find the compile-time value of EXPR in a program that includes +-@%:@ INCLUDES, setting VAR accordingly. Returns whether the value could be +-@%:@ computed +-ac_fn_c_compute_int () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if test "$cross_compiling" = yes; then +- # Depending upon the size, compute the lo and hi bounds. +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) >= 0)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_lo=0 ac_mid=0 +- while :; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) <= $ac_mid)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=$ac_mid; break +-else +- as_fn_arith $ac_mid + 1 && ac_lo=$as_val +- if test $ac_lo -le $ac_mid; then +- ac_lo= ac_hi= +- break +- fi +- as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- done +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) < 0)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=-1 ac_mid=-1 +- while :; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) >= $ac_mid)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_lo=$ac_mid; break +-else +- as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val +- if test $ac_mid -le $ac_hi; then +- ac_lo= ac_hi= +- break +- fi +- as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- done +-else +- ac_lo= ac_hi= +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-# Binary search between lo and hi bounds. +-while test "x$ac_lo" != "x$ac_hi"; do +- as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) <= $ac_mid)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=$ac_mid +-else +- as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-done +-case $ac_lo in @%:@(( +-?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +-'') ac_retval=1 ;; +-esac +- else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-static long int longval () { return $2; } +-static unsigned long int ulongval () { return $2; } +-@%:@include +-@%:@include +-int +-main () +-{ +- +- FILE *f = fopen ("conftest.val", "w"); +- if (! f) +- return 1; +- if (($2) < 0) +- { +- long int i = longval (); +- if (i != ($2)) +- return 1; +- fprintf (f, "%ld", i); +- } +- else +- { +- unsigned long int i = ulongval (); +- if (i != ($2)) +- return 1; +- fprintf (f, "%lu", i); +- } +- /* Do not output a trailing newline, as this causes \r\n confusion +- on some platforms. */ +- return ferror (f) || fclose (f) != 0; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- echo >>conftest.val; read $3 config.log <<_ACEOF +-This file contains any messages produced by compilers while +-running configure, to aid debugging if configure makes a mistake. +- +-It was created by GNU MP $as_me 6.0.0, which was +-generated by GNU Autoconf 2.69. Invocation command line was +- +- $ $0 $@ +- +-_ACEOF +-exec 5>>config.log +-{ +-cat <<_ASUNAME +-## --------- ## +-## Platform. ## +-## --------- ## +- +-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +-uname -m = `(uname -m) 2>/dev/null || echo unknown` +-uname -r = `(uname -r) 2>/dev/null || echo unknown` +-uname -s = `(uname -s) 2>/dev/null || echo unknown` +-uname -v = `(uname -v) 2>/dev/null || echo unknown` +- +-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` +- +-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +-/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` +- +-_ASUNAME +- +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- $as_echo "PATH: $as_dir" +- done +-IFS=$as_save_IFS +- +-} >&5 +- +-cat >&5 <<_ACEOF +- +- +-## ----------- ## +-## Core tests. ## +-## ----------- ## +- +-_ACEOF +- +- +-# Keep a trace of the command line. +-# Strip out --no-create and --no-recursion so they do not pile up. +-# Strip out --silent because we don't want to record it for future runs. +-# Also quote any args containing shell meta-characters. +-# Make two passes to allow for proper duplicate-argument suppression. +-ac_configure_args= +-ac_configure_args0= +-ac_configure_args1= +-ac_must_keep_next=false +-for ac_pass in 1 2 +-do +- for ac_arg +- do +- case $ac_arg in +- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; +- -q | -quiet | --quiet | --quie | --qui | --qu | --q \ +- | -silent | --silent | --silen | --sile | --sil) +- continue ;; +- *\'*) +- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; +- esac +- case $ac_pass in +- 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; +- 2) +- as_fn_append ac_configure_args1 " '$ac_arg'" +- if test $ac_must_keep_next = true; then +- ac_must_keep_next=false # Got value, back to normal. +- else +- case $ac_arg in +- *=* | --config-cache | -C | -disable-* | --disable-* \ +- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ +- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ +- | -with-* | --with-* | -without-* | --without-* | --x) +- case "$ac_configure_args0 " in +- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; +- esac +- ;; +- -* ) ac_must_keep_next=true ;; +- esac +- fi +- as_fn_append ac_configure_args " '$ac_arg'" +- ;; +- esac +- done +-done +-{ ac_configure_args0=; unset ac_configure_args0;} +-{ ac_configure_args1=; unset ac_configure_args1;} +- +-# When interrupted or exit'd, cleanup temporary files, and complete +-# config.log. We remove comments because anyway the quotes in there +-# would cause problems or look ugly. +-# WARNING: Use '\'' to represent an apostrophe within the trap. +-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +-trap 'exit_status=$? +- # Save into config.log some information that might help in debugging. +- { +- echo +- +- $as_echo "## ---------------- ## +-## Cache variables. ## +-## ---------------- ##" +- echo +- # The following way of writing the cache mishandles newlines in values, +-( +- for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do +- eval ac_val=\$$ac_var +- case $ac_val in #( +- *${as_nl}*) +- case $ac_var in #( +- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; +- esac +- case $ac_var in #( +- _ | IFS | as_nl) ;; #( +- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( +- *) { eval $ac_var=; unset $ac_var;} ;; +- esac ;; +- esac +- done +- (set) 2>&1 | +- case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( +- *${as_nl}ac_space=\ *) +- sed -n \ +- "s/'\''/'\''\\\\'\'''\''/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" +- ;; #( +- *) +- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" +- ;; +- esac | +- sort +-) +- echo +- +- $as_echo "## ----------------- ## +-## Output variables. ## +-## ----------------- ##" +- echo +- for ac_var in $ac_subst_vars +- do +- eval ac_val=\$$ac_var +- case $ac_val in +- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; +- esac +- $as_echo "$ac_var='\''$ac_val'\''" +- done | sort +- echo +- +- if test -n "$ac_subst_files"; then +- $as_echo "## ------------------- ## +-## File substitutions. ## +-## ------------------- ##" +- echo +- for ac_var in $ac_subst_files +- do +- eval ac_val=\$$ac_var +- case $ac_val in +- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; +- esac +- $as_echo "$ac_var='\''$ac_val'\''" +- done | sort +- echo +- fi +- +- if test -s confdefs.h; then +- $as_echo "## ----------- ## +-## confdefs.h. ## +-## ----------- ##" +- echo +- cat confdefs.h +- echo +- fi +- test "$ac_signal" != 0 && +- $as_echo "$as_me: caught signal $ac_signal" +- $as_echo "$as_me: exit $exit_status" +- } >&5 +- rm -f core *.core core.conftest.* && +- rm -f -r conftest* confdefs* conf$$* $ac_clean_files && +- exit $exit_status +-' 0 +-for ac_signal in 1 2 13 15; do +- trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +-done +-ac_signal=0 +- +-# confdefs.h avoids OS command line length limits that DEFS can exceed. +-rm -f -r conftest* confdefs.h +- +-$as_echo "/* confdefs.h */" > confdefs.h +- +-# Predefined preprocessor variables. +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_NAME "$PACKAGE_NAME" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_STRING "$PACKAGE_STRING" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_URL "$PACKAGE_URL" +-_ACEOF +- +- +-# Let the site file select an alternate cache file if it wants to. +-# Prefer an explicitly selected file to automatically selected ones. +-ac_site_file1=NONE +-ac_site_file2=NONE +-if test -n "$CONFIG_SITE"; then +- # We do not want a PATH search for config.site. +- case $CONFIG_SITE in @%:@(( +- -*) ac_site_file1=./$CONFIG_SITE;; +- */*) ac_site_file1=$CONFIG_SITE;; +- *) ac_site_file1=./$CONFIG_SITE;; +- esac +-elif test "x$prefix" != xNONE; then +- ac_site_file1=$prefix/share/config.site +- ac_site_file2=$prefix/etc/config.site +-else +- ac_site_file1=$ac_default_prefix/share/config.site +- ac_site_file2=$ac_default_prefix/etc/config.site +-fi +-for ac_site_file in "$ac_site_file1" "$ac_site_file2" +-do +- test "x$ac_site_file" = xNONE && continue +- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +-$as_echo "$as_me: loading site script $ac_site_file" >&6;} +- sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" \ +- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "failed to load site script $ac_site_file +-See \`config.log' for more details" "$LINENO" 5; } +- fi +-done +- +-if test -r "$cache_file"; then +- # Some versions of bash will fail to source /dev/null (special files +- # actually), so we avoid doing that. DJGPP emulates it as a regular file. +- if test /dev/null != "$cache_file" && test -f "$cache_file"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +-$as_echo "$as_me: loading cache $cache_file" >&6;} +- case $cache_file in +- [\\/]* | ?:[\\/]* ) . "$cache_file";; +- *) . "./$cache_file";; +- esac +- fi +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +-$as_echo "$as_me: creating cache $cache_file" >&6;} +- >$cache_file +-fi +- +-# Check that the precious variables saved in the cache have kept the same +-# value. +-ac_cache_corrupted=false +-for ac_var in $ac_precious_vars; do +- eval ac_old_set=\$ac_cv_env_${ac_var}_set +- eval ac_new_set=\$ac_env_${ac_var}_set +- eval ac_old_val=\$ac_cv_env_${ac_var}_value +- eval ac_new_val=\$ac_env_${ac_var}_value +- case $ac_old_set,$ac_new_set in +- set,) +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} +- ac_cache_corrupted=: ;; +- ,set) +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} +- ac_cache_corrupted=: ;; +- ,);; +- *) +- if test "x$ac_old_val" != "x$ac_new_val"; then +- # differences in whitespace do not lead to failure. +- ac_old_val_w=`echo x $ac_old_val` +- ac_new_val_w=`echo x $ac_new_val` +- if test "$ac_old_val_w" != "$ac_new_val_w"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} +- ac_cache_corrupted=: +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} +- eval $ac_var=\$ac_old_val +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} +- fi;; +- esac +- # Pass precious variables to config.status. +- if test "$ac_new_set" = set; then +- case $ac_new_val in +- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; +- *) ac_arg=$ac_var=$ac_new_val ;; +- esac +- case " $ac_configure_args " in +- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. +- *) as_fn_append ac_configure_args " '$ac_arg'" ;; +- esac +- fi +-done +-if $ac_cache_corrupted; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +-fi +-## -------------------- ## +-## Main body of script. ## +-## -------------------- ## +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- +- +- +- +- +- +- +- +- +- +-# If --target is not used then $target_alias is empty, but if say +-# "./configure athlon-pc-freebsd3.5" is used, then all three of +-# $build_alias, $host_alias and $target_alias are set to +-# "athlon-pc-freebsd3.5". +-# +-if test -n "$target_alias" && test "$target_alias" != "$host_alias"; then +- as_fn_error $? "--target is not appropriate for GMP +-Use --build=CPU-VENDOR-OS if you need to specify your CPU and/or system +-explicitly. Use --host if cross-compiling (see \"Installing GMP\" in the +-manual for more on this)." "$LINENO" 5 +-fi +- +-gmp_configm4="config.m4" +-gmp_tmpconfigm4=cnfm4.tmp +-gmp_tmpconfigm4i=cnfm4i.tmp +-gmp_tmpconfigm4p=cnfm4p.tmp +-rm -f $gmp_tmpconfigm4 $gmp_tmpconfigm4i $gmp_tmpconfigm4p +- +-# CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir. +-# The pattern here tests for an absolute path the same way as +-# _AC_OUTPUT_FILES in autoconf acgeneral.m4. +-case $srcdir in +-[\\/]* | ?:[\\/]* ) tmp="$srcdir" ;; +-*) tmp="../$srcdir" ;; +-esac +-echo "define(,<\`$tmp'>)" >>$gmp_tmpconfigm4 +- +-# All CPUs use asm-defs.m4 +-echo "include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')" >>$gmp_tmpconfigm4i +- +- +-ac_aux_dir= +-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +- if test -f "$ac_dir/install-sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install-sh -c" +- break +- elif test -f "$ac_dir/install.sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install.sh -c" +- break +- elif test -f "$ac_dir/shtool"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/shtool install -c" +- break +- fi +-done +-if test -z "$ac_aux_dir"; then +- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +-fi +- +-# These three variables are undocumented and unsupported, +-# and are intended to be withdrawn in a future Autoconf release. +-# They can cause serious problems if a builder's source tree is in a directory +-# whose full name contains unusual characters. +-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +- +- +-# Make sure we can run config.sub. +-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +-$as_echo_n "checking build system type... " >&6; } +-if ${ac_cv_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_build_alias=$build_alias +-test "x$ac_build_alias" = x && +- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +-test "x$ac_build_alias" = x && +- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +-$as_echo "$ac_cv_build" >&6; } +-case $ac_cv_build in +-*-*-*) ;; +-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +-esac +-build=$ac_cv_build +-ac_save_IFS=$IFS; IFS='-' +-set x $ac_cv_build +-shift +-build_cpu=$1 +-build_vendor=$2 +-shift; shift +-# Remember, the first character of IFS is used to create $*, +-# except with old shells: +-build_os=$* +-IFS=$ac_save_IFS +-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +-$as_echo_n "checking host system type... " >&6; } +-if ${ac_cv_host+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "x$host_alias" = x; then +- ac_cv_host=$ac_cv_build +-else +- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +-$as_echo "$ac_cv_host" >&6; } +-case $ac_cv_host in +-*-*-*) ;; +-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +-esac +-host=$ac_cv_host +-ac_save_IFS=$IFS; IFS='-' +-set x $ac_cv_host +-shift +-host_cpu=$1 +-host_vendor=$2 +-shift; shift +-# Remember, the first character of IFS is used to create $*, +-# except with old shells: +-host_os=$* +-IFS=$ac_save_IFS +-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac +- +- +- +-am__api_version='1.14' +- +-# Find a good install program. We prefer a C program (faster), +-# so one script is as good as another. But avoid the broken or +-# incompatible versions: +-# SysV /etc/install, /usr/sbin/install +-# SunOS /usr/etc/install +-# IRIX /sbin/install +-# AIX /bin/install +-# AmigaOS /C/install, which installs bootblocks on floppy discs +-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +-# AFS /usr/afsws/bin/install, which mishandles nonexistent args +-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +-# OS/2's system install, which has a completely different semantic +-# ./install, which can be erroneously created by make from ./install.sh. +-# Reject install programs that cannot install multiple files. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +-$as_echo_n "checking for a BSD-compatible install... " >&6; } +-if test -z "$INSTALL"; then +-if ${ac_cv_path_install+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- # Account for people who put trailing slashes in PATH elements. +-case $as_dir/ in @%:@(( +- ./ | .// | /[cC]/* | \ +- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ +- ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ +- /usr/ucb/* ) ;; +- *) +- # OSF1 and SCO ODT 3.0 have their own names for install. +- # Don't use installbsd from OSF since it installs stuff as root +- # by default. +- for ac_prog in ginstall scoinst install; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then +- if test $ac_prog = install && +- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # AIX install. It has an incompatible calling convention. +- : +- elif test $ac_prog = install && +- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # program-specific install script used by HP pwplus--don't use. +- : +- else +- rm -rf conftest.one conftest.two conftest.dir +- echo one > conftest.one +- echo two > conftest.two +- mkdir conftest.dir +- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && +- test -s conftest.one && test -s conftest.two && +- test -s conftest.dir/conftest.one && +- test -s conftest.dir/conftest.two +- then +- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" +- break 3 +- fi +- fi +- fi +- done +- done +- ;; +-esac +- +- done +-IFS=$as_save_IFS +- +-rm -rf conftest.one conftest.two conftest.dir +- +-fi +- if test "${ac_cv_path_install+set}" = set; then +- INSTALL=$ac_cv_path_install +- else +- # As a last resort, use the slow shell script. Don't cache a +- # value for INSTALL within a source directory, because that will +- # break other packages using the cache if that directory is +- # removed, or if the value is a relative name. +- INSTALL=$ac_install_sh +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +-$as_echo "$INSTALL" >&6; } +- +-# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +-# It thinks the first close brace ends the variable substitution. +-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +- +-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +- +-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +-$as_echo_n "checking whether build environment is sane... " >&6; } +-# Reject unsafe characters in $srcdir or the absolute working directory +-# name. Accept space and tab only in the latter. +-am_lf=' +-' +-case `pwd` in +- *[\\\"\#\$\&\'\`$am_lf]*) +- as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +-esac +-case $srcdir in +- *[\\\"\#\$\&\'\`$am_lf\ \ ]*) +- as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +-esac +- +-# Do 'set' in a subshell so we don't clobber the current shell's +-# arguments. Must try -L first in case configure is actually a +-# symlink; some systems play weird games with the mod time of symlinks +-# (eg FreeBSD returns the mod time of the symlink's containing +-# directory). +-if ( +- am_has_slept=no +- for am_try in 1 2; do +- echo "timestamp, slept: $am_has_slept" > conftest.file +- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` +- if test "$*" = "X"; then +- # -L didn't work. +- set X `ls -t "$srcdir/configure" conftest.file` +- fi +- if test "$*" != "X $srcdir/configure conftest.file" \ +- && test "$*" != "X conftest.file $srcdir/configure"; then +- +- # If neither matched, then we have a broken ls. This can happen +- # if, for instance, CONFIG_SHELL is bash and it inherits a +- # broken ls alias from the environment. This has actually +- # happened. Such a system could not be considered "sane". +- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +- alias in your environment" "$LINENO" 5 +- fi +- if test "$2" = conftest.file || test $am_try -eq 2; then +- break +- fi +- # Just in case. +- sleep 1 +- am_has_slept=yes +- done +- test "$2" = conftest.file +- ) +-then +- # Ok. +- : +-else +- as_fn_error $? "newly created file is older than distributed files! +-Check your system clock" "$LINENO" 5 +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-# If we didn't sleep, we still need to ensure time stamps of config.status and +-# generated files are strictly newer. +-am_sleep_pid= +-if grep 'slept: no' conftest.file >/dev/null 2>&1; then +- ( sleep 1 ) & +- am_sleep_pid=$! +-fi +- +-rm -f conftest.file +- +-test "$program_prefix" != NONE && +- program_transform_name="s&^&$program_prefix&;$program_transform_name" +-# Use a double $ so make ignores it. +-test "$program_suffix" != NONE && +- program_transform_name="s&\$&$program_suffix&;$program_transform_name" +-# Double any \ or $. +-# By default was `s,x,x', remove it if useless. +-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` +- +-# expand $ac_aux_dir to an absolute path +-am_aux_dir=`cd $ac_aux_dir && pwd` +- +-if test x"${MISSING+set}" != xset; then +- case $am_aux_dir in +- *\ * | *\ *) +- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; +- *) +- MISSING="\${SHELL} $am_aux_dir/missing" ;; +- esac +-fi +-# Use eval to expand $SHELL +-if eval "$MISSING --is-lightweight"; then +- am_missing_run="$MISSING " +-else +- am_missing_run= +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +-$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +-fi +- +-if test x"${install_sh}" != xset; then +- case $am_aux_dir in +- *\ * | *\ *) +- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; +- *) +- install_sh="\${SHELL} $am_aux_dir/install-sh" +- esac +-fi +- +-# Installed binaries are usually stripped using 'strip' when the user +-# run "make install-strip". However 'strip' might not be the right +-# tool to use in cross-compilation environments, therefore Automake +-# will honor the 'STRIP' environment variable to overrule this program. +-if test "$cross_compiling" != no; then +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +-set dummy ${ac_tool_prefix}strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$STRIP"; then +- ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_STRIP="${ac_tool_prefix}strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-STRIP=$ac_cv_prog_STRIP +-if test -n "$STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +-$as_echo "$STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_STRIP"; then +- ac_ct_STRIP=$STRIP +- # Extract the first word of "strip", so it can be a program name with args. +-set dummy strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_STRIP"; then +- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_STRIP="strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +-if test -n "$ac_ct_STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +-$as_echo "$ac_ct_STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_STRIP" = x; then +- STRIP=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- STRIP=$ac_ct_STRIP +- fi +-else +- STRIP="$ac_cv_prog_STRIP" +-fi +- +-fi +-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +-if test -z "$MKDIR_P"; then +- if ${ac_cv_path_mkdir+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in mkdir gmkdir; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue +- case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( +- 'mkdir (GNU coreutils) '* | \ +- 'mkdir (coreutils) '* | \ +- 'mkdir (fileutils) '4.1*) +- ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext +- break 3;; +- esac +- done +- done +- done +-IFS=$as_save_IFS +- +-fi +- +- test -d ./--version && rmdir ./--version +- if test "${ac_cv_path_mkdir+set}" = set; then +- MKDIR_P="$ac_cv_path_mkdir -p" +- else +- # As a last resort, use the slow shell script. Don't cache a +- # value for MKDIR_P within a source directory, because that will +- # break other packages using the cache if that directory is +- # removed, or if the value is a relative name. +- MKDIR_P="$ac_install_sh -d" +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +-$as_echo "$MKDIR_P" >&6; } +- +-for ac_prog in gawk mawk nawk awk +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AWK+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AWK"; then +- ac_cv_prog_AWK="$AWK" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AWK="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AWK=$ac_cv_prog_AWK +-if test -n "$AWK"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +-$as_echo "$AWK" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$AWK" && break +-done +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +-set x ${MAKE-make} +-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.make <<\_ACEOF +-SHELL = /bin/sh +-all: +- @echo '@@@%%%=$(MAKE)=@@@%%%' +-_ACEOF +-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +-case `${MAKE-make} -f conftest.make 2>/dev/null` in +- *@@@%%%=?*=@@@%%%*) +- eval ac_cv_prog_make_${ac_make}_set=yes;; +- *) +- eval ac_cv_prog_make_${ac_make}_set=no;; +-esac +-rm -f conftest.make +-fi +-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- SET_MAKE= +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- SET_MAKE="MAKE=${MAKE-make}" +-fi +- +-rm -rf .tst 2>/dev/null +-mkdir .tst 2>/dev/null +-if test -d .tst; then +- am__leading_dot=. +-else +- am__leading_dot=_ +-fi +-rmdir .tst 2>/dev/null +- +-@%:@ Check whether --enable-silent-rules was given. +-if test "${enable_silent_rules+set}" = set; then : +- enableval=$enable_silent_rules; +-fi +- +-case $enable_silent_rules in @%:@ ((( +- yes) AM_DEFAULT_VERBOSITY=0;; +- no) AM_DEFAULT_VERBOSITY=1;; +- *) AM_DEFAULT_VERBOSITY=1;; +-esac +-am_make=${MAKE-make} +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +-$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +-if ${am_cv_make_support_nested_variables+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if $as_echo 'TRUE=$(BAR$(V)) +-BAR0=false +-BAR1=true +-V=1 +-am__doit: +- @$(TRUE) +-.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then +- am_cv_make_support_nested_variables=yes +-else +- am_cv_make_support_nested_variables=no +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +-$as_echo "$am_cv_make_support_nested_variables" >&6; } +-if test $am_cv_make_support_nested_variables = yes; then +- AM_V='$(V)' +- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +-else +- AM_V=$AM_DEFAULT_VERBOSITY +- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +-fi +-AM_BACKSLASH='\' +- +-if test "`cd $srcdir && pwd`" != "`pwd`"; then +- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output +- # is not polluted with repeated "-I." +- am__isrc=' -I$(srcdir)' +- # test to see if srcdir already configured +- if test -f $srcdir/config.status; then +- as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +- fi +-fi +- +-# test whether we have cygpath +-if test -z "$CYGPATH_W"; then +- if (cygpath --version) >/dev/null 2>/dev/null; then +- CYGPATH_W='cygpath -w' +- else +- CYGPATH_W=echo +- fi +-fi +- +- +-# Define the identity of the package. +- PACKAGE='gmp' +- VERSION='6.0.0' +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE "$PACKAGE" +-_ACEOF +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define VERSION "$VERSION" +-_ACEOF +- +-# Some tools Automake needs. +- +-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} +- +- +-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} +- +- +-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} +- +- +-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} +- +- +-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} +- +-# For better backward compatibility. To be removed once Automake 1.9.x +-# dies out for good. For more background, see: +-# +-# +-mkdir_p='$(MKDIR_P)' +- +-# We need awk for the "check" target. The system "awk" is bad on +-# some platforms. +-# Always define AMTAR for backward compatibility. Yes, it's still used +-# in the wild :-( We should find a proper way to deprecate it ... +-AMTAR='$${TAR-tar}' +- +- +-# We'll loop over all known methods to create a tar archive until one works. +-_am_tools='gnutar pax cpio none' +- +-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +- +- +- +- +- +- +-# POSIX will say in a future version that running "rm -f" with no argument +-# is OK; and we want to be able to make that assumption in our Makefile +-# recipes. So use an aggressive probe to check that the usage we want is +-# actually supported "in the wild" to an acceptable degree. +-# See automake bug#10828. +-# To make any issue more visible, cause the running configure to be aborted +-# by default if the 'rm' program in use doesn't match our expectations; the +-# user can still override this though. +-if rm -f && rm -fr && rm -rf; then : OK; else +- cat >&2 <<'END' +-Oops! +- +-Your 'rm' program seems unable to run without file operands specified +-on the command line, even when the '-f' option is present. This is contrary +-to the behaviour of most rm programs out there, and not conforming with +-the upcoming POSIX standard: +- +-Please tell bug-automake@gnu.org about your system, including the value +-of your $PATH and any error possibly output before this message. This +-can help us improve future automake versions. +- +-END +- if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then +- echo 'Configuration will proceed anyway, since you have set the' >&2 +- echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 +- echo >&2 +- else +- cat >&2 <<'END' +-Aborting the configuration process, to ensure you take notice of the issue. +- +-You can download and install GNU coreutils to get an 'rm' implementation +-that behaves properly: . +- +-If you want to complete the configuration process using your problematic +-'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +-to "yes", and re-run configure. +- +-END +- as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 +- fi +-fi +- +-ac_config_headers="$ac_config_headers config.h:config.in" +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } +- @%:@ Check whether --enable-maintainer-mode was given. +-if test "${enable_maintainer_mode+set}" = set; then : +- enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +-else +- USE_MAINTAINER_MODE=no +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +-$as_echo "$USE_MAINTAINER_MODE" >&6; } +- if test $USE_MAINTAINER_MODE = yes; then +- MAINTAINER_MODE_TRUE= +- MAINTAINER_MODE_FALSE='#' +-else +- MAINTAINER_MODE_TRUE='#' +- MAINTAINER_MODE_FALSE= +-fi +- +- MAINT=$MAINTAINER_MODE_TRUE +- +- +- +- +-@%:@ Check whether --enable-assert was given. +-if test "${enable_assert+set}" = set; then : +- enableval=$enable_assert; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-assert, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_assert=no +-fi +- +- +-if test "$enable_assert" = "yes"; then +- +-$as_echo "@%:@define WANT_ASSERT 1" >>confdefs.h +- +- want_assert_01=1 +-else +- want_assert_01=0 +-fi +- +-echo "define(,$want_assert_01)" >> $gmp_tmpconfigm4 +- +- +- +-@%:@ Check whether --enable-alloca was given. +-if test "${enable_alloca+set}" = set; then : +- enableval=$enable_alloca; case $enableval in +-alloca|malloc-reentrant|malloc-notreentrant) ;; +-yes|no|reentrant|notreentrant) ;; +-debug) ;; +-*) +- as_fn_error $? "bad value $enableval for --enable-alloca, need one of: +-yes no reentrant notreentrant alloca malloc-reentrant malloc-notreentrant debug" "$LINENO" 5 ;; +-esac +-else +- enable_alloca=reentrant +-fi +- +- +- +-# IMPROVE ME: The default for C++ is disabled. The tests currently +-# performed below for a working C++ compiler are not particularly strong, +-# and in general can't be expected to get the right setup on their own. The +-# most significant problem is getting the ABI the same. Defaulting CXXFLAGS +-# to CFLAGS takes only a small step towards this. It's also probably worth +-# worrying whether the C and C++ runtimes from say gcc and a vendor C++ can +-# work together. Some rather broken C++ installations were encountered +-# during testing, and though such things clearly aren't GMP's problem, if +-# --enable-cxx=detect were to be the default then some careful checks of +-# which, if any, C++ compiler on the system is up to scratch would be +-# wanted. +-# +-@%:@ Check whether --enable-cxx was given. +-if test "${enable_cxx+set}" = set; then : +- enableval=$enable_cxx; case $enableval in +-yes|no|detect) ;; +-*) as_fn_error $? "bad value $enableval for --enable-cxx, need yes/no/detect" "$LINENO" 5 ;; +-esac +-else +- enable_cxx=no +-fi +- +- +- +-@%:@ Check whether --enable-assembly was given. +-if test "${enable_assembly+set}" = set; then : +- enableval=$enable_assembly; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-assembly, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_assembly=yes +-fi +- +- +-if test "$enable_assembly" = "yes"; then +- +-$as_echo "@%:@define WANT_ASSEMBLY 1" >>confdefs.h +- +-fi +- +- +-@%:@ Check whether --enable-fft was given. +-if test "${enable_fft+set}" = set; then : +- enableval=$enable_fft; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-fft, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_fft=yes +-fi +- +- +-if test "$enable_fft" = "yes"; then +- +-$as_echo "@%:@define WANT_FFT 1" >>confdefs.h +- +-fi +- +- +-@%:@ Check whether --enable-old-fft-full was given. +-if test "${enable_old_fft_full+set}" = set; then : +- enableval=$enable_old_fft_full; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-old-fft-full, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_old_fft_full=no +-fi +- +- +-if test "$enable_old_fft_full" = "yes"; then +- +-$as_echo "@%:@define WANT_OLD_FFT_FULL 1" >>confdefs.h +- +-fi +- +- +-@%:@ Check whether --enable-nails was given. +-if test "${enable_nails+set}" = set; then : +- enableval=$enable_nails; case $enableval in +-yes|no|[02468]|[0-9][02468]) ;; +-*[13579]) +- as_fn_error $? "bad value $enableval for --enable-nails, only even nail sizes supported" "$LINENO" 5 ;; +-*) +- as_fn_error $? "bad value $enableval for --enable-nails, need yes/no/number" "$LINENO" 5 ;; +-esac +-else +- enable_nails=no +-fi +- +- +-case $enable_nails in +-yes) GMP_NAIL_BITS=2 ;; +-no) GMP_NAIL_BITS=0 ;; +-*) GMP_NAIL_BITS=$enable_nails ;; +-esac +- +- +- +-@%:@ Check whether --enable-profiling was given. +-if test "${enable_profiling+set}" = set; then : +- enableval=$enable_profiling; case $enableval in +-no|prof|gprof|instrument) ;; +-*) as_fn_error $? "bad value $enableval for --enable-profiling, need no/prof/gprof/instrument" "$LINENO" 5 ;; +-esac +-else +- enable_profiling=no +-fi +- +- +-case $enable_profiling in +- prof) +- +-$as_echo "@%:@define WANT_PROFILING_PROF 1" >>confdefs.h +- +- ;; +- gprof) +- +-$as_echo "@%:@define WANT_PROFILING_GPROF 1" >>confdefs.h +- +- ;; +- instrument) +- +-$as_echo "@%:@define WANT_PROFILING_INSTRUMENT 1" >>confdefs.h +- +- ;; +-esac +- +- +-echo "define(,<\`$enable_profiling'>)" >> $gmp_tmpconfigm4 +- +- +-# -fomit-frame-pointer is incompatible with -pg on some chips +-if test "$enable_profiling" = gprof; then +- fomit_frame_pointer= +-else +- fomit_frame_pointer="-fomit-frame-pointer" +-fi +- +- +- +-@%:@ Check whether --with-readline was given. +-if test "${with_readline+set}" = set; then : +- withval=$with_readline; case $withval in +-yes|no|detect) ;; +-*) as_fn_error $? "bad value $withval for --with-readline, need yes/no/detect" "$LINENO" 5 ;; +-esac +-else +- with_readline=detect +-fi +- +- +- +-@%:@ Check whether --enable-fat was given. +-if test "${enable_fat+set}" = set; then : +- enableval=$enable_fat; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-fat, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_fat=no +-fi +- +- +- +-@%:@ Check whether --enable-minithres was given. +-if test "${enable_minithres+set}" = set; then : +- enableval=$enable_minithres; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-minithres, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_minithres=no +-fi +- +- +- +-@%:@ Check whether --enable-fake-cpuid was given. +-if test "${enable_fake_cpuid+set}" = set; then : +- enableval=$enable_fake_cpuid; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-fake-cpuid, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_fake_cpuid=no +-fi +- +- +-if test "$enable_fake_cpuid" = "yes"; then +- +-$as_echo "@%:@define WANT_FAKE_CPUID 1" >>confdefs.h +- +-fi +- +- +-if test $enable_fat = yes && test $enable_assembly = no ; then +- as_fn_error $? "when doing a fat build, disabling assembly will not work" "$LINENO" 5 +-fi +- +-if test $enable_fake_cpuid = yes && test $enable_fat = no ; then +- as_fn_error $? "--enable-fake-cpuid requires --enable-fat" "$LINENO" 5 +-fi +- +- +-tmp_host=`echo $host_cpu | sed 's/\./_/'` +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_$tmp_host 1 +-_ACEOF +- +- +-echo "define_not_for_expansion(\`HAVE_HOST_CPU_$tmp_host')" >> $gmp_tmpconfigm4p +- +- +- +- +- +- +-# Table of compilers, options, and mpn paths. This code has various related +-# purposes +-# +-# - better default CC/CFLAGS selections than autoconf otherwise gives +-# - default CC/CFLAGS selections for extra CPU types specific to GMP +-# - a few tests for known bad compilers +-# - choice of ABIs on suitable systems +-# - selection of corresponding mpn search path +-# +-# After GMP specific searches and tests, the standard autoconf AC_PROG_CC is +-# called. User selections of CC etc are respected. +-# +-# Care is taken not to use macros like AC_TRY_COMPILE during the GMP +-# pre-testing, since they of course depend on AC_PROG_CC, and also some of +-# them cache their results, which is not wanted. +-# +-# The ABI selection mechanism is unique to GMP. All that reaches autoconf +-# is a different selection of CC/CFLAGS according to the best ABI the system +-# supports, and/or what the user selects. Naturally the mpn assembler code +-# selected is very dependent on the ABI. +-# +-# The closest the standard tools come to a notion of ABI is something like +-# "sparc64" which encodes a CPU and an ABI together. This doesn't seem to +-# scale well for GMP, where exact CPU types like "ultrasparc2" are wanted, +-# separate from the ABI used on them. +-# +-# +-# The variables set here are +-# +-# cclist the compiler choices +-# xx_cflags flags for compiler xx +-# xx_cflags_maybe flags for compiler xx, if they work +-# xx_cppflags cpp flags for compiler xx +-# xx_cflags_optlist list of sets of optional flags +-# xx_cflags_yyy set yyy of optional flags for compiler xx +-# xx_ldflags -Wc,-foo flags for libtool linking with compiler xx +-# ar_flags extra flags for $AR +-# nm_flags extra flags for $NM +-# limb limb size, can be "longlong" +-# path mpn search path +-# extra_functions extra mpn functions +-# fat_path fat binary mpn search path [if fat binary desired] +-# fat_functions fat functions +-# fat_thresholds fat thresholds +-# +-# Suppose xx_cflags_optlist="arch", then flags from $xx_cflags_arch are +-# tried, and the first flag that works will be used. An optlist like "arch +-# cpu optimize" can be used to get multiple independent sets of flags tried. +-# The first that works from each will be used. If no flag in a set works +-# then nothing from that set is added. +-# +-# For multiple ABIs, the scheme extends as follows. +-# +-# abilist set of ABI choices +-# cclist_aa compiler choices in ABI aa +-# xx_aa_cflags flags for xx in ABI aa +-# xx_aa_cflags_maybe flags for xx in ABI aa, if they work +-# xx_aa_cppflags cpp flags for xx in ABI aa +-# xx_aa_cflags_optlist list of sets of optional flags in ABI aa +-# xx_aa_cflags_yyy set yyy of optional flags for compiler xx in ABI aa +-# xx_aa_ldflags -Wc,-foo flags for libtool linking +-# ar_aa_flags extra flags for $AR in ABI aa +-# nm_aa_flags extra flags for $NM in ABI aa +-# limb_aa limb size in ABI aa, can be "longlong" +-# path_aa mpn search path in ABI aa +-# extra_functions_aa extra mpn functions in ABI aa +-# +-# As a convenience, the unadorned xx_cflags (etc) are used for the last ABI +-# in ablist, if an xx_aa_cflags for that ABI isn't given. For example if +-# abilist="64 32" then $cc_64_cflags will be used for the 64-bit ABI, but +-# for the 32-bit either $cc_32_cflags or $cc_cflags is used, whichever is +-# defined. This makes it easy to add some 64-bit compilers and flags to an +-# unadorned 32-bit set. +-# +-# limb=longlong (or limb_aa=longlong) applies to all compilers within that +-# ABI. It won't work to have some needing long long and some not, since a +-# single instantiated gmp.h will be used by both. +-# +-# SPEED_CYCLECOUNTER, cyclecounter_size and CALLING_CONVENTIONS_OBJS are +-# also set here, with an ABI suffix. +-# +-# +-# +-# A table-driven approach like this to mapping cpu type to good compiler +-# options is a bit of a maintenance burden, but there's not much uniformity +-# between options specifications on different compilers. Some sort of +-# separately updatable tool might be cute. +-# +-# The use of lots of variables like this, direct and indirect, tends to +-# obscure when and how various things are done, but unfortunately it's +-# pretty much the only way. If shell subroutines were portable then actual +-# code like "if this .. do that" could be written, but attempting the same +-# with full copies of GMP_PROG_CC_WORKS etc expanded at every point would +-# hugely bloat the output. +- +- +- +- +-# abilist needs to be non-empty, "standard" is just a generic name here +-abilist="standard" +- +-# FIXME: We'd like to prefer an ANSI compiler, perhaps by preferring +-# c89 over cc here. But note that on HP-UX c89 provides a castrated +-# environment, and would want to be excluded somehow. Maybe +-# AC_PROG_CC_STDC already does enough to stick cc into ANSI mode and +-# we don't need to worry. +-# +-cclist="gcc cc" +- +-gcc_cflags="-O2 -pedantic" +-gcc_64_cflags="-O2 -pedantic" +-cc_cflags="-O" +-cc_64_cflags="-O" +- +-SPEED_CYCLECOUNTER_OBJ= +-cyclecounter_size=2 +- +-HAVE_HOST_CPU_FAMILY_power=0 +- +-HAVE_HOST_CPU_FAMILY_powerpc=0 +- +- +-case $host in +- +- alpha*-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_alpha 1" >>confdefs.h +- +- case $host_cpu in +- alphaev5* | alphapca5*) +- path="alpha/ev5 alpha" ;; +- alphaev67 | alphaev68 | alphaev7*) +- path="alpha/ev67 alpha/ev6 alpha" ;; +- alphaev6) +- path="alpha/ev6 alpha" ;; +- *) +- path="alpha" ;; +- esac +- if test "$enable_assembly" = "yes" ; then +- extra_functions="cntlz" +- fi +- gcc_cflags_optlist="asm cpu oldas" # need asm ahead of cpu, see below +- gcc_cflags_maybe="-mieee" +- gcc_cflags_oldas="-Wa,-oldas" # see GMP_GCC_WA_OLDAS. +- +- # gcc 2.7.2.3 doesn't know any -mcpu= for alpha, apparently. +- # gcc 2.95 knows -mcpu= ev4, ev5, ev56, pca56, ev6. +- # gcc 3.0 adds nothing. +- # gcc 3.1 adds ev45, ev67 (but ev45 is the same as ev4). +- # gcc 3.2 adds nothing. +- # +- # gcc version "2.9-gnupro-99r1" under "-O2 -mcpu=ev6" strikes internal +- # compiler errors too easily and is rejected by GMP_PROG_CC_WORKS. Each +- # -mcpu=ev6 below has a fallback to -mcpu=ev56 for this reason. +- # +- case $host_cpu in +- alpha) gcc_cflags_cpu="-mcpu=ev4" ;; +- alphaev5) gcc_cflags_cpu="-mcpu=ev5" ;; +- alphaev56) gcc_cflags_cpu="-mcpu=ev56" ;; +- alphapca56 | alphapca57) +- gcc_cflags_cpu="-mcpu=pca56" ;; +- alphaev6) gcc_cflags_cpu="-mcpu=ev6 -mcpu=ev56" ;; +- alphaev67 | alphaev68 | alphaev7*) +- gcc_cflags_cpu="-mcpu=ev67 -mcpu=ev6 -mcpu=ev56" ;; +- esac +- +- # gcc version "2.9-gnupro-99r1" on alphaev68-dec-osf5.1 has been seen +- # accepting -mcpu=ev6, but not putting the assembler in the right mode +- # for what it produces. We need to do this for it, and need to do it +- # before testing the -mcpu options. +- # +- # On old versions of gcc, which don't know -mcpu=, we believe an +- # explicit -Wa,-mev5 etc will be necessary to put the assembler in +- # the right mode for our .asm files and longlong.h asm blocks. +- # +- # On newer versions of gcc, when -mcpu= is known, we must give a -Wa +- # which is at least as high as the code gcc will generate. gcc +- # establishes what it needs with a ".arch" directive, our command line +- # option seems to override that. +- # +- # gas prior to 2.14 doesn't accept -mev67, but -mev6 seems enough for +- # ctlz and cttz (in 2.10.0 at least). +- # +- # OSF `as' accepts ev68 but stupidly treats it as ev4. -arch only seems +- # to affect insns like ldbu which are expanded as macros when necessary. +- # Insns like ctlz which were never available as macros are always +- # accepted and always generate their plain code. +- # +- case $host_cpu in +- alpha) gcc_cflags_asm="-Wa,-arch,ev4 -Wa,-mev4" ;; +- alphaev5) gcc_cflags_asm="-Wa,-arch,ev5 -Wa,-mev5" ;; +- alphaev56) gcc_cflags_asm="-Wa,-arch,ev56 -Wa,-mev56" ;; +- alphapca56 | alphapca57) +- gcc_cflags_asm="-Wa,-arch,pca56 -Wa,-mpca56" ;; +- alphaev6) gcc_cflags_asm="-Wa,-arch,ev6 -Wa,-mev6" ;; +- alphaev67 | alphaev68 | alphaev7*) +- gcc_cflags_asm="-Wa,-arch,ev67 -Wa,-mev67 -Wa,-arch,ev6 -Wa,-mev6" ;; +- esac +- +- # It might be better to ask "cc" whether it's Cray C or DEC C, +- # instead of relying on the OS part of $host. But it's hard to +- # imagine either of those compilers anywhere except their native +- # systems. +- # +- +-echo "include_mpn(\`alpha/alpha-defs.m4')" >> $gmp_tmpconfigm4i +- +- case $host in +- *-cray-unicos*) +- cc_cflags="-O" # no -g, it silently disables all optimizations +- +-echo "include_mpn(\`alpha/unicos.m4')" >> $gmp_tmpconfigm4i +- +- # Don't perform any assembly syntax tests on this beast. +- gmp_asm_syntax_testing=no +- ;; +- *-*-osf*) +- +-echo "include_mpn(\`alpha/default.m4')" >> $gmp_tmpconfigm4i +- +- cc_cflags="" +- cc_cflags_optlist="opt cpu" +- +- # not sure if -fast works on old versions, so make it optional +- cc_cflags_opt="-fast -O2" +- +- # DEC C V5.9-005 knows ev4, ev5, ev56, pca56, ev6. +- # Compaq C V6.3-029 adds ev67. +- # +- case $host_cpu in +- alpha) cc_cflags_cpu="-arch~ev4~-tune~ev4" ;; +- alphaev5) cc_cflags_cpu="-arch~ev5~-tune~ev5" ;; +- alphaev56) cc_cflags_cpu="-arch~ev56~-tune~ev56" ;; +- alphapca56 | alphapca57) +- cc_cflags_cpu="-arch~pca56~-tune~pca56" ;; +- alphaev6) cc_cflags_cpu="-arch~ev6~-tune~ev6" ;; +- alphaev67 | alphaev68 | alphaev7*) +- cc_cflags_cpu="-arch~ev67~-tune~ev67 -arch~ev6~-tune~ev6" ;; +- esac +- ;; +- *) +- +-echo "include_mpn(\`alpha/default.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- esac +- +- case $host in +- *-*-unicos*) +- # tune/alpha.asm assumes int==4bytes but unicos uses int==8bytes +- ;; +- *) +- SPEED_CYCLECOUNTER_OBJ=alpha.lo +- cyclecounter_size=1 ;; +- esac +- ;; +- +- +- # Cray vector machines. +- # This must come after alpha* so that we can recognize present and future +- # vector processors with a wildcard. +- *-cray-unicos*) +- gmp_asm_syntax_testing=no +- cclist="cc" +- # We used to have -hscalar0 here as a workaround for miscompilation of +- # mpz/import.c, but let's hope Cray fixes their bugs instead, since +- # -hscalar0 causes disastrously poor code to be generated. +- cc_cflags="-O3 -hnofastmd -htask0 -Wa,-B" +- path="cray" +- ;; +- +- +- arm64*-*-* | aarch64*-*-*) +- path="arm64" +- ;; +- +- +- arm*-*-*) +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_cflags_optlist="arch neon tune" +- gcc_cflags_maybe="-marm" +- gcc_testlist="gcc-arm-umodsi" +- +-echo "include_mpn(\`arm/arm-defs.m4')" >> $gmp_tmpconfigm4i +- +- CALLING_CONVENTIONS_OBJS='arm32call.lo arm32check.lo' +- +- # FIXME: We make mandatory compiler options optional here. We should +- # either enforce them, or organise to strip paths as the corresponding +- # options fail. +- case $host_cpu in +- armsa1 | arm9tdmi | armv4*) +- path="arm" +- gcc_cflags_arch="-march=armv4" +- ;; +- armxscale | arm9te | arm10 | armv5*) +- path="arm/v5 arm" +- gcc_cflags_arch="-march=armv5" +- ;; +- arm11mpcore | arm1136 | arm1176 | armv6*) +- path="arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv6" +- ;; +- arm1156) +- path="arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv6t2" +- ;; +- armcortexa5 | armv7a*) +- path="arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- ;; +- armcortexa8) +- path="arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_tune="-mtune=cortex-a8" +- ;; +- armcortexa8neon) +- path="arm/v6t2 arm/v6 arm/v5 arm/neon arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_neon="-mfpu=neon" +- gcc_cflags_tune="-mtune=cortex-a8" +- ;; +- armcortexa9) +- path="arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_tune="-mtune=cortex-a9" +- ;; +- armcortexa9neon) +- path="arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm/neon arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_neon="-mfpu=neon" +- gcc_cflags_tune="-mtune=cortex-a9" +- ;; +- armcortexa15) +- path="arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_tune="-mtune=cortex-a15 -mtune=cortex-a9" +- ;; +- armcortexa15neon) +- path="arm/v7a/cora15/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm/neon arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_neon="-mfpu=neon" +- gcc_cflags_tune="-mtune=cortex-a15 -mtune=cortex-a9" +- ;; +- *) +- path="arm" +- ;; +- esac +- ;; +- +- +- # Fujitsu +- f30[01]-fujitsu-sysv*) +- cclist="gcc vcc" +- # FIXME: flags for vcc? +- vcc_cflags="-g" +- path="fujitsu" +- ;; +- +- +- hppa*-*-*) +- # HP cc (the one sold separately) is K&R by default, but AM_C_PROTOTYPES +- # will add "-Ae", or "-Aa -D_HPUX_SOURCE", to put it into ansi mode, if +- # possible. +- # +- # gcc for hppa 2.0 can be built either for 2.0n (32-bit) or 2.0w +- # (64-bit), but not both, so there's no option to choose the desired +- # mode, we must instead detect which of the two it is. This is done by +- # checking sizeof(long), either 4 or 8 bytes respectively. Do this in +- # ABI=1.0 too, in case someone tries to build that with a 2.0w gcc. +- # +- gcc_cflags_optlist="arch" +- gcc_testlist="sizeof-long-4" +- SPEED_CYCLECOUNTER_OBJ=hppa.lo +- cyclecounter_size=1 +- +- # FIXME: For hppa2.0*, path should be "pa32/hppa2_0 pa32/hppa1_1 pa32". +- # (Can't remember why this isn't done already, have to check what .asm +- # files are available in each and how they run on a typical 2.0 cpu.) +- # +- case $host_cpu in +- hppa1.0*) path="pa32" ;; +- hppa7000*) path="pa32/hppa1_1 pa32" ;; +- hppa2.0* | hppa64) +- path="pa32/hppa2_0 pa32/hppa1_1/pa7100 pa32/hppa1_1 pa32" ;; +- *) # default to 7100 +- path="pa32/hppa1_1/pa7100 pa32/hppa1_1 pa32" ;; +- esac +- +- # gcc 2.7.2.3 knows -mpa-risc-1-0 and -mpa-risc-1-1 +- # gcc 2.95 adds -mpa-risc-2-0, plus synonyms -march=1.0, 1.1 and 2.0 +- # +- # We don't use -mpa-risc-2-0 in ABI=1.0 because 64-bit registers may not +- # be saved by the kernel on an old system. Actually gcc (as of 3.2) +- # only adds a few float instructions with -mpa-risc-2-0, so it would +- # probably be safe, but let's not take the chance. In any case, a +- # configuration like --host=hppa2.0 ABI=1.0 is far from optimal. +- # +- case $host_cpu in +- hppa1.0*) gcc_cflags_arch="-mpa-risc-1-0" ;; +- *) # default to 7100 +- gcc_cflags_arch="-mpa-risc-1-1" ;; +- esac +- +- case $host_cpu in +- hppa1.0*) cc_cflags="+O2" ;; +- *) # default to 7100 +- cc_cflags="+DA1.1 +O2" ;; +- esac +- +- case $host in +- hppa2.0*-*-* | hppa64-*-*) +- cclist_20n="gcc cc" +- abilist="2.0n 1.0" +- path_20n="pa64" +- limb_20n=longlong +- any_20n_testlist="sizeof-long-4" +- SPEED_CYCLECOUNTER_OBJ_20n=hppa2.lo +- cyclecounter_size_20n=2 +- +- # -mpa-risc-2-0 is only an optional flag, in case an old gcc is +- # used. Assembler support for 2.0 is essential though, for our asm +- # files. +- gcc_20n_cflags="$gcc_cflags" +- gcc_20n_cflags_optlist="arch" +- gcc_20n_cflags_arch="-mpa-risc-2-0 -mpa-risc-1-1" +- gcc_20n_testlist="sizeof-long-4 hppa-level-2.0" +- +- cc_20n_cflags="+DA2.0 +e +O2 -Wl,+vnocompatwarnings" +- cc_20n_testlist="hpc-hppa-2-0" +- +- # ABI=2.0w is available for hppa2.0w and hppa2.0, but not for +- # hppa2.0n, on the assumption that that the latter indicates a +- # desire for ABI=2.0n. +- case $host in +- hppa2.0n-*-*) ;; +- *) +- # HPUX 10 and earlier cannot run 2.0w. Not sure about other +- # systems (GNU/Linux for instance), but lets assume they're ok. +- case $host in +- *-*-hpux[1-9] | *-*-hpux[1-9].* | *-*-hpux10 | *-*-hpux10.*) ;; +- *-*-linux*) abilist="1.0" ;; # due to linux permanent kernel bug +- *) abilist="2.0w $abilist" ;; +- esac +- +- cclist_20w="gcc cc" +- gcc_20w_cflags="$gcc_cflags -mpa-risc-2-0" +- cc_20w_cflags="+DD64 +O2" +- cc_20w_testlist="hpc-hppa-2-0" +- path_20w="pa64" +- any_20w_testlist="sizeof-long-8" +- SPEED_CYCLECOUNTER_OBJ_20w=hppa2w.lo +- cyclecounter_size_20w=2 +- ;; +- esac +- ;; +- esac +- ;; +- +- +- ia64*-*-* | itanium-*-* | itanium2-*-*) +- abilist="64" +- +-echo "include_mpn(\`ia64/ia64-defs.m4')" >> $gmp_tmpconfigm4i +- +- SPEED_CYCLECOUNTER_OBJ=ia64.lo +- any_32_testlist="sizeof-long-4" +- +- case $host_cpu in +- itanium) path="ia64/itanium ia64" ;; +- itanium2) path="ia64/itanium2 ia64" ;; +- *) path="ia64" ;; +- esac +- +- gcc_64_cflags_optlist="tune" +- gcc_32_cflags_optlist=$gcc_64_cflags_optlist +- +- # gcc pre-release 3.4 adds -mtune itanium and itanium2 +- case $host_cpu in +- itanium) gcc_cflags_tune="-mtune=itanium" ;; +- itanium2) gcc_cflags_tune="-mtune=itanium2" ;; +- esac +- +- case $host in +- *-*-linux*) +- cclist="gcc icc" +- icc_cflags="-no-gcc" +- icc_cflags_optlist="opt" +- # Don't use -O3, it is for "large data sets" and also miscompiles GMP. +- # But icc miscompiles GMP at any optimization level, at higher levels +- # it miscompiles more files... +- icc_cflags_opt="-O2 -O1" +- ;; +- +- *-*-hpux*) +- # HP cc sometimes gets internal errors if the optimization level is +- # too high. GMP_PROG_CC_WORKS detects this, the "_opt" fallbacks +- # let us use whatever seems to work. +- # +- abilist="32 64" +- any_64_testlist="sizeof-long-8" +- +- cclist_32="gcc cc" +- path_32="ia64" +- cc_32_cflags="" +- cc_32_cflags_optlist="opt" +- cc_32_cflags_opt="+O3 +O2 +O1" +- gcc_32_cflags="$gcc_cflags -milp32" +- limb_32=longlong +- SPEED_CYCLECOUNTER_OBJ_32=ia64.lo +- cyclecounter_size_32=2 +- +- # Must have +DD64 in CPPFLAGS to get the right __LP64__ for headers, +- # but also need it in CFLAGS for linking programs, since automake +- # only uses CFLAGS when linking, not CPPFLAGS. +- # FIXME: Maybe should use cc_64_ldflags for this, but that would +- # need GMP_LDFLAGS used consistently by all the programs. +- # +- cc_64_cflags="+DD64" +- cc_64_cppflags="+DD64" +- cc_64_cflags_optlist="opt" +- cc_64_cflags_opt="+O3 +O2 +O1" +- gcc_64_cflags="$gcc_cflags -mlp64" +- ;; +- esac +- ;; +- +- +- # Motorola 68k +- # +- m68k-*-* | m68[0-9][0-9][0-9]-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_m68k 1" >>confdefs.h +- +- +-echo "include_mpn(\`m68k/m68k-defs.m4')" >> $gmp_tmpconfigm4i +- +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_cflags_optlist="arch" +- +- # gcc 2.7.2 knows -m68000, -m68020, -m68030, -m68040. +- # gcc 2.95 adds -mcpu32, -m68060. +- # FIXME: Maybe "-m68020 -mnobitfield" would suit cpu32 on 2.7.2. +- # +- case $host_cpu in +- m68020) gcc_cflags_arch="-m68020" ;; +- m68030) gcc_cflags_arch="-m68030" ;; +- m68040) gcc_cflags_arch="-m68040" ;; +- m68060) gcc_cflags_arch="-m68060 -m68000" ;; +- m68360) gcc_cflags_arch="-mcpu32 -m68000" ;; +- *) gcc_cflags_arch="-m68000" ;; +- esac +- +- # FIXME: m68k/mc68020 looks like it's ok for cpu32, but this wants to be +- # tested. Will need to introduce an m68k/cpu32 if m68k/mc68020 ever uses +- # the bitfield instructions. +- case $host_cpu in +- m680[234]0 | m68360) path="m68k/mc68020 m68k" ;; +- *) path="m68k" ;; +- esac +- ;; +- +- +- # Motorola 88k +- m88k*-*-*) +- path="m88k" +- ;; +- m88110*-*-*) +- gcc_cflags="$gcc_cflags -m88110" +- path="m88k/mc88110 m88k" +- ;; +- +- +- # IRIX 5 and earlier can only run 32-bit o32. +- # +- # IRIX 6 and up always has a 64-bit mips CPU can run n32 or 64. n32 is +- # preferred over 64, but only because that's been the default in past +- # versions of GMP. The two are equally efficient. +- # +- # Linux kernel 2.2.13 arch/mips/kernel/irixelf.c has a comment about not +- # supporting n32 or 64. +- # +- # For reference, libtool (eg. 1.5.6) recognises the n32 ABI and knows the +- # right options to use when linking (both cc and gcc), so no need for +- # anything special from us. +- # +- mips*-*-*) +- abilist="o32" +- gcc_cflags_optlist="abi" +- gcc_cflags_abi="-mabi=32" +- gcc_testlist="gcc-mips-o32" +- path="mips32" +- cc_cflags="-O2 -o32" # no -g, it disables all optimizations +- # this suits both mips32 and mips64 +- +-echo "include_mpn(\`mips32/mips-defs.m4')" >> $gmp_tmpconfigm4i +- +- +- case $host in +- mips64*-*-* | mips*-*-irix[6789]*) +- abilist="n32 64 o32" +- +- cclist_n32="gcc cc" +- gcc_n32_cflags="$gcc_cflags -mabi=n32" +- cc_n32_cflags="-O2 -n32" # no -g, it disables all optimizations +- limb_n32=longlong +- path_n32="mips64" +- +- cclist_64="gcc cc" +- gcc_64_cflags="$gcc_cflags -mabi=64" +- gcc_64_ldflags="-Wc,-mabi=64" +- cc_64_cflags="-O2 -64" # no -g, it disables all optimizations +- cc_64_ldflags="-Wc,-64" +- path_64="mips64" +- ;; +- esac +- ;; +- +- +- # Darwin (powerpc-apple-darwin1.3) has it's hacked gcc installed as cc. +- # Our usual "gcc in disguise" detection means gcc_cflags etc here gets +- # used. +- # +- # The darwin pre-compiling preprocessor is disabled with -no-cpp-precomp +- # since it doesn't like "__attribute__ ((mode (SI)))" etc in gmp-impl.h, +- # and so always ends up running the plain preprocessor anyway. This could +- # be done in CPPFLAGS rather than CFLAGS, but there's not many places +- # preprocessing is done separately, and this is only a speedup, the normal +- # preprocessor gets run if there's any problems. +- # +- # We used to use -Wa,-mppc with gcc, but can't remember exactly why. +- # Presumably it was for old versions of gcc where -mpowerpc doesn't put +- # the assembler in the right mode. In any case -Wa,-mppc is not good, for +- # instance -mcpu=604 makes recent gcc use -m604 to get access to the +- # "fsel" instruction, but a -Wa,-mppc overrides that, making code that +- # comes out with fsel fail. +- # +- # (Note also that the darwin assembler doesn't accept "-mppc", so any +- # -Wa,-mppc was used only if it worked. The right flag on darwin would be +- # "-arch ppc" or some such, but that's already the default.) +- # +- powerpc*-*-* | power[3-9]-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_powerpc 1" >>confdefs.h +- +- HAVE_HOST_CPU_FAMILY_powerpc=1 +- abilist="32" +- cclist="gcc cc" +- cc_cflags="-O2" +- gcc_32_cflags="$gcc_cflags -mpowerpc" +- gcc_cflags_optlist="precomp subtype asm cpu" +- gcc_cflags_precomp="-no-cpp-precomp" +- gcc_cflags_subtype="-force_cpusubtype_ALL" # for vmx on darwin +- gcc_cflags_asm="" +- gcc_cflags_cpu="" +- vmx_path="" +- +- # grab this object, though it's not a true cycle counter routine +- SPEED_CYCLECOUNTER_OBJ=powerpc.lo +- cyclecounter_size=0 +- +- case $host_cpu in +- powerpc740 | powerpc750) +- path="powerpc32/750 powerpc32" ;; +- powerpc7400 | powerpc7410) +- path="powerpc32/vmx powerpc32/750 powerpc32" ;; +- powerpc74[45]?) +- path="powerpc32/vmx powerpc32" ;; +- *) +- path="powerpc32" ;; +- esac +- +- case $host_cpu in +- powerpc401) gcc_cflags_cpu="-mcpu=401" ;; +- powerpc403) gcc_cflags_cpu="-mcpu=403" +- xlc_cflags_arch="-qarch=403 -qarch=ppc" ;; +- powerpc405) gcc_cflags_cpu="-mcpu=405" ;; +- powerpc505) gcc_cflags_cpu="-mcpu=505" ;; +- powerpc601) gcc_cflags_cpu="-mcpu=601" +- xlc_cflags_arch="-qarch=601 -qarch=ppc" ;; +- powerpc602) gcc_cflags_cpu="-mcpu=602" +- xlc_cflags_arch="-qarch=602 -qarch=ppc" ;; +- powerpc603) gcc_cflags_cpu="-mcpu=603" +- xlc_cflags_arch="-qarch=603 -qarch=ppc" ;; +- powerpc603e) gcc_cflags_cpu="-mcpu=603e -mcpu=603" +- xlc_cflags_arch="-qarch=603 -qarch=ppc" ;; +- powerpc604) gcc_cflags_cpu="-mcpu=604" +- xlc_cflags_arch="-qarch=604 -qarch=ppc" ;; +- powerpc604e) gcc_cflags_cpu="-mcpu=604e -mcpu=604" +- xlc_cflags_arch="-qarch=604 -qarch=ppc" ;; +- powerpc620) gcc_cflags_cpu="-mcpu=620" ;; +- powerpc630) gcc_cflags_cpu="-mcpu=630" +- xlc_cflags_arch="-qarch=pwr3" +- cpu_path="p3 p3-p7" ;; +- powerpc740) gcc_cflags_cpu="-mcpu=740" ;; +- powerpc7400 | powerpc7410) +- gcc_cflags_asm="-Wa,-maltivec" +- gcc_cflags_cpu="-mcpu=7400 -mcpu=750" ;; +- powerpc74[45]?) +- gcc_cflags_asm="-Wa,-maltivec" +- gcc_cflags_cpu="-mcpu=7450" ;; +- powerpc750) gcc_cflags_cpu="-mcpu=750" ;; +- powerpc801) gcc_cflags_cpu="-mcpu=801" ;; +- powerpc821) gcc_cflags_cpu="-mcpu=821" ;; +- powerpc823) gcc_cflags_cpu="-mcpu=823" ;; +- powerpc860) gcc_cflags_cpu="-mcpu=860" ;; +- powerpc970) gcc_cflags_cpu="-mtune=970" +- xlc_cflags_arch="-qarch=970 -qarch=pwr3" +- vmx_path="powerpc64/vmx" +- cpu_path="p4 p3-p7" ;; +- power4) gcc_cflags_cpu="-mtune=power4" +- xlc_cflags_arch="-qarch=pwr4" +- cpu_path="p4 p3-p7" ;; +- power5) gcc_cflags_cpu="-mtune=power5 -mtune=power4" +- xlc_cflags_arch="-qarch=pwr5" +- cpu_path="p5 p4 p3-p7" ;; +- power6) gcc_cflags_cpu="-mtune=power6" +- xlc_cflags_arch="-qarch=pwr6" +- cpu_path="p6 p3-p7" ;; +- power7) gcc_cflags_cpu="-mtune=power7 -mtune=power5" +- xlc_cflags_arch="-qarch=pwr7 -qarch=pwr5" +- cpu_path="p7 p5 p4 p3-p7" ;; +- esac +- +- case $host in +- *-*-aix*) +- cclist="gcc xlc cc" +- gcc_32_cflags_maybe="-maix32" +- xlc_cflags="-O2 -qmaxmem=20000" +- xlc_cflags_optlist="arch" +- xlc_32_cflags_maybe="-q32" +- ar_32_flags="-X32" +- nm_32_flags="-X32" +- esac +- +- case $host in +- powerpc64-*-* | powerpc64le-*-* | powerpc620-*-* | powerpc630-*-* | powerpc970-*-* | power[3-9]-*-*) +- case $host in +- *-*-aix*) +- # On AIX a true 64-bit ABI is available. +- # Need -Wc to pass object type flags through to the linker. +- abilist="mode64 $abilist" +- cclist_mode64="gcc xlc" +- gcc_mode64_cflags="$gcc_cflags -maix64 -mpowerpc64" +- gcc_mode64_cflags_optlist="cpu" +- gcc_mode64_ldflags="-Wc,-maix64" +- xlc_mode64_cflags="-O2 -q64 -qmaxmem=20000" +- xlc_mode64_cflags_optlist="arch" +- xlc_mode64_ldflags="-Wc,-q64" +- # Must indicate object type to ar and nm +- ar_mode64_flags="-X64" +- nm_mode64_flags="-X64" +- path_mode64="" +- p="" +- for i in $cpu_path +- do path_mode64="${path_mode64}powerpc64/mode64/$i " +- path_mode64="${path_mode64}powerpc64/$i " +- p="${p} powerpc32/$i " +- done +- path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64" +- path="$p $path" +- # grab this object, though it's not a true cycle counter routine +- SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo +- cyclecounter_size_mode64=0 +- ;; +- *-*-darwin*) +- # On Darwin we can use 64-bit instructions with a longlong limb, +- # but the chip still in 32-bit mode. +- # In theory this can be used on any OS which knows how to save +- # 64-bit registers in a context switch. +- # +- # Note that we must use -mpowerpc64 with gcc, since the +- # longlong.h macros expect limb operands in a single 64-bit +- # register, not two 32-bit registers as would be given for a +- # long long without -mpowerpc64. In theory we could detect and +- # accommodate both styles, but the proper 64-bit registers will +- # be fastest and are what we really want to use. +- # +- # One would think -mpowerpc64 would set the assembler in the right +- # mode to handle 64-bit instructions. But for that, also +- # -force_cpusubtype_ALL is needed. +- # +- # Do not use -fast for Darwin, it actually adds options +- # incompatible with a shared library. +- # +- abilist="mode64 mode32 $abilist" +- gcc_32_cflags_maybe="-m32" +- gcc_cflags_opt="-O3 -O2 -O1" # will this become used? +- cclist_mode32="gcc" +- gcc_mode32_cflags_maybe="-m32" +- gcc_mode32_cflags="-mpowerpc64" +- gcc_mode32_cflags_optlist="subtype cpu opt" +- gcc_mode32_cflags_subtype="-force_cpusubtype_ALL" +- gcc_mode32_cflags_opt="-O3 -O2 -O1" +- limb_mode32=longlong +- cclist_mode64="gcc" +- gcc_mode64_cflags="-m64" +- gcc_mode64_cflags_optlist="cpu opt" +- gcc_mode64_cflags_opt="-O3 -O2 -O1" +- path_mode64="" +- path_mode32="" +- p="" +- for i in $cpu_path +- do path_mode64="${path_mode64}powerpc64/mode64/$i " +- path_mode64="${path_mode64}powerpc64/$i " +- path_mode32="${path_mode32}powerpc64/mode32/$i " +- path_mode32="${path_mode32}powerpc64/$i " +- p="${p} powerpc32/$i " +- done +- path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64" +- path_mode32="${path_mode32}powerpc64/mode32 $vmx_path powerpc64" +- path="$p $path" +- SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo +- cyclecounter_size_mode64=0 +- any_mode64_testlist="sizeof-long-8" +- ;; +- *-*-linux* | *-*-*bsd*) +- # On GNU/Linux, assume the processor is in 64-bit mode. Some +- # environments have a gcc that is always in 64-bit mode, while +- # others require -m64, hence the use of cflags_maybe. The +- # sizeof-long-8 test checks the mode is right (for the no option +- # case). +- # +- # -mpowerpc64 is not used, since it should be the default in +- # 64-bit mode. (We need its effect for the various longlong.h +- # asm macros to be right of course.) +- # +- # gcc64 was an early port of gcc to 64-bit mode, but should be +- # obsolete before too long. We prefer plain gcc when it knows +- # 64-bits. +- # +- abilist="mode64 mode32 $abilist" +- gcc_32_cflags_maybe="-m32" +- cclist_mode32="gcc" +- gcc_mode32_cflags_maybe="-m32" +- gcc_mode32_cflags="-mpowerpc64" +- gcc_mode32_cflags_optlist="cpu opt" +- gcc_mode32_cflags_opt="-O3 -O2 -O1" +- limb_mode32=longlong +- cclist_mode64="gcc gcc64" +- gcc_mode64_cflags_maybe="-m64" +- gcc_mode64_cflags_optlist="cpu opt" +- gcc_mode64_cflags_opt="-O3 -O2 -O1" +- path_mode64="" +- path_mode32="" +- p="" +- for i in $cpu_path +- do path_mode64="${path_mode64}powerpc64/mode64/$i " +- path_mode64="${path_mode64}powerpc64/$i " +- path_mode32="${path_mode32}powerpc64/mode32/$i " +- path_mode32="${path_mode32}powerpc64/$i " +- p="${p} powerpc32/$i " +- done +- path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64" +- path_mode32="${path_mode32}powerpc64/mode32 $vmx_path powerpc64" +- path="$p $path" +- SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo +- cyclecounter_size_mode64=0 +- any_mode64_testlist="sizeof-long-8" +- ;; +- esac +- ;; +- esac +- ;; +- +- +- # POWER 32-bit +- power-*-* | power[12]-*-* | power2sc-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_power 1" >>confdefs.h +- +- HAVE_HOST_CPU_FAMILY_power=1 +- cclist="gcc" +- extra_functions="udiv_w_sdiv" +- path="power" +- +- # gcc 2.7.2 knows rios1, rios2, rsc +- # +- # -mcpu=rios2 can tickle an AIX assembler bug (see GMP_PROG_CC_WORKS) so +- # there needs to be a fallback to just -mpower. +- # +- gcc_cflags_optlist="cpu" +- case $host in +- power-*-*) gcc_cflags_cpu="-mcpu=power -mpower" ;; +- power1-*-*) gcc_cflags_cpu="-mcpu=rios1 -mpower" ;; +- power2-*-*) gcc_cflags_cpu="-mcpu=rios2 -mpower" ;; +- power2sc-*-*) gcc_cflags_cpu="-mcpu=rsc -mpower" ;; +- esac +- case $host in +- *-*-aix*) +- cclist="gcc xlc" +- xlc_cflags="-O2 -qarch=pwr -qmaxmem=20000" +- ;; +- esac +- ;; +- +- +- # IBM System/390 and z/Architecture +- s390-*-* | z900esa-*-* | z990esa-*-* | z9esa-*-* | z10esa-*-* | z196esa-*-* | s390x-*-* | z900-*-* | z990-*-* | z9-*-* | z10-*-* | z196-*-*) +- abilist="32" +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_cflags_optlist="arch" +- path="s390_32" +- extra_functions="udiv_w_sdiv" +- gcc_32_cflags_maybe="-m31" +- +- case $host_cpu in +- s390) +- ;; +- z900 | z900esa) +- cpu="z900" +- gccarch="$cpu" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z990 | z990esa) +- cpu="z990" +- gccarch="$cpu" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z9 | z9esa) +- cpu="z9" +- gccarch="z9-109" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z10 | z10esa) +- cpu="z10" +- gccarch="z10" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z196 | z196esa) +- cpu="z196" +- gccarch="z196" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- esac +- +- case $host in +- s390x-*-* | z900-*-* | z990-*-* | z9-*-* | z10-*-* | z196-*-*) +- abilist="64 32" +- cclist_64="gcc" +- gcc_64_cflags_optlist="arch" +- gcc_64_cflags="$gcc_cflags -m64" +- path_64="s390_64/$host_cpu s390_64" +- extra_functions="" +- ;; +- esac +- ;; +- +- +- sh-*-*) path="sh" ;; +- sh[2-4]-*-*) path="sh/sh2 sh" ;; +- +- +- *sparc*-*-*) +- # sizeof(long)==4 or 8 is tested, to ensure we get the right ABI. We've +- # had various bug reports where users have set CFLAGS for their desired +- # mode, but not set our ABI. For some reason it's sparc where this +- # keeps coming up, presumably users there are accustomed to driving the +- # compiler mode that way. The effect of our testlist setting is to +- # reject ABI=64 in favour of ABI=32 if the user has forced the flags to +- # 32-bit mode. +- # +- abilist="32" +- cclist="gcc acc cc" +- any_testlist="sizeof-long-4" +- +-echo "include_mpn(\`sparc32/sparc-defs.m4')" >> $gmp_tmpconfigm4i +- +- +- case $host_cpu in +- sparcv8 | microsparc | turbosparc) +- path="sparc32/v8 sparc32" ;; +- supersparc) +- path="sparc32/v8/supersparc sparc32/v8 sparc32" ;; +- sparc64 | sparcv9* | ultrasparc | ultrasparc[234]*) +- path="sparc32/v9 sparc32/v8 sparc32" ;; +- ultrasparct[12345]) +- path="sparc32/ultrasparct1 sparc32/v8 sparc32" ;; +- *) +- path="sparc32" ;; +- esac +- +- # gcc 2.7.2 doesn't know about v9 and doesn't pass -xarch=v8plus to the +- # assembler. Add it explicitly since the solaris assembler won't accept +- # our sparc32/v9 asm code without it. gas accepts -xarch=v8plus too, so +- # it can be in the cflags unconditionally (though gas doesn't need it). +- # +- # gcc -m32 is needed to force 32-bit mode on a dual-ABI system, but past +- # gcc doesn't know that flag, hence cflags_maybe. Note that -m32 cannot +- # be done through the optlist since the plain cflags would be run first +- # and we don't want to require the default mode (whatever it is) works. +- # +- # Note it's gcc_32_cflags_maybe and not gcc_cflags_maybe because the +- # latter would be used in the 64-bit ABI on systems like "*bsd" where +- # abilist="64" only. +- # +- gcc_32_cflags_maybe="-m32" +- gcc_cflags_optlist="cpu asm" +- +- # gcc 2.7.2 knows -mcypress, -msupersparc, -mv8, -msparclite. +- # gcc 2.95 knows -mcpu= v7, hypersparc, sparclite86x, f930, f934, +- # sparclet, tsc701, v9, ultrasparc. A warning is given that the +- # plain -m forms will disappear. +- # gcc 3.3 adds ultrasparc3. +- # +- case $host_cpu in +- supersparc*) +- gcc_cflags_cpu="-mcpu=supersparc -msupersparc" +- gcc_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8";; +- sparcv8 | microsparc* | turbosparc | hypersparc*) +- gcc_cflags_cpu="-mcpu=v8 -mv8" +- gcc_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8";; +- sparc64 | sparcv9*) +- gcc_cflags_cpu="-mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8plus" +- gcc_64_cflags_asm="-Wa,-Av9 -Wa,-xarch=v9";; +- ultrasparc1 | ultrasparc2*) +- gcc_cflags_cpu="-mcpu=ultrasparc -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusa -Wa,-xarch=v8plusa" +- gcc_64_cflags_asm="-Wa,-Av9a -Wa,-xarch=v9a";; +- ultrasparc[34]) +- gcc_cflags_cpu="-mcpu=ultrasparc3 -mcpu=ultrasparc -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusb -Wa,-xarch=v8plusb" +- gcc_64_cflags_asm="-Wa,-Av9b -Wa,-xarch=v9b";; +- ultrasparct[12]) +- gcc_cflags_cpu="-mcpu=niagara -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusc -Wa,-xarch=v8plusc" +- gcc_64_cflags_asm="-Wa,-Av9c -Wa,-xarch=v9c";; +- ultrasparct3) +- gcc_cflags_cpu="-mcpu=niagara3 -mcpu=niagara -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusd -Wa,-xarch=v8plusd" +- gcc_64_cflags_asm="-Wa,-Av9d -Wa,-xarch=v9d";; +- ultrasparct4) +- gcc_cflags_cpu="-mcpu=niagara4 -mcpu=niagara3 -mcpu=niagara -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusd -Wa,-xarch=v8plusd" +- gcc_64_cflags_asm="-Wa,-Av9d -Wa,-xarch=v9d";; +- *) +- gcc_cflags_cpu="-mcpu=v7 -mcypress" +- gcc_cflags_asm="";; +- esac +- +- # SunPRO cc and acc, and SunOS bundled cc +- case $host in +- *-*-solaris* | *-*-sunos*) +- # Note no -g, it disables all optimizations. +- cc_cflags= +- cc_cflags_optlist="opt arch cpu" +- +- # SunOS cc doesn't know -xO4, fallback to -O2. +- cc_cflags_opt="-xO4 -O2" +- +- # SunOS cc doesn't know -xarch, apparently always generating v7 +- # code, so make this optional +- case $host_cpu in +- sparcv8 | microsparc* | supersparc* | turbosparc | hypersparc*) +- cc_cflags_arch="-xarch=v8";; +- ultrasparct[345]) +- cc_cflags_arch="-xarch=v8plusd" ;; +- sparc64 | sparcv9* | ultrasparc*) +- cc_cflags_arch="-xarch=v8plus" ;; +- *) +- cc_cflags_arch="-xarch=v7" ;; +- esac +- +- # SunOS cc doesn't know -xchip and doesn't seem to have an equivalent. +- # SunPRO cc 5 recognises -xchip=generic, old, super, super2, micro, +- # micro2, hyper, hyper2, powerup, ultra, ultra2, ultra2i. +- # SunPRO cc 6 adds -xchip=ultra2e, ultra3cu. +- # +- case $host_cpu in +- supersparc*) cc_cflags_cpu="-xchip=super" ;; +- microsparc*) cc_cflags_cpu="-xchip=micro" ;; +- turbosparc) cc_cflags_cpu="-xchip=micro2" ;; +- hypersparc*) cc_cflags_cpu="-xchip=hyper" ;; +- ultrasparc) cc_cflags_cpu="-xchip=ultra" ;; +- ultrasparc2) cc_cflags_cpu="-xchip=ultra2 -xchip=ultra" ;; +- ultrasparc2i) cc_cflags_cpu="-xchip=ultra2i -xchip=ultra2 -xchip=ultra" ;; +- ultrasparc3) cc_cflags_cpu="-xchip=ultra3 -xchip=ultra" ;; +- ultrasparc4) cc_cflags_cpu="-xchip=ultra4 -xchip=ultra3 -xchip=ultra" ;; +- ultrasparct1) cc_cflags_cpu="-xchip=ultraT1" ;; +- ultrasparct2) cc_cflags_cpu="-xchip=ultraT2 -xchip=ultraT1" ;; +- ultrasparct3) cc_cflags_cpu="-xchip=ultraT3 -xchip=ultraT2" ;; +- ultrasparct4) cc_cflags_cpu="-xchip=T4" ;; +- ultrasparct5) cc_cflags_cpu="-xchip=T5 -xchip=T4" ;; +- *) cc_cflags_cpu="-xchip=generic" ;; +- esac +- esac +- +- case $host_cpu in +- sparc64 | sparcv9* | ultrasparc*) +- case $host in +- # Solaris 6 and earlier cannot run ABI=64 since it doesn't save +- # registers properly, so ABI=32 is left as the only choice. +- # +- *-*-solaris2.[0-6] | *-*-solaris2.[0-6].*) ;; +- +- # BSD sparc64 ports are 64-bit-only systems, so ABI=64 is the only +- # choice. In fact they need no special compiler flags, gcc -m64 +- # is the default, but it doesn't hurt to add it. v9 CPUs always +- # use the sparc64 port, since the plain 32-bit sparc ports don't +- # run on a v9. +- # +- *-*-*bsd*) abilist="64" ;; +- +- # For all other systems, we try both 64 and 32. +- # +- # GNU/Linux sparc64 has only recently gained a 64-bit user mode. +- # In the past sparc64 meant a v9 cpu, but there were no 64-bit +- # operations in user mode. We assume that if "gcc -m64" works +- # then the system is suitable. Hopefully even if someone attempts +- # to put a new gcc and/or glibc on an old system it won't run. +- # +- *) abilist="64 32" ;; +- esac +- +- case $host_cpu in +- ultrasparc | ultrasparc2 | ultrasparc2i) +- path_64="sparc64/ultrasparc1234 sparc64" ;; +- ultrasparc[34]) +- path_64="sparc64/ultrasparc34 sparc64/ultrasparc1234 sparc64" ;; +- ultrasparct[12]) +- path_64="sparc64/ultrasparct1 sparc64" ;; +- ultrasparct[345]) +- path_64="sparc64/ultrasparct3 sparc64" ;; +- *) +- path_64="sparc64" +- esac +- +- cclist_64="gcc" +- any_64_testlist="sizeof-long-8" +- +- # gcc -mptr64 is probably implied by -m64, but we're not sure if +- # this was always so. On Solaris in the past we always used both +- # "-m64 -mptr64". +- # +- # gcc -Wa,-xarch=v9 is thought to be necessary in some cases on +- # solaris, but it would seem likely that if gcc is going to generate +- # 64-bit code it will have to add that option itself where needed. +- # An extra copy of this option should be harmless though, but leave +- # it until we're sure. (Might want -xarch=v9a or -xarch=v9b for the +- # higher cpu types instead.) +- # +- gcc_64_cflags="$gcc_cflags -m64 -mptr64" +- gcc_64_ldflags="-Wc,-m64" +- gcc_64_cflags_optlist="cpu asm" +- +- case $host in +- *-*-solaris*) +- # Sun cc. +- # +- # We used to have -fast and some fixup options here, but it +- # recurrently caused problems with miscompilation. Of course, +- # -fast is documented as miscompiling things for the sake of speed. +- # +- cclist_64="$cclist_64 cc" +- cc_64_cflags_optlist="cpu" +- case $host_cpu in +- ultrasparct[345]) +- cc_64_cflags="$cc_64_cflags -xO3 -xarch=v9d" ;; +- *) +- cc_64_cflags="-xO3 -xarch=v9" ;; +- esac +- ;; +- esac +- +- # using the v9 %tick register +- SPEED_CYCLECOUNTER_OBJ_32=sparcv9.lo +- SPEED_CYCLECOUNTER_OBJ_64=sparcv9.lo +- cyclecounter_size_32=2 +- cyclecounter_size_64=2 +- ;; +- esac +- ;; +- +- +- # VAX +- vax*-*-*elf*) +- # Use elf conventions (i.e., '%' register prefix, no global prefix) +- # +- +-echo "include_mpn(\`vax/elf.m4')" >> $gmp_tmpconfigm4i +- +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- path="vax" +- extra_functions="udiv_w_sdiv" +- ;; +- vax*-*-*) +- # Default to aout conventions (i.e., no register prefix, '_' global prefix) +- # +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- path="vax" +- extra_functions="udiv_w_sdiv" +- ;; +- +- +- # AMD and Intel x86 configurations, including AMD64 +- # +- # Rumour has it gcc -O2 used to give worse register allocation than just +- # -O, but lets assume that's no longer true. +- # +- # -m32 forces 32-bit mode on a bi-arch 32/64 amd64 build of gcc. -m64 is +- # the default in such a build (we think), so -m32 is essential for ABI=32. +- # This is, of course, done for any $host_cpu, not just x86_64, so we can +- # get such a gcc into the right mode to cross-compile to say i486-*-*. +- # +- # -m32 is not available in gcc 2.95 and earlier, hence cflags_maybe to use +- # it when it works. We check sizeof(long)==4 to ensure we get the right +- # mode, in case -m32 has failed not because it's an old gcc, but because +- # it's a dual 32/64-bit gcc without a 32-bit libc, or whatever. +- # +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- abilist="32" +- cclist="gcc icc cc" +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_32_cflags_maybe="-m32" +- icc_cflags="-no-gcc" +- icc_cflags_optlist="opt" +- icc_cflags_opt="-O3 -O2 -O1" +- any_32_testlist="sizeof-long-4" +- CALLING_CONVENTIONS_OBJS='x86call.lo x86check$U.lo' +- +- # Availability of rdtsc is checked at run-time. +- SPEED_CYCLECOUNTER_OBJ=pentium.lo +- +- # gcc 2.7.2 only knows i386 and i486, using -m386 or -m486. These +- # represent -mcpu= since -m486 doesn't generate 486 specific insns. +- # gcc 2.95 adds k6, pentium and pentiumpro, and takes -march= and -mcpu=. +- # gcc 3.0 adds athlon. +- # gcc 3.1 adds k6-2, k6-3, pentium-mmx, pentium2, pentium3, pentium4, +- # athlon-tbird, athlon-4, athlon-xp, athlon-mp. +- # gcc 3.2 adds winchip2. +- # gcc 3.3 adds winchip-c6. +- # gcc 3.3.1 from mandrake adds k8 and knows -mtune. +- # gcc 3.4 adds c3, c3-2, k8, and deprecates -mcpu in favour of -mtune. +- # +- # In gcc 2.95.[0123], -march=pentiumpro provoked a stack slot bug in an +- # old version of mpz/powm.c. Seems to be fine with the current code, so +- # no need for any restrictions on that option. +- # +- # -march=pentiumpro can fail if the assembler doesn't know "cmov" +- # (eg. solaris 2.8 native "as"), so always have -march=pentium after +- # that as a fallback. +- # +- # -march=pentium4 and -march=k8 enable SSE2 instructions, which may or +- # may not be supported by the assembler and/or the OS, and is bad in gcc +- # prior to 3.3. The tests will reject these if no good, so fallbacks +- # like "-march=pentium4 -mno-sse2" are given to try also without SSE2. +- # Note the relevant -march types are listed in the optflags handling +- # below, be sure to update there if adding new types emitting SSE2. +- # +- # -mtune is used at the start of each cpu option list to give something +- # gcc 3.4 will use, thereby avoiding warnings from -mcpu. -mcpu forms +- # are retained for use by prior gcc. For example pentium has +- # "-mtune=pentium -mcpu=pentium ...", the -mtune is for 3.4 and the +- # -mcpu for prior. If there's a brand new choice in 3.4 for a chip, +- # like k8 for x86_64, then it can be the -mtune at the start, no need to +- # duplicate anything. +- # +- gcc_cflags_optlist="cpu arch" +- case $host_cpu in +- i386*) +- gcc_cflags_cpu="-mtune=i386 -mcpu=i386 -m386" +- gcc_cflags_arch="-march=i386" +- path="x86" +- ;; +- i486*) +- gcc_cflags_cpu="-mtune=i486 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=i486" +- path="x86/i486 x86" +- ;; +- i586 | pentium) +- gcc_cflags_cpu="-mtune=pentium -mcpu=pentium -m486" +- gcc_cflags_arch="-march=pentium" +- path="x86/pentium x86" +- ;; +- pentiummmx) +- gcc_cflags_cpu="-mtune=pentium-mmx -mcpu=pentium-mmx -mcpu=pentium -m486" +- gcc_cflags_arch="-march=pentium-mmx -march=pentium" +- path="x86/pentium/mmx x86/pentium x86/mmx x86" +- ;; +- i686 | pentiumpro) +- gcc_cflags_cpu="-mtune=pentiumpro -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentiumpro -march=pentium" +- path="x86/p6 x86" +- ;; +- pentium2) +- gcc_cflags_cpu="-mtune=pentium2 -mcpu=pentium2 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium2 -march=pentiumpro -march=pentium" +- path="x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- pentium3) +- gcc_cflags_cpu="-mtune=pentium3 -mcpu=pentium3 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium3 -march=pentiumpro -march=pentium" +- path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- pentiumm) +- gcc_cflags_cpu="-mtune=pentium3 -mcpu=pentium3 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium3 -march=pentiumpro -march=pentium" +- path="x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- k6) +- gcc_cflags_cpu="-mtune=k6 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6" +- path="x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- k62) +- gcc_cflags_cpu="-mtune=k6-2 -mcpu=k6-2 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6-2 -march=k6" +- path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- k63) +- gcc_cflags_cpu="-mtune=k6-3 -mcpu=k6-3 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6-3 -march=k6" +- path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- geode) +- gcc_cflags_cpu="-mtune=k6-3 -mcpu=k6-3 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6-3 -march=k6" +- path="x86/geode x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- athlon) +- # Athlon instruction costs are close to P6 (3 cycle load latency, +- # 4-6 cycle mul, 40 cycle div, pairable adc, etc) so if gcc doesn't +- # know athlon (eg. 2.95.2 doesn't) then fall back on pentiumpro. +- gcc_cflags_cpu="-mtune=athlon -mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=athlon -march=pentiumpro -march=pentium" +- path="x86/k7/mmx x86/k7 x86/mmx x86" +- ;; +- i786 | pentium4) +- # pentiumpro is the primary fallback when gcc doesn't know pentium4. +- # This gets us cmov to eliminate branches. Maybe "athlon" would be +- # a possibility on gcc 3.0. +- # +- gcc_cflags_cpu="-mtune=pentium4 -mcpu=pentium4 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium4 -march=pentium4~-mno-sse2 -march=pentiumpro -march=pentium" +- gcc_64_cflags_cpu="-mtune=nocona" +- path="x86/pentium4/sse2 x86/pentium4/mmx x86/pentium4 x86/mmx x86" +- path_64="x86_64/pentium4 x86_64" +- ;; +- viac32) +- # Not sure of the best fallbacks here for -mcpu. +- # c3-2 has sse and mmx, so pentium3 is good for -march. +- gcc_cflags_cpu="-mtune=c3-2 -mcpu=c3-2 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=c3-2 -march=pentium3 -march=pentiumpro -march=pentium" +- path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- viac3*) +- # Not sure of the best fallbacks here. +- gcc_cflags_cpu="-mtune=c3 -mcpu=c3 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=c3 -march=pentium-mmx -march=pentium" +- path="x86/pentium/mmx x86/pentium x86/mmx x86" +- ;; +- athlon64 | k8 | x86_64) +- gcc_cflags_cpu="-mtune=k8 -mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k8 -march=k8~-mno-sse2 -march=athlon -march=pentiumpro -march=pentium" +- path="x86/k8 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/k8 x86_64" +- ;; +- k10) +- gcc_cflags_cpu="-mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/k10 x86/k8 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/k10 x86_64/k8 x86_64" +- ;; +- bobcat) +- gcc_cflags_cpu="-mtune=btver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=btver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bobcat x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bobcat x86_64/k10 x86_64/k8 x86_64" +- ;; +- jaguar) +- gcc_cflags_cpu="-mtune=btver2 -mtune=btver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=btver2 -march=btver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/jaguar x86/bobcat x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/jaguar x86_64/bobcat x86_64/k10 x86_64/k8 x86_64" +- ;; +- bulldozer | bd1) +- gcc_cflags_cpu="-mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- piledriver | bd2) +- gcc_cflags_cpu="-mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- steamroller | bd3) +- gcc_cflags_cpu="-mtune=bdver3 -mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver3 -march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd3 x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd3 x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- excavator | bd4) +- gcc_cflags_cpu="-mtune=bdver4 -mtune=bdver3 -mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver4 -march=bdver3 -march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd4 x86/bd3 x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd4 x86_64/bd3 x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- core2) +- gcc_cflags_cpu="-mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/core2 x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/core2 x86_64" +- ;; +- corei | coreinhm | coreiwsm) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreinhm x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreinhm x86_64/core2 x86_64" +- ;; +- coreisbr) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64" +- ;; +- coreihwl) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64" +- ;; +- coreibwl) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64" +- # extra_functions_64="missing" # enable for bmi2/adx simulation +- ;; +- atom) +- gcc_cflags_cpu="-mtune=atom -mtune=pentium3" +- gcc_cflags_arch="-march=atom -march=pentium3" +- path="x86/atom/sse2 x86/atom/mmx x86/atom x86/mmx x86" +- path_64="x86_64/atom x86_64" +- ;; +- nano) +- gcc_cflags_cpu="-mtune=nano" +- gcc_cflags_arch="-march=nano" +- path="x86/nano x86/mmx x86" +- path_64="x86_64/nano x86_64" +- ;; +- *) +- gcc_cflags_cpu="-mtune=i486 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=i486" +- path="x86" +- path_64="x86_64" +- ;; +- esac +- +- case $host in +- athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- cclist_64="gcc cc" +- gcc_64_cflags="$gcc_cflags -m64" +- gcc_64_cflags_optlist="cpu arch" +- CALLING_CONVENTIONS_OBJS_64='amd64call.lo amd64check$U.lo' +- SPEED_CYCLECOUNTER_OBJ_64=x86_64.lo +- cyclecounter_size_64=2 +- +- cclist_x32="gcc cc" +- gcc_x32_cflags="$gcc_cflags -mx32" +- gcc_x32_cflags_optlist="$gcc_64_cflags_optlist" +- CALLING_CONVENTIONS_OBJS_x32="$CALLING_CONVENTIONS_OBJS_64" +- SPEED_CYCLECOUNTER_OBJ_x32="$SPEED_CYCLECOUNTER_OBJ_64" +- cyclecounter_size_x32="$cyclecounter_size_64" +- path_x32="$path_64" +- limb_x32=longlong +- any_x32_testlist="sizeof-long-4" +- +- abilist="64 x32 32" +- if test "$enable_assembly" = "yes" ; then +- extra_functions_64="$extra_functions_64 invert_limb_table" +- extra_functions_x32=$extra_functions_64 +- fi +- +- case $host in +- *-*-solaris*) +- # Sun cc. +- cc_64_cflags="-xO3 -m64" +- ;; +- *-*-mingw* | *-*-cygwin) +- limb_64=longlong +- CALLING_CONVENTIONS_OBJS_64="" +- +-$as_echo "@%:@define HOST_DOS64 1" >>confdefs.h +- +- GMP_NONSTD_ABI_64=DOS64 +- ;; +- esac +- ;; +- esac +- ;; +- +- +- # Special CPU "none" used to select generic C, now this is obsolete. +- none-*-*) +- enable_assembly=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: the \"none\" host is obsolete, use --disable-assembly" >&5 +-$as_echo "$as_me: WARNING: the \"none\" host is obsolete, use --disable-assembly" >&2;} +- ;; +- +-esac +- +-# mingw can be built by the cygwin gcc if -mno-cygwin is added. For +-# convenience add this automatically if it works. Actual mingw gcc accepts +-# -mno-cygwin too, but of course is the default. mingw only runs on the +-# x86s, but allow any CPU here so as to catch "none" too. +-# +-case $host in +- *-*-mingw*) +- gcc_cflags_optlist="$gcc_cflags_optlist nocygwin" +- gcc_cflags_nocygwin="-mno-cygwin" +- ;; +-esac +- +- +-CFLAGS_or_unset=${CFLAGS-'(unset)'} +-CPPFLAGS_or_unset=${CPPFLAGS-'(unset)'} +- +-cat >&5 <conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- rm -f conftest* +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $cc is gcc" >&5 +-$as_echo_n "checking whether $cc is gcc... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- ccbase=gcc +-else +- rm -f conftest* +- : +-fi +- +- fi +- +- # Similarly if the compiler is IBM xlc but invoked as cc or whatever +- # then change $ccbase and make the default xlc flags available. +- if test $ccbase != xlc; then +- gmp_command="$cc 2>&1 | grep xlc >/dev/null" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_command\""; } >&5 +- (eval $gmp_command) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $cc is xlc" >&5 +-$as_echo_n "checking whether $cc is xlc... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- ccbase=xlc +-else +- : +-fi +- +- fi +- +- # acc was Sun's first unbundled compiler back in the SunOS days, or +- # something like that, but today its man page says it's not meant to +- # be used directly (instead via /usr/ucb/cc). The options are pretty +- # much the same as the main SunPRO cc, so share those configs. +- # +- case $host in +- *sparc*-*-solaris* | *sparc*-*-sunos*) +- if test "$ccbase" = acc; then ccbase=cc; fi ;; +- esac +- +- for tmp_cflags_maybe in yes no; do +- eval cflags=\"\$${ccbase}${abi1}_cflags\" +- test -n "$cflags" || eval cflags=\"\$${ccbase}${abi2}_cflags\" +- +- if test "$tmp_cflags_maybe" = yes; then +- # don't try cflags_maybe when the user set CFLAGS +- if test "$test_CFLAGS" = set; then continue; fi +- eval cflags_maybe=\"\$${ccbase}${abi1}_cflags_maybe\" +- test -n "$cflags_maybe" || eval cflags_maybe=\"\$${ccbase}${abi2}_cflags_maybe\" +- # don't try cflags_maybe if there's nothing set +- if test -z "$cflags_maybe"; then continue; fi +- cflags="$cflags_maybe $cflags" +- fi +- +- # Any user CFLAGS, even an empty string, takes precedence +- if test "$test_CFLAGS" = set; then cflags=$CFLAGS; fi +- +- # Any user CPPFLAGS, even an empty string, takes precedence +- eval cppflags=\"\$${ccbase}${abi1}_cppflags\" +- test -n "$cppflags" || eval cppflags=\"\$${ccbase}${abi2}_cppflags\" +- if test "$test_CPPFLAGS" = set; then cppflags=$CPPFLAGS; fi +- +- # --enable-profiling adds -p/-pg even to user-specified CFLAGS. +- # This is convenient, but it's perhaps a bit naughty to modify user +- # CFLAGS. +- case "$enable_profiling" in +- prof) cflags="$cflags -p" ;; +- gprof) cflags="$cflags -pg" ;; +- instrument) cflags="$cflags -finstrument-functions" ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags $cppflags" >&5 +-$as_echo_n "checking compiler $cc $cflags $cppflags... " >&6; } +-gmp_prog_cc_works=yes +- +-# first see a simple "main()" works, then go on to other checks +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no" +- ;; +- norun) +- gmp_prog_cc_works="no, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, function pointer return" +- ;; +- norun) +- gmp_prog_cc_works="no, function pointer return, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? n : 0); } +- +-int main () { return 0; } +-EOF +- echo "Test compile: cmov instruction" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, cmov instruction" +- ;; +- norun) +- gmp_prog_cc_works="no, cmov instruction, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; } +-EOF +- echo "Test compile: double -> ulong conversion" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> ulong conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> ulong conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double negation" +- ;; +- norun) +- gmp_prog_cc_works="no, double negation, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < float conversion" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> float conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> float conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: gnupro alpha ev6 char spilling" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling" +- ;; +- norun) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# __builtin_alloca is not available everywhere, check it exists before +-# seeing that it works +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, alloca array" +- ;; +- norun) +- gmp_prog_cc_works="no, alloca array, program does not run" +- ;; +- esac +-fi +- +- +- +- ;; +- no) +- +- ;; +- norun) +- +- ;; +- esac +-fi +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: abs int -> double conversion" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, abs int -> double conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, abs int -> double conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 1" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 1, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 2" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization, program does not run" +- ;; +- esac +-fi +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization 2" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled +-# by recent versions of gcc. +-# +-if test "$gmp_prog_cc_works" = yes; then +- case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-*) +- # this problem only arises in PIC code, so don't need to test when +- # --disable-shared. We don't necessarily have $enable_shared set to +- # yes at this point, it will still be unset for the default (which is +- # yes); hence the use of "!= no". +- if test "$enable_shared" != no; then +- echo "Testing gcc GOT with eax emitted" >&5 +-cat >conftest.c <<\EOF +-int foo; +-int bar () { return foo; } +-EOF +-tmp_got_emitted=no +-gmp_compile="$cc $cflags $cppflags -fPIC -S conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then +- tmp_got_emitted=yes +- fi +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_emitted" >&5 +-if test "$tmp_got_emitted" = yes; then +- echo "Testing gas GOT with eax good" >&5 +-cat >conftest.awk <<\EOF +-BEGIN { +- want[0] = "001" +- want[1] = "043" +- want[2] = "105" +- want[3] = "147" +- want[4] = "211" +- want[5] = "253" +- want[6] = "315" +- want[7] = "357" +- +- want[8] = "005" +- want[9] = "002" +- want[10] = "000" +- want[11] = "000" +- want[12] = "000" +- +- want[13] = "376" +- want[14] = "334" +- want[15] = "272" +- want[16] = "230" +- want[17] = "166" +- want[18] = "124" +- want[19] = "062" +- want[20] = "020" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 20; i++) +- got[i] = got[i+1]; +- got[20] = $f; +- +- found = 1 +- for (i = 0; i < 21; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-EOF +-cat >conftest.s <<\EOF +- .text +- .byte 1, 35, 69, 103, 137, 171, 205, 239 +- addl $_GLOBAL_OFFSET_TABLE_, %eax +- .byte 254, 220, 186, 152, 118, 84, 50, 16 +-EOF +-tmp_got_good=yes +-gmp_compile="$cc $cflags $cppflags -fPIC -o conftest.o -c conftest.s >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk` +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_good" >&5 +-if test "$tmp_got_good" = no; then +- gmp_prog_cc_works="no, bad gas GOT with eax" +-else +- : +-fi +- +-else +- : +-fi +- +- fi +- ;; +- esac +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cc_works" >&5 +-$as_echo "$gmp_prog_cc_works" >&6; } +-case $gmp_prog_cc_works in +- yes) +- +- ;; +- *) +- continue +- ;; +-esac +- +- +- # If we're supposed to be using a "long long" for a limb, check that +- # it works. +- eval limb_chosen=\"\$limb$abi1\" +- test -n "$limb_chosen" || eval limb_chosen=\"\$limb$abi2\" +- if test "$limb_chosen" = longlong; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags $cppflags has long long" >&5 +-$as_echo_n "checking compiler $cc $cflags $cppflags has long long... " >&6; } +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_prog_cc_works=yes +-else +- echo "failed program was:" >&5 +- cat conftest.c >&5 +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cc_works" >&5 +-$as_echo "$gmp_prog_cc_works" >&6; } +-if test $gmp_prog_cc_works = yes; then +- : +-else +- continue +-fi +- +- fi +- +- # The tests to perform on this $cc, if any +- eval testlist=\"\$${ccbase}${abi1}_testlist\" +- test -n "$testlist" || eval testlist=\"\$${ccbase}${abi2}_testlist\" +- test -n "$testlist" || eval testlist=\"\$any${abi1}_testlist\" +- test -n "$testlist" || eval testlist=\"\$any${abi2}_testlist\" +- +- testlist_pass=yes +- for tst in $testlist; do +- case $tst in +- hpc-hppa-2-0) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HP compiler $cc is good for 64-bits" >&5 +-$as_echo_n "checking whether HP compiler $cc is good for 64-bits... " >&6; } +-# Bad compiler output: +-# ccom: HP92453-01 G.10.32.05 HP C Compiler +-# Good compiler output: +-# ccom: HP92453-01 A.10.32.30 HP C Compiler +-# Let A.10.32.30 or higher be ok. +-echo >conftest.c +-gmp_tmp_vs=`$cc -V -c -o conftest.$OBJEXT conftest.c 2>&1 | grep "^ccom:"` +-echo "Version string: $gmp_tmp_vs" >&5 +-rm conftest* +-gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\([0-9]*\).*/\1/'` +-gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` +-gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` +-echo "Version number: $gmp_tmp_v1.$gmp_tmp_v2.$gmp_tmp_v3" >&5 +-if test -z "$gmp_tmp_v1"; then +- gmp_hpc_64bit=not-applicable +-else +- gmp_compare_ge=no +-if test -n "$gmp_tmp_v1"; then +- if test "$gmp_tmp_v1" -gt 10; then +- gmp_compare_ge=yes +- else +- if test "$gmp_tmp_v1" -eq 10; then +- if test -n "$gmp_tmp_v2"; then +- if test "$gmp_tmp_v2" -gt 32; then +- gmp_compare_ge=yes +- else +- if test "$gmp_tmp_v2" -eq 32; then +- if test -n "$gmp_tmp_v3" && test "$gmp_tmp_v3" -ge 30; then +- gmp_compare_ge=yes +-fi +- +- fi +- fi +-fi +- +- fi +- fi +-fi +- +- +- gmp_hpc_64bit=$gmp_compare_ge +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_hpc_64bit" >&5 +-$as_echo "$gmp_hpc_64bit" >&6; } +-if test $gmp_hpc_64bit = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- gcc-arm-umodsi) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ARM gcc unsigned division works" >&5 +-$as_echo_n "checking whether ARM gcc unsigned division works... " >&6; } +-tmp_version=`$cc --version` +-echo "$tmp_version" >&5 +-case $tmp_version in +- 2.95 | 2.95.[123]) +- testlist_pass=no +- gmp_gcc_arm_umodsi_result="no, gcc 2.95.[0123]" ;; +- *) +- : +- gmp_gcc_arm_umodsi_result=yes ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_gcc_arm_umodsi_result" >&5 +-$as_echo "$gmp_gcc_arm_umodsi_result" >&6; } +- ;; +- gcc-mips-o32) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports o32" >&5 +-$as_echo_n "checking whether gcc supports o32... " >&6; } +-echo 'int x;' >conftest.c +-echo "$cc -mabi=32 -c conftest.c" >&5 +-if $cc -mabi=32 -c conftest.c >conftest.out 2>&1; then +- result=yes +-else +- cat conftest.out >&5 +- if grep "cc1: Invalid option \`abi=32'" conftest.out >/dev/null; then +- result=yes +- else +- result=no +- fi +-fi +-rm -f conftest.* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test $result = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- hppa-level-2.0) { $as_echo "$as_me:${as_lineno-$LINENO}: checking $cc $cflags assembler knows hppa 2.0" >&5 +-$as_echo_n "checking $cc $cflags assembler knows hppa 2.0... " >&6; } +-result=no +-cat >conftest.s <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- result=yes +-else +- echo "failed program was" >&5 +- cat conftest.s >&5 +-fi +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- sizeof*) echo "configure: testlist $tst" >&5 +-gmp_sizeof_type=`echo "$tst" | sed 's/sizeof-\([a-z]*\).*/\1/'` +-gmp_sizeof_want=`echo "$tst" | sed 's/sizeof-[a-z]*-\([0-9]*\).*/\1/'` +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags has sizeof($gmp_sizeof_type)==$gmp_sizeof_want" >&5 +-$as_echo_n "checking compiler $cc $cflags has sizeof($gmp_sizeof_type)==$gmp_sizeof_want... " >&6; } +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_c_testlist_sizeof=yes +-fi +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_c_testlist_sizeof" >&5 +-$as_echo "$gmp_c_testlist_sizeof" >&6; } +-if test $gmp_c_testlist_sizeof = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- esac +- if test $testlist_pass = no; then break; fi +- done +- +- if test $testlist_pass = yes; then +- found_compiler=yes +- break +- fi +- done +- +- if test $found_compiler = yes; then break; fi +- done +- +- if test $found_compiler = yes; then break; fi +- done +- +- if test $found_compiler = yes; then break; fi +-done +- +- +-# If we recognised the CPU, as indicated by $path being set, then insist +-# that we have a working compiler, either from our $cclist choices or from +-# $CC. We can't let AC_PROG_CC look around for a compiler because it might +-# find one that we've rejected (for not supporting the modes our asm code +-# demands, etc). +-# +-# If we didn't recognise the CPU (and this includes host_cpu=none), then +-# fall through and let AC_PROG_CC look around for a compiler too. This is +-# mostly in the interests of following a standard autoconf setup, after all +-# we've already tested cc and gcc adequately (hopefully). As of autoconf +-# 2.50 the only thing AC_PROG_CC really adds is a check for "cl" (Microsoft +-# C on MS-DOS systems). +-# +-if test $found_compiler = no && test -n "$path"; then +- as_fn_error $? "could not find a working compiler, see config.log for details" "$LINENO" 5 +-fi +- +-case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- # If the user asked for a fat build, override the path and flags set above +- if test $enable_fat = yes; then +- gcc_cflags_cpu="" +- gcc_cflags_arch="" +- +- fat_functions="add_n addmul_1 bdiv_dbm1c com cnd_add_n cnd_sub_n +- copyd copyi dive_1 divrem_1 +- gcd_1 lshift lshiftc mod_1 mod_1_1 mod_1_1_cps mod_1_2 +- mod_1_2_cps mod_1_4 mod_1_4_cps mod_34lsub1 mode1o mul_1 +- mul_basecase mullo_basecase pre_divrem_1 pre_mod_1 redc_1 +- redc_2 rshift sqr_basecase sub_n submul_1" +- +- if test "$abi" = 32; then +- extra_functions="$extra_functions fat fat_entry" +- path="x86/fat x86" +- fat_path="x86 x86/fat x86/i486 +- x86/k6 x86/k6/mmx x86/k6/k62mmx +- x86/k7 x86/k7/mmx +- x86/k8 x86/k10 x86/bobcat +- x86/pentium x86/pentium/mmx +- x86/p6 x86/p6/mmx x86/p6/p3mmx x86/p6/sse2 +- x86/pentium4 x86/pentium4/mmx x86/pentium4/sse2 +- x86/core2 x86/coreinhm x86/coreisbr +- x86/atom x86/atom/mmx x86/atom/sse2 x86/nano" +- fi +- +- if test "$abi" = 64; then +- gcc_64_cflags="" +- extra_functions_64="$extra_functions_64 fat fat_entry" +- path_64="x86_64/fat x86_64" +- fat_path="x86_64 x86_64/fat +- x86_64/k8 x86_64/k10 x86_64/bd1 x86_64/bobcat +- x86_64/pentium4 x86_64/core2 x86_64/coreinhm x86_64/coreisbr +- x86_64/coreihwl x86_64/atom x86_64/nano" +- fat_functions="$fat_functions addmul_2 addlsh1_n addlsh2_n sublsh1_n" +- fi +- +- fat_thresholds="MUL_TOOM22_THRESHOLD MUL_TOOM33_THRESHOLD +- SQR_TOOM2_THRESHOLD SQR_TOOM3_THRESHOLD +- BMOD_1_TO_MOD_1_THRESHOLD" +- fi +- ;; +-esac +- +- +-if test $found_compiler = yes; then +- +- # If we're creating CFLAGS, then look for optional additions. If the user +- # set CFLAGS then leave it alone. +- # +- if test "$test_CFLAGS" != set; then +- eval optlist=\"\$${ccbase}${abi1}_cflags_optlist\" +- test -n "$optlist" || eval optlist=\"\$${ccbase}${abi2}_cflags_optlist\" +- +- for opt in $optlist; do +- eval optflags=\"\$${ccbase}${abi1}_cflags_${opt}\" +- test -n "$optflags" || eval optflags=\"\$${ccbase}${abi2}_cflags_${opt}\" +- test -n "$optflags" || eval optflags=\"\$${ccbase}_cflags_${opt}\" +- +- for flag in $optflags; do +- +- # ~ represents a space in an option spec +- flag=`echo "$flag" | tr '~' ' '` +- +- case $flag in +- -march=pentium4 | -march=k8) +- # For -march settings which enable SSE2 we exclude certain bad +- # gcc versions and we need an OS knowing how to save xmm regs. +- # +- # This is only for ABI=32, any 64-bit gcc is good and any OS +- # knowing x86_64 will know xmm. +- # +- # -march=k8 was only introduced in gcc 3.3, so we shouldn't need +- # the GMP_GCC_PENTIUM4_SSE2 check (for gcc 3.2 and prior). But +- # it doesn't hurt to run it anyway, sharing code with the +- # pentium4 case. +- # +- if test "$abi" = 32; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc is good for sse2" >&5 +-$as_echo_n "checking whether gcc is good for sse2... " >&6; } +-case `$cc $cflags $cppflags -dumpversion` in +- 3.[012] | 3.[012].*) result=no ;; +- *) result=yes ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- : +-else +- continue +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the operating system supports XMM registers" >&5 +-$as_echo_n "checking whether the operating system supports XMM registers... " >&6; } +-if ${gmp_cv_os_x86_xmm+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$build" = "$host"; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.s <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then +- gmp_cv_os_x86_xmm=yes +- else +- gmp_cv_os_x86_xmm=no +- fi +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Oops, cannot compile test program" >&5 +-$as_echo "$as_me: WARNING: Oops, cannot compile test program" >&2;} +- fi +- rm -f conftest* +-fi +- +-if test -z "$gmp_cv_os_x86_xmm"; then +- case $host_os in +- freebsd[123] | freebsd[123].*) +- gmp_cv_os_x86_xmm=no ;; +- freebsd*) +- gmp_cv_os_x86_xmm=yes ;; +- *) +- gmp_cv_os_x86_xmm=probably ;; +- esac +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_os_x86_xmm" >&5 +-$as_echo "$gmp_cv_os_x86_xmm" >&6; } +- +-if test "$gmp_cv_os_x86_xmm" = probably; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not certain of OS support for xmm when cross compiling." >&5 +-$as_echo "$as_me: WARNING: Not certain of OS support for xmm when cross compiling." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Will assume it's ok, expect a SIGILL if this is wrong." >&5 +-$as_echo "$as_me: WARNING: Will assume it's ok, expect a SIGILL if this is wrong." >&2;} +-fi +- +-case $gmp_cv_os_x86_xmm in +-no) +- continue +- ;; +-*) +- +- ;; +-esac +- +- fi +- ;; +- -no-cpp-precomp) +- # special check, avoiding a warning +- if test "$ccbase" = gcc; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags -no-cpp-precomp" >&5 +-$as_echo_n "checking compiler $cc $cflags -no-cpp-precomp... " >&6; } +- result=no +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "unrecognized option.*-no-cpp-precomp" conftest.out >/dev/null; then : ; +- else +- result=yes +- fi +- fi +- cat conftest.out >&5 +- rm -f conftest* a.out b.out a.exe a_out.exe +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +- if test "$result" = yes; then +- cflags="$cflags $flag" +- break +- else +- continue +- fi +-fi +- +- ;; +- -Wa,-m*) +- case $host in +- alpha*-*-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler $cc $cflags $flag" >&5 +-$as_echo_n "checking assembler $cc $cflags $flag... " >&6; } +-result=no +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "Unknown CPU identifier" conftest.out >/dev/null; then : ; +- else +- result=yes +- fi +-fi +-cat conftest.out >&5 +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- : +-else +- continue +-fi +- +- ;; +- esac +- ;; +- -Wa,-oldas) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $cc $cflags $cppflags -Wa,-oldas" >&5 +-$as_echo_n "checking for $cc $cflags $cppflags -Wa,-oldas... " >&6; } +-result=no +-cat >conftest.c <&5 +-gmp_compile="$cc $cflags $cppflags -c conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : ; +-else +- # empty fails +- gmp_compile="$cc $cflags $cppflags -Wa,-oldas -c conftest.c >&5 2>&1" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- # but with -Wa,-oldas it works +- result=yes +- fi +-fi +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- cflags="$cflags $flag" +- break +-else +- continue +-fi +- +- ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags $cppflags $flag" >&5 +-$as_echo_n "checking compiler $cc $cflags $cppflags $flag... " >&6; } +-gmp_prog_cc_works=yes +- +-# first see a simple "main()" works, then go on to other checks +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no" +- ;; +- norun) +- gmp_prog_cc_works="no, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, function pointer return" +- ;; +- norun) +- gmp_prog_cc_works="no, function pointer return, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? n : 0); } +- +-int main () { return 0; } +-EOF +- echo "Test compile: cmov instruction" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, cmov instruction" +- ;; +- norun) +- gmp_prog_cc_works="no, cmov instruction, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; } +-EOF +- echo "Test compile: double -> ulong conversion" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> ulong conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> ulong conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double negation" +- ;; +- norun) +- gmp_prog_cc_works="no, double negation, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < float conversion" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> float conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> float conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: gnupro alpha ev6 char spilling" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling" +- ;; +- norun) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# __builtin_alloca is not available everywhere, check it exists before +-# seeing that it works +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, alloca array" +- ;; +- norun) +- gmp_prog_cc_works="no, alloca array, program does not run" +- ;; +- esac +-fi +- +- +- +- ;; +- no) +- +- ;; +- norun) +- +- ;; +- esac +-fi +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: abs int -> double conversion" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, abs int -> double conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, abs int -> double conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 1" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 1, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 2" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization, program does not run" +- ;; +- esac +-fi +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization 2" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled +-# by recent versions of gcc. +-# +-if test "$gmp_prog_cc_works" = yes; then +- case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-*) +- # this problem only arises in PIC code, so don't need to test when +- # --disable-shared. We don't necessarily have $enable_shared set to +- # yes at this point, it will still be unset for the default (which is +- # yes); hence the use of "!= no". +- if test "$enable_shared" != no; then +- echo "Testing gcc GOT with eax emitted" >&5 +-cat >conftest.c <<\EOF +-int foo; +-int bar () { return foo; } +-EOF +-tmp_got_emitted=no +-gmp_compile="$cc $cflags $cppflags $flag -fPIC -S conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then +- tmp_got_emitted=yes +- fi +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_emitted" >&5 +-if test "$tmp_got_emitted" = yes; then +- echo "Testing gas GOT with eax good" >&5 +-cat >conftest.awk <<\EOF +-BEGIN { +- want[0] = "001" +- want[1] = "043" +- want[2] = "105" +- want[3] = "147" +- want[4] = "211" +- want[5] = "253" +- want[6] = "315" +- want[7] = "357" +- +- want[8] = "005" +- want[9] = "002" +- want[10] = "000" +- want[11] = "000" +- want[12] = "000" +- +- want[13] = "376" +- want[14] = "334" +- want[15] = "272" +- want[16] = "230" +- want[17] = "166" +- want[18] = "124" +- want[19] = "062" +- want[20] = "020" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 20; i++) +- got[i] = got[i+1]; +- got[20] = $f; +- +- found = 1 +- for (i = 0; i < 21; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-EOF +-cat >conftest.s <<\EOF +- .text +- .byte 1, 35, 69, 103, 137, 171, 205, 239 +- addl $_GLOBAL_OFFSET_TABLE_, %eax +- .byte 254, 220, 186, 152, 118, 84, 50, 16 +-EOF +-tmp_got_good=yes +-gmp_compile="$cc $cflags $cppflags $flag -fPIC -o conftest.o -c conftest.s >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk` +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_good" >&5 +-if test "$tmp_got_good" = no; then +- gmp_prog_cc_works="no, bad gas GOT with eax" +-else +- : +-fi +- +-else +- : +-fi +- +- fi +- ;; +- esac +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cc_works" >&5 +-$as_echo "$gmp_prog_cc_works" >&6; } +-case $gmp_prog_cc_works in +- yes) +- cflags="$cflags $flag" +- break +- ;; +- *) +- +- ;; +-esac +- +- done +- done +- fi +- +- ABI="$abi" +- CC="$cc" +- CFLAGS="$cflags" +- CPPFLAGS="$cppflags" +- eval GMP_NONSTD_ABI=\"\$GMP_NONSTD_ABI_$ABI\" +- +- # Could easily have this in config.h too, if desired. +- ABI_nodots=`echo $ABI | sed 's/\./_/'` +- +-echo "define_not_for_expansion(\`HAVE_ABI_$ABI_nodots')" >> $gmp_tmpconfigm4p +- +- +- +- # GMP_LDFLAGS substitution, selected according to ABI. +- # These are needed on libgmp.la and libmp.la, but currently not on +- # convenience libraries like tune/libspeed.la or mpz/libmpz.la. +- # +- eval GMP_LDFLAGS=\"\$${ccbase}${abi1}_ldflags\" +- test -n "$GMP_LDFLAGS" || eval GMP_LDFLAGS=\"\$${ccbase}${abi1}_ldflags\" +- +- +- +- +- # extra_functions, selected according to ABI +- eval tmp=\"\$extra_functions$abi1\" +- test -n "$tmp" || eval tmp=\"\$extra_functions$abi2\" +- extra_functions="$tmp" +- +- +- # Cycle counter, selected according to ABI. +- # +- eval tmp=\"\$SPEED_CYCLECOUNTER_OBJ$abi1\" +- test -n "$tmp" || eval tmp=\"\$SPEED_CYCLECOUNTER_OBJ$abi2\" +- SPEED_CYCLECOUNTER_OBJ="$tmp" +- eval tmp=\"\$cyclecounter_size$abi1\" +- test -n "$tmp" || eval tmp=\"\$cyclecounter_size$abi2\" +- cyclecounter_size="$tmp" +- +- if test -n "$SPEED_CYCLECOUNTER_OBJ"; then +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SPEED_CYCLECOUNTER $cyclecounter_size +-_ACEOF +- +- fi +- +- +- +- # Calling conventions checking, selected according to ABI. +- # +- eval tmp=\"\$CALLING_CONVENTIONS_OBJS$abi1\" +- test -n "$tmp" || eval tmp=\"\$CALLING_CONVENTIONS_OBJS$abi2\" +- if test "$enable_assembly" = "yes"; then +- CALLING_CONVENTIONS_OBJS="$tmp" +- else +- CALLING_CONVENTIONS_OBJS="" +- fi +- +- if test -n "$CALLING_CONVENTIONS_OBJS"; then +- +-$as_echo "@%:@define HAVE_CALLING_CONVENTIONS 1" >>confdefs.h +- +- fi +- +- +-fi +- +- +-# If the user gave an MPN_PATH, use that verbatim, otherwise choose +-# according to the ABI and add "generic". +-# +-if test -n "$MPN_PATH"; then +- path="$MPN_PATH" +-else +- eval tmp=\"\$path$abi1\" +- test -n "$tmp" || eval tmp=\"\$path$abi2\" +- path="$tmp generic" +-fi +- +- +-# Long long limb setup for gmp.h. +-case $limb_chosen in +-longlong) DEFN_LONG_LONG_LIMB="#define _LONG_LONG_LIMB 1" ;; +-*) DEFN_LONG_LONG_LIMB="/* #undef _LONG_LONG_LIMB */" ;; +-esac +- +- +- +-# The C compiler and preprocessor, put into ANSI mode if possible. +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +-set dummy ${ac_tool_prefix}gcc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="${ac_tool_prefix}gcc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_CC"; then +- ac_ct_CC=$CC +- # Extract the first word of "gcc", so it can be a program name with args. +-set dummy gcc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_CC"; then +- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_CC="gcc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_CC=$ac_cv_prog_ac_ct_CC +-if test -n "$ac_ct_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +-$as_echo "$ac_ct_CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_CC" = x; then +- CC="" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- CC=$ac_ct_CC +- fi +-else +- CC="$ac_cv_prog_CC" +-fi +- +-if test -z "$CC"; then +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +-set dummy ${ac_tool_prefix}cc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="${ac_tool_prefix}cc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- fi +-fi +-if test -z "$CC"; then +- # Extract the first word of "cc", so it can be a program name with args. +-set dummy cc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +- ac_prog_rejected=no +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then +- ac_prog_rejected=yes +- continue +- fi +- ac_cv_prog_CC="cc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-if test $ac_prog_rejected = yes; then +- # We found a bogon in the path, so make sure we never use it. +- set dummy $ac_cv_prog_CC +- shift +- if test $@%:@ != 0; then +- # We chose a different compiler from the bogus one. +- # However, it has the same basename, so the bogon will be chosen +- # first if we set CC to just the basename; use the full file name. +- shift +- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" +- fi +-fi +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$CC"; then +- if test -n "$ac_tool_prefix"; then +- for ac_prog in cl.exe +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$CC" && break +- done +-fi +-if test -z "$CC"; then +- ac_ct_CC=$CC +- for ac_prog in cl.exe +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_CC"; then +- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_CC="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_CC=$ac_cv_prog_ac_ct_CC +-if test -n "$ac_ct_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +-$as_echo "$ac_ct_CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_CC" && break +-done +- +- if test "x$ac_ct_CC" = x; then +- CC="" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- CC=$ac_ct_CC +- fi +-fi +- +-fi +- +- +-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "no acceptable C compiler found in \$PATH +-See \`config.log' for more details" "$LINENO" 5; } +- +-# Provide some information about the compiler. +-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +-set X $ac_compile +-ac_compiler=$2 +-for ac_option in --version -v -V -qversion; do +- { { ac_try="$ac_compiler $ac_option >&5" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compiler $ac_option >&5") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- sed '10a\ +-... rest of stderr output deleted ... +- 10q' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- fi +- rm -f conftest.er1 conftest.err +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +-done +- +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +-# Try to create an executable without -o first, disregard a.out. +-# It will help us diagnose broken compilers, and finding out an intuition +-# of exeext. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +-$as_echo_n "checking whether the C compiler works... " >&6; } +-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +- +-# The possible output files: +-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" +- +-ac_rmfiles= +-for ac_file in $ac_files +-do +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; +- * ) ac_rmfiles="$ac_rmfiles $ac_file";; +- esac +-done +-rm -f $ac_rmfiles +- +-if { { ac_try="$ac_link_default" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link_default") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : +- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +-# in a Makefile. We should not override ac_cv_exeext if it was cached, +-# so that the user can short-circuit this test for compilers unknown to +-# Autoconf. +-for ac_file in $ac_files '' +-do +- test -f "$ac_file" || continue +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) +- ;; +- [ab].out ) +- # We found the default executable, but exeext='' is most +- # certainly right. +- break;; +- *.* ) +- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; +- then :; else +- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- fi +- # We set ac_cv_exeext here because the later test for it is not +- # safe: cross compilers may not add the suffix if given an `-o' +- # argument, so we may need to know it at that point already. +- # Even if this section looks crufty: it has the advantage of +- # actually working. +- break;; +- * ) +- break;; +- esac +-done +-test "$ac_cv_exeext" = no && ac_cv_exeext= +- +-else +- ac_file='' +-fi +-if test -z "$ac_file"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-$as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "C compiler cannot create executables +-See \`config.log' for more details" "$LINENO" 5; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +-$as_echo_n "checking for C compiler default output file name... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +-$as_echo "$ac_file" >&6; } +-ac_exeext=$ac_cv_exeext +- +-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +-ac_clean_files=$ac_clean_files_save +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +-$as_echo_n "checking for suffix of executables... " >&6; } +-if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : +- # If both `conftest.exe' and `conftest' are `present' (well, observable) +-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +-# work properly (i.e., refer to `conftest.exe'), while it won't with +-# `rm'. +-for ac_file in conftest.exe conftest conftest.*; do +- test -f "$ac_file" || continue +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; +- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- break;; +- * ) break;; +- esac +-done +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot compute suffix of executables: cannot compile and link +-See \`config.log' for more details" "$LINENO" 5; } +-fi +-rm -f conftest conftest$ac_cv_exeext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +-$as_echo "$ac_cv_exeext" >&6; } +- +-rm -f conftest.$ac_ext +-EXEEXT=$ac_cv_exeext +-ac_exeext=$EXEEXT +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-int +-main () +-{ +-FILE *f = fopen ("conftest.out", "w"); +- return ferror (f) || fclose (f) != 0; +- +- ; +- return 0; +-} +-_ACEOF +-ac_clean_files="$ac_clean_files conftest.out" +-# Check that the compiler produces executables we can run. If not, either +-# the compiler is broken, or we cross compile. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +-$as_echo_n "checking whether we are cross compiling... " >&6; } +-if test "$cross_compiling" != yes; then +- { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if { ac_try='./conftest$ac_cv_exeext' +- { { case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_try") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then +- cross_compiling=no +- else +- if test "$cross_compiling" = maybe; then +- cross_compiling=yes +- else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run C compiled programs. +-If you meant to cross compile, use \`--host'. +-See \`config.log' for more details" "$LINENO" 5; } +- fi +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +-$as_echo "$cross_compiling" >&6; } +- +-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +-ac_clean_files=$ac_clean_files_save +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +-$as_echo_n "checking for suffix of object files... " >&6; } +-if ${ac_cv_objext+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.o conftest.obj +-if { { ac_try="$ac_compile" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compile") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : +- for ac_file in conftest.o conftest.obj conftest.*; do +- test -f "$ac_file" || continue; +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; +- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` +- break;; +- esac +-done +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot compute suffix of object files: cannot compile +-See \`config.log' for more details" "$LINENO" 5; } +-fi +-rm -f conftest.$ac_cv_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +-$as_echo "$ac_cv_objext" >&6; } +-OBJEXT=$ac_cv_objext +-ac_objext=$OBJEXT +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if ${ac_cv_c_compiler_gnu+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +-#ifndef __GNUC__ +- choke me +-#endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_compiler_gnu=yes +-else +- ac_compiler_gnu=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-ac_cv_c_compiler_gnu=$ac_compiler_gnu +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +-$as_echo "$ac_cv_c_compiler_gnu" >&6; } +-if test $ac_compiler_gnu = yes; then +- GCC=yes +-else +- GCC= +-fi +-ac_test_CFLAGS=${CFLAGS+set} +-ac_save_CFLAGS=$CFLAGS +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +-$as_echo_n "checking whether $CC accepts -g... " >&6; } +-if ${ac_cv_prog_cc_g+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_save_c_werror_flag=$ac_c_werror_flag +- ac_c_werror_flag=yes +- ac_cv_prog_cc_g=no +- CFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_g=yes +-else +- CFLAGS="" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- ac_c_werror_flag=$ac_save_c_werror_flag +- CFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_g=yes +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- ac_c_werror_flag=$ac_save_c_werror_flag +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +-$as_echo "$ac_cv_prog_cc_g" >&6; } +-if test "$ac_test_CFLAGS" = set; then +- CFLAGS=$ac_save_CFLAGS +-elif test $ac_cv_prog_cc_g = yes; then +- if test "$GCC" = yes; then +- CFLAGS="-g -O2" +- else +- CFLAGS="-g" +- fi +-else +- if test "$GCC" = yes; then +- CFLAGS="-O2" +- else +- CFLAGS= +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c89=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-struct stat; +-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +-struct buf { int x; }; +-FILE * (*rcsopen) (struct buf *, struct stat *, int); +-static char *e (p, i) +- char **p; +- int i; +-{ +- return p[i]; +-} +-static char *f (char * (*g) (char **, int), char **p, ...) +-{ +- char *s; +- va_list v; +- va_start (v,p); +- s = g (p, va_arg (v,int)); +- va_end (v); +- return s; +-} +- +-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has +- function prototypes and stuff, but not '\xHH' hex character constants. +- These don't provoke an error unfortunately, instead are silently treated +- as 'x'. The following induces an error, until -std is added to get +- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an +- array size at least. It's necessary to write '\x00'==0 to get something +- that's true only with -std. */ +-int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +- +-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters +- inside strings and character constants. */ +-#define FOO(x) 'x' +-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +- +-int test (int i, double x); +-struct s1 {int (*f) (int a);}; +-struct s2 {int (*f) (double a);}; +-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +-int argc; +-char **argv; +-int +-main () +-{ +-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ +- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c89=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c89" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC +- +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c89" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c89" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c89" != xno; then : +- +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +-$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +-if ${am_cv_prog_cc_c_o+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +- # Make sure it works both with $CC and with simple cc. +- # Following AC_PROG_CC_C_O, we do the test twice because some +- # compilers refuse to overwrite an existing .o file with -o, +- # though they will create one. +- am_cv_prog_cc_c_o=yes +- for am_i in 1 2; do +- if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 +- ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } \ +- && test -f conftest2.$ac_objext; then +- : OK +- else +- am_cv_prog_cc_c_o=no +- break +- fi +- done +- rm -f core conftest* +- unset am_i +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +-$as_echo "$am_cv_prog_cc_c_o" >&6; } +-if test "$am_cv_prog_cc_c_o" != yes; then +- # Losing compiler, so override with the script. +- # FIXME: It is wrong to rewrite CC. +- # But if we don't then we get into trouble of one sort or another. +- # A longer-term fix would be to have automake use am__CC in this case, +- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" +- CC="$am_aux_dir/compile $CC" +-fi +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- case $ac_cv_prog_cc_stdc in @%:@( +- no) : +- ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; @%:@( +- *) : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +-$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +-if ${ac_cv_prog_cc_c99+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c99=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include +-#include +- +-// Check varargs macros. These examples are taken from C99 6.10.3.5. +-#define debug(...) fprintf (stderr, __VA_ARGS__) +-#define showlist(...) puts (#__VA_ARGS__) +-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +-static void +-test_varargs_macros (void) +-{ +- int x = 1234; +- int y = 5678; +- debug ("Flag"); +- debug ("X = %d\n", x); +- showlist (The first, second, and third items.); +- report (x>y, "x is %d but y is %d", x, y); +-} +- +-// Check long long types. +-#define BIG64 18446744073709551615ull +-#define BIG32 4294967295ul +-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +-#if !BIG_OK +- your preprocessor is broken; +-#endif +-#if BIG_OK +-#else +- your preprocessor is broken; +-#endif +-static long long int bignum = -9223372036854775807LL; +-static unsigned long long int ubignum = BIG64; +- +-struct incomplete_array +-{ +- int datasize; +- double data[]; +-}; +- +-struct named_init { +- int number; +- const wchar_t *name; +- double average; +-}; +- +-typedef const char *ccp; +- +-static inline int +-test_restrict (ccp restrict text) +-{ +- // See if C++-style comments work. +- // Iterate through items via the restricted pointer. +- // Also check for declarations in for loops. +- for (unsigned int i = 0; *(text+i) != '\0'; ++i) +- continue; +- return 0; +-} +- +-// Check varargs and va_copy. +-static void +-test_varargs (const char *format, ...) +-{ +- va_list args; +- va_start (args, format); +- va_list args_copy; +- va_copy (args_copy, args); +- +- const char *str; +- int number; +- float fnumber; +- +- while (*format) +- { +- switch (*format++) +- { +- case 's': // string +- str = va_arg (args_copy, const char *); +- break; +- case 'd': // int +- number = va_arg (args_copy, int); +- break; +- case 'f': // float +- fnumber = va_arg (args_copy, double); +- break; +- default: +- break; +- } +- } +- va_end (args_copy); +- va_end (args); +-} +- +-int +-main () +-{ +- +- // Check bool. +- _Bool success = false; +- +- // Check restrict. +- if (test_restrict ("String literal") == 0) +- success = true; +- char *restrict newvar = "Another string"; +- +- // Check varargs. +- test_varargs ("s, d' f .", "string", 65, 34.234); +- test_varargs_macros (); +- +- // Check flexible array members. +- struct incomplete_array *ia = +- malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); +- ia->datasize = 10; +- for (int i = 0; i < ia->datasize; ++i) +- ia->data[i] = i * 1.234; +- +- // Check named initializers. +- struct named_init ni = { +- .number = 34, +- .name = L"Test wide string", +- .average = 543.34343, +- }; +- +- ni.number = 58; +- +- int dynamic_array[ni.number]; +- dynamic_array[ni.number - 1] = 543; +- +- // work around unused variable warnings +- return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' +- || dynamic_array[ni.number - 1] != 543); +- +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c99=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c99" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC +- +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c99" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c99" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +-$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c99" != xno; then : +- ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c89=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-struct stat; +-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +-struct buf { int x; }; +-FILE * (*rcsopen) (struct buf *, struct stat *, int); +-static char *e (p, i) +- char **p; +- int i; +-{ +- return p[i]; +-} +-static char *f (char * (*g) (char **, int), char **p, ...) +-{ +- char *s; +- va_list v; +- va_start (v,p); +- s = g (p, va_arg (v,int)); +- va_end (v); +- return s; +-} +- +-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has +- function prototypes and stuff, but not '\xHH' hex character constants. +- These don't provoke an error unfortunately, instead are silently treated +- as 'x'. The following induces an error, until -std is added to get +- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an +- array size at least. It's necessary to write '\x00'==0 to get something +- that's true only with -std. */ +-int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +- +-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters +- inside strings and character constants. */ +-#define FOO(x) 'x' +-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +- +-int test (int i, double x); +-struct s1 {int (*f) (int a);}; +-struct s2 {int (*f) (double a);}; +-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +-int argc; +-char **argv; +-int +-main () +-{ +-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ +- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c89=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c89" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC +- +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c89" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c89" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c89" != xno; then : +- ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +-else +- ac_cv_prog_cc_stdc=no +-fi +- +-fi +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +-$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } +- if ${ac_cv_prog_cc_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +- +- case $ac_cv_prog_cc_stdc in @%:@( +- no) : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; @%:@( +- '') : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; @%:@( +- *) : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +-$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +-esac +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +-$as_echo_n "checking how to run the C preprocessor... " >&6; } +-# On Suns, sometimes $CPP names a directory. +-if test -n "$CPP" && test -d "$CPP"; then +- CPP= +-fi +-if test -z "$CPP"; then +- if ${ac_cv_prog_CPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CPP needs to be expanded +- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" +- do +- ac_preproc_ok=false +-for ac_c_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- break +-fi +- +- done +- ac_cv_prog_CPP=$CPP +- +-fi +- CPP=$ac_cv_prog_CPP +-else +- ac_cv_prog_CPP=$CPP +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +-$as_echo "$CPP" >&6; } +-ac_preproc_ok=false +-for ac_c_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- +-# The C compiler on the build system, and associated tests. +- +-if test -n "$CC_FOR_BUILD"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system compiler $CC_FOR_BUILD" >&5 +-$as_echo_n "checking build system compiler $CC_FOR_BUILD... " >&6; } +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&5 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cc_for_build_works" >&5 +-$as_echo "$cc_for_build_works" >&6; } +-if test "$cc_for_build_works" = yes; then +- : +-else +- as_fn_error $? "Specified CC_FOR_BUILD doesn't seem to work" "$LINENO" 5 +-fi +- +-elif test -n "$HOST_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system compiler $HOST_CC" >&5 +-$as_echo_n "checking build system compiler $HOST_CC... " >&6; } +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&5 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cc_for_build_works" >&5 +-$as_echo "$cc_for_build_works" >&6; } +-if test "$cc_for_build_works" = yes; then +- CC_FOR_BUILD=$HOST_CC +-else +- as_fn_error $? "Specified HOST_CC doesn't seem to work" "$LINENO" 5 +-fi +- +-else +- for i in "$CC" "$CC $CFLAGS $CPPFLAGS" cc gcc c89 c99; do +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system compiler $i" >&5 +-$as_echo_n "checking build system compiler $i... " >&6; } +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&5 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cc_for_build_works" >&5 +-$as_echo "$cc_for_build_works" >&6; } +-if test "$cc_for_build_works" = yes; then +- CC_FOR_BUILD=$i +- break +-else +- : +-fi +- +- done +- if test -z "$CC_FOR_BUILD"; then +- as_fn_error $? "Cannot find a build system compiler" "$LINENO" 5 +- fi +-fi +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system preprocessor" >&5 +-$as_echo_n "checking for build system preprocessor... " >&6; } +-if test -z "$CPP_FOR_BUILD"; then +- if ${gmp_cv_prog_cpp_for_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } >&5 2>&1; then +- gmp_cv_prog_cpp_for_build=$i +- break +- fi +- done +- rm -f conftest* a.out b.out a.exe a_out.exe +- if test -z "$gmp_cv_prog_cpp_for_build"; then +- as_fn_error $? "Cannot find build system C preprocessor." "$LINENO" 5 +- fi +- +-fi +- +- CPP_FOR_BUILD=$gmp_cv_prog_cpp_for_build +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP_FOR_BUILD" >&5 +-$as_echo "$CPP_FOR_BUILD" >&6; } +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system executable suffix" >&5 +-$as_echo_n "checking for build system executable suffix... " >&6; } +-if ${gmp_cv_prog_exeext_for_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./conftest) 2>&5; then +- gmp_cv_prog_exeext_for_build=$i +- break +- fi +- fi +-done +-rm -f conftest* +-if test "${gmp_cv_prog_exeext_for_build+set}" != set; then +- as_fn_error $? "Cannot determine executable suffix" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_prog_exeext_for_build" >&5 +-$as_echo "$gmp_cv_prog_exeext_for_build" >&6; } +-EXEEXT_FOR_BUILD=$gmp_cv_prog_exeext_for_build +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build system compiler is ANSI" >&5 +-$as_echo_n "checking whether build system compiler is ANSI... " >&6; } +-if ${gmp_cv_c_for_build_ansi+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_cv_c_for_build_ansi=yes +-else +- gmp_cv_c_for_build_ansi=no +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_for_build_ansi" >&5 +-$as_echo "$gmp_cv_c_for_build_ansi" >&6; } +-if test "$gmp_cv_c_for_build_ansi" = yes; then +- U_FOR_BUILD= +-else +- U_FOR_BUILD=_ +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system compiler math library" >&5 +-$as_echo_n "checking for build system compiler math library... " >&6; } +-if ${gmp_cv_check_libm_for_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_cv_check_libm_for_build=-lm +-else +- gmp_cv_check_libm_for_build=no +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_check_libm_for_build" >&5 +-$as_echo "$gmp_cv_check_libm_for_build" >&6; } +-case $gmp_cv_check_libm_for_build in +- yes) LIBM_FOR_BUILD=-lm +- ;; +- no) LIBM_FOR_BUILD= ;; +- *) LIBM_FOR_BUILD=$gmp_cv_check_libm_for_build ;; +-esac +- +- +- +-# How to assemble, used with CFLAGS etc, see mpn/Makeasm.am. +-# Using the compiler is a lot easier than figuring out how to invoke the +-# assembler directly. +-# +-test -n "$CCAS" || CCAS="$CC -c" +- +- +- +-# The C++ compiler, if desired. +-want_cxx=no +-if test $enable_cxx != no; then +- test_CXXFLAGS=${CXXFLAGS+set} +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +-if test -z "$CXX"; then +- if test -n "$CCC"; then +- CXX=$CCC +- else +- if test -n "$ac_tool_prefix"; then +- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CXX"; then +- ac_cv_prog_CXX="$CXX" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CXX=$ac_cv_prog_CXX +-if test -n "$CXX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +-$as_echo "$CXX" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$CXX" && break +- done +-fi +-if test -z "$CXX"; then +- ac_ct_CXX=$CXX +- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_CXX"; then +- ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_CXX="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +-if test -n "$ac_ct_CXX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +-$as_echo "$ac_ct_CXX" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_CXX" && break +-done +- +- if test "x$ac_ct_CXX" = x; then +- CXX="g++" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- CXX=$ac_ct_CXX +- fi +-fi +- +- fi +-fi +-# Provide some information about the compiler. +-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +-set X $ac_compile +-ac_compiler=$2 +-for ac_option in --version -v -V -qversion; do +- { { ac_try="$ac_compiler $ac_option >&5" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compiler $ac_option >&5") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- sed '10a\ +-... rest of stderr output deleted ... +- 10q' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- fi +- rm -f conftest.er1 conftest.err +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +-done +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +-if ${ac_cv_cxx_compiler_gnu+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +-#ifndef __GNUC__ +- choke me +-#endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_compiler_gnu=yes +-else +- ac_compiler_gnu=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +-if test $ac_compiler_gnu = yes; then +- GXX=yes +-else +- GXX= +-fi +-ac_test_CXXFLAGS=${CXXFLAGS+set} +-ac_save_CXXFLAGS=$CXXFLAGS +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +-$as_echo_n "checking whether $CXX accepts -g... " >&6; } +-if ${ac_cv_prog_cxx_g+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_save_cxx_werror_flag=$ac_cxx_werror_flag +- ac_cxx_werror_flag=yes +- ac_cv_prog_cxx_g=no +- CXXFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_cv_prog_cxx_g=yes +-else +- CXXFLAGS="" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- +-else +- ac_cxx_werror_flag=$ac_save_cxx_werror_flag +- CXXFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_cv_prog_cxx_g=yes +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- ac_cxx_werror_flag=$ac_save_cxx_werror_flag +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +-$as_echo "$ac_cv_prog_cxx_g" >&6; } +-if test "$ac_test_CXXFLAGS" = set; then +- CXXFLAGS=$ac_save_CXXFLAGS +-elif test $ac_cv_prog_cxx_g = yes; then +- if test "$GXX" = yes; then +- CXXFLAGS="-g -O2" +- else +- CXXFLAGS="-g" +- fi +-else +- if test "$GXX" = yes; then +- CXXFLAGS="-O2" +- else +- CXXFLAGS= +- fi +-fi +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- echo "CXXFLAGS chosen by autoconf: $CXXFLAGS" >&5 +- cxxflags_ac_prog_cxx=$CXXFLAGS +- cxxflags_list=ac_prog_cxx +- +- # If the user didn't specify $CXXFLAGS, then try $CFLAGS, with -g removed +- # if AC_PROG_CXX thinks that doesn't work. $CFLAGS stands a good chance +- # of working, eg. on a GNU system where CC=gcc and CXX=g++. +- # +- if test "$test_CXXFLAGS" != set; then +- cxxflags_cflags=$CFLAGS +- cxxflags_list="cflags $cxxflags_list" +- if test "$ac_prog_cxx_g" = no; then +- cxxflags_cflags=`echo "$cxxflags_cflags" | sed -e 's/ -g //' -e 's/^-g //' -e 's/ -g$//'` +- fi +- fi +- +- # See if the C++ compiler works. If the user specified CXXFLAGS then all +- # we're doing is checking whether AC_PROG_CXX succeeded, since it doesn't +- # give a fatal error, just leaves CXX set to a default g++. If on the +- # other hand the user didn't specify CXXFLAGS then we get to try here our +- # $cxxflags_list alternatives. +- # +- # Automake includes $CPPFLAGS in a C++ compile, so we do the same here. +- # +- for cxxflags_choice in $cxxflags_list; do +- eval CXXFLAGS=\"\$cxxflags_$cxxflags_choice\" +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler $CXX $CPPFLAGS $CXXFLAGS" >&5 +-$as_echo_n "checking C++ compiler $CXX $CPPFLAGS $CXXFLAGS... " >&6; } +-gmp_prog_cxx_works=yes +- +-# start with a plain "main()", then go on to further checks +-if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <&5 +- gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS conftest.cc >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_cxxcompile\""; } >&5 +- (eval $gmp_cxxcompile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- gmp_prog_cxx_works="no, program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&5 +- cat conftest.cc >&5 +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +- +- +-if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <&5 +- gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS conftest.cc >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_cxxcompile\""; } >&5 +- (eval $gmp_cxxcompile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- gmp_prog_cxx_works="no, namespace, program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no, namespace" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&5 +- cat conftest.cc >&5 +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +- +- +-# GMP requires the standard C++ iostream classes +-if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <, only a +- pre-standard iostream.h. */ +-#include +- +-/* This test rejects OSF 5.1 Compaq C++ in its default pre-standard iostream +- mode, since that mode puts cout in the global namespace, not "std". */ +-void someoutput (void) { std::cout << 123; } +- +-int main (void) { return 0; } +-EOF +- echo "Test compile: std iostream" >&5 +- gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS conftest.cc >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_cxxcompile\""; } >&5 +- (eval $gmp_cxxcompile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- gmp_prog_cxx_works="no, std iostream, program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no, std iostream" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&5 +- cat conftest.cc >&5 +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cxx_works" >&5 +-$as_echo "$gmp_prog_cxx_works" >&6; } +-case $gmp_prog_cxx_works in +- yes) +- want_cxx=yes +- break +- ;; +- *) +- +- ;; +-esac +- +- done +- +- # If --enable-cxx=yes but a C++ compiler can't be found, then abort. +- if test $want_cxx = no && test $enable_cxx = yes; then +- as_fn_error $? "C++ compiler not available, see config.log for details" "$LINENO" 5 +- fi +-fi +- +- if test $want_cxx = yes; then +- WANT_CXX_TRUE= +- WANT_CXX_FALSE='#' +-else +- WANT_CXX_TRUE='#' +- WANT_CXX_FALSE= +-fi +- +- +-# FIXME: We're not interested in CXXCPP for ourselves, but if we don't do it +-# here then AC_PROG_LIBTOOL will AC_REQUIRE it (via _LT_AC_TAGCONFIG) and +-# hence execute it unconditionally, and that will fail if there's no C++ +-# compiler (and no generic /lib/cpp). +-# +-if test $want_cxx = yes; then +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +-$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +-if test -z "$CXXCPP"; then +- if ${ac_cv_prog_CXXCPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CXXCPP needs to be expanded +- for CXXCPP in "$CXX -E" "/lib/cpp" +- do +- ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- break +-fi +- +- done +- ac_cv_prog_CXXCPP=$CXXCPP +- +-fi +- CXXCPP=$ac_cv_prog_CXXCPP +-else +- ac_cv_prog_CXXCPP=$CXXCPP +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +-$as_echo "$CXXCPP" >&6; } +-ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-fi +- +- +-# Path setups for Cray, according to IEEE or CFP. These must come after +-# deciding the compiler. +-# +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +-$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if ${ac_cv_path_GREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$GREP"; then +- ac_path_GREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in grep ggrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_GREP" || continue +-# Check for GNU ac_path_GREP and select it if it is found. +- # Check for GNU $ac_path_GREP +-case `"$ac_path_GREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'GREP' >> "conftest.nl" +- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_GREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_GREP="$ac_path_GREP" +- ac_path_GREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_GREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_GREP"; then +- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_GREP=$GREP +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +-$as_echo "$ac_cv_path_GREP" >&6; } +- GREP="$ac_cv_path_GREP" +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +-$as_echo_n "checking for egrep... " >&6; } +-if ${ac_cv_path_EGREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +- then ac_cv_path_EGREP="$GREP -E" +- else +- if test -z "$EGREP"; then +- ac_path_EGREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in egrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_EGREP" || continue +-# Check for GNU ac_path_EGREP and select it if it is found. +- # Check for GNU $ac_path_EGREP +-case `"$ac_path_EGREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'EGREP' >> "conftest.nl" +- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_EGREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_EGREP="$ac_path_EGREP" +- ac_path_EGREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_EGREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_EGREP"; then +- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_EGREP=$EGREP +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +-$as_echo "$ac_cv_path_EGREP" >&6; } +- EGREP="$ac_cv_path_EGREP" +- +- +-case $host_cpu in +- c90 | t90) +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#ifdef _CRAYIEEE +-yes +-#endif +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "yes" >/dev/null 2>&1; then : +- add_path="cray/ieee" +-else +- add_path="cray/cfp"; extra_functions="mulwwc90" +-fi +-rm -f conftest* +- +- ;; +- j90 | sv1) +- add_path="cray/cfp"; extra_functions="mulwwj90" +- ;; +-esac +- +- +- +-if test -z "$MPN_PATH"; then +- path="$add_path $path" +-fi +- +-# For a nail build, also look in "nails" subdirectories. +-# +-if test $GMP_NAIL_BITS != 0 && test -z "$MPN_PATH"; then +- new_path= +- for i in $path; do +- case $i in +- generic) new_path="$new_path $i" ;; +- *) new_path="$new_path $i/nails $i" ;; +- esac +- done +- path=$new_path +-fi +- +- +-# Put all directories into CPUVEC_list so as to get a full set of +-# CPUVEC_SETUP_$tmp_suffix defines into config.h, even if some of them are +-# empty because mmx and/or sse2 had to be dropped. +-# +-for i in $fat_path; do +- tmp_suffix=`echo $i | sed -e '/\//s:^[^/]*/::' -e 's:[\\/]:_:g'` +- CPUVEC_list="$CPUVEC_list CPUVEC_SETUP_$tmp_suffix" +-done +- +- +-# If there's any sse2 or mmx in the path, check whether the assembler +-# supports it, and remove if not. +-# +-# We only need this in ABI=32, for ABI=64 on x86_64 we can assume a new +-# enough assembler. +-# +-case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- if test "$ABI" = 32; then +- case "$path $fat_path" in +- *mmx*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about MMX instructions" >&5 +-$as_echo_n "checking if the assembler knows about MMX instructions... " >&6; } +-if ${gmp_cv_asm_x86_mmx+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_mmx=yes +-case $host in +-*-*-solaris*) +- if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then +- if grep "0f 6f c1" conftest.out >/dev/null; then +- gmp_cv_asm_x86_mmx=movq-bug +- fi +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"dis\" not available to check for \"as\" movq bug" >&5 +-$as_echo "$as_me: WARNING: \"dis\" not available to check for \"as\" movq bug" >&2;} +- fi +-esac +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_mmx=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_mmx" >&5 +-$as_echo "$gmp_cv_asm_x86_mmx" >&6; } +- +-case $gmp_cv_asm_x86_mmx in +-movq-bug) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has MMX code, but the assembler" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has MMX code, but the assembler" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | has the Solaris 2.6 and 2.7 bug where register to register" >&5 +-$as_echo "$as_me: WARNING: | has the Solaris 2.6 and 2.7 bug where register to register" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | movq operands are reversed." >&5 +-$as_echo "$as_me: WARNING: | movq operands are reversed." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Non-MMX replacements will be used." >&5 +-$as_echo "$as_me: WARNING: | Non-MMX replacements will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- ;; +-no) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has MMX code, but it can't be assembled by" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has MMX code, but it can't be assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Non-MMX replacements will be used." >&5 +-$as_echo "$as_me: WARNING: | Non-MMX replacements will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- ;; +-esac +-if test "$gmp_cv_asm_x86_mmx" = yes; then +- : +-else +- tmp_path= +-for i in $path; do +- case $i in +- */*mmx*) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */*mmx*) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +-fi +- ;; +- esac +- case "$path $fat_path" in +- *sse2*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about SSE2 instructions" >&5 +-$as_echo_n "checking if the assembler knows about SSE2 instructions... " >&6; } +-if ${gmp_cv_asm_x86_sse2+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_sse2=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_sse2=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_sse2" >&5 +-$as_echo "$gmp_cv_asm_x86_sse2" >&6; } +-case $gmp_cv_asm_x86_sse2 in +-yes) +- : +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has SSE2 code, but it can't be assembled by" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has SSE2 code, but it can't be assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Non-SSE2 replacements will be used." >&5 +-$as_echo "$as_me: WARNING: | Non-SSE2 replacements will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- tmp_path= +-for i in $path; do +- case $i in +- */sse2) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */sse2) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +- ;; +-esac +- ;; +- esac +- fi +- case "$path $fat_path" in +- *mulx*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about the mulx instruction" >&5 +-$as_echo_n "checking if the assembler knows about the mulx instruction... " >&6; } +-if ${gmp_cv_asm_x86_mulx+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_mulx=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_mulx=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_mulx" >&5 +-$as_echo "$gmp_cv_asm_x86_mulx" >&6; } +-case $gmp_cv_asm_x86_mulx in +-yes) +- : +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has the mulx instruction, but it can't be" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has the mulx instruction, but it can't be" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | assembled by" >&5 +-$as_echo "$as_me: WARNING: | assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Older x86 instructions will be used." >&5 +-$as_echo "$as_me: WARNING: | Older x86 instructions will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- tmp_path= +-for i in $path; do +- case $i in +- */mulx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */mulx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +- ;; +-esac +- ;; +- esac +- case "$path $fat_path" in +- *adx*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about the adox instruction" >&5 +-$as_echo_n "checking if the assembler knows about the adox instruction... " >&6; } +-if ${gmp_cv_asm_x86_adx+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_adx=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_adx=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_adx" >&5 +-$as_echo "$gmp_cv_asm_x86_adx" >&6; } +-case $gmp_cv_asm_x86_adx in +-yes) +- : +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has the adcx and adox instructions, but they" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has the adcx and adox instructions, but they" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | can't be assembled by" >&5 +-$as_echo "$as_me: WARNING: | can't be assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Older x86 instructions will be used." >&5 +-$as_echo "$as_me: WARNING: | Older x86 instructions will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- tmp_path= +-for i in $path; do +- case $i in +- */adx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */adx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +- ;; +-esac +- ;; +- esac +- ;; +-esac +- +- +-if test "$enable_assembly" = "no"; then +- path="generic" +- CFLAGS="$CFLAGS -DNO_ASM" +-# for abi in $abilist; do +-# eval unset "path_\$abi" +-# eval gcc_${abi}_cflags=\"\$gcc_${abi}_cflags -DNO_ASM\" +-# done +-fi +- +- +-cat >&5 <&5 +-$as_echo_n "checking whether assembler supports --noexecstack option... " >&6; } +-if ${cl_cv_as_noexecstack+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat > conftest.c <&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; } \ +- && grep .note.GNU-stack conftest.s >/dev/null \ +- && { ac_try='${CC} $CFLAGS $CPPFLAGS -Wa,--noexecstack +- -c -o conftest.o conftest.s >/dev/null' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; } +- then +- cl_cv_as_noexecstack=yes +- else +- cl_cv_as_noexecstack=no +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cl_cv_as_noexecstack" >&5 +-$as_echo "$cl_cv_as_noexecstack" >&6; } +- if test "$cl_cv_as_noexecstack" = yes; then +- ASMFLAGS="$ASMFLAGS -Wa,--noexecstack" +- fi +- +- +- +- +-gmp_user_AR=$AR +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ar; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AR"; then +- ac_cv_prog_AR="$AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AR="${ac_tool_prefix}ar" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AR=$ac_cv_prog_AR +-if test -n "$AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +-$as_echo "$AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_AR"; then +- ac_ct_AR=$AR +- # Extract the first word of "ar", so it can be a program name with args. +-set dummy ar; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AR"; then +- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_AR="ar" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_AR=$ac_cv_prog_ac_ct_AR +-if test -n "$ac_ct_AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +-$as_echo "$ac_ct_AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_AR" = x; then +- AR="ar" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- AR=$ac_ct_AR +- fi +-else +- AR="$ac_cv_prog_AR" +-fi +- +-if test -z "$gmp_user_AR"; then +- eval arflags=\"\$ar${abi1}_flags\" +- test -n "$arflags" || eval arflags=\"\$ar${abi2}_flags\" +- if test -n "$arflags"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra ar flags" >&5 +-$as_echo_n "checking for extra ar flags... " >&6; } +- AR="$AR $arflags" +- ac_cv_prog_AR="$AR $arflags" +- ac_cv_prog_ac_ct_AR="$AR $arflags" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $arflags" >&5 +-$as_echo "$arflags" >&6; } +- fi +-fi +-if test -z "$AR_FLAGS"; then +- AR_FLAGS=cq +-fi +- +- +-gmp_user_NM=$NM +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +-if ${lt_cv_path_NM+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$NM"; then +- # Let the user override the test. +- lt_cv_path_NM="$NM" +-else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/$lt_tmp_nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no} +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +-$as_echo "$lt_cv_path_NM" >&6; } +-if test "$lt_cv_path_NM" != "no"; then +- NM="$lt_cv_path_NM" +-else +- # Didn't find any BSD compatible name lister, look for dumpbin. +- if test -n "$DUMPBIN"; then : +- # Let the user override the test. +- else +- if test -n "$ac_tool_prefix"; then +- for ac_prog in dumpbin "link -dump" +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DUMPBIN"; then +- ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DUMPBIN=$ac_cv_prog_DUMPBIN +-if test -n "$DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +-$as_echo "$DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$DUMPBIN" && break +- done +-fi +-if test -z "$DUMPBIN"; then +- ac_ct_DUMPBIN=$DUMPBIN +- for ac_prog in dumpbin "link -dump" +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DUMPBIN"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +-if test -n "$ac_ct_DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +-$as_echo "$ac_ct_DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_DUMPBIN" && break +-done +- +- if test "x$ac_ct_DUMPBIN" = x; then +- DUMPBIN=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DUMPBIN=$ac_ct_DUMPBIN +- fi +-fi +- +- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in +- *COFF*) +- DUMPBIN="$DUMPBIN -symbols" +- ;; +- *) +- DUMPBIN=: +- ;; +- esac +- fi +- +- if test "$DUMPBIN" != ":"; then +- NM="$DUMPBIN" +- fi +-fi +-test -z "$NM" && NM=nm +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +-$as_echo_n "checking the name lister ($NM) interface... " >&6; } +-if ${lt_cv_nm_interface+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: output\"" >&5) +- cat conftest.out >&5 +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +-$as_echo "$lt_cv_nm_interface" >&6; } +- +- +-# FIXME: When cross compiling (ie. $ac_tool_prefix not empty), libtool +-# defaults to plain "nm" if a "${ac_tool_prefix}nm" is not found. In this +-# case run it again to try the native "nm", firstly so that likely locations +-# are searched, secondly so that -B or -p are added if necessary for BSD +-# format. This is necessary for instance on OSF with "./configure +-# --build=alphaev5-dec-osf --host=alphaev6-dec-osf". +-# +-if test -z "$gmp_user_NM" && test -n "$ac_tool_prefix" && test "$NM" = nm; then +- $as_unset lt_cv_path_NM +- gmp_save_ac_tool_prefix=$ac_tool_prefix +- ac_tool_prefix= +- NM= +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +-if ${lt_cv_path_NM+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$NM"; then +- # Let the user override the test. +- lt_cv_path_NM="$NM" +-else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/$lt_tmp_nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no} +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +-$as_echo "$lt_cv_path_NM" >&6; } +-if test "$lt_cv_path_NM" != "no"; then +- NM="$lt_cv_path_NM" +-else +- # Didn't find any BSD compatible name lister, look for dumpbin. +- if test -n "$DUMPBIN"; then : +- # Let the user override the test. +- else +- if test -n "$ac_tool_prefix"; then +- for ac_prog in dumpbin "link -dump" +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DUMPBIN"; then +- ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DUMPBIN=$ac_cv_prog_DUMPBIN +-if test -n "$DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +-$as_echo "$DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$DUMPBIN" && break +- done +-fi +-if test -z "$DUMPBIN"; then +- ac_ct_DUMPBIN=$DUMPBIN +- for ac_prog in dumpbin "link -dump" +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DUMPBIN"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +-if test -n "$ac_ct_DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +-$as_echo "$ac_ct_DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_DUMPBIN" && break +-done +- +- if test "x$ac_ct_DUMPBIN" = x; then +- DUMPBIN=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DUMPBIN=$ac_ct_DUMPBIN +- fi +-fi +- +- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in +- *COFF*) +- DUMPBIN="$DUMPBIN -symbols" +- ;; +- *) +- DUMPBIN=: +- ;; +- esac +- fi +- +- if test "$DUMPBIN" != ":"; then +- NM="$DUMPBIN" +- fi +-fi +-test -z "$NM" && NM=nm +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +-$as_echo_n "checking the name lister ($NM) interface... " >&6; } +-if ${lt_cv_nm_interface+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: output\"" >&5) +- cat conftest.out >&5 +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +-$as_echo "$lt_cv_nm_interface" >&6; } +- +- ac_tool_prefix=$gmp_save_ac_tool_prefix +-fi +- +-if test -z "$gmp_user_NM"; then +- eval nmflags=\"\$nm${abi1}_flags\" +- test -n "$nmflags" || eval nmflags=\"\$nm${abi2}_flags\" +- if test -n "$nmflags"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra nm flags" >&5 +-$as_echo_n "checking for extra nm flags... " >&6; } +- NM="$NM $nmflags" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmflags" >&5 +-$as_echo "$nmflags" >&6; } +- fi +-fi +- +- +-case $host in +- # FIXME: On AIX 3 and 4, $libname.a is included in libtool +- # $library_names_spec, so libgmp.a becomes a symlink to libgmp.so, making +- # it impossible to build shared and static libraries simultaneously. +- # Disable shared libraries by default, but let the user override with +- # --enable-shared --disable-static. +- # +- # FIXME: This $libname.a problem looks like it might apply to *-*-amigaos* +- # and *-*-os2* too, but wait for someone to test this before worrying +- # about it. If there is a problem then of course libtool is the right +- # place to fix it. +- # +- *-*-aix[34]*) +- if test -z "$enable_shared"; then enable_shared=no; fi ;; +-esac +- +- +-# Configs for Windows DLLs. +- +-enable_win32_dll=yes +- +-case $host in +-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +-set dummy ${ac_tool_prefix}as; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AS+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AS"; then +- ac_cv_prog_AS="$AS" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AS="${ac_tool_prefix}as" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AS=$ac_cv_prog_AS +-if test -n "$AS"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +-$as_echo "$AS" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_AS"; then +- ac_ct_AS=$AS +- # Extract the first word of "as", so it can be a program name with args. +-set dummy as; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_AS+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AS"; then +- ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_AS="as" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_AS=$ac_cv_prog_ac_ct_AS +-if test -n "$ac_ct_AS"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +-$as_echo "$ac_ct_AS" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_AS" = x; then +- AS="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- AS=$ac_ct_AS +- fi +-else +- AS="$ac_cv_prog_AS" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +-set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DLLTOOL"; then +- ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DLLTOOL=$ac_cv_prog_DLLTOOL +-if test -n "$DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +-$as_echo "$DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_DLLTOOL"; then +- ac_ct_DLLTOOL=$DLLTOOL +- # Extract the first word of "dlltool", so it can be a program name with args. +-set dummy dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DLLTOOL"; then +- ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DLLTOOL="dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +-if test -n "$ac_ct_DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +-$as_echo "$ac_ct_DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_DLLTOOL" = x; then +- DLLTOOL="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DLLTOOL=$ac_ct_DLLTOOL +- fi +-else +- DLLTOOL="$ac_cv_prog_DLLTOOL" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +-set dummy ${ac_tool_prefix}objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OBJDUMP"; then +- ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OBJDUMP=$ac_cv_prog_OBJDUMP +-if test -n "$OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +-$as_echo "$OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OBJDUMP"; then +- ac_ct_OBJDUMP=$OBJDUMP +- # Extract the first word of "objdump", so it can be a program name with args. +-set dummy objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OBJDUMP"; then +- ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OBJDUMP="objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +-if test -n "$ac_ct_OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +-$as_echo "$ac_ct_OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OBJDUMP" = x; then +- OBJDUMP="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OBJDUMP=$ac_ct_OBJDUMP +- fi +-else +- OBJDUMP="$ac_cv_prog_OBJDUMP" +-fi +- +- ;; +-esac +- +-test -z "$AS" && AS=as +- +- +- +- +- +-test -z "$DLLTOOL" && DLLTOOL=dlltool +- +- +- +- +- +-test -z "$OBJDUMP" && OBJDUMP=objdump +- +- +- +- +- +- +- +- +-LIBGMP_DLL=0 +- +-case $host in +- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) +- # By default, build only static. +- if test -z "$enable_shared"; then +- enable_shared=no +- fi +- # Don't allow both static and DLL. +- if test "$enable_shared" != no && test "$enable_static" != no; then +- as_fn_error $? "cannot build both static and DLL, since gmp.h is different for each. +-Use \"--disable-static --enable-shared\" to build just a DLL." "$LINENO" 5 +- fi +- +- # "-no-undefined" is required when building a DLL, see documentation on +- # AC_LIBTOOL_WIN32_DLL. +- # +- # "-Wl,--export-all-symbols" is a bit of a hack, it gets all libgmp and +- # libgmpxx functions and variables exported. This is what libtool did +- # in the past, and it's convenient for us in the test programs. +- # +- # Maybe it'd be prudent to check for --export-all-symbols before using +- # it, but it seems to have been in ld since at least 2000, and there's +- # not really any alternative we want to take up at the moment. +- # +- # "-Wl,output-def" is used to get a .def file for use by MS lib to make +- # a .lib import library, described in the manual. libgmp-3.dll.def +- # corresponds to the libmp-3.dll.def generated by libtool (as a result +- # of -export-symbols on that library). +- # +- # Incidentally, libtool does generate an import library libgmp.dll.a, +- # but it's "ar" format and cannot be used by the MS linker. There +- # doesn't seem to be any GNU tool for generating or converting to .lib. +- # +- # FIXME: The .def files produced by -Wl,output-def include isascii, +- # iscsym, iscsymf and toascii, apparently because mingw ctype.h doesn't +- # inline isascii (used in gmp). It gives an extern inline for +- # __isascii, but for some reason not the plain isascii. +- # +- if test "$enable_shared" = yes; then +- GMP_LDFLAGS="$GMP_LDFLAGS -no-undefined -Wl,--export-all-symbols" +- LIBGMP_LDFLAGS="$LIBGMP_LDFLAGS -Wl,--output-def,.libs/libgmp-3.dll.def" +- LIBGMPXX_LDFLAGS="$LIBGMP_LDFLAGS -Wl,--output-def,.libs/libgmpxx-3.dll.def" +- LIBGMP_DLL=1 +- fi +- ;; +-esac +- +- +-# Ensure that $CONFIG_SHELL is available for AC_LIBTOOL_SYS_MAX_CMD_LEN. +-# It's often set already by _LT_AC_PROG_ECHO_BACKSLASH or +-# _AS_LINENO_PREPARE, but not always. +-# +-# The symptom of CONFIG_SHELL unset is some "expr" errors during the test, +-# and an empty result. This only happens when invoked as "sh configure", +-# ie. no path, and can be seen for instance on ia64-*-hpux*. +-# +-# FIXME: Newer libtool should have it's own fix for this. +-# +-if test -z "$CONFIG_SHELL"; then +- CONFIG_SHELL=$SHELL +-fi +- +-# Enable CXX in libtool only if we want it, and never enable GCJ, nor RC on +-# mingw and cygwin. Under --disable-cxx this avoids some error messages +-# from libtool arising from the fact we didn't actually run AC_PROG_CXX. +-# Notice that any user-supplied --with-tags setting takes precedence. +-# +-# FIXME: Is this the right way to get this effect? Very possibly not, but +-# the current _LT_AC_TAGCONFIG doesn't really suggest an alternative. +-# +-if test "${with_tags+set}" != set; then +- if test $want_cxx = yes; then +- with_tags=CXX +- else +- with_tags= +- fi +-fi +- +-# The dead hand of AC_REQUIRE makes AC_PROG_LIBTOOL expand and execute +-# AC_PROG_F77, even when F77 is not in the selected with_tags. This is +-# probably harmless, but it's unsightly and bloats our configure, so pretend +-# AC_PROG_F77 has been expanded already. +-# +-# FIXME: Rumour has it libtool will one day provide a way for a configure.in +-# to say what it wants from among supported languages etc. +-# +-#AC_PROVIDE([AC_PROG_F77]) +- +-case `pwd` in +- *\ * | *\ *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +-esac +- +- +- +-macro_version='2.4.2' +-macro_revision='1.3337' +- +- +- +- +- +- +- +- +- +- +- +- +- +-ltmain="$ac_aux_dir/ltmain.sh" +- +-# Backslashify metacharacters that are still active within +-# double-quoted strings. +-sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +- +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\(["`\\]\)/\\\1/g' +- +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +- +-# Sed substitution to delay expansion of an escaped single quote. +-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +- +-# Sed substitution to avoid accidental globbing in evaled expressions +-no_glob_subst='s/\*/\\\*/g' +- +-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +-$as_echo_n "checking how to print strings... " >&6; } +-# Test print first, because it will be a builtin if present. +-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ +- test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then +- ECHO='print -r --' +-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then +- ECHO='printf %s\n' +-else +- # Use this function as a fallback that always works. +- func_fallback_echo () +- { +- eval 'cat <<_LTECHO_EOF +-$1 +-_LTECHO_EOF' +- } +- ECHO='func_fallback_echo' +-fi +- +-# func_echo_all arg... +-# Invoke $ECHO with all args, space-separated. +-func_echo_all () +-{ +- $ECHO "" +-} +- +-case "$ECHO" in +- printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +-$as_echo "printf" >&6; } ;; +- print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +-$as_echo "print -r" >&6; } ;; +- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +-$as_echo "cat" >&6; } ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +-$as_echo_n "checking for a sed that does not truncate output... " >&6; } +-if ${ac_cv_path_SED+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +- for ac_i in 1 2 3 4 5 6 7; do +- ac_script="$ac_script$as_nl$ac_script" +- done +- echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed +- { ac_script=; unset ac_script;} +- if test -z "$SED"; then +- ac_path_SED_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in sed gsed; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_SED" || continue +-# Check for GNU ac_path_SED and select it if it is found. +- # Check for GNU $ac_path_SED +-case `"$ac_path_SED" --version 2>&1` in +-*GNU*) +- ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo '' >> "conftest.nl" +- "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_SED_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_SED="$ac_path_SED" +- ac_path_SED_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_SED_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_SED"; then +- as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 +- fi +-else +- ac_cv_path_SED=$SED +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +-$as_echo "$ac_cv_path_SED" >&6; } +- SED="$ac_cv_path_SED" +- rm -f conftest.sed +- +-test -z "$SED" && SED=sed +-Xsed="$SED -e 1s/^X//" +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +-$as_echo_n "checking for fgrep... " >&6; } +-if ${ac_cv_path_FGREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +- then ac_cv_path_FGREP="$GREP -F" +- else +- if test -z "$FGREP"; then +- ac_path_FGREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in fgrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_FGREP" || continue +-# Check for GNU ac_path_FGREP and select it if it is found. +- # Check for GNU $ac_path_FGREP +-case `"$ac_path_FGREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'FGREP' >> "conftest.nl" +- "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_FGREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_FGREP="$ac_path_FGREP" +- ac_path_FGREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_FGREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_FGREP"; then +- as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_FGREP=$FGREP +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +-$as_echo "$ac_cv_path_FGREP" >&6; } +- FGREP="$ac_cv_path_FGREP" +- +- +-test -z "$GREP" && GREP=grep +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-@%:@ Check whether --with-gnu-ld was given. +-if test "${with_gnu_ld+set}" = set; then : +- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +-else +- with_gnu_ld=no +-fi +- +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +-$as_echo_n "checking for ld used by $CC... " >&6; } +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [\\/]* | ?:[\\/]*) +- re_direlt='/[^/][^/]*/\.\./' +- # Canonicalize the pathname of ld +- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` +- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +-$as_echo_n "checking for GNU ld... " >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +-$as_echo_n "checking for non-GNU ld... " >&6; } +-fi +-if ${lt_cv_path_LD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$LD"; then +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$lt_cv_path_LD" -v 2>&1 &5 +-$as_echo "$LD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +-if ${lt_cv_prog_gnu_ld+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # I'd rather use --version here, but apparently some GNU lds only accept -v. +-case `$LD -v 2>&1 &5 +-$as_echo "$lt_cv_prog_gnu_ld" >&6; } +-with_gnu_ld=$lt_cv_prog_gnu_ld +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +-$as_echo_n "checking whether ln -s works... " >&6; } +-LN_S=$as_ln_s +-if test "$LN_S" = "ln -s"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +-$as_echo "no, using $LN_S" >&6; } +-fi +- +-# find the maximum length of command line arguments +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +-$as_echo_n "checking the maximum length of command line arguments... " >&6; } +-if ${lt_cv_sys_max_cmd_len+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- i=0 +- teststring="ABCD" +- +- case $build_os in +- msdosdjgpp*) +- # On DJGPP, this test can blow up pretty badly due to problems in libc +- # (any single argument exceeding 2000 bytes causes a buffer overrun +- # during glob expansion). Even if it were fixed, the result of this +- # check would be larger than it should be. +- lt_cv_sys_max_cmd_len=12288; # 12K is about right +- ;; +- +- gnu*) +- # Under GNU Hurd, this test is not required because there is +- # no limit to the length of command line arguments. +- # Libtool will interpret -1 as no limit whatsoever +- lt_cv_sys_max_cmd_len=-1; +- ;; +- +- cygwin* | mingw* | cegcc*) +- # On Win9x/ME, this test blows up -- it succeeds, but takes +- # about 5 minutes as the teststring grows exponentially. +- # Worse, since 9x/ME are not pre-emptively multitasking, +- # you end up with a "frozen" computer, even though with patience +- # the test eventually succeeds (with a max line length of 256k). +- # Instead, let's just punt: use the minimum linelength reported by +- # all of the supported platforms: 8192 (on NT/2K/XP). +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- mint*) +- # On MiNT this can take a long time and run out of memory. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- amigaos*) +- # On AmigaOS with pdksh, this test takes hours, literally. +- # So we just punt and use a minimum line length of 8192. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) +- # This has been around since 386BSD, at least. Likely further. +- if test -x /sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` +- elif test -x /usr/sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` +- else +- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs +- fi +- # And add a safety zone +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- ;; +- +- interix*) +- # We know the value 262144 and hardcode it with a safety zone (like BSD) +- lt_cv_sys_max_cmd_len=196608 +- ;; +- +- os2*) +- # The test takes a long time on OS/2. +- lt_cv_sys_max_cmd_len=8192 +- ;; +- +- osf*) +- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure +- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not +- # nice to cause kernel panics so lets avoid the loop below. +- # First set a reasonable default. +- lt_cv_sys_max_cmd_len=16384 +- # +- if test -x /sbin/sysconfig; then +- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in +- *1*) lt_cv_sys_max_cmd_len=-1 ;; +- esac +- fi +- ;; +- sco3.2v5*) +- lt_cv_sys_max_cmd_len=102400 +- ;; +- sysv5* | sco5v6* | sysv4.2uw2*) +- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` +- if test -n "$kargmax"; then +- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` +- else +- lt_cv_sys_max_cmd_len=32768 +- fi +- ;; +- *) +- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` +- if test -n "$lt_cv_sys_max_cmd_len" && \ +- test undefined != "$lt_cv_sys_max_cmd_len"; then +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- else +- # Make teststring a little bigger before we do anything with it. +- # a 1K string should be a reasonable start. +- for i in 1 2 3 4 5 6 7 8 ; do +- teststring=$teststring$teststring +- done +- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} +- # If test is not a shell built-in, we'll probably end up computing a +- # maximum length that is only half of the actual maximum length, but +- # we can't tell. +- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ +- = "X$teststring$teststring"; } >/dev/null 2>&1 && +- test $i != 17 # 1/2 MB should be enough +- do +- i=`expr $i + 1` +- teststring=$teststring$teststring +- done +- # Only check the string length outside the loop. +- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` +- teststring= +- # Add a significant safety factor because C++ compilers can tack on +- # massive amounts of additional arguments before passing them to the +- # linker. It appears as though 1/2 is a usable value. +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` +- fi +- ;; +- esac +- +-fi +- +-if test -n $lt_cv_sys_max_cmd_len ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +-$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +-$as_echo "none" >&6; } +-fi +-max_cmd_len=$lt_cv_sys_max_cmd_len +- +- +- +- +- +- +-: ${CP="cp -f"} +-: ${MV="mv -f"} +-: ${RM="rm -f"} +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +-# Try some XSI features +-xsi_shell=no +-( _lt_dummy="a/b/c" +- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ +- = c,a/b,b/c, \ +- && eval 'test $(( 1 + 1 )) -eq 2 \ +- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ +- && xsi_shell=yes +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +-$as_echo "$xsi_shell" >&6; } +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +-lt_shell_append=no +-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ +- >/dev/null 2>&1 \ +- && lt_shell_append=yes +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +-$as_echo "$lt_shell_append" >&6; } +- +- +-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +- lt_unset=unset +-else +- lt_unset=false +-fi +- +- +- +- +- +-# test EBCDIC or ASCII +-case `echo X|tr X '\101'` in +- A) # ASCII based system +- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr +- lt_SP2NL='tr \040 \012' +- lt_NL2SP='tr \015\012 \040\040' +- ;; +- *) # EBCDIC based system +- lt_SP2NL='tr \100 \n' +- lt_NL2SP='tr \r\n \100\100' +- ;; +-esac +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +-$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +-if ${lt_cv_to_host_file_cmd+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-mingw* ) +- case $build in +- *-*-mingw* ) # actually msys +- lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 +- ;; +- *-*-cygwin* ) +- lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 +- ;; +- * ) # otherwise, assume *nix +- lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 +- ;; +- esac +- ;; +- *-*-cygwin* ) +- case $build in +- *-*-mingw* ) # actually msys +- lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin +- ;; +- *-*-cygwin* ) +- lt_cv_to_host_file_cmd=func_convert_file_noop +- ;; +- * ) # otherwise, assume *nix +- lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin +- ;; +- esac +- ;; +- * ) # unhandled hosts (and "normal" native builds) +- lt_cv_to_host_file_cmd=func_convert_file_noop +- ;; +-esac +- +-fi +- +-to_host_file_cmd=$lt_cv_to_host_file_cmd +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +-$as_echo "$lt_cv_to_host_file_cmd" >&6; } +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +-if ${lt_cv_to_tool_file_cmd+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- #assume ordinary cross tools, or native build. +-lt_cv_to_tool_file_cmd=func_convert_file_noop +-case $host in +- *-*-mingw* ) +- case $build in +- *-*-mingw* ) # actually msys +- lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 +- ;; +- esac +- ;; +-esac +- +-fi +- +-to_tool_file_cmd=$lt_cv_to_tool_file_cmd +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +-$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +-$as_echo_n "checking for $LD option to reload object files... " >&6; } +-if ${lt_cv_ld_reload_flag+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ld_reload_flag='-r' +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +-$as_echo "$lt_cv_ld_reload_flag" >&6; } +-reload_flag=$lt_cv_ld_reload_flag +-case $reload_flag in +-"" | " "*) ;; +-*) reload_flag=" $reload_flag" ;; +-esac +-reload_cmds='$LD$reload_flag -o $output$reload_objs' +-case $host_os in +- cygwin* | mingw* | pw32* | cegcc*) +- if test "$GCC" != yes; then +- reload_cmds=false +- fi +- ;; +- darwin*) +- if test "$GCC" = yes; then +- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' +- else +- reload_cmds='$LD$reload_flag -o $output$reload_objs' +- fi +- ;; +-esac +- +- +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +-set dummy ${ac_tool_prefix}objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OBJDUMP"; then +- ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OBJDUMP=$ac_cv_prog_OBJDUMP +-if test -n "$OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +-$as_echo "$OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OBJDUMP"; then +- ac_ct_OBJDUMP=$OBJDUMP +- # Extract the first word of "objdump", so it can be a program name with args. +-set dummy objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OBJDUMP"; then +- ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OBJDUMP="objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +-if test -n "$ac_ct_OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +-$as_echo "$ac_ct_OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OBJDUMP" = x; then +- OBJDUMP="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OBJDUMP=$ac_ct_OBJDUMP +- fi +-else +- OBJDUMP="$ac_cv_prog_OBJDUMP" +-fi +- +-test -z "$OBJDUMP" && OBJDUMP=objdump +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +-$as_echo_n "checking how to recognize dependent libraries... " >&6; } +-if ${lt_cv_deplibs_check_method+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_file_magic_cmd='$MAGIC_CMD' +-lt_cv_file_magic_test_file= +-lt_cv_deplibs_check_method='unknown' +-# Need to set the preceding variable on all platforms that support +-# interlibrary dependencies. +-# 'none' -- dependencies not supported. +-# `unknown' -- same as none, but documents that we really don't know. +-# 'pass_all' -- all dependencies passed with no checks. +-# 'test_compile' -- check by making test program. +-# 'file_magic [[regex]]' -- check by looking for files in library path +-# which responds to the $file_magic_cmd with a given extended regex. +-# If you have `file' or equivalent on your system and you're not sure +-# whether `pass_all' will *always* work, you probably want this one. +- +-case $host_os in +-aix[4-9]*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-beos*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-bsdi[45]*) +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' +- lt_cv_file_magic_cmd='/usr/bin/file -L' +- lt_cv_file_magic_test_file=/shlib/libc.so +- ;; +- +-cygwin*) +- # func_win32_libid is a shell function defined in ltmain.sh +- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' +- lt_cv_file_magic_cmd='func_win32_libid' +- ;; +- +-mingw* | pw32*) +- # Base MSYS/MinGW do not provide the 'file' command needed by +- # func_win32_libid shell function, so use a weaker test based on 'objdump', +- # unless we find 'file', for example because we are cross-compiling. +- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. +- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then +- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' +- lt_cv_file_magic_cmd='func_win32_libid' +- else +- # Keep this pattern in sync with the one in func_win32_libid. +- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- fi +- ;; +- +-cegcc*) +- # use the weaker test based on 'objdump'. See mingw*. +- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- ;; +- +-darwin* | rhapsody*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-freebsd* | dragonfly*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then +- case $host_cpu in +- i*86 ) +- # Not sure whether the presence of OpenBSD here was a mistake. +- # Let's accept both of them until this is cleared up. +- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` +- ;; +- esac +- else +- lt_cv_deplibs_check_method=pass_all +- fi +- ;; +- +-haiku*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-hpux10.20* | hpux11*) +- lt_cv_file_magic_cmd=/usr/bin/file +- case $host_cpu in +- ia64*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' +- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so +- ;; +- hppa*64*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' +- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl +- ;; +- *) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' +- lt_cv_file_magic_test_file=/usr/lib/libc.sl +- ;; +- esac +- ;; +- +-interix[3-9]*) +- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $LD in +- *-32|*"-32 ") libmagic=32-bit;; +- *-n32|*"-n32 ") libmagic=N32;; +- *-64|*"-64 ") libmagic=64-bit;; +- *) libmagic=never-match;; +- esac +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-# This must be glibc/ELF. +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-netbsd* | netbsdelf*-gnu) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' +- fi +- ;; +- +-newos6*) +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libnls.so +- ;; +- +-*nto* | *qnx*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-openbsd*) +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' +- fi +- ;; +- +-osf3* | osf4* | osf5*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-rdos*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-solaris*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-sysv4 | sysv4.3*) +- case $host_vendor in +- motorola) +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` +- ;; +- ncr) +- lt_cv_deplibs_check_method=pass_all +- ;; +- sequent) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' +- ;; +- sni) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" +- lt_cv_file_magic_test_file=/lib/libc.so +- ;; +- siemens) +- lt_cv_deplibs_check_method=pass_all +- ;; +- pc) +- lt_cv_deplibs_check_method=pass_all +- ;; +- esac +- ;; +- +-tpf*) +- lt_cv_deplibs_check_method=pass_all +- ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +-$as_echo "$lt_cv_deplibs_check_method" >&6; } +- +-file_magic_glob= +-want_nocaseglob=no +-if test "$build" = "$host"; then +- case $host_os in +- mingw* | pw32*) +- if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then +- want_nocaseglob=yes +- else +- file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` +- fi +- ;; +- esac +-fi +- +-file_magic_cmd=$lt_cv_file_magic_cmd +-deplibs_check_method=$lt_cv_deplibs_check_method +-test -z "$deplibs_check_method" && deplibs_check_method=unknown +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +-set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DLLTOOL"; then +- ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DLLTOOL=$ac_cv_prog_DLLTOOL +-if test -n "$DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +-$as_echo "$DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_DLLTOOL"; then +- ac_ct_DLLTOOL=$DLLTOOL +- # Extract the first word of "dlltool", so it can be a program name with args. +-set dummy dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DLLTOOL"; then +- ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DLLTOOL="dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +-if test -n "$ac_ct_DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +-$as_echo "$ac_ct_DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_DLLTOOL" = x; then +- DLLTOOL="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DLLTOOL=$ac_ct_DLLTOOL +- fi +-else +- DLLTOOL="$ac_cv_prog_DLLTOOL" +-fi +- +-test -z "$DLLTOOL" && DLLTOOL=dlltool +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +-$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_sharedlib_from_linklib_cmd='unknown' +- +-case $host_os in +-cygwin* | mingw* | pw32* | cegcc*) +- # two different shell functions defined in ltmain.sh +- # decide which to use based on capabilities of $DLLTOOL +- case `$DLLTOOL --help 2>&1` in +- *--identify-strict*) +- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib +- ;; +- *) +- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback +- ;; +- esac +- ;; +-*) +- # fallback: assume linklib IS sharedlib +- lt_cv_sharedlib_from_linklib_cmd="$ECHO" +- ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- for ac_prog in ar +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AR"; then +- ac_cv_prog_AR="$AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AR="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AR=$ac_cv_prog_AR +-if test -n "$AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +-$as_echo "$AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$AR" && break +- done +-fi +-if test -z "$AR"; then +- ac_ct_AR=$AR +- for ac_prog in ar +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AR"; then +- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_AR="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_AR=$ac_cv_prog_ac_ct_AR +-if test -n "$ac_ct_AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +-$as_echo "$ac_ct_AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_AR" && break +-done +- +- if test "x$ac_ct_AR" = x; then +- AR="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- AR=$ac_ct_AR +- fi +-fi +- +-: ${AR=ar} +-: ${AR_FLAGS=cru} +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +-$as_echo_n "checking for archiver @FILE support... " >&6; } +-if ${lt_cv_ar_at_file+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ar_at_file=no +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- echo conftest.$ac_objext > conftest.lst +- lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 +- (eval $lt_ar_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if test "$ac_status" -eq 0; then +- # Ensure the archiver fails upon bogus file names. +- rm -f conftest.$ac_objext libconftest.a +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 +- (eval $lt_ar_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if test "$ac_status" -ne 0; then +- lt_cv_ar_at_file=@ +- fi +- fi +- rm -f conftest.* libconftest.a +- +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +-$as_echo "$lt_cv_ar_at_file" >&6; } +- +-if test "x$lt_cv_ar_at_file" = xno; then +- archiver_list_spec= +-else +- archiver_list_spec=$lt_cv_ar_at_file +-fi +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +-set dummy ${ac_tool_prefix}strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$STRIP"; then +- ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_STRIP="${ac_tool_prefix}strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-STRIP=$ac_cv_prog_STRIP +-if test -n "$STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +-$as_echo "$STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_STRIP"; then +- ac_ct_STRIP=$STRIP +- # Extract the first word of "strip", so it can be a program name with args. +-set dummy strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_STRIP"; then +- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_STRIP="strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +-if test -n "$ac_ct_STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +-$as_echo "$ac_ct_STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_STRIP" = x; then +- STRIP=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- STRIP=$ac_ct_STRIP +- fi +-else +- STRIP="$ac_cv_prog_STRIP" +-fi +- +-test -z "$STRIP" && STRIP=: +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$RANLIB"; then +- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-RANLIB=$ac_cv_prog_RANLIB +-if test -n "$RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +-$as_echo "$RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_RANLIB"; then +- ac_ct_RANLIB=$RANLIB +- # Extract the first word of "ranlib", so it can be a program name with args. +-set dummy ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_RANLIB"; then +- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_RANLIB="ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +-if test -n "$ac_ct_RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +-$as_echo "$ac_ct_RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_RANLIB" = x; then +- RANLIB=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- RANLIB=$ac_ct_RANLIB +- fi +-else +- RANLIB="$ac_cv_prog_RANLIB" +-fi +- +-test -z "$RANLIB" && RANLIB=: +- +- +- +- +- +- +-# Determine commands to create old-style static archives. +-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +-old_postinstall_cmds='chmod 644 $oldlib' +-old_postuninstall_cmds= +- +-if test -n "$RANLIB"; then +- case $host_os in +- openbsd*) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" +- ;; +- *) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" +- ;; +- esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +-fi +- +-case $host_os in +- darwin*) +- lock_old_archive_extraction=yes ;; +- *) +- lock_old_archive_extraction=no ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +- +- +-# Check for command to grab the raw symbol name followed by C symbol from nm. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +-if ${lt_cv_sys_global_symbol_pipe+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +-# These are sane defaults that work on at least a few old systems. +-# [They come from Ultrix. What could be older than Ultrix?!! ;)] +- +-# Character class describing NM global symbol codes. +-symcode='[BCDEGRST]' +- +-# Regexp to match symbols that can be accessed directly from C. +-sympat='\([_A-Za-z][_A-Za-z0-9]*\)' +- +-# Define system-specific variables. +-case $host_os in +-aix*) +- symcode='[BCDT]' +- ;; +-cygwin* | mingw* | pw32* | cegcc*) +- symcode='[ABCDGISTW]' +- ;; +-hpux*) +- if test "$host_cpu" = ia64; then +- symcode='[ABCDEGRST]' +- fi +- ;; +-irix* | nonstopux*) +- symcode='[BCDEGRST]' +- ;; +-osf*) +- symcode='[BCDEGQRST]' +- ;; +-solaris*) +- symcode='[BDRT]' +- ;; +-sco3.2v5*) +- symcode='[DT]' +- ;; +-sysv4.2uw2*) +- symcode='[DT]' +- ;; +-sysv5* | sco5v6* | unixware* | OpenUNIX*) +- symcode='[ABDT]' +- ;; +-sysv4) +- symcode='[DFNSTU]' +- ;; +-esac +- +-# If we're using GNU nm, then use its standard symbol codes. +-case `$NM -V 2>&1` in +-*GNU* | *'with BFD'*) +- symcode='[ABCDGIRSTW]' ;; +-esac +- +-# Transform an extracted symbol line into a proper C declaration. +-# Some systems (esp. on ia64) link data and code symbols differently, +-# so use this general approach. +-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +- +-# Transform an extracted symbol line into symbol name and symbol address +-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +- +-# Handle CRLF in mingw tool chain +-opt_cr= +-case $build_os in +-mingw*) +- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp +- ;; +-esac +- +-# Try without a prefix underscore, then with it. +-for ac_symprfx in "" "_"; do +- +- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. +- symxfrm="\\1 $ac_symprfx\\2 \\2" +- +- # Write the raw and C identifiers. +- if test "$lt_cv_nm_interface" = "MS dumpbin"; then +- # Fake it for dumpbin and say T for any non-static function +- # and D for any global variable. +- # Also find C++ and __fastcall symbols from MSVC++, +- # which start with @ or ?. +- lt_cv_sys_global_symbol_pipe="$AWK '"\ +-" {last_section=section; section=\$ 3};"\ +-" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +-" \$ 0!~/External *\|/{next};"\ +-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +-" {if(hide[section]) next};"\ +-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +-" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +-" ' prfx=^$ac_symprfx" +- else +- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" +- fi +- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" +- +- # Check to see that the pipe works correctly. +- pipe_works=no +- +- rm -f conftest* +- cat > conftest.$ac_ext <<_LT_EOF +-#ifdef __cplusplus +-extern "C" { +-#endif +-char nm_test_var; +-void nm_test_func(void); +-void nm_test_func(void){} +-#ifdef __cplusplus +-} +-#endif +-int main(){nm_test_var='a';nm_test_func();return(0);} +-_LT_EOF +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- # Now try to grab the symbols. +- nlist=conftest.nm +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 +- (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s "$nlist"; then +- # Try sorting and uniquifying the output. +- if sort "$nlist" | uniq > "$nlist"T; then +- mv -f "$nlist"T "$nlist" +- else +- rm -f "$nlist"T +- fi +- +- # Make sure that we snagged all the symbols we need. +- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then +- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then +- cat <<_LT_EOF > conftest.$ac_ext +-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +-/* DATA imports from DLLs on WIN32 con't be const, because runtime +- relocations are performed -- see ld's documentation on pseudo-relocs. */ +-# define LT@&t@_DLSYM_CONST +-#elif defined(__osf__) +-/* This system does not cope well with relocations in const data. */ +-# define LT@&t@_DLSYM_CONST +-#else +-# define LT@&t@_DLSYM_CONST const +-#endif +- +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-_LT_EOF +- # Now generate the symbol file. +- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' +- +- cat <<_LT_EOF >> conftest.$ac_ext +- +-/* The mapping between symbol names and symbols. */ +-LT@&t@_DLSYM_CONST struct { +- const char *name; +- void *address; +-} +-lt__PROGRAM__LTX_preloaded_symbols[] = +-{ +- { "@PROGRAM@", (void *) 0 }, +-_LT_EOF +- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext +- cat <<\_LT_EOF >> conftest.$ac_ext +- {0, (void *) 0} +-}; +- +-/* This works around a problem in FreeBSD linker */ +-#ifdef FREEBSD_WORKAROUND +-static const void *lt_preloaded_setup() { +- return lt__PROGRAM__LTX_preloaded_symbols; +-} +-#endif +- +-#ifdef __cplusplus +-} +-#endif +-_LT_EOF +- # Now try linking the two files. +- mv conftest.$ac_objext conftstm.$ac_objext +- lt_globsym_save_LIBS=$LIBS +- lt_globsym_save_CFLAGS=$CFLAGS +- LIBS="conftstm.$ac_objext" +- CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s conftest${ac_exeext}; then +- pipe_works=yes +- fi +- LIBS=$lt_globsym_save_LIBS +- CFLAGS=$lt_globsym_save_CFLAGS +- else +- echo "cannot find nm_test_func in $nlist" >&5 +- fi +- else +- echo "cannot find nm_test_var in $nlist" >&5 +- fi +- else +- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 +- fi +- else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- fi +- rm -rf conftest* conftst* +- +- # Do not use the global_symbol_pipe unless it works. +- if test "$pipe_works" = yes; then +- break +- else +- lt_cv_sys_global_symbol_pipe= +- fi +-done +- +-fi +- +-if test -z "$lt_cv_sys_global_symbol_pipe"; then +- lt_cv_sys_global_symbol_to_cdecl= +-fi +-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +-$as_echo "failed" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +-$as_echo "ok" >&6; } +-fi +- +-# Response file support. +-if test "$lt_cv_nm_interface" = "MS dumpbin"; then +- nm_file_list_spec='@' +-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then +- nm_file_list_spec='@' +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +-$as_echo_n "checking for sysroot... " >&6; } +- +-@%:@ Check whether --with-sysroot was given. +-if test "${with_sysroot+set}" = set; then : +- withval=$with_sysroot; +-else +- with_sysroot=no +-fi +- +- +-lt_sysroot= +-case ${with_sysroot} in #( +- yes) +- if test "$GCC" = yes; then +- lt_sysroot=`$CC --print-sysroot 2>/dev/null` +- fi +- ;; #( +- /*) +- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` +- ;; #( +- no|'') +- ;; #( +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +-$as_echo "${with_sysroot}" >&6; } +- as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 +- ;; +-esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +-$as_echo "${lt_sysroot:-no}" >&6; } +- +- +- +- +- +-@%:@ Check whether --enable-libtool-lock was given. +-if test "${enable_libtool_lock+set}" = set; then : +- enableval=$enable_libtool_lock; +-fi +- +-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +- +-# Some flags need to be propagated to the compiler or linker for good +-# libtool support. +-case $host in +-ia64-*-hpux*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- case `/usr/bin/file conftest.$ac_objext` in +- *ELF-32*) +- HPUX_IA64_MODE="32" +- ;; +- *ELF-64*) +- HPUX_IA64_MODE="64" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +-*-*-irix6*) +- # Find out which ABI we are using. +- echo '#line '$LINENO' "configure"' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$lt_cv_prog_gnu_ld" = yes; then +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -melf32bsmip" +- ;; +- *N32*) +- LD="${LD-ld} -melf32bmipn32" +- ;; +- *64-bit*) +- LD="${LD-ld} -melf64bmip" +- ;; +- esac +- else +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -32" +- ;; +- *N32*) +- LD="${LD-ld} -n32" +- ;; +- *64-bit*) +- LD="${LD-ld} -64" +- ;; +- esac +- fi +- fi +- rm -rf conftest* +- ;; +- +-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +-s390*-*linux*|s390*-*tpf*|sparc*-*linux*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- case `/usr/bin/file conftest.o` in +- *32-bit*) +- case $host in +- x86_64-*kfreebsd*-gnu) +- LD="${LD-ld} -m elf_i386_fbsd" +- ;; +- x86_64-*linux*) +- case `/usr/bin/file conftest.o` in +- *x86-64*) +- LD="${LD-ld} -m elf32_x86_64" +- ;; +- *) +- LD="${LD-ld} -m elf_i386" +- ;; +- esac +- ;; +- powerpc64le-*) +- LD="${LD-ld} -m elf32lppclinux" +- ;; +- powerpc64-*) +- LD="${LD-ld} -m elf32ppclinux" +- ;; +- s390x-*linux*) +- LD="${LD-ld} -m elf_s390" +- ;; +- sparc64-*linux*) +- LD="${LD-ld} -m elf32_sparc" +- ;; +- esac +- ;; +- *64-bit*) +- case $host in +- x86_64-*kfreebsd*-gnu) +- LD="${LD-ld} -m elf_x86_64_fbsd" +- ;; +- x86_64-*linux*) +- LD="${LD-ld} -m elf_x86_64" +- ;; +- powerpcle-*) +- LD="${LD-ld} -m elf64lppc" +- ;; +- powerpc-*) +- LD="${LD-ld} -m elf64ppc" +- ;; +- s390*-*linux*|s390*-*tpf*) +- LD="${LD-ld} -m elf64_s390" +- ;; +- sparc*-*linux*) +- LD="${LD-ld} -m elf64_sparc" +- ;; +- esac +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +- +-*-*-sco3.2v5*) +- # On SCO OpenServer 5, we need -belf to get full-featured binaries. +- SAVE_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -belf" +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +-$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +-if ${lt_cv_cc_needs_belf+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- lt_cv_cc_needs_belf=yes +-else +- lt_cv_cc_needs_belf=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +-$as_echo "$lt_cv_cc_needs_belf" >&6; } +- if test x"$lt_cv_cc_needs_belf" != x"yes"; then +- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf +- CFLAGS="$SAVE_CFLAGS" +- fi +- ;; +-*-*solaris*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- case `/usr/bin/file conftest.o` in +- *64-bit*) +- case $lt_cv_prog_gnu_ld in +- yes*) +- case $host in +- i?86-*-solaris*) +- LD="${LD-ld} -m elf_x86_64" +- ;; +- sparc*-*-solaris*) +- LD="${LD-ld} -m elf64_sparc" +- ;; +- esac +- # GNU ld 2.21 introduced _sol2 emulations. Use them if available. +- if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then +- LD="${LD-ld}_sol2" +- fi +- ;; +- *) +- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then +- LD="${LD-ld} -64" +- fi +- ;; +- esac +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +-esac +- +-need_locks="$enable_libtool_lock" +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +-set dummy ${ac_tool_prefix}mt; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$MANIFEST_TOOL"; then +- ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +-if test -n "$MANIFEST_TOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +-$as_echo "$MANIFEST_TOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then +- ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL +- # Extract the first word of "mt", so it can be a program name with args. +-set dummy mt; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_MANIFEST_TOOL"; then +- ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +-if test -n "$ac_ct_MANIFEST_TOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_MANIFEST_TOOL" = x; then +- MANIFEST_TOOL=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL +- fi +-else +- MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +-fi +- +-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +-if ${lt_cv_path_mainfest_tool+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_path_mainfest_tool=no +- echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 +- $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out +- cat conftest.err >&5 +- if $GREP 'Manifest Tool' conftest.out > /dev/null; then +- lt_cv_path_mainfest_tool=yes +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +-$as_echo "$lt_cv_path_mainfest_tool" >&6; } +-if test "x$lt_cv_path_mainfest_tool" != xyes; then +- MANIFEST_TOOL=: +-fi +- +- +- +- +- +- +- case $host_os in +- rhapsody* | darwin*) +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DSYMUTIL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DSYMUTIL"; then +- ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DSYMUTIL=$ac_cv_prog_DSYMUTIL +-if test -n "$DSYMUTIL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +-$as_echo "$DSYMUTIL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_DSYMUTIL"; then +- ac_ct_DSYMUTIL=$DSYMUTIL +- # Extract the first word of "dsymutil", so it can be a program name with args. +-set dummy dsymutil; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DSYMUTIL"; then +- ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +-if test -n "$ac_ct_DSYMUTIL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +-$as_echo "$ac_ct_DSYMUTIL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_DSYMUTIL" = x; then +- DSYMUTIL=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DSYMUTIL=$ac_ct_DSYMUTIL +- fi +-else +- DSYMUTIL="$ac_cv_prog_DSYMUTIL" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +-set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_NMEDIT+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$NMEDIT"; then +- ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-NMEDIT=$ac_cv_prog_NMEDIT +-if test -n "$NMEDIT"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +-$as_echo "$NMEDIT" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_NMEDIT"; then +- ac_ct_NMEDIT=$NMEDIT +- # Extract the first word of "nmedit", so it can be a program name with args. +-set dummy nmedit; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_NMEDIT"; then +- ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_NMEDIT="nmedit" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +-if test -n "$ac_ct_NMEDIT"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +-$as_echo "$ac_ct_NMEDIT" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_NMEDIT" = x; then +- NMEDIT=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- NMEDIT=$ac_ct_NMEDIT +- fi +-else +- NMEDIT="$ac_cv_prog_NMEDIT" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +-set dummy ${ac_tool_prefix}lipo; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_LIPO+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$LIPO"; then +- ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_LIPO="${ac_tool_prefix}lipo" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-LIPO=$ac_cv_prog_LIPO +-if test -n "$LIPO"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +-$as_echo "$LIPO" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_LIPO"; then +- ac_ct_LIPO=$LIPO +- # Extract the first word of "lipo", so it can be a program name with args. +-set dummy lipo; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_LIPO+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_LIPO"; then +- ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_LIPO="lipo" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +-if test -n "$ac_ct_LIPO"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +-$as_echo "$ac_ct_LIPO" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_LIPO" = x; then +- LIPO=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- LIPO=$ac_ct_LIPO +- fi +-else +- LIPO="$ac_cv_prog_LIPO" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +-set dummy ${ac_tool_prefix}otool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OTOOL"; then +- ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OTOOL="${ac_tool_prefix}otool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OTOOL=$ac_cv_prog_OTOOL +-if test -n "$OTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +-$as_echo "$OTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OTOOL"; then +- ac_ct_OTOOL=$OTOOL +- # Extract the first word of "otool", so it can be a program name with args. +-set dummy otool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OTOOL"; then +- ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OTOOL="otool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +-if test -n "$ac_ct_OTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +-$as_echo "$ac_ct_OTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OTOOL" = x; then +- OTOOL=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OTOOL=$ac_ct_OTOOL +- fi +-else +- OTOOL="$ac_cv_prog_OTOOL" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +-set dummy ${ac_tool_prefix}otool64; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OTOOL64+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OTOOL64"; then +- ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OTOOL64=$ac_cv_prog_OTOOL64 +-if test -n "$OTOOL64"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +-$as_echo "$OTOOL64" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OTOOL64"; then +- ac_ct_OTOOL64=$OTOOL64 +- # Extract the first word of "otool64", so it can be a program name with args. +-set dummy otool64; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OTOOL64"; then +- ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OTOOL64="otool64" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +-if test -n "$ac_ct_OTOOL64"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +-$as_echo "$ac_ct_OTOOL64" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OTOOL64" = x; then +- OTOOL64=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OTOOL64=$ac_ct_OTOOL64 +- fi +-else +- OTOOL64="$ac_cv_prog_OTOOL64" +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +-$as_echo_n "checking for -single_module linker flag... " >&6; } +-if ${lt_cv_apple_cc_single_mod+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_apple_cc_single_mod=no +- if test -z "${LT_MULTI_MODULE}"; then +- # By default we will add the -single_module flag. You can override +- # by either setting the environment variable LT_MULTI_MODULE +- # non-empty at configure time, or by adding -multi_module to the +- # link flags. +- rm -rf libconftest.dylib* +- echo "int foo(void){return 1;}" > conftest.c +- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +--dynamiclib -Wl,-single_module conftest.c" >&5 +- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err +- _lt_result=$? +- # If there is a non-empty error log, and "single_module" +- # appears in it, assume the flag caused a linker warning +- if test -s conftest.err && $GREP single_module conftest.err; then +- cat conftest.err >&5 +- # Otherwise, if the output was created with a 0 exit code from +- # the compiler, it worked. +- elif test -f libconftest.dylib && test $_lt_result -eq 0; then +- lt_cv_apple_cc_single_mod=yes +- else +- cat conftest.err >&5 +- fi +- rm -rf libconftest.dylib* +- rm -f conftest.* +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +-$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +-if ${lt_cv_ld_exported_symbols_list+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ld_exported_symbols_list=no +- save_LDFLAGS=$LDFLAGS +- echo "_main" > conftest.sym +- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- lt_cv_ld_exported_symbols_list=yes +-else +- lt_cv_ld_exported_symbols_list=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +-$as_echo_n "checking for -force_load linker flag... " >&6; } +-if ${lt_cv_ld_force_load+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ld_force_load=no +- cat > conftest.c << _LT_EOF +-int forced_loaded() { return 2;} +-_LT_EOF +- echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 +- $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 +- echo "$AR cru libconftest.a conftest.o" >&5 +- $AR cru libconftest.a conftest.o 2>&5 +- echo "$RANLIB libconftest.a" >&5 +- $RANLIB libconftest.a 2>&5 +- cat > conftest.c << _LT_EOF +-int main() { return 0;} +-_LT_EOF +- echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 +- $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err +- _lt_result=$? +- if test -s conftest.err && $GREP force_load conftest.err; then +- cat conftest.err >&5 +- elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then +- lt_cv_ld_force_load=yes +- else +- cat conftest.err >&5 +- fi +- rm -f conftest.err libconftest.a conftest conftest.c +- rm -rf conftest.dSYM +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +-$as_echo "$lt_cv_ld_force_load" >&6; } +- case $host_os in +- rhapsody* | darwin1.[012]) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; +- darwin1.*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- darwin*) # darwin 5.x on +- # if running on 10.5 or later, the deployment target defaults +- # to the OS version, if on x86, and 10.4, the deployment +- # target defaults to 10.4. Don't you love it? +- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in +- 10.0,*86*-darwin8*|10.0,*-darwin[91]*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- 10.[012]*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- 10.*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- esac +- ;; +- esac +- if test "$lt_cv_apple_cc_single_mod" = "yes"; then +- _lt_dar_single_mod='$single_module' +- fi +- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then +- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +- else +- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then +- _lt_dsymutil='~$DSYMUTIL $lib || :' +- else +- _lt_dsymutil= +- fi +- ;; +- esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +-$as_echo_n "checking for ANSI C header files... " >&6; } +-if ${ac_cv_header_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_stdc=yes +-else +- ac_cv_header_stdc=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-if test $ac_cv_header_stdc = yes; then +- # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "memchr" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "free" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +- if test "$cross_compiling" = yes; then : +- : +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#if ((' ' & 0x0FF) == 0x020) +-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +-#else +-# define ISLOWER(c) \ +- (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) +-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +-#endif +- +-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +-int +-main () +-{ +- int i; +- for (i = 0; i < 256; i++) +- if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) +- return 2; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +-$as_echo "$ac_cv_header_stdc" >&6; } +-if test $ac_cv_header_stdc = yes; then +- +-$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h +- +-fi +- +-# On IRIX 5.3, sys/types and inttypes.h are conflicting. +-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ +- inttypes.h stdint.h unistd.h +-do : +- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +-" +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +-_ACEOF +- +-fi +- +-done +- +- +-for ac_header in dlfcn.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +-" +-if test "x$ac_cv_header_dlfcn_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DLFCN_H 1 +-_ACEOF +- +-fi +- +-done +- +- +- +- +-func_stripname_cnf () +-{ +- case ${2} in +- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; +- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; +- esac +-} # func_stripname_cnf +- +- +- +- +- +-# Set options +- +- +- +- enable_dlopen=no +- +- +- +- @%:@ Check whether --enable-shared was given. +-if test "${enable_shared+set}" = set; then : +- enableval=$enable_shared; p=${PACKAGE-default} +- case $enableval in +- yes) enable_shared=yes ;; +- no) enable_shared=no ;; +- *) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_shared=yes +-fi +- +- +- +- +- +- +- +- +- +- @%:@ Check whether --enable-static was given. +-if test "${enable_static+set}" = set; then : +- enableval=$enable_static; p=${PACKAGE-default} +- case $enableval in +- yes) enable_static=yes ;; +- no) enable_static=no ;; +- *) +- enable_static=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_static=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_static=yes +-fi +- +- +- +- +- +- +- +- +- +- +-@%:@ Check whether --with-pic was given. +-if test "${with_pic+set}" = set; then : +- withval=$with_pic; lt_p=${PACKAGE-default} +- case $withval in +- yes|no) pic_mode=$withval ;; +- *) +- pic_mode=default +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for lt_pkg in $withval; do +- IFS="$lt_save_ifs" +- if test "X$lt_pkg" = "X$lt_p"; then +- pic_mode=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- pic_mode=default +-fi +- +- +-test -z "$pic_mode" && pic_mode=default +- +- +- +- +- +- +- +- @%:@ Check whether --enable-fast-install was given. +-if test "${enable_fast_install+set}" = set; then : +- enableval=$enable_fast_install; p=${PACKAGE-default} +- case $enableval in +- yes) enable_fast_install=yes ;; +- no) enable_fast_install=no ;; +- *) +- enable_fast_install=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_fast_install=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_fast_install=yes +-fi +- +- +- +- +- +- +- +- +- +- +- +-# This can be used to rebuild libtool when needed +-LIBTOOL_DEPS="$ltmain" +- +-# Always use our own libtool. +-LIBTOOL='$(SHELL) $(top_builddir)/libtool' +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-test -z "$LN_S" && LN_S="ln -s" +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +-$as_echo_n "checking for objdir... " >&6; } +-if ${lt_cv_objdir+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- rm -f .libs 2>/dev/null +-mkdir .libs 2>/dev/null +-if test -d .libs; then +- lt_cv_objdir=.libs +-else +- # MS-DOS does not allow filenames that begin with a dot. +- lt_cv_objdir=_libs +-fi +-rmdir .libs 2>/dev/null +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +-$as_echo "$lt_cv_objdir" >&6; } +-objdir=$lt_cv_objdir +- +- +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define LT_OBJDIR "$lt_cv_objdir/" +-_ACEOF +- +- +- +- +-case $host_os in +-aix3*) +- # AIX sometimes has problems with the GCC collect2 program. For some +- # reason, if we set the COLLECT_NAMES environment variable, the problems +- # vanish in a puff of smoke. +- if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +- fi +- ;; +-esac +- +-# Global variables: +-ofile=libtool +-can_build_shared=yes +- +-# All known linkers require a `.a' archive for static linking (except MSVC, +-# which needs '.lib'). +-libext=a +- +-with_gnu_ld="$lt_cv_prog_gnu_ld" +- +-old_CC="$CC" +-old_CFLAGS="$CFLAGS" +- +-# Set sane defaults for various variables +-test -z "$CC" && CC=cc +-test -z "$LTCC" && LTCC=$CC +-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +-test -z "$LD" && LD=ld +-test -z "$ac_objext" && ac_objext=o +- +-for cc_temp in $compiler""; do +- case $cc_temp in +- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; +- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; +- \-*) ;; +- *) break;; +- esac +-done +-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +- +- +-# Only perform the check for file, if the check method requires it +-test -z "$MAGIC_CMD" && MAGIC_CMD=file +-case $deplibs_check_method in +-file_magic*) +- if test "$file_magic_cmd" = '$MAGIC_CMD'; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +-if ${lt_cv_path_MAGIC_CMD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $MAGIC_CMD in +-[\\/*] | ?:[\\/]*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +-*) +- lt_save_MAGIC_CMD="$MAGIC_CMD" +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" +- for ac_dir in $ac_dummy; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/${ac_tool_prefix}file; then +- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- $EGREP "$file_magic_regex" > /dev/null; then +- : +- else +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-_LT_EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$lt_save_ifs" +- MAGIC_CMD="$lt_save_MAGIC_CMD" +- ;; +-esac +-fi +- +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +-$as_echo "$MAGIC_CMD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- +- +- +-if test -z "$lt_cv_path_MAGIC_CMD"; then +- if test -n "$ac_tool_prefix"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +-$as_echo_n "checking for file... " >&6; } +-if ${lt_cv_path_MAGIC_CMD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $MAGIC_CMD in +-[\\/*] | ?:[\\/]*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +-*) +- lt_save_MAGIC_CMD="$MAGIC_CMD" +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" +- for ac_dir in $ac_dummy; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/file; then +- lt_cv_path_MAGIC_CMD="$ac_dir/file" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- $EGREP "$file_magic_regex" > /dev/null; then +- : +- else +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-_LT_EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$lt_save_ifs" +- MAGIC_CMD="$lt_save_MAGIC_CMD" +- ;; +-esac +-fi +- +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +-$as_echo "$MAGIC_CMD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- else +- MAGIC_CMD=: +- fi +-fi +- +- fi +- ;; +-esac +- +-# Use C for the default configuration in the libtool script +- +-lt_save_CC="$CC" +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +-# Source file extension for C test sources. +-ac_ext=c +- +-# Object file extension for compiled C test sources. +-objext=o +-objext=$objext +- +-# Code to be used in simple compile tests +-lt_simple_compile_test_code="int some_variable = 0;" +- +-# Code to be used in simple link tests +-lt_simple_link_test_code='int main(){return(0);}' +- +- +- +- +- +- +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +- +-# Save the default compiler, since it gets overwritten when the other +-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +-compiler_DEFAULT=$CC +- +-# save warnings/boilerplate of simple test code +-ac_outfile=conftest.$ac_objext +-echo "$lt_simple_compile_test_code" >conftest.$ac_ext +-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_compiler_boilerplate=`cat conftest.err` +-$RM conftest* +- +-ac_outfile=conftest.$ac_objext +-echo "$lt_simple_link_test_code" >conftest.$ac_ext +-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_linker_boilerplate=`cat conftest.err` +-$RM -r conftest* +- +- +-## CAVEAT EMPTOR: +-## There is no encapsulation within the following macros, do not change +-## the running order or otherwise move them around unless you know exactly +-## what you are doing... +-if test -n "$compiler"; then +- +-lt_prog_compiler_no_builtin_flag= +- +-if test "$GCC" = yes; then +- case $cc_basename in +- nvcc*) +- lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; +- *) +- lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_rtti_exceptions=no +- ac_outfile=conftest.$ac_objext +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="-fno-rtti -fno-exceptions" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_rtti_exceptions=yes +- fi +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +- +-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then +- lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +-else +- : +-fi +- +-fi +- +- +- +- +- +- +- lt_prog_compiler_wl= +-lt_prog_compiler_pic= +-lt_prog_compiler_static= +- +- +- if test "$GCC" = yes; then +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_static='-static' +- +- case $host_os in +- aix*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static='-Bstatic' +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- lt_prog_compiler_pic='-fPIC' +- ;; +- m68k) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' +- ;; +- esac +- ;; +- +- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- # Although the cygwin gcc ignores -fPIC, still need this for old-style +- # (--disable-auto-import) libraries +- lt_prog_compiler_pic='-DDLL_EXPORT' +- ;; +- +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- lt_prog_compiler_pic='-fno-common' +- ;; +- +- haiku*) +- # PIC is the default for Haiku. +- # The "-static" flag exists, but is broken. +- lt_prog_compiler_static= +- ;; +- +- hpux*) +- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit +- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag +- # sets the default TLS model and affects inlining. +- case $host_cpu in +- hppa*64*) +- # +Z the default +- ;; +- *) +- lt_prog_compiler_pic='-fPIC' +- ;; +- esac +- ;; +- +- interix[3-9]*) +- # Interix 3.x gcc -fpic/-fPIC options generate broken code. +- # Instead, we relocate shared libraries at runtime. +- ;; +- +- msdosdjgpp*) +- # Just because we use GCC doesn't mean we suddenly get shared libraries +- # on systems that don't support them. +- lt_prog_compiler_can_build_shared=no +- enable_shared=no +- ;; +- +- *nto* | *qnx*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic='-fPIC -shared' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- lt_prog_compiler_pic=-Kconform_pic +- fi +- ;; +- +- *) +- lt_prog_compiler_pic='-fPIC' +- ;; +- esac +- +- case $cc_basename in +- nvcc*) # Cuda Compiler Driver 2.2 +- lt_prog_compiler_wl='-Xlinker ' +- if test -n "$lt_prog_compiler_pic"; then +- lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" +- fi +- ;; +- esac +- else +- # PORTME Check for flag to pass linker flags through the system compiler. +- case $host_os in +- aix*) +- lt_prog_compiler_wl='-Wl,' +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static='-Bstatic' +- else +- lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' +- fi +- ;; +- +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_prog_compiler_pic='-DDLL_EXPORT' +- ;; +- +- hpux9* | hpux10* | hpux11*) +- lt_prog_compiler_wl='-Wl,' +- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but +- # not for PA HP-UX. +- case $host_cpu in +- hppa*64*|ia64*) +- # +Z the default +- ;; +- *) +- lt_prog_compiler_pic='+Z' +- ;; +- esac +- # Is there a better lt_prog_compiler_static that works with the bundled CC? +- lt_prog_compiler_static='${wl}-a ${wl}archive' +- ;; +- +- irix5* | irix6* | nonstopux*) +- lt_prog_compiler_wl='-Wl,' +- # PIC (with -KPIC) is the default. +- lt_prog_compiler_static='-non_shared' +- ;; +- +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- case $cc_basename in +- # old Intel for x86_64 which still supported -KPIC. +- ecc*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-static' +- ;; +- # icc used to be incompatible with GCC. +- # ICC 10 doesn't accept -KPIC any more. +- icc* | ifort*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fPIC' +- lt_prog_compiler_static='-static' +- ;; +- # Lahey Fortran 8.1. +- lf95*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='--shared' +- lt_prog_compiler_static='--static' +- ;; +- nagfor*) +- # NAG Fortran compiler +- lt_prog_compiler_wl='-Wl,-Wl,,' +- lt_prog_compiler_pic='-PIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) +- # Portland Group compilers (*not* the Pentium gcc compiler, +- # which looks to be a dead project) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fpic' +- lt_prog_compiler_static='-Bstatic' +- ;; +- ccc*) +- lt_prog_compiler_wl='-Wl,' +- # All Alpha code is PIC. +- lt_prog_compiler_static='-non_shared' +- ;; +- xl* | bgxl* | bgf* | mpixl*) +- # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-qpic' +- lt_prog_compiler_static='-qstaticlink' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) +- # Sun Fortran 8.3 passes all unrecognized flags to the linker +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='' +- ;; +- *Sun\ F* | *Sun*Fortran*) +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='-Qoption ld ' +- ;; +- *Sun\ C*) +- # Sun C 5.9 +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='-Wl,' +- ;; +- *Intel*\ [CF]*Compiler*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fPIC' +- lt_prog_compiler_static='-static' +- ;; +- *Portland\ Group*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fpic' +- lt_prog_compiler_static='-Bstatic' +- ;; +- esac +- ;; +- esac +- ;; +- +- newsos6) +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- *nto* | *qnx*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic='-fPIC -shared' +- ;; +- +- osf3* | osf4* | osf5*) +- lt_prog_compiler_wl='-Wl,' +- # All OSF/1 code is PIC. +- lt_prog_compiler_static='-non_shared' +- ;; +- +- rdos*) +- lt_prog_compiler_static='-non_shared' +- ;; +- +- solaris*) +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- case $cc_basename in +- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) +- lt_prog_compiler_wl='-Qoption ld ';; +- *) +- lt_prog_compiler_wl='-Wl,';; +- esac +- ;; +- +- sunos4*) +- lt_prog_compiler_wl='-Qoption ld ' +- lt_prog_compiler_pic='-PIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- sysv4 | sysv4.2uw2* | sysv4.3*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec ;then +- lt_prog_compiler_pic='-Kconform_pic' +- lt_prog_compiler_static='-Bstatic' +- fi +- ;; +- +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- unicos*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_can_build_shared=no +- ;; +- +- uts4*) +- lt_prog_compiler_pic='-pic' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- *) +- lt_prog_compiler_can_build_shared=no +- ;; +- esac +- fi +- +-case $host_os in +- # For platforms which do not support PIC, -DPIC is meaningless: +- *djgpp*) +- lt_prog_compiler_pic= +- ;; +- *) +- lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" +- ;; +-esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +-$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +-if ${lt_cv_prog_compiler_pic+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +-$as_echo "$lt_cv_prog_compiler_pic" >&6; } +-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic +- +-# +-# Check to make sure the PIC flag actually works. +-# +-if test -n "$lt_prog_compiler_pic"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +-if ${lt_cv_prog_compiler_pic_works+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic_works=no +- ac_outfile=conftest.$ac_objext +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_pic_works=yes +- fi +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } +- +-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then +- case $lt_prog_compiler_pic in +- "" | " "*) ;; +- *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; +- esac +-else +- lt_prog_compiler_pic= +- lt_prog_compiler_can_build_shared=no +-fi +- +-fi +- +- +- +- +- +- +- +- +- +- +- +-# +-# Check to make sure the static flag actually works. +-# +-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +-if ${lt_cv_prog_compiler_static_works+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_static_works=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_tmp_static_flag" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_static_works=yes +- fi +- else +- lt_cv_prog_compiler_static_works=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +-$as_echo "$lt_cv_prog_compiler_static_works" >&6; } +- +-if test x"$lt_cv_prog_compiler_static_works" = xyes; then +- : +-else +- lt_prog_compiler_static= +-fi +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +- +- +- +- +-hard_links="nottested" +-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +-$as_echo_n "checking if we can lock with hard links... " >&6; } +- hard_links=yes +- $RM conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +-$as_echo "$hard_links" >&6; } +- if test "$hard_links" = no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} +- need_locks=warn +- fi +-else +- need_locks=no +-fi +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +- +- runpath_var= +- allow_undefined_flag= +- always_export_symbols=no +- archive_cmds= +- archive_expsym_cmds= +- compiler_needs_object=no +- enable_shared_with_static_runtimes=no +- export_dynamic_flag_spec= +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- hardcode_automatic=no +- hardcode_direct=no +- hardcode_direct_absolute=no +- hardcode_libdir_flag_spec= +- hardcode_libdir_separator= +- hardcode_minus_L=no +- hardcode_shlibpath_var=unsupported +- inherit_rpath=no +- link_all_deplibs=unknown +- module_cmds= +- module_expsym_cmds= +- old_archive_from_new_cmds= +- old_archive_from_expsyms_cmds= +- thread_safe_flag_spec= +- whole_archive_flag_spec= +- # include_expsyms should be a list of space-separated symbols to be *always* +- # included in the symbol list +- include_expsyms= +- # exclude_expsyms can be an extended regexp of symbols to exclude +- # it will be wrapped by ` (' and `)$', so one must not match beginning or +- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +- # as well as any symbol that contains `d'. +- exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +- # platforms (ab)use it in PIC code, but their linkers get confused if +- # the symbol is explicitly referenced. Since portable code cannot +- # rely on this symbol name, it's probably fine to never include it in +- # preloaded symbol tables. +- # Exclude shared library initialization/finalization symbols. +- extract_expsyms_cmds= +- +- case $host_os in +- cygwin* | mingw* | pw32* | cegcc*) +- # 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 +- ;; +- linux* | k*bsd*-gnu | gnu*) +- link_all_deplibs=no +- ;; +- esac +- +- ld_shlibs=yes +- +- # On some targets, GNU ld is compatible enough with the native linker +- # that we're better off using the native interface for both. +- lt_use_gnu_ld_interface=no +- if test "$with_gnu_ld" = yes; then +- case $host_os in +- aix*) +- # The AIX port of GNU ld has always aspired to compatibility +- # with the native linker. However, as the warning in the GNU ld +- # block says, versions before 2.19.5* couldn't really create working +- # shared libraries, regardless of the interface used. +- case `$LD -v 2>&1` in +- *\ \(GNU\ Binutils\)\ 2.19.5*) ;; +- *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; +- *\ \(GNU\ Binutils\)\ [3-9]*) ;; +- *) +- lt_use_gnu_ld_interface=yes +- ;; +- esac +- ;; +- *) +- lt_use_gnu_ld_interface=yes +- ;; +- esac +- fi +- +- if test "$lt_use_gnu_ld_interface" = yes; then +- # If archive_cmds runs LD, not CC, wlarc should be empty +- wlarc='${wl}' +- +- # 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. +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- export_dynamic_flag_spec='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec= +- fi +- supports_anon_versioning=no +- case `$LD -v 2>&1` in +- *GNU\ gold*) supports_anon_versioning=yes ;; +- *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- +- # See if GNU ld supports shared libraries. +- 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 +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the GNU linker, at least up to release 2.19, is reported +-*** to be unable to reliably create shared libraries on AIX. +-*** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to install binutils +-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +-*** You will then need to restart the configuration process. +- +-_LT_EOF +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='' +- ;; +- m68k) +- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- esac +- ;; +- +- beos*) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, +- # as there is no search path for DLLs. +- hardcode_libdir_flag_spec='-L$libdir' +- export_dynamic_flag_spec='${wl}--export-all-symbols' +- allow_undefined_flag=unsupported +- always_export_symbols=no +- enable_shared_with_static_runtimes=yes +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' +- exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- haiku*) +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- link_all_deplibs=yes +- ;; +- +- interix[3-9]*) +- hardcode_direct=no +- hardcode_shlibpath_var=no +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- export_dynamic_flag_spec='${wl}-E' +- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. +- # Instead, shared libraries are loaded at an image base (0x10000000 by +- # default) and relocated if they conflict, which is a slow very memory +- # consuming and fragmenting process. To avoid this, we pick a random, +- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link +- # time. Moving up from 0x10000000 also allows more sbrk(2) space. +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- ;; +- +- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) +- tmp_diet=no +- if test "$host_os" = linux-dietlibc; then +- case $cc_basename in +- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) +- esac +- fi +- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ +- && test "$tmp_diet" = no +- then +- tmp_addflag=' $pic_flag' +- tmp_sharedflag='-shared' +- case $cc_basename,$host_cpu in +- pgcc*) # Portland Group C compiler +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- tmp_addflag=' $pic_flag' +- ;; +- pgf77* | pgf90* | pgf95* | pgfortran*) +- # Portland Group f77 and f90 compilers +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- tmp_addflag=' $pic_flag -Mnomain' ;; +- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 +- tmp_addflag=' -i_dynamic' ;; +- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 +- tmp_addflag=' -i_dynamic -nofor_main' ;; +- ifc* | ifort*) # Intel Fortran compiler +- tmp_addflag=' -nofor_main' ;; +- lf95*) # Lahey Fortran 8.1 +- whole_archive_flag_spec= +- tmp_sharedflag='--shared' ;; +- xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) +- tmp_sharedflag='-qmkshrobj' +- tmp_addflag= ;; +- nvcc*) # Cuda Compiler Driver 2.2 +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- compiler_needs_object=yes +- ;; +- esac +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) # Sun C 5.9 +- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- compiler_needs_object=yes +- tmp_sharedflag='-G' ;; +- *Sun\ F*) # Sun Fortran 8.3 +- tmp_sharedflag='-G' ;; +- esac +- archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- +- if test "x$supports_anon_versioning" = xyes; then +- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- fi +- +- case $cc_basename in +- xlf* | bgf* | bgxlf* | mpixlf*) +- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself +- whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' +- if test "x$supports_anon_versioning" = xyes; then +- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' +- fi +- ;; +- esac +- else +- ld_shlibs=no +- fi +- ;; +- +- netbsd* | netbsdelf*-gnu) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' +- wlarc= +- else +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- fi +- ;; +- +- solaris*) +- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then +- ld_shlibs=no +- cat <<_LT_EOF 1>&2 +- +-*** Warning: The releases 2.8.* of the GNU linker cannot reliably +-*** create shared libraries on Solaris systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.9.1 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-_LT_EOF +- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- 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 +- cat <<_LT_EOF 1>&2 +- +-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +-*** reliably create shared libraries on SCO systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-_LT_EOF +- ;; +- *) +- # For security reasons, it is highly recommended that you always +- # use absolute paths for naming shared libraries, and exclude the +- # DT_RUNPATH tag from executables and libraries. But doing so +- # requires that you compile everything twice, which is a pain. +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- esac +- ;; +- +- sunos4*) +- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- wlarc= +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- *) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- esac +- +- if test "$ld_shlibs" = no; then +- runpath_var= +- hardcode_libdir_flag_spec= +- export_dynamic_flag_spec= +- whole_archive_flag_spec= +- fi +- else +- # PORTME fill in a description of your system's linker (not GNU ld) +- case $host_os in +- aix3*) +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- hardcode_minus_L=yes +- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; 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 +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- else +- # If we're using GNU nm, then we don't want the "-C" option. +- # -C means demangle to AIX nm, but means don't demangle with GNU nm +- # Also, AIX nm treats weak defined symbols like other global +- # defined symbols, whereas GNU nm marks them as "W". +- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- else +- export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- fi +- 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 +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi +- +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- archive_cmds='' +- hardcode_direct=yes +- hardcode_direct_absolute=yes +- hardcode_libdir_separator=':' +- link_all_deplibs=yes +- file_list_spec='${wl}-f,' +- +- if test "$GCC" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) +- # We only want to do this on AIX 4.2 and lower, the check +- # below for broken collect2 doesn't work under 4.3+ +- 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 +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L=yes +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_libdir_separator= +- fi +- ;; +- esac +- shared_flag='-shared' +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag="$shared_flag "'${wl}-G' +- fi +- link_all_deplibs=no +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release +- # chokes on -Wl,-G. The following line is correct: +- shared_flag='-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi +- +- export_dynamic_flag_spec='${wl}-bexpall' +- # It seems that -bexpall does not export symbols beginning with +- # underscore (_), so it is better to generate a list of symbols to export. +- always_export_symbols=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag='-berok' +- # Determine the default libpath from the value encoded in an +- # empty executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath_+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath_ +-fi +- +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' +- allow_undefined_flag="-z nodefs" +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" +- else +- # Determine the default libpath from the value encoded in an +- # empty executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath_+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath_ +-fi +- +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- no_undefined_flag=' ${wl}-bernotok' +- allow_undefined_flag=' ${wl}-berok' +- if test "$with_gnu_ld" = yes; then +- # We only use this code for GNU lds that support --whole-archive. +- whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- else +- # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec='$convenience' +- fi +- archive_cmds_need_lc=yes +- # This is similar to how AIX traditionally builds its shared libraries. +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' +- fi +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='' +- ;; +- m68k) +- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- esac +- ;; +- +- bsdi[45]*) +- export_dynamic_flag_spec=-rdynamic +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # 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. +- case $cc_basename in +- cl*) +- # Native MSVC +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- file_list_spec='@' +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' +- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; +- else +- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; +- fi~ +- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ +- linknames=' +- # The linker will not automatically build a static lib if we build a DLL. +- # _LT_TAGVAR(old_archive_from_new_cmds, )='true' +- enable_shared_with_static_runtimes=yes +- exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' +- # Don't use ranlib +- old_postinstall_cmds='chmod 644 $oldlib' +- postlink_cmds='lt_outputfile="@OUTPUT@"~ +- lt_tool_outputfile="@TOOL_OUTPUT@"~ +- case $lt_outputfile in +- *.exe|*.EXE) ;; +- *) +- lt_outputfile="$lt_outputfile.exe" +- lt_tool_outputfile="$lt_tool_outputfile.exe" +- ;; +- esac~ +- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then +- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; +- $RM "$lt_outputfile.manifest"; +- fi' +- ;; +- *) +- # Assume MSVC wrapper +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' +- enable_shared_with_static_runtimes=yes +- ;; +- esac +- ;; +- +- darwin* | rhapsody*) +- +- +- archive_cmds_need_lc=no +- hardcode_direct=no +- hardcode_automatic=yes +- hardcode_shlibpath_var=unsupported +- if test "$lt_cv_ld_force_load" = "yes"; then +- whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' +- +- else +- whole_archive_flag_spec='' +- fi +- link_all_deplibs=yes +- allow_undefined_flag="$_lt_dar_allow_undefined" +- case $cc_basename in +- ifort*) _lt_dar_can_shared=yes ;; +- *) _lt_dar_can_shared=$GCC ;; +- esac +- if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=func_echo_all +- archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" +- module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" +- archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" +- module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" +- +- else +- ld_shlibs=no +- fi +- +- ;; +- +- dgux*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor +- # support. Future versions do this automatically, but an explicit c++rt0.o +- # does not break anything, and helps significantly (at the cost of a little +- # extra space). +- freebsd2.2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2.*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | dragonfly*) +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- hpux9*) +- if test "$GCC" = yes; then +- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- else +- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- fi +- 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 +- export_dynamic_flag_spec='${wl}-E' +- ;; +- +- hpux10*) +- if test "$GCC" = yes && test "$with_gnu_ld" = no; then +- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +- fi +- if test "$with_gnu_ld" = no; then +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- hardcode_direct_absolute=yes +- export_dynamic_flag_spec='${wl}-E' +- # 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 "$GCC" = yes && test "$with_gnu_ld" = no; then +- case $host_cpu in +- hppa*64*) +- archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- ia64*) +- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- else +- case $host_cpu in +- hppa*64*) +- archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- ia64*) +- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- +- # Older versions of the 11.00 compiler do not understand -b yet +- # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +-$as_echo_n "checking if $CC understands -b... " >&6; } +-if ${lt_cv_prog_compiler__b+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler__b=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -b" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler__b=yes +- fi +- else +- lt_cv_prog_compiler__b=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +-$as_echo "$lt_cv_prog_compiler__b" >&6; } +- +-if test x"$lt_cv_prog_compiler__b" = xyes; then +- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +-else +- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +-fi +- +- ;; +- esac +- fi +- 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_shlibpath_var=no +- ;; +- *) +- hardcode_direct=yes +- hardcode_direct_absolute=yes +- export_dynamic_flag_spec='${wl}-E' +- +- # 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*) +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- # Try to use the -exported_symbol ld option, if it does not +- # work, assume that -exports_file does not work either and +- # implicitly export all symbols. +- # This should be the same for all languages, so no per-tag cache variable. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +-if ${lt_cv_irix_exported_symbol+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-int foo (void) { return 0; } +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- lt_cv_irix_exported_symbol=yes +-else +- lt_cv_irix_exported_symbol=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS="$save_LDFLAGS" +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +-$as_echo "$lt_cv_irix_exported_symbol" >&6; } +- if test "$lt_cv_irix_exported_symbol" = yes; then +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' +- fi +- else +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' +- fi +- archive_cmds_need_lc='no' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- inherit_rpath=yes +- link_all_deplibs=yes +- ;; +- +- netbsd* | netbsdelf*-gnu) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out +- else +- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF +- fi +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- newsos6) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_shlibpath_var=no +- ;; +- +- *nto* | *qnx*) +- ;; +- +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- hardcode_direct_absolute=yes +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- export_dynamic_flag_spec='${wl}-E' +- else +- case $host_os in +- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- ;; +- *) +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- 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 +- allow_undefined_flag=unsupported +- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' +- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' +- ;; +- +- osf3*) +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- fi +- archive_cmds_need_lc='no' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- +- osf4* | osf5*) # as osf3* with the addition of -msym flag +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ +- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' +- +- # Both c and cxx compiler support -rpath directly +- hardcode_libdir_flag_spec='-rpath $libdir' +- fi +- archive_cmds_need_lc='no' +- hardcode_libdir_separator=: +- ;; +- +- solaris*) +- no_undefined_flag=' -z defs' +- if test "$GCC" = yes; then +- wlarc='${wl}' +- archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' +- else +- case `$CC -V 2>&1` in +- *"Compilers 5.0"*) +- wlarc='' +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' +- ;; +- *) +- wlarc='${wl}' +- archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' +- ;; +- esac +- fi +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_shlibpath_var=no +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) +- # The compiler driver will combine and reorder linker options, +- # but understands `-z linker_flag'. GCC discards it without `$wl', +- # but is careful enough not to reorder. +- # Supported since Solaris 2.6 (maybe 2.5.1?) +- if test "$GCC" = yes; then +- whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' +- else +- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' +- fi +- ;; +- esac +- link_all_deplibs=yes +- ;; +- +- sunos4*) +- if test "x$host_vendor" = xsequent; then +- # Use $CC to link under sequent, because it throws in some extra .o +- # files that make .init and .fini sections work. +- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' +- fi +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- sysv4) +- case $host_vendor in +- sni) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes # is this really true??? +- ;; +- siemens) +- ## LD is ld it makes a PLAMLIB +- ## CC just makes a GrossModule. +- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- reload_cmds='$CC -r -o $output$reload_objs' +- hardcode_direct=no +- ;; +- motorola) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=no #Motorola manual says yes, but my tests say they lie +- ;; +- esac +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; +- +- sysv4.3*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- export_dynamic_flag_spec='-Bexport' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ld_shlibs=yes +- fi +- ;; +- +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) +- no_undefined_flag='${wl}-z,text' +- archive_cmds_need_lc=no +- hardcode_shlibpath_var=no +- runpath_var='LD_RUN_PATH' +- +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- ;; +- +- sysv5* | sco3.2v5* | sco5v6*) +- # Note: We can NOT use -z defs as we might desire, because we do not +- # link with -lc, and that would cause any symbols used from libc to +- # always be unresolved, which means just about no library would +- # ever link correctly. If we're not using GNU ld we use -z text +- # though, which does catch some bad symbols but isn't as heavy-handed +- # as -z defs. +- no_undefined_flag='${wl}-z,text' +- allow_undefined_flag='${wl}-z,nodefs' +- archive_cmds_need_lc=no +- hardcode_shlibpath_var=no +- hardcode_libdir_flag_spec='${wl}-R,$libdir' +- hardcode_libdir_separator=':' +- link_all_deplibs=yes +- export_dynamic_flag_spec='${wl}-Bexport' +- runpath_var='LD_RUN_PATH' +- +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- ;; +- +- uts4*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- *) +- ld_shlibs=no +- ;; +- esac +- +- if test x$host_vendor = xsni; then +- case $host in +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- export_dynamic_flag_spec='${wl}-Blargedynsym' +- ;; +- esac +- fi +- fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +-$as_echo "$ld_shlibs" >&6; } +-test "$ld_shlibs" = no && can_build_shared=no +- +-with_gnu_ld=$with_gnu_ld +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-# +-# Do we need to explicitly link libc? +-# +-case "x$archive_cmds_need_lc" in +-x|xyes) +- # Assume -lc should be added +- archive_cmds_need_lc=yes +- +- if test "$enable_shared" = yes && test "$GCC" = yes; then +- case $archive_cmds in +- *'~'*) +- # FIXME: we may have to deal with multi-command sequences. +- ;; +- '$CC '*) +- # Test whether the compiler implicitly links with -lc since on some +- # systems, -lgcc has to come before -lc. If gcc already passes -lc +- # to ld, don't add -lc before -lgcc. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +-if ${lt_cv_archive_cmds_need_lc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_prog_compiler_wl +- pic_flag=$lt_prog_compiler_pic +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$allow_undefined_flag +- allow_undefined_flag= +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 +- (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- then +- lt_cv_archive_cmds_need_lc=no +- else +- lt_cv_archive_cmds_need_lc=yes +- fi +- allow_undefined_flag=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } +- archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc +- ;; +- esac +- fi +- ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +-$as_echo_n "checking dynamic linker characteristics... " >&6; } +- +-if test "$GCC" = yes; then +- case $host_os in +- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; +- *) lt_awk_arg="/^libraries:/" ;; +- esac +- case $host_os in +- mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; +- *) lt_sed_strip_eq="s,=/,/,g" ;; +- esac +- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` +- case $lt_search_path_spec in +- *\;*) +- # if the path contains ";" then we assume it to be the separator +- # otherwise default to the standard path separator (i.e. ":") - it is +- # assumed that no part of a normal pathname contains ";" but that should +- # okay in the real world where ";" in dirpaths is itself problematic. +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` +- ;; +- *) +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` +- ;; +- esac +- # Ok, now we have the path, separated by spaces, we can step through it +- # and add multilib dir if necessary. +- lt_tmp_lt_search_path_spec= +- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` +- for lt_sys_path in $lt_search_path_spec; do +- if test -d "$lt_sys_path/$lt_multi_os_dir"; then +- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" +- else +- test -d "$lt_sys_path" && \ +- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" +- fi +- done +- lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +-BEGIN {RS=" "; FS="/|\n";} { +- lt_foo=""; +- lt_count=0; +- for (lt_i = NF; lt_i > 0; lt_i--) { +- if ($lt_i != "" && $lt_i != ".") { +- if ($lt_i == "..") { +- lt_count++; +- } else { +- if (lt_count == 0) { +- lt_foo="/" $lt_i lt_foo; +- } else { +- lt_count--; +- } +- } +- } +- } +- if (lt_foo != "") { lt_freq[lt_foo]++; } +- if (lt_freq[lt_foo] == 1) { print lt_foo; } +-}'` +- # AWK program above erroneously prepends '/' to C:/dos/paths +- # for these hosts. +- case $host_os in +- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ +- $SED 's,/\([A-Za-z]:\),\1,g'` ;; +- esac +- sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +-else +- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +-fi +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-shrext_cmds=".so" +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-need_lib_prefix=unknown +-hardcode_into_libs=no +- +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-need_version=unknown +- +-case $host_os in +-aix3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' +- shlibpath_var=LIBPATH +- +- # AIX 3 has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- +-aix[4-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- hardcode_into_libs=yes +- if test "$host_cpu" = ia64; then +- # AIX 5 supports IA64 +- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- else +- # With GCC up to 2.95.x, collect2 would create an import file +- # for dependence libraries. The import file would start with +- # the line `#! .'. This would cause the generated library to +- # depend on `.', always an invalid library. This was fixed in +- # development snapshots of GCC prior to 3.0. +- case $host_os in +- aix4 | aix4.[01] | aix4.[01].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then +- : +- else +- can_build_shared=no +- fi +- ;; +- esac +- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct +- # soname into executable. Probably we can add versioning support to +- # collect2, so additional links can be useful in future. +- if test "$aix_use_runtimelinking" = yes; then +- # If using run time linking (on AIX 4.2 or later) use lib.so +- # instead of lib.a to let people know that these are not +- # typical AIX shared libraries. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- else +- # We preserve .a as extension for shared libraries through AIX4.2 +- # and later when we are not doing run time linking. +- library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}${shared_ext}$major' +- fi +- shlibpath_var=LIBPATH +- fi +- ;; +- +-amigaos*) +- case $host_cpu in +- powerpc) +- # Since July 2007 AmigaOS4 officially supports .so libraries. +- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- ;; +- m68k) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' +- ;; +- esac +- ;; +- +-beos*) +- library_names_spec='${libname}${shared_ext}' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- ;; +- +-bsdi[45]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw* | pw32* | cegcc*) +- version_type=windows +- shrext_cmds=".dll" +- need_version=no +- need_lib_prefix=no +- +- case $GCC,$cc_basename in +- yes,*) +- # gcc +- library_names_spec='$libname.dll.a' +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname~ +- chmod a+x \$dldir/$dlname~ +- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; +- fi' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- +- case $host_os in +- cygwin*) +- # Cygwin DLLs use 'cyg' prefix rather than 'lib' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- +- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" +- ;; +- mingw* | cegcc*) +- # MinGW DLLs use traditional 'lib' prefix +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- pw32*) +- # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- ;; +- +- *,cl*) +- # Native MSVC +- libname_spec='$name' +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- library_names_spec='${libname}.dll.lib' +- +- case $build_os in +- mingw*) +- sys_lib_search_path_spec= +- lt_save_ifs=$IFS +- IFS=';' +- for lt_path in $LIB +- do +- IFS=$lt_save_ifs +- # Let DOS variable expansion print the short 8.3 style file name. +- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` +- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" +- done +- IFS=$lt_save_ifs +- # Convert to MSYS style. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` +- ;; +- cygwin*) +- # Convert to unix form, then to dos form, then back to unix form +- # but this time dos style (no spaces!) so that the unix form looks +- # like /cygdrive/c/PROGRA~1:/cygdr... +- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` +- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` +- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- ;; +- *) +- sys_lib_search_path_spec="$LIB" +- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then +- # It is most probably a Windows format PATH. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- # FIXME: find the short name or the path components, as spaces are +- # common. (e.g. "Program Files" -> "PROGRA~1") +- ;; +- esac +- +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- dynamic_linker='Win32 link.exe' +- ;; +- +- *) +- # Assume MSVC wrapper +- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' +- dynamic_linker='Win32 ld.exe' +- ;; +- esac +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; +- +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +- soname_spec='${libname}${release}${major}$shared_ext' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +- +- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" +- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +- ;; +- +-dgux*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-freebsd* | dragonfly*) +- # DragonFly does not have aout. When/if they implement a new +- # versioning mechanism, adjust this. +- if test -x /usr/bin/objformat; then +- objformat=`/usr/bin/objformat` +- else +- case $host_os in +- freebsd[23].*) objformat=aout ;; +- *) objformat=elf ;; +- esac +- fi +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2.*) +- shlibpath_overrides_runpath=yes +- ;; +- freebsd3.[01]* | freebsdelf3.[01]*) +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ +- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- *) # from 4.6 on, and DragonFly +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- esac +- ;; +- +-haiku*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- dynamic_linker="$host_os runtime_loader" +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- case $host_cpu in +- ia64*) +- shrext_cmds='.so' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.so" +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- if test "X$HPUX_IA64_MODE" = X32; then +- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" +- else +- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" +- fi +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- hppa*64*) +- shrext_cmds='.sl' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- *) +- shrext_cmds='.sl' +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555, ... +- postinstall_cmds='chmod 555 $lib' +- # or fails outright, so override atomically: +- install_override_mode=555 +- ;; +- +-interix[3-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $host_os in +- nonstopux*) version_type=nonstopux ;; +- *) +- if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux # correct to gnu/linux during the next big refactor +- else +- version_type=irix +- fi ;; +- esac +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +- case $host_os in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") +- libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") +- libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") +- libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- hardcode_into_libs=yes +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux*oldld* | linux*aout* | linux*coff*) +- dynamic_linker=no +- ;; +- +-# This must be glibc/ELF. +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- +- # Some binutils ld are patched to set DT_RUNPATH +- if ${lt_cv_shlibpath_overrides_runpath+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_shlibpath_overrides_runpath=no +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ +- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +- lt_cv_shlibpath_overrides_runpath=yes +-fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir +- +-fi +- +- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath +- +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes +- +- # Append ld.so.conf contents to the search path +- if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" +- fi +- +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; +- +-netbsdelf*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='NetBSD ld.elf_so' +- ;; +- +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- +-newsos6) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-*nto* | *qnx*) +- version_type=qnx +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='ldqnx.so' +- ;; +- +-openbsd*) +- version_type=sunos +- sys_lib_dlsearch_path_spec="/usr/lib" +- need_lib_prefix=no +- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. +- case $host_os in +- openbsd3.3 | openbsd3.3.*) need_version=yes ;; +- *) need_version=no ;; +- esac +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case $host_os in +- openbsd2.[89] | openbsd2.[89].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac +- else +- shlibpath_overrides_runpath=yes +- fi +- ;; +- +-os2*) +- libname_spec='$name' +- shrext_cmds=".dll" +- need_lib_prefix=no +- library_names_spec='$libname${shared_ext} $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-rdos*) +- dynamic_linker=no +- ;; +- +-solaris*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- case $host_vendor in +- sni) +- shlibpath_overrides_runpath=no +- need_lib_prefix=no +- runpath_var=LD_RUN_PATH +- ;; +- siemens) +- need_lib_prefix=no +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- ;; +- esac +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' +- soname_spec='$libname${shared_ext}.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- version_type=freebsd-elf +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- if test "$with_gnu_ld" = yes; then +- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' +- else +- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' +- case $host_os in +- sco3.2v5*) +- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" +- ;; +- esac +- fi +- sys_lib_dlsearch_path_spec='/usr/lib' +- ;; +- +-tpf*) +- # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-uts4*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +-$as_echo "$dynamic_linker" >&6; } +-test "$dynamic_linker" = no && can_build_shared=no +- +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- +-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then +- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +-fi +-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then +- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +-$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +-hardcode_action= +-if test -n "$hardcode_libdir_flag_spec" || +- test -n "$runpath_var" || +- test "X$hardcode_automatic" = "Xyes" ; then +- +- # We can hardcode non-existent directories. +- if test "$hardcode_direct" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && +- test "$hardcode_minus_L" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action=unsupported +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +-$as_echo "$hardcode_action" >&6; } +- +-if test "$hardcode_action" = relink || +- test "$inherit_rpath" = yes; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +- +- +- +- +- +- +- if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +- lt_cv_dlopen=no +- lt_cv_dlopen_libs= +- +- case $host_os in +- beos*) +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; +- +- mingw* | pw32* | cegcc*) +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; +- +- cygwin*) +- lt_cv_dlopen="dlopen" +- lt_cv_dlopen_libs= +- ;; +- +- darwin*) +- # if libdl is installed we need to link against it +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +-$as_echo_n "checking for dlopen in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen (); +-int +-main () +-{ +-return dlopen (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dl_dlopen=yes +-else +- ac_cv_lib_dl_dlopen=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +-$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- +- lt_cv_dlopen="dyld" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- +-fi +- +- ;; +- +- *) +- ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +-if test "x$ac_cv_func_shl_load" = xyes; then : +- lt_cv_dlopen="shl_load" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +-$as_echo_n "checking for shl_load in -ldld... " >&6; } +-if ${ac_cv_lib_dld_shl_load+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char shl_load (); +-int +-main () +-{ +-return shl_load (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dld_shl_load=yes +-else +- ac_cv_lib_dld_shl_load=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +-$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +-if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +-else +- ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +-if test "x$ac_cv_func_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +-$as_echo_n "checking for dlopen in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen (); +-int +-main () +-{ +-return dlopen (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dl_dlopen=yes +-else +- ac_cv_lib_dl_dlopen=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +-$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +-$as_echo_n "checking for dlopen in -lsvld... " >&6; } +-if ${ac_cv_lib_svld_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lsvld $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen (); +-int +-main () +-{ +-return dlopen (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_svld_dlopen=yes +-else +- ac_cv_lib_svld_dlopen=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +-$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +-if test "x$ac_cv_lib_svld_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +-$as_echo_n "checking for dld_link in -ldld... " >&6; } +-if ${ac_cv_lib_dld_dld_link+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dld_link (); +-int +-main () +-{ +-return dld_link (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dld_dld_link=yes +-else +- ac_cv_lib_dld_dld_link=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +-$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +-if test "x$ac_cv_lib_dld_dld_link" = xyes; then : +- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- ;; +- esac +- +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- else +- enable_dlopen=no +- fi +- +- case $lt_cv_dlopen in +- dlopen) +- save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +- +- save_LDFLAGS="$LDFLAGS" +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +- +- save_LIBS="$LIBS" +- LIBS="$lt_cv_dlopen_libs $LIBS" +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +-$as_echo_n "checking whether a program can dlopen itself... " >&6; } +-if ${lt_cv_dlopen_self+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#if HAVE_DLFCN_H +-#include +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-/* When -fvisbility=hidden is used, assume the code has been annotated +- correspondingly for the symbols needed. */ +-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +-int fnord () __attribute__((visibility("default"))); +-#endif +- +-int fnord () { return 42; } +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; +- +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else +- { +- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- else puts (dlerror ()); +- } +- /* dlclose (self); */ +- } +- else +- puts (dlerror ()); +- +- return status; +-} +-_LT_EOF +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) >&5 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self=no +- fi +-fi +-rm -fr conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +-$as_echo "$lt_cv_dlopen_self" >&6; } +- +- if test "x$lt_cv_dlopen_self" = xyes; then +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +-if ${lt_cv_dlopen_self_static+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self_static=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#if HAVE_DLFCN_H +-#include +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-/* When -fvisbility=hidden is used, assume the code has been annotated +- correspondingly for the symbols needed. */ +-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +-int fnord () __attribute__((visibility("default"))); +-#endif +- +-int fnord () { return 42; } +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; +- +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else +- { +- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- else puts (dlerror ()); +- } +- /* dlclose (self); */ +- } +- else +- puts (dlerror ()); +- +- return status; +-} +-_LT_EOF +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) >&5 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self_static=no +- fi +-fi +-rm -fr conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +-$as_echo "$lt_cv_dlopen_self_static" >&6; } +- fi +- +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac +- +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac +- +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-striplib= +-old_striplib= +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +-$as_echo_n "checking whether stripping libraries is possible... " >&6; } +-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +-# FIXME - insert some real tests, host_os isn't really good enough +- case $host_os in +- darwin*) +- if test -n "$STRIP" ; then +- striplib="$STRIP -x" +- old_striplib="$STRIP -S" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- fi +- ;; +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- ;; +- esac +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- # Report which library types will actually be built +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +-$as_echo_n "checking if libtool supports shared libraries... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +-$as_echo "$can_build_shared" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +-$as_echo_n "checking whether to build shared libraries... " >&6; } +- test "$can_build_shared" = "no" && enable_shared=no +- +- # On AIX, shared libraries and static libraries use the same namespace, and +- # are all built from PIC. +- case $host_os in +- aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; +- +- aix[4-9]*) +- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then +- test "$enable_shared" = yes && enable_static=no +- fi +- ;; +- esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +-$as_echo "$enable_shared" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +-$as_echo_n "checking whether to build static libraries... " >&6; } +- # Make sure either enable_shared or enable_static is yes. +- test "$enable_shared" = yes || enable_static=yes +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +-$as_echo "$enable_static" >&6; } +- +- +- +- +-fi +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-CC="$lt_save_CC" +- +- if test -n "$CXX" && ( test "X$CXX" != "Xno" && +- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || +- (test "X$CXX" != "Xg++"))) ; then +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +-$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +-if test -z "$CXXCPP"; then +- if ${ac_cv_prog_CXXCPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CXXCPP needs to be expanded +- for CXXCPP in "$CXX -E" "/lib/cpp" +- do +- ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- break +-fi +- +- done +- ac_cv_prog_CXXCPP=$CXXCPP +- +-fi +- CXXCPP=$ac_cv_prog_CXXCPP +-else +- ac_cv_prog_CXXCPP=$CXXCPP +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +-$as_echo "$CXXCPP" >&6; } +-ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-else +- _lt_caught_CXX_error=yes +-fi +- +-ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +- +-archive_cmds_need_lc_CXX=no +-allow_undefined_flag_CXX= +-always_export_symbols_CXX=no +-archive_expsym_cmds_CXX= +-compiler_needs_object_CXX=no +-export_dynamic_flag_spec_CXX= +-hardcode_direct_CXX=no +-hardcode_direct_absolute_CXX=no +-hardcode_libdir_flag_spec_CXX= +-hardcode_libdir_separator_CXX= +-hardcode_minus_L_CXX=no +-hardcode_shlibpath_var_CXX=unsupported +-hardcode_automatic_CXX=no +-inherit_rpath_CXX=no +-module_cmds_CXX= +-module_expsym_cmds_CXX= +-link_all_deplibs_CXX=unknown +-old_archive_cmds_CXX=$old_archive_cmds +-reload_flag_CXX=$reload_flag +-reload_cmds_CXX=$reload_cmds +-no_undefined_flag_CXX= +-whole_archive_flag_spec_CXX= +-enable_shared_with_static_runtimes_CXX=no +- +-# Source file extension for C++ test sources. +-ac_ext=cpp +- +-# Object file extension for compiled C++ test sources. +-objext=o +-objext_CXX=$objext +- +-# No sense in running all these tests if we already determined that +-# the CXX compiler isn't working. Some variables (like enable_shared) +-# are currently assumed to apply to all compilers on this platform, +-# and will be corrupted by setting them based on a non-working compiler. +-if test "$_lt_caught_CXX_error" != yes; then +- # Code to be used in simple compile tests +- lt_simple_compile_test_code="int some_variable = 0;" +- +- # Code to be used in simple link tests +- lt_simple_link_test_code='int main(int, char *[]) { return(0); }' +- +- # ltmain only uses $CC for tagged configurations so make sure $CC is set. +- +- +- +- +- +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +- +- +- # save warnings/boilerplate of simple test code +- ac_outfile=conftest.$ac_objext +-echo "$lt_simple_compile_test_code" >conftest.$ac_ext +-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_compiler_boilerplate=`cat conftest.err` +-$RM conftest* +- +- ac_outfile=conftest.$ac_objext +-echo "$lt_simple_link_test_code" >conftest.$ac_ext +-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_linker_boilerplate=`cat conftest.err` +-$RM -r conftest* +- +- +- # Allow CC to be a program name with arguments. +- lt_save_CC=$CC +- lt_save_CFLAGS=$CFLAGS +- lt_save_LD=$LD +- lt_save_GCC=$GCC +- GCC=$GXX +- lt_save_with_gnu_ld=$with_gnu_ld +- lt_save_path_LD=$lt_cv_path_LD +- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then +- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +- else +- $as_unset lt_cv_prog_gnu_ld +- fi +- if test -n "${lt_cv_path_LDCXX+set}"; then +- lt_cv_path_LD=$lt_cv_path_LDCXX +- else +- $as_unset lt_cv_path_LD +- fi +- test -z "${LDCXX+set}" || LD=$LDCXX +- CC=${CXX-"c++"} +- CFLAGS=$CXXFLAGS +- compiler=$CC +- compiler_CXX=$CC +- for cc_temp in $compiler""; do +- case $cc_temp in +- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; +- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; +- \-*) ;; +- *) break;; +- esac +-done +-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +- +- +- if test -n "$compiler"; then +- # We don't want -fno-exception when compiling C++ code, so set the +- # no_builtin_flag separately +- if test "$GXX" = yes; then +- lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +- else +- lt_prog_compiler_no_builtin_flag_CXX= +- fi +- +- if test "$GXX" = yes; then +- # Set up default GNU C++ configuration +- +- +- +-@%:@ Check whether --with-gnu-ld was given. +-if test "${with_gnu_ld+set}" = set; then : +- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +-else +- with_gnu_ld=no +-fi +- +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +-$as_echo_n "checking for ld used by $CC... " >&6; } +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [\\/]* | ?:[\\/]*) +- re_direlt='/[^/][^/]*/\.\./' +- # Canonicalize the pathname of ld +- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` +- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +-$as_echo_n "checking for GNU ld... " >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +-$as_echo_n "checking for non-GNU ld... " >&6; } +-fi +-if ${lt_cv_path_LD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$LD"; then +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$lt_cv_path_LD" -v 2>&1 &5 +-$as_echo "$LD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +-if ${lt_cv_prog_gnu_ld+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # I'd rather use --version here, but apparently some GNU lds only accept -v. +-case `$LD -v 2>&1 &5 +-$as_echo "$lt_cv_prog_gnu_ld" >&6; } +-with_gnu_ld=$lt_cv_prog_gnu_ld +- +- +- +- +- +- +- +- # Check if GNU C++ uses GNU ld as the underlying linker, since the +- # archiving commands below assume that GNU ld is being used. +- if test "$with_gnu_ld" = yes; then +- archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- +- # If archive_cmds runs LD, not CC, wlarc should be empty +- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to +- # investigate it a little bit more. (MM) +- wlarc='${wl}' +- +- # ancient GNU ld didn't support --whole-archive et. al. +- if eval "`$CC -print-prog-name=ld` --help 2>&1" | +- $GREP 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec_CXX= +- fi +- else +- with_gnu_ld=no +- wlarc= +- +- # A generic and very simple default shared library creation +- # command for GNU C++ for the case where it uses the native +- # linker, instead of GNU ld. If possible, this setting should +- # overridden to take advantage of the native linker features on +- # the platform it is being used on. +- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' +- fi +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- +- else +- GXX=no +- with_gnu_ld=no +- wlarc= +- fi +- +- # PORTME: fill in a description of your system's C++ link characteristics +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +- ld_shlibs_CXX=yes +- case $host_os in +- aix3*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- 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 +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- 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 +- case $ld_flag in +- *-brtl*) +- aix_use_runtimelinking=yes +- break +- ;; +- esac +- done +- ;; +- esac +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi +- +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- archive_cmds_CXX='' +- hardcode_direct_CXX=yes +- hardcode_direct_absolute_CXX=yes +- hardcode_libdir_separator_CXX=':' +- link_all_deplibs_CXX=yes +- file_list_spec_CXX='${wl}-f,' +- +- if test "$GXX" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) +- # We only want to do this on AIX 4.2 and lower, the check +- # below for broken collect2 doesn't work under 4.3+ +- 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_CXX=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L_CXX=yes +- hardcode_libdir_flag_spec_CXX='-L$libdir' +- hardcode_libdir_separator_CXX= +- fi +- esac +- shared_flag='-shared' +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag="$shared_flag "'${wl}-G' +- fi +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release +- # chokes on -Wl,-G. The following line is correct: +- shared_flag='-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi +- +- export_dynamic_flag_spec_CXX='${wl}-bexpall' +- # It seems that -bexpall does not export symbols beginning with +- # underscore (_), so it is better to generate a list of symbols to +- # export. +- always_export_symbols_CXX=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag_CXX='-berok' +- # Determine the default libpath from the value encoded in an empty +- # executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath__CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath__CXX +-fi +- +- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" +- +- archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' +- allow_undefined_flag_CXX="-z nodefs" +- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" +- else +- # Determine the default libpath from the value encoded in an +- # empty executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath__CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath__CXX +-fi +- +- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- no_undefined_flag_CXX=' ${wl}-bernotok' +- allow_undefined_flag_CXX=' ${wl}-berok' +- if test "$with_gnu_ld" = yes; then +- # We only use this code for GNU lds that support --whole-archive. +- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- else +- # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec_CXX='$convenience' +- fi +- archive_cmds_need_lc_CXX=yes +- # This is similar to how AIX traditionally builds its shared +- # libraries. +- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' +- fi +- fi +- ;; +- +- beos*) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag_CXX=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs_CXX=no +- fi +- ;; +- +- chorus*) +- case $cc_basename in +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- case $GXX,$cc_basename in +- ,cl* | no,cl*) +- # Native MSVC +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec_CXX=' ' +- allow_undefined_flag_CXX=unsupported +- always_export_symbols_CXX=yes +- file_list_spec_CXX='@' +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' +- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; +- else +- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; +- fi~ +- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ +- linknames=' +- # The linker will not automatically build a static lib if we build a DLL. +- # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' +- enable_shared_with_static_runtimes_CXX=yes +- # Don't use ranlib +- old_postinstall_cmds_CXX='chmod 644 $oldlib' +- postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ +- lt_tool_outputfile="@TOOL_OUTPUT@"~ +- case $lt_outputfile in +- *.exe|*.EXE) ;; +- *) +- lt_outputfile="$lt_outputfile.exe" +- lt_tool_outputfile="$lt_tool_outputfile.exe" +- ;; +- esac~ +- func_to_tool_file "$lt_outputfile"~ +- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then +- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; +- $RM "$lt_outputfile.manifest"; +- fi' +- ;; +- *) +- # g++ +- # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, +- # as there is no search path for DLLs. +- hardcode_libdir_flag_spec_CXX='-L$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' +- allow_undefined_flag_CXX=unsupported +- always_export_symbols_CXX=no +- enable_shared_with_static_runtimes_CXX=yes +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- darwin* | rhapsody*) +- +- +- archive_cmds_need_lc_CXX=no +- hardcode_direct_CXX=no +- hardcode_automatic_CXX=yes +- hardcode_shlibpath_var_CXX=unsupported +- if test "$lt_cv_ld_force_load" = "yes"; then +- whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' +- +- else +- whole_archive_flag_spec_CXX='' +- fi +- link_all_deplibs_CXX=yes +- allow_undefined_flag_CXX="$_lt_dar_allow_undefined" +- case $cc_basename in +- ifort*) _lt_dar_can_shared=yes ;; +- *) _lt_dar_can_shared=$GCC ;; +- esac +- if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=func_echo_all +- archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" +- module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" +- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" +- module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" +- if test "$lt_cv_apple_cc_single_mod" != "yes"; then +- archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" +- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" +- fi +- +- else +- ld_shlibs_CXX=no +- fi +- +- ;; +- +- dgux*) +- case $cc_basename in +- ec++*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- ghcx*) +- # Green Hills C++ Compiler +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- freebsd2.*) +- # C++ shared libraries reported to be fairly broken before +- # switch to ELF +- ld_shlibs_CXX=no +- ;; +- +- freebsd-elf*) +- archive_cmds_need_lc_CXX=no +- ;; +- +- freebsd* | dragonfly*) +- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF +- # conventions +- ld_shlibs_CXX=yes +- ;; +- +- haiku*) +- archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- link_all_deplibs_CXX=yes +- ;; +- +- hpux9*) +- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- export_dynamic_flag_spec_CXX='${wl}-E' +- hardcode_direct_CXX=yes +- hardcode_minus_L_CXX=yes # Not in the search PATH, +- # but as the default +- # location of the library. +- +- case $cc_basename in +- CC*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- aCC*) +- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- ;; +- *) +- if test "$GXX" = yes; then +- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- else +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- +- hpux10*|hpux11*) +- if test $with_gnu_ld = no; then +- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- +- case $host_cpu in +- hppa*64*|ia64*) +- ;; +- *) +- export_dynamic_flag_spec_CXX='${wl}-E' +- ;; +- esac +- fi +- case $host_cpu in +- hppa*64*|ia64*) +- hardcode_direct_CXX=no +- hardcode_shlibpath_var_CXX=no +- ;; +- *) +- hardcode_direct_CXX=yes +- hardcode_direct_absolute_CXX=yes +- hardcode_minus_L_CXX=yes # Not in the search PATH, +- # but as the default +- # location of the library. +- ;; +- esac +- +- case $cc_basename in +- CC*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- aCC*) +- case $host_cpu in +- hppa*64*) +- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- ia64*) +- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- *) +- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- esac +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- ;; +- *) +- if test "$GXX" = yes; then +- if test $with_gnu_ld = no; then +- case $host_cpu in +- hppa*64*) +- archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- ia64*) +- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- *) +- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- esac +- fi +- else +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- +- interix[3-9]*) +- hardcode_direct_CXX=no +- hardcode_shlibpath_var_CXX=no +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- export_dynamic_flag_spec_CXX='${wl}-E' +- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. +- # Instead, shared libraries are loaded at an image base (0x10000000 by +- # default) and relocated if they conflict, which is a slow very memory +- # consuming and fragmenting process. To avoid this, we pick a random, +- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link +- # time. Moving up from 0x10000000 also allows more sbrk(2) space. +- archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- ;; +- irix5* | irix6*) +- case $cc_basename in +- CC*) +- # SGI C++ +- archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- +- # Archives containing C++ object files must be created using +- # "CC -ar", where "CC" is the IRIX C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' +- ;; +- *) +- if test "$GXX" = yes; then +- if test "$with_gnu_ld" = no; then +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' +- fi +- fi +- link_all_deplibs_CXX=yes +- ;; +- esac +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- inherit_rpath_CXX=yes +- ;; +- +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- case $cc_basename in +- KCC*) +- # Kuck and Associates, Inc. (KAI) C++ Compiler +- +- # KCC will only create a shared library if the output file +- # ends with ".so" (or ".sl" for HP-UX), so rename the library +- # to its proper name (with version) after linking. +- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +- archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- +- # Archives containing C++ object files must be created using +- # "CC -Bstatic", where "CC" is the KAI C++ compiler. +- old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' +- ;; +- icpc* | ecpc* ) +- # Intel C++ +- with_gnu_ld=yes +- # version 8.0 and above of icpc choke on multiply defined symbols +- # if we add $predep_objects and $postdep_objects, however 7.1 and +- # earlier do not add the objects themselves. +- case `$CC -V 2>&1` in +- *"Version 7."*) +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- ;; +- *) # Version 8.0 or newer +- tmp_idyn= +- case $host_cpu in +- ia64*) tmp_idyn=' -i_dynamic';; +- esac +- archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- ;; +- esac +- archive_cmds_need_lc_CXX=no +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- ;; +- pgCC* | pgcpp*) +- # Portland Group C++ compiler +- case `$CC -V` in +- *pgCC\ [1-5].* | *pgcpp\ [1-5].*) +- prelink_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ +- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' +- old_archive_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ +- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ +- $RANLIB $oldlib' +- archive_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' +- archive_expsym_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' +- ;; +- *) # Version 6 and above use weak symbols +- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' +- ;; +- esac +- +- hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- ;; +- cxx*) +- # Compaq C++ +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' +- +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec_CXX='-rpath $libdir' +- hardcode_libdir_separator_CXX=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' +- ;; +- xl* | mpixl* | bgxl*) +- # IBM XL 8.0 on PPC, with GNU ld +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- if test "x$supports_anon_versioning" = xyes; then +- archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- fi +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- no_undefined_flag_CXX=' -zdefs' +- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' +- hardcode_libdir_flag_spec_CXX='-R$libdir' +- whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- compiler_needs_object_CXX=yes +- +- # Not sure whether something based on +- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 +- # would be better. +- output_verbose_link_cmd='func_echo_all' +- +- # Archives containing C++ object files must be created using +- # "CC -xar", where "CC" is the Sun C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' +- ;; +- esac +- ;; +- esac +- ;; +- +- lynxos*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- m88k*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- mvs*) +- case $cc_basename in +- cxx*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' +- wlarc= +- hardcode_libdir_flag_spec_CXX='-R$libdir' +- hardcode_direct_CXX=yes +- hardcode_shlibpath_var_CXX=no +- fi +- # Workaround some broken pre-1.5 toolchains +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' +- ;; +- +- *nto* | *qnx*) +- ld_shlibs_CXX=yes +- ;; +- +- openbsd2*) +- # C++ shared libraries are fairly broken +- ld_shlibs_CXX=no +- ;; +- +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- hardcode_direct_CXX=yes +- hardcode_shlibpath_var_CXX=no +- hardcode_direct_absolute_CXX=yes +- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' +- export_dynamic_flag_spec_CXX='${wl}-E' +- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- fi +- output_verbose_link_cmd=func_echo_all +- else +- ld_shlibs_CXX=no +- fi +- ;; +- +- osf3* | osf4* | osf5*) +- case $cc_basename in +- KCC*) +- # Kuck and Associates, Inc. (KAI) C++ Compiler +- +- # KCC will only create a shared library if the output file +- # ends with ".so" (or ".sl" for HP-UX), so rename the library +- # to its proper name (with version) after linking. +- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- hardcode_libdir_separator_CXX=: +- +- # Archives containing C++ object files must be created using +- # the KAI C++ compiler. +- case $host in +- osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; +- *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; +- esac +- ;; +- RCC*) +- # Rational C++ 2.4.1 +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- cxx*) +- case $host in +- osf3*) +- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- ;; +- *) +- allow_undefined_flag_CXX=' -expect_unresolved \*' +- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ +- echo "-hidden">> $lib.exp~ +- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ +- $RM $lib.exp' +- hardcode_libdir_flag_spec_CXX='-rpath $libdir' +- ;; +- esac +- +- hardcode_libdir_separator_CXX=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- ;; +- *) +- if test "$GXX" = yes && test "$with_gnu_ld" = no; then +- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- case $host in +- osf3*) +- archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- ;; +- *) +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- ;; +- esac +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- +- else +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- +- psos*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- sunos4*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.x +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- lcc*) +- # Lucid +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- solaris*) +- case $cc_basename in +- CC* | sunCC*) +- # Sun C++ 4.2, 5.x and Centerline C++ +- archive_cmds_need_lc_CXX=yes +- no_undefined_flag_CXX=' -zdefs' +- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- hardcode_libdir_flag_spec_CXX='-R$libdir' +- hardcode_shlibpath_var_CXX=no +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) +- # The compiler driver will combine and reorder linker options, +- # but understands `-z linker_flag'. +- # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' +- ;; +- esac +- link_all_deplibs_CXX=yes +- +- output_verbose_link_cmd='func_echo_all' +- +- # Archives containing C++ object files must be created using +- # "CC -xar", where "CC" is the Sun C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' +- ;; +- gcx*) +- # Green Hills C++ Compiler +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- +- # The C++ compiler must be used to create the archive. +- old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' +- ;; +- *) +- # GNU C++ compiler with Solaris linker +- if test "$GXX" = yes && test "$with_gnu_ld" = no; then +- no_undefined_flag_CXX=' ${wl}-z ${wl}defs' +- if $CC --version | $GREP -v '^2\.7' > /dev/null; then +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- else +- # g++ 2.7 appears to require `-G' NOT `-shared' on this +- # platform. +- archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- fi +- +- hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) +- whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' +- ;; +- esac +- fi +- ;; +- esac +- ;; +- +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) +- no_undefined_flag_CXX='${wl}-z,text' +- archive_cmds_need_lc_CXX=no +- hardcode_shlibpath_var_CXX=no +- runpath_var='LD_RUN_PATH' +- +- case $cc_basename in +- CC*) +- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- ;; +- +- sysv5* | sco3.2v5* | sco5v6*) +- # Note: We can NOT use -z defs as we might desire, because we do not +- # link with -lc, and that would cause any symbols used from libc to +- # always be unresolved, which means just about no library would +- # ever link correctly. If we're not using GNU ld we use -z text +- # though, which does catch some bad symbols but isn't as heavy-handed +- # as -z defs. +- no_undefined_flag_CXX='${wl}-z,text' +- allow_undefined_flag_CXX='${wl}-z,nodefs' +- archive_cmds_need_lc_CXX=no +- hardcode_shlibpath_var_CXX=no +- hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' +- hardcode_libdir_separator_CXX=':' +- link_all_deplibs_CXX=yes +- export_dynamic_flag_spec_CXX='${wl}-Bexport' +- runpath_var='LD_RUN_PATH' +- +- case $cc_basename in +- CC*) +- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ +- '"$old_archive_cmds_CXX" +- reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ +- '"$reload_cmds_CXX" +- ;; +- *) +- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- ;; +- +- tandem*) +- case $cc_basename in +- NCC*) +- # NonStop-UX NCC 3.20 +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- vxworks*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +-$as_echo "$ld_shlibs_CXX" >&6; } +- test "$ld_shlibs_CXX" = no && can_build_shared=no +- +- GCC_CXX="$GXX" +- LD_CXX="$LD" +- +- ## CAVEAT EMPTOR: +- ## There is no encapsulation within the following macros, do not change +- ## the running order or otherwise move them around unless you know exactly +- ## what you are doing... +- # Dependencies to place before and after the object being linked: +-predep_objects_CXX= +-postdep_objects_CXX= +-predeps_CXX= +-postdeps_CXX= +-compiler_lib_search_path_CXX= +- +-cat > conftest.$ac_ext <<_LT_EOF +-class Foo +-{ +-public: +- Foo (void) { a = 0; } +-private: +- int a; +-}; +-_LT_EOF +- +- +-_lt_libdeps_save_CFLAGS=$CFLAGS +-case "$CC $CFLAGS " in #( +-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +-esac +- +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- # Parse the compiler output and extract the necessary +- # objects, libraries and library flags. +- +- # Sentinel used to keep track of whether or not we are before +- # the conftest object file. +- pre_test_object_deps_done=no +- +- for p in `eval "$output_verbose_link_cmd"`; do +- case ${prev}${p} in +- +- -L* | -R* | -l*) +- # Some compilers place space between "-{L,R}" and the path. +- # Remove the space. +- if test $p = "-L" || +- test $p = "-R"; then +- prev=$p +- continue +- fi +- +- # Expand the sysroot to ease extracting the directories later. +- if test -z "$prev"; then +- case $p in +- -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; +- -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; +- -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; +- esac +- fi +- case $p in +- =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; +- esac +- if test "$pre_test_object_deps_done" = no; then +- case ${prev} in +- -L | -R) +- # Internal compiler library paths should come after those +- # provided the user. The postdeps already come after the +- # user supplied libs so there is no need to process them. +- if test -z "$compiler_lib_search_path_CXX"; then +- compiler_lib_search_path_CXX="${prev}${p}" +- else +- compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" +- fi +- ;; +- # The "-l" case would never come before the object being +- # linked, so don't bother handling this case. +- esac +- else +- if test -z "$postdeps_CXX"; then +- postdeps_CXX="${prev}${p}" +- else +- postdeps_CXX="${postdeps_CXX} ${prev}${p}" +- fi +- fi +- prev= +- ;; +- +- *.lto.$objext) ;; # Ignore GCC LTO objects +- *.$objext) +- # This assumes that the test object file only shows up +- # once in the compiler output. +- if test "$p" = "conftest.$objext"; then +- pre_test_object_deps_done=yes +- continue +- fi +- +- if test "$pre_test_object_deps_done" = no; then +- if test -z "$predep_objects_CXX"; then +- predep_objects_CXX="$p" +- else +- predep_objects_CXX="$predep_objects_CXX $p" +- fi +- else +- if test -z "$postdep_objects_CXX"; then +- postdep_objects_CXX="$p" +- else +- postdep_objects_CXX="$postdep_objects_CXX $p" +- fi +- fi +- ;; +- +- *) ;; # Ignore the rest. +- +- esac +- done +- +- # Clean up. +- rm -f a.out a.exe +-else +- echo "libtool.m4: error: problem compiling CXX test program" +-fi +- +-$RM -f confest.$objext +-CFLAGS=$_lt_libdeps_save_CFLAGS +- +-# PORTME: override above test on systems where it is broken +-case $host_os in +-interix[3-9]*) +- # Interix 3.5 installs completely hosed .la files for C++, so rather than +- # hack all around it, let's just trust "g++" to DTRT. +- predep_objects_CXX= +- postdep_objects_CXX= +- postdeps_CXX= +- ;; +- +-linux*) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- +- # The more standards-conforming stlport4 library is +- # incompatible with the Cstd library. Avoid specifying +- # it if it's in CXXFLAGS. Ignore libCrun as +- # -library=stlport4 depends on it. +- case " $CXX $CXXFLAGS " in +- *" -library=stlport4 "*) +- solaris_use_stlport4=yes +- ;; +- esac +- +- if test "$solaris_use_stlport4" != yes; then +- postdeps_CXX='-library=Cstd -library=Crun' +- fi +- ;; +- esac +- ;; +- +-solaris*) +- case $cc_basename in +- CC* | sunCC*) +- # The more standards-conforming stlport4 library is +- # incompatible with the Cstd library. Avoid specifying +- # it if it's in CXXFLAGS. Ignore libCrun as +- # -library=stlport4 depends on it. +- case " $CXX $CXXFLAGS " in +- *" -library=stlport4 "*) +- solaris_use_stlport4=yes +- ;; +- esac +- +- # Adding this requires a known-good setup of shared libraries for +- # Sun compiler versions before 5.6, else PIC objects from an old +- # archive will be linked into the output, leading to subtle bugs. +- if test "$solaris_use_stlport4" != yes; then +- postdeps_CXX='-library=Cstd -library=Crun' +- fi +- ;; +- esac +- ;; +-esac +- +- +-case " $postdeps_CXX " in +-*" -lc "*) archive_cmds_need_lc_CXX=no ;; +-esac +- compiler_lib_search_dirs_CXX= +-if test -n "${compiler_lib_search_path_CXX}"; then +- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- lt_prog_compiler_wl_CXX= +-lt_prog_compiler_pic_CXX= +-lt_prog_compiler_static_CXX= +- +- +- # C++ specific cases for pic, static, wl, etc. +- if test "$GXX" = yes; then +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='-static' +- +- case $host_os in +- aix*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static_CXX='-Bstatic' +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- m68k) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' +- ;; +- esac +- ;; +- +- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- mingw* | cygwin* | os2* | pw32* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- # Although the cygwin gcc ignores -fPIC, still need this for old-style +- # (--disable-auto-import) libraries +- lt_prog_compiler_pic_CXX='-DDLL_EXPORT' +- ;; +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- lt_prog_compiler_pic_CXX='-fno-common' +- ;; +- *djgpp*) +- # DJGPP does not support shared libraries at all +- lt_prog_compiler_pic_CXX= +- ;; +- haiku*) +- # PIC is the default for Haiku. +- # The "-static" flag exists, but is broken. +- lt_prog_compiler_static_CXX= +- ;; +- interix[3-9]*) +- # Interix 3.x gcc -fpic/-fPIC options generate broken code. +- # Instead, we relocate shared libraries at runtime. +- ;; +- sysv4*MP*) +- if test -d /usr/nec; then +- lt_prog_compiler_pic_CXX=-Kconform_pic +- fi +- ;; +- hpux*) +- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit +- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag +- # sets the default TLS model and affects inlining. +- case $host_cpu in +- hppa*64*) +- ;; +- *) +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- esac +- ;; +- *qnx* | *nto*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic_CXX='-fPIC -shared' +- ;; +- *) +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- esac +- else +- case $host_os in +- aix[4-9]*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static_CXX='-Bstatic' +- else +- lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' +- fi +- ;; +- chorus*) +- case $cc_basename in +- cxch68*) +- # Green Hills C++ Compiler +- # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" +- ;; +- esac +- ;; +- mingw* | cygwin* | os2* | pw32* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_prog_compiler_pic_CXX='-DDLL_EXPORT' +- ;; +- dgux*) +- case $cc_basename in +- ec++*) +- lt_prog_compiler_pic_CXX='-KPIC' +- ;; +- ghcx*) +- # Green Hills C++ Compiler +- lt_prog_compiler_pic_CXX='-pic' +- ;; +- *) +- ;; +- esac +- ;; +- freebsd* | dragonfly*) +- # FreeBSD uses GNU C++ +- ;; +- hpux9* | hpux10* | hpux11*) +- case $cc_basename in +- CC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' +- if test "$host_cpu" != ia64; then +- lt_prog_compiler_pic_CXX='+Z' +- fi +- ;; +- aCC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' +- case $host_cpu in +- hppa*64*|ia64*) +- # +Z the default +- ;; +- *) +- lt_prog_compiler_pic_CXX='+Z' +- ;; +- esac +- ;; +- *) +- ;; +- esac +- ;; +- interix*) +- # This is c89, which is MS Visual C++ (no shared libs) +- # Anyone wants to do a port? +- ;; +- irix5* | irix6* | nonstopux*) +- case $cc_basename in +- CC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='-non_shared' +- # CC pic flag -KPIC is the default. +- ;; +- *) +- ;; +- esac +- ;; +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- case $cc_basename in +- KCC*) +- # KAI C++ Compiler +- lt_prog_compiler_wl_CXX='--backend -Wl,' +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- ecpc* ) +- # old Intel C++ for x86_64 which still supported -KPIC. +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-static' +- ;; +- icpc* ) +- # Intel C++, used to be incompatible with GCC. +- # ICC 10 doesn't accept -KPIC any more. +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-fPIC' +- lt_prog_compiler_static_CXX='-static' +- ;; +- pgCC* | pgcpp*) +- # Portland Group C++ compiler +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-fpic' +- lt_prog_compiler_static_CXX='-Bstatic' +- ;; +- cxx*) +- # Compaq C++ +- # Make sure the PIC flag is empty. It appears that all Alpha +- # Linux and Compaq Tru64 Unix objects are PIC. +- lt_prog_compiler_pic_CXX= +- lt_prog_compiler_static_CXX='-non_shared' +- ;; +- xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) +- # IBM XL 8.0, 9.0 on PPC and BlueGene +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-qpic' +- lt_prog_compiler_static_CXX='-qstaticlink' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-Bstatic' +- lt_prog_compiler_wl_CXX='-Qoption ld ' +- ;; +- esac +- ;; +- esac +- ;; +- lynxos*) +- ;; +- m88k*) +- ;; +- mvs*) +- case $cc_basename in +- cxx*) +- lt_prog_compiler_pic_CXX='-W c,exportall' +- ;; +- *) +- ;; +- esac +- ;; +- netbsd* | netbsdelf*-gnu) +- ;; +- *qnx* | *nto*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic_CXX='-fPIC -shared' +- ;; +- osf3* | osf4* | osf5*) +- case $cc_basename in +- KCC*) +- lt_prog_compiler_wl_CXX='--backend -Wl,' +- ;; +- RCC*) +- # Rational C++ 2.4.1 +- lt_prog_compiler_pic_CXX='-pic' +- ;; +- cxx*) +- # Digital/Compaq C++ +- lt_prog_compiler_wl_CXX='-Wl,' +- # Make sure the PIC flag is empty. It appears that all Alpha +- # Linux and Compaq Tru64 Unix objects are PIC. +- lt_prog_compiler_pic_CXX= +- lt_prog_compiler_static_CXX='-non_shared' +- ;; +- *) +- ;; +- esac +- ;; +- psos*) +- ;; +- solaris*) +- case $cc_basename in +- CC* | sunCC*) +- # Sun C++ 4.2, 5.x and Centerline C++ +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-Bstatic' +- lt_prog_compiler_wl_CXX='-Qoption ld ' +- ;; +- gcx*) +- # Green Hills C++ Compiler +- lt_prog_compiler_pic_CXX='-PIC' +- ;; +- *) +- ;; +- esac +- ;; +- sunos4*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.x +- lt_prog_compiler_pic_CXX='-pic' +- lt_prog_compiler_static_CXX='-Bstatic' +- ;; +- lcc*) +- # Lucid +- lt_prog_compiler_pic_CXX='-pic' +- ;; +- *) +- ;; +- esac +- ;; +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- case $cc_basename in +- CC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-Bstatic' +- ;; +- esac +- ;; +- tandem*) +- case $cc_basename in +- NCC*) +- # NonStop-UX NCC 3.20 +- lt_prog_compiler_pic_CXX='-KPIC' +- ;; +- *) +- ;; +- esac +- ;; +- vxworks*) +- ;; +- *) +- lt_prog_compiler_can_build_shared_CXX=no +- ;; +- esac +- fi +- +-case $host_os in +- # For platforms which do not support PIC, -DPIC is meaningless: +- *djgpp*) +- lt_prog_compiler_pic_CXX= +- ;; +- *) +- lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" +- ;; +-esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +-$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +-if ${lt_cv_prog_compiler_pic_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX +- +-# +-# Check to make sure the PIC flag actually works. +-# +-if test -n "$lt_prog_compiler_pic_CXX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic_works_CXX=no +- ac_outfile=conftest.$ac_objext +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_pic_works_CXX=yes +- fi +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } +- +-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then +- case $lt_prog_compiler_pic_CXX in +- "" | " "*) ;; +- *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; +- esac +-else +- lt_prog_compiler_pic_CXX= +- lt_prog_compiler_can_build_shared_CXX=no +-fi +- +-fi +- +- +- +- +- +-# +-# Check to make sure the static flag actually works. +-# +-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_static_works_CXX=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_tmp_static_flag" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_static_works_CXX=yes +- fi +- else +- lt_cv_prog_compiler_static_works_CXX=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } +- +-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then +- : +-else +- lt_prog_compiler_static_CXX= +-fi +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o_CXX=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o_CXX=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o_CXX=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o_CXX=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } +- +- +- +- +-hard_links="nottested" +-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +-$as_echo_n "checking if we can lock with hard links... " >&6; } +- hard_links=yes +- $RM conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +-$as_echo "$hard_links" >&6; } +- if test "$hard_links" = no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} +- need_locks=warn +- fi +-else +- need_locks=no +-fi +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +- +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +- case $host_os in +- aix[4-9]*) +- # If we're using GNU nm, then we don't want the "-C" option. +- # -C means demangle to AIX nm, but means don't demangle with GNU nm +- # Also, AIX nm treats weak defined symbols like other global defined +- # symbols, whereas GNU nm marks them as "W". +- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- else +- export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- fi +- ;; +- pw32*) +- export_symbols_cmds_CXX="$ltdll_cmds" +- ;; +- cygwin* | mingw* | cegcc*) +- case $cc_basename in +- cl*) +- exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' +- ;; +- *) +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' +- exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' +- ;; +- esac +- ;; +- linux* | k*bsd*-gnu | gnu*) +- link_all_deplibs_CXX=no +- ;; +- *) +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- ;; +- esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +-$as_echo "$ld_shlibs_CXX" >&6; } +-test "$ld_shlibs_CXX" = no && can_build_shared=no +- +-with_gnu_ld_CXX=$with_gnu_ld +- +- +- +- +- +- +-# +-# Do we need to explicitly link libc? +-# +-case "x$archive_cmds_need_lc_CXX" in +-x|xyes) +- # Assume -lc should be added +- archive_cmds_need_lc_CXX=yes +- +- if test "$enable_shared" = yes && test "$GCC" = yes; then +- case $archive_cmds_CXX in +- *'~'*) +- # FIXME: we may have to deal with multi-command sequences. +- ;; +- '$CC '*) +- # Test whether the compiler implicitly links with -lc since on some +- # systems, -lgcc has to come before -lc. If gcc already passes -lc +- # to ld, don't add -lc before -lgcc. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_prog_compiler_wl_CXX +- pic_flag=$lt_prog_compiler_pic_CXX +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$allow_undefined_flag_CXX +- allow_undefined_flag_CXX= +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 +- (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- then +- lt_cv_archive_cmds_need_lc_CXX=no +- else +- lt_cv_archive_cmds_need_lc_CXX=yes +- fi +- allow_undefined_flag_CXX=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } +- archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX +- ;; +- esac +- fi +- ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +-$as_echo_n "checking dynamic linker characteristics... " >&6; } +- +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-shrext_cmds=".so" +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-need_lib_prefix=unknown +-hardcode_into_libs=no +- +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-need_version=unknown +- +-case $host_os in +-aix3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' +- shlibpath_var=LIBPATH +- +- # AIX 3 has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- +-aix[4-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- hardcode_into_libs=yes +- if test "$host_cpu" = ia64; then +- # AIX 5 supports IA64 +- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- else +- # With GCC up to 2.95.x, collect2 would create an import file +- # for dependence libraries. The import file would start with +- # the line `#! .'. This would cause the generated library to +- # depend on `.', always an invalid library. This was fixed in +- # development snapshots of GCC prior to 3.0. +- case $host_os in +- aix4 | aix4.[01] | aix4.[01].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then +- : +- else +- can_build_shared=no +- fi +- ;; +- esac +- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct +- # soname into executable. Probably we can add versioning support to +- # collect2, so additional links can be useful in future. +- if test "$aix_use_runtimelinking" = yes; then +- # If using run time linking (on AIX 4.2 or later) use lib.so +- # instead of lib.a to let people know that these are not +- # typical AIX shared libraries. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- else +- # We preserve .a as extension for shared libraries through AIX4.2 +- # and later when we are not doing run time linking. +- library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}${shared_ext}$major' +- fi +- shlibpath_var=LIBPATH +- fi +- ;; +- +-amigaos*) +- case $host_cpu in +- powerpc) +- # Since July 2007 AmigaOS4 officially supports .so libraries. +- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- ;; +- m68k) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' +- ;; +- esac +- ;; +- +-beos*) +- library_names_spec='${libname}${shared_ext}' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- ;; +- +-bsdi[45]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw* | pw32* | cegcc*) +- version_type=windows +- shrext_cmds=".dll" +- need_version=no +- need_lib_prefix=no +- +- case $GCC,$cc_basename in +- yes,*) +- # gcc +- library_names_spec='$libname.dll.a' +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname~ +- chmod a+x \$dldir/$dlname~ +- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; +- fi' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- +- case $host_os in +- cygwin*) +- # Cygwin DLLs use 'cyg' prefix rather than 'lib' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- +- ;; +- mingw* | cegcc*) +- # MinGW DLLs use traditional 'lib' prefix +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- pw32*) +- # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- ;; +- +- *,cl*) +- # Native MSVC +- libname_spec='$name' +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- library_names_spec='${libname}.dll.lib' +- +- case $build_os in +- mingw*) +- sys_lib_search_path_spec= +- lt_save_ifs=$IFS +- IFS=';' +- for lt_path in $LIB +- do +- IFS=$lt_save_ifs +- # Let DOS variable expansion print the short 8.3 style file name. +- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` +- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" +- done +- IFS=$lt_save_ifs +- # Convert to MSYS style. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` +- ;; +- cygwin*) +- # Convert to unix form, then to dos form, then back to unix form +- # but this time dos style (no spaces!) so that the unix form looks +- # like /cygdrive/c/PROGRA~1:/cygdr... +- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` +- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` +- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- ;; +- *) +- sys_lib_search_path_spec="$LIB" +- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then +- # It is most probably a Windows format PATH. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- # FIXME: find the short name or the path components, as spaces are +- # common. (e.g. "Program Files" -> "PROGRA~1") +- ;; +- esac +- +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- dynamic_linker='Win32 link.exe' +- ;; +- +- *) +- # Assume MSVC wrapper +- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' +- dynamic_linker='Win32 ld.exe' +- ;; +- esac +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; +- +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +- soname_spec='${libname}${release}${major}$shared_ext' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +- +- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +- ;; +- +-dgux*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-freebsd* | dragonfly*) +- # DragonFly does not have aout. When/if they implement a new +- # versioning mechanism, adjust this. +- if test -x /usr/bin/objformat; then +- objformat=`/usr/bin/objformat` +- else +- case $host_os in +- freebsd[23].*) objformat=aout ;; +- *) objformat=elf ;; +- esac +- fi +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2.*) +- shlibpath_overrides_runpath=yes +- ;; +- freebsd3.[01]* | freebsdelf3.[01]*) +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ +- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- *) # from 4.6 on, and DragonFly +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- esac +- ;; +- +-haiku*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- dynamic_linker="$host_os runtime_loader" +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- case $host_cpu in +- ia64*) +- shrext_cmds='.so' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.so" +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- if test "X$HPUX_IA64_MODE" = X32; then +- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" +- else +- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" +- fi +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- hppa*64*) +- shrext_cmds='.sl' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- *) +- shrext_cmds='.sl' +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555, ... +- postinstall_cmds='chmod 555 $lib' +- # or fails outright, so override atomically: +- install_override_mode=555 +- ;; +- +-interix[3-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $host_os in +- nonstopux*) version_type=nonstopux ;; +- *) +- if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux # correct to gnu/linux during the next big refactor +- else +- version_type=irix +- fi ;; +- esac +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +- case $host_os in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") +- libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") +- libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") +- libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- hardcode_into_libs=yes +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux*oldld* | linux*aout* | linux*coff*) +- dynamic_linker=no +- ;; +- +-# This must be glibc/ELF. +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- +- # Some binutils ld are patched to set DT_RUNPATH +- if ${lt_cv_shlibpath_overrides_runpath+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_shlibpath_overrides_runpath=no +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ +- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_link "$LINENO"; then : +- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +- lt_cv_shlibpath_overrides_runpath=yes +-fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir +- +-fi +- +- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath +- +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes +- +- # Append ld.so.conf contents to the search path +- if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" +- fi +- +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; +- +-netbsdelf*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='NetBSD ld.elf_so' +- ;; +- +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- +-newsos6) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-*nto* | *qnx*) +- version_type=qnx +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='ldqnx.so' +- ;; +- +-openbsd*) +- version_type=sunos +- sys_lib_dlsearch_path_spec="/usr/lib" +- need_lib_prefix=no +- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. +- case $host_os in +- openbsd3.3 | openbsd3.3.*) need_version=yes ;; +- *) need_version=no ;; +- esac +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case $host_os in +- openbsd2.[89] | openbsd2.[89].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac +- else +- shlibpath_overrides_runpath=yes +- fi +- ;; +- +-os2*) +- libname_spec='$name' +- shrext_cmds=".dll" +- need_lib_prefix=no +- library_names_spec='$libname${shared_ext} $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-rdos*) +- dynamic_linker=no +- ;; +- +-solaris*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- case $host_vendor in +- sni) +- shlibpath_overrides_runpath=no +- need_lib_prefix=no +- runpath_var=LD_RUN_PATH +- ;; +- siemens) +- need_lib_prefix=no +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- ;; +- esac +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' +- soname_spec='$libname${shared_ext}.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- version_type=freebsd-elf +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- if test "$with_gnu_ld" = yes; then +- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' +- else +- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' +- case $host_os in +- sco3.2v5*) +- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" +- ;; +- esac +- fi +- sys_lib_dlsearch_path_spec='/usr/lib' +- ;; +- +-tpf*) +- # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-uts4*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +-$as_echo "$dynamic_linker" >&6; } +-test "$dynamic_linker" = no && can_build_shared=no +- +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- +-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then +- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +-fi +-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then +- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +-$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +-hardcode_action_CXX= +-if test -n "$hardcode_libdir_flag_spec_CXX" || +- test -n "$runpath_var_CXX" || +- test "X$hardcode_automatic_CXX" = "Xyes" ; then +- +- # We can hardcode non-existent directories. +- if test "$hardcode_direct_CXX" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && +- test "$hardcode_minus_L_CXX" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action_CXX=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action_CXX=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action_CXX=unsupported +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +-$as_echo "$hardcode_action_CXX" >&6; } +- +-if test "$hardcode_action_CXX" = relink || +- test "$inherit_rpath_CXX" = yes; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +- +- +- +- +- +- +- +- fi # test -n "$compiler" +- +- CC=$lt_save_CC +- CFLAGS=$lt_save_CFLAGS +- LDCXX=$LD +- LD=$lt_save_LD +- GCC=$lt_save_GCC +- with_gnu_ld=$lt_save_with_gnu_ld +- lt_cv_path_LDCXX=$lt_cv_path_LD +- lt_cv_path_LD=$lt_save_path_LD +- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +-fi # test "$_lt_caught_CXX_error" != yes +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ac_config_commands="$ac_config_commands libtool" +- +- +- +- +-# Only expand once: +- +- +- +-# Generate an error here if attempting to build both shared and static when +-# $libname.a is in $library_names_spec (as mentioned above), rather than +-# wait for ar or ld to fail. +-# +-if test "$enable_shared" = yes && test "$enable_static" = yes; then +- case $library_names_spec in +- *libname.a*) +- as_fn_error $? "cannot create both shared and static libraries on this system, --disable one of the two" "$LINENO" 5 +- ;; +- esac +-fi +- +- if test "$enable_static" = yes; then +- ENABLE_STATIC_TRUE= +- ENABLE_STATIC_FALSE='#' +-else +- ENABLE_STATIC_TRUE='#' +- ENABLE_STATIC_FALSE= +-fi +- +- +- +-# Many of these library and header checks are for the benefit of +-# supplementary programs. libgmp doesn't use anything too weird. +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +-$as_echo_n "checking for ANSI C header files... " >&6; } +-if ${ac_cv_header_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_stdc=yes +-else +- ac_cv_header_stdc=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-if test $ac_cv_header_stdc = yes; then +- # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "memchr" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "free" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +- if test "$cross_compiling" = yes; then : +- : +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#if ((' ' & 0x0FF) == 0x020) +-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +-#else +-# define ISLOWER(c) \ +- (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) +-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +-#endif +- +-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +-int +-main () +-{ +- int i; +- for (i = 0; i < 256; i++) +- if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) +- return 2; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +-$as_echo "$ac_cv_header_stdc" >&6; } +-if test $ac_cv_header_stdc = yes; then +- +-$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +-$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +-if ${ac_cv_header_time+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +- +-int +-main () +-{ +-if ((struct tm *) 0) +-return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_time=yes +-else +- ac_cv_header_time=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +-$as_echo "$ac_cv_header_time" >&6; } +-if test $ac_cv_header_time = yes; then +- +-$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h +- +-fi +- +- +-# Reasons for testing: +-# float.h - not in SunOS bundled cc +-# invent.h - IRIX specific +-# langinfo.h - X/Open standard only, not in djgpp for instance +-# locale.h - old systems won't have this +-# nl_types.h - X/Open standard only, not in djgpp for instance +-# (usually langinfo.h gives nl_item etc, but not on netbsd 1.4.1) +-# sys/attributes.h - IRIX specific +-# sys/iograph.h - IRIX specific +-# sys/mman.h - not in Cray Unicos +-# sys/param.h - not in mingw +-# sys/processor.h - solaris specific, though also present in macos +-# sys/pstat.h - HPUX specific +-# sys/resource.h - not in mingw +-# sys/sysctl.h - not in mingw +-# sys/sysinfo.h - OSF specific +-# sys/syssgi.h - IRIX specific +-# sys/systemcfg.h - AIX specific +-# sys/time.h - autoconf suggests testing, don't know anywhere without it +-# sys/times.h - not in mingw +-# machine/hal_sysinfo.h - OSF specific +-# +-# inttypes.h, stdint.h, unistd.h and sys/types.h are already in the autoconf +-# default tests +-# +-for ac_header in fcntl.h float.h invent.h langinfo.h locale.h nl_types.h sys/attributes.h sys/iograph.h sys/mman.h sys/param.h sys/processor.h sys/pstat.h sys/sysinfo.h sys/syssgi.h sys/systemcfg.h sys/time.h sys/times.h +-do : +- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +-_ACEOF +- +-fi +- +-done +- +- +-# On SunOS, sys/resource.h needs sys/time.h (for struct timeval) +-for ac_header in sys/resource.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "#if TIME_WITH_SYS_TIME +-# include +-# include +-#else +-# if HAVE_SYS_TIME_H +-# include +-# else +-# include +-# endif +-#endif +-" +-if test "x$ac_cv_header_sys_resource_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SYS_RESOURCE_H 1 +-_ACEOF +- +-fi +- +-done +- +- +-# On NetBSD and OpenBSD, sys/sysctl.h needs sys/param.h for various constants +-for ac_header in sys/sysctl.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "#if HAVE_SYS_PARAM_H +-# include +-#endif +-" +-if test "x$ac_cv_header_sys_sysctl_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SYS_SYSCTL_H 1 +-_ACEOF +- +-fi +- +-done +- +- +-# On OSF 4.0, must have for ulong_t +-for ac_header in machine/hal_sysinfo.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "machine/hal_sysinfo.h" "ac_cv_header_machine_hal_sysinfo_h" "#if HAVE_SYS_SYSINFO_H +-# include +-#endif +-" +-if test "x$ac_cv_header_machine_hal_sysinfo_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_MACHINE_HAL_SYSINFO_H 1 +-_ACEOF +- +-fi +- +-done +- +- +-# Reasons for testing: +-# optarg - not declared in mingw +-# fgetc, fscanf, ungetc, vfprintf - not declared in SunOS 4 +-# sys_errlist, sys_nerr - not declared in SunOS 4 +-# +-# optarg should be in unistd.h and the rest in stdio.h, both of which are +-# in the autoconf default includes. +-# +-# sys_errlist and sys_nerr are supposed to be in on SunOS according +-# to the man page (but aren't), in glibc they're in stdio.h. +-# +-ac_fn_c_check_decl "$LINENO" "fgetc" "ac_cv_have_decl_fgetc" "$ac_includes_default" +-if test "x$ac_cv_have_decl_fgetc" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_FGETC $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "fscanf" "ac_cv_have_decl_fscanf" "$ac_includes_default" +-if test "x$ac_cv_have_decl_fscanf" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_FSCANF $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "optarg" "ac_cv_have_decl_optarg" "$ac_includes_default" +-if test "x$ac_cv_have_decl_optarg" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_OPTARG $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "ungetc" "ac_cv_have_decl_ungetc" "$ac_includes_default" +-if test "x$ac_cv_have_decl_ungetc" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_UNGETC $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "vfprintf" "ac_cv_have_decl_vfprintf" "$ac_includes_default" +-if test "x$ac_cv_have_decl_vfprintf" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_VFPRINTF $ac_have_decl +-_ACEOF +- +-ac_fn_c_check_decl "$LINENO" "sys_errlist" "ac_cv_have_decl_sys_errlist" "#include +-#include +-" +-if test "x$ac_cv_have_decl_sys_errlist" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_SYS_ERRLIST $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "sys_nerr" "ac_cv_have_decl_sys_nerr" "#include +-#include +-" +-if test "x$ac_cv_have_decl_sys_nerr" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_SYS_NERR $ac_have_decl +-_ACEOF +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +-$as_echo_n "checking return type of signal handlers... " >&6; } +-if ${ac_cv_type_signal+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +- +-int +-main () +-{ +-return *(signal (0, 0)) (0) == 1; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_type_signal=int +-else +- ac_cv_type_signal=void +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +-$as_echo "$ac_cv_type_signal" >&6; } +- +-cat >>confdefs.h <<_ACEOF +-@%:@define RETSIGTYPE $ac_cv_type_signal +-_ACEOF +- +- +- +-# Reasons for testing: +-# intmax_t - C99 +-# long double - not in the HP bundled K&R cc +-# long long - only in reasonably recent compilers +-# ptrdiff_t - seems to be everywhere, maybe don't need to check this +-# quad_t - BSD specific +-# uint_least32_t - C99 +-# +-# the default includes are sufficient for all these types +-# +-ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default" +-if test "x$ac_cv_type_intmax_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_INTMAX_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "long double" "ac_cv_type_long_double" "$ac_includes_default" +-if test "x$ac_cv_type_long_double" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_LONG_DOUBLE 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +-if test "x$ac_cv_type_long_long" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_LONG_LONG 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +-if test "x$ac_cv_type_ptrdiff_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_PTRDIFF_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "quad_t" "ac_cv_type_quad_t" "$ac_includes_default" +-if test "x$ac_cv_type_quad_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_QUAD_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "uint_least32_t" "ac_cv_type_uint_least32_t" "$ac_includes_default" +-if test "x$ac_cv_type_uint_least32_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_UINT_LEAST32_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +-if test "x$ac_cv_type_intptr_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_INTPTR_T 1 +-_ACEOF +- +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for preprocessor stringizing operator" >&5 +-$as_echo_n "checking for preprocessor stringizing operator... " >&6; } +-if ${ac_cv_c_stringize+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@define x(y) #y +- +-char *s = x(teststring); +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "@%:@teststring" >/dev/null 2>&1; then : +- ac_cv_c_stringize=no +-else +- ac_cv_c_stringize=yes +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stringize" >&5 +-$as_echo "$ac_cv_c_stringize" >&6; } +-if test $ac_cv_c_stringize = yes; then +- +-$as_echo "@%:@define HAVE_STRINGIZE 1" >>confdefs.h +- +-fi +- +- +-# FIXME: Really want #ifndef __cplusplus around the #define volatile +-# replacement autoconf gives, since volatile is always available in C++. +-# But we don't use it in C++ currently. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +-$as_echo_n "checking for working volatile... " >&6; } +-if ${ac_cv_c_volatile+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +-volatile int x; +-int * volatile y = (int *) 0; +-return !x && !y; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_volatile=yes +-else +- ac_cv_c_volatile=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +-$as_echo "$ac_cv_c_volatile" >&6; } +-if test $ac_cv_c_volatile = no; then +- +-$as_echo "@%:@define volatile /**/" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 +-$as_echo_n "checking for C/C++ restrict keyword... " >&6; } +-if ${ac_cv_c_restrict+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_c_restrict=no +- # The order here caters to the fact that C++ does not require restrict. +- for ac_kw in __restrict __restrict__ _Restrict restrict; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-typedef int * int_ptr; +- int foo (int_ptr $ac_kw ip) { +- return ip[0]; +- } +-int +-main () +-{ +-int s[1]; +- int * $ac_kw t = s; +- t[0] = 0; +- return foo(t) +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_restrict=$ac_kw +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- test "$ac_cv_c_restrict" != no && break +- done +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 +-$as_echo "$ac_cv_c_restrict" >&6; } +- +- case $ac_cv_c_restrict in +- restrict) ;; +- no) $as_echo "@%:@define restrict /**/" >>confdefs.h +- ;; +- *) cat >>confdefs.h <<_ACEOF +-@%:@define restrict $ac_cv_c_restrict +-_ACEOF +- ;; +- esac +- +- +-# GMP_C_STDARG +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((const)) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((const)) works... " >&6; } +-if ${gmp_cv_c_attribute_const+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-int foo (int x) __attribute__ ((const)); +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- gmp_cv_c_attribute_const=yes +-else +- gmp_cv_c_attribute_const=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_const" >&5 +-$as_echo "$gmp_cv_c_attribute_const" >&6; } +-if test $gmp_cv_c_attribute_const = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_CONST 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((malloc)) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((malloc)) works... " >&6; } +-if ${gmp_cv_c_attribute_malloc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "attribute directive ignored" conftest.out >/dev/null; then +- gmp_cv_c_attribute_malloc=no +- else +- gmp_cv_c_attribute_malloc=yes +- fi +-else +- gmp_cv_c_attribute_malloc=no +-fi +-cat conftest.out >&5 +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_malloc" >&5 +-$as_echo "$gmp_cv_c_attribute_malloc" >&6; } +-if test $gmp_cv_c_attribute_malloc = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_MALLOC 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((mode (XX))) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((mode (XX))) works... " >&6; } +-if ${gmp_cv_c_attribute_mode+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-typedef int SItype __attribute__ ((mode (SI))); +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- gmp_cv_c_attribute_mode=yes +-else +- gmp_cv_c_attribute_mode=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_mode" >&5 +-$as_echo "$gmp_cv_c_attribute_mode" >&6; } +-if test $gmp_cv_c_attribute_mode = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_MODE 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((noreturn)) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((noreturn)) works... " >&6; } +-if ${gmp_cv_c_attribute_noreturn+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-void foo (int x) __attribute__ ((noreturn)); +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- gmp_cv_c_attribute_noreturn=yes +-else +- gmp_cv_c_attribute_noreturn=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_noreturn" >&5 +-$as_echo "$gmp_cv_c_attribute_noreturn" >&6; } +-if test $gmp_cv_c_attribute_noreturn = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_NORETURN 1" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +-$as_echo_n "checking for inline... " >&6; } +-if ${ac_cv_c_inline+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_c_inline=no +-for ac_kw in inline __inline__ __inline; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#ifndef __cplusplus +-typedef int foo_t; +-static $ac_kw foo_t static_foo () {return 0; } +-$ac_kw foo_t foo () {return 0; } +-#endif +- +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_inline=$ac_kw +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- test "$ac_cv_c_inline" != no && break +-done +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +-$as_echo "$ac_cv_c_inline" >&6; } +- +-case $ac_cv_c_inline in +- inline | yes) ;; +- *) +- case $ac_cv_c_inline in +- no) ac_val=;; +- *) ac_val=$ac_cv_c_inline;; +- esac +- cat >>confdefs.h <<_ACEOF +-#ifndef __cplusplus +-#define inline $ac_val +-#endif +-_ACEOF +- ;; +-esac +- +- +-case $ac_cv_c_inline in +-no) ;; +-*) +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#define __GMP_WITHIN_CONFIGURE_INLINE 1 +-#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include "$srcdir/gmp-h.in" +- +-#ifndef __GMP_EXTERN_INLINE +-die die die +-#endif +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- case $ac_cv_c_inline in +- yes) tmp_inline=inline ;; +- *) tmp_inline=$ac_cv_c_inline ;; +- esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gmp.h doesnt recognise compiler \"$tmp_inline\", inlines will be unavailable" >&5 +-$as_echo "$as_me: WARNING: gmp.h doesnt recognise compiler \"$tmp_inline\", inlines will be unavailable" >&2;} +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- ;; +-esac +- +- +-# from libtool +-LIBM= +-case $host in +-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) +- # These system don't have libm, or don't need it +- ;; +-*-ncr-sysv4.3*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 +-$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } +-if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lmw $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char _mwvalidcheckl (); +-int +-main () +-{ +-return _mwvalidcheckl (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_mw__mwvalidcheckl=yes +-else +- ac_cv_lib_mw__mwvalidcheckl=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 +-$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } +-if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : +- LIBM="-lmw" +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +-$as_echo_n "checking for cos in -lm... " >&6; } +-if ${ac_cv_lib_m_cos+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lm $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char cos (); +-int +-main () +-{ +-return cos (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_m_cos=yes +-else +- ac_cv_lib_m_cos=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +-$as_echo "$ac_cv_lib_m_cos" >&6; } +-if test "x$ac_cv_lib_m_cos" = xyes; then : +- LIBM="$LIBM -lm" +-fi +- +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +-$as_echo_n "checking for cos in -lm... " >&6; } +-if ${ac_cv_lib_m_cos+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lm $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char cos (); +-int +-main () +-{ +-return cos (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_m_cos=yes +-else +- ac_cv_lib_m_cos=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +-$as_echo "$ac_cv_lib_m_cos" >&6; } +-if test "x$ac_cv_lib_m_cos" = xyes; then : +- LIBM="-lm" +-fi +- +- ;; +-esac +- +- +- +- +-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +-# for constant arguments. Useless! +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +-$as_echo_n "checking for working alloca.h... " >&6; } +-if ${gmp_cv_header_alloca+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-int +-main () +-{ +-char *p = (char *) alloca (2 * sizeof (int)); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- gmp_cv_header_alloca=yes +-else +- gmp_cv_header_alloca=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_header_alloca" >&5 +-$as_echo "$gmp_cv_header_alloca" >&6; } +-if test $gmp_cv_header_alloca = yes; then +- +-$as_echo "@%:@define HAVE_ALLOCA_H 1" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca (via gmp-impl.h)" >&5 +-$as_echo_n "checking for alloca (via gmp-impl.h)... " >&6; } +-if ${gmp_cv_func_alloca+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include "$srcdir/gmp-h.in" +- +-#include "$srcdir/gmp-impl.h" +- +-int +-main () +-{ +-char *p = (char *) alloca (1); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- gmp_cv_func_alloca=yes +-else +- gmp_cv_func_alloca=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_func_alloca" >&5 +-$as_echo "$gmp_cv_func_alloca" >&6; } +-if test $gmp_cv_func_alloca = yes; then +- +-$as_echo "@%:@define HAVE_ALLOCA 1" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to allocate temporary memory" >&5 +-$as_echo_n "checking how to allocate temporary memory... " >&6; } +-if ${gmp_cv_option_alloca+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $enable_alloca in +- yes) +- gmp_cv_option_alloca=alloca +- ;; +- no) +- gmp_cv_option_alloca=malloc-reentrant +- ;; +- reentrant | notreentrant) +- case $gmp_cv_func_alloca in +- yes) gmp_cv_option_alloca=alloca ;; +- *) gmp_cv_option_alloca=malloc-$enable_alloca ;; +- esac +- ;; +- *) +- gmp_cv_option_alloca=$enable_alloca +- ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_option_alloca" >&5 +-$as_echo "$gmp_cv_option_alloca" >&6; } +- +- +- +-case $gmp_cv_option_alloca in +- alloca) +- if test $gmp_cv_func_alloca = no; then +- as_fn_error $? "--enable-alloca=alloca specified, but alloca not available" "$LINENO" 5 +- fi +- $as_echo "@%:@define WANT_TMP_ALLOCA 1" >>confdefs.h +- +- TAL_OBJECT=tal-reent$U.lo +- ;; +- malloc-reentrant) +- $as_echo "@%:@define WANT_TMP_REENTRANT 1" >>confdefs.h +- +- TAL_OBJECT=tal-reent$U.lo +- ;; +- malloc-notreentrant) +- $as_echo "@%:@define WANT_TMP_NOTREENTRANT 1" >>confdefs.h +- +- TAL_OBJECT=tal-notreent$U.lo +- ;; +- debug) +- $as_echo "@%:@define WANT_TMP_DEBUG 1" >>confdefs.h +- +- TAL_OBJECT=tal-debug$U.lo +- ;; +- *) +- # checks at the start of configure.in should protect us +- as_fn_error $? "unrecognised --enable-alloca=$gmp_cv_option_alloca" "$LINENO" 5 +- ;; +-esac +- +- +- +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include "$srcdir/gmp-h.in" +- +-#if ! _GMP_H_HAVE_FILE +-die die die +-#endif +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gmp.h doesnt recognise , FILE prototypes will be unavailable" >&5 +-$as_echo "$as_me: WARNING: gmp.h doesnt recognise , FILE prototypes will be unavailable" >&2;} +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +-$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +-if ${ac_cv_c_bigendian+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_c_bigendian=unknown +- # See if we're dealing with a universal compiler. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#ifndef __APPLE_CC__ +- not a universal capable compiler +- #endif +- typedef int dummy; +- +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +- # Check for potential -arch flags. It is not universal unless +- # there are at least two -arch flags with different values. +- ac_arch= +- ac_prev= +- for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do +- if test -n "$ac_prev"; then +- case $ac_word in +- i?86 | x86_64 | ppc | ppc64) +- if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then +- ac_arch=$ac_word +- else +- ac_cv_c_bigendian=universal +- break +- fi +- ;; +- esac +- ac_prev= +- elif test "x$ac_word" = "x-arch"; then +- ac_prev=arch +- fi +- done +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- if test $ac_cv_c_bigendian = unknown; then +- # See if sys/param.h defines the BYTE_ORDER macro. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- #include +- +-int +-main () +-{ +-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ +- && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ +- && LITTLE_ENDIAN) +- bogus endian macros +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- # It does; now see whether it defined to BIG_ENDIAN or not. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- #include +- +-int +-main () +-{ +-#if BYTE_ORDER != BIG_ENDIAN +- not big endian +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_bigendian=yes +-else +- ac_cv_c_bigendian=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- fi +- if test $ac_cv_c_bigendian = unknown; then +- # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-int +-main () +-{ +-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) +- bogus endian macros +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- # It does; now see whether it defined to _BIG_ENDIAN or not. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-int +-main () +-{ +-#ifndef _BIG_ENDIAN +- not big endian +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_bigendian=yes +-else +- ac_cv_c_bigendian=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- fi +- if test $ac_cv_c_bigendian = unknown; then +- # Compile a test program. +- if test "$cross_compiling" = yes; then : +- # Try to guess by grepping values from an object file. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-short int ascii_mm[] = +- { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +- short int ascii_ii[] = +- { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +- int use_ascii (int i) { +- return ascii_mm[i] + ascii_ii[i]; +- } +- short int ebcdic_ii[] = +- { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +- short int ebcdic_mm[] = +- { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +- int use_ebcdic (int i) { +- return ebcdic_mm[i] + ebcdic_ii[i]; +- } +- extern int foo; +- +-int +-main () +-{ +-return use_ascii (foo) == use_ebcdic (foo); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then +- ac_cv_c_bigendian=yes +- fi +- if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then +- if test "$ac_cv_c_bigendian" = unknown; then +- ac_cv_c_bigendian=no +- else +- # finding both strings is unlikely to happen, but who knows? +- ac_cv_c_bigendian=unknown +- fi +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$ac_includes_default +-int +-main () +-{ +- +- /* Are we little or big endian? From Harbison&Steele. */ +- union +- { +- long int l; +- char c[sizeof (long int)]; +- } u; +- u.l = 1; +- return u.c[sizeof (long int) - 1] == 1; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- ac_cv_c_bigendian=no +-else +- ac_cv_c_bigendian=yes +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +-$as_echo "$ac_cv_c_bigendian" >&6; } +- case $ac_cv_c_bigendian in #( +- yes) +- $as_echo "@%:@define HAVE_LIMB_BIG_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_LIMB_BIG_ENDIAN')" >> $gmp_tmpconfigm4p +-;; #( +- no) +- $as_echo "@%:@define HAVE_LIMB_LITTLE_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_LIMB_LITTLE_ENDIAN')" >> $gmp_tmpconfigm4p +- +- ;; #( +- universal) +- +-$as_echo "@%:@define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h +- +- ;; #( +- *) +- : ;; +- esac +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking format of \`double' floating point" >&5 +-$as_echo_n "checking format of \`double' floating point... " >&6; } +-if ${gmp_cv_c_double_format+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_c_double_format=unknown +-cat >conftest.c <<\EOF +-struct foo { +- char before[8]; +- double x; +- char after[8]; +-}; +-extern struct foo foo; +-struct foo foo = { +- { '\001', '\043', '\105', '\147', '\211', '\253', '\315', '\357' }, +- -123456789.0, +- { '\376', '\334', '\272', '\230', '\166', '\124', '\062', '\020' }, +-}; +-EOF +-gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +-cat >conftest.awk <<\EOF +- +-BEGIN { +- found = 0 +-} +- +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 23; i++) +- got[i] = got[i+1]; +- got[23] = $f; +- +- # match the special begin and end sequences +- if (got[0] != "001") continue +- if (got[1] != "043") continue +- if (got[2] != "105") continue +- if (got[3] != "147") continue +- if (got[4] != "211") continue +- if (got[5] != "253") continue +- if (got[6] != "315") continue +- if (got[7] != "357") continue +- if (got[16] != "376") continue +- if (got[17] != "334") continue +- if (got[18] != "272") continue +- if (got[19] != "230") continue +- if (got[20] != "166") continue +- if (got[21] != "124") continue +- if (got[22] != "062") continue +- if (got[23] != "020") continue +- +- saw = " (" got[8] " " got[9] " " got[10] " " got[11] " " got[12] " " got[13] " " got[14] " " got[15] ")" +- +- if (got[8] == "000" && \ +- got[9] == "000" && \ +- got[10] == "000" && \ +- got[11] == "124" && \ +- got[12] == "064" && \ +- got[13] == "157" && \ +- got[14] == "235" && \ +- got[15] == "301") +- { +- print "IEEE little endian" +- found = 1 +- exit +- } +- +- # Little endian with the two 4-byte halves swapped, as used by ARM +- # when the chip is in little endian mode. +- # +- if (got[8] == "064" && \ +- got[9] == "157" && \ +- got[10] == "235" && \ +- got[11] == "301" && \ +- got[12] == "000" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "124") +- { +- print "IEEE little endian, swapped halves" +- found = 1 +- exit +- } +- +- # gcc 2.95.4 on one GNU/Linux ARM system was seen generating 000 in +- # the last byte, whereas 124 is correct. Not sure where the bug +- # actually lies, but a running program didn't seem to get a full +- # mantissa worth of working bits. +- # +- # We match this case explicitly so we can give a nice result message, +- # but we deliberately exclude it from the normal IEEE double setups +- # since it's too broken. +- # +- if (got[8] == "064" && \ +- got[9] == "157" && \ +- got[10] == "235" && \ +- got[11] == "301" && \ +- got[12] == "000" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "bad ARM software floats" +- found = 1 +- exit +- } +- +- if (got[8] == "301" && \ +- got[9] == "235" && \ +- got[10] == "157" && \ +- got[11] == "064" && \ +- got[12] == "124" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "IEEE big endian" +- found = 1 +- exit +- } +- +- if (got[8] == "353" && \ +- got[9] == "315" && \ +- got[10] == "242" && \ +- got[11] == "171" && \ +- got[12] == "000" && \ +- got[13] == "240" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "VAX D" +- found = 1 +- exit +- } +- +- if (got[8] == "275" && \ +- got[9] == "301" && \ +- got[10] == "064" && \ +- got[11] == "157" && \ +- got[12] == "000" && \ +- got[13] == "124" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "VAX G" +- found = 1 +- exit +- } +- +- if (got[8] == "300" && \ +- got[9] == "033" && \ +- got[10] == "353" && \ +- got[11] == "171" && \ +- got[12] == "242" && \ +- got[13] == "240" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "Cray CFP" +- found = 1 +- exit +- } +- } +-} +- +-END { +- if (! found) +- print "unknown", saw +-} +- +-EOF +- gmp_cv_c_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` +- case $gmp_cv_c_double_format in +- unknown*) +- echo "cannot match anything, conftest.$OBJEXT contains" >&5 +- od -b conftest.$OBJEXT >&5 +- ;; +- esac +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: oops, cannot compile test program" >&5 +-$as_echo "$as_me: WARNING: oops, cannot compile test program" >&2;} +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_double_format" >&5 +-$as_echo "$gmp_cv_c_double_format" >&6; } +- +- +- +-case $gmp_cv_c_double_format in +- "IEEE big endian") +- $as_echo "@%:@define HAVE_DOUBLE_IEEE_BIG_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_DOUBLE_IEEE_BIG_ENDIAN')" >> $gmp_tmpconfigm4p +- +- ;; +- "IEEE little endian") +- $as_echo "@%:@define HAVE_DOUBLE_IEEE_LITTLE_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_DOUBLE_IEEE_LITTLE_ENDIAN')" >> $gmp_tmpconfigm4p +- +- ;; +- "IEEE little endian, swapped halves") +- $as_echo "@%:@define HAVE_DOUBLE_IEEE_LITTLE_SWAPPED 1" >>confdefs.h +- ;; +- "VAX D") +- $as_echo "@%:@define HAVE_DOUBLE_VAX_D 1" >>confdefs.h +- ;; +- "VAX G") +- $as_echo "@%:@define HAVE_DOUBLE_VAX_G 1" >>confdefs.h +- ;; +- "Cray CFP") +- $as_echo "@%:@define HAVE_DOUBLE_CRAY_CFP 1" >>confdefs.h +- ;; +- "bad ARM software floats") +- ;; +- unknown*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine float format." >&5 +-$as_echo "$as_me: WARNING: Could not determine float format." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Conversions to and from \"double\" may be slow." >&5 +-$as_echo "$as_me: WARNING: Conversions to and from \"double\" may be slow." >&2;} +- ;; +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: oops, unrecognised float format: $gmp_cv_c_double_format" >&5 +-$as_echo "$as_me: WARNING: oops, unrecognised float format: $gmp_cv_c_double_format" >&2;} +- ;; +-esac +- +- +- +-# Reasons for testing: +-# alarm - not in mingw +-# attr_get - IRIX specific +-# clock_gettime - not in glibc 2.2.4, only very recent systems +-# cputime - not in glibc +-# getsysinfo - OSF specific +-# getrusage - not in mingw +-# gettimeofday - not in mingw +-# mmap - not in mingw, djgpp +-# nl_langinfo - X/Open standard only, not in djgpp for instance +-# obstack_vprintf - glibc specific +-# processor_info - solaris specific +-# pstat_getprocessor - HPUX specific (10.x and up) +-# raise - an ANSI-ism, though probably almost universal by now +-# read_real_time - AIX specific +-# sigaction - not in mingw +-# sigaltstack - not in mingw, or old AIX (reputedly) +-# sigstack - not in mingw +-# strerror - not in SunOS +-# strnlen - glibc extension (some other systems too) +-# syssgi - IRIX specific +-# times - not in mingw +-# +-# AC_FUNC_STRNLEN is not used because we don't want the AC_LIBOBJ +-# replacement setups it gives. It detects a faulty strnlen on AIX, but +-# missing out on that test is ok since our only use of strnlen is in +-# __gmp_replacement_vsnprintf which is not required on AIX since it has a +-# vsnprintf. +-# +-for ac_func in alarm attr_get clock cputime getpagesize getrusage gettimeofday getsysinfo localeconv memset mmap mprotect nl_langinfo obstack_vprintf popen processor_info pstat_getprocessor raise read_real_time sigaction sigaltstack sigstack syssgi strchr strerror strnlen strtol strtoul sysconf sysctl sysctlbyname times +-do : +- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +-_ACEOF +- +-fi +-done +- +- +-# clock_gettime is in librt on *-*-osf5.1 and on glibc, so att -lrt to +-# TUNE_LIBS if needed. On linux (tested on x86_32, 2.6.26), +-# clock_getres reports ns accuracy, while in a quick test on osf +-# clock_getres said only 1 millisecond. +- +-old_LIBS="$LIBS" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +-$as_echo_n "checking for library containing clock_gettime... " >&6; } +-if ${ac_cv_search_clock_gettime+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_func_search_save_LIBS=$LIBS +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char clock_gettime (); +-int +-main () +-{ +-return clock_gettime (); +- ; +- return 0; +-} +-_ACEOF +-for ac_lib in '' rt; do +- if test -z "$ac_lib"; then +- ac_res="none required" +- else +- ac_res=-l$ac_lib +- LIBS="-l$ac_lib $ac_func_search_save_LIBS" +- fi +- if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_search_clock_gettime=$ac_res +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext +- if ${ac_cv_search_clock_gettime+:} false; then : +- break +-fi +-done +-if ${ac_cv_search_clock_gettime+:} false; then : +- +-else +- ac_cv_search_clock_gettime=no +-fi +-rm conftest.$ac_ext +-LIBS=$ac_func_search_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +-$as_echo "$ac_cv_search_clock_gettime" >&6; } +-ac_res=$ac_cv_search_clock_gettime +-if test "$ac_res" != no; then : +- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +- +- +-$as_echo "@%:@define HAVE_CLOCK_GETTIME 1" >>confdefs.h +- +-fi +- +-TUNE_LIBS="$LIBS" +-LIBS="$old_LIBS" +- +- +- +-ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +-if test "x$ac_cv_func_vsnprintf" = xyes; then : +- gmp_vsnprintf_exists=yes +-else +- gmp_vsnprintf_exists=no +-fi +- +-if test "$gmp_vsnprintf_exists" = no; then +- gmp_cv_func_vsnprintf=no +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf works" >&5 +-$as_echo_n "checking whether vsnprintf works... " >&6; } +-if ${gmp_cv_func_vsnprintf+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_func_vsnprintf=yes +- for i in 'return check ("hello world");' 'int n; return check ("%nhello world", &n);'; do +- if test "$cross_compiling" = yes; then : +- gmp_cv_func_vsnprintf=probably; break +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-#include /* for strcmp */ +-#include /* for vsnprintf */ +- +-#include +- +-int +-check (const char *fmt, ...) +-{ +- static char buf[128]; +- va_list ap; +- int ret; +- +- va_start (ap, fmt); +- +- ret = vsnprintf (buf, 4, fmt, ap); +- +- if (strcmp (buf, "hel") != 0) +- return 1; +- +- /* allowed return values */ +- if (ret != -1 && ret != 3 && ret != 11) +- return 2; +- +- return 0; +-} +- +-int +-main () +-{ +-$i +-} +- +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- : +-else +- gmp_cv_func_vsnprintf=no; break +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +- done +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_func_vsnprintf" >&5 +-$as_echo "$gmp_cv_func_vsnprintf" >&6; } +- if test "$gmp_cv_func_vsnprintf" = probably; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot check for properly working vsnprintf when cross compiling, will assume it's ok" >&5 +-$as_echo "$as_me: WARNING: cannot check for properly working vsnprintf when cross compiling, will assume it's ok" >&2;} +- fi +- if test "$gmp_cv_func_vsnprintf" != no; then +- +-$as_echo "@%:@define HAVE_VSNPRINTF 1" >>confdefs.h +- +- fi +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sscanf needs writable input" >&5 +-$as_echo_n "checking whether sscanf needs writable input... " >&6; } +-if ${gmp_cv_func_sscanf_writable_input+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-hpux9 | *-*-hpux9.*) +- gmp_cv_func_sscanf_writable_input=yes ;; +- *) gmp_cv_func_sscanf_writable_input=no ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_func_sscanf_writable_input" >&5 +-$as_echo "$gmp_cv_func_sscanf_writable_input" >&6; } +-case $gmp_cv_func_sscanf_writable_input in +- yes) +-$as_echo "@%:@define SSCANF_WRITABLE_INPUT 1" >>confdefs.h +- ;; +- no) ;; +- *) as_fn_error $? "unrecognised \$gmp_cv_func_sscanf_writable_input" "$LINENO" 5 ;; +-esac +- +- +-# Reasons for checking: +-# pst_processor psp_iticksperclktick - not in hpux 9 +-# +-ac_fn_c_check_member "$LINENO" "struct pst_processor" "psp_iticksperclktick" "ac_cv_member_struct_pst_processor_psp_iticksperclktick" "#include +-" +-if test "x$ac_cv_member_struct_pst_processor_psp_iticksperclktick" = xyes; then : +- +-$as_echo "@%:@define HAVE_PSP_ITICKSPERCLKTICK 1" >>confdefs.h +- +-fi +- +- +-# C++ tests, when required +-# +-if test $enable_cxx = yes; then +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +- +- +- # Reasons for testing: +- # - not in g++ 2.95.2 +- # std::locale - not in g++ 2.95.4 +- # +- +-for ac_header in sstream +-do : +- ac_fn_cxx_check_header_mongrel "$LINENO" "sstream" "ac_cv_header_sstream" "$ac_includes_default" +-if test "x$ac_cv_header_sstream" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SSTREAM 1 +-_ACEOF +- +-fi +- +-done +- +- ac_fn_cxx_check_type "$LINENO" "std::locale" "ac_cv_type_std__locale" "#include +-" +-if test "x$ac_cv_type_std__locale" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_STD__LOCALE 1 +-_ACEOF +- +- +-fi +- +- +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-fi +- +- +-# Pick the correct source files in $path and link them to mpn/. +-# $gmp_mpn_functions lists all functions we need. +-# +-# The rule is to find a file with the function name and a .asm, .S, +-# .s, or .c extension. Certain multi-function files with special names +-# can provide some functions too. (mpn/Makefile.am passes +-# -DOPERATION_ to get them to generate the right code.) +- +-# Note: $gmp_mpn_functions must have mod_1 before pre_mod_1 so the former +-# can optionally provide the latter as an extra entrypoint. Likewise +-# divrem_1 and pre_divrem_1. +- +-gmp_mpn_functions_optional="umul udiv \ +- invert_limb sqr_diagonal sqr_diag_addlsh1 \ +- mul_2 mul_3 mul_4 mul_5 mul_6 \ +- addmul_2 addmul_3 addmul_4 addmul_5 addmul_6 addmul_7 addmul_8 \ +- addlsh1_n sublsh1_n rsblsh1_n rsh1add_n rsh1sub_n \ +- addlsh2_n sublsh2_n rsblsh2_n \ +- addlsh_n sublsh_n rsblsh_n \ +- add_n_sub_n addaddmul_1msb0" +- +-gmp_mpn_functions="$extra_functions \ +- add add_1 add_n sub sub_1 sub_n cnd_add_n cnd_sub_n neg com \ +- mul_1 addmul_1 submul_1 \ +- add_err1_n add_err2_n add_err3_n sub_err1_n sub_err2_n sub_err3_n \ +- lshift rshift dive_1 diveby3 divis divrem divrem_1 divrem_2 \ +- fib2_ui mod_1 mod_34lsub1 mode1o pre_divrem_1 pre_mod_1 dump \ +- mod_1_1 mod_1_2 mod_1_3 mod_1_4 lshiftc \ +- mul mul_fft mul_n sqr mul_basecase sqr_basecase nussbaumer_mul \ +- mulmid_basecase toom42_mulmid mulmid_n mulmid \ +- random random2 pow_1 \ +- rootrem sqrtrem sizeinbase get_str set_str \ +- scan0 scan1 popcount hamdist cmp \ +- perfsqr perfpow \ +- gcd_1 gcd gcdext_1 gcdext gcd_subdiv_step \ +- gcdext_lehmer \ +- div_q tdiv_qr jacbase jacobi_2 jacobi get_d \ +- matrix22_mul matrix22_mul1_inverse_vector \ +- hgcd_matrix hgcd2 hgcd_step hgcd_reduce hgcd hgcd_appr \ +- hgcd2_jacobi hgcd_jacobi \ +- mullo_n mullo_basecase \ +- toom22_mul toom32_mul toom42_mul toom52_mul toom62_mul \ +- toom33_mul toom43_mul toom53_mul toom54_mul toom63_mul \ +- toom44_mul \ +- toom6h_mul toom6_sqr toom8h_mul toom8_sqr \ +- toom_couple_handling \ +- toom2_sqr toom3_sqr toom4_sqr \ +- toom_eval_dgr3_pm1 toom_eval_dgr3_pm2 \ +- toom_eval_pm1 toom_eval_pm2 toom_eval_pm2exp toom_eval_pm2rexp \ +- toom_interpolate_5pts toom_interpolate_6pts toom_interpolate_7pts \ +- toom_interpolate_8pts toom_interpolate_12pts toom_interpolate_16pts \ +- invertappr invert binvert mulmod_bnm1 sqrmod_bnm1 \ +- div_qr_1 div_qr_1n_pi1 \ +- div_qr_2 div_qr_2n_pi1 div_qr_2u_pi1 \ +- sbpi1_div_q sbpi1_div_qr sbpi1_divappr_q \ +- dcpi1_div_q dcpi1_div_qr dcpi1_divappr_q \ +- mu_div_qr mu_divappr_q mu_div_q \ +- bdiv_q_1 \ +- sbpi1_bdiv_q sbpi1_bdiv_qr \ +- dcpi1_bdiv_q dcpi1_bdiv_qr \ +- mu_bdiv_q mu_bdiv_qr \ +- bdiv_q bdiv_qr broot brootinv bsqrt bsqrtinv \ +- divexact bdiv_dbm1c redc_1 redc_2 redc_n powm powlo sec_powm \ +- sec_mul sec_sqr sec_div_qr sec_div_r sec_pi1_div_qr sec_pi1_div_r \ +- sec_add_1 sec_sub_1 sec_invert \ +- trialdiv remove \ +- and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n \ +- copyi copyd zero sec_tabselect \ +- comb_tables \ +- $gmp_mpn_functions_optional" +- +- +- +-# the list of all object files used by mpn/Makefile.in and the +-# top-level Makefile.in, respectively +-mpn_objects= +-mpn_objs_in_libgmp= +- +-# links from the sources, to be removed by "make distclean" +-gmp_srclinks= +- +- +-# mpn_relative_top_srcdir is $top_srcdir, but for use from within the mpn +-# build directory. If $srcdir is relative then we use a relative path too, +-# so the two trees can be moved together. +-case $srcdir in +- [\\/]* | ?:[\\/]*) # absolute, as per autoconf +- mpn_relative_top_srcdir=$srcdir ;; +- *) # relative +- mpn_relative_top_srcdir=../$srcdir ;; +-esac +- +- +- +- +- +- +-# Fat binary setups. +-# +-# We proceed through each $fat_path directory, and look for $fat_function +-# routines there. Those found are incorporated in the build by generating a +-# little mpn/.asm or mpn/.c file in the build directory, with +-# suitable function renaming, and adding that to $mpn_objects (the same as a +-# normal mpn file). +-# +-# fat.h is generated with macros to let internal calls to each $fat_function +-# go directly through __gmpn_cpuvec, plus macros and declarations helping to +-# setup that structure, on a per-directory basis ready for +-# mpn//fat/fat.c. +-# +-# fat.h includes thresholds listed in $fat_thresholds, extracted from +-# gmp-mparam.h in each directory. An overall maximum for each threshold is +-# established, for use in making fixed size arrays of temporary space. +-# (Eg. MUL_TOOM33_THRESHOLD_LIMIT used by mpn/generic/mul.c.) +-# +-# It'd be possible to do some of this manually, but when there's more than a +-# few functions and a few directories it becomes very tedious, and very +-# prone to having some routine accidentally omitted. On that basis it seems +-# best to automate as much as possible, even if the code to do so is a bit +-# ugly. +-# +- +-if test -n "$fat_path"; then +- # Usually the mpn build directory is created with mpn/Makefile +- # instantiation, but we want to write to it sooner. +- mkdir mpn 2>/dev/null +- +- echo "/* fat.h - setups for fat binaries." >fat.h +- echo " Generated by configure - DO NOT EDIT. */" >>fat.h +- +- +-$as_echo "@%:@define WANT_FAT_BINARY 1" >>confdefs.h +- +- +-echo 'define(, )' >>$gmp_tmpconfigm4 +- +- +- # Don't want normal copies of fat functions +- for tmp_fn in $fat_functions; do +- remove_from_list_tmp= +-for remove_from_list_i in $gmp_mpn_functions; do +- if test $remove_from_list_i = $tmp_fn; then :; +- else +- remove_from_list_tmp="$remove_from_list_tmp $remove_from_list_i" +- fi +-done +-gmp_mpn_functions=$remove_from_list_tmp +- +- remove_from_list_tmp= +-for remove_from_list_i in $gmp_mpn_functions_optional; do +- if test $remove_from_list_i = $tmp_fn; then :; +- else +- remove_from_list_tmp="$remove_from_list_tmp $remove_from_list_i" +- fi +-done +-gmp_mpn_functions_optional=$remove_from_list_tmp +- +- done +- +- for tmp_fn in $fat_functions; do +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- echo " +-#ifndef OPERATION_$tmp_fn +-#undef mpn_$tmp_fbase +-#define mpn_$tmp_fbase (*__gmpn_cpuvec.$tmp_fbase) +-#endif +-DECL_$tmp_fbase (__MPN(${tmp_fbase}_init));" >>fat.h +- # encourage various macros to use fat functions +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_NATIVE_mpn_$tmp_fbase 1 +-_ACEOF +- +- done +- +- echo "" >>fat.h +- echo "/* variable thresholds */" >>fat.h +- for tmp_tn in $fat_thresholds; do +- echo "#undef $tmp_tn" >>fat.h +- echo "#define $tmp_tn CPUVEC_THRESHOLD (`echo $tmp_tn | tr [A-Z] [a-z]`)" >>fat.h +- done +- +- echo " +-/* Copy all fields into __gmpn_cpuvec. +- memcpy is not used because it might operate byte-wise (depending on its +- implementation), and we need the function pointer writes to be atomic. +- "volatile" discourages the compiler from trying to optimize this. */ +-#define CPUVEC_INSTALL(vec) \\ +- do { \\ +- volatile struct cpuvec_t *p = &__gmpn_cpuvec; \\" >>fat.h +- for tmp_fn in $fat_functions; do +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- echo " p->$tmp_fbase = vec.$tmp_fbase; \\" >>fat.h +- done +- for tmp_tn in $fat_thresholds; do +- tmp_field_name=`echo $tmp_tn | tr [A-Z] [a-z]` +- echo " p->$tmp_field_name = vec.$tmp_field_name; \\" >>fat.h +- done +- echo " } while (0)" >>fat.h +- +- echo " +-/* A helper to check all fields are filled. */ +-#define ASSERT_CPUVEC(vec) \\ +- do { \\" >>fat.h +- for tmp_fn in $fat_functions; do +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- echo " ASSERT (vec.$tmp_fbase != NULL); \\" >>fat.h +- done +- for tmp_tn in $fat_thresholds; do +- tmp_field_name=`echo $tmp_tn | tr [A-Z] [a-z]` +- echo " ASSERT (vec.$tmp_field_name != 0); \\" >>fat.h +- done +- echo " } while (0)" >>fat.h +- +- echo " +-/* Call ITERATE(field) for each fat threshold field. */ +-#define ITERATE_FAT_THRESHOLDS() \\ +- do { \\" >>fat.h +- for tmp_tn in $fat_thresholds; do +- tmp_field_name=`echo $tmp_tn | tr [A-Z] [a-z]` +- echo " ITERATE ($tmp_tn, $tmp_field_name); \\" >>fat.h +- done +- echo " } while (0)" >>fat.h +- +- for tmp_dir in $fat_path; do +- CPUVEC_SETUP= +- THRESH_ASM_SETUP= +- echo "" >>fat.h +- tmp_suffix=`echo $tmp_dir | sed -e '/\//s:^[^/]*/::' -e 's:[\\/]:_:g'` +- +- # In order to keep names unique on a DOS 8.3 filesystem, use a prefix +- # (rather than a suffix) for the generated file names, and abbreviate. +- case $tmp_suffix in +- pentium) tmp_prefix=p ;; +- pentium_mmx) tmp_prefix=pm ;; +- p6_mmx) tmp_prefix=p2 ;; +- p6_p3mmx) tmp_prefix=p3 ;; +- pentium4) tmp_prefix=p4 ;; +- pentium4_mmx) tmp_prefix=p4m ;; +- pentium4_sse2) tmp_prefix=p4s ;; +- k6_mmx) tmp_prefix=k6m ;; +- k6_k62mmx) tmp_prefix=k62 ;; +- k7_mmx) tmp_prefix=k7m ;; +- *) tmp_prefix=$tmp_suffix ;; +- esac +- +- # Extract desired thresholds from gmp-mparam.h file in this directory, +- # if present. +- tmp_mparam=$srcdir/mpn/$tmp_dir/gmp-mparam.h +- if test -f $tmp_mparam; then +- for tmp_tn in $fat_thresholds; do +- tmp_thresh=`sed -n "s/^#define $tmp_tn[ ]*\\([0-9][0-9]*\\).*$/\\1/p" $tmp_mparam` +- if test -n "$tmp_thresh"; then +- THRESH_ASM_SETUP="${THRESH_ASM_SETUP}define($tmp_tn,$tmp_thresh) +-" +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.`echo $tmp_tn | tr [A-Z] [a-z]` = $tmp_thresh; \\ +-" +- eval tmp_limit=\$${tmp_tn}_LIMIT +- if test -z "$tmp_limit"; then +- tmp_limit=0 +- fi +- if test $tmp_thresh -gt $tmp_limit; then +- eval ${tmp_tn}_LIMIT=$tmp_thresh +- fi +- fi +- done +- fi +- +- for tmp_fn in $fat_functions; do +- # functions that can be provided by multi-function files +-tmp_mulfunc= +-case $tmp_fn in +- add_n|sub_n) tmp_mulfunc="aors_n" ;; +- add_err1_n|sub_err1_n) +- tmp_mulfunc="aors_err1_n" ;; +- add_err2_n|sub_err2_n) +- tmp_mulfunc="aors_err2_n" ;; +- add_err3_n|sub_err3_n) +- tmp_mulfunc="aors_err3_n" ;; +- cnd_add_n|cnd_sub_n) tmp_mulfunc="cnd_aors_n" ;; +- sec_add_1|sec_sub_1) tmp_mulfunc="sec_aors_1" ;; +- addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; +- mul_2|addmul_2) tmp_mulfunc="aormul_2" ;; +- mul_3|addmul_3) tmp_mulfunc="aormul_3" ;; +- mul_4|addmul_4) tmp_mulfunc="aormul_4" ;; +- popcount|hamdist) tmp_mulfunc="popham" ;; +- and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) +- tmp_mulfunc="logops_n" ;; +- lshift|rshift) tmp_mulfunc="lorrshift";; +- addlsh1_n) +- tmp_mulfunc="aorslsh1_n aorrlsh1_n aorsorrlsh1_n";; +- sublsh1_n) +- tmp_mulfunc="aorslsh1_n sorrlsh1_n aorsorrlsh1_n";; +- rsblsh1_n) +- tmp_mulfunc="aorrlsh1_n sorrlsh1_n aorsorrlsh1_n";; +- addlsh2_n) +- tmp_mulfunc="aorslsh2_n aorrlsh2_n aorsorrlsh2_n";; +- sublsh2_n) +- tmp_mulfunc="aorslsh2_n sorrlsh2_n aorsorrlsh2_n";; +- rsblsh2_n) +- tmp_mulfunc="aorrlsh2_n sorrlsh2_n aorsorrlsh2_n";; +- addlsh_n) +- tmp_mulfunc="aorslsh_n aorrlsh_n aorsorrlsh_n";; +- sublsh_n) +- tmp_mulfunc="aorslsh_n sorrlsh_n aorsorrlsh_n";; +- rsblsh_n) +- tmp_mulfunc="aorrlsh_n sorrlsh_n aorsorrlsh_n";; +- rsh1add_n|rsh1sub_n) +- tmp_mulfunc="rsh1aors_n";; +- sec_div_qr|sec_div_r) +- tmp_mulfunc="sec_div";; +- sec_pi1_div_qr|sec_pi1_div_r) +- tmp_mulfunc="sec_pi1_div";; +-esac +- +- +- for tmp_base in $tmp_fn $tmp_mulfunc; do +- for tmp_ext in asm S s c; do +- tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext +- if test -f $tmp_file; then +- +- # If the host uses a non-standard ABI, check if tmp_file supports it +- # +- if test -n "$GMP_NONSTD_ABI" && test $tmp_ext != "c"; then +- abi=`sed -n 's/^[ ]*ABI_SUPPORT(\(.*\))/\1/p' $tmp_file ` +- if echo "$abi" | grep -q "\\b${GMP_NONSTD_ABI}\\b"; then +- true +- else +- continue +- fi +- fi +- +- mpn_objects="$mpn_objects ${tmp_prefix}_$tmp_fn.lo" +- mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_prefix}_$tmp_fn.lo" +- +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- +- # carry-in variant, eg. divrem_1c or modexact_1c_odd +- case $tmp_fbase in +- *_1*) tmp_fbasec=`echo $tmp_fbase | sed 's/_1/_1c/'` ;; +- *) tmp_fbasec=${tmp_fbase}c ;; +- esac +- +- # Create a little file doing an include from srcdir. The +- # OPERATION and renamings aren't all needed all the time, but +- # they don't hurt if unused. +- # +- # FIXME: Should generate these via config.status commands. +- # Would need them all in one AC_CONFIG_COMMANDS though, since +- # that macro doesn't accept a set of separate commands generated +- # by shell code. +- # +- case $tmp_ext in +- asm) +- # hide the d-n-l from autoconf's error checking +- tmp_d_n_l=d""nl +- echo "$tmp_d_n_l mpn_$tmp_fbase - from $tmp_dir directory for fat binary. +-$tmp_d_n_l Generated by configure - DO NOT EDIT. +- +-define(OPERATION_$tmp_fn) +-define(__gmpn_$tmp_fbase, __gmpn_${tmp_fbase}_$tmp_suffix) +-define(__gmpn_$tmp_fbasec,__gmpn_${tmp_fbasec}_${tmp_suffix}) +-define(__gmpn_preinv_${tmp_fbase},__gmpn_preinv_${tmp_fbase}_${tmp_suffix}) +-define(__gmpn_${tmp_fbase}_cps,__gmpn_${tmp_fbase}_cps_${tmp_suffix}) +- +-$tmp_d_n_l For k6 and k7 gcd_1 calling their corresponding mpn_modexact_1_odd +-ifdef(\`__gmpn_modexact_1_odd',, +-\`define(__gmpn_modexact_1_odd,__gmpn_modexact_1_odd_${tmp_suffix})') +- +-$THRESH_ASM_SETUP +-include($mpn_relative_top_srcdir/mpn/$tmp_dir/$tmp_base.asm) +-" >mpn/${tmp_prefix}_$tmp_fn.asm +- ;; +- c) +- echo "/* mpn_$tmp_fbase - from $tmp_dir directory for fat binary. +- Generated by configure - DO NOT EDIT. */ +- +-#define OPERATION_$tmp_fn 1 +-#define __gmpn_$tmp_fbase __gmpn_${tmp_fbase}_$tmp_suffix +-#define __gmpn_$tmp_fbasec __gmpn_${tmp_fbasec}_${tmp_suffix} +-#define __gmpn_preinv_${tmp_fbase} __gmpn_preinv_${tmp_fbase}_${tmp_suffix} +-#define __gmpn_${tmp_fbase}_cps __gmpn_${tmp_fbase}_cps_${tmp_suffix} +- +-#include \"$mpn_relative_top_srcdir/mpn/$tmp_dir/$tmp_base.c\" +-" >mpn/${tmp_prefix}_$tmp_fn.c +- ;; +- esac +- +- # Prototype, and append to CPUVEC_SETUP for this directory. +- echo "DECL_$tmp_fbase (__gmpn_${tmp_fbase}_$tmp_suffix);" >>fat.h +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.$tmp_fbase = __gmpn_${tmp_fbase}_${tmp_suffix}; \\ +-" +- # Ditto for any preinv variant (preinv_divrem_1, preinv_mod_1). +- if grep "^PROLOGUE(mpn_preinv_$tmp_fn)" $tmp_file >/dev/null; then +- echo "DECL_preinv_$tmp_fbase (__gmpn_preinv_${tmp_fbase}_$tmp_suffix);" >>fat.h +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.preinv_$tmp_fbase = __gmpn_preinv_${tmp_fbase}_${tmp_suffix}; \\ +-" +- fi +- +- # Ditto for any mod_1...cps variant +- if grep "^PROLOGUE(mpn_${tmp_fbase}_cps)" $tmp_file >/dev/null; then +- echo "DECL_${tmp_fbase}_cps (__gmpn_${tmp_fbase}_cps_$tmp_suffix);" >>fat.h +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.${tmp_fbase}_cps = __gmpn_${tmp_fbase}_cps_${tmp_suffix}; \\ +-" +- fi +- fi +- done +- done +- done +- +- # Emit CPUVEC_SETUP for this directory +- echo "" >>fat.h +- echo "#define CPUVEC_SETUP_$tmp_suffix \\" >>fat.h +- echo " do { \\" >>fat.h +- echo "$CPUVEC_SETUP } while (0)" >>fat.h +- done +- +- # Emit threshold limits +- echo "" >>fat.h +- for tmp_tn in $fat_thresholds; do +- eval tmp_limit=\$${tmp_tn}_LIMIT +- echo "#define ${tmp_tn}_LIMIT $tmp_limit" >>fat.h +- done +-fi +- +- +-# Normal binary setups. +-# +- +-for tmp_ext in asm S s c; do +- eval found_$tmp_ext=no +-done +- +-for tmp_fn in $gmp_mpn_functions; do +- for tmp_ext in asm S s c; do +- test "$no_create" = yes || rm -f mpn/$tmp_fn.$tmp_ext +- done +- +- # mpn_preinv_divrem_1 might have been provided by divrem_1.asm, likewise +- # mpn_preinv_mod_1 by mod_1.asm. +- case $tmp_fn in +- pre_divrem_1) +- if test "$HAVE_NATIVE_mpn_preinv_divrem_1" = yes; then continue; fi ;; +- pre_mod_1) +- if test "$HAVE_NATIVE_mpn_preinv_mod_1" = yes; then continue; fi ;; +- esac +- +- # functions that can be provided by multi-function files +-tmp_mulfunc= +-case $tmp_fn in +- add_n|sub_n) tmp_mulfunc="aors_n" ;; +- add_err1_n|sub_err1_n) +- tmp_mulfunc="aors_err1_n" ;; +- add_err2_n|sub_err2_n) +- tmp_mulfunc="aors_err2_n" ;; +- add_err3_n|sub_err3_n) +- tmp_mulfunc="aors_err3_n" ;; +- cnd_add_n|cnd_sub_n) tmp_mulfunc="cnd_aors_n" ;; +- sec_add_1|sec_sub_1) tmp_mulfunc="sec_aors_1" ;; +- addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; +- mul_2|addmul_2) tmp_mulfunc="aormul_2" ;; +- mul_3|addmul_3) tmp_mulfunc="aormul_3" ;; +- mul_4|addmul_4) tmp_mulfunc="aormul_4" ;; +- popcount|hamdist) tmp_mulfunc="popham" ;; +- and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) +- tmp_mulfunc="logops_n" ;; +- lshift|rshift) tmp_mulfunc="lorrshift";; +- addlsh1_n) +- tmp_mulfunc="aorslsh1_n aorrlsh1_n aorsorrlsh1_n";; +- sublsh1_n) +- tmp_mulfunc="aorslsh1_n sorrlsh1_n aorsorrlsh1_n";; +- rsblsh1_n) +- tmp_mulfunc="aorrlsh1_n sorrlsh1_n aorsorrlsh1_n";; +- addlsh2_n) +- tmp_mulfunc="aorslsh2_n aorrlsh2_n aorsorrlsh2_n";; +- sublsh2_n) +- tmp_mulfunc="aorslsh2_n sorrlsh2_n aorsorrlsh2_n";; +- rsblsh2_n) +- tmp_mulfunc="aorrlsh2_n sorrlsh2_n aorsorrlsh2_n";; +- addlsh_n) +- tmp_mulfunc="aorslsh_n aorrlsh_n aorsorrlsh_n";; +- sublsh_n) +- tmp_mulfunc="aorslsh_n sorrlsh_n aorsorrlsh_n";; +- rsblsh_n) +- tmp_mulfunc="aorrlsh_n sorrlsh_n aorsorrlsh_n";; +- rsh1add_n|rsh1sub_n) +- tmp_mulfunc="rsh1aors_n";; +- sec_div_qr|sec_div_r) +- tmp_mulfunc="sec_div";; +- sec_pi1_div_qr|sec_pi1_div_r) +- tmp_mulfunc="sec_pi1_div";; +-esac +- +- +- found=no +- for tmp_dir in $path; do +- for tmp_base in $tmp_fn $tmp_mulfunc; do +- for tmp_ext in asm S s c; do +- tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext +- if test -f $tmp_file; then +- +- # For a nails build, check if the file supports our nail bits. +- # Generic code always supports all nails. +- # +- # FIXME: When a multi-function file is selected to provide one of +- # the nails-neutral routines, like logops_n for and_n, the +- # PROLOGUE grepping will create HAVE_NATIVE_mpn_ defines for +- # all functions in that file, even if they haven't all been +- # nailified. Not sure what to do about this, it's only really a +- # problem for logops_n, and it's not too terrible to insist those +- # get nailified always. +- # +- if test $GMP_NAIL_BITS != 0 && test $tmp_dir != generic; then +- case $tmp_fn in +- and_n | ior_n | xor_n | andn_n | \ +- copyi | copyd | \ +- popcount | hamdist | \ +- udiv | udiv_w_sdiv | umul | \ +- cntlz | invert_limb) +- # these operations are either unaffected by nails or defined +- # to operate on full limbs +- ;; +- *) +- nails=`sed -n 's/^[ ]*NAILS_SUPPORT(\(.*\))/\1/p' $tmp_file ` +- for n in $nails; do +- case $n in +- *-*) +- n_start=`echo "$n" | sed -n 's/\(.*\)-.*/\1/p'` +- n_end=`echo "$n" | sed -n 's/.*-\(.*\)/\1/p'` +- ;; +- *) +- n_start=$n +- n_end=$n +- ;; +- esac +- if test $GMP_NAIL_BITS -ge $n_start && test $GMP_NAIL_BITS -le $n_end; then +- found=yes +- break +- fi +- done +- if test $found != yes; then +- continue +- fi +- ;; +- esac +- fi +- +- # If the host uses a non-standard ABI, check if tmp_file supports it +- # +- if test -n "$GMP_NONSTD_ABI" && test $tmp_ext != "c"; then +- abi=`sed -n 's/^[ ]*ABI_SUPPORT(\(.*\))/\1/p' $tmp_file ` +- if echo "$abi" | grep -q "\\b${GMP_NONSTD_ABI}\\b"; then +- true +- else +- continue +- fi +- fi +- +- found=yes +- eval found_$tmp_ext=yes +- +- if test $tmp_ext = c; then +- tmp_u='$U' +- else +- tmp_u= +- fi +- +- mpn_objects="$mpn_objects $tmp_fn$tmp_u.lo" +- mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/$tmp_fn$tmp_u.lo" +- ac_config_links="$ac_config_links mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext" +- +- gmp_srclinks="$gmp_srclinks mpn/$tmp_fn.$tmp_ext" +- +- # Duplicate AC_DEFINEs are harmless, so it doesn't matter +- # that multi-function files get grepped here repeatedly. +- # The PROLOGUE pattern excludes the optional second parameter. +- gmp_ep=` +- sed -n 's/^[ ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ; +- sed -n 's/^[ ]*PROLOGUE(\([^,]*\).*)/\1/p' $tmp_file +- ` +- for gmp_tmp in $gmp_ep; do +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_NATIVE_$gmp_tmp 1 +-_ACEOF +- +- eval HAVE_NATIVE_$gmp_tmp=yes +- done +- +- case $tmp_fn in +- sqr_basecase) sqr_basecase_source=$tmp_file ;; +- esac +- +- break +- fi +- done +- if test $found = yes; then break ; fi +- done +- if test $found = yes; then break ; fi +- done +- +- if test $found = no; then +- for tmp_optional in $gmp_mpn_functions_optional; do +- if test $tmp_optional = $tmp_fn; then +- found=yes +- fi +- done +- if test $found = no; then +- as_fn_error $? "no version of $tmp_fn found in path: $path" "$LINENO" 5 +- fi +- fi +-done +- +-# All cycle counters are .asm files currently +-if test -n "$SPEED_CYCLECOUNTER_OBJ"; then +- found_asm=yes +-fi +- +- +- +- +- +-# Don't demand an m4 unless it's actually needed. +-if test $found_asm = yes; then +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suitable m4" >&5 +-$as_echo_n "checking for suitable m4... " >&6; } +-if ${gmp_cv_prog_m4+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$M4"; then +- gmp_cv_prog_m4="$M4" +-else +- cat >conftest.m4 <<\EOF +-define(dollarhash,``$#'')ifelse(dollarhash(x),1,`define(t1,Y)', +-``bad: $# not supported (SunOS /usr/bin/m4) +-'')ifelse(eval(89),89,`define(t2,Y)', +-`bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) +-')ifelse(eval(9,9),10,`define(t3,Y)', +-`bad: eval() doesnt support radix in eval (FreeBSD 8.x,9.0,9.1,9.2 m4) +-')ifelse(t1`'t2`'t3,YYY,`good +-') +-EOF +- echo "trying m4" >&5 +- gmp_tmp_val=`(m4 conftest.m4) 2>&5` +- echo "$gmp_tmp_val" >&5 +- if test "$gmp_tmp_val" = good; then +- gmp_cv_prog_m4="m4" +- else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH:/usr/5bin" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- echo "trying $ac_dir/m4" >&5 +- gmp_tmp_val=`($ac_dir/m4 conftest.m4) 2>&5` +- echo "$gmp_tmp_val" >&5 +- if test "$gmp_tmp_val" = good; then +- gmp_cv_prog_m4="$ac_dir/m4" +- break +- fi +- done +- IFS="$ac_save_ifs" +- if test -z "$gmp_cv_prog_m4"; then +- as_fn_error $? "No usable m4 in \$PATH or /usr/5bin (see config.log for reasons)." "$LINENO" 5 +- fi +- fi +- rm -f conftest.m4 +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_prog_m4" >&5 +-$as_echo "$gmp_cv_prog_m4" >&6; } +-M4="$gmp_cv_prog_m4" +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if m4wrap produces spurious output" >&5 +-$as_echo_n "checking if m4wrap produces spurious output... " >&6; } +-if ${gmp_cv_m4_m4wrap_spurious+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # hide the d-n-l from autoconf's error checking +-tmp_d_n_l=d""nl +-cat >conftest.m4 <&5 +-cat conftest.m4 >&5 +-tmp_chars=`$M4 conftest.m4 | wc -c` +-echo produces $tmp_chars chars output >&5 +-rm -f conftest.m4 +-if test $tmp_chars = 0; then +- gmp_cv_m4_m4wrap_spurious=no +-else +- gmp_cv_m4_m4wrap_spurious=yes +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_m4_m4wrap_spurious" >&5 +-$as_echo "$gmp_cv_m4_m4wrap_spurious" >&6; } +- +-echo "define(,<$gmp_cv_m4_m4wrap_spurious>)" >> $gmp_tmpconfigm4 +- +- +-# else +-# It's unclear why this m4-not-needed stuff was ever done. +-# if test -z "$M4" ; then +-# M4=m4-not-needed +-# fi +-fi +- +-# Only do the GMP_ASM checks if there's a .S or .asm wanting them. +-if test $found_asm = no && test $found_S = no; then +- gmp_asm_syntax_testing=no +-fi +- +-if test "$gmp_asm_syntax_testing" != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to switch to text section" >&5 +-$as_echo_n "checking how to switch to text section... " >&6; } +-if ${gmp_cv_asm_text+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in ".text" ".code" ".csect .text[PR]"; do +- echo "trying $i" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_text=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_text"; then +- as_fn_error $? "Cannot determine text section directive" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_text" >&5 +-$as_echo "$gmp_cv_asm_text" >&6; } +-echo "define(, <$gmp_cv_asm_text>)" >> $gmp_tmpconfigm4 +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to switch to data section" >&5 +-$as_echo_n "checking how to switch to data section... " >&6; } +-if ${gmp_cv_asm_data+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-aix*) gmp_cv_asm_data=".csect .data[RW]" ;; +- *) gmp_cv_asm_data=".data" ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_data" >&5 +-$as_echo "$gmp_cv_asm_data" >&6; } +-echo "define(, <$gmp_cv_asm_data>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler label suffix" >&5 +-$as_echo_n "checking for assembler label suffix... " >&6; } +-if ${gmp_cv_asm_label_suffix+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_label_suffix=unknown +-for i in "" ":"; do +- echo "trying $i" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_label_suffix=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat conftest.out >&5 +-fi +-rm -f conftest* +- +-done +-if test "$gmp_cv_asm_label_suffix" = "unknown"; then +- as_fn_error $? "Cannot determine label suffix" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_label_suffix" >&5 +-$as_echo "$gmp_cv_asm_label_suffix" >&6; } +-echo "define(, <$gmp_cv_asm_label_suffix>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler global directive" >&5 +-$as_echo_n "checking for assembler global directive... " >&6; } +-if ${gmp_cv_asm_globl+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- hppa*-*-*) gmp_cv_asm_globl=.export ;; +- ia64*-*-* | itanium-*-* | itanium2-*-*) gmp_cv_asm_globl=.global ;; +- *) gmp_cv_asm_globl=.globl ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_globl" >&5 +-$as_echo "$gmp_cv_asm_globl" >&6; } +-echo "define(, <$gmp_cv_asm_globl>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler global directive attribute" >&5 +-$as_echo_n "checking for assembler global directive attribute... " >&6; } +-if ${gmp_cv_asm_globl_attr+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $gmp_cv_asm_globl in +- .export) gmp_cv_asm_globl_attr=",entry" ;; +- *) gmp_cv_asm_globl_attr="" ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_globl_attr" >&5 +-$as_echo "$gmp_cv_asm_globl_attr" >&6; } +-echo "define(, <$gmp_cv_asm_globl_attr>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if globals are prefixed by underscore" >&5 +-$as_echo_n "checking if globals are prefixed by underscore... " >&6; } +-if ${gmp_cv_asm_underscore+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_underscore="unknown" +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- $NM conftest.$OBJEXT >conftest.out +- if grep _gurkmacka conftest.out >/dev/null; then +- gmp_cv_asm_underscore=yes +- elif grep gurkmacka conftest.out >/dev/null; then +- gmp_cv_asm_underscore=no +- else +- echo "configure: $NM doesn't have gurkmacka:" >&5 +- cat conftest.out >&5 +- fi +-else +- echo "configure: failed program was:" >&5 +- cat conftest.c >&5 +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_underscore" >&5 +-$as_echo "$gmp_cv_asm_underscore" >&6; } +-case $gmp_cv_asm_underscore in +- yes) +- +-echo 'define(, <_>)' >>$gmp_tmpconfigm4 +- ;; +- no) +- +-echo 'define(, <>)' >>$gmp_tmpconfigm4 +- ;; +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Cannot determine global symbol prefix." >&5 +-$as_echo "$as_me: WARNING: | Cannot determine global symbol prefix." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $NM output doesn't contain a global data symbol." >&5 +-$as_echo "$as_me: WARNING: | $NM output doesn't contain a global data symbol." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Will proceed with no underscore." >&5 +-$as_echo "$as_me: WARNING: | Will proceed with no underscore." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | If this is wrong then you'll get link errors referring" >&5 +-$as_echo "$as_me: WARNING: | If this is wrong then you'll get link errors referring" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | to ___gmpn_add_n (note three underscores)." >&5 +-$as_echo "$as_me: WARNING: | to ___gmpn_add_n (note three underscores)." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | In this case do a fresh build with an override," >&5 +-$as_echo "$as_me: WARNING: | In this case do a fresh build with an override," >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | ./configure gmp_cv_asm_underscore=yes" >&5 +-$as_echo "$as_me: WARNING: | ./configure gmp_cv_asm_underscore=yes" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- +-echo 'define(, <>)' >>$gmp_tmpconfigm4 +- +- ;; +-esac +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to switch to read-only data section" >&5 +-$as_echo_n "checking how to switch to read-only data section... " >&6; } +-if ${gmp_cv_asm_rodata+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +-case $host in +-i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | x86_64-*-*) +- gmp_cv_asm_rodata="$gmp_cv_asm_data" ;; +-*) +- gmp_cv_asm_rodata="$gmp_cv_asm_text" ;; +-esac +- +-cat >conftest.c <&5 +-cat conftest.c >&5 +-gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&5" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- echo "Compiler output:" >&5 +- cat conftest.s >&5 +- if test $gmp_cv_asm_underscore = yes; then +- tmp_gsym_prefix=_ +- else +- tmp_gsym_prefix= +- fi +- # must see our label +- if grep "^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" conftest.s >/dev/null 2>&5; then +- # take the last directive before our label (hence skipping segments +- # getting debugging info etc) +- tmp_match=`sed -n "/^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix/q +- /^[. ]*data/p +- /^[. ]*rdata/p +- /^[. ]*text/p +- /^[. ]*section/p +- /^[. ]*csect/p +- /^[. ]*CSECT/p" conftest.s | sed -n '$p'` +- echo "Match: $tmp_match" >&5 +- if test -n "$tmp_match"; then +- gmp_cv_asm_rodata=$tmp_match +- fi +- else +- echo "Couldn't find label: ^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" >&5 +- fi +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_rodata" >&5 +-$as_echo "$gmp_cv_asm_rodata" >&6; } +-echo "define(, <$gmp_cv_asm_rodata>)" >> $gmp_tmpconfigm4 +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler .type directive" >&5 +-$as_echo_n "checking for assembler .type directive... " >&6; } +-if ${gmp_cv_asm_type+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_type= +-for gmp_tmp_prefix in @ \# %; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_type=".type \$1,${gmp_tmp_prefix}\$2" +- break +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_type" >&5 +-$as_echo "$gmp_cv_asm_type" >&6; } +-echo "define(, <$gmp_cv_asm_type>)" >> $gmp_tmpconfigm4 +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler .size directive" >&5 +-$as_echo_n "checking for assembler .size directive... " >&6; } +-if ${gmp_cv_asm_size+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_size= +-cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_size=".size \$1,\$2" +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_size" >&5 +-$as_echo "$gmp_cv_asm_size" >&6; } +-echo "define(, <$gmp_cv_asm_size>)" >> $gmp_tmpconfigm4 +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler local label prefix" >&5 +-$as_echo_n "checking for assembler local label prefix... " >&6; } +-if ${gmp_cv_asm_lsym_prefix+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_tmp_pre_appears=yes +-for gmp_tmp_pre in L .L $L $ L$; do +- echo "Trying $gmp_tmp_pre" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if $NM conftest.$OBJEXT >conftest.nm 2>&5; then : ; else +- cat conftest.nm >&5 +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"$NM\" failure" >&5 +-$as_echo "$as_me: WARNING: \"$NM\" failure" >&2;} +- break +- fi +- cat conftest.nm >&5 +- if grep gurkmacka conftest.nm >/dev/null; then : ; else +- # no mention of the symbol, this is good +- echo "$gmp_tmp_pre label doesn't appear in object file at all (good)" >&5 +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- gmp_tmp_pre_appears=no +- break +- fi +- if grep ' [a-zN] .*gurkmacka' conftest.nm >/dev/null; then +- # symbol mentioned as a local, use this if nothing better +- echo "$gmp_tmp_pre label is local but still in object file" >&5 +- if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- fi +- else +- echo "$gmp_tmp_pre label is something unknown" >&5 +- fi +- +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-rm -f conftest* +-if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix=L +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine local label, using default $gmp_cv_asm_lsym_prefix" >&5 +-$as_echo "$as_me: WARNING: cannot determine local label, using default $gmp_cv_asm_lsym_prefix" >&2;} +-fi +-# for development purposes, note whether we got a purely temporary local label +-echo "Local label appears in object files: $gmp_tmp_pre_appears" >&5 +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_lsym_prefix" >&5 +-$as_echo "$gmp_cv_asm_lsym_prefix" >&6; } +-echo "define(, <${gmp_cv_asm_lsym_prefix}>)" >> $gmp_tmpconfigm4 +- +-cat >>confdefs.h <<_ACEOF +-@%:@define LSYM_PREFIX "$gmp_cv_asm_lsym_prefix" +-_ACEOF +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler byte directive" >&5 +-$as_echo_n "checking for assembler byte directive... " >&6; } +-if ${gmp_cv_asm_byte+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in .byte data1; do +- echo "trying $i" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_byte=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat conftest.out >&5 +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_byte"; then +- as_fn_error $? "Cannot determine how to emit a data byte" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_byte" >&5 +-$as_echo "$gmp_cv_asm_byte" >&6; } +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to define a 32-bit word" >&5 +-$as_echo_n "checking how to define a 32-bit word... " >&6; } +-if ${gmp_cv_asm_w32+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-hpux*) +- # FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption +- # that it's at 0x0. We'll have to declare another symbol before the +- # .long/.word and look at the distance between the two symbols. The +- # only problem is that the sed expression(s) barfs (on Solaris, for +- # example) for the symbol with value 0. For now, HPUX uses .word. +- gmp_cv_asm_w32=".word" +- ;; +- *-*-*) +- gmp_tmp_val= +- for gmp_tmp_op in .long .word data4; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_tmp_val=`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'` +- if test "$gmp_tmp_val" = 4; then +- gmp_cv_asm_w32="$gmp_tmp_op" +- break +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +- done +- rm -f conftest* +- ;; +-esac +-if test -z "$gmp_cv_asm_w32"; then +- as_fn_error $? "cannot determine how to define a 32-bit word" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_w32" >&5 +-$as_echo "$gmp_cv_asm_w32" >&6; } +-echo "define(, <$gmp_cv_asm_w32>)" >> $gmp_tmpconfigm4 +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if .align assembly directive is logarithmic" >&5 +-$as_echo_n "checking if .align assembly directive is logarithmic... " >&6; } +-if ${gmp_cv_asm_align_log+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_tmp_val=`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'` +- if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then +- gmp_cv_asm_align_log=yes +- else +- gmp_cv_asm_align_log=no +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- as_fn_error $? "cannot assemble alignment test" "$LINENO" 5 +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_align_log" >&5 +-$as_echo "$gmp_cv_asm_align_log" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_align_log>)" >> $gmp_tmpconfigm4 +- +- +- +- case $host in +- hppa*-*-*) +- # for both pa32 and pa64 +- +-echo "include_mpn(\`pa32/pa-defs.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- ia64*-*-* | itanium-*-* | itanium2-*-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether assembler .align padding is good" >&5 +-$as_echo_n "checking whether assembler .align padding is good... " >&6; } +-if ${gmp_cv_asm_ia64_align_ok+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.awk <<\EOF +-BEGIN { +- want[0] = "011" +- want[1] = "160" +- want[2] = "074" +- want[3] = "040" +- want[4] = "000" +- want[5] = "040" +- want[6] = "020" +- want[7] = "221" +- want[8] = "114" +- want[9] = "000" +- want[10] = "100" +- want[11] = "200" +- want[12] = "122" +- want[13] = "261" +- want[14] = "000" +- want[15] = "200" +- +- want[16] = "000" +- want[17] = "004" +- want[18] = "000" +- want[19] = "000" +- want[20] = "000" +- want[21] = "000" +- want[22] = "002" +- want[23] = "000" +- want[24] = "000" +- want[25] = "000" +- want[26] = "000" +- want[27] = "001" +- want[28] = "000" +- want[29] = "000" +- want[30] = "000" +- want[31] = "014" +- +- want[32] = "011" +- want[33] = "270" +- want[34] = "140" +- want[35] = "062" +- want[36] = "000" +- want[37] = "040" +- want[38] = "240" +- want[39] = "331" +- want[40] = "160" +- want[41] = "000" +- want[42] = "100" +- want[43] = "240" +- want[44] = "343" +- want[45] = "371" +- want[46] = "000" +- want[47] = "200" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 47; i++) +- got[i] = got[i+1]; +- got[47] = $f; +- +- found = 1 +- for (i = 0; i < 48; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-EOF +-cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_ia64_align_ok=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: oops, cannot compile test program" >&5 +-$as_echo "$as_me: WARNING: oops, cannot compile test program" >&2;} +- gmp_cv_asm_ia64_align_ok=yes +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_ia64_align_ok" >&5 +-$as_echo "$gmp_cv_asm_ia64_align_ok" >&6; } +- +-echo "define(, <\`$gmp_cv_asm_ia64_align_ok'>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- m68k-*-* | m68[0-9][0-9][0-9]-*-*) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler instruction and register style" >&5 +-$as_echo_n "checking assembler instruction and register style... " >&6; } +-if ${gmp_cv_asm_m68k_instruction+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in "addl %d0,%d1" "add.l %d0,%d1" "addl d0,d1" "add.l d0,d1"; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_instruction=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_m68k_instruction"; then +- as_fn_error $? "cannot determine assembler instruction and register style" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_m68k_instruction" >&5 +-$as_echo "$gmp_cv_asm_m68k_instruction" >&6; } +-case $gmp_cv_asm_m68k_instruction in +-"addl d0,d1") want_dot_size=no; want_register_percent=no ;; +-"addl %d0,%d1") want_dot_size=no; want_register_percent=yes ;; +-"add.l d0,d1") want_dot_size=yes; want_register_percent=no ;; +-"add.l %d0,%d1") want_dot_size=yes; want_register_percent=yes ;; +-*) as_fn_error $? "oops, unrecognised instruction and register style" "$LINENO" 5 ;; +-esac +- +-echo "define(, <\`$want_register_percent'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(, <\`$want_dot_size'>)" >> $gmp_tmpconfigm4 +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler addressing style" >&5 +-$as_echo_n "checking assembler addressing style... " >&6; } +-if ${gmp_cv_asm_m68k_addressing+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $gmp_cv_asm_m68k_instruction in +-addl*) movel=movel ;; +-add.l*) movel=move.l ;; +-*) as_fn_error $? "oops, unrecognised gmp_cv_asm_m68k_instruction" "$LINENO" 5 ;; +-esac +-case $gmp_cv_asm_m68k_instruction in +-*"%d0,%d1") dreg=%d0; areg=%a0 ;; +-*"d0,d1") dreg=d0; areg=a0 ;; +-*) as_fn_error $? "oops, unrecognised gmp_cv_asm_m68k_instruction" "$LINENO" 5 ;; +-esac +-cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_addressing=mit +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_addressing=motorola +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- as_fn_error $? "cannot determine assembler addressing style" "$LINENO" 5 +-fi +-rm -f conftest* +- +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_m68k_addressing" >&5 +-$as_echo "$gmp_cv_asm_m68k_addressing" >&6; } +- +-echo "define(, <\`$gmp_cv_asm_m68k_addressing'>)" >> $gmp_tmpconfigm4 +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler shortest branches" >&5 +-$as_echo_n "checking assembler shortest branches... " >&6; } +-if ${gmp_cv_asm_m68k_branches+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in jra jbra bra; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_branches=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_m68k_branches"; then +- as_fn_error $? "cannot determine assembler branching style" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_m68k_branches" >&5 +-$as_echo "$gmp_cv_asm_m68k_branches" >&6; } +- +-echo "define(, <\`$gmp_cv_asm_m68k_branches'>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- powerpc*-*-* | power[3-9]-*-*) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler output is PIC by default" >&5 +-$as_echo_n "checking whether compiler output is PIC by default... " >&6; } +-if ${gmp_cv_asm_powerpc_pic+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_powerpc_pic=yes +-cat >conftest.c <&5 +-cat conftest.c >&5 +-gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&5" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- echo "Compiler output:" >&5 +- cat conftest.s >&5 +- if grep 'foo@ha' conftest.s >/dev/null 2>&5; then +- gmp_cv_asm_powerpc_pic=no +- fi +- if grep 'ha16(_foo)' conftest.s >/dev/null 2>&5; then +- gmp_cv_asm_powerpc_pic=no +- fi +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_powerpc_pic" >&5 +-$as_echo "$gmp_cv_asm_powerpc_pic" >&6; } +- +-echo "define(,<$gmp_cv_asm_powerpc_pic>)" >> $gmp_tmpconfigm4 +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler needs r on registers" >&5 +-$as_echo_n "checking if the assembler needs r on registers... " >&6; } +-if ${gmp_cv_asm_powerpc_r_registers+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_powerpc_r_registers=no +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_powerpc_r_registers=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- as_fn_error $? "neither \"mtctr 6\" nor \"mtctr r6\" works" "$LINENO" 5 +-fi +-rm -f conftest* +- +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_powerpc_r_registers" >&5 +-$as_echo "$gmp_cv_asm_powerpc_r_registers" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_powerpc_r_registers>)" >> $gmp_tmpconfigm4 +- +- +- +-echo "include_mpn(\`powerpc32/powerpc-defs.m4')" >> $gmp_tmpconfigm4i +- +- +- # Check for Linux ELFv2 ABI +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#if _CALL_ELF == 2 +-yes +-#endif +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "yes" >/dev/null 2>&1; then : +- +-echo "define()" >> $gmp_tmpconfigm4 +- +-fi +-rm -f conftest* +- +- +- case $host in +- *-*-aix*) +- case $ABI in +- mode64) +-echo "include_mpn(\`powerpc64/aix.m4')" >> $gmp_tmpconfigm4i +- ;; +- *) +-echo "include_mpn(\`powerpc32/aix.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- *-*-linux* | *-*-*bsd*) +- case $ABI in +- mode64) +-echo "include_mpn(\`powerpc64/elf.m4')" >> $gmp_tmpconfigm4i +- ;; +- mode32 | 32) +-echo "include_mpn(\`powerpc32/elf.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- *-*-darwin*) +- case $ABI in +- mode64) +-echo "include_mpn(\`powerpc64/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- mode32 | 32) +-echo "include_mpn(\`powerpc32/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- *) +- # Assume unrecognized operating system is the powerpc eABI +- +-echo "include_mpn(\`powerpc32/eabi.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- esac +- ;; +- power*-*-aix*) +- +-echo "include_mpn(\`powerpc32/aix.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- *sparc*-*-*) +- case $ABI in +- 64) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler accepts \".register\"" >&5 +-$as_echo_n "checking if the assembler accepts \".register\"... " >&6; } +-if ${gmp_cv_asm_sparc_register+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_sparc_register=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_sparc_register=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_sparc_register" >&5 +-$as_echo "$gmp_cv_asm_sparc_register" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_sparc_register>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler accepts gotdata relocations" >&5 +-$as_echo_n "checking if the assembler accepts gotdata relocations... " >&6; } +-if ${gmp_cv_asm_sparc_gotdata+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_sparc_gotdata=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_sparc_gotdata=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_sparc_gotdata" >&5 +-$as_echo "$gmp_cv_asm_sparc_gotdata" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_sparc_gotdata>)" >> $gmp_tmpconfigm4 +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler can support shared PIC thunks" >&5 +-$as_echo_n "checking if the assembler can support shared PIC thunks... " >&6; } +-if ${gmp_cv_asm_sparc_shared_thunks+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_sparc_shared_thunks=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_sparc_shared_thunks=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_sparc_shared_thunks" >&5 +-$as_echo "$gmp_cv_asm_sparc_shared_thunks" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_sparc_shared_thunks>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the .align directive accepts an 0x90 fill in .text" >&5 +-$as_echo_n "checking if the .align directive accepts an 0x90 fill in .text... " >&6; } +-if ${gmp_cv_asm_align_fill_0x90+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then +- echo "Suppressing this warning by omitting 0x90" 1>&5 +- gmp_cv_asm_align_fill_0x90=no +-else +- gmp_cv_asm_align_fill_0x90=yes +-fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_align_fill_0x90=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_align_fill_0x90" >&5 +-$as_echo "$gmp_cv_asm_align_fill_0x90" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_align_fill_0x90>)" >> $gmp_tmpconfigm4 +- +- +- case $ABI in +- 32) +- +-echo "include_mpn(\`x86/x86-defs.m4')" >> $gmp_tmpconfigm4i +- +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_x86 1" >>confdefs.h +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler COFF type directives" >&5 +-$as_echo_n "checking for assembler COFF type directives... " >&6; } +-if ${gmp_cv_asm_x86_coff_type+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_coff_type=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_coff_type=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_coff_type" >&5 +-$as_echo "$gmp_cv_asm_x86_coff_type" >&6; } +-echo "define(, <$gmp_cv_asm_x86_coff_type>)" >> $gmp_tmpconfigm4 +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore" >&5 +-$as_echo_n "checking if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore... " >&6; } +-if ${gmp_cv_asm_x86_got_underscore+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_x86_got_underscore="not applicable" +-if test $gmp_cv_asm_underscore = yes; then +- tmp_gsym_prefix=_ +-else +- tmp_gsym_prefix= +-fi +-for tmp_underscore in "" "_"; do +- cat >conftest.s <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$tmp_underscore" = "_"; then +- gmp_cv_asm_x86_got_underscore=yes +- else +- gmp_cv_asm_x86_got_underscore=no +- fi +- break +- fi +-done +-rm -f conftest* a.out b.out a.exe a_out.exe +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_got_underscore" >&5 +-$as_echo "$gmp_cv_asm_x86_got_underscore" >&6; } +-if test "$gmp_cv_asm_x86_got_underscore" = "yes"; then +- +-echo 'define(, <_>)' >>$gmp_tmpconfigm4 +- +-else +- +-echo 'define(, <>)' >>$gmp_tmpconfigm4 +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler takes cl with shldl" >&5 +-$as_echo_n "checking if the assembler takes cl with shldl... " >&6; } +-if ${gmp_cv_asm_x86_shldl_cl+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_shldl_cl=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_shldl_cl=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_shldl_cl" >&5 +-$as_echo "$gmp_cv_asm_x86_shldl_cl" >&6; } +-if test "$gmp_cv_asm_x86_shldl_cl" = "yes"; then +- +-echo 'define(, <1>)' >>$gmp_tmpconfigm4 +- +-else +- +-echo 'define(, <0>)' >>$gmp_tmpconfigm4 +- +-fi +- +- case $enable_profiling in +- prof | gprof) @%:@ Check whether --enable-shared was given. +-if test "${enable_shared+set}" = set; then : +- enableval=$enable_shared; p=${PACKAGE-default} +- case $enableval in +- yes) enable_shared=yes ;; +- no) enable_shared=no ;; +- *) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_shared=yes +-fi +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to call x86 mcount" >&5 +-$as_echo_n "checking how to call x86 mcount... " >&6; } +-cat >conftest.c <&5 +- (eval $gmp_asmout_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep '\.data' conftest.s >/dev/null; then +- mcount_nonpic_reg=`sed -n '/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p' conftest.s` +- else +- mcount_nonpic_reg= +- fi +- mcount_nonpic_call=`grep 'call.*mcount' conftest.s` +- if test -z "$mcount_nonpic_call"; then +- as_fn_error $? "Cannot find mcount call for non-PIC" "$LINENO" 5 +- fi +- else +- as_fn_error $? "Cannot compile test program for non-PIC" "$LINENO" 5 +- fi +-fi +- +-if test "$enable_shared" = yes; then +- gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic -S conftest.c 1>&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_asmout_compile\""; } >&5 +- (eval $gmp_asmout_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep '\.data' conftest.s >/dev/null; then +- case $lt_prog_compiler_pic in +- *-DDLL_EXPORT*) +- # Windows DLLs have non-PIC style mcount +- mcount_pic_reg=`sed -n '/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p' conftest.s` +- ;; +- *) +- mcount_pic_reg=`sed -n 's/.*GOTOFF.*,\(%[a-z]*\).*$/\1/p' conftest.s` +- ;; +- esac +- else +- mcount_pic_reg= +- fi +- mcount_pic_call=`grep 'call.*mcount' conftest.s` +- if test -z "$mcount_pic_call"; then +- as_fn_error $? "Cannot find mcount call for PIC" "$LINENO" 5 +- fi +- else +- as_fn_error $? "Cannot compile test program for PIC" "$LINENO" 5 +- fi +-fi +- +- +-echo "define(, <\`$mcount_nonpic_reg'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(,<\`$mcount_nonpic_call'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(, <\`$mcount_pic_reg'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(, <\`$mcount_pic_call'>)" >> $gmp_tmpconfigm4 +- +- +-rm -f conftest.* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: determined" >&5 +-$as_echo "determined" >&6; } +- ;; +- esac +- case $host in +- *-*-darwin*) +- +-echo "include_mpn(\`x86/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- 64|x32) +- +-echo "include_mpn(\`x86_64/x86_64-defs.m4')" >> $gmp_tmpconfigm4i +- +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_x86_64 1" >>confdefs.h +- +- case $host in +- *-*-darwin*) +- +-echo "include_mpn(\`x86_64/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- *-*-mingw* | *-*-cygwin) +- +-echo "include_mpn(\`x86_64/dos64.m4')" >> $gmp_tmpconfigm4i +- ;; +- *-openbsd*) +- +-echo "define(,1)" >> $gmp_tmpconfigm4 +- ;; +- esac +- ;; +- esac +- ;; +- esac +-fi +- +-# For --enable-minithres, prepend "minithres" to path so that its special +-# gmp-mparam.h will be used. +-if test $enable_minithres = yes; then +- path="minithres $path" +-fi +- +-# Create link for gmp-mparam.h. +-gmp_mparam_source= +-for gmp_mparam_dir in $path; do +- test "$no_create" = yes || rm -f gmp-mparam.h +- tmp_file=$srcdir/mpn/$gmp_mparam_dir/gmp-mparam.h +- if test -f $tmp_file; then +- ac_config_links="$ac_config_links gmp-mparam.h:mpn/$gmp_mparam_dir/gmp-mparam.h" +- +- gmp_srclinks="$gmp_srclinks gmp-mparam.h" +- gmp_mparam_source=$tmp_file +- break +- fi +-done +-if test -z "$gmp_mparam_source"; then +- as_fn_error $? "no version of gmp-mparam.h found in path: $path" "$LINENO" 5 +-fi +- +-# For a helpful message from tune/tuneup.c +-gmp_mparam_suggest=$gmp_mparam_source +-if test "$gmp_mparam_dir" = generic; then +- for i in $path; do break; done +- if test "$i" != generic; then +- gmp_mparam_suggest="new file $srcdir/mpn/$i/gmp-mparam.h" +- fi +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define GMP_MPARAM_H_SUGGEST "$gmp_mparam_source" +-_ACEOF +- +- +- +-# Copy relevant parameters from gmp-mparam.h to config.m4. +-# We only do this for parameters that are used by some assembly files. +-# Fat binaries do this on a per-file basis, so skip in that case. +-# +-if test -z "$fat_path"; then +- for i in SQR_TOOM2_THRESHOLD BMOD_1_TO_MOD_1_THRESHOLD SHLD_SLOW SHRD_SLOW; do +- value=`sed -n 's/^#define '$i'[ ]*\([0-9][0-9]*\).*$/\1/p' $gmp_mparam_source` +- if test -n "$value"; then +- +-echo "define(<$i>,<$value>)" >> $gmp_tmpconfigm4 +- +- fi +- done +-fi +- +- +-# Sizes of some types, needed at preprocessing time. +-# +-# FIXME: The assumption that GMP_LIMB_BITS is 8*sizeof(mp_limb_t) might +-# be slightly rash, but it's true everywhere we know of and ought to be true +-# of any sensible system. In a generic C build, grepping LONG_BIT out of +-# might be an alternative, for maximum portability. +-# +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +-$as_echo_n "checking size of void *... " >&6; } +-if ${ac_cv_sizeof_void_p+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_void_p" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (void *) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_void_p=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +-$as_echo "$ac_cv_sizeof_void_p" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_VOID_P $ac_cv_sizeof_void_p +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned short" >&5 +-$as_echo_n "checking size of unsigned short... " >&6; } +-if ${ac_cv_sizeof_unsigned_short+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned short))" "ac_cv_sizeof_unsigned_short" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_unsigned_short" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (unsigned short) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_unsigned_short=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_short" >&5 +-$as_echo "$ac_cv_sizeof_unsigned_short" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned" >&5 +-$as_echo_n "checking size of unsigned... " >&6; } +-if ${ac_cv_sizeof_unsigned+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned))" "ac_cv_sizeof_unsigned" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_unsigned" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (unsigned) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_unsigned=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned" >&5 +-$as_echo "$ac_cv_sizeof_unsigned" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 +-$as_echo_n "checking size of unsigned long... " >&6; } +-if ${ac_cv_sizeof_unsigned_long+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_unsigned_long" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (unsigned long) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_unsigned_long=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 +-$as_echo "$ac_cv_sizeof_unsigned_long" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of mp_limb_t" >&5 +-$as_echo_n "checking size of mp_limb_t... " >&6; } +-if ${ac_cv_sizeof_mp_limb_t+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (mp_limb_t))" "ac_cv_sizeof_mp_limb_t" "#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include \"$srcdir/gmp-h.in\" +- +-"; then : +- +-else +- if test "$ac_cv_type_mp_limb_t" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (mp_limb_t) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_mp_limb_t=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_mp_limb_t" >&5 +-$as_echo "$ac_cv_sizeof_mp_limb_t" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t +-_ACEOF +- +- +-if test "$ac_cv_sizeof_mp_limb_t" = 0; then +- as_fn_error $? "Oops, mp_limb_t doesn't seem to work" "$LINENO" 5 +-fi +-GMP_LIMB_BITS=`expr 8 \* $ac_cv_sizeof_mp_limb_t` +- +- +-echo "define(,<$ac_cv_sizeof_unsigned>)" >> $gmp_tmpconfigm4 +- +- +-# Check compiler limb size matches gmp-mparam.h +-# +-# FIXME: Some of the cycle counter objects in the tune directory depend on +-# the size of ulong, it'd be possible to check that here, though a mismatch +-# probably wouldn't want to be fatal, none of the libgmp assembler code +-# depends on ulong. +-# +-mparam_bits=`sed -n 's/^#define GMP_LIMB_BITS[ ][ ]*\([0-9]*\).*$/\1/p' $gmp_mparam_source` +-if test -n "$mparam_bits" && test "$mparam_bits" -ne $GMP_LIMB_BITS; then +- if test "$test_CFLAGS" = set; then +- as_fn_error $? "Oops, mp_limb_t is $GMP_LIMB_BITS bits, but the assembler code +-in this configuration expects $mparam_bits bits. +-You appear to have set \$CFLAGS, perhaps you also need to tell GMP the +-intended ABI, see \"ABI and ISA\" in the manual." "$LINENO" 5 +- else +- as_fn_error $? "Oops, mp_limb_t is $GMP_LIMB_BITS bits, but the assembler code +-in this configuration expects $mparam_bits bits." "$LINENO" 5 +- fi +-fi +- +- +-echo "define(,$GMP_LIMB_BITS)" >> $gmp_tmpconfigm4 +- +- +-echo "define(,$GMP_NAIL_BITS)" >> $gmp_tmpconfigm4 +- +- +-echo "define(,eval(GMP_LIMB_BITS-GMP_NAIL_BITS))" >> $gmp_tmpconfigm4 +- +- +- +- +- +- +- +- +-# A recompiled sqr_basecase for use in the tune program, if necessary. +-TUNE_SQR_OBJ= +-test -d tune || mkdir tune +-case $sqr_basecase_source in +- *.asm) +- sqr_max=`sed -n 's/^def...(SQR_TOOM2_THRESHOLD_MAX, *\([0-9]*\))/\1/p' $sqr_basecase_source` +- if test -n "$sqr_max"; then +- TUNE_SQR_OBJ=sqr_asm.o +- +-cat >>confdefs.h <<_ACEOF +-@%:@define TUNE_SQR_TOOM2_MAX $sqr_max +-_ACEOF +- +- fi +- cat >tune/sqr_basecase.c <>confdefs.h +- +- cat >tune/sqr_basecase.c < +-" +-if test "x$ac_cv_type_stack_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_STACK_T 1 +-_ACEOF +- +-HAVE_STACK_T_01=1 +-else +- HAVE_STACK_T_01=0 +-fi +- +- +- +-# Configs for demos/calc directory +-# +-# AC_SUBST+AC_CONFIG_FILES is used for calc-config.h, rather than AC_DEFINE+ +-# AC_CONFIG_HEADERS, since with the latter automake (1.8) will then put the +-# directory (ie. demos/calc) into $(DEFAULT_INCLUDES) for every Makefile.in, +-# which would look very strange. +-# +-# -lcurses is required by libreadline. On a typical SVR4 style system this +-# normally doesn't have to be given explicitly, since libreadline.so will +-# have a NEEDED record for it. But if someone for some reason is using only +-# a static libreadline.a then we must give -lcurses. Readline (as of +-# version 4.3) doesn't use libtool, so we can't rely on a .la to cover +-# necessary dependencies. +-# +-# On a couple of systems we've seen libreadline available, but the headers +-# not in the default include path, so check for readline/readline.h. We've +-# also seen readline/history.h missing, not sure if that's just a broken +-# install or a very old version, but check that too. +-# +-ac_config_files="$ac_config_files demos/calc/calc-config.h:demos/calc/calc-config-h.in" +- +-LIBCURSES= +-if test $with_readline != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -lncurses" >&5 +-$as_echo_n "checking for tputs in -lncurses... " >&6; } +-if ${ac_cv_lib_ncurses_tputs+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lncurses $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char tputs (); +-int +-main () +-{ +-return tputs (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_ncurses_tputs=yes +-else +- ac_cv_lib_ncurses_tputs=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tputs" >&5 +-$as_echo "$ac_cv_lib_ncurses_tputs" >&6; } +-if test "x$ac_cv_lib_ncurses_tputs" = xyes; then : +- LIBCURSES=-lncurses +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -lcurses" >&5 +-$as_echo_n "checking for tputs in -lcurses... " >&6; } +-if ${ac_cv_lib_curses_tputs+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lcurses $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char tputs (); +-int +-main () +-{ +-return tputs (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_curses_tputs=yes +-else +- ac_cv_lib_curses_tputs=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tputs" >&5 +-$as_echo "$ac_cv_lib_curses_tputs" >&6; } +-if test "x$ac_cv_lib_curses_tputs" = xyes; then : +- LIBCURSES=-lcurses +-fi +- +-fi +- +-fi +- +-use_readline=$with_readline +-if test $with_readline = detect; then +- use_readline=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +-$as_echo_n "checking for readline in -lreadline... " >&6; } +-if ${ac_cv_lib_readline_readline+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lreadline $LIBCURSES $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char readline (); +-int +-main () +-{ +-return readline (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_readline_readline=yes +-else +- ac_cv_lib_readline_readline=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +-$as_echo "$ac_cv_lib_readline_readline" >&6; } +-if test "x$ac_cv_lib_readline_readline" = xyes; then : +- ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +-if test "x$ac_cv_header_readline_readline_h" = xyes; then : +- ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" +-if test "x$ac_cv_header_readline_history_h" = xyes; then : +- use_readline=yes +-fi +- +- +-fi +- +- +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking readline detected" >&5 +-$as_echo_n "checking readline detected... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_readline" >&5 +-$as_echo "$use_readline" >&6; } +-fi +-if test $use_readline = yes; then +- WITH_READLINE_01=1 +- +- LIBREADLINE=-lreadline +- +-else +- WITH_READLINE_01=0 +-fi +-for ac_prog in 'bison -y' byacc +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_YACC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$YACC"; then +- ac_cv_prog_YACC="$YACC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_YACC="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-YACC=$ac_cv_prog_YACC +-if test -n "$YACC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 +-$as_echo "$YACC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$YACC" && break +-done +-test -n "$YACC" || YACC="yacc" +- +-for ac_prog in flex lex +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_LEX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$LEX"; then +- ac_cv_prog_LEX="$LEX" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_LEX="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-LEX=$ac_cv_prog_LEX +-if test -n "$LEX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 +-$as_echo "$LEX" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$LEX" && break +-done +-test -n "$LEX" || LEX=":" +- +-if test "x$LEX" != "x:"; then +- cat >conftest.l <<_ACEOF +-%% +-a { ECHO; } +-b { REJECT; } +-c { yymore (); } +-d { yyless (1); } +-e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ +- yyless ((input () != 0)); } +-f { unput (yytext[0]); } +-. { BEGIN INITIAL; } +-%% +-#ifdef YYTEXT_POINTER +-extern char *yytext; +-#endif +-int +-main (void) +-{ +- return ! yylex () + ! yywrap (); +-} +-_ACEOF +-{ { ac_try="$LEX conftest.l" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$LEX conftest.l") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 +-$as_echo_n "checking lex output file root... " >&6; } +-if ${ac_cv_prog_lex_root+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +-if test -f lex.yy.c; then +- ac_cv_prog_lex_root=lex.yy +-elif test -f lexyy.c; then +- ac_cv_prog_lex_root=lexyy +-else +- as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 +-$as_echo "$ac_cv_prog_lex_root" >&6; } +-LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root +- +-if test -z "${LEXLIB+set}"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 +-$as_echo_n "checking lex library... " >&6; } +-if ${ac_cv_lib_lex+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +- ac_save_LIBS=$LIBS +- ac_cv_lib_lex='none needed' +- for ac_lib in '' -lfl -ll; do +- LIBS="$ac_lib $ac_save_LIBS" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-`cat $LEX_OUTPUT_ROOT.c` +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_lex=$ac_lib +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- test "$ac_cv_lib_lex" != 'none needed' && break +- done +- LIBS=$ac_save_LIBS +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 +-$as_echo "$ac_cv_lib_lex" >&6; } +- test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 +-$as_echo_n "checking whether yytext is a pointer... " >&6; } +-if ${ac_cv_prog_lex_yytext_pointer+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # POSIX says lex can declare yytext either as a pointer or an array; the +-# default is implementation-dependent. Figure out which it is, since +-# not all implementations provide the %pointer and %array declarations. +-ac_cv_prog_lex_yytext_pointer=no +-ac_save_LIBS=$LIBS +-LIBS="$LEXLIB $ac_save_LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +- #define YYTEXT_POINTER 1 +-`cat $LEX_OUTPUT_ROOT.c` +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_prog_lex_yytext_pointer=yes +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_save_LIBS +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 +-$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } +-if test $ac_cv_prog_lex_yytext_pointer = yes; then +- +-$as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h +- +-fi +-rm -f conftest.l $LEX_OUTPUT_ROOT.c +- +-fi +-if test "$LEX" = :; then +- LEX=${am_missing_run}flex +-fi +- +-# Configs for demos/expr directory +-# +-# Libtool already runs an AC_CHECK_TOOL for ranlib, but we give +-# AC_PROG_RANLIB anyway since automake is supposed to complain if it's not +-# called. (Automake 1.8.4 doesn't, at least not when the only library is in +-# an EXTRA_LIBRARIES.) +-# +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$RANLIB"; then +- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-RANLIB=$ac_cv_prog_RANLIB +-if test -n "$RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +-$as_echo "$RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_RANLIB"; then +- ac_ct_RANLIB=$RANLIB +- # Extract the first word of "ranlib", so it can be a program name with args. +-set dummy ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_RANLIB"; then +- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_RANLIB="ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +-if test -n "$ac_ct_RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +-$as_echo "$ac_ct_RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_RANLIB" = x; then +- RANLIB=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- RANLIB=$ac_ct_RANLIB +- fi +-else +- RANLIB="$ac_cv_prog_RANLIB" +-fi +- +- +- +-# Create config.m4. +- +-echo "creating $gmp_configm4" +-echo "d""nl $gmp_configm4. Generated automatically by configure." > $gmp_configm4 +-if test -f $gmp_tmpconfigm4; then +- echo "changequote(<,>)" >> $gmp_configm4 +- echo "ifdef(<__CONFIG_M4_INCLUDED__>,,<" >> $gmp_configm4 +- cat $gmp_tmpconfigm4 >> $gmp_configm4 +- echo ">)" >> $gmp_configm4 +- echo "changequote(\`,')" >> $gmp_configm4 +- rm $gmp_tmpconfigm4 +-fi +-echo "ifdef(\`__CONFIG_M4_INCLUDED__',,\`" >> $gmp_configm4 +-if test -f $gmp_tmpconfigm4i; then +- cat $gmp_tmpconfigm4i >> $gmp_configm4 +- rm $gmp_tmpconfigm4i +-fi +-if test -f $gmp_tmpconfigm4p; then +- cat $gmp_tmpconfigm4p >> $gmp_configm4 +- rm $gmp_tmpconfigm4p +-fi +-echo "')" >> $gmp_configm4 +-echo "define(\`__CONFIG_M4_INCLUDED__')" >> $gmp_configm4 +- +- +-# Create Makefiles +-# FIXME: Upcoming version of autoconf/automake may not like broken lines. +-# Right now automake isn't accepting the new AC_CONFIG_FILES scheme. +- +-ac_config_files="$ac_config_files Makefile mpf/Makefile mpn/Makefile mpq/Makefile mpz/Makefile printf/Makefile scanf/Makefile rand/Makefile cxx/Makefile tests/Makefile tests/devel/Makefile tests/mpf/Makefile tests/mpn/Makefile tests/mpq/Makefile tests/mpz/Makefile tests/rand/Makefile tests/misc/Makefile tests/cxx/Makefile doc/Makefile tune/Makefile demos/Makefile demos/calc/Makefile demos/expr/Makefile gmp.h:gmp-h.in" +- +-cat >confcache <<\_ACEOF +-# This file is a shell script that caches the results of configure +-# tests run on this system so they can be shared between configure +-# scripts and configure runs, see configure's option --config-cache. +-# It is not useful on other systems. If it contains results you don't +-# want to keep, you may remove or edit it. +-# +-# config.status only pays attention to the cache file if you give it +-# the --recheck option to rerun configure. +-# +-# `ac_cv_env_foo' variables (set or unset) will be overridden when +-# loading this file, other *unset* `ac_cv_foo' will be assigned the +-# following values. +- +-_ACEOF +- +-# The following way of writing the cache mishandles newlines in values, +-# but we know of no workaround that is simple, portable, and efficient. +-# So, we kill variables containing newlines. +-# Ultrix sh set writes to stderr and can't be redirected directly, +-# and sets the high bit in the cache file unless we assign to the vars. +-( +- for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do +- eval ac_val=\$$ac_var +- case $ac_val in #( +- *${as_nl}*) +- case $ac_var in #( +- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; +- esac +- case $ac_var in #( +- _ | IFS | as_nl) ;; #( +- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( +- *) { eval $ac_var=; unset $ac_var;} ;; +- esac ;; +- esac +- done +- +- (set) 2>&1 | +- case $as_nl`(ac_space=' '; set) 2>&1` in #( +- *${as_nl}ac_space=\ *) +- # `set' does not quote correctly, so add quotes: double-quote +- # substitution turns \\\\ into \\, and sed turns \\ into \. +- sed -n \ +- "s/'/'\\\\''/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" +- ;; #( +- *) +- # `set' quotes correctly as required by POSIX, so do not add quotes. +- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" +- ;; +- esac | +- sort +-) | +- sed ' +- /^ac_cv_env_/b end +- t clear +- :clear +- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ +- t end +- s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ +- :end' >>confcache +-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else +- if test -w "$cache_file"; then +- if test "x$cache_file" != "x/dev/null"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +-$as_echo "$as_me: updating cache $cache_file" >&6;} +- if test ! -f "$cache_file" || test -h "$cache_file"; then +- cat confcache >"$cache_file" +- else +- case $cache_file in #( +- */* | ?:*) +- mv -f confcache "$cache_file"$$ && +- mv -f "$cache_file"$$ "$cache_file" ;; #( +- *) +- mv -f confcache "$cache_file" ;; +- esac +- fi +- fi +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} +- fi +-fi +-rm -f confcache +- +-test "x$prefix" = xNONE && prefix=$ac_default_prefix +-# Let make expand exec_prefix. +-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' +- +-DEFS=-DHAVE_CONFIG_H +- +-ac_libobjs= +-ac_ltlibobjs= +-U= +-for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue +- # 1. Remove the extension, and $U if already installed. +- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +- ac_i=`$as_echo "$ac_i" | sed "$ac_script"` +- # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR +- # will be set to the directory where LIBOBJS objects are built. +- as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" +- as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +-done +-LIB@&t@OBJS=$ac_libobjs +- +-LTLIBOBJS=$ac_ltlibobjs +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +-$as_echo_n "checking that generated files are newer than configure... " >&6; } +- if test -n "$am_sleep_pid"; then +- # Hide warnings about reused PIDs. +- wait $am_sleep_pid 2>/dev/null +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +-$as_echo "done" >&6; } +- if test -n "$EXEEXT"; then +- am__EXEEXT_TRUE= +- am__EXEEXT_FALSE='#' +-else +- am__EXEEXT_TRUE='#' +- am__EXEEXT_FALSE= +-fi +- +-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then +- as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +-Usually this means the macro was only invoked conditionally." "$LINENO" 5 +-fi +-if test -z "${WANT_CXX_TRUE}" && test -z "${WANT_CXX_FALSE}"; then +- as_fn_error $? "conditional \"WANT_CXX\" was never defined. +-Usually this means the macro was only invoked conditionally." "$LINENO" 5 +-fi +-if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then +- as_fn_error $? "conditional \"ENABLE_STATIC\" was never defined. +-Usually this means the macro was only invoked conditionally." "$LINENO" 5 +-fi +- +- +-: "${CONFIG_STATUS=./config.status}" +-ac_write_fail=0 +-ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files $CONFIG_STATUS" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +-as_write_fail=0 +-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +-#! $SHELL +-# Generated by $as_me. +-# Run this file to recreate the current configuration. +-# Compiler output produced by configure, useful for debugging +-# configure, is in config.log if it exists. +- +-debug=false +-ac_cs_recheck=false +-ac_cs_silent=false +- +-SHELL=\${CONFIG_SHELL-$SHELL} +-export SHELL +-_ASEOF +-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +-## -------------------- ## +-## M4sh Initialization. ## +-## -------------------- ## +- +-# Be more Bourne compatible +-DUALCASE=1; export DUALCASE # for MKS sh +-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +- emulate sh +- NULLCMD=: +- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '${1+"$@"}'='"$@"' +- setopt NO_GLOB_SUBST +-else +- case `(set -o) 2>/dev/null` in @%:@( +- *posix*) : +- set -o posix ;; @%:@( +- *) : +- ;; +-esac +-fi +- +- +-as_nl=' +-' +-export as_nl +-# Printing a long string crashes Solaris 7 /usr/bin/printf. +-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +-# Prefer a ksh shell builtin over an external printf program on Solaris, +-# but without wasting forks for bash or zsh. +-if test -z "$BASH_VERSION$ZSH_VERSION" \ +- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='print -r --' +- as_echo_n='print -rn --' +-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='printf %s\n' +- as_echo_n='printf %s' +-else +- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then +- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' +- as_echo_n='/usr/ucb/echo -n' +- else +- as_echo_body='eval expr "X$1" : "X\\(.*\\)"' +- as_echo_n_body='eval +- arg=$1; +- case $arg in @%:@( +- *"$as_nl"*) +- expr "X$arg" : "X\\(.*\\)$as_nl"; +- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; +- esac; +- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" +- ' +- export as_echo_n_body +- as_echo_n='sh -c $as_echo_n_body as_echo' +- fi +- export as_echo_body +- as_echo='sh -c $as_echo_body as_echo' +-fi +- +-# The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then +- PATH_SEPARATOR=: +- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { +- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || +- PATH_SEPARATOR=';' +- } +-fi +- +- +-# IFS +-# We need space, tab and new line, in precisely that order. Quoting is +-# there to prevent editors from complaining about space-tab. +-# (If _AS_PATH_WALK were called with IFS unset, it would disable word +-# splitting by setting IFS to empty value.) +-IFS=" "" $as_nl" +- +-# Find who we are. Look in the path if we contain no directory separator. +-as_myself= +-case $0 in @%:@(( +- *[\\/]* ) as_myself=$0 ;; +- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-# We did not find ourselves, most probably we were run as `sh COMMAND' +-# in which case we are not to be found in the path. +-if test "x$as_myself" = x; then +- as_myself=$0 +-fi +-if test ! -f "$as_myself"; then +- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 +- exit 1 +-fi +- +-# Unset variables that we do not need and which cause bugs (e.g. in +-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +-# suppresses any "Segmentation fault" message there. '((' could +-# trigger a bug in pdksh 5.2.14. +-for as_var in BASH_ENV ENV MAIL MAILPATH +-do eval test x\${$as_var+set} = xset \ +- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +-done +-PS1='$ ' +-PS2='> ' +-PS4='+ ' +- +-# NLS nuisances. +-LC_ALL=C +-export LC_ALL +-LANGUAGE=C +-export LANGUAGE +- +-# CDPATH. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +- +-@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +-@%:@ ---------------------------------------- +-@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +-@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-@%:@ script with STATUS, using 1 if that was 0. +-as_fn_error () +-{ +- as_status=$1; test $as_status -eq 0 && as_status=1 +- if test "$4"; then +- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 +- fi +- $as_echo "$as_me: error: $2" >&2 +- as_fn_exit $as_status +-} @%:@ as_fn_error +- +- +-@%:@ as_fn_set_status STATUS +-@%:@ ----------------------- +-@%:@ Set @S|@? to STATUS, without forking. +-as_fn_set_status () +-{ +- return $1 +-} @%:@ as_fn_set_status +- +-@%:@ as_fn_exit STATUS +-@%:@ ----------------- +-@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +-as_fn_exit () +-{ +- set +e +- as_fn_set_status $1 +- exit $1 +-} @%:@ as_fn_exit +- +-@%:@ as_fn_unset VAR +-@%:@ --------------- +-@%:@ Portably unset VAR. +-as_fn_unset () +-{ +- { eval $1=; unset $1;} +-} +-as_unset=as_fn_unset +-@%:@ as_fn_append VAR VALUE +-@%:@ ---------------------- +-@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +-@%:@ advantage of any shell optimizations that allow amortized linear growth over +-@%:@ repeated appends, instead of the typical quadratic growth present in naive +-@%:@ implementations. +-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +- eval 'as_fn_append () +- { +- eval $1+=\$2 +- }' +-else +- as_fn_append () +- { +- eval $1=\$$1\$2 +- } +-fi # as_fn_append +- +-@%:@ as_fn_arith ARG... +-@%:@ ------------------ +-@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +-@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +-@%:@ must be portable across @S|@(()) and expr. +-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +- eval 'as_fn_arith () +- { +- as_val=$(( $* )) +- }' +-else +- as_fn_arith () +- { +- as_val=`expr "$@" || test $? -eq 1` +- } +-fi # as_fn_arith +- +- +-if expr a : '\(a\)' >/dev/null 2>&1 && +- test "X`expr 00001 : '.*\(...\)'`" = X001; then +- as_expr=expr +-else +- as_expr=false +-fi +- +-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then +- as_basename=basename +-else +- as_basename=false +-fi +- +-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then +- as_dirname=dirname +-else +- as_dirname=false +-fi +- +-as_me=`$as_basename -- "$0" || +-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ +- X"$0" : 'X\(//\)$' \| \ +- X"$0" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X/"$0" | +- sed '/^.*\/\([^/][^/]*\)\/*$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- +-# Avoid depending upon Character Ranges. +-as_cr_letters='abcdefghijklmnopqrstuvwxyz' +-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +-as_cr_Letters=$as_cr_letters$as_cr_LETTERS +-as_cr_digits='0123456789' +-as_cr_alnum=$as_cr_Letters$as_cr_digits +- +-ECHO_C= ECHO_N= ECHO_T= +-case `echo -n x` in @%:@((((( +--n*) +- case `echo 'xy\c'` in +- *c*) ECHO_T=' ';; # ECHO_T is single tab character. +- xy) ECHO_C='\c';; +- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null +- ECHO_T=' ';; +- esac;; +-*) +- ECHO_N='-n';; +-esac +- +-rm -f conf$$ conf$$.exe conf$$.file +-if test -d conf$$.dir; then +- rm -f conf$$.dir/conf$$.file +-else +- rm -f conf$$.dir +- mkdir conf$$.dir 2>/dev/null +-fi +-if (echo >conf$$.file) 2>/dev/null; then +- if ln -s conf$$.file conf$$ 2>/dev/null; then +- as_ln_s='ln -s' +- # ... but there are two gotchas: +- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. +- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -pR'. +- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -pR' +- elif ln conf$$.file conf$$ 2>/dev/null; then +- as_ln_s=ln +- else +- as_ln_s='cp -pR' +- fi +-else +- as_ln_s='cp -pR' +-fi +-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +-rmdir conf$$.dir 2>/dev/null +- +- +-@%:@ as_fn_mkdir_p +-@%:@ ------------- +-@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +-as_fn_mkdir_p () +-{ +- +- case $as_dir in #( +- -*) as_dir=./$as_dir;; +- esac +- test -d "$as_dir" || eval $as_mkdir_p || { +- as_dirs= +- while :; do +- case $as_dir in #( +- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( +- *) as_qdir=$as_dir;; +- esac +- as_dirs="'$as_qdir' $as_dirs" +- as_dir=`$as_dirname -- "$as_dir" || +-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_dir" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- test -d "$as_dir" && break +- done +- test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" +- +- +-} @%:@ as_fn_mkdir_p +-if mkdir -p . 2>/dev/null; then +- as_mkdir_p='mkdir -p "$as_dir"' +-else +- test -d ./-p && rmdir ./-p +- as_mkdir_p=false +-fi +- +- +-@%:@ as_fn_executable_p FILE +-@%:@ ----------------------- +-@%:@ Test if FILE is an executable regular file. +-as_fn_executable_p () +-{ +- test -f "$1" && test -x "$1" +-} @%:@ as_fn_executable_p +-as_test_x='test -x' +-as_executable_p=as_fn_executable_p +- +-# Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +- +-# Sed expression to map a string onto a valid variable name. +-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +- +- +-exec 6>&1 +-## ----------------------------------- ## +-## Main body of $CONFIG_STATUS script. ## +-## ----------------------------------- ## +-_ASEOF +-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-# Save the log message, to keep $0 and so on meaningful, and to +-# report actual input values of CONFIG_FILES etc. instead of their +-# values after options handling. +-ac_log=" +-This file was extended by GNU MP $as_me 6.0.0, which was +-generated by GNU Autoconf 2.69. Invocation command line was +- +- CONFIG_FILES = $CONFIG_FILES +- CONFIG_HEADERS = $CONFIG_HEADERS +- CONFIG_LINKS = $CONFIG_LINKS +- CONFIG_COMMANDS = $CONFIG_COMMANDS +- $ $0 $@ +- +-on `(hostname || uname -n) 2>/dev/null | sed 1q` +-" +- +-_ACEOF +- +-case $ac_config_files in *" +-"*) set x $ac_config_files; shift; ac_config_files=$*;; +-esac +- +-case $ac_config_headers in *" +-"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +-esac +- +- +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-# Files that config.status was made for. +-config_files="$ac_config_files" +-config_headers="$ac_config_headers" +-config_links="$ac_config_links" +-config_commands="$ac_config_commands" +- +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-ac_cs_usage="\ +-\`$as_me' instantiates files and other configuration actions +-from templates according to the current configuration. Unless the files +-and actions are specified as TAGs, all are instantiated by default. +- +-Usage: $0 [OPTION]... [TAG]... +- +- -h, --help print this help, then exit +- -V, --version print version number and configuration settings, then exit +- --config print configuration, then exit +- -q, --quiet, --silent +- do not print progress messages +- -d, --debug don't remove temporary files +- --recheck update $as_me by reconfiguring in the same conditions +- --file=FILE[:TEMPLATE] +- instantiate the configuration file FILE +- --header=FILE[:TEMPLATE] +- instantiate the configuration header FILE +- +-Configuration files: +-$config_files +- +-Configuration headers: +-$config_headers +- +-Configuration links: +-$config_links +- +-Configuration commands: +-$config_commands +- +-Report bugs to . +-GNU MP home page: . +-General help using GNU software: ." +- +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +-ac_cs_version="\\ +-GNU MP config.status 6.0.0 +-configured by $0, generated by GNU Autoconf 2.69, +- with options \\"\$ac_cs_config\\" +- +-Copyright (C) 2012 Free Software Foundation, Inc. +-This config.status script is free software; the Free Software Foundation +-gives unlimited permission to copy, distribute and modify it." +- +-ac_pwd='$ac_pwd' +-srcdir='$srcdir' +-INSTALL='$INSTALL' +-MKDIR_P='$MKDIR_P' +-AWK='$AWK' +-test -n "\$AWK" || AWK=awk +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-# The default lists apply if the user does not specify any file. +-ac_need_defaults=: +-while test $# != 0 +-do +- case $1 in +- --*=?*) +- ac_option=`expr "X$1" : 'X\([^=]*\)='` +- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` +- ac_shift=: +- ;; +- --*=) +- ac_option=`expr "X$1" : 'X\([^=]*\)='` +- ac_optarg= +- ac_shift=: +- ;; +- *) +- ac_option=$1 +- ac_optarg=$2 +- ac_shift=shift +- ;; +- esac +- +- case $ac_option in +- # Handling of the options. +- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) +- ac_cs_recheck=: ;; +- --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) +- $as_echo "$ac_cs_version"; exit ;; +- --config | --confi | --conf | --con | --co | --c ) +- $as_echo "$ac_cs_config"; exit ;; +- --debug | --debu | --deb | --de | --d | -d ) +- debug=: ;; +- --file | --fil | --fi | --f ) +- $ac_shift +- case $ac_optarg in +- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; +- '') as_fn_error $? "missing file argument" ;; +- esac +- as_fn_append CONFIG_FILES " '$ac_optarg'" +- ac_need_defaults=false;; +- --header | --heade | --head | --hea ) +- $ac_shift +- case $ac_optarg in +- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; +- esac +- as_fn_append CONFIG_HEADERS " '$ac_optarg'" +- ac_need_defaults=false;; +- --he | --h) +- # Conflict between --help and --header +- as_fn_error $? "ambiguous option: \`$1' +-Try \`$0 --help' for more information.";; +- --help | --hel | -h ) +- $as_echo "$ac_cs_usage"; exit ;; +- -q | -quiet | --quiet | --quie | --qui | --qu | --q \ +- | -silent | --silent | --silen | --sile | --sil | --si | --s) +- ac_cs_silent=: ;; +- +- # This is an error. +- -*) as_fn_error $? "unrecognized option: \`$1' +-Try \`$0 --help' for more information." ;; +- +- *) as_fn_append ac_config_targets " $1" +- ac_need_defaults=false ;; +- +- esac +- shift +-done +- +-ac_configure_extra_args= +- +-if $ac_cs_silent; then +- exec 6>/dev/null +- ac_configure_extra_args="$ac_configure_extra_args --silent" +-fi +- +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-if \$ac_cs_recheck; then +- set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +- shift +- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 +- CONFIG_SHELL='$SHELL' +- export CONFIG_SHELL +- exec "\$@" +-fi +- +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-exec 5>>config.log +-{ +- echo +- sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +-@%:@@%:@ Running $as_me. @%:@@%:@ +-_ASBOX +- $as_echo "$ac_log" +-} >&5 +- +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-# +-# INIT-COMMANDS +-# +- +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-sed_quote_subst='$sed_quote_subst' +-double_quote_subst='$double_quote_subst' +-delay_variable_subst='$delay_variable_subst' +-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +-AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +-DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +-PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +-lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +-lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +-file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +-want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +-sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +-archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +-nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +-lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +-MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +-postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' +- +-LTCC='$LTCC' +-LTCFLAGS='$LTCFLAGS' +-compiler='$compiler_DEFAULT' +- +-# A function that is used when there is no print builtin or printf. +-func_fallback_echo () +-{ +- eval 'cat <<_LTECHO_EOF +-\$1 +-_LTECHO_EOF' +-} +- +-# Quote evaled strings. +-for var in NM \ +-AS \ +-DLLTOOL \ +-OBJDUMP \ +-SHELL \ +-ECHO \ +-PATH_SEPARATOR \ +-SED \ +-GREP \ +-EGREP \ +-FGREP \ +-LD \ +-LN_S \ +-lt_SP2NL \ +-lt_NL2SP \ +-reload_flag \ +-deplibs_check_method \ +-file_magic_cmd \ +-file_magic_glob \ +-want_nocaseglob \ +-sharedlib_from_linklib_cmd \ +-AR \ +-AR_FLAGS \ +-archiver_list_spec \ +-STRIP \ +-RANLIB \ +-CC \ +-CFLAGS \ +-compiler \ +-lt_cv_sys_global_symbol_pipe \ +-lt_cv_sys_global_symbol_to_cdecl \ +-lt_cv_sys_global_symbol_to_c_name_address \ +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +-nm_file_list_spec \ +-lt_prog_compiler_no_builtin_flag \ +-lt_prog_compiler_pic \ +-lt_prog_compiler_wl \ +-lt_prog_compiler_static \ +-lt_cv_prog_compiler_c_o \ +-need_locks \ +-MANIFEST_TOOL \ +-DSYMUTIL \ +-NMEDIT \ +-LIPO \ +-OTOOL \ +-OTOOL64 \ +-shrext_cmds \ +-export_dynamic_flag_spec \ +-whole_archive_flag_spec \ +-compiler_needs_object \ +-with_gnu_ld \ +-allow_undefined_flag \ +-no_undefined_flag \ +-hardcode_libdir_flag_spec \ +-hardcode_libdir_separator \ +-exclude_expsyms \ +-include_expsyms \ +-file_list_spec \ +-variables_saved_for_relink \ +-libname_spec \ +-library_names_spec \ +-soname_spec \ +-install_override_mode \ +-finish_eval \ +-old_striplib \ +-striplib \ +-compiler_lib_search_dirs \ +-predep_objects \ +-postdep_objects \ +-predeps \ +-postdeps \ +-compiler_lib_search_path \ +-LD_CXX \ +-reload_flag_CXX \ +-compiler_CXX \ +-lt_prog_compiler_no_builtin_flag_CXX \ +-lt_prog_compiler_pic_CXX \ +-lt_prog_compiler_wl_CXX \ +-lt_prog_compiler_static_CXX \ +-lt_cv_prog_compiler_c_o_CXX \ +-export_dynamic_flag_spec_CXX \ +-whole_archive_flag_spec_CXX \ +-compiler_needs_object_CXX \ +-with_gnu_ld_CXX \ +-allow_undefined_flag_CXX \ +-no_undefined_flag_CXX \ +-hardcode_libdir_flag_spec_CXX \ +-hardcode_libdir_separator_CXX \ +-exclude_expsyms_CXX \ +-include_expsyms_CXX \ +-file_list_spec_CXX \ +-compiler_lib_search_dirs_CXX \ +-predep_objects_CXX \ +-postdep_objects_CXX \ +-predeps_CXX \ +-postdeps_CXX \ +-compiler_lib_search_path_CXX; do +- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in +- *[\\\\\\\`\\"\\\$]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" +- ;; +- *) +- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" +- ;; +- esac +-done +- +-# Double-quote double-evaled strings. +-for var in reload_cmds \ +-old_postinstall_cmds \ +-old_postuninstall_cmds \ +-old_archive_cmds \ +-extract_expsyms_cmds \ +-old_archive_from_new_cmds \ +-old_archive_from_expsyms_cmds \ +-archive_cmds \ +-archive_expsym_cmds \ +-module_cmds \ +-module_expsym_cmds \ +-export_symbols_cmds \ +-prelink_cmds \ +-postlink_cmds \ +-postinstall_cmds \ +-postuninstall_cmds \ +-finish_cmds \ +-sys_lib_search_path_spec \ +-sys_lib_dlsearch_path_spec \ +-reload_cmds_CXX \ +-old_archive_cmds_CXX \ +-old_archive_from_new_cmds_CXX \ +-old_archive_from_expsyms_cmds_CXX \ +-archive_cmds_CXX \ +-archive_expsym_cmds_CXX \ +-module_cmds_CXX \ +-module_expsym_cmds_CXX \ +-export_symbols_cmds_CXX \ +-prelink_cmds_CXX \ +-postlink_cmds_CXX; do +- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in +- *[\\\\\\\`\\"\\\$]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" +- ;; +- *) +- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" +- ;; +- esac +-done +- +-ac_aux_dir='$ac_aux_dir' +-xsi_shell='$xsi_shell' +-lt_shell_append='$lt_shell_append' +- +-# See if we are running on zsh, and set the options which allow our +-# commands through without removal of \ escapes INIT. +-if test -n "\${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +-fi +- +- +- PACKAGE='$PACKAGE' +- VERSION='$VERSION' +- TIMESTAMP='$TIMESTAMP' +- RM='$RM' +- ofile='$ofile' +- +- +- +- +- +- +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- +-# Handling of arguments. +-for ac_config_target in $ac_config_targets +-do +- case $ac_config_target in +- "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; +- "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; +- "mpn/$tmp_fn.$tmp_ext") CONFIG_LINKS="$CONFIG_LINKS mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext" ;; +- "gmp-mparam.h") CONFIG_LINKS="$CONFIG_LINKS gmp-mparam.h:mpn/$gmp_mparam_dir/gmp-mparam.h" ;; +- "demos/pexpr-config.h") CONFIG_FILES="$CONFIG_FILES demos/pexpr-config.h:demos/pexpr-config-h.in" ;; +- "demos/calc/calc-config.h") CONFIG_FILES="$CONFIG_FILES demos/calc/calc-config.h:demos/calc/calc-config-h.in" ;; +- "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; +- "mpf/Makefile") CONFIG_FILES="$CONFIG_FILES mpf/Makefile" ;; +- "mpn/Makefile") CONFIG_FILES="$CONFIG_FILES mpn/Makefile" ;; +- "mpq/Makefile") CONFIG_FILES="$CONFIG_FILES mpq/Makefile" ;; +- "mpz/Makefile") CONFIG_FILES="$CONFIG_FILES mpz/Makefile" ;; +- "printf/Makefile") CONFIG_FILES="$CONFIG_FILES printf/Makefile" ;; +- "scanf/Makefile") CONFIG_FILES="$CONFIG_FILES scanf/Makefile" ;; +- "rand/Makefile") CONFIG_FILES="$CONFIG_FILES rand/Makefile" ;; +- "cxx/Makefile") CONFIG_FILES="$CONFIG_FILES cxx/Makefile" ;; +- "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; +- "tests/devel/Makefile") CONFIG_FILES="$CONFIG_FILES tests/devel/Makefile" ;; +- "tests/mpf/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpf/Makefile" ;; +- "tests/mpn/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpn/Makefile" ;; +- "tests/mpq/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpq/Makefile" ;; +- "tests/mpz/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpz/Makefile" ;; +- "tests/rand/Makefile") CONFIG_FILES="$CONFIG_FILES tests/rand/Makefile" ;; +- "tests/misc/Makefile") CONFIG_FILES="$CONFIG_FILES tests/misc/Makefile" ;; +- "tests/cxx/Makefile") CONFIG_FILES="$CONFIG_FILES tests/cxx/Makefile" ;; +- "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; +- "tune/Makefile") CONFIG_FILES="$CONFIG_FILES tune/Makefile" ;; +- "demos/Makefile") CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;; +- "demos/calc/Makefile") CONFIG_FILES="$CONFIG_FILES demos/calc/Makefile" ;; +- "demos/expr/Makefile") CONFIG_FILES="$CONFIG_FILES demos/expr/Makefile" ;; +- "gmp.h") CONFIG_FILES="$CONFIG_FILES gmp.h:gmp-h.in" ;; +- +- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; +- esac +-done +- +- +-# If the user did not use the arguments to specify the items to instantiate, +-# then the envvar interface is used. Set only those that are not. +-# We use the long form for the default assignment because of an extremely +-# bizarre bug on SunOS 4.1.3. +-if $ac_need_defaults; then +- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +- test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links +- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +-fi +- +-# Have a temporary directory for convenience. Make it in the build tree +-# simply because there is no reason against having it here, and in addition, +-# creating and moving files from /tmp can sometimes cause problems. +-# Hook for its removal unless debugging. +-# Note that there is a small window in which the directory will not be cleaned: +-# after its creation but before its name has been assigned to `$tmp'. +-$debug || +-{ +- tmp= ac_tmp= +- trap 'exit_status=$? +- : "${ac_tmp:=$tmp}" +- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +-' 0 +- trap 'as_fn_exit 1' 1 2 13 15 +-} +-# Create a (secure) tmp directory for tmp files. +- +-{ +- tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && +- test -d "$tmp" +-} || +-{ +- tmp=./conf$$-$RANDOM +- (umask 077 && mkdir "$tmp") +-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +-ac_tmp=$tmp +- +-# Set up the scripts for CONFIG_FILES section. +-# No need to generate them if there are no CONFIG_FILES. +-# This happens for instance with `./config.status config.h'. +-if test -n "$CONFIG_FILES"; then +- +- +-ac_cr=`echo X | tr X '\015'` +-# On cygwin, bash can eat \r inside `` if the user requested igncr. +-# But we know of no other shell where ac_cr would be empty at this +-# point, so we can use a bashism as a fallback. +-if test "x$ac_cr" = x; then +- eval ac_cr=\$\'\\r\' +-fi +-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then +- ac_cs_awk_cr='\\r' +-else +- ac_cs_awk_cr=$ac_cr +-fi +- +-echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +-_ACEOF +- +- +-{ +- echo "cat >conf$$subs.awk <<_ACEOF" && +- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && +- echo "_ACEOF" +-} >conf$$subs.sh || +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +-ac_delim='%!_!# ' +-for ac_last_try in false false false false false :; do +- . ./conf$$subs.sh || +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +- +- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` +- if test $ac_delim_n = $ac_delim_num; then +- break +- elif $ac_last_try; then +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +- else +- ac_delim="$ac_delim!$ac_delim _$ac_delim!! " +- fi +-done +-rm -f conf$$subs.sh +- +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +-_ACEOF +-sed -n ' +-h +-s/^/S["/; s/!.*/"]=/ +-p +-g +-s/^[^!]*!// +-:repl +-t repl +-s/'"$ac_delim"'$// +-t delim +-:nl +-h +-s/\(.\{148\}\)..*/\1/ +-t more1 +-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +-p +-n +-b repl +-:more1 +-s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +-p +-g +-s/.\{148\}// +-t nl +-:delim +-h +-s/\(.\{148\}\)..*/\1/ +-t more2 +-s/["\\]/\\&/g; s/^/"/; s/$/"/ +-p +-b +-:more2 +-s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +-p +-g +-s/.\{148\}// +-t delim +-' >$CONFIG_STATUS || ac_write_fail=1 +-rm -f conf$$subs.awk +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-_ACAWK +-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +- for (key in S) S_is_set[key] = 1 +- FS = "" +- +-} +-{ +- line = $ 0 +- nfields = split(line, field, "@") +- substed = 0 +- len = length(field[1]) +- for (i = 2; i < nfields; i++) { +- key = field[i] +- keylen = length(key) +- if (S_is_set[key]) { +- value = S[key] +- line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) +- len += length(value) + length(field[++i]) +- substed = 1 +- } else +- len += 1 + keylen +- } +- +- print line +-} +- +-_ACAWK +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then +- sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +-else +- cat +-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ +- || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +-_ACEOF +- +-# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +-# trailing colons and then remove the whole line if VPATH becomes empty +-# (actually we leave an empty line to preserve line numbers). +-if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +-h +-s/// +-s/^/:/ +-s/[ ]*$/:/ +-s/:\$(srcdir):/:/g +-s/:\${srcdir}:/:/g +-s/:@srcdir@:/:/g +-s/^:*// +-s/:*$// +-x +-s/\(=[ ]*\).*/\1/ +-G +-s/\n// +-s/^[^=]*=[ ]*$// +-}' +-fi +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-fi # test -n "$CONFIG_FILES" +- +-# Set up the scripts for CONFIG_HEADERS section. +-# No need to generate them if there are no CONFIG_HEADERS. +-# This happens for instance with `./config.status Makefile'. +-if test -n "$CONFIG_HEADERS"; then +-cat >"$ac_tmp/defines.awk" <<\_ACAWK || +-BEGIN { +-_ACEOF +- +-# Transform confdefs.h into an awk script `defines.awk', embedded as +-# here-document in config.status, that substitutes the proper values into +-# config.h.in to produce config.h. +- +-# Create a delimiter string that does not exist in confdefs.h, to ease +-# handling of long lines. +-ac_delim='%!_!# ' +-for ac_last_try in false false :; do +- ac_tt=`sed -n "/$ac_delim/p" confdefs.h` +- if test -z "$ac_tt"; then +- break +- elif $ac_last_try; then +- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 +- else +- ac_delim="$ac_delim!$ac_delim _$ac_delim!! " +- fi +-done +- +-# For the awk script, D is an array of macro values keyed by name, +-# likewise P contains macro parameters if any. Preserve backslash +-# newline sequences. +- +-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +-sed -n ' +-s/.\{148\}/&'"$ac_delim"'/g +-t rset +-:rset +-s/^[ ]*#[ ]*define[ ][ ]*/ / +-t def +-d +-:def +-s/\\$// +-t bsnl +-s/["\\]/\\&/g +-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +-D["\1"]=" \3"/p +-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +-d +-:bsnl +-s/["\\]/\\&/g +-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +-D["\1"]=" \3\\\\\\n"\\/p +-t cont +-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +-t cont +-d +-:cont +-n +-s/.\{148\}/&'"$ac_delim"'/g +-t clear +-:clear +-s/\\$// +-t bsnlc +-s/["\\]/\\&/g; s/^/"/; s/$/"/p +-d +-:bsnlc +-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +-b cont +-' >$CONFIG_STATUS || ac_write_fail=1 +- +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +- for (key in D) D_is_set[key] = 1 +- FS = "" +-} +-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { +- line = \$ 0 +- split(line, arg, " ") +- if (arg[1] == "#") { +- defundef = arg[2] +- mac1 = arg[3] +- } else { +- defundef = substr(arg[1], 2) +- mac1 = arg[2] +- } +- split(mac1, mac2, "(") #) +- macro = mac2[1] +- prefix = substr(line, 1, index(line, defundef) - 1) +- if (D_is_set[macro]) { +- # Preserve the white space surrounding the "#". +- print prefix "define", macro P[macro] D[macro] +- next +- } else { +- # Replace #undef with comments. This is necessary, for example, +- # in the case of _POSIX_SOURCE, which is predefined and required +- # on some systems where configure will not decide to define it. +- if (defundef == "undef") { +- print "/*", prefix defundef, macro, "*/" +- next +- } +- } +-} +-{ print } +-_ACAWK +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +-fi # test -n "$CONFIG_HEADERS" +- +- +-eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" +-shift +-for ac_tag +-do +- case $ac_tag in +- :[FHLC]) ac_mode=$ac_tag; continue;; +- esac +- case $ac_mode$ac_tag in +- :[FHL]*:*);; +- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; +- :[FH]-) ac_tag=-:-;; +- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; +- esac +- ac_save_IFS=$IFS +- IFS=: +- set x $ac_tag +- IFS=$ac_save_IFS +- shift +- ac_file=$1 +- shift +- +- case $ac_mode in +- :L) ac_source=$1;; +- :[FH]) +- ac_file_inputs= +- for ac_f +- do +- case $ac_f in +- -) ac_f="$ac_tmp/stdin";; +- *) # Look for the file first in the build tree, then in the source tree +- # (if the path is not absolute). The absolute path cannot be DOS-style, +- # because $ac_f cannot contain `:'. +- test -f "$ac_f" || +- case $ac_f in +- [\\/$]*) false;; +- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; +- esac || +- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; +- esac +- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac +- as_fn_append ac_file_inputs " '$ac_f'" +- done +- +- # Let's still pretend it is `configure' which instantiates (i.e., don't +- # use $as_me), people would be surprised to read: +- # /* config.h. Generated by config.status. */ +- configure_input='Generated from '` +- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' +- `' by configure.' +- if test x"$ac_file" != x-; then +- configure_input="$ac_file. $configure_input" +- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +-$as_echo "$as_me: creating $ac_file" >&6;} +- fi +- # Neutralize special characters interpreted by sed in replacement strings. +- case $configure_input in #( +- *\&* | *\|* | *\\* ) +- ac_sed_conf_input=`$as_echo "$configure_input" | +- sed 's/[\\\\&|]/\\\\&/g'`;; #( +- *) ac_sed_conf_input=$configure_input;; +- esac +- +- case $ac_tag in +- *:-:* | *:-) cat >"$ac_tmp/stdin" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; +- esac +- ;; +- esac +- +- ac_dir=`$as_dirname -- "$ac_file" || +-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_file" : 'X\(//\)[^/]' \| \ +- X"$ac_file" : 'X\(//\)$' \| \ +- X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$ac_file" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- as_dir="$ac_dir"; as_fn_mkdir_p +- ac_builddir=. +- +-case "$ac_dir" in +-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +-*) +- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` +- # A ".." for each directory in $ac_dir_suffix. +- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` +- case $ac_top_builddir_sub in +- "") ac_top_builddir_sub=. ac_top_build_prefix= ;; +- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; +- esac ;; +-esac +-ac_abs_top_builddir=$ac_pwd +-ac_abs_builddir=$ac_pwd$ac_dir_suffix +-# for backward compatibility: +-ac_top_builddir=$ac_top_build_prefix +- +-case $srcdir in +- .) # We are building in place. +- ac_srcdir=. +- ac_top_srcdir=$ac_top_builddir_sub +- ac_abs_top_srcdir=$ac_pwd ;; +- [\\/]* | ?:[\\/]* ) # Absolute name. +- ac_srcdir=$srcdir$ac_dir_suffix; +- ac_top_srcdir=$srcdir +- ac_abs_top_srcdir=$srcdir ;; +- *) # Relative name. +- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix +- ac_top_srcdir=$ac_top_build_prefix$srcdir +- ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +-esac +-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix +- +- +- case $ac_mode in +- :F) +- # +- # CONFIG_FILE +- # +- +- case $INSTALL in +- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; +- *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; +- esac +- ac_MKDIR_P=$MKDIR_P +- case $MKDIR_P in +- [\\/$]* | ?:[\\/]* ) ;; +- */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; +- esac +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-# If the template does not know about datarootdir, expand it. +-# FIXME: This hack should be removed a few years after 2.60. +-ac_datarootdir_hack=; ac_datarootdir_seen= +-ac_sed_dataroot=' +-/datarootdir/ { +- p +- q +-} +-/@datadir@/p +-/@docdir@/p +-/@infodir@/p +-/@localedir@/p +-/@mandir@/p' +-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +-*datarootdir*) ac_datarootdir_seen=yes;; +-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +- ac_datarootdir_hack=' +- s&@datadir@&$datadir&g +- s&@docdir@&$docdir&g +- s&@infodir@&$infodir&g +- s&@localedir@&$localedir&g +- s&@mandir@&$mandir&g +- s&\\\${datarootdir}&$datarootdir&g' ;; +-esac +-_ACEOF +- +-# Neutralize VPATH when `$srcdir' = `.'. +-# Shell code in configure.ac might set extrasub. +-# FIXME: do we really want to maintain this feature? +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-ac_sed_extra="$ac_vpsub +-$extrasub +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-:t +-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +-s|@configure_input@|$ac_sed_conf_input|;t t +-s&@top_builddir@&$ac_top_builddir_sub&;t t +-s&@top_build_prefix@&$ac_top_build_prefix&;t t +-s&@srcdir@&$ac_srcdir&;t t +-s&@abs_srcdir@&$ac_abs_srcdir&;t t +-s&@top_srcdir@&$ac_top_srcdir&;t t +-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +-s&@builddir@&$ac_builddir&;t t +-s&@abs_builddir@&$ac_abs_builddir&;t t +-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +-s&@INSTALL@&$ac_INSTALL&;t t +-s&@MKDIR_P@&$ac_MKDIR_P&;t t +-$ac_datarootdir_hack +-" +-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ +- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- +-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && +- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && +- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ +- "$ac_tmp/out"`; test -z "$ac_out"; } && +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined" >&5 +-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined" >&2;} +- +- rm -f "$ac_tmp/stdin" +- case $ac_file in +- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; +- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; +- esac \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- ;; +- :H) +- # +- # CONFIG_HEADER +- # +- if test x"$ac_file" != x-; then +- { +- $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" +- } >"$ac_tmp/config.h" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +-$as_echo "$as_me: $ac_file is unchanged" >&6;} +- else +- rm -f "$ac_file" +- mv "$ac_tmp/config.h" "$ac_file" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- fi +- else +- $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ +- || as_fn_error $? "could not create -" "$LINENO" 5 +- fi +-# Compute "$ac_file"'s index in $config_headers. +-_am_arg="$ac_file" +-_am_stamp_count=1 +-for _am_header in $config_headers :; do +- case $_am_header in +- $_am_arg | $_am_arg:* ) +- break ;; +- * ) +- _am_stamp_count=`expr $_am_stamp_count + 1` ;; +- esac +-done +-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$_am_arg" : 'X\(//\)[^/]' \| \ +- X"$_am_arg" : 'X\(//\)$' \| \ +- X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$_am_arg" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'`/stamp-h$_am_stamp_count +- ;; +- :L) +- # +- # CONFIG_LINK +- # +- +- if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then +- : +- else +- # Prefer the file from the source tree if names are identical. +- if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then +- ac_source=$srcdir/$ac_source +- fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 +-$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} +- +- if test ! -r "$ac_source"; then +- as_fn_error $? "$ac_source: file not found" "$LINENO" 5 +- fi +- rm -f "$ac_file" +- +- # Try a relative symlink, then a hard link, then a copy. +- case $ac_source in +- [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; +- *) ac_rel_source=$ac_top_build_prefix$ac_source ;; +- esac +- ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || +- ln "$ac_source" "$ac_file" 2>/dev/null || +- cp -p "$ac_source" "$ac_file" || +- as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 +- fi +- ;; +- :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +-$as_echo "$as_me: executing $ac_file commands" >&6;} +- ;; +- esac +- +- +- case $ac_file$ac_mode in +- "libtool":C) +- +- # See if we are running on zsh, and set the options which allow our +- # commands through without removal of \ escapes. +- if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +- fi +- +- cfgfile="${ofile}T" +- trap "$RM \"$cfgfile\"; exit 1" 1 2 15 +- $RM "$cfgfile" +- +- cat <<_LT_EOF >> "$cfgfile" +-#! $SHELL +- +-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +-# NOTE: Changes made to this file will be lost: look at ltmain.sh. +-# +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +-# Foundation, Inc. +-# Written by Gordon Matzigkeit, 1996 +-# +-# This file is part of GNU Libtool. +-# +-# GNU Libtool 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 of +-# the License, or (at your option) any later version. +-# +-# As a special exception to the GNU General Public License, +-# if you distribute this file as part of a program or library that +-# is built using GNU Libtool, you may include this file under the +-# same distribution terms that you use for the rest of that program. +-# +-# GNU Libtool 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 Libtool; see the file COPYING. If not, a copy +-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +-# obtained by writing to the Free Software Foundation, Inc., +-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +- +- +-# The names of the tagged configurations supported by this script. +-available_tags="CXX " +- +-# ### BEGIN LIBTOOL CONFIG +- +-# A BSD- or MS-compatible name lister. +-NM=$lt_NM +- +-# Assembler program. +-AS=$lt_AS +- +-# DLL creation program. +-DLLTOOL=$lt_DLLTOOL +- +-# Object dumper program. +-OBJDUMP=$lt_OBJDUMP +- +-# Which release of libtool.m4 was used? +-macro_version=$macro_version +-macro_revision=$macro_revision +- +-# Whether or not to build shared libraries. +-build_libtool_libs=$enable_shared +- +-# Whether or not to build static libraries. +-build_old_libs=$enable_static +- +-# What type of objects to build. +-pic_mode=$pic_mode +- +-# Whether or not to optimize for fast installation. +-fast_install=$enable_fast_install +- +-# Shell to use when invoking shell scripts. +-SHELL=$lt_SHELL +- +-# An echo program that protects backslashes. +-ECHO=$lt_ECHO +- +-# The PATH separator for the build system. +-PATH_SEPARATOR=$lt_PATH_SEPARATOR +- +-# The host system. +-host_alias=$host_alias +-host=$host +-host_os=$host_os +- +-# The build system. +-build_alias=$build_alias +-build=$build +-build_os=$build_os +- +-# A sed program that does not truncate output. +-SED=$lt_SED +- +-# Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="\$SED -e 1s/^X//" +- +-# A grep program that handles long lines. +-GREP=$lt_GREP +- +-# An ERE matcher. +-EGREP=$lt_EGREP +- +-# A literal string matcher. +-FGREP=$lt_FGREP +- +-# Whether we need soft or hard links. +-LN_S=$lt_LN_S +- +-# What is the maximum length of a command? +-max_cmd_len=$max_cmd_len +- +-# Object file suffix (normally "o"). +-objext=$ac_objext +- +-# Executable file suffix (normally ""). +-exeext=$exeext +- +-# whether the shell understands "unset". +-lt_unset=$lt_unset +- +-# turn spaces into newlines. +-SP2NL=$lt_lt_SP2NL +- +-# turn newlines into spaces. +-NL2SP=$lt_lt_NL2SP +- +-# convert \$build file names to \$host format. +-to_host_file_cmd=$lt_cv_to_host_file_cmd +- +-# convert \$build files to toolchain format. +-to_tool_file_cmd=$lt_cv_to_tool_file_cmd +- +-# Method to check whether dependent libraries are shared objects. +-deplibs_check_method=$lt_deplibs_check_method +- +-# Command to use when deplibs_check_method = "file_magic". +-file_magic_cmd=$lt_file_magic_cmd +- +-# How to find potential files when deplibs_check_method = "file_magic". +-file_magic_glob=$lt_file_magic_glob +- +-# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +-want_nocaseglob=$lt_want_nocaseglob +- +-# Command to associate shared and link libraries. +-sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd +- +-# The archiver. +-AR=$lt_AR +- +-# Flags to create an archive. +-AR_FLAGS=$lt_AR_FLAGS +- +-# How to feed a file listing to the archiver. +-archiver_list_spec=$lt_archiver_list_spec +- +-# A symbol stripping program. +-STRIP=$lt_STRIP +- +-# Commands used to install an old-style archive. +-RANLIB=$lt_RANLIB +-old_postinstall_cmds=$lt_old_postinstall_cmds +-old_postuninstall_cmds=$lt_old_postuninstall_cmds +- +-# Whether to use a lock for old archive extraction. +-lock_old_archive_extraction=$lock_old_archive_extraction +- +-# A C compiler. +-LTCC=$lt_CC +- +-# LTCC compiler flags. +-LTCFLAGS=$lt_CFLAGS +- +-# Take the output of nm and produce a listing of raw symbols and C names. +-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe +- +-# Transform the output of nm in a proper C declaration. +-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +- +-# Transform the output of nm in a C name address pair. +-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address +- +-# Transform the output of nm in a C name address pair when lib prefix is needed. +-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix +- +-# Specify filename containing input files for \$NM. +-nm_file_list_spec=$lt_nm_file_list_spec +- +-# The root where to search for dependent libraries,and in which our libraries should be installed. +-lt_sysroot=$lt_sysroot +- +-# The name of the directory that contains temporary libtool files. +-objdir=$objdir +- +-# Used to examine libraries when file_magic_cmd begins with "file". +-MAGIC_CMD=$MAGIC_CMD +- +-# Must we lock files when doing compilation? +-need_locks=$lt_need_locks +- +-# Manifest tool. +-MANIFEST_TOOL=$lt_MANIFEST_TOOL +- +-# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +-DSYMUTIL=$lt_DSYMUTIL +- +-# Tool to change global to local symbols on Mac OS X. +-NMEDIT=$lt_NMEDIT +- +-# Tool to manipulate fat objects and archives on Mac OS X. +-LIPO=$lt_LIPO +- +-# ldd/readelf like tool for Mach-O binaries on Mac OS X. +-OTOOL=$lt_OTOOL +- +-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +-OTOOL64=$lt_OTOOL64 +- +-# Old archive suffix (normally "a"). +-libext=$libext +- +-# Shared library suffix (normally ".so"). +-shrext_cmds=$lt_shrext_cmds +- +-# The commands to extract the exported symbol list from a shared archive. +-extract_expsyms_cmds=$lt_extract_expsyms_cmds +- +-# Variables whose values should be saved in libtool wrapper scripts and +-# restored at link time. +-variables_saved_for_relink=$lt_variables_saved_for_relink +- +-# Do we need the "lib" prefix for modules? +-need_lib_prefix=$need_lib_prefix +- +-# Do we need a version for libraries? +-need_version=$need_version +- +-# Library versioning type. +-version_type=$version_type +- +-# Shared library runtime path variable. +-runpath_var=$runpath_var +- +-# Shared library path variable. +-shlibpath_var=$shlibpath_var +- +-# Is shlibpath searched before the hard-coded library search path? +-shlibpath_overrides_runpath=$shlibpath_overrides_runpath +- +-# Format of library name prefix. +-libname_spec=$lt_libname_spec +- +-# List of archive names. First name is the real one, the rest are links. +-# The last name is the one that the linker finds with -lNAME +-library_names_spec=$lt_library_names_spec +- +-# The coded name of the library, if different from the real name. +-soname_spec=$lt_soname_spec +- +-# Permission mode override for installation of shared libraries. +-install_override_mode=$lt_install_override_mode +- +-# Command to use after installation of a shared archive. +-postinstall_cmds=$lt_postinstall_cmds +- +-# Command to use after uninstallation of a shared archive. +-postuninstall_cmds=$lt_postuninstall_cmds +- +-# Commands used to finish a libtool library installation in a directory. +-finish_cmds=$lt_finish_cmds +- +-# As "finish_cmds", except a single script fragment to be evaled but +-# not shown. +-finish_eval=$lt_finish_eval +- +-# Whether we should hardcode library paths into libraries. +-hardcode_into_libs=$hardcode_into_libs +- +-# Compile-time system search path for libraries. +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec +- +-# Run-time system search path for libraries. +-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +- +-# Whether dlopen is supported. +-dlopen_support=$enable_dlopen +- +-# Whether dlopen of programs is supported. +-dlopen_self=$enable_dlopen_self +- +-# Whether dlopen of statically linked programs is supported. +-dlopen_self_static=$enable_dlopen_self_static +- +-# Commands to strip libraries. +-old_striplib=$lt_old_striplib +-striplib=$lt_striplib +- +- +-# The linker used to build libraries. +-LD=$lt_LD +- +-# How to create reloadable object files. +-reload_flag=$lt_reload_flag +-reload_cmds=$lt_reload_cmds +- +-# Commands used to build an old-style archive. +-old_archive_cmds=$lt_old_archive_cmds +- +-# A language specific compiler. +-CC=$lt_compiler +- +-# Is the compiler the GNU compiler? +-with_gcc=$GCC +- +-# Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag +- +-# Additional compiler flags for building library objects. +-pic_flag=$lt_lt_prog_compiler_pic +- +-# How to pass a linker flag through the compiler. +-wl=$lt_lt_prog_compiler_wl +- +-# Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_lt_prog_compiler_static +- +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_lt_cv_prog_compiler_c_o +- +-# Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$archive_cmds_need_lc +- +-# Whether or not to disallow shared libs when runtime libs are static. +-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes +- +-# Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec +- +-# Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec +- +-# Whether the compiler copes with passing no objects directly. +-compiler_needs_object=$lt_compiler_needs_object +- +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds +- +-# Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds +- +-# Commands used to build a shared archive. +-archive_cmds=$lt_archive_cmds +-archive_expsym_cmds=$lt_archive_expsym_cmds +- +-# Commands used to build a loadable module if different from building +-# a shared archive. +-module_cmds=$lt_module_cmds +-module_expsym_cmds=$lt_module_expsym_cmds +- +-# Whether we are building with GNU ld or not. +-with_gnu_ld=$lt_with_gnu_ld +- +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag +- +-# Flag that enforces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag +- +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec +- +-# Whether we need a single "-rpath" flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary. +-hardcode_direct=$hardcode_direct +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary and the resulting library dependency is +-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +-# library is relocated. +-hardcode_direct_absolute=$hardcode_direct_absolute +- +-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +-# into the resulting binary. +-hardcode_minus_L=$hardcode_minus_L +- +-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +-# into the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var +- +-# Set to "yes" if building a shared library automatically hardcodes DIR +-# into the library and all subsequent libraries and executables linked +-# against it. +-hardcode_automatic=$hardcode_automatic +- +-# Set to yes if linker adds runtime paths of dependent libraries +-# to runtime path list. +-inherit_rpath=$inherit_rpath +- +-# Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs +- +-# Set to "yes" if exported symbols are required. +-always_export_symbols=$always_export_symbols +- +-# The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds +- +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms +- +-# Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms +- +-# Commands necessary for linking programs (against libraries) with templates. +-prelink_cmds=$lt_prelink_cmds +- +-# Commands necessary for finishing linking programs. +-postlink_cmds=$lt_postlink_cmds +- +-# Specify filename containing input files. +-file_list_spec=$lt_file_list_spec +- +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action +- +-# The directories searched by this compiler when creating a shared library. +-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs +- +-# Dependencies to place before and after the objects being linked to +-# create a shared library. +-predep_objects=$lt_predep_objects +-postdep_objects=$lt_postdep_objects +-predeps=$lt_predeps +-postdeps=$lt_postdeps +- +-# The library search path used internally by the compiler when linking +-# a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path +- +-# ### END LIBTOOL CONFIG +- +-_LT_EOF +- +- case $host_os in +- aix3*) +- cat <<\_LT_EOF >> "$cfgfile" +-# AIX sometimes has problems with the GCC collect2 program. For some +-# reason, if we set the COLLECT_NAMES environment variable, the problems +-# vanish in a puff of smoke. +-if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +-fi +-_LT_EOF +- ;; +- esac +- +- +-ltmain="$ac_aux_dir/ltmain.sh" +- +- +- # We use sed instead of cat because bash on DJGPP gets confused if +- # if finds mixed CR/LF and LF-only lines. Since sed operates in +- # text mode, it properly converts lines to CR/LF. This bash problem +- # is reportedly fixed, but why not run on old versions too? +- sed '$q' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- if test x"$xsi_shell" = xyes; then +- sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +-func_dirname ()\ +-{\ +-\ case ${1} in\ +-\ */*) func_dirname_result="${1%/*}${2}" ;;\ +-\ * ) func_dirname_result="${3}" ;;\ +-\ esac\ +-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_basename ()$/,/^} # func_basename /c\ +-func_basename ()\ +-{\ +-\ func_basename_result="${1##*/}"\ +-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +-func_dirname_and_basename ()\ +-{\ +-\ case ${1} in\ +-\ */*) func_dirname_result="${1%/*}${2}" ;;\ +-\ * ) func_dirname_result="${3}" ;;\ +-\ esac\ +-\ func_basename_result="${1##*/}"\ +-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +-func_stripname ()\ +-{\ +-\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +-\ # positional parameters, so assign one to ordinary parameter first.\ +-\ func_stripname_result=${3}\ +-\ func_stripname_result=${func_stripname_result#"${1}"}\ +-\ func_stripname_result=${func_stripname_result%"${2}"}\ +-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +-func_split_long_opt ()\ +-{\ +-\ func_split_long_opt_name=${1%%=*}\ +-\ func_split_long_opt_arg=${1#*=}\ +-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +-func_split_short_opt ()\ +-{\ +-\ func_split_short_opt_arg=${1#??}\ +-\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +-func_lo2o ()\ +-{\ +-\ case ${1} in\ +-\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +-\ *) func_lo2o_result=${1} ;;\ +-\ esac\ +-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_xform ()$/,/^} # func_xform /c\ +-func_xform ()\ +-{\ +- func_xform_result=${1%.*}.lo\ +-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_arith ()$/,/^} # func_arith /c\ +-func_arith ()\ +-{\ +- func_arith_result=$(( $* ))\ +-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_len ()$/,/^} # func_len /c\ +-func_len ()\ +-{\ +- func_len_result=${#1}\ +-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +-fi +- +-if test x"$lt_shell_append" = xyes; then +- sed -e '/^func_append ()$/,/^} # func_append /c\ +-func_append ()\ +-{\ +- eval "${1}+=\\${2}"\ +-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +-func_append_quoted ()\ +-{\ +-\ func_quote_for_eval "${2}"\ +-\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- # Save a `func_append' function call where possible by direct use of '+=' +- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +- test 0 -eq $? || _lt_function_replace_fail=: +-else +- # Save a `func_append' function call even when '+=' is not available +- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +- test 0 -eq $? || _lt_function_replace_fail=: +-fi +- +-if test x"$_lt_function_replace_fail" = x":"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +-fi +- +- +- mv -f "$cfgfile" "$ofile" || +- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") +- chmod +x "$ofile" +- +- +- cat <<_LT_EOF >> "$ofile" +- +-# ### BEGIN LIBTOOL TAG CONFIG: CXX +- +-# The linker used to build libraries. +-LD=$lt_LD_CXX +- +-# How to create reloadable object files. +-reload_flag=$lt_reload_flag_CXX +-reload_cmds=$lt_reload_cmds_CXX +- +-# Commands used to build an old-style archive. +-old_archive_cmds=$lt_old_archive_cmds_CXX +- +-# A language specific compiler. +-CC=$lt_compiler_CXX +- +-# Is the compiler the GNU compiler? +-with_gcc=$GCC_CXX +- +-# Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX +- +-# Additional compiler flags for building library objects. +-pic_flag=$lt_lt_prog_compiler_pic_CXX +- +-# How to pass a linker flag through the compiler. +-wl=$lt_lt_prog_compiler_wl_CXX +- +-# Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_lt_prog_compiler_static_CXX +- +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX +- +-# Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$archive_cmds_need_lc_CXX +- +-# Whether or not to disallow shared libs when runtime libs are static. +-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX +- +-# Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX +- +-# Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX +- +-# Whether the compiler copes with passing no objects directly. +-compiler_needs_object=$lt_compiler_needs_object_CXX +- +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX +- +-# Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX +- +-# Commands used to build a shared archive. +-archive_cmds=$lt_archive_cmds_CXX +-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +- +-# Commands used to build a loadable module if different from building +-# a shared archive. +-module_cmds=$lt_module_cmds_CXX +-module_expsym_cmds=$lt_module_expsym_cmds_CXX +- +-# Whether we are building with GNU ld or not. +-with_gnu_ld=$lt_with_gnu_ld_CXX +- +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag_CXX +- +-# Flag that enforces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag_CXX +- +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX +- +-# Whether we need a single "-rpath" flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary. +-hardcode_direct=$hardcode_direct_CXX +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary and the resulting library dependency is +-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +-# library is relocated. +-hardcode_direct_absolute=$hardcode_direct_absolute_CXX +- +-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +-# into the resulting binary. +-hardcode_minus_L=$hardcode_minus_L_CXX +- +-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +-# into the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX +- +-# Set to "yes" if building a shared library automatically hardcodes DIR +-# into the library and all subsequent libraries and executables linked +-# against it. +-hardcode_automatic=$hardcode_automatic_CXX +- +-# Set to yes if linker adds runtime paths of dependent libraries +-# to runtime path list. +-inherit_rpath=$inherit_rpath_CXX +- +-# Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs_CXX +- +-# Set to "yes" if exported symbols are required. +-always_export_symbols=$always_export_symbols_CXX +- +-# The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds_CXX +- +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms_CXX +- +-# Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms_CXX +- +-# Commands necessary for linking programs (against libraries) with templates. +-prelink_cmds=$lt_prelink_cmds_CXX +- +-# Commands necessary for finishing linking programs. +-postlink_cmds=$lt_postlink_cmds_CXX +- +-# Specify filename containing input files. +-file_list_spec=$lt_file_list_spec_CXX +- +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action_CXX +- +-# The directories searched by this compiler when creating a shared library. +-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX +- +-# Dependencies to place before and after the objects being linked to +-# create a shared library. +-predep_objects=$lt_predep_objects_CXX +-postdep_objects=$lt_postdep_objects_CXX +-predeps=$lt_predeps_CXX +-postdeps=$lt_postdeps_CXX +- +-# The library search path used internally by the compiler when linking +-# a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX +- +-# ### END LIBTOOL TAG CONFIG: CXX +-_LT_EOF +- +- ;; +- +- esac +-done # for ac_tag +- +- +-as_fn_exit 0 +-_ACEOF +-ac_clean_files=$ac_clean_files_save +- +-test $ac_write_fail = 0 || +- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 +- +- +-# configure is writing to config.log, and then calls config.status. +-# config.status does its own redirection, appending to config.log. +-# Unfortunately, on DOS this fails, as config.log is still kept open +-# by configure, so config.status won't be able to write to it; its +-# output is simply discarded. So we exec the FD to /dev/null, +-# effectively closing config.log, so it can be properly (re)opened and +-# appended to by config.status. When coming back to configure, we +-# need to make the FD available again. +-if test "$no_create" != yes; then +- ac_cs_success=: +- ac_config_status_args= +- test "$silent" = yes && +- ac_config_status_args="$ac_config_status_args --quiet" +- exec 5>/dev/null +- $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false +- exec 5>>config.log +- # Use ||, not &&, to avoid exiting from the if with $? = 1, which +- # would make configure fail if this is the last instruction. +- $ac_cs_success || as_fn_exit 1 +-fi +-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: summary of build options: +- +- Version: ${PACKAGE_STRING} +- Host type: ${host} +- ABI: ${ABI} +- Install prefix: ${prefix} +- Compiler: ${CC} +- Static libraries: ${enable_static} +- Shared libraries: ${enable_shared} +-" >&5 +-$as_echo "$as_me: summary of build options: +- +- Version: ${PACKAGE_STRING} +- Host type: ${host} +- ABI: ${ABI} +- Install prefix: ${prefix} +- Compiler: ${CC} +- Static libraries: ${enable_static} +- Shared libraries: ${enable_shared} +-" >&6;} +- +-if test x$cross_compiling = xyes ; then +- case "$host" in +- *-*-mingw* | *-*-cygwin) +- if test x$ABI = x64 ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: If wine64 is installed, use make check TESTS_ENVIRONMENT=wine64." >&5 +-$as_echo "$as_me: If wine64 is installed, use make check TESTS_ENVIRONMENT=wine64." >&6;} +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: If wine is installed, use make check TESTS_ENVIRONMENT=wine." >&5 +-$as_echo "$as_me: If wine is installed, use make check TESTS_ENVIRONMENT=wine." >&6;} +- fi +- ;; +- esac +-fi +--- gcl-2.6.12.orig/gmp4/autom4te.cache/output.1 ++++ /dev/null +@@ -1,29962 +0,0 @@ +-@%:@! /bin/sh +-@%:@ From configure.ac Revision. +-@%:@ Guess values for system-dependent variables and create Makefiles. +-@%:@ Generated by GNU Autoconf 2.69 for GNU MP 6.0.0. +-@%:@ +-@%:@ Report bugs to . +-@%:@ +-@%:@ +-@%:@ +-@%:@ Copyright 1996-2014 Free Software Foundation, Inc. +-@%:@ +-@%:@ This file is part of the GNU MP Library. +-@%:@ +-@%:@ The GNU MP Library is free software; you can redistribute it and/or modify +-@%:@ it under the terms of either: +-@%:@ +-@%:@ * the GNU Lesser General Public License as published by the Free +-@%:@ Software Foundation; either version 3 of the License, or (at your +-@%:@ option) any later version. +-@%:@ +-@%:@ or +-@%:@ +-@%:@ * the GNU General Public License as published by the Free Software +-@%:@ Foundation; either version 2 of the License, or (at your option) any +-@%:@ later version. +-@%:@ +-@%:@ or both in parallel, as here. +-@%:@ +-@%:@ The GNU MP 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 General Public License +-@%:@ for more details. +-@%:@ +-@%:@ You should have received copies of the GNU General Public License and the +-@%:@ GNU Lesser General Public License along with the GNU MP Library. If not, +-@%:@ see https://www.gnu.org/licenses/. +-@%:@ +-@%:@ +-@%:@ +-@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +-@%:@ +-@%:@ +-@%:@ This configure script is free software; the Free Software Foundation +-@%:@ gives unlimited permission to copy, distribute and modify it. +-## -------------------- ## +-## M4sh Initialization. ## +-## -------------------- ## +- +-# Be more Bourne compatible +-DUALCASE=1; export DUALCASE # for MKS sh +-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +- emulate sh +- NULLCMD=: +- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '${1+"$@"}'='"$@"' +- setopt NO_GLOB_SUBST +-else +- case `(set -o) 2>/dev/null` in @%:@( +- *posix*) : +- set -o posix ;; @%:@( +- *) : +- ;; +-esac +-fi +- +- +-as_nl=' +-' +-export as_nl +-# Printing a long string crashes Solaris 7 /usr/bin/printf. +-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +-# Prefer a ksh shell builtin over an external printf program on Solaris, +-# but without wasting forks for bash or zsh. +-if test -z "$BASH_VERSION$ZSH_VERSION" \ +- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='print -r --' +- as_echo_n='print -rn --' +-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='printf %s\n' +- as_echo_n='printf %s' +-else +- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then +- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' +- as_echo_n='/usr/ucb/echo -n' +- else +- as_echo_body='eval expr "X$1" : "X\\(.*\\)"' +- as_echo_n_body='eval +- arg=$1; +- case $arg in @%:@( +- *"$as_nl"*) +- expr "X$arg" : "X\\(.*\\)$as_nl"; +- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; +- esac; +- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" +- ' +- export as_echo_n_body +- as_echo_n='sh -c $as_echo_n_body as_echo' +- fi +- export as_echo_body +- as_echo='sh -c $as_echo_body as_echo' +-fi +- +-# The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then +- PATH_SEPARATOR=: +- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { +- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || +- PATH_SEPARATOR=';' +- } +-fi +- +- +-# IFS +-# We need space, tab and new line, in precisely that order. Quoting is +-# there to prevent editors from complaining about space-tab. +-# (If _AS_PATH_WALK were called with IFS unset, it would disable word +-# splitting by setting IFS to empty value.) +-IFS=" "" $as_nl" +- +-# Find who we are. Look in the path if we contain no directory separator. +-as_myself= +-case $0 in @%:@(( +- *[\\/]* ) as_myself=$0 ;; +- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-# We did not find ourselves, most probably we were run as `sh COMMAND' +-# in which case we are not to be found in the path. +-if test "x$as_myself" = x; then +- as_myself=$0 +-fi +-if test ! -f "$as_myself"; then +- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 +- exit 1 +-fi +- +-# Unset variables that we do not need and which cause bugs (e.g. in +-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +-# suppresses any "Segmentation fault" message there. '((' could +-# trigger a bug in pdksh 5.2.14. +-for as_var in BASH_ENV ENV MAIL MAILPATH +-do eval test x\${$as_var+set} = xset \ +- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +-done +-PS1='$ ' +-PS2='> ' +-PS4='+ ' +- +-# NLS nuisances. +-LC_ALL=C +-export LC_ALL +-LANGUAGE=C +-export LANGUAGE +- +-# CDPATH. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-# Use a proper internal environment variable to ensure we don't fall +- # into an infinite loop, continuously re-executing ourselves. +- if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then +- _as_can_reexec=no; export _as_can_reexec; +- # We cannot yet assume a decent shell, so we have to provide a +-# neutralization value for shells without unset; and this also +-# works around shells that cannot unset nonexistent variables. +-# Preserve -v and -x to the replacement shell. +-BASH_ENV=/dev/null +-ENV=/dev/null +-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +-case $- in @%:@ (((( +- *v*x* | *x*v* ) as_opts=-vx ;; +- *v* ) as_opts=-v ;; +- *x* ) as_opts=-x ;; +- * ) as_opts= ;; +-esac +-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +-# Admittedly, this is quite paranoid, since all the known shells bail +-# out after a failed `exec'. +-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +-as_fn_exit 255 +- fi +- # We don't want this to propagate to other subprocesses. +- { _as_can_reexec=; unset _as_can_reexec;} +-if test "x$CONFIG_SHELL" = x; then +- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : +- emulate sh +- NULLCMD=: +- # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '\${1+\"\$@\"}'='\"\$@\"' +- setopt NO_GLOB_SUBST +-else +- case \`(set -o) 2>/dev/null\` in @%:@( +- *posix*) : +- set -o posix ;; @%:@( +- *) : +- ;; +-esac +-fi +-" +- as_required="as_fn_return () { (exit \$1); } +-as_fn_success () { as_fn_return 0; } +-as_fn_failure () { as_fn_return 1; } +-as_fn_ret_success () { return 0; } +-as_fn_ret_failure () { return 1; } +- +-exitcode=0 +-as_fn_success || { exitcode=1; echo as_fn_success failed.; } +-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +- +-else +- exitcode=1; echo positional parameters were not saved. +-fi +-test x\$exitcode = x0 || exit 1 +-test -x / || exit 1" +- as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO +- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO +- eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && +- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +-test \$(( 1 + 1 )) = 2 || exit 1 +- +- test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( +- ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO +- ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO +- PATH=/empty FPATH=/empty; export PATH FPATH +- test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ +- || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" +- if (eval "$as_required") 2>/dev/null; then : +- as_have_required=yes +-else +- as_have_required=no +-fi +- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : +- +-else +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-as_found=false +-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- as_found=: +- case $as_dir in @%:@( +- /*) +- for as_base in sh bash ksh sh5; do +- # Try only shells that exist, to save several forks. +- as_shell=$as_dir/$as_base +- if { test -f "$as_shell" || test -f "$as_shell.exe"; } && +- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : +- CONFIG_SHELL=$as_shell as_have_required=yes +- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : +- break 2 +-fi +-fi +- done;; +- esac +- as_found=false +-done +-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && +- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : +- CONFIG_SHELL=$SHELL as_have_required=yes +-fi; } +-IFS=$as_save_IFS +- +- +- if test "x$CONFIG_SHELL" != x; then : +- export CONFIG_SHELL +- # We cannot yet assume a decent shell, so we have to provide a +-# neutralization value for shells without unset; and this also +-# works around shells that cannot unset nonexistent variables. +-# Preserve -v and -x to the replacement shell. +-BASH_ENV=/dev/null +-ENV=/dev/null +-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +-case $- in @%:@ (((( +- *v*x* | *x*v* ) as_opts=-vx ;; +- *v* ) as_opts=-v ;; +- *x* ) as_opts=-x ;; +- * ) as_opts= ;; +-esac +-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +-# Admittedly, this is quite paranoid, since all the known shells bail +-# out after a failed `exec'. +-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +-exit 255 +-fi +- +- if test x$as_have_required = xno; then : +- $as_echo "$0: This script requires a shell more modern than all" +- $as_echo "$0: the shells that I found on your system." +- if test x${ZSH_VERSION+set} = xset ; then +- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" +- $as_echo "$0: be upgraded to zsh 4.3.4 or later." +- else +- $as_echo "$0: Please tell bug-autoconf@gnu.org and +-$0: gmp-bugs@gmplib.org, see +-$0: https://gmplib.org/manual/Reporting-Bugs.html about +-$0: your system, including any error possibly output before +-$0: this message. Then install a modern shell, or manually +-$0: run the script under such a shell if you do have one." +- fi +- exit 1 +-fi +-fi +-fi +-SHELL=${CONFIG_SHELL-/bin/sh} +-export SHELL +-# Unset more variables known to interfere with behavior of common tools. +-CLICOLOR_FORCE= GREP_OPTIONS= +-unset CLICOLOR_FORCE GREP_OPTIONS +- +-## --------------------- ## +-## M4sh Shell Functions. ## +-## --------------------- ## +-@%:@ as_fn_unset VAR +-@%:@ --------------- +-@%:@ Portably unset VAR. +-as_fn_unset () +-{ +- { eval $1=; unset $1;} +-} +-as_unset=as_fn_unset +- +-@%:@ as_fn_set_status STATUS +-@%:@ ----------------------- +-@%:@ Set @S|@? to STATUS, without forking. +-as_fn_set_status () +-{ +- return $1 +-} @%:@ as_fn_set_status +- +-@%:@ as_fn_exit STATUS +-@%:@ ----------------- +-@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +-as_fn_exit () +-{ +- set +e +- as_fn_set_status $1 +- exit $1 +-} @%:@ as_fn_exit +- +-@%:@ as_fn_mkdir_p +-@%:@ ------------- +-@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +-as_fn_mkdir_p () +-{ +- +- case $as_dir in #( +- -*) as_dir=./$as_dir;; +- esac +- test -d "$as_dir" || eval $as_mkdir_p || { +- as_dirs= +- while :; do +- case $as_dir in #( +- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( +- *) as_qdir=$as_dir;; +- esac +- as_dirs="'$as_qdir' $as_dirs" +- as_dir=`$as_dirname -- "$as_dir" || +-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_dir" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- test -d "$as_dir" && break +- done +- test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" +- +- +-} @%:@ as_fn_mkdir_p +- +-@%:@ as_fn_executable_p FILE +-@%:@ ----------------------- +-@%:@ Test if FILE is an executable regular file. +-as_fn_executable_p () +-{ +- test -f "$1" && test -x "$1" +-} @%:@ as_fn_executable_p +-@%:@ as_fn_append VAR VALUE +-@%:@ ---------------------- +-@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +-@%:@ advantage of any shell optimizations that allow amortized linear growth over +-@%:@ repeated appends, instead of the typical quadratic growth present in naive +-@%:@ implementations. +-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +- eval 'as_fn_append () +- { +- eval $1+=\$2 +- }' +-else +- as_fn_append () +- { +- eval $1=\$$1\$2 +- } +-fi # as_fn_append +- +-@%:@ as_fn_arith ARG... +-@%:@ ------------------ +-@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +-@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +-@%:@ must be portable across @S|@(()) and expr. +-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +- eval 'as_fn_arith () +- { +- as_val=$(( $* )) +- }' +-else +- as_fn_arith () +- { +- as_val=`expr "$@" || test $? -eq 1` +- } +-fi # as_fn_arith +- +- +-@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +-@%:@ ---------------------------------------- +-@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +-@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-@%:@ script with STATUS, using 1 if that was 0. +-as_fn_error () +-{ +- as_status=$1; test $as_status -eq 0 && as_status=1 +- if test "$4"; then +- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 +- fi +- $as_echo "$as_me: error: $2" >&2 +- as_fn_exit $as_status +-} @%:@ as_fn_error +- +-if expr a : '\(a\)' >/dev/null 2>&1 && +- test "X`expr 00001 : '.*\(...\)'`" = X001; then +- as_expr=expr +-else +- as_expr=false +-fi +- +-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then +- as_basename=basename +-else +- as_basename=false +-fi +- +-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then +- as_dirname=dirname +-else +- as_dirname=false +-fi +- +-as_me=`$as_basename -- "$0" || +-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ +- X"$0" : 'X\(//\)$' \| \ +- X"$0" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X/"$0" | +- sed '/^.*\/\([^/][^/]*\)\/*$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- +-# Avoid depending upon Character Ranges. +-as_cr_letters='abcdefghijklmnopqrstuvwxyz' +-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +-as_cr_Letters=$as_cr_letters$as_cr_LETTERS +-as_cr_digits='0123456789' +-as_cr_alnum=$as_cr_Letters$as_cr_digits +- +- +- as_lineno_1=$LINENO as_lineno_1a=$LINENO +- as_lineno_2=$LINENO as_lineno_2a=$LINENO +- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && +- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { +- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) +- sed -n ' +- p +- /[$]LINENO/= +- ' <$as_myself | +- sed ' +- s/[$]LINENO.*/&-/ +- t lineno +- b +- :lineno +- N +- :loop +- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ +- t loop +- s/-\n.*// +- ' >$as_me.lineno && +- chmod +x "$as_me.lineno" || +- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } +- +- # If we had to re-execute with $CONFIG_SHELL, we're ensured to have +- # already done that, so ensure we don't try to do so again and fall +- # in an infinite loop. This has already happened in practice. +- _as_can_reexec=no; export _as_can_reexec +- # Don't try to exec as it changes $[0], causing all sort of problems +- # (the dirname of $[0] is not the place where we might find the +- # original and so on. Autoconf is especially sensitive to this). +- . "./$as_me.lineno" +- # Exit status is that of the last command. +- exit +-} +- +-ECHO_C= ECHO_N= ECHO_T= +-case `echo -n x` in @%:@((((( +--n*) +- case `echo 'xy\c'` in +- *c*) ECHO_T=' ';; # ECHO_T is single tab character. +- xy) ECHO_C='\c';; +- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null +- ECHO_T=' ';; +- esac;; +-*) +- ECHO_N='-n';; +-esac +- +-rm -f conf$$ conf$$.exe conf$$.file +-if test -d conf$$.dir; then +- rm -f conf$$.dir/conf$$.file +-else +- rm -f conf$$.dir +- mkdir conf$$.dir 2>/dev/null +-fi +-if (echo >conf$$.file) 2>/dev/null; then +- if ln -s conf$$.file conf$$ 2>/dev/null; then +- as_ln_s='ln -s' +- # ... but there are two gotchas: +- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. +- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -pR'. +- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -pR' +- elif ln conf$$.file conf$$ 2>/dev/null; then +- as_ln_s=ln +- else +- as_ln_s='cp -pR' +- fi +-else +- as_ln_s='cp -pR' +-fi +-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +-rmdir conf$$.dir 2>/dev/null +- +-if mkdir -p . 2>/dev/null; then +- as_mkdir_p='mkdir -p "$as_dir"' +-else +- test -d ./-p && rmdir ./-p +- as_mkdir_p=false +-fi +- +-as_test_x='test -x' +-as_executable_p=as_fn_executable_p +- +-# Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +- +-# Sed expression to map a string onto a valid variable name. +-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +- +-SHELL=${CONFIG_SHELL-/bin/sh} +- +- +-test -n "$DJDIR" || exec 7<&0 &1 +- +-# Name of the host. +-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +-# so uname gets run too. +-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` +- +-# +-# Initializations. +-# +-ac_default_prefix=/usr/local +-ac_clean_files= +-ac_config_libobj_dir=. +-LIB@&t@OBJS= +-cross_compiling=no +-subdirs= +-MFLAGS= +-MAKEFLAGS= +- +-# Identity of this package. +-PACKAGE_NAME='GNU MP' +-PACKAGE_TARNAME='gmp' +-PACKAGE_VERSION='6.0.0' +-PACKAGE_STRING='GNU MP 6.0.0' +-PACKAGE_BUGREPORT='gmp-bugs@gmplib.org, see https://gmplib.org/manual/Reporting-Bugs.html' +-PACKAGE_URL='http://www.gnu.org/software/gmp/' +- +-ac_unique_file="gmp-impl.h" +-# Factoring default headers for most tests. +-ac_includes_default="\ +-#include +-#ifdef HAVE_SYS_TYPES_H +-# include +-#endif +-#ifdef HAVE_SYS_STAT_H +-# include +-#endif +-#ifdef STDC_HEADERS +-# include +-# include +-#else +-# ifdef HAVE_STDLIB_H +-# include +-# endif +-#endif +-#ifdef HAVE_STRING_H +-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +-# include +-# endif +-# include +-#endif +-#ifdef HAVE_STRINGS_H +-# include +-#endif +-#ifdef HAVE_INTTYPES_H +-# include +-#endif +-#ifdef HAVE_STDINT_H +-# include +-#endif +-#ifdef HAVE_UNISTD_H +-# include +-#endif" +- +-ac_subst_vars='am__EXEEXT_FALSE +-am__EXEEXT_TRUE +-LTLIBOBJS +-LIB@&t@OBJS +-LEXLIB +-LEX_OUTPUT_ROOT +-LEX +-YFLAGS +-YACC +-LIBREADLINE +-WITH_READLINE_01 +-LIBCURSES +-HAVE_STACK_T_01 +-HAVE_SYS_RESOURCE_H_01 +-HAVE_SIGSTACK_01 +-HAVE_SIGALTSTACK_01 +-HAVE_SIGACTION_01 +-HAVE_GETTIMEOFDAY_01 +-HAVE_GETRUSAGE_01 +-HAVE_CPUTIME_01 +-HAVE_CLOCK_01 +-TUNE_SQR_OBJ +-gmp_srclinks +-mpn_objs_in_libgmp +-mpn_objects +-GMP_LIMB_BITS +-M4 +-TUNE_LIBS +-TAL_OBJECT +-LIBM +-ENABLE_STATIC_FALSE +-ENABLE_STATIC_TRUE +-OTOOL64 +-OTOOL +-LIPO +-NMEDIT +-DSYMUTIL +-MANIFEST_TOOL +-RANLIB +-ac_ct_AR +-LN_S +-LD +-FGREP +-SED +-LIBTOOL +-LIBGMP_DLL +-OBJDUMP +-DLLTOOL +-AS +-NM +-ac_ct_DUMPBIN +-DUMPBIN +-AR +-ASMFLAGS +-EGREP +-GREP +-CXXCPP +-WANT_CXX_FALSE +-WANT_CXX_TRUE +-ac_ct_CXX +-CXXFLAGS +-CXX +-CCAS +-LIBM_FOR_BUILD +-U_FOR_BUILD +-EXEEXT_FOR_BUILD +-CPP_FOR_BUILD +-CC_FOR_BUILD +-CPP +-OBJEXT +-EXEEXT +-ac_ct_CC +-CPPFLAGS +-LDFLAGS +-CFLAGS +-CC +-DEFN_LONG_LONG_LIMB +-CALLING_CONVENTIONS_OBJS +-SPEED_CYCLECOUNTER_OBJ +-LIBGMPXX_LDFLAGS +-LIBGMP_LDFLAGS +-GMP_LDFLAGS +-HAVE_HOST_CPU_FAMILY_powerpc +-HAVE_HOST_CPU_FAMILY_power +-ABI +-GMP_NAIL_BITS +-MAINT +-MAINTAINER_MODE_FALSE +-MAINTAINER_MODE_TRUE +-AM_BACKSLASH +-AM_DEFAULT_VERBOSITY +-AM_DEFAULT_V +-AM_V +-am__untar +-am__tar +-AMTAR +-am__leading_dot +-SET_MAKE +-AWK +-mkdir_p +-MKDIR_P +-INSTALL_STRIP_PROGRAM +-STRIP +-install_sh +-MAKEINFO +-AUTOHEADER +-AUTOMAKE +-AUTOCONF +-ACLOCAL +-VERSION +-PACKAGE +-CYGPATH_W +-am__isrc +-INSTALL_DATA +-INSTALL_SCRIPT +-INSTALL_PROGRAM +-host_os +-host_vendor +-host_cpu +-host +-build_os +-build_vendor +-build_cpu +-build +-target_alias +-host_alias +-build_alias +-LIBS +-ECHO_T +-ECHO_N +-ECHO_C +-DEFS +-mandir +-localedir +-libdir +-psdir +-pdfdir +-dvidir +-htmldir +-infodir +-docdir +-oldincludedir +-includedir +-localstatedir +-sharedstatedir +-sysconfdir +-datadir +-datarootdir +-libexecdir +-sbindir +-bindir +-program_transform_name +-prefix +-exec_prefix +-PACKAGE_URL +-PACKAGE_BUGREPORT +-PACKAGE_STRING +-PACKAGE_VERSION +-PACKAGE_TARNAME +-PACKAGE_NAME +-PATH_SEPARATOR +-SHELL' +-ac_subst_files='' +-ac_user_opts=' +-enable_option_checking +-enable_silent_rules +-enable_maintainer_mode +-enable_assert +-enable_alloca +-enable_cxx +-enable_assembly +-enable_fft +-enable_old_fft_full +-enable_nails +-enable_profiling +-with_readline +-enable_fat +-enable_minithres +-enable_fake_cpuid +-enable_shared +-enable_static +-with_pic +-enable_fast_install +-with_gnu_ld +-with_sysroot +-enable_libtool_lock +-' +- ac_precious_vars='build_alias +-host_alias +-target_alias +-ABI +-CC +-CFLAGS +-LDFLAGS +-LIBS +-CPPFLAGS +-CPP +-CC_FOR_BUILD +-CPP_FOR_BUILD +-CXX +-CXXFLAGS +-CCC +-CXXCPP +-M4 +-YACC +-YFLAGS' +- +- +-# Initialize some variables set by options. +-ac_init_help= +-ac_init_version=false +-ac_unrecognized_opts= +-ac_unrecognized_sep= +-# The variables have the same names as the options, with +-# dashes changed to underlines. +-cache_file=/dev/null +-exec_prefix=NONE +-no_create= +-no_recursion= +-prefix=NONE +-program_prefix=NONE +-program_suffix=NONE +-program_transform_name=s,x,x, +-silent= +-site= +-srcdir= +-verbose= +-x_includes=NONE +-x_libraries=NONE +- +-# Installation directory options. +-# These are left unexpanded so users can "make install exec_prefix=/foo" +-# and all the variables that are supposed to be based on exec_prefix +-# by default will actually change. +-# Use braces instead of parens because sh, perl, etc. also accept them. +-# (The list follows the same order as the GNU Coding Standards.) +-bindir='${exec_prefix}/bin' +-sbindir='${exec_prefix}/sbin' +-libexecdir='${exec_prefix}/libexec' +-datarootdir='${prefix}/share' +-datadir='${datarootdir}' +-sysconfdir='${prefix}/etc' +-sharedstatedir='${prefix}/com' +-localstatedir='${prefix}/var' +-includedir='${prefix}/include' +-oldincludedir='/usr/include' +-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +-infodir='${datarootdir}/info' +-htmldir='${docdir}' +-dvidir='${docdir}' +-pdfdir='${docdir}' +-psdir='${docdir}' +-libdir='${exec_prefix}/lib' +-localedir='${datarootdir}/locale' +-mandir='${datarootdir}/man' +- +-ac_prev= +-ac_dashdash= +-for ac_option +-do +- # If the previous option needs an argument, assign it. +- if test -n "$ac_prev"; then +- eval $ac_prev=\$ac_option +- ac_prev= +- continue +- fi +- +- case $ac_option in +- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; +- *=) ac_optarg= ;; +- *) ac_optarg=yes ;; +- esac +- +- # Accept the important Cygnus configure options, so we can diagnose typos. +- +- case $ac_dashdash$ac_option in +- --) +- ac_dashdash=yes ;; +- +- -bindir | --bindir | --bindi | --bind | --bin | --bi) +- ac_prev=bindir ;; +- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) +- bindir=$ac_optarg ;; +- +- -build | --build | --buil | --bui | --bu) +- ac_prev=build_alias ;; +- -build=* | --build=* | --buil=* | --bui=* | --bu=*) +- build_alias=$ac_optarg ;; +- +- -cache-file | --cache-file | --cache-fil | --cache-fi \ +- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) +- ac_prev=cache_file ;; +- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ +- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) +- cache_file=$ac_optarg ;; +- +- --config-cache | -C) +- cache_file=config.cache ;; +- +- -datadir | --datadir | --datadi | --datad) +- ac_prev=datadir ;; +- -datadir=* | --datadir=* | --datadi=* | --datad=*) +- datadir=$ac_optarg ;; +- +- -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ +- | --dataroo | --dataro | --datar) +- ac_prev=datarootdir ;; +- -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ +- | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) +- datarootdir=$ac_optarg ;; +- +- -disable-* | --disable-*) +- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid feature name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"enable_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval enable_$ac_useropt=no ;; +- +- -docdir | --docdir | --docdi | --doc | --do) +- ac_prev=docdir ;; +- -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) +- docdir=$ac_optarg ;; +- +- -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) +- ac_prev=dvidir ;; +- -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) +- dvidir=$ac_optarg ;; +- +- -enable-* | --enable-*) +- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid feature name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"enable_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval enable_$ac_useropt=\$ac_optarg ;; +- +- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ +- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ +- | --exec | --exe | --ex) +- ac_prev=exec_prefix ;; +- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ +- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ +- | --exec=* | --exe=* | --ex=*) +- exec_prefix=$ac_optarg ;; +- +- -gas | --gas | --ga | --g) +- # Obsolete; use --with-gas. +- with_gas=yes ;; +- +- -help | --help | --hel | --he | -h) +- ac_init_help=long ;; +- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) +- ac_init_help=recursive ;; +- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) +- ac_init_help=short ;; +- +- -host | --host | --hos | --ho) +- ac_prev=host_alias ;; +- -host=* | --host=* | --hos=* | --ho=*) +- host_alias=$ac_optarg ;; +- +- -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) +- ac_prev=htmldir ;; +- -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ +- | --ht=*) +- htmldir=$ac_optarg ;; +- +- -includedir | --includedir | --includedi | --included | --include \ +- | --includ | --inclu | --incl | --inc) +- ac_prev=includedir ;; +- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ +- | --includ=* | --inclu=* | --incl=* | --inc=*) +- includedir=$ac_optarg ;; +- +- -infodir | --infodir | --infodi | --infod | --info | --inf) +- ac_prev=infodir ;; +- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) +- infodir=$ac_optarg ;; +- +- -libdir | --libdir | --libdi | --libd) +- ac_prev=libdir ;; +- -libdir=* | --libdir=* | --libdi=* | --libd=*) +- libdir=$ac_optarg ;; +- +- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ +- | --libexe | --libex | --libe) +- ac_prev=libexecdir ;; +- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ +- | --libexe=* | --libex=* | --libe=*) +- libexecdir=$ac_optarg ;; +- +- -localedir | --localedir | --localedi | --localed | --locale) +- ac_prev=localedir ;; +- -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) +- localedir=$ac_optarg ;; +- +- -localstatedir | --localstatedir | --localstatedi | --localstated \ +- | --localstate | --localstat | --localsta | --localst | --locals) +- ac_prev=localstatedir ;; +- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ +- | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) +- localstatedir=$ac_optarg ;; +- +- -mandir | --mandir | --mandi | --mand | --man | --ma | --m) +- ac_prev=mandir ;; +- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) +- mandir=$ac_optarg ;; +- +- -nfp | --nfp | --nf) +- # Obsolete; use --without-fp. +- with_fp=no ;; +- +- -no-create | --no-create | --no-creat | --no-crea | --no-cre \ +- | --no-cr | --no-c | -n) +- no_create=yes ;; +- +- -no-recursion | --no-recursion | --no-recursio | --no-recursi \ +- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) +- no_recursion=yes ;; +- +- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ +- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ +- | --oldin | --oldi | --old | --ol | --o) +- ac_prev=oldincludedir ;; +- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ +- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ +- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) +- oldincludedir=$ac_optarg ;; +- +- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) +- ac_prev=prefix ;; +- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) +- prefix=$ac_optarg ;; +- +- -program-prefix | --program-prefix | --program-prefi | --program-pref \ +- | --program-pre | --program-pr | --program-p) +- ac_prev=program_prefix ;; +- -program-prefix=* | --program-prefix=* | --program-prefi=* \ +- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) +- program_prefix=$ac_optarg ;; +- +- -program-suffix | --program-suffix | --program-suffi | --program-suff \ +- | --program-suf | --program-su | --program-s) +- ac_prev=program_suffix ;; +- -program-suffix=* | --program-suffix=* | --program-suffi=* \ +- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) +- program_suffix=$ac_optarg ;; +- +- -program-transform-name | --program-transform-name \ +- | --program-transform-nam | --program-transform-na \ +- | --program-transform-n | --program-transform- \ +- | --program-transform | --program-transfor \ +- | --program-transfo | --program-transf \ +- | --program-trans | --program-tran \ +- | --progr-tra | --program-tr | --program-t) +- ac_prev=program_transform_name ;; +- -program-transform-name=* | --program-transform-name=* \ +- | --program-transform-nam=* | --program-transform-na=* \ +- | --program-transform-n=* | --program-transform-=* \ +- | --program-transform=* | --program-transfor=* \ +- | --program-transfo=* | --program-transf=* \ +- | --program-trans=* | --program-tran=* \ +- | --progr-tra=* | --program-tr=* | --program-t=*) +- program_transform_name=$ac_optarg ;; +- +- -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) +- ac_prev=pdfdir ;; +- -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) +- pdfdir=$ac_optarg ;; +- +- -psdir | --psdir | --psdi | --psd | --ps) +- ac_prev=psdir ;; +- -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) +- psdir=$ac_optarg ;; +- +- -q | -quiet | --quiet | --quie | --qui | --qu | --q \ +- | -silent | --silent | --silen | --sile | --sil) +- silent=yes ;; +- +- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) +- ac_prev=sbindir ;; +- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ +- | --sbi=* | --sb=*) +- sbindir=$ac_optarg ;; +- +- -sharedstatedir | --sharedstatedir | --sharedstatedi \ +- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ +- | --sharedst | --shareds | --shared | --share | --shar \ +- | --sha | --sh) +- ac_prev=sharedstatedir ;; +- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ +- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ +- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ +- | --sha=* | --sh=*) +- sharedstatedir=$ac_optarg ;; +- +- -site | --site | --sit) +- ac_prev=site ;; +- -site=* | --site=* | --sit=*) +- site=$ac_optarg ;; +- +- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) +- ac_prev=srcdir ;; +- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) +- srcdir=$ac_optarg ;; +- +- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ +- | --syscon | --sysco | --sysc | --sys | --sy) +- ac_prev=sysconfdir ;; +- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ +- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) +- sysconfdir=$ac_optarg ;; +- +- -target | --target | --targe | --targ | --tar | --ta | --t) +- ac_prev=target_alias ;; +- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) +- target_alias=$ac_optarg ;; +- +- -v | -verbose | --verbose | --verbos | --verbo | --verb) +- verbose=yes ;; +- +- -version | --version | --versio | --versi | --vers | -V) +- ac_init_version=: ;; +- +- -with-* | --with-*) +- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid package name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"with_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval with_$ac_useropt=\$ac_optarg ;; +- +- -without-* | --without-*) +- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` +- # Reject names that are not valid shell variable names. +- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && +- as_fn_error $? "invalid package name: $ac_useropt" +- ac_useropt_orig=$ac_useropt +- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` +- case $ac_user_opts in +- *" +-"with_$ac_useropt" +-"*) ;; +- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" +- ac_unrecognized_sep=', ';; +- esac +- eval with_$ac_useropt=no ;; +- +- --x) +- # Obsolete; use --with-x. +- with_x=yes ;; +- +- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ +- | --x-incl | --x-inc | --x-in | --x-i) +- ac_prev=x_includes ;; +- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ +- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) +- x_includes=$ac_optarg ;; +- +- -x-libraries | --x-libraries | --x-librarie | --x-librari \ +- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) +- ac_prev=x_libraries ;; +- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ +- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) +- x_libraries=$ac_optarg ;; +- +- -*) as_fn_error $? "unrecognized option: \`$ac_option' +-Try \`$0 --help' for more information" +- ;; +- +- *=*) +- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` +- # Reject names that are not valid shell variable names. +- case $ac_envvar in #( +- '' | [0-9]* | *[!_$as_cr_alnum]* ) +- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; +- esac +- eval $ac_envvar=\$ac_optarg +- export $ac_envvar ;; +- +- *) +- # FIXME: should be removed in autoconf 3.0. +- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 +- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && +- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 +- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" +- ;; +- +- esac +-done +- +-if test -n "$ac_prev"; then +- ac_option=--`echo $ac_prev | sed 's/_/-/g'` +- as_fn_error $? "missing argument to $ac_option" +-fi +- +-if test -n "$ac_unrecognized_opts"; then +- case $enable_option_checking in +- no) ;; +- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; +- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; +- esac +-fi +- +-# Check all directory arguments for consistency. +-for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ +- datadir sysconfdir sharedstatedir localstatedir includedir \ +- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ +- libdir localedir mandir +-do +- eval ac_val=\$$ac_var +- # Remove trailing slashes. +- case $ac_val in +- */ ) +- ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` +- eval $ac_var=\$ac_val;; +- esac +- # Be sure to have absolute directory names. +- case $ac_val in +- [\\/$]* | ?:[\\/]* ) continue;; +- NONE | '' ) case $ac_var in *prefix ) continue;; esac;; +- esac +- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +-done +- +-# There might be people who depend on the old broken behavior: `$host' +-# used to hold the argument of --host etc. +-# FIXME: To remove some day. +-build=$build_alias +-host=$host_alias +-target=$target_alias +- +-# FIXME: To remove some day. +-if test "x$host_alias" != x; then +- if test "x$build_alias" = x; then +- cross_compiling=maybe +- elif test "x$build_alias" != "x$host_alias"; then +- cross_compiling=yes +- fi +-fi +- +-ac_tool_prefix= +-test -n "$host_alias" && ac_tool_prefix=$host_alias- +- +-test "$silent" = yes && exec 6>/dev/null +- +- +-ac_pwd=`pwd` && test -n "$ac_pwd" && +-ac_ls_di=`ls -di .` && +-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || +- as_fn_error $? "working directory cannot be determined" +-test "X$ac_ls_di" = "X$ac_pwd_ls_di" || +- as_fn_error $? "pwd does not report name of working directory" +- +- +-# Find the source files, if location was not specified. +-if test -z "$srcdir"; then +- ac_srcdir_defaulted=yes +- # Try the directory containing this script, then the parent directory. +- ac_confdir=`$as_dirname -- "$as_myself" || +-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_myself" : 'X\(//\)[^/]' \| \ +- X"$as_myself" : 'X\(//\)$' \| \ +- X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_myself" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- srcdir=$ac_confdir +- if test ! -r "$srcdir/$ac_unique_file"; then +- srcdir=.. +- fi +-else +- ac_srcdir_defaulted=no +-fi +-if test ! -r "$srcdir/$ac_unique_file"; then +- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." +- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +-fi +-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +-ac_abs_confdir=`( +- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" +- pwd)` +-# When building in place, set srcdir=. +-if test "$ac_abs_confdir" = "$ac_pwd"; then +- srcdir=. +-fi +-# Remove unnecessary trailing slashes from srcdir. +-# Double slashes in file names in object file debugging info +-# mess up M-x gdb in Emacs. +-case $srcdir in +-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +-esac +-for ac_var in $ac_precious_vars; do +- eval ac_env_${ac_var}_set=\${${ac_var}+set} +- eval ac_env_${ac_var}_value=\$${ac_var} +- eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} +- eval ac_cv_env_${ac_var}_value=\$${ac_var} +-done +- +-# +-# Report the --help message. +-# +-if test "$ac_init_help" = "long"; then +- # Omit some internal or obsolete options to make the list less imposing. +- # This message is too long to be a string in the A/UX 3.1 sh. +- cat <<_ACEOF +-\`configure' configures GNU MP 6.0.0 to adapt to many kinds of systems. +- +-Usage: $0 [OPTION]... [VAR=VALUE]... +- +-To assign environment variables (e.g., CC, CFLAGS...), specify them as +-VAR=VALUE. See below for descriptions of some of the useful variables. +- +-Defaults for the options are specified in brackets. +- +-Configuration: +- -h, --help display this help and exit +- --help=short display options specific to this package +- --help=recursive display the short help of all the included packages +- -V, --version display version information and exit +- -q, --quiet, --silent do not print \`checking ...' messages +- --cache-file=FILE cache test results in FILE [disabled] +- -C, --config-cache alias for \`--cache-file=config.cache' +- -n, --no-create do not create output files +- --srcdir=DIR find the sources in DIR [configure dir or \`..'] +- +-Installation directories: +- --prefix=PREFIX install architecture-independent files in PREFIX +- @<:@@S|@ac_default_prefix@:>@ +- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX +- @<:@PREFIX@:>@ +- +-By default, \`make install' will install all the files in +-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +-an installation prefix other than \`$ac_default_prefix' using \`--prefix', +-for instance \`--prefix=\$HOME'. +- +-For better control, use the options below. +- +-Fine tuning of the installation directories: +- --bindir=DIR user executables [EPREFIX/bin] +- --sbindir=DIR system admin executables [EPREFIX/sbin] +- --libexecdir=DIR program executables [EPREFIX/libexec] +- --sysconfdir=DIR read-only single-machine data [PREFIX/etc] +- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] +- --localstatedir=DIR modifiable single-machine data [PREFIX/var] +- --libdir=DIR object code libraries [EPREFIX/lib] +- --includedir=DIR C header files [PREFIX/include] +- --oldincludedir=DIR C header files for non-gcc [/usr/include] +- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] +- --datadir=DIR read-only architecture-independent data [DATAROOTDIR] +- --infodir=DIR info documentation [DATAROOTDIR/info] +- --localedir=DIR locale-dependent data [DATAROOTDIR/locale] +- --mandir=DIR man documentation [DATAROOTDIR/man] +- --docdir=DIR documentation root @<:@DATAROOTDIR/doc/gmp@:>@ +- --htmldir=DIR html documentation [DOCDIR] +- --dvidir=DIR dvi documentation [DOCDIR] +- --pdfdir=DIR pdf documentation [DOCDIR] +- --psdir=DIR ps documentation [DOCDIR] +-_ACEOF +- +- cat <<\_ACEOF +- +-Program names: +- --program-prefix=PREFIX prepend PREFIX to installed program names +- --program-suffix=SUFFIX append SUFFIX to installed program names +- --program-transform-name=PROGRAM run sed PROGRAM on installed program names +- +-System types: +- --build=BUILD configure for building on BUILD [guessed] +- --host=HOST cross-compile to build programs to run on HOST [BUILD] +-_ACEOF +-fi +- +-if test -n "$ac_init_help"; then +- case $ac_init_help in +- short | recursive ) echo "Configuration of GNU MP 6.0.0:";; +- esac +- cat <<\_ACEOF +- +-Optional Features: +- --disable-option-checking ignore unrecognized --enable/--with options +- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) +- --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +- --enable-silent-rules less verbose build output (undo: "make V=1") +- --disable-silent-rules verbose build output (undo: "make V=0") +- --enable-maintainer-mode +- enable make rules and dependencies not useful (and +- sometimes confusing) to the casual installer +- --enable-assert enable ASSERT checking @<:@@<:@default=no@:>@@:>@ +- --enable-alloca how to get temp memory @<:@@<:@default=reentrant@:>@@:>@ +- --enable-cxx enable C++ support @<:@@<:@default=no@:>@@:>@ +- --enable-assembly enable the use of assembly loops @<:@@<:@default=yes@:>@@:>@ +- --enable-fft enable FFTs for multiplication @<:@@<:@default=yes@:>@@:>@ +- --enable-old-fft-full enable old mpn_mul_fft_full for multiplication +- @<:@@<:@default=no@:>@@:>@ +- --enable-nails use nails on limbs @<:@@<:@default=no@:>@@:>@ +- --enable-profiling build with profiler support @<:@@<:@default=no@:>@@:>@ +- --enable-fat build a fat binary on systems that support it +- @<:@@<:@default=no@:>@@:>@ +- --enable-minithres choose minimal thresholds for testing @<:@@<:@default=no@:>@@:>@ +- --enable-fake-cpuid enable GMP_CPU_TYPE faking cpuid @<:@@<:@default=no@:>@@:>@ +- --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ +- --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ +- --enable-fast-install@<:@=PKGS@:>@ +- optimize for fast installation @<:@default=yes@:>@ +- --disable-libtool-lock avoid locking (might break parallel builds) +- +-Optional Packages: +- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] +- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) +- --with-readline readline support in calc demo program +- @<:@@<:@default=detect@:>@@:>@ +- --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use +- both@:>@ +- --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ +- --with-sysroot=DIR Search for dependent libraries within DIR +- (or the compiler's sysroot if not specified). +- +-Some influential environment variables: +- ABI desired ABI (for processors supporting more than one ABI) +- CC C compiler command +- CFLAGS C compiler flags +- LDFLAGS linker flags, e.g. -L if you have libraries in a +- nonstandard directory +- LIBS libraries to pass to the linker, e.g. -l +- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if +- you have headers in a nonstandard directory +- CPP C preprocessor +- CC_FOR_BUILD +- build system C compiler +- CPP_FOR_BUILD +- build system C preprocessor +- CXX C++ compiler command +- CXXFLAGS C++ compiler flags +- CXXCPP C++ preprocessor +- M4 m4 macro processor +- YACC The `Yet Another Compiler Compiler' implementation to use. +- Defaults to the first program found out of: `bison -y', `byacc', +- `yacc'. +- YFLAGS The list of arguments that will be passed by default to @S|@YACC. +- This script will default YFLAGS to the empty string to avoid a +- default value of `-d' given by some make applications. +- +-Use these variables to override the choices made by `configure' or to help +-it to find libraries and programs with nonstandard names/locations. +- +-Report bugs to . +-GNU MP home page: . +-General help using GNU software: . +-_ACEOF +-ac_status=$? +-fi +- +-if test "$ac_init_help" = "recursive"; then +- # If there are subdirs, report their specific --help. +- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue +- test -d "$ac_dir" || +- { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || +- continue +- ac_builddir=. +- +-case "$ac_dir" in +-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +-*) +- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` +- # A ".." for each directory in $ac_dir_suffix. +- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` +- case $ac_top_builddir_sub in +- "") ac_top_builddir_sub=. ac_top_build_prefix= ;; +- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; +- esac ;; +-esac +-ac_abs_top_builddir=$ac_pwd +-ac_abs_builddir=$ac_pwd$ac_dir_suffix +-# for backward compatibility: +-ac_top_builddir=$ac_top_build_prefix +- +-case $srcdir in +- .) # We are building in place. +- ac_srcdir=. +- ac_top_srcdir=$ac_top_builddir_sub +- ac_abs_top_srcdir=$ac_pwd ;; +- [\\/]* | ?:[\\/]* ) # Absolute name. +- ac_srcdir=$srcdir$ac_dir_suffix; +- ac_top_srcdir=$srcdir +- ac_abs_top_srcdir=$srcdir ;; +- *) # Relative name. +- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix +- ac_top_srcdir=$ac_top_build_prefix$srcdir +- ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +-esac +-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix +- +- cd "$ac_dir" || { ac_status=$?; continue; } +- # Check for guested configure. +- if test -f "$ac_srcdir/configure.gnu"; then +- echo && +- $SHELL "$ac_srcdir/configure.gnu" --help=recursive +- elif test -f "$ac_srcdir/configure"; then +- echo && +- $SHELL "$ac_srcdir/configure" --help=recursive +- else +- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 +- fi || ac_status=$? +- cd "$ac_pwd" || { ac_status=$?; break; } +- done +-fi +- +-test -n "$ac_init_help" && exit $ac_status +-if $ac_init_version; then +- cat <<\_ACEOF +-GNU MP configure 6.0.0 +-generated by GNU Autoconf 2.69 +- +-Copyright (C) 2012 Free Software Foundation, Inc. +-This configure script is free software; the Free Software Foundation +-gives unlimited permission to copy, distribute and modify it. +- +- +- +-Copyright 1996-2014 Free Software Foundation, Inc. +- +-This file is part of the GNU MP Library. +- +-The GNU MP Library is free software; you can redistribute it and/or modify +-it under the terms of either: +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at your +- option) any later version. +- +-or +- +- * the GNU General Public License as published by the Free Software +- Foundation; either version 2 of the License, or (at your option) any +- later version. +- +-or both in parallel, as here. +- +-The GNU MP 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 General Public License +-for more details. +- +-You should have received copies of the GNU General Public License and the +-GNU Lesser General Public License along with the GNU MP Library. If not, +-see https://www.gnu.org/licenses/. +- +-_ACEOF +- exit +-fi +- +-## ------------------------ ## +-## Autoconf initialization. ## +-## ------------------------ ## +- +-@%:@ ac_fn_c_try_compile LINENO +-@%:@ -------------------------- +-@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_c_try_compile () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext +- if { { ac_try="$ac_compile" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compile") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_c_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest.$ac_objext; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_compile +- +-@%:@ ac_fn_c_try_cpp LINENO +-@%:@ ---------------------- +-@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_c_try_cpp () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { { ac_try="$ac_cpp conftest.$ac_ext" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } > conftest.i && { +- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || +- test ! -s conftest.err +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_cpp +- +-@%:@ ac_fn_cxx_try_compile LINENO +-@%:@ ---------------------------- +-@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_cxx_try_compile () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext +- if { { ac_try="$ac_compile" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compile") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_cxx_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest.$ac_objext; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_cxx_try_compile +- +-@%:@ ac_fn_cxx_try_cpp LINENO +-@%:@ ------------------------ +-@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_cxx_try_cpp () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { { ac_try="$ac_cpp conftest.$ac_ext" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } > conftest.i && { +- test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || +- test ! -s conftest.err +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_cxx_try_cpp +- +-@%:@ ac_fn_c_try_link LINENO +-@%:@ ----------------------- +-@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_c_try_link () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext conftest$ac_exeext +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_c_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest$ac_exeext && { +- test "$cross_compiling" = yes || +- test -x conftest$ac_exeext +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information +- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would +- # interfere with the next link command; also delete a directory that is +- # left behind by Apple's compiler. We do this before executing the actions. +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_link +- +-@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +-@%:@ ------------------------------------------------------- +-@%:@ Tests whether HEADER exists and can be compiled using the include files in +-@%:@ INCLUDES, setting the cache variable VAR accordingly. +-ac_fn_c_check_header_compile () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-@%:@include <$2> +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$3=yes" +-else +- eval "$3=no" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_header_compile +- +-@%:@ ac_fn_c_try_run LINENO +-@%:@ ---------------------- +-@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +-@%:@ that executables *can* be run. +-ac_fn_c_try_run () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' +- { { case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_try") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: program exited with status $ac_status" >&5 +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=$ac_status +-fi +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_c_try_run +- +-@%:@ ac_fn_c_check_func LINENO FUNC VAR +-@%:@ ---------------------------------- +-@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +-ac_fn_c_check_func () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-/* Define $2 to an innocuous variant, in case declares $2. +- For example, HP-UX 11i declares gettimeofday. */ +-#define $2 innocuous_$2 +- +-/* System header to define __stub macros and hopefully few prototypes, +- which can conflict with char $2 (); below. +- Prefer to if __STDC__ is defined, since +- exists even on freestanding compilers. */ +- +-#ifdef __STDC__ +-# include +-#else +-# include +-#endif +- +-#undef $2 +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char $2 (); +-/* 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_$2 || defined __stub___$2 +-choke me +-#endif +- +-int +-main () +-{ +-return $2 (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- eval "$3=yes" +-else +- eval "$3=no" +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_func +- +-@%:@ ac_fn_cxx_try_link LINENO +-@%:@ ------------------------- +-@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +-ac_fn_cxx_try_link () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext conftest$ac_exeext +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_cxx_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest$ac_exeext && { +- test "$cross_compiling" = yes || +- test -x conftest$ac_exeext +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information +- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would +- # interfere with the next link command; also delete a directory that is +- # left behind by Apple's compiler. We do this before executing the actions. +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} @%:@ ac_fn_cxx_try_link +- +-@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +-@%:@ ------------------------------------------------------- +-@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +-@%:@ the include files in INCLUDES and setting the cache variable VAR +-@%:@ accordingly. +-ac_fn_c_check_header_mongrel () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval \${$3+:} false; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-else +- # Is the header compilable? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +-$as_echo_n "checking $2 usability... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-@%:@include <$2> +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_header_compiler=yes +-else +- ac_header_compiler=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +-$as_echo "$ac_header_compiler" >&6; } +- +-# Is the header present? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +-$as_echo_n "checking $2 presence... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include <$2> +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- ac_header_preproc=yes +-else +- ac_header_preproc=no +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +-$as_echo "$ac_header_preproc" >&6; } +- +-# So? What about this header? +-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( +- yes:no: ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +- ;; +- no:yes:* ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +-( $as_echo "## ssssssssssssssssssssssssssssssssss ## +-## Report this to gmp-bugs@gmplib.org ## +-## ssssssssssssssssssssssssssssssssss ##" +- ) | sed "s/^/$as_me: WARNING: /" >&2 +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=\$ac_header_compiler" +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_header_mongrel +- +-@%:@ ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +-@%:@ --------------------------------------------- +-@%:@ Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +-@%:@ accordingly. +-ac_fn_c_check_decl () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- as_decl_name=`echo $2|sed 's/ *(.*//'` +- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +-$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-@%:@ifndef $as_decl_name +-@%:@ifdef __cplusplus +- (void) $as_decl_use; +-@%:@else +- (void) $as_decl_name; +-@%:@endif +-@%:@endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$3=yes" +-else +- eval "$3=no" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_decl +- +-@%:@ ac_fn_c_check_type LINENO TYPE VAR INCLUDES +-@%:@ ------------------------------------------- +-@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +-@%:@ variable VAR accordingly. +-ac_fn_c_check_type () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=no" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof ($2)) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof (($2))) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- eval "$3=yes" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_type +- +-@%:@ ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +-@%:@ ---------------------------------------------------- +-@%:@ Tries to find if the field MEMBER exists in type AGGR, after including +-@%:@ INCLUDES, setting cache variable VAR accordingly. +-ac_fn_c_check_member () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +-$as_echo_n "checking for $2.$3... " >&6; } +-if eval \${$4+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$5 +-int +-main () +-{ +-static $2 ac_aggr; +-if (ac_aggr.$3) +-return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$4=yes" +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$5 +-int +-main () +-{ +-static $2 ac_aggr; +-if (sizeof ac_aggr.$3) +-return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- eval "$4=yes" +-else +- eval "$4=no" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$4 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_c_check_member +- +-@%:@ ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES +-@%:@ --------------------------------------------------------- +-@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +-@%:@ the include files in INCLUDES and setting the cache variable VAR +-@%:@ accordingly. +-ac_fn_cxx_check_header_mongrel () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if eval \${$3+:} false; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-else +- # Is the header compilable? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +-$as_echo_n "checking $2 usability... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-@%:@include <$2> +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_header_compiler=yes +-else +- ac_header_compiler=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +-$as_echo "$ac_header_compiler" >&6; } +- +-# Is the header present? +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +-$as_echo_n "checking $2 presence... " >&6; } +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include <$2> +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- ac_header_preproc=yes +-else +- ac_header_preproc=no +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +-$as_echo "$ac_header_preproc" >&6; } +- +-# So? What about this header? +-case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( +- yes:no: ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +- ;; +- no:yes:* ) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +-( $as_echo "## ssssssssssssssssssssssssssssssssss ## +-## Report this to gmp-bugs@gmplib.org ## +-## ssssssssssssssssssssssssssssssssss ##" +- ) | sed "s/^/$as_me: WARNING: /" >&2 +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=\$ac_header_compiler" +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +-fi +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_cxx_check_header_mongrel +- +-@%:@ ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES +-@%:@ --------------------------------------------- +-@%:@ Tests whether TYPE exists after having included INCLUDES, setting cache +-@%:@ variable VAR accordingly. +-ac_fn_cxx_check_type () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +-$as_echo_n "checking for $2... " >&6; } +-if eval \${$3+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- eval "$3=no" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof ($2)) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-if (sizeof (($2))) +- return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- +-else +- eval "$3=yes" +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-eval ac_res=\$$3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +-$as_echo "$ac_res" >&6; } +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- +-} @%:@ ac_fn_cxx_check_type +- +-@%:@ ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +-@%:@ -------------------------------------------- +-@%:@ Tries to find the compile-time value of EXPR in a program that includes +-@%:@ INCLUDES, setting VAR accordingly. Returns whether the value could be +-@%:@ computed +-ac_fn_c_compute_int () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- if test "$cross_compiling" = yes; then +- # Depending upon the size, compute the lo and hi bounds. +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) >= 0)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_lo=0 ac_mid=0 +- while :; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) <= $ac_mid)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=$ac_mid; break +-else +- as_fn_arith $ac_mid + 1 && ac_lo=$as_val +- if test $ac_lo -le $ac_mid; then +- ac_lo= ac_hi= +- break +- fi +- as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- done +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) < 0)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=-1 ac_mid=-1 +- while :; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) >= $ac_mid)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_lo=$ac_mid; break +-else +- as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val +- if test $ac_mid -le $ac_hi; then +- ac_lo= ac_hi= +- break +- fi +- as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- done +-else +- ac_lo= ac_hi= +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-# Binary search between lo and hi bounds. +-while test "x$ac_lo" != "x$ac_hi"; do +- as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-int +-main () +-{ +-static int test_array @<:@1 - 2 * !(($2) <= $ac_mid)@:>@; +-test_array @<:@0@:>@ = 0; +-return test_array @<:@0@:>@; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_hi=$ac_mid +-else +- as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-done +-case $ac_lo in @%:@(( +-?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +-'') ac_retval=1 ;; +-esac +- else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$4 +-static long int longval () { return $2; } +-static unsigned long int ulongval () { return $2; } +-@%:@include +-@%:@include +-int +-main () +-{ +- +- FILE *f = fopen ("conftest.val", "w"); +- if (! f) +- return 1; +- if (($2) < 0) +- { +- long int i = longval (); +- if (i != ($2)) +- return 1; +- fprintf (f, "%ld", i); +- } +- else +- { +- unsigned long int i = ulongval (); +- if (i != ($2)) +- return 1; +- fprintf (f, "%lu", i); +- } +- /* Do not output a trailing newline, as this causes \r\n confusion +- on some platforms. */ +- return ferror (f) || fclose (f) != 0; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- echo >>conftest.val; read $3 config.log <<_ACEOF +-This file contains any messages produced by compilers while +-running configure, to aid debugging if configure makes a mistake. +- +-It was created by GNU MP $as_me 6.0.0, which was +-generated by GNU Autoconf 2.69. Invocation command line was +- +- $ $0 $@ +- +-_ACEOF +-exec 5>>config.log +-{ +-cat <<_ASUNAME +-## --------- ## +-## Platform. ## +-## --------- ## +- +-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +-uname -m = `(uname -m) 2>/dev/null || echo unknown` +-uname -r = `(uname -r) 2>/dev/null || echo unknown` +-uname -s = `(uname -s) 2>/dev/null || echo unknown` +-uname -v = `(uname -v) 2>/dev/null || echo unknown` +- +-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` +- +-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +-/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` +- +-_ASUNAME +- +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- $as_echo "PATH: $as_dir" +- done +-IFS=$as_save_IFS +- +-} >&5 +- +-cat >&5 <<_ACEOF +- +- +-## ----------- ## +-## Core tests. ## +-## ----------- ## +- +-_ACEOF +- +- +-# Keep a trace of the command line. +-# Strip out --no-create and --no-recursion so they do not pile up. +-# Strip out --silent because we don't want to record it for future runs. +-# Also quote any args containing shell meta-characters. +-# Make two passes to allow for proper duplicate-argument suppression. +-ac_configure_args= +-ac_configure_args0= +-ac_configure_args1= +-ac_must_keep_next=false +-for ac_pass in 1 2 +-do +- for ac_arg +- do +- case $ac_arg in +- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; +- -q | -quiet | --quiet | --quie | --qui | --qu | --q \ +- | -silent | --silent | --silen | --sile | --sil) +- continue ;; +- *\'*) +- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; +- esac +- case $ac_pass in +- 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; +- 2) +- as_fn_append ac_configure_args1 " '$ac_arg'" +- if test $ac_must_keep_next = true; then +- ac_must_keep_next=false # Got value, back to normal. +- else +- case $ac_arg in +- *=* | --config-cache | -C | -disable-* | --disable-* \ +- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ +- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ +- | -with-* | --with-* | -without-* | --without-* | --x) +- case "$ac_configure_args0 " in +- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; +- esac +- ;; +- -* ) ac_must_keep_next=true ;; +- esac +- fi +- as_fn_append ac_configure_args " '$ac_arg'" +- ;; +- esac +- done +-done +-{ ac_configure_args0=; unset ac_configure_args0;} +-{ ac_configure_args1=; unset ac_configure_args1;} +- +-# When interrupted or exit'd, cleanup temporary files, and complete +-# config.log. We remove comments because anyway the quotes in there +-# would cause problems or look ugly. +-# WARNING: Use '\'' to represent an apostrophe within the trap. +-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +-trap 'exit_status=$? +- # Save into config.log some information that might help in debugging. +- { +- echo +- +- $as_echo "## ---------------- ## +-## Cache variables. ## +-## ---------------- ##" +- echo +- # The following way of writing the cache mishandles newlines in values, +-( +- for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do +- eval ac_val=\$$ac_var +- case $ac_val in #( +- *${as_nl}*) +- case $ac_var in #( +- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; +- esac +- case $ac_var in #( +- _ | IFS | as_nl) ;; #( +- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( +- *) { eval $ac_var=; unset $ac_var;} ;; +- esac ;; +- esac +- done +- (set) 2>&1 | +- case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( +- *${as_nl}ac_space=\ *) +- sed -n \ +- "s/'\''/'\''\\\\'\'''\''/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" +- ;; #( +- *) +- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" +- ;; +- esac | +- sort +-) +- echo +- +- $as_echo "## ----------------- ## +-## Output variables. ## +-## ----------------- ##" +- echo +- for ac_var in $ac_subst_vars +- do +- eval ac_val=\$$ac_var +- case $ac_val in +- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; +- esac +- $as_echo "$ac_var='\''$ac_val'\''" +- done | sort +- echo +- +- if test -n "$ac_subst_files"; then +- $as_echo "## ------------------- ## +-## File substitutions. ## +-## ------------------- ##" +- echo +- for ac_var in $ac_subst_files +- do +- eval ac_val=\$$ac_var +- case $ac_val in +- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; +- esac +- $as_echo "$ac_var='\''$ac_val'\''" +- done | sort +- echo +- fi +- +- if test -s confdefs.h; then +- $as_echo "## ----------- ## +-## confdefs.h. ## +-## ----------- ##" +- echo +- cat confdefs.h +- echo +- fi +- test "$ac_signal" != 0 && +- $as_echo "$as_me: caught signal $ac_signal" +- $as_echo "$as_me: exit $exit_status" +- } >&5 +- rm -f core *.core core.conftest.* && +- rm -f -r conftest* confdefs* conf$$* $ac_clean_files && +- exit $exit_status +-' 0 +-for ac_signal in 1 2 13 15; do +- trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +-done +-ac_signal=0 +- +-# confdefs.h avoids OS command line length limits that DEFS can exceed. +-rm -f -r conftest* confdefs.h +- +-$as_echo "/* confdefs.h */" > confdefs.h +- +-# Predefined preprocessor variables. +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_NAME "$PACKAGE_NAME" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_STRING "$PACKAGE_STRING" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +-_ACEOF +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE_URL "$PACKAGE_URL" +-_ACEOF +- +- +-# Let the site file select an alternate cache file if it wants to. +-# Prefer an explicitly selected file to automatically selected ones. +-ac_site_file1=NONE +-ac_site_file2=NONE +-if test -n "$CONFIG_SITE"; then +- # We do not want a PATH search for config.site. +- case $CONFIG_SITE in @%:@(( +- -*) ac_site_file1=./$CONFIG_SITE;; +- */*) ac_site_file1=$CONFIG_SITE;; +- *) ac_site_file1=./$CONFIG_SITE;; +- esac +-elif test "x$prefix" != xNONE; then +- ac_site_file1=$prefix/share/config.site +- ac_site_file2=$prefix/etc/config.site +-else +- ac_site_file1=$ac_default_prefix/share/config.site +- ac_site_file2=$ac_default_prefix/etc/config.site +-fi +-for ac_site_file in "$ac_site_file1" "$ac_site_file2" +-do +- test "x$ac_site_file" = xNONE && continue +- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +-$as_echo "$as_me: loading site script $ac_site_file" >&6;} +- sed 's/^/| /' "$ac_site_file" >&5 +- . "$ac_site_file" \ +- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "failed to load site script $ac_site_file +-See \`config.log' for more details" "$LINENO" 5; } +- fi +-done +- +-if test -r "$cache_file"; then +- # Some versions of bash will fail to source /dev/null (special files +- # actually), so we avoid doing that. DJGPP emulates it as a regular file. +- if test /dev/null != "$cache_file" && test -f "$cache_file"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +-$as_echo "$as_me: loading cache $cache_file" >&6;} +- case $cache_file in +- [\\/]* | ?:[\\/]* ) . "$cache_file";; +- *) . "./$cache_file";; +- esac +- fi +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +-$as_echo "$as_me: creating cache $cache_file" >&6;} +- >$cache_file +-fi +- +-# Check that the precious variables saved in the cache have kept the same +-# value. +-ac_cache_corrupted=false +-for ac_var in $ac_precious_vars; do +- eval ac_old_set=\$ac_cv_env_${ac_var}_set +- eval ac_new_set=\$ac_env_${ac_var}_set +- eval ac_old_val=\$ac_cv_env_${ac_var}_value +- eval ac_new_val=\$ac_env_${ac_var}_value +- case $ac_old_set,$ac_new_set in +- set,) +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} +- ac_cache_corrupted=: ;; +- ,set) +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} +- ac_cache_corrupted=: ;; +- ,);; +- *) +- if test "x$ac_old_val" != "x$ac_new_val"; then +- # differences in whitespace do not lead to failure. +- ac_old_val_w=`echo x $ac_old_val` +- ac_new_val_w=`echo x $ac_new_val` +- if test "$ac_old_val_w" != "$ac_new_val_w"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} +- ac_cache_corrupted=: +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} +- eval $ac_var=\$ac_old_val +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} +- fi;; +- esac +- # Pass precious variables to config.status. +- if test "$ac_new_set" = set; then +- case $ac_new_val in +- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; +- *) ac_arg=$ac_var=$ac_new_val ;; +- esac +- case " $ac_configure_args " in +- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. +- *) as_fn_append ac_configure_args " '$ac_arg'" ;; +- esac +- fi +-done +-if $ac_cache_corrupted; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} +- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +-fi +-## -------------------- ## +-## Main body of script. ## +-## -------------------- ## +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- +- +- +- +- +- +- +- +- +- +-# If --target is not used then $target_alias is empty, but if say +-# "./configure athlon-pc-freebsd3.5" is used, then all three of +-# $build_alias, $host_alias and $target_alias are set to +-# "athlon-pc-freebsd3.5". +-# +-if test -n "$target_alias" && test "$target_alias" != "$host_alias"; then +- as_fn_error $? "--target is not appropriate for GMP +-Use --build=CPU-VENDOR-OS if you need to specify your CPU and/or system +-explicitly. Use --host if cross-compiling (see \"Installing GMP\" in the +-manual for more on this)." "$LINENO" 5 +-fi +- +-gmp_configm4="config.m4" +-gmp_tmpconfigm4=cnfm4.tmp +-gmp_tmpconfigm4i=cnfm4i.tmp +-gmp_tmpconfigm4p=cnfm4p.tmp +-rm -f $gmp_tmpconfigm4 $gmp_tmpconfigm4i $gmp_tmpconfigm4p +- +-# CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir. +-# The pattern here tests for an absolute path the same way as +-# _AC_OUTPUT_FILES in autoconf acgeneral.m4. +-case $srcdir in +-[\\/]* | ?:[\\/]* ) tmp="$srcdir" ;; +-*) tmp="../$srcdir" ;; +-esac +-echo "define(,<\`$tmp'>)" >>$gmp_tmpconfigm4 +- +-# All CPUs use asm-defs.m4 +-echo "include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')" >>$gmp_tmpconfigm4i +- +- +-ac_aux_dir= +-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +- if test -f "$ac_dir/install-sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install-sh -c" +- break +- elif test -f "$ac_dir/install.sh"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/install.sh -c" +- break +- elif test -f "$ac_dir/shtool"; then +- ac_aux_dir=$ac_dir +- ac_install_sh="$ac_aux_dir/shtool install -c" +- break +- fi +-done +-if test -z "$ac_aux_dir"; then +- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +-fi +- +-# These three variables are undocumented and unsupported, +-# and are intended to be withdrawn in a future Autoconf release. +-# They can cause serious problems if a builder's source tree is in a directory +-# whose full name contains unusual characters. +-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +- +- +-# Make sure we can run config.sub. +-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || +- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +-$as_echo_n "checking build system type... " >&6; } +-if ${ac_cv_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_build_alias=$build_alias +-test "x$ac_build_alias" = x && +- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +-test "x$ac_build_alias" = x && +- as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +-$as_echo "$ac_cv_build" >&6; } +-case $ac_cv_build in +-*-*-*) ;; +-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +-esac +-build=$ac_cv_build +-ac_save_IFS=$IFS; IFS='-' +-set x $ac_cv_build +-shift +-build_cpu=$1 +-build_vendor=$2 +-shift; shift +-# Remember, the first character of IFS is used to create $*, +-# except with old shells: +-build_os=$* +-IFS=$ac_save_IFS +-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +-$as_echo_n "checking host system type... " >&6; } +-if ${ac_cv_host+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "x$host_alias" = x; then +- ac_cv_host=$ac_cv_build +-else +- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || +- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +-$as_echo "$ac_cv_host" >&6; } +-case $ac_cv_host in +-*-*-*) ;; +-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +-esac +-host=$ac_cv_host +-ac_save_IFS=$IFS; IFS='-' +-set x $ac_cv_host +-shift +-host_cpu=$1 +-host_vendor=$2 +-shift; shift +-# Remember, the first character of IFS is used to create $*, +-# except with old shells: +-host_os=$* +-IFS=$ac_save_IFS +-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac +- +- +- +-am__api_version='1.14' +- +-# Find a good install program. We prefer a C program (faster), +-# so one script is as good as another. But avoid the broken or +-# incompatible versions: +-# SysV /etc/install, /usr/sbin/install +-# SunOS /usr/etc/install +-# IRIX /sbin/install +-# AIX /bin/install +-# AmigaOS /C/install, which installs bootblocks on floppy discs +-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +-# AFS /usr/afsws/bin/install, which mishandles nonexistent args +-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +-# OS/2's system install, which has a completely different semantic +-# ./install, which can be erroneously created by make from ./install.sh. +-# Reject install programs that cannot install multiple files. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +-$as_echo_n "checking for a BSD-compatible install... " >&6; } +-if test -z "$INSTALL"; then +-if ${ac_cv_path_install+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- # Account for people who put trailing slashes in PATH elements. +-case $as_dir/ in @%:@(( +- ./ | .// | /[cC]/* | \ +- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ +- ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ +- /usr/ucb/* ) ;; +- *) +- # OSF1 and SCO ODT 3.0 have their own names for install. +- # Don't use installbsd from OSF since it installs stuff as root +- # by default. +- for ac_prog in ginstall scoinst install; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then +- if test $ac_prog = install && +- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # AIX install. It has an incompatible calling convention. +- : +- elif test $ac_prog = install && +- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # program-specific install script used by HP pwplus--don't use. +- : +- else +- rm -rf conftest.one conftest.two conftest.dir +- echo one > conftest.one +- echo two > conftest.two +- mkdir conftest.dir +- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && +- test -s conftest.one && test -s conftest.two && +- test -s conftest.dir/conftest.one && +- test -s conftest.dir/conftest.two +- then +- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" +- break 3 +- fi +- fi +- fi +- done +- done +- ;; +-esac +- +- done +-IFS=$as_save_IFS +- +-rm -rf conftest.one conftest.two conftest.dir +- +-fi +- if test "${ac_cv_path_install+set}" = set; then +- INSTALL=$ac_cv_path_install +- else +- # As a last resort, use the slow shell script. Don't cache a +- # value for INSTALL within a source directory, because that will +- # break other packages using the cache if that directory is +- # removed, or if the value is a relative name. +- INSTALL=$ac_install_sh +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +-$as_echo "$INSTALL" >&6; } +- +-# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +-# It thinks the first close brace ends the variable substitution. +-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' +- +-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' +- +-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +-$as_echo_n "checking whether build environment is sane... " >&6; } +-# Reject unsafe characters in $srcdir or the absolute working directory +-# name. Accept space and tab only in the latter. +-am_lf=' +-' +-case `pwd` in +- *[\\\"\#\$\&\'\`$am_lf]*) +- as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +-esac +-case $srcdir in +- *[\\\"\#\$\&\'\`$am_lf\ \ ]*) +- as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +-esac +- +-# Do 'set' in a subshell so we don't clobber the current shell's +-# arguments. Must try -L first in case configure is actually a +-# symlink; some systems play weird games with the mod time of symlinks +-# (eg FreeBSD returns the mod time of the symlink's containing +-# directory). +-if ( +- am_has_slept=no +- for am_try in 1 2; do +- echo "timestamp, slept: $am_has_slept" > conftest.file +- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` +- if test "$*" = "X"; then +- # -L didn't work. +- set X `ls -t "$srcdir/configure" conftest.file` +- fi +- if test "$*" != "X $srcdir/configure conftest.file" \ +- && test "$*" != "X conftest.file $srcdir/configure"; then +- +- # If neither matched, then we have a broken ls. This can happen +- # if, for instance, CONFIG_SHELL is bash and it inherits a +- # broken ls alias from the environment. This has actually +- # happened. Such a system could not be considered "sane". +- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +- alias in your environment" "$LINENO" 5 +- fi +- if test "$2" = conftest.file || test $am_try -eq 2; then +- break +- fi +- # Just in case. +- sleep 1 +- am_has_slept=yes +- done +- test "$2" = conftest.file +- ) +-then +- # Ok. +- : +-else +- as_fn_error $? "newly created file is older than distributed files! +-Check your system clock" "$LINENO" 5 +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-# If we didn't sleep, we still need to ensure time stamps of config.status and +-# generated files are strictly newer. +-am_sleep_pid= +-if grep 'slept: no' conftest.file >/dev/null 2>&1; then +- ( sleep 1 ) & +- am_sleep_pid=$! +-fi +- +-rm -f conftest.file +- +-test "$program_prefix" != NONE && +- program_transform_name="s&^&$program_prefix&;$program_transform_name" +-# Use a double $ so make ignores it. +-test "$program_suffix" != NONE && +- program_transform_name="s&\$&$program_suffix&;$program_transform_name" +-# Double any \ or $. +-# By default was `s,x,x', remove it if useless. +-ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +-program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` +- +-# expand $ac_aux_dir to an absolute path +-am_aux_dir=`cd $ac_aux_dir && pwd` +- +-if test x"${MISSING+set}" != xset; then +- case $am_aux_dir in +- *\ * | *\ *) +- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; +- *) +- MISSING="\${SHELL} $am_aux_dir/missing" ;; +- esac +-fi +-# Use eval to expand $SHELL +-if eval "$MISSING --is-lightweight"; then +- am_missing_run="$MISSING " +-else +- am_missing_run= +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +-$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +-fi +- +-if test x"${install_sh}" != xset; then +- case $am_aux_dir in +- *\ * | *\ *) +- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; +- *) +- install_sh="\${SHELL} $am_aux_dir/install-sh" +- esac +-fi +- +-# Installed binaries are usually stripped using 'strip' when the user +-# run "make install-strip". However 'strip' might not be the right +-# tool to use in cross-compilation environments, therefore Automake +-# will honor the 'STRIP' environment variable to overrule this program. +-if test "$cross_compiling" != no; then +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +-set dummy ${ac_tool_prefix}strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$STRIP"; then +- ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_STRIP="${ac_tool_prefix}strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-STRIP=$ac_cv_prog_STRIP +-if test -n "$STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +-$as_echo "$STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_STRIP"; then +- ac_ct_STRIP=$STRIP +- # Extract the first word of "strip", so it can be a program name with args. +-set dummy strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_STRIP"; then +- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_STRIP="strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +-if test -n "$ac_ct_STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +-$as_echo "$ac_ct_STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_STRIP" = x; then +- STRIP=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- STRIP=$ac_ct_STRIP +- fi +-else +- STRIP="$ac_cv_prog_STRIP" +-fi +- +-fi +-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +-$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +-if test -z "$MKDIR_P"; then +- if ${ac_cv_path_mkdir+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in mkdir gmkdir; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue +- case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( +- 'mkdir (GNU coreutils) '* | \ +- 'mkdir (coreutils) '* | \ +- 'mkdir (fileutils) '4.1*) +- ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext +- break 3;; +- esac +- done +- done +- done +-IFS=$as_save_IFS +- +-fi +- +- test -d ./--version && rmdir ./--version +- if test "${ac_cv_path_mkdir+set}" = set; then +- MKDIR_P="$ac_cv_path_mkdir -p" +- else +- # As a last resort, use the slow shell script. Don't cache a +- # value for MKDIR_P within a source directory, because that will +- # break other packages using the cache if that directory is +- # removed, or if the value is a relative name. +- MKDIR_P="$ac_install_sh -d" +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +-$as_echo "$MKDIR_P" >&6; } +- +-for ac_prog in gawk mawk nawk awk +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AWK+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AWK"; then +- ac_cv_prog_AWK="$AWK" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AWK="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AWK=$ac_cv_prog_AWK +-if test -n "$AWK"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +-$as_echo "$AWK" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$AWK" && break +-done +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +-set x ${MAKE-make} +-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.make <<\_ACEOF +-SHELL = /bin/sh +-all: +- @echo '@@@%%%=$(MAKE)=@@@%%%' +-_ACEOF +-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +-case `${MAKE-make} -f conftest.make 2>/dev/null` in +- *@@@%%%=?*=@@@%%%*) +- eval ac_cv_prog_make_${ac_make}_set=yes;; +- *) +- eval ac_cv_prog_make_${ac_make}_set=no;; +-esac +-rm -f conftest.make +-fi +-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- SET_MAKE= +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- SET_MAKE="MAKE=${MAKE-make}" +-fi +- +-rm -rf .tst 2>/dev/null +-mkdir .tst 2>/dev/null +-if test -d .tst; then +- am__leading_dot=. +-else +- am__leading_dot=_ +-fi +-rmdir .tst 2>/dev/null +- +-@%:@ Check whether --enable-silent-rules was given. +-if test "${enable_silent_rules+set}" = set; then : +- enableval=$enable_silent_rules; +-fi +- +-case $enable_silent_rules in @%:@ ((( +- yes) AM_DEFAULT_VERBOSITY=0;; +- no) AM_DEFAULT_VERBOSITY=1;; +- *) AM_DEFAULT_VERBOSITY=1;; +-esac +-am_make=${MAKE-make} +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +-$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +-if ${am_cv_make_support_nested_variables+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if $as_echo 'TRUE=$(BAR$(V)) +-BAR0=false +-BAR1=true +-V=1 +-am__doit: +- @$(TRUE) +-.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then +- am_cv_make_support_nested_variables=yes +-else +- am_cv_make_support_nested_variables=no +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +-$as_echo "$am_cv_make_support_nested_variables" >&6; } +-if test $am_cv_make_support_nested_variables = yes; then +- AM_V='$(V)' +- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +-else +- AM_V=$AM_DEFAULT_VERBOSITY +- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +-fi +-AM_BACKSLASH='\' +- +-if test "`cd $srcdir && pwd`" != "`pwd`"; then +- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output +- # is not polluted with repeated "-I." +- am__isrc=' -I$(srcdir)' +- # test to see if srcdir already configured +- if test -f $srcdir/config.status; then +- as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +- fi +-fi +- +-# test whether we have cygpath +-if test -z "$CYGPATH_W"; then +- if (cygpath --version) >/dev/null 2>/dev/null; then +- CYGPATH_W='cygpath -w' +- else +- CYGPATH_W=echo +- fi +-fi +- +- +-# Define the identity of the package. +- PACKAGE='gmp' +- VERSION='6.0.0' +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define PACKAGE "$PACKAGE" +-_ACEOF +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define VERSION "$VERSION" +-_ACEOF +- +-# Some tools Automake needs. +- +-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} +- +- +-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} +- +- +-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} +- +- +-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} +- +- +-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} +- +-# For better backward compatibility. To be removed once Automake 1.9.x +-# dies out for good. For more background, see: +-# +-# +-mkdir_p='$(MKDIR_P)' +- +-# We need awk for the "check" target. The system "awk" is bad on +-# some platforms. +-# Always define AMTAR for backward compatibility. Yes, it's still used +-# in the wild :-( We should find a proper way to deprecate it ... +-AMTAR='$${TAR-tar}' +- +- +-# We'll loop over all known methods to create a tar archive until one works. +-_am_tools='gnutar pax cpio none' +- +-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' +- +- +- +- +- +- +-# POSIX will say in a future version that running "rm -f" with no argument +-# is OK; and we want to be able to make that assumption in our Makefile +-# recipes. So use an aggressive probe to check that the usage we want is +-# actually supported "in the wild" to an acceptable degree. +-# See automake bug#10828. +-# To make any issue more visible, cause the running configure to be aborted +-# by default if the 'rm' program in use doesn't match our expectations; the +-# user can still override this though. +-if rm -f && rm -fr && rm -rf; then : OK; else +- cat >&2 <<'END' +-Oops! +- +-Your 'rm' program seems unable to run without file operands specified +-on the command line, even when the '-f' option is present. This is contrary +-to the behaviour of most rm programs out there, and not conforming with +-the upcoming POSIX standard: +- +-Please tell bug-automake@gnu.org about your system, including the value +-of your $PATH and any error possibly output before this message. This +-can help us improve future automake versions. +- +-END +- if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then +- echo 'Configuration will proceed anyway, since you have set the' >&2 +- echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 +- echo >&2 +- else +- cat >&2 <<'END' +-Aborting the configuration process, to ensure you take notice of the issue. +- +-You can download and install GNU coreutils to get an 'rm' implementation +-that behaves properly: . +- +-If you want to complete the configuration process using your problematic +-'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +-to "yes", and re-run configure. +- +-END +- as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 +- fi +-fi +- +-ac_config_headers="$ac_config_headers config.h:config.in" +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } +- @%:@ Check whether --enable-maintainer-mode was given. +-if test "${enable_maintainer_mode+set}" = set; then : +- enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +-else +- USE_MAINTAINER_MODE=no +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +-$as_echo "$USE_MAINTAINER_MODE" >&6; } +- if test $USE_MAINTAINER_MODE = yes; then +- MAINTAINER_MODE_TRUE= +- MAINTAINER_MODE_FALSE='#' +-else +- MAINTAINER_MODE_TRUE='#' +- MAINTAINER_MODE_FALSE= +-fi +- +- MAINT=$MAINTAINER_MODE_TRUE +- +- +- +- +-@%:@ Check whether --enable-assert was given. +-if test "${enable_assert+set}" = set; then : +- enableval=$enable_assert; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-assert, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_assert=no +-fi +- +- +-if test "$enable_assert" = "yes"; then +- +-$as_echo "@%:@define WANT_ASSERT 1" >>confdefs.h +- +- want_assert_01=1 +-else +- want_assert_01=0 +-fi +- +-echo "define(,$want_assert_01)" >> $gmp_tmpconfigm4 +- +- +- +-@%:@ Check whether --enable-alloca was given. +-if test "${enable_alloca+set}" = set; then : +- enableval=$enable_alloca; case $enableval in +-alloca|malloc-reentrant|malloc-notreentrant) ;; +-yes|no|reentrant|notreentrant) ;; +-debug) ;; +-*) +- as_fn_error $? "bad value $enableval for --enable-alloca, need one of: +-yes no reentrant notreentrant alloca malloc-reentrant malloc-notreentrant debug" "$LINENO" 5 ;; +-esac +-else +- enable_alloca=reentrant +-fi +- +- +- +-# IMPROVE ME: The default for C++ is disabled. The tests currently +-# performed below for a working C++ compiler are not particularly strong, +-# and in general can't be expected to get the right setup on their own. The +-# most significant problem is getting the ABI the same. Defaulting CXXFLAGS +-# to CFLAGS takes only a small step towards this. It's also probably worth +-# worrying whether the C and C++ runtimes from say gcc and a vendor C++ can +-# work together. Some rather broken C++ installations were encountered +-# during testing, and though such things clearly aren't GMP's problem, if +-# --enable-cxx=detect were to be the default then some careful checks of +-# which, if any, C++ compiler on the system is up to scratch would be +-# wanted. +-# +-@%:@ Check whether --enable-cxx was given. +-if test "${enable_cxx+set}" = set; then : +- enableval=$enable_cxx; case $enableval in +-yes|no|detect) ;; +-*) as_fn_error $? "bad value $enableval for --enable-cxx, need yes/no/detect" "$LINENO" 5 ;; +-esac +-else +- enable_cxx=no +-fi +- +- +- +-@%:@ Check whether --enable-assembly was given. +-if test "${enable_assembly+set}" = set; then : +- enableval=$enable_assembly; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-assembly, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_assembly=yes +-fi +- +- +-if test "$enable_assembly" = "yes"; then +- +-$as_echo "@%:@define WANT_ASSEMBLY 1" >>confdefs.h +- +-fi +- +- +-@%:@ Check whether --enable-fft was given. +-if test "${enable_fft+set}" = set; then : +- enableval=$enable_fft; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-fft, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_fft=yes +-fi +- +- +-if test "$enable_fft" = "yes"; then +- +-$as_echo "@%:@define WANT_FFT 1" >>confdefs.h +- +-fi +- +- +-@%:@ Check whether --enable-old-fft-full was given. +-if test "${enable_old_fft_full+set}" = set; then : +- enableval=$enable_old_fft_full; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-old-fft-full, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_old_fft_full=no +-fi +- +- +-if test "$enable_old_fft_full" = "yes"; then +- +-$as_echo "@%:@define WANT_OLD_FFT_FULL 1" >>confdefs.h +- +-fi +- +- +-@%:@ Check whether --enable-nails was given. +-if test "${enable_nails+set}" = set; then : +- enableval=$enable_nails; case $enableval in +-yes|no|[02468]|[0-9][02468]) ;; +-*[13579]) +- as_fn_error $? "bad value $enableval for --enable-nails, only even nail sizes supported" "$LINENO" 5 ;; +-*) +- as_fn_error $? "bad value $enableval for --enable-nails, need yes/no/number" "$LINENO" 5 ;; +-esac +-else +- enable_nails=no +-fi +- +- +-case $enable_nails in +-yes) GMP_NAIL_BITS=2 ;; +-no) GMP_NAIL_BITS=0 ;; +-*) GMP_NAIL_BITS=$enable_nails ;; +-esac +- +- +- +-@%:@ Check whether --enable-profiling was given. +-if test "${enable_profiling+set}" = set; then : +- enableval=$enable_profiling; case $enableval in +-no|prof|gprof|instrument) ;; +-*) as_fn_error $? "bad value $enableval for --enable-profiling, need no/prof/gprof/instrument" "$LINENO" 5 ;; +-esac +-else +- enable_profiling=no +-fi +- +- +-case $enable_profiling in +- prof) +- +-$as_echo "@%:@define WANT_PROFILING_PROF 1" >>confdefs.h +- +- ;; +- gprof) +- +-$as_echo "@%:@define WANT_PROFILING_GPROF 1" >>confdefs.h +- +- ;; +- instrument) +- +-$as_echo "@%:@define WANT_PROFILING_INSTRUMENT 1" >>confdefs.h +- +- ;; +-esac +- +- +-echo "define(,<\`$enable_profiling'>)" >> $gmp_tmpconfigm4 +- +- +-# -fomit-frame-pointer is incompatible with -pg on some chips +-if test "$enable_profiling" = gprof; then +- fomit_frame_pointer= +-else +- fomit_frame_pointer="-fomit-frame-pointer" +-fi +- +- +- +-@%:@ Check whether --with-readline was given. +-if test "${with_readline+set}" = set; then : +- withval=$with_readline; case $withval in +-yes|no|detect) ;; +-*) as_fn_error $? "bad value $withval for --with-readline, need yes/no/detect" "$LINENO" 5 ;; +-esac +-else +- with_readline=detect +-fi +- +- +- +-@%:@ Check whether --enable-fat was given. +-if test "${enable_fat+set}" = set; then : +- enableval=$enable_fat; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-fat, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_fat=no +-fi +- +- +- +-@%:@ Check whether --enable-minithres was given. +-if test "${enable_minithres+set}" = set; then : +- enableval=$enable_minithres; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-minithres, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_minithres=no +-fi +- +- +- +-@%:@ Check whether --enable-fake-cpuid was given. +-if test "${enable_fake_cpuid+set}" = set; then : +- enableval=$enable_fake_cpuid; case $enableval in +-yes|no) ;; +-*) as_fn_error $? "bad value $enableval for --enable-fake-cpuid, need yes or no" "$LINENO" 5 ;; +-esac +-else +- enable_fake_cpuid=no +-fi +- +- +-if test "$enable_fake_cpuid" = "yes"; then +- +-$as_echo "@%:@define WANT_FAKE_CPUID 1" >>confdefs.h +- +-fi +- +- +-if test $enable_fat = yes && test $enable_assembly = no ; then +- as_fn_error $? "when doing a fat build, disabling assembly will not work" "$LINENO" 5 +-fi +- +-if test $enable_fake_cpuid = yes && test $enable_fat = no ; then +- as_fn_error $? "--enable-fake-cpuid requires --enable-fat" "$LINENO" 5 +-fi +- +- +-tmp_host=`echo $host_cpu | sed 's/\./_/'` +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_$tmp_host 1 +-_ACEOF +- +- +-echo "define_not_for_expansion(\`HAVE_HOST_CPU_$tmp_host')" >> $gmp_tmpconfigm4p +- +- +- +- +- +- +-# Table of compilers, options, and mpn paths. This code has various related +-# purposes +-# +-# - better default CC/CFLAGS selections than autoconf otherwise gives +-# - default CC/CFLAGS selections for extra CPU types specific to GMP +-# - a few tests for known bad compilers +-# - choice of ABIs on suitable systems +-# - selection of corresponding mpn search path +-# +-# After GMP specific searches and tests, the standard autoconf AC_PROG_CC is +-# called. User selections of CC etc are respected. +-# +-# Care is taken not to use macros like AC_TRY_COMPILE during the GMP +-# pre-testing, since they of course depend on AC_PROG_CC, and also some of +-# them cache their results, which is not wanted. +-# +-# The ABI selection mechanism is unique to GMP. All that reaches autoconf +-# is a different selection of CC/CFLAGS according to the best ABI the system +-# supports, and/or what the user selects. Naturally the mpn assembler code +-# selected is very dependent on the ABI. +-# +-# The closest the standard tools come to a notion of ABI is something like +-# "sparc64" which encodes a CPU and an ABI together. This doesn't seem to +-# scale well for GMP, where exact CPU types like "ultrasparc2" are wanted, +-# separate from the ABI used on them. +-# +-# +-# The variables set here are +-# +-# cclist the compiler choices +-# xx_cflags flags for compiler xx +-# xx_cflags_maybe flags for compiler xx, if they work +-# xx_cppflags cpp flags for compiler xx +-# xx_cflags_optlist list of sets of optional flags +-# xx_cflags_yyy set yyy of optional flags for compiler xx +-# xx_ldflags -Wc,-foo flags for libtool linking with compiler xx +-# ar_flags extra flags for $AR +-# nm_flags extra flags for $NM +-# limb limb size, can be "longlong" +-# path mpn search path +-# extra_functions extra mpn functions +-# fat_path fat binary mpn search path [if fat binary desired] +-# fat_functions fat functions +-# fat_thresholds fat thresholds +-# +-# Suppose xx_cflags_optlist="arch", then flags from $xx_cflags_arch are +-# tried, and the first flag that works will be used. An optlist like "arch +-# cpu optimize" can be used to get multiple independent sets of flags tried. +-# The first that works from each will be used. If no flag in a set works +-# then nothing from that set is added. +-# +-# For multiple ABIs, the scheme extends as follows. +-# +-# abilist set of ABI choices +-# cclist_aa compiler choices in ABI aa +-# xx_aa_cflags flags for xx in ABI aa +-# xx_aa_cflags_maybe flags for xx in ABI aa, if they work +-# xx_aa_cppflags cpp flags for xx in ABI aa +-# xx_aa_cflags_optlist list of sets of optional flags in ABI aa +-# xx_aa_cflags_yyy set yyy of optional flags for compiler xx in ABI aa +-# xx_aa_ldflags -Wc,-foo flags for libtool linking +-# ar_aa_flags extra flags for $AR in ABI aa +-# nm_aa_flags extra flags for $NM in ABI aa +-# limb_aa limb size in ABI aa, can be "longlong" +-# path_aa mpn search path in ABI aa +-# extra_functions_aa extra mpn functions in ABI aa +-# +-# As a convenience, the unadorned xx_cflags (etc) are used for the last ABI +-# in ablist, if an xx_aa_cflags for that ABI isn't given. For example if +-# abilist="64 32" then $cc_64_cflags will be used for the 64-bit ABI, but +-# for the 32-bit either $cc_32_cflags or $cc_cflags is used, whichever is +-# defined. This makes it easy to add some 64-bit compilers and flags to an +-# unadorned 32-bit set. +-# +-# limb=longlong (or limb_aa=longlong) applies to all compilers within that +-# ABI. It won't work to have some needing long long and some not, since a +-# single instantiated gmp.h will be used by both. +-# +-# SPEED_CYCLECOUNTER, cyclecounter_size and CALLING_CONVENTIONS_OBJS are +-# also set here, with an ABI suffix. +-# +-# +-# +-# A table-driven approach like this to mapping cpu type to good compiler +-# options is a bit of a maintenance burden, but there's not much uniformity +-# between options specifications on different compilers. Some sort of +-# separately updatable tool might be cute. +-# +-# The use of lots of variables like this, direct and indirect, tends to +-# obscure when and how various things are done, but unfortunately it's +-# pretty much the only way. If shell subroutines were portable then actual +-# code like "if this .. do that" could be written, but attempting the same +-# with full copies of GMP_PROG_CC_WORKS etc expanded at every point would +-# hugely bloat the output. +- +- +- +- +-# abilist needs to be non-empty, "standard" is just a generic name here +-abilist="standard" +- +-# FIXME: We'd like to prefer an ANSI compiler, perhaps by preferring +-# c89 over cc here. But note that on HP-UX c89 provides a castrated +-# environment, and would want to be excluded somehow. Maybe +-# AC_PROG_CC_STDC already does enough to stick cc into ANSI mode and +-# we don't need to worry. +-# +-cclist="gcc cc" +- +-gcc_cflags="-O2 -pedantic" +-gcc_64_cflags="-O2 -pedantic" +-cc_cflags="-O" +-cc_64_cflags="-O" +- +-SPEED_CYCLECOUNTER_OBJ= +-cyclecounter_size=2 +- +-HAVE_HOST_CPU_FAMILY_power=0 +- +-HAVE_HOST_CPU_FAMILY_powerpc=0 +- +- +-case $host in +- +- alpha*-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_alpha 1" >>confdefs.h +- +- case $host_cpu in +- alphaev5* | alphapca5*) +- path="alpha/ev5 alpha" ;; +- alphaev67 | alphaev68 | alphaev7*) +- path="alpha/ev67 alpha/ev6 alpha" ;; +- alphaev6) +- path="alpha/ev6 alpha" ;; +- *) +- path="alpha" ;; +- esac +- if test "$enable_assembly" = "yes" ; then +- extra_functions="cntlz" +- fi +- gcc_cflags_optlist="asm cpu oldas" # need asm ahead of cpu, see below +- gcc_cflags_maybe="-mieee" +- gcc_cflags_oldas="-Wa,-oldas" # see GMP_GCC_WA_OLDAS. +- +- # gcc 2.7.2.3 doesn't know any -mcpu= for alpha, apparently. +- # gcc 2.95 knows -mcpu= ev4, ev5, ev56, pca56, ev6. +- # gcc 3.0 adds nothing. +- # gcc 3.1 adds ev45, ev67 (but ev45 is the same as ev4). +- # gcc 3.2 adds nothing. +- # +- # gcc version "2.9-gnupro-99r1" under "-O2 -mcpu=ev6" strikes internal +- # compiler errors too easily and is rejected by GMP_PROG_CC_WORKS. Each +- # -mcpu=ev6 below has a fallback to -mcpu=ev56 for this reason. +- # +- case $host_cpu in +- alpha) gcc_cflags_cpu="-mcpu=ev4" ;; +- alphaev5) gcc_cflags_cpu="-mcpu=ev5" ;; +- alphaev56) gcc_cflags_cpu="-mcpu=ev56" ;; +- alphapca56 | alphapca57) +- gcc_cflags_cpu="-mcpu=pca56" ;; +- alphaev6) gcc_cflags_cpu="-mcpu=ev6 -mcpu=ev56" ;; +- alphaev67 | alphaev68 | alphaev7*) +- gcc_cflags_cpu="-mcpu=ev67 -mcpu=ev6 -mcpu=ev56" ;; +- esac +- +- # gcc version "2.9-gnupro-99r1" on alphaev68-dec-osf5.1 has been seen +- # accepting -mcpu=ev6, but not putting the assembler in the right mode +- # for what it produces. We need to do this for it, and need to do it +- # before testing the -mcpu options. +- # +- # On old versions of gcc, which don't know -mcpu=, we believe an +- # explicit -Wa,-mev5 etc will be necessary to put the assembler in +- # the right mode for our .asm files and longlong.h asm blocks. +- # +- # On newer versions of gcc, when -mcpu= is known, we must give a -Wa +- # which is at least as high as the code gcc will generate. gcc +- # establishes what it needs with a ".arch" directive, our command line +- # option seems to override that. +- # +- # gas prior to 2.14 doesn't accept -mev67, but -mev6 seems enough for +- # ctlz and cttz (in 2.10.0 at least). +- # +- # OSF `as' accepts ev68 but stupidly treats it as ev4. -arch only seems +- # to affect insns like ldbu which are expanded as macros when necessary. +- # Insns like ctlz which were never available as macros are always +- # accepted and always generate their plain code. +- # +- case $host_cpu in +- alpha) gcc_cflags_asm="-Wa,-arch,ev4 -Wa,-mev4" ;; +- alphaev5) gcc_cflags_asm="-Wa,-arch,ev5 -Wa,-mev5" ;; +- alphaev56) gcc_cflags_asm="-Wa,-arch,ev56 -Wa,-mev56" ;; +- alphapca56 | alphapca57) +- gcc_cflags_asm="-Wa,-arch,pca56 -Wa,-mpca56" ;; +- alphaev6) gcc_cflags_asm="-Wa,-arch,ev6 -Wa,-mev6" ;; +- alphaev67 | alphaev68 | alphaev7*) +- gcc_cflags_asm="-Wa,-arch,ev67 -Wa,-mev67 -Wa,-arch,ev6 -Wa,-mev6" ;; +- esac +- +- # It might be better to ask "cc" whether it's Cray C or DEC C, +- # instead of relying on the OS part of $host. But it's hard to +- # imagine either of those compilers anywhere except their native +- # systems. +- # +- +-echo "include_mpn(\`alpha/alpha-defs.m4')" >> $gmp_tmpconfigm4i +- +- case $host in +- *-cray-unicos*) +- cc_cflags="-O" # no -g, it silently disables all optimizations +- +-echo "include_mpn(\`alpha/unicos.m4')" >> $gmp_tmpconfigm4i +- +- # Don't perform any assembly syntax tests on this beast. +- gmp_asm_syntax_testing=no +- ;; +- *-*-osf*) +- +-echo "include_mpn(\`alpha/default.m4')" >> $gmp_tmpconfigm4i +- +- cc_cflags="" +- cc_cflags_optlist="opt cpu" +- +- # not sure if -fast works on old versions, so make it optional +- cc_cflags_opt="-fast -O2" +- +- # DEC C V5.9-005 knows ev4, ev5, ev56, pca56, ev6. +- # Compaq C V6.3-029 adds ev67. +- # +- case $host_cpu in +- alpha) cc_cflags_cpu="-arch~ev4~-tune~ev4" ;; +- alphaev5) cc_cflags_cpu="-arch~ev5~-tune~ev5" ;; +- alphaev56) cc_cflags_cpu="-arch~ev56~-tune~ev56" ;; +- alphapca56 | alphapca57) +- cc_cflags_cpu="-arch~pca56~-tune~pca56" ;; +- alphaev6) cc_cflags_cpu="-arch~ev6~-tune~ev6" ;; +- alphaev67 | alphaev68 | alphaev7*) +- cc_cflags_cpu="-arch~ev67~-tune~ev67 -arch~ev6~-tune~ev6" ;; +- esac +- ;; +- *) +- +-echo "include_mpn(\`alpha/default.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- esac +- +- case $host in +- *-*-unicos*) +- # tune/alpha.asm assumes int==4bytes but unicos uses int==8bytes +- ;; +- *) +- SPEED_CYCLECOUNTER_OBJ=alpha.lo +- cyclecounter_size=1 ;; +- esac +- ;; +- +- +- # Cray vector machines. +- # This must come after alpha* so that we can recognize present and future +- # vector processors with a wildcard. +- *-cray-unicos*) +- gmp_asm_syntax_testing=no +- cclist="cc" +- # We used to have -hscalar0 here as a workaround for miscompilation of +- # mpz/import.c, but let's hope Cray fixes their bugs instead, since +- # -hscalar0 causes disastrously poor code to be generated. +- cc_cflags="-O3 -hnofastmd -htask0 -Wa,-B" +- path="cray" +- ;; +- +- +- arm64*-*-* | aarch64*-*-*) +- path="arm64" +- ;; +- +- +- arm*-*-*) +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_cflags_optlist="arch neon tune" +- gcc_cflags_maybe="-marm" +- gcc_testlist="gcc-arm-umodsi" +- +-echo "include_mpn(\`arm/arm-defs.m4')" >> $gmp_tmpconfigm4i +- +- CALLING_CONVENTIONS_OBJS='arm32call.lo arm32check.lo' +- +- # FIXME: We make mandatory compiler options optional here. We should +- # either enforce them, or organise to strip paths as the corresponding +- # options fail. +- case $host_cpu in +- armsa1 | arm9tdmi | armv4*) +- path="arm" +- gcc_cflags_arch="-march=armv4" +- ;; +- armxscale | arm9te | arm10 | armv5*) +- path="arm/v5 arm" +- gcc_cflags_arch="-march=armv5" +- ;; +- arm11mpcore | arm1136 | arm1176 | armv6*) +- path="arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv6" +- ;; +- arm1156) +- path="arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv6t2" +- ;; +- armcortexa5 | armv7a*) +- path="arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- ;; +- armcortexa8) +- path="arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_tune="-mtune=cortex-a8" +- ;; +- armcortexa8neon) +- path="arm/v6t2 arm/v6 arm/v5 arm/neon arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_neon="-mfpu=neon" +- gcc_cflags_tune="-mtune=cortex-a8" +- ;; +- armcortexa9) +- path="arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_tune="-mtune=cortex-a9" +- ;; +- armcortexa9neon) +- path="arm/v7a/cora9 arm/v6t2 arm/v6 arm/v5 arm/neon arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_neon="-mfpu=neon" +- gcc_cflags_tune="-mtune=cortex-a9" +- ;; +- armcortexa15) +- path="arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_tune="-mtune=cortex-a15 -mtune=cortex-a9" +- ;; +- armcortexa15neon) +- path="arm/v7a/cora15/neon arm/v7a/cora15 arm/v6t2 arm/v6 arm/v5 arm/neon arm" +- gcc_cflags_arch="-march=armv7-a" +- gcc_cflags_neon="-mfpu=neon" +- gcc_cflags_tune="-mtune=cortex-a15 -mtune=cortex-a9" +- ;; +- *) +- path="arm" +- ;; +- esac +- ;; +- +- +- # Fujitsu +- f30[01]-fujitsu-sysv*) +- cclist="gcc vcc" +- # FIXME: flags for vcc? +- vcc_cflags="-g" +- path="fujitsu" +- ;; +- +- +- hppa*-*-*) +- # HP cc (the one sold separately) is K&R by default, but AM_C_PROTOTYPES +- # will add "-Ae", or "-Aa -D_HPUX_SOURCE", to put it into ansi mode, if +- # possible. +- # +- # gcc for hppa 2.0 can be built either for 2.0n (32-bit) or 2.0w +- # (64-bit), but not both, so there's no option to choose the desired +- # mode, we must instead detect which of the two it is. This is done by +- # checking sizeof(long), either 4 or 8 bytes respectively. Do this in +- # ABI=1.0 too, in case someone tries to build that with a 2.0w gcc. +- # +- gcc_cflags_optlist="arch" +- gcc_testlist="sizeof-long-4" +- SPEED_CYCLECOUNTER_OBJ=hppa.lo +- cyclecounter_size=1 +- +- # FIXME: For hppa2.0*, path should be "pa32/hppa2_0 pa32/hppa1_1 pa32". +- # (Can't remember why this isn't done already, have to check what .asm +- # files are available in each and how they run on a typical 2.0 cpu.) +- # +- case $host_cpu in +- hppa1.0*) path="pa32" ;; +- hppa7000*) path="pa32/hppa1_1 pa32" ;; +- hppa2.0* | hppa64) +- path="pa32/hppa2_0 pa32/hppa1_1/pa7100 pa32/hppa1_1 pa32" ;; +- *) # default to 7100 +- path="pa32/hppa1_1/pa7100 pa32/hppa1_1 pa32" ;; +- esac +- +- # gcc 2.7.2.3 knows -mpa-risc-1-0 and -mpa-risc-1-1 +- # gcc 2.95 adds -mpa-risc-2-0, plus synonyms -march=1.0, 1.1 and 2.0 +- # +- # We don't use -mpa-risc-2-0 in ABI=1.0 because 64-bit registers may not +- # be saved by the kernel on an old system. Actually gcc (as of 3.2) +- # only adds a few float instructions with -mpa-risc-2-0, so it would +- # probably be safe, but let's not take the chance. In any case, a +- # configuration like --host=hppa2.0 ABI=1.0 is far from optimal. +- # +- case $host_cpu in +- hppa1.0*) gcc_cflags_arch="-mpa-risc-1-0" ;; +- *) # default to 7100 +- gcc_cflags_arch="-mpa-risc-1-1" ;; +- esac +- +- case $host_cpu in +- hppa1.0*) cc_cflags="+O2" ;; +- *) # default to 7100 +- cc_cflags="+DA1.1 +O2" ;; +- esac +- +- case $host in +- hppa2.0*-*-* | hppa64-*-*) +- cclist_20n="gcc cc" +- abilist="2.0n 1.0" +- path_20n="pa64" +- limb_20n=longlong +- any_20n_testlist="sizeof-long-4" +- SPEED_CYCLECOUNTER_OBJ_20n=hppa2.lo +- cyclecounter_size_20n=2 +- +- # -mpa-risc-2-0 is only an optional flag, in case an old gcc is +- # used. Assembler support for 2.0 is essential though, for our asm +- # files. +- gcc_20n_cflags="$gcc_cflags" +- gcc_20n_cflags_optlist="arch" +- gcc_20n_cflags_arch="-mpa-risc-2-0 -mpa-risc-1-1" +- gcc_20n_testlist="sizeof-long-4 hppa-level-2.0" +- +- cc_20n_cflags="+DA2.0 +e +O2 -Wl,+vnocompatwarnings" +- cc_20n_testlist="hpc-hppa-2-0" +- +- # ABI=2.0w is available for hppa2.0w and hppa2.0, but not for +- # hppa2.0n, on the assumption that that the latter indicates a +- # desire for ABI=2.0n. +- case $host in +- hppa2.0n-*-*) ;; +- *) +- # HPUX 10 and earlier cannot run 2.0w. Not sure about other +- # systems (GNU/Linux for instance), but lets assume they're ok. +- case $host in +- *-*-hpux[1-9] | *-*-hpux[1-9].* | *-*-hpux10 | *-*-hpux10.*) ;; +- *-*-linux*) abilist="1.0" ;; # due to linux permanent kernel bug +- *) abilist="2.0w $abilist" ;; +- esac +- +- cclist_20w="gcc cc" +- gcc_20w_cflags="$gcc_cflags -mpa-risc-2-0" +- cc_20w_cflags="+DD64 +O2" +- cc_20w_testlist="hpc-hppa-2-0" +- path_20w="pa64" +- any_20w_testlist="sizeof-long-8" +- SPEED_CYCLECOUNTER_OBJ_20w=hppa2w.lo +- cyclecounter_size_20w=2 +- ;; +- esac +- ;; +- esac +- ;; +- +- +- ia64*-*-* | itanium-*-* | itanium2-*-*) +- abilist="64" +- +-echo "include_mpn(\`ia64/ia64-defs.m4')" >> $gmp_tmpconfigm4i +- +- SPEED_CYCLECOUNTER_OBJ=ia64.lo +- any_32_testlist="sizeof-long-4" +- +- case $host_cpu in +- itanium) path="ia64/itanium ia64" ;; +- itanium2) path="ia64/itanium2 ia64" ;; +- *) path="ia64" ;; +- esac +- +- gcc_64_cflags_optlist="tune" +- gcc_32_cflags_optlist=$gcc_64_cflags_optlist +- +- # gcc pre-release 3.4 adds -mtune itanium and itanium2 +- case $host_cpu in +- itanium) gcc_cflags_tune="-mtune=itanium" ;; +- itanium2) gcc_cflags_tune="-mtune=itanium2" ;; +- esac +- +- case $host in +- *-*-linux*) +- cclist="gcc icc" +- icc_cflags="-no-gcc" +- icc_cflags_optlist="opt" +- # Don't use -O3, it is for "large data sets" and also miscompiles GMP. +- # But icc miscompiles GMP at any optimization level, at higher levels +- # it miscompiles more files... +- icc_cflags_opt="-O2 -O1" +- ;; +- +- *-*-hpux*) +- # HP cc sometimes gets internal errors if the optimization level is +- # too high. GMP_PROG_CC_WORKS detects this, the "_opt" fallbacks +- # let us use whatever seems to work. +- # +- abilist="32 64" +- any_64_testlist="sizeof-long-8" +- +- cclist_32="gcc cc" +- path_32="ia64" +- cc_32_cflags="" +- cc_32_cflags_optlist="opt" +- cc_32_cflags_opt="+O3 +O2 +O1" +- gcc_32_cflags="$gcc_cflags -milp32" +- limb_32=longlong +- SPEED_CYCLECOUNTER_OBJ_32=ia64.lo +- cyclecounter_size_32=2 +- +- # Must have +DD64 in CPPFLAGS to get the right __LP64__ for headers, +- # but also need it in CFLAGS for linking programs, since automake +- # only uses CFLAGS when linking, not CPPFLAGS. +- # FIXME: Maybe should use cc_64_ldflags for this, but that would +- # need GMP_LDFLAGS used consistently by all the programs. +- # +- cc_64_cflags="+DD64" +- cc_64_cppflags="+DD64" +- cc_64_cflags_optlist="opt" +- cc_64_cflags_opt="+O3 +O2 +O1" +- gcc_64_cflags="$gcc_cflags -mlp64" +- ;; +- esac +- ;; +- +- +- # Motorola 68k +- # +- m68k-*-* | m68[0-9][0-9][0-9]-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_m68k 1" >>confdefs.h +- +- +-echo "include_mpn(\`m68k/m68k-defs.m4')" >> $gmp_tmpconfigm4i +- +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_cflags_optlist="arch" +- +- # gcc 2.7.2 knows -m68000, -m68020, -m68030, -m68040. +- # gcc 2.95 adds -mcpu32, -m68060. +- # FIXME: Maybe "-m68020 -mnobitfield" would suit cpu32 on 2.7.2. +- # +- case $host_cpu in +- m68020) gcc_cflags_arch="-m68020" ;; +- m68030) gcc_cflags_arch="-m68030" ;; +- m68040) gcc_cflags_arch="-m68040" ;; +- m68060) gcc_cflags_arch="-m68060 -m68000" ;; +- m68360) gcc_cflags_arch="-mcpu32 -m68000" ;; +- *) gcc_cflags_arch="-m68000" ;; +- esac +- +- # FIXME: m68k/mc68020 looks like it's ok for cpu32, but this wants to be +- # tested. Will need to introduce an m68k/cpu32 if m68k/mc68020 ever uses +- # the bitfield instructions. +- case $host_cpu in +- m680[234]0 | m68360) path="m68k/mc68020 m68k" ;; +- *) path="m68k" ;; +- esac +- ;; +- +- +- # Motorola 88k +- m88k*-*-*) +- path="m88k" +- ;; +- m88110*-*-*) +- gcc_cflags="$gcc_cflags -m88110" +- path="m88k/mc88110 m88k" +- ;; +- +- +- # IRIX 5 and earlier can only run 32-bit o32. +- # +- # IRIX 6 and up always has a 64-bit mips CPU can run n32 or 64. n32 is +- # preferred over 64, but only because that's been the default in past +- # versions of GMP. The two are equally efficient. +- # +- # Linux kernel 2.2.13 arch/mips/kernel/irixelf.c has a comment about not +- # supporting n32 or 64. +- # +- # For reference, libtool (eg. 1.5.6) recognises the n32 ABI and knows the +- # right options to use when linking (both cc and gcc), so no need for +- # anything special from us. +- # +- mips*-*-*) +- abilist="o32" +- gcc_cflags_optlist="abi" +- gcc_cflags_abi="-mabi=32" +- gcc_testlist="gcc-mips-o32" +- path="mips32" +- cc_cflags="-O2 -o32" # no -g, it disables all optimizations +- # this suits both mips32 and mips64 +- +-echo "include_mpn(\`mips32/mips-defs.m4')" >> $gmp_tmpconfigm4i +- +- +- case $host in +- mips64*-*-* | mips*-*-irix[6789]*) +- abilist="n32 64 o32" +- +- cclist_n32="gcc cc" +- gcc_n32_cflags="$gcc_cflags -mabi=n32" +- cc_n32_cflags="-O2 -n32" # no -g, it disables all optimizations +- limb_n32=longlong +- path_n32="mips64" +- +- cclist_64="gcc cc" +- gcc_64_cflags="$gcc_cflags -mabi=64" +- gcc_64_ldflags="-Wc,-mabi=64" +- cc_64_cflags="-O2 -64" # no -g, it disables all optimizations +- cc_64_ldflags="-Wc,-64" +- path_64="mips64" +- ;; +- esac +- ;; +- +- +- # Darwin (powerpc-apple-darwin1.3) has it's hacked gcc installed as cc. +- # Our usual "gcc in disguise" detection means gcc_cflags etc here gets +- # used. +- # +- # The darwin pre-compiling preprocessor is disabled with -no-cpp-precomp +- # since it doesn't like "__attribute__ ((mode (SI)))" etc in gmp-impl.h, +- # and so always ends up running the plain preprocessor anyway. This could +- # be done in CPPFLAGS rather than CFLAGS, but there's not many places +- # preprocessing is done separately, and this is only a speedup, the normal +- # preprocessor gets run if there's any problems. +- # +- # We used to use -Wa,-mppc with gcc, but can't remember exactly why. +- # Presumably it was for old versions of gcc where -mpowerpc doesn't put +- # the assembler in the right mode. In any case -Wa,-mppc is not good, for +- # instance -mcpu=604 makes recent gcc use -m604 to get access to the +- # "fsel" instruction, but a -Wa,-mppc overrides that, making code that +- # comes out with fsel fail. +- # +- # (Note also that the darwin assembler doesn't accept "-mppc", so any +- # -Wa,-mppc was used only if it worked. The right flag on darwin would be +- # "-arch ppc" or some such, but that's already the default.) +- # +- powerpc*-*-* | power[3-9]-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_powerpc 1" >>confdefs.h +- +- HAVE_HOST_CPU_FAMILY_powerpc=1 +- abilist="32" +- cclist="gcc cc" +- cc_cflags="-O2" +- gcc_32_cflags="$gcc_cflags -mpowerpc" +- gcc_cflags_optlist="precomp subtype asm cpu" +- gcc_cflags_precomp="-no-cpp-precomp" +- gcc_cflags_subtype="-force_cpusubtype_ALL" # for vmx on darwin +- gcc_cflags_asm="" +- gcc_cflags_cpu="" +- vmx_path="" +- +- # grab this object, though it's not a true cycle counter routine +- SPEED_CYCLECOUNTER_OBJ=powerpc.lo +- cyclecounter_size=0 +- +- case $host_cpu in +- powerpc740 | powerpc750) +- path="powerpc32/750 powerpc32" ;; +- powerpc7400 | powerpc7410) +- path="powerpc32/vmx powerpc32/750 powerpc32" ;; +- powerpc74[45]?) +- path="powerpc32/vmx powerpc32" ;; +- *) +- path="powerpc32" ;; +- esac +- +- case $host_cpu in +- powerpc401) gcc_cflags_cpu="-mcpu=401" ;; +- powerpc403) gcc_cflags_cpu="-mcpu=403" +- xlc_cflags_arch="-qarch=403 -qarch=ppc" ;; +- powerpc405) gcc_cflags_cpu="-mcpu=405" ;; +- powerpc505) gcc_cflags_cpu="-mcpu=505" ;; +- powerpc601) gcc_cflags_cpu="-mcpu=601" +- xlc_cflags_arch="-qarch=601 -qarch=ppc" ;; +- powerpc602) gcc_cflags_cpu="-mcpu=602" +- xlc_cflags_arch="-qarch=602 -qarch=ppc" ;; +- powerpc603) gcc_cflags_cpu="-mcpu=603" +- xlc_cflags_arch="-qarch=603 -qarch=ppc" ;; +- powerpc603e) gcc_cflags_cpu="-mcpu=603e -mcpu=603" +- xlc_cflags_arch="-qarch=603 -qarch=ppc" ;; +- powerpc604) gcc_cflags_cpu="-mcpu=604" +- xlc_cflags_arch="-qarch=604 -qarch=ppc" ;; +- powerpc604e) gcc_cflags_cpu="-mcpu=604e -mcpu=604" +- xlc_cflags_arch="-qarch=604 -qarch=ppc" ;; +- powerpc620) gcc_cflags_cpu="-mcpu=620" ;; +- powerpc630) gcc_cflags_cpu="-mcpu=630" +- xlc_cflags_arch="-qarch=pwr3" +- cpu_path="p3 p3-p7" ;; +- powerpc740) gcc_cflags_cpu="-mcpu=740" ;; +- powerpc7400 | powerpc7410) +- gcc_cflags_asm="-Wa,-maltivec" +- gcc_cflags_cpu="-mcpu=7400 -mcpu=750" ;; +- powerpc74[45]?) +- gcc_cflags_asm="-Wa,-maltivec" +- gcc_cflags_cpu="-mcpu=7450" ;; +- powerpc750) gcc_cflags_cpu="-mcpu=750" ;; +- powerpc801) gcc_cflags_cpu="-mcpu=801" ;; +- powerpc821) gcc_cflags_cpu="-mcpu=821" ;; +- powerpc823) gcc_cflags_cpu="-mcpu=823" ;; +- powerpc860) gcc_cflags_cpu="-mcpu=860" ;; +- powerpc970) gcc_cflags_cpu="-mtune=970" +- xlc_cflags_arch="-qarch=970 -qarch=pwr3" +- vmx_path="powerpc64/vmx" +- cpu_path="p4 p3-p7" ;; +- power4) gcc_cflags_cpu="-mtune=power4" +- xlc_cflags_arch="-qarch=pwr4" +- cpu_path="p4 p3-p7" ;; +- power5) gcc_cflags_cpu="-mtune=power5 -mtune=power4" +- xlc_cflags_arch="-qarch=pwr5" +- cpu_path="p5 p4 p3-p7" ;; +- power6) gcc_cflags_cpu="-mtune=power6" +- xlc_cflags_arch="-qarch=pwr6" +- cpu_path="p6 p3-p7" ;; +- power7) gcc_cflags_cpu="-mtune=power7 -mtune=power5" +- xlc_cflags_arch="-qarch=pwr7 -qarch=pwr5" +- cpu_path="p7 p5 p4 p3-p7" ;; +- esac +- +- case $host in +- *-*-aix*) +- cclist="gcc xlc cc" +- gcc_32_cflags_maybe="-maix32" +- xlc_cflags="-O2 -qmaxmem=20000" +- xlc_cflags_optlist="arch" +- xlc_32_cflags_maybe="-q32" +- ar_32_flags="-X32" +- nm_32_flags="-X32" +- esac +- +- case $host in +- powerpc64-*-* | powerpc64le-*-* | powerpc620-*-* | powerpc630-*-* | powerpc970-*-* | power[3-9]-*-*) +- case $host in +- *-*-aix*) +- # On AIX a true 64-bit ABI is available. +- # Need -Wc to pass object type flags through to the linker. +- abilist="mode64 $abilist" +- cclist_mode64="gcc xlc" +- gcc_mode64_cflags="$gcc_cflags -maix64 -mpowerpc64" +- gcc_mode64_cflags_optlist="cpu" +- gcc_mode64_ldflags="-Wc,-maix64" +- xlc_mode64_cflags="-O2 -q64 -qmaxmem=20000" +- xlc_mode64_cflags_optlist="arch" +- xlc_mode64_ldflags="-Wc,-q64" +- # Must indicate object type to ar and nm +- ar_mode64_flags="-X64" +- nm_mode64_flags="-X64" +- path_mode64="" +- p="" +- for i in $cpu_path +- do path_mode64="${path_mode64}powerpc64/mode64/$i " +- path_mode64="${path_mode64}powerpc64/$i " +- p="${p} powerpc32/$i " +- done +- path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64" +- path="$p $path" +- # grab this object, though it's not a true cycle counter routine +- SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo +- cyclecounter_size_mode64=0 +- ;; +- *-*-darwin*) +- # On Darwin we can use 64-bit instructions with a longlong limb, +- # but the chip still in 32-bit mode. +- # In theory this can be used on any OS which knows how to save +- # 64-bit registers in a context switch. +- # +- # Note that we must use -mpowerpc64 with gcc, since the +- # longlong.h macros expect limb operands in a single 64-bit +- # register, not two 32-bit registers as would be given for a +- # long long without -mpowerpc64. In theory we could detect and +- # accommodate both styles, but the proper 64-bit registers will +- # be fastest and are what we really want to use. +- # +- # One would think -mpowerpc64 would set the assembler in the right +- # mode to handle 64-bit instructions. But for that, also +- # -force_cpusubtype_ALL is needed. +- # +- # Do not use -fast for Darwin, it actually adds options +- # incompatible with a shared library. +- # +- abilist="mode64 mode32 $abilist" +- gcc_32_cflags_maybe="-m32" +- gcc_cflags_opt="-O3 -O2 -O1" # will this become used? +- cclist_mode32="gcc" +- gcc_mode32_cflags_maybe="-m32" +- gcc_mode32_cflags="-mpowerpc64" +- gcc_mode32_cflags_optlist="subtype cpu opt" +- gcc_mode32_cflags_subtype="-force_cpusubtype_ALL" +- gcc_mode32_cflags_opt="-O3 -O2 -O1" +- limb_mode32=longlong +- cclist_mode64="gcc" +- gcc_mode64_cflags="-m64" +- gcc_mode64_cflags_optlist="cpu opt" +- gcc_mode64_cflags_opt="-O3 -O2 -O1" +- path_mode64="" +- path_mode32="" +- p="" +- for i in $cpu_path +- do path_mode64="${path_mode64}powerpc64/mode64/$i " +- path_mode64="${path_mode64}powerpc64/$i " +- path_mode32="${path_mode32}powerpc64/mode32/$i " +- path_mode32="${path_mode32}powerpc64/$i " +- p="${p} powerpc32/$i " +- done +- path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64" +- path_mode32="${path_mode32}powerpc64/mode32 $vmx_path powerpc64" +- path="$p $path" +- SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo +- cyclecounter_size_mode64=0 +- any_mode64_testlist="sizeof-long-8" +- ;; +- *-*-linux* | *-*-*bsd*) +- # On GNU/Linux, assume the processor is in 64-bit mode. Some +- # environments have a gcc that is always in 64-bit mode, while +- # others require -m64, hence the use of cflags_maybe. The +- # sizeof-long-8 test checks the mode is right (for the no option +- # case). +- # +- # -mpowerpc64 is not used, since it should be the default in +- # 64-bit mode. (We need its effect for the various longlong.h +- # asm macros to be right of course.) +- # +- # gcc64 was an early port of gcc to 64-bit mode, but should be +- # obsolete before too long. We prefer plain gcc when it knows +- # 64-bits. +- # +- abilist="mode64 mode32 $abilist" +- gcc_32_cflags_maybe="-m32" +- cclist_mode32="gcc" +- gcc_mode32_cflags_maybe="-m32" +- gcc_mode32_cflags="-mpowerpc64" +- gcc_mode32_cflags_optlist="cpu opt" +- gcc_mode32_cflags_opt="-O3 -O2 -O1" +- limb_mode32=longlong +- cclist_mode64="gcc gcc64" +- gcc_mode64_cflags_maybe="-m64" +- gcc_mode64_cflags_optlist="cpu opt" +- gcc_mode64_cflags_opt="-O3 -O2 -O1" +- path_mode64="" +- path_mode32="" +- p="" +- for i in $cpu_path +- do path_mode64="${path_mode64}powerpc64/mode64/$i " +- path_mode64="${path_mode64}powerpc64/$i " +- path_mode32="${path_mode32}powerpc64/mode32/$i " +- path_mode32="${path_mode32}powerpc64/$i " +- p="${p} powerpc32/$i " +- done +- path_mode64="${path_mode64}powerpc64/mode64 $vmx_path powerpc64" +- path_mode32="${path_mode32}powerpc64/mode32 $vmx_path powerpc64" +- path="$p $path" +- SPEED_CYCLECOUNTER_OBJ_mode64=powerpc64.lo +- cyclecounter_size_mode64=0 +- any_mode64_testlist="sizeof-long-8" +- ;; +- esac +- ;; +- esac +- ;; +- +- +- # POWER 32-bit +- power-*-* | power[12]-*-* | power2sc-*-*) +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_power 1" >>confdefs.h +- +- HAVE_HOST_CPU_FAMILY_power=1 +- cclist="gcc" +- extra_functions="udiv_w_sdiv" +- path="power" +- +- # gcc 2.7.2 knows rios1, rios2, rsc +- # +- # -mcpu=rios2 can tickle an AIX assembler bug (see GMP_PROG_CC_WORKS) so +- # there needs to be a fallback to just -mpower. +- # +- gcc_cflags_optlist="cpu" +- case $host in +- power-*-*) gcc_cflags_cpu="-mcpu=power -mpower" ;; +- power1-*-*) gcc_cflags_cpu="-mcpu=rios1 -mpower" ;; +- power2-*-*) gcc_cflags_cpu="-mcpu=rios2 -mpower" ;; +- power2sc-*-*) gcc_cflags_cpu="-mcpu=rsc -mpower" ;; +- esac +- case $host in +- *-*-aix*) +- cclist="gcc xlc" +- xlc_cflags="-O2 -qarch=pwr -qmaxmem=20000" +- ;; +- esac +- ;; +- +- +- # IBM System/390 and z/Architecture +- s390-*-* | z900esa-*-* | z990esa-*-* | z9esa-*-* | z10esa-*-* | z196esa-*-* | s390x-*-* | z900-*-* | z990-*-* | z9-*-* | z10-*-* | z196-*-*) +- abilist="32" +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_cflags_optlist="arch" +- path="s390_32" +- extra_functions="udiv_w_sdiv" +- gcc_32_cflags_maybe="-m31" +- +- case $host_cpu in +- s390) +- ;; +- z900 | z900esa) +- cpu="z900" +- gccarch="$cpu" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z990 | z990esa) +- cpu="z990" +- gccarch="$cpu" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z9 | z9esa) +- cpu="z9" +- gccarch="z9-109" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z10 | z10esa) +- cpu="z10" +- gccarch="z10" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- z196 | z196esa) +- cpu="z196" +- gccarch="z196" +- path="s390_32/esame/$cpu s390_32/esame s390_32" +- gcc_cflags_arch="-march=$gccarch" +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_HOST_CPU_s390_$cpu 1 +-_ACEOF +- +- $as_echo "@%:@define HAVE_HOST_CPU_s390_zarch 1" >>confdefs.h +- +- extra_functions="" +- ;; +- esac +- +- case $host in +- s390x-*-* | z900-*-* | z990-*-* | z9-*-* | z10-*-* | z196-*-*) +- abilist="64 32" +- cclist_64="gcc" +- gcc_64_cflags_optlist="arch" +- gcc_64_cflags="$gcc_cflags -m64" +- path_64="s390_64/$host_cpu s390_64" +- extra_functions="" +- ;; +- esac +- ;; +- +- +- sh-*-*) path="sh" ;; +- sh[2-4]-*-*) path="sh/sh2 sh" ;; +- +- +- *sparc*-*-*) +- # sizeof(long)==4 or 8 is tested, to ensure we get the right ABI. We've +- # had various bug reports where users have set CFLAGS for their desired +- # mode, but not set our ABI. For some reason it's sparc where this +- # keeps coming up, presumably users there are accustomed to driving the +- # compiler mode that way. The effect of our testlist setting is to +- # reject ABI=64 in favour of ABI=32 if the user has forced the flags to +- # 32-bit mode. +- # +- abilist="32" +- cclist="gcc acc cc" +- any_testlist="sizeof-long-4" +- +-echo "include_mpn(\`sparc32/sparc-defs.m4')" >> $gmp_tmpconfigm4i +- +- +- case $host_cpu in +- sparcv8 | microsparc | turbosparc) +- path="sparc32/v8 sparc32" ;; +- supersparc) +- path="sparc32/v8/supersparc sparc32/v8 sparc32" ;; +- sparc64 | sparcv9* | ultrasparc | ultrasparc[234]*) +- path="sparc32/v9 sparc32/v8 sparc32" ;; +- ultrasparct[12345]) +- path="sparc32/ultrasparct1 sparc32/v8 sparc32" ;; +- *) +- path="sparc32" ;; +- esac +- +- # gcc 2.7.2 doesn't know about v9 and doesn't pass -xarch=v8plus to the +- # assembler. Add it explicitly since the solaris assembler won't accept +- # our sparc32/v9 asm code without it. gas accepts -xarch=v8plus too, so +- # it can be in the cflags unconditionally (though gas doesn't need it). +- # +- # gcc -m32 is needed to force 32-bit mode on a dual-ABI system, but past +- # gcc doesn't know that flag, hence cflags_maybe. Note that -m32 cannot +- # be done through the optlist since the plain cflags would be run first +- # and we don't want to require the default mode (whatever it is) works. +- # +- # Note it's gcc_32_cflags_maybe and not gcc_cflags_maybe because the +- # latter would be used in the 64-bit ABI on systems like "*bsd" where +- # abilist="64" only. +- # +- gcc_32_cflags_maybe="-m32" +- gcc_cflags_optlist="cpu asm" +- +- # gcc 2.7.2 knows -mcypress, -msupersparc, -mv8, -msparclite. +- # gcc 2.95 knows -mcpu= v7, hypersparc, sparclite86x, f930, f934, +- # sparclet, tsc701, v9, ultrasparc. A warning is given that the +- # plain -m forms will disappear. +- # gcc 3.3 adds ultrasparc3. +- # +- case $host_cpu in +- supersparc*) +- gcc_cflags_cpu="-mcpu=supersparc -msupersparc" +- gcc_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8";; +- sparcv8 | microsparc* | turbosparc | hypersparc*) +- gcc_cflags_cpu="-mcpu=v8 -mv8" +- gcc_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8";; +- sparc64 | sparcv9*) +- gcc_cflags_cpu="-mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8 -Wa,-xarch=v8plus" +- gcc_64_cflags_asm="-Wa,-Av9 -Wa,-xarch=v9";; +- ultrasparc1 | ultrasparc2*) +- gcc_cflags_cpu="-mcpu=ultrasparc -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusa -Wa,-xarch=v8plusa" +- gcc_64_cflags_asm="-Wa,-Av9a -Wa,-xarch=v9a";; +- ultrasparc[34]) +- gcc_cflags_cpu="-mcpu=ultrasparc3 -mcpu=ultrasparc -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusb -Wa,-xarch=v8plusb" +- gcc_64_cflags_asm="-Wa,-Av9b -Wa,-xarch=v9b";; +- ultrasparct[12]) +- gcc_cflags_cpu="-mcpu=niagara -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusc -Wa,-xarch=v8plusc" +- gcc_64_cflags_asm="-Wa,-Av9c -Wa,-xarch=v9c";; +- ultrasparct3) +- gcc_cflags_cpu="-mcpu=niagara3 -mcpu=niagara -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusd -Wa,-xarch=v8plusd" +- gcc_64_cflags_asm="-Wa,-Av9d -Wa,-xarch=v9d";; +- ultrasparct4) +- gcc_cflags_cpu="-mcpu=niagara4 -mcpu=niagara3 -mcpu=niagara -mcpu=v9" +- gcc_32_cflags_asm="-Wa,-Av8plusd -Wa,-xarch=v8plusd" +- gcc_64_cflags_asm="-Wa,-Av9d -Wa,-xarch=v9d";; +- *) +- gcc_cflags_cpu="-mcpu=v7 -mcypress" +- gcc_cflags_asm="";; +- esac +- +- # SunPRO cc and acc, and SunOS bundled cc +- case $host in +- *-*-solaris* | *-*-sunos*) +- # Note no -g, it disables all optimizations. +- cc_cflags= +- cc_cflags_optlist="opt arch cpu" +- +- # SunOS cc doesn't know -xO4, fallback to -O2. +- cc_cflags_opt="-xO4 -O2" +- +- # SunOS cc doesn't know -xarch, apparently always generating v7 +- # code, so make this optional +- case $host_cpu in +- sparcv8 | microsparc* | supersparc* | turbosparc | hypersparc*) +- cc_cflags_arch="-xarch=v8";; +- ultrasparct[345]) +- cc_cflags_arch="-xarch=v8plusd" ;; +- sparc64 | sparcv9* | ultrasparc*) +- cc_cflags_arch="-xarch=v8plus" ;; +- *) +- cc_cflags_arch="-xarch=v7" ;; +- esac +- +- # SunOS cc doesn't know -xchip and doesn't seem to have an equivalent. +- # SunPRO cc 5 recognises -xchip=generic, old, super, super2, micro, +- # micro2, hyper, hyper2, powerup, ultra, ultra2, ultra2i. +- # SunPRO cc 6 adds -xchip=ultra2e, ultra3cu. +- # +- case $host_cpu in +- supersparc*) cc_cflags_cpu="-xchip=super" ;; +- microsparc*) cc_cflags_cpu="-xchip=micro" ;; +- turbosparc) cc_cflags_cpu="-xchip=micro2" ;; +- hypersparc*) cc_cflags_cpu="-xchip=hyper" ;; +- ultrasparc) cc_cflags_cpu="-xchip=ultra" ;; +- ultrasparc2) cc_cflags_cpu="-xchip=ultra2 -xchip=ultra" ;; +- ultrasparc2i) cc_cflags_cpu="-xchip=ultra2i -xchip=ultra2 -xchip=ultra" ;; +- ultrasparc3) cc_cflags_cpu="-xchip=ultra3 -xchip=ultra" ;; +- ultrasparc4) cc_cflags_cpu="-xchip=ultra4 -xchip=ultra3 -xchip=ultra" ;; +- ultrasparct1) cc_cflags_cpu="-xchip=ultraT1" ;; +- ultrasparct2) cc_cflags_cpu="-xchip=ultraT2 -xchip=ultraT1" ;; +- ultrasparct3) cc_cflags_cpu="-xchip=ultraT3 -xchip=ultraT2" ;; +- ultrasparct4) cc_cflags_cpu="-xchip=T4" ;; +- ultrasparct5) cc_cflags_cpu="-xchip=T5 -xchip=T4" ;; +- *) cc_cflags_cpu="-xchip=generic" ;; +- esac +- esac +- +- case $host_cpu in +- sparc64 | sparcv9* | ultrasparc*) +- case $host in +- # Solaris 6 and earlier cannot run ABI=64 since it doesn't save +- # registers properly, so ABI=32 is left as the only choice. +- # +- *-*-solaris2.[0-6] | *-*-solaris2.[0-6].*) ;; +- +- # BSD sparc64 ports are 64-bit-only systems, so ABI=64 is the only +- # choice. In fact they need no special compiler flags, gcc -m64 +- # is the default, but it doesn't hurt to add it. v9 CPUs always +- # use the sparc64 port, since the plain 32-bit sparc ports don't +- # run on a v9. +- # +- *-*-*bsd*) abilist="64" ;; +- +- # For all other systems, we try both 64 and 32. +- # +- # GNU/Linux sparc64 has only recently gained a 64-bit user mode. +- # In the past sparc64 meant a v9 cpu, but there were no 64-bit +- # operations in user mode. We assume that if "gcc -m64" works +- # then the system is suitable. Hopefully even if someone attempts +- # to put a new gcc and/or glibc on an old system it won't run. +- # +- *) abilist="64 32" ;; +- esac +- +- case $host_cpu in +- ultrasparc | ultrasparc2 | ultrasparc2i) +- path_64="sparc64/ultrasparc1234 sparc64" ;; +- ultrasparc[34]) +- path_64="sparc64/ultrasparc34 sparc64/ultrasparc1234 sparc64" ;; +- ultrasparct[12]) +- path_64="sparc64/ultrasparct1 sparc64" ;; +- ultrasparct[345]) +- path_64="sparc64/ultrasparct3 sparc64" ;; +- *) +- path_64="sparc64" +- esac +- +- cclist_64="gcc" +- any_64_testlist="sizeof-long-8" +- +- # gcc -mptr64 is probably implied by -m64, but we're not sure if +- # this was always so. On Solaris in the past we always used both +- # "-m64 -mptr64". +- # +- # gcc -Wa,-xarch=v9 is thought to be necessary in some cases on +- # solaris, but it would seem likely that if gcc is going to generate +- # 64-bit code it will have to add that option itself where needed. +- # An extra copy of this option should be harmless though, but leave +- # it until we're sure. (Might want -xarch=v9a or -xarch=v9b for the +- # higher cpu types instead.) +- # +- gcc_64_cflags="$gcc_cflags -m64 -mptr64" +- gcc_64_ldflags="-Wc,-m64" +- gcc_64_cflags_optlist="cpu asm" +- +- case $host in +- *-*-solaris*) +- # Sun cc. +- # +- # We used to have -fast and some fixup options here, but it +- # recurrently caused problems with miscompilation. Of course, +- # -fast is documented as miscompiling things for the sake of speed. +- # +- cclist_64="$cclist_64 cc" +- cc_64_cflags_optlist="cpu" +- case $host_cpu in +- ultrasparct[345]) +- cc_64_cflags="$cc_64_cflags -xO3 -xarch=v9d" ;; +- *) +- cc_64_cflags="-xO3 -xarch=v9" ;; +- esac +- ;; +- esac +- +- # using the v9 %tick register +- SPEED_CYCLECOUNTER_OBJ_32=sparcv9.lo +- SPEED_CYCLECOUNTER_OBJ_64=sparcv9.lo +- cyclecounter_size_32=2 +- cyclecounter_size_64=2 +- ;; +- esac +- ;; +- +- +- # VAX +- vax*-*-*elf*) +- # Use elf conventions (i.e., '%' register prefix, no global prefix) +- # +- +-echo "include_mpn(\`vax/elf.m4')" >> $gmp_tmpconfigm4i +- +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- path="vax" +- extra_functions="udiv_w_sdiv" +- ;; +- vax*-*-*) +- # Default to aout conventions (i.e., no register prefix, '_' global prefix) +- # +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- path="vax" +- extra_functions="udiv_w_sdiv" +- ;; +- +- +- # AMD and Intel x86 configurations, including AMD64 +- # +- # Rumour has it gcc -O2 used to give worse register allocation than just +- # -O, but lets assume that's no longer true. +- # +- # -m32 forces 32-bit mode on a bi-arch 32/64 amd64 build of gcc. -m64 is +- # the default in such a build (we think), so -m32 is essential for ABI=32. +- # This is, of course, done for any $host_cpu, not just x86_64, so we can +- # get such a gcc into the right mode to cross-compile to say i486-*-*. +- # +- # -m32 is not available in gcc 2.95 and earlier, hence cflags_maybe to use +- # it when it works. We check sizeof(long)==4 to ensure we get the right +- # mode, in case -m32 has failed not because it's an old gcc, but because +- # it's a dual 32/64-bit gcc without a 32-bit libc, or whatever. +- # +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- abilist="32" +- cclist="gcc icc cc" +- gcc_cflags="$gcc_cflags $fomit_frame_pointer" +- gcc_32_cflags_maybe="-m32" +- icc_cflags="-no-gcc" +- icc_cflags_optlist="opt" +- icc_cflags_opt="-O3 -O2 -O1" +- any_32_testlist="sizeof-long-4" +- CALLING_CONVENTIONS_OBJS='x86call.lo x86check$U.lo' +- +- # Availability of rdtsc is checked at run-time. +- SPEED_CYCLECOUNTER_OBJ=pentium.lo +- +- # gcc 2.7.2 only knows i386 and i486, using -m386 or -m486. These +- # represent -mcpu= since -m486 doesn't generate 486 specific insns. +- # gcc 2.95 adds k6, pentium and pentiumpro, and takes -march= and -mcpu=. +- # gcc 3.0 adds athlon. +- # gcc 3.1 adds k6-2, k6-3, pentium-mmx, pentium2, pentium3, pentium4, +- # athlon-tbird, athlon-4, athlon-xp, athlon-mp. +- # gcc 3.2 adds winchip2. +- # gcc 3.3 adds winchip-c6. +- # gcc 3.3.1 from mandrake adds k8 and knows -mtune. +- # gcc 3.4 adds c3, c3-2, k8, and deprecates -mcpu in favour of -mtune. +- # +- # In gcc 2.95.[0123], -march=pentiumpro provoked a stack slot bug in an +- # old version of mpz/powm.c. Seems to be fine with the current code, so +- # no need for any restrictions on that option. +- # +- # -march=pentiumpro can fail if the assembler doesn't know "cmov" +- # (eg. solaris 2.8 native "as"), so always have -march=pentium after +- # that as a fallback. +- # +- # -march=pentium4 and -march=k8 enable SSE2 instructions, which may or +- # may not be supported by the assembler and/or the OS, and is bad in gcc +- # prior to 3.3. The tests will reject these if no good, so fallbacks +- # like "-march=pentium4 -mno-sse2" are given to try also without SSE2. +- # Note the relevant -march types are listed in the optflags handling +- # below, be sure to update there if adding new types emitting SSE2. +- # +- # -mtune is used at the start of each cpu option list to give something +- # gcc 3.4 will use, thereby avoiding warnings from -mcpu. -mcpu forms +- # are retained for use by prior gcc. For example pentium has +- # "-mtune=pentium -mcpu=pentium ...", the -mtune is for 3.4 and the +- # -mcpu for prior. If there's a brand new choice in 3.4 for a chip, +- # like k8 for x86_64, then it can be the -mtune at the start, no need to +- # duplicate anything. +- # +- gcc_cflags_optlist="cpu arch" +- case $host_cpu in +- i386*) +- gcc_cflags_cpu="-mtune=i386 -mcpu=i386 -m386" +- gcc_cflags_arch="-march=i386" +- path="x86" +- ;; +- i486*) +- gcc_cflags_cpu="-mtune=i486 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=i486" +- path="x86/i486 x86" +- ;; +- i586 | pentium) +- gcc_cflags_cpu="-mtune=pentium -mcpu=pentium -m486" +- gcc_cflags_arch="-march=pentium" +- path="x86/pentium x86" +- ;; +- pentiummmx) +- gcc_cflags_cpu="-mtune=pentium-mmx -mcpu=pentium-mmx -mcpu=pentium -m486" +- gcc_cflags_arch="-march=pentium-mmx -march=pentium" +- path="x86/pentium/mmx x86/pentium x86/mmx x86" +- ;; +- i686 | pentiumpro) +- gcc_cflags_cpu="-mtune=pentiumpro -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentiumpro -march=pentium" +- path="x86/p6 x86" +- ;; +- pentium2) +- gcc_cflags_cpu="-mtune=pentium2 -mcpu=pentium2 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium2 -march=pentiumpro -march=pentium" +- path="x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- pentium3) +- gcc_cflags_cpu="-mtune=pentium3 -mcpu=pentium3 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium3 -march=pentiumpro -march=pentium" +- path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- pentiumm) +- gcc_cflags_cpu="-mtune=pentium3 -mcpu=pentium3 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium3 -march=pentiumpro -march=pentium" +- path="x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- k6) +- gcc_cflags_cpu="-mtune=k6 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6" +- path="x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- k62) +- gcc_cflags_cpu="-mtune=k6-2 -mcpu=k6-2 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6-2 -march=k6" +- path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- k63) +- gcc_cflags_cpu="-mtune=k6-3 -mcpu=k6-3 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6-3 -march=k6" +- path="x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- geode) +- gcc_cflags_cpu="-mtune=k6-3 -mcpu=k6-3 -mcpu=k6 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k6-3 -march=k6" +- path="x86/geode x86/k6/k62mmx x86/k6/mmx x86/k6 x86/mmx x86" +- ;; +- athlon) +- # Athlon instruction costs are close to P6 (3 cycle load latency, +- # 4-6 cycle mul, 40 cycle div, pairable adc, etc) so if gcc doesn't +- # know athlon (eg. 2.95.2 doesn't) then fall back on pentiumpro. +- gcc_cflags_cpu="-mtune=athlon -mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=athlon -march=pentiumpro -march=pentium" +- path="x86/k7/mmx x86/k7 x86/mmx x86" +- ;; +- i786 | pentium4) +- # pentiumpro is the primary fallback when gcc doesn't know pentium4. +- # This gets us cmov to eliminate branches. Maybe "athlon" would be +- # a possibility on gcc 3.0. +- # +- gcc_cflags_cpu="-mtune=pentium4 -mcpu=pentium4 -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=pentium4 -march=pentium4~-mno-sse2 -march=pentiumpro -march=pentium" +- gcc_64_cflags_cpu="-mtune=nocona" +- path="x86/pentium4/sse2 x86/pentium4/mmx x86/pentium4 x86/mmx x86" +- path_64="x86_64/pentium4 x86_64" +- ;; +- viac32) +- # Not sure of the best fallbacks here for -mcpu. +- # c3-2 has sse and mmx, so pentium3 is good for -march. +- gcc_cflags_cpu="-mtune=c3-2 -mcpu=c3-2 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=c3-2 -march=pentium3 -march=pentiumpro -march=pentium" +- path="x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- ;; +- viac3*) +- # Not sure of the best fallbacks here. +- gcc_cflags_cpu="-mtune=c3 -mcpu=c3 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=c3 -march=pentium-mmx -march=pentium" +- path="x86/pentium/mmx x86/pentium x86/mmx x86" +- ;; +- athlon64 | k8 | x86_64) +- gcc_cflags_cpu="-mtune=k8 -mcpu=athlon -mcpu=pentiumpro -mcpu=i486 -m486" +- gcc_cflags_arch="-march=k8 -march=k8~-mno-sse2 -march=athlon -march=pentiumpro -march=pentium" +- path="x86/k8 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/k8 x86_64" +- ;; +- k10) +- gcc_cflags_cpu="-mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/k10 x86/k8 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/k10 x86_64/k8 x86_64" +- ;; +- bobcat) +- gcc_cflags_cpu="-mtune=btver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=btver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bobcat x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bobcat x86_64/k10 x86_64/k8 x86_64" +- ;; +- jaguar) +- gcc_cflags_cpu="-mtune=btver2 -mtune=btver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=btver2 -march=btver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/jaguar x86/bobcat x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/jaguar x86_64/bobcat x86_64/k10 x86_64/k8 x86_64" +- ;; +- bulldozer | bd1) +- gcc_cflags_cpu="-mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- piledriver | bd2) +- gcc_cflags_cpu="-mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- steamroller | bd3) +- gcc_cflags_cpu="-mtune=bdver3 -mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver3 -march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd3 x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd3 x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- excavator | bd4) +- gcc_cflags_cpu="-mtune=bdver4 -mtune=bdver3 -mtune=bdver2 -mtune=bdver1 -mtune=amdfam10 -mtune=k8" +- gcc_cflags_arch="-march=bdver4 -march=bdver3 -march=bdver2 -march=bdver1 -march=amdfam10 -march=k8 -march=k8~-mno-sse2" +- path="x86/bd4 x86/bd3 x86/bd2 x86/bd1 x86/k7/mmx x86/k7 x86/mmx x86" +- path_64="x86_64/bd4 x86_64/bd3 x86_64/bd2 x86_64/bd1 x86_64/k10 x86_64/k8 x86_64" +- ;; +- core2) +- gcc_cflags_cpu="-mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/core2 x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/core2 x86_64" +- ;; +- corei | coreinhm | coreiwsm) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreinhm x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreinhm x86_64/core2 x86_64" +- ;; +- coreisbr) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64" +- ;; +- coreihwl) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64" +- ;; +- coreibwl) +- gcc_cflags_cpu="-mtune=corei7 -mtune=core2 -mtune=k8" +- gcc_cflags_arch="-march=corei7 -march=core2 -march=core2~-mno-sse2 -march=k8 -march=k8~-mno-sse2" +- path="x86/coreisbr x86/p6/sse2 x86/p6/p3mmx x86/p6/mmx x86/p6 x86/mmx x86" +- path_64="x86_64/coreihwl x86_64/coreisbr x86_64/coreinhm x86_64/core2 x86_64" +- # extra_functions_64="missing" # enable for bmi2/adx simulation +- ;; +- atom) +- gcc_cflags_cpu="-mtune=atom -mtune=pentium3" +- gcc_cflags_arch="-march=atom -march=pentium3" +- path="x86/atom/sse2 x86/atom/mmx x86/atom x86/mmx x86" +- path_64="x86_64/atom x86_64" +- ;; +- nano) +- gcc_cflags_cpu="-mtune=nano" +- gcc_cflags_arch="-march=nano" +- path="x86/nano x86/mmx x86" +- path_64="x86_64/nano x86_64" +- ;; +- *) +- gcc_cflags_cpu="-mtune=i486 -mcpu=i486 -m486" +- gcc_cflags_arch="-march=i486" +- path="x86" +- path_64="x86_64" +- ;; +- esac +- +- case $host in +- athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- cclist_64="gcc cc" +- gcc_64_cflags="$gcc_cflags -m64" +- gcc_64_cflags_optlist="cpu arch" +- CALLING_CONVENTIONS_OBJS_64='amd64call.lo amd64check$U.lo' +- SPEED_CYCLECOUNTER_OBJ_64=x86_64.lo +- cyclecounter_size_64=2 +- +- cclist_x32="gcc cc" +- gcc_x32_cflags="$gcc_cflags -mx32" +- gcc_x32_cflags_optlist="$gcc_64_cflags_optlist" +- CALLING_CONVENTIONS_OBJS_x32="$CALLING_CONVENTIONS_OBJS_64" +- SPEED_CYCLECOUNTER_OBJ_x32="$SPEED_CYCLECOUNTER_OBJ_64" +- cyclecounter_size_x32="$cyclecounter_size_64" +- path_x32="$path_64" +- limb_x32=longlong +- any_x32_testlist="sizeof-long-4" +- +- abilist="64 x32 32" +- if test "$enable_assembly" = "yes" ; then +- extra_functions_64="$extra_functions_64 invert_limb_table" +- extra_functions_x32=$extra_functions_64 +- fi +- +- case $host in +- *-*-solaris*) +- # Sun cc. +- cc_64_cflags="-xO3 -m64" +- ;; +- *-*-mingw* | *-*-cygwin) +- limb_64=longlong +- CALLING_CONVENTIONS_OBJS_64="" +- +-$as_echo "@%:@define HOST_DOS64 1" >>confdefs.h +- +- GMP_NONSTD_ABI_64=DOS64 +- ;; +- esac +- ;; +- esac +- ;; +- +- +- # Special CPU "none" used to select generic C, now this is obsolete. +- none-*-*) +- enable_assembly=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: the \"none\" host is obsolete, use --disable-assembly" >&5 +-$as_echo "$as_me: WARNING: the \"none\" host is obsolete, use --disable-assembly" >&2;} +- ;; +- +-esac +- +-# mingw can be built by the cygwin gcc if -mno-cygwin is added. For +-# convenience add this automatically if it works. Actual mingw gcc accepts +-# -mno-cygwin too, but of course is the default. mingw only runs on the +-# x86s, but allow any CPU here so as to catch "none" too. +-# +-case $host in +- *-*-mingw*) +- gcc_cflags_optlist="$gcc_cflags_optlist nocygwin" +- gcc_cflags_nocygwin="-mno-cygwin" +- ;; +-esac +- +- +-CFLAGS_or_unset=${CFLAGS-'(unset)'} +-CPPFLAGS_or_unset=${CPPFLAGS-'(unset)'} +- +-cat >&5 <conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- rm -f conftest* +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $cc is gcc" >&5 +-$as_echo_n "checking whether $cc is gcc... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- ccbase=gcc +-else +- rm -f conftest* +- : +-fi +- +- fi +- +- # Similarly if the compiler is IBM xlc but invoked as cc or whatever +- # then change $ccbase and make the default xlc flags available. +- if test $ccbase != xlc; then +- gmp_command="$cc 2>&1 | grep xlc >/dev/null" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_command\""; } >&5 +- (eval $gmp_command) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $cc is xlc" >&5 +-$as_echo_n "checking whether $cc is xlc... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- ccbase=xlc +-else +- : +-fi +- +- fi +- +- # acc was Sun's first unbundled compiler back in the SunOS days, or +- # something like that, but today its man page says it's not meant to +- # be used directly (instead via /usr/ucb/cc). The options are pretty +- # much the same as the main SunPRO cc, so share those configs. +- # +- case $host in +- *sparc*-*-solaris* | *sparc*-*-sunos*) +- if test "$ccbase" = acc; then ccbase=cc; fi ;; +- esac +- +- for tmp_cflags_maybe in yes no; do +- eval cflags=\"\$${ccbase}${abi1}_cflags\" +- test -n "$cflags" || eval cflags=\"\$${ccbase}${abi2}_cflags\" +- +- if test "$tmp_cflags_maybe" = yes; then +- # don't try cflags_maybe when the user set CFLAGS +- if test "$test_CFLAGS" = set; then continue; fi +- eval cflags_maybe=\"\$${ccbase}${abi1}_cflags_maybe\" +- test -n "$cflags_maybe" || eval cflags_maybe=\"\$${ccbase}${abi2}_cflags_maybe\" +- # don't try cflags_maybe if there's nothing set +- if test -z "$cflags_maybe"; then continue; fi +- cflags="$cflags_maybe $cflags" +- fi +- +- # Any user CFLAGS, even an empty string, takes precedence +- if test "$test_CFLAGS" = set; then cflags=$CFLAGS; fi +- +- # Any user CPPFLAGS, even an empty string, takes precedence +- eval cppflags=\"\$${ccbase}${abi1}_cppflags\" +- test -n "$cppflags" || eval cppflags=\"\$${ccbase}${abi2}_cppflags\" +- if test "$test_CPPFLAGS" = set; then cppflags=$CPPFLAGS; fi +- +- # --enable-profiling adds -p/-pg even to user-specified CFLAGS. +- # This is convenient, but it's perhaps a bit naughty to modify user +- # CFLAGS. +- case "$enable_profiling" in +- prof) cflags="$cflags -p" ;; +- gprof) cflags="$cflags -pg" ;; +- instrument) cflags="$cflags -finstrument-functions" ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags $cppflags" >&5 +-$as_echo_n "checking compiler $cc $cflags $cppflags... " >&6; } +-gmp_prog_cc_works=yes +- +-# first see a simple "main()" works, then go on to other checks +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no" +- ;; +- norun) +- gmp_prog_cc_works="no, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, function pointer return" +- ;; +- norun) +- gmp_prog_cc_works="no, function pointer return, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? n : 0); } +- +-int main () { return 0; } +-EOF +- echo "Test compile: cmov instruction" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, cmov instruction" +- ;; +- norun) +- gmp_prog_cc_works="no, cmov instruction, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; } +-EOF +- echo "Test compile: double -> ulong conversion" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> ulong conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> ulong conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double negation" +- ;; +- norun) +- gmp_prog_cc_works="no, double negation, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < float conversion" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> float conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> float conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: gnupro alpha ev6 char spilling" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling" +- ;; +- norun) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# __builtin_alloca is not available everywhere, check it exists before +-# seeing that it works +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, alloca array" +- ;; +- norun) +- gmp_prog_cc_works="no, alloca array, program does not run" +- ;; +- esac +-fi +- +- +- +- ;; +- no) +- +- ;; +- norun) +- +- ;; +- esac +-fi +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: abs int -> double conversion" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, abs int -> double conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, abs int -> double conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 1" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 1, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 2" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization, program does not run" +- ;; +- esac +-fi +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization 2" >&5 +- gmp_compile="$cc $cflags $cppflags conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled +-# by recent versions of gcc. +-# +-if test "$gmp_prog_cc_works" = yes; then +- case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-*) +- # this problem only arises in PIC code, so don't need to test when +- # --disable-shared. We don't necessarily have $enable_shared set to +- # yes at this point, it will still be unset for the default (which is +- # yes); hence the use of "!= no". +- if test "$enable_shared" != no; then +- echo "Testing gcc GOT with eax emitted" >&5 +-cat >conftest.c <<\EOF +-int foo; +-int bar () { return foo; } +-EOF +-tmp_got_emitted=no +-gmp_compile="$cc $cflags $cppflags -fPIC -S conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then +- tmp_got_emitted=yes +- fi +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_emitted" >&5 +-if test "$tmp_got_emitted" = yes; then +- echo "Testing gas GOT with eax good" >&5 +-cat >conftest.awk <<\EOF +-BEGIN { +- want[0] = "001" +- want[1] = "043" +- want[2] = "105" +- want[3] = "147" +- want[4] = "211" +- want[5] = "253" +- want[6] = "315" +- want[7] = "357" +- +- want[8] = "005" +- want[9] = "002" +- want[10] = "000" +- want[11] = "000" +- want[12] = "000" +- +- want[13] = "376" +- want[14] = "334" +- want[15] = "272" +- want[16] = "230" +- want[17] = "166" +- want[18] = "124" +- want[19] = "062" +- want[20] = "020" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 20; i++) +- got[i] = got[i+1]; +- got[20] = $f; +- +- found = 1 +- for (i = 0; i < 21; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-EOF +-cat >conftest.s <<\EOF +- .text +- .byte 1, 35, 69, 103, 137, 171, 205, 239 +- addl $_GLOBAL_OFFSET_TABLE_, %eax +- .byte 254, 220, 186, 152, 118, 84, 50, 16 +-EOF +-tmp_got_good=yes +-gmp_compile="$cc $cflags $cppflags -fPIC -o conftest.o -c conftest.s >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk` +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_good" >&5 +-if test "$tmp_got_good" = no; then +- gmp_prog_cc_works="no, bad gas GOT with eax" +-else +- : +-fi +- +-else +- : +-fi +- +- fi +- ;; +- esac +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cc_works" >&5 +-$as_echo "$gmp_prog_cc_works" >&6; } +-case $gmp_prog_cc_works in +- yes) +- +- ;; +- *) +- continue +- ;; +-esac +- +- +- # If we're supposed to be using a "long long" for a limb, check that +- # it works. +- eval limb_chosen=\"\$limb$abi1\" +- test -n "$limb_chosen" || eval limb_chosen=\"\$limb$abi2\" +- if test "$limb_chosen" = longlong; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags $cppflags has long long" >&5 +-$as_echo_n "checking compiler $cc $cflags $cppflags has long long... " >&6; } +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_prog_cc_works=yes +-else +- echo "failed program was:" >&5 +- cat conftest.c >&5 +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cc_works" >&5 +-$as_echo "$gmp_prog_cc_works" >&6; } +-if test $gmp_prog_cc_works = yes; then +- : +-else +- continue +-fi +- +- fi +- +- # The tests to perform on this $cc, if any +- eval testlist=\"\$${ccbase}${abi1}_testlist\" +- test -n "$testlist" || eval testlist=\"\$${ccbase}${abi2}_testlist\" +- test -n "$testlist" || eval testlist=\"\$any${abi1}_testlist\" +- test -n "$testlist" || eval testlist=\"\$any${abi2}_testlist\" +- +- testlist_pass=yes +- for tst in $testlist; do +- case $tst in +- hpc-hppa-2-0) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether HP compiler $cc is good for 64-bits" >&5 +-$as_echo_n "checking whether HP compiler $cc is good for 64-bits... " >&6; } +-# Bad compiler output: +-# ccom: HP92453-01 G.10.32.05 HP C Compiler +-# Good compiler output: +-# ccom: HP92453-01 A.10.32.30 HP C Compiler +-# Let A.10.32.30 or higher be ok. +-echo >conftest.c +-gmp_tmp_vs=`$cc -V -c -o conftest.$OBJEXT conftest.c 2>&1 | grep "^ccom:"` +-echo "Version string: $gmp_tmp_vs" >&5 +-rm conftest* +-gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\([0-9]*\).*/\1/'` +-gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` +-gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` +-echo "Version number: $gmp_tmp_v1.$gmp_tmp_v2.$gmp_tmp_v3" >&5 +-if test -z "$gmp_tmp_v1"; then +- gmp_hpc_64bit=not-applicable +-else +- gmp_compare_ge=no +-if test -n "$gmp_tmp_v1"; then +- if test "$gmp_tmp_v1" -gt 10; then +- gmp_compare_ge=yes +- else +- if test "$gmp_tmp_v1" -eq 10; then +- if test -n "$gmp_tmp_v2"; then +- if test "$gmp_tmp_v2" -gt 32; then +- gmp_compare_ge=yes +- else +- if test "$gmp_tmp_v2" -eq 32; then +- if test -n "$gmp_tmp_v3" && test "$gmp_tmp_v3" -ge 30; then +- gmp_compare_ge=yes +-fi +- +- fi +- fi +-fi +- +- fi +- fi +-fi +- +- +- gmp_hpc_64bit=$gmp_compare_ge +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_hpc_64bit" >&5 +-$as_echo "$gmp_hpc_64bit" >&6; } +-if test $gmp_hpc_64bit = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- gcc-arm-umodsi) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ARM gcc unsigned division works" >&5 +-$as_echo_n "checking whether ARM gcc unsigned division works... " >&6; } +-tmp_version=`$cc --version` +-echo "$tmp_version" >&5 +-case $tmp_version in +- 2.95 | 2.95.[123]) +- testlist_pass=no +- gmp_gcc_arm_umodsi_result="no, gcc 2.95.[0123]" ;; +- *) +- : +- gmp_gcc_arm_umodsi_result=yes ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_gcc_arm_umodsi_result" >&5 +-$as_echo "$gmp_gcc_arm_umodsi_result" >&6; } +- ;; +- gcc-mips-o32) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc supports o32" >&5 +-$as_echo_n "checking whether gcc supports o32... " >&6; } +-echo 'int x;' >conftest.c +-echo "$cc -mabi=32 -c conftest.c" >&5 +-if $cc -mabi=32 -c conftest.c >conftest.out 2>&1; then +- result=yes +-else +- cat conftest.out >&5 +- if grep "cc1: Invalid option \`abi=32'" conftest.out >/dev/null; then +- result=yes +- else +- result=no +- fi +-fi +-rm -f conftest.* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test $result = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- hppa-level-2.0) { $as_echo "$as_me:${as_lineno-$LINENO}: checking $cc $cflags assembler knows hppa 2.0" >&5 +-$as_echo_n "checking $cc $cflags assembler knows hppa 2.0... " >&6; } +-result=no +-cat >conftest.s <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- result=yes +-else +- echo "failed program was" >&5 +- cat conftest.s >&5 +-fi +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- sizeof*) echo "configure: testlist $tst" >&5 +-gmp_sizeof_type=`echo "$tst" | sed 's/sizeof-\([a-z]*\).*/\1/'` +-gmp_sizeof_want=`echo "$tst" | sed 's/sizeof-[a-z]*-\([0-9]*\).*/\1/'` +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags has sizeof($gmp_sizeof_type)==$gmp_sizeof_want" >&5 +-$as_echo_n "checking compiler $cc $cflags has sizeof($gmp_sizeof_type)==$gmp_sizeof_want... " >&6; } +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_c_testlist_sizeof=yes +-fi +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_c_testlist_sizeof" >&5 +-$as_echo "$gmp_c_testlist_sizeof" >&6; } +-if test $gmp_c_testlist_sizeof = yes; then +- : +-else +- testlist_pass=no +-fi +- ;; +- esac +- if test $testlist_pass = no; then break; fi +- done +- +- if test $testlist_pass = yes; then +- found_compiler=yes +- break +- fi +- done +- +- if test $found_compiler = yes; then break; fi +- done +- +- if test $found_compiler = yes; then break; fi +- done +- +- if test $found_compiler = yes; then break; fi +-done +- +- +-# If we recognised the CPU, as indicated by $path being set, then insist +-# that we have a working compiler, either from our $cclist choices or from +-# $CC. We can't let AC_PROG_CC look around for a compiler because it might +-# find one that we've rejected (for not supporting the modes our asm code +-# demands, etc). +-# +-# If we didn't recognise the CPU (and this includes host_cpu=none), then +-# fall through and let AC_PROG_CC look around for a compiler too. This is +-# mostly in the interests of following a standard autoconf setup, after all +-# we've already tested cc and gcc adequately (hopefully). As of autoconf +-# 2.50 the only thing AC_PROG_CC really adds is a check for "cl" (Microsoft +-# C on MS-DOS systems). +-# +-if test $found_compiler = no && test -n "$path"; then +- as_fn_error $? "could not find a working compiler, see config.log for details" "$LINENO" 5 +-fi +- +-case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- # If the user asked for a fat build, override the path and flags set above +- if test $enable_fat = yes; then +- gcc_cflags_cpu="" +- gcc_cflags_arch="" +- +- fat_functions="add_n addmul_1 bdiv_dbm1c com cnd_add_n cnd_sub_n +- copyd copyi dive_1 divrem_1 +- gcd_1 lshift lshiftc mod_1 mod_1_1 mod_1_1_cps mod_1_2 +- mod_1_2_cps mod_1_4 mod_1_4_cps mod_34lsub1 mode1o mul_1 +- mul_basecase mullo_basecase pre_divrem_1 pre_mod_1 redc_1 +- redc_2 rshift sqr_basecase sub_n submul_1" +- +- if test "$abi" = 32; then +- extra_functions="$extra_functions fat fat_entry" +- path="x86/fat x86" +- fat_path="x86 x86/fat x86/i486 +- x86/k6 x86/k6/mmx x86/k6/k62mmx +- x86/k7 x86/k7/mmx +- x86/k8 x86/k10 x86/bobcat +- x86/pentium x86/pentium/mmx +- x86/p6 x86/p6/mmx x86/p6/p3mmx x86/p6/sse2 +- x86/pentium4 x86/pentium4/mmx x86/pentium4/sse2 +- x86/core2 x86/coreinhm x86/coreisbr +- x86/atom x86/atom/mmx x86/atom/sse2 x86/nano" +- fi +- +- if test "$abi" = 64; then +- gcc_64_cflags="" +- extra_functions_64="$extra_functions_64 fat fat_entry" +- path_64="x86_64/fat x86_64" +- fat_path="x86_64 x86_64/fat +- x86_64/k8 x86_64/k10 x86_64/bd1 x86_64/bobcat +- x86_64/pentium4 x86_64/core2 x86_64/coreinhm x86_64/coreisbr +- x86_64/coreihwl x86_64/atom x86_64/nano" +- fat_functions="$fat_functions addmul_2 addlsh1_n addlsh2_n sublsh1_n" +- fi +- +- fat_thresholds="MUL_TOOM22_THRESHOLD MUL_TOOM33_THRESHOLD +- SQR_TOOM2_THRESHOLD SQR_TOOM3_THRESHOLD +- BMOD_1_TO_MOD_1_THRESHOLD" +- fi +- ;; +-esac +- +- +-if test $found_compiler = yes; then +- +- # If we're creating CFLAGS, then look for optional additions. If the user +- # set CFLAGS then leave it alone. +- # +- if test "$test_CFLAGS" != set; then +- eval optlist=\"\$${ccbase}${abi1}_cflags_optlist\" +- test -n "$optlist" || eval optlist=\"\$${ccbase}${abi2}_cflags_optlist\" +- +- for opt in $optlist; do +- eval optflags=\"\$${ccbase}${abi1}_cflags_${opt}\" +- test -n "$optflags" || eval optflags=\"\$${ccbase}${abi2}_cflags_${opt}\" +- test -n "$optflags" || eval optflags=\"\$${ccbase}_cflags_${opt}\" +- +- for flag in $optflags; do +- +- # ~ represents a space in an option spec +- flag=`echo "$flag" | tr '~' ' '` +- +- case $flag in +- -march=pentium4 | -march=k8) +- # For -march settings which enable SSE2 we exclude certain bad +- # gcc versions and we need an OS knowing how to save xmm regs. +- # +- # This is only for ABI=32, any 64-bit gcc is good and any OS +- # knowing x86_64 will know xmm. +- # +- # -march=k8 was only introduced in gcc 3.3, so we shouldn't need +- # the GMP_GCC_PENTIUM4_SSE2 check (for gcc 3.2 and prior). But +- # it doesn't hurt to run it anyway, sharing code with the +- # pentium4 case. +- # +- if test "$abi" = 32; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc is good for sse2" >&5 +-$as_echo_n "checking whether gcc is good for sse2... " >&6; } +-case `$cc $cflags $cppflags -dumpversion` in +- 3.[012] | 3.[012].*) result=no ;; +- *) result=yes ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- : +-else +- continue +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the operating system supports XMM registers" >&5 +-$as_echo_n "checking whether the operating system supports XMM registers... " >&6; } +-if ${gmp_cv_os_x86_xmm+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$build" = "$host"; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.s <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then +- gmp_cv_os_x86_xmm=yes +- else +- gmp_cv_os_x86_xmm=no +- fi +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Oops, cannot compile test program" >&5 +-$as_echo "$as_me: WARNING: Oops, cannot compile test program" >&2;} +- fi +- rm -f conftest* +-fi +- +-if test -z "$gmp_cv_os_x86_xmm"; then +- case $host_os in +- freebsd[123] | freebsd[123].*) +- gmp_cv_os_x86_xmm=no ;; +- freebsd*) +- gmp_cv_os_x86_xmm=yes ;; +- *) +- gmp_cv_os_x86_xmm=probably ;; +- esac +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_os_x86_xmm" >&5 +-$as_echo "$gmp_cv_os_x86_xmm" >&6; } +- +-if test "$gmp_cv_os_x86_xmm" = probably; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not certain of OS support for xmm when cross compiling." >&5 +-$as_echo "$as_me: WARNING: Not certain of OS support for xmm when cross compiling." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Will assume it's ok, expect a SIGILL if this is wrong." >&5 +-$as_echo "$as_me: WARNING: Will assume it's ok, expect a SIGILL if this is wrong." >&2;} +-fi +- +-case $gmp_cv_os_x86_xmm in +-no) +- continue +- ;; +-*) +- +- ;; +-esac +- +- fi +- ;; +- -no-cpp-precomp) +- # special check, avoiding a warning +- if test "$ccbase" = gcc; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags -no-cpp-precomp" >&5 +-$as_echo_n "checking compiler $cc $cflags -no-cpp-precomp... " >&6; } +- result=no +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "unrecognized option.*-no-cpp-precomp" conftest.out >/dev/null; then : ; +- else +- result=yes +- fi +- fi +- cat conftest.out >&5 +- rm -f conftest* a.out b.out a.exe a_out.exe +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +- if test "$result" = yes; then +- cflags="$cflags $flag" +- break +- else +- continue +- fi +-fi +- +- ;; +- -Wa,-m*) +- case $host in +- alpha*-*-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler $cc $cflags $flag" >&5 +-$as_echo_n "checking assembler $cc $cflags $flag... " >&6; } +-result=no +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "Unknown CPU identifier" conftest.out >/dev/null; then : ; +- else +- result=yes +- fi +-fi +-cat conftest.out >&5 +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- : +-else +- continue +-fi +- +- ;; +- esac +- ;; +- -Wa,-oldas) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $cc $cflags $cppflags -Wa,-oldas" >&5 +-$as_echo_n "checking for $cc $cflags $cppflags -Wa,-oldas... " >&6; } +-result=no +-cat >conftest.c <&5 +-gmp_compile="$cc $cflags $cppflags -c conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : ; +-else +- # empty fails +- gmp_compile="$cc $cflags $cppflags -Wa,-oldas -c conftest.c >&5 2>&1" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- # but with -Wa,-oldas it works +- result=yes +- fi +-fi +-rm -f conftest* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +-$as_echo "$result" >&6; } +-if test "$result" = yes; then +- cflags="$cflags $flag" +- break +-else +- continue +-fi +- +- ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler $cc $cflags $cppflags $flag" >&5 +-$as_echo_n "checking compiler $cc $cflags $cppflags $flag... " >&6; } +-gmp_prog_cc_works=yes +- +-# first see a simple "main()" works, then go on to other checks +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no" +- ;; +- norun) +- gmp_prog_cc_works="no, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, function pointer return" +- ;; +- norun) +- gmp_prog_cc_works="no, function pointer return, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? n : 0); } +- +-int main () { return 0; } +-EOF +- echo "Test compile: cmov instruction" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, cmov instruction" +- ;; +- norun) +- gmp_prog_cc_works="no, cmov instruction, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; } +-EOF +- echo "Test compile: double -> ulong conversion" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> ulong conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> ulong conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double negation" +- ;; +- norun) +- gmp_prog_cc_works="no, double negation, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < float conversion" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, double -> float conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, double -> float conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: gnupro alpha ev6 char spilling" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling" +- ;; +- norun) +- gmp_prog_cc_works="no, gnupro alpha ev6 char spilling, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# __builtin_alloca is not available everywhere, check it exists before +-# seeing that it works +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, alloca array" +- ;; +- norun) +- gmp_prog_cc_works="no, alloca array, program does not run" +- ;; +- esac +-fi +- +- +- +- ;; +- no) +- +- ;; +- norun) +- +- ;; +- esac +-fi +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; } +-EOF +- echo "Test compile: abs int -> double conversion" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, abs int -> double conversion" +- ;; +- norun) +- gmp_prog_cc_works="no, abs int -> double conversion, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 1" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 1, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, long long reliability test 2" +- ;; +- norun) +- gmp_prog_cc_works="no, long long reliability test 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization, program does not run" +- ;; +- esac +-fi +- +- +- +-if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c < +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +- +-EOF +- echo "Test compile: mpn_lshift_com optimization 2" >&5 +- gmp_compile="$cc $cflags $cppflags $flag conftest.c >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&5 +- cat conftest.c >&5 +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- +- ;; +- no) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2" +- ;; +- norun) +- gmp_prog_cc_works="no, mpn_lshift_com optimization 2, program does not run" +- ;; +- esac +-fi +- +- +- +- +-# A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled +-# by recent versions of gcc. +-# +-if test "$gmp_prog_cc_works" = yes; then +- case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-*) +- # this problem only arises in PIC code, so don't need to test when +- # --disable-shared. We don't necessarily have $enable_shared set to +- # yes at this point, it will still be unset for the default (which is +- # yes); hence the use of "!= no". +- if test "$enable_shared" != no; then +- echo "Testing gcc GOT with eax emitted" >&5 +-cat >conftest.c <<\EOF +-int foo; +-int bar () { return foo; } +-EOF +-tmp_got_emitted=no +-gmp_compile="$cc $cflags $cppflags $flag -fPIC -S conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then +- tmp_got_emitted=yes +- fi +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_emitted" >&5 +-if test "$tmp_got_emitted" = yes; then +- echo "Testing gas GOT with eax good" >&5 +-cat >conftest.awk <<\EOF +-BEGIN { +- want[0] = "001" +- want[1] = "043" +- want[2] = "105" +- want[3] = "147" +- want[4] = "211" +- want[5] = "253" +- want[6] = "315" +- want[7] = "357" +- +- want[8] = "005" +- want[9] = "002" +- want[10] = "000" +- want[11] = "000" +- want[12] = "000" +- +- want[13] = "376" +- want[14] = "334" +- want[15] = "272" +- want[16] = "230" +- want[17] = "166" +- want[18] = "124" +- want[19] = "062" +- want[20] = "020" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 20; i++) +- got[i] = got[i+1]; +- got[20] = $f; +- +- found = 1 +- for (i = 0; i < 21; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-EOF +-cat >conftest.s <<\EOF +- .text +- .byte 1, 35, 69, 103, 137, 171, 205, 239 +- addl $_GLOBAL_OFFSET_TABLE_, %eax +- .byte 254, 220, 186, 152, 118, 84, 50, 16 +-EOF +-tmp_got_good=yes +-gmp_compile="$cc $cflags $cppflags $flag -fPIC -o conftest.o -c conftest.s >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk` +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_good" >&5 +-if test "$tmp_got_good" = no; then +- gmp_prog_cc_works="no, bad gas GOT with eax" +-else +- : +-fi +- +-else +- : +-fi +- +- fi +- ;; +- esac +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cc_works" >&5 +-$as_echo "$gmp_prog_cc_works" >&6; } +-case $gmp_prog_cc_works in +- yes) +- cflags="$cflags $flag" +- break +- ;; +- *) +- +- ;; +-esac +- +- done +- done +- fi +- +- ABI="$abi" +- CC="$cc" +- CFLAGS="$cflags" +- CPPFLAGS="$cppflags" +- eval GMP_NONSTD_ABI=\"\$GMP_NONSTD_ABI_$ABI\" +- +- # Could easily have this in config.h too, if desired. +- ABI_nodots=`echo $ABI | sed 's/\./_/'` +- +-echo "define_not_for_expansion(\`HAVE_ABI_$ABI_nodots')" >> $gmp_tmpconfigm4p +- +- +- +- # GMP_LDFLAGS substitution, selected according to ABI. +- # These are needed on libgmp.la and libmp.la, but currently not on +- # convenience libraries like tune/libspeed.la or mpz/libmpz.la. +- # +- eval GMP_LDFLAGS=\"\$${ccbase}${abi1}_ldflags\" +- test -n "$GMP_LDFLAGS" || eval GMP_LDFLAGS=\"\$${ccbase}${abi1}_ldflags\" +- +- +- +- +- # extra_functions, selected according to ABI +- eval tmp=\"\$extra_functions$abi1\" +- test -n "$tmp" || eval tmp=\"\$extra_functions$abi2\" +- extra_functions="$tmp" +- +- +- # Cycle counter, selected according to ABI. +- # +- eval tmp=\"\$SPEED_CYCLECOUNTER_OBJ$abi1\" +- test -n "$tmp" || eval tmp=\"\$SPEED_CYCLECOUNTER_OBJ$abi2\" +- SPEED_CYCLECOUNTER_OBJ="$tmp" +- eval tmp=\"\$cyclecounter_size$abi1\" +- test -n "$tmp" || eval tmp=\"\$cyclecounter_size$abi2\" +- cyclecounter_size="$tmp" +- +- if test -n "$SPEED_CYCLECOUNTER_OBJ"; then +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SPEED_CYCLECOUNTER $cyclecounter_size +-_ACEOF +- +- fi +- +- +- +- # Calling conventions checking, selected according to ABI. +- # +- eval tmp=\"\$CALLING_CONVENTIONS_OBJS$abi1\" +- test -n "$tmp" || eval tmp=\"\$CALLING_CONVENTIONS_OBJS$abi2\" +- if test "$enable_assembly" = "yes"; then +- CALLING_CONVENTIONS_OBJS="$tmp" +- else +- CALLING_CONVENTIONS_OBJS="" +- fi +- +- if test -n "$CALLING_CONVENTIONS_OBJS"; then +- +-$as_echo "@%:@define HAVE_CALLING_CONVENTIONS 1" >>confdefs.h +- +- fi +- +- +-fi +- +- +-# If the user gave an MPN_PATH, use that verbatim, otherwise choose +-# according to the ABI and add "generic". +-# +-if test -n "$MPN_PATH"; then +- path="$MPN_PATH" +-else +- eval tmp=\"\$path$abi1\" +- test -n "$tmp" || eval tmp=\"\$path$abi2\" +- path="$tmp generic" +-fi +- +- +-# Long long limb setup for gmp.h. +-case $limb_chosen in +-longlong) DEFN_LONG_LONG_LIMB="#define _LONG_LONG_LIMB 1" ;; +-*) DEFN_LONG_LONG_LIMB="/* #undef _LONG_LONG_LIMB */" ;; +-esac +- +- +- +-# The C compiler and preprocessor, put into ANSI mode if possible. +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +-set dummy ${ac_tool_prefix}gcc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="${ac_tool_prefix}gcc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_CC"; then +- ac_ct_CC=$CC +- # Extract the first word of "gcc", so it can be a program name with args. +-set dummy gcc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_CC"; then +- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_CC="gcc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_CC=$ac_cv_prog_ac_ct_CC +-if test -n "$ac_ct_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +-$as_echo "$ac_ct_CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_CC" = x; then +- CC="" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- CC=$ac_ct_CC +- fi +-else +- CC="$ac_cv_prog_CC" +-fi +- +-if test -z "$CC"; then +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +-set dummy ${ac_tool_prefix}cc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="${ac_tool_prefix}cc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- fi +-fi +-if test -z "$CC"; then +- # Extract the first word of "cc", so it can be a program name with args. +-set dummy cc; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +- ac_prog_rejected=no +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then +- ac_prog_rejected=yes +- continue +- fi +- ac_cv_prog_CC="cc" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-if test $ac_prog_rejected = yes; then +- # We found a bogon in the path, so make sure we never use it. +- set dummy $ac_cv_prog_CC +- shift +- if test $@%:@ != 0; then +- # We chose a different compiler from the bogus one. +- # However, it has the same basename, so the bogon will be chosen +- # first if we set CC to just the basename; use the full file name. +- shift +- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" +- fi +-fi +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$CC"; then +- if test -n "$ac_tool_prefix"; then +- for ac_prog in cl.exe +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CC"; then +- ac_cv_prog_CC="$CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CC=$ac_cv_prog_CC +-if test -n "$CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +-$as_echo "$CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$CC" && break +- done +-fi +-if test -z "$CC"; then +- ac_ct_CC=$CC +- for ac_prog in cl.exe +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_CC"; then +- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_CC="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_CC=$ac_cv_prog_ac_ct_CC +-if test -n "$ac_ct_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +-$as_echo "$ac_ct_CC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_CC" && break +-done +- +- if test "x$ac_ct_CC" = x; then +- CC="" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- CC=$ac_ct_CC +- fi +-fi +- +-fi +- +- +-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "no acceptable C compiler found in \$PATH +-See \`config.log' for more details" "$LINENO" 5; } +- +-# Provide some information about the compiler. +-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +-set X $ac_compile +-ac_compiler=$2 +-for ac_option in --version -v -V -qversion; do +- { { ac_try="$ac_compiler $ac_option >&5" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compiler $ac_option >&5") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- sed '10a\ +-... rest of stderr output deleted ... +- 10q' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- fi +- rm -f conftest.er1 conftest.err +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +-done +- +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +-# Try to create an executable without -o first, disregard a.out. +-# It will help us diagnose broken compilers, and finding out an intuition +-# of exeext. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +-$as_echo_n "checking whether the C compiler works... " >&6; } +-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +- +-# The possible output files: +-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" +- +-ac_rmfiles= +-for ac_file in $ac_files +-do +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; +- * ) ac_rmfiles="$ac_rmfiles $ac_file";; +- esac +-done +-rm -f $ac_rmfiles +- +-if { { ac_try="$ac_link_default" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link_default") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : +- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +-# in a Makefile. We should not override ac_cv_exeext if it was cached, +-# so that the user can short-circuit this test for compilers unknown to +-# Autoconf. +-for ac_file in $ac_files '' +-do +- test -f "$ac_file" || continue +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) +- ;; +- [ab].out ) +- # We found the default executable, but exeext='' is most +- # certainly right. +- break;; +- *.* ) +- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; +- then :; else +- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- fi +- # We set ac_cv_exeext here because the later test for it is not +- # safe: cross compilers may not add the suffix if given an `-o' +- # argument, so we may need to know it at that point already. +- # Even if this section looks crufty: it has the advantage of +- # actually working. +- break;; +- * ) +- break;; +- esac +-done +-test "$ac_cv_exeext" = no && ac_cv_exeext= +- +-else +- ac_file='' +-fi +-if test -z "$ac_file"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-$as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "C compiler cannot create executables +-See \`config.log' for more details" "$LINENO" 5; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +-$as_echo_n "checking for C compiler default output file name... " >&6; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +-$as_echo "$ac_file" >&6; } +-ac_exeext=$ac_cv_exeext +- +-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +-ac_clean_files=$ac_clean_files_save +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +-$as_echo_n "checking for suffix of executables... " >&6; } +-if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : +- # If both `conftest.exe' and `conftest' are `present' (well, observable) +-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +-# work properly (i.e., refer to `conftest.exe'), while it won't with +-# `rm'. +-for ac_file in conftest.exe conftest conftest.*; do +- test -f "$ac_file" || continue +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; +- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- break;; +- * ) break;; +- esac +-done +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot compute suffix of executables: cannot compile and link +-See \`config.log' for more details" "$LINENO" 5; } +-fi +-rm -f conftest conftest$ac_cv_exeext +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +-$as_echo "$ac_cv_exeext" >&6; } +- +-rm -f conftest.$ac_ext +-EXEEXT=$ac_cv_exeext +-ac_exeext=$EXEEXT +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-int +-main () +-{ +-FILE *f = fopen ("conftest.out", "w"); +- return ferror (f) || fclose (f) != 0; +- +- ; +- return 0; +-} +-_ACEOF +-ac_clean_files="$ac_clean_files conftest.out" +-# Check that the compiler produces executables we can run. If not, either +-# the compiler is broken, or we cross compile. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +-$as_echo_n "checking whether we are cross compiling... " >&6; } +-if test "$cross_compiling" != yes; then +- { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if { ac_try='./conftest$ac_cv_exeext' +- { { case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_try") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then +- cross_compiling=no +- else +- if test "$cross_compiling" = maybe; then +- cross_compiling=yes +- else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run C compiled programs. +-If you meant to cross compile, use \`--host'. +-See \`config.log' for more details" "$LINENO" 5; } +- fi +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +-$as_echo "$cross_compiling" >&6; } +- +-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +-ac_clean_files=$ac_clean_files_save +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +-$as_echo_n "checking for suffix of object files... " >&6; } +-if ${ac_cv_objext+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-rm -f conftest.o conftest.obj +-if { { ac_try="$ac_compile" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compile") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then : +- for ac_file in conftest.o conftest.obj conftest.*; do +- test -f "$ac_file" || continue; +- case $ac_file in +- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; +- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` +- break;; +- esac +-done +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot compute suffix of object files: cannot compile +-See \`config.log' for more details" "$LINENO" 5; } +-fi +-rm -f conftest.$ac_cv_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +-$as_echo "$ac_cv_objext" >&6; } +-OBJEXT=$ac_cv_objext +-ac_objext=$OBJEXT +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +-if ${ac_cv_c_compiler_gnu+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +-#ifndef __GNUC__ +- choke me +-#endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_compiler_gnu=yes +-else +- ac_compiler_gnu=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-ac_cv_c_compiler_gnu=$ac_compiler_gnu +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +-$as_echo "$ac_cv_c_compiler_gnu" >&6; } +-if test $ac_compiler_gnu = yes; then +- GCC=yes +-else +- GCC= +-fi +-ac_test_CFLAGS=${CFLAGS+set} +-ac_save_CFLAGS=$CFLAGS +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +-$as_echo_n "checking whether $CC accepts -g... " >&6; } +-if ${ac_cv_prog_cc_g+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_save_c_werror_flag=$ac_c_werror_flag +- ac_c_werror_flag=yes +- ac_cv_prog_cc_g=no +- CFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_g=yes +-else +- CFLAGS="" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- ac_c_werror_flag=$ac_save_c_werror_flag +- CFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_g=yes +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- ac_c_werror_flag=$ac_save_c_werror_flag +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +-$as_echo "$ac_cv_prog_cc_g" >&6; } +-if test "$ac_test_CFLAGS" = set; then +- CFLAGS=$ac_save_CFLAGS +-elif test $ac_cv_prog_cc_g = yes; then +- if test "$GCC" = yes; then +- CFLAGS="-g -O2" +- else +- CFLAGS="-g" +- fi +-else +- if test "$GCC" = yes; then +- CFLAGS="-O2" +- else +- CFLAGS= +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c89=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-struct stat; +-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +-struct buf { int x; }; +-FILE * (*rcsopen) (struct buf *, struct stat *, int); +-static char *e (p, i) +- char **p; +- int i; +-{ +- return p[i]; +-} +-static char *f (char * (*g) (char **, int), char **p, ...) +-{ +- char *s; +- va_list v; +- va_start (v,p); +- s = g (p, va_arg (v,int)); +- va_end (v); +- return s; +-} +- +-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has +- function prototypes and stuff, but not '\xHH' hex character constants. +- These don't provoke an error unfortunately, instead are silently treated +- as 'x'. The following induces an error, until -std is added to get +- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an +- array size at least. It's necessary to write '\x00'==0 to get something +- that's true only with -std. */ +-int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +- +-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters +- inside strings and character constants. */ +-#define FOO(x) 'x' +-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +- +-int test (int i, double x); +-struct s1 {int (*f) (int a);}; +-struct s2 {int (*f) (double a);}; +-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +-int argc; +-char **argv; +-int +-main () +-{ +-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ +- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c89=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c89" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC +- +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c89" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c89" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c89" != xno; then : +- +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +-$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +-if ${am_cv_prog_cc_c_o+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +- # Make sure it works both with $CC and with simple cc. +- # Following AC_PROG_CC_C_O, we do the test twice because some +- # compilers refuse to overwrite an existing .o file with -o, +- # though they will create one. +- am_cv_prog_cc_c_o=yes +- for am_i in 1 2; do +- if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 +- ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); } \ +- && test -f conftest2.$ac_objext; then +- : OK +- else +- am_cv_prog_cc_c_o=no +- break +- fi +- done +- rm -f core conftest* +- unset am_i +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +-$as_echo "$am_cv_prog_cc_c_o" >&6; } +-if test "$am_cv_prog_cc_c_o" != yes; then +- # Losing compiler, so override with the script. +- # FIXME: It is wrong to rewrite CC. +- # But if we don't then we get into trouble of one sort or another. +- # A longer-term fix would be to have automake use am__CC in this case, +- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" +- CC="$am_aux_dir/compile $CC" +-fi +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- case $ac_cv_prog_cc_stdc in @%:@( +- no) : +- ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; @%:@( +- *) : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 +-$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } +-if ${ac_cv_prog_cc_c99+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c99=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include +-#include +- +-// Check varargs macros. These examples are taken from C99 6.10.3.5. +-#define debug(...) fprintf (stderr, __VA_ARGS__) +-#define showlist(...) puts (#__VA_ARGS__) +-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +-static void +-test_varargs_macros (void) +-{ +- int x = 1234; +- int y = 5678; +- debug ("Flag"); +- debug ("X = %d\n", x); +- showlist (The first, second, and third items.); +- report (x>y, "x is %d but y is %d", x, y); +-} +- +-// Check long long types. +-#define BIG64 18446744073709551615ull +-#define BIG32 4294967295ul +-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +-#if !BIG_OK +- your preprocessor is broken; +-#endif +-#if BIG_OK +-#else +- your preprocessor is broken; +-#endif +-static long long int bignum = -9223372036854775807LL; +-static unsigned long long int ubignum = BIG64; +- +-struct incomplete_array +-{ +- int datasize; +- double data[]; +-}; +- +-struct named_init { +- int number; +- const wchar_t *name; +- double average; +-}; +- +-typedef const char *ccp; +- +-static inline int +-test_restrict (ccp restrict text) +-{ +- // See if C++-style comments work. +- // Iterate through items via the restricted pointer. +- // Also check for declarations in for loops. +- for (unsigned int i = 0; *(text+i) != '\0'; ++i) +- continue; +- return 0; +-} +- +-// Check varargs and va_copy. +-static void +-test_varargs (const char *format, ...) +-{ +- va_list args; +- va_start (args, format); +- va_list args_copy; +- va_copy (args_copy, args); +- +- const char *str; +- int number; +- float fnumber; +- +- while (*format) +- { +- switch (*format++) +- { +- case 's': // string +- str = va_arg (args_copy, const char *); +- break; +- case 'd': // int +- number = va_arg (args_copy, int); +- break; +- case 'f': // float +- fnumber = va_arg (args_copy, double); +- break; +- default: +- break; +- } +- } +- va_end (args_copy); +- va_end (args); +-} +- +-int +-main () +-{ +- +- // Check bool. +- _Bool success = false; +- +- // Check restrict. +- if (test_restrict ("String literal") == 0) +- success = true; +- char *restrict newvar = "Another string"; +- +- // Check varargs. +- test_varargs ("s, d' f .", "string", 65, 34.234); +- test_varargs_macros (); +- +- // Check flexible array members. +- struct incomplete_array *ia = +- malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); +- ia->datasize = 10; +- for (int i = 0; i < ia->datasize; ++i) +- ia->data[i] = i * 1.234; +- +- // Check named initializers. +- struct named_init ni = { +- .number = 34, +- .name = L"Test wide string", +- .average = 543.34343, +- }; +- +- ni.number = 58; +- +- int dynamic_array[ni.number]; +- dynamic_array[ni.number - 1] = 543; +- +- // work around unused variable warnings +- return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' +- || dynamic_array[ni.number - 1] != 543); +- +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c99=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c99" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC +- +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c99" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c99" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +-$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c99" != xno; then : +- ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +-if ${ac_cv_prog_cc_c89+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_prog_cc_c89=no +-ac_save_CC=$CC +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-struct stat; +-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +-struct buf { int x; }; +-FILE * (*rcsopen) (struct buf *, struct stat *, int); +-static char *e (p, i) +- char **p; +- int i; +-{ +- return p[i]; +-} +-static char *f (char * (*g) (char **, int), char **p, ...) +-{ +- char *s; +- va_list v; +- va_start (v,p); +- s = g (p, va_arg (v,int)); +- va_end (v); +- return s; +-} +- +-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has +- function prototypes and stuff, but not '\xHH' hex character constants. +- These don't provoke an error unfortunately, instead are silently treated +- as 'x'. The following induces an error, until -std is added to get +- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an +- array size at least. It's necessary to write '\x00'==0 to get something +- that's true only with -std. */ +-int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +- +-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters +- inside strings and character constants. */ +-#define FOO(x) 'x' +-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +- +-int test (int i, double x); +-struct s1 {int (*f) (int a);}; +-struct s2 {int (*f) (double a);}; +-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +-int argc; +-char **argv; +-int +-main () +-{ +-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; +- ; +- return 0; +-} +-_ACEOF +-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ +- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +-do +- CC="$ac_save_CC $ac_arg" +- if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_prog_cc_c89=$ac_arg +-fi +-rm -f core conftest.err conftest.$ac_objext +- test "x$ac_cv_prog_cc_c89" != "xno" && break +-done +-rm -f conftest.$ac_ext +-CC=$ac_save_CC +- +-fi +-# AC_CACHE_VAL +-case "x$ac_cv_prog_cc_c89" in +- x) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; +- xno) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; +- *) +- CC="$CC $ac_cv_prog_cc_c89" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +-esac +-if test "x$ac_cv_prog_cc_c89" != xno; then : +- ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 +-else +- ac_cv_prog_cc_stdc=no +-fi +- +-fi +- ;; +-esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5 +-$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; } +- if ${ac_cv_prog_cc_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-fi +- +- case $ac_cv_prog_cc_stdc in @%:@( +- no) : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +-$as_echo "unsupported" >&6; } ;; @%:@( +- '') : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +-$as_echo "none needed" >&6; } ;; @%:@( +- *) : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5 +-$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;; +-esac +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +-$as_echo_n "checking how to run the C preprocessor... " >&6; } +-# On Suns, sometimes $CPP names a directory. +-if test -n "$CPP" && test -d "$CPP"; then +- CPP= +-fi +-if test -z "$CPP"; then +- if ${ac_cv_prog_CPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CPP needs to be expanded +- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" +- do +- ac_preproc_ok=false +-for ac_c_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- break +-fi +- +- done +- ac_cv_prog_CPP=$CPP +- +-fi +- CPP=$ac_cv_prog_CPP +-else +- ac_cv_prog_CPP=$CPP +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +-$as_echo "$CPP" >&6; } +-ac_preproc_ok=false +-for ac_c_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_c_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- +-# The C compiler on the build system, and associated tests. +- +-if test -n "$CC_FOR_BUILD"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system compiler $CC_FOR_BUILD" >&5 +-$as_echo_n "checking build system compiler $CC_FOR_BUILD... " >&6; } +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&5 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cc_for_build_works" >&5 +-$as_echo "$cc_for_build_works" >&6; } +-if test "$cc_for_build_works" = yes; then +- : +-else +- as_fn_error $? "Specified CC_FOR_BUILD doesn't seem to work" "$LINENO" 5 +-fi +- +-elif test -n "$HOST_CC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system compiler $HOST_CC" >&5 +-$as_echo_n "checking build system compiler $HOST_CC... " >&6; } +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&5 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cc_for_build_works" >&5 +-$as_echo "$cc_for_build_works" >&6; } +-if test "$cc_for_build_works" = yes; then +- CC_FOR_BUILD=$HOST_CC +-else +- as_fn_error $? "Specified HOST_CC doesn't seem to work" "$LINENO" 5 +-fi +- +-else +- for i in "$CC" "$CC $CFLAGS $CPPFLAGS" cc gcc c89 c99; do +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system compiler $i" >&5 +-$as_echo_n "checking build system compiler $i... " >&6; } +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&5 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cc_for_build_works" >&5 +-$as_echo "$cc_for_build_works" >&6; } +-if test "$cc_for_build_works" = yes; then +- CC_FOR_BUILD=$i +- break +-else +- : +-fi +- +- done +- if test -z "$CC_FOR_BUILD"; then +- as_fn_error $? "Cannot find a build system compiler" "$LINENO" 5 +- fi +-fi +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system preprocessor" >&5 +-$as_echo_n "checking for build system preprocessor... " >&6; } +-if test -z "$CPP_FOR_BUILD"; then +- if ${gmp_cv_prog_cpp_for_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } >&5 2>&1; then +- gmp_cv_prog_cpp_for_build=$i +- break +- fi +- done +- rm -f conftest* a.out b.out a.exe a_out.exe +- if test -z "$gmp_cv_prog_cpp_for_build"; then +- as_fn_error $? "Cannot find build system C preprocessor." "$LINENO" 5 +- fi +- +-fi +- +- CPP_FOR_BUILD=$gmp_cv_prog_cpp_for_build +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP_FOR_BUILD" >&5 +-$as_echo "$CPP_FOR_BUILD" >&6; } +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system executable suffix" >&5 +-$as_echo_n "checking for build system executable suffix... " >&6; } +-if ${gmp_cv_prog_exeext_for_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if (./conftest) 2>&5; then +- gmp_cv_prog_exeext_for_build=$i +- break +- fi +- fi +-done +-rm -f conftest* +-if test "${gmp_cv_prog_exeext_for_build+set}" != set; then +- as_fn_error $? "Cannot determine executable suffix" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_prog_exeext_for_build" >&5 +-$as_echo "$gmp_cv_prog_exeext_for_build" >&6; } +-EXEEXT_FOR_BUILD=$gmp_cv_prog_exeext_for_build +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build system compiler is ANSI" >&5 +-$as_echo_n "checking whether build system compiler is ANSI... " >&6; } +-if ${gmp_cv_c_for_build_ansi+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_cv_c_for_build_ansi=yes +-else +- gmp_cv_c_for_build_ansi=no +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_for_build_ansi" >&5 +-$as_echo "$gmp_cv_c_for_build_ansi" >&6; } +-if test "$gmp_cv_c_for_build_ansi" = yes; then +- U_FOR_BUILD= +-else +- U_FOR_BUILD=_ +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for build system compiler math library" >&5 +-$as_echo_n "checking for build system compiler math library... " >&6; } +-if ${gmp_cv_check_libm_for_build+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- gmp_cv_check_libm_for_build=-lm +-else +- gmp_cv_check_libm_for_build=no +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_check_libm_for_build" >&5 +-$as_echo "$gmp_cv_check_libm_for_build" >&6; } +-case $gmp_cv_check_libm_for_build in +- yes) LIBM_FOR_BUILD=-lm +- ;; +- no) LIBM_FOR_BUILD= ;; +- *) LIBM_FOR_BUILD=$gmp_cv_check_libm_for_build ;; +-esac +- +- +- +-# How to assemble, used with CFLAGS etc, see mpn/Makeasm.am. +-# Using the compiler is a lot easier than figuring out how to invoke the +-# assembler directly. +-# +-test -n "$CCAS" || CCAS="$CC -c" +- +- +- +-# The C++ compiler, if desired. +-want_cxx=no +-if test $enable_cxx != no; then +- test_CXXFLAGS=${CXXFLAGS+set} +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +-if test -z "$CXX"; then +- if test -n "$CCC"; then +- CXX=$CCC +- else +- if test -n "$ac_tool_prefix"; then +- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$CXX"; then +- ac_cv_prog_CXX="$CXX" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-CXX=$ac_cv_prog_CXX +-if test -n "$CXX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +-$as_echo "$CXX" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$CXX" && break +- done +-fi +-if test -z "$CXX"; then +- ac_ct_CXX=$CXX +- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_CXX"; then +- ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_CXX="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +-if test -n "$ac_ct_CXX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +-$as_echo "$ac_ct_CXX" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_CXX" && break +-done +- +- if test "x$ac_ct_CXX" = x; then +- CXX="g++" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- CXX=$ac_ct_CXX +- fi +-fi +- +- fi +-fi +-# Provide some information about the compiler. +-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +-set X $ac_compile +-ac_compiler=$2 +-for ac_option in --version -v -V -qversion; do +- { { ac_try="$ac_compiler $ac_option >&5" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_compiler $ac_option >&5") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- sed '10a\ +-... rest of stderr output deleted ... +- 10q' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- fi +- rm -f conftest.er1 conftest.err +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +-done +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +-if ${ac_cv_cxx_compiler_gnu+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +-#ifndef __GNUC__ +- choke me +-#endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_compiler_gnu=yes +-else +- ac_compiler_gnu=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +-if test $ac_compiler_gnu = yes; then +- GXX=yes +-else +- GXX= +-fi +-ac_test_CXXFLAGS=${CXXFLAGS+set} +-ac_save_CXXFLAGS=$CXXFLAGS +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +-$as_echo_n "checking whether $CXX accepts -g... " >&6; } +-if ${ac_cv_prog_cxx_g+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_save_cxx_werror_flag=$ac_cxx_werror_flag +- ac_cxx_werror_flag=yes +- ac_cv_prog_cxx_g=no +- CXXFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_cv_prog_cxx_g=yes +-else +- CXXFLAGS="" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- +-else +- ac_cxx_werror_flag=$ac_save_cxx_werror_flag +- CXXFLAGS="-g" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_compile "$LINENO"; then : +- ac_cv_prog_cxx_g=yes +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- ac_cxx_werror_flag=$ac_save_cxx_werror_flag +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +-$as_echo "$ac_cv_prog_cxx_g" >&6; } +-if test "$ac_test_CXXFLAGS" = set; then +- CXXFLAGS=$ac_save_CXXFLAGS +-elif test $ac_cv_prog_cxx_g = yes; then +- if test "$GXX" = yes; then +- CXXFLAGS="-g -O2" +- else +- CXXFLAGS="-g" +- fi +-else +- if test "$GXX" = yes; then +- CXXFLAGS="-O2" +- else +- CXXFLAGS= +- fi +-fi +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- echo "CXXFLAGS chosen by autoconf: $CXXFLAGS" >&5 +- cxxflags_ac_prog_cxx=$CXXFLAGS +- cxxflags_list=ac_prog_cxx +- +- # If the user didn't specify $CXXFLAGS, then try $CFLAGS, with -g removed +- # if AC_PROG_CXX thinks that doesn't work. $CFLAGS stands a good chance +- # of working, eg. on a GNU system where CC=gcc and CXX=g++. +- # +- if test "$test_CXXFLAGS" != set; then +- cxxflags_cflags=$CFLAGS +- cxxflags_list="cflags $cxxflags_list" +- if test "$ac_prog_cxx_g" = no; then +- cxxflags_cflags=`echo "$cxxflags_cflags" | sed -e 's/ -g //' -e 's/^-g //' -e 's/ -g$//'` +- fi +- fi +- +- # See if the C++ compiler works. If the user specified CXXFLAGS then all +- # we're doing is checking whether AC_PROG_CXX succeeded, since it doesn't +- # give a fatal error, just leaves CXX set to a default g++. If on the +- # other hand the user didn't specify CXXFLAGS then we get to try here our +- # $cxxflags_list alternatives. +- # +- # Automake includes $CPPFLAGS in a C++ compile, so we do the same here. +- # +- for cxxflags_choice in $cxxflags_list; do +- eval CXXFLAGS=\"\$cxxflags_$cxxflags_choice\" +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler $CXX $CPPFLAGS $CXXFLAGS" >&5 +-$as_echo_n "checking C++ compiler $CXX $CPPFLAGS $CXXFLAGS... " >&6; } +-gmp_prog_cxx_works=yes +- +-# start with a plain "main()", then go on to further checks +-if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <&5 +- gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS conftest.cc >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_cxxcompile\""; } >&5 +- (eval $gmp_cxxcompile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- gmp_prog_cxx_works="no, program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&5 +- cat conftest.cc >&5 +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +- +- +-if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <&5 +- gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS conftest.cc >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_cxxcompile\""; } >&5 +- (eval $gmp_cxxcompile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- gmp_prog_cxx_works="no, namespace, program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no, namespace" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&5 +- cat conftest.cc >&5 +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +- +- +-# GMP requires the standard C++ iostream classes +-if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <, only a +- pre-standard iostream.h. */ +-#include +- +-/* This test rejects OSF 5.1 Compaq C++ in its default pre-standard iostream +- mode, since that mode puts cout in the global namespace, not "std". */ +-void someoutput (void) { std::cout << 123; } +- +-int main (void) { return 0; } +-EOF +- echo "Test compile: std iostream" >&5 +- gmp_cxxcompile="$CXX $CPPFLAGS $CXXFLAGS conftest.cc >&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_cxxcompile\""; } >&5 +- (eval $gmp_cxxcompile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$cross_compiling" = no; then +- if { ac_try='./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; }; then :; +- else +- gmp_prog_cxx_works="no, std iostream, program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no, std iostream" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&5 +- cat conftest.cc >&5 +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_prog_cxx_works" >&5 +-$as_echo "$gmp_prog_cxx_works" >&6; } +-case $gmp_prog_cxx_works in +- yes) +- want_cxx=yes +- break +- ;; +- *) +- +- ;; +-esac +- +- done +- +- # If --enable-cxx=yes but a C++ compiler can't be found, then abort. +- if test $want_cxx = no && test $enable_cxx = yes; then +- as_fn_error $? "C++ compiler not available, see config.log for details" "$LINENO" 5 +- fi +-fi +- +- if test $want_cxx = yes; then +- WANT_CXX_TRUE= +- WANT_CXX_FALSE='#' +-else +- WANT_CXX_TRUE='#' +- WANT_CXX_FALSE= +-fi +- +- +-# FIXME: We're not interested in CXXCPP for ourselves, but if we don't do it +-# here then AC_PROG_LIBTOOL will AC_REQUIRE it (via _LT_AC_TAGCONFIG) and +-# hence execute it unconditionally, and that will fail if there's no C++ +-# compiler (and no generic /lib/cpp). +-# +-if test $want_cxx = yes; then +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +-$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +-if test -z "$CXXCPP"; then +- if ${ac_cv_prog_CXXCPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CXXCPP needs to be expanded +- for CXXCPP in "$CXX -E" "/lib/cpp" +- do +- ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- break +-fi +- +- done +- ac_cv_prog_CXXCPP=$CXXCPP +- +-fi +- CXXCPP=$ac_cv_prog_CXXCPP +-else +- ac_cv_prog_CXXCPP=$CXXCPP +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +-$as_echo "$CXXCPP" >&6; } +-ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-fi +- +- +-# Path setups for Cray, according to IEEE or CFP. These must come after +-# deciding the compiler. +-# +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +-$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +-if ${ac_cv_path_GREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$GREP"; then +- ac_path_GREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in grep ggrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_GREP" || continue +-# Check for GNU ac_path_GREP and select it if it is found. +- # Check for GNU $ac_path_GREP +-case `"$ac_path_GREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'GREP' >> "conftest.nl" +- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_GREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_GREP="$ac_path_GREP" +- ac_path_GREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_GREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_GREP"; then +- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_GREP=$GREP +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +-$as_echo "$ac_cv_path_GREP" >&6; } +- GREP="$ac_cv_path_GREP" +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +-$as_echo_n "checking for egrep... " >&6; } +-if ${ac_cv_path_EGREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 +- then ac_cv_path_EGREP="$GREP -E" +- else +- if test -z "$EGREP"; then +- ac_path_EGREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in egrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_EGREP" || continue +-# Check for GNU ac_path_EGREP and select it if it is found. +- # Check for GNU $ac_path_EGREP +-case `"$ac_path_EGREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'EGREP' >> "conftest.nl" +- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_EGREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_EGREP="$ac_path_EGREP" +- ac_path_EGREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_EGREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_EGREP"; then +- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_EGREP=$EGREP +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +-$as_echo "$ac_cv_path_EGREP" >&6; } +- EGREP="$ac_cv_path_EGREP" +- +- +-case $host_cpu in +- c90 | t90) +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#ifdef _CRAYIEEE +-yes +-#endif +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "yes" >/dev/null 2>&1; then : +- add_path="cray/ieee" +-else +- add_path="cray/cfp"; extra_functions="mulwwc90" +-fi +-rm -f conftest* +- +- ;; +- j90 | sv1) +- add_path="cray/cfp"; extra_functions="mulwwj90" +- ;; +-esac +- +- +- +-if test -z "$MPN_PATH"; then +- path="$add_path $path" +-fi +- +-# For a nail build, also look in "nails" subdirectories. +-# +-if test $GMP_NAIL_BITS != 0 && test -z "$MPN_PATH"; then +- new_path= +- for i in $path; do +- case $i in +- generic) new_path="$new_path $i" ;; +- *) new_path="$new_path $i/nails $i" ;; +- esac +- done +- path=$new_path +-fi +- +- +-# Put all directories into CPUVEC_list so as to get a full set of +-# CPUVEC_SETUP_$tmp_suffix defines into config.h, even if some of them are +-# empty because mmx and/or sse2 had to be dropped. +-# +-for i in $fat_path; do +- tmp_suffix=`echo $i | sed -e '/\//s:^[^/]*/::' -e 's:[\\/]:_:g'` +- CPUVEC_list="$CPUVEC_list CPUVEC_SETUP_$tmp_suffix" +-done +- +- +-# If there's any sse2 or mmx in the path, check whether the assembler +-# supports it, and remove if not. +-# +-# We only need this in ABI=32, for ABI=64 on x86_64 we can assume a new +-# enough assembler. +-# +-case $host in +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- if test "$ABI" = 32; then +- case "$path $fat_path" in +- *mmx*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about MMX instructions" >&5 +-$as_echo_n "checking if the assembler knows about MMX instructions... " >&6; } +-if ${gmp_cv_asm_x86_mmx+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_mmx=yes +-case $host in +-*-*-solaris*) +- if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then +- if grep "0f 6f c1" conftest.out >/dev/null; then +- gmp_cv_asm_x86_mmx=movq-bug +- fi +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"dis\" not available to check for \"as\" movq bug" >&5 +-$as_echo "$as_me: WARNING: \"dis\" not available to check for \"as\" movq bug" >&2;} +- fi +-esac +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_mmx=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_mmx" >&5 +-$as_echo "$gmp_cv_asm_x86_mmx" >&6; } +- +-case $gmp_cv_asm_x86_mmx in +-movq-bug) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has MMX code, but the assembler" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has MMX code, but the assembler" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | has the Solaris 2.6 and 2.7 bug where register to register" >&5 +-$as_echo "$as_me: WARNING: | has the Solaris 2.6 and 2.7 bug where register to register" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | movq operands are reversed." >&5 +-$as_echo "$as_me: WARNING: | movq operands are reversed." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Non-MMX replacements will be used." >&5 +-$as_echo "$as_me: WARNING: | Non-MMX replacements will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- ;; +-no) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has MMX code, but it can't be assembled by" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has MMX code, but it can't be assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Non-MMX replacements will be used." >&5 +-$as_echo "$as_me: WARNING: | Non-MMX replacements will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- ;; +-esac +-if test "$gmp_cv_asm_x86_mmx" = yes; then +- : +-else +- tmp_path= +-for i in $path; do +- case $i in +- */*mmx*) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */*mmx*) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +-fi +- ;; +- esac +- case "$path $fat_path" in +- *sse2*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about SSE2 instructions" >&5 +-$as_echo_n "checking if the assembler knows about SSE2 instructions... " >&6; } +-if ${gmp_cv_asm_x86_sse2+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_sse2=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_sse2=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_sse2" >&5 +-$as_echo "$gmp_cv_asm_x86_sse2" >&6; } +-case $gmp_cv_asm_x86_sse2 in +-yes) +- : +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has SSE2 code, but it can't be assembled by" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has SSE2 code, but it can't be assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Non-SSE2 replacements will be used." >&5 +-$as_echo "$as_me: WARNING: | Non-SSE2 replacements will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- tmp_path= +-for i in $path; do +- case $i in +- */sse2) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */sse2) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +- ;; +-esac +- ;; +- esac +- fi +- case "$path $fat_path" in +- *mulx*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about the mulx instruction" >&5 +-$as_echo_n "checking if the assembler knows about the mulx instruction... " >&6; } +-if ${gmp_cv_asm_x86_mulx+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_mulx=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_mulx=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_mulx" >&5 +-$as_echo "$gmp_cv_asm_x86_mulx" >&6; } +-case $gmp_cv_asm_x86_mulx in +-yes) +- : +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has the mulx instruction, but it can't be" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has the mulx instruction, but it can't be" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | assembled by" >&5 +-$as_echo "$as_me: WARNING: | assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Older x86 instructions will be used." >&5 +-$as_echo "$as_me: WARNING: | Older x86 instructions will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- tmp_path= +-for i in $path; do +- case $i in +- */mulx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */mulx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +- ;; +-esac +- ;; +- esac +- case "$path $fat_path" in +- *adx*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler knows about the adox instruction" >&5 +-$as_echo_n "checking if the assembler knows about the adox instruction... " >&6; } +-if ${gmp_cv_asm_x86_adx+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_adx=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_adx=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_adx" >&5 +-$as_echo "$gmp_cv_asm_x86_adx" >&6; } +-case $gmp_cv_asm_x86_adx in +-yes) +- : +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | WARNING WARNING WARNING" >&5 +-$as_echo "$as_me: WARNING: | WARNING WARNING WARNING" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Host CPU has the adcx and adox instructions, but they" >&5 +-$as_echo "$as_me: WARNING: | Host CPU has the adcx and adox instructions, but they" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | can't be assembled by" >&5 +-$as_echo "$as_me: WARNING: | can't be assembled by" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&5 +-$as_echo "$as_me: WARNING: | $CCAS $CFLAGS $CPPFLAGS" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Older x86 instructions will be used." >&5 +-$as_echo "$as_me: WARNING: | Older x86 instructions will be used." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | This will be an inferior build." >&5 +-$as_echo "$as_me: WARNING: | This will be an inferior build." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- tmp_path= +-for i in $path; do +- case $i in +- */adx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-path="$tmp_path" +- +-tmp_path= +-for i in $fat_path; do +- case $i in +- */adx) ;; +- *) tmp_path="$tmp_path $i" ;; +- esac +-done +-fat_path="$tmp_path" +- +- +- ;; +-esac +- ;; +- esac +- ;; +-esac +- +- +-if test "$enable_assembly" = "no"; then +- path="generic" +- CFLAGS="$CFLAGS -DNO_ASM" +-# for abi in $abilist; do +-# eval unset "path_\$abi" +-# eval gcc_${abi}_cflags=\"\$gcc_${abi}_cflags -DNO_ASM\" +-# done +-fi +- +- +-cat >&5 <&5 +-$as_echo_n "checking whether assembler supports --noexecstack option... " >&6; } +-if ${cl_cv_as_noexecstack+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat > conftest.c <&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; } \ +- && grep .note.GNU-stack conftest.s >/dev/null \ +- && { ac_try='${CC} $CFLAGS $CPPFLAGS -Wa,--noexecstack +- -c -o conftest.o conftest.s >/dev/null' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 +- (eval $ac_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; } +- then +- cl_cv_as_noexecstack=yes +- else +- cl_cv_as_noexecstack=no +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cl_cv_as_noexecstack" >&5 +-$as_echo "$cl_cv_as_noexecstack" >&6; } +- if test "$cl_cv_as_noexecstack" = yes; then +- ASMFLAGS="$ASMFLAGS -Wa,--noexecstack" +- fi +- +- +- +- +-gmp_user_AR=$AR +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ar; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AR"; then +- ac_cv_prog_AR="$AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AR="${ac_tool_prefix}ar" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AR=$ac_cv_prog_AR +-if test -n "$AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +-$as_echo "$AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_AR"; then +- ac_ct_AR=$AR +- # Extract the first word of "ar", so it can be a program name with args. +-set dummy ar; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AR"; then +- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_AR="ar" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_AR=$ac_cv_prog_ac_ct_AR +-if test -n "$ac_ct_AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +-$as_echo "$ac_ct_AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_AR" = x; then +- AR="ar" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- AR=$ac_ct_AR +- fi +-else +- AR="$ac_cv_prog_AR" +-fi +- +-if test -z "$gmp_user_AR"; then +- eval arflags=\"\$ar${abi1}_flags\" +- test -n "$arflags" || eval arflags=\"\$ar${abi2}_flags\" +- if test -n "$arflags"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra ar flags" >&5 +-$as_echo_n "checking for extra ar flags... " >&6; } +- AR="$AR $arflags" +- ac_cv_prog_AR="$AR $arflags" +- ac_cv_prog_ac_ct_AR="$AR $arflags" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $arflags" >&5 +-$as_echo "$arflags" >&6; } +- fi +-fi +-if test -z "$AR_FLAGS"; then +- AR_FLAGS=cq +-fi +- +- +-gmp_user_NM=$NM +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +-if ${lt_cv_path_NM+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$NM"; then +- # Let the user override the test. +- lt_cv_path_NM="$NM" +-else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/$lt_tmp_nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no} +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +-$as_echo "$lt_cv_path_NM" >&6; } +-if test "$lt_cv_path_NM" != "no"; then +- NM="$lt_cv_path_NM" +-else +- # Didn't find any BSD compatible name lister, look for dumpbin. +- if test -n "$DUMPBIN"; then : +- # Let the user override the test. +- else +- if test -n "$ac_tool_prefix"; then +- for ac_prog in dumpbin "link -dump" +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DUMPBIN"; then +- ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DUMPBIN=$ac_cv_prog_DUMPBIN +-if test -n "$DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +-$as_echo "$DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$DUMPBIN" && break +- done +-fi +-if test -z "$DUMPBIN"; then +- ac_ct_DUMPBIN=$DUMPBIN +- for ac_prog in dumpbin "link -dump" +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DUMPBIN"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +-if test -n "$ac_ct_DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +-$as_echo "$ac_ct_DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_DUMPBIN" && break +-done +- +- if test "x$ac_ct_DUMPBIN" = x; then +- DUMPBIN=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DUMPBIN=$ac_ct_DUMPBIN +- fi +-fi +- +- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in +- *COFF*) +- DUMPBIN="$DUMPBIN -symbols" +- ;; +- *) +- DUMPBIN=: +- ;; +- esac +- fi +- +- if test "$DUMPBIN" != ":"; then +- NM="$DUMPBIN" +- fi +-fi +-test -z "$NM" && NM=nm +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +-$as_echo_n "checking the name lister ($NM) interface... " >&6; } +-if ${lt_cv_nm_interface+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: output\"" >&5) +- cat conftest.out >&5 +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +-$as_echo "$lt_cv_nm_interface" >&6; } +- +- +-# FIXME: When cross compiling (ie. $ac_tool_prefix not empty), libtool +-# defaults to plain "nm" if a "${ac_tool_prefix}nm" is not found. In this +-# case run it again to try the native "nm", firstly so that likely locations +-# are searched, secondly so that -B or -p are added if necessary for BSD +-# format. This is necessary for instance on OSF with "./configure +-# --build=alphaev5-dec-osf --host=alphaev6-dec-osf". +-# +-if test -z "$gmp_user_NM" && test -n "$ac_tool_prefix" && test "$NM" = nm; then +- $as_unset lt_cv_path_NM +- gmp_save_ac_tool_prefix=$ac_tool_prefix +- ac_tool_prefix= +- NM= +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +-if ${lt_cv_path_NM+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$NM"; then +- # Let the user override the test. +- lt_cv_path_NM="$NM" +-else +- lt_nm_to_check="${ac_tool_prefix}nm" +- if test -n "$ac_tool_prefix" && test "$build" = "$host"; then +- lt_nm_to_check="$lt_nm_to_check nm" +- fi +- for lt_tmp_nm in $lt_nm_to_check; do +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- tmp_nm="$ac_dir/$lt_tmp_nm" +- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then +- # Check to see if the nm accepts a BSD-compat flag. +- # Adding the `sed 1q' prevents false positives on HP-UX, which says: +- # nm: unknown option "B" ignored +- # Tru64's nm complains that /dev/null is an invalid object file +- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no} +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +-$as_echo "$lt_cv_path_NM" >&6; } +-if test "$lt_cv_path_NM" != "no"; then +- NM="$lt_cv_path_NM" +-else +- # Didn't find any BSD compatible name lister, look for dumpbin. +- if test -n "$DUMPBIN"; then : +- # Let the user override the test. +- else +- if test -n "$ac_tool_prefix"; then +- for ac_prog in dumpbin "link -dump" +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DUMPBIN"; then +- ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DUMPBIN=$ac_cv_prog_DUMPBIN +-if test -n "$DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +-$as_echo "$DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$DUMPBIN" && break +- done +-fi +-if test -z "$DUMPBIN"; then +- ac_ct_DUMPBIN=$DUMPBIN +- for ac_prog in dumpbin "link -dump" +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DUMPBIN"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +-if test -n "$ac_ct_DUMPBIN"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +-$as_echo "$ac_ct_DUMPBIN" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_DUMPBIN" && break +-done +- +- if test "x$ac_ct_DUMPBIN" = x; then +- DUMPBIN=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DUMPBIN=$ac_ct_DUMPBIN +- fi +-fi +- +- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in +- *COFF*) +- DUMPBIN="$DUMPBIN -symbols" +- ;; +- *) +- DUMPBIN=: +- ;; +- esac +- fi +- +- if test "$DUMPBIN" != ":"; then +- NM="$DUMPBIN" +- fi +-fi +-test -z "$NM" && NM=nm +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +-$as_echo_n "checking the name lister ($NM) interface... " >&6; } +-if ${lt_cv_nm_interface+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&5 +- (eval echo "\"\$as_me:$LINENO: output\"" >&5) +- cat conftest.out >&5 +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +-$as_echo "$lt_cv_nm_interface" >&6; } +- +- ac_tool_prefix=$gmp_save_ac_tool_prefix +-fi +- +-if test -z "$gmp_user_NM"; then +- eval nmflags=\"\$nm${abi1}_flags\" +- test -n "$nmflags" || eval nmflags=\"\$nm${abi2}_flags\" +- if test -n "$nmflags"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra nm flags" >&5 +-$as_echo_n "checking for extra nm flags... " >&6; } +- NM="$NM $nmflags" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmflags" >&5 +-$as_echo "$nmflags" >&6; } +- fi +-fi +- +- +-case $host in +- # FIXME: On AIX 3 and 4, $libname.a is included in libtool +- # $library_names_spec, so libgmp.a becomes a symlink to libgmp.so, making +- # it impossible to build shared and static libraries simultaneously. +- # Disable shared libraries by default, but let the user override with +- # --enable-shared --disable-static. +- # +- # FIXME: This $libname.a problem looks like it might apply to *-*-amigaos* +- # and *-*-os2* too, but wait for someone to test this before worrying +- # about it. If there is a problem then of course libtool is the right +- # place to fix it. +- # +- *-*-aix[34]*) +- if test -z "$enable_shared"; then enable_shared=no; fi ;; +-esac +- +- +-# Configs for Windows DLLs. +- +-enable_win32_dll=yes +- +-case $host in +-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +-set dummy ${ac_tool_prefix}as; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AS+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AS"; then +- ac_cv_prog_AS="$AS" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AS="${ac_tool_prefix}as" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AS=$ac_cv_prog_AS +-if test -n "$AS"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +-$as_echo "$AS" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_AS"; then +- ac_ct_AS=$AS +- # Extract the first word of "as", so it can be a program name with args. +-set dummy as; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_AS+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AS"; then +- ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_AS="as" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_AS=$ac_cv_prog_ac_ct_AS +-if test -n "$ac_ct_AS"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +-$as_echo "$ac_ct_AS" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_AS" = x; then +- AS="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- AS=$ac_ct_AS +- fi +-else +- AS="$ac_cv_prog_AS" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +-set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DLLTOOL"; then +- ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DLLTOOL=$ac_cv_prog_DLLTOOL +-if test -n "$DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +-$as_echo "$DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_DLLTOOL"; then +- ac_ct_DLLTOOL=$DLLTOOL +- # Extract the first word of "dlltool", so it can be a program name with args. +-set dummy dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DLLTOOL"; then +- ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DLLTOOL="dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +-if test -n "$ac_ct_DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +-$as_echo "$ac_ct_DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_DLLTOOL" = x; then +- DLLTOOL="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DLLTOOL=$ac_ct_DLLTOOL +- fi +-else +- DLLTOOL="$ac_cv_prog_DLLTOOL" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +-set dummy ${ac_tool_prefix}objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OBJDUMP"; then +- ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OBJDUMP=$ac_cv_prog_OBJDUMP +-if test -n "$OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +-$as_echo "$OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OBJDUMP"; then +- ac_ct_OBJDUMP=$OBJDUMP +- # Extract the first word of "objdump", so it can be a program name with args. +-set dummy objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OBJDUMP"; then +- ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OBJDUMP="objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +-if test -n "$ac_ct_OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +-$as_echo "$ac_ct_OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OBJDUMP" = x; then +- OBJDUMP="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OBJDUMP=$ac_ct_OBJDUMP +- fi +-else +- OBJDUMP="$ac_cv_prog_OBJDUMP" +-fi +- +- ;; +-esac +- +-test -z "$AS" && AS=as +- +- +- +- +- +-test -z "$DLLTOOL" && DLLTOOL=dlltool +- +- +- +- +- +-test -z "$OBJDUMP" && OBJDUMP=objdump +- +- +- +- +- +- +- +- +-LIBGMP_DLL=0 +- +-case $host in +- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) +- # By default, build only static. +- if test -z "$enable_shared"; then +- enable_shared=no +- fi +- # Don't allow both static and DLL. +- if test "$enable_shared" != no && test "$enable_static" != no; then +- as_fn_error $? "cannot build both static and DLL, since gmp.h is different for each. +-Use \"--disable-static --enable-shared\" to build just a DLL." "$LINENO" 5 +- fi +- +- # "-no-undefined" is required when building a DLL, see documentation on +- # AC_LIBTOOL_WIN32_DLL. +- # +- # "-Wl,--export-all-symbols" is a bit of a hack, it gets all libgmp and +- # libgmpxx functions and variables exported. This is what libtool did +- # in the past, and it's convenient for us in the test programs. +- # +- # Maybe it'd be prudent to check for --export-all-symbols before using +- # it, but it seems to have been in ld since at least 2000, and there's +- # not really any alternative we want to take up at the moment. +- # +- # "-Wl,output-def" is used to get a .def file for use by MS lib to make +- # a .lib import library, described in the manual. libgmp-3.dll.def +- # corresponds to the libmp-3.dll.def generated by libtool (as a result +- # of -export-symbols on that library). +- # +- # Incidentally, libtool does generate an import library libgmp.dll.a, +- # but it's "ar" format and cannot be used by the MS linker. There +- # doesn't seem to be any GNU tool for generating or converting to .lib. +- # +- # FIXME: The .def files produced by -Wl,output-def include isascii, +- # iscsym, iscsymf and toascii, apparently because mingw ctype.h doesn't +- # inline isascii (used in gmp). It gives an extern inline for +- # __isascii, but for some reason not the plain isascii. +- # +- if test "$enable_shared" = yes; then +- GMP_LDFLAGS="$GMP_LDFLAGS -no-undefined -Wl,--export-all-symbols" +- LIBGMP_LDFLAGS="$LIBGMP_LDFLAGS -Wl,--output-def,.libs/libgmp-3.dll.def" +- LIBGMPXX_LDFLAGS="$LIBGMP_LDFLAGS -Wl,--output-def,.libs/libgmpxx-3.dll.def" +- LIBGMP_DLL=1 +- fi +- ;; +-esac +- +- +-# Ensure that $CONFIG_SHELL is available for AC_LIBTOOL_SYS_MAX_CMD_LEN. +-# It's often set already by _LT_AC_PROG_ECHO_BACKSLASH or +-# _AS_LINENO_PREPARE, but not always. +-# +-# The symptom of CONFIG_SHELL unset is some "expr" errors during the test, +-# and an empty result. This only happens when invoked as "sh configure", +-# ie. no path, and can be seen for instance on ia64-*-hpux*. +-# +-# FIXME: Newer libtool should have it's own fix for this. +-# +-if test -z "$CONFIG_SHELL"; then +- CONFIG_SHELL=$SHELL +-fi +- +-# Enable CXX in libtool only if we want it, and never enable GCJ, nor RC on +-# mingw and cygwin. Under --disable-cxx this avoids some error messages +-# from libtool arising from the fact we didn't actually run AC_PROG_CXX. +-# Notice that any user-supplied --with-tags setting takes precedence. +-# +-# FIXME: Is this the right way to get this effect? Very possibly not, but +-# the current _LT_AC_TAGCONFIG doesn't really suggest an alternative. +-# +-if test "${with_tags+set}" != set; then +- if test $want_cxx = yes; then +- with_tags=CXX +- else +- with_tags= +- fi +-fi +- +-# The dead hand of AC_REQUIRE makes AC_PROG_LIBTOOL expand and execute +-# AC_PROG_F77, even when F77 is not in the selected with_tags. This is +-# probably harmless, but it's unsightly and bloats our configure, so pretend +-# AC_PROG_F77 has been expanded already. +-# +-# FIXME: Rumour has it libtool will one day provide a way for a configure.in +-# to say what it wants from among supported languages etc. +-# +-#AC_PROVIDE([AC_PROG_F77]) +- +-case `pwd` in +- *\ * | *\ *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +-esac +- +- +- +-macro_version='2.4.2' +-macro_revision='1.3337' +- +- +- +- +- +- +- +- +- +- +- +- +- +-ltmain="$ac_aux_dir/ltmain.sh" +- +-# Backslashify metacharacters that are still active within +-# double-quoted strings. +-sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +- +-# Same as above, but do not quote variable references. +-double_quote_subst='s/\(["`\\]\)/\\\1/g' +- +-# Sed substitution to delay expansion of an escaped shell variable in a +-# double_quote_subst'ed string. +-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +- +-# Sed substitution to delay expansion of an escaped single quote. +-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' +- +-# Sed substitution to avoid accidental globbing in evaled expressions +-no_glob_subst='s/\*/\\\*/g' +- +-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +-$as_echo_n "checking how to print strings... " >&6; } +-# Test print first, because it will be a builtin if present. +-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ +- test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then +- ECHO='print -r --' +-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then +- ECHO='printf %s\n' +-else +- # Use this function as a fallback that always works. +- func_fallback_echo () +- { +- eval 'cat <<_LTECHO_EOF +-$1 +-_LTECHO_EOF' +- } +- ECHO='func_fallback_echo' +-fi +- +-# func_echo_all arg... +-# Invoke $ECHO with all args, space-separated. +-func_echo_all () +-{ +- $ECHO "" +-} +- +-case "$ECHO" in +- printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +-$as_echo "printf" >&6; } ;; +- print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +-$as_echo "print -r" >&6; } ;; +- *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +-$as_echo "cat" >&6; } ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +-$as_echo_n "checking for a sed that does not truncate output... " >&6; } +-if ${ac_cv_path_SED+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ +- for ac_i in 1 2 3 4 5 6 7; do +- ac_script="$ac_script$as_nl$ac_script" +- done +- echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed +- { ac_script=; unset ac_script;} +- if test -z "$SED"; then +- ac_path_SED_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in sed gsed; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_SED" || continue +-# Check for GNU ac_path_SED and select it if it is found. +- # Check for GNU $ac_path_SED +-case `"$ac_path_SED" --version 2>&1` in +-*GNU*) +- ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo '' >> "conftest.nl" +- "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_SED_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_SED="$ac_path_SED" +- ac_path_SED_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_SED_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_SED"; then +- as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 +- fi +-else +- ac_cv_path_SED=$SED +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +-$as_echo "$ac_cv_path_SED" >&6; } +- SED="$ac_cv_path_SED" +- rm -f conftest.sed +- +-test -z "$SED" && SED=sed +-Xsed="$SED -e 1s/^X//" +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +-$as_echo_n "checking for fgrep... " >&6; } +-if ${ac_cv_path_FGREP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 +- then ac_cv_path_FGREP="$GREP -F" +- else +- if test -z "$FGREP"; then +- ac_path_FGREP_found=false +- # Loop through the user's path and test for each of PROGNAME-LIST +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_prog in fgrep; do +- for ac_exec_ext in '' $ac_executable_extensions; do +- ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" +- as_fn_executable_p "$ac_path_FGREP" || continue +-# Check for GNU ac_path_FGREP and select it if it is found. +- # Check for GNU $ac_path_FGREP +-case `"$ac_path_FGREP" --version 2>&1` in +-*GNU*) +- ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +-*) +- ac_count=0 +- $as_echo_n 0123456789 >"conftest.in" +- while : +- do +- cat "conftest.in" "conftest.in" >"conftest.tmp" +- mv "conftest.tmp" "conftest.in" +- cp "conftest.in" "conftest.nl" +- $as_echo 'FGREP' >> "conftest.nl" +- "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break +- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break +- as_fn_arith $ac_count + 1 && ac_count=$as_val +- if test $ac_count -gt ${ac_path_FGREP_max-0}; then +- # Best one so far, save it but keep looking for a better one +- ac_cv_path_FGREP="$ac_path_FGREP" +- ac_path_FGREP_max=$ac_count +- fi +- # 10*(2^10) chars as input seems more than enough +- test $ac_count -gt 10 && break +- done +- rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +-esac +- +- $ac_path_FGREP_found && break 3 +- done +- done +- done +-IFS=$as_save_IFS +- if test -z "$ac_cv_path_FGREP"; then +- as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 +- fi +-else +- ac_cv_path_FGREP=$FGREP +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +-$as_echo "$ac_cv_path_FGREP" >&6; } +- FGREP="$ac_cv_path_FGREP" +- +- +-test -z "$GREP" && GREP=grep +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-@%:@ Check whether --with-gnu-ld was given. +-if test "${with_gnu_ld+set}" = set; then : +- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +-else +- with_gnu_ld=no +-fi +- +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +-$as_echo_n "checking for ld used by $CC... " >&6; } +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [\\/]* | ?:[\\/]*) +- re_direlt='/[^/][^/]*/\.\./' +- # Canonicalize the pathname of ld +- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` +- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +-$as_echo_n "checking for GNU ld... " >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +-$as_echo_n "checking for non-GNU ld... " >&6; } +-fi +-if ${lt_cv_path_LD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$LD"; then +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$lt_cv_path_LD" -v 2>&1 &5 +-$as_echo "$LD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +-if ${lt_cv_prog_gnu_ld+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # I'd rather use --version here, but apparently some GNU lds only accept -v. +-case `$LD -v 2>&1 &5 +-$as_echo "$lt_cv_prog_gnu_ld" >&6; } +-with_gnu_ld=$lt_cv_prog_gnu_ld +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +-$as_echo_n "checking whether ln -s works... " >&6; } +-LN_S=$as_ln_s +-if test "$LN_S" = "ln -s"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +-$as_echo "no, using $LN_S" >&6; } +-fi +- +-# find the maximum length of command line arguments +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +-$as_echo_n "checking the maximum length of command line arguments... " >&6; } +-if ${lt_cv_sys_max_cmd_len+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- i=0 +- teststring="ABCD" +- +- case $build_os in +- msdosdjgpp*) +- # On DJGPP, this test can blow up pretty badly due to problems in libc +- # (any single argument exceeding 2000 bytes causes a buffer overrun +- # during glob expansion). Even if it were fixed, the result of this +- # check would be larger than it should be. +- lt_cv_sys_max_cmd_len=12288; # 12K is about right +- ;; +- +- gnu*) +- # Under GNU Hurd, this test is not required because there is +- # no limit to the length of command line arguments. +- # Libtool will interpret -1 as no limit whatsoever +- lt_cv_sys_max_cmd_len=-1; +- ;; +- +- cygwin* | mingw* | cegcc*) +- # On Win9x/ME, this test blows up -- it succeeds, but takes +- # about 5 minutes as the teststring grows exponentially. +- # Worse, since 9x/ME are not pre-emptively multitasking, +- # you end up with a "frozen" computer, even though with patience +- # the test eventually succeeds (with a max line length of 256k). +- # Instead, let's just punt: use the minimum linelength reported by +- # all of the supported platforms: 8192 (on NT/2K/XP). +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- mint*) +- # On MiNT this can take a long time and run out of memory. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- amigaos*) +- # On AmigaOS with pdksh, this test takes hours, literally. +- # So we just punt and use a minimum line length of 8192. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) +- # This has been around since 386BSD, at least. Likely further. +- if test -x /sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` +- elif test -x /usr/sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` +- else +- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs +- fi +- # And add a safety zone +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- ;; +- +- interix*) +- # We know the value 262144 and hardcode it with a safety zone (like BSD) +- lt_cv_sys_max_cmd_len=196608 +- ;; +- +- os2*) +- # The test takes a long time on OS/2. +- lt_cv_sys_max_cmd_len=8192 +- ;; +- +- osf*) +- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure +- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not +- # nice to cause kernel panics so lets avoid the loop below. +- # First set a reasonable default. +- lt_cv_sys_max_cmd_len=16384 +- # +- if test -x /sbin/sysconfig; then +- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in +- *1*) lt_cv_sys_max_cmd_len=-1 ;; +- esac +- fi +- ;; +- sco3.2v5*) +- lt_cv_sys_max_cmd_len=102400 +- ;; +- sysv5* | sco5v6* | sysv4.2uw2*) +- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` +- if test -n "$kargmax"; then +- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` +- else +- lt_cv_sys_max_cmd_len=32768 +- fi +- ;; +- *) +- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` +- if test -n "$lt_cv_sys_max_cmd_len" && \ +- test undefined != "$lt_cv_sys_max_cmd_len"; then +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- else +- # Make teststring a little bigger before we do anything with it. +- # a 1K string should be a reasonable start. +- for i in 1 2 3 4 5 6 7 8 ; do +- teststring=$teststring$teststring +- done +- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} +- # If test is not a shell built-in, we'll probably end up computing a +- # maximum length that is only half of the actual maximum length, but +- # we can't tell. +- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ +- = "X$teststring$teststring"; } >/dev/null 2>&1 && +- test $i != 17 # 1/2 MB should be enough +- do +- i=`expr $i + 1` +- teststring=$teststring$teststring +- done +- # Only check the string length outside the loop. +- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` +- teststring= +- # Add a significant safety factor because C++ compilers can tack on +- # massive amounts of additional arguments before passing them to the +- # linker. It appears as though 1/2 is a usable value. +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` +- fi +- ;; +- esac +- +-fi +- +-if test -n $lt_cv_sys_max_cmd_len ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +-$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +-$as_echo "none" >&6; } +-fi +-max_cmd_len=$lt_cv_sys_max_cmd_len +- +- +- +- +- +- +-: ${CP="cp -f"} +-: ${MV="mv -f"} +-: ${RM="rm -f"} +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +-# Try some XSI features +-xsi_shell=no +-( _lt_dummy="a/b/c" +- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ +- = c,a/b,b/c, \ +- && eval 'test $(( 1 + 1 )) -eq 2 \ +- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ +- && xsi_shell=yes +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +-$as_echo "$xsi_shell" >&6; } +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +-lt_shell_append=no +-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ +- >/dev/null 2>&1 \ +- && lt_shell_append=yes +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +-$as_echo "$lt_shell_append" >&6; } +- +- +-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +- lt_unset=unset +-else +- lt_unset=false +-fi +- +- +- +- +- +-# test EBCDIC or ASCII +-case `echo X|tr X '\101'` in +- A) # ASCII based system +- # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr +- lt_SP2NL='tr \040 \012' +- lt_NL2SP='tr \015\012 \040\040' +- ;; +- *) # EBCDIC based system +- lt_SP2NL='tr \100 \n' +- lt_NL2SP='tr \r\n \100\100' +- ;; +-esac +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +-$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +-if ${lt_cv_to_host_file_cmd+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-mingw* ) +- case $build in +- *-*-mingw* ) # actually msys +- lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 +- ;; +- *-*-cygwin* ) +- lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 +- ;; +- * ) # otherwise, assume *nix +- lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 +- ;; +- esac +- ;; +- *-*-cygwin* ) +- case $build in +- *-*-mingw* ) # actually msys +- lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin +- ;; +- *-*-cygwin* ) +- lt_cv_to_host_file_cmd=func_convert_file_noop +- ;; +- * ) # otherwise, assume *nix +- lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin +- ;; +- esac +- ;; +- * ) # unhandled hosts (and "normal" native builds) +- lt_cv_to_host_file_cmd=func_convert_file_noop +- ;; +-esac +- +-fi +- +-to_host_file_cmd=$lt_cv_to_host_file_cmd +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +-$as_echo "$lt_cv_to_host_file_cmd" >&6; } +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +-if ${lt_cv_to_tool_file_cmd+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- #assume ordinary cross tools, or native build. +-lt_cv_to_tool_file_cmd=func_convert_file_noop +-case $host in +- *-*-mingw* ) +- case $build in +- *-*-mingw* ) # actually msys +- lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 +- ;; +- esac +- ;; +-esac +- +-fi +- +-to_tool_file_cmd=$lt_cv_to_tool_file_cmd +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +-$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +-$as_echo_n "checking for $LD option to reload object files... " >&6; } +-if ${lt_cv_ld_reload_flag+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ld_reload_flag='-r' +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +-$as_echo "$lt_cv_ld_reload_flag" >&6; } +-reload_flag=$lt_cv_ld_reload_flag +-case $reload_flag in +-"" | " "*) ;; +-*) reload_flag=" $reload_flag" ;; +-esac +-reload_cmds='$LD$reload_flag -o $output$reload_objs' +-case $host_os in +- cygwin* | mingw* | pw32* | cegcc*) +- if test "$GCC" != yes; then +- reload_cmds=false +- fi +- ;; +- darwin*) +- if test "$GCC" = yes; then +- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' +- else +- reload_cmds='$LD$reload_flag -o $output$reload_objs' +- fi +- ;; +-esac +- +- +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +-set dummy ${ac_tool_prefix}objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OBJDUMP"; then +- ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OBJDUMP=$ac_cv_prog_OBJDUMP +-if test -n "$OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +-$as_echo "$OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OBJDUMP"; then +- ac_ct_OBJDUMP=$OBJDUMP +- # Extract the first word of "objdump", so it can be a program name with args. +-set dummy objdump; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OBJDUMP"; then +- ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OBJDUMP="objdump" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +-if test -n "$ac_ct_OBJDUMP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +-$as_echo "$ac_ct_OBJDUMP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OBJDUMP" = x; then +- OBJDUMP="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OBJDUMP=$ac_ct_OBJDUMP +- fi +-else +- OBJDUMP="$ac_cv_prog_OBJDUMP" +-fi +- +-test -z "$OBJDUMP" && OBJDUMP=objdump +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +-$as_echo_n "checking how to recognize dependent libraries... " >&6; } +-if ${lt_cv_deplibs_check_method+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_file_magic_cmd='$MAGIC_CMD' +-lt_cv_file_magic_test_file= +-lt_cv_deplibs_check_method='unknown' +-# Need to set the preceding variable on all platforms that support +-# interlibrary dependencies. +-# 'none' -- dependencies not supported. +-# `unknown' -- same as none, but documents that we really don't know. +-# 'pass_all' -- all dependencies passed with no checks. +-# 'test_compile' -- check by making test program. +-# 'file_magic [[regex]]' -- check by looking for files in library path +-# which responds to the $file_magic_cmd with a given extended regex. +-# If you have `file' or equivalent on your system and you're not sure +-# whether `pass_all' will *always* work, you probably want this one. +- +-case $host_os in +-aix[4-9]*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-beos*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-bsdi[45]*) +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' +- lt_cv_file_magic_cmd='/usr/bin/file -L' +- lt_cv_file_magic_test_file=/shlib/libc.so +- ;; +- +-cygwin*) +- # func_win32_libid is a shell function defined in ltmain.sh +- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' +- lt_cv_file_magic_cmd='func_win32_libid' +- ;; +- +-mingw* | pw32*) +- # Base MSYS/MinGW do not provide the 'file' command needed by +- # func_win32_libid shell function, so use a weaker test based on 'objdump', +- # unless we find 'file', for example because we are cross-compiling. +- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. +- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then +- lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' +- lt_cv_file_magic_cmd='func_win32_libid' +- else +- # Keep this pattern in sync with the one in func_win32_libid. +- lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- fi +- ;; +- +-cegcc*) +- # use the weaker test based on 'objdump'. See mingw*. +- lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' +- lt_cv_file_magic_cmd='$OBJDUMP -f' +- ;; +- +-darwin* | rhapsody*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-freebsd* | dragonfly*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then +- case $host_cpu in +- i*86 ) +- # Not sure whether the presence of OpenBSD here was a mistake. +- # Let's accept both of them until this is cleared up. +- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` +- ;; +- esac +- else +- lt_cv_deplibs_check_method=pass_all +- fi +- ;; +- +-haiku*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-hpux10.20* | hpux11*) +- lt_cv_file_magic_cmd=/usr/bin/file +- case $host_cpu in +- ia64*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' +- lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so +- ;; +- hppa*64*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' +- lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl +- ;; +- *) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' +- lt_cv_file_magic_test_file=/usr/lib/libc.sl +- ;; +- esac +- ;; +- +-interix[3-9]*) +- # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $LD in +- *-32|*"-32 ") libmagic=32-bit;; +- *-n32|*"-n32 ") libmagic=N32;; +- *-64|*"-64 ") libmagic=64-bit;; +- *) libmagic=never-match;; +- esac +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-# This must be glibc/ELF. +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-netbsd* | netbsdelf*-gnu) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' +- fi +- ;; +- +-newos6*) +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libnls.so +- ;; +- +-*nto* | *qnx*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-openbsd*) +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' +- else +- lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' +- fi +- ;; +- +-osf3* | osf4* | osf5*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-rdos*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-solaris*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- lt_cv_deplibs_check_method=pass_all +- ;; +- +-sysv4 | sysv4.3*) +- case $host_vendor in +- motorola) +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' +- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` +- ;; +- ncr) +- lt_cv_deplibs_check_method=pass_all +- ;; +- sequent) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' +- ;; +- sni) +- lt_cv_file_magic_cmd='/bin/file' +- lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" +- lt_cv_file_magic_test_file=/lib/libc.so +- ;; +- siemens) +- lt_cv_deplibs_check_method=pass_all +- ;; +- pc) +- lt_cv_deplibs_check_method=pass_all +- ;; +- esac +- ;; +- +-tpf*) +- lt_cv_deplibs_check_method=pass_all +- ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +-$as_echo "$lt_cv_deplibs_check_method" >&6; } +- +-file_magic_glob= +-want_nocaseglob=no +-if test "$build" = "$host"; then +- case $host_os in +- mingw* | pw32*) +- if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then +- want_nocaseglob=yes +- else +- file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` +- fi +- ;; +- esac +-fi +- +-file_magic_cmd=$lt_cv_file_magic_cmd +-deplibs_check_method=$lt_cv_deplibs_check_method +-test -z "$deplibs_check_method" && deplibs_check_method=unknown +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +-set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DLLTOOL"; then +- ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DLLTOOL=$ac_cv_prog_DLLTOOL +-if test -n "$DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +-$as_echo "$DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_DLLTOOL"; then +- ac_ct_DLLTOOL=$DLLTOOL +- # Extract the first word of "dlltool", so it can be a program name with args. +-set dummy dlltool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DLLTOOL"; then +- ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DLLTOOL="dlltool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +-if test -n "$ac_ct_DLLTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +-$as_echo "$ac_ct_DLLTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_DLLTOOL" = x; then +- DLLTOOL="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DLLTOOL=$ac_ct_DLLTOOL +- fi +-else +- DLLTOOL="$ac_cv_prog_DLLTOOL" +-fi +- +-test -z "$DLLTOOL" && DLLTOOL=dlltool +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +-$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_sharedlib_from_linklib_cmd='unknown' +- +-case $host_os in +-cygwin* | mingw* | pw32* | cegcc*) +- # two different shell functions defined in ltmain.sh +- # decide which to use based on capabilities of $DLLTOOL +- case `$DLLTOOL --help 2>&1` in +- *--identify-strict*) +- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib +- ;; +- *) +- lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback +- ;; +- esac +- ;; +-*) +- # fallback: assume linklib IS sharedlib +- lt_cv_sharedlib_from_linklib_cmd="$ECHO" +- ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- for ac_prog in ar +- do +- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +-set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$AR"; then +- ac_cv_prog_AR="$AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_AR="$ac_tool_prefix$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-AR=$ac_cv_prog_AR +-if test -n "$AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +-$as_echo "$AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$AR" && break +- done +-fi +-if test -z "$AR"; then +- ac_ct_AR=$AR +- for ac_prog in ar +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_AR+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_AR"; then +- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_AR="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_AR=$ac_cv_prog_ac_ct_AR +-if test -n "$ac_ct_AR"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +-$as_echo "$ac_ct_AR" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$ac_ct_AR" && break +-done +- +- if test "x$ac_ct_AR" = x; then +- AR="false" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- AR=$ac_ct_AR +- fi +-fi +- +-: ${AR=ar} +-: ${AR_FLAGS=cru} +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +-$as_echo_n "checking for archiver @FILE support... " >&6; } +-if ${lt_cv_ar_at_file+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ar_at_file=no +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- echo conftest.$ac_objext > conftest.lst +- lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 +- (eval $lt_ar_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if test "$ac_status" -eq 0; then +- # Ensure the archiver fails upon bogus file names. +- rm -f conftest.$ac_objext libconftest.a +- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 +- (eval $lt_ar_try) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- if test "$ac_status" -ne 0; then +- lt_cv_ar_at_file=@ +- fi +- fi +- rm -f conftest.* libconftest.a +- +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +-$as_echo "$lt_cv_ar_at_file" >&6; } +- +-if test "x$lt_cv_ar_at_file" = xno; then +- archiver_list_spec= +-else +- archiver_list_spec=$lt_cv_ar_at_file +-fi +- +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +-set dummy ${ac_tool_prefix}strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$STRIP"; then +- ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_STRIP="${ac_tool_prefix}strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-STRIP=$ac_cv_prog_STRIP +-if test -n "$STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +-$as_echo "$STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_STRIP"; then +- ac_ct_STRIP=$STRIP +- # Extract the first word of "strip", so it can be a program name with args. +-set dummy strip; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_STRIP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_STRIP"; then +- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_STRIP="strip" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +-if test -n "$ac_ct_STRIP"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +-$as_echo "$ac_ct_STRIP" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_STRIP" = x; then +- STRIP=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- STRIP=$ac_ct_STRIP +- fi +-else +- STRIP="$ac_cv_prog_STRIP" +-fi +- +-test -z "$STRIP" && STRIP=: +- +- +- +- +- +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$RANLIB"; then +- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-RANLIB=$ac_cv_prog_RANLIB +-if test -n "$RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +-$as_echo "$RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_RANLIB"; then +- ac_ct_RANLIB=$RANLIB +- # Extract the first word of "ranlib", so it can be a program name with args. +-set dummy ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_RANLIB"; then +- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_RANLIB="ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +-if test -n "$ac_ct_RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +-$as_echo "$ac_ct_RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_RANLIB" = x; then +- RANLIB=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- RANLIB=$ac_ct_RANLIB +- fi +-else +- RANLIB="$ac_cv_prog_RANLIB" +-fi +- +-test -z "$RANLIB" && RANLIB=: +- +- +- +- +- +- +-# Determine commands to create old-style static archives. +-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +-old_postinstall_cmds='chmod 644 $oldlib' +-old_postuninstall_cmds= +- +-if test -n "$RANLIB"; then +- case $host_os in +- openbsd*) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" +- ;; +- *) +- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" +- ;; +- esac +- old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +-fi +- +-case $host_os in +- darwin*) +- lock_old_archive_extraction=yes ;; +- *) +- lock_old_archive_extraction=no ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +- +- +-# Check for command to grab the raw symbol name followed by C symbol from nm. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +-if ${lt_cv_sys_global_symbol_pipe+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +-# These are sane defaults that work on at least a few old systems. +-# [They come from Ultrix. What could be older than Ultrix?!! ;)] +- +-# Character class describing NM global symbol codes. +-symcode='[BCDEGRST]' +- +-# Regexp to match symbols that can be accessed directly from C. +-sympat='\([_A-Za-z][_A-Za-z0-9]*\)' +- +-# Define system-specific variables. +-case $host_os in +-aix*) +- symcode='[BCDT]' +- ;; +-cygwin* | mingw* | pw32* | cegcc*) +- symcode='[ABCDGISTW]' +- ;; +-hpux*) +- if test "$host_cpu" = ia64; then +- symcode='[ABCDEGRST]' +- fi +- ;; +-irix* | nonstopux*) +- symcode='[BCDEGRST]' +- ;; +-osf*) +- symcode='[BCDEGQRST]' +- ;; +-solaris*) +- symcode='[BDRT]' +- ;; +-sco3.2v5*) +- symcode='[DT]' +- ;; +-sysv4.2uw2*) +- symcode='[DT]' +- ;; +-sysv5* | sco5v6* | unixware* | OpenUNIX*) +- symcode='[ABDT]' +- ;; +-sysv4) +- symcode='[DFNSTU]' +- ;; +-esac +- +-# If we're using GNU nm, then use its standard symbol codes. +-case `$NM -V 2>&1` in +-*GNU* | *'with BFD'*) +- symcode='[ABCDGIRSTW]' ;; +-esac +- +-# Transform an extracted symbol line into a proper C declaration. +-# Some systems (esp. on ia64) link data and code symbols differently, +-# so use this general approach. +-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +- +-# Transform an extracted symbol line into symbol name and symbol address +-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +- +-# Handle CRLF in mingw tool chain +-opt_cr= +-case $build_os in +-mingw*) +- opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp +- ;; +-esac +- +-# Try without a prefix underscore, then with it. +-for ac_symprfx in "" "_"; do +- +- # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. +- symxfrm="\\1 $ac_symprfx\\2 \\2" +- +- # Write the raw and C identifiers. +- if test "$lt_cv_nm_interface" = "MS dumpbin"; then +- # Fake it for dumpbin and say T for any non-static function +- # and D for any global variable. +- # Also find C++ and __fastcall symbols from MSVC++, +- # which start with @ or ?. +- lt_cv_sys_global_symbol_pipe="$AWK '"\ +-" {last_section=section; section=\$ 3};"\ +-" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +-" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +-" \$ 0!~/External *\|/{next};"\ +-" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +-" {if(hide[section]) next};"\ +-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +-" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +-" ' prfx=^$ac_symprfx" +- else +- lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" +- fi +- lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" +- +- # Check to see that the pipe works correctly. +- pipe_works=no +- +- rm -f conftest* +- cat > conftest.$ac_ext <<_LT_EOF +-#ifdef __cplusplus +-extern "C" { +-#endif +-char nm_test_var; +-void nm_test_func(void); +-void nm_test_func(void){} +-#ifdef __cplusplus +-} +-#endif +-int main(){nm_test_var='a';nm_test_func();return(0);} +-_LT_EOF +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- # Now try to grab the symbols. +- nlist=conftest.nm +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 +- (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s "$nlist"; then +- # Try sorting and uniquifying the output. +- if sort "$nlist" | uniq > "$nlist"T; then +- mv -f "$nlist"T "$nlist" +- else +- rm -f "$nlist"T +- fi +- +- # Make sure that we snagged all the symbols we need. +- if $GREP ' nm_test_var$' "$nlist" >/dev/null; then +- if $GREP ' nm_test_func$' "$nlist" >/dev/null; then +- cat <<_LT_EOF > conftest.$ac_ext +-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +-/* DATA imports from DLLs on WIN32 con't be const, because runtime +- relocations are performed -- see ld's documentation on pseudo-relocs. */ +-# define LT@&t@_DLSYM_CONST +-#elif defined(__osf__) +-/* This system does not cope well with relocations in const data. */ +-# define LT@&t@_DLSYM_CONST +-#else +-# define LT@&t@_DLSYM_CONST const +-#endif +- +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-_LT_EOF +- # Now generate the symbol file. +- eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' +- +- cat <<_LT_EOF >> conftest.$ac_ext +- +-/* The mapping between symbol names and symbols. */ +-LT@&t@_DLSYM_CONST struct { +- const char *name; +- void *address; +-} +-lt__PROGRAM__LTX_preloaded_symbols[] = +-{ +- { "@PROGRAM@", (void *) 0 }, +-_LT_EOF +- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext +- cat <<\_LT_EOF >> conftest.$ac_ext +- {0, (void *) 0} +-}; +- +-/* This works around a problem in FreeBSD linker */ +-#ifdef FREEBSD_WORKAROUND +-static const void *lt_preloaded_setup() { +- return lt__PROGRAM__LTX_preloaded_symbols; +-} +-#endif +- +-#ifdef __cplusplus +-} +-#endif +-_LT_EOF +- # Now try linking the two files. +- mv conftest.$ac_objext conftstm.$ac_objext +- lt_globsym_save_LIBS=$LIBS +- lt_globsym_save_CFLAGS=$CFLAGS +- LIBS="conftstm.$ac_objext" +- CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s conftest${ac_exeext}; then +- pipe_works=yes +- fi +- LIBS=$lt_globsym_save_LIBS +- CFLAGS=$lt_globsym_save_CFLAGS +- else +- echo "cannot find nm_test_func in $nlist" >&5 +- fi +- else +- echo "cannot find nm_test_var in $nlist" >&5 +- fi +- else +- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 +- fi +- else +- echo "$progname: failed program was:" >&5 +- cat conftest.$ac_ext >&5 +- fi +- rm -rf conftest* conftst* +- +- # Do not use the global_symbol_pipe unless it works. +- if test "$pipe_works" = yes; then +- break +- else +- lt_cv_sys_global_symbol_pipe= +- fi +-done +- +-fi +- +-if test -z "$lt_cv_sys_global_symbol_pipe"; then +- lt_cv_sys_global_symbol_to_cdecl= +-fi +-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +-$as_echo "failed" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +-$as_echo "ok" >&6; } +-fi +- +-# Response file support. +-if test "$lt_cv_nm_interface" = "MS dumpbin"; then +- nm_file_list_spec='@' +-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then +- nm_file_list_spec='@' +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +-$as_echo_n "checking for sysroot... " >&6; } +- +-@%:@ Check whether --with-sysroot was given. +-if test "${with_sysroot+set}" = set; then : +- withval=$with_sysroot; +-else +- with_sysroot=no +-fi +- +- +-lt_sysroot= +-case ${with_sysroot} in #( +- yes) +- if test "$GCC" = yes; then +- lt_sysroot=`$CC --print-sysroot 2>/dev/null` +- fi +- ;; #( +- /*) +- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` +- ;; #( +- no|'') +- ;; #( +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +-$as_echo "${with_sysroot}" >&6; } +- as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 +- ;; +-esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +-$as_echo "${lt_sysroot:-no}" >&6; } +- +- +- +- +- +-@%:@ Check whether --enable-libtool-lock was given. +-if test "${enable_libtool_lock+set}" = set; then : +- enableval=$enable_libtool_lock; +-fi +- +-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +- +-# Some flags need to be propagated to the compiler or linker for good +-# libtool support. +-case $host in +-ia64-*-hpux*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- case `/usr/bin/file conftest.$ac_objext` in +- *ELF-32*) +- HPUX_IA64_MODE="32" +- ;; +- *ELF-64*) +- HPUX_IA64_MODE="64" +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +-*-*-irix6*) +- # Find out which ABI we are using. +- echo '#line '$LINENO' "configure"' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$lt_cv_prog_gnu_ld" = yes; then +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -melf32bsmip" +- ;; +- *N32*) +- LD="${LD-ld} -melf32bmipn32" +- ;; +- *64-bit*) +- LD="${LD-ld} -melf64bmip" +- ;; +- esac +- else +- case `/usr/bin/file conftest.$ac_objext` in +- *32-bit*) +- LD="${LD-ld} -32" +- ;; +- *N32*) +- LD="${LD-ld} -n32" +- ;; +- *64-bit*) +- LD="${LD-ld} -64" +- ;; +- esac +- fi +- fi +- rm -rf conftest* +- ;; +- +-x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +-s390*-*linux*|s390*-*tpf*|sparc*-*linux*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- case `/usr/bin/file conftest.o` in +- *32-bit*) +- case $host in +- x86_64-*kfreebsd*-gnu) +- LD="${LD-ld} -m elf_i386_fbsd" +- ;; +- x86_64-*linux*) +- case `/usr/bin/file conftest.o` in +- *x86-64*) +- LD="${LD-ld} -m elf32_x86_64" +- ;; +- *) +- LD="${LD-ld} -m elf_i386" +- ;; +- esac +- ;; +- powerpc64le-*) +- LD="${LD-ld} -m elf32lppclinux" +- ;; +- powerpc64-*) +- LD="${LD-ld} -m elf32ppclinux" +- ;; +- s390x-*linux*) +- LD="${LD-ld} -m elf_s390" +- ;; +- sparc64-*linux*) +- LD="${LD-ld} -m elf32_sparc" +- ;; +- esac +- ;; +- *64-bit*) +- case $host in +- x86_64-*kfreebsd*-gnu) +- LD="${LD-ld} -m elf_x86_64_fbsd" +- ;; +- x86_64-*linux*) +- LD="${LD-ld} -m elf_x86_64" +- ;; +- powerpcle-*) +- LD="${LD-ld} -m elf64lppc" +- ;; +- powerpc-*) +- LD="${LD-ld} -m elf64ppc" +- ;; +- s390*-*linux*|s390*-*tpf*) +- LD="${LD-ld} -m elf64_s390" +- ;; +- sparc*-*linux*) +- LD="${LD-ld} -m elf64_sparc" +- ;; +- esac +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +- +-*-*-sco3.2v5*) +- # On SCO OpenServer 5, we need -belf to get full-featured binaries. +- SAVE_CFLAGS="$CFLAGS" +- CFLAGS="$CFLAGS -belf" +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +-$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +-if ${lt_cv_cc_needs_belf+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- lt_cv_cc_needs_belf=yes +-else +- lt_cv_cc_needs_belf=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +-$as_echo "$lt_cv_cc_needs_belf" >&6; } +- if test x"$lt_cv_cc_needs_belf" != x"yes"; then +- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf +- CFLAGS="$SAVE_CFLAGS" +- fi +- ;; +-*-*solaris*) +- # Find out which ABI we are using. +- echo 'int i;' > conftest.$ac_ext +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- case `/usr/bin/file conftest.o` in +- *64-bit*) +- case $lt_cv_prog_gnu_ld in +- yes*) +- case $host in +- i?86-*-solaris*) +- LD="${LD-ld} -m elf_x86_64" +- ;; +- sparc*-*-solaris*) +- LD="${LD-ld} -m elf64_sparc" +- ;; +- esac +- # GNU ld 2.21 introduced _sol2 emulations. Use them if available. +- if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then +- LD="${LD-ld}_sol2" +- fi +- ;; +- *) +- if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then +- LD="${LD-ld} -64" +- fi +- ;; +- esac +- ;; +- esac +- fi +- rm -rf conftest* +- ;; +-esac +- +-need_locks="$enable_libtool_lock" +- +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +-set dummy ${ac_tool_prefix}mt; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$MANIFEST_TOOL"; then +- ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +-if test -n "$MANIFEST_TOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +-$as_echo "$MANIFEST_TOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then +- ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL +- # Extract the first word of "mt", so it can be a program name with args. +-set dummy mt; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_MANIFEST_TOOL"; then +- ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +-if test -n "$ac_ct_MANIFEST_TOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_MANIFEST_TOOL" = x; then +- MANIFEST_TOOL=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL +- fi +-else +- MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +-fi +- +-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +-if ${lt_cv_path_mainfest_tool+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_path_mainfest_tool=no +- echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 +- $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out +- cat conftest.err >&5 +- if $GREP 'Manifest Tool' conftest.out > /dev/null; then +- lt_cv_path_mainfest_tool=yes +- fi +- rm -f conftest* +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +-$as_echo "$lt_cv_path_mainfest_tool" >&6; } +-if test "x$lt_cv_path_mainfest_tool" != xyes; then +- MANIFEST_TOOL=: +-fi +- +- +- +- +- +- +- case $host_os in +- rhapsody* | darwin*) +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_DSYMUTIL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$DSYMUTIL"; then +- ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-DSYMUTIL=$ac_cv_prog_DSYMUTIL +-if test -n "$DSYMUTIL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +-$as_echo "$DSYMUTIL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_DSYMUTIL"; then +- ac_ct_DSYMUTIL=$DSYMUTIL +- # Extract the first word of "dsymutil", so it can be a program name with args. +-set dummy dsymutil; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_DSYMUTIL"; then +- ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +-if test -n "$ac_ct_DSYMUTIL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +-$as_echo "$ac_ct_DSYMUTIL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_DSYMUTIL" = x; then +- DSYMUTIL=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- DSYMUTIL=$ac_ct_DSYMUTIL +- fi +-else +- DSYMUTIL="$ac_cv_prog_DSYMUTIL" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +-set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_NMEDIT+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$NMEDIT"; then +- ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-NMEDIT=$ac_cv_prog_NMEDIT +-if test -n "$NMEDIT"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +-$as_echo "$NMEDIT" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_NMEDIT"; then +- ac_ct_NMEDIT=$NMEDIT +- # Extract the first word of "nmedit", so it can be a program name with args. +-set dummy nmedit; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_NMEDIT"; then +- ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_NMEDIT="nmedit" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +-if test -n "$ac_ct_NMEDIT"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +-$as_echo "$ac_ct_NMEDIT" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_NMEDIT" = x; then +- NMEDIT=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- NMEDIT=$ac_ct_NMEDIT +- fi +-else +- NMEDIT="$ac_cv_prog_NMEDIT" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +-set dummy ${ac_tool_prefix}lipo; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_LIPO+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$LIPO"; then +- ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_LIPO="${ac_tool_prefix}lipo" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-LIPO=$ac_cv_prog_LIPO +-if test -n "$LIPO"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +-$as_echo "$LIPO" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_LIPO"; then +- ac_ct_LIPO=$LIPO +- # Extract the first word of "lipo", so it can be a program name with args. +-set dummy lipo; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_LIPO+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_LIPO"; then +- ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_LIPO="lipo" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +-if test -n "$ac_ct_LIPO"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +-$as_echo "$ac_ct_LIPO" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_LIPO" = x; then +- LIPO=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- LIPO=$ac_ct_LIPO +- fi +-else +- LIPO="$ac_cv_prog_LIPO" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +-set dummy ${ac_tool_prefix}otool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OTOOL"; then +- ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OTOOL="${ac_tool_prefix}otool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OTOOL=$ac_cv_prog_OTOOL +-if test -n "$OTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +-$as_echo "$OTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OTOOL"; then +- ac_ct_OTOOL=$OTOOL +- # Extract the first word of "otool", so it can be a program name with args. +-set dummy otool; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OTOOL"; then +- ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OTOOL="otool" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +-if test -n "$ac_ct_OTOOL"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +-$as_echo "$ac_ct_OTOOL" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OTOOL" = x; then +- OTOOL=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OTOOL=$ac_ct_OTOOL +- fi +-else +- OTOOL="$ac_cv_prog_OTOOL" +-fi +- +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +-set dummy ${ac_tool_prefix}otool64; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_OTOOL64+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$OTOOL64"; then +- ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-OTOOL64=$ac_cv_prog_OTOOL64 +-if test -n "$OTOOL64"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +-$as_echo "$OTOOL64" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_OTOOL64"; then +- ac_ct_OTOOL64=$OTOOL64 +- # Extract the first word of "otool64", so it can be a program name with args. +-set dummy otool64; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_OTOOL64"; then +- ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_OTOOL64="otool64" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +-if test -n "$ac_ct_OTOOL64"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +-$as_echo "$ac_ct_OTOOL64" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_OTOOL64" = x; then +- OTOOL64=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- OTOOL64=$ac_ct_OTOOL64 +- fi +-else +- OTOOL64="$ac_cv_prog_OTOOL64" +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +-$as_echo_n "checking for -single_module linker flag... " >&6; } +-if ${lt_cv_apple_cc_single_mod+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_apple_cc_single_mod=no +- if test -z "${LT_MULTI_MODULE}"; then +- # By default we will add the -single_module flag. You can override +- # by either setting the environment variable LT_MULTI_MODULE +- # non-empty at configure time, or by adding -multi_module to the +- # link flags. +- rm -rf libconftest.dylib* +- echo "int foo(void){return 1;}" > conftest.c +- echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +--dynamiclib -Wl,-single_module conftest.c" >&5 +- $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +- -dynamiclib -Wl,-single_module conftest.c 2>conftest.err +- _lt_result=$? +- # If there is a non-empty error log, and "single_module" +- # appears in it, assume the flag caused a linker warning +- if test -s conftest.err && $GREP single_module conftest.err; then +- cat conftest.err >&5 +- # Otherwise, if the output was created with a 0 exit code from +- # the compiler, it worked. +- elif test -f libconftest.dylib && test $_lt_result -eq 0; then +- lt_cv_apple_cc_single_mod=yes +- else +- cat conftest.err >&5 +- fi +- rm -rf libconftest.dylib* +- rm -f conftest.* +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +-$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +-if ${lt_cv_ld_exported_symbols_list+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ld_exported_symbols_list=no +- save_LDFLAGS=$LDFLAGS +- echo "_main" > conftest.sym +- LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- lt_cv_ld_exported_symbols_list=yes +-else +- lt_cv_ld_exported_symbols_list=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +-$as_echo_n "checking for -force_load linker flag... " >&6; } +-if ${lt_cv_ld_force_load+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_ld_force_load=no +- cat > conftest.c << _LT_EOF +-int forced_loaded() { return 2;} +-_LT_EOF +- echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 +- $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 +- echo "$AR cru libconftest.a conftest.o" >&5 +- $AR cru libconftest.a conftest.o 2>&5 +- echo "$RANLIB libconftest.a" >&5 +- $RANLIB libconftest.a 2>&5 +- cat > conftest.c << _LT_EOF +-int main() { return 0;} +-_LT_EOF +- echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 +- $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err +- _lt_result=$? +- if test -s conftest.err && $GREP force_load conftest.err; then +- cat conftest.err >&5 +- elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then +- lt_cv_ld_force_load=yes +- else +- cat conftest.err >&5 +- fi +- rm -f conftest.err libconftest.a conftest conftest.c +- rm -rf conftest.dSYM +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +-$as_echo "$lt_cv_ld_force_load" >&6; } +- case $host_os in +- rhapsody* | darwin1.[012]) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; +- darwin1.*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- darwin*) # darwin 5.x on +- # if running on 10.5 or later, the deployment target defaults +- # to the OS version, if on x86, and 10.4, the deployment +- # target defaults to 10.4. Don't you love it? +- case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in +- 10.0,*86*-darwin8*|10.0,*-darwin[91]*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- 10.[012]*) +- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; +- 10.*) +- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; +- esac +- ;; +- esac +- if test "$lt_cv_apple_cc_single_mod" = "yes"; then +- _lt_dar_single_mod='$single_module' +- fi +- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then +- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' +- else +- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' +- fi +- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then +- _lt_dsymutil='~$DSYMUTIL $lib || :' +- else +- _lt_dsymutil= +- fi +- ;; +- esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +-$as_echo_n "checking for ANSI C header files... " >&6; } +-if ${ac_cv_header_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_stdc=yes +-else +- ac_cv_header_stdc=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-if test $ac_cv_header_stdc = yes; then +- # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "memchr" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "free" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +- if test "$cross_compiling" = yes; then : +- : +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#if ((' ' & 0x0FF) == 0x020) +-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +-#else +-# define ISLOWER(c) \ +- (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) +-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +-#endif +- +-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +-int +-main () +-{ +- int i; +- for (i = 0; i < 256; i++) +- if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) +- return 2; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +-$as_echo "$ac_cv_header_stdc" >&6; } +-if test $ac_cv_header_stdc = yes; then +- +-$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h +- +-fi +- +-# On IRIX 5.3, sys/types and inttypes.h are conflicting. +-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ +- inttypes.h stdint.h unistd.h +-do : +- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +-" +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +-_ACEOF +- +-fi +- +-done +- +- +-for ac_header in dlfcn.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +-" +-if test "x$ac_cv_header_dlfcn_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DLFCN_H 1 +-_ACEOF +- +-fi +- +-done +- +- +- +- +-func_stripname_cnf () +-{ +- case ${2} in +- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; +- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; +- esac +-} # func_stripname_cnf +- +- +- +- +- +-# Set options +- +- +- +- enable_dlopen=no +- +- +- +- @%:@ Check whether --enable-shared was given. +-if test "${enable_shared+set}" = set; then : +- enableval=$enable_shared; p=${PACKAGE-default} +- case $enableval in +- yes) enable_shared=yes ;; +- no) enable_shared=no ;; +- *) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_shared=yes +-fi +- +- +- +- +- +- +- +- +- +- @%:@ Check whether --enable-static was given. +-if test "${enable_static+set}" = set; then : +- enableval=$enable_static; p=${PACKAGE-default} +- case $enableval in +- yes) enable_static=yes ;; +- no) enable_static=no ;; +- *) +- enable_static=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_static=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_static=yes +-fi +- +- +- +- +- +- +- +- +- +- +-@%:@ Check whether --with-pic was given. +-if test "${with_pic+set}" = set; then : +- withval=$with_pic; lt_p=${PACKAGE-default} +- case $withval in +- yes|no) pic_mode=$withval ;; +- *) +- pic_mode=default +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for lt_pkg in $withval; do +- IFS="$lt_save_ifs" +- if test "X$lt_pkg" = "X$lt_p"; then +- pic_mode=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- pic_mode=default +-fi +- +- +-test -z "$pic_mode" && pic_mode=default +- +- +- +- +- +- +- +- @%:@ Check whether --enable-fast-install was given. +-if test "${enable_fast_install+set}" = set; then : +- enableval=$enable_fast_install; p=${PACKAGE-default} +- case $enableval in +- yes) enable_fast_install=yes ;; +- no) enable_fast_install=no ;; +- *) +- enable_fast_install=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_fast_install=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_fast_install=yes +-fi +- +- +- +- +- +- +- +- +- +- +- +-# This can be used to rebuild libtool when needed +-LIBTOOL_DEPS="$ltmain" +- +-# Always use our own libtool. +-LIBTOOL='$(SHELL) $(top_builddir)/libtool' +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-test -z "$LN_S" && LN_S="ln -s" +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +-$as_echo_n "checking for objdir... " >&6; } +-if ${lt_cv_objdir+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- rm -f .libs 2>/dev/null +-mkdir .libs 2>/dev/null +-if test -d .libs; then +- lt_cv_objdir=.libs +-else +- # MS-DOS does not allow filenames that begin with a dot. +- lt_cv_objdir=_libs +-fi +-rmdir .libs 2>/dev/null +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +-$as_echo "$lt_cv_objdir" >&6; } +-objdir=$lt_cv_objdir +- +- +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define LT_OBJDIR "$lt_cv_objdir/" +-_ACEOF +- +- +- +- +-case $host_os in +-aix3*) +- # AIX sometimes has problems with the GCC collect2 program. For some +- # reason, if we set the COLLECT_NAMES environment variable, the problems +- # vanish in a puff of smoke. +- if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +- fi +- ;; +-esac +- +-# Global variables: +-ofile=libtool +-can_build_shared=yes +- +-# All known linkers require a `.a' archive for static linking (except MSVC, +-# which needs '.lib'). +-libext=a +- +-with_gnu_ld="$lt_cv_prog_gnu_ld" +- +-old_CC="$CC" +-old_CFLAGS="$CFLAGS" +- +-# Set sane defaults for various variables +-test -z "$CC" && CC=cc +-test -z "$LTCC" && LTCC=$CC +-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +-test -z "$LD" && LD=ld +-test -z "$ac_objext" && ac_objext=o +- +-for cc_temp in $compiler""; do +- case $cc_temp in +- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; +- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; +- \-*) ;; +- *) break;; +- esac +-done +-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +- +- +-# Only perform the check for file, if the check method requires it +-test -z "$MAGIC_CMD" && MAGIC_CMD=file +-case $deplibs_check_method in +-file_magic*) +- if test "$file_magic_cmd" = '$MAGIC_CMD'; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +-if ${lt_cv_path_MAGIC_CMD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $MAGIC_CMD in +-[\\/*] | ?:[\\/]*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +-*) +- lt_save_MAGIC_CMD="$MAGIC_CMD" +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" +- for ac_dir in $ac_dummy; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/${ac_tool_prefix}file; then +- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- $EGREP "$file_magic_regex" > /dev/null; then +- : +- else +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-_LT_EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$lt_save_ifs" +- MAGIC_CMD="$lt_save_MAGIC_CMD" +- ;; +-esac +-fi +- +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +-$as_echo "$MAGIC_CMD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- +- +- +-if test -z "$lt_cv_path_MAGIC_CMD"; then +- if test -n "$ac_tool_prefix"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +-$as_echo_n "checking for file... " >&6; } +-if ${lt_cv_path_MAGIC_CMD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $MAGIC_CMD in +-[\\/*] | ?:[\\/]*) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +-*) +- lt_save_MAGIC_CMD="$MAGIC_CMD" +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" +- for ac_dir in $ac_dummy; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/file; then +- lt_cv_path_MAGIC_CMD="$ac_dir/file" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- $EGREP "$file_magic_regex" > /dev/null; then +- : +- else +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-_LT_EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$lt_save_ifs" +- MAGIC_CMD="$lt_save_MAGIC_CMD" +- ;; +-esac +-fi +- +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +-$as_echo "$MAGIC_CMD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- else +- MAGIC_CMD=: +- fi +-fi +- +- fi +- ;; +-esac +- +-# Use C for the default configuration in the libtool script +- +-lt_save_CC="$CC" +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +-# Source file extension for C test sources. +-ac_ext=c +- +-# Object file extension for compiled C test sources. +-objext=o +-objext=$objext +- +-# Code to be used in simple compile tests +-lt_simple_compile_test_code="int some_variable = 0;" +- +-# Code to be used in simple link tests +-lt_simple_link_test_code='int main(){return(0);}' +- +- +- +- +- +- +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +- +-# Save the default compiler, since it gets overwritten when the other +-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +-compiler_DEFAULT=$CC +- +-# save warnings/boilerplate of simple test code +-ac_outfile=conftest.$ac_objext +-echo "$lt_simple_compile_test_code" >conftest.$ac_ext +-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_compiler_boilerplate=`cat conftest.err` +-$RM conftest* +- +-ac_outfile=conftest.$ac_objext +-echo "$lt_simple_link_test_code" >conftest.$ac_ext +-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_linker_boilerplate=`cat conftest.err` +-$RM -r conftest* +- +- +-if test -n "$compiler"; then +- +-lt_prog_compiler_no_builtin_flag= +- +-if test "$GCC" = yes; then +- case $cc_basename in +- nvcc*) +- lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; +- *) +- lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_rtti_exceptions=no +- ac_outfile=conftest.$ac_objext +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="-fno-rtti -fno-exceptions" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_rtti_exceptions=yes +- fi +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +- +-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then +- lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +-else +- : +-fi +- +-fi +- +- +- +- +- +- +- lt_prog_compiler_wl= +-lt_prog_compiler_pic= +-lt_prog_compiler_static= +- +- +- if test "$GCC" = yes; then +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_static='-static' +- +- case $host_os in +- aix*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static='-Bstatic' +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- lt_prog_compiler_pic='-fPIC' +- ;; +- m68k) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' +- ;; +- esac +- ;; +- +- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- # Although the cygwin gcc ignores -fPIC, still need this for old-style +- # (--disable-auto-import) libraries +- lt_prog_compiler_pic='-DDLL_EXPORT' +- ;; +- +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- lt_prog_compiler_pic='-fno-common' +- ;; +- +- haiku*) +- # PIC is the default for Haiku. +- # The "-static" flag exists, but is broken. +- lt_prog_compiler_static= +- ;; +- +- hpux*) +- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit +- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag +- # sets the default TLS model and affects inlining. +- case $host_cpu in +- hppa*64*) +- # +Z the default +- ;; +- *) +- lt_prog_compiler_pic='-fPIC' +- ;; +- esac +- ;; +- +- interix[3-9]*) +- # Interix 3.x gcc -fpic/-fPIC options generate broken code. +- # Instead, we relocate shared libraries at runtime. +- ;; +- +- msdosdjgpp*) +- # Just because we use GCC doesn't mean we suddenly get shared libraries +- # on systems that don't support them. +- lt_prog_compiler_can_build_shared=no +- enable_shared=no +- ;; +- +- *nto* | *qnx*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic='-fPIC -shared' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- lt_prog_compiler_pic=-Kconform_pic +- fi +- ;; +- +- *) +- lt_prog_compiler_pic='-fPIC' +- ;; +- esac +- +- case $cc_basename in +- nvcc*) # Cuda Compiler Driver 2.2 +- lt_prog_compiler_wl='-Xlinker ' +- if test -n "$lt_prog_compiler_pic"; then +- lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" +- fi +- ;; +- esac +- else +- # PORTME Check for flag to pass linker flags through the system compiler. +- case $host_os in +- aix*) +- lt_prog_compiler_wl='-Wl,' +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static='-Bstatic' +- else +- lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' +- fi +- ;; +- +- mingw* | cygwin* | pw32* | os2* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_prog_compiler_pic='-DDLL_EXPORT' +- ;; +- +- hpux9* | hpux10* | hpux11*) +- lt_prog_compiler_wl='-Wl,' +- # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but +- # not for PA HP-UX. +- case $host_cpu in +- hppa*64*|ia64*) +- # +Z the default +- ;; +- *) +- lt_prog_compiler_pic='+Z' +- ;; +- esac +- # Is there a better lt_prog_compiler_static that works with the bundled CC? +- lt_prog_compiler_static='${wl}-a ${wl}archive' +- ;; +- +- irix5* | irix6* | nonstopux*) +- lt_prog_compiler_wl='-Wl,' +- # PIC (with -KPIC) is the default. +- lt_prog_compiler_static='-non_shared' +- ;; +- +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- case $cc_basename in +- # old Intel for x86_64 which still supported -KPIC. +- ecc*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-static' +- ;; +- # icc used to be incompatible with GCC. +- # ICC 10 doesn't accept -KPIC any more. +- icc* | ifort*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fPIC' +- lt_prog_compiler_static='-static' +- ;; +- # Lahey Fortran 8.1. +- lf95*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='--shared' +- lt_prog_compiler_static='--static' +- ;; +- nagfor*) +- # NAG Fortran compiler +- lt_prog_compiler_wl='-Wl,-Wl,,' +- lt_prog_compiler_pic='-PIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) +- # Portland Group compilers (*not* the Pentium gcc compiler, +- # which looks to be a dead project) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fpic' +- lt_prog_compiler_static='-Bstatic' +- ;; +- ccc*) +- lt_prog_compiler_wl='-Wl,' +- # All Alpha code is PIC. +- lt_prog_compiler_static='-non_shared' +- ;; +- xl* | bgxl* | bgf* | mpixl*) +- # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-qpic' +- lt_prog_compiler_static='-qstaticlink' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) +- # Sun Fortran 8.3 passes all unrecognized flags to the linker +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='' +- ;; +- *Sun\ F* | *Sun*Fortran*) +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='-Qoption ld ' +- ;; +- *Sun\ C*) +- # Sun C 5.9 +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- lt_prog_compiler_wl='-Wl,' +- ;; +- *Intel*\ [CF]*Compiler*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fPIC' +- lt_prog_compiler_static='-static' +- ;; +- *Portland\ Group*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-fpic' +- lt_prog_compiler_static='-Bstatic' +- ;; +- esac +- ;; +- esac +- ;; +- +- newsos6) +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- *nto* | *qnx*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic='-fPIC -shared' +- ;; +- +- osf3* | osf4* | osf5*) +- lt_prog_compiler_wl='-Wl,' +- # All OSF/1 code is PIC. +- lt_prog_compiler_static='-non_shared' +- ;; +- +- rdos*) +- lt_prog_compiler_static='-non_shared' +- ;; +- +- solaris*) +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- case $cc_basename in +- f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) +- lt_prog_compiler_wl='-Qoption ld ';; +- *) +- lt_prog_compiler_wl='-Wl,';; +- esac +- ;; +- +- sunos4*) +- lt_prog_compiler_wl='-Qoption ld ' +- lt_prog_compiler_pic='-PIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- sysv4 | sysv4.2uw2* | sysv4.3*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec ;then +- lt_prog_compiler_pic='-Kconform_pic' +- lt_prog_compiler_static='-Bstatic' +- fi +- ;; +- +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_pic='-KPIC' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- unicos*) +- lt_prog_compiler_wl='-Wl,' +- lt_prog_compiler_can_build_shared=no +- ;; +- +- uts4*) +- lt_prog_compiler_pic='-pic' +- lt_prog_compiler_static='-Bstatic' +- ;; +- +- *) +- lt_prog_compiler_can_build_shared=no +- ;; +- esac +- fi +- +-case $host_os in +- # For platforms which do not support PIC, -DPIC is meaningless: +- *djgpp*) +- lt_prog_compiler_pic= +- ;; +- *) +- lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" +- ;; +-esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +-$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +-if ${lt_cv_prog_compiler_pic+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +-$as_echo "$lt_cv_prog_compiler_pic" >&6; } +-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic +- +-# +-# Check to make sure the PIC flag actually works. +-# +-if test -n "$lt_prog_compiler_pic"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +-if ${lt_cv_prog_compiler_pic_works+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic_works=no +- ac_outfile=conftest.$ac_objext +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_pic_works=yes +- fi +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } +- +-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then +- case $lt_prog_compiler_pic in +- "" | " "*) ;; +- *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; +- esac +-else +- lt_prog_compiler_pic= +- lt_prog_compiler_can_build_shared=no +-fi +- +-fi +- +- +- +- +- +- +- +- +- +- +- +-# +-# Check to make sure the static flag actually works. +-# +-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +-if ${lt_cv_prog_compiler_static_works+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_static_works=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_tmp_static_flag" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_static_works=yes +- fi +- else +- lt_cv_prog_compiler_static_works=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +-$as_echo "$lt_cv_prog_compiler_static_works" >&6; } +- +-if test x"$lt_cv_prog_compiler_static_works" = xyes; then +- : +-else +- lt_prog_compiler_static= +-fi +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +- +- +- +- +-hard_links="nottested" +-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +-$as_echo_n "checking if we can lock with hard links... " >&6; } +- hard_links=yes +- $RM conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +-$as_echo "$hard_links" >&6; } +- if test "$hard_links" = no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} +- need_locks=warn +- fi +-else +- need_locks=no +-fi +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +- +- runpath_var= +- allow_undefined_flag= +- always_export_symbols=no +- archive_cmds= +- archive_expsym_cmds= +- compiler_needs_object=no +- enable_shared_with_static_runtimes=no +- export_dynamic_flag_spec= +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- hardcode_automatic=no +- hardcode_direct=no +- hardcode_direct_absolute=no +- hardcode_libdir_flag_spec= +- hardcode_libdir_separator= +- hardcode_minus_L=no +- hardcode_shlibpath_var=unsupported +- inherit_rpath=no +- link_all_deplibs=unknown +- module_cmds= +- module_expsym_cmds= +- old_archive_from_new_cmds= +- old_archive_from_expsyms_cmds= +- thread_safe_flag_spec= +- whole_archive_flag_spec= +- # include_expsyms should be a list of space-separated symbols to be *always* +- # included in the symbol list +- include_expsyms= +- # exclude_expsyms can be an extended regexp of symbols to exclude +- # it will be wrapped by ` (' and `)$', so one must not match beginning or +- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +- # as well as any symbol that contains `d'. +- exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +- # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +- # platforms (ab)use it in PIC code, but their linkers get confused if +- # the symbol is explicitly referenced. Since portable code cannot +- # rely on this symbol name, it's probably fine to never include it in +- # preloaded symbol tables. +- # Exclude shared library initialization/finalization symbols. +- extract_expsyms_cmds= +- +- case $host_os in +- cygwin* | mingw* | pw32* | cegcc*) +- # 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 +- ;; +- linux* | k*bsd*-gnu | gnu*) +- link_all_deplibs=no +- ;; +- esac +- +- ld_shlibs=yes +- +- # On some targets, GNU ld is compatible enough with the native linker +- # that we're better off using the native interface for both. +- lt_use_gnu_ld_interface=no +- if test "$with_gnu_ld" = yes; then +- case $host_os in +- aix*) +- # The AIX port of GNU ld has always aspired to compatibility +- # with the native linker. However, as the warning in the GNU ld +- # block says, versions before 2.19.5* couldn't really create working +- # shared libraries, regardless of the interface used. +- case `$LD -v 2>&1` in +- *\ \(GNU\ Binutils\)\ 2.19.5*) ;; +- *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; +- *\ \(GNU\ Binutils\)\ [3-9]*) ;; +- *) +- lt_use_gnu_ld_interface=yes +- ;; +- esac +- ;; +- *) +- lt_use_gnu_ld_interface=yes +- ;; +- esac +- fi +- +- if test "$lt_use_gnu_ld_interface" = yes; then +- # If archive_cmds runs LD, not CC, wlarc should be empty +- wlarc='${wl}' +- +- # 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. +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- export_dynamic_flag_spec='${wl}--export-dynamic' +- # ancient GNU ld didn't support --whole-archive et. al. +- if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec= +- fi +- supports_anon_versioning=no +- case `$LD -v 2>&1` in +- *GNU\ gold*) supports_anon_versioning=yes ;; +- *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 +- *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... +- *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... +- *\ 2.11.*) ;; # other 2.11 versions +- *) supports_anon_versioning=yes ;; +- esac +- +- # See if GNU ld supports shared libraries. +- 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 +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the GNU linker, at least up to release 2.19, is reported +-*** to be unable to reliably create shared libraries on AIX. +-*** Therefore, libtool is disabling shared libraries support. If you +-*** really care for shared libraries, you may want to install binutils +-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +-*** You will then need to restart the configuration process. +- +-_LT_EOF +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='' +- ;; +- m68k) +- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- esac +- ;; +- +- beos*) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, +- # as there is no search path for DLLs. +- hardcode_libdir_flag_spec='-L$libdir' +- export_dynamic_flag_spec='${wl}--export-all-symbols' +- allow_undefined_flag=unsupported +- always_export_symbols=no +- enable_shared_with_static_runtimes=yes +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' +- exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- ld_shlibs=no +- fi +- ;; +- +- haiku*) +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- link_all_deplibs=yes +- ;; +- +- interix[3-9]*) +- hardcode_direct=no +- hardcode_shlibpath_var=no +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- export_dynamic_flag_spec='${wl}-E' +- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. +- # Instead, shared libraries are loaded at an image base (0x10000000 by +- # default) and relocated if they conflict, which is a slow very memory +- # consuming and fragmenting process. To avoid this, we pick a random, +- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link +- # time. Moving up from 0x10000000 also allows more sbrk(2) space. +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- ;; +- +- gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) +- tmp_diet=no +- if test "$host_os" = linux-dietlibc; then +- case $cc_basename in +- diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) +- esac +- fi +- if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ +- && test "$tmp_diet" = no +- then +- tmp_addflag=' $pic_flag' +- tmp_sharedflag='-shared' +- case $cc_basename,$host_cpu in +- pgcc*) # Portland Group C compiler +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- tmp_addflag=' $pic_flag' +- ;; +- pgf77* | pgf90* | pgf95* | pgfortran*) +- # Portland Group f77 and f90 compilers +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- tmp_addflag=' $pic_flag -Mnomain' ;; +- ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 +- tmp_addflag=' -i_dynamic' ;; +- efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 +- tmp_addflag=' -i_dynamic -nofor_main' ;; +- ifc* | ifort*) # Intel Fortran compiler +- tmp_addflag=' -nofor_main' ;; +- lf95*) # Lahey Fortran 8.1 +- whole_archive_flag_spec= +- tmp_sharedflag='--shared' ;; +- xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) +- tmp_sharedflag='-qmkshrobj' +- tmp_addflag= ;; +- nvcc*) # Cuda Compiler Driver 2.2 +- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- compiler_needs_object=yes +- ;; +- esac +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) # Sun C 5.9 +- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- compiler_needs_object=yes +- tmp_sharedflag='-G' ;; +- *Sun\ F*) # Sun Fortran 8.3 +- tmp_sharedflag='-G' ;; +- esac +- archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- +- if test "x$supports_anon_versioning" = xyes; then +- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- fi +- +- case $cc_basename in +- xlf* | bgf* | bgxlf* | mpixlf*) +- # IBM XL Fortran 10.1 on PPC cannot create shared libs itself +- whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' +- if test "x$supports_anon_versioning" = xyes; then +- archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' +- fi +- ;; +- esac +- else +- ld_shlibs=no +- fi +- ;; +- +- netbsd* | netbsdelf*-gnu) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' +- wlarc= +- else +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- fi +- ;; +- +- solaris*) +- if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then +- ld_shlibs=no +- cat <<_LT_EOF 1>&2 +- +-*** Warning: The releases 2.8.* of the GNU linker cannot reliably +-*** create shared libraries on Solaris systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.9.1 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-_LT_EOF +- elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- 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 +- cat <<_LT_EOF 1>&2 +- +-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +-*** reliably create shared libraries on SCO systems. Therefore, libtool +-*** is disabling shared libraries support. We urge you to upgrade GNU +-*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +-*** your PATH or compiler configuration so that the native linker is +-*** used, and then restart. +- +-_LT_EOF +- ;; +- *) +- # For security reasons, it is highly recommended that you always +- # use absolute paths for naming shared libraries, and exclude the +- # DT_RUNPATH tag from executables and libraries. But doing so +- # requires that you compile everything twice, which is a pain. +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- esac +- ;; +- +- sunos4*) +- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- wlarc= +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- *) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- else +- ld_shlibs=no +- fi +- ;; +- esac +- +- if test "$ld_shlibs" = no; then +- runpath_var= +- hardcode_libdir_flag_spec= +- export_dynamic_flag_spec= +- whole_archive_flag_spec= +- fi +- else +- # PORTME fill in a description of your system's linker (not GNU ld) +- case $host_os in +- aix3*) +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' +- # Note: this linker hardcodes the directories in LIBPATH if there +- # are no directories specified by -L. +- hardcode_minus_L=yes +- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; 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 +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- else +- # If we're using GNU nm, then we don't want the "-C" option. +- # -C means demangle to AIX nm, but means don't demangle with GNU nm +- # Also, AIX nm treats weak defined symbols like other global +- # defined symbols, whereas GNU nm marks them as "W". +- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- else +- export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- fi +- 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 +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi +- +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- archive_cmds='' +- hardcode_direct=yes +- hardcode_direct_absolute=yes +- hardcode_libdir_separator=':' +- link_all_deplibs=yes +- file_list_spec='${wl}-f,' +- +- if test "$GCC" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) +- # We only want to do this on AIX 4.2 and lower, the check +- # below for broken collect2 doesn't work under 4.3+ +- 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 +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L=yes +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_libdir_separator= +- fi +- ;; +- esac +- shared_flag='-shared' +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag="$shared_flag "'${wl}-G' +- fi +- link_all_deplibs=no +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release +- # chokes on -Wl,-G. The following line is correct: +- shared_flag='-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi +- +- export_dynamic_flag_spec='${wl}-bexpall' +- # It seems that -bexpall does not export symbols beginning with +- # underscore (_), so it is better to generate a list of symbols to export. +- always_export_symbols=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag='-berok' +- # Determine the default libpath from the value encoded in an +- # empty executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath_+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath_ +-fi +- +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' +- allow_undefined_flag="-z nodefs" +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" +- else +- # Determine the default libpath from the value encoded in an +- # empty executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath_+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath_"; then +- lt_cv_aix_libpath_="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath_ +-fi +- +- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- no_undefined_flag=' ${wl}-bernotok' +- allow_undefined_flag=' ${wl}-berok' +- if test "$with_gnu_ld" = yes; then +- # We only use this code for GNU lds that support --whole-archive. +- whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- else +- # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec='$convenience' +- fi +- archive_cmds_need_lc=yes +- # This is similar to how AIX traditionally builds its shared libraries. +- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' +- fi +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds='' +- ;; +- m68k) +- archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_minus_L=yes +- ;; +- esac +- ;; +- +- bsdi[45]*) +- export_dynamic_flag_spec=-rdynamic +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- # 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. +- case $cc_basename in +- cl*) +- # Native MSVC +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- always_export_symbols=yes +- file_list_spec='@' +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' +- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; +- else +- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; +- fi~ +- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ +- linknames=' +- # The linker will not automatically build a static lib if we build a DLL. +- # _LT_TAGVAR(old_archive_from_new_cmds, )='true' +- enable_shared_with_static_runtimes=yes +- exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' +- export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' +- # Don't use ranlib +- old_postinstall_cmds='chmod 644 $oldlib' +- postlink_cmds='lt_outputfile="@OUTPUT@"~ +- lt_tool_outputfile="@TOOL_OUTPUT@"~ +- case $lt_outputfile in +- *.exe|*.EXE) ;; +- *) +- lt_outputfile="$lt_outputfile.exe" +- lt_tool_outputfile="$lt_tool_outputfile.exe" +- ;; +- esac~ +- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then +- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; +- $RM "$lt_outputfile.manifest"; +- fi' +- ;; +- *) +- # Assume MSVC wrapper +- hardcode_libdir_flag_spec=' ' +- allow_undefined_flag=unsupported +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' +- # The linker will automatically build a .lib file if we build a DLL. +- old_archive_from_new_cmds='true' +- # FIXME: Should let the user specify the lib program. +- old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' +- enable_shared_with_static_runtimes=yes +- ;; +- esac +- ;; +- +- darwin* | rhapsody*) +- +- +- archive_cmds_need_lc=no +- hardcode_direct=no +- hardcode_automatic=yes +- hardcode_shlibpath_var=unsupported +- if test "$lt_cv_ld_force_load" = "yes"; then +- whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' +- +- else +- whole_archive_flag_spec='' +- fi +- link_all_deplibs=yes +- allow_undefined_flag="$_lt_dar_allow_undefined" +- case $cc_basename in +- ifort*) _lt_dar_can_shared=yes ;; +- *) _lt_dar_can_shared=$GCC ;; +- esac +- if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=func_echo_all +- archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" +- module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" +- archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" +- module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" +- +- else +- ld_shlibs=no +- fi +- +- ;; +- +- dgux*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor +- # support. Future versions do this automatically, but an explicit c++rt0.o +- # does not break anything, and helps significantly (at the cost of a little +- # extra space). +- freebsd2.2*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- # Unfortunately, older versions of FreeBSD 2 do not have this feature. +- freebsd2.*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- # FreeBSD 3 and greater uses gcc -shared to do shared libraries. +- freebsd* | dragonfly*) +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- hpux9*) +- if test "$GCC" = yes; then +- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- else +- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- fi +- 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 +- export_dynamic_flag_spec='${wl}-E' +- ;; +- +- hpux10*) +- if test "$GCC" = yes && test "$with_gnu_ld" = no; then +- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +- fi +- if test "$with_gnu_ld" = no; then +- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_direct=yes +- hardcode_direct_absolute=yes +- export_dynamic_flag_spec='${wl}-E' +- # 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 "$GCC" = yes && test "$with_gnu_ld" = no; then +- case $host_cpu in +- hppa*64*) +- archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- ia64*) +- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- else +- case $host_cpu in +- hppa*64*) +- archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- ia64*) +- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- +- # Older versions of the 11.00 compiler do not understand -b yet +- # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +-$as_echo_n "checking if $CC understands -b... " >&6; } +-if ${lt_cv_prog_compiler__b+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler__b=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -b" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler__b=yes +- fi +- else +- lt_cv_prog_compiler__b=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +-$as_echo "$lt_cv_prog_compiler__b" >&6; } +- +-if test x"$lt_cv_prog_compiler__b" = xyes; then +- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +-else +- archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +-fi +- +- ;; +- esac +- fi +- 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_shlibpath_var=no +- ;; +- *) +- hardcode_direct=yes +- hardcode_direct_absolute=yes +- export_dynamic_flag_spec='${wl}-E' +- +- # 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*) +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- # Try to use the -exported_symbol ld option, if it does not +- # work, assume that -exports_file does not work either and +- # implicitly export all symbols. +- # This should be the same for all languages, so no per-tag cache variable. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +-if ${lt_cv_irix_exported_symbol+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-int foo (void) { return 0; } +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- lt_cv_irix_exported_symbol=yes +-else +- lt_cv_irix_exported_symbol=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS="$save_LDFLAGS" +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +-$as_echo "$lt_cv_irix_exported_symbol" >&6; } +- if test "$lt_cv_irix_exported_symbol" = yes; then +- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' +- fi +- else +- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' +- fi +- archive_cmds_need_lc='no' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- inherit_rpath=yes +- link_all_deplibs=yes +- ;; +- +- netbsd* | netbsdelf*-gnu) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out +- else +- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF +- fi +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- ;; +- +- newsos6) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- hardcode_shlibpath_var=no +- ;; +- +- *nto* | *qnx*) +- ;; +- +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- hardcode_direct=yes +- hardcode_shlibpath_var=no +- hardcode_direct_absolute=yes +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' +- hardcode_libdir_flag_spec='${wl}-rpath,$libdir' +- export_dynamic_flag_spec='${wl}-E' +- else +- case $host_os in +- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) +- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-R$libdir' +- ;; +- *) +- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' +- 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 +- allow_undefined_flag=unsupported +- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' +- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' +- ;; +- +- osf3*) +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- fi +- archive_cmds_need_lc='no' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator=: +- ;; +- +- osf4* | osf5*) # as osf3* with the addition of -msym flag +- if test "$GCC" = yes; then +- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' +- else +- allow_undefined_flag=' -expect_unresolved \*' +- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ +- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' +- +- # Both c and cxx compiler support -rpath directly +- hardcode_libdir_flag_spec='-rpath $libdir' +- fi +- archive_cmds_need_lc='no' +- hardcode_libdir_separator=: +- ;; +- +- solaris*) +- no_undefined_flag=' -z defs' +- if test "$GCC" = yes; then +- wlarc='${wl}' +- archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' +- else +- case `$CC -V 2>&1` in +- *"Compilers 5.0"*) +- wlarc='' +- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' +- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' +- ;; +- *) +- wlarc='${wl}' +- archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' +- ;; +- esac +- fi +- hardcode_libdir_flag_spec='-R$libdir' +- hardcode_shlibpath_var=no +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) +- # The compiler driver will combine and reorder linker options, +- # but understands `-z linker_flag'. GCC discards it without `$wl', +- # but is careful enough not to reorder. +- # Supported since Solaris 2.6 (maybe 2.5.1?) +- if test "$GCC" = yes; then +- whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' +- else +- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' +- fi +- ;; +- esac +- link_all_deplibs=yes +- ;; +- +- sunos4*) +- if test "x$host_vendor" = xsequent; then +- # Use $CC to link under sequent, because it throws in some extra .o +- # files that make .init and .fini sections work. +- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' +- fi +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_direct=yes +- hardcode_minus_L=yes +- hardcode_shlibpath_var=no +- ;; +- +- sysv4) +- case $host_vendor in +- sni) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=yes # is this really true??? +- ;; +- siemens) +- ## LD is ld it makes a PLAMLIB +- ## CC just makes a GrossModule. +- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' +- reload_cmds='$CC -r -o $output$reload_objs' +- hardcode_direct=no +- ;; +- motorola) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_direct=no #Motorola manual says yes, but my tests say they lie +- ;; +- esac +- runpath_var='LD_RUN_PATH' +- hardcode_shlibpath_var=no +- ;; +- +- sysv4.3*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- export_dynamic_flag_spec='-Bexport' +- ;; +- +- sysv4*MP*) +- if test -d /usr/nec; then +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_shlibpath_var=no +- runpath_var=LD_RUN_PATH +- hardcode_runpath_var=yes +- ld_shlibs=yes +- fi +- ;; +- +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) +- no_undefined_flag='${wl}-z,text' +- archive_cmds_need_lc=no +- hardcode_shlibpath_var=no +- runpath_var='LD_RUN_PATH' +- +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- ;; +- +- sysv5* | sco3.2v5* | sco5v6*) +- # Note: We can NOT use -z defs as we might desire, because we do not +- # link with -lc, and that would cause any symbols used from libc to +- # always be unresolved, which means just about no library would +- # ever link correctly. If we're not using GNU ld we use -z text +- # though, which does catch some bad symbols but isn't as heavy-handed +- # as -z defs. +- no_undefined_flag='${wl}-z,text' +- allow_undefined_flag='${wl}-z,nodefs' +- archive_cmds_need_lc=no +- hardcode_shlibpath_var=no +- hardcode_libdir_flag_spec='${wl}-R,$libdir' +- hardcode_libdir_separator=':' +- link_all_deplibs=yes +- export_dynamic_flag_spec='${wl}-Bexport' +- runpath_var='LD_RUN_PATH' +- +- if test "$GCC" = yes; then +- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- else +- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- fi +- ;; +- +- uts4*) +- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' +- hardcode_libdir_flag_spec='-L$libdir' +- hardcode_shlibpath_var=no +- ;; +- +- *) +- ld_shlibs=no +- ;; +- esac +- +- if test x$host_vendor = xsni; then +- case $host in +- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) +- export_dynamic_flag_spec='${wl}-Blargedynsym' +- ;; +- esac +- fi +- fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +-$as_echo "$ld_shlibs" >&6; } +-test "$ld_shlibs" = no && can_build_shared=no +- +-with_gnu_ld=$with_gnu_ld +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-# +-# Do we need to explicitly link libc? +-# +-case "x$archive_cmds_need_lc" in +-x|xyes) +- # Assume -lc should be added +- archive_cmds_need_lc=yes +- +- if test "$enable_shared" = yes && test "$GCC" = yes; then +- case $archive_cmds in +- *'~'*) +- # FIXME: we may have to deal with multi-command sequences. +- ;; +- '$CC '*) +- # Test whether the compiler implicitly links with -lc since on some +- # systems, -lgcc has to come before -lc. If gcc already passes -lc +- # to ld, don't add -lc before -lgcc. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +-if ${lt_cv_archive_cmds_need_lc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_prog_compiler_wl +- pic_flag=$lt_prog_compiler_pic +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$allow_undefined_flag +- allow_undefined_flag= +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 +- (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- then +- lt_cv_archive_cmds_need_lc=no +- else +- lt_cv_archive_cmds_need_lc=yes +- fi +- allow_undefined_flag=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } +- archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc +- ;; +- esac +- fi +- ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +-$as_echo_n "checking dynamic linker characteristics... " >&6; } +- +-if test "$GCC" = yes; then +- case $host_os in +- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; +- *) lt_awk_arg="/^libraries:/" ;; +- esac +- case $host_os in +- mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; +- *) lt_sed_strip_eq="s,=/,/,g" ;; +- esac +- lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` +- case $lt_search_path_spec in +- *\;*) +- # if the path contains ";" then we assume it to be the separator +- # otherwise default to the standard path separator (i.e. ":") - it is +- # assumed that no part of a normal pathname contains ";" but that should +- # okay in the real world where ";" in dirpaths is itself problematic. +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` +- ;; +- *) +- lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` +- ;; +- esac +- # Ok, now we have the path, separated by spaces, we can step through it +- # and add multilib dir if necessary. +- lt_tmp_lt_search_path_spec= +- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` +- for lt_sys_path in $lt_search_path_spec; do +- if test -d "$lt_sys_path/$lt_multi_os_dir"; then +- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" +- else +- test -d "$lt_sys_path" && \ +- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" +- fi +- done +- lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +-BEGIN {RS=" "; FS="/|\n";} { +- lt_foo=""; +- lt_count=0; +- for (lt_i = NF; lt_i > 0; lt_i--) { +- if ($lt_i != "" && $lt_i != ".") { +- if ($lt_i == "..") { +- lt_count++; +- } else { +- if (lt_count == 0) { +- lt_foo="/" $lt_i lt_foo; +- } else { +- lt_count--; +- } +- } +- } +- } +- if (lt_foo != "") { lt_freq[lt_foo]++; } +- if (lt_freq[lt_foo] == 1) { print lt_foo; } +-}'` +- # AWK program above erroneously prepends '/' to C:/dos/paths +- # for these hosts. +- case $host_os in +- mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ +- $SED 's,/\([A-Za-z]:\),\1,g'` ;; +- esac +- sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +-else +- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +-fi +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-shrext_cmds=".so" +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-need_lib_prefix=unknown +-hardcode_into_libs=no +- +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-need_version=unknown +- +-case $host_os in +-aix3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' +- shlibpath_var=LIBPATH +- +- # AIX 3 has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- +-aix[4-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- hardcode_into_libs=yes +- if test "$host_cpu" = ia64; then +- # AIX 5 supports IA64 +- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- else +- # With GCC up to 2.95.x, collect2 would create an import file +- # for dependence libraries. The import file would start with +- # the line `#! .'. This would cause the generated library to +- # depend on `.', always an invalid library. This was fixed in +- # development snapshots of GCC prior to 3.0. +- case $host_os in +- aix4 | aix4.[01] | aix4.[01].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then +- : +- else +- can_build_shared=no +- fi +- ;; +- esac +- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct +- # soname into executable. Probably we can add versioning support to +- # collect2, so additional links can be useful in future. +- if test "$aix_use_runtimelinking" = yes; then +- # If using run time linking (on AIX 4.2 or later) use lib.so +- # instead of lib.a to let people know that these are not +- # typical AIX shared libraries. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- else +- # We preserve .a as extension for shared libraries through AIX4.2 +- # and later when we are not doing run time linking. +- library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}${shared_ext}$major' +- fi +- shlibpath_var=LIBPATH +- fi +- ;; +- +-amigaos*) +- case $host_cpu in +- powerpc) +- # Since July 2007 AmigaOS4 officially supports .so libraries. +- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- ;; +- m68k) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' +- ;; +- esac +- ;; +- +-beos*) +- library_names_spec='${libname}${shared_ext}' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- ;; +- +-bsdi[45]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw* | pw32* | cegcc*) +- version_type=windows +- shrext_cmds=".dll" +- need_version=no +- need_lib_prefix=no +- +- case $GCC,$cc_basename in +- yes,*) +- # gcc +- library_names_spec='$libname.dll.a' +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname~ +- chmod a+x \$dldir/$dlname~ +- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; +- fi' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- +- case $host_os in +- cygwin*) +- # Cygwin DLLs use 'cyg' prefix rather than 'lib' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- +- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" +- ;; +- mingw* | cegcc*) +- # MinGW DLLs use traditional 'lib' prefix +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- pw32*) +- # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- ;; +- +- *,cl*) +- # Native MSVC +- libname_spec='$name' +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- library_names_spec='${libname}.dll.lib' +- +- case $build_os in +- mingw*) +- sys_lib_search_path_spec= +- lt_save_ifs=$IFS +- IFS=';' +- for lt_path in $LIB +- do +- IFS=$lt_save_ifs +- # Let DOS variable expansion print the short 8.3 style file name. +- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` +- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" +- done +- IFS=$lt_save_ifs +- # Convert to MSYS style. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` +- ;; +- cygwin*) +- # Convert to unix form, then to dos form, then back to unix form +- # but this time dos style (no spaces!) so that the unix form looks +- # like /cygdrive/c/PROGRA~1:/cygdr... +- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` +- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` +- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- ;; +- *) +- sys_lib_search_path_spec="$LIB" +- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then +- # It is most probably a Windows format PATH. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- # FIXME: find the short name or the path components, as spaces are +- # common. (e.g. "Program Files" -> "PROGRA~1") +- ;; +- esac +- +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- dynamic_linker='Win32 link.exe' +- ;; +- +- *) +- # Assume MSVC wrapper +- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' +- dynamic_linker='Win32 ld.exe' +- ;; +- esac +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; +- +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +- soname_spec='${libname}${release}${major}$shared_ext' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +- +- sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" +- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +- ;; +- +-dgux*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-freebsd* | dragonfly*) +- # DragonFly does not have aout. When/if they implement a new +- # versioning mechanism, adjust this. +- if test -x /usr/bin/objformat; then +- objformat=`/usr/bin/objformat` +- else +- case $host_os in +- freebsd[23].*) objformat=aout ;; +- *) objformat=elf ;; +- esac +- fi +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2.*) +- shlibpath_overrides_runpath=yes +- ;; +- freebsd3.[01]* | freebsdelf3.[01]*) +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ +- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- *) # from 4.6 on, and DragonFly +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- esac +- ;; +- +-haiku*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- dynamic_linker="$host_os runtime_loader" +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- case $host_cpu in +- ia64*) +- shrext_cmds='.so' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.so" +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- if test "X$HPUX_IA64_MODE" = X32; then +- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" +- else +- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" +- fi +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- hppa*64*) +- shrext_cmds='.sl' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- *) +- shrext_cmds='.sl' +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555, ... +- postinstall_cmds='chmod 555 $lib' +- # or fails outright, so override atomically: +- install_override_mode=555 +- ;; +- +-interix[3-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $host_os in +- nonstopux*) version_type=nonstopux ;; +- *) +- if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux # correct to gnu/linux during the next big refactor +- else +- version_type=irix +- fi ;; +- esac +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +- case $host_os in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") +- libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") +- libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") +- libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- hardcode_into_libs=yes +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux*oldld* | linux*aout* | linux*coff*) +- dynamic_linker=no +- ;; +- +-# This must be glibc/ELF. +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- +- # Some binutils ld are patched to set DT_RUNPATH +- if ${lt_cv_shlibpath_overrides_runpath+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_shlibpath_overrides_runpath=no +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ +- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +- lt_cv_shlibpath_overrides_runpath=yes +-fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir +- +-fi +- +- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath +- +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes +- +- # Append ld.so.conf contents to the search path +- if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" +- fi +- +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; +- +-netbsdelf*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='NetBSD ld.elf_so' +- ;; +- +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- +-newsos6) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-*nto* | *qnx*) +- version_type=qnx +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='ldqnx.so' +- ;; +- +-openbsd*) +- version_type=sunos +- sys_lib_dlsearch_path_spec="/usr/lib" +- need_lib_prefix=no +- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. +- case $host_os in +- openbsd3.3 | openbsd3.3.*) need_version=yes ;; +- *) need_version=no ;; +- esac +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case $host_os in +- openbsd2.[89] | openbsd2.[89].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac +- else +- shlibpath_overrides_runpath=yes +- fi +- ;; +- +-os2*) +- libname_spec='$name' +- shrext_cmds=".dll" +- need_lib_prefix=no +- library_names_spec='$libname${shared_ext} $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-rdos*) +- dynamic_linker=no +- ;; +- +-solaris*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- case $host_vendor in +- sni) +- shlibpath_overrides_runpath=no +- need_lib_prefix=no +- runpath_var=LD_RUN_PATH +- ;; +- siemens) +- need_lib_prefix=no +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- ;; +- esac +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' +- soname_spec='$libname${shared_ext}.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- version_type=freebsd-elf +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- if test "$with_gnu_ld" = yes; then +- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' +- else +- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' +- case $host_os in +- sco3.2v5*) +- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" +- ;; +- esac +- fi +- sys_lib_dlsearch_path_spec='/usr/lib' +- ;; +- +-tpf*) +- # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-uts4*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +-$as_echo "$dynamic_linker" >&6; } +-test "$dynamic_linker" = no && can_build_shared=no +- +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- +-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then +- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +-fi +-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then +- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +-$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +-hardcode_action= +-if test -n "$hardcode_libdir_flag_spec" || +- test -n "$runpath_var" || +- test "X$hardcode_automatic" = "Xyes" ; then +- +- # We can hardcode non-existent directories. +- if test "$hardcode_direct" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && +- test "$hardcode_minus_L" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action=unsupported +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +-$as_echo "$hardcode_action" >&6; } +- +-if test "$hardcode_action" = relink || +- test "$inherit_rpath" = yes; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +- +- +- +- +- +- +- if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +- lt_cv_dlopen=no +- lt_cv_dlopen_libs= +- +- case $host_os in +- beos*) +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; +- +- mingw* | pw32* | cegcc*) +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; +- +- cygwin*) +- lt_cv_dlopen="dlopen" +- lt_cv_dlopen_libs= +- ;; +- +- darwin*) +- # if libdl is installed we need to link against it +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +-$as_echo_n "checking for dlopen in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen (); +-int +-main () +-{ +-return dlopen (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dl_dlopen=yes +-else +- ac_cv_lib_dl_dlopen=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +-$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- +- lt_cv_dlopen="dyld" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- +-fi +- +- ;; +- +- *) +- ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +-if test "x$ac_cv_func_shl_load" = xyes; then : +- lt_cv_dlopen="shl_load" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +-$as_echo_n "checking for shl_load in -ldld... " >&6; } +-if ${ac_cv_lib_dld_shl_load+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char shl_load (); +-int +-main () +-{ +-return shl_load (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dld_shl_load=yes +-else +- ac_cv_lib_dld_shl_load=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +-$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +-if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +-else +- ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +-if test "x$ac_cv_func_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +-$as_echo_n "checking for dlopen in -ldl... " >&6; } +-if ${ac_cv_lib_dl_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldl $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen (); +-int +-main () +-{ +-return dlopen (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dl_dlopen=yes +-else +- ac_cv_lib_dl_dlopen=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +-$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +-if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +-$as_echo_n "checking for dlopen in -lsvld... " >&6; } +-if ${ac_cv_lib_svld_dlopen+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lsvld $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dlopen (); +-int +-main () +-{ +-return dlopen (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_svld_dlopen=yes +-else +- ac_cv_lib_svld_dlopen=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +-$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +-if test "x$ac_cv_lib_svld_dlopen" = xyes; then : +- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +-$as_echo_n "checking for dld_link in -ldld... " >&6; } +-if ${ac_cv_lib_dld_dld_link+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-ldld $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char dld_link (); +-int +-main () +-{ +-return dld_link (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_dld_dld_link=yes +-else +- ac_cv_lib_dld_dld_link=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +-$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +-if test "x$ac_cv_lib_dld_dld_link" = xyes; then : +- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- +-fi +- +- ;; +- esac +- +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- else +- enable_dlopen=no +- fi +- +- case $lt_cv_dlopen in +- dlopen) +- save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +- +- save_LDFLAGS="$LDFLAGS" +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +- +- save_LIBS="$LIBS" +- LIBS="$lt_cv_dlopen_libs $LIBS" +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +-$as_echo_n "checking whether a program can dlopen itself... " >&6; } +-if ${lt_cv_dlopen_self+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#if HAVE_DLFCN_H +-#include +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-/* When -fvisbility=hidden is used, assume the code has been annotated +- correspondingly for the symbols needed. */ +-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +-int fnord () __attribute__((visibility("default"))); +-#endif +- +-int fnord () { return 42; } +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; +- +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else +- { +- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- else puts (dlerror ()); +- } +- /* dlclose (self); */ +- } +- else +- puts (dlerror ()); +- +- return status; +-} +-_LT_EOF +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) >&5 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; +- x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self=no +- fi +-fi +-rm -fr conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +-$as_echo "$lt_cv_dlopen_self" >&6; } +- +- if test "x$lt_cv_dlopen_self" = xyes; then +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +-if ${lt_cv_dlopen_self_static+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test "$cross_compiling" = yes; then : +- lt_cv_dlopen_self_static=cross +-else +- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 +- lt_status=$lt_dlunknown +- cat > conftest.$ac_ext <<_LT_EOF +-#line $LINENO "configure" +-#include "confdefs.h" +- +-#if HAVE_DLFCN_H +-#include +-#endif +- +-#include +- +-#ifdef RTLD_GLOBAL +-# define LT_DLGLOBAL RTLD_GLOBAL +-#else +-# ifdef DL_GLOBAL +-# define LT_DLGLOBAL DL_GLOBAL +-# else +-# define LT_DLGLOBAL 0 +-# endif +-#endif +- +-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we +- find out it does not work in some platform. */ +-#ifndef LT_DLLAZY_OR_NOW +-# ifdef RTLD_LAZY +-# define LT_DLLAZY_OR_NOW RTLD_LAZY +-# else +-# ifdef DL_LAZY +-# define LT_DLLAZY_OR_NOW DL_LAZY +-# else +-# ifdef RTLD_NOW +-# define LT_DLLAZY_OR_NOW RTLD_NOW +-# else +-# ifdef DL_NOW +-# define LT_DLLAZY_OR_NOW DL_NOW +-# else +-# define LT_DLLAZY_OR_NOW 0 +-# endif +-# endif +-# endif +-# endif +-#endif +- +-/* When -fvisbility=hidden is used, assume the code has been annotated +- correspondingly for the symbols needed. */ +-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +-int fnord () __attribute__((visibility("default"))); +-#endif +- +-int fnord () { return 42; } +-int main () +-{ +- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); +- int status = $lt_dlunknown; +- +- if (self) +- { +- if (dlsym (self,"fnord")) status = $lt_dlno_uscore; +- else +- { +- if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; +- else puts (dlerror ()); +- } +- /* dlclose (self); */ +- } +- else +- puts (dlerror ()); +- +- return status; +-} +-_LT_EOF +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 +- (eval $ac_link) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then +- (./conftest; exit; ) >&5 2>/dev/null +- lt_status=$? +- case x$lt_status in +- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; +- x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; +- esac +- else : +- # compilation failed +- lt_cv_dlopen_self_static=no +- fi +-fi +-rm -fr conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +-$as_echo "$lt_cv_dlopen_self_static" >&6; } +- fi +- +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac +- +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac +- +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +-striplib= +-old_striplib= +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +-$as_echo_n "checking whether stripping libraries is possible... " >&6; } +-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then +- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" +- test -z "$striplib" && striplib="$STRIP --strip-unneeded" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +-else +-# FIXME - insert some real tests, host_os isn't really good enough +- case $host_os in +- darwin*) +- if test -n "$STRIP" ; then +- striplib="$STRIP -x" +- old_striplib="$STRIP -S" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- fi +- ;; +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- ;; +- esac +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- # Report which library types will actually be built +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +-$as_echo_n "checking if libtool supports shared libraries... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +-$as_echo "$can_build_shared" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +-$as_echo_n "checking whether to build shared libraries... " >&6; } +- test "$can_build_shared" = "no" && enable_shared=no +- +- # On AIX, shared libraries and static libraries use the same namespace, and +- # are all built from PIC. +- case $host_os in +- aix3*) +- test "$enable_shared" = yes && enable_static=no +- if test -n "$RANLIB"; then +- archive_cmds="$archive_cmds~\$RANLIB \$lib" +- postinstall_cmds='$RANLIB $lib' +- fi +- ;; +- +- aix[4-9]*) +- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then +- test "$enable_shared" = yes && enable_static=no +- fi +- ;; +- esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +-$as_echo "$enable_shared" >&6; } +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +-$as_echo_n "checking whether to build static libraries... " >&6; } +- # Make sure either enable_shared or enable_static is yes. +- test "$enable_shared" = yes || enable_static=yes +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +-$as_echo "$enable_static" >&6; } +- +- +- +- +-fi +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-CC="$lt_save_CC" +- +- if test -n "$CXX" && ( test "X$CXX" != "Xno" && +- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || +- (test "X$CXX" != "Xg++"))) ; then +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +-$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +-if test -z "$CXXCPP"; then +- if ${ac_cv_prog_CXXCPP+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # Double quotes because CXXCPP needs to be expanded +- for CXXCPP in "$CXX -E" "/lib/cpp" +- do +- ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- break +-fi +- +- done +- ac_cv_prog_CXXCPP=$CXXCPP +- +-fi +- CXXCPP=$ac_cv_prog_CXXCPP +-else +- ac_cv_prog_CXXCPP=$CXXCPP +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +-$as_echo "$CXXCPP" >&6; } +-ac_preproc_ok=false +-for ac_cxx_preproc_warn_flag in '' yes +-do +- # Use a header file that comes with gcc, so configuring glibc +- # with a fresh cross-compiler works. +- # Prefer to if __STDC__ is defined, since +- # exists even on freestanding compilers. +- # On the NeXT, cc -E runs the code through the compiler's parser, +- # not just through cpp. "Syntax error" is here to catch this case. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@ifdef __STDC__ +-@%:@ include +-@%:@else +-@%:@ include +-@%:@endif +- Syntax error +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- +-else +- # Broken: fails on valid input. +-continue +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +- # OK, works on sane cases. Now check whether nonexistent headers +- # can be detected and how. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@include +-_ACEOF +-if ac_fn_cxx_try_cpp "$LINENO"; then : +- # Broken: success on invalid input. +-continue +-else +- # Passes both tests. +-ac_preproc_ok=: +-break +-fi +-rm -f conftest.err conftest.i conftest.$ac_ext +- +-done +-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +-rm -f conftest.i conftest.err conftest.$ac_ext +-if $ac_preproc_ok; then : +- +-else +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +-See \`config.log' for more details" "$LINENO" 5; } +-fi +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-else +- _lt_caught_CXX_error=yes +-fi +- +-ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +- +-archive_cmds_need_lc_CXX=no +-allow_undefined_flag_CXX= +-always_export_symbols_CXX=no +-archive_expsym_cmds_CXX= +-compiler_needs_object_CXX=no +-export_dynamic_flag_spec_CXX= +-hardcode_direct_CXX=no +-hardcode_direct_absolute_CXX=no +-hardcode_libdir_flag_spec_CXX= +-hardcode_libdir_separator_CXX= +-hardcode_minus_L_CXX=no +-hardcode_shlibpath_var_CXX=unsupported +-hardcode_automatic_CXX=no +-inherit_rpath_CXX=no +-module_cmds_CXX= +-module_expsym_cmds_CXX= +-link_all_deplibs_CXX=unknown +-old_archive_cmds_CXX=$old_archive_cmds +-reload_flag_CXX=$reload_flag +-reload_cmds_CXX=$reload_cmds +-no_undefined_flag_CXX= +-whole_archive_flag_spec_CXX= +-enable_shared_with_static_runtimes_CXX=no +- +-# Source file extension for C++ test sources. +-ac_ext=cpp +- +-# Object file extension for compiled C++ test sources. +-objext=o +-objext_CXX=$objext +- +-# No sense in running all these tests if we already determined that +-# the CXX compiler isn't working. Some variables (like enable_shared) +-# are currently assumed to apply to all compilers on this platform, +-# and will be corrupted by setting them based on a non-working compiler. +-if test "$_lt_caught_CXX_error" != yes; then +- # Code to be used in simple compile tests +- lt_simple_compile_test_code="int some_variable = 0;" +- +- # Code to be used in simple link tests +- lt_simple_link_test_code='int main(int, char *[]) { return(0); }' +- +- # ltmain only uses $CC for tagged configurations so make sure $CC is set. +- +- +- +- +- +- +-# If no C compiler was specified, use CC. +-LTCC=${LTCC-"$CC"} +- +-# If no C compiler flags were specified, use CFLAGS. +-LTCFLAGS=${LTCFLAGS-"$CFLAGS"} +- +-# Allow CC to be a program name with arguments. +-compiler=$CC +- +- +- # save warnings/boilerplate of simple test code +- ac_outfile=conftest.$ac_objext +-echo "$lt_simple_compile_test_code" >conftest.$ac_ext +-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_compiler_boilerplate=`cat conftest.err` +-$RM conftest* +- +- ac_outfile=conftest.$ac_objext +-echo "$lt_simple_link_test_code" >conftest.$ac_ext +-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +-_lt_linker_boilerplate=`cat conftest.err` +-$RM -r conftest* +- +- +- # Allow CC to be a program name with arguments. +- lt_save_CC=$CC +- lt_save_CFLAGS=$CFLAGS +- lt_save_LD=$LD +- lt_save_GCC=$GCC +- GCC=$GXX +- lt_save_with_gnu_ld=$with_gnu_ld +- lt_save_path_LD=$lt_cv_path_LD +- if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then +- lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +- else +- $as_unset lt_cv_prog_gnu_ld +- fi +- if test -n "${lt_cv_path_LDCXX+set}"; then +- lt_cv_path_LD=$lt_cv_path_LDCXX +- else +- $as_unset lt_cv_path_LD +- fi +- test -z "${LDCXX+set}" || LD=$LDCXX +- CC=${CXX-"c++"} +- CFLAGS=$CXXFLAGS +- compiler=$CC +- compiler_CXX=$CC +- for cc_temp in $compiler""; do +- case $cc_temp in +- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; +- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; +- \-*) ;; +- *) break;; +- esac +-done +-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +- +- +- if test -n "$compiler"; then +- # We don't want -fno-exception when compiling C++ code, so set the +- # no_builtin_flag separately +- if test "$GXX" = yes; then +- lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +- else +- lt_prog_compiler_no_builtin_flag_CXX= +- fi +- +- if test "$GXX" = yes; then +- # Set up default GNU C++ configuration +- +- +- +-@%:@ Check whether --with-gnu-ld was given. +-if test "${with_gnu_ld+set}" = set; then : +- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +-else +- with_gnu_ld=no +-fi +- +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +-$as_echo_n "checking for ld used by $CC... " >&6; } +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [\\/]* | ?:[\\/]*) +- re_direlt='/[^/][^/]*/\.\./' +- # Canonicalize the pathname of ld +- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` +- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +-$as_echo_n "checking for GNU ld... " >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +-$as_echo_n "checking for non-GNU ld... " >&6; } +-fi +-if ${lt_cv_path_LD+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -z "$LD"; then +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$lt_cv_path_LD" -v 2>&1 &5 +-$as_echo "$LD" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +-if ${lt_cv_prog_gnu_ld+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # I'd rather use --version here, but apparently some GNU lds only accept -v. +-case `$LD -v 2>&1 &5 +-$as_echo "$lt_cv_prog_gnu_ld" >&6; } +-with_gnu_ld=$lt_cv_prog_gnu_ld +- +- +- +- +- +- +- +- # Check if GNU C++ uses GNU ld as the underlying linker, since the +- # archiving commands below assume that GNU ld is being used. +- if test "$with_gnu_ld" = yes; then +- archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- +- # If archive_cmds runs LD, not CC, wlarc should be empty +- # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to +- # investigate it a little bit more. (MM) +- wlarc='${wl}' +- +- # ancient GNU ld didn't support --whole-archive et. al. +- if eval "`$CC -print-prog-name=ld` --help 2>&1" | +- $GREP 'no-whole-archive' > /dev/null; then +- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- else +- whole_archive_flag_spec_CXX= +- fi +- else +- with_gnu_ld=no +- wlarc= +- +- # A generic and very simple default shared library creation +- # command for GNU C++ for the case where it uses the native +- # linker, instead of GNU ld. If possible, this setting should +- # overridden to take advantage of the native linker features on +- # the platform it is being used on. +- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' +- fi +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- +- else +- GXX=no +- with_gnu_ld=no +- wlarc= +- fi +- +- # PORTME: fill in a description of your system's C++ link characteristics +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +- ld_shlibs_CXX=yes +- case $host_os in +- aix3*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- 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 +- exp_sym_flag='-Bexport' +- no_entry_flag="" +- 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 +- case $ld_flag in +- *-brtl*) +- aix_use_runtimelinking=yes +- break +- ;; +- esac +- done +- ;; +- esac +- +- exp_sym_flag='-bexport' +- no_entry_flag='-bnoentry' +- fi +- +- # When large executables or shared objects are built, AIX ld can +- # have problems creating the table of contents. If linking a library +- # or program results in "error TOC overflow" add -mminimal-toc to +- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not +- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. +- +- archive_cmds_CXX='' +- hardcode_direct_CXX=yes +- hardcode_direct_absolute_CXX=yes +- hardcode_libdir_separator_CXX=':' +- link_all_deplibs_CXX=yes +- file_list_spec_CXX='${wl}-f,' +- +- if test "$GXX" = yes; then +- case $host_os in aix4.[012]|aix4.[012].*) +- # We only want to do this on AIX 4.2 and lower, the check +- # below for broken collect2 doesn't work under 4.3+ +- 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_CXX=unsupported +- # It fails to find uninstalled libraries when the uninstalled +- # path is not listed in the libpath. Setting hardcode_minus_L +- # to unsupported forces relinking +- hardcode_minus_L_CXX=yes +- hardcode_libdir_flag_spec_CXX='-L$libdir' +- hardcode_libdir_separator_CXX= +- fi +- esac +- shared_flag='-shared' +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag="$shared_flag "'${wl}-G' +- fi +- else +- # not using gcc +- if test "$host_cpu" = ia64; then +- # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release +- # chokes on -Wl,-G. The following line is correct: +- shared_flag='-G' +- else +- if test "$aix_use_runtimelinking" = yes; then +- shared_flag='${wl}-G' +- else +- shared_flag='${wl}-bM:SRE' +- fi +- fi +- fi +- +- export_dynamic_flag_spec_CXX='${wl}-bexpall' +- # It seems that -bexpall does not export symbols beginning with +- # underscore (_), so it is better to generate a list of symbols to +- # export. +- always_export_symbols_CXX=yes +- if test "$aix_use_runtimelinking" = yes; then +- # Warning - without using the other runtime loading flags (-brtl), +- # -berok will link without error, but may produce a broken library. +- allow_undefined_flag_CXX='-berok' +- # Determine the default libpath from the value encoded in an empty +- # executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath__CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath__CXX +-fi +- +- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" +- +- archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" +- else +- if test "$host_cpu" = ia64; then +- hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' +- allow_undefined_flag_CXX="-z nodefs" +- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" +- else +- # Determine the default libpath from the value encoded in an +- # empty executable. +- if test "${lt_cv_aix_libpath+set}" = set; then +- aix_libpath=$lt_cv_aix_libpath +-else +- if ${lt_cv_aix_libpath__CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_link "$LINENO"; then : +- +- lt_aix_libpath_sed=' +- /Import File Strings/,/^$/ { +- /^0/ { +- s/^0 *\([^ ]*\) *$/\1/ +- p +- } +- }' +- lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- # Check for a 64-bit object if we didn't find anything. +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- if test -z "$lt_cv_aix_libpath__CXX"; then +- lt_cv_aix_libpath__CXX="/usr/lib:/lib" +- fi +- +-fi +- +- aix_libpath=$lt_cv_aix_libpath__CXX +-fi +- +- hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" +- # Warning - without using the other run time loading flags, +- # -berok will link without error, but may produce a broken library. +- no_undefined_flag_CXX=' ${wl}-bernotok' +- allow_undefined_flag_CXX=' ${wl}-berok' +- if test "$with_gnu_ld" = yes; then +- # We only use this code for GNU lds that support --whole-archive. +- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- else +- # Exported symbols can be pulled into shared objects from archives +- whole_archive_flag_spec_CXX='$convenience' +- fi +- archive_cmds_need_lc_CXX=yes +- # This is similar to how AIX traditionally builds its shared +- # libraries. +- archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' +- fi +- fi +- ;; +- +- beos*) +- if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then +- allow_undefined_flag_CXX=unsupported +- # Joseph Beckenbach says some releases of gcc +- # support --undefined. This deserves some investigation. FIXME +- archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- else +- ld_shlibs_CXX=no +- fi +- ;; +- +- chorus*) +- case $cc_basename in +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- cygwin* | mingw* | pw32* | cegcc*) +- case $GXX,$cc_basename in +- ,cl* | no,cl*) +- # Native MSVC +- # hardcode_libdir_flag_spec is actually meaningless, as there is +- # no search path for DLLs. +- hardcode_libdir_flag_spec_CXX=' ' +- allow_undefined_flag_CXX=unsupported +- always_export_symbols_CXX=yes +- file_list_spec_CXX='@' +- # Tell ltmain to make .lib files, not .a files. +- libext=lib +- # Tell ltmain to make .dll files, not .so files. +- shrext_cmds=".dll" +- # FIXME: Setting linknames here is a bad hack. +- archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' +- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; +- else +- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; +- fi~ +- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ +- linknames=' +- # The linker will not automatically build a static lib if we build a DLL. +- # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' +- enable_shared_with_static_runtimes_CXX=yes +- # Don't use ranlib +- old_postinstall_cmds_CXX='chmod 644 $oldlib' +- postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ +- lt_tool_outputfile="@TOOL_OUTPUT@"~ +- case $lt_outputfile in +- *.exe|*.EXE) ;; +- *) +- lt_outputfile="$lt_outputfile.exe" +- lt_tool_outputfile="$lt_tool_outputfile.exe" +- ;; +- esac~ +- func_to_tool_file "$lt_outputfile"~ +- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then +- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; +- $RM "$lt_outputfile.manifest"; +- fi' +- ;; +- *) +- # g++ +- # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, +- # as there is no search path for DLLs. +- hardcode_libdir_flag_spec_CXX='-L$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' +- allow_undefined_flag_CXX=unsupported +- always_export_symbols_CXX=no +- enable_shared_with_static_runtimes_CXX=yes +- +- if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then +- archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- # If the export-symbols file already is a .def file (1st line +- # is EXPORTS), use it as is; otherwise, prepend... +- archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then +- cp $export_symbols $output_objdir/$soname.def; +- else +- echo EXPORTS > $output_objdir/$soname.def; +- cat $export_symbols >> $output_objdir/$soname.def; +- fi~ +- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' +- else +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- darwin* | rhapsody*) +- +- +- archive_cmds_need_lc_CXX=no +- hardcode_direct_CXX=no +- hardcode_automatic_CXX=yes +- hardcode_shlibpath_var_CXX=unsupported +- if test "$lt_cv_ld_force_load" = "yes"; then +- whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' +- +- else +- whole_archive_flag_spec_CXX='' +- fi +- link_all_deplibs_CXX=yes +- allow_undefined_flag_CXX="$_lt_dar_allow_undefined" +- case $cc_basename in +- ifort*) _lt_dar_can_shared=yes ;; +- *) _lt_dar_can_shared=$GCC ;; +- esac +- if test "$_lt_dar_can_shared" = "yes"; then +- output_verbose_link_cmd=func_echo_all +- archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" +- module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" +- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" +- module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" +- if test "$lt_cv_apple_cc_single_mod" != "yes"; then +- archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" +- archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" +- fi +- +- else +- ld_shlibs_CXX=no +- fi +- +- ;; +- +- dgux*) +- case $cc_basename in +- ec++*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- ghcx*) +- # Green Hills C++ Compiler +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- freebsd2.*) +- # C++ shared libraries reported to be fairly broken before +- # switch to ELF +- ld_shlibs_CXX=no +- ;; +- +- freebsd-elf*) +- archive_cmds_need_lc_CXX=no +- ;; +- +- freebsd* | dragonfly*) +- # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF +- # conventions +- ld_shlibs_CXX=yes +- ;; +- +- haiku*) +- archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- link_all_deplibs_CXX=yes +- ;; +- +- hpux9*) +- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- export_dynamic_flag_spec_CXX='${wl}-E' +- hardcode_direct_CXX=yes +- hardcode_minus_L_CXX=yes # Not in the search PATH, +- # but as the default +- # location of the library. +- +- case $cc_basename in +- CC*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- aCC*) +- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- ;; +- *) +- if test "$GXX" = yes; then +- archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' +- else +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- +- hpux10*|hpux11*) +- if test $with_gnu_ld = no; then +- hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- +- case $host_cpu in +- hppa*64*|ia64*) +- ;; +- *) +- export_dynamic_flag_spec_CXX='${wl}-E' +- ;; +- esac +- fi +- case $host_cpu in +- hppa*64*|ia64*) +- hardcode_direct_CXX=no +- hardcode_shlibpath_var_CXX=no +- ;; +- *) +- hardcode_direct_CXX=yes +- hardcode_direct_absolute_CXX=yes +- hardcode_minus_L_CXX=yes # Not in the search PATH, +- # but as the default +- # location of the library. +- ;; +- esac +- +- case $cc_basename in +- CC*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- aCC*) +- case $host_cpu in +- hppa*64*) +- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- ia64*) +- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- *) +- archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- esac +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- ;; +- *) +- if test "$GXX" = yes; then +- if test $with_gnu_ld = no; then +- case $host_cpu in +- hppa*64*) +- archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- ia64*) +- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- *) +- archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- ;; +- esac +- fi +- else +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- +- interix[3-9]*) +- hardcode_direct_CXX=no +- hardcode_shlibpath_var_CXX=no +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- export_dynamic_flag_spec_CXX='${wl}-E' +- # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. +- # Instead, shared libraries are loaded at an image base (0x10000000 by +- # default) and relocated if they conflict, which is a slow very memory +- # consuming and fragmenting process. To avoid this, we pick a random, +- # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link +- # time. Moving up from 0x10000000 also allows more sbrk(2) space. +- archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' +- ;; +- irix5* | irix6*) +- case $cc_basename in +- CC*) +- # SGI C++ +- archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- +- # Archives containing C++ object files must be created using +- # "CC -ar", where "CC" is the IRIX C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' +- ;; +- *) +- if test "$GXX" = yes; then +- if test "$with_gnu_ld" = no; then +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- else +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' +- fi +- fi +- link_all_deplibs_CXX=yes +- ;; +- esac +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- inherit_rpath_CXX=yes +- ;; +- +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- case $cc_basename in +- KCC*) +- # Kuck and Associates, Inc. (KAI) C++ Compiler +- +- # KCC will only create a shared library if the output file +- # ends with ".so" (or ".sl" for HP-UX), so rename the library +- # to its proper name (with version) after linking. +- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +- archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- +- # Archives containing C++ object files must be created using +- # "CC -Bstatic", where "CC" is the KAI C++ compiler. +- old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' +- ;; +- icpc* | ecpc* ) +- # Intel C++ +- with_gnu_ld=yes +- # version 8.0 and above of icpc choke on multiply defined symbols +- # if we add $predep_objects and $postdep_objects, however 7.1 and +- # earlier do not add the objects themselves. +- case `$CC -V 2>&1` in +- *"Version 7."*) +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- ;; +- *) # Version 8.0 or newer +- tmp_idyn= +- case $host_cpu in +- ia64*) tmp_idyn=' -i_dynamic';; +- esac +- archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +- ;; +- esac +- archive_cmds_need_lc_CXX=no +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' +- ;; +- pgCC* | pgcpp*) +- # Portland Group C++ compiler +- case `$CC -V` in +- *pgCC\ [1-5].* | *pgcpp\ [1-5].*) +- prelink_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ +- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' +- old_archive_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ +- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ +- $RANLIB $oldlib' +- archive_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' +- archive_expsym_cmds_CXX='tpldir=Template.dir~ +- rm -rf $tpldir~ +- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ +- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' +- ;; +- *) # Version 6 and above use weak symbols +- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' +- ;; +- esac +- +- hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- ;; +- cxx*) +- # Compaq C++ +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' +- archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' +- +- runpath_var=LD_RUN_PATH +- hardcode_libdir_flag_spec_CXX='-rpath $libdir' +- hardcode_libdir_separator_CXX=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' +- ;; +- xl* | mpixl* | bgxl*) +- # IBM XL 8.0 on PPC, with GNU ld +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- export_dynamic_flag_spec_CXX='${wl}--export-dynamic' +- archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' +- if test "x$supports_anon_versioning" = xyes; then +- archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ +- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +- echo "local: *; };" >> $output_objdir/$libname.ver~ +- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' +- fi +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- no_undefined_flag_CXX=' -zdefs' +- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' +- hardcode_libdir_flag_spec_CXX='-R$libdir' +- whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' +- compiler_needs_object_CXX=yes +- +- # Not sure whether something based on +- # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 +- # would be better. +- output_verbose_link_cmd='func_echo_all' +- +- # Archives containing C++ object files must be created using +- # "CC -xar", where "CC" is the Sun C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' +- ;; +- esac +- ;; +- esac +- ;; +- +- lynxos*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- m88k*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- mvs*) +- case $cc_basename in +- cxx*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- netbsd*) +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' +- wlarc= +- hardcode_libdir_flag_spec_CXX='-R$libdir' +- hardcode_direct_CXX=yes +- hardcode_shlibpath_var_CXX=no +- fi +- # Workaround some broken pre-1.5 toolchains +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' +- ;; +- +- *nto* | *qnx*) +- ld_shlibs_CXX=yes +- ;; +- +- openbsd2*) +- # C++ shared libraries are fairly broken +- ld_shlibs_CXX=no +- ;; +- +- openbsd*) +- if test -f /usr/libexec/ld.so; then +- hardcode_direct_CXX=yes +- hardcode_shlibpath_var_CXX=no +- hardcode_direct_absolute_CXX=yes +- archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' +- export_dynamic_flag_spec_CXX='${wl}-E' +- whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' +- fi +- output_verbose_link_cmd=func_echo_all +- else +- ld_shlibs_CXX=no +- fi +- ;; +- +- osf3* | osf4* | osf5*) +- case $cc_basename in +- KCC*) +- # Kuck and Associates, Inc. (KAI) C++ Compiler +- +- # KCC will only create a shared library if the output file +- # ends with ".so" (or ".sl" for HP-UX), so rename the library +- # to its proper name (with version) after linking. +- archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' +- hardcode_libdir_separator_CXX=: +- +- # Archives containing C++ object files must be created using +- # the KAI C++ compiler. +- case $host in +- osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; +- *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; +- esac +- ;; +- RCC*) +- # Rational C++ 2.4.1 +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- cxx*) +- case $host in +- osf3*) +- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- ;; +- *) +- allow_undefined_flag_CXX=' -expect_unresolved \*' +- archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' +- archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ +- echo "-hidden">> $lib.exp~ +- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ +- $RM $lib.exp' +- hardcode_libdir_flag_spec_CXX='-rpath $libdir' +- ;; +- esac +- +- hardcode_libdir_separator_CXX=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- # +- # There doesn't appear to be a way to prevent this compiler from +- # explicitly linking system object files so we need to strip them +- # from the output so that they don't get included in the library +- # dependencies. +- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' +- ;; +- *) +- if test "$GXX" = yes && test "$with_gnu_ld" = no; then +- allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' +- case $host in +- osf3*) +- archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- ;; +- *) +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' +- ;; +- esac +- +- hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' +- hardcode_libdir_separator_CXX=: +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- +- else +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- fi +- ;; +- esac +- ;; +- +- psos*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- sunos4*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.x +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- lcc*) +- # Lucid +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- solaris*) +- case $cc_basename in +- CC* | sunCC*) +- # Sun C++ 4.2, 5.x and Centerline C++ +- archive_cmds_need_lc_CXX=yes +- no_undefined_flag_CXX=' -zdefs' +- archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' +- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- hardcode_libdir_flag_spec_CXX='-R$libdir' +- hardcode_shlibpath_var_CXX=no +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) +- # The compiler driver will combine and reorder linker options, +- # but understands `-z linker_flag'. +- # Supported since Solaris 2.6 (maybe 2.5.1?) +- whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' +- ;; +- esac +- link_all_deplibs_CXX=yes +- +- output_verbose_link_cmd='func_echo_all' +- +- # Archives containing C++ object files must be created using +- # "CC -xar", where "CC" is the Sun C++ compiler. This is +- # necessary to make sure instantiated templates are included +- # in the archive. +- old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' +- ;; +- gcx*) +- # Green Hills C++ Compiler +- archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- +- # The C++ compiler must be used to create the archive. +- old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' +- ;; +- *) +- # GNU C++ compiler with Solaris linker +- if test "$GXX" = yes && test "$with_gnu_ld" = no; then +- no_undefined_flag_CXX=' ${wl}-z ${wl}defs' +- if $CC --version | $GREP -v '^2\.7' > /dev/null; then +- archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- else +- # g++ 2.7 appears to require `-G' NOT `-shared' on this +- # platform. +- archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' +- archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ +- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' +- +- # Commands to make compiler produce verbose output that lists +- # what "hidden" libraries, object files and flags are used when +- # linking a shared library. +- output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' +- fi +- +- hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' +- case $host_os in +- solaris2.[0-5] | solaris2.[0-5].*) ;; +- *) +- whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' +- ;; +- esac +- fi +- ;; +- esac +- ;; +- +- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) +- no_undefined_flag_CXX='${wl}-z,text' +- archive_cmds_need_lc_CXX=no +- hardcode_shlibpath_var_CXX=no +- runpath_var='LD_RUN_PATH' +- +- case $cc_basename in +- CC*) +- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- *) +- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- ;; +- +- sysv5* | sco3.2v5* | sco5v6*) +- # Note: We can NOT use -z defs as we might desire, because we do not +- # link with -lc, and that would cause any symbols used from libc to +- # always be unresolved, which means just about no library would +- # ever link correctly. If we're not using GNU ld we use -z text +- # though, which does catch some bad symbols but isn't as heavy-handed +- # as -z defs. +- no_undefined_flag_CXX='${wl}-z,text' +- allow_undefined_flag_CXX='${wl}-z,nodefs' +- archive_cmds_need_lc_CXX=no +- hardcode_shlibpath_var_CXX=no +- hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' +- hardcode_libdir_separator_CXX=':' +- link_all_deplibs_CXX=yes +- export_dynamic_flag_spec_CXX='${wl}-Bexport' +- runpath_var='LD_RUN_PATH' +- +- case $cc_basename in +- CC*) +- archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ +- '"$old_archive_cmds_CXX" +- reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ +- '"$reload_cmds_CXX" +- ;; +- *) +- archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' +- ;; +- esac +- ;; +- +- tandem*) +- case $cc_basename in +- NCC*) +- # NonStop-UX NCC 3.20 +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- ;; +- +- vxworks*) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- +- *) +- # FIXME: insert proper C++ library support +- ld_shlibs_CXX=no +- ;; +- esac +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +-$as_echo "$ld_shlibs_CXX" >&6; } +- test "$ld_shlibs_CXX" = no && can_build_shared=no +- +- GCC_CXX="$GXX" +- LD_CXX="$LD" +- +- ## CAVEAT EMPTOR: +- ## There is no encapsulation within the following macros, do not change +- ## the running order or otherwise move them around unless you know exactly +- ## what you are doing... +- # Dependencies to place before and after the object being linked: +-predep_objects_CXX= +-postdep_objects_CXX= +-predeps_CXX= +-postdeps_CXX= +-compiler_lib_search_path_CXX= +- +-cat > conftest.$ac_ext <<_LT_EOF +-class Foo +-{ +-public: +- Foo (void) { a = 0; } +-private: +- int a; +-}; +-_LT_EOF +- +- +-_lt_libdeps_save_CFLAGS=$CFLAGS +-case "$CC $CFLAGS " in #( +-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +-esac +- +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- # Parse the compiler output and extract the necessary +- # objects, libraries and library flags. +- +- # Sentinel used to keep track of whether or not we are before +- # the conftest object file. +- pre_test_object_deps_done=no +- +- for p in `eval "$output_verbose_link_cmd"`; do +- case ${prev}${p} in +- +- -L* | -R* | -l*) +- # Some compilers place space between "-{L,R}" and the path. +- # Remove the space. +- if test $p = "-L" || +- test $p = "-R"; then +- prev=$p +- continue +- fi +- +- # Expand the sysroot to ease extracting the directories later. +- if test -z "$prev"; then +- case $p in +- -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; +- -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; +- -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; +- esac +- fi +- case $p in +- =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; +- esac +- if test "$pre_test_object_deps_done" = no; then +- case ${prev} in +- -L | -R) +- # Internal compiler library paths should come after those +- # provided the user. The postdeps already come after the +- # user supplied libs so there is no need to process them. +- if test -z "$compiler_lib_search_path_CXX"; then +- compiler_lib_search_path_CXX="${prev}${p}" +- else +- compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" +- fi +- ;; +- # The "-l" case would never come before the object being +- # linked, so don't bother handling this case. +- esac +- else +- if test -z "$postdeps_CXX"; then +- postdeps_CXX="${prev}${p}" +- else +- postdeps_CXX="${postdeps_CXX} ${prev}${p}" +- fi +- fi +- prev= +- ;; +- +- *.lto.$objext) ;; # Ignore GCC LTO objects +- *.$objext) +- # This assumes that the test object file only shows up +- # once in the compiler output. +- if test "$p" = "conftest.$objext"; then +- pre_test_object_deps_done=yes +- continue +- fi +- +- if test "$pre_test_object_deps_done" = no; then +- if test -z "$predep_objects_CXX"; then +- predep_objects_CXX="$p" +- else +- predep_objects_CXX="$predep_objects_CXX $p" +- fi +- else +- if test -z "$postdep_objects_CXX"; then +- postdep_objects_CXX="$p" +- else +- postdep_objects_CXX="$postdep_objects_CXX $p" +- fi +- fi +- ;; +- +- *) ;; # Ignore the rest. +- +- esac +- done +- +- # Clean up. +- rm -f a.out a.exe +-else +- echo "libtool.m4: error: problem compiling CXX test program" +-fi +- +-$RM -f confest.$objext +-CFLAGS=$_lt_libdeps_save_CFLAGS +- +-# PORTME: override above test on systems where it is broken +-case $host_os in +-interix[3-9]*) +- # Interix 3.5 installs completely hosed .la files for C++, so rather than +- # hack all around it, let's just trust "g++" to DTRT. +- predep_objects_CXX= +- postdep_objects_CXX= +- postdeps_CXX= +- ;; +- +-linux*) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- +- # The more standards-conforming stlport4 library is +- # incompatible with the Cstd library. Avoid specifying +- # it if it's in CXXFLAGS. Ignore libCrun as +- # -library=stlport4 depends on it. +- case " $CXX $CXXFLAGS " in +- *" -library=stlport4 "*) +- solaris_use_stlport4=yes +- ;; +- esac +- +- if test "$solaris_use_stlport4" != yes; then +- postdeps_CXX='-library=Cstd -library=Crun' +- fi +- ;; +- esac +- ;; +- +-solaris*) +- case $cc_basename in +- CC* | sunCC*) +- # The more standards-conforming stlport4 library is +- # incompatible with the Cstd library. Avoid specifying +- # it if it's in CXXFLAGS. Ignore libCrun as +- # -library=stlport4 depends on it. +- case " $CXX $CXXFLAGS " in +- *" -library=stlport4 "*) +- solaris_use_stlport4=yes +- ;; +- esac +- +- # Adding this requires a known-good setup of shared libraries for +- # Sun compiler versions before 5.6, else PIC objects from an old +- # archive will be linked into the output, leading to subtle bugs. +- if test "$solaris_use_stlport4" != yes; then +- postdeps_CXX='-library=Cstd -library=Crun' +- fi +- ;; +- esac +- ;; +-esac +- +- +-case " $postdeps_CXX " in +-*" -lc "*) archive_cmds_need_lc_CXX=no ;; +-esac +- compiler_lib_search_dirs_CXX= +-if test -n "${compiler_lib_search_path_CXX}"; then +- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- lt_prog_compiler_wl_CXX= +-lt_prog_compiler_pic_CXX= +-lt_prog_compiler_static_CXX= +- +- +- # C++ specific cases for pic, static, wl, etc. +- if test "$GXX" = yes; then +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='-static' +- +- case $host_os in +- aix*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static_CXX='-Bstatic' +- fi +- ;; +- +- amigaos*) +- case $host_cpu in +- powerpc) +- # see comment about AmigaOS4 .so support +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- m68k) +- # FIXME: we need at least 68020 code to build shared libraries, but +- # adding the `-m68020' flag to GCC prevents building anything better, +- # like `-m68040'. +- lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' +- ;; +- esac +- ;; +- +- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) +- # PIC is the default for these OSes. +- ;; +- mingw* | cygwin* | os2* | pw32* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- # Although the cygwin gcc ignores -fPIC, still need this for old-style +- # (--disable-auto-import) libraries +- lt_prog_compiler_pic_CXX='-DDLL_EXPORT' +- ;; +- darwin* | rhapsody*) +- # PIC is the default on this platform +- # Common symbols not allowed in MH_DYLIB files +- lt_prog_compiler_pic_CXX='-fno-common' +- ;; +- *djgpp*) +- # DJGPP does not support shared libraries at all +- lt_prog_compiler_pic_CXX= +- ;; +- haiku*) +- # PIC is the default for Haiku. +- # The "-static" flag exists, but is broken. +- lt_prog_compiler_static_CXX= +- ;; +- interix[3-9]*) +- # Interix 3.x gcc -fpic/-fPIC options generate broken code. +- # Instead, we relocate shared libraries at runtime. +- ;; +- sysv4*MP*) +- if test -d /usr/nec; then +- lt_prog_compiler_pic_CXX=-Kconform_pic +- fi +- ;; +- hpux*) +- # PIC is the default for 64-bit PA HP-UX, but not for 32-bit +- # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag +- # sets the default TLS model and affects inlining. +- case $host_cpu in +- hppa*64*) +- ;; +- *) +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- esac +- ;; +- *qnx* | *nto*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic_CXX='-fPIC -shared' +- ;; +- *) +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- esac +- else +- case $host_os in +- aix[4-9]*) +- # All AIX code is PIC. +- if test "$host_cpu" = ia64; then +- # AIX 5 now supports IA64 processor +- lt_prog_compiler_static_CXX='-Bstatic' +- else +- lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' +- fi +- ;; +- chorus*) +- case $cc_basename in +- cxch68*) +- # Green Hills C++ Compiler +- # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" +- ;; +- esac +- ;; +- mingw* | cygwin* | os2* | pw32* | cegcc*) +- # This hack is so that the source file can tell whether it is being +- # built for inclusion in a dll (and should export symbols for example). +- lt_prog_compiler_pic_CXX='-DDLL_EXPORT' +- ;; +- dgux*) +- case $cc_basename in +- ec++*) +- lt_prog_compiler_pic_CXX='-KPIC' +- ;; +- ghcx*) +- # Green Hills C++ Compiler +- lt_prog_compiler_pic_CXX='-pic' +- ;; +- *) +- ;; +- esac +- ;; +- freebsd* | dragonfly*) +- # FreeBSD uses GNU C++ +- ;; +- hpux9* | hpux10* | hpux11*) +- case $cc_basename in +- CC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' +- if test "$host_cpu" != ia64; then +- lt_prog_compiler_pic_CXX='+Z' +- fi +- ;; +- aCC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' +- case $host_cpu in +- hppa*64*|ia64*) +- # +Z the default +- ;; +- *) +- lt_prog_compiler_pic_CXX='+Z' +- ;; +- esac +- ;; +- *) +- ;; +- esac +- ;; +- interix*) +- # This is c89, which is MS Visual C++ (no shared libs) +- # Anyone wants to do a port? +- ;; +- irix5* | irix6* | nonstopux*) +- case $cc_basename in +- CC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_static_CXX='-non_shared' +- # CC pic flag -KPIC is the default. +- ;; +- *) +- ;; +- esac +- ;; +- linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- case $cc_basename in +- KCC*) +- # KAI C++ Compiler +- lt_prog_compiler_wl_CXX='--backend -Wl,' +- lt_prog_compiler_pic_CXX='-fPIC' +- ;; +- ecpc* ) +- # old Intel C++ for x86_64 which still supported -KPIC. +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-static' +- ;; +- icpc* ) +- # Intel C++, used to be incompatible with GCC. +- # ICC 10 doesn't accept -KPIC any more. +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-fPIC' +- lt_prog_compiler_static_CXX='-static' +- ;; +- pgCC* | pgcpp*) +- # Portland Group C++ compiler +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-fpic' +- lt_prog_compiler_static_CXX='-Bstatic' +- ;; +- cxx*) +- # Compaq C++ +- # Make sure the PIC flag is empty. It appears that all Alpha +- # Linux and Compaq Tru64 Unix objects are PIC. +- lt_prog_compiler_pic_CXX= +- lt_prog_compiler_static_CXX='-non_shared' +- ;; +- xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) +- # IBM XL 8.0, 9.0 on PPC and BlueGene +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-qpic' +- lt_prog_compiler_static_CXX='-qstaticlink' +- ;; +- *) +- case `$CC -V 2>&1 | sed 5q` in +- *Sun\ C*) +- # Sun C++ 5.9 +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-Bstatic' +- lt_prog_compiler_wl_CXX='-Qoption ld ' +- ;; +- esac +- ;; +- esac +- ;; +- lynxos*) +- ;; +- m88k*) +- ;; +- mvs*) +- case $cc_basename in +- cxx*) +- lt_prog_compiler_pic_CXX='-W c,exportall' +- ;; +- *) +- ;; +- esac +- ;; +- netbsd* | netbsdelf*-gnu) +- ;; +- *qnx* | *nto*) +- # QNX uses GNU C++, but need to define -shared option too, otherwise +- # it will coredump. +- lt_prog_compiler_pic_CXX='-fPIC -shared' +- ;; +- osf3* | osf4* | osf5*) +- case $cc_basename in +- KCC*) +- lt_prog_compiler_wl_CXX='--backend -Wl,' +- ;; +- RCC*) +- # Rational C++ 2.4.1 +- lt_prog_compiler_pic_CXX='-pic' +- ;; +- cxx*) +- # Digital/Compaq C++ +- lt_prog_compiler_wl_CXX='-Wl,' +- # Make sure the PIC flag is empty. It appears that all Alpha +- # Linux and Compaq Tru64 Unix objects are PIC. +- lt_prog_compiler_pic_CXX= +- lt_prog_compiler_static_CXX='-non_shared' +- ;; +- *) +- ;; +- esac +- ;; +- psos*) +- ;; +- solaris*) +- case $cc_basename in +- CC* | sunCC*) +- # Sun C++ 4.2, 5.x and Centerline C++ +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-Bstatic' +- lt_prog_compiler_wl_CXX='-Qoption ld ' +- ;; +- gcx*) +- # Green Hills C++ Compiler +- lt_prog_compiler_pic_CXX='-PIC' +- ;; +- *) +- ;; +- esac +- ;; +- sunos4*) +- case $cc_basename in +- CC*) +- # Sun C++ 4.x +- lt_prog_compiler_pic_CXX='-pic' +- lt_prog_compiler_static_CXX='-Bstatic' +- ;; +- lcc*) +- # Lucid +- lt_prog_compiler_pic_CXX='-pic' +- ;; +- *) +- ;; +- esac +- ;; +- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) +- case $cc_basename in +- CC*) +- lt_prog_compiler_wl_CXX='-Wl,' +- lt_prog_compiler_pic_CXX='-KPIC' +- lt_prog_compiler_static_CXX='-Bstatic' +- ;; +- esac +- ;; +- tandem*) +- case $cc_basename in +- NCC*) +- # NonStop-UX NCC 3.20 +- lt_prog_compiler_pic_CXX='-KPIC' +- ;; +- *) +- ;; +- esac +- ;; +- vxworks*) +- ;; +- *) +- lt_prog_compiler_can_build_shared_CXX=no +- ;; +- esac +- fi +- +-case $host_os in +- # For platforms which do not support PIC, -DPIC is meaningless: +- *djgpp*) +- lt_prog_compiler_pic_CXX= +- ;; +- *) +- lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" +- ;; +-esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +-$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +-if ${lt_cv_prog_compiler_pic_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +-lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX +- +-# +-# Check to make sure the PIC flag actually works. +-# +-if test -n "$lt_prog_compiler_pic_CXX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +-if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_pic_works_CXX=no +- ac_outfile=conftest.$ac_objext +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_pic_works_CXX=yes +- fi +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } +- +-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then +- case $lt_prog_compiler_pic_CXX in +- "" | " "*) ;; +- *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; +- esac +-else +- lt_prog_compiler_pic_CXX= +- lt_prog_compiler_can_build_shared_CXX=no +-fi +- +-fi +- +- +- +- +- +-# +-# Check to make sure the static flag actually works. +-# +-wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +-if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_static_works_CXX=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $lt_tmp_static_flag" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&5 +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_static_works_CXX=yes +- fi +- else +- lt_cv_prog_compiler_static_works_CXX=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } +- +-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then +- : +-else +- lt_prog_compiler_static_CXX= +-fi +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o_CXX=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o_CXX=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +-if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_prog_compiler_c_o_CXX=no +- $RM -r conftest 2>/dev/null +- mkdir conftest +- cd conftest +- mkdir out +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- lt_compiler_flag="-o out/conftest2.$ac_objext" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) +- (eval "$lt_compile" 2>out/conftest.err) +- ac_status=$? +- cat out/conftest.err >&5 +- echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- if (exit $ac_status) && test -s out/conftest2.$ac_objext +- then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp +- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 +- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then +- lt_cv_prog_compiler_c_o_CXX=yes +- fi +- fi +- chmod u+w . 2>&5 +- $RM conftest* +- # SGI C++ compiler will create directory out/ii_files/ for +- # template instantiation +- test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files +- $RM out/* && rmdir out +- cd .. +- $RM -r conftest +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +-$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } +- +- +- +- +-hard_links="nottested" +-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then +- # do not overwrite the value of need_locks provided by the user +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +-$as_echo_n "checking if we can lock with hard links... " >&6; } +- hard_links=yes +- $RM conftest* +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- touch conftest.a +- ln conftest.a conftest.b 2>&5 || hard_links=no +- ln conftest.a conftest.b 2>/dev/null && hard_links=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +-$as_echo "$hard_links" >&6; } +- if test "$hard_links" = no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} +- need_locks=warn +- fi +-else +- need_locks=no +-fi +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +- +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' +- case $host_os in +- aix[4-9]*) +- # If we're using GNU nm, then we don't want the "-C" option. +- # -C means demangle to AIX nm, but means don't demangle with GNU nm +- # Also, AIX nm treats weak defined symbols like other global defined +- # symbols, whereas GNU nm marks them as "W". +- if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then +- export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- else +- export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' +- fi +- ;; +- pw32*) +- export_symbols_cmds_CXX="$ltdll_cmds" +- ;; +- cygwin* | mingw* | cegcc*) +- case $cc_basename in +- cl*) +- exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' +- ;; +- *) +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' +- exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' +- ;; +- esac +- ;; +- linux* | k*bsd*-gnu | gnu*) +- link_all_deplibs_CXX=no +- ;; +- *) +- export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' +- ;; +- esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +-$as_echo "$ld_shlibs_CXX" >&6; } +-test "$ld_shlibs_CXX" = no && can_build_shared=no +- +-with_gnu_ld_CXX=$with_gnu_ld +- +- +- +- +- +- +-# +-# Do we need to explicitly link libc? +-# +-case "x$archive_cmds_need_lc_CXX" in +-x|xyes) +- # Assume -lc should be added +- archive_cmds_need_lc_CXX=yes +- +- if test "$enable_shared" = yes && test "$GCC" = yes; then +- case $archive_cmds_CXX in +- *'~'*) +- # FIXME: we may have to deal with multi-command sequences. +- ;; +- '$CC '*) +- # Test whether the compiler implicitly links with -lc since on some +- # systems, -lgcc has to come before -lc. If gcc already passes -lc +- # to ld, don't add -lc before -lgcc. +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +-if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- $RM conftest* +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 +- (eval $ac_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } 2>conftest.err; then +- soname=conftest +- lib=conftest +- libobjs=conftest.$ac_objext +- deplibs= +- wl=$lt_prog_compiler_wl_CXX +- pic_flag=$lt_prog_compiler_pic_CXX +- compiler_flags=-v +- linker_flags=-v +- verstring= +- output_objdir=. +- libname=conftest +- lt_save_allow_undefined_flag=$allow_undefined_flag_CXX +- allow_undefined_flag_CXX= +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 +- (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +- then +- lt_cv_archive_cmds_need_lc_CXX=no +- else +- lt_cv_archive_cmds_need_lc_CXX=yes +- fi +- allow_undefined_flag_CXX=$lt_save_allow_undefined_flag +- else +- cat conftest.err 1>&5 +- fi +- $RM conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +-$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } +- archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX +- ;; +- esac +- fi +- ;; +-esac +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +-$as_echo_n "checking dynamic linker characteristics... " >&6; } +- +-library_names_spec= +-libname_spec='lib$name' +-soname_spec= +-shrext_cmds=".so" +-postinstall_cmds= +-postuninstall_cmds= +-finish_cmds= +-finish_eval= +-shlibpath_var= +-shlibpath_overrides_runpath=unknown +-version_type=none +-dynamic_linker="$host_os ld.so" +-sys_lib_dlsearch_path_spec="/lib /usr/lib" +-need_lib_prefix=unknown +-hardcode_into_libs=no +- +-# when you set need_version to no, make sure it does not cause -set_version +-# flags to be left without arguments +-need_version=unknown +- +-case $host_os in +-aix3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' +- shlibpath_var=LIBPATH +- +- # AIX 3 has no versioning support, so we append a major version to the name. +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- +-aix[4-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- hardcode_into_libs=yes +- if test "$host_cpu" = ia64; then +- # AIX 5 supports IA64 +- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- else +- # With GCC up to 2.95.x, collect2 would create an import file +- # for dependence libraries. The import file would start with +- # the line `#! .'. This would cause the generated library to +- # depend on `.', always an invalid library. This was fixed in +- # development snapshots of GCC prior to 3.0. +- case $host_os in +- aix4 | aix4.[01] | aix4.[01].*) +- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' +- echo ' yes ' +- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then +- : +- else +- can_build_shared=no +- fi +- ;; +- esac +- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct +- # soname into executable. Probably we can add versioning support to +- # collect2, so additional links can be useful in future. +- if test "$aix_use_runtimelinking" = yes; then +- # If using run time linking (on AIX 4.2 or later) use lib.so +- # instead of lib.a to let people know that these are not +- # typical AIX shared libraries. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- else +- # We preserve .a as extension for shared libraries through AIX4.2 +- # and later when we are not doing run time linking. +- library_names_spec='${libname}${release}.a $libname.a' +- soname_spec='${libname}${release}${shared_ext}$major' +- fi +- shlibpath_var=LIBPATH +- fi +- ;; +- +-amigaos*) +- case $host_cpu in +- powerpc) +- # Since July 2007 AmigaOS4 officially supports .so libraries. +- # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- ;; +- m68k) +- library_names_spec='$libname.ixlibrary $libname.a' +- # Create ${libname}_ixlibrary.a entries in /sys/libs. +- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' +- ;; +- esac +- ;; +- +-beos*) +- library_names_spec='${libname}${shared_ext}' +- dynamic_linker="$host_os ld.so" +- shlibpath_var=LIBRARY_PATH +- ;; +- +-bsdi[45]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" +- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" +- # the default ld.so.conf also contains /usr/contrib/lib and +- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow +- # libtool to hard-code these into programs +- ;; +- +-cygwin* | mingw* | pw32* | cegcc*) +- version_type=windows +- shrext_cmds=".dll" +- need_version=no +- need_lib_prefix=no +- +- case $GCC,$cc_basename in +- yes,*) +- # gcc +- library_names_spec='$libname.dll.a' +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname~ +- chmod a+x \$dldir/$dlname~ +- if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then +- eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; +- fi' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- +- case $host_os in +- cygwin*) +- # Cygwin DLLs use 'cyg' prefix rather than 'lib' +- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- +- ;; +- mingw* | cegcc*) +- # MinGW DLLs use traditional 'lib' prefix +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- pw32*) +- # pw32 DLLs use 'pw' prefix rather than 'lib' +- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- ;; +- esac +- dynamic_linker='Win32 ld.exe' +- ;; +- +- *,cl*) +- # Native MSVC +- libname_spec='$name' +- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' +- library_names_spec='${libname}.dll.lib' +- +- case $build_os in +- mingw*) +- sys_lib_search_path_spec= +- lt_save_ifs=$IFS +- IFS=';' +- for lt_path in $LIB +- do +- IFS=$lt_save_ifs +- # Let DOS variable expansion print the short 8.3 style file name. +- lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` +- sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" +- done +- IFS=$lt_save_ifs +- # Convert to MSYS style. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` +- ;; +- cygwin*) +- # Convert to unix form, then to dos form, then back to unix form +- # but this time dos style (no spaces!) so that the unix form looks +- # like /cygdrive/c/PROGRA~1:/cygdr... +- sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` +- sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` +- sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- ;; +- *) +- sys_lib_search_path_spec="$LIB" +- if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then +- # It is most probably a Windows format PATH. +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` +- else +- sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` +- fi +- # FIXME: find the short name or the path components, as spaces are +- # common. (e.g. "Program Files" -> "PROGRA~1") +- ;; +- esac +- +- # DLL is installed to $(libdir)/../bin by postinstall_cmds +- postinstall_cmds='base_file=`basename \${file}`~ +- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ +- dldir=$destdir/`dirname \$dlpath`~ +- test -d \$dldir || mkdir -p \$dldir~ +- $install_prog $dir/$dlname \$dldir/$dlname' +- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ +- dlpath=$dir/\$dldll~ +- $RM \$dlpath' +- shlibpath_overrides_runpath=yes +- dynamic_linker='Win32 link.exe' +- ;; +- +- *) +- # Assume MSVC wrapper +- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' +- dynamic_linker='Win32 ld.exe' +- ;; +- esac +- # FIXME: first we should search . and the directory the executable is in +- shlibpath_var=PATH +- ;; +- +-darwin* | rhapsody*) +- dynamic_linker="$host_os dyld" +- version_type=darwin +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' +- soname_spec='${libname}${release}${major}$shared_ext' +- shlibpath_overrides_runpath=yes +- shlibpath_var=DYLD_LIBRARY_PATH +- shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +- +- sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' +- ;; +- +-dgux*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-freebsd* | dragonfly*) +- # DragonFly does not have aout. When/if they implement a new +- # versioning mechanism, adjust this. +- if test -x /usr/bin/objformat; then +- objformat=`/usr/bin/objformat` +- else +- case $host_os in +- freebsd[23].*) objformat=aout ;; +- *) objformat=elf ;; +- esac +- fi +- version_type=freebsd-$objformat +- case $version_type in +- freebsd-elf*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- need_version=no +- need_lib_prefix=no +- ;; +- freebsd-*) +- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' +- need_version=yes +- ;; +- esac +- shlibpath_var=LD_LIBRARY_PATH +- case $host_os in +- freebsd2.*) +- shlibpath_overrides_runpath=yes +- ;; +- freebsd3.[01]* | freebsdelf3.[01]*) +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ +- freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- *) # from 4.6 on, and DragonFly +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- esac +- ;; +- +-haiku*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- dynamic_linker="$host_os runtime_loader" +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' +- hardcode_into_libs=yes +- ;; +- +-hpux9* | hpux10* | hpux11*) +- # Give a soname corresponding to the major version so that dld.sl refuses to +- # link against other versions. +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- case $host_cpu in +- ia64*) +- shrext_cmds='.so' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.so" +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- if test "X$HPUX_IA64_MODE" = X32; then +- sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" +- else +- sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" +- fi +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- hppa*64*) +- shrext_cmds='.sl' +- hardcode_into_libs=yes +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH +- shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" +- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec +- ;; +- *) +- shrext_cmds='.sl' +- dynamic_linker="$host_os dld.sl" +- shlibpath_var=SHLIB_PATH +- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- ;; +- esac +- # HP-UX runs *really* slowly unless shared libraries are mode 555, ... +- postinstall_cmds='chmod 555 $lib' +- # or fails outright, so override atomically: +- install_override_mode=555 +- ;; +- +-interix[3-9]*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-irix5* | irix6* | nonstopux*) +- case $host_os in +- nonstopux*) version_type=nonstopux ;; +- *) +- if test "$lt_cv_prog_gnu_ld" = yes; then +- version_type=linux # correct to gnu/linux during the next big refactor +- else +- version_type=irix +- fi ;; +- esac +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' +- case $host_os in +- irix5* | nonstopux*) +- libsuff= shlibsuff= +- ;; +- *) +- case $LD in # libtool.m4 will add one of these switches to LD +- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") +- libsuff= shlibsuff= libmagic=32-bit;; +- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") +- libsuff=32 shlibsuff=N32 libmagic=N32;; +- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") +- libsuff=64 shlibsuff=64 libmagic=64-bit;; +- *) libsuff= shlibsuff= libmagic=never-match;; +- esac +- ;; +- esac +- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" +- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" +- hardcode_into_libs=yes +- ;; +- +-# No shared lib support for Linux oldld, aout, or coff. +-linux*oldld* | linux*aout* | linux*coff*) +- dynamic_linker=no +- ;; +- +-# This must be glibc/ELF. +-linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- +- # Some binutils ld are patched to set DT_RUNPATH +- if ${lt_cv_shlibpath_overrides_runpath+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- lt_cv_shlibpath_overrides_runpath=no +- save_LDFLAGS=$LDFLAGS +- save_libdir=$libdir +- eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ +- LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_cxx_try_link "$LINENO"; then : +- if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +- lt_cv_shlibpath_overrides_runpath=yes +-fi +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- LDFLAGS=$save_LDFLAGS +- libdir=$save_libdir +- +-fi +- +- shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath +- +- # This implies no fast_install, which is unacceptable. +- # Some rework will be needed to allow for fast_install +- # before this can be enabled. +- hardcode_into_libs=yes +- +- # Append ld.so.conf contents to the search path +- if test -f /etc/ld.so.conf; then +- lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` +- sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" +- fi +- +- # We used to test for /lib/ld.so.1 and disable shared libraries on +- # powerpc, because MkLinux only supported shared libraries with the +- # GNU dynamic linker. Since this was broken with cross compilers, +- # most powerpc-linux boxes support dynamic linking these days and +- # people can always --disable-shared, the test was removed, and we +- # assume the GNU/Linux dynamic linker is in use. +- dynamic_linker='GNU/Linux ld.so' +- ;; +- +-netbsdelf*-gnu) +- version_type=linux +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='NetBSD ld.elf_so' +- ;; +- +-netbsd*) +- version_type=sunos +- need_lib_prefix=no +- need_version=no +- if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- dynamic_linker='NetBSD (a.out) ld.so' +- else +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- dynamic_linker='NetBSD ld.elf_so' +- fi +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- ;; +- +-newsos6) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- ;; +- +-*nto* | *qnx*) +- version_type=qnx +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- dynamic_linker='ldqnx.so' +- ;; +- +-openbsd*) +- version_type=sunos +- sys_lib_dlsearch_path_spec="/usr/lib" +- need_lib_prefix=no +- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. +- case $host_os in +- openbsd3.3 | openbsd3.3.*) need_version=yes ;; +- *) need_version=no ;; +- esac +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +- case $host_os in +- openbsd2.[89] | openbsd2.[89].*) +- shlibpath_overrides_runpath=no +- ;; +- *) +- shlibpath_overrides_runpath=yes +- ;; +- esac +- else +- shlibpath_overrides_runpath=yes +- fi +- ;; +- +-os2*) +- libname_spec='$name' +- shrext_cmds=".dll" +- need_lib_prefix=no +- library_names_spec='$libname${shared_ext} $libname.a' +- dynamic_linker='OS/2 ld.exe' +- shlibpath_var=LIBPATH +- ;; +- +-osf3* | osf4* | osf5*) +- version_type=osf +- need_lib_prefix=no +- need_version=no +- soname_spec='${libname}${release}${shared_ext}$major' +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" +- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" +- ;; +- +-rdos*) +- dynamic_linker=no +- ;; +- +-solaris*) +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- # ldd complains unless libraries are executable +- postinstall_cmds='chmod +x $lib' +- ;; +- +-sunos4*) +- version_type=sunos +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' +- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- if test "$with_gnu_ld" = yes; then +- need_lib_prefix=no +- fi +- need_version=yes +- ;; +- +-sysv4 | sysv4.3*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- case $host_vendor in +- sni) +- shlibpath_overrides_runpath=no +- need_lib_prefix=no +- runpath_var=LD_RUN_PATH +- ;; +- siemens) +- need_lib_prefix=no +- ;; +- motorola) +- need_lib_prefix=no +- need_version=no +- shlibpath_overrides_runpath=no +- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' +- ;; +- esac +- ;; +- +-sysv4*MP*) +- if test -d /usr/nec ;then +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' +- soname_spec='$libname${shared_ext}.$major' +- shlibpath_var=LD_LIBRARY_PATH +- fi +- ;; +- +-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- version_type=freebsd-elf +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=yes +- hardcode_into_libs=yes +- if test "$with_gnu_ld" = yes; then +- sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' +- else +- sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' +- case $host_os in +- sco3.2v5*) +- sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" +- ;; +- esac +- fi +- sys_lib_dlsearch_path_spec='/usr/lib' +- ;; +- +-tpf*) +- # TPF is a cross-target only. Preferred cross-host = GNU/Linux. +- version_type=linux # correct to gnu/linux during the next big refactor +- need_lib_prefix=no +- need_version=no +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- shlibpath_var=LD_LIBRARY_PATH +- shlibpath_overrides_runpath=no +- hardcode_into_libs=yes +- ;; +- +-uts4*) +- version_type=linux # correct to gnu/linux during the next big refactor +- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' +- soname_spec='${libname}${release}${shared_ext}$major' +- shlibpath_var=LD_LIBRARY_PATH +- ;; +- +-*) +- dynamic_linker=no +- ;; +-esac +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +-$as_echo "$dynamic_linker" >&6; } +-test "$dynamic_linker" = no && can_build_shared=no +- +-variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +-if test "$GCC" = yes; then +- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +-fi +- +-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then +- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +-fi +-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then +- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +-fi +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +-$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +-hardcode_action_CXX= +-if test -n "$hardcode_libdir_flag_spec_CXX" || +- test -n "$runpath_var_CXX" || +- test "X$hardcode_automatic_CXX" = "Xyes" ; then +- +- # We can hardcode non-existent directories. +- if test "$hardcode_direct_CXX" != no && +- # If the only mechanism to avoid hardcoding is shlibpath_var, we +- # have to relink, otherwise we might link with an installed library +- # when we should be linking with a yet-to-be-installed one +- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && +- test "$hardcode_minus_L_CXX" != no; then +- # Linking always hardcodes the temporary library directory. +- hardcode_action_CXX=relink +- else +- # We can link without hardcoding, and we can hardcode nonexisting dirs. +- hardcode_action_CXX=immediate +- fi +-else +- # We cannot hardcode anything, or else we can only hardcode existing +- # directories. +- hardcode_action_CXX=unsupported +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +-$as_echo "$hardcode_action_CXX" >&6; } +- +-if test "$hardcode_action_CXX" = relink || +- test "$inherit_rpath_CXX" = yes; then +- # Fast installation is not supported +- enable_fast_install=no +-elif test "$shlibpath_overrides_runpath" = yes || +- test "$enable_shared" = no; then +- # Fast installation is not necessary +- enable_fast_install=needless +-fi +- +- +- +- +- +- +- +- fi # test -n "$compiler" +- +- CC=$lt_save_CC +- CFLAGS=$lt_save_CFLAGS +- LDCXX=$LD +- LD=$lt_save_LD +- GCC=$lt_save_GCC +- with_gnu_ld=$lt_save_with_gnu_ld +- lt_cv_path_LDCXX=$lt_cv_path_LD +- lt_cv_path_LD=$lt_save_path_LD +- lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +- lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +-fi # test "$_lt_caught_CXX_error" != yes +- +-ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ac_config_commands="$ac_config_commands libtool" +- +- +- +- +-# Only expand once: +- +- +- +-# Generate an error here if attempting to build both shared and static when +-# $libname.a is in $library_names_spec (as mentioned above), rather than +-# wait for ar or ld to fail. +-# +-if test "$enable_shared" = yes && test "$enable_static" = yes; then +- case $library_names_spec in +- *libname.a*) +- as_fn_error $? "cannot create both shared and static libraries on this system, --disable one of the two" "$LINENO" 5 +- ;; +- esac +-fi +- +- if test "$enable_static" = yes; then +- ENABLE_STATIC_TRUE= +- ENABLE_STATIC_FALSE='#' +-else +- ENABLE_STATIC_TRUE='#' +- ENABLE_STATIC_FALSE= +-fi +- +- +- +-# Many of these library and header checks are for the benefit of +-# supplementary programs. libgmp doesn't use anything too weird. +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +-$as_echo_n "checking for ANSI C header files... " >&6; } +-if ${ac_cv_header_stdc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +-#include +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_stdc=yes +-else +- ac_cv_header_stdc=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-if test $ac_cv_header_stdc = yes; then +- # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "memchr" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "free" >/dev/null 2>&1; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f conftest* +- +-fi +- +-if test $ac_cv_header_stdc = yes; then +- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +- if test "$cross_compiling" = yes; then : +- : +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#if ((' ' & 0x0FF) == 0x020) +-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +-#else +-# define ISLOWER(c) \ +- (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) +-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +-#endif +- +-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +-int +-main () +-{ +- int i; +- for (i = 0; i < 256; i++) +- if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) +- return 2; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- +-else +- ac_cv_header_stdc=no +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +-$as_echo "$ac_cv_header_stdc" >&6; } +-if test $ac_cv_header_stdc = yes; then +- +-$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 +-$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } +-if ${ac_cv_header_time+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +-#include +- +-int +-main () +-{ +-if ((struct tm *) 0) +-return 0; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_header_time=yes +-else +- ac_cv_header_time=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 +-$as_echo "$ac_cv_header_time" >&6; } +-if test $ac_cv_header_time = yes; then +- +-$as_echo "@%:@define TIME_WITH_SYS_TIME 1" >>confdefs.h +- +-fi +- +- +-# Reasons for testing: +-# float.h - not in SunOS bundled cc +-# invent.h - IRIX specific +-# langinfo.h - X/Open standard only, not in djgpp for instance +-# locale.h - old systems won't have this +-# nl_types.h - X/Open standard only, not in djgpp for instance +-# (usually langinfo.h gives nl_item etc, but not on netbsd 1.4.1) +-# sys/attributes.h - IRIX specific +-# sys/iograph.h - IRIX specific +-# sys/mman.h - not in Cray Unicos +-# sys/param.h - not in mingw +-# sys/processor.h - solaris specific, though also present in macos +-# sys/pstat.h - HPUX specific +-# sys/resource.h - not in mingw +-# sys/sysctl.h - not in mingw +-# sys/sysinfo.h - OSF specific +-# sys/syssgi.h - IRIX specific +-# sys/systemcfg.h - AIX specific +-# sys/time.h - autoconf suggests testing, don't know anywhere without it +-# sys/times.h - not in mingw +-# machine/hal_sysinfo.h - OSF specific +-# +-# inttypes.h, stdint.h, unistd.h and sys/types.h are already in the autoconf +-# default tests +-# +-for ac_header in fcntl.h float.h invent.h langinfo.h locale.h nl_types.h sys/attributes.h sys/iograph.h sys/mman.h sys/param.h sys/processor.h sys/pstat.h sys/sysinfo.h sys/syssgi.h sys/systemcfg.h sys/time.h sys/times.h +-do : +- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +-_ACEOF +- +-fi +- +-done +- +- +-# On SunOS, sys/resource.h needs sys/time.h (for struct timeval) +-for ac_header in sys/resource.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "#if TIME_WITH_SYS_TIME +-# include +-# include +-#else +-# if HAVE_SYS_TIME_H +-# include +-# else +-# include +-# endif +-#endif +-" +-if test "x$ac_cv_header_sys_resource_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SYS_RESOURCE_H 1 +-_ACEOF +- +-fi +- +-done +- +- +-# On NetBSD and OpenBSD, sys/sysctl.h needs sys/param.h for various constants +-for ac_header in sys/sysctl.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "#if HAVE_SYS_PARAM_H +-# include +-#endif +-" +-if test "x$ac_cv_header_sys_sysctl_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SYS_SYSCTL_H 1 +-_ACEOF +- +-fi +- +-done +- +- +-# On OSF 4.0, must have for ulong_t +-for ac_header in machine/hal_sysinfo.h +-do : +- ac_fn_c_check_header_compile "$LINENO" "machine/hal_sysinfo.h" "ac_cv_header_machine_hal_sysinfo_h" "#if HAVE_SYS_SYSINFO_H +-# include +-#endif +-" +-if test "x$ac_cv_header_machine_hal_sysinfo_h" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_MACHINE_HAL_SYSINFO_H 1 +-_ACEOF +- +-fi +- +-done +- +- +-# Reasons for testing: +-# optarg - not declared in mingw +-# fgetc, fscanf, ungetc, vfprintf - not declared in SunOS 4 +-# sys_errlist, sys_nerr - not declared in SunOS 4 +-# +-# optarg should be in unistd.h and the rest in stdio.h, both of which are +-# in the autoconf default includes. +-# +-# sys_errlist and sys_nerr are supposed to be in on SunOS according +-# to the man page (but aren't), in glibc they're in stdio.h. +-# +-ac_fn_c_check_decl "$LINENO" "fgetc" "ac_cv_have_decl_fgetc" "$ac_includes_default" +-if test "x$ac_cv_have_decl_fgetc" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_FGETC $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "fscanf" "ac_cv_have_decl_fscanf" "$ac_includes_default" +-if test "x$ac_cv_have_decl_fscanf" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_FSCANF $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "optarg" "ac_cv_have_decl_optarg" "$ac_includes_default" +-if test "x$ac_cv_have_decl_optarg" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_OPTARG $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "ungetc" "ac_cv_have_decl_ungetc" "$ac_includes_default" +-if test "x$ac_cv_have_decl_ungetc" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_UNGETC $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "vfprintf" "ac_cv_have_decl_vfprintf" "$ac_includes_default" +-if test "x$ac_cv_have_decl_vfprintf" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_VFPRINTF $ac_have_decl +-_ACEOF +- +-ac_fn_c_check_decl "$LINENO" "sys_errlist" "ac_cv_have_decl_sys_errlist" "#include +-#include +-" +-if test "x$ac_cv_have_decl_sys_errlist" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_SYS_ERRLIST $ac_have_decl +-_ACEOF +-ac_fn_c_check_decl "$LINENO" "sys_nerr" "ac_cv_have_decl_sys_nerr" "#include +-#include +-" +-if test "x$ac_cv_have_decl_sys_nerr" = xyes; then : +- ac_have_decl=1 +-else +- ac_have_decl=0 +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_DECL_SYS_NERR $ac_have_decl +-_ACEOF +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +-$as_echo_n "checking return type of signal handlers... " >&6; } +-if ${ac_cv_type_signal+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#include +- +-int +-main () +-{ +-return *(signal (0, 0)) (0) == 1; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_type_signal=int +-else +- ac_cv_type_signal=void +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +-$as_echo "$ac_cv_type_signal" >&6; } +- +-cat >>confdefs.h <<_ACEOF +-@%:@define RETSIGTYPE $ac_cv_type_signal +-_ACEOF +- +- +- +-# Reasons for testing: +-# intmax_t - C99 +-# long double - not in the HP bundled K&R cc +-# long long - only in reasonably recent compilers +-# ptrdiff_t - seems to be everywhere, maybe don't need to check this +-# quad_t - BSD specific +-# uint_least32_t - C99 +-# +-# the default includes are sufficient for all these types +-# +-ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default" +-if test "x$ac_cv_type_intmax_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_INTMAX_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "long double" "ac_cv_type_long_double" "$ac_includes_default" +-if test "x$ac_cv_type_long_double" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_LONG_DOUBLE 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +-if test "x$ac_cv_type_long_long" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_LONG_LONG 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +-if test "x$ac_cv_type_ptrdiff_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_PTRDIFF_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "quad_t" "ac_cv_type_quad_t" "$ac_includes_default" +-if test "x$ac_cv_type_quad_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_QUAD_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "uint_least32_t" "ac_cv_type_uint_least32_t" "$ac_includes_default" +-if test "x$ac_cv_type_uint_least32_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_UINT_LEAST32_T 1 +-_ACEOF +- +- +-fi +-ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" +-if test "x$ac_cv_type_intptr_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_INTPTR_T 1 +-_ACEOF +- +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for preprocessor stringizing operator" >&5 +-$as_echo_n "checking for preprocessor stringizing operator... " >&6; } +-if ${ac_cv_c_stringize+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-@%:@define x(y) #y +- +-char *s = x(teststring); +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "@%:@teststring" >/dev/null 2>&1; then : +- ac_cv_c_stringize=no +-else +- ac_cv_c_stringize=yes +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stringize" >&5 +-$as_echo "$ac_cv_c_stringize" >&6; } +-if test $ac_cv_c_stringize = yes; then +- +-$as_echo "@%:@define HAVE_STRINGIZE 1" >>confdefs.h +- +-fi +- +- +-# FIXME: Really want #ifndef __cplusplus around the #define volatile +-# replacement autoconf gives, since volatile is always available in C++. +-# But we don't use it in C++ currently. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 +-$as_echo_n "checking for working volatile... " >&6; } +-if ${ac_cv_c_volatile+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-int +-main () +-{ +- +-volatile int x; +-int * volatile y = (int *) 0; +-return !x && !y; +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_volatile=yes +-else +- ac_cv_c_volatile=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 +-$as_echo "$ac_cv_c_volatile" >&6; } +-if test $ac_cv_c_volatile = no; then +- +-$as_echo "@%:@define volatile /**/" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 +-$as_echo_n "checking for C/C++ restrict keyword... " >&6; } +-if ${ac_cv_c_restrict+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_c_restrict=no +- # The order here caters to the fact that C++ does not require restrict. +- for ac_kw in __restrict __restrict__ _Restrict restrict; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-typedef int * int_ptr; +- int foo (int_ptr $ac_kw ip) { +- return ip[0]; +- } +-int +-main () +-{ +-int s[1]; +- int * $ac_kw t = s; +- t[0] = 0; +- return foo(t) +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_restrict=$ac_kw +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- test "$ac_cv_c_restrict" != no && break +- done +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 +-$as_echo "$ac_cv_c_restrict" >&6; } +- +- case $ac_cv_c_restrict in +- restrict) ;; +- no) $as_echo "@%:@define restrict /**/" >>confdefs.h +- ;; +- *) cat >>confdefs.h <<_ACEOF +-@%:@define restrict $ac_cv_c_restrict +-_ACEOF +- ;; +- esac +- +- +-# GMP_C_STDARG +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((const)) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((const)) works... " >&6; } +-if ${gmp_cv_c_attribute_const+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-int foo (int x) __attribute__ ((const)); +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- gmp_cv_c_attribute_const=yes +-else +- gmp_cv_c_attribute_const=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_const" >&5 +-$as_echo "$gmp_cv_c_attribute_const" >&6; } +-if test $gmp_cv_c_attribute_const = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_CONST 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((malloc)) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((malloc)) works... " >&6; } +-if ${gmp_cv_c_attribute_malloc+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep "attribute directive ignored" conftest.out >/dev/null; then +- gmp_cv_c_attribute_malloc=no +- else +- gmp_cv_c_attribute_malloc=yes +- fi +-else +- gmp_cv_c_attribute_malloc=no +-fi +-cat conftest.out >&5 +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_malloc" >&5 +-$as_echo "$gmp_cv_c_attribute_malloc" >&6; } +-if test $gmp_cv_c_attribute_malloc = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_MALLOC 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((mode (XX))) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((mode (XX))) works... " >&6; } +-if ${gmp_cv_c_attribute_mode+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-typedef int SItype __attribute__ ((mode (SI))); +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- gmp_cv_c_attribute_mode=yes +-else +- gmp_cv_c_attribute_mode=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_mode" >&5 +-$as_echo "$gmp_cv_c_attribute_mode" >&6; } +-if test $gmp_cv_c_attribute_mode = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_MODE 1" >>confdefs.h +- +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gcc __attribute__ ((noreturn)) works" >&5 +-$as_echo_n "checking whether gcc __attribute__ ((noreturn)) works... " >&6; } +-if ${gmp_cv_c_attribute_noreturn+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-void foo (int x) __attribute__ ((noreturn)); +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- gmp_cv_c_attribute_noreturn=yes +-else +- gmp_cv_c_attribute_noreturn=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_attribute_noreturn" >&5 +-$as_echo "$gmp_cv_c_attribute_noreturn" >&6; } +-if test $gmp_cv_c_attribute_noreturn = yes; then +- +-$as_echo "@%:@define HAVE_ATTRIBUTE_NORETURN 1" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +-$as_echo_n "checking for inline... " >&6; } +-if ${ac_cv_c_inline+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_c_inline=no +-for ac_kw in inline __inline__ __inline; do +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#ifndef __cplusplus +-typedef int foo_t; +-static $ac_kw foo_t static_foo () {return 0; } +-$ac_kw foo_t foo () {return 0; } +-#endif +- +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_inline=$ac_kw +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- test "$ac_cv_c_inline" != no && break +-done +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +-$as_echo "$ac_cv_c_inline" >&6; } +- +-case $ac_cv_c_inline in +- inline | yes) ;; +- *) +- case $ac_cv_c_inline in +- no) ac_val=;; +- *) ac_val=$ac_cv_c_inline;; +- esac +- cat >>confdefs.h <<_ACEOF +-#ifndef __cplusplus +-#define inline $ac_val +-#endif +-_ACEOF +- ;; +-esac +- +- +-case $ac_cv_c_inline in +-no) ;; +-*) +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#define __GMP_WITHIN_CONFIGURE_INLINE 1 +-#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include "$srcdir/gmp-h.in" +- +-#ifndef __GMP_EXTERN_INLINE +-die die die +-#endif +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- case $ac_cv_c_inline in +- yes) tmp_inline=inline ;; +- *) tmp_inline=$ac_cv_c_inline ;; +- esac +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gmp.h doesnt recognise compiler \"$tmp_inline\", inlines will be unavailable" >&5 +-$as_echo "$as_me: WARNING: gmp.h doesnt recognise compiler \"$tmp_inline\", inlines will be unavailable" >&2;} +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- ;; +-esac +- +- +-# from libtool +-LIBM= +-case $host in +-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) +- # These system don't have libm, or don't need it +- ;; +-*-ncr-sysv4.3*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 +-$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } +-if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lmw $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char _mwvalidcheckl (); +-int +-main () +-{ +-return _mwvalidcheckl (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_mw__mwvalidcheckl=yes +-else +- ac_cv_lib_mw__mwvalidcheckl=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 +-$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } +-if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : +- LIBM="-lmw" +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +-$as_echo_n "checking for cos in -lm... " >&6; } +-if ${ac_cv_lib_m_cos+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lm $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char cos (); +-int +-main () +-{ +-return cos (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_m_cos=yes +-else +- ac_cv_lib_m_cos=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +-$as_echo "$ac_cv_lib_m_cos" >&6; } +-if test "x$ac_cv_lib_m_cos" = xyes; then : +- LIBM="$LIBM -lm" +-fi +- +- ;; +-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +-$as_echo_n "checking for cos in -lm... " >&6; } +-if ${ac_cv_lib_m_cos+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lm $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char cos (); +-int +-main () +-{ +-return cos (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_m_cos=yes +-else +- ac_cv_lib_m_cos=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +-$as_echo "$ac_cv_lib_m_cos" >&6; } +-if test "x$ac_cv_lib_m_cos" = xyes; then : +- LIBM="-lm" +-fi +- +- ;; +-esac +- +- +- +- +-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +-# for constant arguments. Useless! +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 +-$as_echo_n "checking for working alloca.h... " >&6; } +-if ${gmp_cv_header_alloca+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-int +-main () +-{ +-char *p = (char *) alloca (2 * sizeof (int)); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- gmp_cv_header_alloca=yes +-else +- gmp_cv_header_alloca=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_header_alloca" >&5 +-$as_echo "$gmp_cv_header_alloca" >&6; } +-if test $gmp_cv_header_alloca = yes; then +- +-$as_echo "@%:@define HAVE_ALLOCA_H 1" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca (via gmp-impl.h)" >&5 +-$as_echo_n "checking for alloca (via gmp-impl.h)... " >&6; } +-if ${gmp_cv_func_alloca+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include "$srcdir/gmp-h.in" +- +-#include "$srcdir/gmp-impl.h" +- +-int +-main () +-{ +-char *p = (char *) alloca (1); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- gmp_cv_func_alloca=yes +-else +- gmp_cv_func_alloca=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_func_alloca" >&5 +-$as_echo "$gmp_cv_func_alloca" >&6; } +-if test $gmp_cv_func_alloca = yes; then +- +-$as_echo "@%:@define HAVE_ALLOCA 1" >>confdefs.h +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to allocate temporary memory" >&5 +-$as_echo_n "checking how to allocate temporary memory... " >&6; } +-if ${gmp_cv_option_alloca+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $enable_alloca in +- yes) +- gmp_cv_option_alloca=alloca +- ;; +- no) +- gmp_cv_option_alloca=malloc-reentrant +- ;; +- reentrant | notreentrant) +- case $gmp_cv_func_alloca in +- yes) gmp_cv_option_alloca=alloca ;; +- *) gmp_cv_option_alloca=malloc-$enable_alloca ;; +- esac +- ;; +- *) +- gmp_cv_option_alloca=$enable_alloca +- ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_option_alloca" >&5 +-$as_echo "$gmp_cv_option_alloca" >&6; } +- +- +- +-case $gmp_cv_option_alloca in +- alloca) +- if test $gmp_cv_func_alloca = no; then +- as_fn_error $? "--enable-alloca=alloca specified, but alloca not available" "$LINENO" 5 +- fi +- $as_echo "@%:@define WANT_TMP_ALLOCA 1" >>confdefs.h +- +- TAL_OBJECT=tal-reent$U.lo +- ;; +- malloc-reentrant) +- $as_echo "@%:@define WANT_TMP_REENTRANT 1" >>confdefs.h +- +- TAL_OBJECT=tal-reent$U.lo +- ;; +- malloc-notreentrant) +- $as_echo "@%:@define WANT_TMP_NOTREENTRANT 1" >>confdefs.h +- +- TAL_OBJECT=tal-notreent$U.lo +- ;; +- debug) +- $as_echo "@%:@define WANT_TMP_DEBUG 1" >>confdefs.h +- +- TAL_OBJECT=tal-debug$U.lo +- ;; +- *) +- # checks at the start of configure.in should protect us +- as_fn_error $? "unrecognised --enable-alloca=$gmp_cv_option_alloca" "$LINENO" 5 +- ;; +-esac +- +- +- +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +-#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include "$srcdir/gmp-h.in" +- +-#if ! _GMP_H_HAVE_FILE +-die die die +-#endif +- +-int +-main () +-{ +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gmp.h doesnt recognise , FILE prototypes will be unavailable" >&5 +-$as_echo "$as_me: WARNING: gmp.h doesnt recognise , FILE prototypes will be unavailable" >&2;} +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +-$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +-if ${ac_cv_c_bigendian+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_cv_c_bigendian=unknown +- # See if we're dealing with a universal compiler. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#ifndef __APPLE_CC__ +- not a universal capable compiler +- #endif +- typedef int dummy; +- +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- +- # Check for potential -arch flags. It is not universal unless +- # there are at least two -arch flags with different values. +- ac_arch= +- ac_prev= +- for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do +- if test -n "$ac_prev"; then +- case $ac_word in +- i?86 | x86_64 | ppc | ppc64) +- if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then +- ac_arch=$ac_word +- else +- ac_cv_c_bigendian=universal +- break +- fi +- ;; +- esac +- ac_prev= +- elif test "x$ac_word" = "x-arch"; then +- ac_prev=arch +- fi +- done +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- if test $ac_cv_c_bigendian = unknown; then +- # See if sys/param.h defines the BYTE_ORDER macro. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- #include +- +-int +-main () +-{ +-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ +- && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ +- && LITTLE_ENDIAN) +- bogus endian macros +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- # It does; now see whether it defined to BIG_ENDIAN or not. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- #include +- +-int +-main () +-{ +-#if BYTE_ORDER != BIG_ENDIAN +- not big endian +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_bigendian=yes +-else +- ac_cv_c_bigendian=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- fi +- if test $ac_cv_c_bigendian = unknown; then +- # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-int +-main () +-{ +-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) +- bogus endian macros +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- # It does; now see whether it defined to _BIG_ENDIAN or not. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- +-int +-main () +-{ +-#ifndef _BIG_ENDIAN +- not big endian +- #endif +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- ac_cv_c_bigendian=yes +-else +- ac_cv_c_bigendian=no +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- fi +- if test $ac_cv_c_bigendian = unknown; then +- # Compile a test program. +- if test "$cross_compiling" = yes; then : +- # Try to guess by grepping values from an object file. +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-short int ascii_mm[] = +- { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +- short int ascii_ii[] = +- { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +- int use_ascii (int i) { +- return ascii_mm[i] + ascii_ii[i]; +- } +- short int ebcdic_ii[] = +- { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +- short int ebcdic_mm[] = +- { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +- int use_ebcdic (int i) { +- return ebcdic_mm[i] + ebcdic_ii[i]; +- } +- extern int foo; +- +-int +-main () +-{ +-return use_ascii (foo) == use_ebcdic (foo); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_compile "$LINENO"; then : +- if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then +- ac_cv_c_bigendian=yes +- fi +- if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then +- if test "$ac_cv_c_bigendian" = unknown; then +- ac_cv_c_bigendian=no +- else +- # finding both strings is unlikely to happen, but who knows? +- ac_cv_c_bigendian=unknown +- fi +- fi +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-$ac_includes_default +-int +-main () +-{ +- +- /* Are we little or big endian? From Harbison&Steele. */ +- union +- { +- long int l; +- char c[sizeof (long int)]; +- } u; +- u.l = 1; +- return u.c[sizeof (long int) - 1] == 1; +- +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- ac_cv_c_bigendian=no +-else +- ac_cv_c_bigendian=yes +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +- fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +-$as_echo "$ac_cv_c_bigendian" >&6; } +- case $ac_cv_c_bigendian in #( +- yes) +- $as_echo "@%:@define HAVE_LIMB_BIG_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_LIMB_BIG_ENDIAN')" >> $gmp_tmpconfigm4p +-;; #( +- no) +- $as_echo "@%:@define HAVE_LIMB_LITTLE_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_LIMB_LITTLE_ENDIAN')" >> $gmp_tmpconfigm4p +- +- ;; #( +- universal) +- +-$as_echo "@%:@define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h +- +- ;; #( +- *) +- : ;; +- esac +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking format of \`double' floating point" >&5 +-$as_echo_n "checking format of \`double' floating point... " >&6; } +-if ${gmp_cv_c_double_format+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_c_double_format=unknown +-cat >conftest.c <<\EOF +-struct foo { +- char before[8]; +- double x; +- char after[8]; +-}; +-extern struct foo foo; +-struct foo foo = { +- { '\001', '\043', '\105', '\147', '\211', '\253', '\315', '\357' }, +- -123456789.0, +- { '\376', '\334', '\272', '\230', '\166', '\124', '\062', '\020' }, +-}; +-EOF +-gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&5 2>&1" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +-cat >conftest.awk <<\EOF +- +-BEGIN { +- found = 0 +-} +- +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 23; i++) +- got[i] = got[i+1]; +- got[23] = $f; +- +- # match the special begin and end sequences +- if (got[0] != "001") continue +- if (got[1] != "043") continue +- if (got[2] != "105") continue +- if (got[3] != "147") continue +- if (got[4] != "211") continue +- if (got[5] != "253") continue +- if (got[6] != "315") continue +- if (got[7] != "357") continue +- if (got[16] != "376") continue +- if (got[17] != "334") continue +- if (got[18] != "272") continue +- if (got[19] != "230") continue +- if (got[20] != "166") continue +- if (got[21] != "124") continue +- if (got[22] != "062") continue +- if (got[23] != "020") continue +- +- saw = " (" got[8] " " got[9] " " got[10] " " got[11] " " got[12] " " got[13] " " got[14] " " got[15] ")" +- +- if (got[8] == "000" && \ +- got[9] == "000" && \ +- got[10] == "000" && \ +- got[11] == "124" && \ +- got[12] == "064" && \ +- got[13] == "157" && \ +- got[14] == "235" && \ +- got[15] == "301") +- { +- print "IEEE little endian" +- found = 1 +- exit +- } +- +- # Little endian with the two 4-byte halves swapped, as used by ARM +- # when the chip is in little endian mode. +- # +- if (got[8] == "064" && \ +- got[9] == "157" && \ +- got[10] == "235" && \ +- got[11] == "301" && \ +- got[12] == "000" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "124") +- { +- print "IEEE little endian, swapped halves" +- found = 1 +- exit +- } +- +- # gcc 2.95.4 on one GNU/Linux ARM system was seen generating 000 in +- # the last byte, whereas 124 is correct. Not sure where the bug +- # actually lies, but a running program didn't seem to get a full +- # mantissa worth of working bits. +- # +- # We match this case explicitly so we can give a nice result message, +- # but we deliberately exclude it from the normal IEEE double setups +- # since it's too broken. +- # +- if (got[8] == "064" && \ +- got[9] == "157" && \ +- got[10] == "235" && \ +- got[11] == "301" && \ +- got[12] == "000" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "bad ARM software floats" +- found = 1 +- exit +- } +- +- if (got[8] == "301" && \ +- got[9] == "235" && \ +- got[10] == "157" && \ +- got[11] == "064" && \ +- got[12] == "124" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "IEEE big endian" +- found = 1 +- exit +- } +- +- if (got[8] == "353" && \ +- got[9] == "315" && \ +- got[10] == "242" && \ +- got[11] == "171" && \ +- got[12] == "000" && \ +- got[13] == "240" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "VAX D" +- found = 1 +- exit +- } +- +- if (got[8] == "275" && \ +- got[9] == "301" && \ +- got[10] == "064" && \ +- got[11] == "157" && \ +- got[12] == "000" && \ +- got[13] == "124" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "VAX G" +- found = 1 +- exit +- } +- +- if (got[8] == "300" && \ +- got[9] == "033" && \ +- got[10] == "353" && \ +- got[11] == "171" && \ +- got[12] == "242" && \ +- got[13] == "240" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "Cray CFP" +- found = 1 +- exit +- } +- } +-} +- +-END { +- if (! found) +- print "unknown", saw +-} +- +-EOF +- gmp_cv_c_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` +- case $gmp_cv_c_double_format in +- unknown*) +- echo "cannot match anything, conftest.$OBJEXT contains" >&5 +- od -b conftest.$OBJEXT >&5 +- ;; +- esac +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: oops, cannot compile test program" >&5 +-$as_echo "$as_me: WARNING: oops, cannot compile test program" >&2;} +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_c_double_format" >&5 +-$as_echo "$gmp_cv_c_double_format" >&6; } +- +- +- +-case $gmp_cv_c_double_format in +- "IEEE big endian") +- $as_echo "@%:@define HAVE_DOUBLE_IEEE_BIG_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_DOUBLE_IEEE_BIG_ENDIAN')" >> $gmp_tmpconfigm4p +- +- ;; +- "IEEE little endian") +- $as_echo "@%:@define HAVE_DOUBLE_IEEE_LITTLE_ENDIAN 1" >>confdefs.h +- +- +-echo "define_not_for_expansion(\`HAVE_DOUBLE_IEEE_LITTLE_ENDIAN')" >> $gmp_tmpconfigm4p +- +- ;; +- "IEEE little endian, swapped halves") +- $as_echo "@%:@define HAVE_DOUBLE_IEEE_LITTLE_SWAPPED 1" >>confdefs.h +- ;; +- "VAX D") +- $as_echo "@%:@define HAVE_DOUBLE_VAX_D 1" >>confdefs.h +- ;; +- "VAX G") +- $as_echo "@%:@define HAVE_DOUBLE_VAX_G 1" >>confdefs.h +- ;; +- "Cray CFP") +- $as_echo "@%:@define HAVE_DOUBLE_CRAY_CFP 1" >>confdefs.h +- ;; +- "bad ARM software floats") +- ;; +- unknown*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not determine float format." >&5 +-$as_echo "$as_me: WARNING: Could not determine float format." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Conversions to and from \"double\" may be slow." >&5 +-$as_echo "$as_me: WARNING: Conversions to and from \"double\" may be slow." >&2;} +- ;; +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: oops, unrecognised float format: $gmp_cv_c_double_format" >&5 +-$as_echo "$as_me: WARNING: oops, unrecognised float format: $gmp_cv_c_double_format" >&2;} +- ;; +-esac +- +- +- +-# Reasons for testing: +-# alarm - not in mingw +-# attr_get - IRIX specific +-# clock_gettime - not in glibc 2.2.4, only very recent systems +-# cputime - not in glibc +-# getsysinfo - OSF specific +-# getrusage - not in mingw +-# gettimeofday - not in mingw +-# mmap - not in mingw, djgpp +-# nl_langinfo - X/Open standard only, not in djgpp for instance +-# obstack_vprintf - glibc specific +-# processor_info - solaris specific +-# pstat_getprocessor - HPUX specific (10.x and up) +-# raise - an ANSI-ism, though probably almost universal by now +-# read_real_time - AIX specific +-# sigaction - not in mingw +-# sigaltstack - not in mingw, or old AIX (reputedly) +-# sigstack - not in mingw +-# strerror - not in SunOS +-# strnlen - glibc extension (some other systems too) +-# syssgi - IRIX specific +-# times - not in mingw +-# +-# AC_FUNC_STRNLEN is not used because we don't want the AC_LIBOBJ +-# replacement setups it gives. It detects a faulty strnlen on AIX, but +-# missing out on that test is ok since our only use of strnlen is in +-# __gmp_replacement_vsnprintf which is not required on AIX since it has a +-# vsnprintf. +-# +-for ac_func in alarm attr_get clock cputime getpagesize getrusage gettimeofday getsysinfo localeconv memset mmap mprotect nl_langinfo obstack_vprintf popen processor_info pstat_getprocessor raise read_real_time sigaction sigaltstack sigstack syssgi strchr strerror strnlen strtol strtoul sysconf sysctl sysctlbyname times +-do : +- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +-if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +-_ACEOF +- +-fi +-done +- +- +-# clock_gettime is in librt on *-*-osf5.1 and on glibc, so att -lrt to +-# TUNE_LIBS if needed. On linux (tested on x86_32, 2.6.26), +-# clock_getres reports ns accuracy, while in a quick test on osf +-# clock_getres said only 1 millisecond. +- +-old_LIBS="$LIBS" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +-$as_echo_n "checking for library containing clock_gettime... " >&6; } +-if ${ac_cv_search_clock_gettime+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_func_search_save_LIBS=$LIBS +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char clock_gettime (); +-int +-main () +-{ +-return clock_gettime (); +- ; +- return 0; +-} +-_ACEOF +-for ac_lib in '' rt; do +- if test -z "$ac_lib"; then +- ac_res="none required" +- else +- ac_res=-l$ac_lib +- LIBS="-l$ac_lib $ac_func_search_save_LIBS" +- fi +- if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_search_clock_gettime=$ac_res +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext +- if ${ac_cv_search_clock_gettime+:} false; then : +- break +-fi +-done +-if ${ac_cv_search_clock_gettime+:} false; then : +- +-else +- ac_cv_search_clock_gettime=no +-fi +-rm conftest.$ac_ext +-LIBS=$ac_func_search_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +-$as_echo "$ac_cv_search_clock_gettime" >&6; } +-ac_res=$ac_cv_search_clock_gettime +-if test "$ac_res" != no; then : +- test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" +- +- +-$as_echo "@%:@define HAVE_CLOCK_GETTIME 1" >>confdefs.h +- +-fi +- +-TUNE_LIBS="$LIBS" +-LIBS="$old_LIBS" +- +- +- +-ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +-if test "x$ac_cv_func_vsnprintf" = xyes; then : +- gmp_vsnprintf_exists=yes +-else +- gmp_vsnprintf_exists=no +-fi +- +-if test "$gmp_vsnprintf_exists" = no; then +- gmp_cv_func_vsnprintf=no +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf works" >&5 +-$as_echo_n "checking whether vsnprintf works... " >&6; } +-if ${gmp_cv_func_vsnprintf+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_func_vsnprintf=yes +- for i in 'return check ("hello world");' 'int n; return check ("%nhello world", &n);'; do +- if test "$cross_compiling" = yes; then : +- gmp_cv_func_vsnprintf=probably; break +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-#include /* for strcmp */ +-#include /* for vsnprintf */ +- +-#include +- +-int +-check (const char *fmt, ...) +-{ +- static char buf[128]; +- va_list ap; +- int ret; +- +- va_start (ap, fmt); +- +- ret = vsnprintf (buf, 4, fmt, ap); +- +- if (strcmp (buf, "hel") != 0) +- return 1; +- +- /* allowed return values */ +- if (ret != -1 && ret != 3 && ret != 11) +- return 2; +- +- return 0; +-} +- +-int +-main () +-{ +-$i +-} +- +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- : +-else +- gmp_cv_func_vsnprintf=no; break +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi +- +- done +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_func_vsnprintf" >&5 +-$as_echo "$gmp_cv_func_vsnprintf" >&6; } +- if test "$gmp_cv_func_vsnprintf" = probably; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot check for properly working vsnprintf when cross compiling, will assume it's ok" >&5 +-$as_echo "$as_me: WARNING: cannot check for properly working vsnprintf when cross compiling, will assume it's ok" >&2;} +- fi +- if test "$gmp_cv_func_vsnprintf" != no; then +- +-$as_echo "@%:@define HAVE_VSNPRINTF 1" >>confdefs.h +- +- fi +-fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sscanf needs writable input" >&5 +-$as_echo_n "checking whether sscanf needs writable input... " >&6; } +-if ${gmp_cv_func_sscanf_writable_input+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-hpux9 | *-*-hpux9.*) +- gmp_cv_func_sscanf_writable_input=yes ;; +- *) gmp_cv_func_sscanf_writable_input=no ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_func_sscanf_writable_input" >&5 +-$as_echo "$gmp_cv_func_sscanf_writable_input" >&6; } +-case $gmp_cv_func_sscanf_writable_input in +- yes) +-$as_echo "@%:@define SSCANF_WRITABLE_INPUT 1" >>confdefs.h +- ;; +- no) ;; +- *) as_fn_error $? "unrecognised \$gmp_cv_func_sscanf_writable_input" "$LINENO" 5 ;; +-esac +- +- +-# Reasons for checking: +-# pst_processor psp_iticksperclktick - not in hpux 9 +-# +-ac_fn_c_check_member "$LINENO" "struct pst_processor" "psp_iticksperclktick" "ac_cv_member_struct_pst_processor_psp_iticksperclktick" "#include +-" +-if test "x$ac_cv_member_struct_pst_processor_psp_iticksperclktick" = xyes; then : +- +-$as_echo "@%:@define HAVE_PSP_ITICKSPERCLKTICK 1" >>confdefs.h +- +-fi +- +- +-# C++ tests, when required +-# +-if test $enable_cxx = yes; then +- ac_ext=cpp +-ac_cpp='$CXXCPP $CPPFLAGS' +-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +- +- +- # Reasons for testing: +- # - not in g++ 2.95.2 +- # std::locale - not in g++ 2.95.4 +- # +- +-for ac_header in sstream +-do : +- ac_fn_cxx_check_header_mongrel "$LINENO" "sstream" "ac_cv_header_sstream" "$ac_includes_default" +-if test "x$ac_cv_header_sstream" = xyes; then : +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_SSTREAM 1 +-_ACEOF +- +-fi +- +-done +- +- ac_fn_cxx_check_type "$LINENO" "std::locale" "ac_cv_type_std__locale" "#include +-" +-if test "x$ac_cv_type_std__locale" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_STD__LOCALE 1 +-_ACEOF +- +- +-fi +- +- +- ac_ext=c +-ac_cpp='$CPP $CPPFLAGS' +-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +-ac_compiler_gnu=$ac_cv_c_compiler_gnu +- +-fi +- +- +-# Pick the correct source files in $path and link them to mpn/. +-# $gmp_mpn_functions lists all functions we need. +-# +-# The rule is to find a file with the function name and a .asm, .S, +-# .s, or .c extension. Certain multi-function files with special names +-# can provide some functions too. (mpn/Makefile.am passes +-# -DOPERATION_ to get them to generate the right code.) +- +-# Note: $gmp_mpn_functions must have mod_1 before pre_mod_1 so the former +-# can optionally provide the latter as an extra entrypoint. Likewise +-# divrem_1 and pre_divrem_1. +- +-gmp_mpn_functions_optional="umul udiv \ +- invert_limb sqr_diagonal sqr_diag_addlsh1 \ +- mul_2 mul_3 mul_4 mul_5 mul_6 \ +- addmul_2 addmul_3 addmul_4 addmul_5 addmul_6 addmul_7 addmul_8 \ +- addlsh1_n sublsh1_n rsblsh1_n rsh1add_n rsh1sub_n \ +- addlsh2_n sublsh2_n rsblsh2_n \ +- addlsh_n sublsh_n rsblsh_n \ +- add_n_sub_n addaddmul_1msb0" +- +-gmp_mpn_functions="$extra_functions \ +- add add_1 add_n sub sub_1 sub_n cnd_add_n cnd_sub_n neg com \ +- mul_1 addmul_1 submul_1 \ +- add_err1_n add_err2_n add_err3_n sub_err1_n sub_err2_n sub_err3_n \ +- lshift rshift dive_1 diveby3 divis divrem divrem_1 divrem_2 \ +- fib2_ui mod_1 mod_34lsub1 mode1o pre_divrem_1 pre_mod_1 dump \ +- mod_1_1 mod_1_2 mod_1_3 mod_1_4 lshiftc \ +- mul mul_fft mul_n sqr mul_basecase sqr_basecase nussbaumer_mul \ +- mulmid_basecase toom42_mulmid mulmid_n mulmid \ +- random random2 pow_1 \ +- rootrem sqrtrem sizeinbase get_str set_str \ +- scan0 scan1 popcount hamdist cmp \ +- perfsqr perfpow \ +- gcd_1 gcd gcdext_1 gcdext gcd_subdiv_step \ +- gcdext_lehmer \ +- div_q tdiv_qr jacbase jacobi_2 jacobi get_d \ +- matrix22_mul matrix22_mul1_inverse_vector \ +- hgcd_matrix hgcd2 hgcd_step hgcd_reduce hgcd hgcd_appr \ +- hgcd2_jacobi hgcd_jacobi \ +- mullo_n mullo_basecase \ +- toom22_mul toom32_mul toom42_mul toom52_mul toom62_mul \ +- toom33_mul toom43_mul toom53_mul toom54_mul toom63_mul \ +- toom44_mul \ +- toom6h_mul toom6_sqr toom8h_mul toom8_sqr \ +- toom_couple_handling \ +- toom2_sqr toom3_sqr toom4_sqr \ +- toom_eval_dgr3_pm1 toom_eval_dgr3_pm2 \ +- toom_eval_pm1 toom_eval_pm2 toom_eval_pm2exp toom_eval_pm2rexp \ +- toom_interpolate_5pts toom_interpolate_6pts toom_interpolate_7pts \ +- toom_interpolate_8pts toom_interpolate_12pts toom_interpolate_16pts \ +- invertappr invert binvert mulmod_bnm1 sqrmod_bnm1 \ +- div_qr_1 div_qr_1n_pi1 \ +- div_qr_2 div_qr_2n_pi1 div_qr_2u_pi1 \ +- sbpi1_div_q sbpi1_div_qr sbpi1_divappr_q \ +- dcpi1_div_q dcpi1_div_qr dcpi1_divappr_q \ +- mu_div_qr mu_divappr_q mu_div_q \ +- bdiv_q_1 \ +- sbpi1_bdiv_q sbpi1_bdiv_qr \ +- dcpi1_bdiv_q dcpi1_bdiv_qr \ +- mu_bdiv_q mu_bdiv_qr \ +- bdiv_q bdiv_qr broot brootinv bsqrt bsqrtinv \ +- divexact bdiv_dbm1c redc_1 redc_2 redc_n powm powlo sec_powm \ +- sec_mul sec_sqr sec_div_qr sec_div_r sec_pi1_div_qr sec_pi1_div_r \ +- sec_add_1 sec_sub_1 sec_invert \ +- trialdiv remove \ +- and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n \ +- copyi copyd zero sec_tabselect \ +- comb_tables \ +- $gmp_mpn_functions_optional" +- +- +- +-# the list of all object files used by mpn/Makefile.in and the +-# top-level Makefile.in, respectively +-mpn_objects= +-mpn_objs_in_libgmp= +- +-# links from the sources, to be removed by "make distclean" +-gmp_srclinks= +- +- +-# mpn_relative_top_srcdir is $top_srcdir, but for use from within the mpn +-# build directory. If $srcdir is relative then we use a relative path too, +-# so the two trees can be moved together. +-case $srcdir in +- [\\/]* | ?:[\\/]*) # absolute, as per autoconf +- mpn_relative_top_srcdir=$srcdir ;; +- *) # relative +- mpn_relative_top_srcdir=../$srcdir ;; +-esac +- +- +- +- +- +- +-# Fat binary setups. +-# +-# We proceed through each $fat_path directory, and look for $fat_function +-# routines there. Those found are incorporated in the build by generating a +-# little mpn/.asm or mpn/.c file in the build directory, with +-# suitable function renaming, and adding that to $mpn_objects (the same as a +-# normal mpn file). +-# +-# fat.h is generated with macros to let internal calls to each $fat_function +-# go directly through __gmpn_cpuvec, plus macros and declarations helping to +-# setup that structure, on a per-directory basis ready for +-# mpn//fat/fat.c. +-# +-# fat.h includes thresholds listed in $fat_thresholds, extracted from +-# gmp-mparam.h in each directory. An overall maximum for each threshold is +-# established, for use in making fixed size arrays of temporary space. +-# (Eg. MUL_TOOM33_THRESHOLD_LIMIT used by mpn/generic/mul.c.) +-# +-# It'd be possible to do some of this manually, but when there's more than a +-# few functions and a few directories it becomes very tedious, and very +-# prone to having some routine accidentally omitted. On that basis it seems +-# best to automate as much as possible, even if the code to do so is a bit +-# ugly. +-# +- +-if test -n "$fat_path"; then +- # Usually the mpn build directory is created with mpn/Makefile +- # instantiation, but we want to write to it sooner. +- mkdir mpn 2>/dev/null +- +- echo "/* fat.h - setups for fat binaries." >fat.h +- echo " Generated by configure - DO NOT EDIT. */" >>fat.h +- +- +-$as_echo "@%:@define WANT_FAT_BINARY 1" >>confdefs.h +- +- +-echo 'define(, )' >>$gmp_tmpconfigm4 +- +- +- # Don't want normal copies of fat functions +- for tmp_fn in $fat_functions; do +- remove_from_list_tmp= +-for remove_from_list_i in $gmp_mpn_functions; do +- if test $remove_from_list_i = $tmp_fn; then :; +- else +- remove_from_list_tmp="$remove_from_list_tmp $remove_from_list_i" +- fi +-done +-gmp_mpn_functions=$remove_from_list_tmp +- +- remove_from_list_tmp= +-for remove_from_list_i in $gmp_mpn_functions_optional; do +- if test $remove_from_list_i = $tmp_fn; then :; +- else +- remove_from_list_tmp="$remove_from_list_tmp $remove_from_list_i" +- fi +-done +-gmp_mpn_functions_optional=$remove_from_list_tmp +- +- done +- +- for tmp_fn in $fat_functions; do +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- echo " +-#ifndef OPERATION_$tmp_fn +-#undef mpn_$tmp_fbase +-#define mpn_$tmp_fbase (*__gmpn_cpuvec.$tmp_fbase) +-#endif +-DECL_$tmp_fbase (__MPN(${tmp_fbase}_init));" >>fat.h +- # encourage various macros to use fat functions +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_NATIVE_mpn_$tmp_fbase 1 +-_ACEOF +- +- done +- +- echo "" >>fat.h +- echo "/* variable thresholds */" >>fat.h +- for tmp_tn in $fat_thresholds; do +- echo "#undef $tmp_tn" >>fat.h +- echo "#define $tmp_tn CPUVEC_THRESHOLD (`echo $tmp_tn | tr [A-Z] [a-z]`)" >>fat.h +- done +- +- echo " +-/* Copy all fields into __gmpn_cpuvec. +- memcpy is not used because it might operate byte-wise (depending on its +- implementation), and we need the function pointer writes to be atomic. +- "volatile" discourages the compiler from trying to optimize this. */ +-#define CPUVEC_INSTALL(vec) \\ +- do { \\ +- volatile struct cpuvec_t *p = &__gmpn_cpuvec; \\" >>fat.h +- for tmp_fn in $fat_functions; do +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- echo " p->$tmp_fbase = vec.$tmp_fbase; \\" >>fat.h +- done +- for tmp_tn in $fat_thresholds; do +- tmp_field_name=`echo $tmp_tn | tr [A-Z] [a-z]` +- echo " p->$tmp_field_name = vec.$tmp_field_name; \\" >>fat.h +- done +- echo " } while (0)" >>fat.h +- +- echo " +-/* A helper to check all fields are filled. */ +-#define ASSERT_CPUVEC(vec) \\ +- do { \\" >>fat.h +- for tmp_fn in $fat_functions; do +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- echo " ASSERT (vec.$tmp_fbase != NULL); \\" >>fat.h +- done +- for tmp_tn in $fat_thresholds; do +- tmp_field_name=`echo $tmp_tn | tr [A-Z] [a-z]` +- echo " ASSERT (vec.$tmp_field_name != 0); \\" >>fat.h +- done +- echo " } while (0)" >>fat.h +- +- echo " +-/* Call ITERATE(field) for each fat threshold field. */ +-#define ITERATE_FAT_THRESHOLDS() \\ +- do { \\" >>fat.h +- for tmp_tn in $fat_thresholds; do +- tmp_field_name=`echo $tmp_tn | tr [A-Z] [a-z]` +- echo " ITERATE ($tmp_tn, $tmp_field_name); \\" >>fat.h +- done +- echo " } while (0)" >>fat.h +- +- for tmp_dir in $fat_path; do +- CPUVEC_SETUP= +- THRESH_ASM_SETUP= +- echo "" >>fat.h +- tmp_suffix=`echo $tmp_dir | sed -e '/\//s:^[^/]*/::' -e 's:[\\/]:_:g'` +- +- # In order to keep names unique on a DOS 8.3 filesystem, use a prefix +- # (rather than a suffix) for the generated file names, and abbreviate. +- case $tmp_suffix in +- pentium) tmp_prefix=p ;; +- pentium_mmx) tmp_prefix=pm ;; +- p6_mmx) tmp_prefix=p2 ;; +- p6_p3mmx) tmp_prefix=p3 ;; +- pentium4) tmp_prefix=p4 ;; +- pentium4_mmx) tmp_prefix=p4m ;; +- pentium4_sse2) tmp_prefix=p4s ;; +- k6_mmx) tmp_prefix=k6m ;; +- k6_k62mmx) tmp_prefix=k62 ;; +- k7_mmx) tmp_prefix=k7m ;; +- *) tmp_prefix=$tmp_suffix ;; +- esac +- +- # Extract desired thresholds from gmp-mparam.h file in this directory, +- # if present. +- tmp_mparam=$srcdir/mpn/$tmp_dir/gmp-mparam.h +- if test -f $tmp_mparam; then +- for tmp_tn in $fat_thresholds; do +- tmp_thresh=`sed -n "s/^#define $tmp_tn[ ]*\\([0-9][0-9]*\\).*$/\\1/p" $tmp_mparam` +- if test -n "$tmp_thresh"; then +- THRESH_ASM_SETUP="${THRESH_ASM_SETUP}define($tmp_tn,$tmp_thresh) +-" +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.`echo $tmp_tn | tr [A-Z] [a-z]` = $tmp_thresh; \\ +-" +- eval tmp_limit=\$${tmp_tn}_LIMIT +- if test -z "$tmp_limit"; then +- tmp_limit=0 +- fi +- if test $tmp_thresh -gt $tmp_limit; then +- eval ${tmp_tn}_LIMIT=$tmp_thresh +- fi +- fi +- done +- fi +- +- for tmp_fn in $fat_functions; do +- # functions that can be provided by multi-function files +-tmp_mulfunc= +-case $tmp_fn in +- add_n|sub_n) tmp_mulfunc="aors_n" ;; +- add_err1_n|sub_err1_n) +- tmp_mulfunc="aors_err1_n" ;; +- add_err2_n|sub_err2_n) +- tmp_mulfunc="aors_err2_n" ;; +- add_err3_n|sub_err3_n) +- tmp_mulfunc="aors_err3_n" ;; +- cnd_add_n|cnd_sub_n) tmp_mulfunc="cnd_aors_n" ;; +- sec_add_1|sec_sub_1) tmp_mulfunc="sec_aors_1" ;; +- addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; +- mul_2|addmul_2) tmp_mulfunc="aormul_2" ;; +- mul_3|addmul_3) tmp_mulfunc="aormul_3" ;; +- mul_4|addmul_4) tmp_mulfunc="aormul_4" ;; +- popcount|hamdist) tmp_mulfunc="popham" ;; +- and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) +- tmp_mulfunc="logops_n" ;; +- lshift|rshift) tmp_mulfunc="lorrshift";; +- addlsh1_n) +- tmp_mulfunc="aorslsh1_n aorrlsh1_n aorsorrlsh1_n";; +- sublsh1_n) +- tmp_mulfunc="aorslsh1_n sorrlsh1_n aorsorrlsh1_n";; +- rsblsh1_n) +- tmp_mulfunc="aorrlsh1_n sorrlsh1_n aorsorrlsh1_n";; +- addlsh2_n) +- tmp_mulfunc="aorslsh2_n aorrlsh2_n aorsorrlsh2_n";; +- sublsh2_n) +- tmp_mulfunc="aorslsh2_n sorrlsh2_n aorsorrlsh2_n";; +- rsblsh2_n) +- tmp_mulfunc="aorrlsh2_n sorrlsh2_n aorsorrlsh2_n";; +- addlsh_n) +- tmp_mulfunc="aorslsh_n aorrlsh_n aorsorrlsh_n";; +- sublsh_n) +- tmp_mulfunc="aorslsh_n sorrlsh_n aorsorrlsh_n";; +- rsblsh_n) +- tmp_mulfunc="aorrlsh_n sorrlsh_n aorsorrlsh_n";; +- rsh1add_n|rsh1sub_n) +- tmp_mulfunc="rsh1aors_n";; +- sec_div_qr|sec_div_r) +- tmp_mulfunc="sec_div";; +- sec_pi1_div_qr|sec_pi1_div_r) +- tmp_mulfunc="sec_pi1_div";; +-esac +- +- +- for tmp_base in $tmp_fn $tmp_mulfunc; do +- for tmp_ext in asm S s c; do +- tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext +- if test -f $tmp_file; then +- +- # If the host uses a non-standard ABI, check if tmp_file supports it +- # +- if test -n "$GMP_NONSTD_ABI" && test $tmp_ext != "c"; then +- abi=`sed -n 's/^[ ]*ABI_SUPPORT(\(.*\))/\1/p' $tmp_file ` +- if echo "$abi" | grep -q "\\b${GMP_NONSTD_ABI}\\b"; then +- true +- else +- continue +- fi +- fi +- +- mpn_objects="$mpn_objects ${tmp_prefix}_$tmp_fn.lo" +- mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/${tmp_prefix}_$tmp_fn.lo" +- +- case $tmp_fn in +- dive_1) tmp_fbase=divexact_1 ;; +- diveby3) tmp_fbase=divexact_by3c ;; +- pre_divrem_1) tmp_fbase=preinv_divrem_1 ;; +- mode1o) tmp_fbase=modexact_1c_odd ;; +- pre_mod_1) tmp_fbase=preinv_mod_1 ;; +- mod_1_1) tmp_fbase=mod_1_1p ;; +- mod_1_1_cps) tmp_fbase=mod_1_1p_cps ;; +- mod_1_2) tmp_fbase=mod_1s_2p ;; +- mod_1_2_cps) tmp_fbase=mod_1s_2p_cps ;; +- mod_1_3) tmp_fbase=mod_1s_3p ;; +- mod_1_3_cps) tmp_fbase=mod_1s_3p_cps ;; +- mod_1_4) tmp_fbase=mod_1s_4p ;; +- mod_1_4_cps) tmp_fbase=mod_1s_4p_cps ;; +- *) tmp_fbase=$tmp_fn ;; +-esac +- +- +- # carry-in variant, eg. divrem_1c or modexact_1c_odd +- case $tmp_fbase in +- *_1*) tmp_fbasec=`echo $tmp_fbase | sed 's/_1/_1c/'` ;; +- *) tmp_fbasec=${tmp_fbase}c ;; +- esac +- +- # Create a little file doing an include from srcdir. The +- # OPERATION and renamings aren't all needed all the time, but +- # they don't hurt if unused. +- # +- # FIXME: Should generate these via config.status commands. +- # Would need them all in one AC_CONFIG_COMMANDS though, since +- # that macro doesn't accept a set of separate commands generated +- # by shell code. +- # +- case $tmp_ext in +- asm) +- # hide the d-n-l from autoconf's error checking +- tmp_d_n_l=d""nl +- echo "$tmp_d_n_l mpn_$tmp_fbase - from $tmp_dir directory for fat binary. +-$tmp_d_n_l Generated by configure - DO NOT EDIT. +- +-define(OPERATION_$tmp_fn) +-define(__gmpn_$tmp_fbase, __gmpn_${tmp_fbase}_$tmp_suffix) +-define(__gmpn_$tmp_fbasec,__gmpn_${tmp_fbasec}_${tmp_suffix}) +-define(__gmpn_preinv_${tmp_fbase},__gmpn_preinv_${tmp_fbase}_${tmp_suffix}) +-define(__gmpn_${tmp_fbase}_cps,__gmpn_${tmp_fbase}_cps_${tmp_suffix}) +- +-$tmp_d_n_l For k6 and k7 gcd_1 calling their corresponding mpn_modexact_1_odd +-ifdef(\`__gmpn_modexact_1_odd',, +-\`define(__gmpn_modexact_1_odd,__gmpn_modexact_1_odd_${tmp_suffix})') +- +-$THRESH_ASM_SETUP +-include($mpn_relative_top_srcdir/mpn/$tmp_dir/$tmp_base.asm) +-" >mpn/${tmp_prefix}_$tmp_fn.asm +- ;; +- c) +- echo "/* mpn_$tmp_fbase - from $tmp_dir directory for fat binary. +- Generated by configure - DO NOT EDIT. */ +- +-#define OPERATION_$tmp_fn 1 +-#define __gmpn_$tmp_fbase __gmpn_${tmp_fbase}_$tmp_suffix +-#define __gmpn_$tmp_fbasec __gmpn_${tmp_fbasec}_${tmp_suffix} +-#define __gmpn_preinv_${tmp_fbase} __gmpn_preinv_${tmp_fbase}_${tmp_suffix} +-#define __gmpn_${tmp_fbase}_cps __gmpn_${tmp_fbase}_cps_${tmp_suffix} +- +-#include \"$mpn_relative_top_srcdir/mpn/$tmp_dir/$tmp_base.c\" +-" >mpn/${tmp_prefix}_$tmp_fn.c +- ;; +- esac +- +- # Prototype, and append to CPUVEC_SETUP for this directory. +- echo "DECL_$tmp_fbase (__gmpn_${tmp_fbase}_$tmp_suffix);" >>fat.h +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.$tmp_fbase = __gmpn_${tmp_fbase}_${tmp_suffix}; \\ +-" +- # Ditto for any preinv variant (preinv_divrem_1, preinv_mod_1). +- if grep "^PROLOGUE(mpn_preinv_$tmp_fn)" $tmp_file >/dev/null; then +- echo "DECL_preinv_$tmp_fbase (__gmpn_preinv_${tmp_fbase}_$tmp_suffix);" >>fat.h +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.preinv_$tmp_fbase = __gmpn_preinv_${tmp_fbase}_${tmp_suffix}; \\ +-" +- fi +- +- # Ditto for any mod_1...cps variant +- if grep "^PROLOGUE(mpn_${tmp_fbase}_cps)" $tmp_file >/dev/null; then +- echo "DECL_${tmp_fbase}_cps (__gmpn_${tmp_fbase}_cps_$tmp_suffix);" >>fat.h +- CPUVEC_SETUP="$CPUVEC_SETUP decided_cpuvec.${tmp_fbase}_cps = __gmpn_${tmp_fbase}_cps_${tmp_suffix}; \\ +-" +- fi +- fi +- done +- done +- done +- +- # Emit CPUVEC_SETUP for this directory +- echo "" >>fat.h +- echo "#define CPUVEC_SETUP_$tmp_suffix \\" >>fat.h +- echo " do { \\" >>fat.h +- echo "$CPUVEC_SETUP } while (0)" >>fat.h +- done +- +- # Emit threshold limits +- echo "" >>fat.h +- for tmp_tn in $fat_thresholds; do +- eval tmp_limit=\$${tmp_tn}_LIMIT +- echo "#define ${tmp_tn}_LIMIT $tmp_limit" >>fat.h +- done +-fi +- +- +-# Normal binary setups. +-# +- +-for tmp_ext in asm S s c; do +- eval found_$tmp_ext=no +-done +- +-for tmp_fn in $gmp_mpn_functions; do +- for tmp_ext in asm S s c; do +- test "$no_create" = yes || rm -f mpn/$tmp_fn.$tmp_ext +- done +- +- # mpn_preinv_divrem_1 might have been provided by divrem_1.asm, likewise +- # mpn_preinv_mod_1 by mod_1.asm. +- case $tmp_fn in +- pre_divrem_1) +- if test "$HAVE_NATIVE_mpn_preinv_divrem_1" = yes; then continue; fi ;; +- pre_mod_1) +- if test "$HAVE_NATIVE_mpn_preinv_mod_1" = yes; then continue; fi ;; +- esac +- +- # functions that can be provided by multi-function files +-tmp_mulfunc= +-case $tmp_fn in +- add_n|sub_n) tmp_mulfunc="aors_n" ;; +- add_err1_n|sub_err1_n) +- tmp_mulfunc="aors_err1_n" ;; +- add_err2_n|sub_err2_n) +- tmp_mulfunc="aors_err2_n" ;; +- add_err3_n|sub_err3_n) +- tmp_mulfunc="aors_err3_n" ;; +- cnd_add_n|cnd_sub_n) tmp_mulfunc="cnd_aors_n" ;; +- sec_add_1|sec_sub_1) tmp_mulfunc="sec_aors_1" ;; +- addmul_1|submul_1) tmp_mulfunc="aorsmul_1" ;; +- mul_2|addmul_2) tmp_mulfunc="aormul_2" ;; +- mul_3|addmul_3) tmp_mulfunc="aormul_3" ;; +- mul_4|addmul_4) tmp_mulfunc="aormul_4" ;; +- popcount|hamdist) tmp_mulfunc="popham" ;; +- and_n|andn_n|nand_n | ior_n|iorn_n|nior_n | xor_n|xnor_n) +- tmp_mulfunc="logops_n" ;; +- lshift|rshift) tmp_mulfunc="lorrshift";; +- addlsh1_n) +- tmp_mulfunc="aorslsh1_n aorrlsh1_n aorsorrlsh1_n";; +- sublsh1_n) +- tmp_mulfunc="aorslsh1_n sorrlsh1_n aorsorrlsh1_n";; +- rsblsh1_n) +- tmp_mulfunc="aorrlsh1_n sorrlsh1_n aorsorrlsh1_n";; +- addlsh2_n) +- tmp_mulfunc="aorslsh2_n aorrlsh2_n aorsorrlsh2_n";; +- sublsh2_n) +- tmp_mulfunc="aorslsh2_n sorrlsh2_n aorsorrlsh2_n";; +- rsblsh2_n) +- tmp_mulfunc="aorrlsh2_n sorrlsh2_n aorsorrlsh2_n";; +- addlsh_n) +- tmp_mulfunc="aorslsh_n aorrlsh_n aorsorrlsh_n";; +- sublsh_n) +- tmp_mulfunc="aorslsh_n sorrlsh_n aorsorrlsh_n";; +- rsblsh_n) +- tmp_mulfunc="aorrlsh_n sorrlsh_n aorsorrlsh_n";; +- rsh1add_n|rsh1sub_n) +- tmp_mulfunc="rsh1aors_n";; +- sec_div_qr|sec_div_r) +- tmp_mulfunc="sec_div";; +- sec_pi1_div_qr|sec_pi1_div_r) +- tmp_mulfunc="sec_pi1_div";; +-esac +- +- +- found=no +- for tmp_dir in $path; do +- for tmp_base in $tmp_fn $tmp_mulfunc; do +- for tmp_ext in asm S s c; do +- tmp_file=$srcdir/mpn/$tmp_dir/$tmp_base.$tmp_ext +- if test -f $tmp_file; then +- +- # For a nails build, check if the file supports our nail bits. +- # Generic code always supports all nails. +- # +- # FIXME: When a multi-function file is selected to provide one of +- # the nails-neutral routines, like logops_n for and_n, the +- # PROLOGUE grepping will create HAVE_NATIVE_mpn_ defines for +- # all functions in that file, even if they haven't all been +- # nailified. Not sure what to do about this, it's only really a +- # problem for logops_n, and it's not too terrible to insist those +- # get nailified always. +- # +- if test $GMP_NAIL_BITS != 0 && test $tmp_dir != generic; then +- case $tmp_fn in +- and_n | ior_n | xor_n | andn_n | \ +- copyi | copyd | \ +- popcount | hamdist | \ +- udiv | udiv_w_sdiv | umul | \ +- cntlz | invert_limb) +- # these operations are either unaffected by nails or defined +- # to operate on full limbs +- ;; +- *) +- nails=`sed -n 's/^[ ]*NAILS_SUPPORT(\(.*\))/\1/p' $tmp_file ` +- for n in $nails; do +- case $n in +- *-*) +- n_start=`echo "$n" | sed -n 's/\(.*\)-.*/\1/p'` +- n_end=`echo "$n" | sed -n 's/.*-\(.*\)/\1/p'` +- ;; +- *) +- n_start=$n +- n_end=$n +- ;; +- esac +- if test $GMP_NAIL_BITS -ge $n_start && test $GMP_NAIL_BITS -le $n_end; then +- found=yes +- break +- fi +- done +- if test $found != yes; then +- continue +- fi +- ;; +- esac +- fi +- +- # If the host uses a non-standard ABI, check if tmp_file supports it +- # +- if test -n "$GMP_NONSTD_ABI" && test $tmp_ext != "c"; then +- abi=`sed -n 's/^[ ]*ABI_SUPPORT(\(.*\))/\1/p' $tmp_file ` +- if echo "$abi" | grep -q "\\b${GMP_NONSTD_ABI}\\b"; then +- true +- else +- continue +- fi +- fi +- +- found=yes +- eval found_$tmp_ext=yes +- +- if test $tmp_ext = c; then +- tmp_u='$U' +- else +- tmp_u= +- fi +- +- mpn_objects="$mpn_objects $tmp_fn$tmp_u.lo" +- mpn_objs_in_libgmp="$mpn_objs_in_libgmp mpn/$tmp_fn$tmp_u.lo" +- ac_config_links="$ac_config_links mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext" +- +- gmp_srclinks="$gmp_srclinks mpn/$tmp_fn.$tmp_ext" +- +- # Duplicate AC_DEFINEs are harmless, so it doesn't matter +- # that multi-function files get grepped here repeatedly. +- # The PROLOGUE pattern excludes the optional second parameter. +- gmp_ep=` +- sed -n 's/^[ ]*MULFUNC_PROLOGUE(\(.*\))/\1/p' $tmp_file ; +- sed -n 's/^[ ]*PROLOGUE(\([^,]*\).*)/\1/p' $tmp_file +- ` +- for gmp_tmp in $gmp_ep; do +- cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_NATIVE_$gmp_tmp 1 +-_ACEOF +- +- eval HAVE_NATIVE_$gmp_tmp=yes +- done +- +- case $tmp_fn in +- sqr_basecase) sqr_basecase_source=$tmp_file ;; +- esac +- +- break +- fi +- done +- if test $found = yes; then break ; fi +- done +- if test $found = yes; then break ; fi +- done +- +- if test $found = no; then +- for tmp_optional in $gmp_mpn_functions_optional; do +- if test $tmp_optional = $tmp_fn; then +- found=yes +- fi +- done +- if test $found = no; then +- as_fn_error $? "no version of $tmp_fn found in path: $path" "$LINENO" 5 +- fi +- fi +-done +- +-# All cycle counters are .asm files currently +-if test -n "$SPEED_CYCLECOUNTER_OBJ"; then +- found_asm=yes +-fi +- +- +- +- +- +-# Don't demand an m4 unless it's actually needed. +-if test $found_asm = yes; then +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suitable m4" >&5 +-$as_echo_n "checking for suitable m4... " >&6; } +-if ${gmp_cv_prog_m4+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$M4"; then +- gmp_cv_prog_m4="$M4" +-else +- cat >conftest.m4 <<\EOF +-define(dollarhash,``$#'')ifelse(dollarhash(x),1,`define(t1,Y)', +-``bad: $# not supported (SunOS /usr/bin/m4) +-'')ifelse(eval(89),89,`define(t2,Y)', +-`bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) +-')ifelse(eval(9,9),10,`define(t3,Y)', +-`bad: eval() doesnt support radix in eval (FreeBSD 8.x,9.0,9.1,9.2 m4) +-')ifelse(t1`'t2`'t3,YYY,`good +-') +-EOF +- echo "trying m4" >&5 +- gmp_tmp_val=`(m4 conftest.m4) 2>&5` +- echo "$gmp_tmp_val" >&5 +- if test "$gmp_tmp_val" = good; then +- gmp_cv_prog_m4="m4" +- else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +- ac_dummy="$PATH:/usr/5bin" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- echo "trying $ac_dir/m4" >&5 +- gmp_tmp_val=`($ac_dir/m4 conftest.m4) 2>&5` +- echo "$gmp_tmp_val" >&5 +- if test "$gmp_tmp_val" = good; then +- gmp_cv_prog_m4="$ac_dir/m4" +- break +- fi +- done +- IFS="$ac_save_ifs" +- if test -z "$gmp_cv_prog_m4"; then +- as_fn_error $? "No usable m4 in \$PATH or /usr/5bin (see config.log for reasons)." "$LINENO" 5 +- fi +- fi +- rm -f conftest.m4 +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_prog_m4" >&5 +-$as_echo "$gmp_cv_prog_m4" >&6; } +-M4="$gmp_cv_prog_m4" +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if m4wrap produces spurious output" >&5 +-$as_echo_n "checking if m4wrap produces spurious output... " >&6; } +-if ${gmp_cv_m4_m4wrap_spurious+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # hide the d-n-l from autoconf's error checking +-tmp_d_n_l=d""nl +-cat >conftest.m4 <&5 +-cat conftest.m4 >&5 +-tmp_chars=`$M4 conftest.m4 | wc -c` +-echo produces $tmp_chars chars output >&5 +-rm -f conftest.m4 +-if test $tmp_chars = 0; then +- gmp_cv_m4_m4wrap_spurious=no +-else +- gmp_cv_m4_m4wrap_spurious=yes +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_m4_m4wrap_spurious" >&5 +-$as_echo "$gmp_cv_m4_m4wrap_spurious" >&6; } +- +-echo "define(,<$gmp_cv_m4_m4wrap_spurious>)" >> $gmp_tmpconfigm4 +- +- +-# else +-# It's unclear why this m4-not-needed stuff was ever done. +-# if test -z "$M4" ; then +-# M4=m4-not-needed +-# fi +-fi +- +-# Only do the GMP_ASM checks if there's a .S or .asm wanting them. +-if test $found_asm = no && test $found_S = no; then +- gmp_asm_syntax_testing=no +-fi +- +-if test "$gmp_asm_syntax_testing" != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to switch to text section" >&5 +-$as_echo_n "checking how to switch to text section... " >&6; } +-if ${gmp_cv_asm_text+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in ".text" ".code" ".csect .text[PR]"; do +- echo "trying $i" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_text=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_text"; then +- as_fn_error $? "Cannot determine text section directive" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_text" >&5 +-$as_echo "$gmp_cv_asm_text" >&6; } +-echo "define(, <$gmp_cv_asm_text>)" >> $gmp_tmpconfigm4 +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to switch to data section" >&5 +-$as_echo_n "checking how to switch to data section... " >&6; } +-if ${gmp_cv_asm_data+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-aix*) gmp_cv_asm_data=".csect .data[RW]" ;; +- *) gmp_cv_asm_data=".data" ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_data" >&5 +-$as_echo "$gmp_cv_asm_data" >&6; } +-echo "define(, <$gmp_cv_asm_data>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler label suffix" >&5 +-$as_echo_n "checking for assembler label suffix... " >&6; } +-if ${gmp_cv_asm_label_suffix+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_label_suffix=unknown +-for i in "" ":"; do +- echo "trying $i" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_label_suffix=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat conftest.out >&5 +-fi +-rm -f conftest* +- +-done +-if test "$gmp_cv_asm_label_suffix" = "unknown"; then +- as_fn_error $? "Cannot determine label suffix" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_label_suffix" >&5 +-$as_echo "$gmp_cv_asm_label_suffix" >&6; } +-echo "define(, <$gmp_cv_asm_label_suffix>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler global directive" >&5 +-$as_echo_n "checking for assembler global directive... " >&6; } +-if ${gmp_cv_asm_globl+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- hppa*-*-*) gmp_cv_asm_globl=.export ;; +- ia64*-*-* | itanium-*-* | itanium2-*-*) gmp_cv_asm_globl=.global ;; +- *) gmp_cv_asm_globl=.globl ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_globl" >&5 +-$as_echo "$gmp_cv_asm_globl" >&6; } +-echo "define(, <$gmp_cv_asm_globl>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler global directive attribute" >&5 +-$as_echo_n "checking for assembler global directive attribute... " >&6; } +-if ${gmp_cv_asm_globl_attr+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $gmp_cv_asm_globl in +- .export) gmp_cv_asm_globl_attr=",entry" ;; +- *) gmp_cv_asm_globl_attr="" ;; +-esac +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_globl_attr" >&5 +-$as_echo "$gmp_cv_asm_globl_attr" >&6; } +-echo "define(, <$gmp_cv_asm_globl_attr>)" >> $gmp_tmpconfigm4 +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if globals are prefixed by underscore" >&5 +-$as_echo_n "checking if globals are prefixed by underscore... " >&6; } +-if ${gmp_cv_asm_underscore+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_underscore="unknown" +-cat >conftest.c <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- $NM conftest.$OBJEXT >conftest.out +- if grep _gurkmacka conftest.out >/dev/null; then +- gmp_cv_asm_underscore=yes +- elif grep gurkmacka conftest.out >/dev/null; then +- gmp_cv_asm_underscore=no +- else +- echo "configure: $NM doesn't have gurkmacka:" >&5 +- cat conftest.out >&5 +- fi +-else +- echo "configure: failed program was:" >&5 +- cat conftest.c >&5 +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_underscore" >&5 +-$as_echo "$gmp_cv_asm_underscore" >&6; } +-case $gmp_cv_asm_underscore in +- yes) +- +-echo 'define(, <_>)' >>$gmp_tmpconfigm4 +- ;; +- no) +- +-echo 'define(, <>)' >>$gmp_tmpconfigm4 +- ;; +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Cannot determine global symbol prefix." >&5 +-$as_echo "$as_me: WARNING: | Cannot determine global symbol prefix." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | $NM output doesn't contain a global data symbol." >&5 +-$as_echo "$as_me: WARNING: | $NM output doesn't contain a global data symbol." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | Will proceed with no underscore." >&5 +-$as_echo "$as_me: WARNING: | Will proceed with no underscore." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | If this is wrong then you'll get link errors referring" >&5 +-$as_echo "$as_me: WARNING: | If this is wrong then you'll get link errors referring" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | to ___gmpn_add_n (note three underscores)." >&5 +-$as_echo "$as_me: WARNING: | to ___gmpn_add_n (note three underscores)." >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | In this case do a fresh build with an override," >&5 +-$as_echo "$as_me: WARNING: | In this case do a fresh build with an override," >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: | ./configure gmp_cv_asm_underscore=yes" >&5 +-$as_echo "$as_me: WARNING: | ./configure gmp_cv_asm_underscore=yes" >&2;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: +----------------------------------------------------------" >&5 +-$as_echo "$as_me: WARNING: +----------------------------------------------------------" >&2;} +- +-echo 'define(, <>)' >>$gmp_tmpconfigm4 +- +- ;; +-esac +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to switch to read-only data section" >&5 +-$as_echo_n "checking how to switch to read-only data section... " >&6; } +-if ${gmp_cv_asm_rodata+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +-case $host in +-i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | x86_64-*-*) +- gmp_cv_asm_rodata="$gmp_cv_asm_data" ;; +-*) +- gmp_cv_asm_rodata="$gmp_cv_asm_text" ;; +-esac +- +-cat >conftest.c <&5 +-cat conftest.c >&5 +-gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&5" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- echo "Compiler output:" >&5 +- cat conftest.s >&5 +- if test $gmp_cv_asm_underscore = yes; then +- tmp_gsym_prefix=_ +- else +- tmp_gsym_prefix= +- fi +- # must see our label +- if grep "^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" conftest.s >/dev/null 2>&5; then +- # take the last directive before our label (hence skipping segments +- # getting debugging info etc) +- tmp_match=`sed -n "/^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix/q +- /^[. ]*data/p +- /^[. ]*rdata/p +- /^[. ]*text/p +- /^[. ]*section/p +- /^[. ]*csect/p +- /^[. ]*CSECT/p" conftest.s | sed -n '$p'` +- echo "Match: $tmp_match" >&5 +- if test -n "$tmp_match"; then +- gmp_cv_asm_rodata=$tmp_match +- fi +- else +- echo "Couldn't find label: ^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" >&5 +- fi +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_rodata" >&5 +-$as_echo "$gmp_cv_asm_rodata" >&6; } +-echo "define(, <$gmp_cv_asm_rodata>)" >> $gmp_tmpconfigm4 +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler .type directive" >&5 +-$as_echo_n "checking for assembler .type directive... " >&6; } +-if ${gmp_cv_asm_type+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_type= +-for gmp_tmp_prefix in @ \# %; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_type=".type \$1,${gmp_tmp_prefix}\$2" +- break +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_type" >&5 +-$as_echo "$gmp_cv_asm_type" >&6; } +-echo "define(, <$gmp_cv_asm_type>)" >> $gmp_tmpconfigm4 +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler .size directive" >&5 +-$as_echo_n "checking for assembler .size directive... " >&6; } +-if ${gmp_cv_asm_size+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_size= +-cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_size=".size \$1,\$2" +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_size" >&5 +-$as_echo "$gmp_cv_asm_size" >&6; } +-echo "define(, <$gmp_cv_asm_size>)" >> $gmp_tmpconfigm4 +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler local label prefix" >&5 +-$as_echo_n "checking for assembler local label prefix... " >&6; } +-if ${gmp_cv_asm_lsym_prefix+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_tmp_pre_appears=yes +-for gmp_tmp_pre in L .L $L $ L$; do +- echo "Trying $gmp_tmp_pre" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if $NM conftest.$OBJEXT >conftest.nm 2>&5; then : ; else +- cat conftest.nm >&5 +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"$NM\" failure" >&5 +-$as_echo "$as_me: WARNING: \"$NM\" failure" >&2;} +- break +- fi +- cat conftest.nm >&5 +- if grep gurkmacka conftest.nm >/dev/null; then : ; else +- # no mention of the symbol, this is good +- echo "$gmp_tmp_pre label doesn't appear in object file at all (good)" >&5 +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- gmp_tmp_pre_appears=no +- break +- fi +- if grep ' [a-zN] .*gurkmacka' conftest.nm >/dev/null; then +- # symbol mentioned as a local, use this if nothing better +- echo "$gmp_tmp_pre label is local but still in object file" >&5 +- if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- fi +- else +- echo "$gmp_tmp_pre label is something unknown" >&5 +- fi +- +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-rm -f conftest* +-if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix=L +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine local label, using default $gmp_cv_asm_lsym_prefix" >&5 +-$as_echo "$as_me: WARNING: cannot determine local label, using default $gmp_cv_asm_lsym_prefix" >&2;} +-fi +-# for development purposes, note whether we got a purely temporary local label +-echo "Local label appears in object files: $gmp_tmp_pre_appears" >&5 +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_lsym_prefix" >&5 +-$as_echo "$gmp_cv_asm_lsym_prefix" >&6; } +-echo "define(, <${gmp_cv_asm_lsym_prefix}>)" >> $gmp_tmpconfigm4 +- +-cat >>confdefs.h <<_ACEOF +-@%:@define LSYM_PREFIX "$gmp_cv_asm_lsym_prefix" +-_ACEOF +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler byte directive" >&5 +-$as_echo_n "checking for assembler byte directive... " >&6; } +-if ${gmp_cv_asm_byte+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in .byte data1; do +- echo "trying $i" >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_byte=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat conftest.out >&5 +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_byte"; then +- as_fn_error $? "Cannot determine how to emit a data byte" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_byte" >&5 +-$as_echo "$gmp_cv_asm_byte" >&6; } +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to define a 32-bit word" >&5 +-$as_echo_n "checking how to define a 32-bit word... " >&6; } +-if ${gmp_cv_asm_w32+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $host in +- *-*-hpux*) +- # FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption +- # that it's at 0x0. We'll have to declare another symbol before the +- # .long/.word and look at the distance between the two symbols. The +- # only problem is that the sed expression(s) barfs (on Solaris, for +- # example) for the symbol with value 0. For now, HPUX uses .word. +- gmp_cv_asm_w32=".word" +- ;; +- *-*-*) +- gmp_tmp_val= +- for gmp_tmp_op in .long .word data4; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_tmp_val=`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'` +- if test "$gmp_tmp_val" = 4; then +- gmp_cv_asm_w32="$gmp_tmp_op" +- break +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +- done +- rm -f conftest* +- ;; +-esac +-if test -z "$gmp_cv_asm_w32"; then +- as_fn_error $? "cannot determine how to define a 32-bit word" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_w32" >&5 +-$as_echo "$gmp_cv_asm_w32" >&6; } +-echo "define(, <$gmp_cv_asm_w32>)" >> $gmp_tmpconfigm4 +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if .align assembly directive is logarithmic" >&5 +-$as_echo_n "checking if .align assembly directive is logarithmic... " >&6; } +-if ${gmp_cv_asm_align_log+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_tmp_val=`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'` +- if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then +- gmp_cv_asm_align_log=yes +- else +- gmp_cv_asm_align_log=no +- fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- as_fn_error $? "cannot assemble alignment test" "$LINENO" 5 +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_align_log" >&5 +-$as_echo "$gmp_cv_asm_align_log" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_align_log>)" >> $gmp_tmpconfigm4 +- +- +- +- case $host in +- hppa*-*-*) +- # for both pa32 and pa64 +- +-echo "include_mpn(\`pa32/pa-defs.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- ia64*-*-* | itanium-*-* | itanium2-*-*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether assembler .align padding is good" >&5 +-$as_echo_n "checking whether assembler .align padding is good... " >&6; } +-if ${gmp_cv_asm_ia64_align_ok+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.awk <<\EOF +-BEGIN { +- want[0] = "011" +- want[1] = "160" +- want[2] = "074" +- want[3] = "040" +- want[4] = "000" +- want[5] = "040" +- want[6] = "020" +- want[7] = "221" +- want[8] = "114" +- want[9] = "000" +- want[10] = "100" +- want[11] = "200" +- want[12] = "122" +- want[13] = "261" +- want[14] = "000" +- want[15] = "200" +- +- want[16] = "000" +- want[17] = "004" +- want[18] = "000" +- want[19] = "000" +- want[20] = "000" +- want[21] = "000" +- want[22] = "002" +- want[23] = "000" +- want[24] = "000" +- want[25] = "000" +- want[26] = "000" +- want[27] = "001" +- want[28] = "000" +- want[29] = "000" +- want[30] = "000" +- want[31] = "014" +- +- want[32] = "011" +- want[33] = "270" +- want[34] = "140" +- want[35] = "062" +- want[36] = "000" +- want[37] = "040" +- want[38] = "240" +- want[39] = "331" +- want[40] = "160" +- want[41] = "000" +- want[42] = "100" +- want[43] = "240" +- want[44] = "343" +- want[45] = "371" +- want[46] = "000" +- want[47] = "200" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 47; i++) +- got[i] = got[i+1]; +- got[47] = $f; +- +- found = 1 +- for (i = 0; i < 48; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-EOF +-cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_ia64_align_ok=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: oops, cannot compile test program" >&5 +-$as_echo "$as_me: WARNING: oops, cannot compile test program" >&2;} +- gmp_cv_asm_ia64_align_ok=yes +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_ia64_align_ok" >&5 +-$as_echo "$gmp_cv_asm_ia64_align_ok" >&6; } +- +-echo "define(, <\`$gmp_cv_asm_ia64_align_ok'>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- m68k-*-* | m68[0-9][0-9][0-9]-*-*) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler instruction and register style" >&5 +-$as_echo_n "checking assembler instruction and register style... " >&6; } +-if ${gmp_cv_asm_m68k_instruction+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in "addl %d0,%d1" "add.l %d0,%d1" "addl d0,d1" "add.l d0,d1"; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_instruction=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_m68k_instruction"; then +- as_fn_error $? "cannot determine assembler instruction and register style" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_m68k_instruction" >&5 +-$as_echo "$gmp_cv_asm_m68k_instruction" >&6; } +-case $gmp_cv_asm_m68k_instruction in +-"addl d0,d1") want_dot_size=no; want_register_percent=no ;; +-"addl %d0,%d1") want_dot_size=no; want_register_percent=yes ;; +-"add.l d0,d1") want_dot_size=yes; want_register_percent=no ;; +-"add.l %d0,%d1") want_dot_size=yes; want_register_percent=yes ;; +-*) as_fn_error $? "oops, unrecognised instruction and register style" "$LINENO" 5 ;; +-esac +- +-echo "define(, <\`$want_register_percent'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(, <\`$want_dot_size'>)" >> $gmp_tmpconfigm4 +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler addressing style" >&5 +-$as_echo_n "checking assembler addressing style... " >&6; } +-if ${gmp_cv_asm_m68k_addressing+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- case $gmp_cv_asm_m68k_instruction in +-addl*) movel=movel ;; +-add.l*) movel=move.l ;; +-*) as_fn_error $? "oops, unrecognised gmp_cv_asm_m68k_instruction" "$LINENO" 5 ;; +-esac +-case $gmp_cv_asm_m68k_instruction in +-*"%d0,%d1") dreg=%d0; areg=%a0 ;; +-*"d0,d1") dreg=d0; areg=a0 ;; +-*) as_fn_error $? "oops, unrecognised gmp_cv_asm_m68k_instruction" "$LINENO" 5 ;; +-esac +-cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_addressing=mit +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_addressing=motorola +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- as_fn_error $? "cannot determine assembler addressing style" "$LINENO" 5 +-fi +-rm -f conftest* +- +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_m68k_addressing" >&5 +-$as_echo "$gmp_cv_asm_m68k_addressing" >&6; } +- +-echo "define(, <\`$gmp_cv_asm_m68k_addressing'>)" >> $gmp_tmpconfigm4 +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler shortest branches" >&5 +-$as_echo_n "checking assembler shortest branches... " >&6; } +-if ${gmp_cv_asm_m68k_branches+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- for i in jra jbra bra; do +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_m68k_branches=$i +- rm -f conftest* +- break +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- : +-fi +-rm -f conftest* +- +-done +-if test -z "$gmp_cv_asm_m68k_branches"; then +- as_fn_error $? "cannot determine assembler branching style" "$LINENO" 5 +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_m68k_branches" >&5 +-$as_echo "$gmp_cv_asm_m68k_branches" >&6; } +- +-echo "define(, <\`$gmp_cv_asm_m68k_branches'>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- powerpc*-*-* | power[3-9]-*-*) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler output is PIC by default" >&5 +-$as_echo_n "checking whether compiler output is PIC by default... " >&6; } +-if ${gmp_cv_asm_powerpc_pic+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_powerpc_pic=yes +-cat >conftest.c <&5 +-cat conftest.c >&5 +-gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&5" +-if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_compile\""; } >&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- echo "Compiler output:" >&5 +- cat conftest.s >&5 +- if grep 'foo@ha' conftest.s >/dev/null 2>&5; then +- gmp_cv_asm_powerpc_pic=no +- fi +- if grep 'ha16(_foo)' conftest.s >/dev/null 2>&5; then +- gmp_cv_asm_powerpc_pic=no +- fi +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_powerpc_pic" >&5 +-$as_echo "$gmp_cv_asm_powerpc_pic" >&6; } +- +-echo "define(,<$gmp_cv_asm_powerpc_pic>)" >> $gmp_tmpconfigm4 +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler needs r on registers" >&5 +-$as_echo_n "checking if the assembler needs r on registers... " >&6; } +-if ${gmp_cv_asm_powerpc_r_registers+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_powerpc_r_registers=no +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_powerpc_r_registers=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- as_fn_error $? "neither \"mtctr 6\" nor \"mtctr r6\" works" "$LINENO" 5 +-fi +-rm -f conftest* +- +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_powerpc_r_registers" >&5 +-$as_echo "$gmp_cv_asm_powerpc_r_registers" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_powerpc_r_registers>)" >> $gmp_tmpconfigm4 +- +- +- +-echo "include_mpn(\`powerpc32/powerpc-defs.m4')" >> $gmp_tmpconfigm4i +- +- +- # Check for Linux ELFv2 ABI +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#if _CALL_ELF == 2 +-yes +-#endif +-_ACEOF +-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | +- $EGREP "yes" >/dev/null 2>&1; then : +- +-echo "define()" >> $gmp_tmpconfigm4 +- +-fi +-rm -f conftest* +- +- +- case $host in +- *-*-aix*) +- case $ABI in +- mode64) +-echo "include_mpn(\`powerpc64/aix.m4')" >> $gmp_tmpconfigm4i +- ;; +- *) +-echo "include_mpn(\`powerpc32/aix.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- *-*-linux* | *-*-*bsd*) +- case $ABI in +- mode64) +-echo "include_mpn(\`powerpc64/elf.m4')" >> $gmp_tmpconfigm4i +- ;; +- mode32 | 32) +-echo "include_mpn(\`powerpc32/elf.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- *-*-darwin*) +- case $ABI in +- mode64) +-echo "include_mpn(\`powerpc64/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- mode32 | 32) +-echo "include_mpn(\`powerpc32/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- *) +- # Assume unrecognized operating system is the powerpc eABI +- +-echo "include_mpn(\`powerpc32/eabi.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- esac +- ;; +- power*-*-aix*) +- +-echo "include_mpn(\`powerpc32/aix.m4')" >> $gmp_tmpconfigm4i +- +- ;; +- *sparc*-*-*) +- case $ABI in +- 64) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler accepts \".register\"" >&5 +-$as_echo_n "checking if the assembler accepts \".register\"... " >&6; } +-if ${gmp_cv_asm_sparc_register+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_sparc_register=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_sparc_register=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_sparc_register" >&5 +-$as_echo "$gmp_cv_asm_sparc_register" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_sparc_register>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- esac +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler accepts gotdata relocations" >&5 +-$as_echo_n "checking if the assembler accepts gotdata relocations... " >&6; } +-if ${gmp_cv_asm_sparc_gotdata+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_sparc_gotdata=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_sparc_gotdata=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_sparc_gotdata" >&5 +-$as_echo "$gmp_cv_asm_sparc_gotdata" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_sparc_gotdata>)" >> $gmp_tmpconfigm4 +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler can support shared PIC thunks" >&5 +-$as_echo_n "checking if the assembler can support shared PIC thunks... " >&6; } +-if ${gmp_cv_asm_sparc_shared_thunks+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_sparc_shared_thunks=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_sparc_shared_thunks=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_sparc_shared_thunks" >&5 +-$as_echo "$gmp_cv_asm_sparc_shared_thunks" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_sparc_shared_thunks>)" >> $gmp_tmpconfigm4 +- +- +- ;; +- i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-* | athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar-*-* | bulldozer-*-* | piledriver-*-* | steamroller-*-* | excavator-*-* | pentium4-*-* | atom-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-*) +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the .align directive accepts an 0x90 fill in .text" >&5 +-$as_echo_n "checking if the .align directive accepts an 0x90 fill in .text... " >&6; } +-if ${gmp_cv_asm_align_fill_0x90+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then +- echo "Suppressing this warning by omitting 0x90" 1>&5 +- gmp_cv_asm_align_fill_0x90=no +-else +- gmp_cv_asm_align_fill_0x90=yes +-fi +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_align_fill_0x90=no +-fi +-rm -f conftest* +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_align_fill_0x90" >&5 +-$as_echo "$gmp_cv_asm_align_fill_0x90" >&6; } +- +- +-echo "define(,<$gmp_cv_asm_align_fill_0x90>)" >> $gmp_tmpconfigm4 +- +- +- case $ABI in +- 32) +- +-echo "include_mpn(\`x86/x86-defs.m4')" >> $gmp_tmpconfigm4i +- +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_x86 1" >>confdefs.h +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for assembler COFF type directives" >&5 +-$as_echo_n "checking for assembler COFF type directives... " >&6; } +-if ${gmp_cv_asm_x86_coff_type+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_coff_type=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_coff_type=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_coff_type" >&5 +-$as_echo "$gmp_cv_asm_x86_coff_type" >&6; } +-echo "define(, <$gmp_cv_asm_x86_coff_type>)" >> $gmp_tmpconfigm4 +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore" >&5 +-$as_echo_n "checking if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore... " >&6; } +-if ${gmp_cv_asm_x86_got_underscore+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- gmp_cv_asm_x86_got_underscore="not applicable" +-if test $gmp_cv_asm_underscore = yes; then +- tmp_gsym_prefix=_ +-else +- tmp_gsym_prefix= +-fi +-for tmp_underscore in "" "_"; do +- cat >conftest.s <&5 +- (eval $gmp_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if test "$tmp_underscore" = "_"; then +- gmp_cv_asm_x86_got_underscore=yes +- else +- gmp_cv_asm_x86_got_underscore=no +- fi +- break +- fi +-done +-rm -f conftest* a.out b.out a.exe a_out.exe +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_got_underscore" >&5 +-$as_echo "$gmp_cv_asm_x86_got_underscore" >&6; } +-if test "$gmp_cv_asm_x86_got_underscore" = "yes"; then +- +-echo 'define(, <_>)' >>$gmp_tmpconfigm4 +- +-else +- +-echo 'define(, <>)' >>$gmp_tmpconfigm4 +- +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the assembler takes cl with shldl" >&5 +-$as_echo_n "checking if the assembler takes cl with shldl... " >&6; } +-if ${gmp_cv_asm_x86_shldl_cl+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- cat >conftest.s <&5 +- (eval $gmp_assemble) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- cat conftest.out >&5 +- gmp_cv_asm_x86_shldl_cl=yes +-else +- cat conftest.out >&5 +- echo "configure: failed program was:" >&5 +- cat conftest.s >&5 +- gmp_cv_asm_x86_shldl_cl=no +-fi +-rm -f conftest* +- +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gmp_cv_asm_x86_shldl_cl" >&5 +-$as_echo "$gmp_cv_asm_x86_shldl_cl" >&6; } +-if test "$gmp_cv_asm_x86_shldl_cl" = "yes"; then +- +-echo 'define(, <1>)' >>$gmp_tmpconfigm4 +- +-else +- +-echo 'define(, <0>)' >>$gmp_tmpconfigm4 +- +-fi +- +- case $enable_profiling in +- prof | gprof) @%:@ Check whether --enable-shared was given. +-if test "${enable_shared+set}" = set; then : +- enableval=$enable_shared; p=${PACKAGE-default} +- case $enableval in +- yes) enable_shared=yes ;; +- no) enable_shared=no ;; +- *) +- enable_shared=no +- # Look at the argument we got. We use all the common list separators. +- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," +- for pkg in $enableval; do +- IFS="$lt_save_ifs" +- if test "X$pkg" = "X$p"; then +- enable_shared=yes +- fi +- done +- IFS="$lt_save_ifs" +- ;; +- esac +-else +- enable_shared=yes +-fi +- +- +- +- +- +- +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to call x86 mcount" >&5 +-$as_echo_n "checking how to call x86 mcount... " >&6; } +-cat >conftest.c <&5 +- (eval $gmp_asmout_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep '\.data' conftest.s >/dev/null; then +- mcount_nonpic_reg=`sed -n '/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p' conftest.s` +- else +- mcount_nonpic_reg= +- fi +- mcount_nonpic_call=`grep 'call.*mcount' conftest.s` +- if test -z "$mcount_nonpic_call"; then +- as_fn_error $? "Cannot find mcount call for non-PIC" "$LINENO" 5 +- fi +- else +- as_fn_error $? "Cannot compile test program for non-PIC" "$LINENO" 5 +- fi +-fi +- +-if test "$enable_shared" = yes; then +- gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic -S conftest.c 1>&5" +- if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$gmp_asmout_compile\""; } >&5 +- (eval $gmp_asmout_compile) 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; }; then +- if grep '\.data' conftest.s >/dev/null; then +- case $lt_prog_compiler_pic in +- *-DDLL_EXPORT*) +- # Windows DLLs have non-PIC style mcount +- mcount_pic_reg=`sed -n '/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p' conftest.s` +- ;; +- *) +- mcount_pic_reg=`sed -n 's/.*GOTOFF.*,\(%[a-z]*\).*$/\1/p' conftest.s` +- ;; +- esac +- else +- mcount_pic_reg= +- fi +- mcount_pic_call=`grep 'call.*mcount' conftest.s` +- if test -z "$mcount_pic_call"; then +- as_fn_error $? "Cannot find mcount call for PIC" "$LINENO" 5 +- fi +- else +- as_fn_error $? "Cannot compile test program for PIC" "$LINENO" 5 +- fi +-fi +- +- +-echo "define(, <\`$mcount_nonpic_reg'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(,<\`$mcount_nonpic_call'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(, <\`$mcount_pic_reg'>)" >> $gmp_tmpconfigm4 +- +- +-echo "define(, <\`$mcount_pic_call'>)" >> $gmp_tmpconfigm4 +- +- +-rm -f conftest.* +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: determined" >&5 +-$as_echo "determined" >&6; } +- ;; +- esac +- case $host in +- *-*-darwin*) +- +-echo "include_mpn(\`x86/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- esac +- ;; +- 64|x32) +- +-echo "include_mpn(\`x86_64/x86_64-defs.m4')" >> $gmp_tmpconfigm4i +- +- $as_echo "@%:@define HAVE_HOST_CPU_FAMILY_x86_64 1" >>confdefs.h +- +- case $host in +- *-*-darwin*) +- +-echo "include_mpn(\`x86_64/darwin.m4')" >> $gmp_tmpconfigm4i +- ;; +- *-*-mingw* | *-*-cygwin) +- +-echo "include_mpn(\`x86_64/dos64.m4')" >> $gmp_tmpconfigm4i +- ;; +- *-openbsd*) +- +-echo "define(,1)" >> $gmp_tmpconfigm4 +- ;; +- esac +- ;; +- esac +- ;; +- esac +-fi +- +-# For --enable-minithres, prepend "minithres" to path so that its special +-# gmp-mparam.h will be used. +-if test $enable_minithres = yes; then +- path="minithres $path" +-fi +- +-# Create link for gmp-mparam.h. +-gmp_mparam_source= +-for gmp_mparam_dir in $path; do +- test "$no_create" = yes || rm -f gmp-mparam.h +- tmp_file=$srcdir/mpn/$gmp_mparam_dir/gmp-mparam.h +- if test -f $tmp_file; then +- ac_config_links="$ac_config_links gmp-mparam.h:mpn/$gmp_mparam_dir/gmp-mparam.h" +- +- gmp_srclinks="$gmp_srclinks gmp-mparam.h" +- gmp_mparam_source=$tmp_file +- break +- fi +-done +-if test -z "$gmp_mparam_source"; then +- as_fn_error $? "no version of gmp-mparam.h found in path: $path" "$LINENO" 5 +-fi +- +-# For a helpful message from tune/tuneup.c +-gmp_mparam_suggest=$gmp_mparam_source +-if test "$gmp_mparam_dir" = generic; then +- for i in $path; do break; done +- if test "$i" != generic; then +- gmp_mparam_suggest="new file $srcdir/mpn/$i/gmp-mparam.h" +- fi +-fi +- +-cat >>confdefs.h <<_ACEOF +-@%:@define GMP_MPARAM_H_SUGGEST "$gmp_mparam_source" +-_ACEOF +- +- +- +-# Copy relevant parameters from gmp-mparam.h to config.m4. +-# We only do this for parameters that are used by some assembly files. +-# Fat binaries do this on a per-file basis, so skip in that case. +-# +-if test -z "$fat_path"; then +- for i in SQR_TOOM2_THRESHOLD BMOD_1_TO_MOD_1_THRESHOLD SHLD_SLOW SHRD_SLOW; do +- value=`sed -n 's/^#define '$i'[ ]*\([0-9][0-9]*\).*$/\1/p' $gmp_mparam_source` +- if test -n "$value"; then +- +-echo "define(<$i>,<$value>)" >> $gmp_tmpconfigm4 +- +- fi +- done +-fi +- +- +-# Sizes of some types, needed at preprocessing time. +-# +-# FIXME: The assumption that GMP_LIMB_BITS is 8*sizeof(mp_limb_t) might +-# be slightly rash, but it's true everywhere we know of and ought to be true +-# of any sensible system. In a generic C build, grepping LONG_BIT out of +-# might be an alternative, for maximum portability. +-# +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +-$as_echo_n "checking size of void *... " >&6; } +-if ${ac_cv_sizeof_void_p+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_void_p" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (void *) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_void_p=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +-$as_echo "$ac_cv_sizeof_void_p" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_VOID_P $ac_cv_sizeof_void_p +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned short" >&5 +-$as_echo_n "checking size of unsigned short... " >&6; } +-if ${ac_cv_sizeof_unsigned_short+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned short))" "ac_cv_sizeof_unsigned_short" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_unsigned_short" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (unsigned short) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_unsigned_short=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_short" >&5 +-$as_echo "$ac_cv_sizeof_unsigned_short" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned" >&5 +-$as_echo_n "checking size of unsigned... " >&6; } +-if ${ac_cv_sizeof_unsigned+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned))" "ac_cv_sizeof_unsigned" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_unsigned" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (unsigned) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_unsigned=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned" >&5 +-$as_echo "$ac_cv_sizeof_unsigned" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5 +-$as_echo_n "checking size of unsigned long... " >&6; } +-if ${ac_cv_sizeof_unsigned_long+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default"; then : +- +-else +- if test "$ac_cv_type_unsigned_long" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (unsigned long) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_unsigned_long=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 +-$as_echo "$ac_cv_sizeof_unsigned_long" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long +-_ACEOF +- +- +-# The cast to long int works around a bug in the HP C Compiler +-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +-# This bug is HP SR number 8606223364. +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of mp_limb_t" >&5 +-$as_echo_n "checking size of mp_limb_t... " >&6; } +-if ${ac_cv_sizeof_mp_limb_t+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (mp_limb_t))" "ac_cv_sizeof_mp_limb_t" "#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ +-#define GMP_NAIL_BITS $GMP_NAIL_BITS +-#define GMP_LIMB_BITS 123 +-$DEFN_LONG_LONG_LIMB +-#include \"$srcdir/gmp-h.in\" +- +-"; then : +- +-else +- if test "$ac_cv_type_mp_limb_t" = yes; then +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error 77 "cannot compute sizeof (mp_limb_t) +-See \`config.log' for more details" "$LINENO" 5; } +- else +- ac_cv_sizeof_mp_limb_t=0 +- fi +-fi +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_mp_limb_t" >&5 +-$as_echo "$ac_cv_sizeof_mp_limb_t" >&6; } +- +- +- +-cat >>confdefs.h <<_ACEOF +-@%:@define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t +-_ACEOF +- +- +-if test "$ac_cv_sizeof_mp_limb_t" = 0; then +- as_fn_error $? "Oops, mp_limb_t doesn't seem to work" "$LINENO" 5 +-fi +-GMP_LIMB_BITS=`expr 8 \* $ac_cv_sizeof_mp_limb_t` +- +- +-echo "define(,<$ac_cv_sizeof_unsigned>)" >> $gmp_tmpconfigm4 +- +- +-# Check compiler limb size matches gmp-mparam.h +-# +-# FIXME: Some of the cycle counter objects in the tune directory depend on +-# the size of ulong, it'd be possible to check that here, though a mismatch +-# probably wouldn't want to be fatal, none of the libgmp assembler code +-# depends on ulong. +-# +-mparam_bits=`sed -n 's/^#define GMP_LIMB_BITS[ ][ ]*\([0-9]*\).*$/\1/p' $gmp_mparam_source` +-if test -n "$mparam_bits" && test "$mparam_bits" -ne $GMP_LIMB_BITS; then +- if test "$test_CFLAGS" = set; then +- as_fn_error $? "Oops, mp_limb_t is $GMP_LIMB_BITS bits, but the assembler code +-in this configuration expects $mparam_bits bits. +-You appear to have set \$CFLAGS, perhaps you also need to tell GMP the +-intended ABI, see \"ABI and ISA\" in the manual." "$LINENO" 5 +- else +- as_fn_error $? "Oops, mp_limb_t is $GMP_LIMB_BITS bits, but the assembler code +-in this configuration expects $mparam_bits bits." "$LINENO" 5 +- fi +-fi +- +- +-echo "define(,$GMP_LIMB_BITS)" >> $gmp_tmpconfigm4 +- +- +-echo "define(,$GMP_NAIL_BITS)" >> $gmp_tmpconfigm4 +- +- +-echo "define(,eval(GMP_LIMB_BITS-GMP_NAIL_BITS))" >> $gmp_tmpconfigm4 +- +- +- +- +- +- +- +- +-# A recompiled sqr_basecase for use in the tune program, if necessary. +-TUNE_SQR_OBJ= +-test -d tune || mkdir tune +-case $sqr_basecase_source in +- *.asm) +- sqr_max=`sed -n 's/^def...(SQR_TOOM2_THRESHOLD_MAX, *\([0-9]*\))/\1/p' $sqr_basecase_source` +- if test -n "$sqr_max"; then +- TUNE_SQR_OBJ=sqr_asm.o +- +-cat >>confdefs.h <<_ACEOF +-@%:@define TUNE_SQR_TOOM2_MAX $sqr_max +-_ACEOF +- +- fi +- cat >tune/sqr_basecase.c <>confdefs.h +- +- cat >tune/sqr_basecase.c < +-" +-if test "x$ac_cv_type_stack_t" = xyes; then : +- +-cat >>confdefs.h <<_ACEOF +-@%:@define HAVE_STACK_T 1 +-_ACEOF +- +-HAVE_STACK_T_01=1 +-else +- HAVE_STACK_T_01=0 +-fi +- +- +- +-# Configs for demos/calc directory +-# +-# AC_SUBST+AC_CONFIG_FILES is used for calc-config.h, rather than AC_DEFINE+ +-# AC_CONFIG_HEADERS, since with the latter automake (1.8) will then put the +-# directory (ie. demos/calc) into $(DEFAULT_INCLUDES) for every Makefile.in, +-# which would look very strange. +-# +-# -lcurses is required by libreadline. On a typical SVR4 style system this +-# normally doesn't have to be given explicitly, since libreadline.so will +-# have a NEEDED record for it. But if someone for some reason is using only +-# a static libreadline.a then we must give -lcurses. Readline (as of +-# version 4.3) doesn't use libtool, so we can't rely on a .la to cover +-# necessary dependencies. +-# +-# On a couple of systems we've seen libreadline available, but the headers +-# not in the default include path, so check for readline/readline.h. We've +-# also seen readline/history.h missing, not sure if that's just a broken +-# install or a very old version, but check that too. +-# +-ac_config_files="$ac_config_files demos/calc/calc-config.h:demos/calc/calc-config-h.in" +- +-LIBCURSES= +-if test $with_readline != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -lncurses" >&5 +-$as_echo_n "checking for tputs in -lncurses... " >&6; } +-if ${ac_cv_lib_ncurses_tputs+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lncurses $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char tputs (); +-int +-main () +-{ +-return tputs (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_ncurses_tputs=yes +-else +- ac_cv_lib_ncurses_tputs=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tputs" >&5 +-$as_echo "$ac_cv_lib_ncurses_tputs" >&6; } +-if test "x$ac_cv_lib_ncurses_tputs" = xyes; then : +- LIBCURSES=-lncurses +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tputs in -lcurses" >&5 +-$as_echo_n "checking for tputs in -lcurses... " >&6; } +-if ${ac_cv_lib_curses_tputs+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lcurses $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char tputs (); +-int +-main () +-{ +-return tputs (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_curses_tputs=yes +-else +- ac_cv_lib_curses_tputs=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tputs" >&5 +-$as_echo "$ac_cv_lib_curses_tputs" >&6; } +-if test "x$ac_cv_lib_curses_tputs" = xyes; then : +- LIBCURSES=-lcurses +-fi +- +-fi +- +-fi +- +-use_readline=$with_readline +-if test $with_readline = detect; then +- use_readline=no +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 +-$as_echo_n "checking for readline in -lreadline... " >&6; } +-if ${ac_cv_lib_readline_readline+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- ac_check_lib_save_LIBS=$LIBS +-LIBS="-lreadline $LIBCURSES $LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +-/* Override any GCC internal prototype to avoid an error. +- Use char because int might match the return type of a GCC +- builtin and then its argument prototype would still apply. */ +-#ifdef __cplusplus +-extern "C" +-#endif +-char readline (); +-int +-main () +-{ +-return readline (); +- ; +- return 0; +-} +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_readline_readline=yes +-else +- ac_cv_lib_readline_readline=no +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_check_lib_save_LIBS +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 +-$as_echo "$ac_cv_lib_readline_readline" >&6; } +-if test "x$ac_cv_lib_readline_readline" = xyes; then : +- ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +-if test "x$ac_cv_header_readline_readline_h" = xyes; then : +- ac_fn_c_check_header_mongrel "$LINENO" "readline/history.h" "ac_cv_header_readline_history_h" "$ac_includes_default" +-if test "x$ac_cv_header_readline_history_h" = xyes; then : +- use_readline=yes +-fi +- +- +-fi +- +- +-fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking readline detected" >&5 +-$as_echo_n "checking readline detected... " >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_readline" >&5 +-$as_echo "$use_readline" >&6; } +-fi +-if test $use_readline = yes; then +- WITH_READLINE_01=1 +- +- LIBREADLINE=-lreadline +- +-else +- WITH_READLINE_01=0 +-fi +-for ac_prog in 'bison -y' byacc +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_YACC+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$YACC"; then +- ac_cv_prog_YACC="$YACC" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_YACC="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-YACC=$ac_cv_prog_YACC +-if test -n "$YACC"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 +-$as_echo "$YACC" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$YACC" && break +-done +-test -n "$YACC" || YACC="yacc" +- +-for ac_prog in flex lex +-do +- # Extract the first word of "$ac_prog", so it can be a program name with args. +-set dummy $ac_prog; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_LEX+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$LEX"; then +- ac_cv_prog_LEX="$LEX" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_LEX="$ac_prog" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-LEX=$ac_cv_prog_LEX +-if test -n "$LEX"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 +-$as_echo "$LEX" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +- test -n "$LEX" && break +-done +-test -n "$LEX" || LEX=":" +- +-if test "x$LEX" != "x:"; then +- cat >conftest.l <<_ACEOF +-%% +-a { ECHO; } +-b { REJECT; } +-c { yymore (); } +-d { yyless (1); } +-e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ +- yyless ((input () != 0)); } +-f { unput (yytext[0]); } +-. { BEGIN INITIAL; } +-%% +-#ifdef YYTEXT_POINTER +-extern char *yytext; +-#endif +-int +-main (void) +-{ +- return ! yylex () + ! yywrap (); +-} +-_ACEOF +-{ { ac_try="$LEX conftest.l" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$LEX conftest.l") 2>&5 +- ac_status=$? +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 +-$as_echo_n "checking lex output file root... " >&6; } +-if ${ac_cv_prog_lex_root+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +-if test -f lex.yy.c; then +- ac_cv_prog_lex_root=lex.yy +-elif test -f lexyy.c; then +- ac_cv_prog_lex_root=lexyy +-else +- as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 +-fi +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 +-$as_echo "$ac_cv_prog_lex_root" >&6; } +-LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root +- +-if test -z "${LEXLIB+set}"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 +-$as_echo_n "checking lex library... " >&6; } +-if ${ac_cv_lib_lex+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- +- ac_save_LIBS=$LIBS +- ac_cv_lib_lex='none needed' +- for ac_lib in '' -lfl -ll; do +- LIBS="$ac_lib $ac_save_LIBS" +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-`cat $LEX_OUTPUT_ROOT.c` +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_lib_lex=$ac_lib +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +- test "$ac_cv_lib_lex" != 'none needed' && break +- done +- LIBS=$ac_save_LIBS +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 +-$as_echo "$ac_cv_lib_lex" >&6; } +- test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 +-$as_echo_n "checking whether yytext is a pointer... " >&6; } +-if ${ac_cv_prog_lex_yytext_pointer+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- # POSIX says lex can declare yytext either as a pointer or an array; the +-# default is implementation-dependent. Figure out which it is, since +-# not all implementations provide the %pointer and %array declarations. +-ac_cv_prog_lex_yytext_pointer=no +-ac_save_LIBS=$LIBS +-LIBS="$LEXLIB $ac_save_LIBS" +-cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +- +- #define YYTEXT_POINTER 1 +-`cat $LEX_OUTPUT_ROOT.c` +-_ACEOF +-if ac_fn_c_try_link "$LINENO"; then : +- ac_cv_prog_lex_yytext_pointer=yes +-fi +-rm -f core conftest.err conftest.$ac_objext \ +- conftest$ac_exeext conftest.$ac_ext +-LIBS=$ac_save_LIBS +- +-fi +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 +-$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } +-if test $ac_cv_prog_lex_yytext_pointer = yes; then +- +-$as_echo "@%:@define YYTEXT_POINTER 1" >>confdefs.h +- +-fi +-rm -f conftest.l $LEX_OUTPUT_ROOT.c +- +-fi +-if test "$LEX" = :; then +- LEX=${am_missing_run}flex +-fi +- +-# Configs for demos/expr directory +-# +-# Libtool already runs an AC_CHECK_TOOL for ranlib, but we give +-# AC_PROG_RANLIB anyway since automake is supposed to complain if it's not +-# called. (Automake 1.8.4 doesn't, at least not when the only library is in +-# an EXTRA_LIBRARIES.) +-# +-if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +-set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$RANLIB"; then +- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-RANLIB=$ac_cv_prog_RANLIB +-if test -n "$RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +-$as_echo "$RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_prog_RANLIB"; then +- ac_ct_RANLIB=$RANLIB +- # Extract the first word of "ranlib", so it can be a program name with args. +-set dummy ranlib; ac_word=$2 +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +-$as_echo_n "checking for $ac_word... " >&6; } +-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +- $as_echo_n "(cached) " >&6 +-else +- if test -n "$ac_ct_RANLIB"; then +- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +-else +-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- for ac_exec_ext in '' $ac_executable_extensions; do +- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +- ac_cv_prog_ac_ct_RANLIB="ranlib" +- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 +- break 2 +- fi +-done +- done +-IFS=$as_save_IFS +- +-fi +-fi +-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +-if test -n "$ac_ct_RANLIB"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +-$as_echo "$ac_ct_RANLIB" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_ct_RANLIB" = x; then +- RANLIB=":" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- RANLIB=$ac_ct_RANLIB +- fi +-else +- RANLIB="$ac_cv_prog_RANLIB" +-fi +- +- +- +-# Create config.m4. +- +-echo "creating $gmp_configm4" +-echo "d""nl $gmp_configm4. Generated automatically by configure." > $gmp_configm4 +-if test -f $gmp_tmpconfigm4; then +- echo "changequote(<,>)" >> $gmp_configm4 +- echo "ifdef(<__CONFIG_M4_INCLUDED__>,,<" >> $gmp_configm4 +- cat $gmp_tmpconfigm4 >> $gmp_configm4 +- echo ">)" >> $gmp_configm4 +- echo "changequote(\`,')" >> $gmp_configm4 +- rm $gmp_tmpconfigm4 +-fi +-echo "ifdef(\`__CONFIG_M4_INCLUDED__',,\`" >> $gmp_configm4 +-if test -f $gmp_tmpconfigm4i; then +- cat $gmp_tmpconfigm4i >> $gmp_configm4 +- rm $gmp_tmpconfigm4i +-fi +-if test -f $gmp_tmpconfigm4p; then +- cat $gmp_tmpconfigm4p >> $gmp_configm4 +- rm $gmp_tmpconfigm4p +-fi +-echo "')" >> $gmp_configm4 +-echo "define(\`__CONFIG_M4_INCLUDED__')" >> $gmp_configm4 +- +- +-# Create Makefiles +-# FIXME: Upcoming version of autoconf/automake may not like broken lines. +-# Right now automake isn't accepting the new AC_CONFIG_FILES scheme. +- +-ac_config_files="$ac_config_files Makefile mpf/Makefile mpn/Makefile mpq/Makefile mpz/Makefile printf/Makefile scanf/Makefile rand/Makefile cxx/Makefile tests/Makefile tests/devel/Makefile tests/mpf/Makefile tests/mpn/Makefile tests/mpq/Makefile tests/mpz/Makefile tests/rand/Makefile tests/misc/Makefile tests/cxx/Makefile doc/Makefile tune/Makefile demos/Makefile demos/calc/Makefile demos/expr/Makefile gmp.h:gmp-h.in" +- +-cat >confcache <<\_ACEOF +-# This file is a shell script that caches the results of configure +-# tests run on this system so they can be shared between configure +-# scripts and configure runs, see configure's option --config-cache. +-# It is not useful on other systems. If it contains results you don't +-# want to keep, you may remove or edit it. +-# +-# config.status only pays attention to the cache file if you give it +-# the --recheck option to rerun configure. +-# +-# `ac_cv_env_foo' variables (set or unset) will be overridden when +-# loading this file, other *unset* `ac_cv_foo' will be assigned the +-# following values. +- +-_ACEOF +- +-# The following way of writing the cache mishandles newlines in values, +-# but we know of no workaround that is simple, portable, and efficient. +-# So, we kill variables containing newlines. +-# Ultrix sh set writes to stderr and can't be redirected directly, +-# and sets the high bit in the cache file unless we assign to the vars. +-( +- for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do +- eval ac_val=\$$ac_var +- case $ac_val in #( +- *${as_nl}*) +- case $ac_var in #( +- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; +- esac +- case $ac_var in #( +- _ | IFS | as_nl) ;; #( +- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( +- *) { eval $ac_var=; unset $ac_var;} ;; +- esac ;; +- esac +- done +- +- (set) 2>&1 | +- case $as_nl`(ac_space=' '; set) 2>&1` in #( +- *${as_nl}ac_space=\ *) +- # `set' does not quote correctly, so add quotes: double-quote +- # substitution turns \\\\ into \\, and sed turns \\ into \. +- sed -n \ +- "s/'/'\\\\''/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" +- ;; #( +- *) +- # `set' quotes correctly as required by POSIX, so do not add quotes. +- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" +- ;; +- esac | +- sort +-) | +- sed ' +- /^ac_cv_env_/b end +- t clear +- :clear +- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ +- t end +- s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ +- :end' >>confcache +-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else +- if test -w "$cache_file"; then +- if test "x$cache_file" != "x/dev/null"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +-$as_echo "$as_me: updating cache $cache_file" >&6;} +- if test ! -f "$cache_file" || test -h "$cache_file"; then +- cat confcache >"$cache_file" +- else +- case $cache_file in #( +- */* | ?:*) +- mv -f confcache "$cache_file"$$ && +- mv -f "$cache_file"$$ "$cache_file" ;; #( +- *) +- mv -f confcache "$cache_file" ;; +- esac +- fi +- fi +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} +- fi +-fi +-rm -f confcache +- +-test "x$prefix" = xNONE && prefix=$ac_default_prefix +-# Let make expand exec_prefix. +-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' +- +-DEFS=-DHAVE_CONFIG_H +- +-ac_libobjs= +-ac_ltlibobjs= +-U= +-for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue +- # 1. Remove the extension, and $U if already installed. +- ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' +- ac_i=`$as_echo "$ac_i" | sed "$ac_script"` +- # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR +- # will be set to the directory where LIBOBJS objects are built. +- as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" +- as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +-done +-LIB@&t@OBJS=$ac_libobjs +- +-LTLIBOBJS=$ac_ltlibobjs +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +-$as_echo_n "checking that generated files are newer than configure... " >&6; } +- if test -n "$am_sleep_pid"; then +- # Hide warnings about reused PIDs. +- wait $am_sleep_pid 2>/dev/null +- fi +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +-$as_echo "done" >&6; } +- if test -n "$EXEEXT"; then +- am__EXEEXT_TRUE= +- am__EXEEXT_FALSE='#' +-else +- am__EXEEXT_TRUE='#' +- am__EXEEXT_FALSE= +-fi +- +-if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then +- as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +-Usually this means the macro was only invoked conditionally." "$LINENO" 5 +-fi +-if test -z "${WANT_CXX_TRUE}" && test -z "${WANT_CXX_FALSE}"; then +- as_fn_error $? "conditional \"WANT_CXX\" was never defined. +-Usually this means the macro was only invoked conditionally." "$LINENO" 5 +-fi +-if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then +- as_fn_error $? "conditional \"ENABLE_STATIC\" was never defined. +-Usually this means the macro was only invoked conditionally." "$LINENO" 5 +-fi +- +- +-: "${CONFIG_STATUS=./config.status}" +-ac_write_fail=0 +-ac_clean_files_save=$ac_clean_files +-ac_clean_files="$ac_clean_files $CONFIG_STATUS" +-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +-as_write_fail=0 +-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +-#! $SHELL +-# Generated by $as_me. +-# Run this file to recreate the current configuration. +-# Compiler output produced by configure, useful for debugging +-# configure, is in config.log if it exists. +- +-debug=false +-ac_cs_recheck=false +-ac_cs_silent=false +- +-SHELL=\${CONFIG_SHELL-$SHELL} +-export SHELL +-_ASEOF +-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +-## -------------------- ## +-## M4sh Initialization. ## +-## -------------------- ## +- +-# Be more Bourne compatible +-DUALCASE=1; export DUALCASE # for MKS sh +-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +- emulate sh +- NULLCMD=: +- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which +- # is contrary to our usage. Disable this feature. +- alias -g '${1+"$@"}'='"$@"' +- setopt NO_GLOB_SUBST +-else +- case `(set -o) 2>/dev/null` in @%:@( +- *posix*) : +- set -o posix ;; @%:@( +- *) : +- ;; +-esac +-fi +- +- +-as_nl=' +-' +-export as_nl +-# Printing a long string crashes Solaris 7 /usr/bin/printf. +-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +-# Prefer a ksh shell builtin over an external printf program on Solaris, +-# but without wasting forks for bash or zsh. +-if test -z "$BASH_VERSION$ZSH_VERSION" \ +- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='print -r --' +- as_echo_n='print -rn --' +-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then +- as_echo='printf %s\n' +- as_echo_n='printf %s' +-else +- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then +- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' +- as_echo_n='/usr/ucb/echo -n' +- else +- as_echo_body='eval expr "X$1" : "X\\(.*\\)"' +- as_echo_n_body='eval +- arg=$1; +- case $arg in @%:@( +- *"$as_nl"*) +- expr "X$arg" : "X\\(.*\\)$as_nl"; +- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; +- esac; +- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" +- ' +- export as_echo_n_body +- as_echo_n='sh -c $as_echo_n_body as_echo' +- fi +- export as_echo_body +- as_echo='sh -c $as_echo_body as_echo' +-fi +- +-# The user is always right. +-if test "${PATH_SEPARATOR+set}" != set; then +- PATH_SEPARATOR=: +- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { +- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || +- PATH_SEPARATOR=';' +- } +-fi +- +- +-# IFS +-# We need space, tab and new line, in precisely that order. Quoting is +-# there to prevent editors from complaining about space-tab. +-# (If _AS_PATH_WALK were called with IFS unset, it would disable word +-# splitting by setting IFS to empty value.) +-IFS=" "" $as_nl" +- +-# Find who we are. Look in the path if we contain no directory separator. +-as_myself= +-case $0 in @%:@(( +- *[\\/]* ) as_myself=$0 ;; +- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-do +- IFS=$as_save_IFS +- test -z "$as_dir" && as_dir=. +- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-# We did not find ourselves, most probably we were run as `sh COMMAND' +-# in which case we are not to be found in the path. +-if test "x$as_myself" = x; then +- as_myself=$0 +-fi +-if test ! -f "$as_myself"; then +- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 +- exit 1 +-fi +- +-# Unset variables that we do not need and which cause bugs (e.g. in +-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +-# suppresses any "Segmentation fault" message there. '((' could +-# trigger a bug in pdksh 5.2.14. +-for as_var in BASH_ENV ENV MAIL MAILPATH +-do eval test x\${$as_var+set} = xset \ +- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +-done +-PS1='$ ' +-PS2='> ' +-PS4='+ ' +- +-# NLS nuisances. +-LC_ALL=C +-export LC_ALL +-LANGUAGE=C +-export LANGUAGE +- +-# CDPATH. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +- +-@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +-@%:@ ---------------------------------------- +-@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +-@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +-@%:@ script with STATUS, using 1 if that was 0. +-as_fn_error () +-{ +- as_status=$1; test $as_status -eq 0 && as_status=1 +- if test "$4"; then +- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 +- fi +- $as_echo "$as_me: error: $2" >&2 +- as_fn_exit $as_status +-} @%:@ as_fn_error +- +- +-@%:@ as_fn_set_status STATUS +-@%:@ ----------------------- +-@%:@ Set @S|@? to STATUS, without forking. +-as_fn_set_status () +-{ +- return $1 +-} @%:@ as_fn_set_status +- +-@%:@ as_fn_exit STATUS +-@%:@ ----------------- +-@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +-as_fn_exit () +-{ +- set +e +- as_fn_set_status $1 +- exit $1 +-} @%:@ as_fn_exit +- +-@%:@ as_fn_unset VAR +-@%:@ --------------- +-@%:@ Portably unset VAR. +-as_fn_unset () +-{ +- { eval $1=; unset $1;} +-} +-as_unset=as_fn_unset +-@%:@ as_fn_append VAR VALUE +-@%:@ ---------------------- +-@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +-@%:@ advantage of any shell optimizations that allow amortized linear growth over +-@%:@ repeated appends, instead of the typical quadratic growth present in naive +-@%:@ implementations. +-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +- eval 'as_fn_append () +- { +- eval $1+=\$2 +- }' +-else +- as_fn_append () +- { +- eval $1=\$$1\$2 +- } +-fi # as_fn_append +- +-@%:@ as_fn_arith ARG... +-@%:@ ------------------ +-@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +-@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +-@%:@ must be portable across @S|@(()) and expr. +-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +- eval 'as_fn_arith () +- { +- as_val=$(( $* )) +- }' +-else +- as_fn_arith () +- { +- as_val=`expr "$@" || test $? -eq 1` +- } +-fi # as_fn_arith +- +- +-if expr a : '\(a\)' >/dev/null 2>&1 && +- test "X`expr 00001 : '.*\(...\)'`" = X001; then +- as_expr=expr +-else +- as_expr=false +-fi +- +-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then +- as_basename=basename +-else +- as_basename=false +-fi +- +-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then +- as_dirname=dirname +-else +- as_dirname=false +-fi +- +-as_me=`$as_basename -- "$0" || +-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ +- X"$0" : 'X\(//\)$' \| \ +- X"$0" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X/"$0" | +- sed '/^.*\/\([^/][^/]*\)\/*$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\/\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- +-# Avoid depending upon Character Ranges. +-as_cr_letters='abcdefghijklmnopqrstuvwxyz' +-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +-as_cr_Letters=$as_cr_letters$as_cr_LETTERS +-as_cr_digits='0123456789' +-as_cr_alnum=$as_cr_Letters$as_cr_digits +- +-ECHO_C= ECHO_N= ECHO_T= +-case `echo -n x` in @%:@((((( +--n*) +- case `echo 'xy\c'` in +- *c*) ECHO_T=' ';; # ECHO_T is single tab character. +- xy) ECHO_C='\c';; +- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null +- ECHO_T=' ';; +- esac;; +-*) +- ECHO_N='-n';; +-esac +- +-rm -f conf$$ conf$$.exe conf$$.file +-if test -d conf$$.dir; then +- rm -f conf$$.dir/conf$$.file +-else +- rm -f conf$$.dir +- mkdir conf$$.dir 2>/dev/null +-fi +-if (echo >conf$$.file) 2>/dev/null; then +- if ln -s conf$$.file conf$$ 2>/dev/null; then +- as_ln_s='ln -s' +- # ... but there are two gotchas: +- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. +- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. +- # In both cases, we have to default to `cp -pR'. +- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || +- as_ln_s='cp -pR' +- elif ln conf$$.file conf$$ 2>/dev/null; then +- as_ln_s=ln +- else +- as_ln_s='cp -pR' +- fi +-else +- as_ln_s='cp -pR' +-fi +-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +-rmdir conf$$.dir 2>/dev/null +- +- +-@%:@ as_fn_mkdir_p +-@%:@ ------------- +-@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +-as_fn_mkdir_p () +-{ +- +- case $as_dir in #( +- -*) as_dir=./$as_dir;; +- esac +- test -d "$as_dir" || eval $as_mkdir_p || { +- as_dirs= +- while :; do +- case $as_dir in #( +- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( +- *) as_qdir=$as_dir;; +- esac +- as_dirs="'$as_qdir' $as_dirs" +- as_dir=`$as_dirname -- "$as_dir" || +-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$as_dir" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- test -d "$as_dir" && break +- done +- test -z "$as_dirs" || eval "mkdir $as_dirs" +- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" +- +- +-} @%:@ as_fn_mkdir_p +-if mkdir -p . 2>/dev/null; then +- as_mkdir_p='mkdir -p "$as_dir"' +-else +- test -d ./-p && rmdir ./-p +- as_mkdir_p=false +-fi +- +- +-@%:@ as_fn_executable_p FILE +-@%:@ ----------------------- +-@%:@ Test if FILE is an executable regular file. +-as_fn_executable_p () +-{ +- test -f "$1" && test -x "$1" +-} @%:@ as_fn_executable_p +-as_test_x='test -x' +-as_executable_p=as_fn_executable_p +- +-# Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" +- +-# Sed expression to map a string onto a valid variable name. +-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" +- +- +-exec 6>&1 +-## ----------------------------------- ## +-## Main body of $CONFIG_STATUS script. ## +-## ----------------------------------- ## +-_ASEOF +-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-# Save the log message, to keep $0 and so on meaningful, and to +-# report actual input values of CONFIG_FILES etc. instead of their +-# values after options handling. +-ac_log=" +-This file was extended by GNU MP $as_me 6.0.0, which was +-generated by GNU Autoconf 2.69. Invocation command line was +- +- CONFIG_FILES = $CONFIG_FILES +- CONFIG_HEADERS = $CONFIG_HEADERS +- CONFIG_LINKS = $CONFIG_LINKS +- CONFIG_COMMANDS = $CONFIG_COMMANDS +- $ $0 $@ +- +-on `(hostname || uname -n) 2>/dev/null | sed 1q` +-" +- +-_ACEOF +- +-case $ac_config_files in *" +-"*) set x $ac_config_files; shift; ac_config_files=$*;; +-esac +- +-case $ac_config_headers in *" +-"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +-esac +- +- +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-# Files that config.status was made for. +-config_files="$ac_config_files" +-config_headers="$ac_config_headers" +-config_links="$ac_config_links" +-config_commands="$ac_config_commands" +- +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-ac_cs_usage="\ +-\`$as_me' instantiates files and other configuration actions +-from templates according to the current configuration. Unless the files +-and actions are specified as TAGs, all are instantiated by default. +- +-Usage: $0 [OPTION]... [TAG]... +- +- -h, --help print this help, then exit +- -V, --version print version number and configuration settings, then exit +- --config print configuration, then exit +- -q, --quiet, --silent +- do not print progress messages +- -d, --debug don't remove temporary files +- --recheck update $as_me by reconfiguring in the same conditions +- --file=FILE[:TEMPLATE] +- instantiate the configuration file FILE +- --header=FILE[:TEMPLATE] +- instantiate the configuration header FILE +- +-Configuration files: +-$config_files +- +-Configuration headers: +-$config_headers +- +-Configuration links: +-$config_links +- +-Configuration commands: +-$config_commands +- +-Report bugs to . +-GNU MP home page: . +-General help using GNU software: ." +- +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +-ac_cs_version="\\ +-GNU MP config.status 6.0.0 +-configured by $0, generated by GNU Autoconf 2.69, +- with options \\"\$ac_cs_config\\" +- +-Copyright (C) 2012 Free Software Foundation, Inc. +-This config.status script is free software; the Free Software Foundation +-gives unlimited permission to copy, distribute and modify it." +- +-ac_pwd='$ac_pwd' +-srcdir='$srcdir' +-INSTALL='$INSTALL' +-MKDIR_P='$MKDIR_P' +-AWK='$AWK' +-test -n "\$AWK" || AWK=awk +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-# The default lists apply if the user does not specify any file. +-ac_need_defaults=: +-while test $# != 0 +-do +- case $1 in +- --*=?*) +- ac_option=`expr "X$1" : 'X\([^=]*\)='` +- ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` +- ac_shift=: +- ;; +- --*=) +- ac_option=`expr "X$1" : 'X\([^=]*\)='` +- ac_optarg= +- ac_shift=: +- ;; +- *) +- ac_option=$1 +- ac_optarg=$2 +- ac_shift=shift +- ;; +- esac +- +- case $ac_option in +- # Handling of the options. +- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) +- ac_cs_recheck=: ;; +- --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) +- $as_echo "$ac_cs_version"; exit ;; +- --config | --confi | --conf | --con | --co | --c ) +- $as_echo "$ac_cs_config"; exit ;; +- --debug | --debu | --deb | --de | --d | -d ) +- debug=: ;; +- --file | --fil | --fi | --f ) +- $ac_shift +- case $ac_optarg in +- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; +- '') as_fn_error $? "missing file argument" ;; +- esac +- as_fn_append CONFIG_FILES " '$ac_optarg'" +- ac_need_defaults=false;; +- --header | --heade | --head | --hea ) +- $ac_shift +- case $ac_optarg in +- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; +- esac +- as_fn_append CONFIG_HEADERS " '$ac_optarg'" +- ac_need_defaults=false;; +- --he | --h) +- # Conflict between --help and --header +- as_fn_error $? "ambiguous option: \`$1' +-Try \`$0 --help' for more information.";; +- --help | --hel | -h ) +- $as_echo "$ac_cs_usage"; exit ;; +- -q | -quiet | --quiet | --quie | --qui | --qu | --q \ +- | -silent | --silent | --silen | --sile | --sil | --si | --s) +- ac_cs_silent=: ;; +- +- # This is an error. +- -*) as_fn_error $? "unrecognized option: \`$1' +-Try \`$0 --help' for more information." ;; +- +- *) as_fn_append ac_config_targets " $1" +- ac_need_defaults=false ;; +- +- esac +- shift +-done +- +-ac_configure_extra_args= +- +-if $ac_cs_silent; then +- exec 6>/dev/null +- ac_configure_extra_args="$ac_configure_extra_args --silent" +-fi +- +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-if \$ac_cs_recheck; then +- set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +- shift +- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 +- CONFIG_SHELL='$SHELL' +- export CONFIG_SHELL +- exec "\$@" +-fi +- +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-exec 5>>config.log +-{ +- echo +- sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +-@%:@@%:@ Running $as_me. @%:@@%:@ +-_ASBOX +- $as_echo "$ac_log" +-} >&5 +- +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-# +-# INIT-COMMANDS +-# +- +- +-# The HP-UX ksh and POSIX shell print the target directory to stdout +-# if CDPATH is set. +-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH +- +-sed_quote_subst='$sed_quote_subst' +-double_quote_subst='$double_quote_subst' +-delay_variable_subst='$delay_variable_subst' +-NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +-AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +-DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +-OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +-macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +-macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +-enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +-enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +-pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +-enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +-SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +-ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +-PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +-host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +-host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +-host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +-build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +-build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +-build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +-SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +-Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +-GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +-EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +-FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +-LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +-LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +-max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +-ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +-exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +-lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +-lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +-lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +-lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +-lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +-reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +-reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +-deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +-file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +-file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +-want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +-sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +-AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +-AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +-archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +-STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +-RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +-old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +-old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +-old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +-lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +-CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +-CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +-compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +-GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +-nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +-lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +-objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +-MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +-lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +-need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +-MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +-DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +-NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +-LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +-OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +-OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +-libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +-shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +-extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +-archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +-enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +-export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +-whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +-compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +-old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +-old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +-archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +-archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +-module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +-module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +-with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +-allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +-no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +-hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +-hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +-hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +-hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +-hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +-inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +-link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +-always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +-export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +-exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +-include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +-prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +-postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +-file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +-variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +-need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +-need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +-version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +-runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +-shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +-shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +-libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +-library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +-soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +-install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +-postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +-postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +-finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +-finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +-hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +-sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +-hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +-enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +-enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +-enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +-old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +-striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +-predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +-postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +-predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +-postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +-LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +-reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +-reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +-GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +-lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +-lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +-archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +-enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +-export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +-whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +-old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +-allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +-no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +-inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +-link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +-always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +-export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +-include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +-prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +-file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +-hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +-predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +-postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +-predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +-postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +-compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' +- +-LTCC='$LTCC' +-LTCFLAGS='$LTCFLAGS' +-compiler='$compiler_DEFAULT' +- +-# A function that is used when there is no print builtin or printf. +-func_fallback_echo () +-{ +- eval 'cat <<_LTECHO_EOF +-\$1 +-_LTECHO_EOF' +-} +- +-# Quote evaled strings. +-for var in NM \ +-AS \ +-DLLTOOL \ +-OBJDUMP \ +-SHELL \ +-ECHO \ +-PATH_SEPARATOR \ +-SED \ +-GREP \ +-EGREP \ +-FGREP \ +-LD \ +-LN_S \ +-lt_SP2NL \ +-lt_NL2SP \ +-reload_flag \ +-deplibs_check_method \ +-file_magic_cmd \ +-file_magic_glob \ +-want_nocaseglob \ +-sharedlib_from_linklib_cmd \ +-AR \ +-AR_FLAGS \ +-archiver_list_spec \ +-STRIP \ +-RANLIB \ +-CC \ +-CFLAGS \ +-compiler \ +-lt_cv_sys_global_symbol_pipe \ +-lt_cv_sys_global_symbol_to_cdecl \ +-lt_cv_sys_global_symbol_to_c_name_address \ +-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +-nm_file_list_spec \ +-lt_prog_compiler_no_builtin_flag \ +-lt_prog_compiler_pic \ +-lt_prog_compiler_wl \ +-lt_prog_compiler_static \ +-lt_cv_prog_compiler_c_o \ +-need_locks \ +-MANIFEST_TOOL \ +-DSYMUTIL \ +-NMEDIT \ +-LIPO \ +-OTOOL \ +-OTOOL64 \ +-shrext_cmds \ +-export_dynamic_flag_spec \ +-whole_archive_flag_spec \ +-compiler_needs_object \ +-with_gnu_ld \ +-allow_undefined_flag \ +-no_undefined_flag \ +-hardcode_libdir_flag_spec \ +-hardcode_libdir_separator \ +-exclude_expsyms \ +-include_expsyms \ +-file_list_spec \ +-variables_saved_for_relink \ +-libname_spec \ +-library_names_spec \ +-soname_spec \ +-install_override_mode \ +-finish_eval \ +-old_striplib \ +-striplib \ +-compiler_lib_search_dirs \ +-predep_objects \ +-postdep_objects \ +-predeps \ +-postdeps \ +-compiler_lib_search_path \ +-LD_CXX \ +-reload_flag_CXX \ +-compiler_CXX \ +-lt_prog_compiler_no_builtin_flag_CXX \ +-lt_prog_compiler_pic_CXX \ +-lt_prog_compiler_wl_CXX \ +-lt_prog_compiler_static_CXX \ +-lt_cv_prog_compiler_c_o_CXX \ +-export_dynamic_flag_spec_CXX \ +-whole_archive_flag_spec_CXX \ +-compiler_needs_object_CXX \ +-with_gnu_ld_CXX \ +-allow_undefined_flag_CXX \ +-no_undefined_flag_CXX \ +-hardcode_libdir_flag_spec_CXX \ +-hardcode_libdir_separator_CXX \ +-exclude_expsyms_CXX \ +-include_expsyms_CXX \ +-file_list_spec_CXX \ +-compiler_lib_search_dirs_CXX \ +-predep_objects_CXX \ +-postdep_objects_CXX \ +-predeps_CXX \ +-postdeps_CXX \ +-compiler_lib_search_path_CXX; do +- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in +- *[\\\\\\\`\\"\\\$]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" +- ;; +- *) +- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" +- ;; +- esac +-done +- +-# Double-quote double-evaled strings. +-for var in reload_cmds \ +-old_postinstall_cmds \ +-old_postuninstall_cmds \ +-old_archive_cmds \ +-extract_expsyms_cmds \ +-old_archive_from_new_cmds \ +-old_archive_from_expsyms_cmds \ +-archive_cmds \ +-archive_expsym_cmds \ +-module_cmds \ +-module_expsym_cmds \ +-export_symbols_cmds \ +-prelink_cmds \ +-postlink_cmds \ +-postinstall_cmds \ +-postuninstall_cmds \ +-finish_cmds \ +-sys_lib_search_path_spec \ +-sys_lib_dlsearch_path_spec \ +-reload_cmds_CXX \ +-old_archive_cmds_CXX \ +-old_archive_from_new_cmds_CXX \ +-old_archive_from_expsyms_cmds_CXX \ +-archive_cmds_CXX \ +-archive_expsym_cmds_CXX \ +-module_cmds_CXX \ +-module_expsym_cmds_CXX \ +-export_symbols_cmds_CXX \ +-prelink_cmds_CXX \ +-postlink_cmds_CXX; do +- case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in +- *[\\\\\\\`\\"\\\$]*) +- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" +- ;; +- *) +- eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" +- ;; +- esac +-done +- +-ac_aux_dir='$ac_aux_dir' +-xsi_shell='$xsi_shell' +-lt_shell_append='$lt_shell_append' +- +-# See if we are running on zsh, and set the options which allow our +-# commands through without removal of \ escapes INIT. +-if test -n "\${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +-fi +- +- +- PACKAGE='$PACKAGE' +- VERSION='$VERSION' +- TIMESTAMP='$TIMESTAMP' +- RM='$RM' +- ofile='$ofile' +- +- +- +- +- +- +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- +-# Handling of arguments. +-for ac_config_target in $ac_config_targets +-do +- case $ac_config_target in +- "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; +- "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; +- "mpn/$tmp_fn.$tmp_ext") CONFIG_LINKS="$CONFIG_LINKS mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext" ;; +- "gmp-mparam.h") CONFIG_LINKS="$CONFIG_LINKS gmp-mparam.h:mpn/$gmp_mparam_dir/gmp-mparam.h" ;; +- "demos/pexpr-config.h") CONFIG_FILES="$CONFIG_FILES demos/pexpr-config.h:demos/pexpr-config-h.in" ;; +- "demos/calc/calc-config.h") CONFIG_FILES="$CONFIG_FILES demos/calc/calc-config.h:demos/calc/calc-config-h.in" ;; +- "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; +- "mpf/Makefile") CONFIG_FILES="$CONFIG_FILES mpf/Makefile" ;; +- "mpn/Makefile") CONFIG_FILES="$CONFIG_FILES mpn/Makefile" ;; +- "mpq/Makefile") CONFIG_FILES="$CONFIG_FILES mpq/Makefile" ;; +- "mpz/Makefile") CONFIG_FILES="$CONFIG_FILES mpz/Makefile" ;; +- "printf/Makefile") CONFIG_FILES="$CONFIG_FILES printf/Makefile" ;; +- "scanf/Makefile") CONFIG_FILES="$CONFIG_FILES scanf/Makefile" ;; +- "rand/Makefile") CONFIG_FILES="$CONFIG_FILES rand/Makefile" ;; +- "cxx/Makefile") CONFIG_FILES="$CONFIG_FILES cxx/Makefile" ;; +- "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; +- "tests/devel/Makefile") CONFIG_FILES="$CONFIG_FILES tests/devel/Makefile" ;; +- "tests/mpf/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpf/Makefile" ;; +- "tests/mpn/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpn/Makefile" ;; +- "tests/mpq/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpq/Makefile" ;; +- "tests/mpz/Makefile") CONFIG_FILES="$CONFIG_FILES tests/mpz/Makefile" ;; +- "tests/rand/Makefile") CONFIG_FILES="$CONFIG_FILES tests/rand/Makefile" ;; +- "tests/misc/Makefile") CONFIG_FILES="$CONFIG_FILES tests/misc/Makefile" ;; +- "tests/cxx/Makefile") CONFIG_FILES="$CONFIG_FILES tests/cxx/Makefile" ;; +- "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; +- "tune/Makefile") CONFIG_FILES="$CONFIG_FILES tune/Makefile" ;; +- "demos/Makefile") CONFIG_FILES="$CONFIG_FILES demos/Makefile" ;; +- "demos/calc/Makefile") CONFIG_FILES="$CONFIG_FILES demos/calc/Makefile" ;; +- "demos/expr/Makefile") CONFIG_FILES="$CONFIG_FILES demos/expr/Makefile" ;; +- "gmp.h") CONFIG_FILES="$CONFIG_FILES gmp.h:gmp-h.in" ;; +- +- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; +- esac +-done +- +- +-# If the user did not use the arguments to specify the items to instantiate, +-# then the envvar interface is used. Set only those that are not. +-# We use the long form for the default assignment because of an extremely +-# bizarre bug on SunOS 4.1.3. +-if $ac_need_defaults; then +- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +- test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links +- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +-fi +- +-# Have a temporary directory for convenience. Make it in the build tree +-# simply because there is no reason against having it here, and in addition, +-# creating and moving files from /tmp can sometimes cause problems. +-# Hook for its removal unless debugging. +-# Note that there is a small window in which the directory will not be cleaned: +-# after its creation but before its name has been assigned to `$tmp'. +-$debug || +-{ +- tmp= ac_tmp= +- trap 'exit_status=$? +- : "${ac_tmp:=$tmp}" +- { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +-' 0 +- trap 'as_fn_exit 1' 1 2 13 15 +-} +-# Create a (secure) tmp directory for tmp files. +- +-{ +- tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && +- test -d "$tmp" +-} || +-{ +- tmp=./conf$$-$RANDOM +- (umask 077 && mkdir "$tmp") +-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +-ac_tmp=$tmp +- +-# Set up the scripts for CONFIG_FILES section. +-# No need to generate them if there are no CONFIG_FILES. +-# This happens for instance with `./config.status config.h'. +-if test -n "$CONFIG_FILES"; then +- +- +-ac_cr=`echo X | tr X '\015'` +-# On cygwin, bash can eat \r inside `` if the user requested igncr. +-# But we know of no other shell where ac_cr would be empty at this +-# point, so we can use a bashism as a fallback. +-if test "x$ac_cr" = x; then +- eval ac_cr=\$\'\\r\' +-fi +-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then +- ac_cs_awk_cr='\\r' +-else +- ac_cs_awk_cr=$ac_cr +-fi +- +-echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +-_ACEOF +- +- +-{ +- echo "cat >conf$$subs.awk <<_ACEOF" && +- echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && +- echo "_ACEOF" +-} >conf$$subs.sh || +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +-ac_delim='%!_!# ' +-for ac_last_try in false false false false false :; do +- . ./conf$$subs.sh || +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +- +- ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` +- if test $ac_delim_n = $ac_delim_num; then +- break +- elif $ac_last_try; then +- as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +- else +- ac_delim="$ac_delim!$ac_delim _$ac_delim!! " +- fi +-done +-rm -f conf$$subs.sh +- +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +-_ACEOF +-sed -n ' +-h +-s/^/S["/; s/!.*/"]=/ +-p +-g +-s/^[^!]*!// +-:repl +-t repl +-s/'"$ac_delim"'$// +-t delim +-:nl +-h +-s/\(.\{148\}\)..*/\1/ +-t more1 +-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +-p +-n +-b repl +-:more1 +-s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +-p +-g +-s/.\{148\}// +-t nl +-:delim +-h +-s/\(.\{148\}\)..*/\1/ +-t more2 +-s/["\\]/\\&/g; s/^/"/; s/$/"/ +-p +-b +-:more2 +-s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +-p +-g +-s/.\{148\}// +-t delim +-' >$CONFIG_STATUS || ac_write_fail=1 +-rm -f conf$$subs.awk +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-_ACAWK +-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +- for (key in S) S_is_set[key] = 1 +- FS = "" +- +-} +-{ +- line = $ 0 +- nfields = split(line, field, "@") +- substed = 0 +- len = length(field[1]) +- for (i = 2; i < nfields; i++) { +- key = field[i] +- keylen = length(key) +- if (S_is_set[key]) { +- value = S[key] +- line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) +- len += length(value) + length(field[++i]) +- substed = 1 +- } else +- len += 1 + keylen +- } +- +- print line +-} +- +-_ACAWK +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then +- sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +-else +- cat +-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ +- || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +-_ACEOF +- +-# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +-# trailing colons and then remove the whole line if VPATH becomes empty +-# (actually we leave an empty line to preserve line numbers). +-if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +-h +-s/// +-s/^/:/ +-s/[ ]*$/:/ +-s/:\$(srcdir):/:/g +-s/:\${srcdir}:/:/g +-s/:@srcdir@:/:/g +-s/^:*// +-s/:*$// +-x +-s/\(=[ ]*\).*/\1/ +-G +-s/\n// +-s/^[^=]*=[ ]*$// +-}' +-fi +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-fi # test -n "$CONFIG_FILES" +- +-# Set up the scripts for CONFIG_HEADERS section. +-# No need to generate them if there are no CONFIG_HEADERS. +-# This happens for instance with `./config.status Makefile'. +-if test -n "$CONFIG_HEADERS"; then +-cat >"$ac_tmp/defines.awk" <<\_ACAWK || +-BEGIN { +-_ACEOF +- +-# Transform confdefs.h into an awk script `defines.awk', embedded as +-# here-document in config.status, that substitutes the proper values into +-# config.h.in to produce config.h. +- +-# Create a delimiter string that does not exist in confdefs.h, to ease +-# handling of long lines. +-ac_delim='%!_!# ' +-for ac_last_try in false false :; do +- ac_tt=`sed -n "/$ac_delim/p" confdefs.h` +- if test -z "$ac_tt"; then +- break +- elif $ac_last_try; then +- as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 +- else +- ac_delim="$ac_delim!$ac_delim _$ac_delim!! " +- fi +-done +- +-# For the awk script, D is an array of macro values keyed by name, +-# likewise P contains macro parameters if any. Preserve backslash +-# newline sequences. +- +-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +-sed -n ' +-s/.\{148\}/&'"$ac_delim"'/g +-t rset +-:rset +-s/^[ ]*#[ ]*define[ ][ ]*/ / +-t def +-d +-:def +-s/\\$// +-t bsnl +-s/["\\]/\\&/g +-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +-D["\1"]=" \3"/p +-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +-d +-:bsnl +-s/["\\]/\\&/g +-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +-D["\1"]=" \3\\\\\\n"\\/p +-t cont +-s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +-t cont +-d +-:cont +-n +-s/.\{148\}/&'"$ac_delim"'/g +-t clear +-:clear +-s/\\$// +-t bsnlc +-s/["\\]/\\&/g; s/^/"/; s/$/"/p +-d +-:bsnlc +-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +-b cont +-' >$CONFIG_STATUS || ac_write_fail=1 +- +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +- for (key in D) D_is_set[key] = 1 +- FS = "" +-} +-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { +- line = \$ 0 +- split(line, arg, " ") +- if (arg[1] == "#") { +- defundef = arg[2] +- mac1 = arg[3] +- } else { +- defundef = substr(arg[1], 2) +- mac1 = arg[2] +- } +- split(mac1, mac2, "(") #) +- macro = mac2[1] +- prefix = substr(line, 1, index(line, defundef) - 1) +- if (D_is_set[macro]) { +- # Preserve the white space surrounding the "#". +- print prefix "define", macro P[macro] D[macro] +- next +- } else { +- # Replace #undef with comments. This is necessary, for example, +- # in the case of _POSIX_SOURCE, which is predefined and required +- # on some systems where configure will not decide to define it. +- if (defundef == "undef") { +- print "/*", prefix defundef, macro, "*/" +- next +- } +- } +-} +-{ print } +-_ACAWK +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +- as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +-fi # test -n "$CONFIG_HEADERS" +- +- +-eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" +-shift +-for ac_tag +-do +- case $ac_tag in +- :[FHLC]) ac_mode=$ac_tag; continue;; +- esac +- case $ac_mode$ac_tag in +- :[FHL]*:*);; +- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; +- :[FH]-) ac_tag=-:-;; +- :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; +- esac +- ac_save_IFS=$IFS +- IFS=: +- set x $ac_tag +- IFS=$ac_save_IFS +- shift +- ac_file=$1 +- shift +- +- case $ac_mode in +- :L) ac_source=$1;; +- :[FH]) +- ac_file_inputs= +- for ac_f +- do +- case $ac_f in +- -) ac_f="$ac_tmp/stdin";; +- *) # Look for the file first in the build tree, then in the source tree +- # (if the path is not absolute). The absolute path cannot be DOS-style, +- # because $ac_f cannot contain `:'. +- test -f "$ac_f" || +- case $ac_f in +- [\\/$]*) false;; +- *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; +- esac || +- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; +- esac +- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac +- as_fn_append ac_file_inputs " '$ac_f'" +- done +- +- # Let's still pretend it is `configure' which instantiates (i.e., don't +- # use $as_me), people would be surprised to read: +- # /* config.h. Generated by config.status. */ +- configure_input='Generated from '` +- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' +- `' by configure.' +- if test x"$ac_file" != x-; then +- configure_input="$ac_file. $configure_input" +- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +-$as_echo "$as_me: creating $ac_file" >&6;} +- fi +- # Neutralize special characters interpreted by sed in replacement strings. +- case $configure_input in #( +- *\&* | *\|* | *\\* ) +- ac_sed_conf_input=`$as_echo "$configure_input" | +- sed 's/[\\\\&|]/\\\\&/g'`;; #( +- *) ac_sed_conf_input=$configure_input;; +- esac +- +- case $ac_tag in +- *:-:* | *:-) cat >"$ac_tmp/stdin" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; +- esac +- ;; +- esac +- +- ac_dir=`$as_dirname -- "$ac_file" || +-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_file" : 'X\(//\)[^/]' \| \ +- X"$ac_file" : 'X\(//\)$' \| \ +- X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$ac_file" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'` +- as_dir="$ac_dir"; as_fn_mkdir_p +- ac_builddir=. +- +-case "$ac_dir" in +-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +-*) +- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` +- # A ".." for each directory in $ac_dir_suffix. +- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` +- case $ac_top_builddir_sub in +- "") ac_top_builddir_sub=. ac_top_build_prefix= ;; +- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; +- esac ;; +-esac +-ac_abs_top_builddir=$ac_pwd +-ac_abs_builddir=$ac_pwd$ac_dir_suffix +-# for backward compatibility: +-ac_top_builddir=$ac_top_build_prefix +- +-case $srcdir in +- .) # We are building in place. +- ac_srcdir=. +- ac_top_srcdir=$ac_top_builddir_sub +- ac_abs_top_srcdir=$ac_pwd ;; +- [\\/]* | ?:[\\/]* ) # Absolute name. +- ac_srcdir=$srcdir$ac_dir_suffix; +- ac_top_srcdir=$srcdir +- ac_abs_top_srcdir=$srcdir ;; +- *) # Relative name. +- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix +- ac_top_srcdir=$ac_top_build_prefix$srcdir +- ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +-esac +-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix +- +- +- case $ac_mode in +- :F) +- # +- # CONFIG_FILE +- # +- +- case $INSTALL in +- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; +- *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; +- esac +- ac_MKDIR_P=$MKDIR_P +- case $MKDIR_P in +- [\\/$]* | ?:[\\/]* ) ;; +- */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; +- esac +-_ACEOF +- +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-# If the template does not know about datarootdir, expand it. +-# FIXME: This hack should be removed a few years after 2.60. +-ac_datarootdir_hack=; ac_datarootdir_seen= +-ac_sed_dataroot=' +-/datarootdir/ { +- p +- q +-} +-/@datadir@/p +-/@docdir@/p +-/@infodir@/p +-/@localedir@/p +-/@mandir@/p' +-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +-*datarootdir*) ac_datarootdir_seen=yes;; +-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +-_ACEOF +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +- ac_datarootdir_hack=' +- s&@datadir@&$datadir&g +- s&@docdir@&$docdir&g +- s&@infodir@&$infodir&g +- s&@localedir@&$localedir&g +- s&@mandir@&$mandir&g +- s&\\\${datarootdir}&$datarootdir&g' ;; +-esac +-_ACEOF +- +-# Neutralize VPATH when `$srcdir' = `.'. +-# Shell code in configure.ac might set extrasub. +-# FIXME: do we really want to maintain this feature? +-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +-ac_sed_extra="$ac_vpsub +-$extrasub +-_ACEOF +-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +-:t +-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +-s|@configure_input@|$ac_sed_conf_input|;t t +-s&@top_builddir@&$ac_top_builddir_sub&;t t +-s&@top_build_prefix@&$ac_top_build_prefix&;t t +-s&@srcdir@&$ac_srcdir&;t t +-s&@abs_srcdir@&$ac_abs_srcdir&;t t +-s&@top_srcdir@&$ac_top_srcdir&;t t +-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +-s&@builddir@&$ac_builddir&;t t +-s&@abs_builddir@&$ac_abs_builddir&;t t +-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +-s&@INSTALL@&$ac_INSTALL&;t t +-s&@MKDIR_P@&$ac_MKDIR_P&;t t +-$ac_datarootdir_hack +-" +-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ +- >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- +-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && +- { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && +- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ +- "$ac_tmp/out"`; test -z "$ac_out"; } && +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined" >&5 +-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +-which seems to be undefined. Please make sure it is defined" >&2;} +- +- rm -f "$ac_tmp/stdin" +- case $ac_file in +- -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; +- *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; +- esac \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- ;; +- :H) +- # +- # CONFIG_HEADER +- # +- if test x"$ac_file" != x-; then +- { +- $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" +- } >"$ac_tmp/config.h" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +-$as_echo "$as_me: $ac_file is unchanged" >&6;} +- else +- rm -f "$ac_file" +- mv "$ac_tmp/config.h" "$ac_file" \ +- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +- fi +- else +- $as_echo "/* $configure_input */" \ +- && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ +- || as_fn_error $? "could not create -" "$LINENO" 5 +- fi +-# Compute "$ac_file"'s index in $config_headers. +-_am_arg="$ac_file" +-_am_stamp_count=1 +-for _am_header in $config_headers :; do +- case $_am_header in +- $_am_arg | $_am_arg:* ) +- break ;; +- * ) +- _am_stamp_count=`expr $_am_stamp_count + 1` ;; +- esac +-done +-echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +-$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$_am_arg" : 'X\(//\)[^/]' \| \ +- X"$_am_arg" : 'X\(//\)$' \| \ +- X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +-$as_echo X"$_am_arg" | +- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)[^/].*/{ +- s//\1/ +- q +- } +- /^X\(\/\/\)$/{ +- s//\1/ +- q +- } +- /^X\(\/\).*/{ +- s//\1/ +- q +- } +- s/.*/./; q'`/stamp-h$_am_stamp_count +- ;; +- :L) +- # +- # CONFIG_LINK +- # +- +- if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then +- : +- else +- # Prefer the file from the source tree if names are identical. +- if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then +- ac_source=$srcdir/$ac_source +- fi +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 +-$as_echo "$as_me: linking $ac_source to $ac_file" >&6;} +- +- if test ! -r "$ac_source"; then +- as_fn_error $? "$ac_source: file not found" "$LINENO" 5 +- fi +- rm -f "$ac_file" +- +- # Try a relative symlink, then a hard link, then a copy. +- case $ac_source in +- [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; +- *) ac_rel_source=$ac_top_build_prefix$ac_source ;; +- esac +- ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || +- ln "$ac_source" "$ac_file" 2>/dev/null || +- cp -p "$ac_source" "$ac_file" || +- as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 +- fi +- ;; +- :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +-$as_echo "$as_me: executing $ac_file commands" >&6;} +- ;; +- esac +- +- +- case $ac_file$ac_mode in +- "libtool":C) +- +- # See if we are running on zsh, and set the options which allow our +- # commands through without removal of \ escapes. +- if test -n "${ZSH_VERSION+set}" ; then +- setopt NO_GLOB_SUBST +- fi +- +- cfgfile="${ofile}T" +- trap "$RM \"$cfgfile\"; exit 1" 1 2 15 +- $RM "$cfgfile" +- +- cat <<_LT_EOF >> "$cfgfile" +-#! $SHELL +- +-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +-# NOTE: Changes made to this file will be lost: look at ltmain.sh. +-# +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +-# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +-# Foundation, Inc. +-# Written by Gordon Matzigkeit, 1996 +-# +-# This file is part of GNU Libtool. +-# +-# GNU Libtool 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 of +-# the License, or (at your option) any later version. +-# +-# As a special exception to the GNU General Public License, +-# if you distribute this file as part of a program or library that +-# is built using GNU Libtool, you may include this file under the +-# same distribution terms that you use for the rest of that program. +-# +-# GNU Libtool 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 Libtool; see the file COPYING. If not, a copy +-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +-# obtained by writing to the Free Software Foundation, Inc., +-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +- +- +-# The names of the tagged configurations supported by this script. +-available_tags="CXX " +- +-# ### BEGIN LIBTOOL CONFIG +- +-# A BSD- or MS-compatible name lister. +-NM=$lt_NM +- +-# Assembler program. +-AS=$lt_AS +- +-# DLL creation program. +-DLLTOOL=$lt_DLLTOOL +- +-# Object dumper program. +-OBJDUMP=$lt_OBJDUMP +- +-# Which release of libtool.m4 was used? +-macro_version=$macro_version +-macro_revision=$macro_revision +- +-# Whether or not to build shared libraries. +-build_libtool_libs=$enable_shared +- +-# Whether or not to build static libraries. +-build_old_libs=$enable_static +- +-# What type of objects to build. +-pic_mode=$pic_mode +- +-# Whether or not to optimize for fast installation. +-fast_install=$enable_fast_install +- +-# Shell to use when invoking shell scripts. +-SHELL=$lt_SHELL +- +-# An echo program that protects backslashes. +-ECHO=$lt_ECHO +- +-# The PATH separator for the build system. +-PATH_SEPARATOR=$lt_PATH_SEPARATOR +- +-# The host system. +-host_alias=$host_alias +-host=$host +-host_os=$host_os +- +-# The build system. +-build_alias=$build_alias +-build=$build +-build_os=$build_os +- +-# A sed program that does not truncate output. +-SED=$lt_SED +- +-# Sed that helps us avoid accidentally triggering echo(1) options like -n. +-Xsed="\$SED -e 1s/^X//" +- +-# A grep program that handles long lines. +-GREP=$lt_GREP +- +-# An ERE matcher. +-EGREP=$lt_EGREP +- +-# A literal string matcher. +-FGREP=$lt_FGREP +- +-# Whether we need soft or hard links. +-LN_S=$lt_LN_S +- +-# What is the maximum length of a command? +-max_cmd_len=$max_cmd_len +- +-# Object file suffix (normally "o"). +-objext=$ac_objext +- +-# Executable file suffix (normally ""). +-exeext=$exeext +- +-# whether the shell understands "unset". +-lt_unset=$lt_unset +- +-# turn spaces into newlines. +-SP2NL=$lt_lt_SP2NL +- +-# turn newlines into spaces. +-NL2SP=$lt_lt_NL2SP +- +-# convert \$build file names to \$host format. +-to_host_file_cmd=$lt_cv_to_host_file_cmd +- +-# convert \$build files to toolchain format. +-to_tool_file_cmd=$lt_cv_to_tool_file_cmd +- +-# Method to check whether dependent libraries are shared objects. +-deplibs_check_method=$lt_deplibs_check_method +- +-# Command to use when deplibs_check_method = "file_magic". +-file_magic_cmd=$lt_file_magic_cmd +- +-# How to find potential files when deplibs_check_method = "file_magic". +-file_magic_glob=$lt_file_magic_glob +- +-# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +-want_nocaseglob=$lt_want_nocaseglob +- +-# Command to associate shared and link libraries. +-sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd +- +-# The archiver. +-AR=$lt_AR +- +-# Flags to create an archive. +-AR_FLAGS=$lt_AR_FLAGS +- +-# How to feed a file listing to the archiver. +-archiver_list_spec=$lt_archiver_list_spec +- +-# A symbol stripping program. +-STRIP=$lt_STRIP +- +-# Commands used to install an old-style archive. +-RANLIB=$lt_RANLIB +-old_postinstall_cmds=$lt_old_postinstall_cmds +-old_postuninstall_cmds=$lt_old_postuninstall_cmds +- +-# Whether to use a lock for old archive extraction. +-lock_old_archive_extraction=$lock_old_archive_extraction +- +-# A C compiler. +-LTCC=$lt_CC +- +-# LTCC compiler flags. +-LTCFLAGS=$lt_CFLAGS +- +-# Take the output of nm and produce a listing of raw symbols and C names. +-global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe +- +-# Transform the output of nm in a proper C declaration. +-global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl +- +-# Transform the output of nm in a C name address pair. +-global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address +- +-# Transform the output of nm in a C name address pair when lib prefix is needed. +-global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix +- +-# Specify filename containing input files for \$NM. +-nm_file_list_spec=$lt_nm_file_list_spec +- +-# The root where to search for dependent libraries,and in which our libraries should be installed. +-lt_sysroot=$lt_sysroot +- +-# The name of the directory that contains temporary libtool files. +-objdir=$objdir +- +-# Used to examine libraries when file_magic_cmd begins with "file". +-MAGIC_CMD=$MAGIC_CMD +- +-# Must we lock files when doing compilation? +-need_locks=$lt_need_locks +- +-# Manifest tool. +-MANIFEST_TOOL=$lt_MANIFEST_TOOL +- +-# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +-DSYMUTIL=$lt_DSYMUTIL +- +-# Tool to change global to local symbols on Mac OS X. +-NMEDIT=$lt_NMEDIT +- +-# Tool to manipulate fat objects and archives on Mac OS X. +-LIPO=$lt_LIPO +- +-# ldd/readelf like tool for Mach-O binaries on Mac OS X. +-OTOOL=$lt_OTOOL +- +-# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +-OTOOL64=$lt_OTOOL64 +- +-# Old archive suffix (normally "a"). +-libext=$libext +- +-# Shared library suffix (normally ".so"). +-shrext_cmds=$lt_shrext_cmds +- +-# The commands to extract the exported symbol list from a shared archive. +-extract_expsyms_cmds=$lt_extract_expsyms_cmds +- +-# Variables whose values should be saved in libtool wrapper scripts and +-# restored at link time. +-variables_saved_for_relink=$lt_variables_saved_for_relink +- +-# Do we need the "lib" prefix for modules? +-need_lib_prefix=$need_lib_prefix +- +-# Do we need a version for libraries? +-need_version=$need_version +- +-# Library versioning type. +-version_type=$version_type +- +-# Shared library runtime path variable. +-runpath_var=$runpath_var +- +-# Shared library path variable. +-shlibpath_var=$shlibpath_var +- +-# Is shlibpath searched before the hard-coded library search path? +-shlibpath_overrides_runpath=$shlibpath_overrides_runpath +- +-# Format of library name prefix. +-libname_spec=$lt_libname_spec +- +-# List of archive names. First name is the real one, the rest are links. +-# The last name is the one that the linker finds with -lNAME +-library_names_spec=$lt_library_names_spec +- +-# The coded name of the library, if different from the real name. +-soname_spec=$lt_soname_spec +- +-# Permission mode override for installation of shared libraries. +-install_override_mode=$lt_install_override_mode +- +-# Command to use after installation of a shared archive. +-postinstall_cmds=$lt_postinstall_cmds +- +-# Command to use after uninstallation of a shared archive. +-postuninstall_cmds=$lt_postuninstall_cmds +- +-# Commands used to finish a libtool library installation in a directory. +-finish_cmds=$lt_finish_cmds +- +-# As "finish_cmds", except a single script fragment to be evaled but +-# not shown. +-finish_eval=$lt_finish_eval +- +-# Whether we should hardcode library paths into libraries. +-hardcode_into_libs=$hardcode_into_libs +- +-# Compile-time system search path for libraries. +-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec +- +-# Run-time system search path for libraries. +-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec +- +-# Whether dlopen is supported. +-dlopen_support=$enable_dlopen +- +-# Whether dlopen of programs is supported. +-dlopen_self=$enable_dlopen_self +- +-# Whether dlopen of statically linked programs is supported. +-dlopen_self_static=$enable_dlopen_self_static +- +-# Commands to strip libraries. +-old_striplib=$lt_old_striplib +-striplib=$lt_striplib +- +- +-# The linker used to build libraries. +-LD=$lt_LD +- +-# How to create reloadable object files. +-reload_flag=$lt_reload_flag +-reload_cmds=$lt_reload_cmds +- +-# Commands used to build an old-style archive. +-old_archive_cmds=$lt_old_archive_cmds +- +-# A language specific compiler. +-CC=$lt_compiler +- +-# Is the compiler the GNU compiler? +-with_gcc=$GCC +- +-# Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag +- +-# Additional compiler flags for building library objects. +-pic_flag=$lt_lt_prog_compiler_pic +- +-# How to pass a linker flag through the compiler. +-wl=$lt_lt_prog_compiler_wl +- +-# Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_lt_prog_compiler_static +- +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_lt_cv_prog_compiler_c_o +- +-# Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$archive_cmds_need_lc +- +-# Whether or not to disallow shared libs when runtime libs are static. +-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes +- +-# Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec +- +-# Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec +- +-# Whether the compiler copes with passing no objects directly. +-compiler_needs_object=$lt_compiler_needs_object +- +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds +- +-# Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds +- +-# Commands used to build a shared archive. +-archive_cmds=$lt_archive_cmds +-archive_expsym_cmds=$lt_archive_expsym_cmds +- +-# Commands used to build a loadable module if different from building +-# a shared archive. +-module_cmds=$lt_module_cmds +-module_expsym_cmds=$lt_module_expsym_cmds +- +-# Whether we are building with GNU ld or not. +-with_gnu_ld=$lt_with_gnu_ld +- +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag +- +-# Flag that enforces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag +- +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec +- +-# Whether we need a single "-rpath" flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary. +-hardcode_direct=$hardcode_direct +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary and the resulting library dependency is +-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +-# library is relocated. +-hardcode_direct_absolute=$hardcode_direct_absolute +- +-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +-# into the resulting binary. +-hardcode_minus_L=$hardcode_minus_L +- +-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +-# into the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var +- +-# Set to "yes" if building a shared library automatically hardcodes DIR +-# into the library and all subsequent libraries and executables linked +-# against it. +-hardcode_automatic=$hardcode_automatic +- +-# Set to yes if linker adds runtime paths of dependent libraries +-# to runtime path list. +-inherit_rpath=$inherit_rpath +- +-# Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs +- +-# Set to "yes" if exported symbols are required. +-always_export_symbols=$always_export_symbols +- +-# The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds +- +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms +- +-# Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms +- +-# Commands necessary for linking programs (against libraries) with templates. +-prelink_cmds=$lt_prelink_cmds +- +-# Commands necessary for finishing linking programs. +-postlink_cmds=$lt_postlink_cmds +- +-# Specify filename containing input files. +-file_list_spec=$lt_file_list_spec +- +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action +- +-# The directories searched by this compiler when creating a shared library. +-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs +- +-# Dependencies to place before and after the objects being linked to +-# create a shared library. +-predep_objects=$lt_predep_objects +-postdep_objects=$lt_postdep_objects +-predeps=$lt_predeps +-postdeps=$lt_postdeps +- +-# The library search path used internally by the compiler when linking +-# a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path +- +-# ### END LIBTOOL CONFIG +- +-_LT_EOF +- +- case $host_os in +- aix3*) +- cat <<\_LT_EOF >> "$cfgfile" +-# AIX sometimes has problems with the GCC collect2 program. For some +-# reason, if we set the COLLECT_NAMES environment variable, the problems +-# vanish in a puff of smoke. +-if test "X${COLLECT_NAMES+set}" != Xset; then +- COLLECT_NAMES= +- export COLLECT_NAMES +-fi +-_LT_EOF +- ;; +- esac +- +- +-ltmain="$ac_aux_dir/ltmain.sh" +- +- +- # We use sed instead of cat because bash on DJGPP gets confused if +- # if finds mixed CR/LF and LF-only lines. Since sed operates in +- # text mode, it properly converts lines to CR/LF. This bash problem +- # is reportedly fixed, but why not run on old versions too? +- sed '$q' "$ltmain" >> "$cfgfile" \ +- || (rm -f "$cfgfile"; exit 1) +- +- if test x"$xsi_shell" = xyes; then +- sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +-func_dirname ()\ +-{\ +-\ case ${1} in\ +-\ */*) func_dirname_result="${1%/*}${2}" ;;\ +-\ * ) func_dirname_result="${3}" ;;\ +-\ esac\ +-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_basename ()$/,/^} # func_basename /c\ +-func_basename ()\ +-{\ +-\ func_basename_result="${1##*/}"\ +-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +-func_dirname_and_basename ()\ +-{\ +-\ case ${1} in\ +-\ */*) func_dirname_result="${1%/*}${2}" ;;\ +-\ * ) func_dirname_result="${3}" ;;\ +-\ esac\ +-\ func_basename_result="${1##*/}"\ +-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +-func_stripname ()\ +-{\ +-\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +-\ # positional parameters, so assign one to ordinary parameter first.\ +-\ func_stripname_result=${3}\ +-\ func_stripname_result=${func_stripname_result#"${1}"}\ +-\ func_stripname_result=${func_stripname_result%"${2}"}\ +-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +-func_split_long_opt ()\ +-{\ +-\ func_split_long_opt_name=${1%%=*}\ +-\ func_split_long_opt_arg=${1#*=}\ +-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +-func_split_short_opt ()\ +-{\ +-\ func_split_short_opt_arg=${1#??}\ +-\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +-func_lo2o ()\ +-{\ +-\ case ${1} in\ +-\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +-\ *) func_lo2o_result=${1} ;;\ +-\ esac\ +-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_xform ()$/,/^} # func_xform /c\ +-func_xform ()\ +-{\ +- func_xform_result=${1%.*}.lo\ +-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_arith ()$/,/^} # func_arith /c\ +-func_arith ()\ +-{\ +- func_arith_result=$(( $* ))\ +-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_len ()$/,/^} # func_len /c\ +-func_len ()\ +-{\ +- func_len_result=${#1}\ +-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +-fi +- +-if test x"$lt_shell_append" = xyes; then +- sed -e '/^func_append ()$/,/^} # func_append /c\ +-func_append ()\ +-{\ +- eval "${1}+=\\${2}"\ +-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +-func_append_quoted ()\ +-{\ +-\ func_quote_for_eval "${2}"\ +-\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +-test 0 -eq $? || _lt_function_replace_fail=: +- +- +- # Save a `func_append' function call where possible by direct use of '+=' +- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +- test 0 -eq $? || _lt_function_replace_fail=: +-else +- # Save a `func_append' function call even when '+=' is not available +- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ +- && mv -f "$cfgfile.tmp" "$cfgfile" \ +- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +- test 0 -eq $? || _lt_function_replace_fail=: +-fi +- +-if test x"$_lt_function_replace_fail" = x":"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +-fi +- +- +- mv -f "$cfgfile" "$ofile" || +- (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") +- chmod +x "$ofile" +- +- +- cat <<_LT_EOF >> "$ofile" +- +-# ### BEGIN LIBTOOL TAG CONFIG: CXX +- +-# The linker used to build libraries. +-LD=$lt_LD_CXX +- +-# How to create reloadable object files. +-reload_flag=$lt_reload_flag_CXX +-reload_cmds=$lt_reload_cmds_CXX +- +-# Commands used to build an old-style archive. +-old_archive_cmds=$lt_old_archive_cmds_CXX +- +-# A language specific compiler. +-CC=$lt_compiler_CXX +- +-# Is the compiler the GNU compiler? +-with_gcc=$GCC_CXX +- +-# Compiler flag to turn off builtin functions. +-no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX +- +-# Additional compiler flags for building library objects. +-pic_flag=$lt_lt_prog_compiler_pic_CXX +- +-# How to pass a linker flag through the compiler. +-wl=$lt_lt_prog_compiler_wl_CXX +- +-# Compiler flag to prevent dynamic linking. +-link_static_flag=$lt_lt_prog_compiler_static_CXX +- +-# Does compiler simultaneously support -c and -o options? +-compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX +- +-# Whether or not to add -lc for building shared libraries. +-build_libtool_need_lc=$archive_cmds_need_lc_CXX +- +-# Whether or not to disallow shared libs when runtime libs are static. +-allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX +- +-# Compiler flag to allow reflexive dlopens. +-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX +- +-# Compiler flag to generate shared objects directly from archives. +-whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX +- +-# Whether the compiler copes with passing no objects directly. +-compiler_needs_object=$lt_compiler_needs_object_CXX +- +-# Create an old-style archive from a shared archive. +-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX +- +-# Create a temporary old-style archive to link instead of a shared archive. +-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX +- +-# Commands used to build a shared archive. +-archive_cmds=$lt_archive_cmds_CXX +-archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +- +-# Commands used to build a loadable module if different from building +-# a shared archive. +-module_cmds=$lt_module_cmds_CXX +-module_expsym_cmds=$lt_module_expsym_cmds_CXX +- +-# Whether we are building with GNU ld or not. +-with_gnu_ld=$lt_with_gnu_ld_CXX +- +-# Flag that allows shared libraries with undefined symbols to be built. +-allow_undefined_flag=$lt_allow_undefined_flag_CXX +- +-# Flag that enforces no undefined symbols. +-no_undefined_flag=$lt_no_undefined_flag_CXX +- +-# Flag to hardcode \$libdir into a binary during linking. +-# This must work even if \$libdir does not exist +-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX +- +-# Whether we need a single "-rpath" flag with a separated argument. +-hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary. +-hardcode_direct=$hardcode_direct_CXX +- +-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +-# DIR into the resulting binary and the resulting library dependency is +-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +-# library is relocated. +-hardcode_direct_absolute=$hardcode_direct_absolute_CXX +- +-# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +-# into the resulting binary. +-hardcode_minus_L=$hardcode_minus_L_CXX +- +-# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +-# into the resulting binary. +-hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX +- +-# Set to "yes" if building a shared library automatically hardcodes DIR +-# into the library and all subsequent libraries and executables linked +-# against it. +-hardcode_automatic=$hardcode_automatic_CXX +- +-# Set to yes if linker adds runtime paths of dependent libraries +-# to runtime path list. +-inherit_rpath=$inherit_rpath_CXX +- +-# Whether libtool must link a program against all its dependency libraries. +-link_all_deplibs=$link_all_deplibs_CXX +- +-# Set to "yes" if exported symbols are required. +-always_export_symbols=$always_export_symbols_CXX +- +-# The commands to list exported symbols. +-export_symbols_cmds=$lt_export_symbols_cmds_CXX +- +-# Symbols that should not be listed in the preloaded symbols. +-exclude_expsyms=$lt_exclude_expsyms_CXX +- +-# Symbols that must always be exported. +-include_expsyms=$lt_include_expsyms_CXX +- +-# Commands necessary for linking programs (against libraries) with templates. +-prelink_cmds=$lt_prelink_cmds_CXX +- +-# Commands necessary for finishing linking programs. +-postlink_cmds=$lt_postlink_cmds_CXX +- +-# Specify filename containing input files. +-file_list_spec=$lt_file_list_spec_CXX +- +-# How to hardcode a shared library path into an executable. +-hardcode_action=$hardcode_action_CXX +- +-# The directories searched by this compiler when creating a shared library. +-compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX +- +-# Dependencies to place before and after the objects being linked to +-# create a shared library. +-predep_objects=$lt_predep_objects_CXX +-postdep_objects=$lt_postdep_objects_CXX +-predeps=$lt_predeps_CXX +-postdeps=$lt_postdeps_CXX +- +-# The library search path used internally by the compiler when linking +-# a shared library. +-compiler_lib_search_path=$lt_compiler_lib_search_path_CXX +- +-# ### END LIBTOOL TAG CONFIG: CXX +-_LT_EOF +- +- ;; +- +- esac +-done # for ac_tag +- +- +-as_fn_exit 0 +-_ACEOF +-ac_clean_files=$ac_clean_files_save +- +-test $ac_write_fail = 0 || +- as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 +- +- +-# configure is writing to config.log, and then calls config.status. +-# config.status does its own redirection, appending to config.log. +-# Unfortunately, on DOS this fails, as config.log is still kept open +-# by configure, so config.status won't be able to write to it; its +-# output is simply discarded. So we exec the FD to /dev/null, +-# effectively closing config.log, so it can be properly (re)opened and +-# appended to by config.status. When coming back to configure, we +-# need to make the FD available again. +-if test "$no_create" != yes; then +- ac_cs_success=: +- ac_config_status_args= +- test "$silent" = yes && +- ac_config_status_args="$ac_config_status_args --quiet" +- exec 5>/dev/null +- $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false +- exec 5>>config.log +- # Use ||, not &&, to avoid exiting from the if with $? = 1, which +- # would make configure fail if this is the last instruction. +- $ac_cs_success || as_fn_exit 1 +-fi +-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +-fi +- +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: summary of build options: +- +- Version: ${PACKAGE_STRING} +- Host type: ${host} +- ABI: ${ABI} +- Install prefix: ${prefix} +- Compiler: ${CC} +- Static libraries: ${enable_static} +- Shared libraries: ${enable_shared} +-" >&5 +-$as_echo "$as_me: summary of build options: +- +- Version: ${PACKAGE_STRING} +- Host type: ${host} +- ABI: ${ABI} +- Install prefix: ${prefix} +- Compiler: ${CC} +- Static libraries: ${enable_static} +- Shared libraries: ${enable_shared} +-" >&6;} +- +-if test x$cross_compiling = xyes ; then +- case "$host" in +- *-*-mingw* | *-*-cygwin) +- if test x$ABI = x64 ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: If wine64 is installed, use make check TESTS_ENVIRONMENT=wine64." >&5 +-$as_echo "$as_me: If wine64 is installed, use make check TESTS_ENVIRONMENT=wine64." >&6;} +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: If wine is installed, use make check TESTS_ENVIRONMENT=wine." >&5 +-$as_echo "$as_me: If wine is installed, use make check TESTS_ENVIRONMENT=wine." >&6;} +- fi +- ;; +- esac +-fi +--- gcl-2.6.12.orig/gmp4/autom4te.cache/requests ++++ /dev/null +@@ -1,392 +0,0 @@ +-# This file was generated by Autom4te Sun Feb 23 17:19:32 UTC 2014. +-# It contains the lists of macros which have been traced. +-# It can be safely removed. +- +-@request = ( +- bless( [ +- '0', +- 1, +- [ +- '/usr/share/autoconf' +- ], +- [ +- '/usr/share/autoconf/autoconf/autoconf.m4f', +- '-', +- '/usr/share/aclocal-1.14/internal/ac-config-macro-dirs.m4', +- '/usr/share/aclocal/argz.m4', +- '/usr/share/aclocal/libtool.m4', +- '/usr/share/aclocal/ltdl.m4', +- '/usr/share/aclocal/ltoptions.m4', +- '/usr/share/aclocal/ltsugar.m4', +- '/usr/share/aclocal/ltversion.m4', +- '/usr/share/aclocal/lt~obsolete.m4', +- '/usr/share/aclocal-1.14/amversion.m4', +- '/usr/share/aclocal-1.14/auxdir.m4', +- '/usr/share/aclocal-1.14/cond.m4', +- '/usr/share/aclocal-1.14/depend.m4', +- '/usr/share/aclocal-1.14/depout.m4', +- '/usr/share/aclocal-1.14/init.m4', +- '/usr/share/aclocal-1.14/install-sh.m4', +- '/usr/share/aclocal-1.14/lead-dot.m4', +- '/usr/share/aclocal-1.14/lex.m4', +- '/usr/share/aclocal-1.14/maintainer.m4', +- '/usr/share/aclocal-1.14/make.m4', +- '/usr/share/aclocal-1.14/missing.m4', +- '/usr/share/aclocal-1.14/options.m4', +- '/usr/share/aclocal-1.14/prog-cc-c-o.m4', +- '/usr/share/aclocal-1.14/runlog.m4', +- '/usr/share/aclocal-1.14/sanity.m4', +- '/usr/share/aclocal-1.14/silent.m4', +- '/usr/share/aclocal-1.14/strip.m4', +- '/usr/share/aclocal-1.14/substnot.m4', +- '/usr/share/aclocal-1.14/tar.m4', +- 'acinclude.m4', +- 'configure.ac' +- ], +- { +- 'AC_DISABLE_SHARED' => 1, +- '_LT_PROG_CXX' => 1, +- 'AM_ENABLE_STATIC' => 1, +- 'AC_PROG_LD_RELOAD_FLAG' => 1, +- 'GMP_H_HAVE_FILE' => 1, +- 'LT_FUNC_DLSYM_USCORE' => 1, +- 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, +- 'LT_SYS_SYMBOL_USCORE' => 1, +- 'AC_ENABLE_FAST_INSTALL' => 1, +- 'GMP_HPPA_LEVEL_20' => 1, +- 'AM_CONDITIONAL' => 1, +- '_AM_DEPENDENCIES' => 1, +- '_AC_PROG_LIBTOOL' => 1, +- 'AC_LIBTOOL_LANG_C_CONFIG' => 1, +- 'AC_PATH_TOOL_PREFIX' => 1, +- 'LT_CMD_MAX_LEN' => 1, +- 'AC_DEFUN' => 1, +- 'AC_LIBTOOL_COMPILER_OPTION' => 1, +- '_LT_PROG_FC' => 1, +- '_LT_REQUIRED_DARWIN_CHECKS' => 1, +- 'GMP_GCC_PENTIUM4_SSE2' => 1, +- '_AM_SUBST_NOTMAKE' => 1, +- '_GMP_SUBST_CHECK_FUNCS' => 1, +- 'GMP_HEADER_ALLOCA' => 1, +- 'LTSUGAR_VERSION' => 1, +- '_LT_PROG_ECHO_BACKSLASH' => 1, +- 'AC_ENABLE_SHARED' => 1, +- 'AC_LIBTOOL_GCJ' => 1, +- 'AM_SILENT_RULES' => 1, +- 'AM_SUBST_NOTMAKE' => 1, +- 'LT_SYS_DLOPEN_SELF' => 1, +- 'AM_PROG_NM' => 1, +- 'AC_LIBTOOL_F77' => 1, +- 'GMP_ASM_M68K_BRANCHES' => 1, +- 'AC_LTDL_DLLIB' => 1, +- '_AM_AUTOCONF_VERSION' => 1, +- 'GMP_ASM_UNDERSCORE' => 1, +- 'GMP_PROG_M4' => 1, +- 'GMP_ASM_BYTE' => 1, +- 'AC_LIBLTDL_CONVENIENCE' => 1, +- 'AM_AUX_DIR_EXPAND' => 1, +- 'AM_DEP_TRACK' => 1, +- 'AC_LIBTOOL_DLOPEN' => 1, +- '_AM_PROG_TAR' => 1, +- 'GMP_TRY_ASSEMBLE' => 1, +- 'LT_SYS_DLSEARCH_PATH' => 1, +- 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, +- 'GMP_SUBST_CHECK_HEADERS' => 1, +- '_LT_PATH_TOOL_PREFIX' => 1, +- 'GMP_PROG_CC_WORKS_PART' => 1, +- 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, +- 'AM_PROG_LIBTOOL' => 1, +- 'LT_AC_PROG_GCJ' => 1, +- 'AC_PROG_LD_GNU' => 1, +- 'GMP_ASM_X86_SHLDL_CL' => 1, +- 'gl_PREREQ_ARGZ' => 1, +- 'GMP_FUNC_VSNPRINTF' => 1, +- 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, +- 'GMP_ASM_SPARC_REGISTER' => 1, +- 'AC_LIBTOOL_OBJDIR' => 1, +- '_LT_PROG_F77' => 1, +- 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, +- 'GMP_GCC_NO_CPP_PRECOMP' => 1, +- '_LT_PROG_LTMAIN' => 1, +- 'LT_WITH_LTDL' => 1, +- 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, +- 'AM_MAINTAINER_MODE' => 1, +- 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, +- 'AM_AUTOMAKE_VERSION' => 1, +- 'AM_INIT_AUTOMAKE' => 1, +- '_LT_LINKER_BOILERPLATE' => 1, +- '_AM_CONFIG_MACRO_DIRS' => 1, +- 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, +- 'm4_pattern_forbid' => 1, +- 'LT_AC_PROG_RC' => 1, +- 'AC_PROG_LIBTOOL' => 1, +- 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, +- 'AC_LIBTOOL_PROG_CC_C_O' => 1, +- 'GMP_ASM_SPARC_GOTDATA' => 1, +- 'GMP_PROG_CXX_WORKS_PART' => 1, +- 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, +- 'AC_WITH_LTDL' => 1, +- '_LT_CC_BASENAME' => 1, +- 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, +- 'GMP_C_ATTRIBUTE_MODE' => 1, +- '_AC_AM_CONFIG_HEADER_HOOK' => 1, +- 'GMP_ASM_X86_MMX' => 1, +- 'GMP_CHECK_LIBM_FOR_BUILD' => 1, +- 'AC_DEFUN_ONCE' => 1, +- 'GMP_PROG_CC_WORKS_LONGLONG' => 1, +- 'LT_AC_PROG_EGREP' => 1, +- 'LT_LIB_DLLOAD' => 1, +- 'GMP_SUBST_CHECK_FUNCS' => 1, +- 'LT_LANG' => 1, +- 'LT_SUPPORTED_TAG' => 1, +- 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, +- 'GMP_PROG_CC_WORKS' => 1, +- 'GMP_PROG_EXEEXT_FOR_BUILD' => 1, +- '_LT_PREPARE_SED_QUOTE_VARS' => 1, +- 'GMP_OPTION_ALLOCA' => 1, +- '_LT_AC_FILE_LTDLL_C' => 1, +- 'AC_LIBLTDL_INSTALLABLE' => 1, +- 'AC_LTDL_SYMBOL_USCORE' => 1, +- 'GMP_PROG_CC_X86_GOT_EAX_EMITTED' => 1, +- '_LT_AC_TAGVAR' => 1, +- '_LT_AC_LANG_CXX_CONFIG' => 1, +- 'GMP_COMPARE_GE_INTERNAL' => 1, +- 'AM_MISSING_HAS_RUN' => 1, +- 'GMP_M4_M4WRAP_SPURIOUS' => 1, +- 'AC_LIBTOOL_LINKER_OPTION' => 1, +- 'GMP_PROG_CC_IS_GNU' => 1, +- '_AM_MANGLE_OPTION' => 1, +- 'AC_CHECK_LIBM' => 1, +- 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, +- '_LT_LIBOBJ' => 1, +- 'LTVERSION_VERSION' => 1, +- 'GMP_ASM_ALIGN_LOG' => 1, +- '_LT_COMPILER_BOILERPLATE' => 1, +- 'AC_LTDL_SYSSEARCHPATH' => 1, +- 'GMP_ASM_W32' => 1, +- 'AM_SET_DEPDIR' => 1, +- 'AC_LTDL_DLSYM_USCORE' => 1, +- '_LT_AC_CHECK_DLFCN' => 1, +- 'AC_DISABLE_FAST_INSTALL' => 1, +- 'GMP_C_FOR_BUILD_ANSI' => 1, +- '_LT_AC_LANG_RC_CONFIG' => 1, +- 'AC_LTDL_ENABLE_INSTALL' => 1, +- 'AC_LTDL_OBJDIR' => 1, +- '_LT_COMPILER_OPTION' => 1, +- 'GMP_DEFINE' => 1, +- 'GMP_ASM_TYPE' => 1, +- 'GMP_PROG_CC_WORKS_PART_MAIN' => 1, +- 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, +- 'AM_RUN_LOG' => 1, +- 'LT_PATH_LD' => 1, +- 'AM_PROG_INSTALL_STRIP' => 1, +- 'GMP_HPC_HPPA_2_0' => 1, +- 'GMP_PROG_CC_WORKS_PART_TEST' => 1, +- '_AM_SET_OPTIONS' => 1, +- 'AC_LTDL_PREOPEN' => 1, +- 'GMP_PROG_CC_FOR_BUILD_WORKS' => 1, +- '_AM_SET_OPTION' => 1, +- 'm4_pattern_allow' => 1, +- '_LTDL_SETUP' => 1, +- 'GMP_ASM_POWERPC_PIC_ALWAYS' => 1, +- 'GMP_ASM_LSYM_PREFIX' => 1, +- 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, +- 'GMP_ASM_GLOBL_ATTR' => 1, +- '_AM_IF_OPTION' => 1, +- 'm4_include' => 1, +- '_LT_AC_LANG_C_CONFIG' => 1, +- '_LT_AC_LANG_F77_CONFIG' => 1, +- 'LT_INIT' => 1, +- 'GMP_ASM_X86_ADX' => 1, +- 'AC_LIBTOOL_PICMODE' => 1, +- 'CL_AS_NOEXECSTACK' => 1, +- 'LTOPTIONS_VERSION' => 1, +- 'AC_ENABLE_STATIC' => 1, +- 'AC_DISABLE_STATIC' => 1, +- 'GMP_GCC_MIPS_O32' => 1, +- 'GMP_ASM_COFF_TYPE' => 1, +- '_GMP_SUBST_CHECK_HEADERS' => 1, +- 'AU_DEFUN' => 1, +- 'GMP_ASM_POWERPC_R_REGISTERS' => 1, +- 'AC_PATH_MAGIC' => 1, +- 'AC_LIBTOOL_RC' => 1, +- 'GMP_ASM_GLOBL' => 1, +- 'AM_SET_LEADING_DOT' => 1, +- 'GMP_ASM_TEXT' => 1, +- 'GMP_H_EXTERN_INLINE' => 1, +- '_LT_LINKER_OPTION' => 1, +- '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, +- 'LTDL_INIT' => 1, +- 'GMP_ASM_DATA' => 1, +- 'AC_PROG_LD' => 1, +- 'LT_OUTPUT' => 1, +- 'GMP_ASM_X86_SSE2' => 1, +- 'GMP_ASM_ALIGN_FILL_0x90' => 1, +- 'GMP_PROG_CXX_WORKS' => 1, +- 'GMP_C_ATTRIBUTE_CONST' => 1, +- 'GMP_FUNC_SSCANF_WRITABLE_INPUT' => 1, +- 'include' => 1, +- 'LTDL_INSTALLABLE' => 1, +- '_LT_AC_PROG_ECHO_BACKSLASH' => 1, +- 'AC_DEPLIBS_CHECK_METHOD' => 1, +- 'LT_AC_PROG_SED' => 1, +- 'GMP_C_DOUBLE_FORMAT' => 1, +- 'AC_LIBTOOL_DLOPEN_SELF' => 1, +- 'AM_PROG_LEX' => 1, +- 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, +- 'AC_LIBTOOL_CONFIG' => 1, +- 'LT_CONFIG_LTDL_DIR' => 1, +- 'GMP_C_TEST_SIZEOF' => 1, +- 'AC_PROG_EGREP' => 1, +- '_m4_warn' => 1, +- 'GMP_ASM_RODATA' => 1, +- 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, +- 'GMP_ASM_X86_MULX' => 1, +- 'GMP_GCC_WA_MCPU' => 1, +- 'GMP_PROG_CC_FOR_BUILD' => 1, +- 'GMP_ASM_X86_MCOUNT' => 1, +- 'AC_PROG_NM' => 1, +- '_LT_AC_LANG_F77' => 1, +- 'AM_MAKE_INCLUDE' => 1, +- 'GMP_ASM_M68K_ADDRESSING' => 1, +- '_LT_AC_TAGCONFIG' => 1, +- 'LT_SYS_MODULE_PATH' => 1, +- 'GMP_OS_X86_XMM' => 1, +- '_LT_AC_LANG_GCJ' => 1, +- 'LTDL_CONVENIENCE' => 1, +- 'AM_SANITY_CHECK' => 1, +- '_LT_AC_LOCK' => 1, +- 'GMP_INIT' => 1, +- 'GMP_COMPARE_GE' => 1, +- 'GMP_C_ATTRIBUTE_NORETURN' => 1, +- '_LT_AC_LANG_CXX' => 1, +- '_LT_AC_SHELL_INIT' => 1, +- 'LT_PATH_NM' => 1, +- 'AC_CONFIG_MACRO_DIR_TRACE' => 1, +- 'GMP_PROG_AR' => 1, +- 'AM_PROG_CC_C_O' => 1, +- 'GMP_INCLUDE_MPN' => 1, +- '_LT_AC_TRY_DLOPEN_SELF' => 1, +- 'GMP_PROG_CC_IS_XLC' => 1, +- 'LT_SYS_DLOPEN_DEPLIBS' => 1, +- 'AC_LIBTOOL_FC' => 1, +- 'GMP_ASM_SIZE' => 1, +- 'GMP_GCC_ARM_UMODSI' => 1, +- 'AC_LTDL_SHLIBPATH' => 1, +- 'LTOBSOLETE_VERSION' => 1, +- '_AM_PROG_CC_C_O' => 1, +- 'AC_LIB_LTDL' => 1, +- 'GMP_ASM_LABEL_SUFFIX' => 1, +- 'AC_LIBTOOL_WIN32_DLL' => 1, +- 'GMP_PROG_NM' => 1, +- 'LT_PROG_RC' => 1, +- '_LT_AC_SYS_LIBPATH_AIX' => 1, +- 'AM_ENABLE_SHARED' => 1, +- 'AM_DISABLE_SHARED' => 1, +- 'AC_LIBTOOL_SETUP' => 1, +- '_LT_AC_LANG_GCJ_CONFIG' => 1, +- 'GMP_DEFINE_RAW' => 1, +- 'AC_LIBTOOL_CXX' => 1, +- 'AM_PROG_INSTALL_SH' => 1, +- 'AC_LTDL_SHLIBEXT' => 1, +- '_LT_WITH_SYSROOT' => 1, +- 'GMP_ASM_X86_GOT_UNDERSCORE' => 1, +- 'AM_DISABLE_STATIC' => 1, +- 'GMP_ASM_IA64_ALIGN_OK' => 1, +- 'GMP_ASM_M68K_INSTRUCTION' => 1, +- 'gl_FUNC_ARGZ' => 1, +- 'GMP_C_ATTRIBUTE_MALLOC' => 1, +- 'LT_PROG_GO' => 1, +- 'LT_PROG_GCJ' => 1, +- 'LT_SYS_MODULE_EXT' => 1, +- 'AM_MISSING_PROG' => 1, +- 'GMP_CRAY_OPTIONS' => 1, +- 'AC_CONFIG_MACRO_DIR' => 1, +- 'GMP_PROG_CPP_FOR_BUILD' => 1, +- 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, +- 'GMP_ASM_X86_GOT_EAX_OK' => 1, +- 'GMP_FINISH' => 1, +- 'LT_LIB_M' => 1, +- 'GMP_FUNC_ALLOCA' => 1, +- 'AM_PROG_LD' => 1, +- '_LT_AC_SYS_COMPILER' => 1, +- 'GMP_ASM_SPARC_SHARED_THUNKS' => 1, +- 'GMP_GCC_WA_OLDAS' => 1, +- '_LT_AC_PROG_CXXCPP' => 1 +- } +- ], 'Autom4te::Request' ), +- bless( [ +- '1', +- 1, +- [ +- '/usr/share/autoconf' +- ], +- [ +- '/usr/share/autoconf/autoconf/autoconf.m4f', +- 'aclocal.m4', +- 'configure.ac' +- ], +- { +- 'AM_PROG_CC_C_O' => 1, +- 'AM_PROG_AR' => 1, +- 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, +- '_AM_COND_ENDIF' => 1, +- 'AC_CANONICAL_HOST' => 1, +- 'AC_LIBSOURCE' => 1, +- 'AC_FC_PP_DEFINE' => 1, +- 'AM_PROG_MKDIR_P' => 1, +- 'AC_INIT' => 1, +- 'AC_CONFIG_LIBOBJ_DIR' => 1, +- 'AM_PATH_GUILE' => 1, +- 'AM_PROG_CXX_C_O' => 1, +- 'LT_INIT' => 1, +- 'm4_include' => 1, +- '_AM_MAKEFILE_INCLUDE' => 1, +- 'AC_CONFIG_AUX_DIR' => 1, +- 'AC_REQUIRE_AUX_FILE' => 1, +- 'AC_SUBST' => 1, +- 'AC_CANONICAL_TARGET' => 1, +- 'AC_CANONICAL_BUILD' => 1, +- 'include' => 1, +- 'AH_OUTPUT' => 1, +- 'sinclude' => 1, +- 'AM_ENABLE_MULTILIB' => 1, +- '_AM_SUBST_NOTMAKE' => 1, +- '_LT_AC_TAGCONFIG' => 1, +- 'AM_CONDITIONAL' => 1, +- 'm4_pattern_allow' => 1, +- '_AM_COND_ELSE' => 1, +- 'm4_pattern_forbid' => 1, +- 'AC_PROG_LIBTOOL' => 1, +- 'AC_CONFIG_FILES' => 1, +- 'AC_SUBST_TRACE' => 1, +- 'AC_CONFIG_SUBDIRS' => 1, +- 'm4_sinclude' => 1, +- 'LT_SUPPORTED_TAG' => 1, +- 'AC_CANONICAL_SYSTEM' => 1, +- 'AM_PROG_MOC' => 1, +- 'AM_MAINTAINER_MODE' => 1, +- 'AC_FC_PP_SRCEXT' => 1, +- 'AM_AUTOMAKE_VERSION' => 1, +- 'AM_INIT_AUTOMAKE' => 1, +- 'AM_POT_TOOLS' => 1, +- 'AC_FC_FREEFORM' => 1, +- 'AM_NLS' => 1, +- 'AC_CONFIG_HEADERS' => 1, +- 'AM_XGETTEXT_OPTION' => 1, +- 'AM_EXTRA_RECURSIVE_TARGETS' => 1, +- '_AM_COND_IF' => 1, +- 'AC_FC_SRCEXT' => 1, +- 'AC_CONFIG_LINKS' => 1, +- 'AM_PROG_FC_C_O' => 1, +- 'LT_CONFIG_LTDL_DIR' => 1, +- 'AM_SILENT_RULES' => 1, +- 'AC_DEFINE_TRACE_LITERAL' => 1, +- '_m4_warn' => 1, +- 'AM_MAKEFILE_INCLUDE' => 1, +- 'AM_GNU_GETTEXT' => 1, +- 'AM_PROG_F77_C_O' => 1 +- } +- ], 'Autom4te::Request' ) +- ); +- +--- gcl-2.6.12.orig/gmp4/autom4te.cache/traces.0 ++++ /dev/null +@@ -1,9202 +0,0 @@ +-m4trace:/usr/share/aclocal/argz.m4:12: -1- AC_DEFUN([gl_FUNC_ARGZ], [gl_PREREQ_ARGZ +- +-AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) +- +-AC_CHECK_TYPES([error_t], +- [], +- [AC_DEFINE([error_t], [int], +- [Define to a type to use for `error_t' if it is not otherwise available.]) +- AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h +- does not typedef error_t.])], +- [#if defined(HAVE_ARGZ_H) +-# include +-#endif]) +- +-ARGZ_H= +-AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ +- argz_next argz_stringify], [], [ARGZ_H=argz.h; AC_LIBOBJ([argz])]) +- +-dnl if have system argz functions, allow forced use of +-dnl libltdl-supplied implementation (and default to do so +-dnl on "known bad" systems). Could use a runtime check, but +-dnl (a) detecting malloc issues is notoriously unreliable +-dnl (b) only known system that declares argz functions, +-dnl provides them, yet they are broken, is cygwin +-dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) +-dnl So, it's more straightforward simply to special case +-dnl this for known bad systems. +-AS_IF([test -z "$ARGZ_H"], +- [AC_CACHE_CHECK( +- [if argz actually works], +- [lt_cv_sys_argz_works], +- [[case $host_os in #( +- *cygwin*) +- lt_cv_sys_argz_works=no +- if test "$cross_compiling" != no; then +- lt_cv_sys_argz_works="guessing no" +- else +- lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' +- save_IFS=$IFS +- IFS=-. +- set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` +- IFS=$save_IFS +- lt_os_major=${2-0} +- lt_os_minor=${3-0} +- lt_os_micro=${4-0} +- if test "$lt_os_major" -gt 1 \ +- || { test "$lt_os_major" -eq 1 \ +- && { test "$lt_os_minor" -gt 5 \ +- || { test "$lt_os_minor" -eq 5 \ +- && test "$lt_os_micro" -gt 24; }; }; }; then +- lt_cv_sys_argz_works=yes +- fi +- fi +- ;; #( +- *) lt_cv_sys_argz_works=yes ;; +- esac]]) +- AS_IF([test "$lt_cv_sys_argz_works" = yes], +- [AC_DEFINE([HAVE_WORKING_ARGZ], 1, +- [This value is set to 1 to indicate that the system argz facility works])], +- [ARGZ_H=argz.h +- AC_LIBOBJ([argz])])]) +- +-AC_SUBST([ARGZ_H]) +-]) +-m4trace:/usr/share/aclocal/argz.m4:79: -1- AC_DEFUN([gl_PREREQ_ARGZ], [:]) +-m4trace:/usr/share/aclocal/libtool.m4:69: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +-AC_BEFORE([$0], [LT_LANG])dnl +-AC_BEFORE([$0], [LT_OUTPUT])dnl +-AC_BEFORE([$0], [LTDL_INIT])dnl +-m4_require([_LT_CHECK_BUILDDIR])dnl +- +-dnl Autoconf doesn't catch unexpanded LT_ macros by default: +-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +-dnl unless we require an AC_DEFUNed macro: +-AC_REQUIRE([LTOPTIONS_VERSION])dnl +-AC_REQUIRE([LTSUGAR_VERSION])dnl +-AC_REQUIRE([LTVERSION_VERSION])dnl +-AC_REQUIRE([LTOBSOLETE_VERSION])dnl +-m4_require([_LT_PROG_LTMAIN])dnl +- +-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) +- +-dnl Parse OPTIONS +-_LT_SET_OPTIONS([$0], [$1]) +- +-# This can be used to rebuild libtool when needed +-LIBTOOL_DEPS="$ltmain" +- +-# Always use our own libtool. +-LIBTOOL='$(SHELL) $(top_builddir)/libtool' +-AC_SUBST(LIBTOOL)dnl +- +-_LT_SETUP +- +-# Only expand once: +-m4_define([LT_INIT]) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:107: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:107: -1- AC_DEFUN([AC_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:108: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:108: -1- AC_DEFUN([AM_PROG_LIBTOOL], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:609: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} +-AC_MSG_NOTICE([creating $CONFIG_LT]) +-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +-[# Run this file to recreate a libtool stub with the current configuration.]) +- +-cat >>"$CONFIG_LT" <<\_LTEOF +-lt_cl_silent=false +-exec AS_MESSAGE_LOG_FD>>config.log +-{ +- echo +- AS_BOX([Running $as_me.]) +-} >&AS_MESSAGE_LOG_FD +- +-lt_cl_help="\ +-\`$as_me' creates a local libtool stub from the current configuration, +-for use in further configure time tests before the real libtool is +-generated. +- +-Usage: $[0] [[OPTIONS]] +- +- -h, --help print this help, then exit +- -V, --version print version number, then exit +- -q, --quiet do not print progress messages +- -d, --debug don't remove temporary files +- +-Report bugs to ." +- +-lt_cl_version="\ +-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +-configured by $[0], generated by m4_PACKAGE_STRING. +- +-Copyright (C) 2011 Free Software Foundation, Inc. +-This config.lt script is free software; the Free Software Foundation +-gives unlimited permision to copy, distribute and modify it." +- +-while test $[#] != 0 +-do +- case $[1] in +- --version | --v* | -V ) +- echo "$lt_cl_version"; exit 0 ;; +- --help | --h* | -h ) +- echo "$lt_cl_help"; exit 0 ;; +- --debug | --d* | -d ) +- debug=: ;; +- --quiet | --q* | --silent | --s* | -q ) +- lt_cl_silent=: ;; +- +- -*) AC_MSG_ERROR([unrecognized option: $[1] +-Try \`$[0] --help' for more information.]) ;; +- +- *) AC_MSG_ERROR([unrecognized argument: $[1] +-Try \`$[0] --help' for more information.]) ;; +- esac +- shift +-done +- +-if $lt_cl_silent; then +- exec AS_MESSAGE_FD>/dev/null +-fi +-_LTEOF +- +-cat >>"$CONFIG_LT" <<_LTEOF +-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +-_LTEOF +- +-cat >>"$CONFIG_LT" <<\_LTEOF +-AC_MSG_NOTICE([creating $ofile]) +-_LT_OUTPUT_LIBTOOL_COMMANDS +-AS_EXIT(0) +-_LTEOF +-chmod +x "$CONFIG_LT" +- +-# configure is writing to config.log, but config.lt does its own redirection, +-# appending to config.log, which fails on DOS, as config.log is still kept +-# open by configure. Here we exec the FD to /dev/null, effectively closing +-# config.log, so it can be properly (re)opened and appended to by config.lt. +-lt_cl_success=: +-test "$silent" = yes && +- lt_config_lt_args="$lt_config_lt_args --quiet" +-exec AS_MESSAGE_LOG_FD>/dev/null +-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +-exec AS_MESSAGE_LOG_FD>>config.log +-$lt_cl_success || AS_EXIT(1) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:790: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) +-m4trace:/usr/share/aclocal/libtool.m4:801: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl +-m4_case([$1], +- [C], [_LT_LANG(C)], +- [C++], [_LT_LANG(CXX)], +- [Go], [_LT_LANG(GO)], +- [Java], [_LT_LANG(GCJ)], +- [Fortran 77], [_LT_LANG(F77)], +- [Fortran], [_LT_LANG(FC)], +- [Windows Resource], [_LT_LANG(RC)], +- [m4_ifdef([_LT_LANG_]$1[_CONFIG], +- [_LT_LANG($1)], +- [m4_fatal([$0: unsupported language: "$1"])])])dnl +-]) +-m4trace:/usr/share/aclocal/libtool.m4:893: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +-m4trace:/usr/share/aclocal/libtool.m4:893: -1- AC_DEFUN([AC_LIBTOOL_CXX], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. +-You should run autoupdate.])dnl +-LT_LANG(C++)]) +-m4trace:/usr/share/aclocal/libtool.m4:894: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +-m4trace:/usr/share/aclocal/libtool.m4:894: -1- AC_DEFUN([AC_LIBTOOL_F77], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. +-You should run autoupdate.])dnl +-LT_LANG(Fortran 77)]) +-m4trace:/usr/share/aclocal/libtool.m4:895: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +-m4trace:/usr/share/aclocal/libtool.m4:895: -1- AC_DEFUN([AC_LIBTOOL_FC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. +-You should run autoupdate.])dnl +-LT_LANG(Fortran)]) +-m4trace:/usr/share/aclocal/libtool.m4:896: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +-m4trace:/usr/share/aclocal/libtool.m4:896: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. +-You should run autoupdate.])dnl +-LT_LANG(Java)]) +-m4trace:/usr/share/aclocal/libtool.m4:897: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +-m4trace:/usr/share/aclocal/libtool.m4:897: -1- AC_DEFUN([AC_LIBTOOL_RC], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. +-You should run autoupdate.])dnl +-LT_LANG(Windows Resource)]) +-m4trace:/usr/share/aclocal/libtool.m4:1225: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) +-AC_ARG_WITH([sysroot], +-[ --with-sysroot[=DIR] Search for dependent libraries within DIR +- (or the compiler's sysroot if not specified).], +-[], [with_sysroot=no]) +- +-dnl lt_sysroot will always be passed unquoted. We quote it here +-dnl in case the user passed a directory name. +-lt_sysroot= +-case ${with_sysroot} in #( +- yes) +- if test "$GCC" = yes; then +- lt_sysroot=`$CC --print-sysroot 2>/dev/null` +- fi +- ;; #( +- /*) +- lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` +- ;; #( +- no|'') +- ;; #( +- *) +- AC_MSG_RESULT([${with_sysroot}]) +- AC_MSG_ERROR([The sysroot must be an absolute path.]) +- ;; +-esac +- +- AC_MSG_RESULT([${lt_sysroot:-no}]) +-_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +-[dependent libraries, and in which our libraries should be installed.])]) +-m4trace:/usr/share/aclocal/libtool.m4:1515: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_SED])dnl +-AC_CACHE_CHECK([$1], [$2], +- [$2=no +- m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) +- echo "$lt_simple_compile_test_code" > conftest.$ac_ext +- lt_compiler_flag="$3" +- # Insert the option either (1) after the last *FLAGS variable, or +- # (2) before a word containing "conftest.", or (3) at the end. +- # Note that $ac_compile itself does not contain backslashes and begins +- # with a dollar sign (not a hyphen), so the echo should work correctly. +- # The option is referenced via a variable to avoid confusing sed. +- lt_compile=`echo "$ac_compile" | $SED \ +- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ +- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ +- -e 's:$: $lt_compiler_flag:'` +- (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) +- (eval "$lt_compile" 2>conftest.err) +- ac_status=$? +- cat conftest.err >&AS_MESSAGE_LOG_FD +- echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD +- if (exit $ac_status) && test -s "$ac_outfile"; then +- # The compiler can only warn and ignore the option if not recognized +- # So say no if there are warnings other than the usual output. +- $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then +- $2=yes +- fi +- fi +- $RM conftest* +-]) +- +-if test x"[$]$2" = xyes; then +- m4_if([$5], , :, [$5]) +-else +- m4_if([$6], , :, [$6]) +-fi +-]) +-m4trace:/usr/share/aclocal/libtool.m4:1557: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1557: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1566: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +-m4_require([_LT_DECL_SED])dnl +-AC_CACHE_CHECK([$1], [$2], +- [$2=no +- save_LDFLAGS="$LDFLAGS" +- LDFLAGS="$LDFLAGS $3" +- echo "$lt_simple_link_test_code" > conftest.$ac_ext +- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then +- # The linker can only warn and ignore the option if not recognized +- # So say no if there are warnings +- if test -s conftest.err; then +- # Append any errors to the config.log. +- cat conftest.err 1>&AS_MESSAGE_LOG_FD +- $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp +- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 +- if diff conftest.exp conftest.er2 >/dev/null; then +- $2=yes +- fi +- else +- $2=yes +- fi +- fi +- $RM -r conftest* +- LDFLAGS="$save_LDFLAGS" +-]) +- +-if test x"[$]$2" = xyes; then +- m4_if([$4], , :, [$4]) +-else +- m4_if([$5], , :, [$5]) +-fi +-]) +-m4trace:/usr/share/aclocal/libtool.m4:1601: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1601: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1608: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +-# find the maximum length of command line arguments +-AC_MSG_CHECKING([the maximum length of command line arguments]) +-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl +- i=0 +- teststring="ABCD" +- +- case $build_os in +- msdosdjgpp*) +- # On DJGPP, this test can blow up pretty badly due to problems in libc +- # (any single argument exceeding 2000 bytes causes a buffer overrun +- # during glob expansion). Even if it were fixed, the result of this +- # check would be larger than it should be. +- lt_cv_sys_max_cmd_len=12288; # 12K is about right +- ;; +- +- gnu*) +- # Under GNU Hurd, this test is not required because there is +- # no limit to the length of command line arguments. +- # Libtool will interpret -1 as no limit whatsoever +- lt_cv_sys_max_cmd_len=-1; +- ;; +- +- cygwin* | mingw* | cegcc*) +- # On Win9x/ME, this test blows up -- it succeeds, but takes +- # about 5 minutes as the teststring grows exponentially. +- # Worse, since 9x/ME are not pre-emptively multitasking, +- # you end up with a "frozen" computer, even though with patience +- # the test eventually succeeds (with a max line length of 256k). +- # Instead, let's just punt: use the minimum linelength reported by +- # all of the supported platforms: 8192 (on NT/2K/XP). +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- mint*) +- # On MiNT this can take a long time and run out of memory. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- amigaos*) +- # On AmigaOS with pdksh, this test takes hours, literally. +- # So we just punt and use a minimum line length of 8192. +- lt_cv_sys_max_cmd_len=8192; +- ;; +- +- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) +- # This has been around since 386BSD, at least. Likely further. +- if test -x /sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` +- elif test -x /usr/sbin/sysctl; then +- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` +- else +- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs +- fi +- # And add a safety zone +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- ;; +- +- interix*) +- # We know the value 262144 and hardcode it with a safety zone (like BSD) +- lt_cv_sys_max_cmd_len=196608 +- ;; +- +- os2*) +- # The test takes a long time on OS/2. +- lt_cv_sys_max_cmd_len=8192 +- ;; +- +- osf*) +- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure +- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not +- # nice to cause kernel panics so lets avoid the loop below. +- # First set a reasonable default. +- lt_cv_sys_max_cmd_len=16384 +- # +- if test -x /sbin/sysconfig; then +- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in +- *1*) lt_cv_sys_max_cmd_len=-1 ;; +- esac +- fi +- ;; +- sco3.2v5*) +- lt_cv_sys_max_cmd_len=102400 +- ;; +- sysv5* | sco5v6* | sysv4.2uw2*) +- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` +- if test -n "$kargmax"; then +- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` +- else +- lt_cv_sys_max_cmd_len=32768 +- fi +- ;; +- *) +- lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` +- if test -n "$lt_cv_sys_max_cmd_len" && \ +- test undefined != "$lt_cv_sys_max_cmd_len"; then +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` +- else +- # Make teststring a little bigger before we do anything with it. +- # a 1K string should be a reasonable start. +- for i in 1 2 3 4 5 6 7 8 ; do +- teststring=$teststring$teststring +- done +- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} +- # If test is not a shell built-in, we'll probably end up computing a +- # maximum length that is only half of the actual maximum length, but +- # we can't tell. +- while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ +- = "X$teststring$teststring"; } >/dev/null 2>&1 && +- test $i != 17 # 1/2 MB should be enough +- do +- i=`expr $i + 1` +- teststring=$teststring$teststring +- done +- # Only check the string length outside the loop. +- lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` +- teststring= +- # Add a significant safety factor because C++ compilers can tack on +- # massive amounts of additional arguments before passing them to the +- # linker. It appears as though 1/2 is a usable value. +- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` +- fi +- ;; +- esac +-]) +-if test -n $lt_cv_sys_max_cmd_len ; then +- AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +-else +- AC_MSG_RESULT(none) +-fi +-max_cmd_len=$lt_cv_sys_max_cmd_len +-_LT_DECL([], [max_cmd_len], [0], +- [What is the maximum length of a command?]) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:1747: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1747: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1858: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl +-if test "x$enable_dlopen" != xyes; then +- enable_dlopen=unknown +- enable_dlopen_self=unknown +- enable_dlopen_self_static=unknown +-else +- lt_cv_dlopen=no +- lt_cv_dlopen_libs= +- +- case $host_os in +- beos*) +- lt_cv_dlopen="load_add_on" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ;; +- +- mingw* | pw32* | cegcc*) +- lt_cv_dlopen="LoadLibrary" +- lt_cv_dlopen_libs= +- ;; +- +- cygwin*) +- lt_cv_dlopen="dlopen" +- lt_cv_dlopen_libs= +- ;; +- +- darwin*) +- # if libdl is installed we need to link against it +- AC_CHECK_LIB([dl], [dlopen], +- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ +- lt_cv_dlopen="dyld" +- lt_cv_dlopen_libs= +- lt_cv_dlopen_self=yes +- ]) +- ;; +- +- *) +- AC_CHECK_FUNC([shl_load], +- [lt_cv_dlopen="shl_load"], +- [AC_CHECK_LIB([dld], [shl_load], +- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], +- [AC_CHECK_FUNC([dlopen], +- [lt_cv_dlopen="dlopen"], +- [AC_CHECK_LIB([dl], [dlopen], +- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], +- [AC_CHECK_LIB([svld], [dlopen], +- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], +- [AC_CHECK_LIB([dld], [dld_link], +- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) +- ]) +- ]) +- ]) +- ]) +- ]) +- ;; +- esac +- +- if test "x$lt_cv_dlopen" != xno; then +- enable_dlopen=yes +- else +- enable_dlopen=no +- fi +- +- case $lt_cv_dlopen in +- dlopen) +- save_CPPFLAGS="$CPPFLAGS" +- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" +- +- save_LDFLAGS="$LDFLAGS" +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" +- +- save_LIBS="$LIBS" +- LIBS="$lt_cv_dlopen_libs $LIBS" +- +- AC_CACHE_CHECK([whether a program can dlopen itself], +- lt_cv_dlopen_self, [dnl +- _LT_TRY_DLOPEN_SELF( +- lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, +- lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) +- ]) +- +- if test "x$lt_cv_dlopen_self" = xyes; then +- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" +- AC_CACHE_CHECK([whether a statically linked program can dlopen itself], +- lt_cv_dlopen_self_static, [dnl +- _LT_TRY_DLOPEN_SELF( +- lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, +- lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) +- ]) +- fi +- +- CPPFLAGS="$save_CPPFLAGS" +- LDFLAGS="$save_LDFLAGS" +- LIBS="$save_LIBS" +- ;; +- esac +- +- case $lt_cv_dlopen_self in +- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; +- *) enable_dlopen_self=unknown ;; +- esac +- +- case $lt_cv_dlopen_self_static in +- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; +- *) enable_dlopen_self_static=unknown ;; +- esac +-fi +-_LT_DECL([dlopen_support], [enable_dlopen], [0], +- [Whether dlopen is supported]) +-_LT_DECL([dlopen_self], [enable_dlopen_self], [0], +- [Whether dlopen of programs is supported]) +-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], +- [Whether dlopen of statically linked programs is supported]) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:1975: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:1975: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:2945: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl +-AC_MSG_CHECKING([for $1]) +-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +-[case $MAGIC_CMD in +-[[\\/*] | ?:[\\/]*]) +- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. +- ;; +-*) +- lt_save_MAGIC_CMD="$MAGIC_CMD" +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +-dnl $ac_dummy forces splitting on constant user-supplied paths. +-dnl POSIX.2 word splitting is done only on the output of word expansions, +-dnl not every word. This closes a longstanding sh security hole. +- ac_dummy="m4_if([$2], , $PATH, [$2])" +- for ac_dir in $ac_dummy; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f $ac_dir/$1; then +- lt_cv_path_MAGIC_CMD="$ac_dir/$1" +- if test -n "$file_magic_test_file"; then +- case $deplibs_check_method in +- "file_magic "*) +- file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` +- MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | +- $EGREP "$file_magic_regex" > /dev/null; then +- : +- else +- cat <<_LT_EOF 1>&2 +- +-*** Warning: the command libtool uses to detect shared libraries, +-*** $file_magic_cmd, produces output that libtool cannot recognize. +-*** The result is that libtool may fail to recognize shared libraries +-*** as such. This will affect the creation of libtool libraries that +-*** depend on shared libraries, but programs linked with such libtool +-*** libraries will work regardless of this problem. Nevertheless, you +-*** may want to report the problem to your system manager and/or to +-*** bug-libtool@gnu.org +- +-_LT_EOF +- fi ;; +- esac +- fi +- break +- fi +- done +- IFS="$lt_save_ifs" +- MAGIC_CMD="$lt_save_MAGIC_CMD" +- ;; +-esac]) +-MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +-if test -n "$MAGIC_CMD"; then +- AC_MSG_RESULT($MAGIC_CMD) +-else +- AC_MSG_RESULT(no) +-fi +-_LT_DECL([], [MAGIC_CMD], [0], +- [Used to examine libraries when file_magic_cmd begins with "file"])dnl +-]) +-m4trace:/usr/share/aclocal/libtool.m4:3007: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3007: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_DIAGNOSE([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3030: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl +-AC_REQUIRE([AC_CANONICAL_HOST])dnl +-AC_REQUIRE([AC_CANONICAL_BUILD])dnl +-m4_require([_LT_DECL_SED])dnl +-m4_require([_LT_DECL_EGREP])dnl +-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl +- +-AC_ARG_WITH([gnu-ld], +- [AS_HELP_STRING([--with-gnu-ld], +- [assume the C compiler uses GNU ld @<:@default=no@:>@])], +- [test "$withval" = no || with_gnu_ld=yes], +- [with_gnu_ld=no])dnl +- +-ac_prog=ld +-if test "$GCC" = yes; then +- # Check if gcc -print-prog-name=ld gives a path. +- AC_MSG_CHECKING([for ld used by $CC]) +- case $host in +- *-*-mingw*) +- # gcc leaves a trailing carriage return which upsets mingw +- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; +- *) +- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; +- esac +- case $ac_prog in +- # Accept absolute paths. +- [[\\/]]* | ?:[[\\/]]*) +- re_direlt='/[[^/]][[^/]]*/\.\./' +- # Canonicalize the pathname of ld +- ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` +- while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do +- ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` +- done +- test -z "$LD" && LD="$ac_prog" +- ;; +- "") +- # If it fails, then pretend we aren't using GCC. +- ac_prog=ld +- ;; +- *) +- # If it is relative, then search for the first ld in PATH. +- with_gnu_ld=unknown +- ;; +- esac +-elif test "$with_gnu_ld" = yes; then +- AC_MSG_CHECKING([for GNU ld]) +-else +- AC_MSG_CHECKING([for non-GNU ld]) +-fi +-AC_CACHE_VAL(lt_cv_path_LD, +-[if test -z "$LD"; then +- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +- for ac_dir in $PATH; do +- IFS="$lt_save_ifs" +- test -z "$ac_dir" && ac_dir=. +- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then +- lt_cv_path_LD="$ac_dir/$ac_prog" +- # Check to see if the program is GNU ld. I'd rather use --version, +- # but apparently some variants of GNU ld only accept -v. +- # Break only if it was the GNU/non-GNU ld that we prefer. +- case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in +- */dev/null* | *'Invalid file or object type'*) +- lt_cv_path_NM="$tmp_nm -B" +- break +- ;; +- *) +- case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in +- */dev/null*) +- lt_cv_path_NM="$tmp_nm -p" +- break +- ;; +- *) +- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but +- continue # so that we can try to find one that supports BSD flags +- ;; +- esac +- ;; +- esac +- fi +- done +- IFS="$lt_save_ifs" +- done +- : ${lt_cv_path_NM=no} +-fi]) +-if test "$lt_cv_path_NM" != "no"; then +- NM="$lt_cv_path_NM" +-else +- # Didn't find any BSD compatible name lister, look for dumpbin. +- if test -n "$DUMPBIN"; then : +- # Let the user override the test. +- else +- AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) +- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in +- *COFF*) +- DUMPBIN="$DUMPBIN -symbols" +- ;; +- *) +- DUMPBIN=: +- ;; +- esac +- fi +- AC_SUBST([DUMPBIN]) +- if test "$DUMPBIN" != ":"; then +- NM="$DUMPBIN" +- fi +-fi +-test -z "$NM" && NM=nm +-AC_SUBST([NM]) +-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl +- +-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], +- [lt_cv_nm_interface="BSD nm" +- echo "int some_variable = 0;" > conftest.$ac_ext +- (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) +- (eval "$ac_compile" 2>conftest.err) +- cat conftest.err >&AS_MESSAGE_LOG_FD +- (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) +- (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) +- cat conftest.err >&AS_MESSAGE_LOG_FD +- (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) +- cat conftest.out >&AS_MESSAGE_LOG_FD +- if $GREP 'External.*some_variable' conftest.out > /dev/null; then +- lt_cv_nm_interface="MS dumpbin" +- fi +- rm -f conftest*]) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:3500: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3500: -1- AC_DEFUN([AM_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AM_PROG_NM' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3501: -1- AC_DEFUN([AC_PROG_NM], [AC_DIAGNOSE([obsolete], [The macro `AC_PROG_NM' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3571: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +-LIBM= +-case $host in +-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) +- # These system don't have libm, or don't need it +- ;; +-*-ncr-sysv4.3*) +- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") +- AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") +- ;; +-*) +- AC_CHECK_LIB(m, cos, LIBM="-lm") +- ;; +-esac +-AC_SUBST([LIBM]) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:3590: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:3590: -1- AC_DEFUN([AC_CHECK_LIBM], [AC_DIAGNOSE([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:7637: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], +- [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], +- [AC_CHECK_TOOL(GCJ, gcj,) +- test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" +- AC_SUBST(GCJFLAGS)])])[]dnl +-]) +-m4trace:/usr/share/aclocal/libtool.m4:7646: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:7646: -1- AC_DEFUN([LT_AC_PROG_GCJ], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:7653: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:7660: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) +-]) +-m4trace:/usr/share/aclocal/libtool.m4:7665: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:7665: -1- AC_DEFUN([LT_AC_PROG_RC], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:7785: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +-m4trace:/usr/share/aclocal/libtool.m4:7785: -1- AC_DEFUN([LT_AC_PROG_SED], [AC_DIAGNOSE([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) +-_$0($*) +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:68: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl +-dnl Although the argument is deprecated and no longer documented, +-dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +-dnl here make sure it is the same as any other declaration of libltdl's +-dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +-dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +-m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +-_$0() +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +-_LTDL_CONVENIENCE]) +-m4trace:/usr/share/aclocal/ltdl.m4:81: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. +-You should run autoupdate.])dnl +-_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +-_LTDL_CONVENIENCE]) +-m4trace:/usr/share/aclocal/ltdl.m4:124: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl +-dnl Although the argument is deprecated and no longer documented, +-dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +-dnl here make sure it is the same as any other declaration of libltdl's +-dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +-dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +-m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +-_$0() +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +-_LTDL_INSTALLABLE]) +-m4trace:/usr/share/aclocal/ltdl.m4:137: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. +-You should run autoupdate.])dnl +-_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +-_LTDL_INSTALLABLE]) +-m4trace:/usr/share/aclocal/ltdl.m4:213: -1- AC_DEFUN([_LT_LIBOBJ], [ +- m4_pattern_allow([^_LT_LIBOBJS$]) +- _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:226: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS +-_LT_SET_OPTIONS([$0], [$1]) +- +-dnl We need to keep our own list of libobjs separate from our parent project, +-dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +-dnl we look for our own LIBOBJs. +-m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +-m4_pushdef([AC_LIBSOURCES]) +- +-dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +-m4_if(_LTDL_MODE, [], +- [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) +- m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], +- [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) +- +-AC_ARG_WITH([included_ltdl], +- [AS_HELP_STRING([--with-included-ltdl], +- [use the GNU ltdl sources included here])]) +- +-if test "x$with_included_ltdl" != xyes; then +- # We are not being forced to use the included libltdl sources, so +- # decide whether there is a useful installed version we can use. +- AC_CHECK_HEADER([ltdl.h], +- [AC_CHECK_DECL([lt_dlinterface_register], +- [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], +- [with_included_ltdl=no], +- [with_included_ltdl=yes])], +- [with_included_ltdl=yes], +- [AC_INCLUDES_DEFAULT +- #include ])], +- [with_included_ltdl=yes], +- [AC_INCLUDES_DEFAULT] +- ) +-fi +- +-dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +-dnl was called yet, then for old times' sake, we assume libltdl is in an +-dnl eponymous directory: +-AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) +- +-AC_ARG_WITH([ltdl_include], +- [AS_HELP_STRING([--with-ltdl-include=DIR], +- [use the ltdl headers installed in DIR])]) +- +-if test -n "$with_ltdl_include"; then +- if test -f "$with_ltdl_include/ltdl.h"; then : +- else +- AC_MSG_ERROR([invalid ltdl include directory: `$with_ltdl_include']) +- fi +-else +- with_ltdl_include=no +-fi +- +-AC_ARG_WITH([ltdl_lib], +- [AS_HELP_STRING([--with-ltdl-lib=DIR], +- [use the libltdl.la installed in DIR])]) +- +-if test -n "$with_ltdl_lib"; then +- if test -f "$with_ltdl_lib/libltdl.la"; then : +- else +- AC_MSG_ERROR([invalid ltdl library directory: `$with_ltdl_lib']) +- fi +-else +- with_ltdl_lib=no +-fi +- +-case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in +- ,yes,no,no,) +- m4_case(m4_default(_LTDL_TYPE, [convenience]), +- [convenience], [_LTDL_CONVENIENCE], +- [installable], [_LTDL_INSTALLABLE], +- [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) +- ;; +- ,no,no,no,) +- # If the included ltdl is not to be used, then use the +- # preinstalled libltdl we found. +- AC_DEFINE([HAVE_LTDL], [1], +- [Define this if a modern libltdl is already installed]) +- LIBLTDL=-lltdl +- LTDLDEPS= +- LTDLINCL= +- ;; +- ,no*,no,*) +- AC_MSG_ERROR([`--with-ltdl-include' and `--with-ltdl-lib' options must be used together]) +- ;; +- *) with_included_ltdl=no +- LIBLTDL="-L$with_ltdl_lib -lltdl" +- LTDLDEPS= +- LTDLINCL="-I$with_ltdl_include" +- ;; +-esac +-INCLTDL="$LTDLINCL" +- +-# Report our decision... +-AC_MSG_CHECKING([where to find libltdl headers]) +-AC_MSG_RESULT([$LTDLINCL]) +-AC_MSG_CHECKING([where to find libltdl library]) +-AC_MSG_RESULT([$LIBLTDL]) +- +-_LTDL_SETUP +- +-dnl restore autoconf definition. +-m4_popdef([AC_LIBOBJ]) +-m4_popdef([AC_LIBSOURCES]) +- +-AC_CONFIG_COMMANDS_PRE([ +- _ltdl_libobjs= +- _ltdl_ltlibobjs= +- if test -n "$_LT_LIBOBJS"; then +- # Remove the extension. +- _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' +- for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do +- _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" +- _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" +- done +- fi +- AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) +- AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +-]) +- +-# Only expand once: +-m4_define([LTDL_INIT]) +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +-m4trace:/usr/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIB_LTDL' is obsolete. +-You should run autoupdate.])dnl +-LTDL_INIT($@)]) +-m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +-m4trace:/usr/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `AC_WITH_LTDL' is obsolete. +-You should run autoupdate.])dnl +-LTDL_INIT($@)]) +-m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +-m4trace:/usr/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [AC_DIAGNOSE([obsolete], [The macro `LT_WITH_LTDL' is obsolete. +-You should run autoupdate.])dnl +-LTDL_INIT($@)]) +-m4trace:/usr/share/aclocal/ltdl.m4:367: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl +-AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +-AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +-AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +-AC_REQUIRE([LT_LIB_DLLOAD])dnl +-AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +-AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +-AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +-AC_REQUIRE([gl_FUNC_ARGZ])dnl +- +-m4_require([_LT_CHECK_OBJDIR])dnl +-m4_require([_LT_HEADER_DLFCN])dnl +-m4_require([_LT_CHECK_DLPREOPEN])dnl +-m4_require([_LT_DECL_SED])dnl +- +-dnl Don't require this, or it will be expanded earlier than the code +-dnl that sets the variables it relies on: +-_LT_ENABLE_INSTALL +- +-dnl _LTDL_MODE specific code must be called at least once: +-_LTDL_MODE_DISPATCH +- +-# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +-# the user used. This is so that ltdl.h can pick up the parent projects +-# config.h file, The first file in AC_CONFIG_HEADERS must contain the +-# definitions required by ltdl.c. +-# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +-AC_CONFIG_COMMANDS_PRE([dnl +-m4_pattern_allow([^LT_CONFIG_H$])dnl +-m4_ifset([AH_HEADER], +- [LT_CONFIG_H=AH_HEADER], +- [m4_ifset([AC_LIST_HEADERS], +- [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's,^[[ ]]*,,;s,[[ :]].*$,,'`], +- [])])]) +-AC_SUBST([LT_CONFIG_H]) +- +-AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], +- [], [], [AC_INCLUDES_DEFAULT]) +- +-AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +-AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) +- +-m4_pattern_allow([LT_LIBEXT])dnl +-AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) +- +-name= +-eval "lt_libprefix=\"$libname_spec\"" +-m4_pattern_allow([LT_LIBPREFIX])dnl +-AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) +- +-name=ltdl +-eval "LTDLOPEN=\"$libname_spec\"" +-AC_SUBST([LTDLOPEN]) +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:443: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +-AC_CACHE_CHECK([whether deplibs are loaded by dlopen], +- [lt_cv_sys_dlopen_deplibs], +- [# PORTME does your system automatically load deplibs for dlopen? +- # or its logical equivalent (e.g. shl_load for HP-UX < 11) +- # For now, we just catch OSes we know something about -- in the +- # future, we'll try test this programmatically. +- lt_cv_sys_dlopen_deplibs=unknown +- case $host_os in +- aix3*|aix4.1.*|aix4.2.*) +- # Unknown whether this is true for these versions of AIX, but +- # we want this `case' here to explicitly catch those versions. +- lt_cv_sys_dlopen_deplibs=unknown +- ;; +- aix[[4-9]]*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- amigaos*) +- case $host_cpu in +- powerpc) +- lt_cv_sys_dlopen_deplibs=no +- ;; +- esac +- ;; +- darwin*) +- # Assuming the user has installed a libdl from somewhere, this is true +- # If you are looking for one http://www.opendarwin.org/projects/dlcompat +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- freebsd* | dragonfly*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) +- # GNU and its variants, using gnu ld.so (Glibc) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- hpux10*|hpux11*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- interix*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- irix[[12345]]*|irix6.[[01]]*) +- # Catch all versions of IRIX before 6.2, and indicate that we don't +- # know how it worked for any of those versions. +- lt_cv_sys_dlopen_deplibs=unknown +- ;; +- irix*) +- # The case above catches anything before 6.2, and it's known that +- # at 6.2 and later dlopen does load deplibs. +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- netbsd* | netbsdelf*-gnu) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- openbsd*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- osf[[1234]]*) +- # dlopen did load deplibs (at least at 4.x), but until the 5.x series, +- # it did *not* use an RPATH in a shared library to find objects the +- # library depends on, so we explicitly say `no'. +- lt_cv_sys_dlopen_deplibs=no +- ;; +- osf5.0|osf5.0a|osf5.1) +- # dlopen *does* load deplibs and with the right loader patch applied +- # it even uses RPATH in a shared library to search for shared objects +- # that the library depends on, but there's no easy way to know if that +- # patch is installed. Since this is the case, all we can really +- # say is unknown -- it depends on the patch being installed. If +- # it is, this changes to `yes'. Without it, it would be `no'. +- lt_cv_sys_dlopen_deplibs=unknown +- ;; +- osf*) +- # the two cases above should catch all versions of osf <= 5.1. Read +- # the comments above for what we know about them. +- # At > 5.1, deplibs are loaded *and* any RPATH in a shared library +- # is used to find them so we can finally say `yes'. +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- qnx*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- solaris*) +- lt_cv_sys_dlopen_deplibs=yes +- ;; +- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) +- libltdl_cv_sys_dlopen_deplibs=yes +- ;; +- esac +- ]) +-if test "$lt_cv_sys_dlopen_deplibs" != yes; then +- AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], +- [Define if the OS needs help to load dependent libraries for dlopen().]) +-fi +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:542: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:549: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +-AC_CACHE_CHECK([which extension is used for runtime loadable modules], +- [libltdl_cv_shlibext], +-[ +-module=yes +-eval libltdl_cv_shlibext=$shrext_cmds +-module=no +-eval libltdl_cv_shrext=$shrext_cmds +- ]) +-if test -n "$libltdl_cv_shlibext"; then +- m4_pattern_allow([LT_MODULE_EXT])dnl +- AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], +- [Define to the extension used for runtime loadable modules, say, ".so".]) +-fi +-if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then +- m4_pattern_allow([LT_SHARED_EXT])dnl +- AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], +- [Define to the shared library suffix, say, ".dylib".]) +-fi +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:572: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:579: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +-AC_CACHE_CHECK([which variable specifies run-time module search path], +- [lt_cv_module_path_var], [lt_cv_module_path_var="$shlibpath_var"]) +-if test -n "$lt_cv_module_path_var"; then +- m4_pattern_allow([LT_MODULE_PATH_VAR])dnl +- AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], +- [Define to the name of the environment variable that determines the run-time module search path.]) +-fi +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:591: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:598: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +-AC_CACHE_CHECK([for the default library search path], +- [lt_cv_sys_dlsearch_path], +- [lt_cv_sys_dlsearch_path="$sys_lib_dlsearch_path_spec"]) +-if test -n "$lt_cv_sys_dlsearch_path"; then +- sys_dlsearch_path= +- for dir in $lt_cv_sys_dlsearch_path; do +- if test -z "$sys_dlsearch_path"; then +- sys_dlsearch_path="$dir" +- else +- sys_dlsearch_path="$sys_dlsearch_path$PATH_SEPARATOR$dir" +- fi +- done +- m4_pattern_allow([LT_DLSEARCH_PATH])dnl +- AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], +- [Define to the system default library search path.]) +-fi +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:619: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:645: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) +-LT_DLLOADERS= +-AC_SUBST([LT_DLLOADERS]) +- +-AC_LANG_PUSH([C]) +- +-LIBADD_DLOPEN= +-AC_SEARCH_LIBS([dlopen], [dl], +- [AC_DEFINE([HAVE_LIBDL], [1], +- [Define if you have the libdl library or equivalent.]) +- if test "$ac_cv_search_dlopen" != "none required" ; then +- LIBADD_DLOPEN="-ldl" +- fi +- libltdl_cv_lib_dl_dlopen="yes" +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], +- [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +-# include +-#endif +- ]], [[dlopen(0, 0);]])], +- [AC_DEFINE([HAVE_LIBDL], [1], +- [Define if you have the libdl library or equivalent.]) +- libltdl_cv_func_dlopen="yes" +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], +- [AC_CHECK_LIB([svld], [dlopen], +- [AC_DEFINE([HAVE_LIBDL], [1], +- [Define if you have the libdl library or equivalent.]) +- LIBADD_DLOPEN="-lsvld" libltdl_cv_func_dlopen="yes" +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +-if test x"$libltdl_cv_func_dlopen" = xyes || test x"$libltdl_cv_lib_dl_dlopen" = xyes +-then +- lt_save_LIBS="$LIBS" +- LIBS="$LIBS $LIBADD_DLOPEN" +- AC_CHECK_FUNCS([dlerror]) +- LIBS="$lt_save_LIBS" +-fi +-AC_SUBST([LIBADD_DLOPEN]) +- +-LIBADD_SHL_LOAD= +-AC_CHECK_FUNC([shl_load], +- [AC_DEFINE([HAVE_SHL_LOAD], [1], +- [Define if you have the shl_load function.]) +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], +- [AC_CHECK_LIB([dld], [shl_load], +- [AC_DEFINE([HAVE_SHL_LOAD], [1], +- [Define if you have the shl_load function.]) +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" +- LIBADD_SHL_LOAD="-ldld"])]) +-AC_SUBST([LIBADD_SHL_LOAD]) +- +-case $host_os in +-darwin[[1567]].*) +-# We only want this for pre-Mac OS X 10.4. +- AC_CHECK_FUNC([_dyld_func_lookup], +- [AC_DEFINE([HAVE_DYLD], [1], +- [Define if you have the _dyld_func_lookup function.]) +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) +- ;; +-beos*) +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" +- ;; +-cygwin* | mingw* | os2* | pw32*) +- AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" +- ;; +-esac +- +-AC_CHECK_LIB([dld], [dld_link], +- [AC_DEFINE([HAVE_DLD], [1], +- [Define if you have the GNU dld library.]) +- LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +-AC_SUBST([LIBADD_DLD_LINK]) +- +-m4_pattern_allow([^LT_DLPREOPEN$]) +-LT_DLPREOPEN= +-if test -n "$LT_DLLOADERS" +-then +- for lt_loader in $LT_DLLOADERS; do +- LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " +- done +- AC_DEFINE([HAVE_LIBDLLOADER], [1], +- [Define if libdlloader will be built on this platform]) +-fi +-AC_SUBST([LT_DLPREOPEN]) +- +-dnl This isn't used anymore, but set it for backwards compatibility +-LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +-AC_SUBST([LIBADD_DL]) +- +-AC_LANG_POP +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:738: -1- AC_DEFUN([AC_LTDL_DLLIB], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:746: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +-AC_CACHE_CHECK([for _ prefix in compiled symbols], +- [lt_cv_sys_symbol_underscore], +- [lt_cv_sys_symbol_underscore=no +- cat > conftest.$ac_ext <<_LT_EOF +-void nm_test_func(){} +-int main(){nm_test_func;return 0;} +-_LT_EOF +- if AC_TRY_EVAL(ac_compile); then +- # Now try to grab the symbols. +- ac_nlist=conftest.nm +- if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then +- # See whether the symbols have a leading underscore. +- if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then +- lt_cv_sys_symbol_underscore=yes +- else +- if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then +- : +- else +- echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD +- fi +- fi +- else +- echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD +- fi +- else +- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD +- cat conftest.c >&AS_MESSAGE_LOG_FD +- fi +- rm -rf conftest* +- ]) +- sys_symbol_underscore=$lt_cv_sys_symbol_underscore +- AC_SUBST([sys_symbol_underscore]) +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:783: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:790: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +-if test x"$lt_cv_sys_symbol_underscore" = xyes; then +- if test x"$libltdl_cv_func_dlopen" = xyes || +- test x"$libltdl_cv_lib_dl_dlopen" = xyes ; then +- AC_CACHE_CHECK([whether we have to add an underscore for dlsym], +- [libltdl_cv_need_uscore], +- [libltdl_cv_need_uscore=unknown +- save_LIBS="$LIBS" +- LIBS="$LIBS $LIBADD_DLOPEN" +- _LT_TRY_DLOPEN_SELF( +- [libltdl_cv_need_uscore=no], [libltdl_cv_need_uscore=yes], +- [], [libltdl_cv_need_uscore=cross]) +- LIBS="$save_LIBS" +- ]) +- fi +-fi +- +-if test x"$libltdl_cv_need_uscore" = xyes; then +- AC_DEFINE([NEED_USCORE], [1], +- [Define if dlsym() requires a leading underscore in symbol names.]) +-fi +-]) +-m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +-m4trace:/usr/share/aclocal/ltdl.m4:815: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [AC_DIAGNOSE([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. +-You should run autoupdate.])dnl +-m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +-m4trace:/usr/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) +-m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `dlopen' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:111: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. +-You should run autoupdate.])dnl +-_LT_SET_OPTION([LT_INIT], [dlopen]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `dlopen' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +-_LT_SET_OPTION([LT_INIT], [win32-dll]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `win32-dll' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:146: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +-You should run autoupdate.])dnl +-AC_REQUIRE([AC_CANONICAL_HOST])dnl +-_LT_SET_OPTION([LT_INIT], [win32-dll]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `win32-dll' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:195: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:199: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:203: -1- AC_DEFUN([AM_ENABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. +-You should run autoupdate.])dnl +-AC_ENABLE_SHARED($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:204: -1- AC_DEFUN([AM_DISABLE_SHARED], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. +-You should run autoupdate.])dnl +-AC_DISABLE_SHARED($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:249: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:253: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:257: -1- AC_DEFUN([AM_ENABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. +-You should run autoupdate.])dnl +-AC_ENABLE_STATIC($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:258: -1- AC_DEFUN([AM_DISABLE_STATIC], [AC_DIAGNOSE([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. +-You should run autoupdate.])dnl +-AC_DISABLE_STATIC($@)]) +-m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you put +-the `fast-install' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:303: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. +-You should run autoupdate.])dnl +-_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you put +-the `fast-install' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you put +-the `disable-fast-install' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:310: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_DIAGNOSE([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. +-You should run autoupdate.])dnl +-_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you put +-the `disable-fast-install' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `pic-only' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltoptions.m4:358: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_DIAGNOSE([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. +-You should run autoupdate.])dnl +-_LT_SET_OPTION([LT_INIT], [pic-only]) +-AC_DIAGNOSE([obsolete], +-[$0: Remove this warning and the call to _LT_SET_OPTION when you +-put the `pic-only' option into LT_INIT's first parameter.]) +-]) +-m4trace:/usr/share/aclocal/ltsugar.m4:13: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) +-m4trace:/usr/share/aclocal/ltversion.m4:18: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' +-macro_revision='1.3337' +-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +-_LT_DECL(, macro_revision, 0) +-]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:36: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:40: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:44: -1- AC_DEFUN([_LT_AC_TAGVAR]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_PREOPEN]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_LOCK]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LTDL_OBJDIR]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_PATH_MAGIC]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PROG_LD_GNU]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([LT_AC_PROG_EGREP]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:71: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:77: -1- AC_DEFUN([_LT_AC_LANG_CXX]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_F77]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:93: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:96: -1- AC_DEFUN([_LT_PROG_F77]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_FC]) +-m4trace:/usr/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_CXX]) +-m4trace:/usr/share/aclocal-1.14/amversion.m4:14: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' +-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +-dnl require some minimum version. Point them to the right macro. +-m4_if([$1], [1.14.1], [], +- [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +-]) +-m4trace:/usr/share/aclocal-1.14/amversion.m4:33: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl +-m4_ifndef([AC_AUTOCONF_VERSION], +- [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +-_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) +-m4trace:/usr/share/aclocal-1.14/auxdir.m4:47: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. +-AC_PREREQ([2.50])dnl +-# expand $ac_aux_dir to an absolute path +-am_aux_dir=`cd $ac_aux_dir && pwd` +-]) +-m4trace:/usr/share/aclocal-1.14/cond.m4:12: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl +- m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], +- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +-AC_SUBST([$1_TRUE])dnl +-AC_SUBST([$1_FALSE])dnl +-_AM_SUBST_NOTMAKE([$1_TRUE])dnl +-_AM_SUBST_NOTMAKE([$1_FALSE])dnl +-m4_define([_AM_COND_VALUE_$1], [$2])dnl +-if $2; then +- $1_TRUE= +- $1_FALSE='#' +-else +- $1_TRUE='#' +- $1_FALSE= +-fi +-AC_CONFIG_COMMANDS_PRE( +-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then +- AC_MSG_ERROR([[conditional "$1" was never defined. +-Usually this means the macro was only invoked conditionally.]]) +-fi])]) +-m4trace:/usr/share/aclocal-1.14/depend.m4:26: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl +-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +-AC_REQUIRE([AM_MAKE_INCLUDE])dnl +-AC_REQUIRE([AM_DEP_TRACK])dnl +- +-m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], +- [$1], [CXX], [depcc="$CXX" am_compiler_list=], +- [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], +- [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], +- [$1], [UPC], [depcc="$UPC" am_compiler_list=], +- [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], +- [depcc="$$1" am_compiler_list=]) +- +-AC_CACHE_CHECK([dependency style of $depcc], +- [am_cv_$1_dependencies_compiler_type], +-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then +- # We make a subdir and do the tests there. Otherwise we can end up +- # making bogus files that we don't know about and never remove. For +- # instance it was reported that on HP-UX the gcc test will end up +- # making a dummy file named 'D' -- because '-MD' means "put the output +- # in D". +- rm -rf conftest.dir +- mkdir conftest.dir +- # Copy depcomp to subdir because otherwise we won't find it if we're +- # using a relative directory. +- cp "$am_depcomp" conftest.dir +- cd conftest.dir +- # We will build objects and dependencies in a subdirectory because +- # it helps to detect inapplicable dependency modes. For instance +- # both Tru64's cc and ICC support -MD to output dependencies as a +- # side effect of compilation, but ICC will put the dependencies in +- # the current directory while Tru64 will put them in the object +- # directory. +- mkdir sub +- +- am_cv_$1_dependencies_compiler_type=none +- if test "$am_compiler_list" = ""; then +- am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` +- fi +- am__universal=false +- m4_case([$1], [CC], +- [case " $depcc " in #( +- *\ -arch\ *\ -arch\ *) am__universal=true ;; +- esac], +- [CXX], +- [case " $depcc " in #( +- *\ -arch\ *\ -arch\ *) am__universal=true ;; +- esac]) +- +- for depmode in $am_compiler_list; do +- # Setup a source with many dependencies, because some compilers +- # like to wrap large dependency lists on column 80 (with \), and +- # we should not choose a depcomp mode which is confused by this. +- # +- # We need to recreate these files for each test, as the compiler may +- # overwrite some of them when testing with obscure command lines. +- # This happens at least with the AIX C compiler. +- : > sub/conftest.c +- for i in 1 2 3 4 5 6; do +- echo '#include "conftst'$i'.h"' >> sub/conftest.c +- # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with +- # Solaris 10 /bin/sh. +- echo '/* dummy */' > sub/conftst$i.h +- done +- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf +- +- # We check with '-c' and '-o' for the sake of the "dashmstdout" +- # mode. It turns out that the SunPro C++ compiler does not properly +- # handle '-M -o', and we need to detect this. Also, some Intel +- # versions had trouble with output in subdirs. +- am__obj=sub/conftest.${OBJEXT-o} +- am__minus_obj="-o $am__obj" +- case $depmode in +- gcc) +- # This depmode causes a compiler race in universal mode. +- test "$am__universal" = false || continue +- ;; +- nosideeffect) +- # After this tag, mechanisms are not by side-effect, so they'll +- # only be used when explicitly requested. +- if test "x$enable_dependency_tracking" = xyes; then +- continue +- else +- break +- fi +- ;; +- msvc7 | msvc7msys | msvisualcpp | msvcmsys) +- # This compiler won't grok '-c -o', but also, the minuso test has +- # not run yet. These depmodes are late enough in the game, and +- # so weak that their functioning should not be impacted. +- am__obj=conftest.${OBJEXT-o} +- am__minus_obj= +- ;; +- none) break ;; +- esac +- if depmode=$depmode \ +- source=sub/conftest.c object=$am__obj \ +- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ +- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ +- >/dev/null 2>conftest.err && +- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && +- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && +- grep $am__obj sub/conftest.Po > /dev/null 2>&1 && +- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then +- # icc doesn't choke on unknown options, it will just issue warnings +- # or remarks (even with -Werror). So we grep stderr for any message +- # that says an option was ignored or not supported. +- # When given -MP, icc 7.0 and 7.1 complain thusly: +- # icc: Command line warning: ignoring option '-M'; no argument required +- # The diagnosis changed in icc 8.0: +- # icc: Command line remark: option '-MP' not supported +- if (grep 'ignoring option' conftest.err || +- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else +- am_cv_$1_dependencies_compiler_type=$depmode +- break +- fi +- fi +- done +- +- cd .. +- rm -rf conftest.dir +-else +- am_cv_$1_dependencies_compiler_type=none +-fi +-]) +-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +-AM_CONDITIONAL([am__fastdep$1], [ +- test "x$enable_dependency_tracking" != xno \ +- && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +-]) +-m4trace:/usr/share/aclocal-1.14/depend.m4:163: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl +-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +-]) +-m4trace:/usr/share/aclocal-1.14/depend.m4:171: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl +-AS_HELP_STRING( +- [--enable-dependency-tracking], +- [do not reject slow dependency extractors]) +-AS_HELP_STRING( +- [--disable-dependency-tracking], +- [speeds up one-time build])]) +-if test "x$enable_dependency_tracking" != xno; then +- am_depcomp="$ac_aux_dir/depcomp" +- AMDEPBACKSLASH='\' +- am__nodep='_no' +-fi +-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +-AC_SUBST([AMDEPBACKSLASH])dnl +-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +-AC_SUBST([am__nodep])dnl +-_AM_SUBST_NOTMAKE([am__nodep])dnl +-]) +-m4trace:/usr/share/aclocal-1.14/depout.m4:12: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ +- # Older Autoconf quotes --file arguments for eval, but not when files +- # are listed without --file. Let's play safe and only enable the eval +- # if we detect the quoting. +- case $CONFIG_FILES in +- *\'*) eval set x "$CONFIG_FILES" ;; +- *) set x $CONFIG_FILES ;; +- esac +- shift +- for mf +- do +- # Strip MF so we end up with the name of the file. +- mf=`echo "$mf" | sed -e 's/:.*$//'` +- # Check whether this is an Automake generated Makefile or not. +- # We used to match only the files named 'Makefile.in', but +- # some people rename them; so instead we look at the file content. +- # Grep'ing the first line is not enough: some people post-process +- # each Makefile.in and add a new line on top of each file to say so. +- # Grep'ing the whole file is not good either: AIX grep has a line +- # limit of 2048, but all sed's we know have understand at least 4000. +- if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then +- dirpart=`AS_DIRNAME("$mf")` +- else +- continue +- fi +- # Extract the definition of DEPDIR, am__include, and am__quote +- # from the Makefile without running 'make'. +- DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` +- test -z "$DEPDIR" && continue +- am__include=`sed -n 's/^am__include = //p' < "$mf"` +- test -z "$am__include" && continue +- am__quote=`sed -n 's/^am__quote = //p' < "$mf"` +- # Find all dependency output files, they are included files with +- # $(DEPDIR) in their names. We invoke sed twice because it is the +- # simplest approach to changing $(DEPDIR) to its actual value in the +- # expansion. +- for file in `sed -n " +- s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ +- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do +- # Make sure the directory exists. +- test -f "$dirpart/$file" && continue +- fdir=`AS_DIRNAME(["$file"])` +- AS_MKDIR_P([$dirpart/$fdir]) +- # echo "creating $dirpart/$file" +- echo '# dummy' > "$dirpart/$file" +- done +- done +-} +-]) +-m4trace:/usr/share/aclocal-1.14/depout.m4:71: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], +- [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], +- [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +-]) +-m4trace:/usr/share/aclocal-1.14/init.m4:29: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl +-dnl Autoconf wants to disallow AM_ names. We explicitly allow +-dnl the ones we care about. +-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +-AC_REQUIRE([AC_PROG_INSTALL])dnl +-if test "`cd $srcdir && pwd`" != "`pwd`"; then +- # Use -I$(srcdir) only when $(srcdir) != ., so that make's output +- # is not polluted with repeated "-I." +- AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl +- # test to see if srcdir already configured +- if test -f $srcdir/config.status; then +- AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +- fi +-fi +- +-# test whether we have cygpath +-if test -z "$CYGPATH_W"; then +- if (cygpath --version) >/dev/null 2>/dev/null; then +- CYGPATH_W='cygpath -w' +- else +- CYGPATH_W=echo +- fi +-fi +-AC_SUBST([CYGPATH_W]) +- +-# Define the identity of the package. +-dnl Distinguish between old-style and new-style calls. +-m4_ifval([$2], +-[AC_DIAGNOSE([obsolete], +- [$0: two- and three-arguments forms are deprecated.]) +-m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +- AC_SUBST([PACKAGE], [$1])dnl +- AC_SUBST([VERSION], [$2])], +-[_AM_SET_OPTIONS([$1])dnl +-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +-m4_if( +- m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), +- [ok:ok],, +- [m4_fatal([AC_INIT should be called with package and version arguments])])dnl +- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl +- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl +- +-_AM_IF_OPTION([no-define],, +-[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) +- AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl +- +-# Some tools Automake needs. +-AC_REQUIRE([AM_SANITY_CHECK])dnl +-AC_REQUIRE([AC_ARG_PROGRAM])dnl +-AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +-AM_MISSING_PROG([AUTOCONF], [autoconf]) +-AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +-AM_MISSING_PROG([AUTOHEADER], [autoheader]) +-AM_MISSING_PROG([MAKEINFO], [makeinfo]) +-AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +-AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +-AC_REQUIRE([AC_PROG_MKDIR_P])dnl +-# For better backward compatibility. To be removed once Automake 1.9.x +-# dies out for good. For more background, see: +-# +-# +-AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +-# We need awk for the "check" target. The system "awk" is bad on +-# some platforms. +-AC_REQUIRE([AC_PROG_AWK])dnl +-AC_REQUIRE([AC_PROG_MAKE_SET])dnl +-AC_REQUIRE([AM_SET_LEADING_DOT])dnl +-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], +- [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], +- [_AM_PROG_TAR([v7])])]) +-_AM_IF_OPTION([no-dependencies],, +-[AC_PROVIDE_IFELSE([AC_PROG_CC], +- [_AM_DEPENDENCIES([CC])], +- [m4_define([AC_PROG_CC], +- m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +-AC_PROVIDE_IFELSE([AC_PROG_CXX], +- [_AM_DEPENDENCIES([CXX])], +- [m4_define([AC_PROG_CXX], +- m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +-AC_PROVIDE_IFELSE([AC_PROG_OBJC], +- [_AM_DEPENDENCIES([OBJC])], +- [m4_define([AC_PROG_OBJC], +- m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +-AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], +- [_AM_DEPENDENCIES([OBJCXX])], +- [m4_define([AC_PROG_OBJCXX], +- m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +-]) +-AC_REQUIRE([AM_SILENT_RULES])dnl +-dnl The testsuite driver may need to know about EXEEXT, so add the +-dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +-dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +-AC_CONFIG_COMMANDS_PRE(dnl +-[m4_provide_if([_AM_COMPILER_EXEEXT], +- [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +- +-# POSIX will say in a future version that running "rm -f" with no argument +-# is OK; and we want to be able to make that assumption in our Makefile +-# recipes. So use an aggressive probe to check that the usage we want is +-# actually supported "in the wild" to an acceptable degree. +-# See automake bug#10828. +-# To make any issue more visible, cause the running configure to be aborted +-# by default if the 'rm' program in use doesn't match our expectations; the +-# user can still override this though. +-if rm -f && rm -fr && rm -rf; then : OK; else +- cat >&2 <<'END' +-Oops! +- +-Your 'rm' program seems unable to run without file operands specified +-on the command line, even when the '-f' option is present. This is contrary +-to the behaviour of most rm programs out there, and not conforming with +-the upcoming POSIX standard: +- +-Please tell bug-automake@gnu.org about your system, including the value +-of your $PATH and any error possibly output before this message. This +-can help us improve future automake versions. +- +-END +- if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then +- echo 'Configuration will proceed anyway, since you have set the' >&2 +- echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 +- echo >&2 +- else +- cat >&2 <<'END' +-Aborting the configuration process, to ensure you take notice of the issue. +- +-You can download and install GNU coreutils to get an 'rm' implementation +-that behaves properly: . +- +-If you want to complete the configuration process using your problematic +-'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +-to "yes", and re-run configure. +- +-END +- AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) +- fi +-fi +-]) +-m4trace:/usr/share/aclocal-1.14/init.m4:183: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +-_am_arg=$1 +-_am_stamp_count=1 +-for _am_header in $config_headers :; do +- case $_am_header in +- $_am_arg | $_am_arg:* ) +- break ;; +- * ) +- _am_stamp_count=`expr $_am_stamp_count + 1` ;; +- esac +-done +-echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) +-m4trace:/usr/share/aclocal-1.14/install-sh.m4:11: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +-if test x"${install_sh}" != xset; then +- case $am_aux_dir in +- *\ * | *\ *) +- install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; +- *) +- install_sh="\${SHELL} $am_aux_dir/install-sh" +- esac +-fi +-AC_SUBST([install_sh])]) +-m4trace:/usr/share/aclocal-1.14/lead-dot.m4:10: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null +-mkdir .tst 2>/dev/null +-if test -d .tst; then +- am__leading_dot=. +-else +- am__leading_dot=_ +-fi +-rmdir .tst 2>/dev/null +-AC_SUBST([am__leading_dot])]) +-m4trace:/usr/share/aclocal-1.14/lex.m4:13: -1- AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl +-AC_REQUIRE([AM_MISSING_HAS_RUN])dnl +-AC_REQUIRE([AC_PROG_LEX])dnl +-if test "$LEX" = :; then +- LEX=${am_missing_run}flex +-fi]) +-m4trace:/usr/share/aclocal-1.14/maintainer.m4:16: -1- AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), +- [enable], [m4_define([am_maintainer_other], [disable])], +- [disable], [m4_define([am_maintainer_other], [enable])], +- [m4_define([am_maintainer_other], [enable]) +- m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +-AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) +- dnl maintainer-mode's default is 'disable' unless 'enable' is passed +- AC_ARG_ENABLE([maintainer-mode], +- [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], +- am_maintainer_other[ make rules and dependencies not useful +- (and sometimes confusing) to the casual installer])], +- [USE_MAINTAINER_MODE=$enableval], +- [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) +- AC_MSG_RESULT([$USE_MAINTAINER_MODE]) +- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) +- MAINT=$MAINTAINER_MODE_TRUE +- AC_SUBST([MAINT])dnl +- +-]) +-m4trace:/usr/share/aclocal-1.14/make.m4:12: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} +-cat > confinc << 'END' +-am__doit: +- @echo this is the am__doit target +-.PHONY: am__doit +-END +-# If we don't find an include directive, just comment out the code. +-AC_MSG_CHECKING([for style of include used by $am_make]) +-am__include="#" +-am__quote= +-_am_result=none +-# First try GNU make style include. +-echo "include confinc" > confmf +-# Ignore all kinds of additional output from 'make'. +-case `$am_make -s -f confmf 2> /dev/null` in #( +-*the\ am__doit\ target*) +- am__include=include +- am__quote= +- _am_result=GNU +- ;; +-esac +-# Now try BSD make style include. +-if test "$am__include" = "#"; then +- echo '.include "confinc"' > confmf +- case `$am_make -s -f confmf 2> /dev/null` in #( +- *the\ am__doit\ target*) +- am__include=.include +- am__quote="\"" +- _am_result=BSD +- ;; +- esac +-fi +-AC_SUBST([am__include]) +-AC_SUBST([am__quote]) +-AC_MSG_RESULT([$_am_result]) +-rm -f confinc confmf +-]) +-m4trace:/usr/share/aclocal-1.14/missing.m4:11: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) +-$1=${$1-"${am_missing_run}$2"} +-AC_SUBST($1)]) +-m4trace:/usr/share/aclocal-1.14/missing.m4:20: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +-AC_REQUIRE_AUX_FILE([missing])dnl +-if test x"${MISSING+set}" != xset; then +- case $am_aux_dir in +- *\ * | *\ *) +- MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; +- *) +- MISSING="\${SHELL} $am_aux_dir/missing" ;; +- esac +-fi +-# Use eval to expand $SHELL +-if eval "$MISSING --is-lightweight"; then +- am_missing_run="$MISSING " +-else +- am_missing_run= +- AC_MSG_WARN(['missing' script is too old or missing]) +-fi +-]) +-m4trace:/usr/share/aclocal-1.14/options.m4:11: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) +-m4trace:/usr/share/aclocal-1.14/options.m4:17: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) +-m4trace:/usr/share/aclocal-1.14/options.m4:23: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +-m4trace:/usr/share/aclocal-1.14/options.m4:29: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +-m4trace:/usr/share/aclocal-1.14/prog-cc-c-o.m4:12: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +-AC_REQUIRE_AUX_FILE([compile])dnl +-AC_LANG_PUSH([C])dnl +-AC_CACHE_CHECK( +- [whether $CC understands -c and -o together], +- [am_cv_prog_cc_c_o], +- [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) +- # Make sure it works both with $CC and with simple cc. +- # Following AC_PROG_CC_C_O, we do the test twice because some +- # compilers refuse to overwrite an existing .o file with -o, +- # though they will create one. +- am_cv_prog_cc_c_o=yes +- for am_i in 1 2; do +- if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ +- && test -f conftest2.$ac_objext; then +- : OK +- else +- am_cv_prog_cc_c_o=no +- break +- fi +- done +- rm -f core conftest* +- unset am_i]) +-if test "$am_cv_prog_cc_c_o" != yes; then +- # Losing compiler, so override with the script. +- # FIXME: It is wrong to rewrite CC. +- # But if we don't then we get into trouble of one sort or another. +- # A longer-term fix would be to have automake use am__CC in this case, +- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" +- CC="$am_aux_dir/compile $CC" +-fi +-AC_LANG_POP([C])]) +-m4trace:/usr/share/aclocal-1.14/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) +-m4trace:/usr/share/aclocal-1.14/runlog.m4:12: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD +- ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD +- ac_status=$? +- echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD +- (exit $ac_status); }]) +-m4trace:/usr/share/aclocal-1.14/sanity.m4:11: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +-# Reject unsafe characters in $srcdir or the absolute working directory +-# name. Accept space and tab only in the latter. +-am_lf=' +-' +-case `pwd` in +- *[[\\\"\#\$\&\'\`$am_lf]]*) +- AC_MSG_ERROR([unsafe absolute working directory name]);; +-esac +-case $srcdir in +- *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) +- AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +-esac +- +-# Do 'set' in a subshell so we don't clobber the current shell's +-# arguments. Must try -L first in case configure is actually a +-# symlink; some systems play weird games with the mod time of symlinks +-# (eg FreeBSD returns the mod time of the symlink's containing +-# directory). +-if ( +- am_has_slept=no +- for am_try in 1 2; do +- echo "timestamp, slept: $am_has_slept" > conftest.file +- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` +- if test "$[*]" = "X"; then +- # -L didn't work. +- set X `ls -t "$srcdir/configure" conftest.file` +- fi +- if test "$[*]" != "X $srcdir/configure conftest.file" \ +- && test "$[*]" != "X conftest.file $srcdir/configure"; then +- +- # If neither matched, then we have a broken ls. This can happen +- # if, for instance, CONFIG_SHELL is bash and it inherits a +- # broken ls alias from the environment. This has actually +- # happened. Such a system could not be considered "sane". +- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +- alias in your environment]) +- fi +- if test "$[2]" = conftest.file || test $am_try -eq 2; then +- break +- fi +- # Just in case. +- sleep 1 +- am_has_slept=yes +- done +- test "$[2]" = conftest.file +- ) +-then +- # Ok. +- : +-else +- AC_MSG_ERROR([newly created file is older than distributed files! +-Check your system clock]) +-fi +-AC_MSG_RESULT([yes]) +-# If we didn't sleep, we still need to ensure time stamps of config.status and +-# generated files are strictly newer. +-am_sleep_pid= +-if grep 'slept: no' conftest.file >/dev/null 2>&1; then +- ( sleep 1 ) & +- am_sleep_pid=$! +-fi +-AC_CONFIG_COMMANDS_PRE( +- [AC_MSG_CHECKING([that generated files are newer than configure]) +- if test -n "$am_sleep_pid"; then +- # Hide warnings about reused PIDs. +- wait $am_sleep_pid 2>/dev/null +- fi +- AC_MSG_RESULT([done])]) +-rm -f conftest.file +-]) +-m4trace:/usr/share/aclocal-1.14/silent.m4:12: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl +-AS_HELP_STRING( +- [--enable-silent-rules], +- [less verbose build output (undo: "make V=1")]) +-AS_HELP_STRING( +- [--disable-silent-rules], +- [verbose build output (undo: "make V=0")])dnl +-]) +-case $enable_silent_rules in @%:@ ((( +- yes) AM_DEFAULT_VERBOSITY=0;; +- no) AM_DEFAULT_VERBOSITY=1;; +- *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +-esac +-dnl +-dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +-dnl do not support nested variable expansions. +-dnl See automake bug#9928 and bug#10237. +-am_make=${MAKE-make} +-AC_CACHE_CHECK([whether $am_make supports nested variables], +- [am_cv_make_support_nested_variables], +- [if AS_ECHO([['TRUE=$(BAR$(V)) +-BAR0=false +-BAR1=true +-V=1 +-am__doit: +- @$(TRUE) +-.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then +- am_cv_make_support_nested_variables=yes +-else +- am_cv_make_support_nested_variables=no +-fi]) +-if test $am_cv_make_support_nested_variables = yes; then +- dnl Using '$V' instead of '$(V)' breaks IRIX make. +- AM_V='$(V)' +- AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +-else +- AM_V=$AM_DEFAULT_VERBOSITY +- AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +-fi +-AC_SUBST([AM_V])dnl +-AM_SUBST_NOTMAKE([AM_V])dnl +-AC_SUBST([AM_DEFAULT_V])dnl +-AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +-AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +-AM_BACKSLASH='\' +-AC_SUBST([AM_BACKSLASH])dnl +-_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +-]) +-m4trace:/usr/share/aclocal-1.14/strip.m4:17: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +-# Installed binaries are usually stripped using 'strip' when the user +-# run "make install-strip". However 'strip' might not be the right +-# tool to use in cross-compilation environments, therefore Automake +-# will honor the 'STRIP' environment variable to overrule this program. +-dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +-if test "$cross_compiling" != no; then +- AC_CHECK_TOOL([STRIP], [strip], :) +-fi +-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +-AC_SUBST([INSTALL_STRIP_PROGRAM])]) +-m4trace:/usr/share/aclocal-1.14/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) +-m4trace:/usr/share/aclocal-1.14/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) +-m4trace:/usr/share/aclocal-1.14/tar.m4:23: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used +-# in the wild :-( We should find a proper way to deprecate it ... +-AC_SUBST([AMTAR], ['$${TAR-tar}']) +- +-# We'll loop over all known methods to create a tar archive until one works. +-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +- +-m4_if([$1], [v7], +- [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], +- +- [m4_case([$1], +- [ustar], +- [# The POSIX 1988 'ustar' format is defined with fixed-size fields. +- # There is notably a 21 bits limit for the UID and the GID. In fact, +- # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 +- # and bug#13588). +- am_max_uid=2097151 # 2^21 - 1 +- am_max_gid=$am_max_uid +- # The $UID and $GID variables are not portable, so we need to resort +- # to the POSIX-mandated id(1) utility. Errors in the 'id' calls +- # below are definitely unexpected, so allow the users to see them +- # (that is, avoid stderr redirection). +- am_uid=`id -u || echo unknown` +- am_gid=`id -g || echo unknown` +- AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) +- if test $am_uid -le $am_max_uid; then +- AC_MSG_RESULT([yes]) +- else +- AC_MSG_RESULT([no]) +- _am_tools=none +- fi +- AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) +- if test $am_gid -le $am_max_gid; then +- AC_MSG_RESULT([yes]) +- else +- AC_MSG_RESULT([no]) +- _am_tools=none +- fi], +- +- [pax], +- [], +- +- [m4_fatal([Unknown tar format])]) +- +- AC_MSG_CHECKING([how to create a $1 tar archive]) +- +- # Go ahead even if we have the value already cached. We do so because we +- # need to set the values for the 'am__tar' and 'am__untar' variables. +- _am_tools=${am_cv_prog_tar_$1-$_am_tools} +- +- for _am_tool in $_am_tools; do +- case $_am_tool in +- gnutar) +- for _am_tar in tar gnutar gtar; do +- AM_RUN_LOG([$_am_tar --version]) && break +- done +- am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' +- am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' +- am__untar="$_am_tar -xf -" +- ;; +- plaintar) +- # Must skip GNU tar: if it does not support --format= it doesn't create +- # ustar tarball either. +- (tar --version) >/dev/null 2>&1 && continue +- am__tar='tar chf - "$$tardir"' +- am__tar_='tar chf - "$tardir"' +- am__untar='tar xf -' +- ;; +- pax) +- am__tar='pax -L -x $1 -w "$$tardir"' +- am__tar_='pax -L -x $1 -w "$tardir"' +- am__untar='pax -r' +- ;; +- cpio) +- am__tar='find "$$tardir" -print | cpio -o -H $1 -L' +- am__tar_='find "$tardir" -print | cpio -o -H $1 -L' +- am__untar='cpio -i -H $1 -d' +- ;; +- none) +- am__tar=false +- am__tar_=false +- am__untar=false +- ;; +- esac +- +- # If the value was cached, stop now. We just wanted to have am__tar +- # and am__untar set. +- test -n "${am_cv_prog_tar_$1}" && break +- +- # tar/untar a dummy directory, and stop if the command works. +- rm -rf conftest.dir +- mkdir conftest.dir +- echo GrepMe > conftest.dir/file +- AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) +- rm -rf conftest.dir +- if test -s conftest.tar; then +- AM_RUN_LOG([$am__untar /dev/null 2>&1 && break +- fi +- done +- rm -rf conftest.dir +- +- AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +- AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +- +-AC_SUBST([am__tar]) +-AC_SUBST([am__untar]) +-]) +-m4trace:acinclude.m4:173: -1- AC_DEFUN([GMP_SUBST_CHECK_FUNCS], [m4_if([$1],,, +-[_GMP_SUBST_CHECK_FUNCS(ac_cv_func_[$1],HAVE_[]m4_translit([$1],[a-z],[A-Z])_01) +-GMP_SUBST_CHECK_FUNCS(m4_shift($@))])]) +-m4trace:acinclude.m4:179: -1- AC_DEFUN([_GMP_SUBST_CHECK_FUNCS], [case $[$1] in +-yes) AC_SUBST([$2],1) ;; +-no) [$2]=0 ;; +-esac +-]) +-m4trace:acinclude.m4:191: -1- AC_DEFUN([GMP_SUBST_CHECK_HEADERS], [m4_if([$1],,, +-[_GMP_SUBST_CHECK_HEADERS(ac_cv_header_[]m4_translit([$1],[./],[__]), +-HAVE_[]m4_translit([$1],[a-z./],[A-Z__])_01) +-GMP_SUBST_CHECK_HEADERS(m4_shift($@))])]) +-m4trace:acinclude.m4:198: -1- AC_DEFUN([_GMP_SUBST_CHECK_HEADERS], [case $[$1] in +-yes) AC_SUBST([$2],1) ;; +-no) [$2]=0 ;; +-esac +-]) +-m4trace:acinclude.m4:221: -1- AC_DEFUN([GMP_COMPARE_GE], [gmp_compare_ge=no +-GMP_COMPARE_GE_INTERNAL($@) +-]) +-m4trace:acinclude.m4:226: -1- AC_DEFUN([GMP_COMPARE_GE_INTERNAL], [ifelse(len([$3]),0, +-[if test -n "$1" && test "$1" -ge $2; then +- gmp_compare_ge=yes +-fi], +-[if test -n "$1"; then +- if test "$1" -gt $2; then +- gmp_compare_ge=yes +- else +- if test "$1" -eq $2; then +- GMP_COMPARE_GE_INTERNAL(m4_shift(m4_shift($@))) +- fi +- fi +-fi]) +-]) +-m4trace:acinclude.m4:276: -1- AC_DEFUN([GMP_PROG_AR], [dnl Want to establish $AR before libtool initialization. +-AC_BEFORE([$0],[AC_PROG_LIBTOOL]) +-gmp_user_AR=$AR +-AC_CHECK_TOOL(AR, ar, ar) +-if test -z "$gmp_user_AR"; then +- eval arflags=\"\$ar${abi1}_flags\" +- test -n "$arflags" || eval arflags=\"\$ar${abi2}_flags\" +- if test -n "$arflags"; then +- AC_MSG_CHECKING([for extra ar flags]) +- AR="$AR $arflags" +- ac_cv_prog_AR="$AR $arflags" +- ac_cv_prog_ac_ct_AR="$AR $arflags" +- AC_MSG_RESULT([$arflags]) +- fi +-fi +-if test -z "$AR_FLAGS"; then +- AR_FLAGS=cq +-fi +-]) +-m4trace:acinclude.m4:308: -1- AC_DEFUN([GMP_PROG_M4], [AC_ARG_VAR(M4,[m4 macro processor]) +-AC_CACHE_CHECK([for suitable m4], +- gmp_cv_prog_m4, +-[if test -n "$M4"; then +- gmp_cv_prog_m4="$M4" +-else +- cat >conftest.m4 <<\EOF +-dnl Must protect this against being expanded during autoconf m4! +-dnl Dont put "dnl"s in this as autoconf will flag an error for unexpanded +-dnl macros. +-[define(dollarhash,``$][#'')ifelse(dollarhash(x),1,`define(t1,Y)', +-``bad: $][# not supported (SunOS /usr/bin/m4) +-'')ifelse(eval(89),89,`define(t2,Y)', +-`bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) +-')ifelse(eval(9,9),10,`define(t3,Y)', +-`bad: eval() doesnt support radix in eval (FreeBSD 8.x,9.0,9.1,9.2 m4) +-')ifelse(t1`'t2`'t3,YYY,`good +-')] +-EOF +-dnl ' <- balance the quotes for emacs sh-mode +- echo "trying m4" >&AC_FD_CC +- gmp_tmp_val=`(m4 conftest.m4) 2>&AC_FD_CC` +- echo "$gmp_tmp_val" >&AC_FD_CC +- if test "$gmp_tmp_val" = good; then +- gmp_cv_prog_m4="m4" +- else +- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +-dnl $ac_dummy forces splitting on constant user-supplied paths. +-dnl POSIX.2 word splitting is done only on the output of word expansions, +-dnl not every word. This closes a longstanding sh security hole. +- ac_dummy="$PATH:/usr/5bin" +- for ac_dir in $ac_dummy; do +- test -z "$ac_dir" && ac_dir=. +- echo "trying $ac_dir/m4" >&AC_FD_CC +- gmp_tmp_val=`($ac_dir/m4 conftest.m4) 2>&AC_FD_CC` +- echo "$gmp_tmp_val" >&AC_FD_CC +- if test "$gmp_tmp_val" = good; then +- gmp_cv_prog_m4="$ac_dir/m4" +- break +- fi +- done +- IFS="$ac_save_ifs" +- if test -z "$gmp_cv_prog_m4"; then +- AC_MSG_ERROR([No usable m4 in \$PATH or /usr/5bin (see config.log for reasons).]) +- fi +- fi +- rm -f conftest.m4 +-fi]) +-M4="$gmp_cv_prog_m4" +-AC_SUBST(M4) +-]) +-m4trace:acinclude.m4:378: -1- AC_DEFUN([GMP_M4_M4WRAP_SPURIOUS], [AC_REQUIRE([GMP_PROG_M4]) +-AC_CACHE_CHECK([if m4wrap produces spurious output], +- gmp_cv_m4_m4wrap_spurious, +-[# hide the d-n-l from autoconf's error checking +-tmp_d_n_l=d""nl +-cat >conftest.m4 <&AC_FD_CC +-cat conftest.m4 >&AC_FD_CC +-tmp_chars=`$M4 conftest.m4 | wc -c` +-echo produces $tmp_chars chars output >&AC_FD_CC +-rm -f conftest.m4 +-if test $tmp_chars = 0; then +- gmp_cv_m4_m4wrap_spurious=no +-else +- gmp_cv_m4_m4wrap_spurious=yes +-fi +-]) +-GMP_DEFINE_RAW(["define(,<$gmp_cv_m4_m4wrap_spurious>)"]) +-]) +-m4trace:acinclude.m4:422: -1- AC_DEFUN([GMP_PROG_NM], [dnl Make sure we're the first to call AC_PROG_NM, so our extra flags are +-dnl used by everyone. +-AC_BEFORE([$0],[AC_PROG_NM]) +-gmp_user_NM=$NM +-AC_PROG_NM +- +-# FIXME: When cross compiling (ie. $ac_tool_prefix not empty), libtool +-# defaults to plain "nm" if a "${ac_tool_prefix}nm" is not found. In this +-# case run it again to try the native "nm", firstly so that likely locations +-# are searched, secondly so that -B or -p are added if necessary for BSD +-# format. This is necessary for instance on OSF with "./configure +-# --build=alphaev5-dec-osf --host=alphaev6-dec-osf". +-# +-if test -z "$gmp_user_NM" && test -n "$ac_tool_prefix" && test "$NM" = nm; then +- $as_unset lt_cv_path_NM +- gmp_save_ac_tool_prefix=$ac_tool_prefix +- ac_tool_prefix= +- NM= +- AC_PROG_NM +- ac_tool_prefix=$gmp_save_ac_tool_prefix +-fi +- +-if test -z "$gmp_user_NM"; then +- eval nmflags=\"\$nm${abi1}_flags\" +- test -n "$nmflags" || eval nmflags=\"\$nm${abi2}_flags\" +- if test -n "$nmflags"; then +- AC_MSG_CHECKING([for extra nm flags]) +- NM="$NM $nmflags" +- AC_MSG_RESULT([$nmflags]) +- fi +-fi +-]) +-m4trace:acinclude.m4:479: -1- AC_DEFUN([GMP_PROG_CC_WORKS], [AC_MSG_CHECKING([compiler $1]) +-gmp_prog_cc_works=yes +- +-# first see a simple "main()" works, then go on to other checks +-GMP_PROG_CC_WORKS_PART([$1], []) +- +-GMP_PROG_CC_WORKS_PART([$1], [function pointer return], +-[/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +-]) +- +-GMP_PROG_CC_WORKS_PART([$1], [cmov instruction], +-[/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +-]) +- +-GMP_PROG_CC_WORKS_PART([$1], [double -> ulong conversion], +-[/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +-]) +- +-GMP_PROG_CC_WORKS_PART([$1], [double negation], +-[/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +-]) +- +-GMP_PROG_CC_WORKS_PART([$1], [double -> float conversion], +-[/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +-]) +- +-GMP_PROG_CC_WORKS_PART([$1], [gnupro alpha ev6 char spilling], +-[/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +-]) +- +-# __builtin_alloca is not available everywhere, check it exists before +-# seeing that it works +-GMP_PROG_CC_WORKS_PART_TEST([$1],[__builtin_alloca availability], +-[int k; int foo () { __builtin_alloca (k); }], +- [GMP_PROG_CC_WORKS_PART([$1], [alloca array], +-[/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +-])]) +- +-GMP_PROG_CC_WORKS_PART([$1], [abs int -> double conversion], +-[/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +-]) +- +-GMP_PROG_CC_WORKS_PART([$1], [long long reliability test 1], +-[/* The following provokes a segfault in the compiler on powerpc-apple-darwin. +- Extracted from tests/mpn/t-iord_u.c. Causes Apple's gcc 3.3 build 1640 and +- 1666 to segfault with e.g., -O2 -mpowerpc64. */ +- +-#if defined (__GNUC__) && ! defined (__cplusplus) +-typedef unsigned long long t1;typedef t1*t2; +-static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0) +-{t1 c,x,r;int i;if(v0){c=1;for(i=1;i> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-]) +- +-GMP_PROG_CC_WORKS_PART_MAIN([$1], [mpn_lshift_com optimization 2], +-[/* The following is mis-compiled by Intel ia-64 icc version 1.8 under +- "icc -O3", After several calls, the function writes partial garbage to +- the result vector. Perhaps relates to the chk.a.nc insn. This code needs +- to be run to show the problem, but that's fine, the offending cc is a +- native-only compiler so we don't have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-#include +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-]) +- +- +-# A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled +-# by recent versions of gcc. +-# +-if test "$gmp_prog_cc_works" = yes; then +- case $host in +- X86_PATTERN) +- # this problem only arises in PIC code, so don't need to test when +- # --disable-shared. We don't necessarily have $enable_shared set to +- # yes at this point, it will still be unset for the default (which is +- # yes); hence the use of "!= no". +- if test "$enable_shared" != no; then +- GMP_PROG_CC_X86_GOT_EAX_EMITTED([$1], +- [GMP_ASM_X86_GOT_EAX_OK([$1],, +- [gmp_prog_cc_works="no, bad gas GOT with eax"])]) +- fi +- ;; +- esac +-fi +- +-AC_MSG_RESULT($gmp_prog_cc_works) +-case $gmp_prog_cc_works in +- yes) +- [$2] +- ;; +- *) +- [$3] +- ;; +-esac +-]) +-m4trace:acinclude.m4:785: -1- AC_DEFUN([GMP_PROG_CC_WORKS_PART], [GMP_PROG_CC_WORKS_PART_MAIN([$1],[$2], +-[$3] +-[int main () { return 0; }]) +-]) +-m4trace:acinclude.m4:794: -1- AC_DEFUN([GMP_PROG_CC_WORKS_PART_MAIN], [GMP_PROG_CC_WORKS_PART_TEST([$1],[$2],[$3], +- [], +- gmp_prog_cc_works="no[]m4_if([$2],,,[[, ]])[$2]", +- gmp_prog_cc_works="no[]m4_if([$2],,,[[, ]])[$2][[, program does not run]]") +-]) +-m4trace:acinclude.m4:804: -1- AC_DEFUN([GMP_PROG_CC_WORKS_PART_TEST], [if test "$gmp_prog_cc_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.c <&AC_FD_CC +- gmp_compile="$1 conftest.c >&AC_FD_CC" +- if AC_TRY_EVAL(gmp_compile); then +- cc_works_part=yes +- if test "$cross_compiling" = no; then +- if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then :; +- else +- cc_works_part=norun +- fi +- fi +- else +- cc_works_part=no +- fi +- if test "$cc_works_part" != yes; then +- echo "failed program was:" >&AC_FD_CC +- cat conftest.c >&AC_FD_CC +- fi +- rm -f conftest* a.out b.out a.exe a_out.exe +- case $cc_works_part in +- yes) +- $4 +- ;; +- no) +- $5 +- ;; +- norun) +- $6 +- ;; +- esac +-fi +-]) +-m4trace:acinclude.m4:851: -1- AC_DEFUN([GMP_PROG_CC_WORKS_LONGLONG], [AC_MSG_CHECKING([compiler $1 has long long]) +-cat >conftest.c <&AC_FD_CC +- cat conftest.c >&AC_FD_CC +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-AC_MSG_RESULT($gmp_prog_cc_works) +-if test $gmp_prog_cc_works = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:891: -1- AC_DEFUN([GMP_C_TEST_SIZEOF], [echo "configure: testlist $2" >&AC_FD_CC +-[gmp_sizeof_type=`echo "$2" | sed 's/sizeof-\([a-z]*\).*/\1/'`] +-[gmp_sizeof_want=`echo "$2" | sed 's/sizeof-[a-z]*-\([0-9]*\).*/\1/'`] +-AC_MSG_CHECKING([compiler $1 has sizeof($gmp_sizeof_type)==$gmp_sizeof_want]) +-cat >conftest.c <conftest.c <&AC_FD_CC +-cat >conftest.c <<\EOF +-[int foo; +-int bar () { return foo; } +-]EOF +-tmp_got_emitted=no +-gmp_compile="$1 -fPIC -S conftest.c >&AC_FD_CC 2>&1" +-if AC_TRY_EVAL(gmp_compile); then +- if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then +- tmp_got_emitted=yes +- fi +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_emitted" >&AC_FD_CC +-if test "$tmp_got_emitted" = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:1025: -1- AC_DEFUN([GMP_HPC_HPPA_2_0], [AC_MSG_CHECKING([whether HP compiler $1 is good for 64-bits]) +-# Bad compiler output: +-# ccom: HP92453-01 G.10.32.05 HP C Compiler +-# Good compiler output: +-# ccom: HP92453-01 A.10.32.30 HP C Compiler +-# Let A.10.32.30 or higher be ok. +-echo >conftest.c +-gmp_tmp_vs=`$1 $2 -V -c -o conftest.$OBJEXT conftest.c 2>&1 | grep "^ccom:"` +-echo "Version string: $gmp_tmp_vs" >&AC_FD_CC +-rm conftest* +-gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\([[0-9]]*\).*/\1/'` +-gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` +-gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` +-echo "Version number: $gmp_tmp_v1.$gmp_tmp_v2.$gmp_tmp_v3" >&AC_FD_CC +-if test -z "$gmp_tmp_v1"; then +- gmp_hpc_64bit=not-applicable +-else +- GMP_COMPARE_GE($gmp_tmp_v1, 10, $gmp_tmp_v2, 32, $gmp_tmp_v3, 30) +- gmp_hpc_64bit=$gmp_compare_ge +-fi +-AC_MSG_RESULT($gmp_hpc_64bit) +-if test $gmp_hpc_64bit = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:1066: -1- AC_DEFUN([GMP_GCC_ARM_UMODSI], [AC_MSG_CHECKING([whether ARM gcc unsigned division works]) +-tmp_version=`$1 --version` +-echo "$tmp_version" >&AC_FD_CC +-case $tmp_version in +- [2.95 | 2.95.[123]]) +- ifelse([$3],,:,[$3]) +- gmp_gcc_arm_umodsi_result=["no, gcc 2.95.[0123]"] ;; +- *) +- ifelse([$2],,:,[$2]) +- gmp_gcc_arm_umodsi_result=yes ;; +-esac +-AC_MSG_RESULT([$gmp_gcc_arm_umodsi_result]) +-]) +-m4trace:acinclude.m4:1091: -1- AC_DEFUN([GMP_GCC_MIPS_O32], [AC_MSG_CHECKING([whether gcc supports o32]) +-echo 'int x;' >conftest.c +-echo "$1 -mabi=32 -c conftest.c" >&AC_FD_CC +-if $1 -mabi=32 -c conftest.c >conftest.out 2>&1; then +- result=yes +-else +- cat conftest.out >&AC_FD_CC +- if grep "cc1: Invalid option \`abi=32'" conftest.out >/dev/null; then +- result=yes +- else +- result=no +- fi +-fi +-rm -f conftest.* +-AC_MSG_RESULT($result) +-if test $result = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:1126: -1- AC_DEFUN([GMP_GCC_NO_CPP_PRECOMP], [if test "$ccbase" = gcc; then +- AC_MSG_CHECKING([compiler $2 $3 -no-cpp-precomp]) +- result=no +- cat >conftest.c </dev/null; then : ; +- else +- result=yes +- fi +- fi +- cat conftest.out >&AC_FD_CC +- rm -f conftest* a.out b.out a.exe a_out.exe +- AC_MSG_RESULT($result) +- if test "$result" = yes; then +- ifelse([$4],,:,[$4]) +- else +- ifelse([$5],,:,[$5]) +- fi +-fi +-]) +-m4trace:acinclude.m4:1161: -1- AC_DEFUN([GMP_GCC_PENTIUM4_SSE2], [AC_MSG_CHECKING([whether gcc is good for sse2]) +-case `$1 -dumpversion` in +- [3.[012] | 3.[012].*]) result=no ;; +- *) result=yes ;; +-esac +-AC_MSG_RESULT($result) +-if test "$result" = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:1186: -1- AC_DEFUN([GMP_GCC_WA_MCPU], [AC_MSG_CHECKING([assembler $1 $2]) +-result=no +-cat >conftest.c </dev/null; then : ; +- else +- result=yes +- fi +-fi +-cat conftest.out >&AC_FD_CC +-rm -f conftest* +-AC_MSG_RESULT($result) +-if test "$result" = yes; then +- ifelse([$3],,:,[$3]) +-else +- ifelse([$4],,:,[$4]) +-fi +-]) +-m4trace:acinclude.m4:1238: -1- AC_DEFUN([GMP_GCC_WA_OLDAS], [AC_MSG_CHECKING([for $1 -Wa,-oldas]) +-result=no +-cat >conftest.c <&AC_FD_CC +-gmp_compile="$1 -c conftest.c >&AC_FD_CC 2>&1" +-if AC_TRY_EVAL(gmp_compile); then : ; +-else +- # empty fails +- gmp_compile="$1 -Wa,-oldas -c conftest.c >&AC_FD_CC 2>&1" +- if AC_TRY_EVAL(gmp_compile); then +- # but with -Wa,-oldas it works +- result=yes +- fi +-fi +-rm -f conftest* +-AC_MSG_RESULT($result) +-if test "$result" = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:1298: -1- AC_DEFUN([GMP_OS_X86_XMM], [AC_CACHE_CHECK([whether the operating system supports XMM registers], +- gmp_cv_os_x86_xmm, +-[if test "$build" = "$host"; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.s <conftest.s <&AC_FD_CC +- cat conftest.s >&AC_FD_CC +-fi +-rm -f conftest* +-AC_MSG_RESULT($result) +-if test "$result" = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:1436: -1- AC_DEFUN([GMP_PROG_CXX_WORKS], [AC_MSG_CHECKING([C++ compiler $1]) +-gmp_prog_cxx_works=yes +- +-# start with a plain "main()", then go on to further checks +-GMP_PROG_CXX_WORKS_PART([$1], []) +- +-GMP_PROG_CXX_WORKS_PART([$1], [namespace], +-[namespace foo { } +-using namespace foo; +-]) +- +-# GMP requires the standard C++ iostream classes +-GMP_PROG_CXX_WORKS_PART([$1], [std iostream], +-[/* This test rejects g++ 2.7.2 which doesn't have , only a +- pre-standard iostream.h. */ +-#include +- +-/* This test rejects OSF 5.1 Compaq C++ in its default pre-standard iostream +- mode, since that mode puts cout in the global namespace, not "std". */ +-void someoutput (void) { std::cout << 123; } +-]) +- +-AC_MSG_RESULT($gmp_prog_cxx_works) +-case $gmp_prog_cxx_works in +- yes) +- [$2] +- ;; +- *) +- [$3] +- ;; +-esac +-]) +-m4trace:acinclude.m4:1472: -1- AC_DEFUN([GMP_PROG_CXX_WORKS_PART], [if test "$gmp_prog_cxx_works" = yes; then +- # remove anything that might look like compiler output to our "||" expression +- rm -f conftest* a.out b.out a.exe a_out.exe +- cat >conftest.cc <&AC_FD_CC +- gmp_cxxcompile="$1 conftest.cc >&AC_FD_CC" +- if AC_TRY_EVAL(gmp_cxxcompile); then +- if test "$cross_compiling" = no; then +- if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then :; +- else +- gmp_prog_cxx_works="no[]m4_if([$2],,,[, ])[$2], program does not run" +- fi +- fi +- else +- gmp_prog_cxx_works="no[]m4_if([$2],,,[, ])[$2]" +- fi +- case $gmp_prog_cxx_works in +- no*) +- echo "failed program was:" >&AC_FD_CC +- cat conftest.cc >&AC_FD_CC +- ;; +- esac +- rm -f conftest* a.out b.out a.exe a_out.exe +-fi +-]) +-m4trace:acinclude.m4:1510: -1- AC_DEFUN([GMP_INIT], [ifelse([$1], , gmp_configm4=config.m4, gmp_configm4="[$1]") +-gmp_tmpconfigm4=cnfm4.tmp +-gmp_tmpconfigm4i=cnfm4i.tmp +-gmp_tmpconfigm4p=cnfm4p.tmp +-rm -f $gmp_tmpconfigm4 $gmp_tmpconfigm4i $gmp_tmpconfigm4p +- +-# CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir. +-# The pattern here tests for an absolute path the same way as +-# _AC_OUTPUT_FILES in autoconf acgeneral.m4. +-case $srcdir in +-[[\\/]]* | ?:[[\\/]]* ) tmp="$srcdir" ;; +-*) tmp="../$srcdir" ;; +-esac +-echo ["define(,<\`$tmp'>)"] >>$gmp_tmpconfigm4 +- +-# All CPUs use asm-defs.m4 +-echo ["include][(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"] >>$gmp_tmpconfigm4i +-]) +-m4trace:acinclude.m4:1548: -1- AC_DEFUN([GMP_FINISH], [AC_REQUIRE([GMP_INIT]) +-echo "creating $gmp_configm4" +-echo ["d""nl $gmp_configm4. Generated automatically by configure."] > $gmp_configm4 +-if test -f $gmp_tmpconfigm4; then +- echo ["changequote(<,>)"] >> $gmp_configm4 +- echo ["ifdef(<__CONFIG_M4_INCLUDED__>,,<"] >> $gmp_configm4 +- cat $gmp_tmpconfigm4 >> $gmp_configm4 +- echo [">)"] >> $gmp_configm4 +- echo ["changequote(\`,')"] >> $gmp_configm4 +- rm $gmp_tmpconfigm4 +-fi +-echo ["ifdef(\`__CONFIG_M4_INCLUDED__',,\`"] >> $gmp_configm4 +-if test -f $gmp_tmpconfigm4i; then +- cat $gmp_tmpconfigm4i >> $gmp_configm4 +- rm $gmp_tmpconfigm4i +-fi +-if test -f $gmp_tmpconfigm4p; then +- cat $gmp_tmpconfigm4p >> $gmp_configm4 +- rm $gmp_tmpconfigm4p +-fi +-echo ["')"] >> $gmp_configm4 +-echo ["define(\`__CONFIG_M4_INCLUDED__')"] >> $gmp_configm4 +-]) +-m4trace:acinclude.m4:1582: -1- AC_DEFUN([GMP_INCLUDE_MPN], [AC_REQUIRE([GMP_INIT]) +-echo ["include_mpn(\`$1')"] >> $gmp_tmpconfigm4i +-]) +-m4trace:acinclude.m4:1598: -1- AC_DEFUN([GMP_DEFINE], [AC_REQUIRE([GMP_INIT]) +-echo ['define(<$1>, <$2>)'] >>ifelse([$3], [POST], +- $gmp_tmpconfigm4p, $gmp_tmpconfigm4) +-]) +-m4trace:acinclude.m4:1613: -1- AC_DEFUN([GMP_DEFINE_RAW], [AC_REQUIRE([GMP_INIT]) +-echo [$1] >> ifelse([$2], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4) +-]) +-m4trace:acinclude.m4:1631: -1- AC_DEFUN([GMP_TRY_ASSEMBLE], [cat >conftest.s <&AC_FD_CC +- ifelse([$2],,:,[$2]) +-else +- cat conftest.out >&AC_FD_CC +- echo "configure: failed program was:" >&AC_FD_CC +- cat conftest.s >&AC_FD_CC +- ifelse([$3],,:,[$3]) +-fi +-rm -f conftest* +-]) +-m4trace:acinclude.m4:1652: -1- AC_DEFUN([CL_AS_NOEXECSTACK], [ +-dnl AC_REQUIRE([AC_PROG_CC]) GMP uses something else +-AC_CACHE_CHECK([whether assembler supports --noexecstack option], +-cl_cv_as_noexecstack, [dnl +- cat > conftest.c </dev/null]) \ +- && grep .note.GNU-stack conftest.s >/dev/null \ +- && AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -Wa,--noexecstack +- -c -o conftest.o conftest.s >/dev/null]) +- then +- cl_cv_as_noexecstack=yes +- else +- cl_cv_as_noexecstack=no +- fi +- rm -f conftest*]) +- if test "$cl_cv_as_noexecstack" = yes; then +- ASMFLAGS="$ASMFLAGS -Wa,--noexecstack" +- fi +- AC_SUBST(ASMFLAGS) +-]) +-m4trace:acinclude.m4:1686: -1- AC_DEFUN([GMP_ASM_LABEL_SUFFIX], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([for assembler label suffix], +- gmp_cv_asm_label_suffix, +-[gmp_cv_asm_label_suffix=unknown +-for i in "" ":"; do +- echo "trying $i" >&AC_FD_CC +- GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +-somelabel$i], +- [gmp_cv_asm_label_suffix=$i +- rm -f conftest* +- break], +- [cat conftest.out >&AC_FD_CC]) +-done +-if test "$gmp_cv_asm_label_suffix" = "unknown"; then +- AC_MSG_ERROR([Cannot determine label suffix]) +-fi +-]) +-echo ["define(, <$gmp_cv_asm_label_suffix>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:1727: -1- AC_DEFUN([GMP_ASM_UNDERSCORE], [AC_REQUIRE([GMP_PROG_NM]) +-AC_CACHE_CHECK([if globals are prefixed by underscore], +- gmp_cv_asm_underscore, +-[gmp_cv_asm_underscore="unknown" +-cat >conftest.c <conftest.out +- if grep _gurkmacka conftest.out >/dev/null; then +- gmp_cv_asm_underscore=yes +- elif grep gurkmacka conftest.out >/dev/null; then +- gmp_cv_asm_underscore=no +- else +- echo "configure: $NM doesn't have gurkmacka:" >&AC_FD_CC +- cat conftest.out >&AC_FD_CC +- fi +-else +- echo "configure: failed program was:" >&AC_FD_CC +- cat conftest.c >&AC_FD_CC +-fi +-rm -f conftest* +-]) +-case $gmp_cv_asm_underscore in +- yes) +- GMP_DEFINE(GSYM_PREFIX, [_]) ;; +- no) +- GMP_DEFINE(GSYM_PREFIX, []) ;; +- *) +- AC_MSG_WARN([+----------------------------------------------------------]) +- AC_MSG_WARN([| Cannot determine global symbol prefix.]) +- AC_MSG_WARN([| $NM output doesn't contain a global data symbol.]) +- AC_MSG_WARN([| Will proceed with no underscore.]) +- AC_MSG_WARN([| If this is wrong then you'll get link errors referring]) +- AC_MSG_WARN([| to ___gmpn_add_n (note three underscores).]) +- AC_MSG_WARN([| In this case do a fresh build with an override,]) +- AC_MSG_WARN([| ./configure gmp_cv_asm_underscore=yes]) +- AC_MSG_WARN([+----------------------------------------------------------]) +- GMP_DEFINE(GSYM_PREFIX, []) +- ;; +-esac +-]) +-m4trace:acinclude.m4:1777: -1- AC_DEFUN([GMP_ASM_ALIGN_LOG], [AC_REQUIRE([GMP_ASM_GLOBL]) +-AC_REQUIRE([GMP_ASM_BYTE]) +-AC_REQUIRE([GMP_ASM_DATA]) +-AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_REQUIRE([GMP_PROG_NM]) +-AC_CACHE_CHECK([if .align assembly directive is logarithmic], +- gmp_cv_asm_align_log, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_data +- .align 4 +- $gmp_cv_asm_globl foo +- $gmp_cv_asm_byte 1 +- .align 4 +-foo$gmp_cv_asm_label_suffix +- $gmp_cv_asm_byte 2], +- [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`] +- if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then +- gmp_cv_asm_align_log=yes +- else +- gmp_cv_asm_align_log=no +- fi], +- [AC_MSG_ERROR([cannot assemble alignment test])])]) +- +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_align_log>)"]) +-]) +-m4trace:acinclude.m4:1836: -1- AC_DEFUN([GMP_ASM_ALIGN_FILL_0x90], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([if the .align directive accepts an 0x90 fill in .text], +- gmp_cv_asm_align_fill_0x90, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- .align 4, 0x90 +- .byte 0 +- .align 4, 0x90], +-[if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then +- echo "Suppressing this warning by omitting 0x90" 1>&AC_FD_CC +- gmp_cv_asm_align_fill_0x90=no +-else +- gmp_cv_asm_align_fill_0x90=yes +-fi], +-[gmp_cv_asm_align_fill_0x90=no])]) +- +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_align_fill_0x90>)"]) +-]) +-m4trace:acinclude.m4:1865: -1- AC_DEFUN([GMP_ASM_BYTE], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_CACHE_CHECK([for assembler byte directive], +- gmp_cv_asm_byte, +-[for i in .byte data1; do +- echo "trying $i" >&AC_FD_CC +- GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_data +- $i 0 +-], +- [gmp_cv_asm_byte=$i +- rm -f conftest* +- break], +- [cat conftest.out >&AC_FD_CC]) +-done +-if test -z "$gmp_cv_asm_byte"; then +- AC_MSG_ERROR([Cannot determine how to emit a data byte]) +-fi +-]) +-]) +-m4trace:acinclude.m4:1894: -1- AC_DEFUN([GMP_ASM_TEXT], [AC_CACHE_CHECK([how to switch to text section], +- gmp_cv_asm_text, +-[for i in ".text" ".code" [".csect .text[PR]"]; do +- echo "trying $i" >&AC_FD_CC +- GMP_TRY_ASSEMBLE([ $i], +- [gmp_cv_asm_text=$i +- rm -f conftest* +- break]) +-done +-if test -z "$gmp_cv_asm_text"; then +- AC_MSG_ERROR([Cannot determine text section directive]) +-fi +-]) +-echo ["define(, <$gmp_cv_asm_text>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:1916: -1- AC_DEFUN([GMP_ASM_DATA], [AC_CACHE_CHECK([how to switch to data section], +- gmp_cv_asm_data, +-[case $host in +- *-*-aix*) gmp_cv_asm_data=[".csect .data[RW]"] ;; +- *) gmp_cv_asm_data=".data" ;; +-esac +-]) +-echo ["define(, <$gmp_cv_asm_data>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:1944: -1- AC_DEFUN([GMP_ASM_RODATA], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_REQUIRE([GMP_ASM_DATA]) +-AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_REQUIRE([GMP_ASM_UNDERSCORE]) +-AC_CACHE_CHECK([how to switch to read-only data section], +- gmp_cv_asm_rodata, +-[ +-dnl Default to DATA on CPUs with split code/data caching, and TEXT +-dnl elsewhere. i386 means generic x86, so use DATA on it. +-case $host in +-X86_PATTERN | x86_64-*-*) +- gmp_cv_asm_rodata="$gmp_cv_asm_data" ;; +-*) +- gmp_cv_asm_rodata="$gmp_cv_asm_text" ;; +-esac +- +-cat >conftest.c <&AC_FD_CC +-cat conftest.c >&AC_FD_CC +-gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC" +-if AC_TRY_EVAL(gmp_compile); then +- echo "Compiler output:" >&AC_FD_CC +- cat conftest.s >&AC_FD_CC +- if test $gmp_cv_asm_underscore = yes; then +- tmp_gsym_prefix=_ +- else +- tmp_gsym_prefix= +- fi +- # must see our label +- if grep "^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" conftest.s >/dev/null 2>&AC_FD_CC; then +- # take the last directive before our label (hence skipping segments +- # getting debugging info etc) +- tmp_match=`sed -n ["/^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix/q +- /^[. ]*data/p +- /^[. ]*rdata/p +- /^[. ]*text/p +- /^[. ]*section/p +- /^[. ]*csect/p +- /^[. ]*CSECT/p"] conftest.s | sed -n '$p'` +- echo "Match: $tmp_match" >&AC_FD_CC +- if test -n "$tmp_match"; then +- gmp_cv_asm_rodata=$tmp_match +- fi +- else +- echo "Couldn't find label: ^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" >&AC_FD_CC +- fi +-fi +-rm -f conftest* +-]) +-echo ["define(, <$gmp_cv_asm_rodata>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2015: -1- AC_DEFUN([GMP_ASM_GLOBL], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([for assembler global directive], +- gmp_cv_asm_globl, +-[case $host in +- hppa*-*-*) gmp_cv_asm_globl=.export ;; +- IA64_PATTERN) gmp_cv_asm_globl=.global ;; +- *) gmp_cv_asm_globl=.globl ;; +-esac +-]) +-echo ["define(, <$gmp_cv_asm_globl>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2033: -1- AC_DEFUN([GMP_ASM_GLOBL_ATTR], [AC_REQUIRE([GMP_ASM_GLOBL]) +-AC_CACHE_CHECK([for assembler global directive attribute], +- gmp_cv_asm_globl_attr, +-[case $gmp_cv_asm_globl in +- .export) gmp_cv_asm_globl_attr=",entry" ;; +- *) gmp_cv_asm_globl_attr="" ;; +-esac +-]) +-echo ["define(, <$gmp_cv_asm_globl_attr>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2065: -1- AC_DEFUN([GMP_ASM_TYPE], [AC_CACHE_CHECK([for assembler .type directive], +- gmp_cv_asm_type, +-[gmp_cv_asm_type= +-for gmp_tmp_prefix in @ \# %; do +- GMP_TRY_ASSEMBLE([ .type sym,${gmp_tmp_prefix}function], +- [if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_type=".type \$][1,${gmp_tmp_prefix}\$][2" +- break +- fi]) +-done +-rm -f conftest* +-]) +-echo ["define(, <$gmp_cv_asm_type>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2087: -1- AC_DEFUN([GMP_ASM_SIZE], [AC_CACHE_CHECK([for assembler .size directive], +- gmp_cv_asm_size, +-[gmp_cv_asm_size= +-GMP_TRY_ASSEMBLE([ .size sym,1], +- [if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_size=".size \$][1,\$][2" +- fi]) +-]) +-echo ["define(, <$gmp_cv_asm_size>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2143: -1- AC_DEFUN([GMP_ASM_COFF_TYPE], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_REQUIRE([GMP_ASM_GLOBL]) +-AC_REQUIRE([GMP_ASM_GLOBL_ATTR]) +-AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_REQUIRE([GMP_ASM_UNDERSCORE]) +-AC_CACHE_CHECK([for assembler COFF type directives], +- gmp_cv_asm_x86_coff_type, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- $gmp_cv_asm_globl ${tmp_gsym_prefix}foo$gmp_cv_asm_globl_attr +- .def ${tmp_gsym_prefix}foo +- .scl 2 +- .type 32 +- .endef +-${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix +-], +- [gmp_cv_asm_x86_coff_type=yes], +- [gmp_cv_asm_x86_coff_type=no]) +-]) +-echo ["define(, <$gmp_cv_asm_x86_coff_type>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2200: -1- AC_DEFUN([GMP_ASM_LSYM_PREFIX], [AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_REQUIRE([GMP_ASM_TEXT]) +-AC_REQUIRE([GMP_PROG_NM]) +-AC_CACHE_CHECK([for assembler local label prefix], +- gmp_cv_asm_lsym_prefix, +-[gmp_tmp_pre_appears=yes +-for gmp_tmp_pre in L .L $L $ L$; do +- echo "Trying $gmp_tmp_pre" >&AC_FD_CC +- GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +-dummy${gmp_cv_asm_label_suffix} +-${gmp_tmp_pre}gurkmacka${gmp_cv_asm_label_suffix}], +- [if $NM conftest.$OBJEXT >conftest.nm 2>&AC_FD_CC; then : ; else +- cat conftest.nm >&AC_FD_CC +- AC_MSG_WARN(["$NM" failure]) +- break +- fi +- cat conftest.nm >&AC_FD_CC +- if grep gurkmacka conftest.nm >/dev/null; then : ; else +- # no mention of the symbol, this is good +- echo "$gmp_tmp_pre label doesn't appear in object file at all (good)" >&AC_FD_CC +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- gmp_tmp_pre_appears=no +- break +- fi +- if grep [' [a-zN] .*gurkmacka'] conftest.nm >/dev/null; then +- # symbol mentioned as a local, use this if nothing better +- echo "$gmp_tmp_pre label is local but still in object file" >&AC_FD_CC +- if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- fi +- else +- echo "$gmp_tmp_pre label is something unknown" >&AC_FD_CC +- fi +- ]) +-done +-rm -f conftest* +-if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix=L +- AC_MSG_WARN([cannot determine local label, using default $gmp_cv_asm_lsym_prefix]) +-fi +-# for development purposes, note whether we got a purely temporary local label +-echo "Local label appears in object files: $gmp_tmp_pre_appears" >&AC_FD_CC +-]) +-echo ["define(, <${gmp_cv_asm_lsym_prefix}>)"] >> $gmp_tmpconfigm4 +-AC_DEFINE_UNQUOTED(LSYM_PREFIX, "$gmp_cv_asm_lsym_prefix", +- [Assembler local label prefix]) +-]) +-m4trace:acinclude.m4:2259: -1- AC_DEFUN([GMP_ASM_W32], [AC_REQUIRE([GMP_ASM_DATA]) +-AC_REQUIRE([GMP_ASM_BYTE]) +-AC_REQUIRE([GMP_ASM_GLOBL]) +-AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_REQUIRE([GMP_PROG_NM]) +-AC_CACHE_CHECK([how to define a 32-bit word], +- gmp_cv_asm_w32, +-[case $host in +- *-*-hpux*) +- # FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption +- # that it's at 0x0. We'll have to declare another symbol before the +- # .long/.word and look at the distance between the two symbols. The +- # only problem is that the sed expression(s) barfs (on Solaris, for +- # example) for the symbol with value 0. For now, HPUX uses .word. +- gmp_cv_asm_w32=".word" +- ;; +- *-*-*) +- gmp_tmp_val= +- for gmp_tmp_op in .long .word data4; do +- GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_data +- $gmp_cv_asm_globl foo +- $gmp_tmp_op 0 +-foo$gmp_cv_asm_label_suffix +- $gmp_cv_asm_byte 0], +- [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`] +- if test "$gmp_tmp_val" = 4; then +- gmp_cv_asm_w32="$gmp_tmp_op" +- break +- fi]) +- done +- rm -f conftest* +- ;; +-esac +-if test -z "$gmp_cv_asm_w32"; then +- AC_MSG_ERROR([cannot determine how to define a 32-bit word]) +-fi +-]) +-echo ["define(, <$gmp_cv_asm_w32>)"] >> $gmp_tmpconfigm4 +-]) +-m4trace:acinclude.m4:2343: -1- AC_DEFUN([GMP_ASM_X86_GOT_UNDERSCORE], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_REQUIRE([GMP_ASM_GLOBL]) +-AC_REQUIRE([GMP_ASM_GLOBL_ATTR]) +-AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) +-AC_REQUIRE([GMP_ASM_UNDERSCORE]) +-AC_REQUIRE([AC_LIBTOOL_PROG_COMPILER_PIC]) +-AC_CACHE_CHECK([if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore], +- gmp_cv_asm_x86_got_underscore, +-[gmp_cv_asm_x86_got_underscore="not applicable" +-if test $gmp_cv_asm_underscore = yes; then +- tmp_gsym_prefix=_ +-else +- tmp_gsym_prefix= +-fi +-for tmp_underscore in "" "_"; do +- cat >conftest.s <&AC_FD_CC +-cat >conftest.awk <<\EOF +-[BEGIN { +- want[0] = "001" +- want[1] = "043" +- want[2] = "105" +- want[3] = "147" +- want[4] = "211" +- want[5] = "253" +- want[6] = "315" +- want[7] = "357" +- +- want[8] = "005" +- want[9] = "002" +- want[10] = "000" +- want[11] = "000" +- want[12] = "000" +- +- want[13] = "376" +- want[14] = "334" +- want[15] = "272" +- want[16] = "230" +- want[17] = "166" +- want[18] = "124" +- want[19] = "062" +- want[20] = "020" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 20; i++) +- got[i] = got[i+1]; +- got[20] = $f; +- +- found = 1 +- for (i = 0; i < 21; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-]EOF +-cat >conftest.s <<\EOF +-[ .text +- .byte 1, 35, 69, 103, 137, 171, 205, 239 +- addl $_GLOBAL_OFFSET_TABLE_, %eax +- .byte 254, 220, 186, 152, 118, 84, 50, 16 +-]EOF +-tmp_got_good=yes +-gmp_compile="$1 -fPIC -o conftest.o -c conftest.s >&AC_FD_CC 2>&1" +-if AC_TRY_EVAL(gmp_compile); then +- tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk` +-fi +-rm -f conftest.* +-echo "Result: $tmp_got_good" >&AC_FD_CC +-if test "$tmp_got_good" = no; then +- ifelse([$3],,:,[$3]) +-else +- ifelse([$2],,:,[$2]) +-fi +-]) +-m4trace:acinclude.m4:2515: -1- AC_DEFUN([GMP_ASM_X86_MMX], [AC_CACHE_CHECK([if the assembler knows about MMX instructions], +- gmp_cv_asm_x86_mmx, +-[GMP_TRY_ASSEMBLE( +-[ .text +- movq %mm0, %mm1], +-[gmp_cv_asm_x86_mmx=yes +-case $host in +-*-*-solaris*) +- if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then +- if grep "0f 6f c1" conftest.out >/dev/null; then +- gmp_cv_asm_x86_mmx=movq-bug +- fi +- else +- AC_MSG_WARN(["dis" not available to check for "as" movq bug]) +- fi +-esac], +-[gmp_cv_asm_x86_mmx=no])]) +- +-case $gmp_cv_asm_x86_mmx in +-movq-bug) +- AC_MSG_WARN([+----------------------------------------------------------]) +- AC_MSG_WARN([| WARNING WARNING WARNING]) +- AC_MSG_WARN([| Host CPU has MMX code, but the assembler]) +- AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS]) +- AC_MSG_WARN([| has the Solaris 2.6 and 2.7 bug where register to register]) +- AC_MSG_WARN([| movq operands are reversed.]) +- AC_MSG_WARN([| Non-MMX replacements will be used.]) +- AC_MSG_WARN([| This will be an inferior build.]) +- AC_MSG_WARN([+----------------------------------------------------------]) +- ;; +-no) +- AC_MSG_WARN([+----------------------------------------------------------]) +- AC_MSG_WARN([| WARNING WARNING WARNING]) +- AC_MSG_WARN([| Host CPU has MMX code, but it can't be assembled by]) +- AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS]) +- AC_MSG_WARN([| Non-MMX replacements will be used.]) +- AC_MSG_WARN([| This will be an inferior build.]) +- AC_MSG_WARN([+----------------------------------------------------------]) +- ;; +-esac +-if test "$gmp_cv_asm_x86_mmx" = yes; then +- ifelse([$1],,:,[$1]) +-else +- ifelse([$2],,:,[$2]) +-fi +-]) +-m4trace:acinclude.m4:2567: -1- AC_DEFUN([GMP_ASM_X86_SHLDL_CL], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([if the assembler takes cl with shldl], +- gmp_cv_asm_x86_shldl_cl, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- shldl %cl, %eax, %ebx], +- gmp_cv_asm_x86_shldl_cl=yes, +- gmp_cv_asm_x86_shldl_cl=no) +-]) +-if test "$gmp_cv_asm_x86_shldl_cl" = "yes"; then +- GMP_DEFINE(WANT_SHLDL_CL,1) +-else +- GMP_DEFINE(WANT_SHLDL_CL,0) +-fi +-]) +-m4trace:acinclude.m4:2594: -1- AC_DEFUN([GMP_ASM_X86_SSE2], [AC_CACHE_CHECK([if the assembler knows about SSE2 instructions], +- gmp_cv_asm_x86_sse2, +-[GMP_TRY_ASSEMBLE( +-[ .text +- paddq %mm0, %mm1], +- [gmp_cv_asm_x86_sse2=yes], +- [gmp_cv_asm_x86_sse2=no]) +-]) +-case $gmp_cv_asm_x86_sse2 in +-yes) +- ifelse([$1],,:,[$1]) +- ;; +-*) +- AC_MSG_WARN([+----------------------------------------------------------]) +- AC_MSG_WARN([| WARNING WARNING WARNING]) +- AC_MSG_WARN([| Host CPU has SSE2 code, but it can't be assembled by]) +- AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS]) +- AC_MSG_WARN([| Non-SSE2 replacements will be used.]) +- AC_MSG_WARN([| This will be an inferior build.]) +- AC_MSG_WARN([+----------------------------------------------------------]) +- ifelse([$2],,:,[$2]) +- ;; +-esac +-]) +-m4trace:acinclude.m4:2631: -1- AC_DEFUN([GMP_ASM_X86_MULX], [AC_CACHE_CHECK([if the assembler knows about the mulx instruction], +- gmp_cv_asm_x86_mulx, +-[GMP_TRY_ASSEMBLE( +-[ .text +- mulx %r8, %r9, %r10], +- [gmp_cv_asm_x86_mulx=yes], +- [gmp_cv_asm_x86_mulx=no]) +-]) +-case $gmp_cv_asm_x86_mulx in +-yes) +- ifelse([$1],,:,[$1]) +- ;; +-*) +- AC_MSG_WARN([+----------------------------------------------------------]) +- AC_MSG_WARN([| WARNING WARNING WARNING]) +- AC_MSG_WARN([| Host CPU has the mulx instruction, but it can't be]) +- AC_MSG_WARN([| assembled by]) +- AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS]) +- AC_MSG_WARN([| Older x86 instructions will be used.]) +- AC_MSG_WARN([| This will be an inferior build.]) +- AC_MSG_WARN([+----------------------------------------------------------]) +- ifelse([$2],,:,[$2]) +- ;; +-esac +-]) +-m4trace:acinclude.m4:2669: -1- AC_DEFUN([GMP_ASM_X86_ADX], [AC_CACHE_CHECK([if the assembler knows about the adox instruction], +- gmp_cv_asm_x86_adx, +-[GMP_TRY_ASSEMBLE( +-[ .text +- adox %r8, %r9 +- adcx %r8, %r9], +- [gmp_cv_asm_x86_adx=yes], +- [gmp_cv_asm_x86_adx=no]) +-]) +-case $gmp_cv_asm_x86_adx in +-yes) +- ifelse([$1],,:,[$1]) +- ;; +-*) +- AC_MSG_WARN([+----------------------------------------------------------]) +- AC_MSG_WARN([| WARNING WARNING WARNING]) +- AC_MSG_WARN([| Host CPU has the adcx and adox instructions, but they]) +- AC_MSG_WARN([| can't be assembled by]) +- AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS]) +- AC_MSG_WARN([| Older x86 instructions will be used.]) +- AC_MSG_WARN([| This will be an inferior build.]) +- AC_MSG_WARN([+----------------------------------------------------------]) +- ifelse([$2],,:,[$2]) +- ;; +-esac +-]) +-m4trace:acinclude.m4:2734: -1- AC_DEFUN([GMP_ASM_X86_MCOUNT], [AC_REQUIRE([AC_ENABLE_SHARED]) +-AC_REQUIRE([AC_PROG_LIBTOOL]) +-AC_MSG_CHECKING([how to call x86 mcount]) +-cat >conftest.c </dev/null; then +- mcount_nonpic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s` +- else +- mcount_nonpic_reg= +- fi +- mcount_nonpic_call=`grep 'call.*mcount' conftest.s` +- if test -z "$mcount_nonpic_call"; then +- AC_MSG_ERROR([Cannot find mcount call for non-PIC]) +- fi +- else +- AC_MSG_ERROR([Cannot compile test program for non-PIC]) +- fi +-fi +- +-if test "$enable_shared" = yes; then +- gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic -S conftest.c 1>&AC_FD_CC" +- if AC_TRY_EVAL(gmp_asmout_compile); then +- if grep '\.data' conftest.s >/dev/null; then +- case $lt_prog_compiler_pic in +- *-DDLL_EXPORT*) +- # Windows DLLs have non-PIC style mcount +- mcount_pic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s` +- ;; +- *) +- mcount_pic_reg=`sed -n ['s/.*GOTOFF.*,\(%[a-z]*\).*$/\1/p'] conftest.s` +- ;; +- esac +- else +- mcount_pic_reg= +- fi +- mcount_pic_call=`grep 'call.*mcount' conftest.s` +- if test -z "$mcount_pic_call"; then +- AC_MSG_ERROR([Cannot find mcount call for PIC]) +- fi +- else +- AC_MSG_ERROR([Cannot compile test program for PIC]) +- fi +-fi +- +-GMP_DEFINE_RAW(["define(, <\`$mcount_nonpic_reg'>)"]) +-GMP_DEFINE_RAW(["define(,<\`$mcount_nonpic_call'>)"]) +-GMP_DEFINE_RAW(["define(, <\`$mcount_pic_reg'>)"]) +-GMP_DEFINE_RAW(["define(, <\`$mcount_pic_call'>)"]) +- +-rm -f conftest.* +-AC_MSG_RESULT([determined]) +-]) +-m4trace:acinclude.m4:2807: -1- AC_DEFUN([GMP_ASM_IA64_ALIGN_OK], [AC_CACHE_CHECK([whether assembler .align padding is good], +- gmp_cv_asm_ia64_align_ok, +-[cat >conftest.awk <<\EOF +-[BEGIN { +- want[0] = "011" +- want[1] = "160" +- want[2] = "074" +- want[3] = "040" +- want[4] = "000" +- want[5] = "040" +- want[6] = "020" +- want[7] = "221" +- want[8] = "114" +- want[9] = "000" +- want[10] = "100" +- want[11] = "200" +- want[12] = "122" +- want[13] = "261" +- want[14] = "000" +- want[15] = "200" +- +- want[16] = "000" +- want[17] = "004" +- want[18] = "000" +- want[19] = "000" +- want[20] = "000" +- want[21] = "000" +- want[22] = "002" +- want[23] = "000" +- want[24] = "000" +- want[25] = "000" +- want[26] = "000" +- want[27] = "001" +- want[28] = "000" +- want[29] = "000" +- want[30] = "000" +- want[31] = "014" +- +- want[32] = "011" +- want[33] = "270" +- want[34] = "140" +- want[35] = "062" +- want[36] = "000" +- want[37] = "040" +- want[38] = "240" +- want[39] = "331" +- want[40] = "160" +- want[41] = "000" +- want[42] = "100" +- want[43] = "240" +- want[44] = "343" +- want[45] = "371" +- want[46] = "000" +- want[47] = "200" +- +- result = "yes" +-} +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 47; i++) +- got[i] = got[i+1]; +- got[47] = $f; +- +- found = 1 +- for (i = 0; i < 48; i++) +- if (got[i] != want[i]) +- { +- found = 0 +- break +- } +- if (found) +- { +- result = "no" +- exit +- } +- } +-} +-END { +- print result +-} +-]EOF +-GMP_TRY_ASSEMBLE( +-[ .text +- .align 32 +-{ .mmi; add r14 = r15, r16 +- add r17 = r18, r19 +- add r20 = r21, r22 ;; } +- .align 32 +-{ .mmi; add r23 = r24, r25 +- add r26 = r27, r28 +- add r29 = r30, r31 ;; } +-], +- [gmp_cv_asm_ia64_align_ok=`od -b conftest.$OBJEXT | $AWK -f conftest.awk`], +- [AC_MSG_WARN([oops, cannot compile test program]) +- gmp_cv_asm_ia64_align_ok=yes]) +-]) +-GMP_DEFINE_RAW(["define(, <\`$gmp_cv_asm_ia64_align_ok'>)"]) +-]) +-m4trace:acinclude.m4:2921: -1- AC_DEFUN([GMP_ASM_M68K_INSTRUCTION], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([assembler instruction and register style], +- gmp_cv_asm_m68k_instruction, +-[for i in "addl %d0,%d1" "add.l %d0,%d1" "addl d0,d1" "add.l d0,d1"; do +- GMP_TRY_ASSEMBLE( +- [ $gmp_cv_asm_text +- $i], +- [gmp_cv_asm_m68k_instruction=$i +- rm -f conftest* +- break]) +-done +-if test -z "$gmp_cv_asm_m68k_instruction"; then +- AC_MSG_ERROR([cannot determine assembler instruction and register style]) +-fi +-]) +-case $gmp_cv_asm_m68k_instruction in +-"addl d0,d1") want_dot_size=no; want_register_percent=no ;; +-"addl %d0,%d1") want_dot_size=no; want_register_percent=yes ;; +-"add.l d0,d1") want_dot_size=yes; want_register_percent=no ;; +-"add.l %d0,%d1") want_dot_size=yes; want_register_percent=yes ;; +-*) AC_MSG_ERROR([oops, unrecognised instruction and register style]) ;; +-esac +-GMP_DEFINE_RAW(["define(, <\`$want_register_percent'>)"]) +-GMP_DEFINE_RAW(["define(, <\`$want_dot_size'>)"]) +-]) +-m4trace:acinclude.m4:2952: -1- AC_DEFUN([GMP_ASM_M68K_ADDRESSING], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_REQUIRE([GMP_ASM_M68K_INSTRUCTION]) +-AC_CACHE_CHECK([assembler addressing style], +- gmp_cv_asm_m68k_addressing, +-[case $gmp_cv_asm_m68k_instruction in +-addl*) movel=movel ;; +-add.l*) movel=move.l ;; +-*) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;; +-esac +-case $gmp_cv_asm_m68k_instruction in +-*"%d0,%d1") dreg=%d0; areg=%a0 ;; +-*"d0,d1") dreg=d0; areg=a0 ;; +-*) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;; +-esac +-GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- $movel $dreg, $areg@-], +- [gmp_cv_asm_m68k_addressing=mit], +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- $movel $dreg, -($areg)], +- [gmp_cv_asm_m68k_addressing=motorola], +-[AC_MSG_ERROR([cannot determine assembler addressing style])])]) +-]) +-GMP_DEFINE_RAW(["define(, <\`$gmp_cv_asm_m68k_addressing'>)"]) +-]) +-m4trace:acinclude.m4:2989: -1- AC_DEFUN([GMP_ASM_M68K_BRANCHES], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([assembler shortest branches], +- gmp_cv_asm_m68k_branches, +-[for i in jra jbra bra; do +- GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +-foo$gmp_cv_asm_label_suffix +- $i foo], +- [gmp_cv_asm_m68k_branches=$i +- rm -f conftest* +- break]) +-done +-if test -z "$gmp_cv_asm_m68k_branches"; then +- AC_MSG_ERROR([cannot determine assembler branching style]) +-fi +-]) +-GMP_DEFINE_RAW(["define(, <\`$gmp_cv_asm_m68k_branches'>)"]) +-]) +-m4trace:acinclude.m4:3028: -1- AC_DEFUN([GMP_ASM_POWERPC_PIC_ALWAYS], [AC_REQUIRE([AC_PROG_CC]) +-AC_CACHE_CHECK([whether compiler output is PIC by default], +- gmp_cv_asm_powerpc_pic, +-[gmp_cv_asm_powerpc_pic=yes +-cat >conftest.c <&AC_FD_CC +-cat conftest.c >&AC_FD_CC +-gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC" +-if AC_TRY_EVAL(gmp_compile); then +- echo "Compiler output:" >&AC_FD_CC +- cat conftest.s >&AC_FD_CC +- if grep 'foo@ha' conftest.s >/dev/null 2>&AC_FD_CC; then +- gmp_cv_asm_powerpc_pic=no +- fi +- if grep 'ha16(_foo)' conftest.s >/dev/null 2>&AC_FD_CC; then +- gmp_cv_asm_powerpc_pic=no +- fi +-fi +-rm -f conftest* +-]) +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_powerpc_pic>)"]) +-]) +-m4trace:acinclude.m4:3065: -1- AC_DEFUN([GMP_ASM_POWERPC_R_REGISTERS], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([if the assembler needs r on registers], +- gmp_cv_asm_powerpc_r_registers, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- mtctr 6], +-[gmp_cv_asm_powerpc_r_registers=no], +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- mtctr r6], +-[gmp_cv_asm_powerpc_r_registers=yes], +-[AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])])])]) +- +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_powerpc_r_registers>)"]) +-]) +-m4trace:acinclude.m4:3090: -1- AC_DEFUN([GMP_ASM_SPARC_REGISTER], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([if the assembler accepts ".register"], +- gmp_cv_asm_sparc_register, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- .register %g2,#scratch +-], +-[gmp_cv_asm_sparc_register=yes], +-[gmp_cv_asm_sparc_register=no])]) +- +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_sparc_register>)"]) +-]) +-m4trace:acinclude.m4:3111: -1- AC_DEFUN([GMP_ASM_SPARC_GOTDATA], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([if the assembler accepts gotdata relocations], +- gmp_cv_asm_sparc_gotdata, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- .text +- sethi %gdop_hix22(symbol), %g1 +- or %g1, %gdop_lox10(symbol), %g1 +-], +-[gmp_cv_asm_sparc_gotdata=yes], +-[gmp_cv_asm_sparc_gotdata=no])]) +- +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_sparc_gotdata>)"]) +-]) +-m4trace:acinclude.m4:3135: -1- AC_DEFUN([GMP_ASM_SPARC_SHARED_THUNKS], [AC_REQUIRE([GMP_ASM_TEXT]) +-AC_CACHE_CHECK([if the assembler can support shared PIC thunks], +- gmp_cv_asm_sparc_shared_thunks, +-[GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- .section .text.__sparc_get_pc_thunk.l7,"axG",@progbits,__sparc_get_pc_thunk.l7,comdat +- .weak __sparc_get_pc_thunk.l7 +- .hidden __sparc_get_pc_thunk.l7 +- .type __sparc_get_pc_thunk.l7, #function +-__sparc_get_pc_thunk.l7: +- jmp %o7+8 +- add %o7, %l7, %l7 +-], +-[gmp_cv_asm_sparc_shared_thunks=yes], +-[gmp_cv_asm_sparc_shared_thunks=no])]) +- +-GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_sparc_shared_thunks>)"]) +-]) +-m4trace:acinclude.m4:3159: -1- AC_DEFUN([GMP_C_ATTRIBUTE_CONST], [AC_CACHE_CHECK([whether gcc __attribute__ ((const)) works], +- gmp_cv_c_attribute_const, +-[AC_TRY_COMPILE([int foo (int x) __attribute__ ((const));], , +- gmp_cv_c_attribute_const=yes, gmp_cv_c_attribute_const=no) +-]) +-if test $gmp_cv_c_attribute_const = yes; then +- AC_DEFINE(HAVE_ATTRIBUTE_CONST, 1, +- [Define to 1 if the compiler accepts gcc style __attribute__ ((const))]) +-fi +-]) +-m4trace:acinclude.m4:3178: -1- AC_DEFUN([GMP_C_ATTRIBUTE_MALLOC], [AC_CACHE_CHECK([whether gcc __attribute__ ((malloc)) works], +- gmp_cv_c_attribute_malloc, +-[cat >conftest.c </dev/null; then +- gmp_cv_c_attribute_malloc=no +- else +- gmp_cv_c_attribute_malloc=yes +- fi +-else +- gmp_cv_c_attribute_malloc=no +-fi +-cat conftest.out >&AC_FD_CC +-rm -f conftest* +-]) +-if test $gmp_cv_c_attribute_malloc = yes; then +- AC_DEFINE(HAVE_ATTRIBUTE_MALLOC, 1, +- [Define to 1 if the compiler accepts gcc style __attribute__ ((malloc))]) +-fi +-]) +-m4trace:acinclude.m4:3208: -1- AC_DEFUN([GMP_C_ATTRIBUTE_MODE], [AC_CACHE_CHECK([whether gcc __attribute__ ((mode (XX))) works], +- gmp_cv_c_attribute_mode, +-[AC_TRY_COMPILE([typedef int SItype __attribute__ ((mode (SI)));], , +- gmp_cv_c_attribute_mode=yes, gmp_cv_c_attribute_mode=no) +-]) +-if test $gmp_cv_c_attribute_mode = yes; then +- AC_DEFINE(HAVE_ATTRIBUTE_MODE, 1, +- [Define to 1 if the compiler accepts gcc style __attribute__ ((mode (XX)))]) +-fi +-]) +-m4trace:acinclude.m4:3224: -1- AC_DEFUN([GMP_C_ATTRIBUTE_NORETURN], [AC_CACHE_CHECK([whether gcc __attribute__ ((noreturn)) works], +- gmp_cv_c_attribute_noreturn, +-[AC_TRY_COMPILE([void foo (int x) __attribute__ ((noreturn));], , +- gmp_cv_c_attribute_noreturn=yes, gmp_cv_c_attribute_noreturn=no) +-]) +-if test $gmp_cv_c_attribute_noreturn = yes; then +- AC_DEFINE(HAVE_ATTRIBUTE_NORETURN, 1, +- [Define to 1 if the compiler accepts gcc style __attribute__ ((noreturn))]) +-fi +-]) +-m4trace:acinclude.m4:3254: -1- AC_DEFUN([GMP_C_DOUBLE_FORMAT], [AC_REQUIRE([AC_PROG_CC]) +-AC_REQUIRE([AC_PROG_AWK]) +-AC_CACHE_CHECK([format of `double' floating point], +- gmp_cv_c_double_format, +-[gmp_cv_c_double_format=unknown +-cat >conftest.c <<\EOF +-[struct foo { +- char before[8]; +- double x; +- char after[8]; +-}; +-extern struct foo foo; +-struct foo foo = { +- { '\001', '\043', '\105', '\147', '\211', '\253', '\315', '\357' }, +- -123456789.0, +- { '\376', '\334', '\272', '\230', '\166', '\124', '\062', '\020' }, +-};] +-EOF +-gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC 2>&1" +-if AC_TRY_EVAL(gmp_compile); then +-cat >conftest.awk <<\EOF +-[ +-BEGIN { +- found = 0 +-} +- +-{ +- for (f = 2; f <= NF; f++) +- { +- for (i = 0; i < 23; i++) +- got[i] = got[i+1]; +- got[23] = $f; +- +- # match the special begin and end sequences +- if (got[0] != "001") continue +- if (got[1] != "043") continue +- if (got[2] != "105") continue +- if (got[3] != "147") continue +- if (got[4] != "211") continue +- if (got[5] != "253") continue +- if (got[6] != "315") continue +- if (got[7] != "357") continue +- if (got[16] != "376") continue +- if (got[17] != "334") continue +- if (got[18] != "272") continue +- if (got[19] != "230") continue +- if (got[20] != "166") continue +- if (got[21] != "124") continue +- if (got[22] != "062") continue +- if (got[23] != "020") continue +- +- saw = " (" got[8] " " got[9] " " got[10] " " got[11] " " got[12] " " got[13] " " got[14] " " got[15] ")" +- +- if (got[8] == "000" && \ +- got[9] == "000" && \ +- got[10] == "000" && \ +- got[11] == "124" && \ +- got[12] == "064" && \ +- got[13] == "157" && \ +- got[14] == "235" && \ +- got[15] == "301") +- { +- print "IEEE little endian" +- found = 1 +- exit +- } +- +- # Little endian with the two 4-byte halves swapped, as used by ARM +- # when the chip is in little endian mode. +- # +- if (got[8] == "064" && \ +- got[9] == "157" && \ +- got[10] == "235" && \ +- got[11] == "301" && \ +- got[12] == "000" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "124") +- { +- print "IEEE little endian, swapped halves" +- found = 1 +- exit +- } +- +- # gcc 2.95.4 on one GNU/Linux ARM system was seen generating 000 in +- # the last byte, whereas 124 is correct. Not sure where the bug +- # actually lies, but a running program didn't seem to get a full +- # mantissa worth of working bits. +- # +- # We match this case explicitly so we can give a nice result message, +- # but we deliberately exclude it from the normal IEEE double setups +- # since it's too broken. +- # +- if (got[8] == "064" && \ +- got[9] == "157" && \ +- got[10] == "235" && \ +- got[11] == "301" && \ +- got[12] == "000" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "bad ARM software floats" +- found = 1 +- exit +- } +- +- if (got[8] == "301" && \ +- got[9] == "235" && \ +- got[10] == "157" && \ +- got[11] == "064" && \ +- got[12] == "124" && \ +- got[13] == "000" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "IEEE big endian" +- found = 1 +- exit +- } +- +- if (got[8] == "353" && \ +- got[9] == "315" && \ +- got[10] == "242" && \ +- got[11] == "171" && \ +- got[12] == "000" && \ +- got[13] == "240" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "VAX D" +- found = 1 +- exit +- } +- +- if (got[8] == "275" && \ +- got[9] == "301" && \ +- got[10] == "064" && \ +- got[11] == "157" && \ +- got[12] == "000" && \ +- got[13] == "124" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "VAX G" +- found = 1 +- exit +- } +- +- if (got[8] == "300" && \ +- got[9] == "033" && \ +- got[10] == "353" && \ +- got[11] == "171" && \ +- got[12] == "242" && \ +- got[13] == "240" && \ +- got[14] == "000" && \ +- got[15] == "000") +- { +- print "Cray CFP" +- found = 1 +- exit +- } +- } +-} +- +-END { +- if (! found) +- print "unknown", saw +-} +-] +-EOF +- gmp_cv_c_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` +- case $gmp_cv_c_double_format in +- unknown*) +- echo "cannot match anything, conftest.$OBJEXT contains" >&AC_FD_CC +- od -b conftest.$OBJEXT >&AC_FD_CC +- ;; +- esac +-else +- AC_MSG_WARN([oops, cannot compile test program]) +-fi +-rm -f conftest* +-]) +- +-AH_VERBATIM([HAVE_DOUBLE], +-[/* Define one of the following to 1 for the format of a `double'. +- If your format is not among these choices, or you don't know what it is, +- then leave all undefined. +- IEEE_LITTLE_SWAPPED means little endian, but with the two 4-byte halves +- swapped, as used by ARM CPUs in little endian mode. */ +-#undef HAVE_DOUBLE_IEEE_BIG_ENDIAN +-#undef HAVE_DOUBLE_IEEE_LITTLE_ENDIAN +-#undef HAVE_DOUBLE_IEEE_LITTLE_SWAPPED +-#undef HAVE_DOUBLE_VAX_D +-#undef HAVE_DOUBLE_VAX_G +-#undef HAVE_DOUBLE_CRAY_CFP]) +- +-case $gmp_cv_c_double_format in +- "IEEE big endian") +- AC_DEFINE(HAVE_DOUBLE_IEEE_BIG_ENDIAN, 1) +- GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_DOUBLE_IEEE_BIG_ENDIAN')", POST) +- ;; +- "IEEE little endian") +- AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_ENDIAN, 1) +- GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_DOUBLE_IEEE_LITTLE_ENDIAN')", POST) +- ;; +- "IEEE little endian, swapped halves") +- AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_SWAPPED, 1) ;; +- "VAX D") +- AC_DEFINE(HAVE_DOUBLE_VAX_D, 1) ;; +- "VAX G") +- AC_DEFINE(HAVE_DOUBLE_VAX_G, 1) ;; +- "Cray CFP") +- AC_DEFINE(HAVE_DOUBLE_CRAY_CFP, 1) ;; +- "bad ARM software floats") +- ;; +- unknown*) +- AC_MSG_WARN([Could not determine float format.]) +- AC_MSG_WARN([Conversions to and from "double" may be slow.]) +- ;; +- *) +- AC_MSG_WARN([oops, unrecognised float format: $gmp_cv_c_double_format]) +- ;; +-esac +-]) +-m4trace:acinclude.m4:3523: -1- AC_DEFUN([GMP_FUNC_ALLOCA], [AC_REQUIRE([GMP_HEADER_ALLOCA]) +-AC_CACHE_CHECK([for alloca (via gmp-impl.h)], +- gmp_cv_func_alloca, +-[AC_TRY_LINK( +-GMP_INCLUDE_GMP_H +-[#include "$srcdir/gmp-impl.h" +-], +- [char *p = (char *) alloca (1);], +- gmp_cv_func_alloca=yes, +- gmp_cv_func_alloca=no)]) +-if test $gmp_cv_func_alloca = yes; then +- AC_DEFINE(HAVE_ALLOCA, 1, [Define to 1 if alloca() works (via gmp-impl.h).]) +-fi +-]) +-m4trace:acinclude.m4:3539: -1- AC_DEFUN([GMP_HEADER_ALLOCA], [# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +-# for constant arguments. Useless! +-AC_CACHE_CHECK([for working alloca.h], +- gmp_cv_header_alloca, +-[AC_TRY_LINK([#include ], +- [char *p = (char *) alloca (2 * sizeof (int));], +- gmp_cv_header_alloca=yes, +- gmp_cv_header_alloca=no)]) +-if test $gmp_cv_header_alloca = yes; then +- AC_DEFINE(HAVE_ALLOCA_H, 1, +- [Define to 1 if you have and it should be used (not on Ultrix).]) +-fi +-]) +-m4trace:acinclude.m4:3560: -1- AC_DEFUN([GMP_OPTION_ALLOCA], [AC_REQUIRE([GMP_FUNC_ALLOCA]) +-AC_CACHE_CHECK([how to allocate temporary memory], +- gmp_cv_option_alloca, +-[case $enable_alloca in +- yes) +- gmp_cv_option_alloca=alloca +- ;; +- no) +- gmp_cv_option_alloca=malloc-reentrant +- ;; +- reentrant | notreentrant) +- case $gmp_cv_func_alloca in +- yes) gmp_cv_option_alloca=alloca ;; +- *) gmp_cv_option_alloca=malloc-$enable_alloca ;; +- esac +- ;; +- *) +- gmp_cv_option_alloca=$enable_alloca +- ;; +-esac +-]) +- +-AH_VERBATIM([WANT_TMP], +-[/* Define one of these to 1 for the desired temporary memory allocation +- method, per --enable-alloca. */ +-#undef WANT_TMP_ALLOCA +-#undef WANT_TMP_REENTRANT +-#undef WANT_TMP_NOTREENTRANT +-#undef WANT_TMP_DEBUG]) +- +-case $gmp_cv_option_alloca in +- alloca) +- if test $gmp_cv_func_alloca = no; then +- AC_MSG_ERROR([--enable-alloca=alloca specified, but alloca not available]) +- fi +- AC_DEFINE(WANT_TMP_ALLOCA) +- TAL_OBJECT=tal-reent$U.lo +- ;; +- malloc-reentrant) +- AC_DEFINE(WANT_TMP_REENTRANT) +- TAL_OBJECT=tal-reent$U.lo +- ;; +- malloc-notreentrant) +- AC_DEFINE(WANT_TMP_NOTREENTRANT) +- TAL_OBJECT=tal-notreent$U.lo +- ;; +- debug) +- AC_DEFINE(WANT_TMP_DEBUG) +- TAL_OBJECT=tal-debug$U.lo +- ;; +- *) +- # checks at the start of configure.in should protect us +- AC_MSG_ERROR([unrecognised --enable-alloca=$gmp_cv_option_alloca]) +- ;; +-esac +-AC_SUBST(TAL_OBJECT) +-]) +-m4trace:acinclude.m4:3628: -1- AC_DEFUN([GMP_FUNC_SSCANF_WRITABLE_INPUT], [AC_CACHE_CHECK([whether sscanf needs writable input], +- gmp_cv_func_sscanf_writable_input, +-[case $host in +- *-*-hpux9 | *-*-hpux9.*) +- gmp_cv_func_sscanf_writable_input=yes ;; +- *) gmp_cv_func_sscanf_writable_input=no ;; +-esac +-]) +-case $gmp_cv_func_sscanf_writable_input in +- yes) AC_DEFINE(SSCANF_WRITABLE_INPUT, 1, +- [Define to 1 if sscanf requires writable inputs]) ;; +- no) ;; +- *) AC_MSG_ERROR([unrecognised \$gmp_cv_func_sscanf_writable_input]) ;; +-esac +-]) +-m4trace:acinclude.m4:3666: -1- AC_DEFUN([GMP_FUNC_VSNPRINTF], [AC_CHECK_FUNC(vsnprintf, +- [gmp_vsnprintf_exists=yes], +- [gmp_vsnprintf_exists=no]) +-if test "$gmp_vsnprintf_exists" = no; then +- gmp_cv_func_vsnprintf=no +-else +- AC_CACHE_CHECK([whether vsnprintf works], +- gmp_cv_func_vsnprintf, +- [gmp_cv_func_vsnprintf=yes +- for i in 'return check ("hello world");' 'int n; return check ("%nhello world", &n);'; do +- AC_TRY_RUN([ +-#include /* for strcmp */ +-#include /* for vsnprintf */ +- +-#include +- +-int +-check (const char *fmt, ...) +-{ +- static char buf[128]; +- va_list ap; +- int ret; +- +- va_start (ap, fmt); +- +- ret = vsnprintf (buf, 4, fmt, ap); +- +- if (strcmp (buf, "hel") != 0) +- return 1; +- +- /* allowed return values */ +- if (ret != -1 && ret != 3 && ret != 11) +- return 2; +- +- return 0; +-} +- +-int +-main () +-{ +-$i +-} +-], +- [:], +- [gmp_cv_func_vsnprintf=no; break], +- [gmp_cv_func_vsnprintf=probably; break]) +- done +- ]) +- if test "$gmp_cv_func_vsnprintf" = probably; then +- AC_MSG_WARN([cannot check for properly working vsnprintf when cross compiling, will assume it's ok]) +- fi +- if test "$gmp_cv_func_vsnprintf" != no; then +- AC_DEFINE(HAVE_VSNPRINTF,1, +- [Define to 1 if you have the `vsnprintf' function and it works properly.]) +- fi +-fi +-]) +-m4trace:acinclude.m4:3731: -1- AC_DEFUN([GMP_H_EXTERN_INLINE], [AC_REQUIRE([AC_C_INLINE]) +-case $ac_cv_c_inline in +-no) ;; +-*) +- AC_TRY_COMPILE( +-[#define __GMP_WITHIN_CONFIGURE_INLINE 1 +-]GMP_INCLUDE_GMP_H[ +-#ifndef __GMP_EXTERN_INLINE +-die die die +-#endif +-],,, +- [case $ac_cv_c_inline in +- yes) tmp_inline=inline ;; +- *) tmp_inline=$ac_cv_c_inline ;; +- esac +- AC_MSG_WARN([gmp.h doesnt recognise compiler "$tmp_inline", inlines will be unavailable])]) +- ;; +-esac +-]) +-m4trace:acinclude.m4:3758: -1- AC_DEFUN([GMP_H_HAVE_FILE], [AC_TRY_COMPILE( +-[#include ] +-GMP_INCLUDE_GMP_H +-[#if ! _GMP_H_HAVE_FILE +-die die die +-#endif +-],,, +- [AC_MSG_WARN([gmp.h doesnt recognise , FILE prototypes will be unavailable])]) +-]) +-m4trace:acinclude.m4:3778: -1- AC_DEFUN([GMP_PROG_CC_FOR_BUILD], [AC_REQUIRE([AC_PROG_CC]) +-if test -n "$CC_FOR_BUILD"; then +- GMP_PROG_CC_FOR_BUILD_WORKS($CC_FOR_BUILD,, +- [AC_MSG_ERROR([Specified CC_FOR_BUILD doesn't seem to work])]) +-elif test -n "$HOST_CC"; then +- GMP_PROG_CC_FOR_BUILD_WORKS($HOST_CC, +- [CC_FOR_BUILD=$HOST_CC], +- [AC_MSG_ERROR([Specified HOST_CC doesn't seem to work])]) +-else +- for i in "$CC" "$CC $CFLAGS $CPPFLAGS" cc gcc c89 c99; do +- GMP_PROG_CC_FOR_BUILD_WORKS($i, +- [CC_FOR_BUILD=$i +- break]) +- done +- if test -z "$CC_FOR_BUILD"; then +- AC_MSG_ERROR([Cannot find a build system compiler]) +- fi +-fi +- +-AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler]) +-AC_SUBST(CC_FOR_BUILD) +-]) +-m4trace:acinclude.m4:3810: -1- AC_DEFUN([GMP_PROG_CC_FOR_BUILD_WORKS], [AC_MSG_CHECKING([build system compiler $1]) +-# remove anything that might look like compiler output to our "||" expression +-rm -f conftest* a.out b.out a.exe a_out.exe +-cat >conftest.c <&AC_FD_CC 2>&1; then +- cc_for_build_works=yes +- fi +-fi +-rm -f conftest* a.out b.out a.exe a_out.exe +-AC_MSG_RESULT($cc_for_build_works) +-if test "$cc_for_build_works" = yes; then +- ifelse([$2],,:,[$2]) +-else +- ifelse([$3],,:,[$3]) +-fi +-]) +-m4trace:acinclude.m4:3844: -1- AC_DEFUN([GMP_PROG_CPP_FOR_BUILD], [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD]) +-AC_MSG_CHECKING([for build system preprocessor]) +-if test -z "$CPP_FOR_BUILD"; then +- AC_CACHE_VAL(gmp_cv_prog_cpp_for_build, +- [cat >conftest.c <&AC_FD_CC 2>&1; then +- gmp_cv_prog_cpp_for_build=$i +- break +- fi +- done +- rm -f conftest* a.out b.out a.exe a_out.exe +- if test -z "$gmp_cv_prog_cpp_for_build"; then +- AC_MSG_ERROR([Cannot find build system C preprocessor.]) +- fi +- ]) +- CPP_FOR_BUILD=$gmp_cv_prog_cpp_for_build +-fi +-AC_MSG_RESULT([$CPP_FOR_BUILD]) +- +-AC_ARG_VAR(CPP_FOR_BUILD,[build system C preprocessor]) +-AC_SUBST(CPP_FOR_BUILD) +-]) +-m4trace:acinclude.m4:3884: -1- AC_DEFUN([GMP_PROG_EXEEXT_FOR_BUILD], [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD]) +-AC_CACHE_CHECK([for build system executable suffix], +- gmp_cv_prog_exeext_for_build, +-[cat >conftest.c <&AC_FD_CC; then +- gmp_cv_prog_exeext_for_build=$i +- break +- fi +- fi +-done +-rm -f conftest* +-if test "${gmp_cv_prog_exeext_for_build+set}" != set; then +- AC_MSG_ERROR([Cannot determine executable suffix]) +-fi +-]) +-AC_SUBST(EXEEXT_FOR_BUILD,$gmp_cv_prog_exeext_for_build) +-]) +-m4trace:acinclude.m4:3920: -1- AC_DEFUN([GMP_C_FOR_BUILD_ANSI], [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD]) +-AC_CACHE_CHECK([whether build system compiler is ANSI], +- gmp_cv_c_for_build_ansi, +-[cat >conftest.c <conftest.c <,$want_assert_01)"]) +-m4trace:configure.ac:104: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:104: the top level]) +-m4trace:configure.ac:129: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:129: the top level]) +-m4trace:configure.ac:138: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:138: the top level]) +-m4trace:configure.ac:146: -1- m4_pattern_allow([^WANT_ASSEMBLY$]) +-m4trace:configure.ac:152: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:152: the top level]) +-m4trace:configure.ac:160: -1- m4_pattern_allow([^WANT_FFT$]) +-m4trace:configure.ac:166: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:166: the top level]) +-m4trace:configure.ac:174: -1- m4_pattern_allow([^WANT_OLD_FFT_FULL$]) +-m4trace:configure.ac:180: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:180: the top level]) +-m4trace:configure.ac:195: -1- m4_pattern_allow([^GMP_NAIL_BITS$]) +-m4trace:configure.ac:199: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:199: the top level]) +-m4trace:configure.ac:209: -1- m4_pattern_allow([^WANT_PROFILING_PROF$]) +-m4trace:configure.ac:213: -1- m4_pattern_allow([^WANT_PROFILING_GPROF$]) +-m4trace:configure.ac:217: -1- m4_pattern_allow([^WANT_PROFILING_INSTRUMENT$]) +-m4trace:configure.ac:222: -1- GMP_DEFINE_RAW(["define(,<\`$enable_profiling'>)"]) +-m4trace:configure.ac:233: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:233: the top level]) +-m4trace:configure.ac:243: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:243: the top level]) +-m4trace:configure.ac:253: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:253: the top level]) +-m4trace:configure.ac:263: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:263: the top level]) +-m4trace:configure.ac:271: -1- m4_pattern_allow([^WANT_FAKE_CPUID$]) +-m4trace:configure.ac:287: -1- GMP_DEFINE_RAW(["define_not_for_expansion(\`HAVE_HOST_CPU_$tmp_host')"], [POST]) +-m4trace:configure.ac:435: -1- m4_pattern_allow([^ABI$]) +-m4trace:configure.ac:456: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_power$]) +-m4trace:configure.ac:457: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_powerpc$]) +-m4trace:configure.ac:462: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_alpha$]) +-m4trace:configure.ac:539: -1- GMP_INCLUDE_MPN([alpha/alpha-defs.m4]) +-m4trace:configure.ac:543: -1- GMP_INCLUDE_MPN([alpha/unicos.m4]) +-m4trace:configure.ac:548: -1- GMP_INCLUDE_MPN([alpha/default.m4]) +-m4trace:configure.ac:570: -1- GMP_INCLUDE_MPN([alpha/default.m4]) +-m4trace:configure.ac:609: -1- GMP_INCLUDE_MPN([arm/arm-defs.m4]) +-m4trace:configure.ac:787: -1- GMP_INCLUDE_MPN([ia64/ia64-defs.m4]) +-m4trace:configure.ac:854: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_m68k$]) +-m4trace:configure.ac:855: -1- GMP_INCLUDE_MPN([m68k/m68k-defs.m4]) +-m4trace:configure.ac:913: -1- GMP_INCLUDE_MPN([mips32/mips-defs.m4]) +-m4trace:configure.ac:959: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_powerpc$]) +-m4trace:configure.ac:1183: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_power$]) +-m4trace:configure.ac:1228: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1237: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1246: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1255: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1264: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1298: -1- GMP_INCLUDE_MPN([sparc32/sparc-defs.m4]) +-m4trace:configure.ac:1510: -1- GMP_INCLUDE_MPN([vax/elf.m4]) +-m4trace:configure.ac:1813: -1- m4_pattern_allow([^HOST_DOS64$]) +-m4trace:configure.ac:1825: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me:${as_lineno-$LINENO}: WARNING: the \"none\" host is obsolete, use --disable-assembly], []) +-m4trace:configure.ac:1825: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me: WARNING: the \"none\" host is obsolete, use --disable-assembly], []) +-m4trace:configure.ac:1846: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-configure.ac:1846: the top level]) +-m4trace:configure.ac:1959: -1- GMP_PROG_CC_IS_GNU([$cc], [ccbase=gcc]) +-m4trace:configure.ac:1959: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:928: GMP_PROG_CC_IS_GNU is expanded from... +-configure.ac:1959: the top level]) +-m4trace:configure.ac:1965: -1- GMP_PROG_CC_IS_XLC([$cc], [ccbase=xlc]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS([$cc $cflags $cppflags], [], [continue]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], []) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [], [ +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [], [ +-int main () { return 0; }], [], [gmp_prog_cc_works="no"], [gmp_prog_cc_works="no[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [function pointer return], [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [function pointer return], [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [function pointer return], [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, function pointer return"], [gmp_prog_cc_works="no, function pointer return[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [cmov instruction], [/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [cmov instruction], [/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [cmov instruction], [/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, cmov instruction"], [gmp_prog_cc_works="no, cmov instruction[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [double -> ulong conversion], [/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [double -> ulong conversion], [/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [double -> ulong conversion], [/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, double -> ulong conversion"], [gmp_prog_cc_works="no, double -> ulong conversion[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [double negation], [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [double negation], [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [double negation], [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, double negation"], [gmp_prog_cc_works="no, double negation[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [double -> float conversion], [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [double -> float conversion], [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [double -> float conversion], [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, double -> float conversion"], [gmp_prog_cc_works="no, double -> float conversion[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [gnupro alpha ev6 char spilling], [/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [gnupro alpha ev6 char spilling], [/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [gnupro alpha ev6 char spilling], [/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, gnupro alpha ev6 char spilling"], [gmp_prog_cc_works="no, gnupro alpha ev6 char spilling[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [__builtin_alloca availability], [int k; int foo () { __builtin_alloca (k); }], [GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [alloca array], +-[/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +-])]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [alloca array], [/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [alloca array], [/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [alloca array], [/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, alloca array"], [gmp_prog_cc_works="no, alloca array[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [abs int -> double conversion], [/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [abs int -> double conversion], [/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; }]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [abs int -> double conversion], [/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, abs int -> double conversion"], [gmp_prog_cc_works="no, abs int -> double conversion[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags], [long long reliability test 1], [/* The following provokes a segfault in the compiler on powerpc-apple-darwin. +- Extracted from tests/mpn/t-iord_u.c. Causes Apple's gcc 3.3 build 1640 and +- 1666 to segfault with e.g., -O2 -mpowerpc64. */ +- +-#if defined (__GNUC__) && ! defined (__cplusplus) +-typedef unsigned long long t1;typedef t1*t2; +-static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0) +-{t1 c,x,r;int i;if(v0){c=1;for(i=1;i> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [mpn_lshift_com optimization], [/* The following is mis-compiled by HP ia-64 cc version +- cc: HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003] +- under "cc +O3", both in +DD32 and +DD64 modes. The mpn_lshift_com gets +- inlined and its return value somehow botched to be 0 instead of 1. This +- arises in the real mpn_lshift_com in mul_fft.c. A lower optimization +- level, like +O2 seems ok. This code needs to be run to show the problem, +- but that's fine, the offending cc is a native-only compiler so we don't +- have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-unsigned long +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long retval, high_limb, low_limb; +- unsigned tnc; +- long i; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *up++; +- retval = low_limb >> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-], [], [gmp_prog_cc_works="no, mpn_lshift_com optimization"], [gmp_prog_cc_works="no, mpn_lshift_com optimization[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags], [mpn_lshift_com optimization 2], [/* The following is mis-compiled by Intel ia-64 icc version 1.8 under +- "icc -O3", After several calls, the function writes partial garbage to +- the result vector. Perhaps relates to the chk.a.nc insn. This code needs +- to be run to show the problem, but that's fine, the offending cc is a +- native-only compiler so we don't have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-#include +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags], [mpn_lshift_com optimization 2], [/* The following is mis-compiled by Intel ia-64 icc version 1.8 under +- "icc -O3", After several calls, the function writes partial garbage to +- the result vector. Perhaps relates to the chk.a.nc insn. This code needs +- to be run to show the problem, but that's fine, the offending cc is a +- native-only compiler so we don't have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-#include +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-], [], [gmp_prog_cc_works="no, mpn_lshift_com optimization 2"], [gmp_prog_cc_works="no, mpn_lshift_com optimization 2[, program does not run]"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_PROG_CC_X86_GOT_EAX_EMITTED([$cc $cflags $cppflags], [GMP_ASM_X86_GOT_EAX_OK([$cc $cflags $cppflags],, +- [gmp_prog_cc_works="no, bad gas GOT with eax"])]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- GMP_ASM_X86_GOT_EAX_OK([$cc $cflags $cppflags], [], [gmp_prog_cc_works="no, bad gas GOT with eax"]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2016: -1- GMP_PROG_CC_WORKS_LONGLONG([$cc $cflags $cppflags], [], [continue]) +-m4trace:configure.ac:2016: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:851: GMP_PROG_CC_WORKS_LONGLONG is expanded from... +-configure.ac:2016: the top level]) +-m4trace:configure.ac:2016: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:851: GMP_PROG_CC_WORKS_LONGLONG is expanded from... +-configure.ac:2016: the top level]) +-m4trace:configure.ac:2016: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:851: GMP_PROG_CC_WORKS_LONGLONG is expanded from... +-configure.ac:2016: the top level]) +-m4trace:configure.ac:2028: -1- GMP_HPC_HPPA_2_0([$cc], [], [testlist_pass=no]) +-m4trace:configure.ac:2028: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1025: GMP_HPC_HPPA_2_0 is expanded from... +-configure.ac:2028: the top level]) +-m4trace:configure.ac:2028: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1025: GMP_HPC_HPPA_2_0 is expanded from... +-configure.ac:2028: the top level]) +-m4trace:configure.ac:2028: -1- GMP_COMPARE_GE([$gmp_tmp_v1], [10], [$gmp_tmp_v2], [32], [$gmp_tmp_v3], [30]) +-m4trace:configure.ac:2028: -1- GMP_COMPARE_GE_INTERNAL([$gmp_tmp_v1], [10], [$gmp_tmp_v2], [32], [$gmp_tmp_v3], [30]) +-m4trace:configure.ac:2028: -1- GMP_COMPARE_GE_INTERNAL([$gmp_tmp_v2], [32], [$gmp_tmp_v3], [30]) +-m4trace:configure.ac:2028: -1- GMP_COMPARE_GE_INTERNAL([$gmp_tmp_v3], [30]) +-m4trace:configure.ac:2029: -1- GMP_GCC_ARM_UMODSI([$cc], [], [testlist_pass=no]) +-m4trace:configure.ac:2029: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1066: GMP_GCC_ARM_UMODSI is expanded from... +-configure.ac:2029: the top level]) +-m4trace:configure.ac:2030: -1- GMP_GCC_MIPS_O32([$cc], [], [testlist_pass=no]) +-m4trace:configure.ac:2030: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1091: GMP_GCC_MIPS_O32 is expanded from... +-configure.ac:2030: the top level]) +-m4trace:configure.ac:2030: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1091: GMP_GCC_MIPS_O32 is expanded from... +-configure.ac:2030: the top level]) +-m4trace:configure.ac:2031: -1- GMP_HPPA_LEVEL_20([$cc $cflags], [], [testlist_pass=no]) +-m4trace:configure.ac:2031: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1396: GMP_HPPA_LEVEL_20 is expanded from... +-configure.ac:2031: the top level]) +-m4trace:configure.ac:2031: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1396: GMP_HPPA_LEVEL_20 is expanded from... +-configure.ac:2031: the top level]) +-m4trace:configure.ac:2031: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1396: GMP_HPPA_LEVEL_20 is expanded from... +-configure.ac:2031: the top level]) +-m4trace:configure.ac:2032: -1- GMP_C_TEST_SIZEOF([$cc $cflags], [$tst], [], [testlist_pass=no]) +-m4trace:configure.ac:2032: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:891: GMP_C_TEST_SIZEOF is expanded from... +-configure.ac:2032: the top level]) +-m4trace:configure.ac:2032: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:891: GMP_C_TEST_SIZEOF is expanded from... +-configure.ac:2032: the top level]) +-m4trace:configure.ac:2150: -1- GMP_GCC_PENTIUM4_SSE2([$cc $cflags $cppflags], [], [continue]) +-m4trace:configure.ac:2151: -1- GMP_OS_X86_XMM([$cc $cflags $cppflags], [], [continue]) +-m4trace:configure.ac:2151: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1298: GMP_OS_X86_XMM is expanded from... +-configure.ac:2151: the top level]) +-m4trace:configure.ac:2156: -1- GMP_GCC_NO_CPP_PRECOMP([$ccbase], [$cc], [$cflags], [cflags="$cflags $flag" +- break], [continue]) +-m4trace:configure.ac:2156: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1126: GMP_GCC_NO_CPP_PRECOMP is expanded from... +-configure.ac:2156: the top level]) +-m4trace:configure.ac:2164: -1- GMP_GCC_WA_MCPU([$cc $cflags], [$flag], [], [continue]) +-m4trace:configure.ac:2164: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1186: GMP_GCC_WA_MCPU is expanded from... +-configure.ac:2164: the top level]) +-m4trace:configure.ac:2169: -1- GMP_GCC_WA_OLDAS([$cc $cflags $cppflags], [cflags="$cflags $flag" +- break], [continue]) +-m4trace:configure.ac:2169: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1238: GMP_GCC_WA_OLDAS is expanded from... +-configure.ac:2169: the top level]) +-m4trace:configure.ac:2169: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1238: GMP_GCC_WA_OLDAS is expanded from... +-configure.ac:2169: the top level]) +-m4trace:configure.ac:2169: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1238: GMP_GCC_WA_OLDAS is expanded from... +-configure.ac:2169: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS([$cc $cflags $cppflags $flag], [cflags="$cflags $flag" +- break]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], []) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [], [ +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [], [ +-int main () { return 0; }], [], [gmp_prog_cc_works="no"], [gmp_prog_cc_works="no[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [function pointer return], [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [function pointer return], [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [function pointer return], [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 +- (without -maix64), hence detecting an unusable compiler */ +-void *g() { return (void *) 0; } +-void *f() { return g(); } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, function pointer return"], [gmp_prog_cc_works="no, function pointer return[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [cmov instruction], [/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [cmov instruction], [/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [cmov instruction], [/* The following provokes an invalid instruction syntax from i386 gcc +- -march=pentiumpro on Solaris 2.8. The native sun assembler +- requires a non-standard syntax for cmov which gcc (as of 2.95.2 at +- least) doesn't know. */ +-int n; +-int cmov () { return (n >= 0 ? n : 0); } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, cmov instruction"], [gmp_prog_cc_works="no, cmov instruction[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [double -> ulong conversion], [/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [double -> ulong conversion], [/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [double -> ulong conversion], [/* The following provokes a linker invocation problem with gcc 3.0.3 +- on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 +- option causes gcc to incorrectly select the 32-bit libgcc.a, not +- the 64-bit one, and consequently it misses out on the __fixunsdfdi +- helper (double -> uint64 conversion). */ +-double d; +-unsigned long gcc303 () { return (unsigned long) d; } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, double -> ulong conversion"], [gmp_prog_cc_works="no, double -> ulong conversion[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [double negation], [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [double negation], [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [double negation], [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if +- the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0 +- instruction, and a negation like this comes out using it. */ +-double fneg_data; +-unsigned long fneg () { return -fneg_data; } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, double negation"], [gmp_prog_cc_works="no, double negation[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [double -> float conversion], [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [double -> float conversion], [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [double -> float conversion], [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn +- (cvtsd2ss) which will provoke an error if the assembler doesn't recognise +- those instructions. Not sure how much of the gmp code will come out +- wanting sse2, but it's easiest to reject an option we know is bad. */ +-double ftod_data; +-float ftod () { return (float) ftod_data; } +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, double -> float conversion"], [gmp_prog_cc_works="no, double -> float conversion[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [gnupro alpha ev6 char spilling], [/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [gnupro alpha ev6 char spilling], [/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [gnupro alpha ev6 char spilling], [/* The following provokes an internal compiler error from gcc version +- "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char +- values being spilled into floating point registers. The problem doesn't +- show up all the time, but has occurred enough in GMP for us to reject +- this compiler+flags. */ +-#include /* for memcpy */ +-struct try_t +-{ +- char dst[2]; +- char size; +- long d0, d1, d2, d3, d4, d5, d6; +- char overlap; +-}; +-struct try_t param[6]; +-int +-param_init () +-{ +- struct try_t *p; +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- memcpy (p, ¶m[ 2 ], sizeof (*p)); +- p->size = 2; +- memcpy (p, ¶m[ 1 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 2; +- memcpy (p, ¶m[ 3 ], sizeof (*p)); +- p->dst[0] = 1; +- p->overlap = 8; +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- memcpy (p, ¶m[ 4 ], sizeof (*p)); +- p->overlap = 8; +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- memcpy (p, ¶m[ 5 ], sizeof (*p)); +- return 0; +-} +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, gnupro alpha ev6 char spilling"], [gmp_prog_cc_works="no, gnupro alpha ev6 char spilling[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [__builtin_alloca availability], [int k; int foo () { __builtin_alloca (k); }], [GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [alloca array], +-[/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +-])]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [alloca array], [/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [alloca array], [/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [alloca array], [/* The following provokes an internal compiler error from Itanium HP-UX cc +- under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */ +-int k; +-int foo () +-{ +- int i, **a; +- a = __builtin_alloca (k); +- for (i = 0; i <= k; i++) +- a[i] = __builtin_alloca (1 << i); +-} +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, alloca array"], [gmp_prog_cc_works="no, alloca array[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [abs int -> double conversion], [/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [abs int -> double conversion], [/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; }]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [abs int -> double conversion], [/* The following provokes an internal error from the assembler on +- power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this +- results in "Internal error related to the source program domain". +- +- For reference it seems to be the combination of nabs+fcirz which is bad, +- not either alone. This sort of thing occurs in mpz/get_str.c with the +- way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps +- if that code changes to a scaled-integer style then we won't need this +- test. */ +- +-double fp[1]; +-int x; +-int f () +-{ +- int a; +- a = (x >= 0 ? x : -x); +- return a * fp[0]; +-} +- +-int main () { return 0; }], [], [gmp_prog_cc_works="no, abs int -> double conversion"], [gmp_prog_cc_works="no, abs int -> double conversion[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART([$cc $cflags $cppflags $flag], [long long reliability test 1], [/* The following provokes a segfault in the compiler on powerpc-apple-darwin. +- Extracted from tests/mpn/t-iord_u.c. Causes Apple's gcc 3.3 build 1640 and +- 1666 to segfault with e.g., -O2 -mpowerpc64. */ +- +-#if defined (__GNUC__) && ! defined (__cplusplus) +-typedef unsigned long long t1;typedef t1*t2; +-static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0) +-{t1 c,x,r;int i;if(v0){c=1;for(i=1;i> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [mpn_lshift_com optimization], [/* The following is mis-compiled by HP ia-64 cc version +- cc: HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003] +- under "cc +O3", both in +DD32 and +DD64 modes. The mpn_lshift_com gets +- inlined and its return value somehow botched to be 0 instead of 1. This +- arises in the real mpn_lshift_com in mul_fft.c. A lower optimization +- level, like +O2 seems ok. This code needs to be run to show the problem, +- but that's fine, the offending cc is a native-only compiler so we don't +- have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-unsigned long +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long retval, high_limb, low_limb; +- unsigned tnc; +- long i; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *up++; +- retval = low_limb >> tnc; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *up++; +- *rp++ = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- return retval; +-} +-int +-main () +-{ +- unsigned long cy, rp[2], up[2]; +- up[0] = ~ 0L; +- up[1] = 0; +- cy = lshift_com (rp, up, 2L, 1); +- if (cy != 1L) +- return 1; +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-], [], [gmp_prog_cc_works="no, mpn_lshift_com optimization"], [gmp_prog_cc_works="no, mpn_lshift_com optimization[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_MAIN([$cc $cflags $cppflags $flag], [mpn_lshift_com optimization 2], [/* The following is mis-compiled by Intel ia-64 icc version 1.8 under +- "icc -O3", After several calls, the function writes partial garbage to +- the result vector. Perhaps relates to the chk.a.nc insn. This code needs +- to be run to show the problem, but that's fine, the offending cc is a +- native-only compiler so we don't have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-#include +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_WORKS_PART_TEST([$cc $cflags $cppflags $flag], [mpn_lshift_com optimization 2], [/* The following is mis-compiled by Intel ia-64 icc version 1.8 under +- "icc -O3", After several calls, the function writes partial garbage to +- the result vector. Perhaps relates to the chk.a.nc insn. This code needs +- to be run to show the problem, but that's fine, the offending cc is a +- native-only compiler so we don't have to worry about cross compiling. */ +- +-#if ! defined (__cplusplus) +-#include +-void +-lshift_com (rp, up, n, cnt) +- unsigned long *rp; +- unsigned long *up; +- long n; +- unsigned cnt; +-{ +- unsigned long high_limb, low_limb; +- unsigned tnc; +- long i; +- up += n; +- rp += n; +- tnc = 8 * sizeof (unsigned long) - cnt; +- low_limb = *--up; +- high_limb = low_limb << cnt; +- for (i = n - 1; i != 0; i--) +- { +- low_limb = *--up; +- *--rp = ~(high_limb | (low_limb >> tnc)); +- high_limb = low_limb << cnt; +- } +- *--rp = ~high_limb; +-} +-int +-main () +-{ +- unsigned long *r, *r2; +- unsigned long a[88 + 1]; +- long i; +- for (i = 0; i < 88 + 1; i++) +- a[i] = ~0L; +- r = malloc (10000 * sizeof (unsigned long)); +- r2 = r; +- for (i = 0; i < 528; i += 22) +- { +- lshift_com (r2, a, +- i / (8 * sizeof (unsigned long)) + 1, +- i % (8 * sizeof (unsigned long))); +- r2 += 88 + 1; +- } +- if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 || +- r[2052] != 0 || r[2053] != 0 || r[2054] != 0) +- abort (); +- return 0; +-} +-#else +-int +-main () +-{ +- return 0; +-} +-#endif +-], [], [gmp_prog_cc_works="no, mpn_lshift_com optimization 2"], [gmp_prog_cc_works="no, mpn_lshift_com optimization 2[, program does not run]"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_PROG_CC_X86_GOT_EAX_EMITTED([$cc $cflags $cppflags $flag], [GMP_ASM_X86_GOT_EAX_OK([$cc $cflags $cppflags $flag],, +- [gmp_prog_cc_works="no, bad gas GOT with eax"])]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- GMP_ASM_X86_GOT_EAX_OK([$cc $cflags $cppflags $flag], [], [gmp_prog_cc_works="no, bad gas GOT with eax"]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2191: -1- GMP_DEFINE_RAW(["define_not_for_expansion(\`HAVE_ABI_$ABI_nodots')"], [POST]) +-m4trace:configure.ac:2200: -1- m4_pattern_allow([^GMP_LDFLAGS$]) +-m4trace:configure.ac:2201: -1- m4_pattern_allow([^LIBGMP_LDFLAGS$]) +-m4trace:configure.ac:2202: -1- m4_pattern_allow([^LIBGMPXX_LDFLAGS$]) +-m4trace:configure.ac:2220: -1- m4_pattern_allow([^HAVE_SPEED_CYCLECOUNTER$]) +-m4trace:configure.ac:2223: -1- m4_pattern_allow([^SPEED_CYCLECOUNTER_OBJ$]) +-m4trace:configure.ac:2237: -1- m4_pattern_allow([^HAVE_CALLING_CONVENTIONS$]) +-m4trace:configure.ac:2240: -1- m4_pattern_allow([^CALLING_CONVENTIONS_OBJS$]) +-m4trace:configure.ac:2262: -1- m4_pattern_allow([^DEFN_LONG_LONG_LIMB$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CFLAGS$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^LDFLAGS$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^LIBS$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^ac_ct_CC$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^EXEEXT$]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^OBJEXT$]) +-m4trace:configure.ac:2266: -1- _AM_PROG_CC_C_O +-m4trace:configure.ac:2266: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) +-m4trace:configure.ac:2268: -1- m4_pattern_allow([^CPP$]) +-m4trace:configure.ac:2268: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2268: -1- m4_pattern_allow([^CPP$]) +-m4trace:configure.ac:2272: -1- GMP_PROG_CC_FOR_BUILD +-m4trace:configure.ac:2272: -1- GMP_PROG_CC_FOR_BUILD_WORKS([$CC_FOR_BUILD], [], [AC_MSG_ERROR([Specified CC_FOR_BUILD doesn't seem to work])]) +-m4trace:configure.ac:2272: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:3810: GMP_PROG_CC_FOR_BUILD_WORKS is expanded from... +-acinclude.m4:3778: GMP_PROG_CC_FOR_BUILD is expanded from... +-configure.ac:2272: the top level]) +-m4trace:configure.ac:2272: -1- GMP_PROG_CC_FOR_BUILD_WORKS([$HOST_CC], [CC_FOR_BUILD=$HOST_CC], [AC_MSG_ERROR([Specified HOST_CC doesn't seem to work])]) +-m4trace:configure.ac:2272: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:3810: GMP_PROG_CC_FOR_BUILD_WORKS is expanded from... +-acinclude.m4:3778: GMP_PROG_CC_FOR_BUILD is expanded from... +-configure.ac:2272: the top level]) +-m4trace:configure.ac:2272: -1- GMP_PROG_CC_FOR_BUILD_WORKS([$i], [CC_FOR_BUILD=$i +- break]) +-m4trace:configure.ac:2272: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:3810: GMP_PROG_CC_FOR_BUILD_WORKS is expanded from... +-acinclude.m4:3778: GMP_PROG_CC_FOR_BUILD is expanded from... +-configure.ac:2272: the top level]) +-m4trace:configure.ac:2272: -1- m4_pattern_allow([^CC_FOR_BUILD$]) +-m4trace:configure.ac:2272: -1- m4_pattern_allow([^CC_FOR_BUILD$]) +-m4trace:configure.ac:2273: -1- GMP_PROG_CPP_FOR_BUILD +-m4trace:configure.ac:2273: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-acinclude.m4:3844: GMP_PROG_CPP_FOR_BUILD is expanded from... +-configure.ac:2273: the top level]) +-m4trace:configure.ac:2273: -1- m4_pattern_allow([^CPP_FOR_BUILD$]) +-m4trace:configure.ac:2273: -1- m4_pattern_allow([^CPP_FOR_BUILD$]) +-m4trace:configure.ac:2274: -1- GMP_PROG_EXEEXT_FOR_BUILD +-m4trace:configure.ac:2274: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3884: GMP_PROG_EXEEXT_FOR_BUILD is expanded from... +-configure.ac:2274: the top level]) +-m4trace:configure.ac:2274: -1- m4_pattern_allow([^EXEEXT_FOR_BUILD$]) +-m4trace:configure.ac:2275: -1- GMP_C_FOR_BUILD_ANSI +-m4trace:configure.ac:2275: -1- m4_pattern_allow([^U_FOR_BUILD$]) +-m4trace:configure.ac:2276: -1- GMP_CHECK_LIBM_FOR_BUILD +-m4trace:configure.ac:2276: -1- m4_pattern_allow([^LIBM_FOR_BUILD$]) +-m4trace:configure.ac:2284: -1- m4_pattern_allow([^CCAS$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CXX$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CXXFLAGS$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^LDFLAGS$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^LIBS$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CXX$]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^ac_ct_CXX$]) +-m4trace:configure.ac:2293: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-configure.ac:2293: the top level]) +-m4trace:configure.ac:2319: -1- GMP_PROG_CXX_WORKS([$CXX $CPPFLAGS $CXXFLAGS], [want_cxx=yes +- break]) +-m4trace:configure.ac:2319: -1- GMP_PROG_CXX_WORKS_PART([$CXX $CPPFLAGS $CXXFLAGS], []) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- GMP_PROG_CXX_WORKS_PART([$CXX $CPPFLAGS $CXXFLAGS], [namespace], [namespace foo { } +-using namespace foo; +-]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- GMP_PROG_CXX_WORKS_PART([$CXX $CPPFLAGS $CXXFLAGS], [std iostream], [/* This test rejects g++ 2.7.2 which doesn't have , only a +- pre-standard iostream.h. */ +-#include +- +-/* This test rejects OSF 5.1 Compaq C++ in its default pre-standard iostream +- mode, since that mode puts cout in the global namespace, not "std". */ +-void someoutput (void) { std::cout << 123; } +-]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2330: -1- AM_CONDITIONAL([WANT_CXX], [test $want_cxx = yes]) +-m4trace:configure.ac:2330: -1- m4_pattern_allow([^WANT_CXX_TRUE$]) +-m4trace:configure.ac:2330: -1- m4_pattern_allow([^WANT_CXX_FALSE$]) +-m4trace:configure.ac:2330: -1- _AM_SUBST_NOTMAKE([WANT_CXX_TRUE]) +-m4trace:configure.ac:2330: -1- _AM_SUBST_NOTMAKE([WANT_CXX_FALSE]) +-m4trace:configure.ac:2338: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2338: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2338: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2345: -1- GMP_CRAY_OPTIONS([add_path="cray/ieee"], [add_path="cray/cfp"; extra_functions="mulwwc90"], [add_path="cray/cfp"; extra_functions="mulwwj90"]) +-m4trace:configure.ac:2345: -1- AC_PROG_EGREP +-m4trace:configure.ac:2345: -1- m4_pattern_allow([^GREP$]) +-m4trace:configure.ac:2345: -1- m4_pattern_allow([^EGREP$]) +-m4trace:configure.ac:2389: -1- GMP_ASM_X86_MMX([], [GMP_STRIP_PATH(*mmx*)]) +-m4trace:configure.ac:2389: -1- GMP_TRY_ASSEMBLE([ .text +- movq %mm0, %mm1], [gmp_cv_asm_x86_mmx=yes +-case $host in +-*-*-solaris*) +- if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then +- if grep "0f 6f c1" conftest.out >/dev/null; then +- gmp_cv_asm_x86_mmx=movq-bug +- fi +- else +- AC_MSG_WARN(["dis" not available to check for "as" movq bug]) +- fi +-esac], [gmp_cv_asm_x86_mmx=no]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2392: -1- GMP_ASM_X86_SSE2([], [GMP_STRIP_PATH(sse2)]) +-m4trace:configure.ac:2392: -1- GMP_TRY_ASSEMBLE([ .text +- paddq %mm0, %mm1], [gmp_cv_asm_x86_sse2=yes], [gmp_cv_asm_x86_sse2=no]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2396: -1- GMP_ASM_X86_MULX([], [GMP_STRIP_PATH(mulx)]) +-m4trace:configure.ac:2396: -1- GMP_TRY_ASSEMBLE([ .text +- mulx %r8, %r9, %r10], [gmp_cv_asm_x86_mulx=yes], [gmp_cv_asm_x86_mulx=no]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2399: -1- GMP_ASM_X86_ADX([], [GMP_STRIP_PATH(adx)]) +-m4trace:configure.ac:2399: -1- GMP_TRY_ASSEMBLE([ .text +- adox %r8, %r9 +- adcx %r8, %r9], [gmp_cv_asm_x86_adx=yes], [gmp_cv_asm_x86_adx=no]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2415: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-configure.ac:2415: the top level]) +-m4trace:configure.ac:2437: -1- CL_AS_NOEXECSTACK +-m4trace:configure.ac:2437: -1- m4_pattern_allow([^ASMFLAGS$]) +-m4trace:configure.ac:2439: -1- GMP_PROG_AR +-m4trace:configure.ac:2439: -1- m4_pattern_allow([^AR$]) +-m4trace:configure.ac:2440: -1- GMP_PROG_NM +-m4trace:configure.ac:2440: -1- AC_PROG_NM +-m4trace:configure.ac:2440: -1- _m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete. +-You should run autoupdate.], [/usr/share/aclocal/libtool.m4:3501: AC_PROG_NM is expanded from... +-acinclude.m4:422: GMP_PROG_NM is expanded from... +-configure.ac:2440: the top level]) +-m4trace:configure.ac:2440: -1- LT_PATH_NM +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^NM$]) +-m4trace:configure.ac:2440: -1- AC_PROG_NM +-m4trace:configure.ac:2440: -1- _m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete. +-You should run autoupdate.], [/usr/share/aclocal/libtool.m4:3501: AC_PROG_NM is expanded from... +-acinclude.m4:422: GMP_PROG_NM is expanded from... +-configure.ac:2440: the top level]) +-m4trace:configure.ac:2440: -1- LT_PATH_NM +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^NM$]) +-m4trace:configure.ac:2461: -1- AC_LIBTOOL_WIN32_DLL +-m4trace:configure.ac:2461: -1- _m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +-You should run autoupdate.], [/usr/share/aclocal/ltoptions.m4:146: AC_LIBTOOL_WIN32_DLL is expanded from... +-configure.ac:2461: the top level]) +-m4trace:configure.ac:2461: -1- m4_pattern_allow([^AS$]) +-m4trace:configure.ac:2461: -1- m4_pattern_allow([^DLLTOOL$]) +-m4trace:configure.ac:2461: -1- m4_pattern_allow([^OBJDUMP$]) +-m4trace:configure.ac:2461: -1- _m4_warn([obsolete], [AC_LIBTOOL_WIN32_DLL: Remove this warning and the call to _LT_SET_OPTION when you +-put the `win32-dll' option into LT_INIT's first parameter.], [/usr/share/aclocal/ltoptions.m4:146: AC_LIBTOOL_WIN32_DLL is expanded from... +-configure.ac:2461: the top level]) +-m4trace:configure.ac:2463: -1- m4_pattern_allow([^LIBGMP_DLL$]) +-m4trace:configure.ac:2551: -1- AC_PROG_LIBTOOL +-m4trace:configure.ac:2551: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +-You should run autoupdate.], [/usr/share/aclocal/libtool.m4:107: AC_PROG_LIBTOOL is expanded from... +-configure.ac:2551: the top level]) +-m4trace:configure.ac:2551: -1- LT_INIT +-m4trace:configure.ac:2551: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +-m4trace:configure.ac:2551: -1- LTOPTIONS_VERSION +-m4trace:configure.ac:2551: -1- LTSUGAR_VERSION +-m4trace:configure.ac:2551: -1- LTVERSION_VERSION +-m4trace:configure.ac:2551: -1- LTOBSOLETE_VERSION +-m4trace:configure.ac:2551: -1- _LT_PROG_LTMAIN +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LIBTOOL$]) +-m4trace:configure.ac:2551: -1- _LT_PREPARE_SED_QUOTE_VARS +-m4trace:configure.ac:2551: -1- _LT_PROG_ECHO_BACKSLASH +-m4trace:configure.ac:2551: -1- LT_PATH_LD +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^SED$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^FGREP$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^GREP$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LD$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LN_S$]) +-m4trace:configure.ac:2551: -1- LT_CMD_MAX_LEN +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OBJDUMP$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OBJDUMP$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^DLLTOOL$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^DLLTOOL$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^AR$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^ac_ct_AR$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^STRIP$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^RANLIB$]) +-m4trace:configure.ac:2551: -1- _LT_WITH_SYSROOT +-m4trace:configure.ac:2551: -1- m4_pattern_allow([LT_OBJDIR]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LT_OBJDIR$]) +-m4trace:configure.ac:2551: -1- _LT_CC_BASENAME([$compiler]) +-m4trace:configure.ac:2551: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) +-m4trace:configure.ac:2551: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) +-m4trace:configure.ac:2551: -1- LT_SUPPORTED_TAG([CC]) +-m4trace:configure.ac:2551: -1- _LT_COMPILER_BOILERPLATE +-m4trace:configure.ac:2551: -1- _LT_LINKER_BOILERPLATE +-m4trace:configure.ac:2551: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) +-m4trace:configure.ac:2551: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in +- "" | " "*) ;; +- *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; +- esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) +-m4trace:configure.ac:2551: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +-m4trace:configure.ac:2551: -1- _LT_REQUIRED_DARWIN_CHECKS +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^DSYMUTIL$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^NMEDIT$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LIPO$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OTOOL$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OTOOL64$]) +-m4trace:configure.ac:2551: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) +-m4trace:configure.ac:2551: -1- LT_SYS_DLOPEN_SELF +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^STDC_HEADERS$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +-m4trace:configure.ac:2551: -1- LT_LANG([CXX]) +-m4trace:configure.ac:2551: -1- LT_SUPPORTED_TAG([CXX]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2551: -1- _LT_COMPILER_BOILERPLATE +-m4trace:configure.ac:2551: -1- _LT_LINKER_BOILERPLATE +-m4trace:configure.ac:2551: -1- _LT_CC_BASENAME([$compiler]) +-m4trace:configure.ac:2551: -1- LT_PATH_LD +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LD$]) +-m4trace:configure.ac:2551: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in +- "" | " "*) ;; +- *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; +- esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= +- _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) +-m4trace:configure.ac:2551: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) +-m4trace:configure.ac:2565: -1- AM_CONDITIONAL([ENABLE_STATIC], [test "$enable_static" = yes]) +-m4trace:configure.ac:2565: -1- m4_pattern_allow([^ENABLE_STATIC_TRUE$]) +-m4trace:configure.ac:2565: -1- m4_pattern_allow([^ENABLE_STATIC_FALSE$]) +-m4trace:configure.ac:2565: -1- _AM_SUBST_NOTMAKE([ENABLE_STATIC_TRUE]) +-m4trace:configure.ac:2565: -1- _AM_SUBST_NOTMAKE([ENABLE_STATIC_FALSE]) +-m4trace:configure.ac:2571: -1- m4_pattern_allow([^STDC_HEADERS$]) +-m4trace:configure.ac:2572: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) +-m4trace:configure.ac:2602: -1- m4_pattern_allow([^HAVE_SYS_RESOURCE_H$]) +-m4trace:configure.ac:2615: -1- m4_pattern_allow([^HAVE_SYS_SYSCTL_H$]) +-m4trace:configure.ac:2621: -1- m4_pattern_allow([^HAVE_MACHINE_HAL_SYSINFO_H$]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_FGETC$]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_FSCANF$]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_OPTARG$]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_UNGETC$]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_VFPRINTF$]) +-m4trace:configure.ac:2638: -1- m4_pattern_allow([^HAVE_DECL_SYS_ERRLIST$]) +-m4trace:configure.ac:2638: -1- m4_pattern_allow([^HAVE_DECL_SYS_NERR$]) +-m4trace:configure.ac:2642: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/types.m4:746: AC_TYPE_SIGNAL is expanded from... +-configure.ac:2642: the top level]) +-m4trace:configure.ac:2642: -1- m4_pattern_allow([^RETSIGTYPE$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_INTMAX_T$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_LONG_DOUBLE$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_LONG_LONG$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_PTRDIFF_T$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_QUAD_T$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_UINT_LEAST32_T$]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_INTPTR_T$]) +-m4trace:configure.ac:2657: -1- m4_pattern_allow([^HAVE_STRINGIZE$]) +-m4trace:configure.ac:2662: -1- m4_pattern_allow([^volatile$]) +-m4trace:configure.ac:2664: -1- m4_pattern_allow([^restrict$]) +-m4trace:configure.ac:2664: -1- m4_pattern_allow([^restrict$]) +-m4trace:configure.ac:2667: -1- GMP_C_ATTRIBUTE_CONST +-m4trace:configure.ac:2667: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3159: GMP_C_ATTRIBUTE_CONST is expanded from... +-configure.ac:2667: the top level]) +-m4trace:configure.ac:2667: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_CONST$]) +-m4trace:configure.ac:2668: -1- GMP_C_ATTRIBUTE_MALLOC +-m4trace:configure.ac:2668: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3178: GMP_C_ATTRIBUTE_MALLOC is expanded from... +-configure.ac:2668: the top level]) +-m4trace:configure.ac:2668: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_MALLOC$]) +-m4trace:configure.ac:2669: -1- GMP_C_ATTRIBUTE_MODE +-m4trace:configure.ac:2669: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3208: GMP_C_ATTRIBUTE_MODE is expanded from... +-configure.ac:2669: the top level]) +-m4trace:configure.ac:2669: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_MODE$]) +-m4trace:configure.ac:2670: -1- GMP_C_ATTRIBUTE_NORETURN +-m4trace:configure.ac:2670: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3224: GMP_C_ATTRIBUTE_NORETURN is expanded from... +-configure.ac:2670: the top level]) +-m4trace:configure.ac:2670: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_NORETURN$]) +-m4trace:configure.ac:2672: -1- GMP_H_EXTERN_INLINE +-m4trace:configure.ac:2672: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-acinclude.m4:3731: GMP_H_EXTERN_INLINE is expanded from... +-configure.ac:2672: the top level]) +-m4trace:configure.ac:2675: -1- AC_CHECK_LIBM +-m4trace:configure.ac:2675: -1- _m4_warn([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. +-You should run autoupdate.], [/usr/share/aclocal/libtool.m4:3590: AC_CHECK_LIBM is expanded from... +-configure.ac:2675: the top level]) +-m4trace:configure.ac:2675: -1- LT_LIB_M +-m4trace:configure.ac:2675: -1- m4_pattern_allow([^LIBM$]) +-m4trace:configure.ac:2676: -1- m4_pattern_allow([^LIBM$]) +-m4trace:configure.ac:2678: -1- GMP_FUNC_ALLOCA +-m4trace:configure.ac:2678: -1- GMP_HEADER_ALLOCA +-m4trace:configure.ac:2678: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3539: GMP_HEADER_ALLOCA is expanded from... +-acinclude.m4:3523: GMP_FUNC_ALLOCA is expanded from... +-configure.ac:2678: the top level]) +-m4trace:configure.ac:2678: -1- m4_pattern_allow([^HAVE_ALLOCA_H$]) +-m4trace:configure.ac:2678: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3523: GMP_FUNC_ALLOCA is expanded from... +-configure.ac:2678: the top level]) +-m4trace:configure.ac:2678: -1- m4_pattern_allow([^HAVE_ALLOCA$]) +-m4trace:configure.ac:2679: -1- GMP_OPTION_ALLOCA +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_ALLOCA$]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_REENTRANT$]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_NOTREENTRANT$]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_DEBUG$]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^TAL_OBJECT$]) +-m4trace:configure.ac:2681: -1- GMP_H_HAVE_FILE +-m4trace:configure.ac:2681: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-acinclude.m4:3758: GMP_H_HAVE_FILE is expanded from... +-configure.ac:2681: the top level]) +-m4trace:configure.ac:2683: -1- m4_pattern_allow([^HAVE_LIMB_BIG_ENDIAN$]) +-m4trace:configure.ac:2683: -1- GMP_DEFINE_RAW(["define_not_for_expansion(\`HAVE_LIMB_BIG_ENDIAN')"], [POST]) +-m4trace:configure.ac:2683: -1- m4_pattern_allow([^HAVE_LIMB_LITTLE_ENDIAN$]) +-m4trace:configure.ac:2683: -1- GMP_DEFINE_RAW(["define_not_for_expansion(\`HAVE_LIMB_LITTLE_ENDIAN')"], [POST]) +-m4trace:configure.ac:2683: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$]) +-m4trace:configure.ac:2696: -1- GMP_C_DOUBLE_FORMAT +-m4trace:configure.ac:2696: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3254: GMP_C_DOUBLE_FORMAT is expanded from... +-configure.ac:2696: the top level]) +-m4trace:configure.ac:2696: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3254: GMP_C_DOUBLE_FORMAT is expanded from... +-configure.ac:2696: the top level]) +-m4trace:configure.ac:2696: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3254: GMP_C_DOUBLE_FORMAT is expanded from... +-configure.ac:2696: the top level]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_IEEE_BIG_ENDIAN$]) +-m4trace:configure.ac:2696: -1- GMP_DEFINE_RAW(["define_not_for_expansion(\`HAVE_DOUBLE_IEEE_BIG_ENDIAN')"], [POST]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_IEEE_LITTLE_ENDIAN$]) +-m4trace:configure.ac:2696: -1- GMP_DEFINE_RAW(["define_not_for_expansion(\`HAVE_DOUBLE_IEEE_LITTLE_ENDIAN')"], [POST]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_IEEE_LITTLE_SWAPPED$]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_VAX_D$]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_VAX_G$]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_CRAY_CFP$]) +-m4trace:configure.ac:2736: -1- m4_pattern_allow([^HAVE_CLOCK_GETTIME$]) +-m4trace:configure.ac:2741: -1- m4_pattern_allow([^TUNE_LIBS$]) +-m4trace:configure.ac:2743: -1- GMP_FUNC_VSNPRINTF +-m4trace:configure.ac:2743: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3666: GMP_FUNC_VSNPRINTF is expanded from... +-configure.ac:2743: the top level]) +-m4trace:configure.ac:2743: -1- m4_pattern_allow([^HAVE_VSNPRINTF$]) +-m4trace:configure.ac:2744: -1- GMP_FUNC_SSCANF_WRITABLE_INPUT +-m4trace:configure.ac:2744: -1- m4_pattern_allow([^SSCANF_WRITABLE_INPUT$]) +-m4trace:configure.ac:2749: -1- m4_pattern_allow([^HAVE_PSP_ITICKSPERCLKTICK$]) +-m4trace:configure.ac:2764: -1- m4_pattern_allow([^HAVE_SSTREAM$]) +-m4trace:configure.ac:2765: -1- m4_pattern_allow([^HAVE_STD__LOCALE$]) +-m4trace:configure.ac:2969: -1- m4_pattern_allow([^WANT_FAT_BINARY$]) +-m4trace:configure.ac:2970: -1- GMP_DEFINE([WANT_FAT_BINARY], [yes]) +-m4trace:configure.ac:3464: -1- GMP_PROG_M4 +-m4trace:configure.ac:3464: -1- m4_pattern_allow([^M4$]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- m4_pattern_allow([^M4$]) +-m4trace:configure.ac:3465: -1- GMP_M4_M4WRAP_SPURIOUS +-m4trace:configure.ac:3465: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:378: GMP_M4_M4WRAP_SPURIOUS is expanded from... +-configure.ac:3465: the top level]) +-m4trace:configure.ac:3465: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:378: GMP_M4_M4WRAP_SPURIOUS is expanded from... +-configure.ac:3465: the top level]) +-m4trace:configure.ac:3465: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:378: GMP_M4_M4WRAP_SPURIOUS is expanded from... +-configure.ac:3465: the top level]) +-m4trace:configure.ac:3465: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_m4_m4wrap_spurious>)"]) +-m4trace:configure.ac:3479: -1- GMP_ASM_TEXT +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- GMP_TRY_ASSEMBLE([ $i], [gmp_cv_asm_text=$i +- rm -f conftest* +- break]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3480: -1- GMP_ASM_DATA +-m4trace:configure.ac:3481: -1- GMP_ASM_LABEL_SUFFIX +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +-somelabel$i], [gmp_cv_asm_label_suffix=$i +- rm -f conftest* +- break], [cat conftest.out >&AC_FD_CC]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3482: -1- GMP_ASM_GLOBL +-m4trace:configure.ac:3483: -1- GMP_ASM_GLOBL_ATTR +-m4trace:configure.ac:3484: -1- GMP_ASM_UNDERSCORE +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- GMP_DEFINE([GSYM_PREFIX], [_]) +-m4trace:configure.ac:3484: -1- GMP_DEFINE([GSYM_PREFIX], []) +-m4trace:configure.ac:3484: -1- GMP_DEFINE([GSYM_PREFIX], []) +-m4trace:configure.ac:3485: -1- GMP_ASM_RODATA +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3486: -1- GMP_ASM_TYPE +-m4trace:configure.ac:3486: -1- GMP_TRY_ASSEMBLE([ .type sym,${gmp_tmp_prefix}function], [if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_type=".type \$1,${gmp_tmp_prefix}\$2" +- break +- fi]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3487: -1- GMP_ASM_SIZE +-m4trace:configure.ac:3487: -1- GMP_TRY_ASSEMBLE([ .size sym,1], [if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; +- else +- gmp_cv_asm_size=".size \$1,\$2" +- fi]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3488: -1- GMP_ASM_LSYM_PREFIX +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +-dummy${gmp_cv_asm_label_suffix} +-${gmp_tmp_pre}gurkmacka${gmp_cv_asm_label_suffix}], [if $NM conftest.$OBJEXT >conftest.nm 2>&AC_FD_CC; then : ; else +- cat conftest.nm >&AC_FD_CC +- AC_MSG_WARN(["$NM" failure]) +- break +- fi +- cat conftest.nm >&AC_FD_CC +- if grep gurkmacka conftest.nm >/dev/null; then : ; else +- # no mention of the symbol, this is good +- echo "$gmp_tmp_pre label doesn't appear in object file at all (good)" >&AC_FD_CC +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- gmp_tmp_pre_appears=no +- break +- fi +- if grep [' [a-zN] .*gurkmacka'] conftest.nm >/dev/null; then +- # symbol mentioned as a local, use this if nothing better +- echo "$gmp_tmp_pre label is local but still in object file" >&AC_FD_CC +- if test -z "$gmp_cv_asm_lsym_prefix"; then +- gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" +- fi +- else +- echo "$gmp_tmp_pre label is something unknown" >&AC_FD_CC +- fi +- ]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- m4_pattern_allow([^LSYM_PREFIX$]) +-m4trace:configure.ac:3489: -1- GMP_ASM_W32 +-m4trace:configure.ac:3489: -1- GMP_ASM_BYTE +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_data +- $i 0 +-], [gmp_cv_asm_byte=$i +- rm -f conftest* +- break], [cat conftest.out >&AC_FD_CC]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_data +- $gmp_cv_asm_globl foo +- $gmp_tmp_op 0 +-foo$gmp_cv_asm_label_suffix +- $gmp_cv_asm_byte 0], [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`] +- if test "$gmp_tmp_val" = 4; then +- gmp_cv_asm_w32="$gmp_tmp_op" +- break +- fi]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3490: -1- GMP_ASM_ALIGN_LOG +-m4trace:configure.ac:3490: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_data +- .align 4 +- $gmp_cv_asm_globl foo +- $gmp_cv_asm_byte 1 +- .align 4 +-foo$gmp_cv_asm_label_suffix +- $gmp_cv_asm_byte 2], [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \ +- sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`] +- if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then +- gmp_cv_asm_align_log=yes +- else +- gmp_cv_asm_align_log=no +- fi], [AC_MSG_ERROR([cannot assemble alignment test])]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_align_log>)"]) +-m4trace:configure.ac:3495: -1- GMP_INCLUDE_MPN([pa32/pa-defs.m4]) +-m4trace:configure.ac:3498: -1- GMP_ASM_IA64_ALIGN_OK +-m4trace:configure.ac:3498: -1- GMP_TRY_ASSEMBLE([ .text +- .align 32 +-{ .mmi; add r14 = r15, r16 +- add r17 = r18, r19 +- add r20 = r21, r22 ;; } +- .align 32 +-{ .mmi; add r23 = r24, r25 +- add r26 = r27, r28 +- add r29 = r30, r31 ;; } +-], [gmp_cv_asm_ia64_align_ok=`od -b conftest.$OBJEXT | $AWK -f conftest.awk`], [AC_MSG_WARN([oops, cannot compile test program]) +- gmp_cv_asm_ia64_align_ok=yes]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- GMP_DEFINE_RAW(["define(, <\`$gmp_cv_asm_ia64_align_ok'>)"]) +-m4trace:configure.ac:3501: -1- GMP_ASM_M68K_INSTRUCTION +-m4trace:configure.ac:3501: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- $i], [gmp_cv_asm_m68k_instruction=$i +- rm -f conftest* +- break]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- GMP_DEFINE_RAW(["define(, <\`$want_register_percent'>)"]) +-m4trace:configure.ac:3501: -1- GMP_DEFINE_RAW(["define(, <\`$want_dot_size'>)"]) +-m4trace:configure.ac:3502: -1- GMP_ASM_M68K_ADDRESSING +-m4trace:configure.ac:3502: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- $movel $dreg, $areg@-], [gmp_cv_asm_m68k_addressing=mit], [GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- $movel $dreg, -($areg)], +- [gmp_cv_asm_m68k_addressing=motorola], +-[AC_MSG_ERROR([cannot determine assembler addressing style])])]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- $movel $dreg, -($areg)], [gmp_cv_asm_m68k_addressing=motorola], [AC_MSG_ERROR([cannot determine assembler addressing style])]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- GMP_DEFINE_RAW(["define(, <\`$gmp_cv_asm_m68k_addressing'>)"]) +-m4trace:configure.ac:3503: -1- GMP_ASM_M68K_BRANCHES +-m4trace:configure.ac:3503: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +-foo$gmp_cv_asm_label_suffix +- $i foo], [gmp_cv_asm_m68k_branches=$i +- rm -f conftest* +- break]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- GMP_DEFINE_RAW(["define(, <\`$gmp_cv_asm_m68k_branches'>)"]) +-m4trace:configure.ac:3506: -1- GMP_ASM_POWERPC_PIC_ALWAYS +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_powerpc_pic>)"]) +-m4trace:configure.ac:3507: -1- GMP_ASM_POWERPC_R_REGISTERS +-m4trace:configure.ac:3507: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- mtctr 6], [gmp_cv_asm_powerpc_r_registers=no], [GMP_TRY_ASSEMBLE( +-[ $gmp_cv_asm_text +- mtctr r6], +-[gmp_cv_asm_powerpc_r_registers=yes], +-[AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])])]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- mtctr r6], [gmp_cv_asm_powerpc_r_registers=yes], [AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_powerpc_r_registers>)"]) +-m4trace:configure.ac:3508: -1- GMP_INCLUDE_MPN([powerpc32/powerpc-defs.m4]) +-m4trace:configure.ac:3511: -1- GMP_DEFINE_RAW(["define()"]) +-m4trace:configure.ac:3520: -1- GMP_INCLUDE_MPN([powerpc64/aix.m4]) +-m4trace:configure.ac:3521: -1- GMP_INCLUDE_MPN([powerpc32/aix.m4]) +-m4trace:configure.ac:3526: -1- GMP_INCLUDE_MPN([powerpc64/elf.m4]) +-m4trace:configure.ac:3527: -1- GMP_INCLUDE_MPN([powerpc32/elf.m4]) +-m4trace:configure.ac:3532: -1- GMP_INCLUDE_MPN([powerpc64/darwin.m4]) +-m4trace:configure.ac:3533: -1- GMP_INCLUDE_MPN([powerpc32/darwin.m4]) +-m4trace:configure.ac:3538: -1- GMP_INCLUDE_MPN([powerpc32/eabi.m4]) +-m4trace:configure.ac:3543: -1- GMP_INCLUDE_MPN([powerpc32/aix.m4]) +-m4trace:configure.ac:3548: -1- GMP_ASM_SPARC_REGISTER +-m4trace:configure.ac:3548: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- .register %g2,#scratch +-], [gmp_cv_asm_sparc_register=yes], [gmp_cv_asm_sparc_register=no]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_sparc_register>)"]) +-m4trace:configure.ac:3551: -1- GMP_ASM_SPARC_GOTDATA +-m4trace:configure.ac:3551: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- .text +- sethi %gdop_hix22(symbol), %g1 +- or %g1, %gdop_lox10(symbol), %g1 +-], [gmp_cv_asm_sparc_gotdata=yes], [gmp_cv_asm_sparc_gotdata=no]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_sparc_gotdata>)"]) +-m4trace:configure.ac:3552: -1- GMP_ASM_SPARC_SHARED_THUNKS +-m4trace:configure.ac:3552: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- .section .text.__sparc_get_pc_thunk.l7,"axG",@progbits,__sparc_get_pc_thunk.l7,comdat +- .weak __sparc_get_pc_thunk.l7 +- .hidden __sparc_get_pc_thunk.l7 +- .type __sparc_get_pc_thunk.l7, #function +-__sparc_get_pc_thunk.l7: +- jmp %o7+8 +- add %o7, %l7, %l7 +-], [gmp_cv_asm_sparc_shared_thunks=yes], [gmp_cv_asm_sparc_shared_thunks=no]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_sparc_shared_thunks>)"]) +-m4trace:configure.ac:3555: -1- GMP_ASM_ALIGN_FILL_0x90 +-m4trace:configure.ac:3555: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- .align 4, 0x90 +- .byte 0 +- .align 4, 0x90], [if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then +- echo "Suppressing this warning by omitting 0x90" 1>&AC_FD_CC +- gmp_cv_asm_align_fill_0x90=no +-else +- gmp_cv_asm_align_fill_0x90=yes +-fi], [gmp_cv_asm_align_fill_0x90=no]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- GMP_DEFINE_RAW(["define(,<$gmp_cv_asm_align_fill_0x90>)"]) +-m4trace:configure.ac:3558: -1- GMP_INCLUDE_MPN([x86/x86-defs.m4]) +-m4trace:configure.ac:3559: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_x86$]) +-m4trace:configure.ac:3560: -1- GMP_ASM_COFF_TYPE +-m4trace:configure.ac:3560: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- $gmp_cv_asm_globl ${tmp_gsym_prefix}foo$gmp_cv_asm_globl_attr +- .def ${tmp_gsym_prefix}foo +- .scl 2 +- .type 32 +- .endef +-${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix +-], [gmp_cv_asm_x86_coff_type=yes], [gmp_cv_asm_x86_coff_type=no]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3561: -1- GMP_ASM_X86_GOT_UNDERSCORE +-m4trace:configure.ac:3561: -1- AC_LIBTOOL_PROG_COMPILER_PIC +-m4trace:configure.ac:3561: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2343: GMP_ASM_X86_GOT_UNDERSCORE is expanded from... +-configure.ac:3561: the top level]) +-m4trace:configure.ac:3561: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2343: GMP_ASM_X86_GOT_UNDERSCORE is expanded from... +-configure.ac:3561: the top level]) +-m4trace:configure.ac:3561: -1- GMP_DEFINE([GOT_GSYM_PREFIX], [_]) +-m4trace:configure.ac:3561: -1- GMP_DEFINE([GOT_GSYM_PREFIX], []) +-m4trace:configure.ac:3562: -1- GMP_ASM_X86_SHLDL_CL +-m4trace:configure.ac:3562: -1- GMP_TRY_ASSEMBLE([ $gmp_cv_asm_text +- shldl %cl, %eax, %ebx], [gmp_cv_asm_x86_shldl_cl=yes], [gmp_cv_asm_x86_shldl_cl=no]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- GMP_DEFINE([WANT_SHLDL_CL], [1]) +-m4trace:configure.ac:3562: -1- GMP_DEFINE([WANT_SHLDL_CL], [0]) +-m4trace:configure.ac:3564: -1- GMP_ASM_X86_MCOUNT +-m4trace:configure.ac:3564: -1- AC_ENABLE_SHARED +-m4trace:configure.ac:3564: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2734: GMP_ASM_X86_MCOUNT is expanded from... +-configure.ac:3564: the top level]) +-m4trace:configure.ac:3564: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2734: GMP_ASM_X86_MCOUNT is expanded from... +-configure.ac:3564: the top level]) +-m4trace:configure.ac:3564: -1- GMP_DEFINE_RAW(["define(, <\`$mcount_nonpic_reg'>)"]) +-m4trace:configure.ac:3564: -1- GMP_DEFINE_RAW(["define(,<\`$mcount_nonpic_call'>)"]) +-m4trace:configure.ac:3564: -1- GMP_DEFINE_RAW(["define(, <\`$mcount_pic_reg'>)"]) +-m4trace:configure.ac:3564: -1- GMP_DEFINE_RAW(["define(, <\`$mcount_pic_call'>)"]) +-m4trace:configure.ac:3568: -1- GMP_INCLUDE_MPN([x86/darwin.m4]) +-m4trace:configure.ac:3572: -1- GMP_INCLUDE_MPN([x86_64/x86_64-defs.m4]) +-m4trace:configure.ac:3573: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_x86_64$]) +-m4trace:configure.ac:3576: -1- GMP_INCLUDE_MPN([x86_64/darwin.m4]) +-m4trace:configure.ac:3578: -1- GMP_INCLUDE_MPN([x86_64/dos64.m4]) +-m4trace:configure.ac:3580: -1- GMP_DEFINE_RAW(["define(,1)"]) +-m4trace:configure.ac:3618: -1- m4_pattern_allow([^GMP_MPARAM_H_SUGGEST$]) +-m4trace:configure.ac:3630: -1- GMP_DEFINE_RAW(["define(<$i>,<$value>)"]) +-m4trace:configure.ac:3643: -1- m4_pattern_allow([^SIZEOF_VOID_P$]) +-m4trace:configure.ac:3644: -1- m4_pattern_allow([^SIZEOF_UNSIGNED_SHORT$]) +-m4trace:configure.ac:3645: -1- m4_pattern_allow([^SIZEOF_UNSIGNED$]) +-m4trace:configure.ac:3646: -1- m4_pattern_allow([^SIZEOF_UNSIGNED_LONG$]) +-m4trace:configure.ac:3647: -1- m4_pattern_allow([^SIZEOF_MP_LIMB_T$]) +-m4trace:configure.ac:3651: -1- m4_pattern_allow([^GMP_LIMB_BITS$]) +-m4trace:configure.ac:3652: -1- GMP_DEFINE_RAW(["define(,<$ac_cv_sizeof_unsigned>)"]) +-m4trace:configure.ac:3674: -1- GMP_DEFINE_RAW(["define(,$GMP_LIMB_BITS)"]) +-m4trace:configure.ac:3675: -1- GMP_DEFINE_RAW(["define(,$GMP_NAIL_BITS)"]) +-m4trace:configure.ac:3676: -1- GMP_DEFINE_RAW(["define(,eval(GMP_LIMB_BITS-GMP_NAIL_BITS))"]) +-m4trace:configure.ac:3679: -1- m4_pattern_allow([^mpn_objects$]) +-m4trace:configure.ac:3680: -1- m4_pattern_allow([^mpn_objs_in_libgmp$]) +-m4trace:configure.ac:3681: -1- m4_pattern_allow([^gmp_srclinks$]) +-m4trace:configure.ac:3692: -1- m4_pattern_allow([^TUNE_SQR_TOOM2_MAX$]) +-m4trace:configure.ac:3702: -1- m4_pattern_allow([^TUNE_SQR_TOOM2_MAX$]) +-m4trace:configure.ac:3710: -1- m4_pattern_allow([^TUNE_SQR_OBJ$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([clock], [cputime], [getrusage], [gettimeofday], [sigaction], [sigaltstack], [sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_clock], [HAVE_CLOCK_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_CLOCK_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([cputime], [getrusage], [gettimeofday], [sigaction], [sigaltstack], [sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_cputime], [HAVE_CPUTIME_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_CPUTIME_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([getrusage], [gettimeofday], [sigaction], [sigaltstack], [sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_getrusage], [HAVE_GETRUSAGE_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_GETRUSAGE_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([gettimeofday], [sigaction], [sigaltstack], [sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_gettimeofday], [HAVE_GETTIMEOFDAY_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_GETTIMEOFDAY_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([sigaction], [sigaltstack], [sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_sigaction], [HAVE_SIGACTION_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_SIGACTION_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([sigaltstack], [sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_sigaltstack], [HAVE_SIGALTSTACK_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_SIGALTSTACK_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([sigstack]) +-m4trace:configure.ac:3716: -1- _GMP_SUBST_CHECK_FUNCS([ac_cv_func_sigstack], [HAVE_SIGSTACK_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_SIGSTACK_01$]) +-m4trace:configure.ac:3716: -1- GMP_SUBST_CHECK_FUNCS([]) +-m4trace:configure.ac:3717: -1- GMP_SUBST_CHECK_HEADERS([sys/resource.h]) +-m4trace:configure.ac:3717: -1- _GMP_SUBST_CHECK_HEADERS([ac_cv_header_sys_resource_h], [HAVE_SYS_RESOURCE_H_01]) +-m4trace:configure.ac:3717: -1- m4_pattern_allow([^HAVE_SYS_RESOURCE_H_01$]) +-m4trace:configure.ac:3717: -1- GMP_SUBST_CHECK_HEADERS([]) +-m4trace:configure.ac:3718: -1- m4_pattern_allow([^HAVE_STACK_T$]) +-m4trace:configure.ac:3720: -1- m4_pattern_allow([^HAVE_STACK_T_01$]) +-m4trace:configure.ac:3747: -1- m4_pattern_allow([^LIBCURSES$]) +-m4trace:configure.ac:3759: -1- m4_pattern_allow([^WITH_READLINE_01$]) +-m4trace:configure.ac:3760: -1- m4_pattern_allow([^LIBREADLINE$]) +-m4trace:configure.ac:3764: -1- m4_pattern_allow([^YACC$]) +-m4trace:configure.ac:3764: -1- m4_pattern_allow([^YACC$]) +-m4trace:configure.ac:3764: -1- m4_pattern_allow([^YFLAGS$]) +-m4trace:configure.ac:3765: -1- AM_PROG_LEX +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^LEX$]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^LEXLIB$]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^YYTEXT_POINTER$]) +-m4trace:configure.ac:3774: -1- m4_pattern_allow([^RANLIB$]) +-m4trace:configure.ac:3778: -1- GMP_FINISH +-m4trace:configure.ac:3784: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments. +-You should run autoupdate.], []) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^LTLIBOBJS$]) +-m4trace:configure.ac:3784: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +-m4trace:configure.ac:3784: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +-m4trace:configure.ac:3784: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +-m4trace:configure.ac:3784: -1- _AC_AM_CONFIG_HEADER_HOOK(["$ac_file"]) +-m4trace:configure.ac:3784: -1- _LT_PROG_LTMAIN +--- gcl-2.6.12.orig/gmp4/autom4te.cache/traces.1 ++++ /dev/null +@@ -1,3663 +0,0 @@ +-m4trace:aclocal.m4:9492: -1- m4_include([acinclude.m4]) +-m4trace:configure.ac:36: -1- AH_OUTPUT([00001], [/* +- +-Copyright 1996-2014 Free Software Foundation, Inc. +- +-This file is part of the GNU MP Library. +- +-The GNU MP Library is free software; you can redistribute it and/or modify +-it under the terms of either: +- +- * the GNU Lesser General Public License as published by the Free +- Software Foundation; either version 3 of the License, or (at your +- option) any later version. +- +-or +- +- * the GNU General Public License as published by the Free Software +- Foundation; either version 2 of the License, or (at your option) any +- later version. +- +-or both in parallel, as here. +- +-The GNU MP 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 General Public License +-for more details. +- +-You should have received copies of the GNU General Public License and the +-GNU Lesser General Public License along with the GNU MP Library. If not, +-see https://www.gnu.org/licenses/. +-*/]) +-m4trace:configure.ac:40: -1- AC_INIT([GNU MP], [6.0.0], [gmp-bugs@gmplib.org, see https://gmplib.org/manual/Reporting-Bugs.html], [gmp]) +-m4trace:configure.ac:40: -1- m4_pattern_forbid([^_?A[CHUM]_]) +-m4trace:configure.ac:40: -1- m4_pattern_forbid([_AC_]) +-m4trace:configure.ac:40: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^AS_FLAGS$]) +-m4trace:configure.ac:40: -1- m4_pattern_forbid([^_?m4_]) +-m4trace:configure.ac:40: -1- m4_pattern_forbid([^dnl$]) +-m4trace:configure.ac:40: -1- m4_pattern_forbid([^_?AS_]) +-m4trace:configure.ac:40: -1- AC_SUBST([SHELL]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([SHELL]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^SHELL$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PATH_SEPARATOR]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_NAME$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_STRING$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +-m4trace:configure.ac:40: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([PACKAGE_URL]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_URL$]) +-m4trace:configure.ac:40: -1- AC_SUBST([exec_prefix], [NONE]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([exec_prefix]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^exec_prefix$]) +-m4trace:configure.ac:40: -1- AC_SUBST([prefix], [NONE]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([prefix]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^prefix$]) +-m4trace:configure.ac:40: -1- AC_SUBST([program_transform_name], [s,x,x,]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([program_transform_name]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^program_transform_name$]) +-m4trace:configure.ac:40: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([bindir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^bindir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([sbindir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^sbindir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([libexecdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^libexecdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([datarootdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^datarootdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([datadir], ['${datarootdir}']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([datadir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^datadir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([sysconfdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^sysconfdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([sharedstatedir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^sharedstatedir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([localstatedir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^localstatedir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([includedir], ['${prefix}/include']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([includedir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^includedir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([oldincludedir], ['/usr/include']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([oldincludedir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^oldincludedir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], +- ['${datarootdir}/doc/${PACKAGE_TARNAME}'], +- ['${datarootdir}/doc/${PACKAGE}'])]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([docdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^docdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([infodir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^infodir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([htmldir], ['${docdir}']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([htmldir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^htmldir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([dvidir], ['${docdir}']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([dvidir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^dvidir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([pdfdir], ['${docdir}']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([pdfdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^pdfdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([psdir], ['${docdir}']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([psdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^psdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([libdir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^libdir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([localedir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^localedir$]) +-m4trace:configure.ac:40: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([mandir]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^mandir$]) +-m4trace:configure.ac:40: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_NAME$]) +-m4trace:configure.ac:40: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +-@%:@undef PACKAGE_NAME]) +-m4trace:configure.ac:40: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +-m4trace:configure.ac:40: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +-@%:@undef PACKAGE_TARNAME]) +-m4trace:configure.ac:40: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +-m4trace:configure.ac:40: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +-@%:@undef PACKAGE_VERSION]) +-m4trace:configure.ac:40: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_STRING$]) +-m4trace:configure.ac:40: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +-@%:@undef PACKAGE_STRING]) +-m4trace:configure.ac:40: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +-m4trace:configure.ac:40: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +-@%:@undef PACKAGE_BUGREPORT]) +-m4trace:configure.ac:40: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^PACKAGE_URL$]) +-m4trace:configure.ac:40: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +-@%:@undef PACKAGE_URL]) +-m4trace:configure.ac:40: -1- AC_SUBST([DEFS]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([DEFS]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^DEFS$]) +-m4trace:configure.ac:40: -1- AC_SUBST([ECHO_C]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([ECHO_C]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^ECHO_C$]) +-m4trace:configure.ac:40: -1- AC_SUBST([ECHO_N]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([ECHO_N]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^ECHO_N$]) +-m4trace:configure.ac:40: -1- AC_SUBST([ECHO_T]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([ECHO_T]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^ECHO_T$]) +-m4trace:configure.ac:40: -1- AC_SUBST([LIBS]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([LIBS]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^LIBS$]) +-m4trace:configure.ac:40: -1- AC_SUBST([build_alias]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([build_alias]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^build_alias$]) +-m4trace:configure.ac:40: -1- AC_SUBST([host_alias]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([host_alias]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^host_alias$]) +-m4trace:configure.ac:40: -1- AC_SUBST([target_alias]) +-m4trace:configure.ac:40: -1- AC_SUBST_TRACE([target_alias]) +-m4trace:configure.ac:40: -1- m4_pattern_allow([^target_alias$]) +-m4trace:configure.ac:42: -1- m4_pattern_forbid([^[ \t]*GMP_]) +-m4trace:configure.ac:43: -1- m4_pattern_allow([GMP_LDFLAGS]) +-m4trace:configure.ac:44: -1- m4_pattern_allow([GMP_LIMB_BITS]) +-m4trace:configure.ac:45: -1- m4_pattern_allow([GMP_MPARAM_H_SUGGEST]) +-m4trace:configure.ac:46: -1- m4_pattern_allow([GMP_NAIL_BITS]) +-m4trace:configure.ac:47: -1- m4_pattern_allow([GMP_NUMB_BITS]) +-m4trace:configure.ac:48: -1- m4_pattern_allow([GMP_NONSTD_ABI]) +-m4trace:configure.ac:49: -1- m4_pattern_allow([GMP_CPU_TYPE]) +-m4trace:configure.ac:65: -1- AC_CANONICAL_HOST +-m4trace:configure.ac:65: -1- AC_CANONICAL_BUILD +-m4trace:configure.ac:65: -1- AC_REQUIRE_AUX_FILE([config.sub]) +-m4trace:configure.ac:65: -1- AC_REQUIRE_AUX_FILE([config.guess]) +-m4trace:configure.ac:65: -1- AC_SUBST([build], [$ac_cv_build]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([build]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^build$]) +-m4trace:configure.ac:65: -1- AC_SUBST([build_cpu], [$[1]]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([build_cpu]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^build_cpu$]) +-m4trace:configure.ac:65: -1- AC_SUBST([build_vendor], [$[2]]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([build_vendor]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^build_vendor$]) +-m4trace:configure.ac:65: -1- AC_SUBST([build_os]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([build_os]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^build_os$]) +-m4trace:configure.ac:65: -1- AC_SUBST([host], [$ac_cv_host]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([host]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^host$]) +-m4trace:configure.ac:65: -1- AC_SUBST([host_cpu], [$[1]]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([host_cpu]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^host_cpu$]) +-m4trace:configure.ac:65: -1- AC_SUBST([host_vendor], [$[2]]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([host_vendor]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^host_vendor$]) +-m4trace:configure.ac:65: -1- AC_SUBST([host_os]) +-m4trace:configure.ac:65: -1- AC_SUBST_TRACE([host_os]) +-m4trace:configure.ac:65: -1- m4_pattern_allow([^host_os$]) +-m4trace:configure.ac:80: -1- AM_INIT_AUTOMAKE([1.8 gnu no-dependencies]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +-m4trace:configure.ac:80: -1- AM_AUTOMAKE_VERSION([1.14.1]) +-m4trace:configure.ac:80: -1- AC_REQUIRE_AUX_FILE([install-sh]) +-m4trace:configure.ac:80: -1- AC_SUBST([INSTALL_PROGRAM]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +-m4trace:configure.ac:80: -1- AC_SUBST([INSTALL_SCRIPT]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +-m4trace:configure.ac:80: -1- AC_SUBST([INSTALL_DATA]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([INSTALL_DATA]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^INSTALL_DATA$]) +-m4trace:configure.ac:80: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([am__isrc]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^am__isrc$]) +-m4trace:configure.ac:80: -1- _AM_SUBST_NOTMAKE([am__isrc]) +-m4trace:configure.ac:80: -1- AC_SUBST([CYGPATH_W]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([CYGPATH_W]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^CYGPATH_W$]) +-m4trace:configure.ac:80: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([PACKAGE]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^PACKAGE$]) +-m4trace:configure.ac:80: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([VERSION]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^VERSION$]) +-m4trace:configure.ac:80: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^PACKAGE$]) +-m4trace:configure.ac:80: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +-@%:@undef PACKAGE]) +-m4trace:configure.ac:80: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^VERSION$]) +-m4trace:configure.ac:80: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +-@%:@undef VERSION]) +-m4trace:configure.ac:80: -1- AC_REQUIRE_AUX_FILE([missing]) +-m4trace:configure.ac:80: -1- AC_SUBST([ACLOCAL]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([ACLOCAL]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^ACLOCAL$]) +-m4trace:configure.ac:80: -1- AC_SUBST([AUTOCONF]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AUTOCONF]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AUTOCONF$]) +-m4trace:configure.ac:80: -1- AC_SUBST([AUTOMAKE]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AUTOMAKE]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AUTOMAKE$]) +-m4trace:configure.ac:80: -1- AC_SUBST([AUTOHEADER]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AUTOHEADER]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AUTOHEADER$]) +-m4trace:configure.ac:80: -1- AC_SUBST([MAKEINFO]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([MAKEINFO]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^MAKEINFO$]) +-m4trace:configure.ac:80: -1- AC_SUBST([install_sh]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([install_sh]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^install_sh$]) +-m4trace:configure.ac:80: -1- AC_SUBST([STRIP]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([STRIP]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^STRIP$]) +-m4trace:configure.ac:80: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +-m4trace:configure.ac:80: -1- AC_REQUIRE_AUX_FILE([install-sh]) +-m4trace:configure.ac:80: -1- AC_SUBST([MKDIR_P]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([MKDIR_P]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^MKDIR_P$]) +-m4trace:configure.ac:80: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([mkdir_p]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^mkdir_p$]) +-m4trace:configure.ac:80: -1- AC_SUBST([AWK]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AWK]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AWK$]) +-m4trace:configure.ac:80: -1- AC_SUBST([SET_MAKE]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([SET_MAKE]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^SET_MAKE$]) +-m4trace:configure.ac:80: -1- AC_SUBST([am__leading_dot]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([am__leading_dot]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^am__leading_dot$]) +-m4trace:configure.ac:80: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AMTAR]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AMTAR$]) +-m4trace:configure.ac:80: -1- AC_SUBST([am__tar]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([am__tar]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^am__tar$]) +-m4trace:configure.ac:80: -1- AC_SUBST([am__untar]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([am__untar]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^am__untar$]) +-m4trace:configure.ac:80: -1- AM_SILENT_RULES +-m4trace:configure.ac:80: -1- AC_SUBST([AM_V]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AM_V]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AM_V$]) +-m4trace:configure.ac:80: -1- _AM_SUBST_NOTMAKE([AM_V]) +-m4trace:configure.ac:80: -1- AC_SUBST([AM_DEFAULT_V]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AM_DEFAULT_V$]) +-m4trace:configure.ac:80: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) +-m4trace:configure.ac:80: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) +-m4trace:configure.ac:80: -1- AC_SUBST([AM_BACKSLASH]) +-m4trace:configure.ac:80: -1- AC_SUBST_TRACE([AM_BACKSLASH]) +-m4trace:configure.ac:80: -1- m4_pattern_allow([^AM_BACKSLASH$]) +-m4trace:configure.ac:80: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) +-m4trace:configure.ac:81: -1- AC_CONFIG_HEADERS([config.h:config.in]) +-m4trace:configure.ac:82: -1- AM_MAINTAINER_MODE +-m4trace:configure.ac:82: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) +-m4trace:configure.ac:82: -1- AC_SUBST([MAINTAINER_MODE_TRUE]) +-m4trace:configure.ac:82: -1- AC_SUBST_TRACE([MAINTAINER_MODE_TRUE]) +-m4trace:configure.ac:82: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$]) +-m4trace:configure.ac:82: -1- AC_SUBST([MAINTAINER_MODE_FALSE]) +-m4trace:configure.ac:82: -1- AC_SUBST_TRACE([MAINTAINER_MODE_FALSE]) +-m4trace:configure.ac:82: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$]) +-m4trace:configure.ac:82: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE]) +-m4trace:configure.ac:82: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE]) +-m4trace:configure.ac:82: -1- AC_SUBST([MAINT]) +-m4trace:configure.ac:82: -1- AC_SUBST_TRACE([MAINT]) +-m4trace:configure.ac:82: -1- m4_pattern_allow([^MAINT$]) +-m4trace:configure.ac:86: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:86: the top level]) +-m4trace:configure.ac:94: -1- AC_DEFINE_TRACE_LITERAL([WANT_ASSERT]) +-m4trace:configure.ac:94: -1- m4_pattern_allow([^WANT_ASSERT$]) +-m4trace:configure.ac:94: -1- AH_OUTPUT([WANT_ASSERT], [/* Define to 1 to enable ASSERT checking, per --enable-assert */ +-@%:@undef WANT_ASSERT]) +-m4trace:configure.ac:104: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:104: the top level]) +-m4trace:configure.ac:129: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:129: the top level]) +-m4trace:configure.ac:138: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:138: the top level]) +-m4trace:configure.ac:146: -1- AC_DEFINE_TRACE_LITERAL([WANT_ASSEMBLY]) +-m4trace:configure.ac:146: -1- m4_pattern_allow([^WANT_ASSEMBLY$]) +-m4trace:configure.ac:146: -1- AH_OUTPUT([WANT_ASSEMBLY], [/* Defined to 1 as per --enable-assembly */ +-@%:@undef WANT_ASSEMBLY]) +-m4trace:configure.ac:152: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:152: the top level]) +-m4trace:configure.ac:160: -1- AC_DEFINE_TRACE_LITERAL([WANT_FFT]) +-m4trace:configure.ac:160: -1- m4_pattern_allow([^WANT_FFT$]) +-m4trace:configure.ac:160: -1- AH_OUTPUT([WANT_FFT], [/* Define to 1 to enable FFTs for multiplication, per --enable-fft */ +-@%:@undef WANT_FFT]) +-m4trace:configure.ac:166: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:166: the top level]) +-m4trace:configure.ac:174: -1- AC_DEFINE_TRACE_LITERAL([WANT_OLD_FFT_FULL]) +-m4trace:configure.ac:174: -1- m4_pattern_allow([^WANT_OLD_FFT_FULL$]) +-m4trace:configure.ac:174: -1- AH_OUTPUT([WANT_OLD_FFT_FULL], [/* Define to 1 to enable old mpn_mul_fft_full for multiplication, per +- --enable-old-fft-full */ +-@%:@undef WANT_OLD_FFT_FULL]) +-m4trace:configure.ac:180: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:180: the top level]) +-m4trace:configure.ac:195: -1- AC_SUBST([GMP_NAIL_BITS]) +-m4trace:configure.ac:195: -1- AC_SUBST_TRACE([GMP_NAIL_BITS]) +-m4trace:configure.ac:195: -1- m4_pattern_allow([^GMP_NAIL_BITS$]) +-m4trace:configure.ac:199: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:199: the top level]) +-m4trace:configure.ac:209: -1- AC_DEFINE_TRACE_LITERAL([WANT_PROFILING_PROF]) +-m4trace:configure.ac:209: -1- m4_pattern_allow([^WANT_PROFILING_PROF$]) +-m4trace:configure.ac:209: -1- AH_OUTPUT([WANT_PROFILING_PROF], [/* Define to 1 if --enable-profiling=prof */ +-@%:@undef WANT_PROFILING_PROF]) +-m4trace:configure.ac:213: -1- AC_DEFINE_TRACE_LITERAL([WANT_PROFILING_GPROF]) +-m4trace:configure.ac:213: -1- m4_pattern_allow([^WANT_PROFILING_GPROF$]) +-m4trace:configure.ac:213: -1- AH_OUTPUT([WANT_PROFILING_GPROF], [/* Define to 1 if --enable-profiling=gprof */ +-@%:@undef WANT_PROFILING_GPROF]) +-m4trace:configure.ac:217: -1- AC_DEFINE_TRACE_LITERAL([WANT_PROFILING_INSTRUMENT]) +-m4trace:configure.ac:217: -1- m4_pattern_allow([^WANT_PROFILING_INSTRUMENT$]) +-m4trace:configure.ac:217: -1- AH_OUTPUT([WANT_PROFILING_INSTRUMENT], [/* Define to 1 if --enable-profiling=instrument */ +-@%:@undef WANT_PROFILING_INSTRUMENT]) +-m4trace:configure.ac:233: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:233: the top level]) +-m4trace:configure.ac:243: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:243: the top level]) +-m4trace:configure.ac:253: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:253: the top level]) +-m4trace:configure.ac:263: -2- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +-configure.ac:263: the top level]) +-m4trace:configure.ac:271: -1- AC_DEFINE_TRACE_LITERAL([WANT_FAKE_CPUID]) +-m4trace:configure.ac:271: -1- m4_pattern_allow([^WANT_FAKE_CPUID$]) +-m4trace:configure.ac:271: -1- AH_OUTPUT([WANT_FAKE_CPUID], [/* Define to 1 to enable GMP_CPU_TYPE faking cpuid, per --enable-fake-cpuid */ +-@%:@undef WANT_FAKE_CPUID]) +-m4trace:configure.ac:295: -1- AH_OUTPUT([HAVE_HOST_CPU_1], [/* Define one of these to 1 for the host CPU family. +- If your CPU is not in any of these families, leave all undefined. +- For an AMD64 chip, define "x86" in ABI=32, but not in ABI=64. */ +-#undef HAVE_HOST_CPU_FAMILY_alpha +-#undef HAVE_HOST_CPU_FAMILY_m68k +-#undef HAVE_HOST_CPU_FAMILY_power +-#undef HAVE_HOST_CPU_FAMILY_powerpc +-#undef HAVE_HOST_CPU_FAMILY_x86 +-#undef HAVE_HOST_CPU_FAMILY_x86_64 +- +-/* Define one of the following to 1 for the host CPU, as per the output of +- ./config.guess. If your CPU is not listed here, leave all undefined. */ +-#undef HAVE_HOST_CPU_alphaev67 +-#undef HAVE_HOST_CPU_alphaev68 +-#undef HAVE_HOST_CPU_alphaev7 +-#undef HAVE_HOST_CPU_m68020 +-#undef HAVE_HOST_CPU_m68030 +-#undef HAVE_HOST_CPU_m68040 +-#undef HAVE_HOST_CPU_m68060 +-#undef HAVE_HOST_CPU_m68360 +-#undef HAVE_HOST_CPU_powerpc604 +-#undef HAVE_HOST_CPU_powerpc604e +-#undef HAVE_HOST_CPU_powerpc750 +-#undef HAVE_HOST_CPU_powerpc7400 +-#undef HAVE_HOST_CPU_supersparc +-#undef HAVE_HOST_CPU_i386 +-#undef HAVE_HOST_CPU_i586 +-#undef HAVE_HOST_CPU_i686 +-#undef HAVE_HOST_CPU_pentium +-#undef HAVE_HOST_CPU_pentiummmx +-#undef HAVE_HOST_CPU_pentiumpro +-#undef HAVE_HOST_CPU_pentium2 +-#undef HAVE_HOST_CPU_pentium3 +-#undef HAVE_HOST_CPU_s390_z900 +-#undef HAVE_HOST_CPU_s390_z990 +-#undef HAVE_HOST_CPU_s390_z9 +-#undef HAVE_HOST_CPU_s390_z10 +-#undef HAVE_HOST_CPU_s390_z196 +- +-/* Define to 1 iff we have a s390 with 64-bit registers. */ +-#undef HAVE_HOST_CPU_s390_zarch]) +-m4trace:configure.ac:435: -1- AC_SUBST([ABI]) +-m4trace:configure.ac:435: -1- AC_SUBST_TRACE([ABI]) +-m4trace:configure.ac:435: -1- m4_pattern_allow([^ABI$]) +-m4trace:configure.ac:456: -1- AC_SUBST([HAVE_HOST_CPU_FAMILY_power], [0]) +-m4trace:configure.ac:456: -1- AC_SUBST_TRACE([HAVE_HOST_CPU_FAMILY_power]) +-m4trace:configure.ac:456: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_power$]) +-m4trace:configure.ac:457: -1- AC_SUBST([HAVE_HOST_CPU_FAMILY_powerpc], [0]) +-m4trace:configure.ac:457: -1- AC_SUBST_TRACE([HAVE_HOST_CPU_FAMILY_powerpc]) +-m4trace:configure.ac:457: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_powerpc$]) +-m4trace:configure.ac:462: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_FAMILY_alpha]) +-m4trace:configure.ac:462: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_alpha$]) +-m4trace:configure.ac:854: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_FAMILY_m68k]) +-m4trace:configure.ac:854: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_m68k$]) +-m4trace:configure.ac:959: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_FAMILY_powerpc]) +-m4trace:configure.ac:959: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_powerpc$]) +-m4trace:configure.ac:1183: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_FAMILY_power]) +-m4trace:configure.ac:1183: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_power$]) +-m4trace:configure.ac:1228: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_s390_zarch]) +-m4trace:configure.ac:1228: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1237: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_s390_zarch]) +-m4trace:configure.ac:1237: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1246: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_s390_zarch]) +-m4trace:configure.ac:1246: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1255: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_s390_zarch]) +-m4trace:configure.ac:1255: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1264: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_s390_zarch]) +-m4trace:configure.ac:1264: -1- m4_pattern_allow([^HAVE_HOST_CPU_s390_zarch$]) +-m4trace:configure.ac:1813: -1- AC_DEFINE_TRACE_LITERAL([HOST_DOS64]) +-m4trace:configure.ac:1813: -1- m4_pattern_allow([^HOST_DOS64$]) +-m4trace:configure.ac:1813: -1- AH_OUTPUT([HOST_DOS64], [/* Define to 1 for Windos/64 */ +-@%:@undef HOST_DOS64]) +-m4trace:configure.ac:1825: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me:${as_lineno-$LINENO}: WARNING: the \"none\" host is obsolete, use --disable-assembly], []) +-m4trace:configure.ac:1825: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me: WARNING: the \"none\" host is obsolete, use --disable-assembly], []) +-m4trace:configure.ac:1846: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-configure.ac:1846: the top level]) +-m4trace:configure.ac:1959: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:928: GMP_PROG_CC_IS_GNU is expanded from... +-configure.ac:1959: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2009: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2009: the top level]) +-m4trace:configure.ac:2016: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:851: GMP_PROG_CC_WORKS_LONGLONG is expanded from... +-configure.ac:2016: the top level]) +-m4trace:configure.ac:2016: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:851: GMP_PROG_CC_WORKS_LONGLONG is expanded from... +-configure.ac:2016: the top level]) +-m4trace:configure.ac:2016: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:851: GMP_PROG_CC_WORKS_LONGLONG is expanded from... +-configure.ac:2016: the top level]) +-m4trace:configure.ac:2028: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1025: GMP_HPC_HPPA_2_0 is expanded from... +-configure.ac:2028: the top level]) +-m4trace:configure.ac:2028: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1025: GMP_HPC_HPPA_2_0 is expanded from... +-configure.ac:2028: the top level]) +-m4trace:configure.ac:2029: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1066: GMP_GCC_ARM_UMODSI is expanded from... +-configure.ac:2029: the top level]) +-m4trace:configure.ac:2030: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1091: GMP_GCC_MIPS_O32 is expanded from... +-configure.ac:2030: the top level]) +-m4trace:configure.ac:2030: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1091: GMP_GCC_MIPS_O32 is expanded from... +-configure.ac:2030: the top level]) +-m4trace:configure.ac:2031: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1396: GMP_HPPA_LEVEL_20 is expanded from... +-configure.ac:2031: the top level]) +-m4trace:configure.ac:2031: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1396: GMP_HPPA_LEVEL_20 is expanded from... +-configure.ac:2031: the top level]) +-m4trace:configure.ac:2031: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1396: GMP_HPPA_LEVEL_20 is expanded from... +-configure.ac:2031: the top level]) +-m4trace:configure.ac:2032: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:891: GMP_C_TEST_SIZEOF is expanded from... +-configure.ac:2032: the top level]) +-m4trace:configure.ac:2032: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:891: GMP_C_TEST_SIZEOF is expanded from... +-configure.ac:2032: the top level]) +-m4trace:configure.ac:2151: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1298: GMP_OS_X86_XMM is expanded from... +-configure.ac:2151: the top level]) +-m4trace:configure.ac:2156: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1126: GMP_GCC_NO_CPP_PRECOMP is expanded from... +-configure.ac:2156: the top level]) +-m4trace:configure.ac:2164: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1186: GMP_GCC_WA_MCPU is expanded from... +-configure.ac:2164: the top level]) +-m4trace:configure.ac:2169: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1238: GMP_GCC_WA_OLDAS is expanded from... +-configure.ac:2169: the top level]) +-m4trace:configure.ac:2169: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1238: GMP_GCC_WA_OLDAS is expanded from... +-configure.ac:2169: the top level]) +-m4trace:configure.ac:2169: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1238: GMP_GCC_WA_OLDAS is expanded from... +-configure.ac:2169: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:785: GMP_PROG_CC_WORKS_PART is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:804: GMP_PROG_CC_WORKS_PART_TEST is expanded from... +-acinclude.m4:794: GMP_PROG_CC_WORKS_PART_MAIN is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2176: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2425: GMP_ASM_X86_GOT_EAX_OK is expanded from... +-acinclude.m4:995: GMP_PROG_CC_X86_GOT_EAX_EMITTED is expanded from... +-acinclude.m4:479: GMP_PROG_CC_WORKS is expanded from... +-configure.ac:2176: the top level]) +-m4trace:configure.ac:2200: -1- AC_SUBST([GMP_LDFLAGS]) +-m4trace:configure.ac:2200: -1- AC_SUBST_TRACE([GMP_LDFLAGS]) +-m4trace:configure.ac:2200: -1- m4_pattern_allow([^GMP_LDFLAGS$]) +-m4trace:configure.ac:2201: -1- AC_SUBST([LIBGMP_LDFLAGS]) +-m4trace:configure.ac:2201: -1- AC_SUBST_TRACE([LIBGMP_LDFLAGS]) +-m4trace:configure.ac:2201: -1- m4_pattern_allow([^LIBGMP_LDFLAGS$]) +-m4trace:configure.ac:2202: -1- AC_SUBST([LIBGMPXX_LDFLAGS]) +-m4trace:configure.ac:2202: -1- AC_SUBST_TRACE([LIBGMPXX_LDFLAGS]) +-m4trace:configure.ac:2202: -1- m4_pattern_allow([^LIBGMPXX_LDFLAGS$]) +-m4trace:configure.ac:2220: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SPEED_CYCLECOUNTER]) +-m4trace:configure.ac:2220: -1- m4_pattern_allow([^HAVE_SPEED_CYCLECOUNTER$]) +-m4trace:configure.ac:2220: -1- AH_OUTPUT([HAVE_SPEED_CYCLECOUNTER], [/* Tune directory speed_cyclecounter, undef=none, 1=32bits, 2=64bits) */ +-@%:@undef HAVE_SPEED_CYCLECOUNTER]) +-m4trace:configure.ac:2223: -1- AC_SUBST([SPEED_CYCLECOUNTER_OBJ]) +-m4trace:configure.ac:2223: -1- AC_SUBST_TRACE([SPEED_CYCLECOUNTER_OBJ]) +-m4trace:configure.ac:2223: -1- m4_pattern_allow([^SPEED_CYCLECOUNTER_OBJ$]) +-m4trace:configure.ac:2237: -1- AC_DEFINE_TRACE_LITERAL([HAVE_CALLING_CONVENTIONS]) +-m4trace:configure.ac:2237: -1- m4_pattern_allow([^HAVE_CALLING_CONVENTIONS$]) +-m4trace:configure.ac:2237: -1- AH_OUTPUT([HAVE_CALLING_CONVENTIONS], [/* Define to 1 if tests/libtests has calling conventions checking for the CPU +- */ +-@%:@undef HAVE_CALLING_CONVENTIONS]) +-m4trace:configure.ac:2240: -1- AC_SUBST([CALLING_CONVENTIONS_OBJS]) +-m4trace:configure.ac:2240: -1- AC_SUBST_TRACE([CALLING_CONVENTIONS_OBJS]) +-m4trace:configure.ac:2240: -1- m4_pattern_allow([^CALLING_CONVENTIONS_OBJS$]) +-m4trace:configure.ac:2262: -1- AC_SUBST([DEFN_LONG_LONG_LIMB]) +-m4trace:configure.ac:2262: -1- AC_SUBST_TRACE([DEFN_LONG_LONG_LIMB]) +-m4trace:configure.ac:2262: -1- m4_pattern_allow([^DEFN_LONG_LONG_LIMB$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CC]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CC]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CFLAGS]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CFLAGS]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CFLAGS$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([LDFLAGS]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([LDFLAGS]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^LDFLAGS$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([LIBS]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([LIBS]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^LIBS$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CPPFLAGS]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CPPFLAGS]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CC]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CC]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CC]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CC]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CC]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CC]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([CC]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([CC]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^CC$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([ac_ct_CC]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([ac_ct_CC]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^ac_ct_CC$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([EXEEXT]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^EXEEXT$]) +-m4trace:configure.ac:2266: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +-m4trace:configure.ac:2266: -1- AC_SUBST_TRACE([OBJEXT]) +-m4trace:configure.ac:2266: -1- m4_pattern_allow([^OBJEXT$]) +-m4trace:configure.ac:2266: -1- AC_REQUIRE_AUX_FILE([compile]) +-m4trace:configure.ac:2268: -1- AC_SUBST([CPP]) +-m4trace:configure.ac:2268: -1- AC_SUBST_TRACE([CPP]) +-m4trace:configure.ac:2268: -1- m4_pattern_allow([^CPP$]) +-m4trace:configure.ac:2268: -1- AC_SUBST([CPPFLAGS]) +-m4trace:configure.ac:2268: -1- AC_SUBST_TRACE([CPPFLAGS]) +-m4trace:configure.ac:2268: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2268: -1- AC_SUBST([CPP]) +-m4trace:configure.ac:2268: -1- AC_SUBST_TRACE([CPP]) +-m4trace:configure.ac:2268: -1- m4_pattern_allow([^CPP$]) +-m4trace:configure.ac:2272: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:3810: GMP_PROG_CC_FOR_BUILD_WORKS is expanded from... +-acinclude.m4:3778: GMP_PROG_CC_FOR_BUILD is expanded from... +-configure.ac:2272: the top level]) +-m4trace:configure.ac:2272: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:3810: GMP_PROG_CC_FOR_BUILD_WORKS is expanded from... +-acinclude.m4:3778: GMP_PROG_CC_FOR_BUILD is expanded from... +-configure.ac:2272: the top level]) +-m4trace:configure.ac:2272: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:3810: GMP_PROG_CC_FOR_BUILD_WORKS is expanded from... +-acinclude.m4:3778: GMP_PROG_CC_FOR_BUILD is expanded from... +-configure.ac:2272: the top level]) +-m4trace:configure.ac:2272: -1- AC_SUBST([CC_FOR_BUILD]) +-m4trace:configure.ac:2272: -1- AC_SUBST_TRACE([CC_FOR_BUILD]) +-m4trace:configure.ac:2272: -1- m4_pattern_allow([^CC_FOR_BUILD$]) +-m4trace:configure.ac:2272: -1- AC_SUBST([CC_FOR_BUILD]) +-m4trace:configure.ac:2272: -1- AC_SUBST_TRACE([CC_FOR_BUILD]) +-m4trace:configure.ac:2272: -1- m4_pattern_allow([^CC_FOR_BUILD$]) +-m4trace:configure.ac:2273: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-acinclude.m4:3844: GMP_PROG_CPP_FOR_BUILD is expanded from... +-configure.ac:2273: the top level]) +-m4trace:configure.ac:2273: -1- AC_SUBST([CPP_FOR_BUILD]) +-m4trace:configure.ac:2273: -1- AC_SUBST_TRACE([CPP_FOR_BUILD]) +-m4trace:configure.ac:2273: -1- m4_pattern_allow([^CPP_FOR_BUILD$]) +-m4trace:configure.ac:2273: -1- AC_SUBST([CPP_FOR_BUILD]) +-m4trace:configure.ac:2273: -1- AC_SUBST_TRACE([CPP_FOR_BUILD]) +-m4trace:configure.ac:2273: -1- m4_pattern_allow([^CPP_FOR_BUILD$]) +-m4trace:configure.ac:2274: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3884: GMP_PROG_EXEEXT_FOR_BUILD is expanded from... +-configure.ac:2274: the top level]) +-m4trace:configure.ac:2274: -1- AC_SUBST([EXEEXT_FOR_BUILD], [$gmp_cv_prog_exeext_for_build]) +-m4trace:configure.ac:2274: -1- AC_SUBST_TRACE([EXEEXT_FOR_BUILD]) +-m4trace:configure.ac:2274: -1- m4_pattern_allow([^EXEEXT_FOR_BUILD$]) +-m4trace:configure.ac:2275: -1- AC_SUBST([U_FOR_BUILD], [_]) +-m4trace:configure.ac:2275: -1- AC_SUBST_TRACE([U_FOR_BUILD]) +-m4trace:configure.ac:2275: -1- m4_pattern_allow([^U_FOR_BUILD$]) +-m4trace:configure.ac:2276: -1- AC_SUBST([LIBM_FOR_BUILD], [-lm]) +-m4trace:configure.ac:2276: -1- AC_SUBST_TRACE([LIBM_FOR_BUILD]) +-m4trace:configure.ac:2276: -1- m4_pattern_allow([^LIBM_FOR_BUILD$]) +-m4trace:configure.ac:2284: -1- AC_SUBST([CCAS]) +-m4trace:configure.ac:2284: -1- AC_SUBST_TRACE([CCAS]) +-m4trace:configure.ac:2284: -1- m4_pattern_allow([^CCAS$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([CXX]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([CXX]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CXX$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([CXXFLAGS]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([CXXFLAGS]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CXXFLAGS$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([LDFLAGS]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([LDFLAGS]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^LDFLAGS$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([LIBS]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([LIBS]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^LIBS$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([CPPFLAGS]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([CPPFLAGS]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([CXX]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([CXX]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^CXX$]) +-m4trace:configure.ac:2291: -1- AC_SUBST([ac_ct_CXX]) +-m4trace:configure.ac:2291: -1- AC_SUBST_TRACE([ac_ct_CXX]) +-m4trace:configure.ac:2291: -1- m4_pattern_allow([^ac_ct_CXX$]) +-m4trace:configure.ac:2293: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-configure.ac:2293: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2319: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1472: GMP_PROG_CXX_WORKS_PART is expanded from... +-acinclude.m4:1436: GMP_PROG_CXX_WORKS is expanded from... +-configure.ac:2319: the top level]) +-m4trace:configure.ac:2330: -1- AM_CONDITIONAL([WANT_CXX], [test $want_cxx = yes]) +-m4trace:configure.ac:2330: -1- AC_SUBST([WANT_CXX_TRUE]) +-m4trace:configure.ac:2330: -1- AC_SUBST_TRACE([WANT_CXX_TRUE]) +-m4trace:configure.ac:2330: -1- m4_pattern_allow([^WANT_CXX_TRUE$]) +-m4trace:configure.ac:2330: -1- AC_SUBST([WANT_CXX_FALSE]) +-m4trace:configure.ac:2330: -1- AC_SUBST_TRACE([WANT_CXX_FALSE]) +-m4trace:configure.ac:2330: -1- m4_pattern_allow([^WANT_CXX_FALSE$]) +-m4trace:configure.ac:2330: -1- _AM_SUBST_NOTMAKE([WANT_CXX_TRUE]) +-m4trace:configure.ac:2330: -1- _AM_SUBST_NOTMAKE([WANT_CXX_FALSE]) +-m4trace:configure.ac:2338: -1- AC_SUBST([CXXCPP]) +-m4trace:configure.ac:2338: -1- AC_SUBST_TRACE([CXXCPP]) +-m4trace:configure.ac:2338: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2338: -1- AC_SUBST([CPPFLAGS]) +-m4trace:configure.ac:2338: -1- AC_SUBST_TRACE([CPPFLAGS]) +-m4trace:configure.ac:2338: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2338: -1- AC_SUBST([CXXCPP]) +-m4trace:configure.ac:2338: -1- AC_SUBST_TRACE([CXXCPP]) +-m4trace:configure.ac:2338: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2345: -1- AC_SUBST([GREP]) +-m4trace:configure.ac:2345: -1- AC_SUBST_TRACE([GREP]) +-m4trace:configure.ac:2345: -1- m4_pattern_allow([^GREP$]) +-m4trace:configure.ac:2345: -1- AC_SUBST([EGREP]) +-m4trace:configure.ac:2345: -1- AC_SUBST_TRACE([EGREP]) +-m4trace:configure.ac:2345: -1- m4_pattern_allow([^EGREP$]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2389: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2515: GMP_ASM_X86_MMX is expanded from... +-configure.ac:2389: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2392: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2594: GMP_ASM_X86_SSE2 is expanded from... +-configure.ac:2392: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2396: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2631: GMP_ASM_X86_MULX is expanded from... +-configure.ac:2396: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2399: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2669: GMP_ASM_X86_ADX is expanded from... +-configure.ac:2399: the top level]) +-m4trace:configure.ac:2415: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-configure.ac:2415: the top level]) +-m4trace:configure.ac:2437: -1- AC_SUBST([ASMFLAGS]) +-m4trace:configure.ac:2437: -1- AC_SUBST_TRACE([ASMFLAGS]) +-m4trace:configure.ac:2437: -1- m4_pattern_allow([^ASMFLAGS$]) +-m4trace:configure.ac:2439: -1- AC_SUBST([AR]) +-m4trace:configure.ac:2439: -1- AC_SUBST_TRACE([AR]) +-m4trace:configure.ac:2439: -1- m4_pattern_allow([^AR$]) +-m4trace:configure.ac:2440: -1- _m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete. +-You should run autoupdate.], [aclocal.m4:3515: AC_PROG_NM is expanded from... +-acinclude.m4:422: GMP_PROG_NM is expanded from... +-configure.ac:2440: the top level]) +-m4trace:configure.ac:2440: -1- AC_SUBST([DUMPBIN]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([DUMPBIN]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- AC_SUBST([ac_ct_DUMPBIN]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +-m4trace:configure.ac:2440: -1- AC_SUBST([DUMPBIN]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([DUMPBIN]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- AC_SUBST([NM]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([NM]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^NM$]) +-m4trace:configure.ac:2440: -1- _m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete. +-You should run autoupdate.], [aclocal.m4:3515: AC_PROG_NM is expanded from... +-acinclude.m4:422: GMP_PROG_NM is expanded from... +-configure.ac:2440: the top level]) +-m4trace:configure.ac:2440: -1- AC_SUBST([DUMPBIN]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([DUMPBIN]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- AC_SUBST([ac_ct_DUMPBIN]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +-m4trace:configure.ac:2440: -1- AC_SUBST([DUMPBIN]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([DUMPBIN]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^DUMPBIN$]) +-m4trace:configure.ac:2440: -1- AC_SUBST([NM]) +-m4trace:configure.ac:2440: -1- AC_SUBST_TRACE([NM]) +-m4trace:configure.ac:2440: -1- m4_pattern_allow([^NM$]) +-m4trace:configure.ac:2461: -1- _m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +-You should run autoupdate.], [aclocal.m4:8141: AC_LIBTOOL_WIN32_DLL is expanded from... +-configure.ac:2461: the top level]) +-m4trace:configure.ac:2461: -1- AC_SUBST([AS]) +-m4trace:configure.ac:2461: -1- AC_SUBST_TRACE([AS]) +-m4trace:configure.ac:2461: -1- m4_pattern_allow([^AS$]) +-m4trace:configure.ac:2461: -1- AC_SUBST([DLLTOOL]) +-m4trace:configure.ac:2461: -1- AC_SUBST_TRACE([DLLTOOL]) +-m4trace:configure.ac:2461: -1- m4_pattern_allow([^DLLTOOL$]) +-m4trace:configure.ac:2461: -1- AC_SUBST([OBJDUMP]) +-m4trace:configure.ac:2461: -1- AC_SUBST_TRACE([OBJDUMP]) +-m4trace:configure.ac:2461: -1- m4_pattern_allow([^OBJDUMP$]) +-m4trace:configure.ac:2461: -1- _m4_warn([obsolete], [AC_LIBTOOL_WIN32_DLL: Remove this warning and the call to _LT_SET_OPTION when you +-put the `win32-dll' option into LT_INIT's first parameter.], [aclocal.m4:8141: AC_LIBTOOL_WIN32_DLL is expanded from... +-configure.ac:2461: the top level]) +-m4trace:configure.ac:2463: -1- AC_SUBST([LIBGMP_DLL], [0]) +-m4trace:configure.ac:2463: -1- AC_SUBST_TRACE([LIBGMP_DLL]) +-m4trace:configure.ac:2463: -1- m4_pattern_allow([^LIBGMP_DLL$]) +-m4trace:configure.ac:2551: -1- AC_PROG_LIBTOOL +-m4trace:configure.ac:2551: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +-You should run autoupdate.], [aclocal.m4:129: AC_PROG_LIBTOOL is expanded from... +-configure.ac:2551: the top level]) +-m4trace:configure.ac:2551: -1- LT_INIT +-m4trace:configure.ac:2551: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +-m4trace:configure.ac:2551: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) +-m4trace:configure.ac:2551: -1- AC_SUBST([LIBTOOL]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([LIBTOOL]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LIBTOOL$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([SED]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([SED]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^SED$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([FGREP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([FGREP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^FGREP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([GREP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([GREP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^GREP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([LD]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([LD]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LD$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([LN_S], [$as_ln_s]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([LN_S]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LN_S$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([OBJDUMP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([OBJDUMP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OBJDUMP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([OBJDUMP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([OBJDUMP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OBJDUMP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([DLLTOOL]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([DLLTOOL]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^DLLTOOL$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([DLLTOOL]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([DLLTOOL]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^DLLTOOL$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([AR]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([AR]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^AR$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([ac_ct_AR]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([ac_ct_AR]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^ac_ct_AR$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([STRIP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([STRIP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^STRIP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([RANLIB]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([RANLIB]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^RANLIB$]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([LT_OBJDIR]) +-m4trace:configure.ac:2551: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LT_OBJDIR$]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory in which libtool stores uninstalled libraries. +- */ +-@%:@undef LT_OBJDIR]) +-m4trace:configure.ac:2551: -1- LT_SUPPORTED_TAG([CC]) +-m4trace:configure.ac:2551: -1- AC_SUBST([MANIFEST_TOOL]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([MANIFEST_TOOL]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([DSYMUTIL]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([DSYMUTIL]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^DSYMUTIL$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([NMEDIT]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([NMEDIT]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^NMEDIT$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([LIPO]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([LIPO]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LIPO$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([OTOOL]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([OTOOL]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OTOOL$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([OTOOL64]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([OTOOL64]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^OTOOL64$]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_DLFCN_H]) +-m4trace:configure.ac:2551: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^STDC_HEADERS$]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +-@%:@undef STDC_HEADERS]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_TYPES_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_STAT_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_STDLIB_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_STRING_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_MEMORY_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_STRINGS_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_INTTYPES_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_STDINT_H]) +-m4trace:configure.ac:2551: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_UNISTD_H]) +-m4trace:configure.ac:2551: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +-m4trace:configure.ac:2551: -1- LT_SUPPORTED_TAG([CXX]) +-m4trace:configure.ac:2551: -1- AC_SUBST([CXXCPP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([CXXCPP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([CPPFLAGS]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([CPPFLAGS]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^CPPFLAGS$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([CXXCPP]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([CXXCPP]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^CXXCPP$]) +-m4trace:configure.ac:2551: -1- AC_SUBST([LD]) +-m4trace:configure.ac:2551: -1- AC_SUBST_TRACE([LD]) +-m4trace:configure.ac:2551: -1- m4_pattern_allow([^LD$]) +-m4trace:configure.ac:2565: -1- AM_CONDITIONAL([ENABLE_STATIC], [test "$enable_static" = yes]) +-m4trace:configure.ac:2565: -1- AC_SUBST([ENABLE_STATIC_TRUE]) +-m4trace:configure.ac:2565: -1- AC_SUBST_TRACE([ENABLE_STATIC_TRUE]) +-m4trace:configure.ac:2565: -1- m4_pattern_allow([^ENABLE_STATIC_TRUE$]) +-m4trace:configure.ac:2565: -1- AC_SUBST([ENABLE_STATIC_FALSE]) +-m4trace:configure.ac:2565: -1- AC_SUBST_TRACE([ENABLE_STATIC_FALSE]) +-m4trace:configure.ac:2565: -1- m4_pattern_allow([^ENABLE_STATIC_FALSE$]) +-m4trace:configure.ac:2565: -1- _AM_SUBST_NOTMAKE([ENABLE_STATIC_TRUE]) +-m4trace:configure.ac:2565: -1- _AM_SUBST_NOTMAKE([ENABLE_STATIC_FALSE]) +-m4trace:configure.ac:2571: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +-m4trace:configure.ac:2571: -1- m4_pattern_allow([^STDC_HEADERS$]) +-m4trace:configure.ac:2571: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +-@%:@undef STDC_HEADERS]) +-m4trace:configure.ac:2572: -1- AC_DEFINE_TRACE_LITERAL([TIME_WITH_SYS_TIME]) +-m4trace:configure.ac:2572: -1- m4_pattern_allow([^TIME_WITH_SYS_TIME$]) +-m4trace:configure.ac:2572: -1- AH_OUTPUT([TIME_WITH_SYS_TIME], [/* Define to 1 if you can safely include both and . */ +-@%:@undef TIME_WITH_SYS_TIME]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_FCNTL_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_FCNTL_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_FLOAT_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_FLOAT_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_INVENT_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_INVENT_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_LANGINFO_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_LANGINFO_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_LOCALE_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_LOCALE_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_NL_TYPES_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_NL_TYPES_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_ATTRIBUTES_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_ATTRIBUTES_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_IOGRAPH_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_IOGRAPH_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_MMAN_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_MMAN_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_PARAM_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_PARAM_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_PROCESSOR_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_PROCESSOR_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_PSTAT_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_PSTAT_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_SYSINFO_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_SYSINFO_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_SYSSGI_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_SYSSGI_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_SYSTEMCFG_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_SYSTEMCFG_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_TIME_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_TIME_H]) +-m4trace:configure.ac:2599: -1- AH_OUTPUT([HAVE_SYS_TIMES_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_TIMES_H]) +-m4trace:configure.ac:2602: -1- AH_OUTPUT([HAVE_SYS_RESOURCE_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_RESOURCE_H]) +-m4trace:configure.ac:2602: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_RESOURCE_H]) +-m4trace:configure.ac:2602: -1- m4_pattern_allow([^HAVE_SYS_RESOURCE_H$]) +-m4trace:configure.ac:2615: -1- AH_OUTPUT([HAVE_SYS_SYSCTL_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SYS_SYSCTL_H]) +-m4trace:configure.ac:2615: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_SYSCTL_H]) +-m4trace:configure.ac:2615: -1- m4_pattern_allow([^HAVE_SYS_SYSCTL_H$]) +-m4trace:configure.ac:2621: -1- AH_OUTPUT([HAVE_MACHINE_HAL_SYSINFO_H], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_MACHINE_HAL_SYSINFO_H]) +-m4trace:configure.ac:2621: -1- AC_DEFINE_TRACE_LITERAL([HAVE_MACHINE_HAL_SYSINFO_H]) +-m4trace:configure.ac:2621: -1- m4_pattern_allow([^HAVE_MACHINE_HAL_SYSINFO_H$]) +-m4trace:configure.ac:2637: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_FGETC]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_FGETC$]) +-m4trace:configure.ac:2637: -1- AH_OUTPUT([HAVE_DECL_FGETC], [/* Define to 1 if you have the declaration of `fgetc\', and to 0 if you don\'t. +- */ +-@%:@undef HAVE_DECL_FGETC]) +-m4trace:configure.ac:2637: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_FSCANF]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_FSCANF$]) +-m4trace:configure.ac:2637: -1- AH_OUTPUT([HAVE_DECL_FSCANF], [/* Define to 1 if you have the declaration of `fscanf\', and to 0 if you don\'t. +- */ +-@%:@undef HAVE_DECL_FSCANF]) +-m4trace:configure.ac:2637: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_OPTARG]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_OPTARG$]) +-m4trace:configure.ac:2637: -1- AH_OUTPUT([HAVE_DECL_OPTARG], [/* Define to 1 if you have the declaration of `optarg\', and to 0 if you don\'t. +- */ +-@%:@undef HAVE_DECL_OPTARG]) +-m4trace:configure.ac:2637: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_UNGETC]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_UNGETC$]) +-m4trace:configure.ac:2637: -1- AH_OUTPUT([HAVE_DECL_UNGETC], [/* Define to 1 if you have the declaration of `ungetc\', and to 0 if you don\'t. +- */ +-@%:@undef HAVE_DECL_UNGETC]) +-m4trace:configure.ac:2637: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_VFPRINTF]) +-m4trace:configure.ac:2637: -1- m4_pattern_allow([^HAVE_DECL_VFPRINTF$]) +-m4trace:configure.ac:2637: -1- AH_OUTPUT([HAVE_DECL_VFPRINTF], [/* Define to 1 if you have the declaration of `vfprintf\', and to 0 if you +- don\'t. */ +-@%:@undef HAVE_DECL_VFPRINTF]) +-m4trace:configure.ac:2638: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SYS_ERRLIST]) +-m4trace:configure.ac:2638: -1- m4_pattern_allow([^HAVE_DECL_SYS_ERRLIST$]) +-m4trace:configure.ac:2638: -1- AH_OUTPUT([HAVE_DECL_SYS_ERRLIST], [/* Define to 1 if you have the declaration of `sys_errlist\', and to 0 if you +- don\'t. */ +-@%:@undef HAVE_DECL_SYS_ERRLIST]) +-m4trace:configure.ac:2638: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DECL_SYS_NERR]) +-m4trace:configure.ac:2638: -1- m4_pattern_allow([^HAVE_DECL_SYS_NERR$]) +-m4trace:configure.ac:2638: -1- AH_OUTPUT([HAVE_DECL_SYS_NERR], [/* Define to 1 if you have the declaration of `sys_nerr\', and to 0 if you +- don\'t. */ +-@%:@undef HAVE_DECL_SYS_NERR]) +-m4trace:configure.ac:2642: -1- _m4_warn([obsolete], [The macro `AC_TYPE_SIGNAL' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/types.m4:746: AC_TYPE_SIGNAL is expanded from... +-configure.ac:2642: the top level]) +-m4trace:configure.ac:2642: -1- AC_DEFINE_TRACE_LITERAL([RETSIGTYPE]) +-m4trace:configure.ac:2642: -1- m4_pattern_allow([^RETSIGTYPE$]) +-m4trace:configure.ac:2642: -1- AH_OUTPUT([RETSIGTYPE], [/* Define as the return type of signal handlers (`int\' or `void\'). */ +-@%:@undef RETSIGTYPE]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTMAX_T]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_INTMAX_T$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_INTMAX_T], [/* Define to 1 if the system has the type `intmax_t\'. */ +-@%:@undef HAVE_INTMAX_T]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_DOUBLE]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_LONG_DOUBLE$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_LONG_DOUBLE], [/* Define to 1 if the system has the type `long double\'. */ +-@%:@undef HAVE_LONG_DOUBLE]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_LONG]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_LONG_LONG$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_LONG_LONG], [/* Define to 1 if the system has the type `long long\'. */ +-@%:@undef HAVE_LONG_LONG]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTRDIFF_T]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_PTRDIFF_T$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_PTRDIFF_T], [/* Define to 1 if the system has the type `ptrdiff_t\'. */ +-@%:@undef HAVE_PTRDIFF_T]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_QUAD_T]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_QUAD_T$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_QUAD_T], [/* Define to 1 if the system has the type `quad_t\'. */ +-@%:@undef HAVE_QUAD_T]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_UINT_LEAST32_T]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_UINT_LEAST32_T$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_UINT_LEAST32_T], [/* Define to 1 if the system has the type `uint_least32_t\'. */ +-@%:@undef HAVE_UINT_LEAST32_T]) +-m4trace:configure.ac:2654: -1- AC_DEFINE_TRACE_LITERAL([HAVE_INTPTR_T]) +-m4trace:configure.ac:2654: -1- m4_pattern_allow([^HAVE_INTPTR_T$]) +-m4trace:configure.ac:2654: -1- AH_OUTPUT([HAVE_INTPTR_T], [/* Define to 1 if the system has the type `intptr_t\'. */ +-@%:@undef HAVE_INTPTR_T]) +-m4trace:configure.ac:2657: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STRINGIZE]) +-m4trace:configure.ac:2657: -1- m4_pattern_allow([^HAVE_STRINGIZE$]) +-m4trace:configure.ac:2657: -1- AH_OUTPUT([HAVE_STRINGIZE], [/* Define to 1 if cpp supports the ANSI @%:@ stringizing operator. */ +-@%:@undef HAVE_STRINGIZE]) +-m4trace:configure.ac:2662: -1- AC_DEFINE_TRACE_LITERAL([volatile]) +-m4trace:configure.ac:2662: -1- m4_pattern_allow([^volatile$]) +-m4trace:configure.ac:2662: -1- AH_OUTPUT([volatile], [/* Define to empty if the keyword `volatile\' does not work. Warning: valid +- code using `volatile\' can become incorrect without. Disable with care. */ +-@%:@undef volatile]) +-m4trace:configure.ac:2664: -1- AH_OUTPUT([restrict], [/* Define to the equivalent of the C99 \'restrict\' keyword, or to +- nothing if this is not supported. Do not define if restrict is +- supported directly. */ +-#undef restrict +-/* Work around a bug in Sun C++: it does not support _Restrict or +- __restrict__, even though the corresponding Sun C compiler ends up with +- "#define restrict _Restrict" or "#define restrict __restrict__" in the +- previous line. Perhaps some future version of Sun C++ will work with +- restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +-#if defined __SUNPRO_CC && !defined __RESTRICT +-# define _Restrict +-# define __restrict__ +-#endif]) +-m4trace:configure.ac:2664: -1- AC_DEFINE_TRACE_LITERAL([restrict]) +-m4trace:configure.ac:2664: -1- m4_pattern_allow([^restrict$]) +-m4trace:configure.ac:2664: -1- AC_DEFINE_TRACE_LITERAL([restrict]) +-m4trace:configure.ac:2664: -1- m4_pattern_allow([^restrict$]) +-m4trace:configure.ac:2667: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3159: GMP_C_ATTRIBUTE_CONST is expanded from... +-configure.ac:2667: the top level]) +-m4trace:configure.ac:2667: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ATTRIBUTE_CONST]) +-m4trace:configure.ac:2667: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_CONST$]) +-m4trace:configure.ac:2667: -1- AH_OUTPUT([HAVE_ATTRIBUTE_CONST], [/* Define to 1 if the compiler accepts gcc style __attribute__ ((const)) */ +-@%:@undef HAVE_ATTRIBUTE_CONST]) +-m4trace:configure.ac:2668: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3178: GMP_C_ATTRIBUTE_MALLOC is expanded from... +-configure.ac:2668: the top level]) +-m4trace:configure.ac:2668: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ATTRIBUTE_MALLOC]) +-m4trace:configure.ac:2668: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_MALLOC$]) +-m4trace:configure.ac:2668: -1- AH_OUTPUT([HAVE_ATTRIBUTE_MALLOC], [/* Define to 1 if the compiler accepts gcc style __attribute__ ((malloc)) */ +-@%:@undef HAVE_ATTRIBUTE_MALLOC]) +-m4trace:configure.ac:2669: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3208: GMP_C_ATTRIBUTE_MODE is expanded from... +-configure.ac:2669: the top level]) +-m4trace:configure.ac:2669: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ATTRIBUTE_MODE]) +-m4trace:configure.ac:2669: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_MODE$]) +-m4trace:configure.ac:2669: -1- AH_OUTPUT([HAVE_ATTRIBUTE_MODE], [/* Define to 1 if the compiler accepts gcc style __attribute__ ((mode (XX))) +- */ +-@%:@undef HAVE_ATTRIBUTE_MODE]) +-m4trace:configure.ac:2670: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3224: GMP_C_ATTRIBUTE_NORETURN is expanded from... +-configure.ac:2670: the top level]) +-m4trace:configure.ac:2670: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ATTRIBUTE_NORETURN]) +-m4trace:configure.ac:2670: -1- m4_pattern_allow([^HAVE_ATTRIBUTE_NORETURN$]) +-m4trace:configure.ac:2670: -1- AH_OUTPUT([HAVE_ATTRIBUTE_NORETURN], [/* Define to 1 if the compiler accepts gcc style __attribute__ ((noreturn)) */ +-@%:@undef HAVE_ATTRIBUTE_NORETURN]) +-m4trace:configure.ac:2672: -1- AH_OUTPUT([inline], [/* Define to `__inline__\' or `__inline\' if that\'s what the C compiler +- calls it, or to nothing if \'inline\' is not supported under any name. */ +-#ifndef __cplusplus +-#undef inline +-#endif]) +-m4trace:configure.ac:2672: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-acinclude.m4:3731: GMP_H_EXTERN_INLINE is expanded from... +-configure.ac:2672: the top level]) +-m4trace:configure.ac:2675: -1- _m4_warn([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. +-You should run autoupdate.], [aclocal.m4:3604: AC_CHECK_LIBM is expanded from... +-configure.ac:2675: the top level]) +-m4trace:configure.ac:2675: -1- AC_SUBST([LIBM]) +-m4trace:configure.ac:2675: -1- AC_SUBST_TRACE([LIBM]) +-m4trace:configure.ac:2675: -1- m4_pattern_allow([^LIBM$]) +-m4trace:configure.ac:2676: -1- AC_SUBST([LIBM]) +-m4trace:configure.ac:2676: -1- AC_SUBST_TRACE([LIBM]) +-m4trace:configure.ac:2676: -1- m4_pattern_allow([^LIBM$]) +-m4trace:configure.ac:2678: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3539: GMP_HEADER_ALLOCA is expanded from... +-acinclude.m4:3523: GMP_FUNC_ALLOCA is expanded from... +-configure.ac:2678: the top level]) +-m4trace:configure.ac:2678: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA_H]) +-m4trace:configure.ac:2678: -1- m4_pattern_allow([^HAVE_ALLOCA_H$]) +-m4trace:configure.ac:2678: -1- AH_OUTPUT([HAVE_ALLOCA_H], [/* Define to 1 if you have and it should be used (not on Ultrix). +- */ +-@%:@undef HAVE_ALLOCA_H]) +-m4trace:configure.ac:2678: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2687: AC_TRY_LINK is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3523: GMP_FUNC_ALLOCA is expanded from... +-configure.ac:2678: the top level]) +-m4trace:configure.ac:2678: -1- AC_DEFINE_TRACE_LITERAL([HAVE_ALLOCA]) +-m4trace:configure.ac:2678: -1- m4_pattern_allow([^HAVE_ALLOCA$]) +-m4trace:configure.ac:2678: -1- AH_OUTPUT([HAVE_ALLOCA], [/* Define to 1 if alloca() works (via gmp-impl.h). */ +-@%:@undef HAVE_ALLOCA]) +-m4trace:configure.ac:2679: -1- AH_OUTPUT([WANT_TMP], [/* Define one of these to 1 for the desired temporary memory allocation +- method, per --enable-alloca. */ +-#undef WANT_TMP_ALLOCA +-#undef WANT_TMP_REENTRANT +-#undef WANT_TMP_NOTREENTRANT +-#undef WANT_TMP_DEBUG]) +-m4trace:configure.ac:2679: -1- AC_DEFINE_TRACE_LITERAL([WANT_TMP_ALLOCA]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_ALLOCA$]) +-m4trace:configure.ac:2679: -1- AC_DEFINE_TRACE_LITERAL([WANT_TMP_REENTRANT]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_REENTRANT$]) +-m4trace:configure.ac:2679: -1- AC_DEFINE_TRACE_LITERAL([WANT_TMP_NOTREENTRANT]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_NOTREENTRANT$]) +-m4trace:configure.ac:2679: -1- AC_DEFINE_TRACE_LITERAL([WANT_TMP_DEBUG]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^WANT_TMP_DEBUG$]) +-m4trace:configure.ac:2679: -1- AC_SUBST([TAL_OBJECT]) +-m4trace:configure.ac:2679: -1- AC_SUBST_TRACE([TAL_OBJECT]) +-m4trace:configure.ac:2679: -1- m4_pattern_allow([^TAL_OBJECT$]) +-m4trace:configure.ac:2681: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2614: AC_TRY_COMPILE is expanded from... +-acinclude.m4:3758: GMP_H_HAVE_FILE is expanded from... +-configure.ac:2681: the top level]) +-m4trace:configure.ac:2683: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most +- significant byte first (like Motorola and SPARC, unlike Intel). */ +-#if defined AC_APPLE_UNIVERSAL_BUILD +-# if defined __BIG_ENDIAN__ +-# define WORDS_BIGENDIAN 1 +-# endif +-#else +-# ifndef WORDS_BIGENDIAN +-# undef WORDS_BIGENDIAN +-# endif +-#endif]) +-m4trace:configure.ac:2683: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIMB_BIG_ENDIAN]) +-m4trace:configure.ac:2683: -1- m4_pattern_allow([^HAVE_LIMB_BIG_ENDIAN$]) +-m4trace:configure.ac:2683: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIMB_LITTLE_ENDIAN]) +-m4trace:configure.ac:2683: -1- m4_pattern_allow([^HAVE_LIMB_LITTLE_ENDIAN$]) +-m4trace:configure.ac:2683: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD]) +-m4trace:configure.ac:2683: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$]) +-m4trace:configure.ac:2683: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */ +-@%:@undef AC_APPLE_UNIVERSAL_BUILD]) +-m4trace:configure.ac:2689: -1- AH_OUTPUT([HAVE_LIMB], [/* Define one of these to 1 for the endianness of `mp_limb_t\'. +- If the endianness is not a simple big or little, or you don\'t know what +- it is, then leave both undefined. */ +-#undef HAVE_LIMB_BIG_ENDIAN +-#undef HAVE_LIMB_LITTLE_ENDIAN]) +-m4trace:configure.ac:2696: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3254: GMP_C_DOUBLE_FORMAT is expanded from... +-configure.ac:2696: the top level]) +-m4trace:configure.ac:2696: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3254: GMP_C_DOUBLE_FORMAT is expanded from... +-configure.ac:2696: the top level]) +-m4trace:configure.ac:2696: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3254: GMP_C_DOUBLE_FORMAT is expanded from... +-configure.ac:2696: the top level]) +-m4trace:configure.ac:2696: -1- AH_OUTPUT([HAVE_DOUBLE], [/* Define one of the following to 1 for the format of a `double\'. +- If your format is not among these choices, or you don\'t know what it is, +- then leave all undefined. +- IEEE_LITTLE_SWAPPED means little endian, but with the two 4-byte halves +- swapped, as used by ARM CPUs in little endian mode. */ +-#undef HAVE_DOUBLE_IEEE_BIG_ENDIAN +-#undef HAVE_DOUBLE_IEEE_LITTLE_ENDIAN +-#undef HAVE_DOUBLE_IEEE_LITTLE_SWAPPED +-#undef HAVE_DOUBLE_VAX_D +-#undef HAVE_DOUBLE_VAX_G +-#undef HAVE_DOUBLE_CRAY_CFP]) +-m4trace:configure.ac:2696: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOUBLE_IEEE_BIG_ENDIAN]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_IEEE_BIG_ENDIAN$]) +-m4trace:configure.ac:2696: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOUBLE_IEEE_LITTLE_ENDIAN]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_IEEE_LITTLE_ENDIAN$]) +-m4trace:configure.ac:2696: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOUBLE_IEEE_LITTLE_SWAPPED]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_IEEE_LITTLE_SWAPPED$]) +-m4trace:configure.ac:2696: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOUBLE_VAX_D]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_VAX_D$]) +-m4trace:configure.ac:2696: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOUBLE_VAX_G]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_VAX_G$]) +-m4trace:configure.ac:2696: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DOUBLE_CRAY_CFP]) +-m4trace:configure.ac:2696: -1- m4_pattern_allow([^HAVE_DOUBLE_CRAY_CFP$]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_ALARM], [/* Define to 1 if you have the `alarm\' function. */ +-@%:@undef HAVE_ALARM]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_ATTR_GET], [/* Define to 1 if you have the `attr_get\' function. */ +-@%:@undef HAVE_ATTR_GET]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_CLOCK], [/* Define to 1 if you have the `clock\' function. */ +-@%:@undef HAVE_CLOCK]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_CPUTIME], [/* Define to 1 if you have the `cputime\' function. */ +-@%:@undef HAVE_CPUTIME]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_GETPAGESIZE], [/* Define to 1 if you have the `getpagesize\' function. */ +-@%:@undef HAVE_GETPAGESIZE]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_GETRUSAGE], [/* Define to 1 if you have the `getrusage\' function. */ +-@%:@undef HAVE_GETRUSAGE]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_GETTIMEOFDAY], [/* Define to 1 if you have the `gettimeofday\' function. */ +-@%:@undef HAVE_GETTIMEOFDAY]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_GETSYSINFO], [/* Define to 1 if you have the `getsysinfo\' function. */ +-@%:@undef HAVE_GETSYSINFO]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_LOCALECONV], [/* Define to 1 if you have the `localeconv\' function. */ +-@%:@undef HAVE_LOCALECONV]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_MEMSET], [/* Define to 1 if you have the `memset\' function. */ +-@%:@undef HAVE_MEMSET]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_MMAP], [/* Define to 1 if you have the `mmap\' function. */ +-@%:@undef HAVE_MMAP]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_MPROTECT], [/* Define to 1 if you have the `mprotect\' function. */ +-@%:@undef HAVE_MPROTECT]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_NL_LANGINFO], [/* Define to 1 if you have the `nl_langinfo\' function. */ +-@%:@undef HAVE_NL_LANGINFO]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_OBSTACK_VPRINTF], [/* Define to 1 if you have the `obstack_vprintf\' function. */ +-@%:@undef HAVE_OBSTACK_VPRINTF]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_POPEN], [/* Define to 1 if you have the `popen\' function. */ +-@%:@undef HAVE_POPEN]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_PROCESSOR_INFO], [/* Define to 1 if you have the `processor_info\' function. */ +-@%:@undef HAVE_PROCESSOR_INFO]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_PSTAT_GETPROCESSOR], [/* Define to 1 if you have the `pstat_getprocessor\' function. */ +-@%:@undef HAVE_PSTAT_GETPROCESSOR]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_RAISE], [/* Define to 1 if you have the `raise\' function. */ +-@%:@undef HAVE_RAISE]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_READ_REAL_TIME], [/* Define to 1 if you have the `read_real_time\' function. */ +-@%:@undef HAVE_READ_REAL_TIME]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SIGACTION], [/* Define to 1 if you have the `sigaction\' function. */ +-@%:@undef HAVE_SIGACTION]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SIGALTSTACK], [/* Define to 1 if you have the `sigaltstack\' function. */ +-@%:@undef HAVE_SIGALTSTACK]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SIGSTACK], [/* Define to 1 if you have the `sigstack\' function. */ +-@%:@undef HAVE_SIGSTACK]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SYSSGI], [/* Define to 1 if you have the `syssgi\' function. */ +-@%:@undef HAVE_SYSSGI]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_STRCHR], [/* Define to 1 if you have the `strchr\' function. */ +-@%:@undef HAVE_STRCHR]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_STRERROR], [/* Define to 1 if you have the `strerror\' function. */ +-@%:@undef HAVE_STRERROR]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_STRNLEN], [/* Define to 1 if you have the `strnlen\' function. */ +-@%:@undef HAVE_STRNLEN]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_STRTOL], [/* Define to 1 if you have the `strtol\' function. */ +-@%:@undef HAVE_STRTOL]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_STRTOUL], [/* Define to 1 if you have the `strtoul\' function. */ +-@%:@undef HAVE_STRTOUL]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SYSCONF], [/* Define to 1 if you have the `sysconf\' function. */ +-@%:@undef HAVE_SYSCONF]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SYSCTL], [/* Define to 1 if you have the `sysctl\' function. */ +-@%:@undef HAVE_SYSCTL]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_SYSCTLBYNAME], [/* Define to 1 if you have the `sysctlbyname\' function. */ +-@%:@undef HAVE_SYSCTLBYNAME]) +-m4trace:configure.ac:2728: -1- AH_OUTPUT([HAVE_TIMES], [/* Define to 1 if you have the `times\' function. */ +-@%:@undef HAVE_TIMES]) +-m4trace:configure.ac:2736: -1- AC_DEFINE_TRACE_LITERAL([HAVE_CLOCK_GETTIME]) +-m4trace:configure.ac:2736: -1- m4_pattern_allow([^HAVE_CLOCK_GETTIME$]) +-m4trace:configure.ac:2736: -1- AH_OUTPUT([HAVE_CLOCK_GETTIME], [/* Define to 1 if you have the `clock_gettime\' function */ +-@%:@undef HAVE_CLOCK_GETTIME]) +-m4trace:configure.ac:2741: -1- AC_SUBST([TUNE_LIBS]) +-m4trace:configure.ac:2741: -1- AC_SUBST_TRACE([TUNE_LIBS]) +-m4trace:configure.ac:2741: -1- m4_pattern_allow([^TUNE_LIBS$]) +-m4trace:configure.ac:2743: -1- _m4_warn([obsolete], [The macro `AC_TRY_RUN' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:2764: AC_TRY_RUN is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3666: GMP_FUNC_VSNPRINTF is expanded from... +-configure.ac:2743: the top level]) +-m4trace:configure.ac:2743: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF]) +-m4trace:configure.ac:2743: -1- m4_pattern_allow([^HAVE_VSNPRINTF$]) +-m4trace:configure.ac:2743: -1- AH_OUTPUT([HAVE_VSNPRINTF], [/* Define to 1 if you have the `vsnprintf\' function and it works properly. */ +-@%:@undef HAVE_VSNPRINTF]) +-m4trace:configure.ac:2744: -1- AC_DEFINE_TRACE_LITERAL([SSCANF_WRITABLE_INPUT]) +-m4trace:configure.ac:2744: -1- m4_pattern_allow([^SSCANF_WRITABLE_INPUT$]) +-m4trace:configure.ac:2744: -1- AH_OUTPUT([SSCANF_WRITABLE_INPUT], [/* Define to 1 if sscanf requires writable inputs */ +-@%:@undef SSCANF_WRITABLE_INPUT]) +-m4trace:configure.ac:2749: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PSP_ITICKSPERCLKTICK]) +-m4trace:configure.ac:2749: -1- m4_pattern_allow([^HAVE_PSP_ITICKSPERCLKTICK$]) +-m4trace:configure.ac:2749: -1- AH_OUTPUT([HAVE_PSP_ITICKSPERCLKTICK], [/* Define to 1 if `struct pst_processor\' exists and contains +- `psp_iticksperclktick\'. */ +-@%:@undef HAVE_PSP_ITICKSPERCLKTICK]) +-m4trace:configure.ac:2764: -1- AH_OUTPUT([HAVE_SSTREAM], [/* Define to 1 if you have the header file. */ +-@%:@undef HAVE_SSTREAM]) +-m4trace:configure.ac:2764: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SSTREAM]) +-m4trace:configure.ac:2764: -1- m4_pattern_allow([^HAVE_SSTREAM$]) +-m4trace:configure.ac:2765: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STD__LOCALE]) +-m4trace:configure.ac:2765: -1- m4_pattern_allow([^HAVE_STD__LOCALE$]) +-m4trace:configure.ac:2765: -1- AH_OUTPUT([HAVE_STD__LOCALE], [/* Define to 1 if the system has the type `std::locale\'. */ +-@%:@undef HAVE_STD__LOCALE]) +-m4trace:configure.ac:2969: -1- AC_DEFINE_TRACE_LITERAL([WANT_FAT_BINARY]) +-m4trace:configure.ac:2969: -1- m4_pattern_allow([^WANT_FAT_BINARY$]) +-m4trace:configure.ac:2969: -1- AH_OUTPUT([WANT_FAT_BINARY], [/* Define to 1 when building a fat binary. */ +-@%:@undef WANT_FAT_BINARY]) +-m4trace:configure.ac:3294: -1- AC_CONFIG_LINKS([mpn/$tmp_fn.$tmp_ext:mpn/$tmp_dir/$tmp_base.$tmp_ext]) +-m4trace:configure.ac:3342: -1- AH_OUTPUT([HAVE_NATIVE], [/* Define to 1 each of the following for which a native (ie. CPU specific) +- implementation of the corresponding routine exists. */ +-#undef HAVE_NATIVE_mpn_add_n +-#undef HAVE_NATIVE_mpn_add_n_sub_n +-#undef HAVE_NATIVE_mpn_add_nc +-#undef HAVE_NATIVE_mpn_addaddmul_1msb0 +-#undef HAVE_NATIVE_mpn_addlsh1_n +-#undef HAVE_NATIVE_mpn_addlsh2_n +-#undef HAVE_NATIVE_mpn_addlsh_n +-#undef HAVE_NATIVE_mpn_addlsh1_nc +-#undef HAVE_NATIVE_mpn_addlsh2_nc +-#undef HAVE_NATIVE_mpn_addlsh_nc +-#undef HAVE_NATIVE_mpn_addlsh1_n_ip1 +-#undef HAVE_NATIVE_mpn_addlsh2_n_ip1 +-#undef HAVE_NATIVE_mpn_addlsh_n_ip1 +-#undef HAVE_NATIVE_mpn_addlsh1_nc_ip1 +-#undef HAVE_NATIVE_mpn_addlsh2_nc_ip1 +-#undef HAVE_NATIVE_mpn_addlsh_nc_ip1 +-#undef HAVE_NATIVE_mpn_addlsh1_n_ip2 +-#undef HAVE_NATIVE_mpn_addlsh2_n_ip2 +-#undef HAVE_NATIVE_mpn_addlsh_n_ip2 +-#undef HAVE_NATIVE_mpn_addlsh1_nc_ip2 +-#undef HAVE_NATIVE_mpn_addlsh2_nc_ip2 +-#undef HAVE_NATIVE_mpn_addlsh_nc_ip2 +-#undef HAVE_NATIVE_mpn_addmul_1c +-#undef HAVE_NATIVE_mpn_addmul_2 +-#undef HAVE_NATIVE_mpn_addmul_3 +-#undef HAVE_NATIVE_mpn_addmul_4 +-#undef HAVE_NATIVE_mpn_addmul_5 +-#undef HAVE_NATIVE_mpn_addmul_6 +-#undef HAVE_NATIVE_mpn_addmul_7 +-#undef HAVE_NATIVE_mpn_addmul_8 +-#undef HAVE_NATIVE_mpn_addmul_2s +-#undef HAVE_NATIVE_mpn_and_n +-#undef HAVE_NATIVE_mpn_andn_n +-#undef HAVE_NATIVE_mpn_bdiv_dbm1c +-#undef HAVE_NATIVE_mpn_bdiv_q_1 +-#undef HAVE_NATIVE_mpn_pi1_bdiv_q_1 +-#undef HAVE_NATIVE_mpn_cnd_add_n +-#undef HAVE_NATIVE_mpn_cnd_sub_n +-#undef HAVE_NATIVE_mpn_com +-#undef HAVE_NATIVE_mpn_copyd +-#undef HAVE_NATIVE_mpn_copyi +-#undef HAVE_NATIVE_mpn_div_qr_1n_pi1 +-#undef HAVE_NATIVE_mpn_div_qr_2 +-#undef HAVE_NATIVE_mpn_divexact_1 +-#undef HAVE_NATIVE_mpn_divexact_by3c +-#undef HAVE_NATIVE_mpn_divrem_1 +-#undef HAVE_NATIVE_mpn_divrem_1c +-#undef HAVE_NATIVE_mpn_divrem_2 +-#undef HAVE_NATIVE_mpn_gcd_1 +-#undef HAVE_NATIVE_mpn_hamdist +-#undef HAVE_NATIVE_mpn_invert_limb +-#undef HAVE_NATIVE_mpn_ior_n +-#undef HAVE_NATIVE_mpn_iorn_n +-#undef HAVE_NATIVE_mpn_lshift +-#undef HAVE_NATIVE_mpn_lshiftc +-#undef HAVE_NATIVE_mpn_lshsub_n +-#undef HAVE_NATIVE_mpn_mod_1 +-#undef HAVE_NATIVE_mpn_mod_1_1p +-#undef HAVE_NATIVE_mpn_mod_1c +-#undef HAVE_NATIVE_mpn_mod_1s_2p +-#undef HAVE_NATIVE_mpn_mod_1s_4p +-#undef HAVE_NATIVE_mpn_mod_34lsub1 +-#undef HAVE_NATIVE_mpn_modexact_1_odd +-#undef HAVE_NATIVE_mpn_modexact_1c_odd +-#undef HAVE_NATIVE_mpn_mul_1 +-#undef HAVE_NATIVE_mpn_mul_1c +-#undef HAVE_NATIVE_mpn_mul_2 +-#undef HAVE_NATIVE_mpn_mul_3 +-#undef HAVE_NATIVE_mpn_mul_4 +-#undef HAVE_NATIVE_mpn_mul_5 +-#undef HAVE_NATIVE_mpn_mul_6 +-#undef HAVE_NATIVE_mpn_mul_basecase +-#undef HAVE_NATIVE_mpn_nand_n +-#undef HAVE_NATIVE_mpn_nior_n +-#undef HAVE_NATIVE_mpn_popcount +-#undef HAVE_NATIVE_mpn_preinv_divrem_1 +-#undef HAVE_NATIVE_mpn_preinv_mod_1 +-#undef HAVE_NATIVE_mpn_redc_1 +-#undef HAVE_NATIVE_mpn_redc_2 +-#undef HAVE_NATIVE_mpn_rsblsh1_n +-#undef HAVE_NATIVE_mpn_rsblsh2_n +-#undef HAVE_NATIVE_mpn_rsblsh_n +-#undef HAVE_NATIVE_mpn_rsblsh1_nc +-#undef HAVE_NATIVE_mpn_rsblsh2_nc +-#undef HAVE_NATIVE_mpn_rsblsh_nc +-#undef HAVE_NATIVE_mpn_rsh1add_n +-#undef HAVE_NATIVE_mpn_rsh1add_nc +-#undef HAVE_NATIVE_mpn_rsh1sub_n +-#undef HAVE_NATIVE_mpn_rsh1sub_nc +-#undef HAVE_NATIVE_mpn_rshift +-#undef HAVE_NATIVE_mpn_sqr_basecase +-#undef HAVE_NATIVE_mpn_sqr_diagonal +-#undef HAVE_NATIVE_mpn_sqr_diag_addlsh1 +-#undef HAVE_NATIVE_mpn_sub_n +-#undef HAVE_NATIVE_mpn_sub_nc +-#undef HAVE_NATIVE_mpn_sublsh1_n +-#undef HAVE_NATIVE_mpn_sublsh2_n +-#undef HAVE_NATIVE_mpn_sublsh_n +-#undef HAVE_NATIVE_mpn_sublsh1_nc +-#undef HAVE_NATIVE_mpn_sublsh2_nc +-#undef HAVE_NATIVE_mpn_sublsh_nc +-#undef HAVE_NATIVE_mpn_sublsh1_n_ip1 +-#undef HAVE_NATIVE_mpn_sublsh2_n_ip1 +-#undef HAVE_NATIVE_mpn_sublsh_n_ip1 +-#undef HAVE_NATIVE_mpn_sublsh1_nc_ip1 +-#undef HAVE_NATIVE_mpn_sublsh2_nc_ip1 +-#undef HAVE_NATIVE_mpn_sublsh_nc_ip1 +-#undef HAVE_NATIVE_mpn_submul_1c +-#undef HAVE_NATIVE_mpn_tabselect +-#undef HAVE_NATIVE_mpn_udiv_qrnnd +-#undef HAVE_NATIVE_mpn_udiv_qrnnd_r +-#undef HAVE_NATIVE_mpn_umul_ppmm +-#undef HAVE_NATIVE_mpn_umul_ppmm_r +-#undef HAVE_NATIVE_mpn_xor_n +-#undef HAVE_NATIVE_mpn_xnor_n]) +-m4trace:configure.ac:3464: -1- AC_SUBST([M4]) +-m4trace:configure.ac:3464: -1- AC_SUBST_TRACE([M4]) +-m4trace:configure.ac:3464: -1- m4_pattern_allow([^M4$]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:308: GMP_PROG_M4 is expanded from... +-configure.ac:3464: the top level]) +-m4trace:configure.ac:3464: -1- AC_SUBST([M4]) +-m4trace:configure.ac:3464: -1- AC_SUBST_TRACE([M4]) +-m4trace:configure.ac:3464: -1- m4_pattern_allow([^M4$]) +-m4trace:configure.ac:3465: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:378: GMP_M4_M4WRAP_SPURIOUS is expanded from... +-configure.ac:3465: the top level]) +-m4trace:configure.ac:3465: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:378: GMP_M4_M4WRAP_SPURIOUS is expanded from... +-configure.ac:3465: the top level]) +-m4trace:configure.ac:3465: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:378: GMP_M4_M4WRAP_SPURIOUS is expanded from... +-configure.ac:3465: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3479: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1894: GMP_ASM_TEXT is expanded from... +-configure.ac:3479: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3481: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1686: GMP_ASM_LABEL_SUFFIX is expanded from... +-configure.ac:3481: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3484: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1727: GMP_ASM_UNDERSCORE is expanded from... +-configure.ac:3484: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3485: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1944: GMP_ASM_RODATA is expanded from... +-configure.ac:3485: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3486: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2065: GMP_ASM_TYPE is expanded from... +-configure.ac:3486: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3487: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2087: GMP_ASM_SIZE is expanded from... +-configure.ac:3487: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2200: GMP_ASM_LSYM_PREFIX is expanded from... +-configure.ac:3488: the top level]) +-m4trace:configure.ac:3488: -1- AC_DEFINE_TRACE_LITERAL([LSYM_PREFIX]) +-m4trace:configure.ac:3488: -1- m4_pattern_allow([^LSYM_PREFIX$]) +-m4trace:configure.ac:3488: -1- AH_OUTPUT([LSYM_PREFIX], [/* Assembler local label prefix */ +-@%:@undef LSYM_PREFIX]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1865: GMP_ASM_BYTE is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3489: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2259: GMP_ASM_W32 is expanded from... +-configure.ac:3489: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3490: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1777: GMP_ASM_ALIGN_LOG is expanded from... +-configure.ac:3490: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3498: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2807: GMP_ASM_IA64_ALIGN_OK is expanded from... +-configure.ac:3498: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3501: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2921: GMP_ASM_M68K_INSTRUCTION is expanded from... +-configure.ac:3501: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3502: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2952: GMP_ASM_M68K_ADDRESSING is expanded from... +-configure.ac:3502: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3503: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2989: GMP_ASM_M68K_BRANCHES is expanded from... +-configure.ac:3503: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3506: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3028: GMP_ASM_POWERPC_PIC_ALWAYS is expanded from... +-configure.ac:3506: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3507: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3065: GMP_ASM_POWERPC_R_REGISTERS is expanded from... +-configure.ac:3507: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3548: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3090: GMP_ASM_SPARC_REGISTER is expanded from... +-configure.ac:3548: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3551: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3111: GMP_ASM_SPARC_GOTDATA is expanded from... +-configure.ac:3551: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3552: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:3135: GMP_ASM_SPARC_SHARED_THUNKS is expanded from... +-configure.ac:3552: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3555: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:1836: GMP_ASM_ALIGN_FILL_0x90 is expanded from... +-configure.ac:3555: the top level]) +-m4trace:configure.ac:3559: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_FAMILY_x86]) +-m4trace:configure.ac:3559: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_x86$]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3560: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2143: GMP_ASM_COFF_TYPE is expanded from... +-configure.ac:3560: the top level]) +-m4trace:configure.ac:3561: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2343: GMP_ASM_X86_GOT_UNDERSCORE is expanded from... +-configure.ac:3561: the top level]) +-m4trace:configure.ac:3561: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2343: GMP_ASM_X86_GOT_UNDERSCORE is expanded from... +-configure.ac:3561: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3562: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:1631: GMP_TRY_ASSEMBLE is expanded from... +-../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +-../../lib/autoconf/general.m4:2031: AC_CACHE_VAL is expanded from... +-../../lib/autoconf/general.m4:2052: AC_CACHE_CHECK is expanded from... +-acinclude.m4:2567: GMP_ASM_X86_SHLDL_CL is expanded from... +-configure.ac:3562: the top level]) +-m4trace:configure.ac:3564: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2734: GMP_ASM_X86_MCOUNT is expanded from... +-configure.ac:3564: the top level]) +-m4trace:configure.ac:3564: -1- _m4_warn([obsolete], [The macro `AC_FD_CC' is obsolete. +-You should run autoupdate.], [../../lib/autoconf/general.m4:383: AC_FD_CC is expanded from... +-acinclude.m4:2734: GMP_ASM_X86_MCOUNT is expanded from... +-configure.ac:3564: the top level]) +-m4trace:configure.ac:3573: -1- AC_DEFINE_TRACE_LITERAL([HAVE_HOST_CPU_FAMILY_x86_64]) +-m4trace:configure.ac:3573: -1- m4_pattern_allow([^HAVE_HOST_CPU_FAMILY_x86_64$]) +-m4trace:configure.ac:3600: -1- AC_CONFIG_LINKS([gmp-mparam.h:mpn/$gmp_mparam_dir/gmp-mparam.h]) +-m4trace:configure.ac:3618: -1- AC_DEFINE_TRACE_LITERAL([GMP_MPARAM_H_SUGGEST]) +-m4trace:configure.ac:3618: -1- m4_pattern_allow([^GMP_MPARAM_H_SUGGEST$]) +-m4trace:configure.ac:3618: -1- AH_OUTPUT([GMP_MPARAM_H_SUGGEST], [/* The gmp-mparam.h file (a string) the tune program should suggest updating. +- */ +-@%:@undef GMP_MPARAM_H_SUGGEST]) +-m4trace:configure.ac:3643: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_VOID_P]) +-m4trace:configure.ac:3643: -1- m4_pattern_allow([^SIZEOF_VOID_P$]) +-m4trace:configure.ac:3643: -1- AH_OUTPUT([SIZEOF_VOID_P], [/* The size of `void *\', as computed by sizeof. */ +-@%:@undef SIZEOF_VOID_P]) +-m4trace:configure.ac:3644: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_UNSIGNED_SHORT]) +-m4trace:configure.ac:3644: -1- m4_pattern_allow([^SIZEOF_UNSIGNED_SHORT$]) +-m4trace:configure.ac:3644: -1- AH_OUTPUT([SIZEOF_UNSIGNED_SHORT], [/* The size of `unsigned short\', as computed by sizeof. */ +-@%:@undef SIZEOF_UNSIGNED_SHORT]) +-m4trace:configure.ac:3645: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_UNSIGNED]) +-m4trace:configure.ac:3645: -1- m4_pattern_allow([^SIZEOF_UNSIGNED$]) +-m4trace:configure.ac:3645: -1- AH_OUTPUT([SIZEOF_UNSIGNED], [/* The size of `unsigned\', as computed by sizeof. */ +-@%:@undef SIZEOF_UNSIGNED]) +-m4trace:configure.ac:3646: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_UNSIGNED_LONG]) +-m4trace:configure.ac:3646: -1- m4_pattern_allow([^SIZEOF_UNSIGNED_LONG$]) +-m4trace:configure.ac:3646: -1- AH_OUTPUT([SIZEOF_UNSIGNED_LONG], [/* The size of `unsigned long\', as computed by sizeof. */ +-@%:@undef SIZEOF_UNSIGNED_LONG]) +-m4trace:configure.ac:3647: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_MP_LIMB_T]) +-m4trace:configure.ac:3647: -1- m4_pattern_allow([^SIZEOF_MP_LIMB_T$]) +-m4trace:configure.ac:3647: -1- AH_OUTPUT([SIZEOF_MP_LIMB_T], [/* The size of `mp_limb_t\', as computed by sizeof. */ +-@%:@undef SIZEOF_MP_LIMB_T]) +-m4trace:configure.ac:3651: -1- AC_SUBST([GMP_LIMB_BITS], [`expr 8 \* $ac_cv_sizeof_mp_limb_t`]) +-m4trace:configure.ac:3651: -1- AC_SUBST_TRACE([GMP_LIMB_BITS]) +-m4trace:configure.ac:3651: -1- m4_pattern_allow([^GMP_LIMB_BITS$]) +-m4trace:configure.ac:3679: -1- AC_SUBST([mpn_objects]) +-m4trace:configure.ac:3679: -1- AC_SUBST_TRACE([mpn_objects]) +-m4trace:configure.ac:3679: -1- m4_pattern_allow([^mpn_objects$]) +-m4trace:configure.ac:3680: -1- AC_SUBST([mpn_objs_in_libgmp]) +-m4trace:configure.ac:3680: -1- AC_SUBST_TRACE([mpn_objs_in_libgmp]) +-m4trace:configure.ac:3680: -1- m4_pattern_allow([^mpn_objs_in_libgmp$]) +-m4trace:configure.ac:3681: -1- AC_SUBST([gmp_srclinks]) +-m4trace:configure.ac:3681: -1- AC_SUBST_TRACE([gmp_srclinks]) +-m4trace:configure.ac:3681: -1- m4_pattern_allow([^gmp_srclinks$]) +-m4trace:configure.ac:3692: -1- AC_DEFINE_TRACE_LITERAL([TUNE_SQR_TOOM2_MAX]) +-m4trace:configure.ac:3692: -1- m4_pattern_allow([^TUNE_SQR_TOOM2_MAX$]) +-m4trace:configure.ac:3692: -1- AH_OUTPUT([TUNE_SQR_TOOM2_MAX], [/* Maximum size the tune program can test for SQR_TOOM2_THRESHOLD */ +-@%:@undef TUNE_SQR_TOOM2_MAX]) +-m4trace:configure.ac:3702: -1- AC_DEFINE_TRACE_LITERAL([TUNE_SQR_TOOM2_MAX]) +-m4trace:configure.ac:3702: -1- m4_pattern_allow([^TUNE_SQR_TOOM2_MAX$]) +-m4trace:configure.ac:3710: -1- AC_SUBST([TUNE_SQR_OBJ]) +-m4trace:configure.ac:3710: -1- AC_SUBST_TRACE([TUNE_SQR_OBJ]) +-m4trace:configure.ac:3710: -1- m4_pattern_allow([^TUNE_SQR_OBJ$]) +-m4trace:configure.ac:3715: -1- AC_CONFIG_FILES([demos/pexpr-config.h:demos/pexpr-config-h.in]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_CLOCK_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_CLOCK_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_CLOCK_01$]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_CPUTIME_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_CPUTIME_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_CPUTIME_01$]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_GETRUSAGE_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_GETRUSAGE_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_GETRUSAGE_01$]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_GETTIMEOFDAY_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_GETTIMEOFDAY_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_GETTIMEOFDAY_01$]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_SIGACTION_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_SIGACTION_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_SIGACTION_01$]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_SIGALTSTACK_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_SIGALTSTACK_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_SIGALTSTACK_01$]) +-m4trace:configure.ac:3716: -1- AC_SUBST([HAVE_SIGSTACK_01], [1]) +-m4trace:configure.ac:3716: -1- AC_SUBST_TRACE([HAVE_SIGSTACK_01]) +-m4trace:configure.ac:3716: -1- m4_pattern_allow([^HAVE_SIGSTACK_01$]) +-m4trace:configure.ac:3717: -1- AC_SUBST([HAVE_SYS_RESOURCE_H_01], [1]) +-m4trace:configure.ac:3717: -1- AC_SUBST_TRACE([HAVE_SYS_RESOURCE_H_01]) +-m4trace:configure.ac:3717: -1- m4_pattern_allow([^HAVE_SYS_RESOURCE_H_01$]) +-m4trace:configure.ac:3718: -1- AC_DEFINE_TRACE_LITERAL([HAVE_STACK_T]) +-m4trace:configure.ac:3718: -1- m4_pattern_allow([^HAVE_STACK_T$]) +-m4trace:configure.ac:3718: -1- AH_OUTPUT([HAVE_STACK_T], [/* Define to 1 if the system has the type `stack_t\'. */ +-@%:@undef HAVE_STACK_T]) +-m4trace:configure.ac:3720: -1- AC_SUBST([HAVE_STACK_T_01]) +-m4trace:configure.ac:3720: -1- AC_SUBST_TRACE([HAVE_STACK_T_01]) +-m4trace:configure.ac:3720: -1- m4_pattern_allow([^HAVE_STACK_T_01$]) +-m4trace:configure.ac:3741: -1- AC_CONFIG_FILES([demos/calc/calc-config.h:demos/calc/calc-config-h.in]) +-m4trace:configure.ac:3747: -1- AC_SUBST([LIBCURSES]) +-m4trace:configure.ac:3747: -1- AC_SUBST_TRACE([LIBCURSES]) +-m4trace:configure.ac:3747: -1- m4_pattern_allow([^LIBCURSES$]) +-m4trace:configure.ac:3759: -1- AC_SUBST([WITH_READLINE_01], [1]) +-m4trace:configure.ac:3759: -1- AC_SUBST_TRACE([WITH_READLINE_01]) +-m4trace:configure.ac:3759: -1- m4_pattern_allow([^WITH_READLINE_01$]) +-m4trace:configure.ac:3760: -1- AC_SUBST([LIBREADLINE], [-lreadline]) +-m4trace:configure.ac:3760: -1- AC_SUBST_TRACE([LIBREADLINE]) +-m4trace:configure.ac:3760: -1- m4_pattern_allow([^LIBREADLINE$]) +-m4trace:configure.ac:3764: -1- AC_SUBST([YACC]) +-m4trace:configure.ac:3764: -1- AC_SUBST_TRACE([YACC]) +-m4trace:configure.ac:3764: -1- m4_pattern_allow([^YACC$]) +-m4trace:configure.ac:3764: -1- AC_SUBST([YACC]) +-m4trace:configure.ac:3764: -1- AC_SUBST_TRACE([YACC]) +-m4trace:configure.ac:3764: -1- m4_pattern_allow([^YACC$]) +-m4trace:configure.ac:3764: -1- AC_SUBST([YFLAGS]) +-m4trace:configure.ac:3764: -1- AC_SUBST_TRACE([YFLAGS]) +-m4trace:configure.ac:3764: -1- m4_pattern_allow([^YFLAGS$]) +-m4trace:configure.ac:3765: -1- AC_SUBST([LEX]) +-m4trace:configure.ac:3765: -1- AC_SUBST_TRACE([LEX]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^LEX$]) +-m4trace:configure.ac:3765: -1- AC_SUBST([LEX_OUTPUT_ROOT], [$ac_cv_prog_lex_root]) +-m4trace:configure.ac:3765: -1- AC_SUBST_TRACE([LEX_OUTPUT_ROOT]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^LEX_OUTPUT_ROOT$]) +-m4trace:configure.ac:3765: -1- AC_SUBST([LEXLIB]) +-m4trace:configure.ac:3765: -1- AC_SUBST_TRACE([LEXLIB]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^LEXLIB$]) +-m4trace:configure.ac:3765: -1- AC_DEFINE_TRACE_LITERAL([YYTEXT_POINTER]) +-m4trace:configure.ac:3765: -1- m4_pattern_allow([^YYTEXT_POINTER$]) +-m4trace:configure.ac:3765: -1- AH_OUTPUT([YYTEXT_POINTER], [/* Define to 1 if `lex\' declares `yytext\' as a `char *\' by default, not a +- `char@<:@@:>@\'. */ +-@%:@undef YYTEXT_POINTER]) +-m4trace:configure.ac:3774: -1- AC_SUBST([RANLIB]) +-m4trace:configure.ac:3774: -1- AC_SUBST_TRACE([RANLIB]) +-m4trace:configure.ac:3774: -1- m4_pattern_allow([^RANLIB$]) +-m4trace:configure.ac:3784: -1- AC_CONFIG_FILES([Makefile \ +- mpf/Makefile mpn/Makefile mpq/Makefile \ +- mpz/Makefile printf/Makefile scanf/Makefile rand/Makefile cxx/Makefile \ +- tests/Makefile tests/devel/Makefile \ +- tests/mpf/Makefile tests/mpn/Makefile tests/mpq/Makefile \ +- tests/mpz/Makefile tests/rand/Makefile tests/misc/Makefile \ +- tests/cxx/Makefile \ +- doc/Makefile tune/Makefile \ +- demos/Makefile demos/calc/Makefile demos/expr/Makefile \ +- gmp.h:gmp-h.in]) +-m4trace:configure.ac:3784: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments. +-You should run autoupdate.], []) +-m4trace:configure.ac:3784: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +-m4trace:configure.ac:3784: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([LTLIBOBJS]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^LTLIBOBJS$]) +-m4trace:configure.ac:3784: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +-m4trace:configure.ac:3784: -1- AC_SUBST([am__EXEEXT_TRUE]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +-m4trace:configure.ac:3784: -1- AC_SUBST([am__EXEEXT_FALSE]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) +-m4trace:configure.ac:3784: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +-m4trace:configure.ac:3784: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +-m4trace:configure.ac:3784: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([top_builddir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([top_build_prefix]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([srcdir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([abs_srcdir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([top_srcdir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([abs_top_srcdir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([builddir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([abs_builddir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([abs_top_builddir]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([INSTALL]) +-m4trace:configure.ac:3784: -1- AC_SUBST_TRACE([MKDIR_P]) +-m4trace:configure.ac:3784: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) +--- /dev/null ++++ gcl-2.6.12/info/chap-1.texi +@@ -0,0 +1,2778 @@ ++ ++ ++@node Introduction (Introduction), Syntax, Top, Top ++@chapter Introduction ++ ++@menu ++* Scope:: ++* Organization of the Document:: ++* Referenced Publications:: ++* Definitions:: ++* Conformance:: ++* Language Extensions:: ++* Language Subsets:: ++* Deprecated Language Features:: ++* Symbols in the COMMON-LISP Package:: ++@end menu ++ ++@node Scope, Organization of the Document, Introduction (Introduction), Introduction (Introduction) ++@section Scope, Purpose, and History ++ ++@c including concept-history ++ ++@menu ++* Scope and Purpose:: ++* History:: ++@end menu ++ ++@node Scope and Purpose, History, Scope, Scope ++@subsection Scope and Purpose ++ ++The specification set forth in this document is designed to promote ++the portability of @r{Common Lisp} programs among a variety of data processing ++systems. It is a language specification aimed at an audience of ++implementors and knowledgeable programmers. It is neither a tutorial nor ++an implementation guide. ++ ++@node History, , Scope and Purpose, Scope ++@subsection History ++ ++Lisp is a family of languages with a long history. Early key ideas in ++Lisp were developed by John McCarthy during the 1956 Dartmouth Summer ++Research Project on Artificial Intelligence. McCarthy's motivation ++was to develop an algebraic list processing language for artificial ++intelligence work. ++Implementation efforts for early dialects of Lisp were undertaken on ++the IBM~704, the IBM~7090, the Digital Equipment Corporation (DEC) PDP-1, ++the DEC~PDP-6, and the PDP-10. The primary dialect of Lisp between ++1960 and 1965 was Lisp~1.5. By the early 1970's there were two ++predominant dialects of Lisp, both arising from these early efforts: ++MacLisp and Interlisp. ++For further information about very early Lisp dialects, ++see @b{The Anatomy of Lisp} or @b{Lisp 1.5 Programmer's Manual}. ++ ++MacLisp improved on the Lisp~1.5 notion of special variables and error ++handling. MacLisp also introduced the concept of functions that could take ++a variable number of arguments, macros, arrays, non-local dynamic ++exits, fast arithmetic, the first good Lisp compiler, and an emphasis ++on execution speed. ++By the end of the 1970's, MacLisp was in use at over 50 sites. ++For further information about Maclisp, ++see @b{Maclisp Reference Manual, Revision~0} or @b{The Revised Maclisp Manual}. ++ ++Interlisp introduced many ideas into Lisp programming environments and ++methodology. One of the Interlisp ideas that influenced @r{Common Lisp} was an iteration ++construct implemented by Warren Teitelman that inspired the @b{loop} ++macro used both on the Lisp Machines and in MacLisp, and now in @r{Common Lisp}. ++For further information about Interlisp, ++see @b{Interlisp Reference Manual}. ++ ++Although the first implementations of Lisp were on the IBM~704 and the ++IBM~7090, later work focussed on the DEC ++PDP-6 and, later, PDP-10 computers, the latter being the mainstay of ++Lisp and artificial intelligence work at such places as ++Massachusetts Institute of Technology (MIT), Stanford University, ++and ++Carnegie Mellon University (CMU) from the mid-1960's through much of the 1970's. ++The PDP-10 computer and its predecessor the PDP-6 computer were, by ++design, especially well-suited to Lisp because they had 36-bit words ++and 18-bit addresses. This architecture allowed a @i{cons} cell to be ++stored in one word; single instructions could extract the ++@i{car} and @i{cdr} ++parts. The PDP-6 and PDP-10 had fast, powerful stack instructions ++that enabled fast function calling. ++But the limitations of the PDP-10 were evident by 1973: it supported a ++small number of researchers using Lisp, and the small, 18-bit address ++space (2^18 = 262,144 words) limited the size of a single ++program. ++One response to the address space problem was the Lisp Machine, a ++special-purpose computer designed to run Lisp programs. The other ++response was to use general-purpose computers with address spaces ++larger than 18~bits, such as the DEC VAX and ++the S-1~Mark~IIA. ++For further information about S-1 Common Lisp, see @b{S-1 Common Lisp Implementation}. ++ ++The Lisp machine concept was developed in the late 1960's. In the ++early 1970's, Peter Deutsch, working with ++Daniel Bobrow, implemented a Lisp on the ++Alto, a single-user minicomputer, using microcode to interpret a ++byte-code implementation language. Shortly thereafter, Richard ++Greenblatt began work on a different hardware and instruction set ++design at MIT. ++Although the Alto was not a total success as a Lisp machine, a dialect ++of Interlisp known as Interlisp-D became available on the D-series ++machines manufactured by Xerox---the Dorado, Dandelion, ++Dandetiger, and Dove (or Daybreak). ++An upward-compatible extension of MacLisp called Lisp ++Machine Lisp became available on the early MIT Lisp Machines. ++Commercial Lisp machines from Xerox, Lisp Machines (LMI), and ++Symbolics were on the market by 1981. ++For further information about Lisp Machine Lisp, see @b{Lisp Machine Manual}. ++ ++During the late 1970's, Lisp Machine Lisp began to expand towards a ++much fuller language. Sophisticated lambda lists, ++@t{setf}, multiple values, and structures ++like those in @r{Common Lisp} are the results of early ++experimentation with programming styles by the Lisp Machine group. ++Jonl White and others migrated these features to MacLisp. ++Around 1980, Scott Fahlman and others at CMU began work on a Lisp to ++run on the Scientific Personal Integrated Computing ++Environment (SPICE) workstation. One of the goals of the project was to ++design a simpler dialect than Lisp Machine Lisp. ++ ++The Macsyma group at MIT began a project during the late 1970's called ++the New Implementation of Lisp (NIL) for the VAX, which was headed by ++White. One of the stated goals of the NIL project was to fix many of ++the historic, but annoying, problems with Lisp while retaining significant ++compatibility with MacLisp. At about the same time, a research group at ++Stanford University and Lawrence Livermore National Laboratory headed ++by Richard P. Gabriel began the design of a Lisp to run on the ++S-1~Mark~IIA supercomputer. S-1~Lisp, never completely ++functional, was the test bed for adapting advanced compiler techniques ++to Lisp implementation. Eventually the S-1 and NIL groups ++collaborated. ++For further information about the NIL project, ++see @b{NIL---A Perspective}. ++ ++The first effort towards Lisp standardization was made in 1969, ++when Anthony Hearn and Martin Griss at the University of Utah ++defined Standard Lisp---a subset of Lisp~1.5 and other dialects---to ++transport REDUCE, a symbolic algebra system. ++During the 1970's, the Utah group implemented first a retargetable ++optimizing compiler for Standard Lisp, ++and then an extended implementation known as Portable Standard Lisp (PSL). ++By the mid 1980's, PSL ran on about a dozen kinds of computers. ++For further information about Standard Lisp, see @b{Standard LISP Report}. ++ ++PSL and Franz Lisp---a MacLisp-like dialect for Unix machines---were ++the first examples of widely available Lisp dialects on multiple ++hardware platforms. ++ ++One of the most important developments in Lisp occurred during the ++second half of the 1970's: Scheme. Scheme, designed by Gerald J. ++Sussman and Guy L. Steele Jr., is a simple dialect of Lisp whose ++design brought to Lisp some of the ideas from programming language ++semantics developed in the 1960's. Sussman was one of the prime ++innovators behind many other advances in Lisp technology from the late ++1960's through the 1970's. ++The major contributions of Scheme were lexical scoping, lexical ++closures, first-class continuations, and simplified syntax (no ++separation of value cells and function cells). Some of these contributions made ++a large impact on the design of @r{Common Lisp}. ++For further information about Scheme, see @b{IEEE Standard for the Scheme Programming Language} ++or @b{Revised^3 Report on the Algorithmic Language Scheme}. ++ ++In the late 1970's object-oriented programming concepts started to ++make a strong impact on Lisp. ++At MIT, certain ideas from Smalltalk made their way into several ++widely used programming systems. ++Flavors, an object-oriented programming system with multiple inheritance, ++was developed at MIT for the Lisp machine community by Howard Cannon and others. ++At Xerox, the experience with Smalltalk and ++Knowledge Representation Language (KRL) led to the development of ++Lisp Object Oriented Programming System (LOOPS) and later Common LOOPS. ++For further information on Smalltalk, see @b{Smalltalk-80: The Language and its Implementation}. ++For further information on Flavors, see @b{Flavors: A Non-Hierarchical Approach to Object-Oriented Programming}. ++ ++These systems influenced the design of the Common Lisp Object System (CLOS). ++CLOS was developed specifically for this standardization effort, ++and was separately written up in @b{Common Lisp Object System Specification}. ++However, minor details ++of its design have changed slightly since that publication, and that paper ++should not be taken as an authoritative reference to the semantics of the ++object system as described in this document. ++ ++In 1980 Symbolics and LMI were developing Lisp Machine Lisp; stock-hardware ++implementation groups were developing NIL, Franz Lisp, and PSL; Xerox ++was developing Interlisp; and the SPICE project at CMU was developing ++a MacLisp-like dialect of Lisp called SpiceLisp. ++ ++In April 1981, after a DARPA-sponsored meeting concerning the ++splintered Lisp community, Symbolics, the SPICE project, the NIL ++project, and the S-1~Lisp project joined together to define ++@r{Common Lisp}. Initially spearheaded by White and Gabriel, the ++driving force behind this grassroots effort was provided by Fahlman, ++Daniel Weinreb, David Moon, Steele, and Gabriel. ++@r{Common Lisp} was designed as a description of a family of languages. The ++primary influences on @r{Common Lisp} were Lisp Machine Lisp, MacLisp, NIL, ++S-1~Lisp, Spice Lisp, and Scheme. ++@i{Common Lisp: The Language} is a description of that design. Its ++semantics were intentionally underspecified in places where it was ++felt that a tight specification would overly constrain @r{Common Lisp} ++research and use. ++ ++In 1986 X3J13 was formed as a technical working group to ++produce a draft for an ANSI @r{Common Lisp} standard. Because of the ++acceptance of @r{Common Lisp}, the goals of this group differed from those of ++the original designers. These new goals included stricter ++standardization for portability, an object-oriented programming ++system, a condition system, iteration facilities, and a way to handle ++large character sets. To accommodate those ++goals, a new language specification, this ++document, was developed. ++ ++@c end of including concept-history ++ ++@node Organization of the Document, Referenced Publications, Scope, Introduction (Introduction) ++@section Organization of the Document ++ ++@c including concept-organization ++ ++This is a reference document, not a tutorial document. Where possible ++and convenient, the order of presentation has been chosen so that the ++more primitive topics precede those that build upon them; however, ++linear readability has not been a priority. ++ ++This document is divided into chapters by topic. ++Any given chapter might contain conceptual material, dictionary entries, or both. ++ ++@i{Defined names} within the dictionary portion of a chapter are ++grouped in a way that brings related topics into physical proximity. ++Many such groupings were possible, ++and no deep significance should be inferred from the particular grouping that was chosen. ++To see @i{defined names} grouped alphabetically, consult the index. ++For a complete list of @i{defined names}, see @ref{Symbols in the COMMON-LISP Package}. ++ ++In order to compensate for the sometimes-unordered portions of this document, ++a glossary has been provided; see @ref{Glossary}. ++The glossary provides connectivity by providing easy access to ++definitions of terms, and in some cases by providing examples or ++cross references to additional conceptual material. ++ ++For information about notational conventions used in this document, ++see @ref{Definitions}. ++ ++For information about conformance, see @ref{Conformance}. ++ ++For information about extensions and subsets, see @ref{Language Extensions} ++and @ref{Language Subsets}. ++ ++For information about how @i{programs} in the language are parsed by the ++@i{Lisp reader}, see @ref{Syntax}. ++ ++For information about how @i{programs} in the language are @i{compiled} ++and @i{executed}, see @ref{Evaluation and Compilation}. ++ ++For information about data types, see @ref{Types and Classes}. ++Not all @i{types} and @i{classes} are defined in this chapter; ++many are defined in chapter corresponding to their topic--for example, ++the numeric types are defined in @ref{Numbers (Numbers)}. ++For a complete list of @i{standardized} @i{types}, ++see @i{Figure~4--2}. ++ ++For information about general purpose control and data flow, ++see @ref{Data and Control Flow} or @ref{Iteration}. ++ ++@c end of including concept-organization ++ ++@node Referenced Publications, Definitions, Organization of the Document, Introduction (Introduction) ++@section Referenced Publications ++ ++@c including concept-references ++ ++@table @asis ++ ++@item @t{*} ++@b{The Anatomy of Lisp}, ++ John Allen, McGraw-Hill, Inc., 1978. ++ ++@item @t{*} ++@b{The Art of Computer Programming, Volume 3}, ++ Donald E. Knuth, Addison-Wesley Company (Reading, MA), 1973. ++ ++@item @t{*} ++@b{The Art of the Metaobject Protocol}, ++ Kiczales et al., MIT Press (Cambridge, MA), 1991. ++ ++@item @t{*} ++@b{Common Lisp Object System Specification}, ++ D. Bobrow, L. DiMichiel, R.P. Gabriel, S. Keene, G. Kiczales, D. Moon, ++ @i{SIGPLAN Notices} V23, September, 1988. ++ ++@item @t{*} ++@b{Common Lisp: The Language}, ++ Guy L. Steele Jr., Digital Press (Burlington, MA), 1984. ++ ++@item @t{*} ++@b{Common Lisp: The Language, Second Edition}, ++ Guy L. Steele Jr., Digital Press (Bedford, MA), 1990. ++ ++@item @t{*} ++@b{Exceptional Situations in Lisp}, ++ Kent M. Pitman, ++ @i{Proceedings of the First European Conference ++ on the Practical Application of LISP\/} ++ (EUROPAL '90), ++ Churchill College, Cambridge, England, ++ March 27-29, 1990. ++ ++@item @t{*} ++@b{Flavors: A Non-Hierarchical Approach to Object-Oriented Programming}, ++ Howard I. Cannon, 1982. ++ ++@item @t{*} ++@b{IEEE Standard for Binary Floating-Point Arithmetic}, ++ ANSI/IEEE Std 754-1985, ++ Institute of Electrical and Electronics Engineers, Inc. (New York), 1985. ++ ++@item @t{*} ++@b{IEEE Standard for the Scheme Programming Language}, ++ IEEE Std 1178-1990, ++ Institute of Electrical and Electronic Engineers, Inc. (New York), 1991. ++ ++@item @t{*} ++@b{Interlisp Reference Manual}, Third Revision, ++ Teitelman, Warren, et al, ++ Xerox Palo Alto Research Center (Palo Alto, CA), 1978. ++ ++@item @t{*} ++@r{ISO 6937/2}, ++ @i{Information processing---Coded character sets ++ for text communication---Part 2: Latin alphabetic and non-alphabetic ++ graphic characters}, ++ ISO, 1983. ++ ++@item @t{*} ++@b{Lisp 1.5 Programmer's Manual}, ++ John McCarthy, MIT Press (Cambridge, MA), August, 1962. ++ ++@item @t{*} ++@b{Lisp Machine Manual}, ++ D.L. Weinreb and D.A. Moon, ++ Artificial Intelligence Laboratory, MIT (Cambridge, MA), July, 1981. ++ ++@item @t{*} ++@b{Maclisp Reference Manual, Revision~0}, ++ David A. Moon, Project MAC (Laboratory for Computer Science), ++ MIT (Cambridge, MA), March, 1974. ++ ++@item @t{*} ++@b{NIL---A Perspective}, ++ JonL White, @i{Macsyma User's Conference}, 1979. ++ ++@item @t{*} ++@b{Performance and Evaluation of Lisp Programs}, ++ Richard P. Gabriel, MIT Press (Cambridge, MA), 1985. ++ ++@item @t{*} ++@b{Principal Values and Branch Cuts in Complex APL}, ++ Paul Penfield Jr., @i{APL 81 Conference Proceedings}, ++ ACM SIGAPL (San Francisco, September 1981), 248-256. ++ Proceedings published as @i{APL Quote Quad 12}, 1 (September 1981). ++ ++@item @t{*} ++@b{The Revised Maclisp Manual}, ++ Kent M. Pitman, ++ Technical Report 295, ++ Laboratory for Computer Science, MIT (Cambridge, MA), May 1983. ++ ++@item @t{*} ++@b{Revised^3 Report on the Algorithmic Language Scheme}, ++ Jonathan Rees and William Clinger (editors), ++ @i{SIGPLAN Notices} V21, #12, December, 1986. ++ ++@item @t{*} ++@b{S-1 Common Lisp Implementation}, ++ R.A. Brooks, R.P. Gabriel, and G.L. Steele, ++ @i{Conference Record of the 1982 ACM Symposium on Lisp and Functional Programming}, ++ 108-113, 1982. ++ ++@item @t{*} ++@b{Smalltalk-80: The Language and its Implementation}, ++ A. Goldberg and D. Robson, Addison-Wesley, 1983. ++ ++@item @t{*} ++@b{Standard LISP Report}, ++ J.B. Marti, A.C. Hearn, M.L. Griss, and C. Griss, ++ @i{SIGPLAN Notices} V14, #10, October, 1979. ++ ++@item @t{*} ++@b{Webster's Third New International Dictionary ++ the English Language, Unabridged}, ++ Merriam Webster (Springfield, MA), 1986. ++ ++@item @t{*} ++@b{XP: A Common Lisp Pretty Printing System}, ++ R.C. Waters, ++ Memo 1102a, ++ Artificial Intelligence Laboratory, MIT (Cambridge, MA), September 1989. ++ ++@end table ++ ++@c end of including concept-references ++ ++@node Definitions, Conformance, Referenced Publications, Introduction (Introduction) ++@section Definitions ++ ++@c including concept-definitions ++ ++This section contains notational conventions and definitions of terms ++used in this manual. ++ ++@menu ++* Notational Conventions:: ++* Error Terminology:: ++* Sections Not Formally Part Of This Standard:: ++* Interpreting Dictionary Entries:: ++@end menu ++ ++@node Notational Conventions, Error Terminology, Definitions, Definitions ++@subsection Notational Conventions ++ ++@ITindex notation ++ ++The following notational conventions are used throughout this document. ++ ++@menu ++* Font Key:: ++* Modified BNF Syntax:: ++* Splicing in Modified BNF Syntax:: ++* Indirection in Modified BNF Syntax:: ++* Additional Uses for Indirect Definitions in Modified BNF Syntax:: ++* Special Symbols:: ++* Objects with Multiple Notations:: ++* Case in Symbols:: ++* Numbers (Objects with Multiple Notations):: ++* Use of the Dot Character:: ++* NIL:: ++* Designators:: ++* Nonsense Words:: ++@end menu ++ ++@node Font Key, Modified BNF Syntax, Notational Conventions, Notational Conventions ++@subsubsection Font Key ++ ++@ITindex font key ++ ++Fonts are used in this document to convey information. ++ ++@table @asis ++ ++@item @i{name} ++Denotes a formal term whose meaning is defined in the Glossary. ++When this font is used, the Glossary definition takes precedence ++over normal English usage. ++ ++Sometimes a glossary term appears subscripted, ++as in ``@i{whitespace}_2.'' ++Such a notation selects one particular Glossary definition out of several, ++in this case the second. ++The subscript notation for Glossary terms is generally used where the ++context might be insufficient to disambiguate among the available definitions. ++ ++@item @i{name} ++@IGindex name ++ ++Denotes the introduction of a formal term locally to the current text. ++There is still a corresponding glossary entry, and is formally equivalent ++to a use of ``@i{name},'' but the hope is that making such uses ++conspicuous will save the reader a trip to the glossary in some cases. ++ ++@item @b{name} ++Denotes a symbol in the @t{COMMON-LISP} @i{package}. ++For information about @i{case} conventions, ++see @ref{Case in Symbols}. ++ ++@item @t{name} ++Denotes a sample @i{name} or piece of @i{code} that a programmer ++might write in @r{Common Lisp}. ++ ++This font is also used for certain @i{standardized} names that are not ++names of @i{external symbols} of the @t{COMMON-LISP} @i{package}, ++such as @i{keywords}_1, ++ @i{package} @i{names}, ++ and @i{loop keywords}. ++ ++@item @i{name} ++Denotes the name of a @i{parameter} or @i{value}. ++ ++In some situations the notation ``<<@i{name}>>'' (@i{i.e.}, the same font, ++but with surrounding ``angle brackets'') is used instead in order to ++provide better visual separation from surrounding characters. These ++``angle brackets'' are metasyntactic, and never actually appear in program ++input or output. ++ ++@end table ++ ++@node Modified BNF Syntax, Splicing in Modified BNF Syntax, Font Key, Notational Conventions ++@subsubsection Modified BNF Syntax ++ ++@ITindex bnf key ++ ++This specification uses an extended Backus Normal Form (BNF) to ++describe the syntax of @r{Common Lisp} @i{macro forms} and @i{special forms}. ++This section discusses the syntax of BNF expressions. ++ ++@node Splicing in Modified BNF Syntax, Indirection in Modified BNF Syntax, Modified BNF Syntax, Notational Conventions ++@subsubsection Splicing in Modified BNF Syntax ++ ++The primary extension used is the following: ++ ++@center [[O]] ++ ++An expression of this form appears whenever a list of elements is ++to be spliced into a larger structure and the elements can appear in ++any order. The symbol O represents a description of the syntax of ++some number of syntactic elements to be spliced; that description must ++be of the form ++ ++@center O_1 | ... | O_l ++ ++@noindent ++where each O_i can be of the form S or of ++the form S@r{*} or of the form S^1. ++ ++The expression [[O]] means that a list of the form ++ ++@center (O_@{i_1@}... O_@{i_j@}) 1<= j ++ ++@noindent ++is spliced into the enclosing expression, ++such that if n != m and 1<= n,m<= j, ++then either O_@{i_n@}!= O_@{i_m@} ++ or O_@{i_n@} = O_@{i_m@} = Q_k, ++where for some 1<= k <= n, O_k is of the form Q_k@r{*}. ++ ++Furthermore, for each O_@{i_n@} that is of the form Q_k^1, ++that element is required to appear somewhere in the list to be spliced. ++ ++For example, the expression ++ ++@t{(x [[A | B@r{*} | C]] y)} ++ ++@noindent ++means that at most one @t{A}, any number of @t{B}'s, and ++at most one @t{C} can occur in any order. ++It is a description of any of these: ++ ++@example ++ (x y) ++ (x B A C y) ++ (x A B B B B B C y) ++ (x C B A B B B y) ++@end example ++ ++@noindent ++but not any of these: ++ ++@example ++ (x B B A A C C y) ++ (x C B C y) ++@end example ++ ++@noindent ++In the first case, both @t{A} and @t{C} appear too often, ++and in the second case @t{C} appears too often. ++ ++The notation [[O_1 | O_2 | ...]]^+ ++adds the additional restriction that at least one item from among the possible ++choices must be used. For example: ++ ++@t{(x [[A | B@r{*} | C]]^+ y)} ++ ++@noindent ++means that at most one @t{A}, any number of @t{B}'s, and ++at most one @t{C} can occur in any order, but that in any case at least ++one of these options must be selected. ++It is a description of any of these: ++ ++@example ++ (x B y) ++ (x B A C y) ++ (x A B B B B B C y) ++ (x C B A B B B y) ++@end example ++ ++@noindent ++but not any of these: ++ ++@example ++ (x y) ++ (x B B A A C C y) ++ (x C B C y) ++@end example ++ ++@noindent ++In the first case, no item was used; ++in the second case, both @t{A} and @t{C} appear too often; ++and in the third case @t{C} appears too often. ++ ++Also, the expression: ++ ++@t{(x [[A^1 | B^1 | C]] y)} ++ ++@noindent ++can generate exactly these and no others: ++ ++@example ++ (x A B C y) ++ (x A C B y) ++ (x A B y) ++ (x B A C y) ++ (x B C A y) ++ (x B A y) ++ (x C A B y) ++ (x C B A y) ++@end example ++ ++@node Indirection in Modified BNF Syntax, Additional Uses for Indirect Definitions in Modified BNF Syntax, Splicing in Modified BNF Syntax, Notational Conventions ++@subsubsection Indirection in Modified BNF Syntax ++ ++An indirection extension is introduced in order to make this ++new syntax more readable: ++ ++@center !@i{O} ++ ++@noindent ++If @i{O} is a non-terminal symbol, the right-hand side ++of its definition is substituted for the entire expression ++!@i{O}. For example, the following BNF is equivalent to ++the BNF in the previous example: ++ ++@t{(x [[!@i{O}]] y)} ++ ++@w{@i{O} ::=@t{A} | @t{B}@r{*} | @t{C}} ++ ++@node Additional Uses for Indirect Definitions in Modified BNF Syntax, Special Symbols, Indirection in Modified BNF Syntax, Notational Conventions ++@subsubsection Additional Uses for Indirect Definitions in Modified BNF Syntax ++ ++In some cases, an auxiliary definition in the BNF might appear to be unused ++within the BNF, but might still be useful elsewhere. For example, consider the ++following definitions: ++ ++@code{case} @i{keyform @{!@i{normal-clause}@}* @r{[}!@i{otherwise-clause}@r{]}} @result{} @i{@{@i{result}@}*} ++ ++@code{ccase} @i{keyplace @{!@i{normal-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@code{ecase} @i{keyform @{!@i{normal-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{normal-clause} ::=@r{(}keys @{@i{form}@}*@r{)}} ++ ++@w{@i{otherwise-clause} ::=@r{(}@{otherwise | t@} @{@i{form}@}*@r{)}} ++ ++@w{@i{clause} ::=normal-clause | otherwise-clause} ++ ++Here the term ``@i{clause}'' might appear to be ``dead'' in that it ++is not used in the BNF. However, the purpose of the BNF is not just to guide parsing, ++but also to define useful terms for reference in the descriptive text which follows. ++As such, the term ``@i{clause}'' might appear in text that follows, ++as shorthand for ``@i{normal-clause} or @i{otherwise-clause}.'' ++ ++@node Special Symbols, Objects with Multiple Notations, Additional Uses for Indirect Definitions in Modified BNF Syntax, Notational Conventions ++@subsubsection Special Symbols ++ ++The special symbols described here are used as a notational convenience ++within this document, and are part of neither the @r{Common Lisp} language nor ++its environment. ++ ++@table @asis ++ ++@item @result{} ++This indicates evaluation. ++For example: ++ ++@example ++ (+ 4 5) @result{} 9 ++@end example ++ ++This means that the result of ++evaluating the @i{form} @t{(+ 4 5)} is @t{9}. ++ ++If a @i{form} returns @i{multiple values}, those values might ++be shown separated by spaces, line breaks, or commas. ++For example: ++ ++@example ++ (truncate 7 5) ++@result{} 1 2 ++ (truncate 7 5) ++@result{} 1 ++ 2 ++ (truncate 7 5) ++@result{} 1, 2 ++@end example ++ ++Each of the above three examples is equivalent, and specifies ++that @t{(truncate 7 5)} returns two values, which are @t{1} and @t{2}. ++ ++Some @i{conforming implementations} actually type an arrow (or some ++other indicator) before showing return values, while others do not. ++ ++@item @i{OR}@result{} ++The notation ``@i{OR}@result{}'' is used to denote one of several possible ++alternate results. The example ++ ++@example ++ (char-name #\a) ++@result{} NIL ++@i{OR}@result{} "LOWERCASE-a" ++@i{OR}@result{} "Small-A" ++@i{OR}@result{} "LA01" ++@end example ++ ++indicates that @b{nil}, @t{"LOWERCASE-a"}, @t{"Small-A"}, @t{"LA01"} are ++among the possible results of @t{(char-name #\a)}---each with equal preference. ++Unless explicitly specified otherwise, it should not be assumed that the set of possible ++results shown is exhaustive. ++Formally, the above example is equivalent to ++ ++@example ++ (char-name #\a) @result{} @i{implementation-dependent} ++@end example ++ ++but it is intended to provide additional information to illustrate some ++of the ways in which it is permitted for implementations to diverge. ++ ++@item @i{NOT}@result{} ++The notation ``@i{NOT}@result{}'' is used to denote a result which is not possible. ++This might be used, for example, in order to emphasize a situation where ++some anticipated misconception might lead the reader to falsely believe ++that the result might be possible. For example, ++ ++@example ++ (function-lambda-expression ++ (funcall #'(lambda (x) #'(lambda () x)) nil)) ++@result{} NIL, @i{true}, NIL ++@i{OR}@result{} (LAMBDA () X), @i{true}, NIL ++@i{NOT}@result{} NIL, @i{false}, NIL ++@i{NOT}@result{} (LAMBDA () X), @i{false}, NIL ++@end example ++ ++@item @equiv{} ++This indicates code equivalence. For example: ++ ++@example ++ (gcd x (gcd y z)) @equiv{} (gcd (gcd x y) z) ++@end example ++ ++This means that the results and observable side-effects of evaluating ++the @i{form} ++@t{(gcd x (gcd y z))} are always the same as the results ++and observable side-effects of ++@t{(gcd (gcd x y) z)} for any ++@t{x}, @t{y}, and @t{z}. ++ ++@item @t{ |> } ++@r{Common Lisp} specifies input and output with respect to a non-interactive stream model. ++The specific details of how interactive input and output are mapped onto that ++non-interactive model are @i{implementation-defined}. ++ ++For example, @i{conforming implementations} are permitted to differ in issues ++of how interactive input is terminated. For example, the @i{function} @b{read} ++terminates when the final delimiter is typed on a non-interactive stream. ++In some @i{implementations}, an interactive call to @b{read} returns ++as soon as the final delimiter is typed, even if that delimiter is not a @i{newline}. ++In other @i{implementations}, a final @i{newline} is always required. ++In still other @i{implementations}, there might be a command which ``activates'' ++a buffer full of input without the command itself being visible on the program's ++input stream. ++ ++In the examples in this document, the notation ``@t{ |> }'' precedes ++lines where interactive input and output occurs. Within such a scenario, ++``@b{|>>}@t{this notation}@b{<<|}'' notates user input. ++ ++For example, the notation ++ ++@example ++ (+ 1 (print (+ (sqrt (read)) (sqrt (read))))) ++@t{ |> } @b{|>>}@t{9 16 }@b{<<|} ++@t{ |> } 7 ++@result{} 8 ++@end example ++ ++shows an interaction in which ++ ``@t{(+ 1 (print (+ (sqrt (read)) (sqrt (read)))))}'' ++ is a @i{form} to be @i{evaluated}, ++ ``@t{9 16 }'' is interactive input, ++ ``@t{7}'' is interactive output, and ++ ``@t{8}'' is the @i{value} @i{yielded} from the @i{evaluation}. ++ ++The use of this notation is intended to disguise small differences ++in interactive input and output behavior between @i{implementations}. ++ ++Sometimes, the non-interactive stream model calls for a @i{newline}. ++How that @i{newline} character is interactively entered is an ++@i{implementation-defined} detail of the user interface, but in that ++case, either the notation ``<@i{Newline}>'' or ``@i{[<--}~]'' might be used. ++ ++@example ++ (progn (format t "~&Who? ") (read-line)) ++@t{ |> } Who? @b{|>>}@t{Fred, Mary, and Sally @i{[<--}~]}@b{<<|} ++@result{} "Fred, Mary, and Sally", @i{false} ++@end example ++ ++@end table ++ ++@node Objects with Multiple Notations, Case in Symbols, Special Symbols, Notational Conventions ++@subsubsection Objects with Multiple Notations ++ ++Some @i{objects} in @r{Common Lisp} can be notated in more than one way. ++In such situations, the choice of which notation to use is technically arbitrary, ++but conventions may exist which convey a ``point of view'' or ``sense of intent.'' ++ ++@node Case in Symbols, Numbers (Objects with Multiple Notations), Objects with Multiple Notations, Notational Conventions ++@subsubsection Case in Symbols ++ ++@ITindex case in symbol names ++ ++While @i{case} is significant in the process of @i{interning} a @i{symbol}, ++the @i{Lisp reader}, by default, attempts to canonicalize the case of a ++@i{symbol} prior to interning; see @ref{Effect of Readtable Case on the Lisp Reader}. ++As such, case in @i{symbols} is not, by default, significant. ++Throughout this document, except as explicitly noted otherwise, ++the case in which a @i{symbol} appears is not significant; ++that is, @t{HELLO}, @t{Hello}, @t{hElLo}, and @t{hello} are ++all equivalent ways to denote a symbol whose name is @t{"HELLO"}. ++ ++The characters @i{backslash} and @i{vertical-bar} are used to explicitly ++quote the @i{case} and other parsing-related ++aspects ++of characters. As such, ++the notations @t{|hello|} and @t{\h\e\l\l\o} are equivalent ways ++to refer to a symbol whose name is @t{"hello"}, and which is @i{distinct} from ++any symbol whose name is @t{"HELLO"}. ++ ++The @i{symbols} that correspond to @r{Common Lisp} @i{defined names} ++have @i{uppercase} names even though their names generally appear ++in @i{lowercase} in this document. ++ ++@node Numbers (Objects with Multiple Notations), Use of the Dot Character, Case in Symbols, Notational Conventions ++@subsubsection Numbers ++ ++Although @r{Common Lisp} provides a variety of ways for programs to manipulate the ++input and output radix for rational numbers, all numbers in this document ++are in decimal notation unless explicitly noted otherwise. ++ ++@node Use of the Dot Character, NIL, Numbers (Objects with Multiple Notations), Notational Conventions ++@subsubsection Use of the Dot Character ++ ++The dot appearing by itself in an @i{expression} such as ++ ++@t{(@i{item1} @i{item2} @t{.} @i{tail})} ++ ++means that @i{tail} represents a @i{list} of @i{objects} ++at the end of a list. For example, ++ ++@t{(A B C @t{.} (D E F))} ++ ++is notationally equivalent to: ++ ++@t{(A B C D E F)} ++ ++Although @i{dot} is a valid constituent character in a symbol, no ++@i{standardized} @i{symbols} contain the character @i{dot}, ++so a period that follows a reference to a @i{symbol} at the end of ++a sentence in this document should always be interpreted as a period ++and never as part of the @i{symbol}'s @i{name}. ++For example, within this document, a sentence such as ++ ``This sample sentence refers to the symbol @b{car}.'' ++refers to a symbol whose name is @t{"CAR"} (with three letters), ++and never to a four-letter symbol @t{"CAR."} ++ ++@node NIL, Designators, Use of the Dot Character, Notational Conventions ++@subsubsection NIL ++ ++@IGindex nil ++ ++@IGindex () ++ ++@IRindex nil ++ ++@b{nil} has a variety of meanings. ++It is a @i{symbol} in the @t{COMMON-LISP} @i{package} with the @i{name} @t{"NIL"}, ++it is @i{boolean} (and @i{generalized boolean}) @i{false}, ++it is the @i{empty list}, ++and it is the @i{name} of the @i{empty type} (a @i{subtype} of all @i{types}). ++ ++Within @r{Common Lisp}, @b{nil} can be notated interchangeably as either @t{NIL} or @t{()}. ++By convention, the choice of notation offers a hint as to which of its many ++roles it is playing. ++ ++@format ++@group ++@noindent ++@w{ @b{For Evaluation?} @b{Notation} @b{Typically Implied Role} } ++@w{ ________________________________________________________} ++@w{ Yes @t{nil} use as a @i{boolean}. } ++@w{ Yes @t{'nil} use as a @i{symbol}. } ++@w{ Yes @t{'()} use as an @i{empty list} } ++@w{ No @t{nil} use as a @i{symbol} or @i{boolean}. } ++@w{ No @t{()} use as an @i{empty list}. } ++ ++@noindent ++@w{ Figure 1--1: Notations for NIL } ++ ++@end group ++@end format ++ ++Within this document only, @b{nil} is also sometimes notated as @i{false} to ++emphasize its role as a @i{boolean}. ++ ++For example: ++ ++@example ++ (print ()) ;avoided ++ (defun three nil 3) ;avoided ++ '(nil nil) ;list of two symbols ++ '(() ()) ;list of empty lists ++ (defun three () 3) ;Emphasize empty parameter list. ++ (append '() '()) @result{} () ;Emphasize use of empty lists ++ (not nil) @result{} @i{true} ;Emphasize use as Boolean false ++ (get 'nil 'color) ;Emphasize use as a symbol ++@end example ++ ++A @i{function} is sometimes said to ``be @i{false}'' or ``be @i{true}'' ++in some circumstance. ++Since no @i{function} object can be the same as @b{nil} ++and all @i{function} @i{objects} represent @i{true} when viewed as @i{booleans}, ++it would be meaningless to say that the @i{function} was literally @i{false} ++and uninteresting to say that it was literally @i{true}. ++Instead, these phrases are just traditional alternative ways of saying that the ++@i{function} ``returns @i{false}'' or ``returns @i{true},'' respectively. ++ ++@node Designators, Nonsense Words, NIL, Notational Conventions ++@subsubsection Designators ++ ++A @i{designator} ++@IGindex designator ++ is an @i{object} that denotes another @i{object}. ++ ++Where a @i{parameter} of an @i{operator} is described as a @i{designator}, ++the description of the @i{operator} is written in a way that assumes that ++the value of the @i{parameter} is the denoted @i{object}; ++that is, that the @i{parameter} is already of the denoted @i{type}. ++(The specific nature of the @i{object} denoted by ++ a ``<<@i{type}>> @i{designator}'' ++or a ``@i{designator} for a <<@i{type}>>'' ++can be found in the Glossary entry for ``<<@i{type}>> @i{designator}.'') ++ ++For example, ``@b{nil}'' and ``the @i{value} of @b{*standard-output*}'' are operationally ++indistinguishable as @i{stream designators}. Similarly, ++the @i{symbol} @t{foo} and the @i{string} @t{"FOO"} ++are operationally indistinguishable as @i{string designators}. ++ ++Except as otherwise noted, in a situation where the denoted @i{object} ++might be used multiple times, it is @i{implementation-dependent} ++whether the @i{object} is coerced only once or whether the coercion occurs ++each time the @i{object} must be used. ++ ++For example, @b{mapcar} receives a @i{function designator} as an argument, ++and its description is written as if this were simply a function. In fact, it ++is @i{implementation-dependent} whether the @i{function designator} is ++coerced right away or whether it is carried around internally in the form that ++it was given as an @i{argument} and re-coerced each time it is needed. In most ++cases, @i{conforming programs} cannot detect the distinction, but there are some ++pathological situations (particularly those involving self-redefining or ++mutually-redefining functions) which do conform and which can detect this difference. ++The following program is a @i{conforming program}, but might or might not have ++portably correct results, depending on whether its correctness depends on one or ++the other of the results: ++ ++@example ++ (defun add-some (x) ++ (defun add-some (x) (+ x 2)) ++ (+ x 1)) @result{} ADD-SOME ++ (mapcar 'add-some '(1 2 3 4)) ++@result{} (2 3 4 5) ++@i{OR}@result{} (2 4 5 6) ++@end example ++ ++In a few rare situations, there may be a need in a dictionary entry ++to refer to the @i{object} that was the original @i{designator} ++for a @i{parameter}. ++Since naming the @i{parameter} would refer to the denoted @i{object}, ++the phrase ``the <<@i{parameter-name}>> @i{designator}'' ++can be used to refer to the @i{designator} which was the @i{argument} ++from which the @i{value} of <<@i{parameter-name}>> was computed. ++ ++@node Nonsense Words, , Designators, Notational Conventions ++@subsubsection Nonsense Words ++ ++@ICindex foo ++ ++@ICindex bar ++ ++@ICindex baz ++ ++@ICindex quux ++ ++When a word having no pre-attached semantics is required (@i{e.g.}, in an ++example), it is common in the Lisp community to use one of the words ++``foo,'' ``bar,'' ``baz,'' and ``quux.'' For example, in ++ ++@example ++ (defun foo (x) (+ x 1)) ++@end example ++ ++the use of the name @t{foo} is just a shorthand way of saying ++``please substitute your favorite name here.'' ++ ++These nonsense words have gained such prevalance of usage, that it is ++commonplace for newcomers to the community to begin to wonder if there ++is an attached semantics which they are overlooking---there is not. ++ ++@node Error Terminology, Sections Not Formally Part Of This Standard, Notational Conventions, Definitions ++@subsection Error Terminology ++ ++@IGindex error terminology ++ ++Situations in which errors might, should, or must be signaled are described ++in the standard. The wording used to describe such situations is intended ++to have precise meaning. The following list is a glossary of those meanings. ++ ++@table @asis ++ ++@item @b{Safe code} ++ ++@IGindex safe ++ ++This is @i{code} processed with the @b{safety} optimization ++at its highest setting (@t{3}). @b{safety} is a lexical property ++of code. The phrase ``the function @t{F} should signal an error'' ++means that if @t{F} is invoked from code processed with the highest ++@b{safety} optimization, an error is signaled. ++It is @i{implementation-dependent} whether @t{F} or the calling ++code signals the error. ++ ++@item @b{Unsafe code} ++ ++@IGindex unsafe ++ ++This is code processed with lower safety levels. ++ ++Unsafe code might do error checking. Implementations are permitted to ++treat all code as safe code all the time. ++ ++@item @b{An error is signaled} ++ ++@IGindex signal ++ ++@ITindex is signaled ++ ++@ITindex must signal ++ ++This means that an error is signaled in both safe and unsafe code. ++@i{Conforming code} may rely on the fact that the error is signaled ++in both safe and unsafe code. Every implementation is required to ++detect the error in both safe and unsafe code. For example, ``an error ++is signaled if @b{unexport} is given a @i{symbol} ++not @i{accessible} in the @i{current package}.'' ++ ++If an explicit error type is not specified, the default is @b{error}. ++ ++@item @b{An error should be signaled} ++ ++@IGindex signal ++ ++@ITindex should signal ++ ++This means that an error is signaled in safe code, and an error ++might be signaled in unsafe code. @i{Conforming code} may rely on the ++fact that the error is signaled in safe code. Every ++implementation is required to detect the error at least in safe code. ++When the error is not signaled, the ``consequences are undefined'' ++(see below). For example, ``@b{+} should signal an error of @i{type} @b{type-error} ++if any argument is not of @i{type} @b{number}.'' ++ ++@item @b{Should be prepared to signal an error} ++ ++@IGindex signal ++ ++@ITindex prepared to signal ++ ++This is similar to ``should be signaled'' except that it does not ++imply that `extra effort' has to be taken on the part of an @i{operator} ++to discover an erroneous situation if the normal action of that @i{operator} ++can be performed successfully with only `lazy' checking. ++An @i{implementation} is always permitted to signal an error, ++but even in @i{safe} @i{code}, it is only required to signal the error ++when failing to signal it might lead to incorrect results. ++In @i{unsafe} @i{code}, the consequences are undefined. ++ ++For example, defining that ++ ``@b{find} should be prepared to signal an error of @i{type} @b{type-error} ++ if its second @i{argument} is not a @i{proper list}'' ++does not imply that an error is always signaled. The @i{form} ++ ++@example ++ (find 'a '(a b . c)) ++@end example ++ ++must either signal an error of @i{type} @b{type-error} in @i{safe} @i{code}, ++else return @t{A}. ++In @i{unsafe} @i{code}, the consequences are undefined. ++By contrast, ++ ++@example ++ (find 'd '(a b . c)) ++@end example ++ ++must signal an error of @i{type} @b{type-error} in @i{safe} @i{code}. ++In @i{unsafe} @i{code}, the consequences are undefined. ++Also, ++ ++@example ++ (find 'd '#1=(a b . #1#)) ++@end example ++ ++in @i{safe code} ++ might return @b{nil} (as an @i{implementation-defined} extension), ++ might never return, ++or might signal an error of @i{type} @b{type-error}. ++In @i{unsafe} @i{code}, the consequences are undefined. ++ ++Typically, the ``should be prepared to signal'' terminology is used in ++type checking situations where there are efficiency considerations that ++make it impractical to detect errors that are not relevant to the ++correct operation of the @i{operator}. ++ ++@item @b{The consequences are unspecified} ++ ++@ITindex consequences ++ ++@ITindex unspecified consequences ++ ++This means that the consequences are unpredictable but harmless. ++Implementations are permitted to specify the consequences of this ++situation. No @i{conforming code} may depend on the results or effects of ++this situation, and all @i{conforming code} is required to treat the ++results and effects of this situation as unpredictable but harmless. ++For example, ``if the second argument to @b{shared-initialize} ++specifies a name that does not correspond to any @i{slots} ++@i{accessible} in the @i{object}, the results are unspecified.'' ++ ++@item @b{The consequences are undefined} ++ ++@ITindex consequences ++ ++@ITindex undefined consequences ++ ++This means that the consequences are unpredictable. The consequences ++may range from harmless to fatal. No @i{conforming code} may depend on ++the results or effects. @i{Conforming code} must treat the consequences as ++unpredictable. In places where the words ``must,'' ``must not,'' or ++``may not'' are used, then ``the consequences are undefined'' if the ++stated requirement is not met and no specific consequence is ++explicitly stated. An implementation is permitted to signal an error ++in this case. ++ ++For example: ``Once a name has been declared by @b{defconstant} ++to be constant, any further assignment or binding of that ++variable has undefined consequences.'' ++ ++@item @b{An error might be signaled} ++ ++@IGindex signal ++ ++@ITindex might signal ++ ++This means that the situation has undefined consequences; ++however, if an error is signaled, it is of the specified @i{type}. ++For example, ``@b{open} might signal an error of @i{type} @b{file-error}.'' ++ ++@item @b{The return values are unspecified} ++ ++@ITindex unspecified values ++ ++This means that only the number and nature of the return values of a ++@i{form} are not specified. However, the issue of whether or not ++any side-effects or transfer of control occurs is still well-specified. ++ ++A program can be well-specified even if it uses a function whose ++returns values are unspecified. For example, even if the return ++values of some function @t{F} are unspecified, an expression such as ++@t{(length (list (F)))} is still well-specified because it does not ++rely on any particular aspect of the value or values returned by @t{F}. ++ ++@item @b{Implementations may be extended to cover this situation} ++ ++@ITindex extensions ++ ++This means that the @i{situation} has undefined consequences; ++however, a @i{conforming implementation} is free to treat ++the situation in a more specific way. ++For example, an @i{implementation} might define ++ that an error is signaled, ++ or that an error should be signaled, ++ or even that a certain well-defined non-error behavior occurs. ++ ++No @i{conforming code} may depend on the consequences of such a @i{situation}; ++all @i{conforming code} must treat the consequences of the situation ++as undefined. @i{Implementations} are required to document how the ++situation is treated. ++ ++For example, ``implementations may be extended to define other type ++specifiers to have a corresponding @i{class}.'' ++ ++@item @b{Implementations are free to extend the syntax} ++ ++@ITindex extensions ++ ++This means that in this situation implementations are permitted to ++define unambiguous extensions to the syntax of the @i{form} being ++described. No @i{conforming code} may depend on this extension. ++Implementations are required to document each such extension. All ++@i{conforming code} is required to treat the syntax as meaningless. The ++standard might disallow certain extensions while allowing others. For ++example, ``no implementation is free to extend the syntax of ++@b{defclass}.'' ++ ++@item @b{A warning might be issued} ++ ++@ITindex warning ++ ++This means that @i{implementations} are encouraged to issue a warning ++if the context is appropriate (@i{e.g.}, when compiling). However, a ++@i{conforming implementation} is not required to issue a warning. ++ ++@end table ++ ++@node Sections Not Formally Part Of This Standard, Interpreting Dictionary Entries, Error Terminology, Definitions ++@subsection Sections Not Formally Part Of This Standard ++ ++Front matter and back matter, such as the ``Table of Contents,'' ++``Index,'' ``Figures,'' ``Credits,'' and ``Appendix'' are not considered formally ++part of this standard, so that we retain the flexibility needed to update ++these sections even at the last minute without fear of needing a formal ++vote to change those parts of the document. These items are quite short ++and very useful, however, and it is not recommended that they be removed ++even in an abridged version of this document. ++ ++Within the concept sections, subsections whose names begin with ++the words ``Note'' or ``Notes'' or ``Example'' or ``Examples'' ++are provided for illustration purposes only, and are not considered ++part of the standard. ++ ++An attempt has been made to place these sections last in their parent section, ++so that they could be removed without disturbing the contiguous numbering of the ++surrounding sections in order to produce a document of smaller size. ++ ++Likewise, the ``Examples'' and ``Notes'' sections in a dictionary entry ++are not considered part of the standard and could be removed if necessary. ++ ++Nevertheless, the examples provide important clarifications and consistency ++checks for the rest of the material, and such abridging is not recommended ++unless absolutely unavoidable. ++ ++@node Interpreting Dictionary Entries, , Sections Not Formally Part Of This Standard, Definitions ++@subsection Interpreting Dictionary Entries ++ ++The dictionary entry for each @i{defined name} is partitioned into ++sections. Except as explicitly indicated otherwise below, each section ++is introduced by a label identifying that section. The omission of a ++section implies that the section is either not applicable, or would ++provide no interesting information. ++ ++This section defines the significance of each potential section in a ++dictionary entry. ++ ++@menu ++* The "Affected By" Section of a Dictionary Entry:: ++* The "Arguments" Section of a Dictionary Entry:: ++* The "Arguments and Values" Section of a Dictionary Entry:: ++* The "Binding Types Affected" Section of a Dictionary Entry:: ++* The "Class Precedence List" Section of a Dictionary Entry:: ++* Dictionary Entries for Type Specifiers:: ++* The "Compound Type Specifier Kind" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Syntax" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Arguments" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Description" Section of a Dictionary Entry:: ++* The "Constant Value" Section of a Dictionary Entry:: ++* The "Description" Section of a Dictionary Entry:: ++* The "Examples" Section of a Dictionary Entry:: ++* The "Exceptional Situations" Section of a Dictionary Entry:: ++* The "Initial Value" Section of a Dictionary Entry:: ++* The "Argument Precedence Order" Section of a Dictionary Entry:: ++* The "Method Signature" Section of a Dictionary Entry:: ++* The "Name" Section of a Dictionary Entry:: ++* The "Notes" Section of a Dictionary Entry:: ++* The "Pronunciation" Section of a Dictionary Entry:: ++* The "See Also" Section of a Dictionary Entry:: ++* The "Side Effects" Section of a Dictionary Entry:: ++* The "Supertypes" Section of a Dictionary Entry:: ++* The "Syntax" Section of a Dictionary Entry:: ++* Special "Syntax" Notations for Overloaded Operators:: ++* Naming Conventions for Rest Parameters:: ++* Requiring Non-Null Rest Parameters in The "Syntax" Section:: ++* Return values in The "Syntax" Section:: ++* No Arguments or Values in The "Syntax" Section:: ++* Unconditional Transfer of Control in The "Syntax" Section:: ++* The "Valid Context" Section of a Dictionary Entry:: ++* The "Value Type" Section of a Dictionary Entry:: ++@end menu ++ ++@node The "Affected By" Section of a Dictionary Entry, The "Arguments" Section of a Dictionary Entry, Interpreting Dictionary Entries, Interpreting Dictionary Entries ++@subsubsection The "Affected By" Section of a Dictionary Entry ++ ++For an @i{operator}, anything that can affect the side effects of ++or @i{values} returned by the @i{operator}. ++ ++For a @i{variable}, anything that can affect the @i{value} of the @i{variable} ++including @i{functions} that bind or assign it. ++ ++@node The "Arguments" Section of a Dictionary Entry, The "Arguments and Values" Section of a Dictionary Entry, The "Affected By" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Arguments" Section of a Dictionary Entry ++ ++This information describes the syntax information of entries such as those for ++@i{declarations} and special @i{expressions} which are never @i{evaluated} ++as @i{forms}, and so do not return @i{values}. ++ ++@node The "Arguments and Values" Section of a Dictionary Entry, The "Binding Types Affected" Section of a Dictionary Entry, The "Arguments" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Arguments and Values" Section of a Dictionary Entry ++ ++An English language description of what @i{arguments} the @i{operator} accepts ++and what @i{values} it returns, including information about defaults for @i{parameters} ++corresponding to omittable @i{arguments} ++(such as @i{optional parameters} and @i{keyword parameters}). ++For @i{special operators} and @i{macros}, ++their @i{arguments} are not @i{evaluated} unless it is explicitly stated in their ++descriptions that they are @i{evaluated}. ++ ++@node The "Binding Types Affected" Section of a Dictionary Entry, The "Class Precedence List" Section of a Dictionary Entry, The "Arguments and Values" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Binding Types Affected" Section of a Dictionary Entry ++ ++This information alerts the reader to the kinds of @i{bindings} that might ++potentially be affected by a declaration. Whether in fact any particular such ++@i{binding} is actually affected is dependent on additional factors as well. ++See The "Description" Section of the declaration in question for details. ++ ++@node The "Class Precedence List" Section of a Dictionary Entry, Dictionary Entries for Type Specifiers, The "Binding Types Affected" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Class Precedence List" Section of a Dictionary Entry ++ ++This appears in the dictionary entry for a @i{class}, ++and contains an ordered list of the @i{classes} defined ++by @r{Common Lisp} that must be in the @i{class precedence list} of this @i{class}. ++ ++It is permissible for other (@i{implementation-defined}) @i{classes} ++to appear in the @i{implementation}'s @i{class precedence list} for the @i{class}. ++ ++It is permissible for ++ either @b{standard-object} ++ or @b{structure-object} ++to appear in the @i{implementation}'s @i{class precedence list}; ++for details, see @ref{Type Relationships}. ++ ++Except as explicitly indicated otherwise somewhere in this specification, ++no additional @i{standardized} @i{classes} may appear in ++the @i{implementation}'s @i{class precedence list}. ++ ++By definition of the relationship between @i{classes} and @i{types}, ++the @i{classes} listed in this section are also @i{supertypes} of ++the @i{type} denoted by the @i{class}. ++ ++@node Dictionary Entries for Type Specifiers, The "Compound Type Specifier Kind" Section of a Dictionary Entry, The "Class Precedence List" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection Dictionary Entries for Type Specifiers ++ ++The @i{atomic type specifiers} are those @i{defined names} ++listed in @i{Figure~4--2}. ++Such dictionary entries are of kind ++``Class,'' ``Condition Type,'' ``System Class,'' or ``Type.'' ++A description of how to interpret ++a @i{symbol} naming one of these @i{types} or @i{classes} ++as an @i{atomic type specifier} ++is found in The "Description" Section of such dictionary entries. ++ ++The @i{compound type specifiers} are those @i{defined names} ++listed in @i{Figure~4--3}. ++Such dictionary entries are of kind ``Class,'' ``System Class,'' ++``Type,'' or ``Type Specifier.'' ++A description of how to interpret as a @i{compound type specifier} ++a @i{list} whose @i{car} is such a @i{symbol} ++is found in the ++ ``Compound Type Specifier Kind,'' ++ ``Compound Type Specifier Syntax,'' ++ ``Compound Type Specifier Arguments,'' ++ and ``Compound Type Specifier Description'' ++sections of such dictionary entries. ++ ++@node The "Compound Type Specifier Kind" Section of a Dictionary Entry, The "Compound Type Specifier Syntax" Section of a Dictionary Entry, Dictionary Entries for Type Specifiers, Interpreting Dictionary Entries ++@subsubsection The "Compound Type Specifier Kind" Section of a Dictionary Entry ++ ++An ``abbreviating'' @i{type specifier} is one that describes a @i{subtype} ++for which it is in principle possible to enumerate the @i{elements}, ++but for which in practice it is impractical to do so. ++ ++A ``specializing'' @i{type specifier} is one that describes a @i{subtype} ++by restricting the @i{type} of one or more components of the @i{type}, ++such as @i{element type} or @i{complex part type}. ++ ++A ``predicating'' @i{type specifier} is one that describes a @i{subtype} ++containing only those @i{objects} that satisfy a given @i{predicate}. ++ ++A ``combining'' @i{type specifier} is one that describes a @i{subtype} ++in a compositional way, using combining operations (such as ``and,'' ``or,'' and ++``not'') on other @i{types}. ++ ++@node The "Compound Type Specifier Syntax" Section of a Dictionary Entry, The "Compound Type Specifier Arguments" Section of a Dictionary Entry, The "Compound Type Specifier Kind" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Compound Type Specifier Syntax" Section of a Dictionary Entry ++ ++This information about a @i{type} describes the syntax of a ++@i{compound type specifier} for that @i{type}. ++ ++Whether or not the @i{type} is acceptable as an @i{atomic type specifier} ++is not represented here; see @ref{Dictionary Entries for Type Specifiers}. ++ ++@node The "Compound Type Specifier Arguments" Section of a Dictionary Entry, The "Compound Type Specifier Description" Section of a Dictionary Entry, The "Compound Type Specifier Syntax" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Compound Type Specifier Arguments" Section of a Dictionary Entry ++ ++This information describes @i{type} information for the structures defined in ++The "Compound Type Specifier Syntax" Section. ++ ++@node The "Compound Type Specifier Description" Section of a Dictionary Entry, The "Constant Value" Section of a Dictionary Entry, The "Compound Type Specifier Arguments" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Compound Type Specifier Description" Section of a Dictionary Entry ++ ++This information describes the meaning of the structures defined in ++The "Compound Type Specifier Syntax" Section. ++ ++@node The "Constant Value" Section of a Dictionary Entry, The "Description" Section of a Dictionary Entry, The "Compound Type Specifier Description" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Constant Value" Section of a Dictionary Entry ++ ++This information describes the unchanging @i{type} and @i{value} of ++a @i{constant variable}. ++ ++@node The "Description" Section of a Dictionary Entry, The "Examples" Section of a Dictionary Entry, The "Constant Value" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Description" Section of a Dictionary Entry ++ ++A summary of the @i{operator} and all intended aspects of the @i{operator}, ++but does not necessarily include all the fields referenced below it ++(``Side Effects,'' ``Exceptional Situations,'' @i{etc.}) ++ ++@node The "Examples" Section of a Dictionary Entry, The "Exceptional Situations" Section of a Dictionary Entry, The "Description" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Examples" Section of a Dictionary Entry ++ ++Examples of use of the @i{operator}. ++These examples are not considered part of the standard; ++see @ref{Sections Not Formally Part Of This Standard}. ++ ++@node The "Exceptional Situations" Section of a Dictionary Entry, The "Initial Value" Section of a Dictionary Entry, The "Examples" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Exceptional Situations" Section of a Dictionary Entry ++ ++ Three kinds of information may appear here: ++@table @asis ++ ++@item @t{*} ++Situations that are detected by the @i{function} and formally signaled. ++@item @t{*} ++Situations that are handled by the @i{function}. ++@item @t{*} ++Situations that may be detected by the @i{function}. ++@end table ++ ++This field does not include conditions that could ++be signaled by @i{functions} passed to and called by this @i{operator} ++as arguments or through dynamic variables, nor by executing subforms of this ++operator if it is a @i{macro} or @i{special operator}. ++ ++@node The "Initial Value" Section of a Dictionary Entry, The "Argument Precedence Order" Section of a Dictionary Entry, The "Exceptional Situations" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Initial Value" Section of a Dictionary Entry ++ ++This information describes the initial @i{value} of a @i{dynamic variable}. ++Since this variable might change, see @i{type} restrictions in The "Value Type" Section. ++ ++@node The "Argument Precedence Order" Section of a Dictionary Entry, The "Method Signature" Section of a Dictionary Entry, The "Initial Value" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Argument Precedence Order" Section of a Dictionary Entry ++ ++This information describes the argument precedence order. ++If it is omitted, the argument precedence order is the default (left to right). ++ ++@node The "Method Signature" Section of a Dictionary Entry, The "Name" Section of a Dictionary Entry, The "Argument Precedence Order" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Method Signature" Section of a Dictionary Entry ++ ++The description of a @i{generic function} includes descriptions of the ++@i{methods} that are defined on that @i{generic function} by the standard. ++A method signature is used to describe the @i{parameters} and ++@i{parameter specializers} for each @i{method}. ++@i{Methods} defined for the @i{generic function} must be of the form described ++by the @i{method} @i{signature}. ++ ++@code{F} @i{@r{(}@i{x} @i{class}@r{)} ++ @r{(}@i{y} t@r{)} ++ @r{&optional} @i{z} @r{&key} @i{k}} ++ ++@noindent ++This @i{signature} indicates that this method on the @i{generic function} ++@b{F} has two @i{required parameters}: ++ @i{x}, which must be a @i{generalized instance} of the @i{class} @i{class}; ++ and @i{y}, which can be any @i{object} ++ (@i{i.e.}, a @i{generalized instance} of the @i{class} @b{t}). ++In addition, there is an @i{optional parameter} @i{z} and a ++@i{keyword parameter} @i{k}. This @i{signature} also indicates that this ++method on @t{F} is a @i{primary method} and has no @i{qualifiers}. ++ ++For each @i{parameter}, the @i{argument} supplied must be in the ++intersection of the @i{type} specified in the description of the ++corresponding @i{generic function} and the @i{type} given in ++the @i{signature} of some @i{method} (including not only those ++@i{methods} defined in this specification, but also ++@i{implementation-defined} or user-defined @i{methods} in situations ++where the definition of such @i{methods} is permitted). ++ ++@node The "Name" Section of a Dictionary Entry, The "Notes" Section of a Dictionary Entry, The "Method Signature" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Name" Section of a Dictionary Entry ++ ++This section introduces the dictionary entry. It is not explicitly labeled. ++It appears preceded and followed by a horizontal bar. ++ ++In large print at left, the @i{defined name} appears; if more than one ++@i{defined name} is to be described by the entry, all such @i{names} ++are shown separated by commas. ++ ++In somewhat smaller italic print at right is an indication of what kind ++of dictionary entry this is. Possible values are: ++ ++@table @asis ++ ++@item @i{Accessor} ++This is an @i{accessor} @i{function}. ++ ++@item @i{Class} ++This is a @i{class}. ++ ++@item @i{Condition Type} ++This is a @i{subtype} of @i{type} @b{condition}. ++ ++@item @i{Constant Variable} ++This is a @i{constant variable}. ++ ++@item @i{Declaration} ++This is a @i{declaration identifier}. ++ ++@item @i{Function} ++This is a @i{function}. ++ ++@item @i{Local Function} ++This is a @i{function} that is defined only lexically within the scope of some ++other @i{macro form}. ++ ++@item @i{Local Macro} ++This is a @i{macro} that is defined only lexically within the scope of some ++other @i{macro form}. ++ ++@item @i{Macro} ++This is a @i{macro}. ++ ++@item @i{Restart} ++This is a @i{restart}. ++ ++@item @i{Special Operator} ++This is a @i{special operator}. ++ ++@item @i{Standard Generic Function} ++This is a @i{standard generic function}. ++ ++@item @i{Symbol} ++This is a @i{symbol} that is specially recognized in some particular situation, ++such as the syntax of a @i{macro}. ++ ++@item @i{System Class} ++This is like @i{class}, but it identifies a @i{class} that is potentially ++a @i{built-in class}. (No @i{class} is actually required to be a ++@i{built-in class}.) ++ ++@item @i{Type} ++This is an @i{atomic type specifier}, ++and depending on information for each particular entry, ++may subject to form other @i{type specifiers}. ++ ++@item @i{Type Specifier} ++This is a @i{defined name} that is not an @i{atomic type specifier}, ++but that can be used in constructing valid @i{type specifiers}. ++ ++@item @i{Variable} ++This is a @i{dynamic variable}. ++ ++@end table ++ ++@node The "Notes" Section of a Dictionary Entry, The "Pronunciation" Section of a Dictionary Entry, The "Name" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Notes" Section of a Dictionary Entry ++ ++Information not found elsewhere in this description ++which pertains to this @i{operator}. ++Among other things, this might include ++ cross reference information, ++ code equivalences, ++ stylistic hints, ++ implementation hints, ++ typical uses. ++This information is not considered part of the standard; ++any @i{conforming implementation} or @i{conforming program} ++is permitted to ignore the presence of this information. ++ ++@node The "Pronunciation" Section of a Dictionary Entry, The "See Also" Section of a Dictionary Entry, The "Notes" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Pronunciation" Section of a Dictionary Entry ++ ++This offers a suggested pronunciation for @i{defined names} ++so that people not in verbal communication with the original designers ++can figure out how to pronounce words that are not in normal English usage. ++This information is advisory only, and is not considered part of the standard. ++For brevity, it is only provided for entries with names that are specific to ++@r{Common Lisp} and would not be found in @b{Webster's Third New International Dictionary ++ the English Language, Unabridged}. ++ ++@node The "See Also" Section of a Dictionary Entry, The "Side Effects" Section of a Dictionary Entry, The "Pronunciation" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "See Also" Section of a Dictionary Entry ++ ++List of references to other parts of this standard ++that offer information relevant to this @i{operator}. ++This list is not part of the standard. ++ ++@node The "Side Effects" Section of a Dictionary Entry, The "Supertypes" Section of a Dictionary Entry, The "See Also" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Side Effects" Section of a Dictionary Entry ++ ++Anything that is changed as a result of the ++evaluation of the @i{form} containing this @i{operator}. ++ ++@node The "Supertypes" Section of a Dictionary Entry, The "Syntax" Section of a Dictionary Entry, The "Side Effects" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Supertypes" Section of a Dictionary Entry ++ ++This appears in the dictionary entry for a @i{type}, ++and contains a list of the @i{standardized} @i{types} ++that must be @i{supertypes} of this @i{type}. ++ ++In @i{implementations} where there is a corresponding @i{class}, ++the order of the @i{classes} in the @i{class precedence list} ++is consistent with the order presented in this section. ++ ++@node The "Syntax" Section of a Dictionary Entry, Special "Syntax" Notations for Overloaded Operators, The "Supertypes" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Syntax" Section of a Dictionary Entry ++ ++This section describes how to use the @i{defined name} in code. ++The "Syntax'' description for a @i{generic function} ++describes the @i{lambda list} of the @i{generic function} itself, ++while The "Method Signatures'' describe the @i{lambda lists} ++of the defined @i{methods}. ++The "Syntax'' description for ++ an @i{ordinary function}, ++ a @i{macro}, ++ or a @i{special operator} ++describes its @i{parameters}. ++ ++For example, an @i{operator} description might say: ++ ++@code{F} @i{x y @r{&optional} z @r{&key} k} ++ ++@noindent ++This description indicates that the function @b{F} ++has two required parameters, @i{x} and @i{y}. In addition, ++there is an optional parameter @i{z} and a keyword parameter @i{k}. ++ ++For @i{macros} and @i{special operators}, syntax is given ++in modified BNF notation; see @ref{Modified BNF Syntax}. ++For @i{functions} a @i{lambda list} is given. ++In both cases, however, the outermost parentheses are omitted, ++and default value information is omitted. ++ ++@node Special "Syntax" Notations for Overloaded Operators, Naming Conventions for Rest Parameters, The "Syntax" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection Special "Syntax" Notations for Overloaded Operators ++ ++If two descriptions exist for the same operation but with different numbers of ++arguments, then the extra arguments are to be treated as optional. For example, ++this pair of lines: ++ ++@code{file-position} @i{stream} @result{} @i{position} ++ ++@code{file-position} @i{stream position-spec} @result{} @i{success-p} ++ ++@noindent ++is operationally equivalent to this line: ++ ++@code{file-position} @i{stream @r{&optional} position-spec} @result{} @i{result} ++ ++@noindent ++and differs only in that it provides on opportunity to introduce different ++names for @i{parameter} and @i{values} for each case. ++The separated (multi-line) notation is used when an @i{operator} is overloaded in ++such a way that the @i{parameters} are used in different ways ++depending on how many @i{arguments} are supplied (@i{e.g.}, for the @i{function} @b{/}) ++or the return values are different in the two cases (@i{e.g.}, for the @i{function} @b{file-position}). ++ ++@node Naming Conventions for Rest Parameters, Requiring Non-Null Rest Parameters in The "Syntax" Section, Special "Syntax" Notations for Overloaded Operators, Interpreting Dictionary Entries ++@subsubsection Naming Conventions for Rest Parameters ++ ++Within this specification, ++if the name of a @i{rest parameter} is chosen to be a plural noun, ++use of that name in @i{parameter} font refers ++to the @i{list} to which the @i{rest parameter} is bound. ++Use of the singular form of that name in @i{parameter} font refers ++to an @i{element} of that @i{list}. ++ ++For example, given a syntax description such as: ++ ++@code{F} @i{@r{&rest} @i{arguments}} ++ ++@noindent ++it is appropriate to refer either to the @i{rest parameter} named ++@i{arguments} by name, or to one of its elements by speaking of ``an @i{argument},'' ++``some @i{argument},'' ``each @i{argument}'' @i{etc.} ++ ++@node Requiring Non-Null Rest Parameters in The "Syntax" Section, Return values in The "Syntax" Section, Naming Conventions for Rest Parameters, Interpreting Dictionary Entries ++@subsubsection Requiring Non-Null Rest Parameters in The "Syntax" Section ++ ++In some cases it is useful to refer to all arguments equally as a single ++aggregation using a @i{rest parameter} while at the same time ++requiring at least one argument. A variety of imperative and ++declarative means are available in @i{code} for expressing such a ++restriction, however they generally do not manifest themselves in a ++@i{lambda list}. For descriptive purposes within this specification, ++ ++@code{F} @i{@r{&rest} arguments^+} ++ ++@noindent ++means the same as ++ ++@code{F} @i{@r{&rest} arguments} ++ ++@noindent ++but introduces the additional requirement that there be ++at least one @i{argument}. ++ ++@node Return values in The "Syntax" Section, No Arguments or Values in The "Syntax" Section, Requiring Non-Null Rest Parameters in The "Syntax" Section, Interpreting Dictionary Entries ++@subsubsection Return values in The "Syntax" Section ++ ++An evaluation arrow ``@result{}'' precedes a list of @i{values} to be returned. ++For example: ++ ++@code{F} @i{a b c} @result{} @i{x} ++ ++@noindent ++indicates that @t{F} is an operator that has three @i{required parameters} ++(@i{i.e.}, @i{a}, @i{b}, and @i{c}) and that returns one @i{value} (@i{i.e.}, @i{x}). ++If more than one @i{value} is returned by an operator, the @i{names} of the ++@i{values} are separated by commas, as in: ++ ++@code{F} @i{a b c} @result{} @i{x, y, z} ++ ++@node No Arguments or Values in The "Syntax" Section, Unconditional Transfer of Control in The "Syntax" Section, Return values in The "Syntax" Section, Interpreting Dictionary Entries ++@subsubsection No Arguments or Values in The "Syntax" Section ++ ++If no @i{arguments} are permitted, or no @i{values} are returned, ++a special notation is used to make this more visually apparent. For example, ++ ++@code{F} @i{<@i{no @i{arguments}}>} @result{} @i{<@i{no @i{values}}>} ++ ++indicates that @t{F} is an operator that accepts no @i{arguments} and returns ++no @i{values}. ++ ++@node Unconditional Transfer of Control in The "Syntax" Section, The "Valid Context" Section of a Dictionary Entry, No Arguments or Values in The "Syntax" Section, Interpreting Dictionary Entries ++@subsubsection Unconditional Transfer of Control in The "Syntax" Section ++ ++Some @i{operators} perform an unconditional transfer of control, and ++so never have any return values. Such @i{operators} are notated using ++a notation such as the following: ++ ++@code{F} @i{a b c} ++ @result{} # ++ ++@node The "Valid Context" Section of a Dictionary Entry, The "Value Type" Section of a Dictionary Entry, Unconditional Transfer of Control in The "Syntax" Section, Interpreting Dictionary Entries ++@subsubsection The "Valid Context" Section of a Dictionary Entry ++ ++This information is used by dictionary entries such as ``Declarations'' ++in order to restrict the context in which the declaration may appear. ++ ++A given ``Declaration'' might appear in ++ a @i{declaration} (@i{i.e.}, a @b{declare} @i{expression}), ++ a @i{proclamation} (@i{i.e.}, a @b{declaim} or @b{proclaim} @i{form}), ++ or both. ++ ++@node The "Value Type" Section of a Dictionary Entry, , The "Valid Context" Section of a Dictionary Entry, Interpreting Dictionary Entries ++@subsubsection The "Value Type" Section of a Dictionary Entry ++ ++This information describes any @i{type} restrictions on a @i{dynamic variable}. ++ ++@c end of including concept-definitions ++ ++@node Conformance, Language Extensions, Definitions, Introduction (Introduction) ++@section Conformance ++ ++@c including concept-conformance ++ ++This standard presents the syntax and semantics to be implemented by a ++@i{conforming implementation} (and its accompanying documentation). ++In addition, it imposes requirements on @i{conforming programs}. ++ ++@menu ++* Conforming Implementations:: ++* Conforming Programs:: ++@end menu ++ ++@node Conforming Implementations, Conforming Programs, Conformance, Conformance ++@subsection Conforming Implementations ++ ++A @i{conforming implementation} ++@IGindex conforming implementation ++ shall adhere to the requirements outlined ++in this section. ++ ++@menu ++* Required Language Features:: ++* Documentation of Implementation-Dependent Features:: ++* Documentation of Extensions:: ++* Treatment of Exceptional Situations:: ++* Resolution of Apparent Conflicts in Exceptional Situations:: ++* Examples of Resolution of Apparent Conflict in Exceptional Situations:: ++* Conformance Statement:: ++@end menu ++ ++@node Required Language Features, Documentation of Implementation-Dependent Features, Conforming Implementations, Conforming Implementations ++@subsubsection Required Language Features ++ ++A @i{conforming implementation} shall accept all features ++(including deprecated features) ++of the language specified in this standard, ++with the meanings defined in this standard. ++ ++A @i{conforming implementation} shall not require the inclusion of substitute ++or additional language elements in code in order to accomplish a feature of ++the language that is specified in this standard. ++ ++@node Documentation of Implementation-Dependent Features, Documentation of Extensions, Required Language Features, Conforming Implementations ++@subsubsection Documentation of Implementation-Dependent Features ++ ++A @i{conforming implementation} shall be accompanied by a document ++that provides a definition of all @i{implementation-defined} ++aspects of the language defined by this specification. ++ ++In addition, a @i{conforming implementation} is encouraged (but not required) ++to document items in this standard that are identified as ++@i{implementation-dependent}, although in some cases ++such documentation might simply identify the item as ``undefined.'' ++ ++@node Documentation of Extensions, Treatment of Exceptional Situations, Documentation of Implementation-Dependent Features, Conforming Implementations ++@subsubsection Documentation of Extensions ++ ++A @i{conforming implementation} shall be accompanied by a ++document that separately describes any features accepted by the ++@i{implementation} that are not specified in this standard, but that do not ++cause any ambiguity or contradiction when added to the language ++standard. Such extensions shall be described as being ``extensions to ++@r{Common Lisp} as specified by ANSI <<@i{standard number}>>.'' ++ ++@node Treatment of Exceptional Situations, Resolution of Apparent Conflicts in Exceptional Situations, Documentation of Extensions, Conforming Implementations ++@subsubsection Treatment of Exceptional Situations ++ ++A @i{conforming implementation} shall treat exceptional situations ++in a manner consistent with this specification. ++ ++@node Resolution of Apparent Conflicts in Exceptional Situations, Examples of Resolution of Apparent Conflict in Exceptional Situations, Treatment of Exceptional Situations, Conforming Implementations ++@subsubsection Resolution of Apparent Conflicts in Exceptional Situations ++ ++If more than one passage in this specification appears to apply to the ++same situation but in conflicting ways, the passage that appears ++to describe the situation in the most specific way (not necessarily the ++passage that provides the most constrained kind of error detection) ++takes precedence. ++ ++@node Examples of Resolution of Apparent Conflict in Exceptional Situations, Conformance Statement, Resolution of Apparent Conflicts in Exceptional Situations, Conforming Implementations ++@subsubsection Examples of Resolution of Apparent Conflict in Exceptional Situations ++ ++Suppose that function @t{foo} is a member of a set S of @i{functions} that ++operate on numbers. Suppose that one passage states that an error must be ++signaled if any @i{function} in S is ever given an argument of @t{17}. ++Suppose that an apparently conflicting passage states that the consequences ++are undefined if @t{foo} receives an argument of @t{17}. Then the second passage ++(the one specifically about @t{foo}) would dominate because the description of ++the situational context is the most specific, and it would not be required that ++@t{foo} signal an error on an argument of @t{17} even though other functions in ++the set S would be required to do so. ++ ++@node Conformance Statement, , Examples of Resolution of Apparent Conflict in Exceptional Situations, Conforming Implementations ++@subsubsection Conformance Statement ++ ++A @i{conforming implementation} shall produce a conformance statement ++as a consequence of using the implementation, or that statement ++shall be included in the accompanying documentation. If the implementation ++conforms in all respects with this standard, the conformance statement ++shall be ++ ++@table @asis ++ ++@item @t{} ++``<<@i{Implementation}>> conforms with the requirements ++ of ANSI <<@i{standard number}>>'' ++@end table ++ ++If the @i{implementation} conforms with some but not all of the requirements of this ++standard, then the conformance statement shall be ++ ++@table @asis ++ ++@item @t{} ++``<<@i{Implementation}>> conforms with the requirements of ++ ANSI <<@i{standard number}>> with the following exceptions: ++ <<@i{reference to or complete list of the requirements of ++ the standard with which the implementation does not conform}>>.'' ++@end table ++ ++@node Conforming Programs, , Conforming Implementations, Conformance ++@subsection Conforming Programs ++ ++@IGindex conforming program ++ ++@IGindex conforming code ++ ++Code conforming with the requirements of this standard shall adhere to the ++following: ++ ++@table @asis ++ ++@item 1. ++@i{Conforming code} shall use only those features of the ++ language syntax and semantics that are ++ either specified in this standard ++ or defined using the extension mechanisms ++ specified in the standard. ++ ++@item 2. ++@i{Conforming code} shall not rely on any particular ++ interpretation of @i{implementation-dependent} features. ++ ++@item 3. ++@i{Conforming code} shall not depend on the consequences ++ of undefined or unspecified situations. ++ ++@item 4. ++@i{Conforming code} does not use any constructions ++ that are prohibited by the standard. ++ ++@item 5. ++@i{Conforming code} does not depend on extensions ++ included in an implementation. ++@end table ++ ++@menu ++* Use of Implementation-Defined Language Features:: ++* Use of Read-Time Conditionals:: ++@end menu ++ ++@node Use of Implementation-Defined Language Features, Use of Read-Time Conditionals, Conforming Programs, Conforming Programs ++@subsubsection Use of Implementation-Defined Language Features ++ ++Note that @i{conforming code} may rely on particular ++@i{implementation-defined} values or features. Also note that the ++requirements for @i{conforming code} and @i{conforming implementations} do not ++require that the results produced by conforming code always be the ++same when processed by a @i{conforming implementation}. The results may be the ++same, or they may differ. ++ ++@i{Portable code} is written using only @i{standard characters}. ++ ++Conforming code may run in all conforming implementations, but might ++have allowable @i{implementation-defined} behavior that makes it ++non-portable code. ++For example, the following are examples of @i{forms} that are conforming, but ++that might return different @i{values} in different implementations: ++ ++@example ++ (evenp most-positive-fixnum) @result{} @i{implementation-dependent} ++ (random) @result{} @i{implementation-dependent} ++ (> lambda-parameters-limit 93) @result{} @i{implementation-dependent} ++ (char-name #\A) @result{} @i{implementation-dependent} ++@end example ++ ++@node Use of Read-Time Conditionals, , Use of Implementation-Defined Language Features, Conforming Programs ++@subsubsection Use of Read-Time Conditionals ++ ++Use of @t{#+} and @t{#-} does not automatically disqualify a program ++from being conforming. A program which uses @t{#+} and @t{#-} is ++considered conforming if there is no set of @i{features} in which the ++program would not be conforming. Of course, @i{conforming programs} are ++not necessarily working programs. The following program is conforming: ++ ++@example ++(defun foo () ++ #+ACME (acme:initialize-something) ++ (print 'hello-there)) ++@end example ++ ++However, this program might or might not work, depending on whether the ++presence of the feature @t{ACME} really implies that a function named ++@t{acme:initialize-something} is present in the environment. In effect, ++using @t{#+} or @t{#-} in a @i{conforming program} means that the variable ++@b{*features*} ++@IRindex *features* ++ ++becomes just one more piece of input data to that ++program. Like any other data coming into a program, the programmer ++is responsible for assuring that the program does not make unwarranted ++assumptions on the basis of input data. ++ ++@c end of including concept-conformance ++ ++@node Language Extensions, Language Subsets, Conformance, Introduction (Introduction) ++@section Language Extensions ++ ++@c including concept-extensions ++ ++A language extension is any documented @i{implementation-defined} behavior ++of a @i{defined name} in this standard that varies from the ++behavior described in this standard, or a documented consequence of a ++situation that the standard specifies as undefined, unspecified, or ++extendable by the implementation. For example, if this standard says ++that ``the results are unspecified,'' an extension would be to specify ++the results. ++ ++[Reviewer Note by Barmar: This contradicts previous definitions of conforming code.] ++If the correct behavior of a program depends on the results provided ++by an extension, only implementations with the same extension will ++execute the program correctly. Note that such a program might be ++non-conforming. Also, if this standard says that ``an implementation ++may be extended,'' a conforming, but possibly non-portable, program ++can be written using an extension. ++ ++An implementation can have extensions, provided they do not alter the ++behavior of conforming code and provided they are not explicitly ++prohibited by this standard. ++ ++The term ``extension'' refers only to extensions available upon ++startup. An implementation is free to allow or prohibit redefinition ++of an extension. ++ ++The following list contains specific guidance to implementations ++concerning certain types of extensions. ++@table @asis ++ ++@item @b{Extra return values} ++ ++An implementation must return exactly ++the number of return values specified by this standard unless the ++standard specifically indicates otherwise. ++ ++@item @b{Unsolicited messages} ++ ++No output can be produced by a function other than that specified in ++the standard or due to the signaling of @i{conditions} ++detected by the function. ++ ++Unsolicited output, such as garbage collection notifications and ++autoload heralds, should not go directly to the @i{stream} ++that is the value of a @i{stream} variable defined in this ++standard, but can go indirectly to @i{terminal I/O} by using a ++@i{synonym stream} to @b{*terminal-io*}. ++ ++Progress reports from such functions as @b{load} and ++@b{compile} are considered solicited, and are not covered by ++this prohibition. ++ ++@item @b{Implementation of macros and special forms} ++ ++@i{Macros} and @i{special operators} defined in this standard ++must not be @i{functions}. ++ ++@end table ++ ++@c end of including concept-extensions ++ ++@node Language Subsets, Deprecated Language Features, Language Extensions, Introduction (Introduction) ++@section Language Subsets ++ ++@c including concept-subsets ++ ++The language described in this standard contains no subsets, ++though subsets are not forbidden. ++ ++For a language to be considered a subset, ++it must have the property that any valid @i{program} in that language ++has equivalent semantics and will run directly ++(with no extralingual pre-processing, and no special compatibility packages) ++in any @i{conforming implementation} of the full language. ++ ++A language that conforms to this requirement shall be described ++as being a ``subset of @r{Common Lisp} as specified by ANSI <<@i{standard number}>>.'' ++ ++@c end of including concept-subsets ++ ++@node Deprecated Language Features, Symbols in the COMMON-LISP Package, Language Subsets, Introduction (Introduction) ++@section Deprecated Language Features ++ ++@c including concept-deprecated ++ ++Deprecated language features are not expected to appear in future @r{Common Lisp} ++standards, but are required to be implemented for conformance with this ++standard; see @ref{Required Language Features}. ++ ++@i{Conforming programs} can use deprecated features; ++however, it is considered good programming style to avoid them. ++It is permissible for the compiler to produce @i{style warnings} ++about the use of such features at compile time, ++but there should be no such warnings at program execution time. ++ ++@menu ++* Deprecated Functions:: ++* Deprecated Argument Conventions:: ++* Deprecated Variables:: ++* Deprecated Reader Syntax:: ++@end menu ++ ++@node Deprecated Functions, Deprecated Argument Conventions, Deprecated Language Features, Deprecated Language Features ++@subsection Deprecated Functions ++ ++The @i{functions} in Figure 1--2 are deprecated. ++@format ++@group ++@noindent ++@w{ assoc-if-not nsubst-if-not require } ++@w{ count-if-not nsubstitute-if-not set } ++@w{ delete-if-not position-if-not subst-if-not } ++@w{ find-if-not provide substitute-if-not } ++@w{ gentemp rassoc-if-not } ++@w{ member-if-not remove-if-not } ++ ++@noindent ++@w{ Figure 1--2: Deprecated Functions } ++ ++@end group ++@end format ++ ++@node Deprecated Argument Conventions, Deprecated Variables, Deprecated Functions, Deprecated Language Features ++@subsection Deprecated Argument Conventions ++ ++The ability to pass a numeric @i{argument} to @b{gensym} has been deprecated. ++ ++The @t{:test-not} @i{argument} to the @i{functions} in Figure 1--3 are deprecated. ++ ++@format ++@group ++@noindent ++@w{ adjoin nset-difference search } ++@w{ assoc nset-exclusive-or set-difference } ++@w{ count nsublis set-exclusive-or } ++@w{ delete nsubst sublis } ++@w{ delete-duplicates nsubstitute subsetp } ++@w{ find nunion subst } ++@w{ intersection position substitute } ++@w{ member rassoc tree-equal } ++@w{ mismatch remove union } ++@w{ nintersection remove-duplicates } ++ ++@noindent ++@w{ Figure 1--3: Functions with Deprecated :TEST-NOT Arguments} ++ ++@end group ++@end format ++ ++The use of the situation names @b{compile}, @b{load}, and @b{eval} ++in @b{eval-when} is deprecated. ++ ++@node Deprecated Variables, Deprecated Reader Syntax, Deprecated Argument Conventions, Deprecated Language Features ++@subsection Deprecated Variables ++ ++The @i{variable} @b{*modules*} is deprecated. ++ ++@node Deprecated Reader Syntax, , Deprecated Variables, Deprecated Language Features ++@subsection Deprecated Reader Syntax ++ ++The @t{#S} @i{reader macro} forces keyword names into the @t{KEYWORD} @i{package}; ++see @ref{Sharpsign S}. ++This feature is deprecated; ++in the future, keyword names will be taken in the package they are read in, ++so @i{symbols} that are actually in the @t{KEYWORD} @i{package} ++should be used if that is what is desired. ++ ++@c end of including concept-deprecated ++ ++@node Symbols in the COMMON-LISP Package, , Deprecated Language Features, Introduction (Introduction) ++@section Symbols in the COMMON-LISP Package ++ ++@c including concept-cl-symbols ++ ++The figures on the next twelve pages contain a complete enumeration ++of the 978 @i{external} @i{symbols} in the @t{COMMON-LISP} @i{package}. ++@IPindex common-lisp ++ ++@format ++@group ++@noindent ++@w{ &allow-other-keys *print-miser-width* } ++@w{ &aux *print-pprint-dispatch* } ++@w{ &body *print-pretty* } ++@w{ &environment *print-radix* } ++@w{ &key *print-readably* } ++@w{ &optional *print-right-margin* } ++@w{ &rest *query-io* } ++@w{ &whole *random-state* } ++@w{ * *read-base* } ++@w{ ** *read-default-float-format* } ++@w{ *** *read-eval* } ++@w{ *break-on-signals* *read-suppress* } ++@w{ *compile-file-pathname* *readtable* } ++@w{ *compile-file-truename* *standard-input* } ++@w{ *compile-print* *standard-output* } ++@w{ *compile-verbose* *terminal-io* } ++@w{ *debug-io* *trace-output* } ++@w{ *debugger-hook* + } ++@w{ *default-pathname-defaults* ++ } ++@w{ *error-output* +++ } ++@w{ *features* - } ++@w{ *gensym-counter* / } ++@w{ *load-pathname* // } ++@w{ *load-print* /// } ++@w{ *load-truename* /= } ++@w{ *load-verbose* 1+ } ++@w{ *macroexpand-hook* 1- } ++@w{ *modules* < } ++@w{ *package* <= } ++@w{ *print-array* = } ++@w{ *print-base* > } ++@w{ *print-case* >= } ++@w{ *print-circle* abort } ++@w{ *print-escape* abs } ++@w{ *print-gensym* acons } ++@w{ *print-length* acos } ++@w{ *print-level* acosh } ++@w{ *print-lines* add-method } ++ ++@noindent ++@w{ Figure 1--4: Symbols in the COMMON-LISP package (part one of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ adjoin atom boundp } ++@w{ adjust-array base-char break } ++@w{ adjustable-array-p base-string broadcast-stream } ++@w{ allocate-instance bignum broadcast-stream-streams } ++@w{ alpha-char-p bit built-in-class } ++@w{ alphanumericp bit-and butlast } ++@w{ and bit-andc1 byte } ++@w{ append bit-andc2 byte-position } ++@w{ apply bit-eqv byte-size } ++@w{ apropos bit-ior caaaar } ++@w{ apropos-list bit-nand caaadr } ++@w{ aref bit-nor caaar } ++@w{ arithmetic-error bit-not caadar } ++@w{ arithmetic-error-operands bit-orc1 caaddr } ++@w{ arithmetic-error-operation bit-orc2 caadr } ++@w{ array bit-vector caar } ++@w{ array-dimension bit-vector-p cadaar } ++@w{ array-dimension-limit bit-xor cadadr } ++@w{ array-dimensions block cadar } ++@w{ array-displacement boole caddar } ++@w{ array-element-type boole-1 cadddr } ++@w{ array-has-fill-pointer-p boole-2 caddr } ++@w{ array-in-bounds-p boole-and cadr } ++@w{ array-rank boole-andc1 call-arguments-limit } ++@w{ array-rank-limit boole-andc2 call-method } ++@w{ array-row-major-index boole-c1 call-next-method } ++@w{ array-total-size boole-c2 car } ++@w{ array-total-size-limit boole-clr case } ++@w{ arrayp boole-eqv catch } ++@w{ ash boole-ior ccase } ++@w{ asin boole-nand cdaaar } ++@w{ asinh boole-nor cdaadr } ++@w{ assert boole-orc1 cdaar } ++@w{ assoc boole-orc2 cdadar } ++@w{ assoc-if boole-set cdaddr } ++@w{ assoc-if-not boole-xor cdadr } ++@w{ atan boolean cdar } ++@w{ atanh both-case-p cddaar } ++ ++@noindent ++@w{ Figure 1--5: Symbols in the COMMON-LISP package (part two of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ cddadr clear-input copy-tree } ++@w{ cddar clear-output cos } ++@w{ cdddar close cosh } ++@w{ cddddr clrhash count } ++@w{ cdddr code-char count-if } ++@w{ cddr coerce count-if-not } ++@w{ cdr compilation-speed ctypecase } ++@w{ ceiling compile debug } ++@w{ cell-error compile-file decf } ++@w{ cell-error-name compile-file-pathname declaim } ++@w{ cerror compiled-function declaration } ++@w{ change-class compiled-function-p declare } ++@w{ char compiler-macro decode-float } ++@w{ char-code compiler-macro-function decode-universal-time } ++@w{ char-code-limit complement defclass } ++@w{ char-downcase complex defconstant } ++@w{ char-equal complexp defgeneric } ++@w{ char-greaterp compute-applicable-methods define-compiler-macro } ++@w{ char-int compute-restarts define-condition } ++@w{ char-lessp concatenate define-method-combination } ++@w{ char-name concatenated-stream define-modify-macro } ++@w{ char-not-equal concatenated-stream-streams define-setf-expander } ++@w{ char-not-greaterp cond define-symbol-macro } ++@w{ char-not-lessp condition defmacro } ++@w{ char-upcase conjugate defmethod } ++@w{ char/= cons defpackage } ++@w{ char< consp defparameter } ++@w{ char<= constantly defsetf } ++@w{ char= constantp defstruct } ++@w{ char> continue deftype } ++@w{ char>= control-error defun } ++@w{ character copy-alist defvar } ++@w{ characterp copy-list delete } ++@w{ check-type copy-pprint-dispatch delete-duplicates } ++@w{ cis copy-readtable delete-file } ++@w{ class copy-seq delete-if } ++@w{ class-name copy-structure delete-if-not } ++@w{ class-of copy-symbol delete-package } ++ ++@noindent ++@w{ Figure 1--6: Symbols in the COMMON-LISP package (part three of twelve). } ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ denominator eq } ++@w{ deposit-field eql } ++@w{ describe equal } ++@w{ describe-object equalp } ++@w{ destructuring-bind error } ++@w{ digit-char etypecase } ++@w{ digit-char-p eval } ++@w{ directory eval-when } ++@w{ directory-namestring evenp } ++@w{ disassemble every } ++@w{ division-by-zero exp } ++@w{ do export } ++@w{ do* expt } ++@w{ do-all-symbols extended-char } ++@w{ do-external-symbols fboundp } ++@w{ do-symbols fceiling } ++@w{ documentation fdefinition } ++@w{ dolist ffloor } ++@w{ dotimes fifth } ++@w{ double-float file-author } ++@w{ double-float-epsilon file-error } ++@w{ double-float-negative-epsilon file-error-pathname } ++@w{ dpb file-length } ++@w{ dribble file-namestring } ++@w{ dynamic-extent file-position } ++@w{ ecase file-stream } ++@w{ echo-stream file-string-length } ++@w{ echo-stream-input-stream file-write-date } ++@w{ echo-stream-output-stream fill } ++@w{ ed fill-pointer } ++@w{ eighth find } ++@w{ elt find-all-symbols } ++@w{ encode-universal-time find-class } ++@w{ end-of-file find-if } ++@w{ endp find-if-not } ++@w{ enough-namestring find-method } ++@w{ ensure-directories-exist find-package } ++@w{ ensure-generic-function find-restart } ++ ++@noindent ++@w{ Figure 1--7: Symbols in the COMMON-LISP package (part four of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ find-symbol get-internal-run-time } ++@w{ finish-output get-macro-character } ++@w{ first get-output-stream-string } ++@w{ fixnum get-properties } ++@w{ flet get-setf-expansion } ++@w{ float get-universal-time } ++@w{ float-digits getf } ++@w{ float-precision gethash } ++@w{ float-radix go } ++@w{ float-sign graphic-char-p } ++@w{ floating-point-inexact handler-bind } ++@w{ floating-point-invalid-operation handler-case } ++@w{ floating-point-overflow hash-table } ++@w{ floating-point-underflow hash-table-count } ++@w{ floatp hash-table-p } ++@w{ floor hash-table-rehash-size } ++@w{ fmakunbound hash-table-rehash-threshold } ++@w{ force-output hash-table-size } ++@w{ format hash-table-test } ++@w{ formatter host-namestring } ++@w{ fourth identity } ++@w{ fresh-line if } ++@w{ fround ignorable } ++@w{ ftruncate ignore } ++@w{ ftype ignore-errors } ++@w{ funcall imagpart } ++@w{ function import } ++@w{ function-keywords in-package } ++@w{ function-lambda-expression incf } ++@w{ functionp initialize-instance } ++@w{ gcd inline } ++@w{ generic-function input-stream-p } ++@w{ gensym inspect } ++@w{ gentemp integer } ++@w{ get integer-decode-float } ++@w{ get-decoded-time integer-length } ++@w{ get-dispatch-macro-character integerp } ++@w{ get-internal-real-time interactive-stream-p } ++ ++@noindent ++@w{ Figure 1--8: Symbols in the COMMON-LISP package (part five of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ intern lisp-implementation-type } ++@w{ internal-time-units-per-second lisp-implementation-version } ++@w{ intersection list } ++@w{ invalid-method-error list* } ++@w{ invoke-debugger list-all-packages } ++@w{ invoke-restart list-length } ++@w{ invoke-restart-interactively listen } ++@w{ isqrt listp } ++@w{ keyword load } ++@w{ keywordp load-logical-pathname-translations } ++@w{ labels load-time-value } ++@w{ lambda locally } ++@w{ lambda-list-keywords log } ++@w{ lambda-parameters-limit logand } ++@w{ last logandc1 } ++@w{ lcm logandc2 } ++@w{ ldb logbitp } ++@w{ ldb-test logcount } ++@w{ ldiff logeqv } ++@w{ least-negative-double-float logical-pathname } ++@w{ least-negative-long-float logical-pathname-translations } ++@w{ least-negative-normalized-double-float logior } ++@w{ least-negative-normalized-long-float lognand } ++@w{ least-negative-normalized-short-float lognor } ++@w{ least-negative-normalized-single-float lognot } ++@w{ least-negative-short-float logorc1 } ++@w{ least-negative-single-float logorc2 } ++@w{ least-positive-double-float logtest } ++@w{ least-positive-long-float logxor } ++@w{ least-positive-normalized-double-float long-float } ++@w{ least-positive-normalized-long-float long-float-epsilon } ++@w{ least-positive-normalized-short-float long-float-negative-epsilon } ++@w{ least-positive-normalized-single-float long-site-name } ++@w{ least-positive-short-float loop } ++@w{ least-positive-single-float loop-finish } ++@w{ length lower-case-p } ++@w{ let machine-instance } ++@w{ let* machine-type } ++ ++@noindent ++@w{ Figure 1--9: Symbols in the COMMON-LISP package (part six of twelve). } ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ machine-version mask-field } ++@w{ macro-function max } ++@w{ macroexpand member } ++@w{ macroexpand-1 member-if } ++@w{ macrolet member-if-not } ++@w{ make-array merge } ++@w{ make-broadcast-stream merge-pathnames } ++@w{ make-concatenated-stream method } ++@w{ make-condition method-combination } ++@w{ make-dispatch-macro-character method-combination-error } ++@w{ make-echo-stream method-qualifiers } ++@w{ make-hash-table min } ++@w{ make-instance minusp } ++@w{ make-instances-obsolete mismatch } ++@w{ make-list mod } ++@w{ make-load-form most-negative-double-float } ++@w{ make-load-form-saving-slots most-negative-fixnum } ++@w{ make-method most-negative-long-float } ++@w{ make-package most-negative-short-float } ++@w{ make-pathname most-negative-single-float } ++@w{ make-random-state most-positive-double-float } ++@w{ make-sequence most-positive-fixnum } ++@w{ make-string most-positive-long-float } ++@w{ make-string-input-stream most-positive-short-float } ++@w{ make-string-output-stream most-positive-single-float } ++@w{ make-symbol muffle-warning } ++@w{ make-synonym-stream multiple-value-bind } ++@w{ make-two-way-stream multiple-value-call } ++@w{ makunbound multiple-value-list } ++@w{ map multiple-value-prog1 } ++@w{ map-into multiple-value-setq } ++@w{ mapc multiple-values-limit } ++@w{ mapcan name-char } ++@w{ mapcar namestring } ++@w{ mapcon nbutlast } ++@w{ maphash nconc } ++@w{ mapl next-method-p } ++@w{ maplist nil } ++ ++@noindent ++@w{ Figure 1--10: Symbols in the COMMON-LISP package (part seven of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ nintersection package-error } ++@w{ ninth package-error-package } ++@w{ no-applicable-method package-name } ++@w{ no-next-method package-nicknames } ++@w{ not package-shadowing-symbols } ++@w{ notany package-use-list } ++@w{ notevery package-used-by-list } ++@w{ notinline packagep } ++@w{ nreconc pairlis } ++@w{ nreverse parse-error } ++@w{ nset-difference parse-integer } ++@w{ nset-exclusive-or parse-namestring } ++@w{ nstring-capitalize pathname } ++@w{ nstring-downcase pathname-device } ++@w{ nstring-upcase pathname-directory } ++@w{ nsublis pathname-host } ++@w{ nsubst pathname-match-p } ++@w{ nsubst-if pathname-name } ++@w{ nsubst-if-not pathname-type } ++@w{ nsubstitute pathname-version } ++@w{ nsubstitute-if pathnamep } ++@w{ nsubstitute-if-not peek-char } ++@w{ nth phase } ++@w{ nth-value pi } ++@w{ nthcdr plusp } ++@w{ null pop } ++@w{ number position } ++@w{ numberp position-if } ++@w{ numerator position-if-not } ++@w{ nunion pprint } ++@w{ oddp pprint-dispatch } ++@w{ open pprint-exit-if-list-exhausted } ++@w{ open-stream-p pprint-fill } ++@w{ optimize pprint-indent } ++@w{ or pprint-linear } ++@w{ otherwise pprint-logical-block } ++@w{ output-stream-p pprint-newline } ++@w{ package pprint-pop } ++ ++@noindent ++@w{ Figure 1--11: Symbols in the COMMON-LISP package (part eight of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ pprint-tab read-char } ++@w{ pprint-tabular read-char-no-hang } ++@w{ prin1 read-delimited-list } ++@w{ prin1-to-string read-from-string } ++@w{ princ read-line } ++@w{ princ-to-string read-preserving-whitespace } ++@w{ print read-sequence } ++@w{ print-not-readable reader-error } ++@w{ print-not-readable-object readtable } ++@w{ print-object readtable-case } ++@w{ print-unreadable-object readtablep } ++@w{ probe-file real } ++@w{ proclaim realp } ++@w{ prog realpart } ++@w{ prog* reduce } ++@w{ prog1 reinitialize-instance } ++@w{ prog2 rem } ++@w{ progn remf } ++@w{ program-error remhash } ++@w{ progv remove } ++@w{ provide remove-duplicates } ++@w{ psetf remove-if } ++@w{ psetq remove-if-not } ++@w{ push remove-method } ++@w{ pushnew remprop } ++@w{ quote rename-file } ++@w{ random rename-package } ++@w{ random-state replace } ++@w{ random-state-p require } ++@w{ rassoc rest } ++@w{ rassoc-if restart } ++@w{ rassoc-if-not restart-bind } ++@w{ ratio restart-case } ++@w{ rational restart-name } ++@w{ rationalize return } ++@w{ rationalp return-from } ++@w{ read revappend } ++@w{ read-byte reverse } ++ ++@noindent ++@w{ Figure 1--12: Symbols in the COMMON-LISP package (part nine of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ room simple-bit-vector } ++@w{ rotatef simple-bit-vector-p } ++@w{ round simple-condition } ++@w{ row-major-aref simple-condition-format-arguments } ++@w{ rplaca simple-condition-format-control } ++@w{ rplacd simple-error } ++@w{ safety simple-string } ++@w{ satisfies simple-string-p } ++@w{ sbit simple-type-error } ++@w{ scale-float simple-vector } ++@w{ schar simple-vector-p } ++@w{ search simple-warning } ++@w{ second sin } ++@w{ sequence single-float } ++@w{ serious-condition single-float-epsilon } ++@w{ set single-float-negative-epsilon } ++@w{ set-difference sinh } ++@w{ set-dispatch-macro-character sixth } ++@w{ set-exclusive-or sleep } ++@w{ set-macro-character slot-boundp } ++@w{ set-pprint-dispatch slot-exists-p } ++@w{ set-syntax-from-char slot-makunbound } ++@w{ setf slot-missing } ++@w{ setq slot-unbound } ++@w{ seventh slot-value } ++@w{ shadow software-type } ++@w{ shadowing-import software-version } ++@w{ shared-initialize some } ++@w{ shiftf sort } ++@w{ short-float space } ++@w{ short-float-epsilon special } ++@w{ short-float-negative-epsilon special-operator-p } ++@w{ short-site-name speed } ++@w{ signal sqrt } ++@w{ signed-byte stable-sort } ++@w{ signum standard } ++@w{ simple-array standard-char } ++@w{ simple-base-string standard-char-p } ++ ++@noindent ++@w{ Figure 1--13: Symbols in the COMMON-LISP package (part ten of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ standard-class sublis } ++@w{ standard-generic-function subseq } ++@w{ standard-method subsetp } ++@w{ standard-object subst } ++@w{ step subst-if } ++@w{ storage-condition subst-if-not } ++@w{ store-value substitute } ++@w{ stream substitute-if } ++@w{ stream-element-type substitute-if-not } ++@w{ stream-error subtypep } ++@w{ stream-error-stream svref } ++@w{ stream-external-format sxhash } ++@w{ streamp symbol } ++@w{ string symbol-function } ++@w{ string-capitalize symbol-macrolet } ++@w{ string-downcase symbol-name } ++@w{ string-equal symbol-package } ++@w{ string-greaterp symbol-plist } ++@w{ string-left-trim symbol-value } ++@w{ string-lessp symbolp } ++@w{ string-not-equal synonym-stream } ++@w{ string-not-greaterp synonym-stream-symbol } ++@w{ string-not-lessp t } ++@w{ string-right-trim tagbody } ++@w{ string-stream tailp } ++@w{ string-trim tan } ++@w{ string-upcase tanh } ++@w{ string/= tenth } ++@w{ string< terpri } ++@w{ string<= the } ++@w{ string= third } ++@w{ string> throw } ++@w{ string>= time } ++@w{ stringp trace } ++@w{ structure translate-logical-pathname } ++@w{ structure-class translate-pathname } ++@w{ structure-object tree-equal } ++@w{ style-warning truename } ++ ++@noindent ++@w{ Figure 1--14: Symbols in the COMMON-LISP package (part eleven of twelve).} ++ ++@end group ++@end format ++ ++@page ++ ++@format ++@group ++@noindent ++@w{ truncate values-list } ++@w{ two-way-stream variable } ++@w{ two-way-stream-input-stream vector } ++@w{ two-way-stream-output-stream vector-pop } ++@w{ type vector-push } ++@w{ type-error vector-push-extend } ++@w{ type-error-datum vectorp } ++@w{ type-error-expected-type warn } ++@w{ type-of warning } ++@w{ typecase when } ++@w{ typep wild-pathname-p } ++@w{ unbound-slot with-accessors } ++@w{ unbound-slot-instance with-compilation-unit } ++@w{ unbound-variable with-condition-restarts } ++@w{ undefined-function with-hash-table-iterator } ++@w{ unexport with-input-from-string } ++@w{ unintern with-open-file } ++@w{ union with-open-stream } ++@w{ unless with-output-to-string } ++@w{ unread-char with-package-iterator } ++@w{ unsigned-byte with-simple-restart } ++@w{ untrace with-slots } ++@w{ unuse-package with-standard-io-syntax } ++@w{ unwind-protect write } ++@w{ update-instance-for-different-class write-byte } ++@w{ update-instance-for-redefined-class write-char } ++@w{ upgraded-array-element-type write-line } ++@w{ upgraded-complex-part-type write-sequence } ++@w{ upper-case-p write-string } ++@w{ use-package write-to-string } ++@w{ use-value y-or-n-p } ++@w{ user-homedir-pathname yes-or-no-p } ++@w{ values zerop } ++ ++@noindent ++@w{ Figure 1--15: Symbols in the COMMON-LISP package (part twelve of twelve).} ++ ++@end group ++@end format ++ ++@c end of including concept-cl-symbols ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-10.texi +@@ -0,0 +1,1348 @@ ++ ++ ++@node Symbols, Packages, Conditions, Top ++@chapter Symbols ++ ++@menu ++* Symbol Concepts:: ++* Symbols Dictionary:: ++@end menu ++ ++@node Symbol Concepts, Symbols Dictionary, Symbols, Symbols ++@section Symbol Concepts ++ ++@c including concept-symbols ++ ++Figure 10--1 lists some ++@i{defined names} that are applicable to the @i{property lists} of @i{symbols}. ++ ++@format ++@group ++@noindent ++@w{ get remprop symbol-plist } ++ ++@noindent ++@w{ Figure 10--1: Property list defined names} ++ ++@end group ++@end format ++ ++Figure 10--2 lists some @i{defined names} that are applicable ++to the creation of and inquiry about @i{symbols}. ++ ++@format ++@group ++@noindent ++@w{ copy-symbol keywordp symbol-package } ++@w{ gensym make-symbol symbol-value } ++@w{ gentemp symbol-name } ++ ++@noindent ++@w{ Figure 10--2: Symbol creation and inquiry defined names} ++ ++@end group ++@end format ++ ++@c end of including concept-symbols ++ ++@node Symbols Dictionary, , Symbol Concepts, Symbols ++@section Symbols Dictionary ++ ++@c including dict-symbols ++ ++@menu ++* symbol:: ++* keyword:: ++* symbolp:: ++* keywordp:: ++* make-symbol:: ++* copy-symbol:: ++* gensym:: ++* *gensym-counter*:: ++* gentemp:: ++* symbol-function:: ++* symbol-name:: ++* symbol-package:: ++* symbol-plist:: ++* symbol-value:: ++* get:: ++* remprop:: ++* boundp:: ++* makunbound:: ++* set:: ++* unbound-variable:: ++@end menu ++ ++@node symbol, keyword, Symbols Dictionary, Symbols Dictionary ++@subsection symbol [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{symbol}, ++@b{t} ++ ++@subsubheading Description:: ++ ++@i{Symbols} are used for their @i{object} identity to name various entities ++in @r{Common Lisp}, including (but not limited to) linguistic entities such as ++@i{variables} and @i{functions}. ++ ++@i{Symbols} can be collected together into @i{packages}. ++A @i{symbol} is said to be @i{interned} in a @i{package} ++if it is @i{accessible} in that @i{package}; ++the same @i{symbol} can be @i{interned} in more than one @i{package}. ++If a @i{symbol} is not @i{interned} in any @i{package}, ++it is called @i{uninterned}. ++ ++An @i{interned} @i{symbol} is uniquely identifiable by its @i{name} from ++any @i{package} in which it is @i{accessible}. ++ ++@i{Symbols} have the following attributes. For historically reasons, ++these are sometimes referred to as @i{cells}, although the actual ++internal representation of @i{symbols} and their attributes is ++@i{implementation-dependent}. ++ ++@table @asis ++ ++@item @b{Name} ++The @i{name} of a @i{symbol} is a @i{string} used to identify the @i{symbol}. ++Every @i{symbol} has a @i{name}, ++ ++and the consequences are undefined if that @i{name} is altered. ++ ++The @i{name} is used as part of the external, printed representation of ++the @i{symbol}; see @ref{Character Syntax}. ++The @i{function} @b{symbol-name} returns the @i{name} of a given @i{symbol}. ++ ++A @i{symbol} may have any @i{character} in its @i{name}. ++ ++@item @b{Package} ++The @i{object} in this @i{cell} is called the @i{home package} ++of the @i{symbol}. If the @i{home package} is @b{nil}, the @i{symbol} ++is sometimes said to have no @i{home package}. ++ ++When a @i{symbol} is first created, it has no @i{home package}. ++When it is first @i{interned}, the @i{package} in which it is ++initially @i{interned} becomes its @i{home package}. ++The @i{home package} of a @i{symbol} can be @i{accessed} ++by using the @i{function} @b{symbol-package}. ++ ++If a @i{symbol} is @i{uninterned} from the @i{package} ++which is its @i{home package}, its @i{home package} is set to @b{nil}. ++Depending on whether there is another @i{package} in which the @i{symbol} ++is @i{interned}, the symbol might or might not really be an @i{uninterned} @i{symbol}. ++A @i{symbol} with no @i{home package} is therefore called ++@i{apparently uninterned}. ++ ++The consequences are undefined if an attempt is made to alter the @i{home package} ++of a @i{symbol} ++external ++in the @t{COMMON-LISP} @i{package} or the @t{KEYWORD} @i{package}. ++ ++@item @b{Property list} ++The @i{property list} of a @i{symbol} provides a mechanism for ++associating named attributes with that @i{symbol}. ++The operations for adding and removing entries are @i{destructive} ++to the @i{property list}. @r{Common Lisp} provides @i{operators} both for ++direct manipulation of @i{property list} @i{objects} ++ (@i{e.g.}, see @b{getf}, @b{remf}, and @b{symbol-plist}) ++and for implicit manipulation of a @i{symbol}'s @i{property list} ++by reference to the @i{symbol} ++ (@i{e.g.}, see @b{get} and @b{remprop}). ++The @i{property list} associated with a @i{fresh} @i{symbol} is ++initially @i{null}. ++ ++@item @b{Value} ++If a symbol has a value attribute, it is said to be @i{bound}, ++and that fact can be detected by the @i{function} @b{boundp}. ++The @i{object} contained in the @i{value cell} of a @i{bound} @i{symbol} ++is the @i{value} of the @i{global variable} named by that @i{symbol}, ++and can be @i{accessed} by the @i{function} @b{symbol-value}. ++A @i{symbol} can be made to be @i{unbound} by the @i{function} @b{makunbound}. ++ ++The consequences are undefined if an attempt is made to change the @i{value} ++of a @i{symbol} that names a @i{constant variable}, or to make such a ++@i{symbol} be @i{unbound}. ++ ++@item @b{Function} ++If a symbol has a function attribute, it is said to be @i{fbound}, ++and that fact can be detected by the @i{function} @b{fboundp}. ++If the @i{symbol} is the @i{name} of a @i{function} in the @i{global environment}, ++the @i{function cell} contains the @i{function}, ++and can be @i{accessed} by the @i{function} @b{symbol-function}. ++If the @i{symbol} is the @i{name} of either ++ a @i{macro} in the @i{global environment} (see @b{macro-function}) ++or a @i{special operator} (see @b{special-operator-p}), ++the @i{symbol} is @i{fbound}, ++and can be @i{accessed} by the @i{function} @b{symbol-function}, ++but the @i{object} which the @i{function cell} ++contains is of @i{implementation-dependent} @i{type} and purpose. ++A @i{symbol} can be made to be @i{funbound} by the @i{function} @b{fmakunbound}. ++ ++The consequences are undefined if an attempt is made to change the @i{functional value} ++of a @i{symbol} that names a @i{special form}. ++ ++@end table ++ ++Operations on a @i{symbol}'s @i{value cell} and @i{function cell} are ++sometimes described in terms of their effect on the @i{symbol} itself, but ++the user should keep in mind that there is an intimate relationship between the ++contents of those @i{cells} and the @i{global variable} or ++global @i{function} definition, respectively. ++ ++@i{Symbols} are used as identifiers for @i{lexical variables} and ++lexical @i{function} definitions, but in that role, only their @i{object} ++identity is significant. @r{Common Lisp} provides no operation on a @i{symbol} that ++can have any effect on a @i{lexical variable} or ++on a lexical @i{function} definition. ++ ++@subsubheading See Also:: ++ ++@ref{Symbols as Tokens}, ++@ref{Potential Numbers as Tokens}, ++@ref{Printing Symbols} ++ ++@node keyword, symbolp, symbol, Symbols Dictionary ++@subsection keyword [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{keyword}, ++@b{symbol}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{keyword} includes all @i{symbols} @i{interned} the @t{KEYWORD} @i{package}. ++ ++@i{Interning} a @i{symbol} in the @t{KEYWORD} @i{package} has three automatic effects: ++ ++@table @asis ++ ++@item 1. ++It causes the @i{symbol} to become @i{bound} to itself. ++@item 2. ++It causes the @i{symbol} to become an @i{external symbol} ++ of the @t{KEYWORD} @i{package}. ++@item 3. ++It causes the @i{symbol} to become a @i{constant variable}. ++@end table ++ ++@subsubheading See Also:: ++ ++@ref{keywordp} ++ ++@node symbolp, keywordp, keyword, Symbols Dictionary ++@subsection symbolp [Function] ++ ++@code{symbolp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{symbol}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (symbolp 'elephant) @result{} @i{true} ++ (symbolp 12) @result{} @i{false} ++ (symbolp nil) @result{} @i{true} ++ (symbolp '()) @result{} @i{true} ++ (symbolp :test) @result{} @i{true} ++ (symbolp "hello") @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{keywordp} ++, ++@b{symbol}, ++@ref{typep} ++ ++@subsubheading Notes:: ++ ++@example ++ (symbolp @i{object}) @equiv{} (typep @i{object} 'symbol) ++@end example ++ ++@node keywordp, make-symbol, symbolp, Symbols Dictionary ++@subsection keywordp [Function] ++ ++@code{keywordp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is a @i{keyword}_1; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (keywordp 'elephant) @result{} @i{false} ++ (keywordp 12) @result{} @i{false} ++ (keywordp :test) @result{} @i{true} ++ (keywordp ':test) @result{} @i{true} ++ (keywordp nil) @result{} @i{false} ++ (keywordp :nil) @result{} @i{true} ++ (keywordp '(:test)) @result{} @i{false} ++ (keywordp "hello") @result{} @i{false} ++ (keywordp ":hello") @result{} @i{false} ++ (keywordp '&optional) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{constantp} ++, ++@ref{keyword} ++, ++@ref{symbolp} ++, ++@ref{symbol-package} ++ ++@node make-symbol, copy-symbol, keywordp, Symbols Dictionary ++@subsection make-symbol [Function] ++ ++@code{make-symbol} @i{name} @result{} @i{new-symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{string}. ++ ++@i{new-symbol}---a @i{fresh}, @i{uninterned} @i{symbol}. ++ ++@subsubheading Description:: ++ ++@b{make-symbol} creates and returns a @i{fresh}, @i{uninterned} ++@i{symbol} whose @i{name} is the given @i{name}. ++The @i{new-symbol} is neither @i{bound} nor @i{fbound} ++and has a @i{null} @i{property list}. ++ ++It is @i{implementation-dependent} whether the @i{string} ++that becomes the @i{new-symbol}'s @i{name} is the given ++@i{name} or a copy of it. Once a @i{string} ++has been given as the @i{name} @i{argument} to ++@i{make-symbol}, the consequences are undefined if a ++subsequent attempt is made to alter that @i{string}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq temp-string "temp") @result{} "temp" ++ (setq temp-symbol (make-symbol temp-string)) @result{} #:|temp| ++ (symbol-name temp-symbol) @result{} "temp" ++ (eq (symbol-name temp-symbol) temp-string) @result{} @i{implementation-dependent} ++ (find-symbol "temp") @result{} NIL, NIL ++ (eq (make-symbol temp-string) (make-symbol temp-string)) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{name} is not a @i{string}. ++ ++@subsubheading See Also:: ++ ++@ref{copy-symbol} ++ ++@subsubheading Notes:: ++ ++No attempt is made by @b{make-symbol} to convert the case ++of the @i{name} to uppercase. The only case conversion which ever ++occurs for @i{symbols} is done by the @i{Lisp reader}. ++The program interface to @i{symbol} creation retains case, ++and the program interface to interning symbols is case-sensitive. ++ ++@node copy-symbol, gensym, make-symbol, Symbols Dictionary ++@subsection copy-symbol [Function] ++ ++@code{copy-symbol} @i{symbol @r{&optional} copy-properties} @result{} @i{new-symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{copy-properties}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{new-symbol}---a @i{fresh}, @i{uninterned} @i{symbol}. ++ ++@subsubheading Description:: ++ ++@b{copy-symbol} returns a @i{fresh}, @i{uninterned} @i{symbol}, ++the @i{name} of which is @b{string=} to and possibly the @i{same} as ++the @i{name} of the given @i{symbol}. ++ ++If @i{copy-properties} is @i{false}, ++the @i{new-symbol} is neither @i{bound} nor @i{fbound} ++and has a @i{null} @i{property list}. ++If @i{copy-properties} is @i{true}, then ++the initial @i{value} of @i{new-symbol} is ++ the @i{value} of @i{symbol}, ++the initial @i{function} definition of @i{new-symbol} is ++ the @i{functional value} of @i{symbol}, ++and the @i{property list} of @i{new-symbol} is ++ ++ a @i{copy}_2 of the @i{property list} of @i{symbol}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq fred 'fred-smith) @result{} FRED-SMITH ++ (setf (symbol-value fred) 3) @result{} 3 ++ (setq fred-clone-1a (copy-symbol fred nil)) @result{} #:FRED-SMITH ++ (setq fred-clone-1b (copy-symbol fred nil)) @result{} #:FRED-SMITH ++ (setq fred-clone-2a (copy-symbol fred t)) @result{} #:FRED-SMITH ++ (setq fred-clone-2b (copy-symbol fred t)) @result{} #:FRED-SMITH ++ (eq fred fred-clone-1a) @result{} @i{false} ++ (eq fred-clone-1a fred-clone-1b) @result{} @i{false} ++ (eq fred-clone-2a fred-clone-2b) @result{} @i{false} ++ (eq fred-clone-1a fred-clone-2a) @result{} @i{false} ++ (symbol-value fred) @result{} 3 ++ (boundp fred-clone-1a) @result{} @i{false} ++ (symbol-value fred-clone-2a) @result{} 3 ++ (setf (symbol-value fred-clone-2a) 4) @result{} 4 ++ (symbol-value fred) @result{} 3 ++ (symbol-value fred-clone-2a) @result{} 4 ++ (symbol-value fred-clone-2b) @result{} 3 ++ (boundp fred-clone-1a) @result{} @i{false} ++ (setf (symbol-function fred) #'(lambda (x) x)) @result{} # ++ (fboundp fred) @result{} @i{true} ++ (fboundp fred-clone-1a) @result{} @i{false} ++ (fboundp fred-clone-2a) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{make-symbol} ++ ++@subsubheading Notes:: ++ ++Implementors are encouraged not to copy the @i{string} ++which is the @i{symbol}'s @i{name} unnecessarily. ++Unless there is a good reason to do so, the normal implementation ++strategy is for the @i{new-symbol}'s @i{name} to ++be @i{identical} to the given @i{symbol}'s @i{name}. ++ ++@node gensym, *gensym-counter*, copy-symbol, Symbols Dictionary ++@subsection gensym [Function] ++ ++@code{gensym} @i{@r{&optional} x} @result{} @i{new-symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---a @i{string} or a non-negative @i{integer}. ++ Complicated defaulting behavior; see below. ++ ++@i{new-symbol}---a @i{fresh}, @i{uninterned} @i{symbol}. ++ ++@subsubheading Description:: ++ ++Creates and returns a @i{fresh}, @i{uninterned} @i{symbol}, ++as if by calling @b{make-symbol}. (The only difference between ++@b{gensym} and @b{make-symbol} is in how the @i{new-symbol}'s ++@i{name} is determined.) ++ ++The @i{name} of the @i{new-symbol} is the concatenation ++of a prefix, which defaults to @t{"G"}, and ++ ++a suffix, which is the decimal representation of a number that ++defaults to the @i{value} of @b{*gensym-counter*}. ++ ++If @i{x} is supplied, and is a @i{string}, then that @i{string} ++is used as a prefix instead of @t{"G"} for this call to @b{gensym} only. ++ ++If @i{x} is supplied, and is an @i{integer}, then that @i{integer}, ++instead of the @i{value} of @b{*gensym-counter*}, is used as the suffix ++for this call to @b{gensym} only. ++ ++If and only if no explicit suffix is supplied, ++@b{*gensym-counter*} is incremented after it is used. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq sym1 (gensym)) @result{} #:G3142 ++ (symbol-package sym1) @result{} NIL ++ (setq sym2 (gensym 100)) @result{} #:G100 ++ (setq sym3 (gensym 100)) @result{} #:G100 ++ (eq sym2 sym3) @result{} @i{false} ++ (find-symbol "G100") @result{} NIL, NIL ++ (gensym "T") @result{} #:T3143 ++ (gensym) @result{} #:G3144 ++@end example ++ ++@subsubheading Side Effects:: ++ ++Might increment @b{*gensym-counter*}. ++ ++@subsubheading Affected By:: ++ ++@b{*gensym-counter*} ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{x} is not a @i{string} or a non-negative @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{gentemp} ++, ++@b{*gensym-counter*} ++ ++@subsubheading Notes:: ++ ++The ability to pass a numeric argument to @b{gensym} has been deprecated; ++explicitly @i{binding} @b{*gensym-counter*} is now stylistically preferred. ++(The somewhat baroque conventions for the optional argument are historical ++in nature, and supported primarily for compatibility with older dialects ++of @r{Lisp}. In modern code, it is recommended that the only kind of argument ++used be a string prefix. In general, though, to obtain more flexible control ++of the @i{new-symbol}'s @i{name}, consider using @b{make-symbol} instead.) ++ ++@node *gensym-counter*, gentemp, gensym, Symbols Dictionary ++@subsection *gensym-counter* [Variable] ++ ++@subsubheading Value Type:: ++ ++a non-negative @i{integer}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++A number which will be used in constructing the @i{name} of ++the next @i{symbol} generated by the @i{function} @b{gensym}. ++ ++@b{*gensym-counter*} can be either @i{assigned} or @i{bound} ++at any time, but its value must always be a non-negative @i{integer}. ++ ++@subsubheading Affected By:: ++ ++@b{gensym}. ++ ++@subsubheading See Also:: ++ ++@ref{gensym} ++ ++@subsubheading Notes:: ++ ++The ability to pass a numeric argument to @b{gensym} has been deprecated; ++explicitly @i{binding} @b{*gensym-counter*} is now stylistically preferred. ++ ++@node gentemp, symbol-function, *gensym-counter*, Symbols Dictionary ++@subsection gentemp [Function] ++ ++@code{gentemp} @i{@r{&optional} prefix package} @result{} @i{new-symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{prefix}---a @i{string}. ++ The default is @t{"T"}. ++ ++@i{package}---a @i{package designator}. ++ The default is the @i{current package}. ++ ++@i{new-symbol}---a @i{fresh}, @i{interned} @i{symbol}. ++ ++@subsubheading Description:: ++ ++@b{gentemp} creates and returns a @i{fresh} @i{symbol}, ++@i{interned} in the indicated @i{package}. ++The @i{symbol} is guaranteed to be one that was not previously ++@i{accessible} in @i{package}. ++It is neither @i{bound} nor @i{fbound}, and has a @i{null} ++@i{property list}. ++ ++The @i{name} of the @i{new-symbol} is the concatenation ++of the @i{prefix} and a suffix, which is taken from an internal ++counter used only by @b{gentemp}. (If a @i{symbol} by that name ++is already @i{accessible} in @i{package}, the counter is incremented as ++many times as is necessary to produce a @i{name} that is not already the ++@i{name} of a @i{symbol} @i{accessible} in @i{package}.) ++ ++@subsubheading Examples:: ++ ++@example ++ (gentemp) @result{} T1298 ++ (gentemp "FOO") @result{} FOO1299 ++ (find-symbol "FOO1300") @result{} NIL, NIL ++ (gentemp "FOO") @result{} FOO1300 ++ (find-symbol "FOO1300") @result{} FOO1300, :INTERNAL ++ (intern "FOO1301") @result{} FOO1301, :INTERNAL ++ (gentemp "FOO") @result{} FOO1302 ++ (gentemp) @result{} T1303 ++@end example ++ ++@subsubheading Side Effects:: ++ ++Its internal counter is incremented one or more times. ++ ++@i{Interns} the @i{new-symbol} in @i{package}. ++ ++@subsubheading Affected By:: ++ ++The current state of its internal counter, and ++the current state of the @i{package}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{prefix} is not a @i{string}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{package} is not a @i{package designator}. ++ ++@subsubheading See Also:: ++ ++@ref{gensym} ++ ++@subsubheading Notes:: ++ ++The function @b{gentemp} is deprecated. ++ ++If @i{package} is the @t{KEYWORD} @i{package}, ++the result is an @i{external symbol} of @i{package}. ++Otherwise, the result is an @i{internal symbol} of @i{package}. ++ ++The @b{gentemp} internal counter is independent of ++@b{*gensym-counter*}, the counter used by @b{gensym}. ++There is no provision for accessing the @b{gentemp} internal counter. ++ ++Just because @b{gentemp} creates a @i{symbol} which did not ++previously exist does not mean that such a @i{symbol} might not be ++seen in the future (@i{e.g.}, in a data file---perhaps even created by the ++same program in another session). As such, this symbol is not truly ++unique in the same sense as a @i{gensym} would be. In particular, ++programs which do automatic code generation should be careful not to ++attach global attributes to such generated @i{symbols} (@i{e.g.}, @b{special} @i{declarations}) and then write them into a file ++because such global attributes might, in a different session, end up ++applying to other @i{symbols} that were automatically generated on ++another day for some other purpose. ++ ++@node symbol-function, symbol-name, gentemp, Symbols Dictionary ++@subsection symbol-function [Accessor] ++ ++@code{symbol-function} @i{symbol} @result{} @i{contents} ++ ++(setf (@code{ symbol-function} @i{symbol}) new-contents)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{contents}--- ++ ++If the @i{symbol} is globally defined as a @i{macro} or a @i{special operator}, ++an @i{object} of @i{implementation-dependent} nature and identity is returned. ++If the @i{symbol} is not globally defined as ++ either a @i{macro} or a @i{special operator}, ++and ++ if the @i{symbol} is @i{fbound}, ++a @i{function} @i{object} is returned. ++ ++@i{new-contents}---a @i{function}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{symbol}'s @i{function cell}. ++ ++@subsubheading Examples:: ++ ++@example ++ (symbol-function 'car) @result{} # ++ (symbol-function 'twice) is an error ;because TWICE isn't defined. ++ (defun twice (n) (* n 2)) @result{} TWICE ++ (symbol-function 'twice) @result{} # ++ (list (twice 3) ++ (funcall (function twice) 3) ++ (funcall (symbol-function 'twice) 3)) ++@result{} (6 6 6) ++ (flet ((twice (x) (list x x))) ++ (list (twice 3) ++ (funcall (function twice) 3) ++ (funcall (symbol-function 'twice) 3))) ++@result{} ((3 3) (3 3) 6) ++ (setf (symbol-function 'twice) #'(lambda (x) (list x x))) ++@result{} # ++ (list (twice 3) ++ (funcall (function twice) 3) ++ (funcall (symbol-function 'twice) 3)) ++@result{} ((3 3) (3 3) (3 3)) ++ (fboundp 'defun) @result{} @i{true} ++ (symbol-function 'defun) ++@result{} @i{implementation-dependent} ++ (functionp (symbol-function 'defun)) ++@result{} @i{implementation-dependent} ++ (defun symbol-function-or-nil (symbol) ++ (if (and (fboundp symbol) ++ (not (macro-function symbol)) ++ (not (special-operator-p symbol))) ++ (symbol-function symbol) ++ nil)) @result{} SYMBOL-FUNCTION-OR-NIL ++ (symbol-function-or-nil 'car) @result{} # ++ (symbol-function-or-nil 'defun) @result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{defun} ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++Should signal @b{undefined-function} if @i{symbol} is not @i{fbound} ++and an attempt is made to @i{read} its definition. (No such error is signaled ++on an attempt to @i{write} its definition.) ++ ++@subsubheading See Also:: ++ ++@ref{fboundp} ++, ++@ref{fmakunbound} ++, ++@ref{macro-function} ++, ++ ++@ref{special-operator-p} ++ ++@subsubheading Notes:: ++@b{symbol-function} cannot @i{access} the value of a lexical function name ++produced by @b{flet} or @b{labels}; it can @i{access} only ++the global function value. ++ ++@b{setf} may be used with ++@b{symbol-function} to replace a global function ++definition when the @i{symbol}'s function definition ++does not represent a @i{special operator}. ++ ++@example ++(symbol-function @i{symbol}) @equiv{} (fdefinition @i{symbol}) ++@end example ++ ++However, @b{fdefinition} accepts arguments other than just @i{symbols}. ++ ++@node symbol-name, symbol-package, symbol-function, Symbols Dictionary ++@subsection symbol-name [Function] ++ ++@code{symbol-name} @i{symbol} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{name}---a @i{string}. ++ ++@subsubheading Description:: ++ ++@b{symbol-name} returns the @i{name} of @i{symbol}. ++ ++The consequences are undefined if @i{name} is ever modified. ++ ++@subsubheading Examples:: ++ ++@example ++ (symbol-name 'temp) @result{} "TEMP" ++ (symbol-name :start) @result{} "START" ++ (symbol-name (gensym)) @result{} "G1234" ;for example ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@node symbol-package, symbol-plist, symbol-name, Symbols Dictionary ++@subsection symbol-package [Function] ++ ++@code{symbol-package} @i{symbol} @result{} @i{contents} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{contents}---a @i{package} @i{object} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns the @i{home package} of @i{symbol}. ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "CL-USER") @result{} # ++ (symbol-package 'car) @result{} # ++ (symbol-package 'bus) @result{} # ++ (symbol-package :optional) @result{} # ++ ;; Gensyms are uninterned, so have no home package. ++ (symbol-package (gensym)) @result{} NIL ++ (make-package 'pk1) @result{} # ++ (intern "SAMPLE1" "PK1") @result{} PK1::SAMPLE1, NIL ++ (export (find-symbol "SAMPLE1" "PK1") "PK1") @result{} T ++ (make-package 'pk2 :use '(pk1)) @result{} # ++ (find-symbol "SAMPLE1" "PK2") @result{} PK1:SAMPLE1, :INHERITED ++ (symbol-package 'pk1::sample1) @result{} # ++ (symbol-package 'pk2::sample1) @result{} # ++ (symbol-package 'pk1::sample2) @result{} # ++ (symbol-package 'pk2::sample2) @result{} # ++ ;; The next several forms create a scenario in which a symbol ++ ;; is not really uninterned, but is "apparently uninterned", ++ ;; and so SYMBOL-PACKAGE still returns NIL. ++ (setq s3 'pk1::sample3) @result{} PK1::SAMPLE3 ++ (import s3 'pk2) @result{} T ++ (unintern s3 'pk1) @result{} T ++ (symbol-package s3) @result{} NIL ++ (eq s3 'pk2::sample3) @result{} T ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{import}, ++@b{intern}, ++@b{unintern} ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{intern} ++ ++@node symbol-plist, symbol-value, symbol-package, Symbols Dictionary ++@subsection symbol-plist [Accessor] ++ ++@code{symbol-plist} @i{symbol} @result{} @i{plist} ++ ++(setf (@code{ symbol-plist} @i{symbol}) new-plist)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{plist}, @i{new-plist}---a @i{property list}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{property list} of @i{symbol}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq sym (gensym)) @result{} #:G9723 ++ (symbol-plist sym) @result{} () ++ (setf (get sym 'prop1) 'val1) @result{} VAL1 ++ (symbol-plist sym) @result{} (PROP1 VAL1) ++ (setf (get sym 'prop2) 'val2) @result{} VAL2 ++ (symbol-plist sym) @result{} (PROP2 VAL2 PROP1 VAL1) ++ (setf (symbol-plist sym) (list 'prop3 'val3)) @result{} (PROP3 VAL3) ++ (symbol-plist sym) @result{} (PROP3 VAL3) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{get} ++, ++@ref{remprop} ++ ++@subsubheading Notes:: ++ ++The use of @b{setf} should be avoided, since a @i{symbol}'s ++@i{property list} is a global resource that can contain information ++established and depended upon by unrelated programs in the same @i{Lisp image}. ++ ++@node symbol-value, get, symbol-plist, Symbols Dictionary ++@subsection symbol-value [Accessor] ++ ++@code{symbol-value} @i{symbol} @result{} @i{value} ++ ++(setf (@code{ symbol-value} @i{symbol}) new-value)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol} that must have a @i{value}. ++ ++@i{value}, @i{new-value}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{symbol}'s @i{value cell}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setf (symbol-value 'a) 1) @result{} 1 ++ (symbol-value 'a) @result{} 1 ++ ;; SYMBOL-VALUE cannot see lexical variables. ++ (let ((a 2)) (symbol-value 'a)) @result{} 1 ++ (let ((a 2)) (setq a 3) (symbol-value 'a)) @result{} 1 ++ ;; SYMBOL-VALUE can see dynamic variables. ++ (let ((a 2)) ++ (declare (special a)) ++ (symbol-value 'a)) @result{} 2 ++ (let ((a 2)) ++ (declare (special a)) ++ (setq a 3) ++ (symbol-value 'a)) @result{} 3 ++ (let ((a 2)) ++ (setf (symbol-value 'a) 3) ++ a) @result{} 2 ++ a @result{} 3 ++ (symbol-value 'a) @result{} 3 ++ (let ((a 4)) ++ (declare (special a)) ++ (let ((b (symbol-value 'a))) ++ (setf (symbol-value 'a) 5) ++ (values a b))) @result{} 5, 4 ++ a @result{} 3 ++ (symbol-value :any-keyword) @result{} :ANY-KEYWORD ++ (symbol-value 'nil) @result{} NIL ++ (symbol-value '()) @result{} NIL ++ ;; The precision of this next one is @i{implementation-dependent}. ++ (symbol-value 'pi) @result{} 3.141592653589793d0 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{makunbound}, ++@b{set}, ++@b{setq} ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++Should signal @b{unbound-variable} if @i{symbol} is @i{unbound} ++and an attempt is made to @i{read} its @i{value}. (No such error is signaled ++on an attempt to @i{write} its @i{value}.) ++ ++@subsubheading See Also:: ++ ++@ref{boundp} ++, ++@ref{makunbound} ++, ++@ref{set} ++, ++@ref{setq} ++ ++@subsubheading Notes:: ++ ++@b{symbol-value} can be used to get the value of a @i{constant variable}. ++@b{symbol-value} cannot @i{access} the value of a @i{lexical variable}. ++ ++@node get, remprop, symbol-value, Symbols Dictionary ++@subsection get [Accessor] ++ ++@code{get} @i{symbol indicator @r{&optional} default} @result{} @i{value} ++ ++(setf (@code{ get} @i{symbol indicator @r{&optional} default}) new-value)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{indicator}---an @i{object}. ++ ++@i{default}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{value}---if the indicated property exists, ++ the @i{object} that is its @i{value}; ++ otherwise, the specified @i{default}. ++ ++@i{new-value}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{get} finds a @i{property} ++on the @i{property list}_2 of @i{symbol} ++whose @i{property indicator} is @i{identical} to @i{indicator}, ++and returns its corresponding @i{property value}. ++ ++If there are multiple @i{properties}_1 with that @i{property indicator}, ++@b{get} uses the first such @i{property}. ++ ++If there is no @i{property} with that @i{property indicator}, ++@i{default} is returned. ++ ++@b{setf} of @b{get} may be used to associate a new @i{object} ++with an existing indicator already on the @i{symbol}'s @i{property list}, ++or to create a new assocation if none exists. ++ ++If there are multiple @i{properties}_1 with that @i{property indicator}, ++@b{setf} of @b{get} associates the @i{new-value} ++with the first such @i{property}. ++ ++When a @b{get} @i{form} is used as a @b{setf} @i{place}, ++any @i{default} which is supplied is evaluated according to normal ++left-to-right evaluation rules, but its @i{value} is ignored. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun make-person (first-name last-name) ++ (let ((person (gensym "PERSON"))) ++ (setf (get person 'first-name) first-name) ++ (setf (get person 'last-name) last-name) ++ person)) @result{} MAKE-PERSON ++ (defvar *john* (make-person "John" "Dow")) @result{} *JOHN* ++ *john* @result{} #:PERSON4603 ++ (defvar *sally* (make-person "Sally" "Jones")) @result{} *SALLY* ++ (get *john* 'first-name) @result{} "John" ++ (get *sally* 'last-name) @result{} "Jones" ++ (defun marry (man woman married-name) ++ (setf (get man 'wife) woman) ++ (setf (get woman 'husband) man) ++ (setf (get man 'last-name) married-name) ++ (setf (get woman 'last-name) married-name) ++ married-name) @result{} MARRY ++ (marry *john* *sally* "Dow-Jones") @result{} "Dow-Jones" ++ (get *john* 'last-name) @result{} "Dow-Jones" ++ (get (get *john* 'wife) 'first-name) @result{} "Sally" ++ (symbol-plist *john*) ++@result{} (WIFE #:PERSON4604 LAST-NAME "Dow-Jones" FIRST-NAME "John") ++ (defmacro age (person &optional (default ''thirty-something)) ++ `(get ,person 'age ,default)) @result{} AGE ++ (age *john*) @result{} THIRTY-SOMETHING ++ (age *john* 20) @result{} 20 ++ (setf (age *john*) 25) @result{} 25 ++ (age *john*) @result{} 25 ++ (age *john* 20) @result{} 25 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{getf} ++, ++@ref{symbol-plist} ++, ++@ref{remprop} ++ ++@subsubheading Notes:: ++ ++@example ++ (get x y) @equiv{} (getf (symbol-plist x) y) ++@end example ++ ++@i{Numbers} and @i{characters} are not recommended for use ++as @i{indicators} in portable code since @b{get} tests ++with @b{eq} rather than @b{eql}, and consequently ++the effect of using such @i{indicators} is ++@i{implementation-dependent}. ++ ++There is no way using @b{get} to distinguish an absent property from ++one whose value is @i{default}. However, see @b{get-properties}. ++ ++@node remprop, boundp, get, Symbols Dictionary ++@subsection remprop [Function] ++ ++@code{remprop} @i{symbol indicator} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{indicator}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{remprop} removes from the @i{property list}_2 of @i{symbol} ++a @i{property}_1 with a @i{property indicator} ++@i{identical} to @i{indicator}. ++ ++If there are multiple @i{properties}_1 with the @i{identical} key, ++@b{remprop} only removes the first such @i{property}. ++ ++@b{remprop} returns @i{false} if no such @i{property} was found, ++or @i{true} if a property was found. ++ ++The @i{property indicator} ++and the corresponding @i{property value} ++are removed in an undefined order ++by destructively splicing the property list. ++ ++The permissible side-effects correspond to those permitted for @b{remf}, ++such that: ++ ++@example ++ (remprop @i{x} @i{y}) @equiv{} (remf (symbol-plist @i{x}) @i{y}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (setq test (make-symbol "PSEUDO-PI")) @result{} #:PSEUDO-PI ++ (symbol-plist test) @result{} () ++ (setf (get test 'constant) t) @result{} T ++ (setf (get test 'approximation) 3.14) @result{} 3.14 ++ (setf (get test 'error-range) 'noticeable) @result{} NOTICEABLE ++ (symbol-plist test) ++@result{} (ERROR-RANGE NOTICEABLE APPROXIMATION 3.14 CONSTANT T) ++ (setf (get test 'approximation) nil) @result{} NIL ++ (symbol-plist test) ++@result{} (ERROR-RANGE NOTICEABLE APPROXIMATION NIL CONSTANT T) ++ (get test 'approximation) @result{} NIL ++ (remprop test 'approximation) @result{} @i{true} ++ (get test 'approximation) @result{} NIL ++ (symbol-plist test) ++@result{} (ERROR-RANGE NOTICEABLE CONSTANT T) ++ (remprop test 'approximation) @result{} NIL ++ (symbol-plist test) ++@result{} (ERROR-RANGE NOTICEABLE CONSTANT T) ++ (remprop test 'error-range) @result{} @i{true} ++ (setf (get test 'approximation) 3) @result{} 3 ++ (symbol-plist test) ++@result{} (APPROXIMATION 3 CONSTANT T) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{property list} of @i{symbol} is modified. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{remf} ++, ++@ref{symbol-plist} ++ ++@subsubheading Notes:: ++ ++@i{Numbers} and @i{characters} are not recommended for use as ++@i{indicators} in portable code since @b{remprop} tests with ++@b{eq} rather than @b{eql}, and consequently the effect of ++using such @i{indicators} is @i{implementation-dependent}. ++Of course, if you've gotten as far as needing to remove such a ++@i{property}, you don't have much choice---the time to have been ++thinking about this was when you used @b{setf} of @b{get} to ++establish the @i{property}. ++ ++@node boundp, makunbound, remprop, Symbols Dictionary ++@subsection boundp [Function] ++ ++@code{boundp} @i{symbol} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{symbol} is @i{bound}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq x 1) @result{} 1 ++ (boundp 'x) @result{} @i{true} ++ (makunbound 'x) @result{} X ++ (boundp 'x) @result{} @i{false} ++ (let ((x 2)) (boundp 'x)) @result{} @i{false} ++ (let ((x 2)) (declare (special x)) (boundp 'x)) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{set} ++, ++@ref{setq} ++, ++@ref{symbol-value} ++, ++@ref{makunbound} ++ ++@subsubheading Notes:: ++ ++The @i{function} @b{bound} determines only whether a @i{symbol} has a ++value in the @i{global environment}; any @i{lexical bindings} ++are ignored. ++ ++@node makunbound, set, boundp, Symbols Dictionary ++@subsection makunbound [Function] ++ ++@code{makunbound} @i{symbol} @result{} @i{symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol} ++ ++@subsubheading Description:: ++ ++Makes the @i{symbol} be @i{unbound}, ++regardless of whether it was previously @i{bound}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setf (symbol-value 'a) 1) ++ (boundp 'a) @result{} @i{true} ++ a @result{} 1 ++ (makunbound 'a) @result{} A ++ (boundp 'a) @result{} @i{false} ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{value cell} of @i{symbol} is modified. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{symbol} is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{boundp} ++, ++@ref{fmakunbound} ++ ++@node set, unbound-variable, makunbound, Symbols Dictionary ++@subsection set [Function] ++ ++@code{set} @i{symbol value} @result{} @i{value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{value}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{set} changes the contents of the @i{value cell} of @i{symbol} ++to the given @i{value}. ++ ++@example ++(set @i{symbol} @i{value}) @equiv{} (setf (symbol-value @i{symbol}) @i{value}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (setf (symbol-value 'n) 1) @result{} 1 ++ (set 'n 2) @result{} 2 ++ (symbol-value 'n) @result{} 2 ++ (let ((n 3)) ++ (declare (special n)) ++ (setq n (+ n 1)) ++ (setf (symbol-value 'n) (* n 10)) ++ (set 'n (+ (symbol-value 'n) n)) ++ n) @result{} 80 ++ n @result{} 2 ++ (let ((n 3)) ++ (setq n (+ n 1)) ++ (setf (symbol-value 'n) (* n 10)) ++ (set 'n (+ (symbol-value 'n) n)) ++ n) @result{} 4 ++ n @result{} 44 ++ (defvar *n* 2) ++ (let ((*n* 3)) ++ (setq *n* (+ *n* 1)) ++ (setf (symbol-value '*n*) (* *n* 10)) ++ (set '*n* (+ (symbol-value '*n*) *n*)) ++ *n*) @result{} 80 ++ *n* @result{} 2 ++ (defvar *even-count* 0) @result{} *EVEN-COUNT* ++ (defvar *odd-count* 0) @result{} *ODD-COUNT* ++ (defun tally-list (list) ++ (dolist (element list) ++ (set (if (evenp element) '*even-count* '*odd-count*) ++ (+ element (if (evenp element) *even-count* *odd-count*))))) ++ (tally-list '(1 9 4 3 2 7)) @result{} NIL ++ *even-count* @result{} 6 ++ *odd-count* @result{} 20 ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{value} of @i{symbol} is changed. ++ ++@subsubheading See Also:: ++ ++@ref{setq} ++, ++@ref{progv} ++, ++@ref{symbol-value} ++ ++@subsubheading Notes:: ++ ++The function @b{set} is deprecated. ++ ++@b{set} cannot change the value of a @i{lexical variable}. ++ ++@node unbound-variable, , set, Symbols Dictionary ++@subsection unbound-variable [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{unbound-variable}, ++@b{cell-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{unbound-variable} consists of @i{error} @i{conditions} ++that represent attempts to @i{read} the @i{value} of an @i{unbound variable}. ++ ++The name of the cell (see @b{cell-error}) is the @i{name} of the ++@i{variable} that was @i{unbound}. ++ ++@subsubheading See Also:: ++ ++@ref{cell-error-name} ++ ++@c end of including dict-symbols ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-11.texi +@@ -0,0 +1,2711 @@ ++ ++ ++@node Packages, Numbers (Numbers), Symbols, Top ++@chapter Packages ++ ++@menu ++* Package Concepts:: ++* Packages Dictionary:: ++@end menu ++ ++@node Package Concepts, Packages Dictionary, Packages, Packages ++@section Package Concepts ++ ++@c including concept-packages ++ ++@menu ++* Introduction to Packages:: ++* Standardized Packages:: ++@end menu ++ ++@node Introduction to Packages, Standardized Packages, Package Concepts, Package Concepts ++@subsection Introduction to Packages ++ ++A @i{package} ++@IGindex package ++ establishes a mapping from names to @i{symbols}. ++At any given time, one @i{package} is current. ++The @i{current package} ++@IGindex current package ++ is the one that is the @i{value} of @b{*package*}. ++When using the @i{Lisp reader}, ++it is possible to refer to @i{symbols} in @i{packages} ++other than the current one through the use of @i{package prefixes} in the ++printed representation of the @i{symbol}. ++ ++Figure 11--1 lists some @i{defined names} that are applicable ++to @i{packages}. ++Where an @i{operator} ++takes an argument that is either a @i{symbol} or a @i{list} ++of @i{symbols}, ++an argument of @b{nil} is treated as an empty @i{list} of @i{symbols}. ++Any @i{package} argument may be either a @i{string}, a @i{symbol}, or ++a @i{package}. If a @i{symbol} is supplied, its name will be used ++as the @i{package} name. ++ ++@format ++@group ++@noindent ++@w{ *modules* import provide } ++@w{ *package* in-package rename-package } ++@w{ defpackage intern require } ++@w{ do-all-symbols list-all-packages shadow } ++@w{ do-external-symbols make-package shadowing-import } ++@w{ do-symbols package-name unexport } ++@w{ export package-nicknames unintern } ++@w{ find-all-symbols package-shadowing-symbols unuse-package } ++@w{ find-package package-use-list use-package } ++@w{ find-symbol package-used-by-list } ++ ++@noindent ++@w{ Figure 11--1: Some Defined Names related to Packages } ++ ++@end group ++@end format ++ ++@menu ++* Package Names and Nicknames:: ++* Symbols in a Package:: ++* Internal and External Symbols:: ++* Package Inheritance:: ++* Accessibility of Symbols in a Package:: ++* Locating a Symbol in a Package:: ++* Prevention of Name Conflicts in Packages:: ++@end menu ++ ++@node Package Names and Nicknames, Symbols in a Package, Introduction to Packages, Introduction to Packages ++@subsubsection Package Names and Nicknames ++ ++Each @i{package} has a @i{name} (a @i{string}) and perhaps some @i{nicknames} ++(also @i{strings}). ++These are assigned when the @i{package} is created and can be changed later. ++ ++There is a single namespace for @i{packages}. ++The @i{function} @b{find-package} translates a package ++@i{name} or @i{nickname} into the associated @i{package}. ++The @i{function} @b{package-name} returns the @i{name} of a @i{package}. ++The @i{function} @b{package-nicknames} returns ++a @i{list} of all @i{nicknames} for a @i{package}. ++@b{rename-package} removes a @i{package}'s ++current @i{name} and @i{nicknames} and replaces them with new ones ++specified by the caller. ++ ++@node Symbols in a Package, Internal and External Symbols, Package Names and Nicknames, Introduction to Packages ++@subsubsection Symbols in a Package ++ ++@node Internal and External Symbols, Package Inheritance, Symbols in a Package, Introduction to Packages ++@subsubsection Internal and External Symbols ++ ++The mappings in a @i{package} are divided into two classes, external and internal. ++The @i{symbols} targeted by these different mappings ++are called @i{external symbols} and @i{internal symbols} ++@IGindex internal symbol ++ of the ++@i{package}. Within a @i{package}, a name refers to one ++@i{symbol} or to none; if it does refer ++to a @i{symbol}, then it is either external or internal in that ++@i{package}, but not both. ++@i{External symbols} ++@IGindex external symbol ++ ++are part of the package's public interface to other @i{packages}. ++@i{Symbols} become @i{external symbols} of a given ++@i{package} if they have been @i{exported} from that @i{package}. ++ ++A @i{symbol} has the same @i{name} no matter what @i{package} ++it is @i{present} in, but it might be an @i{external symbol} of some @i{packages} ++and an @i{internal symbol} of others. ++ ++@node Package Inheritance, Accessibility of Symbols in a Package, Internal and External Symbols, Introduction to Packages ++@subsubsection Package Inheritance ++ ++@i{Packages} can be built up in layers. From one point of view, ++a @i{package} is a single collection ++of mappings from @i{strings} into @i{internal symbols} and ++@i{external symbols}. ++However, some of these mappings might be established within the @i{package} ++itself, while other mappings are inherited from other @i{packages} ++via @b{use-package}. ++A @i{symbol} is said to be @i{present} ++@IGindex present ++ in a @i{package} ++if the mapping is in the @i{package} itself and is ++not inherited from somewhere else. ++ ++There is no way to inherit the @i{internal symbols} of another @i{package}; ++to refer to an @i{internal symbol} using the @i{Lisp reader}, ++ a @i{package} containing the @i{symbol} ++ must be made to be the @i{current package}, ++ a @i{package prefix} must be used, ++ or the @i{symbol} must be @i{imported} into the @i{current package}. ++ ++@node Accessibility of Symbols in a Package, Locating a Symbol in a Package, Package Inheritance, Introduction to Packages ++@subsubsection Accessibility of Symbols in a Package ++ ++A @i{symbol} becomes @i{accessible} ++@IGindex accessible ++ in a @i{package} ++ if that is its @i{home package} when it is created, ++ or if it is @i{imported} into that @i{package}, ++ or by inheritance via @b{use-package}. ++ ++If a @i{symbol} is @i{accessible} in a @i{package}, ++it can be referred to when using the @i{Lisp reader} ++without a @i{package prefix} when that @i{package} is the @i{current package}, ++regardless of whether it is @i{present} or inherited. ++ ++@i{Symbols} from one @i{package} can be made @i{accessible} ++in another @i{package} in two ways. ++ ++@table @asis ++ ++@item -- ++Any individual @i{symbol} can be added to a @i{package} by use ++of @b{import}. After the call to @b{import} the ++@i{symbol} is @i{present} in the importing @i{package}. ++The status of the @i{symbol} in the @i{package} ++it came from (if any) is unchanged, and the @i{home package} for ++this @i{symbol} is unchanged. ++Once @i{imported}, a @i{symbol} is @i{present} in the ++importing @i{package} ++and can be removed only by calling @b{unintern}. ++ ++A @i{symbol} is @i{shadowed}_3 by another @i{symbol} ++in some @i{package} if the first @i{symbol} would be @i{accessible} ++by inheritance if not for the presence of the second @i{symbol}. ++See @b{shadowing-import}. ++ ++@item -- ++The second mechanism for making @i{symbols} from one @i{package} ++@i{accessible} in another is provided by @b{use-package}. ++All of the @i{external symbols} of the used @i{package} are inherited ++by the using @i{package}. ++The @i{function} @b{unuse-package} undoes the effects of a previous @b{use-package}. ++@end table ++ ++@node Locating a Symbol in a Package, Prevention of Name Conflicts in Packages, Accessibility of Symbols in a Package, Introduction to Packages ++@subsubsection Locating a Symbol in a Package ++ ++When a @i{symbol} is to be located in a given @i{package} ++the following occurs: ++@table @asis ++ ++@item -- ++The @i{external symbols} and @i{internal symbols} of the ++@i{package} are searched for the @i{symbol}. ++@item -- ++The @i{external symbols} of the used @i{packages} are ++searched ++in some unspecified order. The ++order does not matter; see the rules for handling name ++conflicts listed below. ++@end table ++ ++@node Prevention of Name Conflicts in Packages, , Locating a Symbol in a Package, Introduction to Packages ++@subsubsection Prevention of Name Conflicts in Packages ++ ++Within one @i{package}, any particular name can refer to at most one ++@i{symbol}. A name conflict is said to occur when there would be more than ++one candidate @i{symbol}. Any time a name conflict is about to occur, ++a @i{correctable} @i{error} is signaled. ++ ++The following rules apply to name conflicts: ++@table @asis ++ ++@item -- ++Name conflicts are detected when they become possible, that is, when the ++package structure is altered. Name ++conflicts are not checked during every name lookup. ++ ++@item -- ++If the @i{same} @i{symbol} is @i{accessible} to a @i{package} ++through more than one path, there is no name conflict. ++A @i{symbol} cannot conflict with itself. ++Name conflicts occur only between @i{distinct} @i{symbols} with ++the same name (under @b{string=}). ++ ++@item -- ++Every @i{package} has a list of shadowing @i{symbols}. ++A shadowing @i{symbol} takes precedence over any other @i{symbol} of ++the same name that would otherwise be @i{accessible} in the @i{package}. ++A name conflict involving a shadowing symbol is always resolved in favor of ++the shadowing @i{symbol}, without signaling an error (except for one ++exception involving @b{import}). ++See @b{shadow} and @b{shadowing-import}. ++ ++@item -- ++The functions @b{use-package}, @b{import}, and ++@b{export} check for name conflicts. ++ ++@item -- ++@b{shadow} and @b{shadowing-import} ++never signal a name-conflict error. ++ ++@item -- ++@b{unuse-package} and @b{unexport} ++do not need to do any name-conflict checking. ++@b{unintern} does name-conflict checking only when a @i{symbol} ++being @i{uninterned} is a @i{shadowing symbol} ++@IGindex shadowing symbol ++. ++ ++@item -- ++Giving a shadowing symbol to @b{unintern} ++can uncover a name conflict that had ++previously been resolved by the shadowing. ++ ++@item -- ++Package functions signal name-conflict errors of @i{type} @b{package-error} before making any ++ change to the package structure. When multiple changes are to be made, ++ it is ++ permissible for the implementation to process each change separately. ++ For example, when @b{export} is given a ++@i{list} of ++@i{symbols}, ++ aborting from a name ++ conflict caused by the second @i{symbol} ++ in the @i{list} might still export the ++ first @i{symbol} in the @i{list}. ++ However, a name-conflict error caused by @b{export} ++ of a single @i{symbol} will be signaled before ++ that @i{symbol}'s @i{accessibility} in any @i{package} is changed. ++ ++@item -- ++Continuing from a name-conflict error must offer the user a chance to ++resolve the name conflict in favor of either of the candidates. The ++@i{package} ++structure should be altered to reflect the resolution of the ++name conflict, via @b{shadowing-import}, ++@b{unintern}, ++or @b{unexport}. ++ ++@item -- ++A name conflict in @b{use-package} between a @i{symbol} ++@i{present} in the using @i{package} and an @i{external symbol} of the used ++@i{package} is resolved in favor of the first @i{symbol} by making it a ++shadowing @i{symbol}, or in favor of the second @i{symbol} by uninterning ++the first @i{symbol} from the using @i{package}. ++ ++@item -- ++A name conflict in @b{export} or @b{unintern} ++due to a @i{package}'s inheriting two @i{distinct} @i{symbols} ++with the @i{same} @i{name} (under @b{string=}) ++from two other @i{packages} can be resolved in ++favor of either @i{symbol} by importing it into the using ++@i{package} and making it a @i{shadowing symbol} ++@IGindex shadowing symbol ++, ++just as with @b{use-package}. ++@end table ++ ++@node Standardized Packages, , Introduction to Packages, Package Concepts ++@subsection Standardized Packages ++ ++This section describes the @i{packages} that are available ++in every @i{conforming implementation}. A summary of the ++@i{names} and @i{nicknames} of those @i{standardized} @i{packages} ++is given in Figure 11--2. ++ ++@format ++@group ++@noindent ++@w{ Name Nicknames } ++@w{ @t{COMMON-LISP} @t{CL} } ++@w{ @t{COMMON-LISP-USER} @t{CL-USER} } ++@w{ @t{KEYWORD} @i{none} } ++ ++@noindent ++@w{ Figure 11--2: Standardized Package Names} ++ ++@end group ++@end format ++ ++@menu ++* The COMMON-LISP Package:: ++* Constraints on the COMMON-LISP Package for Conforming Implementations:: ++* Constraints on the COMMON-LISP Package for Conforming Programs:: ++* Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs:: ++* The COMMON-LISP-USER Package:: ++* The KEYWORD Package:: ++* Interning a Symbol in the KEYWORD Package:: ++* Notes about The KEYWORD Package:: ++* Implementation-Defined Packages:: ++@end menu ++ ++@node The COMMON-LISP Package, Constraints on the COMMON-LISP Package for Conforming Implementations, Standardized Packages, Standardized Packages ++@subsubsection The COMMON-LISP Package ++ ++@IPindex common-lisp ++ ++@IPindex cl ++ ++The @t{COMMON-LISP} @i{package} contains the primitives of the @r{Common Lisp} system as ++defined by this specification. Its @i{external} @i{symbols} include ++all of the @i{defined names} (except for @i{defined names} in ++the @t{KEYWORD} @i{package}) that are present in the @r{Common Lisp} system, ++such as @b{car}, @b{cdr}, @b{*package*}, etc. ++The @t{COMMON-LISP} @i{package} has the @i{nickname} @t{CL}. ++ ++The @t{COMMON-LISP} @i{package} has as @i{external} @i{symbols} those ++symbols enumerated in the figures in @ref{Symbols in the COMMON-LISP Package}, and no others. ++These @i{external} @i{symbols} are @i{present} in the @t{COMMON-LISP} @i{package} ++but their @i{home package} need not be the @t{COMMON-LISP} @i{package}. ++ ++For example, the symbol @t{HELP} cannot be an @i{external symbol} of ++the @t{COMMON-LISP} @i{package} because it is not mentioned in @ref{Symbols in the COMMON-LISP Package}. ++In contrast, the @i{symbol} @b{variable} ++must be an @i{external symbol} of the @t{COMMON-LISP} @i{package} ++even though it has no definition ++because it is listed in that section ++(to support its use as a valid second @i{argument} to the @i{function} @b{documentation}). ++ ++The @t{COMMON-LISP} @i{package} can have additional @i{internal symbols}. ++ ++@node Constraints on the COMMON-LISP Package for Conforming Implementations, Constraints on the COMMON-LISP Package for Conforming Programs, The COMMON-LISP Package, Standardized Packages ++@subsubsection Constraints on the COMMON-LISP Package for Conforming Implementations ++ ++In a @i{conforming implementation}, ++an @i{external} @i{symbol} of the @t{COMMON-LISP} @i{package} can have ++ a @i{function}, @i{macro}, or @i{special operator} definition, ++ a @i{global variable} definition ++ (or other status as a @i{dynamic variable} ++ due to a @b{special} @i{proclamation}), ++or a @i{type} definition ++only if explicitly permitted in this standard. ++For example, ++ @b{fboundp} @i{yields} @i{false} ++ for any @i{external symbol} of the @t{COMMON-LISP} @i{package} ++ that is not the @i{name} of a @i{standardized} ++ @i{function}, @i{macro} or @i{special operator}, ++and ++ @b{boundp} returns @i{false} ++ for any @i{external symbol} of the @t{COMMON-LISP} @i{package} ++ that is not the @i{name} of a @i{standardized} @i{global variable}. ++It also follows that ++ @i{conforming programs} can use @i{external symbols} of the @t{COMMON-LISP} @i{package} ++ as the @i{names} of local @i{lexical variables} ++ with confidence that those @i{names} have not been @i{proclaimed} @b{special} ++ by the @i{implementation} ++ unless those @i{symbols} are ++ @i{names} of @i{standardized} @i{global variables}. ++ ++A @i{conforming implementation} must not place any @i{property} on ++an @i{external symbol} of the @t{COMMON-LISP} @i{package} using a @i{property indicator} ++that is either an @i{external symbol} of any @i{standardized} @i{package} ++or a @i{symbol} that is otherwise @i{accessible} in the @t{COMMON-LISP-USER} @i{package}. ++ ++@node Constraints on the COMMON-LISP Package for Conforming Programs, Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs, Constraints on the COMMON-LISP Package for Conforming Implementations, Standardized Packages ++@subsubsection Constraints on the COMMON-LISP Package for Conforming Programs ++ ++@ITindex redefinition ++ ++Except where explicitly allowed, the consequences are undefined if any ++of the following actions are performed on an @i{external symbol} ++of the @t{COMMON-LISP} @i{package}: ++ ++@table @asis ++ ++@item 1. ++@i{Binding} or altering its value (lexically or dynamically). ++ (Some exceptions are noted below.) ++ ++@item 2. ++Defining, ++ ++ undefining, ++ ++ or @i{binding} it as a @i{function}. ++ (Some exceptions are noted below.) ++ ++@item 3. ++Defining, ++ ++ undefining, ++ ++ or @i{binding} it as a @i{macro} ++ ++ or @i{compiler macro}. ++ ++ (Some exceptions are noted below.) ++ ++@item 4. ++Defining it as a @i{type specifier} ++ (via @b{defstruct}, ++ @b{defclass}, ++ @b{deftype}, ++ @b{define-condition}). ++ ++@item 5. ++Defining it as a structure (via @b{defstruct}). ++ ++@item 6. ++Defining it as a @i{declaration} ++ with a @b{declaration} @i{proclamation}. ++ ++@item 7. ++Defining it as a @i{symbol macro}. ++ ++@item 8. ++Altering its @i{home package}. ++ ++@item 9. ++Tracing it (via @b{trace}). ++ ++@item 10. ++Declaring or proclaiming it ++ @b{special} ++ (via @b{declare}, ++ ++ @b{declaim}, ++ ++ or @b{proclaim}). ++ ++@item 11. ++Declaring or proclaiming its @b{type} or @b{ftype} ++ (via @b{declare}, ++ ++ @b{declaim}, ++ ++ or @b{proclaim}). ++ (Some exceptions are noted below.) ++ ++@item 12. ++Removing it from the @t{COMMON-LISP} @i{package}. ++ ++@item 13. ++Defining a @i{setf expander} for it ++ (via @b{defsetf} or @b{define-setf-method}). ++ ++@item 14. ++Defining, undefining, or binding its @i{setf function name}. ++ ++@item 15. ++Defining it as a @i{method combination} type ++ (via @b{define-method-combination}). ++ ++@item 16. ++Using it as the class-name argument ++ to @b{setf} of @b{find-class}. ++ ++@item 17. ++Binding it as a @i{catch tag}. ++ ++@item 18. ++Binding it as a @i{restart} @i{name}. ++ ++@item 19. ++Defining a @i{method} ++ for a @i{standardized} @i{generic function} ++ which is @i{applicable} when all of the @i{arguments} ++ are @i{direct instances} of @i{standardized} @i{classes}. ++ ++@end table ++ ++@node Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs, The COMMON-LISP-USER Package, Constraints on the COMMON-LISP Package for Conforming Programs, Standardized Packages ++@subsubsection Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs ++ ++If an @i{external symbol} of the @t{COMMON-LISP} @i{package} ++is not globally defined as a @i{standardized} @i{dynamic variable} ++ or @i{constant variable}, ++it is allowed to lexically @i{bind} it ++ and to declare the @b{type} of that @i{binding}, ++and ++it is allowed to locally @i{establish} it as a @i{symbol macro} ++(@i{e.g.}, with @b{symbol-macrolet}). ++ ++Unless explicitly specified otherwise, ++if an @i{external symbol} of the @t{COMMON-LISP} @i{package} ++is globally defined as a @i{standardized} @i{dynamic variable}, ++it is permitted to @i{bind} or @i{assign} that @i{dynamic variable} ++provided that the ``Value Type'' constraints on the @i{dynamic variable} ++are maintained, and that the new @i{value} of the @i{variable} ++is consistent with the stated purpose of the @i{variable}. ++ ++If an @i{external symbol} of the @t{COMMON-LISP} @i{package} is not defined ++as a @i{standardized} @i{function}, @i{macro}, or @i{special operator}, ++it is allowed to lexically @i{bind} it as a @i{function} (@i{e.g.}, with @b{flet}), ++ to declare the @b{ftype} of that @i{binding}, ++ and ++ (in @i{implementations} which provide the ability to do so) ++ to @b{trace} that @i{binding}. ++ ++If an @i{external symbol} of the @t{COMMON-LISP} @i{package} is not defined ++as a @i{standardized} @i{function}, @i{macro}, or @i{special operator}, ++it is allowed to lexically @i{bind} it as a @i{macro} (@i{e.g.}, with @b{macrolet}). ++ ++If an @i{external symbol} of the @t{COMMON-LISP} @i{package} is not defined ++as a @i{standardized} @i{function}, @i{macro}, or @i{special operator}, ++it is allowed to lexically @i{bind} its @i{setf function name} ++as a @i{function}, ++and to declare the @b{ftype} of that @i{binding}. ++ ++@node The COMMON-LISP-USER Package, The KEYWORD Package, Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs, Standardized Packages ++@subsubsection The COMMON-LISP-USER Package ++ ++@IPindex common-lisp-user ++ ++@IPindex cl-user ++ ++The @t{COMMON-LISP-USER} @i{package} is the @i{current package} when ++a @r{Common Lisp} system starts up. This @i{package} @i{uses} the @t{COMMON-LISP} @i{package}. ++The @t{COMMON-LISP-USER} @i{package} has the @i{nickname} @t{CL-USER}. ++ ++The @t{COMMON-LISP-USER} @i{package} can have additional @i{symbols} @i{interned} within it; ++it can @i{use} other @i{implementation-defined} @i{packages}. ++ ++@node The KEYWORD Package, Interning a Symbol in the KEYWORD Package, The COMMON-LISP-USER Package, Standardized Packages ++@subsubsection The KEYWORD Package ++ ++@IPindex keyword ++ ++The @t{KEYWORD} @i{package} contains @i{symbols}, called @i{keywords}_1, ++that are typically used as special markers in @i{programs} ++and their associated data @i{expressions}_1. ++ ++@i{Symbol} @i{tokens} that start with a @i{package marker} ++are parsed by the @i{Lisp reader} as @i{symbols} ++in the @t{KEYWORD} @i{package}; see @ref{Symbols as Tokens}. ++This makes it notationally convenient to use @i{keywords} ++when communicating between programs in different @i{packages}. ++For example, the mechanism for passing @i{keyword parameters} in a @i{call} uses ++@i{keywords}_1 to name the corresponding @i{arguments}; ++see @ref{Ordinary Lambda Lists}. ++ ++@i{Symbols} in the @t{KEYWORD} @i{package} are, by definition, of @i{type} @b{keyword}. ++ ++@node Interning a Symbol in the KEYWORD Package, Notes about The KEYWORD Package, The KEYWORD Package, Standardized Packages ++@subsubsection Interning a Symbol in the KEYWORD Package ++ ++The @t{KEYWORD} @i{package} is treated differently than other @i{packages} ++in that special actions are taken when a @i{symbol} is @i{interned} in it. ++In particular, when a @i{symbol} is @i{interned} in the @t{KEYWORD} @i{package}, ++ it is automatically made to be an @i{external symbol} ++and is automatically made to be a @i{constant variable} with itself as a @i{value}. ++ ++@node Notes about The KEYWORD Package, Implementation-Defined Packages, Interning a Symbol in the KEYWORD Package, Standardized Packages ++@subsubsection Notes about The KEYWORD Package ++ ++It is generally best to confine the use of @i{keywords} to situations in which ++there are a finitely enumerable set of names to be selected between. For example, ++if there were two states of a light switch, they might be called @t{:on} and @t{:off}. ++ ++In situations where the set of names is not finitely enumerable ++(@i{i.e.}, where name conflicts might arise) ++it is frequently best to use @i{symbols} in some @i{package} ++other than @t{KEYWORD} so that conflicts will be naturally avoided. ++For example, it is generally not wise for a @i{program} to use a @i{keyword}_1 ++as a @i{property indicator}, since if there were ever another @i{program} ++that did the same thing, each would clobber the other's data. ++ ++@node Implementation-Defined Packages, , Notes about The KEYWORD Package, Standardized Packages ++@subsubsection Implementation-Defined Packages ++ ++Other, @i{implementation-defined} @i{packages} might be present ++in the initial @r{Common Lisp} environment. ++ ++It is recommended, but not required, that the documentation for a ++@i{conforming implementation} contain a full list of all @i{package} names ++initially present in that @i{implementation} but not specified in this specification. ++(See also the @i{function} @b{list-all-packages}.) ++ ++@c end of including concept-packages ++ ++@node Packages Dictionary, , Package Concepts, Packages ++@section Packages Dictionary ++ ++@c including dict-packages ++ ++@menu ++* package:: ++* export:: ++* find-symbol:: ++* find-package:: ++* find-all-symbols:: ++* import:: ++* list-all-packages:: ++* rename-package:: ++* shadow:: ++* shadowing-import:: ++* delete-package:: ++* make-package:: ++* with-package-iterator:: ++* unexport:: ++* unintern:: ++* in-package:: ++* unuse-package:: ++* use-package:: ++* defpackage:: ++* do-symbols:: ++* intern:: ++* package-name:: ++* package-nicknames:: ++* package-shadowing-symbols:: ++* package-use-list:: ++* package-used-by-list:: ++* packagep:: ++* *package*:: ++* package-error:: ++* package-error-package:: ++@end menu ++ ++@node package, export, Packages Dictionary, Packages Dictionary ++@subsection package [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{package}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{package} is a @i{namespace} that maps @i{symbol} @i{names} ++to @i{symbols}; see @ref{Package Concepts}. ++ ++@subsubheading See Also:: ++ ++@ref{Package Concepts}, ++@ref{Printing Other Objects}, ++@ref{Symbols as Tokens} ++ ++@node export, find-symbol, package, Packages Dictionary ++@subsection export [Function] ++ ++@code{export} @i{symbols @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbols}---a @i{designator} for a @i{list} of @i{symbols}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{export} makes one or more @i{symbols} that are @i{accessible} ++in @i{package} (whether directly or by inheritance) be @i{external symbols} ++of that @i{package}. ++ ++If any of the @i{symbols} is already @i{accessible} as ++an @i{external symbol} of @i{package}, ++@b{export} has no effect on that @i{symbol}. ++If the @i{symbol} is ++@i{present} in @i{package} ++as an internal symbol, it is simply changed to external status. ++If it is @i{accessible} as an @i{internal symbol} via @b{use-package}, ++it ++is first @i{imported} into @i{package}, ++then @i{exported}. ++(The @i{symbol} is then @i{present} in the @i{package} ++whether or not @i{package} continues to use the @i{package} through ++which the @i{symbol} was originally inherited.) ++ ++@b{export} makes ++each @i{symbol} ++@i{accessible} to all the @i{packages} that use @i{package}. ++All of these @i{packages} are checked for name conflicts: ++@t{(export @i{s} @i{p})} does ++@t{(find-symbol (symbol-name @i{s}) @i{q})} for each package @i{q} ++in @t{(package-used-by-list @i{p})}. Note that in the usual case of ++an @b{export} during the initial definition of a @i{package}, ++the ++result of @b{package-used-by-list} ++is @b{nil} and the name-conflict checking ++takes negligible time. ++When multiple changes are to be made, ++for example when @b{export} ++is given a @i{list} of @i{symbols}, it is ++permissible for the implementation to process each change separately, ++so that aborting from a name ++conflict caused by any but the first @i{symbol} in the ++@i{list} does not unexport the ++first @i{symbol} in the @i{list}. ++However, aborting from a name-conflict error ++caused by @b{export} ++of one of @i{symbols} does not leave that @i{symbol} ++@i{accessible} ++to some @i{packages} ++and @i{inaccessible} to others; with respect to ++each of @i{symbols} processed, @b{export} ++behaves as if it were as an atomic operation. ++ ++A name conflict in @b{export} between one of ++@i{symbols} being exported and a ++@i{symbol} already @i{present} in a @i{package} ++that would inherit the ++newly-exported @i{symbol} ++may be resolved in favor of the exported @i{symbol} ++by uninterning the other one, or in favor of the already-present ++@i{symbol} by making it a shadowing symbol. ++ ++@subsubheading Examples:: ++ ++@example ++ (make-package 'temp :use nil) @result{} # ++ (use-package 'temp) @result{} T ++ (intern "TEMP-SYM" 'temp) @result{} TEMP::TEMP-SYM, NIL ++ (find-symbol "TEMP-SYM") @result{} NIL, NIL ++ (export (find-symbol "TEMP-SYM" 'temp) 'temp) @result{} T ++ (find-symbol "TEMP-SYM") @result{} TEMP-SYM, :INHERITED ++@end example ++ ++@subsubheading Side Effects:: ++ ++The package system is modified. ++ ++@subsubheading Affected By:: ++ ++@i{Accessible} @i{symbols}. ++ ++@subsubheading Exceptional Situations:: ++ ++If any of the @i{symbols} is not @i{accessible} at all in @i{package}, ++an error of @i{type} @b{package-error} is signaled that is @i{correctable} ++by permitting the @i{user} ++to interactively specify whether that @i{symbol} should be @i{imported}. ++ ++@subsubheading See Also:: ++ ++@ref{import} ++, ++@ref{unexport} ++, ++@ref{Package Concepts} ++ ++@node find-symbol, find-package, export, Packages Dictionary ++@subsection find-symbol [Function] ++ ++@code{find-symbol} @i{string @r{&optional} package} @result{} @i{symbol, status} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@i{symbol}---a @i{symbol} accessible in the @i{package}, ++ or @b{nil}. ++ ++@i{status}---one of @t{:inherited}, @t{:external}, @t{:internal}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{find-symbol} locates a @i{symbol} whose @i{name} is ++@i{string} in a @i{package}. ++If a @i{symbol} named @i{string} is found in @i{package}, ++directly or by inheritance, the @i{symbol} ++found is returned as the first ++value; the second value is as follows: ++ ++@table @asis ++ ++@item @t{:internal} ++If the @i{symbol} is @i{present} in @i{package} ++as an @i{internal symbol}. ++ ++@item @t{:external} ++If the @i{symbol} is @i{present} in @i{package} ++as an @i{external symbol}. ++ ++@item @t{:inherited} ++If the @i{symbol} is inherited by @i{package} ++through @b{use-package}, ++but is not @i{present} in @i{package}. ++ ++@end table ++ ++If no such @i{symbol} is @i{accessible} in @i{package}, ++both values are @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (find-symbol "NEVER-BEFORE-USED") @result{} NIL, NIL ++ (find-symbol "NEVER-BEFORE-USED") @result{} NIL, NIL ++ (intern "NEVER-BEFORE-USED") @result{} NEVER-BEFORE-USED, NIL ++ (intern "NEVER-BEFORE-USED") @result{} NEVER-BEFORE-USED, :INTERNAL ++ (find-symbol "NEVER-BEFORE-USED") @result{} NEVER-BEFORE-USED, :INTERNAL ++ (find-symbol "never-before-used") @result{} NIL, NIL ++ (find-symbol "CAR" 'common-lisp-user) @result{} CAR, :INHERITED ++ (find-symbol "CAR" 'common-lisp) @result{} CAR, :EXTERNAL ++ (find-symbol "NIL" 'common-lisp-user) @result{} NIL, :INHERITED ++ (find-symbol "NIL" 'common-lisp) @result{} NIL, :EXTERNAL ++ (find-symbol "NIL" (prog1 (make-package "JUST-TESTING" :use '()) ++ (intern "NIL" "JUST-TESTING"))) ++@result{} JUST-TESTING::NIL, :INTERNAL ++ (export 'just-testing::nil 'just-testing) ++ (find-symbol "NIL" 'just-testing) @result{} JUST-TESTING:NIL, :EXTERNAL ++ (find-symbol "NIL" "KEYWORD") ++@result{} NIL, NIL ++@i{OR}@result{} :NIL, :EXTERNAL ++ (find-symbol (symbol-name :nil) "KEYWORD") @result{} :NIL, :EXTERNAL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{intern}, ++@b{import}, ++@b{export}, ++@b{use-package}, ++@b{unintern}, ++@b{unexport}, ++@b{unuse-package} ++ ++@subsubheading See Also:: ++ ++@ref{intern} ++, ++@ref{find-all-symbols} ++ ++@subsubheading Notes:: ++ ++@b{find-symbol} is operationally equivalent to @b{intern}, ++except that it never creates a new @i{symbol}. ++ ++@node find-package, find-all-symbols, find-symbol, Packages Dictionary ++@subsection find-package [Function] ++ ++@code{find-package} @i{name} @result{} @i{package} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{string designator} or a @i{package} @i{object}. ++ ++@i{package}---a @i{package} @i{object} or @b{nil}. ++ ++@subsubheading Description:: ++ ++If @i{name} is a @i{string designator}, ++@b{find-package} locates and returns the ++@i{package} whose name or nickname is @i{name}. ++This ++search is case sensitive. ++If there is no such @i{package}, ++@b{find-package} returns @b{nil}. ++ ++If @i{name} is a @i{package} @i{object}, ++that @i{package} @i{object} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (find-package 'common-lisp) @result{} # ++ (find-package "COMMON-LISP-USER") @result{} # ++ (find-package 'not-there) @result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++The set of @i{packages} created by the @i{implementation}. ++ ++@b{defpackage}, ++@b{delete-package}, ++@b{make-package}, ++@b{rename-package} ++ ++@subsubheading See Also:: ++ ++@ref{make-package} ++ ++@node find-all-symbols, import, find-package, Packages Dictionary ++@subsection find-all-symbols [Function] ++ ++@code{find-all-symbols} @i{string} @result{} @i{symbols} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string designator}. ++ ++@i{symbols}---a @i{list} of @i{symbols}. ++ ++@subsubheading Description:: ++ ++@b{find-all-symbols} searches ++ every @i{registered package} ++ for @i{symbols} that have a ++@i{name} that is the @i{same} (under @b{string=}) as ++@i{string}. A @i{list} of all such @i{symbols} is returned. ++Whether or how the @i{list} is ordered is ++@i{implementation-dependent}. ++ ++@subsubheading Examples:: ++ ++@example ++ (find-all-symbols 'car) ++@result{} (CAR) ++@i{OR}@result{} (CAR VEHICLES:CAR) ++@i{OR}@result{} (VEHICLES:CAR CAR) ++ (intern "CAR" (make-package 'temp :use nil)) @result{} TEMP::CAR, NIL ++ (find-all-symbols 'car) ++@result{} (TEMP::CAR CAR) ++@i{OR}@result{} (CAR TEMP::CAR) ++@i{OR}@result{} (TEMP::CAR CAR VEHICLES:CAR) ++@i{OR}@result{} (CAR TEMP::CAR VEHICLES:CAR) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{find-symbol} ++ ++@node import, list-all-packages, find-all-symbols, Packages Dictionary ++@subsection import [Function] ++ ++@code{import} @i{symbols @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbols}---a @i{designator} for a @i{list} of @i{symbols}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{import} adds @i{symbol} or ++@i{symbols} to the internals of @i{package}, checking for name ++conflicts with existing @i{symbols} either @i{present} in @i{package} ++or @i{accessible} to it. Once the @i{symbols} have been ++@i{imported}, they may be referenced in the @i{importing} ++@i{package} without the use of a @i{package prefix} when using the @i{Lisp reader}. ++ ++A name conflict in @b{import} between the ++@i{symbol} being imported and a symbol inherited from some other @i{package} can ++be resolved in favor of the ++@i{symbol} being @i{imported} ++by making it a shadowing symbol, or in favor ++of the @i{symbol} already @i{accessible} by ++not doing the @b{import}. A ++name conflict in @b{import} with a @i{symbol} ++already @i{present} in the ++@i{package} ++may be resolved by uninterning that @i{symbol}, or by not ++doing the @b{import}. ++ ++The imported @i{symbol} is ++not automatically exported from the @i{current package}, but if it is ++already @i{present} and external, then the fact that it ++is external is not changed. ++ ++If any @i{symbol} to be @i{imported} has no home ++package (@i{i.e.}, @t{(symbol-package @i{symbol}) @result{} nil}), ++@b{import} sets the @i{home package} ++of the @i{symbol} to @i{package}. ++ ++If the @i{symbol} is already @i{present} in the importing @i{package}, ++@b{import} has no effect. ++ ++@subsubheading Examples:: ++ ++@example ++ (import 'common-lisp::car (make-package 'temp :use nil)) @result{} T ++ (find-symbol "CAR" 'temp) @result{} CAR, :INTERNAL ++ (find-symbol "CDR" 'temp) @result{} NIL, NIL ++@end example ++ ++The form @t{(import 'editor:buffer)} takes the external symbol named ++@t{buffer} in the @t{EDITOR} @i{package} (this symbol was located when the form ++was read by the @i{Lisp reader}) and adds it to the @i{current package} ++as an @i{internal symbol}. The symbol @t{buffer} is then @i{present} in ++the @i{current package}. ++ ++@subsubheading Side Effects:: ++ ++The package system is modified. ++ ++@subsubheading Affected By:: ++ ++Current state of the package system. ++ ++@subsubheading Exceptional Situations:: ++ ++@b{import} signals a @i{correctable} error of @i{type} @b{package-error} ++if any of the @i{symbols} to be @i{imported} has the @i{same} @i{name} ++(under @b{string=}) as some distinct @i{symbol} (under @b{eql}) ++already @i{accessible} in the @i{package}, even if the conflict is ++with a @i{shadowing symbol} of the @i{package}. ++ ++@subsubheading See Also:: ++ ++@ref{shadow} ++, ++@ref{export} ++ ++@node list-all-packages, rename-package, import, Packages Dictionary ++@subsection list-all-packages [Function] ++ ++@code{list-all-packages} @i{<@i{no @i{arguments}}>} @result{} @i{packages} ++ ++@subsubheading Arguments and Values:: ++ ++@i{packages}---a @i{list} of @i{package} @i{objects}. ++ ++@subsubheading Description:: ++ ++@b{list-all-packages} returns a ++ ++@i{fresh} ++ ++@i{list} of ++ ++all @i{registered packages}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((before (list-all-packages))) ++ (make-package 'temp) ++ (set-difference (list-all-packages) before)) @result{} (#) ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{defpackage}, ++@b{delete-package}, ++@b{make-package} ++ ++@node rename-package, shadow, list-all-packages, Packages Dictionary ++@subsection rename-package [Function] ++ ++@code{rename-package} @i{package new-name @r{&optional} new-nicknames} @result{} @i{package-object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{new-name}---a @i{package designator}. ++ ++@i{new-nicknames}---a @i{list} of @i{string designators}. ++ The default is the @i{empty list}. ++ ++@i{package-object}---the renamed @i{package} @i{object}. ++ ++@subsubheading Description:: ++ ++Replaces the name and nicknames of @i{package}. ++The old name and all of the old nicknames of @i{package} are eliminated ++and are replaced by @i{new-name} and @i{new-nicknames}. ++ ++The consequences are undefined if @i{new-name} or any @i{new-nickname} ++conflicts with any existing package names. ++ ++@subsubheading Examples:: ++ ++@example ++ (make-package 'temporary :nicknames '("TEMP")) @result{} # ++ (rename-package 'temp 'ephemeral) @result{} # ++ (package-nicknames (find-package 'ephemeral)) @result{} () ++ (find-package 'temporary) @result{} NIL ++ (rename-package 'ephemeral 'temporary '(temp fleeting)) ++@result{} # ++ (package-nicknames (find-package 'temp)) @result{} ("TEMP" "FLEETING") ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{make-package} ++ ++@node shadow, shadowing-import, rename-package, Packages Dictionary ++@subsection shadow [Function] ++ ++@code{shadow} @i{symbol-names @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol-names}---a @i{designator} for ++ a @i{list} of @i{string designators}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{shadow} assures that @i{symbols} with names given ++by @i{symbol-names} are @i{present} ++in ++the @i{package}. ++ ++Specifically, @i{package} is searched for @i{symbols} ++with the @i{names} supplied by @i{symbol-names}. ++ ++For each such @i{name}, if a corresponding @i{symbol} ++is not @i{present} in @i{package} (directly, not by inheritance), ++then a corresponding @i{symbol} is created with that @i{name}, ++and inserted into @i{package} as an @i{internal symbol}. ++The corresponding @i{symbol}, whether pre-existing or newly created, ++is then added, if not already present, to the @i{shadowing symbols list} ++of @i{package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (package-shadowing-symbols (make-package 'temp)) @result{} NIL ++ (find-symbol 'car 'temp) @result{} CAR, :INHERITED ++ (shadow 'car 'temp) @result{} T ++ (find-symbol 'car 'temp) @result{} TEMP::CAR, :INTERNAL ++ (package-shadowing-symbols 'temp) @result{} (TEMP::CAR) ++@end example ++ ++@example ++ (make-package 'test-1) @result{} # ++ (intern "TEST" (find-package 'test-1)) @result{} TEST-1::TEST, NIL ++ (shadow 'test-1::test (find-package 'test-1)) @result{} T ++ (shadow 'TEST (find-package 'test-1)) @result{} T ++ (assert (not (null (member 'test-1::test (package-shadowing-symbols ++ (find-package 'test-1)))))) ++ ++ (make-package 'test-2) @result{} # ++ (intern "TEST" (find-package 'test-2)) @result{} TEST-2::TEST, NIL ++ (export 'test-2::test (find-package 'test-2)) @result{} T ++ (use-package 'test-2 (find-package 'test-1)) ;should not error ++ ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{shadow} changes the state of the package system in such a ++way that the package consistency rules do not hold across the change. ++ ++@subsubheading Affected By:: ++ ++Current state of the package system. ++ ++@subsubheading See Also:: ++ ++@ref{package-shadowing-symbols} ++, ++@ref{Package Concepts} ++ ++@subsubheading Notes:: ++ ++If a @i{symbol} with a name in @i{symbol-names} already exists ++in @i{package}, but by inheritance, the inherited symbol becomes ++@i{shadowed}_3 by a newly created @i{internal symbol}. ++ ++@node shadowing-import, delete-package, shadow, Packages Dictionary ++@subsection shadowing-import [Function] ++ ++@code{shadowing-import} @i{symbols @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbols}---a @i{designator} for a @i{list} of @i{symbols}. ++ ++@i{package} ---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{shadowing-import} is like @b{import}, ++but it does not signal an error even if the importation of a @i{symbol} ++would shadow some @i{symbol} already @i{accessible} in @i{package}. ++ ++@b{shadowing-import} inserts each of @i{symbols} ++into @i{package} as an internal symbol, regardless ++of whether another @i{symbol} of the same name is shadowed by this ++action. ++If a different @i{symbol} of the same name is already @i{present} ++in @i{package}, ++that @i{symbol} is first @i{uninterned} from @i{package}. ++The new @i{symbol} is added to @i{package}'s shadowing-symbols list. ++ ++@b{shadowing-import} does name-conflict ++checking to the extent that it checks whether a distinct existing ++@i{symbol} with the same name is @i{accessible}; if so, it is shadowed by ++the new @i{symbol}, which implies that it must be uninterned ++if it was ++@i{present} in @i{package}. ++ ++@subsubheading Examples:: ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ (setq sym (intern "CONFLICT")) @result{} CONFLICT ++ (intern "CONFLICT" (make-package 'temp)) @result{} TEMP::CONFLICT, NIL ++ (package-shadowing-symbols 'temp) @result{} NIL ++ (shadowing-import sym 'temp) @result{} T ++ (package-shadowing-symbols 'temp) @result{} (CONFLICT) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{shadowing-import} ++changes the state of the package system in such a way that ++the consistency rules do not hold across the change. ++ ++@i{package}'s shadowing-symbols list is modified. ++ ++@subsubheading Affected By:: ++ ++Current state of the package system. ++ ++@subsubheading See Also:: ++ ++@ref{import} ++, ++@ref{unintern} ++, ++@ref{package-shadowing-symbols} ++ ++@node delete-package, make-package, shadowing-import, Packages Dictionary ++@subsection delete-package [Function] ++ ++@code{delete-package} @i{package} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{delete-package} deletes @i{package} from all package system ++data structures. ++If the operation is successful, @b{delete-package} returns ++true, otherwise @b{nil}. ++The effect of @b{delete-package} is that the name and nicknames ++of @i{package} cease to be recognized package names. ++The package @i{object} is still a @i{package} ++(@i{i.e.}, @b{packagep} is @i{true} of it) ++but @b{package-name} returns @b{nil}. ++The consequences of deleting the @t{COMMON-LISP} @i{package} or the @t{KEYWORD} @i{package} are undefined. ++The consequences of invoking any other package operation on @i{package} ++once it has been deleted are unspecified. ++In particular, the consequences of invoking @b{find-symbol}, ++@b{intern} and other functions that look for a symbol name in ++a @i{package} are unspecified if they are called with @b{*package*} ++bound to the deleted @i{package} or with the deleted @i{package} ++as an argument. ++ ++If @i{package} is a @i{package} @i{object} that has already ++been deleted, @b{delete-package} immediately returns @b{nil}. ++ ++After this operation completes, the ++@i{home package} ++of any @i{symbol} whose @i{home package} ++had previously been ++@i{package} ++is ++@i{implementation-dependent}. ++Except for this, @i{symbols} @i{accessible} ++in @i{package} are not modified in any other way; ++@i{symbols} whose @i{home package} is not @i{package} remain unchanged. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq *foo-package* (make-package "FOO" :use nil)) ++ (setq *foo-symbol* (intern "FOO" *foo-package*)) ++ (export *foo-symbol* *foo-package*) ++ ++ (setq *bar-package* (make-package "BAR" :use '("FOO"))) ++ (setq *bar-symbol* (intern "BAR" *bar-package*)) ++ (export *foo-symbol* *bar-package*) ++ (export *bar-symbol* *bar-package*) ++ ++ (setq *baz-package* (make-package "BAZ" :use '("BAR"))) ++ ++ (symbol-package *foo-symbol*) @result{} # ++ (symbol-package *bar-symbol*) @result{} # ++ ++ (prin1-to-string *foo-symbol*) @result{} "FOO:FOO" ++ (prin1-to-string *bar-symbol*) @result{} "BAR:BAR" ++ ++ (find-symbol "FOO" *bar-package*) @result{} FOO:FOO, :EXTERNAL ++ ++ (find-symbol "FOO" *baz-package*) @result{} FOO:FOO, :INHERITED ++ (find-symbol "BAR" *baz-package*) @result{} BAR:BAR, :INHERITED ++ ++ (packagep *foo-package*) @result{} @i{true} ++ (packagep *bar-package*) @result{} @i{true} ++ (packagep *baz-package*) @result{} @i{true} ++ ++ (package-name *foo-package*) @result{} "FOO" ++ (package-name *bar-package*) @result{} "BAR" ++ (package-name *baz-package*) @result{} "BAZ" ++ ++ (package-use-list *foo-package*) @result{} () ++ (package-use-list *bar-package*) @result{} (#) ++ (package-use-list *baz-package*) @result{} (#) ++ ++ (package-used-by-list *foo-package*) @result{} (#) ++ (package-used-by-list *bar-package*) @result{} (#) ++ (package-used-by-list *baz-package*) @result{} () ++ ++ (delete-package *bar-package*) ++@t{ |> } Error: Package BAZ uses package BAR. ++@t{ |> } If continued, BAZ will be made to unuse-package BAR, ++@t{ |> } and then BAR will be deleted. ++@t{ |> } Type :CONTINUE to continue. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE}@b{<<|} ++@result{} T ++ ++ (symbol-package *foo-symbol*) @result{} # ++ (symbol-package *bar-symbol*) is unspecified ++ ++ (prin1-to-string *foo-symbol*) @result{} "FOO:FOO" ++ (prin1-to-string *bar-symbol*) is unspecified ++ ++ (find-symbol "FOO" *bar-package*) is unspecified ++ ++ (find-symbol "FOO" *baz-package*) @result{} NIL, NIL ++ (find-symbol "BAR" *baz-package*) @result{} NIL, NIL ++ ++ (packagep *foo-package*) @result{} T ++ (packagep *bar-package*) @result{} T ++ (packagep *baz-package*) @result{} T ++ ++ (package-name *foo-package*) @result{} "FOO" ++ (package-name *bar-package*) @result{} NIL ++ (package-name *baz-package*) @result{} "BAZ" ++ ++ (package-use-list *foo-package*) @result{} () ++ (package-use-list *bar-package*) is unspecified ++ (package-use-list *baz-package*) @result{} () ++ ++ (package-used-by-list *foo-package*) @result{} () ++ (package-used-by-list *bar-package*) is unspecified ++ (package-used-by-list *baz-package*) @result{} () ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If the @i{package} @i{designator} is a @i{name} that does not ++currently name a @i{package}, ++a @i{correctable} error of @i{type} @b{package-error} is signaled. ++If correction is attempted, no deletion action is attempted; ++instead, @b{delete-package} immediately returns @b{nil}. ++ ++If @i{package} is used by other @i{packages}, ++a @i{correctable} error of @i{type} @b{package-error} is signaled. ++If correction is attempted, ++@b{unuse-package} is effectively called to remove any dependencies, ++causing @i{package}'s @i{external symbols} to cease being @i{accessible} to those ++@i{packages} that use @i{package}. ++@b{delete-package} then deletes @i{package} just as it would have had ++there been no @i{packages} that used it. ++ ++@subsubheading See Also:: ++ ++@ref{unuse-package} ++ ++@node make-package, with-package-iterator, delete-package, Packages Dictionary ++@subsection make-package [Function] ++ ++@code{make-package} @i{package-name @r{&key} nicknames use} @result{} @i{package} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package-name}---a @i{string designator}. ++ ++@i{nicknames}---a @i{list} of @i{string designators}. ++ The default is the @i{empty list}. ++ ++@i{use}--- ++a @i{list} of @i{package designators}. ++ ++ The default is @i{implementation-defined}. ++ ++@i{package}---a @i{package}. ++ ++@subsubheading Description:: ++ ++Creates a new @i{package} with the name @i{package-name}. ++ ++@i{Nicknames} are additional @i{names} which may be used ++to refer to the new @i{package}. ++ ++@i{use} specifies zero or more @i{packages} ++the @i{external symbols} of which are to be inherited by ++the new @i{package}. See the @i{function} @b{use-package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (make-package 'temporary :nicknames '("TEMP" "temp")) @result{} # ++ (make-package "OWNER" :use '("temp")) @result{} # ++ (package-used-by-list 'temp) @result{} (#) ++ (package-use-list 'owner) @result{} (#) ++@end example ++ ++@subsubheading Affected By:: ++ ++The existence of other @i{packages} in the system. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are unspecified if @i{packages} denoted by @i{use} ++do not exist. ++ ++A @i{correctable} error is signaled if the @i{package-name} ++or any of the @i{nicknames} is already ++the @i{name} or @i{nickname} of an existing @i{package}. ++ ++@subsubheading See Also:: ++ ++@ref{defpackage} ++, ++@ref{use-package} ++ ++@subsubheading Notes:: ++ ++In situations where the @i{packages} to be used contain symbols which would conflict, ++it is necessary to first create the package with @t{:use '()}, ++then to use @b{shadow} or @b{shadowing-import} to address the conflicts, ++and then after that to use @b{use-package} once the conflicts have been addressed. ++ ++When packages are being created as part of the static definition of a program ++rather than dynamically by the program, it is generally considered more stylistically ++appropriate to use @b{defpackage} rather than @b{make-package}. ++ ++@node with-package-iterator, unexport, make-package, Packages Dictionary ++@subsection with-package-iterator [Macro] ++ ++@code{with-package-iterator} @i{@r{(}name package-list-form @r{&rest} @r{symbol-types}@r{)} ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{package-list-form}---a @i{form}; evaluated once to produce a @i{package-list}. ++ ++@i{package-list}---a @i{designator} for a list of @i{package designators}. ++ ++@i{symbol-type}---one of the @i{symbols} ++ @t{:internal}, @t{:external}, or @t{:inherited}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms}. ++ ++@subsubheading Description:: ++ ++Within the lexical scope of the body @i{forms}, ++the @i{name} is defined via @b{macrolet} ++such that successive invocations of @t{(@i{name})} ++will return the @i{symbols}, one by one, ++from the @i{packages} in @i{package-list}. ++ ++It is unspecified whether @i{symbols} inherited from ++multiple @i{packages} are returned more than once. ++The order of @i{symbols} returned does not necessarily reflect the order ++of @i{packages} in @i{package-list}. When @i{package-list} has ++more than one element, it is unspecified whether duplicate @i{symbols} are ++returned once or more than once. ++ ++@i{Symbol-types} controls which @i{symbols} that are @i{accessible} ++in a @i{package} are returned as follows: ++ ++@table @asis ++ ++@item @t{:internal} ++The @i{symbols} that are @i{present} in the @i{package}, ++ but that are not @i{exported}. ++ ++@item @t{:external} ++The @i{symbols} that are @i{present} in the @i{package} ++ and are @i{exported}. ++ ++@item @t{:inherited} ++The @i{symbols} that are @i{exported} by used @i{packages} ++ and that are not @i{shadowed}. ++@end table ++ ++When more than one argument is supplied for @i{symbol-types}, ++a @i{symbol} is returned if its @i{accessibility} matches ++any one of the @i{symbol-types} supplied. ++Implementations may extend this syntax by recognizing additional ++symbol accessibility types. ++ ++An invocation of @t{(@i{name})} returns four values as follows: ++ ++@table @asis ++ ++@item 1. ++A flag that indicates whether a @i{symbol} is returned ++ (true means that a @i{symbol} is returned). ++@item 2. ++A @i{symbol} that is @i{accessible} in one the ++ indicated @i{packages}. ++@item 3. ++The accessibility type for that @i{symbol}; ++ @i{i.e.}, one of the symbols @t{:internal}, @t{:external}, or @t{:inherited}. ++@item 4. ++The @i{package} from which the @i{symbol} was obtained. ++ The @i{package} is one of the @i{packages} present ++ or named in @i{package-list}. ++@end table ++ ++After all @i{symbols} have been returned by successive invocations of ++@t{(@i{name})}, then only one value is returned, namely @b{nil}. ++ ++The meaning of the second, third, and fourth @i{values} is that the returned ++@i{symbol} is @i{accessible} in the returned @i{package} ++in the way indicated by the second return value as follows: ++ ++@table @asis ++ ++@item @t{:internal} ++Means @i{present} and not @i{exported}. ++ ++@item @t{:external} ++Means @i{present} and @i{exported}. ++ ++@item @t{:inherited} ++Means not @i{present} (thus not @i{shadowed}) but inherited ++from some used @i{package}. ++@end table ++ ++It is unspecified what happens if any of the implicit interior state ++of an iteration is returned outside the dynamic extent of the ++@b{with-package-iterator} ++form such as by returning some @i{closure} over the invocation @i{form}. ++ ++Any number of invocations of @b{with-package-iterator} ++can be nested, and the body of the innermost one can invoke all of the ++locally @i{established} @i{macros}, provided all those @i{macros} ++have distinct names. ++ ++@subsubheading Examples:: ++ ++The following function should return @b{t} on any @i{package}, and signal ++an error if the usage of @b{with-package-iterator} does not agree ++with the corresponding usage of @b{do-symbols}. ++ ++@example ++ (defun test-package-iterator (package) ++ (unless (packagep package) ++ (setq package (find-package package))) ++ (let ((all-entries '()) ++ (generated-entries '())) ++ (do-symbols (x package) ++ (multiple-value-bind (symbol accessibility) ++ (find-symbol (symbol-name x) package) ++ (push (list symbol accessibility) all-entries))) ++ (with-package-iterator (generator-fn package ++ :internal :external :inherited) ++ (loop ++ (multiple-value-bind (more? symbol accessibility pkg) ++ (generator-fn) ++ (unless more? (return)) ++ (let ((l (multiple-value-list (find-symbol (symbol-name symbol) ++ package)))) ++ (unless (equal l (list symbol accessibility)) ++ (error "Symbol ~S not found as ~S in package ~A [~S]" ++ symbol accessibility (package-name package) l)) ++ (push l generated-entries))))) ++ (unless (and (subsetp all-entries generated-entries :test #'equal) ++ (subsetp generated-entries all-entries :test #'equal)) ++ (error "Generated entries and Do-Symbols entries don't correspond")) ++ t)) ++@end example ++ ++The following function prints out every @i{present} @i{symbol} ++(possibly more than once): ++ ++@example ++ (defun print-all-symbols () ++ (with-package-iterator (next-symbol (list-all-packages) ++ :internal :external) ++ (loop ++ (multiple-value-bind (more? symbol) (next-symbol) ++ (if more? ++ (print symbol) ++ (return)))))) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++@b{with-package-iterator} signals an error of @i{type} @b{program-error} if ++no @i{symbol-types} are supplied or if a @i{symbol-type} is not ++recognized by the implementation is supplied. ++ ++The consequences are undefined if the local function named @i{name} ++@i{established} by @b{with-package-iterator} is called after it ++has returned @i{false} as its @i{primary value}. ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node unexport, unintern, with-package-iterator, Packages Dictionary ++@subsection unexport [Function] ++ ++@code{unexport} @i{symbols @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbols}---a @i{designator} for a @i{list} of @i{symbols}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{unexport} reverts external @i{symbols} in @i{package} to ++internal status; it undoes the effect of @b{export}. ++ ++@b{unexport} works only on @i{symbols} ++@i{present} ++in @i{package}, switching them back to internal status. ++If @b{unexport} is given a @i{symbol} that is ++already @i{accessible} as an @i{internal symbol} in @i{package}, ++it does nothing. ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ (export (intern "CONTRABAND" (make-package 'temp)) 'temp) @result{} T ++ (find-symbol "CONTRABAND") @result{} NIL, NIL ++ (use-package 'temp) @result{} T ++ (find-symbol "CONTRABAND") @result{} CONTRABAND, :INHERITED ++ (unexport 'contraband 'temp) @result{} T ++ (find-symbol "CONTRABAND") @result{} NIL, NIL ++@end example ++ ++@subsubheading Side Effects:: ++ ++Package system is modified. ++ ++@subsubheading Affected By:: ++ ++Current state of the package system. ++ ++@subsubheading Exceptional Situations:: ++ ++If @b{unexport} is given a @i{symbol} ++not @i{accessible} in @i{package} at all, ++an error of @i{type} @b{package-error} is signaled. ++ ++The consequences are undefined if @i{package} is the @t{KEYWORD} @i{package} ++or the @t{COMMON-LISP} @i{package}. ++ ++@subsubheading See Also:: ++ ++@ref{export} ++, @ref{Package Concepts} ++ ++@node unintern, in-package, unexport, Packages Dictionary ++@subsection unintern [Function] ++ ++@code{unintern} @i{symbol @r{&optional} package} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++@b{unintern} removes @i{symbol} from @i{package}. ++If @i{symbol} is @i{present} in @i{package}, it is ++removed from @i{package} and also from @i{package}'s ++@i{shadowing symbols list} if it is present there. If @i{package} is the ++@i{home package} for @i{symbol}, @i{symbol} is made to have no ++@i{home package}. ++@i{Symbol} may continue to be @i{accessible} ++in @i{package} by inheritance. ++ ++Use of @b{unintern} can result in a @i{symbol} ++that has no ++recorded @i{home package}, ++but that in fact is @i{accessible} in some @i{package}. ++@r{Common Lisp} does not check for this pathological case, ++and such @i{symbols} ++are always printed preceded by @t{#:}. ++ ++@b{unintern} returns @i{true} if it removes @i{symbol}, and @b{nil} otherwise. ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ (setq temps-unpack (intern "UNPACK" (make-package 'temp))) @result{} TEMP::UNPACK ++ (unintern temps-unpack 'temp) @result{} T ++ (find-symbol "UNPACK" 'temp) @result{} NIL, NIL ++ temps-unpack @result{} #:UNPACK ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{unintern} changes the state of the ++package system in such a way that the consistency rules do not hold ++across the change. ++ ++@subsubheading Affected By:: ++Current state of the package system. ++ ++@subsubheading Exceptional Situations:: ++Giving a shadowing symbol to @b{unintern} ++can uncover a name conflict that had ++previously been resolved by the shadowing. If package A uses packages ++B and C, A contains a shadowing symbol @t{x}, and B and C each contain external ++symbols named @t{x}, then removing the shadowing symbol @t{x} ++from A will reveal a name ++conflict between @t{b:x} and @t{c:x} if those two @i{symbols} are distinct. ++In this case @b{unintern} will signal an error. ++ ++@subsubheading See Also:: ++ ++@ref{Package Concepts} ++ ++@node in-package, unuse-package, unintern, Packages Dictionary ++@subsection in-package [Macro] ++ ++@code{in-package} @i{name} @result{} @i{package} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{string designator}; not evaluated. ++ ++@i{package}---the @i{package} named by @i{name}. ++ ++@subsubheading Description:: ++ ++Causes the the @i{package} named by @i{name} ++to become the @i{current package}---that is, the @i{value} of @b{*package*}. ++If no such @i{package} already exists, an error of @i{type} @b{package-error} is signaled. ++ ++Everything @b{in-package} does is also performed at compile time ++if the call appears as a @i{top level form}. ++ ++@subsubheading Side Effects:: ++ ++The @i{variable} @b{*package*} is assigned. ++If the @b{in-package} @i{form} is a @i{top level form}, ++this assignment also occurs at compile time. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{package-error} is signaled if the specified @i{package} does not exist. ++ ++@subsubheading See Also:: ++ ++@ref{package} ++ ++@node unuse-package, use-package, in-package, Packages Dictionary ++@subsection unuse-package [Function] ++ ++@code{unuse-package} @i{packages-to-unuse @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{packages-to-unuse}---a @i{designator} for ++ a @i{list} of @i{package designators}. ++ ++@i{package}---a @i{package designator}. ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{unuse-package} causes @i{package} to cease inheriting ++all the @i{external symbols} of ++@i{packages-to-unuse}; @b{unuse-package} undoes ++the effects of @b{use-package}. The ++@i{packages-to-unuse} ++are removed from the @i{use list} of @i{package}. ++ ++Any @i{symbols} that have been ++@i{imported} into @i{package} continue to be @i{present} in @i{package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ (export (intern "SHOES" (make-package 'temp)) 'temp) @result{} T ++ (find-symbol "SHOES") @result{} NIL, NIL ++ (use-package 'temp) @result{} T ++ (find-symbol "SHOES") @result{} SHOES, :INHERITED ++ (find (find-package 'temp) (package-use-list 'common-lisp-user)) @result{} # ++ (unuse-package 'temp) @result{} T ++ (find-symbol "SHOES") @result{} NIL, NIL ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{use list} of @i{package} is modified. ++ ++@subsubheading Affected By:: ++Current state of the package system. ++ ++@subsubheading See Also:: ++ ++@ref{use-package} ++, ++@ref{package-use-list} ++ ++@node use-package, defpackage, unuse-package, Packages Dictionary ++@subsection use-package [Function] ++ ++@code{use-package} @i{packages-to-use @r{&optional} package} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{packages-to-use}---a @i{designator} for ++ a @i{list} of @i{package designators}. ++ The @t{KEYWORD} @i{package} may not be supplied. ++ ++@i{package}---a @i{package designator}. ++ The @t{KEYWORD} @i{package} cannot be supplied. ++ The default is the @i{current package}. ++ ++@subsubheading Description:: ++ ++@b{use-package} causes @i{package} to inherit all the ++@i{external symbols} of @i{packages-to-use}. ++The inherited @i{symbols} become @i{accessible} as ++@i{internal symbols} of @i{package}. ++ ++@i{Packages-to-use} are added to the @i{use list} of @i{package} ++if they are not there already. All @i{external symbols} in ++@i{packages-to-use} become @i{accessible} in @i{package} ++as @i{internal symbols}. ++@b{use-package} does not cause any new @i{symbols} to be @i{present} ++in @i{package} but only makes them @i{accessible} by inheritance. ++ ++@b{use-package} checks for ++name conflicts between the newly imported symbols and those already ++@i{accessible} in @i{package}. ++A name conflict in @b{use-package} ++between two external symbols inherited ++by @i{package} from @i{packages-to-use} may be resolved in favor of ++either @i{symbol} ++by @i{importing} one of them into @i{package} and making it a ++shadowing symbol. ++ ++@subsubheading Examples:: ++ ++@example ++ (export (intern "LAND-FILL" (make-package 'trash)) 'trash) @result{} T ++ (find-symbol "LAND-FILL" (make-package 'temp)) @result{} NIL, NIL ++ (package-use-list 'temp) @result{} (#) ++ (use-package 'trash 'temp) @result{} T ++ (package-use-list 'temp) @result{} (# #) ++ (find-symbol "LAND-FILL" 'temp) @result{} TRASH:LAND-FILL, :INHERITED ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{use list} of @i{package} may be modified. ++ ++@subsubheading See Also:: ++ ++@ref{unuse-package} ++, ++@ref{package-use-list} ++, ++@ref{Package Concepts} ++ ++@subsubheading Notes:: ++ ++It is permissible for a @i{package} P_1 ++to @i{use} a @i{package} P_2 ++even if P_2 already uses P_1. ++The using of @i{packages} is not transitive, ++so no problem results from the apparent circularity. ++ ++@node defpackage, do-symbols, use-package, Packages Dictionary ++@subsection defpackage [Macro] ++ ++@code{defpackage} @i{defined-package-name [[!@i{option}]]} @result{} @i{package} ++ ++@w{@i{option} ::=@{@r{(}@t{:nicknames} @{@i{nickname}@}*@r{)}@}* | } ++@w{ @r{(}@t{:documentation} @i{string}@r{)} | } ++@w{ @{@r{(}@t{:use} @{@i{package-name}@}*@r{)}@}* | } ++@w{ @{@r{(}@t{:shadow} @{!@i{symbol-name}@}*@r{)}@}* | } ++@w{ @{@r{(}@t{:shadowing-import-from} @i{package-name} @{!@i{symbol-name}@}*@r{)}@}* | } ++@w{ @{@r{(}@t{:import-from} @i{package-name} @{!@i{symbol-name}@}*@r{)}@}* | } ++@w{ @{@r{(}@t{:export} @{!@i{symbol-name}@}*@r{)}@}* | } ++@w{ @{@r{(}@t{:intern} @{!@i{symbol-name}@}*@r{)}@}* | } ++@w{ @r{(}@t{:size} @i{integer}@r{)}} ++ ++@w{@i{symbol-name} ::=(@i{symbol} | @i{string})} ++ ++@subsubheading Arguments and Values:: ++ ++@i{defined-package-name}---a @i{string designator}. ++ ++@i{package-name}---a @i{package designator}. ++ ++@i{nickname}---a @i{string designator}. ++ ++@i{symbol-name}---a @i{string designator}. ++ ++@i{package}---the @i{package} named @i{package-name}. ++ ++@subsubheading Description:: ++ ++@b{defpackage} creates a @i{package} as specified and returns ++the @i{package}. ++ ++If @i{defined-package-name} already refers to an existing ++@i{package}, the name-to-package mapping for that name is not changed. ++If the new definition is at variance with the current state of that ++@i{package}, the consequences are undefined; an implementation ++might choose to modify the existing @i{package} to reflect the ++new definition. If @i{defined-package-name} is a @i{symbol}, ++its @i{name} is used. ++ ++The standard @i{options} are described below. ++ ++@table @asis ++ ++@item @t{:nicknames} ++The arguments to @t{:nicknames} set the @i{package}'s nicknames to the ++supplied names. ++ ++@item @t{:documentation} ++The argument to @t{:documentation} specifies a @i{documentation string}; ++it is attached as a @i{documentation string} to the @i{package}. ++At most one @t{:documentation} option ++can appear in a single @b{defpackage} @i{form}. ++ ++@item @t{:use} ++The arguments to @t{:use} set the @i{packages} that the @i{package} ++named by @i{package-name} ++will inherit from. If @t{:use} is not supplied, ++ ++it defaults to the same @i{implementation-dependent} value as the @t{:use} @i{argument} to ++@b{make-package}. ++ ++@item @t{:shadow} ++The arguments to @t{:shadow}, @i{symbol-names}, name @i{symbols} ++that are to be created in the @i{package} being defined. ++These @i{symbols} are added to the list of shadowing ++@i{symbols} effectively as if by @b{shadow}. ++ ++@item @t{:shadowing-import-from} ++The @i{symbols} named by the argument @i{symbol-names} ++are found (involving a lookup as if by @b{find-symbol}) ++in the specified @i{package-name}. The resulting @i{symbols} ++are @i{imported} into the @i{package} being defined, and ++placed on the shadowing symbols list as if by @b{shadowing-import}. ++In no case are @i{symbols} created in any @i{package} ++other than the one being defined. ++ ++@item @t{:import-from} ++The @i{symbols} named by the argument @i{symbol-names} ++are found in the @i{package} named by @i{package-name} and ++they are @i{imported} into the @i{package} being defined. ++In no case are @i{symbols} created in any @i{package} ++other than the one being defined. ++ ++@item @t{:export} ++The @i{symbols} named by ++the argument @i{symbol-names} are found ++or created in the @i{package} being defined ++and @i{exported}. ++The @t{:export} option interacts ++with the @t{:use} option, since inherited @i{symbols} ++ can be used rather than new ones created. ++The @t{:export} option interacts ++ with the ++@t{:import-from} and @t{:shadowing-import-from} options, since ++ @i{imported} ++symbols can be used rather than new ones created. ++If an argument to the @t{:export} option is @i{accessible} as ++an (inherited) @i{internal symbol} via @b{use-package}, that the ++@i{symbol} named by @i{symbol-name} ++is first @i{imported} into the @i{package} being ++defined, and is then @i{exported} from that @i{package}. ++ ++@item @t{:intern} ++The @i{symbols} named by the argument @i{symbol-names} ++are found or created in the @i{package} being defined. ++The @t{:intern} option interacts with the ++@t{:use} option, since inherited @i{symbols} ++can be used rather than new ones created. ++ ++@item @t{:size} ++The argument to the @t{:size} option ++declares the approximate number of @i{symbols} expected in the ++@i{package}. ++ This is an efficiency hint only and might be ignored by an ++implementation. ++@end table ++ ++The order in which the options appear in a ++@b{defpackage} form is irrelevant. ++The order in which they are executed is as follows: ++@table @asis ++ ++@item 1. ++@t{:shadow} and @t{:shadowing-import-from}. ++@item 2. ++@t{:use}. ++@item 3. ++@t{:import-from} and @t{:intern}. ++@item 4. ++@t{:export}. ++@end table ++ ++Shadows are established first, since they might be necessary to block ++spurious name conflicts when the @t{:use} ++option is processed. The @t{:use} option is executed ++next so that @t{:intern} and @t{:export} options can refer to normally ++inherited @i{symbols}. ++The @t{:export} option is executed last so that it can refer to ++@i{symbols} created by any of the other options; in ++particular, @i{shadowing symbols} and ++@i{imported} @i{symbols} can be made external. ++ ++If a @i{defpackage} @i{form} appears as a @i{top level form}, ++all of the actions normally performed by this @i{macro} ++at load time must also be performed at compile time. ++ ++@subsubheading Examples:: ++ ++@example ++ (defpackage "MY-PACKAGE" ++ (:nicknames "MYPKG" "MY-PKG") ++ (:use "COMMON-LISP") ++ (:shadow "CAR" "CDR") ++ (:shadowing-import-from "VENDOR-COMMON-LISP" "CONS") ++ (:import-from "VENDOR-COMMON-LISP" "GC") ++ (:export "EQ" "CONS" "FROBOLA") ++ ) ++ ++ (defpackage my-package ++ (:nicknames mypkg :MY-PKG) ; remember Common Lisp conventions for case ++ (:use common-lisp) ; conversion on symbols ++ (:shadow CAR :cdr #:cons) ++ (:export "CONS") ; this is the shadowed one. ++ ) ++@end example ++ ++@subsubheading Affected By:: ++ ++Existing @i{packages}. ++ ++@subsubheading Exceptional Situations:: ++ ++If one of the supplied @t{:nicknames} already ++refers to an existing @i{package}, ++an error of @i{type} @b{package-error} is signaled. ++ ++An error of @i{type} @b{program-error} should be signaled if @t{:size} or @t{:documentation} ++appears more than once. ++ ++Since @i{implementations} might allow extended @i{options} ++an error of @i{type} @b{program-error} should be signaled ++if an @i{option} is present that is not ++actually supported in the host @i{implementation}. ++ ++The collection of @i{symbol-name} arguments given to the options ++ @t{:shadow}, @t{:intern}, ++@t{:import-from}, and @t{:shadowing-import-from} must ++ all be disjoint; additionally, the @i{symbol-name} arguments given to ++ @t{:export} and @t{:intern} ++must be disjoint. ++Disjoint in this context is defined as no two of the @i{symbol-names} ++being @b{string=} with each other. If either condition is ++ violated, an error of @i{type} @b{program-error} should be signaled. ++ ++For the @t{:shadowing-import-from} and @t{:import-from} options, ++a @i{correctable} @i{error} of @i{type} @b{package-error} ++ is signaled if no @i{symbol} is ++@i{accessible} in the @i{package} named by ++ @i{package-name} for one of the argument @i{symbol-names}. ++ ++Name conflict errors are handled by the underlying calls to ++@b{make-package}, @b{use-package}, @b{import}, and ++@b{export}. See @ref{Package Concepts}. ++ ++@subsubheading See Also:: ++ ++@ref{documentation} ++, ++@ref{Package Concepts}, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++ ++The @t{:intern} option is useful if an @t{:import-from} or a ++@t{:shadowing-import-from} option in a subsequent call to @b{defpackage} ++(for some other @i{package}) expects to find ++these @i{symbols} @i{accessible} but not necessarily external. ++ ++It is recommended that the entire @i{package} definition is put ++in a single place, and that all the @i{package} definitions of a ++program are in a single file. This file can be @i{loaded} before ++@i{loading} or compiling anything else that depends on those ++@i{packages}. Such a file can be read in the @t{COMMON-LISP-USER} @i{package}, ++avoiding any initial state issues. ++ ++@b{defpackage} cannot be used to create two ``mutually ++recursive'' packages, such as: ++ ++@example ++ (defpackage my-package ++ (:use common-lisp your-package) ;requires your-package to exist first ++ (:export "MY-FUN")) ++ (defpackage your-package ++ (:use common-lisp) ++ (:import-from my-package "MY-FUN") ;requires my-package to exist first ++ (:export "MY-FUN")) ++@end example ++ ++However, nothing prevents the user from using the ++@i{package}-affecting functions ++such as @b{use-package}, ++@b{import}, and @b{export} to establish such links ++after a more standard use of @b{defpackage}. ++ ++The macroexpansion of @b{defpackage} ++could usefully canonicalize the names ++into @i{strings}, ++so that even if a source file has random @i{symbols} in the ++@b{defpackage} form, the compiled file would only contain ++@i{strings}. ++ ++Frequently additional @i{implementation-dependent} options take the ++form of a @i{keyword} standing by itself as an abbreviation for a list ++@t{(keyword T)}; this syntax should be properly reported as an unrecognized ++option in implementations that do not support it. ++ ++@node do-symbols, intern, defpackage, Packages Dictionary ++@subsection do-symbols, do-external-symbols, do-all-symbols [Macro] ++ ++@code{do-symbols} @i{@r{(}var @r{[}package @r{[}result-form@r{]}@r{]}@r{)} ++ @{@i{declaration}@}* ++ @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@code{do-external-symbols} @i{@r{(}var @r{[}package @r{[}result-form@r{]}@r{]}@r{)} ++ @{@i{declaration}@}* ++ @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@code{do-all-symbols} @i{@r{(}var @r{[}result-form@r{]}@r{)} ++ @{@i{declaration}@}* ++ @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{variable} @i{name}; not evaluated. ++ ++@i{package}---a @i{package designator}; evaluated. ++ ++ The default in @b{do-symbols} and @b{do-external-symbols} is the @i{current package}. ++ ++@i{result-form}---a @i{form}; evaluated as described below. ++ The default is @b{nil}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{tag}---a @i{go tag}; not evaluated. ++ ++@i{statement}---a @i{compound form}; evaluated as described below. ++ ++@i{results}---the @i{values} returned by the @i{result-form} ++ if a @i{normal return} occurs, ++ or else, if an @i{explicit return} occurs, the @i{values} that were transferred. ++ ++@subsubheading Description:: ++ ++@b{do-symbols}, ++@b{do-external-symbols}, and ++@b{do-all-symbols} iterate over the @i{symbols} ++of @i{packages}. ++For each @i{symbol} in the set of @i{packages} chosen, ++the @i{var} is bound to the @i{symbol}, ++and the @i{statements} in the body are executed. ++When all the @i{symbols} have been processed, ++@i{result-form} is evaluated and returned as the value of the macro. ++ ++@b{do-symbols} iterates ++over the @i{symbols} @i{accessible} in ++@i{package}. ++ ++@i{Statements} may execute more than once for @i{symbols} ++that are inherited from multiple @i{packages}. ++ ++@b{do-all-symbols} iterates on every @i{registered package}. ++@b{do-all-symbols} will not process every @i{symbol} ++whatsoever, because a @i{symbol} not @i{accessible} in any ++@i{registered package} will not be processed. ++@b{do-all-symbols} may cause a @i{symbol} that is @i{present} in ++several @i{packages} to be processed more than once. ++ ++@b{do-external-symbols} iterates on the external symbols of @i{package}. ++ ++When @i{result-form} is evaluated, @i{var} is bound and has the value @b{nil}. ++ ++An @i{implicit block} named @b{nil} surrounds the entire @b{do-symbols}, ++@b{do-external-symbols}, or @b{do-all-symbols} @i{form}. ++ ++@b{return} or @b{return-from} may be used to terminate the ++iteration prematurely. ++ ++If execution of the body affects which @i{symbols} ++are contained in the set of @i{packages} over which iteration ++is occurring, other than to ++remove the @i{symbol} ++currently the value of @i{var} by using @b{unintern}, ++the consequences are undefined. ++ ++For each of these macros, the ++@i{scope} of the name binding does not include any ++initial value form, but the optional result forms are included. ++ ++Any @i{tag} in the body is treated as with @b{tagbody}. ++ ++@subsubheading Examples:: ++ ++@example ++ (make-package 'temp :use nil) @result{} # ++ (intern "SHY" 'temp) @result{} TEMP::SHY, NIL ;SHY will be an internal symbol ++ ;in the package TEMP ++ (export (intern "BOLD" 'temp) 'temp) @result{} T ;BOLD will be external ++ (let ((lst ())) ++ (do-symbols (s (find-package 'temp)) (push s lst)) ++ lst) ++@result{} (TEMP::SHY TEMP:BOLD) ++@i{OR}@result{} (TEMP:BOLD TEMP::SHY) ++ (let ((lst ())) ++ (do-external-symbols (s (find-package 'temp) lst) (push s lst)) ++ lst) ++@result{} (TEMP:BOLD) ++ (let ((lst ())) ++ (do-all-symbols (s lst) ++ (when (eq (find-package 'temp) (symbol-package s)) (push s lst))) ++ lst) ++@result{} (TEMP::SHY TEMP:BOLD) ++@i{OR}@result{} (TEMP:BOLD TEMP::SHY) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{intern} ++, ++@ref{export} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node intern, package-name, do-symbols, Packages Dictionary ++@subsection intern [Function] ++ ++@code{intern} @i{string @r{&optional} package} @result{} @i{symbol, status} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string}. ++ ++@i{package}---a @i{package designator}. ++ ++ The default is the @i{current package}. ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{status}---one of @t{:inherited}, @t{:external}, @t{:internal}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{intern} enters a @i{symbol} named @i{string} into @i{package}. ++If a @i{symbol} whose name is the same as @i{string} ++is already @i{accessible} in @i{package}, it is returned. ++If no such @i{symbol} is @i{accessible} in @i{package}, ++a new @i{symbol} with the given name is created ++and entered into @i{package} as an @i{internal symbol}, ++or as an @i{external symbol} if the @i{package} is the @t{KEYWORD} @i{package}; ++@i{package} becomes the @i{home package} of the created @i{symbol}. ++ ++The first value returned by @b{intern}, @i{symbol}, ++is the @i{symbol} that was found or ++created. ++The meaning of the @i{secondary value}, @i{status}, is as follows: ++@table @asis ++ ++@item @t{:internal} ++The @i{symbol} was found ++and is ++@i{present} in @i{package} as an @i{internal symbol}. ++ ++@item @t{:external} ++The @i{symbol} was found ++and is ++@i{present} as an @i{external symbol}. ++ ++@item @t{:inherited} ++The @i{symbol} was found ++and is inherited via @b{use-package} ++(which implies that the @i{symbol} is internal). ++ ++@item @b{nil} ++No pre-existing @i{symbol} was found, ++so one was created. ++ ++It is @i{implementation-dependent} whether the @i{string} ++that becomes the new @i{symbol}'s @i{name} is the given ++@i{string} or a copy of it. Once a @i{string} ++has been given as the @i{string} @i{argument} to ++@i{intern} in this situation where a new @i{symbol} is created, ++the consequences are undefined if a ++subsequent attempt is made to alter that @i{string}. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ (intern "Never-Before") @result{} |Never-Before|, NIL ++ (intern "Never-Before") @result{} |Never-Before|, :INTERNAL ++ (intern "NEVER-BEFORE" "KEYWORD") @result{} :NEVER-BEFORE, NIL ++ (intern "NEVER-BEFORE" "KEYWORD") @result{} :NEVER-BEFORE, :EXTERNAL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{find-symbol} ++, ++@ref{read} ++, ++@b{symbol}, ++@ref{unintern} ++, ++@ref{Symbols as Tokens} ++ ++@subsubheading Notes:: ++ ++@b{intern} does not need to do any name conflict checking ++because it never creates a new @i{symbol} ++if there is already an @i{accessible} @i{symbol} with the name given. ++ ++@node package-name, package-nicknames, intern, Packages Dictionary ++@subsection package-name [Function] ++ ++@code{package-name} @i{package} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{name}---a @i{string} ++ ++or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{package-name} returns the @i{string} that names @i{package}, ++ ++or @b{nil} if the @i{package} @i{designator} ++is a @i{package} @i{object} that has no name (see the @i{function} @b{delete-package}). ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ (package-name *package*) @result{} "COMMON-LISP-USER" ++ (package-name (symbol-package :test)) @result{} "KEYWORD" ++ (package-name (find-package 'common-lisp)) @result{} "COMMON-LISP" ++@end example ++ ++@example ++ (defvar *foo-package* (make-package "FOO")) ++ (rename-package "FOO" "FOO0") ++ (package-name *foo-package*) @result{} "FOO0" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{package} is not a @i{package designator}. ++ ++@node package-nicknames, package-shadowing-symbols, package-name, Packages Dictionary ++@subsection package-nicknames [Function] ++ ++@code{package-nicknames} @i{package} @result{} @i{nicknames} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{nicknames}---a @i{list} of @i{strings}. ++ ++@subsubheading Description:: ++ ++Returns the @i{list} of nickname @i{strings} ++for @i{package}, not including the name of @i{package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (package-nicknames (make-package 'temporary ++ :nicknames '("TEMP" "temp"))) ++@result{} ("temp" "TEMP") ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{package} is not a @i{package designator}. ++ ++@node package-shadowing-symbols, package-use-list, package-nicknames, Packages Dictionary ++@subsection package-shadowing-symbols [Function] ++ ++@code{package-shadowing-symbols} @i{package} @result{} @i{symbols} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{symbols}---a @i{list} of @i{symbols}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of @i{symbols} that have been declared ++as @i{shadowing symbols} in @i{package} by @b{shadow} ++or @b{shadowing-import} (or the equivalent @b{defpackage} options). ++All @i{symbols} on this @i{list} are @i{present} in @i{package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (package-shadowing-symbols (make-package 'temp)) @result{} () ++ (shadow 'cdr 'temp) @result{} T ++ (package-shadowing-symbols 'temp) @result{} (TEMP::CDR) ++ (intern "PILL" 'temp) @result{} TEMP::PILL, NIL ++ (shadowing-import 'pill 'temp) @result{} T ++ (package-shadowing-symbols 'temp) @result{} (PILL TEMP::CDR) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{package} is not a @i{package designator}. ++ ++@subsubheading See Also:: ++ ++@ref{shadow} ++, ++@ref{shadowing-import} ++ ++@subsubheading Notes:: ++ ++Whether the list of @i{symbols} is @i{fresh} is @i{implementation-dependent}. ++ ++@node package-use-list, package-used-by-list, package-shadowing-symbols, Packages Dictionary ++@subsection package-use-list [Function] ++ ++@code{package-use-list} @i{package} @result{} @i{use-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{use-list}---a @i{list} of @i{package} @i{objects}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of other @i{packages} used by @i{package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (package-use-list (make-package 'temp)) @result{} (#) ++ (use-package 'common-lisp-user 'temp) @result{} T ++ (package-use-list 'temp) @result{} (# #) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{package} is not a @i{package designator}. ++ ++@subsubheading See Also:: ++ ++@ref{use-package} ++, ++@ref{unuse-package} ++ ++@node package-used-by-list, packagep, package-use-list, Packages Dictionary ++@subsection package-used-by-list [Function] ++ ++@code{package-used-by-list} @i{package} @result{} @i{used-by-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{package}---a @i{package designator}. ++ ++@i{used-by-list}---a @i{list} of @i{package} @i{objects}. ++ ++@subsubheading Description:: ++ ++@b{package-used-by-list} returns a @i{list} ++of other @i{packages} that use @i{package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (package-used-by-list (make-package 'temp)) @result{} () ++ (make-package 'trash :use '(temp)) @result{} # ++ (package-used-by-list 'temp) @result{} (#) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{package} is not a @i{package}. ++ ++@subsubheading See Also:: ++ ++@ref{use-package} ++, ++@ref{unuse-package} ++ ++@node packagep, *package*, package-used-by-list, Packages Dictionary ++@subsection packagep [Function] ++ ++@code{packagep} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{package}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (packagep *package*) @result{} @i{true} ++ (packagep 'common-lisp) @result{} @i{false} ++ (packagep (find-package 'common-lisp)) @result{} @i{true} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (packagep @i{object}) @equiv{} (typep @i{object} 'package) ++@end example ++ ++@node *package*, package-error, packagep, Packages Dictionary ++@subsection *package* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{package} @i{object}. ++ ++@subsubheading Initial Value:: ++ ++the @t{COMMON-LISP-USER} @i{package}. ++ ++@subsubheading Description:: ++ ++Whatever @i{package} @i{object} is currently ++the @i{value} of @b{*package*} is referred to as the @i{current package}. ++ ++@subsubheading Examples:: ++ ++@example ++ (in-package "COMMON-LISP-USER") @result{} # ++ *package* @result{} # ++ (make-package "SAMPLE-PACKAGE" :use '("COMMON-LISP")) ++@result{} # ++ (list ++ (symbol-package ++ (let ((*package* (find-package 'sample-package))) ++ (setq *some-symbol* (read-from-string "just-testing")))) ++ *package*) ++@result{} (# #) ++ (list (symbol-package (read-from-string "just-testing")) ++ *package*) ++@result{} (# #) ++ (eq 'foo (intern "FOO")) @result{} @i{true} ++ (eq 'foo (let ((*package* (find-package 'sample-package))) ++ (intern "FOO"))) ++@result{} @i{false} ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{load}, ++@b{compile-file}, ++@b{in-package} ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++, ++@ref{in-package} ++, ++@ref{load} ++, ++@ref{package} ++ ++@node package-error, package-error-package, *package*, Packages Dictionary ++@subsection package-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{package-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{package-error} consists of @i{error} @i{conditions} ++related to operations on @i{packages}. ++The offending @i{package} (or @i{package} @i{name}) ++is initialized by the @t{:package} initialization argument to @b{make-condition}, ++and is @i{accessed} by the @i{function} @b{package-error-package}. ++ ++@subsubheading See Also:: ++ ++@ref{package-error-package} ++, ++@ref{Conditions} ++ ++@node package-error-package, , package-error, Packages Dictionary ++@subsection package-error-package [Function] ++ ++@code{package-error-package} @i{condition} @result{} @i{package} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{package-error}. ++ ++@i{package}---a @i{package designator}. ++ ++@subsubheading Description:: ++ ++Returns a @i{designator} for the offending @i{package} ++in the @i{situation} represented by the @i{condition}. ++ ++@subsubheading Examples:: ++ ++@example ++ (package-error-package ++ (make-condition 'package-error ++ :package (find-package "COMMON-LISP"))) ++@result{} # ++@end example ++ ++@subsubheading See Also:: ++ ++@b{package-error} ++ ++@c end of including dict-packages ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-12.texi +@@ -0,0 +1,5537 @@ ++ ++ ++@node Numbers (Numbers), Characters, Packages, Top ++@chapter Numbers ++ ++@menu ++* Number Concepts:: ++* Numbers Dictionary:: ++@end menu ++ ++@node Number Concepts, Numbers Dictionary, Numbers (Numbers), Numbers (Numbers) ++@section Number Concepts ++ ++@c including concept-numbers ++ ++@menu ++* Numeric Operations:: ++* Implementation-Dependent Numeric Constants:: ++* Rational Computations:: ++* Floating-point Computations:: ++* Complex Computations:: ++* Interval Designators:: ++* Random-State Operations:: ++@end menu ++ ++@node Numeric Operations, Implementation-Dependent Numeric Constants, Number Concepts, Number Concepts ++@subsection Numeric Operations ++ ++@r{Common Lisp} provides a large variety of operations related to @i{numbers}. ++This section provides an overview of those operations by grouping them ++into categories that emphasize some of the relationships among them. ++ ++Figure 12--1 shows @i{operators} relating to ++arithmetic operations. ++ ++@format ++@group ++@noindent ++@w{ * 1+ gcd } ++@w{ + 1- incf } ++@w{ - conjugate lcm } ++@w{ / decf } ++ ++@noindent ++@w{ Figure 12--1: Operators relating to Arithmetic.} ++ ++@end group ++@end format ++ ++Figure 12--2 shows @i{defined names} relating to ++exponential, logarithmic, and trigonometric operations. ++ ++@format ++@group ++@noindent ++@w{ abs cos signum } ++@w{ acos cosh sin } ++@w{ acosh exp sinh } ++@w{ asin expt sqrt } ++@w{ asinh isqrt tan } ++@w{ atan log tanh } ++@w{ atanh phase } ++@w{ cis pi } ++ ++@noindent ++@w{ Figure 12--2: Defined names relating to Exponentials, Logarithms, and Trigonometry.} ++ ++@end group ++@end format ++ ++Figure 12--3 shows @i{operators} relating to ++numeric comparison and predication. ++ ++@format ++@group ++@noindent ++@w{ /= >= oddp } ++@w{ < evenp plusp } ++@w{ <= max zerop } ++@w{ = min } ++@w{ > minusp } ++ ++@noindent ++@w{ Figure 12--3: Operators for numeric comparison and predication.} ++ ++@end group ++@end format ++ ++Figure 12--4 shows @i{defined names} relating to ++numeric type manipulation and coercion. ++ ++@format ++@group ++@noindent ++@w{ ceiling float-radix rational } ++@w{ complex float-sign rationalize } ++@w{ decode-float floor realpart } ++@w{ denominator fround rem } ++@w{ fceiling ftruncate round } ++@w{ ffloor imagpart scale-float } ++@w{ float integer-decode-float truncate } ++@w{ float-digits mod } ++@w{ float-precision numerator } ++ ++@noindent ++@w{ Figure 12--4: Defined names relating to numeric type manipulation and coercion.} ++ ++@end group ++@end format ++ ++@menu ++* Associativity and Commutativity in Numeric Operations:: ++* Examples of Associativity and Commutativity in Numeric Operations:: ++* Contagion in Numeric Operations:: ++* Viewing Integers as Bits and Bytes:: ++* Logical Operations on Integers:: ++* Byte Operations on Integers:: ++@end menu ++ ++@node Associativity and Commutativity in Numeric Operations, Examples of Associativity and Commutativity in Numeric Operations, Numeric Operations, Numeric Operations ++@subsubsection Associativity and Commutativity in Numeric Operations ++ ++For functions that are mathematically associative (and possibly commutative), ++a @i{conforming implementation} may process the @i{arguments} in any manner ++consistent with associative (and possibly commutative) rearrangement. This does not ++affect the order in which the @i{argument} @i{forms} are @i{evaluated}; ++for a discussion of evaluation order, see @ref{Function Forms}. ++What is unspecified is only the order in which the @i{parameter} @i{values} ++are processed. This implies that @i{implementations} may differ in which ++automatic @i{coercions} are applied; see @ref{Contagion in Numeric Operations}. ++ ++A @i{conforming program} can control the order of processing explicitly by ++separating the operations into separate (possibly nested) @i{function forms}, ++or by writing explicit calls to @i{functions} that perform coercions. ++ ++@node Examples of Associativity and Commutativity in Numeric Operations, Contagion in Numeric Operations, Associativity and Commutativity in Numeric Operations, Numeric Operations ++@subsubsection Examples of Associativity and Commutativity in Numeric Operations ++ ++Consider the following expression, in which we assume that @t{1.0} and ++@t{1.0e-15} both denote @i{single floats}: ++ ++@example ++ (+ 1/3 2/3 1.0d0 1.0 1.0e-15) ++@end example ++ ++One @i{conforming implementation} might ++process the @i{arguments} from left to right, ++first adding @t{1/3} and @t{2/3} to get @t{1}, ++then converting that to a @i{double float} ++for combination with @t{1.0d0}, ++then successively converting and adding @t{1.0} and @t{1.0e-15}. ++ ++Another @i{conforming implementation} might process the @i{arguments} from ++right to left, first performing a @i{single float} addition of @t{1.0} and ++@t{1.0e-15} (perhaps losing accuracy in the process), then converting the sum to ++a @i{double float} and adding @t{1.0d0}, then converting @t{2/3} to a ++@i{double float} and adding it, and then converting @t{1/3} and adding that. ++ ++A third @i{conforming implementation} might first scan all the @i{arguments}, ++process all the @i{rationals} first to keep that part of the computation exact, ++then find an @i{argument} of the largest floating-point format among all the ++@i{arguments} and add that, and then add in all other @i{arguments}, converting ++each in turn (all in a perhaps misguided attempt to make the computation as accurate ++as possible). ++ ++In any case, all three strategies are legitimate. ++ ++A @i{conforming program} could control the order by writing, for example, ++ ++@example ++ (+ (+ 1/3 2/3) (+ 1.0d0 1.0e-15) 1.0) ++@end example ++ ++@node Contagion in Numeric Operations, Viewing Integers as Bits and Bytes, Examples of Associativity and Commutativity in Numeric Operations, Numeric Operations ++@subsubsection Contagion in Numeric Operations ++ ++For information about the contagion rules for implicit coercions of @i{arguments} ++in numeric operations, see ++ @ref{Rule of Float Precision Contagion}, ++ @ref{Rule of Float and Rational Contagion}, ++ and @ref{Rule of Complex Contagion}. ++ ++@node Viewing Integers as Bits and Bytes, Logical Operations on Integers, Contagion in Numeric Operations, Numeric Operations ++@subsubsection Viewing Integers as Bits and Bytes ++ ++@node Logical Operations on Integers, Byte Operations on Integers, Viewing Integers as Bits and Bytes, Numeric Operations ++@subsubsection Logical Operations on Integers ++ ++Logical operations require @i{integers} as arguments; ++an error of @i{type} @b{type-error} should be signaled ++if an argument is supplied that is not an @i{integer}. ++@i{Integer} arguments to logical operations are treated as if ++they were represented in two's-complement notation. ++ ++Figure 12--5 shows @i{defined names} relating to ++logical operations on numbers. ++ ++@format ++@group ++@noindent ++@w{ ash boole-ior logbitp } ++@w{ boole boole-nand logcount } ++@w{ boole-1 boole-nor logeqv } ++@w{ boole-2 boole-orc1 logior } ++@w{ boole-and boole-orc2 lognand } ++@w{ boole-andc1 boole-set lognor } ++@w{ boole-andc2 boole-xor lognot } ++@w{ boole-c1 integer-length logorc1 } ++@w{ boole-c2 logand logorc2 } ++@w{ boole-clr logandc1 logtest } ++@w{ boole-eqv logandc2 logxor } ++ ++@noindent ++@w{ Figure 12--5: Defined names relating to logical operations on numbers.} ++ ++@end group ++@end format ++ ++@node Byte Operations on Integers, , Logical Operations on Integers, Numeric Operations ++@subsubsection Byte Operations on Integers ++ ++The byte-manipulation @i{functions} use @i{objects} ++called @i{byte specifiers} to designate the size and position ++of a specific @i{byte} within an @i{integer}. ++The representation of a @i{byte specifier} is @i{implementation-dependent}; ++it might or might not be a @i{number}. ++The @i{function} @b{byte} will construct a @i{byte specifier}, ++which various other byte-manipulation @i{functions} will accept. ++ ++Figure 12--6 shows @i{defined names} relating to ++manipulating @i{bytes} of @i{numbers}. ++ ++@format ++@group ++@noindent ++@w{ byte deposit-field ldb-test } ++@w{ byte-position dpb mask-field } ++@w{ byte-size ldb } ++ ++@noindent ++@w{ Figure 12--6: Defined names relating to byte manipulation.} ++ ++@end group ++@end format ++ ++@node Implementation-Dependent Numeric Constants, Rational Computations, Numeric Operations, Number Concepts ++@subsection Implementation-Dependent Numeric Constants ++ ++Figure 12--7 shows @i{defined names} relating to ++@i{implementation-dependent} details about @i{numbers}. ++ ++@format ++@group ++@noindent ++@w{ double-float-epsilon most-negative-fixnum } ++@w{ double-float-negative-epsilon most-negative-long-float } ++@w{ least-negative-double-float most-negative-short-float } ++@w{ least-negative-long-float most-negative-single-float } ++@w{ least-negative-short-float most-positive-double-float } ++@w{ least-negative-single-float most-positive-fixnum } ++@w{ least-positive-double-float most-positive-long-float } ++@w{ least-positive-long-float most-positive-short-float } ++@w{ least-positive-short-float most-positive-single-float } ++@w{ least-positive-single-float short-float-epsilon } ++@w{ long-float-epsilon short-float-negative-epsilon } ++@w{ long-float-negative-epsilon single-float-epsilon } ++@w{ most-negative-double-float single-float-negative-epsilon } ++ ++@noindent ++@w{ Figure 12--7: Defined names relating to implementation-dependent details about numbers.} ++ ++@end group ++@end format ++ ++@node Rational Computations, Floating-point Computations, Implementation-Dependent Numeric Constants, Number Concepts ++@subsection Rational Computations ++ ++The rules in this section apply to @i{rational} computations. ++ ++@menu ++* Rule of Unbounded Rational Precision:: ++* Rule of Canonical Representation for Rationals:: ++* Rule of Float Substitutability:: ++@end menu ++ ++@node Rule of Unbounded Rational Precision, Rule of Canonical Representation for Rationals, Rational Computations, Rational Computations ++@subsubsection Rule of Unbounded Rational Precision ++ ++Rational computations cannot overflow in the usual sense ++(though there may not be enough storage to represent a result), ++since @i{integers} and @i{ratios} may in principle be of any magnitude. ++ ++@node Rule of Canonical Representation for Rationals, Rule of Float Substitutability, Rule of Unbounded Rational Precision, Rational Computations ++@subsubsection Rule of Canonical Representation for Rationals ++ ++If any computation produces a result that is a mathematical ratio of two integers ++such that the denominator evenly divides the numerator, then the result is converted ++to the equivalent @i{integer}. ++ ++If the denominator does not evenly divide the numerator, ++the canonical representation of a @i{rational} number is as the @i{ratio} ++that numerator and that denominator, where the greatest common divisor of ++the numerator and denominator is one, and where the denominator is positive ++and greater than one. ++ ++When used as input (in the default syntax), ++the notation @t{-0} always denotes the @i{integer} @t{0}. ++A @i{conforming implementation} must not have a ++representation of ``minus zero'' for @i{integers} ++that is distinct from its representation of zero for @i{integers}. ++However, such a distinction is possible for @i{floats}; ++see the @i{type} @b{float}. ++ ++@node Rule of Float Substitutability, , Rule of Canonical Representation for Rationals, Rational Computations ++@subsubsection Rule of Float Substitutability ++ ++When the arguments to an irrational mathematical @i{function} ++ ++[Reviewer Note by Barmar: There should be a table of these functions.] ++are all @i{rational} and the true mathematical result ++is also (mathematically) rational, then unless otherwise noted ++an implementation is free to return either an accurate ++@i{rational} result ++or a @i{single float} approximation. ++If the arguments are all @i{rational} ++but the result cannot be expressed ++as a @i{rational} number, then a @i{single float} ++approximation is always returned. ++ ++If the arguments to a mathematical @i{function} are all of type ++ @t{(or rational (complex rational))} ++and the true mathematical result is ++ (mathematically) a complex number with rational real and imaginary ++ parts, then unless otherwise noted an implementation is free to return ++ either an accurate result of type @t{(or rational (complex rational))} ++or ++ a @i{single float} ++ (permissible only if the imaginary part of the true mathematical ++ result is zero) or @t{(complex single-float)}. If the arguments are ++ all of type @t{(or rational (complex rational))} ++but the result cannot be ++ expressed as a @i{rational} or @i{complex rational}, ++then the returned ++ value will be of @i{type} @b{single-float} ++(permissible only if the imaginary ++ part of the true mathematical result is zero) or @t{(complex single-float)}. ++ ++@format ++@group ++@noindent ++@w{ Function Sample Results } ++@w{ @b{abs} @t{(abs #c(3 4)) @result{} 5 @i{or} 5.0} } ++@w{ @b{acos} @t{(acos 1) @result{} 0 @i{or} 0.0} } ++@w{ @b{acosh} @t{(acosh 1) @result{} 0 @i{or} 0.0} } ++@w{ @b{asin} @t{(asin 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{asinh} @t{(asinh 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{atan} @t{(atan 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{atanh} @t{(atanh 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{cis} @t{(cis 0) @result{} #c(1 0) @i{or} #c(1.0 0.0)} } ++@w{ @b{cos} @t{(cos 0) @result{} 1 @i{or} 1.0} } ++@w{ @b{cosh} @t{(cosh 0) @result{} 1 @i{or} 1.0} } ++@w{ @b{exp} @t{(exp 0) @result{} 1 @i{or} 1.0} } ++@w{ @b{expt} @t{(expt 8 1/3) @result{} 2 @i{or} 2.0} } ++@w{ @b{log} @t{(log 1) @result{} 0 @i{or} 0.0} } ++@w{ @t{(log 8 2) @result{} 3 @i{or} 3.0} } ++@w{ @b{phase} @t{(phase 7) @result{} 0 @i{or} 0.0} } ++@w{ @b{signum} @t{(signum #c(3 4)) @result{} #c(3/5 4/5) @i{or} #c(0.6 0.8)} } ++@w{ @b{sin} @t{(sin 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{sinh} @t{(sinh 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{sqrt} @t{(sqrt 4) @result{} 2 @i{or} 2.0} } ++@w{ @t{(sqrt 9/16) @result{} 3/4 @i{or} 0.75} } ++@w{ @b{tan} @t{(tan 0) @result{} 0 @i{or} 0.0} } ++@w{ @b{tanh} @t{(tanh 0) @result{} 0 @i{or} 0.0} } ++ ++@noindent ++@w{ Figure 12--8: Functions Affected by Rule of Float Substitutability} ++ ++@end group ++@end format ++ ++@node Floating-point Computations, Complex Computations, Rational Computations, Number Concepts ++@subsection Floating-point Computations ++ ++The following rules apply to floating point computations. ++ ++@menu ++* Rule of Float and Rational Contagion:: ++* Examples of Rule of Float and Rational Contagion:: ++* Rule of Float Approximation:: ++* Rule of Float Underflow and Overflow:: ++* Rule of Float Precision Contagion:: ++@end menu ++ ++@node Rule of Float and Rational Contagion, Examples of Rule of Float and Rational Contagion, Floating-point Computations, Floating-point Computations ++@subsubsection Rule of Float and Rational Contagion ++ ++When @i{rationals} and @i{floats} are combined by a numerical function, ++the @i{rational} is first converted to a @i{float} of the same format. ++For @i{functions} such as @b{+} that take more than two arguments, ++it is permitted that part of the operation be carried out exactly using ++@i{rationals} and the rest be done using floating-point arithmetic. ++ ++When @i{rationals} and @i{floats} are compared by a numerical function, ++the @i{function} @b{rational} is effectively called to convert the @i{float} ++to a @i{rational} and then an exact ++comparison is performed. In the case of @i{complex} numbers, ++the real and imaginary parts are effectively handled individually. ++ ++@node Examples of Rule of Float and Rational Contagion, Rule of Float Approximation, Rule of Float and Rational Contagion, Floating-point Computations ++@subsubsection Examples of Rule of Float and Rational Contagion ++ ++@example ++ ;;;; Combining rationals with floats. ++ ;;; This example assumes an implementation in which ++ ;;; (float-radix 0.5) is 2 (as in IEEE) or 16 (as in IBM/360), ++ ;;; or else some other implementation in which 1/2 has an exact ++ ;;; representation in floating point. ++ (+ 1/2 0.5) @result{} 1.0 ++ (- 1/2 0.5d0) @result{} 0.0d0 ++ (+ 0.5 -0.5 1/2) @result{} 0.5 ++ ++ ;;;; Comparing rationals with floats. ++ ;;; This example assumes an implementation in which the default float ++ ;;; format is IEEE single-float, IEEE double-float, or some other format ++ ;;; in which 5/7 is rounded upwards by FLOAT. ++ (< 5/7 (float 5/7)) @result{} @i{true} ++ (< 5/7 (rational (float 5/7))) @result{} @i{true} ++ (< (float 5/7) (float 5/7)) @result{} @i{false} ++@end example ++ ++@node Rule of Float Approximation, Rule of Float Underflow and Overflow, Examples of Rule of Float and Rational Contagion, Floating-point Computations ++@subsubsection Rule of Float Approximation ++ ++Computations with @i{floats} are only approximate, ++although they are described as if the results ++were mathematically accurate. ++Two mathematically identical ++expressions may be computationally different because of errors ++inherent in the floating-point approximation process. ++The precision of a @i{float} is not necessarily ++correlated with the accuracy of that number. ++For instance, 3.142857142857142857 is a more precise approximation ++to \pi than 3.14159, but the latter is more accurate. ++The precision refers to the number of bits retained in the representation. ++When an operation combines a @i{short float} with a ++@i{long float}, ++the result will be a @i{long float}. ++@r{Common Lisp} functions assume that the accuracy of ++arguments to them does not exceed their precision. Therefore ++when two @i{small floats} ++are combined, the result is a @i{small float}. ++@r{Common Lisp} functions ++never convert automatically from a larger size to a smaller one. ++ ++@node Rule of Float Underflow and Overflow, Rule of Float Precision Contagion, Rule of Float Approximation, Floating-point Computations ++@subsubsection Rule of Float Underflow and Overflow ++ ++An error of @i{type} @b{floating-point-overflow} ++or @b{floating-point-underflow} should be signaled if a ++floating-point computation causes exponent overflow or underflow, respectively. ++ ++@node Rule of Float Precision Contagion, , Rule of Float Underflow and Overflow, Floating-point Computations ++@subsubsection Rule of Float Precision Contagion ++ ++The result of a numerical function is a @i{float} of the ++largest format among all the floating-point arguments to the @i{function}. ++ ++@node Complex Computations, Interval Designators, Floating-point Computations, Number Concepts ++@subsection Complex Computations ++ ++The following rules apply to @i{complex} computations: ++ ++@menu ++* Rule of Complex Substitutability:: ++* Rule of Complex Contagion:: ++* Rule of Canonical Representation for Complex Rationals:: ++* Examples of Rule of Canonical Representation for Complex Rationals:: ++* Principal Values and Branch Cuts:: ++@end menu ++ ++@node Rule of Complex Substitutability, Rule of Complex Contagion, Complex Computations, Complex Computations ++@subsubsection Rule of Complex Substitutability ++ ++Except during the execution of irrational and transcendental @i{functions}, ++no numerical @i{function} ever @i{yields} a @i{complex} unless ++one or more of its @i{arguments} is a @i{complex}. ++ ++@node Rule of Complex Contagion, Rule of Canonical Representation for Complex Rationals, Rule of Complex Substitutability, Complex Computations ++@subsubsection Rule of Complex Contagion ++ ++When a ++ ++@i{real} ++ ++and ++a @i{complex} are both part of a computation, ++the ++ ++@i{real} ++ ++is first converted to a @i{complex} by providing an imaginary part of @t{0}. ++ ++@node Rule of Canonical Representation for Complex Rationals, Examples of Rule of Canonical Representation for Complex Rationals, Rule of Complex Contagion, Complex Computations ++@subsubsection Rule of Canonical Representation for Complex Rationals ++ ++If the result of any computation would be a @i{complex} ++number whose real part is of @i{type} @b{rational} and whose imaginary ++part is zero, the result is converted to the @i{rational} ++which is the real part. ++This rule does not apply to @i{complex} numbers whose parts ++are @i{floats}. ++For example, @t{#C(5 0)} and @t{5} are not @i{different} @i{objects} in @r{Common Lisp} ++(they are always the @i{same} under @b{eql}); ++@t{#C(5.0 0.0)} and @t{5.0} are always @i{different} @i{objects} in @r{Common Lisp} ++(they are never the @i{same} under @b{eql}, ++although they are the @i{same} under @b{equalp} and @b{=}). ++ ++@node Examples of Rule of Canonical Representation for Complex Rationals, Principal Values and Branch Cuts, Rule of Canonical Representation for Complex Rationals, Complex Computations ++@subsubsection Examples of Rule of Canonical Representation for Complex Rationals ++ ++@example ++ #c(1.0 1.0) @result{} #C(1.0 1.0) ++ #c(0.0 0.0) @result{} #C(0.0 0.0) ++ #c(1.0 1) @result{} #C(1.0 1.0) ++ #c(0.0 0) @result{} #C(0.0 0.0) ++ #c(1 1) @result{} #C(1 1) ++ #c(0 0) @result{} 0 ++ (typep #c(1 1) '(complex (eql 1))) @result{} @i{true} ++ (typep #c(0 0) '(complex (eql 0))) @result{} @i{false} ++@end example ++ ++@node Principal Values and Branch Cuts, , Examples of Rule of Canonical Representation for Complex Rationals, Complex Computations ++@subsubsection Principal Values and Branch Cuts ++ ++Many of the irrational and transcendental functions are multiply defined ++in the complex domain; for example, there are in general an infinite ++number of complex values for the logarithm function. In each such ++case, a @i{principal} @i{value} must be chosen for the function to return. ++In general, such values cannot be chosen so as to make the range ++continuous; lines in the domain ++called branch cuts must be defined, which in turn ++define the discontinuities in the range. ++@r{Common Lisp} defines the branch cuts, @i{principal} @i{values}, and boundary ++conditions for the complex functions following ``Principal Values and Branch Cuts in Complex APL.'' The branch ++cut rules that apply to each function are located with the description of ++that function. ++ ++Figure 12--9 lists ++the identities that are obeyed ++throughout the applicable portion of the complex domain, even on ++the branch cuts: ++ ++@format ++@group ++@noindent ++@w{ sin i z = i sinh z sinh i z = i sin z arctan i z = i arctanh z } ++@w{ cos i z = cosh z cosh i z = cos z arcsinh i z = i arcsin z } ++@w{ tan i z = i tanh z arcsin i z = i arcsinh z arctanh i z = i arctan z } ++ ++@noindent ++@w{ Figure 12--9: Trigonometric Identities for Complex Domain } ++ ++@end group ++@end format ++ ++The quadrant numbers referred to in the discussions of branch cuts are as illustrated ++in Figure 12--10. ++ ++@example ++ Imaginary Axis ++ | ++ | ++ II | I ++ | ++ | ++ | ++ ______________________________________ Real Axis ++ | ++ | ++ | ++ III | IV ++ | ++ | ++ | ++ | ++ ++@end example ++ ++@w{ Figure 12--9: Quadrant Numbering for Branch Cuts} ++ ++@node Interval Designators, Random-State Operations, Complex Computations, Number Concepts ++@subsection Interval Designators ++ ++The @i{compound type specifier} form of the numeric @i{type specifiers} ++in Figure 12--10 permit the user to specify an interval on the real number line ++which describe a @i{subtype} of the @i{type} which would be described by the ++corresponding @i{atomic type specifier}. A @i{subtype} of some @i{type} ++@i{T} is specified using an ordered pair of @i{objects} called ++@i{interval designators} for @i{type} @i{T}. ++ ++The first of the two @i{interval designators} for @i{type} @i{T} can be ++any of the following: ++ ++@table @asis ++ ++@item a number @i{N} of @i{type} @i{T} ++This denotes a lower inclusive bound of @i{N}. That is, @i{elements} ++of the @i{subtype} of @i{T} will be greater than or equal to @i{N}. ++ ++@item a @i{singleton} @i{list} whose @i{element} is ++ a number @i{M} of @i{type} @i{T} ++This denotes a lower exclusive bound of @i{M}. That is, @i{elements} ++of the @i{subtype} of @i{T} will be greater than @i{M}. ++ ++@item the symbol @b{*} ++This denotes the absence of a lower bound on the interval. ++ ++@end table ++ ++The second of the two @i{interval designators} for @i{type} @i{T} can be ++any of the following: ++ ++@table @asis ++ ++@item a number @i{N} of @i{type} @i{T} ++This denotes an upper inclusive bound of @i{N}. That is, @i{elements} ++of the @i{subtype} of @i{T} will be less than or equal to @i{N}. ++ ++@item a @i{singleton} @i{list} whose @i{element} is ++ a number @i{M} of @i{type} @i{T} ++This denotes an upper exclusive bound of @i{M}. That is, @i{elements} ++of the @i{subtype} of @i{T} will be less than @i{M}. ++ ++@item the symbol @b{*} ++This denotes the absence of an upper bound on the interval. ++ ++@end table ++ ++@node Random-State Operations, , Interval Designators, Number Concepts ++@subsection Random-State Operations ++ ++Figure 12--10 lists some @i{defined names} that are applicable to @i{random states}. ++ ++@format ++@group ++@noindent ++@w{ *random-state* random } ++@w{ make-random-state random-state-p } ++ ++@noindent ++@w{ Figure 12--10: Random-state defined names} ++ ++@end group ++@end format ++ ++@c end of including concept-numbers ++ ++@node Numbers Dictionary, , Number Concepts, Numbers (Numbers) ++@section Numbers Dictionary ++ ++@c including dict-numbers ++ ++@menu ++* number:: ++* complex (System Class):: ++* real:: ++* float (System Class):: ++* short-float:: ++* rational (System Class):: ++* ratio:: ++* integer:: ++* signed-byte:: ++* unsigned-byte:: ++* mod (System Class):: ++* bit (System Class):: ++* fixnum:: ++* bignum:: ++* =:: ++* max:: ++* minusp:: ++* zerop:: ++* floor:: ++* sin:: ++* asin:: ++* pi:: ++* sinh:: ++* *:: ++* +:: ++* -:: ++* /:: ++* 1+:: ++* abs:: ++* evenp:: ++* exp:: ++* gcd:: ++* incf:: ++* lcm:: ++* log:: ++* mod (Function):: ++* signum:: ++* sqrt:: ++* random-state:: ++* make-random-state:: ++* random:: ++* random-state-p:: ++* *random-state*:: ++* numberp:: ++* cis:: ++* complex:: ++* complexp:: ++* conjugate:: ++* phase:: ++* realpart:: ++* upgraded-complex-part-type:: ++* realp:: ++* numerator:: ++* rational (Function):: ++* rationalp:: ++* ash:: ++* integer-length:: ++* integerp:: ++* parse-integer:: ++* boole:: ++* boole-1:: ++* logand:: ++* logbitp:: ++* logcount:: ++* logtest:: ++* byte:: ++* deposit-field:: ++* dpb:: ++* ldb:: ++* ldb-test:: ++* mask-field:: ++* most-positive-fixnum:: ++* decode-float:: ++* float:: ++* floatp:: ++* most-positive-short-float:: ++* short-float-epsilon:: ++* arithmetic-error:: ++* arithmetic-error-operands:: ++* division-by-zero:: ++* floating-point-invalid-operation:: ++* floating-point-inexact:: ++* floating-point-overflow:: ++* floating-point-underflow:: ++@end menu ++ ++@node number, complex (System Class), Numbers Dictionary, Numbers Dictionary ++@subsection number [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{number} contains @i{objects} which represent ++mathematical numbers. ++ ++The @i{types} @b{real} and @b{complex} are @i{disjoint} ++@i{subtypes} of @b{number}. ++ ++The @i{function} @b{=} tests for numerical equality. ++The @i{function} @b{eql}, when its arguments are both @i{numbers}, ++tests that they have both the same @i{type} and numerical value. ++Two @i{numbers} that are the @i{same} under @b{eql} or @b{=} ++are not necessarily the @i{same} under @b{eq}. ++ ++@subsubheading Notes:: ++ ++@r{Common Lisp} differs from mathematics on some naming issues. In mathematics, ++the set of real numbers is traditionally described as a subset of the ++complex numbers, but in @r{Common Lisp}, the @i{type} @b{real} and the @i{type} @b{complex} are ++disjoint. The @r{Common Lisp} type which includes all mathematical complex ++numbers is called @b{number}. The reasons for these differences ++include historical precedent, compatibility with most other popular ++computer languages, and various issues of time and space efficiency. ++ ++@node complex (System Class), real, number, Numbers Dictionary ++@subsection complex [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{complex}, ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{complex} includes all mathematical complex numbers ++other than those included in the @i{type} @b{rational}. ++@i{Complexes} are ++expressed ++in Cartesian form with a ++real part and an imaginary part, each of which is a @i{real}. ++The real part and imaginary part are either both ++@i{rational} or both of the same @i{float} @i{type}. ++The imaginary part can be a @i{float} zero, but can never ++be a @i{rational} zero, for such a number is always represented ++by @r{Common Lisp} as a @i{rational} rather than a @i{complex}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{complex}@{@i{@t{[}typespec | @b{*}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{typespec}---a @i{type specifier} that denotes a @i{subtype} of @i{type} @b{real}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++[Editorial Note by KMP: If you ask me, this definition is a complete mess. Looking at ++issue ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING does not help me figure ++it out, either. Anyone got any suggestions?] ++ ++Every element of this @i{type} is a @i{complex} whose ++real part and imaginary part are each of type ++ ++@t{(upgraded-complex-part-type @i{typespec})}. ++ ++This @i{type} encompasses those @i{complexes} ++that can result by giving numbers of @i{type} @i{typespec} ++to @b{complex}. ++ ++@t{(complex @i{type-specifier})} ++refers to all @i{complexes} that can result from giving ++@i{numbers} of @i{type} @i{type-specifier} to the @i{function} @b{complex}, ++plus all other @i{complexes} of the same specialized representation. ++ ++@subsubheading See Also:: ++ ++@ref{Rule of Canonical Representation for Complex Rationals}, ++@ref{Constructing Numbers from Tokens}, ++@ref{Printing Complexes} ++ ++@subsubheading Notes:: ++ ++The input syntax for a @i{complex} with real part r and ++imaginary part i is @t{#C(r i)}. ++For further details, see @ref{Standard Macro Characters}. ++ ++For every @i{float}, n, there is a @i{complex} ++which represents the same mathematical number ++and which can be obtained by @t{(COERCE n 'COMPLEX)}. ++ ++@node real, float (System Class), complex (System Class), Numbers Dictionary ++@subsection real [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{real}, ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{real} includes all @i{numbers} that ++represent mathematical real numbers, though there are mathematical real ++numbers (@i{e.g.}, irrational numbers) that do not have an exact representation ++in @r{Common Lisp}. Only @i{reals} can be ordered using the ++@b{<}, @b{>}, @b{<=}, and @b{>=} functions. ++ ++The @i{types} @b{rational} and @b{float} are @i{disjoint} ++@i{subtypes} of @i{type} @b{real}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{real}@{@i{@t{[}lower-limit @r{[}upper-limit@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{lower-limit}, @i{upper-limit}---@i{interval designators} ++ for @i{type} @b{real}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the @i{reals} on the interval described by ++@i{lower-limit} and @i{upper-limit}. ++ ++@node float (System Class), short-float, real, Numbers Dictionary ++@subsection float [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{float}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{float} ++is a mathematical rational (but @i{not} a @r{Common Lisp} @i{rational}) ++of the form ++s\cdot f\cdot b^@r{e-p}, ++where s is +1 or -1, the @i{sign}; ++b is an @i{integer} ++greater than~1, the @i{base} or @i{radix} of the representation; ++p is a positive @i{integer}, ++the @i{precision} (in base-b digits) of the @i{float}; ++f is a positive @i{integer} ++between b^@r{p-1} and ++b^p-1 (inclusive), the significand; ++and e is an @i{integer}, the exponent. ++The value of p and the range of~e ++depends on the implementation and on the type of @i{float} ++within that implementation. In addition, there is a floating-point zero; ++depending on the implementation, there can also be a ``minus zero''. If there ++is no minus zero, then 0.0 and~-0.0 are both interpreted as simply a ++floating-point zero. ++@t{(= 0.0 -0.0)} is always true. ++If there is a minus zero, @t{(eql -0.0 0.0)} is @i{false}, ++otherwise it is @i{true}. ++ ++[Reviewer Note by Barmar: What about IEEE NaNs and infinities?] ++ ++[Reviewer Note by RWK: In the following, what is the ``ordering''? precision? range? ++ Can there be additional subtypes of float or does ``others'' in the ++ list of four?] ++ ++The @i{types} @b{short-float}, @b{single-float}, @b{double-float}, ++and @b{long-float} are @i{subtypes} of @i{type} @b{float}. Any two of them must be ++either @i{disjoint} @i{types} or the @i{same} @i{type}; ++if the @i{same} @i{type}, then any other @i{types} between them in the ++above ordering must also be the @i{same} @i{type}. For example, ++if the @i{type} @b{single-float} and the @i{type} @b{long-float} are the @i{same} @i{type}, ++then the @i{type} @b{double-float} must be the @i{same} @i{type} also. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{float}@{@i{@t{[}lower-limit @r{[}upper-limit@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{lower-limit}, @i{upper-limit}---@i{interval designators} ++ for @i{type} @b{float}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the @i{floats} on the interval described by ++@i{lower-limit} and @i{upper-limit}. ++ ++@subsubheading See Also:: ++ ++@i{Figure~2--9}, ++@ref{Constructing Numbers from Tokens}, ++@ref{Printing Floats} ++ ++@subsubheading Notes:: ++ ++Note that all mathematical integers are representable not only as ++@r{Common Lisp} @i{reals}, but also as @i{complex floats}. For example, ++possible representations of the mathematical number 1 ++include the @i{integer} @t{1}, ++ the @i{float} @t{1.0}, ++ or the @i{complex} @t{#C(1.0 0.0)}. ++ ++@node short-float, rational (System Class), float (System Class), Numbers Dictionary ++@subsection short-float, single-float, double-float, long-float [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{short-float}: ++ @b{short-float}, ++ @b{float}, ++ ++ @b{real}, ++ ++ @b{number}, ++ @b{t} ++ ++@b{single-float}: ++ @b{single-float}, ++ @b{float}, ++ ++ @b{real}, ++ ++ @b{number}, ++ @b{t} ++ ++@b{double-float}: ++ @b{double-float}, ++ @b{float}, ++ ++ @b{real}, ++ ++ @b{number}, ++ @b{t} ++ ++@b{long-float}: ++ @b{long-float}, ++ @b{float}, ++ ++ @b{real}, ++ ++ @b{number}, ++ @b{t} ++ ++@subsubheading Description:: ++ ++For the four defined @i{subtypes} of @i{type} @b{float}, it is true that ++intermediate between the @i{type} @b{short-float} and the @i{type} @b{long-float} are ++the @i{type} @b{single-float} and the @i{type} @b{double-float}. ++The precise definition of these categories is ++@i{implementation-defined}. ++The precision (measured in ``bits'', computed as p\log_2b) ++and the exponent size (also measured in ``bits,'' computed as ++\log_2(n+1), where n is the maximum exponent value) is recommended ++to be at least as great ++as the values in Figure 12--11. ++Each of the defined @i{subtypes} of @i{type} @b{float} might or might not have a minus zero. ++ ++@format ++@group ++@noindent ++@w{ @b{Format} @b{Minimum Precision} @b{Minimum Exponent Size} } ++@w{ __________________________________________________} ++@w{ Short 13 bits 5 bits } ++@w{ Single 24 bits 8 bits } ++@w{ Double 50 bits 8 bits } ++@w{ Long 50 bits 8 bits } ++ ++@noindent ++@w{ Figure 12--11: Recommended Minimum Floating-Point Precision and Exponent Size} ++ ++@end group ++@end format ++ ++There can be fewer than four internal ++representations for @i{floats}. ++If there are fewer distinct representations, the following rules apply: ++@table @asis ++ ++@item -- ++If there is only one, it is ++the @i{type} @b{single-float}. ++In this representation, an @i{object} is simultaneously of @i{types} ++@b{single-float}, @b{double-float}, @b{short-float}, ++and @b{long-float}. ++@item -- ++Two internal representations can be arranged in either of the ++following ways: ++@table @asis ++ ++@item @t{*} ++Two @i{types} are provided: @b{single-float} and ++@b{short-float}. An @i{object} is simultaneously ++of @i{types} @b{single-float}, @b{double-float}, and @b{long-float}. ++@item @t{*} ++Two @i{types} are provided: @b{single-float} and ++@b{double-float}. An @i{object} is simultaneously of @i{types} ++@b{single-float} and @b{short-float}, or ++@b{double-float} and @b{long-float}. ++@end table ++ ++@item -- ++Three internal representations can be arranged in either ++of the following ways: ++@table @asis ++ ++@item @t{*} ++Three @i{types} are provided: @b{short-float}, ++@b{single-float}, and @b{double-float}. ++An @i{object} can simultaneously be of @i{type} @b{double-float} ++and @b{long-float}. ++@item @t{*} ++Three @i{types} are provided: ++@b{single-float}, @b{double-float}, ++and @b{long-float}. An @i{object} can simultaneously ++be of @i{types} @b{single-float} and @b{short-float}. ++@end table ++ ++@end table ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{short-float}@{@i{@t{[}short-lower-limit @r{[}short-upper-limit@r{]}@t{]}}@}) ++(@code{single-float}@{@i{@t{[}single-lower-limit @r{[}single-upper-limit@r{]}@t{]}}@}) ++(@code{double-float}@{@i{@t{[}double-lower-limit @r{[}double-upper-limit@r{]}@t{]}}@}) ++(@code{long-float}@{@i{@t{[}long-lower-limit @r{[}long-upper-limit@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{short-lower-limit}, @i{short-upper-limit}---@i{interval designators} ++ for @i{type} @b{short-float}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@i{single-lower-limit}, @i{single-upper-limit}---@i{interval designators} ++ for @i{type} @b{single-float}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@i{double-lower-limit}, @i{double-upper-limit}---@i{interval designators} ++ for @i{type} @b{double-float}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@i{long-lower-limit}, @i{long-upper-limit}---@i{interval designators} ++ for @i{type} @b{long-float}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++Each of these denotes the set of @i{floats} of the indicated @i{type} ++that are on the interval specified by the @i{interval designators}. ++ ++@node rational (System Class), ratio, short-float, Numbers Dictionary ++@subsection rational [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The canonical representation of a @i{rational} ++is as an @i{integer} if its value is integral, ++and otherwise as a @i{ratio}. ++ ++The @i{types} @b{integer} and @b{ratio} ++are @i{disjoint} @i{subtypes} of @i{type} @b{rational}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{rational}@{@i{@t{[}lower-limit @r{[}upper-limit@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{lower-limit}, @i{upper-limit}---@i{interval designators} ++ for @i{type} @b{rational}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the @i{rationals} on the interval described by ++@i{lower-limit} and @i{upper-limit}. ++ ++@node ratio, integer, rational (System Class), Numbers Dictionary ++@subsection ratio [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{ratio}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{ratio} is a @i{number} ++representing the mathematical ratio of two non-zero integers, ++the numerator and denominator, ++whose greatest common divisor is one, ++and of which the denominator is positive and greater than one. ++ ++@subsubheading See Also:: ++ ++@i{Figure~2--9}, ++@ref{Constructing Numbers from Tokens}, ++@ref{Printing Ratios} ++ ++@node integer, signed-byte, ratio, Numbers Dictionary ++@subsection integer [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{integer}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++An @i{integer} is a mathematical integer. There is no limit on the ++magnitude of an @i{integer}. ++ ++The @i{types} @b{fixnum} and @b{bignum} ++form an @i{exhaustive partition} of @i{type} @b{integer}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{integer}@{@i{@t{[}lower-limit @r{[}upper-limit@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{lower-limit}, @i{upper-limit}---@i{interval designators} ++ for @i{type} @b{integer}. ++ The defaults for each of @i{lower-limit} and @i{upper-limit} is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the @i{integers} on the interval described by ++@i{lower-limit} and @i{upper-limit}. ++ ++@subsubheading See Also:: ++ ++@i{Figure~2--9}, ++@ref{Constructing Numbers from Tokens}, ++@ref{Printing Integers} ++ ++@subsubheading Notes:: ++ ++The @i{type} @t{(integer @i{lower} @i{upper})}, ++where @i{lower} and @i{upper} ++are @b{most-negative-fixnum} and @b{most-positive-fixnum}, respectively, ++is also called @b{fixnum}. ++ ++The @i{type} @t{(integer 0 1)} is also called @b{bit}. ++The @i{type} @t{(integer 0 *)} is also called @b{unsigned-byte}. ++ ++@node signed-byte, unsigned-byte, integer, Numbers Dictionary ++@subsection signed-byte [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{signed-byte}, ++@b{integer}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The atomic @i{type specifier} @b{signed-byte} denotes the same ++type as is denoted by the @i{type specifier} @b{integer}; ++however, the list forms of these two @i{type specifiers} have different semantics. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{signed-byte}@{@i{@t{[}s | @b{*}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{s}---a positive @i{integer}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of @i{integers} that can be represented ++in two's-complement form in a @i{byte} of @i{s} bits. This is ++equivalent to @t{(integer -2^@r{s-1} 2^@r{s-1}-1)}. The type ++@b{signed-byte} or the type @t{(signed-byte *)} is the same ++as the @i{type} @b{integer}. ++ ++@node unsigned-byte, mod (System Class), signed-byte, Numbers Dictionary ++@subsection unsigned-byte [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{unsigned-byte}, ++@b{signed-byte}, ++@b{integer}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The atomic @i{type specifier} @b{unsigned-byte} denotes the same ++type as is denoted by the @i{type specifier} @t{(integer 0 *)}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{unsigned-byte}@{@i{@t{[}@i{s} | @b{*}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{s}---a positive @i{integer}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of non-negative @i{integers} that can be ++represented in a byte of size @i{s} (bits). ++This is equivalent ++to @t{(mod @i{m})} for @i{m}=2^s, or ++to @t{(integer 0 @i{n})} for @i{n}=2^s-1. ++The @i{type} @b{unsigned-byte} or ++the type @t{(unsigned-byte *)} is the same as ++the type @t{(integer 0 *)}, the set of non-negative @i{integers}. ++ ++@subsubheading Notes:: ++ ++The @i{type} @t{(unsigned-byte 1)} is also called @b{bit}. ++ ++@node mod (System Class), bit (System Class), unsigned-byte, Numbers Dictionary ++@subsection mod [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{mod}@{@i{n}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{n}---a positive @i{integer}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of non-negative @i{integers} less than @i{n}. ++This is equivalent to ++ @t{(integer 0 (@i{n}))} ++or to ++ @t{(integer 0 @i{m})}, ++where @i{m}=@i{n}-1. ++ ++The argument is required, and cannot be @b{*}. ++ ++The symbol @b{mod} is not valid as a @i{type specifier}. ++ ++@node bit (System Class), fixnum, mod (System Class), Numbers Dictionary ++@subsection bit [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{bit}, ++@b{unsigned-byte}, ++@b{signed-byte}, ++@b{integer}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{bit} is equivalent to the @i{type} @t{(integer 0 1)} ++and @t{(unsigned-byte 1)}. ++ ++@node fixnum, bignum, bit (System Class), Numbers Dictionary ++@subsection fixnum [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{fixnum}, ++@b{integer}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{fixnum} is an @i{integer} whose value is between ++@b{most-negative-fixnum} and @b{most-positive-fixnum} inclusive. ++Exactly which @i{integers} are @i{fixnums} is ++@i{implementation-defined}. ++ ++The @i{type} @b{fixnum} is required to be a supertype of ++@t{(signed-byte 16)}. ++ ++@node bignum, =, fixnum, Numbers Dictionary ++@subsection bignum [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{bignum}, ++@b{integer}, ++@b{rational}, ++ ++@b{real}, ++ ++@b{number}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{bignum} is defined to be exactly @t{(and integer (not fixnum))}. ++ ++@node =, max, bignum, Numbers Dictionary ++@subsection =, /=, <, >, <=, >= [Function] ++ ++@code{=} @i{@r{&rest} numbers^+} @result{} @i{generalized-boolean} ++ ++@code{/=} @i{@r{&rest} numbers^+} @result{} @i{generalized-boolean} ++ ++@code{<} @i{@r{&rest} numbers^+} @result{} @i{generalized-boolean} ++ ++@code{>} @i{@r{&rest} numbers^+} @result{} @i{generalized-boolean} ++ ++@code{<=} @i{@r{&rest} numbers^+} @result{} @i{generalized-boolean} ++ ++@code{>=} @i{@r{&rest} numbers^+} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---for @b{<}, @b{>}, @b{<=}, @b{>=}: a @i{real}; ++ for @b{=}, @b{/=}: a @i{number}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{=}, @b{/=}, @b{<}, @b{>}, @b{<=}, and @b{>=} ++perform arithmetic comparisons on their arguments as follows: ++ ++@table @asis ++ ++@item @b{=} ++The value of @b{=} is @i{true} if all @i{numbers} are the same in value; ++otherwise it is @i{false}. ++Two @i{complexes} are considered equal by @b{=} ++if their real and imaginary parts are equal according to @b{=}. ++ ++@item @b{/=} ++The value of @b{/=} is @i{true} if no two @i{numbers} are the same in value; ++otherwise it is @i{false}. ++ ++@item @b{<} ++The value of @b{<} is @i{true} if the @i{numbers} are in monotonically increasing order; ++otherwise it is @i{false}. ++ ++@item @b{>} ++The value of @b{>} is @i{true} if the @i{numbers} are in monotonically decreasing order; ++otherwise it is @i{false}. ++ ++@item @b{<=} ++The value of @b{<=} is @i{true} if the @i{numbers} are in monotonically ++ nondecreasing order; ++otherwise it is @i{false}. ++ ++@item @b{>=} ++The value of @b{>=} is @i{true} if the @i{numbers} are in monotonically ++ nonincreasing order; ++otherwise it is @i{false}. ++@end table ++ ++@b{=}, @b{/=}, @b{<}, @b{>}, @b{<=}, and @b{>=} ++perform necessary type conversions. ++ ++@subsubheading Examples:: ++ ++The uses of these functions are illustrated in Figure 12--12. ++ ++@format ++@group ++@noindent ++@w{ @t{(= 3 3)} is @i{true}. @t{(/= 3 3)} is @i{false}. } ++@w{ @t{(= 3 5)} is @i{false}. @t{(/= 3 5)} is @i{true}. } ++@w{ @t{(= 3 3 3 3)} is @i{true}. @t{(/= 3 3 3 3)} is @i{false}. } ++@w{ @t{(= 3 3 5 3)} is @i{false}. @t{(/= 3 3 5 3)} is @i{false}. } ++@w{ @t{(= 3 6 5 2)} is @i{false}. @t{(/= 3 6 5 2)} is @i{true}. } ++@w{ @t{(= 3 2 3)} is @i{false}. @t{(/= 3 2 3)} is @i{false}. } ++@w{ @t{(< 3 5)} is @i{true}. @t{(<= 3 5)} is @i{true}. } ++@w{ @t{(< 3 -5)} is @i{false}. @t{(<= 3 -5)} is @i{false}. } ++@w{ @t{(< 3 3)} is @i{false}. @t{(<= 3 3)} is @i{true}. } ++@w{ @t{(< 0 3 4 6 7)} is @i{true}. @t{(<= 0 3 4 6 7)} is @i{true}. } ++@w{ @t{(< 0 3 4 4 6)} is @i{false}. @t{(<= 0 3 4 4 6)} is @i{true}. } ++@w{ @t{(> 4 3)} is @i{true}. @t{(>= 4 3)} is @i{true}. } ++@w{ @t{(> 4 3 2 1 0)} is @i{true}. @t{(>= 4 3 2 1 0)} is @i{true}. } ++@w{ @t{(> 4 3 3 2 0)} is @i{false}. @t{(>= 4 3 3 2 0)} is @i{true}. } ++@w{ @t{(> 4 3 1 2 0)} is @i{false}. @t{(>= 4 3 1 2 0)} is @i{false}. } ++@w{ @t{(= 3)} is @i{true}. @t{(/= 3)} is @i{true}. } ++@w{ @t{(< 3)} is @i{true}. @t{(<= 3)} is @i{true}. } ++@w{ @t{(= 3.0 #c(3.0 0.0))} is @i{true}. @t{(/= 3.0 #c(3.0 1.0))} is @i{true}. } ++@w{ @t{(= 3 3.0)} is @i{true}. @t{(= 3.0s0 3.0d0)} is @i{true}. } ++@w{ @t{(= 0.0 -0.0)} is @i{true}. @t{(= 5/2 2.5)} is @i{true}. } ++@w{ @t{(> 0.0 -0.0)} is @i{false}. @t{(= 0 -0.0)} is @i{true}. } ++@w{ @t{(<= 0 x 9)} is @i{true} if @t{x} is between @t{0} and @t{9}, inclusive} ++@w{ @t{(< 0.0 x 1.0)} is @i{true} if @t{x} is between @t{0.0} and @t{1.0}, exclusive} ++@w{ @t{(< -1 j (length v))} is @i{true} if @t{j} is a @i{valid array index} for a @i{vector} @t{v}} ++ ++@noindent ++@w{ Figure 12--12: Uses of /=, =, <, >, <=, and >= } ++ ++@end group ++@end format ++ ++@subsubheading Exceptional Situations:: ++ ++Might signal @b{type-error} if some @i{argument} is not a @i{real}. ++Might signal @b{arithmetic-error} if otherwise unable to fulfill its contract. ++ ++@subsubheading Notes:: ++ ++@b{=} differs from @b{eql} in that ++@t{(= 0.0 -0.0)} is always true, ++because @b{=} compares the mathematical values of its operands, ++whereas @b{eql} compares the representational values, so to speak. ++ ++@node max, minusp, =, Numbers Dictionary ++@subsection max, min [Function] ++ ++@code{max} @i{@r{&rest} reals^+} @result{} @i{max-real} ++ ++@code{min} @i{@r{&rest} reals^+} @result{} @i{min-real} ++ ++@subsubheading Arguments and Values:: ++ ++@i{real}---a @i{real}. ++ ++@i{max-real}, @i{min-real}---a @i{real}. ++ ++@subsubheading Description:: ++ ++@b{max} returns the @i{real} that is greatest (closest to positive infinity). ++@b{min} returns the @i{real} that is least (closest to negative infinity). ++ ++For @b{max}, ++the implementation has the choice of returning the largest ++argument as is or applying the rules of floating-point @i{contagion}, ++taking all the arguments into consideration for @i{contagion} purposes. ++Also, if one or more of the arguments are @b{=}, then any one ++of them may be chosen as the value to return. ++For example, if the @i{reals} are a mixture of @i{rationals} and @i{floats}, ++and the largest argument is a @i{rational}, ++then the implementation is free to ++produce either that @i{rational} ++or its @i{float} approximation; ++if the largest argument is a ++@i{float} of a smaller format ++than the largest format of any @i{float} argument, ++then the implementation is free to ++return the argument in its given format or expanded to the larger format. ++Similar remarks apply to @b{min} ++(replacing ``largest argument'' by ``smallest argument''). ++ ++@subsubheading Examples:: ++ ++@example ++ (max 3) @result{} 3 ++ (min 3) @result{} 3 ++ (max 6 12) @result{} 12 ++ (min 6 12) @result{} 6 ++ (max -6 -12) @result{} -6 ++ (min -6 -12) @result{} -12 ++ (max 1 3 2 -7) @result{} 3 ++ (min 1 3 2 -7) @result{} -7 ++ (max -2 3 0 7) @result{} 7 ++ (min -2 3 0 7) @result{} -2 ++ (max 5.0 2) @result{} 5.0 ++ (min 5.0 2) ++@result{} 2 ++@i{OR}@result{} 2.0 ++ (max 3.0 7 1) ++@result{} 7 ++@i{OR}@result{} 7.0 ++ (min 3.0 7 1) ++@result{} 1 ++@i{OR}@result{} 1.0 ++ (max 1.0s0 7.0d0) @result{} 7.0d0 ++ (min 1.0s0 7.0d0) ++@result{} 1.0s0 ++@i{OR}@result{} 1.0d0 ++ (max 3 1 1.0s0 1.0d0) ++@result{} 3 ++@i{OR}@result{} 3.0d0 ++ (min 3 1 1.0s0 1.0d0) ++@result{} 1 ++@i{OR}@result{} 1.0s0 ++@i{OR}@result{} 1.0d0 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if any @i{number} is not a @i{real}. ++ ++@node minusp, zerop, max, Numbers Dictionary ++@subsection minusp, plusp [Function] ++ ++@code{minusp} @i{real} @result{} @i{generalized-boolean} ++ ++@code{plusp} @i{real} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{real}---a @i{real}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{minusp} returns @i{true} if @i{real} is less than zero; ++otherwise, returns @i{false}. ++ ++@b{plusp} returns @i{true} if @i{real} is greater than zero; ++otherwise, returns @i{false}. ++ ++Regardless of whether an @i{implementation} provides distinct ++representations for positive and negative @i{float} zeros, ++@t{(minusp -0.0)} always returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (minusp -1) @result{} @i{true} ++ (plusp 0) @result{} @i{false} ++ (plusp least-positive-single-float) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{real} is not a @i{real}. ++ ++@node zerop, floor, minusp, Numbers Dictionary ++@subsection zerop [Function] ++ ++@code{zerop} @i{number} @result{} @i{generalized-boolean} ++ ++@subsubheading Pronunciation:: ++ ++pronounced 'z\=e (, )r\=o@r{}(, )p\=e ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{number} is zero (@i{integer}, @i{float}, or @i{complex}); ++otherwise, returns @i{false}. ++ ++Regardless of whether an @i{implementation} provides distinct representations ++for positive and negative floating-point zeros, @t{(zerop -0.0)} ++always returns @i{true}. ++ ++@subsubheading Examples:: ++ ++@example ++ (zerop 0) @result{} @i{true} ++ (zerop 1) @result{} @i{false} ++ (zerop -0.0) @result{} @i{true} ++ (zerop 0/100) @result{} @i{true} ++ (zerop #c(0 0.0)) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{number} is not a @i{number}. ++ ++@subsubheading Notes:: ++ ++@example ++ (zerop @i{number}) @equiv{} (= @i{number} 0) ++@end example ++ ++@node floor, sin, zerop, Numbers Dictionary ++@subsection floor, ffloor, ceiling, fceiling, ++@subheading truncate, ftruncate, round, fround ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{floor} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{ffloor} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{ceiling} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{fceiling} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{truncate} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{ftruncate} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{round} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@code{fround} @i{number @r{&optional} divisor} @result{} @i{quotient, remainder} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{real}. ++ ++@i{divisor}---a non-zero @i{real}. ++ The default is the @i{integer} @t{1}. ++ ++@i{quotient}---for @b{floor}, @b{ceiling}, ++ @b{truncate}, and @b{round}: an @i{integer}; ++ for @b{ffloor}, @b{fceiling}, ++ @b{ftruncate}, and @b{fround}: a @i{float}. ++ ++@i{remainder}---a @i{real}. ++ ++@subsubheading Description:: ++ ++These functions divide @i{number} by @i{divisor}, ++returning a @i{quotient} and @i{remainder}, such that ++ ++ @i{quotient}@r{\cdot} @i{divisor}+@i{remainder}=@i{number} ++ ++The @i{quotient} always represents a mathematical integer. ++When more than one mathematical integer might be possible ++ (@i{i.e.}, when the remainder is not zero), ++the kind of rounding or truncation depends on the @i{operator}: ++ ++@table @asis ++ ++@item @b{floor}, @b{ffloor} ++@b{floor} and @b{ffloor} produce a @i{quotient} ++that has been truncated toward negative infinity; ++that is, the @i{quotient} represents the largest mathematical integer ++that is not larger than the mathematical quotient. ++ ++@item @b{ceiling}, @b{fceiling} ++@b{ceiling} and @b{fceiling} produce a @i{quotient} ++that has been truncated toward positive infinity; ++that is, the @i{quotient} represents the smallest mathematical integer ++that is not smaller than the mathematical result. ++ ++@item @b{truncate}, @b{ftruncate} ++@b{truncate} and @b{ftruncate} produce a @i{quotient} ++that has been truncated towards zero; ++that is, the @i{quotient} represents the mathematical integer ++of the same sign as the mathematical quotient, and ++that has the greatest integral magnitude not greater than that of the mathematical quotient. ++ ++@item @b{round}, @b{fround} ++@b{round} and @b{fround} produce a @i{quotient} ++that has been rounded to the nearest mathematical integer; ++if the mathematical quotient is exactly halfway between two integers, ++(that is, it has the form @i{integer}+1\over2), ++then the @i{quotient} has been rounded to the even (divisible by two) integer. ++ ++@end table ++ ++All of these functions perform type conversion operations on @i{numbers}. ++ ++The @i{remainder} ++is an @i{integer} if both @t{x} and @t{y} are @i{integers}, ++is a @i{rational} if both @t{x} and @t{y} are @i{rationals}, and ++is a @i{float} if either @t{x} or @t{y} is a @i{float}. ++ ++@b{ffloor}, @b{fceiling}, @b{ftruncate}, and @b{fround} ++handle arguments of different @i{types} in the following way: ++If @i{number} is a @i{float}, ++and @i{divisor} is not a @i{float} of longer format, ++then the first result is a @i{float} of the same @i{type} as @i{number}. ++Otherwise, the first result is of the @i{type} determined by @i{contagion} rules; ++see @ref{Contagion in Numeric Operations}. ++ ++@subsubheading Examples:: ++ ++@example ++ (floor 3/2) @result{} 1, 1/2 ++ (ceiling 3 2) @result{} 2, -1 ++ (ffloor 3 2) @result{} 1.0, 1 ++ (ffloor -4.7) @result{} -5.0, 0.3 ++ (ffloor 3.5d0) @result{} 3.0d0, 0.5d0 ++ (fceiling 3/2) @result{} 2.0, -1/2 ++ (truncate 1) @result{} 1, 0 ++ (truncate .5) @result{} 0, 0.5 ++ (round .5) @result{} 0, 0.5 ++ (ftruncate -7 2) @result{} -3.0, -1 ++ (fround -7 2) @result{} -4.0, 1 ++ (dolist (n '(2.6 2.5 2.4 0.7 0.3 -0.3 -0.7 -2.4 -2.5 -2.6)) ++ (format t "~&~4,1@@F ~2,' D ~2,' D ~2,' D ~2,' D" ++ n (floor n) (ceiling n) (truncate n) (round n))) ++@t{ |> } +2.6 2 3 2 3 ++@t{ |> } +2.5 2 3 2 2 ++@t{ |> } +2.4 2 3 2 2 ++@t{ |> } +0.7 0 1 0 1 ++@t{ |> } +0.3 0 1 0 0 ++@t{ |> } -0.3 -1 0 0 0 ++@t{ |> } -0.7 -1 0 0 -1 ++@t{ |> } -2.4 -3 -2 -2 -2 ++@t{ |> } -2.5 -3 -2 -2 -2 ++@t{ |> } -2.6 -3 -2 -2 -3 ++@result{} NIL ++@end example ++ ++@subsubheading Notes:: ++ ++When only @i{number} is given, the two results are exact; ++the mathematical sum of the two results is always equal to the ++mathematical value of @i{number}. ++ ++@t{(@i{function} @i{number} @i{divisor})} ++and @t{(@i{function} (/ @i{number} @i{divisor}))} ++(where @i{function} is any of one ++of @b{floor}, @b{ceiling}, @b{ffloor}, ++@b{fceiling}, @b{truncate}, ++@b{round}, @b{ftruncate}, and @b{fround}) ++return the same first value, but ++they return different remainders as the second value. For example: ++ ++@example ++ (floor 5 2) @result{} 2, 1 ++ (floor (/ 5 2)) @result{} 2, 1/2 ++@end example ++ ++If an effect is desired that is similar to @b{round}, ++but that always rounds up or down (rather than toward the nearest even integer) ++if the mathematical quotient is exactly halfway between two integers, ++the programmer should consider a construction such as ++ @t{(floor (+ x 1/2))} ++ or @t{(ceiling (- x 1/2))}. ++ ++@node sin, asin, floor, Numbers Dictionary ++@subsection sin, cos, tan [Function] ++ ++@code{sin} @i{radians} @result{} @i{number} ++ ++@code{cos} @i{radians} @result{} @i{number} ++ ++@code{tan} @i{radians} @result{} @i{number} ++ ++@subsubheading Arguments and Values:: ++ ++@i{radians}---a @i{number} given in radians. ++ ++@i{number}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{sin}, @b{cos}, and @b{tan} ++return the sine, cosine, and tangent, respectively, of @i{radians}. ++ ++@subsubheading Examples:: ++ ++@example ++ (sin 0) @result{} 0.0 ++ (cos 0.7853982) @result{} 0.707107 ++ (tan #c(0 1)) @result{} #C(0.0 0.761594) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{radians} is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{asin} ++, ++@b{acos}, ++@b{atan}, ++@ref{Rule of Float Substitutability} ++ ++@node asin, pi, sin, Numbers Dictionary ++@subsection asin, acos, atan [Function] ++ ++@code{asin} @i{number} @result{} @i{radians} ++ ++@code{acos} @i{number} @result{} @i{radians} ++ ++@code{atan} @i{number1 @r{&optional} number2} @result{} @i{radians} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{number1}---a @i{number} if @i{number2} is not supplied, ++ or a @i{real} if @i{number2} is supplied. ++ ++@i{number2}---a @i{real}. ++ ++@i{radians}---a @i{number} (of radians). ++ ++@subsubheading Description:: ++ ++@b{asin}, @b{acos}, and @b{atan} ++compute the arc sine, arc cosine, and arc tangent respectively. ++ ++The arc sine, arc cosine, and arc tangent (with only @i{number1} supplied) ++functions can be defined mathematically for ++@i{number} or @i{number1} specified as @i{x} as in Figure 12--13. ++ ++@format ++@group ++@noindent ++@w{ Function Definition } ++@w{ Arc sine -i @t{log} (ix+ \sqrt@r{1-x^2} ) } ++@w{ Arc cosine (\pi/2) - @t{arcsin} x } ++@w{ Arc tangent -i @t{log} ((1+ix) \sqrt@r{1/(1+x^2)} ) } ++ ++@noindent ++@w{ Figure 12--13: Mathematical definition of arc sine, arc cosine, and arc tangent} ++ ++@end group ++@end format ++ ++These formulae are mathematically correct, assuming ++completely accurate computation. They are not necessarily ++the simplest ones for real-valued computations. ++ ++If both @i{number1} and @i{number2} are supplied ++for @b{atan}, the result is the arc tangent ++of @i{number1}/@i{number2}. ++The value of @b{atan} is always between ++-\pi (exclusive) and~\pi (inclusive) ++ ++ when minus zero is not supported. ++The range of the two-argument arc tangent when minus zero is supported ++includes -\pi. ++ ++For a ++ ++@i{real} ++ ++@i{number1}, ++the result is ++ ++a @i{real} ++ ++and lies between ++-\pi/2 and~\pi/2 (both exclusive). ++@i{number1} can be a @i{complex} if @i{number2} ++is not supplied. If both are supplied, @i{number2} can be zero provided ++@i{number1} is not zero. ++ ++[Reviewer Note by Barmar: Should add ``However, if the implementation distinguishes ++ positive and negative zero, both may be signed zeros, ++ and limits are used to define the result.''] ++ ++The following definition for arc sine determines the range and ++branch cuts: ++ ++@center @t{arcsin} z = -i @t{log} (iz+\sqrt@r{1-z^2}\Bigr) ++ ++The branch cut for the arc sine function is in two pieces: ++one along the negative real axis to the left of~-1 ++(inclusive), continuous with quadrant II, and one along the positive real ++axis to the right of~1 (inclusive), continuous with quadrant IV. The ++range is that strip of the complex plane containing numbers whose real ++part is between -\pi/2 and~\pi/2. A number with real ++part equal to -\pi/2 is in the range if and only if its imaginary ++part is non-negative; a number with real part equal to \pi/2 is in ++the range if and only if its imaginary part is non-positive. ++ ++The following definition for arc cosine determines the range and ++branch cuts: ++ ++@center @t{arccos} z = \pi\over2 - @t{arcsin} z ++ ++or, which are equivalent, ++ ++@center @t{arccos} z = -i @t{log} (z+i \sqrt@r{1-z^2}\Bigr) ++ ++@center @t{arccos} z = @t{2 @t{log} (\sqrt@r{(1+z)/2} + i \sqrt@r{(1-z)/2})}\over@r{i} ++ ++The branch cut for the arc cosine function is in two pieces: ++one along the negative real axis to the left of~-1 ++(inclusive), continuous with quadrant II, and one along the positive real ++axis to the right of~1 (inclusive), continuous with quadrant IV. ++This is the same branch cut as for arc sine. ++The range is that strip of the complex plane containing numbers whose real ++part is between 0 and~\pi. A number with real ++part equal to 0 is in the range if and only if its imaginary ++part is non-negative; a number with real part equal to \pi is in ++the range if and only if its imaginary part is non-positive. ++ ++The following definition for (one-argument) arc tangent determines the ++range and branch cuts: ++ ++@center @t{arctan} z = @i{@i{@t{log} (1+iz) - @t{log} (1-iz)}\over@i{2i}} ++ ++Beware of simplifying this formula; ``obvious'' simplifications are likely ++to alter the branch cuts or the values on the branch cuts incorrectly. ++The branch cut for the arc tangent function is in two pieces: ++one along the positive imaginary axis above i ++(exclusive), continuous with quadrant II, and one along the negative imaginary ++axis below -i (exclusive), continuous with quadrant IV. ++The points i and~-i are excluded from the domain. ++The range is that strip of the complex plane containing numbers whose real ++part is between -\pi/2 and~\pi/2. A number with real ++part equal to -\pi/2 is in the range if and only if its imaginary ++part is strictly positive; a number with real part equal to \pi/2 is in ++the range if and only if its imaginary part is strictly negative. Thus the range of ++arc tangent is identical to that of arc sine with the points ++-\pi/2 and~\pi/2 excluded. ++ ++For @b{atan}, ++the signs of @i{number1} (indicated as @i{x}) ++and @i{number2} (indicated as @i{y}) are used to derive quadrant ++information. Figure 12--14 details various special cases. ++ ++The asterisk (*) indicates that the entry in the figure applies to ++implementations that support minus zero. ++ ++@format ++@group ++@noindent ++@w{ to 1pc@r{}@i{y} Condition @i{x} Condition Cartesian locus Range of result } ++@w{ to 1pc@r{} y = 0 x > 0 Positive x-axis 0 } ++@w{ to 1pc* y = +0 x > 0 Positive x-axis +0 } ++@w{ to 1pc* y = -0 x > 0 Positive x-axis -0 } ++@w{ to 1pc@r{} y > 0 x > 0 Quadrant I 0 < result < \pi/2 } ++@w{ to 1pc@r{} y > 0 x = 0 Positive y-axis \pi/2 } ++@w{ to 1pc@r{} y > 0 x < 0 Quadrant II \pi/2 < result < \pi } ++@w{ to 1pc@r{} y = 0 x < 0 Negative x-axis \pi } ++@w{ to 1pc* y = +0 x < 0 Negative x-axis +\pi } ++@w{ to 1pc* y = -0 x < 0 Negative x-axis -\pi } ++@w{ to 1pc@r{} y < 0 x < 0 Quadrant III -\pi < result < -\pi/2 } ++@w{ to 1pc@r{} y < 0 x = 0 Negative y-axis -\pi/2 } ++@w{ to 1pc@r{} y < 0 x > 0 Quadrant IV -\pi/2 < result < 0 } ++@w{ to 1pc@r{} y = 0 x = 0 Origin undefined consequences } ++@w{ to 1pc* y = +0 x = +0 Origin +0 } ++@w{ to 1pc* y = -0 x = +0 Origin -0 } ++@w{ to 1pc* y = +0 x = -0 Origin +\pi } ++@w{ to 1pc* y = -0 x = -0 Origin -\pi } ++ ++@noindent ++@w{ Figure 12--14: Quadrant information for arc tangent } ++ ++@end group ++@end format ++ ++@subsubheading Examples:: ++ ++@example ++ (asin 0) @result{} 0.0 ++ (acos #c(0 1)) @result{} #C(1.5707963267948966 -0.8813735870195432) ++ (/ (atan 1 (sqrt 3)) 6) @result{} 0.087266 ++ (atan #c(0 2)) @result{} #C(-1.5707964 0.54930615) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++@b{acos} and @b{asin} should signal an error of @i{type} @b{type-error} ++ if @i{number} is not a @i{number}. ++@b{atan} should signal @b{type-error} if ++ one argument is supplied and that argument is not a @i{number}, ++ or if two arguments are supplied and both of those arguments are not @i{reals}. ++ ++@b{acos}, @b{asin}, and @b{atan} might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{log} ++, ++@ref{sqrt} ++, ++@ref{Rule of Float Substitutability} ++ ++@subsubheading Notes:: ++ ++The result of either @b{asin} or @b{acos} can be a @i{complex} ++even if @i{number} is not a @i{complex}; this occurs when the ++absolute value of @i{number} is greater than one. ++ ++@node pi, sinh, asin, Numbers Dictionary ++@subsection pi [Constant Variable] ++ ++@subsubheading Value:: ++ ++an @i{implementation-dependent} @i{long float}. ++ ++@subsubheading Description:: ++ ++The best @i{long float} approximation to the mathematical constant \pi. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; In each of the following computations, the precision depends ++ ;; on the implementation. Also, if `long float' is treated by ++ ;; the implementation as equivalent to some other float format ++ ;; (e.g., `double float') the exponent marker might be the marker ++ ;; for that equivalent (e.g., `D' instead of `L'). ++ pi @result{} 3.141592653589793L0 ++ (cos pi) @result{} -1.0L0 ++ ++ (defun sin-of-degrees (degrees) ++ (let ((x (if (floatp degrees) degrees (float degrees pi)))) ++ (sin (* x (/ (float pi x) 180))))) ++@end example ++ ++@subsubheading Notes:: ++ ++An approximation to \pi in some other precision can be obtained ++by writing @t{(float pi x)}, where @t{x} is a @i{float} of the ++desired precision, or by writing @t{(coerce pi @i{type})}, ++where @i{type} is the desired type, such as @b{short-float}. ++ ++@node sinh, *, pi, Numbers Dictionary ++@subsection sinh, cosh, tanh, asinh, acosh, atanh [Function] ++ ++@code{sinh} @i{number} @result{} @i{result} ++ ++@code{cosh} @i{number} @result{} @i{result} ++ ++@code{tanh} @i{number} @result{} @i{result} ++ ++@code{asinh} @i{number} @result{} @i{result} ++ ++@code{acosh} @i{number} @result{} @i{result} ++ ++@code{atanh} @i{number} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{result}---a @i{number}. ++ ++@subsubheading Description:: ++ ++These functions compute the hyperbolic sine, cosine, tangent, ++arc sine, arc cosine, and arc tangent functions, ++which are mathematically defined for an argument @i{x} ++as given in Figure 12--15. ++ ++@format ++@group ++@noindent ++@w{ Function Definition } ++@w{ Hyperbolic sine (e^x-e^@i{-x})/2 } ++@w{ Hyperbolic cosine (e^x+e^@i{-x})/2 } ++@w{ Hyperbolic tangent (e^x-e^@i{-x})/(e^x+e^@i{-x}) } ++@w{ Hyperbolic arc sine @t{log} (x+\sqrt@i{1+x^2}) } ++@w{ Hyperbolic arc cosine 2 @t{log} (\sqrt@i{(x+1)/2} + \sqrt@i{(x-1)/2}) } ++@w{ Hyperbolic arc tangent (@t{log} (1+x) - @t{log} (1-x))/2 } ++ ++@noindent ++@w{ Figure 12--15: Mathematical definitions for hyperbolic functions } ++ ++@end group ++@end format ++ ++The following definition for the inverse hyperbolic cosine ++determines the range and branch cuts: ++ ++@center @t{arccosh} z = 2 @t{log} (\sqrt@i{(z+1)/2} + \sqrt@i{(z-1)/2}\Bigr). ++ ++The branch cut for the inverse hyperbolic cosine function ++lies along the real axis to the left of~1 (inclusive), extending ++indefinitely along the negative real axis, continuous with quadrant II ++and (between 0 and~1) with quadrant I. ++The range is that half-strip of the complex plane containing numbers whose ++real part is non-negative and whose imaginary ++part is between -\pi (exclusive) and~\pi (inclusive). ++A number with real part zero is in the range ++if its imaginary part is between zero (inclusive) and~\pi (inclusive). ++ ++The following definition for the inverse hyperbolic sine determines ++the range and branch cuts: ++ ++@center @t{arcsinh} z = @t{log} (z+\sqrt@i{1+z^2}\Bigr). ++ ++The branch cut for the inverse hyperbolic sine function is in two pieces: ++one along the positive imaginary axis above i ++(inclusive), continuous with quadrant I, and one along the negative imaginary ++axis below -i (inclusive), continuous with quadrant III. ++The range is that strip of the complex plane containing numbers whose imaginary ++part is between -\pi/2 and~\pi/2. A number with imaginary ++part equal to -\pi/2 is in the range if and only if its real ++part is non-positive; a number with imaginary part equal to \pi/2 is in ++the range if and only if its imaginary part is non-negative. ++ ++The following definition for the inverse hyperbolic tangent ++determines the range and branch cuts: ++ ++@center @t{arctanh} z = @i{@i{@t{log} (1+z) - @t{log} (1-z)}\over@r{2}}. ++ ++Note that: ++ ++@center i @t{arctan} z = @t{arctanh} iz. ++ ++The branch cut for the inverse hyperbolic tangent function ++is in two pieces: one along the negative real axis to the left of ++-1 (inclusive), continuous with quadrant III, and one along ++the positive real axis to the right of~1 (inclusive), continuous with ++quadrant I. The points -1 and~1 are excluded from the ++domain. ++The range is that strip of the complex plane containing ++numbers whose imaginary part is between -\pi/2 and ++\pi/2. A number with imaginary part equal to -\pi/2 ++is in the range if and only if its real part is strictly negative; a number with ++imaginary part equal to \pi/2 is in the range if and only if its imaginary ++part is strictly positive. ++Thus the range of the inverse hyperbolic tangent function is identical to ++that of the inverse hyperbolic sine function with the points ++-\pi i/2 and~\pi i/2 excluded. ++ ++@subsubheading Examples:: ++ ++@example ++ (sinh 0) @result{} 0.0 ++ (cosh (complex 0 -1)) @result{} #C(0.540302 -0.0) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{number} is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{log} ++, ++@ref{sqrt} ++, ++@ref{Rule of Float Substitutability} ++ ++@subsubheading Notes:: ++ ++The result of @b{acosh} may be a @i{complex} even if @i{number} ++is not a @i{complex}; this occurs when @i{number} is less than one. ++Also, the result of @b{atanh} may be a @i{complex} even if @i{number} ++is not a @i{complex}; this occurs when the absolute value of @i{number} ++is greater than one. ++ ++The branch cut formulae are mathematically correct, assuming ++completely accurate computation. ++Implementors should consult a good text on ++numerical analysis. The formulae given above are not necessarily ++the simplest ones for real-valued computations; they are chosen ++to define the branch cuts in desirable ways for the complex case. ++ ++@node *, +, sinh, Numbers Dictionary ++@subsection * [Function] ++ ++@code{*} @i{@r{&rest} numbers} @result{} @i{product} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{product}---a @i{number}. ++ ++@subsubheading Description:: ++ ++Returns the product of @i{numbers}, ++performing any necessary type conversions in the process. ++If no @i{numbers} are supplied, @t{1} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (*) @result{} 1 ++ (* 3 5) @result{} 15 ++ (* 1.0 #c(22 33) 55/98) @result{} #C(12.346938775510203 18.520408163265305) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Might signal @b{type-error} if some @i{argument} is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{Numeric Operations}, ++@ref{Rational Computations}, ++@ref{Floating-point Computations}, ++@ref{Complex Computations} ++ ++@node +, -, *, Numbers Dictionary ++@subsection + [Function] ++ ++@code{+} @i{@r{&rest} numbers} @result{} @i{sum} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{sum}---a @i{number}. ++ ++@subsubheading Description:: ++ ++Returns the sum of @i{numbers}, ++performing any necessary type conversions in the process. ++If no @i{numbers} are supplied, @t{0} is returned. ++ ++@subsubheading Examples:: ++@example ++ (+) @result{} 0 ++ (+ 1) @result{} 1 ++ (+ 31/100 69/100) @result{} 1 ++ (+ 1/5 0.8) @result{} 1.0 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Might signal @b{type-error} if some @i{argument} is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{Numeric Operations}, ++@ref{Rational Computations}, ++@ref{Floating-point Computations}, ++@ref{Complex Computations} ++ ++@node -, /, +, Numbers Dictionary ++@subsection - [Function] ++ ++@code{-} @i{number} @result{} @i{negation} ++ ++@code{-} @i{minuend @r{&rest} subtrahends^+} @result{} @i{difference} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}, @i{minuend}, @i{subtrahend}---a @i{number}. ++ ++@i{negation}, @i{difference}---a @i{number}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{-} performs arithmetic subtraction and negation. ++ ++If only one @i{number} is supplied, ++the negation of that @i{number} is returned. ++ ++If more than one @i{argument} is given, ++it subtracts all of the @i{subtrahends} from the @i{minuend} ++and returns the result. ++ ++The @i{function} @b{-} performs necessary type conversions. ++ ++@subsubheading Examples:: ++ ++@example ++ (- 55.55) @result{} -55.55 ++ (- #c(3 -5)) @result{} #C(-3 5) ++ (- 0) @result{} 0 ++ (eql (- 0.0) -0.0) @result{} @i{true} ++ (- #c(100 45) #c(0 45)) @result{} 100 ++ (- 10 1 2 3 4) @result{} 0 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Might signal @b{type-error} if some @i{argument} is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{Numeric Operations}, ++@ref{Rational Computations}, ++@ref{Floating-point Computations}, ++@ref{Complex Computations} ++ ++@node /, 1+, -, Numbers Dictionary ++@subsection / [Function] ++ ++@code{/} @i{number} @result{} @i{reciprocal} ++ ++@code{/} @i{numerator @r{&rest} denominators^+} @result{} @i{quotient} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}, @i{denominator}---a non-zero @i{number}. ++ ++@i{numerator}, @i{quotient}, @i{reciprocal}---a @i{number}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{/} performs division or reciprocation. ++ ++If no @i{denominators} are supplied, ++the @i{function} @b{/} returns the reciprocal of @i{number}. ++ ++If at least one @i{denominator} is supplied, ++the @i{function} @b{/} divides the @i{numerator} by all of the @i{denominators} ++and returns the resulting @i{quotient}. ++ ++If each @i{argument} is either an @i{integer} or a @i{ratio}, ++and the result is not an @i{integer}, then it is a @i{ratio}. ++ ++The @i{function} @b{/} performs necessary type conversions. ++ ++If any @i{argument} is a @i{float} then ++the rules of floating-point contagion apply; ++see @ref{Floating-point Computations}. ++ ++@subsubheading Examples:: ++ ++@example ++ (/ 12 4) @result{} 3 ++ (/ 13 4) @result{} 13/4 ++ (/ -8) @result{} -1/8 ++ (/ 3 4 5) @result{} 3/20 ++ (/ 0.5) @result{} 2.0 ++ (/ 20 5) @result{} 4 ++ (/ 5 20) @result{} 1/4 ++ (/ 60 -2 3 5.0) @result{} -2.0 ++ (/ 2 #c(2 2)) @result{} #C(1/2 -1/2) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are unspecified if any @i{argument} other than the first is zero. ++If there is only one @i{argument}, the consequences are unspecified if it is zero. ++ ++Might signal @b{type-error} if some @i{argument} is not a @i{number}. ++Might signal @b{division-by-zero} if division by zero is attempted. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{floor} ++, @b{ceiling}, @b{truncate}, @b{round} ++ ++@node 1+, abs, /, Numbers Dictionary ++@subsection 1+, 1- [Function] ++ ++@code{1} @i{+} @result{} @i{number} ++ @r{successor} ++@code{1} @i{-} @result{} @i{number} ++ @r{predecessor} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{successor}, @i{predecessor}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{1+} returns a @i{number} that is one more than its argument @i{number}. ++@b{1-} returns a @i{number} that is one less than its argument @i{number}. ++ ++@subsubheading Examples:: ++ ++@example ++ (1+ 99) @result{} 100 ++ (1- 100) @result{} 99 ++ (1+ (complex 0.0)) @result{} #C(1.0 0.0) ++ (1- 5/3) @result{} 2/3 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Might signal @b{type-error} if its @i{argument} is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{incf} ++, @b{decf} ++ ++@subsubheading Notes:: ++ ++@example ++ (1+ @i{number}) @equiv{} (+ @i{number} 1) ++ (1- @i{number}) @equiv{} (- @i{number} 1) ++@end example ++ ++Implementors are encouraged to make the performance of both the previous ++expressions be the same. ++ ++@node abs, evenp, 1+, Numbers Dictionary ++@subsection abs [Function] ++ ++@code{abs} @i{number} @result{} @i{absolute-value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{absolute-value}---a non-negative @i{real}. ++ ++@subsubheading Description:: ++ ++@b{abs} returns the absolute value of @i{number}. ++ ++If @i{number} is ++ ++a @i{real}, ++ ++the result is of the same @i{type} as @i{number}. ++ ++If @i{number} is a @i{complex}, ++the result is a positive ++ ++@i{real} ++ ++with ++the same magnitude as @i{number}. ++The result can be a @i{float} ++ ++[Reviewer Note by Barmar: Single-float.] ++even if @i{number}'s components are @i{rationals} ++and an exact rational result ++would have been possible. ++Thus the result of @t{(abs #c(3 4))} can be either @t{5} or @t{5.0}, ++depending on the implementation. ++ ++@subsubheading Examples:: ++ ++@example ++ (abs 0) @result{} 0 ++ (abs 12/13) @result{} 12/13 ++ (abs -1.09) @result{} 1.09 ++ (abs #c(5.0 -5.0)) @result{} 7.071068 ++ (abs #c(5 5)) @result{} 7.071068 ++ (abs #c(3/5 4/5)) @result{} 1 or approximately 1.0 ++ (eql (abs -0.0) -0.0) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Rule of Float Substitutability} ++ ++@subsubheading Notes:: ++ ++If @i{number} is a @i{complex}, ++the result is equivalent to the following: ++ ++@t{(sqrt (+ (expt (realpart @i{number}) 2) (expt (imagpart @i{number}) 2)))} ++ ++An implementation should not use this formula directly ++for all @i{complexes} ++but should handle very large or very small components specially ++to avoid intermediate overflow or underflow. ++ ++@node evenp, exp, abs, Numbers Dictionary ++@subsection evenp, oddp [Function] ++ ++@code{evenp} @i{integer} @result{} @i{generalized-boolean} ++ ++@code{oddp} @i{integer} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer}---an @i{integer}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{evenp} returns @i{true} if @i{integer} is even (divisible by two); ++otherwise, returns @i{false}. ++ ++@b{oddp} returns @i{true} if @i{integer} is odd (not divisible by two); ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (evenp 0) @result{} @i{true} ++ (oddp 10000000000000000000000) @result{} @i{false} ++ (oddp -1) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{integer} is not an @i{integer}. ++ ++@subsubheading Notes:: ++ ++@example ++ (evenp @i{integer}) @equiv{} (not (oddp @i{integer})) ++ (oddp @i{integer}) @equiv{} (not (evenp @i{integer})) ++@end example ++ ++@node exp, gcd, evenp, Numbers Dictionary ++@subsection exp, expt [Function] ++ ++@code{exp} @i{number} @result{} @i{result} ++ ++@code{expt} @i{base-number power-number} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{base-number}---a @i{number}. ++ ++@i{power-number}---a @i{number}. ++ ++@i{result}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{exp} and @b{expt} perform exponentiation. ++ ++@b{exp} returns @i{e} raised to the power @i{number}, ++where @i{e} is the base of the natural logarithms. ++@b{exp} has no branch cut. ++ ++@b{expt} returns @i{base-number} ++raised to the power @i{power-number}. ++If the @i{base-number} is a @i{rational} ++and @i{power-number} is ++an @i{integer}, ++the calculation is exact and the result will be of @i{type} @b{rational}; ++otherwise a floating-point approximation might result. ++ ++For @b{expt} of a @i{complex rational} to an @i{integer} power, ++the calculation must be exact and the result is ++of type @t{(or rational (complex rational))}. ++ ++The result of @b{expt} can be a @i{complex}, ++even when neither argument is a @i{complex}, ++if @i{base-number} is negative and @i{power-number} ++is not an @i{integer}. ++The result is always the @i{principal} @i{complex} @i{value}. ++For example, @t{(expt -8 1/3)} is not permitted to return @t{-2}, ++even though @t{-2} is one of the cube roots of @t{-8}. ++The @i{principal} cube root is a @i{complex} ++approximately equal to @t{#C(1.0 1.73205)}, not @t{-2}. ++ ++@b{expt} is defined ++as @i{b^x = e^@i{x log b\/}}. ++This defines the @i{principal} @i{values} precisely. The range of ++@b{expt} is the entire complex plane. Regarded ++as a function of @i{x}, with @i{b} fixed, there is no branch cut. ++Regarded as a function of @i{b}, with @i{x} fixed, there is in general ++a branch cut along the negative real axis, continuous with quadrant II. ++The domain excludes the origin. ++By definition, 0^0=1. If @i{b}=0 and the real part of @i{x} is strictly ++positive, then ++@i{b^x}=0. For all other values of @i{x}, 0^@i{x} ++is an error. ++ ++When @i{power-number} is an @i{integer} @t{0}, ++then the result is always the value one in the @i{type} ++of @i{base-number}, ++even if the @i{base-number} is zero (of any @i{type}). That is: ++ ++@example ++ (expt x 0) @equiv{} (coerce 1 (type-of x)) ++@end example ++ ++If @i{power-number} is a zero of any other @i{type}, ++then the result is also the value one, in the @i{type} of the arguments ++after the application of the contagion rules in @ref{Contagion in Numeric Operations}, ++with one exception: ++the consequences are undefined if @i{base-number} is zero when @i{power-number} ++is zero and not of @i{type} @b{integer}. ++ ++@subsubheading Examples:: ++ ++@example ++ (exp 0) @result{} 1.0 ++ (exp 1) @result{} 2.718282 ++ (exp (log 5)) @result{} 5.0 ++ (expt 2 8) @result{} 256 ++ (expt 4 .5) @result{} 2.0 ++ (expt #c(0 1) 2) @result{} -1 ++ (expt #c(2 2) 3) @result{} #C(-16 16) ++ (expt #c(2 2) 4) @result{} -64 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{log} ++, ++@ref{Rule of Float Substitutability} ++ ++@subsubheading Notes:: ++ ++Implementations of @b{expt} are permitted to use different algorithms ++for the cases of a @i{power-number} of @i{type} @b{rational} ++ and a @i{power-number} of @i{type} @b{float}. ++ ++ Note that by the following logic, ++@t{(sqrt (expt @i{x} 3))} is not equivalent to ++@t{(expt @i{x} 3/2)}. ++ ++@example ++ (setq x (exp (/ (* 2 pi #c(0 1)) 3))) ;exp(2.pi.i/3) ++ (expt x 3) @result{} 1 ;except for round-off error ++ (sqrt (expt x 3)) @result{} 1 ;except for round-off error ++ (expt x 3/2) @result{} -1 ;except for round-off error ++@end example ++ ++@node gcd, incf, exp, Numbers Dictionary ++@subsection gcd [Function] ++ ++@code{gcd} @i{@r{&rest} integers} @result{} @i{greatest-common-denominator} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer}---an @i{integer}. ++ ++@i{greatest-common-denominator}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the greatest common divisor of @i{integers}. ++If only one @i{integer} is supplied, its absolute value is returned. ++If no @i{integers} are given, @b{gcd} returns @t{0}, ++which is an identity for this operation. ++ ++@subsubheading Examples:: ++ ++@example ++ (gcd) @result{} 0 ++ (gcd 60 42) @result{} 6 ++ (gcd 3333 -33 101) @result{} 1 ++ (gcd 3333 -33 1002001) @result{} 11 ++ (gcd 91 -49) @result{} 7 ++ (gcd 63 -42 35) @result{} 7 ++ (gcd 5) @result{} 5 ++ (gcd -4) @result{} 4 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if any @i{integer} is not an @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{lcm} ++ ++@subsubheading Notes:: ++For three or more arguments, ++ ++@example ++ (gcd b c ... z) @equiv{} (gcd (gcd a b) c ... z) ++@end example ++ ++@node incf, lcm, gcd, Numbers Dictionary ++@subsection incf, decf [Macro] ++ ++@code{incf} @i{place @r{[}delta-form@r{]}} @result{} @i{new-value} ++ ++@code{decf} @i{place @r{[}delta-form@r{]}} @result{} @i{new-value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@i{delta-form}---a @i{form}; evaluated to produce a @i{delta}. ++ The default is @t{1}. ++ ++@i{delta}---a @i{number}. ++ ++@i{new-value}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{incf} and @b{decf} are used for incrementing and ++decrementing the @i{value} of @i{place}, respectively. ++ ++The @i{delta} is ++ added to (in the case of @b{incf}) ++ or subtracted from (in the case of @b{decf}) ++the number in @i{place} and the result is stored in @i{place}. ++ ++Any necessary type conversions are performed automatically. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{places}, ++see @ref{Evaluation of Subforms to Places}. ++ ++@subsubheading Examples:: ++@example ++ (setq n 0) ++ (incf n) @result{} 1 ++ n @result{} 1 ++ (decf n 3) @result{} -2 ++ n @result{} -2 ++ (decf n -5) @result{} 3 ++ (decf n) @result{} 2 ++ (incf n 0.5) @result{} 2.5 ++ (decf n) @result{} 1.5 ++ n @result{} 1.5 ++@end example ++ ++@subsubheading Side Effects:: ++ ++@i{Place} is modified. ++ ++@subsubheading See Also:: ++ ++@b{+}, ++@ref{-} ++, @b{1+}, @b{1-}, ++@ref{setf} ++ ++@node lcm, log, incf, Numbers Dictionary ++@subsection lcm [Function] ++ ++@code{lcm} @i{@r{&rest} integers} @result{} @i{least-common-multiple} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer}---an @i{integer}. ++ ++@i{least-common-multiple}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{lcm} returns the least common multiple of the @i{integers}. ++ ++If no @i{integer} is supplied, the @i{integer} @t{1} is returned. ++ ++If only one @i{integer} is supplied, ++the absolute value of that @i{integer} is returned. ++ ++For two arguments that are not both zero, ++ ++@example ++ (lcm a b) @equiv{} (/ (abs (* a b)) (gcd a b)) ++@end example ++ ++If one or both arguments are zero, ++ ++@example ++ (lcm a 0) @equiv{} (lcm 0 a) @equiv{} 0 ++@end example ++ ++For three or more arguments, ++ ++@example ++ (lcm a b c ... z) @equiv{} (lcm (lcm a b) c ... z) ++@end example ++ ++@subsubheading Examples:: ++@example ++ (lcm 10) @result{} 10 ++ (lcm 25 30) @result{} 150 ++ (lcm -24 18 10) @result{} 360 ++ (lcm 14 35) @result{} 70 ++ (lcm 0 5) @result{} 0 ++ (lcm 1 2 3 4 5 6) @result{} 60 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if any argument is not an @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{gcd} ++ ++@node log, mod (Function), lcm, Numbers Dictionary ++@subsection log [Function] ++ ++@code{log} @i{number @r{&optional} base} @result{} @i{logarithm} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a non-zero @i{number}. ++ ++@i{base}---a @i{number}. ++ ++@i{logarithm}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{log} returns the logarithm of @i{number} in base @i{base}. ++If @i{base} is not supplied its value is @i{e}, ++the base of the natural logarithms. ++ ++@b{log} may return a @i{complex} when given a ++ ++@i{real} ++ ++negative @i{number}. ++ ++@example ++ (log -1.0) @equiv{} (complex 0.0 (float pi 0.0)) ++@end example ++ ++If @i{base} is zero, ++@b{log} returns zero. ++ ++The result of @t{(log 8 2)} may be either @t{3} or @t{3.0}, depending on the ++implementation. An implementation can use floating-point calculations ++even if an exact integer result is possible. ++ ++The branch cut for the logarithm function of one argument (natural ++logarithm) lies along the negative real axis, continuous with quadrant II. ++The domain excludes the origin. ++ ++The mathematical definition of a complex logarithm ++is as follows, whether or not minus zero is supported by the ++implementation: ++ ++@example ++(log @i{x}) @equiv{} (complex (log (abs @i{x})) (phase @i{x})) ++@end example ++ ++Therefore the range of the one-argument logarithm function is that strip ++of the complex plane containing numbers with imaginary parts between ++ ++-\pi (exclusive) and~\pi (inclusive) if minus zero is not supported, ++or -\pi (inclusive) and~\pi (inclusive) if minus zero is supported. ++ ++The two-argument logarithm function is defined as ++ ++@example ++ (log @i{base} @i{number}) ++ @equiv{} (/ (log @i{number}) (log @i{base})) ++@end example ++ ++This defines the @i{principal} @i{values} precisely. ++The range of the two-argument logarithm function is the entire complex plane. ++ ++@subsubheading Examples:: ++ ++@example ++ (log 100 10) ++@result{} 2.0 ++@result{} 2 ++ (log 100.0 10) @result{} 2.0 ++ (log #c(0 1) #c(0 -1)) ++@result{} #C(-1.0 0.0) ++@i{OR}@result{} #C(-1 0) ++ (log 8.0 2) @result{} 3.0 ++@end example ++ ++@example ++ (log #c(-16 16) #c(2 2)) @result{} 3 or approximately #c(3.0 0.0) ++ or approximately 3.0 (unlikely) ++@end example ++ ++@subsubheading Affected By:: ++ ++The implementation. ++ ++@subsubheading See Also:: ++ ++@ref{exp} ++, ++@b{expt}, ++@ref{Rule of Float Substitutability} ++ ++@node mod (Function), signum, log, Numbers Dictionary ++@subsection mod, rem [Function] ++ ++@code{mod} @i{number divisor} @result{} @i{modulus} ++ ++@code{rem} @i{number divisor} @result{} @i{remainder} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{real}. ++ ++@i{divisor}---a @i{real}. ++ ++@i{modulus}, @i{remainder}---a @i{real}. ++ ++@subsubheading Description:: ++ ++@b{mod} and @b{rem} are generalizations of the modulus ++and remainder functions respectively. ++ ++@b{mod} performs the operation @b{floor} ++on @i{number} and @i{divisor} ++and returns the remainder of the @b{floor} operation. ++ ++@b{rem} performs the operation @b{truncate} ++on @i{number} and @i{divisor} ++and returns the remainder of the @b{truncate} operation. ++ ++@b{mod} and @b{rem} are ++the modulus and remainder functions ++when @i{number} and @i{divisor} are @i{integers}. ++ ++@subsubheading Examples:: ++@example ++ (rem -1 5) @result{} -1 ++ (mod -1 5) @result{} 4 ++ (mod 13 4) @result{} 1 ++ (rem 13 4) @result{} 1 ++ (mod -13 4) @result{} 3 ++ (rem -13 4) @result{} -1 ++ (mod 13 -4) @result{} -3 ++ (rem 13 -4) @result{} 1 ++ (mod -13 -4) @result{} -1 ++ (rem -13 -4) @result{} -1 ++ (mod 13.4 1) @result{} 0.4 ++ (rem 13.4 1) @result{} 0.4 ++ (mod -13.4 1) @result{} 0.6 ++ (rem -13.4 1) @result{} -0.4 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{floor} ++, @b{truncate} ++ ++@subsubheading Notes:: ++ ++The result of @b{mod} is either zero or a ++ ++@i{real} ++ ++with the same sign as @i{divisor}. ++ ++@node signum, sqrt, mod (Function), Numbers Dictionary ++@subsection signum [Function] ++ ++@code{signum} @i{number} @result{} @i{signed-prototype} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{signed-prototype}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{signum} determines a numerical value that indicates whether ++@i{number} is negative, zero, or positive. ++ ++For a @i{rational}, ++@b{signum} returns one of @t{-1}, @t{0}, or @t{1} ++according to whether @i{number} is negative, zero, or positive. ++For a @i{float}, ++the result is a @i{float} of the same format ++whose value is minus one, zero, or one. ++For a @i{complex} number @t{z}, ++@t{(signum @i{z})} is a complex number of the same phase but with unit magnitude, ++unless @t{z} is a complex zero, in which case the result is @t{z}. ++ ++For @i{rational} @i{arguments}, @b{signum} is a rational function, ++but it may be irrational for @i{complex} @i{arguments}. ++ ++If @i{number} is a @i{float}, the result is a @i{float}. ++If @i{number} is a @i{rational}, the result is a @i{rational}. ++If @i{number} is a @i{complex float}, the result is a @i{complex float}. ++If @i{number} is a @i{complex rational}, the result is a @i{complex}, ++but it is @i{implementation-dependent} whether that result is a ++@i{complex rational} or a @i{complex float}. ++ ++@subsubheading Examples:: ++ ++@example ++ (signum 0) @result{} 0 ++ (signum 99) @result{} 1 ++ (signum 4/5) @result{} 1 ++ (signum -99/100) @result{} -1 ++ (signum 0.0) @result{} 0.0 ++ (signum #c(0 33)) @result{} #C(0.0 1.0) ++ (signum #c(7.5 10.0)) @result{} #C(0.6 0.8) ++ (signum #c(0.0 -14.7)) @result{} #C(0.0 -1.0) ++ (eql (signum -0.0) -0.0) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Rule of Float Substitutability} ++ ++@subsubheading Notes:: ++@example ++ (signum x) @equiv{} (if (zerop x) x (/ x (abs x))) ++@end example ++ ++@node sqrt, random-state, signum, Numbers Dictionary ++@subsection sqrt, isqrt [Function] ++ ++@code{sqrt} @i{number} @result{} @i{root} ++ ++@code{isqrt} @i{natural} @result{} @i{natural-root} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}, @i{root}---a @i{number}. ++ ++@i{natural}, @i{natural-root}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{sqrt} and @b{isqrt} compute square roots. ++ ++@b{sqrt} returns the @i{principal} square root of @i{number}. ++If the @i{number} is not a @i{complex} but is negative, ++then the result is a @i{complex}. ++ ++@b{isqrt} returns the greatest @i{integer} ++less than or equal to the exact positive square root of @i{natural}. ++ ++If @i{number} is a positive @i{rational}, ++it is @i{implementation-dependent} ++whether @i{root} is a @i{rational} or a @i{float}. ++If @i{number} is a negative @i{rational}, ++it is @i{implementation-dependent} ++whether @i{root} is a @i{complex rational} or a @i{complex float}. ++ ++The mathematical definition of complex square root (whether or not ++minus zero is supported) follows: ++ ++@t{(sqrt @i{x}) = (exp (/ (log @i{x}) 2))} ++ ++The branch cut for square root lies along the negative real axis, ++continuous with quadrant II. ++The range consists of the right half-plane, including the non-negative ++imaginary axis and excluding the negative imaginary axis. ++ ++@subsubheading Examples:: ++ ++@example ++ (sqrt 9.0) @result{} 3.0 ++ (sqrt -9.0) @result{} #C(0.0 3.0) ++ (isqrt 9) @result{} 3 ++ (sqrt 12) @result{} 3.4641016 ++ (isqrt 12) @result{} 3 ++ (isqrt 300) @result{} 17 ++ (isqrt 325) @result{} 18 ++ (sqrt 25) ++@result{} 5 ++@i{OR}@result{} 5.0 ++ (isqrt 25) @result{} 5 ++ (sqrt -1) @result{} #C(0.0 1.0) ++ (sqrt #c(0 2)) @result{} #C(1.0 1.0) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The @i{function} @b{sqrt} should signal @b{type-error} if its argument ++is not a @i{number}. ++ ++The @i{function} @b{isqrt} should signal @b{type-error} if its argument ++is not a non-negative @i{integer}. ++ ++The functions @b{sqrt} and @b{isqrt} might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{exp} ++, ++@ref{log} ++, ++@ref{Rule of Float Substitutability} ++ ++@subsubheading Notes:: ++ ++@example ++ (isqrt x) @equiv{} (values (floor (sqrt x))) ++@end example ++ ++but it is potentially more efficient. ++ ++@node random-state, make-random-state, sqrt, Numbers Dictionary ++@subsection random-state [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{random-state}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{random state} @i{object} contains state ++information used by the pseudo-random number generator. ++The nature of a @i{random state} @i{object} is @i{implementation-dependent}. ++It can be printed out and successfully read back in by the same @i{implementation}, ++but might not function correctly as a @i{random state} in another @i{implementation}. ++ ++@i{Implementations} are required to provide a read syntax for ++@i{objects} of @i{type} @b{random-state}, but the specific nature of that syntax ++is @i{implementation-dependent}. ++ ++@subsubheading See Also:: ++ ++@ref{random-state} ++, ++@ref{random} ++, ++@ref{Printing Random States} ++ ++@node make-random-state, random, random-state, Numbers Dictionary ++@subsection make-random-state [Function] ++ ++@code{make-random-state} @i{@r{&optional} state} @result{} @i{new-state} ++ ++@subsubheading Arguments and Values:: ++ ++@i{state}---a @i{random state}, or @b{nil}, or @b{t}. ++ The default is @b{nil}. ++ ++@i{new-state}---a @i{random state} @i{object}. ++ ++@subsubheading Description:: ++ ++Creates a @i{fresh} @i{object} of @i{type} @b{random-state} suitable ++for use as the @i{value} of @b{*random-state*}. ++ ++If @i{state} is a @i{random state} @i{object}, ++the @i{new-state} is a @i{copy}_5 of that @i{object}. ++If @i{state} is @b{nil}, ++the @i{new-state} is a @i{copy}_5 of the @i{current random state}. ++If @i{state} is @b{t}, ++the @i{new-state} is a @i{fresh} @i{random state} @i{object} ++that has been randomly initialized by some means. ++ ++@subsubheading Examples:: ++ ++@example ++ (let* ((rs1 (make-random-state nil)) ++ (rs2 (make-random-state t)) ++ (rs3 (make-random-state rs2)) ++ (rs4 nil)) ++ (list (loop for i from 1 to 10 ++ collect (random 100) ++ when (= i 5) ++ do (setq rs4 (make-random-state))) ++ (loop for i from 1 to 10 collect (random 100 rs1)) ++ (loop for i from 1 to 10 collect (random 100 rs2)) ++ (loop for i from 1 to 10 collect (random 100 rs3)) ++ (loop for i from 1 to 10 collect (random 100 rs4)))) ++@result{} ((29 25 72 57 55 68 24 35 54 65) ++ (29 25 72 57 55 68 24 35 54 65) ++ (93 85 53 99 58 62 2 23 23 59) ++ (93 85 53 99 58 62 2 23 23 59) ++ (68 24 35 54 65 54 55 50 59 49)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{state} is not a @i{random state}, or @b{nil}, or @b{t}. ++ ++@subsubheading See Also:: ++ ++@ref{random} ++, ++@ref{random-state} ++ ++@subsubheading Notes:: ++ ++One important use of @b{make-random-state} is to allow the same ++series of pseudo-random @i{numbers} to be generated many times within a ++single program. ++ ++@node random, random-state-p, make-random-state, Numbers Dictionary ++@subsection random [Function] ++ ++@code{random} @i{limit @r{&optional} random-state} @result{} @i{random-number} ++ ++@subsubheading Arguments and Values:: ++ ++@i{limit}---a positive @i{integer}, ++ or a positive @i{float}. ++ ++@i{random-state}---a @i{random state}. ++ The default is the @i{current random state}. ++ ++@i{random-number}---a non-negative @i{number} ++ less than @i{limit} ++ and of the same @i{type} as @i{limit}. ++ ++@subsubheading Description:: ++ ++Returns a pseudo-random number that is a non-negative @i{number} ++less than @i{limit} and of the same @i{type} as @i{limit}. ++ ++The @i{random-state}, which is modified by this function, ++encodes the internal state maintained by the random number generator. ++ ++An approximately uniform choice distribution is used. If @i{limit} ++is an @i{integer}, each of the possible results occurs with ++(approximate) probability 1/@i{limit}. ++ ++@subsubheading Examples:: ++ ++@example ++ (<= 0 (random 1000) 1000) @result{} @i{true} ++ (let ((state1 (make-random-state)) ++ (state2 (make-random-state))) ++ (= (random 1000 state1) (random 1000 state2))) @result{} @i{true} ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{random-state} is modified. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{limit} is not a positive @i{integer} or a positive @i{real}. ++ ++@subsubheading See Also:: ++ ++@ref{make-random-state} ++, ++@ref{random-state} ++ ++@subsubheading Notes:: ++ ++See @i{Common Lisp: The Language} for information about generating random numbers. ++ ++@node random-state-p, *random-state*, random, Numbers Dictionary ++@subsection random-state-p [Function] ++ ++@code{random-state-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{random-state}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (random-state-p *random-state*) @result{} @i{true} ++ (random-state-p (make-random-state)) @result{} @i{true} ++ (random-state-p 'test-function) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{make-random-state} ++, ++@ref{random-state} ++ ++@subsubheading Notes:: ++ ++@example ++ (random-state-p @i{object}) @equiv{} (typep @i{object} 'random-state) ++@end example ++ ++@node *random-state*, numberp, random-state-p, Numbers Dictionary ++@subsection *random-state* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{random state}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{current random state}, which is used, for example, ++by the @i{function} @b{random} when a @i{random state} is not explicitly supplied. ++ ++@subsubheading Examples:: ++ ++@example ++ (random-state-p *random-state*) @result{} @i{true} ++ (setq snap-shot (make-random-state)) ++ ;; The series from any given point is random, ++ ;; but if you backtrack to that point, you get the same series. ++ (list (loop for i from 1 to 10 collect (random)) ++ (let ((*random-state* snap-shot)) ++ (loop for i from 1 to 10 collect (random))) ++ (loop for i from 1 to 10 collect (random)) ++ (let ((*random-state* snap-shot)) ++ (loop for i from 1 to 10 collect (random)))) ++@result{} ((19 16 44 19 96 15 76 96 13 61) ++ (19 16 44 19 96 15 76 96 13 61) ++ (16 67 0 43 70 79 58 5 63 50) ++ (16 67 0 43 70 79 58 5 63 50)) ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@b{random}. ++ ++@subsubheading See Also:: ++ ++@ref{make-random-state} ++, ++@ref{random} ++, ++@b{random-state} ++ ++@subsubheading Notes:: ++ ++@i{Binding} @b{*random-state*} to a different ++@i{random state} @i{object} correctly saves and ++restores the old @i{random state} @i{object}. ++ ++@node numberp, cis, *random-state*, Numbers Dictionary ++@subsection numberp [Function] ++ ++@code{numberp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{number}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (numberp 12) @result{} @i{true} ++ (numberp (expt 2 130)) @result{} @i{true} ++ (numberp #c(5/3 7.2)) @result{} @i{true} ++ (numberp nil) @result{} @i{false} ++ (numberp (cons 1 2)) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (numberp @i{object}) @equiv{} (typep @i{object} 'number) ++@end example ++ ++@node cis, complex, numberp, Numbers Dictionary ++@subsection cis [Function] ++ ++@code{cis} @i{radians} @result{} @i{number} ++ ++@subsubheading Arguments and Values:: ++ ++@i{radians}---a @i{real}. ++ ++@i{number}---a @i{complex}. ++ ++@subsubheading Description:: ++ ++@b{cis} returns the value of~@i{e}^@i{i\cdot @i{radians}}, ++which is a @i{complex} in which the ++real part is equal to the cosine of @i{radians}, and the ++imaginary part is equal to the sine of @i{radians}. ++ ++@subsubheading Examples:: ++@example ++ (cis 0) @result{} #C(1.0 0.0) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Rule of Float Substitutability} ++ ++@node complex, complexp, cis, Numbers Dictionary ++@subsection complex [Function] ++ ++@code{complex} @i{realpart @r{&optional} imagpart} @result{} @i{complex} ++ ++@subsubheading Arguments and Values:: ++ ++@i{realpart}---a @i{real}. ++ ++@i{imagpart}---a @i{real}. ++ ++@i{complex}---a @i{rational} or a @i{complex}. ++ ++@subsubheading Description:: ++ ++@b{complex} returns a @i{number} ++ whose real part is @i{realpart} ++and whose imaginary part is @i{imagpart}. ++ ++If @i{realpart} is a @i{rational} ++and @i{imagpart} is the @i{rational} number zero, ++the result of @b{complex} is @i{realpart}, a @i{rational}. ++Otherwise, the result is a @i{complex}. ++ ++If either @i{realpart} or @i{imagpart} is a @i{float}, ++the non-@i{float} is converted to a @i{float} ++before the @i{complex} is created. ++If @i{imagpart} is not supplied, the imaginary part is a ++zero of the same @i{type} as @i{realpart}; @i{i.e.}, @t{(coerce 0 (type-of @i{realpart}))} is ++effectively used. ++ ++Type upgrading implies a movement upwards in the type ++hierarchy lattice. ++In the case of @i{complexes}, the @i{type-specifier} ++ ++[Reviewer Note by Barmar: What type specifier?] ++must be a subtype of ++@t{(upgraded-complex-part-type @i{type-specifier})}. ++If @i{type-specifier1} is a subtype of @i{type-specifier2}, then ++@t{(upgraded-complex-element-type '@i{type-specifier1})} ++must also be a subtype of ++@t{(upgraded-complex-element-type '@i{type-specifier2})}. ++Two disjoint types can be upgraded into ++the same thing. ++ ++@subsubheading Examples:: ++@example ++ (complex 0) @result{} 0 ++ (complex 0.0) @result{} #C(0.0 0.0) ++ (complex 1 1/2) @result{} #C(1 1/2) ++ (complex 1 .99) @result{} #C(1.0 0.99) ++ (complex 3/2 0.0) @result{} #C(1.5 0.0) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{realpart} ++, @b{imagpart} ++ ++@subsubheading Notes:: ++ ++@example ++ #c(a b) @equiv{} #.(complex a b) ++@end example ++ ++@node complexp, conjugate, complex, Numbers Dictionary ++@subsection complexp [Function] ++ ++@code{complexp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{complex}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (complexp 1.2d2) @result{} @i{false} ++ (complexp #c(5/3 7.2)) @result{} @i{true} ++ ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{complex} ++ (@i{function} and @i{type}), ++@ref{typep} ++ ++@subsubheading Notes:: ++ ++@example ++ (complexp @i{object}) @equiv{} (typep @i{object} 'complex) ++@end example ++ ++@node conjugate, phase, complexp, Numbers Dictionary ++@subsection conjugate [Function] ++ ++@code{conjugate} @i{number} @result{} @i{conjugate} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{conjugate}---a @i{number}. ++ ++@subsubheading Description:: ++ ++Returns the complex conjugate of @i{number}. ++The conjugate of a ++ ++@i{real} ++ ++number is itself. ++ ++@subsubheading Examples:: ++ ++@example ++ (conjugate #c(0 -1)) @result{} #C(0 1) ++ (conjugate #c(1 1)) @result{} #C(1 -1) ++ (conjugate 1.5) @result{} 1.5 ++ (conjugate #C(3/5 4/5)) @result{} #C(3/5 -4/5) ++ (conjugate #C(0.0D0 -1.0D0)) @result{} #C(0.0D0 1.0D0) ++ (conjugate 3.7) @result{} 3.7 ++@end example ++ ++@subsubheading Notes:: ++ ++For a @i{complex} number @t{z}, ++ ++@example ++ (conjugate z) @equiv{} (complex (realpart z) (- (imagpart z))) ++@end example ++ ++@node phase, realpart, conjugate, Numbers Dictionary ++@subsection phase [Function] ++ ++@code{phase} @i{number} @result{} @i{phase} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{phase}---a @i{number}. ++ ++@subsubheading Description:: ++ ++@b{phase} ++returns the phase ++of @i{number} (the angle part of its polar representation) ++in radians, in the range ++ ++-\pi (exclusive) if minus zero is not supported, or ++-\pi (inclusive) if minus zero is supported, ++ ++to \pi (inclusive). The phase of a positive ++ ++@i{real} ++ ++number ++is zero; that of a negative ++ ++@i{real} ++ ++number is \pi. ++The phase of zero is defined to be zero. ++ ++If @i{number} is a @i{complex float}, ++the result is a @i{float} of the same @i{type} ++as the components of @i{number}. ++If @i{number} is a @i{float}, the result is a ++@i{float} of the same @i{type}. ++If @i{number} is a @i{rational} or a @i{complex rational}, ++the result is a @i{single float}. ++ ++The branch cut for @b{phase} lies along the negative real ++axis, continuous with quadrant II. The range consists of that portion of ++the real axis between -\pi (exclusive) and~\pi (inclusive). ++ ++The mathematical definition of @b{phase} is as follows: ++ ++@t{(phase @i{x}) = (atan (imagpart @i{x}) (realpart @i{x}))} ++ ++@subsubheading Examples:: ++ ++@example ++ (phase 1) @result{} 0.0s0 ++ (phase 0) @result{} 0.0s0 ++ (phase (cis 30)) @result{} -1.4159266 ++ (phase #c(0 1)) @result{} 1.5707964 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its argument is not a @i{number}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading See Also:: ++ ++@ref{Rule of Float Substitutability} ++ ++@node realpart, upgraded-complex-part-type, phase, Numbers Dictionary ++@subsection realpart, imagpart [Function] ++ ++@code{realpart} @i{number} @result{} @i{real} ++ ++@code{imagpart} @i{number} @result{} @i{real} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{number}. ++ ++@i{real}---a @i{real}. ++ ++@subsubheading Description:: ++ ++@b{realpart} and @b{imagpart} return the real and ++imaginary parts of @i{number} respectively. ++If @i{number} is ++ ++@i{real}, ++ ++then @b{realpart} returns @i{number} and @b{imagpart} ++returns @t{(* 0 @i{number})}, which has the effect that the ++imaginary part of a @i{rational} is @t{0} and that of ++a @i{float} is a floating-point zero of the same format. ++ ++@subsubheading Examples:: ++ ++@example ++ (realpart #c(23 41)) @result{} 23 ++ (imagpart #c(23 41.0)) @result{} 41.0 ++ (realpart #c(23 41.0)) @result{} 23.0 ++ (imagpart 23.0) @result{} 0.0 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{number} is not a @i{number}. ++ ++@subsubheading See Also:: ++ ++@ref{complex} ++ ++@node upgraded-complex-part-type, realp, realpart, Numbers Dictionary ++@subsection upgraded-complex-part-type [Function] ++ ++@code{upgraded-complex-part-type} @i{typespec @r{&optional} environment} @result{} @i{upgraded-typespec} ++ ++@subsubheading Arguments and Values:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ The default is @b{nil}, denoting the @i{null lexical environment} ++ and the and current @i{global environment}. ++ ++@i{upgraded-typespec}---a @i{type specifier}. ++ ++@subsubheading Description:: ++ ++@b{upgraded-complex-part-type} returns the part type of the ++most specialized @i{complex} number representation that can ++hold parts of @i{type} @i{typespec}. ++ ++The @i{typespec} is a @i{subtype} of ++(and possibly @i{type equivalent} to) ++the @i{upgraded-typespec}. ++ ++The purpose of @b{upgraded-complex-part-type} ++is to reveal how an implementation does its @i{upgrading}. ++ ++@subsubheading See Also:: ++ ++@ref{complex} ++ (@i{function} and @i{type}) ++ ++@subsubheading Notes:: ++ ++@node realp, numerator, upgraded-complex-part-type, Numbers Dictionary ++@subsection realp [Function] ++ ++@code{realp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{real}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (realp 12) @result{} @i{true} ++ (realp #c(5/3 7.2)) @result{} @i{false} ++ (realp nil) @result{} @i{false} ++ (realp (cons 1 2)) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (realp @i{object}) @equiv{} (typep @i{object} 'real) ++@end example ++ ++@node numerator, rational (Function), realp, Numbers Dictionary ++@subsection numerator, denominator [Function] ++ ++@code{numerator} @i{rational} @result{} @i{numerator} ++ ++@code{denominator} @i{rational} @result{} @i{denominator} ++ ++@subsubheading Arguments and Values:: ++ ++@i{rational}---a @i{rational}. ++ ++@i{numerator}---an @i{integer}. ++ ++@i{denominator}---a positive @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{numerator} and @b{denominator} reduce @i{rational} ++to canonical form and compute the numerator or denominator of that number. ++ ++@b{numerator} and @b{denominator} return the numerator ++or denominator of the canonical form of @i{rational}. ++ ++If @i{rational} is an @i{integer}, ++@b{numerator} returns @i{rational} ++and @b{denominator} returns 1. ++ ++@subsubheading Examples:: ++@example ++ (numerator 1/2) @result{} 1 ++ (denominator 12/36) @result{} 3 ++ (numerator -1) @result{} -1 ++ (denominator (/ -33)) @result{} 33 ++ (numerator (/ 8 -6)) @result{} -4 ++ (denominator (/ 8 -6)) @result{} 3 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{/} ++ ++@subsubheading Notes:: ++@example ++ (gcd (numerator x) (denominator x)) @result{} 1 ++@end example ++ ++@node rational (Function), rationalp, numerator, Numbers Dictionary ++@subsection rational, rationalize [Function] ++ ++@code{rational} @i{number} @result{} @i{rational} ++ ++@code{rationalize} @i{number} @result{} @i{rational} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{real}. ++ ++@i{rational}---a @i{rational}. ++ ++@subsubheading Description:: ++ ++@b{rational} and @b{rationalize} convert ++ ++@i{reals} ++ ++to @i{rationals}. ++ ++If @i{number} is already @i{rational}, it is returned. ++ ++If @i{number} is a @i{float}, ++@b{rational} returns a @i{rational} ++that is mathematically equal in value to the @i{float}. ++@b{rationalize} returns a @i{rational} that ++approximates the @i{float} to the accuracy of ++the underlying floating-point representation. ++ ++@b{rational} assumes that the @i{float} is completely accurate. ++ ++@b{rationalize} assumes that the ++@i{float} is accurate only to the precision of the ++floating-point representation. ++ ++@subsubheading Examples:: ++@example ++ (rational 0) @result{} 0 ++ (rationalize -11/100) @result{} -11/100 ++ (rational .1) @result{} 13421773/134217728 ;implementation-dependent ++ (rationalize .1) @result{} 1/10 ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{number} is not a @i{real}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading Notes:: ++ ++It is always the case that ++ ++@example ++ (float (rational x) x) @equiv{} x ++@end example ++ ++and ++ ++@example ++ (float (rationalize x) x) @equiv{} x ++@end example ++ ++That is, rationalizing a @i{float} by either method ++and then converting it back ++to a @i{float} ++of the same format produces the original @i{number}. ++ ++@node rationalp, ash, rational (Function), Numbers Dictionary ++@subsection rationalp [Function] ++ ++@code{rationalp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{rational}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (rationalp 12) @result{} @i{true} ++ (rationalp 6/5) @result{} @i{true} ++ (rationalp 1.212) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{rational (Function)} ++ ++@subsubheading Notes:: ++@example ++ (rationalp @i{object}) @equiv{} (typep @i{object} 'rational) ++@end example ++ ++@node ash, integer-length, rationalp, Numbers Dictionary ++@subsection ash [Function] ++ ++@code{ash} @i{integer count} @result{} @i{shifted-integer} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer}---an @i{integer}. ++ ++@i{count}---an @i{integer}. ++ ++@i{shifted-integer}---an @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{ash} performs the arithmetic shift operation on the binary ++representation of @i{integer}, which is treated as if it were binary. ++ ++@b{ash} shifts @i{integer} arithmetically left by @i{count} bit ++positions if @i{count} is positive, ++or right @i{count} bit positions if @i{count} is negative. ++The shifted value of the same sign ++as @i{integer} is returned. ++ ++Mathematically speaking, @b{ash} performs the computation ++@t{floor}(@i{integer}\cdot 2^@i{count}). ++Logically, @b{ash} ++moves all of the bits in @i{integer} to the left, ++adding zero-bits at the right, or moves them to the right, ++discarding bits. ++ ++@b{ash} is defined to behave as if @i{integer} were ++represented in two's complement form, regardless of ++how @i{integers} are represented internally. ++@subsubheading Examples:: ++@example ++ (ash 16 1) @result{} 32 ++ (ash 16 0) @result{} 16 ++ (ash 16 -1) @result{} 8 ++ (ash -100000000000000000000000000000000 -100) @result{} -79 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{integer} is not an @i{integer}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{count} is not an @i{integer}. ++Might signal @b{arithmetic-error}. ++ ++@subsubheading Notes:: ++ ++@example ++ (logbitp @i{j} (ash @i{n} @i{k})) ++ @equiv{} (and (>= @i{j} @i{k}) (logbitp (- @i{j} @i{k}) @i{n})) ++@end example ++ ++@node integer-length, integerp, ash, Numbers Dictionary ++@subsection integer-length [Function] ++ ++@code{integer-length} @i{integer} @result{} @i{number-of-bits} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer}---an @i{integer}. ++ ++@i{number-of-bits}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the number of bits needed to represent @i{integer} ++in binary two's-complement format. ++ ++@subsubheading Examples:: ++ ++@example ++ (integer-length 0) @result{} 0 ++ (integer-length 1) @result{} 1 ++ (integer-length 3) @result{} 2 ++ (integer-length 4) @result{} 3 ++ (integer-length 7) @result{} 3 ++ (integer-length -1) @result{} 0 ++ (integer-length -4) @result{} 2 ++ (integer-length -7) @result{} 3 ++ (integer-length -8) @result{} 3 ++ (integer-length (expt 2 9)) @result{} 10 ++ (integer-length (1- (expt 2 9))) @result{} 9 ++ (integer-length (- (expt 2 9))) @result{} 9 ++ (integer-length (- (1+ (expt 2 9)))) @result{} 10 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{integer} is not an @i{integer}. ++ ++@subsubheading Notes:: ++ ++This function could have been defined by: ++ ++@example ++(defun integer-length (integer) ++ (ceiling (log (if (minusp integer) ++ (- integer) ++ (1+ integer)) ++ 2))) ++@end example ++ ++If @i{integer} is non-negative, then its value can be represented ++in unsigned binary form in a field whose width in bits is ++no smaller than @t{(integer-length @i{integer})}. ++Regardless of the sign of @i{integer}, its value can be ++represented in signed binary two's-complement form in a field ++whose width in bits is no smaller than @t{(+ (integer-length @i{integer}) 1)}. ++ ++@node integerp, parse-integer, integer-length, Numbers Dictionary ++@subsection integerp [Function] ++ ++@code{integerp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{integer}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (integerp 1) @result{} @i{true} ++ (integerp (expt 2 130)) @result{} @i{true} ++ (integerp 6/5) @result{} @i{false} ++ (integerp nil) @result{} @i{false} ++ ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (integerp @i{object}) @equiv{} (typep @i{object} 'integer) ++@end example ++ ++@node parse-integer, boole, integerp, Numbers Dictionary ++@subsection parse-integer [Function] ++ ++@code{parse-integer} @i{string @r{&key} start end radix junk-allowed} @result{} @i{integer, pos} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{string}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{radix}---a @i{radix}. ++ The default is @t{10}. ++ ++@i{junk-allowed}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{integer}---an @i{integer} or @i{false}. ++ ++@i{pos}---a @i{bounding index} of @i{string}. ++ ++@subsubheading Description:: ++ ++@b{parse-integer} parses an @i{integer} in the specified @i{radix} ++from the substring of @i{string} delimited by @i{start} and @i{end}. ++ ++@b{parse-integer} expects an optional sign (@t{+} or @t{-}) followed by ++a a non-empty sequence of digits to be interpreted in the specified @i{radix}. ++Optional leading and trailing @i{whitespace}_1 is ignored. ++ ++@b{parse-integer} does not recognize the syntactic radix-specifier ++prefixes @t{#O}, @t{#B}, @t{#X}, and @t{#@i{n}R}, ++nor does it recognize a trailing decimal point. ++ ++If @i{junk-allowed} is @i{false}, an error of @i{type} @b{parse-error} is ++signaled if substring does not consist entirely of the representation of a ++signed @i{integer}, possibly surrounded on either side by @i{whitespace}_1 ++@i{characters}. ++ ++The first @i{value} returned is either ++ the @i{integer} that was parsed, ++ or else @b{nil} if no syntactically correct @i{integer} ++ was seen but @i{junk-allowed} was @i{true}. ++ ++The second @i{value} is either ++ the index into the @i{string} of the delimiter that terminated the parse, ++ or the upper @i{bounding index} of the substring if the parse terminated at ++ the end of the substring (as is always the case if @i{junk-allowed} ++ is @i{false}). ++ ++@subsubheading Examples:: ++@example ++ (parse-integer "123") @result{} 123, 3 ++ (parse-integer "123" :start 1 :radix 5) @result{} 13, 3 ++ (parse-integer "no-integer" :junk-allowed t) @result{} NIL, 0 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{junk-allowed} is @i{false}, ++an error is signaled if substring does not consist entirely of ++the representation of an @i{integer}, ++possibly surrounded on either side by ++@i{whitespace}_1 characters. ++ ++@node boole, boole-1, parse-integer, Numbers Dictionary ++@subsection boole [Function] ++ ++@code{boole} @i{op integer-1 integer-2} @result{} @i{result-integer} ++ ++@subsubheading Arguments and Values:: ++ ++@i{Op}---a @i{bit-wise logical operation specifier}. ++ ++@i{integer-1}---an @i{integer}. ++ ++@i{integer-2}---an @i{integer}. ++ ++@i{result-integer}---an @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{boole} performs bit-wise logical operations on ++@i{integer-1} and @i{integer-2}, which are treated as if ++they were binary and in two's complement representation. ++ ++The operation to be performed and the return value are determined by ++@i{op}. ++ ++@b{boole} returns the values ++specified for any @i{op} in Figure 12--16. ++ ++ ++ ++@format ++@group ++@noindent ++@w{ Op Result } ++@w{ @b{boole-1} @i{integer-1} } ++@w{ @b{boole-2} @i{integer-2} } ++@w{ @b{boole-andc1} and complement of @i{integer-1} with @i{integer-2} } ++@w{ @b{boole-andc2} and @i{integer-1} with complement of @i{integer-2} } ++@w{ @b{boole-and} and } ++@w{ @b{boole-c1} complement of @i{integer-1} } ++@w{ @b{boole-c2} complement of @i{integer-2} } ++@w{ @b{boole-clr} always 0 (all zero bits) } ++@w{ @b{boole-eqv} equivalence (exclusive nor) } ++@w{ @b{boole-ior} inclusive or } ++@w{ @b{boole-nand} not-and } ++@w{ @b{boole-nor} not-or } ++@w{ @b{boole-orc1} or complement of @i{integer-1} with @i{integer-2} } ++@w{ @b{boole-orc2} or @i{integer-1} with complement of @i{integer-2} } ++@w{ @b{boole-set} always -1 (all one bits) } ++@w{ @b{boole-xor} exclusive or } ++ ++@noindent ++@w{ Figure 12--16: Bit-Wise Logical Operations } ++ ++@end group ++@end format ++ ++ ++ ++@subsubheading Examples:: ++ ++@example ++ (boole boole-ior 1 16) @result{} 17 ++ (boole boole-and -2 5) @result{} 4 ++ (boole boole-eqv 17 15) @result{} -31 ++ ++;;; These examples illustrate the result of applying BOOLE and each ++;;; of the possible values of OP to each possible combination of bits. ++ (progn ++ (format t "~&Results of (BOOLE #b0011 #b0101) ...~ ++ ~ ++ (dolist (symbol '(boole-1 boole-2 boole-and boole-andc1 ++ boole-andc2 boole-c1 boole-c2 boole-clr ++ boole-eqv boole-ior boole-nand boole-nor ++ boole-orc1 boole-orc2 boole-set boole-xor)) ++ (let ((result (boole (symbol-value symbol) #b0011 #b0101))) ++ (format t "~& ~A~13T~3,' D~23T~:*~5,' B~31T ...~4,'0B~ ++ symbol result (logand result #b1111))))) ++@t{ |> } Results of (BOOLE #b0011 #b0101) ... ++@t{ |> } ---Op-------Decimal-----Binary----Bits--- ++@t{ |> } BOOLE-1 3 11 ...0011 ++@t{ |> } BOOLE-2 5 101 ...0101 ++@t{ |> } BOOLE-AND 1 1 ...0001 ++@t{ |> } BOOLE-ANDC1 4 100 ...0100 ++@t{ |> } BOOLE-ANDC2 2 10 ...0010 ++@t{ |> } BOOLE-C1 -4 -100 ...1100 ++@t{ |> } BOOLE-C2 -6 -110 ...1010 ++@t{ |> } BOOLE-CLR 0 0 ...0000 ++@t{ |> } BOOLE-EQV -7 -111 ...1001 ++@t{ |> } BOOLE-IOR 7 111 ...0111 ++@t{ |> } BOOLE-NAND -2 -10 ...1110 ++@t{ |> } BOOLE-NOR -8 -1000 ...1000 ++@t{ |> } BOOLE-ORC1 -3 -11 ...1101 ++@t{ |> } BOOLE-ORC2 -5 -101 ...1011 ++@t{ |> } BOOLE-SET -1 -1 ...1111 ++@t{ |> } BOOLE-XOR 6 110 ...0110 ++@result{} NIL ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its first argument is not a ++@i{bit-wise logical operation specifier} or if any subsequent argument is not ++an @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{logand} ++ ++@subsubheading Notes:: ++ ++In general, ++ ++@example ++ (boole boole-and x y) @equiv{} (logand x y) ++@end example ++ ++@i{Programmers} who would prefer to use numeric indices rather than ++@i{bit-wise logical operation specifiers} can get an equivalent effect ++by a technique such as the following: ++ ++@example ++;; The order of the values in this `table' are such that ++;; (logand (boole (elt boole-n-vector n) #b0101 #b0011) #b1111) => n ++ (defconstant boole-n-vector ++ (vector boole-clr boole-and boole-andc1 boole-2 ++ boole-andc2 boole-1 boole-xor boole-ior ++ boole-nor boole-eqv boole-c1 boole-orc1 ++ boole-c2 boole-orc2 boole-nand boole-set)) ++@result{} BOOLE-N-VECTOR ++ (proclaim '(inline boole-n)) ++@result{} @i{implementation-dependent} ++ (defun boole-n (n integer &rest more-integers) ++ (apply #'boole (elt boole-n-vector n) integer more-integers)) ++@result{} BOOLE-N ++ (boole-n #b0111 5 3) @result{} 7 ++ (boole-n #b0001 5 3) @result{} 1 ++ (boole-n #b1101 5 3) @result{} -3 ++ (loop for n from #b0000 to #b1111 collect (boole-n n 5 3)) ++@result{} (0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1) ++@end example ++ ++@node boole-1, logand, boole, Numbers Dictionary ++@subsection boole-1, boole-2, boole-and, boole-andc1, boole-andc2, ++@subheading boole-c1, boole-c2, boole-clr, boole-eqv, boole-ior, ++@subheading boole-nand, boole-nor, boole-orc1, boole-orc2, boole-set, ++@subheading boole-xor ++@flushright ++@i{[Constant Variable]} ++@end flushright ++ ++@subsubheading Constant Value:: ++ ++The identity and nature of the @i{values} of each of these @i{variables} ++is @i{implementation-dependent}, ++except that it must be @i{distinct} from each of the @i{values} of the others, ++and it must be a valid first @i{argument} to the @i{function} @b{boole}. ++ ++@subsubheading Description:: ++ ++Each of these @i{constants} has a @i{value} which is one of the ++sixteen possible @i{bit-wise logical operation specifiers}. ++ ++@subsubheading Examples:: ++@example ++ (boole boole-ior 1 16) @result{} 17 ++ (boole boole-and -2 5) @result{} 4 ++ (boole boole-eqv 17 15) @result{} -31 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{boole} ++ ++@node logand, logbitp, boole-1, Numbers Dictionary ++@subsection logand, logandc1, logandc2, logeqv, logior, ++@subheading lognand, lognor, lognot, logorc1, logorc2, ++@subheading logxor ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{logand} @i{@r{&rest} integers} @result{} @i{result-integer} ++ ++@code{logandc} @i{1} @result{} @i{integer-1 integer-2} ++ @r{result-integer} ++@code{logandc} @i{2} @result{} @i{integer-1 integer-2} ++ @r{result-integer} ++@code{logeqv} @i{@r{&rest} integers} @result{} @i{result-integer} ++ ++@code{logior} @i{@r{&rest} integers} @result{} @i{result-integer} ++ ++@code{lognand} @i{integer-1 integer-2} @result{} @i{result-integer} ++ ++@code{lognor} @i{integer-1 integer-2} @result{} @i{result-integer} ++ ++@code{lognot} @i{integer} @result{} @i{result-integer} ++ ++@code{logorc} @i{1} @result{} @i{integer-1 integer-2} ++ @r{result-integer} ++@code{logorc} @i{2} @result{} @i{integer-1 integer-2} ++ @r{result-integer} ++@code{logxor} @i{@r{&rest} integers} @result{} @i{result-integer} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integers}---@i{integers}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{integer-1}---an @i{integer}. ++ ++@i{integer-2}---an @i{integer}. ++ ++@i{result-integer}---an @i{integer}. ++ ++@subsubheading Description:: ++ ++The @i{functions} ++ @b{logandc1}, ++ @b{logandc2}, ++ @b{logand}, ++ @b{logeqv}, ++ @b{logior}, ++ @b{lognand}, ++ @b{lognor}, ++ @b{lognot}, ++ @b{logorc1}, ++ @b{logorc2}, ++ and @b{logxor} ++perform bit-wise logical operations on their @i{arguments}, ++that are treated as if they were binary. ++ ++Figure 12--17 lists the meaning of each of the @i{functions}. ++Where an `identity' is shown, it indicates the @i{value} @i{yielded} ++by the @i{function} when no @i{arguments} are supplied. ++ ++@format ++@group ++@noindent ++@w{ Function Identity Operation performed } ++@w{ @b{logandc1} --- and complement of @i{integer-1} with @i{integer-2} } ++@w{ @b{logandc2} --- and @i{integer-1} with complement of @i{integer-2} } ++@w{ @b{logand} @t{-1} and } ++@w{ @b{logeqv} @t{-1} equivalence (exclusive nor) } ++@w{ @b{logior} @t{0} inclusive or } ++@w{ @b{lognand} --- complement of @i{integer-1} and @i{integer-2} } ++@w{ @b{lognor} --- complement of @i{integer-1} or @i{integer-2} } ++@w{ @b{lognot} --- complement } ++@w{ @b{logorc1} --- or complement of @i{integer-1} with @i{integer-2} } ++@w{ @b{logorc2} --- or @i{integer-1} with complement of @i{integer-2} } ++@w{ @b{logxor} @t{0} exclusive or } ++ ++@noindent ++@w{ Figure 12--17: Bit-wise Logical Operations on Integers } ++ ++@end group ++@end format ++ ++Negative @i{integers} are treated as if they were in two's-complement notation. ++ ++@subsubheading Examples:: ++ ++@example ++ (logior 1 2 4 8) @result{} 15 ++ (logxor 1 3 7 15) @result{} 10 ++ (logeqv) @result{} -1 ++ (logand 16 31) @result{} 16 ++ (lognot 0) @result{} -1 ++ (lognot 1) @result{} -2 ++ (lognot -1) @result{} 0 ++ (lognot (1+ (lognot 1000))) @result{} 999 ++ ++;;; In the following example, m is a mask. For each bit in ++;;; the mask that is a 1, the corresponding bits in x and y are ++;;; exchanged. For each bit in the mask that is a 0, the ++;;; corresponding bits of x and y are left unchanged. ++ (flet ((show (m x y) ++ (format t "~ ++ m x y))) ++ (let ((m #o007750) ++ (x #o452576) ++ (y #o317407)) ++ (show m x y) ++ (let ((z (logand (logxor x y) m))) ++ (setq x (logxor z x)) ++ (setq y (logxor z y)) ++ (show m x y)))) ++@t{ |> } m = #o007750 ++@t{ |> } x = #o452576 ++@t{ |> } y = #o317407 ++@t{ |> } ++@t{ |> } m = #o007750 ++@t{ |> } x = #o457426 ++@t{ |> } y = #o312557 ++@result{} NIL ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if any argument is not an @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{boole} ++ ++@subsubheading Notes:: ++ ++@t{(logbitp @i{k} -1)} returns @i{true} for all values of @i{k}. ++ ++Because the following functions are not associative, ++they take exactly two arguments rather than any number ++of arguments. ++ ++@example ++ (lognand @i{n1} @i{n2}) @equiv{} (lognot (logand @i{n1} @i{n2})) ++ (lognor @i{n1} @i{n2}) @equiv{} (lognot (logior @i{n1} @i{n2})) ++ (logandc1 @i{n1} @i{n2}) @equiv{} (logand (lognot @i{n1}) @i{n2}) ++ (logandc2 @i{n1} @i{n2}) @equiv{} (logand @i{n1} (lognot @i{n2})) ++ (logiorc1 @i{n1} @i{n2}) @equiv{} (logior (lognot @i{n1}) @i{n2}) ++ (logiorc2 @i{n1} @i{n2}) @equiv{} (logior @i{n1} (lognot @i{n2})) ++ (logbitp @i{j} (lognot @i{x})) @equiv{} (not (logbitp @i{j} @i{x})) ++@end example ++ ++@node logbitp, logcount, logand, Numbers Dictionary ++@subsection logbitp [Function] ++ ++@code{logbitp} @i{index integer} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{index}---a non-negative @i{integer}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{logbitp} is used to test the value of a particular bit ++in @i{integer}, that is treated as if it were binary. ++The value of @b{logbitp} is @i{true} if the bit in @i{integer} ++whose index is @i{index} (that is, its weight is 2^@i{index}) ++is a one-bit; otherwise it is @i{false}. ++ ++Negative @i{integers} are treated as if they were in ++two's-complement notation. ++ ++@subsubheading Examples:: ++@example ++ (logbitp 1 1) @result{} @i{false} ++ (logbitp 0 1) @result{} @i{true} ++ (logbitp 3 10) @result{} @i{true} ++ (logbitp 1000000 -1) @result{} @i{true} ++ (logbitp 2 6) @result{} @i{true} ++ (logbitp 0 6) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{index} is not a non-negative @i{integer}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{integer} is not an @i{integer}. ++ ++@subsubheading Notes:: ++ ++@example ++ (logbitp @i{k} @i{n}) @equiv{} (ldb-test (byte 1 @i{k}) @i{n}) ++@end example ++ ++@node logcount, logtest, logbitp, Numbers Dictionary ++@subsection logcount [Function] ++ ++@code{logcount} @i{integer} @result{} @i{number-of-on-bits} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer}---an @i{integer}. ++ ++@i{number-of-on-bits}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Computes and returns the number of bits ++in the two's-complement binary representation of @i{integer} ++that are `on' or `set'. ++If @i{integer} is negative, the @t{0} bits are counted; ++otherwise, the @t{1} bits are counted. ++ ++@subsubheading Examples:: ++ ++@example ++ (logcount 0) @result{} 0 ++ (logcount -1) @result{} 0 ++ (logcount 7) @result{} 3 ++ (logcount 13) @result{} 3 ;Two's-complement binary: ...0001101 ++ (logcount -13) @result{} 2 ;Two's-complement binary: ...1110011 ++ (logcount 30) @result{} 4 ;Two's-complement binary: ...0011110 ++ (logcount -30) @result{} 4 ;Two's-complement binary: ...1100010 ++ (logcount (expt 2 100)) @result{} 1 ++ (logcount (- (expt 2 100))) @result{} 100 ++ (logcount (- (1+ (expt 2 100)))) @result{} 1 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its argument is not an @i{integer}. ++ ++@subsubheading Notes:: ++ ++Even if the @i{implementation} does not represent @i{integers} internally ++in two's complement binary, @b{logcount} behaves as if it did. ++ ++The following identity always holds: ++ ++@example ++ (logcount @i{x}) ++ @equiv{} (logcount (- (+ @i{x} 1))) ++ @equiv{} (logcount (lognot @i{x})) ++@end example ++ ++@node logtest, byte, logcount, Numbers Dictionary ++@subsection logtest [Function] ++ ++@code{logtest} @i{integer-1 integer-2} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{integer-1}---an @i{integer}. ++ ++@i{integer-2}---an @i{integer}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if any of the bits designated by the 1's ++in @i{integer-1} is 1 in @i{integer-2}; ++otherwise it is @i{false}. ++@i{integer-1} and @i{integer-2} are treated as if they were binary. ++ ++Negative @i{integer-1} and @i{integer-2} are treated as if ++they were represented in two's-complement binary. ++ ++@subsubheading Examples:: ++ ++@example ++ (logtest 1 7) @result{} @i{true} ++ (logtest 1 2) @result{} @i{false} ++ (logtest -2 -1) @result{} @i{true} ++ (logtest 0 -1) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{integer-1} is not an @i{integer}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{integer-2} is not an @i{integer}. ++ ++@subsubheading Notes:: ++ ++@example ++ (logtest @i{x} @i{y}) @equiv{} (not (zerop (logand @i{x} @i{y}))) ++@end example ++ ++@node byte, deposit-field, logtest, Numbers Dictionary ++@subsection byte, byte-size, byte-position [Function] ++ ++@code{byte} @i{size position} @result{} @i{bytespec} ++ ++@code{byte-size} @i{bytespec} @result{} @i{size} ++ ++@code{byte-position} @i{bytespec} @result{} @i{position} ++ ++@subsubheading Arguments and Values:: ++ ++@i{size}, @i{position}---a non-negative @i{integer}. ++ ++@i{bytespec}---a @i{byte specifier}. ++ ++@subsubheading Description:: ++ ++@b{byte} returns a @i{byte specifier} that indicates ++a @i{byte} of width @i{size} and whose bits have weights ++2^@i{@i{position} + @i{size} - 1\/} through 2^@i{position}, ++and whose representation is ++@i{implementation-dependent}. ++ ++@b{byte-size} returns the number of bits specified by @i{bytespec}. ++ ++@b{byte-position} returns the position specified by @i{bytespec}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq b (byte 100 200)) @result{} # ++ (byte-size b) @result{} 100 ++ (byte-position b) @result{} 200 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{ldb} ++, ++@ref{dpb} ++ ++@subsubheading Notes:: ++ ++@example ++ (byte-size (byte @i{j} @i{k})) @equiv{} @i{j} ++ (byte-position (byte @i{j} @i{k})) @equiv{} @i{k} ++@end example ++ ++A @i{byte} of @i{size} of @t{0} is permissible; ++it refers to a @i{byte} of width zero. For example, ++ ++@example ++ (ldb (byte 0 3) #o7777) @result{} 0 ++ (dpb #o7777 (byte 0 3) 0) @result{} 0 ++@end example ++ ++@node deposit-field, dpb, byte, Numbers Dictionary ++@subsection deposit-field [Function] ++ ++@code{deposit-field} @i{newbyte bytespec integer} @result{} @i{result-integer} ++ ++@subsubheading Arguments and Values:: ++ ++@i{newbyte}---an @i{integer}. ++ ++@i{bytespec}---a @i{byte specifier}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{result-integer}---an @i{integer}. ++ ++@subsubheading Description:: ++ ++Replaces a field of bits within @i{integer}; specifically, ++returns an @i{integer} that contains the bits of @i{newbyte} ++within the @i{byte} specified by @i{bytespec}, ++and elsewhere contains the bits of @i{integer}. ++ ++@subsubheading Examples:: ++ ++@example ++ (deposit-field 7 (byte 2 1) 0) @result{} 6 ++ (deposit-field -1 (byte 4 0) 0) @result{} 15 ++ (deposit-field 0 (byte 2 1) -3) @result{} -7 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{byte} ++, ++@ref{dpb} ++ ++@subsubheading Notes:: ++ ++@example ++ (logbitp @i{j} (deposit-field @i{m} (byte @i{s} @i{p}) @i{n})) ++ @equiv{} (if (and (>= @i{j} @i{p}) (< @i{j} (+ @i{p} @i{s}))) ++ (logbitp @i{j} @i{m}) ++ (logbitp @i{j} @i{n})) ++@end example ++ ++ @b{deposit-field} is to @b{mask-field} ++as @b{dpb} is to @b{ldb}. ++ ++@node dpb, ldb, deposit-field, Numbers Dictionary ++@subsection dpb [Function] ++ ++@code{dpb} @i{newbyte bytespec integer} @result{} @i{result-integer} ++ ++@subsubheading Pronunciation:: ++ ++ pronounced ,de 'pib ++ or pronounced ,de 'pe b ++ or pronounced 'd\=e 'p\=e 'b\=e ++ ++@subsubheading Arguments and Values:: ++ ++@i{newbyte}---an @i{integer}. ++ ++@i{bytespec}---a @i{byte specifier}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{result-integer}---an @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{dpb} (deposit byte) is used to ++replace a field of bits within @i{integer}. ++@b{dpb} returns an @i{integer} that is ++the same as @i{integer} except in the bits specified by @i{bytespec}. ++ ++Let @t{s} be the size specified ++by @i{bytespec}; then the low @t{s} bits of @i{newbyte} appear in ++the result in the byte specified by @i{bytespec}. ++@i{Newbyte} is interpreted as ++being right-justified, as if it were the result of @b{ldb}. ++ ++@subsubheading Examples:: ++ ++@example ++ (dpb 1 (byte 1 10) 0) @result{} 1024 ++ (dpb -2 (byte 2 10) 0) @result{} 2048 ++ (dpb 1 (byte 2 10) 2048) @result{} 1024 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{byte} ++, ++@ref{deposit-field} ++, ++@ref{ldb} ++ ++@subsubheading Notes:: ++ ++@example ++ (logbitp @i{j} (dpb @i{m} (byte @i{s} @i{p}) @i{n})) ++ @equiv{} (if (and (>= @i{j} @i{p}) (< @i{j} (+ @i{p} @i{s}))) ++ (logbitp (- @i{j} @i{p}) @i{m}) ++ (logbitp @i{j} @i{n})) ++@end example ++ ++In general, ++ ++@example ++ (dpb @i{x} (byte 0 @i{y}) @i{z}) @result{} @i{z} ++@end example ++ ++for all valid values of @i{x}, @i{y}, and @i{z}. ++ ++Historically, the name ``dpb'' comes from a DEC PDP-10 assembly language ++instruction meaning ``deposit byte.'' ++ ++@node ldb, ldb-test, dpb, Numbers Dictionary ++@subsection ldb [Accessor] ++ ++@code{ldb} @i{bytespec integer} @result{} @i{byte} ++ ++(setf (@code{ ldb} @i{bytespec place}) new-byte)@* ++ ++@subsubheading Pronunciation:: ++ ++ pronounced 'lid ib ++ or pronounced 'lid e b ++ or pronounced 'el 'd\=e 'b\=e ++ ++@subsubheading Arguments and Values:: ++ ++@i{bytespec}---a @i{byte specifier}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{byte}, @i{new-byte}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{ldb} extracts and returns the @i{byte} of @i{integer} ++specified by @i{bytespec}. ++ ++@b{ldb} returns an @i{integer} in which the bits with weights ++2^@i{(@i{s}-1)} through 2^0 are the same as those in ++@i{integer} with weights 2^@i{(@i{p}+@i{s}-1)} ++through 2^@i{p}, and all other bits zero; @i{s} is ++@t{(byte-size @i{bytespec})} ++and @i{p} is @t{(byte-position @i{bytespec})}. ++ ++@b{setf} may be used with @b{ldb} to modify ++a byte within the @i{integer} that is stored ++in a given @i{place}. ++ ++The order of evaluation, when an @b{ldb} form is supplied ++to @b{setf}, is exactly left-to-right. ++ ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++The effect is to perform a @b{dpb} operation ++and then store the result back into the @i{place}. ++ ++@subsubheading Examples:: ++ ++@example ++ (ldb (byte 2 1) 10) @result{} 1 ++ (setq a (list 8)) @result{} (8) ++ (setf (ldb (byte 2 1) (car a)) 1) @result{} 1 ++ a @result{} (10) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{byte} ++, ++@b{byte-position}, ++@b{byte-size}, ++@ref{dpb} ++ ++@subsubheading Notes:: ++ ++@example ++ (logbitp @i{j} (ldb (byte @i{s} @i{p}) @i{n})) ++ @equiv{} (and (< @i{j} @i{s}) (logbitp (+ @i{j} @i{p}) @i{n})) ++@end example ++ ++In general, ++ ++@example ++ (ldb (byte 0 @i{x}) @i{y}) @result{} 0 ++@end example ++ ++for all valid values of @i{x} and @i{y}. ++ ++Historically, the name ``ldb'' comes from a DEC PDP-10 assembly language ++instruction meaning ``load byte.'' ++ ++@node ldb-test, mask-field, ldb, Numbers Dictionary ++@subsection ldb-test [Function] ++ ++@code{ldb-test} @i{bytespec integer} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{bytespec}---a @i{byte specifier}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if any of the bits of the byte in @i{integer} ++specified by @i{bytespec} is non-zero; otherwise returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (ldb-test (byte 4 1) 16) @result{} @i{true} ++ (ldb-test (byte 3 1) 16) @result{} @i{false} ++ (ldb-test (byte 3 2) 16) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{byte} ++, ++@ref{ldb} ++, ++@ref{zerop} ++ ++@subsubheading Notes:: ++@example ++ (ldb-test bytespec n) @equiv{} ++ (not (zerop (ldb bytespec n))) @equiv{} ++ (logtest (ldb bytespec -1) n) ++@end example ++ ++@node mask-field, most-positive-fixnum, ldb-test, Numbers Dictionary ++@subsection mask-field [Accessor] ++ ++@code{mask-field} @i{bytespec integer} @result{} @i{masked-integer} ++ ++(setf (@code{ mask-field} @i{bytespec place}) new-masked-integer)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{bytespec}---a @i{byte specifier}. ++ ++@i{integer}---an @i{integer}. ++ ++@i{masked-integer}, @i{new-masked-integer}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{mask-field} performs a ``mask'' operation on @i{integer}. ++It returns an @i{integer} that has the same bits as @i{integer} in ++the @i{byte} specified by @i{bytespec}, but that has zero-bits everywhere else. ++ ++@b{setf} may be used with @b{mask-field} ++to modify a byte within the @i{integer} that is stored ++in a given @i{place}. ++The effect is to perform a @b{deposit-field} operation ++and then store the result back into the @i{place}. ++ ++@subsubheading Examples:: ++ ++@example ++ (mask-field (byte 1 5) -1) @result{} 32 ++ (setq a 15) @result{} 15 ++ (mask-field (byte 2 0) a) @result{} 3 ++ a @result{} 15 ++ (setf (mask-field (byte 2 0) a) 1) @result{} 1 ++ a @result{} 13 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{byte} ++, ++@ref{ldb} ++ ++@subsubheading Notes:: ++ ++@example ++ (ldb @i{bs} (mask-field @i{bs} @i{n})) @equiv{} (ldb @i{bs} @i{n}) ++ (logbitp @i{j} (mask-field (byte @i{s} @i{p}) @i{n})) ++ @equiv{} (and (>= @i{j} @i{p}) (< @i{j} @i{s}) (logbitp @i{j} @i{n})) ++ (mask-field @i{bs} @i{n}) @equiv{} (logand @i{n} (dpb -1 @i{bs} 0)) ++@end example ++ ++@node most-positive-fixnum, decode-float, mask-field, Numbers Dictionary ++@subsection most-positive-fixnum, most-negative-fixnum [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++@b{most-positive-fixnum} is that @i{fixnum} closest in value ++to positive infinity provided by the implementation, ++ ++and greater than or equal to both 2^@r{15} - 1 and ++@b{array-dimension-limit}. ++ ++@b{most-negative-fixnum} is that @i{fixnum} closest in value ++to negative infinity provided by the implementation, ++ ++and less than or equal to -2^@r{15}. ++ ++@node decode-float, float, most-positive-fixnum, Numbers Dictionary ++@subsection decode-float, scale-float, float-radix, float-sign, ++@subheading float-digits, float-precision, integer-decode-float ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{decode-float} @i{float} @result{} @i{significand, exponent, sign} ++ ++@code{scale-float} @i{float integer} @result{} @i{scaled-float} ++ ++@code{float-radix} @i{float} @result{} @i{float-radix} ++ ++@code{float-sign} @i{float-1 @r{&optional} float-2} @result{} @i{signed-float} ++ ++@code{float-digits} @i{float} @result{} @i{digits1} ++ ++@code{float-precision} @i{float} @result{} @i{digits2} ++ ++@code{integer-decode-float} @i{float} @result{} @i{significand, exponent, integer-sign} ++ ++@subsubheading Arguments and Values:: ++ ++@i{digits1}---a non-negative @i{integer}. ++ ++@i{digits2}---a non-negative @i{integer}. ++ ++@i{exponent}---an @i{integer}. ++ ++@i{float}---a @i{float}. ++ ++@i{float-1}---a @i{float}. ++ ++@i{float-2}---a @i{float}. ++ ++@i{float-radix}---an @i{integer}. ++ ++@i{integer}---a non-negative @i{integer}. ++ ++@i{integer-sign}---the @i{integer} @t{-1}, ++ or the @i{integer} @t{1}. ++ ++@i{scaled-float}---a @i{float}. ++ ++@i{sign}---A @i{float} of the same @i{type} as @i{float} ++ but numerically equal to @t{1.0} or @t{-1.0}. ++ ++@i{signed-float}---a @i{float}. ++ ++@i{significand}---a @i{float}. ++ ++@subsubheading Description:: ++ ++@b{decode-float} computes three values that characterize ++@i{float}. ++The first value is of the same @i{type} ++as @i{float} and ++represents the significand. ++The second value represents the exponent ++to which the radix (notated in this description by @i{b}) must ++be raised to obtain the value that, when multiplied with the first ++result, produces the absolute value of @i{float}. ++If @i{float} is zero, any @i{integer} value may be returned, ++provided that the identity shown for @b{scale-float} holds. ++The third value ++is of the same @i{type} as @i{float} ++and is 1.0 if @i{float} is greater ++than or equal to zero or -1.0 otherwise. ++ ++@b{decode-float} ++divides @i{float} by an integral power of @i{b} ++so as to bring its value between 1/@i{b} (inclusive) and~1 (exclusive), ++and returns the quotient as the first value. ++If @i{float} is zero, however, the result ++equals the absolute value of @i{float} (that is, if there is a negative ++zero, its significand is considered to be a positive zero). ++ ++@b{scale-float} returns ++@t{(* @i{float} (expt (float @i{b} @i{float}) ++@i{integer}))\/}, where @i{b} is the radix of the floating-point ++representation. @i{float} is not necessarily between 1/@i{b} and~1. ++ ++@b{float-radix} returns ++the radix of @i{float}. ++ ++@b{float-sign} returns a number @t{z} such ++that @t{z} and @i{float-1} have the same sign and also such that ++@t{z} and @i{float-2} have the same absolute value. ++If @i{float-2} is not supplied, its value is @t{(float 1 @i{float-1})}. ++If an implementation ++has distinct representations for negative zero and positive zero, ++then @t{(float-sign -0.0)} @result{} @t{-1.0}. ++ ++@b{float-digits} returns ++the number of radix @i{b} digits ++used in the representation of @i{float} (including any implicit ++digits, such as a ``hidden bit''). ++ ++@b{float-precision} ++returns ++the number of significant radix @i{b} digits present in @i{float}; ++if @i{float} is a @i{float} ++zero, then the result is an @i{integer} zero. ++ ++For @i{normalized} @i{floats}, ++the results of @b{float-digits} and @b{float-precision} are the same, ++but the precision is less than the number of representation digits ++for a @i{denormalized} or zero number. ++ ++@b{integer-decode-float} computes three values that characterize ++@i{float} - ++the significand scaled so as to be an @i{integer}, ++and the same last two ++values that are returned by @b{decode-float}. ++If @i{float} is zero, @b{integer-decode-float} returns ++zero as the first value. ++The second value bears the same relationship to the first value ++as for @b{decode-float}: ++ ++@example ++ (multiple-value-bind (signif expon sign) ++ (integer-decode-float f) ++ (scale-float (float signif f) expon)) @equiv{} (abs f) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ ;; Note that since the purpose of this functionality is to expose ++ ;; details of the implementation, all of these examples are necessarily ++ ;; very implementation-dependent. Results may vary widely. ++ ;; Values shown here are chosen consistently from one particular implementation. ++ (decode-float .5) @result{} 0.5, 0, 1.0 ++ (decode-float 1.0) @result{} 0.5, 1, 1.0 ++ (scale-float 1.0 1) @result{} 2.0 ++ (scale-float 10.01 -2) @result{} 2.5025 ++ (scale-float 23.0 0) @result{} 23.0 ++ (float-radix 1.0) @result{} 2 ++ (float-sign 5.0) @result{} 1.0 ++ (float-sign -5.0) @result{} -1.0 ++ (float-sign 0.0) @result{} 1.0 ++ (float-sign 1.0 0.0) @result{} 0.0 ++ (float-sign 1.0 -10.0) @result{} 10.0 ++ (float-sign -1.0 10.0) @result{} -10.0 ++ (float-digits 1.0) @result{} 24 ++ (float-precision 1.0) @result{} 24 ++ (float-precision least-positive-single-float) @result{} 1 ++ (integer-decode-float 1.0) @result{} 8388608, -23, 1 ++@end example ++ ++@subsubheading Affected By:: ++ ++The implementation's representation for @i{floats}. ++ ++@subsubheading Exceptional Situations:: ++ ++The functions @b{decode-float}, @b{float-radix}, @b{float-digits}, ++@b{float-precision}, and @b{integer-decode-float} should signal an error ++if their only argument is not a @i{float}. ++ ++The @i{function} @b{scale-float} should signal an error if its first argument ++is not a @i{float} or if its second argument is not an @i{integer}. ++ ++The @i{function} @b{float-sign} should signal an error if its first argument ++is not a @i{float} or if its second argument is supplied but is ++not a @i{float}. ++ ++@subsubheading Notes:: ++ ++The product of the first result of @b{decode-float} or @b{integer-decode-float}, ++of the radix raised to the power of the second result, and of the third result ++is exactly equal to the value of @i{float}. ++ ++@example ++ (multiple-value-bind (signif expon sign) ++ (decode-float f) ++ (scale-float signif expon)) ++@equiv{} (abs f) ++@end example ++ ++and ++ ++@example ++ (multiple-value-bind (signif expon sign) ++ (decode-float f) ++ (* (scale-float signif expon) sign)) ++@equiv{} f ++@end example ++ ++@node float, floatp, decode-float, Numbers Dictionary ++@subsection float [Function] ++ ++@code{float} @i{number @r{&optional} prototype} @result{} @i{float} ++ ++@subsubheading Arguments and Values:: ++ ++@i{number}---a @i{real}. ++ ++@i{prototype}---a @i{float}. ++ ++@i{float}---a @i{float}. ++ ++@subsubheading Description:: ++ ++@b{float} converts a ++ ++@i{real} ++ ++number to a @i{float}. ++ ++If a @i{prototype} is supplied, ++a @i{float} is returned that is mathematically equal to @i{number} ++but has the same format as @i{prototype}. ++ ++If @i{prototype} is not supplied, ++then if the @i{number} is already a @i{float}, it is returned; ++otherwise, a @i{float} is returned that is mathematically equal to @i{number} ++but is a @i{single float}. ++ ++@subsubheading Examples:: ++ ++@example ++ (float 0) @result{} 0.0 ++ (float 1 .5) @result{} 1.0 ++ (float 1.0) @result{} 1.0 ++ (float 1/2) @result{} 0.5 ++@result{} 1.0d0 ++@i{OR}@result{} 1.0 ++ (eql (float 1.0 1.0d0) 1.0d0) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{coerce} ++ ++@node floatp, most-positive-short-float, float, Numbers Dictionary ++@subsection floatp [Function] ++ ++@code{floatp} @i{object} ++ @r{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{float}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (floatp 1.2d2) @result{} @i{true} ++ (floatp 1.212) @result{} @i{true} ++ (floatp 1.2s2) @result{} @i{true} ++ (floatp (expt 2 130)) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (floatp @i{object}) @equiv{} (typep @i{object} 'float) ++@end example ++ ++@node most-positive-short-float, short-float-epsilon, floatp, Numbers Dictionary ++@subsection most-positive-short-float, least-positive-short-float, ++@subheading least-positive-normalized-short-float, ++@subheading most-positive-double-float, least-positive-double-float, ++@subheading least-positive-normalized-double-float, ++@subheading most-positive-long-float, least-positive-long-float, ++@subheading least-positive-normalized-long-float, ++@subheading most-positive-single-float, least-positive-single-float, ++@subheading least-positive-normalized-single-float, ++@subheading most-negative-short-float, least-negative-short-float, ++@subheading least-negative-normalized-short-float, ++@subheading most-negative-single-float, least-negative-single-float, ++@subheading least-negative-normalized-single-float, ++@subheading most-negative-double-float, least-negative-double-float, ++@subheading least-negative-normalized-double-float, ++@subheading most-negative-long-float, least-negative-long-float, ++@subheading least-negative-normalized-long-float ++@flushright ++@i{[Constant Variable]} ++@end flushright ++ ++@subsubheading Constant Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++These @i{constant variables} provide a way for programs to examine ++the @i{implementation-defined} limits for the various float formats. ++ ++Of these @i{variables}, ++ each which has ``@t{-normalized}'' in its @i{name} ++ must have a @i{value} which is a @i{normalized} @i{float}, and ++ each which does not have ``@t{-normalized}'' in its name ++ may have a @i{value} which is either a @i{normalized} @i{float} ++ or a @i{denormalized} @i{float}, as appropriate. ++ ++Of these @i{variables}, ++ each which has ``@t{short-float}'' in its name ++ must have a @i{value} which is a @i{short float}, ++ each which has ``@t{single-float}'' in its name ++ must have a @i{value} which is a @i{single float}, ++ each which has ``@t{double-float}'' in its name ++ must have a @i{value} which is a @i{double float}, and ++ each which has ``@t{long-float}'' in its name ++ must have a @i{value} which is a @i{long float}. ++ ++@table @asis ++ ++@item @t{*} ++@b{most-positive-short-float}, ++ @b{most-positive-single-float}, ++ @b{most-positive-double-float}, ++ @b{most-positive-long-float} ++ ++ Each of these @i{constant variables} has as its @i{value} ++ the positive @i{float} of the largest magnitude ++ (closest in value to, but not equal to, positive infinity) ++ for the float format implied by its name. ++ ++@item @t{*} ++@b{least-positive-short-float}, ++ @b{least-positive-normalized-short-float}, ++ @b{least-positive-single-float}, ++ @b{least-positive-normalized-single-float}, ++ @b{least-positive-double-float}, ++ @b{least-positive-normalized-double-float}, ++ @b{least-positive-long-float}, ++ @b{least-positive-normalized-long-float} ++ ++ Each of these @i{constant variables} has as its @i{value} ++ the smallest positive (nonzero) @i{float} ++ for the float format implied by its name. ++ ++@item @t{*} ++@b{least-negative-short-float}, ++ @b{least-negative-normalized-short-float}, ++ @b{least-negative-single-float}, ++ @b{least-negative-normalized-single-float}, ++ @b{least-negative-double-float}, ++ @b{least-negative-normalized-double-float}, ++ @b{least-negative-long-float}, ++ @b{least-negative-normalized-long-float} ++ ++ Each of these @i{constant variables} has as its @i{value} ++ the negative (nonzero) @i{float} of the smallest magnitude ++ for the float format implied by its name. ++ (If an implementation supports minus zero as a @i{different} ++ @i{object} from positive zero, this value must not be minus zero.) ++ ++@item @t{*} ++@b{most-negative-short-float}, ++ @b{most-negative-single-float}, ++ @b{most-negative-double-float}, ++ @b{most-negative-long-float} ++ ++ Each of these @i{constant variables} has as its @i{value} ++ the negative @i{float} of the largest magnitude ++ (closest in value to, but not equal to, negative infinity) ++ for the float format implied by its name. ++ ++@end table ++ ++@subsubheading Notes:: ++ ++@node short-float-epsilon, arithmetic-error, most-positive-short-float, Numbers Dictionary ++@subsection short-float-epsilon, short-float-negative-epsilon, ++@subheading single-float-epsilon, single-float-negative-epsilon, ++@subheading double-float-epsilon, double-float-negative-epsilon, ++@subheading long-float-epsilon, long-float-negative-epsilon ++@flushright ++@i{[Constant Variable]} ++@end flushright ++ ++@subsubheading Constant Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The value of each of the constants @b{short-float-epsilon}, ++@b{single-float-epsilon}, ++@b{double-float-epsilon}, and @b{long-float-epsilon} is ++the smallest positive @i{float} \epsilon of the given format, ++such that the following expression is @i{true} when evaluated: ++ ++@t{(not (= (float 1 \epsilon) (+ (float 1 \epsilon) \epsilon)))\/} ++ ++The value of each of the constants @b{short-float-negative-epsilon}, ++@b{single-float-negative-epsilon}, ++@b{double-float-negative-epsilon}, and ++@b{long-float-negative-epsilon} is the smallest positive ++@i{float} \epsilon of the given format, such that the following ++expression is @i{true} when evaluated: ++ ++@t{(not (= (float 1 \epsilon) (- (float 1 \epsilon) \epsilon)))\/} ++ ++@node arithmetic-error, arithmetic-error-operands, short-float-epsilon, Numbers Dictionary ++@subsection arithmetic-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{arithmetic-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{arithmetic-error} consists of error conditions ++that occur during arithmetic operations. ++The operation and operands are initialized with ++the initialization arguments named @t{:operation} and @t{:operands} to @b{make-condition}, ++and are @i{accessed} by ++the functions @b{arithmetic-error-operation} and ++@b{arithmetic-error-operands}. ++ ++@subsubheading See Also:: ++ ++@b{arithmetic-error-operation}, ++@ref{arithmetic-error-operands} ++ ++@node arithmetic-error-operands, division-by-zero, arithmetic-error, Numbers Dictionary ++@subsection arithmetic-error-operands, arithmetic-error-operation [Function] ++ ++@code{arithmetic-error-operands} @i{condition} @result{} @i{operands} ++ ++@code{arithmetic-error-operation} @i{condition} @result{} @i{operation} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{arithmetic-error}. ++ ++@i{operands}---a @i{list}. ++ ++@i{operation}---a @i{function designator}. ++ ++@subsubheading Description:: ++ ++@b{arithmetic-error-operands} returns a @i{list} of the operands ++which were used in the offending call to the operation that signaled ++the @i{condition}. ++ ++@b{arithmetic-error-operation} returns a @i{list} of ++the offending operation in the offending call that signaled the @i{condition}. ++ ++@subsubheading See Also:: ++ ++@b{arithmetic-error}, ++@ref{Conditions} ++ ++@subsubheading Notes:: ++ ++@node division-by-zero, floating-point-invalid-operation, arithmetic-error-operands, Numbers Dictionary ++@subsection division-by-zero [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{division-by-zero}, ++@b{arithmetic-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{division-by-zero} consists of error conditions that ++occur because of division by zero. ++ ++@node floating-point-invalid-operation, floating-point-inexact, division-by-zero, Numbers Dictionary ++@subsection floating-point-invalid-operation [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{floating-point-invalid-operation}, ++@b{arithmetic-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{floating-point-invalid-operation} consists of ++error conditions that occur because of certain ++floating point traps. ++ ++It is @i{implementation-dependent} whether floating point traps ++occur, and whether or how they may be enabled or disabled. Therefore, ++conforming code may establish handlers for this condition, but must not ++depend on its being @i{signaled}. ++ ++@node floating-point-inexact, floating-point-overflow, floating-point-invalid-operation, Numbers Dictionary ++@subsection floating-point-inexact [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{floating-point-inexact}, ++@b{arithmetic-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{floating-point-inexact} consists of ++error conditions that occur because of certain ++floating point traps. ++ ++It is @i{implementation-dependent} whether floating point traps ++occur, and whether or how they may be enabled or disabled. Therefore, ++conforming code may establish handlers for this condition, but must not ++depend on its being @i{signaled}. ++ ++@node floating-point-overflow, floating-point-underflow, floating-point-inexact, Numbers Dictionary ++@subsection floating-point-overflow [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{floating-point-overflow}, ++@b{arithmetic-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{floating-point-overflow} consists of error ++conditions that occur because of floating-point overflow. ++ ++@node floating-point-underflow, , floating-point-overflow, Numbers Dictionary ++@subsection floating-point-underflow [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{floating-point-underflow}, ++@b{arithmetic-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{floating-point-underflow} consists of ++error conditions that occur because of floating-point underflow. ++ ++@c end of including dict-numbers ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-13.texi +@@ -0,0 +1,1592 @@ ++ ++ ++@node Characters, Conses, Numbers (Numbers), Top ++@chapter Characters ++ ++@menu ++* Character Concepts:: ++* Characters Dictionary:: ++@end menu ++ ++@node Character Concepts, Characters Dictionary, Characters, Characters ++@section Character Concepts ++ ++@c including concept-characters ++ ++@menu ++* Introduction to Characters:: ++* Introduction to Scripts and Repertoires:: ++* Character Attributes:: ++* Character Categories:: ++* Identity of Characters:: ++* Ordering of Characters:: ++* Character Names:: ++* Treatment of Newline during Input and Output:: ++* Character Encodings:: ++* Documentation of Implementation-Defined Scripts:: ++@end menu ++ ++@node Introduction to Characters, Introduction to Scripts and Repertoires, Character Concepts, Character Concepts ++@subsection Introduction to Characters ++ ++A @i{character} ++@IGindex character ++ is an @i{object} that represents a unitary token ++(@i{e.g.}, a letter, a special symbol, or a ``control character'') ++in an aggregate quantity of text ++(@i{e.g.}, a @i{string} or a text @i{stream}). ++ ++@r{Common Lisp} allows an implementation to provide support ++for international language @i{characters} as well ++as @i{characters} used in specialized arenas (@i{e.g.}, mathematics). ++ ++The following figures contain lists of @i{defined names} applicable to ++@i{characters}. ++ ++Figure 13--1 lists some @i{defined names} relating to ++@i{character} @i{attributes} and @i{character} @i{predicates}. ++ ++@format ++@group ++@noindent ++@w{ alpha-char-p char-not-equal char> } ++@w{ alphanumericp char-not-greaterp char>= } ++@w{ both-case-p char-not-lessp digit-char-p } ++@w{ char-code-limit char/= graphic-char-p } ++@w{ char-equal char< lower-case-p } ++@w{ char-greaterp char<= standard-char-p } ++@w{ char-lessp char= upper-case-p } ++ ++@noindent ++@w{ Figure 13--1: Character defined names -- 1 } ++ ++@end group ++@end format ++ ++Figure 13--2 lists some @i{character} construction and conversion @i{defined names}. ++ ++@format ++@group ++@noindent ++@w{ char-code char-name code-char } ++@w{ char-downcase char-upcase digit-char } ++@w{ char-int character name-char } ++ ++@noindent ++@w{ Figure 13--2: Character defined names -- 2} ++ ++@end group ++@end format ++ ++@node Introduction to Scripts and Repertoires, Character Attributes, Introduction to Characters, Character Concepts ++@subsection Introduction to Scripts and Repertoires ++ ++@menu ++* Character Scripts:: ++* Character Repertoires:: ++@end menu ++ ++@node Character Scripts, Character Repertoires, Introduction to Scripts and Repertoires, Introduction to Scripts and Repertoires ++@subsubsection Character Scripts ++ ++A @i{script} is one of possibly several sets that form an @i{exhaustive partition} ++of the type @b{character}. ++ ++The number of such sets and boundaries between them is @i{implementation-defined}. ++@r{Common Lisp} does not require these sets to be @i{types}, but an @i{implementation} ++is permitted to define such @i{types} as an extension. Since no @i{character} ++from one @i{script} can ever be a member of another @i{script}, it is generally ++more useful to speak about @i{character} @i{repertoires}. ++ ++Although ++the term ``@i{script}'' is chosen for ++definitional ++compatibility with ISO terminology, no @i{conforming implementation} ++is required to use any particular @i{scripts} standardized by ISO ++or by any other standards organization. ++ ++Whether and how the @i{script} or @i{scripts} used by any given ++@i{implementation} are named is @i{implementation-dependent}. ++ ++@node Character Repertoires, , Character Scripts, Introduction to Scripts and Repertoires ++@subsubsection Character Repertoires ++ ++A @i{repertoire} ++@IGindex repertoire ++ is a @i{type specifier} for a @i{subtype} of @i{type} @b{character}. ++ ++This term is generally used when describing a collection of @i{characters} ++independent of their coding. ++@i{Characters} in @i{repertoires} are only identified ++ by name, ++ by @i{glyph}, or ++ by character description. ++ ++A @i{repertoire} can contain @i{characters} from several ++@i{scripts}, and a @i{character} can appear in more than ++one @i{repertoire}. ++ ++For some examples of @i{repertoires}, see the coded character standards ++ISO 8859/1, ISO 8859/2, and ISO 6937/2. ++Note, however, that although ++the term ``@i{repertoire}'' is chosen for ++definitional ++compatibility with ISO terminology, no @i{conforming implementation} ++is required to use @i{repertoires} standardized by ISO or any other ++standards organization. ++ ++@node Character Attributes, Character Categories, Introduction to Scripts and Repertoires, Character Concepts ++@subsection Character Attributes ++ ++@i{Characters} have only one @i{standardized} @i{attribute}: ++a @i{code}. A @i{character}'s @i{code} is a non-negative @i{integer}. ++This @i{code} is composed from a character @i{script} and a character label ++in an @i{implementation-dependent} way. See the @i{functions} @b{char-code} and @b{code-char}. ++ ++Additional, @i{implementation-defined} @i{attributes} of @i{characters} ++are also permitted ++so that, for example, ++two @i{characters} with the same @i{code} may differ ++in some other, @i{implementation-defined} way. ++ ++For any @i{implementation-defined} @i{attribute} ++there is a distinguished value ++called the @i{null} ++@IGindex null ++ value for that @i{attribute}. ++A @i{character} for which each @i{implementation-defined} @i{attribute} ++has the null value for that @i{attribute} is called a @i{simple} @i{character}. ++If the @i{implementation} has no @i{implementation-defined} @i{attributes}, ++then all @i{characters} are @i{simple} @i{characters}. ++ ++@node Character Categories, Identity of Characters, Character Attributes, Character Concepts ++@subsection Character Categories ++ ++There are several (overlapping) categories of @i{characters} that have no formally ++associated @i{type} but that are nevertheless useful to name. ++They include ++ @i{graphic} @i{characters}, ++ @i{alphabetic}_1 @i{characters}, ++ @i{characters} with @i{case} ++ (@i{uppercase} and @i{lowercase} @i{characters}), ++ @i{numeric} @i{characters}, ++ @i{alphanumeric} @i{characters}, ++ and @i{digits} (in a given @i{radix}). ++ ++For each @i{implementation-defined} @i{attribute} of a @i{character}, ++the documentation for that @i{implementation} must specify whether ++@i{characters} that differ only in that @i{attribute} are permitted to differ ++in whether are not they are members of one of the aforementioned categories. ++ ++Note that these terms are defined independently of any special syntax ++which might have been enabled in the @i{current readtable}. ++ ++@menu ++* Graphic Characters:: ++* Alphabetic Characters:: ++* Characters With Case:: ++* Uppercase Characters:: ++* Lowercase Characters:: ++* Corresponding Characters in the Other Case:: ++* Case of Implementation-Defined Characters:: ++* Numeric Characters:: ++* Alphanumeric Characters:: ++* Digits in a Radix:: ++@end menu ++ ++@node Graphic Characters, Alphabetic Characters, Character Categories, Character Categories ++@subsubsection Graphic Characters ++ ++@i{Characters} that are classified as @i{graphic} ++@IGindex graphic ++, or displayable, are each ++associated with a glyph, a visual representation of the @i{character}. ++ ++A @i{graphic} @i{character} is one that has a standard textual ++representation as a single @i{glyph}, such as @t{A} or @t{*} or @t{=}. ++@i{Space}, which effectively has a blank @i{glyph}, is defined ++to be a @i{graphic}. ++ ++Of the @i{standard characters}, ++ @i{newline} is @i{non-graphic} ++ and all others are @i{graphic}; see @ref{Standard Characters}. ++ ++@i{Characters} that are not @i{graphic} are called @i{non-graphic} ++@IGindex non-graphic ++. ++ ++@i{Non-graphic} @i{characters} are sometimes informally called ++ ``formatting characters'' ++ or ``control characters.'' ++ ++@t{#\Backspace}, ++@t{#\Tab}, ++@t{#\Rubout}, ++@t{#\Linefeed}, ++@t{#\Return}, and ++@t{#\Page}, ++if they are supported by the @i{implementation}, ++are @i{non-graphic}. ++ ++@node Alphabetic Characters, Characters With Case, Graphic Characters, Character Categories ++@subsubsection Alphabetic Characters ++ ++The @i{alphabetic}_1 @i{characters} are ++a subset of the @i{graphic} @i{characters}. ++Of the @i{standard characters}, only these are the @i{alphabetic}_1 @i{characters}: ++ ++@t{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} ++ ++@t{a b c d e f g h i j k l m n o p q r s t u v w x y z} ++ ++Any @i{implementation-defined} @i{character} that has @i{case} ++must be @i{alphabetic}_1. ++For each @i{implementation-defined} @i{graphic} @i{character} ++that has no @i{case}, ++it is @i{implementation-defined} whether ++that @i{character} is @i{alphabetic}_1. ++ ++@node Characters With Case, Uppercase Characters, Alphabetic Characters, Character Categories ++@subsubsection Characters With Case ++ ++The @i{characters} with @i{case} are ++a subset of the @i{alphabetic}_1 @i{characters}. ++A @i{character} with @i{case} has the property of being either ++@i{uppercase} or @i{lowercase}. ++Every @i{character} with @i{case} is in one-to-one correspondence ++with some other @i{character} with the opposite @i{case}. ++ ++@node Uppercase Characters, Lowercase Characters, Characters With Case, Character Categories ++@subsubsection Uppercase Characters ++ ++An uppercase @i{character} is one that has a corresponding ++@i{lowercase} @i{character} that is @i{different} ++(and can be obtained using @b{char-downcase}). ++ ++Of the @i{standard characters}, only these are @i{uppercase} @i{characters}: ++ ++@t{A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} ++ ++@node Lowercase Characters, Corresponding Characters in the Other Case, Uppercase Characters, Character Categories ++@subsubsection Lowercase Characters ++ ++A lowercase @i{character} is one that has a corresponding ++@i{uppercase} @i{character} that is @i{different} ++(and can be obtained using @b{char-upcase}). ++ ++Of the @i{standard characters}, only these are @i{lowercase} @i{characters}: ++ ++@t{a b c d e f g h i j k l m n o p q r s t u v w x y z} ++ ++@node Corresponding Characters in the Other Case, Case of Implementation-Defined Characters, Lowercase Characters, Character Categories ++@subsubsection Corresponding Characters in the Other Case ++ ++The @i{uppercase} @i{standard characters} @t{A} through @t{Z} mentioned above ++respectively correspond to ++the @i{lowercase} @i{standard characters} @t{a} through @t{z} mentioned above. ++For example, the @i{uppercase} @i{character} @t{E} ++corresponds to the @i{lowercase} @i{character} @t{e}, and vice versa. ++ ++@node Case of Implementation-Defined Characters, Numeric Characters, Corresponding Characters in the Other Case, Character Categories ++@subsubsection Case of Implementation-Defined Characters ++ ++An @i{implementation} may define that other @i{implementation-defined} ++@i{graphic} @i{characters} have @i{case}. Such definitions must always ++be done in pairs---one @i{uppercase} @i{character} in one-to-one ++@i{correspondence} with one @i{lowercase} @i{character}. ++ ++@node Numeric Characters, Alphanumeric Characters, Case of Implementation-Defined Characters, Character Categories ++@subsubsection Numeric Characters ++ ++The @i{numeric} @i{characters} are ++a subset of the @i{graphic} @i{characters}. ++Of the @i{standard characters}, only these are @i{numeric} @i{characters}: ++ ++@t{0 1 2 3 4 5 6 7 8 9} ++ ++For each @i{implementation-defined} @i{graphic} @i{character} ++that has no @i{case}, the @i{implementation} must define whether ++or not it is a @i{numeric} @i{character}. ++ ++@node Alphanumeric Characters, Digits in a Radix, Numeric Characters, Character Categories ++@subsubsection Alphanumeric Characters ++ ++The set of @i{alphanumeric} @i{characters} is the union of ++ the set of @i{alphabetic}_1 @i{characters} ++and the set of @i{numeric} @i{characters}. ++ ++@node Digits in a Radix, , Alphanumeric Characters, Character Categories ++@subsubsection Digits in a Radix ++ ++What qualifies as a @i{digit} depends on the @i{radix} ++(an @i{integer} between @t{2} and @t{36}, inclusive). ++The potential @i{digits} are: ++ ++@t{0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} ++ ++Their respective weights are @t{0}, @t{1}, @t{2}, ... @t{35}. ++In any given radix n, only the first n potential @i{digits} ++are considered to be @i{digits}. ++For example, ++the digits in radix @t{2} are @t{0} and @t{1}, ++the digits in radix @t{10} are @t{0} through @t{9}, and ++the digits in radix @t{16} are @t{0} through @t{F}. ++ ++@i{Case} is not significant in @i{digits}; ++for example, in radix @t{16}, both @t{F} and @t{f} ++are @i{digits} with weight @t{15}. ++ ++@node Identity of Characters, Ordering of Characters, Character Categories, Character Concepts ++@subsection Identity of Characters ++ ++Two @i{characters} that are @b{eql}, @b{char=}, or @b{char-equal} ++are not necessarily @b{eq}. ++ ++@node Ordering of Characters, Character Names, Identity of Characters, Character Concepts ++@subsection Ordering of Characters ++ ++The total ordering on @i{characters} is guaranteed to have ++the following properties: ++ ++@table @asis ++ ++@item @t{*} ++If two @i{characters} have the same @i{implementation-defined} @i{attributes}, ++then their ordering by @b{char<} is consistent with the numerical ++ordering by the predicate @b{<} on their code @i{attributes}. ++ ++@item @t{*} ++If two @i{characters} differ in any @i{attribute}, then they ++are not @b{char=}. ++ ++[Reviewer Note by Barmar: I wonder if we should say that the ordering may be dependent on the ++ @i{implementation-defined} @i{attributes}.] ++ ++@item @t{*} ++The total ordering is not necessarily the same as the total ordering ++ on the @i{integers} produced by applying @b{char-int} to the ++ @i{characters}. ++ ++@item @t{*} ++While @i{alphabetic}_1 @i{standard characters} of a given @i{case} ++ must ++ obey a partial ordering, ++ they need not be contiguous; it is permissible for ++ @i{uppercase} and @i{lowercase} @i{characters} to be interleaved. ++ Thus @t{(char<= #\a x #\z)} ++ is not a valid way of determining whether or not @t{x} is a ++ @i{lowercase} @i{character}. ++ ++@end table ++ ++Of the @i{standard characters}, ++those which are @i{alphanumeric} obey the following partial ordering: ++ ++@example ++ A, char<=, char>=, ++@subheading char-equal, char-not-equal, char-lessp, char-greaterp, char-not-greaterp, ++@subheading char-not-lessp ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{@r{char=}} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{@r{char/=}} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{@r{char<}} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{@r{char>}} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{@r{char<=}} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{@r{char>=}} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{char-equal} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{char-not-equal} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{char-lessp} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{char-greaterp} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{char-not-greaterp} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@code{char-not-lessp} @i{@r{&rest} characters^+} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{character}---a @i{character}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++These predicates compare @i{characters}. ++ ++@b{char=} returns @i{true} if all @i{characters} are the @i{same}; ++otherwise, it returns @i{false}. ++ ++If two @i{characters} differ ++in any @i{implementation-defined} @i{attributes}, ++then they are not @b{char=}. ++ ++@b{char/=} returns @i{true} if all @i{characters} are different; ++otherwise, it returns @i{false}. ++ ++@b{char<} returns @i{true} if the @i{characters} are monotonically increasing; ++otherwise, it returns @i{false}. ++ ++If two @i{characters} ++have @i{identical} @i{implementation-defined} @i{attributes}, ++then their ordering by @b{char<} is ++consistent with the numerical ordering by the predicate @t{<} on their @i{codes}. ++ ++@b{char>} returns @i{true} if the @i{characters} are monotonically decreasing; ++otherwise, it returns @i{false}. ++ ++If two @i{characters} have ++@i{identical} @i{implementation-defined} @i{attributes}, ++then their ordering by @b{char>} is ++consistent with the numerical ordering by the predicate @t{>} on their @i{codes}. ++ ++@b{char<=} returns @i{true} ++if the @i{characters} are monotonically nondecreasing; ++otherwise, it returns @i{false}. ++ ++If two @i{characters} have ++@i{identical} @i{implementation-defined} @i{attributes}, ++then their ordering by @b{char<=} is ++consistent with the numerical ordering by the predicate @t{<=} on their @i{codes}. ++ ++@b{char>=} returns @i{true} ++if the @i{characters} are monotonically nonincreasing; ++otherwise, it returns @i{false}. ++ ++If two @i{characters} have ++@i{identical} @i{implementation-defined} @i{attributes}, ++then their ordering by @b{char>=} is ++consistent with the numerical ordering by the predicate @t{>=} on their @i{codes}. ++ ++ @b{char-equal}, ++ @b{char-not-equal}, ++ @b{char-lessp}, ++ @b{char-greaterp}, ++ @b{char-not-greaterp}, ++and @b{char-not-lessp} ++are similar to ++ @b{char=}, ++ @b{char/=}, ++ @b{char<}, ++ @b{char>}, ++ @b{char<=}, ++ @b{char>=}, ++respectively, ++except that they ignore differences in @i{case} and ++ ++might have an @i{implementation-defined} behavior ++for @i{non-simple} @i{characters}. ++For example, an @i{implementation} might define that ++@b{char-equal}, @i{etc.} ignore certain ++@i{implementation-defined} @i{attributes}. ++The effect, if any, ++of each @i{implementation-defined} @i{attribute} ++upon these functions must be specified as part of the definition of that @i{attribute}. ++ ++@subsubheading Examples:: ++ ++@example ++ (char= #\d #\d) @result{} @i{true} ++ (char= #\A #\a) @result{} @i{false} ++ (char= #\d #\x) @result{} @i{false} ++ (char= #\d #\D) @result{} @i{false} ++ (char/= #\d #\d) @result{} @i{false} ++ (char/= #\d #\x) @result{} @i{true} ++ (char/= #\d #\D) @result{} @i{true} ++ (char= #\d #\d #\d #\d) @result{} @i{true} ++ (char/= #\d #\d #\d #\d) @result{} @i{false} ++ (char= #\d #\d #\x #\d) @result{} @i{false} ++ (char/= #\d #\d #\x #\d) @result{} @i{false} ++ (char= #\d #\y #\x #\c) @result{} @i{false} ++ (char/= #\d #\y #\x #\c) @result{} @i{true} ++ (char= #\d #\c #\d) @result{} @i{false} ++ (char/= #\d #\c #\d) @result{} @i{false} ++ (char< #\d #\x) @result{} @i{true} ++ (char<= #\d #\x) @result{} @i{true} ++ (char< #\d #\d) @result{} @i{false} ++ (char<= #\d #\d) @result{} @i{true} ++ (char< #\a #\e #\y #\z) @result{} @i{true} ++ (char<= #\a #\e #\y #\z) @result{} @i{true} ++ (char< #\a #\e #\e #\y) @result{} @i{false} ++ (char<= #\a #\e #\e #\y) @result{} @i{true} ++ (char> #\e #\d) @result{} @i{true} ++ (char>= #\e #\d) @result{} @i{true} ++ (char> #\d #\c #\b #\a) @result{} @i{true} ++ (char>= #\d #\c #\b #\a) @result{} @i{true} ++ (char> #\d #\d #\c #\a) @result{} @i{false} ++ (char>= #\d #\d #\c #\a) @result{} @i{true} ++ (char> #\e #\d #\b #\c #\a) @result{} @i{false} ++ (char>= #\e #\d #\b #\c #\a) @result{} @i{false} ++ (char> #\z #\A) @result{} @i{implementation-dependent} ++ (char> #\Z #\a) @result{} @i{implementation-dependent} ++ (char-equal #\A #\a) @result{} @i{true} ++ (stable-sort (list #\b #\A #\B #\a #\c #\C) #'char-lessp) ++@result{} (#\A #\a #\b #\B #\c #\C) ++ (stable-sort (list #\b #\A #\B #\a #\c #\C) #'char<) ++@result{} (#\A #\B #\C #\a #\b #\c) ;Implementation A ++@result{} (#\a #\b #\c #\A #\B #\C) ;Implementation B ++@result{} (#\a #\A #\b #\B #\c #\C) ;Implementation C ++@result{} (#\A #\a #\B #\b #\C #\c) ;Implementation D ++@result{} (#\A #\B #\a #\b #\C #\c) ;Implementation E ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{program-error} ++ if at least one @i{character} is not supplied. ++ ++@subsubheading See Also:: ++ ++@ref{Character Syntax}, ++@ref{Documentation of Implementation-Defined Scripts} ++ ++@subsubheading Notes:: ++ ++If characters differ in their @i{code} @i{attribute} ++or any @i{implementation-defined} @i{attribute}, ++they are considered to be different by @b{char=}. ++ ++There is no requirement that @t{(eq c1 c2)} be true merely because ++@t{(char= c1 c2)} is @i{true}. While @b{eq} can distinguish two ++@i{characters} ++that @b{char=} does not, it is distinguishing them not ++as @i{characters}, but in some sense on the basis of a lower level ++implementation characteristic. ++If @t{(eq c1 c2)} is @i{true}, ++then @t{(char= c1 c2)} is also true. ++@b{eql} and @b{equal} ++compare @i{characters} in the same ++way that @b{char=} does. ++ ++The manner in which @i{case} is used by ++ @b{char-equal}, ++ @b{char-not-equal}, ++ @b{char-lessp}, ++ @b{char-greaterp}, ++ @b{char-not-greaterp}, ++ and @b{char-not-lessp} ++implies an ordering for @i{standard characters} such that ++@t{A=a}, @t{B=b}, and so on, up to @t{Z=z}, and furthermore either ++@t{9 and <@i{Space}> have the respective names @t{"Newline"} and @t{"Space"}. ++The @i{semi-standard} @i{characters} ++<@i{Tab}>, <@i{Page}>, <@i{Rubout}>, <@i{Linefeed}>, <@i{Return}>, and <@i{Backspace}> ++(if they are supported by the @i{implementation}) ++have the respective names ++@t{"Tab"}, @t{"Page"}, @t{"Rubout"}, @t{"Linefeed"}, @t{"Return"}, and @t{"Backspace"} ++(in the indicated case, even though name lookup by ``@t{#\}'' ++and by the @i{function} @b{name-char} is not case sensitive). ++ ++@subsubheading Examples:: ++ ++@example ++ (char-name #\ ) @result{} "Space" ++ (char-name #\Space) @result{} "Space" ++ (char-name #\Page) @result{} "Page" ++ ++ (char-name #\a) ++@result{} NIL ++@i{OR}@result{} "LOWERCASE-a" ++@i{OR}@result{} "Small-A" ++@i{OR}@result{} "LA01" ++ ++ (char-name #\A) ++@result{} NIL ++@i{OR}@result{} "UPPERCASE-A" ++@i{OR}@result{} "Capital-A" ++@i{OR}@result{} "LA02" ++ ++ ;; Even though its CHAR-NAME can vary, #\A prints as #\A ++ (prin1-to-string (read-from-string (format nil "#\\~A" (or (char-name #\A) "A")))) ++@result{} "#\\A" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{character} is not a @i{character}. ++ ++@subsubheading See Also:: ++ ++@ref{name-char} ++, ++@ref{Printing Characters} ++ ++@subsubheading Notes:: ++ ++@i{Non-graphic} ++@i{characters} having @i{names} are written by the @i{Lisp printer} ++as ``@t{#\}'' followed by the their @i{name}; see @ref{Printing Characters}. ++ ++@node name-char, , char-name, Characters Dictionary ++@subsection name-char [Function] ++ ++@code{name-char} @i{name} @result{} @i{char-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{string designator}. ++ ++@i{char-p}---a @i{character} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns the @i{character} @i{object} whose @i{name} is ++@i{name} (as determined by @b{string-equal}---@i{i.e.}, lookup is not case sensitive). ++If such a @i{character} does not exist, @b{nil} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++(name-char 'space) @result{} #\Space ++(name-char "space") @result{} #\Space ++(name-char "Space") @result{} #\Space ++(let ((x (char-name #\a))) ++ (or (not x) (eql (name-char x) #\a))) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{name} is not a @i{string designator}. ++ ++@subsubheading See Also:: ++ ++@ref{char-name} ++ ++@c end of including dict-characters ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-14.texi +@@ -0,0 +1,3859 @@ ++ ++ ++@node Conses, Arrays, Characters, Top ++@chapter Conses ++ ++@menu ++* Cons Concepts:: ++* Conses Dictionary:: ++@end menu ++ ++@node Cons Concepts, Conses Dictionary, Conses, Conses ++@section Cons Concepts ++ ++@c including concept-conses ++ ++A @i{cons} ++@IGindex cons ++ is a compound data @i{object} ++having two components called the @i{car} and the @i{cdr}. ++ ++@format ++@group ++@noindent ++@w{ car cons rplacd } ++@w{ cdr rplaca } ++ ++@noindent ++@w{ Figure 14--1: Some defined names relating to conses.} ++ ++@end group ++@end format ++ ++Depending on context, a group of connected @i{conses} can be viewed ++in a variety of different ways. A variety of operations is provided to ++support each of these various views. ++ ++@menu ++* Conses as Trees:: ++* Conses as Lists:: ++@end menu ++ ++@node Conses as Trees, Conses as Lists, Cons Concepts, Cons Concepts ++@subsection Conses as Trees ++ ++A @i{tree} ++@IGindex tree ++ is a binary recursive data structure made up of ++@i{conses} and @i{atoms}: ++the @i{conses} are themselves also @i{trees} ++(sometimes called ``subtrees'' or ``branches''), and the @i{atoms} ++are terminal nodes (sometimes called @i{leaves} ++@IGindex leaves ++). ++Typically, the @i{leaves} represent data while the branches ++establish some relationship among that data. ++ ++@format ++@group ++@noindent ++@w{ caaaar caddar cdar nsubst } ++@w{ caaadr cadddr cddaar nsubst-if } ++@w{ caaar caddr cddadr nsubst-if-not } ++@w{ caadar cadr cddar nthcdr } ++@w{ caaddr cdaaar cdddar sublis } ++@w{ caadr cdaadr cddddr subst } ++@w{ caar cdaar cdddr subst-if } ++@w{ cadaar cdadar cddr subst-if-not } ++@w{ cadadr cdaddr copy-tree tree-equal } ++@w{ cadar cdadr nsublis } ++ ++@noindent ++@w{ Figure 14--2: Some defined names relating to trees.} ++ ++@end group ++@end format ++ ++@menu ++* General Restrictions on Parameters that must be Trees:: ++@end menu ++ ++@node General Restrictions on Parameters that must be Trees, , Conses as Trees, Conses as Trees ++@subsubsection General Restrictions on Parameters that must be Trees ++ ++Except as explicitly stated otherwise, ++for any @i{standardized} @i{function} that takes a @i{parameter} ++that is required to be a @i{tree}, ++the consequences are undefined ++if that @i{tree} is circular. ++ ++@node Conses as Lists, , Conses as Trees, Cons Concepts ++@subsection Conses as Lists ++ ++A @i{list} ++@IGindex list ++ is a chain of @i{conses} in which the @i{car} of each ++@i{cons} is an @i{element} of the @i{list}, ++and the @i{cdr} of each @i{cons} is either the next ++link in the chain or a terminating @i{atom}. ++ ++A @i{proper list} ++@IGindex proper list ++ is a @i{list} terminated by the @i{empty list}. ++The @i{empty list} is a @i{proper list}, but is not a @i{cons}. ++ ++An @i{improper list} ++@IGindex improper list ++ is a @i{list} that is not a @i{proper list}; ++that is, it is a @i{circular list} or a @i{dotted list}. ++ ++A @i{dotted list} ++@IGindex dotted list ++ is a @i{list} that has a terminating @i{atom} ++that is not the @i{empty list}. A @i{non-nil} @i{atom} by itself ++is not considered to be a @i{list} of any kind---not even a @i{dotted list}. ++ ++A @i{circular list} ++@IGindex circular list ++ is a chain of @i{conses} that has no termination ++because some @i{cons} in the chain is the @i{cdr} of a later @i{cons}. ++ ++@format ++@group ++@noindent ++@w{ append last nbutlast rest } ++@w{ butlast ldiff nconc revappend } ++@w{ copy-alist list ninth second } ++@w{ copy-list list* nreconc seventh } ++@w{ eighth list-length nth sixth } ++@w{ endp make-list nthcdr tailp } ++@w{ fifth member pop tenth } ++@w{ first member-if push third } ++@w{ fourth member-if-not pushnew } ++ ++@noindent ++@w{ Figure 14--3: Some defined names relating to lists.} ++ ++@end group ++@end format ++ ++@menu ++* Lists as Association Lists:: ++* Lists as Sets:: ++* General Restrictions on Parameters that must be Lists:: ++@end menu ++ ++@node Lists as Association Lists, Lists as Sets, Conses as Lists, Conses as Lists ++@subsubsection Lists as Association Lists ++ ++An @i{association list} ++@IGindex association list ++ is a @i{list} of @i{conses} ++representing an association of @i{keys} with @i{values}, ++where the @i{car} of each @i{cons} is the @i{key} ++and the @i{cdr} is the @i{value} associated with that @i{key}. ++ ++@format ++@group ++@noindent ++@w{ acons assoc-if pairlis rassoc-if } ++@w{ assoc assoc-if-not rassoc rassoc-if-not } ++ ++@noindent ++@w{ Figure 14--4: Some defined names related to assocation lists.} ++ ++@end group ++@end format ++ ++@node Lists as Sets, General Restrictions on Parameters that must be Lists, Lists as Association Lists, Conses as Lists ++@subsubsection Lists as Sets ++ ++@i{Lists} are sometimes viewed as sets by considering their elements ++unordered and by assuming there is no duplication of elements. ++ ++@format ++@group ++@noindent ++@w{ adjoin nset-difference set-difference union } ++@w{ intersection nset-exclusive-or set-exclusive-or } ++@w{ nintersection nunion subsetp } ++ ++@noindent ++@w{ Figure 14--5: Some defined names related to sets. } ++ ++@end group ++@end format ++ ++@node General Restrictions on Parameters that must be Lists, , Lists as Sets, Conses as Lists ++@subsubsection General Restrictions on Parameters that must be Lists ++ ++Except as explicitly specified otherwise, ++any @i{standardized} @i{function} that takes a @i{parameter} ++that is required to be a @i{list} should be prepared to signal ++an error of @i{type} @b{type-error} if the @i{value} received is a @i{dotted list}. ++ ++Except as explicitly specified otherwise, ++for any @i{standardized} @i{function} that takes a @i{parameter} ++that is required to be a @i{list}, ++the consequences are undefined ++if that @i{list} is @i{circular}. ++ ++@c end of including concept-conses ++ ++@node Conses Dictionary, , Cons Concepts, Conses ++@section Conses Dictionary ++ ++@c including dict-conses ++ ++@menu ++* list (System Class):: ++* null (System Class):: ++* cons (System Class):: ++* atom (Type):: ++* cons:: ++* consp:: ++* atom:: ++* rplaca:: ++* car:: ++* copy-tree:: ++* sublis:: ++* subst:: ++* tree-equal:: ++* copy-list:: ++* list (Function):: ++* list-length:: ++* listp:: ++* make-list:: ++* push:: ++* pop:: ++* first:: ++* nth:: ++* endp:: ++* null:: ++* nconc:: ++* append:: ++* revappend:: ++* butlast:: ++* last:: ++* ldiff:: ++* nthcdr:: ++* rest:: ++* member (Function):: ++* mapc:: ++* acons:: ++* assoc:: ++* copy-alist:: ++* pairlis:: ++* rassoc:: ++* get-properties:: ++* getf:: ++* remf:: ++* intersection:: ++* adjoin:: ++* pushnew:: ++* set-difference:: ++* set-exclusive-or:: ++* subsetp:: ++* union:: ++@end menu ++ ++@node list (System Class), null (System Class), Conses Dictionary, Conses Dictionary ++@subsection list [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{list}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{list} ++@IGindex list ++ is a chain of @i{conses} in which the @i{car} of each ++@i{cons} is an @i{element} of the @i{list}, and the @i{cdr} of ++each @i{cons} is either the next link in the chain or a terminating ++@i{atom}. ++ ++A @i{proper list} ++@IGindex proper list ++ is a chain of @i{conses} terminated by ++the @i{empty list} ++@IGindex empty list ++, @t{()}, which is itself a @i{proper list}. ++A @i{dotted list} ++@IGindex dotted list ++ is a @i{list} which has a terminating @i{atom} ++that is not the @i{empty list}. ++A @i{circular list} ++@IGindex circular list ++ is a chain of @i{conses} that has no termination ++because some @i{cons} in the chain is the @i{cdr} of a later @i{cons}. ++ ++@i{Dotted lists} and @i{circular lists} are also @i{lists}, but usually ++the unqualified term ``list'' within this specification means @i{proper list}. ++Nevertheless, the @i{type} @b{list} unambiguously includes @i{dotted lists} ++and @i{circular lists}. ++ ++For each @i{element} of a @i{list} there is a @i{cons}. ++The @i{empty list} has no @i{elements} and is not a @i{cons}. ++ ++The @i{types} @b{cons} and @b{null} form an @i{exhaustive partition} ++of the @i{type} @b{list}. ++ ++@subsubheading See Also:: ++ ++@ref{Left-Parenthesis}, ++@ref{Printing Lists and Conses} ++ ++@node null (System Class), cons (System Class), list (System Class), Conses Dictionary ++@subsection null [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{null}, ++@b{symbol}, ++@b{list}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The only @i{object} of @i{type} @b{null} is @b{nil}, ++which represents the @i{empty list} and can also be notated @t{()}. ++ ++@subsubheading See Also:: ++ ++@ref{Symbols as Tokens}, ++@ref{Left-Parenthesis}, ++@ref{Printing Symbols} ++ ++@node cons (System Class), atom (Type), null (System Class), Conses Dictionary ++@subsection cons [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{cons}, ++@b{list}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{cons} is a compound @i{object} having two components, ++called the @i{car} and @i{cdr}. These form a @i{dotted pair}. ++Each component can be any @i{object}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{cons}@{@i{@t{[}car-typespec @r{[}cdr-typespec@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{car-typespec}---a @i{type specifier}, ++ or the @i{symbol} @b{*}. ++ The default is the @i{symbol} @b{*}. ++ ++@i{cdr-typespec}---a @i{type specifier}, ++ or the @i{symbol} @b{*}. ++ The default is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of @i{conses} ++whose @i{car} is constrained to be of @i{type} @i{car-typespec} and ++whose @i{cdr} is constrained to be of @i{type} @i{cdr-typespec}. ++(If either @i{car-typespec} or @i{cdr-typespec} is @b{*}, ++ it is as if the @i{type} @b{t} had been denoted.) ++ ++@subsubheading See Also:: ++ ++@ref{Left-Parenthesis}, ++@ref{Printing Lists and Conses} ++ ++@node atom (Type), cons, cons (System Class), Conses Dictionary ++@subsection atom [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{atom}, ++@b{t} ++ ++@subsubheading Description:: ++ ++It is equivalent to @t{(not cons)}. ++ ++@node cons, consp, atom (Type), Conses Dictionary ++@subsection cons [Function] ++ ++@code{cons} @i{object-1 object-2} @result{} @i{cons} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object-1}---an @i{object}. ++ ++@i{object-2}---an @i{object}. ++ ++@i{cons}---a @i{cons}. ++ ++@subsubheading Description:: ++ ++Creates a @i{fresh} @i{cons}, the @i{car} of which is @i{object-1} ++and the @i{cdr} of which is @i{object-2}. ++ ++@subsubheading Examples:: ++ ++@example ++ (cons 1 2) @result{} (1 . 2) ++ (cons 1 nil) @result{} (1) ++ (cons nil 2) @result{} (NIL . 2) ++ (cons nil nil) @result{} (NIL) ++ (cons 1 (cons 2 (cons 3 (cons 4 nil)))) @result{} (1 2 3 4) ++ (cons 'a 'b) @result{} (A . B) ++ (cons 'a (cons 'b (cons 'c '@t{()}))) @result{} (A B C) ++ (cons 'a '(b c d)) @result{} (A B C D) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{list (Function)} ++ ++@subsubheading Notes:: ++If @i{object-2} is a @i{list}, @b{cons} can be thought of as ++producing a new @i{list} which is like it but has @i{object-1} prepended. ++ ++@node consp, atom, cons, Conses Dictionary ++@subsection consp [Function] ++ ++@code{consp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{cons}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (consp nil) @result{} @i{false} ++ (consp (cons 1 2)) @result{} @i{true} ++@end example ++ ++The @i{empty list} is not a @i{cons}, so ++ ++@example ++ (consp '()) @equiv{} (consp 'nil) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{listp} ++ ++@subsubheading Notes:: ++ ++@example ++ (consp @i{object}) @equiv{} (typep @i{object} 'cons) @equiv{} (not (typep @i{object} 'atom)) @equiv{} (typep @i{object} '(not atom)) ++@end example ++ ++@node atom, rplaca, consp, Conses Dictionary ++@subsection atom [Function] ++ ++@code{atom} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{atom}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (atom 'sss) @result{} @i{true} ++ (atom (cons 1 2)) @result{} @i{false} ++ (atom nil) @result{} @i{true} ++ (atom '()) @result{} @i{true} ++ (atom 3) @result{} @i{true} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (atom @i{object}) @equiv{} (typep @i{object} 'atom) @equiv{} (not (consp @i{object})) ++ @equiv{} (not (typep @i{object} 'cons)) @equiv{} (typep @i{object} '(not cons)) ++@end example ++ ++@node rplaca, car, atom, Conses Dictionary ++@subsection rplaca, rplacd [Function] ++ ++@code{rplaca} @i{cons object} @result{} @i{cons} ++ ++@code{rplacd} @i{cons object} @result{} @i{cons} ++ ++@subsubheading Pronunciation:: ++ ++@b{rplaca}: pronounced ,r\=e 'plak e ++ or pronounced ,re 'plak e ++ ++@b{rplacd}: pronounced ,r\=e 'plak de ++ or pronounced ,re 'plak de ++ or pronounced ,r\=e 'plak d\=e ++ or pronounced ,re 'plak d\=e ++ ++@subsubheading Arguments and Values:: ++ ++@i{cons}---a @i{cons}. ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{rplaca} replaces the @i{car} of the @i{cons} with @i{object}. ++ ++@b{rplacd} replaces the @i{cdr} of the @i{cons} with @i{object}. ++ ++@subsubheading Examples:: ++@example ++ (defparameter *some-list* (list* 'one 'two 'three 'four)) @result{} *some-list* ++ *some-list* @result{} (ONE TWO THREE . FOUR) ++ (rplaca *some-list* 'uno) @result{} (UNO TWO THREE . FOUR) ++ *some-list* @result{} (UNO TWO THREE . FOUR) ++ (rplacd (last *some-list*) (list 'IV)) @result{} (THREE IV) ++ *some-list* @result{} (UNO TWO THREE IV) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{cons} is modified. ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{cons} is not a @i{cons}. ++ ++@node car, copy-tree, rplaca, Conses Dictionary ++@subsection car, cdr, ++@subheading caar, cadr, cdar, cddr, ++@subheading caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr, ++@subheading caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr, ++@subheading cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr ++@flushright ++@i{[Accessor]} ++@end flushright ++ ++@code{car} @i{x} @result{} @i{object} ++(setf (@code{car} @i{x}) new-object)@* ++ ++@code{cdr} @i{x} @result{} @i{object} ++(setf (@code{cdr} @i{x}) new-object)@* ++ ++@code{\vksip 5pt} @i{x} @result{} @i{object} ++(setf (@code{\vksip 5pt} @i{x}) new-object)@* ++ ++@code{caar} @i{x} @result{} @i{object} ++(setf (@code{caar} @i{x}) new-object)@* ++ ++@code{cadr} @i{x} @result{} @i{object} ++(setf (@code{cadr} @i{x}) new-object)@* ++ ++@code{cdar} @i{x} @result{} @i{object} ++(setf (@code{cdar} @i{x}) new-object)@* ++ ++@code{cddr} @i{x} @result{} @i{object} ++(setf (@code{cddr} @i{x}) new-object)@* ++ ++@code{\vksip 5pt} @i{x} @result{} @i{object} ++(setf (@code{\vksip 5pt} @i{x}) new-object)@* ++ ++@code{caaar} @i{x} @result{} @i{object} ++(setf (@code{caaar} @i{x}) new-object)@* ++ ++@code{caadr} @i{x} @result{} @i{object} ++(setf (@code{caadr} @i{x}) new-object)@* ++ ++@code{cadar} @i{x} @result{} @i{object} ++(setf (@code{cadar} @i{x}) new-object)@* ++ ++@code{caddr} @i{x} @result{} @i{object} ++(setf (@code{caddr} @i{x}) new-object)@* ++ ++@code{cdaar} @i{x} @result{} @i{object} ++(setf (@code{cdaar} @i{x}) new-object)@* ++ ++@code{cdadr} @i{x} @result{} @i{object} ++(setf (@code{cdadr} @i{x}) new-object)@* ++ ++@code{cddar} @i{x} @result{} @i{object} ++(setf (@code{cddar} @i{x}) new-object)@* ++ ++@code{cdddr} @i{x} @result{} @i{object} ++(setf (@code{cdddr} @i{x}) new-object)@* ++ ++@code{\vksip 5pt} @i{x} @result{} @i{object} ++(setf (@code{\vksip 5pt} @i{x}) new-object)@* ++ ++@code{caaaar} @i{x} @result{} @i{object} ++(setf (@code{caaaar} @i{x}) new-object)@* ++ ++@code{caaadr} @i{x} @result{} @i{object} ++(setf (@code{caaadr} @i{x}) new-object)@* ++ ++@code{caadar} @i{x} @result{} @i{object} ++(setf (@code{caadar} @i{x}) new-object)@* ++ ++@code{caaddr} @i{x} @result{} @i{object} ++(setf (@code{caaddr} @i{x}) new-object)@* ++ ++@code{cadaar} @i{x} @result{} @i{object} ++(setf (@code{cadaar} @i{x}) new-object)@* ++ ++@code{cadadr} @i{x} @result{} @i{object} ++(setf (@code{cadadr} @i{x}) new-object)@* ++ ++@code{caddar} @i{x} @result{} @i{object} ++(setf (@code{caddar} @i{x}) new-object)@* ++ ++@code{cadddr} @i{x} @result{} @i{object} ++(setf (@code{cadddr} @i{x}) new-object)@* ++ ++@code{cdaaar} @i{x} @result{} @i{object} ++(setf (@code{cdaaar} @i{x}) new-object)@* ++ ++@code{cdaadr} @i{x} @result{} @i{object} ++(setf (@code{cdaadr} @i{x}) new-object)@* ++ ++@code{cdadar} @i{x} @result{} @i{object} ++(setf (@code{cdadar} @i{x}) new-object)@* ++ ++@code{cdaddr} @i{x} @result{} @i{object} ++(setf (@code{cdaddr} @i{x}) new-object)@* ++ ++@code{cddaar} @i{x} @result{} @i{object} ++(setf (@code{cddaar} @i{x}) new-object)@* ++ ++@code{cddadr} @i{x} @result{} @i{object} ++(setf (@code{cddadr} @i{x}) new-object)@* ++ ++@code{cdddar} @i{x} @result{} @i{object} ++(setf (@code{cdddar} @i{x}) new-object)@* ++ ++@code{cddddr} @i{x} @result{} @i{object} ++(setf (@code{cddddr} @i{x}) new-object)@* ++ ++@subsubheading Pronunciation:: ++ ++@b{cadr}: pronounced 'ka ,de r ++ ++@b{caddr}: pronounced 'kad e ,de r ++ or pronounced 'ka ,dude r ++ ++@b{cdr}: pronounced 'ku ,de r ++ ++@b{cddr}: pronounced 'kud e ,de r ++ or pronounced 'ke ,dude r ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---a @i{list}. ++ ++@i{object}---an @i{object}. ++ ++@i{new-object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++If @i{x} is a @i{cons}, @b{car} returns the @i{car} ++of that @i{cons}. If @i{x} is @b{nil}, @b{car} returns @b{nil}. ++ ++If @i{x} is a @i{cons}, @b{cdr} returns the @i{cdr} ++of that @i{cons}. If @i{x} is @b{nil}, @b{cdr} returns @b{nil}. ++ ++@i{Functions} are provided which perform compositions of up to four ++@b{car} and @b{cdr} operations. Their @i{names} consist of ++a @t{C}, followed by two, three, or four occurrences of @t{A} or @t{D}, ++and finally an @t{R}. The series of @t{A}'s and @t{D}'s in each ++@i{function}'s @i{name} is chosen to identify the series of ++@b{car} and @b{cdr} operations that is performed by the function. ++The order in which the @t{A}'s and @t{D}'s appear is the inverse of the ++order in which the corresponding operations are performed. Figure 14--6 ++defines the relationships precisely. ++ ++@format ++@group ++@noindent ++@w{ This @i{place} ... Is equivalent to this @i{place} ... } ++@w{ @t{(caar @i{x})} @t{(car (car @i{x}))} } ++@w{ @t{(cadr @i{x})} @t{(car (cdr @i{x}))} } ++@w{ @t{(cdar @i{x})} @t{(cdr (car @i{x}))} } ++@w{ @t{(cddr @i{x})} @t{(cdr (cdr @i{x}))} } ++@w{ @t{(caaar @i{x})} @t{(car (car (car @i{x})))} } ++@w{ @t{(caadr @i{x})} @t{(car (car (cdr @i{x})))} } ++@w{ @t{(cadar @i{x})} @t{(car (cdr (car @i{x})))} } ++@w{ @t{(caddr @i{x})} @t{(car (cdr (cdr @i{x})))} } ++@w{ @t{(cdaar @i{x})} @t{(cdr (car (car @i{x})))} } ++@w{ @t{(cdadr @i{x})} @t{(cdr (car (cdr @i{x})))} } ++@w{ @t{(cddar @i{x})} @t{(cdr (cdr (car @i{x})))} } ++@w{ @t{(cdddr @i{x})} @t{(cdr (cdr (cdr @i{x})))} } ++@w{ @t{(caaaar @i{x})} @t{(car (car (car (car @i{x}))))} } ++@w{ @t{(caaadr @i{x})} @t{(car (car (car (cdr @i{x}))))} } ++@w{ @t{(caadar @i{x})} @t{(car (car (cdr (car @i{x}))))} } ++@w{ @t{(caaddr @i{x})} @t{(car (car (cdr (cdr @i{x}))))} } ++@w{ @t{(cadaar @i{x})} @t{(car (cdr (car (car @i{x}))))} } ++@w{ @t{(cadadr @i{x})} @t{(car (cdr (car (cdr @i{x}))))} } ++@w{ @t{(caddar @i{x})} @t{(car (cdr (cdr (car @i{x}))))} } ++@w{ @t{(cadddr @i{x})} @t{(car (cdr (cdr (cdr @i{x}))))} } ++@w{ @t{(cdaaar @i{x})} @t{(cdr (car (car (car @i{x}))))} } ++@w{ @t{(cdaadr @i{x})} @t{(cdr (car (car (cdr @i{x}))))} } ++@w{ @t{(cdadar @i{x})} @t{(cdr (car (cdr (car @i{x}))))} } ++@w{ @t{(cdaddr @i{x})} @t{(cdr (car (cdr (cdr @i{x}))))} } ++@w{ @t{(cddaar @i{x})} @t{(cdr (cdr (car (car @i{x}))))} } ++@w{ @t{(cddadr @i{x})} @t{(cdr (cdr (car (cdr @i{x}))))} } ++@w{ @t{(cdddar @i{x})} @t{(cdr (cdr (cdr (car @i{x}))))} } ++@w{ @t{(cddddr @i{x})} @t{(cdr (cdr (cdr (cdr @i{x}))))} } ++ ++@noindent ++@w{ Figure 14--6: CAR and CDR variants } ++ ++@end group ++@end format ++ ++@b{setf} can also be used with any of these functions to change an ++existing component of @i{x}, but @b{setf} will not make new ++components. So, for example, the @i{car} of a @i{cons} ++can be assigned with @b{setf} of @b{car}, ++but the @i{car} of @b{nil} cannot be assigned with @b{setf} of @b{car}. ++Similarly, the @i{car} of the @i{car} of a @i{cons} whose @i{car} ++is a @i{cons} can be assigned with @b{setf} of @b{caar}, ++but neither @b{nil} nor a @i{cons} whose car is @b{nil} can be assigned ++with @b{setf} of @b{caar}. ++ ++The argument @i{x} is permitted to be a @i{dotted list} ++or a @i{circular list}. ++ ++@subsubheading Examples:: ++ ++@example ++ (car nil) @result{} NIL ++ (cdr '(1 . 2)) @result{} 2 ++ (cdr '(1 2)) @result{} (2) ++ (cadr '(1 2)) @result{} 2 ++ (car '(a b c)) @result{} A ++ (cdr '(a b c)) @result{} (B C) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The functions @b{car} and @b{cdr} ++should signal @b{type-error} if they receive an argument which is not a ++@i{list}. The other functions (@b{caar}, @b{cadr}, ++... @b{cddddr}) should behave for the purpose of ++error checking as if defined by appropriate calls to @b{car} and ++@b{cdr}. ++ ++@subsubheading See Also:: ++ ++@ref{rplaca} ++, ++@ref{first} ++, ++@ref{rest} ++ ++@subsubheading Notes:: ++ ++The @i{car} of a @i{cons} can also be altered by using @b{rplaca}, ++and the @i{cdr} of a @i{cons} can be altered by using @b{rplacd}. ++ ++@example ++(car @i{x}) @equiv{} (first @i{x}) ++(cadr @i{x}) @equiv{} (second @i{x}) @equiv{} (car (cdr @i{x})) ++(caddr @i{x}) @equiv{} (third @i{x}) @equiv{} (car (cdr (cdr @i{x}))) ++(cadddr @i{x}) @equiv{} (fourth @i{x}) @equiv{} (car (cdr (cdr (cdr @i{x})))) ++@end example ++ ++@node copy-tree, sublis, car, Conses Dictionary ++@subsection copy-tree [Function] ++ ++@code{copy-tree} @i{tree} @result{} @i{new-tree} ++ ++@subsubheading Arguments and Values:: ++ ++@i{tree}---a @i{tree}. ++ ++@i{new-tree}---a @i{tree}. ++ ++@subsubheading Description:: ++ ++Creates a @i{copy} of a @i{tree} of @i{conses}. ++ ++If @i{tree} is not a @i{cons}, it is returned; ++otherwise, the result is a new @i{cons} of the results of calling @b{copy-tree} ++on the @i{car} and @i{cdr} of @i{tree}. ++In other words, all @i{conses} in the @i{tree} represented by @i{tree} ++are copied recursively, stopping only when non-@i{conses} are encountered. ++ ++@b{copy-tree} does not preserve circularities and the sharing of substructure. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq object (list (cons 1 "one") ++ (cons 2 (list 'a 'b 'c)))) ++@result{} ((1 . "one") (2 A B C)) ++ (setq object-too object) @result{} ((1 . "one") (2 A B C)) ++ (setq copy-as-list (copy-list object)) ++ (setq copy-as-alist (copy-alist object)) ++ (setq copy-as-tree (copy-tree object)) ++ (eq object object-too) @result{} @i{true} ++ (eq copy-as-tree object) @result{} @i{false} ++ (eql copy-as-tree object) @result{} @i{false} ++ (equal copy-as-tree object) @result{} @i{true} ++ (setf (first (cdr (second object))) "a" ++ (car (second object)) "two" ++ (car object) '(one . 1)) @result{} (ONE . 1) ++ object @result{} ((ONE . 1) ("two" "a" B C)) ++ object-too @result{} ((ONE . 1) ("two" "a" B C)) ++ copy-as-list @result{} ((1 . "one") ("two" "a" B C)) ++ copy-as-alist @result{} ((1 . "one") (2 "a" B C)) ++ copy-as-tree @result{} ((1 . "one") (2 A B C)) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{tree-equal} ++ ++@node sublis, subst, copy-tree, Conses Dictionary ++@subsection sublis, nsublis [Function] ++ ++@code{sublis} @i{alist tree @r{&key} key test test-not} @result{} @i{new-tree} ++ ++@code{nsublis} @i{alist tree @r{&key} key test test-not} @result{} @i{new-tree} ++ ++@subsubheading Arguments and Values:: ++ ++@i{alist}---an @i{association list}. ++ ++@i{tree}---a @i{tree}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{new-tree}---a @i{tree}. ++ ++@subsubheading Description:: ++ ++@b{sublis} makes substitutions for @i{objects} in @i{tree} ++(a structure of @i{conses}). ++@b{nsublis} is like @b{sublis} ++but destructively modifies the relevant ++parts of the @i{tree}. ++ ++@b{sublis} looks at all subtrees and leaves of @i{tree}; ++if a subtree or leaf appears as a key in @i{alist} ++(that is, the key and the subtree or leaf @i{satisfy the test}), ++it is replaced by the @i{object} with which that key is associated. ++This operation is non-destructive. In effect, @b{sublis} can ++perform several @b{subst} operations simultaneously. ++ ++If @b{sublis} succeeds, a new copy of @i{tree} is returned in ++which each occurrence of such a subtree or leaf is replaced by the ++@i{object} with which it is associated. If no changes are made, the ++original tree is returned. The original @i{tree} is left unchanged, ++but the result tree may share cells with it. ++ ++@b{nsublis} is permitted to modify @i{tree} ++but otherwise returns the same values as @b{sublis}. ++ ++@subsubheading Examples:: ++ ++@example ++ (sublis '((x . 100) (z . zprime)) ++ '(plus x (minus g z x p) 4 . x)) ++@result{} (PLUS 100 (MINUS G ZPRIME 100 P) 4 . 100) ++ (sublis '(((+ x y) . (- x y)) ((- x y) . (+ x y))) ++ '(* (/ (+ x y) (+ x p)) (- x y)) ++ :test #'equal) ++@result{} (* (/ (- X Y) (+ X P)) (+ X Y)) ++ (setq tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4))))) ++@result{} (1 (1 2) ((1 2 3)) (((1 2 3 4)))) ++ (sublis '((3 . "three")) tree1) ++@result{} (1 (1 2) ((1 2 "three")) (((1 2 "three" 4)))) ++ (sublis '((t . "string")) ++ (sublis '((1 . "") (4 . 44)) tree1) ++ :key #'stringp) ++@result{} ("string" ("string" 2) (("string" 2 3)) ((("string" 2 3 44)))) ++ tree1 @result{} (1 (1 2) ((1 2 3)) (((1 2 3 4)))) ++ (setq tree2 '("one" ("one" "two") (("one" "Two" "three")))) ++@result{} ("one" ("one" "two") (("one" "Two" "three"))) ++ (sublis '(("two" . 2)) tree2) ++@result{} ("one" ("one" "two") (("one" "Two" "three"))) ++ tree2 @result{} ("one" ("one" "two") (("one" "Two" "three"))) ++ (sublis '(("two" . 2)) tree2 :test 'equal) ++@result{} ("one" ("one" 2) (("one" "Two" "three"))) ++ ++ (nsublis '((t . 'temp)) ++ tree1 ++ :key #'(lambda (x) (or (atom x) (< (list-length x) 3)))) ++@result{} ((QUOTE TEMP) (QUOTE TEMP) QUOTE TEMP) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nsublis} modifies @i{tree}. ++ ++@subsubheading See Also:: ++ ++@ref{subst} ++, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++Because the side-effecting variants (@i{e.g.}, @b{nsublis}) potentially ++change the path that is being traversed, their effects in the presence ++of shared or circular structure structure may vary in surprising ways ++when compared to their non-side-effecting alternatives. To see this, ++consider the following side-effect behavior, which might be exhibited by ++some implementations: ++ ++@example ++ (defun test-it (fn) ++ (let* ((shared-piece (list 'a 'b)) ++ (data (list shared-piece shared-piece))) ++ (funcall fn '((a . b) (b . a)) data))) ++ (test-it #'sublis) @result{} ((B A) (B A)) ++ (test-it #'nsublis) @result{} ((A B) (A B)) ++@end example ++ ++@node subst, tree-equal, sublis, Conses Dictionary ++@subsection subst, subst-if, subst-if-not, nsubst, nsubst-if, nsubst-if-not ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{subst} @i{new old tree @r{&key} key test test-not} @result{} @i{new-tree} ++ ++@code{subst-if} @i{new predicate tree @r{&key} key} @result{} @i{new-tree} ++ ++@code{subst-if-not} @i{new predicate tree @r{&key} key} @result{} @i{new-tree} ++ ++@code{nsubst} @i{new old tree @r{&key} key test test-not} @result{} @i{new-tree} ++ ++@code{nsubst-if} @i{new predicate tree @r{&key} key} @result{} @i{new-tree} ++ ++@code{nsubst-if-not} @i{new predicate tree @r{&key} key} @result{} @i{new-tree} ++ ++@subsubheading Arguments and Values:: ++ ++@i{new}---an @i{object}. ++ ++@i{old}---an @i{object}. ++ ++@i{predicate}---a @i{symbol} that names a @i{function}, ++ or a @i{function} of one argument ++ that returns a @i{generalized boolean} value. ++ ++@i{tree}---a @i{tree}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{new-tree}---a @i{tree}. ++ ++@subsubheading Description:: ++ ++@b{subst}, @b{subst-if}, and @b{subst-if-not} perform ++substitution operations on @i{tree}. ++Each function searches @i{tree} for occurrences of a ++particular @i{old} item of an element or subexpression that ++@i{satisfies the test}. ++ ++@b{nsubst}, @b{nsubst-if}, and @b{nsubst-if-not} are ++like @b{subst}, ++@b{subst-if}, and @b{subst-if-not} respectively, except that the ++original @i{tree} is modified. ++ ++@b{subst} makes a copy of @i{tree}, ++substituting @i{new} for every subtree or leaf of @i{tree} ++(whether the subtree or leaf is a @i{car} or a @i{cdr} of its parent) ++such that @i{old} and the subtree or leaf @i{satisfy the test}. ++ ++@b{nsubst} is a destructive version of @b{subst}. ++The list structure of ++@i{tree} is altered by destructively replacing with @i{new} ++each leaf of the @i{tree} such that @i{old} and the leaf ++@i{satisfy the test}. ++ ++For @b{subst}, @b{subst-if}, ++and @b{subst-if-not}, ++if the functions succeed, a new ++copy of the tree is returned in which each occurrence of such an ++element is replaced by the ++@i{new} element or subexpression. If no changes are made, the original ++@i{tree} may be returned. ++The original @i{tree} is left unchanged, but the result tree ++may share storage with it. ++ ++For @b{nsubst}, @b{nsubst-if}, ++and @b{nsubst-if-not} ++the original @i{tree} is modified and returned as the function result, ++but the result may not be @b{eq} to @i{tree}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq tree1 '(1 (1 2) (1 2 3) (1 2 3 4))) @result{} (1 (1 2) (1 2 3) (1 2 3 4)) ++ (subst "two" 2 tree1) @result{} (1 (1 "two") (1 "two" 3) (1 "two" 3 4)) ++ (subst "five" 5 tree1) @result{} (1 (1 2) (1 2 3) (1 2 3 4)) ++ (eq tree1 (subst "five" 5 tree1)) @result{} @i{implementation-dependent} ++ (subst 'tempest 'hurricane ++ '(shakespeare wrote (the hurricane))) ++@result{} (SHAKESPEARE WROTE (THE TEMPEST)) ++ (subst 'foo 'nil '(shakespeare wrote (twelfth night))) ++@result{} (SHAKESPEARE WROTE (TWELFTH NIGHT . FOO) . FOO) ++ (subst '(a . cons) '(old . pair) ++ '((old . spice) ((old . shoes) old . pair) (old . pair)) ++ :test #'equal) ++@result{} ((OLD . SPICE) ((OLD . SHOES) A . CONS) (A . CONS)) ++ ++ (subst-if 5 #'listp tree1) @result{} 5 ++ (subst-if-not '(x) #'consp tree1) ++@result{} (1 X) ++ ++ tree1 @result{} (1 (1 2) (1 2 3) (1 2 3 4)) ++ (nsubst 'x 3 tree1 :key #'(lambda (y) (and (listp y) (third y)))) ++@result{} (1 (1 2) X X) ++ tree1 @result{} (1 (1 2) X X) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nsubst}, @b{nsubst-if}, and @b{nsubst-if-not} ++might alter the @i{tree structure} of @i{tree}. ++ ++@subsubheading See Also:: ++ ++@ref{substitute} ++, ++@b{nsubstitute}, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++The functions @b{subst-if-not} and @b{nsubst-if-not} are deprecated. ++ ++One possible definition of @b{subst}: ++ ++@example ++ (defun subst (old new tree &rest x &key test test-not key) ++ (cond ((satisfies-the-test old tree :test test ++ :test-not test-not :key key) ++ new) ++ ((atom tree) tree) ++ (t (let ((a (apply #'subst old new (car tree) x)) ++ (d (apply #'subst old new (cdr tree) x))) ++ (if (and (eql a (car tree)) ++ (eql d (cdr tree))) ++ tree ++ (cons a d)))))) ++@end example ++ ++@node tree-equal, copy-list, subst, Conses Dictionary ++@subsection tree-equal [Function] ++ ++@code{tree-equal} @i{tree-1 tree-2 @r{&key} test test-not} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{tree-1}---a @i{tree}. ++ ++@i{tree-2}---a @i{tree}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{tree-equal} tests whether two trees are of the same shape ++and have the same leaves. ++@b{tree-equal} returns @i{true} if @i{tree-1} and @i{tree-2} are ++both @i{atoms} and @i{satisfy the test}, ++or if they are both @i{conses} and ++the @i{car} of @i{tree-1} is @b{tree-equal} to ++the @i{car} of @i{tree-2} and ++the @i{cdr} of @i{tree-1} is @b{tree-equal} to ++the @i{cdr} of @i{tree-2}. ++Otherwise, @b{tree-equal} returns @i{false}. ++ ++@b{tree-equal} recursively compares @i{conses} but not any ++other @i{objects} that have components. ++ ++The first argument to the @t{:test} or @t{:test-not} ++function is @i{tree-1} or a @i{car} or @i{cdr} of @i{tree-1}; ++the second argument is @i{tree-2} or a @i{car} ++or @i{cdr} of @i{tree-2}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq tree1 '(1 (1 2)) ++ tree2 '(1 (1 2))) @result{} (1 (1 2)) ++ (tree-equal tree1 tree2) @result{} @i{true} ++ (eql tree1 tree2) @result{} @i{false} ++ (setq tree1 '('a ('b 'c)) ++ tree2 '('a ('b 'c))) @result{} ('a ('b 'c)) ++@result{} ((QUOTE A) ((QUOTE B) (QUOTE C))) ++ (tree-equal tree1 tree2 :test 'eq) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined ++if both @i{tree-1} and @i{tree-2} are circular. ++ ++@subsubheading See Also:: ++ ++@ref{equal} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++@node copy-list, list (Function), tree-equal, Conses Dictionary ++@subsection copy-list [Function] ++ ++@code{copy-list} @i{list} @result{} @i{copy} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{proper list} or a @i{dotted list}. ++ ++@i{copy}---a @i{list}. ++ ++@subsubheading Description:: ++ ++Returns a @i{copy} of @i{list}. ++If @i{list} is a @i{dotted list}, ++the resulting @i{list} will also be a @i{dotted list}. ++ ++Only the @i{list structure} of @i{list} is copied; ++the @i{elements} of the resulting list are ++the @i{same} as the corresponding @i{elements} of the given @i{list}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq lst (list 1 (list 2 3))) @result{} (1 (2 3)) ++ (setq slst lst) @result{} (1 (2 3)) ++ (setq clst (copy-list lst)) @result{} (1 (2 3)) ++ (eq slst lst) @result{} @i{true} ++ (eq clst lst) @result{} @i{false} ++ (equal clst lst) @result{} @i{true} ++ (rplaca lst "one") @result{} ("one" (2 3)) ++ slst @result{} ("one" (2 3)) ++ clst @result{} (1 (2 3)) ++ (setf (caadr lst) "two") @result{} "two" ++ lst @result{} ("one" ("two" 3)) ++ slst @result{} ("one" ("two" 3)) ++ clst @result{} (1 ("two" 3)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if @i{list} is a @i{circular list}. ++ ++@subsubheading See Also:: ++ ++@ref{copy-alist} ++, ++@ref{copy-seq} ++, ++@ref{copy-tree} ++ ++@subsubheading Notes:: ++ ++The copy created is @b{equal} to @i{list}, but not @b{eq}. ++ ++@node list (Function), list-length, copy-list, Conses Dictionary ++@subsection list, list* [Function] ++ ++@code{list} @i{@r{&rest} objects} @result{} @i{list} ++ ++@code{list*} @i{@r{&rest} objects^+} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{list}---a @i{list}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{list} returns a @i{list} containing the supplied @i{objects}. ++ ++@b{list*} is like @b{list} except that ++the last @i{argument} to @b{list} becomes ++the @i{car} of the last @i{cons} constructed, while ++the last @i{argument} to @b{list*} becomes ++the @i{cdr} of the last @i{cons} constructed. ++Hence, any given call to @b{list*} always produces one fewer @i{conses} ++than a call to @b{list} with the same number of arguments. ++ ++If the last @i{argument} to @b{list*} is a @i{list}, ++the effect is to construct a new @i{list} which is similar, but ++which has additional elements added to the front corresponding to ++the preceding @i{arguments} of @b{list*}. ++ ++If @b{list*} receives only one @i{object}, ++that @i{object} is returned, regardless of whether or not it is a @i{list}. ++ ++@subsubheading Examples:: ++ ++@example ++ (list 1) @result{} (1) ++ (list* 1) @result{} 1 ++ (setq a 1) @result{} 1 ++ (list a 2) @result{} (1 2) ++ '(a 2) @result{} (A 2) ++ (list 'a 2) @result{} (A 2) ++ (list* a 2) @result{} (1 . 2) ++ (list) @result{} NIL ;@i{i.e.}, () ++ (setq a '(1 2)) @result{} (1 2) ++ (eq a (list* a)) @result{} @i{true} ++ (list 3 4 'a (car '(b . c)) (+ 6 -2)) @result{} (3 4 A B 4) ++ (list* 'a 'b 'c 'd) @equiv{} (cons 'a (cons 'b (cons 'c 'd))) @result{} (A B C . D) ++ (list* 'a 'b 'c '(d e f)) @result{} (A B C D E F) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{cons} ++ ++@subsubheading Notes:: ++ ++@example ++ (list* @i{x}) @equiv{} @i{x} ++@end example ++ ++@node list-length, listp, list (Function), Conses Dictionary ++@subsection list-length [Function] ++ ++@code{list-length} @i{list} @result{} @i{length} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{proper list} or a @i{circular list}. ++ ++@i{length}---a non-negative @i{integer}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns the @i{length} of @i{list} if @i{list} is a @i{proper list}. ++Returns @b{nil} if @i{list} is a @i{circular list}. ++ ++@subsubheading Examples:: ++ ++@example ++ (list-length '(a b c d)) @result{} 4 ++ (list-length '(a (b c) d)) @result{} 3 ++ (list-length '()) @result{} 0 ++ (list-length nil) @result{} 0 ++ (defun circular-list (&rest elements) ++ (let ((cycle (copy-list elements))) ++ (nconc cycle cycle))) ++ (list-length (circular-list 'a 'b)) @result{} NIL ++ (list-length (circular-list 'a)) @result{} NIL ++ (list-length (circular-list)) @result{} 0 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{list} is not a @i{proper list} or a @i{circular list}. ++ ++@subsubheading See Also:: ++ ++@ref{length} ++ ++@subsubheading Notes:: ++ ++@b{list-length} could be implemented as follows: ++ ++@example ++ (defun list-length (x) ++ (do ((n 0 (+ n 2)) ;Counter. ++ (fast x (cddr fast)) ;Fast pointer: leaps by 2. ++ (slow x (cdr slow))) ;Slow pointer: leaps by 1. ++ (nil) ++ ;; If fast pointer hits the end, return the count. ++ (when (endp fast) (return n)) ++ (when (endp (cdr fast)) (return (+ n 1))) ++ ;; If fast pointer eventually equals slow pointer, ++ ;; then we must be stuck in a circular list. ++ ;; (A deeper property is the converse: if we are ++ ;; stuck in a circular list, then eventually the ++ ;; fast pointer will equal the slow pointer. ++ ;; That fact justifies this implementation.) ++ (when (and (eq fast slow) (> n 0)) (return nil)))) ++ ++@end example ++ ++@node listp, make-list, list-length, Conses Dictionary ++@subsection listp [Function] ++ ++@code{listp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{list}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (listp nil) @result{} @i{true} ++ (listp (cons 1 2)) @result{} @i{true} ++ (listp (make-array 6)) @result{} @i{false} ++ (listp t) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{consp} ++ ++@subsubheading Notes:: ++ ++If @i{object} is a @i{cons}, ++@b{listp} does not check whether @i{object} is a @i{proper list}; ++it returns @i{true} for any kind of @i{list}. ++ ++@example ++ (listp @i{object}) @equiv{} (typep @i{object} 'list) @equiv{} (typep @i{object} '(or cons null)) ++@end example ++ ++@node make-list, push, listp, Conses Dictionary ++@subsection make-list [Function] ++ ++@code{make-list} @i{size @r{&key} initial-element} @result{} @i{list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{size}---a non-negative @i{integer}. ++ ++@i{initial-element}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{list}---a @i{list}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of @i{length} given by @i{size}, ++each of the @i{elements} of which is @i{initial-element}. ++ ++@subsubheading Examples:: ++@example ++ (make-list 5) @result{} (NIL NIL NIL NIL NIL) ++ (make-list 3 :initial-element 'rah) @result{} (RAH RAH RAH) ++ (make-list 2 :initial-element '(1 2 3)) @result{} ((1 2 3) (1 2 3)) ++ (make-list 0) @result{} NIL ;@i{i.e.}, () ++ (make-list 0 :initial-element 'new-element) @result{} NIL ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{size} is not a non-negative @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{cons} ++, ++@ref{list (Function)} ++ ++@node push, pop, make-list, Conses Dictionary ++@subsection push [Macro] ++ ++@code{push} @i{item place} @result{} @i{new-place-value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{place}---a @i{place}, the @i{value} of which may be any @i{object}. ++ ++@i{new-place-value}---a @i{list} (the new @i{value} of @i{place}). ++ ++@subsubheading Description:: ++ ++@b{push} prepends @i{item} to the @i{list} that is stored ++in @i{place}, stores the resulting @i{list} in @i{place}, ++and returns the @i{list}. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{place}, ++see @ref{Evaluation of Subforms to Places}. ++ ++@subsubheading Examples:: ++@example ++ (setq llst '(nil)) @result{} (NIL) ++ (push 1 (car llst)) @result{} (1) ++ llst @result{} ((1)) ++ (push 1 (car llst)) @result{} (1 1) ++ llst @result{} ((1 1)) ++ (setq x '(a (b c) d)) @result{} (A (B C) D) ++ (push 5 (cadr x)) @result{} (5 B C) ++ x @result{} (A (5 B C) D) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The contents of @i{place} are modified. ++ ++@subsubheading See Also:: ++ ++@ref{pop} ++, ++@ref{pushnew} ++, ++@ref{Generalized Reference} ++ ++@subsubheading Notes:: ++The effect of @t{(push @i{item} @i{place})} ++is equivalent to ++ ++@example ++ (setf place (cons @i{item} @i{place})) ++@end example ++ ++except that the @i{subforms} of @i{place} ++are evaluated only once, and @i{item} is evaluated ++before @i{place}. ++ ++@node pop, first, push, Conses Dictionary ++@subsection pop [Macro] ++ ++@code{pop} @i{place} @result{} @i{element} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}, the @i{value} of which is a @i{list} ++ (possibly, but necessarily, a @i{dotted list} or @i{circular list}). ++ ++@i{element}---an @i{object} (the @i{car} of the contents of @i{place}). ++ ++@subsubheading Description:: ++ ++@b{pop} @i{reads} the @i{value} of @i{place}, ++remembers the @i{car} of the @i{list} which was retrieved, ++@i{writes} the @i{cdr} of the @i{list} back into the @i{place}, ++and finally @i{yields} the @i{car} of the originally retrieved @i{list}. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{place}, ++see @ref{Evaluation of Subforms to Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq stack '(a b c)) @result{} (A B C) ++ (pop stack) @result{} A ++ stack @result{} (B C) ++ (setq llst '((1 2 3 4))) @result{} ((1 2 3 4)) ++ (pop (car llst)) @result{} 1 ++ llst @result{} ((2 3 4)) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The contents of @i{place} are modified. ++ ++@subsubheading See Also:: ++ ++@ref{push} ++, ++@ref{pushnew} ++, ++@ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++The effect of @t{(pop @i{place})} is roughly equivalent to ++ ++@example ++ (prog1 (car @i{place}) (setf @i{place} (cdr @i{place}))) ++@end example ++ ++except that the latter would evaluate any @i{subforms} of @i{place} ++three times, while @b{pop} evaluates them only once. ++ ++@node first, nth, pop, Conses Dictionary ++@subsection first, second, third, fourth, fifth, ++@subheading sixth, seventh, eighth, ninth, tenth ++@flushright ++@i{[Accessor]} ++@end flushright ++ ++@code{first} @i{list} @result{} @i{object} ++(setf (@code{first} @i{list}) new-object)@* ++ ++@code{second} @i{list} @result{} @i{object} ++(setf (@code{second} @i{list}) new-object)@* ++ ++@code{third} @i{list} @result{} @i{object} ++(setf (@code{third} @i{list}) new-object)@* ++ ++@code{fourth} @i{list} @result{} @i{object} ++(setf (@code{fourth} @i{list}) new-object)@* ++ ++@code{fifth} @i{list} @result{} @i{object} ++(setf (@code{fifth} @i{list}) new-object)@* ++ ++@code{sixth} @i{list} @result{} @i{object} ++(setf (@code{sixth} @i{list}) new-object)@* ++ ++@code{seventh} @i{list} @result{} @i{object} ++(setf (@code{seventh} @i{list}) new-object)@* ++ ++@code{eighth} @i{list} @result{} @i{object} ++(setf (@code{eighth} @i{list}) new-object)@* ++ ++@code{ninth} @i{list} @result{} @i{object} ++(setf (@code{ninth} @i{list}) new-object)@* ++ ++@code{tenth} @i{list} @result{} @i{object} ++(setf (@code{tenth} @i{list}) new-object)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} or a @i{circular list}. ++ ++@i{object}, @i{new-object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The functions ++@b{first}, ++@b{second}, ++@b{third}, ++@b{fourth}, ++@b{fifth}, ++@b{sixth}, ++@b{seventh}, ++@b{eighth}, ++@b{ninth}, ++and ++@b{tenth} ++@i{access} the first, second, third, fourth, fifth, sixth, seventh, eighth, ++ninth, and tenth @i{elements} of @i{list}, respectively. ++Specifically, ++ ++@example ++ (first @i{list}) @equiv{} (car @i{list}) ++ (second @i{list}) @equiv{} (car (cdr @i{list})) ++ (third @i{list}) @equiv{} (car (cddr @i{list})) ++ (fourth @i{list}) @equiv{} (car (cdddr @i{list})) ++ (fifth @i{list}) @equiv{} (car (cddddr @i{list})) ++ (sixth @i{list}) @equiv{} (car (cdr (cddddr @i{list}))) ++ (seventh @i{list}) @equiv{} (car (cddr (cddddr @i{list}))) ++ (eighth @i{list}) @equiv{} (car (cdddr (cddddr @i{list}))) ++ (ninth @i{list}) @equiv{} (car (cddddr (cddddr @i{list}))) ++ (tenth @i{list}) @equiv{} (car (cdr (cddddr (cddddr @i{list})))) ++@end example ++ ++@b{setf} can also be used with any of these functions to change an ++existing component. The same equivalences apply. For example: ++ ++@example ++ (setf (fifth @i{list}) @i{new-object}) @equiv{} (setf (car (cddddr @i{list})) @i{new-object}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (setq lst '(1 2 3 (4 5 6) ((V)) vi 7 8 9 10)) ++@result{} (1 2 3 (4 5 6) ((V)) VI 7 8 9 10) ++ (first lst) @result{} 1 ++ (tenth lst) @result{} 10 ++ (fifth lst) @result{} ((V)) ++ (second (fourth lst)) @result{} 5 ++ (sixth '(1 2 3)) @result{} NIL ++ (setf (fourth lst) "four") @result{} "four" ++ lst @result{} (1 2 3 "four" ((V)) VI 7 8 9 10) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{car} ++, ++@ref{nth} ++ ++@subsubheading Notes:: ++ ++@b{first} is functionally equivalent to @b{car}, ++@b{second} is functionally equivalent to @b{cadr}, ++@b{third} is functionally equivalent to @b{caddr}, and ++@b{fourth} is functionally equivalent to @b{cadddr}. ++ ++The ordinal numbering used here is one-origin, ++as opposed to the zero-origin numbering used by @b{nth}: ++ ++@example ++ (fifth x) @equiv{} (nth 4 x) ++@end example ++ ++@node nth, endp, first, Conses Dictionary ++@subsection nth [Accessor] ++ ++@code{nth} @i{n list} @result{} @i{object} ++ ++(setf (@code{ nth} @i{n list}) new-object)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{n}---a non-negative @i{integer}. ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} or a @i{circular list}. ++ ++@i{object}---an @i{object}. ++ ++@i{new-object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{nth} locates the @i{n}th element of @i{list}, ++where the @i{car} of the @i{list} is the ``zeroth'' element. ++ ++Specifically, ++ ++@example ++ (nth @i{n} @i{list}) @equiv{} (car (nthcdr @i{n} @i{list})) ++@end example ++ ++@b{nth} may be used to specify a @i{place} to @b{setf}. ++ ++Specifically, ++ ++@example ++ (setf (nth @i{n} @i{list}) @i{new-object}) @equiv{} (setf (car (nthcdr @i{n} @i{list})) @i{new-object}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (nth 0 '(foo bar baz)) @result{} FOO ++ (nth 1 '(foo bar baz)) @result{} BAR ++ (nth 3 '(foo bar baz)) @result{} NIL ++ (setq 0-to-3 (list 0 1 2 3)) @result{} (0 1 2 3) ++ (setf (nth 2 0-to-3) "two") @result{} "two" ++ 0-to-3 @result{} (0 1 "two" 3) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{elt} ++, ++@ref{first} ++, ++@ref{nthcdr} ++ ++@node endp, null, nth, Conses Dictionary ++@subsection endp [Function] ++ ++@code{endp} @i{list} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} or a @i{circular list}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{list} is the @i{empty list}. ++Returns @i{false} if @i{list} is a @i{cons}. ++ ++@subsubheading Examples:: ++ ++@example ++ (endp nil) @result{} @i{true} ++ (endp '(1 2)) @result{} @i{false} ++ (endp (cddr '(1 2))) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{list} is not a @i{list}. ++ ++@subsubheading Notes:: ++ ++The purpose of @b{endp} is to test for the end of @i{proper list}. ++Since @b{endp} does not descend into a @i{cons}, ++it is well-defined to pass it a @i{dotted list}. ++However, if shorter ``lists'' are iteratively produced ++by calling @b{cdr} on such a @i{dotted list} ++and those ``lists'' are tested with @b{endp}, ++a situation that has undefined consequences will eventually result ++when the @i{non-nil} @i{atom} (which is not in fact a @i{list}) ++finally becomes the argument to @b{endp}. ++Since this is the usual way in which @b{endp} is used, ++it is conservative programming style ++and consistent with the intent of @b{endp} ++to treat @b{endp} as simply a function on @i{proper lists} ++which happens not to enforce an argument type of @i{proper list} except ++when the argument is @i{atomic}. ++ ++@node null, nconc, endp, Conses Dictionary ++@subsection null [Function] ++ ++@code{null} @i{object} @result{} @i{boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{boolean}---a @i{boolean}. ++ ++@subsubheading Description:: ++ ++Returns @b{t} if @i{object} is the @i{empty list}; ++otherwise, returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (null '()) @result{} T ++ (null nil) @result{} T ++ (null t) @result{} NIL ++ (null 1) @result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{not} ++ ++@subsubheading Notes:: ++ ++@b{null} is intended to be used to test for the @i{empty list} ++whereas @b{not} is intended to be used to invert a @i{boolean} ++(or @i{generalized boolean}). ++Operationally, @b{null} and @b{not} compute the same result; ++which to use is a matter of style. ++ ++@example ++ (null @i{object}) @equiv{} (typep @i{object} 'null) @equiv{} (eq @i{object} '@t{()}) ++@end example ++ ++@node nconc, append, null, Conses Dictionary ++@subsection nconc [Function] ++ ++@code{nconc} @i{@r{&rest} lists} @result{} @i{concatenated-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---each but the last must be a @i{list} ++ (which might be a @i{dotted list} but must not be a @i{circular list}); ++ the last @i{list} may be any @i{object}. ++ ++@i{concatenated-list}---a @i{list}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} that is the concatenation of @i{lists}. ++If no @i{lists} are supplied, @t{(nconc)} returns @b{nil}. ++ ++@b{nconc} is defined using the following recursive relationship: ++ ++@example ++ (nconc) @result{} () ++ (nconc nil . @i{lists}) @equiv{} (nconc . @i{lists}) ++ (nconc @i{list}) @result{} @i{list} ++ (nconc @i{list-1} @i{list-2}) @equiv{} (progn (rplacd (last @i{list-1}) @i{list-2}) @i{list-1}) ++ (nconc @i{list-1} @i{list-2} . @i{lists}) @equiv{} (nconc (nconc @i{list-1} @i{list-2}) . @i{lists}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (nconc) @result{} NIL ++ (setq x '(a b c)) @result{} (A B C) ++ (setq y '(d e f)) @result{} (D E F) ++ (nconc x y) @result{} (A B C D E F) ++ x @result{} (A B C D E F) ++@end example ++ ++Note, in the example, that the value of @t{x} is now different, ++since its last @i{cons} ++has been @b{rplacd}'d to the value of @t{y}. ++If @t{(nconc x y)} were evaluated again, ++it would yield a piece of a @i{circular list}, ++whose printed representation would be ++@t{(A B C D E F D E F D E F ...)}, repeating forever; ++if the @b{*print-circle*} switch were @i{non-nil}, ++it would be printed as @t{(A B C . #1=(D E F . #1#))}. ++ ++@example ++ (setq foo (list 'a 'b 'c 'd 'e) ++ bar (list 'f 'g 'h 'i 'j) ++ baz (list 'k 'l 'm)) @result{} (K L M) ++ (setq foo (nconc foo bar baz)) @result{} (A B C D E F G H I J K L M) ++ foo @result{} (A B C D E F G H I J K L M) ++ bar @result{} (F G H I J K L M) ++ baz @result{} (K L M) ++ ++ (setq foo (list 'a 'b 'c 'd 'e) ++ bar (list 'f 'g 'h 'i 'j) ++ baz (list 'k 'l 'm)) @result{} (K L M) ++ (setq foo (nconc nil foo bar nil baz)) @result{} (A B C D E F G H I J K L M) ++ foo @result{} (A B C D E F G H I J K L M) ++ bar @result{} (F G H I J K L M) ++ baz @result{} (K L M) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{lists} are modified rather than copied. ++ ++@subsubheading See Also:: ++ ++@ref{append} ++, ++@ref{concatenate} ++ ++@node append, revappend, nconc, Conses Dictionary ++@subsection append [Function] ++ ++@code{append} @i{@r{&rest} lists} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---each must be a @i{proper list} except the last, ++ which may be any @i{object}. ++ ++@i{result}---an @i{object}. This will be a @i{list} ++ unless the last @i{list} was not a @i{list} ++ and all preceding @i{lists} were @i{null}. ++ ++@subsubheading Description:: ++ ++@b{append} returns a new @i{list} that is the concatenation of ++the copies. @i{lists} are left unchanged; the @i{list structure} ++of each of @i{lists} except the last is copied. ++The last argument is not copied; it becomes the @i{cdr} of the ++final @i{dotted pair} of the concatenation of the preceding @i{lists}, ++or is returned directly if there are no preceding ++@i{non-empty} ++@i{lists}. ++ ++@subsubheading Examples:: ++ ++@example ++ (append '(a b c) '(d e f) '() '(g)) @result{} (A B C D E F G) ++ (append '(a b c) 'd) @result{} (A B C . D) ++ (setq lst '(a b c)) @result{} (A B C) ++ (append lst '(d)) @result{} (A B C D) ++ lst @result{} (A B C) ++ (append) @result{} NIL ++ (append 'a) @result{} A ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{nconc} ++, ++@ref{concatenate} ++ ++@node revappend, butlast, append, Conses Dictionary ++@subsection revappend, nreconc [Function] ++ ++@code{revappend} @i{list tail} @result{} @i{result-list} ++ ++@code{nreconc} @i{list tail} @result{} @i{result-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{proper list}. ++ ++@i{tail}---an @i{object}. ++ ++@i{result-list}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{revappend} constructs a @i{copy}_2 of @i{list}, ++but with the @i{elements} in reverse order. It then appends (as if ++by @b{nconc}) the @i{tail} to that reversed list and returns the result. ++ ++@b{nreconc} reverses the order of @i{elements} in @i{list} ++(as if by @b{nreverse}). It then appends (as if by @b{nconc}) ++the @i{tail} to that reversed list and returns the result. ++ ++The resulting @i{list} shares @i{list structure} with @i{tail}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((list-1 (list 1 2 3)) ++ (list-2 (list 'a 'b 'c))) ++ (print (revappend list-1 list-2)) ++ (print (equal list-1 '(1 2 3))) ++ (print (equal list-2 '(a b c)))) ++@t{ |> } (3 2 1 A B C) ++@t{ |> } T ++@t{ |> } T ++@result{} T ++ ++ (revappend '(1 2 3) '()) @result{} (3 2 1) ++ (revappend '(1 2 3) '(a . b)) @result{} (3 2 1 A . B) ++ (revappend '() '(a b c)) @result{} (A B C) ++ (revappend '(1 2 3) 'a) @result{} (3 2 1 . A) ++ (revappend '() 'a) @result{} A ;degenerate case ++ ++ (let ((list-1 '(1 2 3)) ++ (list-2 '(a b c))) ++ (print (nreconc list-1 list-2)) ++ (print (equal list-1 '(1 2 3))) ++ (print (equal list-2 '(a b c)))) ++@t{ |> } (3 2 1 A B C) ++@t{ |> } NIL ++@t{ |> } T ++@result{} T ++ ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{revappend} does not modify either of its @i{arguments}. ++@b{nreconc} is permitted to modify @i{list} but not @i{tail}. ++ ++Although it might be implemented differently, ++@b{nreconc} is constrained to have side-effect behavior equivalent to: ++ ++@example ++ (nconc (nreverse @i{list}) @i{tail}) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{reverse} ++, ++@b{nreverse}, ++@ref{nconc} ++ ++@subsubheading Notes:: ++ ++The following functional equivalences are true, ++although good @i{implementations} will typically use a faster algorithm for ++achieving the same effect: ++ ++@example ++ (revappend @i{list} @i{tail}) @equiv{} (nconc (reverse @i{list}) @i{tail}) ++ (nreconc @i{list} @i{tail}) @equiv{} (nconc (nreverse @i{list}) @i{tail}) ++@end example ++ ++@node butlast, last, revappend, Conses Dictionary ++@subsection butlast, nbutlast [Function] ++ ++@code{butlast} @i{list @r{&optional} n} @result{} @i{result-list} ++ ++@code{nbutlast} @i{list @r{&optional} n} @result{} @i{result-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} but must not be a @i{circular list}. ++ ++@i{n}---a non-negative @i{integer}. ++ ++@i{result-list}---a @i{list}. ++ ++@subsubheading Description:: ++ ++@b{butlast} returns a copy of @i{list} from which the last ++@i{n} ++ ++conses ++ ++have been omitted. ++If @i{n} is not supplied, its value is 1. ++If there are fewer than @i{n} ++ ++conses ++ ++in @i{list}, ++@b{nil} is returned and, in the case of @b{nbutlast}, ++@i{list} is not modified. ++ ++@b{nbutlast} is like @b{butlast}, but @b{nbutlast} ++may modify @i{list}. ++It changes the @i{cdr} of ++the @i{cons} @i{n}+1 from the end of the @i{list} to @b{nil}. ++ ++@subsubheading Examples:: ++@example ++ (setq lst '(1 2 3 4 5 6 7 8 9)) @result{} (1 2 3 4 5 6 7 8 9) ++ (butlast lst) @result{} (1 2 3 4 5 6 7 8) ++ (butlast lst 5) @result{} (1 2 3 4) ++ (butlast lst (+ 5 5)) @result{} NIL ++ lst @result{} (1 2 3 4 5 6 7 8 9) ++ (nbutlast lst 3) @result{} (1 2 3 4 5 6) ++ lst @result{} (1 2 3 4 5 6) ++ (nbutlast lst 99) @result{} NIL ++ lst @result{} (1 2 3 4 5 6) ++ (butlast '(a b c d)) @result{} (A B C) ++ (butlast '((a b) (c d))) @result{} ((A B)) ++ (butlast '(a)) @result{} NIL ++ (butlast nil) @result{} NIL ++ (setq foo (list 'a 'b 'c 'd)) @result{} (A B C D) ++ (nbutlast foo) @result{} (A B C) ++ foo @result{} (A B C) ++ (nbutlast (list 'a)) @result{} NIL ++ (nbutlast '()) @result{} NIL ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{list} is not a @i{proper list} or a @i{dotted list}. ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{n} is not a non-negative @i{integer}. ++ ++@subsubheading Notes:: ++ ++@example ++ (butlast @i{list} @i{n}) @equiv{} (ldiff @i{list} (last @i{list} @i{n})) ++@end example ++ ++@node last, ldiff, butlast, Conses Dictionary ++@subsection last [Function] ++ ++@code{last} @i{list @r{&optional} n} @result{} @i{tail} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} but must not be a @i{circular list}. ++ ++@i{n}---a non-negative @i{integer}. ++ The default is @t{1}. ++ ++@i{tail}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{last} returns the last @i{n} @i{conses} ++ (not the last @i{n} elements) of @i{list}). ++If @i{list} is @t{()}, @b{last} returns @t{()}. ++ ++If @i{n} is zero, ++ the atom that terminates @i{list} is returned. ++If @i{n} is greater than or equal to the number of @i{cons} cells in @i{list}, ++ the result is @i{list}. ++ ++@subsubheading Examples:: ++ ++@example ++ (last nil) @result{} NIL ++ (last '(1 2 3)) @result{} (3) ++ (last '(1 2 . 3)) @result{} (2 . 3) ++ (setq x (list 'a 'b 'c 'd)) @result{} (A B C D) ++ (last x) @result{} (D) ++ (rplacd (last x) (list 'e 'f)) x @result{} (A B C D E F) ++ (last x) @result{} (F) ++ ++ (last '(a b c)) @result{} (C) ++ ++ (last '(a b c) 0) @result{} () ++ (last '(a b c) 1) @result{} (C) ++ (last '(a b c) 2) @result{} (B C) ++ (last '(a b c) 3) @result{} (A B C) ++ (last '(a b c) 4) @result{} (A B C) ++ ++ (last '(a . b) 0) @result{} B ++ (last '(a . b) 1) @result{} (A . B) ++ (last '(a . b) 2) @result{} (A . B) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if @i{list} is a @i{circular list}. ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{n} is not a non-negative @i{integer}. ++ ++@subsubheading See Also:: ++ ++@ref{butlast} ++, ++@ref{nth} ++ ++@subsubheading Notes:: ++ ++The following code could be used to define @b{last}. ++ ++@example ++ (defun last (list &optional (n 1)) ++ (check-type n (integer 0)) ++ (do ((l list (cdr l)) ++ (r list) ++ (i 0 (+ i 1))) ++ ((atom l) r) ++ (if (>= i n) (pop r)))) ++@end example ++ ++@node ldiff, nthcdr, last, Conses Dictionary ++@subsection ldiff, tailp [Function] ++ ++@code{ldiff} @i{list object} @result{} @i{result-list} ++ ++@code{tailp} @i{object list} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list}. ++ ++@i{object}---an @i{object}. ++ ++@i{result-list}---a @i{list}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++If @i{object} is the @i{same} as some @i{tail} of @i{list}, ++@b{tailp} returns @i{true}; ++otherwise, it returns @i{false}. ++ ++If @i{object} is the @i{same} as some @i{tail} of @i{list}, ++@b{ldiff} returns a @i{fresh} @i{list} ++of the @i{elements} of @i{list} ++that precede @b{object} in the @i{list structure} of @i{list}; ++otherwise, it returns a @i{copy}_2 of @i{list}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((lists '#((a b c) (a b c . d)))) ++ (dotimes (i (length lists)) () ++ (let ((list (aref lists i))) ++ (format t "~2&list=~S ~21T(tailp object list)~ ++ ~44T(ldiff list object)~ ++ (let ((objects (vector list (cddr list) (copy-list (cddr list)) ++ '(f g h) '() 'd 'x))) ++ (dotimes (j (length objects)) () ++ (let ((object (aref objects j))) ++ (format t "~& object=~S ~21T~S ~44T~S" ++ object (tailp object list) (ldiff list object)))))))) ++@t{ |> } ++@t{ |> } list=(A B C) (tailp object list) (ldiff list object) ++@t{ |> } object=(A B C) T NIL ++@t{ |> } object=(C) T (A B) ++@t{ |> } object=(C) NIL (A B C) ++@t{ |> } object=(F G H) NIL (A B C) ++@t{ |> } object=NIL T (A B C) ++@t{ |> } object=D NIL (A B C) ++@t{ |> } object=X NIL (A B C) ++@t{ |> } ++@t{ |> } list=(A B C . D) (tailp object list) (ldiff list object) ++@t{ |> } object=(A B C . D) T NIL ++@t{ |> } object=(C . D) T (A B) ++@t{ |> } object=(C . D) NIL (A B C . D) ++@t{ |> } object=(F G H) NIL (A B C . D) ++@t{ |> } object=NIL NIL (A B C . D) ++@t{ |> } object=D T (A B C) ++@t{ |> } object=X NIL (A B C . D) ++@result{} NIL ++@end example ++ ++@subsubheading Side Effects:: ++ ++Neither @b{ldiff} nor @b{tailp} modifies either of its @i{arguments}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list} is not a @i{proper list} or a @i{dotted list}. ++ ++@subsubheading See Also:: ++ ++@ref{set-difference} ++ ++@subsubheading Notes:: ++ ++If the @i{list} is a @i{circular list}, ++@b{tailp} will reliably @i{yield} a @i{value} ++only if the given @i{object} is in fact a @i{tail} of @i{list}. ++Otherwise, the consequences are unspecified: ++a given @i{implementation} which detects the circularity must return @i{false}, ++but since an @i{implementation} is not obliged to detect such a @i{situation}, ++@b{tailp} might just loop indefinitely without returning in that case. ++ ++@b{tailp} could be defined as follows: ++ ++@example ++ (defun tailp (object list) ++ (do ((list list (cdr list))) ++ ((atom list) (eql list object)) ++ (if (eql object list) ++ (return t)))) ++@end example ++ ++and @b{ldiff} could be defined by: ++ ++@example ++(defun ldiff (list object) ++ (do ((list list (cdr list)) ++ (r '() (cons (car list) r))) ++ ((atom list) ++ (if (eql list object) (nreverse r) (nreconc r list))) ++ (when (eql object list) ++ (return (nreverse r))))) ++@end example ++ ++@node nthcdr, rest, ldiff, Conses Dictionary ++@subsection nthcdr [Function] ++ ++@code{nthcdr} @i{n list} @result{} @i{tail} ++ ++@subsubheading Arguments and Values:: ++ ++@i{n}---a non-negative @i{integer}. ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} or a @i{circular list}. ++ ++@i{tail}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Returns the @i{tail} of @i{list} that would be obtained by calling @b{cdr} ++@i{n} times in succession. ++ ++@subsubheading Examples:: ++ ++@example ++ (nthcdr 0 '()) @result{} NIL ++ (nthcdr 3 '()) @result{} NIL ++ (nthcdr 0 '(a b c)) @result{} (A B C) ++ (nthcdr 2 '(a b c)) @result{} (C) ++ (nthcdr 4 '(a b c)) @result{} () ++ (nthcdr 1 '(0 . 1)) @result{} 1 ++ ++ (locally (declare (optimize (safety 3))) ++ (nthcdr 3 '(0 . 1))) ++ Error: Attempted to take CDR of 1. ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{n} is not a non-negative @i{integer}. ++ ++For @i{n} being an integer greater than @t{1}, ++the error checking done by @t{(nthcdr @i{n} @i{list})} ++is the same as for @t{(nthcdr (- @i{n} 1) (cdr @i{list}))}; ++see the @i{function} @b{cdr}. ++ ++@subsubheading See Also:: ++ ++@b{cdr}, ++@ref{nth} ++, ++@ref{rest} ++ ++@node rest, member (Function), nthcdr, Conses Dictionary ++@subsection rest [Accessor] ++ ++@code{rest} @i{list} @result{} @i{tail} ++ ++(setf (@code{ rest} @i{list}) new-tail)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}, ++ ++ which might be a @i{dotted list} or a @i{circular list}. ++ ++@i{tail}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{rest} performs the same operation as @b{cdr}, ++but mnemonically complements @b{first}. ++Specifically, ++ ++@example ++ (rest @i{list}) @equiv{} (cdr @i{list}) ++ (setf (rest @i{list}) @i{new-tail}) @equiv{} (setf (cdr @i{list}) @i{new-tail}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (rest '(1 2)) @result{} (2) ++ (rest '(1 . 2)) @result{} 2 ++ (rest '(1)) @result{} NIL ++ (setq *cons* '(1 . 2)) @result{} (1 . 2) ++ (setf (rest *cons*) "two") @result{} "two" ++ *cons* @result{} (1 . "two") ++@end example ++ ++@subsubheading See Also:: ++ ++@b{cdr}, ++@ref{nthcdr} ++ ++@subsubheading Notes:: ++ ++@b{rest} is often preferred stylistically over @b{cdr} ++when the argument is to being subjectively viewed as a @i{list} ++rather than as a @i{cons}. ++ ++@node member (Function), mapc, rest, Conses Dictionary ++@subsection member, member-if, member-if-not [Function] ++ ++@code{member} @i{item list @r{&key} key test test-not} @result{} @i{tail} ++ ++@code{member-if} @i{predicate list @r{&key} key} @result{} @i{tail} ++ ++@code{member-if-not} @i{predicate list @r{&key} key} @result{} @i{tail} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{list}---a @i{proper list}. ++ ++@i{predicate}---a @i{designator} for ++ a @i{function} of one @i{argument} ++ that returns a @i{generalized boolean}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{tail}---a @i{list}. ++ ++@subsubheading Description:: ++ ++@b{member}, @b{member-if}, and @b{member-if-not} each ++search @i{list} for @i{item} or for a top-level element that ++@i{satisfies the test}. The argument to the @i{predicate} function ++is an element of @i{list}. ++ ++If some element @i{satisfies the test}, ++the tail of @i{list} beginning ++with this element is returned; otherwise @b{nil} is returned. ++ ++@i{list} is searched on the top level only. ++ ++@subsubheading Examples:: ++ ++@example ++ (member 2 '(1 2 3)) @result{} (2 3) ++ (member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) @result{} ((3 . 4)) ++ (member 'e '(a b c d)) @result{} NIL ++@end example ++ ++@example ++ (member-if #'listp '(a b nil c d)) @result{} (NIL C D) ++ (member-if #'numberp '(a #\Space 5/3 foo)) @result{} (5/3 FOO) ++ (member-if-not #'zerop ++ '(3 6 9 11 . 12) ++ :key #'(lambda (x) (mod x 3))) @result{} (11 . 12) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list} is not a @i{proper list}. ++ ++@subsubheading See Also:: ++ ++@ref{find} ++, ++@ref{position} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++The @i{function} @b{member-if-not} is deprecated. ++ ++In the following ++ ++@example ++ (member 'a '(g (a y) c a d e a f)) @result{} (A D E A F) ++@end example ++ ++the value returned by @b{member} is @i{identical} to the portion ++of the @i{list} beginning with @t{a}. Thus @b{rplaca} on the ++result of @b{member} can be used to alter the part of the @i{list} ++where @t{a} was found (assuming a check has been made that @b{member} ++did not return @b{nil}). ++ ++@node mapc, acons, member (Function), Conses Dictionary ++@subsection mapc, mapcar, mapcan, mapl, maplist, mapcon [Function] ++ ++@code{mapc} @i{function @r{&rest} lists^+} @result{} @i{list-1} ++ ++@code{mapcar} @i{function @r{&rest} lists^+} @result{} @i{result-list} ++ ++@code{mapcan} @i{function @r{&rest} lists^+} @result{} @i{concatenated-results} ++ ++@code{mapl} @i{function @r{&rest} lists^+} @result{} @i{list-1} ++ ++@code{maplist} @i{function @r{&rest} lists^+} @result{} @i{result-list} ++ ++@code{mapcon} @i{function @r{&rest} lists^+} @result{} @i{concatenated-results} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{designator} for a @i{function} ++ that must take as many @i{arguments} as there are @i{lists}. ++ ++@i{list}---a @i{proper list}. ++ ++@i{list-1}---the first @i{list} (which must be a @i{proper list}). ++ ++@i{result-list}---a @i{list}. ++ ++@i{concatenated-results}---a @i{list}. ++ ++@subsubheading Description:: ++ ++The mapping operation involves applying @i{function} to ++successive sets of arguments in which ++one argument is obtained from each @i{sequence}. ++Except for @b{mapc} and @b{mapl}, ++the result contains the results returned by @i{function}. ++In the cases of @b{mapc} and @b{mapl}, ++the resulting @i{sequence} is @i{list}. ++ ++@i{function} is called ++first on all the elements with index @t{0}, then on all those ++with index @t{1}, and so on. ++@i{result-type} specifies the @i{type} of ++the ++resulting @i{sequence}. ++ ++If @i{function} is a @i{symbol}, it is @b{coerce}d ++to a @i{function} as if by @b{symbol-function}. ++ ++@b{mapcar} operates on successive @i{elements} of the @i{lists}. ++@i{function} is applied to the first @i{element} of each @i{list}, ++then to the second @i{element} of each @i{list}, and so on. ++The iteration terminates when the shortest @i{list} runs out, ++and excess elements in other lists are ignored. ++The value returned by @b{mapcar} is a @i{list} ++of the results of successive calls to @i{function}. ++ ++@b{mapc} is like @b{mapcar} except that the results of ++applying @i{function} are not accumulated. ++The @i{list} argument is returned. ++ ++@b{maplist} is like @b{mapcar} except that ++@i{function} is applied to successive sublists of the @i{lists}. ++@i{function} ++is first applied to the @i{lists} themselves, ++and then to the @i{cdr} of each ++@i{list}, and then to the @i{cdr} of the @i{cdr} ++of each @i{list}, and so on. ++ ++@b{mapl} is like @b{maplist} except that the results of ++applying @i{function} are not accumulated; ++@i{list-1} is returned. ++ ++@b{mapcan} and @b{mapcon} are like @b{mapcar} and ++@b{maplist} respectively, except that the results of ++applying @i{function} are combined ++into a @i{list} by the use of @b{nconc} ++rather than @b{list}. ++That is, ++ ++@example ++ (mapcon f x1 ... xn) ++ @equiv{} (apply #'nconc (maplist f x1 ... xn)) ++@end example ++ ++and similarly for the relationship between @b{mapcan} ++and @b{mapcar}. ++ ++@subsubheading Examples:: ++ ++@example ++ (mapcar #'car '((1 a) (2 b) (3 c))) @result{} (1 2 3) ++ (mapcar #'abs '(3 -4 2 -5 -6)) @result{} (3 4 2 5 6) ++ (mapcar #'cons '(a b c) '(1 2 3)) @result{} ((A . 1) (B . 2) (C . 3)) ++ ++ (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3)) ++@result{} ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3)) ++ (maplist #'(lambda (x) (cons 'foo x)) '(a b c d)) ++@result{} ((FOO A B C D) (FOO B C D) (FOO C D) (FOO D)) ++ (maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c)) ++@result{} (0 0 1 0 1 1 1) ++;An entry is 1 if the corresponding element of the input ++; list was the last instance of that element in the input list. ++ ++ (setq dummy nil) @result{} NIL ++ (mapc #'(lambda (&rest x) (setq dummy (append dummy x))) ++ '(1 2 3 4) ++ '(a b c d e) ++ '(x y z)) @result{} (1 2 3 4) ++ dummy @result{} (1 A X 2 B Y 3 C Z) ++ ++ (setq dummy nil) @result{} NIL ++ (mapl #'(lambda (x) (push x dummy)) '(1 2 3 4)) @result{} (1 2 3 4) ++ dummy @result{} ((4) (3 4) (2 3 4) (1 2 3 4)) ++ ++ (mapcan #'(lambda (x y) (if (null x) nil (list x y))) ++ '(nil nil nil d e) ++ '(1 2 3 4 5 6)) @result{} (D 4 E 5) ++ (mapcan #'(lambda (x) (and (numberp x) (list x))) ++ '(a 1 b c 3 4 d 5)) ++@result{} (1 3 4 5) ++@end example ++ ++In this case the function serves as a filter; ++this is a standard @r{Lisp} idiom using @b{mapcan}. ++ ++@example ++ (mapcon #'list '(1 2 3 4)) @result{} ((1 2 3 4) (2 3 4) (3 4) (4)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if any @i{list} is not a @i{proper list}. ++ ++@subsubheading See Also:: ++ ++@ref{dolist} ++, ++@ref{map} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node acons, assoc, mapc, Conses Dictionary ++@subsection acons [Function] ++ ++@code{acons} @i{key datum alist} @result{} @i{new-alist} ++ ++@subsubheading Arguments and Values:: ++ ++@i{key}---an @i{object}. ++ ++@i{datum}---an @i{object}. ++ ++@i{alist}---an @i{association list}. ++ ++@i{new-alist}---an @i{association list}. ++ ++@subsubheading Description:: ++ ++Creates a @i{fresh} @i{cons}, ++the @i{cdr} of which is @i{alist} and ++the @i{car} of which is another @i{fresh} @i{cons}, ++ the @i{car} of which is @i{key} and ++ the @i{cdr} of which is @i{datum}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq alist '()) @result{} NIL ++ (acons 1 "one" alist) @result{} ((1 . "one")) ++ alist @result{} NIL ++ (setq alist (acons 1 "one" (acons 2 "two" alist))) @result{} ((1 . "one") (2 . "two")) ++ (assoc 1 alist) @result{} (1 . "one") ++ (setq alist (acons 1 "uno" alist)) @result{} ((1 . "uno") (1 . "one") (2 . "two")) ++ (assoc 1 alist) @result{} (1 . "uno") ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{assoc} ++, ++@ref{pairlis} ++ ++@subsubheading Notes:: ++ ++@example ++(acons @i{key} @i{datum} @i{alist}) @equiv{} (cons (cons @i{key} @i{datum}) @i{alist}) ++@end example ++ ++@node assoc, copy-alist, acons, Conses Dictionary ++@subsection assoc, assoc-if, assoc-if-not [Function] ++ ++@code{assoc} @i{item alist @r{&key} key test test-not} @result{} @i{entry} ++ ++@code{assoc-if} @i{predicate alist @r{&key} key} @result{} @i{entry} ++ ++@code{assoc-if-not} @i{predicate alist @r{&key} key} @result{} @i{entry} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{alist}---an @i{association list}. ++ ++@i{predicate}---a @i{designator} for ++ a @i{function} of one @i{argument} ++ that returns a @i{generalized boolean}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{entry}---a @i{cons} that is an @i{element} of @i{alist}, ++ or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{assoc}, @b{assoc-if}, and @b{assoc-if-not} ++return the first @i{cons} in @i{alist} whose @i{car} @i{satisfies the test}, ++or @b{nil} if no such @i{cons} is found. ++ ++For @b{assoc}, @b{assoc-if}, and @b{assoc-if-not}, if @b{nil} appears ++in @i{alist} in place of a pair, it is ignored. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq values '((x . 100) (y . 200) (z . 50))) @result{} ((X . 100) (Y . 200) (Z . 50)) ++ (assoc 'y values) @result{} (Y . 200) ++ (rplacd (assoc 'y values) 201) @result{} (Y . 201) ++ (assoc 'y values) @result{} (Y . 201) ++ (setq alist '((1 . "one")(2 . "two")(3 . "three"))) ++@result{} ((1 . "one") (2 . "two") (3 . "three")) ++ (assoc 2 alist) @result{} (2 . "two") ++ (assoc-if #'evenp alist) @result{} (2 . "two") ++ (assoc-if-not #'(lambda(x) (< x 3)) alist) @result{} (3 . "three") ++ (setq alist '(("one" . 1)("two" . 2))) @result{} (("one" . 1) ("two" . 2)) ++ (assoc "one" alist) @result{} NIL ++ (assoc "one" alist :test #'equalp) @result{} ("one" . 1) ++ (assoc "two" alist :key #'(lambda(x) (char x 2))) @result{} NIL ++ (assoc #\o alist :key #'(lambda(x) (char x 2))) @result{} ("two" . 2) ++ (assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z))) @result{} (R . X) ++ (assoc 'goo '((foo . bar) (zoo . goo))) @result{} NIL ++ (assoc '2 '((1 a b c) (2 b c d) (-7 x y z))) @result{} (2 B C D) ++ (setq alist '(("one" . 1) ("2" . 2) ("three" . 3))) ++@result{} (("one" . 1) ("2" . 2) ("three" . 3)) ++ (assoc-if-not #'alpha-char-p alist ++ :key #'(lambda (x) (char x 0))) @result{} ("2" . 2) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{alist} is not an @i{association list}. ++ ++@subsubheading See Also:: ++ ++@ref{rassoc} ++, ++@ref{find} ++, ++@ref{member (Function)} ++, ++@ref{position} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++The @i{function} @b{assoc-if-not} is deprecated. ++ ++It is possible to @b{rplacd} the result of @b{assoc}, provided ++that it is not @b{nil}, ++in order to ``update'' @i{alist}. ++ ++The two expressions ++ ++@example ++ (assoc item list :test fn) ++@end example ++ ++and ++ ++@example ++ (find item list :test fn :key #'car) ++@end example ++ ++are equivalent in meaning with one exception: ++if @b{nil} appears in @i{alist} in place of a pair, ++and @i{item} is @b{nil}, ++@b{find} will compute the @i{car} of the @b{nil} in @i{alist}, ++find that it is equal to @i{item}, and return @b{nil}, ++whereas @b{assoc} will ignore the @b{nil} in @i{alist} and continue ++to search for an actual @i{cons} whose @i{car} is @b{nil}. ++ ++@node copy-alist, pairlis, assoc, Conses Dictionary ++@subsection copy-alist [Function] ++ ++@code{copy-alist} @i{alist} @result{} @i{new-alist} ++ ++@subsubheading Arguments and Values:: ++ ++@i{alist}---an @i{association list}. ++ ++@i{new-alist}---an @i{association list}. ++ ++@subsubheading Description:: ++ ++@b{copy-alist} returns a @i{copy} of @i{alist}. ++ ++The @i{list structure} of @i{alist} is copied, ++and the @i{elements} of @i{alist} which are @i{conses} are ++also copied (as @i{conses} only). ++Any other @i{objects} which are referred to, ++whether directly or indirectly, ++by the @i{alist} continue to be shared. ++ ++@subsubheading Examples:: ++ ++@example ++(defparameter *alist* (acons 1 "one" (acons 2 "two" '()))) ++*alist* @result{} ((1 . "one") (2 . "two")) ++(defparameter *list-copy* (copy-list *alist*)) ++*list-copy* @result{} ((1 . "one") (2 . "two")) ++(defparameter *alist-copy* (copy-alist *alist*)) ++*alist-copy* @result{} ((1 . "one") (2 . "two")) ++(setf (cdr (assoc 2 *alist-copy*)) "deux") @result{} "deux" ++*alist-copy* @result{} ((1 . "one") (2 . "deux")) ++*alist* @result{} ((1 . "one") (2 . "two")) ++(setf (cdr (assoc 1 *list-copy*)) "uno") @result{} "uno" ++*list-copy* @result{} ((1 . "uno") (2 . "two")) ++*alist* @result{} ((1 . "uno") (2 . "two")) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{copy-list} ++ ++@node pairlis, rassoc, copy-alist, Conses Dictionary ++@subsection pairlis [Function] ++ ++@code{pairlis} @i{keys data @r{&optional} alist} @result{} @i{new-alist} ++ ++@subsubheading Arguments and Values:: ++ ++@i{keys}---a @i{proper list}. ++ ++@i{data}---a @i{proper list}. ++ ++@i{alist}---an @i{association list}. ++ The default is the @i{empty list}. ++ ++@i{new-alist}---an @i{association list}. ++ ++@subsubheading Description:: ++ ++Returns an @i{association list} that associates ++elements of @i{keys} to corresponding elements of @i{data}. ++The consequences are undefined if @i{keys} and @i{data} are ++not of the same @i{length}. ++ ++If @i{alist} is supplied, @b{pairlis} returns ++a modified @i{alist} with the ++new pairs prepended to it. ++The new pairs may appear in the resulting @i{association list} in ++either forward or backward order. ++The result of ++ ++@example ++ (pairlis '(one two) '(1 2) '((three . 3) (four . 19))) ++@end example ++ ++might be ++ ++@example ++ ((one . 1) (two . 2) (three . 3) (four . 19)) ++@end example ++ ++or ++ ++@example ++ ((two . 2) (one . 1) (three . 3) (four . 19)) ++@end example ++ ++@subsubheading Examples:: ++@example ++ (setq keys '(1 2 3) ++ data '("one" "two" "three") ++ alist '((4 . "four"))) @result{} ((4 . "four")) ++ (pairlis keys data) @result{} ((3 . "three") (2 . "two") (1 . "one")) ++ (pairlis keys data alist) ++@result{} ((3 . "three") (2 . "two") (1 . "one") (4 . "four")) ++ alist @result{} ((4 . "four")) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{keys} and @i{data} are not @i{proper lists}. ++ ++@subsubheading See Also:: ++ ++@ref{acons} ++ ++@node rassoc, get-properties, pairlis, Conses Dictionary ++@subsection rassoc, rassoc-if, rassoc-if-not [Function] ++ ++@code{rassoc} @i{item alist @r{&key} key test test-not} @result{} @i{entry} ++ ++@code{rassoc-if} @i{predicate alist @r{&key} key} @result{} @i{entry} ++ ++@code{rassoc-if-not} @i{predicate alist @r{&key} key} @result{} @i{entry} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{alist}---an @i{association list}. ++ ++@i{predicate}---a @i{designator} for ++ a @i{function} of one @i{argument} ++ that returns a @i{generalized boolean}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{entry}---a @i{cons} that is an @i{element} of the @i{alist}, ++ or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{rassoc}, @b{rassoc-if}, and @b{rassoc-if-not} ++return the first @i{cons} whose @i{cdr} ++@i{satisfies the test}. ++If no such @i{cons} is found, @b{nil} ++is returned. ++ ++If @b{nil} appears in @i{alist} in place of a pair, it is ignored. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq alist '((1 . "one") (2 . "two") (3 . 3))) ++@result{} ((1 . "one") (2 . "two") (3 . 3)) ++ (rassoc 3 alist) @result{} (3 . 3) ++ (rassoc "two" alist) @result{} NIL ++ (rassoc "two" alist :test 'equal) @result{} (2 . "two") ++ (rassoc 1 alist :key #'(lambda (x) (if (numberp x) (/ x 3)))) @result{} (3 . 3) ++ (rassoc 'a '((a . b) (b . c) (c . a) (z . a))) @result{} (C . A) ++ (rassoc-if #'stringp alist) @result{} (1 . "one") ++ (rassoc-if-not #'vectorp alist) @result{} (3 . 3) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{assoc} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++The @i{function} @b{rassoc-if-not} is deprecated. ++ ++It is possible to @b{rplaca} the result of @b{rassoc}, ++provided that it is not @b{nil}, in order to ``update'' @i{alist}. ++ ++The expressions ++ ++@example ++ (rassoc item list :test fn) ++@end example ++ ++and ++ ++@example ++ (find item list :test fn :key #'cdr) ++@end example ++ ++are equivalent in meaning, except when the @t{item} is @b{nil} ++and @b{nil} appears in place of a pair in the @i{alist}. ++See the @i{function} @b{assoc}. ++ ++@node get-properties, getf, rassoc, Conses Dictionary ++@subsection get-properties [Function] ++ ++@code{get-properties} @i{plist indicator-list} @result{} @i{indicator, value, tail} ++ ++@subsubheading Arguments and Values:: ++ ++@i{plist}---a @i{property list}. ++ ++@i{indicator-list}---a @i{proper list} (of @i{indicators}). ++ ++@i{indicator}---an @i{object} that is an @i{element} of @i{indicator-list}. ++ ++@i{value}---an @i{object}. ++ ++@i{tail}---a @i{list}. ++ ++@subsubheading Description:: ++ ++@b{get-properties} is used to look up any of several ++@i{property list} entries all at once. ++ ++It searches the @i{plist} for the first entry whose @i{indicator} ++is @i{identical} to one of the @i{objects} in @i{indicator-list}. ++If such an entry is found, the @i{indicator} and @i{value} returned ++are the @i{property indicator} and its associated @i{property value}, ++and the @i{tail} returned is the @i{tail} of the @i{plist} ++that begins with the found entry (@i{i.e.}, whose @i{car} is the @i{indicator}). ++If no such entry is found, the @i{indicator}, @i{value}, and @i{tail} ++are all @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq x '()) @result{} NIL ++ (setq *indicator-list* '(prop1 prop2)) @result{} (PROP1 PROP2) ++ (getf x 'prop1) @result{} NIL ++ (setf (getf x 'prop1) 'val1) @result{} VAL1 ++ (eq (getf x 'prop1) 'val1) @result{} @i{true} ++ (get-properties x *indicator-list*) @result{} PROP1, VAL1, (PROP1 VAL1) ++ x @result{} (PROP1 VAL1) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{get} ++, ++@ref{getf} ++ ++@node getf, remf, get-properties, Conses Dictionary ++@subsection getf [Accessor] ++ ++@code{getf} @i{plist indicator @r{&optional} default} @result{} @i{value} ++ ++(setf (@code{ getf} @i{place indicator @r{&optional} default}) new-value)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{plist}---a @i{property list}. ++ ++@i{place}---a @i{place}, the @i{value} of which is a @i{property list}. ++ ++@i{indicator}---an @i{object}. ++ ++@i{default}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{value}---an @i{object}. ++ ++@i{new-value}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{getf} finds a @i{property} on the @i{plist} ++whose @i{property indicator} is @i{identical} to @i{indicator}, ++and returns its corresponding @i{property value}. ++ ++If there are multiple @i{properties}_1 with that @i{property indicator}, ++@b{getf} uses the first such @i{property}. ++ ++If there is no @i{property} with that @i{property indicator}, ++@i{default} is returned. ++ ++@b{setf} of @b{getf} may be used to associate a new @i{object} ++with an existing indicator in the @i{property list} held by @i{place}, ++or to create a new assocation if none exists. ++ ++If there are multiple @i{properties}_1 with that @i{property indicator}, ++@b{setf} of @b{getf} associates the @i{new-value} ++with the first such @i{property}. ++ ++When a @b{getf} @i{form} is used as a @b{setf} @i{place}, ++any @i{default} which is supplied is evaluated according to normal ++left-to-right evaluation rules, but its @i{value} is ignored. ++ ++@b{setf} of @b{getf} is permitted to either ++ @i{write} the @i{value} of @i{place} itself, ++ or modify of any part, @i{car} or @i{cdr}, ++ of the @i{list structure} held by @i{place}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq x '()) @result{} NIL ++ (getf x 'prop1) @result{} NIL ++ (getf x 'prop1 7) @result{} 7 ++ (getf x 'prop1) @result{} NIL ++ (setf (getf x 'prop1) 'val1) @result{} VAL1 ++ (eq (getf x 'prop1) 'val1) @result{} @i{true} ++ (getf x 'prop1) @result{} VAL1 ++ (getf x 'prop1 7) @result{} VAL1 ++ x @result{} (PROP1 VAL1) ++ ++;; Examples of implementation variation permitted. ++ (setq foo (list 'a 'b 'c 'd 'e 'f)) @result{} (A B C D E F) ++ (setq bar (cddr foo)) @result{} (C D E F) ++ (remf foo 'c) @result{} @i{true} ++ foo @result{} (A B E F) ++ bar ++@result{} (C D E F) ++@i{OR}@result{} (C) ++@i{OR}@result{} (NIL) ++@i{OR}@result{} (C NIL) ++@i{OR}@result{} (C D) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{get} ++, ++@ref{get-properties} ++, ++@ref{setf} ++, ++@ref{Function Call Forms as Places} ++ ++@subsubheading Notes:: ++ ++There is no way (using @b{getf}) to distinguish an absent property ++from one whose value is @i{default}; but see @b{get-properties}. ++ ++Note that while supplying a @i{default} argument to @b{getf} ++in a @b{setf} situation is sometimes not very interesting, ++it is still important because some macros, such as @b{push} and ++@b{incf}, require a @i{place} argument which data is both @i{read} ++from and @i{written} to. In such a context, if a @i{default} ++argument is to be supplied for the @i{read} situation, it must be ++syntactically valid for the @i{write} situation as well. For example, ++ ++@example ++ (let ((plist '())) ++ (incf (getf plist 'count 0)) ++ plist) @result{} (COUNT 1) ++@end example ++ ++@node remf, intersection, getf, Conses Dictionary ++@subsection remf [Macro] ++ ++@code{remf} @i{place indicator} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@i{indicator}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{remf} removes from the @i{property list} stored in @i{place} ++a @i{property}_1 with a @i{property indicator} ++@i{identical} to @i{indicator}. ++ ++If there are multiple @i{properties}_1 with the @i{identical} key, ++@b{remf} only removes the first such @i{property}. ++ ++@b{remf} returns @i{false} if no such @i{property} was found, ++or @i{true} if a property was found. ++ ++The @i{property indicator} ++and the corresponding @i{property value} ++are removed in an undefined order ++by destructively splicing the property list. ++ ++@b{remf} is permitted to either @b{setf} @i{place} or to ++@b{setf} any part, @b{car} or @b{cdr}, ++of the @i{list structure} held by that @i{place}. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{place}, ++see @ref{Evaluation of Subforms to Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq x (cons () ())) @result{} (NIL) ++ (setf (getf (car x) 'prop1) 'val1) @result{} VAL1 ++ (remf (car x) 'prop1) @result{} @i{true} ++ (remf (car x) 'prop1) @result{} @i{false} ++@end example ++ ++@subsubheading Side Effects:: ++ ++The property list stored in @i{place} is modified. ++ ++@subsubheading See Also:: ++ ++@ref{remprop} ++, ++@ref{getf} ++ ++@node intersection, adjoin, remf, Conses Dictionary ++@subsection intersection, nintersection [Function] ++ ++@code{intersection} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@code{nintersection} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list-1}---a @i{proper list}. ++ ++@i{list-2}---a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-list}---a @i{list}. ++ ++@subsubheading Description:: ++ ++@b{intersection} and @b{nintersection} return a @i{list} ++that contains every element that occurs in both @i{list-1} and @i{list-2}. ++ ++@b{nintersection} is the destructive version of @b{intersection}. ++It performs the same operation, ++but may destroy @i{list-1} using its cells to construct the result. ++ ++@i{list-2} is not destroyed. ++ ++The intersection operation is described as follows. ++For all possible ordered pairs consisting of ++ one @i{element} from @i{list-1} ++and one @i{element} from @i{list-2}, ++@t{:test} or @t{:test-not} are used ++to determine whether they @i{satisfy the test}. ++The first argument to the @t{:test} or @t{:test-not} ++function is an element of @i{list-1}; the second argument is an ++element of @i{list-2}. ++If @t{:test} or @t{:test-not} is not supplied, @b{eql} ++is used. ++It is an error if @t{:test} and @t{:test-not} are supplied in ++the same function call. ++ ++If @t{:key} is supplied (and not @b{nil}), it is used to ++extract the part to be tested from the @i{list} element. ++The argument to the @t{:key} function ++is an element of either @i{list-1} or @i{list-2}; ++the @t{:key} function typically returns part of the supplied element. ++If @t{:key} is not supplied or @b{nil}, the @i{list-1} and ++@i{list-2} elements are used. ++ ++For every pair that @i{satifies the test}, ++exactly one of the two elements of the pair will be put in the result. ++No element from either @i{list} appears in the result that does not ++@i{satisfy the test} for ++an element from the other @i{list}. ++If one of the @i{lists} contains duplicate ++elements, there may be duplication in the result. ++ ++There is no guarantee that the order of elements in the result will ++reflect the ordering of the arguments in any particular way. ++The result @i{list} may share cells with, ++or be @b{eq} to, either @i{list-1} or @i{list-2} ++if appropriate. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq list1 (list 1 1 2 3 4 a b c "A" "B" "C" "d") ++ list2 (list 1 4 5 b c d "a" "B" "c" "D")) ++ @result{} (1 4 5 B C D "a" "B" "c" "D") ++ (intersection list1 list2) @result{} (C B 4 1 1) ++ (intersection list1 list2 :test 'equal) @result{} ("B" C B 4 1 1) ++ (intersection list1 list2 :test #'equalp) @result{} ("d" "C" "B" "A" C B 4 1 1) ++ (nintersection list1 list2) @result{} (1 1 4 B C) ++ list1 @result{} @i{implementation-dependent} ;@i{e.g.}, (1 1 4 B C) ++ list2 @result{} @i{implementation-dependent} ;@i{e.g.}, (1 4 5 B C D "a" "B" "c" "D") ++ (setq list1 (copy-list '((1 . 2) (2 . 3) (3 . 4) (4 . 5)))) ++@result{} ((1 . 2) (2 . 3) (3 . 4) (4 . 5)) ++ (setq list2 (copy-list '((1 . 3) (2 . 4) (3 . 6) (4 . 8)))) ++@result{} ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) ++ (nintersection list1 list2 :key #'cdr) @result{} ((2 . 3) (3 . 4)) ++ list1 @result{} @i{implementation-dependent} ;@i{e.g.}, ((1 . 2) (2 . 3) (3 . 4)) ++ list2 @result{} @i{implementation-dependent} ;@i{e.g.}, ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nintersection} can modify @i{list-1}, ++ ++but not @i{list-2}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list-1} and @i{list-2} are not @i{proper lists}. ++ ++@subsubheading See Also:: ++ ++@ref{union} ++, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++Since the @b{nintersection} side effect is not required, ++it should not be used in for-effect-only ++ positions in portable code. ++ ++@node adjoin, pushnew, intersection, Conses Dictionary ++@subsection adjoin [Function] ++ ++@code{adjoin} @i{item list @r{&key} key test test-not} @result{} @i{new-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{list}---a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{new-list}---a @i{list}. ++ ++@subsubheading Description:: ++ ++Tests whether @i{item} is the same as an existing element of @i{list}. ++If the @i{item} is not an existing element, ++@b{adjoin} adds it to @i{list} (as if by @b{cons}) ++and returns the resulting @i{list}; ++otherwise, nothing is added and the original @i{list} is returned. ++ ++The @i{test}, @i{test-not}, and @i{key} ++affect how it is determined whether @i{item} is the same as an @i{element} of @i{list}. ++For details, see @ref{Satisfying a Two-Argument Test}.\ifvmode\else\endgraf ++\ifdim \prevdepth>-1000pt ++\NIS\parskip \normalparskip\relax\fi ++ ++@subsubheading Examples:: ++ ++@example ++ (setq slist '()) @result{} NIL ++ (adjoin 'a slist) @result{} (A) ++ slist @result{} NIL ++ (setq slist (adjoin '(test-item 1) slist)) @result{} ((TEST-ITEM 1)) ++ (adjoin '(test-item 1) slist) @result{} ((TEST-ITEM 1) (TEST-ITEM 1)) ++ (adjoin '(test-item 1) slist :test 'equal) @result{} ((TEST-ITEM 1)) ++ (adjoin '(new-test-item 1) slist :key #'cadr) @result{} ((TEST-ITEM 1)) ++ (adjoin '(new-test-item 1) slist) @result{} ((NEW-TEST-ITEM 1) (TEST-ITEM 1)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list} is not a @i{proper list}. ++ ++@subsubheading See Also:: ++ ++@ref{pushnew} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++@example ++ (adjoin item list :key fn) ++ @equiv{} (if (member (fn item) list :key fn) list (cons item list)) ++@end example ++ ++@node pushnew, set-difference, adjoin, Conses Dictionary ++@subsection pushnew [Macro] ++ ++@code{pushnew} @i{item place @r{&key} key test test-not}@* ++ @result{} @i{new-place-value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{place}---a @i{place}, the @i{value} of which is a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{new-place-value}---a @i{list} (the new @i{value} of @i{place}). ++ ++@subsubheading Description:: ++ ++@b{pushnew} tests whether @i{item} is the same as any existing ++element of the @i{list} stored in @i{place}. If @i{item} is not, ++it is prepended to the @i{list}, and the new @i{list} is stored in ++@i{place}. ++ ++@b{pushnew} returns the new @i{list} that is stored in @i{place}. ++ ++Whether or not @i{item} is already a member of the @i{list} that is ++in @i{place} is determined by comparisons using @t{:test} or @t{:test-not}. ++The first argument to the @t{:test} or @t{:test-not} ++function is @i{item}; the second argument is ++an element of the @i{list} in @i{place} as returned by ++the @t{:key} function (if supplied). ++ ++If @t{:key} is supplied, it is used to extract the part to be tested from ++both @i{item} and the @i{list} element, ++as for @b{adjoin}. ++ ++The argument to the @t{:key} function ++is an element of the @i{list} stored in ++@i{place}. The @t{:key} function typically returns part ++part of the element of the @i{list}. ++If @t{:key} is not supplied or @b{nil}, the @i{list} ++element is used. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{place}, ++see @ref{Evaluation of Subforms to Places}. ++ ++It is @i{implementation-dependent} whether or not @b{pushnew} ++actually executes the storing form for its @i{place} in the ++situation where the @i{item} is already a member of the @i{list} ++held by @i{place}. ++ ++@subsubheading Examples:: ++@example ++ (setq x '(a (b c) d)) @result{} (A (B C) D) ++ (pushnew 5 (cadr x)) @result{} (5 B C) ++ x @result{} (A (5 B C) D) ++ (pushnew 'b (cadr x)) @result{} (5 B C) ++ x @result{} (A (5 B C) D) ++ (setq lst '((1) (1 2) (1 2 3))) @result{} ((1) (1 2) (1 2 3)) ++ (pushnew '(2) lst) @result{} ((2) (1) (1 2) (1 2 3)) ++ (pushnew '(1) lst) @result{} ((1) (2) (1) (1 2) (1 2 3)) ++ (pushnew '(1) lst :test 'equal) @result{} ((1) (2) (1) (1 2) (1 2 3)) ++ (pushnew '(1) lst :key #'car) @result{} ((1) (2) (1) (1 2) (1 2 3)) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The contents of @i{place} may be modified. ++ ++@subsubheading See Also:: ++ ++@ref{push} ++, ++@ref{adjoin} ++, ++@ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++The effect of ++@example ++ (pushnew item place :test p) ++@end example ++ ++is roughly equivalent to ++@example ++ (setf place (adjoin item place :test p)) ++@end example ++ ++except that the @i{subforms} of @t{place} are evaluated only once, ++and @t{item} is evaluated before @t{place}. ++ ++@node set-difference, set-exclusive-or, pushnew, Conses Dictionary ++@subsection set-difference, nset-difference [Function] ++ ++@code{set-difference} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@code{nset-difference} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list-1}---a @i{proper list}. ++ ++@i{list-2}---a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-list}---a @i{list}. ++ ++@subsubheading Description:: ++@b{set-difference} returns a @i{list} ++of elements of @i{list-1} ++that do not appear in @i{list-2}. ++ ++@b{nset-difference} is the destructive ++version of @b{set-difference}. ++It may destroy @i{list-1}. ++ ++For all possible ordered pairs consisting of ++one element from @i{list-1} and one element from @i{list-2}, the ++@t{:test} or @t{:test-not} function is ++used to determine whether they @i{satisfy the test}. ++The first argument to the @t{:test} or @t{:test-not} function ++is the part of an element of @i{list-1} that is returned by ++the @t{:key} function (if supplied); the second argument is the part of ++an element of @i{list-2} that is ++returned by the @t{:key} function (if supplied). ++ ++If @t{:key} is supplied, its argument is a @i{list-1} or ++@i{list-2} element. The @t{:key} function ++typically returns part of ++the supplied element. ++If @t{:key} is not supplied, the @i{list-1} or @i{list-2} ++element is used. ++ ++An element of @i{list-1} ++appears in the result if and only if it does not match any element ++of @i{list-2}. ++ ++There is no guarantee that the order of elements in the result will ++reflect the ordering of the arguments in any particular way. ++The result @i{list} ++may share cells with, or be @b{eq} to, either of @i{list-1} ++or @i{list-2}, ++if appropriate. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq lst1 (list "A" "b" "C" "d") ++ lst2 (list "a" "B" "C" "d")) @result{} ("a" "B" "C" "d") ++ (set-difference lst1 lst2) @result{} ("d" "C" "b" "A") ++ (set-difference lst1 lst2 :test 'equal) @result{} ("b" "A") ++ (set-difference lst1 lst2 :test #'equalp) @result{} NIL ++ (nset-difference lst1 lst2 :test #'string=) @result{} ("A" "b") ++ (setq lst1 '(("a" . "b") ("c" . "d") ("e" . "f"))) ++@result{} (("a" . "b") ("c" . "d") ("e" . "f")) ++ (setq lst2 '(("c" . "a") ("e" . "b") ("d" . "a"))) ++@result{} (("c" . "a") ("e" . "b") ("d" . "a")) ++ (nset-difference lst1 lst2 :test #'string= :key #'cdr) ++@result{} (("c" . "d") ("e" . "f")) ++ lst1 @result{} (("a" . "b") ("c" . "d") ("e" . "f")) ++ lst2 @result{} (("c" . "a") ("e" . "b") ("d" . "a")) ++@end example ++ ++@example ++;; Remove all flavor names that contain "c" or "w". ++ (set-difference '("strawberry" "chocolate" "banana" ++ "lemon" "pistachio" "rhubarb") ++ '(#\c #\w) ++ :test #'(lambda (s c) (find c s))) ++@result{} ("banana" "rhubarb" "lemon") ;One possible ordering. ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nset-difference} may destroy @i{list-1}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list-1} and @i{list-2} are not @i{proper lists}. ++ ++@subsubheading See Also:: ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++@node set-exclusive-or, subsetp, set-difference, Conses Dictionary ++@subsection set-exclusive-or, nset-exclusive-or [Function] ++ ++@code{set-exclusive-or} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@code{nset-exclusive-or} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list-1}---a @i{proper list}. ++ ++@i{list-2}---a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-list}---a @i{list}. ++ ++@subsubheading Description:: ++@b{set-exclusive-or} returns a @i{list} of elements that appear ++in exactly one of @i{list-1} and @i{list-2}. ++ ++@b{nset-exclusive-or} ++is the @i{destructive} version of @b{set-exclusive-or}. ++ ++For all possible ordered pairs consisting of ++one element from @i{list-1} and one element from @i{list-2}, the ++@t{:test} or @t{:test-not} function is ++used to determine whether they @i{satisfy the test}. ++ ++If @t{:key} is supplied, it is used to ++extract the part to be tested from the @i{list-1} or @i{list-2} element. ++The first argument to the @t{:test} or @t{:test-not} function ++is the part of an element of @i{list-1} extracted by the @t{:key} ++function (if supplied); the second argument is the part of an ++element of @i{list-2} extracted by the @t{:key} function (if supplied). ++If @t{:key} is not supplied or @b{nil}, the @i{list-1} or ++@i{list-2} element is used. ++ ++The result contains precisely ++those elements of @i{list-1} and @i{list-2} ++that appear in no matching pair. ++ ++The result @i{list} of @b{set-exclusive-or} ++might share storage with one of @i{list-1} or @i{list-2}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq lst1 (list 1 "a" "b") ++ lst2 (list 1 "A" "b")) @result{} (1 "A" "b") ++ (set-exclusive-or lst1 lst2) @result{} ("b" "A" "b" "a") ++ (set-exclusive-or lst1 lst2 :test #'equal) @result{} ("A" "a") ++ (set-exclusive-or lst1 lst2 :test 'equalp) @result{} NIL ++ (nset-exclusive-or lst1 lst2) @result{} ("a" "b" "A" "b") ++ (setq lst1 (list (("a" . "b") ("c" . "d") ("e" . "f")))) ++@result{} (("a" . "b") ("c" . "d") ("e" . "f")) ++ (setq lst2 (list (("c" . "a") ("e" . "b") ("d" . "a")))) ++@result{} (("c" . "a") ("e" . "b") ("d" . "a")) ++ (nset-exclusive-or lst1 lst2 :test #'string= :key #'cdr) ++@result{} (("c" . "d") ("e" . "f") ("c" . "a") ("d" . "a")) ++ lst1 @result{} (("a" . "b") ("c" . "d") ("e" . "f")) ++ lst2 @result{} (("c" . "a") ("d" . "a")) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nset-exclusive-or} is permitted to modify any part, ++@i{car} or @i{cdr}, of the @i{list structure} of @i{list-1} or @i{list-2}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list-1} and @i{list-2} are not @i{proper lists}. ++ ++@subsubheading See Also:: ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++Since the @b{nset-exclusive-or} side effect is not required, ++it should not be used in for-effect-only ++ positions in portable code. ++ ++@node subsetp, union, set-exclusive-or, Conses Dictionary ++@subsection subsetp [Function] ++ ++@code{subsetp} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list-1}---a @i{proper list}. ++ ++@i{list-2}---a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{subsetp} returns @i{true} if every element of @i{list-1} ++matches some element of @i{list-2}, ++and @i{false} otherwise. ++ ++Whether a list element is the same as another list element is ++determined by the functions specified by the keyword arguments. ++The first argument to the @t{:test} or @t{:test-not} ++function is ++typically ++part of an element of @i{list-1} extracted by ++the @t{:key} function; the second argument is typically part of ++an element of @i{list-2} extracted by ++the @t{:key} function. ++ ++The argument to the @t{:key} function is an element of either ++@i{list-1} or @i{list-2}; the return value is part of the element ++of the supplied list element. ++If @t{:key} is not supplied or @b{nil}, ++the @i{list-1} or @i{list-2} ++element itself is supplied to the @t{:test} or @t{:test-not} ++function. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq cosmos '(1 "a" (1 2))) @result{} (1 "a" (1 2)) ++ (subsetp '(1) cosmos) @result{} @i{true} ++ (subsetp '((1 2)) cosmos) @result{} @i{false} ++ (subsetp '((1 2)) cosmos :test 'equal) @result{} @i{true} ++ (subsetp '(1 "A") cosmos :test #'equalp) @result{} @i{true} ++ (subsetp '((1) (2)) '((1) (2))) @result{} @i{false} ++ (subsetp '((1) (2)) '((1) (2)) :key #'car) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list-1} and @i{list-2} are not @i{proper lists}. ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++@node union, , subsetp, Conses Dictionary ++@subsection union, nunion [Function] ++ ++@code{union} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@code{nunion} @i{list-1 list-2 @r{&key} key test test-not} @result{} @i{result-list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list-1}---a @i{proper list}. ++ ++@i{list-2}---a @i{proper list}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-list}---a @i{list}. ++ ++@subsubheading Description:: ++ ++@b{union} and @b{nunion} return a @i{list} ++that contains every element that occurs in either @i{list-1} ++or @i{list-2}. ++ ++For all possible ordered pairs consisting of one ++element from @i{list-1} ++and one element from @i{list-2}, @t{:test} or @t{:test-not} is used ++to determine whether they @i{satisfy the test}. ++The first argument to the @t{:test} or @t{:test-not} ++function is the part of the element of @i{list-1} extracted by the ++@t{:key} function (if supplied); the second argument ++is the part of the element of @i{list-2} extracted by the ++@t{:key} function (if supplied). ++ ++The argument to the @t{:key} function is an element of ++@i{list-1} or @i{list-2}; the return value is part of the supplied ++element. ++If @t{:key} is not supplied or @b{nil}, ++the element of @i{list-1} or @i{list-2} ++itself is supplied to the @t{:test} or @t{:test-not} function. ++ ++For every matching pair, ++one of the two elements of the pair will be in the result. Any ++element from either @i{list-1} or @i{list-2} ++that matches no element of the other will appear ++in the result. ++ ++If there is a duplication between @i{list-1} ++and @i{list-2}, ++only one of the duplicate instances will be in the result. ++If either @i{list-1} ++or @i{list-2} has duplicate entries within it, ++the redundant entries ++might or might not appear in the result. ++ ++The order of elements in the result do not have to ++reflect the ordering of @i{list-1} or @i{list-2} in any way. ++The result @i{list} may be @b{eq} to either ++@i{list-1} or @i{list-2} if appropriate. ++ ++@subsubheading Examples:: ++ ++@example ++ (union '(a b c) '(f a d)) ++@result{} (A B C F D) ++@i{OR}@result{} (B C F A D) ++@i{OR}@result{} (D F A B C) ++ (union '((x 5) (y 6)) '((z 2) (x 4)) :key #'car) ++@result{} ((X 5) (Y 6) (Z 2)) ++@i{OR}@result{} ((X 4) (Y 6) (Z 2)) ++ ++ (setq lst1 (list 1 2 '(1 2) "a" "b") ++ lst2 (list 2 3 '(2 3) "B" "C")) ++@result{} (2 3 (2 3) "B" "C") ++ (nunion lst1 lst2) ++@result{} (1 (1 2) "a" "b" 2 3 (2 3) "B" "C") ++@i{OR}@result{} (1 2 (1 2) "a" "b" "C" "B" (2 3) 3) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nunion} is permitted to modify any part, @i{car} or @i{cdr}, ++of the @i{list structure} of @i{list-1} or @i{list-2}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{list-1} and @i{list-2} are not @i{proper lists}. ++ ++@subsubheading See Also:: ++ ++@ref{intersection} ++, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} parameter is deprecated. ++ ++Since the @b{nunion} side effect is not required, ++it should not be used in for-effect-only positions in portable code. ++ ++@c end of including dict-conses ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-15.texi +@@ -0,0 +1,2496 @@ ++ ++ ++@node Arrays, Strings, Conses, Top ++@chapter Arrays ++ ++@menu ++* Array Concepts:: ++* Arrays Dictionary:: ++@end menu ++ ++@node Array Concepts, Arrays Dictionary, Arrays, Arrays ++@section Array Concepts ++ ++@c including concept-arrays ++ ++@menu ++* Array Elements:: ++* Specialized Arrays:: ++@end menu ++ ++@node Array Elements, Specialized Arrays, Array Concepts, Array Concepts ++@subsection Array Elements ++ ++An @i{array} contains a set of @i{objects} called @i{elements} ++that can be referenced individually according to a rectilinear coordinate system. ++ ++@menu ++* Array Indices:: ++* Array Dimensions:: ++* Implementation Limits on Individual Array Dimensions:: ++* Array Rank:: ++* Vectors:: ++* Fill Pointers:: ++* Multidimensional Arrays:: ++* Storage Layout for Multidimensional Arrays:: ++* Implementation Limits on Array Rank:: ++@end menu ++ ++@node Array Indices, Array Dimensions, Array Elements, Array Elements ++@subsubsection Array Indices ++ ++An @i{array} @i{element} is referred to by a (possibly empty) series of indices. ++The length of the series must equal the @i{rank} of the @i{array}. ++ ++Each index must be a non-negative @i{fixnum} ++ ++less than the corresponding @i{array} @i{dimension}. ++@i{Array} indexing is zero-origin. ++ ++@node Array Dimensions, Implementation Limits on Individual Array Dimensions, Array Indices, Array Elements ++@subsubsection Array Dimensions ++ ++An axis of an @i{array} is called a @i{dimension} ++@IGindex dimension ++. ++ ++Each @i{dimension} is a non-negative ++ ++@i{fixnum}; ++ ++ if any dimension of an @i{array} is zero, the @i{array} has no elements. ++It is permissible for a @i{dimension} to be zero, ++in which case the @i{array} has no elements, ++and any attempt to @i{access} an @i{element} ++is an error. However, other properties of the @i{array}, ++such as the @i{dimensions} themselves, may be used. ++ ++@node Implementation Limits on Individual Array Dimensions, Array Rank, Array Dimensions, Array Elements ++@subsubsection Implementation Limits on Individual Array Dimensions ++ ++An @i{implementation} may impose a limit on @i{dimensions} of an @i{array}, ++but there is a minimum requirement on that limit. See the @i{variable} @b{array-dimension-limit}. ++ ++@node Array Rank, Vectors, Implementation Limits on Individual Array Dimensions, Array Elements ++@subsubsection Array Rank ++ ++An @i{array} can have any number of @i{dimensions} (including zero). ++The number of @i{dimensions} is called the @i{rank} ++@IGindex rank ++. ++ ++If the rank of an @i{array} is zero then the @i{array} is said to have ++no @i{dimensions}, and the product of the dimensions (see @b{array-total-size}) ++is then 1; a zero-rank @i{array} therefore has a single element. ++ ++@node Vectors, Fill Pointers, Array Rank, Array Elements ++@subsubsection Vectors ++ ++An @i{array} of @i{rank} one (@i{i.e.}, a one-dimensional @i{array}) ++is called a @i{vector} ++@IGindex vector ++. ++ ++@node Fill Pointers, Multidimensional Arrays, Vectors, Array Elements ++@subsubsection Fill Pointers ++ ++A @i{fill pointer} ++@IGindex fill pointer ++ is a non-negative @i{integer} no ++larger than the total number of @i{elements} in a @i{vector}. ++Not all @i{vectors} have @i{fill pointers}. ++See the @i{functions} @b{make-array} and @b{adjust-array}. ++ ++An @i{element} of a @i{vector} is said to be @i{active} ++@IGindex active ++ if it has ++an index that is greater than or equal to zero, ++but less than the @i{fill pointer} (if any). ++For an @i{array} that has no @i{fill pointer}, ++all @i{elements} are considered @i{active}. ++ ++Only @i{vectors} may have @i{fill pointers}; ++multidimensional @i{arrays} may not. ++A multidimensional @i{array} that is displaced to a @i{vector} ++that has a @i{fill pointer} can be created. ++ ++@node Multidimensional Arrays, Storage Layout for Multidimensional Arrays, Fill Pointers, Array Elements ++@subsubsection Multidimensional Arrays ++ ++@node Storage Layout for Multidimensional Arrays, Implementation Limits on Array Rank, Multidimensional Arrays, Array Elements ++@subsubsection Storage Layout for Multidimensional Arrays ++ ++Multidimensional @i{arrays} store their components in row-major order; ++that is, internally a multidimensional @i{array} is stored as a ++one-dimensional @i{array}, with the multidimensional index sets ++ordered lexicographically, last index varying fastest. ++ ++@node Implementation Limits on Array Rank, , Storage Layout for Multidimensional Arrays, Array Elements ++@subsubsection Implementation Limits on Array Rank ++ ++An @i{implementation} may impose a limit on the @i{rank} of an @i{array}, ++but there is a minimum requirement on that limit. See the @i{variable} @b{array-rank-limit}. ++ ++@node Specialized Arrays, , Array Elements, Array Concepts ++@subsection Specialized Arrays ++ ++An @i{array} can be a @i{general} @i{array}, ++ meaning each @i{element} may be any @i{object}, ++or it may be a @i{specialized} @i{array}, ++ meaning that each @i{element} must be of a restricted @i{type}. ++ ++The phrasing ``an @i{array} @i{specialized} to @i{type} <<@i{type}>>'' ++is sometimes used to emphasize the @i{element type} of an @i{array}. ++This phrasing is tolerated even when the <<@i{type}>> is @b{t}, ++even though an @i{array} @i{specialized} to @i{type} @i{t} ++is a @i{general} @i{array}, not a @i{specialized} @i{array}. ++ ++Figure 15--1 lists some @i{defined names} that are applicable to @i{array} ++creation, @i{access}, and information operations. ++ ++@format ++@group ++@noindent ++@w{ adjust-array array-in-bounds-p svref } ++@w{ adjustable-array-p array-rank upgraded-array-element-type } ++@w{ aref array-rank-limit upgraded-complex-part-type } ++@w{ array-dimension array-row-major-index vector } ++@w{ array-dimension-limit array-total-size vector-pop } ++@w{ array-dimensions array-total-size-limit vector-push } ++@w{ array-element-type fill-pointer vector-push-extend } ++@w{ array-has-fill-pointer-p make-array } ++ ++@noindent ++@w{ Figure 15--1: General Purpose Array-Related Defined Names } ++ ++@end group ++@end format ++ ++@menu ++* Array Upgrading:: ++* Required Kinds of Specialized Arrays:: ++@end menu ++ ++@node Array Upgrading, Required Kinds of Specialized Arrays, Specialized Arrays, Specialized Arrays ++@subsubsection Array Upgrading ++ ++The @i{upgraded array element type} ++@IGindex upgraded array element type ++ of a @i{type} T_1 ++is a @i{type} T_2 that is a @i{supertype} of T_1 ++and that is used instead of T_1 whenever T_1 ++is used as an @i{array element type} ++for object creation or type discrimination. ++ ++During creation of an @i{array}, ++the @i{element type} that was requested ++is called the @i{expressed array element type} ++@IGindex expressed array element type ++. ++The @i{upgraded array element type} of the @i{expressed array element type} ++becomes the @i{actual array element type} ++@IGindex actual array element type ++ of the @i{array} that is created. ++ ++@i{Type} @i{upgrading} implies a movement upwards in the type hierarchy lattice. ++A @i{type} is always a @i{subtype} of its @i{upgraded array element type}. ++Also, if a @i{type} T_x is a @i{subtype} of another @i{type} T_y, ++then ++the @i{upgraded array element type} of T_x ++must be a @i{subtype} of ++the @i{upgraded array element type} of T_y. ++Two @i{disjoint} @i{types} can be @i{upgraded} to the same @i{type}. ++ ++The @i{upgraded array element type} T_2 of a @i{type} T_1 ++is a function only of T_1 itself; ++that is, it is independent of any other property of the @i{array} ++for which T_2 will be used, ++such as @i{rank}, @i{adjustability}, @i{fill pointers}, or displacement. ++The @i{function} @b{upgraded-array-element-type} ++can be used by @i{conforming programs} to predict how the @i{implementation} ++will @i{upgrade} a given @i{type}. ++ ++@node Required Kinds of Specialized Arrays, , Array Upgrading, Specialized Arrays ++@subsubsection Required Kinds of Specialized Arrays ++ ++@i{Vectors} whose @i{elements} are restricted to @i{type} ++ ++@b{character} or a @i{subtype} of @b{character} ++ ++are called @i{strings} ++@IGindex string ++. ++@i{Strings} are of @i{type} @b{string}. ++Figure 15--2 lists some @i{defined names} related to @i{strings}. ++ ++@i{Strings} are @i{specialized} @i{arrays} ++and might logically have been included in this chapter. ++However, for purposes of readability ++most information about @i{strings} does not appear in this chapter; ++see instead @ref{Strings}. ++ ++@format ++@group ++@noindent ++@w{ char string-equal string-upcase } ++@w{ make-string string-greaterp string@t{/=} } ++@w{ nstring-capitalize string-left-trim string@t{<} } ++@w{ nstring-downcase string-lessp string@t{<=} } ++@w{ nstring-upcase string-not-equal string@t{=} } ++@w{ schar string-not-greaterp string@t{>} } ++@w{ string string-not-lessp string@t{>=} } ++@w{ string-capitalize string-right-trim } ++@w{ string-downcase string-trim } ++ ++@noindent ++@w{ Figure 15--2: Operators that Manipulate Strings } ++ ++@end group ++@end format ++ ++@i{Vectors} whose @i{elements} are restricted to @i{type} ++@b{bit} are called @i{bit vectors} ++@IGindex bit vector ++. ++@i{Bit vectors} are of @i{type} @b{bit-vector}. ++Figure 15--3 lists some @i{defined names} for operations on @i{bit arrays}. ++ ++@format ++@group ++@noindent ++@w{ bit bit-ior bit-orc2 } ++@w{ bit-and bit-nand bit-xor } ++@w{ bit-andc1 bit-nor sbit } ++@w{ bit-andc2 bit-not } ++@w{ bit-eqv bit-orc1 } ++ ++@noindent ++@w{ Figure 15--3: Operators that Manipulate Bit Arrays} ++ ++@end group ++@end format ++ ++@c end of including concept-arrays ++ ++@node Arrays Dictionary, , Array Concepts, Arrays ++@section Arrays Dictionary ++ ++@c including dict-arrays ++ ++@menu ++* array:: ++* simple-array:: ++* vector (System Class):: ++* simple-vector:: ++* bit-vector:: ++* simple-bit-vector:: ++* make-array:: ++* adjust-array:: ++* adjustable-array-p:: ++* aref:: ++* array-dimension:: ++* array-dimensions:: ++* array-element-type:: ++* array-has-fill-pointer-p:: ++* array-displacement:: ++* array-in-bounds-p:: ++* array-rank:: ++* array-row-major-index:: ++* array-total-size:: ++* arrayp:: ++* fill-pointer:: ++* row-major-aref:: ++* upgraded-array-element-type:: ++* array-dimension-limit:: ++* array-rank-limit:: ++* array-total-size-limit:: ++* simple-vector-p:: ++* svref:: ++* vector:: ++* vector-pop:: ++* vector-push:: ++* vectorp:: ++* bit (Array):: ++* bit-and:: ++* bit-vector-p:: ++* simple-bit-vector-p:: ++@end menu ++ ++@node array, simple-array, Arrays Dictionary, Arrays Dictionary ++@subsection array [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{array}, ++@b{t} ++ ++@subsubheading Description:: ++ ++An @i{array} contains @i{objects} arranged according to a ++Cartesian coordinate system. ++An @i{array} provides mappings from a set of ++ ++@i{fixnums} ++ ++\left@{i_0,i_1,\dots,i_@{r-1@}\right@} to corresponding @i{elements} ++of the @i{array}, ++where 0 \le i_j < d_j, ++r is the rank of the array, and d_j is the size of @i{dimension} j of ++the array. ++ ++When an @i{array} is created, the program requesting its creation may ++declare that all @i{elements} are of a particular @i{type}, ++called the @i{expressed array element type}. ++The implementation is permitted to @i{upgrade} this type in order to ++produce the @i{actual array element type}, ++which is the @i{element type} for the @i{array} is actually @i{specialized}. ++See the @i{function} @b{upgraded-array-element-type}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{array}@{@i{@t{[}@{element-type | @b{*}@} @r{[}dimension-spec@r{]}@t{]}}@}) ++ ++@w{@i{dimension-spec} ::=rank | @b{*} | @r{(}@{dimension | @b{*}@}*@r{)}} ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{dimension}---a @i{valid array dimension}. ++ ++@i{element-type}---a @i{type specifier}. ++ ++@i{rank}---a non-negative @i{fixnum}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of @i{arrays} whose ++ @i{element type}, @i{rank}, and @i{dimensions} ++match any given ++ @i{element-type}, @i{rank}, and @i{dimensions}. ++Specifically: ++ ++If @i{element-type} is the @i{symbol} @b{*}, ++@i{arrays} are not excluded on the basis of their @i{element type}. ++Otherwise, only those @i{arrays} are included whose @i{actual array element type} ++ ++is the result of @i{upgrading} @i{element-type}; ++see @ref{Array Upgrading}. ++ ++If the @i{dimension-spec} is a @i{rank}, ++the set includes only those @i{arrays} having that @i{rank}. ++If the @i{dimension-spec} is a @i{list} of @i{dimensions}, ++the set includes only those @i{arrays} having a @i{rank} ++given by the @i{length} of the @i{dimensions}, ++and having the indicated @i{dimensions}; ++in this case, @b{*} matches any value for the corresponding @i{dimension}. ++If the @i{dimension-spec} is the @i{symbol} @b{*}, ++the set is not restricted on the basis of @i{rank} or @i{dimension}. ++ ++@subsubheading See Also:: ++ ++@b{*print-array*}, ++@ref{aref} ++, ++@ref{make-array} ++, ++@b{vector}, ++@ref{Sharpsign A}, ++@ref{Printing Other Arrays} ++ ++@subsubheading Notes:: ++ ++Note that the type @t{(array t)} ++is a proper @i{subtype} of the type @t{(array *)}. ++The reason is that the type @t{(array t)} is the set of @i{arrays} ++that can ++hold any @i{object} (the @i{elements} are of @i{type} @b{t}, which includes ++all @i{objects}). ++On the other hand, the type @t{(array *)} ++is the set of all @i{arrays} whatsoever, including for example ++@i{arrays} that can hold only @i{characters}. ++The type @t{(array character)} ++is not a @i{subtype} of the type @t{(array t)}; ++the two sets ++are @i{disjoint} because the type @t{(array character)} is not the ++set of all @i{arrays} that can hold ++@i{characters}, but rather the set of ++@i{arrays} ++that are specialized to hold precisely @i{characters} and no ++other @i{objects}. ++ ++@node simple-array, vector (System Class), array, Arrays Dictionary ++@subsection simple-array [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{simple-array}, ++@b{array}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} of an @i{array} that is not displaced ++to another @i{array}, has no @i{fill pointer}, and is ++not ++@i{expressly adjustable} is a @i{subtype} of @i{type} @b{simple-array}. ++The concept of a @i{simple array} ++exists to allow the implementation to use a specialized representation ++and to allow the user to declare that certain values will always be ++@i{simple arrays}. ++ ++The @i{types} @b{simple-vector}, ++ @b{simple-string}, ++ and @b{simple-bit-vector} ++are @i{disjoint} @i{subtypes} of @i{type} @b{simple-array}, ++for they respectively mean @t{(simple-array t (*))}, ++ the union of all @t{(simple-array @i{c} (*))} ++ for any @i{c} being a @i{subtype} of @i{type} @b{character}, ++ and @t{(simple-array bit (*))}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{simple-array}@{@i{@t{[}@{element-type | @b{*}@} @r{[}dimension-spec@r{]}@t{]}}@}) ++ ++@w{@i{dimension-spec} ::=rank | @b{*} | @r{(}@{dimension | @b{*}@}*@r{)}} ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{dimension}---a @i{valid array dimension}. ++ ++@i{element-type}---a @i{type specifier}. ++ ++@i{rank}---a non-negative @i{fixnum}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This @i{compound type specifier} is treated exactly as the corresponding ++@i{compound type specifier} for @i{type} @b{array} would be treated, ++except that the set is further constrained to include only @i{simple arrays}. ++ ++@subsubheading Notes:: ++ ++It is @i{implementation-dependent} ++whether @i{displaced arrays}, ++ @i{vectors} with @i{fill pointers}, ++ or arrays that are @i{actually adjustable} ++ are @i{simple arrays}. ++ ++@t{(simple-array *)} refers to all @i{simple arrays} ++regardless of element type, @t{(simple-array @i{type-specifier})} ++refers only to those @i{simple arrays} ++that can result from giving @i{type-specifier} as the ++@t{:element-type} argument to @b{make-array}. ++ ++@node vector (System Class), simple-vector, simple-array, Arrays Dictionary ++@subsection vector [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{vector}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++Any one-dimensional @i{array} is a @i{vector}. ++ ++The @i{type} @b{vector} is a @i{subtype} of @i{type} @b{array}; ++for all @i{types} @t{x}, @t{(vector x)} is the same as @t{(array x (*))}. ++ ++The @i{type} @t{(vector t)}, the @i{type} @b{string}, and the @i{type} @b{bit-vector} ++are @i{disjoint} @i{subtypes} of @i{type} @b{vector}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{vector}@{@i{@t{[}@{element-type | @b{*}@} @r{[}@{size | @b{*}@}@r{]}@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}. ++ ++@i{element-type}---a @i{type specifier}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of specialized @i{vectors} ++whose @i{element type} and @i{dimension} match the specified values. ++Specifically: ++ ++If @i{element-type} is the @i{symbol} @b{*}, ++@i{vectors} are not excluded on the basis of their @i{element type}. ++Otherwise, only those @i{vectors} are included whose @i{actual array element type} ++ ++is the result of @i{upgrading} @i{element-type}; ++see @ref{Array Upgrading}. ++ ++If a @i{size} is specified, ++the set includes only those @i{vectors} whose only @i{dimension} ++is @i{size}. ++If the @i{symbol} @b{*} is specified instead of a @i{size}, ++the set is not restricted on the basis of @i{dimension}. ++ ++@subsubheading See Also:: ++ ++@ref{Required Kinds of Specialized Arrays}, ++@ref{Sharpsign Left-Parenthesis}, ++@ref{Printing Other Vectors}, ++@ref{Sharpsign A} ++ ++@subsubheading Notes:: ++ ++The @i{type} @t{(vector @i{e} @i{s})} ++is equivalent to the @i{type} @t{(array @i{e} (@i{s}))}. ++ ++The type @t{(vector bit)} has the name @b{bit-vector}. ++ ++The union of all @i{types} @t{(vector C)}, ++where C is any @i{subtype} of @b{character}, ++has the name @b{string}. ++ ++@t{(vector *)} refers to all @i{vectors} ++regardless of element type, @t{(vector @i{type-specifier})} ++refers only to those @i{vectors} ++that can result from giving @i{type-specifier} as the ++@t{:element-type} argument to @b{make-array}. ++ ++@node simple-vector, bit-vector, vector (System Class), Arrays Dictionary ++@subsection simple-vector [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{simple-vector}, ++@b{vector}, ++@b{simple-array}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} of a @i{vector} that is not displaced to another ++@i{array}, has no @i{fill pointer}, is not ++@i{expressly adjustable} ++and is able to hold ++elements of any @i{type} is a @i{subtype} of @i{type} @b{simple-vector}. ++ ++The @i{type} @b{simple-vector} is a @i{subtype} of @i{type} @b{vector}, ++and is a @i{subtype} of @i{type} @t{(vector t)}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{simple-vector}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ The default is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This is the same as @t{(simple-array t (@i{size}))}. ++ ++@node bit-vector, simple-bit-vector, simple-vector, Arrays Dictionary ++@subsection bit-vector [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{bit-vector}, ++@b{vector}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{bit vector} is a @i{vector} the @i{element type} of which is @i{bit}. ++ ++The @i{type} @b{bit-vector} is a @i{subtype} of @i{type} @b{vector}, ++for @b{bit-vector} means @t{(vector bit)}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{bit-vector}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the same @i{type} as the @i{type} @t{(array bit (@i{size}))}; ++that is, the set of @i{bit vectors} of size @i{size}. ++ ++@subsubheading See Also:: ++ ++@ref{Sharpsign Asterisk}, ++@ref{Printing Bit Vectors}, ++@ref{Required Kinds of Specialized Arrays} ++ ++@node simple-bit-vector, make-array, bit-vector, Arrays Dictionary ++@subsection simple-bit-vector [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{simple-bit-vector}, ++@b{bit-vector}, ++@b{vector}, ++@b{simple-array}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} of a @i{bit vector} that is not displaced ++to another @i{array}, has no @i{fill pointer}, and is ++not ++@i{expressly adjustable} ++is a ++@i{subtype} of @i{type} @b{simple-bit-vector}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{simple-bit-vector}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ The default is the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the same type as the @i{type} ++@t{(simple-array bit (@i{size}))}; ++that is, the set of @i{simple bit vectors} of size @i{size}. ++ ++@node make-array, adjust-array, simple-bit-vector, Arrays Dictionary ++@subsection make-array [Function] ++ ++@code{make-array} @i{dimensions @r{&key} element-type ++ initial-element ++ initial-contents ++ adjustable ++ fill-pointer ++ displaced-to ++ displaced-index-offset}@* ++ @result{} @i{new-array} ++ ++@subsubheading Arguments and Values:: ++ ++@i{dimensions}---a @i{designator} for a @i{list} of @i{valid array dimensions}. ++ ++@i{element-type}---a @i{type specifier}. ++ The default is @b{t}. ++ ++@i{initial-element}---an @i{object}. ++ ++@i{initial-contents}---an @i{object}. ++ ++@i{adjustable}---a @i{generalized boolean}. ++ The default is @b{nil}. ++ ++@i{fill-pointer}---a @i{valid fill pointer} for the @i{array} to be created, ++ or @b{t} or @b{nil}. ++ The default is @b{nil}. ++ ++@i{displaced-to}---an @i{array} or @b{nil}. ++ The default is @b{nil}. ++ This option must not be supplied if either @i{initial-element} ++ or @i{initial-contents} is supplied. ++ ++@i{displaced-index-offset}---a @i{valid array row-major index} ++ for @i{displaced-to}. The default is @t{0}. ++ This option must not be supplied unless a @i{non-nil} @i{displaced-to} is supplied. ++ ++@i{new-array}---an @i{array}. ++ ++@subsubheading Description:: ++ ++Creates and returns an @i{array} constructed of the most @i{specialized} ++@i{type} that can accommodate elements of @i{type} given by @i{element-type}. ++If @i{dimensions} is @b{nil} then a zero-dimensional @i{array} is created. ++ ++@i{Dimensions} represents the dimensionality of the new @i{array}. ++ ++@i{element-type} indicates the @i{type} of the elements intended to be stored ++in the @i{new-array}. The @i{new-array} can actually store any @i{objects} ++of the @i{type} which results from @i{upgrading} @i{element-type}; ++see @ref{Array Upgrading}. ++ ++If @i{initial-element} is supplied, ++it is used to initialize each @i{element} of @i{new-array}. ++If @i{initial-element} is supplied, ++it must be of the @i{type} given by @i{element-type}. ++@i{initial-element} cannot be supplied if either the @t{:initial-contents} option ++is supplied or @i{displaced-to} is @i{non-nil}. ++If @i{initial-element} is not supplied, ++ ++the consequences of later reading an uninitialized @i{element} of @i{new-array} ++are undefined ++ ++unless either @i{initial-contents} is supplied ++or @i{displaced-to} is @i{non-nil}. ++ ++@i{initial-contents} is used to initialize the contents of @i{array}. ++For example: ++ ++@example ++ (make-array '(4 2 3) :initial-contents ++ '(((a b c) (1 2 3)) ++ ((d e f) (3 1 2)) ++ ((g h i) (2 3 1)) ++ ((j k l) (0 0 0)))) ++@end example ++ ++@i{initial-contents} is composed of a nested structure of @i{sequences}. ++The numbers of levels in the structure must equal the rank of @i{array}. ++Each leaf of the nested structure must be of the @i{type} given by @i{element-type}. ++If @i{array} is zero-dimensional, then @i{initial-contents} specifies the single ++@i{element}. Otherwise, @i{initial-contents} must be a @i{sequence} ++whose length is equal to the first dimension; each element must be a nested ++structure for an @i{array} whose dimensions are the remaining dimensions, ++and so on. ++@i{Initial-contents} cannot be supplied if either ++@i{initial-element} is supplied ++or @i{displaced-to} is @i{non-nil}. ++If @i{initial-contents} is not supplied, ++ ++the consequences of later reading an uninitialized @i{element} of @i{new-array} ++are undefined ++ ++unless either @i{initial-element} is supplied ++or @i{displaced-to} is @i{non-nil}. ++ ++If @i{adjustable} is @i{non-nil}, ++the array is @i{expressly adjustable} ++ (and so @i{actually adjustable}); ++otherwise, the array is not @i{expressly adjustable} ++ (and it is @i{implementation-dependent} whether ++ the array is @i{actually adjustable}). ++ ++If @i{fill-pointer} is @i{non-nil}, ++the @i{array} must be one-dimensional; ++that is, the @i{array} must be a @i{vector}. ++If @i{fill-pointer} is @b{t}, ++the length of the @i{vector} is used to initialize the @i{fill pointer}. ++If @i{fill-pointer} is an @i{integer}, ++it becomes the initial @i{fill pointer} for the @i{vector}. ++ ++If @i{displaced-to} is @i{non-nil}, ++@b{make-array} will create a @i{displaced array} ++and @i{displaced-to} is the @i{target} of that @i{displaced array}. ++In that case, the consequences are undefined if the @i{actual array element type} of ++@i{displaced-to} is not @i{type equivalent} to the @i{actual array element type} ++of the @i{array} being created. ++If @i{displaced-to} is @b{nil}, the @i{array} is not a @i{displaced array}. ++ ++The @i{displaced-index-offset} is made to be the index offset of the @i{array}. ++When an array A is given as ++the @t{:displaced-to} @i{argument} to @b{make-array} ++when creating array B, ++then array B is said to be displaced to array A. The ++total number of elements in an @i{array}, ++called the total size of the @i{array}, ++is calculated as the product of all the dimensions. ++It is required that the total size of A be no smaller than the sum ++of the total size of B plus the offset @t{n} supplied by ++the @i{displaced-index-offset}. ++The effect of displacing is that array B does not have any ++elements of its own, but instead maps @i{accesses} to itself into ++@i{accesses} to array A. The mapping treats both @i{arrays} as if they ++were one-dimensional by taking the elements in row-major order, ++and then maps an @i{access} to element @t{k} of array B to an @i{access} to element ++@t{k}+@t{n} of array A. ++ ++If @b{make-array} is called with @i{adjustable}, @i{fill-pointer}, ++and @i{displaced-to} each @b{nil}, ++then the result is a @i{simple array}. ++ ++If @b{make-array} is called with one or more of @i{adjustable}, ++@i{fill-pointer}, or @i{displaced-to} being @i{true}, whether the ++resulting @i{array} is a @i{simple array} is @i{implementation-dependent}. ++ ++ When an array A is given as the @t{:displaced-to} @i{argument} to ++ @b{make-array} when creating array B, then array B is said to ++ be displaced to array A. The total number of elements in an @i{array}, ++ called the total size of the @i{array}, is calculated as the product ++ of all the dimensions. ++The consequences are unspecified if ++the total size of A is smaller than the sum ++of the total size of B plus the offset @t{n} supplied by ++the @i{displaced-index-offset}. ++The effect of displacing is that array B does not have any ++elements of its own, but instead maps @i{accesses} to itself into ++@i{accesses} to array A. The mapping treats both @i{arrays} as if they ++were one-dimensional by taking the elements in row-major order, ++and then maps an @i{access} to element @t{k} of array B to an @i{access} ++to @i{element} @t{k}+@t{n} of array A. ++ ++@subsubheading Examples:: ++@example ++ ++ (make-array 5) ;; Creates a one-dimensional array of five elements. ++ (make-array '(3 4) :element-type '(mod 16)) ;; Creates a ++ ;;two-dimensional array, 3 by 4, with four-bit elements. ++ (make-array 5 :element-type 'single-float) ;; Creates an array of single-floats. ++@end example ++ ++@example ++ (make-array nil :initial-element nil) @result{} #0ANIL ++ (make-array 4 :initial-element nil) @result{} #(NIL NIL NIL NIL) ++ (make-array '(2 4) ++ :element-type '(unsigned-byte 2) ++ :initial-contents '((0 1 2 3) (3 2 1 0))) ++@result{} #2A((0 1 2 3) (3 2 1 0)) ++ (make-array 6 ++ :element-type 'character ++ :initial-element #\a ++ :fill-pointer 3) @result{} "aaa" ++@end example ++ ++The following is an example of making a @i{displaced array}. ++ ++@example ++ (setq a (make-array '(4 3))) ++@result{} # ++ (dotimes (i 4) ++ (dotimes (j 3) ++ (setf (aref a i j) (list i 'x j '= (* i j))))) ++@result{} NIL ++ (setq b (make-array 8 :displaced-to a ++ :displaced-index-offset 2)) ++@result{} # ++ (dotimes (i 8) ++ (print (list i (aref b i)))) ++@t{ |> } (0 (0 X 2 = 0)) ++@t{ |> } (1 (1 X 0 = 0)) ++@t{ |> } (2 (1 X 1 = 1)) ++@t{ |> } (3 (1 X 2 = 2)) ++@t{ |> } (4 (2 X 0 = 0)) ++@t{ |> } (5 (2 X 1 = 2)) ++@t{ |> } (6 (2 X 2 = 4)) ++@t{ |> } (7 (3 X 0 = 0)) ++@result{} NIL ++@end example ++ ++The last example depends on the fact that @i{arrays} are, in effect, ++stored in row-major order. ++ ++@example ++ (setq a1 (make-array 50)) ++@result{} # ++ (setq b1 (make-array 20 :displaced-to a1 :displaced-index-offset 10)) ++@result{} # ++ (length b1) @result{} 20 ++ ++ (setq a2 (make-array 50 :fill-pointer 10)) ++@result{} # ++ (setq b2 (make-array 20 :displaced-to a2 :displaced-index-offset 10)) ++@result{} # ++ (length a2) @result{} 10 ++ (length b2) @result{} 20 ++ ++ (setq a3 (make-array 50 :fill-pointer 10)) ++@result{} # ++ (setq b3 (make-array 20 :displaced-to a3 :displaced-index-offset 10 ++ :fill-pointer 5)) ++@result{} # ++ (length a3) @result{} 10 ++ (length b3) @result{} 5 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{adjustable-array-p} ++, ++@ref{aref} ++, ++@ref{arrayp} ++, ++@ref{array-element-type} ++, ++@ref{array-rank-limit} ++, ++@ref{array-dimension-limit} ++, ++@ref{fill-pointer} ++, ++@ref{upgraded-array-element-type} ++ ++@subsubheading Notes:: ++ ++There is no specified way to create an @i{array} ++for which @b{adjustable-array-p} definitely ++returns @i{false}. ++There is no specified way to create an @i{array} ++that is not a @i{simple array}. ++ ++@node adjust-array, adjustable-array-p, make-array, Arrays Dictionary ++@subsection adjust-array [Function] ++ ++@code{adjust-array} @i{array new-dimensions @r{&key} element-type ++ initial-element ++ initial-contents ++ fill-pointer ++ displaced-to ++ displaced-index-offset}@* ++ @result{} @i{adjusted-array} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{new-dimensions}---a @i{valid array dimension} ++ or a @i{list} of @i{valid array dimensions}. ++ ++@i{element-type}---a @i{type specifier}. ++ ++@i{initial-element}---an @i{object}. ++ @i{Initial-element} must not be supplied if either ++ @i{initial-contents} or @i{displaced-to} is supplied. ++ ++@i{initial-contents}---an @i{object}. ++ If @i{array} has rank greater than zero, then @i{initial-contents} ++ is composed of nested @i{sequences}, the depth of which must equal ++ the rank of @i{array}. Otherwise, @i{array} is zero-dimensional and ++ @i{initial-contents} supplies the single element. ++ @i{initial-contents} must not be supplied if either ++ @i{initial-element} or @i{displaced-to} is given. ++ ++@i{fill-pointer}---a @i{valid fill pointer} for the ++ @i{array} to be created, or @b{t}, or @b{nil}. ++ The default is @b{nil}. ++ ++@i{displaced-to}---an @i{array} or @b{nil}. ++ @i{initial-elements} and @i{initial-contents} must not be supplied ++ if @i{displaced-to} is supplied. ++ ++@i{displaced-index-offset}---an @i{object} of @i{type} @t{(fixnum 0 @i{n})} ++ where @i{n} is @t{(array-total-size @i{displaced-to})}. ++ @i{displaced-index-offset} may be supplied only if @i{displaced-to} is supplied. ++ ++@i{adjusted-array}---an @i{array}. ++ ++@subsubheading Description:: ++ ++@b{adjust-array} changes the dimensions or elements of @i{array}. ++The result is an @i{array} of the same @i{type} and rank as @i{array}, ++that is either the modified @i{array}, ++or a newly created @i{array} to which ++@i{array} can be displaced, and that has ++the given @i{new-dimensions}. ++ ++@i{New-dimensions} specify the size of each @i{dimension} of @i{array}. ++ ++@i{Element-type} specifies the @i{type} of the @i{elements} ++of the resulting @i{array}. If @i{element-type} is supplied, ++the consequences are unspecified if ++the @i{upgraded array element type} of @i{element-type} ++is not the same as the @i{actual array element type} of @i{array}. ++ ++If @i{initial-contents} is supplied, it is treated as for ++@b{make-array}. In this case none of the original contents of ++@i{array} appears in the resulting @i{array}. ++ ++If @i{fill-pointer} is an @i{integer}, ++it becomes the @i{fill pointer} for the resulting @i{array}. ++If @i{fill-pointer} is the symbol @b{t}, ++it indicates that the size of the resulting @i{array} ++should be used as the @i{fill pointer}. ++If @i{fill-pointer} is @b{nil}, ++it indicates that the @i{fill pointer} should be left as it is. ++ ++If @i{displaced-to} ++@i{non-nil}, a @i{displaced array} ++is created. The resulting @i{array} shares its contents with the @i{array} given by ++@i{displaced-to}. ++The resulting @i{array} cannot contain more elements than the @i{array} ++it is displaced to. ++If @i{displaced-to} is not supplied or @b{nil}, ++the resulting @i{array} is not a @i{displaced array}. ++If array A is created displaced to array B and subsequently ++array B is given to @b{adjust-array}, array A will still be ++displaced to array B. ++Although @i{array} might be a @i{displaced array}, ++the resulting @i{array} is not a @i{displaced array} unless ++@i{displaced-to} is supplied and not @b{nil}. ++ ++The interaction between @b{adjust-array} and ++displaced @i{arrays} ++is as follows given three @i{arrays}, @t{A}, @t{B}, and~@t{C}: ++ ++@table @asis ++ ++@item @t{A} is not displaced before or after the call ++@example ++ (adjust-array A ...) ++@end example ++ ++The dimensions of @t{A} are altered, and the ++contents rearranged as appropriate. ++Additional elements of @t{A} are taken from ++@i{initial-element}. ++The use of @i{initial-contents} causes all old contents to be ++discarded. ++ ++@item @t{A} is not displaced before, but is displaced to ++@t{C} after the call ++@example ++ (adjust-array A ... :displaced-to C) ++@end example ++ ++None of the original contents of @t{A} appears in ++@t{A} afterwards; @t{A} now contains ++the contents of @t{C}, without any rearrangement of @t{C}. ++ ++@item @t{A} is displaced to @t{B} ++before the call, and is displaced to @t{C} after ++the call ++@example ++ (adjust-array A ... :displaced-to B) ++ (adjust-array A ... :displaced-to C) ++@end example ++ ++@t{B} and @t{C} might be the same. The contents of @t{B} do not appear in ++@t{A} afterward unless such contents also happen to be in @t{C} If ++@i{displaced-index-offset} ++is not supplied in the @b{adjust-array} call, it defaults ++to zero; the old offset into @t{B} is not retained. ++ ++@item @t{A} is displaced to @t{B} before the call, but not displaced ++afterward. ++@example ++ (adjust-array A ... :displaced-to B) ++ (adjust-array A ... :displaced-to nil) ++@end example ++ ++@t{A} gets a ++new ``data region,'' and contents of @t{B} are copied into it as appropriate to ++maintain the existing old contents; additional elements of @t{A} ++are taken from ++@i{initial-element} if supplied. However, ++the use of @i{initial-contents} causes all old contents ++to be discarded. ++@end table ++ ++If @i{displaced-index-offset} is supplied, ++it specifies the offset ++of the resulting @i{array} from the beginning of ++the @i{array} that it is displaced to. ++If @i{displaced-index-offset} is not supplied, the offset is~0. ++The size of the resulting @i{array} plus the ++offset value cannot exceed the size of ++the @i{array} that it is displaced to. ++ ++If only @i{new-dimensions} ++and an @i{initial-element} argument are supplied, ++those elements of @i{array} that ++are still in bounds appear in the resulting @i{array}. The elements of ++the resulting @i{array} that are not in the bounds of ++@i{array} are initialized ++to @i{initial-element}; if @i{initial-element} is not provided, ++ ++the consequences of later reading any such new @i{element} of @i{new-array} ++before it has been initialized ++are undefined. ++ ++If @i{initial-contents} or @i{displaced-to} is supplied, ++then none of the original contents of @i{array} appears in the new @i{array}. ++ ++The consequences are unspecified if @i{array} is adjusted ++to a size smaller than its @i{fill pointer} without supplying ++the @i{fill-pointer} argument so that its @i{fill-pointer} ++is properly adjusted in the process. ++ ++If @t{A} is displaced to @t{B}, the consequences are unspecified ++if @t{B} is adjusted in such a way that it no longer has enough elements ++to satisfy @t{A}. ++ ++If @b{adjust-array} is applied to an @i{array} that is @i{actually adjustable}, ++the @i{array} returned is @i{identical} to @i{array}. ++If the @i{array} returned by @b{adjust-array} ++is @i{distinct} from @i{array}, then the argument @i{array} is unchanged. ++ ++Note that if an @i{array} A is displaced to another @i{array} B, ++and B is displaced to another @i{array} C, and B is altered by ++@b{adjust-array}, A must now refer to the adjust contents of B. ++This means that an implementation cannot collapse the chain to make A ++refer to C directly and forget that the chain of reference passes through ++B. However, caching techniques are permitted as long as they preserve the ++semantics specified here. ++ ++@subsubheading Examples:: ++ ++@example ++ (adjustable-array-p ++ (setq ada (adjust-array ++ (make-array '(2 3) ++ :adjustable t ++ :initial-contents '((a b c) (1 2 3))) ++ '(4 6)))) @result{} T ++ (array-dimensions ada) @result{} (4 6) ++ (aref ada 1 1) @result{} 2 ++ (setq beta (make-array '(2 3) :adjustable t)) ++@result{} #2A((NIL NIL NIL) (NIL NIL NIL)) ++ (adjust-array beta '(4 6) :displaced-to ada) ++@result{} #2A((A B C NIL NIL NIL) ++ (1 2 3 NIL NIL NIL) ++ (NIL NIL NIL NIL NIL NIL) ++ (NIL NIL NIL NIL NIL NIL)) ++ (array-dimensions beta) @result{} (4 6) ++ (aref beta 1 1) @result{} 2 ++@end example ++ ++Suppose that the 4-by-4 array in @t{m} looks like this: ++ ++@example ++#2A(( alpha beta gamma delta ) ++ ( epsilon zeta eta theta ) ++ ( iota kappa lambda mu ) ++ ( nu xi omicron pi )) ++@end example ++ ++Then the result of ++ ++@example ++ (adjust-array m '(3 5) :initial-element 'baz) ++@end example ++ ++is a 3-by-5 array with contents ++ ++@example ++#2A(( alpha beta gamma delta baz ) ++ ( epsilon zeta eta theta baz ) ++ ( iota kappa lambda mu baz )) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{error} is signaled if @i{fill-pointer} is supplied ++and @i{non-nil} but @i{array} has no @i{fill pointer}. ++ ++@subsubheading See Also:: ++ ++@ref{adjustable-array-p} ++, ++@ref{make-array} ++, ++@ref{array-dimension-limit} ++, ++@ref{array-total-size-limit} ++, ++@b{array} ++ ++@node adjustable-array-p, aref, adjust-array, Arrays Dictionary ++@subsection adjustable-array-p [Function] ++ ++@code{adjustable-array-p} @i{array} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns true if and only if @b{adjust-array} could return a @i{value} ++which is @i{identical} to @i{array} when given that @i{array} as its ++first @i{argument}. ++ ++@subsubheading Examples:: ++ ++@example ++ (adjustable-array-p ++ (make-array 5 ++ :element-type 'character ++ :adjustable t ++ :fill-pointer 3)) @result{} @i{true} ++ (adjustable-array-p (make-array 4)) @result{} @i{implementation-dependent} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its argument is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{adjust-array} ++, ++@ref{make-array} ++ ++@node aref, array-dimension, adjustable-array-p, Arrays Dictionary ++@subsection aref [Accessor] ++ ++@code{aref} @i{array @r{&rest} subscripts} @result{} @i{element} ++ ++(setf (@code{ aref} @i{array @r{&rest} subscripts}) new-element)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{subscripts}---a @i{list} of @i{valid array indices} for the @i{array}. ++ ++@i{element}, @i{new-element}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{array} @i{element} specified by the @i{subscripts}. ++If no @i{subscripts} are supplied and @i{array} is zero rank, ++@b{aref} @i{accesses} the sole element of @i{array}. ++ ++@b{aref} ignores @i{fill pointers}. ++It is permissible to use @b{aref} ++to @i{access} any @i{array} @i{element}, ++whether @i{active} or not. ++ ++@subsubheading Examples:: ++ ++If the variable @t{foo} names a 3-by-5 array, ++then the first index could be 0, 1, or 2, and then second index ++could be 0, 1, 2, 3, or 4. The array elements can be referred to by using ++the @i{function} @b{aref}; for example, @t{(aref foo 2 1)} ++refers to element (2, 1) of the array. ++ ++@example ++ (aref (setq alpha (make-array 4)) 3) @result{} @i{implementation-dependent} ++ (setf (aref alpha 3) 'sirens) @result{} SIRENS ++ (aref alpha 3) @result{} SIRENS ++ (aref (setq beta (make-array '(2 4) ++ :element-type '(unsigned-byte 2) ++ :initial-contents '((0 1 2 3) (3 2 1 0)))) ++ 1 2) @result{} 1 ++ (setq gamma '(0 2)) ++ (apply #'aref beta gamma) @result{} 2 ++ (setf (apply #'aref beta gamma) 3) @result{} 3 ++ (apply #'aref beta gamma) @result{} 3 ++ (aref beta 0 2) @result{} 3 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{bit (Array)} ++, ++@ref{char} ++, ++@ref{elt} ++, ++@ref{row-major-aref} ++, ++@ref{svref} ++, ++ ++@ref{Compiler Terminology} ++ ++@node array-dimension, array-dimensions, aref, Arrays Dictionary ++@subsection array-dimension [Function] ++ ++@code{array-dimension} @i{array axis-number} @result{} @i{dimension} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{axis-number}---an @i{integer} greater than or equal to zero ++ and less than the @i{rank} of the @i{array}. ++ ++@i{dimension}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{array-dimension} returns the @i{axis-number} ++@i{dimension}_1 of @i{array}. ++(Any @i{fill pointer} is ignored.) ++ ++@subsubheading Examples:: ++ ++@example ++ (array-dimension (make-array 4) 0) @result{} 4 ++ (array-dimension (make-array '(2 3)) 1) @result{} 3 ++@end example ++ ++@subsubheading Affected By:: ++None. ++ ++@subsubheading See Also:: ++ ++@ref{array-dimensions} ++, ++@ref{length} ++ ++@subsubheading Notes:: ++@example ++ (array-dimension array n) @equiv{} (nth n (array-dimensions array)) ++@end example ++ ++@node array-dimensions, array-element-type, array-dimension, Arrays Dictionary ++@subsection array-dimensions [Function] ++ ++@code{array-dimensions} @i{array} @result{} @i{dimensions} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{dimensions}---a @i{list} of @i{integers}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of the @i{dimensions} of @i{array}. ++(If @i{array} is a @i{vector} with a @i{fill pointer}, ++ that @i{fill pointer} is ignored.) ++ ++@subsubheading Examples:: ++ ++@example ++ (array-dimensions (make-array 4)) @result{} (4) ++ (array-dimensions (make-array '(2 3))) @result{} (2 3) ++ (array-dimensions (make-array 4 :fill-pointer 2)) @result{} (4) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its argument is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{array-dimension} ++ ++@node array-element-type, array-has-fill-pointer-p, array-dimensions, Arrays Dictionary ++@subsection array-element-type [Function] ++ ++@code{array-element-type} @i{array} @result{} @i{typespec} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Description:: ++ ++Returns a @i{type specifier} which represents the @i{actual array element type} ++of the array, which is the set of @i{objects} that such an @i{array} can hold. ++(Because of @i{array} @i{upgrading}, this @i{type specifier} can in ++some cases denote a @i{supertype} of the @i{expressed array element type} ++of the @i{array}.) ++ ++@subsubheading Examples:: ++ ++@example ++ (array-element-type (make-array 4)) @result{} T ++ (array-element-type (make-array 12 :element-type '(unsigned-byte 8))) ++@result{} @i{implementation-dependent} ++ (array-element-type (make-array 12 :element-type '(unsigned-byte 5))) ++@result{} @i{implementation-dependent} ++@end example ++ ++@example ++ (array-element-type (make-array 5 :element-type '(mod 5))) ++@end example ++ ++could be @t{(mod 5)}, @t{(mod 8)}, @t{fixnum}, @t{t}, or any other ++type of which @t{(mod 5)} is a @i{subtype}. ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its argument is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@b{array}, ++@ref{make-array} ++, ++@ref{subtypep} ++, ++@ref{upgraded-array-element-type} ++ ++@node array-has-fill-pointer-p, array-displacement, array-element-type, Arrays Dictionary ++@subsection array-has-fill-pointer-p [Function] ++ ++@code{array-has-fill-pointer-p} @i{array} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{array} has a @i{fill pointer}; ++otherwise returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (array-has-fill-pointer-p (make-array 4)) @result{} @i{implementation-dependent} ++ (array-has-fill-pointer-p (make-array '(2 3))) @result{} @i{false} ++ (array-has-fill-pointer-p ++ (make-array 8 ++ :fill-pointer 2 ++ :initial-element 'filler)) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its argument is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++, ++@ref{fill-pointer} ++ ++@subsubheading Notes:: ++ ++Since @i{arrays} of @i{rank} other than one cannot have a @i{fill pointer}, ++@b{array-has-fill-pointer-p} always returns @b{nil} when its argument ++is such an array. ++ ++@node array-displacement, array-in-bounds-p, array-has-fill-pointer-p, Arrays Dictionary ++@subsection array-displacement [Function] ++ ++@code{array-displacement} @i{array} @result{} @i{displaced-to, displaced-index-offset} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{displaced-to}---an @i{array} or @b{nil}. ++ ++@i{displaced-index-offset}---a non-negative @i{fixnum}. ++ ++@subsubheading Description:: ++ ++If the @i{array} is a @i{displaced array}, ++returns the @i{values} of the @t{:displaced-to} and @t{:displaced-index-offset} ++options ++for the @i{array} (see the @i{functions} @b{make-array} and @b{adjust-array}). ++If the @i{array} is not a @i{displaced array}, ++@b{nil} and @t{0} are returned. ++ ++If @b{array-displacement} is called on an @i{array} ++for which a @i{non-nil} @i{object} was provided as the ++@t{:displaced-to} @i{argument} to @b{make-array} ++or @b{adjust-array}, it must return that @i{object} ++as its first value. It is @i{implementation-dependent} ++whether @b{array-displacement} returns a @i{non-nil} ++@i{primary value} for any other @i{array}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a1 (make-array 5)) @result{} # ++ (setq a2 (make-array 4 :displaced-to a1 ++ :displaced-index-offset 1)) ++@result{} # ++ (array-displacement a2) ++@result{} #, 1 ++ (setq a3 (make-array 2 :displaced-to a2 ++ :displaced-index-offset 2)) ++@result{} # ++ (array-displacement a3) ++@result{} #, 2 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{array} is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++ ++@node array-in-bounds-p, array-rank, array-displacement, Arrays Dictionary ++@subsection array-in-bounds-p [Function] ++ ++@code{array-in-bounds-p} @i{array @r{&rest} subscripts} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{subscripts}---a list of @i{integers} ++ of length equal to the @i{rank} of the @i{array}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if the @i{subscripts} are all in bounds for @i{array}; ++otherwise returns @i{false}. ++(If @i{array} is a @i{vector} with a @i{fill pointer}, ++ that @i{fill pointer} is ignored.) ++ ++@subsubheading Examples:: ++@example ++ (setq a (make-array '(7 11) :element-type 'string-char)) ++ (array-in-bounds-p a 0 0) @result{} @i{true} ++ (array-in-bounds-p a 6 10) @result{} @i{true} ++ (array-in-bounds-p a 0 -1) @result{} @i{false} ++ (array-in-bounds-p a 0 11) @result{} @i{false} ++ (array-in-bounds-p a 7 0) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{array-dimensions} ++ ++@subsubheading Notes:: ++@example ++ (array-in-bounds-p array subscripts) ++ @equiv{} (and (not (some #'minusp (list subscripts))) ++ (every #'< (list subscripts) (array-dimensions array))) ++@end example ++ ++@node array-rank, array-row-major-index, array-in-bounds-p, Arrays Dictionary ++@subsection array-rank [Function] ++ ++@code{array-rank} @i{array} @result{} @i{rank} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{rank}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the number of @i{dimensions} of @i{array}. ++ ++@subsubheading Examples:: ++ ++@example ++ (array-rank (make-array '())) @result{} 0 ++ (array-rank (make-array 4)) @result{} 1 ++ (array-rank (make-array '(4))) @result{} 1 ++ (array-rank (make-array '(2 3))) @result{} 2 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its argument is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{array-rank-limit} ++, ++@ref{make-array} ++ ++@node array-row-major-index, array-total-size, array-rank, Arrays Dictionary ++@subsection array-row-major-index [Function] ++ ++@code{array-row-major-index} @i{array @r{&rest} subscripts} @result{} @i{index} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{subscripts}---a @i{list} of @i{valid array indices} for the @i{array}. ++ ++@i{index}---a @i{valid array row-major index} for the @i{array}. ++ ++@subsubheading Description:: ++ ++Computes the position according to the row-major ordering of @i{array} ++for the element that is specified by @i{subscripts}, and returns the ++offset of the element in the computed position from the beginning of @i{array}. ++ ++For a one-dimensional @i{array}, ++the result of @b{array-row-major-index} ++equals @i{subscript}. ++ ++@b{array-row-major-index} ignores @i{fill pointers}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a (make-array '(4 7) :element-type '(unsigned-byte 8))) ++ (array-row-major-index a 1 2) @result{} 9 ++ (array-row-major-index ++ (make-array '(2 3 4) ++ :element-type '(unsigned-byte 8) ++ :displaced-to a ++ :displaced-index-offset 4) ++ 0 2 1) @result{} 9 ++@end example ++ ++@subsubheading Notes:: ++ ++A possible definition of @b{array-row-major-index}, ++with no error-checking, is ++ ++@example ++ (defun array-row-major-index (a &rest subscripts) ++ (apply #'+ (maplist #'(lambda (x y) ++ (* (car x) (apply #'* (cdr y)))) ++ subscripts ++ (array-dimensions a)))) ++@end example ++ ++@node array-total-size, arrayp, array-row-major-index, Arrays Dictionary ++@subsection array-total-size [Function] ++ ++@code{array-total-size} @i{array} @result{} @i{size} ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{size}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the @i{array total size} of the @i{array}. ++ ++@subsubheading Examples:: ++ ++@example ++ (array-total-size (make-array 4)) @result{} 4 ++ (array-total-size (make-array 4 :fill-pointer 2)) @result{} 4 ++ (array-total-size (make-array 0)) @result{} 0 ++ (array-total-size (make-array '(4 2))) @result{} 8 ++ (array-total-size (make-array '(4 0))) @result{} 0 ++ (array-total-size (make-array '())) @result{} 1 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its argument is not an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++, ++@ref{array-dimensions} ++ ++@subsubheading Notes:: ++ ++If the @i{array} is a @i{vector} with a @i{fill pointer}, ++the @i{fill pointer} is ignored when calculating the @i{array total size}. ++ ++Since the product of no arguments is one, the @i{array total size} of a ++zero-dimensional @i{array} is one. ++ ++@example ++ (array-total-size x) ++ @equiv{} (apply #'* (array-dimensions x)) ++ @equiv{} (reduce #'* (array-dimensions x)) ++@end example ++ ++@node arrayp, fill-pointer, array-total-size, Arrays Dictionary ++@subsection arrayp [Function] ++ ++@code{arrayp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{array}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (arrayp (make-array '(2 3 4) :adjustable t)) @result{} @i{true} ++ (arrayp (make-array 6)) @result{} @i{true} ++ (arrayp #*1011) @result{} @i{true} ++ (arrayp "hi") @result{} @i{true} ++ (arrayp 'hi) @result{} @i{false} ++ (arrayp 12) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{typep} ++ ++@subsubheading Notes:: ++ ++@example ++ (arrayp @i{object}) @equiv{} (typep @i{object} 'array) ++@end example ++ ++@node fill-pointer, row-major-aref, arrayp, Arrays Dictionary ++@subsection fill-pointer [Accessor] ++ ++@code{fill-pointer} @i{vector} @result{} @i{fill-pointer} ++ ++(setf (@code{ fill-pointer} @i{vector}) new-fill-pointer)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{vector}---a @i{vector} with a @i{fill pointer}. ++ ++@i{fill-pointer}, @i{new-fill-pointer}---a @i{valid fill pointer} ++ for the @i{vector}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{fill pointer} of @i{vector}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a (make-array 8 :fill-pointer 4)) @result{} #(NIL NIL NIL NIL) ++ (fill-pointer a) @result{} 4 ++ (dotimes (i (length a)) (setf (aref a i) (* i i))) @result{} NIL ++ a @result{} #(0 1 4 9) ++ (setf (fill-pointer a) 3) @result{} 3 ++ (fill-pointer a) @result{} 3 ++ a @result{} #(0 1 4) ++ (setf (fill-pointer a) 8) @result{} 8 ++ a @result{} #(0 1 4 9 NIL NIL NIL NIL) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{vector} is not a @i{vector} with a @i{fill pointer}. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++, ++@ref{length} ++ ++@subsubheading Notes:: ++ ++There is no @i{operator} that will remove a @i{vector}'s @i{fill pointer}. ++ ++@node row-major-aref, upgraded-array-element-type, fill-pointer, Arrays Dictionary ++@subsection row-major-aref [Accessor] ++ ++@code{row-major-aref} @i{array index} @result{} @i{element} ++ ++(setf (@code{ row-major-aref} @i{array index}) new-element)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{array}---an @i{array}. ++ ++@i{index}---a @i{valid array row-major index} for the @i{array}. ++ ++@i{element}, @i{new-element}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Considers @i{array} as a @i{vector} by viewing its @i{elements} ++in row-major order, and returns the @i{element} of that @i{vector} ++which is referred to by the given @i{index}. ++ ++@b{row-major-aref} is valid for use with @b{setf}. ++ ++@subsubheading See Also:: ++ ++@ref{aref} ++, ++@ref{array-row-major-index} ++ ++@subsubheading Notes:: ++ ++@example ++ (row-major-aref array index) @equiv{} ++ (aref (make-array (array-total-size array) ++ :displaced-to array ++ :element-type (array-element-type array)) ++ index) ++ ++ (aref array i1 i2 ...) @equiv{} ++ (row-major-aref array (array-row-major-index array i1 i2)) ++@end example ++ ++@node upgraded-array-element-type, array-dimension-limit, row-major-aref, Arrays Dictionary ++@subsection upgraded-array-element-type [Function] ++ ++@code{upgraded-array-element-type} @i{typespec @r{&optional} environment} @result{} @i{upgraded-typespec} ++ ++@subsubheading Arguments and Values:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ The default is @b{nil}, denoting the @i{null lexical environment} ++ and the current @i{global environment}. ++ ++@i{upgraded-typespec}---a @i{type specifier}. ++ ++@subsubheading Description:: ++ ++Returns the @i{element type} of ++the most @i{specialized} @i{array} representation capable of ++holding items of the @i{type} denoted by @i{typespec}. ++ ++The @i{typespec} is a @i{subtype} of ++(and possibly @i{type equivalent} to) ++the @i{upgraded-typespec}. ++ ++If @i{typespec} is @b{bit}, ++ the result is @i{type equivalent} to @t{bit}. ++ ++If @i{typespec} is @b{base-char}, ++ the result is @i{type equivalent} to @t{base-char}. ++ ++If @i{typespec} is @b{character}, ++ the result is @i{type equivalent} to @t{character}. ++ ++The purpose of @b{upgraded-array-element-type} is to reveal how ++an implementation does its @i{upgrading}. ++ ++The @i{environment} is used to expand any @i{derived type specifiers} ++that are mentioned in the @i{typespec}. ++ ++@subsubheading See Also:: ++ ++@ref{array-element-type} ++, ++@ref{make-array} ++ ++@subsubheading Notes:: ++ ++Except for storage allocation consequences and dealing correctly with the ++optional @i{environment} @i{argument}, ++@b{upgraded-array-element-type} could be defined as: ++ ++@example ++ (defun upgraded-array-element-type (type &optional environment) ++ (array-element-type (make-array 0 :element-type type))) ++@end example ++ ++@node array-dimension-limit, array-rank-limit, upgraded-array-element-type, Arrays Dictionary ++@subsection array-dimension-limit [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++A positive ++ ++@i{fixnum}, ++ ++the exact magnitude of which is @i{implementation-dependent}, ++but which is not less than @t{1024}. ++ ++@subsubheading Description:: ++ ++The upper exclusive bound on each individual @i{dimension} of an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++ ++@node array-rank-limit, array-total-size-limit, array-dimension-limit, Arrays Dictionary ++@subsection array-rank-limit [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++A positive ++ ++@i{fixnum}, ++ ++the exact magnitude of which is @i{implementation-dependent}, ++but which is not less than @t{8}. ++ ++@subsubheading Description:: ++ ++The upper exclusive bound on the @i{rank} of an @i{array}. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++ ++@node array-total-size-limit, simple-vector-p, array-rank-limit, Arrays Dictionary ++@subsection array-total-size-limit [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++A positive ++ ++@i{fixnum}, ++ ++the exact magnitude of which is @i{implementation-dependent}, ++but which is not less than @t{1024}. ++ ++@subsubheading Description:: ++ ++The upper exclusive bound on the @i{array total size} of an @i{array}. ++ ++The actual limit on the @i{array total size} ++imposed by the @i{implementation} ++might vary according the @i{element type} of the @i{array}; ++in this case, the value of @b{array-total-size-limit} ++will be the smallest of these possible limits. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++, ++@ref{array-element-type} ++ ++@node simple-vector-p, svref, array-total-size-limit, Arrays Dictionary ++@subsection simple-vector-p [Function] ++ ++@code{simple-vector-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{simple-vector}; ++otherwise, returns @i{false}.. ++ ++@subsubheading Examples:: ++ ++@example ++ (simple-vector-p (make-array 6)) @result{} @i{true} ++ (simple-vector-p "aaaaaa") @result{} @i{false} ++ (simple-vector-p (make-array 6 :fill-pointer t)) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@b{simple-vector} ++ ++@subsubheading Notes:: ++ ++@example ++ (simple-vector-p @i{object}) @equiv{} (typep @i{object} 'simple-vector) ++@end example ++ ++@node svref, vector, simple-vector-p, Arrays Dictionary ++@subsection svref [Accessor] ++ ++@code{svref} @i{simple-vector index} @result{} @i{element} ++ ++(setf (@code{ svref} @i{simple-vector index}) new-element)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{simple-vector}---a @i{simple vector}. ++ ++@i{index}---a @i{valid array index} for the @i{simple-vector}. ++ ++@i{element}, @i{new-element}---an @i{object} ++ (whose @i{type} is a @i{subtype} ++ of the @i{array element type} of the @i{simple-vector}). ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{element} of @i{simple-vector} specified by @i{index}. ++ ++@subsubheading Examples:: ++ ++@example ++ (simple-vector-p (setq v (vector 1 2 'sirens))) @result{} @i{true} ++ (svref v 0) @result{} 1 ++ (svref v 2) @result{} SIRENS ++ (setf (svref v 1) 'newcomer) @result{} NEWCOMER ++ v @result{} #(1 NEWCOMER SIRENS) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{aref} ++, ++@b{sbit}, ++@b{schar}, ++@ref{vector} ++, ++ ++@ref{Compiler Terminology} ++ ++@subsubheading Notes:: ++ ++@b{svref} is identical to @b{aref} ++except that it requires its first argument to be a @i{simple vector}. ++ ++@example ++ (svref @i{v} @i{i}) @equiv{} (aref (the simple-vector @i{v}) @i{i}) ++@end example ++ ++@node vector, vector-pop, svref, Arrays Dictionary ++@subsection vector [Function] ++ ++@code{vector} @i{@r{&rest} objects} @result{} @i{vector} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{vector}---a @i{vector} of @i{type} @t{(vector t @t{*})}. ++ ++@subsubheading Description:: ++ ++Creates a @i{fresh} @i{simple general vector} whose size ++corresponds to the number of @i{objects}. ++ ++The @i{vector} is initialized to contain the @i{objects}. ++ ++@subsubheading Examples:: ++ ++@example ++ (arrayp (setq v (vector 1 2 'sirens))) @result{} @i{true} ++ (vectorp v) @result{} @i{true} ++ (simple-vector-p v) @result{} @i{true} ++ (length v) @result{} 3 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++ ++@subsubheading Notes:: ++ ++@b{vector} is analogous to @b{list}. ++ ++@example ++ (vector a_1 a_2 ... a_n) ++ @equiv{} (make-array (list @i{n}) :element-type t ++ :initial-contents ++ (list a_1 a_2 ... a_n)) ++@end example ++ ++@node vector-pop, vector-push, vector, Arrays Dictionary ++@subsection vector-pop [Function] ++ ++@code{vector-pop} @i{vector} @result{} @i{element} ++ ++@subsubheading Arguments and Values:: ++ ++@i{vector}---a @i{vector} with a @i{fill pointer}. ++ ++@i{element}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Decreases the @i{fill pointer} of @i{vector} by one, ++and retrieves the @i{element} of @i{vector} that is ++designated by the new @i{fill pointer}. ++ ++@subsubheading Examples:: ++ ++@example ++ (vector-push (setq fable (list 'fable)) ++ (setq fa (make-array 8 ++ :fill-pointer 2 ++ :initial-element 'sisyphus))) @result{} 2 ++ (fill-pointer fa) @result{} 3 ++ (eq (vector-pop fa) fable) @result{} @i{true} ++ (vector-pop fa) @result{} SISYPHUS ++ (fill-pointer fa) @result{} 1 ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{fill pointer} is decreased by one. ++ ++@subsubheading Affected By:: ++ ++The value of the @i{fill pointer}. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{type-error} is signaled if @i{vector} does not have a @i{fill pointer}. ++ ++If the @i{fill pointer} is zero, @b{vector-pop} signals an error of @i{type} @b{error}. ++ ++@subsubheading See Also:: ++ ++@ref{vector-push} ++, @b{vector-push-extend}, ++@ref{fill-pointer} ++ ++@node vector-push, vectorp, vector-pop, Arrays Dictionary ++@subsection vector-push, vector-push-extend [Function] ++ ++@code{vector-push} @i{new-element vector} @result{} @i{new-index-p} ++ ++@code{vector-push-extend} @i{new-element vector @r{&optional} extension} @result{} @i{new-index} ++ ++@subsubheading Arguments and Values:: ++ ++@i{new-element}---an @i{object}. ++ ++@i{vector}---a @i{vector} with a @i{fill pointer}. ++ ++@i{extension}---a positive @i{integer}. ++ The default is @i{implementation-dependent}. ++ ++@i{new-index-p}---a @i{valid array index} for @i{vector}, or @b{nil}. ++ ++@i{new-index}---a @i{valid array index} for @i{vector}. ++ ++@subsubheading Description:: ++ ++@b{vector-push} and @b{vector-push-extend} store ++@i{new-element} in @i{vector}. ++@b{vector-push} attempts to store ++@i{new-element} ++in the element of @i{vector} designated by the @i{fill pointer}, ++and to increase the @i{fill pointer} by one. If the ++@t{(>= (fill-pointer @i{vector}) (array-dimension @i{vector} 0))}, ++neither @i{vector} nor its @i{fill pointer} are affected. ++Otherwise, the store and increment take ++place and @b{vector-push} ++returns the former value of the @i{fill pointer} ++which is one less than the one it leaves in @i{vector}. ++ ++@b{vector-push-extend} is just like @b{vector-push} except ++that if the @i{fill pointer} gets too large, @i{vector} is extended using ++@b{adjust-array} so that it can contain more elements. ++@i{Extension} ++is the minimum number of elements to be added to @i{vector} if it ++must be extended. ++ ++@b{vector-push} and ++@b{vector-push-extend} return the index of @i{new-element} in @i{vector}. ++If @t{(>= (fill-pointer @i{vector}) (array-dimension @i{vector} 0))}, ++@b{vector-push} returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (vector-push (setq fable (list 'fable)) ++ (setq fa (make-array 8 ++ :fill-pointer 2 ++ :initial-element 'first-one))) @result{} 2 ++ (fill-pointer fa) @result{} 3 ++ (eq (aref fa 2) fable) @result{} @i{true} ++ (vector-push-extend #\X ++ (setq aa ++ (make-array 5 ++ :element-type 'character ++ :adjustable t ++ :fill-pointer 3))) @result{} 3 ++ (fill-pointer aa) @result{} 4 ++ (vector-push-extend #\Y aa 4) @result{} 4 ++ (array-total-size aa) @result{} at least 5 ++ (vector-push-extend #\Z aa 4) @result{} 5 ++ (array-total-size aa) @result{} 9 ;(or more) ++@end example ++ ++@subsubheading Affected By:: ++The value of the @i{fill pointer}. ++ ++How @i{vector} was created. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{error} is signaled by @b{vector-push-extend} ++if it tries to extend @i{vector} and @i{vector} is not @i{actually adjustable}. ++ ++An error of @i{type} @b{error} is signaled if @i{vector} does not ++have a @i{fill pointer}. ++ ++@subsubheading See Also:: ++ ++@ref{adjustable-array-p} ++, ++@ref{fill-pointer} ++, ++@ref{vector-pop} ++ ++@node vectorp, bit (Array), vector-push, Arrays Dictionary ++@subsection vectorp [Function] ++ ++@code{vectorp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{vector}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (vectorp "aaaaaa") @result{} @i{true} ++ (vectorp (make-array 6 :fill-pointer t)) @result{} @i{true} ++ (vectorp (make-array '(2 3 4))) @result{} @i{false} ++ (vectorp #*11) @result{} @i{true} ++ (vectorp #b11) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++@example ++ (vectorp @i{object}) @equiv{} (typep @i{object} 'vector) ++@end example ++ ++@node bit (Array), bit-and, vectorp, Arrays Dictionary ++@subsection bit, sbit [Accessor] ++ ++@code{bit} @i{bit-array @r{&rest} subscripts} @result{} @i{bit} ++ ++@code{sbit} @i{bit-array @r{&rest} subscripts} @result{} @i{bit} ++ ++(setf (@code{bit} @i{bit-array @r{&rest} subscripts}) new-bit)@*(setf (@code{sbit} @i{bit-array @r{&rest} subscripts}) new-bit)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{bit-array}---for @b{bit}, a @i{bit array}; ++ for @b{sbit}, a @i{simple bit array}. ++ ++@i{subscripts}---a @i{list} of @i{valid array indices} ++ for the @i{bit-array}. ++ ++@i{bit}---a @i{bit}. ++ ++@subsubheading Description:: ++ ++@b{bit} and @b{sbit} @i{access} the @i{bit-array} ++@i{element} specified by @i{subscripts}. ++ ++These @i{functions} ignore the @i{fill pointer} when @i{accessing} @i{elements}. ++ ++@subsubheading Examples:: ++ ++@example ++ (bit (setq ba (make-array 8 ++ :element-type 'bit ++ :initial-element 1)) ++ 3) @result{} 1 ++ (setf (bit ba 3) 0) @result{} 0 ++ (bit ba 3) @result{} 0 ++ (sbit ba 5) @result{} 1 ++ (setf (sbit ba 5) 1) @result{} 1 ++ (sbit ba 5) @result{} 1 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{aref} ++, ++ ++@ref{Compiler Terminology} ++ ++@subsubheading Notes:: ++ ++@b{bit} and @b{sbit} are like @b{aref} ++except that they require @i{arrays} to be ++a @i{bit array} and a @i{simple bit array}, respectively. ++ ++@b{bit} and @b{sbit}, unlike @b{char} and @b{schar}, ++allow the first argument to be an @i{array} of any @i{rank}. ++ ++@node bit-and, bit-vector-p, bit (Array), Arrays Dictionary ++@subsection bit-and, bit-andc1, bit-andc2, bit-eqv, ++@subheading bit-ior, bit-nand, bit-nor, bit-not, bit-orc1, bit-orc2, bit-xor ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{bit-and} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-andc1} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-andc2} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-eqv} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-ior} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-nand} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-nor} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-orc1} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-orc2} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-xor} @i{bit-array1 bit-array2 @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@code{bit-not} @i{bit-array @r{&optional} opt-arg} @result{} @i{resulting-bit-array} ++ ++@subsubheading Arguments and Values:: ++ ++@i{bit-array}, @i{bit-array1}, @i{bit-array2}---a @i{bit array}. ++ ++@i{Opt-arg}---a @i{bit array}, or @b{t}, or @b{nil}. ++ The default is @b{nil}. ++ ++@i{Bit-array}, @i{bit-array1}, @i{bit-array2}, and @i{opt-arg} ++(if an @i{array}) must all be of the same @i{rank} and @i{dimensions}. ++ ++@i{resulting-bit-array}---a @i{bit array}. ++ ++@subsubheading Description:: ++ ++These functions perform ++bit-wise logical operations on @i{bit-array1} and @i{bit-array2} ++and return an @i{array} ++of matching @i{rank} and @i{dimensions}, ++such that any given bit of the result ++is produced by operating on corresponding bits from each of the arguments. ++ ++In the case of @b{bit-not}, an @i{array} ++of @i{rank} and @i{dimensions} matching @i{bit-array} ++is returned that contains a copy of @i{bit-array} ++with all the bits inverted. ++ ++If @i{opt-arg} is of type @t{(array bit)} the contents of the ++result are destructively placed into @i{opt-arg}. ++If @i{opt-arg} is the symbol @b{t}, ++@i{bit-array} or @i{bit-array1} is replaced with the result; ++if @i{opt-arg} is @b{nil} or omitted, a new @i{array} is created ++to contain the result. ++ ++Figure 15--4 indicates the logical operation ++performed by each of the @i{functions}. ++ ++ 2 ++@format ++@group ++@noindent ++@w{@b{Function} @b{Operation} } ++@w{_______________________________________________________________________________________________________} ++@w{ } ++@w{@b{bit-and} and } ++@w{@b{bit-eqv} equivalence (exclusive nor) } ++@w{@b{bit-not} complement } ++@w{@b{bit-ior} inclusive or } ++@w{@b{bit-xor} exclusive or } ++@w{@b{bit-nand} complement of @i{bit-array1} and @i{bit-array2} } ++@w{@b{bit-nor} complement of @i{bit-array1} or @i{bit-array2} } ++@w{@b{bit-andc1} and complement of @i{bit-array1} with @i{bit-array2}} ++@w{@b{bit-andc2} and @i{bit-array1} with complement of @i{bit-array2}} ++@w{@b{bit-orc1} or complement of @i{bit-array1} with @i{bit-array2} } ++@w{@b{bit-orc2} or @i{bit-array1} with complement of @i{bit-array2} } ++@w{@w{ Figure 15--3: Bit-wise Logical Operations on Bit Arrays} ++} ++@end group ++@end format ++ ++@subsubheading Examples:: ++@example ++ (bit-and (setq ba #*11101010) #*01101011) @result{} #*01101010 ++ (bit-and #*1100 #*1010) @result{} #*1000 ++ (bit-andc1 #*1100 #*1010) @result{} #*0010 ++ (setq rba (bit-andc2 ba #*00110011 t)) @result{} #*11001000 ++ (eq rba ba) @result{} @i{true} ++ (bit-not (setq ba #*11101010)) @result{} #*00010101 ++ (setq rba (bit-not ba ++ (setq tba (make-array 8 ++ :element-type 'bit)))) ++@result{} #*00010101 ++ (equal rba tba) @result{} @i{true} ++ (bit-xor #*1100 #*1010) @result{} #*0110 ++@end example ++ ++@subsubheading See Also:: ++ ++@b{lognot}, ++@ref{logand} ++ ++@node bit-vector-p, simple-bit-vector-p, bit-and, Arrays Dictionary ++@subsection bit-vector-p [Function] ++ ++@code{bit-vector-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{bit-vector}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (bit-vector-p (make-array 6 ++ :element-type 'bit ++ :fill-pointer t)) @result{} @i{true} ++ (bit-vector-p #*) @result{} @i{true} ++ (bit-vector-p (make-array 6)) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{typep} ++ ++@subsubheading Notes:: ++ ++@example ++ (bit-vector-p @i{object}) @equiv{} (typep @i{object} 'bit-vector) ++@end example ++ ++@node simple-bit-vector-p, , bit-vector-p, Arrays Dictionary ++@subsection simple-bit-vector-p [Function] ++ ++@code{simple-bit-vector-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{simple-bit-vector}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (simple-bit-vector-p (make-array 6)) @result{} @i{false} ++ (simple-bit-vector-p #*) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{simple-vector-p} ++ ++@subsubheading Notes:: ++@example ++ (simple-bit-vector-p @i{object}) @equiv{} (typep @i{object} 'simple-bit-vector) ++@end example ++ ++@c end of including dict-arrays ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-16.texi +@@ -0,0 +1,769 @@ ++ ++ ++@node Strings, Sequences, Arrays, Top ++@chapter Strings ++ ++@menu ++* String Concepts:: ++* Strings Dictionary:: ++@end menu ++ ++@node String Concepts, Strings Dictionary, Strings, Strings ++@section String Concepts ++ ++@c including concept-strings ++ ++@menu ++* Implications of Strings Being Arrays:: ++* Subtypes of STRING:: ++@end menu ++ ++@node Implications of Strings Being Arrays, Subtypes of STRING, String Concepts, String Concepts ++@subsection Implications of Strings Being Arrays ++ ++Since all @i{strings} are @i{arrays}, all rules which apply ++generally to @i{arrays} also apply to @i{strings}. ++See @ref{Array Concepts}. ++ ++For example, ++ @i{strings} can have @i{fill pointers}, ++ and @i{strings} are also subject to the rules of @i{element type} @i{upgrading} ++ that apply to @i{arrays}. ++ ++@node Subtypes of STRING, , Implications of Strings Being Arrays, String Concepts ++@subsection Subtypes of STRING ++ ++All functions that operate on @i{strings} ++will operate on @i{subtypes} of @i{string} as well. ++ ++However, ++the consequences are undefined if a @i{character} is inserted into a @i{string} ++for which the @i{element type} of the @i{string} does not include that @i{character}. ++ ++@c end of including concept-strings ++ ++@node Strings Dictionary, , String Concepts, Strings ++@section Strings Dictionary ++ ++@c including dict-strings ++ ++@menu ++* string (System Class):: ++* base-string:: ++* simple-string:: ++* simple-base-string:: ++* simple-string-p:: ++* char:: ++* string:: ++* string-upcase:: ++* string-trim:: ++* string=:: ++* stringp:: ++* make-string:: ++@end menu ++ ++@node string (System Class), base-string, Strings Dictionary, Strings Dictionary ++@subsection string [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{string}, ++@b{vector}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{string} is a @i{specialized} @i{vector} ++whose @i{elements} are of @i{type} @b{character} or a @i{subtype} of @i{type} @b{character}. ++When used as a @i{type specifier} for object creation, ++@b{string} means @t{(vector character)}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{string}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the union of all @i{types} ++@t{(array @i{c} (@i{size}))} ++for all @i{subtypes} @i{c} of @b{character}; ++that is, the set of @i{strings} of size @i{size}. ++ ++@subsubheading See Also:: ++ ++@ref{String Concepts}, ++@ref{Double-Quote}, ++@ref{Printing Strings} ++ ++@node base-string, simple-string, string (System Class), Strings Dictionary ++@subsection base-string [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{base-string}, ++@b{string}, ++@b{vector}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{base-string} is equivalent to ++ ++@t{(vector base-char)}. ++ ++The @i{base string} representation is the most efficient @i{string} representation ++that can hold an arbitrary sequence of @i{standard characters}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{base-string}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This is equivalent to the type @t{(vector base-char @i{size})}; ++that is, the set of @i{base strings} of size @i{size}. ++ ++@node simple-string, simple-base-string, base-string, Strings Dictionary ++@subsection simple-string [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{simple-string}, ++@b{string}, ++@b{vector}, ++@b{simple-array}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{simple string} is a specialized one-dimensional ++@i{simple array} whose @i{elements} are of @i{type} @b{character} or a @i{subtype} of @i{type} @b{character}. ++When used as a @i{type specifier} for object creation, ++@b{simple-string} means @t{(simple-array character (@i{size}))}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{simple-string}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the union of all @i{types} ++@t{(simple-array @i{c} (@i{size}))} for all @i{subtypes} @i{c} of ++@b{character}; that is, the set of @i{simple strings} of size @i{size}. ++ ++@node simple-base-string, simple-string-p, simple-string, Strings Dictionary ++@subsection simple-base-string [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{simple-base-string}, ++@b{base-string}, ++@b{simple-string}, ++@b{string}, ++@b{vector}, ++@b{simple-array}, ++@b{array}, ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{simple-base-string} is equivalent to ++ ++@t{(simple-array base-char (*))}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Abbreviating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{simple-base-string}@{@i{@t{[}size@t{]}}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{size}---a non-negative @i{fixnum}, ++ or the @i{symbol} @b{*}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This is equivalent to the type @t{(simple-array base-char (@i{size}))}; ++that is, the set of @i{simple base strings} of size @i{size}. ++ ++@node simple-string-p, char, simple-base-string, Strings Dictionary ++@subsection simple-string-p [Function] ++ ++@code{simple-string-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{simple-string}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (simple-string-p "aaaaaa") @result{} @i{true} ++ (simple-string-p (make-array 6 ++ :element-type 'character ++ :fill-pointer t)) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++@example ++ (simple-string-p @i{object}) @equiv{} (typep @i{object} 'simple-string) ++@end example ++ ++@node char, string, simple-string-p, Strings Dictionary ++@subsection char, schar [Accessor] ++ ++@code{char} @i{string index} @result{} @i{character} ++ ++@code{schar} @i{string index} @result{} @i{character} ++ ++(setf (@code{char} @i{string index}) new-character)@*(setf (@code{schar} @i{string index}) new-character)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---for @b{char}, a @i{string}; ++ for @b{schar}, a @i{simple string}. ++ ++@i{index}---a @i{valid array index} for the @i{string}. ++ ++@i{character}, @i{new-character}---a @i{character}. ++ ++@subsubheading Description:: ++ ++@b{char} and @b{schar} @i{access} the @i{element} of @i{string} ++specified by @i{index}. ++ ++@b{char} ignores @i{fill pointers} when @i{accessing} @i{elements}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq my-simple-string (make-string 6 :initial-element #\A)) @result{} "AAAAAA" ++ (schar my-simple-string 4) @result{} #\A ++ (setf (schar my-simple-string 4) #\B) @result{} #\B ++ my-simple-string @result{} "AAAABA" ++ (setq my-filled-string ++ (make-array 6 :element-type 'character ++ :fill-pointer 5 ++ :initial-contents my-simple-string)) ++@result{} "AAAAB" ++ (char my-filled-string 4) @result{} #\B ++ (char my-filled-string 5) @result{} #\A ++ (setf (char my-filled-string 3) #\C) @result{} #\C ++ (setf (char my-filled-string 5) #\D) @result{} #\D ++ (setf (fill-pointer my-filled-string) 6) @result{} 6 ++ my-filled-string @result{} "AAACBD" ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{aref} ++, ++@ref{elt} ++, ++ ++@ref{Compiler Terminology} ++ ++@subsubheading Notes:: ++ ++@example ++ (char s j) @equiv{} (aref (the string s) j) ++@end example ++ ++@node string, string-upcase, char, Strings Dictionary ++@subsection string [Function] ++ ++@code{string} @i{x} @result{} @i{string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---a @i{string}, a @i{symbol}, or a @i{character}. ++ ++@i{string}---a @i{string}. ++ ++@subsubheading Description:: ++ ++Returns a @i{string} described by @i{x}; specifically: ++ ++@table @asis ++ ++@item @t{*} ++If @i{x} is a @i{string}, it is returned. ++@item @t{*} ++If @i{x} is a @i{symbol}, its @i{name} is returned. ++@item @t{*} ++ ++If @i{x} is a @i{character}, ++ ++then a @i{string} containing that one @i{character} is returned. ++@item @t{*} ++ ++@b{string} might perform additional, @i{implementation-defined} conversions. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (string "already a string") @result{} "already a string" ++ (string 'elm) @result{} "ELM" ++ (string #\c) @result{} "c" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++In the case where a conversion is defined neither by this specification nor ++by the @i{implementation}, an error of @i{type} @b{type-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{coerce} ++, ++@b{string} (@i{type}). ++ ++@subsubheading Notes:: ++ ++@b{coerce} can be used to convert a @i{sequence} of @i{characters} ++to a @i{string}. ++ ++@b{prin1-to-string}, @b{princ-to-string}, @b{write-to-string}, ++or @b{format} (with a first argument of @b{nil}) can be used to get a ++@i{string} representation of a @i{number} or any other @i{object}. ++ ++@node string-upcase, string-trim, string, Strings Dictionary ++@subsection string-upcase, string-downcase, string-capitalize, ++@subheading nstring-upcase, nstring-downcase, nstring-capitalize ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{string-upcase} @i{string @r{&key} start end} @result{} @i{cased-string} ++ ++@code{string-downcase} @i{string @r{&key} start end} @result{} @i{cased-string} ++ ++@code{string-capitalize} @i{string @r{&key} start end} @result{} @i{cased-string} ++ ++@code{nstring-upcase} @i{string @r{&key} start end} @result{} @i{string} ++ ++@code{nstring-downcase} @i{string @r{&key} start end} @result{} @i{string} ++ ++@code{nstring-capitalize} @i{string @r{&key} start end} @result{} @i{string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string designator}. ++ For @b{nstring-upcase}, ++ @b{nstring-downcase}, ++ and @b{nstring-capitalize}, ++ the @i{string} @i{designator} must be a @i{string}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{string}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{cased-string}---a @i{string}. ++ ++@subsubheading Description:: ++ ++@b{string-upcase}, @b{string-downcase}, @b{string-capitalize}, ++@b{nstring-upcase}, @b{nstring-downcase}, @b{nstring-capitalize} ++change the case of the subsequence of @i{string} ++@i{bounded} by @i{start} and @i{end} ++as follows: ++ ++@table @asis ++ ++@item string-upcase ++@b{string-upcase} returns a @i{string} just like @i{string} ++with all lowercase characters replaced by the corresponding uppercase ++characters. More precisely, each character of the result @i{string} ++is produced by applying the @i{function} @b{char-upcase} to the corresponding ++character of @i{string}. ++ ++@item string-downcase ++@b{string-downcase} is like @b{string-upcase} ++except that all uppercase characters are replaced by the corresponding ++lowercase characters (using @b{char-downcase}). ++ ++@item string-capitalize ++@b{string-capitalize} produces a copy of @i{string} such that, ++for every word in the copy, the first @i{character} of the ``word,'' ++if it has @i{case}, is @i{uppercase} and ++any other @i{characters} with @i{case} in the word are @i{lowercase}. ++For the purposes of @b{string-capitalize}, ++a ``word'' is defined to be a ++consecutive subsequence consisting of @i{alphanumeric} @i{characters}, ++delimited at each end either by a non-@i{alphanumeric} @i{character} ++or by an end of the @i{string}. ++ ++@item nstring-upcase, nstring-downcase, nstring-capitalize ++@b{nstring-upcase}, @b{nstring-downcase}, ++and @b{nstring-capitalize} are identical to @b{string-upcase}, ++@b{string-downcase}, and @b{string-capitalize} ++respectively except that they modify @i{string}. ++@end table ++ ++For @b{string-upcase}, @b{string-downcase}, and @b{string-capitalize}, ++@i{string} is not modified. However, if no characters in @i{string} ++require conversion, the result may be either @i{string} or a copy of it, ++at the implementation's discretion. ++ ++@subsubheading Examples:: ++@example ++ (string-upcase "abcde") @result{} "ABCDE" ++ (string-upcase "Dr. Livingston, I presume?") ++@result{} "DR. LIVINGSTON, I PRESUME?" ++ (string-upcase "Dr. Livingston, I presume?" :start 6 :end 10) ++@result{} "Dr. LiVINGston, I presume?" ++ (string-downcase "Dr. Livingston, I presume?") ++@result{} "dr. livingston, i presume?" ++ ++ (string-capitalize "elm 13c arthur;fig don't") @result{} "Elm 13c Arthur;Fig Don'T" ++ (string-capitalize " hello ") @result{} " Hello " ++ (string-capitalize "occlUDeD cASEmenTs FOreSTAll iNADVertent DEFenestraTION") ++@result{} "Occluded Casements Forestall Inadvertent Defenestration" ++ (string-capitalize 'kludgy-hash-search) @result{} "Kludgy-Hash-Search" ++ (string-capitalize "DON'T!") @result{} "Don'T!" ;not "Don't!" ++ (string-capitalize "pipe 13a, foo16c") @result{} "Pipe 13a, Foo16c" ++ ++ (setq str (copy-seq "0123ABCD890a")) @result{} "0123ABCD890a" ++ (nstring-downcase str :start 5 :end 7) @result{} "0123AbcD890a" ++ str @result{} "0123AbcD890a" ++@end example ++ ++@subsubheading Side Effects:: ++ ++ @b{nstring-upcase}, ++ @b{nstring-downcase}, ++and @b{nstring-capitalize} modify @i{string} as appropriate ++rather than constructing a new @i{string}. ++ ++@subsubheading See Also:: ++ ++@ref{char-upcase} ++, @b{char-downcase} ++ ++@subsubheading Notes:: ++The result is always of the same length ++as @i{string}. ++ ++@node string-trim, string=, string-upcase, Strings Dictionary ++@subsection string-trim, string-left-trim, string-right-trim [Function] ++ ++@code{string-trim} @i{character-bag string} @result{} @i{trimmed-string} ++ ++@code{string-left-trim} @i{character-bag string} @result{} @i{trimmed-string} ++ ++@code{string-right-trim} @i{character-bag string} @result{} @i{trimmed-string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{character-bag}---a @i{sequence} containing @i{characters}. ++ ++@i{string}---a @i{string designator}. ++ ++@i{trimmed-string}---a @i{string}. ++ ++@subsubheading Description:: ++ ++@b{string-trim} returns a substring of @i{string}, ++with all characters in @i{character-bag} stripped off the beginning and end. ++@b{string-left-trim} is similar but strips characters off only the beginning; ++@b{string-right-trim} strips off only the end. ++ ++If no @i{characters} need to be trimmed from the @i{string}, ++then either @i{string} itself or a copy of it may be returned, ++at the discretion of the implementation. ++ ++All of these @i{functions} observe the @i{fill pointer}. ++ ++@subsubheading Examples:: ++@example ++ (string-trim "abc" "abcaakaaakabcaaa") @result{} "kaaak" ++ (string-trim '(#\Space #\Tab #\Newline) " garbanzo beans ++ ") @result{} "garbanzo beans" ++ (string-trim " (*)" " ( *three (silly) words* ) ") ++@result{} "three (silly) words" ++ ++ (string-left-trim "abc" "labcabcabc") @result{} "labcabcabc" ++ (string-left-trim " (*)" " ( *three (silly) words* ) ") ++@result{} "three (silly) words* ) " ++ ++ (string-right-trim " (*)" " ( *three (silly) words* ) ") ++@result{} " ( *three (silly) words" ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@node string=, stringp, string-trim, Strings Dictionary ++@subsection string=, string/=, string<, string>, string<=, string>=, ++@subheading string-equal, string-not-equal, string-lessp, ++@subheading string-greaterp, string-not-greaterp, string-not-lessp ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{string=} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{generalized-boolean} ++ ++@code{string/=} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string<} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string>} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string<=} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string>=} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string-equal} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{generalized-boolean} ++ ++@code{string-not-equal} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string-lessp} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string-greaterp} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string-not-greaterp} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@code{string-not-lessp} @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{} @i{mismatch-index} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string1}---a @i{string designator}. ++ ++@i{string2}---a @i{string designator}. ++ ++@i{start1}, @i{end1}---@i{bounding index designators} of @i{string1}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{start2}, @i{end2}---@i{bounding index designators} of @i{string2}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@i{mismatch-index}---a @i{bounding index} of @i{string1}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++These functions perform lexicographic comparisons on @i{string1} and @i{string2}. ++@b{string=} and @b{string-equal} are called equality functions; ++the others are called inequality functions. ++The comparison operations these @i{functions} perform are restricted ++ to the subsequence of @i{string1} @i{bounded} by @i{start1} and @i{end1} ++ and to the subsequence of @i{string2} @i{bounded} by @i{start2} and @i{end2}. ++ ++A string @i{a} is equal to a string @i{b} if it contains the same number ++of characters, and the corresponding characters are the @i{same} ++under @b{char=} or @b{char-equal}, as appropriate. ++ ++A string @i{a} is less than a string @i{b} if in the first position in ++which they differ the character of @i{a} is less than the corresponding ++character of @i{b} according to @b{char<} or @b{char-lessp} ++as appropriate, or if string @i{a} is a proper prefix of string @i{b} ++(of shorter length and matching in all the characters of @i{a}). ++ ++The equality functions return a @i{generalized boolean} ++that is @i{true} if the strings are equal, ++or @i{false} otherwise. ++ ++The inequality functions return a @i{mismatch-index} ++that is @i{true} if the strings are not equal, ++or @i{false} otherwise. ++When the @i{mismatch-index} is @i{true}, ++it is an @i{integer} representing the first character position at which the ++two substrings differ, as an offset from the beginning of @i{string1}. ++ ++The comparison has one of the following results: ++ ++@table @asis ++ ++@item @b{string=} ++@b{string=} is @i{true} if the supplied substrings are of ++the same length and contain the @i{same} characters in corresponding ++positions; otherwise it is @i{false}. ++ ++@item @b{string/=} ++@b{string/=} is @i{true} if the supplied substrings are ++different; otherwise it is @i{false}. ++ ++@item @b{string-equal} ++@b{string-equal} is just like @b{string=} ++except that differences in case are ignored; ++two characters are considered to be the same if @b{char-equal} is @i{true} of them. ++ ++@item @b{string<} ++@b{string<} is @i{true} if substring1 is less than substring2; ++otherwise it is @i{false}. ++ ++@item @b{string>} ++@b{string>} is @i{true} if substring1 is greater than substring2; ++otherwise it is @i{false}. ++ ++@item @b{string-lessp}, @b{string-greaterp} ++@b{string-lessp} and @b{string-greaterp} ++are exactly like @b{string<} and @b{string>}, respectively, ++except that distinctions between uppercase and lowercase letters are ignored. ++It is as if @b{char-lessp} were used instead of @b{char<} ++for comparing characters. ++ ++@item @b{string<=} ++@b{string<=} is @i{true} if substring1 is less than or equal to substring2; ++otherwise it is @i{false}. ++ ++@item @b{string>=} ++@b{string>=} is @i{true} if substring1 is greater than or equal to substring2; ++otherwise it is @i{false}. ++ ++@item @b{string-not-greaterp}, @b{string-not-lessp} ++@b{string-not-greaterp} and @b{string-not-lessp} ++are exactly like @b{string<=} and @b{string>=}, respectively, ++except that distinctions between uppercase and lowercase letters are ignored. ++It is as if @b{char-lessp} were used instead of @b{char<} ++for comparing characters. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (string= "foo" "foo") @result{} @i{true} ++ (string= "foo" "Foo") @result{} @i{false} ++ (string= "foo" "bar") @result{} @i{false} ++ (string= "together" "frog" :start1 1 :end1 3 :start2 2) @result{} @i{true} ++ (string-equal "foo" "Foo") @result{} @i{true} ++ (string= "abcd" "01234abcd9012" :start2 5 :end2 9) @result{} @i{true} ++ (string< "aaaa" "aaab") @result{} 3 ++ (string>= "aaaaa" "aaaa") @result{} 4 ++ (string-not-greaterp "Abcde" "abcdE") @result{} 5 ++ (string-lessp "012AAAA789" "01aaab6" :start1 3 :end1 7 ++ :start2 2 :end2 6) @result{} 6 ++ (string-not-equal "AAAA" "aaaA") @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{char=} ++ ++@subsubheading Notes:: ++ ++@b{equal} calls @b{string=} if applied to two @i{strings}. ++ ++@node stringp, make-string, string=, Strings Dictionary ++@subsection stringp [Function] ++ ++@code{stringp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{string}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (stringp "aaaaaa") @result{} @i{true} ++ (stringp #\a) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{typep} ++, ++@b{string} (@i{type}) ++ ++@subsubheading Notes:: ++ ++@example ++ (stringp @i{object}) @equiv{} (typep @i{object} 'string) ++@end example ++ ++@node make-string, , stringp, Strings Dictionary ++@subsection make-string [Function] ++ ++@code{make-string} @i{size @r{&key} initial-element element-type} @result{} @i{string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{size}---a @i{valid array dimension}. ++ ++@i{initial-element}---a @i{character}. ++ ++ The default is @i{implementation-dependent}. ++ ++@i{element-type}---a @i{type specifier}. ++ The default is @b{character}. ++ ++@i{string}---a @i{simple string}. ++ ++@subsubheading Description:: ++ ++@b{make-string} returns a @i{simple string} of length @i{size} ++whose elements have been initialized to @i{initial-element}. ++ ++The @i{element-type} names the @i{type} of the @i{elements} of the @i{string}; ++a @i{string} is constructed of the most @i{specialized} ++@i{type} that can accommodate @i{elements} of the given @i{type}. ++ ++@subsubheading Examples:: ++ ++@example ++ (make-string 10 :initial-element #\5) @result{} "5555555555" ++ (length (make-string 10)) @result{} 10 ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@c end of including dict-strings ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-17.texi +@@ -0,0 +1,2274 @@ ++ ++ ++@node Sequences, Hash Tables, Strings, Top ++@chapter Sequences ++ ++@menu ++* Sequence Concepts:: ++* Rules about Test Functions:: ++* Sequences Dictionary:: ++@end menu ++ ++@node Sequence Concepts, Rules about Test Functions, Sequences, Sequences ++@section Sequence Concepts ++ ++@c including concept-sequences ++ ++A @i{sequence} ++@IGindex sequence ++ is an ordered collection of @i{elements}, ++implemented as either a @i{vector} or a @i{list}. ++ ++@i{Sequences} can be created by the @i{function} @b{make-sequence}, ++as well as other @i{functions} that create @i{objects} ++of @i{types} that are @i{subtypes} of @b{sequence} ++(@i{e.g.}, @b{list}, @b{make-list}, @b{mapcar}, and @b{vector}). ++ ++A @i{sequence function} ++@IGindex sequence function ++ is a @i{function} ++ defined by this specification ++or added as an extension by the @i{implementation} ++that operates on one or more @i{sequences}. ++Whenever a @i{sequence function} must construct and return ++a new @i{vector}, it always returns a @i{simple vector}. ++Similarly, any @i{strings} constructed will be @i{simple strings}. ++ ++@format ++@group ++@noindent ++@w{ concatenate length remove } ++@w{ copy-seq map remove-duplicates } ++@w{ count map-into remove-if } ++@w{ count-if merge remove-if-not } ++@w{ count-if-not mismatch replace } ++@w{ delete notany reverse } ++@w{ delete-duplicates notevery search } ++@w{ delete-if nreverse some } ++@w{ delete-if-not nsubstitute sort } ++@w{ elt nsubstitute-if stable-sort } ++@w{ every nsubstitute-if-not subseq } ++@w{ fill position substitute } ++@w{ find position-if substitute-if } ++@w{ find-if position-if-not substitute-if-not } ++@w{ find-if-not reduce } ++ ++@noindent ++@w{ Figure 17--1: Standardized Sequence Functions } ++ ++@end group ++@end format ++ ++@menu ++* General Restrictions on Parameters that must be Sequences:: ++@end menu ++ ++@node General Restrictions on Parameters that must be Sequences, , Sequence Concepts, Sequence Concepts ++@subsection General Restrictions on Parameters that must be Sequences ++ ++In general, @i{lists} (including @i{association lists} and @i{property lists}) ++that are treated as @i{sequences} must be @i{proper lists}. ++ ++@c end of including concept-sequences ++ ++@node Rules about Test Functions, Sequences Dictionary, Sequence Concepts, Sequences ++@section Rules about Test Functions ++ ++@c including concept-tests ++ ++@menu ++* Satisfying a Two-Argument Test:: ++* Satisfying a One-Argument Test:: ++@end menu ++ ++@node Satisfying a Two-Argument Test, Satisfying a One-Argument Test, Rules about Test Functions, Rules about Test Functions ++@subsection Satisfying a Two-Argument Test ++ ++When an @i{object} O is being considered iteratively ++against each @i{element} E_i ++of a @i{sequence} S ++by an @i{operator} F listed in Figure 17--2, ++it is sometimes useful to control the way in which the presence of O ++is tested in S is tested by F. ++This control is offered on the basis of a @i{function} designated with ++either a @t{:test} or @t{:test-not} @i{argument}. ++ ++@format ++@group ++@noindent ++@w{ adjoin nset-exclusive-or search } ++@w{ assoc nsublis set-difference } ++@w{ count nsubst set-exclusive-or } ++@w{ delete nsubstitute sublis } ++@w{ find nunion subsetp } ++@w{ intersection position subst } ++@w{ member pushnew substitute } ++@w{ mismatch rassoc tree-equal } ++@w{ nintersection remove union } ++@w{ nset-difference remove-duplicates } ++ ++@noindent ++@w{ Figure 17--2: Operators that have Two-Argument Tests to be Satisfied} ++ ++@end group ++@end format ++ ++The object O might not be compared directly to E_i. ++If a @t{:key} @i{argument} is provided, ++it is a @i{designator} for a @i{function} of one @i{argument} ++to be called with each E_i as an @i{argument}, ++and @i{yielding} an @i{object} Z_i to be used for comparison. ++(If there is no @t{:key} @i{argument}, Z_i is E_i.) ++ ++The @i{function} designated by the @t{:key} @i{argument} is never called on O itself. ++However, if the function operates on multiple sequences ++(@i{e.g.}, as happens in @b{set-difference}), O ++will be the result of calling the @t{:key} function on an ++@i{element} of the other sequence. ++ ++A @t{:test} @i{argument}, if supplied to F, ++is a @i{designator} for a @i{function} ++of two @i{arguments}, O and Z_i. ++An E_i is said (or, sometimes, an O and an E_i are said) ++to @i{satisfy the test} ++@IGindex satisfy the test ++ ++if this @t{:test} @i{function} returns a @i{generalized boolean} representing ++@i{true}. ++ ++A @t{:test-not} @i{argument}, if supplied to F, ++is @i{designator} for a @i{function} ++of two @i{arguments}, O and Z_i. ++An E_i is said (or, sometimes, an O and an E_i are said) ++to @i{satisfy the test} ++@IGindex satisfy the test ++ ++if this @t{:test-not} @i{function} ++returns a @i{generalized boolean} representing @i{false}. ++ ++If neither a @t{:test} nor a @t{:test-not} @i{argument} is supplied, ++it is as if a @t{:test} argument of @t{#'eql} was supplied. ++ ++The consequences are unspecified if both a @t{:test} and a @t{:test-not} @i{argument} ++are supplied in the same @i{call} to F. ++ ++@menu ++* Examples of Satisfying a Two-Argument Test:: ++@end menu ++ ++@node Examples of Satisfying a Two-Argument Test, , Satisfying a Two-Argument Test, Satisfying a Two-Argument Test ++@subsubsection Examples of Satisfying a Two-Argument Test ++ ++@example ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'equal) ++@result{} (foo bar "BAR" "foo" "bar") ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'equalp) ++@result{} (foo bar "BAR" "bar") ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'string-equal) ++@result{} (bar "BAR" "bar") ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'string=) ++@result{} (BAR "BAR" "foo" "bar") ++ ++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'eql) ++@result{} (1) ++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'=) ++@result{} (1 1.0 #C(1.0 0.0)) ++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test (complement #'=)) ++@result{} (1 1.0 #C(1.0 0.0)) ++ ++ (count 1 '((one 1) (uno 1) (two 2) (dos 2)) :key #'cadr) @result{} 2 ++ ++ (count 2.0 '(1 2 3) :test #'eql :key #'float) @result{} 1 ++ ++ (count "FOO" (list (make-pathname :name "FOO" :type "X") ++ (make-pathname :name "FOO" :type "Y")) ++ :key #'pathname-name ++ :test #'equal) ++@result{} 2 ++@end example ++ ++@node Satisfying a One-Argument Test, , Satisfying a Two-Argument Test, Rules about Test Functions ++@subsection Satisfying a One-Argument Test ++ ++When using one of the @i{functions} in Figure 17--3, ++the elements E of a @i{sequence} S are filtered ++not on the basis of the presence or absence of an object O ++under a two @i{argument} @i{predicate}, ++as with the @i{functions} described in @ref{Satisfying a Two-Argument Test}, ++but rather on the basis of a one @i{argument} @i{predicate}. ++ ++@format ++@group ++@noindent ++@w{ assoc-if member-if rassoc-if } ++@w{ assoc-if-not member-if-not rassoc-if-not } ++@w{ count-if nsubst-if remove-if } ++@w{ count-if-not nsubst-if-not remove-if-not } ++@w{ delete-if nsubstitute-if subst-if } ++@w{ delete-if-not nsubstitute-if-not subst-if-not } ++@w{ find-if position-if substitute-if } ++@w{ find-if-not position-if-not substitute-if-not } ++ ++@noindent ++@w{ Figure 17--3: Operators that have One-Argument Tests to be Satisfied} ++ ++@end group ++@end format ++ ++The element E_i might not be considered directly. ++If a @t{:key} @i{argument} is provided, ++it is a @i{designator} for a @i{function} of one @i{argument} ++to be called with each E_i as an @i{argument}, ++and @i{yielding} an @i{object} Z_i to be used for comparison. ++(If there is no @t{:key} @i{argument}, Z_i is E_i.) ++ ++@i{Functions} defined in this specification and having a name that ++ends in ``@t{-if}'' accept a first @i{argument} that is a @i{designator} for a ++@i{function} of one @i{argument}, Z_i. ++An E_i is said to @i{satisfy the test} ++@IGindex satisfy the test ++ if this @t{:test} @i{function} ++returns a @i{generalized boolean} representing @i{true}. ++ ++@i{Functions} defined in this specification and having a name that ++ends in ``@t{-if-not}'' accept a first @i{argument} that is a @i{designator} for a ++@i{function} of one @i{argument}, Z_i. ++An E_i is said to @i{satisfy the test} ++@IGindex satisfy the test ++ if this @t{:test} @i{function} ++returns a @i{generalized boolean} representing @i{false}. ++ ++@menu ++* Examples of Satisfying a One-Argument Test:: ++@end menu ++ ++@node Examples of Satisfying a One-Argument Test, , Satisfying a One-Argument Test, Satisfying a One-Argument Test ++@subsubsection Examples of Satisfying a One-Argument Test ++ ++@example ++ (count-if #'zerop '(1 #C(0.0 0.0) 0 0.0d0 0.0s0 3)) @result{} 4 ++ ++ (remove-if-not #'symbolp '(0 1 2 3 4 5 6 7 8 9 A B C D E F)) ++@result{} (A B C D E F) ++ (remove-if (complement #'symbolp) '(0 1 2 3 4 5 6 7 8 9 A B C D E F)) ++@result{} (A B C D E F) ++ ++ (count-if #'zerop '("foo" "" "bar" "" "" "baz" "quux") :key #'length) ++@result{} 3 ++@end example ++ ++@c end of including concept-tests ++ ++@node Sequences Dictionary, , Rules about Test Functions, Sequences ++@section Sequences Dictionary ++ ++@c including dict-sequences ++ ++@menu ++* sequence:: ++* copy-seq:: ++* elt:: ++* fill:: ++* make-sequence:: ++* subseq:: ++* map:: ++* map-into:: ++* reduce:: ++* count:: ++* length:: ++* reverse:: ++* sort:: ++* find:: ++* position:: ++* search:: ++* mismatch:: ++* replace:: ++* substitute:: ++* concatenate:: ++* merge:: ++* remove:: ++* remove-duplicates:: ++@end menu ++ ++@node sequence, copy-seq, Sequences Dictionary, Sequences Dictionary ++@subsection sequence [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{sequence}, ++@b{t} ++ ++@subsubheading Description:: ++ ++@i{Sequences} are ordered collections of @i{objects}, ++called the @i{elements} of the @i{sequence}. ++ ++The @i{types} @b{vector} and the @i{type} @b{list} are @i{disjoint} @i{subtypes} of @i{type} @b{sequence}, ++but are not necessarily an @i{exhaustive partition} of @i{sequence}. ++ ++When viewing a @i{vector} as a @i{sequence}, ++only the @i{active} @i{elements} of that @i{vector} ++are considered @i{elements} of the @i{sequence}; ++that is, ++@i{sequence} operations respect the @i{fill pointer} ++when given @i{sequences} represented as @i{vectors}. ++ ++@node copy-seq, elt, sequence, Sequences Dictionary ++@subsection copy-seq [Function] ++ ++@code{copy-seq} @i{sequence} @result{} @i{copied-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{copied-sequence}---a @i{proper sequence}. ++ ++@subsubheading Description:: ++ ++Creates a copy of @i{sequence}. The @i{elements} of the new ++@i{sequence} are the @i{same} as the corresponding @i{elements} of ++the given @i{sequence}. ++ ++If @i{sequence} is a @i{vector}, ++the result is a @i{fresh} @i{simple array} ++of @i{rank} one ++that has the same @i{actual array element type} as @i{sequence}. ++If @i{sequence} is a @i{list}, ++the result is a @i{fresh} @i{list}. ++ ++@subsubheading Examples:: ++@example ++ (setq str "a string") @result{} "a string" ++ (equalp str (copy-seq str)) @result{} @i{true} ++ (eql str (copy-seq str)) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{copy-list} ++ ++@subsubheading Notes:: ++ ++From a functional standpoint, ++@example ++ (copy-seq x) @equiv{} (subseq x 0) ++@end example ++ ++However, the programmer intent is typically very different in these two cases. ++ ++@node elt, fill, copy-seq, Sequences Dictionary ++@subsection elt [Accessor] ++ ++@code{elt} @i{sequence index} @result{} @i{object} ++ ++(setf (@code{ elt} @i{sequence index}) new-object)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{index}---a @i{valid sequence index} for @i{sequence}. ++ ++@i{object}---an @i{object}. ++ ++@i{new-object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{element} of @i{sequence} specified by @i{index}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq str (copy-seq "0123456789")) @result{} "0123456789" ++ (elt str 6) @result{} #\6 ++ (setf (elt str 0) #\#) @result{} #\# ++ str @result{} "#123456789" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{index} is not a @i{valid sequence index} for @i{sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{aref} ++, ++@ref{nth} ++, ++ ++@ref{Compiler Terminology} ++ ++@subsubheading Notes:: ++ ++@b{aref} may be used to @i{access} @i{vector} ++elements that are beyond the @i{vector}'s @i{fill pointer}. ++ ++@node fill, make-sequence, elt, Sequences Dictionary ++@subsection fill [Function] ++ ++@code{fill} @i{sequence item @r{&key} start end} @result{} @i{sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{item}---a @i{sequence}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@subsubheading Description:: ++ ++Replaces the @i{elements} of @i{sequence} ++@i{bounded} by @i{start} and @i{end} ++with @i{item}. ++ ++@subsubheading Examples:: ++ ++@example ++ (fill (list 0 1 2 3 4 5) '(444)) @result{} ((444) (444) (444) (444) (444) (444)) ++ (fill (copy-seq "01234") #\e :start 3) @result{} "012ee" ++ (setq x (vector 'a 'b 'c 'd 'e)) @result{} #(A B C D E) ++ (fill x 'z :start 1 :end 3) @result{} #(A Z Z D E) ++ x @result{} #(A Z Z D E) ++ (fill x 'p) @result{} #(P P P P P) ++ x @result{} #(P P P P P) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@i{Sequence} is destructively modified. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{start} is not a non-negative @i{integer}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{end} is not a non-negative @i{integer} or @b{nil}. ++ ++@subsubheading See Also:: ++ ++@ref{replace} ++, @b{nsubstitute} ++ ++@subsubheading Notes:: ++ ++@t{(fill @i{sequence} @i{item}) @equiv{} ++ (nsubstitute-if @i{item} (constantly t) @i{sequence})} ++ ++@node make-sequence, subseq, fill, Sequences Dictionary ++@subsection make-sequence [Function] ++ ++@code{make-sequence} @i{result-type size @r{&key} initial-element} @result{} @i{sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{result-type}---a @b{sequence} @i{type specifier}. ++ ++@i{size}---a non-negative @i{integer}. ++ ++@i{initial-element}---an @i{object}. ++ The default is @i{implementation-dependent}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@subsubheading Description:: ++ ++Returns a @i{sequence} of the type @i{result-type} and of length @i{size}, ++each of the @i{elements} of which has been initialized to @i{initial-element}. ++ ++If the @i{result-type} is a @i{subtype} of @b{list}, ++the result will be a @i{list}. ++ ++If the @i{result-type} is a @i{subtype} of @b{vector}, ++then if the implementation can determine the element type specified ++for the @i{result-type}, the element type of the resulting array ++is the result of @i{upgrading} that element type; or, if the ++implementation can determine that the element type is unspecified (or @t{*}), ++the element type of the resulting array is @b{t}; ++otherwise, an error is signaled. ++ ++@subsubheading Examples:: ++ ++@example ++ (make-sequence 'list 0) @result{} () ++ (make-sequence 'string 26 :initial-element #\.) ++@result{} ".........................." ++ (make-sequence '(vector double-float) 2 ++ :initial-element 1d0) ++@result{} #(1.0d0 1.0d0) ++@end example ++ ++@example ++ (make-sequence '(vector * 2) 3) should signal an error ++ (make-sequence '(vector * 4) 3) should signal an error ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are unspecified if @i{initial-element} ++is not an @i{object} which can be stored in the resulting @i{sequence}. ++ ++An error of @i{type} @b{type-error} must be signaled if the @i{result-type} is neither ++ a @i{recognizable subtype} of @b{list}, ++ nor a @i{recognizable subtype} of @b{vector}. ++ ++An error of @i{type} @b{type-error} should be signaled if @i{result-type} specifies ++the number of elements and @i{size} is different from that number. ++ ++@subsubheading See Also:: ++ ++@ref{make-array} ++, ++@ref{make-list} ++ ++@subsubheading Notes:: ++ ++@example ++ (make-sequence 'string 5) @equiv{} (make-string 5) ++@end example ++ ++@node subseq, map, make-sequence, Sequences Dictionary ++@subsection subseq [Accessor] ++ ++@code{subseq} @i{sequence start @r{&optional} end} @result{} @i{subsequence} ++ ++(setf (@code{ subseq} @i{sequence start @r{&optional} end}) new-subsequence)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The default for @i{end} is @b{nil}. ++ ++@i{subsequence}---a @i{proper sequence}. ++ ++@i{new-subsequence}---a @i{proper sequence}. ++ ++@subsubheading Description:: ++ ++@b{subseq} creates a @i{sequence} ++that is a copy of the subsequence of @i{sequence} ++@i{bounded} by @i{start} and @i{end}. ++ ++@i{Start} specifies an offset into the original @i{sequence} and ++marks the beginning position of the subsequence. ++@i{end} marks the position following the last element of the subsequence. ++ ++@b{subseq} always allocates a new @i{sequence} for a result; ++it never shares storage with an old @i{sequence}. ++The result subsequence is always of the same @i{type} as @i{sequence}. ++ ++If @i{sequence} is a @i{vector}, ++the result is a @i{fresh} @i{simple array} ++of @i{rank} one ++that has the same @i{actual array element type} as @i{sequence}. ++If @i{sequence} is a @i{list}, ++the result is a @i{fresh} @i{list}. ++ ++@b{setf} may be used with @b{subseq} to destructively replace ++@i{elements} of a subsequence with @i{elements} ++taken from a @i{sequence} of new values. ++If the subsequence and the new sequence are not of equal length, ++the shorter length determines the number of elements that are ++replaced. The remaining @i{elements} at the end of the longer sequence ++are not modified in the operation. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq str "012345") @result{} "012345" ++ (subseq str 2) @result{} "2345" ++ (subseq str 3 5) @result{} "34" ++ (setf (subseq str 4) "abc") @result{} "abc" ++ str @result{} "0123ab" ++ (setf (subseq str 0 2) "A") @result{} "A" ++ str @result{} "A123ab" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{new-subsequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{replace} ++ ++@node map, map-into, subseq, Sequences Dictionary ++@subsection map [Function] ++ ++@code{map} @i{result-type function @r{&rest} sequences^+} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{result-type} -- a @b{sequence} @i{type specifier}, or @b{nil}. ++ ++@i{function}---a @i{function designator}. ++ @i{function} must take as many arguments as ++ there are @i{sequences}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{result}---if @i{result-type} is a @i{type specifier} other than @b{nil}, ++ then a @i{sequence} of the @i{type} it denotes; ++ otherwise (if the @i{result-type} is @b{nil}), @b{nil}. ++ ++@subsubheading Description:: ++ ++Applies @i{function} to successive sets of arguments in which ++one argument is obtained from each @i{sequence}. ++The @i{function} is called first on all the elements with index @t{0}, ++then on all those with index @t{1}, and so on. ++The @i{result-type} specifies the @i{type} of the resulting @i{sequence}. ++ ++@b{map} returns @b{nil} if @i{result-type} is @b{nil}. ++Otherwise, @b{map} returns ++a @i{sequence} such that element @t{j} is the result ++of applying @i{function} to element @t{j} of each of the ++@i{sequences}. The result @i{sequence} ++is as long as the shortest of the ++@i{sequences}. ++The consequences are undefined if the result of applying @i{function} ++to the successive elements of the @i{sequences} cannot ++be contained in a @i{sequence} of the @i{type} given by @i{result-type}. ++ ++If the @i{result-type} is a @i{subtype} of @b{list}, ++the result will be a @i{list}. ++ ++If the @i{result-type} is a @i{subtype} of @b{vector}, ++then if the implementation can determine the element type specified ++for the @i{result-type}, the element type of the resulting array ++is the result of @i{upgrading} that element type; or, if the ++implementation can determine that the element type is unspecified (or @t{*}), ++the element type of the resulting array is @b{t}; ++otherwise, an error is signaled. ++ ++@subsubheading Examples:: ++ ++@example ++ (map 'string #'(lambda (x y) ++ (char "01234567890ABCDEF" (mod (+ x y) 16))) ++ '(1 2 3 4) ++ '(10 9 8 7)) @result{} "AAAA" ++ (setq seq '("lower" "UPPER" "" "123")) @result{} ("lower" "UPPER" "" "123") ++ (map nil #'nstring-upcase seq) @result{} NIL ++ seq @result{} ("LOWER" "UPPER" "" "123") ++ (map 'list #'- '(1 2 3 4)) @result{} (-1 -2 -3 -4) ++ (map 'string ++ #'(lambda (x) (if (oddp x) #\1 #\0)) ++ '(1 2 3 4)) @result{} "1010" ++@end example ++ ++@example ++ (map '(vector * 4) #'cons "abc" "de") should signal an error ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{type-error} must be signaled if the @i{result-type} is ++ not a @i{recognizable subtype} of @b{list}, ++ not a @i{recognizable subtype} of @b{vector}, ++ and not @b{nil}. ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if any @i{sequence} is not a @i{proper sequence}. ++ ++An error of @i{type} @b{type-error} should be signaled ++if @i{result-type} specifies the ++number of elements and the minimum length of the @i{sequences} ++is different from that number. ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node map-into, reduce, map, Sequences Dictionary ++@subsection map-into [Function] ++ ++@code{map-into} @i{result-sequence function @r{&rest} sequences} @result{} @i{result-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{result-sequence}---a @i{proper sequence}. ++ ++@i{function}---a @i{designator} for a @i{function} ++ of as many @i{arguments} as there are @i{sequences}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@subsubheading Description:: ++ ++Destructively modifies @i{result-sequence} to contain the results of ++applying @i{function} to each element in the argument @i{sequences} ++in turn. ++ ++@i{result-sequence} and each element of @i{sequences} can each be ++either a @i{list} or a @i{vector}. ++If @i{result-sequence} and each element of @i{sequences} are not all ++the same length, the iteration terminates when the shortest @i{sequence} ++(of any of the @i{sequences} or the @i{result-sequence}) ++is exhausted. ++If @i{result-sequence} is a @i{vector} with a ++@i{fill pointer}, the @i{fill pointer} is ignored when deciding how ++many iterations to perform, and afterwards the @i{fill pointer} is set to ++the number of times @i{function} was applied. ++If @i{result-sequence} is longer than the shortest element of @i{sequences}, ++extra elements at the end of @i{result-sequence} are left unchanged. ++If @i{result-sequence} is @b{nil}, @b{map-into} immediately returns ++@b{nil}, since @b{nil} is a @i{sequence} of length zero. ++ ++If @i{function} has side effects, it can count on being called ++first on all of the elements with index 0, then on all of those ++numbered 1, and so on. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a (list 1 2 3 4) b (list 10 10 10 10)) @result{} (10 10 10 10) ++ (map-into a #'+ a b) @result{} (11 12 13 14) ++ a @result{} (11 12 13 14) ++ b @result{} (10 10 10 10) ++ (setq k '(one two three)) @result{} (ONE TWO THREE) ++ (map-into a #'cons k a) @result{} ((ONE . 11) (TWO . 12) (THREE . 13) 14) ++ (map-into a #'gensym) @result{} (#:G9090 #:G9091 #:G9092 #:G9093) ++ a @result{} (#:G9090 #:G9091 #:G9092 #:G9093) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{result-sequence} is not a @i{proper sequence}. ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading Notes:: ++ ++@b{map-into} differs from @b{map} in that it modifies an ++existing @i{sequence} rather than creating a new one. ++In addition, @b{map-into} can be called with only two ++arguments, while @b{map} requires at least three arguments. ++ ++@b{map-into} could be defined by: ++ ++@example ++ (defun map-into (result-sequence function &rest sequences) ++ (loop for index below (apply #'min ++ (length result-sequence) ++ (mapcar #'length sequences)) ++ do (setf (elt result-sequence index) ++ (apply function ++ (mapcar #'(lambda (seq) (elt seq index)) ++ sequences)))) ++ result-sequence) ++@end example ++ ++@node reduce, count, map-into, Sequences Dictionary ++@subsection reduce [Function] ++ ++@code{reduce} @i{function sequence @r{&key} key from-end start end initial-value} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{designator} for a @i{function} ++ that might be called with either zero or two @i{arguments}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{initial-value}---an @i{object}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{reduce} uses a binary operation, @i{function}, ++to combine the @i{elements} of @i{sequence} ++@i{bounded} by @i{start} and @i{end}. ++ ++The @i{function} must accept as @i{arguments} two @i{elements} ++of @i{sequence} or the results from combining those @i{elements}. ++The @i{function} must also be able to accept no arguments. ++ ++If @i{key} is supplied, it is used is used to extract the values to reduce. ++The @i{key} function is applied exactly once to each element of @i{sequence} ++in the order implied by the reduction order but not to the value of ++@i{initial-value}, if supplied. ++ ++The @i{key} function typically returns part of the @i{element} of @i{sequence}. ++If @i{key} is not supplied or is @b{nil}, the @i{sequence} @i{element} itself is used. ++ ++The reduction is left-associative, ++unless @i{from-end} is @i{true} in which case it is right-associative. ++ ++If @i{initial-value} is supplied, ++it is logically placed before the subsequence ++(or after it if @i{from-end} is @i{true}) ++and included in the reduction operation. ++ ++In the normal case, the result of @b{reduce} is the combined ++result of @i{function}'s being applied to successive pairs of @i{elements} ++of @i{sequence}. ++If the subsequence contains exactly one @i{element} ++and no @i{initial-value} is given, ++then that @i{element} is returned and @i{function} is not called. ++If the subsequence is empty and an @i{initial-value} is given, ++then the @i{initial-value} is returned and @i{function} is not called. ++If the subsequence is empty and no @i{initial-value} is given, ++then the @i{function} is called with zero arguments, ++and @b{reduce} returns whatever @i{function} does. ++This is the only case where the ++@i{function} is called with other than two arguments. ++ ++@subsubheading Examples:: ++@example ++ (reduce #'* '(1 2 3 4 5)) @result{} 120 ++ (reduce #'append '((1) (2)) :initial-value '(i n i t)) @result{} (I N I T 1 2) ++ (reduce #'append '((1) (2)) :from-end t ++ :initial-value '(i n i t)) @result{} (1 2 I N I T) ++ (reduce #'- '(1 2 3 4)) @equiv{} (- (- (- 1 2) 3) 4) @result{} -8 ++ (reduce #'- '(1 2 3 4) :from-end t) ;Alternating sum. ++@equiv{} (- 1 (- 2 (- 3 4))) @result{} -2 ++ (reduce #'+ '()) @result{} 0 ++ (reduce #'+ '(3)) @result{} 3 ++ (reduce #'+ '(foo)) @result{} FOO ++ (reduce #'list '(1 2 3 4)) @result{} (((1 2) 3) 4) ++ (reduce #'list '(1 2 3 4) :from-end t) @result{} (1 (2 (3 4))) ++ (reduce #'list '(1 2 3 4) :initial-value 'foo) @result{} ((((foo 1) 2) 3) 4) ++ (reduce #'list '(1 2 3 4) ++ :from-end t :initial-value 'foo) @result{} (1 (2 (3 (4 foo)))) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node count, length, reduce, Sequences Dictionary ++@subsection count, count-if, count-if-not [Function] ++ ++@code{count} @i{item sequence @r{&key} from-end start end key test test-not} @result{} @i{n} ++ ++@code{count-if} @i{predicate sequence @r{&key} from-end start end key} @result{} @i{n} ++ ++@code{count-if-not} @i{predicate sequence @r{&key} from-end start end key} @result{} @i{n} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{predicate}---a @i{designator} for a @i{function} of one @i{argument} ++ that returns a @i{generalized boolean}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{n}---a non-negative @i{integer} ++ less than or equal to the @i{length} of @i{sequence}. ++ ++@subsubheading Description:: ++ ++@b{count}, @b{count-if}, and @b{count-if-not} ++count and return the number of @i{elements} in ++the @i{sequence} @i{bounded} by @i{start} and @i{end} ++that @i{satisfy the test}. ++ ++The @i{from-end} has no direct effect on the result. ++However, if @i{from-end} is @i{true}, ++the @i{elements} of @i{sequence} will be supplied as @i{arguments} to ++ the @i{test}, ++ @i{test-not}, ++ and @i{key} in reverse order, ++which may change the side-effects, if any, of those functions. ++ ++@subsubheading Examples:: ++ ++@example ++ (count #\a "how many A's are there in here?") @result{} 2 ++ (count-if-not #'oddp '((1) (2) (3) (4)) :key #'car) @result{} 2 ++ (count-if #'upper-case-p "The Crying of Lot 49" :start 4) @result{} 2 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{Rules about Test Functions}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++The @i{function} @b{count-if-not} is deprecated. ++ ++@node length, reverse, count, Sequences Dictionary ++@subsection length [Function] ++ ++@code{length} @i{sequence} @result{} @i{n} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{n}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the number of @i{elements} in @i{sequence}. ++ ++If @i{sequence} is a @i{vector} with a @i{fill pointer}, ++the active length as specified by the @i{fill pointer} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (length "abc") @result{} 3 ++ (setq str (make-array '(3) :element-type 'character ++ :initial-contents "abc" ++ :fill-pointer t)) @result{} "abc" ++ (length str) @result{} 3 ++ (setf (fill-pointer str) 2) @result{} 2 ++ (length str) @result{} 2 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{list-length} ++, ++@b{sequence} ++ ++@node reverse, sort, length, Sequences Dictionary ++@subsection reverse, nreverse [Function] ++ ++@code{reverse} @i{sequence} @result{} @i{reversed-sequence} ++ ++@code{nreverse} @i{sequence} @result{} @i{reversed-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{reversed-sequence}---a @i{sequence}. ++ ++@subsubheading Description:: ++ ++@b{reverse} and @b{nreverse} return a new @i{sequence} ++of the same kind as @i{sequence}, containing the same @i{elements}, ++but in reverse order. ++ ++@b{reverse} and @b{nreverse} differ in that @b{reverse} ++always creates and returns a new @i{sequence}, whereas @b{nreverse} ++might modify and return the given @i{sequence}. @b{reverse} never ++modifies the given @i{sequence}. ++ ++For @b{reverse}, if @i{sequence} is a @i{vector}, ++the result is a @i{fresh} @i{simple array} of @i{rank} one ++that has the same @i{actual array element type} as @i{sequence}. ++If @i{sequence} is a @i{list}, the result is a @i{fresh} @i{list}. ++ ++For @b{nreverse}, if @i{sequence} is a @i{vector}, ++the result is a @i{vector} ++that has the same @i{actual array element type} as @i{sequence}. ++If @i{sequence} is a @i{list}, the result is a @i{list}. ++ ++For @b{nreverse}, ++@i{sequence} might be destroyed and re-used to produce the result. ++The result might or might not be @i{identical} to @i{sequence}. ++ ++Specifically, when @i{sequence} is a @i{list}, ++@b{nreverse} is permitted to @b{setf} any part, @b{car} or @b{cdr}, ++of any @i{cons} that is part of the @i{list structure} of @i{sequence}. ++When @i{sequence} is a @i{vector}, ++@b{nreverse} is permitted to re-order the elements of @i{sequence} ++in order to produce the resulting @i{vector}. ++ ++@subsubheading Examples:: ++@example ++ (setq str "abc") @result{} "abc" ++ (reverse str) @result{} "cba" ++ str @result{} "abc" ++ (setq str (copy-seq str)) @result{} "abc" ++ (nreverse str) @result{} "cba" ++ str @result{} @i{implementation-dependent} ++ (setq l (list 1 2 3)) @result{} (1 2 3) ++ (nreverse l) @result{} (3 2 1) ++ l @result{} @i{implementation-dependent} ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nreverse} might either create a new @i{sequence}, ++modify the argument @i{sequence}, or both. ++(@b{reverse} does not modify @i{sequence}.) ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@node sort, find, reverse, Sequences Dictionary ++@subsection sort, stable-sort [Function] ++ ++@code{sort} @i{sequence predicate @r{&key} key} @result{} @i{sorted-sequence} ++ ++@code{stable-sort} @i{sequence predicate @r{&key} key} @result{} @i{sorted-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{predicate}---a @i{designator} for ++ a @i{function} of two arguments that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{sorted-sequence}---a @i{sequence}. ++ ++@subsubheading Description:: ++ ++@b{sort} and @b{stable-sort} destructively sort @i{sequences} ++according to the order determined by the @i{predicate} function. ++ ++If @i{sequence} is a @i{vector}, ++the result is a @i{vector} ++that has the same @i{actual array element type} as @i{sequence}. ++The result might or might not be simple, ++and might or might not be @i{identical} to @i{sequence}. ++If @i{sequence} is a @i{list}, ++the result is a @i{list}. ++ ++@b{sort} determines the relationship between two elements ++by giving keys extracted from the elements to the @i{predicate}. ++The first argument to the @i{predicate} function is the part of one element ++of @i{sequence} extracted by the @i{key} function ++(if supplied); the second ++argument is the part of another element ++of @i{sequence} extracted by the @i{key} function ++(if supplied). ++@i{Predicate} should return @i{true} if and only if the first argument is ++strictly less than the second (in some appropriate sense). ++If the first argument is greater than or equal to the second ++(in the appropriate sense), then the @i{predicate} should return @i{false}. ++ ++The argument to the @i{key} function is the @i{sequence} element. ++The return value of the @i{key} function ++becomes an argument to @i{predicate}. ++If @i{key} is not supplied or @b{nil}, the @i{sequence} element itself is used. ++There is no guarantee on the number of times the @i{key} will be called. ++ ++If the @i{key} and @i{predicate} always return, ++then the sorting operation will always terminate, ++producing a @i{sequence} containing the same @i{elements} as @i{sequence} ++(that is, the result is a permutation of @i{sequence}). ++This is guaranteed even if the @i{predicate} ++does not really consistently represent a total order ++(in which case the @i{elements} will be scrambled in some unpredictable way, ++but no @i{element} will be lost). ++If the @i{key} consistently returns meaningful keys, ++and the @i{predicate} does reflect some total ordering criterion on those keys, ++then the @i{elements} of the @i{sorted-sequence} ++will be properly sorted according to that ordering. ++ ++The sorting operation performed by @b{sort} is not guaranteed stable. ++Elements considered equal by the @i{predicate} might or might not ++stay in their original order. The @i{predicate} is assumed to ++consider two elements @t{x} and @t{y} to be equal if ++@t{(funcall @i{predicate} @i{x} @i{y})} and ++@t{(funcall @i{predicate} @i{y} @i{x})} are both @i{false}. ++@b{stable-sort} guarantees stability. ++ ++The sorting operation can be destructive in all cases. In the case of a ++@i{vector} ++argument, this is accomplished by permuting the elements in place. ++In the case of a @i{list}, the @i{list} is ++destructively reordered in the same manner as for ++@b{nreverse}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq tester (copy-seq "lkjashd")) @result{} "lkjashd" ++ (sort tester #'char-lessp) @result{} "adhjkls" ++ (setq tester (list '(1 2 3) '(4 5 6) '(7 8 9))) @result{} ((1 2 3) (4 5 6) (7 8 9)) ++ (sort tester #'> :key #'car) @result{} ((7 8 9) (4 5 6) (1 2 3)) ++ (setq tester (list 1 2 3 4 5 6 7 8 9 0)) @result{} (1 2 3 4 5 6 7 8 9 0) ++ (stable-sort tester #'(lambda (x y) (and (oddp x) (evenp y)))) ++@result{} (1 3 5 7 9 2 4 6 8 0) ++ (sort (setq committee-data ++ (vector (list (list "JonL" "White") "Iteration") ++ (list (list "Dick" "Waters") "Iteration") ++ (list (list "Dick" "Gabriel") "Objects") ++ (list (list "Kent" "Pitman") "Conditions") ++ (list (list "Gregor" "Kiczales") "Objects") ++ (list (list "David" "Moon") "Objects") ++ (list (list "Kathy" "Chapman") "Editorial") ++ (list (list "Larry" "Masinter") "Cleanup") ++ (list (list "Sandra" "Loosemore") "Compiler"))) ++ #'string-lessp :key #'cadar) ++@result{} #((("Kathy" "Chapman") "Editorial") ++ (("Dick" "Gabriel") "Objects") ++ (("Gregor" "Kiczales") "Objects") ++ (("Sandra" "Loosemore") "Compiler") ++ (("Larry" "Masinter") "Cleanup") ++ (("David" "Moon") "Objects") ++ (("Kent" "Pitman") "Conditions") ++ (("Dick" "Waters") "Iteration") ++ (("JonL" "White") "Iteration")) ++ ;; Note that individual alphabetical order within `committees' ++ ;; is preserved. ++ (setq committee-data ++ (stable-sort committee-data #'string-lessp :key #'cadr)) ++@result{} #((("Larry" "Masinter") "Cleanup") ++ (("Sandra" "Loosemore") "Compiler") ++ (("Kent" "Pitman") "Conditions") ++ (("Kathy" "Chapman") "Editorial") ++ (("Dick" "Waters") "Iteration") ++ (("JonL" "White") "Iteration") ++ (("Dick" "Gabriel") "Objects") ++ (("Gregor" "Kiczales") "Objects") ++ (("David" "Moon") "Objects")) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{merge} ++, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects}, ++ ++@ref{Destructive Operations} ++ ++@node find, position, sort, Sequences Dictionary ++@subsection find, find-if, find-if-not [Function] ++ ++@code{find} @i{item sequence @r{&key} from-end test test-not start end key} @result{} @i{element} ++ ++@code{find-if} @i{predicate sequence @r{&key} from-end start end key} @result{} @i{element} ++ ++@code{find-if-not} @i{predicate sequence @r{&key} from-end start end key} @result{} @i{element} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{predicate}---a @i{designator} for a @i{function} of one @i{argument} ++ that returns a @i{generalized boolean}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{element}---an @i{element} of the @i{sequence}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{find}, @b{find-if}, and @b{find-if-not} ++each search for an @i{element} of the @i{sequence} ++@i{bounded} by @i{start} and @i{end} ++ that @i{satisfies the predicate} @i{predicate} ++or that @i{satisfies the test} @i{test} or @i{test-not}, ++as appropriate. ++ ++If @i{from-end} is @i{true}, ++then the result is the rightmost @i{element} that @i{satisfies the test}. ++ ++If the @i{sequence} contains an @i{element} that @i{satisfies the test}, ++then the leftmost or rightmost @i{sequence} element, ++depending on @i{from-end}, ++is returned; ++otherwise @b{nil} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (find #\d "here are some letters that can be looked at" :test #'char>) ++@result{} #\Space ++ (find-if #'oddp '(1 2 3 4 5) :end 3 :from-end t) @result{} 3 ++ (find-if-not #'complexp ++ '#(3.5 2 #C(1.0 0.0) #C(0.0 1.0)) ++ :start 2) @result{} NIL ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{position} ++, ++@ref{Rules about Test Functions}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++The @i{function} @b{find-if-not} is deprecated. ++ ++@node position, search, find, Sequences Dictionary ++@subsection position, position-if, position-if-not [Function] ++ ++@code{position} @i{item sequence @r{&key} from-end test test-not start end key} @result{} @i{position} ++ ++@code{position-if} @i{predicate sequence @r{&key} from-end start end key} @result{} @i{position} ++ ++@code{position-if-not} @i{predicate sequence @r{&key} from-end start end key} @result{} @i{position} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{predicate}---a @i{designator} for a @i{function} of one argument ++ that returns a @i{generalized boolean}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{position}---a @i{bounding index} of @i{sequence}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{position}, @b{position-if}, and @b{position-if-not} ++each search @i{sequence} for an @i{element} that @i{satisfies the test}. ++ ++The @i{position} returned is the index within @i{sequence} ++ of the leftmost (if @i{from-end} is @i{true}) ++ or of the rightmost (if @i{from-end} is @i{false}) ++@i{element} that @i{satisfies the test}; ++otherwise @b{nil} is returned. ++The index returned is relative to the left-hand end of the entire @i{sequence}, ++regardless of the value of @i{start}, @i{end}, or @i{from-end}. ++ ++@subsubheading Examples:: ++ ++@example ++ (position #\a "baobab" :from-end t) @result{} 4 ++ (position-if #'oddp '((1) (2) (3) (4)) :start 1 :key #'car) @result{} 2 ++ (position 595 '()) @result{} NIL ++ (position-if-not #'integerp '(1 2 3 4 5.0)) @result{} 4 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{find} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++The @i{function} @b{position-if-not} is deprecated. ++ ++@node search, mismatch, position, Sequences Dictionary ++@subsection search [Function] ++ ++@code{search} @i{sequence-1 sequence-2 ++ @r{&key} from-end test test-not ++ key start1 start2 ++ end1 end2}@* ++ @result{} @i{position} ++ ++@subsubheading Arguments and Values:: ++ ++@i{Sequence-1}---a @i{sequence}. ++ ++@i{Sequence-2}---a @i{sequence}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{start1}, @i{end1}---@i{bounding index designators} of @i{sequence-1}. ++ The defaults for @i{start1} and @i{end1} are @t{0} and @b{nil}, respectively. ++ ++@i{start2}, @i{end2}---@i{bounding index designators} of @i{sequence-2}. ++ The defaults for @i{start2} and @i{end2} are @t{0} and @b{nil}, respectively. ++ ++@i{position}---a @i{bounding index} of @i{sequence-2}, ++ or @b{nil}. ++ ++@subsubheading Description:: ++ ++Searches @i{sequence-2} for a subsequence that matches @i{sequence-1}. ++ ++The implementation may choose to search @i{sequence-2} in any order; ++there is no guarantee on the number of times the test is made. ++For example, ++when @i{start-end} is @i{true}, ++the @i{sequence} might actually be searched from left to right ++instead of from right to left (but in either case would return ++the rightmost matching subsequence). ++If the search succeeds, ++@b{search} returns the offset into @i{sequence-2} ++of the first element of the leftmost or rightmost matching subsequence, ++depending on @i{from-end}; ++otherwise @b{search} returns @b{nil}. ++ ++If @i{from-end} is @i{true}, the index of the leftmost ++element of the rightmost matching subsequence is returned. ++ ++@subsubheading Examples:: ++@example ++ (search "dog" "it's a dog's life") @result{} 7 ++ (search '(0 1) '(2 4 6 1 3 5) :key #'oddp) @result{} 2 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++@node mismatch, replace, search, Sequences Dictionary ++@subsection mismatch [Function] ++ ++@code{mismatch} @i{sequence-1 sequence-2 ++ @r{&key} from-end test test-not key start1 start2 end1 end2}@* ++ @result{} @i{position} ++ ++@subsubheading Arguments and Values:: ++ ++@i{Sequence-1}---a @i{sequence}. ++ ++@i{Sequence-2}---a @i{sequence}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start1}, @i{end1}---@i{bounding index designators} of @i{sequence-1}. ++ The defaults for @i{start1} and @i{end1} are @t{0} and @b{nil}, respectively. ++ ++@i{start2}, @i{end2}---@i{bounding index designators} of @i{sequence-2}. ++ The defaults for @i{start2} and @i{end2} are @t{0} and @b{nil}, respectively. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{position}---a @i{bounding index} of @i{sequence-1}, ++ or @b{nil}. ++ ++@subsubheading Description:: ++ ++The specified subsequences of ++@i{sequence-1} and @i{sequence-2} are compared element-wise. ++ ++The @i{key} argument is used for both the @i{sequence-1} and the @i{sequence-2}. ++ ++If @i{sequence-1} and @i{sequence-2} ++are of equal length and match in every element, the result is ++@i{false}. Otherwise, the result is a non-negative @i{integer}, ++the index within ++@i{sequence-1} of the leftmost or rightmost position, depending ++on @i{from-end}, at which the two ++subsequences fail to match. ++If one subsequence ++is shorter than and a matching prefix of the other, ++the result is the index ++relative to @i{sequence-1} beyond the last position tested. ++ ++If @i{from-end} is @i{true}, then one plus the index of the rightmost ++position in which the @i{sequences} ++differ is returned. In effect, the subsequences ++are aligned at their right-hand ends; then, the last elements are compared, ++the penultimate elements, and so on. The index returned is ++an index relative to @i{sequence-1}. ++ ++@subsubheading Examples:: ++@example ++ (mismatch "abcd" "ABCDE" :test #'char-equal) @result{} 4 ++ (mismatch '(3 2 1 1 2 3) '(1 2 3) :from-end t) @result{} 3 ++ (mismatch '(1 2 3) '(2 3 4) :test-not #'eq :key #'oddp) @result{} NIL ++ (mismatch '(1 2 3 4 5 6) '(3 4 5 6 7) :start1 2 :end2 4) @result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++@node replace, substitute, mismatch, Sequences Dictionary ++@subsection replace [Function] ++ ++@code{replace} @i{sequence-1 sequence-2 @r{&key} start1 end1 start2 end2} @result{} @i{sequence-1} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence-1}---a @i{sequence}. ++ ++@i{sequence-2}---a @i{sequence}. ++ ++@i{start1}, @i{end1}---@i{bounding index designators} of @i{sequence-1}. ++ The defaults for @i{start1} and @i{end1} are @t{0} and @b{nil}, respectively. ++ ++@i{start2}, @i{end2}---@i{bounding index designators} of @i{sequence-2}. ++ The defaults for @i{start2} and @i{end2} are @t{0} and @b{nil}, respectively. ++ ++@subsubheading Description:: ++ ++Destructively modifies @i{sequence-1} ++by replacing the @i{elements} of @i{subsequence-1} ++ @i{bounded} by @i{start1} and @i{end1} ++with the @i{elements} of @i{subsequence-2} ++ @i{bounded} by @i{start2} and @i{end2}. ++ ++@i{Sequence-1} is destructively modified by copying successive ++@i{elements} into it from @i{sequence-2}. ++@i{Elements} of the subsequence of @i{sequence-2} ++@i{bounded} by @i{start2} and @i{end2} ++are copied into the subsequence of @i{sequence-1} ++@i{bounded} by @i{start1} and @i{end1}. ++If these subsequences are not of the same length, ++then the shorter length determines how many @i{elements} are copied; ++the extra @i{elements} near the end of the longer subsequence ++are not involved in the operation. ++The number of elements copied can be expressed as: ++ ++@example ++ (min (- @i{end1} @i{start1}) (- @i{end2} @i{start2})) ++@end example ++ ++If @i{sequence-1} and @i{sequence-2} are the @i{same} @i{object} ++and the region being modified overlaps the region being copied ++from, then it is as if the entire source region were copied to another ++place and only then copied back into the target region. ++However, if @i{sequence-1} and @i{sequence-2} are not the same, ++but the region being modified overlaps the region being copied from ++(perhaps because of shared list structure or displaced @i{arrays}), ++then after the @b{replace} operation ++the subsequence of @i{sequence-1} being modified will have ++unpredictable contents. ++It is an error if the elements of @i{sequence-2} are not of a ++@i{type} that can be stored into @i{sequence-1}. ++ ++@subsubheading Examples:: ++@example ++ (replace "abcdefghij" "0123456789" :start1 4 :end1 7 :start2 4) ++@result{} "abcd456hij" ++ (setq lst "012345678") @result{} "012345678" ++ (replace lst lst :start1 2 :start2 0) @result{} "010123456" ++ lst @result{} "010123456" ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{sequence-1} is modified. ++ ++@subsubheading See Also:: ++ ++@ref{fill} ++ ++@node substitute, concatenate, replace, Sequences Dictionary ++@subsection substitute, substitute-if, substitute-if-not, ++@subheading nsubstitute, nsubstitute-if, nsubstitute-if-not ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{substitute} @i{newitem olditem sequence ++ @r{&key} from-end test ++ test-not start ++ end count key}@* ++ @result{} @i{result-sequence} ++ ++@code{substitute-if} @i{newitem predicate sequence @r{&key} from-end start end count key}@* ++ @result{} @i{result-sequence} ++ ++@code{substitute-if-not} @i{newitem predicate sequence @r{&key} from-end start end count key}@* ++ @result{} @i{result-sequence} ++ ++@code{nsubstitute} @i{newitem olditem sequence ++ @r{&key} from-end test test-not start end count key}@* ++ @result{} @i{sequence} ++ ++@code{nsubstitute-if} @i{newitem predicate sequence @r{&key} from-end start end count key}@* ++ @result{} @i{sequence} ++ ++@code{nsubstitute-if-not} @i{newitem predicate sequence @r{&key} from-end start end count key}@* ++ @result{} @i{sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{newitem}---an @i{object}. ++ ++@i{olditem}---an @i{object}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{predicate}---a @i{designator} for a @i{function} of one @i{argument} ++ that returns a @i{generalized boolean}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{count}---an @i{integer} or @b{nil}. ++ ++ The default is @b{nil}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-sequence}---a @i{sequence}. ++ ++@subsubheading Description:: ++ ++@b{substitute}, @b{substitute-if}, and @b{substitute-if-not} ++return a ++copy of @i{sequence} in which each @i{element} ++that @i{satisfies the test} has been replaced with @i{newitem}. ++ ++@b{nsubstitute}, @b{nsubstitute-if}, and @b{nsubstitute-if-not} ++are like @b{substitute}, @b{substitute-if}, and ++@b{substitute-if-not} respectively, but they may modify ++@i{sequence}. ++ ++If ++@i{sequence} is a @i{vector}, the result is a ++@i{vector} that has the same ++@i{actual array element type} as @i{sequence}. ++The result might or might not be simple, and ++might or might not be @i{identical} ++to @i{sequence}. ++If @i{sequence} is a @i{list}, the result is a ++@i{list}. ++ ++@i{Count}, if supplied, limits the number of elements ++altered; if more than @i{count} @i{elements} @i{satisfy the test}, ++then of these @i{elements} only the leftmost or rightmost, depending ++on @i{from-end}, are replaced, ++as many as specified by @i{count}. ++ ++If @i{count} is supplied and negative, ++the behavior is as if zero had been supplied instead. ++ ++If @i{count} is @b{nil}, all matching items are affected. ++ ++Supplying a @i{from-end} of @i{true} matters only when the ++@i{count} is provided (and @i{non-nil}); ++in that case, ++only the rightmost @i{count} @i{elements} @i{satisfying the test} are removed ++(instead of the leftmost). ++ ++@i{predicate}, @i{test}, and @i{test-not} ++might be called more than once for each @i{sequence} @i{element}, ++and their side effects can happen in any order. ++ ++The result of all these functions is a @i{sequence} ++of the same @i{type} as @i{sequence} ++that has the same elements except that those in the subsequence ++@i{bounded} by @i{start} and @i{end} and @i{satisfying the test} ++have been replaced by @i{newitem}. ++ ++@b{substitute}, @b{substitute-if}, and @b{substitute-if-not} ++return a @i{sequence} which can share with @i{sequence} ++or may be @i{identical} to the input @i{sequence} ++if no elements need to be changed. ++ ++@b{nsubstitute} and @b{nsubstitute-if} are required to ++@b{setf} any @b{car} (if @i{sequence} is a @i{list}) ++or @b{aref} (if @i{sequence} is a @i{vector}) ++of @i{sequence} that is required to be replaced with @i{newitem}. ++If @i{sequence} is a @i{list}, ++none of the @i{cdrs} of the top-level @i{list} can be modified. ++ ++@subsubheading Examples:: ++ ++@example ++ (substitute #\. #\SPACE "0 2 4 6") @result{} "0.2.4.6" ++ (substitute 9 4 '(1 2 4 1 3 4 5)) @result{} (1 2 9 1 3 9 5) ++ (substitute 9 4 '(1 2 4 1 3 4 5) :count 1) @result{} (1 2 9 1 3 4 5) ++ (substitute 9 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) ++@result{} (1 2 4 1 3 9 5) ++ (substitute 9 3 '(1 2 4 1 3 4 5) :test #'>) @result{} (9 9 4 9 3 4 5) ++ ++ (substitute-if 0 #'evenp '((1) (2) (3) (4)) :start 2 :key #'car) ++@result{} ((1) (2) (3) 0) ++ (substitute-if 9 #'oddp '(1 2 4 1 3 4 5)) @result{} (9 2 4 9 9 4 9) ++ (substitute-if 9 #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t) ++@result{} (1 2 4 1 3 9 5) ++ ++ (setq some-things (list 'a 'car 'b 'cdr 'c)) @result{} (A CAR B CDR C) ++ (nsubstitute-if "function was here" #'fboundp some-things ++ :count 1 :from-end t) @result{} (A CAR B "function was here" C) ++ some-things @result{} (A CAR B "function was here" C) ++ (setq alpha-tester (copy-seq "ab ")) @result{} "ab " ++ (nsubstitute-if-not #\z #'alpha-char-p alpha-tester) @result{} "abz" ++ alpha-tester @result{} "abz" ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{nsubstitute}, @b{nsubstitute-if}, and @b{nsubstitute-if-not} ++modify @i{sequence}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{subst} ++, ++@b{nsubst}, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++The functions @b{substitute-if-not} and @b{nsubstitute-if-not} are deprecated. ++ ++@b{nsubstitute} and @b{nsubstitute-if} can be used ++in for-effect-only positions in code. ++ ++Because the side-effecting variants (@i{e.g.}, @b{nsubstitute}) ++potentially change the path that is being traversed, their effects in ++the presence of shared or circular structure may vary in surprising ways when ++compared to their non-side-effecting alternatives. To see this, ++consider the following side-effect behavior, which might be exhibited by ++some implementations: ++ ++@example ++ (defun test-it (fn) ++ (let ((x (cons 'b nil))) ++ (rplacd x x) ++ (funcall fn 'a 'b x :count 1))) ++ (test-it #'substitute) @result{} (A . #1=(B . #1#)) ++ (test-it #'nsubstitute) @result{} (A . #1#) ++@end example ++ ++@node concatenate, merge, substitute, Sequences Dictionary ++@subsection concatenate [Function] ++ ++@code{concatenate} @i{result-type @r{&rest} sequences} @result{} @i{result-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{result-type}---a @b{sequence} @i{type specifier}. ++ ++@i{sequences}---a @i{sequence}. ++ ++@i{result-sequence}---a @i{proper sequence} of @i{type} @i{result-type}. ++ ++@subsubheading Description:: ++ ++@b{concatenate} returns a @i{sequence} that contains ++all the individual elements of all the @i{sequences} in the order ++that they are supplied. ++The @i{sequence} is of type @i{result-type}, ++which must be a @i{subtype} of @i{type} @b{sequence}. ++ ++All of the @i{sequences} are copied from; the result ++does not share any structure with any of the @i{sequences}. ++Therefore, if only one @i{sequence} is provided ++and it is of type @i{result-type}, ++@b{concatenate} is required to copy @i{sequence} rather than simply ++returning it. ++ ++It is an error if any element of the @i{sequences} cannot be an ++element of the @i{sequence} result. ++ ++[Reviewer Note by Barmar: Should signal?] ++ ++If the @i{result-type} is a @i{subtype} of @b{list}, ++the result will be a @i{list}. ++ ++If the @i{result-type} is a @i{subtype} of @b{vector}, ++then if the implementation can determine the element type specified ++for the @i{result-type}, the element type of the resulting array ++is the result of @i{upgrading} that element type; or, if the ++implementation can determine that the element type is unspecified (or @t{*}), ++the element type of the resulting array is @b{t}; ++otherwise, an error is signaled. ++ ++@subsubheading Examples:: ++ ++@example ++(concatenate 'string "all" " " "together" " " "now") @result{} "all together now" ++(concatenate 'list "ABC" '(d e f) #(1 2 3) #*1011) ++@result{} (#\A #\B #\C D E F 1 2 3 1 0 1 1) ++(concatenate 'list) @result{} NIL ++@end example ++ ++@example ++ (concatenate '(vector * 2) "a" "bc") should signal an error ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error is signaled if the @i{result-type} is neither ++ a @i{recognizable subtype} of @b{list}, ++ nor a @i{recognizable subtype} of @b{vector}. ++ ++An error of @i{type} @b{type-error} should be signaled if @i{result-type} ++specifies the number of elements and the sum of @i{sequences} ++is different from that number. ++ ++@subsubheading See Also:: ++ ++@ref{append} ++ ++@node merge, remove, concatenate, Sequences Dictionary ++@subsection merge [Function] ++ ++@code{merge} @i{result-type sequence-1 sequence-2 predicate @r{&key} key} @result{} @i{result-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{result-type}---a @b{sequence} @i{type specifier}. ++ ++@i{sequence-1}---a @i{sequence}. ++ ++@i{sequence-2}---a @i{sequence}. ++ ++@i{predicate}---a @i{designator} for ++ a @i{function} of two arguments that returns a @i{generalized boolean}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-sequence}---a @i{proper sequence} of @i{type} @i{result-type}. ++ ++@subsubheading Description:: ++ ++Destructively merges @i{sequence-1} with @i{sequence-2} according ++to an order determined by the @i{predicate}. @b{merge} determines ++the relationship between two elements by giving keys extracted from the ++sequence elements to the @i{predicate}. ++ ++The first argument to the @i{predicate} function is an element of ++@i{sequence-1} as returned by the @i{key} (if supplied); ++the second argument is an element of @i{sequence-2} as returned by ++the @i{key} (if supplied). ++@i{Predicate} should return @i{true} if and only if its first ++argument is strictly less than the second (in some appropriate sense). ++If the first argument is greater than or equal to the second ++(in the appropriate sense), then @i{predicate} should return @i{false}. ++@b{merge} ++considers two elements @t{x} and @t{y} to be equal if ++@t{(funcall predicate x y)} and ++@t{(funcall predicate y x)} both @i{yield} @i{false}. ++ ++The argument to the @i{key} is the @i{sequence} element. ++Typically, the return value of the @i{key} ++becomes the argument to @i{predicate}. ++If @i{key} is not supplied or @b{nil}, the sequence element itself is used. ++The @i{key} may be executed more than once for each @i{sequence} @i{element}, ++and its side effects may occur in any order. ++ ++If @i{key} and @i{predicate} return, then the merging operation ++will terminate. The result of merging two @i{sequences} @t{x} and @t{y} ++is a new @i{sequence} of type @i{result-type} @t{z}, ++such that the length of @t{z} is the sum of the lengths of @t{x} ++and @t{y}, and @t{z} contains all the elements of @t{x} and @t{y}. ++If @t{x1} and @t{x2} are two elements of @t{x}, and @t{x1} precedes ++@t{x2} in @t{x}, then @t{x1} precedes @t{x2} in @t{z}, and similarly for ++elements of @t{y}. In short, @t{z} is an interleaving of @t{x} and @t{y}. ++ ++If @t{x} and @t{y} were correctly sorted according to the ++@i{predicate}, then @t{z} will also be correctly sorted. ++If @t{x} or @t{y} is not so sorted, then @t{z} will not be sorted, ++but will nevertheless be an interleaving of @t{x} and @t{y}. ++ ++The merging operation is guaranteed stable; ++if two or more elements are considered equal by the @i{predicate}, ++then the elements from @i{sequence-1} will ++precede those from @i{sequence-2} in the result. ++ ++@i{sequence-1} and/or @i{sequence-2} may be destroyed. ++ ++If the @i{result-type} is a @i{subtype} of @b{list}, ++the result will be a @i{list}. ++ ++If the @i{result-type} is a @i{subtype} of @b{vector}, ++then if the implementation can determine the element type specified ++for the @i{result-type}, the element type of the resulting array ++is the result of @i{upgrading} that element type; or, if the ++implementation can determine that the element type is unspecified (or @t{*}), ++the element type of the resulting array is @b{t}; ++otherwise, an error is signaled. ++ ++@subsubheading Examples:: ++@example ++ (setq test1 (list 1 3 4 6 7)) ++ (setq test2 (list 2 5 8)) ++ (merge 'list test1 test2 #'<) @result{} (1 2 3 4 5 6 7 8) ++ (setq test1 (copy-seq "BOY")) ++ (setq test2 (copy-seq :nosy")) ++ (merge 'string test1 test2 #'char-lessp) @result{} "BnOosYy" ++ (setq test1 (vector ((red . 1) (blue . 4)))) ++ (setq test2 (vector ((yellow . 2) (green . 7)))) ++ (merge 'vector test1 test2 #'< :key #'cdr) ++@result{} #((RED . 1) (YELLOW . 2) (BLUE . 4) (GREEN . 7)) ++@end example ++ ++@example ++ (merge '(vector * 4) '(1 5) '(2 4 6) #'<) should signal an error ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error must be signaled if the @i{result-type} is neither ++ a @i{recognizable subtype} of @b{list}, ++ nor a @i{recognizable subtype} of @b{vector}. ++ ++An error of @i{type} @b{type-error} should be signaled ++if @i{result-type} specifies the number of elements ++and the sum of the lengths of @i{sequence-1} and @i{sequence-2} ++is different from that number. ++ ++@subsubheading See Also:: ++ ++@ref{sort} ++, ++@b{stable-sort}, ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node remove, remove-duplicates, merge, Sequences Dictionary ++@subsection remove, remove-if, remove-if-not, ++@subheading delete, delete-if, delete-if-not ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{remove} @i{item sequence @r{&key} from-end test test-not start end count key} @result{} @i{result-sequence} ++ ++@code{remove-if} @i{test sequence @r{&key} from-end start end count key} @result{} @i{result-sequence} ++ ++@code{remove-if-not} @i{test sequence @r{&key} from-end start end count key} @result{} @i{result-sequence} ++ ++@code{delete} @i{item sequence @r{&key} from-end test test-not start end count key} @result{} @i{result-sequence} ++ ++@code{delete-if} @i{test sequence @r{&key} from-end start end count key} @result{} @i{result-sequence} ++ ++@code{delete-if-not} @i{test sequence @r{&key} from-end start end count key} @result{} @i{result-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{item}---an @i{object}. ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{test}---a @i{designator} for a @i{function} ++ of one @i{argument} that returns a @i{generalized boolean}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{count}---an @i{integer} or @b{nil}. ++ ++ The default is @b{nil}. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-sequence}---a @i{sequence}. ++ ++@subsubheading Description:: ++ ++@b{remove}, @b{remove-if}, and @b{remove-if-not} ++return a @i{sequence} from which ++the elements that @i{satisfy the test} ++have been removed. ++ ++@b{delete}, @b{delete-if}, and @b{delete-if-not} ++are like @b{remove}, @b{remove-if}, and ++@b{remove-if-not} respectively, ++but they may modify @i{sequence}. ++ ++If @i{sequence} is a @i{vector}, the result is a ++@i{vector} that has the same ++@i{actual array element type} as @i{sequence}. ++The result might or might not be simple, and ++might or might not be @i{identical} ++to @i{sequence}. ++If @i{sequence} is a @i{list}, the result is a @i{list}. ++ ++Supplying a @i{from-end} of @i{true} matters only when the ++@i{count} is provided; in that case only the rightmost @i{count} elements ++@i{satisfying the test} are deleted. ++ ++@i{Count}, if supplied, limits the number of elements ++removed or deleted; if more than @i{count} elements @i{satisfy the test}, ++then of these elements only the leftmost or rightmost, depending on ++@i{from-end}, ++are deleted or removed, ++as many as specified by @i{count}. ++ ++If @i{count} is supplied and negative, ++the behavior is as if zero had been supplied instead. ++ ++If @i{count} is @b{nil}, all matching items are affected. ++ ++For all these functions, ++elements ++not removed or deleted occur in the same order in the result ++as they did in @i{sequence}. ++ ++@b{remove}, @b{remove-if}, @b{remove-if-not} return ++a @i{sequence} ++of the same @i{type} as @i{sequence} ++that has the same elements except that those in the subsequence ++@i{bounded} by @i{start} and @i{end} and @i{satisfying the test} ++have been removed. ++This is a non-destructive operation. If any ++elements need to be removed, the result will be a copy. ++The result of @b{remove} may share ++with @i{sequence}; ++the result may be @i{identical} to the input @i{sequence} ++if no elements need to be removed. ++ ++@b{delete}, @b{delete-if}, and @b{delete-if-not} ++return a @i{sequence} ++of the same @i{type} as @i{sequence} ++that has the same elements except that those in the subsequence ++@i{bounded} by @i{start} and @i{end} and @i{satisfying the test} ++have been deleted. ++@i{Sequence} may be destroyed and used to construct ++the result; however, the result might or might not be @i{identical} ++to @i{sequence}. ++ ++@b{delete}, when @i{sequence} is a @i{list}, is permitted to ++@b{setf} any part, @b{car} or @b{cdr}, of the ++top-level list structure in that @i{sequence}. ++When @i{sequence} is a @i{vector}, @b{delete} is ++permitted to change the dimensions of the @i{vector} ++and to slide its elements into new positions without ++permuting them to produce the resulting @i{vector}. ++ ++@b{delete-if} is constrained to behave exactly as follows: ++ ++@example ++ (delete nil @i{sequence} ++ :test #'(lambda (ignore @i{item}) (funcall @i{test} @i{item})) ++ ...) ++@end example ++ ++@subsubheading Examples:: ++@example ++ (remove 4 '(1 3 4 5 9)) @result{} (1 3 5 9) ++ (remove 4 '(1 2 4 1 3 4 5)) @result{} (1 2 1 3 5) ++ (remove 4 '(1 2 4 1 3 4 5) :count 1) @result{} (1 2 1 3 4 5) ++ (remove 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) @result{} (1 2 4 1 3 5) ++ (remove 3 '(1 2 4 1 3 4 5) :test #'>) @result{} (4 3 4 5) ++ (setq lst '(list of four elements)) @result{} (LIST OF FOUR ELEMENTS) ++ (setq lst2 (copy-seq lst)) @result{} (LIST OF FOUR ELEMENTS) ++ (setq lst3 (delete 'four lst)) @result{} (LIST OF ELEMENTS) ++ (equal lst lst2) @result{} @i{false} ++ (remove-if #'oddp '(1 2 4 1 3 4 5)) @result{} (2 4 4) ++ (remove-if #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t) ++@result{} (1 2 4 1 3 5) ++ (remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9) :count 2 :from-end t) ++@result{} (1 2 3 4 5 6 8) ++ (setq tester (list 1 2 4 1 3 4 5)) @result{} (1 2 4 1 3 4 5) ++ (delete 4 tester) @result{} (1 2 1 3 5) ++ (setq tester (list 1 2 4 1 3 4 5)) @result{} (1 2 4 1 3 4 5) ++ (delete 4 tester :count 1) @result{} (1 2 1 3 4 5) ++ (setq tester (list 1 2 4 1 3 4 5)) @result{} (1 2 4 1 3 4 5) ++ (delete 4 tester :count 1 :from-end t) @result{} (1 2 4 1 3 5) ++ (setq tester (list 1 2 4 1 3 4 5)) @result{} (1 2 4 1 3 4 5) ++ (delete 3 tester :test #'>) @result{} (4 3 4 5) ++ (setq tester (list 1 2 4 1 3 4 5)) @result{} (1 2 4 1 3 4 5) ++ (delete-if #'oddp tester) @result{} (2 4 4) ++ (setq tester (list 1 2 4 1 3 4 5)) @result{} (1 2 4 1 3 4 5) ++ (delete-if #'evenp tester :count 1 :from-end t) @result{} (1 2 4 1 3 5) ++ (setq tester (list 1 2 3 4 5 6)) @result{} (1 2 3 4 5 6) ++ (delete-if #'evenp tester) @result{} (1 3 5) ++ tester @result{} @i{implementation-dependent} ++@end example ++ ++@example ++ (setq foo (list 'a 'b 'c)) @result{} (A B C) ++ (setq bar (cdr foo)) @result{} (B C) ++ (setq foo (delete 'b foo)) @result{} (A C) ++ bar @result{} ((C)) or ... ++ (eq (cdr foo) (car bar)) @result{} T or ... ++@end example ++ ++@subsubheading Side Effects:: ++ ++For @b{delete}, @b{delete-if}, and @b{delete-if-not}, ++@i{sequence} may be destroyed and used to construct the result. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++The functions @b{delete-if-not} and @b{remove-if-not} are deprecated. ++ ++@node remove-duplicates, , remove, Sequences Dictionary ++@subsection remove-duplicates, delete-duplicates [Function] ++ ++@code{remove-duplicates} @i{sequence @r{&key} ++ from-end test test-not ++ start end key}@* ++ @result{} @i{result-sequence} ++ ++@code{delete-duplicates} @i{sequence @r{&key} ++ from-end test test-not ++ start end key}@* ++ @result{} @i{result-sequence} ++ ++@subsubheading Arguments and Values:: ++ ++@i{sequence}---a @i{proper sequence}. ++ ++@i{from-end}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{test}---a @i{designator} for a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{test-not}---a @i{designator} for ++ a @i{function} of two @i{arguments} ++ that returns a @i{generalized boolean}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{sequence}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{key}---a @i{designator} for a @i{function} of one argument, ++ or @b{nil}. ++ ++@i{result-sequence}---a @i{sequence}. ++ ++@subsubheading Description:: ++ ++@b{remove-duplicates} returns a modified copy of @i{sequence} ++from which any element that matches another element occurring in ++@i{sequence} has been removed. ++ ++If @i{sequence} is a @i{vector}, the result is a ++@i{vector} that has the same ++@i{actual array element type} as @i{sequence}. ++The result might or might not be simple, and ++might or might not be @i{identical} ++to @i{sequence}. ++If @i{sequence} is a @i{list}, the result is a @i{list}. ++ ++@b{delete-duplicates} is like @b{remove-duplicates}, ++but @b{delete-duplicates} may modify @i{sequence}. ++ ++The elements of @i{sequence} are compared @i{pairwise}, and if any two match, ++then the one occurring earlier in @i{sequence} ++is discarded, unless @i{from-end} is @i{true}, in which case the one ++later in @i{sequence} is discarded. ++ ++@b{remove-duplicates} and @b{delete-duplicates} ++return a @i{sequence} of the same @i{type} as ++@i{sequence} with enough elements removed so that no two of the remaining ++elements match. The order of the elements remaining in the result ++is the same as the order in which they appear in @i{sequence}. ++ ++@b{remove-duplicates} returns a @i{sequence} ++that may share ++with @i{sequence} or may be @i{identical} to @i{sequence} ++if no elements need to be removed. ++ ++@b{delete-duplicates}, when @i{sequence} is a @i{list}, ++is permitted to @b{setf} any part, @b{car} or @b{cdr}, ++of the top-level list structure in that @i{sequence}. ++When @i{sequence} is a @i{vector}, @b{delete-duplicates} ++is permitted to change the dimensions of the @i{vector} ++and to slide its elements into new positions without ++permuting them to produce the resulting @i{vector}. ++ ++@subsubheading Examples:: ++ ++@example ++ (remove-duplicates "aBcDAbCd" :test #'char-equal :from-end t) @result{} "aBcD" ++ (remove-duplicates '(a b c b d d e)) @result{} (A C B D E) ++ (remove-duplicates '(a b c b d d e) :from-end t) @result{} (A B C D E) ++ (remove-duplicates '((foo #\a) (bar #\%) (baz #\A)) ++ :test #'char-equal :key #'cadr) @result{} ((BAR #\%) (BAZ #\A)) ++ (remove-duplicates '((foo #\a) (bar #\%) (baz #\A)) ++ :test #'char-equal :key #'cadr :from-end t) @result{} ((FOO #\a) (BAR #\%)) ++ (setq tester (list 0 1 2 3 4 5 6)) ++ (delete-duplicates tester :key #'oddp :start 1 :end 6) @result{} (0 4 5 6) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{delete-duplicates} might destructively modify @i{sequence}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{Compiler Terminology}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++The @t{:test-not} @i{argument} is deprecated. ++ ++These functions are useful for converting @i{sequence} into a canonical ++form suitable for representing a set. ++ ++@c end of including dict-sequences ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-18.texi +@@ -0,0 +1,968 @@ ++ ++ ++@node Hash Tables, Filenames, Sequences, Top ++@chapter Hash Tables ++ ++@menu ++* Hash Table Concepts:: ++* Hash Tables Dictionary:: ++@end menu ++ ++@node Hash Table Concepts, Hash Tables Dictionary, Hash Tables, Hash Tables ++@section Hash Table Concepts ++ ++@c including concept-hash-tables ++ ++@menu ++* Hash-Table Operations:: ++* Modifying Hash Table Keys:: ++@end menu ++ ++@node Hash-Table Operations, Modifying Hash Table Keys, Hash Table Concepts, Hash Table Concepts ++@subsection Hash-Table Operations ++ ++Figure 18--1 lists some @i{defined names} that are applicable ++to @i{hash tables}. The following rules apply to @i{hash tables}. ++ ++@table @asis ++ ++@item -- ++A @i{hash table} can only associate one value with a given ++key. If an attempt is made to add a second value for a given key, ++the second value will replace the first. ++Thus, adding a value to a @i{hash table} is a destructive operation; ++the @i{hash table} is modified. ++ ++@item -- ++There are four kinds of @i{hash tables}: ++ those whose keys are compared with @b{eq}, ++ those whose keys are compared with @b{eql}, ++ those whose keys are compared with @b{equal}, and ++ ++ those whose keys are compared with @b{equalp}. ++ ++@item -- ++@i{Hash tables} are created by @b{make-hash-table}. ++@b{gethash} is used to look up a key and find the associated value. ++New entries are added to @i{hash tables} using @b{setf} with @b{gethash}. ++@b{remhash} is used to remove an entry. ++For example: ++ ++@example ++ (setq a (make-hash-table)) @result{} # ++ (setf (gethash 'color a) 'brown) @result{} BROWN ++ (setf (gethash 'name a) 'fred) @result{} FRED ++ (gethash 'color a) @result{} BROWN, @i{true} ++ (gethash 'name a) @result{} FRED, @i{true} ++ (gethash 'pointy a) @result{} NIL, @i{false} ++@end example ++ ++In this example, the symbols @t{color} and @t{name} are being used as ++keys, and the symbols @t{brown} and @t{fred} are being used as the ++associated values. The @i{hash table} ++has two items in it, one of which ++associates from @t{color} to @t{brown}, and the other of which ++associates from @t{name} to @t{fred}. ++ ++@item -- ++A key or a value may be any @i{object}. ++ ++@item -- ++The existence of an entry in the @i{hash table} can be determined ++from the @i{secondary value} returned by @b{gethash}. ++@end table ++ ++@format ++@group ++@noindent ++@w{ clrhash hash-table-p remhash } ++@w{ gethash make-hash-table sxhash } ++@w{ hash-table-count maphash } ++ ++@noindent ++@w{ Figure 18--1: Hash-table defined names } ++ ++@end group ++@end format ++ ++@node Modifying Hash Table Keys, , Hash-Table Operations, Hash Table Concepts ++@subsection Modifying Hash Table Keys ++ ++The function supplied as the @t{:test} argument to @b{make-hash-table} ++specifies the `equivalence test' for the @i{hash table} it creates. ++ ++An @i{object} is `visibly modified' with regard to an equivalence test ++if there exists some set of @i{objects} (or potential @i{objects}) ++which are equivalent to the @i{object} before the modification but are ++no longer equivalent afterwards. ++ ++If an @i{object} O_1 is used as a key in a @i{hash table} H ++and is then visibly modified with regard to the equivalence test of H, ++then the consequences are unspecified if O_1, or any @i{object} ++O_2 equivalent to O_1 under the equivalence test (either before ++or after the modification), is used as a key in further operations on H. ++The consequences of using O_1 as a key are unspecified ++even if O_1 is visibly modified ++and then later modified again in such a way as ++to undo the visible modification. ++ ++Following are specifications of the modifications which are visible to the ++equivalence tests which must be supported by @i{hash tables}. The modifications ++are described in terms of modification of components, and are defined ++recursively. Visible modifications of components of the @i{object} are ++visible modifications of the @i{object}. ++ ++@menu ++* Visible Modification of Objects with respect to EQ and EQL:: ++* Visible Modification of Objects with respect to EQUAL:: ++* Visible Modification of Conses with respect to EQUAL:: ++* Visible Modification of Bit Vectors and Strings with respect to EQUAL:: ++* Visible Modification of Objects with respect to EQUALP:: ++* Visible Modification of Structures with respect to EQUALP:: ++* Visible Modification of Arrays with respect to EQUALP:: ++* Visible Modification of Hash Tables with respect to EQUALP:: ++* Visible Modifications by Language Extensions:: ++@end menu ++ ++@node Visible Modification of Objects with respect to EQ and EQL, Visible Modification of Objects with respect to EQUAL, Modifying Hash Table Keys, Modifying Hash Table Keys ++@subsubsection Visible Modification of Objects with respect to EQ and EQL ++ ++No @i{standardized} @i{function} is provided that is capable of visibly ++modifying an @i{object} with regard to @b{eq} or @b{eql}. ++ ++@node Visible Modification of Objects with respect to EQUAL, Visible Modification of Conses with respect to EQUAL, Visible Modification of Objects with respect to EQ and EQL, Modifying Hash Table Keys ++@subsubsection Visible Modification of Objects with respect to EQUAL ++ ++As a consequence of the behavior for @b{equal}, ++the rules for visible modification of @i{objects} not explicitly mentioned in this ++section are inherited from those in @ref{Visible Modification of Objects with respect to EQ and EQL}. ++ ++@node Visible Modification of Conses with respect to EQUAL, Visible Modification of Bit Vectors and Strings with respect to EQUAL, Visible Modification of Objects with respect to EQUAL, Modifying Hash Table Keys ++@subsubsection Visible Modification of Conses with respect to EQUAL ++ ++Any visible change to the @i{car} or the @i{cdr} of a @i{cons} ++is considered a visible modification with regard to @b{equal}. ++ ++@node Visible Modification of Bit Vectors and Strings with respect to EQUAL, Visible Modification of Objects with respect to EQUALP, Visible Modification of Conses with respect to EQUAL, Modifying Hash Table Keys ++@subsubsection Visible Modification of Bit Vectors and Strings with respect to EQUAL ++ ++For a @i{vector} of @i{type} @b{bit-vector} or of @i{type} @b{string}, any visible change ++ to an @i{active} @i{element} of the @i{vector}, ++ or to the @i{length} of the @i{vector} (if it is @i{actually adjustable} ++ or has a @i{fill pointer}) ++is considered a visible modification with regard to @b{equal}. ++ ++@node Visible Modification of Objects with respect to EQUALP, Visible Modification of Structures with respect to EQUALP, Visible Modification of Bit Vectors and Strings with respect to EQUAL, Modifying Hash Table Keys ++@subsubsection Visible Modification of Objects with respect to EQUALP ++ ++As a consequence of the behavior for @b{equalp}, ++the rules for visible modification of @i{objects} not explicitly mentioned in this ++section are inherited from those in @ref{Visible Modification of Objects with respect to EQUAL}. ++ ++@node Visible Modification of Structures with respect to EQUALP, Visible Modification of Arrays with respect to EQUALP, Visible Modification of Objects with respect to EQUALP, Modifying Hash Table Keys ++@subsubsection Visible Modification of Structures with respect to EQUALP ++ ++Any visible change to a @i{slot} of a @i{structure} ++is considered a visible modification with regard to @b{equalp}. ++ ++@node Visible Modification of Arrays with respect to EQUALP, Visible Modification of Hash Tables with respect to EQUALP, Visible Modification of Structures with respect to EQUALP, Modifying Hash Table Keys ++@subsubsection Visible Modification of Arrays with respect to EQUALP ++ ++In an @i{array}, any visible change ++ to an @i{active} @i{element}, ++ to the @i{fill pointer} (if the @i{array} can and does have one), ++ or to the @i{dimensions} (if the @i{array} is @i{actually adjustable}) ++is considered a visible modification with regard to @b{equalp}. ++ ++@node Visible Modification of Hash Tables with respect to EQUALP, Visible Modifications by Language Extensions, Visible Modification of Arrays with respect to EQUALP, Modifying Hash Table Keys ++@subsubsection Visible Modification of Hash Tables with respect to EQUALP ++ ++In a @i{hash table}, any visible change ++ to the count of entries in the @i{hash table}, ++ to the keys, ++ or to the values associated with the keys ++is considered a visible modification with regard to @b{equalp}. ++ ++Note that the visibility of modifications to the keys depends on the equivalence test ++of the @i{hash table}, not on the specification of @b{equalp}. ++ ++@node Visible Modifications by Language Extensions, , Visible Modification of Hash Tables with respect to EQUALP, Modifying Hash Table Keys ++@subsubsection Visible Modifications by Language Extensions ++ ++@i{Implementations} that extend the language by providing additional mutator ++functions (or additional behavior for existing mutator functions) must ++document how the use of these extensions interacts with equivalence tests and ++@i{hash table} searches. ++ ++@i{Implementations} that extend the language by defining additional acceptable ++equivalence tests for @i{hash tables} (allowing additional values for the @t{:test} ++argument to @b{make-hash-table}) must document the visible components of these ++tests. ++ ++@c end of including concept-hash-tables ++ ++@node Hash Tables Dictionary, , Hash Table Concepts, Hash Tables ++@section Hash Tables Dictionary ++ ++@c including dict-hash-tables ++ ++@menu ++* hash-table:: ++* make-hash-table:: ++* hash-table-p:: ++* hash-table-count:: ++* hash-table-rehash-size:: ++* hash-table-rehash-threshold:: ++* hash-table-size:: ++* hash-table-test:: ++* gethash:: ++* remhash:: ++* maphash:: ++* with-hash-table-iterator:: ++* clrhash:: ++* sxhash:: ++@end menu ++ ++@node hash-table, make-hash-table, Hash Tables Dictionary, Hash Tables Dictionary ++@subsection hash-table [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{hash-table}, ++@b{t} ++ ++@subsubheading Description:: ++ ++@i{Hash tables} provide a way of mapping any @i{object} (a @i{key}) ++to an associated @i{object} (a @i{value}). ++ ++@subsubheading See Also:: ++ ++@ref{Hash Table Concepts}, ++@ref{Printing Other Objects} ++ ++@subsubheading Notes:: ++ ++The intent is that this mapping be implemented by a hashing mechanism, ++such as that described in Section 6.4 ``Hashing'' of @b{The Art of Computer Programming, Volume 3} ++(pp506-549). In spite of this intent, no @i{conforming implementation} ++is required to use any particular technique to implement the mapping. ++ ++@node make-hash-table, hash-table-p, hash-table, Hash Tables Dictionary ++@subsection make-hash-table [Function] ++ ++@code{make-hash-table} @i{@r{&key} test size rehash-size rehash-threshold} @result{} @i{hash-table} ++ ++@subsubheading Arguments and Values:: ++ ++@i{test}---a @i{designator} for one of the @i{functions} ++ @b{eq}, ++ @b{eql}, ++ @b{equal}, or ++ ++ @b{equalp}. ++ ++ The default is @b{eql}. ++ ++@i{size}---a non-negative @i{integer}. ++ ++ The default is @i{implementation-dependent}. ++ ++@i{rehash-size}---a @i{real} of @i{type} @t{(or (integer 1 *) (float (1.0) *))}. ++ The default is @i{implementation-dependent}. ++ ++@i{rehash-threshold}---a @i{real} of @i{type} @t{(real 0 1)}. ++ The default is @i{implementation-dependent}. ++ ++@i{hash-table}---a @i{hash table}. ++ ++@subsubheading Description:: ++ ++Creates and returns a new @i{hash table}. ++ ++@i{test} determines how @i{keys} are compared. ++An @i{object} is said to be present in the @i{hash-table} ++if that @i{object} is the @i{same} under the @i{test} ++as the @i{key} for some entry in the @i{hash-table}. ++ ++@i{size} is a hint to the @i{implementation} about how much initial space ++to allocate in the @i{hash-table}. ++ ++This information, taken together with the @i{rehash-threshold}, controls ++the approximate number of entries which it should be possible ++to insert before the table has to grow. ++ ++The actual size might be rounded up from @i{size} to the next `good' size; ++for example, some @i{implementations} might round to the next prime number. ++ ++@i{rehash-size} specifies a minimum amount to increase the size of the ++@i{hash-table} when it becomes full ++enough to require rehashing; ++see @i{rehash-theshold} below. ++ ++If @i{rehash-size} is an @i{integer}, ++the expected growth rate for the table is additive and ++the @i{integer} is the number of entries to add; ++if it is a @i{float}, ++the expected growth rate for the table is multiplicative and ++the @i{float} is the ratio of the new size to the old size. ++ ++As with @i{size}, the actual size of the increase might be rounded up. ++ ++@i{rehash-threshold} specifies how full the @i{hash-table} can get ++before it must grow. ++ ++It specifies the maximum desired hash-table occupancy level. ++ ++The @i{values} of @i{rehash-size} and @i{rehash-threshold} do not constrain the ++@i{implementation} to use any particular method for computing when and by how much ++the size of @i{hash-table} should be enlarged. Such decisions are ++@i{implementation-dependent}, and these @i{values} only hints ++from the @i{programmer} to the @i{implementation}, and the @i{implementation} ++is permitted to ignore them. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table)) @result{} # ++ (setf (gethash "one" table) 1) @result{} 1 ++ (gethash "one" table) @result{} NIL, @i{false} ++ (setq table (make-hash-table :test 'equal)) @result{} # ++ (setf (gethash "one" table) 1) @result{} 1 ++ (gethash "one" table) @result{} 1, T ++ (make-hash-table :rehash-size 1.5 :rehash-threshold 0.7) ++@result{} # ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{gethash} ++, ++@b{hash-table} ++ ++@node hash-table-p, hash-table-count, make-hash-table, Hash Tables Dictionary ++@subsection hash-table-p [Function] ++ ++@code{hash-table-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{hash-table}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table)) @result{} # ++ (hash-table-p table) @result{} @i{true} ++ (hash-table-p 37) @result{} @i{false} ++ (hash-table-p '((a . 1) (b . 2))) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (hash-table-p @i{object}) @equiv{} (typep @i{object} 'hash-table) ++@end example ++ ++@node hash-table-count, hash-table-rehash-size, hash-table-p, Hash Tables Dictionary ++@subsection hash-table-count [Function] ++ ++@code{hash-table-count} @i{hash-table} @result{} @i{count} ++ ++@subsubheading Arguments and Values:: ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{count}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the number of entries in the @i{hash-table}. ++If @i{hash-table} has just been created ++or newly cleared (see @b{clrhash}) ++the entry count is @t{0}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table)) @result{} # ++ (hash-table-count table) @result{} 0 ++ (setf (gethash 57 table) "fifty-seven") @result{} "fifty-seven" ++ (hash-table-count table) @result{} 1 ++ (dotimes (i 100) (setf (gethash i table) i)) @result{} NIL ++ (hash-table-count table) @result{} 100 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{clrhash}, ++@b{remhash}, ++@b{setf} of @b{gethash} ++ ++@subsubheading See Also:: ++ ++@ref{hash-table-size} ++ ++@subsubheading Notes:: ++ ++The following relationships are functionally correct, although in practice ++using @b{hash-table-count} is probably much faster: ++ ++@example ++ (hash-table-count @i{table}) @equiv{} ++ (loop for value being the hash-values of @i{table} count t) @equiv{} ++ (let ((total 0)) ++ (maphash #'(lambda (key value) ++ (declare (ignore key value)) ++ (incf total)) ++ @i{table}) ++ total) ++@end example ++ ++@node hash-table-rehash-size, hash-table-rehash-threshold, hash-table-count, Hash Tables Dictionary ++@subsection hash-table-rehash-size [Function] ++ ++@code{hash-table-rehash-size} @i{hash-table} @result{} @i{rehash-size} ++ ++@subsubheading Arguments and Values:: ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{rehash-size}---a @i{real} of @i{type} @t{(or (integer 1 *) (float (1.0) *))}. ++ ++@subsubheading Description:: ++ ++Returns the current rehash size of @i{hash-table}, ++suitable for use in a call to @b{make-hash-table} ++in order to produce a @i{hash table} ++with state corresponding to the current state of the @i{hash-table}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table :size 100 :rehash-size 1.4)) ++@result{} # ++ (hash-table-rehash-size table) @result{} 1.4 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{hash-table} is not a @i{hash table}. ++ ++@subsubheading See Also:: ++ ++@ref{make-hash-table} ++, ++@ref{hash-table-rehash-threshold} ++ ++@subsubheading Notes:: ++ ++If the hash table was created with an @i{integer} rehash size, ++the result is an @i{integer}, ++indicating that the rate of growth of the @i{hash-table} when rehashed ++is intended to be additive; ++otherwise, ++the result is a @i{float}, ++indicating that the rate of growth of the @i{hash-table} when rehashed ++is intended to be multiplicative. ++However, this value is only advice to the @i{implementation}; ++the actual amount by which the @i{hash-table} will grow upon rehash is ++@i{implementation-dependent}. ++ ++@node hash-table-rehash-threshold, hash-table-size, hash-table-rehash-size, Hash Tables Dictionary ++@subsection hash-table-rehash-threshold [Function] ++ ++@code{hash-table-rehash-threshold} @i{hash-table} @result{} @i{rehash-threshold} ++ ++@subsubheading Arguments and Values:: ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{rehash-threshold}---a @i{real} of @i{type} @t{(real 0 1)}. ++ ++@subsubheading Description:: ++ ++Returns the current rehash threshold of @i{hash-table}, which is ++suitable for use in a call to @b{make-hash-table} in order to ++produce a @i{hash table} with state corresponding to the current ++state of the @i{hash-table}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table :size 100 :rehash-threshold 0.5)) ++@result{} # ++ (hash-table-rehash-threshold table) @result{} 0.5 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{hash-table} is not a @i{hash table}. ++ ++@subsubheading See Also:: ++ ++@ref{make-hash-table} ++, ++@ref{hash-table-rehash-size} ++ ++@node hash-table-size, hash-table-test, hash-table-rehash-threshold, Hash Tables Dictionary ++@subsection hash-table-size [Function] ++ ++@code{hash-table-size} @i{hash-table} @result{} @i{size} ++ ++@subsubheading Arguments and Values:: ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{size}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns the current size of @i{hash-table}, which is suitable for use in ++a call to @b{make-hash-table} in order to produce a @i{hash table} ++with state corresponding to the current state of the @i{hash-table}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{hash-table} is not a @i{hash table}. ++ ++@subsubheading See Also:: ++ ++@ref{hash-table-count} ++, ++@ref{make-hash-table} ++ ++@node hash-table-test, gethash, hash-table-size, Hash Tables Dictionary ++@subsection hash-table-test [Function] ++ ++@code{hash-table-test} @i{hash-table} @result{} @i{test} ++ ++@subsubheading Arguments and Values:: ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{test}---a @i{function designator}. ++ For the four @i{standardized} @i{hash table} test @i{functions} ++ (see @b{make-hash-table}), the @i{test} value returned ++ is always a @i{symbol}. If an @i{implementation} permits additional ++ tests, it is @i{implementation-dependent} whether such tests are ++ returned as @i{function} @i{objects} or @i{function names}. ++ ++@subsubheading Description:: ++ ++Returns the test used for comparing @i{keys} in @i{hash-table}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{hash-table} is not a @i{hash table}. ++ ++@subsubheading See Also:: ++ ++@ref{make-hash-table} ++ ++@node gethash, remhash, hash-table-test, Hash Tables Dictionary ++@subsection gethash [Accessor] ++ ++@code{gethash} @i{key hash-table @r{&optional} default} @result{} @i{value, present-p} ++ ++(setf (@code{ gethash} @i{key hash-table @r{&optional} default}) new-value)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{key}---an @i{object}. ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{default}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{value}---an @i{object}. ++ ++@i{present-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@i{Value} is the @i{object} in @i{hash-table} whose @i{key} ++is the @i{same} as @i{key} under the @i{hash-table}'s equivalence test. ++If there is no such entry, @i{value} is the @i{default}. ++ ++@i{Present-p} is @i{true} if an entry is found; otherwise, it is @i{false}. ++ ++@b{setf} may be used with @b{gethash} to modify the @i{value} ++associated with a given @i{key}, or to add a new entry. ++ ++When a @b{gethash} @i{form} is used as a @b{setf} @i{place}, ++any @i{default} which is supplied is evaluated according to normal ++left-to-right evaluation rules, but its @i{value} is ignored. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table)) @result{} # ++ (gethash 1 table) @result{} NIL, @i{false} ++ (gethash 1 table 2) @result{} 2, @i{false} ++ (setf (gethash 1 table) "one") @result{} "one" ++ (setf (gethash 2 table "two") "two") @result{} "two" ++ (gethash 1 table) @result{} "one", @i{true} ++ (gethash 2 table) @result{} "two", @i{true} ++ (gethash nil table) @result{} NIL, @i{false} ++ (setf (gethash nil table) nil) @result{} NIL ++ (gethash nil table) @result{} NIL, @i{true} ++ (defvar *counters* (make-hash-table)) @result{} *COUNTERS* ++ (gethash 'foo *counters*) @result{} NIL, @i{false} ++ (gethash 'foo *counters* 0) @result{} 0, @i{false} ++ (defmacro how-many (obj) `(values (gethash ,obj *counters* 0))) @result{} HOW-MANY ++ (defun count-it (obj) (incf (how-many obj))) @result{} COUNT-IT ++ (dolist (x '(bar foo foo bar bar baz)) (count-it x)) ++ (how-many 'foo) @result{} 2 ++ (how-many 'bar) @result{} 3 ++ (how-many 'quux) @result{} 0 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{remhash} ++ ++@subsubheading Notes:: ++ ++The @i{secondary value}, @i{present-p}, ++can be used to distinguish the absence of an entry ++from the presence of an entry that has a value of @i{default}. ++ ++@node remhash, maphash, gethash, Hash Tables Dictionary ++@subsection remhash [Function] ++ ++@code{remhash} @i{key hash-table} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{key}---an @i{object}. ++ ++@i{hash-table}---a @i{hash table}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Removes the entry for @i{key} in @i{hash-table}, if any. ++Returns @i{true} if there was such an entry, or @i{false} otherwise. ++ ++@subsubheading Examples:: ++@example ++ (setq table (make-hash-table)) @result{} # ++ (setf (gethash 100 table) "C") @result{} "C" ++ (gethash 100 table) @result{} "C", @i{true} ++ (remhash 100 table) @result{} @i{true} ++ (gethash 100 table) @result{} NIL, @i{false} ++ (remhash 100 table) @result{} @i{false} ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{hash-table} is modified. ++ ++@node maphash, with-hash-table-iterator, remhash, Hash Tables Dictionary ++@subsection maphash [Function] ++ ++@code{maphash} @i{function hash-table} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{designator} for a @i{function} of two @i{arguments}, ++ the @i{key} and the @i{value}. ++ ++@i{hash-table}---a @i{hash table}. ++ ++@subsubheading Description:: ++ ++Iterates over all entries in the @i{hash-table}. For each entry, ++the @i{function} is called with two @i{arguments}--the @i{key} ++and the @i{value} of that entry. ++ ++The consequences are unspecified if any attempt is made to add or remove ++an entry from the @i{hash-table} while a @b{maphash} is in progress, ++with two exceptions: ++ the @i{function} can use can use @b{setf} of @b{gethash} ++ to change the @i{value} part of the entry currently being processed, ++or it can use @b{remhash} to remove that entry. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table)) @result{} # ++ (dotimes (i 10) (setf (gethash i table) i)) @result{} NIL ++ (let ((sum-of-squares 0)) ++ (maphash #'(lambda (key val) ++ (let ((square (* val val))) ++ (incf sum-of-squares square) ++ (setf (gethash key table) square))) ++ table) ++ sum-of-squares) @result{} 285 ++ (hash-table-count table) @result{} 10 ++ (maphash #'(lambda (key val) ++ (when (oddp val) (remhash key table))) ++ table) @result{} NIL ++ (hash-table-count table) @result{} 5 ++ (maphash #'(lambda (k v) (print (list k v))) table) ++(0 0) ++(8 64) ++(2 4) ++(6 36) ++(4 16) ++@result{} NIL ++@end example ++ ++@subsubheading Side Effects:: ++ ++None, other than any which might be done by the @i{function}. ++ ++@subsubheading See Also:: ++ ++@ref{loop} ++, ++@ref{with-hash-table-iterator} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node with-hash-table-iterator, clrhash, maphash, Hash Tables Dictionary ++@subsection with-hash-table-iterator [Macro] ++ ++@code{with-hash-table-iterator} @i{@r{(}name hash-table@r{)} ++ @{@i{declaration}@}* @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a name suitable for the first argument to @b{macrolet}. ++ ++@i{hash-table}---a @i{form}, evaluated once, that should produce a @i{hash table}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by @i{forms}. ++ ++@subsubheading Description:: ++ ++Within the lexical scope of the body, @i{name} is defined via @b{macrolet} ++such that successive invocations of @t{(@i{name})} return the items, ++one by one, from the @i{hash table} that is obtained by evaluating ++@i{hash-table} only once. ++ ++An invocation @t{(@i{name})} returns three values as follows: ++ ++@table @asis ++ ++@item 1. ++A @i{generalized boolean} that is @i{true} if an entry is returned. ++@item 2. ++The key from the @i{hash-table} entry. ++@item 3. ++The value from the @i{hash-table} entry. ++@end table ++ ++After all entries have been returned by successive invocations of ++@t{(@i{name})}, then only one value is returned, namely @b{nil}. ++ ++It is unspecified what happens if any of the implicit interior state ++of an iteration is returned outside the dynamic extent of the ++@b{with-hash-table-iterator} @i{form} ++such as by returning some @i{closure} over the invocation @i{form}. ++ ++Any number of invocations of @b{with-hash-table-iterator} ++can be nested, and the body of the innermost one can invoke all of the ++locally @i{established} @i{macros}, provided all of those @i{macros} ++have @i{distinct} names. ++ ++@subsubheading Examples:: ++ ++The following function should return @b{t} on any ++@i{hash table}, and signal ++an error if the usage of @b{with-hash-table-iterator} does not agree ++with the corresponding usage of @b{maphash}. ++ ++@example ++ (defun test-hash-table-iterator (hash-table) ++ (let ((all-entries '()) ++ (generated-entries '()) ++ (unique (list nil))) ++ (maphash #'(lambda (key value) (push (list key value) all-entries)) ++ hash-table) ++ (with-hash-table-iterator (generator-fn hash-table) ++ (loop ++ (multiple-value-bind (more? key value) (generator-fn) ++ (unless more? (return)) ++ (unless (eql value (gethash key hash-table unique)) ++ (error "Key ~S not found for value ~S" key value)) ++ (push (list key value) generated-entries)))) ++ (unless (= (length all-entries) ++ (length generated-entries) ++ (length (union all-entries generated-entries ++ :key #'car :test (hash-table-test hash-table)))) ++ (error "Generated entries and Maphash entries don't correspond")) ++ t)) ++@end example ++ ++The following could be an acceptable definition of ++@b{maphash}, implemented by @b{with-hash-table-iterator}. ++ ++@example ++ (defun maphash (function hash-table) ++ (with-hash-table-iterator (next-entry hash-table) ++ (loop (multiple-value-bind (more key value) (next-entry) ++ (unless more (return nil)) ++ (funcall function key value))))) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if the local function named @i{name} ++@i{established} by @b{with-hash-table-iterator} is called after it has ++returned @i{false} as its @i{primary value}. ++ ++@subsubheading See Also:: ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node clrhash, sxhash, with-hash-table-iterator, Hash Tables Dictionary ++@subsection clrhash [Function] ++ ++@code{clrhash} @i{hash-table} @result{} @i{hash-table} ++ ++@subsubheading Arguments and Values:: ++ ++@i{hash-table}---a @i{hash table}. ++ ++@subsubheading Description:: ++ ++Removes all entries from @i{hash-table}, ++and then returns that empty @i{hash table}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq table (make-hash-table)) @result{} # ++ (dotimes (i 100) (setf (gethash i table) (format nil "~R" i))) @result{} NIL ++ (hash-table-count table) @result{} 100 ++ (gethash 57 table) @result{} "fifty-seven", @i{true} ++ (clrhash table) @result{} # ++ (hash-table-count table) @result{} 0 ++ (gethash 57 table) @result{} NIL, @i{false} ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{hash-table} is modified. ++ ++@node sxhash, , clrhash, Hash Tables Dictionary ++@subsection sxhash [Function] ++ ++@code{sxhash} @i{object} @result{} @i{hash-code} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{hash-code}---a non-negative @i{fixnum}. ++ ++@subsubheading Description:: ++ ++@b{sxhash} returns a hash code for @i{object}. ++ ++The manner in which the hash code is computed is @i{implementation-dependent}, ++but subject to certain constraints: ++ ++@table @asis ++ ++@item 1. ++@t{(equal @i{x} @i{y})} implies @t{(= (sxhash @i{x}) (sxhash @i{y}))}. ++ ++@item 2. ++For any two @i{objects}, @i{x} and @i{y}, ++ both of which are ++ @i{bit vectors}, ++ @i{characters}, ++ @i{conses}, ++ @i{numbers}, ++ @i{pathnames}, ++ @i{strings}, ++ or @i{symbols}, ++ and which are @i{similar}, ++ @t{(sxhash @i{x})} and @t{(sxhash @i{y})} ++ @i{yield} the same mathematical value ++ even if @i{x} and @i{y} exist in different @i{Lisp images} of ++ the same @i{implementation}. ++ See @ref{Literal Objects in Compiled Files}. ++ ++@item 3. ++The @i{hash-code} for an @i{object} is always the @i{same} ++ within a single @i{session} provided that the @i{object} is not ++ visibly modified with regard to the equivalence test @b{equal}. ++ See @ref{Modifying Hash Table Keys}. ++ ++@item 4. ++The @i{hash-code} is intended for hashing. This places no verifiable ++ constraint on a @i{conforming implementation}, but the intent is that ++ an @i{implementation} should make a good-faith effort to produce ++ @i{hash-codes} that are well distributed within the range of ++ non-negative @i{fixnums}. ++ ++@item 5. ++Computation of the @i{hash-code} must terminate, ++ even if the @i{object} contains circularities. ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (= (sxhash (list 'list "ab")) (sxhash (list 'list "ab"))) @result{} @i{true} ++ (= (sxhash "a") (sxhash (make-string 1 :initial-element #\a))) @result{} @i{true} ++ (let ((r (make-random-state))) ++ (= (sxhash r) (sxhash (make-random-state r)))) ++@result{} @i{implementation-dependent} ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@subsubheading Notes:: ++ ++Many common hashing needs are satisfied by @b{make-hash-table} and the ++related functions on @i{hash tables}. @b{sxhash} is intended for use ++where the pre-defined abstractions are insufficient. Its main intent is to ++allow the user a convenient means of implementing more complicated hashing ++paradigms than are provided through @i{hash tables}. ++ ++The hash codes returned by @b{sxhash} are not necessarily related to ++any hashing strategy used by any other @i{function} in @r{Common Lisp}. ++ ++For @i{objects} of @i{types} that @b{equal} compares ++with @b{eq}, item 3 requires that the @i{hash-code} be ++based on some immutable quality of the identity of the object. ++Another legitimate implementation technique would be to have ++@b{sxhash} assign (and cache) a random hash code for these ++@i{objects}, since there is no requirement that @i{similar} but ++non-@b{eq} objects have the same hash code. ++ ++Although @i{similarity} is defined for @i{symbols} in terms ++of both the @i{symbol}'s @i{name} and the @i{packages} in which ++the @i{symbol} is @i{accessible}, item 3 disallows using @i{package} ++information to compute the hash code, since changes to the package status ++of a symbol are not visible to @i{equal}. ++ ++@c end of including dict-hash-tables ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-19.texi +@@ -0,0 +1,2456 @@ ++ ++ ++@node Filenames, Files, Hash Tables, Top ++@chapter Filenames ++ ++@menu ++* Overview of Filenames:: ++* Pathnames:: ++* Logical Pathnames:: ++* Filenames Dictionary:: ++@end menu ++ ++@node Overview of Filenames, Pathnames, Filenames, Filenames ++@section Overview of Filenames ++ ++@c including concept-filenames ++ ++There are many kinds of @i{file systems}, ++varying widely both in their superficial syntactic details, ++ and in their underlying power and structure. ++The facilities provided by @r{Common Lisp} for referring to and manipulating @i{files} ++has been chosen to be compatible with many kinds of @i{file systems}, ++while at the same time minimizing the program-visible differences ++between kinds of @i{file systems}. ++ ++Since @i{file systems} vary in their conventions for naming @i{files}, ++there are two distinct ways to represent @i{filenames}: ++as @i{namestrings} and as @i{pathnames}. ++ ++@menu ++* Namestrings as Filenames:: ++* Pathnames as Filenames:: ++* Parsing Namestrings Into Pathnames:: ++@end menu ++ ++@node Namestrings as Filenames, Pathnames as Filenames, Overview of Filenames, Overview of Filenames ++@subsection Namestrings as Filenames ++ ++A @i{namestring} ++@IGindex namestring ++ is a @i{string} that represents a @i{filename}. ++ ++In general, the syntax of @i{namestrings} involves the use of ++@i{implementation-defined} conventions, ++usually those customary for the @i{file system} in which the named @i{file} resides. ++The only exception is the syntax of a @i{logical pathname} @i{namestring}, ++which is defined in this specification; see @ref{Syntax of Logical Pathname Namestrings}. ++ ++A @i{conforming program} must never unconditionally use a ++@i{literal} @i{namestring} other than a @i{logical pathname} @i{namestring} ++because @r{Common Lisp} does not define any @i{namestring} syntax ++other than that for @i{logical pathnames} ++that would be guaranteed to be portable. ++However, a @i{conforming program} can, if it is careful, ++successfully manipulate user-supplied data ++which contains or refers to non-portable @i{namestrings}. ++ ++A @i{namestring} can be @i{coerced} to a @i{pathname} by the @i{functions} @b{pathname} ++or @b{parse-namestring}. ++ ++@node Pathnames as Filenames, Parsing Namestrings Into Pathnames, Namestrings as Filenames, Overview of Filenames ++@subsection Pathnames as Filenames ++ ++@i{Pathnames} ++@IGindex pathname ++ are structured @i{objects} that can represent, ++in an @i{implementation-independent} way, ++the @i{filenames} that are used natively by an underlying @i{file system}. ++ ++In addition, @i{pathnames} can also represent certain partially composed ++@i{filenames} for which an underlying @i{file system} ++might not have a specific @i{namestring} representation. ++ ++A @i{pathname} need not correspond to any file that actually exists, ++and more than one @i{pathname} can refer to the same file. ++For example, the @i{pathname} with a version of @t{:newest} ++might refer to the same file as a @i{pathname} ++with the same components except a certain number as the version. ++Indeed, a @i{pathname} with version @t{:newest} might refer to ++different files as time passes, because the meaning of such a @i{pathname} ++depends on the state of the file system. ++ ++Some @i{file systems} naturally use a structural model for their ++@i{filenames}, while others do not. Within the @r{Common Lisp} @i{pathname} model, ++all @i{filenames} are seen as having a particular structure, ++even if that structure is not reflected in the underlying @i{file system}. ++The nature of the mapping between structure imposed by @i{pathnames} ++and the structure, if any, that is used by the underlying @i{file system} ++is @i{implementation-defined}. ++ ++Every @i{pathname} has six components: ++ a host, ++ a device, ++ a directory, ++ a name, ++ a type, ++ and a version. ++By naming @i{files} with @i{pathnames}, ++@r{Common Lisp} programs can work in essentially the same way even in @i{file systems} ++that seem superficially quite different. ++For a detailed description of these components, see @ref{Pathname Components}. ++ ++The mapping of the @i{pathname} components into the concepts peculiar to ++each @i{file system} is @i{implementation-defined}. ++There exist conceivable @i{pathnames} ++for which there is no mapping to a syntactically valid @i{filename} ++in a particular @i{implementation}. ++An @i{implementation} may use various strategies in an attempt to find a mapping; ++for example, ++an @i{implementation} may quietly truncate @i{filenames} ++that exceed length limitations imposed by the underlying @i{file system}, ++or ignore certain @i{pathname} components ++for which the @i{file system} provides no support. ++If such a mapping cannot be found, ++an error of @i{type} @b{file-error} is signaled. ++ ++The time at which this mapping and associated error signaling ++occurs is @i{implementation-dependent}. ++Specifically, it may occur ++ at the time the @i{pathname} is constructed, ++ when coercing a @i{pathname} to a @i{namestring}, ++ or when an attempt is made to @i{open} or otherwise access the @i{file} ++ designated by the @i{pathname}. ++ ++Figure 19--1 lists some @i{defined names} that are applicable to @i{pathnames}. ++ ++@format ++@group ++@noindent ++@w{ *default-pathname-defaults* namestring pathname-name } ++@w{ directory-namestring open pathname-type } ++@w{ enough-namestring parse-namestring pathname-version } ++@w{ file-namestring pathname pathnamep } ++@w{ file-string-length pathname-device translate-pathname } ++@w{ host-namestring pathname-directory truename } ++@w{ make-pathname pathname-host user-homedir-pathname } ++@w{ merge-pathnames pathname-match-p wild-pathname-p } ++ ++@noindent ++@w{ Figure 19--1: Pathname Operations } ++ ++@end group ++@end format ++ ++@node Parsing Namestrings Into Pathnames, , Pathnames as Filenames, Overview of Filenames ++@subsection Parsing Namestrings Into Pathnames ++ ++Parsing is the operation used to convert a @i{namestring} into a @i{pathname}. ++ ++Except in the case of parsing @i{logical pathname} @i{namestrings}, ++ ++this operation is @i{implementation-dependent}, ++because the format of @i{namestrings} is @i{implementation-dependent}. ++ ++A @i{conforming implementation} is free to accommodate other @i{file system} ++features in its @i{pathname} representation and provides a parser that can process ++such specifications in @i{namestrings}. ++@i{Conforming programs} must not depend on any such features, ++since those features will not be portable. ++ ++@c end of including concept-filenames ++ ++@node Pathnames, Logical Pathnames, Overview of Filenames, Filenames ++@section Pathnames ++ ++@c including concept-pathnames ++ ++@menu ++* Pathname Components:: ++* Interpreting Pathname Component Values:: ++* Merging Pathnames:: ++@end menu ++ ++@node Pathname Components, Interpreting Pathname Component Values, Pathnames, Pathnames ++@subsection Pathname Components ++ ++A @i{pathname} has six components: ++ a host, ++ a device, ++ a directory, ++ a name, ++ a type, ++ and a version. ++ ++@menu ++* The Pathname Host Component:: ++* The Pathname Device Component:: ++* The Pathname Directory Component:: ++* The Pathname Name Component:: ++* The Pathname Type Component:: ++* The Pathname Version Component:: ++@end menu ++ ++@node The Pathname Host Component, The Pathname Device Component, Pathname Components, Pathname Components ++@subsubsection The Pathname Host Component ++ ++The name of the file system on which the file resides, ++or the name of a @i{logical host}. ++ ++@node The Pathname Device Component, The Pathname Directory Component, The Pathname Host Component, Pathname Components ++@subsubsection The Pathname Device Component ++ ++Corresponds to the ``device'' or ``file structure'' concept in many ++host file systems: the name of a logical or physical device containing files. ++ ++@node The Pathname Directory Component, The Pathname Name Component, The Pathname Device Component, Pathname Components ++@subsubsection The Pathname Directory Component ++ ++Corresponds to the ``directory'' concept in many host file systems: ++the name of a group of related files. ++ ++@node The Pathname Name Component, The Pathname Type Component, The Pathname Directory Component, Pathname Components ++@subsubsection The Pathname Name Component ++ ++The ``name'' part of a group of @i{files} that can be thought of ++as conceptually related. ++ ++@node The Pathname Type Component, The Pathname Version Component, The Pathname Name Component, Pathname Components ++@subsubsection The Pathname Type Component ++ ++Corresponds to the ``filetype'' or ``extension'' concept in many host ++file systems. This says what kind of file this is. ++This component is always a @i{string}, @b{nil}, @t{:wild}, or @t{:unspecific}. ++ ++@node The Pathname Version Component, , The Pathname Type Component, Pathname Components ++@subsubsection The Pathname Version Component ++ ++Corresponds to the ``version number'' concept in many host file systems. ++ ++The version is either a positive @i{integer} ++or a @i{symbol} from the following list: ++@b{nil}, @t{:wild}, @t{:unspecific}, or @t{:newest} ++(refers to the largest version number that already exists in ++the file system when reading a file, or to ++a version number ++greater than any already existing in the file system ++when writing a new file). Implementations ++can define other special version @i{symbols}. ++ ++@node Interpreting Pathname Component Values, Merging Pathnames, Pathname Components, Pathnames ++@subsection Interpreting Pathname Component Values ++ ++@menu ++* Strings in Component Values:: ++* Special Characters in Pathname Components:: ++* Case in Pathname Components:: ++* Local Case in Pathname Components:: ++* Common Case in Pathname Components:: ++* Special Pathname Component Values:: ++* NIL as a Component Value:: ++* ->WILD as a Component Value:: ++* ->UNSPECIFIC as a Component Value:: ++* Relation between component values NIL and ->UNSPECIFIC:: ++* Restrictions on Wildcard Pathnames:: ++* Restrictions on Examining Pathname Components:: ++* Restrictions on Examining a Pathname Host Component:: ++* Restrictions on Examining a Pathname Device Component:: ++* Restrictions on Examining a Pathname Directory Component:: ++* Directory Components in Non-Hierarchical File Systems:: ++* Restrictions on Examining a Pathname Name Component:: ++* Restrictions on Examining a Pathname Type Component:: ++* Restrictions on Examining a Pathname Version Component:: ++* Notes about the Pathname Version Component:: ++* Restrictions on Constructing Pathnames:: ++@end menu ++ ++@node Strings in Component Values, Special Characters in Pathname Components, Interpreting Pathname Component Values, Interpreting Pathname Component Values ++@subsubsection Strings in Component Values ++ ++@node Special Characters in Pathname Components, Case in Pathname Components, Strings in Component Values, Interpreting Pathname Component Values ++@subsubsection Special Characters in Pathname Components ++ ++@i{Strings} in @i{pathname} component values ++never contain special @i{characters} that represent ++separation between @i{pathname} fields, ++such as @i{slash} in @r{Unix} @i{filenames}. ++Whether separator @i{characters} are permitted as ++part of a @i{string} in a @i{pathname} component ++is @i{implementation-defined}; ++however, if the @i{implementation} does permit it, ++it must arrange to properly ``quote'' the character for the ++@i{file system} when constructing a @i{namestring}. ++For example, ++ ++@example ++ ;; In a TOPS-20 implementation, which uses @t{^}V to quote ++ (NAMESTRING (MAKE-PATHNAME :HOST "OZ" :NAME "")) ++@result{} #P"OZ:PS:@t{^}V" ++@i{NOT}@result{} #P"OZ:PS:" ++@end example ++ ++@node Case in Pathname Components, Local Case in Pathname Components, Special Characters in Pathname Components, Interpreting Pathname Component Values ++@subsubsection Case in Pathname Components ++ ++@i{Namestrings} always use local file system @i{case} conventions, ++but @r{Common Lisp} @i{functions} that manipulate @i{pathname} components ++allow the caller to select either of two conventions for representing ++@i{case} in component values by supplying a value for the ++@t{:case} keyword argument. ++Figure 19--2 lists the functions ++relating to @i{pathnames} that permit a @t{:case} argument: ++ ++@format ++@group ++@noindent ++@w{ make-pathname pathname-directory pathname-name } ++@w{ pathname-device pathname-host pathname-type } ++ ++@noindent ++@w{ Figure 19--2: Pathname functions using a :CASE argument} ++ ++@end group ++@end format ++ ++@node Local Case in Pathname Components, Common Case in Pathname Components, Case in Pathname Components, Interpreting Pathname Component Values ++@subsubsection Local Case in Pathname Components ++ ++For the functions in @i{Figure~19--2}, ++a value of @t{:local} ++@c @IKindex{local} ++ for the @t{:case} argument ++(the default for these functions) ++indicates that the functions should receive and yield @i{strings} in component values ++as if they were already represented according to the host @i{file system}'s ++convention for @i{case}. ++ ++If the @i{file system} supports both @i{cases}, @i{strings} given or received ++as @i{pathname} component values under this protocol are to be used exactly ++as written. If the file system only supports one @i{case}, ++the @i{strings} will be translated to that @i{case}. ++ ++@node Common Case in Pathname Components, Special Pathname Component Values, Local Case in Pathname Components, Interpreting Pathname Component Values ++@subsubsection Common Case in Pathname Components ++ ++For the functions in @i{Figure~19--2}, ++a value of @t{:common} ++@c @IKindex{common} ++ for the @t{:case} argument ++that these @i{functions} should receive ++and yield @i{strings} in component values according to the following conventions: ++ ++@table @asis ++ ++@item @t{*} ++All @i{uppercase} means to use a file system's customary @i{case}. ++@item @t{*} ++All @i{lowercase} means to use the opposite of the customary @i{case}. ++@item @t{*} ++Mixed @i{case} represents itself. ++@end table ++ ++Note that these conventions have been chosen in such a way that translation ++from @t{:local} to @t{:common} and back to @t{:local} is information-preserving. ++ ++@node Special Pathname Component Values, NIL as a Component Value, Common Case in Pathname Components, Interpreting Pathname Component Values ++@subsubsection Special Pathname Component Values ++ ++@node NIL as a Component Value, ->WILD as a Component Value, Special Pathname Component Values, Interpreting Pathname Component Values ++@subsubsection NIL as a Component Value ++ ++As a @i{pathname} component value, ++@b{nil} represents that the component is ``unfilled''; ++see @ref{Merging Pathnames}. ++ ++The value of any @i{pathname} component can be @b{nil}. ++ ++When constructing a @i{pathname}, ++@b{nil} in the host component might mean a default host ++rather than an actual @b{nil} in some @i{implementations}. ++ ++@node ->WILD as a Component Value, ->UNSPECIFIC as a Component Value, NIL as a Component Value, Interpreting Pathname Component Values ++@subsubsection :WILD as a Component Value ++ ++If @t{:wild} ++@c @IKindex{wild} ++ is the value of a @i{pathname} component, ++that component is considered to be a wildcard, which matches anything. ++ ++A @i{conforming program} must be prepared to encounter a value of @t{:wild} ++as the value of any @i{pathname} component, ++or as an @i{element} of a @i{list} that is the value of the directory component. ++ ++When constructing a @i{pathname}, ++a @i{conforming program} may use @t{:wild} as the value of any or all of ++the directory, name, type, ++or version component, but must not use @t{:wild} as the value of the host, ++or device component. ++ ++If @t{:wild} is used as the value of the directory component in the construction ++of a @i{pathname}, the effect is equivalent to specifying the list ++@t{(:absolute :wild-inferiors)}, ++or the same as @t{(:absolute :wild)} in a @i{file system} that does not support ++@t{:wild-inferiors}. ++@c @IKindex{wild-inferiors} ++ ++@node ->UNSPECIFIC as a Component Value, Relation between component values NIL and ->UNSPECIFIC, ->WILD as a Component Value, Interpreting Pathname Component Values ++@subsubsection :UNSPECIFIC as a Component Value ++ ++If @t{:unspecific} ++@c @IKindex{unspecific} ++ is the value of a @i{pathname} component, ++the component is considered to be ``absent'' ++or to ``have no meaning'' ++in the @i{filename} being represented by the @i{pathname}. ++ ++Whether a value of @t{:unspecific} is permitted for any component ++on any given @i{file system} accessible to the @i{implementation} ++is @i{implementation-defined}. ++A @i{conforming program} must never unconditionally use a ++@t{:unspecific} as the value of a @i{pathname} component because ++such a value is not guaranteed to be permissible in all implementations. ++However, a @i{conforming program} can, if it is careful, ++successfully manipulate user-supplied data ++which contains or refers to non-portable @i{pathname} components. ++And certainly a @i{conforming program} should be prepared for the ++possibility that any components of a @i{pathname} could be @t{:unspecific}. ++ ++When @i{reading}_1 the value of any @i{pathname} component, ++@i{conforming programs} should be prepared for the value to be @t{:unspecific}. ++ ++When @i{writing}_1 the value of any @i{pathname} component, ++the consequences are undefined if @t{:unspecific} is given ++for a @i{pathname} in a @i{file system} for which it does not make sense. ++ ++@node Relation between component values NIL and ->UNSPECIFIC, Restrictions on Wildcard Pathnames, ->UNSPECIFIC as a Component Value, Interpreting Pathname Component Values ++@subsubsection Relation between component values NIL and :UNSPECIFIC ++ ++If a @i{pathname} is converted to a @i{namestring}, ++the @i{symbols} @b{nil} and @t{:unspecific} ++cause the field to be treated as if it were empty. ++That is, ++both @b{nil} and @t{:unspecific} ++cause the component not to appear in the @i{namestring}. ++ ++However, when merging a @i{pathname} with a set of defaults, ++only a @b{nil} value for a component ++will be replaced with the default for that component, ++while a value of @t{:unspecific} ++will be left alone as if the field were ``filled''; ++see the @i{function} @b{merge-pathnames} and @ref{Merging Pathnames}. ++ ++@node Restrictions on Wildcard Pathnames, Restrictions on Examining Pathname Components, Relation between component values NIL and ->UNSPECIFIC, Interpreting Pathname Component Values ++@subsubsection Restrictions on Wildcard Pathnames ++ ++ Wildcard @i{pathnames} can be used with @b{directory} but not with ++ @b{open}, ++ and return true from @b{wild-pathname-p}. When examining ++ wildcard components of a wildcard @i{pathname}, conforming programs ++ must be prepared to encounter any of the following additional values ++ in any component or any element of a @i{list} that is the directory component: ++ ++@table @asis ++ ++@item @t{*} ++The @i{symbol} @t{:wild}, which matches anything. ++ ++@item @t{*} ++A @i{string} containing @i{implementation-dependent} ++ special wildcard @i{characters}. ++ ++@item @t{*} ++Any @i{object}, ++ representing an @i{implementation-dependent} wildcard pattern. ++ ++@end table ++ ++@node Restrictions on Examining Pathname Components, Restrictions on Examining a Pathname Host Component, Restrictions on Wildcard Pathnames, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining Pathname Components ++ ++The space of possible @i{objects} that a @i{conforming program} ++must be prepared to @i{read}_1 ++as the value of a @i{pathname} component ++is substantially larger than the space of possible @i{objects} ++that a @i{conforming program} is permitted to @i{write}_1 ++into such a component. ++ ++While the values discussed ++ in the subsections of this section, ++ in @ref{Special Pathname Component Values}, ++and in @ref{Restrictions on Wildcard Pathnames} ++apply to values that might be seen when ++reading the component values, ++substantially more restrictive rules apply to constructing pathnames; ++see @ref{Restrictions on Constructing Pathnames}. ++ ++When examining @i{pathname} components, ++@i{conforming programs} should be aware of the following restrictions. ++ ++@node Restrictions on Examining a Pathname Host Component, Restrictions on Examining a Pathname Device Component, Restrictions on Examining Pathname Components, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining a Pathname Host Component ++ ++It is @i{implementation-dependent} what @i{object} is used to represent the host. ++ ++@node Restrictions on Examining a Pathname Device Component, Restrictions on Examining a Pathname Directory Component, Restrictions on Examining a Pathname Host Component, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining a Pathname Device Component ++ ++The device might be a @i{string}, ++@t{:wild}, @t{:unspecific}, or @b{nil}. ++ ++Note that @t{:wild} might result from an attempt to @i{read}_1 ++the @i{pathname} component, even though portable programs are restricted ++from @i{writing}_1 such a component value; ++see @ref{Restrictions on Wildcard Pathnames} and @ref{Restrictions on Constructing Pathnames}. ++ ++@node Restrictions on Examining a Pathname Directory Component, Directory Components in Non-Hierarchical File Systems, Restrictions on Examining a Pathname Device Component, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining a Pathname Directory Component ++ ++The directory might be a @i{string}, ++@t{:wild}, @t{:unspecific}, or @b{nil}. ++ ++The directory can be a @i{list} of @i{strings} and @i{symbols}. ++ ++The @i{car} of the @i{list} is one of the symbols @t{:absolute} ++@c @IKindex{absolute} ++ or ++@t{:relative} ++@c @IKindex{relative} ++, meaning: ++ ++@table @asis ++ ++@item @t{:absolute} ++A @i{list} whose @i{car} is the symbol @t{:absolute} represents ++ a directory path starting from the root directory. The list ++ @t{(:absolute)} represents the root directory. The list ++ @t{(:absolute "foo" "bar" "baz")} represents the directory called ++ @t{"/foo/bar/baz"} in Unix (except possibly for @i{case}). ++ ++@item @t{:relative} ++A @i{list} whose @i{car} is the symbol @t{:relative} represents ++ a directory path starting from a default directory. ++ The list @t{(:relative)} has the same meaning as @b{nil} and hence is not used. ++ The list @t{(:relative "foo" "bar")} represents the directory named @t{"bar"} ++ in the directory named @t{"foo"} in the default directory. ++ ++@end table ++ ++Each remaining element of the @i{list} is a @i{string} or a @i{symbol}. ++ ++Each @i{string} names a single level of directory structure. ++The @i{strings} should contain only the directory names ++themselves---no punctuation characters. ++ ++In place of a @i{string}, at any point in the @i{list}, @i{symbols} ++can occur to indicate special file notations. ++Figure 19--3 lists the @i{symbols} that have standard meanings. ++Implementations are permitted to add additional @i{objects} ++of any @i{type} that is disjoint from @b{string} ++if necessary to represent features of their file systems that cannot be ++represented with the standard @i{strings} and @i{symbols}. ++ ++Supplying any non-@i{string}, including any of the @i{symbols} listed below, ++to a file system for which it does not make sense ++signals an error of @i{type} @b{file-error}. ++For example, Unix does not support @t{:wild-inferiors} in most implementations. ++ ++@c @IKindex{wild} ++ ++@c @IKindex{wild-inferiors} ++ ++@c @IKindex{up} ++ ++@c @IKindex{back} ++ ++@format ++@group ++@noindent ++@w{ Symbol Meaning } ++@w{ @t{:wild} Wildcard match of one level of directory structure } ++@w{ @t{:wild-inferiors} Wildcard match of any number of directory levels } ++@w{ @t{:up} Go upward in directory structure (semantic) } ++@w{ @t{:back} Go upward in directory structure (syntactic) } ++ ++@noindent ++@w{ Figure 19--3: Special Markers In Directory Component } ++ ++@end group ++@end format ++ ++The following notes apply to the previous figure: ++ ++@table @asis ++ ++@item Invalid Combinations ++Using @t{:absolute} or @t{:wild-inferiors} ++immediately followed by @t{:up} or @t{:back} ++signals an error of @i{type} @b{file-error}. ++ ++@item Syntactic vs Semantic ++``Syntactic'' means that the action of @t{:back} ++depends only on the @i{pathname} ++and not on the contents of the file system. ++ ++``Semantic'' means that the action of @t{:up} ++depends on the contents of the file system; ++to resolve a @i{pathname} containing ++@t{:up} to a @i{pathname} whose directory component ++contains only @t{:absolute} and ++@i{strings} requires probing the file system. ++ ++@t{:up} differs from ++@t{:back} only in file systems that support multiple ++ names for directories, perhaps via symbolic links. For example, ++ suppose that there is a directory ++@t{(:absolute "X" "Y" "Z")} ++ linked to ++@t{(:absolute "A" "B" "C")} ++ and there also exist directories ++@t{(:absolute "A" "B" "Q")} and ++@t{(:absolute "X" "Y" "Q")}. ++Then ++@t{(:absolute "X" "Y" "Z" :up "Q")} ++ designates ++@t{(:absolute "A" "B" "Q")} ++ while ++@t{(:absolute "X" "Y" "Z" :back "Q")} ++ designates ++@t{(:absolute "X" "Y" "Q")} ++@end table ++ ++@node Directory Components in Non-Hierarchical File Systems, Restrictions on Examining a Pathname Name Component, Restrictions on Examining a Pathname Directory Component, Interpreting Pathname Component Values ++@subsubsection Directory Components in Non-Hierarchical File Systems ++ ++In non-hierarchical @i{file systems}, ++the only valid @i{list} values for the directory component of a @i{pathname} ++are @t{(:absolute @i{string})} and @t{(:absolute :wild)}. ++@t{:relative} directories and the keywords ++@t{:wild-inferiors}, @t{:up}, and @t{:back} are not used ++in non-hierarchical @i{file systems}. ++ ++@node Restrictions on Examining a Pathname Name Component, Restrictions on Examining a Pathname Type Component, Directory Components in Non-Hierarchical File Systems, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining a Pathname Name Component ++ ++The name might be a @i{string}, ++@t{:wild}, @t{:unspecific}, or @b{nil}. ++ ++@node Restrictions on Examining a Pathname Type Component, Restrictions on Examining a Pathname Version Component, Restrictions on Examining a Pathname Name Component, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining a Pathname Type Component ++ ++The type might be a @i{string}, ++@t{:wild}, @t{:unspecific}, or @b{nil}. ++ ++@node Restrictions on Examining a Pathname Version Component, Notes about the Pathname Version Component, Restrictions on Examining a Pathname Type Component, Interpreting Pathname Component Values ++@subsubsection Restrictions on Examining a Pathname Version Component ++ ++The version can be any @i{symbol} or any @i{integer}. ++ ++The symbol @t{:newest} refers to the largest version number ++that already exists in the @i{file system} ++when reading, overwriting, appending, superseding, or directory listing ++an existing @i{file}. ++The symbol @t{:newest} refers to the smallest version number ++greater than any existing version number when creating a new file. ++ ++The symbols @b{nil}, @t{:unspecific}, and @t{:wild} have special meanings and ++restrictions; see @ref{Special Pathname Component Values} and @ref{Restrictions on Constructing Pathnames}. ++ ++Other @i{symbols} and @i{integers} ++have @i{implementation-defined} meaning. ++ ++@node Notes about the Pathname Version Component, Restrictions on Constructing Pathnames, Restrictions on Examining a Pathname Version Component, Interpreting Pathname Component Values ++@subsubsection Notes about the Pathname Version Component ++ ++It is suggested, but not required, that implementations do the following: ++ ++@table @asis ++ ++@item @t{*} ++Use positive @i{integers} starting at 1 as version numbers. ++ ++@item @t{*} ++Recognize the symbol @t{:oldest} ++ to designate the smallest existing version number. ++ ++@item @t{*} ++Use @i{keywords} for other special versions. ++ ++@end table ++ ++@node Restrictions on Constructing Pathnames, , Notes about the Pathname Version Component, Interpreting Pathname Component Values ++@subsubsection Restrictions on Constructing Pathnames ++ ++ When constructing a @i{pathname} from components, conforming programs ++ must follow these rules: ++ ++@table @asis ++ ++@item @t{*} ++Any component can be @b{nil}. ++ @b{nil} in the host might mean a default host ++ rather than an actual @b{nil} in some implementations. ++ ++@item @t{*} ++The host, device, directory, name, and type can be @i{strings}. There ++ are @i{implementation-dependent} limits on the number and type of ++ @i{characters} in these @i{strings}. ++ ++@item @t{*} ++The directory can be a @i{list} of @i{strings} and @i{symbols}. ++ There are @i{implementation-dependent} limits on the @i{list}'s ++ length and contents. ++ ++@item @t{*} ++The version can be @t{:newest}. ++ ++@item @t{*} ++Any component can be taken ++ from the corresponding component of another @i{pathname}. ++ When the two @i{pathnames} are for different file systems ++ (in implementations that support multiple file systems), ++ an appropriate translation occurs. ++ If no meaningful translation is possible, ++ an error is signaled. ++ The definitions of ``appropriate'' and ``meaningful'' ++ are @i{implementation-dependent}. ++ ++@item @t{*} ++An implementation might support other values for some components, ++ but a portable program cannot use those values. ++ A conforming program can use @i{implementation-dependent} values ++ but this can make it non-portable; ++ for example, it might work only with @r{Unix} file systems. ++@end table ++ ++@node Merging Pathnames, , Interpreting Pathname Component Values, Pathnames ++@subsection Merging Pathnames ++ ++Merging takes a @i{pathname} with unfilled components ++and supplies values for those components from a source of defaults. ++ ++If a component's value is @b{nil}, that component is considered to be unfilled. ++If a component's value is any @i{non-nil} @i{object}, ++including @t{:unspecific}, that component is considered to be filled. ++ ++Except as explicitly specified otherwise, ++for functions that manipulate or inquire about @i{files} in the @i{file system}, ++the pathname argument to such a function ++is merged with @b{*default-pathname-defaults*} before accessing the @i{file system} ++(as if by @b{merge-pathnames}). ++ ++@menu ++* Examples of Merging Pathnames:: ++@end menu ++ ++@node Examples of Merging Pathnames, , Merging Pathnames, Merging Pathnames ++@subsubsection Examples of Merging Pathnames ++ ++Although the following examples are possible to execute only in ++@i{implementations} which permit @t{:unspecific} in the indicated ++position andwhich permit four-letter type components, they serve to illustrate ++the basic concept of @i{pathname} merging. ++ ++@example ++ (pathname-type ++ (merge-pathnames (make-pathname :type "LISP") ++ (make-pathname :type "TEXT"))) ++@result{} "LISP" ++ ++ (pathname-type ++ (merge-pathnames (make-pathname :type nil) ++ (make-pathname :type "LISP"))) ++@result{} "LISP" ++ ++ (pathname-type ++ (merge-pathnames (make-pathname :type :unspecific) ++ (make-pathname :type "LISP"))) ++@result{} :UNSPECIFIC ++@end example ++ ++@c end of including concept-pathnames ++ ++@node Logical Pathnames, Filenames Dictionary, Pathnames, Filenames ++@section Logical Pathnames ++ ++@c including concept-logical-pathnames ++ ++@menu ++* Syntax of Logical Pathname Namestrings:: ++* Logical Pathname Components:: ++@end menu ++ ++@node Syntax of Logical Pathname Namestrings, Logical Pathname Components, Logical Pathnames, Logical Pathnames ++@subsection Syntax of Logical Pathname Namestrings ++ ++The syntax of a @i{logical pathname} @i{namestring} is as follows. ++(Note that unlike many notational descriptions in this document, ++ this is a syntactic description of character sequences, ++ not a structural description of @i{objects}.) ++ ++@w{@i{logical-pathname} ::=@r{[}!@i{host} @i{host-marker}@r{]} } ++@w{ @r{[}!@i{@i{relative-directory-marker}}@r{]} @{!@i{directory} @i{directory-marker}@}* } ++@w{ @r{[}!@i{name}@r{]} @r{[}@i{type-marker} !@i{type} @r{[}@i{version-marker} !@i{version}@r{]}@r{]}} ++ ++@w{@i{host} ::=!@i{word}} ++ ++@w{@i{directory} ::=!@i{word} | !@i{wildcard-word} | !@i{wild-inferiors-word}} ++ ++@w{@i{name} ::=!@i{word} | !@i{wildcard-word}} ++ ++@w{@i{type} ::=!@i{word} | !@i{wildcard-word}} ++ ++@w{@i{version} ::=!@i{pos-int} | @i{newest-word} | @i{wildcard-version}} ++ ++@i{host-marker}---a @i{colon}. ++ ++@i{relative-directory-marker}---a @i{semicolon}. ++ ++@i{directory-marker}---a @i{semicolon}. ++ ++@i{type-marker}---a @i{dot}. ++ ++@i{version-marker}---a @i{dot}. ++ ++@i{wild-inferiors-word}---The two character sequence ``@t{**}'' (two @i{asterisks}). ++ ++@i{newest-word}---The six character sequence ``@t{newest}'' ++ or the six character sequence ``@t{NEWEST}''. ++ ++@i{wildcard-version}---an @i{asterisk}. ++ ++@i{wildcard-word}---one or more @i{asterisks}, uppercase letters, ++ digits, and hyphens, including at least one @i{asterisk}, ++ with no two @i{asterisks} adjacent. ++ ++@i{word}---one or more uppercase letters, digits, and hyphens. ++ ++@i{pos-int}---a positive @i{integer}. ++ ++@menu ++* Additional Information about Parsing Logical Pathname Namestrings:: ++* The Host part of a Logical Pathname Namestring:: ++* The Device part of a Logical Pathname Namestring:: ++* The Directory part of a Logical Pathname Namestring:: ++* The Type part of a Logical Pathname Namestring:: ++* The Version part of a Logical Pathname Namestring:: ++* Wildcard Words in a Logical Pathname Namestring:: ++* Lowercase Letters in a Logical Pathname Namestring:: ++* Other Syntax in a Logical Pathname Namestring:: ++@end menu ++ ++@node Additional Information about Parsing Logical Pathname Namestrings, The Host part of a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings, Syntax of Logical Pathname Namestrings ++@subsubsection Additional Information about Parsing Logical Pathname Namestrings ++ ++@node The Host part of a Logical Pathname Namestring, The Device part of a Logical Pathname Namestring, Additional Information about Parsing Logical Pathname Namestrings, Syntax of Logical Pathname Namestrings ++@subsubsection The Host part of a Logical Pathname Namestring ++ ++The @i{host} must have been defined as a @i{logical pathname} host; ++this can be done by using @b{setf} of @b{logical-pathname-translations}. ++ ++The @i{logical pathname} host name @t{"SYS"} is reserved for the implementation. ++The existence and meaning of @t{SYS:} @i{logical pathnames} ++is @i{implementation-defined}. ++ ++@node The Device part of a Logical Pathname Namestring, The Directory part of a Logical Pathname Namestring, The Host part of a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection The Device part of a Logical Pathname Namestring ++ ++There is no syntax for a @i{logical pathname} device since ++the device component of a @i{logical pathname} is always @t{:unspecific}; ++see @ref{Unspecific Components of a Logical Pathname}. ++ ++@node The Directory part of a Logical Pathname Namestring, The Type part of a Logical Pathname Namestring, The Device part of a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection The Directory part of a Logical Pathname Namestring ++ ++If a @i{relative-directory-marker} precedes the @i{directories}, ++the directory component parsed is as @i{relative}; ++otherwise, the directory component is parsed as @i{absolute}. ++ ++If a @i{wild-inferiors-marker} is specified, ++it parses into @t{:wild-inferiors}. ++ ++@node The Type part of a Logical Pathname Namestring, The Version part of a Logical Pathname Namestring, The Directory part of a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection The Type part of a Logical Pathname Namestring ++ ++The @i{type} of a @i{logical pathname} for a @i{source file} ++is @t{"LISP"}. This should be translated into whatever type is ++appropriate in a physical pathname. ++ ++@node The Version part of a Logical Pathname Namestring, Wildcard Words in a Logical Pathname Namestring, The Type part of a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection The Version part of a Logical Pathname Namestring ++ ++Some @i{file systems} do not have @i{versions}. ++@i{Logical pathname} translation to such a @i{file system} ++ignores the @i{version}. ++This implies that a program cannot rely on being able to store ++more than one version of a file named by a @i{logical pathname}. ++ ++If a @i{wildcard-version} is specified, ++it parses into @t{:wild}. ++ ++@node Wildcard Words in a Logical Pathname Namestring, Lowercase Letters in a Logical Pathname Namestring, The Version part of a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection Wildcard Words in a Logical Pathname Namestring ++ ++Each @i{asterisk} in a @i{wildcard-word} matches a sequence of ++zero or more characters. The @i{wildcard-word} ``@t{*}'' ++parses into @t{:wild}; other @i{wildcard-words} parse into @i{strings}. ++ ++@node Lowercase Letters in a Logical Pathname Namestring, Other Syntax in a Logical Pathname Namestring, Wildcard Words in a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection Lowercase Letters in a Logical Pathname Namestring ++ ++When parsing @i{words} and @i{wildcard-words}, ++lowercase letters are translated to uppercase. ++ ++@node Other Syntax in a Logical Pathname Namestring, , Lowercase Letters in a Logical Pathname Namestring, Syntax of Logical Pathname Namestrings ++@subsubsection Other Syntax in a Logical Pathname Namestring ++ ++The consequences of using characters other than those specified here ++in a @i{logical pathname} @i{namestring} are unspecified. ++ ++The consequences of using any value not specified here as a ++@i{logical pathname} component are unspecified. ++ ++@node Logical Pathname Components, , Syntax of Logical Pathname Namestrings, Logical Pathnames ++@subsection Logical Pathname Components ++ ++@menu ++* Unspecific Components of a Logical Pathname:: ++* Null Strings as Components of a Logical Pathname:: ++@end menu ++ ++@node Unspecific Components of a Logical Pathname, Null Strings as Components of a Logical Pathname, Logical Pathname Components, Logical Pathname Components ++@subsubsection Unspecific Components of a Logical Pathname ++ ++The device component of a @i{logical pathname} is always @t{:unspecific}; ++no other component of a @i{logical pathname} can be @t{:unspecific}. ++ ++@node Null Strings as Components of a Logical Pathname, , Unspecific Components of a Logical Pathname, Logical Pathname Components ++@subsubsection Null Strings as Components of a Logical Pathname ++ ++The null string, @t{""}, is not a valid value for any component of a @i{logical pathname}. ++ ++@c end of including concept-logical-pathnames ++ ++@node Filenames Dictionary, , Logical Pathnames, Filenames ++@section Filenames Dictionary ++ ++@c including dict-pathnames ++ ++@menu ++* pathname (System Class):: ++* logical-pathname (System Class):: ++* pathname:: ++* make-pathname:: ++* pathnamep:: ++* pathname-host:: ++* load-logical-pathname-translations:: ++* logical-pathname-translations:: ++* logical-pathname:: ++* *default-pathname-defaults*:: ++* namestring:: ++* parse-namestring:: ++* wild-pathname-p:: ++* pathname-match-p:: ++* translate-logical-pathname:: ++* translate-pathname:: ++* merge-pathnames:: ++@end menu ++ ++@node pathname (System Class), logical-pathname (System Class), Filenames Dictionary, Filenames Dictionary ++@subsection pathname [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{pathname}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{pathname} is a structured @i{object} which represents a @i{filename}. ++ ++There are two kinds of @i{pathnames}---@i{physical pathnames} and ++@i{logical pathnames}. ++ ++@node logical-pathname (System Class), pathname, pathname (System Class), Filenames Dictionary ++@subsection logical-pathname [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{logical-pathname}, ++@b{pathname}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{pathname} that uses a @i{namestring} syntax that is ++@i{implementation-independent}, ++and that has component values that are @i{implementation-independent}. ++@i{Logical pathnames} do not refer directly to @i{filenames} ++ ++@subsubheading See Also:: ++ ++@ref{File System Concepts}, ++@ref{Sharpsign P}, ++@ref{Printing Pathnames} ++ ++@node pathname, make-pathname, logical-pathname (System Class), Filenames Dictionary ++@subsection pathname [Function] ++ ++@code{pathname} @i{pathspec} @result{} @i{pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{pathname designator}. ++ ++@i{pathname}---a @i{pathname}. ++ ++@subsubheading Description:: ++ ++Returns the @i{pathname} denoted by @i{pathspec}. ++ ++If the @i{pathspec} @i{designator} is a @i{stream}, ++the @i{stream} can be either open or closed; ++in both cases, the @b{pathname} returned ++corresponds to the @i{filename} used to open the @i{file}. ++@b{pathname} returns the same @i{pathname} for a @i{file stream} ++after it is closed as it did when it was open. ++ ++If the @i{pathspec} @i{designator} is ++a @i{file stream} created by opening a @i{logical pathname}, ++a @i{logical pathname} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; There is a great degree of variability permitted here. The next ++ ;; several examples are intended to illustrate just a few of the many ++ ;; possibilities. Whether the name is canonicalized to a particular ++ ;; case (either upper or lower) depends on both the file system and the ++ ;; implementation since two different implementations using the same ++ ;; file system might differ on many issues. How information is stored ++ ;; internally (and possibly presented in #S notation) might vary, ++ ;; possibly requiring `accessors' such as PATHNAME-NAME to perform case ++ ;; conversion upon access. The format of a namestring is dependent both ++ ;; on the file system and the implementation since, for example, one ++ ;; implementation might include the host name in a namestring, and ++ ;; another might not. #S notation would generally only be used in a ++ ;; situation where no appropriate namestring could be constructed for use ++ ;; with #P. ++ (setq p1 (pathname "test")) ++@result{} #P"CHOCOLATE:TEST" ; with case canonicalization (e.g., VMS) ++@i{OR}@result{} #P"VANILLA:test" ; without case canonicalization (e.g., Unix) ++@i{OR}@result{} #P"test" ++@i{OR}@result{} #S(PATHNAME :HOST "STRAWBERRY" :NAME "TEST") ++@i{OR}@result{} #S(PATHNAME :HOST "BELGIAN-CHOCOLATE" :NAME "test") ++ (setq p2 (pathname "test")) ++@result{} #P"CHOCOLATE:TEST" ++@i{OR}@result{} #P"VANILLA:test" ++@i{OR}@result{} #P"test" ++@i{OR}@result{} #S(PATHNAME :HOST "STRAWBERRY" :NAME "TEST") ++@i{OR}@result{} #S(PATHNAME :HOST "BELGIAN-CHOCOLATE" :NAME "test") ++ (pathnamep p1) @result{} @i{true} ++ (eq p1 (pathname p1)) @result{} @i{true} ++ (eq p1 p2) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (with-open-file (stream "test" :direction :output) ++ (pathname stream)) ++@result{} #P"ORANGE-CHOCOLATE:>Gus>test.lisp.newest" ++@end example ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node make-pathname, pathnamep, pathname, Filenames Dictionary ++@subsection make-pathname [Function] ++ ++@code{make-pathname} @i{@r{&key} host device directory name type version defaults case}@* ++ @result{} @i{pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{host}---a @i{valid physical pathname host}. ++ Complicated defaulting behavior; see below. ++ ++@i{device}---a @i{valid pathname device}. ++ Complicated defaulting behavior; see below. ++ ++@i{directory}---a @i{valid pathname directory}. ++ Complicated defaulting behavior; see below. ++ ++@i{name}---a @i{valid pathname name}. ++ Complicated defaulting behavior; see below. ++ ++@i{type}---a @i{valid pathname type}. ++ Complicated defaulting behavior; see below. ++ ++@i{version}---a @i{valid pathname version}. ++ Complicated defaulting behavior; see below. ++ ++@i{defaults}---a @i{pathname designator}. ++ The default is a @i{pathname} whose host component is the same as the ++ host component of the @i{value} of @b{*default-pathname-defaults*}, ++ and whose other components are all @b{nil}. ++ ++@i{case}---one of @t{:common} or @t{:local}. ++ The default is @t{:local}. ++ ++@i{pathname}---a @i{pathname}. ++ ++@subsubheading Description:: ++ ++Constructs and returns a @i{pathname} from the supplied keyword arguments. ++ ++After the components supplied explicitly by ++ @i{host}, ++ @i{device}, ++ @i{directory}, ++ @i{name}, ++ @i{type}, ++ and @i{version} ++are filled in, ++the merging rules used by @b{merge-pathnames} ++are used to fill in any ++unsupplied ++components ++from the defaults supplied by @i{defaults}. ++ ++Whenever a @i{pathname} is constructed the components may be ++canonicalized if appropriate. ++For the explanation of the arguments that can be supplied for each component, ++see @ref{Pathname Components}. ++ ++If @i{case} is supplied, ++it is treated as described in @ref{Case in Pathname Components}. ++ ++The resulting @i{pathname} is a @i{logical pathname} ++if and only its host component ++is ++a @i{logical host} ++or a @i{string} that names a defined @i{logical host}. ++ ++If the @i{directory} is a @i{string}, ++it should be the name of a top level directory, ++and should not contain any punctuation characters; that is, ++specifying a @i{string}, @i{str}, is ++equivalent to specifying the list @t{(:absolute @i{str})}. ++Specifying the symbol @t{:wild} is equivalent to specifying the list ++@t{(:absolute :wild-inferiors)}, or @t{(:absolute :wild)} ++in a file system that does not support @t{:wild-inferiors}. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; Implementation A -- an implementation with access to a single ++ ;; Unix file system. This implementation happens to never display ++ ;; the `host' information in a namestring, since there is only one host. ++ (make-pathname :directory '(:absolute "public" "games") ++ :name "chess" :type "db") ++@result{} #P"/public/games/chess.db" ++ ++ ;; Implementation B -- an implementation with access to one or more ++ ;; VMS file systems. This implementation displays `host' information ++ ;; in the namestring only when the host is not the local host. ++ ;; It uses a double colon to separate a host name from the host's local ++ ;; file name. ++ (make-pathname :directory '(:absolute "PUBLIC" "GAMES") ++ :name "CHESS" :type "DB") ++@result{} #P"SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++ (make-pathname :host "BOBBY" ++ :directory '(:absolute "PUBLIC" "GAMES") ++ :name "CHESS" :type "DB") ++@result{} #P"BOBBY::SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++ ++ ;; Implementation C -- an implementation with simultaneous access to ++ ;; multiple file systems from the same Lisp image. In this ++ ;; implementation, there is a convention that any text preceding the ++ ;; first colon in a pathname namestring is a host name. ++ (dolist (case '(:common :local)) ++ (dolist (host '("MY-LISPM" "MY-VAX" "MY-UNIX")) ++ (print (make-pathname :host host :case case ++ :directory '(:absolute "PUBLIC" "GAMES") ++ :name "CHESS" :type "DB")))) ++@t{ |> } #P"MY-LISPM:>public>games>chess.db" ++@t{ |> } #P"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++@t{ |> } #P"MY-UNIX:/public/games/chess.db" ++@t{ |> } #P"MY-LISPM:>public>games>chess.db" ++@t{ |> } #P"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++@t{ |> } #P"MY-UNIX:/PUBLIC/GAMES/CHESS.DB" ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{file system}. ++ ++@subsubheading See Also:: ++ ++@ref{merge-pathnames} ++, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++Portable programs should not supply @t{:unspecific} for any component. ++See @ref{->UNSPECIFIC as a Component Value}. ++ ++@node pathnamep, pathname-host, make-pathname, Filenames Dictionary ++@subsection pathnamep [Function] ++ ++@code{pathnamep} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{pathname}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq q "test") @result{} "test" ++ (pathnamep q) @result{} @i{false} ++ (setq q (pathname "test")) ++@result{} #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" :TYPE NIL ++ :VERSION NIL) ++ (pathnamep q) @result{} @i{true} ++ (setq q (logical-pathname "SYS:SITE;FOO.SYSTEM")) ++@result{} #P"SYS:SITE;FOO.SYSTEM" ++ (pathnamep q) @result{} @i{true} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (pathnamep @i{object}) @equiv{} (typep @i{object} 'pathname) ++@end example ++ ++@node pathname-host, load-logical-pathname-translations, pathnamep, Filenames Dictionary ++@subsection pathname-host, pathname-device, pathname-directory, ++@subheading pathname-name, pathname-type, pathname-version ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{pathname-host} @i{pathname @r{&key} case} @result{} @i{host} ++ ++@code{pathname-device} @i{pathname @r{&key} case} @result{} @i{device} ++ ++@code{pathname-directory} @i{pathname @r{&key} case} @result{} @i{directory} ++ ++@code{pathname-name} @i{pathname @r{&key} case} @result{} @i{name} ++ ++@code{pathname-type} @i{pathname @r{&key} case} @result{} @i{type} ++ ++@code{pathname-version} @i{pathname} @result{} @i{version} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}. ++ ++@i{case}---one of @t{:local} or @t{:common}. ++ The default is @t{:local}. ++ ++@i{host}---a @i{valid pathname host}. ++ ++@i{device}---a @i{valid pathname device}. ++ ++@i{directory}---a @i{valid pathname directory}. ++ ++@i{name}---a @i{valid pathname name}. ++ ++@i{type}---a @i{valid pathname type}. ++ ++@i{version}---a @i{valid pathname version}. ++ ++@subsubheading Description:: ++ ++These functions return the components of @i{pathname}. ++ ++If the @i{pathname} @i{designator} is a @i{pathname}, ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++ ++If @i{case} is supplied, ++it is treated as described in @ref{Case in Pathname Components}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq q (make-pathname :host "KATHY" ++ :directory "CHAPMAN" ++ :name "LOGIN" :type "COM")) ++@result{} #P"KATHY::[CHAPMAN]LOGIN.COM" ++ (pathname-host q) @result{} "KATHY" ++ (pathname-name q) @result{} "LOGIN" ++ (pathname-type q) @result{} "COM" ++ ++ ;; Because namestrings are used, the results shown in the remaining ++ ;; examples are not necessarily the only possible results. Mappings ++ ;; from namestring representation to pathname representation are ++ ;; dependent both on the file system involved and on the implementation ++ ;; (since there may be several implementations which can manipulate the ++ ;; the same file system, and those implementations are not constrained ++ ;; to agree on all details). Consult the documentation for each ++ ;; implementation for specific information on how namestrings are treated ++ ;; that implementation. ++ ++ ;; VMS ++ (pathname-directory (parse-namestring "[FOO.*.BAR]BAZ.LSP")) ++@result{} (:ABSOLUTE "FOO" "BAR") ++ (pathname-directory (parse-namestring "[FOO.*.BAR]BAZ.LSP") :case :common) ++@result{} (:ABSOLUTE "FOO" "BAR") ++ ++ ;; Unix ++ (pathname-directory "foo.l") @result{} NIL ++ (pathname-device "foo.l") @result{} :UNSPECIFIC ++ (pathname-name "foo.l") @result{} "foo" ++ (pathname-name "foo.l" :case :local) @result{} "foo" ++ (pathname-name "foo.l" :case :common) @result{} "FOO" ++ (pathname-type "foo.l") @result{} "l" ++ (pathname-type "foo.l" :case :local) @result{} "l" ++ (pathname-type "foo.l" :case :common) @result{} "L" ++ (pathname-type "foo") @result{} :UNSPECIFIC ++ (pathname-type "foo" :case :common) @result{} :UNSPECIFIC ++ (pathname-type "foo.") @result{} "" ++ (pathname-type "foo." :case :common) @result{} "" ++ (pathname-directory (parse-namestring "/foo/bar/baz.lisp") :case :local) ++@result{} (:ABSOLUTE "foo" "bar") ++ (pathname-directory (parse-namestring "/foo/bar/baz.lisp") :case :local) ++@result{} (:ABSOLUTE "FOO" "BAR") ++ (pathname-directory (parse-namestring "../baz.lisp")) ++@result{} (:RELATIVE :UP) ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/BAR/../Mum/baz")) ++@result{} (:ABSOLUTE "foo" "BAR" :UP "Mum") ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/BAR/../Mum/baz") :case :common) ++@result{} (:ABSOLUTE "FOO" "bar" :UP "Mum") ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/*/bar/baz.l")) ++@result{} (:ABSOLUTE "foo" :WILD "bar") ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/*/bar/baz.l") :case :common) ++@result{} (:ABSOLUTE "FOO" :WILD "BAR") ++ ++ ;; Symbolics LMFS ++ (pathname-directory (parse-namestring ">foo>**>bar>baz.lisp")) ++@result{} (:ABSOLUTE "foo" :WILD-INFERIORS "bar") ++ (pathname-directory (parse-namestring ">foo>*>bar>baz.lisp")) ++@result{} (:ABSOLUTE "foo" :WILD "bar") ++ (pathname-directory (parse-namestring ">foo>*>bar>baz.lisp") :case :common) ++@result{} (:ABSOLUTE "FOO" :WILD "BAR") ++ (pathname-device (parse-namestring ">foo>baz.lisp")) @result{} :UNSPECIFIC ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation} and the host @i{file system}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if its first argument is not a @i{pathname}. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node load-logical-pathname-translations, logical-pathname-translations, pathname-host, Filenames Dictionary ++@subsection load-logical-pathname-translations [Function] ++ ++@code{load-logical-pathname-translations} @i{host} @result{} @i{just-loaded} ++ ++@subsubheading Arguments and Values:: ++ ++@i{host}---a @i{string}. ++ ++@i{just-loaded}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Searches for and loads the definition of a @i{logical host} named @i{host}, ++if it is not already defined. ++The specific nature of the search is @i{implementation-defined}. ++ ++If the @i{host} is already defined, ++no attempt to find or load a definition is attempted, ++and @i{false} is returned. ++If the @i{host} is not already defined, ++but a definition is successfully found and loaded, ++@i{true} is returned. ++Otherwise, an error is signaled. ++ ++@subsubheading Examples:: ++ ++@example ++ (translate-logical-pathname "hacks:weather;barometer.lisp.newest") ++@t{ |> } Error: The logical host HACKS is not defined. ++ (load-logical-pathname-translations "HACKS") ++@t{ |> } ;; Loading SYS:SITE;HACKS.TRANSLATIONS ++@t{ |> } ;; Loading done. ++@result{} @i{true} ++ (translate-logical-pathname "hacks:weather;barometer.lisp.newest") ++@result{} #P"HELIUM:[SHARED.HACKS.WEATHER]BAROMETER.LSP;0" ++ (load-logical-pathname-translations "HACKS") ++@result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If no definition is found, an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@b{logical-pathname} ++ ++@subsubheading Notes:: ++ ++@i{Logical pathname} definitions will be created not just by ++@i{implementors} but also by @i{programmers}. As such, ++it is important that the search strategy be documented. ++For example, an @i{implementation} might define that the ++definition of a @i{host} is to be found in a file called ++``@i{host}.translations'' in some specifically named directory. ++ ++@node logical-pathname-translations, logical-pathname, load-logical-pathname-translations, Filenames Dictionary ++@subsection logical-pathname-translations [Accessor] ++ ++@code{logical-pathname-translations} @i{host} @result{} @i{translations} ++ ++(setf (@code{ logical-pathname-translations} @i{host}) new-translations)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{host}--a @i{logical host designator}. ++ ++@i{translations}, @i{new-translations}---a @i{list}. ++ ++@subsubheading Description:: ++ ++Returns the host's @i{list} of translations. ++Each translation is a @i{list} of at least two elements: ++@i{from-wildcard} and @i{to-wildcard}. Any ++ additional elements are @i{implementation-defined}. ++@i{From-wildcard} is a ++ @i{logical pathname} whose host is @i{host}. ++@i{To-wildcard} is a @i{pathname}. ++ ++[Reviewer Note by Laddaga: Can this be a logical pathname?] ++ ++@t{(setf (logical-pathname-translations @i{host}) @i{translations})} sets a ++@i{logical pathname} host's ++@i{list} of @i{translations}. If @i{host} ++is a @i{string} that has ++ not been previously used as ++a @i{logical pathname} host, a new ++@i{logical pathname} host is defined; ++otherwise an existing host's translations are ++ replaced. @i{logical pathname} host names are compared with @b{string-equal}. ++ ++ When setting the translations list, each @i{from-wildcard} ++can be a @i{logical pathname} whose ++host is @i{host} or a @i{logical pathname} namestring ++ parseable by @t{(parse-namestring @i{string} @i{host})}, ++where @i{host} ++ represents the appropriate @i{object} as defined ++by @b{parse-namestring}. Each ++ @i{to-wildcard} can be anything coercible to a ++@i{pathname} by ++ @t{(pathname @i{to-wildcard})}. ++If @i{to-wildcard} coerces to a @i{logical pathname}, ++@b{translate-logical-pathname} ++will perform repeated translation steps when ++ it uses it. ++ ++@i{host} is either the host component of a ++@i{logical pathname} or a ++ @i{string} that has been defined ++as a @i{logical pathname} host name by @b{setf} of ++@b{logical-pathname-translations}. ++ ++@subsubheading Examples:: ++ ++[Reviewer Note by Laddaga: Shouldn't there be some @t{*.*}'s in the list ++ of translations for @t{PROG} below?] ++ ++@example ++ ;;;A very simple example of setting up a logical pathname host. No ++ ;;;translations are necessary to get around file system restrictions, so ++ ;;;all that is necessary is to specify the root of the physical directory ++ ;;;tree that contains the logical file system. ++ ;;;The namestring syntax on the right-hand side is implementation-dependent. ++ (setf (logical-pathname-translations "foo") ++ '(("**;*.*.*" "MY-LISPM:>library>foo>**>"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "foo:bar;baz;mum.quux.3") ++@result{} #P"MY-LISPM:>library>foo>bar>baz>mum.quux.3" ++ ++ ;;;A more complex example, dividing the files among two file servers ++ ;;;and several different directories. This Unix doesn't support ++ ;;;:WILD-INFERIORS in the directory, so each directory level must ++ ;;;be translated individually. No file name or type translations ++ ;;;are required except for .MAIL to .MBX. ++ ;;;The namestring syntax on the right-hand side is implementation-dependent. ++ (setf (logical-pathname-translations "prog") ++ '(("RELEASED;*.*.*" "MY-UNIX:/sys/bin/my-prog/") ++ ("RELEASED;*;*.*.*" "MY-UNIX:/sys/bin/my-prog/*/") ++ ("EXPERIMENTAL;*.*.*" "MY-UNIX:/usr/Joe/development/prog/") ++ ("EXPERIMENTAL;DOCUMENTATION;*.*.*" ++ "MY-VAX:SYS$DISK:[JOE.DOC]") ++ ("EXPERIMENTAL;*;*.*.*" "MY-UNIX:/usr/Joe/development/prog/*/") ++ ("MAIL;**;*.MAIL" "MY-VAX:SYS$DISK:[JOE.MAIL.PROG...]*.MBX"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:mail;save;ideas.mail.3") ++@result{} #P"MY-VAX:SYS$DISK:[JOE.MAIL.PROG.SAVE]IDEAS.MBX.3" ++ ++ ;;;Example translations for a program that uses three files main.lisp, ++ ;;;auxiliary.lisp, and documentation.lisp. These translations might be ++ ;;;supplied by a software supplier as examples. ++ ++ ;;;For Unix with long file names ++ (setf (logical-pathname-translations "prog") ++ '(("CODE;*.*.*" "/lib/prog/"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++@result{} #P"/lib/prog/documentation.lisp" ++ ++ ;;;For Unix with 14-character file names, using .lisp as the type ++ (setf (logical-pathname-translations "prog") ++ '(("CODE;DOCUMENTATION.*.*" "/lib/prog/docum.*") ++ ("CODE;*.*.*" "/lib/prog/"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++@result{} #P"/lib/prog/docum.lisp" ++ ++ ;;;For Unix with 14-character file names, using .l as the type ++ ;;;The second translation shortens the compiled file type to .b ++ (setf (logical-pathname-translations "prog") ++ `(("**;*.LISP.*" ,(logical-pathname "PROG:**;*.L.*")) ++ (,(compile-file-pathname (logical-pathname "PROG:**;*.LISP.*")) ++ ,(logical-pathname "PROG:**;*.B.*")) ++ ("CODE;DOCUMENTATION.*.*" "/lib/prog/documentatio.*") ++ ("CODE;*.*.*" "/lib/prog/"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++@result{} #P"/lib/prog/documentatio.l" ++ ++ ;;;For a Cray with 6 character names and no directories, types, or versions. ++ (setf (logical-pathname-translations "prog") ++ (let ((l '(("MAIN" "PGMN") ++ ("AUXILIARY" "PGAUX") ++ ("DOCUMENTATION" "PGDOC"))) ++ (logpath (logical-pathname "prog:code;")) ++ (phypath (pathname "XXX"))) ++ (append ++ ;; Translations for source files ++ (mapcar #'(lambda (x) ++ (let ((log (first x)) ++ (phy (second x))) ++ (list (make-pathname :name log ++ :type "LISP" ++ :version :wild ++ :defaults logpath) ++ (make-pathname :name phy ++ :defaults phypath)))) ++ l) ++ ;; Translations for compiled files ++ (mapcar #'(lambda (x) ++ (let* ((log (first x)) ++ (phy (second x)) ++ (com (compile-file-pathname ++ (make-pathname :name log ++ :type "LISP" ++ :version :wild ++ :defaults logpath)))) ++ (setq phy (concatenate 'string phy "B")) ++ (list com ++ (make-pathname :name phy ++ :defaults phypath)))) ++ l)))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++@result{} #P"PGDOC" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{host} is incorrectly supplied, ++an error of @i{type} @b{type-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@b{logical-pathname}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++Implementations can define additional @i{functions} ++that operate on @i{logical pathname} hosts, ++for example to specify additional translation rules or options. ++ ++@node logical-pathname, *default-pathname-defaults*, logical-pathname-translations, Filenames Dictionary ++@subsection logical-pathname [Function] ++ ++@code{logical-pathname} @i{pathspec} @result{} @i{logical-pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{logical pathname}, ++ a @i{logical pathname} @i{namestring}, ++ or a @i{stream}. ++ ++@i{logical-pathname}---a @i{logical pathname}. ++ ++@subsubheading Description:: ++ ++@b{logical-pathname} converts @i{pathspec} to a ++@i{logical pathname} and returns the new @i{logical pathname}. ++If @i{pathspec} is a @i{logical pathname} @i{namestring}, ++it should contain a host component and its following @i{colon}. ++If @i{pathspec} is a @i{stream}, it should be one ++for which @b{pathname} returns a @i{logical pathname}. ++ ++If @i{pathspec} is a @i{stream}, the @i{stream} can be either open or closed. ++@b{logical-pathname} returns the same @i{logical pathname} after a ++file is closed as it did when the file was open. ++ ++It is an error if @i{pathspec} is a @i{stream} that is ++created with ++ @b{make-two-way-stream}, ++ @b{make-echo-stream}, ++ @b{make-broadcast-stream}, ++ @b{make-concatenated-stream}, ++ @b{make-string-input-stream}, ++or ++ @b{make-string-output-stream}. ++ ++@subsubheading Exceptional Situations:: ++ ++Signals an error of @i{type} @b{type-error} if @i{pathspec} isn't supplied correctly. ++ ++@subsubheading See Also:: ++ ++@b{logical-pathname}, ++@ref{translate-logical-pathname} ++, ++@ref{Logical Pathnames} ++ ++@node *default-pathname-defaults*, namestring, logical-pathname, Filenames Dictionary ++@subsection *default-pathname-defaults* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{pathname} @i{object}. ++ ++@subsubheading Initial Value:: ++ ++An @i{implementation-dependent} @i{pathname}, ++typically in the working directory that was current when @r{Common Lisp} was started up. ++ ++@subsubheading Description:: ++ ++a @i{pathname}, used as the default whenever a @i{function} ++needs a default @i{pathname} and one is not supplied. ++ ++@subsubheading Examples:: ++@example ++ ;; This example illustrates a possible usage for a hypothetical Lisp running on a ++ ;; DEC TOPS-20 file system. Since pathname conventions vary between Lisp ++ ;; implementations and host file system types, it is not possible to provide a ++ ;; general-purpose, conforming example. ++ *default-pathname-defaults* @result{} #P"PS:" ++ (merge-pathnames (make-pathname :name "CALENDAR")) ++@result{} #P"PS:CALENDAR" ++ (let ((*default-pathname-defaults* (pathname ""))) ++ (merge-pathnames (make-pathname :name "CALENDAR"))) ++@result{} #P"CALENDAR" ++@end example ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@node namestring, parse-namestring, *default-pathname-defaults*, Filenames Dictionary ++@subsection namestring, file-namestring, directory-namestring, ++@subheading host-namestring, enough-namestring ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{namestring} @i{pathname} @result{} @i{namestring} ++ ++@code{file-namestring} @i{pathname} @result{} @i{namestring} ++ ++@code{directory-namestring} @i{pathname} @result{} @i{namestring} ++ ++@code{host-namestring} @i{pathname} @result{} @i{namestring} ++ ++@code{enough-namestring} @i{pathname @r{&optional} defaults} @result{} @i{namestring} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}. ++ ++@i{defaults}---a @i{pathname designator}. ++ ++ The default is the @i{value} of @b{*default-pathname-defaults*}. ++ ++@i{namestring}---a @i{string} or @b{nil}. ++ ++[Editorial Note by KMP: Under what circumstances can NIL be returned??] ++ ++@subsubheading Description:: ++ ++These functions convert @i{pathname} into a namestring. ++The name represented by @i{pathname} is returned as a @i{namestring} ++in an @i{implementation-dependent} canonical form. ++ ++@b{namestring} returns the full form of @i{pathname}. ++ ++@b{file-namestring} returns just the name, type, and version ++ components of @i{pathname}. ++ ++@b{directory-namestring} returns the directory name portion. ++ ++@b{host-namestring} returns the host name. ++ ++@b{enough-namestring} returns an abbreviated namestring ++ that is just sufficient to identify the file named by @i{pathname} ++ when considered relative to the @i{defaults}. ++ It is required that ++ ++@example ++ (merge-pathnames (enough-namestring pathname defaults) defaults) ++@equiv{} (merge-pathnames (parse-namestring pathname nil defaults) defaults) ++@end example ++ ++in all cases, and the result of @b{enough-namestring} is ++the shortest reasonable @i{string} that will satisfy this criterion. ++ ++It is not necessarily possible to construct a valid @i{namestring} ++by concatenating some of the three shorter @i{namestrings} in some order. ++ ++@subsubheading Examples:: ++ ++@example ++ (namestring "getty") ++@result{} "getty" ++ (setq q (make-pathname :host "kathy" ++ :directory ++ (pathname-directory *default-pathname-defaults*) ++ :name "getty")) ++@result{} #S(PATHNAME :HOST "kathy" :DEVICE NIL :DIRECTORY @i{directory-name} ++ :NAME "getty" :TYPE NIL :VERSION NIL) ++ (file-namestring q) @result{} "getty" ++ (directory-namestring q) @result{} @i{directory-name} ++ (host-namestring q) @result{} "kathy" ++@end example ++ ++@example ++ ;;;Using Unix syntax and the wildcard conventions used by the ++ ;;;particular version of Unix on which this example was created: ++ (namestring ++ (translate-pathname "/usr/dmr/hacks/frob.l" ++ "/usr/d*/hacks/*.l" ++ "/usr/d*/backup/hacks/backup-*.*")) ++@result{} "/usr/dmr/backup/hacks/backup-frob.l" ++ (namestring ++ (translate-pathname "/usr/dmr/hacks/frob.l" ++ "/usr/d*/hacks/fr*.l" ++ "/usr/d*/backup/hacks/backup-*.*")) ++@result{} "/usr/dmr/backup/hacks/backup-ob.l" ++ ++ ;;;This is similar to the above example but uses two different hosts, ++ ;;;U: which is a Unix and V: which is a VMS. Note the translation ++ ;;;of file type and alphabetic case conventions. ++ (namestring ++ (translate-pathname "U:/usr/dmr/hacks/frob.l" ++ "U:/usr/d*/hacks/*.l" ++ "V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*")) ++@result{} "V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-FROB.LSP" ++ (namestring ++ (translate-pathname "U:/usr/dmr/hacks/frob.l" ++ "U:/usr/d*/hacks/fr*.l" ++ "V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*")) ++@result{} "V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-OB.LSP" ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{truename} ++, ++@ref{merge-pathnames} ++, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node parse-namestring, wild-pathname-p, namestring, Filenames Dictionary ++@subsection parse-namestring [Function] ++ ++@code{parse-namestring} @i{thing @r{&optional} host default-pathname @r{&key} start end junk-allowed}@* ++ @result{} @i{pathname, position} ++ ++@subsubheading Arguments and Values:: ++ ++@i{thing}---a @i{string}, ++ a @i{pathname}, ++ or a @i{stream associated with a file}. ++ ++@i{host}---a @i{valid pathname host}, a @i{logical host}, or @b{nil}. ++ ++@i{default-pathname}---a @i{pathname designator}. ++ The default is the @i{value} of @b{*default-pathname-defaults*}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{thing}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{junk-allowed}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{pathname}---a @i{pathname}, or @b{nil}. ++ ++@i{position}---a @i{bounding index designator} for @i{thing}. ++ ++@subsubheading Description:: ++ ++Converts @i{thing} into a @i{pathname}. ++ ++The @i{host} supplies a host name with respect to which the parsing occurs. ++ ++If @i{thing} is a @i{stream associated with a file}, ++processing proceeds as if the @i{pathname} used to open that @i{file} ++had been supplied instead. ++ ++If @i{thing} is a @i{pathname}, ++the @i{host} and the host component of @i{thing} are compared. ++If they match, ++two values are immediately returned: @i{thing} and @i{start}; ++otherwise (if they do not match), an error is signaled. ++ ++Otherwise (if @i{thing} is a @i{string}), ++@b{parse-namestring} parses the name of a @i{file} within ++the substring of @i{thing} bounded by @i{start} and @i{end}. ++ ++If @i{thing} is a @i{string} then ++the substring of @i{thing} @i{bounded} by @i{start} and @i{end} ++is parsed into a @i{pathname} ++as follows: ++ ++@table @asis ++ ++@item @t{*} ++If @i{host} is a @i{logical host} then @i{thing} is parsed ++ as a @i{logical pathname} @i{namestring} ++ on the @i{host}. ++ ++@item @t{*} ++If @i{host} is @b{nil} and @i{thing} is a syntactically valid ++ @i{logical pathname} @i{namestring} containing an explicit host, ++ then it is parsed as a @i{logical pathname} @i{namestring}. ++ ++@item @t{*} ++If @i{host} is @b{nil}, ++ @i{default-pathname} is a @i{logical pathname}, ++ and @i{thing} is a syntactically valid @i{logical pathname} @i{namestring} ++ without an explicit host, ++ then it is parsed as a @i{logical pathname} @i{namestring} ++ on the host that is the host component of @i{default-pathname}. ++ ++@item @t{*} ++Otherwise, the parsing of @i{thing} is @i{implementation-defined}. ++ ++@end table ++ ++In the first ++of these ++cases, ++the host portion of the @i{logical pathname} namestring ++and its following @i{colon} are optional. ++ ++If the host portion of the namestring and @i{host} ++are both present and do not match, ++an error is signaled. ++ ++If @i{junk-allowed} is @i{true}, ++then the @i{primary value} is the @i{pathname} parsed ++or, if no syntactically correct @i{pathname} was seen, @b{nil}. ++If @i{junk-allowed} is @i{false}, ++then the entire substring is scanned, ++and the @i{primary value} is the @i{pathname} parsed. ++ ++In either case, the @i{secondary value} ++is the index into @i{thing} of the delimiter that terminated the parse, ++or the index beyond the substring if the parse terminated at the end of the substring ++ (as will always be the case if @i{junk-allowed} is @i{false}). ++ ++Parsing a @i{null} @i{string} always succeeds, ++producing a @i{pathname} with all components (except the host) equal to @b{nil}. ++ ++If @i{thing} contains an explicit host name and no explicit device name, ++then it is @i{implementation-defined} whether @b{parse-namestring} ++will supply the standard default device for that host as the device component ++of the resulting @i{pathname}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq q (parse-namestring "test")) ++@result{} #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" ++ :TYPE NIL :VERSION NIL) ++ (pathnamep q) @result{} @i{true} ++ (parse-namestring "test") ++@result{} #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" ++ :TYPE NIL :VERSION NIL), 4 ++ (setq s (open @i{xxx})) @result{} # ++ (parse-namestring s) ++@result{} #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME @i{xxx} ++ :TYPE NIL :VERSION NIL), 0 ++ (parse-namestring "test" nil nil :start 2 :end 4 ) ++ @result{} #S(PATHNAME ...), 15 ++ (parse-namestring "foo.lisp") ++@result{} #P"foo.lisp" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{junk-allowed} is @i{false}, ++an error of @i{type} @b{parse-error} is signaled if @i{thing} ++does not consist entirely of the representation of a @i{pathname}, ++possibly surrounded on either side by @i{whitespace}_1 characters if that is ++appropriate to the cultural conventions of the implementation. ++ ++If @i{host} is supplied and not @b{nil}, ++and @i{thing} contains a manifest host name, ++an error of @i{type} @b{error} is signaled if the hosts do not match. ++ ++If @i{thing} is a @i{logical pathname} namestring ++and if the host portion of the namestring and @i{host} ++are both present and do not match, ++an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{->UNSPECIFIC as a Component Value}, ++ ++@ref{Pathnames as Filenames} ++ ++@node wild-pathname-p, pathname-match-p, parse-namestring, Filenames Dictionary ++@subsection wild-pathname-p [Function] ++ ++@code{wild-pathname-p} @i{pathname @r{&optional} field-key} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}. ++ ++@i{Field-key}---one of @t{:host}, ++ @t{:device} ++ @t{:directory}, ++ @t{:name}, ++ @t{:type}, ++ @t{:version}, ++ or @b{nil}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{wild-pathname-p} tests @i{pathname} for the presence of wildcard components. ++ ++If @i{pathname} is a @i{pathname} (as returned by @b{pathname}) ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++ ++If @i{field-key} is not supplied or @b{nil}, @b{wild-pathname-p} ++returns true if @i{pathname} has any wildcard components, @b{nil} ++if @i{pathname} has none. ++If @i{field-key} is @i{non-nil}, @b{wild-pathname-p} ++returns true if the indicated component of @i{pathname} is a wildcard, ++@b{nil} if the component is not a wildcard. ++ ++@subsubheading Examples:: ++@example ++ ;;;The following examples are not portable. They are written to run ++ ;;;with particular file systems and particular wildcard conventions. ++ ;;;Other implementations will behave differently. These examples are ++ ;;;intended to be illustrative, not to be prescriptive. ++ ++ (wild-pathname-p (make-pathname :name :wild)) @result{} @i{true} ++ (wild-pathname-p (make-pathname :name :wild) :name) @result{} @i{true} ++ (wild-pathname-p (make-pathname :name :wild) :type) @result{} @i{false} ++ (wild-pathname-p (pathname "s:>foo>**>")) @result{} @i{true} ;Lispm ++ (wild-pathname-p (pathname :name "F*O")) @result{} @i{true} ;Most places ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{pathname} is not a @i{pathname}, a @i{string}, ++or a @i{stream associated with a file} an error of @i{type} @b{type-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++Not all implementations support wildcards in all fields. ++See @ref{->WILD as a Component Value} and @ref{Restrictions on Wildcard Pathnames}. ++ ++@node pathname-match-p, translate-logical-pathname, wild-pathname-p, Filenames Dictionary ++@subsection pathname-match-p [Function] ++ ++@code{pathname-match-p} @i{pathname wildcard} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}. ++ ++@i{wildcard}---a @i{designator} for a @i{wild} @i{pathname}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{pathname-match-p} returns true if ++@i{pathname} matches @i{wildcard}, otherwise @b{nil}. The ++matching rules are @i{implementation-defined} but should be consistent with ++@b{directory}. Missing components of @i{wildcard} default to @t{:wild}. ++ ++It is valid for @i{pathname} to be a wild @i{pathname}; ++a wildcard field in @i{pathname} only matches a ++wildcard field in @i{wildcard} (@i{i.e.}, @b{pathname-match-p} is not commutative). ++It is valid for @i{wildcard} to be a non-wild @i{pathname}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{pathname} or @i{wildcard} is not a @i{pathname}, @i{string}, ++or @i{stream associated with a file} an error of @i{type} @b{type-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{directory} ++, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node translate-logical-pathname, translate-pathname, pathname-match-p, Filenames Dictionary ++@subsection translate-logical-pathname [Function] ++ ++@code{translate-logical-pathname} @i{pathname @r{&key}} @result{} @i{physical-pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}, ++ or a @i{logical pathname} @i{namestring}. ++ ++@i{physical-pathname}---a @i{physical pathname}. ++ ++@subsubheading Description:: ++ ++Translates @i{pathname} to a @i{physical pathname}, which it returns. ++ ++If @i{pathname} is a @i{stream}, the ++@i{stream} can be either open or closed. ++@b{translate-logical-pathname} returns the same ++physical pathname after a ++ file is closed as it did when the file was open. ++ ++It is an error if @i{pathname} is a @i{stream} that is ++created with @b{make-two-way-stream}, ++@b{make-echo-stream}, ++@b{make-broadcast-stream}, ++@b{make-concatenated-stream}, @b{make-string-input-stream}, ++@b{make-string-output-stream}. ++ ++If @i{pathname} is a @i{logical pathname} namestring, ++the host portion of the ++@i{logical pathname} namestring and its following @i{colon} are required. ++ ++@i{Pathname} is first coerced to a @i{pathname}. ++If the coerced @i{pathname} is a physical pathname, it is returned. ++If the coerced @i{pathname} is a @i{logical pathname}, ++the first matching translation (according to @b{pathname-match-p}) ++of the @i{logical pathname} host is applied, as if by calling ++@b{translate-pathname}. If the result is ++ a @i{logical pathname}, this process is repeated. ++When the result is ++ finally a physical pathname, it is returned. ++ If no translation matches, an error ++is signaled. ++ ++@b{translate-logical-pathname} might perform additional translations, ++ typically to provide translation of file types to local naming ++ conventions, to accomodate physical file systems with limited length ++ names, or to deal with special character requirements such as ++ translating hyphens to underscores or uppercase letters to lowercase. ++ Any such additional translations are @i{implementation-defined}. Some ++ implementations do no additional translations. ++ ++ There are no specified keyword arguments for ++@b{translate-logical-pathname}, ++but implementations are permitted to extend ++ it by adding keyword arguments. ++ ++@subsubheading Examples:: ++ ++See @b{logical-pathname-translations}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{pathname} is incorrectly supplied, an error of @i{type} @b{type-error} is signaled. ++ ++If no translation matches, an error of @i{type} @b{file-error} is signaled. ++ ++[Editorial Note by KMP: Is file-error really right, or should it be pathname-error?] ++ ++@subsubheading See Also:: ++ ++@ref{logical-pathname} ++, ++@ref{logical-pathname-translations} ++, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node translate-pathname, merge-pathnames, translate-logical-pathname, Filenames Dictionary ++@subsection translate-pathname [Function] ++ ++@code{translate-pathname} @i{source from-wildcard to-wildcard @r{&key}}@* ++ @result{} @i{translated-pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{source}---a @i{pathname designator}. ++ ++@i{from-wildcard}---a @i{pathname designator}. ++ ++@i{to-wildcard}---a @i{pathname designator}. ++ ++@i{translated-pathname}---a @i{pathname}. ++ ++@subsubheading Description:: ++ ++@b{translate-pathname} translates @i{source} ++(that matches @i{from-wildcard}) into a corresponding @i{pathname} ++that matches @i{to-wildcard}, and returns the corresponding @i{pathname}. ++ ++The resulting @i{pathname} is @i{to-wildcard} with each wildcard or missing ++field replaced by a portion of @i{source}. A ``wildcard field'' is a ++@i{pathname} component with a value of @t{:wild}, a @t{:wild} element of a ++@i{list}-valued directory component, or an @i{implementation-defined} portion ++of a component, such as the @t{"*"} in the complex wildcard string ++@t{"foo*bar"} that some implementations support. An implementation that ++adds other wildcard features, such as regular expressions, must define ++how @b{translate-pathname} extends to those features. ++A ``missing field'' is a @i{pathname} component with a value of @b{nil}. ++ ++ The portion of @i{source} ++that is copied into the resulting @i{pathname} is ++@i{implementation-defined}. Typically ++it is determined by the user interface conventions ++ of the file systems involved. Usually it is the portion of @i{source} ++ that matches a wildcard field of ++@i{from-wildcard} that is in the same ++ position as the wildcard or missing field of ++@i{to-wildcard}. If there ++ is no wildcard field in ++@i{from-wildcard} at that position, then usually ++ it is the entire corresponding ++@i{pathname} component of @i{source}, or in ++ the case of a ++@i{list}-valued directory component, the entire corresponding ++ @i{list} element. ++ ++ During the copying of a portion of @i{source} into ++the resulting @i{pathname}, additional ++ @i{implementation-defined} translations of @i{case} or file naming ++ conventions might occur, especially when ++@i{from-wildcard} and ++ @i{to-wildcard} are for different hosts. ++ ++It is valid for ++ @i{source} to be a wild ++@i{pathname}; in general this will produce a wild ++ result. It ++is valid for @i{from-wildcard} and/or @i{to-wildcard} to be ++ non-wild @i{pathnames}. ++ ++ There are no specified keyword arguments for ++@b{translate-pathname}, but ++ implementations are permitted to extend it by adding keyword arguments. ++ ++@b{translate-pathname} maps customary case in ++@i{source} into customary case in the output @i{pathname}. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; The results of the following five forms are all implementation-dependent. ++ ;; The second item in particular is shown with multiple results just to ++ ;; emphasize one of many particular variations which commonly occurs. ++ (pathname-name (translate-pathname "foobar" "foo*" "*baz")) @result{} "barbaz" ++ (pathname-name (translate-pathname "foobar" "foo*" "*")) ++@result{} "foobar" ++@i{OR}@result{} "bar" ++ (pathname-name (translate-pathname "foobar" "*" "foo*")) @result{} "foofoobar" ++ (pathname-name (translate-pathname "bar" "*" "foo*")) @result{} "foobar" ++ (pathname-name (translate-pathname "foobar" "foo*" "baz*")) @result{} "bazbar" ++ ++ (defun translate-logical-pathname-1 (pathname rules) ++ (let ((rule (assoc pathname rules :test #'pathname-match-p))) ++ (unless rule (error "No translation rule for ~A" pathname)) ++ (translate-pathname pathname (first rule) (second rule)))) ++ (translate-logical-pathname-1 "FOO:CODE;BASIC.LISP" ++ '(("FOO:DOCUMENTATION;" "MY-UNIX:/doc/foo/") ++ ("FOO:CODE;" "MY-UNIX:/lib/foo/") ++ ("FOO:PATCHES;*;" "MY-UNIX:/lib/foo/patch/*/"))) ++@result{} #P"MY-UNIX:/lib/foo/basic.l" ++ ++;;;This example assumes one particular set of wildcard conventions ++;;;Not all file systems will run this example exactly as written ++ (defun rename-files (from to) ++ (dolist (file (directory from)) ++ (rename-file file (translate-pathname file from to)))) ++ (rename-files "/usr/me/*.lisp" "/dev/her/*.l") ++ ;Renames /usr/me/init.lisp to /dev/her/init.l ++ (rename-files "/usr/me/pcl*/*" "/sys/pcl/*/") ++ ;Renames /usr/me/pcl-5-may/low.lisp to /sys/pcl/pcl-5-may/low.lisp ++ ;In some file systems the result might be /sys/pcl/5-may/low.lisp ++ (rename-files "/usr/me/pcl*/*" "/sys/library/*/") ++ ;Renames /usr/me/pcl-5-may/low.lisp to /sys/library/pcl-5-may/low.lisp ++ ;In some file systems the result might be /sys/library/5-may/low.lisp ++ (rename-files "/usr/me/foo.bar" "/usr/me2/") ++ ;Renames /usr/me/foo.bar to /usr/me2/foo.bar ++ (rename-files "/usr/joe/*-recipes.text" "/usr/jim/cookbook/joe's-*-rec.text") ++ ;Renames /usr/joe/lamb-recipes.text to /usr/jim/cookbook/joe's-lamb-rec.text ++ ;Renames /usr/joe/pork-recipes.text to /usr/jim/cookbook/joe's-pork-rec.text ++ ;Renames /usr/joe/veg-recipes.text to /usr/jim/cookbook/joe's-veg-rec.text ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If any of @i{source}, @i{from-wildcard}, or @i{to-wildcard} ++is not a @i{pathname}, a @i{string}, or a @i{stream associated with a file} ++an error of @i{type} @b{type-error} is signaled. ++ ++@t{(pathname-match-p @i{source from-wildcard})} must ++be true or an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{namestring} ++, ++@ref{pathname-host} ++, ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++The exact behavior of @b{translate-pathname} cannot be dictated ++by the @r{Common Lisp} language and must be allowed to vary, depending on the ++user interface conventions of the file systems involved. ++ ++The following is an implementation guideline. ++One file system performs this operation by ++ examining each piece of the three ++@i{pathnames} in turn, where a piece is a ++ @i{pathname} component or a ++@i{list} element of a structured component such as ++ a hierarchical directory. Hierarchical directory elements in ++ @i{from-wildcard} and ++@i{to-wildcard} are matched by whether they are ++ wildcards, not by depth in the directory hierarchy. If the piece in ++@i{to-wildcard} is present and not wild, it is copied into the result. ++ If the piece in @i{to-wildcard} is ++@t{:wild} or @b{nil}, the piece in @i{source} is ++ copied into the result. Otherwise, the piece in ++@i{to-wildcard} might be ++ a complex wildcard such as @t{"foo*bar"} and the piece in ++@i{from-wildcard} ++ should be wild; the portion of the piece in ++@i{source} that matches the ++ wildcard portion of the piece in ++@i{from-wildcard} replaces the wildcard ++ portion of the piece in ++@i{to-wildcard} and the value produced is used in ++ the result. ++ ++@node merge-pathnames, , translate-pathname, Filenames Dictionary ++@subsection merge-pathnames [Function] ++ ++@code{merge-pathnames} @i{pathname @r{&optional} default-pathname default-version}@* ++ @result{} @i{merged-pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}. ++ ++@i{default-pathname}---a @i{pathname designator}. ++ ++ The default is the @i{value} of @b{*default-pathname-defaults*}. ++ ++@i{default-version}---a @i{valid pathname version}. ++ ++ The default is @t{:newest}. ++ ++@i{merged-pathname}---a @i{pathname}. ++ ++@subsubheading Description:: ++ ++Constructs a @i{pathname} from @i{pathname} ++by filling in any unsupplied components with the corresponding values ++from @i{default-pathname} and @i{default-version}. ++ ++Defaulting of pathname components ++is done by filling in components taken from another @i{pathname}. ++ ++This is especially useful for cases such as ++a program that has an input file and an output file. ++Unspecified components of the output pathname will come from the input pathname, ++except that the type should not default ++to the type of the input pathname ++but rather to the appropriate default type for output from the program; ++for example, see the @i{function} @b{compile-file-pathname}. ++ ++If no version is supplied, @i{default-version} is used. ++If @i{default-version} is @b{nil}, the version component will remain unchanged. ++ ++If @i{pathname} explicitly specifies a host and not a device, and ++if the host component of @i{default-pathname} matches the host component ++of @i{pathname}, then the device is taken from the @i{default-pathname}; ++otherwise the device will be the default file device for that host. If ++@i{pathname} does not specify a host, device, directory, name, ++or type, each such component is copied from @i{default-pathname}. ++If @i{pathname} does not specify a name, then the version, if not provided, will ++come from @i{default-pathname}, just like the other components. If ++@i{pathname} does specify a name, then the version is not affected ++by @i{default-pathname}. If this process leaves the ++version missing, the @i{default-version} is used. ++If the host's file name syntax provides a way ++to input a version without a name or type, the user can let the name ++and type default but supply a version different from the one in @i{default-pathname}. ++ ++If @i{pathname} is a @i{stream}, @i{pathname} effectively ++becomes @t{(pathname @i{pathname})}. @b{merge-pathnames} ++can be used on either an open or a closed @i{stream}. ++ ++If @i{pathname} is a @i{pathname} ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++ ++@b{merge-pathnames} recognizes a @i{logical pathname} @i{namestring} ++ when @i{default-pathname} is a @i{logical pathname}, ++ ++or when the @i{namestring} begins with ++ the name of a defined @i{logical host} followed by a @i{colon}. ++In the first of these two cases, ++ ++the host portion of the @i{logical pathname} @i{namestring} ++and its following @i{colon} are optional. ++ ++@b{merge-pathnames} returns a ++@i{logical pathname} if and only if ++ its first argument is a @i{logical pathname}, ++ ++or its first argument is a @i{logical pathname} @i{namestring} with an explicit host, ++or its first argument does not specify a host ++ and the @i{default-pathname} is a @i{logical pathname}. ++ ++@i{Pathname} merging treats a relative directory specially. ++If @t{(pathname-directory @i{pathname})} is a @i{list} whose ++@i{car} is @t{:relative}, and ++@t{(pathname-directory @i{default-pathname})} is a @i{list}, then ++the merged directory is the value of ++ ++@example ++ (append (pathname-directory @i{default-pathname}) ++ (cdr ;remove :relative from the front ++ (pathname-directory @i{pathname}))) ++@end example ++ ++except that if the resulting @i{list} contains a @i{string} or @t{:wild} ++immediately followed by @t{:back}, both of them are removed. This removal of ++redundant @t{:back} @i{keywords} is repeated as many times as possible. ++If @t{(pathname-directory @i{default-pathname})} is not a @i{list} or ++@t{(pathname-directory @i{pathname})} is not a @i{list} ++whose @i{car} is @t{:relative}, the merged directory is ++@t{(or (pathname-directory @i{pathname}) (pathname-directory @i{default-pathname}))} ++ ++@b{merge-pathnames} maps customary case in @i{pathname} ++into customary case in the output @i{pathname}. ++ ++@subsubheading Examples:: ++@example ++ (merge-pathnames "CMUC::FORMAT" ++ "CMUC::PS:.FASL") ++@result{} #P"CMUC::PS:FORMAT.FASL.0" ++@end example ++ ++@subsubheading See Also:: ++ ++@b{*default-pathname-defaults*}, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++The net effect ++is that if just a name is supplied, ++the host, device, directory, and type will come from @i{default-pathname}, ++but the version will come from @i{default-version}. ++If nothing or just a directory is supplied, ++the name, type, and version will come from @i{default-pathname} together. ++ ++@c end of including dict-pathnames ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-2.texi +@@ -0,0 +1,2560 @@ ++ ++ ++@node Syntax, Evaluation and Compilation, Introduction (Introduction), Top ++@chapter Syntax ++ ++@menu ++* Character Syntax:: ++* Reader Algorithm:: ++* Interpretation of Tokens:: ++* Standard Macro Characters:: ++@end menu ++ ++@node Character Syntax, Reader Algorithm, Syntax, Syntax ++@section Character Syntax ++ ++@c including concept-syntax ++ ++The @i{Lisp reader} takes @i{characters} from a @i{stream}, ++interprets them as a printed representation of an @i{object}, ++constructs that @i{object}, and returns it. ++ ++The syntax described by this chapter is called the @i{standard syntax} ++@IGindex standard syntax ++. ++Operations are provided by @r{Common Lisp} so that ++various aspects of the syntax information represented by a @i{readtable} ++can be modified under program control; see @ref{Reader}. ++Except as explicitly stated otherwise, ++the syntax used throughout this document is @i{standard syntax}. ++ ++@menu ++* Readtables:: ++* Variables that affect the Lisp Reader:: ++* Standard Characters:: ++* Character Syntax Types:: ++@end menu ++ ++@node Readtables, Variables that affect the Lisp Reader, Character Syntax, Character Syntax ++@subsection Readtables ++ ++Syntax information for use by the @i{Lisp reader} is embodied in an ++@i{object} called a @i{readtable} ++@IGindex readtable ++. Among other things, ++the @i{readtable} contains the association between @i{characters} ++and @i{syntax types}. ++ ++Figure 2--1 lists some @i{defined names} that are applicable to ++@i{readtables}. ++ ++@format ++@group ++@noindent ++@w{ *readtable* readtable-case } ++@w{ copy-readtable readtablep } ++@w{ get-dispatch-macro-character set-dispatch-macro-character } ++@w{ get-macro-character set-macro-character } ++@w{ make-dispatch-macro-character set-syntax-from-char } ++ ++@noindent ++@w{ Figure 2--1: Readtable defined names } ++ ++@end group ++@end format ++ ++@menu ++* The Current Readtable:: ++* The Standard Readtable:: ++* The Initial Readtable:: ++@end menu ++ ++@node The Current Readtable, The Standard Readtable, Readtables, Readtables ++@subsubsection The Current Readtable ++ ++Several @i{readtables} describing different syntaxes can exist, ++but at any given time only one, called the @i{current readtable} ++@IGindex current readtable ++, ++affects the way in which @i{expressions}_2 are parsed ++into @i{objects} by the @i{Lisp reader}. ++The @i{current readtable} in a given @i{dynamic environment} ++is the @i{value} of @b{*readtable*} in that @i{environment}. ++To make a different @i{readtable} become the @i{current readtable}, ++@b{*readtable*} can be @i{assigned} or @i{bound}. ++ ++@node The Standard Readtable, The Initial Readtable, The Current Readtable, Readtables ++@subsubsection The Standard Readtable ++ ++The @i{standard readtable} ++@IGindex standard readtable ++ conforms to @i{standard syntax}. ++The consequences are undefined if an attempt is made ++to modify the @i{standard readtable}. ++To achieve the effect of altering or extending @i{standard syntax}, ++a copy of the @i{standard readtable} can be created; see the @i{function} @b{copy-readtable}. ++ ++The @i{readtable case} of the @i{standard readtable} is @t{:upcase}. ++ ++@node The Initial Readtable, , The Standard Readtable, Readtables ++@subsubsection The Initial Readtable ++ ++The @i{initial readtable} ++@IGindex initial readtable ++ is ++the @i{readtable} that is the @i{current readtable} ++at the time when the @i{Lisp image} starts. ++At that time, it conforms to @i{standard syntax}. ++The @i{initial readtable} is @i{distinct} ++from the @i{standard readtable}. ++It is permissible for a @i{conforming program} ++to modify the @i{initial readtable}. ++ ++@node Variables that affect the Lisp Reader, Standard Characters, Readtables, Character Syntax ++@subsection Variables that affect the Lisp Reader ++ ++The @i{Lisp reader} is influenced not only by the @i{current readtable}, ++but also by various @i{dynamic variables}. Figure 2--2 lists ++the @i{variables} that influence the behavior of the @i{Lisp reader}. ++ ++@format ++@group ++@noindent ++@w{ *package* *read-default-float-format* *readtable* } ++@w{ *read-base* *read-suppress* } ++ ++@noindent ++@w{ Figure 2--2: Variables that influence the Lisp reader. } ++ ++@end group ++@end format ++ ++@node Standard Characters, Character Syntax Types, Variables that affect the Lisp Reader, Character Syntax ++@subsection Standard Characters ++ ++All @i{implementations} must support a @i{character} @i{repertoire} ++called @b{standard-char}; @i{characters} that are members of that ++@i{repertoire} are called @i{standard characters} ++@IGindex standard character ++. ++ ++The @b{standard-char} @i{repertoire} consists of ++the @i{non-graphic} @i{character} @i{newline}, ++the @i{graphic} @i{character} @i{space}, ++and the following additional ++ninety-four @i{graphic} @i{characters} or their equivalents: ++ ++@format ++@group ++@noindent ++@w{ Graphic ID Glyph Description Graphic ID Glyph Description } ++@w{ LA01 @t{a} small a LN01 @t{n} small n } ++@w{ LA02 @t{A} capital A LN02 @t{N} capital N } ++@w{ LB01 @t{b} small b LO01 @t{o} small o } ++@w{ LB02 @t{B} capital B LO02 @t{O} capital O } ++@w{ LC01 @t{c} small c LP01 @t{p} small p } ++@w{ LC02 @t{C} capital C LP02 @t{P} capital P } ++@w{ LD01 @t{d} small d LQ01 @t{q} small q } ++@w{ LD02 @t{D} capital D LQ02 @t{Q} capital Q } ++@w{ LE01 @t{e} small e LR01 @t{r} small r } ++@w{ LE02 @t{E} capital E LR02 @t{R} capital R } ++@w{ LF01 @t{f} small f LS01 @t{s} small s } ++@w{ LF02 @t{F} capital F LS02 @t{S} capital S } ++@w{ LG01 @t{g} small g LT01 @t{t} small t } ++@w{ LG02 @t{G} capital G LT02 @t{T} capital T } ++@w{ LH01 @t{h} small h LU01 @t{u} small u } ++@w{ LH02 @t{H} capital H LU02 @t{U} capital U } ++@w{ LI01 @t{i} small i LV01 @t{v} small v } ++@w{ LI02 @t{I} capital I LV02 @t{V} capital V } ++@w{ LJ01 @t{j} small j LW01 @t{w} small w } ++@w{ LJ02 @t{J} capital J LW02 @t{W} capital W } ++@w{ LK01 @t{k} small k LX01 @t{x} small x } ++@w{ LK02 @t{K} capital K LX02 @t{X} capital X } ++@w{ LL01 @t{l} small l LY01 @t{y} small y } ++@w{ LL02 @t{L} capital L LY02 @t{Y} capital Y } ++@w{ LM01 @t{m} small m LZ01 @t{z} small z } ++@w{ LM02 @t{M} capital M LZ02 @t{Z} capital Z } ++ ++@noindent ++@w{ Figure 2--3: Standard Character Subrepertoire (Part 1 of 3: Latin Characters)} ++ ++@end group ++@end format ++ ++@format ++@group ++@noindent ++@w{ Graphic ID Glyph Description Graphic ID Glyph Description } ++@w{ ND01 @t{1} digit 1 ND06 @t{6} digit 6 } ++@w{ ND02 @t{2} digit 2 ND07 @t{7} digit 7 } ++@w{ ND03 @t{3} digit 3 ND08 @t{8} digit 8 } ++@w{ ND04 @t{4} digit 4 ND09 @t{9} digit 9 } ++@w{ ND05 @t{5} digit 5 ND10 @t{0} digit 0 } ++ ++@noindent ++@w{ Figure 2--4: Standard Character Subrepertoire (Part 2 of 3: Numeric Characters)} ++ ++@end group ++@end format ++ ++@format ++@group ++@noindent ++@w{ Graphic ID Glyph Description } ++@w{ SP02 @t{!} exclamation mark } ++@w{ SC03 @t{$} dollar sign } ++@w{ SP04 @t{"} quotation mark, or double quote } ++@w{ SP05 @t{'} apostrophe, or @r{[}single@r{]} quote } ++@w{ SP06 @t{(} left parenthesis, or open parenthesis } ++@w{ SP07 @t{)} right parenthesis, or close parenthesis } ++@w{ SP08 @t{,} comma } ++@w{ SP09 @t{_} low line, or underscore } ++@w{ SP10 @t{-} hyphen, or minus @r{[}sign@r{]} } ++@w{ SP11 @t{.} full stop, period, or dot } ++@w{ SP12 @t{/} solidus, or slash } ++@w{ SP13 @t{:} colon } ++@w{ SP14 @t{;} semicolon } ++@w{ SP15 @t{?} question mark } ++@w{ SA01 @t{+} plus @r{[}sign@r{]} } ++@w{ SA03 @t{<} less-than @r{[}sign@r{]} } ++@w{ SA04 @t{=} equals @r{[}sign@r{]} } ++@w{ SA05 @t{>} greater-than @r{[}sign@r{]} } ++@w{ SM01 @t{#} number sign, or sharp@r{[}sign@r{]} } ++@w{ SM02 @t{%} percent @r{[}sign@r{]} } ++@w{ SM03 @t{&} ampersand } ++@w{ SM04 @t{*} asterisk, or star } ++@w{ SM05 @t{@@} commercial at, or at-sign } ++@w{ SM06 @t{[} left @r{[}square@r{]} bracket } ++@w{ SM07 @t{\} reverse solidus, or backslash } ++@w{ SM08 @t{]} right @r{[}square@r{]} bracket } ++@w{ SM11 @t{@{} left curly bracket, or left brace } ++@w{ SM13 @t{|} vertical bar } ++@w{ SM14 @t{@}} right curly bracket, or right brace } ++@w{ SD13 @t{`} grave accent, or backquote } ++@w{ SD15 @t{@t{^}} circumflex accent } ++@w{ SD19 @t{~} tilde } ++ ++@noindent ++@w{ Figure 2--5: Standard Character Subrepertoire (Part 3 of 3: Special Characters)} ++ ++@end group ++@end format ++ ++The graphic IDs are not used within @r{Common Lisp}, ++but are provided for cross reference purposes with @r{ISO 6937/2}. ++Note that the first letter of the graphic ID ++categorizes the character as follows: ++L---Latin, N---Numeric, S---Special. ++ ++@node Character Syntax Types, , Standard Characters, Character Syntax ++@subsection Character Syntax Types ++ ++The @i{Lisp reader} constructs an @i{object} ++from the input text by interpreting each @i{character} ++according to its @i{syntax type}. ++The @i{Lisp reader} cannot accept as input ++everything that the @i{Lisp printer} produces, ++and the @i{Lisp reader} has features that are not used by the @i{Lisp printer}. ++The @i{Lisp reader} can be used as a lexical analyzer ++for a more general user-written parser. ++ ++When the @i{Lisp reader} is invoked, it reads a single character from ++the @i{input} @i{stream} and dispatches according to the ++@i{syntax type} ++@IGindex syntax type ++ of that @i{character}. ++Every @i{character} that can appear in the @i{input} @i{stream} ++is of one of the @i{syntax types} shown in @i{Figure~2--6}. ++ ++@format ++@group ++@noindent ++@w{ @i{constituent} @i{macro character} @i{single escape} } ++@w{ @i{invalid} @i{multiple escape} @i{whitespace}_2 } ++ ++@noindent ++@w{ Figure 2--6: Possible Character Syntax Types } ++ ++@end group ++@end format ++ ++The @i{syntax type} of a @i{character} in a @i{readtable} ++determines how that character is interpreted by the @i{Lisp reader} ++while that @i{readtable} is the @i{current readtable}. ++At any given time, every character has exactly one @i{syntax type}. ++ ++@i{Figure~2--7} ++lists the @i{syntax type} of each @i{character} in @i{standard syntax}. ++ ++ ++ ++@format ++@group ++@noindent ++@w{ character syntax type character syntax type } ++@w{ Backspace @i{constituent} 0--9 @i{constituent} } ++@w{ Tab @i{whitespace}_2 : @i{constituent} } ++@w{ Newline @i{whitespace}_2 ; @i{terminating} @i{macro char} } ++@w{ Linefeed @i{whitespace}_2 @t{<} @i{constituent} } ++@w{ Page @i{whitespace}_2 = @i{constituent} } ++@w{ Return @i{whitespace}_2 @t{>} @i{constituent} } ++@w{ Space @i{whitespace}_2 ? @i{constituent}* } ++@w{ ! @i{constituent}* @t{@@} @i{constituent} } ++@w{ @t{"} @i{terminating} @i{macro char} A--Z @i{constituent} } ++@w{ # @i{non-terminating} @i{macro char} @t{[} @i{constituent}* } ++@w{ $ @i{constituent} @t{\} @i{single escape} } ++@w{ % @i{constituent} @t{]} @i{constituent}* } ++@w{ & @i{constituent} @t{^} @i{constituent} } ++@w{ ' @i{terminating} @i{macro char} @t{_} @i{constituent} } ++@w{ ( @i{terminating} @i{macro char} ` @i{terminating} @i{macro char} } ++@w{ ) @i{terminating} @i{macro char} a--z @i{constituent} } ++@w{ @t{*} @i{constituent} @t{@{} @i{constituent}* } ++@w{ + @i{constituent} @t{|} @i{multiple escape} } ++@w{ , @i{terminating} @i{macro char} @t{@}} @i{constituent}* } ++@w{ - @i{constituent} @t{~} @i{constituent} } ++@w{ . @i{constituent} Rubout @i{constituent} } ++@w{ / @i{constituent} } ++ ++@noindent ++@w{ Figure 2--7: Character Syntax Types in Standard Syntax } ++ ++@end group ++@end format ++ ++ ++The characters marked with an asterisk (*) are initially @i{constituents}, ++but they are not used in any standard @r{Common Lisp} notations. ++These characters are explicitly reserved to the @i{programmer}. ++@t{~} is not used in @r{Common Lisp}, and reserved to implementors. ++@t{$} and @t{%} are @i{alphabetic}_2 @i{characters}, ++but are not used in the names of any standard @r{Common Lisp} @i{defined names}. ++ ++@i{Whitespace}_2 characters serve as separators but are otherwise ++ignored. @i{Constituent} and @i{escape} @i{characters} are accumulated ++to make a @i{token}, which is then interpreted as a @i{number} or @i{symbol}. ++@i{Macro characters} trigger the invocation of @i{functions} (possibly ++user-supplied) that can perform arbitrary parsing actions. ++@i{Macro characters} are divided into two kinds, ++@i{terminating} and @i{non-terminating}, ++depending on whether or not they terminate a @i{token}. ++The following are descriptions of each kind of @i{syntax type}. ++ ++@menu ++* Constituent Characters:: ++* Constituent Traits:: ++* Invalid Characters:: ++* Macro Characters:: ++* Multiple Escape Characters:: ++* Examples of Multiple Escape Characters:: ++* Single Escape Character:: ++* Examples of Single Escape Characters:: ++* Whitespace Characters:: ++* Examples of Whitespace Characters:: ++@end menu ++ ++@node Constituent Characters, Constituent Traits, Character Syntax Types, Character Syntax Types ++@subsubsection Constituent Characters ++ ++@i{Constituent} @i{characters} are used in @i{tokens}. ++A @i{token} ++@IGindex token ++ is a representation of a @i{number} or a @i{symbol}. ++Examples of @i{constituent} @i{characters} are letters and digits. ++ ++Letters in symbol names are sometimes converted to ++letters in the opposite @i{case} when the name is read; ++see @ref{Effect of Readtable Case on the Lisp Reader}. ++@i{Case} conversion can be suppressed by the use ++of @i{single escape} or @i{multiple escape} characters. ++ ++@node Constituent Traits, Invalid Characters, Constituent Characters, Character Syntax Types ++@subsubsection Constituent Traits ++ ++Every @i{character} has one or more @i{constituent traits} ++that define how the @i{character} is to be interpreted by the @i{Lisp reader} ++when the @i{character} is a @i{constituent} @i{character}. ++These @i{constituent traits} are ++ @i{alphabetic}_2, ++ digit, ++ @i{package marker}, ++ plus sign, ++ minus sign, ++ dot, ++ decimal point, ++ @i{ratio marker}, ++ @i{exponent marker}, ++ and @i{invalid}. ++@i{Figure~2--8} shows the @i{constituent traits} ++of the @i{standard characters} ++and of certain @i{semi-standard} @i{characters}; ++no mechanism is provided for changing the @i{constituent trait} of a @i{character}. ++Any @i{character} with the alphadigit @i{constituent trait} ++in that figure is a digit if the @i{current input base} is greater ++than that character's digit value, ++otherwise the @i{character} is @i{alphabetic}_2. ++Any @i{character} quoted by a @i{single escape} ++is treated as an @i{alphabetic}_2 constituent, regardless of its normal syntax. ++ ++@format ++@group ++@noindent ++@w{ constituent traits constituent traits } ++@w{ character character } ++@w{ ________________________________________________________________________________} ++@w{ Backspace @i{invalid} @t{@{} @i{alphabetic}_2 } ++@w{ Tab @i{invalid}* @t{@}} @i{alphabetic}_2 } ++@w{ Newline @i{invalid}* + @i{alphabetic}_2, plus sign } ++@w{ Linefeed @i{invalid}* - @i{alphabetic}_2, minus sign } ++@w{ Page @i{invalid}* . @i{alphabetic}_2, dot, decimal point } ++@w{ Return @i{invalid}* / @i{alphabetic}_2, @i{ratio marker} } ++@w{ Space @i{invalid}* A, a alphadigit } ++@w{ ! @i{alphabetic}_2 B, b alphadigit } ++@w{ @t{"} @i{alphabetic}_2* C, c alphadigit } ++@w{ # @i{alphabetic}_2* D, d alphadigit, double-float @i{exponent marker} } ++@w{ $ @i{alphabetic}_2 E, e alphadigit, float @i{exponent marker} } ++@w{ % @i{alphabetic}_2 F, f alphadigit, single-float @i{exponent marker} } ++@w{ & @i{alphabetic}_2 G, g alphadigit } ++@w{ ' @i{alphabetic}_2* H, h alphadigit } ++@w{ ( @i{alphabetic}_2* I, i alphadigit } ++@w{ ) @i{alphabetic}_2* J, j alphadigit } ++@w{ @t{*} @i{alphabetic}_2 K, k alphadigit } ++@w{ , @i{alphabetic}_2* L, l alphadigit, long-float @i{exponent marker} } ++@w{ 0-9 alphadigit M, m alphadigit } ++@w{ : @i{package marker} N, n alphadigit } ++@w{ ; @i{alphabetic}_2* O, o alphadigit } ++@w{ @t{<} @i{alphabetic}_2 P, p alphadigit } ++@w{ = @i{alphabetic}_2 Q, q alphadigit } ++@w{ @t{>} @i{alphabetic}_2 R, r alphadigit } ++@w{ ? @i{alphabetic}_2 S, s alphadigit, short-float @i{exponent marker} } ++@w{ @t{@@} @i{alphabetic}_2 T, t alphadigit } ++@w{ @t{[} @i{alphabetic}_2 U, u alphadigit } ++@w{ @t{\} @i{alphabetic}_2* V, v alphadigit } ++@w{ @t{]} @i{alphabetic}_2 W, w alphadigit } ++@w{ @t{^} @i{alphabetic}_2 X, x alphadigit } ++@w{ @t{_} @i{alphabetic}_2 Y, y alphadigit } ++@w{ ` @i{alphabetic}_2* Z, z alphadigit } ++@w{ @t{|} @i{alphabetic}_2* Rubout @i{invalid} } ++@w{ @t{~} @i{alphabetic}_2 } ++@end group ++@end format ++ ++@w{ Figure 2--8: Constituent Traits of Standard Characters and Semi-Standard Characters} ++ ++The interpretations in this table apply only to @i{characters} ++whose @i{syntax type} is @i{constituent}. ++Entries marked with an asterisk (*) are normally @i{shadowed}_2 ++because the indicated @i{characters} are of @i{syntax type} ++@i{whitespace}_2, ++@i{macro character}, ++@i{single escape}, ++or @i{multiple escape}; ++these @i{constituent traits} apply to them only if their @i{syntax types} ++are changed to @i{constituent}. ++ ++@node Invalid Characters, Macro Characters, Constituent Traits, Character Syntax Types ++@subsubsection Invalid Characters ++ ++@i{Characters} with the @i{constituent trait} @i{invalid} ++cannot ever appear in a @i{token} ++except under the control of a @i{single escape} @i{character}. ++If an @i{invalid} @i{character} is encountered while an @i{object} is ++being read, an error of @i{type} @b{reader-error} is signaled. ++If an @i{invalid} @i{character} is preceded by a @i{single escape} @i{character}, ++it is treated as an @i{alphabetic}_2 @i{constituent} instead. ++ ++@node Macro Characters, Multiple Escape Characters, Invalid Characters, Character Syntax Types ++@subsubsection Macro Characters ++ ++When the @i{Lisp reader} encounters a @i{macro character} ++on an @i{input} @i{stream}, ++special parsing of subsequent @i{characters} ++on the @i{input} @i{stream} ++is performed. ++ ++A @i{macro character} has an associated @i{function} ++called a @i{reader macro function} ++@IGindex reader macro function ++ that implements its specialized parsing behavior. ++An association of this kind can be established or modified under control of ++a @i{conforming program} by using ++the @i{functions} @b{set-macro-character} and @b{set-dispatch-macro-character}. ++ ++Upon encountering a @i{macro character}, the @i{Lisp reader} calls its ++@i{reader macro function}, which parses one specially formatted object ++from the @i{input} @i{stream}. ++The @i{function} either returns the parsed @i{object}, ++or else it returns no @i{values} ++ to indicate that the characters scanned by the @i{function} ++ are being ignored (@i{e.g.}, in the case of a comment). ++Examples of @i{macro characters} ++are @i{backquote}, @i{single-quote}, @i{left-parenthesis}, and ++@i{right-parenthesis}. ++ ++A @i{macro character} is either @i{terminating} or @i{non-terminating}. ++The difference between @i{terminating} and @i{non-terminating} @i{macro characters} ++lies in what happens when such characters occur in the middle of a @i{token}. ++If a @i{non-terminating} ++@IGindex non-terminating ++ @i{macro character} occurs in the middle of a @i{token}, ++the @i{function} associated ++with the @i{non-terminating} @i{macro character} is not called, ++and the ++@i{non-terminating} @i{macro character} does not terminate the @i{token}'s name; it ++becomes part of the name as if the @i{macro character} were really a constituent ++character. A @i{terminating} ++@IGindex terminating ++ @i{macro character} terminates any @i{token}, ++and its associated @i{reader macro function} ++is called no matter where the @i{character} appears. ++The only @i{non-terminating} @i{macro character} in @i{standard syntax} ++is @i{sharpsign}. ++ ++If a @i{character} is a @i{dispatching macro character} C_1, ++its @i{reader macro function} is a @i{function} supplied by the @i{implementation}. ++This @i{function} reads decimal @i{digit} @i{characters} until a non-@i{digit} ++C_2 is read. ++If any @i{digits} were read, ++they are converted into a corresponding @i{integer} infix parameter P; ++otherwise, the infix parameter P is @b{nil}. ++The terminating non-@i{digit} C_2 is a @i{character} ++(sometimes called a ``sub-character'' to emphasize its subordinate role in the dispatching) ++that is looked up in the dispatch table associated with ++the @i{dispatching macro character} C_1. ++The @i{reader macro function} associated with the sub-character C_2 ++is invoked with three arguments: ++ the @i{stream}, ++ the sub-character C_2, ++ and the infix parameter P. ++For more information about dispatch characters, ++see the @i{function} @b{set-dispatch-macro-character}. ++ ++For information about the @i{macro characters} ++that are available in @i{standard syntax}, ++see @ref{Standard Macro Characters}. ++ ++@node Multiple Escape Characters, Examples of Multiple Escape Characters, Macro Characters, Character Syntax Types ++@subsubsection Multiple Escape Characters ++ ++A pair of @i{multiple escape} ++@IGindex multiple escape ++ @i{characters} ++is used to indicate that an enclosed sequence of characters, ++including possible @i{macro characters} and @i{whitespace}_2 @i{characters}, ++are to be treated as @i{alphabetic}_2 @i{characters} ++with @i{case} preserved. ++Any @i{single escape} and @i{multiple escape} @i{characters} ++that are to appear in the sequence must be preceded by a @i{single escape} ++@i{character}. ++ ++@i{Vertical-bar} is a @i{multiple escape} @i{character} ++in @i{standard syntax}. ++ ++@node Examples of Multiple Escape Characters, Single Escape Character, Multiple Escape Characters, Character Syntax Types ++@subsubsection Examples of Multiple Escape Characters ++ ++@example ++ ;; The following examples assume the readtable case of *readtable* ++ ;; and *print-case* are both :upcase. ++ (eq 'abc 'ABC) @result{} @i{true} ++ (eq 'abc '|ABC|) @result{} @i{true} ++ (eq 'abc 'a|B|c) @result{} @i{true} ++ (eq 'abc '|abc|) @result{} @i{false} ++@end example ++ ++@node Single Escape Character, Examples of Single Escape Characters, Examples of Multiple Escape Characters, Character Syntax Types ++@subsubsection Single Escape Character ++ ++A @i{single escape} ++@IGindex single escape ++ is used to indicate that ++the next @i{character} is to be treated as ++an @i{alphabetic}_2 @i{character} ++with its @i{case} preserved, ++no matter what the @i{character} is ++or which @i{constituent traits} it has. ++ ++@i{Slash} is a @i{single escape} @i{character} ++in @i{standard syntax}. ++ ++@node Examples of Single Escape Characters, Whitespace Characters, Single Escape Character, Character Syntax Types ++@subsubsection Examples of Single Escape Characters ++ ++@example ++ ;; The following examples assume the readtable case of *readtable* ++ ;; and *print-case* are both :upcase. ++ (eq 'abc '\A\B\C) @result{} @i{true} ++ (eq 'abc 'a\Bc) @result{} @i{true} ++ (eq 'abc '\ABC) @result{} @i{true} ++ (eq 'abc '\abc) @result{} @i{false} ++@end example ++ ++@node Whitespace Characters, Examples of Whitespace Characters, Examples of Single Escape Characters, Character Syntax Types ++@subsubsection Whitespace Characters ++ ++@i{Whitespace}_2 @i{characters} are used to separate @i{tokens}. ++ ++@i{Space} and @i{newline} are @i{whitespace}_2 @i{characters} ++in @i{standard syntax}. ++ ++@node Examples of Whitespace Characters, , Whitespace Characters, Character Syntax Types ++@subsubsection Examples of Whitespace Characters ++ ++@example ++ (length '(this-that)) @result{} 1 ++ (length '(this - that)) @result{} 3 ++ (length '(a ++ b)) @result{} 2 ++ (+ 34) @result{} 34 ++ (+ 3 4) @result{} 7 ++@end example ++ ++@c end of including concept-syntax ++ ++@node Reader Algorithm, Interpretation of Tokens, Character Syntax, Syntax ++@section Reader Algorithm ++ ++@c including concept-reader-algorithm ++ ++This section describes the algorithm used by the @i{Lisp reader} ++to parse @i{objects} from an @i{input} @i{character} @i{stream}, ++including how the @i{Lisp reader} processes @i{macro characters}. ++ ++When dealing with @i{tokens}, the reader's basic function is to distinguish ++representations of @i{symbols} from those of @i{numbers}. ++When a @i{token} is accumulated, it is assumed to represent a @i{number} if it ++satisfies the syntax for numbers listed in @i{Figure~2--9}. ++If it does not represent a @i{number}, ++it is then assumed to be a @i{potential number} ++if it satisfies the rules governing the syntax for a @i{potential number}. ++If a valid @i{token} is neither a representation of a @i{number} ++ nor a @i{potential number}, ++it represents a @i{symbol}. ++ ++The algorithm performed by the @i{Lisp reader} is as follows: ++ ++@table @asis ++ ++@item 1. ++If at end of file, end-of-file processing is performed as specified ++in @b{read}. ++Otherwise, ++one @i{character}, @i{x}, is read from the @i{input} @i{stream}, and ++dispatched according to the @i{syntax type} of @i{x} to one ++of steps 2 to 7. ++ ++@item 2. ++If @i{x} is an @i{invalid} @i{character}, ++an error of @i{type} @b{reader-error} is signaled. ++ ++@item 3. ++If @i{x} is a @i{whitespace}_2 @i{character}, ++then it is discarded and step 1 is re-entered. ++ ++@item 4. ++If @i{x} is a @i{terminating} or @i{non-terminating} @i{macro character} ++then its associated @i{reader macro function} is called with two @i{arguments}, ++the @i{input} @i{stream} and @i{x}. ++ ++The @i{reader macro function} may read @i{characters} ++from the @i{input} @i{stream}; ++if it does, it will see those @i{characters} following the @i{macro character}. ++The @i{Lisp reader} may be invoked recursively from the @i{reader macro function}. ++ ++The @i{reader macro function} must not have any side effects other than on the ++@i{input} @i{stream}; ++because of backtracking and restarting of the @b{read} operation, ++front ends to the @i{Lisp reader} (@i{e.g.}, ``editors'' and ``rubout handlers'') ++may cause the @i{reader macro function} to be called repeatedly during the ++reading of a single @i{expression} in which @i{x} only appears once. ++ ++The @i{reader macro function} may return zero values or one value. ++If one value is returned, ++then that value is returned as the result of the read operation; ++the algorithm is done. ++If zero values are returned, then step 1 is re-entered. ++ ++@item 5. ++If @i{x} is a @i{single escape} @i{character} ++then the next @i{character}, @i{y}, is read, or an error of @i{type} @b{end-of-file} ++is signaled if at the end of file. ++@i{y} is treated as if it is a @i{constituent} ++whose only @i{constituent trait} is @i{alphabetic}_2. ++@i{y} is used to begin a @i{token}, and step 8 is entered. ++ ++@item 6. ++If @i{x} is a @i{multiple escape} @i{character} ++then a @i{token} (initially ++containing no @i{characters}) is begun and step 9 is entered. ++ ++@item 7. ++If @i{x} is a @i{constituent} @i{character}, then it begins a @i{token}. ++After the @i{token} is read in, it will be interpreted ++either as a @r{Lisp} @i{object} or as being of invalid syntax. ++If the @i{token} represents an @i{object}, ++that @i{object} is returned as the result of the read operation. ++If the @i{token} is of invalid syntax, an error is signaled. ++If @i{x} is a @i{character} with @i{case}, ++it might be replaced with the corresponding @i{character} of the opposite @i{case}, ++depending on the @i{readtable case} of the @i{current readtable}, ++as outlined in @ref{Effect of Readtable Case on the Lisp Reader}. ++@i{X} is used to begin a @i{token}, and step 8 is entered. ++ ++@item 8. ++At this point a @i{token} is being accumulated, and an even number ++of @i{multiple escape} @i{characters} have been encountered. ++If at end of file, step 10 is entered. ++Otherwise, a @i{character}, @i{y}, is read, and ++one of the following actions is performed according to its @i{syntax type}: ++ ++@table @asis ++ ++@item @t{*} ++If @i{y} is a @i{constituent} or @i{non-terminating} @i{macro character}: ++@table @asis ++ ++@item -- ++If @i{y} is a @i{character} with @i{case}, ++it might be replaced with the corresponding @i{character} of the opposite @i{case}, ++depending on the @i{readtable case} of the @i{current readtable}, ++as outlined in @ref{Effect of Readtable Case on the Lisp Reader}. ++@item -- ++@i{Y} is appended to the @i{token} being built. ++@item -- ++Step 8 is repeated. ++@end table ++ ++@item @t{*} ++If @i{y} is a @i{single escape} @i{character}, then the next @i{character}, ++@i{z}, is read, or an error of @i{type} @b{end-of-file} is signaled if at end of file. ++@i{Z} is treated as if it is a @i{constituent} ++whose only @i{constituent trait} is @i{alphabetic}_2. ++@i{Z} is appended to the @i{token} being built, ++and step 8 is repeated. ++ ++@item @t{*} ++If @i{y} is a @i{multiple escape} @i{character}, ++then step 9 is entered. ++ ++@item @t{*} ++If @i{y} is an @i{invalid} @i{character}, ++an error of @i{type} @b{reader-error} is signaled. ++ ++@item @t{*} ++If @i{y} is a @i{terminating} @i{macro character}, ++then it terminates the @i{token}. ++First the @i{character} @i{y} is unread (see @b{unread-char}), ++and then step 10 is entered. ++ ++@item @t{*} ++If @i{y} is a @i{whitespace}_2 @i{character}, then it terminates ++the @i{token}. First the @i{character} @i{y} is unread ++if appropriate (see @b{read-preserving-whitespace}), ++and then step 10 is entered. ++@end table ++ ++@item 9. ++At this point a @i{token} is being accumulated, and an odd number ++of @i{multiple escape} @i{characters} have been encountered. ++If at end of file, an error of @i{type} @b{end-of-file} is signaled. ++Otherwise, a @i{character}, @i{y}, is read, and ++one of the following actions is performed according to its @i{syntax type}: ++ ++@table @asis ++ ++@item @t{*} ++If @i{y} is a @i{constituent}, macro, or @i{whitespace}_2 @i{character}, ++@i{y} is treated as a @i{constituent} ++whose only @i{constituent trait} is @i{alphabetic}_2. ++@i{Y} is appended to the @i{token} being built, and step 9 is repeated. ++ ++@item @t{*} ++If @i{y} is a @i{single escape} @i{character}, then the next @i{character}, ++@i{z}, is read, or an error of @i{type} @b{end-of-file} is signaled if at end of file. ++@i{Z} is treated as a @i{constituent} ++whose only @i{constituent trait} is @i{alphabetic}_2. ++@i{Z} is appended to the @i{token} being built, ++and step 9 is repeated. ++ ++@item @t{*} ++If @i{y} is a @i{multiple escape} @i{character}, ++then step 8 is entered. ++ ++@item @t{*} ++If @i{y} is an @i{invalid} @i{character}, ++an error of @i{type} @b{reader-error} is signaled. ++@end table ++ ++@item 10. ++An entire @i{token} has been accumulated. ++The @i{object} represented by the @i{token} is returned ++as the result of the read operation, ++or an error of @i{type} @b{reader-error} is signaled if the @i{token} is not of valid syntax. ++@end table ++ ++@c end of including concept-reader-algorithm ++ ++@node Interpretation of Tokens, Standard Macro Characters, Reader Algorithm, Syntax ++@section Interpretation of Tokens ++ ++@c including concept-tokens ++ ++@menu ++* Numbers as Tokens:: ++* Constructing Numbers from Tokens:: ++* The Consing Dot:: ++* Symbols as Tokens:: ++* Valid Patterns for Tokens:: ++* Package System Consistency Rules:: ++@end menu ++ ++@node Numbers as Tokens, Constructing Numbers from Tokens, Interpretation of Tokens, Interpretation of Tokens ++@subsection Numbers as Tokens ++ ++When a @i{token} is read, ++it is interpreted as a @i{number} or @i{symbol}. ++The @i{token} is interpreted as a @i{number} if it satisfies ++the syntax for numbers specified in Figure 2--9. ++ ++@format ++@group ++@noindent ++@w{ @i{numeric-token} ::= !@i{integer} | !@i{ratio} | !@i{float} } ++@w{ @i{integer} ::= @t{[}@i{sign}@t{]} @{@i{decimal-digit}@}^+ @i{decimal-point} | @t{[}@i{sign}@t{]} @{@i{digit}@}^+ } ++@w{ @i{ratio} ::= @t{[}@i{sign}@t{]} @{@i{digit}@}^+ @i{slash} @{@i{digit}@}^+ } ++@w{ @i{float} ::= @t{[}@i{sign}@t{]} @{@i{decimal-digit}@}* @i{decimal-point} @{@i{decimal-digit}@}^+ @t{[}!@i{exponent}@t{]} } ++@w{ | @t{[}@i{sign}@t{]} @{@i{decimal-digit}@}^+ @t{[}@i{decimal-point} @{@i{decimal-digit}@}*@t{]} !@i{exponent} } ++@w{ @i{exponent} ::= @i{exponent-marker} @t{[}@i{sign}@t{]} @{@i{digit}@}^+ } ++@w{ @i{sign}---a @i{sign}.} ++@w{ @i{slash}---a @i{slash}} ++@w{ @i{decimal-point}---a @i{dot}.} ++@w{ @i{exponent-marker}---an @i{exponent marker}.} ++@w{ @i{decimal-digit}---a @i{digit} in @i{radix} @t{10}.} ++@w{ @i{digit}---a @i{digit} in the @i{current input radix}.} ++@end group ++@end format ++ ++@w{ Figure 2--9: Syntax for Numeric Tokens} ++ ++@menu ++* Potential Numbers as Tokens:: ++* Escape Characters and Potential Numbers:: ++* Examples of Potential Numbers:: ++@end menu ++ ++@node Potential Numbers as Tokens, Escape Characters and Potential Numbers, Numbers as Tokens, Numbers as Tokens ++@subsubsection Potential Numbers as Tokens ++ ++To allow implementors and future @r{Common Lisp} standards ++to extend the syntax of numbers, a ++syntax for @i{potential numbers} is defined that is ++more general than the syntax for numbers. ++A @i{token} is a @i{potential number} if it satisfies all of the following ++requirements: ++ ++@table @asis ++ ++@item 1. ++The @i{token} consists entirely of ++ @i{digits}, ++ @i{signs}, ++ @i{ratio markers}, ++ decimal points (@t{.}), ++ extension characters (@t{^} or @t{_}), ++ and number markers. ++A number marker is a letter. ++Whether a letter may be treated as a number marker depends on context, ++but no letter that is adjacent to another letter may ever be treated as a number marker. ++@i{Exponent markers} are number markers. ++ ++@item 2. ++The @i{token} contains at least one digit. Letters may be considered to be ++digits, depending on the @i{current input base}, but only ++in @i{tokens} containing no decimal points. ++ ++@item 3. ++The @i{token} begins with a @i{digit}, @i{sign}, decimal point, or extension character, ++ ++[Reviewer Note by Barmar: This section is unnecessary because the first bullet already ++ omits discussion of a colon (@i{package marker}).] ++but not a ++@i{package marker}. ++The syntax involving a leading ++@i{package marker} followed by a @i{potential number} is ++not well-defined. The consequences of the use ++of notation such as @t{:1}, @t{:1/2}, and @t{:2^3} in a ++position where an expression appropriate for @b{read} ++is expected are unspecified. ++ ++@item 4. ++The @i{token} does not end with a sign. ++@end table ++ ++If a @i{potential number} has number syntax, ++a @i{number} of the appropriate type is constructed and returned, ++if the @i{number} is representable in an implementation. ++A @i{number} will not be representable in an implementation ++if it is outside the boundaries set by the @i{implementation-dependent} ++constants for @i{numbers}. ++For example, specifying too large or too small an exponent for a @i{float} ++may make the @i{number} impossible to represent in the implementation. ++A @i{ratio} with denominator zero (such as @t{-35/000}) ++is not represented in any implementation. ++When a @i{token} with the syntax of a number cannot be converted to an internal ++@i{number}, an error of @i{type} @b{reader-error} is signaled. An error ++must not be signaled for specifying too many significant digits ++for a @i{float}; a truncated or rounded value should be produced. ++ ++If there is an ambiguity as to whether ++a letter should be treated as a digit or as a number marker, ++the letter is treated as a digit. ++ ++@node Escape Characters and Potential Numbers, Examples of Potential Numbers, Potential Numbers as Tokens, Numbers as Tokens ++@subsubsection Escape Characters and Potential Numbers ++ ++A @i{potential number} cannot contain any @i{escape} ++@i{characters}. An @i{escape} @i{character} robs the following ++@i{character} of all syntactic qualities, forcing it to be strictly ++@i{alphabetic}_2 and therefore unsuitable for use in a ++@i{potential number}. For example, all of the following ++representations are interpreted as @i{symbols}, not @i{numbers}: ++ ++@example ++ \256 25\64 1.0\E6 |100| 3\.14159 |3/4| 3\/4 5|| ++@end example ++ ++In each case, removing the @i{escape} @i{character} (or @i{characters}) ++would ++cause the token to be a @i{potential number}. ++ ++@node Examples of Potential Numbers, , Escape Characters and Potential Numbers, Numbers as Tokens ++@subsubsection Examples of Potential Numbers ++ ++As examples, the @i{tokens} in Figure 2--10 are @i{potential numbers}, ++but they are not actually numbers, and so are reserved @i{tokens}; ++a @i{conforming implementation} is permitted, but not required, ++to define their meaning. ++ ++@format ++@group ++@noindent ++@w{ @t{1b5000} @t{777777q} @t{1.7J} @t{-3/4+6.7J} @t{12/25/83} } ++@w{ @t{27^19} @t{3^4/5} @t{6//7} @t{3.1.2.6} @t{@t{^}-43@t{^}} } ++@w{ @t{3.141_592_653_589_793_238_4} @t{-3.7+2.6i-6.17j+19.6k} } ++ ++@noindent ++@w{ Figure 2--10: Examples of reserved tokens } ++ ++@end group ++@end format ++ ++The @i{tokens} in Figure 2--11 are not @i{potential numbers}; ++they are always treated as @i{symbols}: ++ ++@format ++@group ++@noindent ++@w{ @t{/} @t{/5} @t{+} @t{1+} @t{1-} } ++@w{ @t{foo+} @t{ab.cd} @t{_} @t{@t{^}} @t{@t{^}/-} } ++ ++@noindent ++@w{ Figure 2--11: Examples of symbols} ++ ++@end group ++@end format ++ ++The @i{tokens} in Figure 2--12 are @i{potential numbers} ++if the @i{current input base} is @t{16}, ++but they are always treated as @i{symbols} if the @i{current input base} is @t{10}. ++ ++@format ++@group ++@noindent ++@w{ @t{bad-face} @t{25-dec-83} @t{a/b} @t{fad_cafe} @t{f@t{^}} } ++ ++@noindent ++@w{ Figure 2--12: Examples of symbols or potential numbers} ++ ++@end group ++@end format ++ ++@node Constructing Numbers from Tokens, The Consing Dot, Numbers as Tokens, Interpretation of Tokens ++@subsection Constructing Numbers from Tokens ++ ++A @i{real} is constructed directly from a corresponding numeric @i{token}; ++see @i{Figure~2--9}. ++ ++A @i{complex} is notated as a @t{#C} (or @t{#c}) followed by a @i{list} ++of two @i{reals}; see @ref{Sharpsign C}. ++ ++The @i{reader macros} @t{#B}, @t{#O}, @t{#X}, and @t{#R} may also be useful ++in controlling the input @i{radix} in which @i{rationals} are parsed; ++ see @ref{Sharpsign B}, ++ @ref{Sharpsign O}, ++ @ref{Sharpsign X}, ++ and @ref{Sharpsign R}. ++ ++This section summarizes the full syntax for @i{numbers}. ++ ++@menu ++* Syntax of a Rational:: ++* Syntax of an Integer:: ++* Syntax of a Ratio:: ++* Syntax of a Float:: ++* Syntax of a Complex:: ++@end menu ++ ++@node Syntax of a Rational, Syntax of an Integer, Constructing Numbers from Tokens, Constructing Numbers from Tokens ++@subsubsection Syntax of a Rational ++ ++@node Syntax of an Integer, Syntax of a Ratio, Syntax of a Rational, Constructing Numbers from Tokens ++@subsubsection Syntax of an Integer ++ ++@i{Integers} can be written as a sequence of @i{digits}, ++optionally preceded by a @i{sign} and optionally followed by a decimal point; ++see @i{Figure~2--9}. ++When a decimal point is used, ++the @i{digits} are taken to be in @i{radix} @t{10}; ++when no decimal point is used, ++the @i{digits} are taken to be in radix given by the @i{current input base}. ++ ++For information on how @i{integers} are printed, see @ref{Printing Integers}. ++ ++@node Syntax of a Ratio, Syntax of a Float, Syntax of an Integer, Constructing Numbers from Tokens ++@subsubsection Syntax of a Ratio ++ ++@i{Ratios} can be written as an optional @i{sign} followed by two ++non-empty sequences of @i{digits} separated by a @i{slash}; ++see @i{Figure~2--9}. ++The second sequence may not consist ++entirely of zeros. ++Examples of @i{ratios} are in Figure 2--13. ++ ++@format ++@group ++@noindent ++@w{ @t{2/3} ;This is in canonical form } ++@w{ @t{4/6} ;A non-canonical form for 2/3 } ++@w{ @t{-17/23} ;A ratio preceded by a sign } ++@w{ @t{-30517578125/32768} ;This is (-5/2)^15 } ++@w{ @t{10/5} ;The canonical form for this is @t{2} } ++@w{ @t{#o-101/75} ;Octal notation for -65/61 } ++@w{ @t{#3r120/21} ;Ternary notation for 15/7 } ++@w{ @t{#Xbc/ad} ;Hexadecimal notation for 188/173 } ++@w{ @t{#xFADED/FACADE} ;Hexadecimal notation for 1027565/16435934 } ++ ++@noindent ++@w{ Figure 2--13: Examples of Ratios } ++ ++@end group ++@end format ++ ++[Reviewer Note by Barmar: #o, #3r, #X, and #x mentioned above ++ are not in the syntax rules defined just above that.] ++ ++For information on how @i{ratios} are printed, ++see @ref{Printing Ratios}. ++ ++@node Syntax of a Float, Syntax of a Complex, Syntax of a Ratio, Constructing Numbers from Tokens ++@subsubsection Syntax of a Float ++ ++@i{Floats} can be written in either decimal fraction or computerized ++scientific notation: an optional sign, then a non-empty sequence of digits ++with an embedded decimal point, ++then an optional decimal exponent specification. ++If there is no exponent specifier, then ++the decimal point is required, and there must be digits ++after it. ++The exponent specifier consists of an @i{exponent marker}, ++an optional sign, and a non-empty sequence of digits. ++If no exponent specifier is present, or if the @i{exponent marker} @t{e} ++(or @t{E}) is used, then ++the format specified ++by @b{*read-default-float-format*} is used. ++See @i{Figure~2--9}. ++ ++An implementation may provide one or more kinds of @i{float} ++that collectively make up the @i{type} @b{float}. ++The letters @t{s}, @t{f}, @t{d}, and @t{l} (or their ++respective uppercase equivalents) explicitly specify the ++use of the @i{types} @b{short-float}, @b{single-float}, ++@b{double-float}, and @b{long-float}, respectively. ++ ++The internal format used for an external representation depends only ++on the @i{exponent marker}, and not on the number of decimal digits ++in the external representation. ++ ++Figure 2--14 contains examples of notations for @i{floats}: ++ ++@format ++@group ++@noindent ++@w{ @t{0.0} ;Floating-point zero in default format } ++@w{ @t{0E0} ;As input, this is also floating-point zero in default format. } ++@w{ ;As output, this would appear as @t{0.0}. } ++@w{ @t{0e0} ;As input, this is also floating-point zero in default format. } ++@w{ ;As output, this would appear as @t{0.0}. } ++@w{ @t{-.0} ;As input, this might be a zero or a minus zero, } ++@w{ ; depending on whether the implementation supports } ++@w{ ; a distinct minus zero. } ++@w{ ;As output, @t{0.0} is zero and @t{-0.0} is minus zero. } ++@w{ @t{0.} ;On input, the integer zero---@i{not} a floating-point number! } ++@w{ ;Whether this appears as @t{0} or @t{0.} on output depends } ++@w{ ;on the @i{value} of @b{*print-radix*}. } ++@w{ @t{0.0s0} ;A floating-point zero in short format } ++@w{ @t{0s0} ;As input, this is a floating-point zero in short format. } ++@w{ ;As output, such a zero would appear as @t{0.0s0} } ++@w{ ; (or as @t{0.0} if @b{short-float} was the default format). } ++@w{ @t{6.02E+23} ;Avogadro's number, in default format } ++@w{ @t{602E+21} ;Also Avogadro's number, in default format } ++ ++@noindent ++@w{ Figure 2--14: Examples of Floating-point numbers } ++ ++@end group ++@end format ++ ++For information on how @i{floats} are printed, ++see @ref{Printing Floats}. ++ ++@node Syntax of a Complex, , Syntax of a Float, Constructing Numbers from Tokens ++@subsubsection Syntax of a Complex ++ ++A @i{complex} has a Cartesian structure, ++with a real part and an imaginary part each of which is a ++ ++@i{real}. ++ ++The parts of a @i{complex} are not necessarily @i{floats} ++but both parts must be of the same @i{type}: ++ ++[Editorial Note by KMP: This is not the same as saying they must be the same type. ++ Maybe we mean they are of the same `precision' or `format'? ++ GLS had suggestions which are not yet merged.] ++either both are @i{rationals}, or both are of the same @i{float} @i{subtype}. ++When constructing a @i{complex}, if the specified parts are not the ++same @i{type}, the parts are converted to be the same @i{type} ++internally (@i{i.e.}, the @i{rational} part is converted to a @i{float}). ++An @i{object} of type @t{(complex rational)} is converted internally ++and represented thereafter as a @i{rational} if its imaginary part is an ++@i{integer} whose value is 0. ++ ++For further information, see @ref{Sharpsign C} and @ref{Printing Complexes}. ++ ++@node The Consing Dot, Symbols as Tokens, Constructing Numbers from Tokens, Interpretation of Tokens ++@subsection The Consing Dot ++ ++If a @i{token} consists solely of dots (with no escape characters), ++then an error of @i{type} @b{reader-error} is signaled, ++except in one circumstance: ++if the @i{token} is a single @i{dot} ++and appears in a situation where @i{dotted pair} notation permits a @i{dot}, ++then it is accepted as part of such syntax and no error is signaled. ++See @ref{Left-Parenthesis}. ++ ++@node Symbols as Tokens, Valid Patterns for Tokens, The Consing Dot, Interpretation of Tokens ++@subsection Symbols as Tokens ++ ++Any @i{token} that is not a @i{potential number}, ++does not contain a @i{package marker}, ++and does not consist entirely of dots ++will always be interpreted as a @i{symbol}. ++Any @i{token} that is a @i{potential number} but does not fit the ++number syntax is a reserved @i{token} and ++has an @i{implementation-dependent} interpretation. ++In all other cases, the @i{token} is construed to be the name of a @i{symbol}. ++ ++Examples of the printed representation of @i{symbols} are in Figure 2--15. ++For presentational simplicity, ++these examples assume that ++the @i{readtable case} of the @i{current readtable} is @t{:upcase}. ++ ++@format ++@group ++@noindent ++@w{ @t{FROBBOZ} The @i{symbol} whose @i{name} is @t{FROBBOZ}. } ++@w{ @t{frobboz} Another way to notate the same @i{symbol}. } ++@w{ @t{fRObBoz} Yet another way to notate it. } ++@w{ @t{unwind-protect} A @i{symbol} with a hyphen in its @i{name}. } ++@w{ @t{+$} The @i{symbol} named @t{+$}. } ++@w{ @t{1+} The @i{symbol} named @t{1+}. } ++@w{ @t{+1} This is the @i{integer} @t{1}, not a @i{symbol}. } ++@w{ @t{pascal_style} This @i{symbol} has an underscore in its @i{name}. } ++@w{ @t{file.rel.43} This @i{symbol} has periods in its @i{name}. } ++@w{ @t{\(} The @i{symbol} whose @i{name} is @t{(}. } ++@w{ @t{\+1} The @i{symbol} whose @i{name} is @t{+1}. } ++@w{ @t{+\1} Also the @i{symbol} whose @i{name} is @t{+1}. } ++@w{ @t{\frobboz} The @i{symbol} whose @i{name} is @t{fROBBOZ}. } ++@w{ @t{3.14159265\s0} The @i{symbol} whose @i{name} is @t{3.14159265s0}. } ++@w{ @t{3.14159265\S0} A different @i{symbol}, whose @i{name} is @t{3.14159265S0}. } ++@w{ @t{3.14159265s0} A possible @i{short float} approximation to \pi. } ++ ++@noindent ++@w{ Figure 2--15: Examples of the printed representation of symbols (Part 1 of 2)} ++ ++@end group ++@end format ++ ++@format ++@group ++@noindent ++@w{ @t{APL\\360} The @i{symbol} whose @i{name} is @t{APL\360}. } ++@w{ @t{apl\\360} Also the @i{symbol} whose @i{name} is @t{APL\360}. } ++@w{ @t{\(b@t{^}2\)\ -\ 4*a@t{*c}} The @i{name} is @t{(B@t{^}2) - 4*A*C}. } ++@w{ Parentheses and two spaces in it. } ++@w{ @t{\(\b@t{^}2\)\ -\4*\a*\c} The @i{name} is @t{(b@t{^}2) - 4*a*c}. } ++@w{ Letters explicitly lowercase. } ++@w{ @t{|"|} The same as writing @t{\"}. } ++@w{ @t{|(b@t{^}2) - 4*a*c|} The @i{name} is @t{(b@t{^}2) - 4*a*c}. } ++@w{ @t{|frobboz|} The @i{name} is @t{frobboz}, not @t{FROBBOZ}. } ++@w{ @t{|APL\360|} The @i{name} is @t{APL360}. } ++@w{ @t{|APL\\360|} The @i{name} is @t{APL\360}. } ++@w{ @t{|apl\\360|} The @i{name} is @t{apl\360}. } ++@w{ @t{|\|\||} Same as @t{\|\|} ---the @i{name} is @t{||}. } ++@w{ @t{|(B@t{^}2) - 4*A*C|} The @i{name} is @t{(B@t{^}2) - 4*A*C}. } ++@w{ Parentheses and two spaces in it. } ++@w{ @t{|(b@t{^}2) - 4*a*c|} The @i{name} is @t{(b@t{^}2) - 4*a*c}. } ++ ++@noindent ++@w{ Figure 2--16: Examples of the printed representation of symbols (Part 2 of 2)} ++ ++@end group ++@end format ++ ++In the process of parsing a @i{symbol}, ++it is @i{implementation-dependent} which ++@i{implementation-defined} @i{attributes} are removed ++from the @i{characters} forming a @i{token} that represents a @i{symbol}. ++ ++When parsing the syntax for a @i{symbol}, ++the @i{Lisp reader} looks up the @i{name} of that @i{symbol} ++in the @i{current package}. ++This lookup may involve looking in other ++@i{packages} whose @i{external symbols} ++are inherited by the @i{current package}. If the name is found, ++the corresponding @i{symbol} is returned. If the name is not found ++(that is, there is no @i{symbol} ++of that name @i{accessible} in the @i{current package}), ++a new @i{symbol} is created and is placed in the @i{current package} ++as an @i{internal symbol}. The @i{current package} becomes the owner ++(@i{home package}) of the @i{symbol}, ++and the @i{symbol} becomes interned in the @i{current package}. ++If the name is later read again while this same @i{package} is ++current, the same @i{symbol} will be found and returned. ++ ++@node Valid Patterns for Tokens, Package System Consistency Rules, Symbols as Tokens, Interpretation of Tokens ++@subsection Valid Patterns for Tokens ++ ++The valid patterns for @i{tokens} are summarized in Figure 2--17. ++ ++@format ++@group ++@noindent ++@w{ @t{@i{nnnnn}} a @i{number} } ++@w{ @t{@i{xxxxx}} a @i{symbol} in the @i{current package} } ++@w{ @t{:@i{xxxxx}} a @i{symbol} in the the @t{KEYWORD} @i{package} } ++@w{ @t{@i{ppppp}:@i{xxxxx}} an @i{external symbol} in the @i{ppppp} @i{package} } ++@w{ @t{@i{ppppp}::@i{xxxxx}} a (possibly internal) @i{symbol} in the @i{ppppp} @i{package} } ++@w{ @t{:@i{nnnnn}} undefined } ++@w{ @t{@i{ppppp}:@i{nnnnn}} undefined } ++@w{ @t{@i{ppppp}::@i{nnnnn}} undefined } ++@w{ @t{::@i{aaaaa}} undefined } ++@w{ @t{@i{aaaaa}:} undefined } ++@w{ @t{@i{aaaaa}:@i{aaaaa}:@i{aaaaa}} undefined } ++ ++@noindent ++@w{ Figure 2--17: Valid patterns for tokens } ++ ++@end group ++@end format ++ ++Note that @i{nnnnn} has number syntax, ++ neither @i{xxxxx} nor @i{ppppp} has number syntax, ++ and @i{aaaaa} has any syntax. ++ ++A summary of rules concerning @i{package markers} follows. ++In each case, examples are offered to illustrate the case; ++for presentational simplicity, the examples assume that ++the @i{readtable case} of the @i{current readtable} is @t{:upcase}. ++ ++@table @asis ++ ++@item 1. ++If there is a single @i{package marker}, and it occurs at the beginning of the ++@i{token}, then the @i{token} is interpreted as a @i{symbol} in the @t{KEYWORD} @i{package}. ++It also sets the @b{symbol-value} of the newly-created @i{symbol} to that ++same @i{symbol} so that the @i{symbol} will self-evaluate. ++ ++For example, ++@t{:bar}, when read, interns @t{BAR} as an @i{external symbol} in the @t{KEYWORD} @i{package}. ++ ++@item 2. ++If there is a single @i{package marker} not at the beginning or end of the ++@i{token}, then it divides the @i{token} into two parts. The first part ++specifies a @i{package}; ++the second part is the name of an @i{external symbol} ++available in that package. ++ ++For example, ++@t{foo:bar}, when read, looks up @t{BAR} among the @i{external symbols} of ++the @i{package} named @t{FOO}. ++ ++@item 3. ++If there are two adjacent @i{package markers} not at the beginning or end of the ++@i{token}, then they divide the @i{token} into two parts. The first part ++specifies a @i{package}; ++the second part is the name of a @i{symbol} within ++that @i{package} (possibly an @i{internal symbol}). ++ ++For example, ++@t{foo::bar}, when read, interns @t{BAR} in the @i{package} named @t{FOO}. ++ ++@item 4. ++If the @i{token} contains no @i{package markers}, ++and does not have @i{potential number} syntax, ++then the entire @i{token} is the name of the @i{symbol}. ++The @i{symbol} is looked up in the @i{current package}. ++ ++For example, ++@t{bar}, when read, interns @t{BAR} in the @i{current package}. ++ ++@item 5. ++The consequences are unspecified if any other pattern of @i{package markers} ++in a @i{token} is used. ++All other uses of @i{package markers} within names of @i{symbols} ++are not defined by this standard ++but are reserved for @i{implementation-dependent} use. ++@end table ++ ++For example, ++assuming the @i{readtable case} of the @i{current readtable} is @t{:upcase}, ++@t{editor:buffer} refers to the @i{external symbol} ++named @t{BUFFER} present in the @i{package} named @t{editor}, ++regardless of whether there is a @i{symbol} named @t{BUFFER} in ++the @i{current package}. If there is no @i{package} named ++@t{editor}, or if no @i{symbol} named @t{BUFFER} ++is present in @t{editor}, or if @t{BUFFER} is not exported by ++@t{editor}, the reader signals ++a correctable error. ++If @t{editor::buffer} is seen, the effect is exactly the same as ++reading @t{buffer} with the @t{EDITOR} @i{package} being the @i{current package}. ++ ++@node Package System Consistency Rules, , Valid Patterns for Tokens, Interpretation of Tokens ++@subsection Package System Consistency Rules ++ ++The following rules apply to the package system as long as ++the @i{value} of @b{*package*} is not changed: ++ ++@table @asis ++ ++@item @b{Read-read consistency} ++Reading the same @i{symbol} @i{name} ++always results in the @i{same} @i{symbol}. ++ ++@item @b{Print-read consistency} ++An @i{interned symbol} always prints as a sequence of characters that, ++when read back in, yields the @i{same} @i{symbol}. ++ ++For information about how the @i{Lisp printer} treats @i{symbols}, ++see @ref{Printing Symbols}. ++ ++@item @b{Print-print consistency} ++If two interned @i{symbols} are not the @i{same}, ++then their printed representations will be different sequences of characters. ++@end table ++ ++These rules are true regardless of any implicit interning. ++As long as the @i{current package} is not changed, ++results are reproducible regardless of the order of @i{loading} files ++or the exact history of what @i{symbols} were typed in when. ++If the @i{value} of @b{*package*} is changed and then changed back to the previous value, ++consistency is maintained. ++The rules can be violated by ++ changing the @i{value} of @b{*package*}, ++ forcing a change to @i{symbols} ++ or to @i{packages} ++ or to both ++ by continuing from an error, ++or calling one of the following @i{functions}: ++ @b{unintern}, ++ @b{unexport}, ++ @b{shadow}, ++ @b{shadowing-import}, ++ or @b{unuse-package}. ++ ++An inconsistency only applies if one of the restrictions is violated ++between two of the named @i{symbols}. ++@b{shadow}, @b{unexport}, @b{unintern}, ++and @b{shadowing-import} can only affect the consistency of ++@i{symbols} with the same @i{names} (under @b{string=}) ++as the ones supplied as arguments. ++ ++@c end of including concept-tokens ++ ++@node Standard Macro Characters, , Interpretation of Tokens, Syntax ++@section Standard Macro Characters ++ ++@c including concept-macro-chars ++ ++If the reader encounters a @i{macro character}, ++then its associated @i{reader macro function} ++is invoked and may produce an @i{object} to be returned. ++This @i{function} may read the @i{characters} ++following the @i{macro character} in the @i{stream} ++in any syntax and return the @i{object} represented by that syntax. ++ ++Any @i{character} can be made to be a @i{macro character}. ++The @i{macro characters} defined initially in a @i{conforming implementation} ++include ++the following: ++ ++@menu ++* Left-Parenthesis:: ++* Right-Parenthesis:: ++* Single-Quote:: ++* Semicolon:: ++* Double-Quote:: ++* Backquote:: ++* Comma:: ++* Sharpsign:: ++* Re-Reading Abbreviated Expressions:: ++@end menu ++ ++@node Left-Parenthesis, Right-Parenthesis, Standard Macro Characters, Standard Macro Characters ++@subsection Left-Parenthesis ++ ++The @i{left-parenthesis} initiates reading of a @i{list}. ++@b{read} is called recursively to read successive @i{objects} ++until a right parenthesis is found in the input @i{stream}. ++A @i{list} of the @i{objects} read is returned. Thus ++ ++@example ++ (a b c) ++@end example ++ ++is read as a @i{list} of three @i{objects} ++(the @i{symbols} @t{a}, @t{b}, and @t{c}). ++The right parenthesis need not immediately follow the printed representation of ++the last @i{object}; @i{whitespace}_2 ++characters and comments may precede it. ++ ++If no @i{objects} precede the right parenthesis, ++it reads as a @i{list} of zero @i{objects} ++(the @i{empty list}). ++ ++If a @i{token} that is just a dot ++not immediately preceded by an escape character ++is read after some @i{object} ++then exactly one more @i{object} must follow the dot, ++possibly preceded or followed by @i{whitespace}_2 or a comment, ++followed by the right parenthesis: ++ ++@example ++ (a b c . d) ++@end example ++ ++This means that the @i{cdr} of the last @i{cons} in the ++@i{list} is not @b{nil}, ++but rather the @i{object} whose representation followed the dot. ++The above example might have been the result of evaluating ++ ++@example ++ (cons 'a (cons 'b (cons 'c 'd))) ++@end example ++ ++Similarly, ++ ++@example ++ (cons 'this-one 'that-one) @result{} (this-one . that-one) ++@end example ++ ++It is permissible for the @i{object} ++following the dot to be a @i{list}: ++ ++@example ++ (a b c d . (e f . (g))) @equiv{} (a b c d e f g) ++@end example ++ ++For information on how the @i{Lisp printer} prints @i{lists} and @i{conses}, ++see @ref{Printing Lists and Conses}. ++ ++@node Right-Parenthesis, Single-Quote, Left-Parenthesis, Standard Macro Characters ++@subsection Right-Parenthesis ++ ++The @i{right-parenthesis} is invalid ++except when used in conjunction with the left parenthesis character. ++For more information, see @ref{Reader Algorithm}. ++ ++@node Single-Quote, Semicolon, Right-Parenthesis, Standard Macro Characters ++@subsection Single-Quote ++ ++@b{Syntax:} @t{'<<@i{exp}>>} ++ ++A @i{single-quote} introduces an @i{expression} to be ``quoted.'' ++@i{Single-quote} followed by an @i{expression} @i{exp} ++is treated by the @i{Lisp reader} as an abbreviation for ++and is parsed identically to the @i{expression} @t{(quote @i{exp})}. ++See the @i{special operator} @b{quote}. ++ ++@menu ++* Examples of Single-Quote:: ++@end menu ++ ++@node Examples of Single-Quote, , Single-Quote, Single-Quote ++@subsubsection Examples of Single-Quote ++ ++@example ++ 'foo @result{} FOO ++ ''foo @result{} (QUOTE FOO) ++ (car ''foo) @result{} QUOTE ++@end example ++ ++@node Semicolon, Double-Quote, Single-Quote, Standard Macro Characters ++@subsection Semicolon ++ ++@b{Syntax:} @t{;<<@i{text}>>} ++ ++A @i{semicolon} introduces @i{characters} that are to be ignored, ++such as comments. The @i{semicolon} and all @i{characters} up to ++and including the next @i{newline} or end of file are ignored. ++ ++@menu ++* Examples of Semicolon:: ++* Notes about Style for Semicolon:: ++* Use of Single Semicolon:: ++* Use of Double Semicolon:: ++* Use of Triple Semicolon:: ++* Use of Quadruple Semicolon:: ++* Examples of Style for Semicolon:: ++@end menu ++ ++@node Examples of Semicolon, Notes about Style for Semicolon, Semicolon, Semicolon ++@subsubsection Examples of Semicolon ++ ++@example ++ (+ 3 ; three ++ 4) ++@result{} 7 ++@end example ++ ++@node Notes about Style for Semicolon, Use of Single Semicolon, Examples of Semicolon, Semicolon ++@subsubsection Notes about Style for Semicolon ++ ++Some text editors make assumptions about desired indentation based on ++the number of @i{semicolons} that begin a comment. The following style ++conventions are common, although not by any means universal. ++ ++@node Use of Single Semicolon, Use of Double Semicolon, Notes about Style for Semicolon, Semicolon ++@subsubsection Use of Single Semicolon ++ ++Comments that begin with a single @i{semicolon} are all aligned to ++the same column at the right (sometimes called the ``comment column''). ++The text of such a comment generally applies only to the line on which it appears. ++Occasionally two or three contain a single sentence together; ++this is sometimes indicated by indenting all but the first with an additional ++space (after the @i{semicolon}). ++ ++@node Use of Double Semicolon, Use of Triple Semicolon, Use of Single Semicolon, Semicolon ++@subsubsection Use of Double Semicolon ++ ++Comments that begin with a double @i{semicolon} are all aligned to ++the same level of indentation as a @i{form} would be at that same ++position in the @i{code}. ++The text of such a comment usually describes ++ the state of the @i{program} at the point where the comment occurs, ++ the @i{code} which follows the comment, ++ or both. ++ ++@node Use of Triple Semicolon, Use of Quadruple Semicolon, Use of Double Semicolon, Semicolon ++@subsubsection Use of Triple Semicolon ++ ++Comments that begin with a triple @i{semicolon} are all aligned to ++the left margin. Usually they are used prior to a definition or set ++of definitions, rather than within a definition. ++ ++@node Use of Quadruple Semicolon, Examples of Style for Semicolon, Use of Triple Semicolon, Semicolon ++@subsubsection Use of Quadruple Semicolon ++ ++Comments that begin with a quadruple @i{semicolon} are all aligned to ++the left margin, and generally contain only a short piece of text that ++serve as a title for the code which follows, and might be used in the ++header or footer of a program that prepares code for presentation as ++a hardcopy document. ++ ++@node Examples of Style for Semicolon, , Use of Quadruple Semicolon, Semicolon ++@subsubsection Examples of Style for Semicolon ++ ++@example ++;;;; Math Utilities ++ ++;;; FIB computes the the Fibonacci function in the traditional ++;;; recursive way. ++ ++(defun fib (n) ++ (check-type n integer) ++ ;; At this point we're sure we have an integer argument. ++ ;; Now we can get down to some serious computation. ++ (cond ((< n 0) ++ ;; Hey, this is just supposed to be a simple example. ++ ;; Did you really expect me to handle the general case? ++ (error "FIB got ~D as an argument." n)) ++ ((< n 2) n) ;fib[0]=0 and fib[1]=1 ++ ;; The cheap cases didn't work. ++ ;; Nothing more to do but recurse. ++ (t (+ (fib (- n 1)) ;The traditional formula ++ (fib (- n 2)))))) ; is fib[n-1]+fib[n-2]. ++@end example ++ ++@node Double-Quote, Backquote, Semicolon, Standard Macro Characters ++@subsection Double-Quote ++ ++@b{Syntax:} @t{"<<@i{text}>>"} ++ ++The @i{double-quote} is used to begin and end a @i{string}. ++When a @i{double-quote} is encountered, ++@i{characters} are read from the @i{input} @i{stream} ++and accumulated until another @i{double-quote} is encountered. ++If a @i{single escape} @i{character} is seen, ++the @i{single escape} @i{character} is discarded, ++the next @i{character} is accumulated, and accumulation continues. ++The accumulated @i{characters} ++up to but not including the matching @i{double-quote} ++are made into a @i{simple string} and returned. ++ ++It is @i{implementation-dependent} ++which @i{attributes} of the accumulated characters are removed in this process. ++ ++Examples of the use of the @i{double-quote} character are in Figure 2--18. ++ ++@format ++@group ++@noindent ++@w{ @t{"Foo"} ;A string with three characters in it } ++@w{ @t{""} ;An empty string } ++@w{ @t{"\"APL\\360?\" he cried."} ;A string with twenty characters } ++@w{ @t{"|x| = |-x|"} ;A ten-character string } ++ ++@noindent ++@w{ Figure 2--18: Examples of the use of double-quote } ++ ++@end group ++@end format ++ ++Note that to place a single escape character or a @i{double-quote} into a string, ++such a character must be preceded by a single escape character. ++Note, too, that a multiple escape character need not be quoted by a ++single escape character within a string. ++ ++For information on how the @i{Lisp printer} prints @i{strings}, ++see @ref{Printing Strings}. ++ ++@node Backquote, Comma, Double-Quote, Standard Macro Characters ++@subsection Backquote ++ ++The @i{backquote} introduces a template of a data structure to be built. ++For example, writing ++ ++@example ++ `(cond ((numberp ,x) ,@@y) (t (print ,x) ,@@y)) ++@end example ++ ++is roughly equivalent to writing ++ ++@example ++ (list 'cond ++ (cons (list 'numberp x) y) ++ (list* 't (list 'print x) y)) ++@end example ++ ++Where a comma ++occurs in the template, ++the @i{expression} ++following the comma is to be evaluated to produce an @i{object} to ++be inserted at that point. Assume @t{b} has the value 3, for example, then ++evaluating the @i{form} denoted by @t{`(a b ,b ,(+ b 1) b)} produces ++the result @t{(a b 3 4 b)}. ++ ++If a comma is immediately followed by an @i{at-sign}, ++then the @i{form} following the @i{at-sign} ++is evaluated to produce a @i{list} of @i{objects}. ++These @i{objects} are then ``spliced'' into place in the template. For ++example, if @t{x} has the value @t{(a b c)}, then ++ ++@example ++ `(x ,x ,@@x foo ,(cadr x) bar ,(cdr x) baz ,@@(cdr x)) ++@result{} (x (a b c) a b c foo b bar (b c) baz b c) ++@end example ++ ++The backquote syntax can be summarized formally as follows. ++ ++@table @asis ++ ++@item @t{*} ++@t{`@i{basic}} is the same as @t{'@i{basic}}, ++that is, @t{(quote @i{basic})}, for any @i{expression} ++@i{basic} that is not a @i{list} or a general @i{vector}. ++ ++@item @t{*} ++@t{`,@i{form}} is the same as @i{form}, for any @i{form}, provided ++that the representation of @i{form} does not begin with @i{at-sign} ++or @i{dot}. (A similar caveat holds for all occurrences of a form after a @i{comma}.) ++ ++@item @t{*} ++@t{`,@@@i{form}} has undefined consequences. ++ ++@item @t{*} ++@t{`(x1 x2 x3 ... xn . atom)} ++may be interpreted to mean ++ ++@example ++ (append [ x1 ] [ x2 ] [ x3 ] ... [ xn ] (quote atom)) ++@end example ++ ++where the brackets are used to indicate ++a transformation of an @i{xj} as follows: ++ ++@table @asis ++ ++@item -- ++@t{[@i{form}]} is interpreted as @t{(list `@i{form})}, ++which contains a backquoted form that must then be further interpreted. ++ ++@item -- ++@t{[,@i{form}]} is interpreted as @t{(list @i{form})}. ++ ++@item -- ++@t{[,@@@i{form}]} is interpreted as @i{form}. ++@end table ++ ++@item @t{*} ++@t{`(x1 x2 x3 ... xn)} may be interpreted to mean ++the same as the backquoted form ++@t{`(x1 x2 x3 ... xn . @b{nil})}, ++thereby reducing it to the previous case. ++ ++@item @t{*} ++@t{`(x1 x2 x3 ... xn . ,form)} may be interpreted to mean ++ ++@example ++ (append [ x1 ] [ x2 ] [ x3 ] ... [ xn ] form) ++@end example ++ ++where the brackets indicate a transformation of an @t{xj} as described above. ++ ++@item @t{*} ++@t{`(x1 x2 x3 ... xn . ,@@form)} has undefined consequences. ++ ++@item @t{*} ++@t{`#(x1 x2 x3 ... xn)} may be interpreted to mean ++@t{(apply #'vector `(x1 x2 x3 ... xn))}. ++@end table ++ ++Anywhere ``@t{,@@}'' may be used, the syntax ``@t{,.}'' may be used instead ++to indicate that it is permissible to operate @i{destructively} on ++the @i{list structure} produced by the form following the ``@t{,.}'' ++(in effect, to use @b{nconc} instead of @b{append}). ++ ++If the backquote syntax is nested, the innermost backquoted form ++should be expanded first. This means that if several commas occur ++in a row, the leftmost one belongs to the innermost @i{backquote}. ++ ++An @i{implementation} is free to interpret a backquoted @i{form} F_1 ++as any @i{form} F_2 that, when evaluated, will produce a result that is ++the @i{same} under @b{equal} as the result implied by the above definition, ++provided that the side-effect behavior of the substitute @i{form} F_2 ++is also consistent with the description given above. ++The constructed ++copy of the template might or might not share @i{list} structure with the ++template itself. As an example, the above definition implies that ++ ++@example ++ `((,a b) ,c ,@@d) ++@end example ++ ++will be interpreted as if it were ++ ++@example ++ (append (list (append (list a) (list 'b) '@b{nil})) (list c) d '@b{nil}) ++@end example ++ ++but it could also be legitimately interpreted to mean any of the following: ++ ++@example ++ (append (list (append (list a) (list 'b))) (list c) d) ++ (append (list (append (list a) '(b))) (list c) d) ++ (list* (cons a '(b)) c d) ++ (list* (cons a (list 'b)) c d) ++ (append (list (cons a '(b))) (list c) d) ++ (list* (cons a '(b)) c (copy-list d)) ++@end example ++ ++@menu ++* Notes about Backquote:: ++@end menu ++ ++@node Notes about Backquote, , Backquote, Backquote ++@subsubsection Notes about Backquote ++ ++Since the exact manner in which the @i{Lisp reader} will parse ++an @i{expression} involving the @i{backquote} @i{reader macro} ++is not specified, an @i{implementation} is free to choose any ++representation that preserves the semantics described. ++ ++Often an @i{implementation} will choose a representation that facilitates ++pretty printing of the expression, so that @t{(pprint `(a ,b))} will display ++@t{`(a ,b)} and not, for example, @t{(list 'a b)}. However, this is not a ++requirement. ++ ++Implementors who have no particular reason to make one choice or another ++might wish to refer to @b{IEEE Standard for the Scheme Programming Language}, which identifies a popular choice of ++representation for such expressions that might provide useful to be useful ++compatibility for some user communities. There is no requirement, however, ++that any @i{conforming implementation} use this particular representation. ++This information is provided merely for cross-reference purposes. ++ ++@node Comma, Sharpsign, Backquote, Standard Macro Characters ++@subsection Comma ++ ++The @i{comma} is part of the backquote syntax; see @ref{Backquote}. ++@i{Comma} is invalid if used other than inside the body of a ++backquote @i{expression} as described above. ++ ++@node Sharpsign, Re-Reading Abbreviated Expressions, Comma, Standard Macro Characters ++@subsection Sharpsign ++ ++@i{Sharpsign} is a @i{non-terminating} @i{dispatching macro character}. ++It reads an optional ++sequence of digits and then one more character, ++and uses that character to select a @i{function} to run as a ++@i{reader macro function}. ++ ++The @i{standard syntax} includes constructs introduced by the @t{#} character. ++The syntax of these constructs is as follows: ++a character that identifies the type of construct is ++followed by arguments in some form. ++If the character is a letter, its @i{case} is not important; ++@t{#O} and @t{#o} are considered to be equivalent, for example. ++ ++Certain @t{#} constructs allow an unsigned decimal number to appear ++between the @t{#} and the character. ++ ++The @i{reader macros} associated with the @i{dispatching macro character} @t{#} ++are described later in this section and summarized in Figure 2--19. ++ ++ ++ ++@format ++@group ++@noindent ++@w{ dispatch char purpose dispatch char purpose } ++@w{ Backspace signals error @t{@{} undefined* } ++@w{ Tab signals error @t{@}} undefined* } ++@w{ Newline signals error + read-time conditional } ++@w{ Linefeed signals error - read-time conditional } ++@w{ Page signals error . read-time evaluation } ++@w{ Return signals error / undefined } ++@w{ Space signals error A, a array } ++@w{ ! undefined* B, b binary rational } ++@w{ @t{"} undefined C, c complex number } ++@w{ # reference to = label D, d undefined } ++@w{ $ undefined E, e undefined } ++@w{ % undefined F, f undefined } ++@w{ & undefined G, g undefined } ++@w{ ' function abbreviation H, h undefined } ++@w{ ( simple vector I, i undefined } ++@w{ ) signals error J, j undefined } ++@w{ @t{*} bit vector K, k undefined } ++@w{ , undefined L, l undefined } ++@w{ : uninterned symbol M, m undefined } ++@w{ ; undefined N, n undefined } ++@w{ @t{<} signals error O, o octal rational } ++@w{ @t{=} labels following object P, p pathname } ++@w{ @t{>} undefined Q, q undefined } ++@w{ ? undefined* R, r radix-n rational } ++@w{ @@ undefined S, s structure } ++@w{ [ undefined* T, t undefined } ++@w{ @t{\} character object U, u undefined } ++@w{ ] undefined* V, v undefined } ++@w{ @t{^} undefined W, w undefined } ++@w{ @t{_} undefined X, x hexadecimal rational } ++@w{ ` undefined Y, y undefined } ++@w{ @t{|} balanced comment Z, z undefined } ++@w{ @t{~} undefined Rubout undefined } ++ ++@noindent ++@w{ Figure 2--19: Standard # Dispatching Macro Character Syntax } ++ ++@end group ++@end format ++ ++ ++The combinations marked by an asterisk (*) are explicitly reserved to the ++user. No @i{conforming implementation} defines them. ++ ++Note also that @i{digits} do not appear in the preceding table. This is ++because the notations @t{#0}, @t{#1}, ..., @t{#9} are ++reserved for another purpose which occupies the same syntactic space. ++When a @i{digit} follows a @i{sharpsign}, ++it is not treated as a dispatch character. ++Instead, an unsigned integer argument is accumulated ++and passed as an @i{argument} to the @i{reader macro} ++for the @i{character} that follows the digits. ++For example, ++@t{#2A((1 2) (3 4))} is a use of @t{#A} with an argument of @t{2}. ++ ++@menu ++* Sharpsign Backslash:: ++* Sharpsign Single-Quote:: ++* Sharpsign Left-Parenthesis:: ++* Sharpsign Asterisk:: ++* Examples of Sharpsign Asterisk:: ++* Sharpsign Colon:: ++* Sharpsign Dot:: ++* Sharpsign B:: ++* Sharpsign O:: ++* Sharpsign X:: ++* Sharpsign R:: ++* Sharpsign C:: ++* Sharpsign A:: ++* Sharpsign S:: ++* Sharpsign P:: ++* Sharpsign Equal-Sign:: ++* Sharpsign Sharpsign:: ++* Sharpsign Plus:: ++* Sharpsign Minus:: ++* Sharpsign Vertical-Bar:: ++* Examples of Sharpsign Vertical-Bar:: ++* Notes about Style for Sharpsign Vertical-Bar:: ++* Sharpsign Less-Than-Sign:: ++* Sharpsign Whitespace:: ++* Sharpsign Right-Parenthesis:: ++@end menu ++ ++@node Sharpsign Backslash, Sharpsign Single-Quote, Sharpsign, Sharpsign ++@subsubsection Sharpsign Backslash ++ ++@b{Syntax:} @t{#\<<@i{x}>>} ++ ++When the @i{token} @i{x} is a single @i{character} long, ++this parses as the literal @i{character} @i{char}. ++@i{Uppercase} and @i{lowercase} letters are distinguished after @t{#\}; ++@t{#\A} and @t{#\a} denote different @i{character} @i{objects}. ++Any single @i{character} works after @t{#\}, ++even those that are normally special to @b{read}, ++such as @i{left-parenthesis} and @i{right-parenthesis}. ++ ++In the single @i{character} case, ++the @i{x} must be followed by a non-constituent @i{character}. ++After @t{#\} is read, ++the reader backs up over the @i{slash} and then reads a @i{token}, ++treating the initial @i{slash} as a @i{single escape} @i{character} ++(whether it really is or not in the @i{current readtable}). ++ ++When the @i{token} @i{x} is more than one @i{character} long, ++the @i{x} must have the syntax of a @i{symbol} ++with no embedded @i{package markers}. ++In this case, the @i{sharpsign} @i{backslash} notation ++parses as the @i{character} whose @i{name} is @t{(string-upcase @i{x})}; ++see @ref{Character Names}. ++ ++For information about how the @i{Lisp printer} prints @i{character} @i{objects}, ++see @ref{Printing Characters}. ++ ++@node Sharpsign Single-Quote, Sharpsign Left-Parenthesis, Sharpsign Backslash, Sharpsign ++@subsubsection Sharpsign Single-Quote ++ ++Any @i{expression} preceded by @t{#'} ++(@i{sharpsign} followed by @i{single-quote}), ++as in @t{#'@i{expression}}, ++is treated by the @i{Lisp reader} as an abbreviation for and parsed identically ++to the @i{expression} @t{(function @i{expression})}. ++See @b{function}. For example, ++ ++@example ++(apply #'+ l) @equiv{} (apply (function +) l) ++@end example ++ ++@node Sharpsign Left-Parenthesis, Sharpsign Asterisk, Sharpsign Single-Quote, Sharpsign ++@subsubsection Sharpsign Left-Parenthesis ++ ++@t{#(} and @t{)} are used to notate a @i{simple vector}. ++ ++If an unsigned decimal integer ++appears between the @t{#} and @t{(}, ++it specifies explicitly the length of the @i{vector}. ++The consequences are undefined if the number of @i{objects} ++specified before the closing @t{)} ++exceeds the unsigned decimal integer. ++If the number of @i{objects} supplied before the closing @t{)} ++is less than the unsigned decimal integer but greater than zero, ++the last @i{object} ++is used to fill all ++remaining elements of the @i{vector}. ++ ++[Editorial Note by Barmar: This should say "signals...".] ++The consequences are undefined if the unsigned decimal integer is non-zero and ++number of @i{objects} supplied before the closing @t{)} ++is zero. ++For example, ++ ++@example ++ #(a b c c c c) ++ #6(a b c c c c) ++ #6(a b c) ++ #6(a b c c) ++@end example ++ ++all mean the same thing: a @i{vector} of length @t{6} ++with @i{elements} @t{a}, @t{b}, and four occurrences of @t{c}. ++Other examples follow: ++ ++@example ++ #(a b c) ;A vector of length 3 ++ #(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47) ++ ;A vector containing the primes below 50 ++ #() ;An empty vector ++@end example ++ ++The notation @t{#()} denotes an empty @i{vector}, as does @t{#0()}. ++ ++For information on how the @i{Lisp printer} prints @i{vectors}, ++see @ref{Printing Strings}, ++ @ref{Printing Bit Vectors}, ++ or @ref{Printing Other Vectors}. ++ ++@node Sharpsign Asterisk, Examples of Sharpsign Asterisk, Sharpsign Left-Parenthesis, Sharpsign ++@subsubsection Sharpsign Asterisk ++ ++@b{Syntax:} @t{#*<<@i{bits}>>} ++ ++A @i{simple bit vector} is constructed containing the indicated @i{bits} ++(@t{0}'s and @t{1}'s), where the leftmost @i{bit} has index zero ++and the subsequent @i{bits} have increasing indices. ++ ++@b{Syntax:} @t{#<<@i{n}>>*<<@i{bits}>>} ++ ++With an argument @i{n}, ++the @i{vector} to be created is of @i{length} @i{n}. ++If the number of @i{bits} is less than @i{n} but greater than zero, ++the last bit is used to fill all remaining bits of the @i{bit vector}. ++ ++The notations @t{#*} and @t{#0*} each denote an empty @i{bit vector}. ++ ++Regardless of whether the optional numeric argument @i{n} is provided, ++the @i{token} that follows the @i{asterisk} is delimited by ++a normal @i{token} delimiter. ++However, (unless the @i{value} of @b{*read-suppress*} is @i{true}) ++an error of @i{type} @b{reader-error} is signaled ++ if that @i{token} is not composed entirely of @t{0}'s and @t{1}'s, ++ or if @i{n} was supplied ++ and the @i{token} is composed of more than @i{n} @i{bits}, ++ or if @i{n} is greater than one, but no @i{bits} were specified. ++Neither a @i{single escape} nor a @i{multiple escape} is permitted in this @i{token}. ++ ++For information on how the @i{Lisp printer} prints @i{bit vectors}, ++see @ref{Printing Bit Vectors}. ++ ++@node Examples of Sharpsign Asterisk, Sharpsign Colon, Sharpsign Asterisk, Sharpsign ++@subsubsection Examples of Sharpsign Asterisk ++ ++For example, ++@example ++ #*101111 ++ #6*101111 ++ #6*101 ++ #6*1011 ++@end example ++ ++all mean the same thing: a @i{vector} of length @t{6} ++with @i{elements} @t{1}, @t{0}, @t{1}, @t{1}, @t{1}, and @t{1}. ++ ++For example: ++ ++@example ++ #* ;An empty bit-vector ++@end example ++ ++@node Sharpsign Colon, Sharpsign Dot, Examples of Sharpsign Asterisk, Sharpsign ++@subsubsection Sharpsign Colon ++ ++@b{Syntax:} @t{#:<<@i{symbol-name}>>} ++ ++@t{#:} introduces an @i{uninterned} @i{symbol} whose @i{name} ++is @i{symbol-name}. Every time this syntax is encountered, ++a @i{distinct} @i{uninterned} @i{symbol} is created. ++The @i{symbol-name} must have the syntax of a @i{symbol} ++with no @i{package prefix}. ++ ++For information on how the @i{Lisp reader} ++prints @i{uninterned} @i{symbols}, ++see @ref{Printing Symbols}. ++ ++@node Sharpsign Dot, Sharpsign B, Sharpsign Colon, Sharpsign ++@subsubsection Sharpsign Dot ++ ++@t{#.@i{foo}} is read as the @i{object} resulting from the evaluation ++of the @i{object} represented by @i{foo}. ++The evaluation is done during the @b{read} process, ++when the @t{#.} notation is encountered. ++The @t{#.} syntax therefore performs a read-time evaluation of @i{foo}. ++ ++The normal effect of @t{#.} is inhibited when the @i{value} of @b{*read-eval*} is @i{false}. ++ ++In that situation, an error of @i{type} @b{reader-error} is signaled. ++ ++For an @i{object} ++that does not have a convenient printed ++representation, a @i{form} that computes the @i{object} can be given using ++the @t{#.} notation. ++ ++@node Sharpsign B, Sharpsign O, Sharpsign Dot, Sharpsign ++@subsubsection Sharpsign B ++ ++@t{#B}@i{rational} reads @i{rational} in binary (radix 2). ++For example, ++ ++@example ++ #B1101 @equiv{} 13 ;1101_2 ++ #b101/11 @equiv{} 5/3 ++@end example ++ ++The consequences are undefined if the token immediately following ++the @t{#B} does not have the syntax of a binary (@i{i.e.}, radix 2) @i{rational}. ++ ++@node Sharpsign O, Sharpsign X, Sharpsign B, Sharpsign ++@subsubsection Sharpsign O ++ ++@t{#O}@i{rational} reads @i{rational} in octal (radix 8). ++For example, ++ ++@example ++ #o37/15 @equiv{} 31/13 ++ #o777 @equiv{} 511 ++ #o105 @equiv{} 69 ;105_8 ++@end example ++ ++The consequences are undefined if the token immediately following ++the @t{#O} does not have the syntax of an octal (@i{i.e.}, radix 8) @i{rational}. ++ ++@node Sharpsign X, Sharpsign R, Sharpsign O, Sharpsign ++@subsubsection Sharpsign X ++ ++@t{#X}@i{rational} reads @i{rational} in hexadecimal (radix 16). ++The digits above @t{9} are the letters @t{A} through @t{F} (the lowercase ++letters @t{a} through @t{f} are also acceptable). For example, ++ ++@example ++ #xF00 @equiv{} 3840 ++ #x105 @equiv{} 261 ;105_@t{16} ++@end example ++ ++The consequences are undefined if the token immediately following ++the @t{#X} does not have the syntax of a hexadecimal (@i{i.e.}, radix 16) @i{rational}. ++ ++@node Sharpsign R, Sharpsign C, Sharpsign X, Sharpsign ++@subsubsection Sharpsign R ++ ++@t{#@i{n}R} ++ ++@t{#@i{radix}R@i{rational}} reads @i{rational} in radix @i{radix}. ++@i{radix} must consist of only digits ++that are interpreted as an @i{integer} ++in decimal radix; its value must be between 2 and 36 (inclusive). ++Only valid digits ++for the specified radix may be used. ++ ++For example, @t{#3r102} is another way of writing @t{11} (decimal), ++and @t{#11R32} ++is another way of writing @t{35} (decimal). ++For radices larger than 10, letters of ++the alphabet are used in order for the digits after @t{9}. ++No alternate @t{#} notation exists for the decimal radix since a ++decimal point suffices. ++ ++Figure 2--20 contains examples of the use of @t{#B}, ++@t{#O}, @t{#X}, and @t{#R}. ++ ++@format ++@group ++@noindent ++@w{ @t{#2r11010101} ;Another way of writing @t{213} decimal } ++@w{ @t{#b11010101} ;Ditto } ++@w{ @t{#b+11010101} ;Ditto } ++@w{ @t{#o325} ;Ditto, in octal radix } ++@w{ @t{#xD5} ;Ditto, in hexadecimal radix } ++@w{ @t{#16r+D5} ;Ditto } ++@w{ @t{#o-300} ;Decimal @t{-192}, written in base 8 } ++@w{ @t{#3r-21010} ;Same thing in base 3 } ++@w{ @t{#25R-7H} ;Same thing in base 25 } ++@w{ @t{#xACCEDED} ;@t{181202413}, in hexadecimal radix } ++ ++@noindent ++@w{ Figure 2--20: Radix Indicator Example } ++ ++@end group ++@end format ++ ++The consequences are undefined if the token immediately following ++the @t{#@i{n}R} does not have the syntax of a @i{rational} in radix @i{n}. ++ ++@node Sharpsign C, Sharpsign A, Sharpsign R, Sharpsign ++@subsubsection Sharpsign C ++ ++@t{#C} reads a following @i{object}, which must be a @i{list} of ++length two whose @i{elements} are both @i{reals}. ++These @i{reals} denote, respectively, ++the real and imaginary parts of a @i{complex} number. ++ ++If the two parts as notated are not of the same data type, ++then they are converted ++according to the rules of floating-point @i{contagion} ++described in @ref{Contagion in Numeric Operations}. ++ ++@t{#C(@i{real} @i{imag})} is equivalent to ++@t{#.(complex (quote @i{real}) (quote @i{imag}))}, ++except that @t{#C} is not affected by @b{*read-eval*}. ++See the @i{function} @b{complex}. ++ ++Figure 2--21 contains examples of the use of @t{#C}. ++ ++@format ++@group ++@noindent ++@w{ @t{#C(3.0s1 2.0s-1)} ;A @i{complex} with @i{small float} parts. } ++@w{ @t{#C(5 -3) } ;A ``Gaussian integer'' } ++@w{ @t{#C(5/3 7.0) } ;Will be converted internally to @t{#C(1.66666 7.0)} } ++@w{ @t{#C(0 1)} ;The imaginary unit; that is, i. } ++ ++@noindent ++@w{ Figure 2--21: Complex Number Example } ++ ++@end group ++@end format ++ ++For further information, ++see @ref{Printing Complexes} and @ref{Syntax of a Complex}. ++ ++@node Sharpsign A, Sharpsign S, Sharpsign C, Sharpsign ++@subsubsection Sharpsign A ++ ++@t{#@i{n}A} ++ ++@t{#@i{n}@t{A}@i{object}} constructs an @i{n}-dimensional @i{array}, ++using @i{object} as the value of the @t{:initial-contents} argument ++to @b{make-array}. ++ ++For example, @t{#2A((0 1 5) (foo 2 (hot dog)))} represents a 2-by-3 matrix: ++ ++@example ++ 0 1 5 ++ foo 2 (hot dog) ++@end example ++ ++In contrast, @t{#1A((0 1 5) (foo 2 (hot dog)))} ++represents a @i{vector} of @i{length} @t{2} ++whose @i{elements} are @i{lists}: ++ ++@example ++ (0 1 5) (foo 2 (hot dog)) ++@end example ++ ++@t{#0A((0 1 5) (foo 2 (hot dog)))} represents a zero-dimensional ++@i{array} whose sole element is a @i{list}: ++ ++@example ++ ((0 1 5) (foo 2 (hot dog))) ++@end example ++ ++@t{#0A foo} represents ++a zero-dimensional @i{array} whose sole element is the ++@i{symbol} @t{foo}. ++The notation @t{#1A foo} is not valid because @t{foo} is ++not a @i{sequence}. ++ ++If some @i{dimension} of the @i{array} ++whose representation is being parsed is found to be @t{0}, ++all @i{dimensions} to the right ++(@i{i.e.}, the higher numbered @i{dimensions}) ++are also considered to be @t{0}. ++ ++For information on how the @i{Lisp printer} prints @i{arrays}, ++see @ref{Printing Strings}, ++ @ref{Printing Bit Vectors}, ++ @ref{Printing Other Vectors}, ++ or @ref{Printing Other Arrays}. ++ ++@node Sharpsign S, Sharpsign P, Sharpsign A, Sharpsign ++@subsubsection Sharpsign S ++ ++@t{#s(name slot1 value1 slot2 value2 ...)} ++denotes a @i{structure}. This is valid only if @i{name} is the name ++of a @i{structure} @i{type} already defined by @b{defstruct} ++and if the @i{structure} @i{type} has a standard constructor function. ++Let @i{cm} stand for the name of this constructor function; ++then this syntax is equivalent to ++ ++@example ++ #.(cm keyword1 'value1 keyword2 'value2 ...) ++@end example ++ ++where each @i{keywordj} is the result of computing ++ ++@example ++ (intern (string slotj) (find-package 'keyword)) ++@end example ++ ++The net effect is that the constructor function is called with the specified ++slots having the specified values. ++ ++(This coercion feature is deprecated; in the future, keyword names will ++ be taken in the package they are read in, so @i{symbols} that are ++ actually in the @t{KEYWORD} @i{package} should be used if that is what is desired.) ++ ++Whatever @i{object} the constructor function returns ++is returned by the @t{#S} syntax. ++ ++For information on how the @i{Lisp printer} prints @i{structures}, ++see @ref{Printing Structures}. ++ ++@node Sharpsign P, Sharpsign Equal-Sign, Sharpsign S, Sharpsign ++@subsubsection Sharpsign P ++ ++@t{#P} reads a following @i{object}, which must be a @i{string}. ++ ++@t{#P<<@i{expression}>>} is equivalent to ++@t{#.(parse-namestring '<<@i{expression}>>)}, ++except that @t{#P} is not affected by @b{*read-eval*}. ++ ++For information on how the @i{Lisp printer} prints @i{pathnames}, ++see @ref{Printing Pathnames}. ++ ++@node Sharpsign Equal-Sign, Sharpsign Sharpsign, Sharpsign P, Sharpsign ++@subsubsection Sharpsign Equal-Sign ++ ++@t{#@i{n}=} ++ ++@t{#@i{n}=@i{object}} reads as whatever @i{object} ++has @i{object} as its printed representation. However, that @i{object} ++is labeled by @i{n}, a required unsigned decimal integer, for ++possible reference by the syntax @t{#@i{n}#}. ++The scope of the label is the @i{expression} being read by the outermost ++call to @b{read}; within this @i{expression}, ++the same label may not appear twice. ++ ++@node Sharpsign Sharpsign, Sharpsign Plus, Sharpsign Equal-Sign, Sharpsign ++@subsubsection Sharpsign Sharpsign ++ ++@t{#@i{n}#} ++ ++@t{#@i{n}#}, where @i{n} is a required unsigned decimal ++@i{integer}, ++provides a reference to some @i{object} labeled by @t{#@i{n}=}; ++that is, @t{#@i{n}#} represents a pointer to the same ++(@b{eq}) @i{object} labeled by @t{#@i{n}=}. ++For example, a structure created in the variable @t{y} by this code: ++ ++@example ++ (setq x (list 'p 'q)) ++ (setq y (list (list 'a 'b) x 'foo x)) ++ (rplacd (last y) (cdr y)) ++@end example ++ ++could be represented in this way: ++ ++@example ++ ((a b) . #1=(#2=(p q) foo #2# . #1#)) ++@end example ++ ++Without this notation, but with @b{*print-length*} set to @t{10} ++and @b{*print-circle*} set to @b{nil}, ++the structure would print in this way: ++ ++@example ++ ((a b) (p q) foo (p q) (p q) foo (p q) (p q) foo (p q) ...) ++@end example ++ ++A reference @t{#@i{n}#} may only occur after a label @t{#@i{n}=}; ++forward references are not permitted. The reference ++may not appear as the labeled object itself (that is, ++@t{#@i{n}=#@i{n}#}) may not be written ++because the @i{object} ++labeled by @t{#@i{n}=} is not well defined in this case. ++ ++@node Sharpsign Plus, Sharpsign Minus, Sharpsign Sharpsign, Sharpsign ++@subsubsection Sharpsign Plus ++ ++@t{#+} provides a read-time conditionalization facility; ++the syntax is @t{#+@i{test} @i{expression}}. ++If the @i{feature expression} @i{test} succeeds, ++then this textual notation represents an @i{object} ++ whose printed representation is @i{expression}. ++If the @i{feature expression} @i{test} fails, ++then this textual notation is treated as @i{whitespace}_2; ++ that is, it is as if the ``@t{#+} @i{test} @i{expression}'' ++ did not appear and only a @i{space} appeared in its place. ++ ++For a detailed description of success and failure in @i{feature expressions}, ++see @ref{Feature Expressions}. ++ ++@t{#+} operates by first reading the @i{feature expression} ++and then skipping over the @i{form} if the @i{feature expression} fails. ++ ++While reading the @i{test}, the @i{current package} is the @t{KEYWORD} @i{package}. ++ ++Skipping over the @i{form} is accomplished by @i{binding} ++@b{*read-suppress*} to @i{true} and then calling @b{read}. ++ ++For examples, see @ref{Examples of Feature Expressions}. ++ ++@node Sharpsign Minus, Sharpsign Vertical-Bar, Sharpsign Plus, Sharpsign ++@subsubsection Sharpsign Minus ++ ++@t{#-} is like @t{#+} ++except that it skips the @i{expression} if the @i{test} succeeds; ++that is, ++ ++@example ++#-@i{test} @i{expression} @equiv{} #+(not @i{test}) @i{expression} ++@end example ++ ++For examples, see @ref{Examples of Feature Expressions}. ++ ++@node Sharpsign Vertical-Bar, Examples of Sharpsign Vertical-Bar, Sharpsign Minus, Sharpsign ++@subsubsection Sharpsign Vertical-Bar ++ ++@t{#|...|#} is treated as a comment by the reader. ++It must be balanced with respect to other occurrences of @t{#|} and @t{|#}, ++but otherwise may contain any characters whatsoever. ++ ++@node Examples of Sharpsign Vertical-Bar, Notes about Style for Sharpsign Vertical-Bar, Sharpsign Vertical-Bar, Sharpsign ++@subsubsection Examples of Sharpsign Vertical-Bar ++ ++The following are some examples that exploit the @t{#|...|#} notation: ++ ++@example ++;;; In this example, some debugging code is commented out with #|...|# ++;;; Note that this kind of comment can occur in the middle of a line ++;;; (because a delimiter marks where the end of the comment occurs) ++;;; where a semicolon comment can only occur at the end of a line ++;;; (because it comments out the rest of the line). ++ (defun add3 (n) #|(format t "~&Adding 3 to ~D." n)|# (+ n 3)) ++ ++;;; The examples that follow show issues related to #| ... |# nesting. ++ ++;;; In this first example, #| and |# always occur properly paired, ++;;; so nesting works naturally. ++ (defun mention-fun-fact-1a () ++ (format t "CL uses ; and #|...|# in comments.")) ++@result{} MENTION-FUN-FACT-1A ++ (mention-fun-fact-1a) ++@t{ |> } CL uses ; and #|...|# in comments. ++@result{} NIL ++ #| (defun mention-fun-fact-1b () ++ (format t "CL uses ; and #|...|# in comments.")) |# ++ (fboundp 'mention-fun-fact-1b) @result{} NIL ++ ++;;; In this example, vertical-bar followed by sharpsign needed to appear ++;;; in a string without any matching sharpsign followed by vertical-bar ++;;; having preceded this. To compensate, the programmer has included a ++;;; slash separating the two characters. In case 2a, the slash is ++;;; unnecessary but harmless, but in case 2b, the slash is critical to ++;;; allowing the outer #| ... |# pair match. If the slash were not present, ++;;; the outer comment would terminate prematurely. ++ (defun mention-fun-fact-2a () ++ (format t "Don't use |\# unmatched or you'll get in trouble!")) ++@result{} MENTION-FUN-FACT-2A ++ (mention-fun-fact-2a) ++@t{ |> } Don't use |# unmatched or you'll get in trouble! ++@result{} NIL ++ #| (defun mention-fun-fact-2b () ++ (format t "Don't use |\# unmatched or you'll get in trouble!") |# ++ (fboundp 'mention-fun-fact-2b) @result{} NIL ++ ++;;; In this example, the programmer attacks the mismatch problem in a ++;;; different way. The sharpsign vertical bar in the comment is not needed ++;;; for the correct parsing of the program normally (as in case 3a), but ++;;; becomes important to avoid premature termination of a comment when such ++;;; a program is commented out (as in case 3b). ++ (defun mention-fun-fact-3a () ; #| ++ (format t "Don't use |# unmatched or you'll get in trouble!")) ++@result{} MENTION-FUN-FACT-3A ++ (mention-fun-fact-3a) ++@t{ |> } Don't use |# unmatched or you'll get in trouble! ++@result{} NIL ++ #| ++ (defun mention-fun-fact-3b () ; #| ++ (format t "Don't use |# unmatched or you'll get in trouble!")) ++ |# ++ (fboundp 'mention-fun-fact-3b) @result{} NIL ++@end example ++ ++@node Notes about Style for Sharpsign Vertical-Bar, Sharpsign Less-Than-Sign, Examples of Sharpsign Vertical-Bar, Sharpsign ++@subsubsection Notes about Style for Sharpsign Vertical-Bar ++ ++Some text editors that purport to understand Lisp syntax treat any @t{|...|} ++as balanced pairs that cannot nest (as if they were just balanced pairs of ++the multiple escapes used in notating certain symbols). To compensate for ++this deficiency, some programmers use the notation @t{#||...#||...||#...||#} ++instead of @t{#|...#|...|#...|#}. Note that this alternate usage is not ++a different @i{reader macro}; it merely exploits the fact that the additional ++vertical-bars occur within the comment in a way that tricks certain text editor ++into better supporting nested comments. As such, one might sometimes see code ++like: ++ ++@example ++ #|| (+ #|| 3 ||# 4 5) ||# ++@end example ++ ++Such code is equivalent to: ++ ++@example ++ #| (+ #| 3 |# 4 5) |# ++@end example ++ ++@node Sharpsign Less-Than-Sign, Sharpsign Whitespace, Notes about Style for Sharpsign Vertical-Bar, Sharpsign ++@subsubsection Sharpsign Less-Than-Sign ++ ++@t{#<} is not valid reader syntax. ++The @i{Lisp reader} will signal an error ++ ++of @i{type} @b{reader-error} ++ ++on encountering @t{#<}. ++This syntax is typically used in the printed representation ++of @i{objects} that cannot be read back in. ++ ++@node Sharpsign Whitespace, Sharpsign Right-Parenthesis, Sharpsign Less-Than-Sign, Sharpsign ++@subsubsection Sharpsign Whitespace ++ ++@t{#} followed immediately by @i{whitespace}_1 is not valid reader syntax. ++The @i{Lisp reader} will signal an error of @i{type} @b{reader-error} if it ++encounters the reader macro notation @t{#<@i{Newline}>} or @t{#<@i{Space}>}. ++ ++@node Sharpsign Right-Parenthesis, , Sharpsign Whitespace, Sharpsign ++@subsubsection Sharpsign Right-Parenthesis ++ ++This is not valid reader syntax. ++ ++The @i{Lisp reader} will signal an error ++ ++of @i{type} @b{reader-error} ++ ++upon encountering @t{#)}. ++ ++@node Re-Reading Abbreviated Expressions, , Sharpsign, Standard Macro Characters ++@subsection Re-Reading Abbreviated Expressions ++ ++Note that the @i{Lisp reader} will ++generally ++signal an error of @i{type} @b{reader-error} ++when reading an @i{expression}_2 that has been ++abbreviated because of length or level limits ++(see @b{*print-level*}, ++ @b{*print-length*}, ++ and @b{*print-lines*}) ++due to restrictions on ``@t{..}'', ``@t{...}'', ``@t{#}'' followed by @i{whitespace}_1, ++and ``@t{#)}''. ++ ++@c end of including concept-macro-chars ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-20.texi +@@ -0,0 +1,730 @@ ++ ++ ++@node Files, Streams, Filenames, Top ++@chapter Files ++ ++@menu ++* File System Concepts:: ++* Files Dictionary:: ++@end menu ++ ++@node File System Concepts, Files Dictionary, Files, Files ++@section File System Concepts ++ ++@c including concept-files ++ ++This section describes the @r{Common Lisp} interface to file systems. ++The model used by this interface assumes ++ that @i{files} ++@IGindex file ++ are named by @i{filenames} ++@IGindex filename ++, ++ that a @i{filename} can be represented by a @i{pathname} @i{object}, ++ and that given a @i{pathname} a @i{stream} ++@IGindex stream ++ can be constructed ++ that connects to a @i{file} whose @i{filename} it represents. ++ ++For information about opening and closing @i{files}, ++and manipulating their contents, see @ref{Streams}. ++ ++Figure 20--1 lists some @i{operators} ++that are applicable to @i{files} and directories. ++ ++@format ++@group ++@noindent ++@w{ compile-file file-length open } ++@w{ delete-file file-position probe-file } ++@w{ directory file-write-date rename-file } ++@w{ file-author load with-open-file } ++ ++@noindent ++@w{ Figure 20--1: File and Directory Operations } ++ ++@end group ++@end format ++ ++@menu ++* Coercion of Streams to Pathnames:: ++* File Operations on Open and Closed Streams:: ++* Truenames:: ++@end menu ++ ++@node Coercion of Streams to Pathnames, File Operations on Open and Closed Streams, File System Concepts, File System Concepts ++@subsection Coercion of Streams to Pathnames ++ ++A @i{stream associated with a file} ++@IGindex stream associated with a file ++ is either a @i{file stream} ++or a @i{synonym stream} whose target is a @i{stream associated with a file} ++@IGindex stream associated with a file ++. ++Such streams can be used as @i{pathname designators}. ++ ++Normally, when a @i{stream associated with a file} is used as a ++@i{pathname designator}, it denotes the @i{pathname} used to ++open the @i{file}; this may be, but is not required to be, the ++actual name of the @i{file}. ++ ++Some functions, such as @b{truename} and @b{delete-file}, ++coerce @i{streams} to @i{pathnames} in a different way that ++involves referring to the actual @i{file} that is open, which might ++or might not be the file whose name was opened originally. Such special ++situations are always notated specifically and are not the default. ++ ++@node File Operations on Open and Closed Streams, Truenames, Coercion of Streams to Pathnames, File System Concepts ++@subsection File Operations on Open and Closed Streams ++ ++Many @i{functions} that perform @i{file} operations accept either ++@i{open} or @i{closed} @i{streams} as @i{arguments}; ++see @ref{Stream Arguments to Standardized Functions}. ++ ++Of these, the @i{functions} in Figure 20--2 treat @i{open} and ++@i{closed} @i{streams} differently. ++ ++@format ++@group ++@noindent ++@w{ delete-file file-author probe-file } ++@w{ directory file-write-date truename } ++ ++@noindent ++@w{ Figure 20--2: File Functions that Treat Open and Closed Streams Differently} ++ ++@end group ++@end format ++ ++Since treatment of @i{open} @i{streams} by the @i{file system} ++may vary considerably between @i{implementations}, however, ++a @i{closed} @i{stream} might be the most reliable kind of ++@i{argument} for some of these functions---in particular, those in ++Figure 20--3. For example, in some @i{file systems}, ++@i{open} @i{files} are written under temporary names ++and not renamed until @i{closed} ++and/or are held invisible until @i{closed}. ++In general, any code that is intended to be portable should ++use such @i{functions} carefully. ++ ++@format ++@group ++@noindent ++@w{ directory probe-file truename } ++ ++@noindent ++@w{ Figure 20--3: File Functions where Closed Streams Might Work Best} ++ ++@end group ++@end format ++ ++@node Truenames, , File Operations on Open and Closed Streams, File System Concepts ++@subsection Truenames ++ ++Many @i{file systems} permit more than one @i{filename} to designate ++a particular @i{file}. ++ ++Even where multiple names are possible, most @i{file systems} have a convention ++for generating a canonical @i{filename} in such situations. Such a canonical ++@i{filename} (or the @i{pathname} representing such a @i{filename}) is ++called a @i{truename} ++@IGindex truename ++. ++ ++The @i{truename} of a @i{file} may differ from other @i{filenames} ++for the file because of ++ symbolic links, ++ version numbers, ++ logical device translations in the @i{file system}, ++ @i{logical pathname} translations within @r{Common Lisp}, ++ or other artifacts of the @i{file system}. ++ ++The @i{truename} for a @i{file} is often, but not necessarily, unique for ++each @i{file}. For instance, a Unix @i{file} with multiple hard links ++could have several @i{truenames}. ++ ++@menu ++* Examples of Truenames:: ++@end menu ++ ++@node Examples of Truenames, , Truenames, Truenames ++@subsubsection Examples of Truenames ++ ++For example, a DEC TOPS-20 system with @i{files} @t{PS:FOO.TXT.1} ++and @t{PS:FOO.TXT.2} might permit the second @i{file} to be referred ++to as @t{PS:FOO.TXT.0}, since the ``@t{.0}'' notation denotes ``newest'' ++version of several @i{files}. ++In the same @i{file system}, a ``logical device'' ``@t{JOE:}'' might be ++taken to refer to @t{PS:}'' and so the names @t{JOE:FOO.TXT.2} or ++@t{JOE:FOO.TXT.0} might refer to @t{PS:FOO.TXT.2}. ++In all of these cases, the @i{truename} of the file would probably be ++@t{PS:FOO.TXT.2}. ++ ++If a @i{file} is a symbolic link to another @i{file} (in a @i{file system} ++permitting such a thing), it is conventional for the @i{truename} to be ++the canonical name of the @i{file} after any symbolic links have been followed; ++that is, it is the canonical name of the @i{file} whose contents would ++become available if an @i{input} @i{stream} to that @i{file} were ++opened. ++ ++In the case of a @i{file} still being created (that is, of an @i{output} ++@i{stream} open to such a @i{file}), the exact @i{truename} of the file ++might not be known until the @i{stream} is closed. In this case, ++the @i{function} @b{truename} might return different values for such a @i{stream} ++before and after it was closed. In fact, before it is closed, the name returned ++might not even be a valid name in the @i{file system}---for example, while a ++file is being written, it might have version @t{:newest} and might only take on ++a specific numeric value later when the file is closed even in a @i{file system} ++where all files have numeric versions. ++ ++@c end of including concept-files ++ ++@node Files Dictionary, , File System Concepts, Files ++@section Files Dictionary ++ ++@c including dict-files ++ ++@menu ++* directory:: ++* probe-file:: ++* ensure-directories-exist:: ++* truename:: ++* file-author:: ++* file-write-date:: ++* rename-file:: ++* delete-file:: ++* file-error:: ++* file-error-pathname:: ++@end menu ++ ++@node directory, probe-file, Files Dictionary, Files Dictionary ++@subsection directory [Function] ++ ++@code{directory} @i{pathspec @r{&key}} @result{} @i{pathnames} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{pathname designator}, ++ which may contain @i{wild} components. ++ ++@i{pathnames}---a @i{list} of ++ ++@i{physical pathnames}. ++ ++@subsubheading Description:: ++ ++Determines which, if any, @i{files} that are present ++in the file system have names matching @i{pathspec}, ++and returns a ++ ++@i{fresh} ++ ++@i{list} of @i{pathnames} corresponding to the @i{truenames} of ++those @i{files}. ++ ++An @i{implementation} may be extended to accept ++@i{implementation-defined} keyword arguments to @b{directory}. ++ ++@subsubheading Affected By:: ++ ++The host computer's file system. ++ ++@subsubheading Exceptional Situations:: ++ ++If the attempt to obtain a directory listing is not successful, ++an error of @i{type} @b{file-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++ ++@b{logical-pathname}, ++ ++@ref{ensure-directories-exist} ++, ++@ref{File System Concepts}, ++@ref{File Operations on Open and Closed Streams}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++If the @i{pathspec} is not @i{wild}, ++the resulting list will contain either zero or one elements. ++ ++@r{Common Lisp} specifies ``@r{&key}'' in the argument list to @b{directory} ++even though no @i{standardized} keyword arguments to @b{directory} are defined. ++``@t{:allow-other-keys t}'' ++may be used in @i{conforming programs} in order to quietly ignore any ++additional keywords which are passed by the program but not supported ++by the @i{implementation}. ++ ++@node probe-file, ensure-directories-exist, directory, Files Dictionary ++@subsection probe-file [Function] ++ ++@code{probe-file} @i{pathspec} @result{} @i{truename} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{pathname designator}. ++ ++@i{truename}---a @i{physical pathname} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{probe-file} tests whether a file exists. ++ ++@b{probe-file} returns @i{false} if there is no file named @i{pathspec}, ++and otherwise returns the @i{truename} of @i{pathspec}. ++ ++If the @i{pathspec} @i{designator} is an open @i{stream}, ++then @b{probe-file} produces the @i{truename} of its associated @i{file}. ++ ++If @i{pathspec} is a @i{stream}, whether open or closed, ++it is coerced to a @i{pathname} as if by the @i{function} @b{pathname}. ++ ++@subsubheading Affected By:: ++ ++The host computer's file system. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{file-error} is signaled if @i{pathspec} is @i{wild}. ++ ++An error of @i{type} @b{file-error} is signaled ++if the @i{file system} cannot perform the requested operation. ++ ++@subsubheading See Also:: ++ ++@ref{truename} ++, ++@ref{open} ++, ++@ref{ensure-directories-exist} ++, ++@b{pathname}, ++ ++@b{logical-pathname}, ++ ++@ref{File System Concepts}, ++@ref{File Operations on Open and Closed Streams}, ++ ++@ref{Pathnames as Filenames} ++ ++@node ensure-directories-exist, truename, probe-file, Files Dictionary ++@subsection ensure-directories-exist [Function] ++ ++@code{ensure-directories-exist} @i{pathspec @r{&key} verbose} @result{} @i{pathspec, created} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{pathname designator}. ++ ++@i{verbose}---a @i{generalized boolean}. ++ ++@i{created}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Tests whether the directories containing the specified @i{file} actually exist, ++and attempts to create them if they do not. ++ ++If the containing directories do not exist and if @i{verbose} is @i{true}, ++then the @i{implementation} is permitted (but not required) ++to perform output to @i{standard output} saying what directories were created. ++If the containing directories exist, or if @i{verbose} is @i{false}, ++this function performs no output. ++ ++The @i{primary value} is the given @i{pathspec} so that this operation can ++be straightforwardly composed with other file manipulation expressions. ++The @i{secondary value}, @i{created}, is @i{true} if any directories were ++created. ++ ++@subsubheading Affected By:: ++ ++The host computer's file system. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{file-error} is signaled if the host, device, or directory ++part of @i{pathspec} is @i{wild}. ++ ++If the directory creation attempt is not successful, ++an error of @i{type} @b{file-error} is signaled; ++if this occurs, ++it might be the case that none, some, or all ++of the requested creations have actually occurred ++within the @i{file system}. ++ ++@subsubheading See Also:: ++ ++@ref{probe-file} ++, ++@ref{open} ++, ++ ++@ref{Pathnames as Filenames} ++ ++@node truename, file-author, ensure-directories-exist, Files Dictionary ++@subsection truename [Function] ++ ++@code{truename} @i{filespec} @result{} @i{truename} ++ ++@subsubheading Arguments and Values:: ++ ++@i{filespec}---a @i{pathname designator}. ++ ++@i{truename}---a @i{physical pathname}. ++ ++@subsubheading Description:: ++ ++@b{truename} tries to find the @i{file} indicated by ++@i{filespec} and returns its @i{truename}. ++If the @i{filespec} @i{designator} is an open @i{stream}, ++its associated @i{file} is used. ++ ++If @i{filespec} is a @i{stream}, ++@b{truename} can be used whether the @i{stream} ++is open or closed. It is permissible for @b{truename} ++to return more specific information after the @i{stream} ++is closed than when the @i{stream} was open. ++ ++If @i{filespec} is a @i{pathname} ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++ ++@subsubheading Examples:: ++ ++@example ++;; An example involving version numbers. Note that the precise nature of ++;; the truename is implementation-dependent while the file is still open. ++ (with-open-file (stream ">vistor>test.text.newest") ++ (values (pathname stream) ++ (truename stream))) ++@result{} #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.1" ++@i{OR}@result{} #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.newest" ++@i{OR}@result{} #P"S:>vistor>test.text.newest", #P"S:>vistor>_temp_._temp_.1" ++ ++;; In this case, the file is closed when the truename is tried, so the ++;; truename information is reliable. ++ (with-open-file (stream ">vistor>test.text.newest") ++ (close stream) ++ (values (pathname stream) ++ (truename stream))) ++@result{} #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.1" ++ ++;; An example involving TOP-20's implementation-dependent concept ++;; of logical devices -- in this case, "DOC:" is shorthand for ++;; "PS:" ... ++ (with-open-file (stream "CMUC::DOC:DUMPER.HLP") ++ (values (pathname stream) ++ (truename stream))) ++@result{} #P"CMUC::DOC:DUMPER.HLP", #P"CMUC::PS:DUMPER.HLP.13" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{file-error} is signaled if an appropriate @i{file} ++cannot be located within the @i{file system} for the given @i{filespec}, ++ ++or if the @i{file system} cannot perform the requested operation. ++ ++An error of @i{type} @b{file-error} is signaled if @i{pathname} is @i{wild}. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++@b{truename} may be used to account for any @i{filename} translations ++performed by the @i{file system}. ++ ++@node file-author, file-write-date, truename, Files Dictionary ++@subsection file-author [Function] ++ ++@code{file-author} @i{pathspec} @result{} @i{author} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{pathname designator}. ++ ++@i{author}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns a @i{string} naming the author of the @i{file} specified by @i{pathspec}, ++or @b{nil} if the author's name cannot be determined. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (stream ">relativity>general.text") ++ (file-author s)) ++@result{} "albert" ++@end example ++ ++@subsubheading Affected By:: ++The host computer's file system. ++ ++Other users of the @i{file} named by @i{pathspec}. ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{file-error} is signaled if @i{pathspec} is @i{wild}. ++ ++An error of @i{type} @b{file-error} is signaled ++if the @i{file system} cannot perform the requested operation. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node file-write-date, rename-file, file-author, Files Dictionary ++@subsection file-write-date [Function] ++ ++@code{file-write-date} @i{pathspec} @result{} @i{date} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathspec}---a @i{pathname designator}. ++ ++@i{date}---a @i{universal time} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns a @i{universal time} representing the time at which the @i{file} ++specified by @i{pathspec} was last written (or created), ++or returns @b{nil} if such a time cannot be determined. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (s "noel.text" ++ :direction :output :if-exists :error) ++ (format s "~&Dear Santa,~2 ++ Please leave lots of toys.~2 ++ ~2 ++ (truename s)) ++@result{} #P"CUPID:/susan/noel.text" ++ (with-open-file (s "noel.text") ++ (file-write-date s)) ++@result{} 2902600800 ++@end example ++ ++@subsubheading Affected By:: ++ ++The host computer's file system. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{file-error} is signaled if @i{pathspec} is @i{wild}. ++ ++An error of @i{type} @b{file-error} is signaled ++if the @i{file system} cannot perform the requested operation. ++ ++@subsubheading See Also:: ++ ++@ref{Universal Time}, ++ ++@ref{Pathnames as Filenames} ++ ++@node rename-file, delete-file, file-write-date, Files Dictionary ++@subsection rename-file [Function] ++ ++@code{rename-file} @i{filespec new-name} @result{} @i{defaulted-new-name, old-truename, new-truename} ++ ++@subsubheading Arguments and Values:: ++ ++@i{filespec}---a @i{pathname designator}. ++ ++@i{new-name}---a @i{pathname designator} ++other than a @i{stream}. ++ ++@i{defaulted-new-name}---a @i{pathname} ++ ++@i{old-truename}---a @i{physical pathname}. ++ ++@i{new-truename}---a @i{physical pathname}. ++ ++@subsubheading Description:: ++ ++@b{rename-file} modifies the file system in such a way ++that the file indicated by @i{filespec} is renamed to ++@i{defaulted-new-name}. ++ ++It is an error to specify a filename containing a @i{wild} component, ++for @i{filespec} to contain a @b{nil} component where the file system does ++not permit a @b{nil} component, or for the result of defaulting missing ++components of @i{new-name} from @i{filespec} to contain a @b{nil} component ++where the file system does not permit a @b{nil} component. ++ ++If @i{new-name} is a @i{logical pathname}, ++@b{rename-file} returns a @i{logical pathname} as its @i{primary value}. ++ ++@b{rename-file} ++returns three values if successful. The @i{primary value}, @i{defaulted-new-name}, ++is the resulting name which is composed of ++@i{new-name} with any missing components filled in by performing ++a @b{merge-pathnames} operation using @i{filespec} as the defaults. ++The @i{secondary value}, @i{old-truename}, ++is the @i{truename} of the @i{file} before it was renamed. ++The @i{tertiary value}, @i{new-truename}, ++is the @i{truename} of the @i{file} after it was renamed. ++ ++If the @i{filespec} @i{designator} is an open @i{stream}, ++then the @i{stream} itself and the file associated with it are ++affected (if the @i{file system} permits). ++ ++@subsubheading Examples:: ++ ++@example ++;; An example involving logical pathnames. ++ (with-open-file (stream "sys:chemistry;lead.text" ++ :direction :output :if-exists :error) ++ (princ "eureka" stream) ++ (values (pathname stream) (truename stream))) ++@result{} #P"SYS:CHEMISTRY;LEAD.TEXT.NEWEST", #P"Q:>sys>chem>lead.text.1" ++ (rename-file "sys:chemistry;lead.text" "gold.text") ++@result{} #P"SYS:CHEMISTRY;GOLD.TEXT.NEWEST", ++ #P"Q:>sys>chem>lead.text.1", ++ #P"Q:>sys>chem>gold.text.1" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If the renaming operation is not successful, an error of @i{type} @b{file-error} is signaled. ++ ++An error of @i{type} @b{file-error} might be signaled if @i{filespec} is @i{wild}. ++ ++@subsubheading See Also:: ++ ++@ref{truename} ++, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node delete-file, file-error, rename-file, Files Dictionary ++@subsection delete-file [Function] ++ ++@code{delete-file} @i{filespec} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{filespec}---a @i{pathname designator}. ++ ++@subsubheading Description:: ++ ++Deletes the @i{file} specified by @i{filespec}. ++ ++If the @i{filespec} @i{designator} is an open @i{stream}, ++then @i{filespec} and the file associated with it are affected ++(if the file system permits), ++in which case @i{filespec} might be closed immediately, ++and the deletion might be immediate or delayed until @i{filespec} is explicitly closed, ++depending on the requirements of the file system. ++ ++It is @i{implementation-dependent} whether an attempt ++to delete a nonexistent file is considered to be successful. ++ ++@b{delete-file} returns @i{true} if it succeeds, ++or signals an error of @i{type} @b{file-error} if it does not. ++ ++The consequences are undefined ++ if @i{filespec} has a @i{wild} component, ++ or if @i{filespec} has a @b{nil} component ++ and the file system does not permit a @b{nil} component. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (s "delete-me.text" :direction :output :if-exists :error)) ++@result{} NIL ++ (setq p (probe-file "delete-me.text")) @result{} #P"R:>fred>delete-me.text.1" ++ (delete-file p) @result{} T ++ (probe-file "delete-me.text") @result{} @i{false} ++ (with-open-file (s "delete-me.text" :direction :output :if-exists :error) ++ (delete-file s)) ++@result{} T ++ (probe-file "delete-me.text") @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If the deletion operation is not successful, an error of @i{type} @b{file-error} is signaled. ++ ++An error of @i{type} @b{file-error} might be signaled if @i{filespec} is @i{wild}. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node file-error, file-error-pathname, delete-file, Files Dictionary ++@subsection file-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{file-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{file-error} consists of error conditions that occur during ++an attempt to open or close a file, or during some low-level transactions ++with a file system. The ``offending pathname'' is initialized by ++the @t{:pathname} initialization argument to @b{make-condition}, and is @i{accessed} ++by the @i{function} @b{file-error-pathname}. ++ ++@subsubheading See Also:: ++ ++@r{file-error-pathname}, ++@ref{open} ++, ++@ref{probe-file} ++, ++@ref{directory} ++, ++@ref{ensure-directories-exist} ++ ++@node file-error-pathname, , file-error, Files Dictionary ++@subsection file-error-pathname [Function] ++ ++@code{file-error-pathname} @i{condition} @result{} @i{pathspec} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{file-error}. ++ ++@i{pathspec}---a @i{pathname designator}. ++ ++@subsubheading Description:: ++ ++Returns the ``offending pathname'' of a @i{condition} of @i{type} @b{file-error}. ++ ++@subsubheading Exceptional Situations:: ++ ++@subsubheading See Also:: ++ ++@b{file-error}, ++@ref{Conditions} ++ ++@c end of including dict-files ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-21.texi +@@ -0,0 +1,3638 @@ ++ ++ ++@node Streams, Printer, Files, Top ++@chapter Streams ++ ++@menu ++* Stream Concepts:: ++* Streams Dictionary:: ++@end menu ++ ++@node Stream Concepts, Streams Dictionary, Streams, Streams ++@section Stream Concepts ++ ++@c including concept-streams ++ ++@menu ++* Introduction to Streams:: ++* Stream Variables:: ++* Stream Arguments to Standardized Functions:: ++* Restrictions on Composite Streams:: ++@end menu ++ ++@node Introduction to Streams, Stream Variables, Stream Concepts, Stream Concepts ++@subsection Introduction to Streams ++ ++A @i{stream} ++@IGindex stream ++ is an @i{object} that can be used with an input or output ++function to identify an appropriate source or sink of @i{characters} or ++@i{bytes} for that operation. ++A @i{character} ++@IGindex character ++ @i{stream} ++@IGindex stream ++ is a source or sink of @i{characters}. ++A @i{binary} ++@IGindex binary ++ @i{stream} ++@IGindex stream ++ is a source or sink of @i{bytes}. ++ ++Some operations may be performed on any kind of @i{stream}; ++Figure 21--1 provides a list of @i{standardized} operations ++that are potentially useful with any kind of @i{stream}. ++ ++@format ++@group ++@noindent ++@w{ close stream-element-type } ++@w{ input-stream-p streamp } ++@w{ interactive-stream-p with-open-stream } ++@w{ output-stream-p } ++ ++@noindent ++@w{ Figure 21--1: Some General-Purpose Stream Operations} ++ ++@end group ++@end format ++ ++Other operations are only meaningful on certain @i{stream} @i{types}. ++For example, @b{read-char} is only defined for @i{character} @i{streams} ++and @b{read-byte} is only defined for @i{binary} @i{streams}. ++ ++@menu ++* Abstract Classifications of Streams (Introduction to Streams):: ++* Input:: ++* Open and Closed Streams:: ++* Interactive Streams:: ++* Abstract Classifications of Streams:: ++* File Streams:: ++* Other Subclasses of Stream:: ++@end menu ++ ++@node Abstract Classifications of Streams (Introduction to Streams), Input, Introduction to Streams, Introduction to Streams ++@subsubsection Abstract Classifications of Streams ++ ++@node Input, Open and Closed Streams, Abstract Classifications of Streams (Introduction to Streams), Introduction to Streams ++@subsubsection Input, Output, and Bidirectional Streams ++ ++A @i{stream}, whether a @i{character} @i{stream} or a @i{binary} @i{stream}, ++can be an @i{input} ++@IGindex input ++ @i{stream} ++@IGindex stream ++ (source of data), ++ an @i{output} ++@IGindex output ++ @i{stream} ++@IGindex stream ++ (sink for data), ++ both, ++ or (@i{e.g.}, when ``@t{:direction :probe}'' is given to @b{open}) neither. ++ ++Figure 21--2 shows @i{operators} relating to ++@i{input} @i{streams}. ++ ++@format ++@group ++@noindent ++@w{ clear-input read-byte read-from-string } ++@w{ listen read-char read-line } ++@w{ peek-char read-char-no-hang read-preserving-whitespace } ++@w{ read read-delimited-list unread-char } ++ ++@noindent ++@w{ Figure 21--2: Operators relating to Input Streams. } ++ ++@end group ++@end format ++ ++Figure 21--3 shows @i{operators} relating to ++@i{output} @i{streams}. ++ ++@format ++@group ++@noindent ++@w{ clear-output prin1 write } ++@w{ finish-output prin1-to-string write-byte } ++@w{ force-output princ write-char } ++@w{ format princ-to-string write-line } ++@w{ fresh-line print write-string } ++@w{ pprint terpri write-to-string } ++ ++@noindent ++@w{ Figure 21--3: Operators relating to Output Streams.} ++ ++@end group ++@end format ++ ++A @i{stream} that is both an @i{input} @i{stream} and an @i{output} @i{stream} ++is called a @i{bidirectional} ++@IGindex bidirectional ++ @i{stream} ++@IGindex stream ++. ++See the @i{functions} @b{input-stream-p} and @b{output-stream-p}. ++ ++Any of the @i{operators} listed in @i{Figure~21--2} or @i{Figure~21--3} ++can be used with @i{bidirectional} @i{streams}. In addition, Figure 21--4 ++shows a list of @i{operators} that relate specificaly to ++@i{bidirectional} @i{streams}. ++ ++@format ++@group ++@noindent ++@w{ y-or-n-p yes-or-no-p } ++ ++@noindent ++@w{ Figure 21--4: Operators relating to Bidirectional Streams.} ++ ++@end group ++@end format ++ ++@node Open and Closed Streams, Interactive Streams, Input, Introduction to Streams ++@subsubsection Open and Closed Streams ++ ++@i{Streams} are either @i{open} ++@IGindex open ++ or @i{closed} ++@IGindex closed ++. ++ ++Except as explicitly specified otherwise, ++operations that create and return @i{streams} return @i{open} @i{streams}. ++ ++The action of @i{closing} a @i{stream} marks the end of its use as a source ++or sink of data, permitting the @i{implementation} to reclaim its internal data ++structures, and to free any external resources which might have been locked by the ++@i{stream} when it was opened. ++ ++Except as explicitly specified otherwise, ++the consequences are undefined when a @i{closed} @i{stream} ++is used where a @i{stream} is called for. ++ ++Coercion of @i{streams} to @i{pathnames} ++is permissible for @i{closed} @i{streams}; ++in some situations, such as for a @i{truename} computation, ++the result might be different for an @i{open} @i{stream} ++and for that same @i{stream} once it has been @i{closed}. ++ ++@node Interactive Streams, Abstract Classifications of Streams, Open and Closed Streams, Introduction to Streams ++@subsubsection Interactive Streams ++ ++An @i{interactive stream} ++@IGindex interactive stream ++ is one on which it makes sense to perform ++interactive querying. ++ ++The precise meaning of an @i{interactive stream} is ++@i{implementation-defined}, and may depend on the underlying ++operating system. Some examples of the things that an ++@i{implementation} might choose to use as identifying characteristics ++of an @i{interactive stream} include: ++ ++@table @asis ++ ++@item @t{*} ++The @i{stream} is connected to a person (or equivalent) in such a way ++ that the program can prompt for information and expect to receive different ++ input depending on the prompt. ++ ++@item @t{*} ++The program is expected to prompt for input and support ``normal input editing''. ++ ++@item @t{*} ++@b{read-char} might wait for the user to type something before returning ++ instead of immediately returning a character or end-of-file. ++ ++@end table ++ ++The general intent of having some @i{streams} be classified as ++@i{interactive streams} is to allow them to be distinguished from ++streams containing batch (or background or command-file) input. ++Output to batch streams is typically discarded or saved for later viewing, ++so interactive queries to such streams might not have the expected effect. ++ ++@i{Terminal I/O} might or might not be an @i{interactive stream}. ++ ++@node Abstract Classifications of Streams, File Streams, Interactive Streams, Introduction to Streams ++@subsubsection Abstract Classifications of Streams ++ ++@node File Streams, Other Subclasses of Stream, Abstract Classifications of Streams, Introduction to Streams ++@subsubsection File Streams ++ ++Some @i{streams}, called @i{file streams} ++@IGindex file stream ++, provide access to @i{files}. ++An @i{object} of @i{class} @b{file-stream} is used to represent a @i{file stream}. ++ ++The basic operation for opening a @i{file} is @b{open}, ++which typically returns a @i{file stream} ++(see its dictionary entry for details). ++The basic operation for closing a @i{stream} is @b{close}. ++The macro @b{with-open-file} is useful ++to express the common idiom of opening a @i{file} ++for the duration of a given body of @i{code}, ++and assuring that the resulting @i{stream} is closed upon exit from that body. ++ ++@node Other Subclasses of Stream, , File Streams, Introduction to Streams ++@subsubsection Other Subclasses of Stream ++ ++The @i{class} @b{stream} has a number of @i{subclasses} defined ++by this specification. Figure 21--5 shows some information ++about these subclasses. ++ ++@format ++@group ++@noindent ++@w{ Class Related Operators } ++@w{ @b{broadcast-stream} @b{make-broadcast-stream} } ++@w{ @b{broadcast-stream-streams} } ++@w{ @b{concatenated-stream} @b{make-concatenated-stream} } ++@w{ @b{concatenated-stream-streams} } ++@w{ @b{echo-stream} @b{make-echo-stream} } ++@w{ @b{echo-stream-input-stream} } ++@w{ @b{echo-stream-output-stream} } ++@w{ @b{string-stream} @b{make-string-input-stream} } ++@w{ @b{with-input-from-string} } ++@w{ @b{make-string-output-stream} } ++@w{ @b{with-output-to-string} } ++@w{ @b{get-output-stream-string} } ++@w{ @b{synonym-stream} @b{make-synonym-stream} } ++@w{ @b{synonym-stream-symbol} } ++@w{ @b{two-way-stream} @b{make-two-way-stream} } ++@w{ @b{two-way-stream-input-stream} } ++@w{ @b{two-way-stream-output-stream} } ++ ++@noindent ++@w{ Figure 21--5: Defined Names related to Specialized Streams} ++ ++@end group ++@end format ++ ++@node Stream Variables, Stream Arguments to Standardized Functions, Introduction to Streams, Stream Concepts ++@subsection Stream Variables ++ ++@i{Variables} whose @i{values} must be @i{streams} are sometimes called ++@i{stream variables} ++@IGindex stream variable ++. ++ ++Certain @i{stream variables} are defined by this specification ++to be the proper source of input or output in various @i{situations} ++where no specific @i{stream} has been specified instead. ++A complete list of such @i{standardized} @i{stream variables} ++appears in Figure 21--6. ++The consequences are undefined if at any time ++the @i{value} of any of these @i{variables} is not an @i{open} @i{stream}. ++ ++@format ++@group ++@noindent ++@w{ Glossary Term Variable Name } ++@w{ @i{debug I/O} @b{*debug-io*} } ++@w{ @i{error output} @b{*error-output*} } ++@w{ @i{query I/O} @b{*query-io*} } ++@w{ @i{standard input} @b{*standard-input*} } ++@w{ @i{standard output} @b{*standard-output*} } ++@w{ @i{terminal I/O} @b{*terminal-io*} } ++@w{ @i{trace output} @b{*trace-output*} } ++ ++@noindent ++@w{ Figure 21--6: Standardized Stream Variables} ++ ++@end group ++@end format ++ ++Note that, by convention, @i{standardized} @i{stream variables} have names ++ ending in ``@t{-input*}'' if they must be @i{input} @i{streams}, ++ ending in ``@t{-output*}'' if they must be @i{output} @i{streams}, ++ or ending in ``@t{-io*}'' if they must be @i{bidirectional} @i{streams}. ++ ++User programs may @i{assign} or @i{bind} any @i{standardized} @i{stream variable} ++except @b{*terminal-io*}. ++ ++@node Stream Arguments to Standardized Functions, Restrictions on Composite Streams, Stream Variables, Stream Concepts ++@subsection Stream Arguments to Standardized Functions ++ ++The @i{operators} in Figure 21--7 accept @i{stream} @i{arguments} that ++might be either @i{open} or @i{closed} @i{streams}. ++ ++@format ++@group ++@noindent ++@w{ broadcast-stream-streams file-author pathnamep } ++@w{ close file-namestring probe-file } ++@w{ compile-file file-write-date rename-file } ++@w{ compile-file-pathname host-namestring streamp } ++@w{ concatenated-stream-streams load synonym-stream-symbol } ++@w{ delete-file logical-pathname translate-logical-pathname } ++@w{ directory merge-pathnames translate-pathname } ++@w{ directory-namestring namestring truename } ++@w{ dribble open two-way-stream-input-stream } ++@w{ echo-stream-input-stream open-stream-p two-way-stream-output-stream } ++@w{ echo-stream-ouput-stream parse-namestring wild-pathname-p } ++@w{ ed pathname with-open-file } ++@w{ enough-namestring pathname-match-p } ++ ++@noindent ++@w{ Figure 21--7: Operators that accept either Open or Closed Streams } ++ ++@end group ++@end format ++ ++The @i{operators} in Figure 21--8 accept @i{stream} @i{arguments} that ++must be @i{open} @i{streams}. ++ ++@format ++@group ++@noindent ++@w{ clear-input output-stream-p read-char-no-hang } ++@w{ clear-output peek-char read-delimited-list } ++@w{ file-length pprint read-line } ++@w{ file-position pprint-fill read-preserving-whitespace } ++@w{ file-string-length pprint-indent stream-element-type } ++@w{ finish-output pprint-linear stream-external-format } ++@w{ force-output pprint-logical-block terpri } ++@w{ format pprint-newline unread-char } ++@w{ fresh-line pprint-tab with-open-stream } ++@w{ get-output-stream-string pprint-tabular write } ++@w{ input-stream-p prin1 write-byte } ++@w{ interactive-stream-p princ write-char } ++@w{ listen print write-line } ++@w{ make-broadcast-stream print-object write-string } ++@w{ make-concatenated-stream print-unreadable-object y-or-n-p } ++@w{ make-echo-stream read yes-or-no-p } ++@w{ make-synonym-stream read-byte } ++@w{ make-two-way-stream read-char } ++ ++@noindent ++@w{ Figure 21--8: Operators that accept Open Streams only } ++ ++@end group ++@end format ++ ++@node Restrictions on Composite Streams, , Stream Arguments to Standardized Functions, Stream Concepts ++@subsection Restrictions on Composite Streams ++ ++The consequences are undefined if any @i{component} of a @i{composite stream} ++is @i{closed} before the @i{composite stream} is @i{closed}. ++ ++The consequences are undefined if the @i{synonym stream symbol} is not @i{bound} ++to an @i{open} @i{stream} from the time of the @i{synonym stream}'s creation ++until the time it is @i{closed}. ++ ++@c end of including concept-streams ++ ++@node Streams Dictionary, , Stream Concepts, Streams ++@section Streams Dictionary ++ ++@c including dict-streams ++ ++@menu ++* stream:: ++* broadcast-stream:: ++* concatenated-stream:: ++* echo-stream:: ++* file-stream:: ++* string-stream:: ++* synonym-stream:: ++* two-way-stream:: ++* input-stream-p:: ++* interactive-stream-p:: ++* open-stream-p:: ++* stream-element-type:: ++* streamp:: ++* read-byte:: ++* write-byte:: ++* peek-char:: ++* read-char:: ++* read-char-no-hang:: ++* terpri:: ++* unread-char:: ++* write-char:: ++* read-line:: ++* write-string:: ++* read-sequence:: ++* write-sequence:: ++* file-length:: ++* file-position:: ++* file-string-length:: ++* open:: ++* stream-external-format:: ++* with-open-file:: ++* close:: ++* with-open-stream:: ++* listen:: ++* clear-input:: ++* finish-output:: ++* y-or-n-p:: ++* make-synonym-stream:: ++* synonym-stream-symbol:: ++* broadcast-stream-streams:: ++* make-broadcast-stream:: ++* make-two-way-stream:: ++* two-way-stream-input-stream:: ++* echo-stream-input-stream:: ++* make-echo-stream:: ++* concatenated-stream-streams:: ++* make-concatenated-stream:: ++* get-output-stream-string:: ++* make-string-input-stream:: ++* make-string-output-stream:: ++* with-input-from-string:: ++* with-output-to-string:: ++* *debug-io*:: ++* *terminal-io*:: ++* stream-error:: ++* stream-error-stream:: ++* end-of-file:: ++@end menu ++ ++@node stream, broadcast-stream, Streams Dictionary, Streams Dictionary ++@subsection stream [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{stream} is an @i{object} that can be used with an input or output ++function to identify an appropriate source or sink of @i{characters} or ++@i{bytes} for that operation. ++ ++For more complete information, see @ref{Stream Concepts}. ++ ++@subsubheading See Also:: ++ ++@ref{Stream Concepts}, ++@ref{Printing Other Objects}, ++@ref{Printer}, ++@ref{Reader} ++ ++@node broadcast-stream, concatenated-stream, stream, Streams Dictionary ++@subsection broadcast-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{broadcast-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{broadcast stream} is an @i{output} @i{stream} which ++has associated with it a set of zero or more @i{output} @i{streams} ++such that any output sent to the @i{broadcast stream} gets passed on ++as output to each of the associated @i{output} @i{streams}. ++(If a @i{broadcast stream} has no @i{component streams}, ++then all output to the @i{broadcast stream} is discarded.) ++ ++The set of operations that may be performed on a @i{broadcast stream} ++is the intersection of those for its associated @i{output} @i{streams}. ++ ++Some output operations (@i{e.g.}, @b{fresh-line}) return @i{values} based on the ++state of the @i{stream} at the time of the operation. ++ ++Since these @i{values} might differ for each of the @i{component streams}, ++it is necessary to describe their return value specifically: ++ ++@table @asis ++ ++@item @t{*} ++@b{stream-element-type} returns ++ the value from the last component stream, ++ or @b{t} if there are no component streams. ++ ++@item @t{*} ++@b{fresh-line} returns ++ the value from the last component stream, ++ or @b{nil} if there are no component streams. ++ ++@item @t{*} ++The functions ++ @b{file-length}, ++ @b{file-position}, ++ @b{file-string-length}, ++ and @b{stream-external-format} ++ return the value from the last component stream; ++ if there are no component streams, ++ @b{file-length} and @b{file-position} return @t{0}, ++ @b{file-string-length} returns @t{1}, ++ and @b{stream-external-format} returns @t{:default}. ++ ++@item @t{*} ++The functions @b{streamp} and @b{output-stream-p} ++ always return @i{true} for @i{broadcast streams}. ++ ++@item @t{*} ++The functions @b{open-stream-p} tests whether the @i{broadcast stream} ++ is @i{open}_2, not whether its component streams are @i{open}. ++ ++@item @t{*} ++The functions @b{input-stream-p} and @i{interactive-stream-p} ++ return an @i{implementation-defined}, @i{generalized boolean} value. ++ ++@item @t{*} ++For the input operations ++ @b{clear-input} ++ @b{listen}, ++ @b{peek-char}, ++ @b{read-byte}, ++ @b{read-char-no-hang}, ++ @b{read-char}, ++ @b{read-line}, ++ and @b{unread-char}, ++ the consequences are undefined if the indicated operation is performed. ++ However, an @i{implementation} is permitted ++ to define such a behavior as an @i{implementation-dependent} extension. ++@end table ++ ++For any output operations not having their return values explicitly specified above ++or elsewhere in this document, it is defined that ++the @i{values} returned by such an operation are ++the @i{values} resulting from performing the operation ++on the last of its @i{component streams}; ++the @i{values} resulting from performing the operation ++on all preceding @i{streams} are discarded. ++If there are no @i{component streams}, ++the value is @i{implementation-dependent}. ++ ++@subsubheading See Also:: ++ ++@ref{broadcast-stream-streams} ++, ++@ref{make-broadcast-stream} ++ ++@node concatenated-stream, echo-stream, broadcast-stream, Streams Dictionary ++@subsection concatenated-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{concatenated-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{concatenated stream} is an @i{input} @i{stream} which ++is a @i{composite stream} of zero or more other @i{input} @i{streams}, ++such that the sequence of data which can be read from the ++@i{concatenated stream} is the same as the concatenation of the ++sequences of data which could be read from each of the ++constituent @i{streams}. ++ ++Input from a @i{concatenated stream} is taken from the first ++of the associated @i{input streams} until it reaches @i{end of file}_1; ++then that @i{stream} is discarded, and subsequent input is taken ++from the next @i{input stream}, and so on. ++An @i{end of file} on the associated @i{input streams} is always managed ++invisibly by the @i{concatenated stream}---the only time a client of ++a @i{concatenated stream} sees an @i{end of file} is when an attempt is ++made to obtain data from the @i{concatenated stream} but it has no ++remaining @i{input streams} from which to obtain such data. ++ ++@subsubheading See Also:: ++ ++@ref{concatenated-stream-streams} ++, ++@ref{make-concatenated-stream} ++ ++@node echo-stream, file-stream, concatenated-stream, Streams Dictionary ++@subsection echo-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{echo-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++An @i{echo stream} is a @i{bidirectional} @i{stream} ++that gets its input from an associated @i{input} @i{stream} ++and sends its output to an associated @i{output} @i{stream}. ++ ++All input taken from the @i{input} @i{stream} ++is echoed to the @i{output} @i{stream}. ++Whether the input is echoed immediately after it is encountered, ++or after it has been read from the @i{input stream} ++is @i{implementation-dependent}. ++ ++@subsubheading See Also:: ++ ++@ref{echo-stream-input-stream} ++, ++@b{echo-stream-output-stream}, ++@ref{make-echo-stream} ++ ++@node file-stream, string-stream, echo-stream, Streams Dictionary ++@subsection file-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{file-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++An @i{object} of @i{type} @b{file-stream} is a @i{stream} the direct ++source or sink of which is a @i{file}. Such a @i{stream} is ++created explicitly by @b{open} and @b{with-open-file}, and ++implicitly by @i{functions} such as @b{load} that process @i{files}. ++ ++@subsubheading See Also:: ++ ++@ref{load} ++, ++@ref{open} ++, ++@ref{with-open-file} ++ ++@node string-stream, synonym-stream, file-stream, Streams Dictionary ++@subsection string-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{string-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{string stream} is a @i{stream} ++which reads input from or writes output to an associated @i{string}. ++ ++The @i{stream element type} of a @i{string stream} is always ++a @i{subtype} of @i{type} @b{character}. ++ ++@subsubheading See Also:: ++ ++@ref{make-string-input-stream} ++, ++@ref{make-string-output-stream} ++, ++@ref{with-input-from-string} ++, ++@ref{with-output-to-string} ++ ++@node synonym-stream, two-way-stream, string-stream, Streams Dictionary ++@subsection synonym-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{synonym-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{stream} that is an alias for another @i{stream}, ++which is the @i{value} of a @i{dynamic variable} ++whose @i{name} is the @i{synonym stream symbol} of the @i{synonym stream}. ++ ++Any operations on a @i{synonym stream} will be performed ++on the @i{stream} that is then the @i{value} of the ++@i{dynamic variable} named by the @i{synonym stream symbol}. ++If the @i{value} of the @i{variable} should change, ++or if the @i{variable} should be @i{bound}, ++then the @i{stream} will operate on the new @i{value} of the @i{variable}. ++ ++@subsubheading See Also:: ++ ++@ref{make-synonym-stream} ++, ++@ref{synonym-stream-symbol} ++ ++@node two-way-stream, input-stream-p, synonym-stream, Streams Dictionary ++@subsection two-way-stream [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{two-way-stream}, ++@b{stream}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{bidirectional} @i{composite stream} that ++ receives its input from an associated @i{input} @i{stream} ++ and sends its output to an associated @i{output} @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{make-two-way-stream} ++, ++@ref{two-way-stream-input-stream} ++, ++@b{two-way-stream-output-stream} ++ ++@node input-stream-p, interactive-stream-p, two-way-stream, Streams Dictionary ++@subsection input-stream-p, output-stream-p [Function] ++ ++@code{input-stream-p} @i{stream} @result{} @i{generalized-boolean} ++ ++@code{output-stream-p} @i{stream} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{input-stream-p} returns @i{true} if @i{stream} is an @i{input} @i{stream}; ++otherwise, returns @i{false}. ++ ++@b{output-stream-p} returns @i{true} if @i{stream} is an @i{output} @i{stream}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (input-stream-p *standard-input*) @result{} @i{true} ++ (input-stream-p *terminal-io*) @result{} @i{true} ++ (input-stream-p (make-string-output-stream)) @result{} @i{false} ++ ++ (output-stream-p *standard-output*) @result{} @i{true} ++ (output-stream-p *terminal-io*) @result{} @i{true} ++ (output-stream-p (make-string-input-stream "jr")) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream}. ++ ++@node interactive-stream-p, open-stream-p, input-stream-p, Streams Dictionary ++@subsection interactive-stream-p [Function] ++ ++@code{interactive-stream-p} @i{stream} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{stream} is an @i{interactive stream}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (when (> measured limit) ++ (let ((error (round (* (- measured limit) 100) ++ limit))) ++ (unless (if (interactive-stream-p *query-io*) ++ (yes-or-no-p "The frammis is out of tolerance by ~D ++ Is it safe to proceed? " error) ++ (< error 15)) ;15 ++ (error "The frammis is out of tolerance by ~D ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{Stream Concepts} ++ ++@node open-stream-p, stream-element-type, interactive-stream-p, Streams Dictionary ++@subsection open-stream-p [Function] ++ ++@code{open-stream-p} @i{stream} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{stream} is an @i{open} @i{stream}; ++otherwise, returns @i{false}. ++ ++@i{Streams} are open until they have been explicitly closed with @b{close}, ++or until they are implicitly closed due to exit from a ++ @b{with-output-to-string}, ++ @b{with-open-file}, ++ @b{with-input-from-string}, or ++ @b{with-open-stream} @i{form}. ++ ++@subsubheading Examples:: ++ ++@example ++ (open-stream-p *standard-input*) @result{} @i{true} ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{close}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream}. ++ ++@node stream-element-type, streamp, open-stream-p, Streams Dictionary ++@subsection stream-element-type [Function] ++ ++@code{stream-element-type} @i{stream} @result{} @i{typespec} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream}. ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Description:: ++ ++@b{stream-element-type} returns a @i{type specifier} that ++indicates the @i{types} of @i{objects} that may be read from ++or written to @i{stream}. ++ ++@i{Streams} created by @b{open} have an @i{element type} ++restricted to @b{integer} or a @i{subtype} of @i{type} @b{character}. ++ ++@subsubheading Examples:: ++ ++@example ++;; Note that the stream must accomodate at least the specified type, ++;; but might accomodate other types. Further note that even if it does ++;; accomodate exactly the specified type, the type might be specified in ++;; any of several ways. ++ (with-open-file (s "test" :element-type '(integer 0 1) ++ :if-exists :error ++ :direction :output) ++ (stream-element-type s)) ++@result{} INTEGER ++@i{OR}@result{} (UNSIGNED-BYTE 16) ++@i{OR}@result{} (UNSIGNED-BYTE 8) ++@i{OR}@result{} BIT ++@i{OR}@result{} (UNSIGNED-BYTE 1) ++@i{OR}@result{} (INTEGER 0 1) ++@i{OR}@result{} (INTEGER 0 (2)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream}. ++ ++@node streamp, read-byte, stream-element-type, Streams Dictionary ++@subsection streamp [Function] ++ ++@code{streamp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{stream}; ++otherwise, returns @i{false}. ++ ++@b{streamp} is unaffected by whether @i{object}, ++if it is a @i{stream}, is @i{open} or closed. ++ ++@subsubheading Examples:: ++ ++@example ++ (streamp *terminal-io*) @result{} @i{true} ++ (streamp 1) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (streamp @i{object}) @equiv{} (typep @i{object} 'stream) ++@end example ++ ++@node read-byte, write-byte, streamp, Streams Dictionary ++@subsection read-byte [Function] ++ ++@code{read-byte} @i{stream @r{&optional} eof-error-p eof-value} @result{} @i{byte} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{binary} @i{input} @i{stream}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{byte}---an @i{integer}, ++ or the @i{eof-value}. ++ ++@subsubheading Description:: ++ ++@b{read-byte} reads and returns one byte from @i{stream}. ++ ++If an @i{end of file}_2 occurs and @i{eof-error-p} is @i{false}, ++the @i{eof-value} is returned. ++ ++@subsubheading Examples:: ++@example ++ (with-open-file (s "temp-bytes" ++ :direction :output ++ :element-type 'unsigned-byte) ++ (write-byte 101 s)) @result{} 101 ++ (with-open-file (s "temp-bytes" :element-type 'unsigned-byte) ++ (format t "~S ~S" (read-byte s) (read-byte s nil 'eof))) ++@t{ |> } 101 EOF ++@result{} NIL ++@end example ++ ++@subsubheading Side Effects:: ++ ++Modifies @i{stream}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream}. ++ ++Should signal an error of @i{type} @b{error} ++if @i{stream} is not a @i{binary} @i{input} @i{stream}. ++ ++If there are no @i{bytes} remaining in the @i{stream} ++and @i{eof-error-p} is @i{true}, an error of @i{type} @b{end-of-file} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{read-char} ++, ++ ++@ref{read-sequence} ++, ++ ++@ref{write-byte} ++ ++@node write-byte, peek-char, read-byte, Streams Dictionary ++@subsection write-byte [Function] ++ ++@code{write-byte} @i{byte stream} @result{} @i{byte} ++ ++@subsubheading Arguments and Values:: ++ ++@i{byte}---an @i{integer} of the @i{stream element type} ++ of @i{stream}. ++ ++@i{stream}---a @i{binary} @i{output} @i{stream}. ++ ++@subsubheading Description:: ++ ++@b{write-byte} writes one byte, @i{byte}, to @i{stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (s "temp-bytes" ++ :direction :output ++ :element-type 'unsigned-byte) ++ (write-byte 101 s)) @result{} 101 ++@end example ++ ++@subsubheading Side Effects:: ++ ++@i{stream} is modified. ++ ++@subsubheading Affected By:: ++ ++The @i{element type} of the @i{stream}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream}. ++Should signal an error of @i{type} @b{error} ++if @i{stream} is not a @i{binary} @i{output} @i{stream}. ++ ++Might signal an error of @i{type} @b{type-error} if @i{byte} is not ++an @i{integer} of the @i{stream element type} of @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{read-byte} ++, ++@ref{write-char} ++, ++ ++@ref{write-sequence} ++ ++@node peek-char, read-char, write-byte, Streams Dictionary ++@subsection peek-char [Function] ++ ++@code{peek-char} @i{@r{&optional} peek-type input-stream eof-error-p ++ eof-value recursive-p} @result{} @i{char} ++ ++@subsubheading Arguments and Values:: ++ ++@i{peek-type}---a @i{character} or @b{t} or @b{nil}. ++ ++@i{input-stream}---@i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{recursive-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{char}---a @i{character} or the @i{eof-value}. ++ ++@subsubheading Description:: ++ ++@b{peek-char} obtains the next character in @i{input-stream} ++without actually reading it, thus leaving the character ++to be read at a later time. It can ++also be used to skip over and discard intervening ++characters in the @i{input-stream} ++until a particular character is found. ++ ++If @i{peek-type} is not supplied or @b{nil}, ++@b{peek-char} returns the next character to be read from ++@i{input-stream}, without actually removing it from ++@i{input-stream}. ++The next time input is done from @i{input-stream}, the character will still ++be there. ++If @i{peek-type} is @b{t}, ++then @b{peek-char} skips over @i{whitespace}_2 @i{characters}, ++but not comments, ++and then performs the peeking operation on the next ++character. ++The last character examined, the one that starts an @i{object}, ++is not removed from @i{input-stream}. ++If @i{peek-type} is a @i{character}, ++then @b{peek-char} skips ++over input characters until a character that ++is @b{char=} to that @i{character} is found; ++that character is left in @i{input-stream}. ++ ++If an @i{end of file}_2 occurs and @i{eof-error-p} is @i{false}, ++@i{eof-value} is returned. ++ ++If @i{recursive-p} is @i{true}, ++this call is expected to be embedded in a higher-level call to @b{read} ++or a similar @i{function} used by the @i{Lisp reader}. ++ ++When @i{input-stream} is an @i{echo stream}, ++characters that are only peeked at are not echoed. In the ++case that @i{peek-type} is not @b{nil}, ++the characters that are passed by @b{peek-char} ++are treated as if by @b{read-char}, ++and so are echoed unless they have been marked otherwise by @b{unread-char}. ++ ++@subsubheading Examples:: ++@example ++ (with-input-from-string (input-stream " 1 2 3 4 5") ++ (format t "~S ~S ~S" ++ (peek-char t input-stream) ++ (peek-char #\4 input-stream) ++ (peek-char nil input-stream))) ++@t{ |> } #\1 #\4 #\4 ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*readtable*}, ++@b{*standard-input*}, ++@b{*terminal-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{eof-error-p} is @i{true} and an @i{end of file}_2 occurs ++an error of @i{type} @b{end-of-file} is signaled. ++ ++If @i{peek-type} is a @i{character}, ++ an @i{end of file}_2 occurs, ++ and @i{eof-error-p} is @i{true}, ++an error of @i{type} @b{end-of-file} is signaled. ++ ++If @i{recursive-p} is @i{true} ++and an @i{end of file}_2 occurs, ++an error of @i{type} @b{end-of-file} is signaled. ++ ++@node read-char, read-char-no-hang, peek-char, Streams Dictionary ++@subsection read-char [Function] ++ ++@code{read-char} @i{@r{&optional} input-stream eof-error-p eof-value recursive-p} @result{} @i{char} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{recursive-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{char}---a @i{character} or the @i{eof-value}. ++ ++@subsubheading Description:: ++ ++@b{read-char} returns the next @i{character} from @i{input-stream}. ++ ++When @i{input-stream} is an @i{echo stream}, ++the character is echoed on @i{input-stream} the first time the character is ++seen. ++ Characters that are not echoed by @b{read-char} ++are those that were ++ put there by @b{unread-char} ++and hence are assumed to have been echoed ++ already by a previous call to @b{read-char}. ++ ++If @i{recursive-p} is @i{true}, ++this call is expected to be embedded in a higher-level call to @b{read} ++or a similar @i{function} used by the @i{Lisp reader}. ++ ++If an @i{end of file}_2 occurs and @i{eof-error-p} is @i{false}, ++@i{eof-value} is returned. ++ ++@subsubheading Examples:: ++@example ++ (with-input-from-string (is "0123") ++ (do ((c (read-char is) (read-char is nil 'the-end))) ++ ((not (characterp c))) ++ (format t "~S " c))) ++@t{ |> } #\0 #\1 #\2 #\3 ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*}, ++@b{*terminal-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++If an @i{end of file}_2 occurs before a character can be read, and ++@i{eof-error-p} is @i{true}, ++an error of @i{type} @b{end-of-file} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{read-byte} ++, ++ ++@ref{read-sequence} ++, ++ ++@ref{write-char} ++, ++@ref{read} ++ ++@subsubheading Notes:: ++The corresponding output function is @b{write-char}. ++ ++@node read-char-no-hang, terpri, read-char, Streams Dictionary ++@subsection read-char-no-hang [Function] ++ ++@code{read-char-no-hang} @i{@r{&optional} input-stream eof-error-p ++ eof-value recursive-p} @result{} @i{char} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream} -- an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{recursive-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{char}---a @i{character} or @b{nil} or the @i{eof-value}. ++ ++@subsubheading Description:: ++ ++@b{read-char-no-hang} returns a character ++from @i{input-stream} if such a character is available. If no character ++is available, @b{read-char-no-hang} returns @b{nil}. ++ ++If @i{recursive-p} is @i{true}, ++this call is expected to be embedded in a higher-level call to @b{read} ++or a similar @i{function} used by the @i{Lisp reader}. ++ ++If an @i{end of file}_2 occurs and @i{eof-error-p} is @i{false}, ++@i{eof-value} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++;; This code assumes an implementation in which a newline is not ++;; required to terminate input from the console. ++ (defun test-it () ++ (unread-char (read-char)) ++ (list (read-char-no-hang) ++ (read-char-no-hang) ++ (read-char-no-hang))) ++@result{} TEST-IT ++;; Implementation A, where a Newline is not required to terminate ++;; interactive input on the console. ++ (test-it) ++@t{ |> } @b{|>>}@t{a}@b{<<|} ++@result{} (#\a NIL NIL) ++;; Implementation B, where a Newline is required to terminate ++;; interactive input on the console, and where that Newline remains ++;; on the input stream. ++ (test-it) ++@t{ |> } @b{|>>}@t{a@r{@i{[<--}~]}}@b{<<|} ++@result{} (#\a #\Newline NIL) ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*}, ++@b{*terminal-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++If an @i{end of file}_2 occurs ++when @i{eof-error-p} is @i{true}, ++an error of @i{type} @b{end-of-file} is signaled . ++ ++@subsubheading See Also:: ++ ++@ref{listen} ++ ++@subsubheading Notes:: ++ ++@b{read-char-no-hang} is exactly like @b{read-char}, except ++that if it would be necessary to wait in order to get a character (as ++from a keyboard), @b{nil} is immediately returned without waiting. ++ ++@node terpri, unread-char, read-char-no-hang, Streams Dictionary ++@subsection terpri, fresh-line [Function] ++ ++@code{terpri} @i{@r{&optional} output-stream} @result{} @i{@b{nil}} ++ ++@code{fresh-line} @i{@r{&optional} output-stream} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{output-stream} -- an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{terpri} outputs a @i{newline} to @i{output-stream}. ++ ++@b{fresh-line} is similar to @b{terpri} but outputs a @i{newline} ++only if the @i{output-stream} is not already at the start of a line. ++If for some reason this cannot be determined, then a @i{newline} is output anyway. ++@b{fresh-line} returns @i{true} if it outputs a @i{newline}; ++otherwise it returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-output-to-string (s) ++ (write-string "some text" s) ++ (terpri s) ++ (terpri s) ++ (write-string "more text" s)) ++@result{} "some text ++ ++more text" ++ (with-output-to-string (s) ++ (write-string "some text" s) ++ (fresh-line s) ++ (fresh-line s) ++ (write-string "more text" s)) ++@result{} "some text ++more text" ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{output-stream} is modified. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}, ++@b{*terminal-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++None. ++ ++[Reviewer Note by Barmar: What if stream is closed?] ++ ++@subsubheading Notes:: ++ ++@b{terpri} is identical in effect to ++ ++@example ++ (write-char #\Newline output-stream) ++@end example ++ ++@node unread-char, write-char, terpri, Streams Dictionary ++@subsection unread-char [Function] ++ ++@code{unread-char} @i{character @r{&optional} input-stream} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{character}---a @i{character}; ++ must be the last @i{character} that was read from @i{input-stream}. ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@subsubheading Description:: ++ ++@b{unread-char} places @i{character} back onto the front of ++@i{input-stream} so that it will again be the next character ++in @i{input-stream}. ++ ++When @i{input-stream} is an @i{echo stream}, ++no attempt is made to undo any echoing of the character that might already ++have been done on @i{input-stream}. However, characters placed on ++@i{input-stream} by @b{unread-char} are marked in such a way ++as to inhibit later re-echo by @b{read-char}. ++ ++It is an error to invoke @b{unread-char} ++twice consecutively on the same @i{stream} ++without an intervening call to @b{read-char} ++(or some other input operation which implicitly reads characters) ++on that @i{stream}. ++ ++Invoking @b{peek-char} or @b{read-char} commits all previous characters. ++The consequences of invoking @b{unread-char} ++on any character preceding that which is returned by ++@b{peek-char} (including those passed over by ++@b{peek-char} that has a @i{non-nil} @i{peek-type}) ++are unspecified. ++In particular, the consequences of ++invoking @b{unread-char} after @b{peek-char} ++are unspecified. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-input-from-string (is "0123") ++ (dotimes (i 6) ++ (let ((c (read-char is))) ++ (if (evenp i) (format t "~&~S ~S~ ++@t{ |> } 0 #\0 ++@t{ |> } 2 #\1 ++@t{ |> } 4 #\2 ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*}, ++@b{*terminal-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{peek-char} ++, ++@ref{read-char} ++, ++@ref{Stream Concepts} ++ ++@subsubheading Notes:: ++ ++@b{unread-char} is intended to be an efficient mechanism for allowing ++the @i{Lisp reader} and other parsers to perform one-character lookahead ++in @i{input-stream}. ++ ++@node write-char, read-line, unread-char, Streams Dictionary ++@subsection write-char [Function] ++ ++@code{write-char} @i{character @r{&optional} output-stream} @result{} @i{character} ++ ++@subsubheading Arguments and Values:: ++ ++@i{character}---a @i{character}. ++ ++@i{output-stream} -- an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++@subsubheading Description:: ++ ++@b{write-char} outputs @i{character} to @i{output-stream}. ++ ++@subsubheading Examples:: ++@example ++ (write-char #\a) ++@t{ |> } a ++@result{} #\a ++ (with-output-to-string (s) ++ (write-char #\a s) ++ (write-char #\Space s) ++ (write-char #\b s)) ++@result{} "a b" ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{output-stream} is modified. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}, ++@b{*terminal-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{read-char} ++, ++@ref{write-byte} ++, ++ ++@ref{write-sequence} ++ ++@node read-line, write-string, write-char, Streams Dictionary ++@subsection read-line [Function] ++ ++@code{read-line} @i{@r{&optional} input-stream eof-error-p eof-value recursive-p}@* ++ @result{} @i{line, missing-newline-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ The default is @b{nil}. ++ ++@i{recursive-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{line}---a @i{string} or the @i{eof-value}. ++ ++@i{missing-newline-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Reads from @i{input-stream} a line of text ++that is terminated by a @i{newline} or @i{end of file}. ++ ++If @i{recursive-p} is @i{true}, ++this call is expected to be embedded in a higher-level call to @b{read} ++or a similar @i{function} used by the @i{Lisp reader}. ++ ++The @i{primary value}, @i{line}, is the line that is read, ++represented as a @i{string} (without the trailing @i{newline}, if any). ++If @i{eof-error-p} is @i{false} ++and the @i{end of file} for @i{input-stream} is reached ++ before any @i{characters} are read, ++@i{eof-value} is returned as the @i{line}. ++ ++The @i{secondary value}, @i{missing-newline-p}, ++is a @i{generalized boolean} that is ++ @i{false} if the @i{line} was terminated by a @i{newline}, ++ or @i{true} if the @i{line} was terminated by ++ the @i{end of file} for @i{input-stream} ++ (or if the @i{line} is the @i{eof-value}). ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a "line 1 ++ line2") ++@result{} "line 1 ++ line2" ++ (read-line (setq input-stream (make-string-input-stream a))) ++@result{} "line 1", @i{false} ++ (read-line input-stream) ++@result{} "line2", @i{true} ++ (read-line input-stream nil nil) ++@result{} NIL, @i{true} ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*}, ++@b{*terminal-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++If an @i{end of file}_2 occurs before any characters are read in the line, ++an error is signaled if @i{eof-error-p} is @i{true}. ++ ++@subsubheading See Also:: ++ ++@ref{read} ++ ++@subsubheading Notes:: ++ ++The corresponding output function is @b{write-line}. ++ ++@node write-string, read-sequence, read-line, Streams Dictionary ++@subsection write-string, write-line [Function] ++ ++@code{write-string} @i{string @r{&optional} output-stream @r{&key} start end} @result{} @i{string} ++ ++@code{write-line} @i{string @r{&optional} output-stream @r{&key} start end} @result{} @i{string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string}. ++ ++@i{output-stream} -- an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{string}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@subsubheading Description:: ++ ++@b{write-string} writes the @i{characters} of ++the subsequence of @i{string} @i{bounded} by @i{start} and @i{end} ++to @i{output-stream}. ++@b{write-line} does the same thing, ++but then outputs a newline afterwards. ++ ++@subsubheading Examples:: ++ ++@example ++ (prog1 (write-string "books" nil :end 4) (write-string "worms")) ++@t{ |> } bookworms ++@result{} "books" ++ (progn (write-char #\*) ++ (write-line "test12" *standard-output* :end 5) ++ (write-line "*test2") ++ (write-char #\*) ++ nil) ++@t{ |> } *test1 ++@t{ |> } *test2 ++@t{ |> } * ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}, ++@b{*terminal-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{read-line} ++, ++@ref{write-char} ++ ++@subsubheading Notes:: ++ ++@b{write-line} and @b{write-string} return @i{string}, ++not the substring @i{bounded} by @i{start} and @i{end}. ++ ++@example ++ (write-string string) ++@equiv{} (dotimes (i (length string) ++ (write-char (char string i))) ++ ++ (write-line string) ++@equiv{} (prog1 (write-string string) (terpri)) ++@end example ++ ++@node read-sequence, write-sequence, write-string, Streams Dictionary ++@subsection read-sequence [Function] ++ ++@code{read-sequence} @i{sequence stream @r{&key} start end} @result{} @i{position} ++ ++@i{sequence}---a @i{sequence}. ++ ++@i{stream}---an @i{input} @i{stream}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of ++ @i{sequence}. The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{position}---an @i{integer} greater than or equal to zero, and ++ less than or equal to the @i{length} of the @i{sequence}. ++ ++@subsubheading Description:: ++ ++Destructively modifies @i{sequence} by replacing the @i{elements} ++of @i{sequence} @i{bounded} by @i{start} and @i{end} with ++@i{elements} read from @i{stream}. ++ ++@i{Sequence} is destructively modified by copying successive ++@i{elements} into it from @i{stream}. If the @i{end of file} for ++@i{stream} is reached before copying all @i{elements} of the ++subsequence, then the extra @i{elements} near the end of @i{sequence} ++are not updated. ++ ++@i{Position} is the index of the first @i{element} of @i{sequence} ++that was not updated, which might be less than @i{end} because the ++@i{end of file} was reached. ++ ++@subsubheading Examples:: ++ ++@example ++ (defvar *data* (make-array 15 :initial-element nil)) ++ (values (read-sequence *data* (make-string-input-stream "test string")) *data*) ++ @result{} 11, #(#\t #\e #\s #\t #\Space #\s #\t #\r #\i #\n #\g NIL NIL NIL NIL) ++@end example ++ ++@subsubheading Side Effects:: ++ ++Modifies @i{stream} and @i{sequence}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{start} is not a non-negative @i{integer}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{end} is not a non-negative @i{integer} or @b{nil}. ++ ++Might signal an error of @i{type} @b{type-error} if an @i{element} read from ++the @i{stream} is not a member of the @i{element type} of the ++@i{sequence}. ++ ++@subsubheading See Also:: ++ ++@ref{Compiler Terminology}, ++@ref{write-sequence} ++, ++@ref{read-line} ++ ++@subsubheading Notes:: ++ ++@b{read-sequence} is identical in effect to iterating over the indicated ++subsequence and reading one @i{element} at a time from @i{stream} and ++storing it into @i{sequence}, but may be more efficient than the ++equivalent loop. An efficient implementation is more likely to exist ++for the case where the @i{sequence} is a @i{vector} with the same ++@i{element type} as the @i{stream}. ++ ++@node write-sequence, file-length, read-sequence, Streams Dictionary ++@subsection write-sequence [Function] ++ ++@code{write-sequence} @i{sequence stream @r{&key} start end} @result{} @i{sequence} ++ ++@i{sequence}---a @i{sequence}. ++ ++@i{stream}---an @i{output} @i{stream}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of ++ @i{sequence}. The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@subsubheading Description:: ++ ++@b{write-sequence} writes the @i{elements} of the subsequence ++of @i{sequence} @i{bounded} by @i{start} and @i{end} to ++@i{stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (write-sequence "bookworms" *standard-output* :end 4) ++ @t{ |> } book ++ @result{} "bookworms" ++@end example ++ ++@subsubheading Side Effects:: ++ ++Modifies @i{stream}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should be prepared to signal an error of @i{type} @b{type-error} ++ if @i{sequence} is not a @i{proper sequence}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{start} is not a non-negative @i{integer}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{end} is not a non-negative @i{integer} or @b{nil}. ++ ++Might signal an error of @i{type} @b{type-error} if an @i{element} of the ++@i{bounded} @i{sequence} is not a member of the ++@i{stream element type} of the @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{Compiler Terminology}, ++@ref{read-sequence} ++, ++@ref{write-string} ++, ++@b{write-line} ++ ++@subsubheading Notes:: ++ ++@b{write-sequence} is identical in effect to iterating over the indicated ++subsequence and writing one @i{element} at a time to @i{stream}, but ++may be more efficient than the equivalent loop. An efficient implementation ++is more likely to exist for the case where the @i{sequence} is a ++@i{vector} with the same @i{element type} as the @i{stream}. ++ ++@node file-length, file-position, write-sequence, Streams Dictionary ++@subsection file-length [Function] ++ ++@code{file-length} @i{stream} @result{} @i{length} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream associated with a file}. ++ ++@i{length}---a non-negative @i{integer} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{file-length} returns the length of @i{stream}, ++or @b{nil} if the length cannot be determined. ++ ++For a binary file, the length is measured in units of ++the @i{element type} of the @i{stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (s "decimal-digits.text" ++ :direction :output :if-exists :error) ++ (princ "0123456789" s) ++ (truename s)) ++@result{} #P"A:>Joe>decimal-digits.text.1" ++ (with-open-file (s "decimal-digits.text") ++ (file-length s)) ++@result{} 10 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{stream} is not a @i{stream associated with a file}. ++ ++@subsubheading See Also:: ++ ++@ref{open} ++ ++@node file-position, file-string-length, file-length, Streams Dictionary ++@subsection file-position [Function] ++ ++@code{file-position} @i{stream} @result{} @i{position} ++ ++@code{file-position} @i{stream position-spec} @result{} @i{success-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream}. ++ ++@i{position-spec}---a @i{file position designator}. ++ ++@i{position}---a @i{file position} or @b{nil}. ++ ++@i{success-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns or changes the current position within a @i{stream}. ++ ++When @i{position-spec} is not supplied, ++@b{file-position} returns the current @i{file position} in the @i{stream}, ++or @b{nil} if this cannot be determined. ++ ++When @i{position-spec} is supplied, ++the @i{file position} in @i{stream} is set to that @i{file position} (if possible). ++@b{file-position} returns @i{true} ++if the repositioning is performed successfully, ++or @i{false} if it is not. ++ ++An @i{integer} returned by @b{file-position} of one argument ++should be acceptable as @i{position-spec} for use with the same file. ++ ++For a character file, ++performing a single @b{read-char} or @b{write-char} operation ++may cause the file position to be increased by more than 1 because of ++character-set translations (such as translating between the @r{Common Lisp} ++@t{#\Newline} character and an external ASCII ++carriage-return/line-feed sequence) and other aspects of the ++implementation. For a binary file, every @b{read-byte} ++or @b{write-byte} ++operation increases the file position by 1. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun tester () ++ (let ((noticed '()) file-written) ++ (flet ((notice (x) (push x noticed) x)) ++ (with-open-file (s "test.bin" ++ :element-type '(unsigned-byte 8) ++ :direction :output ++ :if-exists :error) ++ (notice (file-position s)) ;1 ++ (write-byte 5 s) ++ (write-byte 6 s) ++ (let ((p (file-position s))) ++ (notice p) ;2 ++ (notice (when p (file-position s (1- p))))) ;3 ++ (write-byte 7 s) ++ (notice (file-position s)) ;4 ++ (setq file-written (truename s))) ++ (with-open-file (s file-written ++ :element-type '(unsigned-byte 8) ++ :direction :input) ++ (notice (file-position s)) ;5 ++ (let ((length (file-length s))) ++ (notice length) ;6 ++ (when length ++ (dotimes (i length) ++ (notice (read-byte s)))))) ;7,... ++ (nreverse noticed)))) ++@result{} tester ++ (tester) ++@result{} (0 2 T 2 0 2 5 7) ++@i{OR}@result{} (0 2 NIL 3 0 3 5 6 7) ++@i{OR}@result{} (NIL NIL NIL NIL NIL NIL) ++@end example ++ ++@subsubheading Side Effects:: ++ ++When the @i{position-spec} argument is supplied, ++the @i{file position} in the @i{stream} might be moved. ++ ++@subsubheading Affected By:: ++ ++The value returned by @b{file-position} increases monotonically ++as input or output operations are performed. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{position-spec} is supplied, but is too large or otherwise inappropriate, ++an error is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{file-length} ++, ++@ref{file-string-length} ++, ++@ref{open} ++ ++@subsubheading Notes:: ++ ++Implementations that have character files represented ++as a sequence of records of bounded size might choose to encode the ++file position as, for example, ++<<@i{record-number}>>*<<@i{max-record-size}>>+<<@i{character-within-record}>>. ++This is a valid encoding because it increases monotonically as ++each character is read or written, though not necessarily by 1 at ++each step. An @i{integer} might then be considered ``inappropriate'' ++as @i{position-spec} to @b{file-position} if, when decoded into ++record number and character number, it turned out that the ++supplied record was too short for the specified character number. ++ ++@node file-string-length, open, file-position, Streams Dictionary ++@subsection file-string-length [Function] ++ ++@code{file-string-length} @i{stream object} @result{} @i{length} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---an @i{output} @i{character} @i{file stream}. ++ ++@i{object}---a @i{string} or a @i{character}. ++ ++@i{length}---a non-negative @i{integer}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{file-string-length} returns the difference between what ++@t{(file-position @i{stream})} would be after writing ++@i{object} and its current value, or @b{nil} if this cannot be determined. ++ ++The returned value corresponds to the current state of @i{stream} ++at the time of the call and might not be ++the same if it is called again ++when the state of the @i{stream} has changed. ++ ++@node open, stream-external-format, file-string-length, Streams Dictionary ++@subsection open [Function] ++ ++@code{open} @i{filespec @r{&key} direction element-type ++ if-exists if-does-not-exist ++ external-format}@* ++ @result{} @i{stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{filespec}---a @i{pathname designator}. ++ ++@i{direction}---one of @t{:input}, @t{:output}, @t{:io}, or @t{:probe}. ++ The default is @t{:input}. ++ ++@i{element-type}---a @i{type specifier} ++ for @i{recognizable subtype} of @b{character}; ++ or a @i{type specifier} ++ for a @i{finite} @i{recognizable subtype} of @i{integer}; ++ or one of the @i{symbols} ++ @b{signed-byte}, ++ @b{unsigned-byte}, ++ or @t{:default}. ++ The default is @b{character}. ++ ++@i{if-exists}---one of @t{:error}, @t{:new-version}, @t{:rename}, ++ @t{:rename-and-delete}, @t{:overwrite}, @t{:append}, ++ @t{:supersede}, or @b{nil}. ++ The default is @t{:new-version} if the version component of @i{filespec} is @t{:newest}, ++ or @t{:error} otherwise. ++ ++@i{if-does-not-exist}---one of @t{:error}, @t{:create}, or @b{nil}. ++ The default is @t{:error} if @i{direction} is @t{:input} ++ or @i{if-exists} is @t{:overwrite} or @t{:append}; ++ @t{:create} if @i{direction} is @t{:output} or @t{:io}, ++ and @i{if-exists} is neither @t{:overwrite} nor @t{:append}; ++ or @b{nil} when @i{direction} is @t{:probe}. ++ ++@i{external-format}---an @i{external file format designator}. ++ The default is @t{:default}. ++ ++@i{stream}---a @i{file stream} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{open} creates, opens, and returns a @i{file stream} ++that is connected to the file specified by @i{filespec}. ++@i{Filespec} is the name of the file to be opened. ++If the @i{filespec} @i{designator} is a @i{stream}, ++that @i{stream} is not closed first or otherwise affected. ++ ++The keyword arguments to @b{open} specify the characteristics ++of the @i{file stream} that is returned, and how to handle errors. ++ ++If @i{direction} is @t{:input} ++or @t{:probe}, ++or if @i{if-exists} is not @t{:new-version} ++and the version component of the @i{filespec} is @t{:newest}, ++then the file opened is that file already existing in the file system ++that has a version greater than that of any other file in the file system ++whose other pathname components are the same as those of @i{filespec}. ++ ++An implementation is required to recognize all of ++the @b{open} keyword options ++and to do something reasonable in the context of the host operating ++system. ++For example, if a file system does not support distinct file ++versions and does not distinguish the notions of deletion and expunging, ++@t{:new-version} might be treated the same as ++@t{:rename} or @t{:supersede}, and @t{:rename-and-delete} might ++be treated the same as @t{:supersede}. ++ ++@table @asis ++ ++@item @t{:direction} ++These are the possible values for @i{direction}, ++and how they affect the nature of the @i{stream} that is created: ++ ++@table @asis ++ ++@item @t{:input} ++Causes the creation of an @i{input} @i{file stream}. ++ ++@item @t{:output} ++Causes the creation of an @i{output} @i{file stream}. ++ ++@item @t{:io} ++Causes the creation of a @i{bidirectional} @i{file stream}. ++ ++@item @t{:probe} ++Causes the creation of a ``no-directional'' @i{file stream}; ++in effect, the @i{file stream} is created ++and then closed prior to being returned by @b{open}. ++ ++@end table ++ ++@item @t{:element-type} ++The @i{element-type} specifies the unit of transaction for the @i{file stream}. ++If it is @t{:default}, ++the unit is determined by @i{file system}, ++possibly based on the @i{file}. ++ ++@item @t{:if-exists} ++@i{if-exists} specifies the action to be taken if @i{direction} is ++@t{:output} or @t{:io} and a file of the name @i{filespec} ++already exists. ++If @i{direction} is @t{:input}, not supplied, or @t{:probe}, ++@i{if-exists} is ignored. ++These are the results of @b{open} as modified by @i{if-exists}: ++ ++@table @asis ++ ++@item @t{:error} ++An error of @i{type} @b{file-error} is signaled. ++ ++@item @t{:new-version} ++A new file is created with a larger version number. ++ ++@item @t{:rename} ++The existing file is renamed to some other name and then a new file is created. ++ ++@item @t{:rename-and-delete} ++The existing file is renamed to some other name, ++then it is deleted but not expunged, and then a new file is created. ++ ++@item @t{:overwrite} ++Output operations on the @i{stream} destructively modify the existing file. ++If @i{direction} is @t{:io} the file is opened in a bidirectional mode ++that allows both reading and writing. The file pointer is initially ++positioned at the beginning of the file; however, the file is not truncated ++back to length zero when it is opened. ++ ++@item @t{:append} ++Output operations on the @i{stream} destructively modify the existing file. ++The file pointer is initially positioned at the end of the file. ++ ++If @i{direction} is @t{:io}, ++the file is opened in a bidirectional mode that allows both reading and writing. ++ ++@item @t{:supersede} ++The existing file is superseded; ++that is, a new file with the same name as the old one is created. ++If possible, the implementation should not destroy the old file until the new ++@i{stream} is closed. ++ ++@item @b{nil} ++No file or @i{stream} is created; ++instead, @b{nil} is returned to indicate failure. ++ ++@end table ++ ++@item @t{:if-does-not-exist} ++@i{if-does-not-exist} ++specifies the action to be taken if ++a file of name @i{filespec} does not already exist. ++These are the results of @b{open} as modified by @i{if-does-not-exist}: ++ ++@table @asis ++ ++@item @t{:error} ++An error of @i{type} @b{file-error} is signaled. ++ ++@item @t{:create} ++An empty file is created. ++Processing continues as if the file ++had already existed but no processing as ++directed by @i{if-exists} is performed. ++ ++@item @b{nil} ++No file or @i{stream} is created; ++instead, @b{nil} is returned to indicate failure. ++ ++@end table ++ ++@item @t{:external-format} ++This option selects an @i{external file format} for the @i{file}: ++The only @i{standardized} value for this option is @t{:default}, ++although @i{implementations} are permitted to define additional ++@i{external file formats} and @i{implementation-dependent} values ++returned by @b{stream-external-format} can also be used by @i{conforming programs}. ++ ++The @i{external-format} is meaningful for ++any kind of @i{file stream} whose @i{element type} ++is a @i{subtype} of @i{character}. ++This option is ignored for @i{streams} for which it is not meaningful; ++however, @i{implementations} may define other @i{element types} ++for which it is meaningful. ++The consequences are unspecified if a @i{character} is written ++that cannot be represented by the given @i{external file format}. ++ ++@end table ++ ++When a file is opened, a @i{file stream} is constructed to serve ++as the file system's ambassador to the @r{Lisp} environment; ++operations on the @i{file stream} are reflected by operations on the file ++in the file system. ++ ++A file can be deleted, renamed, or destructively modified by @b{open}. ++ ++For information about opening relative pathnames, ++see @ref{Merging Pathnames}. ++ ++@subsubheading Examples:: ++ ++@example ++ (open @i{filespec} :direction :probe) @result{} # ++ (setq q (merge-pathnames (user-homedir-pathname) "test")) ++@result{} # ++ (open @i{filespec} :if-does-not-exist :create) @result{} # ++ (setq s (open @i{filespec} :direction :probe)) @result{} # ++ (truename s) @result{} # ++ (open s :direction :output :if-exists nil) @result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++The nature and state of the host computer's @i{file system}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{if-exists} is @t{:error}, (subject to the ++constraints on the meaning of @i{if-exists} listed above), ++an error of @i{type} @b{file-error} is signaled. ++ ++If @i{if-does-not-exist} is @t{:error} (subject to the ++constraints on the meaning of @i{if-does-not-exist} listed above), ++an error of @i{type} @b{file-error} is signaled. ++ ++If it is impossible for an implementation to handle some option ++in a manner close to what is specified here, ++an error of @i{type} @b{error} might be signaled. ++ ++An error of @i{type} @b{file-error} is signaled if ++@t{(wild-pathname-p @i{filespec})} returns true. ++ ++An error of @i{type} @b{error} is signaled if the @i{external-format} ++is not understood by the @i{implementation}. ++ ++The various @i{file systems} in existence today have widely differing capabilities, ++and some aspects of the @i{file system} are beyond the scope of this specification ++to define. A given @i{implementation} might not be able to support all of these options ++in exactly the manner stated. An @i{implementation} is required to recognize all of ++these option keywords and to try to do something ``reasonable'' in the context of the ++host @i{file system}. Where necessary to accomodate the @i{file system}, ++an @i{implementation} deviate slightly from the semantics specified here without ++being disqualified for consideration as a @i{conforming implementation}. ++If it is utterly impossible for an @i{implementation} to handle some option ++in a manner similar to what is specified here, it may simply signal an error. ++ ++With regard to the @t{:element-type} option, if a @i{type} is ++requested that is not supported by the @i{file system}, a substitution of types ++such as that which goes on in @i{upgrading} is permissible. As a minimum ++requirement, it should be the case that opening an @i{output} @i{stream} ++to a @i{file} in a given @i{element type} and later opening ++an @i{input} @i{stream} to the same @i{file} in the same @i{element type} ++should work compatibly. ++ ++@subsubheading See Also:: ++ ++@ref{with-open-file} ++, ++@ref{close} ++, ++@b{pathname}, ++@b{logical-pathname}, ++ ++@ref{Merging Pathnames}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++@b{open} does not automatically close the file when an abnormal ++exit occurs. ++ ++When @i{element-type} is a @i{subtype} of @b{character}, ++@b{read-char} and/or @b{write-char} can be ++used on the resulting @i{file stream}. ++ ++When @i{element-type} is a @i{subtype} of @i{integer}, ++@b{read-byte} and/or @b{write-byte} can be used on the resulting @i{file stream}. ++ ++When @i{element-type} is @t{:default}, ++the @i{type} can be determined by using @b{stream-element-type}. ++ ++@node stream-external-format, with-open-file, open, Streams Dictionary ++@subsection stream-external-format [Function] ++ ++@code{stream-external-format} @i{stream} @result{} @i{format} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{file stream}. ++ ++@i{format}---an @i{external file format}. ++ ++@subsubheading Description:: ++ ++Returns an @i{external file format designator} for the @i{stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (stream "test" :direction :output) ++ (stream-external-format stream)) ++@result{} :DEFAULT ++@i{OR}@result{} :ISO8859/1-1987 ++@i{OR}@result{} (:ASCII :SAIL) ++@i{OR}@result{} ACME::PROPRIETARY-FILE-FORMAT-17 ++@i{OR}@result{} # ++@end example ++ ++@subsubheading See Also:: ++ ++the @t{:external-format} @i{argument} to the @i{function} ++@ref{open} ++ and ++the ++@ref{with-open-file} ++ @i{macro}. ++ ++@subsubheading Notes:: ++ ++The @i{format} returned is not necessarily meaningful ++to other @i{implementations}. ++ ++@node with-open-file, close, stream-external-format, Streams Dictionary ++@subsection with-open-file [macro] ++ ++@subsubheading Syntax:: ++ ++@code{with-open-file} @i{@r{(}stream filespec @{@i{options}@}*@r{)} ++ @{@i{declaration}@}* ++ @{@i{form}@}*}@* ++ @result{} @i{results} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream} -- a variable. ++ ++@i{filespec}---a @i{pathname designator}. ++ ++@i{options} -- @i{forms}; evaluated. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{with-open-file} uses @b{open} to create a @i{file stream} ++ ++to @i{file} named by @i{filespec}. ++@i{Filespec} is the name of the file to be opened. ++@i{Options} are used as keyword arguments to @b{open}. ++ ++The @i{stream} @i{object} to which the @i{stream} @i{variable} ++is @i{bound} has @i{dynamic extent}; ++its @i{extent} ends when the @i{form} is exited. ++ ++@b{with-open-file} evaluates the @i{forms} as an @i{implicit progn} ++with @i{stream} bound to ++ ++the value returned by @b{open}. ++ ++When control leaves the body, either normally or abnormally (such as by ++use of @b{throw}), the file is automatically closed. If a new ++output file is being written, and control leaves abnormally, the file is ++aborted and the file system is left, so far as possible, as if the file ++had never been opened. ++ ++It is possible by the use of @t{:if-exists nil} ++or @t{:if-does-not-exist nil} for ++@i{stream} to be bound to @b{nil}. ++ ++Users of @t{:if-does-not-exist nil} should check for a valid @i{stream}. ++ ++The consequences are undefined if an attempt is made to @i{assign} the ++@i{stream} @i{variable}. The compiler may choose to issue a ++warning if such an attempt is detected. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq p (merge-pathnames "test")) ++@result{} # ++ (with-open-file (s p :direction :output :if-exists :supersede) ++ (format s "Here are a couple~ ++ (with-open-file (s p) ++ (do ((l (read-line s) (read-line s nil 'eof))) ++ ((eq l 'eof) "Reached end of file.") ++ (format t "~&*** ~A~ ++@t{ |> } *** Here are a couple ++@t{ |> } *** of test data lines ++@result{} "Reached end of file." ++@end example ++ ++@example ++;; Normally one would not do this intentionally because it is ++;; not perspicuous, but beware when using :IF-DOES-NOT-EXIST NIL ++;; that this doesn't happen to you accidentally... ++ (with-open-file (foo "no-such-file" :if-does-not-exist nil) ++ (read foo)) ++@t{ |> } @b{|>>}@t{hello?}@b{<<|} ++@result{} HELLO? ;This value was read from the terminal, not a file! ++ ++;; Here's another bug to avoid... ++ (with-open-file (foo "no-such-file" :direction :output :if-does-not-exist nil) ++ (format foo "Hello")) ++@result{} "Hello" ;FORMAT got an argument of NIL! ++@end example ++ ++@subsubheading Side Effects:: ++ ++Creates a @i{stream} to the @i{file} named by @i{filename} (upon entry), ++and closes the @i{stream} (upon exit). ++In some @i{implementations}, ++the @i{file} might be locked in some way while it is open. ++If the @i{stream} is an @i{output} @i{stream}, ++a @i{file} might be created. ++ ++@subsubheading Affected By:: ++ ++The host computer's file system. ++ ++@subsubheading Exceptional Situations:: ++ ++See the @i{function} @b{open}. ++ ++@subsubheading See Also:: ++ ++@ref{open} ++, ++@ref{close} ++, ++@b{pathname}, ++@b{logical-pathname}, ++ ++@ref{Pathnames as Filenames} ++ ++@node close, with-open-stream, with-open-file, Streams Dictionary ++@subsection close [Function] ++ ++@code{close} @i{stream @r{&key} abort} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---a @i{stream} (either @i{open} or @i{closed}). ++ ++@i{abort}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{result}---@b{t} if the @i{stream} was @i{open} at the time it was ++ received as an @i{argument}, ++ or @i{implementation-dependent} otherwise. ++ ++@subsubheading Description:: ++ ++@b{close} closes @i{stream}. ++Closing a @i{stream} means ++that it may no longer be used in input or output operations. ++The act of @i{closing} a @i{file stream} ++ends the association between the @i{stream} and its associated @i{file}; ++the transaction with the @i{file system} is terminated, ++and input/output may no longer be performed on the @i{stream}. ++ ++If @i{abort} is @i{true}, an attempt is made to clean up any side ++effects of having created @i{stream}. ++If @i{stream} performs output to a file ++that was created when the @i{stream} was created, the ++file is deleted and any previously existing file is not superseded. ++ ++It is permissible to close an already closed @i{stream}, ++but in that case the @i{result} is @i{implementation-dependent}. ++ ++After @i{stream} is closed, it is still possible to perform ++the following query operations upon it: ++ ++@b{streamp}, @b{pathname}, @b{truename}, ++@b{merge-pathnames}, @b{pathname-host}, @b{pathname-device}, ++@b{pathname-directory},@b{pathname-name}, ++@b{pathname-type}, @b{pathname-version}, @b{namestring}, ++@b{file-namestring}, @b{directory-namestring}, ++@b{host-namestring}, @b{enough-namestring}, @b{open}, ++@b{probe-file}, and @b{directory}. ++ ++The effect of @b{close} on a @i{constructed stream} is ++ to close the argument @i{stream} only. ++There is no effect on the @i{constituents} of @i{composite streams}. ++ ++For a @i{stream} created with @b{make-string-output-stream}, ++the result of @b{get-output-stream-string} is unspecified after @b{close}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq s (make-broadcast-stream)) @result{} # ++ (close s) @result{} T ++ (output-stream-p s) @result{} @i{true} ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{stream} is @i{closed} (if necessary). ++If @i{abort} is @i{true} and the @i{stream} is ++an @i{output} @i{file stream}, its associated @i{file} ++might be deleted. ++ ++@subsubheading See Also:: ++ ++@ref{open} ++ ++@node with-open-stream, listen, close, Streams Dictionary ++@subsection with-open-stream [Macro] ++ ++@code{with-open-stream} @i{@r{(}var stream@r{)} ++ @{@i{declaration}@}* ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{stream}---a @i{form}; evaluated to produce a @i{stream}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{with-open-stream} performs a series of operations on ++@i{stream}, returns a value, and then closes the @i{stream}. ++ ++@i{Var} is bound to the value of @i{stream}, ++and then @i{forms} are executed ++as an @i{implicit progn}. ++@i{stream} ++is automatically closed on exit from @b{with-open-stream}, ++no matter whether the exit is normal or abnormal. ++ ++The @i{stream} has @i{dynamic extent}; ++its @i{extent} ends when the @i{form} is exited. ++ ++The consequences are undefined if an attempt is made to @i{assign} the ++the @i{variable} @i{var} with the @i{forms}. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-stream (s (make-string-input-stream "1 2 3 4")) ++ (+ (read s) (read s) (read s))) @result{} 6 ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{stream} is closed (upon exit). ++ ++@subsubheading See Also:: ++ ++@ref{close} ++ ++@node listen, clear-input, with-open-stream, Streams Dictionary ++@subsection listen [Function] ++ ++@code{listen} @i{@r{&optional} input-stream} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if ++there is a character immediately available from @i{input-stream}; ++otherwise, returns @i{false}. ++On a non-interactive @i{input-stream}, ++@b{listen} returns @i{true} except when at @i{end of file}_1. ++If an @i{end of file} is encountered, @b{listen} returns @i{false}. ++@b{listen} is intended to be used ++when @i{input-stream} obtains characters ++from an interactive device such as a keyboard. ++ ++@subsubheading Examples:: ++ ++@example ++ (progn (unread-char (read-char)) (list (listen) (read-char))) ++@t{ |> } @b{|>>}@t{1}@b{<<|} ++@result{} (T #\1) ++ (progn (clear-input) (listen)) ++@result{} NIL ;Unless you're a very fast typist! ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*} ++ ++@subsubheading See Also:: ++ ++@ref{interactive-stream-p} ++, ++@ref{read-char-no-hang} ++ ++@node clear-input, finish-output, listen, Streams Dictionary ++@subsection clear-input [Function] ++ ++@code{clear-input} @i{@r{&optional} input-stream} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@subsubheading Description:: ++ ++Clears any available input from @i{input-stream}. ++ ++If @b{clear-input} does not make sense for @i{input-stream}, ++then @b{clear-input} does nothing. ++ ++@subsubheading Examples:: ++@example ++;; The exact I/O behavior of this example might vary from implementation ++;; to implementation depending on the kind of interactive buffering that ++;; occurs. (The call to SLEEP here is intended to help even out the ++;; differences in implementations which do not do line-at-a-time buffering.) ++ ++(defun read-sleepily (&optional (clear-p nil) (zzz 0)) ++ (list (progn (print '>) (read)) ++ ;; Note that input typed within the first ZZZ seconds ++ ;; will be discarded. ++ (progn (print '>) ++ (if zzz (sleep zzz)) ++ (print '>>) ++ (if clear-p (clear-input)) ++ (read)))) ++ ++(read-sleepily) ++@t{ |> } > @b{|>>}@t{10}@b{<<|} ++@t{ |> } > ++@t{ |> } >> @b{|>>}@t{20}@b{<<|} ++@result{} (10 20) ++ ++(read-sleepily t) ++@t{ |> } > @b{|>>}@t{10}@b{<<|} ++@t{ |> } > ++@t{ |> } >> @b{|>>}@t{20}@b{<<|} ++@result{} (10 20) ++ ++(read-sleepily t 10) ++@t{ |> } > @b{|>>}@t{10}@b{<<|} ++@t{ |> } > @b{|>>}@t{20}@b{<<|} ; Some implementations won't echo typeahead here. ++@t{ |> } >> @b{|>>}@t{30}@b{<<|} ++@result{} (10 30) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{input-stream} is modified. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*} ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{input-stream} is not a @i{stream designator}. ++ ++@subsubheading See Also:: ++ ++@b{clear-output} ++ ++@node finish-output, y-or-n-p, clear-input, Streams Dictionary ++@subsection finish-output, force-output, clear-output [Function] ++ ++@code{finish-output} @i{@r{&optional} output-stream} @result{} @i{@b{nil}} ++ ++@code{force-output} @i{@r{&optional} output-stream} @result{} @i{@b{nil}} ++ ++@code{clear-output} @i{@r{&optional} output-stream} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{output-stream}---an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++@subsubheading Description:: ++ ++@b{finish-output}, @b{force-output}, and @b{clear-output} ++exercise control over the internal handling of buffered stream output. ++ ++@b{finish-output} attempts to ensure that any buffered output ++sent to @i{output-stream} has reached its destination, and then returns. ++ ++@b{force-output} initiates the emptying of any ++internal buffers but does not wait for completion ++or acknowledgment to return. ++ ++@b{clear-output} attempts to abort any ++outstanding output operation in progress in order ++to allow as little output as possible ++to continue to the destination. ++ ++If any of these operations does not make sense for @i{output-stream}, ++then it does nothing. ++The precise actions of these @i{functions} are @i{implementation-dependent}. ++ ++@subsubheading Examples:: ++@example ++;; Implementation A ++ (progn (princ "am i seen?") (clear-output)) ++@result{} NIL ++ ++;; Implementation B ++ (progn (princ "am i seen?") (clear-output)) ++@t{ |> } am i seen? ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*} ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{output-stream} is not a @i{stream designator}. ++ ++@subsubheading See Also:: ++ ++@ref{clear-input} ++ ++@node y-or-n-p, make-synonym-stream, finish-output, Streams Dictionary ++@subsection y-or-n-p, yes-or-no-p [Function] ++ ++@code{y-or-n-p} @i{@r{&optional} control @r{&rest} arguments} @result{} @i{generalized-boolean} ++ ++@code{yes-or-no-p} @i{@r{&optional} control @r{&rest} arguments} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{control}---a @i{format control}. ++ ++@i{arguments}---@i{format arguments} for @i{control}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++These functions ask a question and parse a response from the user. ++They return @i{true} if the answer is affirmative, ++or @i{false} if the answer is negative. ++ ++@b{y-or-n-p} is for asking the user a question whose answer is either ++``yes'' or ``no.'' ++It is intended that the reply require ++the user to answer a yes-or-no question with a single ++character. ++@b{yes-or-no-p} is also for asking the user a question ++whose answer is either ``Yes'' or ``No.'' ++It is intended that the reply require ++the user to take more action than just a single keystroke, such as typing ++the full word @t{yes} or @t{no} followed by a newline. ++ ++@b{y-or-n-p} types out a message (if supplied), reads an answer ++in some @i{implementation-dependent} manner (intended to be short and simple, ++such as reading a single character such as @t{Y} or @t{N}). ++@b{yes-or-no-p} types out a message (if supplied), ++attracts the user's attention (for example, by ringing ++the terminal's bell), ++and reads an answer ++in some @i{implementation-dependent} manner (intended to be multiple characters, ++such as @t{YES} or @t{NO}). ++ ++If @i{format-control} is supplied and not @b{nil}, ++then a @b{fresh-line} operation is performed; then ++a message is printed as if @i{format-control} and @i{arguments} ++were given to @b{format}. ++In any case, @b{yes-or-no-p} and @b{y-or-n-p} will provide ++a prompt such as ``@t{(Y or N)}'' or ``@t{(Yes or No)}'' if appropriate. ++ ++All input and output are performed using @i{query I/O}. ++ ++@subsubheading Examples:: ++@example ++ (y-or-n-p "(t or nil) given by") ++@t{ |> } (t or nil) given by (Y or N) @b{|>>}@t{Y}@b{<<|} ++@result{} @i{true} ++ (yes-or-no-p "a ~S message" 'frightening) ++@t{ |> } a FRIGHTENING message (Yes or No) @b{|>>}@t{no}@b{<<|} ++@result{} @i{false} ++ (y-or-n-p "Produce listing file?") ++@t{ |> } Produce listing file? ++@t{ |> } Please respond with Y or N. @b{|>>}@t{n}@b{<<|} ++@result{} @i{false} ++@end example ++ ++@subsubheading Side Effects:: ++ ++Output to and input from @i{query I/O} will occur. ++ ++@subsubheading Affected By:: ++ ++@b{*query-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{format} ++ ++@subsubheading Notes:: ++ ++@b{yes-or-no-p} and @b{yes-or-no-p} do not add question marks ++to the end of the prompt string, so any desired question mark or other ++punctuation should be explicitly included in the text query. ++ ++@node make-synonym-stream, synonym-stream-symbol, y-or-n-p, Streams Dictionary ++@subsection make-synonym-stream [Function] ++ ++@code{make-synonym-stream} @i{symbol} @result{} @i{synonym-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol} that names a @i{dynamic variable}. ++ ++@i{synonym-stream}---a @i{synonym stream}. ++ ++@subsubheading Description:: ++ ++Returns a @i{synonym stream} whose @i{synonym stream symbol} is @i{symbol}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a-stream (make-string-input-stream "a-stream") ++ b-stream (make-string-input-stream "b-stream")) ++@result{} # ++ (setq s-stream (make-synonym-stream 'c-stream)) ++@result{} # ++ (setq c-stream a-stream) ++@result{} # ++ (read s-stream) @result{} A-STREAM ++ (setq c-stream b-stream) ++@result{} # ++ (read s-stream) @result{} B-STREAM ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its argument is not a @i{symbol}. ++ ++@subsubheading See Also:: ++ ++@ref{Stream Concepts} ++ ++@node synonym-stream-symbol, broadcast-stream-streams, make-synonym-stream, Streams Dictionary ++@subsection synonym-stream-symbol [Function] ++ ++@code{synonym-stream-symbol} @i{synonym-stream} @result{} @i{symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{synonym-stream}---a @i{synonym stream}. ++ ++@i{symbol}---a @i{symbol}. ++ ++@subsubheading Description:: ++ ++Returns the @i{symbol} whose @b{symbol-value} the @i{synonym-stream} is using. ++ ++@subsubheading See Also:: ++ ++@ref{make-synonym-stream} ++ ++@node broadcast-stream-streams, make-broadcast-stream, synonym-stream-symbol, Streams Dictionary ++@subsection broadcast-stream-streams [Function] ++ ++@code{broadcast-stream-streams} @i{broadcast-stream} @result{} @i{streams} ++ ++@subsubheading Arguments and Values:: ++ ++@i{broadcast-stream}---a @i{broadcast stream}. ++ ++@i{streams}---a @i{list} of @i{streams}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of output @i{streams} that constitute ++all the @i{streams} to which the @i{broadcast-stream} is broadcasting. ++ ++@node make-broadcast-stream, make-two-way-stream, broadcast-stream-streams, Streams Dictionary ++@subsection make-broadcast-stream [Function] ++ ++@code{make-broadcast-stream} @i{@r{&rest} streams} @result{} @i{broadcast-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---an @i{output} @i{stream}. ++ ++@i{broadcast-stream}---a @i{broadcast stream}. ++ ++@subsubheading Description:: ++ ++Returns a @i{broadcast stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a-stream (make-string-output-stream) ++ b-stream (make-string-output-stream)) @result{} # ++ (format (make-broadcast-stream a-stream b-stream) ++ "this will go to both streams") @result{} NIL ++ (get-output-stream-string a-stream) @result{} "this will go to both streams" ++ (get-output-stream-string b-stream) @result{} "this will go to both streams" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if any @i{stream} is not an @i{output} @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{broadcast-stream-streams} ++ ++@node make-two-way-stream, two-way-stream-input-stream, make-broadcast-stream, Streams Dictionary ++@subsection make-two-way-stream [Function] ++ ++@code{make-two-way-stream} @i{input-stream output-stream} @result{} @i{two-way-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---a @i{stream}. ++ ++@i{output-stream}---a @i{stream}. ++ ++@i{two-way-stream}---a @i{two-way stream}. ++ ++@subsubheading Description:: ++ ++Returns a @i{two-way stream} ++that gets its input from @i{input-stream} ++and sends its output to @i{output-stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-output-to-string (out) ++ (with-input-from-string (in "input...") ++ (let ((two (make-two-way-stream in out))) ++ (format two "output...") ++ (setq what-is-read (read two))))) @result{} "output..." ++ what-is-read @result{} INPUT... ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{input-stream} is not an @i{input} @i{stream}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{output-stream} is not an @i{output} @i{stream}. ++ ++@node two-way-stream-input-stream, echo-stream-input-stream, make-two-way-stream, Streams Dictionary ++@subsection two-way-stream-input-stream, two-way-stream-output-stream ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{two-way-stream-input-stream} @i{two-way-stream} @result{} @i{input-stream} ++ ++@code{two-way-stream-output-stream} @i{two-way-stream} @result{} @i{output-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{two-way-stream}---a @i{two-way stream}. ++ ++@i{input-stream}---an @i{input} @i{stream}. ++ ++@i{output-stream}---an @i{output} @i{stream}. ++ ++@subsubheading Description:: ++ ++@b{two-way-stream-input-stream} returns the @i{stream} ++from which @i{two-way-stream} receives input. ++ ++@b{two-way-stream-output-stream} returns the @i{stream} ++to which @i{two-way-stream} sends output. ++ ++@node echo-stream-input-stream, make-echo-stream, two-way-stream-input-stream, Streams Dictionary ++@subsection echo-stream-input-stream, echo-stream-output-stream [Function] ++ ++@code{echo-stream-input-stream} @i{echo-stream} @result{} @i{input-stream} ++ ++@code{echo-stream-output-stream} @i{echo-stream} @result{} @i{output-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{echo-stream}---an @i{echo stream}. ++ ++@i{input-stream}---an @i{input} @i{stream}. ++ ++@b{output-stream}---an @i{output} @i{stream}. ++ ++@subsubheading Description:: ++ ++@b{echo-stream-input-stream} returns the @i{input} @i{stream} ++from which @i{echo-stream} receives input. ++ ++@b{echo-stream-output-stream} returns the @i{output} @i{stream} ++to which @i{echo-stream} sends output. ++ ++@node make-echo-stream, concatenated-stream-streams, echo-stream-input-stream, Streams Dictionary ++@subsection make-echo-stream [Function] ++ ++@code{make-echo-stream} @i{input-stream output-stream} @result{} @i{echo-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream}. ++ ++@i{output-stream}---an @i{output} @i{stream}. ++ ++@i{echo-stream}---an @i{echo stream}. ++ ++@subsubheading Description:: ++ ++Creates and returns an @i{echo stream} ++that takes input from @i{input-stream} ++and sends output to @i{output-stream}. ++ ++@subsubheading Examples:: ++@example ++ (let ((out (make-string-output-stream))) ++ (with-open-stream ++ (s (make-echo-stream ++ (make-string-input-stream "this-is-read-and-echoed") ++ out)) ++ (read s) ++ (format s " * this-is-direct-output") ++ (get-output-stream-string out))) ++@result{} "this-is-read-and-echoed * this-is-direct-output" ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{echo-stream-input-stream} ++, ++@b{echo-stream-output-stream}, ++@ref{make-two-way-stream} ++ ++@node concatenated-stream-streams, make-concatenated-stream, make-echo-stream, Streams Dictionary ++@subsection concatenated-stream-streams [Function] ++ ++@code{concatenated-stream-streams} @i{concatenated-stream} @result{} @i{streams} ++ ++@subsubheading Arguments and Values:: ++ ++@i{concatenated-stream} -- a @i{concatenated stream}. ++ ++@i{streams}---a @i{list} of @i{input} @i{streams}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of @i{input} @i{streams} that constitute the ++ordered set of @i{streams} the @i{concatenated-stream} still ++has to read from, starting with the current one it is reading from. ++The list may be @i{empty} if no more @i{streams} remain to be read. ++ ++The consequences are undefined if the @i{list structure} of the @i{streams} ++is ever modified. ++ ++@node make-concatenated-stream, get-output-stream-string, concatenated-stream-streams, Streams Dictionary ++@subsection make-concatenated-stream [Function] ++ ++@code{make-concatenated-stream} @i{@r{&rest} input-streams} @result{} @i{concatenated-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream}. ++ ++@i{concatenated-stream}---a @i{concatenated stream}. ++ ++@subsubheading Description:: ++ ++Returns a @i{concatenated stream} that has the indicated @i{input-streams} ++initially associated with it. ++ ++@subsubheading Examples:: ++@example ++ (read (make-concatenated-stream ++ (make-string-input-stream "1") ++ (make-string-input-stream "2"))) @result{} 12 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if any argument is not an @i{input} @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{concatenated-stream-streams} ++ ++@node get-output-stream-string, make-string-input-stream, make-concatenated-stream, Streams Dictionary ++@subsection get-output-stream-string [Function] ++ ++@code{get-output-stream-string} @i{string-output-stream} @result{} @i{string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string-output-stream}---a @i{stream}. ++ ++@i{string}---a @i{string}. ++ ++@subsubheading Description:: ++ ++Returns a @i{string} containing, in order, all the @i{characters} ++that have been output to @i{string-output-stream}. ++This operation clears any @i{characters} on @i{string-output-stream}, ++so the @i{string} contains only those @i{characters} which have been output ++ since the last call to @b{get-output-stream-string} ++or since the creation of the @i{string-output-stream}, ++whichever occurred most recently. ++ ++@subsubheading Examples:: ++@example ++ (setq a-stream (make-string-output-stream) ++ a-string "abcdefghijklm") @result{} "abcdefghijklm" ++ (write-string a-string a-stream) @result{} "abcdefghijklm" ++ (get-output-stream-string a-stream) @result{} "abcdefghijklm" ++ (get-output-stream-string a-stream) @result{} "" ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{string-output-stream} is cleared. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if @i{stream-output-string} is @i{closed}. ++ ++The consequences are undefined if @i{string-output-stream} is a @i{stream} that ++was not produced by @b{make-string-output-stream}. ++ ++The consequences are undefined if @i{string-output-stream} was ++created implicitly by @b{with-output-to-string} or @b{format}. ++ ++@subsubheading See Also:: ++ ++@ref{make-string-output-stream} ++ ++@node make-string-input-stream, make-string-output-stream, get-output-stream-string, Streams Dictionary ++@subsection make-string-input-stream [Function] ++ ++@code{make-string-input-stream} @i{string @r{&optional} start end} @result{} @i{string-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{string}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{string-stream}---an @i{input} @i{string stream}. ++ ++@subsubheading Description:: ++ ++Returns an @i{input} @i{string stream}. ++This @i{stream} will supply, in order, the @i{characters} in the substring ++of @i{string} @i{bounded} by @i{start} and @i{end}. ++After the last @i{character} has been supplied, ++the @i{string stream} will then be at @i{end of file}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((string-stream (make-string-input-stream "1 one "))) ++ (list (read string-stream nil nil) ++ (read string-stream nil nil) ++ (read string-stream nil nil))) ++@result{} (1 ONE NIL) ++ ++ (read (make-string-input-stream "prefixtargetsuffix" 6 12)) @result{} TARGET ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{with-input-from-string} ++ ++@node make-string-output-stream, with-input-from-string, make-string-input-stream, Streams Dictionary ++@subsection make-string-output-stream [Function] ++ ++@code{make-string-output-stream} @i{@r{&key} element-type} @result{} @i{string-stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{element-type}---a @i{type specifier}. ++ The default is @b{character}. ++ ++@i{string-stream}---an @i{output} @i{string stream}. ++ ++@subsubheading Description:: ++ ++Returns ++ ++an @i{output} @i{string stream} that accepts @i{characters} ++and makes available (via @b{get-output-stream-string}) ++a @i{string} that contains the @i{characters} that were actually output. ++ ++The @i{element-type} names the @i{type} of the @i{elements} ++of the @i{string}; a @i{string} is constructed of the most specialized ++@i{type} that can accommodate @i{elements} of that @i{element-type}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((s (make-string-output-stream))) ++ (write-string "testing... " s) ++ (prin1 1234 s) ++ (get-output-stream-string s)) ++@result{} "testing... 1234" ++@end example ++ ++None.. ++ ++@subsubheading See Also:: ++ ++@ref{get-output-stream-string} ++, ++@ref{with-output-to-string} ++ ++@node with-input-from-string, with-output-to-string, make-string-output-stream, Streams Dictionary ++@subsection with-input-from-string [Macro] ++ ++@code{with-input-from-string} @i{@r{(}var string @r{&key} index start end@r{)} ++ @{@i{declaration}@}* ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{string}---a @i{form}; evaluated to produce a @i{string}. ++ ++@i{index}---a @i{place}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{string}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{result}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++Creates an ++ ++@i{input} @i{string stream}, ++ ++provides an opportunity to perform operations on the @i{stream} ++ (returning zero or more @i{values}), ++and then closes the @i{string stream}. ++ ++@i{String} is evaluated first, and @i{var} is bound to ++a character @i{input} @i{string stream} that supplies ++@i{characters} from the subsequence of the resulting @i{string} @i{bounded} by ++@i{start} and @i{end}. ++The body is executed as an @i{implicit progn}. ++ ++The @i{input} @i{string stream} is automatically closed on exit from ++@b{with-input-from-string}, no matter whether the exit is normal or abnormal. ++ ++The @i{input} @i{string stream} to which the @i{variable} @i{var} ++is @i{bound} has @i{dynamic extent}; ++its @i{extent} ends when the @i{form} is exited. ++ ++The @i{index} is a pointer within the @i{string} to be advanced. ++If @b{with-input-from-string} ++is exited normally, then @i{index} will have ++as its @i{value} ++the index into the @i{string} indicating the first character not read ++which is @t{(length @i{string})} if all characters were used. ++The place specified by @i{index} ++is not updated as reading progresses, but only at the ++end of the operation. ++ ++@i{start} and @i{index} may both specify the same variable, ++which is a pointer within the @i{string} to be advanced, ++perhaps repeatedly by some containing loop. ++ ++The consequences are undefined if an attempt is made to @i{assign} ++the @i{variable} @i{var}. ++ ++@subsubheading Examples:: ++@example ++ (with-input-from-string (s "XXX1 2 3 4xxx" ++ :index ind ++ :start 3 :end 10) ++ (+ (read s) (read s) (read s))) @result{} 6 ++ ind @result{} 9 ++ (with-input-from-string (s "Animal Crackers" :index j :start 6) ++ (read s)) @result{} CRACKERS ++@end example ++ ++The variable @t{j} is set to @t{15}. ++ ++@subsubheading Side Effects:: ++ ++The @i{value} of the @i{place} named by @i{index}, if any, is modified. ++ ++@subsubheading See Also:: ++ ++@ref{make-string-input-stream} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node with-output-to-string, *debug-io*, with-input-from-string, Streams Dictionary ++@subsection with-output-to-string [Macro] ++ ++@code{with-output-to-string} @i{@r{(}var @r{&optional} string-form @r{&key} element-type@r{)} ++ @{@i{declaration}@}* ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{string-form}---a @i{form} or @b{nil}; ++ if @i{non-nil}, evaluated to produce @i{string}. ++ ++@i{string}---a @i{string} that has a @i{fill pointer}. ++ ++@i{element-type}---a @i{type specifier}; evaluated. ++ ++ The default is @b{character}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---If a @i{string-form} is not supplied or @b{nil}, ++ a @i{string}; otherwise, ++ the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{with-output-to-string} creates a ++ ++character @i{output} @i{stream}, performs a series of operations ++that may send results to this @i{stream}, and then closes the @i{stream}. ++ ++The @i{element-type} names the @i{type} of the elements ++of the @i{stream}; a @i{stream} is constructed of the most specialized ++@i{type} that can accommodate elements of the given @i{type}. ++ ++The body is executed as an @i{implicit progn} with @i{var} ++bound to an @i{output} @i{string stream}. ++All output to that @i{string stream} is saved in a @i{string}. ++ ++If @i{string} is supplied, @i{element-type} is ignored, ++and the output is incrementally appended to @i{string} as ++if by use of @b{vector-push-extend}. ++ ++The @i{output} @i{stream} ++is automatically closed on exit from @b{with-output-from-string}, ++no matter whether the exit is normal or abnormal. ++ ++The @i{output} @i{string stream} to which the @i{variable} @i{var} ++is @i{bound} has @i{dynamic extent}; ++its @i{extent} ends when the @i{form} is exited. ++ ++If no @i{string} is provided, then @b{with-output-from-string} ++ ++produces a @i{stream} that accepts characters and returns a @i{string} ++of the indicated @i{element-type}. ++ ++If @i{string} is provided, ++@b{with-output-to-string} returns the results of evaluating the last @i{form}. ++ ++The consequences are undefined if an attempt is made to @i{assign} ++the @i{variable} @i{var}. ++ ++@subsubheading Examples:: ++@example ++ (setq fstr (make-array '(0) :element-type 'base-char ++ :fill-pointer 0 :adjustable t)) @result{} "" ++ (with-output-to-string (s fstr) ++ (format s "here's some output") ++ (input-stream-p s)) @result{} @i{false} ++ fstr @result{} "here's some output" ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{string} is modified. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if destructive modifications are performed ++directly on the @i{string} during the @i{dynamic extent} of the call. ++ ++@subsubheading See Also:: ++ ++@ref{make-string-output-stream} ++, ++@b{vector-push-extend}, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@node *debug-io*, *terminal-io*, with-output-to-string, Streams Dictionary ++@subsection *debug-io*, *error-output*, *query-io*, ++@subheading *standard-input*, *standard-output*, ++@subheading *trace-output* ++@flushright ++@i{[Variable]} ++@end flushright ++ ++@subsubheading Value Type:: ++ ++For @b{*standard-input*}: ++ an @i{input} @i{stream} ++ ++For @b{*error-output*}, @b{*standard-output*}, and @b{*trace-output*}: ++ an @i{output} @i{stream}. ++ ++For @b{*debug-io*}, @b{*query-io*}: ++ a @i{bidirectional} @i{stream}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}, but ++it must be an @i{open} @i{stream} ++that is not a @i{generalized synonym stream} ++to an @i{I/O customization variables} ++but that might be a @i{generalized synonym stream} to ++the value of some @i{I/O customization variable}. ++The initial value might also be a @i{generalized synonym stream} ++to either the @i{symbol} @b{*terminal-io*} or to the @i{stream} ++that is its @i{value}. ++ ++@subsubheading Description:: ++ ++These @i{variables} are collectively called the ++@i{standardized} @i{I/O customization variables}. ++They can be @i{bound} or @i{assigned} in order to ++change the default destinations for input and/or output ++used by various @i{standardized} @i{operators} and facilities. ++ ++The @i{value} of @b{*debug-io*}, called @i{debug I/O}, ++is a @i{stream} to be used for interactive debugging purposes. ++ ++The @i{value} of @b{*error-output*}, called @i{error output}, ++is a @i{stream} to which warnings and non-interactive error messages should be sent. ++ ++The @i{value} of @b{*query-io*}, called @i{query I/O}, ++is a @i{bidirectional} @i{stream} ++to be used when asking questions of the user. The question should be output ++to this @i{stream}, and the answer read from it. ++ ++The @i{value} of @b{*standard-input*}, called @i{standard input}, ++is a @i{stream} that is used by many @i{operators} ++as a default source of input when no specific @i{input} @i{stream} ++is explicitly supplied. ++ ++The @i{value} of @b{*standard-output*}, called @i{standard output}, ++is a @i{stream} that is used by many @i{operators} ++as a default destination for output when no specific @i{output} @i{stream} ++is explicitly supplied. ++ ++The @i{value} of @b{*trace-output*}, called @i{trace output}, ++is the @i{stream} on which traced functions (see @b{trace}) ++and the @b{time} @i{macro} print their output. ++ ++@subsubheading Examples:: ++ ++@example ++ (with-output-to-string (*error-output*) ++ (warn "this string is sent to *error-output*")) ++ @result{} "Warning: this string is sent to *error-output* ++" ;The exact format of this string is @i{implementation-dependent}. ++ ++ (with-input-from-string (*standard-input* "1001") ++ (+ 990 (read))) @result{} 1991 ++ ++ (progn (setq out (with-output-to-string (*standard-output*) ++ (print "print and format t send things to") ++ (format t "*standard-output* now going to a string"))) ++ :done) ++@result{} :DONE ++ out ++@result{} " ++\"print and format t send things to\" *standard-output* now going to a string" ++ ++ (defun fact (n) (if (< n 2) 1 (* n (fact (- n 1))))) ++@result{} FACT ++ (trace fact) ++@result{} (FACT) ++;; Of course, the format of traced output is implementation-dependent. ++ (with-output-to-string (*trace-output*) ++ (fact 3)) ++@result{} " ++1 Enter FACT 3 ++| 2 Enter FACT 2 ++| 3 Enter FACT 1 ++| 3 Exit FACT 1 ++| 2 Exit FACT 2 ++1 Exit FACT 6" ++@end example ++ ++@subsubheading See Also:: ++ ++@b{*terminal-io*}, ++@b{synonym-stream}, ++@ref{Time} ++, ++@ref{trace} ++, ++@ref{Conditions}, ++@ref{Reader}, ++@ref{Printer} ++ ++@subsubheading Notes:: ++ ++The intent of the constraints on the initial @i{value} ++of the @i{I/O customization variables} is to ensure that it ++is always safe to @i{bind} or @i{assign} such a @i{variable} to ++the @i{value} of another @i{I/O customization variable}, without ++unduly restricting @i{implementation} flexibility. ++ ++It is common for an @i{implementation} to make ++the initial @i{values} of @b{*debug-io*} and @b{*query-io*} ++be the @i{same} @i{stream}, ++and to make ++the initial @i{values} of @b{*error-output*} and @b{*standard-output*} ++be the @i{same} @i{stream}. ++ ++The functions @b{y-or-n-p} and @b{yes-or-no-p} use @i{query I/O} ++for their input and output. ++ ++In the normal @i{Lisp read-eval-print loop}, ++input is read from @i{standard input}. ++Many input functions, including @b{read} and @b{read-char}, ++take a @i{stream} argument that defaults to @i{standard input}. ++ ++In the normal @i{Lisp read-eval-print loop}, output is sent to @i{standard output}. ++Many output functions, including @b{print} and @b{write-char}, ++take a @i{stream} argument that defaults to @i{standard output}. ++ ++A program that wants, for example, to divert output to a file should do so by ++@i{binding} @b{*standard-output*}; that way error messages sent to ++@b{*error-output*} can still get to the user by going through ++@b{*terminal-io*} (if @b{*error-output*} is bound to @b{*terminal-io*}), ++which is usually what is desired. ++ ++@node *terminal-io*, stream-error, *debug-io*, Streams Dictionary ++@subsection *terminal-io* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{bidirectional} @i{stream}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}, but ++it must be an @i{open} @i{stream} ++that is not a @i{generalized synonym stream} ++to an @i{I/O customization variables} ++but that might be a @i{generalized synonym stream} to ++the @i{value} of some @i{I/O customization variable}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*terminal-io*}, called @i{terminal I/O}, is ordinarily ++a @i{bidirectional} @i{stream} that connects to the user's console. ++Typically, writing to this @i{stream} ++would cause the output to appear ++on a display screen, for example, and reading from the @i{stream} would ++accept input from a keyboard. It is intended ++that standard input functions such as @b{read} and @b{read-char}, ++when used with this @i{stream}, cause echoing of the input ++into the output side of the @i{stream}. The means by which this is ++accomplished are @i{implementation-dependent}. ++ ++The effect of changing the @i{value} of @b{*terminal-io*}, ++either by @i{binding} or @i{assignment}, ++is @i{implementation-defined}. ++ ++@subsubheading Examples:: ++ ++@example ++ (progn (prin1 'foo) (prin1 'bar *terminal-io*)) ++@t{ |> } FOOBAR ++@result{} BAR ++ (with-output-to-string (*standard-output*) ++ (prin1 'foo) ++ (prin1 'bar *terminal-io*)) ++@t{ |> } BAR ++@result{} "FOO" ++@end example ++ ++@subsubheading See Also:: ++ ++@b{*debug-io*}, ++@b{*error-output*}, ++@b{*query-io*}, ++@b{*standard-input*}, ++@b{*standard-output*}, ++@b{*trace-output*} ++ ++@node stream-error, stream-error-stream, *terminal-io*, Streams Dictionary ++@subsection stream-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{stream-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{stream-error} ++consists of error conditions that are related to receiving input from ++or sending output to a @i{stream}. ++The ``offending stream'' is initialized by ++the @t{:stream} initialization argument to @b{make-condition}, ++and is @i{accessed} by the @i{function} @b{stream-error-stream}. ++ ++@subsubheading See Also:: ++ ++@ref{stream-error-stream} ++ ++@node stream-error-stream, end-of-file, stream-error, Streams Dictionary ++@subsection stream-error-stream [Function] ++ ++@code{stream-error-stream} @i{condition} @result{} @i{stream} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{stream-error}. ++ ++@i{stream}---a @i{stream}. ++ ++@subsubheading Description:: ++ ++Returns the offending @i{stream} of a @i{condition} of @i{type} @b{stream-error}. ++ ++@subsubheading Examples:: ++@example ++ (with-input-from-string (s "(FOO") ++ (handler-case (read s) ++ (end-of-file (c) ++ (format nil "~&End of file on ~S." (stream-error-stream c))))) ++"End of file on #." ++@end example ++ ++@subsubheading See Also:: ++ ++@b{stream-error}, ++@ref{Conditions} ++ ++@node end-of-file, , stream-error-stream, Streams Dictionary ++@subsection end-of-file [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{end-of-file}, ++@b{stream-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{end-of-file} consists of ++error conditions related to read operations that are done on ++@i{streams} that have no more data. ++ ++@subsubheading See Also:: ++ ++@ref{stream-error-stream} ++ ++@c end of including dict-streams ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-22.texi +@@ -0,0 +1,5297 @@ ++ ++ ++@node Printer, Reader, Streams, Top ++@chapter Printer ++ ++@menu ++* The Lisp Printer:: ++* The Lisp Pretty Printer:: ++* Formatted Output:: ++* Printer Dictionary:: ++@end menu ++ ++@node The Lisp Printer, The Lisp Pretty Printer, Printer, Printer ++@section The Lisp Printer ++ ++@c including concept-print ++ ++@menu ++* Overview of The Lisp Printer:: ++* Printer Dispatching:: ++* Default Print-Object Methods:: ++* Examples of Printer Behavior:: ++@end menu ++ ++@node Overview of The Lisp Printer, Printer Dispatching, The Lisp Printer, The Lisp Printer ++@subsection Overview of The Lisp Printer ++ ++@r{Common Lisp} provides a representation of most @i{objects} in the form ++of printed text called the printed representation. ++Functions such as @b{print} take an @i{object} ++and send the characters of its printed representation to a @i{stream}. ++The collection of routines that does this is known as the (@r{Common Lisp}) printer. ++ ++Reading a printed representation ++typically ++produces an @i{object} that is @b{equal} to the ++originally printed @i{object}. ++ ++@menu ++* Multiple Possible Textual Representations:: ++* Printer Escaping:: ++@end menu ++ ++@node Multiple Possible Textual Representations, Printer Escaping, Overview of The Lisp Printer, Overview of The Lisp Printer ++@subsubsection Multiple Possible Textual Representations ++ ++Most @i{objects} have more than one possible textual representation. ++For example, the positive @i{integer} with a magnitude of twenty-seven ++can be textually expressed in any of these ways: ++ ++@example ++ 27 27. #o33 #x1B #b11011 #.(* 3 3 3) 81/3 ++@end example ++ ++A list containing the two symbols @t{A} and @t{B} can also be textually ++expressed in a variety of ways: ++ ++@example ++ (A B) (a b) ( a b ) (\A |B|) ++(|\A| ++ B ++) ++@end example ++ ++In general, ++ ++from the point of view of the @i{Lisp reader}, ++ ++wherever @i{whitespace} is permissible in a textual representation, ++any number of @i{spaces} and @i{newlines} can appear in @i{standard syntax}. ++ ++When a function such as @b{print} produces a printed representation, ++it must choose ++from among many possible textual representations. ++In most cases, it chooses a ++program readable representation, ++but in certain cases it might use a more compact notation that is not ++program-readable. ++ ++A number of option variables, called ++@i{printer control variables} ++@IGindex printer control variable ++, ++are provided to permit control of individual aspects of the ++printed representation of @i{objects}. ++Figure 22--1 shows the @i{standardized} @i{printer control variables}; ++there might also be @i{implementation-defined} @i{printer control variables}. ++ ++@format ++@group ++@noindent ++@w{ *print-array* *print-gensym* *print-pprint-dispatch* } ++@w{ *print-base* *print-length* *print-pretty* } ++@w{ *print-case* *print-level* *print-radix* } ++@w{ *print-circle* *print-lines* *print-readably* } ++@w{ *print-escape* *print-miser-width* *print-right-margin* } ++ ++@noindent ++@w{ Figure 22--1: Standardized Printer Control Variables } ++ ++@end group ++@end format ++ ++In addition to the @i{printer control variables}, ++the following additional @i{defined names} ++relate to or affect the behavior of the @i{Lisp printer}: ++ ++@format ++@group ++@noindent ++@w{ *package* *read-eval* readtable-case } ++@w{ *read-default-float-format* *readtable* } ++ ++@noindent ++@w{ Figure 22--2: Additional Influences on the Lisp printer. } ++ ++@end group ++@end format ++ ++@node Printer Escaping, , Multiple Possible Textual Representations, Overview of The Lisp Printer ++@subsubsection Printer Escaping ++ ++The @i{variable} @b{*print-escape*} controls whether the @i{Lisp printer} ++tries to produce notations such as escape characters and package prefixes. ++ ++The @i{variable} @b{*print-readably*} can be used to override ++many of the individual aspects controlled by the other ++@i{printer control variables} when program-readable output ++is especially important. ++ ++One of the many effects of making the @i{value} of @b{*print-readably*} be @i{true} ++is that the @i{Lisp printer} behaves as if @b{*print-escape*} were also @i{true}. ++For notational convenience, we say that ++if the value of either @b{*print-readably*} or @b{*print-escape*} is @i{true}, ++then @i{printer escaping} ++@IGindex printer escaping ++ is ``enabled''; ++and we say that ++if the values of both @b{*print-readably*} and @b{*print-escape*} are @i{false}, ++then @i{printer escaping} is ``disabled''. ++ ++@node Printer Dispatching, Default Print-Object Methods, Overview of The Lisp Printer, The Lisp Printer ++@subsection Printer Dispatching ++ ++The @i{Lisp printer} makes its determination of how to print an ++@i{object} as follows: ++ ++If the @i{value} of @b{*print-pretty*} is @i{true}, ++printing is controlled by the @i{current pprint dispatch table}; ++see @ref{Pretty Print Dispatch Tables}. ++ ++Otherwise (if the @i{value} of @b{*print-pretty*} is @i{false}), ++the object's @b{print-object} method is used; ++see @ref{Default Print-Object Methods}. ++ ++@node Default Print-Object Methods, Examples of Printer Behavior, Printer Dispatching, The Lisp Printer ++@subsection Default Print-Object Methods ++ ++This section describes the default behavior of ++@b{print-object} methods for the @i{standardized} @i{types}. ++ ++@menu ++* Printing Numbers:: ++* Printing Integers:: ++* Printing Ratios:: ++* Printing Floats:: ++* Printing Complexes:: ++* Note about Printing Numbers:: ++* Printing Characters:: ++* Printing Symbols:: ++* Package Prefixes for Symbols:: ++* Effect of Readtable Case on the Lisp Printer:: ++* Examples of Effect of Readtable Case on the Lisp Printer:: ++* Printing Strings:: ++* Printing Lists and Conses:: ++* Printing Bit Vectors:: ++* Printing Other Vectors:: ++* Printing Other Arrays:: ++* Examples of Printing Arrays:: ++* Printing Random States:: ++* Printing Pathnames:: ++* Printing Structures:: ++* Printing Other Objects:: ++@end menu ++ ++@node Printing Numbers, Printing Integers, Default Print-Object Methods, Default Print-Object Methods ++@subsubsection Printing Numbers ++ ++@node Printing Integers, Printing Ratios, Printing Numbers, Default Print-Object Methods ++@subsubsection Printing Integers ++ ++@i{Integers} are printed in the radix specified by the @i{current output base} ++in positional notation, most significant digit first. ++If appropriate, a radix specifier can be printed; see @b{*print-radix*}. ++If an @i{integer} is negative, a minus sign is printed and then the ++absolute value of the @i{integer} is printed. ++The @i{integer} zero is represented ++by the single digit @t{0} and never has a sign. ++A decimal point might be printed, ++depending on the @i{value} of @b{*print-radix*}. ++ ++For related information about the syntax of an @i{integer}, ++see @ref{Syntax of an Integer}. ++ ++@node Printing Ratios, Printing Floats, Printing Integers, Default Print-Object Methods ++@subsubsection Printing Ratios ++ ++@IRindex ratio ++ ++@i{Ratios} are printed as follows: ++the absolute value of the numerator is printed, as for an @i{integer}; ++then a @t{/}; then the denominator. The numerator and denominator are ++both printed in the radix specified by the @i{current output base}; ++they are obtained as if by ++@b{numerator} and @b{denominator}, and so @i{ratios} ++are printed in reduced form (lowest terms). ++If appropriate, a radix specifier can be printed; see ++@b{*print-radix*}. ++If the ratio is negative, a minus sign is printed before the numerator. ++ ++For related information about the syntax of a @i{ratio}, ++see @ref{Syntax of a Ratio}. ++ ++@node Printing Floats, Printing Complexes, Printing Ratios, Default Print-Object Methods ++@subsubsection Printing Floats ++ ++@IRindex float ++ ++If the magnitude of the @i{float} is either zero or between 10^@r{-3} (inclusive) ++and 10^7 (exclusive), it is printed as the integer part of the number, ++then a decimal point, ++followed by the fractional part of the number; ++there is always at least one ++digit on each side of the decimal point. ++If the sign of the number ++(as determined by @b{float-sign}) ++is negative, then a minus sign is printed before the number. ++If the format of the number ++does not match that specified by ++@b{*read-default-float-format*}, then the @i{exponent marker} for ++that format and the digit @t{0} are also printed. ++For example, the base of the natural logarithms as a @i{short float} ++might be printed as @t{2.71828S0}. ++ ++For non-zero magnitudes outside of the range 10^@r{-3} to 10^7, ++a @i{float} is printed in computerized scientific notation. ++The representation of the number is scaled to be between ++1 (inclusive) and 10 (exclusive) and then printed, with one digit ++before the decimal point and at least one digit after the decimal point. ++Next the @i{exponent marker} for the format is printed, ++except that ++if the format of the number matches that specified by ++@b{*read-default-float-format*}, then the @i{exponent marker} @t{E} ++is used. ++Finally, the power of ten by which the fraction must be multiplied ++to equal the original number is printed as a decimal integer. ++For example, Avogadro's number as a @i{short float} ++is printed as @t{6.02S23}. ++ ++For related information about the syntax of a @i{float}, ++see @ref{Syntax of a Float}. ++ ++@node Printing Complexes, Note about Printing Numbers, Printing Floats, Default Print-Object Methods ++@subsubsection Printing Complexes ++ ++@IRindex complex ++ ++A @i{complex} is printed as @t{#C}, an open parenthesis, ++the printed representation of its real part, a space, ++the printed representation of its imaginary part, and finally ++a close parenthesis. ++ ++For related information about the syntax of a @i{complex}, ++see @ref{Syntax of a Complex} and @ref{Sharpsign C}. ++ ++@node Note about Printing Numbers, Printing Characters, Printing Complexes, Default Print-Object Methods ++@subsubsection Note about Printing Numbers ++ ++The printed representation of a number must not contain @i{escape} @i{characters}; ++see @ref{Escape Characters and Potential Numbers}. ++ ++@node Printing Characters, Printing Symbols, Note about Printing Numbers, Default Print-Object Methods ++@subsubsection Printing Characters ++ ++When @i{printer escaping} is disabled, ++ ++a @i{character} prints as itself; ++it is sent directly to the output @i{stream}. ++ ++When @i{printer escaping} is enabled, ++ ++then @t{#\} syntax is used. ++ ++When the printer types out the name of a @i{character}, ++it uses the same table as the @t{#\} @i{reader macro} would use; ++therefore any @i{character} name that is typed out ++is acceptable as input (in that @i{implementation}). ++If a @i{non-graphic} @i{character} has a @i{standardized} @i{name}_5, ++that @i{name} is preferred over non-standard @i{names} ++for printing in @t{#\} notation. ++For the @i{graphic} @i{standard characters}, ++the @i{character} itself is always used ++for printing in @t{#\} notation---even if ++the @i{character} also has a @i{name}_5. ++ ++For details about the @t{#\} @i{reader macro}, see @ref{Sharpsign Backslash}. ++ ++@node Printing Symbols, Package Prefixes for Symbols, Printing Characters, Default Print-Object Methods ++@subsubsection Printing Symbols ++ ++When @i{printer escaping} is disabled, ++ ++only the characters of the @i{symbol}'s @i{name} are output ++ ++(but the case in which to print characters in the @i{name} is ++controlled by @b{*print-case*}; ++see @ref{Effect of Readtable Case on the Lisp Printer}). ++ ++The remainder of this section applies only ++ ++when @i{printer escaping} is enabled. ++ ++When printing a @i{symbol}, the printer inserts enough ++@i{single escape} and/or @i{multiple escape} ++characters (@i{backslashes} and/or @i{vertical-bars}) so that if ++@b{read} were called with the same @b{*readtable*} and ++with @b{*read-base*} bound to the @i{current output base}, it ++would return the same @i{symbol} (if it is not ++@i{apparently uninterned}) or an @i{uninterned} @i{symbol} ++with the same @i{print name} (otherwise). ++ ++For example, if the @i{value} of @b{*print-base*} were @t{16} ++when printing the symbol @t{face}, it would have to be printed as ++@t{\FACE} or @t{\Face} or @t{|FACE|}, ++because the token @t{face} would be read as a hexadecimal ++number (decimal value 64206) if the @i{value} of @b{*read-base*} were @t{16}. ++ ++For additional restrictions concerning characters with nonstandard ++@i{syntax types} in the @i{current readtable}, see the @i{variable} @b{*print-readably*} ++ ++For information about how the @i{Lisp reader} parses @i{symbols}, ++see @ref{Symbols as Tokens} and @ref{Sharpsign Colon}. ++ ++@b{nil} might be printed as @t{()} ++ ++when @b{*print-pretty*} is @i{true} ++and @i{printer escaping} is enabled. ++ ++@node Package Prefixes for Symbols, Effect of Readtable Case on the Lisp Printer, Printing Symbols, Default Print-Object Methods ++@subsubsection Package Prefixes for Symbols ++ ++@i{Package prefixes} are printed if necessary. ++The rules for @i{package prefixes} are as follows. ++When the @i{symbol} is printed, if it is in the @t{KEYWORD} @i{package}, ++then it is printed with a preceding @i{colon}; otherwise, if ++it is @i{accessible} in the @i{current package}, it is printed without any ++@i{package prefix}; otherwise, it is printed with a @i{package prefix}. ++ ++A @i{symbol} that is @i{apparently uninterned} is printed ++preceded by ``@t{#:}'' ++ ++if @b{*print-gensym*} is @i{true} and @i{printer escaping} is enabled; ++if @b{*print-gensym*} is @i{false} or @i{printer escaping} is disabled, ++ ++then the @i{symbol} is printed without a prefix, ++as if it were in the @i{current package}. ++ ++Because the @t{#:} syntax does not intern the ++following symbol, it is necessary to use circular-list syntax ++if @b{*print-circle*} is @i{true} and ++the same uninterned symbol appears several times in an expression ++to be printed. For example, the result of ++ ++@example ++ (let ((x (make-symbol "FOO"))) (list x x)) ++@end example ++ ++would be printed as @t{(#:foo #:foo)} if @b{*print-circle*} ++were @i{false}, but as @t{(#1=#:foo #1#)} if @b{*print-circle*} ++were @i{true}. ++ ++A summary of the preceding package prefix rules follows: ++ ++@table @asis ++ ++@item @t{foo:bar} ++@t{foo:bar} is printed when @i{symbol} @t{bar} ++is external in its @i{home package} @t{foo} ++and is not @i{accessible} in the @i{current package}. ++ ++@item @t{foo::bar} ++@t{foo::bar} is printed when @t{bar} is internal in its @i{home package} ++@t{foo} and is not @i{accessible} in the @i{current package}. ++ ++@item @t{:bar} ++@t{:bar} is printed when the home package of @t{bar} is the @t{KEYWORD} @i{package}. ++ ++@item #:bar ++@t{#:bar} is printed when @t{bar} is @i{apparently uninterned}, ++even in the pathological case that @t{bar} ++has no @i{home package} but is nevertheless somehow @i{accessible} ++in the @i{current package}. ++@end table ++ ++@node Effect of Readtable Case on the Lisp Printer, Examples of Effect of Readtable Case on the Lisp Printer, Package Prefixes for Symbols, Default Print-Object Methods ++@subsubsection Effect of Readtable Case on the Lisp Printer ++ ++When ++@i{printer escaping} is disabled, ++or the characters under consideration are not already ++quoted specifically by @i{single escape} or @i{multiple escape} ++syntax, ++ ++the @i{readtable case} of the @i{current readtable} ++affects the way the @i{Lisp printer} writes @i{symbols} ++in the following ways: ++ ++@table @asis ++ ++@item @t{:upcase} ++When the @i{readtable case} is @t{:upcase}, ++ @i{uppercase} @i{characters} ++ are printed in the case specified by @b{*print-case*}, and ++ @i{lowercase} @i{characters} are printed in their own case. ++ ++@item @t{:downcase} ++When the @i{readtable case} is @t{:downcase}, ++ @i{uppercase} @i{characters} are printed in their own case, and ++ @i{lowercase} @i{characters} ++ are printed in the case specified by @b{*print-case*}. ++ ++@item @t{:preserve} ++When the @i{readtable case} is @t{:preserve}, ++ all @i{alphabetic} @i{characters} are printed in their own case. ++ ++@item @t{:invert} ++When the @i{readtable case} is @t{:invert}, ++ the case of all @i{alphabetic} @i{characters} ++ in single case symbol names is inverted. ++ Mixed-case symbol names are printed as is. ++@end table ++ ++The rules for escaping @i{alphabetic} @i{characters} in symbol names are affected by ++the @b{readtable-case} ++ ++if @i{printer escaping} is enabled. ++ ++@i{Alphabetic} @i{characters} are escaped as follows: ++@table @asis ++ ++@item @t{:upcase} ++When the @i{readtable case} is @t{:upcase}, ++all @i{lowercase} @i{characters} must be escaped. ++ ++@item @t{:downcase} ++When the @i{readtable case} is @t{:downcase}, ++all @i{uppercase} @i{characters} must be escaped. ++ ++@item @t{:preserve} ++When the @i{readtable case} is @t{:preserve}, ++no @i{alphabetic} @i{characters} need be escaped. ++ ++@item @t{:invert} ++When the @i{readtable case} is @t{:invert}, ++no @i{alphabetic} @i{characters} need be escaped. ++ ++@end table ++ ++@node Examples of Effect of Readtable Case on the Lisp Printer, Printing Strings, Effect of Readtable Case on the Lisp Printer, Default Print-Object Methods ++@subsubsection Examples of Effect of Readtable Case on the Lisp Printer ++ ++@example ++ (defun test-readtable-case-printing () ++ (let ((*readtable* (copy-readtable nil)) ++ (*print-case* *print-case*)) ++ (format t "READTABLE-CASE *PRINT-CASE* Symbol-name Output~ ++ ~ ++ ~ ++ (dolist (readtable-case '(:upcase :downcase :preserve :invert)) ++ (setf (readtable-case *readtable*) readtable-case) ++ (dolist (print-case '(:upcase :downcase :capitalize)) ++ (dolist (symbol '(|ZEBRA| |Zebra| |zebra|)) ++ (setq *print-case* print-case) ++ (format t "~&:~A~15T:~A~29T~A~42T~A" ++ (string-upcase readtable-case) ++ (string-upcase print-case) ++ (symbol-name symbol) ++ (prin1-to-string symbol))))))) ++@end example ++ ++ The output from @t{(test-readtable-case-printing)} should be as follows: ++ ++@example ++ READTABLE-CASE *PRINT-CASE* Symbol-name Output ++ -------------------------------------------------- ++ :UPCASE :UPCASE ZEBRA ZEBRA ++ :UPCASE :UPCASE Zebra |Zebra| ++ :UPCASE :UPCASE zebra |zebra| ++ :UPCASE :DOWNCASE ZEBRA zebra ++ :UPCASE :DOWNCASE Zebra |Zebra| ++ :UPCASE :DOWNCASE zebra |zebra| ++ :UPCASE :CAPITALIZE ZEBRA Zebra ++ :UPCASE :CAPITALIZE Zebra |Zebra| ++ :UPCASE :CAPITALIZE zebra |zebra| ++ :DOWNCASE :UPCASE ZEBRA |ZEBRA| ++ :DOWNCASE :UPCASE Zebra |Zebra| ++ :DOWNCASE :UPCASE zebra ZEBRA ++ :DOWNCASE :DOWNCASE ZEBRA |ZEBRA| ++ :DOWNCASE :DOWNCASE Zebra |Zebra| ++ :DOWNCASE :DOWNCASE zebra zebra ++ :DOWNCASE :CAPITALIZE ZEBRA |ZEBRA| ++ :DOWNCASE :CAPITALIZE Zebra |Zebra| ++ :DOWNCASE :CAPITALIZE zebra Zebra ++ :PRESERVE :UPCASE ZEBRA ZEBRA ++ :PRESERVE :UPCASE Zebra Zebra ++ :PRESERVE :UPCASE zebra zebra ++ :PRESERVE :DOWNCASE ZEBRA ZEBRA ++ :PRESERVE :DOWNCASE Zebra Zebra ++ :PRESERVE :DOWNCASE zebra zebra ++ :PRESERVE :CAPITALIZE ZEBRA ZEBRA ++ :PRESERVE :CAPITALIZE Zebra Zebra ++ :PRESERVE :CAPITALIZE zebra zebra ++ :INVERT :UPCASE ZEBRA zebra ++ :INVERT :UPCASE Zebra Zebra ++ :INVERT :UPCASE zebra ZEBRA ++ :INVERT :DOWNCASE ZEBRA zebra ++ :INVERT :DOWNCASE Zebra Zebra ++ :INVERT :DOWNCASE zebra ZEBRA ++ :INVERT :CAPITALIZE ZEBRA zebra ++ :INVERT :CAPITALIZE Zebra Zebra ++ :INVERT :CAPITALIZE zebra ZEBRA ++@end example ++ ++@node Printing Strings, Printing Lists and Conses, Examples of Effect of Readtable Case on the Lisp Printer, Default Print-Object Methods ++@subsubsection Printing Strings ++ ++The characters of the @i{string} are output in order. ++ ++If @i{printer escaping} is enabled, ++ ++a @i{double-quote} is output before and after, and all ++@i{double-quotes} and @i{single escapes} are preceded by @i{backslash}. ++The printing of @i{strings} is not affected by @b{*print-array*}. ++Only the @i{active} @i{elements} of the @i{string} are printed. ++ ++For information on how the @i{Lisp reader} parses @i{strings}, ++see @ref{Double-Quote}. ++ ++@node Printing Lists and Conses, Printing Bit Vectors, Printing Strings, Default Print-Object Methods ++@subsubsection Printing Lists and Conses ++ ++Wherever possible, list notation is preferred over dot notation. ++Therefore the following algorithm is used to print a @i{cons} x: ++ ++@table @asis ++ ++@item 1. ++A @i{left-parenthesis} is printed. ++ ++@item 2. ++The @i{car} of x is printed. ++ ++@item 3. ++If the @i{cdr} of x is itself a @i{cons}, ++ it is made to be the current @i{cons} ++ (@i{i.e.}, x becomes that @i{cons}), ++ ++ a @i{space} ++ ++ is printed, ++ and step 2 is re-entered. ++ ++@item 4. ++If the @i{cdr} of x is not @i{null}, ++ ++ a @i{space}, ++ ++ a @i{dot}, ++ ++ a @i{space}, ++ ++ and the @i{cdr} of x are printed. ++ ++@item 5. ++A @i{right-parenthesis} is printed. ++@end table ++ ++Actually, the above algorithm is only used when @b{*print-pretty*} ++is @i{false}. When @b{*print-pretty*} is @i{true} (or ++when @b{pprint} is used), ++additional @i{whitespace}_1 ++may replace the use of a single @i{space}, ++and a more elaborate algorithm with similar goals but more presentational ++flexibility is used; see @ref{Printer Dispatching}. ++ ++Although the two expressions below are equivalent, ++and the reader accepts ++either one and ++produces ++the same @i{cons}, the printer ++always prints such a @i{cons} in the second form. ++ ++@example ++ (a . (b . ((c . (d . nil)) . (e . nil)))) ++ (a b (c d) e) ++@end example ++ ++The printing of @i{conses} is affected by @b{*print-level*}, ++@b{*print-length*}, and @b{*print-circle*}. ++ ++Following are examples of printed representations of @i{lists}: ++ ++@example ++ (a . b) ;A dotted pair of a and b ++ (a.b) ;A list of one element, the symbol named a.b ++ (a. b) ;A list of two elements a. and b ++ (a .b) ;A list of two elements a and .b ++ (a b . c) ;A dotted list of a and b with c at the end; two conses ++ .iot ;The symbol whose name is .iot ++ (. b) ;Invalid -- an error is signaled if an attempt is made to read ++ ;this syntax. ++ (a .) ;Invalid -- an error is signaled. ++ (a .. b) ;Invalid -- an error is signaled. ++ (a . . b) ;Invalid -- an error is signaled. ++ (a b c ...) ;Invalid -- an error is signaled. ++ (a \. b) ;A list of three elements a, ., and b ++ (a |.| b) ;A list of three elements a, ., and b ++ (a \... b) ;A list of three elements a, ..., and b ++ (a |...| b) ;A list of three elements a, ..., and b ++@end example ++ ++For information on how the @i{Lisp reader} parses @i{lists} and @i{conses}, ++see @ref{Left-Parenthesis}. ++ ++@node Printing Bit Vectors, Printing Other Vectors, Printing Lists and Conses, Default Print-Object Methods ++@subsubsection Printing Bit Vectors ++ ++A @i{bit vector} is printed as @t{#*} followed by the bits of the @i{bit vector} ++in order. If @b{*print-array*} is @i{false}, then the @i{bit vector} is ++printed in a format (using @t{#<}) that is concise but not readable. ++Only the @i{active} @i{elements} of the @i{bit vector} are printed. ++ ++[Reviewer Note by Barrett: Need to provide for @t{#5*0} as an alternate ++ notation for @t{#*00000}.] ++ ++For information on @i{Lisp reader} parsing of @i{bit vectors}, ++see @ref{Sharpsign Asterisk}. ++ ++@node Printing Other Vectors, Printing Other Arrays, Printing Bit Vectors, Default Print-Object Methods ++@subsubsection Printing Other Vectors ++ ++If @b{*print-array*} is @i{true} ++and @b{*print-readably*} is @i{false}, ++any ++ ++@i{vector} ++other than a @i{string} or @i{bit vector} is printed using ++general-vector syntax; this means that information ++about specialized vector representations does not appear. ++The printed representation of a zero-length @i{vector} is @t{#()}. ++The printed representation of a non-zero-length @i{vector} begins with @t{#(}. ++Following that, the first element of the @i{vector} is printed. ++ ++If there are any other elements, they are printed in turn, with ++each such additional element preceded by ++a @i{space} if @b{*print-pretty*} is @i{false}, ++or @i{whitespace}_1 if @b{*print-pretty*} is @i{true}. ++ ++A @i{right-parenthesis} after the last element ++terminates the printed representation of the @i{vector}. ++The printing of @i{vectors} ++is affected by @b{*print-level*} and @b{*print-length*}. ++If the @i{vector} has a @i{fill pointer}, ++then only those elements below ++the @i{fill pointer} are printed. ++ ++If both @b{*print-array*} and @b{*print-readably*} are @i{false}, ++ ++the @i{vector} is not printed as described above, ++but in a format (using @t{#<}) that is concise but not readable. ++ ++If @b{*print-readably*} is @i{true}, ++the @i{vector} prints in an @i{implementation-defined} manner; ++see the @i{variable} @b{*print-readably*}. ++ ++For information on how the @i{Lisp reader} parses these ``other @i{vectors},'' ++see @ref{Sharpsign Left-Parenthesis}. ++ ++@node Printing Other Arrays, Examples of Printing Arrays, Printing Other Vectors, Default Print-Object Methods ++@subsubsection Printing Other Arrays ++ ++If @b{*print-array*} is @i{true} ++and @b{*print-readably*} is @i{false}, ++any ++ ++@i{array} other than a @i{vector} is printed ++using @t{#}@t{n}@t{A} format. ++Let @t{n} be the @i{rank} of the @i{array}. ++Then @t{#} is printed, then @t{n} as a decimal integer, ++then @t{A}, then @t{n} open parentheses. ++Next the @i{elements} are scanned in row-major order, ++using @b{write} on each @i{element}, ++and separating @i{elements} from each other with @i{whitespace}_1. ++The array's dimensions are numbered 0 to @t{n}-1 from left to right, ++and are enumerated with the rightmost index changing fastest. ++Every time the index for dimension @t{j} is incremented, ++the following actions are taken: ++ ++@table @asis ++ ++@item @t{*} ++If @t{j} < @t{n}-1, then a close parenthesis is printed. ++ ++@item @t{*} ++If incrementing the index for dimension @t{j} caused it to equal ++dimension @t{j}, that index is reset to zero and the ++index for dimension @t{j}-1 is incremented (thereby performing these three steps recursively), ++unless @t{j}=0, in which case the entire algorithm is terminated. ++If incrementing the index for dimension @t{j} did not cause it to ++equal dimension @t{j}, then a space is printed. ++ ++@item @t{*} ++If @t{j} < @t{n}-1, then an open parenthesis is printed. ++@end table ++ ++This causes the contents to be printed in a format suitable for ++@t{:initial-contents} to @b{make-array}. ++The lists effectively printed by this procedure are subject to ++truncation by @b{*print-level*} and @b{*print-length*}. ++ ++If the @i{array} ++is of a specialized @i{type}, containing bits or characters, ++then the innermost lists generated by the algorithm given above can instead ++be printed using bit-vector or string syntax, provided that these innermost ++lists would not be subject to truncation by @b{*print-length*}. ++ ++If both @b{*print-array*} and @b{*print-readably*} are @i{false}, ++ ++then the @i{array} is printed ++in a format (using @t{#<}) that is concise but not readable. ++ ++If @b{*print-readably*} is @i{true}, ++the @i{array} prints in an @i{implementation-defined} manner; ++see the @i{variable} @b{*print-readably*}. ++ ++In particular, ++this may be important for arrays having some dimension @t{0}. ++ ++For information on how the @i{Lisp reader} parses these ``other @i{arrays},'' ++see @ref{Sharpsign A}. ++ ++@node Examples of Printing Arrays, Printing Random States, Printing Other Arrays, Default Print-Object Methods ++@subsubsection Examples of Printing Arrays ++ ++@example ++ (let ((a (make-array '(3 3))) ++ (*print-pretty* t) ++ (*print-array* t)) ++ (dotimes (i 3) (dotimes (j 3) (setf (aref a i j) (format nil "<~D,~D>" i j)))) ++ (print a) ++ (print (make-array 9 :displaced-to a))) ++@t{ |> } #2A(("<0,0>" "<0,1>" "<0,2>") ++@t{ |> } ("<1,0>" "<1,1>" "<1,2>") ++@t{ |> } ("<2,0>" "<2,1>" "<2,2>")) ++@t{ |> } #("<0,0>" "<0,1>" "<0,2>" "<1,0>" "<1,1>" "<1,2>" "<2,0>" "<2,1>" "<2,2>") ++@result{} # ++@end example ++ ++@node Printing Random States, Printing Pathnames, Examples of Printing Arrays, Default Print-Object Methods ++@subsubsection Printing Random States ++ ++A specific syntax for printing @i{objects} of @i{type} @b{random-state} is ++not specified. However, every @i{implementation} ++must arrange to print a @i{random state} @i{object} in such a way that, ++within the same implementation, @b{read} ++can construct from the printed representation a copy of the ++@i{random state} ++object as if the copy had been made by @b{make-random-state}. ++ ++If the type @i{random state} is effectively implemented ++by using the machinery for @b{defstruct}, ++the usual structure syntax can then be used for printing ++@i{random state} ++objects; one might look something like ++ ++@example ++ #S(RANDOM-STATE :DATA #(14 49 98436589 786345 8734658324 ... )) ++@end example ++ ++where the components are @i{implementation-dependent}. ++ ++@node Printing Pathnames, Printing Structures, Printing Random States, Default Print-Object Methods ++@subsubsection Printing Pathnames ++ ++When @i{printer escaping} is enabled, ++ ++the syntax @t{#P"..."} is how a ++@i{pathname} is printed by @b{write} and the other functions herein described. ++The @t{"..."} is the namestring representation of the pathname. ++ ++When @i{printer escaping} is disabled, ++ ++@b{write} writes a @i{pathname} @i{P} ++by writing @t{(namestring @i{P})} instead. ++ ++For information on how the @i{Lisp reader} parses @i{pathnames}, ++see @ref{Sharpsign P}. ++ ++@node Printing Structures, Printing Other Objects, Printing Pathnames, Default Print-Object Methods ++@subsubsection Printing Structures ++ ++By default, a @i{structure} of type S is printed using @t{#S} syntax. ++This behavior can be customized by specifying a @t{:print-function} ++or @t{:print-object} option to the @b{defstruct} @i{form} that defines S, ++or by writing a @b{print-object} @i{method} ++that is @i{specialized} for @i{objects} of type S. ++ ++Different structures might print out in different ways; ++the default notation for structures is: ++ ++@example ++ #S(@i{structure-name} @{@i{slot-key} @i{slot-value}@}*) ++@end example ++ ++where @t{#S} indicates structure syntax, ++@i{structure-name} is a @i{structure name}, ++each @i{slot-key} is an initialization argument @i{name} ++for a @i{slot} in the @i{structure}, ++and each corresponding @i{slot-value} is a representation ++of the @i{object} in that @i{slot}. ++ ++For information on how the @i{Lisp reader} parses @i{structures}, ++see @ref{Sharpsign S}. ++ ++@node Printing Other Objects, , Printing Structures, Default Print-Object Methods ++@subsubsection Printing Other Objects ++ ++Other @i{objects} are printed in an @i{implementation-dependent} manner. ++It is not required that an @i{implementation} print those @i{objects} ++@i{readably}. ++ ++For example, @i{hash tables}, ++ @i{readtables}, ++ @i{packages}, ++ @i{streams}, ++ and @i{functions} ++might not print @i{readably}. ++ ++A common notation to use in this circumstance is @t{#<...>}. ++Since @t{#<} is not readable by the @i{Lisp reader}, ++the precise format of the text which follows is not important, ++but a common format to use is that provided by the @b{print-unreadable-object} @i{macro}. ++ ++For information on how the @i{Lisp reader} treats this notation, ++see @ref{Sharpsign Less-Than-Sign}. ++For information on how to notate @i{objects} that cannot be printed @i{readably}, ++see @ref{Sharpsign Dot}. ++ ++@node Examples of Printer Behavior, , Default Print-Object Methods, The Lisp Printer ++@subsection Examples of Printer Behavior ++ ++@example ++ (let ((*print-escape* t)) (fresh-line) (write #\a)) ++@t{ |> } #\a ++@result{} #\a ++ (let ((*print-escape* nil) (*print-readably* nil)) ++ (fresh-line) ++ (write #\a)) ++@t{ |> } a ++@result{} #\a ++ (progn (fresh-line) (prin1 #\a)) ++@t{ |> } #\a ++@result{} #\a ++ (progn (fresh-line) (print #\a)) ++@t{ |> } ++@t{ |> } #\a ++@result{} #\a ++ (progn (fresh-line) (princ #\a)) ++@t{ |> } a ++@result{} #\a ++ ++ (dolist (val '(t nil)) ++ (let ((*print-escape* val) (*print-readably* val)) ++ (print '#\a) ++ (prin1 #\a) (write-char #\Space) ++ (princ #\a) (write-char #\Space) ++ (write #\a))) ++@t{ |> } #\a #\a a #\a ++@t{ |> } #\a #\a a a ++@result{} NIL ++ ++ (progn (fresh-line) (write '(let ((a 1) (b 2)) (+ a b)))) ++@t{ |> } (LET ((A 1) (B 2)) (+ A B)) ++@result{} (LET ((A 1) (B 2)) (+ A B)) ++ ++ (progn (fresh-line) (pprint '(let ((a 1) (b 2)) (+ a b)))) ++@t{ |> } (LET ((A 1) ++@t{ |> } (B 2)) ++@t{ |> } (+ A B)) ++@result{} (LET ((A 1) (B 2)) (+ A B)) ++ ++ (progn (fresh-line) ++ (write '(let ((a 1) (b 2)) (+ a b)) :pretty t)) ++@t{ |> } (LET ((A 1) ++@t{ |> } (B 2)) ++@t{ |> } (+ A B)) ++@result{} (LET ((A 1) (B 2)) (+ A B)) ++ ++ (with-output-to-string (s) ++ (write 'write :stream s) ++ (prin1 'prin1 s)) ++@result{} "WRITEPRIN1" ++@end example ++ ++@c end of including concept-print ++ ++@node The Lisp Pretty Printer, Formatted Output, The Lisp Printer, Printer ++@section The Lisp Pretty Printer ++ ++@c including concept-pprint ++ ++@menu ++* Pretty Printer Concepts:: ++* Examples of using the Pretty Printer:: ++* Notes about the Pretty Printer`s Background:: ++@end menu ++ ++@node Pretty Printer Concepts, Examples of using the Pretty Printer, The Lisp Pretty Printer, The Lisp Pretty Printer ++@subsection Pretty Printer Concepts ++ ++The facilities provided by the @i{pretty printer} ++@IGindex pretty printer ++ permit ++@i{programs} to redefine the way in which @i{code} is displayed, ++and allow the full power of @i{pretty printing} to be applied ++to complex combinations of data structures. ++ ++Whether any given style of output is in fact ``pretty'' is inherently a ++somewhat subjective issue. However, since the effect of the ++@i{pretty printer} can be customized by @i{conforming programs}, ++the necessary flexibility is provided for individual @i{programs} ++to achieve an arbitrary degree of aesthetic control. ++ ++By providing direct access to the mechanisms within the pretty printer ++that make dynamic decisions about layout, the macros and functions ++@b{pprint-logical-block}, @b{pprint-newline}, and ++@b{pprint-indent} make it possible to specify pretty printing ++layout rules as a part of any function that produces output. They also ++make it very easy for the detection of circularity and sharing, and ++abbreviation based on length and nesting depth to be supported by the ++function. ++ ++The @i{pretty printer} is driven entirely by dispatch based on ++the @i{value} of @b{*print-pprint-dispatch*}. ++The @i{function} @b{set-pprint-dispatch} makes it possible ++for @i{conforming programs} to associate new pretty printing ++functions with a @i{type}. ++ ++@menu ++* Dynamic Control of the Arrangement of Output:: ++* Format Directive Interface:: ++* Compiling Format Strings:: ++* Pretty Print Dispatch Tables:: ++* Pretty Printer Margins:: ++@end menu ++ ++@node Dynamic Control of the Arrangement of Output, Format Directive Interface, Pretty Printer Concepts, Pretty Printer Concepts ++@subsubsection Dynamic Control of the Arrangement of Output ++ ++The actions of the @i{pretty printer} when a piece of output is too ++large to fit in the space available can be precisely controlled. ++Three concepts underlie ++the way these operations work---@i{logical blocks} ++@IGindex logical blocks ++, ++ @i{conditional newlines} ++@IGindex conditional newlines ++, ++ and @i{sections} ++@IGindex sections ++. ++Before proceeding further, it is important to define these terms. ++ ++The first line of Figure 22--3 shows a schematic piece of output. Each of ++the characters in the output is represented by ``@t{-}''. The positions of ++conditional newlines are indicated by digits. The beginnings and ends of ++logical blocks are indicated by ``@t{<}'' and ``@t{>}'' respectively. ++ ++The output as a whole is a logical block and the outermost section. This ++section is indicated by the @t{0}'s on the second line of Figure 1. Logical ++blocks nested within the output are specified by the macro ++@b{pprint-logical-block}. Conditional newline positions are specified ++by calls to @b{pprint-newline}. Each conditional newline defines ++two sections (one before it and one after it) and is associated with a ++third (the section immediately containing it). ++ ++The section after a conditional newline consists of: all the output up to, ++but not including, (a) the next conditional newline immediately contained ++in the same logical block; or if (a) is not applicable, (b) the next ++newline that is at a lesser level of nesting in logical blocks; or if (b) ++is not applicable, (c) the end of the output. ++ ++The section before a conditional newline consists of: all the output back ++to, but not including, (a) the previous conditional newline that is ++immediately contained in the same logical block; or if (a) is not ++applicable, (b) the beginning of the immediately containing logical block. ++The last four lines in Figure 1 indicate the sections before and after the ++four conditional newlines. ++ ++The section immediately containing a conditional newline is the shortest ++section that contains the conditional newline in question. In Figure 22--3, ++the first conditional newline is immediately contained in the section ++marked with @t{0}'s, the second and third conditional newlines are immediately ++contained in the section before the fourth conditional newline, and the ++fourth conditional newline is immediately contained in the section after ++the first conditional newline. ++ ++@example ++ <-1---<--<--2---3->--4-->-> ++ 000000000000000000000000000 ++ 11 111111111111111111111111 ++ 22 222 ++ 333 3333 ++ 44444444444444 44444 ++@end example ++ ++@w{ Figure 22--2: Example of Logical Blocks, Conditional Newlines, and Sections} ++ ++Whenever possible, the pretty printer displays the entire contents of a ++section on a single line. However, if the section is too long to fit in ++the space available, line breaks are inserted at conditional newline ++positions within the section. ++ ++@node Format Directive Interface, Compiling Format Strings, Dynamic Control of the Arrangement of Output, Pretty Printer Concepts ++@subsubsection Format Directive Interface ++ ++The primary interface to operations for dynamically determining the ++arrangement of output is provided through the functions and macros of the ++pretty printer. Figure 22--3 shows the defined names related to @i{pretty printing}. ++ ++@format ++@group ++@noindent ++@w{ *print-lines* pprint-dispatch pprint-pop } ++@w{ *print-miser-width* pprint-exit-if-list-exhausted pprint-tab } ++@w{ *print-pprint-dispatch* pprint-fill pprint-tabular } ++@w{ *print-right-margin* pprint-indent set-pprint-dispatch } ++@w{ copy-pprint-dispatch pprint-linear write } ++@w{ format pprint-logical-block } ++@w{ formatter pprint-newline } ++ ++@noindent ++@w{ Figure 22--3: Defined names related to pretty printing. } ++ ++@end group ++@end format ++ ++Figure 22--4 identifies a set of @i{format directives} which serve ++as an alternate interface to the same pretty printing operations in a ++more textually compact form. ++ ++@format ++@group ++@noindent ++@w{ @t{~I} @t{~W} @t{~<...~:>} } ++@w{ @t{~:T} @t{~/.../} @t{~_} } ++ ++@noindent ++@w{ Figure 22--4: Format directives related to Pretty Printing} ++ ++@end group ++@end format ++ ++@node Compiling Format Strings, Pretty Print Dispatch Tables, Format Directive Interface, Pretty Printer Concepts ++@subsubsection Compiling Format Strings ++ ++A @i{format string} is essentially a program in a special-purpose language ++that performs printing, and that is interpreted by the @i{function} @b{format}. ++The @b{formatter} @i{macro} provides the efficiency of using a @i{compiled function} ++to do that same printing but without losing the textual compactness of @i{format strings}. ++ ++A @i{format control} ++@IGindex format control ++ is either a @i{format string} or a @i{function} ++that was returned by the the @b{formatter} @i{macro}. ++ ++@node Pretty Print Dispatch Tables, Pretty Printer Margins, Compiling Format Strings, Pretty Printer Concepts ++@subsubsection Pretty Print Dispatch Tables ++ ++A @i{pprint dispatch table} ++@IGindex pprint dispatch table ++ is a mapping from keys to pairs of values. ++Each key is a @i{type specifier}. ++The values associated with a key are ++ a ``function'' (specifically, a @i{function designator} or @b{nil}) ++ and a ``numerical priority'' (specifically, a @i{real}). ++Basic insertion and retrieval is done based on the keys with the equality ++of keys being tested by @b{equal}. ++ ++When @b{*print-pretty*} is @i{true}, ++the @i{current pprint dispatch table} ++@IGindex current pprint dispatch table ++ (in @b{*print-pprint-dispatch*}) ++controls how @i{objects} are printed. ++The information in this table takes precedence over ++all other mechanisms for specifying how to print @i{objects}. ++In particular, it ++has priority over ++user-defined @b{print-object} @i{methods} ++ ++because the @i{current pprint dispatch table} is consulted first. ++ ++The function is chosen from the @i{current pprint dispatch table} ++by finding the highest priority function ++that is associated with a @i{type specifier} that matches the @i{object}; ++if there is more than one such function, ++it is @i{implementation-dependent} which is used. ++ ++However, if there is no ++information in the table ++about how to @i{pretty print} a particular kind of @i{object}, ++a @i{function} is invoked which uses @b{print-object} to print the @i{object}. ++The value of @b{*print-pretty*} is still @i{true} ++when this function is @i{called}, ++and individual methods for @b{print-object} might still elect to ++produce output in a special format conditional on the @i{value} of @b{*print-pretty*}. ++ ++@node Pretty Printer Margins, , Pretty Print Dispatch Tables, Pretty Printer Concepts ++@subsubsection Pretty Printer Margins ++ ++A primary goal of pretty printing is to keep the output between a pair of ++margins. ++The column where the output begins is taken as the left margin. ++If the current column cannot be determined at the time output begins, ++the left margin is assumed to be zero. ++The right margin is controlled by @b{*print-right-margin*}. ++ ++@node Examples of using the Pretty Printer, Notes about the Pretty Printer`s Background, Pretty Printer Concepts, The Lisp Pretty Printer ++@subsection Examples of using the Pretty Printer ++ ++As an example of the interaction of logical blocks, conditional newlines, ++and indentation, consider the function @t{simple-pprint-defun} below. This ++function prints out lists whose @i{cars} are @b{defun} in the ++standard way assuming that the list has exactly length @t{4}. ++ ++@example ++(defun simple-pprint-defun (*standard-output* list) ++ (pprint-logical-block (*standard-output* list :prefix "(" :suffix ")") ++ (write (first list)) ++ (write-char #\Space) ++ (pprint-newline :miser) ++ (pprint-indent :current 0) ++ (write (second list)) ++ (write-char #\Space) ++ (pprint-newline :fill) ++ (write (third list)) ++ (pprint-indent :block 1) ++ (write-char #\Space) ++ (pprint-newline :linear) ++ (write (fourth list)))) ++@end example ++ ++Suppose that one evaluates the following: ++ ++@example ++(simple-pprint-defun *standard-output* '(defun prod (x y) (* x y))) ++@end example ++ ++If the line width available is greater than or equal to @t{26}, then all of the ++output appears on one line. If the line width available is reduced to @t{25}, ++a line break is inserted at the ++linear-style conditional newline ++@ITindex linear-style conditional newline ++ ++before the ++@i{expression} @t{(* x y)}, producing the output shown. The ++@t{(pprint-indent :block 1)} causes @t{(* x y)} to be printed at a relative ++indentation of @t{1} in the logical block. ++ ++@example ++ (DEFUN PROD (X Y) ++ (* X Y)) ++@end example ++ ++If the line width available is @t{15}, a line break is also inserted at the ++fill style conditional newline before the argument list. The call on ++@t{(pprint-indent :current 0)} causes the argument list to line up under the ++function name. ++ ++@example ++(DEFUN PROD ++ (X Y) ++ (* X Y)) ++@end example ++ ++If @b{*print-miser-width*} were greater than or equal to 14, the example ++output above would have been as follows, because all indentation changes ++are ignored in miser mode and line breaks are inserted at ++miser-style conditional newlines. ++@ITindex miser-style conditional newline ++ ++@example ++ (DEFUN ++ PROD ++ (X Y) ++ (* X Y)) ++@end example ++ ++As an example of a per-line prefix, consider that evaluating the following ++produces the output shown with a line width of @t{20} and ++@b{*print-miser-width*} of @b{nil}. ++ ++@example ++ (pprint-logical-block (*standard-output* nil :per-line-prefix ";;; ") ++ (simple-pprint-defun *standard-output* '(defun prod (x y) (* x y)))) ++ ++ ;;; (DEFUN PROD ++ ;;; (X Y) ++ ;;; (* X Y)) ++@end example ++ ++As a more complex (and realistic) example, consider the function @t{pprint-let} ++below. This specifies how to print a @b{let} @i{form} in the traditional ++style. It is more complex than the example above, because it has to deal with ++nested structure. Also, unlike the example above it contains complete code to ++readably print any possible list that begins with the @i{symbol} @b{let}. ++The outermost @b{pprint-logical-block} @i{form} handles the printing of ++the input list as a whole and specifies that parentheses should be printed in the ++output. The second @b{pprint-logical-block} @i{form} handles the list ++of binding pairs. Each pair in the list is itself printed by the innermost ++@b{pprint-logical-block}. (A @b{loop} @i{form} is used instead of ++merely decomposing the pair into two @i{objects} so that readable output will ++be produced no matter whether the list corresponding to the pair has one element, ++two elements, or (being malformed) has more than two elements.) ++A space and a ++fill-style conditional newline ++@ITindex fill-style conditional newline ++ ++are placed after ++each pair except the last. The loop at the end of the topmost ++@b{pprint-logical-block} @i{form} prints out the forms in the body ++of the @b{let} @i{form} separated by spaces and ++linear-style conditional newlines. ++ ++@example ++ (defun pprint-let (*standard-output* list) ++ (pprint-logical-block (nil list :prefix "(" :suffix ")") ++ (write (pprint-pop)) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-logical-block (nil (pprint-pop) :prefix "(" :suffix ")") ++ (pprint-exit-if-list-exhausted) ++ (loop (pprint-logical-block (nil (pprint-pop) :prefix "(" :suffix ")") ++ (pprint-exit-if-list-exhausted) ++ (loop (write (pprint-pop)) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-newline :linear))) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-newline :fill))) ++ (pprint-indent :block 1) ++ (loop (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-newline :linear) ++ (write (pprint-pop))))) ++@end example ++ ++Suppose that one evaluates the following with @b{*print-level*} being 4, ++and @b{*print-circle*} being @i{true}. ++ ++@example ++ (pprint-let *standard-output* ++ '#1=(let (x (*print-length* (f (g 3))) ++ (z . 2) (k (car y))) ++ (setq x (sqrt z)) #1#)) ++@end example ++ ++If the line length is greater than or equal to @t{77}, the output produced ++appears on one line. However, if the line length is @t{76}, line breaks are ++inserted at the linear-style conditional newlines separating the forms in ++the body and the output below is produced. Note that, the degenerate ++binding pair @t{x} is printed readably even though it fails to be a list; a ++depth abbreviation marker is printed in place of @t{(g 3)}; the binding pair ++@t{(z . 2)} is printed readably even though it is not a proper list; and ++appropriate circularity markers are printed. ++ ++@example ++ #1=(LET (X (*PRINT-LENGTH* (F #)) (Z . 2) (K (CAR Y))) ++ (SETQ X (SQRT Z)) ++ #1#) ++@end example ++ ++If the line length is reduced to @t{35}, a line break is inserted at one of the ++fill-style conditional newlines separating the binding pairs. ++ ++@example ++ #1=(LET (X (*PRINT-PRETTY* (F #)) ++ (Z . 2) (K (CAR Y))) ++ (SETQ X (SQRT Z)) ++ #1#) ++@end example ++ ++Suppose that the line length is further reduced to @t{22} and @b{*print-length*} is ++set to @t{3}. In this situation, line breaks are inserted after both the first ++and second binding pairs. In addition, the second binding pair is itself ++broken across two lines. Clause (b) of the description of fill-style ++conditional newlines (see the @i{function} @b{pprint-newline}) ++prevents the binding pair @t{(z . 2)} from being printed ++at the end of the third line. Note that the length abbreviation hides the ++circularity from view and therefore the printing of circularity markers ++disappears. ++ ++@example ++ (LET (X ++ (*PRINT-LENGTH* ++ (F #)) ++ (Z . 2) ...) ++ (SETQ X (SQRT Z)) ++ ...) ++@end example ++ ++The next function prints a vector using ``@t{#(...)}'' notation. ++ ++@example ++(defun pprint-vector (*standard-output* v) ++ (pprint-logical-block (nil nil :prefix "#(" :suffix ")") ++ (let ((end (length v)) (i 0)) ++ (when (plusp end) ++ (loop (pprint-pop) ++ (write (aref v i)) ++ (if (= (incf i) end) (return nil)) ++ (write-char #\Space) ++ (pprint-newline :fill)))))) ++@end example ++ ++Evaluating the following with a line length of 15 produces the output shown. ++ ++@example ++ (pprint-vector *standard-output* '#(12 34 567 8 9012 34 567 89 0 1 23)) ++ ++ #(12 34 567 8 ++ 9012 34 567 ++ 89 0 1 23) ++@end example ++ ++As examples of the convenience of specifying pretty printing with ++@i{format strings}, consider that the functions @t{simple-pprint-defun} ++and @t{pprint-let} used as examples above can be compactly defined as follows. ++(The function @t{pprint-vector} cannot be defined using @b{format} ++because the data structure it traverses is not a list.) ++ ++@example ++(defun simple-pprint-defun (*standard-output* list) ++ (format T "~:<~W ~@@_~:I~W ~:_~W~1I ~_~W~:>" list)) ++ ++(defun pprint-let (*standard-output* list) ++ (format T "~:<~W~@t{^}~:<~@@@{~:<~@@@{~W~@t{^}~_~@}~:>~@t{^}~:_~@}~:>~1I~@@@{~@t{^}~_~W~@}~:>" list)) ++@end example ++ ++In the following example, the first @i{form} restores ++@b{*print-pprint-dispatch*} to the equivalent of its initial value. ++The next two forms then set up a special way to pretty print ratios. ++Note that the more specific @i{type specifier} has to be associated ++with a higher priority. ++ ++@example ++ (setq *print-pprint-dispatch* (copy-pprint-dispatch nil)) ++ ++ (set-pprint-dispatch 'ratio ++ #'(lambda (s obj) ++ (format s "#.(/ ~W ~W)" ++ (numerator obj) (denominator obj)))) ++ ++ (set-pprint-dispatch '(and ratio (satisfies minusp)) ++ #'(lambda (s obj) ++ (format s "#.(- (/ ~W ~W))" ++ (- (numerator obj)) (denominator obj))) ++ 5) ++ ++ (pprint '(1/3 -2/3)) ++ (#.(/ 1 3) #.(- (/ 2 3))) ++@end example ++ ++The following two @i{forms} illustrate the definition of ++pretty printing functions for types of @i{code}. The first ++@i{form} illustrates how to specify the traditional method ++for printing quoted objects using @i{single-quote}. Note ++the care taken to ensure that data lists that happen to begin ++with @b{quote} will be printed readably. The second form ++specifies that lists beginning with the symbol @t{my-let} ++should print the same way that lists beginning with @b{let} ++print when the initial @i{pprint dispatch table} is in effect. ++ ++@example ++ (set-pprint-dispatch '(cons (member quote)) () ++ #'(lambda (s list) ++ (if (and (consp (cdr list)) (null (cddr list))) ++ (funcall (formatter "'~W") s (cadr list)) ++ (pprint-fill s list)))) ++ ++ (set-pprint-dispatch '(cons (member my-let)) ++ (pprint-dispatch '(let) nil)) ++@end example ++ ++The next example specifies a default method for printing lists that do not ++correspond to function calls. Note that the functions @b{pprint-linear}, ++@b{pprint-fill}, and @b{pprint-tabular} are all defined with ++optional @i{colon-p} and @i{at-sign-p} arguments so that they can ++be used as @b{pprint dispatch functions} as well as @t{~/.../} ++functions. ++ ++@example ++ (set-pprint-dispatch '(cons (not (and symbol (satisfies fboundp)))) ++ #'pprint-fill -5) ++ ++ ;; Assume a line length of 9 ++ (pprint '(0 b c d e f g h i j k)) ++ (0 b c d ++ e f g h ++ i j k) ++@end example ++ ++This final example shows how to define a pretty printing function for a ++user defined data structure. ++ ++@example ++ (defstruct family mom kids) ++ ++ (set-pprint-dispatch 'family ++ #'(lambda (s f) ++ (funcall (formatter "~@@<#<~;~W and ~2I~_~/pprint-fill/~;>~:>") ++ s (family-mom f) (family-kids f)))) ++@end example ++ ++The pretty printing function for the structure @t{family} specifies how to ++adjust the layout of the output so that it can fit aesthetically into ++a variety of line widths. In addition, it obeys ++the printer control variables @b{*print-level*}, ++@b{*print-length*}, @b{*print-lines*}, ++@b{*print-circle*} ++and @b{*print-escape*}, ++and can tolerate several different kinds of malformity in the data structure. ++The output below shows what is printed out with a right margin of @t{25}, ++@b{*print-pretty*} being @i{true}, @b{*print-escape*} being @i{false}, ++and a malformed @t{kids} list. ++ ++@example ++ (write (list 'principal-family ++ (make-family :mom "Lucy" ++ :kids '("Mark" "Bob" . "Dan"))) ++ :right-margin 25 :pretty T :escape nil :miser-width nil) ++ (PRINCIPAL-FAMILY ++ #) ++@end example ++ ++Note that a pretty printing function for a structure is different from ++the structure's @b{print-object} @i{method}. ++While ++@b{print-object} @i{methods} ++are permanently associated with a structure, ++pretty printing functions are stored in ++@i{pprint dispatch tables} and can be rapidly changed to reflect ++different printing needs. If there is no pretty printing function for ++a structure in the current @i{pprint dispatch table}, ++its @b{print-object} @i{method} ++is used instead. ++ ++@node Notes about the Pretty Printer`s Background, , Examples of using the Pretty Printer, The Lisp Pretty Printer ++@subsection Notes about the Pretty Printer`s Background ++ ++For a background reference to the abstract concepts detailed in this ++section, see @i{XP: A Common Lisp Pretty Printing System}. The details of that paper are not binding on ++this document, but may be helpful in establishing a conceptual basis for ++understanding this material. ++ ++@c end of including concept-pprint ++ ++@node Formatted Output, Printer Dictionary, The Lisp Pretty Printer, Printer ++@section Formatted Output ++ ++@c including concept-format ++ ++[Editorial Note by KMP: This is transplanted from FORMAT and will need a bit of work before ++ it looks good standing alone. Bear with me.] ++ ++@b{format} is useful for producing nicely formatted text, producing ++good-looking messages, and so on. @b{format} can generate and return ++a @i{string} or output to @i{destination}. ++ ++The @i{control-string} argument to @b{format} is actually a @i{format control}. ++That is, it can be either a @i{format string} or a @i{function}, ++for example a @i{function} returned ++by the @b{formatter} @i{macro}. ++ ++If it is a @i{function}, the @i{function} is called with the appropriate ++output stream as its first argument and the data arguments to @b{format} ++as its remaining arguments. The function should perform whatever output is ++necessary and return the unused tail of the arguments (if any). ++ ++The compilation process performed by @b{formatter} produces a @i{function} ++that would do with its @i{arguments} as the @b{format} interpreter ++would do with those @i{arguments}. ++ ++The remainder of this section describes what happens if the @i{control-string} ++is a @i{format string}. ++ ++@i{Control-string} is composed of simple text (@i{characters}) ++and embedded directives. ++ ++@b{format} writes the simple text as is; ++each embedded directive specifies further text output ++that is to appear at the corresponding point within the simple text. ++Most directives use one or more elements of @i{args} to ++create their output. ++ ++A directive consists of a @i{tilde}, ++optional prefix parameters ++separated by commas, optional @i{colon} and @i{at-sign} modifiers, ++and a single character indicating what kind of directive this is. ++ ++There is no required ordering between the @i{at-sign} and @i{colon} modifier. ++ ++The @i{case} of the directive character is ignored. ++Prefix parameters are notated as signed (sign is optional) decimal numbers, ++or as a @i{single-quote} followed by a character. ++For example, @t{~5,'0d} can be used ++to print an @i{integer} ++in decimal radix in five columns with leading zeros, ++or @t{~5,'*d} to get leading asterisks. ++ ++In place of a prefix parameter to a directive, @t{V} (or @t{v}) can be used. ++In this case, @b{format} takes an argument from @i{args} as a parameter to ++the directive. The argument should be an @i{integer} or @i{character}. ++If the @i{arg} used by a @t{V} parameter is @b{nil}, ++the effect is as if the parameter had been omitted. ++@t{#} can be used in place of a prefix parameter; it ++represents the number of @i{args} remaining to be processed. ++When used within a recursive format, in the context of @t{~?} or @t{~@{}, ++the @t{#} prefix parameter represents the number of @i{format arguments} ++remaining within the recursive call. ++ ++Examples of @i{format strings}: ++ ++@format ++@group ++@noindent ++@w{ @t{"~S"} ;This is an S directive with no parameters or modifiers. } ++@w{ @t{"~3,-4:@@s"} ;This is an S directive with two parameters, @t{3} and @t{-4}, } ++@w{ ; and both the @i{colon} and @i{at-sign} flags. } ++@w{ @t{"~,+4S"} ;Here the first prefix parameter is omitted and takes } ++@w{ ; on its default value, while the second parameter is @t{4}. } ++ ++@noindent ++@w{ Figure 22--5: Examples of format control strings } ++ ++@end group ++@end format ++ ++@b{format} sends the output to @i{destination}. ++If @i{destination} is @b{nil}, ++@b{format} creates and returns a @i{string} ++containing the output from @i{control-string}. ++If @i{destination} is @i{non-nil}, ++it must be a @i{string} with a @i{fill pointer}, ++a @i{stream}, or the symbol @b{t}. ++If @i{destination} is a @i{string} with a @i{fill pointer}, ++the output is added to the end of the @i{string}. ++If @i{destination} is a @i{stream}, ++the output is sent to that @i{stream}. ++If @i{destination} is @b{t}, ++the output is sent to @i{standard output}. ++ ++In the description of the directives that follows, ++the term @i{arg} in general ++refers to the next item of the set of @i{args} to be processed. ++The word or phrase at the beginning of each description is a mnemonic ++for the directive. ++ ++@b{format} directives do not bind any of the printer control ++variables (@b{*print-...*}) except as specified in the following ++descriptions. ++ Implementations may specify the binding of new, implementation-specific ++printer control variables for each @b{format} directive, but they ++ may neither bind any standard printer control variables not ++ specified in description of a @b{format} ++directive nor fail to bind ++ any standard printer control variables as specified in the ++ description. ++ ++@menu ++* FORMAT Basic Output:: ++* FORMAT Radix Control:: ++* FORMAT Floating-Point Printers:: ++* FORMAT Printer Operations:: ++* FORMAT Pretty Printer Operations:: ++* FORMAT Layout Control:: ++* FORMAT Control-Flow Operations:: ++* FORMAT Miscellaneous Operations:: ++* FORMAT Miscellaneous Pseudo-Operations:: ++* Additional Information about FORMAT Operations:: ++* Examples of FORMAT:: ++* Notes about FORMAT:: ++@end menu ++ ++@node FORMAT Basic Output, FORMAT Radix Control, Formatted Output, Formatted Output ++@subsection FORMAT Basic Output ++ ++@menu ++* Tilde C-> Character:: ++* Tilde Percent-> Newline:: ++* Tilde Ampersand-> Fresh-Line:: ++* Tilde Vertical-Bar-> Page:: ++* Tilde Tilde-> Tilde:: ++@end menu ++ ++@node Tilde C-> Character, Tilde Percent-> Newline, FORMAT Basic Output, FORMAT Basic Output ++@subsubsection Tilde C: Character ++ ++The next @i{arg} should be a @i{character}; ++it is printed ++according to the modifier flags. ++ ++@t{~C} prints the @i{character} ++as if by using @b{write-char} if it is a @i{simple character}. ++@i{Characters} that are not @i{simple} ++are not necessarily printed as if by @b{write-char}, ++but are displayed in an @i{implementation-defined}, abbreviated format. ++For example, ++ ++@example ++ (format nil "~C" #\A) @result{} "A" ++ (format nil "~C" #\Space) @result{} " " ++@end example ++ ++@t{~:C} is the same as @t{~C} for @i{printing} @i{characters}, ++but other @i{characters} are ``spelled out.'' The intent is that this ++is a ``pretty'' format for printing characters. ++For @i{simple} @i{characters} that are not @i{printing}, ++what is spelled out is the @i{name} of the @i{character} (see @b{char-name}). ++For @i{characters} that are not @i{simple} and not @i{printing}, ++what is spelled out is @i{implementation-defined}. ++For example, ++ ++@example ++ (format nil "~:C" #\A) @result{} "A" ++ (format nil "~:C" #\Space) @result{} "Space" ++;; This next example assumes an implementation-defined "Control" attribute. ++ (format nil "~:C" #\Control-Space) ++@result{} "Control-Space" ++@i{OR}@result{} "c-Space" ++@end example ++ ++@t{~:@@C} prints what @t{~:C} would, and then ++if the @i{character} requires unusual shift keys on the keyboard to type it, ++this fact is mentioned. For example, ++ ++@example ++ (format nil "~:@@C" #\Control-Partial) @result{} "Control-\partial (Top-F)" ++@end example ++ ++This is the format used for telling the user about a key he is expected to type, ++in prompts, for instance. The precise output may depend not only ++on the implementation, but on the particular I/O devices in use. ++ ++@t{~@@C} ++prints the @i{character} in a way that the @i{Lisp reader} can understand, ++using @t{#\} syntax. ++ ++@t{~@@C} binds @b{*print-escape*} to @b{t}. ++ ++@node Tilde Percent-> Newline, Tilde Ampersand-> Fresh-Line, Tilde C-> Character, FORMAT Basic Output ++@subsubsection Tilde Percent: Newline ++ ++This outputs a @t{#\Newline} character, thereby terminating the current ++output line and beginning a new one. ++@t{~@i{n}%} outputs @i{n} newlines. ++No @i{arg} is used. ++ ++@node Tilde Ampersand-> Fresh-Line, Tilde Vertical-Bar-> Page, Tilde Percent-> Newline, FORMAT Basic Output ++@subsubsection Tilde Ampersand: Fresh-Line ++ ++Unless it can be determined that the output stream ++is already at the beginning of a line, ++this outputs a newline. ++@t{~@i{n}&} calls @b{fresh-line} ++and then outputs @i{n}- 1 newlines. ++@t{~0&} does nothing. ++ ++@node Tilde Vertical-Bar-> Page, Tilde Tilde-> Tilde, Tilde Ampersand-> Fresh-Line, FORMAT Basic Output ++@subsubsection Tilde Vertical-Bar: Page ++ ++This outputs a page separator character, if possible. ++@t{~@i{n}|} does this @i{n} times. ++ ++@node Tilde Tilde-> Tilde, , Tilde Vertical-Bar-> Page, FORMAT Basic Output ++@subsubsection Tilde Tilde: Tilde ++ ++This outputs a @i{tilde}. @t{~@i{n}~} outputs @i{n} tildes. ++ ++@node FORMAT Radix Control, FORMAT Floating-Point Printers, FORMAT Basic Output, Formatted Output ++@subsection FORMAT Radix Control ++ ++@menu ++* Tilde R-> Radix:: ++* Tilde D-> Decimal:: ++* Tilde B-> Binary:: ++* Tilde O-> Octal:: ++* Tilde X-> Hexadecimal:: ++@end menu ++ ++@node Tilde R-> Radix, Tilde D-> Decimal, FORMAT Radix Control, FORMAT Radix Control ++@subsubsection Tilde R: Radix ++ ++@t{~@i{n}R} prints @i{arg} in radix @i{n}. ++The modifier flags and any remaining parameters are used as for ++the @t{~D} directive. ++@t{~D} is the same as @t{~10R}. ++The full form is ++@t{~@i{radix},@i{mincol},@i{padchar},@i{commachar},@i{comma-interval}R}. ++ ++If no prefix parameters are given to @t{~R}, then a different ++interpretation is given. The argument should be an @i{integer}. ++For example, if @i{arg} is 4: ++ ++@table @asis ++ ++@item @t{*} ++@t{~R} prints @i{arg} as a cardinal English number: @t{four}. ++ ++@item @t{*} ++@t{~:R} prints @i{arg} as an ordinal English number: @t{fourth}. ++ ++@item @t{*} ++@t{~@@R} prints @i{arg} as a Roman numeral: @t{IV}. ++ ++@item @t{*} ++@t{~:@@R} prints @i{arg} as an old Roman numeral: @t{IIII}. ++@end table ++ ++For example: ++ ++@example ++ (format nil "~,,' ,4:B" 13) @result{} "1101" ++ (format nil "~,,' ,4:B" 17) @result{} "1 0001" ++ (format nil "~19,0,' ,4:B" 3333) @result{} "0000 1101 0000 0101" ++ (format nil "~3,,,' ,2:R" 17) @result{} "1 22" ++ (format nil "~,,'|,2:D" #xFFFF) @result{} "6|55|35" ++@end example ++ ++If and only if the first parameter, @i{n}, is supplied, ++@t{~R} binds ++ @b{*print-escape*} to @i{false}, ++ @b{*print-radix*} to @i{false}, ++ @b{*print-base*} to @i{n}, ++ ++ and @b{*print-readably*} to @i{false}. ++ ++If and only if no parameters are supplied, ++@t{~R} binds @b{*print-base*} to @t{10}. ++ ++@node Tilde D-> Decimal, Tilde B-> Binary, Tilde R-> Radix, FORMAT Radix Control ++@subsubsection Tilde D: Decimal ++ ++An @i{arg}, which should be an @i{integer}, ++is printed in decimal radix. ++@t{~D} will never put a decimal point after the number. ++ ++@t{~@i{mincol}D} uses ++a column width of @i{mincol}; spaces are inserted on ++the left if the number requires fewer than @i{mincol} columns for its digits ++and sign. If the number doesn't fit in @i{mincol} columns, additional columns ++are used as needed. ++ ++@t{~@i{mincol},@i{padchar}D} uses @i{padchar} as the pad character ++instead of space. ++ ++If @i{arg} is not an @i{integer}, it is printed in @t{~A} format and decimal base. ++ ++The @t{@@} modifier causes the number's sign to be printed always; the default ++is to print it only if the number is negative. ++ ++The @t{:} modifier causes commas to be printed between groups of digits; ++@i{commachar} may be used to change the character used as the comma. ++@i{comma-interval} ++must be an @i{integer} and defaults to 3. When the @t{:} ++modifier is given to any of ++these directives, the @i{commachar} ++is printed between groups of @i{comma-interval} ++digits. ++ ++Thus the most general form of @t{~D} is ++@t{~@i{mincol},@i{padchar},@i{commachar},@i{comma-interval}D}. ++ ++@t{~D} binds ++ @b{*print-escape*} to @i{false}, ++ @b{*print-radix*} to @i{false}, ++ @b{*print-base*} to @t{10}, ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node Tilde B-> Binary, Tilde O-> Octal, Tilde D-> Decimal, FORMAT Radix Control ++@subsubsection Tilde B: Binary ++ ++This is just like @t{~D} but prints in binary radix (radix 2) ++instead of decimal. The full form is therefore ++@t{~@i{mincol},@i{padchar},@i{commachar},@i{comma-interval}B}. ++ ++@t{~B} binds ++ @b{*print-escape*} to @i{false}, ++ @b{*print-radix*} to @i{false}, ++ @b{*print-base*} to @t{2}, ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node Tilde O-> Octal, Tilde X-> Hexadecimal, Tilde B-> Binary, FORMAT Radix Control ++@subsubsection Tilde O: Octal ++ ++This is just like @t{~D} but prints in octal radix (radix 8) ++instead of decimal. The full form is therefore ++@t{~@i{mincol},@i{padchar},@i{commachar},@i{comma-interval}O}. ++ ++@t{~O} binds ++ @b{*print-escape*} to @i{false}, ++ @b{*print-radix*} to @i{false}, ++ @b{*print-base*} to @t{8}, ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node Tilde X-> Hexadecimal, , Tilde O-> Octal, FORMAT Radix Control ++@subsubsection Tilde X: Hexadecimal ++ ++This is just like @t{~D} but prints in hexadecimal radix ++(radix 16) instead of decimal. The full form is therefore ++@t{~@i{mincol},@i{padchar},@i{commachar},@i{comma-interval}X}. ++ ++@t{~X} binds ++ @b{*print-escape*} to @i{false}, ++ @b{*print-radix*} to @i{false}, ++ @b{*print-base*} to @t{16}, ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node FORMAT Floating-Point Printers, FORMAT Printer Operations, FORMAT Radix Control, Formatted Output ++@subsection FORMAT Floating-Point Printers ++ ++@menu ++* Tilde F-> Fixed-Format Floating-Point:: ++* Tilde E-> Exponential Floating-Point:: ++* Tilde G-> General Floating-Point:: ++* Tilde Dollarsign-> Monetary Floating-Point:: ++@end menu ++ ++@node Tilde F-> Fixed-Format Floating-Point, Tilde E-> Exponential Floating-Point, FORMAT Floating-Point Printers, FORMAT Floating-Point Printers ++@subsubsection Tilde F: Fixed-Format Floating-Point ++ ++The next @i{arg} is printed as a @i{float}. ++ ++The full form is @t{~@i{w},@i{d},@i{k},@i{overflowchar},@i{padchar}F}. ++The parameter @i{w} ++is the width of the field to be printed; @i{d} is the number ++of digits to print after the decimal point; @i{k} is a scale factor ++that defaults to zero. ++ ++Exactly @i{w} characters will ++be output. First, leading copies of the character @i{padchar} ++(which defaults to a space) are printed, if necessary, to pad the ++field on the left. ++If the @i{arg} is negative, then a minus sign is printed; ++if the @i{arg} is not negative, then a plus sign is printed ++if and only if the @t{@@} ++modifier was supplied. Then a sequence ++of digits, containing a single embedded decimal point, is printed; ++this represents the magnitude of the value of @i{arg} times 10^@i{k}, ++rounded to @i{d} fractional digits. ++When rounding up and rounding down would produce printed values ++equidistant from the scaled value of @i{arg}, then the implementation ++is free to use either one. For example, printing the argument ++@t{6.375} using the format @t{~4,2F} may correctly produce ++either @t{6.37} or @t{6.38}. ++Leading zeros are not permitted, except that a single ++zero digit is output before the decimal point if the printed value ++is less than one, and this single zero digit is not output ++at all if @i{w}=@i{d}+1. ++ ++If it is impossible to print the value in the required format in a field ++of width @i{w}, then one of two actions is taken. If the ++parameter @i{overflowchar} is supplied, then @i{w} copies of that ++parameter are printed instead of the scaled value of @i{arg}. ++If the @i{overflowchar} parameter is omitted, then the scaled value ++is printed using more than @i{w} characters, as many more as may be ++needed. ++ ++If the @i{w} parameter is omitted, then the field is of variable width. ++In effect, a value is chosen ++for @i{w} in such a way that no leading pad characters need to be printed ++and exactly @i{d} characters will follow the decimal point. ++For example, the directive @t{~,2F} will print exactly ++two digits after the decimal point and as many as necessary before the ++decimal point. ++ ++If the parameter @i{d} is omitted, then there is no constraint ++on the number of digits to appear after the decimal point. ++A value is chosen for @i{d} in such a way that as many digits ++as possible may be printed subject to the width constraint ++imposed by the parameter @i{w} and the constraint that no trailing ++zero digits may appear in the fraction, except that if the ++fraction to be printed is zero, then a single zero digit should ++appear after the decimal point if permitted by the width constraint. ++ ++If both @i{w} and @i{d} are omitted, then the effect is to print ++the value using ordinary free-format output; @b{prin1} uses this format ++for any number whose magnitude is either zero or between ++10^@r{-3} (inclusive) and 10^7 (exclusive). ++ ++If @i{w} is omitted, then if the magnitude of @i{arg} is so large (or, if ++@i{d} is also omitted, so small) that more than 100 digits would have to ++be printed, then an implementation is free, at its discretion, to print ++the number using exponential notation instead, as if by the directive ++@t{~E} (with all parameters to @t{~E} defaulted, not ++taking their values from the @t{~F} directive). ++ ++If @i{arg} is a @i{rational} ++number, then it is coerced to be a @i{single float} ++and then printed. Alternatively, an implementation is permitted to ++process a @i{rational} ++number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow ++because of the coercion. If @i{w} and @i{d} are ++not supplied and the number has no exact decimal representation, ++for example @t{1/3}, some precision cutoff must be chosen ++by the implementation since only a finite number of digits may be printed. ++ ++If @i{arg} is a @i{complex} number or some non-numeric ++@i{object}, ++then it is printed using the format directive @t{~@i{w}D}, ++thereby printing it in decimal radix and a minimum field width of @i{w}. ++ ++@t{~F} binds ++ @b{*print-escape*} to @i{false} ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node Tilde E-> Exponential Floating-Point, Tilde G-> General Floating-Point, Tilde F-> Fixed-Format Floating-Point, FORMAT Floating-Point Printers ++@subsubsection Tilde E: Exponential Floating-Point ++ ++The next @i{arg} is printed as a @i{float} in exponential notation. ++ ++The full form is ++@t{~@i{w},@i{d},@i{e},@i{k},@i{overflowchar},@i{padchar},@i{exponentchar}E}. ++The parameter @i{w} ++is the width of the field to be printed; @i{d} is the number ++of digits to print after the decimal point; @i{e} is the number ++of digits to use when printing the exponent; ++@i{k} is a scale factor that defaults to one (not zero). ++ ++Exactly @i{w} characters will ++be output. First, leading copies of the character @i{padchar} ++(which defaults to a space) are printed, if necessary, to pad the ++field on the left. ++If the @i{arg} is negative, then a minus sign is printed; ++if the @i{arg} is not negative, then a plus sign is printed ++if and only if the @t{@@} ++modifier was supplied. Then a sequence ++of digits containing a single embedded decimal point is printed. ++The form of this sequence of digits depends on the scale factor @i{k}. ++If @i{k} is zero, then @i{d} digits are printed after the decimal ++point, and a single zero digit appears before the decimal point if ++the total field width will permit it. If @i{k} is positive, ++then it must be strictly less than @i{d}+2; @i{k} significant digits ++are printed before the decimal point, and @i{d}- @i{k}+1 ++digits are printed after the decimal point. If @i{k} is negative, ++then it must be strictly greater than - @i{d}; ++a single zero digit appears before the decimal point if ++the total field width will permit it, and after the decimal point ++are printed first ++- @i{k} zeros and then @i{d}+@i{k} significant digits. ++The printed fraction must be properly rounded. ++When rounding up and rounding down would produce printed values ++equidistant from the scaled value of @i{arg}, then the implementation ++is free to use either one. For example, printing the argument ++@t{637.5} using the format @t{~8,2E} may correctly produce ++either @t{6.37E+2} or @t{6.38E+2}. ++ ++Following the digit sequence, the exponent is printed. ++First the character parameter @i{exponentchar} is printed; if this ++parameter is omitted, then the @i{exponent marker} that ++@b{prin1} would use is printed, as determined from the ++type of the @i{float} and the current value of ++@b{*read-default-float-format*}. ++Next, either a plus sign or a minus sign ++is printed, followed by @i{e} digits representing the power of ++ten by which the printed fraction must be multiplied ++to properly represent the rounded value of @i{arg}. ++ ++If it is impossible to print the value in the required format in a field ++of width @i{w}, possibly because @i{k} is too large or too small ++or because the exponent cannot be printed in @i{e} character positions, ++then one of two actions is taken. If the ++parameter @i{overflowchar} is supplied, then @i{w} copies of that ++parameter are printed instead of the scaled value of @i{arg}. ++If the @i{overflowchar} parameter is omitted, then the scaled value ++is printed using more than @i{w} characters, as many more as may be ++needed; if the problem is that @i{d} is too small for the supplied @i{k} ++or that @i{e} is too small, then a larger value is used for @i{d} or @i{e} ++as may be needed. ++ ++If the @i{w} parameter is omitted, then the field is of variable width. ++In effect a value is chosen ++for @i{w} in such a way that no leading pad characters need to be printed. ++ ++If the parameter @i{d} is omitted, then there is no constraint ++on the number of digits to appear. ++A value is chosen for @i{d} in such a way that as many digits ++as possible may be printed subject to the width constraint ++imposed by the parameter @i{w}, the constraint of the scale factor @i{k}, ++and the constraint that no trailing ++zero digits may appear in the fraction, except that if the ++fraction to be printed is zero then a single zero digit should ++appear after the decimal point. ++ ++If the parameter @i{e} is omitted, then the exponent is printed ++using the smallest number of digits necessary to represent its value. ++ ++If all of @i{w}, @i{d}, and @i{e} are omitted, then the effect is to print ++the value using ordinary free-format exponential-notation output; ++@b{prin1} uses ++ ++a similar ++ ++format for any non-zero number whose magnitude ++is less than 10^@r{-3} or greater than or equal to 10^7. ++ ++The only difference is that the @t{~E} ++directive always prints a plus or minus sign in front of the ++ exponent, while @b{prin1} omits the plus sign if the exponent is ++ non-negative. ++ ++If @i{arg} is a @i{rational} ++number, then it is coerced to be a @i{single float} ++and then printed. Alternatively, an implementation is permitted to ++process a @i{rational} ++number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow ++because of the coercion. If @i{w} and @i{d} are ++unsupplied and the number has no exact decimal representation, ++for example @t{1/3}, some precision cutoff must be chosen ++by the implementation since only a finite number of digits may be printed. ++ ++If @i{arg} is a @i{complex} number or some non-numeric ++@i{object}, ++then it is printed using the format directive @t{~@i{w}D}, ++thereby printing it in decimal radix and a minimum field width of @i{w}. ++ ++@t{~E} binds ++ @b{*print-escape*} to @i{false} ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node Tilde G-> General Floating-Point, Tilde Dollarsign-> Monetary Floating-Point, Tilde E-> Exponential Floating-Point, FORMAT Floating-Point Printers ++@subsubsection Tilde G: General Floating-Point ++ ++The next @i{arg} is printed as a @i{float} ++in either fixed-format or exponential notation as appropriate. ++ ++The full form is @t{~@i{w},@i{d},@i{e},@i{k},@i{overflowchar},@i{padchar},@i{exponentchar}G}. ++The format in which to print @i{arg} depends on the magnitude (absolute ++value) of the @i{arg}. Let @i{n} be an integer such that ++10^@r{@r{n}-1} \le |@i{arg}| < 10^@i{n}. ++Let @i{ee} equal @i{e}+2, or 4 if @i{e} is omitted. ++Let @i{ww} equal @i{w}- @i{ee}, ++or @b{nil} if @i{w} is omitted. If @i{d} is omitted, first let @i{q} ++be the number of digits needed to print @i{arg} with no loss ++of information and without leading or trailing zeros; ++then let @i{d} equal @t{(max @i{q} (min @i{n} 7))}. ++Let @i{dd} equal @i{d}- @i{n}. ++ ++If 0 \le @i{dd} \le @i{d}, then @i{arg} is printed ++as if by the format directives ++ ++@t{~@i{ww},@i{dd},,@i{overflowchar},@i{padchar}F~@i{ee}@@T} ++ ++Note that the scale factor @i{k} is not passed to the @t{~F} ++directive. For all other values of @i{dd}, @i{arg} is printed as if ++by the format directive ++ ++@t{~@i{w},@i{d},@i{e},@i{k},@i{overflowchar},@i{padchar},@i{exponentchar}E} ++ ++In either case, an @t{@@} ++modifier is supplied to the @t{~F} ++or @t{~E} directive if and only if one was supplied to the ++@t{~G} directive. ++ ++@t{~G} binds ++ @b{*print-escape*} to @i{false} ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node Tilde Dollarsign-> Monetary Floating-Point, , Tilde G-> General Floating-Point, FORMAT Floating-Point Printers ++@subsubsection Tilde Dollarsign: Monetary Floating-Point ++ ++The next @i{arg} is printed as a @i{float} in fixed-format notation. ++ ++The full form is @t{~@i{d},@i{n},@i{w},@i{padchar}$}. ++The parameter @i{d} is the number ++of digits to print after the decimal point (default value 2); ++@i{n} is the minimum number of digits to print before the decimal ++point (default value 1); ++@i{w} is the minimum total width of the field to be printed (default ++value 0). ++ ++First padding and the sign are output. ++If the @i{arg} is negative, then a minus sign is printed; ++if the @i{arg} is not negative, then a plus sign is printed ++if and only if the @t{@@} modifier was supplied. ++If the @t{:} modifier is used, the sign appears before any padding, ++and otherwise after the padding. ++If @i{w} is supplied and the number of other characters to be output ++is less than @i{w}, then copies of @i{padchar} (which defaults ++to a space) are output to ++make the total field width equal @i{w}. ++Then @i{n} digits are printed for the integer part of @i{arg}, ++with leading zeros if necessary; then a decimal point; ++then @i{d} digits of fraction, properly rounded. ++ ++If the magnitude of @i{arg} is so large that more than @i{m} digits would ++have to be printed, where @i{m} is the larger of @i{w} and 100, then an ++implementation is free, at its discretion, to print the number using ++exponential notation instead, as if by the directive ++@t{~@i{w},@i{q},,,,@i{padchar}E}, where @i{w} and @i{padchar} are ++present or omitted according to whether they were present or omitted in ++the @t{~$} directive, and where @i{q}=@i{d}+@i{n}- 1, ++where @i{d} and @i{n} are the (possibly default) values given to the ++@t{~$} directive. ++ ++If @i{arg} is a @i{rational} ++number, then it is coerced to be a @i{single float} ++and then printed. Alternatively, an implementation is permitted to ++process a @i{rational} number by any ++other method that has essentially the ++same behavior but avoids loss of precision or overflow ++because of the coercion. ++ ++If @i{arg} is a @i{complex} number or some non-numeric ++@i{object}, ++then it is printed using the format directive @t{~@i{w}D}, ++thereby printing it in decimal radix and a minimum field width of @i{w}. ++ ++@t{~$} binds @b{*print-escape*} to @i{false} ++ ++ and @b{*print-readably*} to @i{false}. ++ ++@node FORMAT Printer Operations, FORMAT Pretty Printer Operations, FORMAT Floating-Point Printers, Formatted Output ++@subsection FORMAT Printer Operations ++ ++@menu ++* Tilde A-> Aesthetic:: ++* Tilde S-> Standard:: ++* Tilde W-> Write:: ++@end menu ++ ++@node Tilde A-> Aesthetic, Tilde S-> Standard, FORMAT Printer Operations, FORMAT Printer Operations ++@subsubsection Tilde A: Aesthetic ++ ++An @i{arg}, any @i{object}, ++is printed without escape characters ++(as by @b{princ}). If @i{arg} is a @i{string}, ++its @i{characters} ++will be output verbatim. ++If @i{arg} is @b{nil} it will be printed as @b{nil}; ++the @i{colon} modifier (@t{~:A}) will cause an @i{arg} of @b{nil} to be printed as @t{()}, ++but if @i{arg} is a composite structure, such as a @i{list} or @i{vector}, ++any contained occurrences of @b{nil} will still be printed as @b{nil}. ++ ++@t{~@i{mincol}A} inserts spaces on the right, if necessary, to make the ++width at least @i{mincol} columns. The @t{@@} ++modifier causes the spaces ++to be inserted on the left rather than the right. ++ ++@t{~@i{mincol},@i{colinc},@i{minpad},@i{padchar}A} ++is the full form of @t{~A}, ++which allows control of the padding. ++The @i{string} is padded on the right (or on the left if the ++@t{@@} modifier is used) with at least @i{minpad} copies ++of @i{padchar}; padding characters are then inserted @i{colinc} characters ++at a time until the total width is at least @i{mincol}. ++The defaults are @t{0} for @i{mincol} and @i{minpad}, @t{1} for @i{colinc}, ++and the space character for @i{padchar}. ++ ++@t{~A} binds @b{*print-escape*} to @i{false}, ++ ++and @b{*print-readably*} to @i{false}. ++ ++@node Tilde S-> Standard, Tilde W-> Write, Tilde A-> Aesthetic, FORMAT Printer Operations ++@subsubsection Tilde S: Standard ++ ++This is just like @t{~A}, but @i{arg} is printed with escape ++characters (as by @b{prin1} rather than @t{princ}). The output is ++therefore suitable for input to @b{read}. @t{~S} accepts ++all the arguments and modifiers that @t{~A} does. ++ ++@t{~S} binds @b{*print-escape*} to @b{t}. ++ ++@node Tilde W-> Write, , Tilde S-> Standard, FORMAT Printer Operations ++@subsubsection Tilde W: Write ++ ++An argument, any @i{object}, is printed obeying every printer control ++variable (as by @b{write}). In addition, @t{~W} interacts correctly with depth ++abbreviation, by not resetting the depth counter to zero. @t{~W} does not ++accept parameters. If given the @i{colon} modifier, @t{~W} binds @b{*print-pretty*} ++to @i{true}. If given the @i{at-sign} modifier, @t{~W} binds @b{*print-level*} ++and @b{*print-length*} to @b{nil}. ++ ++@t{~W} provides automatic support for the detection of circularity and ++sharing. If the @i{value} of @b{*print-circle*} is not @b{nil} and @t{~W} is applied ++to an argument that is a circular (or shared) reference, an appropriate ++@t{#@i{n}#} marker is inserted in the output instead of printing the argument. ++ ++@node FORMAT Pretty Printer Operations, FORMAT Layout Control, FORMAT Printer Operations, Formatted Output ++@subsection FORMAT Pretty Printer Operations ++ ++The following constructs provide access to the @i{pretty printer}: ++ ++@menu ++* Tilde Underscore-> Conditional Newline:: ++* Tilde Less-Than-Sign-> Logical Block:: ++* Tilde I-> Indent:: ++* Tilde Slash-> Call Function:: ++@end menu ++ ++@node Tilde Underscore-> Conditional Newline, Tilde Less-Than-Sign-> Logical Block, FORMAT Pretty Printer Operations, FORMAT Pretty Printer Operations ++@subsubsection Tilde Underscore: Conditional Newline ++ ++Without any modifiers, @t{~_} is the same as @t{(pprint-newline :linear)}. ++@t{~@@_} is the same as @t{(pprint-newline :miser)}. ++@t{~:_} is the same as @t{(pprint-newline :fill)}. ++@t{~:@@_} is the same as @t{(pprint-newline :mandatory)}. ++ ++@node Tilde Less-Than-Sign-> Logical Block, Tilde I-> Indent, Tilde Underscore-> Conditional Newline, FORMAT Pretty Printer Operations ++@subsubsection Tilde Less-Than-Sign: Logical Block ++ ++@t{~<...~:>} ++ ++If @t{~:>} is used to terminate a @t{~<...~>}, ++the directive is equivalent to a call to @b{pprint-logical-block}. ++The argument corresponding to the @t{~<...~:>} directive is treated in ++the same way as the @i{list} argument to @b{pprint-logical-block}, ++thereby providing automatic support for non-@i{list} arguments and ++the detection of circularity, sharing, and depth abbreviation. ++The portion of the @i{control-string} nested within the @t{~<...~:>} ++specifies the @t{:prefix} (or @t{:per-line-prefix}), @t{:suffix}, ++and body of the @b{pprint-logical-block}. ++ ++The @i{control-string} portion enclosed by @t{~<...~:>} can be divided ++into segments @t{~<@i{prefix}~;@i{body}~;@i{suffix}~:>} ++by @t{~;} directives. If the first section is terminated by @t{~@@;}, ++it specifies a per-line prefix rather than a simple prefix. ++The @i{prefix} and @i{suffix} cannot contain format directives. ++An error is signaled if either the prefix or suffix fails to be a ++constant string or if the enclosed portion is divided into more than three segments. ++ ++If the enclosed portion is divided into only two segments, the @i{suffix} ++defaults to the null string. If the enclosed portion consists of only ++a single segment, both the @i{prefix} and the @i{suffix} default to ++the null string. If the @i{colon} modifier is used (@i{i.e.}, @t{~:<...~:>}), ++the @i{prefix} and @i{suffix} default to @t{"("} and @t{")"} ++(respectively) instead of the null string. ++ ++The body segment can be any arbitrary @i{format string}. ++This @i{format string} is applied to the elements of the list ++corresponding to the @t{~<...~:>} directive as a whole. ++Elements are extracted from this list using @b{pprint-pop}, ++thereby providing automatic support for malformed lists, and the detection ++of circularity, sharing, and length abbreviation. ++Within the body segment, @t{~@t{^}} acts like @b{pprint-exit-if-list-exhausted}. ++ ++@t{~<...~:>} supports a feature not supported by @b{pprint-logical-block}. ++If @t{~:@@>} is used to terminate the directive (@i{i.e.}, @t{~<...~:@@>}), ++then a fill-style conditional newline is automatically inserted after each ++group of blanks immediately contained in the body (except for blanks ++after a ~<@i{Newline}> directive). This makes it easy to achieve the ++equivalent of paragraph filling. ++ ++If the @i{at-sign} modifier is used with @t{~<...~:>}, the entire remaining argument ++list is passed to the directive as its argument. All of the remaining ++arguments are always consumed by @t{~@@<...~:>}, even if they are not all used ++by the @i{format string} nested in the directive. Other than the difference in ++its argument, @t{~@@<...~:>} is exactly the same as @t{~<...~:>} except that ++circularity detection is not applied if @t{~@@<...~:>} is encountered at top ++level in a @i{format string}. This ensures that circularity detection is ++applied only to data lists, not to @i{format argument} @i{lists}. ++ ++@t{" . #@i{n}#"} is printed if circularity or sharing has to be indicated ++for its argument as a whole. ++ ++To a considerable extent, the basic form of the directive @t{~<...~>} is ++incompatible with the dynamic control of the arrangement of output by ++@t{~W}, @t{~_}, @t{~<...~:>}, @t{~I}, and @t{~:T}. As a result, an error ++is signaled if any of these directives is nested within @t{~<...~>}. ++Beyond this, an error is also signaled if the @t{~<...~:;...~>} form of ++@t{~<...~>} is used in the same @i{format string} with ++@t{~W}, @t{~_}, @t{~<...~:>}, @t{~I}, or @t{~:T}. ++ ++See also @ref{Tilde Less-Than-Sign-> Justification}. ++ ++@node Tilde I-> Indent, Tilde Slash-> Call Function, Tilde Less-Than-Sign-> Logical Block, FORMAT Pretty Printer Operations ++@subsubsection Tilde I: Indent ++ ++@t{~@i{n}I} is the same as @t{(pprint-indent :block n)}. ++ ++@t{~@i{n}:I} is the same as @t{(pprint-indent :current n)}. ++In both cases, @i{n} defaults to zero, if it is omitted. ++ ++@node Tilde Slash-> Call Function, , Tilde I-> Indent, FORMAT Pretty Printer Operations ++@subsubsection Tilde Slash: Call Function ++ ++@t{~/@i{name}/} ++ ++User defined functions can be called from within a format ++string by using the directive @t{~/@i{name}/}. ++The @i{colon} modifier, the @i{at-sign} modifier, and arbitrarily many parameters ++can be specified with the @t{~/@i{name}/} directive. ++@i{name} can be any arbitrary string that does not contain a "/". ++All of the characters in @i{name} are treated as if they were upper case. ++If @i{name} contains a single @i{colon} (@t{:}) or double @i{colon} (@t{::}), ++then everything up to but not including the first @t{":"} or @t{"::"} ++is taken to be a @i{string} that names a @i{package}. ++Everything after the first @t{":"} or @t{"::"} (if any) is taken to be a ++@i{string} that names a @t{symbol}. The function corresponding to a ++@t{~/name/} directive is obtained by looking up the @i{symbol} ++that has the indicated name in the indicated @i{package}. ++If @i{name} does not contain a @t{":"} or @t{"::"}, ++then the whole @i{name} string is looked up in the @t{COMMON-LISP-USER} @i{package}. ++ ++When a @t{~/name/} directive is encountered, ++the indicated function is called with four or more arguments. ++The first four arguments are: ++ the output stream, ++ the @i{format argument} corresponding to the directive, ++ a @i{generalized boolean} that is @i{true} if the @i{colon} modifier was used, ++ and a @i{generalized boolean} that is @i{true} if the @i{at-sign} modifier was used. ++The remaining arguments consist of any parameters specified with the directive. ++The function should print the argument appropriately. ++Any values returned by the function are ignored. ++ ++The three @i{functions} ++ @b{pprint-linear}, ++ @b{pprint-fill}, ++ and @b{pprint-tabular} ++are specifically designed so that they can be called by @t{~/.../} ++(@i{i.e.}, @t{~/pprint-linear/}, @t{~/pprint-fill/}, and @t{~/pprint-tabular/}). ++In particular they take @i{colon} and @i{at-sign} arguments. ++ ++@node FORMAT Layout Control, FORMAT Control-Flow Operations, FORMAT Pretty Printer Operations, Formatted Output ++@subsection FORMAT Layout Control ++ ++@menu ++* Tilde T-> Tabulate:: ++* Tilde Less-Than-Sign-> Justification:: ++* Tilde Greater-Than-Sign-> End of Justification:: ++@end menu ++ ++@node Tilde T-> Tabulate, Tilde Less-Than-Sign-> Justification, FORMAT Layout Control, FORMAT Layout Control ++@subsubsection Tilde T: Tabulate ++ ++This spaces over to a given column. ++@t{~@i{colnum},@i{colinc}T} will output ++sufficient spaces to move the cursor to column @i{colnum}. If the cursor ++is already at or beyond column @i{colnum}, it will output spaces to move it to ++column @i{colnum}+@i{k}*@i{colinc} for the smallest positive integer ++@i{k} possible, unless @i{colinc} is zero, in which case no spaces ++are output if the cursor is already at or beyond column @i{colnum}. ++@i{colnum} and @i{colinc} default to @t{1}. ++ ++If for some reason the current absolute column position cannot be determined ++by direct inquiry, ++@b{format} ++may be able to deduce the current column position by noting ++that certain directives (such as @t{~%}, or @t{~&}, ++or @t{~A} ++with the argument being a string containing a newline) cause ++the column position to be reset to zero, and counting the number of characters ++emitted since that point. If that fails, @b{format} ++may attempt a ++similar deduction on the riskier assumption that the destination was ++at column zero when @b{format} ++was invoked. If even this heuristic fails ++or is implementationally inconvenient, at worst ++the @t{~T} operation will simply output two spaces. ++ ++@t{~@@T} performs relative tabulation. ++@t{~@i{colrel},@i{colinc}@@T} outputs @i{colrel} spaces ++and then outputs the smallest non-negative ++number of additional spaces necessary to move the cursor ++to a column that is a multiple ++of @i{colinc}. For example, the directive ++@t{~3,8@@T} outputs ++three spaces and then moves the cursor to a ``standard multiple-of-eight ++tab stop'' if not at one already. ++If the current output column cannot be determined, however, ++then @i{colinc} is ignored, and exactly @i{colrel} spaces are output. ++ ++If the @i{colon} modifier is used with the @t{~T} directive, ++the tabbing computation is done relative to the horizontal position where the ++section immediately containing the directive begins, rather than with ++respect to a horizontal position of zero. The numerical parameters are ++both interpreted as being in units of @i{ems} and both default to @t{1}. ++@t{~@i{n},@i{m}:T} is the same as ++ @t{(pprint-tab :section @i{n} @i{m})}. ++@t{~@i{n},@i{m}:@@T} is the same as ++ @t{(pprint-tab :section-relative @i{n} @i{m})}. ++ ++@node Tilde Less-Than-Sign-> Justification, Tilde Greater-Than-Sign-> End of Justification, Tilde T-> Tabulate, FORMAT Layout Control ++@subsubsection Tilde Less-Than-Sign: Justification ++ ++@t{~@i{mincol},@i{colinc},@i{minpad},@i{padchar}<@i{str}~>} ++ ++This justifies the text produced by processing @i{str} ++within a field at least @i{mincol} columns wide. @i{str} ++may be divided up into segments with @t{~;}, in which case the ++spacing is evenly divided between the text segments. ++ ++With no modifiers, the leftmost text segment is left justified in the ++field, and the rightmost text segment is right justified. If there is ++only one text element, as a special case, it is right justified. ++The @t{:} modifier causes ++spacing to be introduced before the first text segment; the ++@t{@@} modifier causes spacing to be added after the last. ++The @i{minpad} parameter (default @t{0}) is the minimum number of ++padding characters to be output between each segment. ++The padding character is supplied by @i{padchar}, ++which defaults to the space character. ++If the total width needed to satisfy these constraints is greater ++than @i{mincol}, then the width used is @i{mincol}+@i{k}*@i{colinc} ++for the smallest possible non-negative integer value @i{k}. ++@i{colinc} defaults to @t{1}, and @i{mincol} defaults to @t{0}. ++ ++Note that @i{str} may include @b{format} directives. ++All the clauses in @i{str} are processed in order; ++it is the resulting pieces of text that are justified. ++ ++The @t{~@t{^} } directive may be used to terminate processing of the ++clauses prematurely, in which case only the completely processed clauses ++are justified. ++ ++If the first clause of a @t{~<} ++is terminated with @t{~:;} instead of ++@t{~;}, then it is used in a special way. All of the clauses are ++processed (subject to @t{~@t{^} }, of course), but the ++first one is not used ++in performing the spacing and padding. When the padded result has been ++determined, then if it will fit on the current line of output, it is ++output, and the text for the first clause is discarded. If, however, the ++padded text will not fit on the current line, then the text segment for ++the first clause is output before the padded text. The first clause ++ought to contain a newline (such as a @t{~%} directive). The first ++clause is always processed, and so any arguments it refers to will be ++used; the decision is whether to use the resulting segment of text, not ++whether to process the first clause. If the @t{~:;} has a prefix ++parameter @i{n}, then the padded text must fit on the current line with ++@i{n} character positions to spare to avoid outputting the first clause's ++text. For example, the control string ++ ++@example ++ "~ ++@end example ++ ++can be used to print a list of items separated by commas without ++breaking items over line boundaries, beginning each line with ++@t{;; }. The prefix parameter ++@t{1} in @t{~1:;} accounts for the width of the ++comma that will follow the justified item if it is not the last ++element in the list, or the period ++if it is. If @t{~:;} has a second ++prefix parameter, then it is used as the width of the line, ++thus overriding the natural line width of the output stream. To make ++the preceding example use a line width of 50, one would write ++ ++@example ++ "~ ++@end example ++ ++If the second argument is not supplied, then @b{format} uses the ++line width of the @i{destination} output stream. ++If this cannot be determined (for example, when producing a ++@i{string} result), then @b{format} uses @t{72} as the line length. ++ ++See also @ref{Tilde Less-Than-Sign-> Logical Block}. ++ ++@node Tilde Greater-Than-Sign-> End of Justification, , Tilde Less-Than-Sign-> Justification, FORMAT Layout Control ++@subsubsection Tilde Greater-Than-Sign: End of Justification ++ ++@t{~>} terminates a @t{~<}. ++The consequences of using it elsewhere are undefined. ++ ++@node FORMAT Control-Flow Operations, FORMAT Miscellaneous Operations, FORMAT Layout Control, Formatted Output ++@subsection FORMAT Control-Flow Operations ++ ++@menu ++* Tilde Asterisk-> Go-To:: ++* Tilde Left-Bracket-> Conditional Expression:: ++* Tilde Right-Bracket-> End of Conditional Expression:: ++* Tilde Left-Brace-> Iteration:: ++* Tilde Right-Brace-> End of Iteration:: ++* Tilde Question-Mark-> Recursive Processing:: ++@end menu ++ ++@node Tilde Asterisk-> Go-To, Tilde Left-Bracket-> Conditional Expression, FORMAT Control-Flow Operations, FORMAT Control-Flow Operations ++@subsubsection Tilde Asterisk: Go-To ++ ++The next @i{arg} is ignored. ++@t{~@i{n}*} ignores the next @i{n} arguments. ++ ++@t{~:*} backs up in the list of ++arguments so that the argument last processed will be processed again. ++@t{~@i{n}:*} backs up @i{n} arguments. ++ ++When within a @t{~@{} construct ++(see below), the ignoring (in either direction) is relative to the list ++of arguments being processed by the iteration. ++ ++@t{~@i{n}@@*} ++goes to the @i{n}th @i{arg}, where 0 means the first one; ++@i{n} defaults to 0, so @t{~@@*} goes back to the first @i{arg}. ++Directives after a @t{~@i{n}@@*} ++will take arguments in sequence beginning with the one gone to. ++When within a @t{~@{} construct, the ``goto'' ++is relative to the list of arguments being processed by the iteration. ++ ++@node Tilde Left-Bracket-> Conditional Expression, Tilde Right-Bracket-> End of Conditional Expression, Tilde Asterisk-> Go-To, FORMAT Control-Flow Operations ++@subsubsection Tilde Left-Bracket: Conditional Expression ++ ++@t{~[@i{str0}~;@i{str1}~;@i{...}~;@i{strn}~]} ++ ++This is a set of control strings, called @i{clauses}, one of which is ++chosen and used. The clauses are separated by @t{~;} ++and the construct is terminated by @t{~]}. For example, ++ ++@t{"~[Siamese~;Manx~;Persian~] Cat"} ++ ++The @i{arg}th ++clause is selected, where the first clause is number 0. ++If a prefix parameter is given (as @t{~@i{n}[}), ++then the parameter is used instead of an argument. ++If @i{arg} is out of range then no clause is selected ++and no error is signaled. ++After the selected alternative has been processed, the control string ++continues after the @t{~]}. ++ ++@t{~[@i{str0}~;@i{str1}~;@i{...}~;@i{strn}~:;@i{default}~]} ++has a default case. ++If the @i{last} @t{~;} used to separate clauses ++is @t{~:;} instead, then the last clause is an else clause ++that is performed if no other clause is selected. ++For example: ++ ++@t{"~[Siamese~;Manx~;Persian~:;Alley~] Cat"} ++ ++@t{~:[@i{alternative}~;@i{consequent}~]} ++selects the @i{alternative} control string if @i{arg} is @i{false}, ++and selects the @i{consequent} control string otherwise. ++ ++@t{~@@[@i{consequent}~]} ++tests the argument. If it is @i{true}, ++then the argument is not used up by the @t{~[} command ++but remains as the next one to be processed, ++and the one clause @i{consequent} is processed. ++If the @i{arg} is @i{false}, then the argument is used up, ++and the clause is not processed. ++The clause therefore should normally use exactly one argument, ++and may expect it to be @i{non-nil}. ++For example: ++ ++@example ++ (setq *print-level* nil *print-length* 5) ++ (format nil ++ "~@@[ print level = ~D~]~@@[ print length = ~D~]" ++ *print-level* *print-length*) ++@result{} " print length = 5" ++@end example ++ ++Note also that ++ ++@example ++ (format @i{stream} "...~@@[@i{str}~]..." ...) ++@equiv{} (format @i{stream} "...~:[~;~:*@i{str}~]..." ...) ++@end example ++ ++The combination of @t{~[} and @t{#} is useful, for ++example, for dealing with English conventions for printing lists: ++ ++@example ++ (setq foo "Items:~#[ none~; ~S~; ~S and ~S~ ++ ~:;~@@@{~#[~; and~] ~S~@t{^} ,~@}~].") ++ (format nil foo) @result{} "Items: none." ++ (format nil foo 'foo) @result{} "Items: FOO." ++ (format nil foo 'foo 'bar) @result{} "Items: FOO and BAR." ++ (format nil foo 'foo 'bar 'baz) @result{} "Items: FOO, BAR, and BAZ." ++ (format nil foo 'foo 'bar 'baz 'quux) @result{} "Items: FOO, BAR, BAZ, and QUUX." ++@end example ++ ++@node Tilde Right-Bracket-> End of Conditional Expression, Tilde Left-Brace-> Iteration, Tilde Left-Bracket-> Conditional Expression, FORMAT Control-Flow Operations ++@subsubsection Tilde Right-Bracket: End of Conditional Expression ++ ++@t{~]} terminates a @t{~[}. ++The consequences of using it elsewhere are undefined. ++ ++@node Tilde Left-Brace-> Iteration, Tilde Right-Brace-> End of Iteration, Tilde Right-Bracket-> End of Conditional Expression, FORMAT Control-Flow Operations ++@subsubsection Tilde Left-Brace: Iteration ++ ++@t{~@{@i{str}~@}} ++ ++This is an iteration construct. The argument should be a @i{list}, ++which is used as a set of arguments ++as if for a recursive call to @b{format}. ++The @i{string} @i{str} is used repeatedly as the control string. ++Each iteration can absorb as many elements of the @i{list} as it likes ++as arguments; ++if @i{str} uses up two arguments by itself, then two elements of the ++@i{list} will get used up each time around the loop. ++If before any iteration step the @i{list} ++is empty, then the iteration is terminated. ++Also, if a prefix parameter @i{n} is given, then there will be at most @i{n} ++repetitions of processing of @i{str}. ++Finally, the @t{~@t{^} } directive can be ++used to terminate the iteration prematurely. ++ ++For example: ++ ++@example ++ (format nil "The winners are:~@{ ~S~@}." ++ '(fred harry jill)) ++@result{} "The winners are: FRED HARRY JILL." ++ (format nil "Pairs:~@{ <~S,~S>~@}." ++ '(a 1 b 2 c 3)) ++@result{} "Pairs: ." ++@end example ++ ++@t{~:@{ @i{str}~@} } is similar, ++but the argument should be a @i{list} of sublists. ++At each repetition step, one sublist ++is used as the set of arguments for ++processing @i{str}; on the next repetition, a new sublist ++is used, whether ++or not all of the last sublist had been processed. ++For example: ++ ++@example ++ (format nil "Pairs:~:@{ <~S,~S>~@} ." ++ '((a 1) (b 2) (c 3))) ++@result{} "Pairs: ." ++@end example ++ ++@t{~@@@{ @i{str}~@} } ++is similar to @t{~@{ @i{str}~@} }, but instead of ++using one argument that is a list, all the remaining arguments ++are used as the list of arguments for the iteration. ++Example: ++ ++@example ++ (format nil "Pairs:~@@@{ <~S,~S>~@} ." 'a 1 'b 2 'c 3) ++@result{} "Pairs: ." ++@end example ++ ++If the iteration is terminated before all the remaining arguments are ++consumed, then any arguments not processed by the iteration remain to be ++processed by any directives following the iteration construct. ++ ++@t{~:@@@{ @i{str}~@} } ++combines the features ++of @t{~:@{ @i{str}~@} } ++and @t{~@@@{ @i{str}~@} }. ++All the remaining arguments ++are used, and each one must be a @i{list}. ++On each iteration, the next argument is ++used as a @i{list} of arguments to @i{str}. ++Example: ++ ++@example ++ (format nil "Pairs:~:@@@{ <~S,~S>~@} ." ++ '(a 1) '(b 2) '(c 3)) ++@result{} "Pairs: ." ++@end example ++ ++Terminating the repetition construct with @t{~:@} } ++instead of @t{~@} } ++forces @i{str} to be processed at least once, even if the initial ++list of arguments is null. However, this will not override an explicit ++prefix parameter of zero. ++ ++If @i{str} is empty, then an argument is used as @i{str}. ++It must be a @i{format control} ++and precede any arguments processed by the iteration. As an example, ++the following are equivalent: ++ ++@example ++ (apply #'format stream string arguments) ++ @equiv{} (format stream "~1@{~:@}" string arguments) ++@end example ++ ++This will use @t{string} as a formatting string. ++The @t{~1@{ } says it will ++be processed at most once, and the @t{~:@} } ++says it will be processed at least once. ++Therefore it is processed exactly once, using @t{arguments} as the arguments. ++This case may be handled more clearly by the @t{~?} directive, ++but this general feature of @t{~@{ } ++is more powerful than @t{~?}. ++ ++@node Tilde Right-Brace-> End of Iteration, Tilde Question-Mark-> Recursive Processing, Tilde Left-Brace-> Iteration, FORMAT Control-Flow Operations ++@subsubsection Tilde Right-Brace: End of Iteration ++ ++@t{~@}} terminates a @t{~@{}. ++The consequences of using it elsewhere are undefined. ++ ++@node Tilde Question-Mark-> Recursive Processing, , Tilde Right-Brace-> End of Iteration, FORMAT Control-Flow Operations ++@subsubsection Tilde Question-Mark: Recursive Processing ++ ++The next @i{arg} must be a @i{format control}, and the one after it a @i{list}; ++both are consumed by the @t{~?} directive. ++The two are processed as a @i{control-string}, with the elements of the @i{list} ++as the arguments. Once the recursive processing ++has been finished, the processing of the control ++string containing the @t{~?} directive is resumed. ++Example: ++ ++@example ++ (format nil "~? ~D" "<~A ~D>" '("Foo" 5) 7) @result{} " 7" ++ (format nil "~? ~D" "<~A ~D>" '("Foo" 5 14) 7) @result{} " 7" ++@end example ++ ++Note that in the second example three arguments are supplied ++to the @i{format string} @t{"<~A ~D>"}, but only two are processed ++and the third is therefore ignored. ++ ++With the @t{@@} ++modifier, only one @i{arg} is directly consumed. ++The @i{arg} must be a @i{string}; ++it is processed as part of the control ++string as if it had appeared in place of the @t{~@@?} construct, ++and any directives in the recursively processed control string may ++consume arguments of the control string containing the @t{~@@?} ++directive. ++Example: ++ ++@example ++ (format nil "~@@? ~D" "<~A ~D>" "Foo" 5 7) @result{} " 7" ++ (format nil "~@@? ~D" "<~A ~D>" "Foo" 5 14 7) @result{} " 14" ++@end example ++ ++@node FORMAT Miscellaneous Operations, FORMAT Miscellaneous Pseudo-Operations, FORMAT Control-Flow Operations, Formatted Output ++@subsection FORMAT Miscellaneous Operations ++ ++@menu ++* Tilde Left-Paren-> Case Conversion:: ++* Tilde Right-Paren-> End of Case Conversion:: ++* Tilde P-> Plural:: ++@end menu ++ ++@node Tilde Left-Paren-> Case Conversion, Tilde Right-Paren-> End of Case Conversion, FORMAT Miscellaneous Operations, FORMAT Miscellaneous Operations ++@subsubsection Tilde Left-Paren: Case Conversion ++ ++@t{~(@i{str}~)} ++ ++The contained control string @i{str} is processed, and what it produces ++is subject to case conversion. ++ ++With no flags, every @i{uppercase} @i{character} ++is converted to the corresponding @i{lowercase} @i{character}. ++ ++@t{~:(} capitalizes all words, as if by @b{string-capitalize}. ++ ++@t{~@@(} ++capitalizes just the first word and forces the rest to lower ++case. ++ ++@t{~:@@(} converts every lowercase character ++to the corresponding uppercase character. ++ ++In this example @t{~@@(} is used to cause the first word ++produced by @t{~@@R} to be capitalized: ++ ++@example ++ (format nil "~@@R ~(~@@R~)" 14 14) ++@result{} "XIV xiv" ++ (defun f (n) (format nil "~@@(~R~) error~:P detected." n)) @result{} F ++ (f 0) @result{} "Zero errors detected." ++ (f 1) @result{} "One error detected." ++ (f 23) @result{} "Twenty-three errors detected." ++@end example ++ ++When case conversions appear nested, the outer conversion dominates, ++as illustrated in the following example: ++ ++@example ++ (format nil "~@@(how is ~:(BOB SMITH~)?~)") ++ @result{} "How is bob smith?" ++ @i{NOT}@result{} "How is Bob Smith?" ++@end example ++ ++@node Tilde Right-Paren-> End of Case Conversion, Tilde P-> Plural, Tilde Left-Paren-> Case Conversion, FORMAT Miscellaneous Operations ++@subsubsection Tilde Right-Paren: End of Case Conversion ++ ++@t{~)} terminates a @t{~(}. ++The consequences of using it elsewhere are undefined. ++ ++@node Tilde P-> Plural, , Tilde Right-Paren-> End of Case Conversion, FORMAT Miscellaneous Operations ++@subsubsection Tilde P: Plural ++ ++If @i{arg} is not @b{eql} ++to the integer @t{1}, a lowercase @t{s} is ++printed; if @i{arg} is @b{eql} to @t{1}, nothing is printed. ++If @i{arg} is a floating-point @t{1.0}, the @t{s} is ++printed. ++ ++@t{~:P} does the same thing, ++after doing a @t{~:*} to back up one argument; ++that is, it prints a lowercase @t{s} if the previous argument was not ++@t{1}. ++ ++@t{~@@P} ++prints @t{y} if the argument is @t{1}, or @t{ies} if it is ++not. @t{~:@@P} does the same thing, but backs up first. ++ ++@example ++ (format nil "~D tr~:@@P/~D win~:P" 7 1) @result{} "7 tries/1 win" ++ (format nil "~D tr~:@@P/~D win~:P" 1 0) @result{} "1 try/0 wins" ++ (format nil "~D tr~:@@P/~D win~:P" 1 3) @result{} "1 try/3 wins" ++@end example ++ ++@node FORMAT Miscellaneous Pseudo-Operations, Additional Information about FORMAT Operations, FORMAT Miscellaneous Operations, Formatted Output ++@subsection FORMAT Miscellaneous Pseudo-Operations ++ ++@menu ++* Tilde Semicolon-> Clause Separator:: ++* Tilde Circumflex-> Escape Upward:: ++* Tilde Newline-> Ignored Newline:: ++@end menu ++ ++@node Tilde Semicolon-> Clause Separator, Tilde Circumflex-> Escape Upward, FORMAT Miscellaneous Pseudo-Operations, FORMAT Miscellaneous Pseudo-Operations ++@subsubsection Tilde Semicolon: Clause Separator ++ ++This separates clauses in @t{~[} and @t{~<} constructs. ++The consequences of using it elsewhere are undefined. ++ ++@node Tilde Circumflex-> Escape Upward, Tilde Newline-> Ignored Newline, Tilde Semicolon-> Clause Separator, FORMAT Miscellaneous Pseudo-Operations ++@subsubsection Tilde Circumflex: Escape Upward ++ ++@t{~@t{^} } ++ ++This is an escape construct. If there are no more arguments remaining to ++be processed, then the immediately ++enclosing @t{~@{ } or @t{~<} construct ++is terminated. If there is no such enclosing construct, then the entire ++formatting operation is terminated. ++In the @t{~<} case, the formatting ++is performed, but no more segments are processed before doing the ++justification. ++@t{~@t{^} } may appear anywhere in a @t{~@{ } ++construct. ++ ++@example ++ (setq donestr "Done.~@t{^} ~D warning~:P.~@t{^} ~D error~:P.") ++@result{} "Done.~@t{^} ~D warning~:P.~@t{^} ~D error~:P." ++ (format nil donestr) @result{} "Done." ++ (format nil donestr 3) @result{} "Done. 3 warnings." ++ (format nil donestr 1 5) @result{} "Done. 1 warning. 5 errors." ++@end example ++ ++If a prefix parameter is given, then termination occurs if the parameter ++is zero. (Hence @t{~@t{^}} is equivalent to ++@t{~#@t{^}}.) If two ++parameters are given, termination occurs if they are equal. ++ ++[Reviewer Note by Barmar: Which equality predicate?] If three ++parameters are given, termination occurs if the first is less than or ++equal to the second and the second is less than or equal to the third. ++Of course, this is useless if all the prefix parameters are constants; at ++least one of them should be a @t{#} or a @t{V} parameter. ++ ++If @t{~@t{^}} is used within a @t{~:@{ } ++construct, then it terminates ++the current iteration step because in the standard case it tests for ++remaining arguments of the current step only; the next iteration step ++commences immediately. @t{~:@t{^}} is used to terminate ++the iteration process. ++ ++@t{~:@t{^}} ++may be used only if the command it would terminate is ++@t{~:@{ } or @t{~:@@@{ }. ++The entire iteration process is terminated if and only if the sublist that is ++supplying the arguments for the current iteration step is the last sublist in ++the case of @t{~:@{ }, ++or the last @b{format} ++argument in the case of @t{~:@@@{ }. ++@t{~:@t{^}} is not ++equivalent to @t{~#:@t{^}}; ++the latter terminates the entire iteration if and only if no ++arguments remain for the current iteration step. ++For example: ++ ++@example ++ (format nil "~:@{ ~@@?~:@t{^} ...~@} " '(("a") ("b"))) @result{} "a...b" ++@end example ++ ++If @t{~@t{^}} appears within a control string being processed ++under the control of a @t{~?} directive, but not within ++any @t{~@{ } or @t{~<} construct within that string, ++then the string being ++processed will be terminated, thereby ending processing ++of the @t{~?} directive. Processing then ++continues within the string ++containing the @t{~?} directive at the point following that directive. ++ ++If @t{~@t{^}} ++appears within a @t{~[} or @t{~(} construct, ++then all the commands up to the @t{~@t{^}} are properly selected ++or case-converted, ++the @t{~[} or @t{~(} processing is terminated, ++and the outward search continues ++for a @t{~@{ } or @t{~<} construct ++to be terminated. For example: ++ ++@example ++ (setq tellstr "~@@(~@@[~R~]~@t{^} ~A!~)") ++@result{} "~@@(~@@[~R~]~@t{^} ~A!~)" ++ (format nil tellstr 23) @result{} "Twenty-three!" ++ (format nil tellstr nil "losers") @result{} " Losers!" ++ (format nil tellstr 23 "losers") @result{} "Twenty-three losers!" ++@end example ++ ++Following are examples of the use of @t{~@t{^}} ++within a @t{~<} construct. ++ ++@example ++ (format nil "~15<~S~;~@t{^}~S~;~@t{^}~S~>" 'foo) ++@result{} " FOO" ++ (format nil "~15<~S~;~@t{^}~S~;~@t{^}~S~>" 'foo 'bar) ++@result{} "FOO BAR" ++ (format nil "~15<~S~;~@t{^}~S~;~@t{^}~S~>" 'foo 'bar 'baz) ++@result{} "FOO BAR BAZ" ++@end example ++ ++@node Tilde Newline-> Ignored Newline, , Tilde Circumflex-> Escape Upward, FORMAT Miscellaneous Pseudo-Operations ++@subsubsection Tilde Newline: Ignored Newline ++ ++@i{Tilde} immediately followed by a @i{newline} ignores the @i{newline} ++and any following non-newline @i{whitespace}_1 characters. ++With a @t{:}, ++ the @i{newline} is ignored, ++ but any following @i{whitespace}_1 is left in place. ++With an @t{@@}, ++ the @i{newline} is left in place, ++ but any following @i{whitespace}_1 is ignored. ++For example: ++ ++@example ++ (defun type-clash-error (fn nargs argnum right-type wrong-type) ++ (format *error-output* ++ "~&~S requires its ~:[~:R~;~*~]~ ++ argument to be of type ~S,~ ++ with an argument of type ~S.~ ++ fn (eql nargs 1) argnum right-type wrong-type)) ++ (type-clash-error 'aref nil 2 'integer 'vector) prints: ++AREF requires its second argument to be of type INTEGER, ++but it was called with an argument of type VECTOR. ++NIL ++ (type-clash-error 'car 1 1 'list 'short-float) prints: ++CAR requires its argument to be of type LIST, ++but it was called with an argument of type SHORT-FLOAT. ++NIL ++@end example ++ ++Note that in this example newlines appear in the output only as specified ++by the @t{~&} and @t{~%} directives; the ++actual newline characters ++in the control string are suppressed because each is preceded by a tilde. ++ ++@node Additional Information about FORMAT Operations, Examples of FORMAT, FORMAT Miscellaneous Pseudo-Operations, Formatted Output ++@subsection Additional Information about FORMAT Operations ++ ++@menu ++* Nesting of FORMAT Operations:: ++* Missing and Additional FORMAT Arguments:: ++* Additional FORMAT Parameters:: ++* Undefined FORMAT Modifier Combinations:: ++@end menu ++ ++@node Nesting of FORMAT Operations, Missing and Additional FORMAT Arguments, Additional Information about FORMAT Operations, Additional Information about FORMAT Operations ++@subsubsection Nesting of FORMAT Operations ++ ++The case-conversion, conditional, iteration, and justification ++constructs can contain other formatting constructs by bracketing them. ++These constructs must nest properly with respect to each other. ++For example, it is not legitimate to put the start of a case-conversion ++construct in each arm of a conditional and the ++end of the case-conversion construct outside the conditional: ++ ++@example ++ (format nil "~:[abc~:@@(def~;ghi~ ++:@@(jkl~]mno~)" x) ;Invalid! ++@end example ++ ++This notation is invalid because the @t{~[...~;...~]} ++and @t{~(...~)} constructs are not properly nested. ++ ++The processing indirection caused by the @t{~?} directive ++is also a kind of nesting for the purposes of this rule of proper nesting. ++It is not permitted to ++start a bracketing construct within a string processed ++under control of a @t{~?} ++directive and end the construct at some point after the @t{~?} construct ++in the string containing that construct, or vice versa. ++For example, this situation is invalid: ++ ++@example ++ (format nil "~@@?ghi~)" "abc~@@(def") ;Invalid! ++@end example ++ ++This notation ++is invalid because the @t{~?} ++and @t{~(...~)} constructs are not properly nested. ++ ++@node Missing and Additional FORMAT Arguments, Additional FORMAT Parameters, Nesting of FORMAT Operations, Additional Information about FORMAT Operations ++@subsubsection Missing and Additional FORMAT Arguments ++ ++The consequences are undefined if no @i{arg} remains for a directive ++requiring an argument. However, it is permissible for one or more @i{args} ++to remain unprocessed by a directive; such @i{args} are ignored. ++ ++@node Additional FORMAT Parameters, Undefined FORMAT Modifier Combinations, Missing and Additional FORMAT Arguments, Additional Information about FORMAT Operations ++@subsubsection Additional FORMAT Parameters ++ ++The consequences are undefined if a format directive is given more parameters ++than it is described here as accepting. ++ ++@node Undefined FORMAT Modifier Combinations, , Additional FORMAT Parameters, Additional Information about FORMAT Operations ++@subsubsection Undefined FORMAT Modifier Combinations ++ ++The consequences are undefined if @i{colon} or @i{at-sign} modifiers ++are given to a directive in a combination not specifically described ++here as being meaningful. ++ ++@node Examples of FORMAT, Notes about FORMAT, Additional Information about FORMAT Operations, Formatted Output ++@subsection Examples of FORMAT ++ ++@example ++ (format nil "foo") @result{} "foo" ++ (setq x 5) @result{} 5 ++ (format nil "The answer is ~D." x) @result{} "The answer is 5." ++ (format nil "The answer is ~3D." x) @result{} "The answer is 5." ++ (format nil "The answer is ~3,'0D." x) @result{} "The answer is 005." ++ (format nil "The answer is ~:D." (expt 47 x)) ++@result{} "The answer is 229,345,007." ++ (setq y "elephant") @result{} "elephant" ++ (format nil "Look at the ~A!" y) @result{} "Look at the elephant!" ++ (setq n 3) @result{} 3 ++ (format nil "~D item~:P found." n) @result{} "3 items found." ++ (format nil "~R dog~:[s are~; is~] here." n (= n 1)) ++@result{} "three dogs are here." ++ (format nil "~R dog~:*~[s are~; is~:;s are~] here." n) ++@result{} "three dogs are here." ++ (format nil "Here ~[are~;is~:;are~] ~:*~R pupp~:@@P." n) ++@result{} "Here are three puppies." ++@end example ++ ++@example ++ (defun foo (x) ++ (format nil "~6,2F|~6,2,1,'*F|~6,2,,'?F|~6F|~,2F|~F" ++ x x x x x x)) @result{} FOO ++ (foo 3.14159) @result{} " 3.14| 31.42| 3.14|3.1416|3.14|3.14159" ++ (foo -3.14159) @result{} " -3.14|-31.42| -3.14|-3.142|-3.14|-3.14159" ++ (foo 100.0) @result{} "100.00|******|100.00| 100.0|100.00|100.0" ++ (foo 1234.0) @result{} "1234.00|******|??????|1234.0|1234.00|1234.0" ++ (foo 0.006) @result{} " 0.01| 0.06| 0.01| 0.006|0.01|0.006" ++@end example ++ ++@example ++ (defun foo (x) ++ (format nil ++ "~9,2,1,,'*E|~10,3,2,2,'?,,'$E|~ ++ ~9,3,2,-2,' ++ x x x x)) ++ (foo 3.14159) @result{} " 3.14E+0| 31.42$-01|+.003E+03| 3.14E+0" ++ (foo -3.14159) @result{} " -3.14E+0|-31.42$-01|-.003E+03| -3.14E+0" ++ (foo 1100.0) @result{} " 1.10E+3| 11.00$+02|+.001E+06| 1.10E+3" ++ (foo 1100.0L0) @result{} " 1.10L+3| 11.00$+02|+.001L+06| 1.10L+3" ++ (foo 1.1E13) @result{} "*********| 11.00$+12|+.001E+16| 1.10E+13" ++ (foo 1.1L120) @result{} "*********|??????????| ++ (foo 1.1L1200) @result{} "*********|??????????| ++@end example ++ ++As an example of the effects of varying the scale factor, the code ++ ++@example ++ (dotimes (k 13) ++ (format t "~ ++ (- k 5) (- k 5) 3.14159)) ++@end example ++ ++produces the following output: ++ ++@example ++Scale factor -5: | 0.000003E+06| ++Scale factor -4: | 0.000031E+05| ++Scale factor -3: | 0.000314E+04| ++Scale factor -2: | 0.003142E+03| ++Scale factor -1: | 0.031416E+02| ++Scale factor 0: | 0.314159E+01| ++Scale factor 1: | 3.141590E+00| ++Scale factor 2: | 31.41590E-01| ++Scale factor 3: | 314.1590E-02| ++Scale factor 4: | 3141.590E-03| ++Scale factor 5: | 31415.90E-04| ++Scale factor 6: | 314159.0E-05| ++Scale factor 7: | 3141590.E-06| ++@end example ++ ++@example ++ (defun foo (x) ++ (format nil "~9,2,1,,'*G|~9,3,2,3,'?,,'$G|~9,3,2,0,' ++ x x x x)) ++ (foo 0.0314159) @result{} " 3.14E-2|314.2$-04|0.314E-01| 3.14E-2" ++ (foo 0.314159) @result{} " 0.31 |0.314 |0.314 | 0.31 " ++ (foo 3.14159) @result{} " 3.1 | 3.14 | 3.14 | 3.1 " ++ (foo 31.4159) @result{} " 31. | 31.4 | 31.4 | 31. " ++ (foo 314.159) @result{} " 3.14E+2| 314. | 314. | 3.14E+2" ++ (foo 3141.59) @result{} " 3.14E+3|314.2$+01|0.314E+04| 3.14E+3" ++ (foo 3141.59L0) @result{} " 3.14L+3|314.2$+01|0.314L+04| 3.14L+3" ++ (foo 3.14E12) @result{} "*********|314.0$+10|0.314E+13| 3.14E+12" ++ (foo 3.14L120) @result{} "*********|?????????| ++ (foo 3.14L1200) @result{} "*********|?????????| ++@end example ++ ++@example ++ (format nil "~10") @result{} "foo bar" ++ (format nil "~10:") @result{} " foo bar" ++ (format nil "~10") @result{} " foobar" ++ (format nil "~10:") @result{} " foobar" ++ (format nil "~10:@@") @result{} " foo bar " ++ (format nil "~10@@") @result{} "foobar " ++ (format nil "~10:@@") @result{} " foobar " ++@end example ++ ++@example ++ (FORMAT NIL "Written to ~A." #P"foo.bin") ++ @result{} "Written to foo.bin." ++@end example ++ ++@node Notes about FORMAT, , Examples of FORMAT, Formatted Output ++@subsection Notes about FORMAT ++ ++Formatted output is performed not only by @b{format}, ++but by certain other functions that accept a @i{format control} ++the way @b{format} does. For example, error-signaling functions ++such as @b{cerror} accept @i{format controls}. ++ ++Note that the meaning of @b{nil} and @b{t} as destinations to @b{format} ++are different than those of @b{nil} and @b{t} as @i{stream designators}. ++ ++The @t{~@t{^}} should appear only at the beginning of a @t{~<} clause, ++because it aborts the entire clause in which it appears (as well as ++all following clauses). ++ ++@c end of including concept-format ++ ++@node Printer Dictionary, , Formatted Output, Printer ++@section Printer Dictionary ++ ++@c including dict-printer ++ ++@menu ++* copy-pprint-dispatch:: ++* formatter:: ++* pprint-dispatch:: ++* pprint-exit-if-list-exhausted:: ++* pprint-fill:: ++* pprint-indent:: ++* pprint-logical-block:: ++* pprint-newline:: ++* pprint-pop:: ++* pprint-tab:: ++* print-object:: ++* print-unreadable-object:: ++* set-pprint-dispatch:: ++* write:: ++* write-to-string:: ++* *print-array*:: ++* *print-base*:: ++* *print-case*:: ++* *print-circle*:: ++* *print-escape*:: ++* *print-gensym*:: ++* *print-level*:: ++* *print-lines*:: ++* *print-miser-width*:: ++* *print-pprint-dispatch*:: ++* *print-pretty*:: ++* *print-readably*:: ++* *print-right-margin*:: ++* print-not-readable:: ++* print-not-readable-object:: ++* format:: ++@end menu ++ ++@node copy-pprint-dispatch, formatter, Printer Dictionary, Printer Dictionary ++@subsection copy-pprint-dispatch [Function] ++ ++@code{copy-pprint-dispatch} @i{@r{&optional} table} @result{} @i{new-table} ++ ++@subsubheading Arguments and Values:: ++ ++@i{table}---a @i{pprint dispatch table}, or @b{nil}. ++ ++@i{new-table}---a @i{fresh} @i{pprint dispatch table}. ++ ++@subsubheading Description:: ++ ++Creates and returns a copy of the specified @i{table}, ++or of the @i{value} of @b{*print-pprint-dispatch*} if no @i{table} is specified, ++or of the initial @i{value} of @b{*print-pprint-dispatch*} if @b{nil} is specified. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if @i{table} ++is not a @i{pprint dispatch table}. ++ ++@node formatter, pprint-dispatch, copy-pprint-dispatch, Printer Dictionary ++@subsection formatter [Macro] ++ ++@code{formatter} @i{control-string} @result{} @i{function} ++ ++@subsubheading Arguments and Values:: ++ ++@i{control-string}---a @i{format string}; not evaluated. ++ ++@i{function}---a @i{function}. ++ ++@subsubheading Description:: ++ ++Returns a @i{function} which has behavior equivalent to: ++ ++@example ++ #'(lambda (*standard-output* &rest arguments) ++ (apply #'format t @i{control-string} arguments) ++ @i{arguments-tail}) ++@end example ++ ++where @i{arguments-tail} is either the tail of @i{arguments} ++which has as its @i{car} the argument that would be processed next ++if there were more format directives in the @i{control-string}, ++or else @b{nil} if no more @i{arguments} follow the most recently ++processed argument. ++ ++@subsubheading Examples:: ++ ++@example ++(funcall (formatter "~&~A~A") *standard-output* 'a 'b 'c) ++@t{ |> } AB ++@result{} (C) ++ ++(format t (formatter "~&~A~A") 'a 'b 'c) ++@t{ |> } AB ++@result{} NIL ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Might signal an error (at macro expansion time or at run time) if the argument ++is not a valid @i{format string}. ++ ++@subsubheading See Also:: ++ ++@ref{format} ++ ++@node pprint-dispatch, pprint-exit-if-list-exhausted, formatter, Printer Dictionary ++@subsection pprint-dispatch [Function] ++ ++@code{pprint-dispatch} @i{object @r{&optional} table} @result{} @i{function, found-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{table}---a @i{pprint dispatch table}, or @b{nil}. ++ The default is the @i{value} of @b{*print-pprint-dispatch*}. ++ ++@i{function}---a @i{function designator}. ++ ++@i{found-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Retrieves the highest priority function in @i{table} that is ++associated with a @i{type specifier} that matches @i{object}. ++The function is chosen by finding all of the @i{type specifiers} in @i{table} ++that match the @i{object} and ++selecting the highest priority function associated with any of these ++@i{type specifiers}. If there is more than one highest priority function, ++an arbitrary choice is made. If no @i{type specifiers} match the ++@i{object}, a function is returned that prints @i{object} ++ ++using @b{print-object}. ++ ++The @i{secondary value}, @i{found-p}, is @i{true} if a matching ++@i{type specifier} was found in @i{table}, or @i{false} otherwise. ++ ++If @i{table} is @b{nil}, ++retrieval is done in the ++@i{initial pprint dispatch table}. ++ ++@subsubheading Affected By:: ++ ++The state of the @i{table}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} if @i{table} is neither a ++@i{pprint-dispatch-table} nor @b{nil}. ++ ++@subsubheading Notes:: ++ ++@example ++(let ((*print-pretty* t)) ++ (write object :stream s)) ++@equiv{} (funcall (pprint-dispatch object) s object) ++@end example ++ ++@node pprint-exit-if-list-exhausted, pprint-fill, pprint-dispatch, Printer Dictionary ++@subsection pprint-exit-if-list-exhausted [Local Macro] ++ ++@subsubheading Syntax:: ++ ++@code{pprint-exit-if-list-exhausted} @i{<@i{no @i{arguments}}>} @result{} @i{@b{nil}} ++ ++@subsubheading Description:: ++ ++Tests whether or not the @i{list} passed to ++the @i{lexically current logical block} ++has been exhausted; see @ref{Dynamic Control of the Arrangement of Output}. ++If this @i{list} has been ++reduced to @b{nil}, @b{pprint-exit-if-list-exhausted} terminates the execution ++of the @i{lexically current logical block} except for the printing ++of the suffix. Otherwise @b{pprint-exit-if-list-exhausted} returns @b{nil}. ++ ++Whether or not @b{pprint-exit-if-list-exhausted} is @i{fbound} in the ++@i{global environment} is @i{implementation-dependent}; ++however, the restrictions on redefinition and @i{shadowing} of ++@b{pprint-exit-if-list-exhausted} are the same as for @i{symbols} in the @t{COMMON-LISP} @i{package} ++which are @i{fbound} in the @i{global environment}. ++The consequences of attempting to use @b{pprint-exit-if-list-exhausted} outside ++of @b{pprint-logical-block} are undefined. ++ ++@subsubheading Exceptional Situations:: ++ ++An error is signaled (at macro expansion time or at run time) if ++@b{pprint-exit-if-list-exhausted} is used anywhere other than ++lexically within a call on @b{pprint-logical-block}. ++Also, the consequences of executing @b{pprint-if-list-exhausted} outside ++of the dynamic extent of the @b{pprint-logical-block} which lexically ++contains it are undefined. ++ ++@subsubheading See Also:: ++ ++@ref{pprint-logical-block} ++, ++@ref{pprint-pop} ++. ++ ++@node pprint-fill, pprint-indent, pprint-exit-if-list-exhausted, Printer Dictionary ++@subsection pprint-fill, pprint-linear, pprint-tabular [Function] ++ ++@code{pprint-fill} @i{stream object @r{&optional} colon-p at-sign-p} @result{} @i{@b{nil}} ++ ++@code{pprint-linear} @i{stream object @r{&optional} colon-p at-sign-p} @result{} @i{@b{nil}} ++ ++@code{pprint-tabular} @i{stream object @r{&optional} colon-p at-sign-p tabsize} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream}---an @i{output} @i{stream designator}. ++ ++@i{object}---an @i{object}. ++ ++@i{colon-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{at-sign-p}---a @i{generalized boolean}. ++ The default is @i{implementation-dependent}. ++ ++@i{tabsize}---a non-negative @i{integer}. ++ The default is @t{16}. ++ ++@subsubheading Description:: ++ ++The functions @b{pprint-fill}, @b{pprint-linear}, and ++@b{pprint-tabular} specify particular ways of @i{pretty printing} ++a @i{list} to @i{stream}. ++Each function prints parentheses around the output if and only ++if @i{colon-p} is @i{true}. ++Each function ignores its @i{at-sign-p} argument. ++(Both arguments are included even though only one is needed ++so that these functions can be used via @t{~/.../} ++and as @b{set-pprint-dispatch} functions, as well as directly.) ++Each function handles abbreviation and the detection of circularity ++and sharing correctly, and uses @b{write} to print @i{object} ++when it is a @i{non-list}. ++ ++If @i{object} is a @i{list} and ++if the @i{value} of @b{*print-pretty*} is @i{false}, ++each of these functions prints @i{object} ++using a minimum of @i{whitespace}, ++as described in @ref{Printing Lists and Conses}. ++Otherwise (if @i{object} is a @i{list} and ++ if the @i{value} of @b{*print-pretty*} is @i{true}): ++ ++@table @asis ++ ++@item @t{*} ++The @i{function} @b{pprint-linear} prints a @i{list} either all on one line, ++or with each @i{element} on a separate line. ++ ++@item @t{*} ++The @i{function} @b{pprint-fill} prints a @i{list} with as many @i{elements} ++as possible on each line. ++ ++@item @t{*} ++The @i{function} @b{pprint-tabular} is the same as @b{pprint-fill} ++except that it prints the @i{elements} so that they line up in columns. ++The @i{tabsize} specifies the column spacing in @i{ems}, ++which is the total spacing from the leading edge of one column to ++the leading edge of the next. ++@end table ++ ++@subsubheading Examples:: ++ ++Evaluating the following with a line length of @t{25} produces the output shown. ++ ++@example ++(progn (princ "Roads ") ++ (pprint-tabular *standard-output* '(elm main maple center) nil nil 8)) ++Roads ELM MAIN ++ MAPLE CENTER ++@end example ++ ++@subsubheading Side Effects:: ++ ++Performs output to the indicated @i{stream}. ++ ++@subsubheading Affected By:: ++ ++The cursor position on the indicated @i{stream}, if it can be determined. ++ ++@subsubheading Notes:: ++ ++The @i{function} @b{pprint-tabular} could be defined as follows: ++ ++@example ++(defun pprint-tabular (s list &optional (colon-p t) at-sign-p (tabsize nil)) ++ (declare (ignore at-sign-p)) ++ (when (null tabsize) (setq tabsize 16)) ++ (pprint-logical-block (s list :prefix (if colon-p "(" "") ++ :suffix (if colon-p ")" "")) ++ (pprint-exit-if-list-exhausted) ++ (loop (write (pprint-pop) :stream s) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space s) ++ (pprint-tab :section-relative 0 tabsize s) ++ (pprint-newline :fill s)))) ++@end example ++ ++Note that it would have been inconvenient to specify this function ++using @b{format}, because of the need to pass its @i{tabsize} argument ++through to a @t{~:T} format directive nested within an iteration over a list. ++ ++@node pprint-indent, pprint-logical-block, pprint-fill, Printer Dictionary ++@subsection pprint-indent [Function] ++ ++@code{pprint-indent} @i{relative-to n @r{&optional} stream} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{relative-to}---either @t{:block} or @t{:current}. ++ ++@i{n}---a @i{real}. ++ ++@i{stream}---an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++@subsubheading Description:: ++ ++@b{pprint-indent} specifies the indentation to use in a logical block on @i{stream}. ++ ++If @i{stream} is a @i{pretty printing stream} ++ and the @i{value} of @b{*print-pretty*} is @i{true}, ++@b{pprint-indent} sets the indentation in the innermost ++dynamically enclosing logical block; ++otherwise, @b{pprint-indent} has no effect. ++ ++@i{N} specifies the indentation in ++@i{ems}. If @i{relative-to} is @t{:block}, the indentation is set ++to the horizontal position of the first character in the @i{dynamically current logical block} plus @i{n} ++@i{ems}. If @i{relative-to} is @t{:current}, the indentation is set ++to the current output position plus @i{n} @i{ems}. (For robustness ++in the face of variable-width fonts, it is advisable to use @t{:current} ++with an @i{n} of zero whenever possible.) ++ ++@i{N} can be negative; ++however, the total indentation cannot be moved ++left of the beginning of the line ++or left of the end of the rightmost per-line prefix---an attempt to move beyond ++one of these limits is treated ++the same as an attempt to move to that limit. ++Changes in indentation caused by @i{pprint-indent} ++do not take effect until after the next line break. In addition, in ++miser mode all calls to @b{pprint-indent} are ignored, forcing the lines ++corresponding to the logical block to line up under the first character in ++the block. ++ ++@subsubheading Exceptional Situations:: ++ ++An error is signaled if @i{relative-to} is any @i{object} other ++than @t{:block} or @t{:current}. ++ ++@subsubheading See Also:: ++ ++@ref{Tilde I-> Indent} ++ ++@node pprint-logical-block, pprint-newline, pprint-indent, Printer Dictionary ++@subsection pprint-logical-block [Macro] ++ ++@code{pprint-logical-block} @i{@r{(}stream-symbol object ++ @r{&key} prefix per-line-prefix suffix@r{)} ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{stream-symbol}---a @i{stream variable designator}. ++ ++@i{object}---an @i{object}; evaluated. ++ ++@t{:prefix}---a @i{string}; evaluated. ++ Complicated defaulting behavior; see below. ++ ++@t{:per-line-prefix}---a @i{string}; evaluated. ++ Complicated defaulting behavior; see below. ++ ++@t{:suffix}---a @i{string}; evaluated. ++ The default is the @i{null} @i{string}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@subsubheading Description:: ++ ++Causes printing to be grouped into a logical block. ++ ++The logical block is printed to the @i{stream} that is the @i{value} ++of the @i{variable} denoted by @i{stream-symbol}. ++During the execution of the @i{forms}, ++that @i{variable} is @i{bound} to a @i{pretty printing stream} ++that supports decisions about the arrangement of output ++and then forwards the output to the destination stream. ++ ++All the standard printing functions ++ (@i{e.g.}, @b{write}, ++ @b{princ}, ++ and @b{terpri}) ++can be used to print output to the @i{pretty printing stream}. ++All and only the output sent to this @i{pretty printing stream} ++is treated as being in the logical block. ++ ++The @i{prefix} specifies a prefix to be printed before the beginning of ++the logical block. ++The @i{per-line-prefix} specifies a prefix that is printed before the block ++and at the beginning of each new line in the block. ++The @t{:prefix} and @t{:pre-line-prefix} @i{arguments} are mutually exclusive. ++If neither @t{:prefix} nor @t{:per-line-prefix} is specified, ++a @i{prefix} of the @i{null} @i{string} is assumed. ++ ++The @i{suffix} specifies a suffix that is printed just after the logical block. ++ ++The @i{object} is ++normally ++a @i{list} that the body @i{forms} are responsible for printing. ++If @i{object} is not a @i{list}, ++it is printed using @b{write}. ++(This makes it easier to write printing functions that are robust ++ in the face of malformed arguments.) ++If @b{*print-circle*} ++is @i{non-nil} and @i{object} is a circular (or shared) reference to a @i{cons}, ++then an appropriate ``@t{#@i{n}#}'' marker is printed. (This ++makes it easy to write printing functions that provide full support ++for circularity and sharing abbreviation.) If @b{*print-level*} is not ++@b{nil} and the logical block is at a dynamic nesting depth of greater ++than @b{*print-level*} in logical blocks, ``@t{#}'' is printed. ++(This makes easy to write printing functions that provide full support for depth ++abbreviation.) ++ ++If either of the three conditions above occurs, the indicated output is ++printed on @i{stream-symbol} and the body @i{forms} are skipped ++along with the printing of the @t{:prefix} and @t{:suffix}. ++(If the body @i{forms} are not to be responsible for printing a list, ++then the first two tests above can be turned off by supplying @b{nil} for ++the @i{object} argument.) ++ ++In addition to the @i{object} argument of @b{pprint-logical-block}, ++the arguments of the standard printing functions (such as @b{write}, ++@b{print}, @b{prin1}, and @b{pprint}, as well as the arguments ++of the standard @i{format directives} such as @t{~A}, @t{~S}, ++(and @t{~W}) are all checked (when necessary) for circularity and sharing. ++However, such checking is not applied to the arguments of the ++functions @b{write-line}, @b{write-string}, and @b{write-char} ++or to the literal text output by @b{format}. A consequence of this is ++that you must use one of the latter functions if you want to print some ++literal text in the output that is not supposed to be checked for circularity ++or sharing. ++ ++The body @i{forms} of a @b{pprint-logical-block} @i{form} ++must not perform any side-effects on the surrounding environment; for ++example, no @i{variables} must be assigned which have not been ++@i{bound} within its scope. ++ ++The @b{pprint-logical-block} @i{macro} may be used regardless of the @i{value} of @b{*print-pretty*}. ++ ++@subsubheading Affected By:: ++ ++@b{*print-circle*}, @b{*print-level*}. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{type-error} is signaled if any of the @t{:suffix}, ++@t{:prefix}, or @t{:per-line-prefix} is supplied but does not evaluate ++to a @i{string}. ++ ++An error is signaled if @t{:prefix} and @t{:pre-line-prefix} are both used. ++ ++@b{pprint-logical-block} and the @i{pretty printing stream} it creates ++have @i{dynamic extent}. The consequences are undefined if, outside ++of this extent, output is attempted to the @i{pretty printing stream} it creates. ++ ++It is also unspecified what happens if, within this extent, any output is ++sent directly to the underlying destination stream. ++ ++@subsubheading See Also:: ++ ++@ref{pprint-pop} ++, ++@ref{pprint-exit-if-list-exhausted} ++, ++@ref{Tilde Less-Than-Sign-> Logical Block} ++ ++@subsubheading Notes:: ++ ++One reason for using the @b{pprint-logical-block} @i{macro} when the @i{value} of @b{*print-pretty*} ++is @b{nil} would be to allow it to perform checking for @i{dotted lists}, ++as well as (in conjunction with @b{pprint-pop}) ++checking for @b{*print-level*} or @b{*print-length*} being exceeded. ++ ++Detection of circularity and sharing is supported by the @i{pretty printer} ++by in essence performing requested output twice. On the first pass, ++circularities and sharing are detected and the actual outputting of characters ++is suppressed. On the second pass, the appropriate ``@t{#@i{n}=}'' ++and ``@t{#@i{n}#}'' markers are inserted and characters are output. ++This is why the restriction on side-effects is necessary. ++Obeying this restriction is facilitated by using @b{pprint-pop}, ++instead of an ordinary @b{pop} when traversing a list being printed by ++the body @i{forms} of the @b{pprint-logical-block} @i{form}.) ++ ++@node pprint-newline, pprint-pop, pprint-logical-block, Printer Dictionary ++@subsection pprint-newline [Function] ++ ++@code{pprint-newline} @i{kind @r{&optional} stream} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{kind}---one of @t{:linear}, @t{:fill}, @t{:miser}, or @t{:mandatory}. ++ ++@i{stream}---a @i{stream designator}. ++ The default is @i{standard output}. ++ ++@subsubheading Description:: ++ ++If @i{stream} is a @i{pretty printing stream} ++ and the @i{value} of @b{*print-pretty*} is @i{true}, ++a line break is inserted in the output ++when the appropriate condition below is satisfied; ++otherwise, @b{pprint-newline} has no effect. ++ ++@i{Kind} specifies the style of conditional newline. ++This @i{parameter} is treated as follows: ++ ++@table @asis ++ ++@item @t{:linear} ++This specifies a ++``linear-style'' @i{conditional newline}. ++@ITindex linear-style conditional newline ++ ++A line break is inserted ++if and only if the immediately containing @i{section} ++cannot be printed on one line. ++The effect of this is that line breaks are ++either inserted at every linear-style conditional newline in a logical block ++or at none of them. ++ ++@item @t{:miser} ++This specifies a ++``miser-style'' @i{conditional newline}. ++@ITindex miser-style conditional newline ++ ++A line break is inserted ++if and only if the immediately containing @i{section} ++cannot be printed on one line ++and miser style is in effect in the immediately containing logical block. ++The effect of this is that miser-style conditional newlines ++act like linear-style conditional newlines, ++but only when miser style is in effect. ++Miser style is in effect for a logical block if and only if ++the starting position of the logical block ++is less than or equal to ++@b{*print-miser-width*} @i{ems} from the right margin. ++ ++@item @t{:fill} ++This specifies a ++``fill-style'' @i{conditional newline}. ++@ITindex fill-style conditional newline ++ ++A line break is inserted if and only if ++either (a) the following @i{section} cannot be printed ++ on the end of the current line, ++ (b) the preceding @i{section} was not printed on a single line, ++ or (c) the immediately containing @i{section} cannot ++ be printed on one line and miser style is in effect ++ in the immediately containing logical block. ++If a logical block is broken up into a number of subsections ++by fill-style conditional newlines, ++the basic effect is that the logical block ++is printed with as many subsections as possible on each line. ++However, if miser style is in effect, ++fill-style conditional newlines act like linear-style conditional newlines. ++ ++@item @t{:mandatory} ++This specifies a ++``mandatory-style'' @i{conditional newline}. ++@ITindex mandatory-style conditional newline ++ ++A line break is always inserted. ++This implies that none of the containing @i{sections} ++can be printed on a single line and ++will therefore trigger the insertion of line breaks ++at linear-style conditional newlines in these @i{sections}. ++ ++@end table ++ ++When a line break is inserted by any type of conditional newline, ++any blanks that immediately precede the conditional newline are omitted ++from the output and indentation is introduced at the beginning of the next line. ++By default, the indentation causes the following line to begin ++in the same horizontal position ++as the first character in the immediately containing logical block. ++(The indentation can be changed via @b{pprint-indent}.) ++ ++There are a variety of ways unconditional newlines can be introduced into ++the output (@i{i.e.}, via @b{terpri} or by printing a string containing a newline ++character). As with mandatory conditional newlines, this prevents any of ++the containing @i{sections} from being printed on one line. In general, when ++an unconditional newline is encountered, it is printed out without ++suppression of the preceding blanks and without any indentation following ++it. However, if a per-line prefix has been specified (see ++@b{pprint-logical-block}), this prefix will always be printed no matter ++how a newline originates. ++ ++@subsubheading Examples:: ++ ++See @ref{Examples of using the Pretty Printer}. ++ ++@subsubheading Side Effects:: ++ ++Output to @i{stream}. ++ ++@subsubheading Affected By:: ++ ++@b{*print-pretty*}, @b{*print-miser*}. ++The presence of containing logical blocks. ++The placement of newlines and conditional newlines. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{type-error} is signaled if @i{kind} ++is not one of @t{:linear}, @t{:fill}, @t{:miser}, or @t{:mandatory}. ++ ++@subsubheading See Also:: ++ ++@ref{Tilde Underscore-> Conditional Newline}, ++@ref{Examples of using the Pretty Printer} ++ ++@node pprint-pop, pprint-tab, pprint-newline, Printer Dictionary ++@subsection pprint-pop [Local Macro] ++ ++@subsubheading Syntax:: ++ ++@code{pprint-pop} @i{<@i{no @i{arguments}}>} @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{element} of the @i{list} ++ being printed in the @i{lexically current logical block}, ++ or @b{nil}. ++ ++@subsubheading Description:: ++ ++Pops one @i{element} from the @i{list} being printed ++in the @i{lexically current logical block}, obeying @b{*print-length*} ++and @b{*print-circle*} as described below. ++ ++Each time @b{pprint-pop} is called, it pops the next value off the ++@i{list} passed to the @i{lexically current logical block} and returns it. ++However, before doing this, it performs three tests: ++ ++@table @asis ++ ++@item @t{*} ++If the remaining `list' is not a @i{list}, ++ ``@t{. }'' is printed followed by the remaining `list.' ++ (This makes it easier to write printing functions that ++ are robust in the face of malformed arguments.) ++ ++@item @t{*} ++If @b{*print-length*} is @i{non-nil}, ++ and @b{pprint-pop} has already been called @b{*print-length*} times ++ within the immediately containing logical block, ++ ``@t{...}'' is printed. ++ (This makes it easy to write printing functions that properly handle ++ @b{*print-length*}.) ++ ++@item @t{*} ++If @b{*print-circle*} is ++ @i{non-nil}, and the remaining list is a circular (or shared) reference, ++ then ``@t{. }'' is printed followed by an appropriate ++ ``@t{#@i{n}#}'' marker. ++ (This catches instances of @i{cdr} circularity and sharing in lists.) ++@end table ++ ++If either of the three conditions above occurs, the indicated output is ++printed on the @i{pretty printing stream} created by the immediately containing ++@b{pprint-logical-block} and the execution of the immediately containing ++@b{pprint-logical-block} is terminated except for the printing of the suffix. ++ ++If @b{pprint-logical-block} is given a `list' argument of @b{nil}---because ++it is not processing a list---@b{pprint-pop} can still be used to obtain ++support for @b{*print-length*}. ++In this situation, the first and third tests above are disabled and ++@b{pprint-pop} always returns @b{nil}. ++See @ref{Examples of using the Pretty Printer}---specifically, the @b{pprint-vector} example. ++ ++Whether or not @b{pprint-pop} is @i{fbound} in the ++@i{global environment} is @i{implementation-dependent}; ++however, the restrictions on redefinition and @i{shadowing} of ++@b{pprint-pop} are the same as for @i{symbols} in the @t{COMMON-LISP} @i{package} ++which are @i{fbound} in the @i{global environment}. ++The consequences of attempting to use @b{pprint-pop} outside ++of @b{pprint-logical-block} are undefined. ++ ++@subsubheading Side Effects:: ++ ++Might cause output ++to the @i{pretty printing stream} associated with the lexically current logical block. ++ ++@subsubheading Affected By:: ++ ++@b{*print-length*}, @b{*print-circle*}. ++ ++@subsubheading Exceptional Situations:: ++ ++An error is signaled (either at macro expansion time or at run time) ++if a usage of @b{pprint-pop} occurs where there is no lexically ++containing @b{pprint-logical-block} @i{form}. ++ ++The consequences are undefined if @b{pprint-pop} is executed outside ++of the @i{dynamic extent} of this @b{pprint-logical-block}. ++ ++@subsubheading See Also:: ++ ++@ref{pprint-exit-if-list-exhausted} ++, ++@ref{pprint-logical-block} ++. ++ ++@subsubheading Notes:: ++ ++It is frequently a good idea to call @b{pprint-exit-if-list-exhausted} ++before calling @b{pprint-pop}. ++ ++@node pprint-tab, print-object, pprint-pop, Printer Dictionary ++@subsection pprint-tab [Function] ++ ++@code{pprint-tab} @i{kind colnum colinc @r{&optional} stream} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{kind}---one of @t{:line}, @t{:section}, @t{:line-relative}, ++ or @t{:section-relative}. ++ ++@i{colnum}---a non-negative @i{integer}. ++ ++@i{colinc}---a non-negative @i{integer}. ++ ++@i{stream}---an @i{output} @i{stream designator}. ++ ++@subsubheading Description:: ++ ++Specifies tabbing to @i{stream} as performed by the standard @t{~T} format directive. ++ ++If @i{stream} is a @i{pretty printing stream} and ++ the @i{value} of @b{*print-pretty*} is @i{true}, ++ ++tabbing is performed; ++otherwise, @b{pprint-tab} has no effect. ++ ++The arguments @i{colnum} and @i{colinc} correspond to the two ++@i{parameters} to @t{~T} and are in terms of @i{ems}. ++The @i{kind} argument specifies the style of tabbing. It must be one of ++ @t{:line} (tab as by @t{~T}), ++ @t{:section} (tab as by @t{~:T}, ++ but measuring horizontal positions relative to ++ the start of the dynamically enclosing section), ++ @t{:line-relative} (tab as by @t{~@@T}), or ++ @t{:section-relative} (tab as by @t{~:@@T}, ++ but measuring horizontal positions relative to ++ the start of the dynamically enclosing section). ++ ++@subsubheading Exceptional Situations:: ++ ++An error is signaled if @i{kind} is not one of @t{:line}, ++@t{:section}, @t{:line-relative}, or @t{:section-relative}. ++ ++@subsubheading See Also:: ++ ++@ref{pprint-logical-block} ++ ++@node print-object, print-unreadable-object, pprint-tab, Printer Dictionary ++@subsection print-object [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{print-object} @i{object stream} @result{} @i{object} ++ ++@subsubheading Method Signatures:: ++ ++@code{print-object} @i{@r{(}@i{object} standard-object@r{)} @i{stream}} ++ ++@code{print-object} @i{@r{(}@i{object} structure-object@r{)} @i{stream}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{stream}---a @i{stream}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{print-object} writes the printed representation of @i{object} ++to @i{stream}. ++The @i{function} @b{print-object} is called by the @i{Lisp printer}; ++it should not be called by the user. ++ ++Each implementation is required to provide a @i{method} on ++the @i{class} @b{standard-object} and on the @i{class} @b{structure-object}. ++In addition, each @i{implementation} must provide ++@i{methods} on enough other @i{classes} ++so as to ensure that there is always an applicable @i{method}. ++Implementations are free to add @i{methods} for other @i{classes}. ++Users may write @i{methods} for @b{print-object} for their own ++@i{classes} if they do not wish to inherit an ++@i{implementation-dependent} @i{method}. ++ ++The @i{method} on the @i{class} @b{structure-object} prints the object in the ++default @t{#S} notation; see @ref{Printing Structures}. ++ ++@i{Methods} on @b{print-object} are responsible for implementing ++their part of the semantics of the @i{printer control variables}, as follows: ++ ++@table @asis ++ ++@item @b{*print-readably*} ++All methods for @b{print-object} must obey @b{*print-readably*}. ++This includes both user-defined methods and @i{implementation-defined} methods. ++Readable printing of @i{structures} and @i{standard objects} ++is controlled by their @b{print-object} method, ++not by their @b{make-load-form} @i{method}. ++@i{Similarity} for these @i{objects} is application dependent ++and hence is defined to be whatever these @i{methods} do; ++see @ref{Similarity of Literal Objects}. ++ ++@item @b{*print-escape*} ++Each @i{method} must implement @b{*print-escape*}. ++ ++@item @b{*print-pretty*} ++ ++The @i{method} may wish to perform specialized line breaking ++or other output conditional on the @i{value} of @b{*print-pretty*}. ++For further information, ++see (for example) the @i{macro} @b{pprint-fill}. ++See also @ref{Pretty Print Dispatch Tables} and @ref{Examples of using the Pretty Printer}. ++ ++@item @b{*print-length*} ++@i{Methods} that produce output of indefinite length must obey ++@b{*print-length*}. ++ ++For further information, ++see (for example) the @i{macros} @b{pprint-logical-block} ++and @b{pprint-pop}. ++See also @ref{Pretty Print Dispatch Tables} and @ref{Examples of using the Pretty Printer}. ++ ++@item @b{*print-level*} ++The printer takes care of @b{*print-level*} automatically, ++provided that each @i{method} handles exactly one level of structure and ++calls @b{write} (or an equivalent @i{function}) recursively if ++there are more structural levels. The printer's decision of whether an ++@i{object} has components (and therefore should not be printed when the ++printing depth is not less than @b{*print-level*}) is ++@i{implementation-dependent}. In some implementations its ++@b{print-object} @i{method} is not called; ++in others the @i{method} is called, ++and the determination that the @i{object} has components is based on what ++it tries to write to the @i{stream}. ++ ++@item @b{*print-circle*} ++ ++When the @i{value} of @b{*print-circle*} is @i{true}, ++a user-defined ++ ++@b{print-object} @i{method} ++ ++can print @i{objects} to the supplied @i{stream} ++using @b{write}, ++ @b{prin1}, ++ @b{princ}, ++ or @b{format} ++and expect circularities to be detected ++and printed using the @t{#@i{n}#} syntax. ++If a user-defined ++ ++@b{print-object} @i{method} ++ ++prints to a @i{stream} other than the one ++that was supplied, then circularity detection starts over for that ++@i{stream}. See @b{*print-circle*}. ++ ++@item @b{*print-base*}, ++ @b{*print-radix*}, ++ @b{*print-case*}, ++ @b{*print-gensym*}, ++ and @b{*print-array*} ++These @i{printer control variables} apply to specific types of @i{objects} ++and are handled by the @i{methods} for those @i{objects}. ++ ++@end table ++ ++If these rules are not obeyed, the results are undefined. ++ ++In general, the printer and the @b{print-object} methods should not ++rebind the print control variables as they operate recursively through the ++structure, but this is @i{implementation-dependent}. ++ ++In some implementations the @i{stream} argument passed to a ++@b{print-object} @i{method} is not the original @i{stream}, ++but is an intermediate @i{stream} that implements part of the printer. ++@i{methods} should therefore not depend on the identity of this @i{stream}. ++ ++@subsubheading See Also:: ++ ++@ref{pprint-fill} ++, ++@ref{pprint-logical-block} ++, ++@ref{pprint-pop} ++, ++@ref{write} ++, ++@b{*print-readably*}, ++@b{*print-escape*}, ++@b{*print-pretty*}, ++@b{*print-length*}, ++@ref{Default Print-Object Methods}, ++ ++@ref{Printing Structures}, ++ ++@ref{Pretty Print Dispatch Tables}, ++@ref{Examples of using the Pretty Printer} ++ ++@node print-unreadable-object, set-pprint-dispatch, print-object, Printer Dictionary ++@subsection print-unreadable-object [Macro] ++ ++@code{print-unreadable-object} @i{@r{(}object stream @r{&key} type identity@r{)} @{@i{form}@}*} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}; evaluated. ++ ++@i{stream}--- ++a @i{stream designator}; evaluated. ++ ++@i{type}---a @i{generalized boolean}; evaluated. ++ ++@i{identity}---a @i{generalized boolean}; evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@subsubheading Description:: ++ ++Outputs a printed representation of @i{object} on @i{stream}, ++beginning with ``@t{#<}'' and ending with ``@t{>}''. ++Everything output to @i{stream} by the body @i{forms} ++is enclosed in the the angle brackets. ++If @i{type} is @i{true}, the output from @i{forms} ++is preceded by a brief description of the @i{object}'s ++@i{type} and a space character. ++If @i{identity} is @i{true}, ++the output from @i{forms} is followed by a space character ++and a representation of the @i{object}'s identity, ++typically a storage address. ++ ++If either @i{type} or @i{identity} is not supplied, ++its value is @i{false}. It is valid to omit the body @i{forms}. ++If @i{type} and @i{identity} are both true and there are no ++body @i{forms}, only one space character separates the type ++and the identity. ++ ++@subsubheading Examples:: ++ ++;; Note that in this example, the precise form of the output ++;; is @i{implementation-dependent}. ++ ++@example ++ (defmethod print-object ((obj airplane) stream) ++ (print-unreadable-object (obj stream :type t :identity t) ++ (princ (tail-number obj) stream))) ++ ++ (prin1-to-string my-airplane) ++@result{} "#" ++@i{OR}@result{} "#" ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If @b{*print-readably*} is @i{true}, @b{print-unreadable-object} ++signals an error of @i{type} @b{print-not-readable} without printing anything. ++ ++@node set-pprint-dispatch, write, print-unreadable-object, Printer Dictionary ++@subsection set-pprint-dispatch [Function] ++ ++@code{set-pprint-dispatch} @i{type-specifier function @r{&optional} priority table} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{type-specifier}---a @i{type specifier}. ++ ++@i{function}---a @i{function}, a @i{function name}, or @b{nil}. ++ ++@i{priority}---a @i{real}. ++ The default is @t{0}. ++ ++@i{table}---a @i{pprint dispatch table}. ++ The default is the @i{value} of @b{*print-pprint-dispatch*}. ++ ++@subsubheading Description:: ++ ++Installs an entry into the @i{pprint dispatch table} which is @i{table}. ++ ++@i{Type-specifier} ++is the @i{key} ++of the entry. The first action of @b{set-pprint-dispatch} is to remove any ++pre-existing entry associated with @i{type-specifier}. This guarantees that ++there will never be two entries associated with the same @i{type specifier} ++in a given @i{pprint dispatch table}. Equality of @i{type specifiers} is ++tested by @b{equal}. ++ ++Two values are associated with each @i{type specifier} in a ++@i{pprint dispatch table}: a @i{function} and a @i{priority}. ++The @i{function} must accept two arguments: the @i{stream} to which output ++is sent and the @i{object} to be printed. The @i{function} should ++@i{pretty print} the @i{object} to the @i{stream}. The @i{function} ++can assume that object satisfies the @i{type} given by @i{type-specifier}. ++The @i{function} must obey @b{*print-readably*}. ++Any values returned by the @i{function} are ignored. ++ ++@i{Priority} is a priority to resolve conflicts ++when an object matches more than one entry. ++ ++It is permissible for @i{function} to be @b{nil}. In this situation, ++there will be no @i{type-specifier} entry in @i{table} after ++@b{set-pprint-dispatch} returns. ++ ++@subsubheading Exceptional Situations:: ++ ++An error is signaled if @i{priority} is not a @i{real}. ++ ++@subsubheading Notes:: ++ ++Since @i{pprint dispatch tables} are often used to control the pretty ++printing of Lisp code, it is common for the @i{type-specifier} to be ++an @i{expression} of the form ++ ++@example ++ (cons @i{car-type} @i{cdr-type}) ++@end example ++ ++This signifies that the corresponding object must be a cons cell ++whose @i{car} matches the @i{type specifier} @i{car-type} ++and whose @i{cdr} matches the @i{type specifier} @i{cdr-type}. ++The @i{cdr-type} can be omitted in which case it defaults to @b{t}. ++ ++@node write, write-to-string, set-pprint-dispatch, Printer Dictionary ++@subsection write, prin1, print, pprint, princ [Function] ++ ++@code{write} @i{@i{object} @r{&key} \writekeys@r{stream}}@* ++ @result{} @i{object} ++ ++@code{prin} @i{1} @result{} @i{object @r{&optional} output-stream} ++ @r{object} ++@code{princ} @i{object @r{&optional} output-stream} @result{} @i{object} ++ ++@code{print} @i{object @r{&optional} output-stream} @result{} @i{object} ++ ++@code{pprint} @i{object @r{&optional} output-stream} @result{} @i{<@i{no @i{values}}>} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{output-stream}---an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++\writekeydescriptions@r{@i{stream}---an @i{output} @i{stream designator}. ++The default is @i{standard output}.} ++ ++@subsubheading Description:: ++ ++@b{write}, @b{prin1}, @b{princ}, @b{print}, and @b{pprint} ++write the printed representation of @i{object} to @i{output-stream}. ++ ++@b{write} is the general entry point to the @i{Lisp printer}. ++For each explicitly supplied @i{keyword parameter} named in Figure 22--6, ++the corresponding @i{printer control variable} is dynamically bound to its @i{value} ++while printing goes on; ++for each @i{keyword parameter} in Figure 22--6 that is not explicitly supplied, ++the value of the corresponding @i{printer control variable} is the same as it was ++at the time @b{write} was invoked. ++Once the appropriate @i{bindings} are @i{established}, ++the @i{object} is output by the @i{Lisp printer}. ++ ++@format ++@group ++@noindent ++@w{ Parameter Corresponding Dynamic Variable } ++@w{ @i{array} @b{*print-array*} } ++@w{ @i{base} @b{*print-base*} } ++@w{ @i{case} @b{*print-case*} } ++@w{ @i{circle} @b{*print-circle*} } ++@w{ @i{escape} @b{*print-escape*} } ++@w{ @i{gensym} @b{*print-gensym*} } ++@w{ @i{length} @b{*print-length*} } ++@w{ @i{level} @b{*print-level*} } ++@w{ @i{lines} @b{*print-lines*} } ++@w{ @i{miser-width} @b{*print-miser-width*} } ++@w{ @i{pprint-dispatch} @b{*print-pprint-dispatch*} } ++@w{ @i{pretty} @b{*print-pretty*} } ++@w{ @i{radix} @b{*print-radix*} } ++@w{ @i{readably} @b{*print-readably*} } ++@w{ @i{right-margin} @b{*print-right-margin*} } ++ ++@noindent ++@w{ Figure 22--6: Argument correspondences for the WRITE function.} ++ ++@end group ++@end format ++ ++@b{prin1}, @b{princ}, @b{print}, and @b{pprint} implicitly ++@i{bind} certain print parameters to particular values. The remaining parameter ++values are taken from ++ @b{*print-array*}, ++ @b{*print-base*}, ++ @b{*print-case*}, ++ @b{*print-circle*}, ++ @b{*print-escape*}, ++ @b{*print-gensym*}, ++ @b{*print-length*}, ++ @b{*print-level*}, ++ @b{*print-lines*}, ++ @b{*print-miser-width*}, ++ @b{*print-pprint-dispatch*}, ++ @b{*print-pretty*}, ++ @b{*print-radix*}, ++ and @b{*print-right-margin*}. ++ ++@b{prin1} produces output suitable for input to @b{read}. ++It binds @b{*print-escape*} to @i{true}. ++ ++@b{princ} is just like @b{prin1} except that the ++output has no @i{escape} @i{characters}. ++It binds @b{*print-escape*} to @i{false} ++ ++ and @b{*print-readably*} to @i{false}. ++ ++The general rule is that output from @b{princ} is intended to look ++good to people, while output from @b{prin1} is intended to ++be acceptable to @b{read}. ++ ++@b{print} is just like @b{prin1} ++except that the printed representation ++of @i{object} is preceded by a newline ++and followed by a space. ++ ++@b{pprint} is just like @b{print} except that the trailing ++space is omitted and ++@i{object} is printed with the @b{*print-pretty*} flag @i{non-nil} ++to produce pretty output. ++ ++@i{Output-stream} specifies the @i{stream} to which ++output is to be sent. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}, ++@b{*terminal-io*}, ++@b{*print-escape*}, ++@b{*print-radix*}, ++@b{*print-base*}, ++@b{*print-circle*}, ++@b{*print-pretty*}, ++@b{*print-level*}, ++@b{*print-length*}, ++@b{*print-case*}, ++@b{*print-gensym*}, ++@b{*print-array*}, ++@b{*read-default-float-format*}. ++ ++@subsubheading See Also:: ++ ++@ref{readtable-case} ++, ++@ref{FORMAT Printer Operations} ++ ++@subsubheading Notes:: ++ ++The @i{functions} @b{prin1} and @b{print} do not bind @b{*print-readably*}. ++ ++@example ++ (prin1 object output-stream) ++@equiv{} (write object :stream output-stream :escape t) ++@end example ++ ++@example ++ (princ object output-stream) ++@equiv{} (write object stream output-stream :escape nil :readably nil) ++@end example ++ ++@example ++ (print object output-stream) ++@equiv{} (progn (terpri output-stream) ++ (write object :stream output-stream ++ :escape t) ++ (write-char #\space output-stream)) ++@end example ++ ++@example ++ (pprint object output-stream) ++@equiv{} (write object :stream output-stream :escape t :pretty t) ++@end example ++ ++@node write-to-string, *print-array*, write, Printer Dictionary ++@subsection write-to-string, prin1-to-string, princ-to-string [Function] ++ ++@code{write-to-string} @i{object @r{&key} \writekeys}@* ++ @result{} @i{string} ++ ++@code{prin} @i{1} @result{} @i{-to-string} ++ @r{object} @r{string} ++ ++@code{princ-to-string} @i{object} @result{} @i{string} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++\writekeydescriptions ++ ++@i{string}---a @i{string}. ++ ++@subsubheading Description:: ++ ++@b{write-to-string}, @b{prin1-to-string}, and @b{princ-to-string} ++are used to create a @i{string} consisting of the printed representation ++of @i{object}. ++@i{Object} is effectively printed as if by @b{write}, ++@b{prin1}, or @b{princ}, respectively, ++and the @i{characters} that would be output are made ++into a @i{string}. ++ ++@b{write-to-string} is the general output function. ++It has the ability to specify all the parameters applicable ++to the printing of @i{object}. ++ ++@b{prin1-to-string} acts like @b{write-to-string} with ++@t{:escape t}, that is, escape characters are written where appropriate. ++ ++@b{princ-to-string} acts like @b{write-to-string} with ++ ++@t{:escape nil :readably nil}. ++ ++Thus no @i{escape} @i{characters} are written. ++ ++All other keywords that would be specified to @b{write-to-string} ++are default values when @b{prin1-to-string} ++or @b{princ-to-string} is invoked. ++ ++The meanings and defaults for the keyword arguments to @b{write-to-string} ++are the same as those for @b{write}. ++ ++@subsubheading Examples:: ++ ++@example ++ (prin1-to-string "abc") @result{} "\"abc\"" ++ (princ-to-string "abc") @result{} "abc" ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*print-escape*}, ++@b{*print-radix*}, ++@b{*print-base*}, ++@b{*print-circle*}, ++@b{*print-pretty*}, ++@b{*print-level*}, ++@b{*print-length*}, ++@b{*print-case*}, ++@b{*print-gensym*}, ++@b{*print-array*}, ++@b{*read-default-float-format*}. ++ ++@subsubheading See Also:: ++ ++@ref{write} ++ ++@subsubheading Notes:: ++ ++@example ++ (write-to-string @i{object} @{@i{key} @i{argument}@}*) ++@equiv{} (with-output-to-string (#1=#:string-stream) ++ (write object :stream #1# @{@i{key} @i{argument}@}*)) ++ ++ (princ-to-string @i{object}) ++@equiv{} (with-output-to-string (string-stream) ++ (princ @i{object} string-stream)) ++ ++ (prin1-to-string @i{object}) ++@equiv{} (with-output-to-string (string-stream) ++ (prin1 @i{object} string-stream)) ++@end example ++ ++@node *print-array*, *print-base*, write-to-string, Printer Dictionary ++@subsection *print-array* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++Controls the format in which @i{arrays} are printed. ++If it is @i{false}, the contents of @i{arrays} other than @i{strings} ++are never printed. Instead, @i{arrays} are printed in a concise form using ++@t{#<} that gives enough information for the user to be able to identify the ++@i{array}, but does not include the entire @i{array} contents. ++If it is @i{true}, non-@i{string} @i{arrays} are printed using ++@t{#(...)}, @t{#*}, or @t{#nA} syntax. ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@subsubheading See Also:: ++ ++@ref{Sharpsign Left-Parenthesis}, ++@ref{Sharpsign Less-Than-Sign} ++ ++@node *print-base*, *print-case*, *print-array*, Printer Dictionary ++@subsection *print-base*, *print-radix* [Variable] ++ ++@subsubheading Value Type:: ++ ++@b{*print-base*}---a @i{radix}. ++@b{*print-radix*}---a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++The initial @i{value} of @b{*print-base*} is @t{10}. ++The initial @i{value} of @b{*print-radix*} is @i{false}. ++ ++@subsubheading Description:: ++ ++@b{*print-base*} and @b{*print-radix*} control the printing ++of @i{rationals}. ++The @i{value} of @b{*print-base*} is called the @i{current output base} ++@IGindex current output base ++. ++ ++The @i{value} of @b{*print-base*} is the @i{radix} in which the printer ++will print @i{rationals}. For radices above @t{10}, letters of ++the alphabet are used to represent digits above @t{9}. ++ ++If the @i{value} of @b{*print-radix*} is @i{true}, ++the printer will print a radix specifier to indicate the @i{radix} ++in which it is printing a @i{rational} number. The radix specifier ++is always printed using lowercase letters. If @b{*print-base*} ++is @t{2}, @t{8}, or @t{16}, then the radix specifier used is @t{#b}, ++@t{#o}, or @t{#x}, respectively. For @i{integers}, base ten is ++indicated by a trailing decimal point instead of a leading radix ++specifier; for @i{ratios}, @t{#10r} is used. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((*print-base* 24.) (*print-radix* t)) ++ (print 23.)) ++@t{ |> } #24rN ++@result{} 23 ++ (setq *print-base* 10) @result{} 10 ++ (setq *print-radix* nil) @result{} NIL ++ (dotimes (i 35) ++ (let ((*print-base* (+ i 2))) ;print the decimal number 40 ++ (write 40) ;in each base from 2 to 36 ++ (if (zerop (mod i 10)) (terpri) (format t " ")))) ++@t{ |> } 101000 ++@t{ |> } 1111 220 130 104 55 50 44 40 37 34 ++@t{ |> } 31 2C 2A 28 26 24 22 20 1J 1I ++@t{ |> } 1H 1G 1F 1E 1D 1C 1B 1A 19 18 ++@t{ |> } 17 16 15 14 ++@result{} NIL ++ (dolist (pb '(2 3 8 10 16)) ++ (let ((*print-radix* t) ;print the integer 10 and ++ (*print-base* pb)) ;the ratio 1/10 in bases 2, ++ (format t "~&~S ~S~ ++@t{ |> } #b1010 #b1/1010 ++@t{ |> } #3r101 #3r1/101 ++@t{ |> } #o12 #o1/12 ++@t{ |> } 10. #10r1/10 ++@t{ |> } #xA #x1/A ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++Might be @i{bound} by @b{format}, and @b{write}, @b{write-to-string}. ++ ++@subsubheading See Also:: ++ ++@ref{format} ++, ++@ref{write} ++, ++@ref{write-to-string} ++ ++@node *print-case*, *print-circle*, *print-base*, Printer Dictionary ++@subsection *print-case* [Variable] ++ ++@subsubheading Value Type:: ++ ++One of the @i{symbols} @t{:upcase}, @t{:downcase}, or @t{:capitalize}. ++ ++@subsubheading Initial Value:: ++ ++The @i{symbol} @t{:upcase}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*print-case*} controls the case (upper, lower, or mixed) in ++which to print any uppercase characters in the names of @i{symbols} ++when vertical-bar syntax is not used. ++ ++@b{*print-case*} has an effect at all times when the @i{value} of @b{*print-escape*} ++is @i{false}. @b{*print-case*} also has an effect when ++the @i{value} of @b{*print-escape*} is @i{true} unless inside an escape context ++(@i{i.e.}, unless between @i{vertical-bars} or after a @i{slash}). ++ ++@subsubheading Examples:: ++ ++@example ++ (defun test-print-case () ++ (dolist (*print-case* '(:upcase :downcase :capitalize)) ++ (format t "~&~S ~S~ ++@result{} TEST-PC ++;; Although the choice of which characters to escape is specified by ++;; *PRINT-CASE*, the choice of how to escape those characters ++;; (i.e., whether single escapes or multiple escapes are used) ++;; is implementation-dependent. The examples here show two of the ++;; many valid ways in which escaping might appear. ++ (test-print-case) ;Implementation A ++@t{ |> } THIS-AND-THAT |And-something-elSE| ++@t{ |> } this-and-that a\n\d-\s\o\m\e\t\h\i\n\g-\e\lse ++@t{ |> } This-And-That A\n\d-\s\o\m\e\t\h\i\n\g-\e\lse ++@result{} NIL ++ (test-print-case) ;Implementation B ++@t{ |> } THIS-AND-THAT |And-something-elSE| ++@t{ |> } this-and-that a|nd-something-el|se ++@t{ |> } This-And-That A|nd-something-el|se ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{write} ++ ++@subsubheading Notes:: ++ ++@b{read} normally converts lowercase characters appearing ++in @i{symbols} to corresponding uppercase characters, ++so that internally print names normally contain only uppercase characters. ++ ++If @b{*print-escape*} is @i{true}, ++lowercase characters in the @i{name} of a @i{symbol} ++are always printed in lowercase, and ++are preceded by a single escape character ++or enclosed by multiple escape characters; ++uppercase characters in the @i{name} of a @i{symbol} ++are printed in upper case, in lower case, or in mixed case ++so as to capitalize words, according to the value of ++@b{*print-case*}. The convention for what constitutes ++a ``word'' is the same as for @b{string-capitalize}. ++ ++@node *print-circle*, *print-escape*, *print-case*, Printer Dictionary ++@subsection *print-circle* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{false}. ++ ++@subsubheading Description:: ++ ++Controls the attempt to detect circularity and sharing in an @i{object} ++being printed. ++ ++If @i{false}, ++the printing process merely proceeds by recursive descent without attempting ++to detect circularity and sharing. ++ ++If @i{true}, ++the printer will endeavor to detect cycles and sharing ++in the structure to be printed, ++and to use @t{#@i{n}=} and @t{#@i{n}#} ++syntax to indicate the circularities or shared components. ++ ++If @i{true}, a user-defined ++ ++@b{print-object} @i{method} ++ ++can print ++@i{objects} to the supplied @i{stream} using @b{write}, @b{prin1}, ++@b{princ}, or @b{format} and expect circularities and sharing ++to be detected and printed using the @t{#@i{n}#} syntax. ++ ++If a user-defined ++ ++@b{print-object} @i{method} ++ ++prints to a @i{stream} other than the one ++that was supplied, then circularity detection starts over for that @i{stream}. ++ ++Note that implementations should not use @t{#@i{n}#} notation ++when the @i{Lisp reader} would automatically assure sharing without it ++(@i{e.g.}, as happens with @i{interned} @i{symbols}). ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((a (list 1 2 3))) ++ (setf (cdddr a) a) ++ (let ((*print-circle* t)) ++ (write a) ++ :done)) ++@t{ |> } #1=(1 2 3 . #1#) ++@result{} :DONE ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{write} ++ ++@subsubheading Notes:: ++ ++An attempt to print a circular structure with @b{*print-circle*} ++set to @b{nil} may lead to looping behavior and failure to terminate. ++ ++@node *print-escape*, *print-gensym*, *print-circle*, Printer Dictionary ++@subsection *print-escape* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{true}. ++ ++@subsubheading Description:: ++ ++If @i{false}, ++escape characters and @i{package prefixes} are not output ++when an expression is printed. ++ ++If @i{true}, an attempt is made to print an @i{expression} ++in such a way that it can be read again to produce an @b{equal} @i{expression}. ++(This is only a guideline; not a requirement. See @b{*print-readably*}.) ++ ++For more specific details of how the @i{value} of @b{*print-escape*} ++affects the printing of certain @i{types}, ++see @ref{Default Print-Object Methods}. ++ ++@subsubheading Examples:: ++@example ++ (let ((*print-escape* t)) (write #\a)) ++@t{ |> } #\a ++@result{} #\a ++ (let ((*print-escape* nil)) (write #\a)) ++@t{ |> } a ++@result{} #\a ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{princ}, @b{prin1}, @b{format} ++ ++@subsubheading See Also:: ++ ++@ref{write} ++, ++@ref{readtable-case} ++ ++@subsubheading Notes:: ++ ++@b{princ} effectively binds @b{*print-escape*} to @i{false}. ++@b{prin1} effectively binds @b{*print-escape*} to @i{true}. ++ ++@node *print-gensym*, *print-level*, *print-escape*, Printer Dictionary ++@subsection *print-gensym* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{true}. ++ ++@subsubheading Description:: ++ ++Controls whether the prefix ``@t{#:}'' is printed before ++@i{apparently uninterned} @i{symbols}. ++The prefix is printed before such @i{symbols} ++if and only if the @i{value} of @b{*print-gensym*} is @i{true}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((*print-gensym* nil)) ++ (print (gensym))) ++@t{ |> } G6040 ++@result{} #:G6040 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{write} ++, @b{*print-escape*} ++ ++@node *print-level*, *print-lines*, *print-gensym*, Printer Dictionary ++@subsection *print-level*, *print-length* [Variable] ++ ++@subsubheading Value Type:: ++ ++a non-negative @i{integer}, or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++@b{*print-level*} controls how many levels deep a nested @i{object} will print. ++If it is @i{false}, then no control is exercised. ++Otherwise, it is an @i{integer} indicating the maximum level to be printed. ++An @i{object} to be printed is at level @t{0}; ++its components (as of a @i{list} or @i{vector}) are at level @t{1}; ++and so on. ++If an @i{object} to be recursively printed has components ++and is at a level equal to or greater than the @i{value} of @b{*print-level*}, ++then the @i{object} is printed as ``@t{#}''. ++ ++@b{*print-length*} controls how many elements at a given level are printed. ++If it is @i{false}, there is no limit to the number of components printed. ++Otherwise, it is an @i{integer} indicating the maximum number of @i{elements} ++of an @i{object} to be printed. If exceeded, the printer will print ++``@t{...}'' in place of the other @i{elements}. In the case of a @i{dotted list}, ++if the @i{list} contains exactly as many @i{elements} as the @i{value} of @b{*print-length*}, ++the terminating @i{atom} is printed rather than printing ``@t{...}'' ++ ++@b{*print-level*} and @b{*print-length*} affect the printing ++of an any @i{object} printed with a list-like syntax. They do not affect ++the printing of @i{symbols}, @i{strings}, and @i{bit vectors}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a '(1 (2 (3 (4 (5 (6))))))) @result{} (1 (2 (3 (4 (5 (6)))))) ++ (dotimes (i 8) ++ (let ((*print-level* i)) ++ (format t "~&~D -- ~S~ ++@t{ |> } 0 -- # ++@t{ |> } 1 -- (1 #) ++@t{ |> } 2 -- (1 (2 #)) ++@t{ |> } 3 -- (1 (2 (3 #))) ++@t{ |> } 4 -- (1 (2 (3 (4 #)))) ++@t{ |> } 5 -- (1 (2 (3 (4 (5 #))))) ++@t{ |> } 6 -- (1 (2 (3 (4 (5 (6)))))) ++@t{ |> } 7 -- (1 (2 (3 (4 (5 (6)))))) ++@result{} NIL ++ ++ (setq a '(1 2 3 4 5 6)) @result{} (1 2 3 4 5 6) ++ (dotimes (i 7) ++ (let ((*print-length* i)) ++ (format t "~&~D -- ~S~ ++@t{ |> } 0 -- (...) ++@t{ |> } 1 -- (1 ...) ++@t{ |> } 2 -- (1 2 ...) ++@t{ |> } 3 -- (1 2 3 ...) ++@t{ |> } 4 -- (1 2 3 4 ...) ++@t{ |> } 5 -- (1 2 3 4 5 6) ++@t{ |> } 6 -- (1 2 3 4 5 6) ++@result{} NIL ++ ++(dolist (level-length '((0 1) (1 1) (1 2) (1 3) (1 4) ++ (2 1) (2 2) (2 3) (3 2) (3 3) (3 4))) ++ (let ((*print-level* (first level-length)) ++ (*print-length* (second level-length))) ++ (format t "~&~D ~D -- ~S~ ++ *print-level* *print-length* ++ '(if (member x y) (+ (car x) 3) '(foo . #(a b c d "Baz")))))) ++@t{ |> } 0 1 -- # ++@t{ |> } 1 1 -- (IF ...) ++@t{ |> } 1 2 -- (IF # ...) ++@t{ |> } 1 3 -- (IF # # ...) ++@t{ |> } 1 4 -- (IF # # #) ++@t{ |> } 2 1 -- (IF ...) ++@t{ |> } 2 2 -- (IF (MEMBER X ...) ...) ++@t{ |> } 2 3 -- (IF (MEMBER X Y) (+ # 3) ...) ++@t{ |> } 3 2 -- (IF (MEMBER X ...) ...) ++@t{ |> } 3 3 -- (IF (MEMBER X Y) (+ (CAR X) 3) ...) ++@t{ |> } 3 4 -- (IF (MEMBER X Y) (+ (CAR X) 3) '(FOO . #(A B C D ...))) ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{write} ++ ++@node *print-lines*, *print-miser-width*, *print-level*, Printer Dictionary ++@subsection *print-lines* [Variable] ++ ++@subsubheading Value Type:: ++ ++a non-negative @i{integer}, or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++When the @i{value} of @b{*print-lines*} is other than @b{nil}, ++it is a limit on the number of output lines produced when something is pretty ++printed. If an attempt is made to go beyond that many lines, ++``@t{..}'' is printed at the end of the last line followed by all of the ++suffixes (closing delimiters) that are pending to be printed. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((*print-right-margin* 25) (*print-lines* 3)) ++ (pprint '(progn (setq a 1 b 2 c 3 d 4)))) ++@t{ |> } (PROGN (SETQ A 1 ++@t{ |> } B 2 ++@t{ |> } C 3 ..)) ++@result{} <@i{no @i{values}}> ++@end example ++ ++@subsubheading Notes:: ++ ++The ``@t{..}'' notation is intentionally different than ++the ``@t{...}'' notation used for level abbreviation, so that the two ++different situations can be visually distinguished. ++ ++This notation is used to increase the likelihood that the @i{Lisp reader} ++will signal an error if an attempt is later made to read the abbreviated output. ++Note however that if the truncation occurs in a @i{string}, ++as in @t{"This string has been trunc.."}, the problem situation cannot be ++detected later and no such error will be signaled. ++ ++@node *print-miser-width*, *print-pprint-dispatch*, *print-lines*, Printer Dictionary ++@subsection *print-miser-width* [Variable] ++ ++@subsubheading Value Type:: ++ ++a non-negative @i{integer}, or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent} ++ ++@subsubheading Description:: ++ ++If it is not @b{nil}, the @i{pretty printer} switches to a compact ++style of output (called miser style) whenever the width available for ++printing a substructure is less than or equal to this many @i{ems}. ++ ++@node *print-pprint-dispatch*, *print-pretty*, *print-miser-width*, Printer Dictionary ++@subsection *print-pprint-dispatch* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{pprint dispatch table}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}, but the initial entries all use a ++special class of priorities that have the property that they are less ++than every priority that can be specified using @b{set-pprint-dispatch}, ++so that the initial contents of any entry can be overridden. ++ ++@subsubheading Description:: ++ ++The @i{pprint dispatch table} which currently controls the @i{pretty printer}. ++ ++@subsubheading See Also:: ++ ++@b{*print-pretty*}, ++@ref{Pretty Print Dispatch Tables} ++ ++@subsubheading Notes:: ++ ++The intent is that the initial @i{value} of this @i{variable} should ++cause `traditional' @i{pretty printing} of @i{code}. ++In general, however, you can put a value in @b{*print-pprint-dispatch*} ++that makes pretty-printed output look exactly like non-pretty-printed output. ++ ++Setting @b{*print-pretty*} to @i{true} ++just causes the functions contained in the @i{current pprint dispatch table} ++to have priority over normal @b{print-object} methods; ++it has no magic way of enforcing that those functions actually produce pretty ++output. For details, see @ref{Pretty Print Dispatch Tables}. ++ ++@node *print-pretty*, *print-readably*, *print-pprint-dispatch*, Printer Dictionary ++@subsection *print-pretty* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++Controls whether the @i{Lisp printer} calls the @i{pretty printer}. ++ ++If it is @i{false}, ++the @i{pretty printer} is not used and ++ ++a minimum ++ ++of @i{whitespace}_1 ++is output when printing an expression. ++ ++If it is @i{true}, ++the @i{pretty printer} is used, and the @i{Lisp printer} will endeavor ++to insert extra @i{whitespace}_1 where appropriate to make @i{expressions} ++more readable. ++ ++@b{*print-pretty*} has an effect even when the @i{value} of @b{*print-escape*} ++is @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq *print-pretty* 'nil) @result{} NIL ++ (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil) ++@t{ |> } (LET ((A 1) (B 2) (C 3)) (+ A B C)) ++@result{} NIL ++ (let ((*print-pretty* t)) ++ (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil)) ++@t{ |> } (LET ((A 1) ++@t{ |> } (B 2) ++@t{ |> } (C 3)) ++@t{ |> } (+ A B C)) ++@result{} NIL ++;; Note that the first two expressions printed by this next form ++;; differ from the second two only in whether escape characters are printed. ++;; In all four cases, extra whitespace is inserted by the pretty printer. ++ (flet ((test (x) ++ (let ((*print-pretty* t)) ++ (print x) ++ (format t "~ ++ (terpri) (princ x) (princ " ") ++ (format t "~ ++ (test '#'(lambda () (list "a" #@b{'c} #'d)))) ++@t{ |> } #'(LAMBDA () ++@t{ |> } (LIST "a" #@b{'C} #'D)) ++@t{ |> } #'(LAMBDA () ++@t{ |> } (LIST "a" #@b{'C} #'D)) ++@t{ |> } #'(LAMBDA () ++@t{ |> } (LIST a b 'C #'D)) ++@t{ |> } #'(LAMBDA () ++@t{ |> } (LIST a b 'C #'D)) ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{write} ++ ++@node *print-readably*, *print-right-margin*, *print-pretty*, Printer Dictionary ++@subsection *print-readably* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{false}. ++ ++@subsubheading Description:: ++ ++If @b{*print-readably*} is @i{true}, ++some special rules for printing @i{objects} go into effect. ++Specifically, printing any @i{object} O_1 produces a printed ++representation that, when seen by the @i{Lisp reader} ++while the @i{standard readtable} is in effect, ++will produce ++an @i{object} O_2 that is @i{similar} to O_1. ++The printed representation produced might or might not be the same as ++the printed representation produced when @b{*print-readably*} is @i{false}. ++If printing an @i{object} @i{readably} is not possible, ++an error of @i{type} @b{print-not-readable} is signaled rather than ++using a syntax (@i{e.g.}, the ``@t{#<}'' syntax) that would not be readable by ++the same @i{implementation}. ++If the @i{value} of some other @i{printer control variable} is such ++that these requirements would be violated, the @i{value} of that other ++@i{variable} is ignored. ++ ++Specifically, if @b{*print-readably*} is @i{true}, ++printing proceeds as if ++ @b{*print-escape*}, ++ @b{*print-array*}, ++ and @b{*print-gensym*} were also @i{true}, ++and as if ++ @b{*print-length*}, ++ @b{*print-level*}, ++ and @b{*print-lines*} were @i{false}. ++ ++If @b{*print-readably*} is @i{false}, ++the normal rules for printing and the normal interpretations ++of other @i{printer control variables} are in effect. ++ ++Individual @i{methods} for @b{print-object}, including user-defined ++@i{methods}, are responsible for implementing these requirements. ++ ++If @b{*read-eval*} is @i{false} and @b{*print-readably*} is @i{true}, ++any such method that would output a reference to the ``@t{#.}'' @i{reader macro} ++will either output something else or will signal an error (as described above). ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((x (list "a" '\a (gensym) '((a (b (c))) d e f g))) ++ (*print-escape* nil) ++ (*print-gensym* nil) ++ (*print-level* 3) ++ (*print-length* 3)) ++ (write x) ++ (let ((*print-readably* t)) ++ (terpri) ++ (write x) ++ :done)) ++@t{ |> } (a a G4581 ((A #) D E ...)) ++@t{ |> } ("a" |a| #:G4581 ((A (B (C))) D E F G)) ++@result{} :DONE ++ ++;; This is setup code is shared between the examples ++;; of three hypothetical implementations which follow. ++ (setq table (make-hash-table)) @result{} # ++ (setf (gethash table 1) 'one) @result{} ONE ++ (setf (gethash table 2) 'two) @result{} TWO ++ ++;; Implementation A ++ (let ((*print-readably* t)) (print table)) ++ Error: Can't print # readably. ++ ++;; Implementation B ++;; No standardized #S notation for hash tables is defined, ++;; but there might be an implementation-defined notation. ++ (let ((*print-readably* t)) (print table)) ++@t{ |> } #S(HASH-TABLE :TEST EQL :SIZE 120 :CONTENTS (1 ONE 2 TWO)) ++@result{} # ++ ++;; Implementation C ++;; Note that #. notation can only be used if *READ-EVAL* is true. ++;; If *READ-EVAL* were false, this same implementation might have to ++;; signal an error unless it had yet another printing strategy to fall ++;; back on. ++ (let ((*print-readably* t)) (print table)) ++@t{ |> } #.(LET ((HASH-TABLE (MAKE-HASH-TABLE))) ++@t{ |> } (SETF (GETHASH 1 HASH-TABLE) ONE) ++@t{ |> } (SETF (GETHASH 2 HASH-TABLE) TWO) ++@t{ |> } HASH-TABLE) ++@result{} # ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{write} ++, ++@ref{print-unreadable-object} ++ ++@subsubheading Notes:: ++ ++The rules for ``@i{similarity}'' imply that ++@t{#A} or @t{#(} ++syntax cannot be used for @i{arrays} of @i{element type} ++other than @b{t}. ++An implementation will have to use another syntax ++or signal an error of @i{type} @b{print-not-readable}. ++ ++@node *print-right-margin*, print-not-readable, *print-readably*, Printer Dictionary ++@subsection *print-right-margin* [Variable] ++ ++@subsubheading Value Type:: ++ ++a non-negative @i{integer}, or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++If it is @i{non-nil}, it specifies the right margin (as @i{integer} ++number of @i{ems}) to use when the @i{pretty printer} is making ++layout decisions. ++ ++If it is @b{nil}, the right margin is taken to be the maximum line length ++such that output can be displayed without wraparound or truncation. ++If this cannot be determined, an @i{implementation-dependent} value is used. ++ ++@subsubheading Notes:: ++ ++This measure is in units of @i{ems} in order to be compatible with ++@i{implementation-defined} variable-width fonts while still not ++requiring the language to provide support for fonts. ++ ++@node print-not-readable, print-not-readable-object, *print-right-margin*, Printer Dictionary ++@subsection print-not-readable [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{print-not-readable}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{print-not-readable} consists of error conditions that occur during ++output while @b{*print-readably*} is @i{true}, as a result of attempting ++to write a printed representation with the @i{Lisp printer} ++that would not be correctly read back with the @i{Lisp reader}. ++The object which could not be printed is initialized by ++the @t{:object} initialization argument to @b{make-condition}, and is @i{accessed} by ++the @i{function} @b{print-not-readable-object}. ++ ++@subsubheading See Also:: ++ ++@ref{print-not-readable-object} ++ ++@node print-not-readable-object, format, print-not-readable, Printer Dictionary ++@subsection print-not-readable-object [Function] ++ ++@code{print-not-readable-object} @i{condition} @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{print-not-readable}. ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Returns the @i{object} that could not be printed readably ++in the situation represented by @i{condition}. ++ ++@subsubheading See Also:: ++ ++@b{print-not-readable}, ++@ref{Conditions} ++ ++@node format, , print-not-readable-object, Printer Dictionary ++@subsection format [Function] ++ ++@code{format} @i{destination control-string @r{&rest} args} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{destination}---@b{nil}, ++ @b{t}, ++ a @i{stream}, ++ or a @i{string} with a @i{fill pointer}. ++ ++@i{control-string}---a @i{format control}. ++ ++@i{args}---@i{format arguments} for @i{control-string}. ++ ++@i{result}---if @i{destination} is @i{non-nil}, then @b{nil}; ++ otherwise, a @i{string}. ++ ++@subsubheading Description:: ++ ++@b{format} produces formatted output by outputting the characters ++of @i{control-string} and observing that a @i{tilde} ++introduces a directive. The character after the tilde, possibly preceded ++by prefix parameters and modifiers, specifies what kind of formatting ++is desired. Most directives use one or more elements of @i{args} to ++create their output. ++ ++If @i{destination} is a @i{string}, a @i{stream}, or @b{t}, ++then the @i{result} is @b{nil}. Otherwise, the @i{result} is ++a @i{string} containing the `output.' ++ ++@b{format} is useful for producing nicely formatted text, producing ++good-looking messages, and so on. @b{format} can generate and return ++a @i{string} or output to @i{destination}. ++ ++For details on how the @i{control-string} is interpreted, ++see @ref{Formatted Output}. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}, ++@b{*print-escape*}, ++@b{*print-radix*}, ++@b{*print-base*}, ++@b{*print-circle*}, ++@b{*print-pretty*}, ++@b{*print-level*}, ++@b{*print-length*}, ++@b{*print-case*}, ++@b{*print-gensym*}, ++@b{*print-array*}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{destination} is a @i{string} with a @i{fill pointer}, ++the consequences are undefined if destructive modifications are performed ++directly on the @i{string} during the @i{dynamic extent} of the call. ++ ++@subsubheading See Also:: ++ ++@ref{write} ++, ++@ref{Documentation of Implementation-Defined Scripts} ++ ++@c end of including dict-printer ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-23.texi +@@ -0,0 +1,1457 @@ ++ ++ ++@node Reader, System Construction, Printer, Top ++@chapter Reader ++ ++@menu ++* Reader Concepts:: ++* Reader Dictionary:: ++@end menu ++ ++@node Reader Concepts, Reader Dictionary, Reader, Reader ++@section Reader Concepts ++ ++@c including concept-reader ++ ++@menu ++* Dynamic Control of the Lisp Reader:: ++* Effect of Readtable Case on the Lisp Reader:: ++* Argument Conventions of Some Reader Functions:: ++@end menu ++ ++@node Dynamic Control of the Lisp Reader, Effect of Readtable Case on the Lisp Reader, Reader Concepts, Reader Concepts ++@subsection Dynamic Control of the Lisp Reader ++ ++Various aspects of the @i{Lisp reader} can be controlled dynamically. ++See @ref{Readtables} and @ref{Variables that affect the Lisp Reader}. ++ ++@node Effect of Readtable Case on the Lisp Reader, Argument Conventions of Some Reader Functions, Dynamic Control of the Lisp Reader, Reader Concepts ++@subsection Effect of Readtable Case on the Lisp Reader ++ ++The @i{readtable case} of the @i{current readtable} affects the @i{Lisp reader} ++in the following ways: ++ ++@table @asis ++ ++@item @t{:upcase} ++When the @i{readtable case} is @t{:upcase}, ++ unescaped constituent @i{characters} are converted to @i{uppercase}, ++ as specified in @ref{Reader Algorithm}. ++ ++@item @t{:downcase} ++When the @i{readtable case} is @t{:downcase}, ++ unescaped constituent @i{characters} are converted to @i{lowercase}. ++ ++@item @t{:preserve} ++When the @i{readtable case} is @t{:preserve}, ++ the case of all @i{characters} remains unchanged. ++ ++@item @t{:invert} ++When the @i{readtable case} is @t{:invert}, ++ then if all of the unescaped letters in the extended token are of the same @i{case}, ++ those (unescaped) letters are converted to the opposite @i{case}. ++ ++@end table ++ ++@menu ++* Examples of Effect of Readtable Case on the Lisp Reader:: ++@end menu ++ ++@node Examples of Effect of Readtable Case on the Lisp Reader, , Effect of Readtable Case on the Lisp Reader, Effect of Readtable Case on the Lisp Reader ++@subsubsection Examples of Effect of Readtable Case on the Lisp Reader ++ ++@example ++ (defun test-readtable-case-reading () ++ (let ((*readtable* (copy-readtable nil))) ++ (format t "READTABLE-CASE Input Symbol-name~ ++ ~ ++ ~ ++ (dolist (readtable-case '(:upcase :downcase :preserve :invert)) ++ (setf (readtable-case *readtable*) readtable-case) ++ (dolist (input '("ZEBRA" "Zebra" "zebra")) ++ (format t "~&:~A~16T~A~24T~A" ++ (string-upcase readtable-case) ++ input ++ (symbol-name (read-from-string input))))))) ++@end example ++ ++The output from @t{(test-readtable-case-reading)} should be as follows: ++ ++@example ++ READTABLE-CASE Input Symbol-name ++ ------------------------------------- ++ :UPCASE ZEBRA ZEBRA ++ :UPCASE Zebra ZEBRA ++ :UPCASE zebra ZEBRA ++ :DOWNCASE ZEBRA zebra ++ :DOWNCASE Zebra zebra ++ :DOWNCASE zebra zebra ++ :PRESERVE ZEBRA ZEBRA ++ :PRESERVE Zebra Zebra ++ :PRESERVE zebra zebra ++ :INVERT ZEBRA zebra ++ :INVERT Zebra Zebra ++ :INVERT zebra ZEBRA ++@end example ++ ++@node Argument Conventions of Some Reader Functions, , Effect of Readtable Case on the Lisp Reader, Reader Concepts ++@subsection Argument Conventions of Some Reader Functions ++ ++@menu ++* The EOF-ERROR-P argument:: ++* The RECURSIVE-P argument:: ++@end menu ++ ++@node The EOF-ERROR-P argument, The RECURSIVE-P argument, Argument Conventions of Some Reader Functions, Argument Conventions of Some Reader Functions ++@subsubsection The EOF-ERROR-P argument ++ ++@i{Eof-error-p} in input function calls ++controls what happens if input is from a file (or any other ++input source that has a definite end) and the end of the file is reached. ++If @i{eof-error-p} is @i{true} (the default), ++an error of @i{type} @b{end-of-file} is signaled ++at end of file. If it is @i{false}, then no error is signaled, and instead ++the function returns @i{eof-value}. ++ ++Functions such as @b{read} that read the representation ++of an @i{object} rather than a single ++character always signals an error, regardless of @i{eof-error-p}, if ++the file ends in the middle of an object representation. ++For example, if a file does ++not contain enough right parentheses to balance the left parentheses in ++it, @b{read} signals an error. If a file ends in a ++@i{symbol} or a @i{number} ++immediately followed by end-of-file, @b{read} reads the ++@i{symbol} or ++@i{number} ++successfully and when called again will ++act according to @i{eof-error-p}. ++Similarly, the @i{function} @b{read-line} ++successfully reads the last line of a file even if that line ++is terminated by end-of-file rather than the newline character. ++Ignorable text, such as lines containing only @i{whitespace}_2 or comments, ++are not considered to begin an @i{object}; ++if @b{read} begins to read an @i{expression} but sees only such ++ignorable text, it does not consider the file to end in the middle of an @i{object}. ++Thus an @i{eof-error-p} argument controls what happens ++when the file ends between @i{objects}. ++ ++@node The RECURSIVE-P argument, , The EOF-ERROR-P argument, Argument Conventions of Some Reader Functions ++@subsubsection The RECURSIVE-P argument ++ ++If @i{recursive-p} is supplied and not @b{nil}, it specifies that ++this function call is not an outermost call to @b{read} but an ++embedded call, typically from a @i{reader macro function}. ++It is important to distinguish such recursive calls for three reasons. ++ ++@table @asis ++ ++@item 1. ++An outermost call establishes the context within which the ++@t{#@i{n}=} and @t{#@i{n}#} syntax is scoped. Consider, for example, ++the expression ++ ++@example ++ (cons '#3=(p q r) '(x y . #3#)) ++@end example ++ ++If the @i{single-quote} @i{reader macro} were defined in this way: ++ ++@example ++ (set-macro-character #\' ;incorrect ++ #'(lambda (stream char) ++ (declare (ignore char)) ++ (list 'quote (read stream)))) ++@end example ++ ++then each call to the @i{single-quote} @i{reader macro function} would establish ++independent contexts for the scope of @b{read} information, including the scope of ++identifications between markers like ``@t{#3=}'' and ``@t{#3#}''. However, for ++this expression, the scope was clearly intended to be determined by the outer set ++of parentheses, so such a definition would be incorrect. ++The correct way to define the @i{single-quote} ++@i{reader macro} uses @i{recursive-p}: ++ ++@example ++ (set-macro-character #\' ;correct ++ #'(lambda (stream char) ++ (declare (ignore char)) ++ (list 'quote (read stream t nil t)))) ++@end example ++ ++@item 2. ++A recursive call does not alter whether the reading process ++is to preserve @i{whitespace}_2 or not (as determined by whether the ++outermost call was to @b{read} or @b{read-preserving-whitespace}). ++Suppose again that @i{single-quote} ++were to be defined as shown above in the incorrect definition. ++Then a call to @b{read-preserving-whitespace} ++that read the expression @t{'foo<@i{Space}>} would fail to preserve the space ++character following the symbol @t{foo} because the @i{single-quote} ++@i{reader macro function} calls @b{read}, ++not @b{read-preserving-whitespace}, ++to read the following expression (in this case @t{foo}). ++The correct definition, which passes the value @i{true} for @i{recursive-p} ++to @b{read}, allows the outermost call to determine ++whether @i{whitespace}_2 is preserved. ++ ++@item 3. ++When end-of-file is encountered and the @i{eof-error-p} argument ++is not @b{nil}, the kind of error that is signaled may depend on the value ++of @i{recursive-p}. If @i{recursive-p} ++is @i{true}, then the end-of-file ++is deemed to have occurred within the middle of a printed representation; ++if @i{recursive-p} is @i{false}, then the end-of-file may be deemed to have ++occurred between @i{objects} rather than within the middle of one. ++ ++@end table ++ ++@c end of including concept-reader ++ ++@node Reader Dictionary, , Reader Concepts, Reader ++@section Reader Dictionary ++ ++@c including dict-reader ++ ++@menu ++* readtable:: ++* copy-readtable:: ++* make-dispatch-macro-character:: ++* read:: ++* read-delimited-list:: ++* read-from-string:: ++* readtable-case:: ++* readtablep:: ++* set-dispatch-macro-character:: ++* set-macro-character:: ++* set-syntax-from-char:: ++* with-standard-io-syntax:: ++* *read-base*:: ++* *read-default-float-format*:: ++* *read-eval*:: ++* *read-suppress*:: ++* *readtable*:: ++* reader-error:: ++@end menu ++ ++@node readtable, copy-readtable, Reader Dictionary, Reader Dictionary ++@subsection readtable [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{readtable}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{readtable} maps @i{characters} into @i{syntax types} for ++the @i{Lisp reader}; see @ref{Syntax}. ++A @i{readtable} also ++ contains associations between @i{macro characters} ++ and their @i{reader macro functions}, ++ and records information about the case conversion rules ++ to be used by the @i{Lisp reader} when parsing @i{symbols}. ++ ++Each @i{simple} @i{character} must be representable in the @i{readtable}. ++It is @i{implementation-defined} whether @i{non-simple} @i{characters} ++can have syntax descriptions in the @i{readtable}. ++ ++@subsubheading See Also:: ++ ++@ref{Readtables}, ++@ref{Printing Other Objects} ++ ++@node copy-readtable, make-dispatch-macro-character, readtable, Reader Dictionary ++@subsection copy-readtable [Function] ++ ++@code{copy-readtable} @i{@r{&optional} from-readtable to-readtable} @result{} @i{readtable} ++ ++@subsubheading Arguments and Values:: ++ ++@i{from-readtable}---a @i{readtable designator}. ++ The default is the @i{current readtable}. ++ ++@i{to-readtable}---a @i{readtable} or @b{nil}. ++ The default is @b{nil}. ++ ++@i{readtable}---the @i{to-readtable} if it is @i{non-nil}, ++ or else a @i{fresh} @i{readtable}. ++ ++@subsubheading Description:: ++ ++@b{copy-readtable} copies @i{from-readtable}. ++ ++If @i{to-readtable} is @b{nil}, a new @i{readtable} is created and returned. ++Otherwise the @i{readtable} specified by @i{to-readtable} is modified and returned. ++ ++@b{copy-readtable} copies the setting of @b{readtable-case}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq zvar 123) @result{} 123 ++ (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) @result{} T ++ zvar @result{} 123 ++ (copy-readtable table2 *readtable*) @result{} # ++ zvar @result{} VAR ++ (setq *readtable* (copy-readtable)) @result{} # ++ zvar @result{} VAR ++ (setq *readtable* (copy-readtable nil)) @result{} # ++ zvar @result{} 123 ++@end example ++ ++@subsubheading See Also:: ++ ++@b{readtable}, ++@ref{readtable} ++ ++@subsubheading Notes:: ++ ++@example ++(setq *readtable* (copy-readtable nil)) ++@end example ++ ++restores the input syntax to standard @r{Common Lisp} syntax, even if ++the @i{initial readtable} has been clobbered ++(assuming it is not so badly clobbered that you cannot type in the above expression). ++ ++On the other hand, ++ ++@example ++(setq *readtable* (copy-readtable)) ++@end example ++ ++replaces the current @i{readtable} with a copy of itself. ++This is useful if you want to save a copy of a readtable for later use, ++protected from alteration in the meantime. It is also useful if you want to ++locally bind the readtable to a copy of itself, as in: ++ ++@example ++(let ((*readtable* (copy-readtable))) ...) ++@end example ++ ++@node make-dispatch-macro-character, read, copy-readtable, Reader Dictionary ++@subsection make-dispatch-macro-character [Function] ++ ++@code{make-dispatch-macro-character} @i{char @r{&optional} non-terminating-p readtable} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{char}---a @i{character}. ++ ++@i{non-terminating-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{readtable}---a @i{readtable}. ++ The default is the @i{current readtable}. ++ ++@subsubheading Description:: ++ ++@b{make-dispatch-macro-character} makes @i{char} ++be a @i{dispatching macro character} in @i{readtable}. ++ ++Initially, every @i{character} in the dispatch table ++associated with the @i{char} has an associated function ++that signals an error of @i{type} @b{reader-error}. ++ ++If @i{non-terminating-p} is @i{true}, ++the @i{dispatching macro character} ++is made a @i{non-terminating} @i{macro character}; ++if @i{non-terminating-p} is @i{false}, ++the @i{dispatching macro character} ++is made a @i{terminating} @i{macro character}. ++ ++@subsubheading Examples:: ++ ++@example ++ (get-macro-character #\@{) @result{} NIL, @i{false} ++ (make-dispatch-macro-character #\@{) @result{} T ++ (not (get-macro-character #\@{)) @result{} @i{false} ++@end example ++ ++The @i{readtable} is altered. ++ ++@subsubheading See Also:: ++ ++@ref{readtable} ++, ++@ref{set-dispatch-macro-character} ++ ++@node read, read-delimited-list, make-dispatch-macro-character, Reader Dictionary ++@subsection read, read-preserving-whitespace [Function] ++ ++@code{read} @i{@r{&optional} input-stream eof-error-p eof-value recursive-p} @result{} @i{object} ++ ++@code{read-preserving-whitespace} @i{@r{&optional} input-stream eof-error-p ++ eof-value recursive-p}@* ++ @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ ++ The default is @b{nil}. ++ ++@i{recursive-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{object}---an @i{object} (parsed by the @i{Lisp reader}) ++ or the @i{eof-value}. ++ ++@subsubheading Description:: ++ ++@b{read} parses the printed representation of an @i{object} ++from @i{input-stream} and builds such an @i{object}. ++ ++@b{read-preserving-whitespace} is like @b{read} but preserves ++any @i{whitespace}_2 @i{character} ++that delimits the printed representation of the @i{object}. ++@b{read-preserving-whitespace} is exactly like @b{read} ++when the @i{recursive-p} @i{argument} to @b{read-preserving-whitespace} ++is @i{true}. ++ ++When @b{*read-suppress*} is @i{false}, ++@b{read} throws away the delimiting @i{character} required by ++certain printed representations if it is a ++@i{whitespace}_2 @i{character}; ++but @b{read} preserves the character ++(using @b{unread-char}) if it is ++syntactically meaningful, because it could be the start of the next expression. ++ ++If a file ends in a @i{symbol} or a @i{number} ++immediately followed by an @i{end of file}_1, ++@b{read} reads the @i{symbol} or @i{number} successfully; ++when called again, it sees the @i{end of file}_1 and ++only then acts according to @i{eof-error-p}. ++If a file contains ignorable text at the end, such ++as blank lines and comments, @b{read} ++does not consider it to end in the ++middle of an @i{object}. ++ ++If @i{recursive-p} is @i{true}, the call to @b{read} is ++expected to be made ++from within some function that itself ++has been called from @b{read} or from a similar input function, rather ++than from the top level. ++ ++Both functions return the @i{object} read from @i{input-stream}. ++@i{Eof-value} is returned if @i{eof-error-p} is @i{false} and end of file ++is reached before the beginning of an @i{object}. ++ ++@subsubheading Examples:: ++ ++@example ++ (read) ++@t{ |> } @b{|>>}@t{'a}@b{<<|} ++@result{} (QUOTE A) ++ (with-input-from-string (is " ") (read is nil 'the-end)) @result{} THE-END ++ (defun skip-then-read-char (s c n) ++ (if (char= c #\@{) (read s t nil t) (read-preserving-whitespace s)) ++ (read-char-no-hang s)) @result{} SKIP-THEN-READ-CHAR ++ (let ((*readtable* (copy-readtable nil))) ++ (set-dispatch-macro-character #\# #\@{ #'skip-then-read-char) ++ (set-dispatch-macro-character #\# #\@} #'skip-then-read-char) ++ (with-input-from-string (is "#@{123 x #@}123 y") ++ (format t "~S ~S" (read is) (read is)))) @result{} #\x, #\Space, NIL ++@end example ++ ++As an example, consider this @i{reader macro} definition: ++ ++@example ++ (defun slash-reader (stream char) ++ (declare (ignore char)) ++ `(path . ,(loop for dir = (read-preserving-whitespace stream t nil t) ++ then (progn (read-char stream t nil t) ++ (read-preserving-whitespace stream t nil t)) ++ collect dir ++ while (eql (peek-char nil stream nil nil t) #\/)))) ++ (set-macro-character #\/ #'slash-reader) ++@end example ++ ++Consider now calling @b{read} on this expression: ++ ++@example ++ (zyedh /usr/games/zork /usr/games/boggle) ++@end example ++ ++The @t{/} macro reads objects separated by more @t{/} characters; ++thus @t{/usr/games/zork} is intended to read as @t{(path usr games zork)}. ++The entire example expression should therefore be read as ++ ++@example ++ (zyedh (path usr games zork) (path usr games boggle)) ++@end example ++ ++However, if @b{read} had been used instead of ++@b{read-preserving-whitespace}, then after the reading of the symbol ++@t{zork}, the following space would be discarded; the next call ++to @b{peek-char} would see the following @t{/}, and the loop would ++continue, producing this interpretation: ++ ++@example ++ (zyedh (path usr games zork usr games boggle)) ++@end example ++ ++There are times when @i{whitespace}_2 should be discarded. ++If a command interpreter takes single-character commands, ++but occasionally reads an @i{object} then if the @i{whitespace}_2 ++after a @i{symbol} ++is not discarded it might be interpreted as a command ++some time later after the @i{symbol} had been read. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*}, ++@b{*terminal-io*}, ++@b{*readtable*}, ++@b{*read-default-float-format*}, ++@b{*read-base*}, ++@b{*read-suppress*}, ++@b{*package*}, ++@b{*read-eval*}. ++ ++@subsubheading Exceptional Situations:: ++ ++@b{read} signals an error of @i{type} @b{end-of-file}, ++regardless of @i{eof-error-p}, if ++the file ends in the middle of an @i{object} representation. ++For example, if a file does ++not contain enough right parentheses to balance the left parentheses in ++it, @b{read} signals an error. ++This is detected when @b{read} or @b{read-preserving-whitespace} ++is called with @i{recursive-p} and @i{eof-error-p} @i{non-nil}, ++and end-of-file is reached before the beginning of an @i{object}. ++ ++If @i{eof-error-p} is @i{true}, an error of @i{type} @b{end-of-file} ++is signaled at the end of file. ++ ++@subsubheading See Also:: ++ ++@ref{peek-char} ++, ++@ref{read-char} ++, ++@ref{unread-char} ++, ++@ref{read-from-string} ++, ++@ref{read-delimited-list} ++, ++@ref{parse-integer} ++, ++@ref{Syntax}, ++@ref{Reader Concepts} ++ ++@node read-delimited-list, read-from-string, read, Reader Dictionary ++@subsection read-delimited-list [Function] ++ ++@code{read-delimited-list} @i{char @r{&optional} input-stream recursive-p} @result{} @i{list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{char}---a @i{character}. ++ ++@i{input-stream}---an @i{input} @i{stream designator}. ++ The default is @i{standard input}. ++ ++@i{recursive-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{list}---a @i{list} of the @i{objects} read. ++ ++@subsubheading Description:: ++ ++@b{read-delimited-list} reads @i{objects} from @i{input-stream} ++until the next character after an @i{object}'s ++representation (ignoring @i{whitespace}_2 characters and comments) is @i{char}. ++ ++@b{read-delimited-list} looks ahead at each step ++for the next non-@i{whitespace}_2 @i{character} ++and peeks at it as if with @b{peek-char}. ++If it is @i{char}, ++then the @i{character} is consumed and the @i{list} of @i{objects} is returned. ++If it is a @i{constituent} or @i{escape} @i{character}, ++then @b{read} is used to read an @i{object}, ++which is added to the end of the @i{list}. ++If it is a @i{macro character}, ++its @i{reader macro function} is called; ++if the function returns a @i{value}, ++that @i{value} is added to the @i{list}. ++The peek-ahead process is then repeated. ++ ++If @i{recursive-p} is @i{true}, ++this call is expected to be embedded in a higher-level call to @b{read} ++or a similar function. ++ ++It is an error to reach end-of-file during the operation of ++@b{read-delimited-list}. ++ ++The consequences are undefined ++if @i{char} has a @i{syntax type} of @i{whitespace}_2 ++in the @i{current readtable}. ++ ++@subsubheading Examples:: ++@example ++ (read-delimited-list #\@r{]}) 1 2 3 4 5 6 @r{]} ++@result{} (1 2 3 4 5 6) ++@end example ++ ++Suppose you wanted @t{#@{@i{a} @i{b} @i{c} ... @i{z}@}} ++to read as a list of all pairs of the elements @i{a}, @i{b}, @i{c}, ++..., @i{z}, for example. ++ ++@example ++ #@{p q z a@} reads as ((p q) (p z) (p a) (q z) (q a) (z a)) ++@end example ++ ++This can be done by specifying a macro-character definition for @t{#@{} ++that does two things: reads in all the items up to the @t{@}}, ++and constructs the pairs. @b{read-delimited-list} performs ++the first task. ++ ++@example ++ (defun |#@{-reader| (stream char arg) ++ (declare (ignore char arg)) ++ (mapcon #'(lambda (x) ++ (mapcar #'(lambda (y) (list (car x) y)) (cdr x))) ++ (read-delimited-list #\@} stream t))) @result{} |#@{-reader| ++ ++ (set-dispatch-macro-character #\# #\@{ #'|#@{-reader|) @result{} T ++ (set-macro-character #\@} (get-macro-character #\) @b{nil})) ++@end example ++ ++Note that @i{true} is supplied for the @i{recursive-p} argument. ++ ++It is necessary here to give a definition to the character @t{@}} as ++well to prevent it from being a constituent. ++If the line ++ ++@example ++ (set-macro-character #\@} (get-macro-character #\) @b{nil})) ++@end example ++ ++shown above were not included, then the @t{@}} in ++ ++@example ++ #@{ p q z a@} ++@end example ++ ++would be considered a constituent character, part of the symbol named ++@t{a@}}. This could be corrected by putting a space before ++the @t{@}}, but it is better to call ++@b{set-macro-character}. ++ ++Giving @t{@}} the same ++definition as the standard definition of the character @t{)} has the ++twin benefit of making it terminate tokens for use with ++@b{read-delimited-list} and also making it invalid for use in any ++other context. Attempting to read a stray @t{@}} will signal an error. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-input*}, ++@b{*readtable*}, ++@b{*terminal-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{read} ++, ++@ref{peek-char} ++, ++@ref{read-char} ++, ++@ref{unread-char} ++. ++ ++@subsubheading Notes:: ++ ++@b{read-delimited-list} is intended for use in implementing @i{reader macros}. ++Usually it is desirable for @i{char} to be a @i{terminating} @i{macro character} ++so that it can be used to delimit tokens; however, @b{read-delimited-list} ++makes no attempt to alter the syntax specified for @i{char} by the current ++readtable. The caller must make any necessary changes to the readtable syntax ++explicitly. ++ ++@node read-from-string, readtable-case, read-delimited-list, Reader Dictionary ++@subsection read-from-string [Function] ++ ++@code{read-from-string} @i{string @r{&optional} eof-error-p eof-value ++ @r{&key} start end preserve-whitespace}@* ++ @result{} @i{object, position} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string}. ++ ++@i{eof-error-p}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{eof-value}---an @i{object}. ++ ++ The default is @b{nil}. ++ ++@i{start}, @i{end}---@i{bounding index designators} of @i{string}. ++ The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively. ++ ++@i{preserve-whitespace}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{object}---an @i{object} (parsed by the @i{Lisp reader}) ++ or the @i{eof-value}. ++ ++@i{position}---an @i{integer} greater than or equal to zero, ++ and less than or equal to ++ one more than the @i{length} of the @i{string}. ++ ++@subsubheading Description:: ++ ++Parses the printed representation of an @i{object} ++from the subsequence of @i{string} @i{bounded} by @i{start} and @i{end}, ++as if @b{read} had been called on an @i{input} @i{stream} ++containing those same @i{characters}. ++ ++If @i{preserve-whitespace} is @i{true}, ++the operation will preserve @i{whitespace}_2 ++as @b{read-preserving-whitespace} would do. ++ ++If an @i{object} is successfully parsed, the @i{primary value}, @i{object}, ++is the @i{object} that was parsed. ++If @i{eof-error-p} is @i{false} and if the end of the @i{substring} is reached, ++@i{eof-value} is returned. ++ ++The @i{secondary value}, @i{position}, is the index of the first @i{character} ++in the @i{bounded} @i{string} that was not read. ++The @i{position} may depend upon the value of @i{preserve-whitespace}. ++If the entire @i{string} was read, ++the @i{position} returned is either the @i{length} of the @i{string} ++or one greater than the @i{length} of the @i{string}. ++ ++@subsubheading Examples:: ++ ++@example ++ (read-from-string " 1 3 5" t nil :start 2) @result{} 3, 5 ++ (read-from-string "(a b c)") @result{} (A B C), 7 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If the end of the supplied substring ++occurs before an @i{object} can be read, an ++error is signaled if @i{eof-error-p} is @i{true}. ++An error is signaled if the end of the @i{substring} occurs ++in the middle of an incomplete @i{object}. ++ ++@subsubheading See Also:: ++ ++@ref{read} ++, ++@b{read-preserving-whitespace} ++ ++@subsubheading Notes:: ++ ++The reason that @i{position} is allowed to be beyond the ++@i{length} of the @i{string} is to permit (but not require) ++the @i{implementation} to work by simulating the effect of a ++trailing delimiter at the end of the @i{bounded} @i{string}. ++When @i{preserve-whitespace} is @i{true}, ++the @i{position} might count the simulated delimiter. ++ ++@node readtable-case, readtablep, read-from-string, Reader Dictionary ++@subsection readtable-case [Accessor] ++ ++@code{readtable-case} @i{readtable} @result{} @i{mode} ++ ++(setf (@code{ readtable-case} @i{readtable}) mode)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{readtable}---a @i{readtable}. ++ ++@i{mode}---a @i{case sensitivity mode}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{readtable case} of @i{readtable}, ++which affects the way in which the @i{Lisp Reader} reads @i{symbols} ++ and the way in which the @i{Lisp Printer} writes @i{symbols}. ++ ++@subsubheading Examples:: ++ ++See @ref{Examples of Effect of Readtable Case on the Lisp Reader} and @ref{Examples of Effect of Readtable Case on the Lisp Printer}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{readtable} is not a @i{readtable}. ++Should signal an error of @i{type} @b{type-error} ++ if @i{mode} is not a @i{case sensitivity mode}. ++ ++@subsubheading See Also:: ++ ++@ref{readtable} ++, ++@b{*print-escape*}, ++@ref{Reader Algorithm}, ++@ref{Effect of Readtable Case on the Lisp Reader}, ++@ref{Effect of Readtable Case on the Lisp Printer} ++ ++@subsubheading Notes:: ++ ++@b{copy-readtable} copies the @i{readtable case} of the @i{readtable}. ++ ++@node readtablep, set-dispatch-macro-character, readtable-case, Reader Dictionary ++@subsection readtablep [Function] ++ ++@code{readtablep} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{readtable}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (readtablep *readtable*) @result{} @i{true} ++ (readtablep (copy-readtable)) @result{} @i{true} ++ (readtablep '*readtable*) @result{} @i{false} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (readtablep @i{object}) @equiv{} (typep @i{object} 'readtable) ++@end example ++ ++@node set-dispatch-macro-character, set-macro-character, readtablep, Reader Dictionary ++@subsection set-dispatch-macro-character, get-dispatch-macro-character ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{get-dispatch-macro-character} @i{disp-char sub-char @r{&optional} readtable} @result{} @i{function} ++ ++@code{set-dispatch-macro-character} @i{disp-char sub-char new-function @r{&optional} readtable} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{disp-char}---a @i{character}. ++ ++@i{sub-char}---a @i{character}. ++ ++@i{readtable}---a @i{readtable designator}. ++ ++ The default is the @i{current readtable}. ++ ++@i{function}---a @i{function designator} or @b{nil}. ++ ++@i{new-function}---a @i{function designator}. ++ ++@subsubheading Description:: ++ ++@b{set-dispatch-macro-character} causes @i{new-function} to be called ++when @i{disp-char} followed by @i{sub-char} is read. ++If @i{sub-char} is a lowercase letter, ++it is converted to its uppercase equivalent. ++It is an error if @i{sub-char} is one of the ten decimal digits. ++ ++@b{set-dispatch-macro-character} installs a @i{new-function} to be called ++when a particular @i{dispatching macro character} pair is read. ++@i{New-function} is installed as the dispatch function to be ++called when @i{readtable} is in use and when @i{disp-char} is followed by ++@i{sub-char}. ++ ++For more information about how the @i{new-function} is invoked, ++see @ref{Macro Characters}. ++ ++@b{get-dispatch-macro-character} retrieves ++the dispatch function associated with @i{disp-char} and @i{sub-char} ++in @i{readtable}. ++ ++@b{get-dispatch-macro-character} returns the macro-character function ++for @i{sub-char} under @i{disp-char}, or @b{nil} if there is no ++function associated with @i{sub-char}. ++If @i{sub-char} is a decimal digit, @b{get-dispatch-macro-character} ++returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (get-dispatch-macro-character #\# #\@{) @result{} NIL ++ (set-dispatch-macro-character #\# #\@{ ;dispatch on #@{ ++ #'(lambda(s c n) ++ (let ((list (read s nil (values) t))) ;list is object after #n@{ ++ (when (consp list) ;return nth element of list ++ (unless (and n (< 0 n (length list))) (setq n 0)) ++ (setq list (nth n list))) ++ list))) @result{} T ++ #@{(1 2 3 4) @result{} 1 ++ #3@{(0 1 2 3) @result{} 3 ++ #@{123 @result{} 123 ++@end example ++ ++If it is desired that @t{#$@i{foo}} : ++as if it were @t{(dollars @i{foo})}. ++ ++@example ++(defun |#$-reader| (stream subchar arg) ++ (declare (ignore subchar arg)) ++ (list 'dollars (read stream t nil t))) @result{} |#$-reader| ++ (set-dispatch-macro-character #\# #\$ #'|#$-reader|) @result{} T ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Macro Characters} ++ ++@subsubheading Side Effects:: ++ ++The @i{readtable} is modified. ++ ++@subsubheading Affected By:: ++ ++@b{*readtable*}. ++ ++@subsubheading Exceptional Situations:: ++ ++For either function, an error is signaled if @i{disp-char} is not ++a @i{dispatching macro character} in @i{readtable}. ++ ++@subsubheading See Also:: ++ ++@ref{readtable} ++ ++@subsubheading Notes:: ++It is necessary ++to use @b{make-dispatch-macro-character} to set up the ++dispatch character before specifying its sub-characters. ++ ++@node set-macro-character, set-syntax-from-char, set-dispatch-macro-character, Reader Dictionary ++@subsection set-macro-character, get-macro-character [Function] ++ ++@code{get-macro-character} @i{char @r{&optional} readtable} @result{} @i{function, non-terminating-p} ++ ++@code{set-macro-character} @i{char new-function @r{&optional} non-terminating-p readtable} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{char}---a @i{character}. ++ ++@i{non-terminating-p}---a @i{generalized boolean}. ++ The default is @i{false}. ++ ++@i{readtable}---a @i{readtable designator}. ++ ++ The default is the @i{current readtable}. ++ ++@i{function}---@b{nil}, ++ or a @i{designator} for a @i{function} of two @i{arguments}. ++ ++@i{new-function}---a @i{function designator}. ++ ++@subsubheading Description:: ++ ++@b{get-macro-character} returns as its @i{primary value}, @i{function}, ++the @i{reader macro function} associated with @i{char} in @i{readtable} (if any), ++or else @b{nil} if @i{char} is not a @i{macro character} in @i{readtable}. ++The @i{secondary value}, @i{non-terminating-p}, is @i{true} ++if @i{char} is a @i{non-terminating} @i{macro character}; ++otherwise, it is @i{false}. ++ ++@b{set-macro-character} causes @i{char} to be a @i{macro character} ++associated with the @i{reader macro function} @i{new-function} ++(or the @i{designator} for @i{new-function}) in @i{readtable}. ++If @i{non-terminating-p} is @i{true}, ++@i{char} becomes a @i{non-terminating} @i{macro character}; ++otherwise it becomes a @i{terminating} @i{macro character}. ++ ++@subsubheading Examples:: ++ ++@example ++ (get-macro-character #\@{) @result{} NIL, @i{false} ++ (not (get-macro-character #\;)) @result{} @i{false} ++@end example ++ ++The following is a possible definition for the @i{single-quote} @i{reader macro} ++in @i{standard syntax}: ++ ++@example ++ (defun single-quote-reader (stream char) ++ (declare (ignore char)) ++ (list 'quote (read stream t nil t))) @result{} SINGLE-QUOTE-READER ++ (set-macro-character #\' #'single-quote-reader) @result{} T ++@end example ++ ++Here @t{single-quote-reader} reads an @i{object} following the @i{single-quote} ++and returns a @i{list} of @b{quote} and that @i{object}. ++The @i{char} argument is ignored. ++ ++The following is a possible definition for the @i{semicolon} @i{reader macro} ++in @i{standard syntax}: ++ ++@example ++ (defun semicolon-reader (stream char) ++ (declare (ignore char)) ++ ;; First swallow the rest of the current input line. ++ ;; End-of-file is acceptable for terminating the comment. ++ (do () ((char= (read-char stream nil #\Newline t) #\Newline))) ++ ;; Return zero values. ++ (values)) @result{} SEMICOLON-READER ++ (set-macro-character #\; #'semicolon-reader) @result{} T ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{readtable} is modified. ++ ++@subsubheading See Also:: ++ ++@ref{readtable} ++ ++@node set-syntax-from-char, with-standard-io-syntax, set-macro-character, Reader Dictionary ++@subsection set-syntax-from-char [Function] ++ ++@code{set-syntax-from-char} @i{to-char from-char @r{&optional} to-readtable from-readtable} @result{} @i{@b{t}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{to-char}---a @i{character}. ++ ++@i{from-char}---a @i{character}. ++ ++@i{to-readtable}---a @i{readtable}. ++ The default is the @i{current readtable}. ++ ++@i{from-readtable}---a @i{readtable designator}. ++ The default is the @i{standard readtable}. ++ ++@subsubheading Description:: ++ ++@b{set-syntax-from-char} makes ++the syntax of @i{to-char} in @i{to-readtable} be the same as ++the syntax of @i{from-char} in @i{from-readtable}. ++ ++@b{set-syntax-from-char} copies the @i{syntax types} of @i{from-char}. ++If @i{from-char} is a @i{macro character}, ++its @i{reader macro function} is copied also. ++If the character is a @i{dispatching macro character}, ++its entire dispatch table of @i{reader macro functions} is copied. ++The @i{constituent traits} of @i{from-char} are not copied. ++ ++A macro definition from a character such as ++@t{"} can be copied to another character; the standard definition for @t{"} ++looks for another character that is the same as the character that ++invoked it. The definition of @t{(} can not be meaningfully copied ++to @t{@{}, on the other hand. ++The result is that @i{lists} are of the form ++@t{@{a b c)}, not @t{@{a b c@}}, ++because the definition ++always looks for a closing parenthesis, not a closing brace. ++ ++@subsubheading Examples:: ++@example ++ (set-syntax-from-char #\7 #\;) @result{} T ++ 123579 @result{} 1235 ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{to-readtable} is modified. ++ ++@subsubheading Affected By:: ++ ++The existing values in the @i{from-readtable}. ++ ++@subsubheading See Also:: ++ ++@ref{set-macro-character} ++, ++@ref{make-dispatch-macro-character} ++, ++@ref{Character Syntax Types} ++ ++@subsubheading Notes:: ++ ++The @i{constituent traits} of a @i{character} are ``hard wired'' ++into the parser for extended @i{tokens}. For example, if the definition ++of @t{S} is copied to @t{*}, then @t{*} will become a @i{constituent} ++that is @i{alphabetic}_2 but that cannot be used as a ++@i{short float} @i{exponent marker}. ++For further information, see @ref{Constituent Traits}. ++ ++@node with-standard-io-syntax, *read-base*, set-syntax-from-char, Reader Dictionary ++@subsection with-standard-io-syntax [Macro] ++ ++@code{with-standard-io-syntax} @i{@{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++Within the dynamic extent of the body of @i{forms}, all reader/printer control ++variables, including any @i{implementation-defined} ones not specified by ++this standard, are bound to values that produce standard read/print ++behavior. The values for the variables specified by this standard are listed in ++Figure 23--1. ++ ++[Reviewer Note by Barrett: *print-pprint-dispatch* should probably be mentioned here, too.] ++ ++@format ++@group ++@noindent ++@w{ Variable Value } ++@w{ @b{*package*} The @t{CL-USER} @i{package} } ++@w{ @b{*print-array*} @b{t} } ++@w{ @b{*print-base*} @t{10} } ++@w{ @b{*print-case*} @t{:upcase} } ++@w{ @b{*print-circle*} @b{nil} } ++@w{ @b{*print-escape*} @b{t} } ++@w{ @b{*print-gensym*} @b{t} } ++@w{ @b{*print-length*} @b{nil} } ++@w{ @b{*print-level*} @b{nil} } ++@w{ @b{*print-lines*} @b{nil} } ++@w{ @b{*print-miser-width*} @b{nil} } ++@w{ @b{*print-pprint-dispatch*} The @i{standard pprint dispatch table} } ++@w{ @b{*print-pretty*} @b{nil} } ++@w{ @b{*print-radix*} @b{nil} } ++@w{ @b{*print-readably*} @b{t} } ++@w{ @b{*print-right-margin*} @b{nil} } ++@w{ @b{*read-base*} @t{10} } ++@w{ @b{*read-default-float-format*} @b{single-float} } ++@w{ @b{*read-eval*} @b{t} } ++@w{ @b{*read-suppress*} @b{nil} } ++@w{ @b{*readtable*} The @i{standard readtable} } ++ ++@noindent ++@w{ Figure 23--1: Values of standard control variables } ++ ++@end group ++@end format ++ ++@subsubheading Examples:: ++ ++@example ++ (with-open-file (file pathname :direction :output) ++ (with-standard-io-syntax ++ (print data file))) ++ ++;;; ... Later, in another Lisp: ++ ++ (with-open-file (file pathname :direction :input) ++ (with-standard-io-syntax ++ (setq data (read file)))) ++@end example ++ ++@node *read-base*, *read-default-float-format*, with-standard-io-syntax, Reader Dictionary ++@subsection *read-base* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{radix}. ++ ++@subsubheading Initial Value:: ++ ++@t{10}. ++ ++@subsubheading Description:: ++ ++Controls the interpretation of tokens by @b{read} as being ++@i{integers} or @i{ratios}. ++ ++The @i{value} of @b{*read-base*}, called the @i{current input base} ++@IGindex current input base ++, ++is the radix in which @i{integers} and ++@i{ratios} are to be read by the @i{Lisp reader}. ++The parsing of other numeric @i{types} (@i{e.g.}, @i{floats}) is ++not affected by this option. ++ ++The effect of @b{*read-base*} on the reading of any particular ++@i{rational} number can be locally overridden by explicit use of the ++@t{#O}, @t{#X}, @t{#B}, or @t{#@i{n}R} syntax ++or by a trailing decimal point. ++ ++@subsubheading Examples:: ++ ++@example ++ (dotimes (i 6) ++ (let ((*read-base* (+ 10. i))) ++ (let ((object (read-from-string "(\\DAD DAD |BEE| BEE 123. 123)"))) ++ (print (list *read-base* object))))) ++@t{ |> } (10 (DAD DAD BEE BEE 123 123)) ++@t{ |> } (11 (DAD DAD BEE BEE 123 146)) ++@t{ |> } (12 (DAD DAD BEE BEE 123 171)) ++@t{ |> } (13 (DAD DAD BEE BEE 123 198)) ++@t{ |> } (14 (DAD 2701 BEE BEE 123 227)) ++@t{ |> } (15 (DAD 3088 BEE 2699 123 258)) ++@result{} NIL ++@end example ++ ++@subsubheading Notes:: ++ ++Altering the input radix can be useful when reading data files in special formats. ++ ++@node *read-default-float-format*, *read-eval*, *read-base*, Reader Dictionary ++@subsection *read-default-float-format* [Variable] ++ ++@subsubheading Value Type:: ++ ++one of the @i{atomic type specifiers} ++ @b{short-float}, ++ @b{single-float}, ++ @b{double-float}, ++ or @b{long-float}, ++ or else some other @i{type specifier} defined ++ by the @i{implementation} to be acceptable. ++ ++@subsubheading Initial Value:: ++ ++The @i{symbol} @b{single-float}. ++ ++@subsubheading Description:: ++ ++Controls the floating-point format that is to be used when reading a ++floating-point number that has no @i{exponent marker} or that has ++@t{e} or @t{E} for an @i{exponent marker}. Other @i{exponent markers} ++explicitly prescribe the floating-point format to be used. ++ ++The printer uses @b{*read-default-float-format*} to guide the ++choice of @i{exponent markers} when printing floating-point numbers. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((*read-default-float-format* 'double-float)) ++ (read-from-string "(1.0 1.0e0 1.0s0 1.0f0 1.0d0 1.0L0)")) ++@result{} (1.0 1.0 1.0 1.0 1.0 1.0) ;Implementation has float format F. ++@result{} (1.0 1.0 1.0s0 1.0 1.0 1.0) ;Implementation has float formats S and F. ++@result{} (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0d0) ;Implementation has float formats F and D. ++@result{} (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0d0) ;Implementation has float formats S, F, D. ++@result{} (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0L0) ;Implementation has float formats F, D, L. ++@result{} (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0L0) ;Implementation has formats S, F, D, L. ++@end example ++ ++@node *read-eval*, *read-suppress*, *read-default-float-format*, Reader Dictionary ++@subsection *read-eval* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{true}. ++ ++@subsubheading Description:: ++ ++If it is @i{true}, the @t{#.} @i{reader macro} has its normal effect. ++Otherwise, that @i{reader macro} signals an error of @i{type} @b{reader-error}. ++ ++@subsubheading See Also:: ++ ++@b{*print-readably*} ++ ++@subsubheading Notes:: ++ ++If @b{*read-eval*} is @i{false} and @b{*print-readably*} is @i{true}, ++any @i{method} for @b{print-object} that would output a reference ++to the @t{#.} @i{reader macro} either outputs something different ++or signals an error of @i{type} @b{print-not-readable}. ++ ++@node *read-suppress*, *readtable*, *read-eval*, Reader Dictionary ++@subsection *read-suppress* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{false}. ++ ++@subsubheading Description:: ++ ++This variable is intended primarily to support the operation of the ++read-time conditional notations @t{#+} and @t{#-}. It is important for the ++@i{reader macros} which implement these notations ++to be able to skip over the printed representation of an ++@i{expression} despite the possibility that the syntax of the skipped ++@i{expression} may not be entirely valid for the current implementation, ++since @t{#+} and @t{#-} exist in order to allow the same program to be ++shared among several @r{Lisp} implementations (including dialects other than @r{Common Lisp}) ++despite small incompatibilities of syntax. ++ ++If it is @i{false}, the @i{Lisp reader} operates normally. ++ ++If the @i{value} of @b{*read-suppress*} is @i{true}, ++ @b{read}, ++ @b{read-preserving-whitespace}, ++ @b{read-delimited-list}, ++ and @b{read-from-string} ++all return a @i{primary value} of @b{nil} when they complete successfully; ++however, they continue to parse the representation of an @i{object} ++in the normal way, in order to skip over the @i{object}, ++and continue to indicate @i{end of file} in the normal way. ++Except as noted below, ++any @i{standardized} @i{reader macro}_2 ++that is defined to @i{read}_2 ++a following @i{object} or @i{token} ++will do so, ++but not signal an error if the @i{object} ++read is not of an appropriate type or syntax. ++The @i{standard syntax} and its associated @i{reader macros} ++will not construct any new @i{objects} ++ (@i{e.g.}, when reading the representation of a @i{symbol}, ++ no @i{symbol} will be constructed or interned). ++ ++@table @asis ++ ++@item Extended tokens ++All extended tokens are completely uninterpreted. ++Errors such as those that might otherwise be signaled due to ++ detection of invalid @i{potential numbers}, ++ invalid patterns of @i{package markers}, ++ and invalid uses of the @i{dot} character are suppressed. ++ ++@item Dispatching macro characters (including @i{sharpsign}) ++@i{Dispatching macro characters} continue to parse an infix numerical ++argument, and invoke the dispatch function. The @i{standardized} ++@i{sharpsign} @i{reader macros} do not enforce any constraints ++on either the presence of or the value of the numerical argument. ++ ++@item #= ++The @t{#=} notation is totally ignored. It does not read ++a following @i{object}. It produces no @i{object}, ++but is treated as @i{whitespace}_2. ++ ++@item ## ++The @t{##} notation always produces @b{nil}. ++@end table ++ ++No matter what the @i{value} of @b{*read-suppress*}, ++parentheses still continue to delimit and construct @i{lists}; ++the @t{#(} notation continues to delimit @i{vectors}; ++and comments, @i{strings}, ++and the @i{single-quote} and @i{backquote} notations continue to be ++interpreted properly. Such situations as ++@t{')}, @t{#<}, ++@t{#)}, and @t{#<@i{Space}>} continue to signal errors. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((*read-suppress* t)) ++ (mapcar #'read-from-string ++ '("#(foo bar baz)" "#P(:type :lisp)" "#c1.2" ++ "#.(PRINT 'FOO)" "#3AHELLO" "#S(INTEGER)" ++ "#*ABC" "#\GARBAGE" "#RALPHA" "#3R444"))) ++@result{} (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{read} ++, ++@ref{Syntax} ++ ++@subsubheading Notes:: ++ ++@i{Programmers} and @i{implementations} that define additional ++@i{macro characters} are strongly encouraged to make them respect ++@b{*read-suppress*} just as @i{standardized} @i{macro characters} do. ++That is, when the @i{value} of @b{*read-suppress*} is @i{true}, ++they should ignore type errors when reading a following @i{object} ++and the @i{functions} that implement @i{dispatching macro characters} ++should tolerate @b{nil} as their infix @i{parameter} value even if a numeric ++value would ordinarily be required. ++ ++@node *readtable*, reader-error, *read-suppress*, Reader Dictionary ++@subsection *readtable* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{readtable}. ++ ++@subsubheading Initial Value:: ++ ++A @i{readtable} that conforms to the description of @r{Common Lisp} syntax in @ref{Syntax}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*readtable*} is called the @i{current readtable}. ++It controls the parsing behavior of the @i{Lisp reader}, ++and can also influence the @i{Lisp printer} (@i{e.g.}, see the @i{function} @b{readtable-case}). ++ ++@subsubheading Examples:: ++ ++@example ++ (readtablep *readtable*) @result{} @i{true} ++ (setq zvar 123) @result{} 123 ++ (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) @result{} T ++ zvar @result{} 123 ++ (setq *readtable* table2) @result{} # ++ zvar @result{} VAR ++ (setq *readtable* (copy-readtable nil)) @result{} # ++ zvar @result{} 123 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{compile-file}, ++@b{load} ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++, ++@ref{load} ++, ++@ref{readtable} ++, ++@ref{The Current Readtable} ++ ++@node reader-error, , *readtable*, Reader Dictionary ++@subsection reader-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{reader-error}, ++@b{parse-error}, ++@b{stream-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{reader-error} consists of ++error conditions that are related to tokenization and parsing ++done by the @i{Lisp reader}. ++ ++@subsubheading See Also:: ++ ++@ref{read} ++, ++@ref{stream-error-stream} ++, ++@ref{Reader Concepts} ++ ++@c end of including dict-reader ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-24.texi +@@ -0,0 +1,1018 @@ ++ ++ ++@node System Construction, Environment, Reader, Top ++@chapter System Construction ++ ++@menu ++* System Construction Concepts:: ++* System Construction Dictionary:: ++@end menu ++ ++@node System Construction Concepts, System Construction Dictionary, System Construction, System Construction ++@section System Construction Concepts ++ ++@c including concept-systems ++ ++@menu ++* Loading:: ++* Features:: ++@end menu ++ ++@node Loading, Features, System Construction Concepts, System Construction Concepts ++@subsection Loading ++ ++To @b{load} a @i{file} is to treat its contents as @i{code} ++and @i{execute} that @i{code}. ++The @i{file} may contain @i{source code} ++@IGindex source code ++ or @i{compiled code} ++@IGindex compiled code ++. ++ ++A @i{file} containing @i{source code} is called a @i{source file} ++@IGindex source file ++. ++@i{Loading} a @i{source file} is accomplished essentially ++by sequentially @i{reading}_2 the @i{forms} in the file, ++@i{evaluating} each immediately after it is @i{read}. ++ ++A @i{file} containing @i{compiled code} is called a @i{compiled file} ++@IGindex compiled file ++. ++@i{Loading} a @i{compiled file} is similar to @i{loading} a @i{source file}, ++except that the @i{file} does not contain text but rather an ++@i{implementation-dependent} representation of pre-digested @i{expressions} ++created by the @i{compiler}. Often, a @i{compiled file} can be @i{loaded} ++more quickly than a @i{source file}. ++See @ref{Compilation}. ++ ++The way in which a @i{source file} is distinguished from a @i{compiled file} ++is @i{implementation-dependent}. ++ ++@node Features, , Loading, System Construction Concepts ++@subsection Features ++ ++A @i{feature} ++@IGindex feature ++ is an aspect or attribute ++ of @r{Common Lisp}, ++ of the @i{implementation}, ++ or of the @i{environment}. ++A @i{feature} is identified by a @i{symbol}. ++ ++A @i{feature} is said to be @i{present} ++@IGindex present ++ in a @i{Lisp image} ++if and only if the @i{symbol} naming it is an @i{element} of the ++@i{list} held by the @i{variable} @b{*features*}, ++which is called the @i{features list} ++@IGindex features list ++. ++ ++@menu ++* Feature Expressions:: ++* Examples of Feature Expressions:: ++@end menu ++ ++@node Feature Expressions, Examples of Feature Expressions, Features, Features ++@subsubsection Feature Expressions ++ ++Boolean combinations of @i{features}, called @i{feature expressions} ++@IGindex feature expression ++, ++are used by the @t{#+} and @t{#-} @i{reader macros} in order to ++direct conditional @i{reading} of @i{expressions} by the @i{Lisp reader}. ++ ++The rules for interpreting a @i{feature expression} are as follows: ++ ++@table @asis ++ ++@item @i{feature} ++If a @i{symbol} naming a @i{feature} is used as a @i{feature expression}, ++the @i{feature expression} succeeds if that @i{feature} is @i{present}; ++otherwise it fails. ++ ++@item @t{(not @i{feature-conditional})} ++A @b{not} @i{feature expression} succeeds ++if its argument @i{feature-conditional} fails; ++otherwise, it succeeds. ++ ++@item @t{(and @{@i{feature-conditional}@}*)} ++An @b{and} @i{feature expression} succeeds ++if all of its argument @i{feature-conditionals} succeed; ++otherwise, it fails. ++ ++@item @t{(or @{@i{feature-conditional}@}*)} ++An @b{or} @i{feature expression} succeeds ++if any of its argument @i{feature-conditionals} succeed; ++otherwise, it fails. ++ ++@end table ++ ++@node Examples of Feature Expressions, , Feature Expressions, Features ++@subsubsection Examples of Feature Expressions ++ ++For example, suppose that ++ in @i{implementation} A, the @i{features} @t{spice} and @t{perq} are @i{present}, ++ but the @i{feature} @t{lispm} is not @i{present}; ++ in @i{implementation} B, the feature @t{lispm} is @i{present}, ++ but the @i{features} @t{spice} and @t{perq} are ++ not @i{present}; ++ and ++ in @i{implementation} C, none of the features @t{spice}, @i{lispm}, or @t{perq} are ++ @i{present}. ++Figure 24--1 shows some sample @i{expressions}, and how they would be ++@i{read}_2 in these @i{implementations}. ++ ++@format ++@group ++@noindent ++@w{ @t{(cons #+spice "Spice" #-spice "Lispm" x)} } ++@w{ in @i{implementation} A ... @t{(CONS "Spice" X)} } ++@w{ in @i{implementation} B ... @t{(CONS "Lispm" X)} } ++@w{ in @i{implementation} C ... @t{(CONS "Lispm" X)} } ++@w{ @t{(cons #+spice "Spice" #+LispM "Lispm" x)} } ++@w{ in @i{implementation} A ... @t{(CONS "Spice" X)} } ++@w{ in @i{implementation} B ... @t{(CONS "Lispm" X)} } ++@w{ in @i{implementation} C ... @t{(CONS X)} } ++@w{ @t{(setq a '(1 2 #+perq 43 #+(not perq) 27))} } ++@w{ in @i{implementation} A ... @t{(SETQ A '(1 2 43))} } ++@w{ in @i{implementation} B ... @t{(SETQ A '(1 2 27))} } ++@w{ in @i{implementation} C ... @t{(SETQ A '(1 2 27))} } ++@w{ @t{(let ((a 3) #+(or spice lispm) (b 3)) (foo a))} } ++@w{ in @i{implementation} A ... @t{(LET ((A 3) (B 3)) (FOO A))} } ++@w{ in @i{implementation} B ... @t{(LET ((A 3) (B 3)) (FOO A))} } ++@w{ in @i{implementation} C ... @t{(LET ((A 3)) (FOO A))} } ++@w{ @t{(cons #+Lispm "#+Spice" #+Spice "foo" #-(or Lispm Spice) 7 x)} } ++@w{ in @i{implementation} A ... @t{(CONS "foo" X)} } ++@w{ in @i{implementation} B ... @t{(CONS "#+Spice" X)} } ++@w{ in @i{implementation} C ... @t{(CONS 7 X)} } ++ ++@noindent ++@w{ Figure 24--1: Features examples } ++ ++@end group ++@end format ++ ++@c end of including concept-systems ++ ++@node System Construction Dictionary, , System Construction Concepts, System Construction ++@section System Construction Dictionary ++ ++@c including dict-system-construction ++ ++@menu ++* compile-file:: ++* compile-file-pathname:: ++* load:: ++* with-compilation-unit:: ++* *features*:: ++* *compile-file-pathname*:: ++* *load-pathname*:: ++* *compile-print*:: ++* *load-print*:: ++* *modules*:: ++* provide:: ++@end menu ++ ++@node compile-file, compile-file-pathname, System Construction Dictionary, System Construction Dictionary ++@subsection compile-file [Function] ++ ++@code{compile-file} @i{input-file @r{&key} output-file verbose ++ print external-format}@* ++ @result{} @i{output-truename, warnings-p, failure-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-file}---a @i{pathname designator}. ++ (Default fillers for unspecified components are taken from ++ @b{*default-pathname-defaults*}.) ++ ++@i{output-file}---a @i{pathname designator}. ++ The default is @i{implementation-defined}. ++ ++@i{verbose}---a @i{generalized boolean}. ++ The default is the @i{value} of @b{*compile-verbose*}. ++ ++@i{print}---a @i{generalized boolean}. ++ The default is the @i{value} of @b{*compile-print*}. ++ ++@i{external-format}---an @i{external file format designator}. ++ The default is @t{:default}. ++ ++@i{output-truename}---a @i{pathname} (the @b{truename} of the output @i{file}), ++ or @b{nil}. ++ ++@i{warnings-p}---a @i{generalized boolean}. ++ ++@i{failure-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{compile-file} transforms the contents of the file specified ++by @i{input-file} into @i{implementation-dependent} binary data ++which are placed in the file specified by @i{output-file}. ++ ++The @i{file} to which @i{input-file} refers should be a @i{source file}. ++@i{output-file} can be used to specify an output @i{pathname}; ++ ++the actual @i{pathname} of the @i{compiled file} ++to which @i{compiled code} will be output ++is computed as if by calling @b{compile-file-pathname}. ++ ++If @i{input-file} or @i{output-file} is a @i{logical pathname}, ++it is translated into a @i{physical pathname} as if by calling ++@b{translate-logical-pathname}. ++ ++If @i{verbose} is @i{true}, ++@b{compile-file} prints a message in the form of a comment ++(@i{i.e.}, with a leading @i{semicolon}) ++to @i{standard output} indicating what @i{file} is being @i{compiled} ++and other useful information. ++If @i{verbose} is @i{false}, ++@b{compile-file} does not print ++this information. ++ ++If @i{print} is @i{true}, ++information about @i{top level forms} in the file being ++compiled is printed to @i{standard output}. ++Exactly what is printed is @i{implementation-dependent}, ++but nevertheless some information is printed. ++If @i{print} is @b{nil}, no information is printed. ++ ++The @i{external-format} specifies the @i{external file format} ++to be used when opening the @i{file}; see the @i{function} @b{open}. ++@b{compile-file} and @b{load} must cooperate in such a way that ++the resulting @i{compiled file} can be @i{loaded} ++without specifying an @i{external file format} anew; see the @i{function} @b{load}. ++ ++@b{compile-file} binds @b{*readtable*} and @b{*package*} ++to the values they held before processing the file. ++ ++@b{*compile-file-truename*} is bound by @b{compile-file} ++to hold the @i{truename} of the @i{pathname} of the file being compiled. ++ ++@b{*compile-file-pathname*} is bound by @b{compile-file} ++to hold a @i{pathname} denoted by the first argument to @b{compile-file}, ++merged against the defaults; ++that is, @t{(pathname (merge-pathnames @i{input-file}))}. ++ ++The compiled @i{functions} contained in the @i{compiled file} become available ++for use when the @i{compiled file} is @i{loaded} into Lisp. ++ ++Any function definition that is processed by the ++compiler, including @t{#'(lambda ...)} forms and local function ++definitions made by @b{flet}, @b{labels} and @b{defun} forms, ++result in an @i{object} of @i{type} @b{compiled-function}. ++ ++The @i{primary value} returned by @b{compile-file}, @i{output-truename}, ++is the @b{truename} of the output file, or @b{nil} if the file could not be created. ++ ++The @i{secondary value}, @i{warnings-p}, is @i{false} ++if no @i{conditions} of @i{type} @b{error} or @b{warning} ++were detected by the compiler, and @i{true} otherwise. ++ ++The @i{tertiary value}, @i{failure-p}, is @i{false} ++if no @i{conditions} of @i{type} @b{error} or @b{warning} ++(other than @b{style-warning}) ++were detected by the compiler, and @i{true} otherwise. ++ ++For general information about how @i{files} are processed by the @i{file compiler}, ++see @ref{File Compilation}. ++ ++@i{Programs} to be compiled by the @i{file compiler} must only contain ++@i{externalizable objects}; for details on such @i{objects}, ++see @ref{Literal Objects in Compiled Files}. ++For information on how to extend the set of @i{externalizable objects}, ++see the @i{function} @b{make-load-form} and @ref{Additional Constraints on Externalizable Objects}. ++ ++@subsubheading Affected By:: ++ ++@b{*error-output*}, ++ ++@b{*standard-output*}, @b{*compile-verbose*}, @b{*compile-print*} ++ ++The computer's file system. ++@subsubheading Exceptional Situations:: ++ ++For information about errors detected during the compilation process, ++see @ref{Exceptional Situations in the Compiler}. ++ ++An error of @i{type} @b{file-error} might be signaled if ++@t{(wild-pathname-p @i{input-file})\/} returns true. ++ ++If either the attempt to open the @i{source file} for input ++ or the attempt to open the @i{compiled file} for output ++fails, ++an error of @i{type} @b{file-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{compile} ++, ++@b{declare}, ++@ref{eval-when} ++, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node compile-file-pathname, load, compile-file, System Construction Dictionary ++@subsection compile-file-pathname [Function] ++ ++@code{compile-file-pathname} @i{input-file @r{&key} output-file @r{&allow-other-keys}} @result{} @i{pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{input-file}---a @i{pathname designator}. ++ (Default fillers for unspecified components are taken from ++ @b{*default-pathname-defaults*}.) ++ ++@i{output-file}---a @i{pathname designator}. ++ The default is @i{implementation-defined}. ++ ++@i{pathname}---a @i{pathname}. ++ ++@subsubheading Description:: ++ ++Returns the @i{pathname} that @b{compile-file} would write into, ++if given the same arguments. ++ ++The defaults for the @i{output-file} ++are taken from the @i{pathname} ++that results from merging the @i{input-file} ++with the @i{value} of @b{*default-pathname-defaults*}, ++except that the type component ++should default to the appropriate ++@i{implementation-defined} default type for @i{compiled files}. ++ ++If @i{input-file} is a @i{logical pathname} and @i{output-file} ++is unsupplied, the result is a @i{logical pathname}. ++ ++If @i{input-file} is a @i{logical pathname}, ++it is translated into a physical pathname as if by calling ++@b{translate-logical-pathname}. ++ ++If @i{input-file} is a @i{stream}, ++the @i{stream} can be either open or closed. ++@b{compile-file-pathname} returns the same @i{pathname} after a ++file is closed as it did when the file was open. ++ ++It is an error if @i{input-file} is a @i{stream} that is ++created with @b{make-two-way-stream}, @b{make-echo-stream}, ++@b{make-broadcast-stream}, @b{make-concatenated-stream}, ++@b{make-string-input-stream}, @b{make-string-output-stream}. ++ ++If an implementation supports additional keyword arguments to @b{compile-file}, ++@b{compile-file-pathname} must accept the same arguments. ++ ++@subsubheading Examples:: ++ ++See @b{logical-pathname-translations}. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{file-error} might be signaled if either @i{input-file} or ++@i{output-file} is @i{wild}. ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node load, with-compilation-unit, compile-file-pathname, System Construction Dictionary ++@subsection load [Function] ++ ++@code{load} @i{filespec @r{&key} verbose print ++ if-does-not-exist external-format}@* ++ @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{filespec}---a @i{stream}, or a @i{pathname designator}. ++ The default is taken from @b{*default-pathname-defaults*}. ++ ++@i{verbose}---a @i{generalized boolean}. ++ The default is the @i{value} of @b{*load-verbose*}. ++ ++@i{print}---a @i{generalized boolean}. ++ The default is the @i{value} of @b{*load-print*}. ++ ++@i{if-does-not-exist}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{external-format}---an @i{external file format designator}. ++ The default is @t{:default}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{load} @i{loads} the @i{file} named by @i{filespec} ++into the @r{Lisp} environment. ++ ++The manner in which a @i{source file} ++is distinguished from a @i{compiled file} is @i{implementation-dependent}. ++If the file specification is not complete and both a @i{source file} and a ++@i{compiled file} exist which might match, ++then which of those files @b{load} selects is @i{implementation-dependent}. ++ ++If @i{filespec} is a @i{stream}, ++@b{load} determines what kind of @i{stream} it is ++and loads directly from the @i{stream}. ++ ++If @i{filespec} is a @i{logical pathname}, ++it is translated into a @i{physical pathname} ++as if by calling @b{translate-logical-pathname}. ++ ++@b{load} sequentially executes each @i{form} it encounters ++in the @i{file} named by @i{filespec}. ++If the @i{file} is a @i{source file} ++and the @i{implementation} chooses to perform @i{implicit compilation}, ++@b{load} must recognize @i{top level forms} ++as described in @ref{Processing of Top Level Forms} ++and arrange for each @i{top level form} to be executed ++before beginning @i{implicit compilation} of the next. ++(Note, however, that processing of @b{eval-when} @i{forms} ++by @b{load} is controlled by the @t{:execute} situation.) ++ ++If @i{verbose} is @i{true}, ++@b{load} prints a message in the form of a comment ++(@i{i.e.}, with a leading @i{semicolon}) ++to @i{standard output} indicating what @i{file} is being @i{loaded} ++and other useful information. ++ ++If @i{verbose} is @i{false}, ++@b{load} does not print this information. ++ ++If @i{print} is @i{true}, ++@b{load} incrementally prints information to @i{standard output} ++showing the progress of the @i{loading} process. ++For a @i{source file}, ++this information might mean printing the @i{values} ++@i{yielded} by each @i{form} in the @i{file} ++as soon as those @i{values} are returned. ++For a @i{compiled file}, ++what is printed might not reflect precisely the contents of the @i{source file}, ++but some information is generally printed. ++If @i{print} is @i{false}, ++@b{load} does not print this information. ++ ++If the file named by @i{filespec} is successfully loaded, ++@b{load} returns @i{true}. ++ ++[Reviewer Note by Loosemore: What happens if the file cannot be loaded for some reason other ++than that it doesn't exist?] ++[Editorial Note by KMP: i.e., can it return NIL? must it?] ++ ++If the file does not exist, ++the specific action taken depends on @i{if-does-not-exist}: ++if it is @b{nil}, @b{load} returns @b{nil}; ++otherwise, @b{load} signals an error. ++ ++The @i{external-format} specifies the @i{external file format} ++to be used when opening the @i{file} (see the @i{function} @b{open}), ++except that when the @i{file} named by @i{filespec} is a @i{compiled file}, ++the @i{external-format} is ignored. ++@b{compile-file} and @b{load} cooperate ++in an @i{implementation-dependent} way to assure ++the preservation of the @i{similarity} of @i{characters} ++referred to in the @i{source file} ++at the time the @i{source file} was processed by the @i{file compiler} ++under a given @i{external file format}, ++regardless of the value of @i{external-format} ++at the time the @i{compiled file} is @i{loaded}. ++ ++@b{load} binds @b{*readtable*} and @b{*package*} ++to the values they held before @i{loading} the file. ++ ++@b{*load-truename*} is @i{bound} by @b{load} to hold ++the @i{truename} of the @i{pathname} of the file being @i{loaded}. ++ ++@b{*load-pathname*} is @i{bound} by @b{load} to hold ++a @i{pathname} that represents @i{filespec} merged against the defaults. ++That is, @t{(pathname (merge-pathnames @i{filespec}))}. ++ ++@subsubheading Examples:: ++ ++@example ++;Establish a data file... ++ (with-open-file (str "data.in" :direction :output :if-exists :error) ++ (print 1 str) (print '(setq a 888) str) t) ++@result{} T ++ (load "data.in") @result{} @i{true} ++ a @result{} 888 ++ (load (setq p (merge-pathnames "data.in")) :verbose t) ++; Loading contents of file /fred/data.in ++; Finished loading /fred/data.in ++@result{} @i{true} ++ (load p :print t) ++; Loading contents of file /fred/data.in ++; 1 ++; 888 ++; Finished loading /fred/data.in ++@result{} @i{true} ++@end example ++ ++@example ++ ;----[Begin file SETUP]---- ++ (in-package "MY-STUFF") ++ (defmacro compile-truename () `',*compile-file-truename*) ++ (defvar *my-compile-truename* (compile-truename) "Just for debugging.") ++ (defvar *my-load-pathname* *load-pathname*) ++ (defun load-my-system () ++ (dolist (module-name '("FOO" "BAR" "BAZ")) ++ (load (merge-pathnames module-name *my-load-pathname*)))) ++ ;----[End of file SETUP]---- ++ ++ (load "SETUP") ++ (load-my-system) ++@end example ++ ++@subsubheading Affected By:: ++ ++The implementation, and the host computer's file system. ++ ++@subsubheading Exceptional Situations:: ++ ++If @t{:if-does-not-exist} is supplied and is @i{true}, or is not supplied, ++@b{load} signals an error of @i{type} @b{file-error} if the file named by ++@i{filespec} does not exist, ++ ++or if the @i{file system} cannot perform the requested operation. ++ ++An error of @i{type} @b{file-error} might be signaled if ++@t{(wild-pathname-p @i{filespec})} returns @i{true}. ++ ++@subsubheading See Also:: ++ ++@ref{error} ++, ++@ref{merge-pathnames} ++, ++@b{*load-verbose*}, ++@b{*default-pathname-defaults*}, ++@b{pathname}, ++@b{logical-pathname}, ++@ref{File System Concepts}, ++ ++@ref{Pathnames as Filenames} ++ ++@node with-compilation-unit, *features*, load, System Construction Dictionary ++@subsection with-compilation-unit [Macro] ++ ++@code{with-compilation-unit} @i{@r{(}[[!@i{option}]]@r{)} ++ @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{option} ::=@t{:override} override} ++ ++@subsubheading Arguments and Values:: ++ ++@i{override}---a @i{generalized boolean}; evaluated. ++ The default is @b{nil}. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++Executes @i{forms} from left to right. ++Within the @i{dynamic environment} of @b{with-compilation-unit}, ++actions deferred by the compiler until the end of compilation will be ++deferred until the end of the outermost call to @b{with-compilation-unit}. ++ ++The set of @i{options} permitted may be extended by the implementation, ++but the only @i{standardized} keyword is @t{:override}. ++ ++If nested dynamically only the outer call to ++@b{with-compilation-unit} has any effect unless the value ++associated with @t{:override} is @i{true}, in which case warnings are ++deferred only to the end of the innermost call for which @i{override} is @i{true}. ++ ++The function @b{compile-file} ++provides the effect of ++ ++@example ++ (with-compilation-unit (:override nil) ...) ++@end example ++ ++around its @i{code}. ++ ++Any @i{implementation-dependent} extensions can only be provided as the ++result of an explicit programmer request by use of an ++@i{implementation-dependent} keyword. @i{Implementations} are forbidden ++from attaching additional meaning to a use of this macro which involves either ++no keywords or just the keyword @t{:override}. ++ ++@subsubheading Examples:: ++ ++If an @i{implementation} would normally defer certain kinds of warnings, ++such as warnings about undefined functions, to the end of a compilation ++unit (such as a @i{file}), the following example shows how to cause those ++warnings to be deferred to the end of the compilation of several files. ++ ++@example ++ (defun compile-files (&rest files) ++ (with-compilation-unit () ++ (mapcar #'(lambda (file) (compile-file file)) files))) ++ ++ (compile-files "A" "B" "C") ++@end example ++ ++Note however that if the implementation does not normally defer any warnings, ++use of @i{with-compilation-unit} might not have any effect. ++ ++@subsubheading See Also:: ++ ++@ref{compile} ++, ++@ref{compile-file} ++ ++@node *features*, *compile-file-pathname*, with-compilation-unit, System Construction Dictionary ++@subsection *features* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{proper list}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*features*} is called the @i{features list}. ++It is a @i{list} of @i{symbols}, called @i{features}, ++that correspond to some aspect of the @i{implementation} or @i{environment}. ++ ++Most @i{features} have @i{implementation-dependent} meanings; ++The following meanings have been assigned to feature names: ++ ++@table @asis ++ ++@item @t{:cltl1} ++If present, indicates that the @t{LISP} @i{package} @i{purports to conform} ++to the 1984 specification @i{Common Lisp: The Language}. ++It is possible, but not required, for a @i{conforming implementation} ++to have this feature because this specification specifies that ++its @i{symbols} are to be in the @t{COMMON-LISP} @i{package}, ++not the @t{LISP} package. ++ ++@item @t{:cltl2} ++If present, indicates that the implementation @i{purports to conform} ++to @i{Common Lisp: The Language, Second Edition}. ++This feature must not be present in any @i{conforming implementation}, ++since conformance to that document is not compatible with conformance ++to this specification. ++The name, however, is reserved by this specification in order to help ++programs distinguish implementations which conform to that document ++from implementations which conform to this specification. ++ ++@item @t{:ieee-floating-point} ++If present, indicates that the implementation @i{purports to conform} ++to the requirements of @i{IEEE Standard for Binary Floating-Point Arithmetic}. ++ ++@item @t{:x3j13} ++If present, indicates that the implementation conforms to some ++particular working draft of this specification, ++or to some subset of features that approximates a belief about ++what this specification might turn out to contain. ++A @i{conforming implementation} might or might not contain ++such a feature. ++(This feature is intended primarily as a stopgap in order to ++provide implementors something to use prior to the availability ++of a draft standard, in order to discourage them from introducing ++the @t{:draft-ansi-cl} and @t{:ansi-cl} @i{features} prematurely.) ++ ++@item @t{:draft-ansi-cl} ++If present, indicates that the @i{implementation} ++@i{purports to conform} to the first full draft of this specification, ++which went to public review in 1992. ++A @i{conforming implementation} ++which has the @t{:draft-ansi-cl-2} or @t{:ansi-cl} @i{feature} ++is not permitted to retain the @t{:draft-ansi-cl} @i{feature} ++since incompatible changes were made subsequent to the first draft. ++ ++@item @t{:draft-ansi-cl-2} ++If present, indicates that a second full draft of this specification ++has gone to public review, and that the @i{implementation} ++@i{purports to conform} to that specification. ++(If additional public review drafts are produced, this keyword ++ will continue to refer to the second draft, and additional keywords ++ will be added to identify conformance with such later drafts. ++ As such, the meaning of this keyword can be relied upon not to ++ change over time.) ++A @i{conforming implementation} which has the @t{:ansi-cl} ++@i{feature} is only permitted to retain the @t{:draft-ansi-cl} ++@i{feature} if the finally approved standard is not incompatible ++with the draft standard. ++ ++@item @t{:ansi-cl} ++If present, indicates that this specification has been adopted by ANSI ++as an official standard, and that the @i{implementation} ++@i{purports to conform}. ++ ++@item @t{:common-lisp} ++This feature must appear in @b{*features*} for any implementation that ++has one or more of the features @t{:x3j13}, @t{:draft-ansi-cl}, ++or @t{:ansi-cl}. It is intended that it should also appear in ++implementations which have the features @t{:cltl1} or @t{:cltl2}, ++but this specification cannot force such behavior. The intent is ++that this feature should identify the language family named ``Common Lisp,'' ++rather than some specific dialect within that family. ++ ++@end table ++ ++@subsubheading See Also:: ++ ++@ref{Use of Read-Time Conditionals}, ++@ref{Standard Macro Characters} ++ ++@subsubheading Notes:: ++ ++The @i{value} of @b{*features*} is used by the @t{#+} and @t{#-} reader syntax. ++ ++@i{Symbols} in the @i{features list} may be in any @i{package}, ++but in practice they are generally in the @t{KEYWORD} @i{package}. ++This is because @t{KEYWORD} is the @i{package} used by default ++when @i{reading}_2 @i{feature expressions} ++in the @t{#+} and @t{#-} @i{reader macros}. ++@i{Code} that needs to name a @i{feature}_2 in a ++@i{package} P (other than @t{KEYWORD}) can do so ++by making explicit use of a @i{package prefix} for P, ++but note that such @i{code} must also assure that the @i{package} P ++exists in order for the @i{feature expression} to be @i{read}_2---even ++in cases where the @i{feature expression} is expected to fail. ++ ++It is generally considered wise for an @i{implementation} to include ++one or more @i{features} identifying the specific @i{implementation}, ++so that conditional expressions can be written which distinguish ++idiosyncrasies of one @i{implementation} from those of another. ++Since features are normally @i{symbols} in the @t{KEYWORD} @i{package} ++where name collisions might easily result, and since no uniquely defined mechanism ++is designated for deciding who has the right to use which @i{symbol} for ++what reason, a conservative strategy is to prefer names derived from ++one's own company or product name, since those names are often trademarked ++and are hence less likely to be used unwittingly by another @i{implementation}. ++ ++@node *compile-file-pathname*, *load-pathname*, *features*, System Construction Dictionary ++@subsection *compile-file-pathname*, *compile-file-truename* [Variable] ++ ++@subsubheading Value Type:: ++ ++The @i{value} of @b{*compile-file-pathname*} must always be a @i{pathname} or @b{nil}. ++The @i{value} of @b{*compile-file-truename*} must always be a @i{physical pathname} or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++During a call to @b{compile-file}, ++ @b{*compile-file-pathname*} is @i{bound} to ++ the @i{pathname} denoted by the first argument to @b{compile-file}, ++ merged against the defaults; ++ that is, it is @i{bound} to @t{(pathname (merge-pathnames @i{input-file}))}. ++During the same time interval, ++ @b{*compile-file-truename*} is @i{bound} to ++ the @i{truename} of the @i{file} being @i{compiled}. ++ ++At other times, the @i{value} of these @i{variables} is @b{nil}. ++ ++If a @i{break loop} is entered while @b{compile-file} is ongoing, ++it is @i{implementation-dependent} whether these @i{variables} retain ++the @i{values} they had just prior to entering the @i{break loop} ++or whether they are @i{bound} to @b{nil}. ++ ++The consequences are unspecified if ++an attempt is made to @i{assign} or @i{bind} either of these @i{variables}. ++ ++@subsubheading Affected By:: ++ ++The @i{file system}. ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++ ++@node *load-pathname*, *compile-print*, *compile-file-pathname*, System Construction Dictionary ++@subsection *load-pathname*, *load-truename* [Variable] ++ ++@subsubheading Value Type:: ++ ++The @i{value} of @b{*load-pathname*} must always be a @i{pathname} or @b{nil}. ++The @i{value} of @b{*load-truename*} must always be a @i{physical pathname} or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++During a call to @b{load}, ++ @b{*load-pathname*} is @i{bound} to ++ the @i{pathname} denoted by the the first argument to @b{load}, ++ merged against the defaults; ++ that is, it is @i{bound} to @t{(pathname (merge-pathnames @i{filespec}))}. ++During the same time interval, ++ @b{*load-truename*} is @i{bound} to ++ the @i{truename} of the @i{file} being loaded. ++ ++At other times, the @i{value} of these @i{variables} is @b{nil}. ++ ++If a @i{break loop} is entered while @b{load} is ongoing, ++it is @i{implementation-dependent} whether these @i{variables} retain ++the @i{values} they had just prior to entering the @i{break loop} ++or whether they are @i{bound} to @b{nil}. ++ ++The consequences are unspecified if ++an attempt is made to @i{assign} or @i{bind} either of these @i{variables}. ++ ++@subsubheading Affected By:: ++ ++The @i{file system}. ++ ++@subsubheading See Also:: ++ ++@ref{load} ++ ++@node *compile-print*, *load-print*, *load-pathname*, System Construction Dictionary ++@subsection *compile-print*, *compile-verbose* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*compile-print*} is the default value of the @t{:print} @i{argument} ++to @b{compile-file}. ++The @i{value} of @b{*compile-verbose*} is the default value of the @t{:verbose} @i{argument} ++to @b{compile-file}. ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++ ++@node *load-print*, *modules*, *compile-print*, System Construction Dictionary ++@subsection *load-print*, *load-verbose* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{generalized boolean}. ++ ++@subsubheading Initial Value:: ++ ++The initial @i{value} of @b{*load-print*} is @i{false}. ++The initial @i{value} of @b{*load-verbose*} is @i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*load-print*} is the default value of the @t{:print} @i{argument} to @b{load}. ++The @i{value} of @b{*load-verbose*} is the default value of the @t{:verbose} @i{argument} to @b{load}. ++ ++@subsubheading See Also:: ++ ++@ref{load} ++ ++@node *modules*, provide, *load-print*, System Construction Dictionary ++@subsection *modules* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{list} of @i{strings}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{*modules*} is a list of names of the modules ++that have been loaded into the current @i{Lisp image}. ++ ++@subsubheading Affected By:: ++ ++@b{provide} ++ ++@subsubheading See Also:: ++ ++@ref{provide} ++, ++@b{require} ++ ++@subsubheading Notes:: ++ ++The variable @b{*modules*} is deprecated. ++ ++@node provide, , *modules*, System Construction Dictionary ++@subsection provide, require [Function] ++ ++@code{provide} @i{module-name} @result{} @i{@i{implementation-dependent}} ++ ++@code{require} @i{module-name @r{&optional} pathname-list} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{module-name}---a @i{string designator}. ++ ++@i{pathname-list}---@b{nil}, or ++ a @i{designator} ++ for a @i{non-empty} @i{list} of @i{pathname designators}. ++ The default is @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{provide} adds the @i{module-name} to the @i{list} held by ++@b{*modules*}, if such a name is not already present. ++ ++@b{require} tests for the presence of the @i{module-name} in the ++@i{list} held by @b{*modules*}. ++If it is present, @b{require} immediately returns. ++ ++Otherwise, an attempt is made to load an appropriate set of @i{files} as follows: ++The @i{pathname-list} argument, if @i{non-nil}, ++ specifies a list of @i{pathnames} to be loaded in order, from left to right. ++If the @i{pathname-list} is @b{nil}, ++an @i{implementation-dependent} mechanism will be invoked in an attempt ++to load the module named @i{module-name}; ++if no such module can be loaded, an error of @i{type} @b{error} is signaled. ++ ++Both functions use @b{string=} to test for the presence of a @i{module-name}. ++ ++@subsubheading Examples:: ++ ++@example ++;;; This illustrates a nonportable use of REQUIRE, because it ++;;; depends on the implementation-dependent file-loading mechanism. ++ ++(require "CALCULUS") ++ ++;;; This use of REQUIRE is nonportable because of the literal ++;;; physical pathname. ++ ++(require "CALCULUS" "/usr/lib/lisp/calculus") ++ ++;;; One form of portable usage involves supplying a logical pathname, ++;;; with appropriate translations defined elsewhere. ++ ++(require "CALCULUS" "lib:calculus") ++ ++;;; Another form of portable usage involves using a variable or ++;;; table lookup function to determine the pathname, which again ++;;; must be initialized elsewhere. ++ ++(require "CALCULUS" *calculus-module-pathname*) ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{provide} modifies @b{*modules*}. ++ ++@subsubheading Affected By:: ++ ++The specific action taken by @b{require} is affected by calls to @b{provide} ++(or, in general, any changes to the @i{value} of @b{*modules*}). ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{module-name} is not a @i{string designator}. ++ ++If @b{require} fails to perform the requested operation ++due to a problem while interacting with the @i{file system}, ++an error of @i{type} @b{file-error} is signaled. ++ ++An error of @i{type} @b{file-error} might be signaled if any @i{pathname} ++in @i{pathname-list} is a @i{designator} for a @i{wild} @i{pathname}. ++ ++@subsubheading See Also:: ++ ++@b{*modules*}, ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++The functions @b{provide} and @b{require} are deprecated. ++ ++If a module consists of a single @i{package}, ++it is customary for the package and module names to be the same. ++ ++@c end of including dict-system-construction ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-25.texi +@@ -0,0 +1,1865 @@ ++ ++ ++@node Environment, Glossary (Glossary), System Construction, Top ++@chapter Environment ++ ++@menu ++* The External Environment:: ++* Environment Dictionary:: ++@end menu ++ ++@node The External Environment, Environment Dictionary, Environment, Environment ++@section The External Environment ++ ++@c including concept-environment ++ ++@menu ++* Top level loop:: ++* Debugging Utilities:: ++* Environment Inquiry:: ++* Time:: ++@end menu ++ ++@node Top level loop, Debugging Utilities, The External Environment, The External Environment ++@subsection Top level loop ++ ++The top level loop is the @r{Common Lisp} mechanism by which the user normally ++interacts with the @r{Common Lisp} system. This loop is sometimes referred to ++as the @i{Lisp read-eval-print loop} ++because it typically consists of an endless loop that reads an expression, ++evaluates it and prints the results. ++ ++The top level loop is not completely specified; thus the user ++interface is @i{implementation-defined}. ++The top level loop ++prints all values resulting from the evaluation of a ++@i{form}. ++Figure 25--1 lists variables that are maintained by the @i{Lisp read-eval-print loop}. ++ ++@format ++@group ++@noindent ++@w{ * + / - } ++@w{ ** ++ // } ++@w{ *** +++ /// } ++ ++@noindent ++@w{ Figure 25--1: Variables maintained by the Read-Eval-Print Loop} ++ ++@end group ++@end format ++ ++@node Debugging Utilities, Environment Inquiry, Top level loop, The External Environment ++@subsection Debugging Utilities ++ ++Figure 25--2 shows @i{defined names} relating to ++debugging. ++ ++@format ++@group ++@noindent ++@w{ *debugger-hook* documentation step } ++@w{ apropos dribble time } ++@w{ apropos-list ed trace } ++@w{ break inspect untrace } ++@w{ describe invoke-debugger } ++ ++@noindent ++@w{ Figure 25--2: Defined names relating to debugging} ++ ++@end group ++@end format ++ ++@node Environment Inquiry, Time, Debugging Utilities, The External Environment ++@subsection Environment Inquiry ++ ++Environment inquiry @i{defined names} provide information about ++the hardware and software configuration on which a @r{Common Lisp} program is ++being executed. ++ ++Figure 25--3 shows @i{defined names} relating to environment inquiry. ++ ++@format ++@group ++@noindent ++@w{ *features* machine-instance short-site-name } ++@w{ lisp-implementation-type machine-type software-type } ++@w{ lisp-implementation-version machine-version software-version } ++@w{ long-site-name room } ++ ++@noindent ++@w{ Figure 25--3: Defined names relating to environment inquiry. } ++ ++@end group ++@end format ++ ++@node Time, , Environment Inquiry, The External Environment ++@subsection Time ++ ++Time is represented in four different ways in @r{Common Lisp}: ++ @i{decoded time}, ++ @i{universal time}, ++ @i{internal time}, ++and seconds. ++@i{Decoded time} and @i{universal time} are used primarily to represent calendar time, ++and are precise only to one second. ++@i{Internal time} is used primarily to represent measurements of computer ++time (such as run time) and is precise to some @i{implementation-dependent} ++fraction of a second called an @i{internal time unit}, ++as specified by @b{internal-time-units-per-second}. ++An @i{internal time} can be used ++ for either @i{absolute} and @i{relative} @i{time} measurements. ++Both a @i{universal time} and a @i{decoded time} can be used ++ only for @i{absolute} @i{time} measurements. ++In the case of one function, @b{sleep}, ++time intervals are represented as a non-negative @i{real} number of seconds. ++ ++Figure 25--4 shows @i{defined names} relating to @i{time}. ++ ++@format ++@group ++@noindent ++@w{ decode-universal-time get-internal-run-time } ++@w{ encode-universal-time get-universal-time } ++@w{ get-decoded-time internal-time-units-per-second } ++@w{ get-internal-real-time sleep } ++ ++@noindent ++@w{ Figure 25--4: Defined names involving Time. } ++ ++@end group ++@end format ++ ++@menu ++* Decoded Time:: ++* Universal Time:: ++* Internal Time:: ++* Seconds:: ++@end menu ++ ++@node Decoded Time, Universal Time, Time, Time ++@subsubsection Decoded Time ++ ++A @i{decoded time} ++@IGindex decoded time ++ is an ordered series of nine values that, taken together, ++represent a point in calendar time (ignoring @i{leap seconds}): ++ ++@table @asis ++ ++@item @b{Second} ++An @i{integer} between 0 and~59, inclusive. ++ ++@item @b{Minute} ++An @i{integer} between 0 and~59, inclusive. ++ ++@item @b{Hour} ++An @i{integer} between 0 and~23, inclusive. ++ ++@item @b{Date} ++An @i{integer} between 1 and~31, inclusive (the upper limit actually ++depends on the month and year, of course). ++ ++@item @b{Month} ++An @i{integer} between 1 and 12, inclusive; ++1~means January, 2~means February, and so on; 12~means December. ++ ++@item @b{Year} ++An @i{integer} indicating the year A.D. However, if this ++@i{integer} ++is between 0 and 99, the ``obvious'' year is used; more precisely, ++that year is assumed that is equal to the ++@i{integer} modulo 100 and ++within fifty years of the current year (inclusive backwards ++and exclusive forwards). ++Thus, in the year 1978, year 28 is 1928 ++but year 27 is 2027. (Functions that return time in this format always return ++a full year number.) ++ ++@item @b{Day of week} ++An @i{integer} between~0 and~6, inclusive; ++0~means Monday, 1~means Tuesday, and so on; 6~means Sunday. ++ ++@item @b{Daylight saving time flag} ++A @i{generalized boolean} that, ++if @i{true}, indicates that daylight saving time is in effect. ++ ++@item @b{Time zone} ++A @i{time zone}. ++ ++@end table ++ ++Figure 25--5 shows @i{defined names} relating to @i{decoded time}. ++ ++@format ++@group ++@noindent ++@w{ decode-universal-time get-decoded-time } ++ ++@noindent ++@w{ Figure 25--5: Defined names involving time in Decoded Time.} ++ ++@end group ++@end format ++ ++@node Universal Time, Internal Time, Decoded Time, Time ++@subsubsection Universal Time ++ ++@i{Universal time} ++@IGindex universal time ++ is an @i{absolute} @i{time} represented as a ++single non-negative @i{integer}---the number of seconds since ++midnight, January 1, 1900 GMT (ignoring @i{leap seconds}). ++Thus the time 1 is 00:00:01 (that is, 12:00:01 a.m.) on January 1, 1900 GMT. ++Similarly, the time 2398291201 corresponds to time 00:00:01 on January 1, ++1976 GMT. ++Recall that the year 1900 was not a leap year; for the purposes of ++@r{Common Lisp}, a year is a leap year if and only if its number is divisible by 4, ++except that years divisible by 100 are not leap years, except that years ++divisible by 400 are leap years. Therefore the year 2000 will ++be a leap year. ++Because @i{universal time} must be a non-negative @i{integer}, ++times before the base time of midnight, January 1, 1900 GMT cannot be processed by @r{Common Lisp}. ++ ++@format ++@group ++@noindent ++@w{ decode-universal-time get-universal-time } ++@w{ encode-universal-time } ++ ++@noindent ++@w{ Figure 25--6: Defined names involving time in Universal Time.} ++ ++@end group ++@end format ++ ++@node Internal Time, Seconds, Universal Time, Time ++@subsubsection Internal Time ++ ++@i{Internal time} ++@IGindex internal time ++ represents time as a single @i{integer}, ++in terms of an @i{implementation-dependent} unit called an @i{internal time unit}. ++Relative time is measured as a number of these units. ++Absolute time is relative to an arbitrary time base. ++ ++Figure 25--7 shows @i{defined names} related to @i{internal time}. ++ ++@format ++@group ++@noindent ++@w{ get-internal-real-time internal-time-units-per-second } ++@w{ get-internal-run-time } ++ ++@noindent ++@w{ Figure 25--7: Defined names involving time in Internal Time.} ++ ++@end group ++@end format ++ ++@node Seconds, , Internal Time, Time ++@subsubsection Seconds ++ ++One function, @b{sleep}, takes its argument as a non-negative @i{real} number ++of seconds. Informally, it may be useful to think of this as ++a @i{relative} @i{universal time}, but it differs in one important way: ++@i{universal times} are always non-negative @i{integers}, whereas the argument to ++@b{sleep} can be any kind of non-negative @i{real}, in order to allow for ++the possibility of fractional seconds. ++ ++@format ++@group ++@noindent ++@w{ sleep } ++ ++@noindent ++@w{ Figure 25--8: Defined names involving time in Seconds.} ++ ++@end group ++@end format ++ ++@c end of including concept-environment ++ ++@node Environment Dictionary, , The External Environment, Environment ++@section Environment Dictionary ++ ++@c including dict-environment ++ ++@menu ++* decode-universal-time:: ++* encode-universal-time:: ++* get-universal-time:: ++* sleep:: ++* apropos:: ++* describe:: ++* describe-object:: ++* trace:: ++* step:: ++* time:: ++* internal-time-units-per-second:: ++* get-internal-real-time:: ++* get-internal-run-time:: ++* disassemble:: ++* documentation:: ++* room:: ++* ed:: ++* inspect:: ++* dribble:: ++* - (Variable):: ++* + (Variable):: ++* * (Variable):: ++* / (Variable):: ++* lisp-implementation-type:: ++* short-site-name:: ++* machine-instance:: ++* machine-type:: ++* machine-version:: ++* software-type:: ++* user-homedir-pathname:: ++@end menu ++ ++@node decode-universal-time, encode-universal-time, Environment Dictionary, Environment Dictionary ++@subsection decode-universal-time [Function] ++ ++@code{decode-universal-time} @i{universal-time @r{&optional} time-zone}@* ++ @result{} @i{second, minute, hour, date, month, year, day, daylight-p, zone} ++ ++@subsubheading Arguments and Values:: ++ ++@i{universal-time}---a @i{universal time}. ++ ++@i{time-zone}---a @i{time zone}. ++ ++@i{second}, @i{minute}, @i{hour}, @i{date}, @i{month}, ++@i{year}, @i{day}, @i{daylight-p}, @i{zone}---a @i{decoded time}. ++ ++@subsubheading Description:: ++ ++Returns the @i{decoded time} represented by the given @i{universal time}. ++ ++If @i{time-zone} is not supplied, ++it defaults to the current time zone adjusted for daylight saving time. ++ ++If @i{time-zone} is supplied, daylight saving time information is ignored. ++The daylight saving time flag is @b{nil} if @i{time-zone} is supplied. ++ ++@subsubheading Examples:: ++ ++@example ++ (decode-universal-time 0 0) @result{} 0, 0, 0, 1, 1, 1900, 0, @i{false}, 0 ++ ++;; The next two examples assume Eastern Daylight Time. ++ (decode-universal-time 2414296800 5) @result{} 0, 0, 1, 4, 7, 1976, 6, @i{false}, 5 ++ (decode-universal-time 2414293200) @result{} 0, 0, 1, 4, 7, 1976, 6, @i{true}, 5 ++ ++;; This example assumes that the time zone is Eastern Daylight Time ++;; (and that the time zone is constant throughout the example). ++ (let* ((here (nth 8 (multiple-value-list (get-decoded-time)))) ;Time zone ++ (recently (get-universal-time)) ++ (a (nthcdr 7 (multiple-value-list (decode-universal-time recently)))) ++ (b (nthcdr 7 (multiple-value-list (decode-universal-time recently here))))) ++ (list a b (equal a b))) @result{} ((T 5) (NIL 5) NIL) ++@end example ++ ++@subsubheading Affected By:: ++ ++@i{Implementation-dependent} mechanisms for calculating when or if daylight ++savings time is in effect for any given session. ++ ++@subsubheading See Also:: ++ ++@ref{encode-universal-time} ++, ++@ref{get-universal-time} ++, ++@ref{Time} ++ ++@node encode-universal-time, get-universal-time, decode-universal-time, Environment Dictionary ++@subsection encode-universal-time [function] ++ ++@subsubheading Syntax:: ++ ++@code{encode-universal-time} @i{second minute hour date month year ++ @r{&optional} time-zone}@* ++ @result{} @i{universal-time} ++ ++@subsubheading Arguments and Values:: ++ ++@i{second}, @i{minute}, @i{hour}, ++@i{date}, @i{month}, @i{year}, ++@i{time-zone}---the corresponding parts of a @i{decoded time}. ++ (Note that some of the nine values in a full @i{decoded time} are redundant, ++ and so are not used as inputs to this function.) ++ ++@i{universal-time}---a @i{universal time}. ++ ++@subsubheading Description:: ++ ++@b{encode-universal-time} converts a time from Decoded Time format ++to a @i{universal time}. ++ ++If @i{time-zone} is supplied, no adjustment for daylight savings time is performed. ++ ++@subsubheading Examples:: ++ ++@example ++ (encode-universal-time 0 0 0 1 1 1900 0) @result{} 0 ++ (encode-universal-time 0 0 1 4 7 1976 5) @result{} 2414296800 ++;; The next example assumes Eastern Daylight Time. ++ (encode-universal-time 0 0 1 4 7 1976) @result{} 2414293200 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{decode-universal-time} ++, @b{get-decoded-time} ++ ++@node get-universal-time, sleep, encode-universal-time, Environment Dictionary ++@subsection get-universal-time, get-decoded-time [Function] ++ ++@code{get-universal-time} @i{<@i{no @i{arguments}}>} @result{} @i{universal-time} ++ ++@code{get-decoded-time} @i{<@i{no @i{arguments}}>}@* ++ @result{} @i{second, minute, hour, date, month, year, day, daylight-p, zone} ++ ++@subsubheading Arguments and Values:: ++ ++@i{universal-time}---a @i{universal time}. ++ ++@i{second}, @i{minute}, @i{hour}, ++@i{date}, @i{month}, @i{year}, ++@i{day}, @i{daylight-p}, @i{zone}---a @i{decoded time}. ++ ++@subsubheading Description:: ++ ++@b{get-universal-time} returns the current time, represented as a @i{universal time}. ++ ++@b{get-decoded-time} returns the current time, represented as a @i{decoded time}. ++ ++@subsubheading Examples:: ++ ++@example ++;; At noon on July 4, 1976 in Eastern Daylight Time. ++ (get-decoded-time) @result{} 0, 0, 12, 4, 7, 1976, 6, @i{true}, 5 ++;; At exactly the same instant. ++ (get-universal-time) @result{} 2414332800 ++;; Exactly five minutes later. ++ (get-universal-time) @result{} 2414333100 ++;; The difference is 300 seconds (five minutes) ++ (- * **) @result{} 300 ++@end example ++ ++@subsubheading Affected By:: ++ ++The time of day (@i{i.e.}, the passage of time), ++the system clock's ability to keep accurate time, ++and the accuracy of the system clock's initial setting. ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{error} might be signaled if the current time cannot be determined. ++ ++@subsubheading See Also:: ++ ++@ref{decode-universal-time} ++, ++@ref{encode-universal-time} ++, ++@ref{Time} ++ ++@subsubheading Notes:: ++ ++@example ++ (get-decoded-time) @equiv{} (decode-universal-time (get-universal-time)) ++@end example ++ ++No @i{implementation} is required to have a way to verify that the ++time returned is correct. However, if an @i{implementation} provides ++a validity check (@i{e.g.}, the failure to have properly initialized the system ++clock can be reliably detected) and that validity check fails, ++the @i{implementation} is strongly encouraged (but not required) ++to signal an error of @i{type} @b{error} (rather than, for example, returning a ++known-to-be-wrong value) that is @i{correctable} by allowing the user ++to interactively set the correct time. ++ ++@node sleep, apropos, get-universal-time, Environment Dictionary ++@subsection sleep [Function] ++ ++@code{sleep} @i{seconds} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{seconds}---a non-negative @i{real}. ++ ++@subsubheading Description:: ++ ++Causes execution to cease and become dormant for approximately the ++seconds of real time indicated by @i{seconds}, ++whereupon execution is resumed. ++ ++@subsubheading Examples:: ++ ++@example ++ (sleep 1) @result{} NIL ++ ++;; Actually, since SLEEP is permitted to use approximate timing, ++;; this might not always yield true, but it will often enough that ++;; we felt it to be a productive example of the intent. ++ (let ((then (get-universal-time)) ++ (now (progn (sleep 10) (get-universal-time)))) ++ (>= (- now then) 10)) ++@result{} @i{true} ++@end example ++ ++@subsubheading Side Effects:: ++ ++Causes processing to pause. ++ ++@subsubheading Affected By:: ++ ++The granularity of the scheduler. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{seconds} is not a non-negative @i{real}. ++ ++@node apropos, describe, sleep, Environment Dictionary ++@subsection apropos, apropos-list [Function] ++ ++@code{apropos} @i{string @r{&optional} package} @result{} @i{<@i{no @i{values}}>} ++ ++@code{apropos-list} @i{string @r{&optional} package} @result{} @i{symbols} ++ ++@subsubheading Arguments and Values:: ++ ++@i{string}---a @i{string designator}. ++ ++@i{package}---a @i{package designator} or @b{nil}. ++ The default is @b{nil}. ++ ++@i{symbols}---a @i{list} of @i{symbols}. ++ ++@subsubheading Description:: ++ ++These functions search for @i{interned} @i{symbols} ++whose @i{names} contain the substring @i{string}. ++ ++For @b{apropos}, as each such @i{symbol} is found, ++its name is printed on @i{standard output}. ++In addition, ++if such a @i{symbol} is defined as a @i{function} or @i{dynamic variable}, ++information about those definitions might also be printed. ++ ++For @b{apropos-list}, ++no output occurs as the search proceeds; ++instead a list of the matching @i{symbols} is returned when the search is complete. ++ ++If @i{package} is @i{non-nil}, ++only the @i{symbols} @i{accessible} in that @i{package} are searched; ++otherwise all @i{symbols} @i{accessible} in any @i{package} are searched. ++ ++Because a @i{symbol} might be available ++by way of more than one inheritance path, ++@b{apropos} might print information about the @i{same} @i{symbol} more than once, ++or @b{apropos-list} might return a @i{list} containing duplicate @i{symbols}. ++ ++Whether or not the search is case-sensitive is @i{implementation-defined}. ++ ++@subsubheading Affected By:: ++ ++The set of @i{symbols} which are currently @i{interned} ++in any @i{packages} being searched. ++ ++@b{apropos} is also affected by @b{*standard-output*}. ++ ++@node describe, describe-object, apropos, Environment Dictionary ++@subsection describe [Function] ++ ++@code{describe} @i{object @r{&optional} stream} @result{} @i{<@i{no @i{values}}>} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{stream}---an @i{output} @i{stream designator}. ++ The default is @i{standard output}. ++ ++@subsubheading Description:: ++ ++@b{describe} displays information about @i{object} ++ ++to @i{stream}. ++ ++For example, @b{describe} of a @i{symbol} might show the ++@i{symbol}'s value, its definition, and each of its properties. ++@b{describe} of a @i{float} might show the number's ++internal representation in a way that is useful for tracking ++down round-off errors. In all cases, however, the nature and format of the ++output of @b{describe} is @i{implementation-dependent}. ++ ++@b{describe} can describe something that it finds inside the @i{object}; ++in such cases, a notational device such as increased indentation or positioning in a ++table is typically used in order to visually distinguish such recursive descriptions ++from descriptions of the argument @i{object}. ++ ++The actual act of describing the object is implemented by @b{describe-object}. ++@b{describe} exists as an interface primarily to manage argument defaulting (including ++conversion of arguments @b{t} and @b{nil} into @i{stream} @i{objects}) and to inhibit ++any return values from @b{describe-object}. ++ ++@b{describe} is not intended to be an interactive function. In a ++@i{conforming implementation}, @b{describe} must not, by default, ++prompt for user input. User-defined methods for @b{describe-object} ++are likewise restricted. ++ ++@subsubheading Side Effects:: ++ ++Output to @i{standard output} or @i{terminal I/O}. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*} and @b{*terminal-io*}, ++methods on @b{describe-object} and @b{print-object} ++for @i{objects} having user-defined @i{classes}. ++ ++@subsubheading See Also:: ++ ++@ref{inspect} ++, ++@ref{describe-object} ++ ++@node describe-object, trace, describe, Environment Dictionary ++@subsection describe-object [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{describe-object} @i{object stream} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Method Signatures:: ++ ++@code{describe-object} @i{(@i{object} standard-object) @i{stream}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{stream}---a @i{stream}. ++ ++@subsubheading Description:: ++ ++The generic function @b{describe-object} prints a description of ++@i{object} to a @i{stream}. @b{describe-object} is called ++by @b{describe}; it must not be called by the user. ++ ++Each implementation is required to provide a @i{method} on ++the @i{class} @b{standard-object} and @i{methods} on enough other ++@i{classes} so as to ensure that there is always an applicable @i{method}. ++Implementations are free to add @i{methods} for other @i{classes}. ++Users can write @i{methods} for @b{describe-object} for their ++own @i{classes} if they do not wish to inherit an implementation-supplied ++@i{method}. ++ ++@i{Methods} on @b{describe-object} can recursively call ++@b{describe}. Indentation, depth limits, and circularity detection ++are all taken care of automatically, provided that each @i{method} ++handles exactly one level of structure and calls @b{describe} ++recursively if there are more structural levels. The consequences are ++undefined if this rule is not obeyed. ++ ++In some implementations the @i{stream} argument passed to a ++@b{describe-object} method is not the original @i{stream}, but is ++an intermediate @i{stream} that implements parts of @b{describe}. ++@i{Methods} should therefore not depend on the identity of this ++@i{stream}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defclass spaceship () ++ ((captain :initarg :captain :accessor spaceship-captain) ++ (serial# :initarg :serial-number :accessor spaceship-serial-number))) ++ ++ (defclass federation-starship (spaceship) ()) ++ ++ (defmethod describe-object ((s spaceship) stream) ++ (with-slots (captain serial#) s ++ (format stream "~&~S is a spaceship of type ~S,~ ++ ~ ++ and with serial number ~D.~ ++ s (type-of s) captain serial#))) ++ ++ (make-instance 'federation-starship ++ :captain "Rachel Garrett" ++ :serial-number "NCC-1701-C") ++@result{} # ++ ++ (describe *) ++@t{ |> } # is a spaceship of type FEDERATION-STARSHIP, ++@t{ |> } with Rachel Garrett at the helm and with serial number NCC-1701-C. ++@result{} <@i{no @i{values}}> ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{describe} ++ ++@subsubheading Notes:: ++ ++The same implementation techniques that are applicable to @b{print-object} are ++applicable to @b{describe-object}. ++ ++The reason for making the return values for @b{describe-object} ++unspecified is to avoid forcing users to include explicit @t{(values)} ++in all of their @i{methods}. @b{describe} takes care of that. ++ ++@node trace, step, describe-object, Environment Dictionary ++@subsection trace, untrace [Macro] ++ ++@code{trace} @i{@{@i{function-name}@}*} @result{} @i{trace-result} ++ ++@code{untrace} @i{@{@i{function-name}@}*} @result{} @i{untrace-result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-name}---a @i{function name}. ++ ++@i{trace-result}---@i{implementation-dependent}, ++ unless no @i{function-names} are supplied, ++ in which case @i{trace-result} is a @i{list} of @i{function names}. ++ ++@i{untrace-result}---@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++@b{trace} and @b{untrace} control the invocation of the trace facility. ++ ++Invoking @b{trace} with one or more @i{function-names} causes ++the denoted @i{functions} to be ``traced.'' ++Whenever a traced @i{function} is invoked, information ++ about the call, ++ about the arguments passed, ++ and about any eventually returned values ++is printed to @i{trace output}. ++If @b{trace} is used with no @i{function-names}, ++no tracing action is performed; ++instead, a list of the @i{functions} currently being traced is returned. ++ ++Invoking @b{untrace} with one or more function names causes those ++functions to be ``untraced'' (@i{i.e.}, no longer traced). ++If @b{untrace} is used with no @i{function-names}, ++all @i{functions} currently being traced are untraced. ++ ++If a @i{function} to be traced has been open-coded ++(@i{e.g.}, because it was declared @b{inline}), ++a call to that @i{function} might not produce trace output. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun fact (n) (if (zerop n) 1 (* n (fact (- n 1))))) ++@result{} FACT ++ (trace fact) ++@result{} (FACT) ++;; Of course, the format of traced output is implementation-dependent. ++ (fact 3) ++@t{ |> } 1 Enter FACT 3 ++@t{ |> } | 2 Enter FACT 2 ++@t{ |> } | 3 Enter FACT 1 ++@t{ |> } | | 4 Enter FACT 0 ++@t{ |> } | | 4 Exit FACT 1 ++@t{ |> } | 3 Exit FACT 1 ++@t{ |> } | 2 Exit FACT 2 ++@t{ |> } 1 Exit FACT 6 ++@result{} 6 ++@end example ++ ++@subsubheading Side Effects:: ++ ++Might change the definitions of the @i{functions} named by @i{function-names}. ++ ++@subsubheading Affected By:: ++ ++Whether the functions named are defined or already being traced. ++ ++@subsubheading Exceptional Situations:: ++ ++ Tracing an already traced function, ++or untracing a function not currently being traced, ++should produce no harmful effects, but might signal a warning. ++ ++@subsubheading See Also:: ++ ++@b{*trace-output*}, ++@ref{step} ++ ++@subsubheading Notes:: ++ ++@b{trace} and @b{untrace} may also accept additional ++@i{implementation-dependent} argument formats. The format of the trace ++output is @i{implementation-dependent}. ++ ++Although @b{trace} can be extended to permit non-standard options, ++@i{implementations} are nevertheless encouraged (but not required) ++to warn about the use of syntax or options ++that are neither specified by this standard ++nor added as an extension by the @i{implementation}, ++since they could be symptomatic of typographical errors ++or of reliance on features supported in @i{implementations} ++other than the current @i{implementation}. ++ ++@node step, time, trace, Environment Dictionary ++@subsection step [Macro] ++ ++@code{step} @i{form} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}; evaluated as described below. ++ ++@i{results}---the @i{values} returned by the @i{form}. ++ ++@subsubheading Description:: ++ ++@b{step} implements a debugging paradigm wherein the programmer ++is allowed to @i{step} through the @i{evaluation} of a @i{form}. ++The specific nature of the interaction, ++ ++including which I/O streams are used and ++whether the stepping has lexical or dynamic scope, ++ ++is @i{implementation-defined}. ++ ++@b{step} evaluates @i{form} in the current @i{environment}. ++A call to @b{step} can be compiled, but it is acceptable for an ++implementation to interactively step through only those parts of the computation ++that are interpreted. ++ ++It is technically permissible for a @i{conforming implementation} ++to take no action at all other than normal @i{execution} of the @i{form}. ++In such a situation, ++@t{(step @i{form})} ++is equivalent to, for example, ++@t{(let () @i{form})}. ++In implementations where this is the case, the associated documentation ++should mention that fact. ++ ++@subsubheading See Also:: ++ ++@ref{trace} ++ ++@subsubheading Notes:: ++ ++@i{Implementations} are encouraged to respond to the typing of @t{?} ++or the pressing of a ``help key'' by providing help including a list of ++commands. ++ ++@node time, internal-time-units-per-second, step, Environment Dictionary ++@subsection time [Macro] ++ ++@code{time} @i{form} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}; evaluated as described below. ++ ++@i{results}---the @i{values} returned by the @i{form}. ++ ++@subsubheading Description:: ++ ++@b{time} evaluates @i{form} in the current @i{environment} (lexical and dynamic). ++A call to @b{time} can be compiled. ++ ++@b{time} prints various timing data and other information to @i{trace output}. ++The nature and format of the printed information is @i{implementation-defined}. ++Implementations are encouraged to provide such information as ++ elapsed real time, ++ machine run time, ++ and storage management statistics. ++ ++@subsubheading Affected By:: ++ ++The accuracy of the results depends, among other things, on the accuracy ++of the corresponding functions provided by the underlying operating system. ++ ++The magnitude of the results may depend on ++ the hardware, ++ the operating system, ++ the lisp implementation, ++ and the state of the global environment. ++Some specific issues which frequently affect the outcome are ++ hardware speed, ++ nature of the scheduler (if any), ++ number of competing processes (if any), ++ system paging, ++ whether the call is interpreted or compiled, ++ whether functions called are compiled, ++ the kind of garbage collector involved and whether it runs, ++ whether internal data structures (e.g., hash tables) are implicitly reorganized, ++ @i{etc.} ++ ++@subsubheading See Also:: ++ ++@ref{get-internal-real-time} ++, ++@ref{get-internal-run-time} ++ ++@subsubheading Notes:: ++ ++In general, these timings are not guaranteed to be reliable enough for ++marketing comparisons. Their value is primarily heuristic, for tuning ++purposes. ++ ++For useful background information on the complicated issues involved in ++interpreting timing results, see @i{Performance and Evaluation of Lisp Programs}. ++ ++@node internal-time-units-per-second, get-internal-real-time, time, Environment Dictionary ++@subsection internal-time-units-per-second [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++A positive @i{integer}, the magnitude of which is @i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The number of @i{internal time units} in one second. ++ ++@subsubheading See Also:: ++ ++@ref{get-internal-run-time} ++, ++@ref{get-internal-real-time} ++ ++@subsubheading Notes:: ++ ++These units form the basis of the Internal Time format representation. ++ ++@node get-internal-real-time, get-internal-run-time, internal-time-units-per-second, Environment Dictionary ++@subsection get-internal-real-time [Function] ++ ++@code{get-internal-real-time} @i{<@i{no @i{arguments}}>} @result{} @i{internal-time} ++ ++@subsubheading Arguments and Values:: ++ ++@i{internal-time}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++@b{get-internal-real-time} returns as an @i{integer} the ++current time in @i{internal time units}, relative to an arbitrary ++time base. The difference between the values of two calls to this ++function is the amount of elapsed real time (@i{i.e.}, clock time) between the two calls. ++ ++@subsubheading Affected By:: ++ ++Time of day (@i{i.e.}, the passage of time). ++The time base affects the result magnitude. ++ ++@subsubheading See Also:: ++ ++@ref{internal-time-units-per-second} ++ ++@node get-internal-run-time, disassemble, get-internal-real-time, Environment Dictionary ++@subsection get-internal-run-time [Function] ++ ++@code{get-internal-run-time} @i{<@i{no @i{arguments}}>} @result{} @i{internal-time} ++ ++@subsubheading Arguments and Values:: ++ ++@i{internal-time}---a non-negative @i{integer}. ++ ++@subsubheading Description:: ++ ++Returns as an @i{integer} the current ++run time in @i{internal time units}. The precise meaning of this quantity is ++@i{implementation-defined}; it may measure real time, run time, CPU cycles, or some ++other quantity. The intent is that the difference between the values of two calls ++to this function be the amount of time between the two calls during which ++computational effort was expended on behalf of the executing program. ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}, ++the time of day (@i{i.e.}, the passage of time). ++ ++@subsubheading See Also:: ++ ++@ref{internal-time-units-per-second} ++ ++@subsubheading Notes:: ++ ++Depending on the @i{implementation}, paging time and garbage ++collection time might be included in this measurement. Also, in a ++multitasking environment, it might not be possible to show the time for ++just the running process, so in some @i{implementations}, time taken ++by other processes during the same time interval might be included in ++this measurement as well. ++ ++@node disassemble, documentation, get-internal-run-time, Environment Dictionary ++@subsection disassemble [Function] ++ ++@code{disassemble} @i{fn} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{fn}---an @i{extended function designator} ++ or a @i{lambda expression}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{disassemble} is a debugging aid that composes symbolic ++instructions or expressions in some @i{implementation-dependent} ++language which represent the code used to produce the @i{function} ++which is or is named by the argument @i{fn}. The result is displayed ++to @i{standard output} in an @i{implementation-dependent} format. ++ ++If @i{fn} is a @i{lambda expression} or @i{interpreted function}, ++it is compiled first and the result is disassembled. ++ ++If the @i{fn} @i{designator} is a @i{function name}, ++the @i{function} that it @i{names} is disassembled. ++ ++(If that @i{function} is an @i{interpreted function}, ++it is first compiled but the result of this implicit compilation is not installed.) ++ ++@subsubheading Examples:: ++ ++@example ++ (defun f (a) (1+ a)) @result{} F ++ (eq (symbol-function 'f) ++ (progn (disassemble 'f) ++ (symbol-function 'f))) @result{} @i{true} ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{fn} is not an @i{extended function designator} ++ or a @i{lambda expression}. ++ ++@node documentation, room, disassemble, Environment Dictionary ++@subsection documentation, (setf documentation) [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{documentation} @i{x doc-type} @result{} @i{documentation} ++ ++@code{(setf documentation)} @i{new-value x doc-type} @result{} @i{new-value} ++ ++@subsubheading Argument Precedence Order:: ++ ++@i{doc-type}, @i{object} ++ ++@subsubheading Method Signatures:: ++ ++@subsubheading Functions, Macros, and Special Forms ++ ++documentation (@i{x} @code{function}) (doc-type (eql 't))@* ++(setf documentation) @i{new-value}(@i{x} @code{function}) (doc-type (eql 't)) ++ ++documentation (@i{x} @code{function}) (doc-type (eql 'function))@* ++(setf documentation) @i{new-value}(@i{x} @code{function}) (doc-type (eql 'function)) ++ ++documentation (@i{x} @code{list}) (doc-type (eql 'function))@* ++(setf documentation) @i{new-value}(@i{x} @code{list}) (doc-type (eql 'function)) ++ ++documentation (@i{x} @code{list}) (doc-type (eql 'compiler-macro))@* ++(setf documentation) @i{new-value}(@i{x} @code{list}) (doc-type (eql 'compiler-macro)) ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'function))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'function)) ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'compiler-macro))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'compiler-macro)) ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'setf))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'setf)) ++ ++@subsubheading Method Combinations ++ ++documentation (@i{x} @code{method-combination}) (doc-type (eql 't))@* ++(setf documentation) @i{new-value}(@i{x} @code{method-combination}) (doc-type (eql 't)) ++ ++documentation (@i{x} @code{method-combination}) (doc-type (eql 'method-combination))@* ++(setf documentation) @i{new-value}(@i{x} @code{method-combination}) (doc-type (eql 'method-combination)) ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'method-combination))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'method-combination)) ++ ++@subsubheading Methods ++ ++documentation (@i{x} @code{standard-method}) (doc-type (eql 't))@* ++(setf documentation) @i{new-value}(@i{x} @code{standard-method}) (doc-type (eql 't)) ++ ++@subsubheading Packages ++ ++documentation (@i{x} @code{package}) (doc-type (eql 't))@* ++(setf documentation) @i{new-value}(@i{x} @code{package}) (doc-type (eql 't)) ++ ++@subsubheading Types, Classes, and Structure Names ++ ++documentation (@i{x} @code{standard-class}) (doc-type (eql 't))@* ++(setf documentation) @i{new-value}(@i{x} @code{standard-class}) (doc-type (eql 't)) ++ ++documentation (@i{x} @code{standard-class}) (doc-type (eql 'type))@* ++(setf documentation) @i{new-value}(@i{x} @code{standard-class}) (doc-type (eql 'type)) ++ ++documentation (@i{x} @code{structure-class}) (doc-type (eql 't))@* ++(setf documentation) @i{new-value}(@i{x} @code{structure-class}) (doc-type (eql 't)) ++ ++documentation (@i{x} @code{structure-class}) (doc-type (eql 'type))@* ++(setf documentation) @i{new-value}(@i{x} @code{structure-class}) (doc-type (eql 'type)) ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'type))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'type)) ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'structure))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'structure)) ++ ++@subsubheading Variables ++ ++documentation (@i{x} @code{symbol}) (doc-type (eql 'variable))@* ++(setf documentation) @i{new-value}(@i{x} @code{symbol}) (doc-type (eql 'variable)) ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---an @i{object}. ++ ++@i{doc-type}---a @i{symbol}. ++ ++@i{documentation}---a @i{string}, or @b{nil}. ++ ++@i{new-value}---a @i{string}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{documentation} returns the @i{documentation string} ++associated with the given @i{object} if it is available; ++otherwise it returns @b{nil}. ++ ++The @i{generic function} @t{(setf documentation)} updates the ++@i{documentation string} associated with @i{x} to @i{new-value}. ++If @i{x} is a @i{list}, ++it must be of the form @t{(setf @i{symbol})}. ++ ++@i{Documentation strings} are made available for debugging purposes. ++@i{Conforming programs} are permitted to use @i{documentation strings} ++when they are present, but should not depend for their correct behavior on ++the presence of those @i{documentation strings}. ++An @i{implementation} is permitted to discard @i{documentation strings} ++at any time for @i{implementation-defined} reasons. ++ ++The nature of the @i{documentation string} returned depends on the ++@i{doc-type}, as follows: ++ ++@table @asis ++ ++@item @b{compiler-macro} ++Returns the @i{documentation string} of the @i{compiler macro} ++whose @i{name} is the @i{function name} @i{x}. ++ ++@item @b{function} ++If @i{x} is a @i{function name}, ++returns the @i{documentation string} of ++the @i{function}, @i{macro}, or @i{special operator} ++whose @i{name} is @i{x}. ++ ++If @i{x} is a @i{function}, ++returns the @i{documentation string} associated with @i{x}. ++ ++@item @b{method-combination} ++If @i{x} is a @i{symbol}, ++returns the @i{documentation string} of ++the @i{method combination} ++whose @i{name} is @i{x}. ++ ++If @i{x} is a @i{method combination}, ++returns the @i{documentation string} associated with @i{x}. ++ ++@item @b{setf} ++Returns the @i{documentation string} of ++ ++the @i{setf expander} ++ ++whose @i{name} is the @i{symbol} @i{x}. ++ ++@item @b{structure} ++Returns the @i{documentation string} ++associated with the @i{structure name} @i{x}. ++ ++@item @b{t} ++Returns a @i{documentation string} specialized on the @i{class} of ++the argument @i{x} itself. ++For example, if @i{x} is a @i{function}, ++the @i{documentation string} associated with the @i{function} @i{x} is returned. ++ ++@item @b{type} ++If @i{x} is a @i{symbol}, ++returns the @i{documentation string} of the @i{class} ++whose @i{name} is the @i{symbol} @i{x}, ++if there is such a @i{class}. ++Otherwise, it returns the @i{documentation string} of the @i{type} ++which is the @i{type specifier} @i{symbol} @i{x}. ++ ++If @i{x} is a @i{structure class} or @i{standard class}, ++returns the @i{documentation string} associated with ++the @i{class} @i{x}. ++ ++@item @b{variable} ++Returns the @i{documentation string} of ++the @i{dynamic variable} or @i{constant variable} ++whose @i{name} is the @i{symbol} @i{x}. ++ ++@end table ++ ++A @i{conforming implementation} or a @i{conforming program} ++may extend the set of @i{symbols} that are acceptable as the @i{doc-type}. ++ ++@subsubheading Notes:: ++ ++This standard prescribes no means to retrieve the @i{documentation strings} ++for individual slots specified in a @b{defclass} form, but ++@i{implementations} might still provide debugging tools and/or ++programming language extensions which manipulate this information. ++Implementors wishing to provide such support are encouraged to consult the ++@i{Metaobject Protocol} for suggestions about how this might be done. ++ ++@node room, ed, documentation, Environment Dictionary ++@subsection room [Function] ++ ++@code{room} @i{@r{&optional} x} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---one of @b{t}, @b{nil}, or @t{:default}. ++ ++@subsubheading Description:: ++ ++@b{room} prints, to @i{standard output}, ++information about the state of internal storage and its management. ++This might include descriptions of the amount of memory in use and ++the degree of memory compaction, possibly broken down by internal data type if that ++is appropriate. The nature and format of the printed information is ++@i{implementation-dependent}. ++The intent is to provide information that a @i{programmer} ++might use to tune a @i{program} for a particular @i{implementation}. ++ ++@t{(room nil)} prints out a minimal amount of information. ++@t{(room t)} prints out a maximal amount of information. ++ ++@t{(room)} or @t{(room :default)} prints out an intermediate amount ++of information that is likely to be useful. ++ ++@subsubheading Side Effects:: ++ ++Output to @i{standard output}. ++ ++@subsubheading Affected By:: ++ ++@b{*standard-output*}. ++ ++@node ed, inspect, room, Environment Dictionary ++@subsection ed [Function] ++ ++@code{ed} @i{@r{&optional} x} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---@b{nil}, a @i{pathname}, a @i{string}, or a @i{function name}. ++ ++ The default is @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{ed} invokes the editor if the @i{implementation} provides a resident editor. ++ ++If @i{x} is @b{nil}, the editor is entered. ++If the editor had been previously entered, its prior state is resumed, if possible. ++ ++If @i{x} is a @i{pathname} or @i{string}, ++it is taken as the @i{pathname designator} for a @i{file} to be edited. ++ ++If @i{x} is a @i{function name}, the text of its definition is edited. ++The means by which the function text is obtained is @i{implementation-defined}. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if the @i{implementation} does not provide a resident editor. ++ ++Might signal @b{type-error} if its argument is supplied but is not ++a @i{symbol}, a @i{pathname}, or @b{nil}. ++ ++If a failure occurs when performing some operation on the @i{file system} ++while attempting to edit a @i{file}, ++an error of @i{type} @b{file-error} is signaled. ++ ++An error of @i{type} @b{file-error} might be signaled if @i{x} ++is a @i{designator} for a @i{wild} @i{pathname}. ++ ++@i{Implementation-dependent} additional conditions might be signaled as well. ++ ++@subsubheading See Also:: ++ ++@b{pathname}, ++ ++@b{logical-pathname}, ++ ++@ref{compile-file} ++, ++@ref{load} ++, ++ ++@ref{Pathnames as Filenames} ++ ++@node inspect, dribble, ed, Environment Dictionary ++@subsection inspect [Function] ++ ++@code{inspect} @i{object} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{inspect} is an interactive version of @b{describe}. ++The nature of the interaction is @i{implementation-dependent}, ++but the purpose of @b{inspect} is to make it easy to wander ++through a data structure, examining and modifying parts of it. ++ ++@subsubheading Side Effects:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Affected By:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Exceptional Situations:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading See Also:: ++ ++@ref{describe} ++ ++@subsubheading Notes:: ++ ++Implementations are encouraged to respond to the typing ++of @t{?} or a ``help key'' by providing help, including a list ++of commands. ++ ++@node dribble, - (Variable), inspect, Environment Dictionary ++@subsection dribble [Function] ++ ++@code{dribble} @i{@r{&optional} pathname} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{pathname}---a @i{pathname designator}. ++ ++@subsubheading Description:: ++ ++Either @i{binds} @b{*standard-input*} and @b{*standard-output*} ++or takes other appropriate action, ++so as to send a record of the input/output interaction to a file ++named by @i{pathname}. @b{dribble} is intended to create ++a readable record of an interactive session. ++ ++If @i{pathname} is a @i{logical pathname}, it is translated ++into a physical pathname as if by calling @b{translate-logical-pathname}. ++ ++@t{(dribble)} terminates the recording of input and output ++and closes the dribble file. ++ ++If @b{dribble} is @i{called} while a @i{stream} to a ``dribble file'' ++is still open from a previous @i{call} to @b{dribble}, ++the effect is @i{implementation-defined}. For example, ++ the already-@i{open} @i{stream} might be @i{closed}, ++ or dribbling might occur both to the old @i{stream} and to a new one, ++ or the old @i{stream} might stay open but not receive any further output, ++ or the new request might be ignored, ++ or some other action might be taken. ++ ++@subsubheading Affected By:: ++ ++The @i{implementation}. ++ ++@subsubheading Exceptional Situations:: ++ ++If a failure occurs when performing some operation on the @i{file system} ++while creating the dribble file, ++an error of @i{type} @b{file-error} is signaled. ++ ++An error of @i{type} @b{file-error} might be signaled if @i{pathname} ++is a @i{designator} for a @i{wild} @i{pathname}. ++ ++@subsubheading See Also:: ++ ++@ref{Pathnames as Filenames} ++ ++@subsubheading Notes:: ++ ++@b{dribble} can return before subsequent ++@i{forms} are executed. It also ++can enter a recursive interaction loop, ++returning only when @t{(dribble)} is done. ++ ++@b{dribble} is intended primarily for interactive debugging; ++its effect cannot be relied upon when used in a program. ++ ++@node - (Variable), + (Variable), dribble, Environment Dictionary ++@subsection - [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{form}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{-} is the @i{form} that is currently being evaluated by ++the @i{Lisp read-eval-print loop}. ++ ++@subsubheading Examples:: ++ ++@example ++(format t "~&Evaluating ~S~ ++@t{ |> } Evaluating (FORMAT T "~&Evaluating ~S~ ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@i{Lisp read-eval-print loop}. ++ ++@subsubheading See Also:: ++ ++@b{+} (@i{variable}), ++@b{*} (@i{variable}), ++@ref{/} ++ (@i{variable}), ++@ref{Top level loop} ++ ++@node + (Variable), * (Variable), - (Variable), Environment Dictionary ++@subsection +, ++, +++ [Variable] ++ ++@subsubheading Value Type:: ++ ++an @i{object}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{variables} @b{+}, @b{++}, and @b{+++} are maintained by the ++@i{Lisp read-eval-print loop} to save @i{forms} that were ++recently @i{evaluated}. ++ ++The @i{value} of @b{+} is the last @i{form} that was @i{evaluated}, ++the @i{value} of @b{++} is the previous value of @b{+}, and ++the @i{value} of @b{+++} is the previous value of @b{++}. ++ ++@subsubheading Examples:: ++@example ++(+ 0 1) @result{} 1 ++(- 4 2) @result{} 2 ++(/ 9 3) @result{} 3 ++(list + ++ +++) @result{} ((/ 9 3) (- 4 2) (+ 0 1)) ++(setq a 1 b 2 c 3 d (list a b c)) @result{} (1 2 3) ++(setq a 4 b 5 c 6 d (list a b c)) @result{} (4 5 6) ++(list a b c) @result{} (4 5 6) ++(eval +++) @result{} (1 2 3) ++#.`(,@@++ d) @result{} (1 2 3 (1 2 3)) ++@end example ++ ++@subsubheading Affected By:: ++ ++@i{Lisp read-eval-print loop}. ++ ++@subsubheading See Also:: ++ ++@ref{-} ++ (@i{variable}), ++@b{*} (@i{variable}), ++@ref{/} ++ (@i{variable}), ++@ref{Top level loop} ++ ++@node * (Variable), / (Variable), + (Variable), Environment Dictionary ++@subsection *, **, *** [Variable] ++ ++@subsubheading Value Type:: ++ ++an @i{object}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{variables} @b{*}, @b{**}, and @b{***} are ++maintained by the @i{Lisp read-eval-print loop} to save the ++values of results that are printed each time through the loop. ++ ++The @i{value} of @b{*} is the most recent @i{primary value} that was printed, ++the @i{value} of @b{**} is the previous value of @b{*}, and ++the @i{value} of @b{***} is the previous value of @b{**}. ++ ++If several values are produced, @b{*} contains the first value only; ++@b{*} contains @b{nil} if zero values are produced. ++ ++The @i{values} of @b{*}, @b{**}, and @b{***} are updated immediately ++prior to printing the @i{return value} of a top-level @i{form} by the ++@i{Lisp read-eval-print loop}. If the @i{evaluation} of such a @i{form} ++is aborted prior to its normal return, the values of @b{*}, @b{**}, and @b{***} ++are not updated. ++ ++@subsubheading Examples:: ++@example ++(values 'a1 'a2) @result{} A1, A2 ++'b @result{} B ++(values 'c1 'c2 'c3) @result{} C1, C2, C3 ++(list * ** ***) @result{} (C1 B A1) ++ ++(defun cube-root (x) (expt x 1/3)) @result{} CUBE-ROOT ++(compile *) @result{} CUBE-ROOT ++(setq a (cube-root 27.0)) @result{} 3.0 ++(* * 9.0) @result{} 27.0 ++@end example ++ ++@subsubheading Affected By:: ++ ++@i{Lisp read-eval-print loop}. ++ ++@subsubheading See Also:: ++ ++@ref{-} ++ (@i{variable}), ++@b{+} (@i{variable}), ++@ref{/} ++ (@i{variable}), ++@ref{Top level loop} ++ ++@subsubheading Notes:: ++ ++@example ++ * @equiv{} (car /) ++ ** @equiv{} (car //) ++ *** @equiv{} (car ///) ++@end example ++ ++@node / (Variable), lisp-implementation-type, * (Variable), Environment Dictionary ++@subsection /, //, /// [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{proper list}. ++ ++@subsubheading Initial Value:: ++ ++@i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The @i{variables} @b{/}, @b{//}, and @b{///} are maintained by ++the @i{Lisp read-eval-print loop} to save the values of results that ++were printed at the end of the loop. ++ ++The @i{value} of @b{/} is a @i{list} of the most recent @i{values} that were printed, ++the @i{value} of @b{//} is the previous value of @b{/}, and ++the @i{value} of @b{///} is the previous value of @b{//}. ++ ++The @i{values} of @b{/}, @b{//}, and @b{///} are updated immediately ++prior to printing the @i{return value} of a top-level @i{form} by the ++@i{Lisp read-eval-print loop}. If the @i{evaluation} of such a @i{form} ++is aborted prior to its normal return, the values of @b{/}, @b{//}, and @b{///} ++are not updated. ++ ++@subsubheading Examples:: ++@example ++ (floor 22 7) @result{} 3, 1 ++ (+ (* (car /) 7) (cadr /)) @result{} 22 ++@end example ++ ++@subsubheading Affected By:: ++ ++@i{Lisp read-eval-print loop}. ++ ++@subsubheading See Also:: ++ ++@ref{-} ++ (@i{variable}), ++@b{+} (@i{variable}), ++@b{*} (@i{variable}), ++@ref{Top level loop} ++ ++@node lisp-implementation-type, short-site-name, / (Variable), Environment Dictionary ++@subsection lisp-implementation-type, ++@subheading lisp-implementation-version ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{lisp-implementation-type} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@code{lisp-implementation-version} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@subsubheading Arguments and Values:: ++ ++@i{description}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{lisp-implementation-type} and @b{lisp-implementation-version} ++identify the current implementation of @r{Common Lisp}. ++ ++@b{lisp-implementation-type} returns a @i{string} ++that identifies the generic name of ++the particular @r{Common Lisp} implementation. ++ ++@b{lisp-implementation-version} ++returns a @i{string} that identifies the version of ++the particular @r{Common Lisp} implementation. ++ ++If no appropriate ++and relevant result can be produced, @b{nil} is returned instead ++of a @i{string}. ++ ++@subsubheading Examples:: ++ ++@example ++ (lisp-implementation-type) ++@result{} "ACME Lisp" ++@i{OR}@result{} "Joe's Common Lisp" ++ (lisp-implementation-version) ++@result{} "1.3a" ++@result{} "V2" ++@i{OR}@result{} "Release 17.3, ECO #6" ++@end example ++ ++@node short-site-name, machine-instance, lisp-implementation-type, Environment Dictionary ++@subsection short-site-name, long-site-name [Function] ++ ++@code{short-site-name} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@code{long-site-name} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@subsubheading Arguments and Values:: ++ ++@i{description}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{short-site-name} and @b{long-site-name} return ++a @i{string} that identifies the physical location ++of the computer hardware, ++or @b{nil} if no appropriate @i{description} can be produced. ++ ++@subsubheading Examples:: ++ ++@example ++ (short-site-name) ++@result{} "MIT AI Lab" ++@i{OR}@result{} "CMU-CSD" ++ (long-site-name) ++@result{} "MIT Artificial Intelligence Laboratory" ++@i{OR}@result{} "CMU Computer Science Department" ++@end example ++ ++@subsubheading Affected By:: ++ ++The implementation, ++the location of the computer hardware, ++and the installation/configuration process. ++ ++@node machine-instance, machine-type, short-site-name, Environment Dictionary ++@subsection machine-instance [Function] ++ ++@code{machine-instance} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@subsubheading Arguments and Values:: ++ ++@i{description}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns a @i{string} that identifies the particular instance of ++the computer hardware on which @r{Common Lisp} is running, ++or @b{nil} if no such @i{string} can be computed. ++ ++@subsubheading Examples:: ++ ++@example ++ (machine-instance) ++@result{} "ACME.COM" ++@i{OR}@result{} "S/N 123231" ++@i{OR}@result{} "18.26.0.179" ++@i{OR}@result{} "AA-00-04-00-A7-A4" ++@end example ++ ++@subsubheading Affected By:: ++ ++The machine instance, ++and the @i{implementation}. ++ ++@subsubheading See Also:: ++ ++@ref{machine-type} ++, ++@ref{machine-version} ++ ++@node machine-type, machine-version, machine-instance, Environment Dictionary ++@subsection machine-type [Function] ++ ++@code{machine-type} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@subsubheading Arguments and Values:: ++ ++@i{description}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns a @i{string} that identifies the generic name of ++the computer hardware on which @r{Common Lisp} is running. ++ ++@subsubheading Examples:: ++ ++@example ++ (machine-type) ++@result{} "DEC PDP-10" ++@i{OR}@result{} "Symbolics LM-2" ++@end example ++ ++@subsubheading Affected By:: ++ ++The machine type. ++The implementation. ++ ++@subsubheading See Also:: ++ ++@ref{machine-version} ++ ++@node machine-version, software-type, machine-type, Environment Dictionary ++@subsection machine-version [Function] ++ ++@code{machine-version} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@subsubheading Arguments and Values:: ++ ++@i{description}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns a @i{string} that identifies the version of the computer hardware ++on which @r{Common Lisp} is running, or @b{nil} if no such value can be computed. ++ ++@subsubheading Examples:: ++ ++@example ++ (machine-version) @result{} "KL-10, microcode 9" ++@end example ++ ++@subsubheading Affected By:: ++ ++The machine version, ++and the @i{implementation}. ++ ++@subsubheading See Also:: ++ ++@ref{machine-type} ++, ++@ref{machine-instance} ++ ++@node software-type, user-homedir-pathname, machine-version, Environment Dictionary ++@subsection software-type, software-version [Function] ++ ++@code{software-type} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@code{software-version} @i{<@i{no @i{arguments}}>} @result{} @i{description} ++ ++@subsubheading Arguments and Values:: ++ ++@i{description}---a @i{string} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{software-type} returns a @i{string} that identifies the ++generic name of any relevant supporting software, or @b{nil} if no ++appropriate or relevant result can be produced. ++ ++@b{software-version} returns a @i{string} that identifies ++the version of any relevant supporting software, or @b{nil} if no ++appropriate or relevant result can be produced. ++ ++@subsubheading Examples:: ++ ++@example ++ (software-type) @result{} "Multics" ++ (software-version) @result{} "1.3x" ++@end example ++ ++@subsubheading Affected By:: ++ ++Operating system environment. ++ ++@subsubheading Notes:: ++ ++This information should be of use to maintainers of the @i{implementation}. ++ ++@node user-homedir-pathname, , software-type, Environment Dictionary ++@subsection user-homedir-pathname [Function] ++ ++@code{user-homedir-pathname} @i{@r{&optional} host} @result{} @i{pathname} ++ ++@subsubheading Arguments and Values:: ++ ++@i{host}---a @i{string}, a @i{list} of @i{strings}, or @t{:unspecific}. ++ ++@i{pathname}---a @i{pathname}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{user-homedir-pathname} determines the @i{pathname} that corresponds ++to the user's home directory on @i{host}. ++If @i{host} is not supplied, its value is @i{implementation-dependent}. ++ ++For a description of @t{:unspecific}, see @ref{Pathname Components}. ++ ++The definition of home directory is @i{implementation-dependent}, ++but defined in @r{Common Lisp} to mean the directory where the user ++keeps personal files such as initialization files and mail. ++ ++@b{user-homedir-pathname} returns a @i{pathname} without any name, ++type, or version component (those components are all @b{nil}) ++for the user's home directory on @i{host}. ++ ++If it is impossible to determine the user's home directory on @i{host}, ++then @b{nil} is returned. ++@b{user-homedir-pathname} never returns @b{nil} if @i{host} is not supplied. ++ ++@subsubheading Examples:: ++ ++@example ++ (pathnamep (user-homedir-pathname)) @result{} @i{true} ++@end example ++ ++@subsubheading Affected By:: ++ ++The host computer's file system, ++and the @i{implementation}. ++ ++@c end of including dict-environment ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-26.texi +@@ -0,0 +1,6038 @@ ++ ++ ++@node Glossary (Glossary), Appendix, Environment, Top ++@chapter Glossary ++ ++@menu ++* Glossary:: ++@end menu ++ ++@node Glossary, , Glossary (Glossary), Glossary (Glossary) ++@section Glossary ++ ++@c including concept-glossary ++ ++Each entry in this glossary has the following parts: ++ ++@table @asis ++ ++@item @t{*} ++the term being defined, set in boldface. ++ ++@item @t{*} ++optional pronunciation, enclosed in square brackets and ++set in boldface, as in the following example: ++pronounced 'a ,list . The pronunciation key follows ++@i{Webster's Third New International Dictionary ++ the English Language, Unabridged}, ++ except that ``e'' is used to notate the schwa (upside-down ``e'') character. ++ ++@item @t{*} ++the part or parts of speech, set in italics. If a term ++can be used as several parts of speech, there is a separate definition ++for each part of speech. ++ ++@item @t{*} ++one or more definitions, organized as follows: ++ ++@table @asis ++ ++@item -- ++an optional number, present if there are several ++definitions. Lowercase letters might also be used in cases where subdefinitions of ++a numbered definition are necessary. ++ ++@item -- ++an optional part of speech, set in italics, present if the ++term is one of several parts of speech. ++ ++@item -- ++an optional discipline, set in italics, present if the term ++has a standard definition being repeated. For example, ``Math.'' ++ ++@item -- ++an optional context, present if this definition is ++meaningful only in that context. For example, ``(of a @i{symbol})''. ++ ++@item -- ++the definition. ++ ++@item -- ++an optional example sentence. For example, ++ ``This is an example of an example.'' ++ ++@item -- ++optional cross references. ++ ++@end table ++ ++@end table ++ ++In addition, some terms have idiomatic usage in the Common Lisp ++community which is not shared by other communities, or which is not ++technically correct. Definitions labeled ``Idiom.'' represent ++such idiomatic usage; these definitions are sometimes followed by an ++explanatory note. ++ ++Words in @i{this font} are words with entries in the glossary. ++Words in example sentences do not follow this convention. ++ ++When an ambiguity arises, the longest matching substring has precedence. ++For example, ``@i{complex float}'' refers to a single glossary entry ++for ``@i{complex float}'' rather than the combined meaning of the ++glossary terms ``@i{complex}'' and ``@i{float}.'' ++ ++Subscript notation, as in ``@i{something}_n'' means that ++the @i{n}th definition of ``@i{something}'' is intended. This ++notation is used only in situations where the context might be insufficient ++to disambiguate. ++ ++The following are abbreviations used in the glossary: ++ ++ Abbreviation Meaning ++@table @asis ++@item @i{adj.} ++adjective ++@item @i{adv.} ++adverb ++@item @i{ANSI} ++compatible with one or more ANSI standards ++@item @i{Comp.} ++computers ++@item @i{Idiom.} ++idiomatic ++@item @i{IEEE} ++compatible with one or more IEEE standards ++@item @i{ISO} ++compatible with one or more ISO standards ++@item @i{Math.} ++mathematics ++@item @i{Trad.} ++traditional ++@item @i{n.} ++noun ++@item @i{v.} ++verb ++@item @i{v.t.} ++transitive verb ++@end table ++ ++@c @table @asis ++ ++@subheading @b{Non-alphabetic} ++@table @asis ++ ++@IGindex () ++@item @b{()} ++ pronounced 'nil , @i{n.} ++ an alternative notation for writing the symbol~@b{nil}, used to emphasize ++ the use of @i{nil} as an @i{empty list}. ++ ++@end table ++@subheading @b{A} ++@table @asis ++ ++@IGindex absolute ++@item @b{absolute} ++ @i{adj.} ++ 1. (of a @i{time}) ++ representing a specific point in time. ++ 2. (of a @i{pathname}) ++ representing a specific position in a directory hierarchy. ++ See @i{relative}. ++ ++@IGindex access ++@item @b{access} ++ @i{n.}, @i{v.t.} ++ 1. @i{v.t.} (a @i{place}, or @i{array}) ++ to @i{read}_1 or @i{write}_1 the @i{value} of ++ the @i{place} ++ or an @i{element} of the @i{array}. ++ 2. @i{n.} (of a @i{place}) ++ an attempt to @i{access}_1 the @i{value} of the @i{place}. ++ ++@IGindex accessibility ++@item @b{accessibility} ++ @i{n.} ++ the state of being @i{accessible}. ++ ++@IGindex accessible ++@item @b{accessible} ++ @i{adj.} ++ 1. (of an @i{object}) capable of being @i{referenced}. ++ 2. (of @i{shared slots} or @i{local slots} in an @i{instance} of ++ a @i{class}) having been defined by the @i{class} ++ of the @i{instance} or @i{inherited} from a ++ @i{superclass} of that @i{class}. ++ 3. (of a @i{symbol} in a @i{package}) ++ capable of being @i{referenced} without a @i{package prefix} ++ when that @i{package} is current, regardless of whether the ++ @i{symbol} is @i{present} in that @i{package} or is @i{inherited}. ++ ++@IGindex accessor ++@item @b{accessor} ++ @i{n.} ++ an @i{operator} that performs an @i{access}. ++ See @i{reader} and @i{writer}. ++ ++@IGindex active ++@item @b{active} ++ @i{adj.} ++ 1. (of a @i{handler}, a @i{restart}, or a @i{catch tag}) ++ having been @i{established} but not yet @i{disestablished}. ++ 2. (of an @i{element} of an @i{array}) ++ having an index that is greater than or equal to zero, ++ but less than the @i{fill pointer} (if any). ++ For an @i{array} that has no @i{fill pointer}, ++ all @i{elements} are considered @i{active}. ++ ++@IGindex actual adjustability ++@item @b{actual adjustability} ++ @i{n.} (of an @i{array}) ++ a @i{generalized boolean} that is associated with the @i{array}, ++ representing whether the @i{array} is @i{actually adjustable}. ++ See also @i{expressed adjustability} and @b{adjustable-array-p}. ++ ++@IGindex actual argument ++@item @b{actual argument} ++ @i{n.} @i{Trad.} ++ an @i{argument}. ++ ++@IGindex actual array element type ++@item @b{actual array element type} ++ @i{n.} (of an @i{array}) ++ the @i{type} for which the @i{array} is actually specialized, ++ which is the @i{upgraded array element type} of ++ the @i{expressed array element type} of the @i{array}. ++ See the @i{function} @b{array-element-type}. ++ ++@IGindex actual complex part type ++@item @b{actual complex part type} ++ @i{n.} (of a @i{complex}) ++ the @i{type} in which the real and imaginary parts of the @i{complex} ++ are actually represented, which is the @i{upgraded complex part type} of the ++ @i{expressed complex part type} of the @i{complex}. ++ ++@IGindex actual parameter ++@item @b{actual parameter} ++ @i{n.} @i{Trad.} ++ an @i{argument}. ++ ++@IGindex actually adjustable ++@item @b{actually adjustable} ++ @i{adj.} (of an @i{array}) ++ such that @b{adjust-array} can adjust its characteristics ++ by direct modification. ++ A @i{conforming program} may depend on ++ an @i{array} being @i{actually adjustable} ++ only if either that @i{array} is known to have been @i{expressly adjustable} ++ or if that @i{array} has been explicitly tested by @b{adjustable-array-p}. ++ ++@IGindex adjustability ++@item @b{adjustability} ++ @i{n.} (of an @i{array}) ++ 1. @i{expressed adjustability}. ++ 2. @i{actual adjustability}. ++ ++@IGindex adjustable ++@item @b{adjustable} ++ @i{adj.} (of an @i{array}) ++ 1. @i{expressly adjustable}. ++ 2. @i{actually adjustable}. ++ ++@IGindex after method ++@item @b{after method} ++ @i{n.} ++ a @i{method} having the @i{qualifier} @t{:after}. ++ ++@IGindex alist ++@item @b{alist} ++ pronounced '\=a ,list , @i{n.} ++ an @i{association list}. ++ ++@IGindex alphabetic ++@item @b{alphabetic} ++ @i{n.}, @i{adj.} ++ 1. @i{adj.} (of a @i{character}) ++ being one of the @i{standard characters} @t{A} through @t{Z} ++ or @t{a} through @t{z}, ++ or being any @i{implementation-defined} character that has @i{case}, ++ or being some other @i{graphic} @i{character} ++ defined by the @i{implementation} to be @i{alphabetic}_1. ++ 2. a. @i{n.} ++ one of several possible @i{constituent traits} of a @i{character}. ++ For details, see @ref{Constituent Characters} and @ref{Reader Algorithm}. ++ b. @i{adj.} (of a @i{character}) ++ being a @i{character} ++ that has @i{syntax type} @i{constituent} in the @i{current readtable} ++ and that has the @i{constituent trait} @i{alphabetic}_@{2a@}. ++ See @i{Figure~2--8}. ++ ++@IGindex alphanumeric ++@item @b{alphanumeric} ++ @i{adj.} (of a @i{character}) ++ being either an @i{alphabetic}_1 @i{character} ++ or a @i{numeric} @i{character}. ++ ++@IGindex ampersand ++@item @b{ampersand} ++ @i{n.} ++ the @i{standard character} that is called ``ampersand'' (@t{&}). ++ See @i{Figure~2--5}. ++ ++@IGindex anonymous ++@item @b{anonymous} ++ @i{adj.} ++ 1. (of a @i{class} or @i{function}) having no @i{name} ++ 2. (of a @i{restart}) having a @i{name} of @b{nil}. ++ ++@IGindex apparently uninterned ++@item @b{apparently uninterned} ++ @i{adj.} ++ having a @i{home package} of @b{nil}. (An @i{apparently uninterned} @i{symbol} ++ might or might not be an @i{uninterned} @i{symbol}. @i{Uninterned symbols} ++ have a @i{home package} of @b{nil}, but @i{symbols} which have been @i{uninterned} ++ from their @i{home package} also have a @i{home package} of @b{nil}, ++ even though they might still be @i{interned} in some other @i{package}.) ++ ++@IGindex applicable ++@item @b{applicable} ++ @i{adj.} ++ 1. (of a @i{handler}) being an @i{applicable handler}. ++ 2. (of a @i{method}) being an @i{applicable method}. ++ 3. (of a @i{restart}) being an @i{applicable restart}. ++ ++@IGindex applicable handler ++@item @b{applicable handler} ++ @i{n.} (for a @i{condition} being @i{signaled}) ++ an @i{active} @i{handler} for which the associated type contains the ++ @i{condition}. ++ ++@IGindex applicable method ++@item @b{applicable method} ++ @i{n.} (of a @i{generic function} ++ called with @i{arguments}) ++ a @i{method} of the @i{generic function} for which the ++ @i{arguments} satisfy the @i{parameter specializers} ++ of that @i{method}. ++ See @ref{Selecting the Applicable Methods}. ++ ++@IGindex applicable restart ++@item @b{applicable restart} ++ @i{n.} ++ 1. (for a @i{condition}) ++ an @i{active} @i{handler} for which the associated test returns ++ @i{true} when given the @i{condition} as an argument. ++ 2. (for no particular @i{condition}) ++ an @i{active} @i{handler} for which the associated test returns ++ @i{true} when given @b{nil} as an argument. ++ ++@IGindex apply ++@item @b{apply} ++ @i{v.t.} (a @i{function} to a @i{list}) ++ to @i{call} the @i{function} with arguments that are the @i{elements} ++ of the @i{list}. ++ ``Applying the function @b{+} to a list of integers returns ++ the sum of the elements of that list.'' ++ ++@IGindex argument ++@item @b{argument} ++ @i{n.} ++ 1. (of a @i{function}) an @i{object} which is offered as data ++ to the @i{function} when it is @i{called}. ++ ++ 2. (of a @i{format control}) a @i{format argument}. ++ ++@IGindex argument evaluation order ++@item @b{argument evaluation order} ++ @i{n.} ++ the order in which @i{arguments} are evaluated in a function call. ++ ``The argument evaluation order for Common Lisp is left to right.'' ++ See @ref{Evaluation}. ++ ++@IGindex argument precedence order ++@item @b{argument precedence order} ++ @i{n.} ++ the order in which the @i{arguments} to a @i{generic function} are ++ considered when sorting the @i{applicable methods} into precedence order. ++ ++@IGindex around method ++@item @b{around method} ++ @i{n.} ++ a @i{method} having the @i{qualifier} @t{:around}. ++ ++@IGindex array ++@item @b{array} ++ @i{n.} ++ an @i{object} of @i{type} @b{array}, which serves as a container for other ++ @i{objects} arranged in a Cartesian coordinate system. ++ ++@IGindex array element type ++@item @b{array element type} ++ @i{n.} (of an @i{array}) ++ 1. a @i{type} associated with the @i{array}, ++ and of which all @i{elements} of the @i{array} are ++ constrained to be members. ++ 2. the @i{actual array element type} of the @i{array}. ++ 3. the @i{expressed array element type} of the @i{array}. ++ ++@IGindex array total size ++@item @b{array total size} ++ @i{n.} ++ the total number of @i{elements} in an @i{array}, computed by taking ++ the product of the @i{dimensions} of the @i{array}. ++ (The size of a zero-dimensional @i{array} is therefore one.) ++ ++@IGindex assign ++@item @b{assign} ++ @i{v.t.} (a @i{variable}) ++ to change the @i{value} of the @i{variable} in a @i{binding} ++ that has already been @i{established}. ++ See the @i{special operator} @b{setq}. ++ ++@IGindex association list ++@item @b{association list} ++ @i{n.} ++ a @i{list} of @i{conses} representing an association ++ of @i{keys} with @i{values}, where the @i{car} of each ++ @i{cons} is the @i{key} and the @i{cdr} is the ++ @i{value} associated with that @i{key}. ++ ++@IGindex asterisk ++@item @b{asterisk} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``asterisk'' ++ or ``star'' (@t{*}). ++ See @i{Figure~2--5}. ++ ++@IGindex at-sign ++@item @b{at-sign} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``commercial at'' ++ or ``at sign'' (@t{@@}). ++ See @i{Figure~2--5}. ++ ++@IGindex atom ++@item @b{atom} ++ @i{n.} ++ any @i{object} that is not a @i{cons}. ++ ``A vector is an atom.'' ++ ++@IGindex atomic ++@item @b{atomic} ++ @i{adj.} ++ being an @i{atom}. ++ ``The number 3, the symbol @t{foo}, and @b{nil} are atomic.'' ++ ++@IGindex atomic type specifier ++@item @b{atomic type specifier} ++ @i{n.} ++ a @i{type specifier} that is @i{atomic}. ++ For every @i{atomic type specifier}, @i{x}, there is an equivalent ++ @i{compound type specifier} with no arguments supplied, @t{(@i{x})}. ++ ++@IGindex attribute ++@item @b{attribute} ++ @i{n.} (of a @i{character}) ++ a program-visible aspect of the @i{character}. ++ The only @i{standardized} @i{attribute} of a @i{character} ++ is its @i{code}_2, but @i{implementations} are permitted to have ++ additional @i{implementation-defined} @i{attributes}. ++ See @ref{Character Attributes}. ++ ``An implementation that support fonts ++ might make font information an attribute of a character, ++ while others might represent font information separately from characters.'' ++ ++@IGindex aux variable ++@item @b{aux variable} ++ @i{n.} ++ a @i{variable} that occurs in the part of a @i{lambda list} ++ that was introduced by @b{&aux}. Unlike all other @i{variables} ++ introduced by a @i{lambda-list}, @i{aux variables} are not ++ @i{parameters}. ++ ++@IGindex auxiliary method ++@item @b{auxiliary method} ++ @i{n.} ++ a member of one of two sets of @i{methods} ++ (the set of @i{primary methods} is the other) ++ that form an exhaustive partition of the set of @i{methods} ++ on the @i{method}'s @i{generic function}. ++ How these sets are determined is dependent on the @i{method combination} type; ++ see @ref{Introduction to Methods}. ++ ++@end table ++@subheading @b{B} ++@table @asis ++ ++@IGindex backquote ++@item @b{backquote} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``grave accent'' ++ or ``backquote'' (@t{`}). ++ See @i{Figure~2--5}. ++ ++@IGindex backslash ++@item @b{backslash} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``reverse solidus'' ++ or ``backslash'' (@t{\}). ++ See @i{Figure~2--5}. ++ ++@IGindex base character ++@item @b{base character} ++ @i{n.} ++ a @i{character} ++ ++ of @i{type} @b{base-char}. ++ ++@IGindex base string ++@item @b{base string} ++ @i{n.} ++ a @i{string} of @i{type} @b{base-string}. ++ ++@IGindex before method ++@item @b{before method} ++ @i{n.} ++ a @i{method} having the @i{qualifier} @t{:before}. ++ ++@IGindex bidirectional ++@item @b{bidirectional} ++ @i{adj.} (of a @i{stream}) ++ being both an @i{input} @i{stream} and an @i{output} @i{stream}. ++ ++@IGindex binary ++@item @b{binary} ++ @i{adj.} ++ 1. (of a @i{stream}) ++ being a @i{stream} that has an @i{element type} that is a @i{subtype} of @i{type} @b{integer}. ++ The most fundamental operation on a @i{binary} @i{input} @i{stream} ++ is @b{read-byte} and on a @i{binary} @i{output} @i{stream} ++ is @b{write-byte}. ++ See @i{character}. ++ 2. (of a @i{file}) ++ having been created by opening a @i{binary} @i{stream}. ++ (It is @i{implementation-dependent} whether this is an detectable aspect ++ of the @i{file}, or whether any given @i{character} @i{file} can be ++ treated as a @i{binary} @i{file}.) ++ ++@IGindex bind ++@item @b{bind} ++ @i{v.t.} (a @i{variable}) ++ to establish a @i{binding} for the @i{variable}. ++ ++@IGindex binding ++@item @b{binding} ++ @i{n.} ++ an association between a @i{name} and that which the @i{name} ++ denotes. ++ ``A lexical binding is a lexical association between a ++ name and its value.'' ++ ++@IGindex bit ++@item @b{bit} ++ @i{n.} ++ an @i{object} of @i{type} @b{bit}; ++ that is, the @i{integer} @t{0} or the @i{integer} @t{1}. ++ ++@IGindex bit array ++@item @b{bit array} ++ @i{n.} ++ a specialized @i{array} that is of @i{type} @t{(array bit)}, ++ and whose elements are of @i{type} @b{bit}. ++ ++@IGindex bit vector ++@item @b{bit vector} ++ @i{n.} ++ a specialized @i{vector} that is of @i{type} @b{bit-vector}, ++ and whose elements are of @i{type} @b{bit}. ++ ++@IGindex bit-wise logical operation specifier ++@item @b{bit-wise logical operation specifier} ++ @i{n.} ++ an @i{object} which names one of the sixteen possible bit-wise logical ++ operations that can be performed by the @b{boole} function, ++ and which is the @i{value} of exactly one of the ++ @i{constant variables} ++ @b{boole-clr}, @b{boole-set}, ++ @b{boole-1}, @b{boole-2}, ++ @b{boole-c1}, @b{boole-c2}, ++ @b{boole-and}, @b{boole-ior}, ++ @b{boole-xor}, @b{boole-eqv}, ++ @b{boole-nand}, @b{boole-nor}, ++ @b{boole-andc1}, @b{boole-andc2}, ++ @b{boole-orc1}, or @b{boole-orc2}. ++ ++@IGindex block ++@item @b{block} ++ @i{n.} ++ a named lexical @i{exit point}, ++ @i{established} explicitly by @b{block} ++ or implicitly by @i{operators} ++ such as @b{loop}, @b{do} and @b{prog}, ++ to which control and values may be transfered by ++ using a @b{return-from} @i{form} with the name of the @i{block}. ++ ++@IGindex block tag ++@item @b{block tag} ++ @i{n.} ++ the @i{symbol} that, within the @i{lexical scope} ++ of a @b{block} @i{form}, names the @i{block} ++ @i{established} by that @b{block} @i{form}. ++ See @b{return} or @b{return-from}. ++ ++@IGindex boa lambda list ++@item @b{boa lambda list} ++ @i{n.} ++ a @i{lambda list} that is syntactically like an @i{ordinary lambda list}, ++ but that is processed in ``@b{b}y @b{o}rder of @b{a}rgument'' style. ++ See @ref{Boa Lambda Lists}. ++ ++@IGindex body parameter ++@item @b{body parameter} ++ @i{n.} ++ a @i{parameter} available in certain @i{lambda lists} ++ which from the point of view of @i{conforming programs} ++ is like a @i{rest parameter} in every way except that it is introduced ++ by @b{&body} instead of @b{&rest}. (@i{Implementations} are ++ permitted to provide extensions which distinguish @i{body parameters} ++ and @i{rest parameters}---@i{e.g.}, the @i{forms} for @i{operators} ++ which were defined using a @i{body parameter} might be pretty printed ++ slightly differently than @i{forms} for @i{operators} which were ++ defined using @i{rest parameters}.) ++ ++@IGindex boolean ++@item @b{boolean} ++ @i{n.} ++ an @i{object} of @i{type} @b{boolean}; ++ that is, one of the following @i{objects}: ++ the symbol~@b{t} (representing @i{true}), ++ or the symbol~@b{nil} (representing @i{false}). ++ See @i{generalized boolean}. ++ ++@IGindex boolean equivalent ++@item @b{boolean equivalent} ++ @i{n.} (of an @i{object} O_1) ++ any @i{object} O_2 that has the same truth value as O_1 ++ when both O_1 and O_2 are viewed as @i{generalized booleans}. ++ ++@IGindex bound ++@item @b{bound} ++ @i{adj.}, @i{v.t.} ++ 1. @i{adj.} having an associated denotation in a @i{binding}. ++ ``The variables named by a @b{let} are bound within ++ its body.'' ++ See @i{unbound}. ++ 2. @i{adj.} having a local @i{binding} which ++ @i{shadows}_2 another. ++ ``The variable @b{*print-escape*} is bound while in ++ the @b{princ} function.'' ++ 3. @i{v.t.} the past tense of @i{bind}. ++ ++@IGindex bound declaration ++@item @b{bound declaration} ++ @i{n.} ++ a @i{declaration} that refers to or is associated with a @i{variable} ++ or @i{function} and that appears within the @i{special form} ++ that @i{establishes} the @i{variable} or @i{function}, ++ but before the body of that @i{special form} ++ (specifically, at the head of that @i{form}'s body). ++ (If a @i{bound declaration} refers to a @i{function} @i{binding} or ++ a @i{lexical variable} @i{binding}, the @i{scope} of ++ the @i{declaration} is exactly the @i{scope} of that ++ @i{binding}. If the @i{declaration} refers to a ++ @i{dynamic variable} @i{binding}, the @i{scope} of ++ the @i{declaration} is what the @i{scope} of the ++ @i{binding} would have been if it were lexical rather than dynamic.) ++ ++@IGindex bounded ++@item @b{bounded} ++ @i{adj.} (of a @i{sequence} S, ++ by an ordered pair ++ of @i{bounding indices} i_@{start@} and i_@{end@}) ++ restricted to a subrange of the @i{elements} of S that includes each @i{element} ++ beginning with (and including) the one indexed by i_@{start@} and ++ continuing up to (but not including) the one indexed by i_@{end@}. ++ ++@IGindex bounding index ++@item @b{bounding index} ++ @i{n.} (of a @i{sequence} with @i{length} n) ++ either of a conceptual pair of @i{integers}, i_@{start@} and i_@{end@}, ++ respectively called the ``lower bounding index'' and ``upper bounding index'', ++ such that 0 <= i_@{start@} <= i_@{end@} <= n, and which therefore delimit ++ a subrange of the @i{sequence} @i{bounded} by i_@{start@} and i_@{end@}. ++ ++@IGindex bounding index designator ++@item @b{bounding index designator} ++ (for a @i{sequence}) ++ one of two @i{objects} that, taken together as an ordered pair, ++ behave as a @i{designator} for @i{bounding indices} of the @i{sequence}; ++ that is, they denote @i{bounding indices} of the @i{sequence}, ++ and are either: ++ an @i{integer} (denoting itself) and @b{nil} ++ (denoting the @i{length} of the @i{sequence}), ++ or two @i{integers} (each denoting themselves). ++ ++@IGindex break loop ++@item @b{break loop} ++ @i{n.} ++ A variant of the normal @i{Lisp read-eval-print loop} that is recursively ++ entered, usually because the ongoing @i{evaluation} of some other @i{form} ++ has been suspended for the purpose of debugging. Often, a @i{break loop} ++ provides the ability to exit in such a way as to continue the suspended computation. ++ See the @i{function} @b{break}. ++ ++@IGindex broadcast stream ++@item @b{broadcast stream} ++ @i{n.} ++ an @i{output} @i{stream} of @i{type} @b{broadcast-stream}. ++ ++@IGindex built-in class ++@item @b{built-in class} ++ @i{n.} ++ a @i{class} that is a @i{generalized instance} of @i{class} @b{built-in-class}. ++ ++@IGindex built-in type ++@item @b{built-in type} ++ @i{n.} ++ one of the @i{types} in @i{Figure~4--2}. ++ ++@IGindex byte ++@item @b{byte} ++ @i{n.} ++ 1. adjacent bits within an @i{integer}. ++ (The specific number of bits can vary from point to point in the program; ++ see the @i{function} @b{byte}.) ++ 2. an integer in a specified range. ++ (The specific range can vary from point to point in the program; ++ see the @i{functions} @b{open} and @b{write-byte}.) ++ ++@IGindex byte specifier ++@item @b{byte specifier} ++ @i{n.} ++ An @i{object} of @i{implementation-dependent} nature ++ that is returned by the @i{function} @b{byte} and ++ that specifies the range of bits in an @i{integer} to be used ++ as a @i{byte} by @i{functions} such as @b{ldb}. ++ ++@end table ++@subheading @b{C} ++@table @asis ++ ++@IGindex cadr ++@item @b{cadr} ++ pronounced 'ka ,de r , @i{n.} (of an @i{object}) ++ the @i{car} of the @i{cdr} of that @i{object}. ++ ++@IGindex call ++@item @b{call} ++ @i{v.t.}, @i{n.} ++ 1. @i{v.t.} (a @i{function} with @i{arguments}) ++ to cause the @i{code} represented by that @i{function} to be ++ @i{executed} in an @i{environment} where @i{bindings} for ++ the @i{values} of its @i{parameters} have been @i{established} ++ based on the @i{arguments}. ++ ``Calling the function @b{+} with the arguments ++ @t{5} and @t{1} yields a value of @t{6}.'' ++ 2. @i{n.} a @i{situation} in which a @i{function} is called. ++ ++@IGindex captured initialization form ++@item @b{captured initialization form} ++ @i{n.} ++ an @i{initialization form} along with the @i{lexical environment} ++ in which the @i{form} that defined the @i{initialization form} ++ was @i{evaluated}. ++ ``Each newly added shared slot is set to the result of evaluating ++ the captured initialization form for the slot that was specified ++ in the @b{defclass} form for the new class.'' ++ ++@IGindex car ++@item @b{car} ++ @i{n.} ++ 1. a. (of a @i{cons}) ++ the component of a @i{cons} corresponding to the first ++ @i{argument} to @b{cons}; the other component is the ++ @i{cdr}. ++ ``The function @b{rplaca} modifies the car of a cons.'' ++ b. (of a @i{list}) ++ the first @i{element} of the @i{list}, or @b{nil} if the ++ @i{list} is the @i{empty list}. ++ 2. the @i{object} that is held in the @i{car}_1. ++ ``The function @b{car} returns the car of a cons.'' ++ ++@IGindex case ++@item @b{case} ++ @i{n.} (of a @i{character}) ++ the property of being either @i{uppercase} or @i{lowercase}. ++ Not all @i{characters} have @i{case}. ++ ``The characters @t{#\A} and @t{#\a} have case, ++ but the character @t{#\$} has no case.'' ++ See @ref{Characters With Case} and the @i{function} @b{both-case-p}. ++ ++@IGindex case sensitivity mode ++@item @b{case sensitivity mode} ++ @i{n.} ++ one of the @i{symbols} ++ @t{:upcase}, @t{:downcase}, @t{:preserve}, or @t{:invert}. ++ ++@IGindex catch ++@item @b{catch} ++ @i{n.} ++ an @i{exit point} which is @i{established} by a @b{catch} ++ @i{form} within the @i{dynamic scope} of its body, ++ which is named by a @i{catch tag}, ++ and to which control and @i{values} may be @i{thrown}. ++ ++@IGindex catch tag ++@item @b{catch tag} ++ @i{n.} ++ an @i{object} which names an @i{active} @i{catch}. ++ (If more than one @i{catch} is active with the same @i{catch tag}, ++ it is only possible to @i{throw} to the innermost such @i{catch} ++ because the outer one is @i{shadowed}_2.) ++ ++@IGindex cddr ++@item @b{cddr} ++ pronounced 'kud e ,de r or ++ pronounced 'ke ,dude r , @i{n.} ++ (of an @i{object}) ++ the @i{cdr} of the @i{cdr} of that @i{object}. ++ ++@IGindex cdr ++@item @b{cdr} ++ pronounced 'ku ,de r , @i{n.} ++ 1. a. (of a @i{cons}) ++ the component of a @i{cons} corresponding to the second @i{argument} ++ to @b{cons}; the other component is the @i{car}. ++ ``The function @b{rplacd} modifies the cdr of a cons.'' ++ b. (of a @i{list} L_1) ++ either the @i{list} L_2 that contains ++ the @i{elements} of L_1 that follow after the first, ++ or else @b{nil} if L_1 is the @i{empty list}. ++ 2. the @i{object} that is held in the @i{cdr}_1. ++ ``The function @b{cdr} returns the cdr of a cons.'' ++ ++@IGindex cell ++@item @b{cell} ++ @i{n.} @i{Trad.} (of an @i{object}) ++ a conceptual @i{slot} of that @i{object}. ++ The @i{dynamic variable} and global @i{function} @i{bindings} ++ of a @i{symbol} are sometimes referred to as its @i{value cell} ++ and @i{function cell}, respectively. ++ ++@IGindex character ++@item @b{character} ++ @i{n.}, @i{adj.} ++ 1. @i{n.} an @i{object} of @i{type} @b{character}; that is, ++ an @i{object} that represents a unitary token in an aggregate quantity of text; ++ see @ref{Character Concepts}. ++ 2. @i{adj.} ++ a. (of a @i{stream}) ++ having an @i{element type} that is a @i{subtype} of @i{type} @b{character}. ++ The most fundamental operation on a @i{character} @i{input} @i{stream} ++ is @b{read-char} and on a @i{character} @i{output} @i{stream} ++ is @b{write-char}. See @i{binary}. ++ b. (of a @i{file}) ++ having been created by opening a @i{character} @i{stream}. ++ (It is @i{implementation-dependent} whether this is an inspectable aspect ++ of the @i{file}, or whether any given @i{binary} @i{file} can be ++ treated as a @i{character} @i{file}.) ++ ++@IGindex character code ++@item @b{character code} ++ @i{n.} ++ 1. one of possibly several @i{attributes} of a @i{character}. ++ 2. a non-negative @i{integer} less than the @i{value} of @b{char-code-limit} ++ that is suitable for use as a @i{character code}_1. ++ ++@IGindex character designator ++@item @b{character designator} ++ @i{n.} ++ a @i{designator} for a @i{character}; that is, ++ an @i{object} that denotes a @i{character} ++ and that is one of: ++ a @i{designator} for a @i{string} of @i{length} one ++ (denoting the @i{character} that is its only @i{element}), ++ ++ or a @i{character} (denoting itself). ++ ++@IGindex circular ++@item @b{circular} ++ @i{adj.} ++ 1. (of a @i{list}) a @i{circular list}. ++ 2. (of an arbitrary @i{object}) ++ having a @i{component}, @i{element}, @i{constituent}_2, ++ or @i{subexpression} (as appropriate to the context) ++ that is the @i{object} itself. ++ ++@IGindex circular list ++@item @b{circular list} ++ @i{n.} ++ a chain of @i{conses} that has no termination because some ++ @i{cons} in the chain is the @i{cdr} of a later @i{cons}. ++ ++@IGindex class ++@item @b{class} ++ @i{n.} ++ 1. an @i{object} that uniquely determines the structure and behavior of ++ a set of other @i{objects} called its @i{direct instances}, ++ that contributes structure and behavior to a set of ++ other @i{objects} called its @i{indirect instances}, ++ and that acts as a @i{type specifier} for a set of objects ++ called its @i{generalized instances}. ++ ``The class @b{integer} is a subclass of the class @b{number}.'' ++ (Note that the phrase ``the @i{class} @t{foo}'' is often substituted for ++ the more precise phrase ``the @i{class} named @t{foo}''---in both ++ cases, a @i{class} @i{object} (not a @i{symbol}) is denoted.) ++ 2. (of an @i{object}) ++ the uniquely determined @i{class} of which the @i{object} is ++ a @i{direct instance}. ++ See the @i{function} @b{class-of}. ++ ``The class of the object returned by @b{gensym} ++ is @b{symbol}.'' ++ (Note that with this usage a phrase such as ``its @i{class} is @t{foo}'' ++ is often substituted for the more precise phrase ++ ``its @i{class} is the @i{class} named @t{foo}''---in both ++ cases, a @i{class} @i{object} (not a @i{symbol}) is denoted.) ++ ++@IGindex class designator ++@item @b{class designator} ++ @i{n.} ++ a @i{designator} for a @i{class}; that is, ++ an @i{object} that denotes a @i{class} ++ and that is one of: ++ a @i{symbol} (denoting the @i{class} named by that @i{symbol}; ++ see the @i{function} @b{find-class}) ++ or a @i{class} (denoting itself). ++ ++@IGindex class precedence list ++@item @b{class precedence list} ++ @i{n.} ++ a unique total ordering on a @i{class} ++ and its @i{superclasses} that is consistent with the ++ @i{local precedence orders} for the @i{class} and its ++ @i{superclasses}. ++ For detailed information, see @ref{Determining the Class Precedence List}. ++ ++@IGindex close ++@item @b{close} ++ @i{v.t.} (a @i{stream}) ++ to terminate usage of the @i{stream} as a source or sink of data, ++ permitting the @i{implementation} to reclaim its internal data structures, ++ and to free any external resources which might have been locked by the ++ @i{stream} when it was opened. ++ ++@IGindex closed ++@item @b{closed} ++ @i{adj.} (of a @i{stream}) ++ having been @i{closed} (see @i{close}). ++ Some (but not all) operations that are valid on @i{open} @i{streams} ++ are not valid on @i{closed} @i{streams}. ++ See @ref{File Operations on Open and Closed Streams}. ++ ++@IGindex closure ++@item @b{closure} ++ @i{n.} ++ a @i{lexical closure}. ++ ++@IGindex coalesce ++@item @b{coalesce} ++ @i{v.t.} (@i{literal objects} that are @i{similar}) ++ to consolidate the identity of those @i{objects}, ++ such that they become the @i{same} ++ @i{object}. ++ See @ref{Compiler Terminology}. ++ ++@IGindex code ++@item @b{code} ++ @i{n.} ++ 1. @i{Trad.} ++ any representation of actions to be performed, whether conceptual ++ or as an actual @i{object}, such as ++ @i{forms}, ++ @i{lambda expressions}, ++ @i{objects} of @i{type} @i{function}, ++ text in a @i{source file}, ++ or instruction sequences in a @i{compiled file}. ++ This is a generic term; ++ the specific nature of the representation depends on its context. ++ 2. (of a @i{character}) ++ a @i{character code}. ++ ++@IGindex coerce ++@item @b{coerce} ++ @i{v.t.} (an @i{object} to a @i{type}) ++ to produce an @i{object} from the given @i{object}, ++ without modifying that @i{object}, ++ by following some set of coercion rules that must be specifically ++ stated for any context in which this term is used. ++ The resulting @i{object} is necessarily of the indicated @i{type}, ++ except when that type is a @i{subtype} of @i{type} @b{complex}; in that case, ++ if a @i{complex rational} with an imaginary part of zero would result, ++ the result is a @i{rational} ++ rather than a @i{complex}---see @ref{Rule of Canonical Representation for Complex Rationals}. ++ ++@IGindex colon ++@item @b{colon} ++ @i{n.} ++ the @i{standard character} that is called ``colon'' (@t{:}). ++ See @i{Figure~2--5}. ++ ++@IGindex comma ++@item @b{comma} ++ @i{n.} ++ the @i{standard character} that is called ``comma'' (@t{,}). ++ See @i{Figure~2--5}. ++ ++@IGindex compilation ++@item @b{compilation} ++ @i{n.} ++ the process of @i{compiling} @i{code} by the @i{compiler}. ++ ++@IGindex compilation environment ++@item @b{compilation environment} ++ @i{n.} ++ 1. An @i{environment} that represents information known by the ++ @i{compiler} about a @i{form} that is being @i{compiled}. ++ See @ref{Compiler Terminology}. ++ 2. An @i{object} that represents the ++ @i{compilation environment}_1 ++ and that is used as a second argument to a @i{macro function} ++ (which supplies a @i{value} for any @b{&environment} @i{parameter} ++ in the @i{macro function}'s definition). ++ ++@IGindex compilation unit ++@item @b{compilation unit} ++ @i{n.} ++ an interval during which a single unit of compilation is occurring. ++ See the @i{macro} @b{with-compilation-unit}. ++ ++@IGindex compile ++@item @b{compile} ++ @i{v.t.} ++ 1. (@i{code}) ++ to perform semantic preprocessing of the @i{code}, usually optimizing ++ one or more qualities of the code, such as run-time speed of @i{execution} ++ or run-time storage usage. The minimum semantic requirements of compilation are ++ that it must remove all macro calls and arrange for all @i{load time values} ++ to be resolved prior to run time. ++ 2. (a @i{function}) ++ to produce a new @i{object} of @i{type} @b{compiled-function} ++ which represents the result of @i{compiling} the @i{code} ++ represented by the @i{function}. See the @i{function} @b{compile}. ++ 3. (a @i{source file}) ++ to produce a @i{compiled file} from a @i{source file}. ++ See the @i{function} @b{compile-file}. ++ ++@IGindex compile time ++@item @b{compile time} ++ @i{n.} ++ the duration of time that the @i{compiler} is processing @i{source code}. ++ ++@IGindex compile-time definition ++@item @b{compile-time definition} ++ @i{n.} ++ a definition in the @i{compilation environment}. ++ ++@IGindex compiled code ++@item @b{compiled code} ++ @i{n.} ++ 1. @i{compiled functions}. ++ 2. @i{code} that represents @i{compiled functions}, ++ such as the contents of a @i{compiled file}. ++ ++@IGindex compiled file ++@item @b{compiled file} ++ @i{n.} ++ a @i{file} which represents the results of @i{compiling} the ++ @i{forms} which appeared in a corresponding @i{source file}, ++ and which can be @i{loaded}. See the @i{function} @b{compile-file}. ++ ++@IGindex compiled function ++@item @b{compiled function} ++ @i{n.} ++ an @i{object} of @i{type} @b{compiled-function}, which is a @i{function} ++ that has been @i{compiled}, which contains no references to @i{macros} that ++ must be expanded at run time, and which contains no unresolved references ++ to @i{load time values}. ++ ++@IGindex compiler ++@item @b{compiler} ++ @i{n.} ++ a facility that is part of Lisp and that translates @i{code} ++ into an @i{implementation-dependent} form ++ that might be represented or @i{executed} efficiently. ++ The functions @b{compile} and @b{compile-file} ++ permit programs to invoke the @i{compiler}. ++ ++@IGindex compiler macro ++@item @b{compiler macro} ++ @i{n.} ++ an auxiliary macro definition for a globally defined @i{function} ++ or @i{macro} which might or might not be called by any given ++ @i{conforming implementation} and which must preserve the semantics ++ of the globally defined @i{function} or @i{macro} but which might ++ perform some additional optimizations. (Unlike a @i{macro}, ++ a @i{compiler macro} does not extend the syntax of @r{Common Lisp}; rather, it ++ provides an alternate implementation strategy for some existing syntax ++ or functionality.) ++ ++@IGindex compiler macro expansion ++@item @b{compiler macro expansion} ++ @i{n.} ++ 1. the process of translating a @i{form} into another @i{form} ++ by a @i{compiler macro}. ++ 2. the @i{form} resulting from this process. ++ ++@IGindex compiler macro form ++@item @b{compiler macro form} ++ @i{n.} ++ a @i{function form} or @i{macro form} whose @i{operator} ++ has a definition as a @i{compiler macro}, ++ or a @b{funcall} @i{form} whose first @i{argument} is a ++ @b{function} @i{form} whose @i{argument} is the @i{name} ++ of a @i{function} that has a definition as a @i{compiler macro}. ++ ++@IGindex compiler macro function ++@item @b{compiler macro function} ++ @i{n.} ++ a @i{function} of two arguments, a @i{form} and an ++ @i{environment}, that implements @i{compiler macro expansion} by ++ producing either a @i{form} to be used in place of the original ++ argument @i{form} or else @b{nil}, indicating that the original @i{form} ++ should not be replaced. See @ref{Compiler Macros}. ++ ++@IGindex complex ++@item @b{complex} ++ @i{n.} ++ an @i{object} of @i{type} @b{complex}. ++ ++@IGindex complex float ++@item @b{complex float} ++ @i{n.} ++ an @i{object} of @i{type} @b{complex} which has a @i{complex part type} ++ that is a @i{subtype} of @b{float}. ++ A @i{complex float} is a @i{complex}, ++ but it is not a @i{float}. ++ ++@IGindex complex part type ++@item @b{complex part type} ++ @i{n.} (of a @i{complex}) ++ 1. the @i{type} which is used to represent both the real part ++ and the imaginary part of the @i{complex}. ++ 2. the @i{actual complex part type} of the @i{complex}. ++ 3. the @i{expressed complex part type} of the @i{complex}. ++ ++@IGindex complex rational ++@item @b{complex rational} ++ @i{n.} ++ an @i{object} of @i{type} @b{complex} which has a @i{complex part type} ++ that is a @i{subtype} of @b{rational}. ++ A @i{complex rational} is a @i{complex}, but it is not a @i{rational}. ++ No @i{complex rational} has an imaginary part of zero because such a ++ number is always represented by @r{Common Lisp} as an @i{object} of @i{type} @b{rational}; ++ see @ref{Rule of Canonical Representation for Complex Rationals}. ++ ++@IGindex complex single float ++@item @b{complex single float} ++ @i{n.} ++ an @i{object} of @i{type} @b{complex} which has a @i{complex part type} ++ that is a @i{subtype} of @b{single-float}. ++ A @i{complex single float} is a @i{complex}, ++ but it is not a @i{single float}. ++ ++@IGindex composite stream ++@item @b{composite stream} ++ @i{n.} ++ a @i{stream} that is composed of one or more other @i{streams}. ++ ``@b{make-synonym-stream} creates a composite stream.'' ++ ++@IGindex compound form ++@item @b{compound form} ++ @i{n.} ++ a @i{non-empty} @i{list} which is a @i{form}: ++ a @i{special form}, ++ a @i{lambda form}, ++ a @i{macro form}, ++ or a @i{function form}. ++ ++@IGindex compound type specifier ++@item @b{compound type specifier} ++ @i{n.} ++ a @i{type specifier} that is a @i{cons}; ++ @i{i.e.}, a @i{type specifier} that is not an @i{atomic type specifier}. ++ ``@t{(vector single-float)} is a compound type specifier.'' ++ ++@IGindex concatenated stream ++@item @b{concatenated stream} ++ @i{n.} ++ an @i{input} @i{stream} of @i{type} @b{concatenated-stream}. ++ ++@IGindex condition ++@item @b{condition} ++ @i{n.} ++ 1. an @i{object} which represents a @i{situation}---usually, ++ but not necessarily, during @i{signaling}. ++ 2. an @i{object} of @i{type} @b{condition}. ++ ++@IGindex condition designator ++@item @b{condition designator} ++ @i{n.} ++ one or more @i{objects} that, taken together, ++ denote either an existing @i{condition} @i{object} ++ or a @i{condition} @i{object} to be implicitly created. ++ For details, see @ref{Condition Designators}. ++ ++@IGindex condition handler ++@item @b{condition handler} ++ @i{n.} ++ a @i{function} that might be invoked by the act of @i{signaling}, ++ that receives the @i{condition} being signaled as its only argument, ++ and that is permitted to @i{handle} the @i{condition} ++ or to @i{decline}. See @ref{Signaling}. ++ ++@IGindex condition reporter ++@item @b{condition reporter} ++ @i{n.} ++ a @i{function} that describes how a @i{condition} is to be printed ++ when the @i{Lisp printer} is invoked while @b{*print-escape*} ++ is @i{false}. See @ref{Printing Conditions}. ++ ++@IGindex conditional newline ++@item @b{conditional newline} ++ @i{n.} ++ a point in output where a @i{newline} might be inserted at the ++ discretion of the @i{pretty printer}. ++ There are four kinds of @i{conditional newlines}, ++ called ``linear-style,'' ++ ``fill-style,'' ++ ``miser-style,'' ++ and ``mandatory-style.'' ++ See the @i{function} @b{pprint-newline} and @ref{Dynamic Control of the Arrangement of Output}. ++ ++@IGindex conformance ++@item @b{conformance} ++ @i{n.} ++ a state achieved by proper and complete adherence to the requirements ++ of this specification. See @ref{Conformance}. ++ ++@IGindex conforming code ++@item @b{conforming code} ++ @i{n.} ++ @i{code} that is all of part of a @i{conforming program}. ++ ++@IGindex conforming implementation ++@item @b{conforming implementation} ++ @i{n.} ++ an @i{implementation}, used to emphasize complete and correct ++ adherance to all conformance criteria. ++ A @i{conforming implementation} is capable of ++ accepting a @i{conforming program} as input, ++ preparing that @i{program} for @i{execution}, ++ and executing the prepared @i{program} in accordance with this specification. ++ An @i{implementation} which ++ has been extended may still be a @i{conforming implementation} ++ provided that no extension interferes with the correct function of any ++ @i{conforming program}. ++ ++@IGindex conforming processor ++@item @b{conforming processor} ++ @i{n.} @i{ANSI} ++ a @i{conforming implementation}. ++ ++@IGindex conforming program ++@item @b{conforming program} ++ @i{n.} ++ a @i{program}, used to emphasize the fact that the @i{program} ++ depends for its correctness only upon documented aspects of @r{Common Lisp}, and ++ can therefore be expected to run correctly in any @i{conforming implementation}. ++ ++@IGindex congruent ++@item @b{congruent} ++ @i{n.} ++ conforming to the rules of @i{lambda list} congruency, as detailed in ++ @ref{Congruent Lambda-lists for all Methods of a Generic Function}. ++ ++@IGindex cons ++@item @b{cons} ++ @i{n.}@i{v.} ++ 1. @i{n.} a compound data @i{object} having two components called the ++ @i{car} and the @i{cdr}. ++ 2. @i{v.} to create such an @i{object}. ++ 3. @i{v.} @i{Idiom.} to create any @i{object}, or to allocate storage. ++ ++@IGindex constant ++@item @b{constant} ++ @i{n.} ++ 1. a @i{constant form}. ++ 2. a @i{constant variable}. ++ 3. a @i{constant object}. ++ 4. a @i{self-evaluating object}. ++ ++@IGindex constant form ++@item @b{constant form} ++ @i{n.} ++ any @i{form} ++ for which @i{evaluation} always @i{yields} the same @i{value}, ++ that neither affects nor is affected by the @i{environment} ++ in which it is @i{evaluated} (except that it is permitted to ++ refer to the names of @i{constant variables} ++ defined in the @i{environment}), ++ and ++ that neither affects nor is affected by the state of any @i{object} ++ except those @i{objects} that are @i{otherwise inaccessible parts} ++ of @i{objects} created by the @i{form} itself. ++ ``A @b{car} form in which the argument is a ++ @b{quote} form is a constant form.'' ++ ++@IGindex constant object ++@item @b{constant object} ++ @i{n.} ++ an @i{object} that is constrained (@i{e.g.}, by its context in a @i{program} ++ or by the source from which it was obtained) to be @i{immutable}. ++ ``A literal object that has been processed by @b{compile-file} ++ is a constant object.'' ++ ++@IGindex constant variable ++@item @b{constant variable} ++ @i{n.} ++ a @i{variable}, the @i{value} of which can never change; ++ that is, a @i{keyword}_1 or a @i{named constant}. ++ ``The symbols @b{t}, @b{nil}, @t{:direction}, and ++ @b{most-positive-fixnum} are constant variables.'' ++ ++@IGindex constituent ++@item @b{constituent} ++ @i{n.}, @i{adj.} ++ 1. a. @i{n.} the @i{syntax type} of a @i{character} that is part of a @i{token}. ++ For details, see @ref{Constituent Characters}. ++ b. @i{adj.} (of a @i{character}) ++ having the @i{constituent}_@{1a@} @i{syntax type}_2. ++ c. @i{n.} a @i{constituent}_@{1b@} @i{character}. ++ 2. @i{n.} (of a @i{composite stream}) ++ one of possibly several @i{objects} that collectively comprise ++ the source or sink of that @i{stream}. ++ ++@IGindex constituent trait ++@item @b{constituent trait} ++ @i{n.} (of a @i{character}) ++ one of several classifications of a @i{constituent} @i{character} ++ in a @i{readtable}. See @ref{Constituent Characters}. ++ ++@IGindex constructed stream ++@item @b{constructed stream} ++ @i{n.} ++ a @i{stream} whose source or sink is a Lisp @i{object}. ++ Note that since a @i{stream} is another Lisp @i{object}, ++ @i{composite streams} are considered @i{constructed streams}. ++ ``A string stream is a constructed stream.'' ++ ++@IGindex contagion ++@item @b{contagion} ++ @i{n.} ++ a process whereby operations on @i{objects} of differing @i{types} ++ (@i{e.g.}, arithmetic on mixed @i{types} of @i{numbers}) produce a result ++ whose @i{type} is controlled by the dominance of one @i{argument}'s ++ @i{type} over the @i{types} of the other @i{arguments}. ++ See @ref{Contagion in Numeric Operations}. ++ ++@IGindex continuable ++@item @b{continuable} ++ @i{n.} (of an @i{error}) ++ an @i{error} that is @i{correctable} by the @t{continue} restart. ++ ++@IGindex control form ++@item @b{control form} ++ @i{n.} ++ 1. a @i{form} that establishes one or more places to which control ++ can be transferred. ++ 2. a @i{form} that transfers control. ++ ++@IGindex copy ++@item @b{copy} ++ @i{n.} ++ 1. (of a @i{cons} C) ++ a @i{fresh} @i{cons} with the @i{same} @i{car} and @i{cdr} as C. ++ 2. (of a @i{list} L) ++ a @i{fresh} @i{list} with the @i{same} @i{elements} as L. ++ (Only the @i{list structure} is @i{fresh}; ++ the @i{elements} are the @i{same}.) ++ See the @i{function} @b{copy-list}. ++ 3. (of an @i{association list} A with @i{elements} A_i) ++ a @i{fresh} @i{list} B with @i{elements} B_i, each of which is ++ @b{nil} if A_i is @b{nil}, or else a @i{copy} of the @i{cons} A_i. ++ See the @i{function} @b{copy-alist}. ++ 4. (of a @i{tree} T) ++ a @i{fresh} @i{tree} with the @i{same} @i{leaves} as T. ++ See the @i{function} @b{copy-tree}. ++ 5. (of a @i{random state} R) ++ a @i{fresh} @i{random state} that, if used as an argument to ++ to the @i{function} @b{random} would produce the same series of ``random'' ++ values as R would produce. ++ ++ 6. (of a @i{structure} S) ++ a @i{fresh} @i{structure} that has the same @i{type} as S, ++ and that has slot values, each of which is the @i{same} as the ++ corresponding slot value of S. ++ ++ (Note that since the difference between a @i{cons}, a @i{list}, ++ and a @i{tree} is a matter of ``view'' or ``intention,'' there can ++ be no general-purpose @i{function} which, based solely on the @i{type} ++ of an @i{object}, can determine which of these distinct meanings is ++ intended. The distinction rests solely on the basis of the text description ++ within this document. For example, phrases like ``a @i{copy} of the ++ given @i{list}'' or ``copy of the @i{list} @i{x}'' imply the ++ second definition.) ++ ++@IGindex correctable ++@item @b{correctable} ++ @i{adj.} (of an @i{error}) ++ 1. (by a @i{restart} other than @b{abort} ++ that has been associated with the @i{error}) ++ capable of being corrected by invoking that @i{restart}. ++ ``The function @b{cerror} signals an error ++ that is correctable by the @b{continue} @i{restart}.'' ++ ++ (Note that correctability is not a property of an ++ @i{error} @i{object}, but rather a property of the ++ @i{dynamic environment} that is in effect when the ++ @i{error} is @i{signaled}. ++ Specifically, the @i{restart} is ``associated with'' ++ the @i{error} @i{condition} @i{object}. ++ See @ref{Associating a Restart with a Condition}.) ++ ++ 2. (when no specific @i{restart} is mentioned) ++ @i{correctable}_1 by at least one @i{restart}. ++ ``@b{import} signals a correctable error of @i{type} @b{package-error} ++ if any of the imported symbols has the same name as ++ some distinct symbol already accessible in the package.'' ++ ++@IGindex current input base ++@item @b{current input base} ++ @i{n.} (in a @i{dynamic environment}) ++ the @i{radix} that is the @i{value} of @b{*read-base*} in that @i{environment}, ++ and that is the default @i{radix} employed by the @i{Lisp reader} ++ and its related @i{functions}. ++ ++@IGindex current logical block ++@item @b{current logical block} ++ @i{n.} ++ the context of the innermost lexically enclosing use of @b{pprint-logical-block}. ++ ++@IGindex current output base ++@item @b{current output base} ++ @i{n.} (in a @i{dynamic environment}) ++ the @i{radix} that is the @i{value} of @b{*print-base*} in that @i{environment}, ++ and that is the default @i{radix} employed by the @i{Lisp printer} ++ and its related @i{functions}. ++ ++@IGindex current package ++@item @b{current package} ++ @i{n.} (in a @i{dynamic environment}) ++ the @i{package} that is the @i{value} of @b{*package*} in that @i{environment}, ++ and that is the default @i{package} employed by the @i{Lisp reader} ++ and @i{Lisp printer}, and their related @i{functions}. ++ ++@IGindex current pprint dispatch table ++@item @b{current pprint dispatch table} ++ @i{n.} (in a @i{dynamic environment}) ++ the @i{pprint dispatch table} that is the @i{value} of @b{*print-pprint-dispatch*} ++ in that @i{environment}, and that is the default @i{pprint dispatch table} ++ employed by the @i{pretty printer}. ++ ++@IGindex current random state ++@item @b{current random state} ++ @i{n.} (in a @i{dynamic environment}) ++ the @i{random state} that is the @i{value} of @b{*random-state*} in that @i{environment}, ++ and that is the default @i{random state} employed by @b{random}. ++ ++@IGindex current readtable ++@item @b{current readtable} ++ @i{n.} (in a @i{dynamic environment}) ++ the @i{readtable} that is the @i{value} of @b{*readtable*} in that @i{environment}, ++ and that affects the way in which @i{expressions}_2 are parsed ++ into @i{objects} by the @i{Lisp reader}. ++ ++@end table ++@subheading @b{D} ++@table @asis ++ ++@IGindex data type ++@item @b{data type} ++ @i{n.} @i{Trad.} ++ a @i{type}. ++ ++@IGindex debug I/O ++@item @b{debug I/O} ++ @i{n.} ++ the @i{bidirectional} @i{stream} ++ that is the @i{value} of the @i{variable} @b{*debug-io*}. ++ ++@IGindex debugger ++@item @b{debugger} ++ @i{n.} ++ a facility that allows the @i{user} to handle a @i{condition} interactively. ++ For example, the @i{debugger} might permit interactive ++ selection of a @i{restart} from among the @i{active} @i{restarts}, ++ and it might perform additional @i{implementation-defined} services ++ for the purposes of debugging. ++ ++@IGindex declaration ++@item @b{declaration} ++ @i{n.} ++ a @i{global declaration} or @i{local declaration}. ++ ++@IGindex declaration identifier ++@item @b{declaration identifier} ++ @i{n.} ++ one of the @i{symbols} ++ @b{declaration}, ++ @b{dynamic-extent}, ++ @b{ftype}, ++ @b{function}, ++ @b{ignore}, ++ @b{inline}, ++ @b{notinline}, ++ @b{optimize}, ++ @b{special}, ++ or @b{type}; ++ or a @i{symbol} which is the @i{name} of a @i{type}; ++ or a @i{symbol} which has been @i{declared} ++ to be a @i{declaration identifier} by using a @b{declaration} ++ @i{declaration}. ++ ++@IGindex declaration specifier ++@item @b{declaration specifier} ++ @i{n.} ++ an @i{expression} that can appear at top level of a @b{declare} ++ expression or a @b{declaim} form, or as the argument to @b{proclaim}, ++ and which has a @i{car} which is a @i{declaration identifier}, ++ and which has a @i{cdr} that is data interpreted according to rules ++ specific to the @i{declaration identifier}. ++ ++@IGindex declare ++@item @b{declare} ++ @i{v.} ++ to @i{establish} a @i{declaration}. ++ See @b{declare}, @b{declaim}, or @b{proclaim}. ++ ++@IGindex decline ++@item @b{decline} ++ @i{v.} (of a @i{handler}) ++ to return normally without having @i{handled} the @i{condition} ++ being @i{signaled}, permitting the signaling process to continue ++ as if the @i{handler} had not been present. ++ ++@IGindex decoded time ++@item @b{decoded time} ++ @i{n.} ++ @i{absolute} @i{time}, represented as an ordered series of ++ nine @i{objects} which, taken together, form a description of ++ a point in calendar time, accurate to the nearest second (except ++ that @i{leap seconds} are ignored). ++ See @ref{Decoded Time}. ++ ++@IGindex default method ++@item @b{default method} ++ @i{n.} ++ a @i{method} having no @i{parameter specializers} other than ++ the @i{class} @b{t}. Such a @i{method} is always an @i{applicable method} ++ but might be @i{shadowed}_2 by a more specific @i{method}. ++ ++@IGindex defaulted initialization argument list ++@item @b{defaulted initialization argument list} ++ @i{n.} ++ a @i{list} of alternating initialization argument @i{names} and ++ @i{values} in which unsupplied initialization arguments are ++ defaulted, used in the protocol for initializing and reinitializing ++ @i{instances} of @i{classes}. ++ ++@IGindex define-method-combination arguments lambda list ++@item @b{define-method-combination arguments lambda list} ++ @i{n.} ++ a @i{lambda list} used by the @t{:arguments} option ++ to @b{define-method-combination}. ++ See @ref{Define-method-combination Arguments Lambda Lists}. ++ ++@IGindex define-modify-macro lambda list ++@item @b{define-modify-macro lambda list} ++ @i{n.} ++ a @i{lambda list} used by @b{define-modify-macro}. ++ See @ref{Define-modify-macro Lambda Lists}. ++ ++@IGindex defined name ++@item @b{defined name} ++ @i{n.} ++ a @i{symbol} the meaning of which is defined by @r{Common Lisp}. ++ ++@IGindex defining form ++@item @b{defining form} ++ @i{n.} ++ a @i{form} that has the side-effect of @i{establishing} a definition. ++ ``@b{defun} and @b{defparameter} are defining forms.'' ++ ++@IGindex defsetf lambda list ++@item @b{defsetf lambda list} ++ @i{n.} ++ a @i{lambda list} that is like an @i{ordinary lambda list} ++ except that it does not permit @b{&aux} ++ and that it permits use of @b{&environment}. ++ See @ref{Defsetf Lambda Lists}. ++ ++@IGindex deftype lambda list ++@item @b{deftype lambda list} ++ @i{n.} ++ a @i{lambda list} that is like a @i{macro lambda list} ++ except that the default @i{value} for unsupplied @i{optional parameters} ++ and @i{keyword parameters} is the @i{symbol} @b{*} (rather than @b{nil}). ++ See @ref{Deftype Lambda Lists}. ++ ++@IGindex denormalized ++@item @b{denormalized} ++ @i{adj.}, @i{ANSI}, @i{IEEE} (of a @i{float}) ++ conforming to the description of ``denormalized'' as described by ++ @i{IEEE Standard for Binary Floating-Point Arithmetic}. ++ For example, in an @i{implementation} where the minimum possible exponent ++ was @t{-7} but where @t{0.001} was a valid mantissa, the number @t{1.0e-10} ++ might be representable as @t{0.001e-7} internally even if the @i{normalized} ++ representation would call for it to be represented instead as @t{1.0e-10} ++ or @t{0.1e-9}. By their nature, @i{denormalized} @i{floats} generally ++ have less precision than @i{normalized} @i{floats}. ++ ++@IGindex derived type ++@item @b{derived type} ++ @i{n.} ++ a @i{type specifier} which is defined in terms of an expansion into another ++ @i{type specifier}. @b{deftype} defines @i{derived types}, ++ and there may be other @i{implementation-defined} @i{operators} ++ which do so as well. ++ ++@IGindex derived type specifier ++@item @b{derived type specifier} ++ @i{n.} ++ a @i{type specifier} for a @i{derived type}. ++ ++@IGindex designator ++@item @b{designator} ++ @i{n.} ++ an @i{object} that denotes another @i{object}. ++ In the dictionary entry for an @i{operator} ++ if a @i{parameter} is described as a @i{designator} for a @i{type}, ++ the description of the @i{operator} is written in a way ++ that assumes that appropriate coercion to that @i{type} has already occurred; ++ that is, that the @i{parameter} is already of the denoted @i{type}. ++ For more detailed information, see @ref{Designators}. ++ ++@IGindex destructive ++@item @b{destructive} ++ @i{adj.} (of an @i{operator}) ++ capable of modifying some program-visible aspect of one or more ++ @i{objects} that are either explicit @i{arguments} to the ++ @i{operator} or that can be obtained directly or indirectly ++ from the @i{global environment} by the @i{operator}. ++ ++@IGindex destructuring lambda list ++@item @b{destructuring lambda list} ++ @i{n.} ++ an @i{extended lambda list} used in @b{destructuring-bind} and ++ nested within @i{macro lambda lists}. ++ See @ref{Destructuring Lambda Lists}. ++ ++@IGindex different ++@item @b{different} ++ @i{adj.} ++ not the @i{same} ++ ``The strings @t{"FOO"} and @t{"foo"} are different under ++ @b{equal} but not under @b{equalp}.'' ++ ++@IGindex digit ++@item @b{digit} ++ @i{n.} (in a @i{radix}) ++ a @i{character} that is among the possible digits (@t{0} to @t{9}, ++ @t{A} to @t{Z}, and @t{a} to @t{z}) and that is defined to have an ++ associated numeric weight as a digit in that @i{radix}. ++ See @ref{Digits in a Radix}. ++ ++@IGindex dimension ++@item @b{dimension} ++ @i{n.} ++ 1. a non-negative @i{integer} indicating the number of ++ @i{objects} an @i{array} can hold along one axis. ++ If the @i{array} is a @i{vector} with a @i{fill pointer}, ++ the @i{fill pointer} is ignored. ++ ``The second dimension of that array is 7.'' ++ 2. an axis of an array. ++ ``This array has six dimensions.'' ++ ++@IGindex direct instance ++@item @b{direct instance} ++ @i{n.} (of a @i{class} C) ++ an @i{object} whose @i{class} is C itself, ++ rather than some @i{subclass} of C. ++ ``The function @b{make-instance} always returns a ++ direct instance of the class which is (or is named by) ++ its first argument.'' ++ ++@IGindex direct subclass ++@item @b{direct subclass} ++ @i{n.} (of a @i{class} C_1) ++ a @i{class} C_2, ++ such that C_1 is a @i{direct superclass} of C_2. ++ ++@IGindex direct superclass ++@item @b{direct superclass} ++ @i{n.} (of a @i{class} C_1) ++ a @i{class} C_2 which was explicitly designated as ++ a @i{superclass} of C_1 in the definition of C_1. ++ ++@IGindex disestablish ++@item @b{disestablish} ++ @i{v.t.} ++ to withdraw the @i{establishment} of ++ an @i{object}, ++ a @i{binding}, ++ an @i{exit point}, ++ a @i{tag}, ++ a @i{handler}, ++ a @i{restart}, ++ or an @i{environment}. ++ ++@IGindex disjoint ++@item @b{disjoint} ++ @i{n.} (of @i{types}) ++ having no @i{elements} in common. ++ ++@IGindex dispatching macro character ++@item @b{dispatching macro character} ++ @i{n.} ++ a @i{macro character} that has an associated table that specifies ++ the @i{function} to be called for each @i{character} that is ++ seen following the @i{dispatching macro character}. ++ See the @i{function} @b{make-dispatch-macro-character}. ++ ++@IGindex displaced array ++@item @b{displaced array} ++ @i{n.} ++ an @i{array} which has no storage of its own, but which is instead ++ indirected to the storage of another @i{array}, called its ++ @i{target}, at a specified offset, in such a way that any attempt ++ to @i{access} the @i{displaced array} implicitly references the ++ @i{target} @i{array}. ++ ++@IGindex distinct ++@item @b{distinct} ++ @i{adj.} ++ not @i{identical}. ++ ++@IGindex documentation string ++@item @b{documentation string} ++ @i{n.} (in a defining @i{form}) ++ A @i{literal} @i{string} which because of the context in which ++ it appears (rather than because of some intrinsically observable ++ aspect of the @i{string}) is taken as documentation. ++ In some cases, the @i{documentation string} is saved in such a ++ way that it can later be obtained by supplying either an @i{object}, ++ or by supplying a @i{name} and a ``kind'' to the @i{function} @b{documentation}. ++ ``The body of code in a @b{defmacro} form can be preceded ++ by a documentation string of kind @b{function}.'' ++ ++@IGindex dot ++@item @b{dot} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``full stop,'' ++ ``period,'' ++ or ``dot'' (@t{.}). ++ See @i{Figure~2--5}. ++ ++@IGindex dotted list ++@item @b{dotted list} ++ @i{n.} ++ a @i{list} which has a terminating @i{atom} that is not @b{nil}. ++ (An @i{atom} by itself is not a @i{dotted list}, however.) ++ ++@IGindex dotted pair ++@item @b{dotted pair} ++ @i{n.} ++ 1. a @i{cons} whose @i{cdr} is a @i{non-list}. ++ 2. any @i{cons}, used to emphasize the use of the @i{cons} ++ as a symmetric data pair. ++ ++@IGindex double float ++@item @b{double float} ++ @i{n.} ++ an @i{object} of @i{type} @b{double-float}. ++ ++@IGindex double-quote ++@item @b{double-quote} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``quotation mark'' ++ or ``double quote'' (@t{"}). ++ See @i{Figure~2--5}. ++ ++@IGindex dynamic binding ++@item @b{dynamic binding} ++ @i{n.} ++ a @i{binding} in a @i{dynamic environment}. ++ ++@IGindex dynamic environment ++@item @b{dynamic environment} ++ @i{n.} ++ that part of an @i{environment} that contains @i{bindings} ++ with @i{dynamic extent}. A @i{dynamic environment} contains, ++ among other things: ++ @i{exit points} established by @b{unwind-protect}, ++ and ++ @i{bindings} of ++ @i{dynamic variables}, ++ @i{exit points} established by @b{catch}, ++ @i{condition handlers}, ++ and ++ @i{restarts}. ++ ++@IGindex dynamic extent ++@item @b{dynamic extent} ++ @i{n.} ++ an @i{extent} whose duration is bounded by points of ++ @i{establishment} and @i{disestablishment} within the execution ++ of a particular @i{form}. See @i{indefinite extent}. ++ ``Dynamic variable bindings have dynamic extent.'' ++ ++@IGindex dynamic scope ++@item @b{dynamic scope} ++ @i{n.} ++ @i{indefinite scope} along with @i{dynamic extent}. ++ ++@IGindex dynamic variable ++@item @b{dynamic variable} ++ @i{n.} ++ a @i{variable} the @i{binding} for which is in the @i{dynamic environment}. ++ See @b{special}. ++ ++@end table ++@subheading @b{E} ++@table @asis ++ ++@IGindex echo stream ++@item @b{echo stream} ++ @i{n.} ++ a @i{stream} of @i{type} @b{echo-stream}. ++ ++@IGindex effective method ++@item @b{effective method} ++ @i{n.} ++ the combination of @i{applicable methods} that are executed ++ when a @i{generic function} is invoked with a particular sequence ++ of @i{arguments}. ++ ++@IGindex element ++@item @b{element} ++ @i{n.} ++ 1. (of a @i{list}) ++ an @i{object} that is the @i{car} of one of the @i{conses} ++ that comprise the @i{list}. ++ 2. (of an @i{array}) ++ an @i{object} that is stored in the @i{array}. ++ 3. (of a @i{sequence}) ++ an @i{object} that is an @i{element} of the @i{list} or @i{array} ++ that is the @i{sequence}. ++ 4. (of a @i{type}) ++ an @i{object} that is a member of the set of @i{objects} ++ designated by the @i{type}. ++ 5. (of an @i{input} @i{stream}) ++ a @i{character} or @i{number} (as appropriate to the ++ @i{element type} of the @i{stream}) ++ that is among the ordered series of @i{objects} that can be ++ read from the @i{stream} (using @b{read-char} or @b{read-byte}, ++ as appropriate to the @i{stream}). ++ 6. (of an @i{output} @i{stream}) ++ a @i{character} or @i{number} (as appropriate to the ++ @i{element type} of the @i{stream}) ++ that is among the ordered series of @i{objects} that has been ++ or will be written to the @i{stream} (using @b{write-char} ++ or @b{write-byte}, as appropriate to the @i{stream}). ++ 7. (of a @i{class}) a @i{generalized instance} of the @i{class}. ++ ++@IGindex element type ++@item @b{element type} ++ @i{n.} ++ 1. (of an @i{array}) the @i{array element type} of the @i{array}. ++ 2. (of a @i{stream}) the @i{stream element type} of the @i{stream}. ++ ++@IGindex em ++@item @b{em} ++ @i{n.} @i{Trad.} ++ a context-dependent unit of measure commonly used in typesetting, ++ equal to the displayed width of of a letter ``M'' in the current font. ++ (The letter ``M'' is traditionally chosen because it is typically ++ represented by the widest @i{glyph} in the font, and other characters' ++ widths are typically fractions of an @i{em}. In implementations providing ++ non-Roman characters with wider characters than ``M,'' it is permissible ++ for another character to be the @i{implementation-defined} reference character ++ for this measure, and for ``M'' to be only a fraction of an @i{em} ++ wide.) ++ In a fixed width font, a line with @i{n} characters is @i{n} ++ @i{ems} wide; in a variable width font, @i{n} @i{ems} is the ++ expected upper bound on the width of such a line. ++ ++@IGindex empty list ++@item @b{empty list} ++ @i{n.} ++ the @i{list} containing no @i{elements}. See @i{()}. ++ ++@IGindex empty type ++@item @b{empty type} ++ @i{n.} ++ the @i{type} that contains no @i{elements}, and that is ++ a @i{subtype} of all @i{types} (including itself). ++ See @i{nil}. ++ ++@IGindex end of file ++@item @b{end of file} ++ @i{n.} ++ 1. the point in an @i{input} @i{stream} beyond which there is ++ no further data. ++ Whether or not there is such a point on an @i{interactive stream} ++ is @i{implementation-defined}. ++ 2. a @i{situation} that occurs upon an attempt to obtain data from an ++ @i{input stream} that is at the @i{end of file}_1. ++ ++@IGindex environment ++@item @b{environment} ++ @i{n.} ++ 1. a set of @i{bindings}. See @ref{Introduction to Environments}. ++ 2. an @i{environment object}. ++ ``@b{macroexpand} takes an optional environment argument.'' ++ ++@IGindex environment object ++@item @b{environment object} ++ @i{n.} ++ an @i{object} representing a set of @i{lexical bindings}, ++ used in the processing of a @i{form} to provide meanings for ++ @i{names} within that @i{form}. ++ ``@b{macroexpand} takes an optional environment argument.'' ++ (The @i{object} @b{nil} when used as an @i{environment object} ++ denotes the @i{null lexical environment}; ++ the @i{values} of @i{environment parameters} ++ to @i{macro functions} are @i{objects} ++ of @i{implementation-dependent} nature which represent the ++ @i{environment}_1 in which the corresponding @i{macro form} ++ is to be expanded.) ++ See @ref{Environment Objects}. ++ ++@IGindex environment parameter ++@item @b{environment parameter} ++ @i{n.} ++ A @i{parameter} in a @i{defining form} f for which there is no corresponding ++ @i{argument}; instead, this @i{parameter} receives as its value an ++ @i{environment} @i{object} which corresponds to the ++ @i{lexical environment} in which the @i{defining form} f appeared. ++ ++@IGindex error ++@item @b{error} ++ @i{n.} ++ 1. (only in the phrase ``is an error'') ++ a @i{situation} in which the semantics of a program are not specified, ++ and in which the consequences are undefined. ++ 2. a @i{condition} which represents an @i{error} @i{situation}. ++ See @ref{Error Terminology}. ++ 3. an @i{object} of @i{type} @b{error}. ++ ++@IGindex error output ++@item @b{error output} ++ @i{n.} ++ the @i{output} @i{stream} which is the @i{value} of the @i{dynamic variable} ++ @b{*error-output*}. ++ ++@IGindex escape ++@item @b{escape} ++ @i{n.}, @i{adj.} ++ 1. @i{n.} a @i{single escape} or a @i{multiple escape}. ++ 2. @i{adj.} @i{single escape} or @i{multiple escape}. ++ ++@IGindex establish ++@item @b{establish} ++ @i{v.t.} ++ to build or bring into being ++ a @i{binding}, ++ a @i{declaration}, ++ an @i{exit point}, ++ a @i{tag}, ++ a @i{handler}, ++ a @i{restart}, ++ or an @i{environment}. ++ ``@b{let} establishes lexical bindings.'' ++ ++@IGindex evaluate ++@item @b{evaluate} ++ @i{v.t.} (a @i{form} or an @i{implicit progn}) ++ to @i{execute} the @i{code} represented by the @i{form} ++ (or the series of @i{forms} making up the @i{implicit progn}) ++ by applying the rules of @i{evaluation}, ++ returning zero or more values. ++ ++@IGindex evaluation ++@item @b{evaluation} ++ @i{n.} ++ a model whereby @i{forms} are @i{executed}, returning zero or more values. ++ Such execution might be implemented directly in one step by an interpreter ++ or in two steps by first @i{compiling} the @i{form} and then ++ @i{executing} the @i{compiled} @i{code}; this choice is ++ dependent both on context and the nature of the @i{implementation}, ++ but in any case is not in general detectable by any program. The evaluation ++ model is designed in such a way that a @i{conforming implementation} ++ might legitimately have only a compiler and no interpreter, or vice versa. ++ See @ref{The Evaluation Model}. ++ ++@IGindex evaluation environment ++@item @b{evaluation environment} ++ @i{n.} ++ a @i{run-time environment} in which macro expanders ++ and code specified by @b{eval-when} to be evaluated ++ are evaluated. All evaluations initiated by the @i{compiler} ++ take place in the @i{evaluation environment}. ++ ++@IGindex execute ++@item @b{execute} ++ @i{v.t.} @i{Trad.} (@i{code}) ++ to perform the imperative actions represented by the @i{code}. ++ ++@IGindex execution time ++@item @b{execution time} ++ @i{n.} ++ the duration of time that @i{compiled code} is being @i{executed}. ++ ++@IGindex exhaustive partition ++@item @b{exhaustive partition} ++ @i{n.} (of a @i{type}) ++ a set of @i{pairwise} @i{disjoint} @i{types} that form an ++ @i{exhaustive union}. ++ ++@IGindex exhaustive union ++@item @b{exhaustive union} ++ @i{n.} (of a @i{type}) ++ a set of @i{subtypes} of the @i{type}, ++ whose union contains all @i{elements} of that @i{type}. ++ ++@IGindex exit point ++@item @b{exit point} ++ @i{n.} ++ a point in a @i{control form} ++ from which (@i{e.g.}, @b{block}), ++ through which (@i{e.g.}, @b{unwind-protect}), ++ or to which (@i{e.g.}, @b{tagbody}) ++ control and possibly @i{values} can be transferred both actively by using ++ another @i{control form} and passively through the normal control and ++ data flow of @i{evaluation}. ++ ``@b{catch} and @b{block} establish bindings for ++ exit points to which @b{throw} and @b{return-from}, ++ respectively, can transfer control and values; ++ @b{tagbody} establishes a binding for an exit point ++ with lexical extent to which @b{go} can transfer control; ++ and @b{unwind-protect} establishes an exit point ++ through which control might be transferred by ++ operators such as @b{throw}, @b{return-from}, ++ and @b{go}.'' ++ ++@IGindex explicit return ++@item @b{explicit return} ++ @i{n.} ++ the act of transferring control (and possibly @i{values}) ++ to a @i{block} by using @b{return-from} (or @b{return}). ++ ++@IGindex explicit use ++@item @b{explicit use} ++ @i{n.} (of a @i{variable} V in a @i{form} F) ++ a reference to V that is directly apparent in the normal semantics of F; ++ @i{i.e.}, that does not expose any undocumented details of the ++ @i{macro expansion} of the @i{form} itself. ++ References to V exposed by expanding @i{subforms} of F are, however, ++ considered to be @i{explicit uses} of V. ++ ++@IGindex exponent marker ++@item @b{exponent marker} ++ @i{n.} ++ a character that is used in the textual notation for a @i{float} ++ to separate the mantissa from the exponent. ++ The characters defined as @i{exponent markers} in the @i{standard readtable} ++ are shown in Figure 26--1. ++ For more information, see @ref{Character Syntax}. ++ ``The exponent marker `d' in `3.0d7' indicates ++ that this number is to be represented as a double float.'' ++ ++@format ++@group ++@noindent ++@w{ Marker Meaning } ++@w{ @t{D} or @t{d} @b{double-float} } ++@w{ @t{E} or @t{e} @b{float} (see @b{*read-default-float-format*}) } ++@w{ @t{F} or @t{f} @b{single-float} } ++@w{ @t{L} or @t{l} @b{long-float} } ++@w{ @t{S} or @t{s} @b{short-float} } ++ ++@noindent ++@w{ Figure 26--1: Exponent Markers } ++ ++@end group ++@end format ++ ++@IGindex export ++@item @b{export} ++ @i{v.t.} (a @i{symbol} in a @i{package}) ++ to add the @i{symbol} to the list of @i{external symbols} of the ++ @i{package}. ++ ++@IGindex exported ++@item @b{exported} ++ @i{adj.} (of a @i{symbol} in a @i{package}) ++ being an @i{external symbol} of the @i{package}. ++ ++@IGindex expressed adjustability ++@item @b{expressed adjustability} ++ @i{n.} (of an @i{array}) ++ a @i{generalized boolean} that is conceptually (but not necessarily actually) ++ associated with the @i{array}, representing whether the @i{array} ++ is @i{expressly adjustable}. ++ See also @i{actual adjustability}. ++ ++@IGindex expressed array element type ++@item @b{expressed array element type} ++ @i{n.} (of an @i{array}) ++ the @i{type} which is the @i{array element type} ++ implied by a @i{type declaration} for the @i{array}, ++ or which is the requested @i{array element type} at its time ++ of creation, prior to any selection of an @i{upgraded array element type}. ++ (@r{Common Lisp} does not provide a way of detecting this @i{type} ++ directly at run time, but an @i{implementation} is permitted ++ to make assumptions about the @i{array}'s contents and ++ the operations which may be performed on the @i{array} when ++ this @i{type} is noted during code analysis, even if those ++ assumptions would not be valid in general for the ++ @i{upgraded array element type} of the ++ @i{expressed array element type}.) ++ ++@IGindex expressed complex part type ++@item @b{expressed complex part type} ++ @i{n.} (of a @i{complex}) ++ the @i{type} which is implied as the @i{complex part type} ++ by a @i{type declaration} for the @i{complex}, ++ or which is the requested @i{complex part type} at its time of ++ creation, prior to any selection of an @i{upgraded complex part type}. ++ (@r{Common Lisp} does not provide a way of detecting this @i{type} ++ directly at run time, but an @i{implementation} is permitted ++ to make assumptions about the operations which may be performed on ++ the @i{complex} when this @i{type} is noted during code ++ analysis, even if those assumptions would not be valid in general for ++ the @i{upgraded complex part type} of the ++ @i{expressed complex part type}.) ++ ++@IGindex expression ++@item @b{expression} ++ @i{n.} ++ 1. an @i{object}, often used to emphasize the use ++ of the @i{object} to encode or represent information in a specialized ++ format, such as program text. ++ ``The second expression in a @b{let} form is a list ++ of bindings.'' ++ 2. the textual notation used to notate an @i{object} in a source file. ++ ``The expression @t{'sample} is equivalent to @t{(quote sample)}.'' ++ ++@IGindex expressly adjustable ++@item @b{expressly adjustable} ++ @i{adj.} (of an @i{array}) ++ being @i{actually adjustable} by virtue of an explicit request for this ++ characteristic having been made at the time of its creation. ++ All @i{arrays} that are @i{expressly adjustable} ++ are @i{actually adjustable}, ++ but not necessarily vice versa. ++ ++@IGindex extended character ++@item @b{extended character} ++ @i{n.} ++ a @i{character} ++ ++ of @i{type} @b{extended-char}: ++ ++ a @i{character} that is not a @i{base character}. ++ ++@IGindex extended function designator ++@item @b{extended function designator} ++ @i{n.} ++ a @i{designator} for a @i{function}; that is, ++ an @i{object} that denotes a @i{function} ++ and that is one of: ++ a @i{function name} (denoting the @i{function} it names ++ in the @i{global environment}), ++ or a @i{function} (denoting itself). ++ The consequences are undefined if ++ a @i{function name} is used as an ++ @i{extended function designator} but ++ it does not have a global definition as a @i{function}, ++ or if it is a @i{symbol} ++ that has a global definition as a @i{macro} or a @i{special form}. ++ See also @i{function designator}. ++ ++@IGindex extended lambda list ++@item @b{extended lambda list} ++ @i{n.} ++ a list resembling an @i{ordinary lambda list} in form and purpose, but ++ offering additional syntax or functionality not available in an ++ @i{ordinary lambda list}. ++ ``@b{defmacro} uses extended lambda lists.'' ++ ++@IGindex extension ++@item @b{extension} ++ @i{n.} ++ a facility in an @i{implementation} of @r{Common Lisp} ++ that is not specified by this standard. ++ ++@IGindex extent ++@item @b{extent} ++ @i{n.} ++ the interval of time during which a @i{reference} to ++ an @i{object}, ++ a @i{binding}, ++ an @i{exit point}, ++ a @i{tag}, ++ a @i{handler}, ++ a @i{restart}, ++ or an @i{environment} is defined. ++ ++@IGindex external file format ++@item @b{external file format} ++ @i{n.} ++ an @i{object} of @i{implementation-dependent} nature which determines ++ one of possibly several @i{implementation-dependent} ways in which ++ @i{characters} are encoded externally in a @i{character} @i{file}. ++ ++@IGindex external file format designator ++@item @b{external file format designator} ++ @i{n.} ++ a @i{designator} for an @i{external file format}; that is, ++ an @i{object} that denotes an @i{external file format} ++ and that is one of: ++ the @i{symbol} @t{:default} ++ (denoting an @i{implementation-dependent} default ++ @i{external file format} that can accomodate at least ++ the @i{base characters}), ++ some other @i{object} defined by the @i{implementation} to be ++ an @i{external file format designator} ++ (denoting an @i{implementation-defined} @i{external file format}), ++ or some other @i{object} defined by the @i{implementation} to be ++ an @i{external file format} ++ (denoting itself). ++ ++@IGindex external symbol ++@item @b{external symbol} ++ @i{n.} (of a @i{package}) ++ a @i{symbol} that is part of the `external interface' to the @i{package} ++ and that are @i{inherited}_3 by any other @i{package} ++ that @i{uses} the @i{package}. ++ When using the @i{Lisp reader}, ++ if a @i{package prefix} is used, ++ the @i{name} of an @i{external symbol} is separated ++ from the @i{package} @i{name} by a single @i{package marker} ++ while ++ the @i{name} of an @i{internal symbol} is separated ++ from the @i{package} @i{name} by a double @i{package marker}; ++ see @ref{Symbols as Tokens}. ++ ++@IGindex externalizable object ++@item @b{externalizable object} ++ @i{n.} ++ an @i{object} that can be used as a @i{literal} @i{object} ++ in @i{code} to be processed by the @i{file compiler}. ++ ++@end table ++@subheading @b{F} ++@table @asis ++ ++@IGindex false ++@item @b{false} ++ @i{n.} ++ the @i{symbol} @b{nil}, ++ used to represent the failure of a @i{predicate} test. ++ ++@IGindex fbound ++@item @b{fbound} ++ pronounced 'ef ,baund @i{adj.} ++ (of a @i{function name}) ++ @i{bound} in the @i{function} @i{namespace}. ++ (The @i{names} of @i{macros} and @i{special operators} are @i{fbound}, ++ but the nature and @i{type} of the @i{object} which is their @i{value} ++ is @i{implementation-dependent}. ++ ++ Further, defining a @i{setf expander} @i{F} does not cause the @i{setf function} ++ @t{(setf @i{F})} to become defined; as such, if there is a such a definition ++ of a @i{setf expander} @i{F}, the @i{function} @t{(setf @i{F})} ++ can be @i{fbound} if and only if, by design or coincidence, a ++ function binding for @t{(setf @i{F})} has been independently established.) ++ ++ See the @i{functions} @b{fboundp} and @b{symbol-function}. ++ ++@IGindex feature ++@item @b{feature} ++ @i{n.} ++ 1. an aspect or attribute ++ of @r{Common Lisp}, ++ of the @i{implementation}, ++ or of the @i{environment}. ++ 2. a @i{symbol} that names a @i{feature}_1. ++ See @ref{Features}. ++ ``The @t{:ansi-cl} feature is present in all conforming implementations.'' ++ ++@IGindex feature expression ++@item @b{feature expression} ++ @i{n.} ++ A boolean combination of @i{features} used by the @t{#+} and @t{#-} ++ @i{reader macros} in order to direct conditional @i{reading} of ++ @i{expressions} by the @i{Lisp reader}. ++ See @ref{Feature Expressions}. ++ ++@IGindex features list ++@item @b{features list} ++ @i{n.} ++ the @i{list} that is the @i{value} of @b{*features*}. ++ ++@IGindex file ++@item @b{file} ++ @i{n.} ++ a named entry in a @i{file system}, ++ having an @i{implementation-defined} nature. ++ ++@IGindex file compiler ++@item @b{file compiler} ++ @i{n.} ++ any @i{compiler} which @i{compiles} @i{source code} contained in a @i{file}, ++ producing a @i{compiled file} as output. The @b{compile-file} ++ function is the only interface to such a @i{compiler} provided by @r{Common Lisp}, ++ but there might be other, @i{implementation-defined} mechanisms for ++ invoking the @i{file compiler}. ++ ++@IGindex file position ++@item @b{file position} ++ @i{n.} (in a @i{stream}) ++ a non-negative @i{integer} that represents a position in the @i{stream}. ++ Not all @i{streams} are able to represent the notion of @i{file position}; ++ in the description of any @i{operator} which manipulates @i{file positions}, ++ the behavior for @i{streams} that don't have this notion must be explicitly stated. ++ For @i{binary} @i{streams}, the @i{file position} represents the number ++ of preceding @i{bytes} in the @i{stream}. ++ For @i{character} @i{streams}, the constraint is more relaxed: ++ @i{file positions} must increase monotonically, the amount of the increase ++ between @i{file positions} corresponding to any two successive characters ++ in the @i{stream} is @i{implementation-dependent}. ++ ++@IGindex file position designator ++@item @b{file position designator} ++ @i{n.} (in a @i{stream}) ++ a @i{designator} for a @i{file position} in that @i{stream}; that is, ++ the symbol @t{:start} ++ (denoting @t{0}, the first @i{file position} in that @i{stream}), ++ the symbol @t{:end} ++ (denoting the last @i{file position} in that @i{stream}; ++ @i{i.e.}, the position following the last @i{element} of the @i{stream}), ++ or a @i{file position} (denoting itself). ++ ++@IGindex file stream ++@item @b{file stream} ++ @i{n.} ++ an @i{object} of @i{type} @b{file-stream}. ++ ++@IGindex file system ++@item @b{file system} ++ @i{n.} ++ a facility which permits aggregations of data to be stored in named ++ @i{files} on some medium that is external to the @i{Lisp image} ++ and that therefore persists from @i{session} to @i{session}. ++ ++@IGindex filename ++@item @b{filename} ++ @i{n.} ++ a handle, not necessarily ever directly represented as an @i{object}, ++ that can be used to refer to a @i{file} in a @i{file system}. ++ @i{Pathnames} and @i{namestrings} are two kinds of @i{objects} ++ that substitute for @i{filenames} in @r{Common Lisp}. ++ ++@IGindex fill pointer ++@item @b{fill pointer} ++ @i{n.} (of a @i{vector}) ++ an @i{integer} associated with a @i{vector} that represents the ++ index above which no @i{elements} are @i{active}. ++ (A @i{fill pointer} is a non-negative @i{integer} no ++ larger than the total number of @i{elements} in the @i{vector}. ++ Not all @i{vectors} have @i{fill pointers}.) ++ ++@IGindex finite ++@item @b{finite} ++ @i{adj.} (of a @i{type}) ++ having a finite number of @i{elements}. ++ ``The type specifier @t{(integer 0 5)} denotes a finite type, ++ but the type specifiers @b{integer} and @t{(integer 0)} do not.'' ++ ++@IGindex fixnum ++@item @b{fixnum} ++ @i{n.} ++ an @i{integer} of @i{type} @b{fixnum}. ++ ++@IGindex float ++@item @b{float} ++ @i{n.} ++ an @i{object} of @i{type} @b{float}. ++ ++@IGindex for-value ++@item @b{for-value} ++ @i{adj.} (of a @i{reference} to a @i{binding}) ++ being a @i{reference} that @i{reads}_1 ++ the @i{value} of the @i{binding}. ++ ++@IGindex form ++@item @b{form} ++ @i{n.} ++ 1. any @i{object} meant to be @i{evaluated}. ++ 2. a @i{symbol}, ++ a @i{compound form}, ++ or a @i{self-evaluating object}. ++ 3. (for an @i{operator}, as in ``<<@i{operator}>> @i{form}'') ++ a @i{compound form} having that @i{operator} as its first element. ++ ``A @b{quote} form is a constant form.'' ++ ++@IGindex formal argument ++@item @b{formal argument} ++ @i{n.} @i{Trad.} ++ a @i{parameter}. ++ ++@IGindex formal parameter ++@item @b{formal parameter} ++ @i{n.} @i{Trad.} ++ a @i{parameter}. ++ ++@IGindex format ++@item @b{format} ++ @i{v.t.} (a @i{format control} and @i{format arguments}) ++ to perform output as if by @b{format}, ++ using the @i{format string} and @i{format arguments}. ++ ++@IGindex format argument ++@item @b{format argument} ++ @i{n.} ++ an @i{object} which is used as data by functions such as @b{format} ++ which interpret @i{format controls}. ++ ++@IGindex format control ++@item @b{format control} ++ @i{n.} ++ a @i{format string}, ++ or a @i{function} that obeys the @i{argument} conventions ++ for a @i{function} returned by the @b{formatter} @i{macro}. ++ See @ref{Compiling Format Strings}. ++ ++@IGindex format directive ++@item @b{format directive} ++ @i{n.} ++ 1. a sequence of @i{characters} in a @i{format string} ++ which is introduced by a @i{tilde}, and which is specially ++ interpreted by @i{code} which processes @i{format strings} ++ to mean that some special operation should be performed, possibly ++ involving data supplied by the @i{format arguments} that ++ accompanied the @i{format string}. See the @i{function} @b{format}. ++ ``In @t{"~D base 10 = ~8R"}, the character ++ sequences `@t{~D}' and `@t{~8R}' are format directives.'' ++ 2. the conceptual category of all @i{format directives}_1 ++ which use the same dispatch character. ++ ``Both @t{"~3d"} and @t{"~3,'0D"} are valid uses of the ++ `@t{~D}' format directive.'' ++ ++@IGindex format string ++@item @b{format string} ++ @i{n.} ++ a @i{string} which can contain both ordinary text and @i{format directives}, ++ and which is used in conjunction with @i{format arguments} to describe how ++ text output should be formatted by certain functions, such as @b{format}. ++ ++@IGindex free declaration ++@item @b{free declaration} ++ @i{n.} ++ a declaration that is not a @i{bound declaration}. ++ See @b{declare}. ++ ++@IGindex fresh ++@item @b{fresh} ++ @i{adj.} ++ 1. (of an @i{object} @i{yielded} by a @i{function}) ++ having been newly-allocated by that @i{function}. ++ (The caller of a @i{function} that returns a @i{fresh} @i{object} ++ may freely modify the @i{object} without fear that such modification will ++ compromise the future correct behavior of that @i{function}.) ++ 2. (of a @i{binding} for a @i{name}) ++ newly-allocated; not shared with other @i{bindings} for that @i{name}. ++ ++@IGindex freshline ++@item @b{freshline} ++ @i{n.} ++ a conceptual operation on a @i{stream}, implemented by the @i{function} @b{fresh-line} ++ and by the @i{format directive} @t{~&}, which advances the display position ++ to the beginning of the next line (as if a @i{newline} had been typed, or ++ the @i{function} @b{terpri} had been called) ++ unless the @i{stream} is already known to be positioned at the beginning of a line. ++ Unlike @i{newline}, @i{freshline} is not a @i{character}. ++ ++@IGindex funbound ++@item @b{funbound} ++ pronounced 'ef unbaund @i{n.} (of a @i{function name}) ++ not @i{fbound}. ++ ++@IGindex function ++@item @b{function} ++ @i{n.} ++ ++ 1. an @i{object} representing code, ++ which can be @i{called} with zero or more @i{arguments}, ++ and which produces zero or more @i{values}. ++ 2. an @i{object} of @i{type} @b{function}. ++ ++@IGindex function block name ++@item @b{function block name} ++ @i{n.} (of a @i{function name}) ++ The @i{symbol} that would be used as the name of an @i{implicit block} ++ which surrounds the body of a @i{function} having that @i{function name}. ++ If the @i{function name} is a @i{symbol}, its @i{function block name} is ++ the @i{function name} itself. ++ If the @i{function name} is a @i{list} whose @i{car} is @b{setf} ++ and whose @i{cadr} is a @i{symbol}, its @i{function block name} is ++ the @i{symbol} that is the @i{cadr} of the @i{function name}. ++ An @i{implementation} which supports additional kinds of @i{function names} ++ must specify for each how the corresponding @i{function block name} is computed. ++ ++@IGindex function cell ++@item @b{function cell} ++ @i{n.} @i{Trad.} (of a @i{symbol}) ++ The @i{place} which holds the @i{definition} of the ++ global @i{function} @i{binding}, if any, named by that @i{symbol}, ++ and which is @i{accessed} by @b{symbol-function}. ++ See @i{cell}. ++ ++@IGindex function designator ++@item @b{function designator} ++ @i{n.} ++ a @i{designator} for a @i{function}; that is, ++ an @i{object} that denotes a @i{function} ++ and that is one of: ++ a @i{symbol} (denoting the @i{function} named by that @i{symbol} ++ in the @i{global environment}), ++ or a @i{function} (denoting itself). ++ The consequences are undefined if ++ a @i{symbol} is used as a @i{function designator} but ++ it does not have a global definition as a @i{function}, ++ or it has a global definition as a @i{macro} or a @i{special form}. ++ See also @i{extended function designator}. ++ ++@IGindex function form ++@item @b{function form} ++ @i{n.} ++ a @i{form} that is a @i{list} and that has a first element ++ which is the @i{name} of a @i{function} to be called on ++ @i{arguments} which are the result of @i{evaluating} subsequent ++ elements of the @i{function form}. ++ ++@IGindex function name ++@item @b{function name} ++ @i{n.} (in an @i{environment}) ++ A @i{symbol} or a @i{list} @t{(setf @i{symbol})} ++ that is the @i{name} of a @i{function} in that @i{environment}. ++ ++@IGindex functional evaluation ++@item @b{functional evaluation} ++ @i{n.} ++ the process of extracting a @i{functional value} from a @i{function name} ++ or a @i{lambda expression}. ++ The evaluator performs @i{functional evaluation} ++ implicitly when it encounters a @i{function name} ++ or a @i{lambda expression} ++ in the @i{car} of a @i{compound form}, ++ or explicitly when it encounters a @b{function} @i{special form}. ++ Neither a use of a @i{symbol} as a @i{function designator} nor a ++ use of the @i{function} @b{symbol-function} to extract the @i{functional value} ++ of a @i{symbol} is considered a @i{functional evaluation}. ++ ++@IGindex functional value ++@item @b{functional value} ++ @i{n.} ++ 1. (of a @i{function name} N in an @i{environment} E) ++ The @i{value} of the @i{binding} named N ++ in the @i{function} @i{namespace} for @i{environment} E; ++ that is, the contents of the @i{function cell} named N in ++ @i{environment} E. ++ 2. (of an @i{fbound} @i{symbol} S) ++ the contents of the @i{symbol}'s @i{function cell}; that is, ++ the @i{value} of the @i{binding} named S ++ in the @i{function} @i{namespace} of the @i{global environment}. ++ (A @i{name} that is a @i{macro name} in the @i{global environment} ++ or is a @i{special operator} might or might not be @i{fbound}. ++ But if S is such a @i{name} and is @i{fbound}, the specific ++ nature of its @i{functional value} is @i{implementation-dependent}; ++ in particular, it might or might not be a @i{function}.) ++ ++@IGindex further compilation ++@item @b{further compilation} ++ @i{n.} ++ @i{implementation-dependent} compilation beyond @i{minimal compilation}. ++ Further compilation is permitted to take place at @i{run time}. ++ ``Block compilation and generation of machine-specific instructions ++ are examples of further compilation.'' ++ ++@end table ++@subheading @b{G} ++@table @asis ++ ++@IGindex general ++@item @b{general} ++ @i{adj.} (of an @i{array}) ++ having @i{element type} @b{t}, ++ and consequently able to have any @i{object} as an @i{element}. ++ ++@IGindex generalized boolean ++@item @b{generalized boolean} ++ @i{n.} ++ an @i{object} used as a truth value, where the symbol~@b{nil} ++ represents @i{false} and all other @i{objects} represent @i{true}. ++ See @i{boolean}. ++ ++@IGindex generalized instance ++@item @b{generalized instance} ++ @i{n.} (of a @i{class}) ++ an @i{object} the @i{class} of which is either that @i{class} itself, ++ or some subclass of that @i{class}. (Because of the correspondence between ++ types and classes, the term ``generalized instance of X'' ++ implies ``object of type X'' and in cases where X is a @i{class} ++ (or @i{class name}) the reverse is also true. ++ The former terminology emphasizes the view of X as a @i{class} ++ while the latter emphasizes the view of X as a @i{type specifier}.) ++ ++@IGindex generalized reference ++@item @b{generalized reference} ++ @i{n.} ++ a reference to a location storing an @i{object} as if to a @i{variable}. ++ (Such a reference can be either to @i{read} or @i{write} the location.) ++ See @ref{Generalized Reference}. See also @i{place}. ++ ++@IGindex generalized synonym stream ++@item @b{generalized synonym stream} ++ @i{n.} (with a @i{synonym stream symbol}) ++ 1. (to a @i{stream}) ++ a @i{synonym stream} to the @i{stream}, ++ or a @i{composite stream} which has as a target ++ a @i{generalized synonym stream} to the @i{stream}. ++ 2. (to a @i{symbol}) ++ a @i{synonym stream} to the @i{symbol}, ++ or a @i{composite stream} which has as a target ++ a @i{generalized synonym stream} to the @i{symbol}. ++ ++@IGindex generic function ++@item @b{generic function} ++ @i{n.} ++ a @i{function} whose behavior depends on the @i{classes} or ++ identities of the arguments supplied to it and whose parts include, among ++ other things, a set of @i{methods}, a @i{lambda list}, and a ++ @i{method combination} type. ++ ++@IGindex generic function lambda list ++@item @b{generic function lambda list} ++ @i{n.} ++ A @i{lambda list} that is used to describe data flow into a @i{generic function}. ++ See @ref{Generic Function Lambda Lists}. ++ ++@IGindex gensym ++@item @b{gensym} ++ @i{n.} @i{Trad.} ++ an @i{uninterned} @i{symbol}. ++ See the @i{function} @b{gensym}. ++ ++@IGindex global declaration ++@item @b{global declaration} ++ @i{n.} ++ a @i{form} that makes certain kinds of information about ++ code globally available; that is, a @b{proclaim} @i{form} ++ or a @b{declaim} @i{form}. ++ ++@IGindex global environment ++@item @b{global environment} ++ @i{n.} ++ that part of an @i{environment} that contains @i{bindings} ++ with @i{indefinite scope} and @i{indefinite extent}. ++ ++@IGindex global variable ++@item @b{global variable} ++ @i{n.} ++ a @i{dynamic variable} or a @i{constant variable}. ++ ++@IGindex glyph ++@item @b{glyph} ++ @i{n.} ++ a visual representation. ++ ``Graphic characters have associated glyphs.'' ++ ++@IGindex go ++@item @b{go} ++ @i{v.} ++ to transfer control to a @i{go point}. ++ See the @i{special operator} @b{go}. ++ ++@IGindex go point ++@item @b{go point} ++ ++ one of possibly several @i{exit points} that are @i{established} ++ by @b{tagbody} (or other abstractions, such as @b{prog}, ++ which are built from @b{tagbody}). ++ ++@IGindex go tag ++@item @b{go tag} ++ @i{n.} ++ the @i{symbol} or @i{integer} that, within the @i{lexical scope} ++ of a @b{tagbody} @i{form}, names an @i{exit point} ++ @i{established} by that @b{tagbody} @i{form}. ++ ++@IGindex graphic ++@item @b{graphic} ++ @i{adj.} (of a @i{character}) ++ being a ``printing'' or ``displayable'' @i{character} ++ that has a standard visual representation ++ as a single @i{glyph}, such as @t{A} or @t{*} or @t{=}. ++ @i{Space} is defined to be @i{graphic}. ++ Of the @i{standard characters}, all but @i{newline} are @i{graphic}. ++ See @i{non-graphic}. ++ ++@end table ++@subheading @b{H} ++@table @asis ++ ++@IGindex handle ++@item @b{handle} ++ @i{v.} (of a @i{condition} being @i{signaled}) ++ to perform a non-local transfer of control, terminating the ongoing ++ @i{signaling} of the @i{condition}. ++ ++@IGindex handler ++@item @b{handler} ++ @i{n.} ++ ++ a @i{condition handler}. ++ ++@IGindex hash table ++@item @b{hash table} ++ @i{n.} ++ an @i{object} of @i{type} @b{hash-table}, ++ which provides a mapping from @i{keys} to @i{values}. ++ ++@IGindex home package ++@item @b{home package} ++ @i{n.} (of a @i{symbol}) ++ the @i{package}, if any, which is contents of the @i{package cell} ++ of the @i{symbol}, and which dictates how the @i{Lisp printer} ++ prints the @i{symbol} when it is not @i{accessible} in the ++ @i{current package}. (@i{Symbols} which have @b{nil} in their ++ @i{package cell} are said to have no @i{home package}, and also ++ to be @i{apparently uninterned}.) ++ ++@end table ++@subheading @b{I} ++@table @asis ++ ++@IGindex I/O customization variable ++@item @b{I/O customization variable} ++ @i{n.} ++ one of the @i{stream variables} in Figure 26--2, ++ or some other (@i{implementation-defined}) @i{stream variable} ++ that is defined by the @i{implementation} ++ to be an @i{I/O customization variable}. ++ ++@format ++@group ++@noindent ++@w{ *debug-io* *error-io* query-io* } ++@w{ *standard-input* *standard-output* *trace-output* } ++ ++@noindent ++@w{ Figure 26--2: Standardized I/O Customization Variables} ++ ++@end group ++@end format ++ ++@IGindex identical ++@item @b{identical} ++ @i{adj.} ++ the @i{same} under @b{eq}. ++ ++@IGindex identifier ++@item @b{identifier} ++ @i{n.} ++ 1. a @i{symbol} used to identify or to distinguish @i{names}. ++ 2. a @i{string} used the same way. ++ ++@IGindex immutable ++@item @b{immutable} ++ @i{adj.} ++ not subject to change, either because no @i{operator} is provided which is ++ capable of effecting such change or because some constraint exists which ++ prohibits the use of an @i{operator} that might otherwise be capable of ++ effecting such a change. Except as explicitly indicated otherwise, ++ @i{implementations} are not required to detect attempts to modify ++ @i{immutable} @i{objects} or @i{cells}; the consequences of attempting ++ to make such modification are undefined. ++ ``Numbers are immutable.'' ++ ++@IGindex implementation ++@item @b{implementation} ++ @i{n.} ++ a system, mechanism, or body of @i{code} that implements the semantics of @r{Common Lisp}. ++ ++@IGindex implementation limit ++@item @b{implementation limit} ++ @i{n.} ++ a restriction imposed by an @i{implementation}. ++ ++@IGindex implementation-defined ++@item @b{implementation-defined} ++ @i{adj.} ++ @i{implementation-dependent}, but required by this specification to be ++ defined by each @i{conforming implementation} and to be documented by ++ the corresponding implementor. ++ ++@IGindex implementation-dependent ++@item @b{implementation-dependent} ++ @i{adj.} ++ describing a behavior or aspect of @r{Common Lisp} which has been deliberately left ++ unspecified, that might be defined in some @i{conforming implementations} ++ but not in others, and whose details may differ between @i{implementations}. ++ A @i{conforming implementation} is encouraged (but not required) to ++ document its treatment of each item in this specification which is ++ marked @i{implementation-dependent}, although in some cases ++ such documentation might simply identify the item as ``undefined.'' ++ ++@IGindex implementation-independent ++@item @b{implementation-independent} ++ @i{adj.} ++ used to identify or emphasize a behavior or aspect of @r{Common Lisp} which does ++ not vary between @i{conforming implementations}. ++ ++@IGindex implicit block ++@item @b{implicit block} ++ @i{n.} ++ a @i{block} introduced by a @i{macro form} ++ rather than by an explicit @b{block} @i{form}. ++ ++@IGindex implicit compilation ++@item @b{implicit compilation} ++ @i{n.} ++ @i{compilation} performed during @i{evaluation}. ++ ++@IGindex implicit progn ++@item @b{implicit progn} ++ @i{n.} ++ an ordered set of adjacent @i{forms} appearing in another ++ @i{form}, and defined by their context in that @i{form} ++ to be executed as if within a @b{progn}. ++ ++@IGindex implicit tagbody ++@item @b{implicit tagbody} ++ @i{n.} ++ an ordered set of adjacent @i{forms} and/or @i{tags} ++ appearing in another @i{form}, and defined by their context ++ in that @i{form} to be executed as if within a @b{tagbody}. ++ ++@IGindex import ++@item @b{import} ++ @i{v.t.} (a @i{symbol} into a @i{package}) ++ to make the @i{symbol} be @i{present} in the @i{package}. ++ ++@IGindex improper list ++@item @b{improper list} ++ @i{n.} ++ a @i{list} which is not a @i{proper list}: ++ a @i{circular list} or a @i{dotted list}. ++ ++@IGindex inaccessible ++@item @b{inaccessible} ++ @i{adj.} ++ not @i{accessible}. ++ ++@IGindex indefinite extent ++@item @b{indefinite extent} ++ @i{n.} ++ an @i{extent} whose duration is unlimited. ++ ``Most Common Lisp objects have indefinite extent.'' ++ ++@IGindex indefinite scope ++@item @b{indefinite scope} ++ @i{n.} ++ @i{scope} that is unlimited. ++ ++@IGindex indicator ++@item @b{indicator} ++ @i{n.} ++ a @i{property indicator}. ++ ++@IGindex indirect instance ++@item @b{indirect instance} ++ @i{n.} (of a @i{class} C_1) ++ an @i{object} of @i{class} C_2, ++ where C_2 is a @i{subclass} of C_1. ++ ``An integer is an indirect instance of the class @b{number}.'' ++ ++@IGindex inherit ++@item @b{inherit} ++ @i{v.t.} ++ 1. to receive or acquire a quality, trait, or characteristic; ++ to gain access to a feature defined elsewhere. ++ 2. (a @i{class}) to acquire the structure and behavior defined ++ by a @i{superclass}. ++ 3. (a @i{package}) to make @i{symbols} @i{exported} by another ++ @i{package} @i{accessible} by using @b{use-package}. ++ ++@IGindex initial pprint dispatch table ++@item @b{initial pprint dispatch table} ++ @i{n.} ++ the @i{value} of @b{*print-pprint-dispatch*} at the time the @i{Lisp image} is started. ++ ++@IGindex initial readtable ++@item @b{initial readtable} ++ @i{n.} ++ the @i{value} of @b{*readtable*} at the time the @i{Lisp image} is started. ++ ++@IGindex initialization argument list ++@item @b{initialization argument list} ++ @i{n.} ++ a @i{property list} of initialization argument @i{names} and @i{values} ++ used in the protocol for initializing and reinitializing @i{instances} of @i{classes}. ++ See @ref{Object Creation and Initialization}. ++ ++@IGindex initialization form ++@item @b{initialization form} ++ @i{n.} ++ a @i{form} used to supply the initial @i{value} for a @i{slot} ++ or @i{variable}. ++ ``The initialization form for a slot in a @b{defclass} form ++ is introduced by the keyword @t{:initform}.'' ++ ++@IGindex input ++@item @b{input} ++ @i{adj.} (of a @i{stream}) ++ supporting input operations (@i{i.e.}, being a ``data source''). ++ An @i{input} @i{stream} might also be an @i{output} @i{stream}, ++ in which case it is sometimes called a @i{bidirectional} @i{stream}. ++ See the @i{function} @b{input-stream-p}. ++ ++@IGindex instance ++@item @b{instance} ++ @i{n.} ++ 1. a @i{direct instance}. ++ 2. a @i{generalized instance}. ++ 3. an @i{indirect instance}. ++ ++@IGindex integer ++@item @b{integer} ++ @i{n.} ++ an @i{object} of @i{type} @b{integer}, which represents a mathematical integer. ++ ++@IGindex interactive stream ++@item @b{interactive stream} ++ @i{n.} ++ a @i{stream} on which it makes sense to perform interactive querying. ++ See @ref{Interactive Streams}. ++ ++@IGindex intern ++@item @b{intern} ++ @i{v.t.} ++ 1. (a @i{string} in a @i{package}) ++ to look up the @i{string} in the @i{package}, ++ returning either a @i{symbol} with that @i{name} ++ which was already @i{accessible} in the @i{package} ++ or a newly created @i{internal symbol} of the @i{package} ++ with that @i{name}. ++ 2. @i{Idiom.} generally, to observe a protocol whereby objects which ++ are equivalent or have equivalent names under some predicate defined ++ by the protocol are mapped to a single canonical object. ++ ++@IGindex internal symbol ++@item @b{internal symbol} ++ @i{n.} (of a @i{package}) ++ a symbol which is @i{accessible} in the @i{package}, ++ but which is not an @i{external symbol} of the @i{package}. ++ ++@IGindex internal time ++@item @b{internal time} ++ @i{n.} ++ @i{time}, represented as an @i{integer} number of @i{internal time units}. ++ @i{Absolute} @i{internal time} is measured as an offset ++ from an arbitrarily chosen, @i{implementation-dependent} base. ++ See @ref{Internal Time}. ++ ++@IGindex internal time unit ++@item @b{internal time unit} ++ @i{n.} ++ a unit of time equal to 1/n of a second, ++ for some @i{implementation-defined} @i{integer} value of n. ++ See the @i{variable} @b{internal-time-units-per-second}. ++ ++@IGindex interned ++@item @b{interned} ++ @i{adj.} @i{Trad.} ++ 1. (of a @i{symbol}) @i{accessible}_3 in ++ any @i{package}. ++ 2. (of a @i{symbol} in a specific @i{package}) ++ @i{present} in that @i{package}. ++ ++@IGindex interpreted function ++@item @b{interpreted function} ++ @i{n.} ++ a @i{function} that is not a @i{compiled function}. ++ (It is possible for there to be a @i{conforming implementation} which ++ has no @i{interpreted functions}, but a @i{conforming program} ++ must not assume that all @i{functions} are @i{compiled functions}.) ++ ++@IGindex interpreted implementation ++@item @b{interpreted implementation} ++ @i{n.} ++ an @i{implementation} that uses an execution strategy for ++ @i{interpreted functions} that does not involve a one-time semantic ++ analysis pre-pass, and instead uses ``lazy'' (and sometimes repetitious) ++ semantic analysis of @i{forms} as they are encountered during execution. ++ ++@IGindex interval designator ++@item @b{interval designator} ++ @i{n.} (of @i{type} T) ++ an ordered pair of @i{objects} that describe a @i{subtype} of T ++ by delimiting an interval on the real number line. ++ See @ref{Interval Designators}. ++ ++@IGindex invalid ++@item @b{invalid} ++ @i{n.}, @i{adj.} ++ 1. @i{n.} ++ a possible @i{constituent trait} of a @i{character} ++ which if present signifies that the @i{character} ++ cannot ever appear in a @i{token} ++ except under the control of a @i{single escape} @i{character}. ++ For details, see @ref{Constituent Characters}. ++ 2. @i{adj.} (of a @i{character}) ++ being a @i{character} that has @i{syntax type} @i{constituent} ++ in the @i{current readtable} and that has the ++ @i{constituent trait} @i{invalid}_1. ++ See @i{Figure~2--8}. ++ ++@IGindex iteration form ++@item @b{iteration form} ++ @i{n.} ++ a @i{compound form} whose @i{operator} is named in Figure 26--3, ++ or a @i{compound form} that has an @i{implementation-defined} @i{operator} ++ and that is defined by the @i{implementation} to be an @i{iteration form}. ++ ++@format ++@group ++@noindent ++@w{ do do-external-symbols dotimes } ++@w{ do* do-symbols loop } ++@w{ do-all-symbols dolist } ++ ++@noindent ++@w{ Figure 26--3: Standardized Iteration Forms } ++ ++@end group ++@end format ++ ++@IGindex iteration variable ++@item @b{iteration variable} ++ @i{n.} ++ a @i{variable} V, the @i{binding} for which was created by an ++ @i{explicit use} of V in an @i{iteration form}. ++ ++@end table ++@subheading @b{K} ++@table @asis ++ ++@IGindex key ++@item @b{key} ++ @i{n.} ++ an @i{object} used for selection during retrieval. ++ See @i{association list}, @i{property list}, and @i{hash table}. ++ Also, see @ref{Sequence Concepts}. ++ ++@IGindex keyword ++@item @b{keyword} ++ @i{n.} ++ 1. a @i{symbol} the @i{home package} of which is the @t{KEYWORD} @i{package}. ++ 2. any @i{symbol}, usually but not necessarily in the @t{KEYWORD} @i{package}, ++ that is used as an identifying marker in keyword-style argument passing. ++ See @b{lambda}. ++ 3. @i{Idiom.} a @i{lambda list keyword}. ++ ++@IGindex keyword parameter ++@item @b{keyword parameter} ++ @i{n.} ++ A @i{parameter} for which a corresponding keyword @i{argument} ++ is optional. (There is no such thing as a required keyword @i{argument}.) ++ If the @i{argument} is not supplied, a default value is used. ++ See also @i{supplied-p parameter}. ++ ++@IGindex keyword/value pair ++@item @b{keyword/value pair} ++ @i{n.} ++ two successive @i{elements} (a @i{keyword} and a @i{value}, ++ respectively) of a @i{property list}. ++ ++@end table ++@subheading @b{L} ++@table @asis ++ ++@IGindex lambda combination ++@item @b{lambda combination} ++ @i{n.} @i{Trad.} ++ a @i{lambda form}. ++ ++@IGindex lambda expression ++@item @b{lambda expression} ++ @i{n.} ++ a @i{list} which can be used in place of a @i{function name} in ++ certain contexts to denote a @i{function} by directly describing its ++ behavior rather than indirectly by referring to the name of an ++ @i{established} @i{function}; its name derives from the fact that its ++ first element is the @i{symbol} @t{lambda}. ++ See @b{lambda}. ++ ++@IGindex lambda form ++@item @b{lambda form} ++ @i{n.} ++ a @i{form} that is a @i{list} and that has a first element ++ which is a @i{lambda expression} representing a @i{function} ++ to be called on @i{arguments} which are the result of @i{evaluating} ++ subsequent elements of the @i{lambda form}. ++ ++@IGindex lambda list ++@item @b{lambda list} ++ @i{n.} ++ a @i{list} that specifies a set of @i{parameters} ++ (sometimes called @i{lambda variables}) ++ and a protocol for receiving @i{values} for those @i{parameters}; ++ that is, ++ an @i{ordinary lambda list}, ++ an @i{extended lambda list}, ++ or a @i{modified lambda list}. ++ ++@IGindex lambda list keyword ++@item @b{lambda list keyword} ++ @i{n.} ++ a @i{symbol} whose @i{name} begins with @i{ampersand} ++ and that is specially recognized in a @i{lambda list}. ++ Note that no @i{standardized} @i{lambda list keyword} ++ is in the @t{KEYWORD} @i{package}. ++ ++@IGindex lambda variable ++@item @b{lambda variable} ++ @i{n.} ++ a @i{formal parameter}, used to emphasize the @i{variable}'s ++ relation to the @i{lambda list} that @i{established} it. ++ ++@IGindex leaf ++@item @b{leaf} ++ @i{n.} ++ 1. an @i{atom} in a @i{tree}_1. ++ 2. a terminal node of a @i{tree}_2. ++ ++@IGindex leap seconds ++@item @b{leap seconds} ++ @i{n.} ++ additional one-second intervals of time that are occasionally inserted ++ into the true calendar by official timekeepers as a correction similar ++ to ``leap years.'' All @r{Common Lisp} @i{time} representations ignore ++ @i{leap seconds}; every day is assumed to be exactly 86400 seconds ++ long. ++ ++@IGindex left-parenthesis ++@item @b{left-parenthesis} ++ @i{n.} ++ the @i{standard character} ``@t{(}'', ++ that is variously called ++ ``left parenthesis'' ++ or ``open parenthesis'' ++ See @i{Figure~2--5}. ++ ++@IGindex length ++@item @b{length} ++ @i{n.} (of a @i{sequence}) ++ the number of @i{elements} in the @i{sequence}. ++ (Note that if the @i{sequence} is a @i{vector} with a ++ @i{fill pointer}, its @i{length} is the same as the ++ @i{fill pointer} even though the total allocated size of ++ the @i{vector} might be larger.) ++ ++@IGindex lexical binding ++@item @b{lexical binding} ++ @i{n.} ++ a @i{binding} in a @i{lexical environment}. ++ ++@IGindex lexical closure ++@item @b{lexical closure} ++ @i{n.} ++ a @i{function} that, when invoked on @i{arguments}, executes ++ the body of a @i{lambda expression} in the @i{lexical environment} ++ that was captured at the time of the creation of the @i{lexical closure}, ++ augmented by @i{bindings} of the @i{function}'s @i{parameters} ++ to the corresponding @i{arguments}. ++ ++@IGindex lexical environment ++@item @b{lexical environment} ++ @i{n.} ++ that part of the @i{environment} that contains @i{bindings} ++ whose names have @i{lexical scope}. A @i{lexical environment} ++ contains, among other things: ++ ordinary @i{bindings} of @i{variable} @i{names} to @i{values}, ++ lexically @i{established} @i{bindings} of @i{function names} ++ to @i{functions}, ++ @i{macros}, ++ @i{symbol macros}, ++ @i{blocks}, ++ @i{tags}, ++ and ++ @i{local declarations} (see @b{declare}). ++ ++@IGindex lexical scope ++@item @b{lexical scope} ++ @i{n.} ++ @i{scope} that is limited to a spatial or textual region within the ++ establishing @i{form}. ++ ``The names of parameters to a function normally are lexically scoped.'' ++ ++@IGindex lexical variable ++@item @b{lexical variable} ++ @i{n.} ++ a @i{variable} the @i{binding} for which is in the ++ @i{lexical environment}. ++ ++@IGindex Lisp image ++@item @b{Lisp image} ++ @i{n.} ++ a running instantiation of a @r{Common Lisp} @i{implementation}. ++ A @i{Lisp image} is characterized by a single address space in which any ++ @i{object} can directly refer to any another in conformance with this specification, ++ and by a single, common, @i{global environment}. ++ (External operating systems sometimes call this a ++ ``core image,'' ++ ``fork,'' ++ ``incarnation,'' ++ ``job,'' ++ or ``process.'' Note however, that the issue of a ``process'' in such ++ an operating system is technically orthogonal to the issue of a @i{Lisp image} ++ being defined here. Depending on the operating system, a single ``process'' ++ might have multiple @i{Lisp images}, and multiple ``processes'' might reside ++ in a single @i{Lisp image}. Hence, it is the idea of a fully shared address ++ space for direct reference among all @i{objects} which is the defining ++ characteristic. Note, too, that two ``processes'' which have a communication ++ area that permits the sharing of some but not all @i{objects} are considered ++ to be distinct @i{Lisp images}.) ++ ++@IGindex Lisp printer ++@item @b{Lisp printer} ++ @i{n.} @i{Trad.} ++ the procedure that prints the character representation of an ++ @i{object} onto a @i{stream}. (This procedure is implemented ++ by the @i{function} @b{write}.) ++ ++@IGindex Lisp read-eval-print loop ++@item @b{Lisp read-eval-print loop} ++ @i{n.} @i{Trad.} ++ an endless loop that @i{reads}_2 a @i{form}, ++ @i{evaluates} it, ++ and prints (@i{i.e.}, @i{writes}_2) the results. ++ In many @i{implementations}, ++ the default mode of interaction with @r{Common Lisp} during program development ++ is through such a loop. ++ ++@IGindex Lisp reader ++@item @b{Lisp reader} ++ @i{n.} @i{Trad.} ++ the procedure that parses character representations of @i{objects} ++ from a @i{stream}, producing @i{objects}. ++ (This procedure is implemented by the @i{function} @b{read}.) ++ ++@IGindex list ++@item @b{list} ++ @i{n.} ++ 1. a chain of @i{conses} in which the @i{car} of each ++ @i{cons} is an @i{element} of the @i{list}, ++ and the @i{cdr} of each @i{cons} is either the next ++ link in the chain or a terminating @i{atom}. ++ See also @i{proper list}, ++ @i{dotted list}, ++ or @i{circular list}. ++ 2. the @i{type} that is the union of @b{null} and @b{cons}. ++ ++@IGindex list designator ++@item @b{list designator} ++ @i{n.} ++ a @i{designator} for a @i{list} of @i{objects}; that is, ++ an @i{object} that denotes a @i{list} ++ and that is one of: ++ a @i{non-nil} @i{atom} ++ (denoting a @i{singleton} @i{list} ++ whose @i{element} is that @i{non-nil} @i{atom}) ++ or a @i{proper list} (denoting itself). ++ ++@IGindex list structure ++@item @b{list structure} ++ @i{n.} (of a @i{list}) ++ the set of @i{conses} that make up the @i{list}. ++ Note that while the @i{car}_@{1b@} component of each such @i{cons} ++ is part of the @i{list structure}, ++ the @i{objects} that are @i{elements} of the @i{list} ++ (@i{i.e.}, the @i{objects} that are the @i{cars}_2 of each @i{cons} ++ in the @i{list}) ++ are not themselves part of its @i{list structure}, ++ even if they are @i{conses}, ++ except in the (@i{circular}_2) ++ case where the @i{list} ++ actually contains one of its @i{tails} as an @i{element}. ++ (The @i{list structure} of a @i{list} is sometimes redundantly ++ referred to as its ``top-level list structure'' in order to emphasize ++ that any @i{conses} that are @i{elements} of the @i{list} ++ are not involved.) ++ ++@IGindex literal ++@item @b{literal} ++ @i{adj.} (of an @i{object}) ++ referenced directly in a program rather than being computed by the program; ++ that is, ++ appearing as data in a @b{quote} @i{form}, ++ or, if the @i{object} is a @i{self-evaluating object}, ++ appearing as unquoted data. ++ ``In the form @t{(cons "one" '("two"))}, ++ the expressions @t{"one"}, @t{("two")}, and @t{"two"} ++ are literal objects.'' ++ ++@IGindex load ++@item @b{load} ++ @i{v.t.} (a @i{file}) ++ to cause the @i{code} contained in the @i{file} to be @i{executed}. ++ See the @i{function} @b{load}. ++ ++@IGindex load time ++@item @b{load time} ++ @i{n.} ++ the duration of time that the loader is @i{loading} @i{compiled code}. ++ ++@IGindex load time value ++@item @b{load time value} ++ @i{n.} ++ an @i{object} referred to in @i{code} by a @b{load-time-value} ++ @i{form}. The @i{value} of such a @i{form} is some specific ++ @i{object} which can only be computed in the run-time @i{environment}. ++ In the case of @i{file} @i{compilation}, the @i{value} is ++ computed once as part of the process of @i{loading} the @i{compiled file}, ++ and not again. See the @i{special operator} @b{load-time-value}. ++ ++@IGindex loader ++@item @b{loader} ++ @i{n.} ++ a facility that is part of Lisp and that @i{loads} a @i{file}. ++ See the @i{function} @b{load}. ++ ++@IGindex local declaration ++@item @b{local declaration} ++ @i{n.} ++ an @i{expression} which may appear only in specially designated ++ positions of certain @i{forms}, and which provides information about ++ the code contained within the containing @i{form}; ++ that is, a @b{declare} @i{expression}. ++ ++@IGindex local precedence order ++@item @b{local precedence order} ++ @i{n.} (of a @i{class}) ++ a @i{list} consisting of the @i{class} followed by its ++ @i{direct superclasses} in the order mentioned in the defining ++ @i{form} for the @i{class}. ++ ++@IGindex local slot ++@item @b{local slot} ++ @i{n.} (of a @i{class}) ++ a @i{slot} @i{accessible} in only one @i{instance}, ++ namely the @i{instance} in which the @i{slot} is allocated. ++ ++@IGindex logical block ++@item @b{logical block} ++ @i{n.} ++ a conceptual grouping of related output used by the @i{pretty printer}. ++ See the @i{macro} @b{pprint-logical-block} and @ref{Dynamic Control of the Arrangement of Output}. ++ ++@IGindex logical host ++@item @b{logical host} ++ @i{n.} ++ an @i{object} of @i{implementation-dependent} nature ++ that is used as the representation of a ``host'' in a @i{logical pathname}, ++ and that has an associated set of translation rules for converting ++ @i{logical pathnames} belonging to that host into @i{physical pathnames}. ++ See @ref{Logical Pathnames}. ++ ++@IGindex logical host designator ++@item @b{logical host designator} ++ @i{n.} ++ a @i{designator} for a @i{logical host}; that is, ++ an @i{object} that denotes a @i{logical host} ++ and that is one of: ++ a @i{string} (denoting the @i{logical host} that it names), ++ or a @i{logical host} (denoting itself). ++ (Note that because the representation of a @i{logical host} ++ is @i{implementation-dependent}, ++ it is possible that an @i{implementation} might represent ++ a @i{logical host} as the @i{string} that names it.) ++ ++@IGindex logical pathname ++@item @b{logical pathname} ++ @i{n.} ++ an @i{object} of @i{type} @b{logical-pathname}. ++ ++@IGindex long float ++@item @b{long float} ++ @i{n.} ++ an @i{object} of @i{type} @b{long-float}. ++ ++@IGindex loop keyword ++@item @b{loop keyword} ++ @i{n.} @i{Trad.} ++ a symbol that is a specially recognized part of the syntax of ++ an extended @b{loop} @i{form}. Such symbols are recognized by their ++ @i{name} (using @b{string=}), not by their identity; as such, they ++ may be in any package. A @i{loop keyword} is not a @i{keyword}. ++ ++@IGindex lowercase ++@item @b{lowercase} ++ @i{adj.} (of a @i{character}) ++ being among @i{standard characters} corresponding to ++ the small letters @t{a} through @t{z}, ++ or being some other @i{implementation-defined} @i{character} ++ that is defined by the @i{implementation} to be @i{lowercase}. ++ See @ref{Characters With Case}. ++ ++@end table ++@subheading @b{M} ++@table @asis ++ ++@IGindex macro ++@item @b{macro} ++ @i{n.} ++ 1. a @i{macro form} ++ 2. a @i{macro function}. ++ 3. a @i{macro name}. ++ ++@IGindex macro character ++@item @b{macro character} ++ @i{n.} ++ a @i{character} which, when encountered by the @i{Lisp reader} ++ in its main dispatch loop, introduces a @i{reader macro}_1. ++ (@i{Macro characters} have nothing to do with @i{macros}.) ++ ++@IGindex macro expansion ++@item @b{macro expansion} ++ @i{n.} ++ 1. the process of translating a @i{macro form} into another ++ @i{form}. ++ 2. the @i{form} resulting from this process. ++ ++@IGindex macro form ++@item @b{macro form} ++ @i{n.} ++ a @i{form} that stands for another @i{form} ++ (@i{e.g.}, for the purposes of abstraction, information hiding, ++ or syntactic convenience); ++ that is, ++ either a @i{compound form} whose first element is a @i{macro name}, ++ or a @i{form} that is a @i{symbol} that names a ++ @i{symbol macro}. ++ ++@IGindex macro function ++@item @b{macro function} ++ @i{n.} ++ a @i{function} of two arguments, a @i{form} and an ++ @i{environment}, that implements @i{macro expansion} by ++ producing a @i{form} to be evaluated in place of the original ++ argument @i{form}. ++ ++@IGindex macro lambda list ++@item @b{macro lambda list} ++ @i{n.} ++ an @i{extended lambda list} used in @i{forms} that @i{establish} ++ @i{macro} definitions, such as @b{defmacro} and @b{macrolet}. ++ See @ref{Macro Lambda Lists}. ++ ++@IGindex macro name ++@item @b{macro name} ++ @i{n.} ++ a @i{name} for which @b{macro-function} returns @i{true} ++ and which when used as the first element of a @i{compound form} ++ identifies that @i{form} as a @i{macro form}. ++ ++@IGindex macroexpand hook ++@item @b{macroexpand hook} ++ @i{n.} ++ the @i{function} that is the @i{value} of @b{*macroexpand-hook*}. ++ ++@IGindex mapping ++@item @b{mapping} ++ @i{n.} ++ 1. a type of iteration in which a @i{function} is successively ++ applied to @i{objects} taken from corresponding entries in ++ collections such as @i{sequences} or @i{hash tables}. ++ 2. @i{Math.} a relation between two sets in which each element of the ++ first set (the ``domain'') is assigned one element of the second ++ set (the ``range''). ++ ++@IGindex metaclass ++@item @b{metaclass} ++ @i{n.} ++ 1. a @i{class} whose instances are @i{classes}. ++ 2. (of an @i{object}) the @i{class} of the @i{class} of the @i{object}. ++ ++@IGindex Metaobject Protocol ++@item @b{Metaobject Protocol} ++ @i{n.} ++ one of many possible descriptions of how a @i{conforming implementation} ++ might implement various aspects of the object system. This description is beyond ++ the scope of this document, and no @i{conforming implementation} is ++ required to adhere to it except as noted explicitly in this specification. ++ Nevertheless, its existence helps to establish normative practice, ++ and implementors with no reason to diverge from it are encouraged to ++ consider making their @i{implementation} adhere to it where possible. ++ It is described in detail in @i{The Art of the Metaobject Protocol}. ++ ++@IGindex method ++@item @b{method} ++ @i{n.} ++ an @i{object} that is part of a @i{generic function} and which ++ provides information about how that @i{generic function} should ++ behave when its @i{arguments} are @i{objects} of certain ++ @i{classes} or with certain identities. ++ ++@IGindex method combination ++@item @b{method combination} ++ @i{n.} ++ 1. generally, the composition of a set of @i{methods} to produce an ++ @i{effective method} for a @i{generic function}. ++ 2. an object of @i{type} @b{method-combination}, which represents the details ++ of how the @i{method combination}_1 for one or more ++ specific @i{generic functions} is to be performed. ++ ++@IGindex method-defining form ++@item @b{method-defining form} ++ @i{n.} ++ a @i{form} that defines a @i{method} for a @i{generic function}, ++ whether explicitly or implicitly. ++ See @ref{Introduction to Generic Functions}. ++ ++@IGindex method-defining operator ++@item @b{method-defining operator} ++ @i{n.} ++ an @i{operator} corresponding to a @i{method-defining} @i{form}. ++ See @i{Figure~7--1}. ++ ++@IGindex minimal compilation ++@item @b{minimal compilation} ++ @i{n.} ++ actions the @i{compiler} must take at compile time. ++ See @ref{Compilation Semantics}. ++ ++@IGindex modified lambda list ++@item @b{modified lambda list} ++ @i{n.} ++ a list resembling an @i{ordinary lambda list} in form and purpose, ++ but which deviates in syntax or functionality from the definition of an ++ @i{ordinary lambda list}. ++ See @i{ordinary lambda list}. ++ ``@b{deftype} uses a modified lambda list.'' ++ ++@IGindex most recent ++@item @b{most recent} ++ @i{adj.} ++ innermost; ++ that is, having been @i{established} (and not yet @i{disestablished}) ++ more recently than any other of its kind. ++ ++@IGindex multiple escape ++@item @b{multiple escape} ++ @i{n.}, @i{adj.} ++ 1. @i{n.} the @i{syntax type} of a @i{character} ++ that is used in pairs to indicate that the enclosed @i{characters} ++ are to be treated as @i{alphabetic}_2 @i{characters} ++ with their @i{case} preserved. ++ For details, see @ref{Multiple Escape Characters}. ++ 2. @i{adj.} (of a @i{character}) ++ having the @i{multiple escape} @i{syntax type}. ++ 3. @i{n.} a @i{multiple escape}_2 @i{character}. ++ (In the @i{standard readtable}, ++ @i{vertical-bar} is a @i{multiple escape} @i{character}.) ++ ++@IGindex multiple values ++@item @b{multiple values} ++ @i{n.} ++ 1. more than one @i{value}. ++ ``The function @b{truncate} returns multiple values.'' ++ 2. a variable number of @i{values}, possibly including zero or one. ++ ``The function @b{values} returns multiple values.'' ++ 3. a fixed number of values other than one. ++ ``The macro @b{multiple-value-bind} is among the few ++ operators in @r{Common Lisp} which can detect and manipulate ++ multiple values.'' ++ ++@end table ++@subheading @b{N} ++@table @asis ++ ++@IGindex name ++@item @b{name} ++ @i{n.}, @i{v.t.} ++ 1. @i{n.} an @i{identifier} by which an @i{object}, ++ a @i{binding}, or an @i{exit point} ++ is referred to by association using a @i{binding}. ++ 2. @i{v.t.} to give a @i{name} to. ++ 3. @i{n.} (of an @i{object} having a name component) ++ the @i{object} which is that component. ++ ``The string which is a symbol's name is returned ++ by @b{symbol-name}.'' ++ 4. @i{n.} (of a @i{pathname}) ++ a. the name component, returned by @b{pathname-name}. ++ b. the entire namestring, returned by @b{namestring}. ++ 5. @i{n.} (of a @i{character}) ++ a @i{string} that names the @i{character} ++ and that has @i{length} greater than one. ++ (All @i{non-graphic} @i{characters} are required to have @i{names} ++ unless they have some @i{implementation-defined} @i{attribute} ++ which is not @i{null}. Whether or not other @i{characters} ++ have @i{names} is @i{implementation-dependent}.) ++ ++@IGindex named constant ++@item @b{named constant} ++ @i{n.} ++ a @i{variable} that is defined by @r{Common Lisp}, ++ by the @i{implementation}, ++ or by user code (see the @i{macro} @b{defconstant}) ++ to always @i{yield} the same @i{value} when @i{evaluated}. ++ ``The value of a named constant may not be changed ++ by assignment or by binding.'' ++ ++@IGindex namespace ++@item @b{namespace} ++ @i{n.} ++ 1. @i{bindings} whose denotations are restricted to a particular kind. ++ ``The bindings of names to tags is the tag namespace.'' ++ 2. any @i{mapping} whose domain is a set of @i{names}. ++ ``A package defines a namespace.'' ++ ++@IGindex namestring ++@item @b{namestring} ++ @i{n.} ++ a @i{string} that represents a @i{filename} ++ using either the @i{standardized} notation for naming @i{logical pathnames} ++ described in @ref{Syntax of Logical Pathname Namestrings}, ++ or some @i{implementation-defined} notation for naming a @i{physical pathname}. ++ ++@IGindex newline ++@item @b{newline} ++ @i{n.} ++ the @i{standard character} <@i{Newline}>, ++ notated for the @i{Lisp reader} as @t{#\Newline}. ++ ++@IGindex next method ++@item @b{next method} ++ @i{n.} ++ the next @i{method} to be invoked with respect to a given ++ @i{method} for a particular set of arguments or argument ++ @i{classes}. ++ See @ref{Applying method combination to the sorted list of applicable methods}. ++ ++@IGindex nickname ++@item @b{nickname} ++ @i{n.} (of a @i{package}) ++ one of possibly several @i{names} that can be used to refer to ++ the @i{package} but that is not the primary @i{name} ++ of the @i{package}. ++ ++@IGindex nil ++@item @b{nil} ++ @i{n.} ++ the @i{object} that is at once ++ the @i{symbol} named @t{"NIL"} in the @t{COMMON-LISP} @i{package}, ++ the @i{empty list}, ++ the @i{boolean} (or @i{generalized boolean}) representing @i{false}, ++ and the @i{name} of the @i{empty type}. ++ ++@IGindex non-atomic ++@item @b{non-atomic} ++ @i{adj.} ++ being other than an @i{atom}; @i{i.e.}, being a @i{cons}. ++ ++@IGindex non-constant variable ++@item @b{non-constant variable} ++ @i{n.} ++ a @i{variable} that is not a @i{constant variable}. ++ ++@IGindex non-correctable ++@item @b{non-correctable} ++ @i{adj.} (of an @i{error}) ++ not intentionally @i{correctable}. ++ (Because of the dynamic nature of @i{restarts}, ++ it is neither possible nor generally useful to completely prohibit ++ an @i{error} from being @i{correctable}. ++ This term is used in order to express an intent that no special effort ++ should be made by @i{code} signaling an @i{error} to make ++ that @i{error} @i{correctable}; ++ however, there is no actual requirement on @i{conforming programs} ++ or @i{conforming implementations} imposed by this term.) ++ ++@IGindex non-empty ++@item @b{non-empty} ++ @i{adj.} ++ having at least one @i{element}. ++ ++@IGindex non-generic function ++@item @b{non-generic function} ++ @i{n.} ++ a @i{function} that is not a @i{generic function}. ++ ++@IGindex non-graphic ++@item @b{non-graphic} ++ @i{adj.} (of a @i{character}) ++ not @i{graphic}. ++ See @ref{Graphic Characters}. ++ ++@IGindex non-list ++@item @b{non-list} ++ @i{n.}, @i{adj.} ++ other than a @i{list}; @i{i.e.}, a @i{non-nil} @i{atom}. ++ ++@IGindex non-local exit ++@item @b{non-local exit} ++ @i{n.} ++ a transfer of control (and sometimes @i{values}) to ++ an @i{exit point} for reasons other than a @i{normal return}. ++ ``The operators @b{go}, @b{throw}, ++ and @b{return-from} cause a non-local exit.'' ++ ++@IGindex non-nil ++@item @b{non-nil} ++ @i{n.}, @i{adj.} ++ not @b{nil}. Technically, any @i{object} which is not @b{nil} can be ++ referred to as @i{true}, but that would tend to imply a unique view ++ of the @i{object} as a @i{generalized boolean}. ++ Referring to such an @i{object} as @i{non-nil} avoids this implication. ++ ++@IGindex non-null lexical environment ++@item @b{non-null lexical environment} ++ @i{n.} ++ a @i{lexical environment} that has additional information not present in ++ the @i{global environment}, such as one or more @i{bindings}. ++ ++@IGindex non-simple ++@item @b{non-simple} ++ @i{adj.} ++ not @i{simple}. ++ ++@IGindex non-terminating ++@item @b{non-terminating} ++ @i{adj.} (of a @i{macro character}) ++ being such that it is treated as a constituent @i{character} ++ when it appears in the middle of an extended token. ++ See @ref{Reader Algorithm}. ++ ++@IGindex non-top-level form ++@item @b{non-top-level form} ++ @i{n.} ++ a @i{form} that, by virtue of its position as a @i{subform} ++ of another @i{form}, is not a @i{top level form}. ++ See @ref{Processing of Top Level Forms}. ++ ++@IGindex normal return ++@item @b{normal return} ++ @i{n.} ++ the natural transfer of control and @i{values} which occurs after ++ the complete @i{execution} of a @i{form}. ++ ++@IGindex normalized ++@item @b{normalized} ++ @i{adj.}, @i{ANSI}, @i{IEEE} (of a @i{float}) ++ conforming to the description of ``normalized'' as described by @i{IEEE Standard for Binary Floating-Point Arithmetic}. ++ See @i{denormalized}. ++ ++@IGindex null ++@item @b{null} ++ @i{adj.}, @i{n.} ++ 1. @i{adj.} ++ a. (of a @i{list}) having no @i{elements}: empty. See @i{empty list}. ++ b. (of a @i{string}) having a @i{length} of zero. ++ (It is common, both within this document and in observed spoken behavior, ++ to refer to an empty string by an apparent definite reference, ++ as in ``the @i{null} @i{string}'' even though no attempt is made to ++ @i{intern}_2 null strings. The phrase ++ ``a @i{null} @i{string}'' is technically more correct, ++ but is generally considered awkward by most Lisp programmers. ++ As such, the phrase ``the @i{null} @i{string}'' ++ should be treated as an indefinite reference in all cases ++ except for anaphoric references.) ++ c. (of an @i{implementation-defined} @i{attribute} of a @i{character}) ++ An @i{object} to which the value of that @i{attribute} defaults ++ if no specific value was requested. ++ 2. @i{n.} an @i{object} of @i{type} @b{null} (the only such @i{object} being @b{nil}). ++ ++@IGindex null lexical environment ++@item @b{null lexical environment} ++ @i{n.} ++ the @i{lexical environment} which has no @i{bindings}. ++ ++@IGindex number ++@item @b{number} ++ @i{n.} ++ an @i{object} of @i{type} @b{number}. ++ ++@IGindex numeric ++@item @b{numeric} ++ @i{adj.} (of a @i{character}) ++ being one of the @i{standard characters} @t{0} through @i{9}, ++ or being some other @i{graphic} @i{character} ++ defined by the @i{implementation} to be @i{numeric}. ++ ++@end table ++@subheading @b{O} ++@table @asis ++ ++@IGindex object ++@item @b{object} ++ @i{n.} ++ 1. any Lisp datum. ++ ``The function @b{cons} creates an object which refers ++ to two other objects.'' ++ 2. (immediately following the name of a @i{type}) ++ an @i{object} which is of that @i{type}, used to emphasize that the ++ @i{object} is not just a @i{name} for an object of that @i{type} ++ but really an @i{element} of the @i{type} in cases where @i{objects} ++ of that @i{type} (such as @b{function} or @b{class}) are commonly ++ referred to by @i{name}. ++ ``The function @b{symbol-function} takes a function name ++ and returns a function object.'' ++ ++@IGindex object-traversing ++@item @b{object-traversing} ++ @i{adj.} ++ operating in succession on components of an @i{object}. ++ ``The operators @b{mapcar}, @b{maphash}, ++ @b{with-package-iterator} and @b{count} ++ perform object-traversing operations.'' ++ ++@IGindex open ++@item @b{open} ++ @i{adj.}, @i{v.t.} (a @i{file}) ++ 1. @i{v.t.} to create and return a @i{stream} to the @i{file}. ++ 2. @i{adj.} (of a @i{stream}) ++ having been @i{opened}_1, but not yet @i{closed}. ++ ++@IGindex operator ++@item @b{operator} ++ @i{n.} ++ 1. a @i{function}, @i{macro}, or @i{special operator}. ++ 2. a @i{symbol} that names ++ such a @i{function}, @i{macro}, or @i{special operator}. ++ 3. (in a @b{function} @i{special form}) ++ the @i{cadr} of the @b{function} @i{special form}, which ++ might be either an @i{operator}_2 or a @i{lambda expression}. ++ 4. (of a @i{compound form}) ++ the @i{car} of the @i{compound form}, which might be ++ either an @i{operator}_2 ++ or a @i{lambda expression}, and which is never @t{(setf @i{symbol})}. ++ ++@IGindex optimize quality ++@item @b{optimize quality} ++ @i{n.} ++ one of several aspects of a program that might be optimizable by ++ certain compilers. Since optimizing one such quality ++ might conflict with optimizing another, relative priorities for ++ qualities can be established in an @b{optimize} @i{declaration}. ++ The @i{standardized} @i{optimize qualities} are ++ @t{compilation-speed} (speed of the compilation process), ++ ++ @t{debug} (ease of debugging), ++ ++ @t{safety} (run-time error checking), ++ @t{space} (both code size and run-time space), ++ and ++ @t{speed} (of the object code). ++ @i{Implementations} may define additional @i{optimize qualities}. ++ ++@IGindex optional parameter ++@item @b{optional parameter} ++ @i{n.} ++ A @i{parameter} for which a corresponding positional @i{argument} ++ is optional. If the @i{argument} is not supplied, a default value ++ is used. See also @i{supplied-p parameter}. ++ ++@IGindex ordinary function ++@item @b{ordinary function} ++ @i{n.} ++ a @i{function} that is not a @i{generic function}. ++ ++@IGindex ordinary lambda list ++@item @b{ordinary lambda list} ++ @i{n.} ++ the kind of @i{lambda list} used by @b{lambda}. ++ See @i{modified lambda list} and @i{extended lambda list}. ++ ``@b{defun} uses an ordinary lambda list.'' ++ ++@IGindex otherwise inaccessible part ++@item @b{otherwise inaccessible part} ++ @i{n.} (of an @i{object}, O_1) ++ an @i{object}, O_2, which would be made @i{inaccessible} if ++ O_1 were made @i{inaccessible}. (Every @i{object} is an ++ @i{otherwise inaccessible part} of itself.) ++ ++@IGindex output ++@item @b{output} ++ @i{adj.} (of a @i{stream}) ++ supporting output operations (@i{i.e.}, being a ``data sink''). ++ An @i{output} @i{stream} might also be an @i{input} @i{stream}, ++ in which case it is sometimes called a @i{bidirectional} @i{stream}. ++ See the @i{function} @b{output-stream-p}. ++ ++@end table ++@subheading @b{P} ++@table @asis ++ ++@IGindex package ++@item @b{package} ++ @i{n.} ++ an @i{object} of @i{type} @b{package}. ++ ++@IGindex package cell ++@item @b{package cell} ++ @i{n.} @i{Trad.} (of a @i{symbol}) ++ The @i{place} in a @i{symbol} that holds one of ++ possibly several @i{packages} in which the @i{symbol} is ++ @i{interned}, called the @i{home package}, or which holds ++ @b{nil} if no such @i{package} exists or is known. ++ See the @i{function} @b{symbol-package}. ++ ++@IGindex package designator ++@item @b{package designator} ++ @i{n.} ++ a @i{designator} for a @i{package}; that is, ++ an @i{object} that denotes a @i{package} ++ and that is one of: ++ a @i{string designator} ++ (denoting the @i{package} that has the @i{string} ++ that it designates as its @i{name} ++ or as one of its @i{nicknames}), ++ or a @i{package} (denoting itself). ++ ++@IGindex package marker ++@item @b{package marker} ++ @i{n.} ++ a character which is used in the textual notation for a symbol ++ to separate the package name from the symbol name, and which ++ is @i{colon} in the @i{standard readtable}. ++ See @ref{Character Syntax}. ++ ++@IGindex package prefix ++@item @b{package prefix} ++ @i{n.} ++ a notation preceding the @i{name} of a @i{symbol} in text that is ++ processed by the @i{Lisp reader}, which uses a @i{package} @i{name} ++ followed by one or more @i{package markers}, and which indicates that ++ the symbol is looked up in the indicated @i{package}. ++ ++@IGindex package registry ++@item @b{package registry} ++ @i{n.} ++ A mapping of @i{names} to @i{package} @i{objects}. ++ It is possible for there to be a @i{package} @i{object} which is not ++ in this mapping; such a @i{package} is called an @i{unregistered package}. ++ @i{Operators} such as @b{find-package} consult this mapping in order ++ to find a @i{package} from its @i{name}. ++ @i{Operators} such as @b{do-all-symbols}, @b{find-all-symbols}, ++ and @b{list-all-packages} operate only on @i{packages} that exist ++ in the @i{package registry}. ++ ++@IGindex pairwise ++@item @b{pairwise} ++ @i{adv.} (of an adjective on a set) ++ applying individually to all possible pairings of elements of the set. ++ ``The types A, B, and C are pairwise disjoint if ++ A and B are disjoint, ++ B and C are disjoint, and ++ A and C are disjoint.'' ++ ++@IGindex parallel ++@item @b{parallel} ++ @i{adj.} @i{Trad.} (of @i{binding} or @i{assignment}) ++ done in the style of @b{psetq}, @b{let}, or @b{do}; ++ that is, first evaluating all of the @i{forms} that produce @i{values}, ++ and only then @i{assigning} or @i{binding} the @i{variables} (or @i{places}). ++ Note that this does not imply traditional computational ``parallelism'' ++ since the @i{forms} that produce @i{values} are evaluated @i{sequentially}. ++ See @i{sequential}. ++ ++@IGindex parameter ++@item @b{parameter} ++ @i{n.} ++ 1. (of a @i{function}) ++ a @i{variable} in the definition of a @i{function} ++ which takes on the @i{value} of a corresponding @i{argument} ++ (or of a @i{list} of corresponding arguments) ++ to that @i{function} when it is called, ++ or ++ which in some cases is given a default value because there ++ is no corresponding @i{argument}. ++ 2. (of a @i{format directive}) ++ an @i{object} received as data flow by a @i{format directive} ++ due to a prefix notation within the @i{format string} at the ++ @i{format directive}'s point of use. ++ See @ref{Formatted Output}. ++ ``In @t{"~3,'0D"}, the number @t{3} and the character ++ @t{#\0} are parameters to the @t{~D} format directive.'' ++ ++@IGindex parameter specializer ++@item @b{parameter specializer} ++ @i{n.} ++ 1. (of a @i{method}) an @i{expression} which constrains the ++ @i{method} to be applicable only to @i{argument} sequences ++ in which the corresponding @i{argument} matches the ++ @i{parameter specializer}. ++ 2. a @i{class}, ++ or a @i{list} @t{(eql @i{object})}. ++ ++@IGindex parameter specializer name ++@item @b{parameter specializer name} ++ @i{n.} ++ 1. (of a @i{method} definition) an expression used in code to ++ name a @i{parameter specializer}. ++ See @ref{Introduction to Methods}. ++ 2. a @i{class}, ++ ++ a @i{symbol} naming a @i{class}, ++ ++ or a @i{list} @t{(eql @i{form})}. ++ ++@IGindex pathname ++@item @b{pathname} ++ @i{n.} ++ an @i{object} of @i{type} @b{pathname}, which is a structured representation ++ of the name of a @i{file}. A @i{pathname} has six components: ++ a ``host,'' ++ a ``device,'' ++ a ``directory,'' ++ a ``name,'' ++ a ``type,'' and ++ a ``version.'' ++ ++@IGindex pathname designator ++@item @b{pathname designator} ++ @i{n.} ++ a @i{designator} for a @i{pathname}; that is, ++ an @i{object} that denotes a @i{pathname} ++ and that is one of: ++ ++ a @i{pathname} @i{namestring} ++ ++ (denoting the corresponding @i{pathname}), ++ ++ a @i{stream associated with a file} ++ (denoting the @i{pathname} used to open the @i{file}; ++ this may be, but is not required to be, the actual name of the @i{file}), ++ or a @i{pathname} (denoting itself). ++ See @ref{File Operations on Open and Closed Streams}. ++ ++@IGindex physical pathname ++@item @b{physical pathname} ++ @i{n.} ++ a @i{pathname} that is not a @i{logical pathname}. ++ ++[Editorial Note by KMP: Still need to reconcile some confusion in the uses of ``generalized ++ reference'' and ``place.'' I think one was supposed to refer to the ++ abstract concept, and the other to an object (a form), but the usages ++ have become blurred.] ++ ++@IGindex place ++@item @b{place} ++ @i{n.} ++ 1. a @i{form} which is suitable for use as a @i{generalized reference}. ++ 2. the conceptual location referred to by such a @i{place}_1. ++ ++@IGindex plist ++@item @b{plist} ++ pronounced 'p\=e ,list @i{n.} ++ a @i{property list}. ++ ++@IGindex portable ++@item @b{portable} ++ @i{adj.} (of @i{code}) ++ required to produce equivalent results and observable side effects ++ in all @i{conforming implementations}. ++ ++@IGindex potential copy ++@item @b{potential copy} ++ @i{n.} (of an @i{object} O_1 subject to constriants) ++ an @i{object} O_2 that if the specified constraints are satisfied ++ by O_1 without any modification might or might not be @i{identical} ++ to O_1, or else that must be a @i{fresh} @i{object} that ++ resembles a @i{copy} of O_1 except that it has been modified as ++ necessary to satisfy the constraints. ++ ++@IGindex potential number ++@item @b{potential number} ++ @i{n.} ++ A textual notation that might be parsed by the @i{Lisp reader} ++ in some @i{conforming implementation} as a @i{number} ++ but is not required to be parsed as a @i{number}. ++ No @i{object} is a @i{potential number}---either an @i{object} is ++ a @i{number} or it is not. ++ See @ref{Potential Numbers as Tokens}. ++ ++@IGindex pprint dispatch table ++@item @b{pprint dispatch table} ++ @i{n.} ++ an @i{object} that can be the @i{value} of @b{*print-pprint-dispatch*} ++ and hence can control how @i{objects} are printed when ++ @b{*print-pretty*} is @i{true}. ++ See @ref{Pretty Print Dispatch Tables}. ++ ++@IGindex predicate ++@item @b{predicate} ++ @i{n.} ++ a @i{function} that returns a @i{generalized boolean} ++ as its first value. ++ ++@IGindex present ++@item @b{present} ++ @i{n.} ++ 1. (of a @i{feature} in a @i{Lisp image}) ++ a state of being that is in effect if and only if the @i{symbol} ++ naming the @i{feature} is an @i{element} of the @i{features list}. ++ 2. (of a @i{symbol} in a @i{package}) ++ being accessible in that @i{package} directly, ++ rather than being inherited from another @i{package}. ++ ++@IGindex pretty print ++@item @b{pretty print} ++ @i{v.t.} (an @i{object}) ++ to invoke the @i{pretty printer} on the @i{object}. ++ ++@IGindex pretty printer ++@item @b{pretty printer} ++ @i{n.} ++ the procedure that prints the character representation of an ++ @i{object} onto a @i{stream} when the @i{value} of ++ @b{*print-pretty*} is @i{true}, ++ and that uses layout techniques (@i{e.g.}, indentation) that ++ tend to highlight the structure of the @i{object} in a way that ++ makes it easier for human readers to parse visually. ++ See the @i{variable} @b{*print-pprint-dispatch*} and @ref{The Lisp Pretty Printer}. ++ ++@IGindex pretty printing stream ++@item @b{pretty printing stream} ++ @i{n.} ++ a @i{stream} that does pretty printing. Such streams are created by ++ the @i{function} @b{pprint-logical-block} as a link between the output stream ++ and the logical block. ++ ++@IGindex primary method ++@item @b{primary method} ++ @i{n.} ++ a member of one of two sets of @i{methods} ++ (the set of @i{auxiliary methods} is the other) ++ that form an exhaustive partition of the set of @i{methods} ++ on the @i{method}'s @i{generic function}. ++ How these sets are determined is dependent on the @i{method combination} type; ++ see @ref{Introduction to Methods}. ++ ++@IGindex primary value ++@item @b{primary value} ++ @i{n.} (of @i{values} resulting from the ++ @i{evaluation} of a @i{form}) ++ the first @i{value}, if any, or else @b{nil} if there are no @i{values}. ++ ``The primary value returned by @b{truncate} is an ++ integer quotient, truncated toward zero.'' ++ ++@IGindex principal ++@item @b{principal} ++ @i{adj.} (of a value returned by a @r{Common Lisp} @i{function} that ++ implements a mathematically irrational or transcendental ++ function defined in the complex domain) ++ of possibly many (sometimes an infinite number of) correct values for the ++ mathematical function, being the particular @i{value} which the corresponding ++ @r{Common Lisp} @i{function} has been defined to return. ++ ++@IGindex print name ++@item @b{print name} ++ @i{n.} @i{Trad.} (usually of a @i{symbol}) ++ a @i{name}_3. ++ ++@IGindex printer control variable ++@item @b{printer control variable} ++ @i{n.} ++ a @i{variable} whose specific purpose is to control some action ++ of the @i{Lisp printer}; that is, one of the @i{variables} ++ in @i{Figure~22--1}, ++ or else some @i{implementation-defined} @i{variable} which is ++ defined by the @i{implementation} to be a @i{printer control variable}. ++ ++@IGindex printer escaping ++@item @b{printer escaping} ++ @i{n.} ++ The combined state of the @i{printer control variables} ++ @b{*print-escape*} and @b{*print-readably*}. ++ If the value of either @b{*print-readably*} or @b{*print-escape*} is @i{true}, ++ then @i{printer escaping} ++@IGindex printer escaping ++ is ``enabled''; ++ otherwise (if the values of both @b{*print-readably*} and @b{*print-escape*} ++ are @i{false}), ++ then @i{printer escaping} is ``disabled''. ++ ++@IGindex printing ++@item @b{printing} ++ @i{adj.} (of a @i{character}) ++ being a @i{graphic} @i{character} other than @i{space}. ++ ++@IGindex process ++@item @b{process} ++ @i{v.t.} (a @i{form} by the @i{compiler}) ++ to perform @i{minimal compilation}, determining the time of ++ evaluation for a @i{form}, and possibly @i{evaluating} that ++ @i{form} (if required). ++ ++@IGindex processor ++@item @b{processor} ++ @i{n.}, @i{ANSI} ++ an @i{implementation}. ++ ++@IGindex proclaim ++@item @b{proclaim} ++ @i{v.t.} (a @i{proclamation}) ++ to @i{establish} that @i{proclamation}. ++ ++@IGindex proclamation ++@item @b{proclamation} ++ @i{n.} ++ a @i{global declaration}. ++ ++@IGindex prog tag ++@item @b{prog tag} ++ @i{n.} @i{Trad.} ++ a @i{go tag}. ++ ++@IGindex program ++@item @b{program} ++ @i{n.} @i{Trad.} ++ @r{Common Lisp} @i{code}. ++ ++@IGindex programmer ++@item @b{programmer} ++ @i{n.} ++ an active entity, typically a human, that writes a @i{program}, ++ and that might or might not also be a @i{user} of the @i{program}. ++ ++@IGindex programmer code ++@item @b{programmer code} ++ @i{n.} ++ @i{code} that is supplied by the programmer; ++ that is, @i{code} that is not @i{system code}. ++ ++@IGindex proper list ++@item @b{proper list} ++ @i{n.} ++ A @i{list} terminated by the @i{empty list}. ++ (The @i{empty list} is a @i{proper list}.) ++ See @i{improper list}. ++ ++@IGindex proper name ++@item @b{proper name} ++ @i{n.} (of a @i{class}) ++ a @i{symbol} that @i{names} the @i{class} whose @i{name} ++ is that @i{symbol}. ++ See the @i{functions} @b{class-name} and @b{find-class}. ++ ++@IGindex proper sequence ++@item @b{proper sequence} ++ @i{n.} ++ a @i{sequence} which is not an @i{improper list}; ++ that is, a @i{vector} or a @i{proper list}. ++ ++@IGindex proper subtype ++@item @b{proper subtype} ++ @i{n.} (of a @i{type}) ++ a @i{subtype} of the @i{type} which is not the @i{same} @i{type} ++ as the @i{type} (@i{i.e.}, its @i{elements} are a ``proper subset'' of the ++ @i{type}). ++ ++@IGindex property ++@item @b{property} ++ @i{n.} (of a @i{property list}) ++ 1. a conceptual pairing of a @i{property indicator} and its ++ associated @i{property value} on a @i{property list}. ++ 2. a @i{property value}. ++ ++@IGindex property indicator ++@item @b{property indicator} ++ @i{n.} (of a @i{property list}) ++ the @i{name} part of a @i{property}, used as a @i{key} ++ when looking up a @i{property value} on a @i{property list}. ++ ++@IGindex property list ++@item @b{property list} ++ @i{n.} ++ ++ 1. a @i{list} containing an even number of @i{elements} that are ++ alternating @i{names} (sometimes called @i{indicators} ++ or @i{keys}) and @i{values} (sometimes called @i{properties}). ++ When there is more than one @i{name} and @i{value} pair with ++ the @i{identical} @i{name} in a @i{property list}, ++ the first such pair determines the @i{property}. ++ ++ 2. (of a @i{symbol}) ++ the component of the @i{symbol} containing a @i{property list}. ++ ++@IGindex property value ++@item @b{property value} ++ @i{n.} (of a @i{property indicator} on ++ a @i{property list}) ++ the @i{object} associated with the @i{property indicator} ++ on the @i{property list}. ++ ++@IGindex purports to conform ++@item @b{purports to conform} ++ @i{v.} ++ makes a good-faith claim of conformance. ++ This term expresses intention to conform, regardless of whether the ++ goal of that intention is realized in practice. ++ For example, language implementations have been known to have bugs, ++ and while an @i{implementation} of this specification with bugs ++ might not be a @i{conforming implementation}, it can still ++ @i{purport to conform}. This is an important distinction in ++ certain specific cases; @i{e.g.}, see the @i{variable} @b{*features*}. ++ ++@end table ++@subheading @b{Q} ++@table @asis ++ ++@IGindex qualified method ++@item @b{qualified method} ++ @i{n.} ++ a @i{method} that has one or more @i{qualifiers}. ++ ++@IGindex qualifier ++@item @b{qualifier} ++ @i{n.} (of a @i{method} for a @i{generic function}) ++ one of possibly several @i{objects} used to annotate the @i{method} ++ in a way that identifies its role in the @i{method combination}. ++ The @i{method combination} @i{type} determines ++ how many @i{qualifiers} are permitted for each @i{method}, ++ which @i{qualifiers} are permitted, ++ and ++ the semantics of those @i{qualifiers}. ++ ++@IGindex query I/O ++@item @b{query I/O} ++ @i{n.} ++ the @i{bidirectional} @i{stream} ++ that is the @i{value} of the @i{variable} @b{*query-io*}. ++ ++@IGindex quoted object ++@item @b{quoted object} ++ @i{n.} ++ an @i{object} which is the second element of a ++ @b{quote} @i{form}. ++ ++@end table ++@subheading @b{R} ++@table @asis ++ ++@IGindex radix ++@item @b{radix} ++ @i{n.} ++ an @i{integer} between 2 and 36, inclusive, which can be used ++ to designate a base with respect to which certain kinds of numeric ++ input or output are performed. ++ (There are n valid digit characters for any given @i{radix} n, ++ and those digits are the first n digits in the sequence ++ @t{0}, @t{1}, ..., @t{9}, @t{A}, @t{B}, ..., @t{Z}, ++ which have the weights ++ @t{0}, @t{1}, ..., @t{9}, @t{10}, @t{11}, ..., @t{35}, ++ respectively. ++ Case is not significant in parsing numbers of radix greater ++ than @t{10}, so ``9b8a'' and ``9B8A'' denote the same @i{radix} ++ @t{16} number.) ++ ++@IGindex random state ++@item @b{random state} ++ @i{n.} ++ an @i{object} of @i{type} @b{random-state}. ++ ++@IGindex rank ++@item @b{rank} ++ @i{n.} ++ a non-negative @i{integer} indicating the number of ++ @i{dimensions} of an @i{array}. ++ ++@IGindex ratio ++@item @b{ratio} ++ @i{n.} ++ an @i{object} of @i{type} @b{ratio}. ++ ++@IGindex ratio marker ++@item @b{ratio marker} ++ @i{n.} ++ a character which is used in the textual notation for a @i{ratio} ++ to separate the numerator from the denominator, and which ++ is @i{slash} in the @i{standard readtable}. ++ See @ref{Character Syntax}. ++ ++@IGindex rational ++@item @b{rational} ++ @i{n.} ++ an @i{object} of @i{type} @b{rational}. ++ ++@IGindex read ++@item @b{read} ++ @i{v.t.} ++ ++ 1. (a @i{binding} or @i{slot} or component) ++ to obtain the @i{value} of the @i{binding} or @i{slot}. ++ ++ 2. (an @i{object} from a @i{stream}) ++ to parse an @i{object} from its representation on the @i{stream}. ++ ++@IGindex readably ++@item @b{readably} ++ @i{adv.} (of a manner of printing an @i{object} O_1) ++ in such a way as to permit the @i{Lisp Reader} to later @i{parse} ++ the printed output into an @i{object} O_2 that is @i{similar} to O_1. ++ ++@IGindex reader ++@item @b{reader} ++ @i{n.} ++ 1. a @i{function} that @i{reads}_1 a @i{variable} or @i{slot}. ++ 2. the @i{Lisp reader}. ++ ++@IGindex reader macro ++@item @b{reader macro} ++ @i{n.} ++ 1. a textual notation introduced by dispatch on one or two @i{characters} ++ that defines special-purpose syntax for use by the @i{Lisp reader}, ++ and that is implemented by a @i{reader macro function}. ++ See @ref{Reader Algorithm}. ++ 2. the @i{character} or @i{characters} that introduce ++ a @i{reader macro}_1; that is, ++ a @i{macro character} ++ or the conceptual pairing of a @i{dispatching macro character} and the ++ @i{character} that follows it. ++ (A @i{reader macro} is not a kind of @i{macro}.) ++ ++@IGindex reader macro function ++@item @b{reader macro function} ++ @i{n.} ++ a @i{function} @i{designator} that denotes a @i{function} ++ that implements a @i{reader macro}_2. ++ See the @i{functions} @b{set-macro-character} and @b{set-dispatch-macro-character}. ++ ++@IGindex readtable ++@item @b{readtable} ++ @i{n.} ++ an @i{object} of @i{type} @b{readtable}. ++ ++@IGindex readtable case ++@item @b{readtable case} ++ @i{n.} ++ an attribute of a @i{readtable} ++ whose value is a @i{case sensitivity mode}, ++ and that selects the manner in which @i{characters} ++ in a @i{symbol}'s @i{name} are to be treated by ++ the @i{Lisp reader} ++ and the @i{Lisp printer}. ++ See @ref{Effect of Readtable Case on the Lisp Reader} and @ref{Effect of Readtable Case on the Lisp Printer}. ++ ++@IGindex readtable designator ++@item @b{readtable designator} ++ @i{n.} ++ a @i{designator} for a @i{readtable}; that is, ++ an @i{object} that denotes a @i{readtable} ++ and that is one of: ++ @b{nil} (denoting the @i{standard readtable}), ++ or a @i{readtable} (denoting itself). ++ ++@IGindex recognizable subtype ++@item @b{recognizable subtype} ++ @i{n.} (of a @i{type}) ++ a @i{subtype} of the @i{type} which can be reliably detected ++ to be such by the @i{implementation}. ++ See the @i{function} @b{subtypep}. ++ ++@IGindex reference ++@item @b{reference} ++ @i{n.}, @i{v.t.} ++ 1. @i{n.} an act or occurrence of referring to an @i{object}, ++ a @i{binding}, an @i{exit point}, a @i{tag}, ++ or an @i{environment}. ++ 2. @i{v.t.} to refer to an @i{object}, a @i{binding}, an ++ @i{exit point}, a @i{tag}, or an @i{environment}, ++ usually by @i{name}. ++ ++@IGindex registered package ++@item @b{registered package} ++ @i{n.} ++ a @i{package} @i{object} that is installed in the @i{package registry}. ++ (Every @i{registered package} has a @i{name} that is a @i{string}, ++ as well as zero or more @i{string} nicknames. ++ All @i{packages} that are initially specified by @r{Common Lisp} ++ or created by @b{make-package} or @b{defpackage} ++ are @i{registered packages}. @i{Registered packages} can be turned into ++ @i{unregistered packages} by @b{delete-package}.) ++ ++@IGindex relative ++@item @b{relative} ++ @i{adj.} ++ 1. (of a @i{time}) ++ representing an offset from an @i{absolute} @i{time} ++ in the units appropriate to that time. ++ For example, ++ a @i{relative} @i{internal time} is the difference between ++ two @i{absolute} @i{internal times}, and is measured in ++ @i{internal time units}. ++ 2. (of a @i{pathname}) ++ representing a position in a directory hierarchy by motion ++ from a position other than the root, which might therefore vary. ++ ``The notation @t{#P"../foo.text"} denotes a relative ++ pathname if the host file system is Unix.'' ++ See @i{absolute}. ++ ++@IGindex repertoire ++@item @b{repertoire} ++ @i{n.}, @i{ISO} ++ a @i{subtype} of @b{character}. See @ref{Character Repertoires}. ++ ++@IGindex report ++@item @b{report} ++ @i{n.} (of a @i{condition}) ++ to @i{call} the @i{function} @b{print-object} on the @i{condition} ++ in an @i{environment} where the @i{value} of @b{*print-escape*} is @i{false}. ++ ++@IGindex report message ++@item @b{report message} ++ @i{n.} ++ the text that is output by a @i{condition reporter}. ++ ++@IGindex required parameter ++@item @b{required parameter} ++ @i{n.} ++ A @i{parameter} for which a corresponding positional @i{argument} ++ must be supplied when @i{calling} the @i{function}. ++ ++@IGindex rest list ++@item @b{rest list} ++ @i{n.} (of a @i{function} having a @i{rest parameter}) ++ The @i{list} to which the @i{rest parameter} is @i{bound} on some ++ particular @i{call} to the @i{function}. ++ ++@IGindex rest parameter ++@item @b{rest parameter} ++ @i{n.} ++ A @i{parameter} which was introduced by @b{&rest}. ++ ++@IGindex restart ++@item @b{restart} ++ @i{n.} ++ an @i{object} of @i{type} @b{restart}. ++ ++@IGindex restart designator ++@item @b{restart designator} ++ @i{n.} ++ a @i{designator} for a @i{restart}; that is, ++ an @i{object} that denotes a @i{restart} ++ and that is one of: ++ a @i{non-nil} @i{symbol} ++ (denoting the most recently established @i{active} ++ @i{restart} whose @i{name} is that @i{symbol}), ++ or a @i{restart} (denoting itself). ++ ++@IGindex restart function ++@item @b{restart function} ++ @i{n.} ++ a @i{function} that invokes a @i{restart}, as if by @b{invoke-restart}. ++ The primary purpose of a @i{restart function} is to provide an alternate ++ interface. By convention, a @i{restart function} usually has the same name ++ as the @i{restart} which it invokes. Figure 26--4 shows a list of the ++ @i{standardized} @i{restart functions}. ++ ++@format ++@group ++@noindent ++@w{ abort muffle-warning use-value } ++@w{ continue store-value } ++ ++@noindent ++@w{ Figure 26--4: Standardized Restart Functions} ++ ++@end group ++@end format ++ ++@IGindex return ++@item @b{return} ++ @i{v.t.} (of @i{values}) ++ 1. (from a @i{block}) to transfer control and @i{values} from the @i{block}; ++ that is, to cause the @i{block} to @i{yield} the @i{values} immediately ++ without doing any further evaluation of the @i{forms} in its body. ++ 2. (from a @i{form}) to @i{yield} the @i{values}. ++ ++@IGindex return value ++@item @b{return value} ++ @i{n.} @i{Trad.} ++ a @i{value}_1 ++ ++@IGindex right-parenthesis ++@item @b{right-parenthesis} ++ @i{n.} ++ the @i{standard character} ``@t{)}'', ++ that is variously called ++ ``right parenthesis'' ++ or ``close parenthesis'' ++ See @i{Figure~2--5}. ++ ++@IGindex run time ++@item @b{run time} ++ @i{n.} ++ 1. @i{load time} ++ 2. @i{execution time} ++ ++@IGindex run-time compiler ++@item @b{run-time compiler} ++ @i{n.} ++ refers to the @b{compile} function or to @i{implicit compilation}, ++ for which the compilation and run-time @i{environments} are maintained ++ in the same @i{Lisp image}. ++ ++@IGindex run-time definition ++@item @b{run-time definition} ++ @i{n.} ++ a definition in the @i{run-time environment}. ++ ++@IGindex run-time environment ++@item @b{run-time environment} ++ @i{n.} ++ the @i{environment} in which a program is @i{executed}. ++ ++@end table ++@subheading @b{S} ++@table @asis ++ ++@IGindex safe ++@item @b{safe} ++ @i{adj.} ++ 1. (of @i{code}) ++ processed in a @i{lexical environment} where the the highest ++ @b{safety} level (@t{3}) was in effect. ++ See @b{optimize}. ++ 2. (of a @i{call}) a @i{safe call}. ++ ++@IGindex safe call ++@item @b{safe call} ++ @i{n.} ++ a @i{call} in which ++ the @i{call}, ++ the @i{function} being @i{called}, ++ and the point of @i{functional evaluation} ++ are all @i{safe}_1 @i{code}. ++ For more detailed information, see @ref{Safe and Unsafe Calls}. ++ ++@IGindex same ++@item @b{same} ++ @i{adj.} ++ 1. (of @i{objects} under a specified @i{predicate}) ++ indistinguishable by that @i{predicate}. ++ ``The symbol @t{car}, the string @t{"car"}, and the string @t{"CAR"} ++ are the @t{same} under @b{string-equal}''. ++ 2. (of @i{objects} if no predicate is implied by context) ++ indistinguishable by @b{eql}. ++ Note that @b{eq} might be capable of distinguishing some ++ @i{numbers} and @i{characters} which @b{eql} cannot ++ distinguish, but the nature of such, if any, ++ is @i{implementation-dependent}. ++ Since @b{eq} is used only rarely in this specification, ++ @b{eql} is the default predicate when none is mentioned explicitly. ++ ``The conses returned by two successive calls to @b{cons} ++ are never the same.'' ++ 3. (of @i{types}) having the same set of @i{elements}; ++ that is, each @i{type} is a @i{subtype} of the others. ++ ``The types specified by @t{(integer 0 1)}, ++ @t{(unsigned-byte 1)}, ++ and @t{bit} are the same.'' ++ ++@IGindex satisfy the test ++@item @b{satisfy the test} ++ @i{v.} ++ (of an @i{object} being considered by a @i{sequence function}) ++ 1. (for a one @i{argument} test) ++ to be in a state such that the @i{function} which is the ++ @i{predicate} @i{argument} to the @i{sequence function} ++ returns @i{true} when given a single @i{argument} that is the ++ result of calling the @i{sequence function}'s @i{key} @i{argument} ++ on the @i{object} being considered. ++ See @ref{Satisfying a One-Argument Test}. ++ 2. (for a two @i{argument} test) ++ to be in a state such that the two-place @i{predicate} ++ which is the @i{sequence function}'s ++ @i{test} @i{argument} ++ returns @i{true} when given a first @i{argument} that ++ is ++ the @i{object} being considered, ++ and when given a second @i{argument} ++ that is the result of calling the @i{sequence function}'s ++ @i{key} @i{argument} on an @i{element} of the ++ @i{sequence function}'s @i{sequence} @i{argument} ++ which is being tested for equality; ++ or to be in a state such that the @i{test-not} @i{function} ++ returns @i{false} given the same @i{arguments}. ++ See @ref{Satisfying a Two-Argument Test}. ++ ++@IGindex scope ++@item @b{scope} ++ @i{n.} ++ the structural or textual region of code in which @i{references} ++ to an @i{object}, a @i{binding}, an @i{exit point}, ++ a @i{tag}, or an @i{environment} (usually by @i{name}) ++ can occur. ++ ++@IGindex script ++@item @b{script} ++ @i{n.} @i{ISO} ++ one of possibly several sets that form an @i{exhaustive partition} ++ of the type @b{character}. See @ref{Character Scripts}. ++ ++@IGindex secondary value ++@item @b{secondary value} ++ @i{n.} (of @i{values} resulting from the ++ @i{evaluation} of a @i{form}) ++ the second @i{value}, if any, ++ or else @b{nil} if there are fewer than two @i{values}. ++ ``The secondary value returned by @b{truncate} is a remainder.'' ++ ++@IGindex section ++@item @b{section} ++ @i{n.} ++ a partitioning of output by a @i{conditional newline} on a @i{pretty printing stream}. ++ See @ref{Dynamic Control of the Arrangement of Output}. ++ ++@IGindex self-evaluating object ++@item @b{self-evaluating object} ++ @i{n.} ++ an @i{object} that is neither a @i{symbol} nor a ++ @i{cons}. ++ If a @i{self-evaluating object} is @i{evaluated}, ++ it @i{yields} itself as its only @i{value}. ++ ``Strings are self-evaluating objects.'' ++ ++@IGindex semi-standard ++@item @b{semi-standard} ++ @i{adj.} (of a language feature) ++ not required to be implemented by any @i{conforming implementation}, ++ but nevertheless recommended as the canonical approach in situations where ++ an @i{implementation} does plan to support such a feature. ++ The presence of @i{semi-standard} aspects in the language is intended ++ to lessen portability problems and reduce the risk of gratuitous divergence ++ among @i{implementations} that might stand in the way of future ++ standardization. ++ ++@IGindex semicolon ++@item @b{semicolon} ++ @i{n.} ++ the @i{standard character} that is called ``semicolon'' (@t{;}). ++ See @i{Figure~2--5}. ++ ++@IGindex sequence ++@item @b{sequence} ++ @i{n.} ++ 1. an ordered collection of elements ++ 2. a @i{vector} or a @i{list}. ++ ++@IGindex sequence function ++@item @b{sequence function} ++ @i{n.} ++ one of the @i{functions} in @i{Figure~17--1}, ++ or an @i{implementation-defined} @i{function} ++ that operates on one or more @i{sequences}. ++ and that is defined by the @i{implementation} to be a @i{sequence function}. ++ ++@IGindex sequential ++@item @b{sequential} ++ @i{adj.} @i{Trad.} (of @i{binding} or @i{assignment}) ++ done in the style of @b{setq}, @b{let*}, or @b{do*}; ++ that is, interleaving the evaluation of the @i{forms} that produce @i{values} ++ with the @i{assignments} or @i{bindings} of the @i{variables} (or @i{places}). ++ See @i{parallel}. ++ ++@IGindex sequentially ++@item @b{sequentially} ++ @i{adv.} ++ in a @i{sequential} way. ++ ++@IGindex serious condition ++@item @b{serious condition} ++ @i{n.} ++ a @i{condition} of @i{type} @b{serious-condition}, ++ which represents a @i{situation} that is generally sufficiently ++ severe that entry into the @i{debugger} should be expected if ++ the @i{condition} is @i{signaled} but not @i{handled}. ++ ++@IGindex session ++@item @b{session} ++ @i{n.} ++ the conceptual aggregation of events in a @i{Lisp image} from the time ++ it is started to the time it is terminated. ++ ++@IGindex set ++@item @b{set} ++ @i{v.t.} @i{Trad.} (any @i{variable} ++ or a @i{symbol} that ++ is the @i{name} of a @i{dynamic variable}) ++ to @i{assign} the @i{variable}. ++ ++@IGindex setf expander ++@item @b{setf expander} ++ @i{n.} ++ a function used by @b{setf} to compute the @i{setf expansion} ++ of a @i{place}. ++ ++@IGindex setf expansion ++@item @b{setf expansion} ++ @i{n.} ++ a set of five @i{expressions}_1 that, taken together, describe ++ how to store into a @i{place} ++ and which @i{subforms} of the macro call associated with the ++ @i{place} are evaluated. ++ See @ref{Setf Expansions}. ++ ++@IGindex setf function ++@item @b{setf function} ++ @i{n.} ++ a @i{function} whose @i{name} is @t{(setf @i{symbol})}. ++ ++@IGindex setf function name ++@item @b{setf function name} ++ @i{n.} (of a @i{symbol} @i{S}) ++ the @i{list} @t{(setf @i{S})}. ++ ++@IGindex shadow ++@item @b{shadow} ++ @i{v.t.} ++ 1. to override the meaning of. ++ ``That binding of @t{X} shadows an outer one.'' ++ 2. to hide the presence of. ++ ``That @b{macrolet} of @t{F} shadows the ++ outer @b{flet} of @t{F}.'' ++ 3. to replace. ++ ``That package shadows the symbol @t{cl:car} with ++ its own symbol @t{car}.'' ++ ++@IGindex shadowing symbol ++@item @b{shadowing symbol} ++ @i{n.} (in a @i{package}) ++ an @i{element} of the @i{package}'s @i{shadowing symbols list}. ++ ++@IGindex shadowing symbols list ++@item @b{shadowing symbols list} ++ @i{n.} (of a @i{package}) ++ a @i{list}, associated with the @i{package}, ++ of @i{symbols} that are to be exempted from `symbol conflict errors' ++ detected when packages are @i{used}. ++ See the @i{function} @b{package-shadowing-symbols}. ++ ++@IGindex shared slot ++@item @b{shared slot} ++ @i{n.} (of a @i{class}) ++ a @i{slot} @i{accessible} in more than one @i{instance} ++ of a @i{class}; specifically, such a @i{slot} is @i{accessible} ++ in all @i{direct instances} of the @i{class} and in those ++ @i{indirect instances} whose @i{class} does not ++ @i{shadow}_1 the @i{slot}. ++ ++@IGindex sharpsign ++@item @b{sharpsign} ++ @i{n.} ++ the @i{standard character} that is variously called ``number sign,'' ``sharp,'' ++ or ``sharp sign'' (@t{#}). ++ See @i{Figure~2--5}. ++ ++@IGindex short float ++@item @b{short float} ++ @i{n.} ++ an @i{object} of @i{type} @b{short-float}. ++ ++@IGindex sign ++@item @b{sign} ++ @i{n.} ++ one of the @i{standard characters} ``@t{+}'' or ``@t{-}''. ++ ++@IGindex signal ++@item @b{signal} ++ @i{v.} ++ to announce, using a standard protocol, that a particular situation, ++ represented by a @i{condition}, has been detected. ++ See @ref{Condition System Concepts}. ++ ++@IGindex signature ++@item @b{signature} ++ @i{n.} (of a @i{method}) ++ a description of the @i{parameters} and ++ @i{parameter specializers} for the @i{method} which ++ determines the @i{method}'s applicability for a given set of ++ required @i{arguments}, and which also describes the ++ @i{argument} conventions for its other, non-required ++ @i{arguments}. ++ ++@IGindex similar ++@item @b{similar} ++ @i{adj.} (of two @i{objects}) ++ defined to be equivalent under the @i{similarity} relationship. ++ ++@IGindex similarity ++@item @b{similarity} ++ @i{n.} ++ a two-place conceptual equivalence predicate, ++ which is independent of the @i{Lisp image} ++ so that two @i{objects} in different @i{Lisp images} ++ can be understood to be equivalent under this predicate. ++ See @ref{Literal Objects in Compiled Files}. ++ ++@IGindex simple ++@item @b{simple} ++ @i{adj.} ++ 1. (of an @i{array}) being of @i{type} @b{simple-array}. ++ 2. (of a @i{character}) ++ having no @i{implementation-defined} @i{attributes}, ++ or else having @i{implementation-defined} @i{attributes} ++ each of which has the @i{null} value for that @i{attribute}. ++ ++@IGindex simple array ++@item @b{simple array} ++ @i{n.} ++ an @i{array} of @i{type} @b{simple-array}. ++ ++@IGindex simple bit array ++@item @b{simple bit array} ++ @i{n.} ++ a @i{bit array} that is a @i{simple array}; ++ that is, an @i{object} of @i{type} @t{(simple-array bit)}. ++ ++@IGindex simple bit vector ++@item @b{simple bit vector} ++ @i{n.} ++ a @i{bit vector} of @i{type} @b{simple-bit-vector}. ++ ++@IGindex simple condition ++@item @b{simple condition} ++ @i{n.} ++ a @i{condition} of @i{type} @b{simple-condition}. ++ ++@IGindex simple general vector ++@item @b{simple general vector} ++ @i{n.} ++ a @i{simple vector}. ++ ++@IGindex simple string ++@item @b{simple string} ++ @i{n.} ++ a @i{string} of @i{type} @b{simple-string}. ++ ++@IGindex simple vector ++@item @b{simple vector} ++ @i{n.} ++ a @i{vector} of @i{type} @b{simple-vector}, ++ sometimes called a ``@i{simple general vector}.'' ++ Not all @i{vectors} that are @i{simple} are @i{simple vectors}---only ++ those that have @i{element type} @b{t}. ++ ++@IGindex single escape ++@item @b{single escape} ++ @i{n.}, @i{adj.} ++ 1. @i{n.} the @i{syntax type} of a @i{character} ++ that indicates that the next @i{character} is ++ to be treated as an @i{alphabetic}_2 @i{character} ++ with its @i{case} preserved. ++ For details, see @ref{Single Escape Character}. ++ 2. @i{adj.} (of a @i{character}) ++ having the @i{single escape} @i{syntax type}. ++ 3. @i{n.} a @i{single escape}_2 @i{character}. ++ (In the @i{standard readtable}, ++ @i{slash} is the only @i{single escape}.) ++ ++@IGindex single float ++@item @b{single float} ++ @i{n.} ++ an @i{object} of @i{type} @b{single-float}. ++ ++@IGindex single-quote ++@item @b{single-quote} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``apostrophe,'' ++ ``acute accent,'' ++ ``quote,'' ++ or ``single quote'' (@t{'}). ++ See @i{Figure~2--5}. ++ ++@IGindex singleton ++@item @b{singleton} ++ @i{adj.} (of a @i{sequence}) ++ having only one @i{element}. ++ ``@t{(list 'hello)} returns a singleton list.'' ++ ++@IGindex situation ++@item @b{situation} ++ @i{n.} ++ the @i{evaluation} of a @i{form} in a specific @i{environment}. ++ ++@IGindex slash ++@item @b{slash} ++ @i{n.} ++ the @i{standard character} that is variously called ++ ``solidus'' ++ or ``slash'' (@t{/}). ++ See @i{Figure~2--5}. ++ ++@IGindex slot ++@item @b{slot} ++ @i{n.} ++ a component of an @i{object} that can store a @i{value}. ++ ++@IGindex slot specifier ++@item @b{slot specifier} ++ @i{n.} ++ a representation of a @i{slot} ++ that includes the @i{name} of the @i{slot} and zero or more @i{slot} options. ++ A @i{slot} option pertains only to a single @i{slot}. ++ ++@IGindex source code ++@item @b{source code} ++ @i{n.} ++ @i{code} representing @i{objects} suitable for @i{evaluation} ++ (@i{e.g.}, @i{objects} created by @b{read}, ++ by @i{macro expansion}, ++ ++ or by @i{compiler macro expansion}). ++ ++@IGindex source file ++@item @b{source file} ++ @i{n.} ++ a @i{file} which contains a textual representation of @i{source code}, ++ that can be edited, @i{loaded}, or @i{compiled}. ++ ++@IGindex space ++@item @b{space} ++ @i{n.} ++ the @i{standard character} <@i{Space}>, ++ notated for the @i{Lisp reader} as @t{#\Space}. ++ ++@IGindex special form ++@item @b{special form} ++ @i{n.} ++ a @i{list}, other than a @i{macro form}, which is a ++ @i{form} with special syntax or special @i{evaluation} ++ rules or both, possibly manipulating the @i{evaluation} ++ @i{environment} or control flow or both. The first element of ++ a @i{special form} is a @i{special operator}. ++ ++@IGindex special operator ++@item @b{special operator} ++ @i{n.} ++ one of a fixed set of @i{symbols}, ++ enumerated in @i{Figure~3--2}, ++ that may appear in the @i{car} of ++ a @i{form} in order to identify the @i{form} as a @i{special form}. ++ ++@IGindex special variable ++@item @b{special variable} ++ @i{n.} @i{Trad.} ++ a @i{dynamic variable}. ++ ++@IGindex specialize ++@item @b{specialize} ++ @i{v.t.} (a @i{generic function}) ++ to define a @i{method} for the @i{generic function}, or in other words, ++ to refine the behavior of the @i{generic function} by giving it a specific ++ meaning for a particular set of @i{classes} or @i{arguments}. ++ ++@IGindex specialized ++@item @b{specialized} ++ @i{adj.} ++ 1. (of a @i{generic function}) ++ having @i{methods} which @i{specialize} the @i{generic function}. ++ 2. (of an @i{array}) ++ having an @i{actual array element type} ++ that is a @i{proper subtype} of the @i{type} @b{t}; ++ see @ref{Array Elements}. ++ ``@t{(make-array 5 :element-type 'bit)} makes an array of length ++ five that is specialized for bits.'' ++ ++@IGindex specialized lambda list ++@item @b{specialized lambda list} ++ @i{n.} ++ an @i{extended lambda list} used in @i{forms} that @i{establish} ++ @i{method} definitions, such as @b{defmethod}. ++ See @ref{Specialized Lambda Lists}. ++ ++@IGindex spreadable argument list designator ++@item @b{spreadable argument list designator} ++ @i{n.} ++ a @i{designator} for a @i{list} of @i{objects}; that is, ++ an @i{object} that denotes a @i{list} ++ and that is a @i{non-null} @i{list} L1 of length n, ++ whose last element is a @i{list} L2 of length m ++ (denoting a list L3 of length m+n-1 whose @i{elements} are ++ L1_i for i < n-1 followed by L2_j for j < m). ++ ``The list (1 2 (3 4 5)) is a spreadable argument list designator for ++ the list (1 2 3 4 5).'' ++ ++@IGindex stack allocate ++@item @b{stack allocate} ++ @i{v.t.} @i{Trad.} ++ to allocate in a non-permanent way, such as on a stack. Stack-allocation ++ is an optimization technique used in some @i{implementations} for ++ allocating certain kinds of @i{objects} that have @i{dynamic extent}. ++ Such @i{objects} are allocated on the stack rather than in the heap ++ so that their storage can be freed as part of unwinding the stack rather ++ than taking up space in the heap until the next garbage collection. ++ What @i{types} (if any) can have @i{dynamic extent} can vary ++ from @i{implementation} to @i{implementation}. No ++ @i{implementation} is ever required to perform stack-allocation. ++ ++@IGindex stack-allocated ++@item @b{stack-allocated} ++ @i{adj.} @i{Trad.} ++ having been @i{stack allocated}. ++ ++@IGindex standard character ++@item @b{standard character} ++ @i{n.} ++ a @i{character} of @i{type} @b{standard-char}, which is one of a fixed set of 96 ++ such @i{characters} required to be present in all @i{conforming implementations}. ++ See @ref{Standard Characters}. ++ ++@IGindex standard class ++@item @b{standard class} ++ @i{n.} ++ a @i{class} that is a @i{generalized instance} of @i{class} @b{standard-class}. ++ ++@IGindex standard generic function ++@item @b{standard generic function} ++ ++ a @i{function} of @i{type} @b{standard-generic-function}. ++ ++@IGindex standard input ++@item @b{standard input} ++ @i{n.} ++ the @i{input} @i{stream} which is the @i{value} of the @i{dynamic variable} ++ @b{*standard-input*}. ++ ++@IGindex standard method combination ++@item @b{standard method combination} ++ @i{n.} ++ the @i{method combination} named @b{standard}. ++ ++@IGindex standard object ++@item @b{standard object} ++ @i{n.} ++ an @i{object} that is ++ a @i{generalized instance} ++ of @i{class} @b{standard-object}. ++ ++@IGindex standard output ++@item @b{standard output} ++ @i{n.} ++ the @i{output} @i{stream} which is the @i{value} of the @i{dynamic variable} ++ @b{*standard-output*}. ++ ++@IGindex standard pprint dispatch table ++@item @b{standard pprint dispatch table} ++ @i{n.} ++ A @i{pprint dispatch table} that is @i{different} from ++ the @i{initial pprint dispatch table}, ++ that implements @i{pretty printing} as described in this specification, ++ and that, unlike other @i{pprint dispatch tables}, ++ must never be modified by any program. ++ (Although the definite reference ``the @i{standard pprint dispatch table}'' ++ is generally used ++ within this document, it is actually @i{implementation-dependent} whether a ++ single @i{object} fills the role of the @i{standard pprint dispatch table}, ++ or whether there might be multiple such objects, any one of which could be used on any ++ given occasion where ``the @i{standard pprint dispatch table}'' is called for. ++ As such, this phrase should be seen as an indefinite reference ++ in all cases except for anaphoric references.) ++ ++@IGindex standard readtable ++@item @b{standard readtable} ++ @i{n.} ++ A @i{readtable} that is @i{different} from the @i{initial readtable}, ++ that implements the @i{expression} syntax defined in this specification, ++ and that, unlike other @i{readtables}, must never be modified by any program. ++ (Although the definite reference ``the @i{standard readtable}'' is generally used ++ within this document, it is actually @i{implementation-dependent} whether a ++ single @i{object} fills the role of the @i{standard readtable}, ++ or whether there might be multiple such objects, any one of which could be used on any ++ given occasion where ``the @i{standard readtable}'' is called for. ++ As such, this phrase should be seen as an indefinite reference ++ in all cases except for anaphoric references.) ++ ++@IGindex standard syntax ++@item @b{standard syntax} ++ @i{n.} ++ the syntax represented by the @i{standard readtable} ++ and used as a reference syntax throughout this document. ++ See @ref{Character Syntax}. ++ ++@IGindex standardized ++@item @b{standardized} ++ @i{adj.} (of a @i{name}, @i{object}, or definition) ++ having been defined by @r{Common Lisp}. ++ ``All standardized variables that are required to ++ hold bidirectional streams have ``@t{-io*}'' in their name.'' ++ ++@IGindex startup environment ++@item @b{startup environment} ++ @i{n.} ++ the @i{global environment} of the running @i{Lisp image} ++ from which the @i{compiler} was invoked. ++ ++@IGindex step ++@item @b{step} ++ @i{v.t.}, @i{n.} ++ 1. @i{v.t.} (an iteration @i{variable}) to @i{assign} the @i{variable} ++ a new @i{value} at the end of an iteration, in preparation for a new iteration. ++ 2. @i{n.} the @i{code} that identifies how the next value in an iteration ++ is to be computed. ++ 3. @i{v.t.} (@i{code}) to specially execute the @i{code}, pausing at ++ intervals to allow user confirmation or intervention, usually for debugging. ++ ++@IGindex stream ++@item @b{stream} ++ @i{n.} ++ an @i{object} that can be used with an input or output function to ++ identify an appropriate source or sink of @i{characters} or ++ @i{bytes} for that operation. ++ ++@IGindex stream associated with a file ++@item @b{stream associated with a file} ++ @i{n.} ++ a @i{file stream}, or a @i{synonym stream} the @i{target} ++ of which is a @i{stream associated with a file}. ++ Such a @i{stream} cannot be created with ++ @b{make-two-way-stream}, ++ @b{make-echo-stream}, ++ @b{make-broadcast-stream}, ++ @b{make-concatenated-stream}, ++ @b{make-string-input-stream}, ++ or @b{make-string-output-stream}. ++ ++@IGindex stream designator ++@item @b{stream designator} ++ @i{n.} ++ a @i{designator} for a @i{stream}; that is, ++ an @i{object} that denotes a @i{stream} ++ and that is one of: ++ @b{t} (denoting the @i{value} of @b{*terminal-io*}), ++ @b{nil} (denoting the @i{value} of @b{*standard-input*} ++ for @i{input} @i{stream designators} ++ or denoting the @i{value} of @b{*standard-output*} ++ for @i{output} @i{stream designators}), ++ or a @i{stream} (denoting itself). ++ ++@IGindex stream element type ++@item @b{stream element type} ++ @i{n.} (of a @i{stream}) ++ the @i{type} of data for which the @i{stream} is specialized. ++ ++@IGindex stream variable ++@item @b{stream variable} ++ @i{n.} ++ a @i{variable} whose @i{value} must be a @i{stream}. ++ ++@IGindex stream variable designator ++@item @b{stream variable designator} ++ @i{n.} ++ a @i{designator} for a @i{stream variable}; that is, ++ a @i{symbol} that denotes a @i{stream variable} ++ and that is one of: ++ @b{t} (denoting @b{*terminal-io*}), ++ @b{nil} (denoting @b{*standard-input*} ++ for @i{input} @i{stream variable designators} ++ or denoting @b{*standard-output*} ++ for @i{output} @i{stream variable designators}), ++ or some other @i{symbol} (denoting itself). ++ ++@IGindex string ++@item @b{string} ++ @i{n.} ++ a specialized @i{vector} that is of @i{type} @b{string}, ++ and whose elements are of @i{type} @b{character} or a @i{subtype} of @i{type} @b{character}. ++ ++@IGindex string designator ++@item @b{string designator} ++ @i{n.} ++ a @i{designator} for a @i{string}; that is, ++ an @i{object} that denotes a @i{string} ++ and that is one of: ++ a @i{character} (denoting a @i{singleton} @i{string} ++ that has the @i{character} as its only @i{element}), ++ a @i{symbol} (denoting the @i{string} that is its @i{name}), ++ or a @i{string} (denoting itself). ++ ++ The intent is that this term be consistent with the behavior of @b{string}; ++ @i{implementations} that extend @b{string} must extend the meaning of ++ this term in a compatible way. ++ ++@IGindex string equal ++@item @b{string equal} ++ @i{adj.} ++ the @i{same} under @b{string-equal}. ++ ++@IGindex string stream ++@item @b{string stream} ++ @i{n.} ++ a @i{stream} of @i{type} @b{string-stream}. ++ ++@IGindex structure ++@item @b{structure} ++ @i{n.} ++ an @i{object} of @i{type} @b{structure-object}. ++ ++@IGindex structure class ++@item @b{structure class} ++ @i{n.} ++ a @i{class} that is a @i{generalized instance} of @i{class} @b{structure-class}. ++ ++@IGindex structure name ++@item @b{structure name} ++ @i{n.} ++ a @i{name} defined with @b{defstruct}. ++ Usually, such a @i{type} is also a @i{structure class}, ++ but there may be @i{implementation-dependent} situations ++ in which this is not so, if the @t{:type} option to @b{defstruct} is used. ++ ++@IGindex style warning ++@item @b{style warning} ++ @i{n.} ++ a @i{condition} of @i{type} @b{style-warning}. ++ ++@IGindex subclass ++@item @b{subclass} ++ @i{n.} ++ a @i{class} that @i{inherits} from another @i{class}, ++ called a @i{superclass}. ++ (No @i{class} is a @i{subclass} of itself.) ++ ++@IGindex subexpression ++@item @b{subexpression} ++ @i{n.} (of an @i{expression}) ++ an @i{expression} that is contained within the @i{expression}. ++ (In fact, the state of being a @i{subexpression} is not an attribute ++ of the @i{subexpression}, but really an attribute of the containing ++ @i{expression} since the @i{same} @i{object} can at once be ++ a @i{subexpression} in one context, and not in another.) ++ ++@IGindex subform ++@item @b{subform} ++ @i{n.} (of a @i{form}) ++ an @i{expression} that is a @i{subexpression} of the @i{form}, ++ and which by virtue of its position in that @i{form} is also a ++ @i{form}. ++ ``@t{(f x)} and @t{x}, but not @t{exit}, are subforms of ++ @t{(return-from exit (f x))}.'' ++ ++@IGindex subrepertoire ++@item @b{subrepertoire} ++ @i{n.} ++ a subset of a @i{repertoire}. ++ ++@IGindex subtype ++@item @b{subtype} ++ @i{n.} ++ a @i{type} whose membership is the same as or a proper subset of the ++ membership of another @i{type}, called a @i{supertype}. ++ (Every @i{type} is a @i{subtype} of itself.) ++ ++@IGindex superclass ++@item @b{superclass} ++ @i{n.} ++ a @i{class} from which another @i{class} ++ (called a @i{subclass}) @i{inherits}. ++ (No @i{class} is a @i{superclass} of itself.) ++ See @i{subclass}. ++ ++@IGindex supertype ++@item @b{supertype} ++ @i{n.} ++ a @i{type} whose membership is the same as or a proper superset ++ of the membership of another @i{type}, called a @i{subtype}. ++ (Every @i{type} is a @i{supertype} of itself.) ++ See @i{subtype}. ++ ++@IGindex supplied-p parameter ++@item @b{supplied-p parameter} ++ @i{n.} ++ a @i{parameter} which recieves its @i{generalized boolean} value ++ implicitly due to the presence or absence of an @i{argument} ++ corresponding to another @i{parameter} ++ (such as an @i{optional parameter} or a @i{rest parameter}). ++ See @ref{Ordinary Lambda Lists}. ++ ++@IGindex symbol ++@item @b{symbol} ++ @i{n.} ++ an @i{object} of @i{type} @b{symbol}. ++ ++@IGindex symbol macro ++@item @b{symbol macro} ++ @i{n.} ++ a @i{symbol} that stands for another @i{form}. ++ See the @i{macro} @b{symbol-macrolet}. ++ ++@IGindex synonym stream ++@item @b{synonym stream} ++ @i{n.} ++ 1. a @i{stream} of @i{type} @b{synonym-stream}, ++ which is consequently a @i{stream} that is an alias for another @i{stream}, ++ which is the @i{value} of a @i{dynamic variable} ++ whose @i{name} is the @i{synonym stream symbol} of the @i{synonym stream}. ++ See the @i{function} @b{make-synonym-stream}. ++ 2. (to a @i{stream}) ++ a @i{synonym stream} which has the @i{stream} as the @i{value} ++ of its @i{synonym stream symbol}. ++ 3. (to a @i{symbol}) ++ a @i{synonym stream} which has the @i{symbol} as its ++ @i{synonym stream symbol}. ++ ++@IGindex synonym stream symbol ++@item @b{synonym stream symbol} ++ @i{n.} (of a @i{synonym stream}) ++ the @i{symbol} which names the @i{dynamic variable} which has as its ++ @i{value} another @i{stream} for which the @i{synonym stream} ++ is an alias. ++ ++@IGindex syntax type ++@item @b{syntax type} ++ @i{n.} (of a @i{character}) ++ one of several classifications, enumerated in @i{Figure~2--6}, ++ that are used for dispatch during parsing by the @i{Lisp reader}. ++ See @ref{Character Syntax Types}. ++ ++@IGindex system class ++@item @b{system class} ++ @i{n.} ++ a @i{class} that may be of @i{type} @b{built-in-class} in a @i{conforming implementation} ++ and hence cannot be inherited by @i{classes} defined by @i{conforming programs}. ++ ++@IGindex system code ++@item @b{system code} ++ @i{n.} ++ @i{code} supplied by the @i{implementation} to implement this specification ++ (@i{e.g.}, the definition of @b{mapcar}) ++ or generated automatically in support of this specification ++ (@i{e.g.}, during method combination); ++ that is, @i{code} that is not @i{programmer code}. ++ ++@end table ++@subheading @b{T} ++@table @asis ++ ++@IGindex t ++@item @b{t} ++ @i{n.} ++ 1. a. the @i{boolean} representing true. ++ b. the canonical @i{generalized boolean} representing true. ++ (Although any @i{object} other than @b{nil} is considered @i{true} ++ as a @i{generalized boolean}, ++ @t{t} is generally used when there is no special reason to prefer one ++ such @i{object} over another.) ++ 2. the @i{name} of the @i{type} to which all @i{objects} belong---the ++ @i{supertype} of all @i{types} (including itself). ++ 3. the @i{name} of the @i{superclass} of all @i{classes} except itself. ++ ++@IGindex tag ++@item @b{tag} ++ @i{n.} ++ 1. a @i{catch tag}. ++ 2. a @i{go tag}. ++ ++@IGindex tail ++@item @b{tail} ++ @i{n.} (of a @i{list}) ++ an @i{object} that is the @i{same} as either some @i{cons} ++ which makes up that @i{list} or the @i{atom} (if any) which terminates ++ the @i{list}. ++ ``The empty list is a tail of every proper list.'' ++ ++@IGindex target ++@item @b{target} ++ @i{n.} ++ 1. (of a @i{constructed stream}) ++ a @i{constituent} of the @i{constructed stream}. ++ ``The target of a synonym stream is ++ the value of its synonym stream symbol.'' ++ 2. (of a @i{displaced array}) ++ the @i{array} to which the @i{displaced array} is displaced. ++ (In the case of a chain of @i{constructed streams} or @i{displaced arrays}, ++ the unqualified term ``@i{target}'' always refers to the immediate ++ @i{target} of the first item in the chain, not the immediate target ++ of the last item.) ++ ++@IGindex terminal I/O ++@item @b{terminal I/O} ++ @i{n.} ++ the @i{bidirectional} @i{stream} ++ that is the @i{value} of the @i{variable} @b{*terminal-io*}. ++ ++@IGindex terminating ++@item @b{terminating} ++ @i{n.} (of a @i{macro character}) ++ being such that, if it appears while parsing a token, it terminates that token. ++ See @ref{Reader Algorithm}. ++ ++@IGindex tertiary value ++@item @b{tertiary value} ++ @i{n.} (of @i{values} resulting from the ++ @i{evaluation} of a @i{form}) ++ the third @i{value}, if any, ++ or else @b{nil} if there are fewer than three @i{values}. ++ ++@IGindex throw ++@item @b{throw} ++ @i{v.} ++ to transfer control and @i{values} to a @i{catch}. ++ See the @i{special operator} @b{throw}. ++ ++@IGindex tilde ++@item @b{tilde} ++ @i{n.} ++ the @i{standard character} that is called ``tilde'' (@t{~}). ++ See @i{Figure~2--5}. ++ ++@IGindex time ++@item @b{time} ++ ++ a representation of a point (@i{absolute} @i{time}) ++ or an interval (@i{relative} @i{time}) ++ on a time line. ++ See @i{decoded time}, @i{internal time}, and @i{universal time}. ++ ++@IGindex time zone ++@item @b{time zone} ++ @i{n.} ++ a @i{rational} multiple of @t{1/3600} between @t{-24} (inclusive) ++ and @t{24} (inclusive) that represents a time zone as a number of hours ++ offset from Greenwich Mean Time. Time zone values increase with motion to the west, ++ so Massachusetts, U.S.A. is in time zone @t{5}, ++ California, U.S.A. is time zone @t{8}, ++ and Moscow, Russia is time zone @i{-3}. ++ (When ``daylight savings time'' is separately represented ++ as an @i{argument} or @i{return value}, the @i{time zone} ++ that accompanies it does not depend on whether daylight savings time ++ is in effect.) ++ ++@IGindex token ++@item @b{token} ++ @i{n.} ++ a textual representation for a @i{number} or a @i{symbol}. ++ See @ref{Interpretation of Tokens}. ++ ++@IGindex top level form ++@item @b{top level form} ++ @i{n.} ++ a @i{form} which is processed specially by @b{compile-file} for ++ the purposes of enabling @i{compile time} @i{evaluation} of that ++ @i{form}. ++ @i{Top level forms} include those @i{forms} which ++ are not @i{subforms} of any other @i{form}, ++ and certain other cases. See @ref{Processing of Top Level Forms}. ++ ++@IGindex trace output ++@item @b{trace output} ++ @i{n.} ++ the @i{output} @i{stream} which is the @i{value} of the @i{dynamic variable} ++ @b{*trace-output*}. ++ ++@IGindex tree ++@item @b{tree} ++ @i{n.} ++ 1. a binary recursive data structure made up of @i{conses} and ++ @i{atoms}: the @i{conses} are themselves also @i{trees} ++ (sometimes called ``subtrees'' or ``branches''), and the @i{atoms} ++ are terminal nodes (sometimes called @i{leaves}). Typically, ++ the @i{leaves} represent data while the branches establish some ++ relationship among that data. ++ 2. in general, any recursive data structure that has some notion of ++ ``branches'' and @i{leaves}. ++ ++@IGindex tree structure ++@item @b{tree structure} ++ @i{n.} (of a @i{tree}_1) ++ the set of @i{conses} that make up the @i{tree}. ++ Note that while the @i{car}_@{1b@} component of each such @i{cons} ++ is part of the @i{tree structure}, ++ the @i{objects} that are the @i{cars}_2 of each @i{cons} ++ in the @i{tree} ++ are not themselves part of its @i{tree structure} ++ unless they are also @i{conses}. ++ ++@IGindex true ++@item @b{true} ++ @i{n.} ++ any @i{object} ++ that is not @i{false} ++ and that is used to represent the success of a @i{predicate} test. ++ See @i{t}_1. ++ ++@IGindex truename ++@item @b{truename} ++ @i{n.} ++ 1. the canonical @i{filename} of a @i{file} in the @i{file system}. ++ See @ref{Truenames}. ++ 2. a @i{pathname} representing a @i{truename}_1. ++ ++@IGindex two-way stream ++@item @b{two-way stream} ++ @i{n.} ++ a @i{stream} of @i{type} @b{two-way-stream}, ++ which is a @i{bidirectional} @i{composite stream} that ++ receives its input from an associated @i{input} @i{stream} ++ and sends its output to an associated @i{output} @i{stream}. ++ ++@IGindex type ++@item @b{type} ++ @i{n.} ++ 1. a set of @i{objects}, usually with common structure, behavior, or purpose. ++ (Note that the expression ``@i{X} is of type @i{S_a}'' ++ naturally implies that ``@i{X} is of type @i{S_b}'' if ++ @i{S_a} is a @i{subtype} of @i{S_b}.) ++ 2. (immediately following the name of a @i{type}) ++ a @i{subtype} of that @i{type}. ++ ``The type @b{vector} is an array type.'' ++ ++@IGindex type declaration ++@item @b{type declaration} ++ @i{n.} ++ a @i{declaration} that asserts that every reference to a ++ specified @i{binding} within the scope of the @i{declaration} ++ results in some @i{object} of the specified @i{type}. ++ ++@IGindex type equivalent ++@item @b{type equivalent} ++ @i{adj.} (of two @i{types} X and Y) ++ having the same @i{elements}; ++ that is, X is a @i{subtype} of Y ++ and Y is a @i{subtype} of X. ++ ++@IGindex type expand ++@item @b{type expand} ++ @i{n.} ++ to fully expand a @i{type specifier}, removing any references to ++ @i{derived types}. (@r{Common Lisp} provides no program interface to cause ++ this to occur, but the semantics of @r{Common Lisp} are such that every ++ @i{implementation} must be able to do this internally, and some ++ situations involving @i{type specifiers} are most easily described ++ in terms of a fully expanded @i{type specifier}.) ++ ++@IGindex type specifier ++@item @b{type specifier} ++ @i{n.} ++ an @i{expression} that denotes a @i{type}. ++ ``The symbol @t{random-state}, the list @t{(integer 3 5)}, ++ the list @t{(and list (not null))}, and the class named ++ @t{standard-class} are type specifiers.'' ++ ++@end table ++@subheading @b{U} ++@table @asis ++ ++@IGindex unbound ++@item @b{unbound} ++ @i{adj.} ++ not having an associated denotation in a @i{binding}. ++ See @i{bound}. ++ ++@IGindex unbound variable ++@item @b{unbound variable} ++ @i{n.} ++ a @i{name} that is syntactically plausible as the name of a ++ @i{variable} but which is not @i{bound} ++ in the @i{variable} @i{namespace}. ++ ++@IGindex undefined function ++@item @b{undefined function} ++ @i{n.} ++ a @i{name} that is syntactically plausible as the name of a ++ @i{function} but which is not @i{bound} ++ in the @i{function} @i{namespace}. ++ ++@IGindex unintern ++@item @b{unintern} ++ @i{v.t.} (a @i{symbol} in a @i{package}) ++ to make the @i{symbol} not be @i{present} in that @i{package}. ++ (The @i{symbol} might continue to be @i{accessible} by inheritance.) ++ ++@IGindex uninterned ++@item @b{uninterned} ++ @i{adj.} (of a @i{symbol}) ++ not @i{accessible} in any @i{package}; @i{i.e.}, not @i{interned}_1. ++ ++@IGindex universal time ++@item @b{universal time} ++ @i{n.} ++ @i{time}, represented as a non-negative @i{integer} number of seconds. ++ @i{Absolute} @i{universal time} is measured as an offset ++ from the beginning of the year 1900 (ignoring @i{leap seconds}). ++ See @ref{Universal Time}. ++ ++@IGindex unqualified method ++@item @b{unqualified method} ++ @i{n.} ++ a @i{method} with no @i{qualifiers}. ++ ++@IGindex unregistered package ++@item @b{unregistered package} ++ @i{n.} ++ a @i{package} @i{object} that is not present in the @i{package registry}. ++ An @i{unregistered package} has no @i{name}; @i{i.e.}, its @i{name} is @b{nil}. ++ See the @i{function} @b{delete-package}. ++ ++@IGindex unsafe ++@item @b{unsafe} ++ @i{adj.} (of @i{code}) ++ not @i{safe}. (Note that, unless explicitly specified otherwise, ++ if a particular kind of error checking is ++ guaranteed only in a @i{safe} context, the same checking might or might not occur ++ in that context if it were @i{unsafe}; describing a context as @i{unsafe} ++ means that certain kinds of error checking are not reliably enabled ++ but does not guarantee that error checking is definitely disabled.) ++ ++@IGindex unsafe call ++@item @b{unsafe call} ++ @i{n.} ++ a @i{call} that is not a @i{safe call}. ++ For more detailed information, see @ref{Safe and Unsafe Calls}. ++ ++@IGindex upgrade ++@item @b{upgrade} ++ @i{v.t.} (a declared @i{type} to an actual @i{type}) ++ 1. (when creating an @i{array}) ++ to substitute an @i{actual array element type} ++ for an @i{expressed array element type} ++ when choosing an appropriately @i{specialized} @i{array} representation. ++ See the @i{function} @b{upgraded-array-element-type}. ++ 2. (when creating a @i{complex}) ++ to substitute an @i{actual complex part type} ++ for an @i{expressed complex part type} ++ when choosing an appropriately @i{specialized} @i{complex} representation. ++ See the @i{function} @b{upgraded-complex-part-type}. ++ ++@IGindex upgraded array element type ++@item @b{upgraded array element type} ++ @i{n.} (of a @i{type}) ++ a @i{type} that is a @i{supertype} of the @i{type} ++ and that is used instead of the @i{type} whenever the ++ @i{type} is used as an @i{array element type} ++ for object creation or type discrimination. ++ See @ref{Array Upgrading}. ++ ++@IGindex upgraded complex part type ++@item @b{upgraded complex part type} ++ @i{n.} (of a @i{type}) ++ a @i{type} that is a @i{supertype} of the @i{type} ++ and that is used instead of the @i{type} whenever the ++ @i{type} is used as a @i{complex part type} ++ for object creation or type discrimination. ++ See the @i{function} @b{upgraded-complex-part-type}. ++ ++@IGindex uppercase ++@item @b{uppercase} ++ @i{adj.} (of a @i{character}) ++ being among @i{standard characters} corresponding to ++ the capital letters @t{A} through @t{Z}, ++ or being some other @i{implementation-defined} @i{character} ++ that is defined by the @i{implementation} to be @i{uppercase}. ++ See @ref{Characters With Case}. ++ ++@IGindex use ++@item @b{use} ++ @i{v.t.} (a @i{package} P_1) ++ to @i{inherit} the @i{external symbols} of P_1. ++ (If a package P_2 uses P_1, ++ the @i{external symbols} of P_1 ++ become @i{internal symbols} of P_2 ++ unless they are explicitly @i{exported}.) ++ ``The package @t{CL-USER} uses the package @t{CL}.'' ++ ++@IGindex use list ++@item @b{use list} ++ @i{n.} (of a @i{package}) ++ a (possibly empty) @i{list} associated with each @i{package} ++ which determines what other @i{packages} are currently being ++ @i{used} by that @i{package}. ++ ++@IGindex user ++@item @b{user} ++ @i{n.} ++ an active entity, typically a human, that invokes or interacts with a ++ @i{program} at run time, but that is not necessarily a @i{programmer}. ++ ++@end table ++@subheading @b{V} ++@table @asis ++ ++@IGindex valid array dimension ++@item @b{valid array dimension} ++ @i{n.} ++ a @i{fixnum} suitable for use as an @i{array} @i{dimension}. ++ Such a @i{fixnum} must be greater than or equal to zero, ++ and less than the @i{value} of @b{array-dimension-limit}. ++ When multiple @i{array} @i{dimensions} are to be used together to specify a ++ multi-dimensional @i{array}, there is also an implied constraint ++ that the product of all of the @i{dimensions} be less than the @i{value} of ++ @b{array-total-size-limit}. ++ ++@IGindex valid array index ++@item @b{valid array index} ++ @i{n.} (of an @i{array}) ++ a @i{fixnum} suitable for use as one of possibly several indices needed ++ to name an @i{element} of the @i{array} according to a multi-dimensional ++ Cartesian coordinate system. Such a @i{fixnum} must ++ be greater than or equal to zero, ++ and must be less than the corresponding @i{dimension}_1 ++ of the @i{array}. ++ (Unless otherwise explicitly specified, ++ the phrase ``a @i{list} of @i{valid array indices}'' further implies ++ that the @i{length} of the @i{list} must be the same as the ++ @i{rank} of the @i{array}.) ++ ``For a @t{2} by~@t{3} array, ++ valid array indices for the first dimension are @t{0} and~@t{1}, and ++ valid array indices for the second dimension are @t{0}, @t{1} and~@t{2}.'' ++ ++@IGindex valid array row-major index ++@item @b{valid array row-major index} ++ @i{n.} (of an @i{array}, ++ which might have any number ++ of @i{dimensions}_2) ++ a single @i{fixnum} suitable for use in naming any @i{element} ++ of the @i{array}, by viewing the array's storage as a linear ++ series of @i{elements} in row-major order. ++ Such a @i{fixnum} must be greater than or equal to zero, ++ and less than the @i{array total size} of the @i{array}. ++ ++@IGindex valid fill pointer ++@item @b{valid fill pointer} ++ @i{n.} (of an @i{array}) ++ a @i{fixnum} suitable for use as a @i{fill pointer} for the @i{array}. ++ Such a @i{fixnum} must be greater than or equal to zero, ++ and less than or equal to the @i{array total size} of the @i{array}. ++ ++[Editorial Note by KMP: The ``valid pathname xxx'' definitions were taken from ++ text found in make-pathname, but look wrong to me. ++ I'll fix them later.] ++ ++@IGindex valid logical pathname host ++@item @b{valid logical pathname host} ++ @i{n.} ++ a @i{string} that has been defined as the name of a @i{logical host}. ++ See the @i{function} @b{load-logical-pathname-translations}. ++ ++@IGindex valid pathname device ++@item @b{valid pathname device} ++ @i{n.} ++ a @i{string}, ++ @b{nil}, ++ @t{:unspecific}, ++ or some other @i{object} defined by the @i{implementation} ++ to be a @i{valid pathname device}. ++ ++@IGindex valid pathname directory ++@item @b{valid pathname directory} ++ @i{n.} ++ a @i{string}, ++ a @i{list} of @i{strings}, ++ @b{nil}, ++ ++ @t{:wild}, ++ ++ @t{:unspecific}, ++ or some other @i{object} defined by the @i{implementation} ++ to be a @i{valid directory component}. ++ ++@IGindex valid pathname host ++@item @b{valid pathname host} ++ @i{n.} ++ a @i{valid physical pathname host} ++ or a @i{valid logical pathname host}. ++ ++@IGindex valid pathname name ++@item @b{valid pathname name} ++ @i{n.} ++ a @i{string}, ++ @b{nil}, ++ @t{:wild}, ++ @t{:unspecific}, ++ or some other @i{object} defined by the @i{implementation} ++ to be a @i{valid pathname name}. ++ ++@IGindex valid pathname type ++@item @b{valid pathname type} ++ @i{n.} ++ a @i{string}, ++ @b{nil}, ++ @t{:wild}, ++ @t{:unspecific}. ++ ++@IGindex valid pathname version ++@item @b{valid pathname version} ++ @i{n.} ++ a non-negative @i{integer}, ++ or one of @t{:wild}, ++ @t{:newest}, ++ @t{:unspecific}, ++ or @b{nil}. ++ The symbols @t{:oldest}, @t{:previous}, and @t{:installed} are ++ @i{semi-standard} special version symbols. ++ ++@IGindex valid physical pathname host ++@item @b{valid physical pathname host} ++ @i{n.} ++ any of ++ a @i{string}, ++ a @i{list} of @i{strings}, ++ or the symbol @t{:unspecific}, ++ that is recognized by the implementation as the name of a host. ++ ++@IGindex valid sequence index ++@item @b{valid sequence index} ++ @i{n.} (of a @i{sequence}) ++ an @i{integer} suitable for use to name an @i{element} ++ of the @i{sequence}. Such an @i{integer} must ++ be greater than or equal to zero, ++ and must be less than the @i{length} of the @i{sequence}. ++ ++ (If the @i{sequence} is an @i{array}, ++ the @i{valid sequence index} is further constrained to be a @i{fixnum}.) ++ ++@IGindex value ++@item @b{value} ++ @i{n.} ++ 1. a. one of possibly several @i{objects} that are the result of ++ an @i{evaluation}. ++ b. (in a situation where exactly one value is expected from the ++ @i{evaluation} of a @i{form}) ++ the @i{primary value} returned by the @i{form}. ++ c. (of @i{forms} in an @i{implicit progn}) one of possibly ++ several @i{objects} that result from the @i{evaluation} ++ of the last @i{form}, or @b{nil} if there are no @i{forms}. ++ 2. an @i{object} associated with a @i{name} in a @i{binding}. ++ 3. (of a @i{symbol}) the @i{value} of the @i{dynamic variable} ++ named by that symbol. ++ 4. an @i{object} associated with a @i{key} ++ in an @i{association list}, ++ a @i{property list}, ++ or a @i{hash table}. ++ ++@IGindex value cell ++@item @b{value cell} ++ @i{n.} @i{Trad.} (of a @i{symbol}) ++ The @i{place} which holds the @i{value}, if any, of the ++ @i{dynamic variable} named by that @i{symbol}, ++ and which is @i{accessed} by @b{symbol-value}. ++ See @i{cell}. ++ ++@IGindex variable ++@item @b{variable} ++ @i{n.} ++ a @i{binding} in which a @i{symbol} is the @i{name} ++ used to refer to an @i{object}. ++ ++@IGindex vector ++@item @b{vector} ++ @i{n.} ++ a one-dimensional @i{array}. ++ ++@IGindex vertical-bar ++@item @b{vertical-bar} ++ @i{n.} ++ the @i{standard character} that is called ``vertical bar'' (@t{|}). ++ See @i{Figure~2--5}. ++ ++@end table ++@subheading @b{W} ++@table @asis ++ ++@IGindex whitespace ++@item @b{whitespace} ++ @i{n.} ++ 1. one or more @i{characters} that are ++ either the @i{graphic} @i{character} @t{#\Space} ++ or else @i{non-graphic} characters such as @t{#\Newline} ++ that only move the print position. ++ 2. a. @i{n.} the @i{syntax type} of a @i{character} ++ that is a @i{token} separator. ++ For details, see @ref{Whitespace Characters}. ++ b. @i{adj.} (of a @i{character}) ++ having the @i{whitespace}_@{2a@} @i{syntax type}_2. ++ c. @i{n.} a @i{whitespace}_@{2b@} @i{character}. ++ ++@IGindex wild ++@item @b{wild} ++ @i{adj.} ++ 1. (of a @i{namestring}) using an @i{implementation-defined} ++ syntax for naming files, which might ``match'' any of possibly several ++ possible @i{filenames}, and which can therefore be used to refer to ++ the aggregate of the @i{files} named by those @i{filenames}. ++ 2. (of a @i{pathname}) a structured representation of a name which ++ might ``match'' any of possibly several @i{pathnames}, and which can ++ therefore be used to refer to the aggregate of the @i{files} named by those ++ @i{pathnames}. The set of @i{wild} @i{pathnames} includes, but ++ is not restricted to, @i{pathnames} which have a component which is ++ @t{:wild}, or which have a directory component which contains @t{:wild} ++ or @t{:wild-inferors}. ++ See the @i{function} @b{wild-pathname-p}. ++ ++@IGindex write ++@item @b{write} ++ @i{v.t.} ++ ++ 1. (a @i{binding} or @i{slot} or component) ++ to change the @i{value} of the @i{binding} or @i{slot}. ++ ++ 2. (an @i{object} to a @i{stream}) ++ to output a representation of the @i{object} to the @i{stream}. ++ ++@IGindex writer ++@item @b{writer} ++ @i{n.} ++ a @i{function} that @i{writes}_1 a @i{variable} or @i{slot}. ++ ++@end table ++@subheading @b{Y} ++@table @asis ++ ++@IGindex yield ++@item @b{yield} ++ @i{v.t.} (@i{values}) ++ to produce the @i{values} as the result of @i{evaluation}. ++ ``The form @t{(+ 2 3)} yields @t{5}.'' ++ ++@end table ++ ++@c @end table ++ ++@c end of including concept-glossary ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-3.texi +@@ -0,0 +1,7096 @@ ++ ++ ++@node Evaluation and Compilation, Types and Classes, Syntax, Top ++@chapter Evaluation and Compilation ++ ++@menu ++* Evaluation:: ++* Compilation:: ++* Declarations:: ++* Lambda Lists:: ++* Error Checking in Function Calls:: ++* Traversal Rules and Side Effects:: ++* Destructive Operations:: ++* Evaluation and Compilation Dictionary:: ++@end menu ++ ++@node Evaluation, Compilation, Evaluation and Compilation, Evaluation and Compilation ++@section Evaluation ++ ++@c including concept-eval ++ ++@i{Execution} of @i{code} can be accomplished by a variety of means ranging ++from direct interpretation of a @i{form} representing a @i{program} ++to invocation of @i{compiled code} produced by a @i{compiler}. ++ ++@i{Evaluation} ++@IGindex evaluation ++ is the process by which a @i{program} is @i{executed} in @r{Common Lisp}. ++The mechanism of @i{evaluation} is manifested ++ both implicitly through the effect of the @i{Lisp read-eval-print loop}, ++ and explicitly through the presence of the @i{functions} ++ @b{eval}, ++ @b{compile}, ++ @b{compile-file}, ++ and @b{load}. ++Any of these facilities might share the same execution strategy, ++or each might use a different one. ++ ++The behavior of a @i{conforming program} processed by @b{eval} ++and by @b{compile-file} might differ; see @ref{Semantic Constraints}. ++ ++@i{Evaluation} can be understood in terms of a model in which an ++interpreter recursively traverses a @i{form} performing each ++step of the computation as it goes. ++This model, which describes the semantics of @r{Common Lisp} @i{programs}, ++is described in @ref{The Evaluation Model}. ++ ++@menu ++* Introduction to Environments:: ++* The Evaluation Model:: ++* Lambda Expressions:: ++* Closures and Lexical Binding:: ++* Shadowing:: ++* Extent:: ++* Return Values:: ++@end menu ++ ++@node Introduction to Environments, The Evaluation Model, Evaluation, Evaluation ++@subsection Introduction to Environments ++ ++A @i{binding} ++@IGindex binding ++ is an association between a @i{name} and ++that which the name denotes. @i{Bindings} are @i{established} ++in a @i{lexical environment} or a @i{dynamic environment} ++by particular @i{special operators}. ++ ++An @i{environment} ++@IGindex environment ++ is a set of @i{bindings} and other information ++used during evaluation (@i{e.g.}, to associate meanings with names). ++ ++@i{Bindings} in an @i{environment} are partitioned into @i{namespaces} ++@IGindex namespace ++. ++A single @i{name} can simultaneously have more than one ++associated @i{binding} per @i{environment}, ++but can have only one associated @i{binding} per @i{namespace}. ++ ++@menu ++* The Global Environment:: ++* Dynamic Environments:: ++* Lexical Environments:: ++* The Null Lexical Environment:: ++* Environment Objects:: ++@end menu ++ ++@node The Global Environment, Dynamic Environments, Introduction to Environments, Introduction to Environments ++@subsubsection The Global Environment ++ ++The @i{global environment} ++@IGindex global environment ++ is that part of an @i{environment} ++that contains @i{bindings} with both @i{indefinite scope} ++and @i{indefinite extent}. ++The @i{global environment} contains, among other things, the following: ++ ++@table @asis ++ ++@item @t{*} ++@i{bindings} of @i{dynamic variables} and @i{constant variables}. ++@item @t{*} ++@i{bindings} of @i{functions}, @i{macros}, and @i{special operators}. ++@item @t{*} ++ ++ @i{bindings} of @i{compiler macros}. ++ ++@item @t{*} ++@i{bindings} of @i{type} and @i{class} @i{names} ++@item @t{*} ++information about @i{proclamations}. ++@end table ++ ++@node Dynamic Environments, Lexical Environments, The Global Environment, Introduction to Environments ++@subsubsection Dynamic Environments ++ ++A @i{dynamic environment} ++@IGindex dynamic environment ++ for @i{evaluation} is that part of an ++@i{environment} that contains @i{bindings} whose duration ++is bounded by points of @i{establishment} and @i{disestablishment} ++within the execution of the @i{form} that ++established the @i{binding}. ++A @i{dynamic environment} contains, among other things, the following: ++ ++@table @asis ++ ++@item @t{*} ++@i{bindings} for @i{dynamic variables}. ++@item @t{*} ++information about @i{active} @i{catch tags}. ++@item @t{*} ++information about @i{exit points} established by @b{unwind-protect}. ++@item @t{*} ++information about @i{active} @i{handlers} and @i{restarts}. ++@end table ++ ++The @i{dynamic environment} that is active at any given point ++in the @i{execution} of a @i{program} is referred to by ++definite reference as ``the current @i{dynamic environment},'' ++or sometimes as just ``the @i{dynamic environment}.'' ++ ++Within a given @i{namespace}, ++a @i{name} is said to be @i{bound} ++in a @i{dynamic environment} if there is a @i{binding} ++associated with its @i{name} in the @i{dynamic environment} ++or, if not, there is a @i{binding} ++associated with its name in the @i{global environment}. ++ ++@node Lexical Environments, The Null Lexical Environment, Dynamic Environments, Introduction to Environments ++@subsubsection Lexical Environments ++ ++A @i{lexical environment} ++@IGindex lexical environment ++ for @i{evaluation} at some position in a @i{program} ++is that part of the @i{environment} that contains information having ++@i{lexical scope} within the @i{forms} containing that position. ++A @i{lexical environment} contains, among other things, the following: ++ ++@table @asis ++ ++@item @t{*} ++@i{bindings} of @i{lexical variables} and @i{symbol macros}. ++@item @t{*} ++@i{bindings} of @i{functions} and @i{macros}. ++ (Implicit in this is information about those @i{compiler macros} ++ that are locally disabled.) ++@item @t{*} ++@i{bindings} of @i{block tags}. ++@item @t{*} ++@i{bindings} of @i{go tags}. ++@item @t{*} ++information about @i{declarations}. ++@end table ++ ++The @i{lexical environment} that is active at any given position ++in a @i{program} being semantically processed is referred to by ++definite reference as ``the current @i{lexical environment},'' ++or sometimes as just ``the @i{lexical environment}.'' ++ ++Within a given @i{namespace}, ++a @i{name} is said to be @i{bound} in a @i{lexical environment} ++if there is a @i{binding} ++associated with its @i{name} ++in the @i{lexical environment} or, if not, there is a @i{binding} ++associated with its name in the @i{global environment}. ++ ++@node The Null Lexical Environment, Environment Objects, Lexical Environments, Introduction to Environments ++@subsubsection The Null Lexical Environment ++ ++The @i{null lexical environment} ++@IGindex null lexical environment ++ is equivalent to the @i{global environment}. ++ ++Although in general the representation of an @i{environment} @i{object} ++is @i{implementation-dependent}, @b{nil} can be used in any situation where an ++@i{environment} @i{object} is called for in order to denote ++the @i{null lexical environment}. ++ ++@node Environment Objects, , The Null Lexical Environment, Introduction to Environments ++@subsubsection Environment Objects ++ ++Some @i{operators} make use of an @i{object}, ++called an @i{environment object} ++@IGindex environment object ++, ++that represents the set of @i{lexical bindings} needed to perform ++semantic analysis on a @i{form} in a given @i{lexical environment}. ++The set of @i{bindings} in an @i{environment object} ++may be a subset of the @i{bindings} that would be needed to actually ++perform an @i{evaluation}; for example, @i{values} associated with ++@i{variable} @i{names} and @i{function names} in the corresponding ++@i{lexical environment} might not be available in an @i{environment object}. ++ ++The @i{type} and nature of an @i{environment object} is @i{implementation-dependent}. ++The @i{values} of @i{environment parameters} to @i{macro functions} ++are examples of @i{environment objects}. ++ ++The @i{object} @b{nil} when used as an @i{environment object} ++denotes the @i{null lexical environment}; ++see @ref{The Null Lexical Environment}. ++ ++@node The Evaluation Model, Lambda Expressions, Introduction to Environments, Evaluation ++@subsection The Evaluation Model ++ ++A @r{Common Lisp} system evaluates @i{forms} with respect to lexical, ++dynamic, and global @i{environments}. The following sections ++describe the components of the @r{Common Lisp} evaluation model. ++ ++@menu ++* Form Evaluation:: ++* Symbols as Forms:: ++* Lexical Variables:: ++* Dynamic Variables:: ++* Constant Variables:: ++* Symbols Naming Both Lexical and Dynamic Variables:: ++* Conses as Forms:: ++* Special Forms:: ++* Macro Forms:: ++* Function Forms:: ++* Lambda Forms:: ++* Self-Evaluating Objects:: ++* Examples of Self-Evaluating Objects:: ++@end menu ++ ++@node Form Evaluation, Symbols as Forms, The Evaluation Model, The Evaluation Model ++@subsubsection Form Evaluation ++ ++@i{Forms} fall into three categories: ++@i{symbols}, @i{conses}, and @i{self-evaluating objects}. ++The following sections explain these categories. ++ ++@node Symbols as Forms, Lexical Variables, Form Evaluation, The Evaluation Model ++@subsubsection Symbols as Forms ++ ++If a @i{form} is a @i{symbol}, ++then it is either a @i{symbol macro} or a @i{variable}. ++ ++The @i{symbol} names a @i{symbol macro} ++if there is a @i{binding} of the @i{symbol} as a @i{symbol macro} ++in the current @i{lexical environment} ++ ++ (see @b{define-symbol-macro} and @b{symbol-macrolet}). ++ ++If the @i{symbol} is a @i{symbol macro}, ++its expansion function is obtained. ++The expansion function is a function of two arguments, and is invoked ++by calling the @i{macroexpand hook} with ++ the expansion function as its first argument, ++ the @i{symbol} as its second argument, ++ and an @i{environment object} (corresponding to the current @i{lexical environment}) ++ as its third argument. ++The @i{macroexpand hook}, in turn, calls the expansion function with the ++@i{form} as its first argument and the @i{environment} as its second argument. ++The @i{value} of the expansion function, which is passed through ++by the @i{macroexpand hook}, is a @i{form}. ++This resulting @i{form} is processed in place of the original @i{symbol}. ++ ++If a @i{form} is a @i{symbol} that is not a @i{symbol macro}, ++then it is the @i{name} of a @i{variable}, and the @i{value} of that ++@i{variable} is returned. There are three kinds of variables: ++ @i{lexical variables}, ++ @i{dynamic variables}, ++and ++ @i{constant variables}. ++A @i{variable} can store one @i{object}. ++The main operations on a @i{variable} are ++ to @i{read}_1 and ++ to @i{write}_1 ++its @i{value}. ++ ++An error of @i{type} @b{unbound-variable} should be signaled if ++an @i{unbound variable} is referenced. ++ ++@i{Non-constant variables} can be @i{assigned} by using @b{setq} ++or @i{bound}_3 by using @b{let}. ++Figure 3--1 lists some @i{defined names} that ++are applicable to assigning, binding, and defining @i{variables}. ++ ++@format ++@group ++@noindent ++@w{ boundp let progv } ++@w{ defconstant let* psetq } ++@w{ defparameter makunbound set } ++@w{ defvar multiple-value-bind setq } ++@w{ lambda multiple-value-setq symbol-value } ++ ++@noindent ++@w{ Figure 3--1: Some Defined Names Applicable to Variables} ++ ++@end group ++@end format ++ ++The following is a description of each kind of variable. ++ ++@node Lexical Variables, Dynamic Variables, Symbols as Forms, The Evaluation Model ++@subsubsection Lexical Variables ++ ++A @i{lexical variable} is a @i{variable} that can be referenced only within ++the @i{lexical scope} of the @i{form} that establishes that @i{variable}; ++@i{lexical variables} have @i{lexical scope}. ++Each time a @i{form} creates a @i{lexical binding} of a @i{variable}, ++a @i{fresh} @i{binding} is @i{established}. ++ ++Within the @i{scope} of a @i{binding} for a @i{lexical variable} @i{name}, ++uses of that @i{name} as a @i{variable} are considered to be references ++to that @i{binding} except where the @i{variable} is @i{shadowed}_2 ++by a @i{form} that @i{establishes} a @i{fresh} @i{binding} for that ++@i{variable} @i{name}, ++or by a @i{form} that locally @i{declares} the @i{name} @b{special}. ++ ++A @i{lexical variable} always has a @i{value}. ++There is no @i{operator} that introduces a @i{binding} for a ++@i{lexical variable} without giving it an initial @i{value}, nor ++is there any @i{operator} that can make a @i{lexical variable} be @i{unbound}. ++ ++@i{Bindings} of @i{lexical variables} are found in the @i{lexical environment}. ++ ++@node Dynamic Variables, Constant Variables, Lexical Variables, The Evaluation Model ++@subsubsection Dynamic Variables ++ ++A @i{variable} is a @i{dynamic variable} if one of the following ++conditions hold: ++ ++@table @asis ++ ++@item @t{*} ++It is locally declared or globally proclaimed @b{special}. ++ ++@item @t{*} ++It occurs textually within a @i{form} that ++creates a @i{dynamic binding} for a @i{variable} of the @i{same} @i{name}, ++and the @i{binding} is not @i{shadowed}_2 by a @i{form} ++that creates a @i{lexical binding} of the same @i{variable} @i{name}. ++ ++@end table ++ ++A @i{dynamic variable} can be referenced at any time in any @i{program}; ++there is no textual limitation on references to @i{dynamic variables}. ++At any given time, all @i{dynamic variables} with a given name refer to ++exactly one @i{binding}, either in the @i{dynamic environment} ++or in the @i{global environment}. ++ ++The @i{value} part of the @i{binding} for a @i{dynamic variable} might ++be empty; in this case, the @i{dynamic variable} is said to have no @i{value}, ++or to be @i{unbound}. A @i{dynamic variable} can be made @i{unbound} ++by using @b{makunbound}. ++ ++The effect of @i{binding} a @i{dynamic variable} is to create ++a new @i{binding} to which all references to that @i{dynamic variable} ++in any @i{program} refer for the duration of the @i{evaluation} of the @i{form} ++that creates the @i{dynamic binding}. ++ ++A @i{dynamic variable} can be referenced outside the @i{dynamic extent} of ++a @i{form} that @i{binds} it. Such a @i{variable} is sometimes called ++a ``global variable'' but is still in all respects just a @i{dynamic variable} ++whose @i{binding} happens to exist in the @i{global environment} rather than in some ++@i{dynamic environment}. ++ ++A @i{dynamic variable} is @i{unbound} ++unless and until explicitly assigned a value, except for ++those variables whose initial value is ++defined in this specification or by an @i{implementation}. ++ ++@node Constant Variables, Symbols Naming Both Lexical and Dynamic Variables, Dynamic Variables, The Evaluation Model ++@subsubsection Constant Variables ++ ++Certain variables, called @i{constant variables}, are reserved as ``named constants.'' ++The consequences are undefined if an attempt is made to ++ assign a value to, ++ or create ++a @i{binding} for a @i{constant variable}, ++except that a `compatible' redefinition of a @i{constant variable} ++using @b{defconstant} is permitted; see the @i{macro} @b{defconstant}. ++ ++@i{Keywords}, ++@i{symbols} defined by @r{Common Lisp} or the @i{implementation} ++ as constant (such as @b{nil}, @b{t}, and @b{pi}), ++and @i{symbols} declared as constant using @b{defconstant} ++are @i{constant variables}. ++ ++@node Symbols Naming Both Lexical and Dynamic Variables, Conses as Forms, Constant Variables, The Evaluation Model ++@subsubsection Symbols Naming Both Lexical and Dynamic Variables ++ ++The same @i{symbol} can name both ++ a @i{lexical variable} ++and a @i{dynamic variable}, ++but never in the same @i{lexical environment}. ++ ++In the following example, the @i{symbol} @t{x} is used, ++at different times, ++ as the @i{name} of a @i{lexical variable} ++and as the @i{name} of a @i{dynamic variable}. ++ ++@example ++ (let ((x 1)) ;Binds a special variable X ++ (declare (special x)) ++ (let ((x 2)) ;Binds a lexical variable X ++ (+ x ;Reads a lexical variable X ++ (locally (declare (special x)) ++ x)))) ;Reads a special variable X ++@result{} 3 ++@end example ++ ++@node Conses as Forms, Special Forms, Symbols Naming Both Lexical and Dynamic Variables, The Evaluation Model ++@subsubsection Conses as Forms ++ ++A @i{cons} that is used as a @i{form} is called a @i{compound form}. ++ ++If the @i{car} of that @i{compound form} is a @i{symbol}, ++that @i{symbol} is the @i{name} of an @i{operator}, ++and the @i{form} is either a @i{special form}, a @i{macro form}, ++or a @i{function form}, depending on the @i{function} @i{binding} ++of the @i{operator} in the current @i{lexical environment}. ++If the @i{operator} is neither a @i{special operator} ++nor a @i{macro name}, it is assumed to be a @i{function name} ++(even if there is no definition for such a @i{function}). ++ ++If the @i{car} of the @i{compound form} is not a @i{symbol}, ++then that @i{car} must be a @i{lambda expression}, ++in which case the @i{compound form} is a @i{lambda form}. ++ ++How a @i{compound form} is processed depends on whether it is ++classified as a @i{special form}, a @i{macro form}, ++a @i{function form}, or a @i{lambda form}. ++ ++@node Special Forms, Macro Forms, Conses as Forms, The Evaluation Model ++@subsubsection Special Forms ++ ++A @i{special form} is a @i{form} with special syntax, ++special evaluation rules, or both, possibly manipulating the ++evaluation environment, control flow, or both. ++A @i{special operator} has access to ++ the current @i{lexical environment} ++and the current @i{dynamic environment}. ++Each @i{special operator} defines the manner in which its @i{subexpressions} ++are treated---which are @i{forms}, which are special syntax, @i{etc.} ++ ++Some @i{special operators} create new ++lexical or dynamic @i{environments} for use during the ++@i{evaluation} of @i{subforms} ++of the @i{special form}. For example, @b{block} creates a ++new @i{lexical environment} that is the same as the one in force ++at the point of evaluation of the @b{block} @i{form} ++with the addition of a @i{binding} of the @b{block} name ++to an @i{exit point} from the @b{block}. ++ ++The set of @i{special operator} @i{names} is fixed in @r{Common Lisp}; ++no way is provided for the user to define a @i{special operator}. ++Figure 3--2 lists all of the @r{Common Lisp} @i{symbols} ++that have definitions as @i{special operators}. ++ ++@format ++@group ++@noindent ++@w{ block let* return-from } ++@w{ catch load-time-value setq } ++@w{ eval-when locally symbol-macrolet } ++@w{ flet macrolet tagbody } ++@w{ function multiple-value-call the } ++@w{ go multiple-value-prog1 throw } ++@w{ if progn unwind-protect } ++@w{ labels progv } ++@w{ let quote } ++ ++@noindent ++@w{ Figure 3--2: Common Lisp Special Operators } ++ ++@end group ++@end format ++ ++@node Macro Forms, Function Forms, Special Forms, The Evaluation Model ++@subsubsection Macro Forms ++ ++If the @i{operator} names a @i{macro}, ++its associated @i{macro function} is applied ++to the entire @i{form} and the result of that application is ++used in place of the original @i{form}. ++ ++Specifically, a @i{symbol} names a @i{macro} in a given @i{lexical environment} if ++@b{macro-function} is @i{true} of the ++@i{symbol} and that @i{environment}. ++The @i{function} returned by @b{macro-function} ++is a @i{function} of two arguments, called the ++expansion function. ++The expansion function is invoked by calling the @i{macroexpand hook} with ++ the expansion function as its first argument, ++ the entire @i{macro form} as its second argument, ++ and an @i{environment object} (corresponding to the current @i{lexical environment}) ++ as its third argument. ++The @i{macroexpand hook}, in turn, calls the expansion function with the ++@i{form} as its first argument and the @i{environment} as its second argument. ++The @i{value} of the expansion function, which is passed through ++by the @i{macroexpand hook}, is a @i{form}. ++The returned @i{form} is @i{evaluated} in place of the original @i{form}. ++ ++The consequences are undefined if a @i{macro function} destructively modifies ++any part of its @i{form} argument. ++ ++A @i{macro name} is not a @i{function designator}, ++and cannot be used as the @i{function} argument to @i{functions} ++such as @b{apply}, @b{funcall}, or @b{map}. ++ ++An @i{implementation} is free to implement a @r{Common Lisp} @i{special operator} ++as a @i{macro}. An @i{implementation} is free to implement any ++@i{macro} @i{operator} as a @i{special operator}, but only ++if an equivalent definition of the @i{macro} is also provided. ++ ++Figure 3--3 lists some @i{defined names} that are applicable ++to @i{macros}. ++ ++@format ++@group ++@noindent ++@w{ *macroexpand-hook* macro-function macroexpand-1 } ++@w{ defmacro macroexpand macrolet } ++ ++@noindent ++@w{ Figure 3--3: Defined names applicable to macros } ++ ++@end group ++@end format ++ ++@node Function Forms, Lambda Forms, Macro Forms, The Evaluation Model ++@subsubsection Function Forms ++ ++If the @i{operator} is a @i{symbol} naming a @i{function}, ++the @i{form} represents a @i{function form}, ++and the @i{cdr} of the list contains the @i{forms} ++which when evaluated will supply the arguments passed to the @i{function}. ++ ++When a @i{function name} is not defined, ++an error of @i{type} @b{undefined-function} should be signaled at run time; ++see @ref{Semantic Constraints}. ++ ++A @i{function form} is evaluated as follows: ++ ++The @i{subforms} in the @i{cdr} of the original @i{form} ++are evaluated in left-to-right order in the current lexical and ++dynamic @i{environments}. The @i{primary value} of each ++such @i{evaluation} becomes an @i{argument} to the named @i{function}; ++any additional @i{values} returned by the @i{subforms} are discarded. ++ ++The @i{functional value} of the @i{operator} ++is retrieved from the @i{lexical environment}, ++and that @i{function} is invoked with the indicated arguments. ++ ++Although the order of @i{evaluation} of ++the @i{argument} @i{subforms} themselves is ++strictly left-to-right, it is not specified whether ++the definition of the @i{operator} in a @i{function form} is looked up ++before the @i{evaluation} of the @i{argument} @i{subforms}, ++after the @i{evaluation} of the @i{argument} @i{subforms}, ++or between the @i{evaluation} of any two @i{argument} @i{subforms} ++if there is more than one such @i{argument} @i{subform}. ++For example, the following might return 23 or~24. ++ ++@example ++ (defun foo (x) (+ x 3)) ++ (defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4)))) ++ (foo (progn (bar) 20)) ++@end example ++ ++A @i{binding} for a @i{function name} can be @i{established} in ++one of several ways. A @i{binding} for a @i{function name} in ++the @i{global environment} can be @i{established} by ++ @b{defun}, ++ @b{setf} of @b{fdefinition}, ++ @b{setf} of @b{symbol-function}, ++ @b{ensure-generic-function}, ++ @b{defmethod} (implicitly, due to @b{ensure-generic-function}), ++or ++ @b{defgeneric}. ++A @i{binding} for a @i{function name} in the @i{lexical environment} ++can be @i{established} by ++ @b{flet} ++or @b{labels}. ++ ++Figure 3--4 lists some @i{defined names} that are applicable to @i{functions}. ++ ++@format ++@group ++@noindent ++@w{ apply fdefinition mapcan } ++@w{ call-arguments-limit flet mapcar } ++@w{ complement fmakunbound mapcon } ++@w{ constantly funcall mapl } ++@w{ defgeneric function maplist } ++@w{ defmethod functionp multiple-value-call } ++@w{ defun labels reduce } ++@w{ fboundp map symbol-function } ++ ++@noindent ++@w{ Figure 3--4: Some function-related defined names } ++ ++@end group ++@end format ++ ++@node Lambda Forms, Self-Evaluating Objects, Function Forms, The Evaluation Model ++@subsubsection Lambda Forms ++ ++A @i{lambda form} is similar to a @i{function form}, except that ++the @i{function name} is replaced by a @i{lambda expression}. ++ ++A @i{lambda form} is equivalent to using @i{funcall} of a ++@i{lexical closure} of the @i{lambda expression} on the given @i{arguments}. ++(In practice, some compilers are more likely to produce inline code ++for a @i{lambda form} than for an arbitrary named function ++that has been declared @b{inline}; however, such a difference ++is not semantic.) ++ ++For further information, see @ref{Lambda Expressions}. ++ ++@node Self-Evaluating Objects, Examples of Self-Evaluating Objects, Lambda Forms, The Evaluation Model ++@subsubsection Self-Evaluating Objects ++ ++A @i{form} that is neither a @i{symbol} nor a @i{cons} is ++defined to be a @i{self-evaluating object}. @i{Evaluating} ++such an @i{object} @i{yields} the @i{same} @i{object} ++as a result. ++ ++Certain specific @i{symbols} and @i{conses} might also happen ++to be ``self-evaluating'' but only as a special case of a more ++general set of rules for the @i{evaluation} of @i{symbols} and ++@i{conses}; such @i{objects} are not considered to be ++@i{self-evaluating objects}. ++ ++The consequences are undefined if @i{literal objects} (including ++@i{self-evaluating objects}) are destructively modified. ++ ++@node Examples of Self-Evaluating Objects, , Self-Evaluating Objects, The Evaluation Model ++@subsubsection Examples of Self-Evaluating Objects ++ ++@i{Numbers}, @i{pathnames}, and @i{arrays} are examples of ++@i{self-evaluating objects}. ++ ++@example ++ 3 @result{} 3 ++ #c(2/3 5/8) @result{} #C(2/3 5/8) ++ #p"S:[BILL]OTHELLO.TXT" @result{} #P"S:[BILL]OTHELLO.TXT" ++ #(a b c) @result{} #(A B C) ++ "fred smith" @result{} "fred smith" ++@end example ++ ++@node Lambda Expressions, Closures and Lexical Binding, The Evaluation Model, Evaluation ++@subsection Lambda Expressions ++ ++In a @i{lambda expression}, ++the body is evaluated in a lexical @i{environment} that is formed by ++adding the @i{binding} of ++each @i{parameter} in the @i{lambda list} ++with the corresponding @i{value} from the @i{arguments} ++to the current lexical @i{environment}. ++ ++For further discussion of how @i{bindings} are @i{established} ++based on the @i{lambda list}, see @ref{Lambda Lists}. ++ ++The body of a @i{lambda expression} is an @i{implicit progn}; ++the @i{values} it returns are returned by the @i{lambda expression}. ++ ++@node Closures and Lexical Binding, Shadowing, Lambda Expressions, Evaluation ++@subsection Closures and Lexical Binding ++ ++A @i{lexical closure} is a @i{function} that can refer to and alter ++the values of @i{lexical bindings} @i{established} by @i{binding} @i{forms} ++that textually include the function definition. ++ ++Consider this code, where @t{x} is not declared @b{special}: ++ ++@example ++ (defun two-funs (x) ++ (list (function (lambda () x)) ++ (function (lambda (y) (setq x y))))) ++ (setq funs (two-funs 6)) ++ (funcall (car funs)) @result{} 6 ++ (funcall (cadr funs) 43) @result{} 43 ++ (funcall (car funs)) @result{} 43 ++@end example ++ ++The @b{function} @i{special form} coerces a ++@i{lambda expression} into a @i{closure} in which the ++@i{lexical environment} in effect when the @i{special form} is ++evaluated is captured along with the @i{lambda expression}. ++ ++The function @t{two-funs} returns a @i{list} of two ++@i{functions}, each of which refers to the @i{binding} of the ++variable @t{x} created on entry to the function @t{two-funs} when it ++was called. ++This variable has the value @t{6} ++initially, but @b{setq} can alter this @i{binding}. ++The @i{lexical closure} created for the first ++@i{lambda expression} does not ``snapshot'' the @i{value} @t{6} for @t{x} ++when the @i{closure} is created; rather it captures the @i{binding} of @t{x}. ++The second @i{function} can be used to alter the @i{value} in the same (captured) ++@i{binding} (to @t{43}, in the example), and ++this altered variable binding then affects the value returned by the first @i{function}. ++ ++In situations where a @i{closure} of a ++@i{lambda expression} over the same set of @i{bindings} may be ++produced more than once, the various resulting @i{closures} may ++or may not be @i{identical}, at the discretion of the @i{implementation}. ++That is, two @i{functions} that are behaviorally ++indistinguishable might or might not be @i{identical}. ++Two @i{functions} that are behaviorally distinguishable are @i{distinct}. ++For example: ++ ++@example ++ (let ((x 5) (funs '())) ++ (dotimes (j 10) ++ (push #'(lambda (z) ++ (if (null z) (setq x 0) (+ x z))) ++ funs)) ++ funs) ++@end example ++ ++The result of the above @i{form} is a @i{list} of ten @i{closures}. ++Each requires only the @i{binding} of @t{x}. ++It is the same @i{binding} in each case, ++but the ten @i{closure} @i{objects} might or might not be @i{identical}. ++On the other hand, the result of the @i{form} ++ ++@example ++ (let ((funs '())) ++ (dotimes (j 10) ++ (let ((x 5)) ++ (push (function (lambda (z) ++ (if (null z) (setq x 0) (+ x z)))) ++ funs))) ++ funs) ++@end example ++ ++is also a @i{list} of ten @i{closures}. ++However, in this case no two of the @i{closure} @i{objects} can ++be @i{identical} because each @i{closure} is closed over a distinct ++@i{binding} of @t{x}, and these @i{bindings} can be behaviorally ++distinguished because of the use of @b{setq}. ++ ++The result of the @i{form} ++ ++@example ++ (let ((funs '())) ++ (dotimes (j 10) ++ (let ((x 5)) ++ (push (function (lambda (z) (+ x z))) ++ funs))) ++ funs) ++@end example ++ ++is a @i{list} of ten @i{closure} @i{objects} that ++might or might not be @i{identical}. ++A different @i{binding} of @t{x} is involved for ++each @i{closure}, but the @i{bindings} cannot be distinguished ++because their values are the @i{same} and immutable (there being no occurrence ++of @b{setq} on @t{x}). A compiler could internally ++transform the @i{form} to ++ ++@example ++ (let ((funs '())) ++ (dotimes (j 10) ++ (push (function (lambda (z) (+ 5 z))) ++ funs)) ++ funs) ++@end example ++ ++where the @i{closures} may be @i{identical}. ++ ++It is possible that a @i{closure} does not ++close over any variable bindings. ++In the code fragment ++ ++@example ++ (mapcar (function (lambda (x) (+ x 2))) y) ++@end example ++ ++the function @t{(lambda (x) (+ x 2))} contains no references to any outside ++object. In this case, the same @i{closure} might be returned ++for all evaluations of the @b{function} @i{form}. ++ ++@node Shadowing, Extent, Closures and Lexical Binding, Evaluation ++@subsection Shadowing ++ ++If two @i{forms} that @i{establish} @i{lexical bindings} with ++the same @i{name} N are textually nested, then references to N ++within the inner @i{form} refer to the @i{binding} established by ++the inner @i{form}; the inner @i{binding} for N ++@i{shadows} ++@IGindex shadow ++ the outer @i{binding} for N. Outside the inner ++@i{form} but inside the outer one, references to N refer to the ++@i{binding} established by the outer @i{form}. For example: ++ ++@example ++ (defun test (x z) ++ (let ((z (* x 2))) ++ (print z)) ++ z) ++@end example ++ ++The @i{binding} of the variable @t{z} by ++@b{let} shadows ++the @i{parameter} binding for the function @t{test}. The reference to the ++variable @t{z} in the @b{print} @i{form} refers to the @b{let} binding. ++The reference to @t{z} at the end of the function @t{test} ++refers to the @i{parameter} named @t{z}. ++ ++Constructs that are lexically scoped act as if new names were ++generated for each @i{object} on each execution. Therefore, ++dynamic shadowing cannot occur. For example: ++ ++@example ++ (defun contorted-example (f g x) ++ (if (= x 0) ++ (funcall f) ++ (block here ++ (+ 5 (contorted-example g ++ #'(lambda () (return-from here 4)) ++ (- x 1)))))) ++@end example ++ ++Consider the call @t{(contorted-example nil nil 2)}. This produces ++@t{4}. During the course of execution, there are three ++calls to @t{contorted-example}, interleaved with two ++blocks: ++ ++@example ++ (contorted-example nil nil 2) ++ (block here_1 ...) ++ (contorted-example nil #'(lambda () (return-from here_1 4)) 1) ++ (block here_2 ...) ++ (contorted-example #'(lambda () (return-from here_1 4)) ++ #'(lambda () (return-from here_2 4)) ++ 0) ++ (funcall f) ++ where f @result{} #'(lambda () (return-from here_1 4)) ++ (return-from here_1 4) ++@end example ++ ++At the time the @t{funcall} is executed ++there are two @b{block} @i{exit points} outstanding, each apparently ++named @t{here}. ++The @b{return-from} @i{form} executed as a result of the @t{funcall} ++operation ++refers to the outer outstanding @i{exit point} ++(here_1), not the ++inner one (here_2). ++It ++refers to that @i{exit point} textually visible at the point of ++execution of @b{function} ++(here abbreviated by the @t{#'} syntax) that resulted ++in creation of the @i{function} @i{object} actually invoked by ++@b{funcall}. ++ ++If, in this example, one were to change the @t{(funcall f)} to ++@t{(funcall g)}, then the value of the call @t{(contorted-example nil nil 2)} ++would be @t{9}. The value would change because ++@b{funcall} would cause the ++execution of @t{(return-from here_2 4)}, thereby causing ++a return from the inner @i{exit point} (here_2). ++When that occurs, the value @t{4} is returned from the ++middle invocation of @t{contorted-example}, @t{5} is added to that ++to get @t{9}, and that value is returned from the outer block ++and the outermost call to @t{contorted-example}. The point ++is that the choice of @i{exit point} ++returned from has nothing to do with its ++being innermost or outermost; rather, ++it depends on the lexical environment ++that is packaged up with a @i{lambda expression} when ++@b{function} is executed. ++ ++@node Extent, Return Values, Shadowing, Evaluation ++@subsection Extent ++ ++@t{Contorted-example} works only because the ++@i{function} named by @t{f} is invoked during the @i{extent} of the ++@i{exit point}. ++Once the flow of execution has left the block, ++the @i{exit point} is @i{disestablished}. For example: ++ ++@example ++ (defun invalid-example () ++ (let ((y (block here #'(lambda (z) (return-from here z))))) ++ (if (numberp y) y (funcall y 5)))) ++@end example ++ ++One might expect the call @t{(invalid-example)} to produce @t{5} ++by the following incorrect reasoning: ++@b{let} binds @t{y} to the ++value of @b{block}; this value is a @i{function} resulting ++from the @i{lambda expression}. Because @t{y} is not a number, it is ++invoked on the value @t{5}. The @b{return-from} should then ++return this value from the ++@i{exit point} named @t{here}, thereby ++exiting from the block again and giving @t{y} the value @t{5} ++which, being a number, is then returned as the value of the call ++to @t{invalid-example}. ++ ++The argument fails only because @i{exit points} have ++@i{dynamic extent}. The argument is correct up to the execution of ++@b{return-from}. The execution of @b{return-from} ++should signal an error of @i{type} @b{control-error}, however, not ++because it cannot refer to the @i{exit point}, but because it ++does correctly refer to an @i{exit point} and that ++@i{exit point} has been @i{disestablished}. ++ ++A reference by name to a dynamic @i{exit point} binding such as ++a @i{catch tag} refers to the most recently ++@i{established} @i{binding} of that name that has not been ++@i{disestablished}. For example: ++ ++@example ++ (defun fun1 (x) ++ (catch 'trap (+ 3 (fun2 x)))) ++ (defun fun2 (y) ++ (catch 'trap (* 5 (fun3 y)))) ++ (defun fun3 (z) ++ (throw 'trap z)) ++@end example ++ ++Consider the call @t{(fun1 7)}. The result is @t{10}. At the time ++the @b{throw} is executed, there are two outstanding catchers with the ++name @t{trap}: one established within procedure @t{fun1}, and the other ++within procedure @t{fun2}. The latter is the more recent, and so the ++value @t{7} is returned from @b{catch} in @t{fun2}. ++Viewed from within @t{fun3}, the @b{catch} ++in @t{fun2} shadows the one in @t{fun1}. ++Had @t{fun2} been defined as ++ ++@example ++ (defun fun2 (y) ++ (catch 'snare (* 5 (fun3 y)))) ++@end example ++ ++then the two @i{exit points} ++would have different @i{names}, and therefore the one ++in @t{fun1} would not be shadowed. The result would then have been @t{7}. ++ ++@node Return Values, , Extent, Evaluation ++@subsection Return Values ++ ++Ordinarily the result of calling a @i{function} is a single @i{object}. ++Sometimes, however, it is convenient for a function to compute several ++@i{objects} and return them. ++ ++In order to receive other than exactly one value from a @i{form}, ++one of several @i{special forms} or @i{macros} must be used to request those ++values. If a @i{form} produces @i{multiple values} which were not ++requested in this way, then the first value is given to the caller and ++all others are discarded; if the @i{form} produces zero values, ++then the caller receives @b{nil} as a value. ++ ++Figure 3--5 lists ++some @i{operators} for receiving @i{multiple values}_2. ++These @i{operators} can be used to specify ++ one or more @i{forms} to @i{evaluate} ++and where to put the @i{values} returned by those @i{forms}. ++ ++@format ++@group ++@noindent ++@w{ multiple-value-bind multiple-value-prog1 return-from } ++@w{ multiple-value-call multiple-value-setq throw } ++@w{ multiple-value-list return } ++ ++@noindent ++@w{ Figure 3--5: Some operators applicable to receiving multiple values} ++ ++@end group ++@end format ++ ++The @i{function} @b{values} can produce @i{multiple values}_2. ++@t{(values)} returns zero values; ++@t{(values @i{form})} returns the @i{primary value} returned by @i{form}; ++@t{(values @i{form1} @i{form2})} returns two values, ++ the @i{primary value} of @i{form1} ++and the @i{primary value} of @i{form2}; ++and so on. ++ ++See @b{multiple-values-limit} and @b{values-list}. ++ ++@c end of including concept-eval ++ ++@node Compilation, Declarations, Evaluation, Evaluation and Compilation ++@section Compilation ++ ++@c including concept-compile ++ ++@menu ++* Compiler Terminology:: ++* Compilation Semantics:: ++* File Compilation:: ++* Literal Objects in Compiled Files:: ++* Exceptional Situations in the Compiler:: ++@end menu ++ ++@node Compiler Terminology, Compilation Semantics, Compilation, Compilation ++@subsection Compiler Terminology ++ ++The following terminology is used in this section. ++ ++The @i{compiler} ++@IGindex compiler ++ is a utility that translates code into an ++@i{implementation-dependent} form that might be represented or ++executed efficiently. ++The term @i{compiler} ++@IGindex compiler ++ refers to both of the @i{functions} ++@b{compile} and @b{compile-file}. ++ ++The term @i{compiled code} ++@IGindex compiled code ++ refers to ++@i{objects} representing compiled programs, such as @i{objects} constructed ++by @b{compile} or by @b{load} when @i{loading} a @i{compiled file}. ++ ++The term @i{implicit compilation} ++@IGindex implicit compilation ++ refers to @i{compilation} ++performed during @i{evaluation}. ++ ++The term @i{literal object} ++@IGindex literal object ++ refers to ++ a quoted @i{object} ++ or a @i{self-evaluating object} ++ or an @i{object} that is a substructure of such an @i{object}. ++A @i{constant variable} is not itself a @i{literal object}. ++ ++The term @i{coalesce} ++@IGindex coalesce ++ is defined as follows. ++Suppose @t{A} and @t{B} are two @i{literal constants} in the @i{source code}, ++and that @t{A'} and @t{B'} are the corresponding @i{objects} in the @i{compiled code}. ++If @t{A'} and @t{B'} are @b{eql} but ++@t{A} and @t{B} are not @b{eql}, then it is said ++that @t{A} and @t{B} have been coalesced by the compiler. ++ ++The term @i{minimal compilation} ++@IGindex minimal compilation ++ refers to actions the compiler ++must take at @i{compile time}. These actions are specified in ++@ref{Compilation Semantics}. ++ ++The verb @i{process} ++@IGindex process ++ refers to performing @i{minimal compilation}, ++determining the time of evaluation for a @i{form}, ++and possibly @i{evaluating} that @i{form} (if required). ++ ++The term @i{further compilation} ++@IGindex further compilation ++ refers to ++@i{implementation-dependent} compilation beyond @i{minimal compilation}. ++That is, @i{processing} does not imply complete compilation. ++Block compilation and generation of machine-specific instructions are ++examples of further compilation. ++Further compilation is permitted to take place at @i{run time}. ++ ++Four different @i{environments} relevant to compilation are ++distinguished: ++ the @i{startup environment}, ++ the @i{compilation environment}, ++ the @i{evaluation environment}, and ++ the @i{run-time environment}. ++ ++The @i{startup environment} ++@IGindex startup environment ++ is ++the @i{environment} of the @i{Lisp image} ++from which the @i{compiler} was invoked. ++ ++The @i{compilation environment} ++@IGindex compilation environment ++ is maintained by the compiler ++and is used to hold definitions and declarations to be used internally ++by the compiler. Only those parts of a definition needed for correct ++compilation are saved. The @i{compilation environment} is used ++as the @i{environment} @i{argument} to macro expanders called by ++the compiler. It is unspecified whether a definition available in the ++@i{compilation environment} can be used in an @i{evaluation} ++initiated in the @i{startup environment} or @i{evaluation environment}. ++ ++The @i{evaluation environment} ++@IGindex evaluation environment ++ is a @i{run-time environment} ++in which macro expanders and code specified by @b{eval-when} ++to be evaluated are evaluated. All evaluations initiated by the ++@i{compiler} take place in the @i{evaluation environment}. ++ ++The @i{run-time environment} ++@IGindex run-time environment ++ is the ++@i{environment} in which the program being compiled will be executed. ++ ++The @i{compilation environment} inherits from ++the @i{evaluation environment}, ++and the @i{compilation environment} and @i{evaluation environment} ++might be @i{identical}. ++The @i{evaluation environment} inherits from ++the @i{startup environment}, ++and the @i{startup environment} and @i{evaluation environment} ++might be @i{identical}. ++ ++The term @i{compile time} ++@IGindex compile time ++ refers to the duration of time that ++the compiler is processing @i{source code}. ++At @i{compile time}, ++only the @i{compilation environment} ++and the @i{evaluation environment} ++are available. ++ ++The term @i{compile-time definition} ++@IGindex compile-time definition ++ refers to a definition in ++the @i{compilation environment}. ++For example, when compiling a file, ++the definition of a function might be retained in the @i{compilation environment} ++if it is declared @b{inline}. ++This definition might not be available in the @i{evaluation environment}. ++ ++The term @i{run time} ++@IGindex run time ++ refers to the duration of time that the ++loader is loading compiled code or compiled code is being executed. ++At run time, only the @i{run-time environment} is available. ++ ++The term @i{run-time definition} ++@IGindex run-time definition ++ refers to a definition in the ++@i{run-time environment}. ++ ++The term @i{run-time compiler} ++@IGindex run-time compiler ++ refers to the @i{function} @b{compile} ++or @i{implicit compilation}, for which the compilation and run-time ++@i{environments} are maintained in the same @i{Lisp image}. ++Note that when the @i{run-time compiler} is used, ++the @i{run-time environment} ++and @i{startup environment} ++are the same. ++ ++@node Compilation Semantics, File Compilation, Compiler Terminology, Compilation ++@subsection Compilation Semantics ++ ++Conceptually, compilation is a process that traverses code, performs ++certain kinds of syntactic and semantic analyses using information ++(such as proclamations and @i{macro} definitions) present in the ++@i{compilation environment}, and produces equivalent, possibly ++more efficient code. ++ ++@menu ++* Compiler Macros:: ++* Purpose of Compiler Macros:: ++* Naming of Compiler Macros:: ++* When Compiler Macros Are Used:: ++* Notes about the Implementation of Compiler Macros:: ++* Minimal Compilation:: ++* Semantic Constraints:: ++@end menu ++ ++@node Compiler Macros, Purpose of Compiler Macros, Compilation Semantics, Compilation Semantics ++@subsubsection Compiler Macros ++ ++A @i{compiler macro} can be defined for a @i{name} ++that also names a @i{function} or @i{macro}. ++That is, it is possible for a ++@i{function name} to name both a @i{function} and a @i{compiler macro}. ++ ++A @i{function name} names a @i{compiler macro} if @b{compiler-macro-function} ++is @i{true} of the @i{function name} in the @i{lexical environment} in which ++it appears. Creating a @i{lexical binding} for the @i{function name} ++not only creates a new local @i{function} or ++@i{macro} definition, but also @i{shadows}_2 the @i{compiler macro}. ++ ++The @i{function} returned by @b{compiler-macro-function} ++is a @i{function} of two arguments, called the ++expansion function. To expand a @i{compiler macro}, ++the expansion function is invoked by calling the @i{macroexpand hook} with ++ the expansion function as its first argument, ++ the entire compiler macro @i{form} as its second argument, ++ and the current compilation @i{environment} ++ (or with the current lexical @i{environment}, ++ if the @i{form} is being processed by something ++ other than @b{compile-file}) ++ as its third argument. ++The @i{macroexpand hook}, in turn, calls the expansion function with the ++@i{form} as its first argument and the @i{environment} as its second argument. ++The return value from the expansion function, which is passed through ++by the @i{macroexpand hook}, might either be the @i{same} @i{form}, ++or else a form that can, at the discretion of the @i{code} doing the expansion, ++be used in place of the original @i{form}. ++ ++@format ++@group ++@noindent ++@w{ *macroexpand-hook* compiler-macro-function define-compiler-macro } ++ ++@noindent ++@w{ Figure 3--6: Defined names applicable to compiler macros } ++ ++@end group ++@end format ++ ++@node Purpose of Compiler Macros, Naming of Compiler Macros, Compiler Macros, Compilation Semantics ++@subsubsection Purpose of Compiler Macros ++ ++The purpose of the @i{compiler macro} facility is to permit ++selective source code transformations as optimization advice ++to the @i{compiler}. When a @i{compound form} is being ++processed (as by the compiler), if the @i{operator} names a ++@i{compiler macro} then the @i{compiler macro function} may be ++invoked on the form, and the resulting expansion recursively processed ++in preference to performing the usual processing on the original @i{form} ++according to its normal interpretation as a @i{function form} or ++@i{macro form}. ++ ++A @i{compiler macro function}, like a @i{macro function}, ++is a @i{function} of two @i{arguments}: the entire call @i{form} ++and the @i{environment}. Unlike an ordinary @i{macro function}, a ++@i{compiler macro function} can decline to provide an expansion merely by ++returning a value that is the @i{same} as the original @i{form}. ++The consequences are undefined if a @i{compiler macro function} ++destructively modifies any part of its @i{form} argument. ++ ++The @i{form} passed to the compiler macro function can either be a @i{list} ++whose @i{car} is the function name, or a @i{list} whose @i{car} is ++@b{funcall} and whose @i{cadr} is a list @t{(function @i{name})}; ++note that this affects destructuring of the form argument by the ++@i{compiler macro function}. ++@b{define-compiler-macro} arranges for destructuring of arguments to be ++performed correctly for both possible formats. ++ ++When @b{compile-file} chooses to expand a @i{top level form} that is ++a @i{compiler macro} @i{form}, the expansion is also treated as a @i{top level form} ++for the purposes of @b{eval-when} processing; see @ref{Processing of Top Level Forms}. ++ ++@node Naming of Compiler Macros, When Compiler Macros Are Used, Purpose of Compiler Macros, Compilation Semantics ++@subsubsection Naming of Compiler Macros ++ ++@i{Compiler macros} may be defined for @i{function names} that name ++@i{macros} as well as @i{functions}. ++ ++@i{Compiler macro} definitions are strictly global. There is no provision ++for defining local @i{compiler macros} in the way that @b{macrolet} ++defines local @i{macros}. Lexical bindings of a function name shadow any ++compiler macro definition associated with the name as well as its ++global @i{function} or @i{macro} definition. ++ ++Note that the presence of a compiler macro definition does not affect ++the values returned by ++ ++functions that access @i{function} definitions (@i{e.g.}, @b{fboundp}) ++or @i{macro} definitions (@i{e.g.}, @b{macroexpand}). ++Compiler macros are global, and the function ++@b{compiler-macro-function} is sufficient to resolve their interaction ++with other lexical and global definitions. ++ ++@node When Compiler Macros Are Used, Notes about the Implementation of Compiler Macros, Naming of Compiler Macros, Compilation Semantics ++@subsubsection When Compiler Macros Are Used ++ ++The presence of a @i{compiler macro} definition for a @i{function} or @i{macro} ++indicates that it is desirable for the @i{compiler} to use the expansion ++of the @i{compiler macro} instead of the original @i{function form} or ++@i{macro form}. However, no language processor ++(compiler, evaluator, or other code walker) is ever required to actually ++invoke @i{compiler macro functions}, or to ++make use of the resulting expansion if it does invoke ++a @i{compiler macro function}. ++ ++When the @i{compiler} encounters a @i{form} during processing that represents ++a call to a @i{compiler macro} @i{name} (that is not declared @b{notinline}), ++the @i{compiler} might expand the @i{compiler macro}, ++and might use the expansion in place of the original @i{form}. ++ ++When @b{eval} encounters a @i{form} during processing that represents ++a call to a @i{compiler macro} @i{name} (that is not declared @b{notinline}), ++@b{eval} might expand the @i{compiler macro}, ++and might use the expansion in place of the original @i{form}. ++ ++There are two situations in which a @i{compiler macro} definition must not be ++applied by any language processor: ++ ++@table @asis ++ ++@item @t{*} ++The global function name binding associated with the compiler ++ macro is shadowed by a lexical binding of the function name. ++ ++@item @t{*} ++The function name has been declared or proclaimed @b{notinline} and ++ the call form appears within the scope of the declaration. ++@end table ++ ++It is unspecified whether @i{compiler macros} are expanded or used in any other ++situations. ++ ++@node Notes about the Implementation of Compiler Macros, Minimal Compilation, When Compiler Macros Are Used, Compilation Semantics ++@subsubsection Notes about the Implementation of Compiler Macros ++ ++Although it is technically permissible, as described above, ++for @b{eval} to treat @i{compiler macros} in the same situations ++as @i{compiler} might, this is not necessarily a good idea in ++@i{interpreted implementations}. ++ ++@i{Compiler macros} exist for the purpose of trading compile-time speed ++for run-time speed. Programmers who write @i{compiler macros} tend to ++assume that the @i{compiler macros} can take more time than normal @i{functions} ++and @i{macros} in order to produce code which is especially optimal for use ++at run time. Since @b{eval} in an @i{interpreted implementation} ++might perform semantic analysis of the same form multiple times, it might be ++inefficient in general for the @i{implementation} to choose to call ++@i{compiler macros} on every such @i{evaluation}. ++ ++Nevertheless, the decision about what to do in these situations is left to ++each @i{implementation}. ++ ++@node Minimal Compilation, Semantic Constraints, Notes about the Implementation of Compiler Macros, Compilation Semantics ++@subsubsection Minimal Compilation ++ ++@i{Minimal compilation} is defined as follows: ++ ++@table @asis ++ ++@item @t{*} ++All @i{compiler macro} ++@IGindex compiler macro ++ calls appearing in the ++@i{source code} being compiled are expanded, if at all, at compile time; ++they will not be expanded at run time. ++ ++@item @t{*} ++All @i{macro} ++@IGindex macro ++ and ++@i{symbol macro} ++@IGindex symbol macro ++ calls ++appearing in the source code being compiled are expanded at compile time ++in such a way that they will not be expanded again at run time. ++@b{macrolet} ++@IRindex macrolet ++ ++and ++@b{symbol-macrolet} ++@IRindex symbol-macrolet ++ ++are effectively replaced by ++@i{forms} corresponding to their bodies in which calls to ++@i{macros} are replaced by their expansions. ++ ++@item @t{*} ++The first @i{argument} in a @b{load-time-value} ++@IRindex load-time-value ++ ++@i{form} ++in @i{source code} processed by @b{compile} ++@IRindex compile ++ ++is @i{evaluated} at @i{compile time}; ++in @i{source code} processed by @b{compile-file} ++@IRindex compile-file ++, ++the compiler arranges for it to be @i{evaluated} at @i{load time}. ++In either case, the result of the @i{evaluation} ++is remembered and used later as the value of the ++@b{load-time-value} @i{form} at @i{execution time}. ++ ++@end table ++ ++@node Semantic Constraints, , Minimal Compilation, Compilation Semantics ++@subsubsection Semantic Constraints ++ ++All @i{conforming programs} must obey the following constraints, ++which are designed to minimize the observable differences ++between compiled and interpreted programs: ++ ++@table @asis ++ ++@item @t{*} ++Definitions of any referenced @i{macros} ++must be present in the @i{compilation environment}. ++Any @i{form} that is a @i{list} ++beginning with a @i{symbol} that does not name a ++@i{special operator} or a @i{macro} defined in the ++@i{compilation environment} is treated by the compiler as a ++function call. ++ ++@item @t{*} ++@b{Special} proclamations for @i{dynamic variables} ++must be made in the @i{compilation environment}. Any @i{binding} ++for which there is no @b{special} declaration or proclamation in ++the @i{compilation environment} is treated by the compiler as ++a @i{lexical binding}. ++ ++@item @t{*} ++The definition of a function that is defined and ++declared @b{inline} in the @i{compilation environment} must be ++the same at run time. ++ ++@item @t{*} ++Within a @i{function} named F, the compiler may ++(but is not required to) ++assume that an apparent recursive call to a @i{function} named F ++refers to the same definition of F, ++unless that function has been declared @b{notinline}. ++The consequences of redefining such a recursively defined @i{function} F ++while it is executing are undefined. ++ ++@item @t{*} ++A call within a file to a named function that is ++defined in the same file refers to that function, unless that function ++has been declared @b{notinline}. The consequences are unspecified ++if functions are redefined individually at run time or multiply ++defined in the same file. ++ ++@item @t{*} ++The argument syntax and number of return values for ++all functions whose @b{ftype} is declared at compile time must ++remain the same at run time. ++ ++@item @t{*} ++@i{Constant variables} defined in ++the @i{compilation environment} must have a @i{similar} value at ++run time. A reference to ++a @i{constant variable} ++in @i{source code} is equivalent to a reference to ++a @i{literal} @i{object} that is the @i{value} of the @i{constant variable}. ++ ++@item @t{*} ++Type definitions made with @b{deftype} or ++@b{defstruct} in the @i{compilation environment} must ++retain the same definition at run time. Classes defined by @b{defclass} ++in the @i{compilation environment} must be defined ++at run time to have the same @i{superclasses} and same ++@i{metaclass}. ++ ++This implies that @i{subtype}/@i{supertype} relationships of ++@i{type specifiers} must not change between @i{compile time} and @i{run time}. ++ ++@item @t{*} ++Type declarations present in the compilation ++@i{environment} must accurately describe the corresponding values at run time; ++otherwise, the consequences are undefined. It is permissible ++for an unknown @i{type} to appear in a declaration at ++compile time, though a warning might be signaled in such a case. ++ ++@item @t{*} ++Except in the situations explicitly listed above, a ++@i{function} defined in the @i{evaluation environment} ++is permitted to have a different definition or a different @i{signature} ++at run time, and the run-time definition prevails. ++ ++@end table ++ ++@i{Conforming programs} should not be written using any additional ++assumptions about consistency between the run-time ++@i{environment} and the startup, evaluation, and compilation ++@i{environments}. ++ ++Except where noted, when a compile-time and a run-time definition are ++different, one of the following occurs at run time: ++ ++@table @asis ++ ++@item @t{*} ++an error of @i{type} @b{error} is signaled ++@item @t{*} ++the compile-time definition prevails ++@item @t{*} ++the run-time definition prevails ++ ++@end table ++ ++If the @i{compiler} processes a @i{function form} whose @i{operator} ++is not defined at compile time, no error is signaled at compile time. ++ ++@node File Compilation, Literal Objects in Compiled Files, Compilation Semantics, Compilation ++@subsection File Compilation ++ ++The @i{function} @b{compile-file} performs compilation of ++@i{forms} in a file following the rules specified in @ref{Compilation Semantics}, ++and produces an output file that can be loaded by using @b{load}. ++ ++Normally, the @i{top level forms} appearing in a file compiled with ++@b{compile-file} are evaluated only when the resulting ++compiled file is loaded, and not when the file is compiled. However, ++it is typically the case that some forms in the file need to be evaluated ++at compile time so the ++remainder of the file can be read and compiled correctly. ++ ++The @b{eval-when} @i{special form} can be used to control ++whether a @i{top level form} is evaluated at compile time, load ++time, or both. It is possible to specify any of three situations with ++@b{eval-when}, denoted by the symbols @t{:compile-toplevel}, ++@t{:load-toplevel}, and @t{:execute}. For top level ++@b{eval-when} forms, @t{:compile-toplevel} specifies that the ++compiler must evaluate the body at compile time, and @t{:load-toplevel} specifies that the compiler must arrange to evaluate ++the body at load time. For non-top level @b{eval-when} forms, ++@t{:execute} specifies that the body must be executed in the run-time ++@i{environment}. ++ ++The behavior of this @i{form} can be more precisely understood in ++terms of a model of how @b{compile-file} processes forms in ++a file to be compiled. There are two processing modes, called ++``not-compile-time'' and ``compile-time-too''. ++ ++Successive forms are read from the file by @b{compile-file} ++and processed in not-compile-time mode; in this mode, ++@b{compile-file} arranges for forms to be evaluated only at load time ++and not at compile time. When @b{compile-file} is in ++compile-time-too mode, forms are evaluated both at compile time and ++load time. ++ ++@menu ++* Processing of Top Level Forms:: ++* Processing of Defining Macros:: ++* Constraints on Macros and Compiler Macros:: ++@end menu ++ ++@node Processing of Top Level Forms, Processing of Defining Macros, File Compilation, File Compilation ++@subsubsection Processing of Top Level Forms ++ ++Processing of @i{top level forms} in the file compiler is defined ++as follows: ++ ++@table @asis ++ ++@item 1. ++If the @i{form} is a @i{compiler macro form} ++(not disabled by a @b{notinline} @i{declaration}), ++the @i{implementation} might or might not choose to compute ++the @i{compiler macro expansion} of the @i{form} and, ++having performed the expansion, might or might not choose to process the result ++as a @i{top level form} in the same processing mode ++(compile-time-too or not-compile-time). ++If it declines to obtain or use the expansion, it must process the original @i{form}. ++ ++@item 2. ++If the form is a @i{macro form}, ++its @i{macro expansion} is computed and processed as a ++@i{top level form} in ++the same processing mode (compile-time-too or not-compile-time). ++ ++@item 3. ++If the form is a @b{progn} form, each of its ++body @i{forms} is sequentially processed as a ++@i{top level form} in the same processing mode. ++ ++@item 4. ++If the form is a @b{locally}, ++@b{macrolet}, or @b{symbol-macrolet}, ++@b{compile-file} establishes the appropriate bindings and processes the ++body forms as @i{top level forms} with those bindings in effect ++in the same processing mode. (Note that this implies that the lexical ++@i{environment} in which @i{top level forms} are processed ++is not necessarily the @i{null lexical environment}.) ++ ++@item 5. ++If the form is an @b{eval-when} ++@IRindex eval-when ++ form, it is ++handled according to Figure 3--7. ++ ++ plus .5 fil ++\offinterlineskip ++@format ++@group ++@noindent ++@w{ @b{CT} @b{LT} @b{E} @b{Mode} @b{Action} @b{New Mode} } ++@w{ _________________________________________________} ++@w{ Yes Yes --- --- Process compile-time-too } ++@w{ No Yes Yes CTT Process compile-time-too } ++@w{ No Yes Yes NCT Process not-compile-time } ++@w{ No Yes No --- Process not-compile-time } ++@w{ Yes No --- --- Evaluate --- } ++@w{ No No Yes CTT Evaluate --- } ++@w{ No No Yes NCT Discard --- } ++@w{ No No No --- Discard --- } ++@end group ++@end format ++ ++@w{ Figure 3--7: EVAL-WHEN processing} ++ ++Column @b{CT} indicates whether @t{:compile-toplevel} is specified. ++Column @b{LT} indicates whether @t{:load-toplevel} is specified. ++Column @b{E} indicates whether @t{:execute} is specified. ++Column @b{Mode} indicates the processing mode; ++ a dash (---) indicates that the processing mode is not relevant. ++ ++The @b{Action} column specifies one of three actions: ++ ++@table @asis ++ ++@item @t{} ++@b{Process:} process the body as @i{top level forms} in the ++specified mode. ++ ++@item @t{} ++@b{Evaluate:} evaluate the body in the dynamic execution ++context of the compiler, using the @i{evaluation environment} as ++the global environment and the @i{lexical environment} in which ++the @b{eval-when} appears. ++ ++@item @t{} ++@b{Discard:} ignore the @i{form}. ++@end table ++ ++The @b{New Mode} column indicates the new processing mode. ++A dash (---) indicates the compiler remains in its current mode. ++ ++@item 6. ++Otherwise, the form is a @i{top level form} that ++is not one of the special cases. In compile-time-too mode, the ++compiler first evaluates the form in the evaluation ++@i{environment} and then minimally compiles it. In not-compile-time ++mode, the @i{form} is simply minimally compiled. All @i{subforms} ++are treated as @i{non-top-level forms}. ++ ++Note that @i{top level forms} are processed in the order in ++which they textually appear in the file and that each ++@i{top level form} read by the compiler is processed before the next is ++read. However, the order of processing (including macro expansion) of ++@i{subforms} that are not @i{top level forms} and the order of ++further compilation is unspecified as long as Common Lisp semantics ++are preserved. ++ ++@end table ++ ++@b{eval-when} forms cause compile-time evaluation only at ++top level. Both @t{:compile-toplevel} and @t{:load-toplevel} situation specifications ++are ignored for @i{non-top-level forms}. For @i{non-top-level forms}, ++an @b{eval-when} ++specifying the @t{:execute} situation is treated as an @i{implicit progn} ++including the @i{forms} in the body of the @b{eval-when} @i{form}; ++otherwise, the @i{forms} in the body are ignored. ++ ++@node Processing of Defining Macros, Constraints on Macros and Compiler Macros, Processing of Top Level Forms, File Compilation ++@subsubsection Processing of Defining Macros ++ ++Defining @i{macros} (such as @b{defmacro} or @b{defvar}) ++appearing within a file being processed by @b{compile-file} ++normally have compile-time side effects which affect how subsequent @i{forms} ++in the same @i{file} are compiled. A convenient model for explaining how these ++side effects happen is that the defining macro expands into one or ++more @b{eval-when} @i{forms}, and that the calls which cause the compile-time ++side effects to happen appear ++in the body of an @t{(eval-when (:compile-toplevel) ...)} @i{form}. ++ ++The compile-time side effects may cause information about the definition to ++be stored differently than if the defining macro had been processed in the ++`normal' way (either interpretively or by loading the compiled file). ++ ++In particular, the information stored by the defining @i{macros} at compile time ++might or might not be available to the interpreter (either during or after compilation), ++or during subsequent calls to the @i{compiler}. For example, ++the following code is nonportable because it assumes that the @i{compiler} ++stores the macro definition of @t{foo} where it is available to the interpreter: ++ ++@example ++ (defmacro foo (x) `(car ,x)) ++ (eval-when (:execute :compile-toplevel :load-toplevel) ++ (print (foo '(a b c)))) ++@end example ++ ++A portable way to do the same thing would be to include the macro ++definition inside the @b{eval-when} @i{form}, as in: ++ ++@example ++ (eval-when (:execute :compile-toplevel :load-toplevel) ++ (defmacro foo (x) `(car ,x)) ++ (print (foo '(a b c)))) ++@end example ++ ++Figure 3--8 lists macros that make definitions ++available both in the compilation and run-time @i{environments}. ++It is not specified whether definitions made available in the ++@i{compilation environment} are available in the evaluation ++@i{environment}, nor is it specified whether they are available ++in subsequent compilation units or subsequent invocations of the ++compiler. As with @b{eval-when}, these compile-time side ++effects happen only when the defining macros appear at ++top level. ++ ++@format ++@group ++@noindent ++@w{ declaim define-modify-macro defsetf } ++@w{ defclass define-setf-expander defstruct } ++@w{ defconstant defmacro deftype } ++@w{ define-compiler-macro defpackage defvar } ++@w{ define-condition defparameter } ++ ++@noindent ++@w{ Figure 3--8: Defining Macros That Affect the Compile-Time Environment} ++ ++@end group ++@end format ++ ++@node Constraints on Macros and Compiler Macros, , Processing of Defining Macros, File Compilation ++@subsubsection Constraints on Macros and Compiler Macros ++ ++Except where explicitly stated otherwise, no @i{macro} defined in ++the @r{Common Lisp} standard produces an expansion that could cause any of the ++@i{subforms} of the @i{macro form} to be treated as ++@i{top level forms}. If an @i{implementation} also provides a ++@i{special operator} definition of a @r{Common Lisp} @i{macro}, ++the @i{special operator} definition must be semantically equivalent ++in this respect. ++ ++@i{Compiler macro} expansions must also have the same ++top level evaluation semantics as the @i{form} which they replace. ++This is of concern both to @i{conforming implementations} and to ++@i{conforming programs}. ++ ++@node Literal Objects in Compiled Files, Exceptional Situations in the Compiler, File Compilation, Compilation ++@subsection Literal Objects in Compiled Files ++ ++The functions @b{eval} and @b{compile} are ++required to ensure that @i{literal objects} referenced within the resulting ++interpreted or compiled code objects are the @i{same} as the ++corresponding @i{objects} in the @i{source code}. ++@b{compile-file}, on the other hand, ++must produce a @i{compiled file} that, when loaded with ++@b{load}, constructs the @i{objects} defined by the ++@i{source code} and produces references to them. ++ ++In the case of @b{compile-file}, @i{objects} ++constructed by @b{load} of the @i{compiled file} cannot be spoken ++of as being the @i{same} as the @i{objects} constructed at ++compile time, because the @i{compiled file} may be loaded into a different ++@i{Lisp image} than the one in which it was compiled. This section ++defines the concept of @i{similarity} which relates ++@i{objects} in the @i{evaluation environment} to the ++corresponding @i{objects} in the @i{run-time environment}. ++ ++The constraints on @i{literal objects} described in this section ++apply only to @b{compile-file}; ++@b{eval} and @b{compile} do not copy or coalesce constants. ++ ++@menu ++* Externalizable Objects:: ++* Similarity of Literal Objects:: ++* Similarity of Aggregate Objects:: ++* Definition of Similarity:: ++* Extensions to Similarity Rules:: ++* Additional Constraints on Externalizable Objects:: ++@end menu ++ ++@node Externalizable Objects, Similarity of Literal Objects, Literal Objects in Compiled Files, Literal Objects in Compiled Files ++@subsubsection Externalizable Objects ++ ++The fact that the @i{file compiler} represents @i{literal} @i{objects} ++externally in a @i{compiled file} and must later reconstruct suitable ++equivalents of those @i{objects} when that @i{file} is loaded ++imposes a need for constraints on the nature of the @i{objects} that can be ++used as @i{literal} @i{objects} in @i{code} to be processed ++by the @i{file compiler}. ++ ++An @i{object} that can be used as a @i{literal} @i{object} ++in @i{code} to be processed by the @i{file compiler} is called an ++@i{externalizable object} ++@IGindex externalizable object ++. ++ ++We define that two @i{objects} are @i{similar} ++@IGindex similar ++ if they satisfy ++a two-place conceptual equivalence predicate (defined below), which is ++independent of the @i{Lisp image} so that the two @i{objects} in ++different @i{Lisp images} can be understood to be equivalent under ++this predicate. Further, by inspecting the definition of this conceptual ++predicate, the programmer can anticipate what aspects of an @i{object} ++are reliably preserved by @i{file compilation}. ++ ++The @i{file compiler} must cooperate with the @i{loader} in order to ++assure that in each case where an @i{externalizable object} is processed ++as a @i{literal object}, the @i{loader} will construct a @i{similar} ++@i{object}. ++ ++The set of @i{objects} that are @i{externalizable objects} ++@IGindex externalizable object ++ are those ++for which the new conceptual term ``@i{similar}'' is defined, such that ++when a @i{compiled file} is @i{loaded}, an @i{object} can be constructed ++which can be shown to be @i{similar} to the original @i{object} which ++existed at the time the @i{file compiler} was operating. ++ ++@node Similarity of Literal Objects, Similarity of Aggregate Objects, Externalizable Objects, Literal Objects in Compiled Files ++@subsubsection Similarity of Literal Objects ++ ++@node Similarity of Aggregate Objects, Definition of Similarity, Similarity of Literal Objects, Literal Objects in Compiled Files ++@subsubsection Similarity of Aggregate Objects ++ ++Of the @i{types} over which @i{similarity} is defined, ++some are treated as aggregate objects. For these types, ++@i{similarity} is defined recursively. ++We say that an @i{object} of these types has certain ``basic qualities'' ++and to satisfy the @i{similarity} relationship, the values of the ++corresponding qualities of the two @i{objects} must also be similar. ++ ++@node Definition of Similarity, Extensions to Similarity Rules, Similarity of Aggregate Objects, Literal Objects in Compiled Files ++@subsubsection Definition of Similarity ++ ++Two @i{objects} S (in @i{source code}) and C (in @i{compiled code}) ++ are defined to be @i{similar} if and only if ++ they are both of one of the @i{types} listed here ++ (or defined by the @i{implementation}) ++ and they both satisfy all additional requirements of @i{similarity} ++ indicated for that @i{type}. ++ ++@table @asis ++ ++@item @b{number} ++Two @i{numbers} S and C are @i{similar} if they are of the same @i{type} ++and represent the same mathematical value. ++ ++@item @b{character} ++Two @i{simple} @i{characters} S and C are @i{similar} ++if they have @i{similar} @i{code} @i{attributes}. ++ ++@i{Implementations} providing additional, @i{implementation-defined} ++@i{attributes} must define whether and how @i{non-simple} @i{characters} ++can be regarded as @i{similar}. ++ ++@item @b{symbol} ++Two @i{apparently uninterned} @i{symbols} S and C are @i{similar} ++if their ++@i{names} ++are @i{similar}. ++ ++Two @i{interned} symbols S and C are @i{similar} ++if their @i{names} are @i{similar}, ++and if either S is accessible in the @i{current package} at compile time ++ and C is accessible in the @i{current package} at load time, ++ or C is accessible in the @i{package} that is @i{similar} to ++ the @i{home package} of S. ++ ++(Note that @i{similarity} of ++@i{symbols} is dependent ++on neither the @i{current readtable} nor how the @i{function} @b{read} would ++parse the @i{characters} in the @i{name} of the @i{symbol}.) ++ ++@item @b{package} ++Two @i{packages} S and C are @i{similar} if their @i{names} are @i{similar}. ++ ++Note that although a @i{package} @i{object} is an @i{externalizable object}, ++the programmer is responsible for ensuring that the corresponding @i{package} is ++already in existence when code referencing it as a @i{literal} @i{object} ++is @i{loaded}. The @i{loader} finds the corresponding @i{package} @i{object} ++as if by calling @b{find-package} with that @i{name} as an @i{argument}. ++An error is signaled by the @i{loader} if no @i{package} exists at load time. ++ ++@item @b{random-state} ++Two @i{random states} S and C are @i{similar} if S ++would always produce the same sequence of pseudo-random numbers ++as a @i{copy}_5 of C ++when given as the @i{random-state} @i{argument} to the @i{function} @b{random}, ++assuming equivalent @i{limit} @i{arguments} in each case. ++ ++(Note that since C has been processed by the @i{file compiler}, ++it cannot be used directly as an @i{argument} to @b{random} ++because @b{random} would perform a side effect.) ++ ++@item @b{cons} ++Two @i{conses}, S and C, are @i{similar} if ++ the @i{car}_2 of S is @i{similar} to the @i{car}_2 of C, ++and the @i{cdr}_2 of S is @i{similar} to the @i{cdr}_2 of C. ++ ++@item @b{array} ++Two one-dimensional @i{arrays}, S and C, are @i{similar} if ++ the @i{length} of S is @i{similar} to the @i{length} of C, ++ the @i{actual array element type} of S is @i{similar} to ++ the @i{actual array element type} of C, ++ and each @i{active} @i{element} of S is @i{similar} to ++ the corresponding @i{element} of C. ++ ++Two @i{arrays} of @i{rank} other than one, S and C, are @i{similar} if ++ the @i{rank} of S is @i{similar} to the @i{rank} of C, ++ each @i{dimension}_1 of S is @i{similar} to ++ the corresponding @i{dimension}_1 of C, ++ the @i{actual array element type} of S is @i{similar} to ++ the @i{actual array element type} of C, ++ and each @i{element} of S is @i{similar} to ++ the corresponding @i{element} of C. ++ ++In addition, ++if S is a @i{simple array}, then C must also be a @i{simple array}. ++If S is a @i{displaced array}, ++ has a @i{fill pointer}, ++ or is @i{actually adjustable}, ++C is permitted to lack any or all of these qualities. ++ ++@item @b{hash-table} ++Two @i{hash tables} S and C are @i{similar} if they meet the following ++three requirements: ++ ++@table @asis ++ ++@item 1. ++They both have the same test ++ (@i{e.g.}, they are both @b{eql} @i{hash tables}). ++ ++@item 2. ++There is a unique one-to-one correspondence between the keys of ++ the two @i{hash tables}, such that the corresponding keys are ++ @i{similar}. ++ ++@item 3. ++For all keys, the values associated with two corresponding keys ++ are @i{similar}. ++@end table ++ ++If there is more than one possible one-to-one correspondence between ++the keys of S and C, the consequences are unspecified. ++A @i{conforming program} cannot use a table such as S as an ++@i{externalizable constant}. ++ ++@item @b{pathname} ++Two @i{pathnames} S and C are @i{similar} if all corresponding ++@i{pathname components} are @i{similar}. ++ ++@item @b{function} ++ ++@i{Functions} are not @i{externalizable objects}. ++ ++@item @b{structure-object} and @b{standard-object} ++ ++A general-purpose concept of @i{similarity} does not exist for @i{structures} ++and @i{standard objects}. ++However, a @i{conforming program} is permitted to define a @b{make-load-form} ++@i{method} for any @i{class} K defined by that @i{program} that is ++a @i{subclass} of either @b{structure-object} or @b{standard-object}. ++The effect of such a @i{method} is to define that an @i{object} S of @i{type} K ++in @i{source code} is @i{similar} to an @i{object} C of @i{type} K ++in @i{compiled code} if C was constructed from @i{code} produced by ++calling @b{make-load-form} on S. ++ ++@end table ++ ++@node Extensions to Similarity Rules, Additional Constraints on Externalizable Objects, Definition of Similarity, Literal Objects in Compiled Files ++@subsubsection Extensions to Similarity Rules ++ ++Some @i{objects}, such as @i{streams}, @b{readtables}, and @b{methods} ++are not @i{externalizable objects} under the definition of similarity given above. ++That is, such @i{objects} may not portably appear as @i{literal} @i{objects} ++in @i{code} to be processed by the @i{file compiler}. ++ ++An @i{implementation} is permitted to extend the rules of similarity, ++so that other kinds of @i{objects} are @i{externalizable objects} ++for that @i{implementation}. ++ ++If for some kind of @i{object}, @i{similarity} is ++neither defined by this specification ++ nor by the @i{implementation}, ++then the @i{file compiler} must signal an error upon encountering such ++an @i{object} as a @i{literal constant}. ++ ++@node Additional Constraints on Externalizable Objects, , Extensions to Similarity Rules, Literal Objects in Compiled Files ++@subsubsection Additional Constraints on Externalizable Objects ++ ++If two @i{literal objects} appearing in the source code for a single file ++processed with ++the @i{file compiler} ++are the @i{identical}, ++the corresponding @i{objects} in the @i{compiled code} ++must also be the @i{identical}. ++ ++With the exception of @i{symbols} and @i{packages}, any two ++@i{literal objects} ++in @i{code} being processed by ++the @i{file compiler} ++may be @i{coalesced} ++if and only if they are @i{similar}; ++if they are either both @i{symbols} or both @i{packages}, ++they may only be @i{coalesced} if and only if they are @i{identical}. ++ ++@i{Objects} containing circular references can ++be @i{externalizable objects}. ++The @i{file compiler} is required to preserve @b{eql}ness of ++substructures within a @i{file}. ++Preserving @b{eql}ness means that subobjects that are ++the @i{same} ++in the @i{source code} must ++be ++the @i{same} ++in the corresponding @i{compiled code}. ++ ++In addition, the following are constraints on the handling of ++@i{literal objects} by the @i{file compiler}: ++ ++@table @asis ++ ++@item @t{} ++@b{array:} If an @i{array} in the source code is a ++@i{simple array}, then the corresponding @i{array} ++in the compiled code will also be a @i{simple array}. If ++an @i{array} in the source code is displaced, has a ++@i{fill pointer}, or is @i{actually adjustable}, the corresponding ++@i{array} in the compiled code might lack any or all of these ++qualities. If an @i{array} in the source code has a fill ++pointer, then the corresponding @i{array} in the compiled ++code might be only the size implied by the fill pointer. ++ ++@item @t{} ++@b{packages:} The loader is required to find the ++corresponding @i{package} @i{object} as if by calling ++@b{find-package} with the package name as an argument. ++An error of @i{type} @b{package-error} is signaled if no ++@i{package} of that name exists at load time. ++ ++@item @t{} ++@b{random-state:} A constant @i{random state} ++object cannot be used as the state argument ++to the @i{function} @b{random} because @b{random} modifies this data structure. ++ ++@item @t{} ++@b{structure, standard-object:} ++@i{Objects} of @i{type} @b{structure-object} and @b{standard-object} ++may appear in compiled constants if there is an ++appropriate @b{make-load-form} method defined for that ++@i{type}. ++ ++The @i{file compiler} calls @b{make-load-form} on any @i{object} ++that is referenced as a @i{literal object} if the @i{object} is a ++@i{generalized instance} of @b{standard-object}, ++@b{structure-object}, @b{condition}, or any of a ++(possibly empty) @i{implementation-dependent} set of other @i{classes}. ++The @i{file compiler} only calls @b{make-load-form} once for ++any given @i{object} within a single @i{file}. ++ ++@item @t{} ++@b{symbol:} In order to guarantee that @i{compiled files} can be @i{loaded} ++ correctly, users must ensure that the @i{packages} referenced in those @i{files} ++ are defined consistently at compile time and load time. @i{Conforming programs} ++ must satisfy the following requirements: ++ ++@table @asis ++ ++@item 1. ++The @i{current package} when a @i{top level form} in the @i{file} ++ is processed by @b{compile-file} must be the same as the @i{current package} ++ when the @i{code} corresponding to that @i{top level form} in the ++ @i{compiled file} is executed by @b{load}. In particular: ++ ++@table @asis ++ ++@item a. ++Any @i{top level form} in a @i{file} that alters ++ the @i{current package} must change it to a @i{package} ++ of the same @i{name} both at compile time and at load time. ++ ++@item b. ++If the first @i{non-atomic} @i{top level form} in the @i{file} ++ is not an @b{in-package} @i{form}, then the @i{current package} ++ at the time @b{load} is called must be a @i{package} with the ++ same @i{name} as the package that was the @i{current package} ++ at the time @b{compile-file} was called. ++@end table ++ ++@item 2. ++For all @i{symbols} ++ appearing lexically within a @i{top level form} that ++ were @i{accessible} in the @i{package} that was the @i{current package} ++ during processing of that @i{top level form} at compile time, but ++ whose @i{home package} was another @i{package}, at load time there must ++ be a @i{symbol} with the same @i{name} that is @i{accessible} in both the ++ load-time @i{current package} and in the @i{package} ++ with the same @i{name} as the ++ compile-time @i{home package}. ++ ++@item 3. ++For all @i{symbols} represented in the @i{compiled file} ++ that were @i{external symbols} in ++ their @i{home package} at compile time, there must be a @i{symbol} with the ++ same @i{name} that is an @i{external symbol} in the @i{package} ++ with the same @i{name} at load time. ++@end table ++ ++ If any of these conditions do not hold, the @i{package} in which the @i{loader} looks ++ for the affected @i{symbols} is unspecified. @i{Implementations} are permitted ++ to signal an error or to define this behavior. ++ ++@end table ++ ++@node Exceptional Situations in the Compiler, , Literal Objects in Compiled Files, Compilation ++@subsection Exceptional Situations in the Compiler ++ ++@b{compile} and @b{compile-file} are permitted to ++signal errors and warnings, including errors due to compile-time ++processing of @t{(eval-when (:compile-toplevel) ...)} forms, ++macro expansion, and conditions signaled by the compiler itself. ++ ++@i{Conditions} of @i{type} @b{error} might be signaled by the compiler ++in situations where the compilation cannot proceed without intervention. ++ ++In addition to situations for which the standard specifies that ++@i{conditions} of @i{type} @b{warning} must or might be signaled, ++warnings might be signaled in situations where the compiler can ++determine that the consequences are undefined or that a run-time ++error will be signaled. Examples of this situation are as follows: ++ violating type declarations, ++ altering or assigning the value of a constant defined with @b{defconstant}, ++ calling built-in Lisp functions with a wrong number of arguments or malformed keyword ++ argument lists, ++and using unrecognized declaration specifiers. ++ ++The compiler is permitted to issue warnings about matters of ++programming style as conditions of @i{type} @b{style-warning}. ++Examples of this situation are as follows: ++ redefining a function using a different argument list, ++ calling a function with a wrong number of arguments, ++ not declaring @b{ignore} of a local variable that is not referenced, ++ and referencing a variable declared @b{ignore}. ++ ++Both @b{compile} and @b{compile-file} are permitted ++(but not required) to @i{establish} a @i{handler} ++for @i{conditions} of @i{type} @b{error}. For example, they ++might signal a warning, and restart compilation from some ++@i{implementation-dependent} point in order to let the ++compilation proceed without manual intervention. ++ ++Both @b{compile} and @b{compile-file} return three ++values, the second two indicating whether the source code being compiled ++contained errors and whether style warnings were issued. ++ ++Some warnings might be deferred until the end of compilation. ++See @b{with-compilation-unit}. ++ ++@c end of including concept-compile ++ ++@node Declarations, Lambda Lists, Compilation, Evaluation and Compilation ++@section Declarations ++ ++@c including concept-decls ++ ++@i{Declarations} ++@IGindex declaration ++ provide a way of specifying information for use by ++program processors, such as the evaluator or the compiler. ++ ++@i{Local declarations} ++@IGindex local declaration ++ ++can be embedded in executable code using @b{declare}. ++@i{Global declarations} ++@IGindex global declaration ++, ++or @i{proclamations} ++@IGindex proclamation ++, ++are established by @b{proclaim} or @b{declaim}. ++ ++The @b{the} @i{special form} provides a shorthand notation for ++making a @i{local declaration} about the @i{type} of the ++@i{value} of a given @i{form}. ++ ++The consequences are undefined if a program violates a @i{declaration} ++or a @i{proclamation}. ++ ++@menu ++* Minimal Declaration Processing Requirements:: ++* Declaration Specifiers:: ++* Declaration Identifiers:: ++* Declaration Scope:: ++@end menu ++ ++@node Minimal Declaration Processing Requirements, Declaration Specifiers, Declarations, Declarations ++@subsection Minimal Declaration Processing Requirements ++ ++In general, an @i{implementation} is free to ignore ++@i{declaration specifiers} except for the ++ @b{declaration} ++@IRindex declaration ++, ++ @b{notinline} ++@IRindex notinline ++, ++ @b{safety} ++@IRindex safety ++, ++ and @b{special} ++@IRindex special ++ @i{declaration specifiers}. ++ ++A @b{declaration} @i{declaration} must suppress warnings ++about unrecognized @i{declarations} of the kind that it declares. ++If an @i{implementation} does not produce warnings about ++unrecognized declarations, it may safely ignore this @i{declaration}. ++ ++A @b{notinline} @i{declaration} must be recognized by any @i{implementation} ++that supports inline functions or @i{compiler macros} in order to disable those facilities. ++An @i{implementation} that does not use inline functions or @i{compiler macros} ++may safely ignore this @i{declaration}. ++ ++A @b{safety} @i{declaration} that increases the current safety level ++must always be recognized. An @i{implementation} that always processes ++code as if safety were high may safely ignore this @i{declaration}. ++ ++A @b{special} @i{declaration} must be processed by all @i{implementations}. ++ ++@node Declaration Specifiers, Declaration Identifiers, Minimal Declaration Processing Requirements, Declarations ++@subsection Declaration Specifiers ++ ++A @i{declaration specifier} ++@IGindex declaration specifier ++ is an @i{expression} that can appear at ++top level of a @b{declare} expression or a @b{declaim} form, or as ++the argument to @b{proclaim}. ++It is a @i{list} whose @i{car} is a @i{declaration identifier}, ++and whose @i{cdr} is data interpreted according to rules specific to ++the @i{declaration identifier}. ++ ++@node Declaration Identifiers, Declaration Scope, Declaration Specifiers, Declarations ++@subsection Declaration Identifiers ++ ++Figure 3--9 shows a list of all ++@i{declaration identifiers} ++@IGindex declaration identifier ++ ++defined by this standard. ++ ++@format ++@group ++@noindent ++@w{ declaration ignore special } ++@w{ dynamic-extent inline type } ++@w{ ftype notinline } ++@w{ ignorable optimize } ++ ++@noindent ++@w{ Figure 3--9: Common Lisp Declaration Identifiers} ++ ++@end group ++@end format ++ ++An implementation is free to support other (@i{implementation-defined}) ++@i{declaration identifiers} as well. ++A warning might be issued ++if a @i{declaration identifier} ++is not among those defined above, ++is not defined by the @i{implementation}, ++is not a @i{type} @i{name}, ++and has not been declared in a @b{declaration} @i{proclamation}. ++ ++@menu ++* Shorthand notation for Type Declarations:: ++@end menu ++ ++@node Shorthand notation for Type Declarations, , Declaration Identifiers, Declaration Identifiers ++@subsubsection Shorthand notation for Type Declarations ++ ++A @i{type specifier} can be used as a @i{declaration identifier}. ++@t{(@i{type-specifier} @{@i{var}@}*)} is taken as shorthand for ++@t{(type @i{type-specifier} @{@i{var}@}*)}. ++ ++@node Declaration Scope, , Declaration Identifiers, Declarations ++@subsection Declaration Scope ++ ++@i{Declarations} can be divided into two kinds: those that apply to the ++@i{bindings} of @i{variables} or @i{functions}; and those that ++do not apply to @i{bindings}. ++ ++A @i{declaration} that appears at the head of a binding @i{form} ++and applies to a @i{variable} or @i{function} @i{binding} ++made by that @i{form} is called a @i{bound declaration} ++@IGindex bound declaration ++; ++such a @i{declaration} affects both the @i{binding} and ++any references within the @i{scope} of the @i{declaration}. ++ ++@i{Declarations} that are not @i{bound declarations} are called ++@i{free declarations} ++@IGindex free declaration ++. ++ ++A @i{free declaration} in a @i{form} F1 that applies to a @i{binding} ++for a @i{name} N @i{established} by some @i{form} F2 ++of which F1 is a @i{subform} ++affects only references to N within F1; it does not to apply to ++other references to N outside of F1, nor does it affect the manner ++in which the @i{binding} of N by F2 is @i{established}. ++ ++@i{Declarations} that do not apply to @i{bindings} can only appear ++as @i{free declarations}. ++ ++The @i{scope} of a @i{bound declaration} is the same as the ++@i{lexical scope} ++of the @i{binding} to which it applies; ++for @i{special variables}, ++this means the @i{scope} that the @i{binding} ++would have had had it been a @i{lexical binding}. ++ ++Unless explicitly stated otherwise, the @i{scope} of a ++@i{free declaration} includes only the body @i{subforms} of ++the @i{form} at whose head it appears, and no other @i{subforms}. ++The @i{scope} of @i{free declarations} specifically does not ++include @i{initialization forms} for @i{bindings} established ++by the @i{form} containing the @i{declarations}. ++ ++Some @i{iteration forms} include step, end-test, or result ++@i{subforms} that are also included in the @i{scope} ++of @i{declarations} that appear in the @i{iteration form}. ++Specifically, the @i{iteration forms} and @i{subforms} involved ++are: ++ ++@table @asis ++ ++@item @t{*} ++@b{do}, @b{do*}: ++ @i{step-forms}, @i{end-test-form}, and @i{result-forms}. ++@item @t{*} ++@b{dolist}, @b{dotimes}: ++ @i{result-form} ++@item @t{*} ++@b{do-all-symbols}, @b{do-external-symbols}, @b{do-symbols}: ++ @i{result-form} ++@end table ++ ++@menu ++* Examples of Declaration Scope:: ++@end menu ++ ++@node Examples of Declaration Scope, , Declaration Scope, Declaration Scope ++@subsubsection Examples of Declaration Scope ++ ++Here is an example illustrating the @i{scope} of @i{bound declarations}. ++ ++@example ++ (let ((x 1)) ;[1] 1st occurrence of x ++ (declare (special x)) ;[2] 2nd occurrence of x ++ (let ((x 2)) ;[3] 3rd occurrence of x ++ (let ((old-x x) ;[4] 4th occurrence of x ++ (x 3)) ;[5] 5th occurrence of x ++ (declare (special x)) ;[6] 6th occurrence of x ++ (list old-x x)))) ;[7] 7th occurrence of x ++@result{} (2 3) ++@end example ++ ++The first occurrence of @t{x} @i{establishes} a @i{dynamic binding} ++of @t{x} because of the @b{special} @i{declaration} for @t{x} ++in the second line. The third occurrence of @t{x} @i{establishes} a ++@i{lexical binding} of @t{x} (because there is no @b{special} ++@i{declaration} in the corresponding @b{let} @i{form}). ++The fourth occurrence of @t{x} @i{x} is a reference to the ++@i{lexical binding} of @t{x} established in the third line. ++The fifth occurrence of @t{x} @i{establishes} a @i{dynamic binding} ++of @i{x} for the body of the @b{let} @i{form} that begins on ++that line because of the @b{special} @i{declaration} for @t{x} ++in the sixth line. The reference to @t{x} in the fourth line is not ++affected by the @b{special} @i{declaration} in the sixth line ++because that reference is not within the ``would-be @i{lexical scope}'' ++of the @i{variable} @t{x} in the fifth line. The reference to @t{x} ++in the seventh line is a reference to the @i{dynamic binding} of @i{x} ++@i{established} in the fifth line. ++ ++Here is another example, to illustrate the @i{scope} of a ++@i{free declaration}. In the following: ++ ++@example ++ (lambda (&optional (x (foo 1))) ;[1] ++ (declare (notinline foo)) ;[2] ++ (foo x)) ;[3] ++@end example ++ ++the @i{call} to @t{foo} in the first line might be ++compiled inline even though the @i{call} to @t{foo} in ++the third line must not be. This is because ++the @b{notinline} @i{declaration} ++for @t{foo} in the second line applies only to the body on the ++third line. In order to suppress inlining for both @i{calls}, ++one might write: ++ ++@example ++ (locally (declare (notinline foo)) ;[1] ++ (lambda (&optional (x (foo 1))) ;[2] ++ (foo x))) ;[3] ++@end example ++ ++or, alternatively: ++ ++@example ++ (lambda (&optional ;[1] ++ (x (locally (declare (notinline foo)) ;[2] ++ (foo 1)))) ;[3] ++ (declare (notinline foo)) ;[4] ++ (foo x)) ;[5] ++@end example ++ ++Finally, here is an example that shows the @i{scope} of ++@i{declarations} in an @i{iteration form}. ++ ++@example ++ (let ((x 1)) ;[1] ++ (declare (special x)) ;[2] ++ (let ((x 2)) ;[3] ++ (dotimes (i x x) ;[4] ++ (declare (special x))))) ;[5] ++@result{} 1 ++@end example ++ ++In this example, the first reference to @t{x} on the fourth line is to ++the @i{lexical binding} of @t{x} established on the third line. ++However, the second occurrence of @t{x} on the fourth line lies within ++the @i{scope} of the @i{free declaration} on the fifth line ++(because this is the @i{result-form} of the @b{dotimes}) ++and therefore refers to the @i{dynamic binding} of @t{x}. ++ ++@c end of including concept-decls ++ ++@node Lambda Lists, Error Checking in Function Calls, Declarations, Evaluation and Compilation ++@section Lambda Lists ++ ++@c including concept-bvl ++ ++A @i{lambda list} ++@IGindex lambda list ++ is a @i{list} that ++specifies a set of @i{parameters} (sometimes called @i{lambda variables}) ++and a protocol for receiving @i{values} for those @i{parameters}. ++ ++There are several kinds of @i{lambda lists}. ++ ++@format ++@group ++@noindent ++@w{ Context Kind of Lambda List } ++@w{ @b{defun} @i{form} @i{ordinary lambda list} } ++@w{ @b{defmacro} @i{form} @i{macro lambda list} } ++@w{ @i{lambda expression} @i{ordinary lambda list} } ++@w{ @b{flet} local @i{function} definition @i{ordinary lambda list} } ++@w{ @b{labels} local @i{function} definition @i{ordinary lambda list} } ++@w{ @b{handler-case} @i{clause} specification @i{ordinary lambda list} } ++@w{ @b{restart-case} @i{clause} specification @i{ordinary lambda list} } ++@w{ @b{macrolet} local @i{macro} definition @i{macro lambda list} } ++@w{ @b{define-method-combination} @i{ordinary lambda list} } ++@w{ @b{define-method-combination} @t{:arguments} option @i{define-method-combination arguments lambda list} } ++@w{ @b{defstruct} @t{:constructor} option @i{boa lambda list} } ++@w{ @b{defgeneric} @i{form} @i{generic function lambda list} } ++@w{ @b{defgeneric} @i{method} clause @i{specialized lambda list} } ++@w{ @b{defmethod} @i{form} @i{specialized lambda list} } ++@w{ @b{defsetf} @i{form} @i{defsetf lambda list} } ++@w{ @b{define-setf-expander} @i{form} @i{macro lambda list} } ++@w{ @b{deftype} @i{form} @i{deftype lambda list} } ++@w{ @b{destructuring-bind} @i{form} @i{destructuring lambda list} } ++@w{ @b{define-compiler-macro} @i{form} @i{macro lambda list} } ++@w{ @b{define-modify-macro} @i{form} @i{define-modify-macro lambda list} } ++ ++@noindent ++@w{ Figure 3--10: What Kind of Lambda Lists to Use } ++ ++@end group ++@end format ++ ++Figure 3--11 lists some @i{defined names} that are applicable ++to @i{lambda lists}. ++ ++@format ++@group ++@noindent ++@w{ lambda-list-keywords lambda-parameters-limit } ++ ++@noindent ++@w{ Figure 3--11: Defined names applicable to lambda lists} ++ ++@end group ++@end format ++ ++@menu ++* Ordinary Lambda Lists:: ++* Generic Function Lambda Lists:: ++* Specialized Lambda Lists:: ++* Macro Lambda Lists:: ++* Destructuring Lambda Lists:: ++* Boa Lambda Lists:: ++* Defsetf Lambda Lists:: ++* Deftype Lambda Lists:: ++* Define-modify-macro Lambda Lists:: ++* Define-method-combination Arguments Lambda Lists:: ++* Syntactic Interaction of Documentation Strings and Declarations:: ++@end menu ++ ++@node Ordinary Lambda Lists, Generic Function Lambda Lists, Lambda Lists, Lambda Lists ++@subsection Ordinary Lambda Lists ++ ++An @i{ordinary lambda list} ++@IGindex ordinary lambda list ++ is used to describe how a set of ++@i{arguments} is received by an @i{ordinary} @i{function}. ++The @i{defined names} in Figure 3--12 are those which use ++@i{ordinary lambda lists}: ++ ++@format ++@group ++@noindent ++@w{ define-method-combination handler-case restart-case } ++@w{ defun labels } ++@w{ flet lambda } ++ ++@noindent ++@w{ Figure 3--12: Standardized Operators that use Ordinary Lambda Lists} ++ ++@end group ++@end format ++ ++An @i{ordinary lambda list} can contain the @i{lambda list keywords} shown ++in Figure 3--13. ++ ++@format ++@group ++@noindent ++@w{ @b{&allow-other-keys} @b{&key} @b{&rest} } ++@w{ @b{&aux} @b{&optional} } ++ ++@noindent ++@w{ Figure 3--13: Lambda List Keywords used by Ordinary Lambda Lists} ++ ++@end group ++@end format ++ ++Each @i{element} of a @i{lambda list} is either a parameter specifier ++or a @i{lambda list keyword}. ++Implementations are free to provide additional @i{lambda list keywords}. ++For a list of all @i{lambda list keywords} ++used by the implementation, see @b{lambda-list-keywords}. ++ ++The syntax for @i{ordinary lambda lists} is as follows: ++ ++@w{@i{lambda-list} ::=@r{(}@{@i{var}@}*} ++@w{ @t{[}@r{&optional} @{@i{var} | ++ @r{(}@i{var} @r{[}init-form @r{[}supplied-p-parameter @r{]}@r{]}@r{)}@}*@t{]}} ++@w{ @t{[}@r{&rest} @i{var}@t{]}} ++@w{ @t{[}@r{&key} @{@i{var} | ++ @r{(}@{@i{var} | ++ @r{(}@i{keyword-name} @i{var}@r{)}@} ++ @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}* pt @r{[}@t{&allow-other-keys}@r{]}@t{]}} ++@w{ @t{[}@r{&aux} @{@i{var} | @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@t{]}@r{)}} ++@w{ } ++ ++A @i{var} or @i{supplied-p-parameter} must be a @i{symbol} ++that is not the name of a @i{constant variable}. ++ ++An @i{init-form} can be any @i{form}. ++Whenever any @i{init-form} is evaluated for any parameter ++specifier, that @i{form} may refer to any parameter variable to ++the left of the specifier in which the @i{init-form} appears, ++including any @i{supplied-p-parameter} variables, and may rely ++on the fact that no other parameter variable has yet been bound ++(including its own parameter variable). ++ ++A @i{keyword-name} can be any @i{symbol}, ++but by convention is normally a @i{keyword}_1; ++all @i{standardized} @i{functions} follow that convention. ++ ++An @i{ordinary lambda list} has five parts, any or all of which may be empty. ++For information about the treatment of argument mismatches, ++see @ref{Error Checking in Function Calls}. ++ ++@menu ++* Specifiers for the required parameters:: ++* Specifiers for optional parameters:: ++* A specifier for a rest parameter:: ++* Specifiers for keyword parameters:: ++* Suppressing Keyword Argument Checking:: ++* Examples of Suppressing Keyword Argument Checking:: ++* Specifiers for @b{&aux} variables:: ++* Examples of Ordinary Lambda Lists:: ++@end menu ++ ++@node Specifiers for the required parameters, Specifiers for optional parameters, Ordinary Lambda Lists, Ordinary Lambda Lists ++@subsubsection Specifiers for the required parameters ++ ++These are all the parameter specifiers up to ++the first @i{lambda list keyword}; ++if there are no @i{lambda list keywords}, ++then all the specifiers are for required parameters. ++Each required parameter is specified by a parameter variable @i{var}. ++@i{var} is bound as a lexical variable unless it is declared @b{special}. ++ ++If there are @t{n} required parameters (@t{n} may be zero), ++there must be at least @t{n} passed arguments, and the ++required parameters are bound to the first @t{n} passed arguments; ++see @ref{Error Checking in Function Calls}. ++The other parameters are then processed using any remaining arguments. ++ ++@node Specifiers for optional parameters, A specifier for a rest parameter, Specifiers for the required parameters, Ordinary Lambda Lists ++@subsubsection Specifiers for optional parameters ++ ++@IRindex &optional ++ ++If @b{&optional} is present, ++the optional parameter specifiers are those following ++@b{&optional} ++up to the next @i{lambda list keyword} or the end of the list. ++If optional parameters are specified, then each one is processed as ++follows. If any unprocessed arguments remain, then the parameter variable ++@i{var} is bound to the next remaining argument, just as for a required ++parameter. If no arguments remain, however, then @i{init-form} ++is evaluated, and the parameter variable ++is bound to the resulting value ++(or to @b{nil} if no @i{init-form} appears ++in the parameter specifier). ++If another variable name @i{supplied-p-parameter} ++appears in the specifier, it is bound ++to @i{true} if an argument had been available, and to @i{false} if no ++argument remained (and therefore @i{init-form} had to be evaluated). ++@i{Supplied-p-parameter} ++is bound not to an argument but to a value indicating whether or not ++an argument had been supplied for the corresponding @i{var}. ++ ++@node A specifier for a rest parameter, Specifiers for keyword parameters, Specifiers for optional parameters, Ordinary Lambda Lists ++@subsubsection A specifier for a rest parameter ++ ++@IRindex &rest ++ ++@b{&rest}, if present, must be followed by a single @i{rest parameter} ++specifier, which in turn must be followed by another ++@i{lambda list keyword} or the end of the @i{lambda list}. After all ++optional parameter specifiers have been processed, then there may or ++may not be a @i{rest parameter}. If there is a @i{rest parameter}, it is ++bound to a @i{list} of all as-yet-unprocessed arguments. If ++no unprocessed arguments remain, the @i{rest parameter} is bound to the ++@i{empty list}. If there is no @i{rest parameter} and there are no ++@i{keyword parameters}, then an error ++should be signaled if ++any unprocessed arguments remain; see @ref{Error Checking in Function Calls}. ++The value of a @i{rest parameter} ++is permitted, but not required, to share structure with the ++last argument to @b{apply}. ++ ++@IRindex &key ++ ++@IRindex &allow-other-keys ++ ++@node Specifiers for keyword parameters, Suppressing Keyword Argument Checking, A specifier for a rest parameter, Ordinary Lambda Lists ++@subsubsection Specifiers for keyword parameters ++ ++If @b{&key} ++is present, all specifiers up to the next @i{lambda list keyword} ++or the end of the @i{list} are keyword parameter specifiers. ++When keyword parameters are processed, ++the same arguments are processed that ++would be made into a @i{list} for a @i{rest parameter}. ++It is permitted to specify both @b{&rest} and @b{&key}. ++In this case the remaining arguments are used for both purposes; ++that is, all remaining arguments are made into a @i{list} for the ++@i{rest parameter}, and are also processed for the @b{&key} parameters. ++ ++If @b{&key} is specified, there must remain ++an even number of arguments; see @ref{Odd Number of Keyword Arguments}. ++ ++These arguments are considered as pairs, ++the first argument in each pair being interpreted as a name ++and the second as the corresponding value. ++The first @i{object} of each pair must be a @i{symbol}; ++see @ref{Invalid Keyword Arguments}. ++The keyword parameter specifiers may optionally be followed by the ++@i{lambda list keyword} @b{&allow-other-keys}. ++ ++In each keyword parameter specifier must be a name @i{var} for ++the parameter variable. ++ ++If the @i{var} appears alone or in a @t{(@i{var} @i{init-form})} ++combination, the keyword name used when matching @i{arguments} to @i{parameters} ++is a @i{symbol} in the @t{KEYWORD} @i{package} whose @i{name} is the ++@i{same} (under @b{string=}) as @i{var}'s. ++If the notation @t{((@i{keyword-name} @i{var}) @i{init-form})} is used, ++then the keyword name used to match @i{arguments} to @i{parameters} is ++@i{keyword-name}, which may be a @i{symbol} in any @i{package}. ++(Of course, if it is not a @i{symbol} in the @t{KEYWORD} @i{package}, ++it does not necessarily self-evaluate, so care must be taken when calling the function ++to make sure that normal evaluation still yields the keyword name.) ++ ++Thus ++ ++@example ++ (defun foo (&key radix (type 'integer)) ...) ++@end example ++ ++means exactly the same as ++ ++@example ++ (defun foo (&key ((:radix radix)) ((:type type) 'integer)) ...) ++@end example ++ ++The keyword parameter specifiers are, like all parameter specifiers, ++effectively processed from left to right. For each keyword parameter ++specifier, if there is an argument pair whose name matches that ++specifier's name (that is, the names are @b{eq}), then the ++parameter variable for that specifier is bound to the second item (the ++value) of that argument pair. If more than one such argument pair ++matches, the leftmost argument pair is used. If no such argument pair ++exists, then the @i{init-form} for that specifier is evaluated and ++the parameter variable is bound to that value (or to @b{nil} if no ++@i{init-form} was specified). @i{supplied-p-parameter} is ++treated as for @b{&optional} parameters: it is bound to @i{true} if there ++was a matching argument pair, and to @i{false} otherwise. ++ ++Unless keyword argument checking is suppressed, ++an argument pair must a name matched by a parameter specifier; ++see @ref{Unrecognized Keyword Arguments}. ++ ++If keyword argument checking is suppressed, ++then it is permitted for an argument pair ++to match no parameter specifier, and the argument pair is ignored, but ++such an argument pair is accessible through the @i{rest parameter} if ++one was supplied. The purpose of these mechanisms is to allow sharing ++of argument lists among several @i{lambda expressions} and to ++allow either the caller or the called @i{lambda expression} to ++specify that such sharing may be taking place. ++ ++Note that if @b{&key} is present, a keyword argument of @t{:allow-other-keys} ++is always permitted---regardless of whether the associated value is @i{true} ++or @i{false}. However, if the value is @i{false}, other non-matching ++keywords are not tolerated (unless @b{&allow-other-keys} was used). ++ ++Furthermore, if the receiving argument list specifies a regular argument which ++would be flagged by @t{:allow-other-keys}, then @t{:allow-other-keys} has both ++its special-cased meaning (identifying whether additional keywords are permitted) ++and its normal meaning (data flow into the function in question). ++ ++@node Suppressing Keyword Argument Checking, Examples of Suppressing Keyword Argument Checking, Specifiers for keyword parameters, Ordinary Lambda Lists ++@subsubsection Suppressing Keyword Argument Checking ++ ++If @b{&allow-other-keys} was specified in the @i{lambda list} of a @i{function}, ++@i{keyword}_2 @i{argument} checking is suppressed in calls ++to that @i{function}. ++ ++If the @t{:allow-other-keys} @i{argument} is @i{true} in a call to a @i{function}, ++@i{keyword}_2 @i{argument} checking is suppressed ++in that call. ++ ++The @t{:allow-other-keys} @i{argument} is permissible in all situations involving ++@i{keyword}_2 @i{arguments}, even when its associated @i{value} ++is @i{false}. ++ ++@node Examples of Suppressing Keyword Argument Checking, Specifiers for @b{&aux} variables, Suppressing Keyword Argument Checking, Ordinary Lambda Lists ++@subsubsection Examples of Suppressing Keyword Argument Checking ++ ++@example ++;;; The caller can supply :ALLOW-OTHER-KEYS T to suppress checking. ++ ((lambda (&key x) x) :x 1 :y 2 :allow-other-keys t) @result{} 1 ++;;; The callee can use &ALLOW-OTHER-KEYS to suppress checking. ++ ((lambda (&key x &allow-other-keys) x) :x 1 :y 2) @result{} 1 ++;;; :ALLOW-OTHER-KEYS NIL is always permitted. ++ ((lambda (&key) t) :allow-other-keys nil) @result{} T ++;;; As with other keyword arguments, only the left-most pair ++;;; named :ALLOW-OTHER-KEYS has any effect. ++ ((lambda (&key x) x) ++ :x 1 :y 2 :allow-other-keys t :allow-other-keys nil) ++@result{} 1 ++;;; Only the left-most pair named :ALLOW-OTHER-KEYS has any effect, ++;;; so in safe code this signals a PROGRAM-ERROR (and might enter the ++;;; debugger). In unsafe code, the consequences are undefined. ++ ((lambda (&key x) x) ;This call is not valid ++ :x 1 :y 2 :allow-other-keys nil :allow-other-keys t) ++@end example ++ ++@node Specifiers for @b{&aux} variables, Examples of Ordinary Lambda Lists, Examples of Suppressing Keyword Argument Checking, Ordinary Lambda Lists ++@subsubsection Specifiers for @b{&aux} variables ++ ++@IRindex &aux ++ ++These are not really parameters. If the @i{lambda list keyword} ++@b{&aux} is present, all specifiers after it are auxiliary variable ++specifiers. After all parameter specifiers have been processed, the ++auxiliary variable specifiers (those following @b{&aux}) are processed ++from left to right. For each one, @i{init-form} is evaluated and ++@i{var} is bound to that value (or to @b{nil} if no @i{init-form} ++was specified). @b{&aux} variable processing is analogous to ++@b{let*} processing. ++ ++@example ++ (lambda (x y &aux (a (car x)) (b 2) c) (list x y a b c)) ++ @equiv{} (lambda (x y) (let* ((a (car x)) (b 2) c) (list x y a b c))) ++@end example ++ ++@node Examples of Ordinary Lambda Lists, , Specifiers for @b{&aux} variables, Ordinary Lambda Lists ++@subsubsection Examples of Ordinary Lambda Lists ++ ++Here are some examples involving @i{optional parameters} and @i{rest parameters}: ++ ++@example ++ ((lambda (a b) (+ a (* b 3))) 4 5) @result{} 19 ++ ((lambda (a &optional (b 2)) (+ a (* b 3))) 4 5) @result{} 19 ++ ((lambda (a &optional (b 2)) (+ a (* b 3))) 4) @result{} 10 ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x))) ++@result{} (2 NIL 3 NIL NIL) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6) ++@result{} (6 T 3 NIL NIL) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3) ++@result{} (6 T 3 T NIL) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3 8) ++@result{} (6 T 3 T (8)) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) ++ 6 3 8 9 10 11) ++@result{} (6 t 3 t (8 9 10 11)) ++@end example ++ ++Here are some examples involving @i{keyword parameters}: ++ ++@example ++ ((lambda (a b &key c d) (list a b c d)) 1 2) @result{} (1 2 NIL NIL) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6) @result{} (1 2 6 NIL) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8) @result{} (1 2 NIL 8) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6 :d 8) @result{} (1 2 6 8) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8 :c 6) @result{} (1 2 6 8) ++ ((lambda (a b &key c d) (list a b c d)) :a 1 :d 8 :c 6) @result{} (:a 1 6 8) ++ ((lambda (a b &key c d) (list a b c d)) :a :b :c :d) @result{} (:a :b :d NIL) ++ ((lambda (a b &key ((:sea c)) d) (list a b c d)) 1 2 :sea 6) @result{} (1 2 6 NIL) ++ ((lambda (a b &key ((c c)) d) (list a b c d)) 1 2 'c 6) @result{} (1 2 6 NIL) ++@end example ++ ++Here are some examples involving @i{optional parameters}, @i{rest parameters}, ++and @i{keyword parameters} together: ++ ++@example ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1) ++@result{} (1 3 NIL 1 ()) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 2) ++@result{} (1 2 NIL 1 ()) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) :c 7) ++@result{} (:c 7 NIL :c ()) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 6 :c 7) ++@result{} (1 6 7 1 (:c 7)) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 6 :d 8) ++@result{} (1 6 NIL 8 (:d 8)) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 6 :d 8 :c 9 :d 10) ++@result{} (1 6 9 8 (:d 8 :c 9 :d 10)) ++@end example ++ ++As an example of the use of @b{&allow-other-keys} and ++@t{:allow-other-keys}, consider a @i{function} that takes two named ++arguments of its own and also accepts additional named arguments to be ++passed to @b{make-array}: ++ ++@example ++ (defun array-of-strings (str dims &rest named-pairs ++ &key (start 0) end &allow-other-keys) ++ (apply #'make-array dims ++ :initial-element (subseq str start end) ++ :allow-other-keys t ++ named-pairs)) ++@end example ++ ++This @i{function} takes a @i{string} and dimensioning ++information and returns an @i{array} of the specified ++dimensions, each of whose elements is the specified ++@i{string}. However, @t{:start} and @t{:end} named ++arguments may be used to specify that a substring of the given ++@i{string} should be used. In addition, the presence of ++@b{&allow-other-keys} in the @i{lambda list} indicates that the ++caller may supply additional named arguments; the @i{rest parameter} ++provides access to them. These additional named arguments are passed ++to @b{make-array}. The @i{function} @b{make-array} ++normally does not allow the named arguments @t{:start} ++and @t{:end} to be used, and an error should be ++signaled if such named arguments are supplied to @b{make-array}. ++However, the presence in the call to @b{make-array} ++of the named argument @t{:allow-other-keys} with ++a @i{true} value causes any extraneous named arguments, including ++@t{:start} and @t{:end}, to be acceptable and ignored. ++ ++@node Generic Function Lambda Lists, Specialized Lambda Lists, Ordinary Lambda Lists, Lambda Lists ++@subsection Generic Function Lambda Lists ++ ++A @i{generic function lambda list} ++@IGindex generic function lambda list ++ is used to describe the overall shape of ++the argument list to be accepted by a @i{generic function}. ++Individual @i{method} @i{signatures} might contribute additional ++@i{keyword parameters} to the @i{lambda list} of the @i{effective method}. ++ ++A @i{generic function lambda list} is used by @b{defgeneric}. ++ ++A @i{generic function lambda list} has the following syntax: ++ ++@w{@i{lambda-list} ::=@r{(}@{@i{var}@}*} ++@w{ @t{[}@r{&optional} @{@i{var} | @r{(}@i{var}@r{)}@}*@t{]}} ++@w{ @t{[}@r{&rest} @i{var}@t{]}} ++@w{ @t{[}@r{&key} @{@i{var} | @r{(}@{@i{var} | ++ @r{(}@i{keyword-name} @i{var}@r{)}@}@r{)}@}* pt @r{[}@t{&allow-other-keys}@r{]}@t{]}@r{)}} ++@w{ } ++ ++A @i{generic function lambda list} can contain the @i{lambda list keywords} shown ++in Figure 3--14. ++ ++@format ++@group ++@noindent ++@w{ @b{&allow-other-keys} @b{&optional} } ++@w{ @b{&key} @b{&rest} } ++ ++@noindent ++@w{ Figure 3--14: Lambda List Keywords used by Generic Function Lambda Lists} ++ ++@end group ++@end format ++ ++A @i{generic function lambda list} differs from an @i{ordinary lambda list} ++in the following ways: ++ ++@table @asis ++ ++@item Required arguments ++Zero or more @i{required parameters} must be specified. ++ ++@item Optional and keyword arguments ++@i{Optional parameters} and @i{keyword parameters} may not have ++default initial value forms nor use supplied-p parameters. ++ ++@item Use of @b{&aux} ++The use of @b{&aux} is not allowed. ++@end table ++ ++@node Specialized Lambda Lists, Macro Lambda Lists, Generic Function Lambda Lists, Lambda Lists ++@subsection Specialized Lambda Lists ++ ++A @i{specialized lambda list} ++@IGindex specialized lambda list ++ is used to @i{specialize} a @i{method} ++for a particular @i{signature} and to describe how @i{arguments} matching ++that @i{signature} are received by the @i{method}. ++The @i{defined names} in Figure 3--15 use @i{specialized lambda lists} ++in some way; see the dictionary entry for each for information about how. ++ ++@format ++@group ++@noindent ++@w{ defmethod defgeneric } ++ ++@noindent ++@w{ Figure 3--15: Standardized Operators that use Specialized Lambda Lists} ++ ++@end group ++@end format ++ ++A @i{specialized lambda list} can contain the @i{lambda list keywords} shown ++in Figure 3--16. ++ ++@format ++@group ++@noindent ++@w{ @b{&allow-other-keys} @b{&key} @b{&rest} } ++@w{ @b{&aux} @b{&optional} } ++ ++@noindent ++@w{ Figure 3--16: Lambda List Keywords used by Specialized Lambda Lists} ++ ++@end group ++@end format ++ ++A @i{specialized lambda list} is syntactically the same as an @i{ordinary lambda list} ++except that each @i{required parameter} may optionally be associated with a @i{class} ++or @i{object} for which that @i{parameter} is @i{specialized}. ++ ++@w{@i{lambda-list} ::=@r{(}@{@i{var} | @r{(}@i{var} @r{[}@i{specializer}@r{]}@r{)}@}*} ++@w{ @t{[}@r{&optional} @{@i{var} | ++ @r{(}@i{var} @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}*@t{]}} ++@w{ @t{[}@r{&rest} @i{var}@t{]}} ++@w{ @t{[}@r{&key} @{@i{var} | ++ @r{(}@{@i{var} | ++ @r{(}@i{keyword-name} @i{var}@r{)}@} ++ @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}* @r{[}@t{&allow-other-keys}@r{]}@t{]}} ++@w{ @t{[}@r{&aux} @{@i{var} | @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@t{]}@r{)}} ++@w{ } ++ ++@node Macro Lambda Lists, Destructuring Lambda Lists, Specialized Lambda Lists, Lambda Lists ++@subsection Macro Lambda Lists ++ ++A @i{macro lambda list} ++@IGindex macro lambda list ++ is used in describing @i{macros} ++defined by the @i{operators} in Figure 3--17. ++ ++@format ++@group ++@noindent ++@w{ define-compiler-macro defmacro macrolet } ++@w{ define-setf-expander } ++ ++@noindent ++@w{ Figure 3--17: Operators that use Macro Lambda Lists} ++ ++@end group ++@end format ++ ++With the additional restriction that ++an @i{environment parameter} may appear only once ++(at any of the positions indicated), ++a @i{macro lambda list} has the following syntax: ++ ++ ++@w{@i{reqvars} ::=@{@i{var} | !@i{pattern}@}*} ++ ++@w{@i{optvars} ::=@t{[}@r{&optional} @{@i{var} | ++ @r{(}@r{@{@i{var} | !@i{pattern}@}} @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}*@t{]}} ++ ++@w{@i{restvar} ::=@t{[}@{@t{&rest} | @r{&body}@} @i{@{@i{var} | !@i{pattern}@}}@t{]}} ++ ++@w{@i{keyvars} ::=@r{[}@r{&key} @{@i{var} | ++ @r{(}@{@i{var} | ++ @r{(}@i{keyword-name} @{@i{var} | !@i{pattern}@}@r{)}@} ++ @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}*} ++@w{ @r{[}@t{&allow-other-keys}@r{]}@r{]}} ++ ++ ++@w{@i{auxvars} ::=@t{[}@r{&aux} @{@i{var} | @r{(}@r{@i{var}} @r{[}@i{init-form}@r{]}@r{)}@}*@t{]}} ++ ++@w{@i{envvar} ::=@t{[}@r{&environment} @i{var}@t{]}} ++ ++@w{@i{wholevar} ::=@t{[}@r{&whole} @i{var}@t{]}} ++ ++@w{@i{lambda-list} ::=@r{(}!@i{wholevar} !@i{envvar} !@i{reqvars} !@i{envvar} !@i{optvars} !@i{envvar}} ++@w{ !@i{restvar} !@i{envvar} !@i{keyvars} !@i{envvar} !@i{auxvars} !@i{envvar}@r{)} |} ++@w{ @r{(}!@i{wholevar} !@i{envvar} !@i{reqvars} !@i{envvar} !@i{optvars} !@i{envvar} @t{.} @i{var}@r{)}} ++ ++@w{@i{pattern} ::=@r{(}!@i{wholevar} !@i{reqvars} !@i{optvars} !@i{restvar} !@i{keyvars} !@i{auxvars}@r{)} |} ++@w{ @r{(}!@i{wholevar} !@i{reqvars} !@i{optvars} @t{.} @i{var}@r{)}} ++ ++ ++ ++A @i{macro lambda list} can contain ++the @i{lambda list keywords} shown in Figure 3--18. ++ ++@format ++@group ++@noindent ++@w{ @b{&allow-other-keys} @b{&environment} @b{&rest} } ++@w{ @b{&aux} @b{&key} @b{&whole} } ++@w{ @b{&body} @b{&optional} } ++ ++@noindent ++@w{ Figure 3--18: Lambda List Keywords used by Macro Lambda Lists} ++ ++@end group ++@end format ++ ++@i{Optional parameters} (introduced by @b{&optional}) and ++@i{keyword parameters} (introduced by @b{&key}) ++can be supplied in a @i{macro lambda list}, ++just as in an @i{ordinary lambda list}. ++Both may contain default initialization forms and @i{supplied-p parameters}. ++ ++@b{&body} ++@IRindex &body ++ ++is identical in function to @b{&rest}, ++but it can be used to inform certain output-formatting ++and editing functions that the remainder of the @i{form} is ++treated as a body, and should be indented accordingly. ++Only one of @b{&body} or @b{&rest} can be used at any particular level; ++see @ref{Destructuring by Lambda Lists}. ++ ++@b{&body} can appear at any level of a ++@i{macro lambda list}; ++for details, see @ref{Destructuring by Lambda Lists}. ++ ++@b{&whole} ++@IRindex &whole ++ ++is followed by a single variable that is bound to the ++entire macro-call form; this is the value that the @i{macro function} ++receives as its first argument. ++ ++If @b{&whole} and a following variable appear, ++they must appear first in @i{lambda-list}, ++ ++before any other parameter or @i{lambda list keyword}. ++ ++@b{&whole} can appear at any level of a @i{macro lambda list}. ++At inner levels, the @b{&whole} variable is bound to ++ the corresponding part of the argument, ++as with @b{&rest}, but unlike @b{&rest}, other arguments are also allowed. ++The use of @b{&whole} does not affect the pattern of arguments ++ specified. ++ ++@b{&environment} ++@IRindex &environment ++ ++is followed by a single variable that is bound ++to an @i{environment} representing the @i{lexical environment} in which the ++macro call is to be interpreted. ++This @i{environment} ++should be used with ++ ++@b{macro-function}, ++ ++@b{get-setf-expansion}, ++ ++@b{compiler-macro-function}, ++ ++and ++@b{macroexpand} ++(for example) in computing the expansion of the macro, to ensure that any ++@i{lexical bindings} or definitions established in the ++@i{compilation environment} are taken into account. ++ ++@b{&environment} can only appear at the top level of a ++ @i{macro lambda list}, and can only ++appear once, but can appear anywhere in that list; ++ ++the @b{&environment} @i{parameter} is @i{bound} along with @b{&whole} ++before any other @i{variables} in the @i{lambda list}, regardless of where ++@b{&environment} appears in the @i{lambda list}. ++ ++The @i{object} that is bound to the ++@i{environment parameter} has @i{dynamic extent}. ++ ++Destructuring allows a @i{macro lambda list} to express ++the structure of a macro call syntax. ++If no @i{lambda list keywords} appear, ++then the @i{macro lambda list} is a @i{tree} ++containing parameter names at the leaves. ++The pattern and the @i{macro form} must have compatible @i{tree structure}; ++that is, their @i{tree structure} must be equivalent, ++or it must differ only in that some @i{leaves} of the pattern ++match @i{non-atomic} @i{objects} of the @i{macro form}. ++ ++For information about error detection in this @i{situation}, ++see @ref{Destructuring Mismatch}. ++ ++A destructuring @i{lambda list} ++(whether at top level or embedded) ++can ++be dotted, ending ++in a parameter name. This situation is treated exactly as if the ++parameter name that ends the @i{list} had appeared preceded by @b{&rest}. ++ ++It is permissible for a @i{macro} @i{form} (or a @i{subexpression} of a ++@i{macro} @i{form}) ++to be a @i{dotted list} ++only when @t{(... &rest var)} or @t{(... . var)} is used to match ++ it. It is the responsibility of the @i{macro} to recognize and deal ++ with such situations. ++ ++[Editorial Note by KMP: Apparently the dotted-macro-forms cleanup doesn't allow for ++ the macro to `manually' notice dotted forms and fix them as well. ++ It shouldn't be required that this be done only by &REST or ++ a dotted pattern; it should only matter that ultimately the ++ non-macro result of a full-macro expansion not contain dots. ++ Anyway, I plan to address this editorially unless someone ++ raises an objection.] ++ ++@menu ++* Destructuring by Lambda Lists:: ++* Data-directed Destructuring by Lambda Lists:: ++* Examples of Data-directed Destructuring by Lambda Lists:: ++* Lambda-list-directed Destructuring by Lambda Lists:: ++@end menu ++ ++@node Destructuring by Lambda Lists, Data-directed Destructuring by Lambda Lists, Macro Lambda Lists, Macro Lambda Lists ++@subsubsection Destructuring by Lambda Lists ++ ++Anywhere in a @i{macro lambda list} where a parameter ++name can appear, and where @i{ordinary lambda list} syntax ++(as described in @ref{Ordinary Lambda Lists}) does not ++otherwise allow a @i{list}, a @i{destructuring lambda list} ++can appear in place ++of the parameter name. When this is done, then the argument ++that would match the parameter is treated as a (possibly dotted) @i{list}, ++to be used as an argument list for satisfying the ++parameters in the embedded @i{lambda list}. ++This is known as destructuring. ++ ++Destructuring is the process of decomposing a compound @i{object} into ++its component parts, using an abbreviated, declarative syntax, rather ++than writing it out by hand using the primitive component-accessing ++functions. Each component part is bound to a variable. ++ ++A destructuring operation requires an @i{object} to be decomposed, ++a pattern that specifies what components are to be extracted, and the names ++of the variables whose values are to be the components. ++ ++@node Data-directed Destructuring by Lambda Lists, Examples of Data-directed Destructuring by Lambda Lists, Destructuring by Lambda Lists, Macro Lambda Lists ++@subsubsection Data-directed Destructuring by Lambda Lists ++ ++In data-directed destructuring, ++the pattern is a sample @i{object} of the @i{type} to be decomposed. ++Wherever a component is to be extracted, ++a @i{symbol} appears in the pattern; ++this @i{symbol} is the name of the variable whose value will be that component. ++ ++@node Examples of Data-directed Destructuring by Lambda Lists, Lambda-list-directed Destructuring by Lambda Lists, Data-directed Destructuring by Lambda Lists, Macro Lambda Lists ++@subsubsection Examples of Data-directed Destructuring by Lambda Lists ++ ++An example pattern is ++ ++@t{(a b c)} ++ ++which destructures a list of three elements. The variable @t{a} is assigned ++to the first element, @t{b} to the second, etc. A more complex example ++is ++ ++@t{((first . rest) . more)} ++ ++The important features of data-directed destructuring are its syntactic ++simplicity and the ability to extend it to lambda-list-directed destructuring. ++ ++@node Lambda-list-directed Destructuring by Lambda Lists, , Examples of Data-directed Destructuring by Lambda Lists, Macro Lambda Lists ++@subsubsection Lambda-list-directed Destructuring by Lambda Lists ++ ++An extension of data-directed destructuring of @i{trees} is ++lambda-list-directed destructuring. This derives from the analogy ++between the three-element destructuring pattern ++ ++@t{(first second third)} ++ ++and the three-argument @i{lambda list} ++ ++@t{(first second third)} ++ ++Lambda-list-directed destructuring is identical to data-directed destructuring ++if no @i{lambda list keywords} appear in the pattern. ++Any list in the pattern (whether a sub-list or the whole pattern itself) ++that contains a @i{lambda list keyword} is interpreted specially. ++Elements of the list to the left of the first ++@i{lambda list keyword} are treated as destructuring patterns, as usual, but the ++remaining elements of the list are treated like a function's ++@i{lambda list} ++except that where a variable would normally be required, an arbitrary ++destructuring pattern is allowed. Note that in case of ambiguity, ++@i{lambda list} syntax is preferred over destructuring syntax. Thus, after ++@b{&optional} a list of elements is a list of a destructuring pattern ++and a default value form. ++ ++The detailed behavior of each @i{lambda list keyword} in a ++lambda-list-directed destructuring ++pattern is as follows: ++ ++@table @asis ++ ++@item @b{&optional} ++Each following element is a variable or a list of a destructuring ++pattern, a default value form, and a supplied-p variable. The default value and ++the supplied-p variable can be omitted. ++If the list being destructured ends ++early, so that it does not have an element to match against this destructuring ++(sub)-pattern, the default form is evaluated and destructured instead. The ++supplied-p variable receives the value ++@b{nil} if the default form is used, @b{t} otherwise. ++ ++@item @b{&rest}, @b{&body} ++The next element is a destructuring pattern that matches the ++rest of the list. @b{&body} is identical to @b{&rest} but declares that what ++is being matched is a list of forms that constitutes the body of @i{form}. ++This next element must be the last unless a @i{lambda list keyword} follows it. ++ ++@item @b{&aux} ++The remaining elements are not destructuring patterns at all, but are ++auxiliary variable bindings. ++ ++@item @b{&whole} ++The next element is a destructuring pattern that matches the entire ++form in a macro, or the entire @i{subexpression} at inner levels. ++ ++@item @b{&key} ++Each following element is one of ++@table @asis ++ ++@item @t{} ++a @i{variable}, ++ ++@item or ++a list of a variable, ++ an optional initialization form, ++ and an optional supplied-p variable. ++ ++@item or ++a list of a list of a keyword and a destructuring pattern, ++ an optional initialization form, ++ and an optional supplied-p variable. ++@end table ++ ++The rest of the list being destructured ++is taken to be alternating keywords and values and is taken apart appropriately. ++ ++@item @b{&allow-other-keys} ++Stands by itself. ++@end table ++ ++@node Destructuring Lambda Lists, Boa Lambda Lists, Macro Lambda Lists, Lambda Lists ++@subsection Destructuring Lambda Lists ++ ++A @i{destructuring lambda list} ++@IGindex destructuring lambda list ++ is used by @b{destructuring-bind}. ++ ++@i{Destructuring lambda lists} are closely related to ++@i{macro lambda lists}; see @ref{Macro Lambda Lists}. ++A @i{destructuring lambda list} can contain all of the ++@i{lambda list keywords} listed for @i{macro lambda lists} ++except for @b{&environment}, and supports destructuring in the ++same way. Inner @i{lambda lists} nested within a @i{macro lambda list} ++have the syntax of @i{destructuring lambda lists}. ++ ++A @i{destructuring lambda list} has the following syntax: ++ ++ ++@w{@i{reqvars} ::=@{@i{var} | !@i{lambda-list}@}*} ++ ++@w{@i{optvars} ::=@t{[}@r{&optional} @{@i{var} | ++ @r{(}@{@i{var} | !@i{lambda-list}@} @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}*@t{]}} ++ ++@w{@i{restvar} ::=@t{[}@{@t{&rest}} | @t{&body}@} @i{@{@i{var} | !@i{lambda-list}@}@t{]}} ++ ++@w{@i{keyvars} ::=@r{[}@r{&key} @{@i{var} | ++ @r{(}@{@i{var} | ++ @r{(}@i{keyword-name} @{@i{var} | !@i{lambda-list}@}@r{)}@} ++ @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}*} ++@w{ @r{[}@t{&allow-other-keys}@r{]}@r{]}} ++ ++ ++@w{@i{auxvars} ::=@t{[}@r{&aux} @{@i{var} | @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@t{]}} ++ ++@w{@i{envvar} ::=@t{[}@r{&environment} @i{var}@t{]}} ++ ++@w{@i{wholevar} ::=@t{[}@r{&whole} @i{var}@t{]}} ++ ++@w{@i{lambda-list} ::=@r{(}!@i{wholevar} !@i{reqvars} !@i{optvars} !@i{restvar} !@i{keyvars} !@i{auxvars}@r{)} |} ++@w{ @r{(}!@i{wholevar} !@i{reqvars} !@i{optvars} @t{.} @i{var}@r{)}} ++ ++ ++@node Boa Lambda Lists, Defsetf Lambda Lists, Destructuring Lambda Lists, Lambda Lists ++@subsection Boa Lambda Lists ++ ++A @i{boa lambda list} ++@IGindex boa lambda list ++ is a @i{lambda list} that is syntactically ++like an @i{ordinary lambda list}, but that is processed in ++``@b{b}y @b{o}rder of @b{a}rgument'' style. ++ ++A @i{boa lambda list} is used only in a @b{defstruct} @i{form}, ++when explicitly specifying the @i{lambda list} ++of a constructor @i{function} (sometimes called a ``boa constructor''). ++ ++The @b{&optional}, @b{&rest}, @b{&aux}, ++ ++@b{&key}, and @b{&allow-other-keys} ++ ++@i{lambda list keywords} are recognized in a @i{boa lambda list}. ++The way these @i{lambda list keywords} differ from their ++use in an @i{ordinary lambda list} follows. ++ ++Consider this example, which describes how @b{destruct} processes ++its @t{:constructor} option. ++ ++@example ++ (:constructor create-foo ++ (a &optional b (c 'sea) &rest d &aux e (f 'eff))) ++@end example ++ ++This defines @t{create-foo} to be a constructor of one or more arguments. ++The first argument is used to initialize the @t{a} slot. The second ++argument is used to initialize the @t{b} slot. If there isn't any ++second argument, then the default value given in the body of the ++@b{defstruct} (if given) is used instead. ++The third argument is used to ++initialize the @t{c} slot. If there isn't any third argument, then the ++symbol @t{sea} is used instead. Any arguments following the third ++argument are collected into a @i{list} ++and used to initialize the @t{d} ++slot. If there are three or fewer arguments, then @b{nil} is placed in ++the @t{d} slot. The @t{e} slot is not initialized; ++its initial value is @i{implementation-defined}. ++Finally, the @t{f} slot is initialized to contain the symbol @t{eff}. ++ ++@b{&key} and @b{&allow-other-keys} arguments default ++in a manner similar to that of @b{&optional} arguments: if no default ++is supplied in the @i{lambda list} then the default value ++given in the body of the @b{defstruct} (if given) is used instead. ++For example: ++ ++@example ++ (defstruct (foo (:constructor CREATE-FOO (a &optional b (c 'sea) ++ &key (d 2) ++ &aux e (f 'eff)))) ++ (a 1) (b 2) (c 3) (d 4) (e 5) (f 6)) ++ ++ (create-foo 10) @result{} #S(FOO A 10 B 2 C SEA D 2 E @i{implemention-dependent} F EFF) ++ (create-foo 10 'bee 'see :d 'dee) ++@result{} #S(FOO A 10 B BEE C SEE D DEE E @i{implemention-dependent} F EFF) ++@end example ++ ++If keyword arguments of the form ++@t{((@i{key} @i{var}) @r{[}@i{default} @r{[}@i{svar}@r{]}@r{]})} ++are specified, the @i{slot} @i{name} is matched with @i{var} ++(not @i{key}). ++ ++The actions taken in the @t{b} and @t{e} cases were carefully ++chosen to allow the user to specify all possible behaviors. ++The @b{&aux} variables can be used to completely override the default ++initializations given in the body. ++ ++If no default value is supplied for an @i{aux variable} variable, ++the consequences are undefined if an attempt is later made to read ++the corresponding @i{slot}'s value before a value is explicitly assigned. ++If such a @i{slot} has a @t{:type} option specified, ++this suppressed initialization does not imply a type mismatch situation; ++the declared type is only required to apply when the @i{slot} is finally assigned. ++ ++With this definition, the following can be written: ++ ++@example ++ (create-foo 1 2) ++@end example ++ ++instead of ++ ++@example ++ (make-foo :a 1 :b 2) ++@end example ++ ++and @t{create-foo} provides defaulting different ++from that of @t{make-foo}. ++ ++Additional arguments that do not correspond to slot names but ++are merely present to supply values used in subsequent initialization ++computations are allowed. ++For example, in the definition ++ ++@example ++ (defstruct (frob (:constructor create-frob ++ (a &key (b 3 have-b) (c-token 'c) ++ (c (list c-token (if have-b 7 2)))))) ++ a b c) ++@end example ++ ++the @t{c-token} argument is used merely to supply a value used in the ++initialization of the @t{c} slot. The @i{supplied-p parameters} ++associated with @i{optional parameters} and @i{keyword parameters} ++might also be used this way. ++ ++@node Defsetf Lambda Lists, Deftype Lambda Lists, Boa Lambda Lists, Lambda Lists ++@subsection Defsetf Lambda Lists ++ ++A @i{defsetf lambda list} ++@IGindex defsetf lambda list ++ is used by @b{defsetf}. ++ ++A @i{defsetf lambda list} has the following syntax: ++ ++@w{@i{lambda-list} ::=@r{(}@{@i{var}@}*} ++@w{ @t{[}@r{&optional} @{@i{var} | ++ @r{(}@i{var} @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}*@t{]}} ++@w{ @t{[}@r{&rest} @i{var}@t{]}} ++@w{ @t{[}@r{&key} @{@i{var} | ++ @r{(}@{@i{var} | ++ @r{(}@i{keyword-name} @i{var}@r{)}@} ++ @r{[}init-form @r{[}supplied-p-parameter@r{]}@r{]}@r{)}@}* pt @r{[}@t{&allow-other-keys}@r{]}@t{]}} ++@w{ @t{[}@r{&environment} @i{var}@t{]}} ++ ++A @i{defsetf lambda list} can contain the @i{lambda list keywords} shown ++in Figure 3--19. ++ ++@format ++@group ++@noindent ++@w{ @b{&allow-other-keys} @b{&key} @b{&rest} } ++@w{ @b{&environment} @b{&optional} } ++ ++@noindent ++@w{ Figure 3--19: Lambda List Keywords used by Defsetf Lambda Lists} ++ ++@end group ++@end format ++ ++A @i{defsetf lambda list} differs from an @i{ordinary lambda list} ++only in that it does not permit the use of @b{&aux}, ++and that it permits use of @b{&environment}, ++ which introduces an @i{environment parameter}. ++ ++@node Deftype Lambda Lists, Define-modify-macro Lambda Lists, Defsetf Lambda Lists, Lambda Lists ++@subsection Deftype Lambda Lists ++ ++A @i{deftype lambda list} ++@IGindex deftype lambda list ++ is used by @b{deftype}. ++ ++A @i{deftype lambda list} has the same syntax as a @i{macro lambda list}, ++and can therefore contain the @i{lambda list keywords} as a @i{macro lambda list}. ++ ++A @i{deftype lambda list} differs from a @i{macro lambda list} ++only in that if no @i{init-form} is supplied for an @i{optional parameter} ++or @i{keyword parameter} in the @i{lambda-list}, the default @i{value} ++for that @i{parameter} is the @i{symbol} @b{*} (rather than @b{nil}). ++ ++@node Define-modify-macro Lambda Lists, Define-method-combination Arguments Lambda Lists, Deftype Lambda Lists, Lambda Lists ++@subsection Define-modify-macro Lambda Lists ++ ++A @i{define-modify-macro lambda list} ++@IGindex define-modify-macro lambda list ++ is used by ++@b{define-modify-macro}. ++ ++A @i{define-modify-macro lambda list} can contain the ++@i{lambda list keywords} shown in Figure 3--20. ++ ++@format ++@group ++@noindent ++@w{ @b{&optional} @b{&rest} } ++ ++@noindent ++@w{ Figure 3--20: Lambda List Keywords used by Define-modify-macro Lambda Lists} ++ ++@end group ++@end format ++ ++@i{Define-modify-macro lambda lists} are similar to ++@i{ordinary lambda lists}, but do not support keyword arguments. ++@b{define-modify-macro} has no need match keyword arguments, and ++a @i{rest parameter} is sufficient. @i{Aux variables} are also ++not supported, since @b{define-modify-macro} has no body @i{forms} ++which could refer to such @i{bindings}. See the @i{macro} @b{define-modify-macro}. ++ ++@node Define-method-combination Arguments Lambda Lists, Syntactic Interaction of Documentation Strings and Declarations, Define-modify-macro Lambda Lists, Lambda Lists ++@subsection Define-method-combination Arguments Lambda Lists ++ ++A @i{define-method-combination arguments lambda list} ++@IGindex define-method-combination arguments lambda list ++ is used by ++the @t{:arguments} option to @b{define-method-combination}. ++ ++A @i{define-method-combination arguments lambda list} can contain the ++@i{lambda list keywords} shown in Figure 3--21. ++ ++@format ++@group ++@noindent ++@w{ @b{&allow-other-keys} @b{&key} @b{&rest} } ++@w{ @b{&aux} @b{&optional} @b{&whole} } ++ ++@noindent ++@w{ Figure 3--21: Lambda List Keywords used by Define-method-combination arguments Lambda Lists} ++ ++@end group ++@end format ++ ++@i{Define-method-combination arguments lambda lists} are similar to ++@i{ordinary lambda lists}, but also permit the use of @b{&whole}. ++ ++@node Syntactic Interaction of Documentation Strings and Declarations, , Define-method-combination Arguments Lambda Lists, Lambda Lists ++@subsection Syntactic Interaction of Documentation Strings and Declarations ++ ++In a number of situations, a @i{documentation string} can appear amidst a ++series of @b{declare} @i{expressions} prior to a series of @i{forms}. ++ ++In that case, if a @i{string} S appears where a @i{documentation string} is ++permissible and is not followed by ++ either a @b{declare} @i{expression} ++ or a @i{form} ++then S is taken to be a @i{form}; ++otherwise, S is taken as a @i{documentation string}. ++The consequences are unspecified if more than one such @i{documentation string} ++is present. ++ ++@c end of including concept-bvl ++ ++@node Error Checking in Function Calls, Traversal Rules and Side Effects, Lambda Lists, Evaluation and Compilation ++@section Error Checking in Function Calls ++ ++@c including concept-args ++ ++@menu ++* Argument Mismatch Detection:: ++@end menu ++ ++@node Argument Mismatch Detection, , Error Checking in Function Calls, Error Checking in Function Calls ++@subsection Argument Mismatch Detection ++ ++@menu ++* Safe and Unsafe Calls:: ++* Error Detection Time in Safe Calls:: ++* Too Few Arguments:: ++* Too Many Arguments:: ++* Unrecognized Keyword Arguments:: ++* Invalid Keyword Arguments:: ++* Odd Number of Keyword Arguments:: ++* Destructuring Mismatch:: ++* Errors When Calling a Next Method:: ++@end menu ++ ++@node Safe and Unsafe Calls, Error Detection Time in Safe Calls, Argument Mismatch Detection, Argument Mismatch Detection ++@subsubsection Safe and Unsafe Calls ++ ++A @i{call} is a @i{safe call} ++@IGindex safe call ++ if each of the following is ++either @i{safe} @i{code} or @i{system code} (other than ++@i{system code} that results from @i{macro expansion} of ++@i{programmer code}): ++@table @asis ++ ++@item @t{*} ++the @i{call}. ++@item @t{*} ++the definition of the @i{function} being @i{called}. ++@item @t{*} ++the point of @i{functional evaluation} ++@end table ++ ++The following special cases require some elaboration: ++ ++@table @asis ++ ++@item @t{*} ++If the @i{function} being called is a @i{generic function}, ++it is considered @i{safe} if all of the following are ++ ++@i{safe code} or @i{system code}: ++ ++@table @asis ++ ++@item -- ++its definition (if it was defined explicitly). ++@item -- ++the @i{method} definitions for all @i{applicable} @i{methods}. ++@item -- ++the definition of its @i{method combination}. ++@end table ++ ++@item @t{*} ++For the form @t{(coerce @i{x} 'function)}, ++where @i{x} is a @i{lambda expression}, ++the value of the @i{optimize quality} @b{safety} ++in the global environment at the time the @b{coerce} ++is @i{executed} applies to the resulting @i{function}. ++ ++@item @t{*} ++For a call to the @i{function} @b{ensure-generic-function}, the value of the ++@i{optimize quality} @b{safety} in the @i{environment} ++@i{object} passed as the @t{:environment} @i{argument} applies ++to the resulting @i{generic function}. ++ ++@item @t{*} ++For a call to @b{compile} with a @i{lambda expression} as the ++@i{argument}, the value of the @i{optimize quality} @b{safety} ++in the @i{global environment} at the time @b{compile} is @i{called} ++applies to the resulting @i{compiled function}. ++ ++@item @t{*} ++For a call to @b{compile} with only one argument, if the original definition ++of the @i{function} was @i{safe}, then the resulting @i{compiled function} ++must also be @i{safe}. ++ ++@item @t{*} ++A @i{call} to a @i{method} by @b{call-next-method} must be ++considered @i{safe} if each of the following is ++ ++@i{safe code} or @i{system code}: ++ ++@table @asis ++ ++@item -- ++the definition of the @i{generic function} (if it was defined explicitly). ++@item -- ++the @i{method} definitions for all @i{applicable} @i{methods}. ++@item -- ++the definition of the @i{method combination}. ++@item -- ++the point of entry into the body of the @i{method defining form}, ++ where the @i{binding} of @b{call-next-method} is established. ++@item -- ++the point of @i{functional evaluation} of the name @b{call-next-method}. ++@end table ++ ++@end table ++ ++An @i{unsafe call} ++@IGindex unsafe call ++ is a @i{call} that is not a @i{safe call}. ++ ++The informal intent is that the @i{programmer} can rely on a @i{call} ++to be @i{safe}, even when @i{system code} is involved, if all reasonable ++steps have been taken to ensure that the @i{call} is @i{safe}. ++For example, if a @i{programmer} calls @b{mapcar} from @i{safe} ++@i{code} and supplies a @i{function} that was @i{compiled} ++as @i{safe}, the @i{implementation} is required to ensure that ++@b{mapcar} makes a @i{safe call} as well. ++ ++@node Error Detection Time in Safe Calls, Too Few Arguments, Safe and Unsafe Calls, Argument Mismatch Detection ++@subsubsection Error Detection Time in Safe Calls ++ ++If an error is signaled in a @i{safe call}, ++the exact point of the @i{signal} is @i{implementation-dependent}. ++In particular, it might be signaled at compile time or at run time, ++and if signaled at run time, ++it might be prior to, during, or after @i{executing} the @i{call}. ++However, it is always prior to the execution of the body of the @i{function} ++being @i{called}. ++ ++@node Too Few Arguments, Too Many Arguments, Error Detection Time in Safe Calls, Argument Mismatch Detection ++@subsubsection Too Few Arguments ++ ++It is not permitted to supply too few @i{arguments} to a @i{function}. ++Too few arguments means fewer @i{arguments} than the number of @i{required parameters} ++for the @i{function}. ++ ++If this @i{situation} occurs in a @i{safe call}, ++ ++an error of @i{type} @b{program-error} must be signaled; ++and in an @i{unsafe call} the @i{situation} has undefined consequences. ++ ++@node Too Many Arguments, Unrecognized Keyword Arguments, Too Few Arguments, Argument Mismatch Detection ++@subsubsection Too Many Arguments ++ ++It is not permitted to supply too many @i{arguments} to a @i{function}. ++Too many arguments means more @i{arguments} than the number of @i{required parameters} ++plus the number of @i{optional parameters}; however, if the @i{function} ++uses @b{&rest} or @b{&key}, it is not possible for it to receive too many arguments. ++ ++If this @i{situation} occurs in a @i{safe call}, ++ ++an error of @i{type} @b{program-error} must be signaled; ++and in an @i{unsafe call} the @i{situation} has undefined consequences. ++ ++@node Unrecognized Keyword Arguments, Invalid Keyword Arguments, Too Many Arguments, Argument Mismatch Detection ++@subsubsection Unrecognized Keyword Arguments ++ ++It is not permitted to supply a keyword argument to a @i{function} ++using a name that is not recognized by that @i{function} ++unless keyword argument checking is suppressed as described ++in @ref{Suppressing Keyword Argument Checking}. ++ ++If this @i{situation} occurs in a @i{safe call}, ++ ++an error of @i{type} @b{program-error} must be signaled; ++and in an @i{unsafe call} the @i{situation} has undefined consequences. ++ ++@node Invalid Keyword Arguments, Odd Number of Keyword Arguments, Unrecognized Keyword Arguments, Argument Mismatch Detection ++@subsubsection Invalid Keyword Arguments ++ ++It is not permitted to supply a keyword argument to a @i{function} ++using a name that is not a @i{symbol}. ++ ++If this @i{situation} occurs in a @i{safe call}, ++ ++an error of @i{type} @b{program-error} must be signaled ++unless keyword argument checking is suppressed as described ++in @ref{Suppressing Keyword Argument Checking}; ++and in an @i{unsafe call} the @i{situation} has undefined consequences. ++ ++@node Odd Number of Keyword Arguments, Destructuring Mismatch, Invalid Keyword Arguments, Argument Mismatch Detection ++@subsubsection Odd Number of Keyword Arguments ++ ++An odd number of @i{arguments} must not be supplied for the @i{keyword parameters}. ++ ++If this @i{situation} occurs in a @i{safe call}, ++ ++an error of @i{type} @b{program-error} must be signaled ++unless keyword argument checking is suppressed as described ++in @ref{Suppressing Keyword Argument Checking}; ++and in an @i{unsafe call} the @i{situation} has undefined consequences. ++ ++@node Destructuring Mismatch, Errors When Calling a Next Method, Odd Number of Keyword Arguments, Argument Mismatch Detection ++@subsubsection Destructuring Mismatch ++ ++When matching a @i{destructuring lambda list} against a @i{form}, ++the pattern and the @i{form} must have compatible @i{tree structure}, ++as described in @ref{Macro Lambda Lists}. ++ ++Otherwise, in a @i{safe call}, ++an error of @i{type} @b{program-error} must be signaled; ++and in an @i{unsafe call} the @i{situation} has undefined consequences. ++ ++@node Errors When Calling a Next Method, , Destructuring Mismatch, Argument Mismatch Detection ++@subsubsection Errors When Calling a Next Method ++ ++If @b{call-next-method} is called with @i{arguments}, the ordered ++set of @i{applicable} @i{methods} for the changed set of @i{arguments} ++for @b{call-next-method} must be the same as the ordered set of ++@i{applicable} @i{methods} for the original @i{arguments} to the ++@i{generic function}, or else an error should be signaled. ++ ++The comparison between the set of methods applicable to the ++new arguments and the set applicable to the original arguments is ++insensitive to order differences among methods with the same ++specializers. ++ ++If @b{call-next-method} is called with @i{arguments} that specify ++a different ordered set of @i{applicable} methods and there is no ++@i{next method} available, the test for different methods and the ++associated error signaling (when present) takes precedence over calling ++@b{no-next-method}. ++ ++@c end of including concept-args ++ ++@node Traversal Rules and Side Effects, Destructive Operations, Error Checking in Function Calls, Evaluation and Compilation ++@section Traversal Rules and Side Effects ++ ++@c including concept-traversal ++ ++The consequences are undefined ++when @i{code} executed during an @i{object-traversing} operation ++destructively modifies the @i{object} in a way that might affect the ++ongoing traversal operation. ++In particular, the following rules apply. ++@table @asis ++ ++@item @b{List traversal} ++For @i{list} traversal operations, the @i{cdr} chain of the ++ @i{list} is not allowed to be destructively modified. ++ ++@item @b{Array traversal} ++For @i{array} traversal operations, the @i{array} is not allowed ++ to be adjusted and its @i{fill pointer}, if any, is not allowed to ++ be changed. ++ ++@item @b{Hash-table traversal} ++For @i{hash table} traversal operations, new elements may not be added ++ or deleted except that the element corresponding to the current hash key ++ may be changed or removed. ++ ++@item @b{Package traversal} ++For @i{package} traversal operations (@i{e.g.}, @b{do-symbols}), ++ new @i{symbols} may not be @i{interned} in or @i{uninterned} ++ from the @i{package} being traversed ++ or any @i{package} that it uses except that the ++ current @i{symbol} may be @i{uninterned} from the @i{package} ++ being traversed. ++ ++@end table ++ ++@c end of including concept-traversal ++ ++@node Destructive Operations, Evaluation and Compilation Dictionary, Traversal Rules and Side Effects, Evaluation and Compilation ++@section Destructive Operations ++ ++@c including concept-destruction ++ ++@menu ++* Modification of Literal Objects:: ++* Transfer of Control during a Destructive Operation:: ++@end menu ++ ++@node Modification of Literal Objects, Transfer of Control during a Destructive Operation, Destructive Operations, Destructive Operations ++@subsection Modification of Literal Objects ++ ++The consequences are undefined if @i{literal} @i{objects} ++are destructively modified. For this purpose, the following operations ++are considered @i{destructive}: ++ ++@table @asis ++ ++@item @b{random-state} ++Using it as an @i{argument} to the @i{function} @b{random}. ++ ++@item @b{cons} ++Changing the @i{car}_1 or @i{cdr}_1 of the @i{cons}, ++or performing a @i{destructive} operation on an @i{object} which is either ++the @i{car}_2 or the @i{cdr}_2 of the @i{cons}. ++ ++@item @b{array} ++Storing a new value into some element of the @i{array}, ++or performing a @i{destructive} operation ++on an @i{object} that is already such an @i{element}. ++ ++Changing the @i{fill pointer}, @i{dimensions}, or displacement of ++the @i{array} (regardless of whether the @i{array} is @i{actually adjustable}). ++ ++Performing a @i{destructive} operation on another @i{array} ++that is displaced to the @i{array} or that otherwise shares its contents ++with the @i{array}. ++ ++@item @b{hash-table} ++Performing a @i{destructive} operation on any @i{key}. ++ ++Storing a new @i{value}_4 for any @i{key}, ++or performing a @i{destructive} operation ++on any @i{object} that is such a @i{value}. ++ ++Adding or removing entries from the @i{hash table}. ++ ++@item @b{structure-object} ++Storing a new value into any slot, ++or performing a @i{destructive} operation on an @i{object} ++that is the value of some slot. ++ ++@item @b{standard-object} ++Storing a new value into any slot, ++or performing a @i{destructive} operation on an @i{object} ++that is the value of some slot. ++ ++Changing the class of the @i{object} (@i{e.g.}, using the @i{function} @b{change-class}). ++ ++@item @b{readtable} ++Altering the @i{readtable case}. ++ ++Altering the syntax type of any character in this readtable. ++ ++Altering the @i{reader macro function} associated with any @i{character} ++in the @i{readtable}, or altering the @i{reader macro functions} ++associated with @i{characters} defined as @i{dispatching macro characters} ++in the @i{readtable}. ++ ++@item @b{stream} ++Performing I/O operations on the @i{stream}, ++or @i{closing} the @i{stream}. ++ ++@item All other standardized types ++[This category includes, for example, @b{character}, ++ @b{condition}, ++ @b{function}, ++ @b{method-combination}, ++ @b{method}, ++ @b{number}, ++ @b{package}, ++ @b{pathname}, ++ @b{restart}, ++ and @b{symbol}.] ++ ++There are no @i{standardized} @i{destructive} operations ++defined on @i{objects} of these @i{types}. ++ ++@end table ++ ++@node Transfer of Control during a Destructive Operation, , Modification of Literal Objects, Destructive Operations ++@subsection Transfer of Control during a Destructive Operation ++ ++Should a transfer of control out of a @i{destructive} operation occur ++(@i{e.g.}, due to an error) the state of the @i{object} being modified is ++@i{implementation-dependent}. ++ ++@menu ++* Examples of Transfer of Control during a Destructive Operation:: ++@end menu ++ ++@node Examples of Transfer of Control during a Destructive Operation, , Transfer of Control during a Destructive Operation, Transfer of Control during a Destructive Operation ++@subsubsection Examples of Transfer of Control during a Destructive Operation ++ ++The following examples illustrate some of the many ways in which the ++@i{implementation-dependent} nature of the modification can manifest ++itself. ++ ++@example ++ (let ((a (list 2 1 4 3 7 6 'five))) ++ (ignore-errors (sort a #'<)) ++ a) ++@result{} (1 2 3 4 6 7 FIVE) ++@i{OR}@result{} (2 1 4 3 7 6 FIVE) ++@i{OR}@result{} (2) ++ ++ (prog foo ((a (list 1 2 3 4 5 6 7 8 9 10))) ++ (sort a #'(lambda (x y) (if (zerop (random 5)) (return-from foo a) (> x y))))) ++@result{} (1 2 3 4 5 6 7 8 9 10) ++@i{OR}@result{} (3 4 5 6 2 7 8 9 10 1) ++@i{OR}@result{} (1 2 4 3) ++@end example ++ ++@c end of including concept-destruction ++ ++@node Evaluation and Compilation Dictionary, , Destructive Operations, Evaluation and Compilation ++@section Evaluation and Compilation Dictionary ++ ++@c including dict-eval-compile ++ ++@menu ++* lambda (Symbol):: ++* lambda:: ++* compile:: ++* eval:: ++* eval-when:: ++* load-time-value:: ++* quote:: ++* compiler-macro-function:: ++* define-compiler-macro:: ++* defmacro:: ++* macro-function:: ++* macroexpand:: ++* define-symbol-macro:: ++* symbol-macrolet:: ++* *macroexpand-hook*:: ++* proclaim:: ++* declaim:: ++* declare:: ++* ignore:: ++* dynamic-extent:: ++* type:: ++* inline:: ++* ftype:: ++* declaration:: ++* optimize:: ++* special:: ++* locally:: ++* the:: ++* special-operator-p:: ++* constantp:: ++@end menu ++ ++@node lambda (Symbol), lambda, Evaluation and Compilation Dictionary, Evaluation and Compilation Dictionary ++@subsection lambda [Symbol] ++ ++@subsubheading Syntax:: ++ ++@code{lambda} @i{lambda-list [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*} ++@subsubheading Arguments:: ++ ++@i{lambda-list}---an @i{ordinary lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++A @i{lambda expression} is a @i{list} that can be used in place of a ++@i{function name} in certain contexts to denote a @i{function} by ++directly describing its behavior rather than indirectly by referring to the ++name of an @i{established} @i{function}. ++ ++@i{Documentation} is attached to the denoted @i{function} (if any ++is actually created) as a @i{documentation string}. ++ ++@subsubheading See Also:: ++ ++@b{function}, ++@ref{documentation} ++, ++@ref{Lambda Expressions}, ++@ref{Lambda Forms}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++ ++The @i{lambda form} ++ ++@example ++ ((lambda @i{lambda-list} . @i{body}) . @i{arguments}) ++@end example ++ ++is semantically equivalent to the @i{function form} ++ ++@example ++ (funcall #'(lambda @i{lambda-list} . @i{body}) . @i{arguments}) ++@end example ++ ++@node lambda, compile, lambda (Symbol), Evaluation and Compilation Dictionary ++@subsection lambda [Macro] ++ ++@code{lambda} @i{lambda-list [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*} @result{} @i{@i{function}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{lambda-list}---an @i{ordinary lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@i{function}---a @i{function}. ++ ++@subsubheading Description:: ++ ++Provides a shorthand notation for a @b{function} @i{special form} ++involving a @i{lambda expression} such that: ++ ++@example ++ (lambda @i{lambda-list} [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*) ++ @equiv{} (function (lambda @i{lambda-list} [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*)) ++ @equiv{} #'(lambda @i{lambda-list} [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (funcall (lambda (x) (+ x 3)) 4) @result{} 7 ++@end example ++ ++@subsubheading See Also:: ++ ++@b{lambda} (symbol) ++ ++@subsubheading Notes:: ++ ++This macro could be implemented by: ++ ++@example ++(defmacro lambda (&whole form &rest bvl-decls-and-body) ++ (declare (ignore bvl-decls-and-body)) ++ `#',form) ++@end example ++ ++@node compile, eval, lambda, Evaluation and Compilation Dictionary ++@subsection compile [Function] ++ ++@code{compile} @i{name @r{&optional} definition} @result{} @i{function, warnings-p, failure-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{function name}, or @b{nil}. ++ ++@i{definition}---a @i{lambda expression} or a @i{function}. ++ The default is the function definition of @i{name} if it names a @i{function}, ++ or the @i{macro function} of @i{name} if it names a @i{macro}. ++ The consequences are undefined if no @i{definition} is supplied ++ when the @i{name} is @b{nil}. ++ ++@i{function}---the @i{function-name}, ++ ++ or a @i{compiled function}. ++ ++@i{warnings-p}---a @i{generalized boolean}. ++ ++@i{failure-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Compiles an @i{interpreted function}. ++ ++@b{compile} produces a @i{compiled function} from @i{definition}. ++If the @i{definition} is a @i{lambda expression}, ++it is coerced to a @i{function}. ++ ++If the @i{definition} is already a @i{compiled function}, ++@b{compile} either produces that function itself (@i{i.e.}, is an identity operation) ++or an equivalent function. ++ ++[Editorial Note by KMP: There are a number of ambiguities here that still need resolution.] ++If the @i{name} is @b{nil}, ++the resulting @i{compiled function} is returned directly as the @i{primary value}. ++If a @i{non-nil} @i{name} is given, ++then the resulting @i{compiled function} replaces ++the existing @i{function} definition of @i{name} ++and the @i{name} is returned as the @i{primary value}; ++if @i{name} is a @i{symbol} that names a @i{macro}, ++its @i{macro function} is updated ++and the @i{name} is returned as the @i{primary value}. ++ ++@i{Literal objects} appearing in code processed by ++the @b{compile} function are neither copied nor @i{coalesced}. ++The code resulting from the execution of @b{compile} ++references @i{objects} that are @b{eql} to the corresponding ++@i{objects} in the source code. ++ ++@b{compile} is permitted, but not required, to @i{establish} ++a @i{handler} for @i{conditions} of @i{type} @b{error}. ++For example, the @i{handler} might issue a warning and ++restart compilation from some @i{implementation-dependent} point ++in order to let the compilation proceed without manual intervention. ++ ++The @i{secondary value}, @i{warnings-p}, is @i{false} ++if no @i{conditions} of @i{type} @b{error} or @b{warning} ++were detected by the compiler, and @i{true} otherwise. ++ ++The @i{tertiary value}, @i{failure-p}, is @i{false} ++if no @i{conditions} of @i{type} @b{error} or @b{warning} ++(other than @b{style-warning}) ++were detected by the compiler, and @i{true} otherwise. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun foo () "bar") @result{} FOO ++ (compiled-function-p #'foo) @result{} @i{implementation-dependent} ++ (compile 'foo) @result{} FOO ++ (compiled-function-p #'foo) @result{} @i{true} ++ (setf (symbol-function 'foo) ++ (compile nil '(lambda () "replaced"))) @result{} # ++ (foo) @result{} "replaced" ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*error-output*}, ++ ++@b{*macroexpand-hook*}. ++ ++The presence of macro definitions and proclamations. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if the @i{lexical environment} surrounding the ++@i{function} to be compiled contains any @i{bindings} other than those for ++@i{macros}, @i{symbol macros}, or @i{declarations}. ++ ++For information about errors detected during the compilation process, ++see @ref{Exceptional Situations in the Compiler}. ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++ ++@node eval, eval-when, compile, Evaluation and Compilation Dictionary ++@subsection eval [Function] ++ ++@code{eval} @i{form} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} @i{yielded} by the @i{evaluation} of @i{form}. ++ ++@subsubheading Description:: ++ ++Evaluates @i{form} in the current @i{dynamic environment} ++and the @i{null lexical environment}. ++ ++@b{eval} is a user interface to the evaluator. ++ ++The evaluator expands macro calls as if through the use of @b{macroexpand-1}. ++ ++Constants appearing in code ++processed by @b{eval} are ++not copied nor coalesced. The code resulting from the execution of ++@b{eval} ++references @i{objects} ++that are @b{eql} to the corresponding @i{objects} in ++the source code. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq form '(1+ a) a 999) @result{} 999 ++ (eval form) @result{} 1000 ++ (eval 'form) @result{} (1+ A) ++ (let ((a '(this would break if eval used local value))) (eval form)) ++@result{} 1000 ++@end example ++ ++@subsubheading See Also:: ++ ++@b{macroexpand-1}, ++@ref{The Evaluation Model} ++ ++@subsubheading Notes:: ++ ++To obtain the current dynamic value of a @i{symbol}, ++use of @b{symbol-value} is equivalent (and usually preferable) ++to use of @b{eval}. ++ ++Note that an @b{eval} @i{form} involves two levels of @i{evaluation} ++for its @i{argument}. First, @i{form} is @i{evaluated} by the ++normal argument evaluation mechanism as would occur with any @i{call}. ++The @i{object} that results from this normal @i{argument} @i{evaluation} ++becomes the @i{value} of the @i{form} @i{parameter}, and is then ++@i{evaluated} as part of the @b{eval} @i{form}. ++For example: ++ ++@example ++ (eval (list 'cdr (car '((quote (a . b)) c)))) @result{} b ++@end example ++ ++The @i{argument} @i{form} @t{(list 'cdr (car '((quote (a . b)) c)))} is evaluated ++in the usual way to produce the @i{argument} @t{(cdr (quote (a . b)))}; ++@b{eval} then evaluates its @i{argument}, @t{(cdr (quote (a . b)))}, to produce @t{b}. ++Since a single @i{evaluation} already occurs for any @i{argument} @i{form} ++in any @i{function form}, ++@b{eval} is sometimes said to perform ``an extra level of evaluation.'' ++ ++@node eval-when, load-time-value, eval, Evaluation and Compilation Dictionary ++@subsection eval-when [Special Operator] ++ ++@code{eval-when} @i{@r{(}@{@i{situation}@}*@r{)} @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{situation}---One of the @i{symbols} ++ @t{:compile-toplevel} ++@c @IKindex{compile-toplevel} ++, ++ @t{:load-toplevel} ++@c @IKindex{load-toplevel} ++, ++ @t{:execute} ++@c @IKindex{execute} ++, ++ @b{compile} ++@IRindex compile ++, ++ @b{load} ++@IRindex load ++, or ++ @b{eval} ++@IRindex eval ++. ++ ++The use of @b{eval}, @b{compile}, and @b{load} is deprecated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms} if they are executed, ++ or @b{nil} if they are not. ++ ++@subsubheading Description:: ++ ++The body of an @b{eval-when} form is processed as an @i{implicit progn}, ++but only in the @i{situations} listed. ++ ++The use of the @i{situations} @t{:compile-toplevel} (or @t{compile}) and ++@t{:load-toplevel} (or @t{load}) controls whether and when @i{evaluation} ++occurs when @b{eval-when} appears as a @i{top level form} in ++code processed by @b{compile-file}. See @ref{File Compilation}. ++ ++The use of the @i{situation} @t{:execute} (or @t{eval}) controls whether ++evaluation occurs for other @b{eval-when} @i{forms}; that is, ++those that are not @i{top level forms}, or those in code processed by ++@b{eval} or @b{compile}. If the @t{:execute} situation is ++specified in such a @i{form}, then the body @i{forms} are processed as ++an @i{implicit progn}; otherwise, the @b{eval-when} @i{form} ++returns @b{nil}. ++ ++@b{eval-when} ++normally appears as a @i{top level form}, but it is meaningful ++for it to appear as a @i{non-top-level form}. ++However, the compile-time side ++effects described in @ref{Compilation} ++only take place when @b{eval-when} appears as a ++@i{top level form}. ++ ++@subsubheading Examples:: ++ ++One example of the use of @b{eval-when} is that for the ++compiler to be able to read a file properly when it uses user-defined ++@i{reader macros}, it is necessary to write ++ ++@example ++ (eval-when (:compile-toplevel :load-toplevel :execute) ++ (set-macro-character #\$ #'(lambda (stream char) ++ (declare (ignore char)) ++ (list 'dollar (read stream))))) @result{} T ++@end example ++ ++This causes the call to @b{set-macro-character} to be executed ++in the compiler's execution environment, thereby modifying its ++reader syntax table. ++ ++@example ++;;; The EVAL-WHEN in this case is not at toplevel, so only the :EXECUTE ++;;; keyword is considered. At compile time, this has no effect. ++;;; At load time (if the LET is at toplevel), or at execution time ++;;; (if the LET is embedded in some other form which does not execute ++;;; until later) this sets (SYMBOL-FUNCTION 'FOO1) to a function which ++;;; returns 1. ++ (let ((x 1)) ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (setf (symbol-function 'foo1) #'(lambda () x)))) ++ ++;;; If this expression occurs at the toplevel of a file to be compiled, ++;;; it has BOTH a compile time AND a load-time effect of setting ++;;; (SYMBOL-FUNCTION 'FOO2) to a function which returns 2. ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (let ((x 2)) ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (setf (symbol-function 'foo2) #'(lambda () x))))) ++ ++;;; If this expression occurs at the toplevel of a file to be compiled, ++;;; it has BOTH a compile time AND a load-time effect of setting the ++;;; function cell of FOO3 to a function which returns 3. ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (setf (symbol-function 'foo3) #'(lambda () 3))) ++ ++;;; #4: This always does nothing. It simply returns NIL. ++ (eval-when (:compile-toplevel) ++ (eval-when (:compile-toplevel) ++ (print 'foo4))) ++ ++;;; If this form occurs at toplevel of a file to be compiled, FOO5 is ++;;; printed at compile time. If this form occurs in a non-top-level ++;;; position, nothing is printed at compile time. Regardless of context, ++;;; nothing is ever printed at load time or execution time. ++ (eval-when (:compile-toplevel) ++ (eval-when (:execute) ++ (print 'foo5))) ++ ++;;; If this form occurs at toplevel of a file to be compiled, FOO6 is ++;;; printed at compile time. If this form occurs in a non-top-level ++;;; position, nothing is printed at compile time. Regardless of context, ++;;; nothing is ever printed at load time or execution time. ++ (eval-when (:execute :load-toplevel) ++ (eval-when (:compile-toplevel) ++ (print 'foo6))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++, @ref{Compilation} ++ ++@subsubheading Notes:: ++ ++The following effects are logical consequences of the definition of ++@b{eval-when}: ++ ++@table @asis ++ ++@item @t{*} ++Execution of a single @b{eval-when} ++expression executes the body code at most once. ++ ++@item @t{*} ++@i{Macros} intended for use in @i{top level forms} ++should be written so that side-effects are done by the @i{forms} ++in the macro expansion. The macro-expander itself should not do ++the side-effects. ++ ++For example: ++ ++ Wrong: ++ ++@example ++ (defmacro foo () ++ (really-foo) ++ `(really-foo)) ++@end example ++ ++ Right: ++ ++@example ++ (defmacro foo () ++ `(eval-when (:compile-toplevel :execute :load-toplevel) (really-foo))) ++@end example ++ ++Adherence to this convention means that such @i{macros} behave ++intuitively when appearing as @i{non-top-level forms}. ++ ++@item @t{*} ++Placing a variable binding around an @b{eval-when} reliably ++captures the binding because the compile-time-too mode cannot occur ++ (@i{i.e.}, introducing a variable binding means that the @b{eval-when} ++ is not a @i{top level form}). ++For example, ++ ++@example ++ (let ((x 3)) ++ (eval-when (:execute :load-toplevel :compile-toplevel) (print x))) ++@end example ++ ++prints @t{3} ++at execution (@i{i.e.}, load) time, and does not print anything at ++compile time. This is important so that expansions of ++@b{defun} and ++@b{defmacro} ++can be done in terms of @b{eval-when} and can correctly capture ++the @i{lexical environment}. ++ ++@example ++ (defun bar (x) (defun foo () (+ x 3))) ++@end example ++ ++might expand into ++ ++@example ++ (defun bar (x) ++ (progn (eval-when (:compile-toplevel) ++ (compiler::notice-function-definition 'foo '(x))) ++ (eval-when (:execute :load-toplevel) ++ (setf (symbol-function 'foo) #'(lambda () (+ x 3)))))) ++@end example ++ ++which would be treated by the above rules the same as ++ ++@example ++ (defun bar (x) ++ (setf (symbol-function 'foo) #'(lambda () (+ x 3)))) ++@end example ++ ++when the definition of @t{bar} is not a @i{top level form}. ++@end table ++ ++@node load-time-value, quote, eval-when, Evaluation and Compilation Dictionary ++@subsection load-time-value [Special Operator] ++ ++@code{load-time-value} @i{form @r{&optional} read-only-p} @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}; evaluated as described below. ++ ++@i{read-only-p}---a @i{boolean}; not evaluated. ++ ++@i{object}---the @i{primary value} resulting from evaluating @i{form}. ++ ++@subsubheading Description:: ++ ++@b{load-time-value} provides a mechanism for delaying evaluation of @i{form} ++until the expression is in the run-time environment; see @ref{Compilation}. ++ ++@i{Read-only-p} designates whether the result can be considered a ++@i{constant object}. ++If @b{t}, ++ the result is a read-only quantity that can, ++ if appropriate to the @i{implementation}, ++ be copied into read-only space and/or @i{coalesced} with @i{similar} ++ @i{constant objects} from other @i{programs}. ++If @b{nil} (the default), ++ the result must be neither copied nor coalesced; ++ it must be considered to be potentially modifiable data. ++ ++If a @b{load-time-value} expression is processed by @b{compile-file}, ++the compiler performs its normal semantic processing (such as macro expansion ++and translation into machine code) on @i{form}, but arranges for the ++execution of @i{form} to occur at load time in a @i{null lexical environment}, ++with the result of this @i{evaluation} then being treated as ++a @i{literal object} ++at run time. It is guaranteed that the evaluation of @i{form} ++will take place only once when the @i{file} is @i{loaded}, but ++the order of evaluation with respect to the evaluation of ++@i{top level forms} in the file is @i{implementation-dependent}. ++ ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++If a @b{load-time-value} expression appears within a function compiled ++with @b{compile}, the @i{form} is evaluated at compile time in a ++@i{null lexical environment}. The result of this compile-time evaluation ++is treated as ++a @i{literal object} ++in the compiled code. ++ ++If a @b{load-time-value} expression is processed by @b{eval}, ++@i{form} is evaluated in a @i{null lexical environment}, ++and one value is returned. Implementations that implicitly compile ++(or partially compile) expressions processed by @b{eval} ++might evaluate @i{form} only once, at the time this compilation is performed. ++ ++If the @i{same} @i{list} @t{(load-time-value @i{form})} is ++evaluated or compiled more than once, it is @i{implementation-dependent} ++whether @i{form} is evaluated only once or is evaluated more than once. ++This can happen both when an expression being evaluated or compiled shares ++substructure, and when the @i{same} @i{form} is processed by @b{eval} or ++@b{compile} multiple times. ++Since a @b{load-time-value} expression can be ++ referenced in more than one place and can be evaluated multiple times ++ by @b{eval}, it is ++@i{implementation-dependent} whether each execution returns ++ a fresh @i{object} ++or returns the same @i{object} as some other execution. ++ Users must use caution when destructively modifying the resulting ++ @i{object}. ++ ++If two lists @t{(load-time-value @i{form})} ++that are the @i{same} under @b{equal} but are not @i{identical} ++are evaluated or compiled, ++their values always come from distinct evaluations of @i{form}. ++Their @i{values} may not be coalesced ++unless @i{read-only-p} is @b{t}. ++ ++@subsubheading Examples:: ++ ++@example ++;;; The function INCR1 always returns the same value, even in different images. ++;;; The function INCR2 always returns the same value in a given image, ++;;; but the value it returns might vary from image to image. ++(defun incr1 (x) (+ x #.(random 17))) ++(defun incr2 (x) (+ x (load-time-value (random 17)))) ++ ++;;; The function FOO1-REF references the nth element of the first of ++;;; the *FOO-ARRAYS* that is available at load time. It is permissible for ++;;; that array to be modified (e.g., by SET-FOO1-REF); FOO1-REF will see the ++;;; updated values. ++(defvar *foo-arrays* (list (make-array 7) (make-array 8))) ++(defun foo1-ref (n) (aref (load-time-value (first *my-arrays*) nil) n)) ++(defun set-foo1-ref (n val) ++ (setf (aref (load-time-value (first *my-arrays*) nil) n) val)) ++ ++;;; The function BAR1-REF references the nth element of the first of ++;;; the *BAR-ARRAYS* that is available at load time. The programmer has ++;;; promised that the array will be treated as read-only, so the system ++;;; can copy or coalesce the array. ++(defvar *bar-arrays* (list (make-array 7) (make-array 8))) ++(defun bar1-ref (n) (aref (load-time-value (first *my-arrays*) t) n)) ++ ++;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced ++;;; even though NIL was specified, because the object was already read-only ++;;; when it was written as a literal vector rather than created by a constructor. ++;;; User programs must treat the vector v as read-only. ++(defun baz-ref (n) ++ (let ((v (load-time-value #(A B C) nil))) ++ (values (svref v n) v))) ++ ++;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced ++;;; even though NIL was specified in the outer situation because T was specified ++;;; in the inner situation. User programs must treat the vector v as read-only. ++(defun baz-ref (n) ++ (let ((v (load-time-value (load-time-value (vector 1 2 3) t) nil))) ++ (values (svref v n) v))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++, ++@ref{compile} ++, ++@ref{eval} ++, ++@ref{Minimal Compilation}, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++ ++@b{load-time-value} must appear outside of quoted structure in a ++``for @i{evaluation}'' position. In situations which would appear to call ++for use of @b{load-time-value} within a quoted structure, ++the @i{backquote} @i{reader macro} is probably called for; ++see @ref{Backquote}. ++ ++Specifying @b{nil} for @i{read-only-p} is not a way to force an object ++to become modifiable if it has already been made read-only. It is only a way ++to say that, for an object that is modifiable, this operation is not intended ++to make that object read-only. ++ ++@node quote, compiler-macro-function, load-time-value, Evaluation and Compilation Dictionary ++@subsection quote [Special Operator] ++ ++@code{quote} @i{object} @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}; not evaluated. ++ ++@subsubheading Description:: ++ ++The @b{quote} @i{special operator} just returns @i{object}. ++ ++The consequences are undefined if @i{literal objects} (including ++@i{quoted objects}) are destructively modified. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a 1) @result{} 1 ++ (quote (setq a 3)) @result{} (SETQ A 3) ++ a @result{} 1 ++ 'a @result{} A ++ ''a @result{} (QUOTE A) ++ '''a @result{} (QUOTE (QUOTE A)) ++ (setq a 43) @result{} 43 ++ (list a (cons a 3)) @result{} (43 (43 . 3)) ++ (list (quote a) (quote (cons a 3))) @result{} (A (CONS A 3)) ++ 1 @result{} 1 ++ '1 @result{} 1 ++ "foo" @result{} "foo" ++ '"foo" @result{} "foo" ++ (car '(a b)) @result{} A ++ '(car '(a b)) @result{} (CAR (QUOTE (A B))) ++ #(car '(a b)) @result{} #(CAR (QUOTE (A B))) ++ '#(car '(a b)) @result{} #(CAR (QUOTE (A B))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Evaluation}, ++@ref{Single-Quote}, ++ ++@ref{Compiler Terminology} ++ ++@subsubheading Notes:: ++ ++The textual notation @t{'@i{object}} is equivalent to @t{(quote @i{object})}; ++see @ref{Compiler Terminology}. ++ ++Some @i{objects}, called @i{self-evaluating objects}, ++do not require quotation by @b{quote}. ++However, @i{symbols} and @i{lists} are used to represent parts of programs, ++and so would not be useable as constant data in a program without @b{quote}. ++Since @b{quote} suppresses the @i{evaluation} of these @i{objects}, ++they become data rather than program. ++ ++@node compiler-macro-function, define-compiler-macro, quote, Evaluation and Compilation Dictionary ++@subsection compiler-macro-function [Accessor] ++ ++@code{compiler-macro-function} @i{name @r{&optional} environment} @result{} @i{function} ++ ++(setf (@code{ compiler-macro-function} @i{name @r{&optional} environment}) new-function)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{function name}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ ++@i{function}, @i{new-function}---a @i{compiler macro function}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++@i{Accesses} the @i{compiler macro function} named @i{name}, if any, ++in the @i{environment}. ++ ++A value of @b{nil} denotes the absence of a @i{compiler macro function} named @i{name}. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if @i{environment} is @i{non-nil} ++in a use of @b{setf} of @b{compiler-macro-function}. ++ ++@subsubheading See Also:: ++ ++@ref{define-compiler-macro} ++, @ref{Compiler Macros} ++ ++@node define-compiler-macro, defmacro, compiler-macro-function, Evaluation and Compilation Dictionary ++@subsection define-compiler-macro [Macro] ++ ++@code{define-compiler-macro} @i{name lambda-list [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*}@* ++ @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{function name}. ++ ++@i{lambda-list}---a @i{macro lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++[Editorial Note by KMP: This definition probably needs to be fully expanded to not ++ refer through the definition of defmacro, but should suffice for now.] ++ ++This is the normal mechanism for defining a @i{compiler macro function}. ++Its manner of definition is the same as for @b{defmacro}; the only ++differences are: ++ ++@table @asis ++ ++@item @t{*} ++The @i{name} can be a @i{function name} naming ++ any @i{function} or @i{macro}. ++ ++@item @t{*} ++The expander function is installed as a @i{compiler macro function} ++ for the @i{name}, rather than as a @i{macro function}. ++ ++@item @t{*} ++The @b{&whole} argument is bound to the form argument that ++ is passed to the @i{compiler macro function}. The remaining lambda-list ++ parameters are specified as if this form contained the function name in the ++ @i{car} and the actual arguments in the @i{cdr}, but if the @i{car} ++ of the actual form is the symbol @b{funcall}, then the destructuring of ++ the arguments is actually performed using its @i{cddr} instead. ++ ++@item @t{*} ++ ++ @i{Documentation} is attached as a @i{documentation string} ++ to @i{name} (as kind @b{compiler-macro}) ++and to the @i{compiler macro function}. ++ ++@item @t{*} ++Unlike an ordinary @i{macro}, a @i{compiler macro} ++ can decline to provide an expansion merely by returning a form that is ++ the @i{same} as the original (which can be obtained by using ++ @b{&whole}). ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (defun square (x) (expt x 2)) @result{} SQUARE ++ (define-compiler-macro square (&whole form arg) ++ (if (atom arg) ++ `(expt ,arg 2) ++ (case (car arg) ++ (square (if (= (length arg) 2) ++ `(expt ,(nth 1 arg) 4) ++ form)) ++ (expt (if (= (length arg) 3) ++ (if (numberp (nth 2 arg)) ++ `(expt ,(nth 1 arg) ,(* 2 (nth 2 arg))) ++ `(expt ,(nth 1 arg) (* 2 ,(nth 2 arg)))) ++ form)) ++ (otherwise `(expt ,arg 2))))) @result{} SQUARE ++ (square (square 3)) @result{} 81 ++ (macroexpand '(square x)) @result{} (SQUARE X), @i{false} ++ (funcall (compiler-macro-function 'square) '(square x) nil) ++@result{} (EXPT X 2) ++ (funcall (compiler-macro-function 'square) '(square (square x)) nil) ++@result{} (EXPT X 4) ++ (funcall (compiler-macro-function 'square) '(funcall #'square x) nil) ++@result{} (EXPT X 2) ++ ++ (defun distance-positional (x1 y1 x2 y2) ++ (sqrt (+ (expt (- x2 x1) 2) (expt (- y2 y1) 2)))) ++@result{} DISTANCE-POSITIONAL ++ (defun distance (&key (x1 0) (y1 0) (x2 x1) (y2 y1)) ++ (distance-positional x1 y1 x2 y2)) ++@result{} DISTANCE ++ (define-compiler-macro distance (&whole form ++ &rest key-value-pairs ++ &key (x1 0 x1-p) ++ (y1 0 y1-p) ++ (x2 x1 x2-p) ++ (y2 y1 y2-p) ++ &allow-other-keys ++ &environment env) ++ (flet ((key (n) (nth (* n 2) key-value-pairs)) ++ (arg (n) (nth (1+ (* n 2)) key-value-pairs)) ++ (simplep (x) ++ (let ((expanded-x (macroexpand x env))) ++ (or (constantp expanded-x env) ++ (symbolp expanded-x))))) ++ (let ((n (/ (length key-value-pairs) 2))) ++ (multiple-value-bind (x1s y1s x2s y2s others) ++ (loop for (key) on key-value-pairs by #'cddr ++ count (eq key ':x1) into x1s ++ count (eq key ':y1) into y1s ++ count (eq key ':x2) into x2s ++ count (eq key ':y1) into y2s ++ count (not (member key '(:x1 :x2 :y1 :y2))) ++ into others ++ finally (return (values x1s y1s x2s y2s others))) ++ (cond ((and (= n 4) ++ (eq (key 0) :x1) ++ (eq (key 1) :y1) ++ (eq (key 2) :x2) ++ (eq (key 3) :y2)) ++ `(distance-positional ,x1 ,y1 ,x2 ,y2)) ++ ((and (if x1-p (and (= x1s 1) (simplep x1)) t) ++ (if y1-p (and (= y1s 1) (simplep y1)) t) ++ (if x2-p (and (= x2s 1) (simplep x2)) t) ++ (if y2-p (and (= y2s 1) (simplep y2)) t) ++ (zerop others)) ++ `(distance-positional ,x1 ,y1 ,x2 ,y2)) ++ ((and (< x1s 2) (< y1s 2) (< x2s 2) (< y2s 2) ++ (zerop others)) ++ (let ((temps (loop repeat n collect (gensym)))) ++ `(let ,(loop for i below n ++ collect (list (nth i temps) (arg i))) ++ (distance ++ ,@@(loop for i below n ++ append (list (key i) (nth i temps))))))) ++ (t form)))))) ++@result{} DISTANCE ++ (dolist (form ++ '((distance :x1 (setq x 7) :x2 (decf x) :y1 (decf x) :y2 (decf x)) ++ (distance :x1 (setq x 7) :y1 (decf x) :x2 (decf x) :y2 (decf x)) ++ (distance :x1 (setq x 7) :y1 (incf x)) ++ (distance :x1 (setq x 7) :y1 (incf x) :x1 (incf x)) ++ (distance :x1 a1 :y1 b1 :x2 a2 :y2 b2) ++ (distance :x1 a1 :x2 a2 :y1 b1 :y2 b2) ++ (distance :x1 a1 :y1 b1 :z1 c1 :x2 a2 :y2 b2 :z2 c2))) ++ (print (funcall (compiler-macro-function 'distance) form nil))) ++@t{ |> } (LET ((#:G6558 (SETQ X 7)) ++@t{ |> } (#:G6559 (DECF X)) ++@t{ |> } (#:G6560 (DECF X)) ++@t{ |> } (#:G6561 (DECF X))) ++@t{ |> } (DISTANCE :X1 #:G6558 :X2 #:G6559 :Y1 #:G6560 :Y2 #:G6561)) ++@t{ |> } (DISTANCE-POSITIONAL (SETQ X 7) (DECF X) (DECF X) (DECF X)) ++@t{ |> } (LET ((#:G6567 (SETQ X 7)) ++@t{ |> } (#:G6568 (INCF X))) ++@t{ |> } (DISTANCE :X1 #:G6567 :Y1 #:G6568)) ++@t{ |> } (DISTANCE :X1 (SETQ X 7) :Y1 (INCF X) :X1 (INCF X)) ++@t{ |> } (DISTANCE-POSITIONAL A1 B1 A2 B2) ++@t{ |> } (DISTANCE-POSITIONAL A1 B1 A2 B2) ++@t{ |> } (DISTANCE :X1 A1 :Y1 B1 :Z1 C1 :X2 A2 :Y2 B2 :Z2 C2) ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{compiler-macro-function} ++, ++@ref{defmacro} ++, ++@ref{documentation} ++, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++ ++The consequences of writing a @i{compiler macro} definition for a function ++in the @t{COMMON-LISP} @i{package} are undefined; it is quite possible that in some ++@i{implementations} such an attempt would override an equivalent or equally ++important definition. In general, it is recommended that a programmer only ++write @i{compiler macro} definitions for @i{functions} he or she personally ++maintains--writing a @i{compiler macro} definition for a function maintained ++elsewhere is normally considered a violation of traditional rules of modularity ++and data abstraction. ++ ++@node defmacro, macro-function, define-compiler-macro, Evaluation and Compilation Dictionary ++@subsection defmacro [Macro] ++ ++@code{defmacro} @i{name lambda-list [[@{@i{declaration}@}* | @i{documentation}]] @{@i{form}@}*}@* ++ @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{lambda-list}---a @i{macro lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++Defines @i{name} as a @i{macro} ++by associating a @i{macro function} with that @i{name} ++in the global environment. ++ ++The @i{macro function} is defined in the same @i{lexical environment} ++in which the @b{defmacro} @i{form} appears. ++ ++The parameter variables in @i{lambda-list} are bound to ++destructured portions of the macro call. ++ ++The expansion function ++accepts two arguments, a @i{form} and an ++@i{environment}. The expansion function returns a @i{form}. ++The body of the expansion function is specified by @i{forms}. ++@i{Forms} are executed in order. The value of the ++last @i{form} executed is returned as the expansion of the ++@i{macro}. ++ ++The body @i{forms} of the expansion function (but not the @i{lambda-list}) ++ ++are implicitly enclosed in a @i{block} whose name is @i{name}. ++ ++The @i{lambda-list} conforms to the requirements described in @ref{Macro Lambda Lists}. ++ ++@i{Documentation} is attached as a @i{documentation string} ++ to @i{name} (as kind @b{function}) ++and to the @i{macro function}. ++ ++@b{defmacro} can be used to redefine a @i{macro} or to replace ++a @i{function} definition with a @i{macro} definition. ++ ++Recursive expansion of the @i{form} returned must terminate, ++including the expansion of other @i{macros} which are @i{subforms} ++of other @i{forms} returned. ++ ++The consequences are undefined if the result of fully macroexpanding ++a @i{form} ++contains any @i{circular} @i{list structure} except in @i{literal objects}. ++ ++If a @b{defmacro} @i{form} appears as a @i{top level form}, ++the @i{compiler} must store the @i{macro} definition at compile time, ++so that occurrences of the macro later on in the file can be expanded correctly. ++Users must ensure that the body of the @i{macro} can be evaluated at ++compile time if it is referenced within the @i{file} being @i{compiled}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defmacro mac1 (a b) "Mac1 multiplies and adds" ++ `(+ ,a (* ,b 3))) @result{} MAC1 ++ (mac1 4 5) @result{} 19 ++ (documentation 'mac1 'function) @result{} "Mac1 multiplies and adds" ++ (defmacro mac2 (&optional (a 2 b) (c 3 d) &rest x) `'(,a ,b ,c ,d ,x)) @result{} MAC2 ++ (mac2 6) @result{} (6 T 3 NIL NIL) ++ (mac2 6 3 8) @result{} (6 T 3 T (8)) ++ (defmacro mac3 (&whole r a &optional (b 3) &rest x &key c (d a)) ++ `'(,r ,a ,b ,c ,d ,x)) @result{} MAC3 ++ (mac3 1 6 :d 8 :c 9 :d 10) @result{} ((MAC3 1 6 :D 8 :C 9 :D 10) 1 6 9 8 (:D 8 :C 9 :D 10)) ++@end example ++ ++The stipulation that ++an embedded @i{destructuring lambda list} is permitted only ++where @i{ordinary lambda list} syntax would permit a parameter name ++but not a @i{list} is made to prevent ambiguity. For example, ++the following is not valid: ++ ++@example ++ (defmacro loser (x &optional (a b &rest c) &rest z) ++ ...) ++@end example ++ ++because @i{ordinary lambda list} syntax does permit a ++@i{list} following @t{&optional}; ++the list @t{(a b &rest c)} would be interpreted as describing an ++optional parameter named @t{a} whose default value is that of the ++form @t{b}, with a supplied-p parameter named @b{&rest} (not valid), ++and an extraneous symbol @t{c} in the list (also not valid). An almost ++correct way to express this is ++ ++@example ++ (defmacro loser (x &optional ((a b &rest c)) &rest z) ++ ...) ++@end example ++ ++The extra set of parentheses removes the ambiguity. However, the ++definition is now incorrect because a macro call such as @t{(loser (car pool))} ++would not provide any argument form for the lambda list @t{(a b &rest c)}, ++and so the default value against which to match the @i{lambda list} would be ++@b{nil} because no explicit default value was specified. ++The consequences of this are unspecified ++since the empty list, @b{nil}, does not have @i{forms} to satisfy the ++parameters @t{a} and @t{b}. The fully correct definition would be either ++ ++@example ++ (defmacro loser (x &optional ((a b &rest c) '(nil nil)) &rest z) ++ ...) ++@end example ++ ++or ++ ++@example ++ (defmacro loser (x &optional ((&optional a b &rest c)) &rest z) ++ ...) ++@end example ++ ++These differ slightly: the first requires that if the macro call ++specifies @t{a} explicitly then it must also specify @t{b} explicitly, ++whereas the second does not have this requirement. For example, ++ ++@example ++ (loser (car pool) ((+ x 1))) ++@end example ++ ++would be a valid call for the second definition but not for the first. ++ ++@example ++ (defmacro dm1a (&whole x) `',x) ++ (macroexpand '(dm1a)) @result{} (QUOTE (DM1A)) ++ (macroexpand '(dm1a a)) is an error. ++ ++ (defmacro dm1b (&whole x a &optional b) `'(,x ,a ,b)) ++ (macroexpand '(dm1b)) is an error. ++ (macroexpand '(dm1b q)) @result{} (QUOTE ((DM1B Q) Q NIL)) ++ (macroexpand '(dm1b q r)) @result{} (QUOTE ((DM1B Q R) Q R)) ++ (macroexpand '(dm1b q r s)) is an error. ++@end example ++ ++@example ++ (defmacro dm2a (&whole form a b) `'(form ,form a ,a b ,b)) ++ (macroexpand '(dm2a x y)) @result{} (QUOTE (FORM (DM2A X Y) A X B Y)) ++ (dm2a x y) @result{} (FORM (DM2A X Y) A X B Y) ++ ++ (defmacro dm2b (&whole form a (&whole b (c . d) &optional (e 5)) ++ &body f &environment env) ++ ``(,',form ,,a ,',b ,',(macroexpand c env) ,',d ,',e ,',f)) ++ ;Note that because backquote is involved, implementations may differ ++ ;slightly in the nature (though not the functionality) of the expansion. ++ (macroexpand '(dm2b x1 (((incf x2) x3 x4)) x5 x6)) ++ @result{} (LIST* '(DM2B X1 (((INCF X2) X3 X4)) ++ X5 X6) ++ X1 ++ '((((INCF X2) X3 X4)) (SETQ X2 (+ X2 1)) (X3 X4) 5 (X5 X6))), ++ T ++ (let ((x1 5)) ++ (macrolet ((segundo (x) `(cadr ,x))) ++ (dm2b x1 (((segundo x2) x3 x4)) x5 x6))) ++ @result{} ((DM2B X1 (((SEGUNDO X2) X3 X4)) X5 X6) ++ 5 (((SEGUNDO X2) X3 X4)) (CADR X2) (X3 X4) 5 (X5 X6)) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{define-compiler-macro} ++, ++ ++@ref{destructuring-bind} ++, ++@ref{documentation} ++, ++@ref{macroexpand} ++, ++@b{*macroexpand-hook*}, ++@b{macrolet}, ++@ref{macro-function} ++, ++@ref{Evaluation}, ++@ref{Compilation}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@node macro-function, macroexpand, defmacro, Evaluation and Compilation Dictionary ++@subsection macro-function [Accessor] ++ ++@code{macro-function} @i{symbol @r{&optional} environment} @result{} @i{function} ++ ++(setf (@code{ macro-function} @i{symbol @r{&optional} environment}) new-function)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ ++@i{function}---a @i{macro function} or @b{nil}. ++ ++@i{new-function}---a @i{macro function}. ++ ++@subsubheading Description:: ++ ++Determines whether @i{symbol} has a function definition ++as a macro in the specified @i{environment}. ++ ++If so, the macro expansion function, a function of two arguments, ++is returned. If @i{symbol} has no function definition ++in the lexical environment @i{environment}, or its definition ++is not a @i{macro}, @b{macro-function} returns @b{nil}. ++ ++It is possible for both @b{macro-function} and ++ ++@b{special-operator-p} ++ ++to return @i{true} of @i{symbol}. The @i{macro} definition must ++be available for use by programs that understand only the standard ++@r{Common Lisp} @i{special forms}. ++ ++@subsubheading Examples:: ++@example ++ (defmacro macfun (x) '(macro-function 'macfun)) @result{} MACFUN ++ (not (macro-function 'macfun)) @result{} @i{false} ++@end example ++ ++@example ++ (macrolet ((foo (&environment env) ++ (if (macro-function 'bar env) ++ ''yes ++ ''no))) ++ (list (foo) ++ (macrolet ((bar () :beep)) ++ (foo)))) ++ ++@result{} (NO YES) ++@end example ++ ++@subsubheading Affected By:: ++@t{(setf macro-function)}, @b{defmacro}, and @b{macrolet}. ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if @i{environment} is @i{non-nil} ++in a use of @b{setf} of @b{macro-function}. ++ ++@subsubheading See Also:: ++ ++@ref{defmacro} ++, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++@b{setf} can be used with @b{macro-function} to install ++a @i{macro} as a symbol's global function definition: ++ ++@example ++ (setf (macro-function symbol) fn) ++@end example ++ ++The value installed must be a @i{function} that accepts two arguments, ++the entire macro call and an @i{environment}, ++and computes the expansion for that call. ++Performing this operation causes @i{symbol} to have only that ++macro definition as its global function definition; any previous ++definition, whether as a @i{macro} or as a ++@i{function}, is lost. ++ ++@node macroexpand, define-symbol-macro, macro-function, Evaluation and Compilation Dictionary ++@subsection macroexpand, macroexpand-1 [Function] ++ ++@code{macroexpand} @i{form @r{&optional} env} @result{} @i{expansion, expanded-p} ++ ++@code{macroexpand-} @i{1} @result{} @i{form @r{&optional} env} ++ @r{expansion, expanded-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}. ++ ++@i{env}---an @i{environment} @i{object}. ++ The default is @b{nil}. ++ ++@i{expansion}---a @i{form}. ++ ++@i{expanded-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{macroexpand} and @b{macroexpand-1} expand @i{macros}. ++ ++If @i{form} is a @i{macro form}, ++then @b{macroexpand-1} expands the @i{macro form} call once. ++ ++@b{macroexpand} ++repeatedly expands @i{form} until it is no longer a @i{macro form}. ++In effect, @b{macroexpand} calls @b{macroexpand-1} repeatedly ++until the @i{secondary value} it returns is @b{nil}. ++ ++If @i{form} is a @i{macro form}, ++then the @i{expansion} is a @i{macro expansion} ++ and @i{expanded-p} is @i{true}. ++Otherwise, ++ the @i{expansion} is the given @i{form} ++ and @i{expanded-p} is @i{false}. ++ ++Macro expansion is carried out as follows. ++Once @b{macroexpand-1} has ++determined that the @i{form} is a @i{macro form}, ++it obtains an appropriate expansion @i{function} for the ++@i{macro} or @i{symbol macro}. ++The value of ++@b{*macroexpand-hook*} is ++ ++coerced to a @i{function} and ++ ++then called as a @i{function} of three arguments: ++ the expansion @i{function}, ++ the @i{form}, ++ and the @i{env}. ++The @i{value} returned from this call is taken to be the expansion ++of the @i{form}. ++ ++In addition to @i{macro} definitions in the global environment, ++any local macro definitions established within @i{env} by @b{macrolet} ++or @b{symbol-macrolet} are considered. ++If only @i{form} is supplied as an argument, ++then the environment is effectively null, and only global macro definitions ++as established by @b{defmacro} are considered. ++@i{Macro} definitions are shadowed by local @i{function} definitions. ++ ++@subsubheading Examples:: ++ ++@example ++ (defmacro alpha (x y) `(beta ,x ,y)) @result{} ALPHA ++ (defmacro beta (x y) `(gamma ,x ,y)) @result{} BETA ++ (defmacro delta (x y) `(gamma ,x ,y)) @result{} EPSILON ++ (defmacro expand (form &environment env) ++ (multiple-value-bind (expansion expanded-p) ++ (macroexpand form env) ++ `(values ',expansion ',expanded-p))) @result{} EXPAND ++ (defmacro expand-1 (form &environment env) ++ (multiple-value-bind (expansion expanded-p) ++ (macroexpand-1 form env) ++ `(values ',expansion ',expanded-p))) @result{} EXPAND-1 ++ ++;; Simple examples involving just the global environment ++ (macroexpand-1 '(alpha a b)) @result{} (BETA A B), @i{true} ++ (expand-1 (alpha a b)) @result{} (BETA A B), @i{true} ++ (macroexpand '(alpha a b)) @result{} (GAMMA A B), @i{true} ++ (expand (alpha a b)) @result{} (GAMMA A B), @i{true} ++ (macroexpand-1 'not-a-macro) @result{} NOT-A-MACRO, @i{false} ++ (expand-1 not-a-macro) @result{} NOT-A-MACRO, @i{false} ++ (macroexpand '(not-a-macro a b)) @result{} (NOT-A-MACRO A B), @i{false} ++ (expand (not-a-macro a b)) @result{} (NOT-A-MACRO A B), @i{false} ++ ++;; Examples involving lexical environments ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (macroexpand-1 '(alpha a b))) @result{} (BETA A B), @i{true} ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (expand-1 (alpha a b))) @result{} (DELTA A B), @i{true} ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (macroexpand '(alpha a b))) @result{} (GAMMA A B), @i{true} ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (expand (alpha a b))) @result{} (GAMMA A B), @i{true} ++ (macrolet ((beta (x y) `(epsilon ,x ,y))) ++ (expand (alpha a b))) @result{} (EPSILON A B), @i{true} ++ (let ((x (list 1 2 3))) ++ (symbol-macrolet ((a (first x))) ++ (expand a))) @result{} (FIRST X), @i{true} ++ (let ((x (list 1 2 3))) ++ (symbol-macrolet ((a (first x))) ++ (macroexpand 'a))) @result{} A, @i{false} ++ (symbol-macrolet ((b (alpha x y))) ++ (expand-1 b)) @result{} (ALPHA X Y), @i{true} ++ (symbol-macrolet ((b (alpha x y))) ++ (expand b)) @result{} (GAMMA X Y), @i{true} ++ (symbol-macrolet ((b (alpha x y)) ++ (a b)) ++ (expand-1 a)) @result{} B, @i{true} ++ (symbol-macrolet ((b (alpha x y)) ++ (a b)) ++ (expand a)) @result{} (GAMMA X Y), @i{true} ++ ++;; Examples of shadowing behavior ++ (flet ((beta (x y) (+ x y))) ++ (expand (alpha a b))) @result{} (BETA A B), @i{true} ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (flet ((alpha (x y) (+ x y))) ++ (expand (alpha a b)))) @result{} (ALPHA A B), @i{false} ++ (let ((x (list 1 2 3))) ++ (symbol-macrolet ((a (first x))) ++ (let ((a x)) ++ (expand a)))) @result{} A, @i{false} ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{defmacro}, ++@b{setf} of @b{macro-function}, ++@b{macrolet}, ++@b{symbol-macrolet} ++ ++@subsubheading See Also:: ++ ++@b{*macroexpand-hook*}, ++@ref{defmacro} ++, ++@ref{setf} ++ of ++@ref{macro-function} ++, ++@b{macrolet}, ++@ref{symbol-macrolet} ++, ++@ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++Neither @b{macroexpand} nor @b{macroexpand-1} ++makes any explicit attempt to expand @i{macro forms} that are ++either @i{subforms} of the @i{form} ++ or @i{subforms} of the @i{expansion}. ++Such expansion might occur implicitly, however, ++due to the semantics or implementation of the @i{macro function}. ++ ++@node define-symbol-macro, symbol-macrolet, macroexpand, Evaluation and Compilation Dictionary ++@subsection define-symbol-macro [Macro] ++ ++@code{define-symbol-macro} @i{symbol expansion}@* ++ @result{} @i{symbol} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{expansion}---a @i{form}. ++ ++@subsubheading Description:: ++ ++Provides a mechanism for globally affecting the @i{macro expansion} ++of the indicated @i{symbol}. ++ ++Globally establishes an expansion function for the @i{symbol macro} ++named by @i{symbol}. ++The only guaranteed property of an expansion @i{function} for a @i{symbol macro} ++is that when it is applied to the @i{form} and the @i{environment} it returns ++the correct expansion. (In particular, it is @i{implementation-dependent} ++whether the expansion is conceptually stored in the expansion function, ++the @i{environment}, or both.) ++ ++Each global reference to @i{symbol} (@i{i.e.}, not @i{shadowed}_2 by a ++@i{binding} for a @i{variable} or @i{symbol macro} named by ++the same @i{symbol}) is expanded by the normal macro expansion process; ++see @ref{Symbols as Forms}. ++The expansion of a @i{symbol macro} is subject to further @i{macro expansion} ++in the same @i{lexical environment} as the @i{symbol macro} reference, ++exactly analogous to normal @i{macros}. ++ ++The consequences are unspecified if a @b{special} declaration is made for ++@i{symbol} while in the scope of this definition (@i{i.e.}, when it is not ++@i{shadowed}_2 by a @i{binding} for a @i{variable} ++or @i{symbol macro} named by the same @i{symbol}). ++ ++Any use of @b{setq} to set the value of ++the @i{symbol} ++ while in the scope of this definition ++ is treated as if it were a @b{setf}. ++@b{psetq} of @i{symbol} ++ is treated as if it were a @b{psetf}, and ++@b{multiple-value-setq} ++ is treated as if it were a @b{setf} of @b{values}. ++ ++A @i{binding} for a @i{symbol macro} can be @i{shadowed}_2 ++by @b{let} or @b{symbol-macrolet}. ++ ++@subsubheading Examples:: ++ ++@example ++(defvar *things* (list 'alpha 'beta 'gamma)) @result{} *THINGS* ++ ++(define-symbol-macro thing1 (first *things*)) @result{} THING1 ++(define-symbol-macro thing2 (second *things*)) @result{} THING2 ++(define-symbol-macro thing3 (third *things*)) @result{} THING3 ++ ++thing1 @result{} ALPHA ++(setq thing1 'ONE) @result{} ONE ++*things* @result{} (ONE BETA GAMMA) ++(multiple-value-setq (thing2 thing3) (values 'two 'three)) @result{} TWO ++thing3 @result{} THREE ++*things* @result{} (ONE TWO THREE) ++ ++(list thing2 (let ((thing2 2)) thing2)) @result{} (TWO 2) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{symbol} is already defined as a @i{global variable}, ++an error of @i{type} @b{program-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{symbol-macrolet} ++, ++@ref{macroexpand} ++ ++@node symbol-macrolet, *macroexpand-hook*, define-symbol-macro, Evaluation and Compilation Dictionary ++@subsection symbol-macrolet [Special Operator] ++ ++@code{symbol-macrolet} @i{@r{(}@{@r{(}symbol expansion @r{)}@}*@r{)} ++ @{@i{declaration}@}* ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{expansion}---a @i{form}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{symbol-macrolet} provides a mechanism for ++affecting the @i{macro expansion} environment for @i{symbols}. ++ ++@b{symbol-macrolet} lexically establishes expansion functions ++for each of the @i{symbol macros} named by @i{symbols}. ++ ++The only guaranteed property of an expansion @i{function} for a @i{symbol macro} ++is that when it is applied to the @i{form} and the @i{environment} it returns ++the correct expansion. (In particular, it is @i{implementation-dependent} ++whether the expansion is conceptually stored in the expansion function, ++the @i{environment}, or both.) ++ ++Each reference to @i{symbol} as a variable within the lexical @i{scope} ++of @b{symbol-macrolet} is expanded by the normal macro expansion process; ++see @ref{Symbols as Forms}. ++The expansion of a symbol macro is subject to further macro expansion ++in the same lexical environment as the symbol macro invocation, exactly ++analogous to normal @i{macros}. ++ ++Exactly the same @i{declarations} are allowed as for @b{let} ++with one exception: @b{symbol-macrolet} signals an error ++if a @b{special} declaration names one of the @i{symbols} ++being defined by @b{symbol-macrolet}. ++ ++When the @i{forms} of the @b{symbol-macrolet} form are expanded, ++any use of @b{setq} to set the value of one of the specified variables ++ is treated as if it were a @b{setf}. ++@b{psetq} of a @i{symbol} defined as a symbol macro ++ is treated as if it were a @b{psetf}, and ++@b{multiple-value-setq} ++ is treated as if it were a @b{setf} of @b{values}. ++ ++The use of @b{symbol-macrolet} can be shadowed by @b{let}. ++In other words, @b{symbol-macrolet} only substitutes for occurrences ++of @i{symbol} that would be in the @i{scope} of a lexical binding of ++@i{symbol} surrounding the @i{forms}. ++ ++@subsubheading Examples:: ++ ++@example ++;;; The following is equivalent to ++;;; (list 'foo (let ((x 'bar)) x)), ++;;; not ++;;; (list 'foo (let (('foo 'bar)) 'foo)) ++ (symbol-macrolet ((x 'foo)) ++ (list x (let ((x 'bar)) x))) ++@result{} (foo bar) ++@i{NOT}@result{} (foo foo) ++ ++ (symbol-macrolet ((x '(foo x))) ++ (list x)) ++@result{} ((FOO X)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If an attempt is made to bind a @i{symbol} that is defined as a @i{global variable}, ++an error of @i{type} @b{program-error} is signaled. ++ ++If @i{declaration} contains a @b{special} declaration ++that names one of the @i{symbols} being bound by @b{symbol-macrolet}, ++an error of @i{type} @b{program-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{with-slots} ++, ++@ref{macroexpand} ++ ++@subsubheading Notes:: ++ ++The special form @b{symbol-macrolet} is the basic mechanism that is used to ++implement @b{with-slots}. ++ ++If a @b{symbol-macrolet} @i{form} is a @i{top level form}, ++the @i{forms} are also processed as @i{top level forms}. ++See @ref{File Compilation}. ++ ++@node *macroexpand-hook*, proclaim, symbol-macrolet, Evaluation and Compilation Dictionary ++@subsection *macroexpand-hook* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{designator} for a @i{function} of three @i{arguments}: ++ a @i{macro function}, ++ a @i{macro form}, ++ and an @i{environment} @i{object}. ++ ++@subsubheading Initial Value:: ++ ++a @i{designator} for a function that is equivalent to the @i{function} @b{funcall}, ++but that might have additional @i{implementation-dependent} side-effects. ++ ++@subsubheading Description:: ++ ++Used as the expansion interface hook by @b{macroexpand-1} to ++control the @i{macro expansion} process. ++When a @i{macro form} is to be expanded, ++this @i{function} is called with three arguments: ++ the @i{macro function}, ++ the @i{macro form}, ++ and the @i{environment} in which the @i{macro form} is to be expanded. ++ ++The @i{environment} @i{object} has @i{dynamic extent}; ++the consequences are undefined if the @i{environment} @i{object} is ++referred to outside the @i{dynamic extent} of the macro expansion function. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun hook (expander form env) ++ (format t "Now expanding: ~S~ ++ (funcall expander form env)) @result{} HOOK ++ (defmacro machook (x y) `(/ (+ ,x ,y) 2)) @result{} MACHOOK ++ (macroexpand '(machook 1 2)) @result{} (/ (+ 1 2) 2), @i{true} ++ (let ((*macroexpand-hook* #'hook)) (macroexpand '(machook 1 2))) ++@t{ |> } Now expanding (MACHOOK 1 2) ++@result{} (/ (+ 1 2) 2), @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{macroexpand} ++, @b{macroexpand-1}, ++@ref{funcall} ++, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++The net effect of the chosen initial value is to just invoke the ++@i{macro function}, giving it the @i{macro form} and ++@i{environment} as its two arguments. ++ ++Users or user programs can @i{assign} this @i{variable} to ++customize or trace the @i{macro expansion} mechanism. Note, however, ++that this @i{variable} is a global resource, potentially shared by ++multiple @i{programs}; as such, if any two @i{programs} depend for ++their correctness on the setting of this @i{variable}, those ++@i{programs} may not be able to run in the same @i{Lisp image}. ++For this reason, it is frequently best to confine its uses to debugging ++situations. ++ ++Users who put their own function into @b{*macroexpand-hook*} ++should consider saving the previous value of the hook, and calling that ++value from their own. ++ ++@node proclaim, declaim, *macroexpand-hook*, Evaluation and Compilation Dictionary ++@subsection proclaim [Function] ++ ++@code{proclaim} @i{declaration-specifier} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{declaration-specifier}---a @i{declaration specifier}. ++ ++@subsubheading Description:: ++ ++@i{Establishes} the @i{declaration} specified by @i{declaration-specifier} ++in the @i{global environment}. ++ ++Such a @i{declaration}, sometimes called a @i{global declaration} ++or a @i{proclamation}, is always in force unless locally @i{shadowed}. ++ ++@i{Names} of @i{variables} and @i{functions} within ++@i{declaration-specifier} refer to @i{dynamic variables} ++and global @i{function} definitions, respectively. ++ ++Figure 3--22 shows a list of @i{declaration identifiers} ++that can be used with @b{proclaim}. ++ ++@format ++@group ++@noindent ++@w{ declaration inline optimize type } ++@w{ ftype notinline special } ++ ++@noindent ++@w{ Figure 3--22: Global Declaration Specifiers} ++ ++@end group ++@end format ++ ++An implementation is free to support other (@i{implementation-defined}) ++@i{declaration identifiers} as well. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun declare-variable-types-globally (type vars) ++ (proclaim `(type ,type ,@@vars)) ++ type) ++ ++ ;; Once this form is executed, the dynamic variable *TOLERANCE* ++ ;; must always contain a float. ++ (declare-variable-types-globally 'float '(*tolerance*)) ++@result{} FLOAT ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{declaim} ++, ++@b{declare}, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++ ++Although the @i{execution} of a @b{proclaim} @i{form} ++has effects that might affect compilation, the compiler does not make ++any attempt to recognize and specially process @b{proclaim} @i{forms}. ++A @i{proclamation} such as the following, even if a @i{top level form}, ++does not have any effect until it is executed: ++ ++@example ++(proclaim '(special *x*)) ++@end example ++ ++If compile time side effects are desired, @b{eval-when} may be useful. ++For example: ++ ++@example ++ (eval-when (:execute :compile-toplevel :load-toplevel) ++ (proclaim '(special *x*))) ++@end example ++ ++In most such cases, however, it is preferrable to use @b{declaim} for ++this purpose. ++ ++Since @b{proclaim} @i{forms} are ordinary @i{function forms}, ++@i{macro forms} can expand into them. ++ ++@node declaim, declare, proclaim, Evaluation and Compilation Dictionary ++@subsection declaim [Macro] ++ ++@code{declaim} @i{@{@i{declaration-specifier}@}*} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{declaration-specifier}---a @i{declaration specifier}; not evaluated. ++ ++@subsubheading Description:: ++ ++Establishes the @i{declarations} specified by the @i{declaration-specifiers}. ++ ++If a use of this macro appears as a @i{top level form} in a @i{file} ++being processed by the @i{file compiler}, the proclamations are also made ++at compile-time. As with other defining macros, it is unspecified whether or ++not the compile-time side-effects of a @b{declaim} persist after the ++@i{file} has been @i{compiled}. ++ ++@subsubheading Examples:: ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{proclaim} ++ ++@node declare, ignore, declaim, Evaluation and Compilation Dictionary ++@subsection declare [Symbol] ++ ++@subsubheading Syntax:: ++ ++@code{declare} @i{@{@i{declaration-specifier}@}*} ++@subsubheading Arguments:: ++ ++@i{declaration-specifier}---a @i{declaration specifier}; not evaluated. ++ ++@subsubheading Description:: ++ ++A @b{declare} @i{expression}, sometimes called a @i{declaration}, ++can occur only at the beginning of the bodies of certain @i{forms}; ++that is, it may be preceded only by other @b{declare} @i{expressions}, ++or by a @i{documentation string} if the context permits. ++ ++A @b{declare} @i{expression} can occur in a @i{lambda expression} ++or in any of the @i{forms} listed in Figure 3--23. ++ ++@format ++@group ++@noindent ++@w{ defgeneric do-external-symbols prog } ++@w{ define-compiler-macro do-symbols prog* } ++@w{ define-method-combination dolist restart-case } ++@w{ define-setf-expander dotimes symbol-macrolet } ++@w{ defmacro flet with-accessors } ++@w{ defmethod handler-case with-hash-table-iterator } ++@w{ defsetf labels with-input-from-string } ++@w{ deftype let with-open-file } ++@w{ defun let* with-open-stream } ++@w{ destructuring-bind locally with-output-to-string } ++@w{ do macrolet with-package-iterator } ++@w{ do* multiple-value-bind with-slots } ++@w{ do-all-symbols pprint-logical-block } ++ ++@noindent ++@w{ Figure 3--23: Standardized Forms In Which Declarations Can Occur } ++ ++@end group ++@end format ++ ++A @b{declare} @i{expression} can only occur ++where specified by the syntax of these @i{forms}. ++The consequences of attempting to evaluate a @b{declare} @i{expression} ++are undefined. In situations where such @i{expressions} can appear, ++explicit checks are made for their presence and they are never actually evaluated; ++it is for this reason that they ++are called ``@b{declare} @i{expressions}'' ++rather than ``@b{declare} @i{forms}.'' ++ ++@i{Macro forms} cannot expand into declarations; ++@b{declare} @i{expressions} must appear as actual @i{subexpressions} of ++the @i{form} to which they refer. ++ ++Figure 3--24 shows a list of @i{declaration identifiers} ++that can be used with @b{declare}. ++ ++@format ++@group ++@noindent ++@w{ dynamic-extent ignore optimize } ++@w{ ftype inline special } ++@w{ ignorable notinline type } ++ ++@noindent ++@w{ Figure 3--24: Local Declaration Specifiers} ++ ++@end group ++@end format ++ ++An implementation is free to support other (@i{implementation-defined}) ++@i{declaration identifiers} as well. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun nonsense (k x z) ++ (foo z x) ;First call to foo ++ (let ((j (foo k x)) ;Second call to foo ++ (x (* k k))) ++ (declare (inline foo) (special x z)) ++ (foo x j z))) ;Third call to foo ++@end example ++ ++In this example, ++the @b{inline} declaration applies ++only to the third call to @t{foo}, but not to the first or second ones. ++The @b{special} declaration of @t{x} causes @b{let} ++to make a dynamic @i{binding} for @t{x}, and causes the reference to ++@t{x} ++in the body of @b{let} to be a dynamic reference. ++The reference to @t{x} in the second call to @t{foo} is a local reference ++to the second parameter of @t{nonsense}. ++The reference to @t{x} in the first call to @t{foo} is a local ++reference, not a @b{special} one. The @b{special} declaration of @t{z} ++causes the reference to @t{z} in the ++third ++call ++to @t{foo} to be a dynamic reference; it does not ++refer to the parameter to @t{nonsense} named @t{z}, because that ++parameter @i{binding} has not been declared to be @b{special}. ++(The @b{special} declaration of @t{z} does not appear in the body ++of @b{defun}, but in an inner @i{form}, and therefore does not ++affect the @i{binding} of the @i{parameter}.) ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences of trying to use a @b{declare} @i{expression} as ++a @i{form} to be @i{evaluated} are undefined. ++ ++[Editorial Note by KMP: Probably we need to say something here about ill-formed ++declare expressions.] ++ ++@subsubheading See Also:: ++ ++@ref{proclaim} ++, ++@ref{Type Specifiers}, ++@b{declaration}, ++@b{dynamic-extent}, ++@b{ftype}, ++@b{ignorable}, ++@b{ignore}, ++@b{inline}, ++@b{notinline}, ++@b{optimize}, ++@b{type} ++ ++@node ignore, dynamic-extent, declare, Evaluation and Compilation Dictionary ++@subsection ignore, ignorable [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{@r{(}ignore @{@i{var} | @r{(}@b{function} @i{fn}@r{)}@}*@r{)}} ++ ++@t{@r{(}ignorable @{@i{var} | @r{(}@b{function} @i{fn}@r{)}@}*@r{)}} ++ ++@subsubheading Arguments:: ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{fn}---a @i{function} @i{name}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} ++ ++@subsubheading Binding Types Affected:: ++ ++@i{variable}, @i{function} ++ ++@subsubheading Description:: ++ ++The @b{ignore} and @b{ignorable} declarations ++refer to @i{for-value} @i{references} ++ to @i{variable} @i{bindings} for the @i{vars} ++and to @i{function} @i{bindings} for the @i{fns}. ++ ++An @b{ignore} @i{declaration} specifies that ++@i{for-value} @i{references} to the indicated @i{bindings} ++will not ++occur within the scope of the @i{declaration}. ++Within the @i{scope} of such a @i{declaration}, ++it is desirable ++for a compiler to issue a warning about ++the presence of ++either a @i{for-value} @i{reference} to any @i{var} or @i{fn}, ++ or a @b{special} @i{declaration} for any @i{var}. ++ ++An @b{ignorable} @i{declaration} specifies that ++@i{for-value} @i{references} to the indicated @i{bindings} ++might or might not ++occur within the scope of the @i{declaration}. ++Within the @i{scope} of such a @i{declaration}, ++it is not desirable ++for a compiler to issue a warning about ++the presence or absence of ++either a @i{for-value} @i{reference} to any @i{var} or @i{fn}, ++ or a @b{special} @i{declaration} for any @i{var}. ++ ++When not within the @i{scope} ++of a @b{ignore} or @b{ignorable} @i{declaration}, ++it is desirable ++for a compiler to issue a warning about ++any @i{var} for which there is ++neither a @i{for-value} @i{reference} ++ nor a @b{special} @i{declaration}, ++or about ++any @i{fn} for which there is ++ no @i{for-value} @i{reference}. ++ ++Any warning about a ``used'' or ``unused'' @i{binding} must be of @i{type} @b{style-warning}, ++and may not affect program semantics. ++ ++The @i{stream variables} established by ++ @b{with-open-file}, ++ @b{with-open-stream}, ++ @b{with-input-from-string}, ++ and @b{with-output-to-string}, ++and all @i{iteration variables} are, by definition, always ``used''. ++Using @t{(declare (ignore @i{v}))}, ++for such a @i{variable} @i{v} has unspecified consequences. ++ ++@subsubheading See Also:: ++ ++@b{declare} ++ ++@node dynamic-extent, type, ignore, Evaluation and Compilation Dictionary ++@subsection dynamic-extent [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(dynamic-extent [[@{@i{var}@}* | ++ @r{(}@b{function} @i{fn}@r{)}@r{*}]])} ++ ++@subsubheading Arguments:: ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{fn}---a @i{function} @i{name}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} ++ ++@subsubheading Binding Types Affected:: ++ ++@i{variable}, @i{function} ++ ++@subsubheading Description:: ++ ++In some containing @i{form}, @i{F}, this declaration ++asserts for each @i{var_i} (which need not be bound by @i{F}), ++and for each @i{value} @i{v_@{ij@}} that @i{var_i} takes on, ++and for each @i{object} @i{x_@{ijk@}} that ++is ++an @i{otherwise inaccessible part} of @i{v_@{ij@}} at any time when ++@i{v_@{ij@}} ++becomes the value of @i{var_i}, ++that just after the execution of @i{F} terminates, ++@i{x_@{ijk@}} is either @i{inaccessible} ++(if @i{F} established a @i{binding} for @i{var_i}) ++or still an @i{otherwise inaccessible part} of the current value of ++@i{var_i} (if @i{F} did not establish a @i{binding} ++for @i{var_i}). ++ ++The same relation holds for each @i{fn_i}, ++except that the @i{bindings} are in the @i{function} @i{namespace}. ++ ++The compiler is permitted to use ++this information in any way that is appropriate to the @i{implementation} ++and that does not conflict with the semantics of @r{Common Lisp}. ++ ++@b{dynamic-extent} declarations can be @i{free declarations} ++or @i{bound declarations}. ++ ++The @i{vars} and @i{fns} named in a @b{dynamic-extent} ++declaration must not refer to @i{symbol macro} or @i{macro} bindings. ++ ++@subsubheading Examples:: ++ ++Since stack allocation of the initial value entails knowing at the ++@i{object}'s creation time that the @i{object} can be ++@i{stack-allocated}, it is not generally useful to make a ++@b{dynamic-extent} @i{declaration} for @i{variables} ++which have no lexically apparent initial value. ++For example, it is probably useful to write: ++ ++@example ++ (defun f () ++ (let ((x (list 1 2 3))) ++ (declare (dynamic-extent x)) ++ ...)) ++@end example ++ ++This would permit those compilers that wish to do so to @i{stack allocate} ++the list held by the local variable @t{x}. It is permissible, ++but in practice probably not as useful, to write: ++ ++@example ++ (defun g (x) (declare (dynamic-extent x)) ...) ++ (defun f () (g (list 1 2 3))) ++@end example ++ ++Most compilers would probably not @i{stack allocate} the @i{argument} ++to @t{g} in @t{f} because it would be a modularity violation for the compiler ++to assume facts about @t{g} from within @t{f}. Only an implementation that ++was willing to be responsible for recompiling @t{f} if the definition of @t{g} ++changed incompatibly could legitimately @i{stack allocate} the @i{list} ++argument to @t{g} in @t{f}. ++ ++Here is another example: ++ ++@example ++ (declaim (inline g)) ++ (defun g (x) (declare (dynamic-extent x)) ...) ++ (defun f () (g (list 1 2 3))) ++ ++ (defun f () ++ (flet ((g (x) (declare (dynamic-extent x)) ...)) ++ (g (list 1 2 3)))) ++ ++@end example ++ ++In the previous example, some compilers might determine that optimization was ++possible and others might not. ++ ++A variant of this is the so-called ``stack allocated rest list'' ++that can be achieved (in implementations supporting the optimization) by: ++ ++@example ++ (defun f (&rest x) ++ (declare (dynamic-extent x)) ++ ...) ++@end example ++ ++Note that although the initial value of @t{x} is not explicit, the @t{f} ++function is responsible for assembling the list @t{x} from the passed arguments, ++so the @t{f} function can be optimized by the compiler to construct a ++@i{stack-allocated} list instead of a heap-allocated list in implementations ++that support such. ++ ++In the following example, ++ ++@example ++ (let ((x (list 'a1 'b1 'c1)) ++ (y (cons 'a2 (cons 'b2 (cons 'c2 nil))))) ++ (declare (dynamic-extent x y)) ++ ...) ++@end example ++ ++The @i{otherwise inaccessible parts} of @t{x} are three ++@i{conses}, and the @i{otherwise inaccessible parts} ++of @t{y} are three other @i{conses}. ++None of the symbols @t{a1}, @t{b1}, @t{c1}, @t{a2}, ++@t{b2}, @t{c2}, or @b{nil} is an ++@i{otherwise inaccessible part} of @t{x} or @t{y} because each ++is @i{interned} and hence @i{accessible} by the @i{package} ++(or @i{packages}) in which it is @i{interned}. ++However, if a freshly allocated @i{uninterned} @i{symbol} had ++been used, it would have been an @i{otherwise inaccessible part} of ++the @i{list} which contained it. ++ ++@example ++;; In this example, the implementation is permitted to @i{stack allocate} ++;; the list that is bound to X. ++ (let ((x (list 1 2 3))) ++ (declare (dynamic-extent x)) ++ (print x) ++ :done) ++@t{ |> } (1 2 3) ++@result{} :DONE ++ ++;; In this example, the list to be bound to L can be @i{stack-allocated}. ++ (defun zap (x y z) ++ (do ((l (list x y z) (cdr l))) ++ ((null l)) ++ (declare (dynamic-extent l)) ++ (prin1 (car l)))) @result{} ZAP ++ (zap 1 2 3) ++@t{ |> } 123 ++@result{} NIL ++ ++;; Some implementations might open-code LIST-ALL-PACKAGES in a way ++;; that permits using @i{stack allocation} of the list to be bound to L. ++ (do ((l (list-all-packages) (cdr l))) ++ ((null l)) ++ (declare (dynamic-extent l)) ++ (let ((name (package-name (car l)))) ++ (when (string-search "COMMON-LISP" name) (print name)))) ++@t{ |> } "COMMON-LISP" ++@t{ |> } "COMMON-LISP-USER" ++@result{} NIL ++ ++;; Some implementations might have the ability to @i{stack allocate} ++;; rest lists. A declaration such as the following should be a cue ++;; to such implementations that stack-allocation of the rest list ++;; would be desirable. ++ (defun add (&rest x) ++ (declare (dynamic-extent x)) ++ (apply #'+ x)) @result{} ADD ++ (add 1 2 3) @result{} 6 ++ ++ (defun zap (n m) ++ ;; Computes (RANDOM (+ M 1)) at relative speed of roughly O(N). ++ ;; It may be slow, but with a good compiler at least it ++ ;; doesn't waste much heap storage. :-@} ++ (let ((a (make-array n))) ++ (declare (dynamic-extent a)) ++ (dotimes (i n) ++ (declare (dynamic-extent i)) ++ (setf (aref a i) (random (+ i 1)))) ++ (aref a m))) @result{} ZAP ++ (< (zap 5 3) 3) @result{} @i{true} ++@end example ++ ++The following are in error, since the value of @t{x} is used outside of its ++@i{extent}: ++ ++@example ++ (length (list (let ((x (list 1 2 3))) ; Invalid ++ (declare (dynamic-extent x)) ++ x))) ++ ++ (progn (let ((x (list 1 2 3))) ; Invalid ++ (declare (dynamic-extent x)) ++ x) ++ nil) ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare} ++ ++@subsubheading Notes:: ++ ++The most common optimization is to @i{stack allocate} the ++initial value of the @i{objects} named by the @i{vars}. ++ ++It is permissible for an implementation to simply ignore this declaration. ++ ++@node type, inline, dynamic-extent, Evaluation and Compilation Dictionary ++@subsection type [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(type @i{typespec} @{@i{var}@}*)} ++ ++@t{(@i{typespec} @{@i{var}@}*)} ++ ++@subsubheading Arguments:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} or @i{proclamation} ++ ++@subsubheading Binding Types Affected:: ++ ++@i{variable} ++ ++@subsubheading Description:: ++ ++Affects ++only variable @i{bindings} and specifies that the ++@i{vars} take on ++values only of the specified @i{typespec}. ++In particular, values assigned to the variables by @b{setq}, ++as well as the initial values of the @i{vars} must be of ++the specified @i{typespec}. ++@b{type} declarations never apply to function @i{bindings} (see @b{ftype}). ++ ++A type declaration of a @i{symbol} ++defined by @b{symbol-macrolet} is equivalent ++to wrapping a @b{the} ++expression around the expansion of that @i{symbol}, ++ ++although the @i{symbol}'s @i{macro expansion} is not actually affected. ++ ++The meaning of a type declaration ++ is equivalent to changing each reference to ++a variable (@i{var}) within the scope of the ++ declaration to @t{(the @i{typespec} @i{var})}, ++changing each expression assigned to the ++ variable (@i{new-value}) within the scope of the declaration to ++@t{(the @i{typespec} @i{new-value})}, ++ and executing ++@t{(the @i{typespec} @i{var})} at the moment the scope of the declaration ++ is entered. ++ ++A @i{type} declaration is valid in all declarations. The interpretation ++ of a type declaration is as follows: ++@table @asis ++ ++@item 1. ++During the execution of any reference to the ++ declared variable within the scope of the declaration, the consequences ++are ++undefined ++if ++ the value of the declared variable is not of the declared @i{type}. ++ ++@item 2. ++During the execution of any ++@b{setq} of the declared variable within the scope ++ of the declaration, the consequences are ++undefined ++if the newly assigned value of the ++ declared variable is not of the declared @i{type}. ++ ++@item 3. ++At the moment the ++ scope of the declaration is entered, the consequences are ++undefined ++if the value of the ++ declared variable is not of the declared @i{type}. ++@end table ++ ++A @i{type} declaration affects only variable references within ++its scope. ++ ++If nested @i{type} declarations refer to the same variable, ++ then the value of the variable must be a member of the intersection of ++ the declared @i{types}. ++ ++ If there is a local @t{type} declaration for a dynamic ++ variable, and there is also a global @t{type} proclamation for that same ++ variable, then the value of the variable within the scope of the local ++ declaration must be a member of the intersection of the two declared ++ @i{types}. ++ ++@b{type} declarations can be @i{free declarations} ++or @i{bound declarations}. ++ ++A @i{symbol} cannot be both the name of a @i{type} and the name of a ++declaration. Defining a @i{symbol} as the @i{name} of a @i{class}, ++@i{structure}, @i{condition}, or @i{type}, when the @i{symbol} ++has been @i{declared} as a declaration name, or vice versa, signals an error. ++ ++Within the @i{lexical scope} of an @b{array} type declaration, ++all references to @i{array} @i{elements} are assumed to satisfy the ++@i{expressed array element type} (as opposed to the @i{upgraded array element type}). ++A compiler can treat ++the code within the scope of the @b{array} type declaration as if each ++@i{access} of an @i{array} @i{element} were surrounded by an appropriate ++@b{the} form. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun f (x y) ++ (declare (type fixnum x y)) ++ (let ((z (+ x y))) ++ (declare (type fixnum z)) ++ z)) @result{} F ++ (f 1 2) @result{} 3 ++ ;; The previous definition of F is equivalent to ++ (defun f (x y) ++ ;; This declaration is a shorthand form of the TYPE declaration ++ (declare (fixnum x y)) ++ ;; To declare the type of a return value, it's not necessary to ++ ;; create a named variable. A THE special form can be used instead. ++ (the fixnum (+ x y))) @result{} F ++ (f 1 2) @result{} 3 ++@end example ++ ++@example ++ (defvar *one-array* (make-array 10 :element-type '(signed-byte 5))) ++ (defvar *another-array* (make-array 10 :element-type '(signed-byte 8))) ++ ++ (defun frob (an-array) ++ (declare (type (array (signed-byte 5) 1) an-array)) ++ (setf (aref an-array 1) 31) ++ (setf (aref an-array 2) 127) ++ (setf (aref an-array 3) (* 2 (aref an-array 3))) ++ (let ((foo 0)) ++ (declare (type (signed-byte 5) foo)) ++ (setf foo (aref an-array 0)))) ++ ++ (frob *one-array*) ++ (frob *another-array*) ++@end example ++ ++The above definition of @t{frob} is equivalent to: ++ ++@example ++ (defun frob (an-array) ++ (setf (the (signed-byte 5) (aref an-array 1)) 31) ++ (setf (the (signed-byte 5) (aref an-array 2)) 127) ++ (setf (the (signed-byte 5) (aref an-array 3)) ++ (* 2 (the (signed-byte 5) (aref an-array 3)))) ++ (let ((foo 0)) ++ (declare (type (signed-byte 5) foo)) ++ (setf foo (the (signed-byte 5) (aref an-array 0))))) ++@end example ++ ++Given an implementation in which ++@i{fixnums} are 29 bits but @b{fixnum} @i{arrays} ++are upgraded to signed 32-bit @i{arrays}, ++the following ++could be compiled with all @i{fixnum} arithmetic: ++ ++@example ++ (defun bump-counters (counters) ++ (declare (type (array fixnum *) bump-counters)) ++ (dotimes (i (length counters)) ++ (incf (aref counters i)))) ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{declaim} ++, ++@ref{proclaim} ++ ++@subsubheading Notes:: ++ ++@t{(@i{typespec} @{@i{var}@}*)} ++is an abbreviation for @t{(type @i{typespec} @{@i{var}@}*)}. ++ ++A @b{type} declaration for the arguments to a function does not ++necessarily imply anything about the type of the result. The following ++function is not permitted to be compiled using @i{implementation-dependent} ++@i{fixnum}-only arithmetic: ++ ++@example ++ (defun f (x y) (declare (fixnum x y)) (+ x y)) ++@end example ++ ++To see why, consider @t{(f most-positive-fixnum 1)}. ++Common Lisp defines that @t{F} must return a @i{bignum} here, rather ++than signal an error or produce a mathematically incorrect result. ++If you have special knowledge such ``@i{fixnum} overflow'' cases will ++not come up, you can declare the result value to be in the @i{fixnum} ++range, enabling some compilers to use more efficient arithmetic: ++ ++@example ++ (defun f (x y) ++ (declare (fixnum x y)) ++ (the fixnum (+ x y))) ++@end example ++ ++Note, however, that in the three-argument case, because of the possibility ++of an implicit intermediate value growing too large, the following will not ++cause @i{implementation-dependent} @i{fixnum}-only arithmetic to be used: ++ ++@example ++ (defun f (x y) ++ (declare (fixnum x y z)) ++ (the fixnum (+ x y z))) ++@end example ++ ++To see why, consider @t{(f most-positive-fixnum 1 -1).} ++Although the arguments and the result are all @i{fixnums}, an intermediate ++value is not a @i{fixnum}. If it is important that ++@i{implementation-dependent} @i{fixnum}-only arithmetic be selected ++in @i{implementations} that provide it, ++consider writing something like this instead: ++ ++@example ++ (defun f (x y) ++ (declare (fixnum x y z)) ++ (the fixnum (+ (the fixnum (+ x y)) z))) ++@end example ++ ++@node inline, ftype, type, Evaluation and Compilation Dictionary ++@subsection inline, notinline [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(inline @{@i{function-name}@}*)} ++ ++@t{(notinline @{@i{function-name}@}*)} ++ ++@subsubheading Arguments:: ++ ++@i{function-name}---a @i{function name}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} or @i{proclamation} ++ ++@subsubheading Binding Types Affected:: ++ ++@i{function} ++ ++@subsubheading Description:: ++ ++@b{inline} specifies that ++it is desirable for the compiler to produce inline calls ++to the @i{functions} named by @i{function-names}; ++that is, the code for a specified @i{function-name} ++ ++should be integrated into the calling routine, appearing ``in line'' ++in place of a procedure call. ++A compiler is free to ignore this declaration. ++@b{inline} declarations never apply to variable @i{bindings}. ++ ++If one of the @i{functions} mentioned has a lexically apparent local definition ++(as made by @b{flet} or @b{labels}), then the declaration ++applies to that local definition and not to the global function definition. ++ ++While no @i{conforming implementation} is required to perform inline expansion ++of user-defined functions, those @i{implementations} that do attempt ++to recognize the following paradigm: ++ ++To define a @i{function} @t{f} that is not @b{inline} by default ++but for which @t{(declare (inline f))} will make @i{f} be locally inlined, ++the proper definition sequence is: ++ ++@example ++ (declaim (inline f)) ++ (defun f ...) ++ (declaim (notinline f)) ++@end example ++ ++The @b{inline} proclamation preceding the @b{defun} @i{form} ++ensures that the @i{compiler} has the opportunity save the information ++necessary for inline expansion, and the @b{notinline} proclamation ++following the @b{defun} @i{form} prevents @t{f} from being expanded ++inline everywhere. ++ ++@b{notinline} specifies that it is ++ ++undesirable to compile the @i{functions} ++named by @i{function-names} in-line. ++A compiler is not free to ignore this declaration; ++calls to the specified functions must be implemented as out-of-line subroutine calls. ++ ++If one of the @i{functions} ++mentioned has a lexically apparent local definition ++(as made by @b{flet} or @b{labels}), then the declaration ++applies to that local definition and not to the global function definition. ++ ++In the presence of a @i{compiler macro} definition for ++@i{function-name}, a @b{notinline} declaration prevents that ++ ++@i{compiler macro} from being used. ++ ++An @b{inline} declaration may be used to encourage use of ++@i{compiler macro} definitions. @b{inline} and @b{notinline} ++declarations otherwise have no effect when the lexically visible definition ++of @i{function-name} is a @i{macro} definition. ++ ++@b{inline} and @b{notinline} declarations can be @i{free declarations} or ++@i{bound declarations}. ++@b{inline} and @b{notinline} declarations of functions that ++appear before the body of a ++ @b{flet} ++ or @b{labels} ++ ++@i{form} that defines that function are @i{bound declarations}. ++Such declarations in other contexts are @i{free declarations}. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; The globally defined function DISPATCH should be open-coded, ++ ;; if the implementation supports inlining, unless a NOTINLINE ++ ;; declaration overrides this effect. ++ (declaim (inline dispatch)) ++ (defun dispatch (x) (funcall (get (car x) 'dispatch) x)) ++ ;; Here is an example where inlining would be encouraged. ++ (defun top-level-1 () (dispatch (read-command))) ++ ;; Here is an example where inlining would be prohibited. ++ (defun top-level-2 () ++ (declare (notinline dispatch)) ++ (dispatch (read-command))) ++ ;; Here is an example where inlining would be prohibited. ++ (declaim (notinline dispatch)) ++ (defun top-level-3 () (dispatch (read-command))) ++ ;; Here is an example where inlining would be encouraged. ++ (defun top-level-4 () ++ (declare (inline dispatch)) ++ (dispatch (read-command))) ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{declaim} ++, ++@ref{proclaim} ++ ++@node ftype, declaration, inline, Evaluation and Compilation Dictionary ++@subsection ftype [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(ftype @i{type} @{@i{function-name}@}*)} ++ ++@subsubheading Arguments:: ++ ++@i{function-name}---a @i{function name}. ++ ++@i{type}---a @i{type specifier}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} or @i{proclamation} ++ ++@subsubheading Binding Types Affected:: ++ ++@i{function} ++ ++@subsubheading Description:: ++ ++Specifies that the @i{functions} named by @i{function-names} are of ++the functional type @i{type}. ++For example: ++ ++@example ++ (declare (ftype (function (integer list) t) ith) ++ (ftype (function (number) float) sine cosine)) ++@end example ++ ++If one of the @i{functions} mentioned has a lexically apparent local definition ++(as made by @b{flet} or @b{labels}), then the declaration ++applies to that local definition and not to the global function definition. ++@b{ftype} declarations never apply to variable @i{bindings} (see @t{type}). ++ ++The lexically apparent bindings of @i{function-names} must not be ++@i{macro} definitions. (This is because @b{ftype} declares the ++functional definition of each @i{function name} to be of a particular ++subtype of @b{function}, and @i{macros} do not denote ++@i{functions}.) ++ ++@b{ftype} ++ ++declarations ++can be @i{free declarations} or @i{bound declarations}. ++@b{ftype} declarations of functions that appear before the body of a ++ @b{flet} ++or @b{labels} ++ ++@i{form} that defines that function are @i{bound declarations}. ++Such declarations in other contexts are @i{free declarations}. ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{declaim} ++, ++@ref{proclaim} ++ ++@node declaration, optimize, ftype, Evaluation and Compilation Dictionary ++@subsection declaration [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(declaration @{@i{name}@}*)} ++ ++@subsubheading Arguments:: ++ ++@i{name}---a @i{symbol}. ++ ++@subsubheading Valid Context:: ++ ++@i{proclamation} only ++ ++@subsubheading Description:: ++ ++Advises the compiler that each @i{name} is a valid but potentially ++non-standard declaration name. The purpose of this is to tell one ++compiler not to issue warnings for declarations meant for another ++compiler or other program processor. ++ ++@subsubheading Examples:: ++ ++@example ++ (declaim (declaration author target-language target-machine)) ++ (declaim (target-language ada)) ++ (declaim (target-machine IBM-650)) ++ (defun strangep (x) ++ (declare (author "Harry Tweeker")) ++ (member x '(strange weird odd peculiar))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{declaim} ++, ++@ref{proclaim} ++ ++@node optimize, special, declaration, Evaluation and Compilation Dictionary ++@subsection optimize [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(optimize @{@i{quality} | (@i{quality} @i{value})@}*)} ++ ++@IRindex compilation-speed ++ ++@IRindex debug ++ ++@IRindex safety ++ ++@IRindex space ++ ++@IRindex speed ++ ++@subsubheading Arguments:: ++ ++@i{quality}---an @i{optimize quality}. ++ ++@i{value}---one of the @i{integers} @t{0}, @t{1}, @t{2}, or @t{3}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} or @i{proclamation} ++ ++@subsubheading Description:: ++ ++Advises the compiler that each @i{quality} should be given attention ++according to the specified corresponding @i{value}. ++Each @i{quality} must be a @i{symbol} naming an @i{optimize quality}; ++the names and meanings of the standard @i{optimize qualities} are shown in ++Figure 3--25. ++ ++@format ++@group ++@noindent ++@w{ Name Meaning } ++@w{ @b{compilation-speed} speed of the compilation process } ++@w{ @b{debug} ease of debugging } ++@w{ @b{safety} run-time error checking } ++@w{ @b{space} both code size and run-time space } ++@w{ @b{speed} speed of the object code } ++ ++@noindent ++@w{ Figure 3--25: Optimize qualities } ++ ++@end group ++@end format ++ ++There may be other, @i{implementation-defined} @i{optimize qualities}. ++ ++A @i{value} @t{0} means that the corresponding @i{quality} is totally ++unimportant, and @t{3} that the @i{quality} is extremely important; ++@t{1} and @t{2} are intermediate values, with @t{1} the ++neutral value. ++@t{(@i{quality} 3)} can be abbreviated to @i{quality}. ++ ++Note that @i{code} which has the optimization @t{(safety 3)}, ++or just @b{safety}, ++is called @i{safe} @i{code}. ++ ++The consequences are unspecified if a @i{quality} appears more than once ++with @i{different} @i{values}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun often-used-subroutine (x y) ++ (declare (optimize (safety 2))) ++ (error-check x y) ++ (hairy-setup x) ++ (do ((i 0 (+ i 1)) ++ (z x (cdr z))) ++ ((null z)) ++ ;; This inner loop really needs to burn. ++ (declare (optimize speed)) ++ (declare (fixnum i)) ++ )) ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{declaim} ++, ++@ref{proclaim} ++, ++@ref{Declaration Scope} ++ ++@subsubheading Notes:: ++ ++An @b{optimize} declaration never applies to either a @i{variable} or ++a @i{function} @i{binding}. An @b{optimize} declaration can only ++be a @i{free declaration}. For more information, see @ref{Declaration Scope}. ++ ++@node special, locally, optimize, Evaluation and Compilation Dictionary ++@subsection special [Declaration] ++ ++@subsubheading Syntax:: ++ ++@t{(special @{@i{var}@}*)} ++ ++@subsubheading Arguments:: ++ ++@i{var}---a @i{symbol}. ++ ++@subsubheading Valid Context:: ++ ++@i{declaration} or @i{proclamation} ++ ++@subsubheading Binding Types Affected:: ++ ++@i{variable} ++ ++@subsubheading Description:: ++ ++Specifies that all of ++the @i{vars} named are dynamic. ++This specifier affects variable @i{bindings} and ++affects references. ++All variable @i{bindings} affected are made to be dynamic @i{bindings}, ++and affected variable references refer to the current dynamic ++@i{binding}. ++For example: ++ ++@example ++ (defun hack (thing *mod*) ;The binding of the parameter ++ (declare (special *mod*)) ; *mod* is visible to hack1, ++ (hack1 (car thing))) ; but not that of thing. ++ (defun hack1 (arg) ++ (declare (special *mod*)) ;Declare references to *mod* ++ ;within hack1 to be special. ++ (if (atom arg) *mod* ++ (cons (hack1 (car arg)) (hack1 (cdr arg))))) ++@end example ++ ++A @b{special} declaration does not affect inner @i{bindings} ++of a @i{var}; the inner @i{bindings} implicitly shadow ++a @b{special} declaration and must be explicitly re-declared to ++be @b{special}. ++@b{special} declarations never apply to function @i{bindings}. ++ ++@b{special} declarations can be either @i{bound declarations}, ++affecting both a binding and references, or @i{free declarations}, ++affecting only references, depending on whether the declaration is ++attached to a variable binding. ++ ++When used in a @i{proclamation}, a @b{special} ++@i{declaration specifier} ++applies to all @i{bindings} as well as to all references of the ++mentioned variables. For example, after ++ ++@example ++ (declaim (special x)) ++@end example ++ ++then in a function definition such as ++ ++@example ++ (defun example (x) ...) ++@end example ++ ++the parameter @t{x} is bound as a dynamic variable ++rather than as a lexical variable. ++ ++@subsubheading Examples:: ++ ++@example ++(defun declare-eg (y) ;this y is special ++ (declare (special y)) ++ (let ((y t)) ;this y is lexical ++ (list y ++ (locally (declare (special y)) y)))) ;this y refers to the ++ ;special binding of y ++@result{} DECLARE-EG ++ (declare-eg nil) @result{} (T NIL) ++@end example ++ ++@example ++(setf (symbol-value 'x) 6) ++(defun foo (x) ;a lexical binding of x ++ (print x) ++ (let ((x (1+ x))) ;a special binding of x ++ (declare (special x)) ;and a lexical reference ++ (bar)) ++ (1+ x)) ++(defun bar () ++ (print (locally (declare (special x)) ++ x))) ++(foo 10) ++@t{ |> } 10 ++@t{ |> } 11 ++@result{} 11 ++@end example ++ ++@example ++(setf (symbol-value 'x) 6) ++(defun bar (x y) ;[1] 1st occurrence of x ++ (let ((old-x x) ;[2] 2nd occurrence of x -- same as 1st occurrence ++ (x y)) ;[3] 3rd occurrence of x ++ (declare (special x)) ++ (list old-x x))) ++(bar 'first 'second) @result{} (FIRST SECOND) ++@end example ++ ++@example ++ (defun few (x &optional (y *foo*)) ++ (declare (special *foo*)) ++ ...) ++@end example ++ ++The reference to @t{*foo*} ++in the first line of this example is not @b{special} ++even though there is a @b{special} declaration in the second line. ++ ++@example ++ (declaim (special prosp)) @result{} @i{implementation-dependent} ++ (setq prosp 1 reg 1) @result{} 1 ++ (let ((prosp 2) (reg 2)) ;the binding of prosp is special ++ (set 'prosp 3) (set 'reg 3) ;due to the preceding proclamation, ++ (list prosp reg)) ;whereas the variable reg is lexical ++@result{} (3 2) ++ (list prosp reg) @result{} (1 3) ++ ++ (declaim (special x)) ;x is always special. ++ (defun example (x y) ++ (declare (special y)) ++ (let ((y 3) (x (* x 2))) ++ (print (+ y (locally (declare (special y)) y))) ++ (let ((y 4)) (declare (special y)) (foo x)))) @result{} EXAMPLE ++@end example ++ ++In the contorted code above, the outermost and innermost @i{bindings} of ++@t{y} are dynamic, ++but the middle ++binding is lexical. The two arguments to @t{+} are different, ++one being the value, which is @t{3}, of the lexical variable ++@t{y}, and the other being the value of the dynamic variable named @t{y} ++(a @i{binding} ++of which happens, coincidentally, to lexically surround it at ++an outer level). All the @i{bindings} ++of @t{x} and references to @t{x} ++are dynamic, however, because of the proclamation that @t{x} is ++always @b{special}. ++ ++@subsubheading See Also:: ++ ++@ref{defparameter} ++, ++@b{defvar} ++ ++@node locally, the, special, Evaluation and Compilation Dictionary ++@subsection locally [Special Operator] ++ ++@code{locally} @i{@{@i{declaration}@}* @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{Declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms}. ++ ++@subsubheading Description:: ++ ++Sequentially evaluates a body of @i{forms} ++in a @i{lexical environment} where the given @i{declarations} have effect. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun sample-function (y) ;this y is regarded as special ++ (declare (special y)) ++ (let ((y t)) ;this y is regarded as lexical ++ (list y ++ (locally (declare (special y)) ++ ;; this next y is regarded as special ++ y)))) ++@result{} SAMPLE-FUNCTION ++ (sample-function nil) @result{} (T NIL) ++ (setq x '(1 2 3) y '(4 . 5)) @result{} (4 . 5) ++ ++;;; The following declarations are not notably useful in specific. ++;;; They just offer a sample of valid declaration syntax using LOCALLY. ++ (locally (declare (inline floor) (notinline car cdr)) ++ (declare (optimize space)) ++ (floor (car x) (cdr y))) @result{} 0, 1 ++@end example ++ ++@example ++;;; This example shows a definition of a function that has a particular set ++;;; of OPTIMIZE settings made locally to that definition. ++ (locally (declare (optimize (safety 3) (space 3) (speed 0))) ++ (defun frob (w x y &optional (z (foo x y))) ++ (mumble x y z w))) ++@result{} FROB ++ ++;;; This is like the previous example, except that the optimize settings ++;;; remain in effect for subsequent definitions in the same compilation unit. ++ (declaim (optimize (safety 3) (space 3) (speed 0))) ++ (defun frob (w x y &optional (z (foo x y))) ++ (mumble x y z w)) ++@result{} FROB ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare} ++ ++@subsubheading Notes:: ++ ++The @b{special} declaration may be used with @b{locally} ++to affect references to, rather than @i{bindings} of, @i{variables}. ++ ++If a @b{locally} @i{form} is a @i{top level form}, the body @i{forms} ++are also processed as @i{top level forms}. See @ref{File Compilation}. ++ ++@node the, special-operator-p, locally, Evaluation and Compilation Dictionary ++@subsection the [Special Operator] ++ ++@code{the} @i{value-type form} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{value-type}---a @i{type specifier}; not evaluated. ++ ++@i{form}---a @i{form}; evaluated. ++ ++@i{results}---the @i{values} resulting from the @i{evaluation} of @i{form}. ++ These @i{values} must conform to the @i{type} supplied by @i{value-type}; ++ see below. ++ ++@subsubheading Description:: ++ ++@b{the} specifies that the @i{values}_@{1a@} returned by @i{form} ++are of the @i{types} specified by @i{value-type}. ++The consequences are undefined if any @i{result} ++is not of the declared type. ++ ++It is permissible for @i{form} to @i{yield} a different number of @i{values} ++than are specified by @i{value-type}, provided that the values ++for which @i{types} are declared are indeed of those @i{types}. ++Missing values are treated as @b{nil} for the purposes of checking their @i{types}. ++ ++Regardless of number of @i{values} declared by @i{value-type}, ++the number of @i{values} returned by the @b{the} @i{special form} is the same as ++the number of @i{values} returned by @i{form}. ++ ++@subsubheading Examples:: ++ ++@example ++ (the symbol (car (list (gensym)))) @result{} #:G9876 ++ (the fixnum (+ 5 7)) @result{} 12 ++ (the (values) (truncate 3.2 2)) @result{} 1, 1.2 ++ (the integer (truncate 3.2 2)) @result{} 1, 1.2 ++ (the (values integer) (truncate 3.2 2)) @result{} 1, 1.2 ++ (the (values integer float) (truncate 3.2 2)) @result{} 1, 1.2 ++ (the (values integer float symbol) (truncate 3.2 2)) @result{} 1, 1.2 ++ (the (values integer float symbol t null list) ++ (truncate 3.2 2)) @result{} 1, 1.2 ++ (let ((i 100)) ++ (declare (fixnum i)) ++ (the fixnum (1+ i))) @result{} 101 ++ (let* ((x (list 'a 'b 'c)) ++ (y 5)) ++ (setf (the fixnum (car x)) y) ++ x) @result{} (5 B C) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if ++the @i{values} @i{yielded} by the @i{form} ++are not of the @i{type} specified by @i{value-type}. ++ ++@subsubheading See Also:: ++ ++@b{values} ++ ++@subsubheading Notes:: ++ ++The @b{values} @i{type specifier} can be used to indicate the types ++of @i{multiple values}: ++ ++@example ++ (the (values integer integer) (floor x y)) ++ (the (values string t) ++ (gethash the-key the-string-table)) ++@end example ++ ++@b{setf} can be used with @b{the} type declarations. ++In this case the declaration is transferred to the form that ++specifies the new value. The resulting @b{setf} @i{form} ++is then analyzed. ++ ++@node special-operator-p, constantp, the, Evaluation and Compilation Dictionary ++@subsection special-operator-p [Function] ++ ++@code{special-operator-p} @i{symbol} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{symbol} is a @i{special operator}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (special-operator-p 'if) @result{} @i{true} ++ (special-operator-p 'car) @result{} @i{false} ++ (special-operator-p 'one) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its argument is not a @i{symbol}. ++ ++@subsubheading Notes:: ++ ++Historically, this function was called @t{special-form-p}. The name was ++finally declared a misnomer and changed, since it returned true for ++@i{special operators}, not @i{special forms}. ++ ++@node constantp, , special-operator-p, Evaluation and Compilation Dictionary ++@subsection constantp [Function] ++ ++@code{constantp} @i{form @r{&optional} environment} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ The default is @b{nil}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{form} can be determined ++by the @i{implementation} to be a @i{constant form} ++in the indicated @i{environment}; ++otherwise, it returns @i{false} indicating either ++ that the @i{form} is not a @i{constant form} ++ or that it cannot be determined whether or not @i{form} is a @i{constant form}. ++ ++The following kinds of @i{forms} are considered @i{constant forms}: ++@table @asis ++ ++@item @t{*} ++@i{Self-evaluating objects} ++ (such as @i{numbers}, ++ @i{characters}, ++ and the various kinds of @i{arrays}) ++ are always considered @i{constant forms} ++ and must be recognized as such by @b{constantp}. ++ ++@item @t{*} ++@i{Constant variables}, such as @i{keywords}, ++ symbols defined by @r{Common Lisp} as constant (such as @b{nil}, @b{t}, and @b{pi}), ++ and symbols declared as constant by the user in the indicated @i{environment} ++ using @b{defconstant} ++ are always considered @i{constant forms} ++ and must be recognized as such by @b{constantp}. ++ ++@item @t{*} ++@b{quote} @i{forms} are always considered @i{constant forms} ++ and must be recognized as such by @b{constantp}. ++ ++@item @t{*} ++An @i{implementation} is permitted, but not required, to detect ++ additional @i{constant forms}. If it does, it is also permitted, ++ but not required, to make use of information in the @i{environment}. ++ Examples of @i{constant forms} for which @b{constantp} might ++ or might not return @i{true} are: ++ @t{(sqrt pi)}, ++ @t{(+ 3 2)}, ++ @t{(length '(a b c))}, ++ and ++ @t{(let ((x 7)) (zerop x))}. ++@end table ++ ++If an @i{implementation} chooses to make use of the @i{environment} ++information, such actions as expanding @i{macros} or performing function ++inlining are permitted to be used, but not required; ++however, expanding @i{compiler macros} is not permitted. ++ ++@subsubheading Examples:: ++ ++@example ++ (constantp 1) @result{} @i{true} ++ (constantp 'temp) @result{} @i{false} ++ (constantp ''temp)) @result{} @i{true} ++ (defconstant this-is-a-constant 'never-changing) @result{} THIS-IS-A-CONSTANT ++ (constantp 'this-is-a-constant) @result{} @i{true} ++ (constantp "temp") @result{} @i{true} ++ (setq a 6) @result{} 6 ++ (constantp a) @result{} @i{true} ++ (constantp '(sin pi)) @result{} @i{implementation-dependent} ++ (constantp '(car '(x))) @result{} @i{implementation-dependent} ++ (constantp '(eql x x)) @result{} @i{implementation-dependent} ++ (constantp '(typep x 'nil)) @result{} @i{implementation-dependent} ++ (constantp '(typep x 't)) @result{} @i{implementation-dependent} ++ (constantp '(values this-is-a-constant)) @result{} @i{implementation-dependent} ++ (constantp '(values 'x 'y)) @result{} @i{implementation-dependent} ++ (constantp '(let ((a '(a b c))) (+ (length a) 6))) @result{} @i{implementation-dependent} ++@end example ++ ++@subsubheading Affected By:: ++ ++The state of the global environment (@i{e.g.}, which @i{symbols} have been ++declared to be the @i{names} of @i{constant variables}). ++ ++@subsubheading See Also:: ++ ++@ref{defconstant} ++ ++@c end of including dict-eval-compile ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-4.texi +@@ -0,0 +1,2805 @@ ++ ++ ++@node Types and Classes, Data and Control Flow, Evaluation and Compilation, Top ++@chapter Types and Classes ++ ++@menu ++* Introduction (Types and Classes):: ++* Types:: ++* Classes:: ++* Types and Classes Dictionary:: ++@end menu ++ ++@node Introduction (Types and Classes), Types, Types and Classes, Types and Classes ++@section Introduction ++ ++@c including concept-type-intro ++ ++A @i{type} is a (possibly infinite) set of @i{objects}. ++An @i{object} can belong to more than one @i{type}. ++@i{Types} are never explicitly represented as @i{objects} by @r{Common Lisp}. ++Instead, they are referred to indirectly by the use of @i{type specifiers}, ++which are @i{objects} that denote @i{types}. ++ ++New @i{types} can be defined using @b{deftype}, @b{defstruct}, ++@b{defclass}, and @b{define-condition}. ++ ++The @i{function} @b{typep}, a set membership test, is used to determine ++whether a given @i{object} is of a given @i{type}. The function ++@b{subtypep}, a subset test, is used to determine whether a ++given @i{type} is a @i{subtype} of another given @i{type}. The ++function @b{type-of} returns a particular @i{type} to ++which a given @i{object} belongs, even though that @i{object} ++must belong to one or more other @i{types} as well. ++(For example, every @i{object} is of @i{type} @b{t}, ++ but @b{type-of} always returns a @i{type specifier} ++ for a @i{type} more specific than @b{t}.) ++ ++@i{Objects}, not @i{variables}, have @i{types}. ++Normally, any @i{variable} can have any @i{object} as its @i{value}. ++It is possible to declare that a @i{variable} takes on only ++values of a given @i{type} by making an explicit @i{type declaration}. ++@i{Types} are arranged in a directed acyclic graph, except ++for the presence of equivalences. ++ ++@i{Declarations} can be made about @i{types} using @b{declare}, ++@b{proclaim}, @b{declaim}, or @b{the}. ++For more information about @i{declarations}, ++see @ref{Declarations}. ++ ++Among the fundamental @i{objects} of the object system are @i{classes}. ++A @i{class} determines the structure and behavior of a set of ++other @i{objects}, which are called its @i{instances}. ++Every @i{object} is a @i{direct instance} of a @i{class}. ++The @i{class} of an @i{object} determines the set of ++operations that can be performed on the @i{object}. ++For more information, see @ref{Classes}. ++ ++It is possible to write @i{functions} that have behavior @i{specialized} ++to the class of the @i{objects} which are their @i{arguments}. ++For more information, see @ref{Generic Functions and Methods}. ++ ++The @i{class} of the @i{class} of an @i{object} ++is called its @i{metaclass} ++@IGindex metaclass ++. ++For more information about @i{metaclasses}, ++see @ref{Meta-Objects}. ++ ++@c end of including concept-type-intro ++ ++@node Types, Classes, Introduction (Types and Classes), Types and Classes ++@section Types ++ ++@c including concept-types ++ ++@menu ++* Data Type Definition:: ++* Type Relationships:: ++* Type Specifiers:: ++@end menu ++ ++@node Data Type Definition, Type Relationships, Types, Types ++@subsection Data Type Definition ++ ++Information about @i{type} usage is located in ++the sections specified in @i{Figure~4--1}. ++@i{Figure~4--7} lists some @i{classes} ++that are particularly relevant to the object system. ++@i{Figure~9--1} lists the defined @i{condition} @i{types}. ++ ++@format ++@group ++@noindent ++@w{ @b{Section} Data Type } ++@w{ _________________________________________________________________________} ++@w{ @ref{Classes} Object System types } ++@w{ @ref{Slots} Object System types } ++@w{ @ref{Objects} Object System types } ++@w{ @ref{Generic Functions and Methods} Object System types } ++@w{ @ref{Condition System Concepts} Condition System types } ++@w{ @ref{Types and Classes} Miscellaneous types } ++@w{ @ref{Syntax} All types---read and print syntax } ++@w{ @ref{The Lisp Printer} All types---print syntax } ++@w{ @ref{Compilation} All types---compilation issues } ++ ++@noindent ++@w{ Figure 4--1: Cross-References to Data Type Information } ++ ++@end group ++@end format ++ ++@node Type Relationships, Type Specifiers, Data Type Definition, Types ++@subsection Type Relationships ++ ++@table @asis ++ ++@item @t{*} ++The @i{types} @b{cons}, @b{symbol}, @b{array}, @b{number}, ++@b{character}, @b{hash-table}, ++ ++@b{function}, ++ ++@b{readtable}, @b{package}, @b{pathname}, @b{stream}, ++@b{random-state}, @b{condition}, @b{restart}, ++and any single other @i{type} created by @b{defstruct}, ++ ++@b{define-condition}, ++ ++or @b{defclass} are @i{pairwise} @i{disjoint}, ++except for type relations explicitly established by specifying ++@i{superclasses} in @b{defclass} ++ ++or @b{define-condition} ++ ++or the @t{:include} option of @b{destruct}. ++ ++@item @t{*} ++Any two @i{types} created by @b{defstruct} are ++@i{disjoint} unless ++one is a @i{supertype} of the other by virtue of ++the @b{defstruct} @t{:include} option. ++ ++[Editorial Note by KMP: The comments in the source say gray suggested some change ++from ``common superclass'' to ``common subclass'' in the following, but the ++result looks suspicious to me.] ++ ++@item @t{*} ++Any two @i{distinct} @i{classes} created by @b{defclass} ++or @b{define-condition} ++are @i{disjoint} unless they have a common @i{subclass} or ++one @i{class} is a @i{subclass} of the other. ++ ++@item @t{*} ++An implementation may be extended to add other @i{subtype} ++relationships between the specified @i{types}, as long as they do ++not violate the type relationships and disjointness requirements ++specified here. An implementation may define additional @i{types} ++that are @i{subtypes} or @i{supertypes} of any ++specified @i{types}, as long as each additional @i{type} is ++a @i{subtype} of @i{type} @b{t} and a @i{supertype} of @i{type} @b{nil} and the disjointness requirements ++are not violated. ++ ++At the discretion of the implementation, either @b{standard-object} ++or @b{structure-object} might appear in any class precedence list ++for a @i{system class} that does not already specify either ++@b{standard-object} or @b{structure-object}. If it does, ++it must precede the @i{class} @b{t} and follow all other @i{standardized} @i{classes}. ++ ++@end table ++ ++@node Type Specifiers, , Type Relationships, Types ++@subsection Type Specifiers ++ ++@i{Type specifiers} can be @i{symbols}, @i{classes}, or @i{lists}. ++@i{Figure~4--2} lists @i{symbols} that are ++ @i{standardized} @i{atomic type specifiers}, and ++@i{Figure~4--3} lists ++ @i{standardized} @i{compound type specifier} @i{names}. ++For syntax information, see the dictionary entry for the corresponding @i{type specifier}. ++It is possible to define new @i{type specifiers} using ++ @b{defclass}, ++ @b{define-condition}, ++ @b{defstruct}, ++or ++ @b{deftype}. ++ ++@format ++@group ++@noindent ++@w{ arithmetic-error function simple-condition } ++@w{ array generic-function simple-error } ++@w{ atom hash-table simple-string } ++@w{ base-char integer simple-type-error } ++@w{ base-string keyword simple-vector } ++@w{ bignum list simple-warning } ++@w{ bit logical-pathname single-float } ++@w{ bit-vector long-float standard-char } ++@w{ broadcast-stream method standard-class } ++@w{ built-in-class method-combination standard-generic-function } ++@w{ cell-error nil standard-method } ++@w{ character null standard-object } ++@w{ class number storage-condition } ++@w{ compiled-function package stream } ++@w{ complex package-error stream-error } ++@w{ concatenated-stream parse-error string } ++@w{ condition pathname string-stream } ++@w{ cons print-not-readable structure-class } ++@w{ control-error program-error structure-object } ++@w{ division-by-zero random-state style-warning } ++@w{ double-float ratio symbol } ++@w{ echo-stream rational synonym-stream } ++@w{ end-of-file reader-error t } ++@w{ error readtable two-way-stream } ++@w{ extended-char real type-error } ++@w{ file-error restart unbound-slot } ++@w{ file-stream sequence unbound-variable } ++@w{ fixnum serious-condition undefined-function } ++@w{ float short-float unsigned-byte } ++@w{ floating-point-inexact signed-byte vector } ++@w{ floating-point-invalid-operation simple-array warning } ++@w{ floating-point-overflow simple-base-string } ++@w{ floating-point-underflow simple-bit-vector } ++ ++@noindent ++@w{ Figure 4--2: Standardized Atomic Type Specifiers } ++ ++@end group ++@end format ++ ++\indent ++If a @i{type specifier} is a @i{list}, the @i{car} of the @i{list} ++is a @i{symbol}, and the rest of the @i{list} is subsidiary ++@i{type} information. Such a @i{type specifier} is called ++a @i{compound type specifier} ++@IGindex compound type specifier ++. ++Except as explicitly stated otherwise, ++the subsidiary items can be unspecified. ++The unspecified subsidiary items are indicated ++by writing @t{*}. For example, to completely specify ++a @i{vector}, the @i{type} of the elements ++and the length of the @i{vector} must be present. ++ ++@example ++ (vector double-float 100) ++@end example ++ ++The following leaves the length unspecified: ++ ++@example ++ (vector double-float *) ++@end example ++ ++The following leaves the element type unspecified: ++ ++@example ++ (vector * 100) ++@end example ++ ++Suppose that two @i{type specifiers} are the same except that the first ++has a @t{*} where the second has a more explicit specification. ++Then the second denotes a @i{subtype} ++of the @i{type} denoted by the first. ++ ++If a @i{list} has one or more unspecified items at the end, ++those items can be dropped. ++If dropping all occurrences of @t{*} results in a @i{singleton} @i{list}, ++then the parentheses can be dropped as well (the list can be replaced ++by the @i{symbol} in its @i{car}). ++For example, ++@t{(vector double-float *)} ++can be abbreviated to @t{(vector double-float)}, ++and @t{(vector * *)} can be abbreviated to @t{(vector)} ++and then to ++@t{vector}. ++ ++@format ++@group ++@noindent ++@w{ and long-float simple-base-string } ++@w{ array member simple-bit-vector } ++@w{ base-string mod simple-string } ++@w{ bit-vector not simple-vector } ++@w{ complex or single-float } ++@w{ cons rational string } ++@w{ double-float real unsigned-byte } ++@w{ eql satisfies values } ++@w{ float short-float vector } ++@w{ function signed-byte } ++@w{ integer simple-array } ++ ++@noindent ++@w{ Figure 4--3: Standardized Compound Type Specifier Names} ++ ++@end group ++@end format ++ ++Figure 4--4 show the @i{defined names} that can be used as ++@i{compound type specifier} @i{names} ++but that cannot be used as @i{atomic type specifiers}. ++ ++@format ++@group ++@noindent ++@w{ and mod satisfies } ++@w{ eql not values } ++@w{ member or } ++ ++@noindent ++@w{ Figure 4--4: Standardized Compound-Only Type Specifier Names} ++ ++@end group ++@end format ++ ++New @i{type specifiers} can come into existence in two ways. ++@table @asis ++ ++@item @t{*} ++Defining a structure by using @b{defstruct} without using ++ the @t{:type} specifier or defining a @i{class} by using ++ @b{defclass} ++ or @b{define-condition} ++ automatically causes the name of the structure ++ or class to be a new @i{type specifier} @i{symbol}. ++@item @t{*} ++@b{deftype} can be used to define @i{derived type specifiers} ++@IGindex derived type specifier ++, ++ which act as `abbreviations' for other @i{type specifiers}. ++@end table ++ ++A @i{class} @i{object} can be used as a @i{type specifier}. ++When used this way, it denotes the set of all members of that @i{class}. ++ ++Figure 4--5 shows some @i{defined names} relating to ++@i{types} and @i{declarations}. ++ ++@format ++@group ++@noindent ++@w{ coerce defstruct subtypep } ++@w{ declaim deftype the } ++@w{ declare ftype type } ++@w{ defclass locally type-of } ++@w{ define-condition proclaim typep } ++ ++@noindent ++@w{ Figure 4--5: Defined names relating to types and declarations.} ++ ++@end group ++@end format ++ ++Figure 4--6 shows all @i{defined names} that are @i{type specifier} @i{names}, ++whether for @i{atomic type specifiers} or @i{compound type specifiers}; ++this list is the union of the lists in @i{Figure~4--2} ++and @i{Figure~4--3}. ++ ++@format ++@group ++@noindent ++@w{ and function simple-array } ++@w{ arithmetic-error generic-function simple-base-string } ++@w{ array hash-table simple-bit-vector } ++@w{ atom integer simple-condition } ++@w{ base-char keyword simple-error } ++@w{ base-string list simple-string } ++@w{ bignum logical-pathname simple-type-error } ++@w{ bit long-float simple-vector } ++@w{ bit-vector member simple-warning } ++@w{ broadcast-stream method single-float } ++@w{ built-in-class method-combination standard-char } ++@w{ cell-error mod standard-class } ++@w{ character nil standard-generic-function } ++@w{ class not standard-method } ++@w{ compiled-function null standard-object } ++@w{ complex number storage-condition } ++@w{ concatenated-stream or stream } ++@w{ condition package stream-error } ++@w{ cons package-error string } ++@w{ control-error parse-error string-stream } ++@w{ division-by-zero pathname structure-class } ++@w{ double-float print-not-readable structure-object } ++@w{ echo-stream program-error style-warning } ++@w{ end-of-file random-state symbol } ++@w{ eql ratio synonym-stream } ++@w{ error rational t } ++@w{ extended-char reader-error two-way-stream } ++@w{ file-error readtable type-error } ++@w{ file-stream real unbound-slot } ++@w{ fixnum restart unbound-variable } ++@w{ float satisfies undefined-function } ++@w{ floating-point-inexact sequence unsigned-byte } ++@w{ floating-point-invalid-operation serious-condition values } ++@w{ floating-point-overflow short-float vector } ++@w{ floating-point-underflow signed-byte warning } ++ ++@noindent ++@w{ Figure 4--6: Standardized Type Specifier Names } ++ ++@end group ++@end format ++ ++@c end of including concept-types ++ ++@node Classes, Types and Classes Dictionary, Types, Types and Classes ++@section Classes ++ ++@c including concept-classes ++ ++While the object system is general enough to describe all @i{standardized} @i{classes} ++(including, for example, @b{number}, @b{hash-table}, and ++@b{symbol}), Figure 4--7 contains a list of @i{classes} that are ++especially relevant to understanding the object system. ++ ++@format ++@group ++@noindent ++@w{ built-in-class method-combination standard-object } ++@w{ class standard-class structure-class } ++@w{ generic-function standard-generic-function structure-object } ++@w{ method standard-method } ++ ++@noindent ++@w{ Figure 4--7: Object System Classes } ++ ++@end group ++@end format ++ ++@menu ++* Introduction to Classes:: ++* Defining Classes:: ++* Creating Instances of Classes:: ++* Inheritance:: ++* Determining the Class Precedence List:: ++* Redefining Classes:: ++* Integrating Types and Classes:: ++@end menu ++ ++@node Introduction to Classes, Defining Classes, Classes, Classes ++@subsection Introduction to Classes ++ ++A @i{class} ++@IGindex class ++ is an @i{object} that determines the structure and behavior ++of a set of other @i{objects}, which are called its @i{instances} ++@IGindex instance ++. ++ ++A @i{class} can inherit structure and behavior from other @i{classes}. ++A @i{class} whose definition refers to other @i{classes} for the purpose ++of inheriting from them is said to be a @i{subclass} of each of ++those @i{classes}. The @i{classes} that are designated for purposes of ++inheritance are said to be @i{superclasses} of the inheriting @i{class}. ++ ++A @i{class} can have a @i{name}. The @i{function} @b{class-name} ++takes a @i{class} @i{object} and returns its @i{name}. ++The @i{name} of an anonymous @i{class} is @b{nil}. A @i{symbol} ++can @i{name} a @i{class}. The @i{function} @b{find-class} takes a ++@i{symbol} and returns the @i{class} that the @i{symbol} names. ++A @i{class} has a @i{proper name} if the @i{name} is a @i{symbol} ++and if the @i{name} of the @i{class} names that @i{class}. ++That is, a @i{class}~C has the @i{proper name}~S if S= ++@t{(class-name C)} and C= @t{(find-class S)}. ++Notice that it is possible for ++@t{(find-class S_1)} = @t{(find-class S_2)} ++and S_1!= S_2. ++If C= @t{(find-class S)}, we say that C is the @i{class} @i{named} S. ++ ++A @i{class} C_1 is ++a @i{direct superclass} ++@IGindex direct superclass ++ of a @i{class} C_2 ++if C_2 explicitly designates C_1 ++as a @i{superclass} in its definition. ++In this case C_2 is a @i{direct subclass} ++@IGindex direct subclass ++ of C_1. ++A @i{class} C_n is a @i{superclass} ++@IGindex superclass ++ of ++a @i{class} C_1 if there exists a series of ++@i{classes} C_2,...,C_@{n-1@} such that ++C_@{i+1@} is a @i{direct superclass} of C_i for 1 <= i= 2, be ++the @i{classes} from S_C with no predecessors. Let (C_1... C_n), n>= 1, be the @i{class precedence list} ++constructed so far. C_1 is the most specific @i{class}, and C_n is the least specific. Let 1<= j<= n be the largest number ++such that there exists an i where 1<= i<= m and N_i ++is a direct @i{superclass} of C_j; N_i is placed next. ++ ++The effect of this rule for selecting from a set of @i{classes} with no ++predecessors is that the @i{classes} in a simple @i{superclass} chain are ++adjacent in the @i{class precedence list} and that @i{classes} in each ++relatively separated subgraph are adjacent in the @i{class precedence list}. ++For example, let T_1 and T_2 be subgraphs whose only ++element in common is the class J. ++Suppose that no superclass of J appears in either T_1 or T_2, ++and that J is in the superclass chain of every class in both T_1 and T_2. ++ Let C_1 be the bottom of T_1; ++and let C_2 be the bottom of T_2. ++Suppose C is a @i{class} whose direct @i{superclasses} ++are C_1 and C_2 in that order, then the @i{class precedence list} ++for C starts with C and is followed by ++all @i{classes} in T_1 except J. ++All the @i{classes} of T_2 are next. ++The @i{class} J and its @i{superclasses} appear last. ++ ++@node Examples of Class Precedence List Determination, , Topological Sorting, Determining the Class Precedence List ++@subsubsection Examples of Class Precedence List Determination ++ ++This example determines a @i{class precedence list} for the ++class @t{pie}. The following @i{classes} are defined: ++ ++@example ++ (defclass pie (apple cinnamon) ()) ++ ++ (defclass apple (fruit) ()) ++ ++ (defclass cinnamon (spice) ()) ++ ++ (defclass fruit (food) ()) ++ ++ (defclass spice (food) ()) ++ ++ (defclass food () ()) ++@end example ++ ++The set S_@{pie@}~= @{pie, apple, cinnamon, fruit, spice, food, ++standard-object, t @}. The set R~= @{ (pie, apple), ++(apple, cinnamon), (apple, fruit), (cinnamon, spice), \break ++(fruit, food), (spice, food), (food, standard-object), (standard-object, ++t) @}. ++ ++The class @t{pie} is not preceded by anything, so it comes first; ++the result so far is @t{(pie)}. Remove @t{pie} from S and pairs ++mentioning @t{pie} from R to get S~= @{apple, cinnamon, ++fruit, spice, food, standard-object, t @} and R~=~@{(apple, cinnamon), (apple, fruit), (cinnamon, spice),\break (fruit, ++food), (spice, food), (food, standard-object), ++(standard-object, t) @}. ++ ++The class @t{apple} is not preceded by anything, so it is next; the ++result is @t{(pie apple)}. Removing @t{apple} and the relevant ++pairs results in S~= @{ cinnamon, fruit, spice, food, ++standard-object, t @} and R~= @{ (cinnamon, spice), ++(fruit, food), (spice, food), (food, standard-object),\break ++(standard-object, t) @}. ++ ++The classes @t{cinnamon} and @t{fruit} are not preceded by ++anything, so the one with a direct @i{subclass} rightmost in the ++@i{class precedence list} computed so far goes next. The class @t{apple} is a ++direct @i{subclass} of @t{fruit}, and the class @t{pie} is a direct ++@i{subclass} of @t{cinnamon}. Because @t{apple} appears to the right ++of @t{pie} in the @i{class precedence list}, ++@t{fruit} goes next, and the ++result so far is @t{(pie apple fruit)}. S~= @{ cinnamon, ++spice, food, standard-object, t @}; R~= @{(cinnamon, ++spice), (spice, food),\break (food, standard-object), ++(standard-object, t) @}. ++ ++The class @t{cinnamon} is next, giving the result so far as @t{(pie apple fruit cinnamon)}. At this point S~= @{ spice, ++food, standard-object, t @}; R~= @{ (spice, food), (food, ++standard-object), (standard-object, t) @}. ++ ++The classes @t{spice}, @t{food}, @b{standard-object}, and ++@b{t} are added in that order, and the @i{class precedence list} ++is @t{(pie apple fruit cinnamon spice food standard-object t)}. ++ ++It is possible to write a set of @i{class} definitions that cannot be ++ordered. For example: ++ ++@example ++ (defclass new-class (fruit apple) ()) ++ ++ (defclass apple (fruit) ()) ++@end example ++ ++The class @t{fruit} must precede @t{apple} ++because the local ordering of @i{superclasses} must be preserved. ++The class @t{apple} must precede @t{fruit} ++because a @i{class} always precedes its own @i{superclasses}. ++When this situation occurs, an error is signaled, as happens here ++when the system tries to compute the @i{class precedence list} ++of @t{new-class}. ++ ++The following might appear to be a conflicting set of definitions: ++ ++@example ++ (defclass pie (apple cinnamon) ()) ++ ++ (defclass pastry (cinnamon apple) ()) ++ ++ (defclass apple () ()) ++ ++ (defclass cinnamon () ()) ++@end example ++ ++The @i{class precedence list} for @t{pie} is ++@t{(pie apple cinnamon standard-object t)}. ++ ++The @i{class precedence list} for @t{pastry} is ++@t{(pastry cinnamon apple standard-object t)}. ++ ++It is not a problem for @t{apple} to precede @t{cinnamon} in the ++ordering of the @i{superclasses} of @t{pie} but not in the ordering for ++@t{pastry}. However, it is not possible to build a new @i{class} that ++has both @t{pie} and @t{pastry} as @i{superclasses}. ++ ++@node Redefining Classes, Integrating Types and Classes, Determining the Class Precedence List, Classes ++@subsection Redefining Classes ++ ++A @i{class} that is a @i{direct instance} of @b{standard-class} can ++be redefined if the new @i{class} is also ++a @i{direct instance} of @b{standard-class}. ++Redefining a @i{class} modifies the existing ++@i{class} @i{object} to reflect the new @i{class} definition; it does not ++create a new @i{class} @i{object} for the @i{class}. ++Any @i{method} @i{object} created by a @t{:reader}, @t{:writer}, ++or @t{:accessor} option specified by the old @b{defclass} form is ++removed from the corresponding @i{generic function}. ++@i{Methods} specified by the new @b{defclass} form are added. ++ ++When the class C is redefined, changes are propagated to its @i{instances} ++and to @i{instances} of any of its @i{subclasses}. Updating such an ++@i{instance} occurs at an @i{implementation-dependent} time, but no later than ++the next time a @i{slot} ++of that @i{instance} is read or written. Updating an ++@i{instance} ++does not change its identity as defined by the @i{function} @b{eq}. ++The updating process may change the @i{slots} of that ++particular @i{instance}, ++but it does not create a new @i{instance}. Whether ++updating an @i{instance} consumes storage is @i{implementation-dependent}. ++ ++Note that redefining a @i{class} may cause @i{slots} to be added or ++deleted. If a @i{class} is redefined in a way that changes the set of ++@i{local slots} @i{accessible} in @i{instances}, the @i{instances} ++are updated. It is @i{implementation-dependent} whether @i{instances} ++are updated if a @i{class} is redefined in a way that does not change ++the set of @i{local slots} @i{accessible} in @i{instances}. ++ ++The value of a @i{slot} ++that is specified as shared both in the old @i{class} ++and in the new @i{class} is retained. ++If such a @i{shared slot} was unbound ++in the old @i{class}, it is unbound in the new @i{class}. ++@i{Slots} that ++were local in the old @i{class} and that are shared in the new ++@i{class} are ++initialized. Newly added @i{shared slots} are initialized. ++ ++Each newly added @i{shared slot} is set to the result of evaluating the ++@i{captured initialization form} for the @i{slot} that was specified ++in the @b{defclass} @i{form} for the new @i{class}. ++If there was no @i{initialization form}, the @i{slot} is unbound. ++ ++If a @i{class} is redefined in such a way that the set of ++@i{local slots} @i{accessible} in an @i{instance} of the @i{class} ++is changed, a two-step process of updating the @i{instances} of the ++@i{class} takes place. The process may be explicitly started by ++invoking the generic function @b{make-instances-obsolete}. This ++two-step process can happen in other circumstances in some implementations. ++For example, in some implementations this two-step process is ++triggered if the order of @i{slots} in storage is changed. ++ ++The first step modifies the structure of the @i{instance} by adding new ++@i{local slots} and discarding @i{local slots} that are not ++defined in the new version of the @i{class}. The second step ++initializes the newly-added @i{local slots} and performs any other ++user-defined actions. These two steps are further specified ++in the next two sections. ++ ++@menu ++* Modifying the Structure of Instances:: ++* Initializing Newly Added Local Slots (Redefining Classes):: ++* Customizing Class Redefinition:: ++@end menu ++ ++@node Modifying the Structure of Instances, Initializing Newly Added Local Slots (Redefining Classes), Redefining Classes, Redefining Classes ++@subsubsection Modifying the Structure of Instances ++ ++[Reviewer Note by Barmar: What about shared slots that are deleted?] ++ ++The first step modifies the structure of @i{instances} of the redefined ++@i{class} to conform to its new @i{class} definition. ++@i{Local slots} specified ++by the new @i{class} definition that are not specified as either local or ++shared by the old @i{class} are added, and @i{slots} ++not specified as either ++local or shared by the new @i{class} definition that are specified as ++local by the old @i{class} are discarded. ++The @i{names} of these added and discarded ++@i{slots} are passed as arguments ++to @b{update-instance-for-redefined-class} ++as described in the next section. ++ ++The values of @i{local slots} specified by both the new and old ++@i{classes} are retained. If such a @i{local slot} was unbound, ++it remains unbound. ++ ++The value of a @i{slot} that is specified as shared in the old ++@i{class} and as local in the new @i{class} is retained. If such ++a @i{shared slot} was unbound, the @i{local slot} is unbound. ++ ++@node Initializing Newly Added Local Slots (Redefining Classes), Customizing Class Redefinition, Modifying the Structure of Instances, Redefining Classes ++@subsubsection Initializing Newly Added Local Slots ++ ++The second step initializes the newly added @i{local slots} and performs ++any other user-defined actions. This step is implemented by the generic ++function @b{update-instance-for-redefined-class}, which is called after ++completion of the first step of modifying the structure of the ++@i{instance}. ++ ++The generic function @b{update-instance-for-redefined-class} takes ++four required arguments: the @i{instance} being updated after it has ++undergone the first step, a list of the names of @i{local slots} that were ++added, a list of the names of @i{local slots} that were discarded, and a ++property list containing the @i{slot} names and values of ++@i{slots} that were ++discarded and had values. Included among the discarded @i{slots} are ++@i{slots} that were local in the old @i{class} and that are shared in the new ++@i{class}. ++ ++The generic function @b{update-instance-for-redefined-class} also ++takes any number of initialization arguments. When it is called by ++the system to update an @i{instance} whose @i{class} ++has been redefined, no ++initialization arguments are provided. ++ ++There is a system-supplied primary @i{method} for ++@b{update-instance-for-redefined-class} whose @i{parameter specializer} ++for its @i{instance} argument is the @i{class} @b{standard-object}. ++First this @i{method} checks the validity of initialization arguments and signals an ++error if an initialization argument is supplied that is not declared ++as valid. (For more information, see @ref{Declaring the Validity of Initialization Arguments}.) ++Then it calls the generic function ++@b{shared-initialize} with the following arguments: the ++@i{instance}, ++the list of @i{names} of ++the newly added @i{slots}, and the initialization ++arguments it received. ++ ++@node Customizing Class Redefinition, , Initializing Newly Added Local Slots (Redefining Classes), Redefining Classes ++@subsubsection Customizing Class Redefinition ++ ++[Reviewer Note by Barmar: This description is hard to follow.] ++ ++@i{Methods} for @b{update-instance-for-redefined-class} may be ++defined to specify actions to be taken when an @i{instance} is updated. ++If only @i{after methods} for @b{update-instance-for-redefined-class} are ++defined, they will be run after the system-supplied primary @i{method} for ++initialization and therefore will not interfere with the default ++behavior of @b{update-instance-for-redefined-class}. Because no ++initialization arguments are passed to @b{update-instance-for-redefined-class} ++when it is called by the system, the ++@i{initialization forms} for @i{slots} ++that are filled by @i{before methods} for @b{update-instance-for-redefined-class} ++will not be evaluated by @b{shared-initialize}. ++ ++@i{Methods} for @b{shared-initialize} may be defined to customize ++@i{class} redefinition. For more information, see @ref{Shared-Initialize}. ++ ++@node Integrating Types and Classes, , Redefining Classes, Classes ++@subsection Integrating Types and Classes ++ ++The object system maps the space of @i{classes} into the space of @i{types}. ++Every @i{class} that has a proper name has a corresponding @i{type} ++with the same @i{name}. ++ ++The proper name of every @i{class} is a valid @i{type specifier}. In ++addition, every @i{class} @i{object} is a valid @i{type specifier}. ++Thus the expression @t{(typep @i{object} @i{class})} evaluates to ++@i{true} if the @i{class} of @i{object} is @i{class} itself or ++a @i{subclass} of @i{class}. The evaluation of the expression ++@t{(subtypep class1 class2)} returns the values ++@i{true} and @i{true} if @t{class1} is a subclass of @t{class2} or if they are the ++same @i{class}; otherwise it returns the values ++@i{false} and @i{true}. ++If I is an @i{instance} of some @i{class} C named S ++and C is an @i{instance} of @b{standard-class}, ++the evaluation of the expression @t{(type-of I\/)} returns S ++if S is the @i{proper name} of C; ++otherwise, it returns C. ++ ++Because the names of @i{classes} ++and @i{class} @i{objects} are @i{type specifiers}, they may ++be used in the special form @b{the} and in type declarations. ++ ++Many but not all of the predefined @i{type specifiers} have a ++corresponding @i{class} with ++the same proper name as the @i{type}. These type ++specifiers are listed in @i{Figure~4--8}. ++For example, the @i{type} @b{array} has ++a corresponding @i{class} named @b{array}. ++No @i{type specifier} that is a ++list, such as @t{(vector double-float 100)}, has a corresponding @i{class}. ++The @i{operator} @b{deftype} does not create any @i{classes}. ++ ++Each @i{class} that corresponds to a predefined @i{type specifier} can ++be implemented in one of three ways, at the discretion of each implementation. ++It can be a @i{standard class}, ++a @i{structure class}, ++ ++or a @i{system class}. ++ ++A @i{built-in class} is one whose @i{generalized instances} have restricted capabilities ++or special representations. Attempting to use @b{defclass} to define ++@i{subclasses} of a @b{built-in-class} signals an error. ++Calling @b{make-instance} to create a @i{generalized instance} of a ++@i{built-in class} signals an error. Calling @b{slot-value} on a ++@i{generalized instance} of a @i{built-in class} signals an error. ++Redefining a @i{built-in class} or using @b{change-class} to change ++the @i{class} of an @i{object} to or from a @i{built-in class} signals an error. ++However, @i{built-in classes} can be used as @i{parameter specializers} ++in @i{methods}. ++ ++It is possible to determine whether a @i{class} is a @i{built-in class} ++by checking the @i{metaclass}. ++A @i{standard class} is an @i{instance} of the @i{class} @b{standard-class}, ++a @i{built-in class} is an @i{instance} of the @i{class} @b{built-in-class}, and ++a @i{structure class} is an @i{instance} of the @i{class} @b{structure-class}. ++ ++Each @i{structure} @i{type} created by @b{defstruct} without ++using the @t{:type} option has a corresponding @i{class}. ++This @i{class} is a @i{generalized instance} of the @i{class} @b{structure-class}. ++The @t{:include} option of @b{defstruct} creates a direct ++@i{subclass} of the @i{class} ++that corresponds to the included @i{structure} ++@i{type}. ++ ++It is @i{implementation-dependent} whether @i{slots} are involved in the ++operation of @i{functions} defined in this specification ++on @i{instances} of @i{classes} defined in this specification, ++except when @i{slots} are explicitly defined by this specification. ++ ++If in a particular @i{implementation} a @i{class} defined in this specification ++has @i{slots} that are not defined by this specfication, the names of these @i{slots} ++must not be @i{external symbols} of @i{packages} defined in this specification nor ++otherwise @i{accessible} in the @t{CL-USER} @i{package}. ++ ++The purpose of specifying that many of the standard @i{type specifiers} have a ++corresponding @i{class} is to enable users to write @i{methods} that ++discriminate on these @i{types}. @i{Method} selection requires that a ++@i{class precedence list} can be determined for each @i{class}. ++ ++The hierarchical relationships among the @i{type specifiers} are mirrored by ++relationships among the @i{classes} corresponding to those @i{types}. ++ ++@i{Figure~4--8} lists the set of @i{classes} ++that correspond to predefined @i{type specifiers}. ++ ++@format ++@group ++@noindent ++@w{ arithmetic-error generic-function simple-error } ++@w{ array hash-table simple-type-error } ++@w{ bit-vector integer simple-warning } ++@w{ broadcast-stream list standard-class } ++@w{ built-in-class logical-pathname standard-generic-function } ++@w{ cell-error method standard-method } ++@w{ character method-combination standard-object } ++@w{ class null storage-condition } ++@w{ complex number stream } ++@w{ concatenated-stream package stream-error } ++@w{ condition package-error string } ++@w{ cons parse-error string-stream } ++@w{ control-error pathname structure-class } ++@w{ division-by-zero print-not-readable structure-object } ++@w{ echo-stream program-error style-warning } ++@w{ end-of-file random-state symbol } ++@w{ error ratio synonym-stream } ++@w{ file-error rational t } ++@w{ file-stream reader-error two-way-stream } ++@w{ float readtable type-error } ++@w{ floating-point-inexact real unbound-slot } ++@w{ floating-point-invalid-operation restart unbound-variable } ++@w{ floating-point-overflow sequence undefined-function } ++@w{ floating-point-underflow serious-condition vector } ++@w{ function simple-condition warning } ++ ++@noindent ++@w{ Figure 4--8: Classes that correspond to pre-defined type specifiers } ++ ++@end group ++@end format ++ ++The @i{class precedence list} information specified in the entries for ++each of these @i{classes} are those that are required by the object system. ++ ++Individual implementations may be extended to define other type ++specifiers to have a corresponding @i{class}. Individual implementations ++may be extended to add other @i{subclass} relationships and to add other ++@i{elements} to the @i{class precedence lists} as long as ++they do not violate the type relationships and disjointness ++requirements specified by this standard. ++A standard @i{class} defined with no direct @i{superclasses} is guaranteed to ++be disjoint from all of the @i{classes} in the table, except for the ++class named @b{t}. ++ ++@c end of including concept-classes ++ ++@node Types and Classes Dictionary, , Classes, Types and Classes ++@section Types and Classes Dictionary ++ ++@c including dict-types ++ ++@menu ++* nil (Type):: ++* boolean:: ++* function (System Class):: ++* compiled-function:: ++* generic-function:: ++* standard-generic-function:: ++* class:: ++* built-in-class:: ++* structure-class:: ++* standard-class:: ++* method:: ++* standard-method:: ++* structure-object:: ++* standard-object:: ++* method-combination:: ++* t (System Class):: ++* satisfies:: ++* member (Type Specifier):: ++* not (Type Specifier):: ++* and (Type Specifier):: ++* or (Type Specifier):: ++* values (Type Specifier):: ++* eql (Type Specifier):: ++* coerce:: ++* deftype:: ++* subtypep:: ++* type-of:: ++* typep:: ++* type-error:: ++* type-error-datum:: ++* simple-type-error:: ++@end menu ++ ++@node nil (Type), boolean, Types and Classes Dictionary, Types and Classes Dictionary ++@subsection nil [Type] ++ ++@subsubheading Supertypes:: ++all @i{types} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{nil} contains no @i{objects} and so is also ++called the @i{empty type}. ++The @i{type} @b{nil} is a @i{subtype} of every @i{type}. ++No @i{object} is of @i{type} @b{nil}. ++ ++@subsubheading Notes:: ++ ++The @i{type} containing the @i{object} @b{nil} is the @i{type} @b{null}, ++not the @i{type} @b{nil}. ++ ++@node boolean, function (System Class), nil (Type), Types and Classes Dictionary ++@subsection boolean [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{boolean}, ++@b{symbol}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{boolean} contains the @i{symbols} @b{t} and @b{nil}, ++which represent true and false, respectively. ++ ++@subsubheading See Also:: ++ ++@b{t} (@i{constant variable}), ++@b{nil} (@i{constant variable}), ++@ref{if} ++, ++@ref{not} ++, ++@ref{complement} ++ ++@subsubheading Notes:: ++ ++Conditional operations, such as @b{if}, ++permit the use of @i{generalized booleans}, ++not just @i{booleans}; ++any @i{non-nil} value, ++not just @b{t}, ++counts as true for a @i{generalized boolean}. ++However, as a matter of convention, ++the @i{symbol} @b{t} is considered the canonical value to use ++even for a @i{generalized boolean} when no better choice presents itself. ++ ++@node function (System Class), compiled-function, boolean, Types and Classes Dictionary ++@subsection function [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{function}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{function} is an @i{object} that represents code ++to be executed when an appropriate number of arguments is supplied. ++A @i{function} is produced by ++ the @b{function} @i{special form}, ++ the @i{function} @b{coerce}, ++ ++or ++ the @i{function} @b{compile}. ++A @i{function} can be directly invoked by using it as the first argument to ++@b{funcall}, @b{apply}, or @b{multiple-value-call}. ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{function}@{@i{@t{[}arg-typespec @r{[}value-typespec@r{]}@t{]}}@}) ++ ++@w{@i{arg-typespec} ::=@r{(}@{@i{typespec}@}* } ++@w{ @t{[}@r{&optional} @{@i{typespec}@}*@t{]} } ++@w{ @t{[}@r{&rest} @i{typespec}@t{]} } ++@w{ @t{[}@r{&key} @{@r{(}keyword typespec @r{)}@}*@t{]}@r{)}} ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@i{value-typespec}---a @i{type specifier}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++[Editorial Note by KMP: Isn't there some context info about ftype declarations to be merged here?] ++ ++[Editorial Note by KMP: This could still use some cleaning up.] ++ ++[Editorial Note by Sandra: Still need clarification about what happens if the ++number of arguments doesn't match the FUNCTION type declaration.] ++ ++The list form of the @b{function} @i{type-specifier} ++can be used only for declaration and not for discrimination. ++Every element of this @i{type} is ++a @i{function} that accepts arguments of the ++types ++specified by the @i{argj-types} and returns values that are ++members of the @i{types} specified by @i{value-type}. The ++@b{&optional}, @b{&rest}, @b{&key}, ++ ++and @b{&allow-other-keys} ++ ++markers can appear in the list of argument types. ++ ++The @i{type specifier} provided ++with @b{&rest} is the @i{type} ++of each actual argument, not the @i{type} of the ++corresponding variable. ++ ++The @b{&key} parameters ++should be supplied as lists of the form @t{(@i{keyword} @i{type})}. ++The @i{keyword} must be a valid keyword-name symbol ++as must be supplied in the actual arguments of a ++call. ++ ++This is usually a @i{symbol} in the @t{KEYWORD} @i{package} but can be any @i{symbol}. ++ ++When @b{&key} is given in a ++@b{function} @i{type specifier} @i{lambda list}, ++the @i{keyword parameters} given ++are exhaustive unless @b{&allow-other-keys} is also present. ++@b{&allow-other-keys} is an indication ++that other keyword arguments might actually be ++supplied and, if supplied, can be used. ++For example, ++the @i{type} of the @i{function} @b{make-list} could be declared as follows: ++ ++@example ++ (function ((integer 0) &key (:initial-element t)) list) ++@end example ++ ++The @i{value-type} can be a @b{values} ++@i{type specifier} in order to indicate the ++@i{types} of @i{multiple values}. ++ ++Consider a declaration of the following form: ++ ++@example ++ (ftype (function (arg0-type arg1-type ...) val-type) f)) ++@end example ++ ++Any @i{form} ++@t{(f arg0 arg1 ...)} ++within the scope of ++that declaration is equivalent to the following: ++ ++@example ++ (the val-type (f (the arg0-type arg0) (the arg1-type arg1) ...)) ++@end example ++ ++That is, the consequences are undefined if any of the arguments are ++not of the specified @i{types} or the result is not of the ++specified @i{type}. In particular, if any argument is not of the ++correct @i{type}, the result is not guaranteed to be of the ++specified @i{type}. ++ ++Thus, an @b{ftype} declaration for a @i{function} ++describes @i{calls} to the @i{function}, not the actual definition ++of the @i{function}. ++ ++Consider a declaration of the following form: ++ ++@example ++ (type (function (arg0-type arg1-type ...) val-type) fn-valued-variable) ++@end example ++ ++This declaration has the interpretation that, within the scope of the ++declaration, the consequences are unspecified if the value of @t{fn-valued-variable} is called with arguments not of the specified ++@i{types}; the value resulting from a valid call will be of type ++@t{val-type}. ++ ++As with variable type declarations, nested declarations ++imply intersections of @i{types}, as follows: ++@table @asis ++ ++@item @t{*} ++Consider the following two ++declarations of @b{ftype}: ++ ++@example ++ (ftype (function (arg0-type1 arg1-type1 ...) val-type1) f)) ++@end example ++ ++and ++ ++@example ++ (ftype (function (arg0-type2 arg1-type2 ...) val-type2) f)) ++@end example ++ ++If both these declarations are in effect, ++then within the shared scope of the declarations, calls to @t{f} can be ++treated as if @t{f} were declared as follows: ++ ++@example ++ (ftype (function ((and arg0-type1 arg0-type2) (and arg1-type1 arg1-type2 ...) ...) ++ (and val-type1 val-type2)) ++ f)) ++@end example ++ ++It is permitted to ignore one or all of the @b{ftype} declarations in force. ++ ++@item @t{*} ++If two (or more) type declarations are in effect for a variable, and ++they are both @t{function} declarations, the declarations combine similarly. ++@end table ++ ++@node compiled-function, generic-function, function (System Class), Types and Classes Dictionary ++@subsection compiled-function [Type] ++ ++@subsubheading Supertypes:: ++ ++@b{compiled-function}, ++@b{function}, ++@b{t} ++ ++@subsubheading Description:: ++ ++Any @i{function} may be considered by an @i{implementation} to be a ++a @i{compiled function} if it contains no references to @i{macros} that ++must be expanded at run time, and it contains no unresolved references ++to @i{load time values}. See @ref{Compilation Semantics}. ++ ++@i{Functions} whose definitions appear lexically within a ++@i{file} that has been @i{compiled} with @b{compile-file} and then ++@i{loaded} with @b{load} are of @i{type} @b{compiled-function}. ++ ++@i{Functions} produced by the @b{compile} function ++are of @i{type} @b{compiled-function}. ++ ++Other @i{functions} might also be of @i{type} @b{compiled-function}. ++ ++@node generic-function, standard-generic-function, compiled-function, Types and Classes Dictionary ++@subsection generic-function [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{generic-function}, ++@b{function}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{generic function} ++@IGindex generic function ++ is a @i{function} whose behavior ++depends on the @i{classes} or identities of the @i{arguments} ++supplied to it. A generic function object contains a set of ++@i{methods}, a @i{lambda list}, a @i{method combination} @i{type}, ++and other information. The @i{methods} ++define the class-specific behavior and operations of the @i{generic function}; ++a @i{method} is said to @i{specialize} a @i{generic function}. ++When invoked, a @i{generic function} executes a subset of its ++@i{methods} based on the @i{classes} or identities of its @i{arguments}. ++ ++A @i{generic function} can be used in the same ways that an ++ordinary @i{function} can be used; specifically, a @i{generic function} can ++be used as an argument to @b{funcall} and @b{apply}, ++and can be given a global or a local name. ++ ++@node standard-generic-function, class, generic-function, Types and Classes Dictionary ++@subsection standard-generic-function [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{standard-generic-function}, ++@b{generic-function}, ++@b{function}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{class} @b{standard-generic-function} is the default @i{class} of ++@i{generic functions} @i{established} by ++@b{defmethod}, ++@b{ensure-generic-function}, ++@b{defgeneric}, ++ ++and ++@b{defclass} @i{forms}. ++ ++@node class, built-in-class, standard-generic-function, Types and Classes Dictionary ++@subsection class [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{class}, ++ ++@b{standard-object}, ++ ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{class} represents @i{objects} that determine the structure ++and behavior of their @i{instances}. Associated with an @i{object} ++of @i{type} @b{class} is information describing its place in the ++directed acyclic graph of @i{classes}, its @i{slots}, and its options. ++ ++@node built-in-class, structure-class, class, Types and Classes Dictionary ++@subsection built-in-class [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{built-in-class}, ++@b{class}, ++ ++@b{standard-object}, ++ ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{built-in class} is a @i{class} whose @i{instances} have ++restricted capabilities or special representations. ++Attempting to use ++@b{defclass} to define @i{subclasses} of a @i{built-in class} ++signals an error of @i{type} @b{error}. ++Calling @b{make-instance} to create an @i{instance} ++of a @i{built-in class} signals an error of @i{type} @b{error}. ++Calling @b{slot-value} on an @i{instance} of a @i{built-in class} ++signals an error of @i{type} @b{error}. Redefining a @i{built-in class} ++or using @b{change-class} to change the @i{class} of an @i{instance} ++to or from a @i{built-in class} signals an error of @i{type} @b{error}. ++However, @i{built-in classes} can be used as @i{parameter specializers} ++in @i{methods}. ++ ++@node structure-class, standard-class, built-in-class, Types and Classes Dictionary ++@subsection structure-class [System Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{structure-class}, ++@b{class}, ++ ++@b{standard-object}, ++ ++@b{t} ++ ++@subsubheading Description:: ++ ++All @i{classes} defined by means of @b{defstruct} ++are @i{instances} of the @i{class} @b{structure-class}. ++ ++@node standard-class, method, structure-class, Types and Classes Dictionary ++@subsection standard-class [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{standard-class}, ++@b{class}, ++ ++@b{standard-object}, ++ ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{class} @b{standard-class} is the default @i{class} of @i{classes} ++defined by @b{defclass}. ++ ++@node method, standard-method, standard-class, Types and Classes Dictionary ++@subsection method [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{method}, ++@b{t} ++ ++@subsubheading Description:: ++ ++A @i{method} is an @i{object} that represents a modular part of the behavior ++of a @i{generic function}. ++ ++A @i{method} contains @i{code} to implement the @i{method}'s ++behavior, a sequence of @i{parameter specializers} that specify when the ++given @i{method} is applicable, and a sequence of @i{qualifiers} ++that is used by the method combination facility to distinguish among ++@i{methods}. Each required parameter of each ++@i{method} has an associated @i{parameter specializer}, and the ++@i{method} will be invoked only on arguments that satisfy its ++@i{parameter specializers}. ++ ++The method combination facility controls the selection of ++@i{methods}, the order in which they are run, and the values that are ++returned by the generic function. The object system offers a default method ++combination type and provides a facility for declaring new types of ++method combination. ++ ++@subsubheading See Also:: ++ ++@ref{Generic Functions and Methods} ++ ++@node standard-method, structure-object, method, Types and Classes Dictionary ++@subsection standard-method [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{standard-method}, ++@b{method}, ++ ++@b{standard-object}, ++ ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{class} @b{standard-method} is the default @i{class} of ++@i{methods} defined by the ++ @b{defmethod} and ++ @b{defgeneric} @i{forms}. ++ ++@node structure-object, standard-object, standard-method, Types and Classes Dictionary ++@subsection structure-object [Class] ++ ++@subsubheading Class Precedence List:: ++ ++@b{structure-object}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{class} @b{structure-object} is an @i{instance} of @b{structure-class} ++and is a @i{superclass} of every @i{class} ++that is an @i{instance} of @b{structure-class} ++except itself, and is a @i{superclass} of every @i{class} ++that is defined by @b{defstruct}. ++ ++@subsubheading See Also:: ++ ++@ref{defstruct} ++, ++@ref{Sharpsign S}, ++@ref{Printing Structures} ++ ++@node standard-object, method-combination, structure-object, Types and Classes Dictionary ++@subsection standard-object [Class] ++ ++@subsubheading Class Precedence List:: ++@b{standard-object}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{class} @b{standard-object} is an @i{instance} of @b{standard-class} ++and is a @i{superclass} of every @i{class} that is an @i{instance} of ++@b{standard-class} except itself. ++ ++@node method-combination, t (System Class), standard-object, Types and Classes Dictionary ++@subsection method-combination [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{method-combination}, ++@b{t} ++ ++@subsubheading Description:: ++ ++Every @i{method combination} @i{object} is an ++@i{indirect instance} of the @i{class} @b{method-combination}. ++A @i{method combination} @i{object} represents the information about ++the @i{method combination} being used by a @i{generic function}. ++A @i{method combination} @i{object} contains information about ++both the type of @i{method combination} and the arguments being used ++with that @i{type}. ++ ++@node t (System Class), satisfies, method-combination, Types and Classes Dictionary ++@subsection t [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{t} ++ ++@subsubheading Description:: ++The set of all @i{objects}. ++The @i{type} @b{t} is a @i{supertype} of every @i{type}, ++including itself. Every @i{object} is of @i{type} @b{t}. ++ ++@node satisfies, member (Type Specifier), t (System Class), Types and Classes Dictionary ++@subsection satisfies [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Predicating. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{satisfies}@{@i{predicate-name}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{predicate-name}---a @i{symbol}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of all @i{objects} that satisfy the ++@i{predicate} @i{predicate-name}, which must be a @i{symbol} ++whose global @i{function} definition is a one-argument ++predicate. A name is required for @i{predicate-name}; ++@i{lambda expressions} are not allowed. ++For example, the @i{type specifier} @t{(and integer (satisfies evenp))} ++denotes the set of all even integers. ++The form @t{(typep @i{x} '(satisfies @i{p}))} is equivalent to ++@t{(if (@i{p} @i{x}) t nil)}. ++ ++The argument is required. ++The @i{symbol} @b{*} can be the argument, but it ++denotes itself (the @i{symbol} @b{*}), ++and does not represent an unspecified value. ++ ++The symbol @b{satisfies} is not valid as a @i{type specifier}. ++ ++@node member (Type Specifier), not (Type Specifier), satisfies, Types and Classes Dictionary ++@subsection member [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Combining. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{member}@{@i{@{@i{object}@}*}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set containing the named @i{objects}. An ++@i{object} is of this @i{type} if and only if it is @b{eql} ++to one of the specified @i{objects}. ++ ++The @i{type specifiers} @t{(member)} and @b{nil} are equivalent. ++@b{*} can be among the @i{objects}, ++but if so it denotes itself (the symbol @b{*}) ++and does not represent an unspecified value. ++The symbol @b{member} is not valid as a @i{type specifier}; ++and, specifically, it is not an abbreviation for either @t{(member)} or @t{(member *)}. ++ ++@subsubheading See Also:: ++ ++the @i{type} @b{eql} ++ ++@node not (Type Specifier), and (Type Specifier), member (Type Specifier), Types and Classes Dictionary ++@subsection not [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Combining. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{not}@{@i{typespec}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of all @i{objects} that are not of the @i{type} @i{typespec}. ++ ++The argument is required, and cannot be @b{*}. ++ ++The symbol @b{not} is not valid as a @i{type specifier}. ++ ++@node and (Type Specifier), or (Type Specifier), not (Type Specifier), Types and Classes Dictionary ++@subsection and [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Combining. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{and}@{@i{@{@i{typespec}@}*}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of all @i{objects} of the @i{type} ++determined by the intersection of the @i{typespecs}. ++ ++@b{*} is not permitted as an argument. ++ ++The @i{type specifiers} @t{(and)} and @b{t} are equivalent. ++The symbol @b{and} is not valid as a @i{type specifier}, ++and, specifically, it is not an abbreviation for @t{(and)}. ++ ++@node or (Type Specifier), values (Type Specifier), and (Type Specifier), Types and Classes Dictionary ++@subsection or [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Combining. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{or}@{@i{@{@i{typespec}@}*}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This denotes the set of all @i{objects} of the ++@i{type} determined by the union of the @i{typespecs}. ++For example, the @i{type} @b{list} by definition is the same as @t{(or null cons)}. ++Also, the value returned by @b{position} is an @i{object} of @i{type} @t{(or null (integer 0 *))}; ++@i{i.e.}, either @b{nil} or a non-negative @i{integer}. ++ ++@b{*} is not permitted as an argument. ++ ++The @i{type specifiers} @t{(or)} and @b{nil} are equivalent. ++The symbol @b{or} is not valid as a @i{type specifier}; ++and, specifically, it is not an abbreviation for @t{(or)}. ++ ++@node values (Type Specifier), eql (Type Specifier), or (Type Specifier), Types and Classes Dictionary ++@subsection values [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Specializing. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{values}@{@i{!@i{value-typespec}}@}) ++ ++[Reviewer Note by Barmar: Missing @b{&key}] ++ ++@w{@i{value-typespec} ::=@{@i{typespec}@}* @t{[}@r{&optional} @r{@{@i{typespec}@}*}@t{]} @t{[}@r{&rest} typespec @t{]} @t{[}@b{&allow-other-keys}@t{]}} ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++This @i{type specifier} can be used only as the @i{value-type} in a ++@b{function} @i{type specifier} or a @b{the} ++@i{special form}. It is used to specify individual @i{types} ++when @i{multiple values} are involved. ++The @b{&optional} and @b{&rest} markers can appear in the @i{value-type} list; ++they indicate the parameter list of a @i{function} that, ++when given to @b{multiple-value-call} along with the values, ++would correctly receive those values. ++ ++The symbol @b{*} may not be among the @i{value-types}. ++ ++The symbol @b{values} is not valid as a @i{type specifier}; ++and, specifically, it is not an abbreviation for @t{(values)}. ++ ++@node eql (Type Specifier), coerce, values (Type Specifier), Types and Classes Dictionary ++@subsection eql [Type Specifier] ++ ++@subsubheading Compound Type Specifier Kind:: ++ ++Combining. ++ ++@subsubheading Compound Type Specifier Syntax:: ++ ++(@code{eql}@{@i{object}@}) ++ ++@subsubheading Compound Type Specifier Arguments:: ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Compound Type Specifier Description:: ++ ++Represents the @i{type} whose only @i{element} is @i{object}. ++ ++The argument @i{object} is required. The @i{object} can be @b{*}, ++but if so it denotes itself (the symbol @b{*}) ++and does not represent an unspecified value. ++The @i{symbol} @b{eql} is not valid as an @i{atomic type specifier}. ++ ++@node coerce, deftype, eql (Type Specifier), Types and Classes Dictionary ++@subsection coerce [Function] ++ ++@code{coerce} @i{object result-type} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{result-type}---a @i{type specifier}. ++ ++@i{result}---an @i{object}, of @i{type} @i{result-type} ++ except in situations described in @ref{Rule of Canonical Representation for Complex Rationals}. ++ ++@subsubheading Description:: ++ ++@i{Coerces} the @i{object} to @i{type} @i{result-type}. ++ ++If @i{object} is already of @i{type} @i{result-type}, ++the @i{object} itself is returned, regardless of whether it ++would have been possible in general to coerce an @i{object} of ++some other @i{type} to @i{result-type}. ++ ++Otherwise, the @i{object} is @i{coerced} to @i{type} @i{result-type} ++according to the following rules: ++ ++@table @asis ++ ++@item @b{sequence} ++ ++If the @i{result-type} is a @i{recognizable subtype} of @b{list}, ++and the @i{object} is a @i{sequence}, ++then the @i{result} is a @i{list} ++that has the @i{same} @i{elements} as @i{object}. ++ ++If the @i{result-type} is a @i{recognizable subtype} of @b{vector}, ++and the @i{object} is a @i{sequence}, ++then the @i{result} is a @i{vector} ++that has the @i{same} @i{elements} as @i{object}. ++If @i{result-type} is a specialized @i{type}, ++the @i{result} has an @i{actual array element type} that is the result of ++@i{upgrading} the element type part of that @i{specialized} @i{type}. ++If no element type is specified, the element type defaults to @b{t}. ++If the @i{implementation} cannot determine the element type, an error is signaled. ++ ++@item @b{character} ++If the @i{result-type} is @b{character} ++and the @i{object} is a @i{character designator}, ++the @i{result} is the @i{character} it denotes. ++ ++@item @b{complex} ++If the @i{result-type} is @b{complex} ++and the @i{object} is a @i{number}, ++then the @i{result} is obtained by constructing a @i{complex} ++whose real part is the @i{object} and ++whose imaginary part is the result of @i{coercing} an @i{integer} zero ++to the @i{type} of the @i{object} (using @b{coerce}). ++(If the real part is a @i{rational}, however, ++then the result must be represented as a @i{rational} rather ++than a @i{complex}; see @ref{Rule of Canonical Representation for Complex Rationals}. ++So, for example, @t{(coerce 3 'complex)} is permissible, ++but will return @t{3}, which is not a @i{complex}.) ++ ++@item @b{float} ++If the @i{result-type} is any of @b{float}, ++ @b{short-float}, ++ @b{single-float}, ++ @b{double-float}, ++ @b{long-float}, ++and the @i{object} is a ++ ++@i{real}, ++ ++then the @i{result} is a @i{float} of @i{type} @i{result-type} ++which is equal in sign and magnitude to the @i{object} to whatever degree of ++representational precision is permitted by that @i{float} representation. ++(If the @i{result-type} is @b{float} ++and @i{object} is not already a @i{float}, ++then the @i{result} is a @i{single float}.) ++ ++@item @b{function} ++If the @i{result-type} is @b{function}, ++and @i{object} is any ++ ++@i{function name} ++ ++that is @i{fbound} ++but that is globally defined neither as a @i{macro name} nor as a @i{special operator}, ++then the @i{result} is the @i{functional value} of @i{object}. ++ ++If the @i{result-type} is @b{function}, ++and @i{object} is a @i{lambda expression}, ++then the @i{result} is a @i{closure} of @i{object} ++in the @i{null lexical environment}. ++ ++@item @b{t} ++Any @i{object} can be @i{coerced} to an @i{object} of @i{type} @b{t}. ++In this case, the @i{object} is simply returned. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (coerce '(a b c) 'vector) @result{} #(A B C) ++ (coerce 'a 'character) @result{} #\A ++ (coerce 4.56 'complex) @result{} #C(4.56 0.0) ++ (coerce 4.5s0 'complex) @result{} #C(4.5s0 0.0s0) ++ (coerce 7/2 'complex) @result{} 7/2 ++ (coerce 0 'short-float) @result{} 0.0s0 ++ (coerce 3.5L0 'float) @result{} 3.5L0 ++ (coerce 7/2 'float) @result{} 3.5 ++ (coerce (cons 1 2) t) @result{} (1 . 2) ++@end example ++ ++All the following @i{forms} should signal an error: ++ ++@example ++ (coerce '(a b c) '(vector * 4)) ++ (coerce #(a b c) '(vector * 4)) ++ (coerce '(a b c) '(vector * 2)) ++ (coerce #(a b c) '(vector * 2)) ++ (coerce "foo" '(string 2)) ++ (coerce #(#\a #\b #\c) '(string 2)) ++ (coerce '(0 1) '(simple-bit-vector 3)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If a coercion is not possible, an error of @i{type} @b{type-error} is signaled. ++ ++@t{(coerce x 'nil)} always signals an error of @i{type} @b{type-error}. ++ ++An error ++of @i{type} @b{error} is signaled ++if the @i{result-type} is @b{function} but ++@i{object} is a @i{symbol} that is not @i{fbound} or ++if the @i{symbol} names a @i{macro} or a @i{special operator}. ++ ++An error of @i{type} @b{type-error} should be signaled if @i{result-type} ++specifies the number of elements and @i{object} is of a different length. ++ ++@subsubheading See Also:: ++ ++@ref{rational (Function)} ++, ++@ref{floor} ++, ++@ref{char-code} ++, ++@ref{char-int} ++ ++@subsubheading Notes:: ++ ++Coercions from @i{floats} to @i{rationals} ++and from @i{ratios} to @i{integers} ++are not provided because of rounding problems. ++ ++@example ++ (coerce x 't) @equiv{} (identity x) @equiv{} x ++@end example ++ ++@node deftype, subtypep, coerce, Types and Classes Dictionary ++@subsection deftype [Macro] ++ ++@code{deftype} @i{name lambda-list @r{[[@{@i{declaration}@}* | @i{documentation}]]} @{@i{form}@}*} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{lambda-list}---a @i{deftype lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++@b{deftype} defines a @i{derived type specifier} named @i{name}. ++ ++The meaning of the new @i{type specifier} is given in terms of ++a function which expands the @i{type specifier} into another ++@i{type specifier}, which itself will be expanded if it contains ++references to another @i{derived type specifier}. ++ ++The newly defined @i{type specifier} may be referenced as a list of ++the form @t{(@i{name} @i{arg_1} @i{arg_2} ...)\/}. ++The number of arguments must be appropriate to the @i{lambda-list}. ++If the new @i{type specifier} takes no arguments, ++or if all of its arguments are optional, ++the @i{type specifier} may be used as an @i{atomic type specifier}. ++ ++The @i{argument} @i{expressions} to the @i{type specifier}, ++@i{arg_1} ... @i{arg_n}, are not @i{evaluated}. ++Instead, these @i{literal objects} become the @i{objects} to which ++corresponding @i{parameters} become @i{bound}. ++ ++The body of the @b{deftype} @i{form} ++ ++(but not the @i{lambda-list}) ++ ++is ++ ++implicitly enclosed in a @i{block} named @i{name}, ++ ++and is evaluated as an @i{implicit progn}, ++returning a new @i{type specifier}. ++ ++The @i{lexical environment} of the body is the one which was current ++at the time the @b{deftype} form was evaluated, augmented by the ++@i{variables} in the @i{lambda-list}. ++ ++Recursive expansion of the @i{type specifier} returned as the expansion ++must terminate, including the expansion of @i{type specifiers} which ++are nested within the expansion. ++ ++The consequences are undefined if the result of fully expanding a ++@i{type specifier} contains any circular structure, except within ++the @i{objects} referred to by @b{member} and @b{eql} ++@i{type specifiers}. ++ ++@i{Documentation} is attached to @i{name} as a @i{documentation string} ++of kind @b{type}. ++ ++If a @b{deftype} @i{form} appears as a @i{top level form}, ++the @i{compiler} must ensure that the @i{name} is recognized ++in subsequent @i{type} declarations. ++The @i{programmer} must ensure that the body of a @b{deftype} form ++can be @i{evaluated} at compile time if the @i{name} is ++referenced in subsequent @i{type} declarations. ++If the expansion of a @i{type specifier} is not defined fully at compile time ++(perhaps because it expands into an unknown @i{type specifier} or a ++@b{satisfies} of a named @i{function} that isn't defined in the ++compile-time environment), an @i{implementation} may ignore any references to ++this @i{type} in declarations and/or signal a warning. ++ ++@subsubheading Examples:: ++@example ++ (defun equidimensional (a) ++ (or (< (array-rank a) 2) ++ (apply #'= (array-dimensions a)))) @result{} EQUIDIMENSIONAL ++ (deftype square-matrix (&optional type size) ++ `(and (array ,type (,size ,size)) ++ (satisfies equidimensional))) @result{} SQUARE-MATRIX ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{defmacro} ++, ++@ref{documentation} ++, ++@ref{Type Specifiers}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@node subtypep, type-of, deftype, Types and Classes Dictionary ++@subsection subtypep [Function] ++ ++@code{subtypep} @i{type-1 type-2 @r{&optional} environment} @result{} @i{subtype-p, valid-p} ++ ++@subsubheading Arguments and Values:: ++ ++@i{type-1}---a @i{type specifier}. ++ ++@i{type-2}---a @i{type specifier}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ The default is @b{nil}, denoting the @i{null lexical environment} ++ and the current @i{global environment}. ++ ++@i{subtype-p}---a @i{generalized boolean}. ++ ++@i{valid-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++If @i{type-1} is a @i{recognizable subtype} of @i{type-2}, ++the first @i{value} is @i{true}. ++Otherwise, the first @i{value} is @i{false}, ++indicating that either ++ @i{type-1} is not a @i{subtype} of @i{type-2}, or else ++ @i{type-1} is a @i{subtype} of @i{type-2} ++ but is not a @i{recognizable subtype}. ++ ++A second @i{value} is also returned indicating the `certainty' of ++the first @i{value}. If this value is @i{true}, then the first ++value is an accurate indication of the @i{subtype} relationship. ++(The second @i{value} is always @i{true} when the first @i{value} ++ is @i{true}.) ++ ++Figure 4--9 summarizes the possible combinations of @i{values} ++that might result. ++ ++@format ++@group ++@noindent ++@w{ Value 1 Value 2 Meaning } ++@w{ @i{true} @i{true} @i{type-1} is definitely a @i{subtype} of @i{type-2}. } ++@w{ @i{false} @i{true} @i{type-1} is definitely not a @i{subtype} of @i{type-2}. } ++@w{ @i{false} @i{false} @b{subtypep} could not determine the relationship, } ++@w{ so @i{type-1} might or might not be a @i{subtype} of @i{type-2}. } ++ ++@noindent ++@w{ Figure 4--9: Result possibilities for subtypep } ++ ++@end group ++@end format ++ ++@b{subtypep} is permitted to return the ++@i{values} @i{false} and @i{false} only when at least ++one argument involves one of these @i{type specifiers}: ++ @b{and}, ++ @b{eql}, ++ the list form of @b{function}, ++ @b{member}, ++ @b{not}, ++ @b{or}, ++ @b{satisfies}, ++or ++ @b{values}. ++(A @i{type specifier} `involves' such a @i{symbol} if, ++ after being @i{type expanded}, ++ it contains that @i{symbol} in a position that would call for ++ its meaning as a @i{type specifier} to be used.) ++One consequence of this is that if neither @i{type-1} nor @i{type-2} ++involves any of these @i{type specifiers}, then @b{subtypep} is obliged ++to determine the relationship accurately. In particular, @b{subtypep} ++returns the @i{values} @i{true} and @i{true} ++if the arguments are @b{equal} and do not involve ++any of these @i{type specifiers}. ++ ++@b{subtypep} never returns a second value of @b{nil} when both ++@i{type-1} and @i{type-2} involve only ++ the names in @i{Figure~4--2}, or ++ names of @i{types} defined by @b{defstruct}, ++@b{define-condition}, ++ or @b{defclass}, or ++ @i{derived types} that expand into only those names. ++While @i{type specifiers} listed in @i{Figure~4--2} and ++names of @b{defclass} and @b{defstruct} can in some cases be ++implemented as @i{derived types}, @b{subtypep} regards them as primitive. ++ ++The relationships between @i{types} reflected by @b{subtypep} ++are those specific to the particular implementation. For example, if ++an implementation supports only a single type of floating-point numbers, ++in that implementation @t{(subtypep 'float 'long-float)} ++returns the @i{values} @i{true} and @i{true} ++(since the two @i{types} are identical). ++ ++For all @i{T1} and @i{T2} other than @t{*}, ++@t{(array @i{T1})} and @t{(array @i{T2})} ++are two different @i{type specifiers} that always refer to the same sets of ++things if and only if they refer to @i{arrays} ++of exactly the same specialized representation, @i{i.e.}, if @t{(upgraded-array-element-type '@i{T1})} and ++ @t{(upgraded-array-element-type '@i{T2})} ++return two different @i{type specifiers} that always refer to the same sets of ++@i{objects}. ++This is another way of saying that ++@t{`(array @i{type-specifier})} ++and ++@t{`(array ,(upgraded-array-element-type '@i{type-specifier}))} ++refer to the same ++set of specialized @i{array} representations. ++For all @i{T1} and @i{T2} other than @t{*}, ++the intersection of ++ @t{(array @i{T1})} ++and @t{(array @i{T2})} is the empty set ++if and only if they refer to @i{arrays} of different, ++distinct specialized representations. ++ ++Therefore, ++ ++@example ++ (subtypep '(array T1) '(array T2)) @result{} @i{true} ++@end example ++ ++if and only if ++ ++@example ++ (upgraded-array-element-type 'T1) and ++ (upgraded-array-element-type 'T2) ++@end example ++ ++return two different @i{type specifiers} that always refer to the same sets of ++@i{objects}. ++ ++For all type-specifiers @i{T1} and @i{T2} other than @t{*}, ++ ++@example ++ (subtypep '(complex T1) '(complex T2)) @result{} @i{true}, @i{true} ++@end example ++ ++if: ++@table @asis ++ ++@item 1. ++@t{T1} is a @i{subtype} of @t{T2}, or ++@item 2. ++@t{(upgraded-complex-part-type '@i{T1})} and ++ @t{(upgraded-complex-part-type '@i{T2})} ++ return two different @i{type specifiers} that always refer to the ++ same sets of @i{objects}; in this case, ++ @t{(complex @i{T1})} and ++ @t{(complex @i{T2})} both refer to the ++ same specialized representation. ++@end table ++ ++The @i{values} are @i{false} and @i{true} otherwise. ++ ++The form ++ ++@example ++ (subtypep '(complex single-float) '(complex float)) ++@end example ++ ++ must return @i{true} in all implementations, but ++ ++@example ++ (subtypep '(array single-float) '(array float)) ++@end example ++ ++returns @i{true} only in implementations that do not have a specialized @i{array} ++representation for @i{single floats} distinct from that for other @i{floats}. ++ ++@subsubheading Examples:: ++ ++@example ++ (subtypep 'compiled-function 'function) @result{} @i{true}, @i{true} ++ (subtypep 'null 'list) @result{} @i{true}, @i{true} ++ (subtypep 'null 'symbol) @result{} @i{true}, @i{true} ++ (subtypep 'integer 'string) @result{} @i{false}, @i{true} ++ (subtypep '(satisfies dummy) nil) @result{} @i{false}, @i{implementation-dependent} ++ (subtypep '(integer 1 3) '(integer 1 4)) @result{} @i{true}, @i{true} ++ (subtypep '(integer (0) (0)) 'nil) @result{} @i{true}, @i{true} ++ (subtypep 'nil '(integer (0) (0))) @result{} @i{true}, @i{true} ++ (subtypep '(integer (0) (0)) '(member)) @result{} @i{true}, @i{true} ;or @i{false}, @i{false} ++ (subtypep '(member) 'nil) @result{} @i{true}, @i{true} ;or @i{false}, @i{false} ++ (subtypep 'nil '(member)) @result{} @i{true}, @i{true} ;or @i{false}, @i{false} ++@end example ++ ++ Let @t{} and @t{} be two distinct @i{type specifiers} that ++do not always refer to the same sets of ++@i{objects} ++in a given implementation, but for which ++@b{make-array}, will return an ++@i{object} of the same @i{array} @i{type}. ++ ++Thus, in each case, ++ ++@example ++ (subtypep (array-element-type (make-array 0 :element-type ')) ++ (array-element-type (make-array 0 :element-type '))) ++@result{} @i{true}, @i{true} ++ ++ (subtypep (array-element-type (make-array 0 :element-type ')) ++ (array-element-type (make-array 0 :element-type '))) ++@result{} @i{true}, @i{true} ++@end example ++ ++If @t{(array )} ++and @t{(array )} are different names for ++exactly the same set of @i{objects}, ++these names should always refer to the same sets of ++@i{objects}. ++ That implies that the following set of tests are also true: ++ ++@example ++ (subtypep '(array ) '(array )) @result{} @i{true}, @i{true} ++ (subtypep '(array ) '(array )) @result{} @i{true}, @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Types} ++ ++@subsubheading Notes:: ++ ++The small differences between the @b{subtypep} specification for ++the @b{array} and @b{complex} types are necessary because there ++is no creation function for @i{complexes} which allows ++the specification of the resultant part type independently of ++the actual types of the parts. Thus in the case of the @i{type} @b{complex}, ++the actual type of the parts is referred to, although a @i{number} ++can be a member of more than one @i{type}. ++For example, @t{17} is of @i{type} @t{(mod 18)} ++as well as @i{type} @t{(mod 256)} and @i{type} @b{integer}; ++and @t{2.3f5} is of @i{type} @b{single-float} ++as well as @i{type} @b{float}. ++ ++@node type-of, typep, subtypep, Types and Classes Dictionary ++@subsection type-of [Function] ++ ++@code{type-of} @i{object} @result{} @i{typespec} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{typespec}---a @i{type specifier}. ++ ++@subsubheading Description:: ++ ++Returns a @i{type specifier}, @i{typespec}, for a @i{type} ++that has the @i{object} as an @i{element}. ++The @i{typespec} satisfies the following: ++ ++@table @asis ++ ++@item 1. ++For any @i{object} that is an @i{element} of some @i{built-in type}: ++ ++@table @asis ++ ++@item a. ++the @i{type} returned is a @i{recognizable subtype} of that @i{built-in type}. ++ ++@item b. ++the @i{type} returned does not involve ++ @t{and}, ++ @t{eql}, ++ @t{member}, ++ @t{not}, ++ @t{or}, ++ @t{satisfies}, ++ or @t{values}. ++@end table ++ ++@item 2. ++For all @i{objects}, @t{(typep @i{object} (type-of @i{object}))} ++returns @i{true}. ++Implicit in this is that @i{type specifiers} which are ++not valid for use with @b{typep}, such as the @i{list} form of the ++@b{function} @i{type specifier}, are never returned by @b{type-of}. ++ ++@item 3. ++The @i{type} returned by @b{type-of} is always a @i{recognizable subtype} ++of the @i{class} returned by @b{class-of}. That is, ++ ++@example ++ (subtypep (type-of @i{object}) (class-of @i{object})) @result{} @i{true}, @i{true} ++@end example ++ ++@item 4. ++For @i{objects} of metaclass @b{structure-class} or @b{standard-class}, ++ ++and for @i{conditions}, ++ ++@b{type-of} returns the @i{proper name} of the @i{class} returned ++by @b{class-of} if it has a @i{proper name}, ++and otherwise returns the @i{class} itself. ++In particular, for @i{objects} created by the constructor function ++of a structure defined with @b{defstruct} without a @t{:type} option, ++@b{type-of} returns the structure name; and for @i{objects} created ++by @b{make-condition}, the @i{typespec} is the @i{name} of the ++@i{condition} @i{type}. ++ ++@item 5. ++For each of the @i{types} ++ @b{short-float}, ++ @b{single-float}, ++ @b{double-float}, ++ or @b{long-float} ++of which the @i{object} is an @i{element}, ++the @i{typespec} is a @i{recognizable subtype} of that @i{type}. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++@end example ++ ++@example ++ (type-of 'a) @result{} SYMBOL ++ (type-of '(1 . 2)) ++@result{} CONS ++@i{OR}@result{} (CONS FIXNUM FIXNUM) ++ (type-of #c(0 1)) ++@result{} COMPLEX ++@i{OR}@result{} (COMPLEX INTEGER) ++ (defstruct temp-struct x y z) @result{} TEMP-STRUCT ++ (type-of (make-temp-struct)) @result{} TEMP-STRUCT ++ (type-of "abc") ++@result{} STRING ++@i{OR}@result{} (STRING 3) ++ (subtypep (type-of "abc") 'string) @result{} @i{true}, @i{true} ++ (type-of (expt 2 40)) ++@result{} BIGNUM ++@i{OR}@result{} INTEGER ++@i{OR}@result{} (INTEGER 1099511627776 1099511627776) ++@i{OR}@result{} SYSTEM::TWO-WORD-BIGNUM ++@i{OR}@result{} FIXNUM ++ (subtypep (type-of 112312) 'integer) @result{} @i{true}, @i{true} ++ (defvar *foo* (make-array 5 :element-type t)) @result{} *FOO* ++ (class-name (class-of *foo*)) @result{} VECTOR ++ (type-of *foo*) ++@result{} VECTOR ++@i{OR}@result{} (VECTOR T 5) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{array-element-type} ++, ++@ref{class-of} ++, ++@ref{defstruct} ++, ++@ref{typecase} ++, ++@ref{typep} ++, ++@ref{Types} ++ ++@subsubheading Notes:: ++ ++Implementors are encouraged to arrange for @b{type-of} to return ++ ++a portable value. ++ ++@node typep, type-error, type-of, Types and Classes Dictionary ++@subsection typep [Function] ++ ++@code{typep} @i{object type-specifier @r{&optional} environment} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{type-specifier}---any @i{type specifier} except ++ ++@b{values}, or a @i{type specifier} list ++whose first element is either @b{function} or @b{values}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ The default is @b{nil}, denoting the @i{null lexical environment} ++ and the and current @i{global environment}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of the @i{type} specified by @i{type-specifier}; ++otherwise, returns @i{false}. ++ ++A @i{type-specifier} of the form @t{(satisfies fn)} ++is handled by applying the function @t{fn} to @i{object}. ++ ++@t{(typep @i{object} '(array @i{type-specifier}))}, ++where @i{type-specifier} is not @t{*}, ++returns @i{true} if and only if @i{object} is an @i{array} ++that could be the result ++of supplying @i{type-specifier} ++as the @t{:element-type} argument to @b{make-array}. ++@t{(array *)} refers to all @i{arrays} ++regardless of element type, while @t{(array @i{type-specifier})} ++refers only to those @i{arrays} ++that can result from giving @i{type-specifier} as the ++@t{:element-type} argument to @b{make-array}. ++A similar interpretation applies to @t{(simple-array @i{type-specifier})} ++and @t{(vector @i{type-specifier})}. ++See @ref{Array Upgrading}. ++ ++@t{(typep @i{object} '(complex @i{type-specifier}))} ++returns @i{true} for all @i{complex} numbers that can result from ++giving @i{numbers} of type @i{type-specifier} ++to the @i{function} @b{complex}, plus all other @i{complex} numbers ++of the same specialized representation. ++Both the real and the imaginary parts of any such ++@i{complex} number must satisfy: ++ ++@example ++ (typep realpart 'type-specifier) ++ (typep imagpart 'type-specifier) ++@end example ++ ++See the @i{function} @b{upgraded-complex-part-type}. ++ ++@subsubheading Examples:: ++ ++@example ++ (typep 12 'integer) @result{} @i{true} ++ (typep (1+ most-positive-fixnum) 'fixnum) @result{} @i{false} ++ (typep nil t) @result{} @i{true} ++ (typep nil nil) @result{} @i{false} ++ (typep 1 '(mod 2)) @result{} @i{true} ++ (typep #c(1 1) '(complex (eql 1))) @result{} @i{true} ++;; To understand this next example, you might need to refer to ++;; @ref{Rule of Canonical Representation for Complex Rationals}. ++ (typep #c(0 0) '(complex (eql 0))) @result{} @i{false} ++@end example ++ ++Let @t{A_x} and @t{A_y} be two @i{type specifiers} that ++denote different @i{types}, but for which ++ ++@example ++ (upgraded-array-element-type 'A_x) ++@end example ++ ++and ++ ++@example ++ (upgraded-array-element-type 'A_y) ++@end example ++ ++denote the same @i{type}. Notice that ++ ++@example ++ (typep (make-array 0 :element-type 'A_x) '(array A_x)) @result{} @i{true} ++ (typep (make-array 0 :element-type 'A_y) '(array A_y)) @result{} @i{true} ++ (typep (make-array 0 :element-type 'A_x) '(array A_y)) @result{} @i{true} ++ (typep (make-array 0 :element-type 'A_y) '(array A_x)) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{error} is signaled if @i{type-specifier} is @t{values}, ++or a @i{type specifier} list whose first element is either ++@b{function} or @b{values}. ++ ++The consequences are undefined if ++the @i{type-specifier} is not a @i{type specifier}. ++ ++@subsubheading See Also:: ++ ++@ref{type-of} ++, ++@ref{upgraded-array-element-type} ++, ++@ref{upgraded-complex-part-type} ++, ++@ref{Type Specifiers} ++ ++@subsubheading Notes:: ++ ++@i{Implementations} are encouraged to recognize and optimize the case of ++@t{(typep @i{x} (the class @i{y}))}, ++since it does not involve any need for expansion ++of @b{deftype} information at runtime. ++ ++@example ++ ++@end example ++ ++@node type-error, type-error-datum, typep, Types and Classes Dictionary ++@subsection type-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{type-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{type-error} represents a situation in which an @i{object} is not ++of the expected type. The ``offending datum'' and ``expected type'' are initialized ++by the initialization arguments named @t{:datum} and @t{:expected-type} to @b{make-condition}, ++and are @i{accessed} by the functions ++@b{type-error-datum} and @b{type-error-expected-type}. ++ ++@subsubheading See Also:: ++ ++@ref{type-error-datum} ++, @b{type-error-expected-type} ++ ++@node type-error-datum, simple-type-error, type-error, Types and Classes Dictionary ++@subsection type-error-datum, type-error-expected-type [Function] ++ ++@code{type-error-datum} @i{condition} @result{} @i{datum} ++ ++@code{type-error-expected-type} @i{condition} @result{} @i{expected-type} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{type-error}. ++ ++@i{datum}---an @i{object}. ++ ++@i{expected-type}---a @i{type specifier}. ++ ++@subsubheading Description:: ++ ++@b{type-error-datum} returns the offending datum in the @i{situation} ++represented by the @i{condition}. ++ ++@b{type-error-expected-type} returns the expected type of the ++offending datum in the @i{situation} represented by the @i{condition}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun fix-digits (condition) ++ (check-type condition type-error) ++ (let* ((digits '(zero one two three four ++ five six seven eight nine)) ++ (val (position (type-error-datum condition) digits))) ++ (if (and val (subtypep 'fixnum (type-error-expected-type condition))) ++ (store-value 7)))) ++ ++ (defun foo (x) ++ (handler-bind ((type-error #'fix-digits)) ++ (check-type x number) ++ (+ x 3))) ++ ++ (foo 'seven) ++@result{} 10 ++@end example ++ ++@subsubheading See Also:: ++ ++@b{type-error}, ++@ref{Conditions} ++ ++@node simple-type-error, , type-error-datum, Types and Classes Dictionary ++@subsection simple-type-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++ ++@b{simple-type-error}, ++@b{simple-condition}, ++@b{type-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++@i{Conditions} of @i{type} @b{simple-type-error} ++are like @i{conditions} of @i{type} @b{type-error}, ++except that they provide an alternate mechanism for specifying ++how the @i{condition} is to be @i{reported}; ++see the @i{type} @b{simple-condition}. ++ ++@subsubheading See Also:: ++ ++@b{simple-condition}, ++ ++@ref{simple-condition-format-control} ++, ++ ++@b{simple-condition-format-arguments}, ++@ref{type-error-datum} ++, ++@b{type-error-expected-type} ++ ++@c end of including dict-types ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-5.texi +@@ -0,0 +1,6473 @@ ++ ++ ++@node Data and Control Flow, Iteration, Types and Classes, Top ++@chapter Data and Control Flow ++ ++@menu ++* Generalized Reference:: ++* Transfer of Control to an Exit Point:: ++* Data and Control Flow Dictionary:: ++@end menu ++ ++@node Generalized Reference, Transfer of Control to an Exit Point, Data and Control Flow, Data and Control Flow ++@section Generalized Reference ++ ++@c including concept-places ++ ++@menu ++* Overview of Places and Generalized Reference:: ++* Kinds of Places:: ++* Treatment of Other Macros Based on SETF:: ++@end menu ++ ++@node Overview of Places and Generalized Reference, Kinds of Places, Generalized Reference, Generalized Reference ++@subsection Overview of Places and Generalized Reference ++ ++A @i{generalized reference} ++@IGindex generalized reference ++ is the use of a @i{form}, ++sometimes called a @i{place} ++@IGindex place ++, ++as if it were a @i{variable} that could be read and written. ++The @i{value} of a @i{place} is ++the @i{object} to which the @i{place} @i{form} evaluates. ++The @i{value} of a @i{place} can be changed by using @b{setf}. ++The concept of binding a @i{place} is not defined in @r{Common Lisp}, ++but an @i{implementation} is permitted to extend the language by defining this concept. ++ ++Figure 5--1 contains examples of the use of @b{setf}. ++Note that the values returned by evaluating the @i{forms} in column two ++are not necessarily the same as those obtained by evaluating the ++@i{forms} in column three. ++In general, the exact @i{macro expansion} of a @b{setf} @i{form} is not guaranteed ++and can even be @i{implementation-dependent}; ++all that is guaranteed is ++ that the expansion is an update form that works ++ for that particular @i{implementation}, ++ that the left-to-right evaluation of @i{subforms} is preserved, ++and ++ that the ultimate result of evaluating @b{setf} is the value ++ or values being stored. ++ ++@format ++@group ++@noindent ++@w{ Access function Update Function Update using @b{setf} } ++@w{ @t{x} @t{(setq x datum)} @t{(setf x datum)} } ++@w{ @t{(car x)} @t{(rplaca x datum)} @t{(setf (car x) datum)} } ++@w{ @t{(symbol-value x)} @t{(set x datum)} @t{(setf (symbol-value x) datum)} } ++ ++@noindent ++@w{ Figure 5--1: Examples of setf } ++ ++@end group ++@end format ++ ++Figure 5--2 shows @i{operators} relating to ++@i{places} and @i{generalized reference}. ++ ++@format ++@group ++@noindent ++@w{ assert defsetf push } ++@w{ ccase get-setf-expansion remf } ++@w{ ctypecase getf rotatef } ++@w{ decf incf setf } ++@w{ define-modify-macro pop shiftf } ++@w{ define-setf-expander psetf } ++ ++@noindent ++@w{ Figure 5--2: Operators relating to places and generalized reference.} ++ ++@end group ++@end format ++ ++Some of the @i{operators} above manipulate @i{places} ++and some manipulate @i{setf expanders}. ++A @i{setf expansion} can be derived from any @i{place}. ++ ++New @i{setf expanders} can be defined by using @b{defsetf} ++and @b{define-setf-expander}. ++ ++@menu ++* Evaluation of Subforms to Places:: ++* Examples of Evaluation of Subforms to Places:: ++* Setf Expansions:: ++* Examples of Setf Expansions:: ++@end menu ++ ++@node Evaluation of Subforms to Places, Examples of Evaluation of Subforms to Places, Overview of Places and Generalized Reference, Overview of Places and Generalized Reference ++@subsubsection Evaluation of Subforms to Places ++ ++The following rules apply to the @i{evaluation} of @i{subforms} in a ++@i{place}: ++ ++@table @asis ++ ++@item 1. ++The evaluation ordering of @i{subforms} within a @i{place} ++is determined by the order specified by the second value returned by ++ ++@b{get-setf-expansion}. ++ ++For all @i{places} defined by this specification ++(@i{e.g.}, @b{getf}, @b{ldb}, ...), ++this order of evaluation is left-to-right. ++ ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++When a @i{place} is derived from a macro expansion, ++this rule is applied after the macro is expanded to find the appropriate @i{place}. ++ ++@i{Places} defined by using @b{defmacro} or ++ ++@b{define-setf-expander} ++ ++use the evaluation order defined by those definitions. ++For example, consider the following: ++ ++@example ++ (defmacro wrong-order (x y) `(getf ,y ,x)) ++@end example ++ ++This following @i{form} evaluates @t{place2} first and ++then @t{place1} because that is the order they are evaluated in ++the macro expansion: ++ ++@example ++ (push value (wrong-order place1 place2)) ++@end example ++ ++@item 2. ++ ++For the @i{macros} that manipulate @i{places} ++ (@b{push}, ++ @b{pushnew}, ++ @b{remf}, ++ @b{incf}, ++ @b{decf}, ++ @b{shiftf}, ++ @b{rotatef}, ++ @b{psetf}, ++ @b{setf}, ++ @b{pop}, and those defined by @b{define-modify-macro}) ++the @i{subforms} of the macro call are evaluated exactly once ++in left-to-right order, with the @i{subforms} of the @i{places} ++evaluated in the order specified in (1). ++ ++@b{push}, @b{pushnew}, @b{remf}, ++@b{incf}, @b{decf}, @b{shiftf}, @b{rotatef}, ++@b{psetf}, @b{pop} evaluate all @i{subforms} before modifying ++any of the @i{place} locations. ++@b{setf} (in the case when @b{setf} has more than two arguments) ++performs its operation on each pair in sequence. For example, in ++ ++@example ++ (setf place1 value1 place2 value2 ...) ++@end example ++ ++the @i{subforms} of @t{place1} and @t{value1} are evaluated, the location ++specified by ++@t{place1} is modified to contain the value returned by ++@t{value1}, and ++then the rest of the @b{setf} form is processed in a like manner. ++ ++@item 3. ++For @b{check-type}, @b{ctypecase}, and @b{ccase}, ++@i{subforms} of the @i{place} are evaluated once as in (1), ++but might be evaluated again if the ++type check fails in the case of @b{check-type} ++or none of the cases hold in ++@b{ctypecase} and @b{ccase}. ++ ++@item 4. ++For @b{assert}, the order of evaluation of the generalized ++references is not specified. ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++@end table ++ ++Rules 2, 3 and 4 cover all @i{standardized} @i{macros} that manipulate @i{places}. ++ ++@node Examples of Evaluation of Subforms to Places, Setf Expansions, Evaluation of Subforms to Places, Overview of Places and Generalized Reference ++@subsubsection Examples of Evaluation of Subforms to Places ++ ++@example ++ (let ((ref2 (list '()))) ++ (push (progn (princ "1") 'ref-1) ++ (car (progn (princ "2") ref2)))) ++@t{ |> } 12 ++@result{} (REF1) ++ ++ (let (x) ++ (push (setq x (list 'a)) ++ (car (setq x (list 'b)))) ++ x) ++@result{} (((A) . B)) ++@end example ++ ++@b{push} first evaluates @t{(setq x (list 'a)) @result{} (a)}, ++ then evaluates @t{(setq x (list 'b)) @result{} (b)}, ++ then modifies the @i{car} of this latest value to be @t{((a) . b)}. ++ ++@node Setf Expansions, Examples of Setf Expansions, Examples of Evaluation of Subforms to Places, Overview of Places and Generalized Reference ++@subsubsection Setf Expansions ++ ++Sometimes it is possible to avoid evaluating @i{subforms} of a ++@i{place} multiple times or in the wrong order. A ++ ++@i{setf expansion} ++ ++for a given access form can be expressed as an ordered collection of five @i{objects}: ++ ++@table @asis ++ ++@item @b{List of temporary variables} ++a list of symbols naming temporary variables to be bound ++sequentially, as if by @b{let*}, to @i{values} ++resulting from value forms. ++ ++@item @b{List of value forms} ++a list of forms (typically, @i{subforms} of the ++@i{place}) which when evaluated ++yield the values to which the corresponding temporary ++variables should be bound. ++ ++@item @b{List of store variables} ++a list of symbols naming temporary store variables which are ++to hold the new values that will be assigned to the ++@i{place}. ++ ++@item @b{Storing form} ++a form which can reference both the temporary and the store variables, ++and which changes the @i{value} of the @i{place} ++and guarantees to return as its values the values of the store variables, ++which are the correct values for @b{setf} to return. ++ ++@item @b{Accessing form} ++a @i{form} which can reference the temporary variables, ++and which returns the @i{value} of the @i{place}. ++@end table ++ ++The value returned by the accessing form is ++affected by execution of the storing form, but either of these ++forms might be evaluated any number of times. ++ ++It is possible ++to do more than one @b{setf} in parallel via ++@b{psetf}, @b{shiftf}, and @b{rotatef}. ++Because of this, the ++ ++@i{setf expander} ++ ++must produce new temporary ++and store variable names every time. For examples of how to do this, ++see @b{gensym}. ++ ++For each @i{standardized} accessor function @i{F}, ++unless it is explicitly documented otherwise, ++it is @i{implementation-dependent} whether the ability to ++use an @i{F} @i{form} as a @b{setf} @i{place} ++is implemented by a @i{setf expander} or a @i{setf function}. ++Also, it follows from this that it is @i{implementation-dependent} ++whether the name @t{(setf @i{F})} is @i{fbound}. ++ ++@node Examples of Setf Expansions, , Setf Expansions, Overview of Places and Generalized Reference ++@subsubsection Examples of Setf Expansions ++ ++Examples of the contents of the constituents of @i{setf expansions} ++follow. ++ ++For a variable @i{x}: ++ ++@format ++@group ++@noindent ++@w{ @t{()} ;list of temporary variables } ++@w{ @t{()} ;list of value forms } ++@w{ @t{(g0001)} ;list of store variables } ++@w{ @t{(setq @i{x} g0001)} ;storing form } ++@w{ @i{x} ;accessing form } ++ ++@noindent ++@w{ Figure 5--3: Sample Setf Expansion of a Variable} ++ ++@end group ++@end format ++ ++For @t{(car @i{exp})}: ++ ++@format ++@group ++@noindent ++@w{ @t{(g0002)} ;list of temporary variables } ++@w{ @t{(@i{exp})} ;list of value forms } ++@w{ @t{(g0003)} ;list of store variables } ++@w{ @t{(progn (rplaca g0002 g0003) g0003)} ;storing form } ++@w{ @t{(car g0002)} ;accessing form } ++ ++@noindent ++@w{ Figure 5--4: Sample Setf Expansion of a CAR Form } ++ ++@end group ++@end format ++ ++For @t{(subseq @i{seq} @i{s} @i{e})}: ++ ++@format ++@group ++@noindent ++@w{ @t{(g0004 g0005 g0006)} ;list of temporary variables } ++@w{ @t{(@i{seq} @i{s} @i{e})} ;list of value forms } ++@w{ @t{(g0007)} ;list of store variables } ++@w{ @t{(progn (replace g0004 g0007 :start1 g0005 :end1 g0006) g0007)} } ++@w{ ;storing form } ++@w{ @t{(subseq g0004 g0005 g0006)} ; accessing form } ++ ++@noindent ++@w{ Figure 5--5: Sample Setf Expansion of a SUBSEQ Form } ++ ++@end group ++@end format ++ ++In some cases, if a @i{subform} of a @i{place} is itself ++a @i{place}, it is necessary to expand the @i{subform} ++in order to compute some of the values in the expansion of the outer ++@i{place}. For @t{(ldb @i{bs} (car @i{exp}))}: ++ ++@format ++@group ++@noindent ++@w{ @t{(g0001 g0002)} ;list of temporary variables } ++@w{ @t{(@i{bs} @i{exp})} ;list of value forms } ++@w{ @t{(g0003)} ;list of store variables } ++@w{ @t{(progn (rplaca g0002 (dpb g0003 g0001 (car g0002))) g0003)} } ++@w{ ;storing form } ++@w{ @t{(ldb g0001 (car g0002))} ; accessing form } ++ ++@noindent ++@w{ Figure 5--6: Sample Setf Expansion of a LDB Form } ++ ++@end group ++@end format ++ ++@node Kinds of Places, Treatment of Other Macros Based on SETF, Overview of Places and Generalized Reference, Generalized Reference ++@subsection Kinds of Places ++ ++Several kinds of @i{places} are defined by @r{Common Lisp}; ++this section enumerates them. ++This set can be extended by @i{implementations} and by @i{programmer code}. ++ ++@menu ++* Variable Names as Places:: ++* Function Call Forms as Places:: ++* VALUES Forms as Places:: ++* THE Forms as Places:: ++* APPLY Forms as Places:: ++* Setf Expansions and Places:: ++* Macro Forms as Places:: ++* Symbol Macros as Places:: ++* Other Compound Forms as Places:: ++@end menu ++ ++@node Variable Names as Places, Function Call Forms as Places, Kinds of Places, Kinds of Places ++@subsubsection Variable Names as Places ++ ++The name of a @i{lexical variable} or @i{dynamic variable} ++can be used as a @i{place}. ++ ++@node Function Call Forms as Places, VALUES Forms as Places, Variable Names as Places, Kinds of Places ++@subsubsection Function Call Forms as Places ++ ++A @i{function form} can be used as a @i{place} if it falls ++into one of the following categories: ++ ++@table @asis ++ ++@item @t{*} ++A function call form whose first element is the name of ++any one of the functions in Figure 5--7. ++ ++[Editorial Note by KMP: Note that what are in some places still called `condition accessors' ++ are deliberately omitted from this table, and are not labeled as ++ accessors in their entries. I have not yet had time to do a full ++ search for these items and eliminate stray references to them as `accessors', ++ which they are not, but I will do that at some point.] ++ ++@format ++@group ++@noindent ++@w{ aref cdadr get } ++@w{ bit cdar gethash } ++@w{ caaaar cddaar logical-pathname-translations } ++@w{ caaadr cddadr macro-function } ++@w{ caaar cddar ninth } ++@w{ caadar cdddar nth } ++@w{ caaddr cddddr readtable-case } ++@w{ caadr cdddr rest } ++@w{ caar cddr row-major-aref } ++@w{ cadaar cdr sbit } ++@w{ cadadr char schar } ++@w{ cadar class-name second } ++@w{ caddar compiler-macro-function seventh } ++@w{ cadddr documentation sixth } ++@w{ caddr eighth slot-value } ++@w{ cadr elt subseq } ++@w{ car fdefinition svref } ++@w{ cdaaar fifth symbol-function } ++@w{ cdaadr fill-pointer symbol-plist } ++@w{ cdaar find-class symbol-value } ++@w{ cdadar first tenth } ++@w{ cdaddr fourth third } ++ ++@noindent ++@w{ Figure 5--7: Functions that setf can be used with---1 } ++ ++@end group ++@end format ++ ++In the case of @b{subseq}, the replacement value must be a @i{sequence} ++whose elements might be contained by the sequence argument to @b{subseq}, ++but does not have to be a @i{sequence} of the same @i{type} ++as the @i{sequence} of which the subsequence is specified. ++If the length of the replacement value does not equal the length of ++the subsequence to be replaced, then the shorter length determines ++the number of elements to be stored, as for @b{replace}. ++ ++@item @t{*} ++A function call form whose first element is the name of ++a selector function constructed by @b{defstruct}. ++ ++The function name must refer to the global function definition, ++rather than a locally defined @i{function}. ++ ++@item @t{*} ++A function call form whose first element is the name of ++any one of the functions in Figure 5--8, ++provided that the supplied argument ++to that function is in turn a @i{place} form; ++in this case the new @i{place} has stored back into it the ++result of applying the supplied ``update'' function. ++ ++@format ++@group ++@noindent ++@w{ Function name Argument that is a @i{place} Update function used } ++@w{ @b{ldb} second @b{dpb} } ++@w{ @b{mask-field} second @b{deposit-field} } ++@w{ @b{getf} first @i{implementation-dependent} } ++ ++@noindent ++@w{ Figure 5--8: Functions that setf can be used with---2 } ++ ++@end group ++@end format ++ ++During the @b{setf} expansion of these @i{forms}, it is necessary to call ++ ++@b{get-setf-expansion} ++ ++in order to figure out how the inner, nested generalized variable must be treated. ++ ++The information from ++ ++@b{get-setf-expansion} ++ ++is used as follows. ++@table @asis ++ ++@item @b{ldb} ++In a form such as: ++ ++@t{(setf (ldb @i{byte-spec} @i{place-form}) @i{value-form})} ++ ++the place referred to by the @i{place-form} must always be both @i{read} ++and @i{written}; note that the update is to the generalized variable ++specified by @i{place-form}, not to any object of @i{type} @b{integer}. ++ ++Thus this @b{setf} should generate code to do the following: ++ ++@table @asis ++ ++@item 1. ++Evaluate @i{byte-spec} (and bind it into a temporary variable). ++@item 2. ++Bind the temporary variables for @i{place-form}. ++@item 3. ++Evaluate @i{value-form} (and bind ++ ++its value or values into the store variable). ++ ++@item 4. ++Do the @i{read} from @i{place-form}. ++@item 5. ++Do the @i{write} into @i{place-form} with ++the given bits of the @i{integer} ++ fetched in step 4 replaced with the value from step 3. ++@end table ++ ++ If the evaluation of @i{value-form} ++in step 3 alters what is found in @i{place-form}, ++such as setting different bits of @i{integer}, ++ then the change of the bits denoted by ++@i{byte-spec} is to that ++ altered @i{integer}, ++because step 4 is done after the @i{value-form} ++ evaluation. Nevertheless, the ++ evaluations required for @i{binding} ++the temporary variables are done in steps 1 and ++ 2, and thus the expected left-to-right evaluation order is seen. ++For example: ++ ++@example ++ (setq integer #x69) @result{} #x69 ++ (rotatef (ldb (byte 4 4) integer) ++ (ldb (byte 4 0) integer)) ++ integer @result{} #x96 ++;;; This example is trying to swap two independent bit fields ++;;; in an integer. Note that the generalized variable of ++;;; interest here is just the (possibly local) program variable ++;;; integer. ++@end example ++ ++@item @b{mask-field} ++This case is the same as @b{ldb} in all essential aspects. ++ ++@item @b{getf} ++In a form such as: ++ ++@t{(setf (getf @i{place-form} @i{ind-form}) @i{value-form})} ++ ++ the place referred to by @i{place-form} must always be both @i{read} ++ and @i{written}; note that the update is to the generalized variable ++ specified by @i{place-form}, not necessarily to the particular ++@i{list} ++that is the property list in question. ++ ++ Thus this @b{setf} should generate code to do the following: ++@table @asis ++ ++@item 1. ++Bind the temporary variables for @i{place-form}. ++@item 2. ++Evaluate @i{ind-form} (and bind it into a temporary variable). ++@item 3. ++Evaluate @i{value-form} (and bind ++ ++its value or values into the store variable). ++ ++@item 4. ++Do the @i{read} from @i{place-form}. ++@item 5. ++Do the @i{write} into @i{place-form} with a possibly-new property list ++ obtained by combining the values from steps 2, 3, and 4. ++(Note that the phrase ``possibly-new property list'' can mean that ++ the former property list is somehow destructively re-used, or it can ++ mean partial or full copying of it. ++Since either copying or destructive re-use can occur, ++the treatment of the resultant value for the ++ possibly-new property list must proceed as if it were a different copy ++ needing to be stored back into the generalized variable.) ++@end table ++ ++ If the evaluation of @i{value-form} ++in step 3 alters what is found in ++@i{place-form}, such as setting a different named property in the list, ++ then the change of the property denoted by @i{ind-form} ++is to that ++ altered list, because step 4 is done after the ++@i{value-form} ++ evaluation. Nevertheless, the ++ evaluations required for @i{binding} ++the temporary variables are done in steps 1 and ++ 2, and thus the expected left-to-right evaluation order is seen. ++ ++For example: ++ ++@example ++ (setq s (setq r (list (list 'a 1 'b 2 'c 3)))) @result{} ((a 1 b 2 c 3)) ++ (setf (getf (car r) 'b) ++ (progn (setq r nil) 6)) @result{} 6 ++ r @result{} NIL ++ s @result{} ((A 1 B 6 C 3)) ++;;; Note that the (setq r nil) does not affect the actions of ++;;; the SETF because the value of R had already been saved in ++;;; a temporary variable as part of the step 1. Only the CAR ++;;; of this value will be retrieved, and subsequently modified ++;;; after the value computation. ++@end example ++ ++@end table ++ ++@end table ++ ++@node VALUES Forms as Places, THE Forms as Places, Function Call Forms as Places, Kinds of Places ++@subsubsection VALUES Forms as Places ++ ++A @b{values} @i{form} can be used as a @i{place}, ++provided that each of its @i{subforms} is also a @i{place} form. ++ ++A form such as ++ ++@t{(setf (values @i{place-1} \dots @i{place-n}) @i{values-form})} ++ ++does the following: ++ ++@table @asis ++ ++@item 1. ++The @i{subforms} of each nested @i{place} are evaluated ++in left-to-right order. ++@item 2. ++The @i{values-form} is evaluated, and the first store ++variable from each @i{place} is bound to its return values as if by ++@b{multiple-value-bind}. ++@item 3. ++If the @i{setf expansion} for any @i{place} ++involves more than one store variable, then the additional ++store variables are bound to @b{nil}. ++@item 4. ++The storing forms for each @i{place} are evaluated in ++left-to-right order. ++@end table ++ ++The storing form in the @i{setf expansion} of @b{values} ++returns as @i{multiple values}_2 the values of the store ++variables in step 2. That is, the number of values returned is the ++same as the number of @i{place} forms. This may be more or fewer ++values than are produced by the @i{values-form}. ++ ++@node THE Forms as Places, APPLY Forms as Places, VALUES Forms as Places, Kinds of Places ++@subsubsection THE Forms as Places ++ ++A @b{the} @i{form} can be used as a @i{place}, ++in which case the declaration is transferred to the @i{newvalue} form, ++and the resulting @b{setf} is analyzed. For example, ++ ++@example ++ (setf (the integer (cadr x)) (+ y 3)) ++@end example ++ ++is processed as if it were ++ ++@example ++ (setf (cadr x) (the integer (+ y 3))) ++@end example ++ ++@node APPLY Forms as Places, Setf Expansions and Places, THE Forms as Places, Kinds of Places ++@subsubsection APPLY Forms as Places ++ ++The following situations involving @b{setf} of @b{apply} must be supported: ++ ++@table @asis ++ ++@item @t{*} ++@t{(setf (apply #'aref @i{array} ++ @{@i{subscript}@}* ++ @i{more-subscripts}) ++ @i{new-element})} ++@item @t{*} ++@t{(setf (apply #'bit @i{array} ++ @{@i{subscript}@}* ++ @i{more-subscripts}) ++ @i{new-element})} ++@item @t{*} ++@t{(setf (apply #'sbit @i{array} ++ @{@i{subscript}@}* ++ @i{more-subscripts}) ++ @i{new-element})} ++@end table ++ ++In all three cases, the @i{element} of @i{array} designated ++by the concatenation of @i{subscripts} and @i{more-subscripts} ++(@i{i.e.}, the same @i{element} which would be @i{read} by the call to ++ @i{apply} if it were not part of a @b{setf} @i{form}) ++is changed to have the @i{value} given by @i{new-element}. ++ ++For these usages, the function name (@b{aref}, @b{bit}, or @b{sbit}) ++must refer to the global function definition, rather than a locally defined ++@i{function}. ++ ++No other @i{standardized} @i{function} is required to be supported, ++but an @i{implementation} may define such support. ++An @i{implementation} may also define support ++for @i{implementation-defined} @i{operators}. ++ ++If a user-defined @i{function} is used in this context, ++the following equivalence is true, except that care is taken ++to preserve proper left-to-right evaluation of argument @i{subforms}: ++ ++@example ++ (setf (apply #'@i{name} @{@i{arg}@}*) @i{val}) ++ @equiv{} (apply #'(setf @i{name}) @i{val} @{@i{arg}@}*) ++@end example ++ ++@node Setf Expansions and Places, Macro Forms as Places, APPLY Forms as Places, Kinds of Places ++@subsubsection Setf Expansions and Places ++ ++Any @i{compound form} for which the @i{operator} has a ++ ++@i{setf expander} ++ ++defined can be used as a @i{place}. ++ ++The ++@i{operator} ++must refer to the global function definition, ++rather than a locally defined @i{function} or @i{macro}. ++ ++@node Macro Forms as Places, Symbol Macros as Places, Setf Expansions and Places, Kinds of Places ++@subsubsection Macro Forms as Places ++ ++A @i{macro form} can be used as a @i{place}, ++in which case @r{Common Lisp} expands the @i{macro form} ++ ++as if by @b{macroexpand-1} ++ ++and then uses the @i{macro expansion} in place of the original @i{place}. ++ ++Such @i{macro expansion} is attempted only after exhausting all other possibilities ++other than expanding into a call to a function named @t{(setf @i{reader})}. ++ ++@node Symbol Macros as Places, Other Compound Forms as Places, Macro Forms as Places, Kinds of Places ++@subsubsection Symbol Macros as Places ++ ++A reference to a @i{symbol} that has been @i{established} as a @i{symbol macro} ++can be used as a @i{place}. In this case, ++@b{setf} expands the reference and then analyzes the resulting @i{form}. ++ ++@node Other Compound Forms as Places, , Symbol Macros as Places, Kinds of Places ++@subsubsection Other Compound Forms as Places ++ ++For any other @i{compound form} for which the @i{operator} is a ++@i{symbol} @i{f}, ++the @b{setf} @i{form} expands into a call ++to the @i{function} named @t{(setf @i{f})}. ++The first @i{argument} in the newly constructed @i{function form} ++is @i{newvalue} and the ++ remaining @i{arguments} are the remaining @i{elements} of ++ @i{place}. ++This expansion occurs regardless of whether @i{f} or @t{(setf @i{f})} ++is defined as a @i{function} locally, globally, or not at all. ++For example, ++ ++@t{(setf (@i{f} @i{arg1} @i{arg2} ...) @i{new-value})} ++ ++expands into a form with the same effect and value as ++ ++@example ++ (let ((#:temp-1 arg1) ;force correct order of evaluation ++ (#:temp-2 arg2) ++ ... ++ (#:temp-0 @i{new-value})) ++ (funcall (function (setf @i{f})) #:temp-0 #:temp-1 #:temp-2...)) ++@end example ++ ++A @i{function} named @t{(setf @i{f})} must return its first argument ++as its only value in order to preserve the semantics of @b{setf}. ++ ++@node Treatment of Other Macros Based on SETF, , Kinds of Places, Generalized Reference ++@subsection Treatment of Other Macros Based on SETF ++ ++For each of the ``read-modify-write'' @i{operators} in Figure 5--9, ++and for any additional @i{macros} ++defined by the @i{programmer} using @b{define-modify-macro}, ++an exception is made to the normal rule of left-to-right evaluation of arguments. ++Evaluation of @i{argument} @i{forms} occurs in left-to-right order, ++with the exception that for the @i{place} @i{argument}, the actual ++@i{read} of the ``old value'' from that @i{place} happens ++after all of the @i{argument} @i{form} @i{evaluations}, ++and just before a ``new value'' is computed and @i{written} back into the @i{place}. ++ ++Specifically, each of these @i{operators} can be viewed as involving a ++@i{form} with the following general syntax: ++ ++@example ++ (@i{operator} @{@i{preceding-form}@}* @i{place} @{@i{following-form}@}*) ++@end example ++ ++The evaluation of each such @i{form} proceeds like this: ++ ++@table @asis ++ ++@item 1. ++@i{Evaluate} each of the @i{preceding-forms}, in left-to-right order. ++@item 2. ++@i{Evaluate} the @i{subforms} of the @i{place}, ++ in the order specified by the second value of the @i{setf expansion} ++ for that @i{place}. ++@item 3. ++@i{Evaluate} each of the @i{following-forms}, in left-to-right order. ++@item 4. ++@i{Read} the old value from @i{place}. ++@item 5. ++Compute the new value. ++@item 6. ++Store the new value into @i{place}. ++@end table ++ ++@format ++@group ++@noindent ++@w{ decf pop pushnew } ++@w{ incf push remf } ++ ++@noindent ++@w{ Figure 5--9: Read-Modify-Write Macros} ++ ++@end group ++@end format ++ ++@c end of including concept-places ++ ++@node Transfer of Control to an Exit Point, Data and Control Flow Dictionary, Generalized Reference, Data and Control Flow ++@section Transfer of Control to an Exit Point ++ ++@c including concept-exits ++ ++When a transfer of control is initiated by @b{go}, ++@b{return-from}, or @b{throw} ++the following events occur in order to accomplish the transfer of control. ++Note that for @b{go}, ++the @i{exit point} is the @i{form} within the @b{tagbody} ++that is being executed at the time the @b{go} is performed; ++for @b{return-from}, ++the @i{exit point} is the corresponding ++@b{block} @i{form}; ++and for @b{throw}, ++the @i{exit point} is the corresponding ++@b{catch} @i{form}. ++ ++@table @asis ++ ++@item 1. ++Intervening @i{exit points} are ``abandoned'' ++ (@i{i.e.}, their @i{extent} ends ++ and it is no longer valid to attempt to transfer control through them). ++ ++@item 2. ++The cleanup clauses of any intervening @b{unwind-protect} clauses ++ are evaluated. ++ ++@item 3. ++Intervening dynamic @i{bindings} of @b{special} variables, ++ @i{catch tags}, @i{condition handlers}, and @i{restarts} ++ are undone. ++ ++@item 4. ++The @i{extent} of the @i{exit point} being invoked ends, ++ and control is passed to the target. ++@end table ++ ++The extent of an exit being ``abandoned'' because it is being passed over ++ends as soon as the transfer of control is initiated. That is, ++event 1 occurs at the beginning of the initiation of the transfer of ++control. ++The consequences are undefined if an attempt is made to transfer control ++to an @i{exit point} whose @i{dynamic extent} has ended. ++ ++Events 2 and 3 are actually performed interleaved, in the order ++corresponding to the reverse order in which they were established. ++The effect of this is that the cleanup clauses of an @b{unwind-protect} ++see the same dynamic @i{bindings} ++of variables and @i{catch tags} as were ++visible when the @b{unwind-protect} was entered. ++ ++Event 4 occurs at the end of the transfer of control. ++ ++@c end of including concept-exits ++ ++@node Data and Control Flow Dictionary, , Transfer of Control to an Exit Point, Data and Control Flow ++@section Data and Control Flow Dictionary ++ ++@c including dict-flow ++ ++@menu ++* apply:: ++* defun:: ++* fdefinition:: ++* fboundp:: ++* fmakunbound:: ++* flet:: ++* funcall:: ++* function (Special Operator):: ++* function-lambda-expression:: ++* functionp:: ++* compiled-function-p:: ++* call-arguments-limit:: ++* lambda-list-keywords:: ++* lambda-parameters-limit:: ++* defconstant:: ++* defparameter:: ++* destructuring-bind:: ++* let:: ++* progv:: ++* setq:: ++* psetq:: ++* block:: ++* catch:: ++* go:: ++* return-from:: ++* return:: ++* tagbody:: ++* throw:: ++* unwind-protect:: ++* nil:: ++* not:: ++* t:: ++* eq:: ++* eql:: ++* equal:: ++* equalp:: ++* identity:: ++* complement:: ++* constantly:: ++* every:: ++* and:: ++* cond:: ++* if:: ++* or:: ++* when:: ++* case:: ++* typecase:: ++* multiple-value-bind:: ++* multiple-value-call:: ++* multiple-value-list:: ++* multiple-value-prog1:: ++* multiple-value-setq:: ++* values:: ++* values-list:: ++* multiple-values-limit:: ++* nth-value:: ++* prog:: ++* prog1:: ++* progn:: ++* define-modify-macro:: ++* defsetf:: ++* define-setf-expander:: ++* get-setf-expansion:: ++* setf:: ++* shiftf:: ++* rotatef:: ++* control-error:: ++* program-error:: ++* undefined-function:: ++@end menu ++ ++@node apply, defun, Data and Control Flow Dictionary, Data and Control Flow Dictionary ++@subsection apply [Function] ++ ++@code{apply} @i{function @r{&rest} args^+} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{function designator}. ++ ++@i{args}---a @i{spreadable argument list designator}. ++ ++@i{results}---the @i{values} returned by @i{function}. ++ ++@subsubheading Description:: ++ ++@i{Applies} the @i{function} to the @i{args}. ++ ++When the @i{function} receives its arguments via @b{&rest}, it is ++permissible (but not required) for the @i{implementation} to @i{bind} ++the @i{rest parameter} ++to an @i{object} that shares structure with the last argument to @b{apply}. ++Because a @i{function} can neither detect whether it was called via @b{apply} ++nor whether (if so) the last argument to @b{apply} was a @i{constant}, ++@i{conforming programs} must neither rely on the @i{list} structure ++of a @i{rest list} to be freshly consed, nor modify that @i{list} structure. ++ ++@b{setf} can be used with @b{apply} in certain circumstances; ++see @ref{APPLY Forms as Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq f '+) @result{} + ++ (apply f '(1 2)) @result{} 3 ++ (setq f #'-) @result{} # ++ (apply f '(1 2)) @result{} -1 ++ (apply #'max 3 5 '(2 7 3)) @result{} 7 ++ (apply 'cons '((+ 2 3) 4)) @result{} ((+ 2 3) . 4) ++ (apply #'+ '()) @result{} 0 ++ ++ (defparameter *some-list* '(a b c)) ++ (defun strange-test (&rest x) (eq x *some-list*)) ++ (apply #'strange-test *some-list*) @result{} @i{implementation-dependent} ++ ++ (defun bad-boy (&rest x) (rplacd x 'y)) ++ (bad-boy 'a 'b 'c) has undefined consequences. ++ (apply #'bad-boy *some-list*) has undefined consequences. ++@end example ++ ++@example ++ (defun foo (size &rest keys &key double &allow-other-keys) ++ (let ((v (apply #'make-array size :allow-other-keys t keys))) ++ (if double (concatenate (type-of v) v v) v))) ++ (foo 4 :initial-contents '(a b c d) :double t) ++ @result{} #(A B C D A B C D) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{funcall} ++, ++@ref{fdefinition} ++, ++@b{function}, ++@ref{Evaluation}, ++@ref{APPLY Forms as Places} ++ ++@node defun, fdefinition, apply, Data and Control Flow Dictionary ++@subsection defun [Macro] ++ ++@code{defun} @i{function-name lambda-list @r{[[@{@i{declaration}@}* | @i{documentation}]]} @{@i{form}@}*}@* ++ @result{} @i{function-name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-name}---a @i{function name}. ++ ++@i{lambda-list}---an @i{ordinary lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{block-name}---the @i{function block name} of the @i{function-name}. ++ ++@subsubheading Description:: ++ ++Defines a new @i{function} named @i{function-name} in the @i{global environment}. ++The body of the @i{function} defined by @b{defun} consists ++of @i{forms}; they are executed as an @i{implicit progn} ++when the @i{function} is called. ++@b{defun} can be used ++ to define a new @i{function}, ++ to install a corrected version of an incorrect definition, ++ to redefine an already-defined @i{function}, ++ or to redefine a @i{macro} as a @i{function}. ++ ++@b{defun} implicitly puts a @b{block} named @i{block-name} ++around the body @i{forms} ++ ++(but not the @i{forms} in the @i{lambda-list}) ++ ++of the @i{function} defined. ++ ++@i{Documentation} is attached as a @i{documentation string} ++ to @i{name} (as kind @b{function}) ++and to the @i{function} @i{object}. ++ ++Evaluating @b{defun} causes @i{function-name} to be a global name ++for the @i{function} specified by the @i{lambda expression} ++ ++@example ++ (lambda @i{lambda-list} ++ @r{[[@{@i{declaration}@}* | @i{documentation}]]} ++ (block @i{block-name} @{@i{form}@}*)) ++@end example ++ ++processed in the @i{lexical environment} in which @b{defun} was executed. ++ ++(None of the arguments are evaluated at macro expansion time.) ++ ++@b{defun} is not required to perform any compile-time side effects. ++In particular, @b{defun} does not make the @i{function} definition available ++at compile time. An @i{implementation} may choose to store information ++about the @i{function} for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls), ++or to enable the @i{function} to be expanded inline. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun recur (x) ++ (when (> x 0) ++ (recur (1- x)))) @result{} RECUR ++ (defun ex (a b &optional c (d 66) &rest keys &key test (start 0)) ++ (list a b c d keys test start)) @result{} EX ++ (ex 1 2) @result{} (1 2 NIL 66 NIL NIL 0) ++ (ex 1 2 3 4 :test 'equal :start 50) ++@result{} (1 2 3 4 (:TEST EQUAL :START 50) EQUAL 50) ++ (ex :test 1 :start 2) @result{} (:TEST 1 :START 2 NIL NIL 0) ++ ++ ;; This function assumes its callers have checked the types of the ++ ;; arguments, and authorizes the compiler to build in that assumption. ++ (defun discriminant (a b c) ++ (declare (number a b c)) ++ "Compute the discriminant for a quadratic equation." ++ (- (* b b) (* 4 a c))) @result{} DISCRIMINANT ++ (discriminant 1 2/3 -2) @result{} 76/9 ++ ++ ;; This function assumes its callers have not checked the types of the ++ ;; arguments, and performs explicit type checks before making any assumptions. ++ (defun careful-discriminant (a b c) ++ "Compute the discriminant for a quadratic equation." ++ (check-type a number) ++ (check-type b number) ++ (check-type c number) ++ (locally (declare (number a b c)) ++ (- (* b b) (* 4 a c)))) @result{} CAREFUL-DISCRIMINANT ++ (careful-discriminant 1 2/3 -2) @result{} 76/9 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{flet} ++, ++@b{labels}, ++@ref{block} ++, ++@ref{return-from} ++, ++@b{declare}, ++@ref{documentation} ++, ++@ref{Evaluation}, ++@ref{Ordinary Lambda Lists}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++@b{return-from} can be used to return ++prematurely from a @i{function} defined by @b{defun}. ++ ++Additional side effects might take place when additional information ++(typically debugging information) ++about the function definition is recorded. ++ ++@node fdefinition, fboundp, defun, Data and Control Flow Dictionary ++@subsection fdefinition [Accessor] ++ ++@code{fdefinition} @i{function-name} @result{} @i{definition} ++ ++(setf (@code{ fdefinition} @i{function-name}) new-definition)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-name}---a @i{function name}. ++ ++In the non-@b{setf} case, ++the @i{name} must be @i{fbound} in the @i{global environment}. ++ ++@i{definition}---Current global function definition named by @i{function-name}. ++ ++@i{new-definition}---a @i{function}. ++ ++@subsubheading Description:: ++ ++@b{fdefinition} @i{accesses} the current global function definition ++named by @i{function-name}. The definition may be a ++@i{function} or may be an @i{object} representing a ++@i{special form} or @i{macro}. ++ ++The value returned by @b{fdefinition} when @b{fboundp} returns true ++but the @i{function-name} denotes a @i{macro} or ++@i{special form} is not well-defined, but @b{fdefinition} does not signal an error. ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{function-name} is not a @i{function name}. ++ ++An error of @i{type} @b{undefined-function} is signaled ++in the non-@b{setf} case if @i{function-name} is not @i{fbound}. ++ ++@subsubheading See Also:: ++ ++@ref{fboundp} ++, ++@ref{fmakunbound} ++, ++@ref{macro-function} ++, ++ ++@ref{special-operator-p} ++, ++ ++@ref{symbol-function} ++ ++@subsubheading Notes:: ++ ++@b{fdefinition} cannot @i{access} the value of a lexical function name ++produced by @b{flet} or @b{labels}; it can @i{access} only ++the global function value. ++ ++@b{setf} can be used with ++@b{fdefinition} to replace a global function ++definition when the @i{function-name}'s function definition ++does not represent a @i{special form}. ++ ++@b{setf} of @b{fdefinition} ++requires a @i{function} as the new value. ++It is an error to set the @b{fdefinition} of a @i{function-name} ++to a @i{symbol}, a @i{list}, or the value returned ++by @b{fdefinition} on the name of a @i{macro} ++or @i{special form}. ++ ++@node fboundp, fmakunbound, fdefinition, Data and Control Flow Dictionary ++@subsection fboundp [Function] ++ ++@code{fboundp} @i{name} @result{} @i{generalized-boolean} ++ ++@subsubheading Pronunciation:: ++ ++pronounced ,ef 'baund p\=e ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{function name}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{name} is @i{fbound}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (fboundp 'car) @result{} @i{true} ++ (fboundp 'nth-value) @result{} @i{false} ++ (fboundp 'with-open-file) @result{} @i{true} ++ (fboundp 'unwind-protect) @result{} @i{true} ++ (defun my-function (x) x) @result{} MY-FUNCTION ++ (fboundp 'my-function) @result{} @i{true} ++ (let ((saved-definition (symbol-function 'my-function))) ++ (unwind-protect (progn (fmakunbound 'my-function) ++ (fboundp 'my-function)) ++ (setf (symbol-function 'my-function) saved-definition))) ++@result{} @i{false} ++ (fboundp 'my-function) @result{} @i{true} ++ (defmacro my-macro (x) `',x) @result{} MY-MACRO ++ (fboundp 'my-macro) @result{} @i{true} ++ (fmakunbound 'my-function) @result{} MY-FUNCTION ++ (fboundp 'my-function) @result{} @i{false} ++ (flet ((my-function (x) x)) ++ (fboundp 'my-function)) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{name} is not a @i{function name}. ++ ++@subsubheading See Also:: ++ ++@ref{symbol-function} ++, ++@ref{fmakunbound} ++, ++@ref{fdefinition} ++ ++@subsubheading Notes:: ++ ++It is permissible to call @b{symbol-function} on any @i{symbol} ++that is @i{fbound}. ++ ++@b{fboundp} is sometimes used to ``guard'' ++an access to the @i{function cell}, as in: ++@example ++(if (fboundp x) (symbol-function x)) ++@end example ++ ++Defining a @i{setf expander} @i{F} does not cause the @i{setf function} ++@t{(setf @i{F})} to become defined. ++ ++@node fmakunbound, flet, fboundp, Data and Control Flow Dictionary ++@subsection fmakunbound [Function] ++ ++@code{fmakunbound} @i{name} @result{} @i{name} ++ ++@subsubheading Pronunciation:: ++ ++ pronounced ,ef 'mak e n,baund ++ or pronounced ,ef 'm\=a k e n,baund ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{function name}. ++ ++@subsubheading Description:: ++ ++Removes the @i{function} or @i{macro} definition, if any, of @i{name} ++in the @i{global environment}. ++ ++@subsubheading Examples:: ++ ++@example ++(defun add-some (x) (+ x 19)) @result{} ADD-SOME ++ (fboundp 'add-some) @result{} @i{true} ++ (flet ((add-some (x) (+ x 37))) ++ (fmakunbound 'add-some) ++ (add-some 1)) @result{} 38 ++ (fboundp 'add-some) @result{} @i{false} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal an error of @i{type} @b{type-error} ++ if @i{name} is not a @i{function name}. ++ ++The consequences are undefined if @i{name} is a @i{special operator}. ++ ++@subsubheading See Also:: ++ ++@ref{fboundp} ++, ++@ref{makunbound} ++ ++@node flet, funcall, fmakunbound, Data and Control Flow Dictionary ++@subsection flet, labels, macrolet [Special Operator] ++ ++@code{flet} @i{@r{(}@{@r{(}@i{function-name} ++ @i{lambda-list} ++ @r{[[@{@i{local-declaration}@}* ++ | @i{local-documentation}]]} ++ @{@i{local-form}@}*@r{)}@}*@r{)} ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@code{labels} @i{@r{(}@{@r{(}@i{function-name} ++ @i{lambda-list} ++ @r{[[@{@i{local-declaration}@}* ++ | @i{local-documentation}]]} ++ @{@i{local-form}@}*@r{)}@}*@r{)} ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@code{macrolet} @i{@r{(}@{@r{(}@i{name} ++ @i{lambda-list} ++ @r{[[@{@i{local-declaration}@}* ++ | @i{local-documentation}]]} ++ @{@i{local-form}@}*@r{)}@}*@r{)} ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-name}---a @i{function name}. ++ ++@i{name}---a @i{symbol}. ++ ++@i{lambda-list}---a @i{lambda list}; ++ for @b{flet} and @b{labels}, ++ it is an @i{ordinary lambda list}; ++ for @b{macrolet}, ++ it is a @i{macro lambda list}. ++ ++@i{local-declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{local-documentation}---a @i{string}; not evaluated. ++ ++@i{local-forms}, @i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{flet}, @b{labels}, and @b{macrolet} ++define local @i{functions} and @i{macros}, and execute ++@i{forms} using the local definitions. ++@i{Forms} are executed in order of occurrence. ++ ++The body forms (but not the @i{lambda list}) ++ ++of each @i{function} created by @b{flet} and @b{labels} ++and each @i{macro} created by @b{macrolet} ++are enclosed in an @i{implicit block} whose name ++is the @i{function block name} of the @i{function-name} or @i{name}, ++as appropriate. ++ ++The scope of the @i{declarations} ++between ++the list of local function/macro definitions and the body @i{forms} ++in @b{flet} and @b{labels} ++does not include the bodies of the ++locally defined @i{functions}, except that for @b{labels}, ++any @b{inline}, @b{notinline}, or @b{ftype} declarations ++that refer to the locally defined functions do apply to the local function ++bodies. That is, their @i{scope} ++is the same as the function name that they ++affect. ++ ++The scope of these @i{declarations} ++does not include the bodies of the macro expander ++functions defined by @b{macrolet}. ++ ++@table @asis ++ ++@item flet ++@b{flet} defines locally named @i{functions} and executes a series of ++@i{forms} with these definition @i{bindings}. Any number of ++such local @i{functions} can be defined. ++ ++The @i{scope} of the name @i{binding} encompasses only the body. ++Within the ++body of @b{flet}, ++@i{function-names} matching those defined ++by @b{flet} ++refer to the locally defined @i{functions} ++rather than to ++the global function definitions of the same name. ++ ++Also, within the scope of @b{flet}, ++global @i{setf expander} definitions of the @i{function-name} ++defined by @b{flet} do not apply. ++Note that this applies to ++@t{(defsetf @i{f} ...)}, not ++@t{(defmethod (setf @i{f}) ...)}. ++ ++The names of @i{functions} defined by @b{flet} ++are in the @i{lexical environment}; they retain ++their local definitions only within the body of @b{flet}. ++The function definition bindings are visible only in ++the body of @b{flet}, not the definitions themselves. Within the ++function definitions, local function names ++that match those being ++defined refer to @i{functions} or ++@i{macros} defined outside the @b{flet}. ++@b{flet} can locally @i{shadow} a global function name, ++and the new definition can refer to the global definition. ++ ++Any @i{local-documentation} is attached to the corresponding local @i{function} ++(if one is actually created) as a @i{documentation string}. ++ ++@item labels ++@b{labels} is equivalent to @b{flet} except that ++the scope of the defined function names for @b{labels} ++encompasses the function definitions themselves as well as the body. ++ ++@item macrolet ++@b{macrolet} ++establishes local @i{macro} definitions, ++using the same format used by @b{defmacro}. ++ ++Within the body of @b{macrolet}, ++global @i{setf expander} definitions of the @i{names} defined by the ++@b{macrolet} do not apply; rather, @b{setf} expands the ++@i{macro form} and recursively process the resulting @i{form}. ++ ++The macro-expansion functions defined by @b{macrolet} ++are defined in the ++ ++@i{lexical environment} in which the @b{macrolet} form appears. ++Declarations and @b{macrolet} and ++@b{symbol-macrolet} definitions ++affect the local macro definitions in a @b{macrolet}, but the ++consequences are undefined if the local macro definitions reference ++any local @i{variable} or @i{function} @i{bindings} that are visible in that ++@i{lexical environment}. ++ ++Any @i{local-documentation} is attached to the corresponding local @i{macro function} ++as a @i{documentation string}. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (defun foo (x flag) ++ (macrolet ((fudge (z) ++ ;The parameters x and flag are not accessible ++ ; at this point; a reference to flag would be to ++ ; the global variable of that name. ++ ` (if flag (* ,z ,z) ,z))) ++ ;The parameters x and flag are accessible here. ++ (+ x ++ (fudge x) ++ (fudge (+ x 1))))) ++ @equiv{} ++ (defun foo (x flag) ++ (+ x ++ (if flag (* x x) x) ++ (if flag (* (+ x 1) (+ x 1)) (+ x 1)))) ++@end example ++ ++after macro expansion. The occurrences of @t{x} and @t{flag} legitimately ++refer to the parameters of the function @t{foo} because those parameters are ++visible at the site of the macro call which produced the expansion. ++ ++@example ++ (flet ((flet1 (n) (+ n n))) ++ (flet ((flet1 (n) (+ 2 (flet1 n)))) ++ (flet1 2))) @result{} 6 ++ ++ (defun dummy-function () 'top-level) @result{} DUMMY-FUNCTION ++ (funcall #'dummy-function) @result{} TOP-LEVEL ++ (flet ((dummy-function () 'shadow)) ++ (funcall #'dummy-function)) @result{} SHADOW ++ (eq (funcall #'dummy-function) (funcall 'dummy-function)) ++@result{} @i{true} ++ (flet ((dummy-function () 'shadow)) ++ (eq (funcall #'dummy-function) ++ (funcall 'dummy-function))) ++@result{} @i{false} ++ ++ (defun recursive-times (k n) ++ (labels ((temp (n) ++ (if (zerop n) 0 (+ k (temp (1- n)))))) ++ (temp n))) @result{} RECURSIVE-TIMES ++ (recursive-times 2 3) @result{} 6 ++ ++ (defmacro mlets (x &environment env) ++ (let ((form `(babbit ,x))) ++ (macroexpand form env))) @result{} MLETS ++ (macrolet ((babbit (z) `(+ ,z ,z))) (mlets 5)) @result{} 10 ++@end example ++ ++@example ++ (flet ((safesqrt (x) (sqrt (abs x)))) ++ ;; The safesqrt function is used in two places. ++ (safesqrt (apply #'+ (map 'list #'safesqrt '(1 2 3 4 5 6))))) ++@result{} 3.291173 ++@end example ++ ++@example ++ (defun integer-power (n k) ++ (declare (integer n)) ++ (declare (type (integer 0 *) k)) ++ (labels ((expt0 (x k a) ++ (declare (integer x a) (type (integer 0 *) k)) ++ (cond ((zerop k) a) ++ ((evenp k) (expt1 (* x x) (floor k 2) a)) ++ (t (expt0 (* x x) (floor k 2) (* x a))))) ++ (expt1 (x k a) ++ (declare (integer x a) (type (integer 0 *) k)) ++ (cond ((evenp k) (expt1 (* x x) (floor k 2) a)) ++ (t (expt0 (* x x) (floor k 2) (* x a)))))) ++ (expt0 n k 1))) @result{} INTEGER-POWER ++@end example ++ ++@example ++ (defun example (y l) ++ (flet ((attach (x) ++ (setq l (append l (list x))))) ++ (declare (inline attach)) ++ (dolist (x y) ++ (unless (null (cdr x)) ++ (attach x))) ++ l)) ++ ++ (example '((a apple apricot) (b banana) (c cherry) (d) (e)) ++ '((1) (2) (3) (4 2) (5) (6 3 2))) ++@result{} ((1) (2) (3) (4 2) (5) (6 3 2) (A APPLE APRICOT) (B BANANA) (C CHERRY)) ++@end example ++ ++@subsubheading See Also:: ++ ++@b{declare}, ++@ref{defmacro} ++, ++@ref{defun} ++, ++@ref{documentation} ++, ++@ref{let} ++, ++@ref{Evaluation}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++ ++It is not possible to define recursive @i{functions} with @b{flet}. ++@b{labels} can be used to define mutually recursive @i{functions}. ++ ++If a @b{macrolet} @i{form} is a @i{top level form}, ++the body @i{forms} are also processed as @i{top level forms}. ++See @ref{File Compilation}. ++ ++@node funcall, function (Special Operator), flet, Data and Control Flow Dictionary ++@subsection funcall [Function] ++ ++@code{funcall} @i{function @r{&rest} args} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{function designator}. ++ ++@i{args}---@i{arguments} to the @i{function}. ++ ++@i{results}---the @i{values} returned by the @i{function}. ++ ++@subsubheading Description:: ++ ++@b{funcall} applies @i{function} to @i{args}. ++ ++If @i{function} is a @i{symbol}, ++it is coerced to a @i{function} as if by ++finding its @i{functional value} in the @i{global environment}. ++ ++@subsubheading Examples:: ++ ++@example ++ (funcall #'+ 1 2 3) @result{} 6 ++ (funcall 'car '(1 2 3)) @result{} 1 ++ (funcall 'position 1 '(1 2 3 2 1) :start 1) @result{} 4 ++ (cons 1 2) @result{} (1 . 2) ++ (flet ((cons (x y) `(kons ,x ,y))) ++ (let ((cons (symbol-function '+))) ++ (funcall #'cons ++ (funcall 'cons 1 2) ++ (funcall cons 1 2)))) ++@result{} (KONS (1 . 2) 3) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++An error of @i{type} @b{undefined-function} should be signaled if @i{function} ++is a @i{symbol} that does not have a global definition as a @i{function} ++or that has a global definition as a @i{macro} or a @i{special operator}. ++ ++@subsubheading See Also:: ++ ++@ref{apply} ++, @b{function}, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++@example ++ (funcall @i{function} @i{arg1} @i{arg2} ...) ++ @equiv{} (apply @i{function} @i{arg1} @i{arg2} ... nil) ++ @equiv{} (apply @i{function} (list @i{arg1} @i{arg2} ...)) ++@end example ++ ++The difference between @b{funcall} and an ordinary function call is that ++in the former case the @i{function} is obtained by ordinary @i{evaluation} ++of a @i{form}, and in the latter case it is obtained by the special ++interpretation of the function position that normally occurs. ++ ++@node function (Special Operator), function-lambda-expression, funcall, Data and Control Flow Dictionary ++@subsection function [Special Operator] ++ ++@code{function} @i{name} @result{} @i{function} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{function name} or @i{lambda expression}. ++ ++@i{function}---a @i{function} @i{object}. ++ ++@subsubheading Description:: ++ ++The @i{value} of @b{function} is the @i{functional value} of @i{name} ++in the current @i{lexical environment}. ++ ++If @i{name} is a @i{function name}, the functional definition of that name ++is that ++established by the innermost lexically enclosing ++@b{flet}, @b{labels}, or @b{macrolet} @i{form}, ++if there is one. Otherwise the global functional definition of the ++@i{function name} ++is returned. ++ ++If @i{name} is a @i{lambda expression}, then a @i{lexical closure} ++is returned. In situations where a @i{closure} over the same set of ++@i{bindings} might be produced more than once, the various resulting ++@i{closures} might or might not be @b{eq}. ++ ++It is an error to use @b{function} on a @i{function name} ++that does not denote a @i{function} in the lexical environment in ++which the @b{function} form appears. ++Specifically, it is an error to use @b{function} on a @i{symbol} ++that denotes a @i{macro} or @i{special form}. ++An implementation may choose not to signal this error for ++performance reasons, but implementations are forbidden from ++defining the failure to signal an error as a useful behavior. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun adder (x) (function (lambda (y) (+ x y)))) ++@end example ++ ++The result of @t{(adder 3)} is a function that adds @t{3} to its argument: ++ ++@example ++ (setq add3 (adder 3)) ++ (funcall add3 5) @result{} 8 ++@end example ++ ++This works because @b{function} creates a @i{closure} of ++the @i{lambda expression} that is able to refer to the @i{value} @t{3} ++of the variable @t{x} even after control has returned from the function @t{adder}. ++ ++@subsubheading See Also:: ++ ++@ref{defun} ++, ++@ref{fdefinition} ++, ++@ref{flet} ++, ++@b{labels}, ++@ref{symbol-function} ++, ++@ref{Symbols as Forms}, ++@ref{Sharpsign Single-Quote}, ++@ref{Printing Other Objects} ++ ++@subsubheading Notes:: ++ ++The notation @t{#'@i{name}} may be used as an abbreviation ++for @t{(function @i{name})}. ++ ++@node function-lambda-expression, functionp, function (Special Operator), Data and Control Flow Dictionary ++@subsection function-lambda-expression [Function] ++ ++@code{function-lambda-expression} @i{function}@* ++ @result{} @i{lambda-expression, closure-p, name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{function}. ++ ++@i{lambda-expression}---a @i{lambda expression} or @b{nil}. ++ ++@i{closure-p}---a @i{generalized boolean}. ++ ++@i{name}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Returns information about @i{function} as follows: ++ ++The @i{primary value}, @i{lambda-expression}, ++is @i{function}'s defining @i{lambda expression}, ++or @b{nil} if the information is not available. The @i{lambda expression} ++may have been pre-processed in some ways, but it should remain a suitable ++argument to @b{compile} or @b{function}. ++Any @i{implementation} may legitimately return @b{nil} ++as the @i{lambda-expression} of any @i{function}. ++ ++The @i{secondary value}, @i{closure-p}, ++is @b{nil} if @i{function}'s definition was enclosed ++in the @i{null lexical environment} or something @i{non-nil} if ++@i{function}'s definition might have been enclosed in some ++@i{non-null lexical environment}. ++Any @i{implementation} may legitimately return @i{true} ++as the @i{closure-p} of any @i{function}. ++ ++The @i{tertiary value}, @i{name}, ++is the ``name'' of @i{function}. ++The name is intended for debugging only and is not necessarily one that would ++be valid for use as a name in @b{defun} or @b{function}, for example. ++By convention, @b{nil} is used to mean that @i{function} has no name. ++Any @i{implementation} may legitimately return @b{nil} ++as the @i{name} of any @i{function}. ++ ++@subsubheading Examples:: ++ ++The following examples illustrate some possible return values, but ++are not intended to be exhaustive: ++ ++@example ++ (function-lambda-expression #'(lambda (x) x)) ++@result{} NIL, @i{false}, NIL ++@i{OR}@result{} NIL, @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) X), @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) X), @i{false}, NIL ++ ++ (function-lambda-expression ++ (funcall #'(lambda () #'(lambda (x) x)))) ++@result{} NIL, @i{false}, NIL ++@i{OR}@result{} NIL, @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) X), @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) X), @i{false}, NIL ++ ++ (function-lambda-expression ++ (funcall #'(lambda (x) #'(lambda () x)) nil)) ++@result{} NIL, @i{true}, NIL ++@i{OR}@result{} (LAMBDA () X), @i{true}, NIL ++@i{NOT}@result{} NIL, @i{false}, NIL ++@i{NOT}@result{} (LAMBDA () X), @i{false}, NIL ++ ++ (flet ((foo (x) x)) ++ (setf (symbol-function 'bar) #'foo) ++ (function-lambda-expression #'bar)) ++@result{} NIL, @i{false}, NIL ++@i{OR}@result{} NIL, @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) (BLOCK FOO X)), @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) (BLOCK FOO X)), @i{false}, FOO ++@i{OR}@result{} (SI::BLOCK-LAMBDA FOO (X) X), @i{false}, FOO ++ ++ (defun foo () ++ (flet ((bar (x) x)) ++ #'bar)) ++ (function-lambda-expression (foo)) ++@result{} NIL, @i{false}, NIL ++@i{OR}@result{} NIL, @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) (BLOCK BAR X)), @i{true}, NIL ++@i{OR}@result{} (LAMBDA (X) (BLOCK BAR X)), @i{true}, (:INTERNAL FOO 0 BAR) ++@i{OR}@result{} (LAMBDA (X) (BLOCK BAR X)), @i{false}, "BAR in FOO" ++@end example ++ ++@subsubheading Notes:: ++ ++Although @i{implementations} are free to return ``@b{nil}, @i{true}, @b{nil}'' in all cases, ++they are encouraged to return a @i{lambda expression} as the @i{primary value} ++in the case where the argument was created by a call to @b{compile} ++or @b{eval} (as opposed to being created by @i{loading} a @i{compiled file}). ++ ++@node functionp, compiled-function-p, function-lambda-expression, Data and Control Flow Dictionary ++@subsection functionp [Function] ++ ++@code{functionp} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{function}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (functionp 'append) @result{} @i{false} ++ (functionp #'append) @result{} @i{true} ++ (functionp (symbol-function 'append)) @result{} @i{true} ++ (flet ((f () 1)) (functionp #'f)) @result{} @i{true} ++ (functionp (compile nil '(lambda () 259))) @result{} @i{true} ++ (functionp nil) @result{} @i{false} ++ (functionp 12) @result{} @i{false} ++ (functionp '(lambda (x) (* x x))) @result{} @i{false} ++ (functionp #'(lambda (x) (* x x))) @result{} @i{true} ++@end example ++ ++@subsubheading Notes:: ++ ++@example ++ (functionp @i{object}) @equiv{} (typep @i{object} 'function) ++@end example ++ ++@node compiled-function-p, call-arguments-limit, functionp, Data and Control Flow Dictionary ++@subsection compiled-function-p [Function] ++ ++@code{compiled-function-p} @i{object} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{object} is of @i{type} @b{compiled-function}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun f (x) x) @result{} F ++ (compiled-function-p #'f) ++@result{} @i{false} ++@i{OR}@result{} @i{true} ++ (compiled-function-p 'f) @result{} @i{false} ++ (compile 'f) @result{} F ++ (compiled-function-p #'f) @result{} @i{true} ++ (compiled-function-p 'f) @result{} @i{false} ++ (compiled-function-p (compile nil '(lambda (x) x))) ++@result{} @i{true} ++ (compiled-function-p #'(lambda (x) x)) ++@result{} @i{false} ++@i{OR}@result{} @i{true} ++ (compiled-function-p '(lambda (x) x)) @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{compile} ++, ++@ref{compile-file} ++, ++@ref{compiled-function} ++ ++@subsubheading Notes:: ++ ++@example ++ (compiled-function-p @i{object}) @equiv{} (typep @i{object} 'compiled-function) ++@end example ++ ++@node call-arguments-limit, lambda-list-keywords, compiled-function-p, Data and Control Flow Dictionary ++@subsection call-arguments-limit [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++An integer not smaller than @t{50} and at least as great as ++the @i{value} of @b{lambda-parameters-limit}, ++the exact magnitude of which is @i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The upper exclusive bound on the number of @i{arguments} that ++may be passed to a @i{function}. ++ ++@subsubheading See Also:: ++ ++@ref{lambda-parameters-limit} ++, ++@ref{multiple-values-limit} ++ ++@node lambda-list-keywords, lambda-parameters-limit, call-arguments-limit, Data and Control Flow Dictionary ++@subsection lambda-list-keywords [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++a @i{list}, the @i{elements} of which are @i{implementation-dependent}, ++but which must contain at least the @i{symbols} ++ @b{&allow-other-keys}, ++ @b{&aux}, ++ @b{&body}, ++ @b{&environment}, ++ @b{&key}, ++ @b{&optional}, ++ @b{&rest}, ++and ++ @b{&whole}. ++ ++@subsubheading Description:: ++ ++A @i{list} of all the @i{lambda list keywords} used ++in the @i{implementation}, including the additional ones ++used only by @i{macro} definition @i{forms}. ++ ++@subsubheading See Also:: ++ ++@ref{defun} ++, ++@ref{flet} ++, ++@ref{defmacro} ++, ++@b{macrolet}, ++@ref{The Evaluation Model} ++ ++@node lambda-parameters-limit, defconstant, lambda-list-keywords, Data and Control Flow Dictionary ++@subsection lambda-parameters-limit [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++@i{implementation-dependent}, but not smaller than @t{50}. ++ ++@subsubheading Description:: ++ ++A positive @i{integer} that is the upper exclusive bound on ++the number of @i{parameter} @i{names} that can appear ++in a single @i{lambda list}. ++ ++@subsubheading See Also:: ++ ++@ref{call-arguments-limit} ++ ++@subsubheading Notes:: ++ ++Implementors are encouraged to make the @i{value} of ++@b{lambda-parameters-limit} as large as possible. ++ ++@node defconstant, defparameter, lambda-parameters-limit, Data and Control Flow Dictionary ++@subsection defconstant [Macro] ++ ++@code{defconstant} @i{name initial-value @r{[}documentation@r{]}} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}; not evaluated. ++ ++@i{initial-value}---a @i{form}; evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@subsubheading Description:: ++ ++@b{defconstant} ++causes the global variable named by @i{name} to be ++given a value that is the result of evaluating @i{initial-value}. ++ ++A constant defined by @b{defconstant} can be redefined ++with @b{defconstant}. ++However, the consequences are undefined if an attempt is made to assign ++a @i{value} to the @i{symbol} using another operator, or to ++assign it to a @i{different} ++@i{value} using a subsequent ++@b{defconstant}. ++ ++If @i{documentation} is supplied, it is attached to @i{name} as a ++@i{documentation string} of kind @b{variable}. ++ ++@b{defconstant} ++normally appears as a @i{top level form}, but it is meaningful ++for it to appear as a @i{non-top-level form}. ++However, the compile-time side ++effects described below ++only take place when @b{defconstant} appears as a ++@i{top level form}. ++ ++The consequences are undefined if there are any ++@i{bindings} ++of the variable named by @i{name} at the time @b{defconstant} ++is executed or if the value is not @b{eql} to the value of ++@i{initial-value}. ++ ++The consequences are undefined when constant @i{symbols} are rebound ++as either lexical or dynamic variables. In other words, a reference to a ++@i{symbol} declared with @b{defconstant} always refers to its global value. ++ ++The side effects of the execution of @b{defconstant} must ++be equivalent to at least the side effects of the execution of the following ++code: ++ ++@example ++ (setf (symbol-value '@i{name}) @i{initial-value}) ++ (setf (documentation '@i{name} 'variable) '@i{documentation}) ++@end example ++ ++If a @b{defconstant} @i{form} appears as a @i{top level form}, ++the @i{compiler} must recognize that @i{name} names ++a @i{constant variable}. An implementation may choose to ++evaluate the value-form at compile time, load time, or both. ++Therefore, users must ensure that the @i{initial-value} ++can be @i{evaluated} at compile time ++(regardless of whether or not references to @i{name} ++appear in the file) and that it always @i{evaluates} ++to the same value. ++ ++[Editorial Note by KMP: Does ``same value'' here mean eql or similar?] ++ ++[Reviewer Note by Moon: Probably depends on whether load time is compared to compile time, ++ or two compiles.] ++ ++@subsubheading Examples:: ++@example ++ (defconstant this-is-a-constant 'never-changing "for a test") @result{} THIS-IS-A-CONSTANT ++this-is-a-constant @result{} NEVER-CHANGING ++ (documentation 'this-is-a-constant 'variable) @result{} "for a test" ++ (constantp 'this-is-a-constant) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{declaim} ++, ++@ref{defparameter} ++, ++@b{defvar}, ++@ref{documentation} ++, ++@ref{proclaim} ++, ++@ref{Constant Variables}, ++@ref{Compilation} ++ ++@node defparameter, destructuring-bind, defconstant, Data and Control Flow Dictionary ++@subsection defparameter, defvar [Macro] ++ ++@code{defparameter} @i{name initial-value @r{[}documentation@r{]} } @result{} @i{name} ++ ++@code{defvar} @i{name @t{[}initial-value @r{[}documentation@r{]}@t{]}} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}; not evaluated. ++ ++@i{initial-value}---a @i{form}; ++ for @b{defparameter}, it is always @i{evaluated}, ++ but for @b{defvar} it is @i{evaluated} ++ only if @i{name} is not already @i{bound}. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@subsubheading Description:: ++ ++@b{defparameter} and @b{defvar} @i{establish} @i{name} ++as a @i{dynamic variable}. ++ ++@b{defparameter} unconditionally ++@i{assigns} the @i{initial-value} to the @i{dynamic variable} named @i{name}. ++@b{defvar}, by contrast, @i{assigns} @i{initial-value} (if supplied) ++to the @i{dynamic variable} named @i{name} ++only if @i{name} is not already @i{bound}. ++ ++If no @i{initial-value} is supplied, ++@b{defvar} leaves the @i{value cell} of ++the @i{dynamic variable} named @i{name} undisturbed; ++ if @i{name} was previously @i{bound}, its old @i{value} persists, ++and if it was previously @i{unbound}, it remains @i{unbound}. ++ ++If @i{documentation} is supplied, it is attached to @i{name} as a ++@i{documentation string} of kind @b{variable}. ++ ++@b{defparameter} and @b{defvar} normally appear as a @i{top level form}, ++but it is meaningful for them to appear as @i{non-top-level forms}. However, ++the compile-time side effects described below only take place when ++they appear as @i{top level forms}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defparameter *p* 1) @result{} *P* ++ *p* @result{} 1 ++ (constantp '*p*) @result{} @i{false} ++ (setq *p* 2) @result{} 2 ++ (defparameter *p* 3) @result{} *P* ++ *p* @result{} 3 ++ ++ (defvar *v* 1) @result{} *V* ++ *v* @result{} 1 ++ (constantp '*v*) @result{} @i{false} ++ (setq *v* 2) @result{} 2 ++ (defvar *v* 3) @result{} *V* ++ *v* @result{} 2 ++ ++ (defun foo () ++ (let ((*p* 'p) (*v* 'v)) ++ (bar))) @result{} FOO ++ (defun bar () (list *p* *v*)) @result{} BAR ++ (foo) @result{} (P V) ++@end example ++ ++The principal operational distinction between @b{defparameter} and @b{defvar} ++is that @b{defparameter} makes an unconditional assignment to @i{name}, ++while @b{defvar} makes a conditional one. In practice, this means that ++@b{defparameter} is useful in situations where loading or reloading the definition ++would want to pick up a new value of the variable, while @b{defvar} is used in ++situations where the old value would want to be retained if the file were loaded or reloaded. ++For example, one might create a file which contained: ++ ++@example ++ (defvar *the-interesting-numbers* '()) ++ (defmacro define-interesting-number (name n) ++ `(progn (defvar ,name ,n) ++ (pushnew ,name *the-interesting-numbers*) ++ ',name)) ++ (define-interesting-number *my-height* 168) ;cm ++ (define-interesting-number *my-weight* 13) ;stones ++@end example ++ ++Here the initial value, @t{()}, for the variable @t{*the-interesting-numbers*} ++is just a seed that we are never likely to want to reset to something else ++once something has been grown from it. As such, we have used @b{defvar} ++to avoid having the @t{*interesting-numbers*} information reset if the file is ++loaded a second time. It is true that the two calls to ++@b{define-interesting-number} here would be reprocessed, but ++if there were additional calls in another file, they would not be and that ++information would be lost. On the other hand, consider the following code: ++ ++@example ++ (defparameter *default-beep-count* 3) ++ (defun beep (&optional (n *default-beep-count*)) ++ (dotimes (i n) (si: ++@end example ++ ++Here we could easily imagine editing the code to change the initial value of ++@t{*default-beep-count*}, and then reloading the file to pick up the new value. ++In order to make value updating easy, we have used @b{defparameter}. ++ ++On the other hand, there is potential value to using @b{defvar} in this ++situation. For example, suppose that someone had predefined an alternate ++value for @t{*default-beep-count*}, or had loaded the file and then manually ++changed the value. In both cases, if we had used @b{defvar} instead of ++@b{defparameter}, those user preferences would not be overridden by ++(re)loading the file. ++ ++The choice of whether to use @b{defparameter} or @b{defvar} has ++visible consequences to programs, but is nevertheless often made for subjective ++reasons. ++ ++@subsubheading Side Effects:: ++ ++If a @b{defvar} or @b{defparameter} @i{form} appears as a @i{top level form}, ++the @i{compiler} must recognize that the @i{name} has been ++proclaimed @b{special}. However, it must neither @i{evaluate} ++the @i{initial-value} @i{form} nor @i{assign} the ++@i{dynamic variable} named @i{name} at compile time. ++ ++There may be additional (@i{implementation-defined}) compile-time or ++run-time side effects, as long as such effects do not interfere with the ++correct operation of @i{conforming programs}. ++ ++@subsubheading Affected By:: ++ ++@b{defvar} is affected by whether @i{name} is already @i{bound}. ++ ++@subsubheading See Also:: ++ ++@ref{declaim} ++, ++@ref{defconstant} ++, ++@ref{documentation} ++, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++ ++It is customary to name @i{dynamic variables} with an @i{asterisk} ++at the beginning and end of the name. e.g., @t{*foo*} is a good name for ++a @i{dynamic variable}, but not for a @i{lexical variable}; ++@t{foo} is a good name for a @i{lexical variable}, ++but not for a @i{dynamic variable}. ++This naming convention is observed for all @i{defined names} in @r{Common Lisp}; ++however, neither @i{conforming programs} nor @i{conforming implementations} ++are obliged to adhere to this convention. ++ ++The intent of the permission for additional side effects is to allow ++@i{implementations} to do normal ``bookkeeping'' that accompanies ++definitions. For example, the @i{macro expansion} of a @b{defvar} ++or @b{defparameter} @i{form} might include code that arranges to ++record the name of the source file in which the definition occurs. ++ ++@b{defparameter} and @b{defvar} might be defined as follows: ++ ++@example ++ (defmacro defparameter (name initial-value ++ &optional (documentation nil documentation-p)) ++ `(progn (declaim (special ,name)) ++ (setf (symbol-value ',name) ,initial-value) ++ ,(when documentation-p ++ `(setf (documentation ',name 'variable) ',documentation)) ++ ',name)) ++ (defmacro defvar (name &optional ++ (initial-value nil initial-value-p) ++ (documentation nil documentation-p)) ++ `(progn (declaim (special ,name)) ++ ,(when initial-value-p ++ `(unless (boundp ',name) ++ (setf (symbol-value ',name) ,initial-value))) ++ ,(when documentation-p ++ `(setf (documentation ',name 'variable) ',documentation)) ++ ',name)) ++@end example ++ ++@node destructuring-bind, let, defparameter, Data and Control Flow Dictionary ++@subsection destructuring-bind [Macro] ++ ++@code{destructuring-bind} @i{lambda-list expression @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{lambda-list}---a @i{destructuring lambda list}. ++ ++@i{expression}---a @i{form}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{destructuring-bind} binds the variables specified in @i{lambda-list} ++to the corresponding values in the tree structure resulting from the evaluation ++of @i{expression}; then @b{destructuring-bind} evaluates @i{forms}. ++ ++The @i{lambda-list} supports destructuring as described in ++@ref{Destructuring Lambda Lists}. ++ ++@subsubheading Examples:: ++@example ++ (defun iota (n) (loop for i from 1 to n collect i)) ;helper ++ (destructuring-bind ((a &optional (b 'bee)) one two three) ++ `((alpha) ,@@(iota 3)) ++ (list a b three two one)) @result{} (ALPHA BEE 3 2 1) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If the result of evaluating the @i{expression} does not match the ++destructuring pattern, an error of @i{type} @b{error} should be signaled. ++ ++@subsubheading See Also:: ++ ++@b{macrolet}, ++@ref{defmacro} ++ ++@node let, progv, destructuring-bind, Data and Control Flow Dictionary ++@subsection let, let* [Special Operator] ++ ++@code{let} @i{@r{(}@{@i{var} | @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@r{)} @{@i{declaration}@}* @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@code{let*} @i{@r{(}@{@i{var} | @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@r{)} @{@i{declaration}@}* @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol}. ++ ++@i{init-form}---a @i{form}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{let} and @b{let*} ++create new variable @i{bindings} and ++execute a series of @i{forms} that use these @i{bindings}. ++@b{let} performs the @i{bindings} in parallel and ++@b{let*} does them sequentially. ++ ++The form ++ ++@example ++ (let ((@i{var1} @i{init-form-1}) ++ (@i{var2} @i{init-form-2}) ++ ... ++ (@i{varm} @i{init-form-m})) ++ @i{declaration1} ++ @i{declaration2} ++ ... ++ @i{declarationp} ++ @i{form1} ++ @i{form2} ++ ... ++ @i{formn}) ++@end example ++ ++first evaluates the expressions @i{init-form-1}, @i{init-form-2}, and so on, ++ ++in that order, saving the resulting values. ++Then all of the variables @i{varj} are bound to the corresponding ++values; each @i{binding} is lexical unless ++there is a @b{special} declaration to the contrary. ++The expressions @i{formk} are then evaluated ++in order; the values of all but the last are discarded ++(that is, the body of a @b{let} ++is an @i{implicit progn}). ++ ++@b{let*} ++is similar to @b{let}, but the @i{bindings} of variables ++are performed sequentially rather than in parallel. ++The expression for the @i{init-form} of a ++@i{var} can refer to @i{vars} ++previously bound in the @b{let*}. ++ ++The form ++ ++@example ++ (let* ((@i{var1} @i{init-form-1}) ++ (@i{var2} @i{init-form-2}) ++ ... ++ (@i{varm} @i{init-form-m})) ++ @i{declaration1} ++ @i{declaration2} ++ ... ++ @i{declarationp} ++ @i{form1} ++ @i{form2} ++ ... ++ @i{formn}) ++@end example ++ ++first evaluates the expression @i{init-form-1}, then binds the variable ++@i{var1} to that value; then it evaluates @i{init-form-2} and binds ++ ++@i{var2}, and so on. ++The expressions @i{formj} are then evaluated ++in order; the values of all but the last are discarded ++(that is, the body of @b{let*} is an implicit @b{progn}). ++ ++For both @b{let} and @b{let*}, ++if there is not an @i{init-form} associated with a @i{var}, ++@i{var} is initialized to @b{nil}. ++ ++The special form @b{let} ++has the property that the @i{scope} ++of the name binding does not include any ++initial value form. ++For @b{let*}, a variable's @i{scope} also includes the ++ remaining initial value forms for subsequent variable bindings. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq a 'top) @result{} TOP ++ (defun dummy-function () a) @result{} DUMMY-FUNCTION ++ (let ((a 'inside) (b a)) ++ (format nil "~S ~S ~S" a b (dummy-function))) @result{} "INSIDE TOP TOP" ++ (let* ((a 'inside) (b a)) ++ (format nil "~S ~S ~S" a b (dummy-function))) @result{} "INSIDE INSIDE TOP" ++ (let ((a 'inside) (b a)) ++ (declare (special a)) ++ (format nil "~S ~S ~S" a b (dummy-function))) @result{} "INSIDE TOP INSIDE" ++@end example ++ ++The code ++ ++@example ++ (let (x) ++ (declare (integer x)) ++ (setq x (gcd y z)) ++ ...) ++@end example ++ ++is incorrect; although @t{x} is indeed set before it is used, ++and is set to a value of the declared type @i{integer}, nevertheless ++@t{x} initially takes on the value @b{nil} in violation of the type ++declaration. ++ ++@subsubheading See Also:: ++ ++@ref{progv} ++ ++@node progv, setq, let, Data and Control Flow Dictionary ++@subsection progv [Special Operator] ++ ++@code{progv} @i{@i{symbols} @i{values} @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbols}---a @i{list} of @i{symbols}; evaluated. ++ ++@i{values}---a @i{list} of @i{objects}; evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{progv} creates new dynamic variable @i{bindings} and ++executes each @i{form} using those @i{bindings}. ++Each @i{form} is evaluated in order. ++ ++@b{progv} allows @i{binding} one or more dynamic ++variables whose names may be determined at run time. ++Each @i{form} is evaluated in order ++with the dynamic variables whose names are in ++@i{symbols} bound to corresponding @i{values}. ++If too few @i{values} ++are supplied, the remaining @i{symbols} are bound and then ++made to have no value. If too many @i{values} are ++supplied, the excess values are ignored. ++The @i{bindings} of the dynamic variables are undone on ++exit from @b{progv}. ++ ++@subsubheading Examples:: ++@example ++ (setq *x* 1) @result{} 1 ++ (progv '(*x*) '(2) *x*) @result{} 2 ++ *x* @result{} 1 ++ ++Assuming *x* is not globally special, ++ ++ (let ((*x* 3)) ++ (progv '(*x*) '(4) ++ (list *x* (symbol-value '*x*)))) @result{} (3 4) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{let} ++, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++Among other things, @b{progv} is useful when writing ++interpreters for languages embedded in @r{Lisp}; it provides a handle ++on the mechanism for @i{binding} @i{dynamic variables}. ++ ++@node setq, psetq, progv, Data and Control Flow Dictionary ++@subsection setq [Special Form] ++ ++@code{setq} @i{@{!@i{pair}@}*} @result{} @i{result} ++ ++@w{@i{pair} ::=var form} ++ ++@subsubheading Pronunciation:: ++ ++pronounced 'set ,ky\"u ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol} naming a @i{variable} other than a @i{constant variable}. ++ ++@i{form}---a @i{form}. ++ ++@i{result}---the @i{primary value} of the last @i{form}, ++ or @b{nil} if no @i{pairs} were supplied. ++ ++@subsubheading Description:: ++ ++Assigns values to @i{variables}. ++ ++@t{(setq @i{var1} @i{form1} @i{var2} @i{form2} ...)} ++is the simple variable assignment statement of @r{Lisp}. ++First @i{form1} is evaluated ++and the result is stored in the variable @i{var1}, then @i{form2} ++is evaluated and the result stored in @i{var2}, and so forth. ++@b{setq} may be used for assignment of both lexical ++and dynamic variables. ++ ++If any @i{var} refers to a @i{binding} ++made by @b{symbol-macrolet}, ++then that @i{var} is treated as if @b{setf} ++(not @b{setq}) had been used. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; A simple use of SETQ to establish values for variables. ++ (setq a 1 b 2 c 3) @result{} 3 ++ a @result{} 1 ++ b @result{} 2 ++ c @result{} 3 ++ ++ ;; Use of SETQ to update values by sequential assignment. ++ (setq a (1+ b) b (1+ a) c (+ a b)) @result{} 7 ++ a @result{} 3 ++ b @result{} 4 ++ c @result{} 7 ++ ++ ;; This illustrates the use of SETQ on a symbol macro. ++ (let ((x (list 10 20 30))) ++ (symbol-macrolet ((y (car x)) (z (cadr x))) ++ (setq y (1+ z) z (1+ y)) ++ (list x y z))) ++@result{} ((21 22 30) 21 22) ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{primary value} of each @i{form} is assigned to the corresponding @i{var}. ++ ++@subsubheading See Also:: ++ ++@ref{psetq} ++, ++@ref{set} ++, ++@ref{setf} ++ ++@node psetq, block, setq, Data and Control Flow Dictionary ++@subsection psetq [Macro] ++ ++@code{psetq} @i{@{!@i{pair}@}*} @result{} @i{@b{nil}} ++ ++@w{@i{pair} ::=var form} ++ ++@subsubheading Pronunciation:: ++ ++@b{psetq}: pronounced ++@tex p\=e'set ,ky\"u ++@end tex ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol} naming a @i{variable} other than a @i{constant variable}. ++ ++@i{form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++Assigns values to @i{variables}. ++ ++This is just like @b{setq}, except that the assignments ++happen ``in parallel.'' That is, first all of the forms are ++evaluated, and only then are the variables set to the resulting values. ++In this way, the assignment to one variable does not affect the value ++computation of another in the way that would occur with @b{setq}'s ++sequential assignment. ++ ++If any @i{var} refers to a @i{binding} ++made by @b{symbol-macrolet}, ++then that @i{var} is treated as if @b{psetf} (not @b{psetq}) ++had been used. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; A simple use of PSETQ to establish values for variables. ++ ;; As a matter of style, many programmers would prefer SETQ ++ ;; in a simple situation like this where parallel assignment ++ ;; is not needed, but the two have equivalent effect. ++ (psetq a 1 b 2 c 3) @result{} NIL ++ a @result{} 1 ++ b @result{} 2 ++ c @result{} 3 ++ ++ ;; Use of PSETQ to update values by parallel assignment. ++ ;; The effect here is very different than if SETQ had been used. ++ (psetq a (1+ b) b (1+ a) c (+ a b)) @result{} NIL ++ a @result{} 3 ++ b @result{} 2 ++ c @result{} 3 ++ ++ ;; Use of PSETQ on a symbol macro. ++ (let ((x (list 10 20 30))) ++ (symbol-macrolet ((y (car x)) (z (cadr x))) ++ (psetq y (1+ z) z (1+ y)) ++ (list x y z))) ++@result{} ((21 11 30) 21 11) ++ ++ ;; Use of parallel assignment to swap values of A and B. ++ (let ((a 1) (b 2)) ++ (psetq a b b a) ++ (values a b)) ++@result{} 2, 1 ++@end example ++ ++@subsubheading Side Effects:: ++ ++The values of @i{forms} are assigned to @i{vars}. ++ ++@subsubheading See Also:: ++ ++@b{psetf}, ++@ref{setq} ++ ++@node block, catch, psetq, Data and Control Flow Dictionary ++@subsection block [Special Operator] ++ ++@code{block} @i{@i{name} @i{form}@r{*}} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} of the @i{forms} if a @i{normal return} occurs, ++ or else, if an @i{explicit return} occurs, the @i{values} that were transferred. ++ ++@subsubheading Description:: ++ ++@b{block} @i{establishes} a @i{block} named @i{name} ++and then evaluates @i{forms} as an @i{implicit progn}. ++ ++The @i{special operators} @b{block} and @b{return-from} work together to ++provide a structured, lexical, non-local exit facility. At any point lexically ++contained within @i{forms}, @b{return-from} can be used with the ++given @i{name} to return control and values from the @b{block} ++@i{form}, except when an intervening @i{block} with the same name ++has been @i{established}, in which case the outer @i{block} is ++shadowed by the inner one. ++ ++The @i{block} named @i{name} has ++@i{lexical scope} and @i{dynamic extent}. ++ ++Once established, a @i{block} may only be exited once, ++whether by @i{normal return} or @i{explicit return}. ++ ++@subsubheading Examples:: ++ ++@example ++ (block empty) @result{} NIL ++ (block whocares (values 1 2) (values 3 4)) @result{} 3, 4 ++ (let ((x 1)) ++ (block stop (setq x 2) (return-from stop) (setq x 3)) ++ x) @result{} 2 ++ (block early (return-from early (values 1 2)) (values 3 4)) @result{} 1, 2 ++ (block outer (block inner (return-from outer 1)) 2) @result{} 1 ++ (block twin (block twin (return-from twin 1)) 2) @result{} 2 ++ ;; Contrast behavior of this example with corresponding example of CATCH. ++ (block b ++ (flet ((b1 () (return-from b 1))) ++ (block b (b1) (print 'unreachable)) ++ 2)) @result{} 1 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{return} ++, ++@ref{return-from} ++, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++@node catch, go, block, Data and Control Flow Dictionary ++@subsection catch [Special Operator] ++ ++@code{catch} @i{@i{tag} @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{tag}---a @i{catch tag}; evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---if the @i{forms} exit normally, ++ the @i{values} returned by the @i{forms}; ++ if a throw occurs to the @i{tag}, ++ the @i{values} that are thrown. ++ ++@subsubheading Description:: ++ ++@b{catch} is used as the destination of a non-local ++control transfer by @b{throw}. ++@i{Tags} are used to find the @b{catch} ++to which a @b{throw} is transferring control. ++@t{(catch 'foo @i{form})} catches a ++@t{(throw 'foo @i{form})} but not a ++@t{(throw 'bar @i{form})}. ++ ++The order of execution of @b{catch} follows: ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++@table @asis ++ ++@item 1. ++@i{Tag} is evaluated. ++It serves as the name of the ++@b{catch}. ++ ++@item 2. ++@i{Forms} are then evaluated as an implicit @b{progn}, ++and the results of the last @i{form} are returned unless a ++@b{throw} occurs. ++ ++@item 3. ++If a @b{throw} occurs ++during the execution of one of the @i{forms}, control ++is transferred to the @b{catch} @i{form} whose @i{tag} ++is @b{eq} to ++the tag argument of the @b{throw} ++and which is the most recently established @b{catch} with that ++@i{tag}. ++No further evaluation of @i{forms} occurs. ++ ++@item 4. ++The @i{tag} @i{established} ++by @b{catch} is @i{disestablished} ++just before the results are returned. ++ ++@end table ++ ++If during the execution of one of the @i{forms}, a @b{throw} ++is executed whose tag is @b{eq} to the @b{catch} tag, ++then the values specified by the @b{throw} are ++returned as the result of the dynamically most recently established ++@b{catch} form with that tag. ++ ++The mechanism for @b{catch} and @b{throw} works even ++if @b{throw} is not within the lexical scope of @b{catch}. ++@b{throw} must occur within the @i{dynamic extent} ++of the @i{evaluation} of the body of a @b{catch} with a corresponding @i{tag}. ++ ++@subsubheading Examples:: ++@example ++ (catch 'dummy-tag 1 2 (throw 'dummy-tag 3) 4) @result{} 3 ++ (catch 'dummy-tag 1 2 3 4) @result{} 4 ++ (defun throw-back (tag) (throw tag t)) @result{} THROW-BACK ++ (catch 'dummy-tag (throw-back 'dummy-tag) 2) @result{} T ++ ++ ;; Contrast behavior of this example with corresponding example of BLOCK. ++ (catch 'c ++ (flet ((c1 () (throw 'c 1))) ++ (catch 'c (c1) (print 'unreachable)) ++ 2)) @result{} 2 ++@end example ++ ++@subsubheading Exceptional Situations:: ++An error of @i{type} @b{control-error} is signaled ++if @b{throw} is done ++when there is no suitable @b{catch} @i{tag}. ++@subsubheading See Also:: ++ ++@ref{throw} ++, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++It is customary for @i{symbols} to be used ++as @i{tags}, but any @i{object} is permitted. ++However, numbers should not be ++used because the comparison is done using @b{eq}. ++ ++@b{catch} differs from @b{block} in that ++@b{catch} ++tags have dynamic @i{scope} while ++@b{block} names have @i{lexical scope}. ++ ++@node go, return-from, catch, Data and Control Flow Dictionary ++@subsection go [Special Operator] ++ ++@code{go} @i{tag} ++ @result{} # ++@subsubheading Arguments and Values:: ++ ++@i{tag}---a @i{go tag}. ++ ++@subsubheading Description:: ++ ++@b{go} transfers control to the point in the body ++of an enclosing @b{tagbody} form labeled by a ++tag @b{eql} to @i{tag}. ++If there is no such @i{tag} in the body, the ++bodies of lexically containing @b{tagbody} @i{forms} ++(if any) are examined as well. ++If several tags are @b{eql} ++to @i{tag}, control is transferred to ++whichever matching @i{tag} ++is contained in the innermost @b{tagbody} form that ++contains the @b{go}. ++The consequences are undefined ++if there is no matching @i{tag} lexically visible ++to the point of the @b{go}. ++ ++The transfer of control initiated by @b{go} is performed ++as described in @ref{Transfer of Control to an Exit Point}. ++ ++@subsubheading Examples:: ++@example ++ (tagbody ++ (setq val 2) ++ (go lp) ++ (incf val 3) ++ lp (incf val 4)) @result{} NIL ++ val @result{} 6 ++@end example ++ ++The following is in error because there is a normal exit ++of the @b{tagbody} before the ++@b{go} is executed. ++ ++@example ++ (let ((a nil)) ++ (tagbody t (setq a #'(lambda () (go t)))) ++ (funcall a)) ++@end example ++ ++The following is in error because the @b{tagbody} is passed over ++before the @b{go} @i{form} is executed. ++ ++@example ++ (funcall (block nil ++ (tagbody a (return #'(lambda () (go a)))))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{tagbody} ++ ++@node return-from, return, go, Data and Control Flow Dictionary ++@subsection return-from [Special Operator] ++ ++@code{return-from} @i{@i{name} @r{[}@i{result}@r{]}} ++ @result{} # ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{block tag}; not evaluated. ++ ++@i{result}---a @i{form}; evaluated. ++ The default is @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns control and @i{multiple values}_2 from a lexically enclosing @i{block}. ++ ++A @b{block} @i{form} named @i{name} must lexically enclose ++the occurrence of @b{return-from}; any @i{values} @i{yielded} ++by the @i{evaluation} of @i{result} are immediately returned from ++the innermost such lexically enclosing @i{block}. ++ ++The transfer of control initiated by @b{return-from} is performed ++as described in @ref{Transfer of Control to an Exit Point}. ++ ++@subsubheading Examples:: ++ ++@example ++ (block alpha (return-from alpha) 1) @result{} NIL ++ (block alpha (return-from alpha 1) 2) @result{} 1 ++ (block alpha (return-from alpha (values 1 2)) 3) @result{} 1, 2 ++ (let ((a 0)) ++ (dotimes (i 10) (incf a) (when (oddp i) (return))) ++ a) @result{} 2 ++ (defun temp (x) ++ (if x (return-from temp 'dummy)) ++ 44) @result{} TEMP ++ (temp nil) @result{} 44 ++ (temp t) @result{} DUMMY ++ (block out ++ (flet ((exit (n) (return-from out n))) ++ (block out (exit 1))) ++ 2) @result{} 1 ++ (block nil ++ (unwind-protect (return-from nil 1) ++ (return-from nil 2))) ++@result{} 2 ++ (dolist (flag '(nil t)) ++ (block nil ++ (let ((x 5)) ++ (declare (special x)) ++ (unwind-protect (return-from nil) ++ (print x)))) ++ (print 'here)) ++@t{ |> } 5 ++@t{ |> } HERE ++@t{ |> } 5 ++@t{ |> } HERE ++@result{} NIL ++ (dolist (flag '(nil t)) ++ (block nil ++ (let ((x 5)) ++ (declare (special x)) ++ (unwind-protect ++ (if flag (return-from nil)) ++ (print x)))) ++ (print 'here)) ++@t{ |> } 5 ++@t{ |> } HERE ++@t{ |> } 5 ++@t{ |> } HERE ++@result{} NIL ++@end example ++ ++The following has undefined consequences because the @b{block} @i{form} ++exits normally before the @b{return-from} @i{form} is attempted. ++ ++@example ++ (funcall (block nil #'(lambda () (return-from nil)))) is an error. ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{block} ++, ++@ref{return} ++, ++@ref{Evaluation} ++ ++@node return, tagbody, return-from, Data and Control Flow Dictionary ++@subsection return [Macro] ++ ++@code{return} @i{@r{[}@i{result}@r{]}} @result{} # ++ ++@subsubheading Arguments and Values:: ++ ++@i{result}---a @i{form}; evaluated. ++ The default is @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns, as if by @b{return-from}, from the @i{block} named @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (block nil (return) 1) @result{} NIL ++ (block nil (return 1) 2) @result{} 1 ++ (block nil (return (values 1 2)) 3) @result{} 1, 2 ++ (block nil (block alpha (return 1) 2)) @result{} 1 ++ (block alpha (block nil (return 1)) 2) @result{} 2 ++ (block nil (block nil (return 1) 2)) @result{} 1 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{block} ++, ++@ref{return-from} ++, ++@ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++@example ++ (return) @equiv{} (return-from nil) ++ (return @i{form}) @equiv{} (return-from nil @i{form}) ++@end example ++ ++The @i{implicit blocks} @i{established} by @i{macros} such as @b{do} ++are often named @b{nil}, so that @b{return} can be used to exit from ++such @i{forms}. ++ ++@node tagbody, throw, return, Data and Control Flow Dictionary ++@subsection tagbody [Special Operator] ++ ++@code{tagbody} @i{@{@i{tag} | @i{statement}@}*} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{tag}---a @i{go tag}; not evaluated. ++ ++@i{statement}---a @i{compound form}; evaluated as described below. ++ ++@subsubheading Description:: ++ ++Executes zero or more @i{statements} in a ++@i{lexical environment} ++that provides for control transfers to labels indicated by the @i{tags}. ++ ++The @i{statements} in a @b{tagbody} are @i{evaluated} in order ++from left to right, and their @i{values} are discarded. If at any time ++there are no remaining @i{statements}, @b{tagbody} returns @b{nil}. ++However, if @t{(go @i{tag})} is @i{evaluated}, control jumps to the ++part of the body labeled with the @i{tag}. (Tags are compared with @b{eql}.) ++ ++A @i{tag} established by @b{tagbody} has @i{lexical scope} ++and has @i{dynamic extent}. Once @b{tagbody} has been exited, ++it is no longer valid to @b{go} to a @i{tag} in its body. ++It is permissible for @b{go} to jump to a @b{tagbody} that is ++not the innermost @b{tagbody} containing that @b{go}; ++the @i{tags} established by a @b{tagbody} only shadow ++other @i{tags} of like name. ++ ++The determination of which elements of the body are @i{tags} ++and which are @i{statements} is made prior to any @i{macro expansion} ++of that element. If a @i{statement} is a @i{macro form} and ++its @i{macro expansion} is an @i{atom}, that @i{atom} is treated ++as a @i{statement}, not a @i{tag}. ++ ++@subsubheading Examples:: ++ ++@example ++ (let (val) ++ (tagbody ++ (setq val 1) ++ (go point-a) ++ (incf val 16) ++ point-c ++ (incf val 04) ++ (go point-b) ++ (incf val 32) ++ point-a ++ (incf val 02) ++ (go point-c) ++ (incf val 64) ++ point-b ++ (incf val 08)) ++ val) ++@result{} 15 ++ (defun f1 (flag) ++ (let ((n 1)) ++ (tagbody ++ (setq n (f2 flag #'(lambda () (go out)))) ++ out ++ (prin1 n)))) ++@result{} F1 ++ (defun f2 (flag escape) ++ (if flag (funcall escape) 2)) ++@result{} F2 ++ (f1 nil) ++@t{ |> } 2 ++@result{} NIL ++ (f1 t) ++@t{ |> } 1 ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{go} ++ ++@subsubheading Notes:: ++ ++The @i{macros} in Figure 5--10 have @i{implicit tagbodies}. ++ ++@format ++@group ++@noindent ++@w{ do do-external-symbols dotimes } ++@w{ do* do-symbols prog } ++@w{ do-all-symbols dolist prog* } ++ ++@noindent ++@w{ Figure 5--10: Macros that have implicit tagbodies.} ++ ++@end group ++@end format ++ ++@node throw, unwind-protect, tagbody, Data and Control Flow Dictionary ++@subsection throw [Special Operator] ++ ++@code{throw} @i{tag result-form} ++ @result{} # ++@subsubheading Arguments and Values:: ++ ++@i{tag}---a @i{catch tag}; evaluated. ++ ++@i{result-form}---a @i{form}; evaluated as described below. ++ ++@subsubheading Description:: ++ ++@b{throw} causes a non-local control transfer ++to a @b{catch} whose tag is @b{eq} to @i{tag}. ++ ++@i{Tag} is evaluated first to produce an @i{object} ++called the throw tag; then @i{result-form} is evaluated, ++and its results are saved. If the @i{result-form} produces ++multiple values, then all the values are saved. ++The most recent outstanding @b{catch} ++whose @i{tag} is @b{eq} to the throw tag ++is exited; the saved results are returned as the value or ++values of @b{catch}. ++ ++The transfer of control initiated by @b{throw} is performed ++as described in @ref{Transfer of Control to an Exit Point}. ++ ++@subsubheading Examples:: ++ ++@example ++ (catch 'result ++ (setq i 0 j 0) ++ (loop (incf j 3) (incf i) ++ (if (= i 3) (throw 'result (values i j))))) @result{} 3, 9 ++ ++@end example ++ ++@example ++ (catch nil ++ (unwind-protect (throw nil 1) ++ (throw nil 2))) @result{} 2 ++@end example ++ ++The consequences of the following are undefined ++because the @b{catch} of @t{b} ++is passed over by the first @b{throw}, ++hence portable programs must assume that ++its @i{dynamic extent} is terminated. ++The @i{binding} of the @i{catch tag} is not yet @i{disestablished} ++and therefore it is the target of the second @b{throw}. ++ ++@example ++ (catch 'a ++ (catch 'b ++ (unwind-protect (throw 'a 1) ++ (throw 'b 2)))) ++@end example ++ ++The following prints ``@t{The inner catch returns :SECOND-THROW}'' ++and then returns @t{:outer-catch}. ++ ++@example ++ (catch 'foo ++ (format t "The inner catch returns ~s.~ ++ (catch 'foo ++ (unwind-protect (throw 'foo :first-throw) ++ (throw 'foo :second-throw)))) ++ :outer-catch) ++@t{ |> } The inner catch returns :SECOND-THROW ++@result{} :OUTER-CATCH ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If there is no outstanding @i{catch tag} that matches the throw tag, ++no unwinding of the stack is performed, ++and an error of @i{type} @b{control-error} is signaled. ++When the error is signaled, ++the @i{dynamic environment} is that which was ++in force at the point of the @b{throw}. ++ ++@subsubheading See Also:: ++ ++@ref{block} ++, ++@ref{catch} ++, ++@ref{return-from} ++, ++@ref{unwind-protect} ++, ++@ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++@b{catch} and @b{throw} are normally used when the @i{exit point} ++must have @i{dynamic scope} (@i{e.g.}, the @b{throw} is not lexically enclosed ++by the @b{catch}), while @b{block} and @b{return} are used ++when @i{lexical scope} is sufficient. ++ ++@node unwind-protect, nil, throw, Data and Control Flow Dictionary ++@subsection unwind-protect [Special Operator] ++ ++@code{unwind-protect} @i{@i{protected-form} @{@i{cleanup-form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{protected-form}---a @i{form}. ++ ++@i{cleanup-form}---a @i{form}. ++ ++@i{results}---the @i{values} of the @i{protected-form}. ++ ++@subsubheading Description:: ++@b{unwind-protect} evaluates @i{protected-form} ++and guarantees that @i{cleanup-forms} are executed ++before @b{unwind-protect} exits, ++whether it terminates ++normally or is aborted by a control transfer of some kind. ++@b{unwind-protect} is intended to be used ++to make sure that ++certain side effects take place after the evaluation of ++@i{protected-form}. ++ ++If a @i{non-local exit} occurs during execution of @i{cleanup-forms}, ++no special action is taken. The @i{cleanup-forms} of ++@b{unwind-protect} ++are not protected by that @b{unwind-protect}. ++ ++@b{unwind-protect} protects against all attempts to exit ++from @i{protected-form}, including ++ @b{go}, ++ @b{handler-case}, ++ @b{ignore-errors}, ++ @b{restart-case}, ++ @b{return-from}, ++ @b{throw}, ++ and @b{with-simple-restart}. ++ ++Undoing of @i{handler} and @i{restart} @i{bindings} during an exit ++happens in parallel with the undoing of the bindings of @i{dynamic variables} ++and @b{catch} tags, in the reverse order in which they were established. ++The effect of this is that @i{cleanup-form} sees the same @i{handler} ++and @i{restart} @i{bindings}, as well as @i{dynamic variable} @i{bindings} ++and @b{catch} tags, as were visible when the @b{unwind-protect} was entered. ++ ++@subsubheading Examples:: ++@example ++ (tagbody ++ (let ((x 3)) ++ (unwind-protect ++ (if (numberp x) (go out)) ++ (print x))) ++ out ++ ...) ++@end example ++ ++When @b{go} is executed, the call to @b{print} is executed first, ++and then the transfer of control to the tag @t{out} is completed. ++ ++@example ++ (defun dummy-function (x) ++ (setq state 'running) ++ (unless (numberp x) (throw 'abort 'not-a-number)) ++ (setq state (1+ x))) @result{} DUMMY-FUNCTION ++ (catch 'abort (dummy-function 1)) @result{} 2 ++ state @result{} 2 ++ (catch 'abort (dummy-function 'trash)) @result{} NOT-A-NUMBER ++ state @result{} RUNNING ++ (catch 'abort (unwind-protect (dummy-function 'trash) ++ (setq state 'aborted))) @result{} NOT-A-NUMBER ++ state @result{} ABORTED ++@end example ++ ++The following code ++is not correct: ++ ++@example ++ (unwind-protect ++ (progn (incf *access-count*) ++ (perform-access)) ++ (decf *access-count*)) ++@end example ++ ++If an exit occurs before completion of @b{incf}, ++the @b{decf} @i{form} is executed anyway, resulting in an ++incorrect value for @t{*access-count*}. ++The correct way to code this is as follows: ++ ++@example ++ (let ((old-count *access-count*)) ++ (unwind-protect ++ (progn (incf *access-count*) ++ (perform-access)) ++ (setq *access-count* old-count))) ++@end example ++ ++@example ++;;; The following returns 2. ++ (block nil ++ (unwind-protect (return 1) ++ (return 2))) ++ ++;;; The following has undefined consequences. ++ (block a ++ (block b ++ (unwind-protect (return-from a 1) ++ (return-from b 2)))) ++ ++;;; The following returns 2. ++ (catch nil ++ (unwind-protect (throw nil 1) ++ (throw nil 2))) ++ ++;;; The following has undefined consequences because the catch of B is ++;;; passed over by the first THROW, hence portable programs must assume ++;;; its dynamic extent is terminated. The binding of the catch tag is not ++;;; yet disestablished and therefore it is the target of the second throw. ++ (catch 'a ++ (catch 'b ++ (unwind-protect (throw 'a 1) ++ (throw 'b 2)))) ++ ++;;; The following prints "The inner catch returns :SECOND-THROW" ++;;; and then returns :OUTER-CATCH. ++ (catch 'foo ++ (format t "The inner catch returns ~s.~ ++ (catch 'foo ++ (unwind-protect (throw 'foo :first-throw) ++ (throw 'foo :second-throw)))) ++ :outer-catch) ++ ++;;; The following returns 10. The inner CATCH of A is passed over, but ++;;; because that CATCH is disestablished before the THROW to A is executed, ++;;; it isn't seen. ++ (catch 'a ++ (catch 'b ++ (unwind-protect (1+ (catch 'a (throw 'b 1))) ++ (throw 'a 10)))) ++ ++;;; The following has undefined consequences because the extent of ++;;; the (CATCH 'BAR ...) exit ends when the (THROW 'FOO ...) ++;;; commences. ++ (catch 'foo ++ (catch 'bar ++ (unwind-protect (throw 'foo 3) ++ (throw 'bar 4) ++ (print 'xxx)))) ++ ++;;; The following returns 4; XXX is not printed. ++;;; The (THROW 'FOO ...) has no effect on the scope of the BAR ++;;; catch tag or the extent of the (CATCH 'BAR ...) exit. ++ (catch 'bar ++ (catch 'foo ++ (unwind-protect (throw 'foo 3) ++ (throw 'bar 4) ++ (print 'xxx)))) ++ ++;;; The following prints 5. ++ (block nil ++ (let ((x 5)) ++ (declare (special x)) ++ (unwind-protect (return) ++ (print x)))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{catch} ++, ++@ref{go} ++, ++@ref{handler-case} ++, ++@ref{restart-case} ++, ++@ref{return} ++, ++@ref{return-from} ++, ++@ref{throw} ++, ++@ref{Evaluation} ++ ++@node nil, not, unwind-protect, Data and Control Flow Dictionary ++@subsection nil [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++@b{nil} represents both @i{boolean} (and @i{generalized boolean}) @i{false} ++and the @i{empty list}. ++ ++@subsubheading Examples:: ++@example ++ nil @result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{t} ++ ++@node not, t, nil, Data and Control Flow Dictionary ++@subsection not [Function] ++ ++@code{not} @i{x} @result{} @i{boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---a @i{generalized boolean} (@i{i.e.}, any @i{object}). ++ ++@i{boolean}---a @i{boolean}. ++ ++@subsubheading Description:: ++ ++Returns @b{t} if @i{x} is @i{false}; ++otherwise, returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (not nil) @result{} T ++ (not '()) @result{} T ++ (not (integerp 'sss)) @result{} T ++ (not (integerp 1)) @result{} NIL ++ (not 3.7) @result{} NIL ++ (not 'apple) @result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{null} ++ ++@subsubheading Notes:: ++ ++@b{not} is intended to be used to invert the `truth value' of a @i{boolean} ++(or @i{generalized boolean}) ++whereas @b{null} is intended to be used to test for the @i{empty list}. ++Operationally, @b{not} and @b{null} compute the same result; ++which to use is a matter of style. ++ ++@node t, eq, not, Data and Control Flow Dictionary ++@subsection t [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++@b{t}. ++ ++@subsubheading Description:: ++ ++The @i{boolean} representing true, ++and the canonical @i{generalized boolean} representing true. ++Although any @i{object} ++other than @b{nil} is considered @i{true}, ++@b{t} is generally used when there is no special reason ++to prefer one such @i{object} over another. ++ ++The @i{symbol} @b{t} is also sometimes used for other purposes as well. ++For example, ++ as the @i{name} of a @i{class}, ++ as a @i{designator} (@i{e.g.}, a @i{stream designator}) ++ or as a special symbol for some syntactic reason ++ (@i{e.g.}, in @b{case} and @b{typecase} to label the @i{otherwise-clause}). ++ ++@subsubheading Examples:: ++ ++@example ++ t @result{} T ++ (eq t 't) @result{} @i{true} ++ (find-class 't) @result{} # ++ (case 'a (a 1) (t 2)) @result{} 1 ++ (case 'b (a 1) (t 2)) @result{} 2 ++ (prin1 'hello t) ++@t{ |> } HELLO ++@result{} HELLO ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{NIL} ++ ++@node eq, eql, t, Data and Control Flow Dictionary ++@subsection eq [Function] ++ ++@code{eq} @i{x y} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---an @i{object}. ++ ++@i{y}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if its @i{arguments} are the same, identical @i{object}; ++otherwise, returns @i{false}. ++ ++@subsubheading Examples:: ++@example ++ (eq 'a 'b) @result{} @i{false} ++ (eq 'a 'a) @result{} @i{true} ++ (eq 3 3) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (eq 3 3.0) @result{} @i{false} ++ (eq 3.0 3.0) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (eq #c(3 -4) #c(3 -4)) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (eq #c(3 -4.0) #c(3 -4)) @result{} @i{false} ++ (eq (cons 'a 'b) (cons 'a 'c)) @result{} @i{false} ++ (eq (cons 'a 'b) (cons 'a 'b)) @result{} @i{false} ++ (eq '(a . b) '(a . b)) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (progn (setq x (cons 'a 'b)) (eq x x)) @result{} @i{true} ++ (progn (setq x '(a . b)) (eq x x)) @result{} @i{true} ++ (eq #\A #\A) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (let ((x "Foo")) (eq x x)) @result{} @i{true} ++ (eq "Foo" "Foo") ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (eq "Foo" (copy-seq "Foo")) @result{} @i{false} ++ (eq "FOO" "foo") @result{} @i{false} ++ (eq "string-seq" (copy-seq "string-seq")) @result{} @i{false} ++ (let ((x 5)) (eq x x)) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{eql} ++, ++@ref{equal} ++, ++@ref{equalp} ++, ++@ref{=} ++, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++@i{Objects} that appear the same when printed are not necessarily ++@b{eq} to each other. @i{Symbols} that print the same ++usually are @b{eq} to each other because of the use of the ++@b{intern} function. However, @i{numbers} with the ++same value need not be @b{eq}, and two similar ++@i{lists} are usually not @i{identical}. ++ ++An implementation is permitted to make ``copies'' of ++@i{characters} and @i{numbers} at any time. ++The effect is that @r{Common Lisp} makes no guarantee that @b{eq} ++is true even when both its arguments are ``the same thing'' if ++that thing is a @i{character} or @i{number}. ++ ++Most @r{Common Lisp} @i{operators} use @b{eql} rather than ++@b{eq} to compare objects, or else they default to @b{eql} ++and only use @b{eq} if specifically requested to do so. ++However, the following @i{operators} are defined to use @b{eq} ++rather than @b{eql} in a way that cannot be overridden by the ++@i{code} which employs them: ++ ++@format ++@group ++@noindent ++@w{ catch getf throw } ++@w{ get remf } ++@w{ get-properties remprop } ++ ++@noindent ++@w{ Figure 5--11: Operators that always prefer EQ over EQL} ++ ++@end group ++@end format ++ ++@node eql, equal, eq, Data and Control Flow Dictionary ++@subsection eql [Function] ++ ++@code{eql} @i{x y} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---an @i{object}. ++ ++@i{y}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++The value of @b{eql} is @i{true} of two objects, @i{x} and ++@i{y}, in the folowing cases: ++@table @asis ++ ++@item 1. ++If @i{x} and @i{y} are @b{eq}. ++@item 2. ++If @i{x} and @i{y} are both @i{numbers} ++of the same @i{type} and the same value. ++@item 3. ++If they are both @i{characters} that represent the ++same character. ++@end table ++ ++Otherwise the value of @b{eql} is @i{false}. ++ ++If an implementation supports positive and negative zeros as @i{distinct} values, ++then @t{(eql 0.0 -0.0)} returns @i{false}. ++Otherwise, when the syntax @t{-0.0} is read it is interpreted as the value @t{0.0}, ++and so @t{(eql 0.0 -0.0)} returns @i{true}. ++ ++@subsubheading Examples:: ++ ++@example ++ (eql 'a 'b) @result{} @i{false} ++ (eql 'a 'a) @result{} @i{true} ++ (eql 3 3) @result{} @i{true} ++ (eql 3 3.0) @result{} @i{false} ++ (eql 3.0 3.0) @result{} @i{true} ++ (eql #c(3 -4) #c(3 -4)) @result{} @i{true} ++ (eql #c(3 -4.0) #c(3 -4)) @result{} @i{false} ++ (eql (cons 'a 'b) (cons 'a 'c)) @result{} @i{false} ++ (eql (cons 'a 'b) (cons 'a 'b)) @result{} @i{false} ++ (eql '(a . b) '(a . b)) ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (progn (setq x (cons 'a 'b)) (eql x x)) @result{} @i{true} ++ (progn (setq x '(a . b)) (eql x x)) @result{} @i{true} ++ (eql #\A #\A) @result{} @i{true} ++ (eql "Foo" "Foo") ++@result{} @i{true} ++@i{OR}@result{} @i{false} ++ (eql "Foo" (copy-seq "Foo")) @result{} @i{false} ++ (eql "FOO" "foo") @result{} @i{false} ++@end example ++ ++Normally @t{(eql 1.0s0 1.0d0)} is false, under the assumption ++that @t{1.0s0} and @t{1.0d0} are of distinct data types. ++However, implementations that do not provide four distinct floating-point ++formats are permitted to ``collapse'' the four formats into some ++smaller number of them; in such an implementation @t{(eql 1.0s0 1.0d0)} ++might be true. ++ ++@subsubheading See Also:: ++ ++@ref{eq} ++, ++@ref{equal} ++, ++@ref{equalp} ++, ++@ref{=} ++, ++@ref{char=} ++ ++@subsubheading Notes:: ++ ++@b{eql} is the same as @b{eq}, except that if the ++arguments are @i{characters} or @i{numbers} ++of the same type then their ++values are compared. Thus @b{eql} tells whether two @i{objects} ++are conceptually the same, whereas @b{eq} tells whether two ++@i{objects} are implementationally identical. It is for this reason ++that @b{eql}, not @b{eq}, is the default comparison predicate ++for @i{operators} that take @i{sequences} ++as arguments. ++ ++@b{eql} may not be true of two @i{floats} ++even when they represent the same ++value. @b{=} is used to compare ++mathematical values. ++ ++Two @i{complex} numbers are considered to be @b{eql} ++if their real parts are @b{eql} ++and their imaginary parts are @b{eql}. ++For example, @t{(eql #C(4 5) #C(4 5))} is @i{true} and ++@t{(eql #C(4 5) #C(4.0 5.0))} is @i{false}. ++Note that while @t{(eql #C(5.0 0.0) 5.0)} is @i{false}, ++@t{(eql #C(5 0) 5)} is @i{true}. ++In the case of @t{(eql #C(5.0 0.0) 5.0)} the ++two arguments are of different types, ++and so cannot satisfy @b{eql}. ++In the case of @t{(eql #C(5 0) 5)}, ++@t{#C(5 0)} is not a @i{complex} number, but ++is automatically reduced ++to the @i{integer} @t{5}. ++ ++@node equal, equalp, eql, Data and Control Flow Dictionary ++@subsection equal [Function] ++ ++@code{equal} @i{x y} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---an @i{object}. ++ ++@i{y}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{x} and @i{y} are structurally similar ++(isomorphic) @i{objects}. @i{Objects} are treated as follows by ++@b{equal}. ++ ++@table @asis ++ ++@item @i{Symbols}, @i{Numbers}, and @i{Characters} ++@b{equal} is @i{true} of two @i{objects} ++if they are @i{symbols} that are @b{eq}, ++if they are @i{numbers} that are @b{eql}, or ++if they are @i{characters} that are @b{eql}. ++ ++@item @i{Conses} ++For @i{conses}, @b{equal} is defined recursively as ++the two @i{cars} being @b{equal} ++and the two @i{cdrs} being @b{equal}. ++ ++@item @i{Arrays} ++Two @i{arrays} are @b{equal} only if they are @b{eq}, ++with one exception: ++@i{strings} and @i{bit vectors} are compared element-by-element (using @b{eql}). ++If either @i{x} or @i{y} has a @i{fill pointer}, the ++@i{fill pointer} limits ++the number of elements examined by @b{equal}. ++Uppercase and lowercase letters in @i{strings} are considered by ++@b{equal} to be different. ++ ++@item @i{Pathnames} ++Two @i{pathnames} are @b{equal} if and only if ++all the corresponding components ++(host, device, and so on) are ++equivalent. Whether or not ++uppercase and lowercase letters are considered equivalent ++in @i{strings} appearing in components is @i{implementation-dependent}. ++@i{pathnames} ++that are @b{equal} should be functionally equivalent. ++ ++@item Other (Structures, hash-tables, instances, ...) ++Two other @i{objects} are @b{equal} only if they are @b{eq}. ++ ++@end table ++ ++@b{equal} does not descend any @i{objects} other than the ++ones explicitly specified above. ++Figure 5--12 summarizes the information given in the previous list. ++In addition, the figure specifies the priority of the behavior of @b{equal}, ++with upper ++ entries taking priority over lower ones. ++ ++@format ++@group ++@noindent ++@w{ Type Behavior } ++@w{ @i{number} uses @b{eql} } ++@w{ @i{character} uses @b{eql} } ++@w{ @i{cons} descends } ++@w{ @i{bit vector} descends } ++@w{ @i{string} descends } ++@w{ @i{pathname} ``functionally equivalent'' } ++@w{ @i{structure} uses @b{eq} } ++@w{ Other @i{array} uses @b{eq} } ++@w{ @i{hash table} uses @b{eq} } ++@w{ Other @i{object} uses @b{eq} } ++ ++@noindent ++@w{ Figure 5--12: Summary and priorities of behavior of @b{equal}} ++ ++@end group ++@end format ++ ++Any two @i{objects} that are @b{eql} are also @b{equal}. ++ ++@b{equal} may fail to terminate if @i{x} or @i{y} is circular. ++ ++@subsubheading Examples:: ++ ++@example ++ (equal 'a 'b) @result{} @i{false} ++ (equal 'a 'a) @result{} @i{true} ++ (equal 3 3) @result{} @i{true} ++ (equal 3 3.0) @result{} @i{false} ++ (equal 3.0 3.0) @result{} @i{true} ++ (equal #c(3 -4) #c(3 -4)) @result{} @i{true} ++ (equal #c(3 -4.0) #c(3 -4)) @result{} @i{false} ++ (equal (cons 'a 'b) (cons 'a 'c)) @result{} @i{false} ++ (equal (cons 'a 'b) (cons 'a 'b)) @result{} @i{true} ++ (equal #\A #\A) @result{} @i{true} ++ (equal #\A #\a) @result{} @i{false} ++ (equal "Foo" "Foo") @result{} @i{true} ++ (equal "Foo" (copy-seq "Foo")) @result{} @i{true} ++ (equal "FOO" "foo") @result{} @i{false} ++ (equal "This-string" "This-string") @result{} @i{true} ++ (equal "This-string" "this-string") @result{} @i{false} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{eq} ++, ++@ref{eql} ++, ++@ref{equalp} ++, ++@ref{=} ++, ++@ref{string=} ++, @b{string-equal}, ++@ref{char=} ++, ++@b{char-equal}, ++@ref{tree-equal} ++ ++@subsubheading Notes:: ++ ++ @i{Object} equality is not a concept for which there is a uniquely ++ determined correct algorithm. The appropriateness of an equality ++ predicate can be judged only in the context of the needs of some ++ particular program. Although these functions take any type of ++ argument and their names sound very generic, ++@b{equal} and @b{equalp} are ++ not appropriate for every application. ++ ++A rough rule of thumb is that two @i{objects} are @b{equal} ++if and only if their printed representations are the same. ++ ++@node equalp, identity, equal, Data and Control Flow Dictionary ++@subsection equalp [Function] ++ ++@code{equalp} @i{x y} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{x}---an @i{object}. ++ ++@i{y}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if @i{x} and @i{y} are @b{equal}, ++or if they have components that are of the same @i{type} as each other ++ and if those components are @b{equalp}; ++specifically, @b{equalp} returns @i{true} in the following cases: ++@table @asis ++ ++@item @i{Characters} ++If two @i{characters} are @b{char-equal}. ++ ++@item @i{Numbers} ++If two @i{numbers} are the @i{same} under @b{=}. ++ ++@item @i{Conses} ++If the two @i{cars} in the @i{conses} are @b{equalp} ++and the two @i{cdrs} in the @i{conses} are @b{equalp}. ++ ++@item @i{Arrays} ++If two @i{arrays} have the same ++number of dimensions, the dimensions match, ++and the corresponding ++@i{active elements} ++are @b{equalp}. ++The @i{types} for which the @i{arrays} are @i{specialized} need not match; ++for example, a @i{string} and a general @i{array} that happens to contain the same ++@i{characters} are @b{equalp}. ++Because @b{equalp} performs @i{element}-by-@i{element} comparisons ++of @i{strings} and ignores the @i{case} of @i{characters}, ++@i{case} distinctions are ignored when @b{equalp} compares @i{strings}. ++ ++@item @i{Structures} ++If two @i{structures} S_1 and S_2 have the same @i{class} ++and the value of each @i{slot} in S_1 is the @i{same} under @b{equalp} ++as the value of the corresponding @i{slot} in S_2. ++ ++@item @i{Hash Tables} ++@b{equalp} descends @i{hash-tables} by first comparing the count of entries ++ and the @t{:test} function; if those are the same, it compares the ++ keys of the tables using the @t{:test} function and then the values ++ of the matching keys using @b{equalp} recursively. ++ ++@end table ++ ++@b{equalp} does not descend any @i{objects} ++ other than the ones explicitly specified above. ++Figure 5--13 summarizes the information given in the previous list. ++In addition, the figure specifies the priority of the behavior of @b{equalp}, ++with upper ++ entries taking priority over lower ones. ++ ++@format ++@group ++@noindent ++@w{ Type Behavior } ++@w{ @i{number} uses @b{=} } ++@w{ @i{character} uses @b{char-equal} } ++@w{ @i{cons} descends } ++@w{ @i{bit vector} descends } ++@w{ @i{string} descends } ++@w{ @i{pathname} same as @b{equal} } ++@w{ @i{structure} descends, as described above } ++@w{ Other @i{array} descends } ++@w{ @i{hash table} descends, as described above } ++@w{ Other @i{object} uses @b{eq} } ++ ++@noindent ++@w{ Figure 5--13: Summary and priorities of behavior of @b{equalp}} ++ ++@end group ++@end format ++ ++@subsubheading Examples:: ++ ++@example ++ (equalp 'a 'b) @result{} @i{false} ++ (equalp 'a 'a) @result{} @i{true} ++ (equalp 3 3) @result{} @i{true} ++ (equalp 3 3.0) @result{} @i{true} ++ (equalp 3.0 3.0) @result{} @i{true} ++ (equalp #c(3 -4) #c(3 -4)) @result{} @i{true} ++ (equalp #c(3 -4.0) #c(3 -4)) @result{} @i{true} ++ (equalp (cons 'a 'b) (cons 'a 'c)) @result{} @i{false} ++ (equalp (cons 'a 'b) (cons 'a 'b)) @result{} @i{true} ++ (equalp #\A #\A) @result{} @i{true} ++ (equalp #\A #\a) @result{} @i{true} ++ (equalp "Foo" "Foo") @result{} @i{true} ++ (equalp "Foo" (copy-seq "Foo")) @result{} @i{true} ++ (equalp "FOO" "foo") @result{} @i{true} ++@end example ++ ++@example ++ (setq array1 (make-array 6 :element-type 'integer ++ :initial-contents '(1 1 1 3 5 7))) ++@result{} #(1 1 1 3 5 7) ++ (setq array2 (make-array 8 :element-type 'integer ++ :initial-contents '(1 1 1 3 5 7 2 6) ++ :fill-pointer 6)) ++@result{} #(1 1 1 3 5 7) ++ (equalp array1 array2) @result{} @i{true} ++ (setq vector1 (vector 1 1 1 3 5 7)) @result{} #(1 1 1 3 5 7) ++ (equalp array1 vector1) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{eq} ++, ++@ref{eql} ++, ++@ref{equal} ++, ++@ref{=} ++, ++@ref{string=} ++, @b{string-equal}, ++@ref{char=} ++, ++@b{char-equal} ++ ++@subsubheading Notes:: ++ ++ @i{Object} equality is not a concept for which there is a uniquely ++ determined correct algorithm. The appropriateness of an equality ++ predicate can be judged only in the context of the needs of some ++ particular program. Although these functions take any type of ++ argument and their names sound very generic, ++@b{equal} and @b{equalp} are ++ not appropriate for every application. ++ ++@node identity, complement, equalp, Data and Control Flow Dictionary ++@subsection identity [Function] ++ ++@code{identity} @i{object} @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Returns its argument @i{object}. ++ ++@subsubheading Examples:: ++ ++@example ++ (identity 101) @result{} 101 ++ (mapcan #'identity (list (list 1 2 3) '(4 5 6))) @result{} (1 2 3 4 5 6) ++@end example ++ ++@subsubheading Notes:: ++ ++@b{identity} is intended for use with functions that require ++a @i{function} as an argument. ++ ++@t{(eql x (identity x))} returns @i{true} for all possible values of @i{x}, ++but @t{(eq x (identity x))} might return @i{false} when @i{x} is a @i{number} ++or @i{character}. ++ ++@b{identity} could be defined by ++ ++@example ++(defun identity (x) x) ++@end example ++ ++@node complement, constantly, identity, Data and Control Flow Dictionary ++@subsection complement [Function] ++ ++@code{complement} @i{function} @result{} @i{complement-function} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function}---a @i{function}. ++ ++@i{complement-function}---a @i{function}. ++ ++@subsubheading Description:: ++ ++Returns a @i{function} that ++ takes the same @i{arguments} as @i{function}, ++ and has the same side-effect behavior as @i{function}, ++ but returns only a single value: ++ a @i{generalized boolean} with the opposite truth value of that ++ which would be returned as the @i{primary value} of @i{function}. ++ That is, when the @i{function} would have returned ++ @i{true} as its @i{primary value} ++ the @i{complement-function} returns @i{false}, ++ and when the @i{function} would have returned ++ @i{false} as its @i{primary value} ++ the @i{complement-function} returns @i{true}. ++ ++@subsubheading Examples:: ++ ++@example ++ (funcall (complement #'zerop) 1) @result{} @i{true} ++ (funcall (complement #'characterp) #\A) @result{} @i{false} ++ (funcall (complement #'member) 'a '(a b c)) @result{} @i{false} ++ (funcall (complement #'member) 'd '(a b c)) @result{} @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{not} ++ ++@subsubheading Notes:: ++ ++@example ++ (complement @i{x}) @equiv{} #'(lambda (&rest arguments) (not (apply @i{x} arguments))) ++@end example ++ ++In @r{Common Lisp}, functions with names like ``@t{@i{xxx}-if-not}'' ++are related to functions with names like ``@t{@i{xxx}-if}'' ++in that ++ ++@example ++(@i{xxx}-if-not @i{f} . @i{arguments}) @equiv{} (@i{xxx}-if (complement @i{f}) . @i{arguments}) ++@end example ++ ++For example, ++ ++@example ++ (find-if-not #'zerop '(0 0 3)) @equiv{} ++ (find-if (complement #'zerop) '(0 0 3)) @result{} 3 ++@end example ++ ++Note that since the ``@t{@i{xxx}-if-not}'' @i{functions} ++and the @t{:test-not} arguments have been deprecated, ++uses of ``@t{@i{xxx}-if}'' @i{functions} or ++@t{:test} arguments with @b{complement} are preferred. ++ ++@node constantly, every, complement, Data and Control Flow Dictionary ++@subsection constantly [Function] ++ ++@code{constantly} @i{value} @result{} @i{function} ++ ++@subsubheading Arguments and Values:: ++ ++@i{value}---an @i{object}. ++ ++@i{function}---a @i{function}. ++ ++@subsubheading Description:: ++ ++@b{constantly} returns a @i{function} that accepts any number of ++arguments, that has no side-effects, and that always returns @i{value}. ++ ++@subsubheading Examples:: ++ ++@example ++ (mapcar (constantly 3) '(a b c d)) @result{} (3 3 3 3) ++ (defmacro with-vars (vars &body forms) ++ `((lambda ,vars ,@@forms) ,@@(mapcar (constantly nil) vars))) ++@result{} WITH-VARS ++ (macroexpand '(with-vars (a b) (setq a 3 b (* a a)) (list a b))) ++@result{} ((LAMBDA (A B) (SETQ A 3 B (* A A)) (LIST A B)) NIL NIL), @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{not} ++ ++@subsubheading Notes:: ++ ++@b{constantly} could be defined by: ++ ++@example ++ (defun constantly (object) ++ #'(lambda (&rest arguments) object)) ++@end example ++ ++@node every, and, constantly, Data and Control Flow Dictionary ++@subsection every, some, notevery, notany [Function] ++ ++@code{every} @i{predicate @r{&rest} sequences^+} @result{} @i{generalized-boolean} ++ ++@code{some} @i{predicate @r{&rest} sequences^+} @result{} @i{result} ++ ++@code{notevery} @i{predicate @r{&rest} sequences^+} @result{} @i{generalized-boolean} ++ ++@code{notany} @i{predicate @r{&rest} sequences^+} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{predicate}---a @i{designator} for a @i{function} of ++ as many @i{arguments} as there are @i{sequences}. ++ ++@i{sequence}---a @i{sequence}. ++ ++@i{result}---an @i{object}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++@b{every}, @b{some}, @b{notevery}, and @b{notany} ++test @i{elements} of @i{sequences} for satisfaction of a given @i{predicate}. ++The first argument to @i{predicate} is an @i{element} of the first @i{sequence}; ++each succeeding argument is an @i{element} of a succeeding @i{sequence}. ++ ++@i{Predicate} is first applied to the elements ++with index @t{0} in each of the @i{sequences}, and possibly then to ++the elements with index @t{1}, and so on, until a termination ++criterion is met or the end of the shortest of the @i{sequences} is reached. ++ ++@b{every} returns @i{false} as soon ++as any invocation of @i{predicate} returns @i{false}. ++If the end of a @i{sequence} is reached, ++@b{every} returns @i{true}. ++Thus, @b{every} returns @i{true} if and only if ++every invocation of @i{predicate} returns @i{true}. ++ ++@b{some} returns the first @i{non-nil} value ++which is returned by an invocation of @i{predicate}. ++If the end of a @i{sequence} is reached without any invocation of the ++@i{predicate} returning @i{true}, @b{some} returns @i{false}. ++Thus, @b{some} returns @i{true} if and only if ++some invocation of @i{predicate} returns @i{true}. ++ ++@b{notany} returns @i{false} ++as soon as any invocation of @i{predicate} returns @i{true}. ++If the end of a @i{sequence} is reached, ++@b{notany} returns @i{true}. ++Thus, @b{notany} returns @i{true} if and only if ++it is not the case that any invocation of @i{predicate} returns @i{true}. ++ ++@b{notevery} returns @i{true} as soon as any invocation of ++@i{predicate} returns @i{false}. ++If the end of a @i{sequence} is reached, ++@b{notevery} returns @i{false}. ++Thus, @b{notevery} returns @i{true} if and only if ++it is not the case that every invocation of @i{predicate} returns @i{true}. ++ ++@subsubheading Examples:: ++ ++@example ++ (every #'characterp "abc") @result{} @i{true} ++ (some #'= '(1 2 3 4 5) '(5 4 3 2 1)) @result{} @i{true} ++ (notevery #'< '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) @result{} @i{false} ++ (notany #'> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) @result{} @i{true} ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its first argument is neither a ++@i{symbol} nor a @i{function} or if any subsequent ++argument is not a @i{proper sequence}. ++ ++Other exceptional situations are possible, depending on the nature ++of the @i{predicate}. ++ ++@subsubheading See Also:: ++ ++@ref{and} ++, ++@ref{or} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++@example ++ (notany @i{predicate} @{@i{sequence}@}*) @equiv{} (not (some @i{predicate} @{@i{sequence}@}*)) ++ (notevery @i{predicate} @{@i{sequence}@}*) @equiv{} (not (every @i{predicate} @{@i{sequence}@}*)) ++@end example ++ ++@node and, cond, every, Data and Control Flow Dictionary ++@subsection and [Macro] ++ ++@code{and} @i{@{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} resulting from the evaluation of ++ the last @i{form}, or the symbols @b{nil} or @b{t}. ++ ++@subsubheading Description:: ++ ++The macro @b{and} evaluates each @i{form} one at a time from left to right. ++As soon as any @i{form} evaluates to @b{nil}, @b{and} returns ++@b{nil} without evaluating the remaining @i{forms}. If all @i{forms} ++but the last evaluate to @i{true} values, @b{and} returns the results ++produced by evaluating the last @i{form}. ++ ++If no @i{forms} are supplied, @t{(and)} returns @b{t}. ++ ++@b{and} passes back multiple values from the last @i{subform} ++but not from subforms other than the last. ++ ++@subsubheading Examples:: ++ ++@example ++ (if (and (>= n 0) ++ (< n (length a-simple-vector)) ++ (eq (elt a-simple-vector n) 'foo)) ++ (princ "Foo!")) ++@end example ++ ++The above expression prints @t{Foo!} if element @t{n} of @t{a-simple-vector} ++is the symbol @t{foo}, provided also that @t{n} is indeed a valid index ++for @t{a-simple-vector}. Because @b{and} guarantees ++left-to-right testing ++of its parts, @b{elt} is not called if @t{n} is out of range. ++ ++@example ++ (setq temp1 1 temp2 1 temp3 1) @result{} 1 ++ (and (incf temp1) (incf temp2) (incf temp3)) @result{} 2 ++ (and (eql 2 temp1) (eql 2 temp2) (eql 2 temp3)) @result{} @i{true} ++ (decf temp3) @result{} 1 ++ (and (decf temp1) (decf temp2) (eq temp3 'nil) (decf temp3)) @result{} NIL ++ (and (eql temp1 temp2) (eql temp2 temp3)) @result{} @i{true} ++ (and) @result{} T ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{cond} ++, ++@ref{every} ++, ++@ref{if} ++, ++@ref{or} ++, ++@ref{when} ++ ++@subsubheading Notes:: ++ ++@example ++ (and @i{form}) @equiv{} (let () @i{form}) ++ (and @i{form1} @i{form2} ...) @equiv{} (when @i{form1} (and @i{form2} ...)) ++@end example ++ ++@node cond, if, and, Data and Control Flow Dictionary ++@subsection cond [Macro] ++ ++@code{cond} @i{@{!@i{clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{clause} ::=@r{(}test-form @{@i{form}@}*@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{test-form}---a @i{form}. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms} ++ in the first @i{clause} whose @i{test-form} @i{yields} @i{true}, ++ or the @i{primary value} of the @i{test-form} ++ if there are no @i{forms} in that @i{clause}, ++ or else @b{nil} if no @i{test-form} @i{yields} @i{true}. ++ ++@subsubheading Description:: ++ ++@b{cond} allows the execution of @i{forms} to be dependent ++on @i{test-form}. ++ ++@i{Test-forms} are evaluated one at a time in the order in which ++they are given in the argument list until a @i{test-form} is found that ++evaluates to @i{true}. ++ ++If there are no @i{forms} in that clause, the @i{primary value} ++of the @i{test-form} is returned by the @b{cond} @i{form}. ++Otherwise, the @i{forms} associated with this @i{test-form} are ++evaluated in order, left to right, as an @i{implicit progn}, and the ++@i{values} returned by the last @i{form} ++are returned by the @b{cond} @i{form}. ++ ++Once one @i{test-form} has @i{yielded} @i{true}, ++no additional @i{test-forms} are @i{evaluated}. ++If no @i{test-form} @i{yields} @i{true}, @b{nil} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun select-options () ++ (cond ((= a 1) (setq a 2)) ++ ((= a 2) (setq a 3)) ++ ((and (= a 3) (floor a 2))) ++ (t (floor a 3)))) @result{} SELECT-OPTIONS ++ (setq a 1) @result{} 1 ++ (select-options) @result{} 2 ++ a @result{} 2 ++ (select-options) @result{} 3 ++ a @result{} 3 ++ (select-options) @result{} 1 ++ (setq a 5) @result{} 5 ++ (select-options) @result{} 1, 2 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{if} ++, ++@ref{case} ++. ++ ++@node if, or, cond, Data and Control Flow Dictionary ++@subsection if [Special Operator] ++ ++@code{if} @i{@i{test-form} @i{then-form} @r{[}@i{else-form}@r{]}} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{Test-form}---a @i{form}. ++ ++@i{Then-form}---a @i{form}. ++ ++@i{Else-form}---a @i{form}. ++ The default is @b{nil}. ++ ++@i{results}---if the @i{test-form} @i{yielded} @i{true}, ++ the @i{values} returned by the @i{then-form}; otherwise, ++ the @i{values} returned by the @i{else-form}. ++ ++@subsubheading Description:: ++ ++@b{if} allows the execution of a @i{form} to be dependent ++on a single @i{test-form}. ++ ++First @i{test-form} is evaluated. ++If the result is @i{true}, then @i{then-form} is selected; ++otherwise @i{else-form} is selected. ++Whichever form is selected is then evaluated. ++ ++@subsubheading Examples:: ++ ++@example ++ (if t 1) @result{} 1 ++ (if nil 1 2) @result{} 2 ++ (defun test () ++ (dolist (truth-value '(t nil 1 (a b c))) ++ (if truth-value (print 'true) (print 'false)) ++ (prin1 truth-value))) @result{} TEST ++ (test) ++@t{ |> } TRUE T ++@t{ |> } FALSE NIL ++@t{ |> } TRUE 1 ++@t{ |> } TRUE (A B C) ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{cond} ++, ++@b{unless}, ++@ref{when} ++ ++@subsubheading Notes:: ++ ++@example ++ (if @i{test-form} @i{then-form} @i{else-form}) ++ @equiv{} (cond (@i{test-form} @i{then-form}) (t @i{else-form})) ++@end example ++ ++@node or, when, if, Data and Control Flow Dictionary ++@subsection or [Macro] ++ ++@code{or} @i{@{@i{form}@}*} @result{} @i{@{@i{results}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} or @i{primary value} (see below) ++ resulting from the evaluation of ++ the last @i{form} executed or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{or} evaluates each @i{form}, one at a time, from left to right. ++The evaluation of all @i{forms} terminates when a @i{form} evaluates ++to @i{true} (@i{i.e.}, something other than @b{nil}). ++ ++If the @i{evaluation} of any @i{form} other than the last returns a ++@i{primary value} that is @i{true}, @b{or} immediately returns ++that @i{value} (but no additional @i{values}) without evaluating the ++remaining @i{forms}. ++If every @i{form} but the last returns @i{false} as its @i{primary value}, ++@b{or} returns all @i{values} returned by the last @i{form}. ++If no @i{forms} are supplied, @b{or} returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (or) @result{} NIL ++ (setq temp0 nil temp1 10 temp2 20 temp3 30) @result{} 30 ++ (or temp0 temp1 (setq temp2 37)) @result{} 10 ++ temp2 @result{} 20 ++ (or (incf temp1) (incf temp2) (incf temp3)) @result{} 11 ++ temp1 @result{} 11 ++ temp2 @result{} 20 ++ temp3 @result{} 30 ++ (or (values) temp1) @result{} 11 ++ (or (values temp1 temp2) temp3) @result{} 11 ++ (or temp0 (values temp1 temp2)) @result{} 11, 20 ++ (or (values temp0 temp1) (values temp2 temp3)) @result{} 20, 30 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{and} ++, ++@b{some}, ++@b{unless} ++ ++@node when, case, or, Data and Control Flow Dictionary ++@subsection when, unless [Macro] ++ ++@code{when} @i{test-form @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@code{unless} @i{test-form @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{test-form}---a @i{form}. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms} ++ in a @b{when} @i{form} if the @i{test-form} @i{yields} @i{true} ++ or in an @b{unless} @i{form} if the @i{test-form} @i{yields} @i{false}; ++ otherwise @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{when} and @b{unless} allow the execution of @i{forms} ++to be dependent on a single @i{test-form}. ++ ++In a @b{when} @i{form}, ++if the @i{test-form} @i{yields} @i{true}, ++the @i{forms} are @i{evaluated} in order from left to right ++and the @i{values} returned by the @i{forms} ++are returned from the @b{when} @i{form}. ++Otherwise, if the @i{test-form} @i{yields} @i{false}, ++the @i{forms} are not @i{evaluated}, ++and the @b{when} @i{form} returns @b{nil}. ++ ++In an @b{unless} @i{form}, ++if the @i{test-form} @i{yields} @i{false}, ++the @i{forms} are @i{evaluated} in order from left to right ++and the @i{values} returned by the @i{forms} ++are returned from the @b{unless} @i{form}. ++Otherwise, if the @i{test-form} @i{yields} @i{false}, ++the @i{forms} are not @i{evaluated}, ++and the @b{unless} @i{form} returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (when t 'hello) @result{} HELLO ++ (unless t 'hello) @result{} NIL ++ (when nil 'hello) @result{} NIL ++ (unless nil 'hello) @result{} HELLO ++ (when t) @result{} NIL ++ (unless nil) @result{} NIL ++ (when t (prin1 1) (prin1 2) (prin1 3)) ++@t{ |> } 123 ++@result{} 3 ++ (unless t (prin1 1) (prin1 2) (prin1 3)) @result{} NIL ++ (when nil (prin1 1) (prin1 2) (prin1 3)) @result{} NIL ++ (unless nil (prin1 1) (prin1 2) (prin1 3)) ++@t{ |> } 123 ++@result{} 3 ++ (let ((x 3)) ++ (list (when (oddp x) (incf x) (list x)) ++ (when (oddp x) (incf x) (list x)) ++ (unless (oddp x) (incf x) (list x)) ++ (unless (oddp x) (incf x) (list x)) ++ (if (oddp x) (incf x) (list x)) ++ (if (oddp x) (incf x) (list x)) ++ (if (not (oddp x)) (incf x) (list x)) ++ (if (not (oddp x)) (incf x) (list x)))) ++@result{} ((4) NIL (5) NIL 6 (6) 7 (7)) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{and} ++, ++@ref{cond} ++, ++@ref{if} ++, ++@ref{or} ++ ++@subsubheading Notes:: ++ ++@example ++ (when @i{test} @{@i{form}@}^+) @equiv{} (and @i{test} (progn @{@i{form}@}^+)) ++ (when @i{test} @{@i{form}@}^+) @equiv{} (cond (@i{test} @{@i{form}@}^+)) ++ (when @i{test} @{@i{form}@}^+) @equiv{} (if @i{test} (progn @{@i{form}@}^+) nil) ++ (when @i{test} @{@i{form}@}^+) @equiv{} (unless (not @i{test}) @{@i{form}@}^+) ++ (unless @i{test} @{@i{form}@}^+) @equiv{} (cond ((not @i{test}) @{@i{form}@}^+)) ++ (unless @i{test} @{@i{form}@}^+) @equiv{} (if @i{test} nil (progn @{@i{form}@}^+)) ++ (unless @i{test} @{@i{form}@}^+) @equiv{} (when (not @i{test}) @{@i{form}@}^+) ++@end example ++ ++@node case, typecase, when, Data and Control Flow Dictionary ++@subsection case, ccase, ecase [Macro] ++ ++@code{case} @i{keyform @{!@i{normal-clause}@}* @r{[}!@i{otherwise-clause}@r{]}} @result{} @i{@{@i{result}@}*} ++ ++@code{ccase} @i{keyplace @{!@i{normal-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@code{ecase} @i{keyform @{!@i{normal-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{normal-clause} ::=@r{(}keys @{@i{form}@}*@r{)}} ++ ++@w{@i{otherwise-clause} ::=@r{(}@{otherwise | t@} @{@i{form}@}*@r{)}} ++ ++@w{@i{clause} ::=normal-clause | otherwise-clause} ++ ++@IRindex otherwise ++ ++@IRindex t ++ ++@subsubheading Arguments and Values:: ++ ++@i{keyform}---a @i{form}; evaluated to produce a @i{test-key}. ++ ++@i{keyplace}---a @i{form}; evaluated initially to produce a @i{test-key}. ++ Possibly also used later as a @i{place} if no @i{keys} match. ++ ++@i{test-key}---an object produced by evaluating @i{keyform} or @i{keyplace}. ++ ++@i{keys}---a @i{designator} for a @i{list} of @i{objects}. ++ In the case of @b{case}, the @i{symbols} @b{t} and @b{otherwise} may ++ not be used as the @i{keys} @i{designator}. To refer to these @i{symbols} ++ by themselves as @i{keys}, the designators @t{(t)} and @t{(otherwise)}, respectively, ++ must be used instead. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms} ++ in the matching @i{clause}. ++ ++@subsubheading Description:: ++ ++These @i{macros} allow the conditional execution of a body of @i{forms} ++in a @i{clause} that is selected by matching the @i{test-key} on the ++basis of its identity. ++ ++The @i{keyform} or @i{keyplace} is @i{evaluated} to produce the ++@i{test-key}. ++ ++Each of the @i{normal-clauses} is then considered in turn. ++If the @i{test-key} is the @i{same} as any @i{key} for ++that @i{clause}, the @i{forms} in that @i{clause} are ++@i{evaluated} as an @i{implicit progn}, and the @i{values} ++it returns are returned as the value of the @b{case}, ++@b{ccase}, or @b{ecase} @i{form}. ++ ++These @i{macros} differ only in their @i{behavior} when ++no @i{normal-clause} matches; specifically: ++ ++@table @asis ++ ++@item @b{case} ++If no @i{normal-clause} matches, and there is an @i{otherwise-clause}, ++then that @i{otherwise-clause} automatically matches; the @i{forms} in ++that @i{clause} are @i{evaluated} as an @i{implicit progn}, ++and the @i{values} it returns are returned as the value of the @b{case}. ++ ++If there is no @i{otherwise-clause}, @b{case} returns @b{nil}. ++ ++@item @b{ccase} ++If no @i{normal-clause} matches, ++a @i{correctable} @i{error} of @i{type} @b{type-error} is signaled. ++The offending datum is the @i{test-key} and ++the expected type is @i{type equivalent} to @t{(member @i{key1} @i{key2} ...)}. ++The @b{store-value} @i{restart} can be used to correct the error. ++ ++If the @b{store-value} @i{restart} is invoked, its @i{argument} becomes the ++new @i{test-key}, and is stored in @i{keyplace} as if by ++@t{(setf @i{keyplace} @i{test-key})}. ++Then @b{ccase} starts over, considering each @i{clause} anew. ++ ++[Reviewer Note by Barmar: Will it prompt for multiple values if keyplace is a VALUES general ref?] ++ ++The subforms of @i{keyplace} might be evaluated again if ++none of the cases holds. ++ ++@item @b{ecase} ++If no @i{normal-clause} matches, ++a @i{non-correctable} @i{error} of @i{type} @b{type-error} is signaled. ++The offending datum is the @i{test-key} and ++the expected type is @i{type equivalent} to @t{(member @i{key1} @i{key2} ...)}. ++ ++Note that in contrast with @b{ccase}, ++the caller of @b{ecase} may rely on the fact that @b{ecase} ++does not return if a @i{normal-clause} does not match. ++ ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (dolist (k '(1 2 3 :four #\v () t 'other)) ++ (format t "~S " ++ (case k ((1 2) 'clause1) ++ (3 'clause2) ++ (nil 'no-keys-so-never-seen) ++ ((nil) 'nilslot) ++ ((:four #\v) 'clause4) ++ ((t) 'tslot) ++ (otherwise 'others)))) ++@t{ |> } CLAUSE1 CLAUSE1 CLAUSE2 CLAUSE4 CLAUSE4 NILSLOT TSLOT OTHERS ++@result{} NIL ++ (defun add-em (x) (apply #'+ (mapcar #'decode x))) ++@result{} ADD-EM ++ (defun decode (x) ++ (ccase x ++ ((i uno) 1) ++ ((ii dos) 2) ++ ((iii tres) 3) ++ ((iv cuatro) 4))) ++@result{} DECODE ++ (add-em '(uno iii)) @result{} 4 ++ (add-em '(uno iiii)) ++@t{ |> } Error: The value of X, IIII, is not I, UNO, II, DOS, III, ++@t{ |> } TRES, IV, or CUATRO. ++@t{ |> } 1: Supply a value to use instead. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Value to evaluate and use for X: @b{|>>}@t{'IV}@b{<<|} ++@result{} 5 ++@end example ++ ++@subsubheading Side Effects:: ++ ++The debugger might be entered. ++If the @b{store-value} @i{restart} is invoked, ++the @i{value} of @i{keyplace} might be changed. ++ ++@subsubheading Affected By:: ++ ++@b{ccase} and @b{ecase}, since they might signal an error, ++are potentially affected by existing @i{handlers} and @b{*debug-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++@b{ccase} and @b{ecase} signal an error of @i{type} @b{type-error} ++if no @i{normal-clause} matches. ++ ++@subsubheading See Also:: ++ ++@ref{cond} ++, ++@ref{typecase} ++, ++@ref{setf} ++, ++@ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++@example ++(case @i{test-key} ++ @{((@{@i{key}@}*) @{@i{form}@}*)@}*) ++@equiv{} ++(let ((#1=#:g0001 @i{test-key})) ++ (cond @{((member #1# '(@{@i{key}@}*)) @{@i{form}@}*)@}*)) ++@end example ++ ++The specific error message used by @b{ecase} and @b{ccase} can vary ++between implementations. In situations where control of the specific wording ++of the error message is important, it is better to use @b{case} with an ++@i{otherwise-clause} that explicitly signals an error with an appropriate ++message. ++ ++@node typecase, multiple-value-bind, case, Data and Control Flow Dictionary ++@subsection typecase, ctypecase, etypecase [Macro] ++ ++@code{typecase} @i{keyform @{!@i{normal-clause}@}* @r{[}!@i{otherwise-clause}@r{]}} @result{} @i{@{@i{result}@}*} ++ ++@code{ctypecase} @i{keyplace @{!@i{normal-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@code{etypecase} @i{keyform @{!@i{normal-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{normal-clause} ::=@r{(}type @{@i{form}@}*@r{)}} ++ ++@w{@i{otherwise-clause} ::=@r{(}@{otherwise | t@} @{@i{form}@}*@r{)}} ++ ++@w{@i{clause} ::=normal-clause | otherwise-clause} ++ ++@IRindex otherwise ++ ++@IRindex t ++ ++@subsubheading Arguments and Values:: ++ ++@i{keyform}---a @i{form}; evaluated to produce a @i{test-key}. ++ ++@i{keyplace}---a @i{form}; evaluated initially to produce a @i{test-key}. ++ Possibly also used later as a @i{place} if no @i{types} match. ++ ++@i{test-key}---an object produced by evaluating @i{keyform} or @i{keyplace}. ++ ++@i{type}---a @i{type specifier}. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms} ++ in the matching @i{clause}. ++ ++@subsubheading Description:: ++ ++These @i{macros} allow the conditional execution of a body of @i{forms} ++in a @i{clause} that is selected by matching the @i{test-key} on the basis ++of its @i{type}. ++ ++The @i{keyform} or @i{keyplace} is @i{evaluated} to produce the ++@i{test-key}. ++ ++Each of the @i{normal-clauses} is then considered in turn. ++If the @i{test-key} is of the @i{type} ++given by the @i{clauses}'s @i{type}, ++the @i{forms} in that @i{clause} are ++@i{evaluated} as an @i{implicit progn}, and the @i{values} ++it returns are returned as the value of the @b{typecase}, ++@b{ctypecase}, or @b{etypecase} @i{form}. ++ ++These @i{macros} differ only in their @i{behavior} when ++no @i{normal-clause} matches; specifically: ++ ++@table @asis ++ ++@item @b{typecase} ++If no @i{normal-clause} matches, and there is an @i{otherwise-clause}, ++then that @i{otherwise-clause} automatically matches; the @i{forms} in ++that @i{clause} are @i{evaluated} as an @i{implicit progn}, ++and the @i{values} it returns are returned as the value of the @b{typecase}. ++ ++If there is no @i{otherwise-clause}, @b{typecase} returns @b{nil}. ++ ++@item @b{ctypecase} ++If no @i{normal-clause} matches, ++a @i{correctable} @i{error} of @i{type} @b{type-error} is signaled. ++The offending datum is the @i{test-key} and ++the expected type is @i{type equivalent} to @t{(or @i{type1} @i{type2} ...)}. ++The @b{store-value} @i{restart} can be used to correct the error. ++ ++If the @b{store-value} @i{restart} is invoked, its @i{argument} becomes the ++new @i{test-key}, and is stored in @i{keyplace} as if by ++@t{(setf @i{keyplace} @i{test-key})}. ++Then @b{ctypecase} starts over, considering each @i{clause} anew. ++ ++If the @b{store-value} @i{restart} is invoked interactively, ++the user is prompted for a new @i{test-key} to use. ++ ++The subforms of @i{keyplace} might be evaluated again if ++none of the cases holds. ++ ++@item @b{etypecase} ++If no @i{normal-clause} matches, ++a @i{non-correctable} @i{error} of @i{type} @b{type-error} is signaled. ++The offending datum is the @i{test-key} and ++the expected type is @i{type equivalent} to @t{(or @i{type1} @i{type2} ...)}. ++ ++Note that in contrast with @b{ctypecase}, ++the caller of @b{etypecase} may rely on the fact that @b{etypecase} ++does not return if a @i{normal-clause} does not match. ++ ++@end table ++ ++In all three cases, is permissible for more than one @i{clause} to specify a ++matching @i{type}, particularly if one is a @i{subtype} of another; ++the earliest applicable @i{clause} is chosen. ++ ++@subsubheading Examples:: ++ ++@example ++;;; (Note that the parts of this example which use TYPE-OF ++;;; are implementation-dependent.) ++ (defun what-is-it (x) ++ (format t "~&~S is ~A.~ ++ x (typecase x ++ (float "a float") ++ (null "a symbol, boolean false, or the empty list") ++ (list "a list") ++ (t (format nil "a(n) ~(~A~)" (type-of x)))))) ++@result{} WHAT-IS-IT ++ (map 'nil #'what-is-it '(nil (a b) 7.0 7 box)) ++@t{ |> } NIL is a symbol, boolean false, or the empty list. ++@t{ |> } (A B) is a list. ++@t{ |> } 7.0 is a float. ++@t{ |> } 7 is a(n) integer. ++@t{ |> } BOX is a(n) symbol. ++@result{} NIL ++ (setq x 1/3) ++@result{} 1/3 ++ (ctypecase x ++ (integer (* x 4)) ++ (symbol (symbol-value x))) ++@t{ |> } Error: The value of X, 1/3, is neither an integer nor a symbol. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use instead. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Use value: @b{|>>}@t{3.7}@b{<<|} ++@t{ |> } Error: The value of X, 3.7, is neither an integer nor a symbol. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use instead. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Use value: @b{|>>}@t{12}@b{<<|} ++@result{} 48 ++ x @result{} 12 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{ctypecase} and @b{etypecase}, since they might signal an error, ++are potentially affected by existing @i{handlers} and @b{*debug-io*}. ++ ++@subsubheading Exceptional Situations:: ++ ++@b{ctypecase} and @b{etypecase} signal an error of @i{type} @b{type-error} ++if no @i{normal-clause} matches. ++ ++The @i{compiler} may choose to issue a warning of @i{type} @b{style-warning} ++if a @i{clause} will never be selected because it is completely ++shadowed by earlier clauses. ++ ++@subsubheading See Also:: ++ ++@ref{case} ++, ++@ref{cond} ++, ++@ref{setf} ++, ++@ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++@example ++(typecase @i{test-key} ++ @{(@i{type} @{@i{form}@}*)@}*) ++@equiv{} ++(let ((#1=#:g0001 @i{test-key})) ++ (cond @{((typep #1# '@i{type}) @{@i{form}@}*)@}*)) ++@end example ++ ++The specific error message used by @b{etypecase} and @b{ctypecase} can vary ++between implementations. In situations where control of the specific wording ++of the error message is important, it is better to use @b{typecase} with an ++@i{otherwise-clause} that explicitly signals an error with an appropriate ++message. ++ ++@node multiple-value-bind, multiple-value-call, typecase, Data and Control Flow Dictionary ++@subsection multiple-value-bind [Macro] ++ ++@code{multiple-value-bind} @i{@r{(}@{@i{var}@}*@r{)} ++ @i{values-form} ++ @{@i{declaration}@}* ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol} naming a variable; not evaluated. ++ ++@i{values-form}---a @i{form}; evaluated. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++Creates new variable @i{bindings} for the @i{vars} and ++executes a series of @i{forms} that use these @i{bindings}. ++ ++The variable @i{bindings} created are lexical unless ++@b{special} declarations are specified. ++ ++@i{Values-form} is evaluated, and each of the @i{vars} is ++bound to the respective value returned by that @i{form}. If there are more ++@i{vars} than values returned, extra values of @b{nil} are given to the ++remaining @i{vars}. If there are more values than ++@i{vars}, the excess ++values are discarded. The @i{vars} are bound to the values over ++the execution of the @i{forms}, which make up an implicit @b{progn}. ++The consequences are unspecified if a type @i{declaration} is specified ++for a @i{var}, but the value to which ++that @i{var} is bound is not consistent with ++the type @i{declaration}. ++ ++The @i{scopes} of the name binding and @i{declarations} ++do not include the @i{values-form}. ++ ++@subsubheading Examples:: ++ ++@example ++ (multiple-value-bind (f r) ++ (floor 130 11) ++ (list f r)) @result{} (11 9) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{let} ++, ++@ref{multiple-value-call} ++ ++@subsubheading Notes:: ++ ++@example ++ (multiple-value-bind (@{@i{var}@}*) @i{values-form} @{@i{form}@}*) ++ @equiv{} (multiple-value-call #'(lambda (&optional @{@i{var}@}* &rest #1=#:ignore) ++ (declare (ignore #1#)) ++ @{@i{form}@}*) ++ @i{values-form}) ++@end example ++ ++@node multiple-value-call, multiple-value-list, multiple-value-bind, Data and Control Flow Dictionary ++@subsection multiple-value-call [Special Operator] ++ ++@code{multiple-value-call} @i{@i{function-form} @i{form}@r{*}} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-form}---a @i{form}; evaluated to produce @i{function}. ++ ++@i{function}---a @i{function designator} ++ resulting from the evaluation of @i{function-form}. ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} returned by the @i{function}. ++ ++@subsubheading Description:: ++ ++Applies @i{function} to a @i{list} of the @i{objects} collected from groups of ++@i{multiple values}_2. ++ ++@b{multiple-value-call} first evaluates the @i{function-form} ++to obtain @i{function}, and then evaluates each @i{form}. ++All the values ++of each @i{form} are gathered together (not just one value from each) ++and given as arguments to the @i{function}. ++ ++@subsubheading Examples:: ++@example ++ (multiple-value-call #'list 1 '/ (values 2 3) '/ (values) '/ (floor 2.5)) ++@result{} (1 / 2 3 / / 2 0.5) ++ (+ (floor 5 3) (floor 19 4)) @equiv{} (+ 1 4) ++@result{} 5 ++ (multiple-value-call #'+ (floor 5 3) (floor 19 4)) @equiv{} (+ 1 2 4 3) ++@result{} 10 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{multiple-value-list} ++, ++@ref{multiple-value-bind} ++ ++@node multiple-value-list, multiple-value-prog1, multiple-value-call, Data and Control Flow Dictionary ++@subsection multiple-value-list [Macro] ++ ++@code{multiple-value-list} @i{form} @result{} @i{list} ++ ++@subsubheading Arguments and Values:: ++ ++@i{form}---a @i{form}; evaluated as described below. ++ ++@i{list}---a @i{list} of the @i{values} returned by @i{form}. ++ ++@subsubheading Description:: ++ ++@b{multiple-value-list} evaluates @i{form} ++and creates a @i{list} of the @i{multiple values}_2 it returns. ++ ++@subsubheading Examples:: ++ ++@example ++ (multiple-value-list (floor -3 4)) @result{} (-1 1) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{values-list} ++, ++@ref{multiple-value-call} ++ ++@subsubheading Notes:: ++ ++@b{multiple-value-list} and @b{values-list} are inverses ++of each other. ++ ++@example ++ (multiple-value-list form) @equiv{} (multiple-value-call #'list form) ++@end example ++ ++@node multiple-value-prog1, multiple-value-setq, multiple-value-list, Data and Control Flow Dictionary ++@subsection multiple-value-prog1 [Special Operator] ++ ++@code{multiple-value-prog} @i{1} @result{} @i{first-form @{@i{form}@}*} ++ ++ @r{first-form-results} ++ ++@subsubheading Arguments and Values:: ++ ++@i{first-form}---a @i{form}; evaluated as described below. ++ ++@i{form}---a @i{form}; evaluated as described below. ++ ++@i{first-form-results}---the @i{values} resulting from ++ the @i{evaluation} of @i{first-form}. ++ ++@subsubheading Description:: ++ ++@b{multiple-value-prog1} evaluates @i{first-form} and saves ++all the values produced by that @i{form}. It then evaluates each ++@i{form} from left to right, discarding their values. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq temp '(1 2 3)) @result{} (1 2 3) ++ (multiple-value-prog1 ++ (values-list temp) ++ (setq temp nil) ++ (values-list temp)) @result{} 1, 2, 3 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{prog1} ++ ++@node multiple-value-setq, values, multiple-value-prog1, Data and Control Flow Dictionary ++@subsection multiple-value-setq [Macro] ++ ++@code{multiple-value-setq} @i{vars form} @result{} @i{result} ++ ++@subsubheading Arguments and Values:: ++ ++@i{vars}---a @i{list} of @i{symbols} ++ that are either @i{variable} @i{names} ++ or @i{names} of @i{symbol macros}. ++ ++@i{form}---a @i{form}. ++ ++@i{result}---The @i{primary value} returned by the @i{form}. ++ ++@subsubheading Description:: ++ ++@b{multiple-value-setq} assigns values to @i{vars}. ++ ++The @i{form} is evaluated, ++and each @i{var} is @i{assigned} ++to the corresponding @i{value} returned by that @i{form}. ++If there are more @i{vars} than @i{values} returned, ++@b{nil} is @i{assigned} to the extra @i{vars}. ++If there are more @i{values} than @i{vars}, ++the extra @i{values} are discarded. ++ ++If any @i{var} is the @i{name} of a @i{symbol macro}, ++then it is @i{assigned} as if by @b{setf}. Specifically, ++ ++@example ++ (multiple-value-setq (@i{symbol}_1 ... @i{symbol}_n) @i{value-producing-form}) ++@end example ++ ++is defined to always behave in the same way as ++ ++@example ++ (values (setf (values @i{symbol}_1 ... @i{symbol}_n) @i{value-producing-form})) ++@end example ++ ++in order that the rules for order of evaluation and side-effects be consistent ++with those used by @b{setf}. ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++See @ref{VALUES Forms as Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (multiple-value-setq (quotient remainder) (truncate 3.2 2)) @result{} 1 ++ quotient @result{} 1 ++ remainder @result{} 1.2 ++ (multiple-value-setq (a b c) (values 1 2)) @result{} 1 ++ a @result{} 1 ++ b @result{} 2 ++ c @result{} NIL ++ (multiple-value-setq (a b) (values 4 5 6)) @result{} 4 ++ a @result{} 4 ++ b @result{} 5 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{setq} ++, ++@ref{symbol-macrolet} ++ ++@node values, values-list, multiple-value-setq, Data and Control Flow Dictionary ++@subsection values [Accessor] ++ ++@code{values} @i{@r{&rest} object} @result{} @i{@{@i{object}@}*} ++ ++(setf (@code{ values} @i{@r{&rest} place}) new-values)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{place}---a @i{place}. ++ ++@i{new-value}---an @i{object}. ++ ++@subsubheading Description:: ++ ++@b{values} ++returns the @i{objects} as @i{multiple values}_2. ++ ++@b{setf} of @b{values} is used to store the ++@i{multiple values}_2 @i{new-values} into the @i{places}. ++See @ref{VALUES Forms as Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (values) @result{} <@i{no @i{values}}> ++ (values 1) @result{} 1 ++ (values 1 2) @result{} 1, 2 ++ (values 1 2 3) @result{} 1, 2, 3 ++ (values (values 1 2 3) 4 5) @result{} 1, 4, 5 ++ (defun polar (x y) ++ (values (sqrt (+ (* x x) (* y y))) (atan y x))) @result{} POLAR ++ (multiple-value-bind (r theta) (polar 3.0 4.0) ++ (vector r theta)) ++@result{} #(5.0 0.927295) ++@end example ++ ++Sometimes it is desirable to indicate explicitly that a function returns ++exactly one value. For example, the function ++ ++@example ++ (defun foo (x y) ++ (floor (+ x y) y)) @result{} FOO ++@end example ++ ++returns two values because @b{floor} returns ++two values. It may be that the second value makes no sense, ++or that for efficiency reasons it is desired not to compute the ++second value. @b{values} is the standard idiom ++for indicating that only one value is to be returned: ++ ++@example ++ (defun foo (x y) ++ (values (floor (+ x y) y))) @result{} FOO ++@end example ++ ++This works because @b{values} ++returns exactly one value for each of ++@i{args}; as for any function call, ++if any of @i{args} produces more than one value, all but the ++first are discarded. ++ ++@subsubheading See Also:: ++ ++@ref{values-list} ++, ++@ref{multiple-value-bind} ++, ++@ref{multiple-values-limit} ++, ++@ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++Since @b{values} is a @i{function}, not a @i{macro} or @i{special form}, ++it receives as @i{arguments} only the @i{primary values} of ++its @i{argument} @i{forms}. ++ ++@node values-list, multiple-values-limit, values, Data and Control Flow Dictionary ++@subsection values-list [Function] ++ ++@code{values-list} @i{list} @result{} @i{@{@i{element}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{list}---a @i{list}. ++ ++@i{elements}---the @i{elements} of the @i{list}. ++ ++@subsubheading Description:: ++ ++Returns the @i{elements} of the @i{list} as @i{multiple values}_2. ++ ++@subsubheading Examples:: ++ ++@example ++ (values-list nil) @result{} <@i{no @i{values}}> ++ (values-list '(1)) @result{} 1 ++ (values-list '(1 2)) @result{} 1, 2 ++ (values-list '(1 2 3)) @result{} 1, 2, 3 ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++Should signal @b{type-error} if its argument is not a @i{proper list}. ++ ++@subsubheading See Also:: ++ ++@ref{multiple-value-bind} ++, ++@ref{multiple-value-list} ++, ++@ref{multiple-values-limit} ++, ++@ref{values} ++ ++@subsubheading Notes:: ++ ++@example ++ (values-list @i{list}) @equiv{} (apply #'values @i{list}) ++@end example ++ ++@t{(equal @i{x} (multiple-value-list (values-list @i{x})))} ++returns @i{true} for all @i{lists} @i{x}. ++ ++@node multiple-values-limit, nth-value, values-list, Data and Control Flow Dictionary ++@subsection multiple-values-limit [Constant Variable] ++ ++@subsubheading Constant Value:: ++ ++An @i{integer} not smaller than @t{20}, ++the exact magnitude of which is @i{implementation-dependent}. ++ ++@subsubheading Description:: ++ ++The upper exclusive bound on the number of @i{values} that may be ++ returned from a @i{function}, ++ ++ bound or assigned by @b{multiple-value-bind} or @b{multiple-value-setq}, ++ or passed as a first argument to @b{nth-value}. ++(If these individual limits might differ, the minimum value is used.) ++ ++@subsubheading See Also:: ++ ++@ref{lambda-parameters-limit} ++, ++@ref{call-arguments-limit} ++ ++@subsubheading Notes:: ++ ++Implementors are encouraged to make this limit as large as possible. ++ ++@node nth-value, prog, multiple-values-limit, Data and Control Flow Dictionary ++@subsection nth-value [Macro] ++ ++@code{nth-value} @i{n form} @result{} @i{object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{n}---a non-negative @i{integer}; evaluated. ++ ++@i{form}---a @i{form}; evaluated as described below. ++ ++@i{object}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Evaluates @i{n} and then @i{form}, ++returning as its only value the @i{n}th value @i{yielded} by @i{form}, ++or @b{nil} if @i{n} is greater than or equal to the number of @i{values} ++returned by @i{form}. (The first returned value is numbered @t{0}.) ++ ++@subsubheading Examples:: ++ ++@example ++ (nth-value 0 (values 'a 'b)) @result{} A ++ (nth-value 1 (values 'a 'b)) @result{} B ++ (nth-value 2 (values 'a 'b)) @result{} NIL ++ (let* ((x 83927472397238947423879243432432432) ++ (y 32423489732) ++ (a (nth-value 1 (floor x y))) ++ (b (mod x y))) ++ (values a b (= a b))) ++@result{} 3332987528, 3332987528, @i{true} ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{multiple-value-list} ++, ++@ref{nth} ++ ++@subsubheading Notes:: ++ ++Operationally, the following relationship is true, although @b{nth-value} ++might be more efficient in some @i{implementations} ++because, for example, some @i{consing} might be avoided. ++ ++@example ++ (nth-value @i{n} @i{form}) @equiv{} (nth @i{n} (multiple-value-list @i{form})) ++@end example ++ ++@node prog, prog1, nth-value, Data and Control Flow Dictionary ++@subsection prog, prog* [Macro] ++ ++@code{prog} @i{@r{(}@{@i{var} | ++ @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@r{)} ++ @{@i{declaration}@}* ++ @{@i{tag} | @i{statement}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@code{prog*} @i{@r{(}@{@i{var} | ++ @r{(}@i{var} @r{[}@i{init-form}@r{]}@r{)}@}*@r{)} ++ @{@i{declaration}@}* ++ @{@i{tag} | @i{statement}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---variable name. ++ ++@i{init-form}---a @i{form}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{tag}---a @i{go tag}; not evaluated. ++ ++@i{statement}---a @i{compound form}; evaluated as described below. ++ ++@i{results}---@b{nil} if a @i{normal return} occurs, ++ or else, if an @i{explicit return} occurs, the @i{values} that were transferred. ++ ++@subsubheading Description:: ++ ++Three distinct operations are performed by @b{prog} and ++@b{prog*}: ++they bind local variables, ++they permit use of the @b{return} ++statement, and they permit use of the @b{go} ++statement. ++A typical @b{prog} looks like this: ++ ++@example ++ (prog (var1 var2 (var3 init-form-3) var4 (var5 init-form-5)) ++ @{@i{declaration}@}* ++ statement1 ++ tag1 ++ statement2 ++ statement3 ++ statement4 ++ tag2 ++ statement5 ++ ... ++ ) ++@end example ++ ++For @b{prog}, ++@i{init-forms} are evaluated first, in the order in which they are ++supplied. The @i{vars} are then bound to the corresponding values in ++parallel. If no @i{init-form} ++is supplied for a given @i{var}, ++that @i{var} is bound to @b{nil}. ++ ++The body of @b{prog} is executed as if it were a @b{tagbody} @i{form}; ++the @b{go} statement can be used to transfer control ++to a @i{tag}. ++@i{Tags} label @i{statements}. ++ ++@b{prog} implicitly establishes a @b{block} named @b{nil} around ++the entire @b{prog} @i{form}, so that @b{return} can be used ++at any time to exit from the @b{prog} @i{form}. ++ ++The difference between @b{prog*} and @b{prog} is that ++in @b{prog*} the @i{binding} and initialization of the @i{vars} ++is done @i{sequentially}, so that the @i{init-form} for each ++one can use the values of previous ones. ++ ++@subsubheading Examples:: ++@example ++(prog* ((y z) (x (car y))) ++ (return x)) ++@end example ++ ++returns the @i{car} of the value of @t{z}. ++ ++@example ++ (setq a 1) @result{} 1 ++ (prog ((a 2) (b a)) (return (if (= a b) '= '/=))) @result{} /= ++ (prog* ((a 2) (b a)) (return (if (= a b) '= '/=))) @result{} = ++ (prog () 'no-return-value) @result{} NIL ++@end example ++ ++@example ++ (defun king-of-confusion (w) ++ "Take a cons of two lists and make a list of conses. ++ Think of this function as being like a zipper." ++ (prog (x y z) ;Initialize x, y, z to NIL ++ (setq y (car w) z (cdr w)) ++ loop ++ (cond ((null y) (return x)) ++ ((null z) (go err))) ++ rejoin ++ (setq x (cons (cons (car y) (car z)) x)) ++ (setq y (cdr y) z (cdr z)) ++ (go loop) ++ err ++ (cerror "Will self-pair extraneous items" ++ "Mismatch - gleep! ~S" y) ++ (setq z y) ++ (go rejoin))) @result{} KING-OF-CONFUSION ++@end example ++ ++This can be accomplished more perspicuously as follows: ++ ++@example ++ (defun prince-of-clarity (w) ++ "Take a cons of two lists and make a list of conses. ++ Think of this function as being like a zipper." ++ (do ((y (car w) (cdr y)) ++ (z (cdr w) (cdr z)) ++ (x '@t{()} (cons (cons (car y) (car z)) x))) ++ ((null y) x) ++ (when (null z) ++ (cerror "Will self-pair extraneous items" ++ "Mismatch - gleep! ~S" y) ++ (setq z y)))) @result{} PRINCE-OF-CLARITY ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{block} ++, ++@ref{let} ++, ++@ref{tagbody} ++, ++@ref{go} ++, ++@ref{return} ++, @ref{Evaluation} ++ ++@subsubheading Notes:: ++@b{prog} can be explained in terms of ++@b{block}, @b{let}, and @b{tagbody} as ++follows: ++ ++@example ++ (prog @i{variable-list} @i{declaration} . @i{body}) ++ @equiv{} (block nil (let @i{variable-list} @i{declaration} (tagbody . @i{body}))) ++@end example ++ ++@node prog1, progn, prog, Data and Control Flow Dictionary ++@subsection prog1, prog2 [Macro] ++ ++@code{prog} @i{1} @result{} @i{first-form @{@i{form}@}*} ++ @r{result-1} ++@code{prog} @i{2} @result{} @i{first-form second-form @{@i{form}@}*} ++ @r{result-2} ++ ++@subsubheading Arguments and Values:: ++ ++@i{first-form}---a @i{form}; evaluated as described below. ++ ++@i{second-form}---a @i{form}; evaluated as described below. ++ ++@i{forms}---an @i{implicit progn}; evaluated as described below. ++ ++@i{result-1}---the @i{primary value} resulting from ++ the @i{evaluation} of @i{first-form}. ++ ++@i{result-2}---the @i{primary value} resulting from ++ the @i{evaluation} of @i{second-form}. ++ ++@subsubheading Description:: ++ ++@b{prog1} @i{evaluates} @i{first-form} ++ and then @i{forms}, ++@i{yielding} as its only @i{value} ++the @i{primary value} @i{yielded} by @i{first-form}. ++ ++@b{prog2} @i{evaluates} @i{first-form}, ++ then @i{second-form}, ++ and then @i{forms}, ++@i{yielding} as its only @i{value} ++the @i{primary value} @i{yielded} by @i{first-form}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq temp 1) @result{} 1 ++ (prog1 temp (print temp) (incf temp) (print temp)) ++@t{ |> } 1 ++@t{ |> } 2 ++@result{} 1 ++ (prog1 temp (setq temp nil)) @result{} 2 ++ temp @result{} NIL ++ (prog1 (values 1 2 3) 4) @result{} 1 ++ (setq temp (list 'a 'b 'c)) ++ (prog1 (car temp) (setf (car temp) 'alpha)) @result{} A ++ temp @result{} (ALPHA B C) ++ (flet ((swap-symbol-values (x y) ++ (setf (symbol-value x) ++ (prog1 (symbol-value y) ++ (setf (symbol-value y) (symbol-value x)))))) ++ (let ((*foo* 1) (*bar* 2)) ++ (declare (special *foo* *bar*)) ++ (swap-symbol-values '*foo* '*bar*) ++ (values *foo* *bar*))) ++@result{} 2, 1 ++ (setq temp 1) @result{} 1 ++ (prog2 (incf temp) (incf temp) (incf temp)) @result{} 3 ++ temp @result{} 4 ++ (prog2 1 (values 2 3 4) 5) @result{} 2 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{multiple-value-prog1} ++, ++@ref{progn} ++ ++@subsubheading Notes:: ++ ++@b{prog1} and @b{prog2} are typically used to @i{evaluate} ++one or more @i{forms} with side effects and return a @i{value} that ++must be computed before some or all of the side effects happen. ++ ++@example ++ (prog1 @{@i{form}@}*) @equiv{} (values (multiple-value-prog1 @{@i{form}@}*)) ++ (prog2 @i{form1} @{@i{form}@}*) @equiv{} (let () @i{form1} (prog1 @{@i{form}@}*)) ++@end example ++ ++@node progn, define-modify-macro, prog1, Data and Control Flow Dictionary ++@subsection progn [Special Operator] ++ ++@code{progn} @i{@{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} of the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{progn} evaluates @i{forms}, ++in the order in which they are given. ++ ++The values of each @i{form} but the last are discarded. ++ ++If @b{progn} appears as a @i{top level form}, then all @i{forms} ++within that @b{progn} are considered by the compiler to be ++@i{top level forms}. ++ ++@subsubheading Examples:: ++@example ++ (progn) @result{} NIL ++ (progn 1 2 3) @result{} 3 ++ (progn (values 1 2 3)) @result{} 1, 2, 3 ++ (setq a 1) @result{} 1 ++ (if a ++ (progn (setq a nil) 'here) ++ (progn (setq a t) 'there)) @result{} HERE ++ a @result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{prog1} ++, @b{prog2}, @ref{Evaluation} ++ ++@subsubheading Notes:: ++ ++Many places in @r{Common Lisp} involve syntax that uses @i{implicit progns}. ++That is, part of their syntax allows many @i{forms} to be written ++that are to be evaluated sequentially, discarding the results ++of all @i{forms} but the last and returning the results of the last @i{form}. ++Such places include, but are not limited to, the following: ++ the body of a @i{lambda expression}; ++ the bodies of various control and conditional @i{forms} ++ (@i{e.g.}, @b{case}, @b{catch}, @b{progn}, and @b{when}). ++ ++@node define-modify-macro, defsetf, progn, Data and Control Flow Dictionary ++@subsection define-modify-macro [Macro] ++ ++@code{define-modify-macro} @i{name lambda-list function @r{[}documentation@r{]}} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{lambda-list}---a @i{define-modify-macro lambda list} ++ ++@i{function}---a @i{symbol}. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@subsubheading Description:: ++ ++@b{define-modify-macro} defines a @i{macro} named ++@i{name} to @i{read} and @i{write} a @i{place}. ++ ++The arguments to the new @i{macro} are a @i{place}, ++followed ++by the arguments that are supplied in @i{lambda-list}. ++ ++@i{Macros} defined with @b{define-modify-macro} ++correctly pass the @i{environment parameter} to ++ ++@b{get-setf-expansion}. ++ ++When the @i{macro} is invoked, @i{function} ++is applied to the old contents of the @i{place} ++and the @i{lambda-list} arguments to obtain the new value, ++and the @i{place} is updated to contain the result. ++ ++Except for the issue of avoiding multiple evaluation (see below), the expansion ++of a @b{define-modify-macro} is equivalent to the following: ++ ++@example ++ (defmacro @i{name} (reference . @i{lambda-list}) ++ @i{documentation} ++ `(setf ,reference ++ (@i{function} ,reference ,@i{arg1} ,@i{arg2} ...))) ++@end example ++ ++where @i{arg1}, @i{arg2}, ..., ++are the parameters appearing in @i{lambda-list}; ++appropriate provision is made for a @i{rest parameter}. ++ ++The @i{subforms} of the macro calls defined by @b{define-modify-macro} ++are evaluated as specified in @ref{Evaluation of Subforms to Places}. ++ ++@i{Documentation} is attached as a @i{documentation string} ++ to @i{name} (as kind @b{function}) ++and to the @i{macro function}. ++ ++If a @b{define-modify-macro} @i{form} appears as a @i{top level form}, ++the @i{compiler} must store the @i{macro} definition at compile time, ++so that occurrences of the macro later on in the file can be expanded correctly. ++ ++@subsubheading Examples:: ++@example ++ (define-modify-macro appendf (&rest args) ++ append "Append onto list") @result{} APPENDF ++ (setq x '(a b c) y x) @result{} (A B C) ++ (appendf x '(d e f) '(1 2 3)) @result{} (A B C D E F 1 2 3) ++ x @result{} (A B C D E F 1 2 3) ++ y @result{} (A B C) ++ (define-modify-macro new-incf (&optional (delta 1)) +) ++ (define-modify-macro unionf (other-set &rest keywords) union) ++@end example ++ ++@subsubheading Side Effects:: ++ ++A macro definition is assigned to @i{name}. ++ ++@subsubheading See Also:: ++ ++@ref{defsetf} ++, ++ ++@ref{define-setf-expander} ++, ++ ++@ref{documentation} ++, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@node defsetf, define-setf-expander, define-modify-macro, Data and Control Flow Dictionary ++@subsection defsetf [Macro] ++ ++The ``short form'': ++ ++@code{defsetf} @i{access-fn update-fn @r{[}documentation@r{]}}@* ++ @result{} @i{access-fn} ++ ++The ``long form'': ++ ++@code{defsetf} @i{access-fn lambda-list @r{(}@{@i{store-variable}@}*@r{)} ++ @r{[[@{@i{declaration}@}* | @i{documentation}]]} @{@i{form}@}*}@* ++ @result{} @i{access-fn} ++ ++@subsubheading Arguments and Values:: ++ ++@i{access-fn}---a @i{symbol} which names a @i{function} or a @i{macro}. ++ ++@i{update-fn}---a @i{symbol} naming a @i{function} or @i{macro}. ++ ++@i{lambda-list}---a @i{defsetf lambda list}. ++ ++@i{store-variable}---a @i{symbol} (a @i{variable} @i{name}). ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++@b{defsetf} defines how to ++@b{setf} a @i{place} ++of the form @t{(@i{access-fn} ...)} for relatively simple cases. ++(See @b{define-setf-expander} for more general access to this facility.) ++ ++It must be the case that the @i{function} or @i{macro} named by @i{access-fn} ++evaluates all of its arguments. ++ ++@b{defsetf} may take one of two forms, called the ``short form'' and the ``long form,'' ++which are distinguished by the @i{type} of the second @i{argument}. ++ ++When the short form is used, ++@i{update-fn} must name ++a @i{function} (or @i{macro}) that takes one more argument ++than @i{access-fn} takes. When @b{setf} is given a @i{place} ++that is a call on @i{access-fn}, it expands into ++a call on @i{update-fn} that is given all the arguments to ++@i{access-fn} and also, as its last argument, the new value ++(which must be returned by @i{update-fn} as its value). ++ ++The long form @b{defsetf} ++resembles @b{defmacro}. ++The @i{lambda-list} describes the arguments of @i{access-fn}. ++The @i{store-variables} describe the ++value ++ ++or values ++ ++to be stored into the @i{place}. ++The @i{body} must ++compute the expansion of a @b{setf} of a call on @i{access-fn}. ++ ++The expansion function is defined in the same @i{lexical environment} ++in which the @b{defsetf} @i{form} appears. ++ ++During the evaluation of the ++@i{forms}, the variables in the @i{lambda-list} and the ++@i{store-variables} ++are bound to names of temporary variables, ++generated as if by @b{gensym} ++or @b{gentemp}, ++that will be bound by the ++expansion of @b{setf} ++to the values of those @i{subforms}. This binding ++permits the ++@i{forms} to be written without regard for order-of-evaluation ++issues. @b{defsetf} arranges for the temporary variables to be ++optimized out of the final result in cases where that is possible. ++ ++The body code in @b{defsetf} is implicitly enclosed in a ++@i{block} whose name is ++@i{access-fn} ++ ++@b{defsetf} ++ensures that @i{subforms} ++of the @i{place} are evaluated exactly once. ++ ++@i{Documentation} is attached to @i{access-fn} as a @i{documentation string} ++of kind @b{setf}. ++ ++If a @b{defsetf} @i{form} appears as a @i{top level form}, ++the @i{compiler} must make the @i{setf expander} available so that ++it may be used to expand calls to @b{setf} later on in the @i{file}. ++Users must ensure that the @i{forms}, if any, can be evaluated ++at compile time if the @i{access-fn} is used in a @i{place} ++later in the same @i{file}. ++The @i{compiler} must make these @i{setf expanders} available to ++compile-time calls to @b{get-setf-expansion} when its @i{environment} ++argument is a value received as the @i{environment parameter} of a @i{macro}. ++ ++@subsubheading Examples:: ++The effect of ++ ++@example ++ (defsetf symbol-value set) ++@end example ++ ++is built into the @r{Common Lisp} system. ++This causes the form @t{(setf (symbol-value foo) fu)} ++to expand into @t{(set foo fu)}. ++ ++Note that ++ ++@example ++ (defsetf car rplaca) ++@end example ++ ++would be incorrect because @b{rplaca} does not return its last argument. ++ ++@example ++ (defun middleguy (x) (nth (truncate (1- (list-length x)) 2) x)) @result{} MIDDLEGUY ++ (defun set-middleguy (x v) ++ (unless (null x) ++ (rplaca (nthcdr (truncate (1- (list-length x)) 2) x) v)) ++ v) @result{} SET-MIDDLEGUY ++ (defsetf middleguy set-middleguy) @result{} MIDDLEGUY ++ (setq a (list 'a 'b 'c 'd) ++ b (list 'x) ++ c (list 1 2 3 (list 4 5 6) 7 8 9)) @result{} (1 2 3 (4 5 6) 7 8 9) ++ (setf (middleguy a) 3) @result{} 3 ++ (setf (middleguy b) 7) @result{} 7 ++ (setf (middleguy (middleguy c)) 'middleguy-symbol) @result{} MIDDLEGUY-SYMBOL ++ a @result{} (A 3 C D) ++ b @result{} (7) ++ c @result{} (1 2 3 (4 MIDDLEGUY-SYMBOL 6) 7 8 9) ++@end example ++ ++An example of the use of the long form of @b{defsetf}: ++ ++@example ++ (defsetf subseq (sequence start &optional end) (new-sequence) ++ `(progn (replace ,sequence ,new-sequence ++ :start1 ,start :end1 ,end) ++ ,new-sequence)) @result{} SUBSEQ ++@end example ++ ++@example ++ (defvar *xy* (make-array '(10 10))) ++ (defun xy (&key ((x x) 0) ((y y) 0)) (aref *xy* x y)) @result{} XY ++ (defun set-xy (new-value &key ((x x) 0) ((y y) 0)) ++ (setf (aref *xy* x y) new-value)) @result{} SET-XY ++ (defsetf xy (&key ((x x) 0) ((y y) 0)) (store) ++ `(set-xy ,store 'x ,x 'y ,y)) @result{} XY ++ (get-setf-expansion '(xy a b)) ++@result{} (#:t0 #:t1), ++ (a b), ++ (#:store), ++ ((lambda (&key ((x #:x)) ((y #:y))) ++ (set-xy #:store 'x #:x 'y #:y)) ++ #:t0 #:t1), ++ (xy #:t0 #:t1) ++ (xy 'x 1) @result{} NIL ++ (setf (xy 'x 1) 1) @result{} 1 ++ (xy 'x 1) @result{} 1 ++ (let ((a 'x) (b 'y)) ++ (setf (xy a 1 b 2) 3) ++ (setf (xy b 5 a 9) 14)) ++@result{} 14 ++ (xy 'y 0 'x 1) @result{} 1 ++ (xy 'x 1 'y 2) @result{} 3 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{documentation} ++, ++@ref{setf} ++, ++ ++@ref{define-setf-expander} ++, ++@ref{get-setf-expansion} ++, ++ ++@ref{Generalized Reference}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++ ++@i{forms} must include provision ++for returning the correct value (the value ++ ++or values ++ ++of @i{store-variable}). ++This is ++handled by @i{forms} rather than by @b{defsetf} because ++in many cases this value can be returned at no extra cost, by calling a ++function that simultaneously stores into the @i{place} and ++returns the correct value. ++ ++A @b{setf} of a call on @i{access-fn} also evaluates ++all of @i{access-fn}'s arguments; it cannot treat any of them specially. ++This means that @b{defsetf} ++cannot be used to describe how to store into ++a @i{generalized reference} to a byte, such as @t{(ldb field reference)}. ++ ++@b{define-setf-expander} ++ ++is used to handle situations that ++do not fit the restrictions imposed by @b{defsetf} ++and gives the user additional control. ++ ++@node define-setf-expander, get-setf-expansion, defsetf, Data and Control Flow Dictionary ++@subsection define-setf-expander [Macro] ++ ++@code{define-setf-expander} @i{access-fn lambda-list ++ @r{[[@{@i{declaration}@}* | @i{documentation}]]} @{@i{form}@}*}@* ++ @result{} @i{access-fn} ++ ++@subsubheading Arguments and Values:: ++ ++@i{access-fn}---a @i{symbol} that @i{names} a @i{function} or @i{macro}. ++ ++@i{lambda-list} -- @i{macro lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@subsubheading Description:: ++ ++@b{define-setf-expander} specifies the means by which @b{setf} ++updates a @i{place} that is referenced by @i{access-fn}. ++ ++When @b{setf} is given a @i{place} that is ++specified in terms of @i{access-fn} and a new value for the ++@i{place}, it is expanded into a form that performs ++the appropriate update. ++ ++The @i{lambda-list} supports destructuring. ++See @ref{Macro Lambda Lists}. ++ ++@i{Documentation} is attached to @i{access-fn} as a @i{documentation string} ++of kind @b{setf}. ++ ++@i{Forms} constitute the body of the ++ ++@i{setf expander} ++ ++definition and must compute the @i{setf expansion} for a call on @b{setf} ++that references the @i{place} by means of the given ++@i{access-fn}. ++ ++The @i{setf expander} function is defined in the same @i{lexical environment} ++in which the @b{define-setf-expander} @i{form} appears. ++ ++While @i{forms} are being executed, ++the variables in @i{lambda-list} are bound to parts of the @i{place} @i{form}. ++ ++The body @i{forms} (but not the @i{lambda-list}) ++ ++in a @b{define-setf-expander} @i{form} are implicitly enclosed in a ++@i{block} whose name is ++@i{access-fn}. ++ ++The evaluation of @i{forms} must result in the five values ++described in @ref{Setf Expansions}. ++ ++If a @b{define-setf-expander} @i{form} appears as a @i{top level form}, ++the @i{compiler} must make the @i{setf expander} available so that ++it may be used to expand calls to @b{setf} later on in the @i{file}. ++@i{Programmers} must ensure that the @i{forms} can be evaluated ++at compile time if the @i{access-fn} is used in a @i{place} ++later in the same @i{file}. ++The @i{compiler} must make these @i{setf expanders} available to ++compile-time calls to @b{get-setf-expansion} when its @i{environment} ++argument is a value received as the @i{environment parameter} of a @i{macro}. ++ ++@subsubheading Examples:: ++@example ++ (defun lastguy (x) (car (last x))) @result{} LASTGUY ++ (define-setf-expander lastguy (x &environment env) ++ "Set the last element in a list to the given value." ++ (multiple-value-bind (dummies vals newval setter getter) ++ (get-setf-expansion x env) ++ (let ((store (gensym))) ++ (values dummies ++ vals ++ `(,store) ++ `(progn (rplaca (last ,getter) ,store) ,store) ++ `(lastguy ,getter))))) @result{} LASTGUY ++ (setq a (list 'a 'b 'c 'd) ++ b (list 'x) ++ c (list 1 2 3 (list 4 5 6))) @result{} (1 2 3 (4 5 6)) ++ (setf (lastguy a) 3) @result{} 3 ++ (setf (lastguy b) 7) @result{} 7 ++ (setf (lastguy (lastguy c)) 'lastguy-symbol) @result{} LASTGUY-SYMBOL ++ a @result{} (A B C 3) ++ b @result{} (7) ++ c @result{} (1 2 3 (4 5 LASTGUY-SYMBOL)) ++@end example ++ ++@example ++;;; Setf expander for the form (LDB bytespec int). ++;;; Recall that the int form must itself be suitable for SETF. ++ (define-setf-expander ldb (bytespec int &environment env) ++ (multiple-value-bind (temps vals stores ++ store-form access-form) ++ (get-setf-expansion int env);Get setf expansion for int. ++ (let ((btemp (gensym)) ;Temp var for byte specifier. ++ (store (gensym)) ;Temp var for byte to store. ++ (stemp (first stores))) ;Temp var for int to store. ++ (if (cdr stores) (error "Can't expand this.")) ++;;; Return the setf expansion for LDB as five values. ++ (values (cons btemp temps) ;Temporary variables. ++ (cons bytespec vals) ;Value forms. ++ (list store) ;Store variables. ++ `(let ((,stemp (dpb ,store ,btemp ,access-form))) ++ ,store-form ++ ,store) ;Storing form. ++ `(ldb ,btemp ,access-form) ;Accessing form. ++ )))) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{setf} ++, ++@ref{defsetf} ++, ++@ref{documentation} ++, ++@ref{get-setf-expansion} ++, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++ ++@b{define-setf-expander} differs from the long form of @b{defsetf} ++in that while the body is being executed the @i{variables} ++in @i{lambda-list} are bound to parts of the @i{place} @i{form}, ++not to temporary variables that will be bound to the values of such parts. ++In addition, @b{define-setf-expander} does not have @b{defsetf}'s ++restriction that @i{access-fn} must be a @i{function} ++or a function-like @i{macro}; an arbitrary @b{defmacro} destructuring ++pattern is permitted in @i{lambda-list}. ++ ++@node get-setf-expansion, setf, define-setf-expander, Data and Control Flow Dictionary ++@subsection get-setf-expansion [Function] ++ ++@code{get-setf-expansion} @i{place @r{&optional} environment}@* ++ @result{} @i{vars, vals, store-vars, writer-form, reader-form} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@i{environment}---an @i{environment} @i{object}. ++ ++@i{vars, vals, store-vars, writer-form, reader-form}---a @i{setf expansion}. ++ ++@subsubheading Description:: ++ ++Determines ++five values constituting the @i{setf expansion} for @i{place} ++in @i{environment}; see @ref{Setf Expansions}. ++ ++If @i{environment} is not supplied or @b{nil}, ++the environment is the @i{null lexical environment}. ++ ++@subsubheading Examples:: ++ ++@example ++ (get-setf-expansion 'x) ++@result{} NIL, NIL, (#:G0001), (SETQ X #:G0001), X ++@end example ++ ++@example ++;;; This macro is like POP ++ ++ (defmacro xpop (place &environment env) ++ (multiple-value-bind (dummies vals new setter getter) ++ (get-setf-expansion place env) ++ `(let* (,@@(mapcar #'list dummies vals) (,(car new) ,getter)) ++ (if (cdr new) (error "Can't expand this.")) ++ (prog1 (car ,(car new)) ++ (setq ,(car new) (cdr ,(car new))) ++ ,setter)))) ++ ++ (defsetf frob (x) (value) ++ `(setf (car ,x) ,value)) @result{} FROB ++;;; The following is an error; an error might be signaled at macro expansion time ++ (flet ((frob (x) (cdr x))) ;Invalid ++ (xpop (frob z))) ++ ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{defsetf} ++, ++@ref{define-setf-expander} ++, ++@ref{setf} ++ ++@subsubheading Notes:: ++ ++Any @i{compound form} is a valid @i{place}, ++since any @i{compound form} whose @i{operator} @i{f} has no @i{setf expander} ++are expanded into a call to @t{(setf @i{f})}. ++ ++@node setf, shiftf, get-setf-expansion, Data and Control Flow Dictionary ++@subsection setf, psetf [Macro] ++ ++@code{setf} @i{@{!@i{pair}@}*} @result{} @i{@{@i{result}@}*} ++ ++@code{psetf} @i{@{!@i{pair}@}*} @result{} @i{@b{nil}} ++ ++@w{@i{pair} ::=place newvalue} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@i{newvalue}---a @i{form}. ++ ++@i{results}---the @i{multiple values}_2 ++ returned by the storing form for the last @i{place}, ++ or @b{nil} if there are no @i{pairs}. ++ ++@subsubheading Description:: ++ ++@b{setf} changes the @i{value} of @i{place} to be @i{newvalue}. ++ ++@t{(setf place newvalue)} ++expands into an update form that stores the ++result ++of evaluating ++@i{newvalue} into the location referred to by @i{place}. ++ Some @i{place} forms ++involve uses of accessors that take optional arguments. ++ Whether those optional arguments are permitted by ++@b{setf}, or what their use ++ is, is up to the ++@b{setf} expander function and is not under the control ++ of @b{setf}. ++The documentation for any @i{function} ++that accepts @b{&optional}, @b{&rest}, ++ or @t{&key} arguments and that ++claims to be usable with @b{setf} must specify ++ how those arguments are treated. ++ ++If more than one @i{pair} is supplied, ++the @i{pairs} are processed sequentially; that is, ++ ++@example ++ (setf place-1 newvalue-1 ++ place-2 newvalue-2 ++ ... ++ place-N newvalue-N) ++@end example ++ ++is precisely equivalent to ++ ++@example ++ (progn (setf place-1 newvalue-1) ++ (setf place-2 newvalue-2) ++ ... ++ (setf place-N newvalue-N)) ++@end example ++ ++For @b{psetf}, ++if more than one @i{pair} is supplied then the assignments of new values to places are ++done in parallel. More precisely, all @i{subforms} (in both the @i{place} ++and @i{newvalue} @i{forms}) that are to be evaluated ++are evaluated from left to right; after all evaluations have been performed, ++all of the assignments are performed in an unpredictable order. ++ ++For detailed treatment of the expansion of @b{setf} and @b{psetf}, ++see @ref{Kinds of Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq x (cons 'a 'b) y (list 1 2 3)) @result{} (1 2 3) ++ (setf (car x) 'x (cadr y) (car x) (cdr x) y) @result{} (1 X 3) ++ x @result{} (X 1 X 3) ++ y @result{} (1 X 3) ++ (setq x (cons 'a 'b) y (list 1 2 3)) @result{} (1 2 3) ++ (psetf (car x) 'x (cadr y) (car x) (cdr x) y) @result{} NIL ++ x @result{} (X 1 A 3) ++ y @result{} (1 A 3) ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{define-setf-expander}, ++@b{defsetf}, ++@b{*macroexpand-hook*} ++ ++@subsubheading See Also:: ++ ++@ref{define-setf-expander} ++, ++@ref{defsetf} ++, ++@b{macroexpand-1}, ++@ref{rotatef} ++, ++@ref{shiftf} ++, ++@ref{Generalized Reference} ++ ++@node shiftf, rotatef, setf, Data and Control Flow Dictionary ++@subsection shiftf [Macro] ++ ++@code{shiftf} @i{@{@i{place}@}^+ newvalue} @result{} @i{old-value-1} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@i{newvalue}---a @i{form}; evaluated. ++ ++@i{old-value-1}---an @i{object} (the old @i{value} of the first @i{place}). ++ ++@subsubheading Description:: ++ ++@b{shiftf} modifies the values of each ++@i{place} by storing @i{newvalue} ++into the last @i{place}, and shifting the ++values of the second through the last @i{place} ++into the remaining @i{places}. ++ ++If @i{newvalue} produces more values than there ++are store variables, the extra values are ignored. If @i{newvalue} ++produces fewer values than there are store variables, the missing values ++are set to @b{nil}. ++ ++In the form @t{(shiftf @i{place1} @i{place2} ... @i{placen} @i{newvalue})}, ++the values in @i{place1} through @i{placen} are @i{read} and saved, ++and @i{newvalue} is evaluated, for a total of @t{n}+1 values in all. ++Values 2 through @t{n}+1 are then stored into @i{place1} through @i{placen}, respectively. ++It is as if all the @i{places} form a shift register; the @i{newvalue} ++is shifted in from the right, all values shift over to the left one place, ++and the value shifted out of @i{place1} is returned. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{places}, ++see @ref{Evaluation of Subforms to Places}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq x (list 1 2 3) y 'trash) @result{} TRASH ++ (shiftf y x (cdr x) '(hi there)) @result{} TRASH ++ x @result{} (2 3) ++ y @result{} (1 HI THERE) ++ ++ (setq x (list 'a 'b 'c)) @result{} (A B C) ++ (shiftf (cadr x) 'z) @result{} B ++ x @result{} (A Z C) ++ (shiftf (cadr x) (cddr x) 'q) @result{} Z ++ x @result{} (A (C) . Q) ++ (setq n 0) @result{} 0 ++ (setq x (list 'a 'b 'c 'd)) @result{} (A B C D) ++ (shiftf (nth (setq n (+ n 1)) x) 'z) @result{} B ++ x @result{} (A Z C D) ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{define-setf-expander}, ++@b{defsetf}, ++@b{*macroexpand-hook*} ++ ++@subsubheading See Also:: ++ ++@ref{setf} ++, ++@ref{rotatef} ++, @ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++The effect of ++ @t{(shiftf @i{place1} @i{place2} ... @i{placen} @i{newvalue})} ++is roughly equivalent to ++ ++@example ++ (let ((var1 @i{place1}) ++ (var2 @i{place2}) ++ ... ++ (varn @i{placen}) ++ (var0 @i{newvalue})) ++ (setf @i{place1} var2) ++ (setf @i{place2} var3) ++ ... ++ (setf @i{placen} var0) ++ var1) ++@end example ++ ++except that the latter would evaluate any @i{subforms} ++of each @t{place} twice, whereas @b{shiftf} evaluates them once. ++For example, ++ ++@example ++ (setq n 0) @result{} 0 ++ (setq x (list 'a 'b 'c 'd)) @result{} (A B C D) ++ (prog1 (nth (setq n (+ n 1)) x) ++ (setf (nth (setq n (+ n 1)) x) 'z)) @result{} B ++ x @result{} (A B Z D) ++@end example ++ ++@node rotatef, control-error, shiftf, Data and Control Flow Dictionary ++@subsection rotatef [Macro] ++ ++@code{rotatef} @i{@{@i{place}@}*} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@subsubheading Description:: ++ ++@b{rotatef} modifies the values of each @i{place} by ++rotating values from one @i{place} into another. ++ ++If a @i{place} produces more values than there ++are store variables, the extra values are ignored. If a @i{place} ++produces fewer values than there are store variables, the missing values ++are set to @b{nil}. ++ ++In the form @t{(rotatef @i{place1} @i{place2} ... @i{placen})}, ++the values in @i{place1} through @i{placen} are @i{read} and @i{written}. ++Values 2 through @i{n} ++and value 1 are then stored into @i{place1} through @i{placen}. ++It is as if all the places form an end-around shift register ++that is rotated one place to the left, with the value of @i{place1} ++being shifted around the end to @i{placen}. ++ ++For information about the @i{evaluation} of @i{subforms} of @i{places}, ++see @ref{Evaluation of Subforms to Places}. ++ ++@subsubheading Examples:: ++@example ++ (let ((n 0) ++ (x (list 'a 'b 'c 'd 'e 'f 'g))) ++ (rotatef (nth (incf n) x) ++ (nth (incf n) x) ++ (nth (incf n) x)) ++ x) @result{} (A C D B E F G) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{define-setf-expander} ++, ++@ref{defsetf} ++, ++@ref{setf} ++, ++@ref{shiftf} ++, ++@b{*macroexpand-hook*}, ++@ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++The effect of ++ @t{(rotatef @i{place1} @i{place2} ... @i{placen})} ++is roughly equivalent to ++ ++@example ++ (psetf @i{place1} @i{place2} ++ @i{place2} @i{place3} ++ ... ++ @i{placen} @i{place1}) ++@end example ++ ++except that the latter would evaluate any @i{subforms} ++of each @t{place} twice, whereas @b{rotatef} evaluates them once. ++ ++@node control-error, program-error, rotatef, Data and Control Flow Dictionary ++@subsection control-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{control-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{control-error} consists of error conditions that result from ++invalid dynamic transfers of control in a program. The errors that ++result from giving @b{throw} a tag that is not active or from ++giving @b{go} or @b{return-from} a tag that is no longer ++dynamically available are of @i{type} @b{control-error}. ++ ++@node program-error, undefined-function, control-error, Data and Control Flow Dictionary ++@subsection program-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{program-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{program-error} ++consists of error conditions related to incorrect program syntax. The ++errors that result from naming a @i{go tag} or a @i{block tag} ++that is not lexically apparent are of @i{type} @b{program-error}. ++ ++@node undefined-function, , program-error, Data and Control Flow Dictionary ++@subsection undefined-function [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{undefined-function}, ++@b{cell-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{undefined-function} consists of @i{error} @i{conditions} ++that represent attempts to @i{read} the definition of an @i{undefined function}. ++ ++The name of the cell (see @b{cell-error}) is the @i{function name} ++which was @i{funbound}. ++ ++@subsubheading See Also:: ++ ++@ref{cell-error-name} ++ ++@c end of including dict-flow ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-6.texi +@@ -0,0 +1,2866 @@ ++ ++ ++@node Iteration, Objects, Data and Control Flow, Top ++@chapter Iteration ++ ++@menu ++* The LOOP Facility:: ++* Iteration Dictionary:: ++@end menu ++ ++@node The LOOP Facility, Iteration Dictionary, Iteration, Iteration ++@section The LOOP Facility ++ ++@c including concept-loop ++ ++@menu ++* Overview of the Loop Facility:: ++* Variable Initialization and Stepping Clauses:: ++* Value Accumulation Clauses:: ++* Termination Test Clauses:: ++* Unconditional Execution Clauses:: ++* Conditional Execution Clauses:: ++* Miscellaneous Clauses:: ++* Examples of Miscellaneous Loop Features:: ++* Notes about Loop:: ++@end menu ++ ++@node Overview of the Loop Facility, Variable Initialization and Stepping Clauses, The LOOP Facility, The LOOP Facility ++@subsection Overview of the Loop Facility ++ ++The @b{loop} @i{macro} performs iteration. ++ ++@menu ++* Simple vs Extended Loop:: ++* Simple Loop:: ++* Extended Loop:: ++* Loop Keywords:: ++* Parsing Loop Clauses:: ++* Expanding Loop Forms:: ++* Summary of Loop Clauses:: ++* Summary of Variable Initialization and Stepping Clauses:: ++* Summary of Value Accumulation Clauses:: ++* Summary of Termination Test Clauses:: ++* Summary of Unconditional Execution Clauses:: ++* Summary of Conditional Execution Clauses:: ++* Summary of Miscellaneous Clauses:: ++* Order of Execution:: ++* Destructuring:: ++* Restrictions on Side-Effects:: ++@end menu ++ ++@node Simple vs Extended Loop, Simple Loop, Overview of the Loop Facility, Overview of the Loop Facility ++@subsubsection Simple vs Extended Loop ++ ++@b{loop} @i{forms} are partitioned into two categories: ++ simple @b{loop} @i{forms} ++ and extended @b{loop} @i{forms}. ++ ++@node Simple Loop, Extended Loop, Simple vs Extended Loop, Overview of the Loop Facility ++@subsubsection Simple Loop ++ ++A simple @b{loop} @i{form} is one that has a body containing ++only @i{compound forms}. ++Each @i{form} is @i{evaluated} in turn from left to right. ++When the last @i{form} has been @i{evaluated}, ++then the first @i{form} is evaluated again, and so on, in a never-ending cycle. ++A simple @b{loop} @i{form} establishes an @i{implicit block} named @b{nil}. ++The execution of a simple @b{loop} can be terminated by explicitly ++transfering control to the @i{implicit block} (using @b{return} or ++@b{return-from}) or to some @i{exit point} outside of the @i{block} ++(@i{e.g.}, using @b{throw}, @b{go}, or @b{return-from}). ++ ++@node Extended Loop, Loop Keywords, Simple Loop, Overview of the Loop Facility ++@subsubsection Extended Loop ++ ++An extended @b{loop} @i{form} is one that has a body containing ++@i{atomic} @i{expressions}. When the @b{loop} @i{macro} processes such a ++@i{form}, it invokes a facility that is commonly called ``the Loop Facility.'' ++ ++The Loop Facility provides standardized access to mechanisms commonly used ++in iterations through Loop schemas, which are introduced by @i{loop keywords}. ++ ++The body of an extended @b{loop} @i{form} is divided into @b{loop} clauses, ++each which is in turn made up of @i{loop keywords} and @i{forms}. ++ ++@node Loop Keywords, Parsing Loop Clauses, Extended Loop, Overview of the Loop Facility ++@subsubsection Loop Keywords ++ ++@i{Loop keywords} are not true @i{keywords}_1; ++they are special @i{symbols}, recognized by @i{name} rather than @i{object} identity, ++that are meaningful only to the @b{loop} facility. ++A @i{loop keyword} is a @i{symbol} but is recognized by its @i{name} ++(not its identity), regardless of the @i{packages} in which it is @i{accessible}. ++ ++In general, @i{loop keywords} are not @i{external symbols} of the @t{COMMON-LISP} @i{package}, ++except in the coincidental situation that a @i{symbol} with the same name as a ++@i{loop keyword} was needed for some other purpose in @r{Common Lisp}. For example, ++there is a @i{symbol} in the @t{COMMON-LISP} @i{package} whose @i{name} is @t{"UNLESS"} but ++not one whose @i{name} is @t{"UNTIL"}. ++ ++If no @i{loop keywords} are supplied in a @b{loop} @i{form}, ++the Loop Facility executes the loop body repeatedly; see @ref{Simple Loop}. ++ ++@node Parsing Loop Clauses, Expanding Loop Forms, Loop Keywords, Overview of the Loop Facility ++@subsubsection Parsing Loop Clauses ++ ++The syntactic parts of an extended @b{loop} @i{form} are called clauses; ++the rules for parsing are determined by ++that clause's keyword. ++The following example shows a @b{loop} @i{form} with six clauses: ++ ++@example ++ (loop for i from 1 to (compute-top-value) ; first clause ++ while (not (unacceptable i)) ; second clause ++ collect (square i) ; third clause ++ do (format t "Working on ~D now" i) ; fourth clause ++ when (evenp i) ; fifth clause ++ do (format t "~D is a non-odd number" i) ++ finally (format t "About to exit!")) ; sixth clause ++@end example ++ ++Each @i{loop keyword} introduces ++either a compound loop clause or a simple loop clause ++that can consist of a @i{loop keyword} followed by a single @i{form}. ++The number of @i{forms} in a clause is determined by the @i{loop keyword} ++that begins the clause and by the auxiliary keywords in the clause. ++The keywords @t{do}, ++ ++@t{doing}, ++ ++@t{initially}, and @t{finally} ++are the only loop keywords that can take any number of @i{forms} and ++group them as an @i{implicit progn}. ++ ++Loop clauses can contain auxiliary keywords, which are sometimes ++called prepositions. For example, the first clause in the code ++above includes the prepositions @t{from} and @t{to}, ++which mark the value from which stepping begins and the value at which stepping ++ends. ++ ++For detailed information about @b{loop} syntax, ++see the @i{macro} @b{loop}. ++ ++@node Expanding Loop Forms, Summary of Loop Clauses, Parsing Loop Clauses, Overview of the Loop Facility ++@subsubsection Expanding Loop Forms ++ ++A @b{loop} @i{macro form} expands into a @i{form} containing ++one or more binding forms (that @i{establish} @i{bindings} of loop variables) ++and a @b{block} and a @b{tagbody} (that express a looping control ++structure). The variables established in @b{loop} are bound as ++if by @b{let} or @b{lambda}. ++ ++Implementations can interleave the setting of initial values with the @i{bindings}. ++However, the assignment of the initial values is always calculated in the order ++specified by the user. A variable is thus sometimes bound to a meaningless value ++of the correct @i{type}, and then later in the prologue it is set to the true ++initial value by using @b{setq}. ++ ++One implication of this interleaving is that it is @i{implementation-dependent} ++whether the @i{lexical environment} in which the initial value @i{forms} ++(variously called the @i{form1}, @i{form2}, @i{form3}, @i{step-fun}, ++ @i{vector}, @i{hash-table}, and @i{package}) in any @i{for-as-subclause}, ++except @i{for-as-equals-then}, ++are @i{evaluated} includes only the loop variables preceding that @i{form} ++or includes more or all of the loop variables; ++the @i{form1} and @i{form2} in a @i{for-as-equals-then} form ++includes the @i{lexical environment} of all the loop variables. ++ ++After the @i{form} is expanded, it consists of three basic parts in the ++@b{tagbody}: ++ the loop prologue, ++ the loop body, ++ and the loop epilogue. ++ ++@table @asis ++ ++@item @b{Loop prologue} ++The loop prologue contains @i{forms} ++that are executed before iteration begins, such as ++any automatic variable initializations prescribed ++by the @i{variable} clauses, along with any @t{initially} clauses ++in the order they appear in the source. ++ ++@item @b{Loop body} ++The loop body contains those @i{forms} that are executed during iteration, ++including application-specific calculations, termination tests, ++and variable @i{stepping}_1. ++ ++@item @b{Loop epilogue} ++The loop epilogue contains @i{forms} that are executed after iteration ++terminates, such as @t{finally} clauses, if any, along ++with any implicit return value from an @i{accumulation} clause or ++an @i{termination-test} clause. ++ ++@end table ++ ++Some clauses from the source @i{form} ++contribute code only to the loop prologue; these clauses must ++ come before other clauses that are in the main body of the @b{loop} form. ++ Others contribute code only to the loop epilogue. ++ All other clauses contribute to the final ++translated @i{form} in the same ++ order given in the original source @i{form} of the @b{loop}. ++ ++Expansion of the @b{loop} macro produces an @i{implicit block} named @b{nil} ++ ++unless @t{named} is supplied. ++ ++Thus, @b{return-from} (and sometimes @b{return}) ++can be used to return values from @b{loop} or to exit @b{loop}. ++ ++@node Summary of Loop Clauses, Summary of Variable Initialization and Stepping Clauses, Expanding Loop Forms, Overview of the Loop Facility ++@subsubsection Summary of Loop Clauses ++ ++Loop clauses fall into one of the following categories: ++ ++@node Summary of Variable Initialization and Stepping Clauses, Summary of Value Accumulation Clauses, Summary of Loop Clauses, Overview of the Loop Facility ++@subsubsection Summary of Variable Initialization and Stepping Clauses ++ ++The @t{for} and @t{as} constructs provide iteration control clauses ++that establish a variable to be initialized. ++@t{for} and @t{as} clauses can be combined with the loop ++keyword @t{and} to get @i{parallel} initialization and @i{stepping}_1. ++Otherwise, the initialization and @i{stepping}_1 are @i{sequential}. ++ ++The @t{with} construct is similar to a single @b{let} clause. ++@t{with} clauses can be combined using the @i{loop keyword} @t{and} ++to get @i{parallel} initialization. ++ ++For more information, see @ref{Variable Initialization and Stepping Clauses}. ++ ++@node Summary of Value Accumulation Clauses, Summary of Termination Test Clauses, Summary of Variable Initialization and Stepping Clauses, Overview of the Loop Facility ++@subsubsection Summary of Value Accumulation Clauses ++ ++The @t{collect} (or @t{collecting}) construct ++takes one @i{form} in its clause ++and adds the value of that @i{form} to the end of a @i{list} ++of values. By default, the @i{list} of values is returned ++when the @b{loop} finishes. ++ ++The @t{append} (or @t{appending}) construct ++takes one @i{form} in its clause ++and appends the value of that @i{form} to the end of a @i{list} ++of values. By default, the @i{list} of values is returned when the ++@b{loop} finishes. ++ ++The @t{nconc} (or @t{nconcing}) construct ++is similar to the @t{append} construct, ++but its @i{list} values are concatenated as if by the function ++@t{nconc}. By default, the @i{list} of values is returned when ++the @b{loop} finishes. ++ ++The @t{sum} (or @t{summing}) construct ++takes one @i{form} in its clause ++that must evaluate to a @i{number} and accumulates the sum of all these ++@i{numbers}. By default, the cumulative sum is returned when the ++@b{loop} finishes. ++ ++The @t{count} (or @t{counting}) construct ++takes one @i{form} in its clause ++and counts the number of times that the @i{form} evaluates to @i{true}. ++By default, the count is returned when the @b{loop} finishes. ++ ++The @t{minimize} (or @t{minimizing}) construct ++takes one @i{form} in its clause ++and determines the minimum value obtained by evaluating that @i{form}. ++By default, the minimum value is returned when the @b{loop} finishes. ++ ++The @t{maximize} (or @t{maximizing}) construct ++takes one @i{form} in its clause ++and determines the maximum value obtained by evaluating that @i{form}. ++By default, the maximum value is returned when the @b{loop} finishes. ++ ++For more information, see @ref{Value Accumulation Clauses}. ++ ++@node Summary of Termination Test Clauses, Summary of Unconditional Execution Clauses, Summary of Value Accumulation Clauses, Overview of the Loop Facility ++@subsubsection Summary of Termination Test Clauses ++ ++The @t{for} and @t{as} constructs provide a termination test ++that is determined by the iteration control clause. ++ ++The @t{repeat} construct causes termination after a specified ++number of iterations. ++(It uses an internal variable to keep track of the number of iterations.) ++ ++The @t{while} construct takes one @i{form}, a @i{test}, ++and terminates the iteration if the @i{test} evaluates to @i{false}. ++A @t{while} clause is equivalent to the expression ++@t{(if (not @i{test}) (loop-finish))}. ++ ++The @t{until} construct is the inverse of @t{while}; ++it terminates the iteration if the @i{test} evaluates to ++any @i{non-nil} value. ++An @t{until} clause is equivalent to the expression ++@t{(if @i{test} (loop-finish))}. ++ ++The @t{always} construct takes one @i{form} and ++terminates the @b{loop} if the @i{form} ever evaluates to @i{false}; ++in this case, the @b{loop} @i{form} returns @b{nil}. ++Otherwise, it provides a default return value of @b{t}. ++ ++The @t{never} construct takes one @i{form} and ++terminates the @b{loop} if the @i{form} ever evaluates to @i{true}; ++in this case, the @b{loop} @i{form} returns @b{nil}. ++Otherwise, it provides a default return value of @b{t}. ++ ++The @t{thereis} construct takes one @i{form} and ++terminates the @b{loop} if the @i{form} ever evaluates to ++a @i{non-nil} @i{object}; ++in this case, the @b{loop} @i{form} returns that @i{object}. ++ ++Otherwise, it provides a default return value of @b{nil}. ++ ++If multiple termination test clauses are specified, ++the @b{loop} @i{form} terminates if any are satisfied. ++ ++For more information, see @ref{Termination Test Clauses}. ++ ++@node Summary of Unconditional Execution Clauses, Summary of Conditional Execution Clauses, Summary of Termination Test Clauses, Overview of the Loop Facility ++@subsubsection Summary of Unconditional Execution Clauses ++ ++The @t{do} (or @t{doing}) construct evaluates all @i{forms} in its clause. ++ ++The @t{return} construct takes one ++ ++ @i{form}. Any @i{values} returned by the @i{form} are ++ immediately returned by the @b{loop} form. ++ It is equivalent to the clause ++ @t{do (return-from @i{block-name} @i{value})}, ++ where @i{block-name} is the name specified in a @t{named} ++ clause, or @b{nil} if there is no @t{named} clause. ++ ++For more information, see @ref{Unconditional Execution Clauses}. ++ ++@node Summary of Conditional Execution Clauses, Summary of Miscellaneous Clauses, Summary of Unconditional Execution Clauses, Overview of the Loop Facility ++@subsubsection Summary of Conditional Execution Clauses ++ ++The @t{if} and @t{when} constructs take one @i{form} as a test ++and a clause that is executed when the test @i{yields} @i{true}. ++The clause can be a value accumulation, unconditional, or ++another conditional clause; it can also be any combination ++of such clauses connected by the @b{loop} @t{and} keyword. ++ ++The @b{loop} @t{unless} construct is similar to the @b{loop} @t{when} construct ++except that it complements the test result. ++ ++The @b{loop} @t{else} construct provides an optional component of @t{if}, ++@t{when}, and @t{unless} clauses that is executed ++ when an @t{if} or @t{when} test @i{yields} @i{false} ++ or when an @t{unless} test @i{yields} @i{true}. ++The component is one of the clauses described under @t{if}. ++ ++The @b{loop} @t{end} construct provides an optional component to mark the ++end of a conditional clause. ++ ++For more information, see @ref{Conditional Execution Clauses}. ++ ++@node Summary of Miscellaneous Clauses, Order of Execution, Summary of Conditional Execution Clauses, Overview of the Loop Facility ++@subsubsection Summary of Miscellaneous Clauses ++ ++The @b{loop} @t{named} construct gives a name for the @i{block} of the loop. ++ ++The @b{loop} @t{initially} construct causes its @i{forms} to be ++evaluated in the loop prologue, which precedes all @b{loop} code ++except for initial settings supplied by the constructs @t{with}, ++@t{for}, or @t{as}. ++ ++The @b{loop} @t{finally} construct causes its @i{forms} to ++be evaluated in the loop epilogue after normal iteration terminates. ++ ++For more information, see @ref{Miscellaneous Clauses}. ++ ++@node Order of Execution, Destructuring, Summary of Miscellaneous Clauses, Overview of the Loop Facility ++@subsubsection Order of Execution ++ ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++ With the exceptions listed below, clauses are executed in the loop body ++ in the order in which they appear in the source. Execution is repeated ++ until a clause ++ terminates the @b{loop} or until a @b{return}, @b{go}, ++ or @b{throw} form is encountered ++which transfers control to a point outside of the loop. ++ The following actions are ++ exceptions to the linear order of execution: ++ ++@table @asis ++ ++@item @t{*} ++All variables are initialized first, ++ regardless of where the establishing clauses appear in the ++ source. The order of initialization follows the order of these clauses. ++ ++@item @t{*} ++The code for any @t{initially} clauses is collected ++ into one @b{progn} in the order in which the clauses appear in ++ the source. The collected code is executed once in the loop prologue ++ after any implicit variable initializations. ++ ++@item @t{*} ++The code for any @t{finally} clauses is collected ++ into one @b{progn} in the order in which the clauses appear in ++ the source. The collected code is executed once in the loop epilogue ++ before any implicit values from the accumulation clauses are returned. ++ Explicit returns anywhere in the source, however, will exit the ++ @b{loop} without executing the epilogue code. ++ ++@item @t{*} ++A @t{with} clause introduces a variable @i{binding} ++ and an optional initial value. The initial values are calculated ++ in the order in which the @t{with} clauses occur. ++ ++@item @t{*} ++Iteration control clauses implicitly perform the following actions: ++ ++@table @asis ++ ++@item -- ++initialize variables; ++ ++@item -- ++@i{step} variables, generally ++between each execution of the loop body; ++ ++@item -- ++perform termination tests, ++generally just before the execution of the ++ loop body. ++ ++@end table ++ ++@end table ++ ++@node Destructuring, Restrictions on Side-Effects, Order of Execution, Overview of the Loop Facility ++@subsubsection Destructuring ++ ++The @i{d-type-spec} argument is used for destructuring. ++If the ++@i{d-type-spec} argument consists solely of the @i{type} @b{fixnum}, ++@b{float}, @b{t}, or @b{nil}, the @t{of-type} keyword is optional. ++The @t{of-type} construct is optional in these cases to provide backwards ++compatibility; thus, the following two expressions are the same: ++ ++@example ++;;; This expression uses the old syntax for type specifiers. ++ (loop for i fixnum upfrom 3 ...) ++ ++;;; This expression uses the new syntax for type specifiers. ++ (loop for i of-type fixnum upfrom 3 ...) ++ ++;; Declare X and Y to be of type VECTOR and FIXNUM respectively. ++ (loop for (x y) of-type (vector fixnum) ++ in l do ...) ++@end example ++ ++A @i{type specifier} for a destructuring pattern is a @i{tree} of ++@i{type specifiers} with the same shape as the @i{tree} of ++@i{variable} @i{names}, with the following exceptions: ++ ++@table @asis ++ ++@item @t{*} ++When aligning the @i{trees}, an @i{atom} in the ++@i{tree} of @i{type specifiers} that matches a @i{cons} ++in the variable tree declares the same @i{type} for each variable ++in the subtree rooted at the @i{cons}. ++ ++@item @t{*} ++A @i{cons} in the @i{tree} of @i{type specifiers} that ++matches an @i{atom} in the @i{tree} of @i{variable} @i{names} ++is a @i{compound type specifer}. ++ ++@end table ++ ++Destructuring allows @i{binding} of a set of variables to a corresponding ++set of values anywhere that a value can normally be bound to a single ++variable. During @b{loop} expansion, ++each variable in the variable list ++is matched with the values in the values list. If there are more variables ++in the variable list than there are values in the values list, the ++remaining variables are given a value of @b{nil}. If there are more ++values than variables listed, the extra values are discarded. ++ ++To assign values from a list to the variables @t{a}, ++@t{b}, and @t{c}, the @t{for} clause could be used to ++bind the variable @t{numlist} to the ++@i{car} of the supplied @i{form}, ++and then another @t{for} clause could be used to bind the variables ++@t{a}, @t{b}, and @t{c} @i{sequentially}. ++ ++@example ++;; Collect values by using FOR constructs. ++ (loop for numlist in '((1 2 4.0) (5 6 8.3) (8 9 10.4)) ++ for a of-type integer = (first numlist) ++ and b of-type integer = (second numlist) ++ and c of-type float = (third numlist) ++ collect (list c b a)) ++@result{} ((4.0 2 1) (8.3 6 5) (10.4 9 8)) ++@end example ++ ++Destructuring makes this process easier by allowing the variables to ++be bound in each loop iteration. ++@i{Types} can be declared by using a ++list of @i{type-spec} arguments. If ++all the @i{types} ++are the same, a shorthand destructuring syntax can be used, as the second ++example illustrates. ++ ++@example ++;; Destructuring simplifies the process. ++ (loop for (a b c) of-type (integer integer float) in ++ '((1 2 4.0) (5 6 8.3) (8 9 10.4)) ++ collect (list c b a)) ++@result{} ((4.0 2 1) (8.3 6 5) (10.4 9 8)) ++ ++;; If all the types are the same, this way is even simpler. ++ (loop for (a b c) of-type float in ++ '((1.0 2.0 4.0) (5.0 6.0 8.3) (8.0 9.0 10.4)) ++ collect (list c b a)) ++@result{} ((4.0 2.0 1.0) (8.3 6.0 5.0) (10.4 9.0 8.0)) ++@end example ++ ++If destructuring is used to declare or initialize a number of groups ++of variables into @i{types}, the @i{loop keyword} @t{and} can be used ++to simplify the process further. ++ ++@example ++;; Initialize and declare variables in parallel by using the AND construct.\kern-7pt ++ (loop with (a b) of-type float = '(1.0 2.0) ++ and (c d) of-type integer = '(3 4) ++ and (e f) ++ return (list a b c d e f)) ++@result{} (1.0 2.0 3 4 NIL NIL) ++@end example ++ ++If @b{nil} is used in a destructuring list, no variable is provided for ++its place. ++ ++@example ++ (loop for (a nil b) = '(1 2 3) ++ do (return (list a b))) ++@result{} (1 3) ++@end example ++ ++Note that ++@i{dotted lists} ++can specify destructuring. ++ ++@example ++ (loop for (x . y) = '(1 . 2) ++ do (return y)) ++@result{} 2 ++ (loop for ((a . b) (c . d)) of-type ((float . float) (integer . integer)) in ++ '(((1.2 . 2.4) (3 . 4)) ((3.4 . 4.6) (5 . 6))) ++ collect (list a b c d)) ++@result{} ((1.2 2.4 3 4) (3.4 4.6 5 6)) ++@end example ++ ++An error of @i{type} @b{program-error} is signaled (at macro expansion time) ++if the same variable is bound twice in any variable-binding ++clause of a single @b{loop} expression. Such variables include ++local variables, iteration control variables, and variables found by ++destructuring. ++ ++@node Restrictions on Side-Effects, , Destructuring, Overview of the Loop Facility ++@subsubsection Restrictions on Side-Effects ++ ++See @ref{Traversal Rules and Side Effects}. ++ ++@node Variable Initialization and Stepping Clauses, Value Accumulation Clauses, Overview of the Loop Facility, The LOOP Facility ++@subsection Variable Initialization and Stepping Clauses ++ ++@menu ++* Iteration Control:: ++* The for-as-arithmetic subclause:: ++* Examples of for-as-arithmetic subclause:: ++* The for-as-in-list subclause:: ++* Examples of for-as-in-list subclause:: ++* The for-as-on-list subclause:: ++* Examples of for-as-on-list subclause:: ++* The for-as-equals-then subclause:: ++* Examples of for-as-equals-then subclause:: ++* The for-as-across subclause:: ++* Examples of for-as-across subclause:: ++* The for-as-hash subclause:: ++* The for-as-package subclause:: ++* Examples of for-as-package subclause:: ++* Local Variable Initializations:: ++* Examples of WITH clause:: ++@end menu ++ ++@node Iteration Control, The for-as-arithmetic subclause, Variable Initialization and Stepping Clauses, Variable Initialization and Stepping Clauses ++@subsubsection Iteration Control ++ ++Iteration control clauses allow direction of @b{loop} iteration. ++The @i{loop keywords} @t{for} and @t{as} ++designate iteration control clauses. ++Iteration control clauses differ with respect to the specification of ++termination tests and to the initialization and @i{stepping}_1 ++of loop variables. Iteration clauses by themselves ++do not cause the Loop Facility to return values, but they ++can be used in conjunction with value-accumulation clauses to ++return values. ++ ++All variables are initialized in the loop prologue. ++A @i{variable} @i{binding} has @i{lexical scope} ++unless it is proclaimed @b{special}; ++thus, by default, the variable can be @i{accessed} only by @i{forms} ++that lie textually within the @b{loop}. ++Stepping assignments are made in the loop body before any other @i{forms} ++are evaluated in the body. ++ ++The variable argument in iteration control clauses can be a ++destructuring list. A destructuring list ++is a @i{tree} whose @i{non-nil} @i{atoms} are @i{variable} @i{names}. ++See @ref{Destructuring}. ++ ++The iteration control clauses @t{for}, @t{as}, and @t{repeat} ++must precede any other loop clauses, except ++ @t{initially}, @t{with}, and @t{named}, ++since they establish variable @i{bindings}. ++When iteration control clauses are ++used in a @b{loop}, ++the corresponding ++termination tests in the loop body are evaluated ++before any other loop body code is executed. ++ ++If multiple iteration clauses are used to control iteration, variable ++initialization and @i{stepping}_1 occur @i{sequentially} by default. ++The @t{and} construct can be used to connect two or more ++iteration clauses when @i{sequential} @i{binding} and ++@i{stepping}_1 are not necessary. ++The iteration behavior of clauses joined by @t{and} ++is analogous to the behavior of the macro @b{do} with ++respect to @b{do*}. ++ ++The @t{for} and @t{as} clauses iterate by using one or more local ++loop variables that are initialized to some value and that ++can be modified or @i{stepped}_1 after each iteration. ++For these clauses, iteration terminates when a local ++variable reaches some supplied value or when some other loop clause ++terminates iteration. ++At each iteration, variables can be ++ @i{stepped}_1 by an increment or a decrement ++or can be assigned a new value by the evaluation of a @i{form}). ++Destructuring can be used to assign ++values to variables during iteration. ++ ++The @t{for} and @t{as} keywords are synonyms; they can be used ++interchangeably. There are seven syntactic formats for these constructs. ++In each syntactic format, the @i{type} of ++@i{var} can be supplied by the optional @i{type-spec} ++argument. If @i{var} is a destructuring list, the @i{type} ++supplied by the @i{type-spec} argument must appropriately match ++the elements of the list. ++By convention, @t{for} introduces new iterations and @t{as} ++introduces iterations that depend on a previous iteration specification. ++ ++@node The for-as-arithmetic subclause, Examples of for-as-arithmetic subclause, Iteration Control, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-arithmetic subclause ++ ++In the @i{for-as-arithmetic} subclause, the @t{for} ++or @t{as} construct iterates from the value supplied by ++@i{form1} to the value supplied by @i{form2} in increments or ++decrements denoted by @i{form3}. Each ++expression is evaluated only once and must evaluate to a @i{number}. ++The variable @i{var} is bound to the value of ++@i{form1} in the first iteration and is @i{stepped}_1 ++by the value of @i{form3} in each succeeding iteration, ++or by 1 if @i{form3} is not provided. ++The following @i{loop keywords} serve as valid prepositions within this ++syntax. ++At least one of the ++prepositions must be used; ++and at most one from each line may be used in a single subclause. ++ ++@table @asis ++ ++@item from | downfrom | upfrom ++@item to | downto | upto | below | above ++@item by ++@end table ++ ++The prepositional phrases in each subclause may appear in any order. ++For example, either ``@t{from x by y}'' or ``@t{by y from x}'' is permitted. ++However, because left-to-right order of evaluation is preserved, ++the effects will be different in the case of side effects. ++ ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++Consider: ++ ++@example ++(let ((x 1)) (loop for i from x by (incf x) to 10 collect i)) ++@result{} (1 3 5 7 9) ++(let ((x 1)) (loop for i by (incf x) from x to 10 collect i)) ++@result{} (2 4 6 8 10) ++@end example ++ ++The descriptions of the prepositions follow: ++ ++@table @asis ++ ++@item from ++The @i{loop keyword} @t{from} specifies the value from which ++@i{stepping}_1 begins, as supplied by @i{form1}. ++@i{Stepping}_1 is incremental by default. If ++decremental @i{stepping}_1 is desired, ++the preposition @t{downto} ++or @t{above} must be used with @i{form2}. For incremental ++@i{stepping}_1, the default @t{from} value is 0. ++ ++@item downfrom, upfrom ++The @i{loop keyword} @t{downfrom} ++indicates that the variable @i{var} is decreased in decrements ++supplied by @i{form3}; the @i{loop keyword} @t{upfrom} indicates that ++@i{var} is increased in increments supplied by @i{form3}. ++ ++@item to ++The @i{loop keyword} @t{to} marks the end value ++for @i{stepping}_1 supplied in @i{form2}. ++@i{Stepping}_1 is incremental by default. ++If decremental @i{stepping}_1 is desired, ++the preposition @t{downfrom} must be used with @i{form1}, ++or else the preposition @t{downto} or @t{above} should be used instead ++ of @t{to} with @i{form2}. ++ ++@item downto, upto ++The @i{loop keyword} @t{downto} specifies decremental @i{stepping}; ++the @i{loop keyword} @t{upto} specifies incremental @i{stepping}. ++In both cases, the amount of change on each step is specified by @i{form3}, ++and the @b{loop} terminates when the variable @i{var} passes ++the value of @i{form2}. ++Since there is no default for @i{form1} in decremental @i{stepping}_1, ++a @i{form1} value must be supplied (using @t{from} or @t{downfrom}) ++when @t{downto} is supplied. ++ ++@item below, above ++The @i{loop keywords} @t{below} and @t{above} are analogous to ++@t{upto} and @t{downto} respectively. These keywords stop ++iteration just before the value of the variable @i{var} reaches the value ++supplied by @i{form2}; the end value of @i{form2} is not included. ++Since there is no default for @i{form1} in decremental @i{stepping}_1, ++a @i{form1} value must be supplied (using @t{from} or @t{downfrom}) ++when @t{above} is supplied. ++ ++@item by ++The @i{loop keyword} @t{by} marks the increment or decrement supplied by ++@i{form3}. The value of @i{form3} can be any ++positive ++@i{number}. ++The default value is 1. ++ ++@end table ++ ++In an iteration control clause, the @t{for} or @t{as} construct ++causes termination when the supplied limit is reached. That is, ++iteration continues until the value @i{var} is stepped to the ++exclusive or inclusive limit supplied by @i{form2}. The range is ++exclusive if @i{form3} increases or decreases @i{var} ++to the value of @i{form2} without reaching that value; the loop ++keywords @t{below} and @t{above} provide exclusive limits. An ++inclusive limit allows @i{var} to attain the value of ++@i{form2}; @t{to}, @t{downto}, and @t{upto} provide inclusive ++limits. ++ ++@node Examples of for-as-arithmetic subclause, The for-as-in-list subclause, The for-as-arithmetic subclause, Variable Initialization and Stepping Clauses ++@subsubsection Examples of for-as-arithmetic subclause ++ ++@example ++;; Print some numbers. ++ (loop for i from 1 to 3 ++ do (print i)) ++@t{ |> } 1 ++@t{ |> } 2 ++@t{ |> } 3 ++@result{} NIL ++ ++;; Print every third number. ++ (loop for i from 10 downto 1 by 3 ++ do (print i)) ++@t{ |> } 10 ++@t{ |> } 7 ++@t{ |> } 4 ++@t{ |> } 1 ++@result{} NIL ++ ++;; Step incrementally from the default starting value. ++ (loop for i below 3 ++ do (print i)) ++@t{ |> } 0 ++@t{ |> } 1 ++@t{ |> } 2 ++@result{} NIL ++@end example ++ ++@node The for-as-in-list subclause, Examples of for-as-in-list subclause, Examples of for-as-arithmetic subclause, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-in-list subclause ++ ++In the @i{for-as-in-list} subclause, ++the @t{for} ++or @t{as} construct iterates over the contents of a ++@i{list}. It checks for ++the end of the @i{list} as if by using @b{endp}. ++The variable @i{var} is bound to the successive elements of ++the @i{list} in @i{form1} before each ++iteration. At the end of each iteration, the function @i{step-fun} ++is applied to the @i{list}; the default value for @i{step-fun} is ++@b{cdr}. ++The @i{loop keywords} @t{in} and @t{by} serve as valid prepositions in ++this syntax. ++The @t{for} or @t{as} construct causes termination when the ++end of the @i{list} is reached. ++ ++@node Examples of for-as-in-list subclause, The for-as-on-list subclause, The for-as-in-list subclause, Variable Initialization and Stepping Clauses ++@subsubsection Examples of for-as-in-list subclause ++ ++@example ++;; Print every item in a list. ++ (loop for item in '(1 2 3) do (print item)) ++@t{ |> } 1 ++@t{ |> } 2 ++@t{ |> } 3 ++@result{} NIL ++ ++;; Print every other item in a list. ++ (loop for item in '(1 2 3 4 5) by #'cddr ++ do (print item)) ++@t{ |> } 1 ++@t{ |> } 3 ++@t{ |> } 5 ++@result{} NIL ++ ++;; Destructure a list, and sum the x values using fixnum arithmetic. ++ (loop for (item . x) of-type (t . fixnum) in '((A . 1) (B . 2) (C . 3)) ++ unless (eq item 'B) sum x) ++@result{} 4 ++@end example ++ ++@node The for-as-on-list subclause, Examples of for-as-on-list subclause, Examples of for-as-in-list subclause, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-on-list subclause ++ ++In the @i{for-as-on-list} subclause, the @t{for} or @t{as} ++construct iterates over ++a @i{list}. It checks for the ++end of the @i{list} as if by using @b{atom}. ++ ++The variable @i{var} is bound to the successive tails of the ++@i{list} in ++@i{form1}. At the end of each iteration, the function @i{step-fun} ++ is applied to the @i{list}; the default value for @i{step-fun} is @b{cdr}. ++ The @i{loop keywords} @t{on} and @t{by} serve as valid ++prepositions in this syntax. ++The @t{for} or @t{as} construct causes termination when the ++end of the @i{list} is reached. ++ ++@node Examples of for-as-on-list subclause, The for-as-equals-then subclause, The for-as-on-list subclause, Variable Initialization and Stepping Clauses ++@subsubsection Examples of for-as-on-list subclause ++ ++@example ++;; Collect successive tails of a list. ++ (loop for sublist on '(a b c d) ++ collect sublist) ++@result{} ((A B C D) (B C D) (C D) (D)) ++ ++;; Print a list by using destructuring with the loop keyword ON. ++ (loop for (item) on '(1 2 3) ++ do (print item)) ++@t{ |> } 1 ++@t{ |> } 2 ++@t{ |> } 3 ++@result{} NIL ++ ++@end example ++ ++@node The for-as-equals-then subclause, Examples of for-as-equals-then subclause, Examples of for-as-on-list subclause, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-equals-then subclause ++ ++In the @i{for-as-equals-then} subclause ++the @t{for} ++or @t{as} construct ++initializes the variable @i{var} by setting it to the ++ result of evaluating @i{form1} on the first iteration, then setting ++ it to the result of evaluating @i{form2} on the second and ++ subsequent iterations. If @i{form2} is omitted, the construct ++ uses @i{form1} on the second and ++ subsequent iterations. ++The @i{loop keywords} @r{=} and @t{then} serve as valid prepositions ++in this syntax. ++This construct does not provide any termination tests. ++ ++@node Examples of for-as-equals-then subclause, The for-as-across subclause, The for-as-equals-then subclause, Variable Initialization and Stepping Clauses ++@subsubsection Examples of for-as-equals-then subclause ++ ++@example ++;; Collect some numbers. ++ (loop for item = 1 then (+ item 10) ++ for iteration from 1 to 5 ++ collect item) ++@result{} (1 11 21 31 41) ++@end example ++ ++@node The for-as-across subclause, Examples of for-as-across subclause, Examples of for-as-equals-then subclause, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-across subclause ++ ++ In the @i{for-as-across} subclause the @t{for} ++ or @t{as} construct binds the variable @i{var} to the value of ++ each element in the array @i{vector}. ++ The @i{loop keyword} @t{across} marks the array @i{vector}; @t{across} ++ is used as a preposition in this syntax. ++ Iteration stops when there are no more elements in the supplied ++ @i{array} that can be referenced. ++ Some implementations might recognize a @b{the} special form ++ in the @i{vector} form to produce more efficient code. ++ ++@node Examples of for-as-across subclause, The for-as-hash subclause, The for-as-across subclause, Variable Initialization and Stepping Clauses ++@subsubsection Examples of for-as-across subclause ++ ++@example ++ (loop for char across (the simple-string (find-message channel)) ++ do (write-char char stream)) ++@end example ++ ++@node The for-as-hash subclause, The for-as-package subclause, Examples of for-as-across subclause, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-hash subclause ++ ++ In the @i{for-as-hash} subclause ++ the @t{for} ++ or @t{as} construct ++ iterates over the elements, keys, and values of a @i{hash-table}. ++ In this syntax, a compound preposition is used to designate access to a ++ @i{hash table}. ++ The variable @i{var} takes on the value of each hash key ++ or hash value in the supplied @i{hash-table}. ++ The following @i{loop keywords} serve as valid prepositions within this syntax: ++ ++@table @asis ++ ++@item @t{being} ++The keyword @t{being} introduces either the Loop schema ++@t{hash-key} or @t{hash-value}. ++ ++@item @t{each}, @t{the} ++The @i{loop keyword} @t{each} ++follows the @i{loop keyword} @t{being} when @t{hash-key} or ++@t{hash-value} is used. The @i{loop keyword} @t{the} is used with ++@t{hash-keys} and @t{hash-values} only for ease of reading. ++This agreement isn't required. ++ ++@item @t{hash-key}, @t{hash-keys} ++These @i{loop keywords} access each key entry of the @i{hash table}. If ++the name @t{hash-value} is supplied in a @t{using} construct with one ++of these Loop schemas, the iteration can optionally access the keyed ++value. The order in which the keys are accessed is undefined; empty ++slots in the @i{hash table} are ignored. ++ ++@item @t{hash-value}, @t{hash-values} ++These @i{loop keywords} access each value entry of a ++@i{hash table}. If ++the name @t{hash-key} is supplied in a @t{using} construct with one of ++these Loop schemas, the iteration can optionally access the key that ++corresponds to the value. The order in which the keys are accessed is ++undefined; empty slots in the @i{hash table} are ignored. ++ ++@item @t{using} ++The @i{loop keyword} @t{using} introduces ++the optional key or the keyed value to ++be accessed. It allows access to the hash key if iteration is over ++the hash values, and the hash value if ++iteration is over the hash keys. ++ ++@item @t{in}, @t{of} ++These loop prepositions introduce @i{hash-table}. ++ ++@end table ++ ++In effect ++ ++@t{being} ++@{@t{each} | @t{the}@} ++@{@t{hash-value} | ++ @t{hash-values} | ++ @t{hash-key} | ++ @t{hash-keys}@} ++@{@t{in} | @t{of}@} ++ ++is a compound preposition. ++ ++Iteration stops when there are no more hash keys or hash values to be ++referenced in the supplied @i{hash-table}. ++ ++@node The for-as-package subclause, Examples of for-as-package subclause, The for-as-hash subclause, Variable Initialization and Stepping Clauses ++@subsubsection The for-as-package subclause ++ ++In the @i{for-as-package} subclause ++the @t{for} ++or @t{as} construct ++iterates over the @i{symbols} in a @i{package}. ++In this syntax, a compound preposition is used to designate access to a ++@i{package}. ++The variable @i{var} takes on the value of each @i{symbol} ++in the supplied @i{package}. ++ The following @i{loop keywords} serve as valid prepositions within this syntax: ++ ++@table @asis ++ ++@item @t{being} ++The keyword @t{being} introduces either the Loop schema ++@t{symbol}, @t{present-symbol}, or @t{external-symbol}. ++ ++@item @t{each}, @t{the} ++The @i{loop keyword} @t{each} ++follows the @i{loop keyword} @t{being} when @t{symbol}, ++@t{present-symbol}, or @t{external-symbol} is used. ++The @i{loop keyword} @t{the} is used with @t{symbols}, ++@t{present-symbols}, and @t{external-symbols} only for ease of reading. ++This agreement isn't required. ++ ++@item @t{present-symbol}, @t{present-symbols} ++These Loop schemas iterate over the @i{symbols} ++ ++that are @i{present} in a @i{package}. ++ ++The @i{package} to be iterated over is supplied in the same way ++that @i{package} arguments to @b{find-package} are supplied. ++If the @i{package} for the iteration is not supplied, ++the @i{current package} is used. ++If a @i{package} that does not exist is supplied, ++an error of @i{type} @b{package-error} is signaled. ++ ++@item @t{symbol}, @t{symbols} ++These Loop schemas iterate over @i{symbols} that are ++@i{accessible} in a given @i{package}. ++The @i{package} to be iterated over is supplied in the same way ++that @i{package} arguments to @b{find-package} are supplied. ++If the @i{package} for the iteration is not supplied, ++the @i{current package} is used. ++If a @i{package} that does not exist is supplied, ++an error of @i{type} @b{package-error} is signaled. ++ ++@item @t{external-symbol}, @t{external-symbols} ++These Loop schemas iterate over the @i{external symbols} of a @i{package}. ++The @i{package} to be iterated over is supplied in the same way ++that @i{package} arguments to @b{find-package} are supplied. ++If the @i{package} for the iteration is not supplied, ++the @i{current package} is used. ++If a @i{package} that does not exist is supplied, ++an error of @i{type} @b{package-error} is signaled. ++ ++@item @t{in}, @t{of} ++These loop prepositions introduce @i{package}. ++ ++@end table ++ ++In effect ++ ++@t{being} ++@{@t{each} | @t{the}@} ++@{@t{symbol} | ++ @t{symbols} | ++ @t{present-symbol} | ++ @t{present-symbols} | ++ @t{external-symbol} | ++ @t{external-symbols}@} ++@{@t{in} | @t{of}@} ++ ++is a compound preposition. ++ ++Iteration stops when there are no more @i{symbols} to be referenced ++in the supplied @i{package}. ++ ++@node Examples of for-as-package subclause, Local Variable Initializations, The for-as-package subclause, Variable Initialization and Stepping Clauses ++@subsubsection Examples of for-as-package subclause ++ ++@example ++ (let ((*package* (make-package "TEST-PACKAGE-1"))) ++ ;; For effect, intern some symbols ++ (read-from-string "(THIS IS A TEST)") ++ (export (intern "THIS")) ++ (loop for x being each present-symbol of *package* ++ do (print x))) ++@t{ |> } A ++@t{ |> } TEST ++@t{ |> } THIS ++@t{ |> } IS ++@result{} NIL ++@end example ++ ++@node Local Variable Initializations, Examples of WITH clause, Examples of for-as-package subclause, Variable Initialization and Stepping Clauses ++@subsubsection Local Variable Initializations ++ ++When a @b{loop} @i{form} is executed, the local variables are bound and are ++initialized to some value. These local variables exist until @b{loop} ++iteration terminates, at which point they cease to exist. ++Implicit variables are also established by iteration control clauses and the ++@t{into} preposition of accumulation clauses. ++ ++The @t{with} construct initializes variables that are local to ++a loop. The variables are initialized one time only. ++If the optional @i{type-spec} argument is supplied for the variable ++@i{var}, but there is no related expression to be evaluated, @i{var} ++is initialized to an appropriate default value for its @i{type}. ++For example, for the types @b{t}, @b{number}, ++and @b{float}, ++the default values are @b{nil}, @t{0}, and @t{0.0} respectively. ++The consequences are undefined if a ++@i{type-spec} argument is supplied for @i{var} if ++the related expression returns a value that is not of the supplied ++@i{type}. ++By default, the @t{with} construct initializes variables ++@i{sequentially}; that is, one variable is assigned a value before the ++next expression is evaluated. However, by using the @i{loop keyword} @t{and} ++to join several @t{with} clauses, ++initializations can be forced to occur in @i{parallel}; that ++is, all of the supplied ++@i{forms} are evaluated, and the results are bound to the respective ++variables simultaneously. ++ ++@i{Sequential} @i{binding} is used when it is desireable for the initialization of ++some variables to depend on the values of previously bound variables. ++For example, suppose the variables @t{a}, @t{b}, and @t{c} are to be bound in sequence: ++ ++@example ++ (loop with a = 1 ++ with b = (+ a 2) ++ with c = (+ b 3) ++ return (list a b c)) ++@result{} (1 3 6) ++@end example ++ ++The execution of the above @b{loop} is equivalent to the execution of ++the following code: ++ ++@example ++ (block nil ++ (let* ((a 1) ++ (b (+ a 2)) ++ (c (+ b 3))) ++ (tagbody ++ (next-loop (return (list a b c)) ++ (go next-loop) ++ end-loop)))) ++@end example ++ ++If the values of previously bound variables are not needed ++for the initialization of other local variables, an ++@t{and} clause can be used to ++specify that the bindings are to occur in @i{parallel}: ++ ++@example ++ (loop with a = 1 ++ and b = 2 ++ and c = 3 ++ return (list a b c)) ++@result{} (1 2 3) ++@end example ++ ++The execution of the above loop is equivalent to the execution of ++the following code: ++ ++@example ++ (block nil ++ (let ((a 1) ++ (b 2) ++ (c 3)) ++ (tagbody ++ (next-loop (return (list a b c)) ++ (go next-loop) ++ end-loop)))) ++@end example ++ ++@node Examples of WITH clause, , Local Variable Initializations, Variable Initialization and Stepping Clauses ++@subsubsection Examples of WITH clause ++ ++@example ++;; These bindings occur in sequence. ++ (loop with a = 1 ++ with b = (+ a 2) ++ with c = (+ b 3) ++ return (list a b c)) ++@result{} (1 3 6) ++ ++;; These bindings occur in parallel. ++ (setq a 5 b 10) ++@result{} 10 ++ (loop with a = 1 ++ and b = (+ a 2) ++ and c = (+ b 3) ++ return (list a b c)) ++@result{} (1 7 13) ++ ++;; This example shows a shorthand way to declare local variables ++;; that are of different types. ++ (loop with (a b c) of-type (float integer float) ++ return (format nil "~A ~A ~A" a b c)) ++@result{} "0.0 0 0.0" ++ ++;; This example shows a shorthand way to declare local variables ++;; that are the same type. ++ (loop with (a b c) of-type float ++ return (format nil "~A ~A ~A" a b c)) ++@result{} "0.0 0.0 0.0" ++@end example ++ ++@node Value Accumulation Clauses, Termination Test Clauses, Variable Initialization and Stepping Clauses, The LOOP Facility ++@subsection Value Accumulation Clauses ++ ++The constructs @t{collect}, @t{collecting}, ++@t{append}, @t{appending}, ++@t{nconc}, @t{nconcing}, ++@t{count}, @t{counting}, ++@t{maximize}, @t{maximizing}, ++@t{minimize}, @t{minimizing}, ++@t{sum}, and @t{summing}, ++allow values to be accumulated in a @b{loop}. ++ ++The constructs @t{collect}, ++@t{collecting}, @t{append}, @t{appending}, ++@t{nconc}, and @t{nconcing}, ++designate clauses that ++accumulate values in @i{lists} and return them. ++The constructs @t{count}, @t{counting}, ++@t{maximize}, @t{maximizing}, @t{minimize}, @t{minimizing}, ++@t{sum}, and @t{summing} designate clauses that accumulate and ++return numerical values. ++ ++During each iteration, the constructs ++@t{collect} and @t{collecting} ++collect the value of the supplied ++@i{form} into a @i{list}. ++When iteration terminates, the @i{list} is returned. ++The argument @i{var} is ++set to the @i{list} ++of collected values; if @i{var} is supplied, the @b{loop} ++does not return the final @i{list} automatically. If ++@i{var} is not ++supplied, it is equivalent to supplying an internal name for ++@i{var} and returning its value in a @t{finally} clause. ++The @i{var} argument ++is bound as if by the construct @t{with}. ++No mechanism is provided for declaring the @i{type} of @i{var}; ++it must be of @i{type} @b{list}. ++ ++The constructs @t{append}, @t{appending}, ++@t{nconc}, and @t{nconcing} ++are similar to @t{collect} except that the ++values of the supplied @i{form} must be @i{lists}. ++ ++@table @asis ++ ++@item @t{*} ++The @t{append} keyword causes its @i{list} values to be concatenated ++into a single @i{list}, as if ++they were arguments to the @i{function} @b{append}. ++ ++@item @t{*} ++The @t{nconc} keyword causes its @i{list} values to be concatenated ++into a single @i{list}, ++as if they were arguments to the @i{function} @b{nconc}. ++@end table ++ ++The argument @i{var} is ++set to the @i{list} of ++concatenated values; if @i{var} is supplied, ++@b{loop} ++does not return the final @i{list} automatically. ++The @i{var} argument ++is bound as if by the construct @t{with}. ++ A @i{type} cannot be supplied for @i{var}; ++it must be of @i{type} @b{list}. ++ The construct @t{nconc} ++destructively modifies its argument @i{lists}. ++ ++The @t{count} construct counts the number of times ++that the supplied @i{form} returns @i{true}. ++The argument @i{var} accumulates the number of occurrences; ++if @i{var} is supplied, ++@b{loop} does not return the final count automatically. ++The @i{var} argument is bound as if by the construct @t{with} ++to a zero of the appropriate type. ++Subsequent values (including any necessary coercions) ++are computed as if by the function @b{1+}. ++If @t{into} @i{var} is used, ++a @i{type} can be supplied for @i{var} with the @i{type-spec} argument; ++the consequences are unspecified if a nonnumeric @i{type} is supplied. ++If there is no @t{into} variable, ++the optional @i{type-spec} argument ++applies to the internal variable that is keeping the count. ++The default @i{type} is @i{implementation-dependent}; ++but it must be ++a @i{supertype} of @i{type} @b{fixnum}. ++ ++The @t{maximize} and ++@t{minimize} ++constructs compare ++the value of the supplied @i{form} obtained during the first ++iteration with values obtained in successive iterations. ++The maximum (for @t{maximize}) or minimum (for @t{minimize}) ++value encountered is determined ++(as if by the @i{function} @b{max} for @t{maximize} and ++ as if by the @i{function} @b{min} for @t{minimize}) ++and returned. ++If the @t{maximize} or @t{minimize} clause ++is never executed, the accumulated value is unspecified. ++The argument @i{var} accumulates the maximum or minimum value; ++if @i{var} is supplied, ++@b{loop} does not return the maximum or minimum automatically. ++The @i{var} argument is bound as if by the construct @t{with}. ++If @t{into} @i{var} is used, ++a @i{type} can be supplied for @i{var} with the @i{type-spec} argument; ++the consequences are unspecified if a nonnumeric @i{type} is supplied. ++If there is no @t{into} variable, ++the optional @i{type-spec} argument applies to the internal variable ++that is keeping the maximum or minimum value. ++The default @i{type} ++is @i{implementation-dependent}; but it ++must be a @i{supertype} of @i{type} @b{real}. ++ ++The @t{sum} construct forms a cumulative sum ++of the successive @i{primary values} of the supplied @i{form} ++at each iteration. ++The argument @i{var} is used to accumulate the sum; ++if @i{var} is supplied, ++@b{loop} does not return the final sum automatically. ++The @i{var} argument is bound as if by the construct @t{with} ++to a zero of the appropriate type. ++Subsequent values (including any necessary coercions) are computed as if by the @i{function} @b{+}. ++If @t{into} @i{var} is used, ++a @i{type} can be supplied for @i{var} with the @i{type-spec} argument; ++the consequences are unspecified if a nonnumeric @i{type} is supplied. ++If there is no @t{into} variable, ++the optional @i{type-spec} argument applies to the internal variable ++that is keeping the sum. ++The default @i{type} ++is @i{implementation-dependent}; but it ++must be a @i{supertype} of @i{type} @b{number}. ++ ++If @t{into} is used, ++the construct does not provide a default return value; ++however, the variable is available ++for use in any @t{finally} clause. ++ ++Certain kinds of accumulation clauses can be combined in a @b{loop} ++if their destination is the same ++(the result of @b{loop} or an @t{into} @i{var}) ++because they are considered to accumulate conceptually compatible quantities. ++In particular, ++any elements of following sets of accumulation clauses can be mixed ++with other elements of the same set for the same destination ++in a @b{loop} @i{form}: ++ ++@table @asis ++ ++@item @t{*} ++@t{collect}, @t{append}, @t{nconc} ++ ++@item @t{*} ++@t{sum}, @t{count} ++ ++@item @t{*} ++@t{maximize}, @t{minimize} ++@end table ++ ++@example ++;; Collect every name and the kids in one list by using ++;; COLLECT and APPEND. ++ (loop for name in '(fred sue alice joe june) ++ for kids in '((bob ken) () () (kris sunshine) ()) ++ collect name ++ append kids) ++@result{} (FRED BOB KEN SUE ALICE JOE KRIS SUNSHINE JUNE) ++@end example ++ ++Any two ++clauses that do not accumulate the same @i{type} of ++@i{object} ++can coexist in a @b{loop} only ++if each clause accumulates its values into ++a different ++@i{variable}. ++ ++@menu ++* Examples of COLLECT clause:: ++* Examples of APPEND and NCONC clauses:: ++* Examples of COUNT clause:: ++* Examples of MAXIMIZE and MINIMIZE clauses:: ++* Examples of SUM clause:: ++@end menu ++ ++@node Examples of COLLECT clause, Examples of APPEND and NCONC clauses, Value Accumulation Clauses, Value Accumulation Clauses ++@subsubsection Examples of COLLECT clause ++ ++@example ++;; Collect all the symbols in a list. ++ (loop for i in '(bird 3 4 turtle (1 . 4) horse cat) ++ when (symbolp i) collect i) ++@result{} (BIRD TURTLE HORSE CAT) ++ ++;; Collect and return odd numbers. ++ (loop for i from 1 to 10 ++ if (oddp i) collect i) ++@result{} (1 3 5 7 9) ++ ++;; Collect items into local variable, but don't return them. ++ (loop for i in '(a b c d) by #'cddr ++ collect i into my-list ++ finally (print my-list)) ++@t{ |> } (A C) ++@result{} NIL ++@end example ++ ++@node Examples of APPEND and NCONC clauses, Examples of COUNT clause, Examples of COLLECT clause, Value Accumulation Clauses ++@subsubsection Examples of APPEND and NCONC clauses ++ ++@example ++;; Use APPEND to concatenate some sublists. ++ (loop for x in '((a) (b) ((c))) ++ append x) ++@result{} (A B (C)) ++ ++;; NCONC some sublists together. Note that only lists made by the ++;; call to LIST are modified. ++ (loop for i upfrom 0 ++ as x in '(a b (c)) ++ nconc (if (evenp i) (list x) nil)) ++@result{} (A (C)) ++@end example ++ ++@node Examples of COUNT clause, Examples of MAXIMIZE and MINIMIZE clauses, Examples of APPEND and NCONC clauses, Value Accumulation Clauses ++@subsubsection Examples of COUNT clause ++ ++@example ++ (loop for i in '(a b nil c nil d e) ++ count i) ++@result{} 5 ++@end example ++ ++@node Examples of MAXIMIZE and MINIMIZE clauses, Examples of SUM clause, Examples of COUNT clause, Value Accumulation Clauses ++@subsubsection Examples of MAXIMIZE and MINIMIZE clauses ++ ++@example ++ (loop for i in '(2 1 5 3 4) ++ maximize i) ++@result{} 5 ++ (loop for i in '(2 1 5 3 4) ++ minimize i) ++@result{} 1 ++ ++;; In this example, FIXNUM applies to the internal variable that holds ++;; the maximum value. ++ (setq series '(1.2 4.3 5.7)) ++@result{} (1.2 4.3 5.7) ++ (loop for v in series ++ maximize (round v) of-type fixnum) ++@result{} 6 ++ ++;; In this example, FIXNUM applies to the variable RESULT. ++ (loop for v of-type float in series ++ minimize (round v) into result of-type fixnum ++ finally (return result)) ++@result{} 1 ++@end example ++ ++@node Examples of SUM clause, , Examples of MAXIMIZE and MINIMIZE clauses, Value Accumulation Clauses ++@subsubsection Examples of SUM clause ++ ++@example ++ (loop for i of-type fixnum in '(1 2 3 4 5) ++ sum i) ++@result{} 15 ++ (setq series '(1.2 4.3 5.7)) ++@result{} (1.2 4.3 5.7) ++ (loop for v in series ++ sum (* 2.0 v)) ++@result{} 22.4 ++@end example ++ ++@node Termination Test Clauses, Unconditional Execution Clauses, Value Accumulation Clauses, The LOOP Facility ++@subsection Termination Test Clauses ++ ++The @t{repeat} construct causes iteration to terminate after a ++specified number of times. ++ The loop body executes @i{n} times, where @i{n} is the value ++of the expression @i{form}. The @i{form} argument is evaluated one time ++in the loop prologue. If the expression evaluates to 0 or ++to a negative @i{number}, the loop body is not evaluated. ++ ++The constructs @t{always}, ++@t{never}, ++@t{thereis}, ++@t{while}, ++@t{until}, ++and the macro @b{loop-finish} ++allow conditional termination of iteration within ++a @b{loop}. ++ ++The constructs @t{always}, @t{never}, and @t{thereis} provide ++specific values to be returned when a @b{loop} terminates. ++Using @t{always}, @t{never}, or @t{thereis} in a loop with ++value accumulation clauses that are not @t{into} causes ++an error of @i{type} @b{program-error} to be signaled (at macro expansion time). ++Since @t{always}, @t{never}, and @t{thereis} ++use ++ ++the @b{return-from} @i{special operator} ++ ++to terminate iteration, ++any @t{finally} clause that is supplied is not evaluated ++when exit occurs due to any of these constructs. ++In all other respects these ++constructs behave like the @t{while} and @t{until} constructs. ++ ++ The @t{always} construct takes one @i{form} and terminates the ++@b{loop} ++ if the @i{form} ever evaluates to @b{nil}; in this case, it returns ++ @b{nil}. Otherwise, it provides a default return value of @b{t}. ++If the value of the supplied @i{form} is never @b{nil}, some other construct ++can terminate the iteration. ++ ++The @t{never} construct terminates iteration the first time that ++the value of the supplied @i{form} is @i{non-nil}; the @b{loop} returns ++@b{nil}. ++If the value of the supplied @i{form} is always @b{nil}, some other ++construct can terminate the iteration. ++Unless some other clause contributes ++a return value, the default value returned is @b{t}. ++ ++The @t{thereis} construct terminates iteration the first time that the ++value of the supplied @i{form} is @i{non-nil}; the @b{loop} returns the ++value of the supplied @i{form}. ++If the value of the supplied @i{form} ++is always @b{nil}, some other ++construct can terminate the iteration. Unless some other clause contributes a ++return value, the default value returned is @b{nil}. ++ ++There are two differences between the @t{thereis} and @t{until} ++constructs: ++ ++@table @asis ++ ++@item @t{*} ++The @t{until} construct does not return a value or ++@b{nil} based on the value of the supplied @i{form}. ++ ++@item @t{*} ++The @t{until} construct executes ++any @t{finally} clause. ++Since @t{thereis} uses ++ ++the @b{return-from} @i{special operator} ++ ++to terminate iteration, ++any @t{finally} clause that is supplied is not evaluated ++when exit occurs due to @t{thereis}. ++ ++@end table ++ ++The @t{while} construct allows iteration to continue until the ++supplied @i{form} ++evaluates to @i{false}. The supplied @i{form} ++is reevaluated at the location of the @t{while} clause. ++ ++The @t{until} construct is equivalent to ++@t{while (not @i{form})\dots}. If the value of the ++supplied @i{form} is @i{non-nil}, iteration terminates. ++ ++Termination-test control constructs can be used anywhere within the loop body. ++The termination tests are used in the order in which they appear. ++If an @t{until} or @t{while} clause causes ++termination, any clauses that precede it in the source ++are still evaluated. ++If the @t{until} and @t{while} constructs cause termination, ++control is passed to the loop epilogue, where any @t{finally} ++clauses will be executed. ++ ++There are two differences between the @t{never} and @t{until} ++constructs: ++ ++@table @asis ++ ++@item @t{*} ++The @t{until} construct does not return ++@b{t} or @b{nil} based on the value of the supplied @i{form}. ++ ++@item @t{*} ++The @t{until} construct ++does not bypass any @t{finally} clauses. ++Since @t{never} uses ++ ++the @b{return-from} @i{special operator} ++ ++to terminate iteration, ++any @t{finally} clause that is supplied is not evaluated ++when exit occurs due to @t{never}. ++@end table ++ ++In most cases it is not necessary to use @b{loop-finish} ++because other loop control clauses terminate the @b{loop}. ++The macro @b{loop-finish} is used to provide a normal exit ++from a nested conditional inside a @b{loop}. ++Since @b{loop-finish} transfers control to the loop epilogue, ++using @b{loop-finish} within a @t{finally} expression can cause ++infinite looping. ++ ++@menu ++* Examples of REPEAT clause:: ++* Examples of ALWAYS:: ++* Examples of WHILE and UNTIL clauses:: ++@end menu ++ ++@node Examples of REPEAT clause, Examples of ALWAYS, Termination Test Clauses, Termination Test Clauses ++@subsubsection Examples of REPEAT clause ++ ++@example ++ (loop repeat 3 ++ do (format t "~&What I say three times is true.~ ++@t{ |> } What I say three times is true. ++@t{ |> } What I say three times is true. ++@t{ |> } What I say three times is true. ++@result{} NIL ++ (loop repeat -15 ++ do (format t "What you see is what you expect~ ++@result{} NIL ++@end example ++ ++@node Examples of ALWAYS, Examples of WHILE and UNTIL clauses, Examples of REPEAT clause, Termination Test Clauses ++@subsubsection Examples of ALWAYS, NEVER, and THEREIS clauses ++ ++@example ++;; Make sure I is always less than 11 (two ways). ++;; The FOR construct terminates these loops. ++ (loop for i from 0 to 10 ++ always (< i 11)) ++@result{} T ++ (loop for i from 0 to 10 ++ never (> i 11)) ++@result{} T ++ ++;; If I exceeds 10 return I; otherwise, return NIL. ++;; The THEREIS construct terminates this loop. ++ (loop for i from 0 ++ thereis (when (> i 10) i) ) ++@result{} 11 ++ ++;;; The FINALLY clause is not evaluated in these examples. ++ (loop for i from 0 to 10 ++ always (< i 9) ++ finally (print "you won't see this")) ++@result{} NIL ++ (loop never t ++ finally (print "you won't see this")) ++@result{} NIL ++ (loop thereis "Here is my value" ++ finally (print "you won't see this")) ++@result{} "Here is my value" ++ ++;; The FOR construct terminates this loop, so the FINALLY clause ++;; is evaluated. ++ (loop for i from 1 to 10 ++ thereis (> i 11) ++ finally (prin1 'got-here)) ++@t{ |> } GOT-HERE ++@result{} NIL ++ ++;; If this code could be used to find a counterexample to Fermat's ++;; last theorem, it would still not return the value of the ++;; counterexample because all of the THEREIS clauses in this example ++;; only return T. But if Fermat is right, that won't matter ++;; because this won't terminate. ++ ++ (loop for z upfrom 2 ++ thereis ++ (loop for n upfrom 3 below (log z 2) ++ thereis ++ (loop for x below z ++ thereis ++ (loop for y below z ++ thereis (= (+ (expt x n) (expt y n)) ++ (expt z n)))))) ++@end example ++ ++@node Examples of WHILE and UNTIL clauses, , Examples of ALWAYS, Termination Test Clauses ++@subsubsection Examples of WHILE and UNTIL clauses ++ ++@example ++ (loop while (hungry-p) do (eat)) ++ ++;; UNTIL NOT is equivalent to WHILE. ++ (loop until (not (hungry-p)) do (eat)) ++ ++;; Collect the length and the items of STACK. ++ (let ((stack '(a b c d e f))) ++ (loop for item = (length stack) then (pop stack) ++ collect item ++ while stack)) ++@result{} (6 A B C D E F) ++ ++;; Use WHILE to terminate a loop that otherwise wouldn't terminate. ++;; Note that WHILE occurs after the WHEN. ++ (loop for i fixnum from 3 ++ when (oddp i) collect i ++ while (< i 5)) ++@result{} (3 5) ++@end example ++ ++@node Unconditional Execution Clauses, Conditional Execution Clauses, Termination Test Clauses, The LOOP Facility ++@subsection Unconditional Execution Clauses ++ ++The @t{do} and @t{doing} constructs ++evaluate the ++supplied @i{forms} ++wherever they occur in the expanded form of @b{loop}. ++ The @i{form} argument can be any @i{compound form}. ++Each @i{form} is evaluated in every iteration. ++Because every loop clause must begin with a @i{loop keyword}, ++the keyword @t{do} is used when no control action other than execution is ++required. ++ ++ The @t{return} construct takes one @i{form}. ++ Any @i{values} returned by the @i{form} ++ are immediately returned by the @b{loop} form. ++ It is equivalent to the clause ++ @t{do (return-from @i{block-name} @i{value})}, ++ where @i{block-name} is the name specified in a @t{named} ++ clause, or @b{nil} if there is no @t{named} clause. ++ ++@menu ++* Examples of unconditional execution:: ++@end menu ++ ++@node Examples of unconditional execution, , Unconditional Execution Clauses, Unconditional Execution Clauses ++@subsubsection Examples of unconditional execution ++ ++@example ++;; Print numbers and their squares. ++;; The DO construct applies to multiple forms. ++ (loop for i from 1 to 3 ++ do (print i) ++ (print (* i i))) ++@t{ |> } 1 ++@t{ |> } 1 ++@t{ |> } 2 ++@t{ |> } 4 ++@t{ |> } 3 ++@t{ |> } 9 ++@result{} NIL ++ ++@end example ++ ++@node Conditional Execution Clauses, Miscellaneous Clauses, Unconditional Execution Clauses, The LOOP Facility ++@subsection Conditional Execution Clauses ++ ++The @t{if}, @t{when}, and @t{unless} constructs ++establish conditional control in a @b{loop}. If the test ++passes, the succeeding loop clause is executed. If the test does ++not pass, the succeeding clause is skipped, and program control ++moves to the clause that follows the @i{loop keyword} ++@t{else}. If the test does not pass and no @t{else} ++clause is supplied, control is transferred to the clause or ++construct following the entire conditional clause. ++ ++If conditional clauses are nested, each @t{else} is paired ++with the closest preceding conditional clause that has no ++associated @t{else} or @t{end}. ++ ++In the @t{if} and @t{when} clauses, which are ++synonymous, the test passes if the value of @i{form} is ++@i{true}. ++ ++In the @t{unless} clause, ++the test passes if the value of @i{form} is @i{false}. ++ ++Clauses that follow the test expression can be grouped by using ++the @i{loop keyword} @t{and} to produce a conditional block consisting of ++a compound clause. ++ ++The @i{loop keyword} @t{it} can be used to refer to the result ++of the test expression in a clause. ++Use the @i{loop keyword} @t{it} in place of the form in a ++@t{return} clause or an @i{accumulation} clause that is ++inside a conditional execution clause. ++If multiple clauses are connected with @t{and}, the @t{it} ++construct must be in the first clause in the block. ++ ++The optional @i{loop keyword} @t{end} marks the end of the clause. If this ++keyword is not supplied, the next @i{loop keyword} marks the end. The construct ++@t{end} can be used to distinguish the scoping of compound clauses. ++ ++@menu ++* Examples of WHEN clause:: ++@end menu ++ ++@node Examples of WHEN clause, , Conditional Execution Clauses, Conditional Execution Clauses ++@subsubsection Examples of WHEN clause ++ ++@example ++;; Signal an exceptional condition. ++ (loop for item in '(1 2 3 a 4 5) ++ when (not (numberp item)) ++ return (cerror "enter new value" "non-numeric value: ~s" item)) ++Error: non-numeric value: A ++ ++;; The previous example is equivalent to the following one. ++ (loop for item in '(1 2 3 a 4 5) ++ when (not (numberp item)) ++ do (return ++ (cerror "Enter new value" "non-numeric value: ~s" item))) ++Error: non-numeric value: A ++@end example ++ ++@example ++;; This example parses a simple printed string representation from ++;; BUFFER (which is itself a string) and returns the index of the ++;; closing double-quote character. ++ (let ((buffer "\"a\" \"b\"")) ++ (loop initially (unless (char= (char buffer 0) #\") ++ (loop-finish)) ++ for i of-type fixnum from 1 below (length (the string buffer)) ++ when (char= (char buffer i) #\") ++ return i)) ++@result{} 2 ++ ++;; The collected value is returned. ++ (loop for i from 1 to 10 ++ when (> i 5) ++ collect i ++ finally (prin1 'got-here)) ++@t{ |> } GOT-HERE ++@result{} (6 7 8 9 10) ++ ++;; Return both the count of collected numbers and the numbers. ++ (loop for i from 1 to 10 ++ when (> i 5) ++ collect i into number-list ++ and count i into number-count ++ finally (return (values number-count number-list))) ++@result{} 5, (6 7 8 9 10) ++@end example ++ ++@node Miscellaneous Clauses, Examples of Miscellaneous Loop Features, Conditional Execution Clauses, The LOOP Facility ++@subsection Miscellaneous Clauses ++ ++@menu ++* Control Transfer Clauses:: ++* Examples of NAMED clause:: ++* Initial and Final Execution:: ++@end menu ++ ++@node Control Transfer Clauses, Examples of NAMED clause, Miscellaneous Clauses, Miscellaneous Clauses ++@subsubsection Control Transfer Clauses ++ ++The @t{named} construct ++establishes a name for an @i{implicit block} surrounding the ++ ++entire ++ ++@b{loop} so that the @b{return-from} @i{special operator} can be used to return ++values from or to exit @b{loop}. ++Only one name per @b{loop} @i{form} can be assigned. ++If used, the @t{named} construct must be the first clause in the loop expression. ++ ++ The @t{return} construct takes one @i{form}. ++ Any @i{values} returned by the @i{form} ++ are immediately returned by the @b{loop} form. ++ ++This construct is similar to the @b{return-from} @i{special operator} and the @b{return} @i{macro}. ++The @t{return} construct ++ ++does not execute any @t{finally} clause that ++ ++the @b{loop} @i{form} ++ ++is given. ++ ++@node Examples of NAMED clause, Initial and Final Execution, Control Transfer Clauses, Miscellaneous Clauses ++@subsubsection Examples of NAMED clause ++ ++@example ++;; Just name and return. ++ (loop named max ++ for i from 1 to 10 ++ do (print i) ++ do (return-from max 'done)) ++@t{ |> } 1 ++@result{} DONE ++@end example ++ ++@node Initial and Final Execution, , Examples of NAMED clause, Miscellaneous Clauses ++@subsubsection Initial and Final Execution ++ ++The @t{initially} and @t{finally} constructs ++evaluate forms that occur before and after the loop body. ++ ++The @t{initially} construct causes the supplied ++@i{compound-forms} ++to be evaluated ++in the loop prologue, which precedes all loop code except for ++initial settings supplied by constructs @t{with}, @t{for}, or ++@t{as}. ++ The code for any @t{initially} clauses is ++executed ++in the order in which the clauses appeared in ++ the @b{loop}. ++ ++The @t{finally} construct causes the supplied ++@i{compound-forms} ++to be evaluated ++in the loop epilogue after normal iteration terminates. ++ The code for any @t{finally} clauses is ++executed ++ in the order in which the clauses appeared in ++ the @b{loop}. The collected code is executed once in the loop epilogue ++ before any implicit values are returned from the accumulation clauses. ++An explicit transfer of control (@i{e.g.}, by @b{return}, @b{go}, or @b{throw}) ++from the loop body, however, will exit the ++ @b{loop} without executing the epilogue code. ++ ++Clauses such as @t{return}, @t{always}, @t{never}, and ++@t{thereis} ++can bypass the @t{finally} clause. ++ ++@b{return} (or @b{return-from}, if the @t{named} option was supplied) ++ ++can be used after @t{finally} to return values from a @b{loop}. ++ ++Such an @i{explicit return} ++ ++inside the ++@t{finally} clause takes precedence over returning the accumulation ++from clauses supplied by such keywords as @t{collect}, @t{nconc}, ++@t{append}, @t{sum}, @t{count}, @t{maximize}, and ++@t{minimize}; ++the accumulation values for these preempted clauses are not returned by ++@b{loop} if @b{return} or @b{return-from} is used. ++ ++@node Examples of Miscellaneous Loop Features, Notes about Loop, Miscellaneous Clauses, The LOOP Facility ++@subsection Examples of Miscellaneous Loop Features ++ ++@example ++ (let ((i 0)) ; no loop keywords are used ++ (loop (incf i) (if (= i 3) (return i)))) @result{} 3 ++ (let ((i 0)(j 0)) ++ (tagbody ++ (loop (incf j 3) (incf i) (if (= i 3) (go exit))) ++ exit) ++ j) @result{} 9 ++@end example ++ ++In the following example, the variable @t{x} is stepped ++before @t{y} is stepped; thus, the value of @t{y} ++reflects the updated value of @t{x}: ++ ++@example ++ (loop for x from 1 to 10 ++ for y = nil then x ++ collect (list x y)) ++@result{} ((1 NIL) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10)) ++@end example ++ ++In this example, @t{x} and @t{y} are stepped in @i{parallel}: ++ ++@example ++ (loop for x from 1 to 10 ++ and y = nil then x ++ collect (list x y)) ++@result{} ((1 NIL) (2 1) (3 2) (4 3) (5 4) (6 5) (7 6) (8 7) (9 8) (10 9)) ++@end example ++ ++@menu ++* Examples of clause grouping:: ++@end menu ++ ++@node Examples of clause grouping, , Examples of Miscellaneous Loop Features, Examples of Miscellaneous Loop Features ++@subsubsection Examples of clause grouping ++ ++@example ++;; Group conditional clauses. ++ (loop for i in '(1 324 2345 323 2 4 235 252) ++ when (oddp i) ++ do (print i) ++ and collect i into odd-numbers ++ and do (terpri) ++ else ; I is even. ++ collect i into even-numbers ++ finally ++ (return (values odd-numbers even-numbers))) ++@t{ |> } 1 ++@t{ |> } ++@t{ |> } 2345 ++@t{ |> } ++@t{ |> } 323 ++@t{ |> } ++@t{ |> } 235 ++@result{} (1 2345 323 235), (324 2 4 252) ++ ++;; Collect numbers larger than 3. ++ (loop for i in '(1 2 3 4 5 6) ++ when (and (> i 3) i) ++ collect it) ; IT refers to (and (> i 3) i). ++@result{} (4 5 6) ++ ++;; Find a number in a list. ++ (loop for i in '(1 2 3 4 5 6) ++ when (and (> i 3) i) ++ return it) ++@result{} 4 ++ ++;; The above example is similar to the following one. ++ (loop for i in '(1 2 3 4 5 6) ++ thereis (and (> i 3) i)) ++@result{} 4 ++ ++;; Nest conditional clauses. ++ (let ((list '(0 3.0 apple 4 5 9.8 orange banana))) ++ (loop for i in list ++ when (numberp i) ++ when (floatp i) ++ collect i into float-numbers ++ else ; Not (floatp i) ++ collect i into other-numbers ++ else ; Not (numberp i) ++ when (symbolp i) ++ collect i into symbol-list ++ else ; Not (symbolp i) ++ do (error "found a funny value in list ~S, value ~S~ ++ finally (return (values float-numbers other-numbers symbol-list)))) ++@result{} (3.0 9.8), (0 4 5), (APPLE ORANGE BANANA) ++ ++;; Without the END preposition, the last AND would apply to the ++;; inner IF rather than the outer one. ++ (loop for x from 0 to 3 ++ do (print x) ++ if (zerop (mod x 2)) ++ do (princ " a") ++ and if (zerop (floor x 2)) ++ do (princ " b") ++ end ++ and do (princ " c")) ++@t{ |> } 0 a b c ++@t{ |> } 1 ++@t{ |> } 2 a c ++@t{ |> } 3 ++@result{} NIL ++@end example ++ ++@node Notes about Loop, , Examples of Miscellaneous Loop Features, The LOOP Facility ++@subsection Notes about Loop ++ ++@i{Types} can be supplied for loop variables. ++It is not necessary to supply a @i{type} for any variable, ++but supplying the @i{type} ++can ensure that the variable has a correctly typed initial value, ++and it can also enable compiler optimizations ++(depending on the @i{implementation}). ++ ++The clause @t{repeat} @i{n} ... is roughly equivalent to a clause such as ++ ++@example ++ (loop for @i{internal-variable} downfrom (- @i{n} 1) to 0 ...) ++@end example ++ ++but in some @i{implementations}, ++the @t{repeat} construct might be more efficient. ++ ++Within the executable parts of the loop clauses and around the entire ++@b{loop} form, variables can be bound by using @b{let}. ++ ++Use caution when using a variable named @t{IT} (in any @i{package}) ++in connection with @b{loop}, since @t{it} is a @i{loop keyword} ++that can be used in place of a @i{form} in certain contexts. ++ ++There is ++ ++no ++ ++@i{standardized} ++mechanism for users to add ++extensions to @b{loop}. ++ ++@c end of including concept-loop ++ ++@node Iteration Dictionary, , The LOOP Facility, Iteration ++@section Iteration Dictionary ++ ++@c including dict-iteration ++ ++@menu ++* do:: ++* dotimes:: ++* dolist:: ++* loop:: ++* loop-finish:: ++@end menu ++ ++@node do, dotimes, Iteration Dictionary, Iteration Dictionary ++@subsection do, do* [Macro] ++ ++@code{do} @i{@r{(}@{@i{var} | @r{(}@i{var} @r{[}init-form @r{[}step-form@r{]}@r{]}@r{)}@}*@r{)} ++ @r{(}end-test-form @{@i{result-form}@}*@r{)} ++ @{@i{declaration}@}* @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@code{do*} @i{@r{(}@{@i{var} | @r{(}@i{var} @r{[}init-form @r{[}step-form@r{]}@r{]}@r{)}@}*@r{)} ++ @r{(}end-test-form @r{@{@i{result-form}@}*}@r{)} ++ @{@i{declaration}@}* @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol}. ++ ++@i{init-form}---a @i{form}. ++ ++@i{step-form}---a @i{form}. ++ ++@i{end-test-form}---a @i{form}. ++ ++@i{result-forms}---an @i{implicit progn}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{tag}---a @i{go tag}; not evaluated. ++ ++@i{statement}---a @i{compound form}; evaluated as described below. ++ ++@i{results}---if a @b{return} or @b{return-from} form is executed, ++ the @i{values} passed from that @i{form}; ++ otherwise, the @i{values} returned by the @i{result-forms}. ++ ++@subsubheading Description:: ++ ++@b{do} iterates over a group of @i{statements} ++while a test condition holds. ++@b{do} accepts an arbitrary number of iteration @i{vars} ++which are bound within the iteration and stepped in parallel. ++An initial value may be supplied for each iteration variable by use of ++an @i{init-form}. ++@i{Step-forms} may be used to specify how the ++@i{vars} should be updated on succeeding iterations through the loop. ++@i{Step-forms} may be used both to generate successive ++values or to accumulate results. ++If the @i{end-test-form} condition ++is met prior to an execution of the body, the iteration terminates. ++@i{Tags} label @i{statements}. ++ ++@b{do*} is exactly like @b{do} ++except that the @i{bindings} and steppings ++of the @i{vars} are performed sequentially rather than in parallel. ++ ++Before the first iteration, all the @i{init-forms} are evaluated, and ++each @i{var} is bound to the value of its respective @i{init-form}, ++if supplied. ++This is a @i{binding}, not an assignment; when the loop terminates, ++the old values of those variables will be restored. ++For @b{do}, all ++of the @i{init-forms} are evaluated before any @i{var} ++is bound. The ++@i{init-forms} can refer to the @i{bindings} of the @i{vars} ++visible before beginning execution of ++@b{do}. ++For @b{do*}, the first @i{init-form} is evaluated, then the first ++@i{var} is bound to that value, then the second @i{init-form} ++is evaluated, then the second @i{var} is bound, and so on; ++in general, the @i{k}th @i{init-form} can refer to the new binding ++of the @i{j}th @i{var} if @i{j} < @i{k}, and otherwise to the ++old binding of the @i{j}th @i{var}. ++ ++At the beginning of each iteration, after processing the variables, ++the @i{end-test-form} is evaluated. If the result is ++@i{false}, execution proceeds with the body of the @b{do} ++(or @b{do*}) form. ++If the result is @i{true}, the @i{result-forms} are evaluated in order ++as an @i{implicit progn}, ++and then @b{do} or @b{do*} returns. ++ ++At the beginning of each iteration other than the first, ++@i{vars} are updated as follows. All the @i{step-forms}, if supplied, ++are evaluated, from left to right, and the resulting values are ++assigned to the respective @i{vars}. ++Any @i{var} that has no associated @i{step-form} is not assigned to. ++For @b{do}, all the @i{step-forms} are evaluated before any @i{var} ++is updated; the assignment of values to @i{vars} is done in parallel, ++as if by @b{psetq}. ++Because all of the @i{step-forms} are evaluated before any ++of the @i{vars} are altered, a @i{step-form} when evaluated always has ++access to the old values of all the @i{vars}, even if other @i{step-forms} ++precede it. ++For @b{do*}, the first @i{step-form} is evaluated, then the ++value is assigned to the first @i{var}, then the second @i{step-form} ++is evaluated, then the value is assigned to the second @i{var}, and so on; ++the assignment of values to variables is done sequentially, ++as if by @b{setq}. ++For either @b{do} or @b{do*}, ++after the @i{vars} have been updated, ++the @i{end-test-form} ++is evaluated as described above, and the iteration continues. ++ ++The remainder of the @b{do} (or @b{do*}) form constitutes ++an @i{implicit tagbody}. ++@i{Tags} may appear within the body of a @b{do} loop ++for use by @b{go} statements appearing in the body (but such @b{go} ++statements may not appear in the variable specifiers, the @i{end-test-form}, ++or the @i{result-forms}). ++When the end of a @b{do} body is reached, the next iteration cycle ++(beginning with the evaluation of @i{step-forms}) occurs. ++ ++An @i{implicit block} named @b{nil} surrounds the entire @b{do} ++(or @b{do*}) form. ++A @b{return} statement may be used at any point to exit the loop ++immediately. ++ ++@i{Init-form} is an ++initial value for the @i{var} with which it is associated. ++If @i{init-form} is omitted, the initial value of @i{var} is @b{nil}. ++If a @i{declaration} is supplied for a @i{var}, @i{init-form} ++must be consistent with the @i{declaration}. ++ ++@i{Declarations} can appear at the beginning of a @b{do} ++(or @b{do*}) body. ++They apply to code in the @b{do} (or @b{do*}) body, ++to the @i{bindings} of the @b{do} (or @b{do*}) ++@i{vars}, ++to the @i{step-forms}, ++to the @i{end-test-form}, and to the @i{result-forms}. ++ ++@subsubheading Examples:: ++@example ++ (do ((temp-one 1 (1+ temp-one)) ++ (temp-two 0 (1- temp-two))) ++ ((> (- temp-one temp-two) 5) temp-one)) @result{} 4 ++ ++ (do ((temp-one 1 (1+ temp-one)) ++ (temp-two 0 (1+ temp-one))) ++ ((= 3 temp-two) temp-one)) @result{} 3 ++ ++ (do* ((temp-one 1 (1+ temp-one)) ++ (temp-two 0 (1+ temp-one))) ++ ((= 3 temp-two) temp-one)) @result{} 2 ++ ++ (do ((j 0 (+ j 1))) ++ (nil) ;Do forever. ++ (format t "~ ++ (let ((item (read))) ++ (if (null item) (return) ;Process items until NIL seen. ++ (format t "~&Output ~D: ~S" j item)))) ++@t{ |> } Input 0: @b{|>>}@t{banana}@b{<<|} ++@t{ |> } Output 0: BANANA ++@t{ |> } Input 1: @b{|>>}@t{(57 boxes)}@b{<<|} ++@t{ |> } Output 1: (57 BOXES) ++@t{ |> } Input 2: @b{|>>}@t{NIL}@b{<<|} ++@result{} NIL ++ ++ (setq a-vector (vector 1 nil 3 nil)) ++ (do ((i 0 (+ i 1)) ;Sets every null element of a-vector to zero. ++ (n (array-dimension a-vector 0))) ++ ((= i n)) ++ (when (null (aref a-vector i)) ++ (setf (aref a-vector i) 0))) @result{} NIL ++a-vector @result{} #(1 0 3 0) ++@end example ++ ++@example ++ (do ((x e (cdr x)) ++ (oldx x x)) ++ ((null x)) ++ body) ++@end example ++ ++is an example of parallel assignment to index variables. On the first ++iteration, the value of @t{oldx} is whatever value @t{x} had before ++the @b{do} was entered. On succeeding iterations, @t{oldx} contains ++the value that @t{x} had on the previous iteration. ++ ++@example ++ (do ((x foo (cdr x)) ++ (y bar (cdr y)) ++ (z '() (cons (f (car x) (car y)) z))) ++ ((or (null x) (null y)) ++ (nreverse z))) ++@end example ++ ++does the same thing as @t{(mapcar #'f foo bar)}. The step ++computation for @t{z} is an example of the fact that variables ++are stepped in parallel. ++Also, the body of the loop is empty. ++ ++@example ++ (defun list-reverse (list) ++ (do ((x list (cdr x)) ++ (y '() (cons (car x) y))) ++ ((endp x) y))) ++@end example ++ ++As an example of nested iterations, consider a data structure that is a ++@i{list} of @i{conses}. The @i{car} of each @i{cons} is a ++@i{list} of @i{symbols}, ++and the @i{cdr} of each @i{cons} is a ++@i{list} of equal length containing ++corresponding values. Such a data structure is similar to an association ++list, ++but is divided into ``frames''; the overall structure resembles a rib-cage. ++A lookup function on such a data structure might be: ++ ++@example ++ (defun ribcage-lookup (sym ribcage) ++ (do ((r ribcage (cdr r))) ++ ((null r) nil) ++ (do ((s (caar r) (cdr s)) ++ (v (cdar r) (cdr v))) ++ ((null s)) ++ (when (eq (car s) sym) ++ (return-from ribcage-lookup (car v)))))) @result{} RIBCAGE-LOOKUP ++@end example ++ ++@subsubheading See Also:: ++ ++other iteration functions ++ ( ++@ref{dolist} ++, ++@ref{dotimes} ++, and ++@ref{loop} ++) ++and more primitive functionality ++ ( ++@ref{tagbody} ++, ++@ref{go} ++, ++@ref{block} ++, ++@ref{return} ++, ++ ++@ref{let} ++, and ++@ref{setq} ++) ++ ++@subsubheading Notes:: ++If @i{end-test-form} is @b{nil}, the test will never succeed. ++This provides an idiom for ``do forever'': ++the body of the @b{do} or @b{do*} ++is executed repeatedly. ++The infinite loop can be terminated by the use of @b{return}, ++@b{return-from}, @b{go} to an outer level, or @b{throw}. ++ ++A @b{do} @i{form} may be explained in terms of the more primitive @i{forms} ++@b{block}, @b{return}, ++@b{let}, @b{loop}, @b{tagbody}, ++and @b{psetq} as follows: ++ ++@example ++ (block nil ++ (let ((var1 init1) ++ (var2 init2) ++ ... ++ (varn initn)) ++ @i{declarations} ++ (loop (when end-test (return (progn . result))) ++ (tagbody . tagbody) ++ (psetq var1 step1 ++ var2 step2 ++ ... ++ varn stepn)))) ++@end example ++ ++@b{do*} is similar, except that @b{let*} and @b{setq} replace ++the @b{let} and @b{psetq}, respectively. ++ ++@node dotimes, dolist, do, Iteration Dictionary ++@subsection dotimes [Macro] ++ ++@code{dotimes} @i{@r{(}var count-form @r{[}result-form@r{]}@r{)} ++ @{@i{declaration}@}* ++ @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol}. ++ ++@i{count-form}---a @i{form}. ++ ++@i{result-form}---a @i{form}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{tag}---a @i{go tag}; not evaluated. ++ ++@i{statement}---a @i{compound form}; evaluated as described below. ++ ++@i{results}---if a @b{return} or @b{return-from} form is executed, ++ the @i{values} passed from that @i{form}; ++ otherwise, the @i{values} returned by the @i{result-form} ++ or @b{nil} if there is no @i{result-form}. ++ ++@subsubheading Description:: ++ ++@b{dotimes} iterates over a series of @i{integers}. ++ ++@b{dotimes} evaluates @i{count-form}, ++which should produce an @i{integer}. ++If @i{count-form} is zero or negative, ++the body is not executed. ++@b{dotimes} then executes the body once for each @i{integer} from 0 up to ++but not including ++the value of @i{count-form}, ++in the order in which the ++@i{tags} and @i{statements} occur, with ++@i{var} bound to each @i{integer}. ++Then @i{result-form} ++is evaluated. ++At the time @i{result-form} is processed, @i{var} is bound to ++the number of times the body was executed. ++@i{Tags} label ++@i{statements}. ++ ++An @i{implicit block} ++named @b{nil} surrounds @b{dotimes}. ++@b{return} may be used to terminate the loop immediately without ++performing any further iterations, returning zero or more @i{values}. ++ ++The body of the loop is an @i{implicit tagbody}; ++it may contain tags to serve as the targets of @b{go} statements. ++Declarations may appear before the body of the loop. ++ ++The @i{scope} of the binding of @i{var} ++does not include the @i{count-form}, ++but the @i{result-form} is included. ++ ++It is @i{implementation-dependent} whether @b{dotimes} ++@i{establishes} a new @i{binding} of @i{var} on each iteration ++or whether it @i{establishes} a binding for @i{var} once at the ++beginning and then @i{assigns} it on any subsequent iterations. ++ ++@subsubheading Examples:: ++ ++@example ++ (dotimes (temp-one 10 temp-one)) @result{} 10 ++ (setq temp-two 0) @result{} 0 ++ (dotimes (temp-one 10 t) (incf temp-two)) @result{} T ++ temp-two @result{} 10 ++@end example ++ ++Here is an example of the use of @t{dotimes} in processing strings: ++ ++@example ++;;; True if the specified subsequence of the string is a ++;;; palindrome (reads the same forwards and backwards). ++ (defun palindromep (string @t{&optional} ++ (start 0) ++ (end (length string))) ++ (dotimes (k (floor (- end start) 2) t) ++ (unless (char-equal (char string (+ start k)) ++ (char string (- end k 1))) ++ (return nil)))) ++ (palindromep "Able was I ere I saw Elba") @result{} T ++ (palindromep "A man, a plan, a canal--Panama!") @result{} NIL ++ (remove-if-not #'alpha-char-p ;Remove punctuation. ++ "A man, a plan, a canal--Panama!") ++@result{} "AmanaplanacanalPanama" ++ (palindromep ++ (remove-if-not #'alpha-char-p ++ "A man, a plan, a canal--Panama!")) @result{} T ++ (palindromep ++ (remove-if-not ++ #'alpha-char-p ++ "Unremarkable was I ere I saw Elba Kramer, nu?")) @result{} T ++ (palindromep ++ (remove-if-not ++ #'alpha-char-p ++ "A man, a plan, a cat, a ham, a yak, ++ a yam, a hat, a canal--Panama!")) @result{} T ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{do} ++, ++@ref{dolist} ++, ++@ref{tagbody} ++ ++@subsubheading Notes:: ++ ++@b{go} may be used within the body of ++@b{dotimes} to transfer control to a statement labeled by a @i{tag}. ++ ++@node dolist, loop, dotimes, Iteration Dictionary ++@subsection dolist [Macro] ++ ++@code{dolist} @i{@r{(}var list-form @r{[}result-form@r{]}@r{)} ++ @{@i{declaration}@}* ++ @{tag | statement@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{var}---a @i{symbol}. ++ ++@i{list-form}---a @i{form}. ++ ++@i{result-form}---a @i{form}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{tag}---a @i{go tag}; not evaluated. ++ ++@i{statement}---a @i{compound form}; evaluated as described below. ++ ++@i{results}---if a @b{return} or @b{return-from} form is executed, ++ the @i{values} passed from that @i{form}; ++ otherwise, the @i{values} returned by the @i{result-form} ++ or @b{nil} if there is no @i{result-form}. ++ ++@subsubheading Description:: ++ ++@b{dolist} iterates over the elements of a @i{list}. ++The body of @b{dolist} is like a @b{tagbody}. ++It consists of a series of @i{tags} and @i{statements}. ++ ++@b{dolist} ++evaluates @i{list-form}, ++which should produce a @i{list}. It then executes the body ++once for each element in the @i{list}, in the order in which the ++@i{tags} and @i{statements} occur, with ++@i{var} bound to the element. ++Then @i{result-form} ++is evaluated. ++@i{tags} label ++@i{statements}. ++ ++At the time @i{result-form} is processed, ++@i{var} is bound to @b{nil}. ++ ++An @i{implicit block} ++named @b{nil} surrounds @b{dolist}. ++@b{return} may be used to terminate the loop immediately without ++performing any further iterations, returning zero or more @i{values}. ++ ++The @i{scope} of the binding of @i{var} ++does not include the @i{list-form}, ++but the @i{result-form} is included. ++ ++It is @i{implementation-dependent} whether @b{dolist} ++@i{establishes} a new @i{binding} of @i{var} on each iteration ++or whether it @i{establishes} a binding for @i{var} once at the ++beginning and then @i{assigns} it on any subsequent iterations. ++ ++@subsubheading Examples:: ++@example ++ (setq temp-two '()) @result{} NIL ++ (dolist (temp-one '(1 2 3 4) temp-two) (push temp-one temp-two)) @result{} (4 3 2 1) ++ ++ (setq temp-two 0) @result{} 0 ++ (dolist (temp-one '(1 2 3 4)) (incf temp-two)) @result{} NIL ++ temp-two @result{} 4 ++ ++ (dolist (x '(a b c d)) (prin1 x) (princ " ")) ++@t{ |> } A B C D ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{do} ++, ++@ref{dotimes} ++, ++@ref{tagbody} ++, ++ ++@ref{Traversal Rules and Side Effects} ++ ++@subsubheading Notes:: ++ ++@b{go} may be used within the body of @b{dolist} ++to transfer control to a statement labeled by a @i{tag}. ++ ++@node loop, loop-finish, dolist, Iteration Dictionary ++@subsection loop [Macro] ++ ++The ``simple'' @b{loop} @i{form}: ++ ++@code{loop} @i{@{@i{compound-form}@}*} @result{} @i{@{@i{result}@}*} ++ ++The ``extended'' @b{loop} @i{form}: ++ ++@code{loop} @i{@r{[}!@i{name-clause}@r{]} ++ @{!@i{variable-clause}@}* ++ @{!@i{main-clause}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{name-clause} ::=@t{named} @i{name}} ++ ++@w{@i{variable-clause} ::=!@i{with-clause} | !@i{initial-final} | !@i{for-as-clause}} ++ ++@w{@i{with-clause} ::=@t{with} @i{var1} @r{[}@i{type-spec}@r{]} @r{[}= @i{form1}@r{]} @{@t{and} @i{var2} @r{[}@i{type-spec}@r{]} @r{[}= @i{form2}@r{]}@}*} ++ ++@w{@i{main-clause} ::=!@i{unconditional} | !@i{accumulation} | !@i{conditional} | !@i{termination-test} | !@i{initial-final}} ++ ++@w{@i{initial-final} ::=@t{initially} @{@i{compound-form}@}^+ | @t{finally} @{@i{compound-form}@}^+} ++ ++@w{@i{unconditional} ::=@{@t{do} | @t{doing}@} @{@i{compound-form}@}^+ | @t{return} @{@i{form} | @t{it}@}} ++ ++@w{@i{accumulation} ::=!@i{list-accumulation} | !@i{numeric-accumulation}} ++ ++@w{@i{list-accumulation} ::=@{@t{collect} | @t{collecting} | @t{append} | @t{appending} | @t{nconc} | @t{nconcing}@} @{@i{form} | @t{it}@} } ++@w{ @r{[}@t{into} @i{simple-var}@r{]}} ++ ++@w{@i{numeric-accumulation} ::=@{@t{count} | @t{counting} | @t{sum} | @t{summing} | @} ++@w{ @t{maximize} | @t{maximizing} | @t{minimize} | @t{minimizing}} @{@i{form} | @t{it}@} } ++@w{ @r{[}@t{into} @i{simple-var}@r{]} @r{[}@i{type-spec}@r{]}} ++ ++@w{@i{conditional} ::=@{@t{if} | @t{when} | @t{unless}@} @i{form} !@i{selectable-clause} @{@t{and} !@i{selectable-clause}@}* } ++@w{ @r{[}@t{else} !@i{selectable-clause} @{@t{and} !@i{selectable-clause}@}*@r{]} } ++@w{ @r{[}@t{end}@r{]}} ++ ++@w{@i{selectable-clause} ::=!@i{unconditional} | !@i{accumulation} | !@i{conditional}} ++ ++@w{@i{termination-test} ::=@t{while} @i{form} | @t{until} @i{form} | @t{repeat} @i{form} | @t{always} @i{form} | @t{never} @i{form} | @t{thereis} @i{form}} ++ ++@w{@i{for-as-clause} ::=@{@t{for} | @t{as}@} !@i{for-as-subclause} @{@t{and} !@i{for-as-subclause}@}*} ++ ++@w{@i{for-as-subclause} ::=!@i{for-as-arithmetic} | !@i{for-as-in-list} | !@i{for-as-on-list} | !@i{for-as-equals-then} |} ++@w{ !@i{for-as-across} | !@i{for-as-hash} | !@i{for-as-package}} ++ ++@w{@i{for-as-arithmetic} ::=@i{var} @r{[}@i{type-spec}@r{]} !@i{for-as-arithmetic-subclause}} ++ ++@w{@i{for-as-arithmetic-subclause} ::=!@i{arithmetic-up} | !@i{arithmetic-downto} | !@i{arithmetic-downfrom}} ++ ++@w{@i{arithmetic-up} ::=[[@{@t{from} | @t{upfrom}@} @i{form1} | @{@t{to} | @t{upto} | @t{below}@} @i{form2} | @t{by} @i{form3}]]^+} ++ ++@w{@i{arithmetic-downto} ::=[[@{@t{from} @i{form1}@}^1 | @{@{@t{downto} | @t{above}@} @i{form2}@}^1 | @t{by} @i{form3}]]} ++ ++@w{@i{arithmetic-downfrom} ::=[[@{@t{downfrom} @i{form1}@}^1 | @{@t{to} | @t{downto} | @t{above}@} @i{form2} | @t{by} @i{form3}]]} ++ ++@w{@i{for-as-in-list} ::=@i{var} @r{[}@i{type-spec}@r{]} @t{in} @i{form1} @r{[}@t{by} @i{step-fun}@r{]}} ++ ++@w{@i{for-as-on-list} ::=@i{var} @r{[}@i{type-spec}@r{]} @t{on} @i{form1} @r{[}@t{by} @i{step-fun}@r{]}} ++ ++@w{@i{for-as-equals-then} ::=@i{var} @r{[}@i{type-spec}@r{]} = @i{form1} @r{[}@t{then} @i{form2}@r{]}} ++ ++@w{@i{for-as-across} ::=@i{var} @r{[}@i{type-spec}@r{]} @t{across} @i{vector}} ++ ++@w{@i{for-as-hash} ::=@i{var} @r{[}@i{type-spec}@r{]} @t{being} @{@t{each} | @t{the}@} } ++@w{ @{@{@t{hash-key} | @t{hash-keys}@} @{@t{in} | @t{of}@} @i{hash-table} } ++@w{ @r{[}@t{using} @r{(}@t{hash-value} @i{other-var}@r{)}@r{]} | } ++@w{ @{@t{hash-value} | @t{hash-values}@} @{@t{in} | @t{of}@} @i{hash-table} } ++@w{ @r{[}@t{using} @r{(}@t{hash-key} @i{other-var}@r{)}@r{]}@}} ++ ++@w{@i{for-as-package} ::=@i{var} @r{[}@i{type-spec}@r{]} @t{being} @{@t{each} | @t{the}@} } ++@w{ @{@t{symbol} | @t{symbols} |} ++@w{ @t{present-symbol} | @t{present-symbols} |} ++@w{ @t{external-symbol} | @t{external-symbols}@} } ++@w{ @r{[}@{@t{in} | @t{of}@} @i{package}@r{]}} ++ ++@w{@i{type-spec} ::=!@i{simple-type-spec} | !@i{destructured-type-spec}} ++ ++@w{@i{simple-type-spec} ::=@b{fixnum} | @b{float} | @b{t} | @b{nil}} ++ ++@w{@i{destructured-type-spec} ::=@t{of-type} @i{d-type-spec}} ++ ++@w{@i{d-type-spec} ::=@i{type-specifier} | @t{(@i{d-type-spec} . @i{d-type-spec})}} ++ ++@w{@i{var} ::=!@i{d-var-spec}} ++ ++@w{@i{var1} ::=!@i{d-var-spec}} ++ ++@w{@i{var2} ::=!@i{d-var-spec}} ++ ++@w{@i{other-var} ::=!@i{d-var-spec}} ++ ++@w{@i{d-var-spec} ::=@i{simple-var} | @b{nil} | @r{(}!@i{d-var-spec} @t{.} !@i{d-var-spec}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{compound-form}---a @i{compound form}. ++ ++@i{name}---a @i{symbol}. ++ ++@i{simple-var}---a @i{symbol} (a @i{variable} name). ++ ++@i{form}, @i{form1}, @i{form2}, @i{form3}---a @i{form}. ++ ++@i{step-fun}---a @i{form} that evaluates to a @i{function} of one @i{argument}. ++ ++@i{vector}---a @i{form} that evaluates to a @i{vector}. ++ ++@i{hash-table}---a @i{form} that evaluates to a @i{hash table}. ++ ++@i{package}---a @i{form} that evaluates to a @i{package designator}. ++ ++@i{type-specifier}---a @i{type specifier}. ++ This might be either an @i{atomic type specifier} or a @i{compound type specifier}, ++ which introduces some additional complications to proper parsing in the face of ++ destructuring; for further information, see @ref{Destructuring}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++For details, see @ref{The LOOP Facility}. ++ ++@subsubheading Examples:: ++ ++@example ++;; An example of the simple form of LOOP. ++ (defun sqrt-advisor () ++ (loop (format t "~&Number: ") ++ (let ((n (parse-integer (read-line) :junk-allowed t))) ++ (when (not n) (return)) ++ (format t "~&The square root of ~D is ~D.~%" n (sqrt n))))) ++@result{} SQRT-ADVISOR ++ (sqrt-advisor) ++@t{ |> } Number: @b{|>>}@t{5 @t{@i{[<--}~]}}@b{<<|} ++@t{ |> } The square root of 5 is 2.236068. ++@t{ |> } Number: @b{|>>}@t{4 @t{@i{[<--}~]}}@b{<<|} ++@t{ |> } The square root of 4 is 2. ++@t{ |> } Number: @b{|>>}@t{done @t{@i{[<--}~]}}@b{<<|} ++@result{} NIL ++ ++;; An example of the extended form of LOOP. ++ (defun square-advisor () ++ (loop as n = (progn (format t "~&Number: ") ++ (parse-integer (read-line) :junk-allowed t)) ++ while n ++ do (format t "~&The square of ~D is ~D.~ ++@result{} SQUARE-ADVISOR ++ (square-advisor) ++@t{ |> } Number: @b{|>>}@t{4 @t{@i{[<--}~]}}@b{<<|} ++@t{ |> } The square of 4 is 16. ++@t{ |> } Number: @b{|>>}@t{23 @t{@i{[<--}~]}}@b{<<|} ++@t{ |> } The square of 23 is 529. ++@t{ |> } Number: @b{|>>}@t{done @t{@i{[<--}~]}}@b{<<|} ++@result{} NIL ++ ++;; Another example of the extended form of LOOP. ++ (loop for n from 1 to 10 ++ when (oddp n) ++ collect n) ++@result{} (1 3 5 7 9) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{do} ++, ++@ref{dolist} ++, ++@ref{dotimes} ++, ++@ref{return} ++, ++@ref{go} ++, ++@ref{throw} ++, ++@ref{Destructuring} ++ ++@subsubheading Notes:: ++ ++Except that @b{loop-finish} cannot be used within a simple @b{loop} @i{form}, ++a simple @b{loop} @i{form} is related to an extended @b{loop} @i{form} ++in the following way: ++ ++@example ++ (loop @{@i{compound-form}@}*) @equiv{} (loop do @{@i{compound-form}@}*) ++@end example ++ ++@node loop-finish, , loop, Iteration Dictionary ++@subsection loop-finish [Local Macro] ++ ++@subsubheading Syntax:: ++ ++@code{loop-finish} @i{<@i{no @i{arguments}}>} @result{} # ++ ++@subsubheading Description:: ++ ++The @b{loop-finish} @i{macro} can be used lexically within ++an extended ++@b{loop} @i{form} ++to terminate that @i{form} ``normally.'' ++That is, it transfers control to the loop epilogue ++of the lexically innermost extended @b{loop} @i{form}. ++This permits execution of any @b{finally} clause (for effect) ++and ++the return of ++any accumulated result. ++ ++@subsubheading Examples:: ++ ++@example ++;; Terminate the loop, but return the accumulated count. ++ (loop for i in '(1 2 3 stop-here 4 5 6) ++ when (symbolp i) do (loop-finish) ++ count i) ++@result{} 3 ++ ++;; The preceding loop is equivalent to: ++ (loop for i in '(1 2 3 stop-here 4 5 6) ++ until (symbolp i) ++ count i) ++@result{} 3 ++ ++;; While LOOP-FINISH can be used can be used in a variety of ++;; situations it is really most needed in a situation where a need ++;; to exit is detected at other than the loop's `top level' ++;; (where UNTIL or WHEN often work just as well), or where some ++;; computation must occur between the point where a need to exit is ++;; detected and the point where the exit actually occurs. For example: ++ (defun tokenize-sentence (string) ++ (macrolet ((add-word (wvar svar) ++ `(when ,wvar ++ (push (coerce (nreverse ,wvar) 'string) ,svar) ++ (setq ,wvar nil)))) ++ (loop with word = '() and sentence = '() and endpos = nil ++ for i below (length string) ++ do (let ((char (aref string i))) ++ (case char ++ (#\Space (add-word word sentence)) ++ (#\. (setq endpos (1+ i)) (loop-finish)) ++ (otherwise (push char word)))) ++ finally (add-word word sentence) ++ (return (values (nreverse sentence) endpos))))) ++@result{} TOKENIZE-SENTENCE ++ ++ (tokenize-sentence "this is a sentence. this is another sentence.") ++@result{} ("this" "is" "a" "sentence"), 19 ++ ++ (tokenize-sentence "this is a sentence") ++@result{} ("this" "is" "a" "sentence"), NIL ++ ++@end example ++ ++@subsubheading Side Effects:: ++ ++Transfers control. ++ ++@subsubheading Exceptional Situations:: ++ ++Whether or not @b{loop-finish} is @i{fbound} in the ++@i{global environment} is @i{implementation-dependent}; ++however, the restrictions on redefinition and @i{shadowing} of ++@b{loop-finish} are the same as for @i{symbols} in the @t{COMMON-LISP} @i{package} ++which are @i{fbound} in the @i{global environment}. ++The consequences of attempting to use @b{loop-finish} outside ++of @b{loop} are undefined. ++ ++@subsubheading See Also:: ++ ++@ref{loop} ++, ++@ref{The LOOP Facility} ++ ++@subsubheading Notes:: ++ ++@c end of including dict-iteration ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-7.texi +@@ -0,0 +1,5985 @@ ++ ++ ++@node Objects, Structures, Iteration, Top ++@chapter Objects ++ ++@menu ++* Object Creation and Initialization:: ++* Changing the Class of an Instance:: ++* Reinitializing an Instance:: ++* Meta-Objects:: ++* Slots:: ++* Generic Functions and Methods:: ++* Objects Dictionary:: ++@end menu ++ ++@node Object Creation and Initialization, Changing the Class of an Instance, Objects, Objects ++@section Object Creation and Initialization ++ ++@c including concept-objects ++ ++The @i{generic function} @b{make-instance} creates and returns a new ++@i{instance} of a @i{class}. The first argument is a @i{class} or ++the @i{name} of a @i{class}, and the remaining arguments form an ++@i{initialization argument list} ++@IGindex initialization argument list ++. ++ ++The initialization of a new @i{instance} consists of several distinct ++steps, including the following: combining the explicitly supplied initialization ++arguments with default values for the unsupplied initialization arguments, ++checking the validity of the initialization arguments, allocating storage ++for the @i{instance}, filling @i{slots} with ++values, and executing user-supplied @i{methods} that perform additional ++initialization. Each step of @b{make-instance} is implemented by a ++@i{generic function} to provide a mechanism for customizing that step. ++In addition, @b{make-instance} is itself a @i{generic function} ++and thus also can be customized. ++ ++The object system specifies system-supplied primary @i{methods} for each step ++and thus specifies a well-defined standard behavior for the entire ++initialization process. The standard behavior provides four simple ++mechanisms for controlling initialization: ++ ++@table @asis ++ ++@item @t{*} ++Declaring a @i{symbol} to be an initialization argument ++for a @i{slot}. An initialization argument is declared by using the ++@t{:initarg} slot option to @b{defclass}. This provides a mechanism ++for supplying a value for a @i{slot} in a call to @b{make-instance}. ++ ++@item @t{*} ++Supplying a default value form for an initialization argument. ++Default value forms for initialization arguments are defined by using the ++@t{:default-initargs} class option to @b{defclass}. If an ++initialization argument is not explicitly provided ++as an argument to @b{make-instance}, the default value form is ++evaluated in the lexical environment of the @b{defclass} form that ++defined it, and the resulting value is used as the value of the ++initialization argument. ++ ++@item @t{*} ++Supplying a default initial value form for a @i{slot}. ++A default initial value form for a @i{slot} is defined by using the ++@t{:initform} slot option to @b{defclass}. If no initialization ++argument associated with that @i{slot} is given as an argument to ++@b{make-instance} or is defaulted by @t{:default-initargs}, this ++default initial value form is evaluated in the lexical environment of ++the @b{defclass} form that defined it, and the resulting value is ++stored in the @i{slot}. The @t{:initform} form for a ++@i{local slot} may be used when creating an @i{instance}, when ++updating an @i{instance} to conform to a redefined @i{class}, ++or when updating an @i{instance} to conform to the definition of a ++different @i{class}. The @t{:initform} form for a ++@i{shared slot} may be used when defining or re-defining the @i{class}. ++ ++@item @t{*} ++Defining @i{methods} for @b{initialize-instance} and ++@b{shared-initialize}. The slot-filling behavior described above is ++implemented by a system-supplied primary @i{method} for ++@b{initialize-instance} which invokes @b{shared-initialize}. The ++@i{generic function} @b{shared-initialize} implements the parts of ++initialization shared by these four situations: when making an @i{instance}, ++when re-initializing an @i{instance}, when updating an @i{instance} ++to conform to a redefined @i{class}, and when updating an @i{instance} ++to conform to the definition of a different @i{class}. The system-supplied ++primary @i{method} for @b{shared-initialize} directly implements the ++slot-filling behavior described above, and @b{initialize-instance} ++simply invokes @b{shared-initialize}. ++ ++@end table ++ ++@menu ++* Initialization Arguments:: ++* Declaring the Validity of Initialization Arguments:: ++* Defaulting of Initialization Arguments:: ++* Rules for Initialization Arguments:: ++* Shared-Initialize:: ++* Initialize-Instance:: ++* Definitions of Make-Instance and Initialize-Instance:: ++@end menu ++ ++@node Initialization Arguments, Declaring the Validity of Initialization Arguments, Object Creation and Initialization, Object Creation and Initialization ++@subsection Initialization Arguments ++ ++An initialization argument controls @i{object} creation and ++initialization. It is often convenient to use keyword @i{symbols} ++to name initialization arguments, but the @i{name} of an ++initialization argument can be any @i{symbol}, including @b{nil}. An ++initialization argument can be used in two ways: to fill a @i{slot} ++with a value or to provide an argument for an initialization ++@i{method}. A single initialization argument can be used for both ++purposes. ++ ++An @i{initialization argument list} is a ++@i{property list} of ++initialization argument names and values. ++Its structure is identical ++to a @i{property list} and also ++to the portion of an argument list ++processed for @b{&key} parameters. ++As in those lists, ++if an initialization ++argument name appears more than once in an initialization argument list, ++the leftmost occurrence supplies the value and the remaining occurrences ++are ignored. The arguments to @b{make-instance} (after the first ++argument) form an @i{initialization argument list}. ++ ++An initialization argument can be associated with a @i{slot}. If ++the initialization argument has a value in the @i{initialization ++argument list}, the value is stored into the @i{slot} of the newly ++created @i{object}, overriding any @t{:initform} form associated ++with the @i{slot}. A single initialization argument can initialize ++more than one @i{slot}. An initialization argument that initializes ++a @i{shared slot} stores its value into the @i{shared slot}, ++replacing any previous value. ++ ++An initialization argument can be associated with a @i{method}. When ++an @i{object} is created and a particular initialization argument is ++supplied, the @i{generic functions} @b{initialize-instance}, ++@b{shared-initialize}, and @b{allocate-instance} are called ++with that initialization argument's name and value as a keyword argument ++pair. If a value for the initialization argument is not supplied in the ++@i{initialization argument list}, the @i{method}'s ++@i{lambda list} supplies a default value. ++ ++Initialization arguments are used in four situations: when making an ++@i{instance}, when re-initializing an @i{instance}, when updating ++an @i{instance} to conform to a redefined @i{class}, and when ++updating an @i{instance} to conform to the definition of a different ++@i{class}. ++ ++Because initialization arguments are used to control the creation and ++initialization of an @i{instance} of some particular @i{class}, ++we say that an initialization argument is ++``an initialization argument for'' that @i{class}. ++ ++@node Declaring the Validity of Initialization Arguments, Defaulting of Initialization Arguments, Initialization Arguments, Object Creation and Initialization ++@subsection Declaring the Validity of Initialization Arguments ++ ++Initialization arguments are checked for validity in each of the four ++situations that use them. An initialization argument may be valid in ++one situation and not another. For example, the system-supplied ++primary @i{method} for @b{make-instance} defined for ++the @i{class} @b{standard-class} checks the validity of its initialization arguments ++and signals an error if an initialization argument is supplied that is ++not declared as valid in that situation. ++ ++There are two means for declaring initialization arguments valid. ++ ++@table @asis ++ ++@item @t{*} ++Initialization arguments that fill @i{slots} are declared as valid ++by the @t{:initarg} slot option to @b{defclass}. The ++@t{:initarg} slot option is inherited from @i{superclasses}. Thus ++the set of valid initialization arguments that fill @i{slots} for a ++@i{class} is the union of the initialization arguments that fill ++@i{slots} declared as valid by that @i{class} and its ++@i{superclasses}. Initialization arguments that fill @i{slots} ++are valid in all four contexts. ++ ++@item @t{*} ++Initialization arguments that supply arguments to @i{methods} are ++declared as valid by defining those @i{methods}. The keyword name of ++each keyword parameter specified in the @i{method}'s ++@i{lambda list} becomes an initialization argument for all @i{classes} ++for which the @i{method} is applicable. ++ ++The presence of @t{&allow-other-keys} in the ++@i{lambda list} of an applicable method disables validity checking of ++initialization arguments. ++ ++Thus @i{method} inheritance ++controls the set of valid initialization arguments that supply arguments ++to @i{methods}. The @i{generic functions} for which @i{method} ++definitions serve to declare initialization arguments valid are as ++follows: ++@table @asis ++ ++@item -- ++Making an @i{instance} of a @i{class}: ++@b{allocate-instance}, @b{initialize-instance}, and ++@b{shared-initialize}. Initialization arguments declared as valid ++by these @i{methods} are valid when making ++an @i{instance} of a @i{class}. ++ ++@item -- ++Re-initializing an @i{instance}: ++@b{reinitialize-instance} and @b{shared-initialize}. ++Initialization arguments declared as valid by these @i{methods} are ++valid when re-initializing an @i{instance}. ++ ++@item -- ++Updating an @i{instance} to conform to a redefined @i{class}: ++@b{update-instance-for-redefined-class} and @b{shared-initialize}. ++Initialization arguments declared as valid by these @i{methods} are ++valid when updating an @i{instance} to conform to a redefined @i{class}. ++ ++@item -- ++Updating an @i{instance} to conform to the definition of a ++different @i{class}: ++@b{update-instance-for-different-class} and @b{shared-initialize}. ++Initialization arguments declared as valid by these @i{methods} are ++valid when updating an @i{instance} to conform to the definition ++of a different @i{class}. ++ ++@end table ++ ++@end table ++ ++The set of valid initialization arguments for a @i{class} is the set of ++valid initialization arguments that either fill @i{slots} or supply ++arguments to @i{methods}, along with the predefined initialization ++argument @t{:allow-other-keys}. The default value for ++@t{:allow-other-keys} is @b{nil}. ++ ++Validity checking of initialization arguments is disabled if the value of ++the initialization argument @t{:allow-other-keys} is @i{true}. ++ ++@node Defaulting of Initialization Arguments, Rules for Initialization Arguments, Declaring the Validity of Initialization Arguments, Object Creation and Initialization ++@subsection Defaulting of Initialization Arguments ++ ++A default value @i{form} can be supplied for an initialization ++argument by using the @t{:default-initargs} @i{class} option. If an ++initialization argument is declared valid by some particular @i{class}, ++its default value form might be specified by a different @i{class}. ++In this case @t{:default-initargs} is used to supply a default value ++for an inherited initialization argument. ++ ++The @t{:default-initargs} option is used only to provide default ++values for initialization arguments; it does not declare a @i{symbol} ++as a valid initialization argument name. Furthermore, ++the @t{:default-initargs} option is used only to provide default values for ++initialization arguments when making an @i{instance}. ++ ++The argument to the @t{:default-initargs} class ++option is a list of ++alternating initialization argument names and @i{forms}. ++Each @i{form} is the ++default value form for the corresponding initialization ++argument. The default value @i{form} of an initialization ++argument is used and evaluated only if that initialization argument ++does not appear in the arguments to @b{make-instance} and is not ++defaulted by a more specific @i{class}. The default value @i{form} is ++evaluated in the lexical environment of the @b{defclass} form that ++supplied it; the resulting value is used as the initialization ++argument's value. ++ ++The initialization arguments supplied to @b{make-instance} are combined ++with defaulted initialization arguments to produce a ++@i{defaulted initialization argument list}. A ++@i{defaulted initialization argument list} ++is a list of alternating initialization argument names and ++values in which unsupplied initialization arguments are defaulted and in ++which the explicitly supplied initialization arguments appear earlier in ++the list than the defaulted initialization arguments. Defaulted ++initialization arguments are ordered according to the order in the ++@i{class precedence list} of the @i{classes} that supplied the default values. ++ ++There is a distinction between the purposes of the ++@t{:default-initargs} and the @t{:initform} options with respect to the ++initialization of @i{slots}. The @t{:default-initargs} ++class option ++provides a mechanism for the user to give a default value @i{form} ++for an initialization argument without knowing whether the ++initialization argument initializes a @i{slot} ++or is passed to a @i{method}. ++If that initialization argument is not explicitly supplied in a call ++to @b{make-instance}, the default value @i{form} is used, just ++as if it had been supplied in the call. In contrast, the ++@t{:initform} slot option provides a mechanism for the user to give a ++default initial value form for a @i{slot}. An @t{:initform} form is ++used to initialize a @i{slot} only if no initialization argument ++associated with that @i{slot} is given as an argument to ++@b{make-instance} or is defaulted by @t{:default-initargs}. ++ ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++The order of evaluation of default value @i{forms} for initialization ++arguments and the order of evaluation of @t{:initform} forms are ++undefined. If the order of evaluation is important, ++@b{initialize-instance} or @b{shared-initialize} @i{methods} ++should be used ++instead. ++ ++@node Rules for Initialization Arguments, Shared-Initialize, Defaulting of Initialization Arguments, Object Creation and Initialization ++@subsection Rules for Initialization Arguments ++ ++The @t{:initarg} slot option may be specified more than ++once for a given @i{slot}. ++ ++The following rules specify when initialization arguments may be ++multiply defined: ++ ++@table @asis ++ ++@item @t{*} ++A given initialization argument can be used to ++initialize more than one @i{slot} if the same initialization argument name ++appears in more than one @t{:initarg} slot option. ++ ++@item @t{*} ++A given initialization argument name can appear ++in the @i{lambda list} of more than one initialization @i{method}. ++ ++@item @t{*} ++A given initialization argument name can ++appear both in an @t{:initarg} slot option and ++in the @i{lambda list} ++of an initialization @i{method}. ++ ++@end table ++ ++[Reviewer Note by The next three paragraphs could be replaced by ``If two or more ++initialization arguments that initialize the same slot appear in the ++@i{defaulted initialization argument list}, the leftmost of these supplies ++the value, even if they have different names.'' And the rest would follow ++from the rules above.] ++ ++If two or more initialization arguments that initialize the same ++@i{slot} are given in the arguments to @b{make-instance}, the ++leftmost of these initialization arguments in the @i{initialization ++argument list} supplies the value, even if the initialization arguments ++have different names. ++ ++If two or more different initialization arguments that initialize the ++same @i{slot} have default values and none is given explicitly in the ++arguments to @b{make-instance}, the initialization argument that ++appears in a @t{:default-initargs} class option in the most specific ++of the @i{classes} supplies the value. If a single ++@t{:default-initargs} class option specifies two or more initialization ++arguments that initialize the same @i{slot} and none is given ++explicitly in the arguments to @b{make-instance}, the leftmost in ++the @t{:default-initargs} class option supplies the value, and the ++values of the remaining default value @i{forms} are ignored. ++ ++Initialization arguments given explicitly in the arguments to ++@b{make-instance} appear to the left of defaulted initialization ++arguments. Suppose that the classes C_1 and C_2 supply the ++values of defaulted initialization arguments for different @i{slots}, ++and suppose that C_1 is more specific than C_2; then the ++defaulted initialization argument whose value is supplied by C_1 ++is to the left of the defaulted initialization argument whose value is ++supplied by C_2 in the @i{defaulted initialization argument ++list}. If a single @t{:default-initargs} class option supplies the ++values of initialization arguments for two different @i{slots}, the ++initialization argument whose value is specified farther to the left in ++the @t{:default-initargs} class option appears farther to the left in ++the @i{defaulted initialization argument list}. ++ ++[Reviewer Note by Barmar: End of claim made three paragraphs back.] ++ ++If a @i{slot} has both an @t{:initform} form and an ++@t{:initarg} slot option, and the initialization argument is defaulted ++using @t{:default-initargs} or is supplied to @b{make-instance}, ++the captured @t{:initform} form is neither used nor evaluated. ++ ++The following is an example of the above rules: ++ ++@example ++ (defclass q () ((x :initarg a))) ++ (defclass r (q) ((x :initarg b)) ++ (:default-initargs a 1 b 2)) ++@end example ++ ++@example ++@format ++@group ++@noindent ++@w{ @t{} Defaulted @t{} } ++@w{ Form Initialization Argument List Contents of Slot X } ++@w{ _____________________________________________________________________________} ++@w{ @t{(make-instance 'r)} @t{(a 1 b 2)} @t{1} } ++@w{ @t{(make-instance 'r 'a 3)} @t{(a 3 b 2)} @t{3} } ++@w{ @t{(make-instance 'r 'b 4)} @t{(b 4 a 1)} @t{4} } ++@w{ @t{(make-instance 'r 'a 1 'a 2)} @t{(a 1 a 2 b 2)} @t{1} } ++@end group ++@end format ++ ++@end example ++ ++ ++@node Shared-Initialize, Initialize-Instance, Rules for Initialization Arguments, Object Creation and Initialization ++@subsection Shared-Initialize ++ ++The @i{generic function} @b{shared-initialize} is used to fill the ++@i{slots} ++of an @i{instance} ++using initialization arguments and @t{:initform} ++forms when an @i{instance} is created, when an ++@i{instance} is re-initialized, ++when an @i{instance} ++is updated to conform to a redefined @i{class}, and when ++an @i{instance} is updated to conform to a different @i{class}. ++It uses ++standard @i{method} combination. It takes the following arguments: the ++@i{instance} to be initialized, a ++specification of a set of @i{names} of @i{slots} ++@i{accessible} in that @i{instance}, and any number of initialization ++arguments. The arguments after the first two must form an ++@i{initialization argument list}. ++ ++The second argument to @b{shared-initialize} may be one of the following: ++ ++@table @asis ++ ++@item @t{*} ++It can be a (possibly empty) @i{list} of @i{slot} names, ++which specifies the set of those @i{slot} names. ++ ++@item @t{*} ++It can be the symbol @b{t}, which specifies the set of all of the @i{slots}. ++ ++@end table ++ ++There is a system-supplied primary @i{method} for @b{shared-initialize} ++whose first @i{parameter specializer} is the @i{class} @b{standard-object}. ++This @i{method} behaves as follows on each @i{slot}, ++whether shared or local: ++ ++@table @asis ++ ++@item @t{*} ++If an initialization argument in the ++@i{initialization argument list} specifies a value for that @i{slot}, ++that value is stored ++into the @i{slot}, even if a value has already been stored in the @i{slot} ++before the @i{method} is run. ++The affected @i{slots} are independent of which ++@i{slots} are indicated by the second argument to @b{shared-initialize}. ++ ++@item @t{*} ++Any @i{slots} ++indicated by the second argument that are still ++unbound at this point are initialized according to their ++@t{:initform} forms. For any such @i{slot} ++that has an @t{:initform} form, ++that @i{form} is evaluated in the ++lexical environment of its defining ++@b{defclass} form and the result is stored into the @i{slot}. ++For example, ++if a @i{before method} stores a value in the ++@i{slot}, the @t{:initform} form will not be used to supply a value ++for the @i{slot}. If ++the second argument specifies a @i{name} that does not correspond to any ++@i{slots} @i{accessible} ++in the @i{instance}, the results are unspecified. ++ ++@item @t{*} ++The rules mentioned in @ref{Rules for Initialization Arguments} are obeyed. ++ ++@end table ++ ++The generic function @b{shared-initialize} is called by the ++system-supplied primary @i{methods} ++for @b{reinitialize-instance}, ++@b{update-instance-for-different-class}, ++@b{update-instance-for-redefined-class}, and ++@b{initialize-instance}. Thus, @i{methods} can be written for ++@b{shared-initialize} to specify actions that should be taken in all of ++these contexts. ++ ++@node Initialize-Instance, Definitions of Make-Instance and Initialize-Instance, Shared-Initialize, Object Creation and Initialization ++@subsection Initialize-Instance ++ ++The @i{generic function} @b{initialize-instance} is called by ++@b{make-instance} to initialize a newly created @i{instance}. ++It uses @i{standard method combination}. @i{Methods} for ++@b{initialize-instance} can be defined in order to perform any ++initialization that cannot be achieved ++simply by supplying initial values for @i{slots}. ++ ++During initialization, @b{initialize-instance} is invoked ++after the following actions have been taken: ++ ++@table @asis ++ ++@item @t{*} ++The @i{defaulted initialization argument list} ++has been computed by combining the supplied @i{initialization argument list} ++with any default initialization arguments for the @i{class}. ++ ++@item @t{*} ++The validity of the @i{defaulted initialization argument list} ++has been checked. If any of the initialization arguments has not ++been declared as valid, an error is signaled. ++ ++@item @t{*} ++A new @i{instance} whose @i{slots} ++are unbound has been created. ++ ++@end table ++ ++The generic function @b{initialize-instance} is called with the ++new @i{instance} and the defaulted initialization arguments. There is ++a system-supplied primary @i{method} for @b{initialize-instance} ++whose @i{parameter specializer} is the @i{class} @b{standard-object}. This ++@i{method} calls the generic function ++@b{shared-initialize} to fill in ++the @i{slots} according to the initialization arguments and the ++@t{:initform} forms for the @i{slots}; the generic function ++@b{shared-initialize} is called with the following arguments: the @i{instance}, ++@b{t}, and the defaulted initialization arguments. ++ ++Note that @b{initialize-instance} provides the ++@i{defaulted initialization argument list} in its call to @b{shared-initialize}, ++so the first step performed by the system-supplied primary @i{method} for ++@b{shared-initialize} takes into account both the initialization ++arguments provided in the call to @b{make-instance} and the ++@i{defaulted initialization argument list}. ++ ++@i{Methods} for @b{initialize-instance} can be defined to specify ++actions to be taken when an @i{instance} is initialized. ++If only @i{after methods} for @b{initialize-instance} are defined, they will be ++run after the system-supplied primary @i{method} for initialization and ++therefore will not interfere with the default behavior of ++@b{initialize-instance}. ++ ++The object system provides two @i{functions} that are useful in the bodies of ++@b{initialize-instance} methods. The @i{function} @b{slot-boundp} ++returns a @i{generic boolean} value that indicates whether a specified @i{slot} has a ++value; this provides a mechanism for writing @i{after methods} for ++@b{initialize-instance} that initialize @i{slots} only if they have ++not already been initialized. The @i{function} @b{slot-makunbound} ++causes the @i{slot} to have no value. ++ ++@node Definitions of Make-Instance and Initialize-Instance, , Initialize-Instance, Object Creation and Initialization ++@subsection Definitions of Make-Instance and Initialize-Instance ++ ++The generic function @b{make-instance} behaves as if it were defined as ++follows, except that certain optimizations are permitted: ++ ++@example ++ (defmethod make-instance ((class standard-class) &rest initargs) ++ ... ++ (let ((instance (apply #'allocate-instance class initargs))) ++ (apply #'initialize-instance instance initargs) ++ instance)) ++ ++ (defmethod make-instance ((class-name symbol) &rest initargs) ++ (apply #'make-instance (find-class class-name) initargs)) ++@end example ++ ++The elided code in the definition of @b{make-instance} ++augments the @t{initargs} with any @i{defaulted initialization arguments} and ++checks the ++resulting ++initialization arguments to determine whether an initialization ++argument was supplied that neither filled a @i{slot} nor supplied an argument ++to an applicable @i{method}. ++ ++The generic function @b{initialize-instance} behaves as if it were ++defined as follows, except that certain optimizations are permitted: ++ ++@example ++ (defmethod initialize-instance ((instance standard-object) &rest initargs) ++ (apply #'shared-initialize instance t initargs))) ++@end example ++ ++These procedures can be customized. ++ ++Customizing at the Programmer Interface level includes using the ++@t{:initform}, @t{:initarg}, and @t{:default-initargs} options to ++@b{defclass}, as well as defining @i{methods} ++for @b{make-instance}, ++@b{allocate-instance}, ++and @b{initialize-instance}. It is also possible to define ++@i{methods} for @b{shared-initialize}, which would be invoked by the ++generic functions @b{reinitialize-instance}, ++@b{update-instance-for-redefined-class}, ++@b{update-instance-for-different-class}, and ++@b{initialize-instance}. ++The meta-object level supports additional ++customization. ++ ++Implementations are permitted to make certain optimizations to ++@b{initialize-instance} and @b{shared-initialize}. ++The description of @b{shared-initialize} in Chapter~7 mentions the ++possible optimizations. ++ ++@c end of including concept-objects ++ ++@node Changing the Class of an Instance, Reinitializing an Instance, Object Creation and Initialization, Objects ++@section Changing the Class of an Instance ++ ++@c including concept-change-class ++ ++The @i{function} @b{change-class} can be used to change the @i{class} ++of an @i{instance} from its current class, C_@{@r{from}@}, ++to a different class, C_@{@r{to}@}; it changes the ++structure of the @i{instance} to conform to the definition of the class ++C_@{@r{to}@}. ++ ++Note that changing the @i{class} of an @i{instance} may cause ++@i{slots} to be added or deleted. Changing the @i{class} of an ++@i{instance} does not change its identity as defined by the ++@b{eq} function. ++ ++When @b{change-class} is invoked on an @i{instance}, a two-step ++updating process takes place. The first step modifies the structure of ++the @i{instance} by adding new @i{local slots} and discarding ++@i{local slots} that are not specified in the new version of the @i{instance}. ++The second step initializes the newly added @i{local slots} and performs ++any other user-defined actions. These two steps are further described in the ++two following sections. ++ ++@menu ++* Modifying the Structure of the Instance:: ++* Initializing Newly Added Local Slots (Changing the Class of an Instance):: ++* Customizing the Change of Class of an Instance:: ++@end menu ++ ++@node Modifying the Structure of the Instance, Initializing Newly Added Local Slots (Changing the Class of an Instance), Changing the Class of an Instance, Changing the Class of an Instance ++@subsection Modifying the Structure of the Instance ++ ++In order to make the @i{instance} conform to the class C_@{@r{to}@}, @i{local slots} specified by the class C_@{@r{to}@} that are not specified by the class C_@{@r{from}@} are added, and @i{local slots} not specified by ++the class C_@{@r{to}@} that are specified by the ++class C_@{@r{from}@} are discarded. ++ ++The values of @i{local slots} specified by both the class C_@{@r{to}@} and the class C_@{@r{from}@} are retained. If such a @i{local slot} was unbound, it remains ++unbound. ++ ++The values of @i{slots} specified as shared in the class C_@{@r{from}@} and as local in the class C_@{@r{to}@} are retained. ++ ++This first step of the update does not affect the values of any ++@i{shared slots}. ++ ++@node Initializing Newly Added Local Slots (Changing the Class of an Instance), Customizing the Change of Class of an Instance, Modifying the Structure of the Instance, Changing the Class of an Instance ++@subsection Initializing Newly Added Local Slots ++ ++The second step of the update initializes the newly added @i{slots} and ++performs any other user-defined actions. This step is implemented by ++the generic function @b{update-instance-for-different-class}. The ++generic function @b{update-instance-for-different-class} is invoked ++by @b{change-class} after the first step of the update has been ++completed. ++ ++The generic function @b{update-instance-for-different-class} is ++invoked on arguments computed by @b{change-class}. ++The first argument passed is a copy of the @i{instance} being updated ++and is an @i{instance} of the class C_@{@r{from}@}; ++this copy has @i{dynamic extent} within the generic function @b{change-class}. ++The second argument is the @i{instance} as updated so far by @b{change-class} ++and is an @i{instance} of the class C_@{@r{to}@}. ++The remaining arguments are an @i{initialization argument list}. ++ ++There is a system-supplied primary @i{method} for ++@b{update-instance-for-different-class} that has two parameter ++specializers, each of which is the @i{class} @b{standard-object}. First ++this @i{method} checks the validity of initialization arguments and ++signals an error if an initialization argument is supplied that is not ++declared as valid. (For more information, see @ref{Declaring the Validity of Initialization Arguments}.) ++Then it calls the ++generic function @b{shared-initialize} with the following arguments: ++the ++new ++@i{instance}, a list of @i{names} of the newly added ++@i{slots}, and the ++initialization arguments it received. ++ ++@node Customizing the Change of Class of an Instance, , Initializing Newly Added Local Slots (Changing the Class of an Instance), Changing the Class of an Instance ++@subsection Customizing the Change of Class of an Instance ++ ++@i{Methods} for @b{update-instance-for-different-class} may be defined ++to specify actions to be taken when an @i{instance} is updated. If only ++@i{after methods} for @b{update-instance-for-different-class} are ++defined, they will be run after the system-supplied primary @i{method} for ++initialization and will not interfere with the default behavior of ++@b{update-instance-for-different-class}. ++ ++@i{Methods} ++for @b{shared-initialize} may be defined to customize @i{class} ++redefinition. For more information, see @ref{Shared-Initialize}. ++ ++@c end of including concept-change-class ++ ++@node Reinitializing an Instance, Meta-Objects, Changing the Class of an Instance, Objects ++@section Reinitializing an Instance ++ ++@c including concept-reinit ++ ++The generic function @b{reinitialize-instance} may be used to change ++the values of @i{slots} according to initialization arguments. ++ ++The process of reinitialization changes the values of some @i{slots} and ++performs any user-defined actions. It does not modify the structure ++of an @i{instance} to add or delete @i{slots}, ++and it does not use any @t{:initform} forms to initialize @i{slots}. ++ ++The generic function @b{reinitialize-instance} may be called ++directly. It takes one required argument, the @i{instance}. It also ++takes any number of initialization arguments to be used by @i{methods} for ++@b{reinitialize-instance} or for @b{shared-initialize}. The ++arguments after the required @i{instance} must form an ++@i{initialization argument list}. ++ ++There is a system-supplied primary @i{method} for ++@b{reinitialize-instance} whose @i{parameter specializer} is ++the @i{class} @b{standard-object}. First this @i{method} checks the validity of ++initialization arguments and signals an error if an initialization ++argument is supplied that is not declared as valid. ++(For more information, see @ref{Declaring the Validity of Initialization Arguments}.) ++Then it calls the generic function ++@b{shared-initialize} with the following arguments: the @i{instance}, ++@b{nil}, and the initialization arguments it received. ++ ++@menu ++* Customizing Reinitialization:: ++@end menu ++ ++@node Customizing Reinitialization, , Reinitializing an Instance, Reinitializing an Instance ++@subsection Customizing Reinitialization ++ ++@i{Methods} for @b{reinitialize-instance} may be defined to specify ++actions to be taken when an @i{instance} is updated. If only ++@i{after methods} for @b{reinitialize-instance} are defined, ++they will be run after the system-supplied primary @i{method} for ++initialization and therefore will not interfere with the default behavior of ++@b{reinitialize-instance}. ++ ++@i{Methods} for @b{shared-initialize} may be defined to customize ++@i{class} redefinition. For more information, see @ref{Shared-Initialize}. ++ ++@c end of including concept-reinit ++ ++@node Meta-Objects, Slots, Reinitializing an Instance, Objects ++@section Meta-Objects ++ ++@c including concept-meta-objects ++ ++The implementation of the object system manipulates @i{classes}, @i{methods}, ++and @i{generic functions}. The object system contains a set of ++@i{generic functions} defined by @i{methods} on @i{classes}; ++the behavior of those @i{generic functions} defines the behavior of ++the object system. The @i{instances} of the @i{classes} on which those ++@i{methods} are defined are called meta-objects. ++ ++@menu ++* Standard Meta-objects:: ++@end menu ++ ++@node Standard Meta-objects, , Meta-Objects, Meta-Objects ++@subsection Standard Meta-objects ++ ++The object system supplies a set of meta-objects, called standard meta-objects. ++These include the @i{class} @b{standard-object} and ++@i{instances} of the classes @b{standard-method}, ++@b{standard-generic-function}, and @b{method-combination}. ++ ++@table @asis ++ ++[Editorial Note by KMP: This is said redundantly in the definition of STANDARD-METHOD.] ++@item @t{*} ++The @i{class} @b{standard-method} is the default @i{class} of ++@i{methods} defined by the ++ @b{defmethod} and ++ @b{defgeneric} @i{forms}. ++ ++@item @t{*} ++The @i{class} @b{standard-generic-function} is the default @i{class} of ++@i{generic functions} defined by the forms ++ @b{defmethod}, ++ @b{defgeneric}, ++ ++ and ++ @b{defclass}. ++ ++@item @t{*} ++The @i{class} named @b{standard-object} ++is an @i{instance} of the @i{class} @b{standard-class} ++and is a @i{superclass} of every @i{class} that is an ++@i{instance} of @b{standard-class} except itself and ++@b{structure-class}. ++ ++@item @t{*} ++Every @i{method} combination object is ++an @i{instance} of a @i{subclass} of @i{class} @b{method-combination}. ++ ++@end table ++ ++@c end of including concept-meta-objects ++ ++@node Slots, Generic Functions and Methods, Meta-Objects, Objects ++@section Slots ++ ++@c including concept-slots ++ ++@menu ++* Introduction to Slots:: ++* Accessing Slots:: ++* Inheritance of Slots and Slot Options:: ++@end menu ++ ++@node Introduction to Slots, Accessing Slots, Slots, Slots ++@subsection Introduction to Slots ++ ++An @i{object} of @i{metaclass} @b{standard-class} has zero or more named ++@i{slots}. The @i{slots} of an @i{object} are determined ++by the @i{class} of the @i{object}. Each @i{slot} can hold ++one value. ++ ++[Reviewer Note by Barmar: All symbols are valid variable names. Perhaps this means ++ to preclude the use of named constants? We have a terminology ++ problem to solve.] ++The @i{name} of a @i{slot} is a @i{symbol} that is syntactically ++valid for use as a variable name. ++ ++When a @i{slot} does not have a value, the @i{slot} is said to be ++@i{unbound}. When an unbound @i{slot} is read, ++ ++[Reviewer Note by Barmar: from an object whose metaclass is standard-class?] ++the @i{generic function} @b{slot-unbound} is invoked. The ++system-supplied primary @i{method} ++for @b{slot-unbound} ++on @i{class} @b{t} signals an error. ++ ++If @b{slot-unbound} returns, its @i{primary value} ++is used that time as the @i{value} of the @i{slot}. ++ ++The default initial value form for a @i{slot} is defined by ++the @t{:initform} slot option. When the @t{:initform} form is used to ++supply a value, it is evaluated in the lexical environment in which ++the @b{defclass} form was evaluated. The @t{:initform} along with ++the lexical environment in which the @b{defclass} form was evaluated ++is called a @i{captured initialization form}. ++For more details, see @ref{Object Creation and Initialization}. ++ ++A @i{local slot} is defined to be a @i{slot} that is ++@i{accessible} ++to exactly one @i{instance}, ++namely the one in which the @i{slot} is allocated. ++A @i{shared slot} is defined to be a @i{slot} that is visible to more than one ++@i{instance} of a given @i{class} and its @i{subclasses}. ++ ++A @i{class} is said to define a @i{slot} with a given @i{name} when ++the @b{defclass} form for that @i{class} contains a @i{slot specifier} with ++that @i{name}. Defining a @i{local slot} does not immediately create ++a @i{slot}; it causes a @i{slot} to be created each time ++an @i{instance} of the @i{class} is created. ++Defining a @i{shared slot} immediately creates a @i{slot}. ++ ++The @t{:allocation} slot option to @b{defclass} controls the kind ++of @i{slot} that is defined. If the value of the @t{:allocation} slot ++option is @t{:instance}, a @i{local slot} is created. If the value of ++@t{:allocation} is @t{:class}, a @i{shared slot} is created. ++ ++A @i{slot} is said to be @i{accessible} in an @i{instance} ++of a @i{class} if ++the @i{slot} is defined by the @i{class} ++of the @i{instance} or is inherited from ++a @i{superclass} of that @i{class}. ++At most one @i{slot} of a given @i{name} can be ++@i{accessible} in an @i{instance}. ++A @i{shared slot} defined by a @i{class} is ++@i{accessible} in all @i{instances} ++of that @i{class}. ++A detailed explanation of the inheritance of @i{slots} is given in ++@ref{Inheritance of Slots and Slot Options}. ++ ++@node Accessing Slots, Inheritance of Slots and Slot Options, Introduction to Slots, Slots ++@subsection Accessing Slots ++ ++@i{Slots} can be @i{accessed} in two ways: by use of the primitive function ++@b{slot-value} and by use of @i{generic functions} generated by ++the @b{defclass} form. ++ ++The @i{function} @b{slot-value} can be used with any of the @i{slot} ++names specified in the @b{defclass} form to @i{access} a specific ++@i{slot} @i{accessible} in an @i{instance} of the given @i{class}. ++ ++The macro @b{defclass} provides syntax for generating @i{methods} to ++read and write @i{slots}. If a reader @i{method} is requested, ++a @i{method} is automatically generated for reading the value of the ++@i{slot}, but no @i{method} for storing a value into it is generated. ++If a writer @i{method} is requested, a @i{method} is automatically ++generated for storing a value into the @i{slot}, but no @i{method} ++for reading its value is generated. If an accessor @i{method} is ++requested, a @i{method} for reading the value of the @i{slot} and a ++@i{method} for storing a value into the @i{slot} are automatically ++generated. Reader and writer @i{methods} are implemented using ++@b{slot-value}. ++ ++When a reader or writer @i{method} is specified for a @i{slot}, the ++name of the @i{generic function} to which the generated @i{method} ++belongs is directly specified. If the @i{name} specified for the writer ++@i{method} is the symbol @t{name}, the @i{name} of the ++@i{generic function} for writing the @i{slot} is the symbol ++@t{name}, and the @i{generic function} takes two arguments: the new ++value and the @i{instance}, in that order. If the @i{name} specified ++for the accessor @i{method} is the symbol @t{name}, the @i{name} of ++the @i{generic function} for reading the @i{slot} is the symbol ++@t{name}, and the @i{name} of the @i{generic function} for writing ++the @i{slot} is the list @t{(setf name)}. ++ ++A @i{generic function} created or modified by supplying @t{:reader}, ++@t{:writer}, or @t{:accessor} @i{slot} options can be treated exactly ++as an ordinary @i{generic function}. ++ ++Note that @b{slot-value} can be used to read or write the value of a ++@i{slot} whether or not reader or writer @i{methods} exist for that ++@i{slot}. When @b{slot-value} is used, no reader or writer ++@i{methods} are invoked. ++ ++The macro @b{with-slots} can be used to establish a ++@i{lexical environment} in which specified @i{slots} are lexically ++available as if they were variables. The macro @b{with-slots} ++invokes the @i{function} @b{slot-value} to @i{access} the specified @i{slots}. ++ ++The macro @b{with-accessors} can be used to establish a lexical ++environment in which specified @i{slots} are lexically available through ++their accessors as if they were variables. The macro @b{with-accessors} ++invokes the appropriate accessors to @i{access} the specified @i{slots}. ++ ++@node Inheritance of Slots and Slot Options, , Accessing Slots, Slots ++@subsection Inheritance of Slots and Slot Options ++ ++The set of the @i{names} of all @i{slots} @i{accessible} ++in an @i{instance} of a @i{class} C is the union of ++the sets of @i{names} of @i{slots} defined by C and its ++@i{superclasses}. The structure of an @i{instance} is ++the set of @i{names} of @i{local slots} in that @i{instance}. ++ ++In the simplest case, only one @i{class} among C and its @i{superclasses} ++defines a @i{slot} with a given @i{slot} name. ++If a @i{slot} is defined by a @i{superclass} of C, ++the @i{slot} is said to be inherited. The characteristics ++of the @i{slot} are determined by the @i{slot specifier} ++of the defining @i{class}. ++Consider the defining @i{class} for ++a slot S. If the value of the @t{:allocation} ++slot ++option is @t{:instance}, then S is a @i{local slot} and each ++@i{instance} ++of C has its own @i{slot} named S that stores its own value. If the ++value of the @t{:allocation} slot ++option is @t{:class}, then S ++is a @i{shared slot}, the @i{class} ++that defined S stores the value, and all ++@i{instances} of C can @i{access} that single @i{slot}. ++If the @t{:allocation} slot option is omitted, @t{:instance} is used. ++ ++In general, more than one @i{class} among C and its ++@i{superclasses} can ++define a @i{slot} with a given @i{name}. ++In such cases, only one @i{slot} with ++the given name is @i{accessible} in an @i{instance} ++of C, and ++the characteristics of that @i{slot} are ++a combination of the several @i{slot} ++specifiers, computed as follows: ++ ++@table @asis ++ ++@item @t{*} ++All the @i{slot specifiers} for a given @i{slot} name ++are ordered from most specific to least specific, according to the order in C's ++@i{class precedence list} of the @i{classes} that define them. All references ++to the specificity of @i{slot specifiers} immediately below refers to this ++ordering. ++ ++@item @t{*} ++The allocation of a @i{slot} is controlled by the most ++specific @i{slot specifier}. If the most specific @i{slot specifier} ++does not contain an @t{:allocation} slot option, @t{:instance} is used. ++Less specific @i{slot specifiers} do not affect the allocation. ++ ++@item @t{*} ++The default initial value form for a @i{slot} ++is the value of the @t{:initform} slot option in the most specific ++@i{slot specifier} that contains one. If no @i{slot specifier} ++contains an @t{:initform} slot option, the @i{slot} ++has no default initial value form. ++ ++@item @t{*} ++The contents of a @i{slot} will always be of type ++@t{(and T_1 ... T_n)} where T_1 ... T_n are ++the values of the @t{:type} slot options contained in all of the ++@i{slot specifiers}. If no @i{slot specifier} contains the ++@t{:type} slot option, the contents of the @i{slot} will always be ++of @i{type} @b{t}. The consequences of attempting to store in a @i{slot} ++a value that does not satisfy the @i{type} of the @i{slot} are undefined. ++ ++@item @t{*} ++The set of initialization arguments that initialize a ++given @i{slot} is the union of the initialization arguments declared in ++the @t{:initarg} slot options in all the @i{slot specifiers}. ++ ++@item @t{*} ++The @i{documentation string} for a @i{slot} is the value of ++the @t{:documentation} slot option in the most specific @i{slot} ++specifier that contains one. If no @i{slot specifier} contains a ++@t{:documentation} slot option, the @i{slot} has no @i{documentation string}. ++ ++@end table ++ ++A consequence of the allocation rule is that a @i{shared slot} can be ++@i{shadowed}. For example, if a class C_1 defines ++a @i{slot} named S ++whose value for the @t{:allocation} slot option is @t{:class}, ++that @i{slot} is @i{accessible} ++in @i{instances} of C_1 and all of its ++@i{subclasses}. However, if C_2 is a @i{subclass} ++of C_1 and also ++defines a @i{slot} named S, C_1's ++@i{slot} is not shared ++by @i{instances} of C_2 and its @i{subclasses}. When a class ++C_1 defines a @i{shared slot}, any subclass C_2 of C_1 will share this single @i{slot} ++unless the @b{defclass} form for ++C_2 specifies a @i{slot} of the same ++@i{name} or there is a @i{superclass} ++of C_2 that precedes C_1 in the @i{class precedence list} of ++C_2 that defines a @i{slot} of the same name. ++ ++A consequence of the type rule is that the value of a @i{slot} ++satisfies the type constraint of each @i{slot specifier} that ++contributes to that @i{slot}. Because the result of attempting to ++store in a @i{slot} a value that does not satisfy the type ++constraint for the @i{slot} is undefined, the value in a @i{slot} ++might fail to satisfy its type constraint. ++ ++The @t{:reader}, @t{:writer}, and @t{:accessor} slot options ++create @i{methods} rather than define the characteristics of a @i{slot}. ++Reader and writer @i{methods} are inherited in the sense described in ++@ref{Inheritance of Methods}. ++ ++@i{Methods} that @i{access} @i{slots} use only the name of the ++@i{slot} and the @i{type} of the @i{slot}'s value. Suppose ++a @i{superclass} provides a @i{method} that expects to @i{access} a ++@i{shared slot} of a given @i{name}, and a @i{subclass} defines ++a @i{local slot} with the same @i{name}. If the @i{method} provided ++by the @i{superclass} is used on an @i{instance} of the @i{subclass}, ++the @i{method} @i{accesses} the @i{local slot}. ++ ++@c end of including concept-slots ++ ++@node Generic Functions and Methods, Objects Dictionary, Slots, Objects ++@section Generic Functions and Methods ++ ++@c including concept-gfs-and-methods ++ ++@menu ++* Introduction to Generic Functions:: ++* Introduction to Methods:: ++* Agreement on Parameter Specializers and Qualifiers:: ++* Congruent Lambda-lists for all Methods of a Generic Function:: ++* Keyword Arguments in Generic Functions and Methods:: ++* Method Selection and Combination:: ++* Inheritance of Methods:: ++@end menu ++ ++@node Introduction to Generic Functions, Introduction to Methods, Generic Functions and Methods, Generic Functions and Methods ++@subsection Introduction to Generic Functions ++ ++A @i{generic function} ++@IGindex generic function ++ is a function whose behavior depends on ++the @i{classes} or identities of the @i{arguments} supplied to it. ++A @i{generic function} @i{object} ++is associated with ++ a set of @i{methods}, ++ a @i{lambda list}, ++ a @i{method combination}_2, ++ and other information. ++ ++Like an @i{ordinary function}, a @i{generic function} takes @i{arguments}, ++performs a series of operations, and perhaps returns useful @i{values}. ++An @i{ordinary function} has a single body of @i{code} that is always @i{executed} ++when the @i{function} is called. A @i{generic function} has a set of bodies ++of @i{code} of which a subset is selected for @i{execution}. The selected ++bodies of @i{code} and the manner of their combination are determined by ++the @i{classes} or identities of one or more of the @i{arguments} to the ++@i{generic function} and by its @i{method combination}. ++ ++@i{Ordinary functions} and @i{generic functions} are called with identical syntax. ++ ++@i{Generic functions} are true @i{functions} that can be passed as @i{arguments} ++and used as the first @i{argument} to @b{funcall} and @b{apply}. ++ ++A @i{binding} of a @i{function name} to a @i{generic function} ++can be @i{established} in one of several ways. It can be ++@i{established} in the @i{global environment} by ++ @b{ensure-generic-function}, ++ @b{defmethod} (implicitly, due to @b{ensure-generic-function}) ++or ++ @b{defgeneric} (also implicitly, due to @b{ensure-generic-function}). ++ ++No @i{standardized} mechanism is provided for @i{establishing} a ++@i{binding} of a @i{function name} to a @i{generic function} ++in the @i{lexical environment}. ++ ++When a @b{defgeneric} form is evaluated, one of three actions ++is taken (due to @b{ensure-generic-function}): ++ ++@table @asis ++ ++@item @t{*} ++If a generic function of the given name already exists, ++the existing generic function object is modified. Methods specified ++by the current @b{defgeneric} form are added, and any methods in the ++existing generic function that were defined by a previous @b{defgeneric} ++form are removed. Methods added by the current @b{defgeneric} ++form might replace methods defined by @b{defmethod}, ++@b{defclass}, @b{define-condition}, or @b{defstruct}. ++No other methods in the generic function are affected ++or replaced. ++ ++@item @t{*} ++If the given name names ++ an @i{ordinary function}, ++ a @i{macro}, ++ or a @i{special operator}, ++an error is signaled. ++ ++@item @t{*} ++Otherwise a generic function is created with the ++methods specified by the method definitions in the @b{defgeneric} ++form. ++ ++@end table ++ ++Some @i{operators} permit specification of the options of a ++@i{generic function}, such as ++the @i{type} of @i{method combination} it uses ++or its @i{argument precedence order}. ++These @i{operators} will be referred to as ++``operators that specify generic function options.'' ++ ++The only @i{standardized} @i{operator} in this category is @b{defgeneric}. ++ ++Some @i{operators} define @i{methods} for a @i{generic function}. ++These @i{operators} will be referred to as ++@i{method-defining operators} ++@IGindex method-defining operator ++; ++their associated @i{forms} are called @i{method-defining forms}. ++The @i{standardized} @i{method-defining operators} are listed in Figure 7--2. ++ ++@format ++@group ++@noindent ++@w{ defgeneric defmethod defclass } ++@w{ define-condition defstruct } ++ ++@noindent ++@w{ Figure 7--2: Standardized Method-Defining Operators} ++ ++@end group ++@end format ++ ++Note that of the @i{standardized} @i{method-defining operators} ++only @b{defgeneric} ++can specify @i{generic function} options. ++@b{defgeneric} and any @i{implementation-defined} @i{operators} ++that can specify @i{generic function} options ++are also referred to as ``operators that specify generic function options.'' ++ ++@node Introduction to Methods, Agreement on Parameter Specializers and Qualifiers, Introduction to Generic Functions, Generic Functions and Methods ++@subsection Introduction to Methods ++ ++@i{Methods} define the class-specific or identity-specific behavior ++and operations of a @i{generic function}. ++ ++A @i{method} @i{object} ++is associated with ++ @i{code} that implements the method's behavior, ++ a sequence of @i{parameter specializers} ++ that specify when the given @i{method} is applicable, ++ a @i{lambda list}, ++ and a sequence of @i{qualifiers} that are used by the method combination ++ facility to distinguish among @i{methods}. ++ ++A method object is not a function and cannot be invoked as a function. ++Various mechanisms in the object system take a method object and invoke its method ++function, as is the case when a generic function is invoked. When this ++occurs it is said that the method is invoked or called. ++ ++A method-defining form contains the @i{code} that is to be run when the ++arguments to the generic function cause the method that it defines to ++be invoked. When a method-defining form is evaluated, a method object ++is created and one of four actions is taken: ++ ++@table @asis ++ ++@item @t{*} ++If a @i{generic function} of the given name already exists ++and if a @i{method object} already exists that agrees with the new one on ++@i{parameter specializers} and @i{qualifiers}, the new @i{method object} replaces ++the old one. For a definition of one method agreeing with another on ++@i{parameter specializers} and @i{qualifiers}, ++see @ref{Agreement on Parameter Specializers and Qualifiers}. ++ ++@item @t{*} ++If a @i{generic function} of the given name already exists ++and if there is no @i{method object} that agrees with the new one on ++@i{parameter specializers} and @i{qualifiers}, the existing @i{generic function} ++@i{object} is modified to contain the new @i{method} @i{object}. ++ ++@item @t{*} ++If the given @i{name} names an @i{ordinary function}, a @i{macro}, ++or a @i{special operator}, an error is signaled. ++ ++@item @t{*} ++Otherwise a @i{generic function} is created with the @i{method} ++specified by the @i{method-defining form}. ++ ++@end table ++ ++If the @i{lambda list} of a new @i{method} is not ++@i{congruent} with the @i{lambda list} of the @i{generic function}, ++an error is signaled. If a @i{method-defining operator} that cannot specify ++@i{generic function} options creates a new @i{generic function}, ++a @i{lambda list} for that @i{generic function} is derived from the ++@i{lambda list} of the @i{method} in the @i{method-defining form} in such a way ++as to be @i{congruent} with it. For a discussion of @i{congruence} ++@IGindex congruence ++, ++see @ref{Congruent Lambda-lists for all Methods of a Generic Function}. ++ ++Each method has a @i{specialized lambda list}, which determines ++when that method can be applied. A @i{specialized lambda list} is like ++an @i{ordinary lambda list} except that a specialized parameter ++may occur instead of the name of a required parameter. A specialized parameter ++is a list @t{(@i{variable-name} @i{parameter-specializer-name})}, ++where @i{parameter-specializer-name} is one of the following: ++ ++@table @asis ++ ++@item a @i{symbol} ++denotes a @i{parameter specializer} which is the @i{class} ++named by that @i{symbol}. ++ ++@item a @i{class} ++denotes a @i{parameter specializer} which is the @i{class} itself. ++ ++@item @t{(eql @i{form})} ++denotes a @i{parameter specializer} which satisfies the @i{type specifier} ++@t{(eql @i{object})}, where @i{object} is the ++result of evaluating @i{form}. The form @i{form} is evaluated in ++the lexical environment in which the method-defining form is evaluated. ++Note that @i{form} is evaluated only once, at the time the method is ++defined, not each time the generic function is called. ++@end table ++ ++@i{Parameter specializer names} are used in macros intended as the ++user-level interface (@b{defmethod}), while @i{parameter specializers} ++are used in the functional interface. ++ ++Only required parameters may be specialized, and there must be a ++@i{parameter specializer} for each required parameter. For notational ++simplicity, if some required parameter in a @i{specialized lambda list} in ++a method-defining form is simply a variable name, its ++@i{parameter specializer} defaults to the @i{class} @b{t}. ++ ++Given a generic function and a set of arguments, an applicable ++method is a method for that generic function whose parameter ++specializers are satisfied by their corresponding arguments. The ++following definition specifies what it means for a method to be ++applicable and for an argument to satisfy a @i{parameter specializer}. ++ ++Let < A_1, ..., A_n> be the required ++arguments to a generic function in order. Let < P_1, ++..., P_n> be the @i{parameter specializers} corresponding to ++the required parameters of the method M in order. The method M is ++applicable when each A_i is of the @i{type} specified by ++the @i{type specifier} P_i. ++Because every valid @i{parameter specializer} is ++also a valid @i{type specifier}, the @i{function} @b{typep} can be used during method ++selection to determine whether an argument satisfies a @i{parameter specializer}. ++ ++A method all of whose @i{parameter specializers} are ++the @i{class} @b{t} is called a @i{default method} ++@IGindex default method ++; it is always applicable but ++may be shadowed by a more specific method. ++ ++Methods can have @i{qualifiers}, which give the method combination ++procedure a way to distinguish among methods. A method that has one ++or more @i{qualifiers} is called a @i{qualified method}. ++A method with no @i{qualifiers} is called an @i{unqualified method}. ++A @i{qualifier} is any @i{non-list}. ++The @i{qualifiers} defined by the @i{standardized} method combination types ++are @i{symbols}. ++ ++In this specification, the terms ``@i{primary method}'' and ++``@i{auxiliary method}'' are used to partition @i{methods} ++within a method combination type according to their intended use. ++In standard method combination, @i{primary methods} are ++@i{unqualified methods} ++and @i{auxiliary methods} are methods with a single @i{qualifier} ++that is one of @t{:around}, @t{:before}, or @t{:after}. ++@i{Methods} with these @i{qualifiers} are called @i{around methods}, ++@i{before methods}, and @i{after methods}, respectively. ++When a method combination type is defined using the short form of ++@b{define-method-combination}, @i{primary methods} are ++methods qualified with the name of the type of method combination, ++and auxiliary methods have the @i{qualifier} @t{:around}. ++Thus the terms ``@i{primary method}'' and ``@i{auxiliary method}'' ++have only a relative definition within a given method combination type. ++ ++@node Agreement on Parameter Specializers and Qualifiers, Congruent Lambda-lists for all Methods of a Generic Function, Introduction to Methods, Generic Functions and Methods ++@subsection Agreement on Parameter Specializers and Qualifiers ++ ++Two @i{methods} are said to agree with each other on @i{parameter specializers} ++and @i{qualifiers} if the following conditions hold: ++ ++@table @asis ++ ++@item 1. ++Both methods have the same number of required parameters. ++Suppose the @i{parameter specializers} of the two methods are ++P_@{1,1@}... P_@{1,n@} and P_@{2,1@}... P_@{2,n@}. ++ ++@item 2. ++For each 1<= i<= n, P_@{1,i@} agrees with P_@{2,i@}. ++The @i{parameter specializer} P_@{1,i@} agrees with P_@{2,i@} if ++P_@{1,i@} and P_@{2,i@} are the same class or if ++P_@{1,i@}=@t{(@b{eql} @i{object}_1)}, ++P_@{2,i@}=@t{(@b{eql} @i{object}_2)}, and ++@t{(@b{eql} @i{object}_1 @i{object}_2)}. ++Otherwise P_@{1,i@} and P_@{2,i@} do not agree. ++ ++@item 3. ++The two @i{lists} of @i{qualifiers} are the @i{same} ++under @b{equal}. ++ ++@end table ++ ++@node Congruent Lambda-lists for all Methods of a Generic Function, Keyword Arguments in Generic Functions and Methods, Agreement on Parameter Specializers and Qualifiers, Generic Functions and Methods ++@subsection Congruent Lambda-lists for all Methods of a Generic Function ++ ++These rules define the congruence of a set of @i{lambda lists}, including the ++@i{lambda list} of each method for a given generic function and the ++@i{lambda list} specified for the generic function itself, if given. ++ ++@table @asis ++ ++@item 1. ++Each @i{lambda list} must have the same number of required ++parameters. ++ ++@item 2. ++Each @i{lambda list} must have the same number of optional ++parameters. Each method can supply its own default for an optional ++parameter. ++ ++@item 3. ++If any @i{lambda list} mentions @b{&rest} or @b{&key}, each ++@i{lambda list} must mention one or both of them. ++ ++@item 4. ++If the @i{generic function} @i{lambda list} ++mentions @b{&key}, each ++method must accept all of the keyword names mentioned after @b{&key}, ++either by accepting them explicitly, by specifying @b{&allow-other-keys}, ++or by specifying @b{&rest} but not @b{&key}. ++Each method can accept additional keyword arguments of its own. The ++checking of the validity of keyword names is done in the generic ++function, not in each method. ++A method is invoked as if the keyword ++argument pair whose name is @t{:allow-other-keys} and whose value ++is @i{true} were supplied, though no such argument pair will be passed. ++ ++@item 5. ++The use of @b{&allow-other-keys} need not be consistent ++across @i{lambda lists}. If @b{&allow-other-keys} is mentioned in ++the @i{lambda list} of any applicable @i{method} or of the @i{generic function}, ++any keyword arguments may be mentioned in the call to the @i{generic function}. ++ ++@item 6. ++The use of @b{&aux} need not be consistent across methods. ++ ++If a @i{method-defining operator} that cannot specify @i{generic function} options ++creates a @i{generic function}, and if the @i{lambda list} for the method ++mentions keyword arguments, the @i{lambda list} of the generic function ++will mention @b{&key} (but no keyword arguments). ++ ++@end table ++ ++@node Keyword Arguments in Generic Functions and Methods, Method Selection and Combination, Congruent Lambda-lists for all Methods of a Generic Function, Generic Functions and Methods ++@subsection Keyword Arguments in Generic Functions and Methods ++ ++When a generic function or any of its methods mentions ++@b{&key} in a @i{lambda list}, the specific set of keyword ++arguments accepted by the generic function varies according to the ++applicable methods. The set of keyword arguments accepted by the ++generic function for a particular call is the union of the keyword ++arguments accepted by all applicable methods and the keyword arguments ++mentioned after @b{&key} in the generic function definition, ++if any. A method that has @b{&rest} but not @b{&key} does not affect the ++set of acceptable keyword arguments. If ++the @i{lambda list} of any applicable method or of the generic ++function definition contains @b{&allow-other-keys}, all ++keyword arguments are accepted by the generic function. ++ ++The @i{lambda list} congruence rules require that each method ++accept all of the keyword arguments mentioned after @b{&key} in the ++generic function definition, by accepting them explicitly, by ++specifying @b{&allow-other-keys}, or by specifying @b{&rest} but ++not @b{&key}. Each method can accept additional keyword arguments ++of its own, in addition to the keyword arguments mentioned in the ++generic function definition. ++ ++If a @i{generic function} is passed a keyword argument that no applicable ++method accepts, an error should be signaled; see @ref{Error Checking in Function Calls}. ++ ++@menu ++* Examples of Keyword Arguments in Generic Functions and Methods:: ++@end menu ++ ++@node Examples of Keyword Arguments in Generic Functions and Methods, , Keyword Arguments in Generic Functions and Methods, Keyword Arguments in Generic Functions and Methods ++@subsubsection Examples of Keyword Arguments in Generic Functions and Methods ++ ++For example, suppose there are two methods defined for @t{width} ++as follows: ++ ++@example ++ (defmethod width ((c character-class) &key font) ...) ++ ++ (defmethod width ((p picture-class) &key pixel-size) ...) ++@end example ++ ++@noindent ++Assume that there are no other methods and no generic ++function definition for @t{width}. The evaluation of the ++following form should signal an error because ++the keyword argument @t{:pixel-size} is not accepted by the applicable method. ++ ++@example ++ (width (make-instance `character-class :char #\Q) ++ :font 'baskerville :pixel-size 10) ++@end example ++ ++The evaluation of the following form should signal an error. ++ ++@example ++ (width (make-instance `picture-class :glyph (glyph #\Q)) ++ :font 'baskerville :pixel-size 10) ++@end example ++ ++The evaluation of the following form will not signal an error ++if the class named @t{character-picture-class} is a subclass of ++both @t{picture-class} and @t{character-class}. ++ ++@example ++ (width (make-instance `character-picture-class :char #\Q) ++ :font 'baskerville :pixel-size 10) ++@end example ++ ++@node Method Selection and Combination, Inheritance of Methods, Keyword Arguments in Generic Functions and Methods, Generic Functions and Methods ++@subsection Method Selection and Combination ++ ++When a @i{generic function} is called with particular arguments, it must ++determine the code to execute. This code is called the ++@i{effective method} ++@IGindex effective method ++ for those @i{arguments}. ++The @i{effective method} is a ++combination of the @i{applicable methods} in the @i{generic function} ++that @i{calls} some or all of the @i{methods}. ++ ++If a @i{generic function} is called and no @i{methods} are ++@i{applicable}, the @i{generic function} @b{no-applicable-method} ++is invoked, with the @i{results} from that call being used as the ++@i{results} of the call to the original @i{generic function}. Calling ++@b{no-applicable-method} takes precedence over checking for acceptable ++keyword arguments; see @ref{Keyword Arguments in Generic Functions and Methods}. ++ ++When the @i{effective method} has been determined, ++it is invoked with the same @i{arguments} as were passed to the @i{generic function}. ++Whatever @i{values} it returns are returned as the @i{values} ++of the @i{generic function}. ++ ++@menu ++* Determining the Effective Method:: ++* Selecting the Applicable Methods:: ++* Sorting the Applicable Methods by Precedence Order:: ++* Applying method combination to the sorted list of applicable methods:: ++* Standard Method Combination:: ++* Declarative Method Combination:: ++* Built-in Method Combination Types:: ++@end menu ++ ++@node Determining the Effective Method, Selecting the Applicable Methods, Method Selection and Combination, Method Selection and Combination ++@subsubsection Determining the Effective Method ++ ++The effective method is determined by the following three-step procedure: ++ ++@table @asis ++ ++@item 1. ++@r{Select the applicable methods.} ++ ++@item 2. ++@r{Sort the applicable methods by precedence order, putting ++the most specific method first.} ++ ++@item 3. ++@r{Apply method combination to the sorted list of ++applicable methods, producing the effective method.} ++ ++@end table ++ ++@node Selecting the Applicable Methods, Sorting the Applicable Methods by Precedence Order, Determining the Effective Method, Method Selection and Combination ++@subsubsection Selecting the Applicable Methods ++ ++This step is described in @ref{Introduction to Methods}. ++ ++@node Sorting the Applicable Methods by Precedence Order, Applying method combination to the sorted list of applicable methods, Selecting the Applicable Methods, Method Selection and Combination ++@subsubsection Sorting the Applicable Methods by Precedence Order ++ ++To compare the precedence of two methods, their @i{parameter specializers} ++are examined in order. The default examination order is from left to ++right, but an alternative order may be specified by the ++@t{:argument-precedence-order} option to @b{defgeneric} or to any of ++the other operators that specify generic function options. ++ ++The corresponding @i{parameter specializers} from each method are ++compared. When a pair of @i{parameter specializers} agree, the next ++pair are compared for agreement. If all corresponding parameter ++specializers agree, the two methods must have different ++@i{qualifiers}; in this case, either method can be selected to precede the ++other. For information about agreement, see @ref{Agreement on Parameter Specializers and Qualifiers}. ++ ++If some corresponding @i{parameter specializers} do not agree, the first ++pair of @i{parameter specializers} that do not agree determines the ++precedence. If both @i{parameter specializers} are classes, the more ++specific of the two methods is the method whose @i{parameter specializer} ++appears earlier in the @i{class precedence list} of the corresponding ++argument. Because of the way in which the set of applicable methods ++is chosen, the @i{parameter specializers} are guaranteed to be present in ++the class precedence list of the class of the argument. ++ ++If just one of a pair of corresponding @i{parameter specializers} is @t{(eql @i{object})}, ++the @i{method} with that @i{parameter specializer} precedes the ++other @i{method}. If both @i{parameter specializers} are @b{eql} ++@i{expressions}, the ++specializers must agree (otherwise the two @i{methods} would ++not both have been applicable to this argument). ++ ++The resulting list of @i{applicable methods} has the most specific ++@i{method} first and the least specific @i{method} last. ++ ++@node Applying method combination to the sorted list of applicable methods, Standard Method Combination, Sorting the Applicable Methods by Precedence Order, Method Selection and Combination ++@subsubsection Applying method combination to the sorted list of applicable methods ++ ++In the simple case---if standard method combination is used and all ++applicable methods are primary methods---the ++effective method is the most specific method. ++That method can call the next most specific ++method by using the @i{function} @b{call-next-method}. The method that ++@b{call-next-method} will call is referred to as the ++@i{next method} ++@IGindex next method ++. The predicate @b{next-method-p} tests whether a next ++method exists. If @b{call-next-method} is called and there is no ++next most specific method, the generic function @b{no-next-method} ++is invoked. ++ ++In general, the effective method is some combination of the applicable ++methods. It is described by a @i{form} that contains calls to some or ++all of the applicable methods, returns the value or values that will ++be returned as the value or values of the generic function, and ++optionally makes some of the methods accessible by means of ++@b{call-next-method}. ++ ++The role of each method in the effective method is determined by its ++@i{qualifiers} and the specificity of the method. A @i{qualifier} ++serves to mark a method, and the meaning of a @i{qualifier} is ++determined by the way that these marks are used by this step ++of the procedure. If an applicable method has an unrecognized ++@i{qualifier}, this step signals an error and does not include that method ++in the effective method. ++ ++When standard method combination is used together with qualified methods, ++the effective method is produced as described in @ref{Standard Method Combination}. ++ ++Another type of method combination can be specified by using the ++@t{:method-combination} option of @b{defgeneric} or ++of any of the other operators that specify generic function options. In ++this way this step of the procedure can be customized. ++ ++New types of method combination can be defined by using ++the @b{define-method-combination} @i{macro}. ++ ++@node Standard Method Combination, Declarative Method Combination, Applying method combination to the sorted list of applicable methods, Method Selection and Combination ++@subsubsection Standard Method Combination ++ ++@IRindex standard ++ ++Standard method combination is supported by the @i{class} @b{standard-generic-function}. ++It is used if no other type of method ++combination is specified or if the built-in method combination type ++@b{standard} is specified. ++ ++Primary methods define the main action of the effective method, ++while auxiliary methods modify that action in one of three ways. ++A primary method has no method @i{qualifiers}. ++ ++An auxiliary method is a method whose ++@i{qualifier} is @t{:before}, @t{:after}, or @t{:around}. ++Standard method combination ++allows no more than one @i{qualifier} per method; if a method definition ++specifies more than one @i{qualifier} per method, an error is signaled. ++ ++@table @asis ++ ++@item @t{*} ++A @i{before method} has the keyword @t{:before} as its only @i{qualifier}. ++A @i{before method} specifies @i{code} that is to be run before any ++@i{primary methods}. ++ ++@item @t{*} ++An @i{after method} has the keyword @t{:after} as its only @i{qualifier}. ++An @i{after method} specifies @i{code} that is to be run after ++@i{primary methods}. ++ ++@item @t{*} ++An @i{around method} has the keyword @t{:around} as its only @i{qualifier}. ++An @i{around method} specifies @i{code} that is to be run instead of other ++@i{applicable methods}, ++but which might contain explicit @i{code} ++which calls some of those @i{shadowed} @i{methods} ++(via @b{call-next-method}). ++ ++@end table ++ ++The semantics of standard method combination is as follows: ++ ++@table @asis ++ ++@item @t{*} ++If there are any @i{around methods}, the most specific ++@i{around method} is called. It supplies the value or values of the ++generic function. ++ ++@item @t{*} ++Inside the body of an @i{around method}, ++@b{call-next-method} can be used to call the @i{next method}. When the next ++method returns, the @i{around method} can execute more code, ++perhaps based on the returned value or values. ++The @i{generic function} @b{no-next-method} is invoked if @b{call-next-method} is used and ++there is no @i{applicable method} to call. The @i{function} @b{next-method-p} ++may be used to determine whether a @i{next method} exists. ++ ++@item @t{*} ++If an @i{around method} invokes @b{call-next-method}, ++the next most specific @i{around method} ++is called, if one is applicable. If there are no @i{around methods} ++or if @b{call-next-method} is called by the least ++specific @i{around method}, the other methods are called as ++follows: ++@table @asis ++ ++@item -- ++All the @i{before methods} are called, in ++most-specific-first order. Their values are ignored. ++An error is signaled if @b{call-next-method} is used in a ++@i{before method}. ++ ++@item -- ++The most specific primary method is called. Inside the ++body of a primary method, @b{call-next-method} may be used to call ++the next most specific primary method. When that method returns, the ++previous primary method can execute more code, perhaps based on the ++returned value or values. The generic function @b{no-next-method} ++is invoked if @b{call-next-method} is used and there are no more ++applicable primary methods. The @i{function} @b{next-method-p} may be ++used to determine whether a @i{next method} exists. If @b{call-next-method} ++is not used, only the most specific @i{primary method} is called. ++ ++@item -- ++All the @i{after methods} are called in ++most-specific-last order. Their values are ignored. ++An error is signaled if @b{call-next-method} is used in an ++@i{after method}. ++@end table ++ ++@item @t{*} ++If no @i{around methods} were invoked, the most ++specific primary method supplies the value or values returned by the ++generic function. The value or values returned by the invocation of ++@b{call-next-method} in the least specific @i{around method} are ++those returned by the most specific primary method. ++ ++@end table ++ ++In standard method combination, if there is an applicable method ++but no applicable primary method, an error is signaled. ++ ++The @i{before methods} are run in most-specific-first order while ++the @i{after methods} are run in least-specific-first order. The ++design rationale for this difference can be illustrated with an ++example. Suppose class C_1 modifies the behavior of its ++superclass, C_2, by adding @i{before methods} and @i{after methods}. ++Whether the behavior of the class C_2 is defined ++directly by methods on C_2 or is inherited from its superclasses ++does not affect the relative order of invocation of methods on ++instances of the class C_1. Class C_1's ++@i{before method} runs before all of class C_2's methods. ++Class C_1's @i{after method} runs after all of class C_2's methods. ++ ++By contrast, all @i{around methods} run before any other methods ++run. Thus a less specific @i{around method} runs before a more ++specific primary method. ++ ++If only primary methods are used and if @b{call-next-method} is not ++used, only the most specific method is invoked; that is, more specific ++methods shadow more general ones. ++ ++@node Declarative Method Combination, Built-in Method Combination Types, Standard Method Combination, Method Selection and Combination ++@subsubsection Declarative Method Combination ++ ++The macro @b{define-method-combination} defines new forms of method ++combination. It provides a mechanism for customizing the production ++of the effective method. The default procedure for producing an ++effective method is described in @ref{Determining the Effective Method}. ++There are two forms of ++@b{define-method-combination}. The short form is a simple facility while ++the long form is more powerful and more verbose. The long form ++resembles @b{defmacro} in that the body is an expression that ++computes a Lisp form; it provides mechanisms for implementing ++arbitrary control structures within method combination and for ++arbitrary processing of method @i{qualifiers}. ++ ++@node Built-in Method Combination Types, , Declarative Method Combination, Method Selection and Combination ++@subsubsection Built-in Method Combination Types ++ ++The object system provides a set of built-in method combination types. To ++specify that a generic function is to use one of these method ++combination types, the name of the method combination type is given as ++the argument to the @t{:method-combination} option to ++@b{defgeneric} or to the @t{:method-combination} option to any of the ++other operators that specify generic function options. ++ ++The names of the built-in method combination types are listed in Figure 7--3. ++ ++@IRindex + ++ ++@IRindex and ++ ++@IRindex append ++ ++@IRindex list ++ ++@IRindex max ++ ++@IRindex min ++ ++@IRindex nconc ++ ++@IRindex or ++ ++@IRindex progn ++ ++@IRindex standard ++ ++@format ++@group ++@noindent ++@w{ + append max nconc progn } ++@w{ and list min or standard } ++ ++@noindent ++@w{ Figure 7--3: Built-in Method Combination Types} ++ ++@end group ++@end format ++ ++The semantics of the @b{standard} built-in method combination type is ++described in @ref{Standard Method Combination}. The other ++built-in method combination types are called simple built-in method ++combination types. ++ ++The simple built-in method combination types act as though they were ++defined by the short form of @b{define-method-combination}. ++They recognize two roles for @i{methods}: ++ ++@table @asis ++ ++@item @t{*} ++An @i{around method} has the keyword symbol ++@t{:around} as its sole @i{qualifier}. The meaning of ++@t{:around} @i{methods} is the same as in standard method combination. ++Use of the functions @b{call-next-method} and @b{next-method-p} ++is supported in @i{around methods}. ++ ++@item @t{*} ++A primary method has the name of the method combination ++type as its sole @i{qualifier}. For example, the built-in method ++combination type @t{and} recognizes methods whose sole @i{qualifier} is ++@t{and}; these are primary methods. Use of the functions ++@b{call-next-method} and @b{next-method-p} is not supported ++in @i{primary methods}. ++ ++@end table ++ ++The semantics of the simple built-in method combination types is as ++follows: ++ ++@table @asis ++ ++@item @t{*} ++If there are any @i{around methods}, the most specific @i{around method} ++is called. It supplies the value or values of the @i{generic function}. ++ ++@item @t{*} ++Inside the body of an @i{around method}, the function ++@b{call-next-method} can be used to call the @i{next method}. ++The @i{generic function} @b{no-next-method} is invoked if ++@b{call-next-method} is used and there is no applicable method to call. ++The @i{function} @b{next-method-p} may be used to determine whether a ++@i{next method} exists. When the @i{next method} returns, ++the @i{around method} can execute more code, ++perhaps based on the returned value or values. ++ ++@item @t{*} ++If an @i{around method} invokes @b{call-next-method}, ++the next most specific @i{around method} is ++called, if one is applicable. If there are no @i{around methods} ++or if @b{call-next-method} is called by the least specific ++@i{around method}, a Lisp form derived from the name of the built-in ++method combination type and from the list of applicable primary ++methods is evaluated to produce the value of the generic function. ++Suppose the name of the method combination type is @i{operator} ++and the call to the generic function is of the form ++ ++@center (@i{generic-function} a_1... a_n) ++ ++@item @t{} ++Let M_1,...,M_k be the applicable primary methods ++in order; then the derived Lisp form is ++ ++@center (@i{operator} < M_1 ++ a_1... a_n>...< ++M_k a_1... a_n>) ++ ++@item @t{} ++If the expression < M_i a_1... a_n> is ++evaluated, the method M_i will be applied to the arguments ++a_1... a_n. ++For example, ++if @i{operator} is @t{or}, ++the expression < M_i a_1... a_n> is ++evaluated only if < M_j a_1... a_n>, ++1<= j ++ (find-method #'gf1 '() (list (find-class 'integer))) ++@result{} # ++ (function-keywords *) ++@result{} (:C :DEE :E EFF), @i{false} ++ (defmethod gf2 ((a integer)) ++ (list a b c d e f)) ++@result{} # ++ (function-keywords (find-method #'gf1 '() (list (find-class 'integer)))) ++@result{} (), @i{false} ++ (defmethod gf3 ((a integer) &key b c d &allow-other-keys) ++ (list a b c d e f)) ++ (function-keywords *) ++@result{} (:B :C :D), @i{true} ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{defmethod} ++ ++@subsubheading See Also:: ++ ++@ref{defmethod} ++ ++@node ensure-generic-function, allocate-instance, function-keywords, Objects Dictionary ++@subsection ensure-generic-function [Function] ++ ++@code{ensure-generic-function} @i{function-name @r{&key} ++ argument-precedence-order declare ++ documentation environment ++ generic-function-class lambda-list ++ method-class method-combination}@* ++ @result{} @i{generic-function} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-name}---a @i{function name}. ++ ++The keyword arguments correspond to the @i{option} arguments of ++@b{defgeneric}, except that the @t{:method-class} and ++@t{:generic-function-class} arguments can be @i{class} @i{object}s ++as well as names. ++ ++@t{Method-combination} -- method combination object. ++ ++@t{Environment} -- the same as the @b{&environment} argument ++to macro expansion functions and is used to distinguish between compile-time ++and run-time environments. ++ ++[Editorial Note by KMP: What about documentation. Missing from this arguments enumeration, ++ and confusing in description below.] ++ ++@i{generic-function}---a @i{generic function} @i{object}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{ensure-generic-function} is used to define ++a globally named @i{generic function} with no @i{methods} ++or to specify or modify options and declarations that pertain to ++a globally named @i{generic function} as a whole. ++ ++If @i{function-name} is not @i{fbound} in the @i{global environment}, ++a new ++@i{generic function} is created. ++If ++ ++@t{(fdefinition @i{function-name})} ++ ++is an @i{ordinary function}, ++a @i{macro}, ++or a @i{special operator}, ++an error is signaled. ++ ++If @i{function-name} ++is a @i{list}, it must be of the ++form @t{(setf @i{symbol})}. ++If @i{function-name} specifies a @i{generic function} that has a ++different value for any of the following arguments, ++the @i{generic function} is modified to have the new value: ++@t{:argument-precedence-order}, @t{:declare}, @t{:documentation}, ++@t{:method-combination}. ++ ++If @i{function-name} specifies a @i{generic function} that has a ++different value for the @t{:lambda-list} argument, and the new value ++is congruent with the @i{lambda lists} of all existing ++@i{methods} or there ++are no @i{methods}, the value is changed; otherwise an error is signaled. ++ ++If @i{function-name} specifies a @i{generic function} that has a ++different value for the @t{:generic-function-class} argument and if ++the new generic function class is compatible with the old, ++@b{change-class} is called to change the @i{class} of the ++@i{generic function}; ++otherwise an error is signaled. ++ ++If @i{function-name} specifies a @i{generic function} that has a ++different value for the @t{:method-class} argument, the value is ++changed, but any existing @i{methods} are not changed. ++ ++@subsubheading Affected By:: ++ ++Existing function binding of @i{function-name}. ++ ++@subsubheading Exceptional Situations:: ++ ++If ++ ++@t{(fdefinition @i{function-name})} ++ ++is an @i{ordinary function}, a @i{macro}, or a @i{special operator}, ++an error of @i{type} @b{error} is signaled. ++ ++If @i{function-name} specifies a ++@i{generic function} that has a ++different value for the @t{:lambda-list} argument, and the new value ++is not congruent with the @i{lambda list} of any existing ++@i{method}, ++an error of @i{type} @b{error} is signaled. ++ ++If @i{function-name} specifies a ++@i{generic function} that has a ++different value for the @t{:generic-function-class} argument and if ++the new generic function class not is compatible with the old, ++an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{defgeneric} ++ ++@node allocate-instance, reinitialize-instance, ensure-generic-function, Objects Dictionary ++@subsection allocate-instance [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{allocate-instance} @i{class @r{&rest} initargs @r{&key} @r{&allow-other-keys}} @result{} @i{new-instance} ++ ++@subsubheading Method Signatures:: ++ ++@code{allocate-instance} @i{@r{(}@i{class} @b{standard-class}@r{)} @r{&rest} initargs} ++ ++@code{allocate-instance} @i{@r{(}@i{class} @b{structure-class}@r{)} @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{class}---a @i{class}. ++ ++@i{initargs}---a @i{list} of @i{keyword/value pairs} ++ (initialization argument @i{names} and @i{values}). ++ ++@i{new-instance}---an @i{object} whose @i{class} is @i{class}. ++ ++@subsubheading Description:: ++ ++The generic function @b{allocate-instance} creates and returns ++a new instance of the @i{class}, without initializing it. ++When the @i{class} is a @i{standard class}, this means that ++the @i{slots} are @i{unbound}; when the @i{class} is a ++@i{structure class}, this means the @i{slots}' @i{values} ++are unspecified. ++ ++The caller of @b{allocate-instance} is expected to have ++already checked the initialization arguments. ++ ++The @i{generic function} @b{allocate-instance} is called by ++@b{make-instance}, as described in ++@ref{Object Creation and Initialization}. ++ ++@subsubheading See Also:: ++ ++@ref{defclass} ++, ++@ref{make-instance} ++, ++@ref{class-of} ++, ++@ref{Object Creation and Initialization} ++ ++@subsubheading Notes:: ++ ++The consequences of adding @i{methods} to @b{allocate-instance} is unspecified. ++This capability might be added by the @i{Metaobject Protocol}. ++ ++@node reinitialize-instance, shared-initialize, allocate-instance, Objects Dictionary ++@subsection reinitialize-instance [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{reinitialize-instance} @i{instance @r{&rest} initargs @r{&key} @r{&allow-other-keys}} @result{} @i{instance} ++ ++@subsubheading Method Signatures:: ++ ++@code{reinitialize-instance} @i{@r{(}@i{instance} @b{standard-object}@r{)} @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance}---an @i{object}. ++ ++@i{initargs}---an @i{initialization argument list}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{reinitialize-instance} can be used to change ++the values of @i{local slots} of an @i{instance} according to ++@i{initargs}. ++This @i{generic function} can be called by users. ++ ++The system-supplied primary @i{method} for @b{reinitialize-instance} ++checks the validity of @i{initargs} and signals an error if ++an @i{initarg} is supplied that is not declared as valid. ++The @i{method} then calls the generic function @b{shared-initialize} ++with the following arguments: the @i{instance}, ++@b{nil} (which means no @i{slots} ++should be initialized according to their initforms), and the ++@i{initargs} it received. ++ ++@subsubheading Side Effects:: ++ ++The @i{generic function} @b{reinitialize-instance} changes the values of @i{local slots}. ++ ++@subsubheading Exceptional Situations:: ++ ++The system-supplied primary @i{method} for @b{reinitialize-instance} ++signals an error if an @i{initarg} is supplied that is not declared as valid. ++ ++@subsubheading See Also:: ++ ++@ref{Initialize-Instance} ++, ++@ref{Shared-Initialize} ++, ++@ref{update-instance-for-redefined-class} ++, ++@ref{update-instance-for-different-class} ++, ++@ref{slot-boundp} ++, ++@ref{slot-makunbound} ++, ++@ref{Reinitializing an Instance}, ++@ref{Rules for Initialization Arguments}, ++@ref{Declaring the Validity of Initialization Arguments} ++ ++@subsubheading Notes:: ++ ++@i{Initargs} are declared as valid by using the ++@t{:initarg} option to @b{defclass}, or by defining ++@i{methods} for @b{reinitialize-instance} ++or @b{shared-initialize}. The keyword name ++of each keyword parameter specifier in the @i{lambda list} of any ++@i{method} ++defined on @b{reinitialize-instance} or @b{shared-initialize} is ++declared as a valid initialization argument name for all ++@i{classes} for ++which that @i{method} is applicable. ++ ++@node shared-initialize, update-instance-for-different-class, reinitialize-instance, Objects Dictionary ++@subsection shared-initialize [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{shared-initialize} @i{instance slot-names @r{&rest} initargs @r{&key} @r{&allow-other-keys}} @result{} @i{instance} ++ ++@subsubheading Method Signatures:: ++ ++@code{shared-initialize} @i{@r{(}@i{instance} @b{standard-object}@r{)} slot-names @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance}---an @i{object}. ++ ++@i{slot-names}---a @i{list} or @b{t}. ++ ++@i{initargs}---a @i{list} of @i{keyword/value pairs} ++ (of initialization argument @i{names} and @i{values}). ++ ++@subsubheading Description:: ++ ++The generic function @b{shared-initialize} is used to fill the ++@i{slots} ++of an @i{instance} ++using @i{initargs} and @t{:initform} ++forms. It is called when an instance is created, when an instance is ++re-initialized, when an instance is updated to conform to a redefined ++@i{class}, and when an instance is updated to conform to a different ++@i{class}. The generic function @b{shared-initialize} is called by the ++system-supplied primary @i{method} for @b{initialize-instance}, ++@b{reinitialize-instance}, @b{update-instance-for-redefined-class}, and ++@b{update-instance-for-different-class}. ++ ++The generic function @b{shared-initialize} takes the following ++arguments: the @i{instance} to be initialized, a specification of a set of ++@i{slot-names} @i{accessible} in that @i{instance}, ++and any number of @i{initargs}. ++The arguments after the first two must form an ++@i{initialization argument list}. The system-supplied primary @i{method} on ++@b{shared-initialize} initializes the @i{slots} with values according to the ++@i{initargs} and supplied @t{:initform} forms. @i{Slot-names} ++indicates which @i{slots} should be initialized according ++to their @t{:initform} forms if no @i{initargs} are ++provided for those @i{slots}. ++ ++The system-supplied primary @i{method} behaves as follows, ++regardless of whether the @i{slots} are local or shared: ++ ++@table @asis ++ ++@item @t{*} ++If an @i{initarg} in the @i{initialization argument list} ++ specifies a value for that @i{slot}, that ++ value is stored into the @i{slot}, even if a value has ++ already been stored in the @i{slot} before the @i{method} is run. ++ ++@item @t{*} ++Any @i{slots} indicated by @i{slot-names} that are still unbound ++ at this point are initialized according to their @t{:initform} forms. ++ For any such @i{slot} that has an @t{:initform} form, ++ that @i{form} is evaluated in the lexical environment of its defining ++ @b{defclass} @i{form} and the result is stored into the @i{slot}. ++ For example, if a @i{before method} stores a value in the @i{slot}, ++ the @t{:initform} form will not be used to supply a value for the @i{slot}. ++ ++@item @t{*} ++The rules mentioned in @ref{Rules for Initialization Arguments} are obeyed. ++ ++@end table ++ ++The @i{slots-names} argument specifies the @i{slots} that are to be ++initialized according to their @t{:initform} forms if no ++initialization arguments apply. It can be a @i{list} of slot @i{names}, ++which specifies the set of those slot @i{names}; or it can be the @i{symbol} @b{t}, ++which specifies the set of all of the @i{slots}. ++ ++@subsubheading See Also:: ++ ++@ref{Initialize-Instance} ++, ++@ref{reinitialize-instance} ++, ++@ref{update-instance-for-redefined-class} ++, ++@ref{update-instance-for-different-class} ++, ++@ref{slot-boundp} ++, ++@ref{slot-makunbound} ++, ++@ref{Object Creation and Initialization}, ++@ref{Rules for Initialization Arguments}, ++@ref{Declaring the Validity of Initialization Arguments} ++ ++@subsubheading Notes:: ++ ++@i{Initargs} are declared as valid by using the @t{:initarg} ++option to @b{defclass}, or by defining ++@i{methods} for @b{shared-initialize}. ++The keyword name of each keyword parameter ++specifier in the @i{lambda list} of any @i{method} defined on ++@b{shared-initialize} is declared as a valid @i{initarg} ++name for all @i{classes} for which that @i{method} is applicable. ++ ++Implementations are permitted to optimize @t{:initform} forms that ++neither produce nor depend on side effects, by evaluating these @i{forms} ++and storing them into slots before running any ++@b{initialize-instance} methods, rather than by handling them in the ++primary @b{initialize-instance} method. (This optimization might ++be implemented by having the @b{allocate-instance} method copy a ++prototype instance.) ++ ++Implementations are permitted to optimize default initial value forms ++for @i{initargs} associated with slots by not actually ++creating the complete initialization argument ++@i{list} when the only @i{method} ++that would receive the complete @i{list} is the ++@i{method} on @b{standard-object}. ++In this case default initial value forms can be ++treated like @t{:initform} forms. This optimization has no visible ++effects other than a performance improvement. ++ ++@node update-instance-for-different-class, update-instance-for-redefined-class, shared-initialize, Objects Dictionary ++@subsection update-instance-for-different-class [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{update-instance-for-different-class} @i{previous current ++ @r{&rest} initargs ++ @r{&key} @r{&allow-other-keys}} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Method Signatures:: ++ ++@code{update-instance-for-different-class} @i{@r{(}@i{previous} @b{standard-object}@r{)} ++ @r{(}@i{current} @b{standard-object}@r{)} ++ @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{previous}---a copy of the original @i{instance}. ++ ++@i{current}---the original @i{instance} (altered). ++ ++@i{initargs}---an @i{initialization argument list}. ++ ++@subsubheading Description:: ++ ++The generic function @b{update-instance-for-different-class} is not ++intended to be called by programmers. Programmers may write ++@i{methods} for it. The @i{function} @b{update-instance-for-different-class} ++is called only by the @i{function} @b{change-class}. ++ ++The system-supplied primary @i{method} on ++@b{update-instance-for-different-class} checks the validity of ++@i{initargs} and signals an error if an @i{initarg} ++is supplied that is not declared as valid. This @i{method} then ++initializes @i{slots} with values according to the @i{initargs}, ++and initializes the newly added @i{slots} with values according ++to their @t{:initform} forms. It does this by calling the generic ++function @b{shared-initialize} with the following arguments: the ++instance (@i{current}), ++a list of @i{names} of the newly added @i{slots}, and the @i{initargs} ++it received. Newly added @i{slots} are those @i{local slots} for which ++no @i{slot} of the same name exists in the @i{previous} class. ++ ++@i{Methods} for @b{update-instance-for-different-class} can be defined to ++specify actions to be taken when an @i{instance} is updated. If only ++@i{after methods} for @b{update-instance-for-different-class} are ++defined, they will be run after the system-supplied primary @i{method} for ++initialization and therefore will not interfere with the default ++behavior of @b{update-instance-for-different-class}. ++ ++@i{Methods} on @b{update-instance-for-different-class} can be defined to ++initialize @i{slots} differently from @b{change-class}. The default ++behavior of @b{change-class} is described in ++@ref{Changing the Class of an Instance}. ++ ++The arguments to @b{update-instance-for-different-class} are ++computed by @b{change-class}. When @b{change-class} is invoked on ++an @i{instance}, a copy of that @i{instance} is made; @b{change-class} then ++destructively alters the original @i{instance}. The first argument to ++@b{update-instance-for-different-class}, @i{previous}, is that ++copy; it holds the old @i{slot} values temporarily. This argument has ++dynamic extent within @b{change-class}; if it is referenced in any ++way once @b{update-instance-for-different-class} returns, the ++results are undefined. The second argument to ++@b{update-instance-for-different-class}, @i{current}, is the altered ++original @i{instance}. ++The intended use of @i{previous} is to extract old @i{slot} values by using ++@b{slot-value} or @b{with-slots} or by invoking ++a reader generic function, or to run other @i{methods} that were applicable to ++@i{instances} of ++the original @i{class}. ++ ++@subsubheading Examples:: ++ ++See the example for the @i{function} @b{change-class}. ++ ++@subsubheading Exceptional Situations:: ++The system-supplied primary @i{method} on ++@b{update-instance-for-different-class} signals an error if an ++initialization argument is supplied that is not declared as valid. ++ ++@subsubheading See Also:: ++ ++@ref{change-class} ++, ++@ref{Shared-Initialize} ++, ++@ref{Changing the Class of an Instance}, ++@ref{Rules for Initialization Arguments}, ++@ref{Declaring the Validity of Initialization Arguments} ++ ++@subsubheading Notes:: ++ ++@i{Initargs} are declared as valid by using the @t{:initarg} ++option to @b{defclass}, or by defining @i{methods} ++for @b{update-instance-for-different-class} or @b{shared-initialize}. ++The keyword name of each keyword parameter specifier in the @i{lambda list} of ++any @i{method} defined on @b{update-instance-for-different-class} ++or @b{shared-initialize} is declared as a valid @i{initarg} name ++for all @i{classes} for which that @i{method} is applicable. ++ ++The value returned by @b{update-instance-for-different-class} is ++ignored by @b{change-class}. ++ ++@node update-instance-for-redefined-class, change-class, update-instance-for-different-class, Objects Dictionary ++@subsection update-instance-for-redefined-class [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{update-instance-for-redefined-class} @i{instance ++ added-slots discarded-slots ++ property-list ++ @r{&rest} initargs @r{&key} @r{&allow-other-keys}}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Method Signatures:: ++ ++@code{update-instance-for-redefined-class} @i{@r{(}@i{instance} @b{standard-object}@r{)} ++ added-slots discarded-slots ++ property-list ++ @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance}---an @i{object}. ++ ++@i{added-slots}---a @i{list}. ++ ++@i{discarded-slots}---a @i{list}. ++ ++@i{property-list}---a @i{list}. ++ ++@i{initargs}---an @i{initialization argument list}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{update-instance-for-redefined-class} ++is not intended to be called by programmers. Programmers may write ++@i{methods} for it. The @i{generic function} ++@b{update-instance-for-redefined-class} is called by the mechanism ++activated by @b{make-instances-obsolete}. ++ ++The system-supplied primary @i{method} on ++@b{update-instance-for-redefined-class} checks the validity of ++@i{initargs} and signals an error if an @i{initarg} ++is supplied that is not declared as valid. This @i{method} then ++initializes @i{slots} with values according to the @i{initargs}, ++and initializes the newly @i{added-slots} with values according ++to their @t{:initform} forms. It does this by calling the generic ++function @b{shared-initialize} with the following arguments: ++the @i{instance}, ++a list of names of the newly @i{added-slots} to @i{instance}, ++and the @i{initargs} ++it received. Newly @i{added-slots} are those @i{local slots} for which ++no @i{slot} of the same name exists in the old version of the @i{class}. ++ ++When @b{make-instances-obsolete} is invoked or when a @i{class} has been ++redefined and an @i{instance} is being updated, a @i{property-list} is created ++that captures the slot names and values of all the @i{discarded-slots} with ++values in the original @i{instance}. The structure of the ++@i{instance} is ++transformed so that it conforms to the current class definition. The ++arguments to @b{update-instance-for-redefined-class} are this ++transformed @i{instance}, a list of @i{added-slots} to the ++@i{instance}, a list @i{discarded-slots} from the ++@i{instance}, and the @i{property-list} ++containing the slot names and values for ++@i{slots} that were discarded and had values. Included in this list of ++discarded @i{slots} are @i{slots} that were local in the old @i{class} and are ++shared in the new @i{class}. ++ ++The value returned by @b{update-instance-for-redefined-class} is ignored. ++ ++@subsubheading Examples:: ++ ++@example ++ ++ (defclass position () ()) ++ ++ (defclass x-y-position (position) ++ ((x :initform 0 :accessor position-x) ++ (y :initform 0 :accessor position-y))) ++ ++;;; It turns out polar coordinates are used more than Cartesian ++;;; coordinates, so the representation is altered and some new ++;;; accessor methods are added. ++ ++ (defmethod update-instance-for-redefined-class :before ++ ((pos x-y-position) added deleted plist &key) ++ ;; Transform the x-y coordinates to polar coordinates ++ ;; and store into the new slots. ++ (let ((x (getf plist 'x)) ++ (y (getf plist 'y))) ++ (setf (position-rho pos) (sqrt (+ (* x x) (* y y))) ++ (position-theta pos) (atan y x)))) ++ ++ (defclass x-y-position (position) ++ ((rho :initform 0 :accessor position-rho) ++ (theta :initform 0 :accessor position-theta))) ++ ++;;; All instances of the old x-y-position class will be updated ++;;; automatically. ++ ++;;; The new representation is given the look and feel of the old one. ++ ++ (defmethod position-x ((pos x-y-position)) ++ (with-slots (rho theta) pos (* rho (cos theta)))) ++ ++ (defmethod (setf position-x) (new-x (pos x-y-position)) ++ (with-slots (rho theta) pos ++ (let ((y (position-y pos))) ++ (setq rho (sqrt (+ (* new-x new-x) (* y y))) ++ theta (atan y new-x)) ++ new-x))) ++ ++ (defmethod position-y ((pos x-y-position)) ++ (with-slots (rho theta) pos (* rho (sin theta)))) ++ ++ (defmethod (setf position-y) (new-y (pos x-y-position)) ++ (with-slots (rho theta) pos ++ (let ((x (position-x pos))) ++ (setq rho (sqrt (+ (* x x) (* new-y new-y))) ++ theta (atan new-y x)) ++ new-y))) ++ ++@end example ++ ++@subsubheading Exceptional Situations:: ++The system-supplied primary @i{method} on ++@b{update-instance-for-redefined-class} signals an error if an ++@i{initarg} is supplied that is not declared as valid. ++ ++@subsubheading See Also:: ++ ++@ref{make-instances-obsolete} ++, ++@ref{Shared-Initialize} ++, ++@ref{Redefining Classes}, ++@ref{Rules for Initialization Arguments}, ++@ref{Declaring the Validity of Initialization Arguments} ++ ++@subsubheading Notes:: ++ ++@i{Initargs} are declared as valid by using the @t{:initarg} ++option to @b{defclass}, or by defining @i{methods} for ++@b{update-instance-for-redefined-class} or @b{shared-initialize}. ++The keyword name of each keyword parameter specifier in the @i{lambda list} of ++any @i{method} defined on ++@b{update-instance-for-redefined-class} or ++@b{shared-initialize} is declared as a valid @i{initarg} name ++for all @i{classes} for which that @i{method} is applicable. ++ ++@node change-class, slot-boundp, update-instance-for-redefined-class, Objects Dictionary ++@subsection change-class [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{change-class} @i{instance new-class @r{&key} @r{&allow-other-keys}} @result{} @i{instance} ++ ++@subsubheading Method Signatures:: ++ ++@code{change-class} @i{@r{(}@i{instance} @b{standard-object}@r{)} ++ @r{(}@i{new-class} @b{standard-class}@r{)} ++ @r{&rest} initargs} ++ ++@code{change-class} @i{@r{(}@i{instance} @b{t}@r{)} ++ @r{(}@i{new-class} @b{symbol}@r{)} ++ @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance}---an @i{object}. ++ ++@i{new-class}---a @i{class designator}. ++ ++@i{initargs}---an @i{initialization argument list}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{change-class} changes the ++@i{class} of an @i{instance} to @i{new-class}. ++It destructively modifies and returns the @i{instance}. ++ ++If in the old @i{class} there is any @i{slot} of the ++same name as a local @i{slot} in the @i{new-class}, ++the value of that @i{slot} is retained. This means that if ++the @i{slot} has a value, the value returned by @b{slot-value} ++after @b{change-class} is invoked is @b{eql} to the ++value returned by @b{slot-value} before @b{change-class} is ++invoked. Similarly, if the @i{slot} was unbound, it remains ++unbound. The other @i{slots} are initialized as described in ++@ref{Changing the Class of an Instance}. ++ ++After completing all other actions, @b{change-class} invokes ++@b{update-instance-for-different-class}. The ++generic function @b{update-instance-for-different-class} can be used ++to assign values to slots in the transformed instance. ++ ++See @ref{Initializing Newly Added Local Slots (Changing the Class of an Instance)}. ++ ++If the second of the above @i{methods} is selected, ++that @i{method} invokes @b{change-class} ++on @i{instance}, @t{(find-class @i{new-class})}, ++and the @i{initargs}. ++ ++@subsubheading Examples:: ++ ++@example ++ ++ (defclass position () ()) ++ ++ (defclass x-y-position (position) ++ ((x :initform 0 :initarg :x) ++ (y :initform 0 :initarg :y))) ++ ++ (defclass rho-theta-position (position) ++ ((rho :initform 0) ++ (theta :initform 0))) ++ ++ (defmethod update-instance-for-different-class :before ((old x-y-position) ++ (new rho-theta-position) ++ &key) ++ ;; Copy the position information from old to new to make new ++ ;; be a rho-theta-position at the same position as old. ++ (let ((x (slot-value old 'x)) ++ (y (slot-value old 'y))) ++ (setf (slot-value new 'rho) (sqrt (+ (* x x) (* y y))) ++ (slot-value new 'theta) (atan y x)))) ++ ++;;; At this point an instance of the class x-y-position can be ++;;; changed to be an instance of the class rho-theta-position using ++;;; change-class: ++ ++ (setq p1 (make-instance 'x-y-position :x 2 :y 0)) ++ ++ (change-class p1 'rho-theta-position) ++ ++;;; The result is that the instance bound to p1 is now an instance of ++;;; the class rho-theta-position. The update-instance-for-different-class ++;;; method performed the initialization of the rho and theta slots based ++;;; on the value of the x and y slots, which were maintained by ++;;; the old instance. ++ ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{update-instance-for-different-class} ++, ++@ref{Changing the Class of an Instance} ++ ++@subsubheading Notes:: ++ ++The generic function @b{change-class} has several semantic ++difficulties. First, it performs a destructive operation that can be ++invoked within a @i{method} on an @i{instance} that was used to select that ++@i{method}. ++When multiple @i{methods} are involved because @i{methods} are being ++combined, the @i{methods} currently executing or about to be executed may ++no longer be applicable. Second, some implementations might use ++compiler optimizations of slot @i{access}, and when the @i{class} of an ++@i{instance} is changed the assumptions the compiler made might be ++violated. This implies that a programmer must not use ++@b{change-class} inside a @i{method} if any ++@i{methods} for that @i{generic function} ++@i{access} any @i{slots}, or the results are undefined. ++ ++@node slot-boundp, slot-exists-p, change-class, Objects Dictionary ++@subsection slot-boundp [Function] ++ ++@code{slot-boundp} @i{instance slot-name} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance}---an @i{object}. ++ ++@i{slot-name}---a @i{symbol} naming a @i{slot} of @i{instance}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if the @i{slot} named @i{slot-name} in @i{instance} is bound; ++otherwise, returns @i{false}. ++ ++@subsubheading Exceptional Situations:: ++ ++If no @i{slot} of the @i{name} @i{slot-name} exists in the ++@i{instance}, @b{slot-missing} is called as follows: ++ ++@example ++ (slot-missing (class-of @i{instance}) ++ @i{instance} ++ @i{slot-name} ++ 'slot-boundp) ++@end example ++ ++(If @b{slot-missing} is invoked and returns a value, ++a @i{boolean equivalent} to its @i{primary value} ++is returned by @b{slot-boundp}.) ++ ++The specific behavior depends on @i{instance}'s @i{metaclass}. ++An error is never signaled if @i{instance} has @i{metaclass} @b{standard-class}. ++An error is always signaled if @i{instance} has @i{metaclass} @b{built-in-class}. ++The consequences are undefined if @i{instance} has any other @i{metaclass}--an error ++might or might not be signaled in this situation. Note in particular that the behavior ++for @i{conditions} and @i{structures} is not specified. ++ ++@subsubheading See Also:: ++ ++@ref{slot-makunbound} ++, ++@ref{slot-missing} ++ ++@subsubheading Notes:: ++ ++The @i{function} @b{slot-boundp} allows for writing ++@i{after methods} on @b{initialize-instance} in order to initialize only ++those @i{slots} that have not already been bound. ++ ++ Although no @i{implementation} is required to do so, ++ implementors are strongly encouraged to implement the @i{function} @b{slot-boundp} using ++ the @i{function} @t{slot-boundp-using-class} described in the @i{Metaobject Protocol}. ++ ++@node slot-exists-p, slot-makunbound, slot-boundp, Objects Dictionary ++@subsection slot-exists-p [Function] ++ ++@code{slot-exists-p} @i{object slot-name} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{slot-name}---a @i{symbol}. ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++Returns @i{true} if the @i{object} has ++a @i{slot} named @i{slot-name}. ++ ++@subsubheading Affected By:: ++ ++@b{defclass}, ++@b{defstruct} ++ ++@subsubheading See Also:: ++ ++@ref{defclass} ++, ++@ref{slot-missing} ++ ++@subsubheading Notes:: ++ ++ Although no @i{implementation} is required to do so, ++ implementors are strongly encouraged to implement the @i{function} @b{slot-exists-p} using ++ the @i{function} @t{slot-exists-p-using-class} described in the @i{Metaobject Protocol}. ++ ++@node slot-makunbound, slot-missing, slot-exists-p, Objects Dictionary ++@subsection slot-makunbound [Function] ++ ++@code{slot-makunbound} @i{instance slot-name} @result{} @i{instance} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance} -- instance. ++ ++@i{Slot-name}---a @i{symbol}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{slot-makunbound} restores a @i{slot} ++of the name @i{slot-name} in an @i{instance} to ++the unbound state. ++ ++@subsubheading Exceptional Situations:: ++ ++If no @i{slot} of the name @i{slot-name} exists in the ++@i{instance}, @b{slot-missing} is called as follows: ++ ++@example ++(slot-missing (class-of @i{instance}) ++ @i{instance} ++ @i{slot-name} ++ 'slot-makunbound) ++@end example ++ ++(Any values returned by @b{slot-missing} in this case are ++ignored by @b{slot-makunbound}.) ++ ++The specific behavior depends on @i{instance}'s @i{metaclass}. ++An error is never signaled if @i{instance} has @i{metaclass} @b{standard-class}. ++An error is always signaled if @i{instance} has @i{metaclass} @b{built-in-class}. ++The consequences are undefined if @i{instance} has any other @i{metaclass}--an error ++might or might not be signaled in this situation. Note in particular that the behavior ++for @i{conditions} and @i{structures} is not specified. ++ ++@subsubheading See Also:: ++ ++@ref{slot-boundp} ++, ++@ref{slot-missing} ++ ++@subsubheading Notes:: ++ ++ Although no @i{implementation} is required to do so, ++ implementors are strongly encouraged to implement the @i{function} @b{slot-makunbound} using ++ the @i{function} @t{slot-makunbound-using-class} described in the @i{Metaobject Protocol}. ++ ++@node slot-missing, slot-unbound, slot-makunbound, Objects Dictionary ++@subsection slot-missing [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{slot-missing} @i{class object slot-name operation @r{&optional} new-value} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Method Signatures:: ++ ++@code{slot-missing} @i{@r{(}@i{class} @b{t}@r{)} ++ object slot-name ++ operation @r{&optional} new-value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{class}---the @i{class} of @i{object}. ++ ++@i{object}---an @i{object}. ++ ++@i{slot-name}---a @i{symbol} (the @i{name} of a would-be @i{slot}). ++ ++@i{operation}---one of the @i{symbols} ++ @b{setf}, ++ @b{slot-boundp}, ++ @b{slot-makunbound}, ++ or @b{slot-value}. ++ ++@i{new-value}---an @i{object}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The generic function @b{slot-missing} is invoked when an attempt is ++made to @i{access} a @i{slot} in an @i{object} whose ++@i{metaclass} is @b{standard-class} ++and the @i{slot} of the name @i{slot-name} ++is not a @i{name} of a ++@i{slot} in that @i{class}. ++The default @i{method} signals an error. ++ ++The generic function @b{slot-missing} is not intended to be called by ++programmers. Programmers may write @i{methods} for it. ++ ++The generic function @b{slot-missing} may be called during ++evaluation of @b{slot-value}, @t{(setf slot-value)}, ++@b{slot-boundp}, and @b{slot-makunbound}. For each ++of these operations the corresponding @i{symbol} ++for the @i{operation} ++argument is @b{slot-value}, @b{setf}, @b{slot-boundp}, ++and @b{slot-makunbound} respectively. ++ ++The optional @i{new-value} argument to @b{slot-missing} is used ++when the operation is attempting to set the value of the @i{slot}. ++ ++If @b{slot-missing} returns, its values will be treated as follows: ++ ++@table @asis ++ ++@item @t{*} ++If the @i{operation} is @b{setf} or @b{slot-makunbound}, ++any @i{values} will be ignored by the caller. ++ ++@item @t{*} ++If the @i{operation} is @b{slot-value}, ++only the @i{primary value} will be used by the caller, ++and all other values will be ignored. ++ ++@item @t{*} ++If the @i{operation} is @b{slot-boundp}, ++any @i{boolean equivalent} of the @i{primary value} ++of the @i{method} might be is used, ++and all other values will be ignored. ++@end table ++ ++@subsubheading Exceptional Situations:: ++ ++The default @i{method} on @b{slot-missing} ++signals an error of @i{type} @b{error}. ++ ++@subsubheading See Also:: ++ ++@ref{defclass} ++, ++@ref{slot-exists-p} ++, ++@ref{slot-value} ++ ++@subsubheading Notes:: ++ ++The set of arguments (including the @i{class} of the instance) facilitates ++defining methods on the metaclass for @b{slot-missing}. ++ ++@node slot-unbound, slot-value, slot-missing, Objects Dictionary ++@subsection slot-unbound [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{slot-unbound} @i{class instance slot-name} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Method Signatures:: ++ ++@code{slot-unbound} @i{@r{(}@i{class} @b{t}@r{)} ++ instance slot-name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{class}---the @i{class} of the @i{instance}. ++ ++@i{instance}---the @i{instance} in which an attempt ++ was made to @i{read} the @i{unbound} @i{slot}. ++ ++@i{slot-name}---the @i{name} of the @i{unbound} @i{slot}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The generic function @b{slot-unbound} is called when an ++unbound @i{slot} is read in ++an @i{instance} whose metaclass is @b{standard-class}. ++The default @i{method} signals an error ++ ++of @i{type} @b{unbound-slot}. ++The name slot of the ++@b{unbound-slot} @i{condition} is initialized ++ to the name of the offending variable, and the instance slot ++ of the @b{unbound-slot} @i{condition} is initialized to the offending instance. ++ ++The generic function @b{slot-unbound} is not intended to be called ++by programmers. Programmers may write @i{methods} for it. ++The @i{function} @b{slot-unbound} is called only ++indirectly by @b{slot-value}. ++ ++If @b{slot-unbound} returns, ++only the @i{primary value} will be used by the caller, ++and all other values will be ignored. ++ ++@subsubheading Exceptional Situations:: ++ ++The default @i{method} on @b{slot-unbound} ++signals an error of @i{type} @b{unbound-slot}. ++ ++@subsubheading See Also:: ++ ++@ref{slot-makunbound} ++ ++@subsubheading Notes:: ++ ++An unbound @i{slot} may occur if no @t{:initform} form was ++specified for the @i{slot} and the @i{slot} value has not been set, ++or if @b{slot-makunbound} has been called on the @i{slot}. ++ ++@node slot-value, method-qualifiers, slot-unbound, Objects Dictionary ++@subsection slot-value [Function] ++ ++@code{slot-value} @i{object slot-name} @result{} @i{value} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{name}---a @i{symbol}. ++ ++@i{value}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{slot-value} returns the @i{value} of the @i{slot} ++named @i{slot-name} in the @i{object}. ++If there is no @i{slot} named @i{slot-name}, @b{slot-missing} is called. ++If the @i{slot} is unbound, @b{slot-unbound} is called. ++ ++The macro @b{setf} can be used with @b{slot-value} ++to change the value of a @i{slot}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defclass foo () ++ ((a :accessor foo-a :initarg :a :initform 1) ++ (b :accessor foo-b :initarg :b) ++ (c :accessor foo-c :initform 3))) ++@result{} # ++ (setq foo1 (make-instance 'foo :a 'one :b 'two)) ++@result{} # ++ (slot-value foo1 'a) @result{} ONE ++ (slot-value foo1 'b) @result{} TWO ++ (slot-value foo1 'c) @result{} 3 ++ (setf (slot-value foo1 'a) 'uno) @result{} UNO ++ (slot-value foo1 'a) @result{} UNO ++ (defmethod foo-method ((x foo)) ++ (slot-value x 'a)) ++@result{} # ++ (foo-method foo1) @result{} UNO ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If an attempt is made to read a @i{slot} and no @i{slot} of ++the name @i{slot-name} exists in the @i{object}, ++@b{slot-missing} is called as follows: ++ ++@example ++ (slot-missing (class-of @i{instance}) ++ @i{instance} ++ @i{slot-name} ++ 'slot-value) ++@end example ++ ++(If @b{slot-missing} is invoked, its @i{primary value} ++ is returned by @b{slot-value}.) ++ ++If an attempt is made to write a @i{slot} and no @i{slot} of ++the name @i{slot-name} exists in the @i{object}, ++@b{slot-missing} is called as follows: ++ ++@example ++ (slot-missing (class-of @i{instance}) ++ @i{instance} ++ @i{slot-name} ++ 'setf ++ @i{new-value}) ++@end example ++ ++(If @b{slot-missing} returns in this case, any @i{values} are ignored.) ++ ++The specific behavior depends on @i{object}'s @i{metaclass}. ++An error is never signaled if @i{object} has @i{metaclass} @b{standard-class}. ++An error is always signaled if @i{object} has @i{metaclass} @b{built-in-class}. ++The consequences are ++unspecified ++if @i{object} has any other @i{metaclass}--an error ++might or might not be signaled in this situation. Note in particular that the behavior ++for @i{conditions} and @i{structures} is not specified. ++ ++@subsubheading See Also:: ++ ++@ref{slot-missing} ++, ++@ref{slot-unbound} ++, ++@ref{with-slots} ++ ++@subsubheading Notes:: ++ ++ Although no @i{implementation} is required to do so, ++ implementors are strongly encouraged to implement the @i{function} @b{slot-value} using ++ the @i{function} @t{slot-value-using-class} described in the @i{Metaobject Protocol}. ++ ++Implementations may optimize @b{slot-value} by compiling it inline. ++ ++@node method-qualifiers, no-applicable-method, slot-value, Objects Dictionary ++@subsection method-qualifiers [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{method-qualifiers} @i{method} @result{} @i{qualifiers} ++ ++@subsubheading Method Signatures:: ++ ++@code{method-qualifiers} @i{@r{(}@i{method} @b{standard-method}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{method}---a @i{method}. ++ ++@i{qualifiers}---a @i{proper list}. ++ ++@subsubheading Description:: ++ ++Returns a @i{list} of the @i{qualifiers} of the @i{method}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defmethod some-gf :before ((a integer)) a) ++@result{} # ++ (method-qualifiers *) @result{} (:BEFORE) ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{define-method-combination} ++ ++@node no-applicable-method, no-next-method, method-qualifiers, Objects Dictionary ++@subsection no-applicable-method [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{no-applicable-method} @i{generic-function @r{&rest} function-arguments} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Method Signatures:: ++ ++@code{no-applicable-method} @i{@r{(}@i{generic-function} @b{t}@r{)} ++ @r{&rest} function-arguments} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generic-function}---a @i{generic function} ++ on which no @i{applicable method} was found. ++ ++@i{function-arguments}---@i{arguments} to the @i{generic-function}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The generic function @b{no-applicable-method} is called when a ++@i{generic function} ++is invoked ++and no @i{method} on that @i{generic function} is applicable. ++The @i{default method} signals an error. ++ ++The generic function @b{no-applicable-method} is not intended ++to be called by programmers. Programmers may write @i{methods} for it. ++ ++@subsubheading Exceptional Situations:: ++ ++The default @i{method} signals an error of @i{type} @b{error}. ++ ++@subsubheading See Also:: ++ ++@node no-next-method, remove-method, no-applicable-method, Objects Dictionary ++@subsection no-next-method [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{no-next-method} @i{generic-function method @r{&rest} args} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Method Signatures:: ++ ++@code{no-next-method} @i{@r{(}@i{generic-function} @b{standard-generic-function}@r{)} ++ @r{(}@i{method} @b{standard-method}@r{)} ++ @r{&rest} args} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generic-function} -- @i{generic function} to which @i{method} belongs. ++ ++@i{method} -- @i{method} that contained the call to ++ @b{call-next-method} for which there is no next @i{method}. ++ ++@i{args} -- arguments to @b{call-next-method}. ++ ++@i{result}---an @i{object}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{no-next-method} is called by @b{call-next-method} ++when there is no @i{next method}. ++ ++The @i{generic function} @b{no-next-method} is not intended to be called by programmers. ++Programmers may write @i{methods} for it. ++ ++@subsubheading Exceptional Situations:: ++ ++The system-supplied @i{method} on @b{no-next-method} ++signals an error of @i{type} @b{error}. ++[Editorial Note by KMP: perhaps control-error??] ++ ++@subsubheading See Also:: ++ ++@ref{call-next-method} ++ ++@node remove-method, make-instance, no-next-method, Objects Dictionary ++@subsection remove-method [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{remove-method} @i{generic-function method} @result{} @i{generic-function} ++ ++@subsubheading Method Signatures:: ++ ++@code{remove-method} @i{@r{(}@i{generic-function} @b{standard-generic-function}@r{)} ++ method} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generic-function}---a @i{generic function}. ++ ++@i{method}---a @i{method}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{remove-method} removes a @i{method} from @i{generic-function} ++by modifying the @i{generic-function} (if necessary). ++ ++@b{remove-method} must not signal an error if the @i{method} ++is not one of the @i{methods} on the @i{generic-function}. ++ ++@subsubheading See Also:: ++ ++@ref{find-method} ++ ++@node make-instance, make-instances-obsolete, remove-method, Objects Dictionary ++@subsection make-instance [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{make-instance} @i{class @r{&rest} initargs @r{&key} @r{&allow-other-keys}} @result{} @i{instance} ++ ++@subsubheading Method Signatures:: ++ ++@code{make-instance} @i{@r{(}@i{class} @b{standard-class}@r{)} @r{&rest} initargs} ++ ++@code{make-instance} @i{@r{(}@i{class} @b{symbol}@r{)} @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{class}---a @i{class}, ++ or a @i{symbol} that names a @i{class}. ++ ++@i{initargs}---an @i{initialization argument list}. ++ ++@i{instance}---a @i{fresh} @i{instance} of @i{class} @i{class}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{make-instance} ++creates and returns a new @i{instance} of the given @i{class}. ++ ++If the second of the above @i{methods} is selected, ++that @i{method} invokes @b{make-instance} on the arguments ++@t{(find-class @i{class})} and @i{initargs}. ++ ++The initialization arguments are checked within @b{make-instance}. ++ ++The @i{generic function} @b{make-instance} ++may be used as described in @ref{Object Creation and Initialization}. ++ ++@subsubheading Exceptional Situations:: ++ ++If any of the initialization arguments has not ++been declared as valid, an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{defclass} ++, ++@ref{class-of} ++, ++@ref{allocate-instance} ++, ++@ref{Initialize-Instance} ++, ++@ref{Object Creation and Initialization} ++ ++@node make-instances-obsolete, make-load-form, make-instance, Objects Dictionary ++@subsection make-instances-obsolete [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{make-instances-obsolete} @i{class} @result{} @i{class} ++ ++@subsubheading Method Signatures:: ++ ++@code{make-instances-obsolete} @i{@r{(}@i{class} @b{standard-class}@r{)}} ++ ++@code{make-instances-obsolete} @i{@r{(}@i{class} @b{symbol}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{class}---a @i{class designator}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{make-instances-obsolete} has the effect of ++initiating the process of updating the instances of the ++@i{class}. During updating, the generic function ++@b{update-instance-for-redefined-class} will be invoked. ++ ++The generic function @b{make-instances-obsolete} is invoked ++automatically by the system when @b{defclass} has been used to ++redefine an existing standard class and the set of local ++@i{slots} @i{accessible} in an ++instance is changed or the order of @i{slots} in storage is changed. It ++can also be explicitly invoked by the user. ++ ++If the second of the above @i{methods} is selected, that ++@i{method} invokes ++@b{make-instances-obsolete} on @t{(find-class @i{class})}. ++ ++@subsubheading Examples:: ++ ++@subsubheading See Also:: ++ ++@ref{update-instance-for-redefined-class} ++, ++@ref{Redefining Classes} ++ ++@node make-load-form, make-load-form-saving-slots, make-instances-obsolete, Objects Dictionary ++@subsection make-load-form [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{make-load-form} @i{object @r{&optional} environment} @result{} @i{creation-form @r{[}, initialization-form @r{]}} ++ ++@subsubheading Method Signatures:: ++ ++@code{make-load-form} @i{@r{(}@i{object} @b{standard-object}@r{)} @r{&optional} environment} ++ ++@code{make-load-form} @i{@r{(}@i{object} @b{structure-object}@r{)} @r{&optional} environment} ++ ++@code{make-load-form} @i{@r{(}@i{object} @b{condition}@r{)} @r{&optional} environment} ++ ++@code{make-load-form} @i{@r{(}@i{object} @b{class}@r{)} @r{&optional} environment} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{environment}---an @i{environment object}. ++ ++@i{creation-form}---a @i{form}. ++ ++@i{initialization-form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{make-load-form} creates and returns ++one or two @i{forms}, ++ a @i{creation-form} ++ and an @i{initialization-form}, ++that enable @b{load} to construct an @i{object} ++equivalent to @i{object}. ++@i{Environment} is an @i{environment object} ++corresponding to the @i{lexical environment} ++in which the @i{forms} will be processed. ++ ++The @i{file compiler} calls @b{make-load-form} to process certain ++@i{classes} of @i{literal objects}; see @ref{Additional Constraints on Externalizable Objects}. ++ ++@i{Conforming programs} may call @b{make-load-form} directly, ++providing @i{object} is a @i{generalized instance} of ++@b{standard-object}, @b{structure-object}, ++or @b{condition}. ++ ++The creation form is a @i{form} that, when evaluated at ++@b{load} time, should return an @i{object} that ++is equivalent to @i{object}. The exact meaning of ++equivalent depends on the @i{type} of @i{object} ++and is up to the programmer who defines a @i{method} for ++@b{make-load-form}; ++see @ref{Literal Objects in Compiled Files}. ++ ++The initialization form is a @i{form} that, when evaluated at @b{load} time, ++should perform further initialization of the @i{object}. ++The value returned by the initialization form is ignored. ++If @b{make-load-form} ++returns only one value, ++the initialization form is @b{nil}, which has no effect. ++If @i{object} appears as a constant in the initialization form, ++at @b{load} time it will be replaced by the equivalent @i{object} ++constructed by the creation form; ++this is how the further initialization gains access to the @i{object}. ++ ++Both the @i{creation-form} and the @i{initialization-form} may contain references ++to any @i{externalizable object}. ++However, there must not be any circular dependencies in creation forms. ++An example of a circular dependency is when the creation form for the ++object @t{X} contains a reference to the object @t{Y}, ++and the creation form for the object @t{Y} contains a reference to the object @t{X}. ++Initialization forms are not subject to any restriction against circular dependencies, ++which is the reason that initialization forms exist; ++see the example of circular data structures below. ++ ++The creation form for an @i{object} is always @i{evaluated} before the ++initialization form for that @i{object}. When either the creation form or ++the initialization form references other @i{objects} that have not been ++referenced earlier in the @i{file} being @i{compiled}, the @i{compiler} ensures ++that all of the referenced @i{objects} have been created before @i{evaluating} ++the referencing @i{form}. When the referenced @i{object} is of a @i{type} which ++the @i{file compiler} processes using @b{make-load-form}, ++this involves @i{evaluating} ++the creation form returned for it. (This is the reason for the ++prohibition against circular references among creation forms). ++ ++Each initialization form is @i{evaluated} as soon as possible after its ++associated creation form, as determined by data flow. If the ++initialization form for an @i{object} does not reference any other @i{objects} ++not referenced earlier in the @i{file} and processed by ++the @i{file compiler} ++using ++@b{make-load-form}, the initialization form is evaluated immediately after ++the creation form. If a creation or initialization form F does contain ++references to such @i{objects}, the creation forms for those other objects ++are evaluated before F, and the initialization forms for those other ++@i{objects} are also evaluated before F whenever they do not depend on the ++@i{object} created or initialized by F. Where these rules do not uniquely ++determine an order of @i{evaluation} between two creation/initialization ++forms, the order of @i{evaluation} is unspecified. ++ ++ While these creation and initialization forms are being evaluated, the ++ @i{objects} are possibly in an uninitialized state, ++analogous to the state ++ of an @i{object} ++between the time it has been created by @b{allocate-instance} ++ and it has been processed fully by ++@b{initialize-instance}. Programmers ++ writing @i{methods} for ++@b{make-load-form} must take care in manipulating ++ @i{objects} not to depend on ++@i{slots} that have not yet been initialized. ++ ++ It is @i{implementation-dependent} ++whether @b{load} calls @b{eval} on the ++@i{forms} or does some ++ other operation that has an equivalent effect. For example, the ++ @i{forms} might be translated into different but equivalent ++@i{forms} and ++ then evaluated, they might be compiled and the resulting functions ++ called by @b{load}, ++or they might be interpreted by a special-purpose ++function different from @b{eval}. ++All that is required is that the ++ effect be equivalent to evaluating the @i{forms}. ++ ++The @i{method} @i{specialized} on @b{class} returns a creation ++@i{form} using the @i{name} of the @i{class} if the @i{class} has ++a @i{proper name} in @i{environment}, signaling an error of @i{type} @b{error} ++if it does not have a @i{proper name}. @i{Evaluation} of the creation ++@i{form} uses the @i{name} to find the @i{class} with that ++@i{name}, as if by @i{calling} @b{find-class}. If a @i{class} ++with that @i{name} has not been defined, then a @i{class} may be ++computed in an @i{implementation-defined} manner. If a @i{class} ++cannot be returned as the result of @i{evaluating} the creation ++@i{form}, then an error of @i{type} @b{error} is signaled. ++ ++Both @i{conforming implementations} and @i{conforming programs} may ++further @i{specialize} @b{make-load-form}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defclass obj () ++ ((x :initarg :x :reader obj-x) ++ (y :initarg :y :reader obj-y) ++ (dist :accessor obj-dist))) ++@result{} # ++ (defmethod shared-initialize :after ((self obj) slot-names &rest keys) ++ (declare (ignore slot-names keys)) ++ (unless (slot-boundp self 'dist) ++ (setf (obj-dist self) ++ (sqrt (+ (expt (obj-x self) 2) (expt (obj-y self) 2)))))) ++@result{} # ++ (defmethod make-load-form ((self obj) &optional environment) ++ (declare (ignore environment)) ++ ;; Note that this definition only works because X and Y do not ++ ;; contain information which refers back to the object itself. ++ ;; For a more general solution to this problem, see revised example below. ++ `(make-instance ',(class-of self) ++ :x ',(obj-x self) :y ',(obj-y self))) ++@result{} # ++ (setq obj1 (make-instance 'obj :x 3.0 :y 4.0)) @result{} # ++ (obj-dist obj1) @result{} 5.0 ++ (make-load-form obj1) @result{} (MAKE-INSTANCE 'OBJ :X '3.0 :Y '4.0) ++@end example ++ ++In the above example, an equivalent @i{instance} of @t{obj} is ++reconstructed by using the values of two of its @i{slots}. ++The value of the third @i{slot} is derived from those two values. ++ ++Another way to write the @b{make-load-form} @i{method} ++in that example is to use @b{make-load-form-saving-slots}. ++The code it generates might yield a slightly different result ++from the @b{make-load-form} @i{method} shown above, ++but the operational effect will be the same. For example: ++ ++@example ++ ;; Redefine method defined above. ++ (defmethod make-load-form ((self obj) &optional environment) ++ (make-load-form-saving-slots self ++ :slot-names '(x y) ++ :environment environment)) ++@result{} # ++ ;; Try MAKE-LOAD-FORM on object created above. ++ (make-load-form obj1) ++@result{} (ALLOCATE-INSTANCE '#), ++ (PROGN ++ (SETF (SLOT-VALUE '# 'X) '3.0) ++ (SETF (SLOT-VALUE '# 'Y) '4.0) ++ (INITIALIZE-INSTANCE '#)) ++@end example ++ ++In the following example, @i{instances} of @t{my-frob} are ``interned'' ++in some way. An equivalent @i{instance} is reconstructed by using the ++value of the name slot as a key for searching existing @i{objects}. ++In this case the programmer has chosen to create a new @i{object} ++if no existing @i{object} is found; alternatively an error could ++have been signaled in that case. ++ ++@example ++ (defclass my-frob () ++ ((name :initarg :name :reader my-name))) ++ (defmethod make-load-form ((self my-frob) &optional environment) ++ (declare (ignore environment)) ++ `(find-my-frob ',(my-name self) :if-does-not-exist :create)) ++@end example ++ ++In the following example, the data structure to be dumped is circular, ++because each parent has a list of its children and each child has a reference ++back to its parent. If @b{make-load-form} is called on one ++@i{object} in such a structure, the creation form creates an equivalent ++@i{object} and fills in the children slot, which forces creation of equivalent ++@i{objects} for all of its children, grandchildren, etc. At this point ++none of the parent @i{slots} have been filled in. ++The initialization form fills in the parent @i{slot}, which forces creation ++of an equivalent @i{object} for the parent if it was not already created. ++Thus the entire tree is recreated at @b{load} time. ++At compile time, @b{make-load-form} is called once for each @i{object} ++in the tree. ++All of the creation forms are evaluated, ++in @i{implementation-dependent} order, ++and then all of the initialization forms are evaluated, ++also in @i{implementation-dependent} order. ++ ++@example ++ (defclass tree-with-parent () ((parent :accessor tree-parent) ++ (children :initarg :children))) ++ (defmethod make-load-form ((x tree-with-parent) &optional environment) ++ (declare (ignore environment)) ++ (values ++ ;; creation form ++ `(make-instance ',(class-of x) :children ',(slot-value x 'children)) ++ ;; initialization form ++ `(setf (tree-parent ',x) ',(slot-value x 'parent)))) ++@end example ++ ++In the following example, the data structure to be dumped has no special ++properties and an equivalent structure can be reconstructed ++simply by reconstructing the @i{slots}' contents. ++ ++@example ++ (defstruct my-struct a b c) ++ (defmethod make-load-form ((s my-struct) &optional environment) ++ (make-load-form-saving-slots s :environment environment)) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++The @i{methods} @i{specialized} on ++ @b{standard-object}, ++ @b{structure-object}, ++ and @b{condition} ++all signal an error of @i{type} @b{error}. ++ ++It is @i{implementation-dependent} whether @i{calling} ++@b{make-load-form} on a @i{generalized instance} of a ++@i{system class} signals an error or returns creation and ++initialization @i{forms}. ++ ++@subsubheading See Also:: ++ ++@ref{compile-file} ++, ++@ref{make-load-form-saving-slots} ++, ++@ref{Additional Constraints on Externalizable Objects} ++@ref{Evaluation}, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++ ++The @i{file compiler} ++calls @b{make-load-form} in specific circumstances ++detailed in @ref{Additional Constraints on Externalizable Objects}. ++ ++Some @i{implementations} may provide facilities for defining new ++@i{subclasses} of @i{classes} which are specified as ++@i{system classes}. (Some likely candidates include ++@b{generic-function}, @b{method}, and @b{stream}). Such ++@i{implementations} should document how the @i{file compiler} processes ++@i{instances} of such @i{classes} when encountered as ++@i{literal objects}, and should document any relevant @i{methods} ++for @b{make-load-form}. ++ ++@node make-load-form-saving-slots, with-accessors, make-load-form, Objects Dictionary ++@subsection make-load-form-saving-slots [Function] ++ ++@code{make-load-form-saving-slots} @i{object @r{&key} slot-names environment}@* ++ @result{} @i{creation-form, initialization-form} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{slot-names}---a @i{list}. ++ ++@i{environment}---an @i{environment object}. ++ ++@i{creation-form}---a @i{form}. ++ ++@i{initialization-form}---a @i{form}. ++ ++@subsubheading Description:: ++ ++Returns @i{forms} that, when @i{evaluated}, will construct an ++@i{object} equivalent to @i{object}, without @i{executing} ++@i{initialization forms}. The @i{slots} in the new @i{object} ++that correspond to initialized @i{slots} in @i{object} are ++initialized using the values from @i{object}. Uninitialized @i{slots} ++in @i{object} are not initialized in the new @i{object}. ++@b{make-load-form-saving-slots} works for any @i{instance} of ++@b{standard-object} or @b{structure-object}. ++ ++@i{Slot-names} is a @i{list} of the names of the ++@i{slots} to preserve. If @i{slot-names} is not ++supplied, its value is all of the @i{local slots}. ++ ++@b{make-load-form-saving-slots} returns two values, ++thus it can deal with circular structures. ++Whether the result is useful in an application depends on ++whether the @i{object}'s @i{type} and slot contents ++fully capture the application's idea of the @i{object}'s state. ++ ++@i{Environment} is the environment in which the forms will be processed. ++ ++@subsubheading See Also:: ++ ++@ref{make-load-form} ++, ++@ref{make-instance} ++, ++@ref{setf} ++, ++@ref{slot-value} ++, ++@ref{slot-makunbound} ++ ++@subsubheading Notes:: ++ ++@b{make-load-form-saving-slots} can be useful in user-written ++@b{make-load-form} methods. ++ ++When the @i{object} is an @i{instance} of @b{standard-object}, ++@b{make-load-form-saving-slots} could return a creation form that ++@i{calls} @b{allocate-instance} and an initialization form that ++contains @i{calls} to @b{setf} of @b{slot-value} and ++@b{slot-makunbound}, though other @i{functions} of similar effect ++might actually be used. ++ ++@node with-accessors, with-slots, make-load-form-saving-slots, Objects Dictionary ++@subsection with-accessors [Macro] ++ ++@code{with-accessors} @i{@r{@r{(}@{@i{slot-entry}@}*@r{)}} ++ instance-form ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@w{@i{slot-entry} ::=@r{(}variable-name accessor-name @r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{variable-name}---a @i{variable name}; not evaluated. ++ ++@i{accessor-name}---a @i{function name}; not evaluated. ++ ++@i{instance-form}---a @i{form}; evaluated. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++Creates a lexical environment in which ++the slots specified by ++@i{slot-entry} are lexically available through their accessors as if ++they were variables. The macro @b{with-accessors} invokes the ++appropriate accessors to @i{access} the @i{slots} specified ++by @i{slot-entry}. Both @b{setf} ++and @b{setq} can be used to set the value of the @i{slot}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defclass thing () ++ ((x :initarg :x :accessor thing-x) ++ (y :initarg :y :accessor thing-y))) ++@result{} # ++ (defmethod (setf thing-x) :before (new-x (thing thing)) ++ (format t "~&Changing X from ~D to ~D in ~S.~ ++ (thing-x thing) new-x thing)) ++ (setq thing1 (make-instance 'thing :x 1 :y 2)) @result{} # ++ (setq thing2 (make-instance 'thing :x 7 :y 8)) @result{} # ++ (with-accessors ((x1 thing-x) (y1 thing-y)) ++ thing1 ++ (with-accessors ((x2 thing-x) (y2 thing-y)) ++ thing2 ++ (list (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setq x1 (+ y1 x2)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setf (thing-x thing2) (list x1)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2))))) ++@t{ |> } Changing X from 1 to 9 in #. ++@t{ |> } Changing X from 7 to (9) in #. ++@result{} ((1 1 2 2 7 7 8 8) ++ 9 ++ (9 9 2 2 7 7 8 8) ++ (9) ++ (9 9 2 2 (9) (9) 8 8)) ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{defclass} ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if any @i{accessor-name} is not the name ++of an accessor for the @i{instance}. ++ ++@subsubheading See Also:: ++ ++@ref{with-slots} ++, ++@ref{symbol-macrolet} ++ ++@subsubheading Notes:: ++ ++A @b{with-accessors} expression of the form: ++ ++@example ++ ++@w{@t{(with-accessors} (@r{slot-entry}_1 ...@r{slot-entry}_n) @i{instance-form} @r{form}_1 ...@r{form}_k)}@* ++@end example ++ ++@noindent ++expands into the equivalent of ++ ++@example ++ ++@w{@t{(}@t{let ((}in @i{instance-form}@t{))}}@* ++@w{ @t{(symbol-macrolet (}@r{Q}_1... @r{Q}_n@t{)} @r{form}_1 ...@r{form}_k@t{))}}@* ++@end example ++ ++@noindent ++where @r{Q}_i is ++ ++@example ++@t{(}@r{variable-name}_i () ++@t{(@r{accessor-name}_i in))} ++@end example ++ ++ ++@node with-slots, defclass, with-accessors, Objects Dictionary ++@subsection with-slots [Macro] ++ ++@code{with-slots} @i{@r{(}@{@i{slot-entry}@}*@r{)} ++ instance-form ++ @{@i{declaration}@}* @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@w{@i{slot-entry} ::=slot-name | @r{(}variable-name slot-name@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{slot-name}---a @i{slot} @i{name}; not evaluated. ++ ++@i{variable-name}---a @i{variable name}; not evaluated. ++ ++@i{instance-form}---a @i{form}; evaluted to produce @i{instance}. ++ ++@i{instance}---an @i{object}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++The macro @b{with-slots} @i{establishes} a ++@i{lexical environment} ++for referring to the @i{slots} in the @i{instance} ++named by the given @i{slot-names} ++as though they were @i{variables}. Within such a context ++the value of the @i{slot} can be specified by using its slot name, as if ++it were a lexically bound variable. Both @b{setf} and @b{setq} ++can be used to set the value of the @i{slot}. ++ ++The macro @b{with-slots} translates an appearance of the slot ++name as a @i{variable} into a call to @b{slot-value}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defclass thing () ++ ((x :initarg :x :accessor thing-x) ++ (y :initarg :y :accessor thing-y))) ++@result{} # ++ (defmethod (setf thing-x) :before (new-x (thing thing)) ++ (format t "~&Changing X from ~D to ~D in ~S.~ ++ (thing-x thing) new-x thing)) ++ (setq thing (make-instance 'thing :x 0 :y 1)) @result{} # ++ (with-slots (x y) thing (incf x) (incf y)) @result{} 2 ++ (values (thing-x thing) (thing-y thing)) @result{} 1, 2 ++ (setq thing1 (make-instance 'thing :x 1 :y 2)) @result{} # ++ (setq thing2 (make-instance 'thing :x 7 :y 8)) @result{} # ++ (with-slots ((x1 x) (y1 y)) ++ thing1 ++ (with-slots ((x2 x) (y2 y)) ++ thing2 ++ (list (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setq x1 (+ y1 x2)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setf (thing-x thing2) (list x1)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2))))) ++@t{ |> } Changing X from 7 to (9) in #. ++@result{} ((1 1 2 2 7 7 8 8) ++ 9 ++ (9 9 2 2 7 7 8 8) ++ (9) ++ (9 9 2 2 (9) (9) 8 8)) ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{defclass} ++ ++@subsubheading Exceptional Situations:: ++ ++The consequences are undefined if any @i{slot-name} is not the name ++of a @i{slot} in the @i{instance}. ++ ++@subsubheading See Also:: ++ ++@ref{with-accessors} ++, ++@ref{slot-value} ++, ++@ref{symbol-macrolet} ++ ++@subsubheading Notes:: ++ ++A @b{with-slots} expression of the form: ++ ++@example ++ ++@w{@t{(with-slots} (@r{slot-entry}_1 ...@r{slot-entry}_n) @i{instance-form} @r{form}_1 ...@r{form}_k)}@* ++@end example ++ ++@noindent ++expands into the equivalent of ++ ++@example ++ ++@w{@t{(}@t{let ((}in @i{instance-form}@t{))}}@* ++@w{ @t{(symbol-macrolet (}@r{Q}_1... @r{Q}_n@t{)} @r{form}_1 ...@r{form}_k@t{))}}@* ++@end example ++ ++@noindent ++where @r{Q}_i is ++ ++@example ++@t{(}@r{slot-entry}_i () ++@t{(slot-value }in '@r{slot-entry}_i@t{))} ++@end example ++ ++@noindent ++if @r{slot-entry}_i is a @i{symbol} ++and is ++ ++@example ++@t{(}@r{variable-name}_i () ++@t{(slot-value }in '@r{slot-name}_i@t{))} ++@end example ++ ++ ++@noindent ++if @r{slot-entry}_i ++is of the form ++ ++@example ++@t{(}@r{variable-name}_i ++@r{slot-name}_i@t{)} ++@end example ++ ++@node defclass, defgeneric, with-slots, Objects Dictionary ++@subsection defclass [Macro] ++ ++@code{defclass} @i{@i{class-name} @r{(}@{@i{superclass-name}@}*@r{)} ++@r{(}@{@i{slot-specifier}@}*@r{)} ++ [[!@i{class-option}]]}@* ++ @result{} @i{new-class} ++ ++@w{ slot-specifier::=@i{slot-name} | (@i{slot-name} [[!@i{slot-option}]])}@* ++ ++@w{ @i{slot-name}::= @i{symbol}}@* ++ ++@w{ slot-option::=@{@t{:reader} @i{reader-function-name}@}* |}@* ++@w{ @{@t{:writer} @i{writer-function-name}@}* |}@* ++@w{ @{@t{:accessor} @i{reader-function-name}@}* |}@* ++@w{ @{@t{:allocation} @i{allocation-type}@} |}@* ++@w{ @{@t{:initarg} @i{initarg-name}@}* |}@* ++@w{ @{@t{:initform} @i{form}@} |}@* ++@w{ @{@t{:type} @i{type-specifier}@} |}@* ++@w{ @{@t{:documentation} @i{string}@}}@* ++ ++@w{ @i{function-name}::= @{@i{symbol} | @t{(setf @i{symbol})}@}}@* ++ ++@w{ class-option::=(@t{:default-initargs} @t{.} @i{initarg-list}) |}@* ++@w{ (@t{:documentation} @i{string}) |}@* ++@w{ (@t{:metaclass} @i{class-name})}@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{Class-name}---a @i{non-nil} @i{symbol}. ++ ++@i{Superclass-name}--a @i{non-nil} @i{symbol}. ++ ++@i{Slot-name}--a @i{symbol}. ++ The @i{slot-name} argument is ++ a @i{symbol} that is syntactically valid for use as a variable name. ++ ++@i{Reader-function-name}---a @i{non-nil} @i{symbol}. ++ @t{:reader} can be supplied more than once for a given @i{slot}. ++ ++@i{Writer-function-name}---a @i{generic function} name. ++ @t{:writer} can be supplied more than once for a given @i{slot}. ++ ++@i{Reader-function-name}---a @i{non-nil} @i{symbol}. ++ @t{:accessor} can be supplied more than once for a given @i{slot}. ++ ++@i{Allocation-type}---(member @t{:instance} @t{:class}). ++ @t{:allocation} can be supplied once at most for a given @i{slot}. ++ ++@i{Initarg-name}---a @i{symbol}. ++ @t{:initarg} can be supplied more than once for a given @i{slot}. ++ ++@i{Form}---a @i{form}. ++ @t{:init-form} can be supplied once at most for a given @i{slot}. ++ ++@i{Type-specifier}---a @i{type specifier}. ++ @t{:type} can be supplied once at most for a given @i{slot}. ++ ++@i{Class-option}--- refers to the @i{class} as a whole or to all class @i{slots}. ++ ++@i{Initarg-list}---a @i{list} of alternating initialization argument ++ @i{names} and default initial value @i{forms}. ++ @t{:default-initargs} can be supplied at most once. ++ ++@i{Class-name}---a @i{non-nil} @i{symbol}. ++ @t{:metaclass} can be supplied once at most. ++ ++@i{new-class}---the new @i{class} @i{object}. ++ ++@subsubheading Description:: ++ ++The macro @b{defclass} defines a new named @i{class}. It returns ++the new @i{class} @i{object} as its result. ++ ++The syntax of @b{defclass} provides options for specifying ++initialization arguments for @i{slots}, for specifying default ++initialization values for @i{slots}, and for requesting that ++@i{methods} on specified @i{generic functions} be automatically ++generated for reading and writing the values of @i{slots}. ++No reader or writer functions are defined by default; ++their generation must be explicitly requested. However, ++@i{slots} can always be @i{accessed} using @b{slot-value}. ++ ++Defining a new @i{class} also causes a @i{type} of the same name to be ++defined. The predicate @t{(typep @i{object} @i{class-name})} returns ++true if the @i{class} of the given @i{object} is ++the @i{class} named by @i{class-name} itself or ++a subclass of the class @i{class-name}. A @i{class} @i{object} ++can be used as a @i{type specifier}. ++Thus @t{(typep @i{object} @i{class})} returns @i{true} ++if the @i{class} of the @i{object} is ++@i{class} itself or a subclass of @i{class}. ++ ++The @i{class-name} argument specifies the @i{proper name} ++of the new @i{class}. ++If a @i{class} with the same @i{proper name} already exists ++ and that @i{class} is an @i{instance} of @b{standard-class}, ++ and if the @b{defclass} form for the definition of the new @i{class} ++ specifies a @i{class} of @i{class} @b{standard-class}, ++the existing @i{class} is redefined, ++and instances of it (and its @i{subclasses}) are updated ++ to the new definition at the time that they are next @i{accessed}. ++For details, see @ref{Redefining Classes}. ++ ++Each @i{superclass-name} argument ++specifies a direct @i{superclass} of the new @i{class}. ++If the @i{superclass} list is empty, then the @i{superclass} ++defaults depending on the @i{metaclass}, ++with @b{standard-object} being the ++default for @b{standard-class}. ++ ++The new @i{class} will ++inherit @i{slots} and @i{methods} ++from each of its direct @i{superclasses}, from ++their direct @i{superclasses}, and so on. ++For a discussion of how @i{slots} and @i{methods} are inherited, ++see @ref{Inheritance}. ++ ++The following slot options are available: ++ ++@table @asis ++ ++@item @t{*} ++The @t{:reader} slot option specifies that an @i{unqualified method} is ++to be defined on the @i{generic function} named @i{reader-function-name} ++to read the value of the given @i{slot}. ++ ++@item @t{*} ++The @t{:writer} slot option specifies that an @i{unqualified method} is ++to be defined on the @i{generic function} named @i{writer-function-name} ++to write the value of the @i{slot}. ++ ++@item @t{*} ++The @t{:accessor} slot option specifies that an @i{unqualified method} ++is to be defined on the generic function named @i{reader-function-name} ++to read the value of the given @i{slot} ++and that an @i{unqualified method} is to be defined on the ++@i{generic function} named @t{(setf @i{reader-function-name})} to be ++used with @b{setf} to modify the value of the @i{slot}. ++ ++@item @t{*} ++The @t{:allocation} slot option is used to specify where storage is ++to be allocated for the given @i{slot}. Storage for a ++@i{slot} can be located ++in each instance or in the @i{class} @i{object} itself. ++The value of the @i{allocation-type} argument can be ++either the keyword @t{:instance} ++or the keyword @t{:class}. If the @t{:allocation} ++slot option is not specified, the effect is the same as specifying ++@t{:allocation :instance}. ++@table @asis ++ ++@item -- ++If @i{allocation-type} is @t{:instance}, a @i{local slot} of ++the name @i{slot-name} is allocated in each instance of the ++@i{class}. ++ ++@item -- ++If @i{allocation-type} is @t{:class}, a shared ++@i{slot} of the given ++name is allocated in the @i{class} @i{object} created by this @b{defclass} ++form. The value of the @i{slot} is shared by all ++@i{instances} of the @i{class}. ++If a class C_1 defines such a @i{shared slot}, any ++subclass C_2 of ++C_1 will share this single @i{slot} unless the @b{defclass} form ++for C_2 specifies a @i{slot} of the same @i{name} or there is a ++superclass of C_2 that precedes C_1 in the class precedence ++list of C_2 and that defines a @i{slot} of the same @i{name}. ++@end table ++ ++@item @t{*} ++The @t{:initform} slot option is used to provide a default ++initial value form to be used in the initialization of the @i{slot}. This ++@i{form} is evaluated every time it is used to initialize the ++@i{slot}. The ++lexical environment in which this @i{form} is evaluated is the lexical ++environment in which the @b{defclass} form was evaluated. ++Note that the lexical environment refers both to variables and to ++functions. For @i{local slots}, the dynamic environment is the dynamic ++environment in which @b{make-instance} is called; for shared ++@i{slots}, the dynamic environment is the dynamic environment in which the ++@b{defclass} form was evaluated. ++See @ref{Object Creation and Initialization}. ++ ++No implementation is permitted to extend the syntax of @b{defclass} ++to allow @t{(@i{slot-name} @i{form})} as an abbreviation for ++@t{(@i{slot-name} :initform @i{form})}. ++ ++[Reviewer Note by Barmar: Can you extend this to mean something else?] ++ ++@item @t{*} ++The @t{:initarg} slot option declares an initialization ++argument named @i{initarg-name} and specifies that this ++initialization argument initializes the given @i{slot}. If the ++initialization argument has a value in the call to ++@b{initialize-instance}, the value will be stored into the given @i{slot}, ++and the slot's @t{:initform} slot option, if any, is not ++evaluated. If none of the initialization arguments specified for a ++given @i{slot} has a value, the @i{slot} is initialized according to the ++@t{:initform} slot option, if specified. ++ ++@item @t{*} ++The @t{:type} slot option specifies that the contents of the ++@i{slot} will always be of the specified data type. It effectively ++declares the result type of the reader generic function when applied ++to an @i{object} of this @i{class}. The consequences of attempting to store in a ++@i{slot} a value that does not satisfy the type of the @i{slot} are undefined. ++The @t{:type} slot option is further discussed in ++@ref{Inheritance of Slots and Slot Options}. ++ ++@item @t{*} ++The @t{:documentation} slot option provides a @i{documentation string} ++for the @i{slot}. @t{:documentation} can be supplied once at most ++for a given @i{slot}. ++[Reviewer Note by Barmar: How is this retrieved?] ++@end table ++ ++Each class option is an option that refers to the @i{class} as a whole. ++The following class options are available: ++ ++@table @asis ++ ++@item @t{*} ++The @t{:default-initargs} class option is followed by a list of ++alternating initialization argument @i{names} and default initial value ++forms. If any of these initialization arguments does not appear in ++the initialization argument list supplied to @b{make-instance}, the ++corresponding default initial value form is evaluated, and the ++initialization argument @i{name} and the @i{form}'s value are added to the end ++of the initialization argument list before the instance is created; ++see @ref{Object Creation and Initialization}. ++The default initial value form is evaluated each time it is used. The lexical ++environment in which this @i{form} is evaluated is the lexical environment ++in which the @b{defclass} form was evaluated. The dynamic ++environment is the dynamic environment in which @b{make-instance} ++was called. If an initialization argument @i{name} appears more than once ++in a @t{:default-initargs} class option, an error is signaled. ++ ++@item @t{*} ++ ++The @t{:documentation} class option causes a @i{documentation string} ++to be attached with the @i{class} @i{object}, ++and attached with kind @b{type} to the @i{class-name}. ++@t{:documentation} can be supplied once at most. ++ ++@item @t{*} ++The @t{:metaclass} class option is used to specify that ++instances of the @i{class} being defined are to have a different metaclass ++than the default provided by the system (the @i{class} @b{standard-class}). ++ ++@end table ++ ++Note the following rules of @b{defclass} for @i{standard classes}: ++ ++@table @asis ++ ++@item @t{*} ++It is not required that the @i{superclasses} of a @i{class} be defined before ++the @b{defclass} form for that @i{class} is evaluated. ++ ++@item @t{*} ++All the @i{superclasses} of a @i{class} must be defined before ++an @i{instance} of the @i{class} can be made. ++ ++@item @t{*} ++A @i{class} must be defined before it can be used as a parameter ++specializer in a @b{defmethod} form. ++ ++@end table ++ ++The object system can be extended to cover situations where these rules are not ++obeyed. ++ ++Some slot options are inherited by a @i{class} from its ++@i{superclasses}, and ++some can be shadowed or altered by providing a local slot description. ++No class options except @t{:default-initargs} are inherited. For a ++detailed description of how @i{slots} and slot options are inherited, ++see @ref{Inheritance of Slots and Slot Options}. ++ ++The options to @b{defclass} can be extended. It is required that ++all implementations signal an error if they observe a class option or ++a slot option that is not implemented locally. ++ ++It is valid to specify more than one reader, writer, accessor, or ++initialization argument for a @i{slot}. No other slot option can ++appear ++more than once in a single slot description, or an error is ++signaled. ++ ++If no reader, writer, or accessor is specified for a @i{slot}, ++the @i{slot} can only be @i{accessed} by the @i{function} @b{slot-value}. ++ ++If a @b{defclass} @i{form} appears as a @i{top level form}, ++the @i{compiler} must make the @i{class} @i{name} be recognized as a ++valid @i{type} @i{name} in subsequent declarations (as for @b{deftype}) ++and be recognized as a valid @i{class} @i{name} for @b{defmethod} ++@i{parameter specializers} and for use as the @t{:metaclass} option of a ++subsequent @b{defclass}. The @i{compiler} must make ++the @i{class} definition ++available to be returned by @b{find-class} when its @i{environment} ++@i{argument} is a value received as the @i{environment parameter} of a @i{macro}. ++ ++@subsubheading Exceptional Situations:: ++ ++If there are any duplicate slot names, ++an error of @i{type} @b{program-error} is signaled. ++ ++If an initialization argument @i{name} appears more than once in ++@t{:default-initargs} class option, ++an error of @i{type} @b{program-error} is signaled. ++ ++If any of the following slot options appears more than once in a ++single slot description, an error of @i{type} @b{program-error} ++is signaled: @t{:allocation}, ++@t{:initform}, @t{:type}, @t{:documentation}. ++ ++It is required that all implementations signal ++an error of @i{type} @b{program-error} if they observe a class option ++or a slot option that is not implemented locally. ++ ++@subsubheading See Also:: ++ ++@ref{documentation} ++, ++@ref{Initialize-Instance} ++, ++@ref{make-instance} ++, ++@ref{slot-value} ++, ++@ref{Classes}, ++@ref{Inheritance}, ++@ref{Redefining Classes}, ++@ref{Determining the Class Precedence List}, ++@ref{Object Creation and Initialization} ++ ++@node defgeneric, defmethod, defclass, Objects Dictionary ++@subsection defgeneric [Macro] ++ ++@code{defgeneric} @i{function-name gf-lambda-list ++ [[!@i{option} | @{!@i{method-description}@}*]]}@* ++ @result{} @i{new-generic} ++ ++@w{@i{option} ::=@r{(}@t{:argument-precedence-order} @{@i{parameter-name}@}^+@r{)} |} ++@w{ @r{(}@b{declare} @{@i{gf-declaration}@}^+@r{)} |} ++@w{ @r{(}@t{:documentation} @i{gf-documentation}@r{)} |} ++@w{ @r{(}@t{:method-combination} @i{method-combination} @{@i{method-combination-argument}@}*@r{)} |} ++@w{ @r{(}@t{:generic-function-class} @i{generic-function-class}@r{)} |} ++@w{ @r{(}@t{:method-class} @i{method-class}@r{)}} ++ ++@w{@i{method-description} ::=@r{(}@t{:method} @{@i{method-qualifier}@}* @i{specialized-lambda-list} @r{[[@{@i{declaration}@}* | @i{documentation}]]} @{@i{form}@}*@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{function-name}---a @i{function name}. ++ ++@i{generic-function-class}---a @i{non-nil} @i{symbol} naming a @i{class}. ++ ++@i{gf-declaration}---an @b{optimize} @i{declaration specifier}; ++ other @i{declaration specifiers} are not permitted. ++ ++@i{gf-documentation}---a @i{string}; not evaluated. ++ ++@i{gf-lambda-list}---a @i{generic function lambda list}. ++ ++@i{method-class}---a @i{non-nil} @i{symbol} naming a @i{class}. ++ ++@i{method-combination-argument}---an @i{object.} ++ ++@i{method-combination-name}---a @i{symbol} ++ naming a @i{method combination} @i{type}. ++ ++@i{method-qualifiers}, ++@i{specialized-lambda-list}, ++@i{declarations}, ++@i{documentation}, ++@i{forms}---as per @b{defmethod}. ++ ++@i{new-generic}---the @i{generic function} @i{object}. ++ ++@i{parameter-name}---a @i{symbol} that names a @i{required parameter} ++ in the @i{lambda-list}. ++ (If the @t{:argument-precedence-order} option is specified, ++ each @i{required parameter} in the @i{lambda-list} ++ must be used exactly once as a @i{parameter-name}.) ++ ++@subsubheading Description:: ++ ++The macro @b{defgeneric} is used to define a @i{generic function} ++or to specify options and declarations that pertain ++to a @i{generic function} as a whole. ++ ++If @i{function-name} is a ++@i{list} it must be of the form @t{(setf @i{symbol})}. ++If @t{(fboundp @i{function-name})} is @i{false}, a new ++@i{generic function} is created. ++ ++If @t{(fdefinition @i{function-name})} is a @i{generic function}, that ++ ++@i{generic function} ++is modified. If @i{function-name} names ++an @i{ordinary function}, ++a @i{macro}, or a @i{special operator}, ++an error is signaled. ++ ++The effect of the @b{defgeneric} macro is as if the following three ++steps were performed: first, ++@i{methods} defined by previous @b{defgeneric} @i{forms} are removed; ++ ++[Reviewer Note by Barmar: Shouldn't this (second) be first?] ++second, @b{ensure-generic-function} ++is called; and finally, @i{methods} specified by the current ++@b{defgeneric} @i{form} are added to the @i{generic function}. ++ ++Each @i{method-description} defines a @i{method} on the @i{generic function}. ++The @i{lambda list} of each @i{method} must be congruent with the ++@i{lambda list} ++specified by the @i{gf-lambda-list} option. ++If no @i{method} descriptions are specified and a @i{generic function} of the same ++name does not already exist, a @i{generic function} with no ++@i{methods} is created. ++ ++The @i{gf-lambda-list} argument of @b{defgeneric} specifies the shape of ++@i{lambda lists} for the @i{methods} on this @i{generic function}. ++All @i{methods} on the resulting ++@i{generic function} must have ++@i{lambda lists} that are congruent with this shape. If a @b{defgeneric} ++form is evaluated and some ++@i{methods} for that @i{generic function} ++have @i{lambda lists} that are not congruent with that given in ++the @b{defgeneric} form, an error is signaled. For further details ++on method congruence, see @ref{Congruent Lambda-lists for all Methods of a Generic Function}. ++ ++The @i{generic function} passes to the ++@i{method} all the argument values passed to ++it, and only those; default values are not supported. ++Note that optional and keyword arguments in method definitions, however, ++can have default initial value forms and can use supplied-p parameters. ++ ++The following options are provided. ++ ++Except as otherwise noted, ++ ++a given option may occur only once. ++ ++@table @asis ++ ++@item @t{*} ++The @t{:argument-precedence-order} option is used to specify the ++order in which the required arguments in a call to the @i{generic function} ++are tested for specificity when selecting a particular ++@i{method}. Each required argument, as specified in the @i{gf-lambda-list} ++argument, must be included exactly once as a @i{parameter-name} ++so that the full and unambiguous precedence order is ++supplied. If this condition is not met, an error is signaled. ++ ++[Reviewer Note by Barmar: What is the default order?] ++ ++@item @t{*} ++The @b{declare} option is used to specify declarations that pertain ++to the @i{generic function}. ++ ++An @b{optimize} @i{declaration specifier} is allowed. ++It specifies whether method selection should be optimized for ++speed or space, but it has no effect on @i{methods}. ++To control how a @i{method} is optimized, an @b{optimize} ++declaration must be placed directly in the @b{defmethod} @i{form} ++or method description. The optimization qualities @b{speed} and ++@b{space} are the only qualities this standard requires, but an ++implementation can extend the object system to recognize other qualities. ++A simple implementation that has only one method selection technique ++and ignores @b{optimize} @i{declaration specifiers} is valid. ++ ++The @b{special}, @b{ftype}, @b{function}, @b{inline}, ++@b{notinline}, and @b{declaration} declarations are not permitted. ++Individual implementations can extend the @b{declare} option to ++support additional declarations. ++ ++[Editorial Note by KMP: Does ``additional'' mean including special, ftype, etc.? ++Or only other things that are not mentioned here?] ++If an implementation notices a @i{declaration specifier} that it does ++not support and that has not been proclaimed as a non-standard ++@i{declaration identifier} name in a @b{declaration} @i{proclamation}, ++it should issue a warning. ++[Editorial Note by KMP: The wording of this previous sentence, ++particularly the word ``and'' suggests to me that you can `proclaim declaration' ++of an unsupported declaration (e.g., ftype) in order to suppress the warning. ++That seems wrong. Perhaps it instead means to say ``does not support or ++is both undefined and not proclaimed declaration.''] ++ ++The @b{declare} option may be specified more than once. ++The effect is the same as if the lists of @i{declaration specifiers} ++had been appended together into a single list and specified as a ++single @b{declare} option. ++ ++@item @t{*} ++The @t{:documentation} argument is a @i{documentation string} ++to be attached to the @i{generic function} @i{object}, ++and to be attached with kind @b{function} to the @i{function-name}. ++ ++@item @t{*} ++The @t{:generic-function-class} option may be used to specify that ++the @i{generic function} is to have a different @i{class} than ++the default provided by the system (the @i{class} @b{standard-generic-function}). ++The @i{class-name} argument is the name of a @i{class} that can be the ++@i{class} of a @i{generic function}. If @i{function-name} specifies ++an existing @i{generic function} that has a different value for the ++@t{:generic-function-class} argument and the new generic function ++@i{class} is compatible with the old, @b{change-class} is called ++to change the @i{class} of the @i{generic function}; ++otherwise an error is signaled. ++ ++@item @t{*} ++The @t{:method-class} option is used to specify that all @i{methods} on ++this @i{generic function} are to have a different @i{class} from the ++default provided by the system (the @i{class} @b{standard-method}). ++The @i{class-name} argument is the name of a @i{class} that is capable ++of being the @i{class} of a @i{method}. ++ ++[Reviewer Note by Barmar: Is @b{change-class} called on existing methods?] ++ ++@item @t{*} ++The @t{:method-combination} option is followed by a symbol that ++names a type of method combination. The arguments (if any) that ++follow that symbol depend on the type of method combination. Note ++that the standard method combination type does not support any ++arguments. However, all types of method combination defined by the ++short form of @b{define-method-combination} accept an optional ++argument named @i{order}, defaulting to @t{:most-specific-first}, ++where a value of @t{:most-specific-last} reverses ++the order of the primary @i{methods} without affecting the order of the ++auxiliary @i{methods}. ++ ++@end table ++ ++The @i{method-description} arguments define @i{methods} that will ++be associated with the @i{generic function}. The @i{method-qualifier} ++and @i{specialized-lambda-list} arguments in a method description ++are the same as for @b{defmethod}. ++ ++The @i{form} arguments specify the method body. The body of the ++@i{method} is enclosed in an @i{implicit block}. ++If @i{function-name} is a @i{symbol}, this block bears the same name as ++the @i{generic function}. If @i{function-name} is a ++@i{list} of the ++form @t{(setf @i{symbol})}, the name of the block is @i{symbol}. ++ ++Implementations can extend @b{defgeneric} to include other options. ++It is required that an implementation signal an error if ++it observes an option that is not implemented locally. ++ ++@b{defgeneric} is not required to perform any compile-time side effects. ++In particular, the @i{methods} are not installed for invocation during ++compilation. An @i{implementation} may choose to store information about ++the @i{generic function} for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls, or noting that a definition ++ for the function name has been seen). ++ ++@subsubheading Examples:: ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{function-name} names an @i{ordinary function}, a @i{macro}, ++or a @i{special operator}, an error of @i{type} @b{program-error} is signaled. ++ ++Each required argument, as specified in the @i{gf-lambda-list} ++argument, must be included exactly once as a @i{parameter-name}, ++or an error of @i{type} @b{program-error} is signaled. ++ ++The @i{lambda list} of each @i{method} specified by a ++@i{method-description} must be congruent with the @i{lambda list} specified ++by the @i{gf-lambda-list} option, or ++an error of @i{type} @b{error} is signaled. ++ ++If a @b{defgeneric} form is evaluated and some @i{methods} for ++that @i{generic function} have @i{lambda lists} that are not congruent with ++that given in the @b{defgeneric} form, ++an error of @i{type} @b{error} is signaled. ++ ++A given @i{option} may occur only once, ++or an error of @i{type} @b{program-error} is signaled. ++ ++[Reviewer Note by Barmar: This says that an error is signaled if you specify the same generic ++ function class as it already has!] ++If @i{function-name} specifies an existing @i{generic function} ++that has a different value for the @t{:generic-function-class} ++argument and the new generic function @i{class} is compatible with the ++old, @b{change-class} is called to change the @i{class} of ++the @i{generic function}; otherwise an error of @i{type} @b{error} is signaled. ++ ++Implementations can extend @b{defgeneric} to include other options. ++It is required that an implementation ++signal an error of @i{type} @b{program-error} if ++it observes an option that is not implemented locally. ++ ++@subsubheading See Also:: ++ ++@ref{defmethod} ++, ++@ref{documentation} ++, ++@ref{ensure-generic-function} ++, ++ ++@b{generic-function}, ++ ++@ref{Congruent Lambda-lists for all Methods of a Generic Function} ++ ++@node defmethod, find-class, defgeneric, Objects Dictionary ++@subsection defmethod [Macro] ++ ++@code{defmethod} @i{@i{function-name} ++ @{@i{method-qualifier}@}* ++ @i{specialized-lambda-list} ++ @r{[[@{@i{declaration}@}* | @i{documentation}]]} @{@i{form}@}*}@* ++ @result{} @i{new-method} ++ ++@i{function-name}::= @{@i{symbol} ++| @t{(setf @i{symbol})}@} ++ ++@i{method-qualifier}::= @i{non-list} ++ ++@w{ @i{specialized-lambda-list}::= (@{@i{var} | @r{(}@r{@i{var} @i{parameter-specializer-name}}@r{)}@}*}@* ++@w{ @t{[}@r{&optional} @{@i{var} | @r{(}var @t{[}@i{initform} @r{@r{[}@i{supplied-p-parameter}@r{]}} @t{]}@r{)}@}*@t{]}}@* ++@w{ @t{[}@t{&rest} @i{var}@t{]}}@* ++@w{ @t{[}@r{@r{&key}}@{@i{var} | @r{(}@{@i{var} | @r{(}@i{keyword}@i{var}@r{)}@} @t{[}@i{initform} @r{[}@i{supplied-p-parameter}@r{]} @t{]}@r{)}@}*}@* ++@w{ @r{[}@b{&allow-other-keys}@r{]} @t{]}}@* ++@w{ @t{[}@t{&aux} @{@i{var} | @r{(}@i{var} @r{[}@i{initform}@r{]} @r{)}@}*@t{]} @r{)}}@* ++ ++@w{ @i{parameter-specializer-name}::= @i{symbol} | @r{(}@t{eql} @i{eql-specializer-form}@r{)}}@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{eql-specializer-form}---a @i{form}. ++ ++@i{Form}---a @i{form}. ++ ++@i{Initform}---a @i{form}. ++ ++@i{Supplied-p-parameter}---variable name. ++ ++@i{new-method}---the new @i{method} @i{object}. ++ ++@subsubheading Description:: ++ ++The macro @b{defmethod} defines a @i{method} on a ++@i{generic function}. ++ ++If @t{(fboundp @i{function-name})} is @b{nil}, a ++@i{generic function} is created with default values for ++the argument precedence order ++(each argument is more specific than the arguments to its right ++in the argument list), ++for the generic function class (the @i{class} @b{standard-generic-function}), ++for the method class (the @i{class} @b{standard-method}), ++and for the method combination type (the standard method combination type). ++The @i{lambda list} of the @i{generic function} is ++congruent with the @i{lambda list} of the ++@i{method} being defined; if the ++@b{defmethod} form mentions keyword arguments, the @i{lambda list} of ++the @i{generic function} ++will mention @t{&key} (but no keyword ++arguments). If @i{function-name} names ++an @i{ordinary function}, ++a @i{macro}, or a @i{special operator}, ++an error is signaled. ++ ++If a @i{generic function} is currently named by @i{function-name}, ++the @i{lambda list} of the ++@i{method} must be congruent with the @i{lambda list} of the ++@i{generic function}. ++If this condition does not hold, an error is signaled. ++For a definition of congruence in this context, see @ref{Congruent Lambda-lists for all Methods of a Generic Function}. ++ ++Each @i{method-qualifier} argument is an @i{object} that is used by ++method combination to identify the given @i{method}. ++The method combination type might further ++restrict what a method @i{qualifier} can be. ++The standard method combination type allows for @i{unqualified methods} and ++@i{methods} whose sole ++@i{qualifier} is one of the keywords @t{:before}, @t{:after}, or @t{:around}. ++ ++The @i{specialized-lambda-list} argument is like an ordinary ++@i{lambda list} except that the @i{names} of required parameters can ++be replaced by specialized parameters. A specialized parameter is a ++list of the form ++@t{(@i{var} @i{parameter-specializer-name})}. ++Only required parameters can be ++specialized. If @i{parameter-specializer-name} is a @i{symbol} it names a ++@i{class}; if it is a @i{list}, ++it is of the form @t{(eql @i{eql-specializer-form})}. The parameter ++specializer name @t{(eql @i{eql-specializer-form})} indicates ++that the corresponding argument must be @b{eql} to the @i{object} that ++is the value of @i{eql-specializer-form} for the @i{method} to be applicable. ++The @i{eql-specializer-form} is evaluated at the time ++that the expansion of the @b{defmethod} macro is evaluated. ++If no @i{parameter specializer name} is specified for a given ++required parameter, the @i{parameter specializer} defaults to ++the @i{class} @b{t}. ++For further discussion, see @ref{Introduction to Methods}. ++ ++The @i{form} arguments specify the method body. ++The body of the @i{method} is enclosed in an @i{implicit block}. If ++@i{function-name} is a @i{symbol}, ++this block bears the same @i{name} as the @i{generic function}. ++If @i{function-name} is a @i{list} of the form ++@t{(setf @i{symbol})}, the @i{name} of the block is @i{symbol}. ++ ++The @i{class} of the @i{method} @i{object} that is created is that given by the ++method class option of the @i{generic function} ++on which the @i{method} is defined. ++ ++If the @i{generic function} already has a @i{method} that agrees with the ++@i{method} being defined on @i{parameter specializers} and @i{qualifiers}, ++@b{defmethod} replaces the existing @i{method} with the one now being ++defined. ++For a definition of agreement in this context. ++see @ref{Agreement on Parameter Specializers and Qualifiers}. ++ ++The @i{parameter specializers} are derived from ++the @i{parameter specializer names} as described in ++@ref{Introduction to Methods}. ++ ++The expansion of the @b{defmethod} macro ``refers to'' each ++specialized parameter (see the description of @b{ignore} ++within the description of @b{declare}). ++This includes parameters that ++have an explicit @i{parameter specializer name} of @b{t}. This means ++that a compiler warning does not occur if the body of the @i{method} does ++not refer to a specialized parameter, while a warning might occur ++if the body of the @i{method} does not refer to an unspecialized parameter. ++For this reason, a parameter that specializes on @b{t} is not quite synonymous ++with an unspecialized parameter in this context. ++ ++Declarations at the head of the method body that apply to the ++method's @i{lambda variables} are treated as @i{bound declarations} ++whose @i{scope} is the same as the corresponding @i{bindings}. ++ ++Declarations at the head of the method body that apply to the ++functional bindings of @b{call-next-method} or @b{next-method-p} ++apply to references to those functions within the method body @i{forms}. ++Any outer @i{bindings} of the @i{function names} @b{call-next-method} and ++@b{next-method-p}, and declarations associated with such @i{bindings} ++are @i{shadowed}_2 within the method body @i{forms}. ++ ++The @i{scope} of @i{free declarations} at the head of the method body ++is the entire method body, ++which includes any implicit local function definitions ++ but excludes @i{initialization forms} for the @i{lambda variables}. ++ ++@b{defmethod} is not required to perform any compile-time side effects. ++In particular, the @i{methods} are not installed for invocation during ++compilation. An @i{implementation} may choose to store information about ++the @i{generic function} for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls, or noting that a definition ++ for the function name has been seen). ++ ++@i{Documentation} is attached as a @i{documentation string} ++to the @i{method} @i{object}. ++ ++@subsubheading Affected By:: ++ ++The definition of the referenced @i{generic function}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{function-name} names an @i{ordinary function}, ++a @i{macro}, or a @i{special operator}, ++an error of @i{type} @b{error} is signaled. ++ ++If a @i{generic function} is currently named by @i{function-name}, ++the @i{lambda list} of the ++@i{method} must be congruent with the @i{lambda list} of the ++@i{generic function}, or ++an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{defgeneric} ++, ++@ref{documentation} ++, ++@ref{Introduction to Methods}, ++@ref{Congruent Lambda-lists for all Methods of a Generic Function}, ++@ref{Agreement on Parameter Specializers and Qualifiers}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@node find-class, next-method-p, defmethod, Objects Dictionary ++@subsection find-class [Accessor] ++ ++@code{find-class} @i{symbol @r{&optional} errorp environment} @result{} @i{class} ++ ++(setf (@code{ find-class} @i{symbol @r{&optional} errorp environment}) new-class)@* ++ ++@subsubheading Arguments and Values:: ++ ++@i{symbol}---a @i{symbol}. ++ ++@i{errorp}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{environment} -- same as the @b{&environment} argument to ++ macro expansion functions and is used to distinguish between ++ compile-time and run-time environments. ++ ++ The @b{&environment} argument has ++ @i{dynamic extent}; the consequences are undefined if ++ the @b{&environment} argument is ++ referred to outside the @i{dynamic extent} ++ of the macro expansion function. ++ ++@i{class}---a @i{class} @i{object}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++Returns the @i{class} @i{object} named by the @i{symbol} ++in the @i{environment}. If there is no such @i{class}, ++@b{nil} is returned if @i{errorp} is @i{false}; otherwise, ++if @i{errorp} is @i{true}, an error is signaled. ++ ++The @i{class} associated with a particular @i{symbol} can be changed by using ++@b{setf} with @b{find-class}; ++ ++or, if the new @i{class} given to @b{setf} is @b{nil}, ++the @i{class} association is removed ++(but the @i{class} @i{object} itself is not affected). ++ ++The results are undefined if the user attempts to change ++ ++or remove ++ ++the @i{class} associated with a ++@i{symbol} that is defined as a @i{type specifier} in this standard. ++See @ref{Integrating Types and Classes}. ++ ++When using @b{setf} of @b{find-class}, any @i{errorp} argument is @i{evaluated} ++for effect, but any @i{values} it returns are ignored; the @i{errorp} ++@i{parameter} is permitted primarily so that the @i{environment} @i{parameter} ++can be used. ++ ++The @i{environment} might be used to distinguish between a compile-time and a ++run-time environment. ++ ++@subsubheading Exceptional Situations:: ++ ++If there is no such @i{class} and @i{errorp} is @i{true}, ++@b{find-class} signals an error of @i{type} @b{error}. ++ ++@subsubheading See Also:: ++ ++@ref{defmacro} ++, ++@ref{Integrating Types and Classes} ++ ++@node next-method-p, call-method, find-class, Objects Dictionary ++@subsection next-method-p [Local Function] ++ ++@subsubheading Syntax:: ++ ++@code{next-method-p} @i{<@i{no @i{arguments}}>} @result{} @i{generalized-boolean} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generalized-boolean}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++The locally defined function @b{next-method-p} can be used ++ ++within the body @i{forms} (but not the @i{lambda list}) ++ ++defined by a @i{method-defining form} to determine ++whether a next @i{method} exists. ++ ++The @i{function} @b{next-method-p} has @i{lexical scope} and @i{indefinite extent}. ++ ++Whether or not @b{next-method-p} is @i{fbound} in the ++@i{global environment} is @i{implementation-dependent}; ++however, the restrictions on redefinition and @i{shadowing} of ++@b{next-method-p} are the same as for @i{symbols} in the @t{COMMON-LISP} @i{package} ++which are @i{fbound} in the @i{global environment}. ++The consequences of attempting to use @b{next-method-p} outside ++of a @i{method-defining form} are undefined. ++ ++@subsubheading See Also:: ++ ++@ref{call-next-method} ++, ++@ref{defmethod} ++, ++@ref{call-method} ++ ++@node call-method, call-next-method, next-method-p, Objects Dictionary ++@subsection call-method, make-method [Local Macro] ++ ++@subsubheading Syntax:: ++ ++@code{call-method} @i{method @r{&optional} next-method-list} @result{} @i{@{@i{result}@}*} ++ ++@code{make-method} @i{form} @result{} @i{method-object} ++ ++@subsubheading Arguments and Values:: ++ ++@i{method}---a @i{method} @i{object}, ++ or a @i{list} (see below); not evaluated. ++ ++@i{method-object}---a @i{method} @i{object}. ++ ++@i{next-method-list}---a @i{list} of @i{method} @i{objects}; not evaluated. ++ ++@i{results}---the @i{values} returned by the @i{method} invocation. ++ ++@subsubheading Description:: ++ ++The macro @b{call-method} is used in method combination. It hides ++the @i{implementation-dependent} details of how ++@i{methods} are called. The ++macro @b{call-method} has @i{lexical scope} and ++can only be used within ++an @i{effective method} @i{form}. ++ ++[Editorial Note by KMP: This next paragraph still needs some work.] ++ ++Whether or not @b{call-method} is @i{fbound} in the ++@i{global environment} is @i{implementation-dependent}; ++however, the restrictions on redefinition and @i{shadowing} of ++@b{call-method} are the same as for @i{symbols} in the @t{COMMON-LISP} @i{package} ++which are @i{fbound} in the @i{global environment}. ++The consequences of attempting to use @b{call-method} outside ++of an @i{effective method} @i{form} are undefined. ++ ++The macro @b{call-method} invokes the specified @i{method}, ++supplying it with arguments and with definitions for ++@b{call-next-method} and for @b{next-method-p}. ++If the invocation of @b{call-method} is lexically inside ++of a @b{make-method}, the arguments are those that ++were supplied to that method. Otherwise the arguments are ++those that were supplied to the generic function. ++The definitions ++of @b{call-next-method} and @b{next-method-p} rely on ++the specified @i{next-method-list}. ++ ++If @i{method} is a @i{list}, the first element of the @i{list} ++must be the symbol @b{make-method} and the second element must be ++a @i{form}. Such a @i{list} specifies a @i{method} @i{object} ++whose @i{method} function has a body that is the given @i{form}. ++ ++@i{Next-method-list} can contain @i{method} @i{objects} or @i{lists}, ++the first element of which must be the symbol @b{make-method} and the ++second element of which must be a @i{form}. ++ ++Those are the only two places where @b{make-method} can be used. ++The @i{form} used with @b{make-method} is evaluated in ++the @i{null lexical environment} augmented with a local macro definition ++for @b{call-method} and with bindings named by ++symbols not @i{accessible} from the @t{COMMON-LISP-USER} @i{package}. ++ ++The @b{call-next-method} function available to @i{method} ++will call the first @i{method} in @i{next-method-list}. ++The @b{call-next-method} function ++available in that @i{method}, in turn, will call the second ++@i{method} in @i{next-method-list}, and so on, until ++the list of next @i{methods} is exhausted. ++ ++If @i{next-method-list} is not supplied, the ++@b{call-next-method} function available to ++@i{method} signals an error of @i{type} @b{control-error} ++and the @b{next-method-p} function ++available to @i{method} returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@subsubheading See Also:: ++ ++@ref{call-next-method} ++, ++@ref{define-method-combination} ++, ++@ref{next-method-p} ++ ++@node call-next-method, compute-applicable-methods, call-method, Objects Dictionary ++@subsection call-next-method [Local Function] ++ ++@subsubheading Syntax:: ++ ++@code{call-next-method} @i{@r{&rest} args} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{arg}---an @i{object}. ++ ++@i{results}---the @i{values} returned by the @i{method} it calls. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{call-next-method} can be used ++ ++within the body @i{forms} (but not the @i{lambda list}) ++ ++of a @i{method} defined by a @i{method-defining form} to call the ++@i{next method}. ++ ++If there is no next @i{method}, the generic function ++@b{no-next-method} is called. ++ ++The type of method combination used determines which @i{methods} ++can invoke @b{call-next-method}. The standard ++@i{method combination} type allows @b{call-next-method} ++to be used within primary @i{methods} and @i{around methods}. ++For generic functions using a type of method combination defined by ++the short form of @b{define-method-combination}, ++@b{call-next-method} can be used in @i{around methods} only. ++ ++When @b{call-next-method} is called with no arguments, it passes the ++current @i{method}'s original arguments to the next @i{method}. Neither ++argument defaulting, nor using @b{setq}, nor rebinding variables ++with the same @i{names} as parameters of the @i{method} affects the values ++@b{call-next-method} passes to the @i{method} it calls. ++ ++When @b{call-next-method} is called with arguments, the ++@i{next method} is called with those arguments. ++ ++If @b{call-next-method} is called with arguments but omits ++optional arguments, the @i{next method} called defaults those arguments. ++ ++The @i{function} @b{call-next-method} returns any @i{values} that are ++returned by the @i{next method}. ++ ++The @i{function} @b{call-next-method} has @i{lexical scope} and ++@i{indefinite extent} and can only be used within the body of a ++@i{method} defined by a @i{method-defining form}. ++ ++Whether or not @b{call-next-method} is @i{fbound} in the ++@i{global environment} is @i{implementation-dependent}; ++however, the restrictions on redefinition and @i{shadowing} of ++@b{call-next-method} are the same as for @i{symbols} in the @t{COMMON-LISP} @i{package} ++which are @i{fbound} in the @i{global environment}. ++The consequences of attempting to use @b{call-next-method} outside ++of a @i{method-defining form} are undefined. ++ ++@subsubheading Affected By:: ++ ++@b{defmethod}, @b{call-method}, @b{define-method-combination}. ++ ++@subsubheading Exceptional Situations:: ++ ++When providing arguments to @b{call-next-method}, ++the following rule must be satisfied or an error of @i{type} @b{error} ++should be ++signaled: ++the ordered set of @i{applicable methods} for a changed set of arguments ++for @b{call-next-method} must be the same as the ordered set of ++@i{applicable methods} for the original arguments to the ++@i{generic function}. ++Optimizations of the error checking are possible, but they must not change ++the semantics of @b{call-next-method}. ++ ++@subsubheading See Also:: ++ ++@ref{define-method-combination} ++, ++@ref{defmethod} ++, ++@ref{next-method-p} ++, ++@ref{no-next-method} ++, ++@ref{call-method} ++, ++@ref{Method Selection and Combination}, ++@ref{Standard Method Combination}, ++@ref{Built-in Method Combination Types} ++ ++@node compute-applicable-methods, define-method-combination, call-next-method, Objects Dictionary ++@subsection compute-applicable-methods [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{compute-applicable-methods} @i{generic-function function-arguments} @result{} @i{methods} ++ ++@subsubheading Method Signatures:: ++ ++@code{compute-applicable-methods} @i{@r{(}@i{generic-function} @b{standard-generic-function}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generic-function}---a @i{generic function}. ++ ++@i{function-arguments}---a @i{list} of arguments for the @i{generic-function}. ++ ++@i{methods}---a @i{list} of @i{method} @i{objects}. ++ ++@subsubheading Description:: ++ ++Given a @i{generic-function} and a set of ++@i{function-arguments}, the function ++@b{compute-applicable-methods} returns the set of @i{methods} ++that are applicable for those arguments ++sorted according to precedence order. ++See @ref{Method Selection and Combination}. ++ ++@subsubheading Affected By:: ++ ++@b{defmethod} ++ ++@subsubheading See Also:: ++ ++@ref{Method Selection and Combination} ++ ++@node define-method-combination, find-method, compute-applicable-methods, Objects Dictionary ++@subsection define-method-combination [Macro] ++ ++@code{define-method-combination} @i{name [[!@i{short-form-option}]]}@* ++ @result{} @i{name} ++ ++@code{define-method-combination} @i{name lambda-list ++ @r{(}@{@i{method-group-specifier}@}*@r{)} ++ @r{[}@r{(}@t{:arguments} . args-lambda-list@r{)}@r{]} ++ @r{[}@r{(}@t{:generic-function} ++ generic-function-symbol@r{)}@r{]} ++ [[@{@i{declaration}@}* | @i{documentation}]] ++ @{@i{form}@}*}@* ++ @result{} @i{name} ++ ++@w{@i{short-form-option} ::=@t{:documentation} @i{documentation} | } ++@w{ @t{:identity-with-one-argument} @i{identity-with-one-argument} |} ++@w{ @t{:operator} @i{operator}} ++ ++@w{@i{method-group-specifier} ::=@r{(}name @{@{@i{qualifier-pattern}@}^+ | predicate@} [[!@i{long-form-option}]]@r{)}} ++ ++@w{@i{long-form-option} ::=@t{:description} @i{description} |} ++@w{ @t{:order} @i{order} |} ++@w{ @t{:required} @i{required-p}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{args-lambda-list}--- ++a @i{define-method-combination arguments lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{description}---a @i{format control}. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@i{forms}---an @i{implicit progn} ++ that must compute and return the @i{form} that specifies how ++ the @i{methods} are combined, that is, the @i{effective method}. ++ ++@i{generic-function-symbol}---a @i{symbol}. ++ ++@i{identity-with-one-argument}---a @i{generalized boolean}. ++ ++@i{lambda-list}---@i{ordinary lambda list}. ++ ++@i{name}---a @i{symbol}. ++ Non-@i{keyword}, @i{non-nil} @i{symbols} are usually used. ++ ++@i{operator}---an @i{operator}. ++ @i{Name} and @i{operator} are often the @i{same} @i{symbol}. ++ This is the default, but it is not required. ++ ++@i{order}---@t{:most-specific-first} or @t{:most-specific-last}; evaluated. ++ ++@i{predicate}---a @i{symbol} that names a @i{function} of one argument ++ that returns a @i{generalized boolean}. ++ ++@i{qualifier-pattern}---a @i{list}, ++ or the @i{symbol} @b{*}. ++ ++@i{required-p}---a @i{generalized boolean}. ++ ++@subsubheading Description:: ++ ++The macro @b{define-method-combination} is used to define new types ++of method combination. ++ ++There are two forms of @b{define-method-combination}. The short ++form is a simple facility for the cases that are expected ++to be most commonly needed. The long form is more powerful but more ++verbose. It resembles @b{defmacro} in that the body is an ++expression, usually using backquote, that computes a @i{form}. Thus ++arbitrary control structures can be implemented. The long form also ++allows arbitrary processing of method @i{qualifiers}. ++ ++@table @asis ++ ++@item @b{Short Form} ++The short form syntax of @b{define-method-combination} is recognized ++when the second @i{subform} is a @i{non-nil} symbol or is not present. ++When the short form is used, @i{name} is defined as a type of ++method combination that produces a Lisp form ++@t{(@r{@i{operator} @i{method-call} @i{method-call} ...})}. ++The @i{operator} is a @i{symbol} that can be the @i{name} of a ++@i{function}, @i{macro}, or @i{special operator}. ++The @i{operator} can be supplied by a keyword option; ++it defaults to @i{name}. ++ ++Keyword options for the short form are the following: ++ ++@table @asis ++ ++@item @t{*} ++The @t{:documentation} option is used to document the method-combination type; ++see description of long form below. ++ ++@item @t{*} ++The @t{:identity-with-one-argument} option enables an optimization ++when its value is @i{true} (the default is @i{false}). If there is ++exactly one applicable method and it is a primary method, that method ++serves as the effective method and @i{operator} is not called. ++This optimization avoids the need to create a new effective method and ++avoids the overhead of a @i{function} call. This option is designed to be ++used with operators such as @b{progn}, @b{and}, @b{+}, and ++@b{max}. ++ ++@item @t{*} ++The @t{:operator} option specifies the @i{name} of the operator. The ++@i{operator} argument is a @i{symbol} that can be the ++@i{name} of a @i{function}, ++@i{macro}, or ++@i{special form}. ++ ++@end table ++ ++These types of method combination require exactly one @i{qualifier} per ++method. An error is signaled if there are applicable methods with no ++@i{qualifiers} or with @i{qualifiers} that are not supported by ++the method combination type. ++ ++A method combination procedure defined in this way recognizes two ++roles for methods. A method whose one @i{qualifier} is the symbol naming ++this type of method combination is defined to be a primary method. At ++least one primary method must be applicable or an error is signaled. ++A method with @t{:around} as its one @i{qualifier} is an auxiliary ++method that behaves the same as an @i{around method} in standard ++method combination. The @i{function} @b{call-next-method} can only be ++used in @i{around methods}; it cannot be used in primary methods ++defined by the short form of the @b{define-method-combination} macro. ++ ++A method combination procedure defined in this way accepts an optional ++argument named @i{order}, which defaults to ++@t{:most-specific-first}. A value of @t{:most-specific-last} reverses ++the order of the primary methods without affecting the order of the ++auxiliary methods. ++ ++The short form automatically includes error checking and support for ++@i{around methods}. ++ ++For a discussion of built-in method combination types, ++see @ref{Built-in Method Combination Types}. ++ ++@item @b{Long Form} ++The long form syntax of @b{define-method-combination} is recognized ++when the second @i{subform} is a list. ++ ++The @i{lambda-list} ++receives any arguments provided after the @i{name} of the method ++combination type in the @t{:method-combination} option to ++@b{defgeneric}. ++ ++A list of method group specifiers follows. Each specifier selects a subset ++of the applicable methods to play a particular role, either by matching ++their @i{qualifiers} against some patterns or by testing their @i{qualifiers} with ++a @i{predicate}. ++These method group specifiers define all method @i{qualifiers} ++that can be used with this type of method combination. ++ ++The @i{car} of each @i{method-group-specifier} is a @i{symbol} ++which @i{names} a @i{variable}. ++During the execution of ++the @i{forms} in the body of @b{define-method-combination}, this ++@i{variable} is bound to a list of the @i{methods} in the method group. The ++@i{methods} in this list occur in the order specified by the ++@t{:order} option. ++ ++If @i{qualifier-pattern} is a @i{symbol} it must be @b{*}. ++A method matches ++a @i{qualifier-pattern} if the method's ++list of @i{qualifiers} is @b{equal} ++to the @i{qualifier-pattern} (except that the symbol @b{*} in a ++@i{qualifier-pattern} matches anything). Thus ++a @i{qualifier-pattern} can be one of the ++following: ++ the @i{empty list}, which matches @i{unqualified methods}; ++ the symbol @b{*}, which matches all methods; ++ a true list, which matches methods with the same number of @i{qualifiers} ++ as the length of the list when each @i{qualifier} matches ++ the corresponding list element; or ++ a dotted list that ends in the symbol @b{*} ++ (the @b{*} matches any number of additional @i{qualifiers}). ++ ++Each applicable method is tested against the @i{qualifier-patterns} and ++@i{predicates} in left-to-right order. ++As soon as a @i{qualifier-pattern} matches ++or a @i{predicate} returns true, the method becomes a member of the ++corresponding method group and no further tests are made. Thus if a method ++could be a member of more than one method group, it joins only the first ++such group. If a method group has more than one ++@i{qualifier-pattern}, a ++method need only satisfy one of the @i{qualifier-patterns} to be a member of ++the group. ++ ++The @i{name} of a @i{predicate} function can appear instead of ++@i{qualifier-patterns} in a method group specifier. ++The @i{predicate} is called for ++each method that has not been assigned to an earlier method group; it ++is called with one argument, the method's @i{qualifier} @i{list}. ++The @i{predicate} should return true if the method is to be a member of the ++method group. A @i{predicate} can be distinguished from a ++@i{qualifier-pattern} ++because it is a @i{symbol} other than @b{nil} or @b{*}. ++ ++If there is an applicable method that does not fall into any method group, ++the @i{function} @b{invalid-method-error} is called. ++ ++Method group specifiers can have keyword options following the ++@i{qualifier} patterns or predicate. Keyword options can be distinguished from ++additional @i{qualifier} patterns because they are neither lists nor the symbol ++@b{*}. The keyword options are as follows: ++ ++@table @asis ++ ++@item @t{*} ++The @t{:description} option is used to provide a description of the ++role of methods in the method group. Programming environment tools ++use ++ @t{(apply #'format stream @i{format-control} (method-qualifiers @i{method}))} ++to print this description, which ++is expected to be concise. This keyword ++option allows the description of a method @i{qualifier} to be defined in ++the same module that defines the meaning of the ++method @i{qualifier}. In most cases, @i{format-control} will not contain any ++@b{format} directives, but they are available for generality. ++If @t{:description} is not supplied, a default description is generated ++based on the variable name and the @i{qualifier} patterns and on whether ++this method group includes the @i{unqualified methods}. ++ ++@item @t{*} ++The @t{:order} option specifies the order of methods. The @i{order} ++argument is a @i{form} that evaluates to ++@t{:most-specific-first} or @t{:most-specific-last}. If it evaluates ++to any other value, an error is signaled. ++If @t{:order} is not supplied, it defaults to ++@t{:most-specific-first}. ++ ++@item @t{*} ++The @t{:required} option specifies whether at least one method in ++this method group is required. ++If its value is @i{true} and the method group is empty ++(that is, no applicable methods match the @i{qualifier} patterns ++or satisfy the predicate), ++an error is signaled. ++If @t{:required} is not supplied, ++it defaults to @b{nil}. ++ ++@end table ++ ++The use of method group specifiers provides a convenient syntax to ++select methods, to divide them among the possible roles, and to perform the ++necessary error checking. It is possible to perform further filtering ++of methods in the body @i{forms} by using normal list-processing operations ++and the functions @b{method-qualifiers} and ++@b{invalid-method-error}. It is permissible to use @b{setq} on the ++variables named in the method group specifiers and to bind additional ++variables. It is also possible to bypass the method group specifier ++mechanism and do everything in the body @i{forms}. This is accomplished ++by writing a single method group with @b{*} as its only ++@i{qualifier-pattern}; ++the variable is then bound to a @i{list} of all of the ++@i{applicable methods}, in most-specific-first order. ++ ++The body @i{forms} compute and return the @i{form} that specifies ++how the methods are combined, that is, the effective method. ++The effective method is evaluated in ++the @i{null lexical environment} augmented with a local macro definition ++for @b{call-method} and with bindings named by ++symbols not @i{accessible} from the @t{COMMON-LISP-USER} @i{package}. ++Given a method object in one of the ++@i{lists} produced by the method group ++specifiers and a @i{list} of next methods, ++@b{call-method} ++will invoke the method such that @b{call-next-method} has available ++the next methods. ++ ++When an effective method has no effect other than to call a single ++method, some implementations employ an optimization that uses the ++single method directly as the effective method, thus avoiding the need ++to create a new effective method. This optimization is active when ++the effective method form consists entirely of an invocation of ++the @b{call-method} macro whose first @i{subform} is a method object and ++whose second @i{subform} is @b{nil} or unsupplied. Each ++@b{define-method-combination} body is responsible for stripping off ++redundant invocations of @b{progn}, @b{and}, ++@b{multiple-value-prog1}, and the like, if this optimization is desired. ++ ++The list @t{(:arguments . @i{lambda-list})} can appear before ++any declarations or @i{documentation string}. This form is useful when ++the method combination type performs some specific behavior as part of ++the combined method and that behavior needs access to the arguments to ++the @i{generic function}. Each parameter variable defined by ++@i{lambda-list} is bound to a @i{form} that can be inserted into the ++effective method. When this @i{form} is evaluated during execution of the ++effective method, its value is the corresponding argument to the ++@i{generic function}; the consequences of using such a @i{form} as ++the @i{place} in a @b{setf} @i{form} are undefined. ++ ++Argument correspondence is computed by dividing the @t{:arguments} @i{lambda-list} ++and the @i{generic function} @i{lambda-list} into three sections: ++ the @i{required parameters}, ++ the @i{optional parameters}, ++ and the @i{keyword} and @i{rest parameters}. ++The @i{arguments} supplied to the @i{generic function} for a particular @i{call} ++are also divided into three sections; ++ the required @i{arguments} section contains as many @i{arguments} ++ as the @i{generic function} has @i{required parameters}, ++ the optional @i{arguments} section contains as many arguments ++ as the @i{generic function} has @i{optional parameters}, ++ and the keyword/rest @i{arguments} section contains the remaining arguments. ++Each @i{parameter} in the required and optional sections of the ++@t{:arguments} @i{lambda-list} accesses the argument at the same position ++in the corresponding section of the @i{arguments}. ++If the section of the @t{:arguments} @i{lambda-list} is shorter, ++ extra @i{arguments} are ignored. ++If the section of the @t{:arguments} @i{lambda-list} is longer, ++ excess @i{required parameters} are bound to forms that evaluate to @b{nil} ++ and excess @i{optional parameters} are @i{bound} to their initforms. ++The @i{keyword parameters} and @i{rest parameters} in the @t{:arguments} ++@i{lambda-list} access the keyword/rest section of the @i{arguments}. ++If the @t{:arguments} @i{lambda-list} contains @b{&key}, it behaves as ++if it also contained @b{&allow-other-keys}. ++ ++In addition, @b{&whole} @i{var} can be placed first in the @t{:arguments} ++@i{lambda-list}. It causes @i{var} to be @i{bound} to a @i{form} ++that @i{evaluates} to a @i{list} of all of the @i{arguments} supplied ++to the @i{generic function}. This is different from @b{&rest} because it ++accesses all of the arguments, not just the keyword/rest @i{arguments}. ++ ++Erroneous conditions detected by the body should be reported with ++@b{method-combination-error} or @b{invalid-method-error}; these ++@i{functions} ++add any necessary contextual information to the error message and will ++signal the appropriate error. ++ ++The body @i{forms} are evaluated inside of the @i{bindings} created by ++the ++@i{lambda list} and method group specifiers. ++ ++[Reviewer Note by Barmar: Are they inside or outside the :ARGUMENTS bindings?] ++Declarations at the head of ++the body are positioned directly inside of @i{bindings} created by the ++@i{lambda list} and outside of the @i{bindings} of the method group variables. ++Thus method group variables cannot be declared in this way. @b{locally} may be used ++around the body, however. ++ ++Within the body @i{forms}, @i{generic-function-symbol} ++is bound to the @i{generic function} @i{object}. ++ ++@i{Documentation} is attached as a @i{documentation string} ++ to @i{name} (as kind @b{method-combination}) ++and to the @i{method combination} @i{object}. ++ ++Note that two methods with identical specializers, but with different ++@i{qualifiers}, are not ordered by the algorithm described in Step 2 of ++the method selection and combination process described in ++@ref{Method Selection and Combination}. Normally the two methods play ++different roles in the effective method because they have different ++@i{qualifiers}, and no matter how they are ordered in the result of Step ++2, the effective method is the same. If the two methods play the same ++role and their order matters, ++ ++[Reviewer Note by Barmar: How does the system know when the order matters?] ++an error is signaled. This happens as ++part of the @i{qualifier} pattern matching in ++@b{define-method-combination}. ++ ++@end table ++ ++If a @b{define-method-combination} @i{form} appears as a ++@i{top level form}, the @i{compiler} must make the ++@i{method combination} @i{name} be recognized as a valid ++@i{method combination} @i{name} in subsequent @b{defgeneric} ++@i{forms}. However, the @i{method combination} is executed ++no earlier than when the @b{define-method-combination} @i{form} ++is executed, and possibly as late as the time that @i{generic functions} ++that use the @i{method combination} are executed. ++ ++@subsubheading Examples:: ++ ++Most examples of the long form of @b{define-method-combination} also ++illustrate the use of the related @i{functions} that are provided as part ++of the declarative method combination facility. ++ ++@example ++;;; Examples of the short form of define-method-combination ++ ++ (define-method-combination and :identity-with-one-argument t) ++ ++ (defmethod func and ((x class1) y) ...) ++ ++;;; The equivalent of this example in the long form is: ++ ++ (define-method-combination and ++ (&optional (order :most-specific-first)) ++ ((around (:around)) ++ (primary (and) :order order :required t)) ++ (let ((form (if (rest primary) ++ `(and ,@@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ primary)) ++ `(call-method ,(first primary))))) ++ (if around ++ `(call-method ,(first around) ++ (,@@(rest around) ++ (make-method ,form))) ++ form))) ++ ++;;; Examples of the long form of define-method-combination ++ ++;The default method-combination technique ++ (define-method-combination standard () ++ ((around (:around)) ++ (before (:before)) ++ (primary () :required t) ++ (after (:after))) ++ (flet ((call-methods (methods) ++ (mapcar #'(lambda (method) ++ `(call-method ,method)) ++ methods))) ++ (let ((form (if (or before after (rest primary)) ++ `(multiple-value-prog1 ++ (progn ,@@(call-methods before) ++ (call-method ,(first primary) ++ ,(rest primary))) ++ ,@@(call-methods (reverse after))) ++ `(call-method ,(first primary))))) ++ (if around ++ `(call-method ,(first around) ++ (,@@(rest around) ++ (make-method ,form))) ++ form)))) ++ ++;A simple way to try several methods until one returns non-nil ++ (define-method-combination or () ++ ((methods (or))) ++ `(or ,@@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ methods))) ++ ++;A more complete version of the preceding ++ (define-method-combination or ++ (&optional (order ':most-specific-first)) ++ ((around (:around)) ++ (primary (or))) ++ ;; Process the order argument ++ (case order ++ (:most-specific-first) ++ (:most-specific-last (setq primary (reverse primary))) ++ (otherwise (method-combination-error "~S is an invalid order.~@@ ++ :most-specific-first and :most-specific-last are the possible values." ++ order))) ++ ;; Must have a primary method ++ (unless primary ++ (method-combination-error "A primary method is required.")) ++ ;; Construct the form that calls the primary methods ++ (let ((form (if (rest primary) ++ `(or ,@@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ primary)) ++ `(call-method ,(first primary))))) ++ ;; Wrap the around methods around that form ++ (if around ++ `(call-method ,(first around) ++ (,@@(rest around) ++ (make-method ,form))) ++ form))) ++ ++;The same thing, using the :order and :required keyword options ++ (define-method-combination or ++ (&optional (order ':most-specific-first)) ++ ((around (:around)) ++ (primary (or) :order order :required t)) ++ (let ((form (if (rest primary) ++ `(or ,@@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ primary)) ++ `(call-method ,(first primary))))) ++ (if around ++ `(call-method ,(first around) ++ (,@@(rest around) ++ (make-method ,form))) ++ form))) ++ ++;This short-form call is behaviorally identical to the preceding ++ (define-method-combination or :identity-with-one-argument t) ++ ++;Order methods by positive integer qualifiers ++;:around methods are disallowed to keep the example small ++ (define-method-combination example-method-combination () ++ ((methods positive-integer-qualifier-p)) ++ `(progn ,@@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ (stable-sort methods #'< ++ :key #'(lambda (method) ++ (first (method-qualifiers method))))))) ++ ++ (defun positive-integer-qualifier-p (method-qualifiers) ++ (and (= (length method-qualifiers) 1) ++ (typep (first method-qualifiers) '(integer 0 *)))) ++ ++;;; Example of the use of :arguments ++ (define-method-combination progn-with-lock () ++ ((methods ())) ++ (:arguments object) ++ `(unwind-protect ++ (progn (lock (object-lock ,object)) ++ ,@@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ methods)) ++ (unlock (object-lock ,object)))) ++ ++@end example ++ ++@subsubheading Side Effects:: ++ ++The @i{compiler} is not required to perform any compile-time side-effects. ++ ++@subsubheading Exceptional Situations:: ++ ++Method combination types defined with the short form require exactly ++one @i{qualifier} per method. ++An error of @i{type} @b{error} is signaled if there are ++applicable methods with no @i{qualifiers} or with @i{qualifiers} that are not ++supported by the method combination type. ++At least one primary method must be applicable or ++an error of @i{type} @b{error} is signaled. ++ ++If an applicable method does not fall into any method group, the ++system signals an error of @i{type} @b{error} ++indicating that the method is invalid for the kind of ++method combination in use. ++ ++If the value of the @t{:required} option is @i{true} ++and the method group is empty (that is, no applicable ++methods match the @i{qualifier} patterns or satisfy the predicate), ++an error of @i{type} @b{error} is signaled. ++ ++If the @t{:order} option evaluates to a value other than ++@t{:most-specific-first} or @t{:most-specific-last}, ++an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{call-method} ++, ++@ref{call-next-method} ++, ++@ref{documentation} ++, ++@ref{method-qualifiers} ++, ++@ref{method-combination-error} ++, ++@ref{invalid-method-error} ++, ++@ref{defgeneric} ++, ++@ref{Method Selection and Combination}, ++@ref{Built-in Method Combination Types}, ++@ref{Syntactic Interaction of Documentation Strings and Declarations} ++ ++@subsubheading Notes:: ++ ++The @t{:method-combination} option of @b{defgeneric} is used to ++specify that a @i{generic function} should use a particular method ++combination type. The first argument to the @t{:method-combination} ++option is the @i{name} of a method combination type and the remaining ++arguments are options for that type. ++ ++@node find-method, add-method, define-method-combination, Objects Dictionary ++@subsection find-method [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{find-method} @i{generic-function method-qualifiers specializers @r{&optional} errorp}@* ++ @result{} @i{method} ++ ++@subsubheading Method Signatures:: ++ ++@code{find-method} @i{@r{(}@i{generic-function} @b{standard-generic-function}@r{)} ++ method-qualifiers specializers @r{&optional} errorp} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generic-function}---a @i{generic function}. ++ ++@i{method-qualifiers}---a @i{list}. ++ ++@i{specializers}---a @i{list}. ++ ++@i{errorp}---a @i{generalized boolean}. ++ The default is @i{true}. ++ ++@i{method}---a @i{method} @i{object}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++The @i{generic function} @b{find-method} takes a @i{generic function} ++and returns the @i{method} @i{object} that agrees on @i{qualifiers} ++and @i{parameter specializers} with the @i{method-qualifiers} and ++@i{specializers} arguments of @b{find-method}. ++@i{Method-qualifiers} contains the ++method @i{qualifiers} for the @i{method}. ++The order of the method @i{qualifiers} ++is significant. ++For a definition of agreement in this context, ++see @ref{Agreement on Parameter Specializers and Qualifiers}. ++ ++The @i{specializers} argument contains the parameter ++specializers for the @i{method}. It must correspond in length to ++the number of required arguments of the @i{generic function}, or ++an error is signaled. This means that to obtain the ++default @i{method} on a given @i{generic-function}, ++a @i{list} whose elements are the @i{class} @b{t} must be given. ++ ++If there is no such @i{method} and @i{errorp} is @i{true}, ++@b{find-method} signals an error. ++If there is no such @i{method} and @i{errorp} is @i{false}, ++@b{find-method} returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defmethod some-operation ((a integer) (b float)) (list a b)) ++@result{} # ++ (find-method #'some-operation '() (mapcar #'find-class '(integer float))) ++@result{} # ++ (find-method #'some-operation '() (mapcar #'find-class '(integer integer))) ++@t{ |> } Error: No matching method ++ (find-method #'some-operation '() (mapcar #'find-class '(integer integer)) nil) ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{add-method}, ++@b{defclass}, ++@b{defgeneric}, ++@b{defmethod} ++ ++@subsubheading Exceptional Situations:: ++ ++If the @i{specializers} argument does not correspond in length to ++the number of required arguments of the @i{generic-function}, an ++an error of @i{type} @b{error} is signaled. ++ ++If there is no such @i{method} and @i{errorp} is @i{true}, ++@b{find-method} signals an error of @i{type} @b{error}. ++ ++@subsubheading See Also:: ++ ++@ref{Agreement on Parameter Specializers and Qualifiers} ++ ++@node add-method, initialize-instance, find-method, Objects Dictionary ++@subsection add-method [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{add-method} @i{generic-function method} @result{} @i{generic-function} ++ ++@subsubheading Method Signatures:: ++ ++@code{add-method} @i{@r{(}@i{generic-function} @b{standard-generic-function}@r{)} ++ @r{(}@i{method} @b{method}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{generic-function}---a @i{generic function} @i{object}. ++ ++@i{method}---a @i{method} @i{object}. ++ ++@subsubheading Description:: ++ ++The generic function @b{add-method} adds a @i{method} ++to a @i{generic function}. ++ ++If @i{method} agrees with an existing @i{method} of @i{generic-function} ++on @i{parameter specializers} and @i{qualifiers}, ++the existing @i{method} is replaced. ++ ++@subsubheading Exceptional Situations:: ++ ++The @i{lambda list} of the method function of @i{method} must be ++congruent with the @i{lambda list} of @i{generic-function}, ++or an error of @i{type} @b{error} is signaled. ++ ++If @i{method} is a @i{method} @i{object} of ++another @i{generic function}, an error of @i{type} @b{error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{defmethod} ++, ++@ref{defgeneric} ++, ++@ref{find-method} ++, ++@ref{remove-method} ++, ++@ref{Agreement on Parameter Specializers and Qualifiers} ++ ++@node initialize-instance, class-name, add-method, Objects Dictionary ++@subsection initialize-instance [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{initialize-instance} @i{instance @r{&rest} initargs @r{&key} @r{&allow-other-keys}} @result{} @i{instance} ++ ++@subsubheading Method Signatures:: ++ ++@code{initialize-instance} @i{@r{(}@i{instance} @b{standard-object}@r{)} @r{&rest} initargs} ++ ++@subsubheading Arguments and Values:: ++ ++@i{instance}---an @i{object}. ++ ++@i{initargs}---a @i{defaulted initialization argument list}. ++ ++@subsubheading Description:: ++ ++Called by @b{make-instance} to initialize a newly created @i{instance}. ++The generic function is called with the new @i{instance} ++and the @i{defaulted initialization argument list}. ++ ++The system-supplied primary @i{method} on @b{initialize-instance} ++initializes the @i{slots} of the @i{instance} with values according ++to the @i{initargs} and the @t{:initform} forms of the @i{slots}. ++It does this by calling the generic function @b{shared-initialize} ++with the following arguments: the @i{instance}, @b{t} (this indicates ++that all @i{slots} for which no initialization arguments are provided ++should be initialized according to their @t{:initform} forms), and ++the @i{initargs}. ++ ++Programmers can define @i{methods} for @b{initialize-instance} to ++specify actions to be taken when an instance is initialized. If only ++@i{after methods} are defined, they will be run after the ++system-supplied primary @i{method} for initialization and therefore will ++not interfere with the default behavior of @b{initialize-instance}. ++ ++@subsubheading See Also:: ++ ++@ref{Shared-Initialize} ++, ++@ref{make-instance} ++, ++@ref{slot-boundp} ++, ++@ref{slot-makunbound} ++, ++@ref{Object Creation and Initialization}, ++@ref{Rules for Initialization Arguments}, ++@ref{Declaring the Validity of Initialization Arguments} ++ ++@node class-name, setf class-name, initialize-instance, Objects Dictionary ++@subsection class-name [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{class-name} @i{class} @result{} @i{name} ++ ++@subsubheading Method Signatures:: ++ ++@code{class-name} @i{@r{(}@i{class} @b{class}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{class}---a @i{class} @i{object}. ++ ++@i{name}---a @i{symbol}. ++ ++@subsubheading Description:: ++ ++Returns the @i{name} of the given @i{class}. ++ ++@subsubheading See Also:: ++ ++@ref{find-class} ++, ++@ref{Classes} ++ ++@subsubheading Notes:: ++ ++If S is a @i{symbol} such that S =@t{(class-name C)} ++and C =@t{(find-class S)}, then S is the proper name of C. ++For further discussion, see @ref{Classes}. ++ ++The name of an anonymous @i{class} is @b{nil}. ++ ++@node setf class-name, class-of, class-name, Objects Dictionary ++@subsection setf class-name [Standard Generic Function] ++ ++@subsubheading Syntax:: ++ ++@code{setf class-name} @i{new-value class} @result{} @i{new-value} ++ ++@subsubheading Method Signatures:: ++ ++@code{setf class-name} @i{new-value @r{(}@i{class} @b{class}@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{new-value}---a @i{symbol}. ++ ++@i{class}---a @i{class}. ++ ++@subsubheading Description:: ++ ++The generic function @t{setf class-name} sets the name of ++a @i{class} object. ++ ++@subsubheading See Also:: ++ ++@ref{find-class} ++, ++@i{proper name}, ++@ref{Classes} ++ ++@node class-of, unbound-slot, setf class-name, Objects Dictionary ++@subsection class-of [Function] ++ ++@code{class-of} @i{object} @result{} @i{class} ++ ++@subsubheading Arguments and Values:: ++ ++@i{object}---an @i{object}. ++ ++@i{class}---a @i{class} @i{object}. ++ ++@subsubheading Description:: ++ ++Returns the @i{class} of which the @i{object} is ++a @i{direct instance}. ++ ++@subsubheading Examples:: ++ ++@example ++ (class-of 'fred) @result{} # ++ (class-of 2/3) @result{} # ++ ++ (defclass book () ()) @result{} # ++ (class-of (make-instance 'book)) @result{} # ++ ++ (defclass novel (book) ()) @result{} # ++ (class-of (make-instance 'novel)) @result{} # ++ ++ (defstruct kons kar kdr) @result{} KONS ++ (class-of (make-kons :kar 3 :kdr 4)) @result{} # ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{make-instance} ++, ++@ref{type-of} ++ ++@node unbound-slot, unbound-slot-instance, class-of, Objects Dictionary ++@subsection unbound-slot [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{unbound-slot}, ++@b{cell-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{object} having the unbound slot is initialized by ++the @t{:instance} initialization argument to @b{make-condition}, ++and is @i{accessed} by the @i{function} @b{unbound-slot-instance}. ++ ++The name of the cell (see @b{cell-error}) is the name of the slot. ++ ++@subsubheading See Also:: ++ ++@ref{cell-error-name} ++, ++@b{unbound-slot-object}, ++@ref{Condition System Concepts} ++ ++@node unbound-slot-instance, , unbound-slot, Objects Dictionary ++@subsection unbound-slot-instance [Function] ++ ++@code{unbound-slot-instance} @i{condition} @result{} @i{instance} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{unbound-slot}. ++ ++@i{instance}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Returns the instance which had the unbound slot in the @i{situation} ++represented by the @i{condition}. ++ ++@subsubheading See Also:: ++ ++@ref{cell-error-name} ++, ++@b{unbound-slot}, ++@ref{Condition System Concepts} ++ ++@c end of including dict-objects ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-8.texi +@@ -0,0 +1,1169 @@ ++ ++ ++@node Structures, Conditions, Objects, Top ++@chapter Structures ++ ++@menu ++* Structures Dictionary:: ++@end menu ++ ++@node Structures Dictionary, , Structures, Structures ++@section Structures Dictionary ++ ++@c including dict-structures ++ ++@menu ++* defstruct:: ++* copy-structure:: ++@end menu ++ ++@node defstruct, copy-structure, Structures Dictionary, Structures Dictionary ++@subsection defstruct [Macro] ++ ++@code{defstruct} @i{name-and-options @r{[}documentation@r{]} @{!@i{slot-description}@}*}@* ++ @result{} @i{structure-name} ++ ++@w{@i{name-and-options} ::=structure-name | @r{(}structure-name [[!@i{options}]]@r{)}} ++ ++@w{@i{options} ::=!@i{conc-name-option} |} ++@w{ @{!@i{constructor-option}@}* |} ++@w{ !@i{copier-option} |} ++@w{ !@i{include-option} |} ++@w{ !@i{initial-offset-option} |} ++@w{ !@i{named-option} |} ++@w{ !@i{predicate-option} |} ++@w{ !@i{printer-option} |} ++@w{ !@i{type-option}} ++ ++@w{@i{conc-name-option} ::=@t{:conc-name} | @r{(}@t{:conc-name}@r{)} | @r{(}@t{:conc-name} @i{conc-name}@r{)}} ++ ++@w{@i{constructor-option} ::=@t{:constructor} |} ++@w{ @r{(}@t{:constructor}@r{)} |} ++@w{ @r{(}@t{:constructor} @i{constructor-name}@r{)} |} ++@w{ @r{(}@t{:constructor} @i{constructor-name} @i{constructor-arglist}@r{)}} ++ ++@w{@i{copier-option} ::=@t{:copier} | @r{(}@t{:copier}@r{)} | @r{(}@t{:copier} @i{copier-name}@r{)}} ++ ++@w{@i{predicate-option} ::=@t{:predicate} | @r{(}@t{:predicate}@r{)} | @r{(}@t{:predicate} @i{predicate-name}@r{)}} ++ ++@w{@i{include-option} ::=@r{(}@t{:include} @i{included-structure-name} @{!@i{slot-description}@}*@r{)}} ++ ++@w{@i{printer-option} ::=!@i{print-object-option} | !@i{print-function-option}} ++ ++@w{@i{print-object-option} ::=@r{(}@t{:print-object} @i{printer-name}@r{)} | @r{(}@t{:print-object}@r{)}} ++ ++@w{@i{print-function-option} ::=@r{(}@t{:print-function} @i{printer-name}@r{)} | @r{(}@t{:print-function}@r{)}} ++ ++@w{@i{type-option} ::=@r{(}@t{:type} @i{type}@r{)}} ++ ++@w{@i{named-option} ::=@t{:named}} ++ ++@w{@i{initial-offset-option} ::=@r{(}@t{:initial-offset} @i{initial-offset}@r{)}} ++ ++@w{@i{slot-description} ::=@i{slot-name} | } ++@w{ @r{(}@i{slot-name} @r{[}@i{slot-initform} [[!@i{slot-option}]]@r{]}@r{)}} ++ ++@w{@i{slot-option} ::=@t{:type} @i{slot-type} | } ++@w{ @t{:read-only} @i{slot-read-only-p}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{conc-name}---a @i{string designator}. ++ ++@i{constructor-arglist}---a @i{boa lambda list}. ++ ++@i{constructor-name}---a @i{symbol}. ++ ++@i{copier-name}---a @i{symbol}. ++ ++@i{included-structure-name}---an already-defined @i{structure name}. ++ ++Note that a @i{derived type} is not permissible, ++even if it would expand into a @i{structure name}. ++ ++@i{initial-offset}---a non-negative @i{integer}. ++ ++@i{predicate-name}---a @i{symbol}. ++ ++@i{printer-name}---a @i{function name} or a @i{lambda expression}. ++ ++@i{slot-name}---a @i{symbol}. ++ ++@i{slot-initform}---a @i{form}. ++ ++@i{slot-read-only-p}---a @i{generalized boolean}. ++ ++@i{structure-name}---a @i{symbol}. ++ ++@i{type}---one of the @i{type specifiers} ++ @b{list}, ++ @b{vector}, ++ or @t{(vector @i{size})}, ++ or some other @i{type specifier} defined ++ by the @i{implementation} to be appropriate. ++ ++@i{documentation}---a @i{string}; not evaluated. ++ ++@subsubheading Description:: ++ ++@b{defstruct} defines a structured @i{type}, named @i{structure-type}, ++with named slots as specified by the @i{slot-options}. ++ ++@b{defstruct} defines @i{readers} for the slots and ++arranges for @b{setf} to work properly on such ++@i{reader} functions. ++Also, unless overridden, it ++ defines a predicate named @t{@i{name}-p}, ++ defines a constructor function named @t{make-@i{constructor-name}}, ++ and defines a copier function named @t{copy-@i{constructor-name}}. ++All names of automatically created functions might automatically ++be declared @b{inline} (at the discretion of the @i{implementation}). ++ ++If @i{documentation} is supplied, it is attached to @i{structure-name} ++as a @i{documentation string} of kind @b{structure}, ++ ++and unless @t{:type} is used, the @i{documentation} is also attached ++to @i{structure-name} as a @i{documentation string} of kind ++@b{type} and as a @i{documentation string} to the @i{class} @i{object} ++for the @i{class} named @i{structure-name}. ++ ++@b{defstruct} defines a constructor function that is used to ++create instances of the structure created by @b{defstruct}. ++The default name is @t{make-@i{structure-name}}. ++A different name can be supplied ++by giving the name as the argument to the @i{constructor} option. ++@b{nil} indicates that no constructor function will be created. ++ ++After a new structure type has been defined, instances of that type ++normally can be created by using the constructor function for the ++type. ++A call to a constructor function is of the following form: ++ ++@w{ (@t{constructor-function-name}}@* ++@w{ @t{slot-keyword-1 form-1}}@* ++@w{ @t{slot-keyword-2 form-2}}@* ++@w{ ...)}@* ++ ++The arguments to the constructor function are all keyword arguments. Each ++slot keyword argument must be ++a keyword whose name corresponds to the name of a structure slot. ++All the @i{keywords} and @i{forms} ++are evaluated. ++If a slot is not initialized in this way, ++it is initialized by evaluating @i{slot-initform} in the slot description ++ ++at the time the constructor function is called. ++ ++If no @i{slot-initform} is supplied, ++the consequences are undefined if an attempt is later made to read the slot's value ++before a value is explicitly assigned. ++ ++Each @i{slot-initform} supplied for a @b{defstruct} component, ++when used by the constructor function for an otherwise unsupplied ++component, is re-evaluated on every call to the ++constructor function. ++ ++The @i{slot-initform} is not evaluated ++ unless it is needed in the creation of a particular structure ++ instance. If it is never needed, there can be no type-mismatch ++ error, even if the @i{type} ++of the slot is specified; no warning ++ should be issued in this case. ++ ++For example, in the following sequence, only the last call is an error. ++ ++@example ++ (defstruct person (name 007 :type string)) ++ (make-person :name "James") ++ (make-person) ++@end example ++ ++It is as if the @i{slot-initforms} were ++used as @i{initialization forms} for the @i{keyword parameters} ++of the constructor function. ++ ++The @i{symbols} which name the slots must not be used by the ++@i{implementation} as the @i{names} for the @i{lambda variables} ++in the constructor function, since one or more of those @i{symbols} ++might have been proclaimed @b{special} or might be defined as ++the name of a @i{constant variable}. ++The slot default init forms are evaluated ++in the @i{lexical environment} in which the @b{defstruct} form itself appears and ++in the @i{dynamic environment} in which the call to the constructor function appears. ++ ++For example, if the form @t{(gensym)} were used as an initialization form, ++either in the constructor-function call or as the default initialization form ++in @b{defstruct}, then every call to the constructor function would call ++@b{gensym} once to generate a new @i{symbol}. ++ ++Each @i{slot-description} in @b{defstruct} can specify zero or more ++@i{slot-options}. ++ ++A @i{slot-option} consists of a pair of a keyword and a value ++(which is not a form to be evaluated, but the value itself). For example: ++ ++@example ++ (defstruct ship ++ (x-position 0.0 :type short-float) ++ (y-position 0.0 :type short-float) ++ (x-velocity 0.0 :type short-float) ++ (y-velocity 0.0 :type short-float) ++ (mass *default-ship-mass* :type short-float :read-only t)) ++@end example ++ ++This specifies that each slot always contains a @i{short float}, ++and that the last slot cannot be altered once a ship is constructed. ++ ++The available slot-options are: ++@table @asis ++ ++@item @t{:type} @i{type} ++This specifies that the contents of the ++slot is always of type @i{type}. This is entirely ++analogous to the declaration of a variable or function; it ++effectively declares the result type of the @i{reader} function. ++It is @i{implementation-dependent} whether the @i{type} is checked ++ when initializing a slot ++ or when assigning to it. ++@i{Type} is not evaluated; it must be a valid @i{type specifier}. ++ ++@item @t{:read-only} @i{x} ++When @i{x} is @i{true}, ++this specifies that this slot cannot be ++altered; it will always contain the value supplied at construction time. ++@b{setf} will not accept the @i{reader} function for this slot. ++If @i{x} is @i{false}, this slot-option has no effect. ++@i{X} is not evaluated. ++ ++When this option is @i{false} or unsupplied, ++it is @i{implementation-dependent} whether the ability to @i{write} ++the slot is implemented by a @i{setf function} or a @i{setf expander}. ++ ++@end table ++ ++The following keyword options are available for use with @b{defstruct}. ++A @b{defstruct} option can be either a keyword or a @i{list} ++of a keyword and arguments for that keyword; ++specifying the keyword by itself is equivalent to specifying a list consisting of ++the keyword and no arguments. ++The syntax for @b{defstruct} options differs from the pair syntax ++used for slot-options. No part of any of these options is evaluated. ++@table @asis ++ ++@item @t{:conc-name} ++This provides for automatic prefixing of names of @i{reader} (or @i{access}) functions. ++The default behavior is to begin the names of all the @i{reader} functions of ++a structure with the name of the structure followed by a hyphen. ++ ++@t{:conc-name} supplies an alternate ++prefix to be used. If a hyphen is to be used as a separator, ++it must be supplied as part of the prefix. ++If @t{:conc-name} is @b{nil} or no argument is supplied, ++then no prefix is used; ++then the names of the @i{reader} functions ++are the same as the slot names. ++If a @i{non-nil} prefix is given, ++the name of the @i{reader} @i{function} for each slot is constructed by ++concatenating that prefix and the name of the slot, and interning the resulting ++@i{symbol} in the @i{package} that is current at the time the ++@b{defstruct} form is expanded. ++ ++Note that no matter what is supplied for @t{:conc-name}, ++slot keywords that match the slot names with no prefix attached are used ++with a constructor function. ++The @i{reader} function name is used ++in conjunction with @b{setf}. Here is an example: ++ ++@example ++ (defstruct (door (:conc-name dr-)) knob-color width material) @result{} DOOR ++ (setq my-door (make-door :knob-color 'red :width 5.0)) ++@result{} #S(DOOR :KNOB-COLOR RED :WIDTH 5.0 :MATERIAL NIL) ++ (dr-width my-door) @result{} 5.0 ++ (setf (dr-width my-door) 43.7) @result{} 43.7 ++ (dr-width my-door) @result{} 43.7 ++@end example ++ ++Whether or not the @t{:conc-name} option is explicitly supplied, ++the following rule governs name conflicts of generated @i{reader} ++(or @i{accessor}) names: ++For any @i{structure} @i{type} S_1 ++having a @i{reader} function named R for a slot named X_1 ++that is inherited by another @i{structure} @i{type} S_2 ++that would have a @i{reader} function with the same name R for a slot named X_2, ++no definition for R is generated by the definition of S_2; ++instead, the definition of R is inherited from the definition of S_1. ++(In such a case, if X_1 and X_2 are different slots, ++the @i{implementation} might signal a style warning.) ++ ++@item @t{:constructor} ++This option takes zero, one, or two arguments. ++If at least one argument is supplied and the first argument is not @b{nil}, then ++that argument is a @i{symbol} which specifies the name of the ++constructor function. If the argument is not supplied (or if the option itself is not ++supplied), the name of the constructor is produced by concatenating the ++string @t{"MAKE-"} and the name of the structure, interning the name ++in whatever @i{package} is current at the time @b{defstruct} ++is expanded. If the argument is provided and is @b{nil}, ++no constructor function is defined. ++ ++If @t{:constructor} is given as ++@t{(:constructor @i{name} @i{arglist})}, ++then instead of making a keyword ++driven constructor function, @b{defstruct} ++defines a ``positional'' constructor function, ++taking arguments whose meaning is determined by the argument's position ++and possibly by keywords. ++@i{Arglist} is used to describe what the arguments to the ++constructor will be. In the simplest case something like ++@t{(:constructor make-foo (a b c))} defines @t{make-foo} to be ++a three-argument ++constructor function whose arguments are used to initialize the ++slots named @t{a}, @t{b}, and @t{c}. ++ ++Because a constructor of this type operates ``By Order of Arguments,'' ++it is sometimes known as a ``boa constructor.'' ++ ++For information on how the @i{arglist} for a ``boa constructor'' is ++processed, see @ref{Boa Lambda Lists}. ++ ++It is permissible to use the ++@t{:constructor} option more than once, so that you can define several ++different constructor functions, each taking different parameters. ++ ++[Reviewer Note by Barmar: What about (:constructor) and (:constructor nil). ++ Should we worry about it?] ++ ++@b{defstruct} creates the default-named keyword constructor function ++only if no explicit @t{:constructor} options are specified, or if the ++@t{:constructor} option is specified without a @i{name} argument. ++ ++@t{(:constructor nil)} is meaningful only when there are no other ++@t{:constructor} options specified. It prevents @b{defstruct} ++from generating any constructors at all. ++ ++Otherwise, @b{defstruct} creates a constructor function corresponding ++to each supplied @t{:constructor} option. It is permissible to specify ++multiple keyword constructor functions as well as multiple ++``boa constructors''. ++ ++@item @t{:copier} ++This option takes one argument, a @i{symbol}, ++which specifies the name of the copier ++function. If the argument is not provided or if the option itself is not ++provided, the name of the copier is produced by concatenating the ++string @t{"COPY-"} and the name of the structure, interning the name ++in whatever @i{package} is current at the time @b{defstruct} ++is expanded. ++If the argument is provided and is @b{nil}, no copier function is defined. ++ ++The automatically defined copier function is a function of ++one @i{argument}, ++ ++which must be of the structure type being defined. ++ ++The copier function creates a @i{fresh} ++structure that has the same @i{type} as its @i{argument}, ++and that has the @i{same} component values as the original ++structure; that is, the component values are not copied recursively. ++ ++If the @b{defstruct} @t{:type} option was not used, ++the following equivalence applies: ++ ++@example ++ (@i{copier-name} x) = (copy-structure (the @i{structure-name} x)) ++@end example ++ ++@item @t{:include} ++This option is used for building a new structure definition as ++an extension of another structure definition. For example: ++ ++@example ++ (defstruct person name age sex) ++@end example ++ ++To make a new structure to represent an astronaut ++that has the ++attributes of name, age, and sex, and @i{functions} ++that operate on @t{person} structures, @t{astronaut} is defined ++with @t{:include} as follows: ++ ++@example ++ (defstruct (astronaut (:include person) ++ (:conc-name astro-)) ++ helmet-size ++ (favorite-beverage 'tang)) ++@end example ++ ++@t{:include} causes the structure being defined ++to have the same slots as the included structure. ++This is done in such a way ++that the @i{reader} functions for the included ++structure also work on the structure being defined. ++In this example, an ++@t{astronaut} therefore has five slots: the three defined in ++@t{person} and the two defined in @t{astronaut} ++itself. The @i{reader} functions defined by the @t{person} structure ++can be applied to instances of the @t{astronaut} structure, and they ++work correctly. ++Moreover, @t{astronaut} has its own @i{reader} functions for ++components defined by the @t{person} structure. ++The following examples illustrate the ++use of @t{astronaut} structures: ++ ++@example ++ (setq x (make-astronaut :name 'buzz ++ :age 45. ++ :sex t ++ :helmet-size 17.5)) ++ (person-name x) @result{} BUZZ ++ (astro-name x) @result{} BUZZ ++ (astro-favorite-beverage x) @result{} TANG ++@end example ++ ++@example ++ (reduce #'+ astros :key #'person-age) ; obtains the total of the ages ++ ; of the possibly empty ++ ; sequence of astros ++@end example ++ ++The difference between the @i{reader} functions @t{person-name} and @t{astro-name} ++is that @t{person-name} can be correctly applied to any @t{person}, ++including an @t{astronaut}, while @t{astro-name} can be correctly ++applied only to an @t{astronaut}. An implementation might ++check for incorrect use of @i{reader} functions. ++ ++At most one @t{:include} can be supplied in a single @b{defstruct}. ++The argument to @t{:include} is required and must be the ++name of some previously defined structure. If the structure being ++defined has no @t{:type} option, then the included structure must ++also have had no @t{:type} option supplied for it. ++If the structure being defined has a @t{:type} option, ++then the included structure must have been declared with a @t{:type} ++option specifying the same representation @i{type}. ++ ++If no @t{:type} option is involved, then ++the structure name of the including structure definition ++becomes the name of a @i{data type}, and therefore ++a valid @i{type specifier} recognizable by @b{typep}; it becomes ++a @i{subtype} of the included structure. ++In the above example, ++@t{astronaut} is a @i{subtype} of @t{person}; hence ++ ++@example ++ (typep (make-astronaut) 'person) @result{} @i{true} ++@end example ++ ++indicating that all operations on persons also ++work on astronauts. ++ ++The structure using @t{:include} can specify default values or ++slot-options for the included slots different from those the included ++structure specifies, by giving the @t{:include} option as: ++ ++@example ++ (:include @i{included-structure-name} @{@i{slot-description}@}*) ++@end example ++ ++Each @i{slot-description} must have a @i{slot-name} ++that is the same ++as that of some slot in the included structure. ++If a @i{slot-description} has no @i{slot-initform}, ++then in the new structure the slot has no initial value. ++Otherwise its initial value form is replaced by ++the @i{slot-initform} in the @i{slot-description}. ++A normally writable slot can be made read-only. ++If a slot is read-only in the included structure, then it ++must also be so in the including structure. ++If a @i{type} is supplied for a slot, it must be ++a @i{subtype} of ++the ++@i{type} specified in the included structure. ++ ++For example, if the ++default age for an astronaut is @t{45}, then ++ ++@example ++ (defstruct (astronaut (:include person (age 45))) ++ helmet-size ++ (favorite-beverage 'tang)) ++@end example ++ ++If @t{:include} is used with the @t{:type} ++option, then the effect is first to skip over as many representation ++elements as needed to represent the included structure, then to ++skip over any additional elements supplied by the @t{:initial-offset} ++option, and then to begin allocation of elements from that point. ++For example: ++ ++@example ++ (defstruct (binop (:type list) :named (:initial-offset 2)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) @result{} BINOP ++ (defstruct (annotated-binop (:type list) ++ (:initial-offset 3) ++ (:include binop)) ++ commutative associative identity) @result{} ANNOTATED-BINOP ++ (make-annotated-binop :operator '* ++ :operand-1 'x ++ :operand-2 5 ++ :commutative t ++ :associative t ++ :identity 1) ++ @result{} (NIL NIL BINOP * X 5 NIL NIL NIL T T 1) ++@end example ++ ++The first two @b{nil} elements stem from the @t{:initial-offset} of @t{2} ++in the definition of @t{binop}. The next four elements contain the ++structure name and three slots for @t{binop}. The next three @b{nil} elements ++stem from the @t{:initial-offset} of @t{3} in the definition of ++@t{annotated-binop}. The last three list elements contain the additional ++slots for an @t{annotated-binop}. ++ ++@item @t{:initial-offset} ++@t{:initial-offset} instructs @b{defstruct} to skip over a certain ++number of slots before it starts allocating the slots described in the ++body. This option's argument is the number of slots @b{defstruct} ++should skip. @t{:initial-offset} can be used only if @t{:type} is also supplied. ++ ++[Reviewer Note by Barmar: What are initial values of the skipped slots?] ++ ++@t{:initial-offset} allows ++slots to be allocated beginning at a representational ++element other than the first. For example, the form ++ ++@example ++ (defstruct (binop (:type list) (:initial-offset 2)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) @result{} BINOP ++@end example ++ ++would result in the following behavior for @t{make-binop}: ++ ++@example ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) ++@result{} (NIL NIL + X 5) ++ (make-binop :operand-2 4 :operator '*) ++@result{} (NIL NIL * NIL 4) ++@end example ++ ++The selector functions ++@t{binop-operator}, @t{binop-operand-1}, ++and @t{binop-operand-2} would be essentially equivalent to @b{third}, ++@b{fourth}, and @b{fifth}, respectively. ++Similarly, the form ++ ++@example ++ (defstruct (binop (:type list) :named (:initial-offset 2)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) @result{} BINOP ++@end example ++ ++would result in the following behavior for @t{make-binop}: ++ ++@example ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) @result{} (NIL NIL BINOP + X 5) ++ (make-binop :operand-2 4 :operator '*) @result{} (NIL NIL BINOP * NIL 4) ++@end example ++ ++The first two @b{nil} elements stem from the @t{:initial-offset} of @t{2} ++in the definition of @t{binop}. The next four elements contain the ++structure name and three slots for @t{binop}. ++ ++@item @t{:named} ++@t{:named} specifies that the structure is named. ++If no @t{:type} is supplied, ++then the structure is always named. ++ ++For example: ++ ++@example ++ (defstruct (binop (:type list)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) @result{} BINOP ++@end example ++ ++This defines a constructor function @t{make-binop} and three ++selector functions, namely @t{binop-operator}, @t{binop-operand-1}, ++and @t{binop-operand-2}. (It does not, however, define a predicate ++@t{binop-p}, for reasons explained below.) ++ ++The effect of @t{make-binop} is simply to construct a list of length three: ++ ++@example ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) @result{} (+ X 5) ++ (make-binop :operand-2 4 :operator '*) @result{} (* NIL 4) ++@end example ++ ++It is just like the function @t{list} except that it takes ++keyword arguments and performs slot defaulting appropriate to the @t{binop} ++conceptual data type. Similarly, the selector functions ++@t{binop-operator}, @t{binop-operand-1}, ++and @t{binop-operand-2} are essentially equivalent to @b{car}, ++@b{cadr}, and @b{caddr}, respectively. They might not be ++completely equivalent because, ++for example, an implementation would be justified in adding error-checking ++code to ensure that the argument to each selector function is a length-3 ++list. ++ ++@t{binop} is a conceptual data type in that it is not made a part of ++the @r{Common Lisp} type system. @b{typep} does not recognize @t{binop} as ++a @i{type specifier}, and @b{type-of} returns @t{list} when ++given a @t{binop} structure. There is no way to distinguish a data ++structure constructed by @t{make-binop} from any other @i{list} that ++happens to have the correct structure. ++ ++There is not any way to recover the structure name @t{binop} from ++a structure created by @t{make-binop}. This can only be done ++if the structure is named. ++A named structure has the property that, given an instance of the ++structure, the structure name (that names the type) can be reliably ++recovered. For structures defined ++with no @t{:type} option, the structure name actually becomes part ++of the @r{Common Lisp} data-type system. @b{type-of}, ++when applied to such a structure, returns the structure name ++as the @i{type} of the @i{object}; ++@b{typep} recognizes ++the structure name as a valid @i{type specifier}. ++ ++For structures defined with a @t{:type} option, @b{type-of} ++returns a @i{type specifier} such as @t{list} or @t{(vector t)}, ++depending on the type supplied to the @t{:type} option. ++The structure name does not become a valid @i{type specifier}. ++However, ++if the @t{:named} option is also supplied, then the first component ++of the structure (as created by a @b{defstruct} constructor function) ++always contains the structure name. This allows the structure name ++to be recovered from an instance of the structure and allows a reasonable ++predicate for the conceptual type to be defined: ++the automatically defined ++@i{name-p} predicate for the structure operates by first ++checking that its argument is of the proper type (@b{list}, ++@t{(vector t)}, ++or whatever) and then checking whether the first component contains ++the appropriate type name. ++ ++Consider the @t{binop} example shown above, modified only to ++include the @t{:named} option: ++ ++@example ++ (defstruct (binop (:type list) :named) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) @result{} BINOP ++@end example ++ ++As before, this defines a constructor function @t{make-binop} and three ++selector functions @t{binop-operator}, @t{binop-operand-1}, ++and @t{binop-operand-2}. It also defines a predicate @t{binop-p}. ++The effect of @t{make-binop} is now to construct a list of length four: ++ ++@example ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) @result{} (BINOP + X 5) ++ (make-binop :operand-2 4 :operator '*) @result{} (BINOP * NIL 4) ++@end example ++ ++The structure has the same layout as before except that the structure name ++@t{binop} is included as the first list element. ++The selector functions ++@t{binop-operator}, @t{binop-operand-1}, ++and @t{binop-operand-2} are essentially equivalent to @b{cadr}, ++@b{caddr}, and @b{cadddr}, respectively. ++The predicate @t{binop-p} is more or less equivalent to this ++definition: ++ ++@example ++ (defun binop-p (x) ++ (and (consp x) (eq (car x) 'binop))) @result{} BINOP-P ++@end example ++ ++The name @t{binop} is still not a valid @i{type specifier} recognizable ++to @b{typep}, but at least there is a way of distinguishing @t{binop} ++structures from other similarly defined structures. ++ ++@item @t{:predicate} ++This option takes one argument, which specifies the name of the type predicate. ++If the argument is not supplied or if the option itself is not ++supplied, the name of the predicate is made by concatenating the ++name of the structure to the string @t{"-P"}, interning the name ++in whatever @i{package} is current at the time @b{defstruct} ++is expanded. ++If the argument is provided and is @b{nil}, no predicate is defined. ++A predicate can be defined only if the structure is named; ++if @t{:type} is supplied and @t{:named} is not supplied, ++then @t{:predicate} must either be unsupplied or have the value @b{nil}. ++ ++@item @t{:print-function}, @t{:print-object} ++The @t{:print-function} and @t{:print-object} ++options ++specify that a @b{print-object} ++@i{method} for @i{structures} of type @i{structure-name} should be generated. ++These options are not synonyms, but do perform a similar service; ++the choice of which option (@t{:print-function} or @t{:print-object}) is used ++affects how the function named @i{printer-name} is called. ++Only one of these options may be used, and ++these options may be used only if @t{:type} is not supplied. ++ ++If the @t{:print-function} option is used, ++then when a structure of type @i{structure-name} is to be printed, ++the designated printer function is called on three @i{arguments}: ++ ++@table @asis ++ ++@item -- ++the structure to be printed ++ (a @i{generalized instance} of @i{structure-name}). ++ ++@item -- ++a @i{stream} to print to. ++ ++@item -- ++an @i{integer} indicating the current depth. ++ The magnitude of this integer may vary between @i{implementations}; ++ however, it can reliably be compared against @b{*print-level*} ++ to determine whether depth abbreviation is appropriate. ++ ++@end table ++ ++Specifying @t{(:print-function @i{printer-name})} ++is approximately equivalent to specifying: ++ ++@example ++ (defmethod print-object ((object @i{structure-name}) stream) ++ (funcall (function @i{printer-name}) object stream <<@i{current-print-depth}>>)) ++@end example ++ ++where the <<@i{current-print-depth}>> represents the printer's belief of ++how deep it is currently printing. It is @i{implementation-dependent} ++whether <<@i{current-print-depth}>> is always 0 and @i{*print-level*}, ++if @i{non-nil}, is re-bound to successively smaller values as printing ++descends recursively, or whether @i{current-print-depth} varies in ++value as printing descends recursively and @i{*print-level*} remains ++constant during the same traversal. ++ ++If the @t{:print-object} option is used, then ++when a structure of type @i{structure-name} is to be printed, ++the designated printer function is called on two arguments: ++ ++@table @asis ++ ++@item -- ++the structure to be printed. ++ ++@item -- ++the stream to print to. ++ ++@end table ++ ++Specifying @t{(:print-object @i{printer-name})} is equivalent to specifying: ++ ++@example ++ (defmethod print-object ((object @i{structure-name}) stream) ++ (funcall (function @i{printer-name}) object stream)) ++@end example ++ ++ If no @t{:type} option is supplied, ++and if either a @t{:print-function} or a @t{:print-object} option is supplied, ++and if no @i{printer-name} is supplied, ++then a @b{print-object} @i{method} @i{specialized} for @i{structure-name} ++is generated that calls a function that implements the default printing behavior for ++structures using @t{#S} notation; see @ref{Printing Structures}. ++ ++If neither a @t{:print-function} ++ nor a @t{:print-object} option ++is supplied, ++then @b{defstruct} does not generate a @b{print-object} @i{method} ++@i{specialized} for @i{structure-name} and some default behavior is inherited ++either from a structure named in an @t{:include} option ++ or from the default behavior for printing structures; ++see the @i{function} @b{print-object} and @ref{Printing Structures}. ++ ++When @b{*print-circle*} is @i{true}, ++a user-defined print function can print @i{objects} ++to the supplied @i{stream} using ++ @b{write}, ++ @b{prin1}, ++ @b{princ}, ++ or @b{format} ++and expect circularities to be detected and printed using the @t{#@i{n}#} syntax. ++This applies to @i{methods} on @b{print-object} in addition to ++@t{:print-function} options. ++If a user-defined print function prints to a @i{stream} other than the one ++that was supplied, then circularity detection starts over for that @i{stream}. ++See the @i{variable} @b{*print-circle*}. ++ ++@item @t{:type} ++@t{:type} explicitly specifies the representation to be used for ++the structure. Its argument must be one of these @i{types}: ++ ++@table @asis ++ ++@item @b{vector} ++This produces the same result as specifying @t{(vector t)}. ++The structure is represented ++as a general @i{vector}, storing components as vector elements. ++The first component is vector ++element 1 if the structure is @t{:named}, and element 0 otherwise. ++ ++[Reviewer Note by Barmar: Do any implementations create non-simple vectors?] ++ ++@item @t{(vector @i{element-type})} ++The structure is represented as a (possibly specialized) @i{vector}, storing ++components as vector elements. Every component must be of a @i{type} ++that can be stored in a @i{vector} of the @i{type} specified. ++The first component is vector ++element 1 if the structure is @t{:named}, and element 0 otherwise. ++The structure can be @t{:named} only if the @i{type} @b{symbol} ++is a @i{subtype} of the supplied @i{element-type}. ++ ++@item @b{list} ++The structure is represented as a @i{list}. ++The first component is the @i{cadr} if the structure is @t{:named}, ++and the @i{car} if it is not @t{:named}. ++@end table ++ ++Specifying this option has the effect of forcing ++a specific representation and of forcing the components to be ++stored in the order specified in @b{defstruct} ++in corresponding successive elements of the specified representation. ++It also prevents the structure name from becoming a valid ++@i{type specifier} recognizable by @b{typep}. ++ ++For example: ++ ++@example ++ (defstruct (quux (:type list) :named) x y) ++@end example ++ ++should make a constructor that builds a @i{list} exactly like the one ++that @b{list} produces, ++with @t{quux} as its @i{car}. ++ ++If this type is defined: ++ ++@example ++ (deftype quux () '(satisfies quux-p)) ++@end example ++ ++then this form ++ ++@example ++ (typep (make-quux) 'quux) ++@end example ++ ++should return precisely what this one does ++ ++@example ++ (typep (list 'quux nil nil) 'quux) ++@end example ++ ++If @t{:type} is not supplied, ++the structure is represented as an @i{object} of @i{type} @b{structure-object}. ++ ++@b{defstruct} without a @t{:type} option defines a @i{class} with ++the structure name as its name. The @i{metaclass} of structure ++@i{instances} is @b{structure-class}. ++ ++@end table ++ ++The consequences of redefining a @b{defstruct} structure are undefined. ++ ++In the case where no @b{defstruct} options have been supplied, ++the following functions are automatically defined to operate ++on instances of the new structure: ++ ++@table @asis ++ ++@item Predicate ++A predicate with the name @t{@i{structure-name}-p} is defined to ++test membership in the structure type. The predicate ++@t{(@i{structure-name}-p @i{object})} is @i{true} if an @i{object} ++is of this @i{type}; otherwise it is @i{false}. @b{typep} can also ++be used with the name of the new @i{type} to test whether an ++@i{object} ++belongs to the @i{type}. ++Such a function call has the form ++@t{(typep @i{object} '@i{structure-name})}. ++ ++@item Component reader functions ++@i{Reader} functions are defined to @i{read} the components of the ++structure. For each slot name, there is a corresponding ++@i{reader} function with the name @t{@i{structure-name}-@i{slot-name}}. ++This function @i{reads} the contents of that slot. ++Each @i{reader} function takes one argument, which is ++an instance of the structure type. ++@b{setf} can be used with any of these @i{reader} functions ++to alter the slot contents. ++ ++@item Constructor function ++A constructor function with the name @t{make-@i{structure-name}} ++is defined. This function creates and returns new ++instances of the structure type. ++ ++@item Copier function ++A copier function with the name @t{copy-@i{structure-name}} is defined. ++The copier function takes an object of the structure type and creates a ++new object of the same type that is a copy of the first. The copier ++function creates a new structure with the same component entries ++as the original. Corresponding components of the two structure instances ++are @b{eql}. ++@end table ++ ++If a @b{defstruct} @i{form} appears as a @i{top level form}, ++the @i{compiler} must make the @i{structure} @i{type} name recognized ++as a valid @i{type} name in subsequent declarations (as for @b{deftype}) ++and make the structure slot readers known to @b{setf}. In addition, the ++@i{compiler} must save enough information about the @i{structure} @i{type} ++so that further @b{defstruct} definitions can use @t{:include} in a subsequent ++@b{deftype} in the same @i{file} to refer to the @i{structure} @i{type} name. ++The functions which @b{defstruct} generates are not defined ++in the compile time environment, although the @i{compiler} may save enough ++information about the functions to code subsequent calls inline. ++The @t{#S} @i{reader macro} might or might not recognize the newly defined ++@i{structure} @i{type} name at compile time. ++ ++@subsubheading Examples:: ++An example of a structure definition follows: ++ ++@example ++ (defstruct ship ++ x-position ++ y-position ++ x-velocity ++ y-velocity ++ mass) ++@end example ++ ++This declares that every @t{ship} is an @i{object} ++with five named components. ++The evaluation of this form does the following: ++ ++@table @asis ++ ++@item 1. ++It defines @t{ship-x-position} to be a function ++of one argument, a ship, that returns the @t{x-position} ++of the ship; @t{ship-y-position} ++and the other components are given similar function definitions. ++These functions are called the @i{access} functions, as they ++are used to @i{access} elements of the structure. ++ ++@item 2. ++@t{ship} becomes the name of a @i{type} of which instances ++of ships are elements. @t{ship} becomes acceptable to @b{typep}, ++for example; @t{(typep x 'ship)} is @i{true} if @t{x} is a ship ++and false if @t{x} is any @i{object} other than a ship. ++ ++@item 3. ++A function named @t{ship-p} of ++one argument is defined; it is a predicate ++that is @i{true} if its argument is a ship and is @i{false} otherwise. ++ ++@item 4. ++A function called @t{make-ship} is defined that, when invoked, ++creates a data structure with five components, suitable for use with ++the @i{access} functions. Thus executing ++ ++@example ++ (setq ship2 (make-ship)) ++@end example ++ ++sets @t{ship2} to a newly created @t{ship} @i{object}. ++One can supply the initial values of any desired component in the call ++to @t{make-ship} by using keyword arguments in this way: ++ ++@example ++ (setq ship2 (make-ship :mass *default-ship-mass* ++ :x-position 0 ++ :y-position 0)) ++@end example ++ ++This constructs a new ship and initializes three of its components. ++This function is called the ``constructor function'' ++because it constructs a new structure. ++ ++@item 5. ++A function called @t{copy-ship} of one argument ++is defined that, when given a @t{ship} @i{object}, ++creates a new @t{ship} @i{object} that is a copy of the given one. ++This function is called the ``copier function.'' ++@end table ++ ++@b{setf} can be used to alter the components of a @t{ship}: ++ ++@example ++ (setf (ship-x-position ship2) 100) ++@end example ++ ++This alters the @t{x-position} of @t{ship2} to be @t{100}. ++This works because @b{defstruct} behaves as if ++it generates an appropriate @b{defsetf} ++for each @i{access} function. ++ ++@example ++;;; ++;;; Example 1 ++;;; define town structure type ++;;; area, watertowers, firetrucks, population, elevation are its components ++;;; ++ (defstruct town ++ area ++ watertowers ++ (firetrucks 1 :type fixnum) ;an initialized slot ++ population ++ (elevation 5128 :read-only t)) ;a slot that can't be changed ++@result{} TOWN ++;create a town instance ++ (setq town1 (make-town :area 0 :watertowers 0)) @result{} #S(TOWN...) ++;town's predicate recognizes the new instance ++ (town-p town1) @result{} @i{true} ++;new town's area is as specified by make-town ++ (town-area town1) @result{} 0 ++;new town's elevation has initial value ++ (town-elevation town1) @result{} 5128 ++;setf recognizes reader function ++ (setf (town-population town1) 99) @result{} 99 ++ (town-population town1) @result{} 99 ++;copier function makes a copy of town1 ++ (setq town2 (copy-town town1)) @result{} #S(TOWN...) ++ (= (town-population town1) (town-population town2)) @result{} @i{true} ++;since elevation is a read-only slot, its value can be set only ++;when the structure is created ++ (setq town3 (make-town :area 0 :watertowers 3 :elevation 1200)) ++@result{} #S(TOWN...) ++;;; ++;;; Example 2 ++;;; define clown structure type ++;;; this structure uses a nonstandard prefix ++;;; ++ (defstruct (clown (:conc-name bozo-)) ++ (nose-color 'red) ++ frizzy-hair-p polkadots) @result{} CLOWN ++ (setq funny-clown (make-clown)) @result{} #S(CLOWN) ++;use non-default reader name ++ (bozo-nose-color funny-clown) @result{} RED ++ (defstruct (klown (:constructor make-up-klown) ;similar def using other ++ (:copier clone-klown) ;customizing keywords ++ (:predicate is-a-bozo-p)) ++ nose-color frizzy-hair-p polkadots) @result{} klown ++;custom constructor now exists ++ (fboundp 'make-up-klown) @result{} @i{true} ++;;; ++;;; Example 3 ++;;; define a vehicle structure type ++;;; then define a truck structure type that includes ++;;; the vehicle structure ++;;; ++ (defstruct vehicle name year (diesel t :read-only t)) @result{} VEHICLE ++ (defstruct (truck (:include vehicle (year 79))) ++ load-limit ++ (axles 6)) @result{} TRUCK ++ (setq x (make-truck :name 'mac :diesel t :load-limit 17)) ++@result{} #S(TRUCK...) ++;vehicle readers work on trucks ++ (vehicle-name x) ++@result{} MAC ++;default taken from :include clause ++ (vehicle-year x) ++@result{} 79 ++ (defstruct (pickup (:include truck)) ;pickup type includes truck ++ camper long-bed four-wheel-drive) @result{} PICKUP ++ (setq x (make-pickup :name 'king :long-bed t)) @result{} #S(PICKUP...) ++;:include default inherited ++ (pickup-year x) @result{} 79 ++;;; ++;;; Example 4 ++;;; use of BOA constructors ++;;; ++ (defstruct (dfs-boa ;BOA constructors ++ (:constructor make-dfs-boa (a b c)) ++ (:constructor create-dfs-boa ++ (a &optional b (c 'cc) &rest d &aux e (f 'ff)))) ++ a b c d e f) @result{} DFS-BOA ++;a, b, and c set by position, and the rest are uninitialized ++ (setq x (make-dfs-boa 1 2 3)) @result{} #(DFS-BOA...) ++ (dfs-boa-a x) @result{} 1 ++;a and b set, c and f defaulted ++ (setq x (create-dfs-boa 1 2)) @result{} #(DFS-BOA...) ++ (dfs-boa-b x) @result{} 2 ++ (eq (dfs-boa-c x) 'cc) @result{} @i{true} ++;a, b, and c set, and the rest are collected into d ++ (setq x (create-dfs-boa 1 2 3 4 5 6)) @result{} #(DFS-BOA...) ++ (dfs-boa-d x) @result{} (4 5 6) ++@end example ++ ++@subsubheading Exceptional Situations:: ++ ++If any two slot names (whether present directly or inherited by the @t{:include} option) ++are the @i{same} under @b{string=}, ++@b{defstruct} should signal an error of @i{type} @b{program-error}. ++ ++The consequences are undefined if the @i{included-structure-name} ++does not name a @i{structure type}. ++ ++@subsubheading See Also:: ++ ++@ref{documentation} ++, ++@ref{print-object} ++, ++@ref{setf} ++, ++@ref{subtypep} ++, ++@ref{type-of} ++, ++@ref{typep} ++, ++@ref{Compilation} ++ ++@subsubheading Notes:: ++ ++The @i{printer-name} should observe the values of ++such printer-control variables as @b{*print-escape*}. ++ ++The restriction against issuing a warning for type mismatches between ++a @i{slot-initform} and the corresponding slot's @t{:type} option is ++necessary because a @i{slot-initform} must be specified in order to ++specify slot options; in some cases, no suitable default may exist. ++ ++The mechanism by which @b{defstruct} arranges for slot accessors to ++be usable with @b{setf} is @i{implementation-dependent}; ++for example, it may use @i{setf functions}, @i{setf expanders}, or ++some other @i{implementation-dependent} mechanism known to that ++@i{implementation}'s @i{code} for @b{setf}. ++ ++@node copy-structure, , defstruct, Structures Dictionary ++@subsection copy-structure [Function] ++ ++@code{copy-structure} @i{structure} @result{} @i{copy} ++ ++@subsubheading Arguments and Values:: ++ ++@i{structure}---a @i{structure}. ++ ++@i{copy}---a copy of the @i{structure}. ++ ++@subsubheading Description:: ++ ++Returns a @i{copy}_6 of the @i{structure}. ++ ++Only the @i{structure} itself is copied; not the values of the slots. ++ ++@subsubheading See Also:: ++ ++the @t{:copier} option to ++@ref{defstruct} ++ ++@subsubheading Notes:: ++ ++The @i{copy} is the @i{same} as the given @i{structure} ++under @b{equalp}, but not under @b{equal}. ++ ++@c end of including dict-structures ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-9.texi +@@ -0,0 +1,4287 @@ ++ ++ ++@node Conditions, Symbols, Structures, Top ++@chapter Conditions ++ ++@menu ++* Condition System Concepts:: ++* Conditions Dictionary:: ++@end menu ++ ++@node Condition System Concepts, Conditions Dictionary, Conditions, Conditions ++@section Condition System Concepts ++ ++@c including concept-conditions ++ ++Common Lisp constructs are described not only in terms of their ++behavior in situations during which they are intended to be used (see ++the ``Description'' part of each @i{operator} specification), ++but in all other situations (see the ``Exceptional Situations'' ++part of each @i{operator} specification). ++ ++A situation is the evaluation of an expression in a specific context. ++A @i{condition} is an @i{object} that ++represents a specific situation that has been detected. ++@i{Conditions} are @i{generalized instances} of the @i{class} @b{condition}. ++A hierarchy of @i{condition} classes is defined in @r{Common Lisp}. ++A @i{condition} has @i{slots} that contain data ++relevant to the situation that the @i{condition} represents. ++ ++An error is a situation in which normal program execution cannot ++continue correctly without some form of intervention (either ++interactively by the user or under program control). Not all errors ++are detected. When an error goes undetected, the effects can be ++@i{implementation-dependent}, @i{implementation-defined}, unspecified, or ++undefined. See @ref{Definitions}. All detected errors can ++be represented by @i{conditions}, but not all ++@i{conditions} represent errors. ++ ++Signaling is the process by which a @i{condition} can alter ++the flow of control in a program by raising the ++@i{condition} which can then be @i{handled}. The functions ++@b{error}, @b{cerror}, @b{signal}, and ++@b{warn} are used to signal @i{conditions}. ++ ++The process of signaling involves the selection and invocation of a ++@i{handler} from a set of @i{active} @i{handlers}. ++A @i{handler} is a @i{function} of one argument (the ++@i{condition}) that is invoked to handle a @i{condition}. ++Each @i{handler} is associated with a @i{condition} @i{type}, ++and a @i{handler} will be invoked only on a @i{condition} of the ++@i{handler}'s associated @i{type}. ++ ++@i{Active} @i{handlers} are @i{established} dynamically ++(see @b{handler-bind} or @b{handler-case}). ++@i{Handlers} are invoked in a @i{dynamic environment} ++equivalent to that of the signaler, ++except that the set of @i{active} @i{handlers} ++is bound in such a way as to include only those that were @i{active} ++at the time the @i{handler} being invoked was @i{established}. ++Signaling a @i{condition} has no side-effect on the @i{condition}, ++and there is no dynamic state contained in a @i{condition}. ++ ++If a @i{handler} is invoked, it can address the @i{situation} ++in one of three ways: ++ ++@table @asis ++ ++@item @b{Decline} ++It can decline to @i{handle} the @i{condition}. It does this by ++simply returning rather than transferring control. ++When this happens, any values returned by the handler are ++ignored and the next most recently established handler is invoked. ++If there is no such handler and the signaling function is @b{error} ++or @b{cerror}, the debugger is entered in the ++@i{dynamic environment} of the signaler. If there is no such ++handler and the signaling function is either @b{signal} or ++@b{warn}, the signaling function simply returns~@b{nil}. ++ ++@item @b{Handle} ++It can @i{handle} the @i{condition} by performing a non-local ++transfer of control. This can be done either primitively by using ++@b{go}, @b{return}, @b{throw} or more ++abstractly by using a function such as @b{abort} or ++@b{invoke-restart}. ++ ++@item @b{Defer} ++It can put off a decision about whether to @i{handle} or @i{decline}, ++by any of a number of actions, but most commonly by ++ signaling another condition, ++ resignaling the same condition, ++ or forcing entry into the debugger. ++ ++@end table ++ ++@menu ++* Condition Types:: ++* Creating Conditions:: ++* Printing Conditions:: ++* Signaling and Handling Conditions:: ++* Assertions:: ++* Notes about the Condition System`s Background:: ++@end menu ++ ++@node Condition Types, Creating Conditions, Condition System Concepts, Condition System Concepts ++@subsection Condition Types ++ ++Figure 9--1 lists the @i{standardized} @i{condition} @i{types}. ++Additional @i{condition} @i{types} can be defined by using @b{define-condition}. ++ ++@format ++@group ++@noindent ++@w{ arithmetic-error floating-point-overflow simple-type-error } ++@w{ cell-error floating-point-underflow simple-warning } ++@w{ condition package-error storage-condition } ++@w{ control-error parse-error stream-error } ++@w{ division-by-zero print-not-readable style-warning } ++@w{ end-of-file program-error type-error } ++@w{ error reader-error unbound-slot } ++@w{ file-error serious-condition unbound-variable } ++@w{ floating-point-inexact simple-condition undefined-function } ++@w{ floating-point-invalid-operation simple-error warning } ++ ++@noindent ++@w{ Figure 9--1: Standardized Condition Types } ++ ++@end group ++@end format ++ ++All @i{condition} types are @i{subtypes} of @i{type} @b{condition}. That is, ++ ++@example ++ (typep @i{c} 'condition) @result{} @i{true} ++@end example ++ ++if and only if @i{c} is a @i{condition}. ++ ++@i{Implementations} must define all specified @i{subtype} relationships. ++Except where noted, all @i{subtype} relationships indicated in ++this document are not mutually exclusive. ++A @i{condition} inherits the structure of its @i{supertypes}. ++ ++The metaclass of the @i{class} @b{condition} is not specified. ++@i{Names} of @i{condition} @i{types} may be used to specify ++@i{supertype} relationships in @b{define-condition}, ++but the consequences are not specified if an attempt is made to use ++a @i{condition} @i{type} as a @i{superclass} in a @b{defclass} @i{form}. ++ ++Figure 9--2 shows @i{operators} that ++define @i{condition} @i{types} and creating @i{conditions}. ++ ++@format ++@group ++@noindent ++@w{ define-condition make-condition } ++ ++@noindent ++@w{ Figure 9--2: Operators that define and create conditions.} ++ ++@end group ++@end format ++ ++Figure 9--3 shows @i{operators} that @i{read} ++the @i{value} of @i{condition} @i{slots}. ++ ++@format ++@group ++@noindent ++@w{ arithmetic-error-operands simple-condition-format-arguments } ++@w{ arithmetic-error-operation simple-condition-format-control } ++@w{ cell-error-name stream-error-stream } ++@w{ file-error-pathname type-error-datum } ++@w{ package-error-package type-error-expected-type } ++@w{ print-not-readable-object unbound-slot-instance } ++ ++@noindent ++@w{ Figure 9--3: Operators that read condition slots. } ++ ++@end group ++@end format ++ ++@menu ++* Serious Conditions:: ++@end menu ++ ++@node Serious Conditions, , Condition Types, Condition Types ++@subsubsection Serious Conditions ++ ++A @i{serious condition} is a @i{condition} serious ++enough to require interactive intervention if not handled. ++@i{Serious conditions} are typically signaled with @b{error} or @b{cerror}; ++non-serious @i{conditions} are typically signaled with @b{signal} or @b{warn}. ++ ++@node Creating Conditions, Printing Conditions, Condition Types, Condition System Concepts ++@subsection Creating Conditions ++ ++The function @b{make-condition} can be used to construct ++a @i{condition} @i{object} explicitly. Functions such as @b{error}, ++@b{cerror}, @b{signal}, and @b{warn} operate on ++@i{conditions} and might create @i{condition} @i{objects} ++implicitly. Macros such as @b{ccase}, @b{ctypecase}, ++@b{ecase}, @b{etypecase}, @b{check-type}, and ++@b{assert} might also implicitly create (and @i{signal}) ++@i{conditions}. ++ ++@menu ++* Condition Designators:: ++@end menu ++ ++@node Condition Designators, , Creating Conditions, Creating Conditions ++@subsubsection Condition Designators ++ ++A number of the functions in the condition system take arguments which ++are identified as @i{condition designators} ++@IGindex condition designator ++. ++By convention, those arguments are notated as ++ ++ @i{datum} @r{&rest} @i{arguments} ++ ++Taken together, the @i{datum} and the @i{arguments} are ++``@i{designators} for a @i{condition} of default type @i{default-type}.'' ++How the denoted @i{condition} is computed depends on the type of the @i{datum}: ++ ++@table @asis ++ ++@item @t{*} If the @i{datum} is a @i{symbol} ++ naming a @i{condition} @i{type} ... ++The denoted @i{condition} is the result of ++ ++@example ++ (apply #'make-condition @i{datum} @i{arguments}) ++@end example ++ ++@item @t{*} If the @i{datum} is a @i{format control} ... ++ ++The denoted @i{condition} is the result of ++ ++@example ++ (make-condition @i{defaulted-type} ++ :format-control @i{datum} ++ :format-arguments @i{arguments}) ++@end example ++ ++where the @i{defaulted-type} is a @i{subtype} of @i{default-type}. ++ ++@item @t{*} If the @i{datum} is a @i{condition} ... ++The denoted @i{condition} is the @i{datum} itself. ++In this case, unless otherwise specified by the description of the ++@i{operator} in question, the @i{arguments} must be @i{null}; ++that is, the consequences are undefined if any @i{arguments} were supplied. ++ ++@end table ++ ++Note that the @i{default-type} gets used only in the case where ++the @i{datum} @i{string} is supplied. In the other situations, ++the resulting condition is not necessarily of @i{type} @i{default-type}. ++ ++Here are some illustrations of how different @i{condition designators} ++can denote equivalent @i{condition} @i{objects}: ++ ++@example ++(let ((c (make-condition 'arithmetic-error :operator '/ :operands '(7 0)))) ++ (error c)) ++@equiv{} (error 'arithmetic-error :operator '/ :operands '(7 0)) ++ ++(error "Bad luck.") ++@equiv{} (error 'simple-error :format-control "Bad luck." :format-arguments '()) ++@end example ++ ++@node Printing Conditions, Signaling and Handling Conditions, Creating Conditions, Condition System Concepts ++@subsection Printing Conditions ++ ++If the @t{:report} argument to @b{define-condition} is used, ++a print function is defined that is called whenever ++the defined @i{condition} is printed while the @i{value} of @b{*print-escape*} is @i{false}. ++This function is called the @i{condition reporter} ++@IGindex condition reporter ++; ++the text which it outputs is called a @i{report message} ++@IGindex report message ++. ++ ++When a @i{condition} is printed and @b{*print-escape*} ++is @i{false}, the @i{condition reporter} for the @i{condition} is invoked. ++@i{Conditions} are printed automatically by functions such as ++@b{invoke-debugger}, @b{break}, and @b{warn}. ++ ++When @b{*print-escape*} is @i{true}, the @i{object} should print in an ++abbreviated fashion according to the style of the implementation ++(@i{e.g.}, by @b{print-unreadable-object}). It is not required that a ++@i{condition} can be recreated by reading its printed representation. ++ ++No @i{function} is provided for directly @i{accessing} ++or invoking @i{condition reporters}. ++ ++@menu ++* Recommended Style in Condition Reporting:: ++* Capitalization and Punctuation in Condition Reports:: ++* Leading and Trailing Newlines in Condition Reports:: ++* Embedded Newlines in Condition Reports:: ++* Note about Tabs in Condition Reports:: ++* Mentioning Containing Function in Condition Reports:: ++@end menu ++ ++@node Recommended Style in Condition Reporting, Capitalization and Punctuation in Condition Reports, Printing Conditions, Printing Conditions ++@subsubsection Recommended Style in Condition Reporting ++ ++In order to ensure a properly aesthetic result when presenting ++@i{report messages} to the user, certain stylistic conventions are ++recommended. ++ ++There are stylistic recommendations for the content of the messages ++output by @i{condition reporters}, but there are no formal requirements ++on those @i{programs}. ++If a @i{program} violates the recommendations for some message, the ++display of that message might be less aesthetic than if the guideline ++had been observed, but the @i{program} is still considered a ++@i{conforming program}. ++ ++The requirements on a @i{program} or @i{implementation} which ++invokes a @i{condition reporter} are somewhat stronger. A @i{conforming ++program} must be permitted to assume that if these style guidelines are ++followed, proper aesthetics will be maintained. Where appropriate, any ++specific requirements on such routines are explicitly mentioned below. ++ ++@node Capitalization and Punctuation in Condition Reports, Leading and Trailing Newlines in Condition Reports, Recommended Style in Condition Reporting, Printing Conditions ++@subsubsection Capitalization and Punctuation in Condition Reports ++ ++It is recommended that a @i{report message} be a complete sentences, in the ++proper case and correctly punctuated. In English, for example, this ++means the first letter should be uppercase, and there should be a ++trailing period. ++ ++@example ++ (error "This is a message") ; Not recommended ++ (error "this is a message.") ; Not recommended ++ ++ (error "This is a message.") ; Recommended instead ++@end example ++ ++@node Leading and Trailing Newlines in Condition Reports, Embedded Newlines in Condition Reports, Capitalization and Punctuation in Condition Reports, Printing Conditions ++@subsubsection Leading and Trailing Newlines in Condition Reports ++ ++It is recommended that a @i{report message} not begin with any ++introductory text, such as ``@t{Error: }'' or ``@t{Warning: }'' ++or even just @i{freshline} or @i{newline}. ++Such text is added, if appropriate to the context, ++by the routine invoking the @i{condition reporter}. ++ ++It is recommended that a @i{report message} not be followed ++by a trailing @i{freshline} or @i{newline}. ++Such text is added, if appropriate to the context, ++by the routine invoking the @i{condition reporter}. ++ ++@example ++ (error "This is a message.~ ++ (error "~&This is a message.") ; Not recommended ++ (error "~&This is a message.~ ++ ++ (error "This is a message.") ; Recommended instead ++@end example ++ ++@node Embedded Newlines in Condition Reports, Note about Tabs in Condition Reports, Leading and Trailing Newlines in Condition Reports, Printing Conditions ++@subsubsection Embedded Newlines in Condition Reports ++ ++Especially if it is long, it is permissible and appropriate for ++a @i{report message} to contain one or more embedded @i{newlines}. ++ ++If the calling routine conventionally inserts some additional prefix ++(such as ``@t{Error: }'' or ``@t{;; Error: }'') on the first line of ++the message, it must also assure that an appropriate prefix will be ++added to each subsequent line of the output, so that the left edge of ++the message output by the @i{condition reporter} will still be properly ++aligned. ++ ++@example ++ (defun test () ++ (error "This is an error message.~%It has two lines.")) ++ ++ ;; Implementation A ++ (test) ++ This is an error message. ++ It has two lines. ++ ++ ;; Implementation B ++ (test) ++ ;; Error: This is an error message. ++ ;; It has two lines. ++ ++ ;; Implementation C ++ (test) ++ >> Error: This is an error message. ++ It has two lines. ++@end example ++ ++@node Note about Tabs in Condition Reports, Mentioning Containing Function in Condition Reports, Embedded Newlines in Condition Reports, Printing Conditions ++@subsubsection Note about Tabs in Condition Reports ++ ++Because the indentation of a @i{report message} might be shifted to the right or ++left by an arbitrary amount, special care should be taken with the ++semi-standard @i{character} <@i{Tab}> ++(in those @i{implementations} that support such a @i{character}). ++Unless the @i{implementation} specifically defines its behavior ++in this context, its use should be avoided. ++ ++@node Mentioning Containing Function in Condition Reports, , Note about Tabs in Condition Reports, Printing Conditions ++@subsubsection Mentioning Containing Function in Condition Reports ++ ++The name of the containing function should generally not be mentioned in ++@i{report messages}. It is assumed that the @i{debugger} will make this ++information accessible in situations where it is necessary and appropriate. ++ ++@node Signaling and Handling Conditions, Assertions, Printing Conditions, Condition System Concepts ++@subsection Signaling and Handling Conditions ++ ++The operation of the condition system depends on the ordering of ++active @i{applicable handlers} from most recent to least recent. ++ ++Each @i{handler} is associated with a @i{type specifier} ++that must designate a @i{subtype} of @i{type} @b{condition}. A @i{handler} ++is said to be @i{applicable} to a @i{condition} if that ++@i{condition} is of the @i{type} designated by the associated ++@i{type specifier}. ++ ++@i{Active} @i{handlers} are @i{established} by using ++@b{handler-bind} (or an abstraction based on @b{handler-bind}, ++such as @b{handler-case} or @b{ignore-errors}). ++ ++@i{Active} @i{handlers} can be @i{established} within the ++dynamic scope of other @i{active} @i{handlers}. ++At any point during program execution, there is a set of @i{active} @i{handlers}. ++When a @i{condition} is signaled, the @i{most recent} active @i{applicable handler} ++for that @i{condition} is selected from this set. ++Given a @i{condition}, the order of recentness of ++active @i{applicable handlers} is defined by the following two rules: ++ ++@table @asis ++ ++@item 1. ++Each handler in a set of active handlers H_1 is ++more recent than every handler in a set H_2 if the ++handlers in H_2 were active when the handlers in H_1 were ++established. ++ ++@item 2. ++Let h_1 and h_2 be two applicable active ++handlers established by the same @i{form}. Then h_1 is ++more recent than h_2 if h_1 was defined to the left of ++h_2 in the @i{form} that established them. ++ ++@end table ++ ++Once a handler in a handler binding @i{form} (such as ++@b{handler-bind} or @b{handler-case}) has been selected, all ++handlers in that @i{form} become inactive for ++the remainder of the signaling process. ++While the selected @i{handler} runs, no other @i{handler} established ++by that @i{form} is active. That is, if the @i{handler} declines, ++no other handler established by that @i{form} will be considered for possible invocation. ++ ++Figure 9--4 shows @i{operators} relating to ++the @i{handling} of @i{conditions}. ++ ++@format ++@group ++@noindent ++@w{ handler-bind handler-case ignore-errors } ++ ++@noindent ++@w{ Figure 9--4: Operators relating to handling conditions.} ++ ++@end group ++@end format ++ ++@menu ++* Signaling:: ++* Resignaling a Condition:: ++* Restarts:: ++* Interactive Use of Restarts:: ++* Interfaces to Restarts:: ++* Restart Tests:: ++* Associating a Restart with a Condition:: ++@end menu ++ ++@node Signaling, Resignaling a Condition, Signaling and Handling Conditions, Signaling and Handling Conditions ++@subsubsection Signaling ++ ++When a @i{condition} is signaled, the most recent ++applicable @i{active} @i{handler} is invoked. ++Sometimes a handler will decline by simply returning ++without a transfer of control. ++In such cases, the next most recent applicable active handler is ++invoked. ++ ++If there are no applicable handlers for a @i{condition} that ++has been signaled, or if all applicable handlers decline, the ++@i{condition} is unhandled. ++ ++The functions @b{cerror} and @b{error} invoke the ++interactive @i{condition} handler (the debugger) rather than ++return if the @i{condition} being signaled, regardless of ++its @i{type}, is unhandled. In contrast, @b{signal} ++returns @b{nil} if the @i{condition} being signaled, ++regardless of its @i{type}, is unhandled. ++ ++The @i{variable} @b{*break-on-signals*} can be used to cause the ++debugger to be entered before the signaling process begins. ++ ++Figure 9--5 shows @i{defined names} relating to ++the @i{signaling} of @i{conditions}. ++ ++@format ++@group ++@noindent ++@w{ *break-on-signals* error warn } ++@w{ cerror signal } ++ ++@noindent ++@w{ Figure 9--5: Defined names relating to signaling conditions.} ++ ++@end group ++@end format ++ ++@node Resignaling a Condition, Restarts, Signaling, Signaling and Handling Conditions ++@subsubsection Resignaling a Condition ++ ++During the @i{dynamic extent} of the @i{signaling} process for ++a particular @i{condition} @i{object}, ++@b{signaling} the same @i{condition} @i{object} again ++is permitted if and only if the @i{situation} represented in both ++cases are the same. ++ ++For example, a @i{handler} might legitimately @i{signal} ++the @i{condition} @i{object} that is its @i{argument} ++in order to allow outer @i{handlers} first opportunity to @i{handle} ++the condition. (Such a @i{handlers} is sometimes called a ``default handler.'') ++This action is permitted because the @i{situation} which the second ++@i{signaling} process is addressing is really the same @i{situation}. ++ ++On the other hand, in an @i{implementation} that implemented asynchronous ++keyboard events by interrupting the user process with a call to @b{signal}, ++it would not be permissible for two distinct asynchronous keyboard events ++to @i{signal} @i{identical} @i{condition} @i{objects} ++at the same time for different ++situations. ++ ++@node Restarts, Interactive Use of Restarts, Resignaling a Condition, Signaling and Handling Conditions ++@subsubsection Restarts ++ ++The interactive condition handler returns only through ++non-local transfer of control to specially defined @i{restarts} ++that can be set up either by the system or by user code. Transferring ++control to a restart is called ``invoking'' the restart. Like ++handlers, active @i{restarts} are @i{established} ++dynamically, and ++only active @i{restarts} ++can be invoked. An active ++@i{restart} can be invoked by the user from ++the debugger or by a program by using @b{invoke-restart}. ++ ++A @i{restart} contains a ++@i{function} to be @i{called} when the @i{restart} is ++invoked, an optional name that can be used to find or invoke the ++@i{restart}, and ++an optional set of interaction information for the debugger to use to ++enable the user to manually invoke a @i{restart}. ++ ++The name of a @i{restart} is ++used by @b{invoke-restart}. @i{Restarts} that can be invoked ++only within the debugger do not need names. ++ ++@i{Restarts} can be established by using @b{restart-bind}, ++@b{restart-case}, and @b{with-simple-restart}. ++A @i{restart} function can itself invoke any other @i{restart} ++that was active at the time of establishment of the @i{restart} ++of which the @i{function} is part. ++ ++The @i{restarts} @i{established} by ++ a @b{restart-bind} @i{form}, ++ a @b{restart-case} @i{form}, ++ or a @b{with-simple-restart} @i{form} ++have @i{dynamic extent} ++which extends for the duration of that @i{form}'s execution. ++ ++@i{Restarts} of the same name can be ordered from least recent to ++most recent according to the following two rules: ++ ++@table @asis ++ ++@item 1. ++Each @i{restart} in a set of active restarts ++R_1 is more recent than every @i{restart} in a ++set R_2 if the @i{restarts} ++in R_2 were active when the @i{restarts} in R_1 were ++established. ++ ++@item 2. ++Let r_1 and r_2 be two active @i{restarts} with ++the same name established by the same @i{form}. Then r_1 is ++more recent than r_2 if r_1 was defined to the ++left of r_2 in the @i{form} that established them. ++ ++@end table ++ ++If a @i{restart} is invoked but does not transfer control, ++the values resulting from the @i{restart} function are ++returned by the function that invoked the restart, either ++@b{invoke-restart} or @b{invoke-restart-interactively}. ++ ++@node Interactive Use of Restarts, Interfaces to Restarts, Restarts, Signaling and Handling Conditions ++@subsubsection Interactive Use of Restarts ++ ++For interactive handling, two pieces of information are needed ++from a @i{restart}: a report function and an interactive function. ++ ++The report function ++is used by a program such as the debugger to ++present a description of the action the @i{restart} will take. ++The report function is specified and established by the ++@t{:report-function} keyword to ++@b{restart-bind} or the ++@t{:report} keyword to @b{restart-case}. ++ ++The interactive function, which can be specified using the ++@t{:interactive-function} keyword to ++@b{restart-bind} or @t{:interactive} keyword ++to @b{restart-case}, is used when the @i{restart} ++is invoked ++interactively, such as from the debugger, to produce a suitable ++list of arguments. ++ ++@b{invoke-restart} invokes the most recently @i{established} ++@i{restart} whose ++name is the same as the first argument to @b{invoke-restart}. ++If a @i{restart} is invoked interactively by the debugger and does ++not transfer control but rather returns values, the precise ++action of the debugger on those values is @i{implementation-defined}. ++ ++@node Interfaces to Restarts, Restart Tests, Interactive Use of Restarts, Signaling and Handling Conditions ++@subsubsection Interfaces to Restarts ++ ++Some @i{restarts} have functional interfaces, ++such as @b{abort}, @b{continue}, ++@b{muffle-warning}, @b{store-value}, and ++@b{use-value}. ++They are ordinary functions that use ++ @b{find-restart} and @b{invoke-restart} internally, ++that have the same name as the @i{restarts} they manipulate, ++and that are provided simply for notational convenience. ++ ++Figure 9--6 shows @i{defined names} relating to ++@i{restarts}. ++ ++@format ++@group ++@noindent ++@w{ abort invoke-restart-interactively store-value } ++@w{ compute-restarts muffle-warning use-value } ++@w{ continue restart-bind with-simple-restart } ++@w{ find-restart restart-case } ++@w{ invoke-restart restart-name } ++ ++@noindent ++@w{ Figure 9--6: Defined names relating to restarts. } ++ ++@end group ++@end format ++ ++@node Restart Tests, Associating a Restart with a Condition, Interfaces to Restarts, Signaling and Handling Conditions ++@subsubsection Restart Tests ++ ++Each @i{restart} has an associated test, which is a function of one ++argument (a @i{condition} or @b{nil}) which returns @i{true} if the @i{restart} ++should be visible in the current @i{situation}. This test is created by ++the @t{:test-function} option to @b{restart-bind} or ++the @t{:test} option to @b{restart-case}. ++ ++@node Associating a Restart with a Condition, , Restart Tests, Signaling and Handling Conditions ++@subsubsection Associating a Restart with a Condition ++ ++A @i{restart} can be ``associated with'' a @i{condition} explicitly ++by @b{with-condition-restarts}, or implicitly by @b{restart-case}. ++Such an assocation has @i{dynamic extent}. ++ ++A single @i{restart} may be associated with several @i{conditions} ++at the same time. ++A single @i{condition} may have several associated @i{restarts} ++at the same time. ++ ++Active restarts associated with a particular @i{condition} can be detected ++by @i{calling} a @i{function} such as @b{find-restart}, supplying ++that @i{condition} as the @i{condition} @i{argument}. ++Active restarts can also be detected without regard to any associated ++@i{condition} by calling such a function without a @i{condition} @i{argument}, ++or by supplying a value of @b{nil} for such an @i{argument}. ++ ++@node Assertions, Notes about the Condition System`s Background, Signaling and Handling Conditions, Condition System Concepts ++@subsection Assertions ++ ++Conditional signaling of @i{conditions} ++based on such things as key match, form evaluation, ++and @i{type} are handled by assertion @i{operators}. ++Figure 9--7 shows @i{operators} relating to assertions. ++ ++@format ++@group ++@noindent ++@w{ assert check-type ecase } ++@w{ ccase ctypecase etypecase } ++ ++@noindent ++@w{ Figure 9--7: Operators relating to assertions.} ++ ++@end group ++@end format ++ ++@node Notes about the Condition System`s Background, , Assertions, Condition System Concepts ++@subsection Notes about the Condition System`s Background ++ ++For a background reference to the abstract concepts detailed in this ++section, see @i{Exceptional Situations in Lisp}. The details of that paper are not binding on ++this document, but may be helpful in establishing a conceptual basis for ++understanding this material. ++ ++@c end of including concept-conditions ++ ++@node Conditions Dictionary, , Condition System Concepts, Conditions ++@section Conditions Dictionary ++ ++@c including dict-conditions ++ ++@menu ++* condition:: ++* warning:: ++* style-warning:: ++* serious-condition:: ++* error (Condition Type):: ++* cell-error:: ++* cell-error-name:: ++* parse-error:: ++* storage-condition:: ++* assert:: ++* error:: ++* cerror:: ++* check-type:: ++* simple-error:: ++* invalid-method-error:: ++* method-combination-error:: ++* signal:: ++* simple-condition:: ++* simple-condition-format-control:: ++* warn:: ++* simple-warning:: ++* invoke-debugger:: ++* break:: ++* *debugger-hook*:: ++* *break-on-signals*:: ++* handler-bind:: ++* handler-case:: ++* ignore-errors:: ++* define-condition:: ++* make-condition:: ++* restart:: ++* compute-restarts:: ++* find-restart:: ++* invoke-restart:: ++* invoke-restart-interactively:: ++* restart-bind:: ++* restart-case:: ++* restart-name:: ++* with-condition-restarts:: ++* with-simple-restart:: ++* abort (Restart):: ++* continue:: ++* muffle-warning:: ++* store-value:: ++* use-value:: ++* abort (Function):: ++@end menu ++ ++@node condition, warning, Conditions Dictionary, Conditions Dictionary ++@subsection condition [Condition Type] ++ ++[Reviewer Note by Barrett: I think CONDITION-RESTARTS is not fully integrated.] ++ ++@subsubheading Class Precedence List:: ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++All types of @i{conditions}, whether error or ++non-error, must inherit from this @i{type}. ++ ++No additional @i{subtype} relationships among the specified @i{subtypes} of @i{type} @b{condition} ++are allowed, except when explicitly mentioned in the text; however ++implementations are permitted to introduce additional @i{types} ++and one of these @i{types} can be a @i{subtype} of any ++number of the @i{subtypes} of @i{type} @b{condition}. ++ ++Whether a user-defined @i{condition} @i{type} has @i{slots} ++that are accessible by @i{with-slots} is @i{implementation-dependent}. ++Furthermore, even in an @i{implementation} ++in which user-defined @i{condition} @i{types} would have @i{slots}, ++it is @i{implementation-dependent} whether any @i{condition} ++@i{types} defined in this document have such @i{slots} or, ++if they do, what their @i{names} might be; ++only the reader functions documented by this specification may be relied ++upon by portable code. ++ ++@i{Conforming code} must observe the following restrictions related to ++@i{conditions}: ++ ++@table @asis ++ ++@item @t{*} ++@b{define-condition}, not @b{defclass}, must be used ++ to define new @i{condition} @i{types}. ++ ++@item @t{*} ++@b{make-condition}, not @b{make-instance}, must be used to ++ create @i{condition} @i{objects} explicitly. ++ ++@item @t{*} ++The @t{:report} option of @b{define-condition}, not @b{defmethod} ++ for @b{print-object}, must be used to define a condition reporter. ++ ++@item @t{*} ++@b{slot-value}, @b{slot-boundp}, @b{slot-makunbound}, ++ and @b{with-slots} must not be used on @i{condition} @i{objects}. ++ Instead, the appropriate accessor functions (defined by @b{define-condition}) ++ should be used. ++@end table ++ ++@node warning, style-warning, condition, Conditions Dictionary ++@subsection warning [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{warning}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{warning} consists of all types of warnings. ++ ++@subsubheading See Also:: ++ ++@b{style-warning} ++ ++@node style-warning, serious-condition, warning, Conditions Dictionary ++@subsection style-warning [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{style-warning}, ++@b{warning}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{style-warning} includes those @i{conditions} ++that represent @i{situations} involving @i{code} ++that is @i{conforming code} but that is nevertheless ++considered to be faulty or substandard. ++ ++@subsubheading See Also:: ++ ++@ref{muffle-warning} ++ ++@subsubheading Notes:: ++ ++An @i{implementation} might signal such a @i{condition} ++if it encounters @i{code} ++ that uses deprecated features ++ or that appears unaesthetic or inefficient. ++ ++An `unused variable' warning must be of @i{type} @b{style-warning}. ++ ++In general, the question of whether @i{code} is faulty or substandard ++is a subjective decision to be made by the facility processing that @i{code}. ++The intent is that whenever such a facility wishes to complain about ++@i{code} on such subjective grounds, it should use this ++@i{condition} @i{type} so that any clients who wish to redirect or ++muffle superfluous warnings can do so without risking that they will be ++redirecting or muffling other, more serious warnings. ++ ++@node serious-condition, error (Condition Type), style-warning, Conditions Dictionary ++@subsection serious-condition [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++All @i{conditions} serious enough to require interactive intervention ++if not handled should inherit from the @i{type} @b{serious-condition}. ++This condition type is provided ++primarily so that it may be included as ++a @i{superclass} of other @i{condition} @i{types}; ++it is not intended to be signaled directly. ++ ++@subsubheading Notes:: ++ ++Signaling a @i{serious condition} does not itself force entry into ++the debugger. However, except in the unusual situation where the ++programmer can assure that no harm will come from failing to ++@i{handle} a @i{serious condition}, such a @i{condition} is ++usually signaled with @b{error} rather than @b{signal} in ++order to assure that the program does not continue without ++@i{handling} the @i{condition}. (And conversely, it is ++conventional to use @b{signal} rather than @b{error} to signal ++conditions which are not @i{serious conditions}, since normally the ++failure to handle a non-serious condition is not reason enough for the ++debugger to be entered.) ++ ++@node error (Condition Type), cell-error, serious-condition, Conditions Dictionary ++@subsection error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{error} consists of all @i{conditions} that represent @i{errors}. ++ ++@node cell-error, cell-error-name, error (Condition Type), Conditions Dictionary ++@subsection cell-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{cell-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{cell-error} consists of error conditions that occur during ++a location @i{access}. The name of the offending cell is initialized by ++the @t{:name} initialization argument to @b{make-condition}, ++and is @i{accessed} by the @i{function} @b{cell-error-name}. ++ ++@subsubheading See Also:: ++ ++@ref{cell-error-name} ++ ++@node cell-error-name, parse-error, cell-error, Conditions Dictionary ++@subsection cell-error-name [Function] ++ ++@code{cell-error-name} @i{condition} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{cell-error}. ++ ++@i{name}---an @i{object}. ++ ++@subsubheading Description:: ++ ++Returns the @i{name} of the offending cell involved in the @i{situation} ++represented by @i{condition}. ++ ++The nature of the result depends on the specific @i{type} of @i{condition}. ++For example, ++ if the @i{condition} is of @i{type} @b{unbound-variable}, the result is ++ the @i{name} of the @i{unbound variable} which was being @i{accessed}, ++ if the @i{condition} is of @i{type} @b{undefined-function}, this is ++ the @i{name} of the @i{undefined function} which was being @i{accessed}, ++and if the @i{condition} is of @i{type} @b{unbound-slot}, this is ++ the @i{name} of the @i{slot} which was being @i{accessed}. ++ ++@subsubheading See Also:: ++ ++@b{cell-error}, ++@b{unbound-slot}, ++@b{unbound-variable}, ++@b{undefined-function}, ++@ref{Condition System Concepts} ++ ++@node parse-error, storage-condition, cell-error-name, Conditions Dictionary ++@subsection parse-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++ ++@b{parse-error}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{parse-error} consists of ++error conditions that are related to parsing. ++ ++@subsubheading See Also:: ++ ++@ref{parse-namestring} ++, ++@ref{reader-error} ++ ++@node storage-condition, assert, parse-error, Conditions Dictionary ++@subsection storage-condition [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{storage-condition}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{storage-condition} consists of serious conditions that ++relate to problems with memory management that are potentially due to ++@i{implementation-dependent} limits rather than semantic errors ++in @i{conforming programs}, and that typically warrant entry to the ++debugger if not handled. Depending on the details of the @i{implementation}, ++these might include such problems as ++ stack overflow, ++ memory region overflow, ++and ++ storage exhausted. ++ ++@subsubheading Notes:: ++ ++While some @r{Common Lisp} operations might signal @i{storage-condition} ++because they are defined to create @i{objects}, ++it is unspecified whether operations that are not defined to create ++@i{objects} create them anyway ++and so might also signal @b{storage-condition}. ++Likewise, the evaluator itself might create @i{objects} ++and so might signal @b{storage-condition}. ++(The natural assumption might be that such ++@i{object} creation is naturally inefficient, ++but even that is @i{implementation-dependent}.) ++In general, the entire question of how storage allocation is done is ++@i{implementation-dependent}, ++and so any operation might signal @b{storage-condition} at any time. ++Because such a @i{condition} is indicative of a limitation ++ of the @i{implementation} ++or of the @i{image} ++rather than an error in a @i{program}, ++@i{objects} of @i{type} @b{storage-condition} are not of @i{type} @b{error}. ++ ++@node assert, error, storage-condition, Conditions Dictionary ++@subsection assert [Macro] ++ ++@code{assert} @i{test-form @r{[}@r{(}@{@i{place}@}*@r{)} ++ @r{[}datum-form ++ @{@i{argument-form}@}*@r{]}@r{]}}@* ++ @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{test-form}---a @i{form}; always evaluated. ++ ++@i{place}---a @i{place}; evaluated if an error is signaled. ++ ++@i{datum-form}---a @i{form} that evaluates to a @i{datum}. ++ Evaluated each time an error is to be signaled, ++ or not at all if no error is to be signaled. ++ ++@i{argument-form}---a @i{form} that evaluates to an @i{argument}. ++ Evaluated each time an error is to be signaled, ++ or not at all if no error is to be signaled. ++ ++@i{datum}, @i{arguments}---@i{designators} for a @i{condition} ++ of default type @b{error}. (These @i{designators} are the ++ result of evaluating @i{datum-form} and each of the @i{argument-forms}.) ++ ++@subsubheading Description:: ++ ++@b{assert} assures that @i{test-form} evaluates to @i{true}. ++If @i{test-form} evaluates to @i{false}, @b{assert} signals a ++@i{correctable} @i{error} (denoted by @i{datum} and @i{arguments}). ++Continuing from this error using the @b{continue} @i{restart} makes it possible ++for the user to alter the values of the @i{places} before ++@b{assert} evaluates @i{test-form} again. ++If the value of @i{test-form} is @i{non-nil}, ++@b{assert} returns @b{nil}. ++ ++The @i{places} are @i{generalized references} to data ++upon which @i{test-form} depends, ++whose values can be changed by the user in attempting to correct the error. ++@i{Subforms} of each @i{place} are only evaluated if an error is signaled, ++and might be re-evaluated if the error is re-signaled (after continuing without ++actually fixing the problem). ++ ++The order of evaluation of the @i{places} is not specified; ++see @ref{Evaluation of Subforms to Places}. ++@ITindex order of evaluation ++ ++@ITindex evaluation order ++ ++If a @i{place} @i{form} is supplied that produces more values than there ++are store variables, the extra values are ignored. If the supplied ++@i{form} produces fewer values than there are store variables, ++the missing values are set to @b{nil}. ++ ++@subsubheading Examples:: ++@example ++ (setq x (make-array '(3 5) :initial-element 3)) ++@result{} #2A((3 3 3 3 3) (3 3 3 3 3) (3 3 3 3 3)) ++ (setq y (make-array '(3 5) :initial-element 7)) ++@result{} #2A((7 7 7 7 7) (7 7 7 7 7) (7 7 7 7 7)) ++ (defun matrix-multiply (a b) ++ (let ((*print-array* nil)) ++ (assert (and (= (array-rank a) (array-rank b) 2) ++ (= (array-dimension a 1) (array-dimension b 0))) ++ (a b) ++ "Cannot multiply ~S by ~S." a b) ++ (really-matrix-multiply a b))) @result{} MATRIX-MULTIPLY ++ (matrix-multiply x y) ++@t{ |> } Correctable error in MATRIX-MULTIPLY: ++@t{ |> } Cannot multiply # by #. ++@t{ |> } Restart options: ++@t{ |> } 1: You will be prompted for one or more new values. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Value for A: @b{|>>}@t{x}@b{<<|} ++@t{ |> } Value for B: @b{|>>}@t{(make-array '(5 3) :initial-element 6)}@b{<<|} ++@result{} #2A((54 54 54 54 54) ++ (54 54 54 54 54) ++ (54 54 54 54 54) ++ (54 54 54 54 54) ++ (54 54 54 54 54)) ++@end example ++ ++@example ++ (defun double-safely (x) (assert (numberp x) (x)) (+ x x)) ++ (double-safely 4) ++@result{} 8 ++ ++ (double-safely t) ++@t{ |> } Correctable error in DOUBLE-SAFELY: The value of (NUMBERP X) must be non-NIL. ++@t{ |> } Restart options: ++@t{ |> } 1: You will be prompted for one or more new values. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Value for X: @b{|>>}@t{7}@b{<<|} ++@result{} 14 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*break-on-signals*} ++ ++The set of active @i{condition handlers}. ++ ++@subsubheading See Also:: ++ ++@ref{check-type} ++, ++@ref{error} ++, @ref{Generalized Reference} ++ ++@subsubheading Notes:: ++ ++The debugger need not include the @i{test-form} in the error message, ++and the @i{places} should not be included in the message, but they ++should be made available for the user's perusal. If the user gives the ++``continue'' command, the values of any of the references can be altered. ++The details of this depend on the implementation's style of user interface. ++ ++@node error, cerror, assert, Conditions Dictionary ++@subsection error [Function] ++ ++@code{error} @i{datum @r{&rest} arguments} ++ @result{} # ++ ++@subsubheading Arguments and Values:: ++ ++@i{datum}, @i{arguments}---@i{designators} for a @i{condition} ++ of default type @b{simple-error}. ++ ++@subsubheading Description:: ++ ++@b{error} effectively invokes @b{signal} on the denoted @i{condition}. ++ ++If the @i{condition} is not handled, @t{(invoke-debugger @i{condition})} is done. ++As a consequence of calling @b{invoke-debugger}, @b{error} ++cannot directly return; the only exit from @b{error} ++can come by non-local transfer of control in a handler or by use of ++an interactive debugging command. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun factorial (x) ++ (cond ((or (not (typep x 'integer)) (minusp x)) ++ (error "~S is not a valid argument to FACTORIAL." x)) ++ ((zerop x) 1) ++ (t (* x (factorial (- x 1)))))) ++@result{} FACTORIAL ++(factorial 20) ++@result{} 2432902008176640000 ++(factorial -1) ++@t{ |> } Error: -1 is not a valid argument to FACTORIAL. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Return to Lisp Toplevel. ++@t{ |> } Debug> ++@end example ++ ++@example ++ (setq a 'fred) ++@result{} FRED ++ (if (numberp a) (1+ a) (error "~S is not a number." A)) ++@t{ |> } Error: FRED is not a number. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:Continue 1}@b{<<|} ++@t{ |> } Return to Lisp Toplevel. ++ ++ (define-condition not-a-number (error) ++ ((argument :reader not-a-number-argument :initarg :argument)) ++ (:report (lambda (condition stream) ++ (format stream "~S is not a number." ++ (not-a-number-argument condition))))) ++@result{} NOT-A-NUMBER ++ ++ (if (numberp a) (1+ a) (error 'not-a-number :argument a)) ++@t{ |> } Error: FRED is not a number. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:Continue 1}@b{<<|} ++@t{ |> } Return to Lisp Toplevel. ++@end example ++ ++@subsubheading Side Effects:: ++ ++@i{Handlers} for the specified condition, if any, are invoked ++and might have side effects. ++Program execution might stop, and the debugger might be entered. ++ ++@subsubheading Affected By:: ++ ++Existing handler bindings. ++ ++@b{*break-on-signals*} ++ ++Signals an error of @i{type} @b{type-error} if @i{datum} and @i{arguments} are not @i{designators} for a @i{condition}. ++ ++@subsubheading See Also:: ++ ++@ref{cerror} ++, ++@ref{signal} ++, ++@ref{format} ++, ++@ref{ignore-errors} ++, @b{*break-on-signals*}, ++@ref{handler-bind} ++, @ref{Condition System Concepts} ++ ++@subsubheading Notes:: ++ ++Some implementations may provide debugger ++commands for interactively returning from individual stack frames. ++However, it should be possible for the programmer to feel confident ++about writing code like: ++ ++@example ++ (defun wargames:no-win-scenario () ++ (if (error "pushing the button would be stupid.")) ++ (push-the-button)) ++@end example ++ ++In this scenario, there should be no chance that ++@b{error} will return ++and the button will get pushed. ++ ++While the meaning of this program is clear and it might be proven `safe' ++by a formal theorem prover, such a proof is no guarantee that the ++program is safe to execute. Compilers have been known to have bugs, ++computers to have signal glitches, and human beings to manually ++intervene in ways that are not always possible to predict. Those kinds ++of errors, while beyond the scope of the condition system to formally ++model, are not beyond the scope of things that should seriously be ++considered when writing code that could have the kinds of sweeping ++effects hinted at by this example. ++ ++@node cerror, check-type, error, Conditions Dictionary ++@subsection cerror [Function] ++ ++@code{cerror} @i{continue-format-control datum @r{&rest} arguments} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{Continue-format-control}---a @i{format control}. ++ ++[Reviewer Note by Barmar: What is continue-format-control used for??] ++ ++@i{datum}, @i{arguments}---@i{designators} for a @i{condition} ++ of default type @b{simple-error}. ++ ++@subsubheading Description:: ++ ++@b{cerror} effectively invokes @b{error} on the ++@i{condition} named by @i{datum}. As with any function that ++implicitly calls @b{error}, if the @i{condition} is not handled, ++@t{(invoke-debugger @i{condition})} is executed. While signaling is going on, ++and while in the debugger if it is reached, it is possible to continue ++code execution (@i{i.e.}, to return from @b{cerror}) using the @b{continue} @i{restart}. ++ ++If @i{datum} is a @i{condition}, @i{arguments} can be supplied, ++but are used only in conjunction with the @i{continue-format-control}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun real-sqrt (n) ++ (when (minusp n) ++ (setq n (- n)) ++ (cerror "Return sqrt(~D) instead." "Tried to take sqrt(-~D)." n)) ++ (sqrt n)) ++ ++ (real-sqrt 4) ++@result{} 2.0 ++ ++ (real-sqrt -9) ++@t{ |> } Correctable error in REAL-SQRT: Tried to take sqrt(-9). ++@t{ |> } Restart options: ++@t{ |> } 1: Return sqrt(9) instead. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@result{} 3.0 ++ ++ (define-condition not-a-number (error) ++ ((argument :reader not-a-number-argument :initarg :argument)) ++ (:report (lambda (condition stream) ++ (format stream "~S is not a number." ++ (not-a-number-argument condition))))) ++ ++ (defun assure-number (n) ++ (loop (when (numberp n) (return n)) ++ (cerror "Enter a number." ++ 'not-a-number :argument n) ++ (format t "~&Type a number: ") ++ (setq n (read)) ++ (fresh-line))) ++ ++ (assure-number 'a) ++@t{ |> } Correctable error in ASSURE-NUMBER: A is not a number. ++@t{ |> } Restart options: ++@t{ |> } 1: Enter a number. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Type a number: @b{|>>}@t{1/2}@b{<<|} ++@result{} 1/2 ++ ++ (defun assure-large-number (n) ++ (loop (when (and (numberp n) (> n 73)) (return n)) ++ (cerror "Enter a number~:[~; a bit larger than ~D~]." ++ "~*~A is not a large number." ++ (numberp n) n) ++ (format t "~&Type a large number: ") ++ (setq n (read)) ++ (fresh-line))) ++ ++ (assure-large-number 10000) ++@result{} 10000 ++ ++ (assure-large-number 'a) ++@t{ |> } Correctable error in ASSURE-LARGE-NUMBER: A is not a large number. ++@t{ |> } Restart options: ++@t{ |> } 1: Enter a number. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Type a large number: @b{|>>}@t{88}@b{<<|} ++@result{} 88 ++ ++ (assure-large-number 37) ++@t{ |> } Correctable error in ASSURE-LARGE-NUMBER: 37 is not a large number. ++@t{ |> } Restart options: ++@t{ |> } 1: Enter a number a bit larger than 37. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Type a large number: @b{|>>}@t{259}@b{<<|} ++@result{} 259 ++ ++ (define-condition not-a-large-number (error) ++ ((argument :reader not-a-large-number-argument :initarg :argument)) ++ (:report (lambda (condition stream) ++ (format stream "~S is not a large number." ++ (not-a-large-number-argument condition))))) ++ ++ (defun assure-large-number (n) ++ (loop (when (and (numberp n) (> n 73)) (return n)) ++ (cerror "Enter a number~3*~:[~; a bit larger than ~*~D~]." ++ 'not-a-large-number ++ :argument n ++ :ignore (numberp n) ++ :ignore n ++ :allow-other-keys t) ++ (format t "~&Type a large number: ") ++ (setq n (read)) ++ (fresh-line))) ++ ++ (assure-large-number 'a) ++@t{ |> } Correctable error in ASSURE-LARGE-NUMBER: A is not a large number. ++@t{ |> } Restart options: ++@t{ |> } 1: Enter a number. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Type a large number: @b{|>>}@t{88}@b{<<|} ++@result{} 88 ++ ++ (assure-large-number 37) ++@t{ |> } Correctable error in ASSURE-LARGE-NUMBER: A is not a large number. ++@t{ |> } Restart options: ++@t{ |> } 1: Enter a number a bit larger than 37. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Type a large number: @b{|>>}@t{259}@b{<<|} ++@result{} 259 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{*break-on-signals*}. ++ ++Existing handler bindings. ++ ++@subsubheading See Also:: ++ ++@ref{error} ++, ++@ref{format} ++, ++@ref{handler-bind} ++, ++@b{*break-on-signals*}, @b{simple-type-error} ++ ++@subsubheading Notes:: ++ ++If @i{datum} is a @i{condition} @i{type} rather than a ++@i{string}, the @b{format} directive @t{~*} may be especially ++useful in the @i{continue-format-control} in order to ignore the ++@i{keywords} in the @i{initialization argument list}. For example: ++ ++@example ++(cerror "enter a new value to replace ~*~s" ++ 'not-a-number ++ :argument a) ++@end example ++ ++@node check-type, simple-error, cerror, Conditions Dictionary ++@subsection check-type [Macro] ++ ++@code{check-type} @i{place typespec @r{@r{[}@i{string}@r{]}}} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{place}---a @i{place}. ++ ++@i{typespec}---a @i{type specifier}. ++ ++@i{string}---a @i{string}; evaluated. ++ ++@subsubheading Description:: ++ ++@b{check-type} signals a @i{correctable} @i{error} ++of @i{type} @b{type-error} if the contents of @i{place} are not ++of the type @i{typespec}. ++ ++@b{check-type} can return only if the @b{store-value} @i{restart} is invoked, ++either explicitly from a handler ++ or implicitly as one of the options offered by the debugger. ++If the @b{store-value} @i{restart} is invoked, ++@b{check-type} stores the new value ++that is the argument to the @i{restart} invocation ++(or that is prompted for interactively by the debugger) ++in @i{place} and starts over, ++checking the type of the new value ++and signaling another error if it is still not of the desired @i{type}. ++ ++The first time @i{place} is @i{evaluated}, ++it is @i{evaluated} by normal evaluation rules. ++It is later @i{evaluated} as a @i{place} ++if the type check fails and the @b{store-value} @i{restart} is used; ++see @ref{Evaluation of Subforms to Places}. ++ ++@i{string} should be an English description of the type, ++starting with an indefinite article (``a'' or ``an''). ++If @i{string} is not supplied, ++it is computed automatically from @i{typespec}. ++The automatically generated message mentions ++ @i{place}, ++ its contents, ++ and the desired type. ++An implementation may choose to generate ++a somewhat differently worded error message ++if it recognizes that @i{place} is of a particular form, ++such as one of the arguments to the function that called @b{check-type}. ++@i{string} is allowed because some applications of @b{check-type} ++may require a more specific description of what is wanted ++than can be generated automatically from @i{typespec}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq aardvarks '(sam harry fred)) ++@result{} (SAM HARRY FRED) ++ (check-type aardvarks (array * (3))) ++@t{ |> } Error: The value of AARDVARKS, (SAM HARRY FRED), ++@t{ |> } is not a 3-long array. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use instead. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Use Value: @b{|>>}@t{#(SAM FRED HARRY)}@b{<<|} ++@result{} NIL ++ aardvarks ++@result{} # ++ (map 'list #'identity aardvarks) ++@result{} (SAM FRED HARRY) ++ (setq aardvark-count 'foo) ++@result{} FOO ++ (check-type aardvark-count (integer 0 *) "A positive integer") ++@t{ |> } Error: The value of AARDVARK-COUNT, FOO, is not a positive integer. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use instead. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 2}@b{<<|} ++@end example ++ ++@example ++ (defmacro define-adder (name amount) ++ (check-type name (and symbol (not null)) "a name for an adder function") ++ (check-type amount integer) ++ `(defun ,name (x) (+ x ,amount))) ++ ++ (macroexpand '(define-adder add3 3)) ++@result{} (defun add3 (x) (+ x 3)) ++ ++ (macroexpand '(define-adder 7 7)) ++@t{ |> } Error: The value of NAME, 7, is not a name for an adder function. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use instead. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:Continue 1}@b{<<|} ++@t{ |> } Specify a value to use instead. ++@t{ |> } Type a form to be evaluated and used instead: @b{|>>}@t{'ADD7}@b{<<|} ++@result{} (defun add7 (x) (+ x 7)) ++ ++ (macroexpand '(define-adder add5 something)) ++@t{ |> } Error: The value of AMOUNT, SOMETHING, is not an integer. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use instead. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:Continue 1}@b{<<|} ++@t{ |> } Type a form to be evaluated and used instead: @b{|>>}@t{5}@b{<<|} ++@result{} (defun add5 (x) (+ x 5)) ++ ++@end example ++ ++Control is transferred to a handler. ++ ++@subsubheading Side Effects:: ++ ++The debugger might be entered. ++ ++@subsubheading Affected By:: ++ ++@b{*break-on-signals*} ++ ++The implementation. ++ ++@subsubheading See Also:: ++ ++@ref{Condition System Concepts} ++ ++@subsubheading Notes:: ++ ++@example ++ (check-type @i{place} @i{typespec}) ++ @equiv{} (assert (typep @i{place} '@i{typespec}) (@i{place}) ++ 'type-error :datum @i{place} :expected-type '@i{typespec}) ++@end example ++ ++@node simple-error, invalid-method-error, check-type, Conditions Dictionary ++@subsection simple-error [Condition Type] ++ ++@subsubheading Class Precedence List:: ++ ++@b{simple-error}, ++@b{simple-condition}, ++@b{error}, ++@b{serious-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{simple-error} consists of @i{conditions} that ++are signaled by @b{error} or @b{cerror} when a ++ ++@i{format control} ++ ++is supplied as the function's first argument. ++ ++@node invalid-method-error, method-combination-error, simple-error, Conditions Dictionary ++@subsection invalid-method-error [Function] ++ ++@code{invalid-method-error} @i{method format-control @r{&rest} args} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{method}---a @i{method}. ++ ++@i{format-control}---a @i{format control}. ++ ++@i{args}---@i{format arguments} for the @i{format-control}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{invalid-method-error} is used to signal an error of @i{type} @b{error} ++when there is an applicable @i{method} whose @i{qualifiers} are not valid for ++the method combination type. The error message is constructed by ++using the @i{format-control} suitable for @b{format} ++and any @i{args} to it. Because an ++implementation may need to add additional contextual information to ++the error message, @b{invalid-method-error} should be called only ++within the dynamic extent of a method combination function. ++ ++The @i{function} @b{invalid-method-error} is called automatically when a ++@i{method} fails to satisfy every @i{qualifier} pattern and predicate in a ++@b{define-method-combination} @i{form}. A method combination function ++that imposes additional restrictions should call ++@b{invalid-method-error} explicitly if it encounters a @i{method} ++it cannot accept. ++ ++Whether @b{invalid-method-error} returns to its caller or exits via ++@b{throw} is @i{implementation-dependent}. ++ ++@subsubheading Side Effects:: ++ ++The debugger might be entered. ++ ++@subsubheading Affected By:: ++ ++@b{*break-on-signals*} ++ ++@subsubheading See Also:: ++ ++@ref{define-method-combination} ++ ++@node method-combination-error, signal, invalid-method-error, Conditions Dictionary ++@subsection method-combination-error [Function] ++ ++@code{method-combination-error} @i{format-control @r{&rest} args} @result{} @i{@i{implementation-dependent}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{format-control}---a @i{format control}. ++ ++@i{args}---@i{format arguments} for @i{format-control}. ++ ++@subsubheading Description:: ++ ++The @i{function} @b{method-combination-error} is used to signal an error ++in method combination. ++ ++The error message is constructed by using a @i{format-control} suitable ++for @b{format} and any @i{args} to it. Because an implementation may ++need to add additional contextual information to the error message, ++@b{method-combination-error} should be called only within the ++dynamic extent of a method combination function. ++ ++Whether @b{method-combination-error} returns to its caller or exits ++via @b{throw} is @i{implementation-dependent}. ++ ++@subsubheading Side Effects:: ++ ++The debugger might be entered. ++ ++@subsubheading Affected By:: ++ ++@b{*break-on-signals*} ++ ++@subsubheading See Also:: ++ ++@ref{define-method-combination} ++ ++@node signal, simple-condition, method-combination-error, Conditions Dictionary ++@subsection signal [Function] ++ ++@code{signal} @i{datum @r{&rest} arguments} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{datum}, @i{arguments}---@i{designators} for a @i{condition} ++ of default type @b{simple-condition}. ++ ++@subsubheading Description:: ++ ++@i{Signals} the @i{condition} denoted by the given @i{datum} and @i{arguments}. ++If the @i{condition} is not handled, @b{signal} returns @b{nil}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun handle-division-conditions (condition) ++ (format t "Considering condition for division condition handling~ ++ (when (and (typep condition 'arithmetic-error) ++ (eq '/ (arithmetic-error-operation condition))) ++ (invoke-debugger condition))) ++HANDLE-DIVISION-CONDITIONS ++ (defun handle-other-arithmetic-errors (condition) ++ (format t "Considering condition for arithmetic condition handling~ ++ (when (typep condition 'arithmetic-error) ++ (abort))) ++HANDLE-OTHER-ARITHMETIC-ERRORS ++ (define-condition a-condition-with-no-handler (condition) ()) ++A-CONDITION-WITH-NO-HANDLER ++ (signal 'a-condition-with-no-handler) ++NIL ++ (handler-bind ((condition #'handle-division-conditions) ++ (condition #'handle-other-arithmetic-errors)) ++ (signal 'a-condition-with-no-handler)) ++Considering condition for division condition handling ++Considering condition for arithmetic condition handling ++NIL ++ (handler-bind ((arithmetic-error #'handle-division-conditions) ++ (arithmetic-error #'handle-other-arithmetic-errors)) ++ (signal 'arithmetic-error :operation '* :operands '(1.2 b))) ++Considering condition for division condition handling ++Considering condition for arithmetic condition handling ++Back to Lisp Toplevel ++@end example ++ ++@subsubheading Side Effects:: ++ ++The debugger might be entered due to @b{*break-on-signals*}. ++ ++Handlers for the condition being signaled might transfer control. ++ ++@subsubheading Affected By:: ++ ++Existing handler bindings. ++ ++@b{*break-on-signals*} ++ ++@subsubheading See Also:: ++ ++@b{*break-on-signals*}, ++@ref{error} ++, ++@b{simple-condition}, ++@ref{Signaling and Handling Conditions} ++ ++@subsubheading Notes:: ++ ++If @t{(typep @i{datum} *break-on-signals*)} @i{yields} @i{true}, ++the debugger is entered prior to beginning the signaling process. ++The @b{continue} @i{restart} can be used to continue with the signaling process. ++This is also true for all other @i{functions} and @i{macros} that ++should, might, or must @i{signal} @i{conditions}. ++ ++@node simple-condition, simple-condition-format-control, signal, Conditions Dictionary ++@subsection simple-condition [Condition Type] ++ ++@subsubheading Class Precedence List:: ++@b{simple-condition}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{simple-condition} represents @i{conditions} that are ++signaled by @b{signal} whenever a @i{format-control} is ++supplied as the function's first argument. ++ ++The @i{format control} and @i{format arguments} are initialized with ++the initialization arguments named @t{:format-control} ++ ++and @t{:format-arguments} to @b{make-condition}, and are ++@i{accessed} by the @i{functions} ++ ++@b{simple-condition-format-control} ++ ++and @b{simple-condition-format-arguments}. ++If format arguments are not supplied to @b{make-condition}, ++@b{nil} is used as a default. ++ ++@subsubheading See Also:: ++ ++@ref{simple-condition-format-control} ++, ++ ++@b{simple-condition-format-arguments} ++ ++@node simple-condition-format-control, warn, simple-condition, Conditions Dictionary ++@subsection simple-condition-format-control, simple-condition-format-arguments ++@flushright ++@i{[Function]} ++@end flushright ++ ++@code{simple-condition-format-control} @i{condition} @result{} @i{format-control} ++ ++@code{simple-condition-format-arguments} @i{condition} @result{} @i{format-arguments} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} of @i{type} @b{simple-condition}. ++ ++@i{format-control}---a @i{format control}. ++ ++@i{format-arguments}---a @i{list}. ++ ++@subsubheading Description:: ++ ++@b{simple-condition-format-control} returns the @i{format control} needed to ++process the @i{condition}'s @i{format arguments}. ++ ++@b{simple-condition-format-arguments} returns a @i{list} of @i{format arguments} ++needed to process the @i{condition}'s @i{format control}. ++ ++@subsubheading Examples:: ++ ++@example ++ (setq foo (make-condition 'simple-condition ++ :format-control "Hi ~S" ++ :format-arguments '(ho))) ++@result{} # ++ (apply #'format nil (simple-condition-format-control foo) ++ (simple-condition-format-arguments foo)) ++@result{} "Hi HO" ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{simple-condition} ++, ++@ref{Condition System Concepts} ++ ++@node warn, simple-warning, simple-condition-format-control, Conditions Dictionary ++@subsection warn [Function] ++ ++@code{warn} @i{datum @r{&rest} arguments} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{datum}, @i{arguments}---@i{designators} for a @i{condition} ++ of default type @b{simple-warning}. ++ ++@subsubheading Description:: ++ ++@i{Signals} a @i{condition} of @i{type} @b{warning}. ++If the @i{condition} is not @i{handled}, ++reports the @i{condition} to @i{error output}. ++ ++The precise mechanism for warning is as follows: ++ ++@table @asis ++ ++@item @b{The warning condition is signaled} ++While the @b{warning} @i{condition} is being signaled, ++the @b{muffle-warning} @i{restart} is established for use by a @i{handler}. ++If invoked, this @i{restart} bypasses further action by @b{warn}, ++which in turn causes @b{warn} to immediately return @b{nil}. ++ ++@item @b{If no handler for the warning condition is found} ++If no handlers for the warning condition are found, ++or if all such handlers decline, ++then the @i{condition} is reported to @i{error output} ++by @b{warn} in an @i{implementation-dependent} format. ++ ++@item @b{@b{nil} is returned} ++The value returned by @b{warn} if it returns is @b{nil}. ++@end table ++ ++@subsubheading Examples:: ++ ++@example ++ (defun foo (x) ++ (let ((result (* x 2))) ++ (if (not (typep result 'fixnum)) ++ (warn "You're using very big numbers.")) ++ result)) ++@result{} FOO ++ ++ (foo 3) ++@result{} 6 ++ ++ (foo most-positive-fixnum) ++@t{ |> } Warning: You're using very big numbers. ++@result{} 4294967294 ++ ++ (setq *break-on-signals* t) ++@result{} T ++ ++ (foo most-positive-fixnum) ++@t{ |> } Break: Caveat emptor. ++@t{ |> } To continue, type :CONTINUE followed by an option number. ++@t{ |> } 1: Return from Break. ++@t{ |> } 2: Abort to Lisp Toplevel. ++@t{ |> } Debug> :continue 1 ++@t{ |> } Warning: You're using very big numbers. ++@result{} 4294967294 ++@end example ++ ++@subsubheading Side Effects:: ++ ++A warning is issued. The debugger might be entered. ++ ++@subsubheading Affected By:: ++ ++Existing handler bindings. ++ ++@b{*break-on-signals*}, ++@b{*error-output*}. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{datum} is a @i{condition} ++and if the @i{condition} is not of @i{type} @b{warning}, ++or @i{arguments} is @i{non-nil}, an error of @i{type} @b{type-error} is signaled. ++ ++If @i{datum} is a condition type, ++the result of @t{(apply #'make-condition datum arguments)} ++must be of @i{type} @b{warning} or an error of @i{type} @b{type-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@b{*break-on-signals*}, ++@ref{muffle-warning} ++, ++@ref{signal} ++ ++@node simple-warning, invoke-debugger, warn, Conditions Dictionary ++@subsection simple-warning [Condition Type] ++ ++@subsubheading Class Precedence List:: ++ ++@b{simple-warning}, ++@b{simple-condition}, ++@b{warning}, ++@b{condition}, ++@b{t} ++ ++@subsubheading Description:: ++ ++The @i{type} @b{simple-warning} represents @i{conditions} that ++are signaled by @b{warn} whenever a ++ ++@i{format control} ++ ++is supplied as the function's first argument. ++ ++@node invoke-debugger, break, simple-warning, Conditions Dictionary ++@subsection invoke-debugger [Function] ++ ++@code{invoke-debugger} @i{condition} ++ @result{} # ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} @i{object}. ++ ++@subsubheading Description:: ++ ++@b{invoke-debugger} attempts to enter the debugger with @i{condition}. ++ ++If @b{*debugger-hook*} is not @b{nil}, it should be a @i{function} ++(or the name of a @i{function}) to be called prior to entry to ++the standard debugger. The @i{function} is called with ++@b{*debugger-hook*} bound to @b{nil}, and the @i{function} ++must accept two arguments: the @i{condition} ++and the @i{value} of @b{*debugger-hook*} prior to binding it to @b{nil}. ++If the @i{function} returns normally, ++the standard debugger is entered. ++ ++The standard debugger never directly returns. Return can occur only by a ++non-local transfer of control, such as the use of a restart function. ++ ++@subsubheading Examples:: ++ ++@example ++ (ignore-errors ;Normally, this would suppress debugger entry ++ (handler-bind ((error #'invoke-debugger)) ;But this forces debugger entry ++ (error "Foo."))) ++Debug: Foo. ++To continue, type :CONTINUE followed by an option number: ++ 1: Return to Lisp Toplevel. ++Debug> ++@end example ++ ++@subsubheading Side Effects:: ++ ++@b{*debugger-hook*} is bound to @b{nil}, ++program execution is discontinued, ++and the debugger is entered. ++ ++@subsubheading Affected By:: ++ ++@b{*debug-io*} and @b{*debugger-hook*}. ++ ++@subsubheading See Also:: ++ ++@ref{error} ++, ++@ref{break} ++ ++@node break, *debugger-hook*, invoke-debugger, Conditions Dictionary ++@subsection break [Function] ++ ++@code{break} @i{@r{&optional} format-control @r{&rest} format-arguments} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{format-control}---a @i{format control}. ++ ++ The default is @i{implementation-dependent}. ++ ++@i{format-arguments}---@i{format arguments} for the @i{format-control}. ++ ++@subsubheading Description:: ++ ++@b{break} @i{formats} @i{format-control} and @i{format-arguments} ++and then goes directly into the debugger without allowing any possibility of ++interception by programmed error-handling facilities. ++ ++If the @b{continue} @i{restart} is used while in the debugger, ++@b{break} immediately returns @b{nil} without taking any unusual recovery action. ++ ++@b{break} binds @b{*debugger-hook*} to @b{nil} ++before attempting to enter the debugger. ++ ++@subsubheading Examples:: ++ ++@example ++ (break "You got here with arguments: ~:S." '(FOO 37 A)) ++@t{ |> } BREAK: You got here with these arguments: FOO, 37, A. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Return from BREAK. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> :CONTINUE 1 ++@t{ |> } Return from BREAK. ++@result{} NIL ++ ++@end example ++ ++@subsubheading Side Effects:: ++ ++The debugger is entered. ++ ++@subsubheading Affected By:: ++ ++@b{*debug-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{error} ++, ++@ref{invoke-debugger} ++. ++ ++@subsubheading Notes:: ++ ++@b{break} is used as a way of inserting temporary debugging ++``breakpoints'' in a program, not as a way of signaling errors. ++For this reason, @b{break} does not take the @i{continue-format-control} ++@i{argument} that @b{cerror} takes. ++This and the lack of any possibility of interception by ++@i{condition} @i{handling} are the only program-visible ++differences between @b{break} and @b{cerror}. ++ ++The user interface aspects of @b{break} and @b{cerror} are ++permitted to vary more widely, in order to accomodate the interface ++needs of the @i{implementation}. For example, it is permissible for a ++@i{Lisp read-eval-print loop} to be entered by @b{break} rather ++than the conventional debugger. ++ ++@b{break} could be defined by: ++ ++@example ++ (defun break (&optional (format-control "Break") &rest format-arguments) ++ (with-simple-restart (continue "Return from BREAK.") ++ (let ((*debugger-hook* nil)) ++ (invoke-debugger ++ (make-condition 'simple-condition ++ :format-control format-control ++ :format-arguments format-arguments)))) ++ nil) ++@end example ++ ++@node *debugger-hook*, *break-on-signals*, break, Conditions Dictionary ++@subsection *debugger-hook* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{designator} for a @i{function} of two @i{arguments} ++ (a @i{condition} and the @i{value} of @b{*debugger-hook*} at the time ++ the debugger was entered), ++or @b{nil}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++When the @i{value} of @b{*debugger-hook*} is @i{non-nil}, it is called prior to ++normal entry into the debugger, either due to a call to @b{invoke-debugger} ++or due to automatic entry into the debugger from a call to @b{error} ++or @b{cerror} with a condition that is not handled. ++The @i{function} may either handle the @i{condition} ++(transfer control) or return normally (allowing the standard debugger to run). ++To minimize recursive errors while debugging, ++@b{*debugger-hook*} is bound to @b{nil} by @b{invoke-debugger} ++prior to calling the @i{function}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun one-of (choices &optional (prompt "Choice")) ++ (let ((n (length choices)) (i)) ++ (do ((c choices (cdr c)) (i 1 (+ i 1))) ++ ((null c)) ++ (format t "~&[~D] ~A~ ++ (do () ((typep i `(integer 1 ,n))) ++ (format t "~&~A: " prompt) ++ (setq i (read)) ++ (fresh-line)) ++ (nth (- i 1) choices))) ++ ++ (defun my-debugger (condition me-or-my-encapsulation) ++ (format t "~&Fooey: ~A" condition) ++ (let ((restart (one-of (compute-restarts)))) ++ (if (not restart) (error "My debugger got an error.")) ++ (let ((*debugger-hook* me-or-my-encapsulation)) ++ (invoke-restart-interactively restart)))) ++ ++ (let ((*debugger-hook* #'my-debugger)) ++ (+ 3 'a)) ++@t{ |> } Fooey: The argument to +, A, is not a number. ++@t{ |> } [1] Supply a replacement for A. ++@t{ |> } [2] Return to Cloe Toplevel. ++@t{ |> } Choice: 1 ++@t{ |> } Form to evaluate and use: (+ 5 'b) ++@t{ |> } Fooey: The argument to +, B, is not a number. ++@t{ |> } [1] Supply a replacement for B. ++@t{ |> } [2] Supply a replacement for A. ++@t{ |> } [3] Return to Cloe Toplevel. ++@t{ |> } Choice: 1 ++@t{ |> } Form to evaluate and use: 1 ++@result{} 9 ++@end example ++ ++@subsubheading Affected By:: ++ ++@b{invoke-debugger} ++ ++@subsubheading Notes:: ++ ++When evaluating code typed in by the user interactively, it is sometimes ++useful to have the hook function bind @b{*debugger-hook*} to the ++@i{function} that was its second argument so that recursive errors ++can be handled using the same interactive facility. ++ ++@node *break-on-signals*, handler-bind, *debugger-hook*, Conditions Dictionary ++@subsection *break-on-signals* [Variable] ++ ++@subsubheading Value Type:: ++ ++a @i{type specifier}. ++ ++@subsubheading Initial Value:: ++ ++@b{nil}. ++ ++@subsubheading Description:: ++ ++When @t{(typep @i{condition} *break-on-signals*)} returns @i{true}, ++calls to @b{signal}, and to other @i{operators} such as @b{error} ++that implicitly call @b{signal}, enter the debugger prior to ++@i{signaling} the @i{condition}. ++ ++The @b{continue} @i{restart} can be used to continue with the normal ++@i{signaling} process when a break occurs process due to ++@b{*break-on-signals*}. ++ ++@subsubheading Examples:: ++ ++@example ++ *break-on-signals* @result{} NIL ++ (ignore-errors (error 'simple-error :format-control "Fooey!")) ++@result{} NIL, # ++ ++ (let ((*break-on-signals* 'error)) ++ (ignore-errors (error 'simple-error :format-control "Fooey!"))) ++@t{ |> } Break: Fooey! ++@t{ |> } BREAK entered because of *BREAK-ON-SIGNALS*. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Continue to signal. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Continue to signal. ++@result{} NIL, # ++ ++ (let ((*break-on-signals* 'error)) ++ (error 'simple-error :format-control "Fooey!")) ++@t{ |> } Break: Fooey! ++@t{ |> } BREAK entered because of *BREAK-ON-SIGNALS*. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Continue to signal. ++@t{ |> } 2: Top level. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Continue to signal. ++@t{ |> } Error: Fooey! ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Top level. ++@t{ |> } Debug> @b{|>>}@t{:CONTINUE 1}@b{<<|} ++@t{ |> } Top level. ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{break} ++, ++@ref{signal} ++, ++@ref{warn} ++, ++@ref{error} ++, ++@ref{typep} ++, ++@ref{Condition System Concepts} ++ ++@subsubheading Notes:: ++ ++@b{*break-on-signals*} is intended primarily for use in debugging code that ++does signaling. When setting @b{*break-on-signals*}, the user is ++encouraged to choose the most restrictive specification that suffices. ++Setting @b{*break-on-signals*} effectively violates the modular handling of ++@i{condition} signaling. In practice, the complete effect of setting ++@b{*break-on-signals*} might be unpredictable in some cases since the user ++might not be aware of the variety or number of calls to @b{signal} ++that are used in code called only incidentally. ++ ++@b{*break-on-signals*} enables an early entry to the debugger but such an ++entry does not preclude an additional entry to the debugger in the case of ++operations such as @b{error} and @b{cerror}. ++ ++@node handler-bind, handler-case, *break-on-signals*, Conditions Dictionary ++@subsection handler-bind [Macro] ++ ++@code{handler-bind} @i{@r{(}@{!@i{binding}@}*@r{)} ++ @{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{binding} ::=@r{(}type handler@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{type}---a @i{type specifier}. ++ ++@i{handler}---a @i{form}; evaluated to produce a @i{handler-function}. ++ ++@i{handler-function}---a @i{designator} for a @i{function} of one @i{argument}. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++Executes @i{forms} in a @i{dynamic environment} where the indicated ++@i{handler} @i{bindings} are in effect. ++ ++Each @i{handler} should evaluate to a @i{handler-function}, ++which is used to handle @i{conditions} of the given @i{type} ++during execution of the @i{forms}. This @i{function} should ++take a single argument, the @i{condition} being signaled. ++ ++If more than one @i{handler} @i{binding} is supplied, ++the @i{handler} @i{bindings} are searched sequentially from ++top to bottom in search of a match (by visual analogy with @b{typecase}). ++If an appropriate @i{type} is found, ++the associated handler is run in a @i{dynamic environment} where none of these ++@i{handler} bindings are visible (to avoid recursive errors). ++If the @i{handler} @i{declines}, the search continues for another @i{handler}. ++ ++If no appropriate @i{handler} is found, other @i{handlers} are sought ++from dynamically enclosing contours. If no @i{handler} is found outside, ++then @b{signal} returns or @b{error} enters the debugger. ++ ++@subsubheading Examples:: ++ ++In the following code, if an unbound variable error is ++signaled in the body (and not handled by an intervening handler), ++the first function is called. ++ ++@example ++ (handler-bind ((unbound-variable #'(lambda ...)) ++ (error #'(lambda ...))) ++ ...) ++@end example ++ ++If any other kind of error is signaled, the second function is called. ++In either case, neither handler is active while executing the code ++in the associated function. ++ ++@example ++ (defun trap-error-handler (condition) ++ (format *error-output* "~&~A~&" condition) ++ (throw 'trap-errors nil)) ++ ++ (defmacro trap-errors (&rest forms) ++ `(catch 'trap-errors ++ (handler-bind ((error #'trap-error-handler)) ++ ,@@forms))) ++ ++ (list (trap-errors (signal "Foo.") 1) ++ (trap-errors (error "Bar.") 2) ++ (+ 1 2)) ++@t{ |> } Bar. ++@result{} (1 NIL 3) ++@end example ++ ++Note that ``Foo.'' is not printed because the condition made ++by @b{signal} is a @i{simple condition}, which is not of @i{type} @b{error}, ++so it doesn't trigger the handler for @b{error} set up by @t{trap-errors}. ++ ++@subsubheading See Also:: ++ ++@ref{handler-case} ++ ++@node handler-case, ignore-errors, handler-bind, Conditions Dictionary ++@subsection handler-case [Macro] ++ ++@code{handler-case} @i{@i{expression} ++ [[@{!@i{error-clause}@}* | !@i{no-error-clause}]]} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{clause} ::=!@i{error-clause} | !@i{no-error-clause}} ++ ++@w{@i{error-clause} ::=@r{(}typespec @r{(}@t{[}var@t{]}@r{)} @{@i{declaration}@}* @{@i{form}@}*@r{)}} ++ ++@w{@i{no-error-clause} ::=@r{(}@t{:no-error} @i{lambda-list} @{@i{declaration}@}* @{@i{form}@}*@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{expression}---a @i{form}. ++ ++@i{typespec}---a @i{type specifier}. ++ ++@i{var}---a @i{variable} @i{name}. ++ ++@i{lambda-list}---an @i{ordinary lambda list}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@i{results}---In the normal situation, the values returned are those that result from ++ the evaluation of @i{expression}; ++ in the exceptional situation when control is transferred to a @i{clause}, ++ the value of the last @i{form} in that @i{clause} is returned. ++ ++@subsubheading Description:: ++ ++@b{handler-case} executes @i{expression} in a @i{dynamic environment} where ++various handlers are active. Each @i{error-clause} specifies how to ++handle a @i{condition} matching the indicated @i{typespec}. ++A @i{no-error-clause} allows the specification of a particular action ++if control returns normally. ++ ++If a @i{condition} is signaled for which there is an appropriate ++@i{error-clause} during the execution of @i{expression} ++(@i{i.e.}, one for which @t{(typep @i{condition} '@i{typespec})} ++returns @i{true}) and if there is no intervening handler for a ++@i{condition} of that @i{type}, then control is transferred to ++the body of the relevant @i{error-clause}. In this case, the ++dynamic state is unwound appropriately (so that the handlers established ++around the @i{expression} are no longer active), and @i{var} is bound to ++the @i{condition} that had been signaled. ++If more than one case is provided, those cases are made accessible ++in parallel. That is, in ++ ++@example ++ (handler-case @i{form} ++ (@i{typespec1} (@i{var1}) @i{form1}) ++ (@i{typespec2} (@i{var2}) @i{form2})) ++@end example ++ ++if the first @i{clause} (containing @i{form1}) has been selected, ++the handler for the second is no longer visible (or vice versa). ++ ++ The @i{clauses} ++are searched sequentially from top to bottom. If there is @i{type} ++ overlap between @i{typespecs}, ++the earlier of the @i{clauses} is selected. ++ ++ If @i{var} ++is not needed, it can be omitted. That is, a @i{clause} such as: ++ ++@example ++ (@i{typespec} (@i{var}) (declare (ignore @i{var})) @i{form}) ++@end example ++ ++can be written ++ @t{(@i{typespec} () @i{form})}. ++ ++ If there are no @i{forms} in a selected @i{clause}, the case, and therefore ++ @b{handler-case}, returns @b{nil}. ++ If execution of @i{expression} ++returns normally and no @i{no-error-clause} ++ exists, the values returned by ++@i{expression} are returned by @b{handler-case}. ++ If execution of ++@i{expression} returns normally and a @i{no-error-clause} ++ does exist, the values returned are used as arguments to the function ++ described by constructing ++ @t{(lambda @i{lambda-list} @{@i{form}@}*)} ++ from the @i{no-error-clause}, and the @i{values} of that function call are ++ returned by @b{handler-case}. ++The handlers which were established around the @i{expression} are no longer active at the time of this call. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun assess-condition (condition) ++ (handler-case (signal condition) ++ (warning () "Lots of smoke, but no fire.") ++ ((or arithmetic-error control-error cell-error stream-error) ++ (condition) ++ (format nil "~S looks especially bad." condition)) ++ (serious-condition (condition) ++ (format nil "~S looks serious." condition)) ++ (condition () "Hardly worth mentioning."))) ++@result{} ASSESS-CONDITION ++ (assess-condition (make-condition 'stream-error :stream *terminal-io*)) ++@result{} "# looks especially bad." ++ (define-condition random-condition (condition) () ++ (:report (lambda (condition stream) ++ (declare (ignore condition)) ++ (princ "Yow" stream)))) ++@result{} RANDOM-CONDITION ++ (assess-condition (make-condition 'random-condition)) ++@result{} "Hardly worth mentioning." ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{handler-bind} ++, ++@ref{ignore-errors} ++, ++@ref{Condition System Concepts} ++ ++@subsubheading Notes:: ++ ++@example ++ (handler-case form ++ (@i{type1} (@i{var1}) . @i{body1}) ++ (@i{type2} (@i{var2}) . @i{body2}) ...) ++@end example ++ ++is approximately equivalent to: ++ ++@example ++ (block #1=#:g0001 ++ (let ((#2=#:g0002 nil)) ++ (tagbody ++ (handler-bind ((@i{type1} #'(lambda (temp) ++ (setq #1# temp) ++ (go #3=#:g0003))) ++ (@i{type2} #'(lambda (temp) ++ (setq #2# temp) ++ (go #4=#:g0004))) ...) ++ (return-from #1# form)) ++ #3# (return-from #1# (let ((@i{var1} #2#)) . @i{body1})) ++ #4# (return-from #1# (let ((@i{var2} #2#)) . @i{body2})) ...))) ++@end example ++ ++@example ++ (handler-case form ++ (@i{type1} @i{(var1)} . @i{body1}) ++ ... ++ (:no-error (@i{varN-1} @i{varN-2} ...) . @i{bodyN})) ++@end example ++ ++is approximately equivalent to: ++ ++@example ++ ++ (block #1=#:error-return ++ (multiple-value-call #'(lambda (@i{varN-1} @i{varN-2} ...) . @i{bodyN}) ++ (block #2=#:normal-return ++ (return-from #1# ++ (handler-case (return-from #2# form) ++ (@i{type1} (@i{var1}) . @i{body1}) ...))))) ++@end example ++ ++@node ignore-errors, define-condition, handler-case, Conditions Dictionary ++@subsection ignore-errors [Macro] ++ ++@code{ignore-errors} @i{@{@i{form}@}*} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---In the normal situation, ++ the @i{values} of the @i{forms} are returned; ++ in the exceptional situation, ++ two values are returned: @b{nil} and the @i{condition}. ++ ++@subsubheading Description:: ++ ++@b{ignore-errors} is used to prevent @i{conditions} of @i{type} @b{error} ++from causing entry into the debugger. ++ ++Specifically, @b{ignore-errors} @i{executes} @i{forms} ++in a @i{dynamic environment} where a @i{handler} for ++@i{conditions} of @i{type} @b{error} has been established; ++if invoked, it @i{handles} such @i{conditions} by ++returning two @i{values}, @b{nil} and the @i{condition} that was @i{signaled}, ++from the @b{ignore-errors} @i{form}. ++ ++If a @i{normal return} from the @i{forms} occurs, ++any @i{values} returned are returned by @b{ignore-errors}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun load-init-file (program) ++ (let ((win nil)) ++ (ignore-errors ;if this fails, don't enter debugger ++ (load (merge-pathnames (make-pathname :name program :type :lisp) ++ (user-homedir-pathname))) ++ (setq win t)) ++ (unless win (format t "~&Init file failed to load.~ ++ win)) ++ ++ (load-init-file "no-such-program") ++@t{ |> } Init file failed to load. ++NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{handler-case} ++, @ref{Condition System Concepts} ++ ++@subsubheading Notes:: ++ ++@example ++ (ignore-errors . @i{forms}) ++@end example ++ ++ is equivalent to: ++ ++@example ++ (handler-case (progn . @i{forms}) ++ (error (condition) (values nil condition))) ++@end example ++ ++Because the second return value is a @i{condition} ++in the exceptional case, it is common (but not required) to arrange ++for the second return value in the normal case to be missing or @b{nil} so ++that the two situations can be distinguished. ++ ++@node define-condition, make-condition, ignore-errors, Conditions Dictionary ++@subsection define-condition [Macro] ++ ++[Editorial Note by KMP: This syntax stuff is still very confused and needs lots of work.] ++ ++@code{define-condition} @i{name @r{(}@{@i{parent-type}@}*@r{)} ++ @r{(}@{!@i{slot-spec}@}*@r{)} ++ @{@i{option}@}*}@* ++ @result{} @i{name} ++ ++@w{@i{slot-spec} ::=slot-name | @r{(}slot-name !@i{slot-option}@r{)}} ++ ++@w{@i{slot-option} ::=[[ @{@t{:reader} @i{symbol}@}* | } ++@w{ @{@t{:writer} !@i{function-name}@}* | } ++@w{ @{@t{:accessor} @i{symbol}@}* | } ++@w{ @{@t{:allocation} !@i{allocation-type}@} | } ++@w{ @{@t{:initarg} @i{symbol}@}* | } ++@w{ @{@t{:initform} @i{form}@} | } ++@w{ @{@t{:type} @i{type-specifier}@} ]]} ++ ++@w{@i{option} ::=[[ @r{(}@t{:default-initargs} @t{.} @i{initarg-list}@r{)} | } ++@w{ @r{(}@t{:documentation} @i{string}@r{)} | } ++@w{ @r{(}@t{:report} @i{report-name}@r{)} ]]} ++ ++@w{@i{function-name} ::=@{@i{symbol} | @t{(setf @i{symbol})}@}} ++ ++@w{@i{allocation-type} ::=@t{:instance} | @t{:class}} ++ ++@w{@i{report-name} ::=@i{string} | @i{symbol} | @i{lambda expression}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{parent-type}---a @i{symbol} naming a @i{condition} @i{type}. ++ If no @i{parent-types} are supplied, ++ the @i{parent-types} default to @t{(condition)}. ++ ++@i{default-initargs}---a @i{list} of @i{keyword/value pairs}. ++ ++[Editorial Note by KMP: This is all mixed up as to which is a slot option and which is ++ a main option. I'll sort that out. Also, some of this is implied ++ by the bnf and needn't be stated explicitly.] ++ ++@i{Slot-spec} -- the @i{name} of a @i{slot} or a @i{list} ++consisting of the @i{slot-name} followed by zero or more @i{slot-options}. ++ ++@i{Slot-name} -- a slot name (a @i{symbol}), ++the @i{list} of a slot name, or the ++@i{list} of slot name/slot form pairs. ++ ++@i{Option} -- Any of the following: ++ ++@table @asis ++ ++@item @t{:reader} ++@t{:reader} can be supplied more than once for a given @i{slot} ++and cannot be @b{nil}. ++ ++@item @t{:writer} ++@t{:writer} can be supplied more than once for a given @i{slot} ++and must name a @i{generic function}. ++ ++@item @t{:accessor} ++@t{:accessor} can be supplied more than once for a given @i{slot} ++and cannot be @b{nil}. ++ ++@item @t{:allocation} ++@t{:allocation} can be supplied once at most for a given @i{slot}. ++The default if @t{:allocation} is not supplied is @t{:instance}. ++ ++@item @t{:initarg} ++@t{:initarg} can be supplied more than once for a given @i{slot}. ++ ++@item @t{:initform} ++@t{:initform} can be supplied once at most for a given @i{slot}. ++ ++@item @t{:type} ++@t{:type} can be supplied once at most for a given @i{slot}. ++ ++@item @t{:documentation} ++@t{:documentation} can be supplied once at most for a given @i{slot}. ++ ++@item @t{:report} ++@t{:report} can be supplied once at most. ++ ++@end table ++ ++@subsubheading Description:: ++ ++@b{define-condition} defines a new condition type called @i{name}, ++which is a @i{subtype} of ++ ++the @i{type} or @i{types} named by ++ @i{parent-type}. ++Each @i{parent-type} argument specifies a direct @i{supertype} ++of the new @i{condition}. The new @i{condition} ++inherits @i{slots} and @i{methods} from each of its direct ++@i{supertypes}, and so on. ++ ++ If a slot name/slot form pair is supplied, ++the slot form is a @i{form} that ++can be evaluated by @b{make-condition} to ++ produce a default value when an explicit value is not provided. If no ++slot form ++is supplied, the contents of the @i{slot} ++is initialized in an ++ @i{implementation-dependent} way. ++ ++ If the @i{type} being defined and some other ++@i{type} from which it inherits ++ have a slot by the same name, only one slot is allocated in the ++ @i{condition}, ++but the supplied slot form overrides any slot form ++ that might otherwise have been inherited from a @i{parent-type}. If no ++slot form is supplied, the inherited slot form (if any) is still visible. ++ ++Accessors are created according to the same rules as used by ++@b{defclass}. ++ ++A description of @i{slot-options} follows: ++ ++@table @asis ++ ++@item @t{:reader} ++The @t{:reader} slot option specifies that an @i{unqualified method} is ++to be defined on the @i{generic function} named by the argument ++to @t{:reader} to read the value of the given @i{slot}. ++ ++@item @t{*} ++The @t{:initform} slot option is used to provide a default ++initial value form to be used in the initialization of the @i{slot}. This ++@i{form} is evaluated every time it is used to initialize the ++@i{slot}. The ++@i{lexical environment} ++in which this @i{form} is evaluated is the lexical ++@i{environment} in which the @b{define-condition} ++form was evaluated. ++Note that the @i{lexical environment} refers both to variables and to ++@i{functions}. ++For @i{local slots}, the @i{dynamic environment} is the dynamic ++@i{environment} ++in which @b{make-condition} was called; for ++@i{shared slots}, the @i{dynamic environment} ++is the @i{dynamic environment} in which the ++@b{define-condition} form was evaluated. ++ ++[Reviewer Note by Barmar: Issue CLOS-CONDITIONS doesn't say this.] ++No implementation is permitted to extend the syntax of @b{define-condition} ++to allow @t{(@i{slot-name} @i{form})} as an abbreviation for ++@t{(@i{slot-name} :initform @i{form})}. ++ ++@item @t{:initarg} ++The @t{:initarg} slot option declares an initialization ++argument named by its @i{symbol} argument ++and specifies that this ++initialization argument initializes the given @i{slot}. If the ++initialization argument has a value in the call to ++@b{initialize-instance}, the value is stored into the given @i{slot}, ++and the slot's @t{:initform} slot option, if any, is not ++evaluated. If none of the initialization arguments specified for a ++given @i{slot} has a value, the @i{slot} is initialized according to the ++@t{:initform} slot option, if specified. ++ ++@item @t{:type} ++The @t{:type} slot option specifies that the contents of the ++@i{slot} is always of the specified @i{type}. It effectively ++declares the result type of the reader generic function when applied ++to an @i{object} of this @i{condition} type. ++The consequences of attempting to store in a ++@i{slot} a value that ++does not satisfy the type of the @i{slot} is undefined. ++ ++@item @t{:default-initargs} ++ ++[Editorial Note by KMP: This is an option, not a slot option.] ++ ++This option is treated the same as it would be @b{defclass}. ++ ++@item @t{:documentation} ++ ++[Editorial Note by KMP: This is both an option and a slot option.] ++ ++The @t{:documentation} slot option provides a @i{documentation string} ++for the @i{slot}. ++ ++@item @t{:report} ++ ++[Editorial Note by KMP: This is an option, not a slot option.] ++ ++@i{Condition} reporting is mediated through the @b{print-object} ++method for the @i{condition} type in question, with @b{*print-escape*} ++always being @b{nil}. Specifying @t{(:report @i{report-name})} ++in the definition of a condition type @t{C} is equivalent to: ++ ++@example ++ (defmethod print-object ((x c) stream) ++ (if *print-escape* (call-next-method) (@i{report-name} x stream))) ++@end example ++ ++ If the value supplied by the argument to @t{:report} (@i{report-name}) ++is a @i{symbol} or a @i{lambda expression}, ++it must be acceptable to ++ @b{function}. @t{(function @i{report-name})} ++is evaluated ++ in the current @i{lexical environment}. ++It should return a @i{function} ++of two ++ arguments, a @i{condition} and a @i{stream}, ++that prints on the @i{stream} a ++ description of the @i{condition}. ++ This @i{function} is called whenever the ++ @i{condition} is printed while @b{*print-escape*} is @b{nil}. ++ ++If @i{report-name} is a @i{string}, it is a shorthand for ++ ++@example ++ (lambda (condition stream) ++ (declare (ignore condition)) ++ (write-string @i{report-name} stream)) ++@end example ++ ++This option is processed after the new @i{condition} type has been defined, ++so use of the @i{slot} accessors within the @t{:report} function is permitted. ++If this option is not supplied, information about how to report this ++type of @i{condition} is inherited from the @i{parent-type}. ++ ++@end table ++ ++The consequences are unspecifed if an attempt is made to @i{read} a ++@i{slot} that has not been explicitly initialized and that has not ++been given a default value. ++ ++The consequences are unspecified if an attempt is made to assign the ++@i{slots} by using @b{setf}. ++ ++If a @b{define-condition} @i{form} appears as a @i{top level form}, ++the @i{compiler} must make @i{name} recognizable as a valid @i{type} name, ++and it must be possible to reference the @i{condition} @i{type} as the ++@i{parent-type} of another @i{condition} @i{type} in a subsequent ++@b{define-condition} @i{form} in the @i{file} being compiled. ++ ++@subsubheading Examples:: ++ ++The following form defines a condition of @i{type} ++@t{peg/hole-mismatch} which inherits from a condition type ++called @t{blocks-world-error}: ++ ++@example ++(define-condition peg/hole-mismatch ++ (blocks-world-error) ++ ((peg-shape :initarg :peg-shape ++ :reader peg/hole-mismatch-peg-shape) ++ (hole-shape :initarg :hole-shape ++ :reader peg/hole-mismatch-hole-shape)) ++ (:report (lambda (condition stream) ++ (format stream "A ~A peg cannot go in a ~A hole." ++ (peg/hole-mismatch-peg-shape condition) ++ (peg/hole-mismatch-hole-shape condition))))) ++@end example ++ ++The new type has slots @t{peg-shape} and @t{hole-shape}, ++so @b{make-condition} accepts @t{:peg-shape} and @t{:hole-shape} keywords. ++The @i{readers} @t{peg/hole-mismatch-peg-shape} and @t{peg/hole-mismatch-hole-shape} ++apply to objects of this type, as illustrated in the @t{:report} information. ++ ++The following form defines a @i{condition} @i{type} named @t{machine-error} ++which inherits from @b{error}: ++ ++@example ++(define-condition machine-error ++ (error) ++ ((machine-name :initarg :machine-name ++ :reader machine-error-machine-name)) ++ (:report (lambda (condition stream) ++ (format stream "There is a problem with ~A." ++ (machine-error-machine-name condition))))) ++@end example ++ ++Building on this definition, a new error condition can be defined which ++is a subtype of @t{machine-error} for use when machines are not available: ++ ++@example ++(define-condition machine-not-available-error (machine-error) () ++ (:report (lambda (condition stream) ++ (format stream "The machine ~A is not available." ++ (machine-error-machine-name condition))))) ++@end example ++ ++This defines a still more specific condition, built upon ++@t{machine-not-available-error}, which provides a slot initialization form ++for @t{machine-name} but which does not provide any new slots or report ++information. It just gives the @t{machine-name} slot a default initialization: ++ ++@example ++(define-condition my-favorite-machine-not-available-error ++ (machine-not-available-error) ++ ((machine-name :initform "mc.lcs.mit.edu"))) ++@end example ++ ++Note that since no @t{:report} clause was given, the information ++inherited from @t{machine-not-available-error} is used to ++report this type of condition. ++ ++@example ++ (define-condition ate-too-much (error) ++ ((person :initarg :person :reader ate-too-much-person) ++ (weight :initarg :weight :reader ate-too-much-weight) ++ (kind-of-food :initarg :kind-of-food ++ :reader :ate-too-much-kind-of-food))) ++@result{} ATE-TOO-MUCH ++ (define-condition ate-too-much-ice-cream (ate-too-much) ++ ((kind-of-food :initform 'ice-cream) ++ (flavor :initarg :flavor ++ :reader ate-too-much-ice-cream-flavor ++ :initform 'vanilla )) ++ (:report (lambda (condition stream) ++ (format stream "~A ate too much ~A ice-cream" ++ (ate-too-much-person condition) ++ (ate-too-much-ice-cream-flavor condition))))) ++@result{} ATE-TOO-MUCH-ICE-CREAM ++ (make-condition 'ate-too-much-ice-cream ++ :person 'fred ++ :weight 300 ++ :flavor 'chocolate) ++@result{} # ++ (format t "~A" *) ++@t{ |> } FRED ate too much CHOCOLATE ice-cream ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{make-condition} ++, ++@ref{defclass} ++, @ref{Condition System Concepts} ++ ++@node make-condition, restart, define-condition, Conditions Dictionary ++@subsection make-condition [Function] ++ ++@code{make-condition} @i{type @r{&rest} slot-initializations} @result{} @i{condition} ++ ++@subsubheading Arguments and Values:: ++ ++@i{type}---a @i{type specifier} (for a @i{subtype} of @b{condition}). ++ ++@i{slot-initializations}---an @i{initialization argument list}. ++ ++@i{condition}---a @i{condition}. ++ ++@subsubheading Description:: ++ ++Constructs and returns a @i{condition} of type @i{type} ++using @i{slot-initializations} for the initial values of the slots. ++The newly created @i{condition} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (defvar *oops-count* 0) ++ ++ (setq a (make-condition 'simple-error ++ :format-control "This is your ~:R error." ++ :format-arguments (list (incf *oops-count*)))) ++@result{} # ++ ++ (format t "~&~A~ ++@t{ |> } This is your first error. ++@result{} NIL ++ ++ (error a) ++@t{ |> } Error: This is your first error. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Return to Lisp Toplevel. ++@t{ |> } Debug> ++@end example ++ ++@subsubheading Affected By:: ++ ++The set of defined @i{condition} @i{types}. ++ ++@subsubheading See Also:: ++ ++@ref{define-condition} ++, @ref{Condition System Concepts} ++ ++@node restart, compute-restarts, make-condition, Conditions Dictionary ++@subsection restart [System Class] ++ ++@subsubheading Class Precedence List:: ++@b{restart}, ++@b{t} ++ ++@subsubheading Description:: ++ ++An @i{object} of @i{type} @b{restart} represents a @i{function} that can be ++called to perform some form of recovery action, usually a transfer of control ++to an outer point in the running program. ++ ++An @i{implementation} is free to implement a @i{restart} in whatever ++manner is most convenient; a @i{restart} has only @i{dynamic extent} ++relative to the scope of the binding @i{form} which @i{establishes} it. ++ ++@node compute-restarts, find-restart, restart, Conditions Dictionary ++@subsection compute-restarts [Function] ++ ++@code{compute-restarts} @i{@r{&optional} condition} @result{} @i{restarts} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition}---a @i{condition} @i{object}, or @b{nil}. ++ ++@i{restarts}---a @i{list} of @i{restarts}. ++ ++@subsubheading Description:: ++ ++@b{compute-restarts} uses the dynamic state of the program to compute ++a @i{list} of the @i{restarts} which are currently active. ++ ++The resulting @i{list} is ordered so that the innermost ++(more-recently established) restarts are nearer the head of the @i{list}. ++ ++When @i{condition} is @i{non-nil}, only those @i{restarts} ++are considered that are either explicitly associated with that @i{condition}, ++or not associated with any @i{condition}; that is, the excluded @i{restarts} ++are those that are associated with a non-empty set of @i{conditions} of ++which the given @i{condition} is not an @i{element}. ++If @i{condition} is @b{nil}, all @i{restarts} are considered. ++ ++@b{compute-restarts} returns all ++@i{applicable restarts}, ++including anonymous ones, even if some of them have the same name as ++others and would therefore not be found by @b{find-restart} ++when given a @i{symbol} argument. ++ ++Implementations are permitted, but not required, to return @i{distinct} ++@i{lists} from repeated calls to @b{compute-restarts} while in ++the same dynamic environment. ++The consequences are undefined if the @i{list} returned by ++@b{compute-restarts} is every modified. ++ ++@subsubheading Examples:: ++ ++@example ++ ;; One possible way in which an interactive debugger might present ++ ;; restarts to the user. ++ (defun invoke-a-restart () ++ (let ((restarts (compute-restarts))) ++ (do ((i 0 (+ i 1)) (r restarts (cdr r))) ((null r)) ++ (format t "~&~D: ~A~ ++ (let ((n nil) (k (length restarts))) ++ (loop (when (and (typep n 'integer) (>= n 0) (< n k)) ++ (return t)) ++ (format t "~&Option: ") ++ (setq n (read)) ++ (fresh-line)) ++ (invoke-restart-interactively (nth n restarts))))) ++ ++ (restart-case (invoke-a-restart) ++ (one () 1) ++ (two () 2) ++ (nil () :report "Who knows?" 'anonymous) ++ (one () 'I) ++ (two () 'II)) ++@t{ |> } 0: ONE ++@t{ |> } 1: TWO ++@t{ |> } 2: Who knows? ++@t{ |> } 3: ONE ++@t{ |> } 4: TWO ++@t{ |> } 5: Return to Lisp Toplevel. ++@t{ |> } Option: @b{|>>}@t{4}@b{<<|} ++@result{} II ++ ++ ;; Note that in addition to user-defined restart points, COMPUTE-RESTARTS ++ ;; also returns information about any system-supplied restarts, such as ++ ;; the "Return to Lisp Toplevel" restart offered above. ++ ++@end example ++ ++@subsubheading Affected By:: ++ ++Existing restarts. ++ ++@subsubheading See Also:: ++ ++@ref{find-restart} ++, ++@ref{invoke-restart} ++, ++@ref{restart-bind} ++ ++@node find-restart, invoke-restart, compute-restarts, Conditions Dictionary ++@subsection find-restart [Function] ++ ++@code{find-restart} @i{identifier @r{&optional} condition} ++ @r{restart} ++ ++@subsubheading Arguments and Values:: ++ ++@i{identifier}---a @i{non-nil} @i{symbol}, or a @i{restart}. ++ ++@i{condition}---a @i{condition} @i{object}, or @b{nil}. ++ ++@i{restart}---a @i{restart} or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{find-restart} searches for a particular @i{restart} in the ++current @i{dynamic environment}. ++ ++When @i{condition} is @i{non-nil}, only those @i{restarts} ++are considered that are either explicitly associated with that @i{condition}, ++or not associated with any @i{condition}; that is, the excluded @i{restarts} ++are those that are associated with a non-empty set of @i{conditions} of ++which the given @i{condition} is not an @i{element}. ++If @i{condition} is @b{nil}, all @i{restarts} are considered. ++ ++If @i{identifier} is a @i{symbol}, then the innermost ++(most recently established) @i{applicable restart} with that @i{name} is returned. ++@b{nil} is returned if no such restart is found. ++ ++If @i{identifier} is a currently active restart, then it is returned. ++Otherwise, @b{nil} is returned. ++ ++@subsubheading Examples:: ++ ++@example ++ (restart-case ++ (let ((r (find-restart 'my-restart))) ++ (format t "~S is named ~S" r (restart-name r))) ++ (my-restart () nil)) ++@t{ |> } # is named MY-RESTART ++@result{} NIL ++ (find-restart 'my-restart) ++@result{} NIL ++@end example ++ ++@subsubheading Affected By:: ++ ++Existing restarts. ++ ++@b{restart-case}, @b{restart-bind}, @b{with-condition-restarts}. ++ ++@subsubheading See Also:: ++ ++@ref{compute-restarts} ++ ++@subsubheading Notes:: ++ ++@example ++ (find-restart @i{identifier}) ++ @equiv{} (find @i{identifier} (compute-restarts) :key :restart-name) ++@end example ++ ++Although anonymous restarts have a name of @b{nil}, ++the consequences are unspecified if @b{nil} is given as an @i{identifier}. ++Occasionally, programmers lament that @b{nil} is not permissible as an ++@i{identifier} argument. In most such cases, @b{compute-restarts} ++can probably be used to simulate the desired effect. ++ ++@node invoke-restart, invoke-restart-interactively, find-restart, Conditions Dictionary ++@subsection invoke-restart [Function] ++ ++@code{invoke-restart} @i{restart @r{&rest} arguments} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{restart}---a @i{restart designator}. ++ ++@i{argument}---an @i{object}. ++ ++@i{results}---the @i{values} returned by the @i{function} ++ associated with @i{restart}, if that @i{function} returns. ++ ++@subsubheading Description:: ++ ++Calls the @i{function} associated with @i{restart}, ++passing @i{arguments} to it. ++@i{Restart} must be valid in the current @i{dynamic environment}. ++ ++@subsubheading Examples:: ++@example ++ (defun add3 (x) (check-type x number) (+ x 3)) ++ ++ (foo 'seven) ++@t{ |> } Error: The value SEVEN was not of type NUMBER. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a different value to use. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{(invoke-restart 'store-value 7)}@b{<<|} ++@result{} 10 ++@end example ++ ++@subsubheading Side Effects:: ++ ++A non-local transfer of control might be done by the restart. ++ ++@subsubheading Affected By:: ++ ++Existing restarts. ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{restart} is not valid, an error of @i{type} @b{control-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{find-restart} ++, ++@ref{restart-bind} ++, ++@ref{restart-case} ++, ++@ref{invoke-restart-interactively} ++ ++@subsubheading Notes:: ++ ++The most common use for @b{invoke-restart} is in a @i{handler}. ++It might be used explicitly, or implicitly through @b{invoke-restart-interactively} ++or a @i{restart function}. ++ ++@i{Restart functions} call @b{invoke-restart}, not vice versa. That is, ++@i{invoke-restart} provides primitive functionality, and @i{restart functions} ++are non-essential ``syntactic sugar.'' ++ ++@node invoke-restart-interactively, restart-bind, invoke-restart, Conditions Dictionary ++@subsection invoke-restart-interactively [Function] ++ ++@code{invoke-restart-interactively} @i{restart} @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{restart}---a @i{restart designator}. ++ ++@i{results}---the @i{values} returned by the @i{function} ++ associated with @i{restart}, if that @i{function} returns. ++ ++@subsubheading Description:: ++ ++@b{invoke-restart-interactively} calls the @i{function} associated ++with @i{restart}, prompting for any necessary arguments. ++If @i{restart} is a name, it must be valid in the current @i{dynamic environment}. ++ ++ @b{invoke-restart-interactively} ++prompts for arguments by executing ++ the code provided in the @t{:interactive} keyword to ++@b{restart-case} or ++ @t{:interactive-function} keyword to @b{restart-bind}. ++ ++If no such options have been supplied in the corresponding ++@b{restart-bind} or @b{restart-case}, ++then the consequences are undefined if the @i{restart} takes ++ required arguments. If the arguments are optional, an argument list of ++ @b{nil} is used. ++ ++ Once the arguments have been determined, ++@b{invoke-restart-interactively} ++ executes the following: ++ ++@example ++ (apply #'invoke-restart @i{restart} @i{arguments}) ++@end example ++ ++@subsubheading Examples:: ++ ++@example ++ (defun add3 (x) (check-type x number) (+ x 3)) ++ ++ (add3 'seven) ++@t{ |> } Error: The value SEVEN was not of type NUMBER. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a different value to use. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{(invoke-restart-interactively 'store-value)}@b{<<|} ++@t{ |> } Type a form to evaluate and use: @b{|>>}@t{7}@b{<<|} ++@result{} 10 ++@end example ++ ++@subsubheading Side Effects:: ++ ++If prompting for arguments is necesary, ++some typeout may occur (on @i{query I/O}). ++ ++A non-local transfer of control might be done by the restart. ++ ++@subsubheading Affected By:: ++ ++@b{*query-io*}, active @i{restarts} ++ ++@subsubheading Exceptional Situations:: ++ ++If @i{restart} is not valid, an error of @i{type} @b{control-error} ++is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{find-restart} ++, ++@ref{invoke-restart} ++, ++@ref{restart-case} ++, ++@ref{restart-bind} ++ ++@subsubheading Notes:: ++ ++@b{invoke-restart-interactively} is used internally by the debugger ++and may also be useful in implementing other portable, interactive debugging ++tools. ++ ++@node restart-bind, restart-case, invoke-restart-interactively, Conditions Dictionary ++@subsection restart-bind [Macro] ++ ++@code{restart-bind} @i{@r{(}@{@r{(}name function ++ @{!@i{key-val-pair}@}*@r{)}@}@r{)} ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@w{@i{key-val-pair} ::=@t{:interactive-function} @r{interactive-function} | } ++@w{ @t{:report-function} @r{report-function} | } ++@w{ @t{:test-function} @r{test-function}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}; not evaluated. ++ ++@i{function}---a @i{form}; evaluated. ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{interactive-function}---a @i{form}; evaluated. ++ ++@i{report-function}---a @i{form}; evaluated. ++ ++@i{test-function}---a @i{form}; evaluated. ++ ++@i{results}---the @i{values} returned by the @i{forms}. ++ ++@subsubheading Description:: ++ ++@b{restart-bind} executes the body of @i{forms} ++in a @i{dynamic environment} where @i{restarts} with the given @i{names} are in effect. ++ ++If a @i{name} is @b{nil}, it indicates an anonymous restart; ++if a @i{name} is a @i{non-nil} @i{symbol}, it indicates a named restart. ++ ++The @i{function}, @i{interactive-function}, and @i{report-function} ++are unconditionally evaluated in the current lexical and dynamic environment ++prior to evaluation of the body. Each of these @i{forms} must evaluate to ++a @i{function}. ++ ++If @b{invoke-restart} is done on that restart, ++the @i{function} which resulted from evaluating @i{function} ++is called, in the @i{dynamic environment} of the @b{invoke-restart}, ++with the @i{arguments} given to @b{invoke-restart}. ++The @i{function} may either perform a non-local transfer of control or may return normally. ++ ++If the restart is invoked interactively from the debugger ++(using @b{invoke-restart-interactively}), ++the arguments are defaulted by calling the @i{function} ++which resulted from evaluating @i{interactive-function}. ++That @i{function} may optionally prompt interactively on @i{query I/O}, ++and should return a @i{list} of arguments to be used by ++@b{invoke-restart-interactively} when invoking the restart. ++ ++If a restart is invoked interactively but no @i{interactive-function} is used, ++then an argument list of @b{nil} is used. In that case, the @i{function} ++must be compatible with an empty argument list. ++ ++If the restart is presented interactively (@i{e.g.}, by the debugger), ++the presentation is done by calling the @i{function} which resulted ++from evaluating @i{report-function}. ++This @i{function} must be a @i{function} of one argument, a @i{stream}. ++It is expected to print a description of the action that the restart takes ++to that @i{stream}. ++This @i{function} is called any time the restart is printed ++while @b{*print-escape*} is @b{nil}. ++ ++In the case of interactive invocation, ++the result is dependent on the value of @t{:interactive-function} ++as follows. ++ ++@table @asis ++ ++@item @t{:interactive-function} ++@i{Value} is evaluated in the current lexical environment and ++ should return a @i{function} of no arguments which constructs a ++ @i{list} of arguments to be used by @b{invoke-restart-interactively} ++ when invoking this restart. The @i{function} may prompt interactively ++ using @i{query I/O} if necessary. ++ ++@item @t{:report-function} ++@i{Value} is evaluated in the current lexical environment and ++ should return a @i{function} of one argument, a @i{stream}, which ++ prints on the @i{stream} a summary of the action that this restart ++ takes. This @i{function} is called whenever the restart is ++ reported (printed while @b{*print-escape*} is @b{nil}). ++ If no @t{:report-function} option is provided, the manner in which the ++ @i{restart} is reported is @i{implementation-dependent}. ++ ++@item @t{:test-function} ++@i{Value} is evaluated in the current lexical environment and ++ should return a @i{function} of one argument, a @i{condition}, which ++ returns @i{true} if the restart is to be considered visible. ++ ++@end table ++ ++@subsubheading Affected By:: ++ ++@b{*query-io*}. ++ ++@subsubheading See Also:: ++ ++@ref{restart-case} ++, ++@ref{with-simple-restart} ++ ++@subsubheading Notes:: ++ ++@b{restart-bind} is primarily intended to be used to implement ++@b{restart-case} and might be useful in implementing other ++macros. Programmers who are uncertain about whether to use @b{restart-case} ++or @b{restart-bind} should prefer @b{restart-case} for the cases where ++it is powerful enough, using @b{restart-bind} only in cases where its full ++generality is really needed. ++ ++@node restart-case, restart-name, restart-bind, Conditions Dictionary ++@subsection restart-case [Macro] ++ ++@code{restart-case} @i{restartable-form @r{@{!@i{clause}@}}} @result{} @i{@{@i{result}@}*} ++ ++@w{@i{clause} ::=@r{(} case-name lambda-list } ++@w{ [[@t{:interactive} interactive-expression | @t{:report} report-expression | @t{:test} test-expression]] } ++@w{ @{@i{declaration}@}* @{@i{form}@}*@r{)}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{restartable-form}---a @i{form}. ++ ++@i{case-name}---a @i{symbol} or @b{nil}. ++ ++@i{lambda-list}---an @i{ordinary lambda list}. ++ ++@i{interactive-expression}---a @i{symbol} or a @i{lambda expression}. ++ ++@i{report-expression}---a @i{string}, ++ a @i{symbol}, ++ or a @i{lambda expression}. ++ ++@i{test-expression}---a @i{symbol} or a @i{lambda expression}. ++ ++@i{declaration}---a @b{declare} @i{expression}; not evaluated. ++ ++@i{form}---a @i{form}. ++ ++@i{results}---the @i{values} resulting from the @i{evaluation} ++ of @i{restartable-form}, ++ or the @i{values} returned by the last @i{form} ++ executed in a chosen @i{clause}, ++ or @b{nil}. ++ ++@subsubheading Description:: ++ ++@b{restart-case} evaluates @i{restartable-form} in a @i{dynamic environment} ++where the clauses have special meanings as points to which control may be transferred. ++If @i{restartable-form} finishes executing and returns any values, ++all values returned are returned by @b{restart-case} and ++processing has completed. While @i{restartable-form} is executing, any code may ++ transfer control to one of the clauses (see @b{invoke-restart}). ++If a transfer ++ occurs, the forms in the body of that clause is evaluated and any values ++ returned by the last such form are returned by ++@b{restart-case}. ++In this case, the ++dynamic state is unwound appropriately (so that the restarts established ++around the @i{restartable-form} are no longer active) prior to execution of the ++clause. ++ ++ If there are no @i{forms} ++in a selected clause, @b{restart-case} returns @b{nil}. ++ ++If @i{case-name} is a @i{symbol}, it names this restart. ++ ++It is possible to have more than one clause use the same @i{case-name}. ++In this case, the first clause with that name is found by @b{find-restart}. ++The other clauses are accessible using @b{compute-restarts}. ++ ++Each @i{arglist} is an @i{ordinary lambda list} to be bound during the ++execution of its corresponding @i{forms}. These parameters are used ++by the @b{restart-case} clause to receive any necessary data from a call ++to @b{invoke-restart}. ++ ++By default, @b{invoke-restart-interactively} passes no arguments and ++all arguments must be optional in order to accomodate interactive ++restarting. However, the arguments need not be optional if the ++@t{:interactive} ++keyword has been used to inform @b{invoke-restart-interactively} ++ about how to compute a proper argument list. ++ ++@i{Keyword} options have the following meaning. ++@table @asis ++ ++@item @t{:interactive} ++The @i{value} supplied by @t{:interactive @i{value}} ++must be a suitable argument to @b{function}. ++@t{(function @i{value})} is evaluated in the current lexical ++ environment. It should return a @i{function} of no arguments which ++ returns arguments to be used by ++@b{invoke-restart-interactively} when it is invoked. ++@b{invoke-restart-interactively} ++is called in the dynamic ++ environment available prior to any restart attempt, and uses ++@i{query I/O} for user interaction. ++ ++ If a restart is invoked interactively but no @t{:interactive} option ++ was supplied, the argument list used in the invocation is the empty ++ list. ++ ++@item @t{:report} ++If the @i{value} supplied by @t{:report @i{value}} ++is a @i{lambda expression} or a @i{symbol}, it ++must be acceptable to @b{function}. ++@t{(function @i{value})} is evaluated in the current lexical ++environment. It should return a @i{function} of one ++argument, a @i{stream}, which prints on the @i{stream} a ++description of the restart. This @i{function} is called ++whenever the restart is printed while @b{*print-escape*} is @b{nil}. ++ ++If @i{value} is a @i{string}, it is a shorthand for ++ ++@example ++ (lambda (stream) (write-string value stream)) ++@end example ++ ++ If a named restart is asked to report but no report information has been ++ supplied, the name of the restart is used in generating default report text. ++ ++ When @b{*print-escape*} is @b{nil}, the ++printer uses the report information for ++ a restart. For example, a debugger might announce the action of typing ++ a ``continue'' command by: ++ ++@example ++ (format t "~&~S -- ~A~ ++@end example ++ ++ which might then display as something like: ++ ++@example ++ :CONTINUE -- Return to command level ++@end example ++ ++The consequences are unspecified if an unnamed restart is specified ++but no @t{:report} option is provided. ++ ++@item @t{:test} ++The @i{value} supplied by @t{:test @i{value}} ++must be a suitable argument to @b{function}. ++@t{(function @i{value})} is evaluated in the current lexical ++ environment. It should return a @i{function} of one @i{argument}, the ++@i{condition}, that ++returns @i{true} if the restart is to be considered visible. ++ ++The default for this option is equivalent to @t{(lambda (c) (declare (ignore c)) t)}. ++ ++@end table ++ ++If the @i{restartable-form} is a @i{list} whose @i{car} is any of ++the @i{symbols} @b{signal}, @b{error}, @b{cerror}, ++or @b{warn} (or is a @i{macro form} which macroexpands into such a ++@i{list}), then @b{with-condition-restarts} is used implicitly ++to associate the indicated @i{restarts} with the @i{condition} to be ++signaled. ++ ++@subsubheading Examples:: ++ ++@example ++ (restart-case ++ (handler-bind ((error #'(lambda (c) ++ (declare (ignore condition)) ++ (invoke-restart 'my-restart 7)))) ++ (error "Foo.")) ++ (my-restart (&optional v) v)) ++@result{} 7 ++ ++ (define-condition food-error (error) ()) ++@result{} FOOD-ERROR ++ (define-condition bad-tasting-sundae (food-error) ++ ((ice-cream :initarg :ice-cream :reader bad-tasting-sundae-ice-cream) ++ (sauce :initarg :sauce :reader bad-tasting-sundae-sauce) ++ (topping :initarg :topping :reader bad-tasting-sundae-topping)) ++ (:report (lambda (condition stream) ++ (format stream "Bad tasting sundae with ~S, ~S, and ~S" ++ (bad-tasting-sundae-ice-cream condition) ++ (bad-tasting-sundae-sauce condition) ++ (bad-tasting-sundae-topping condition))))) ++@result{} BAD-TASTING-SUNDAE ++ (defun all-start-with-same-letter (symbol1 symbol2 symbol3) ++ (let ((first-letter (char (symbol-name symbol1) 0))) ++ (and (eql first-letter (char (symbol-name symbol2) 0)) ++ (eql first-letter (char (symbol-name symbol3) 0))))) ++@result{} ALL-START-WITH-SAME-LETTER ++ (defun read-new-value () ++ (format t "Enter a new value: ") ++ (multiple-value-list (eval (read)))) ++@result{} READ-NEW-VALUE ++@page ++ (defun verify-or-fix-perfect-sundae (ice-cream sauce topping) ++ (do () ++ ((all-start-with-same-letter ice-cream sauce topping)) ++ (restart-case ++ (error 'bad-tasting-sundae ++ :ice-cream ice-cream ++ :sauce sauce ++ :topping topping) ++ (use-new-ice-cream (new-ice-cream) ++ :report "Use a new ice cream." ++ :interactive read-new-value ++ (setq ice-cream new-ice-cream)) ++ (use-new-sauce (new-sauce) ++ :report "Use a new sauce." ++ :interactive read-new-value ++ (setq sauce new-sauce)) ++ (use-new-topping (new-topping) ++ :report "Use a new topping." ++ :interactive read-new-value ++ (setq topping new-topping)))) ++ (values ice-cream sauce topping)) ++@result{} VERIFY-OR-FIX-PERFECT-SUNDAE ++ (verify-or-fix-perfect-sundae 'vanilla 'caramel 'cherry) ++@t{ |> } Error: Bad tasting sundae with VANILLA, CARAMEL, and CHERRY. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Use a new ice cream. ++@t{ |> } 2: Use a new sauce. ++@t{ |> } 3: Use a new topping. ++@t{ |> } 4: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@t{ |> } Use a new ice cream. ++@t{ |> } Enter a new ice cream: @b{|>>}@t{'chocolate}@b{<<|} ++@result{} CHOCOLATE, CARAMEL, CHERRY ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{restart-bind} ++, ++@ref{with-simple-restart} ++. ++ ++@subsubheading Notes:: ++ ++@example ++ (restart-case @i{expression} ++ (@i{name1} @i{arglist1} ...@i{options1}... . @i{body1}) ++ (@i{name2} @i{arglist2} ...@i{options2}... . @i{body2})) ++@end example ++ ++ is essentially equivalent to ++ ++@example ++ (block #1=#:g0001 ++ (let ((#2=#:g0002 nil)) ++ (tagbody ++ (restart-bind ((name1 #'(lambda (&rest temp) ++ (setq #2# temp) ++ (go #3=#:g0003)) ++ ...@i{slightly-transformed-options1}...) ++ (name2 #'(lambda (&rest temp) ++ (setq #2# temp) ++ (go #4=#:g0004)) ++ ...@i{slightly-transformed-options2}...)) ++ (return-from #1# @i{expression})) ++ #3# (return-from #1# ++ (apply #'(lambda @i{arglist1} . @i{body1}) #2#)) ++ #4# (return-from #1# ++ (apply #'(lambda @i{arglist2} . @i{body2}) #2#))))) ++@end example ++ ++Unnamed restarts are generally only useful interactively ++ and an interactive option which has no description is of little value. ++ Implementations are encouraged to warn if ++an unnamed restart is used and no report information ++ is provided ++at compilation time. ++At runtime, this error might be noticed when entering ++ the debugger. Since signaling an error would probably cause recursive ++ entry into the debugger (causing yet another recursive error, etc.) it is ++ suggested that the debugger print some indication of such problems when ++ they occur but not actually signal errors. ++ ++@example ++ (restart-case (signal fred) ++ (a ...) ++ (b ...)) ++ @equiv{} ++ (restart-case ++ (with-condition-restarts fred ++ (list (find-restart 'a) ++ (find-restart 'b)) ++ (signal fred)) ++ (a ...) ++ (b ...)) ++@end example ++ ++@node restart-name, with-condition-restarts, restart-case, Conditions Dictionary ++@subsection restart-name [Function] ++ ++@code{restart-name} @i{restart} @result{} @i{name} ++ ++@subsubheading Arguments and Values:: ++ ++@i{restart}---a @i{restart}. ++ ++@i{name}---a @i{symbol}. ++ ++@subsubheading Description:: ++ ++Returns the name of the @i{restart}, ++or @b{nil} if the @i{restart} is not named. ++ ++@subsubheading Examples:: ++ ++@example ++ (restart-case ++ (loop for restart in (compute-restarts) ++ collect (restart-name restart)) ++ (case1 () :report "Return 1." 1) ++ (nil () :report "Return 2." 2) ++ (case3 () :report "Return 3." 3) ++ (case1 () :report "Return 4." 4)) ++@result{} (CASE1 NIL CASE3 CASE1 ABORT) ++ ;; In the example above the restart named ABORT was not created ++ ;; explicitly, but was implicitly supplied by the system. ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{compute-restarts} ++ ++@ref{find-restart} ++ ++@node with-condition-restarts, with-simple-restart, restart-name, Conditions Dictionary ++@subsection with-condition-restarts [Macro] ++ ++@code{with-condition-restarts} @i{condition-form restarts-form @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{condition-form}---a @i{form}; @i{evaluated} to produce a @i{condition}. ++ ++@i{condition}---a @i{condition} @i{object} resulting from the ++ @i{evaluation} of @i{condition-form}. ++ ++@i{restart-form}---a @i{form}; @i{evaluated} to produce a @i{restart-list}. ++ ++@i{restart-list}---a @i{list} of @i{restart} @i{objects} resulting ++ from the @i{evaluation} of @i{restart-form}. ++ ++@i{forms}---an @i{implicit progn}; evaluated. ++ ++@i{results}---the @i{values} returned by @i{forms}. ++ ++@subsubheading Description:: ++ ++First, the @i{condition-form} and @i{restarts-form} are @i{evaluated} ++in normal left-to-right order; the @i{primary values} yielded by these ++@i{evaluations} are respectively called the @i{condition} ++and the @i{restart-list}. ++ ++Next, the @i{forms} are @i{evaluated} in a @i{dynamic environment} ++in which each @i{restart} in @i{restart-list} is associated with ++the @i{condition}. See @ref{Associating a Restart with a Condition}. ++ ++@subsubheading See Also:: ++ ++@ref{restart-case} ++ ++@subsubheading Notes:: ++ ++Usually this @i{macro} is not used explicitly in code, ++since @b{restart-case} handles most of the common cases ++in a way that is syntactically more concise. ++ ++@node with-simple-restart, abort (Restart), with-condition-restarts, Conditions Dictionary ++@subsection with-simple-restart [Macro] ++ ++@code{with-simple-restart} @i{@r{(}name format-control @{@i{format-argument}@}*@r{)} ++ @{@i{form}@}*}@* ++ @result{} @i{@{@i{result}@}*} ++ ++@subsubheading Arguments and Values:: ++ ++@i{name}---a @i{symbol}. ++ ++@i{format-control}---a @i{format control}. ++ ++@i{format-argument}---an @i{object} (@i{i.e.}, a @i{format argument}). ++ ++@i{forms}---an @i{implicit progn}. ++ ++@i{results}---in the normal situation, ++ the @i{values} returned by the @i{forms}; ++ in the exceptional situation where the @i{restart} named @i{name} is invoked, ++ two values---@b{nil} and @b{t}. ++ ++@subsubheading Description:: ++ ++@b{with-simple-restart} establishes a restart. ++ ++If the restart designated by @i{name} is not invoked while executing @i{forms}, ++all values returned by the last of @i{forms} are returned. ++If the restart designated by @i{name} is invoked, ++control is transferred to @b{with-simple-restart}, ++which returns two values, @b{nil} and @b{t}. ++ ++If @i{name} is @b{nil}, an anonymous restart is established. ++ ++The @i{format-control} and @i{format-arguments} are used ++report the @i{restart}. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun read-eval-print-loop (level) ++ (with-simple-restart (abort "Exit command level ~D." level) ++ (loop ++ (with-simple-restart (abort "Return to command level ~D." level) ++ (let ((form (prog2 (fresh-line) (read) (fresh-line)))) ++ (prin1 (eval form))))))) ++@result{} READ-EVAL-PRINT-LOOP ++ (read-eval-print-loop 1) ++ (+ 'a 3) ++@t{ |> } Error: The argument, A, to the function + was of the wrong type. ++@t{ |> } The function expected a number. ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Specify a value to use this time. ++@t{ |> } 2: Return to command level 1. ++@t{ |> } 3: Exit command level 1. ++@t{ |> } 4: Return to Lisp Toplevel. ++@end example ++ ++@example ++ (defun compute-fixnum-power-of-2 (x) ++ (with-simple-restart (nil "Give up on computing 2@t{^}~D." x) ++ (let ((result 1)) ++ (dotimes (i x result) ++ (setq result (* 2 result)) ++ (unless (fixnump result) ++ (error "Power of 2 is too large.")))))) ++COMPUTE-FIXNUM-POWER-OF-2 ++ (defun compute-power-of-2 (x) ++ (or (compute-fixnum-power-of-2 x) 'something big)) ++COMPUTE-POWER-OF-2 ++ (compute-power-of-2 10) ++1024 ++ (compute-power-of-2 10000) ++@t{ |> } Error: Power of 2 is too large. ++@t{ |> } To continue, type :CONTINUE followed by an option number. ++@t{ |> } 1: Give up on computing 2@t{^}10000. ++@t{ |> } 2: Return to Lisp Toplevel ++@t{ |> } Debug> @b{|>>}@t{:continue 1}@b{<<|} ++@result{} SOMETHING-BIG ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{restart-case} ++ ++@subsubheading Notes:: ++ ++@b{with-simple-restart} is shorthand for one of the most ++common uses of @b{restart-case}. ++ ++@b{with-simple-restart} could be defined by: ++ ++@example ++ (defmacro with-simple-restart ((restart-name format-control ++ &rest format-arguments) ++ &body forms) ++ `(restart-case (progn ,@@forms) ++ (,restart-name () ++ :report (lambda (stream) ++ (format stream ,format-control ,@@format-arguments)) ++ (values nil t)))) ++@end example ++ ++Because the second return value is @b{t} in the exceptional case, ++it is common (but not required) to arrange for the second return value ++in the normal case to be missing or @b{nil} so that the two situations ++can be distinguished. ++ ++@node abort (Restart), continue, with-simple-restart, Conditions Dictionary ++@subsection abort [Restart] ++ ++@subsubheading Data Arguments Required:: ++ ++None. ++ ++@subsubheading Description:: ++ ++The intent of the @b{abort} restart is to allow return to the ++innermost ``command level.'' Implementors are encouraged to make ++sure that there is always a restart named @b{abort} ++around any user code so that user code can call @b{abort} ++at any time and expect something reasonable to happen; ++exactly what the reasonable thing is may vary somewhat. Typically, ++in an interactive listener, the invocation of @b{abort} ++returns to the @i{Lisp reader} phase of the @i{Lisp read-eval-print loop}, ++though in some batch or multi-processing ++situations there may be situations in which having it kill the running ++process is more appropriate. ++ ++@subsubheading See Also:: ++ ++@ref{Restarts}, ++@ref{Interfaces to Restarts}, ++@ref{invoke-restart} ++, ++@ref{abort (Function)} ++ (@i{function}) ++ ++@node continue, muffle-warning, abort (Restart), Conditions Dictionary ++@subsection continue [Restart] ++ ++@subsubheading Data Arguments Required:: ++ ++None. ++ ++@subsubheading Description:: ++ ++The @b{continue} @i{restart} is generally part of protocols where there is ++ a single ``obvious'' way to continue, such as in ++@b{break} and @b{cerror}. Some ++ user-defined protocols may also wish to incorporate it for similar reasons. ++ In general, however, it is more reliable to design a special purpose restart ++ with a name that more directly suits the particular application. ++ ++@subsubheading Examples:: ++ ++@example ++ (let ((x 3)) ++ (handler-bind ((error #'(lambda (c) ++ (let ((r (find-restart 'continue c))) ++ (when r (invoke-restart r)))))) ++ (cond ((not (floatp x)) ++ (cerror "Try floating it." "~D is not a float." x) ++ (float x)) ++ (t x)))) @result{} 3.0 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Restarts}, ++@ref{Interfaces to Restarts}, ++@ref{invoke-restart} ++, ++@ref{continue} ++ (@i{function}), ++@ref{assert} ++, ++@ref{cerror} ++ ++@node muffle-warning, store-value, continue, Conditions Dictionary ++@subsection muffle-warning [Restart] ++ ++@subsubheading Data Arguments Required:: ++ ++None. ++ ++@subsubheading Description:: ++ ++This @i{restart} is established by @b{warn} so that @i{handlers} ++of @b{warning} @i{conditions} have a way to tell @b{warn} ++that a warning has already been dealt with and that no further action is warranted. ++ ++@subsubheading Examples:: ++ ++@example ++ (defvar *all-quiet* nil) @result{} *ALL-QUIET* ++ (defvar *saved-warnings* '()) @result{} *SAVED-WARNINGS* ++ (defun quiet-warning-handler (c) ++ (when *all-quiet* ++ (let ((r (find-restart 'muffle-warning c))) ++ (when r ++ (push c *saved-warnings*) ++ (invoke-restart r))))) ++@result{} CUSTOM-WARNING-HANDLER ++ (defmacro with-quiet-warnings (&body forms) ++ `(let ((*all-quiet* t) ++ (*saved-warnings* '())) ++ (handler-bind ((warning #'quiet-warning-handler)) ++ ,@@forms ++ *saved-warnings*))) ++@result{} WITH-QUIET-WARNINGS ++ (setq saved ++ (with-quiet-warnings ++ (warn "Situation #1.") ++ (let ((*all-quiet* nil)) ++ (warn "Situation #2.")) ++ (warn "Situation #3."))) ++@t{ |> } Warning: Situation #2. ++@result{} (# #) ++ (dolist (s saved) (format t "~&~A~ ++@t{ |> } Situation #3. ++@t{ |> } Situation #1. ++@result{} NIL ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Restarts}, ++@ref{Interfaces to Restarts}, ++@ref{invoke-restart} ++, ++@ref{muffle-warning} ++ (@i{function}), ++@ref{warn} ++ ++@node store-value, use-value, muffle-warning, Conditions Dictionary ++@subsection store-value [Restart] ++ ++@subsubheading Data Arguments Required:: ++ ++a value to use instead (on an ongoing basis). ++ ++@subsubheading Description:: ++ ++The @b{store-value} @i{restart} is generally used by @i{handlers} ++trying to recover from errors of @i{types} such as @b{cell-error} ++or @b{type-error}, which may wish to supply a replacement datum to ++be stored permanently. ++ ++@subsubheading Examples:: ++ ++@example ++ (defun type-error-auto-coerce (c) ++ (when (typep c 'type-error) ++ (let ((r (find-restart 'store-value c))) ++ (handler-case (let ((v (coerce (type-error-datum c) ++ (type-error-expected-type c)))) ++ (invoke-restart r v)) ++ (error ()))))) @result{} TYPE-ERROR-AUTO-COERCE ++ (let ((x 3)) ++ (handler-bind ((type-error #'type-error-auto-coerce)) ++ (check-type x float) ++ x)) @result{} 3.0 ++@end example ++ ++@subsubheading See Also:: ++ ++@ref{Restarts}, ++@ref{Interfaces to Restarts}, ++@ref{invoke-restart} ++, ++@ref{store-value} ++ (@i{function}), ++@b{ccase}, ++@ref{check-type} ++, ++@b{ctypecase}, ++@ref{use-value} ++ (@i{function} and @i{restart}) ++ ++@node use-value, abort (Function), store-value, Conditions Dictionary ++@subsection use-value [Restart] ++ ++@subsubheading Data Arguments Required:: ++ ++a value to use instead (once). ++ ++@subsubheading Description:: ++ ++The @b{use-value} @i{restart} is generally used by @i{handlers} trying ++to recover from errors of @i{types} such as @b{cell-error}, ++where the handler may wish to supply a replacement datum for one-time use. ++ ++@subsubheading See Also:: ++ ++@ref{Restarts}, ++@ref{Interfaces to Restarts}, ++@ref{invoke-restart} ++, ++@ref{use-value} ++ (@i{function}), ++@ref{store-value} ++ (@i{function} and @i{restart}) ++ ++@node abort (Function), , use-value, Conditions Dictionary ++@subsection abort, continue, muffle-warning, store-value, use-value [Function] ++ ++@IRindex abort ++ ++@IRindex continue ++ ++@IRindex muffle-warning ++ ++@IRindex store-value ++ ++@IRindex use-value ++ ++@code{abort} @i{@r{&optional} condition} ++ @result{} # ++ ++@code{continue} @i{@r{&optional} condition} @result{} @i{@b{nil}} ++ ++@code{muffle-warning} @i{@r{&optional} condition} ++ @result{} # ++ ++@code{store-value} @i{value @r{&optional} condition} @result{} @i{@b{nil}} ++ ++@code{use-value} @i{value @r{&optional} condition} @result{} @i{@b{nil}} ++ ++@subsubheading Arguments and Values:: ++ ++@i{value}---an @i{object}. ++ ++@i{condition}---a @i{condition} @i{object}, or @b{nil}. ++ ++@subsubheading Description:: ++ ++Transfers control to the most recently established @i{applicable restart} ++having the same name as the function. That is, ++ the @i{function} @b{abort} searches for an @i{applicable} @b{abort} @i{restart}, ++ the @i{function} @b{continue} searches for an @i{applicable} @b{continue} @i{restart}, ++and so on. ++ ++If no such @i{restart} exists, ++the functions ++ @b{continue}, ++ @b{store-value}, ++ and @b{use-value} ++return @b{nil}, and ++the functions ++ @b{abort} ++ and @b{muffle-warning} ++signal an error of @i{type} @b{control-error}. ++ ++When @i{condition} is @i{non-nil}, ++only those @i{restarts} are considered that are ++ either explicitly associated with that @i{condition}, ++ or not associated with any @i{condition}; ++that is, the excluded @i{restarts} are ++those that are associated with a non-empty set of @i{conditions} ++of which the given @i{condition} is not an @i{element}. ++If @i{condition} is @b{nil}, all @i{restarts} are considered. ++ ++@subsubheading Examples:: ++ ++@example ++;;; Example of the ABORT retart ++ ++ (defmacro abort-on-error (&body forms) ++ `(handler-bind ((error #'abort)) ++ ,@@forms)) @result{} ABORT-ON-ERROR ++ (abort-on-error (+ 3 5)) @result{} 8 ++ (abort-on-error (error "You lose.")) ++@t{ |> } Returned to Lisp Top Level. ++ ++;;; Example of the CONTINUE restart ++ ++ (defun real-sqrt (n) ++ (when (minusp n) ++ (setq n (- n)) ++ (cerror "Return sqrt(~D) instead." "Tried to take sqrt(-~D)." n)) ++ (sqrt n)) ++ ++ (real-sqrt 4) @result{} 2 ++ (real-sqrt -9) ++@t{ |> } Error: Tried to take sqrt(-9). ++@t{ |> } To continue, type :CONTINUE followed by an option number: ++@t{ |> } 1: Return sqrt(9) instead. ++@t{ |> } 2: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{(continue)}@b{<<|} ++@t{ |> } Return sqrt(9) instead. ++@result{} 3 ++ ++ (handler-bind ((error #'(lambda (c) (continue)))) ++ (real-sqrt -9)) @result{} 3 ++ ++;;; Example of the MUFFLE-WARNING restart ++ ++ (defun count-down (x) ++ (do ((counter x (1- counter))) ++ ((= counter 0) 'done) ++ (when (= counter 1) ++ (warn "Almost done")) ++ (format t "~&~D~ ++@result{} COUNT-DOWN ++ (count-down 3) ++@t{ |> } 3 ++@t{ |> } 2 ++@t{ |> } Warning: Almost done ++@t{ |> } 1 ++@result{} DONE ++ (defun ignore-warnings-while-counting (x) ++ (handler-bind ((warning #'ignore-warning)) ++ (count-down x))) ++@result{} IGNORE-WARNINGS-WHILE-COUNTING ++ (defun ignore-warning (condition) ++ (declare (ignore condition)) ++ (muffle-warning)) ++@result{} IGNORE-WARNING ++ (ignore-warnings-while-counting 3) ++@t{ |> } 3 ++@t{ |> } 2 ++@t{ |> } 1 ++@result{} DONE ++ ++;;; Example of the STORE-VALUE and USE-VALUE restarts ++ ++ (defun careful-symbol-value (symbol) ++ (check-type symbol symbol) ++ (restart-case (if (boundp symbol) ++ (return-from careful-symbol-value ++ (symbol-value symbol)) ++ (error 'unbound-variable ++ :name symbol)) ++ (use-value (value) ++ :report "Specify a value to use this time." ++ value) ++ (store-value (value) ++ :report "Specify a value to store and use in the future." ++ (setf (symbol-value symbol) value)))) ++ (setq a 1234) @result{} 1234 ++ (careful-symbol-value 'a) @result{} 1234 ++ (makunbound 'a) @result{} A ++ (careful-symbol-value 'a) ++@t{ |> } Error: A is not bound. ++@t{ |> } To continue, type :CONTINUE followed by an option number. ++@t{ |> } 1: Specify a value to use this time. ++@t{ |> } 2: Specify a value to store and use in the future. ++@t{ |> } 3: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{(use-value 12)}@b{<<|} ++@result{} 12 ++ (careful-symbol-value 'a) ++@t{ |> } Error: A is not bound. ++@t{ |> } To continue, type :CONTINUE followed by an option number. ++@t{ |> } 1: Specify a value to use this time. ++@t{ |> } 2: Specify a value to store and use in the future. ++@t{ |> } 3: Return to Lisp Toplevel. ++@t{ |> } Debug> @b{|>>}@t{(store-value 24)}@b{<<|} ++@result{} 24 ++ (careful-symbol-value 'a) ++@result{} 24 ++ ++;;; Example of the USE-VALUE restart ++ ++ (defun add-symbols-with-default (default &rest symbols) ++ (handler-bind ((sys:unbound-symbol ++ #'(lambda (c) ++ (declare (ignore c)) ++ (use-value default)))) ++ (apply #'+ (mapcar #'careful-symbol-value symbols)))) ++@result{} ADD-SYMBOLS-WITH-DEFAULT ++ (setq x 1 y 2) @result{} 2 ++ (add-symbols-with-default 3 'x 'y 'z) @result{} 6 ++ ++@end example ++ ++@subsubheading Side Effects:: ++ ++A transfer of control may occur if an appropriate @i{restart} is available, ++or (in the case of the @i{function} @b{abort} or the @i{function} @b{muffle-warning}) ++execution may be stopped. ++ ++@subsubheading Affected By:: ++ ++Each of these functions can be affected by ++the presence of a @i{restart} having the same name. ++ ++@subsubheading Exceptional Situations:: ++ ++If an appropriate @b{abort} @i{restart} ++ is not available for the @i{function} @b{abort}, ++or an appropriate @b{muffle-warning} @i{restart} ++ is not available for the @i{function} @b{muffle-warning}, ++an error of @i{type} @b{control-error} is signaled. ++ ++@subsubheading See Also:: ++ ++@ref{invoke-restart} ++, ++@ref{Restarts}, ++@ref{Interfaces to Restarts}, ++@ref{assert} ++, ++@b{ccase}, ++@ref{cerror} ++, ++@ref{check-type} ++, ++@b{ctypecase}, ++@ref{use-value} ++, ++@ref{warn} ++ ++@subsubheading Notes:: ++ ++@example ++ (abort condition) @equiv{} (invoke-restart 'abort) ++ (muffle-warning) @equiv{} (invoke-restart 'muffle-warning) ++ (continue) @equiv{} (let ((r (find-restart 'continue))) (if r (invoke-restart r))) ++ (use-value @i{x}) @equiv{} (let ((r (find-restart 'use-value))) (if r (invoke-restart r @i{x}))) ++ (store-value x) @equiv{} (let ((r (find-restart 'store-value))) (if r (invoke-restart r @i{x}))) ++@end example ++ ++No functions defined in this specification are required to provide ++a @b{use-value} @i{restart}. ++ ++@c end of including dict-conditions ++ ++@c %**end of chapter ++ +--- /dev/null ++++ gcl-2.6.12/info/chap-a.texi +@@ -0,0 +1,152 @@ ++ ++ ++@node Appendix, , Glossary (Glossary), Top ++@chapter Appendix ++ ++@menu ++* Removed Language Features:: ++@end menu ++ ++@node Removed Language Features, , Appendix, Appendix ++@section Removed Language Features ++ ++@c including appendix-removed ++ ++@menu ++* Requirements for removed and deprecated features:: ++* Removed Types:: ++* Removed Operators:: ++* Removed Argument Conventions:: ++* Removed Variables:: ++* Removed Reader Syntax:: ++* Packages No Longer Required:: ++@end menu ++ ++@node Requirements for removed and deprecated features, Removed Types, Removed Language Features, Removed Language Features ++@subsection Requirements for removed and deprecated features ++ ++For this standard, ++ some features from the language described in @i{Common Lisp: The Language} have been removed, ++and others have been deprecated (and will most likely not appear ++in future @r{Common Lisp} standards). ++Which features were removed and which were deprecated ++was decided on a case-by-case basis by the X3J13 committee. ++ ++@i{Conforming implementations} that wish to retain any removed ++features for compatibility must assure that such compatibility ++does not interfere with the correct function of @i{conforming programs}. ++For example, symbols corresponding to the names of removed functions ++may not appear in the the @t{COMMON-LISP} @i{package}. ++(Note, however, that this specification has been devised in such a way ++that there can be a package named @t{LISP} which can contain such symbols.) ++ ++@i{Conforming implementations} must implement all deprecated features. ++For a list of deprecated features, see @ref{Deprecated Language Features}. ++ ++@node Removed Types, Removed Operators, Requirements for removed and deprecated features, Removed Language Features ++@subsection Removed Types ++ ++The @i{type} @t{string-char} ++@ICindex string-char ++ was removed. ++ ++@node Removed Operators, Removed Argument Conventions, Removed Types, Removed Language Features ++@subsection Removed Operators ++ ++The functions ++ ++@t{int-char} ++@ICindex int-char ++, ++@t{char-bits} ++@ICindex char-bits ++, ++@t{char-font} ++@ICindex char-font ++, ++@t{make-char} ++@ICindex make-char ++, ++@t{char-bit} ++@ICindex char-bit ++, ++@t{set-char-bit} ++@ICindex set-char-bit ++, ++@t{string-char-p} ++@ICindex string-char-p ++, ++ ++and ++@t{commonp} ++@ICindex commonp ++ ++were removed. ++ ++The @i{special operator} @t{compiler-let} was removed. ++ ++@node Removed Argument Conventions, Removed Variables, Removed Operators, Removed Language Features ++@subsection Removed Argument Conventions ++ ++The @i{font} argument to @b{digit-char} ++@IRindex digit-char ++ was removed. ++The @i{bits} and @i{font} arguments to @b{code-char} ++@IRindex code-char ++ ++were removed. ++ ++@node Removed Variables, Removed Reader Syntax, Removed Argument Conventions, Removed Language Features ++@subsection Removed Variables ++ ++The variables ++ ++@t{char-font-limit} ++@ICindex char-font-limit ++, ++@t{char-bits-limit} ++@ICindex char-bits-limit ++, ++@t{char-control-bit} ++@ICindex char-control-bit ++, ++@t{char-meta-bit} ++@ICindex char-meta-bit ++, ++@t{char-super-bit} ++@ICindex char-super-bit ++, ++@t{char-hyper-bit} ++@ICindex char-hyper-bit ++, ++ ++and @t{*break-on-warnings*} ++@ICindex *break-on-warnings* ++ ++were removed. ++ ++@node Removed Reader Syntax, Packages No Longer Required, Removed Variables, Removed Language Features ++@subsection Removed Reader Syntax ++ ++The ``@t{#,}'' @i{reader macro} in @i{standard syntax} was removed. ++ ++@node Packages No Longer Required, , Removed Reader Syntax, Removed Language Features ++@subsection Packages No Longer Required ++ ++The @i{packages} ++ @t{LISP} ++@IPindex lisp ++, ++ @t{USER} ++@IPindex user ++, ++ and @t{SYSTEM} ++@IPindex system ++ ++are no longer required. It is valid for @i{packages} with one or more of these ++names to be provided by a @i{conforming implementation} as extensions. ++ ++@c end of including appendix-removed ++ ++@c %**end of chapter ++ +--- gcl-2.6.12.orig/info/gcl-si.info ++++ gcl-2.6.12/info/gcl-si.info +@@ -1,4 +1,4 @@ +-This is gcl-si.info, produced by makeinfo version 5.2 from gcl-si.texi. ++This is gcl-si.info, produced by makeinfo version 6.7 from gcl-si.texi. + + INFO-DIR-SECTION GNU Common Lisp + START-INFO-DIR-ENTRY +@@ -14,57 +14,57 @@ File: gcl-si.info, Node: Top, Next: Nu + + * Menu: + +-* Numbers:: +-* Sequences and Arrays and Hash Tables:: +-* Characters:: +-* Lists:: +-* Streams and Reading:: +-* Special Forms and Functions:: +-* Compilation:: +-* Symbols:: +-* Operating System:: +-* Structures:: +-* Iteration and Tests:: +-* User Interface:: +-* Doc:: +-* Type:: +-* GCL Specific:: +-* C Interface:: +-* System Definitions:: +-* Debugging:: +-* Miscellaneous:: +-* Compiler Definitions:: +-* Function and Variable Index:: ++* Numbers:: ++* Sequences and Arrays and Hash Tables:: ++* Characters:: ++* Lists:: ++* Streams and Reading:: ++* Special Forms and Functions:: ++* Compilation:: ++* Symbols:: ++* Operating System:: ++* Structures:: ++* Iteration and Tests:: ++* User Interface:: ++* Doc:: ++* Type:: ++* GCL Specific:: ++* C Interface:: ++* System Definitions:: ++* Debugging:: ++* Miscellaneous:: ++* Compiler Definitions:: ++* Function and Variable Index:: + + -- The Detailed Node Listing -- + + Operating System + +-* Command Line:: +-* Operating System Definitions:: ++* Command Line:: ++* Operating System Definitions:: + + GCL Specific + +-* Bignums:: ++* Bignums:: + + C Interface + +-* Available Symbols:: ++* Available Symbols:: + + System Definitions + +-* Regular Expressions:: ++* Regular Expressions:: + + Debugging + +-* Source Level Debugging in Emacs:: +-* Low Level Debug Functions:: ++* Source Level Debugging in Emacs:: ++* Low Level Debug Functions:: + + Miscellaneous + +-* Environment:: +-* Inititialization:: +-* Low Level X Interface:: ++* Environment:: ++* Inititialization:: ++* Low Level X Interface:: + +  + File: gcl-si.info, Node: Numbers, Next: Sequences and Arrays and Hash Tables, Prev: Top, Up: Top +@@ -90,7 +90,7 @@ File: gcl-si.info, Node: Numbers, Next + Package:LISP + + Returns, as three values, the integer interpretation of significand +- F, the exponent E, and the sign S of the given float, so that E ++ F, the exponent E, and the sign S of the given float, so that E + FLOAT = S * F * B where B = (FLOAT-RADIX FLOAT) + + F is a non-negative integer, E is an integer, and S is either 1 or +@@ -206,14 +206,14 @@ File: gcl-si.info, Node: Numbers, Next + + Returns an integer produced by performing the logical operation + specified by OP on the two integers. OP must be the value of one +- of the following constants: BOOLE-CLR BOOLE-C1 BOOLE-XOR +- BOOLE-ANDC1 BOOLE-SET BOOLE-C2 BOOLE-EQV BOOLE-ANDC2 BOOLE-1 +- BOOLE-AND BOOLE-NAND BOOLE-ORC1 BOOLE-2 BOOLE-IOR BOOLE-NOR ++ of the following constants: BOOLE-CLR BOOLE-C1 BOOLE-XOR ++ BOOLE-ANDC1 BOOLE-SET BOOLE-C2 BOOLE-EQV BOOLE-ANDC2 BOOLE-1 ++ BOOLE-AND BOOLE-NAND BOOLE-ORC1 BOOLE-2 BOOLE-IOR BOOLE-NOR + BOOLE-ORC2 See the variable docs of these constants for their + operations. + + -- Constant: SHORT-FLOAT-EPSILON +- Package:LISP The smallest positive short-float that satisfies (not ++ Package:LISP The smallest positive short-float that satisfies (not + (= (float 1 e) (+ (float 1 e) e))). + + -- Function: LOGORC2 (integer1 integer2) +@@ -413,7 +413,7 @@ File: gcl-si.info, Node: Numbers, Next + Returns the size part (in GCL, the car part) of the byte specifier. + + -- Constant: SHORT-FLOAT-NEGATIVE-EPSILON +- Package:LISP The smallest positive short-float that satisfies (not ++ Package:LISP The smallest positive short-float that satisfies (not + (= (float 1 e) (- (float 1 e) e))). + + -- Function: REM (number divisor) +@@ -436,14 +436,14 @@ File: gcl-si.info, Node: Numbers, Next + Package:LISP + + Returns, as three values, the significand F, the exponent E, and +- the sign S of the given float, so that E FLOAT = S * F * B where B ++ the sign S of the given float, so that E FLOAT = S * F * B where B + = (FLOAT-RADIX FLOAT) + + S and F are floating-point numbers of the same float format as + FLOAT, and E is an integer. + + -- Constant: LONG-FLOAT-EPSILON +- Package:LISP The smallest positive long-float that satisfies (not ++ Package:LISP The smallest positive long-float that satisfies (not + (= (float 1 e) (+ (float 1 e) e))). + + -- Function: FROUND (number &optional (divisor 1)) +@@ -657,7 +657,7 @@ File: gcl-si.info, Node: Numbers, Next + Package:LISP The fixnum closest in value to negative infinity. + + -- Constant: LONG-FLOAT-NEGATIVE-EPSILON +- Package:LISP The smallest positive long-float that satisfies (not ++ Package:LISP The smallest positive long-float that satisfies (not + (= (float 1 e) (- (float 1 e) e))). + + -- Function: >= (number &rest more-numbers) +@@ -2541,10 +2541,10 @@ File: gcl-si.info, Node: Streams and Re + -- Function: PPRINT (object &optional (stream *standard-output*)) + Package:LISP + +- Pretty-prints OBJECT. Returns OBJECT. Equivalent to (WRITE :STREAM ++ Pretty-prints OBJECT. Returns OBJECT. Equivalent to (WRITE :STREAM + STREAM :PRETTY T) The SI:PRETTY-PRINT-FORMAT property N (which must + be a non-negative integer) of a symbol SYMBOL controls the +- pretty-printing of form (SYMBOL f1 ... fN fN+1 ... fM) in such a ++ pretty-printing of form (SYMBOL f1 ... fN fN+1 ... fM) in such a + way that the subforms fN+1, ..., fM are regarded as the 'body' of + the entire form. For instance, the property value of 2 is + initially given to the symbol DO. +@@ -2599,7 +2599,7 @@ File: gcl-si.info, Node: Streams and Re + Package:LISP + + Outputs a newline character, and then prints OBJECT in the mostly +- readable representation. Returns OBJECT. Equivalent to (PROGN ++ readable representation. Returns OBJECT. Equivalent to (PROGN + (TERPRI STREAM) (WRITE OBJECT :STREAM STREAM :ESCAPE T)). + + -- Function: SET-MACRO-CHARACTER (char function &optional +@@ -2643,7 +2643,7 @@ File: gcl-si.info, Node: Streams and Re + Package:LISP + + Prints OBJECT without escape characters. Returns OBJECT. +- Equivalent to (WRITE OBJECT :STREAM STREAM :ESCAPE NIL). ++ Equivalent to (WRITE OBJECT :STREAM STREAM :ESCAPE NIL). + + -- Function: CLEAR-OUTPUT (&optional (stream *standard-output*)) + Package:LISP +@@ -3120,7 +3120,7 @@ File: gcl-si.info, Node: Streams and Re + Package:LISP + + Returns as a string the printed representation of OBJECT without +- escape characters. Equivalent to (WRITE-TO-STRING OBJECT :ESCAPE ++ escape characters. Equivalent to (WRITE-TO-STRING OBJECT :ESCAPE + NIL). + + -- Variable: *STANDARD-INPUT* +@@ -3220,15 +3220,6 @@ File: gcl-si.info, Node: Special Forms + -- Constant: LAMBDA-LIST-KEYWORDS + Package:LISP List of all the lambda-list keywords used in GCL. + +- -- Function: GET-SETF-METHOD (form) +- Package:LISP +- +- Returns the five values (or five 'gangs') constituting the SETF +- method for FORM. See the doc of DEFINE-SETF-METHOD for the meanings +- of the gangs. It is an error if the third value (i.e., the list of +- store variables) is not a one-element list. See the doc of +- GET-SETF-METHOD-MULTIPLE-VALUE for comparison. +- + -- Special Form: THE + Package:LISP + +@@ -3368,9 +3359,9 @@ File: gcl-si.info, Node: Special Forms + (defun name lambda-list {decl | doc}* {form}*) + + Defines a function as the global function definition of the symbol +- NAME. The complete syntax of a lambda-list is: ({var}* [&optional +- {var | (var [initform [svar]])}*] [&rest var] [&key {var | ({var | +- (keyword var)} [initform [svar]])}* [&allow-other-keys]] [&aux {var ++ NAME. The complete syntax of a lambda-list is: ({var}* [&optional ++ {var | (var [initform [svar]])}*] [&rest var] [&key {var | ({var | ++ (keyword var)} [initform [svar]])}* [&allow-other-keys]] [&aux {var + | (var [initform])}*]) The doc-string DOC, if supplied, is saved as + a FUNCTION doc and can be retrieved by (documentation 'NAME + 'function). +@@ -3761,11 +3752,11 @@ File: gcl-si.info, Node: Special Forms + (ACCESS-FUN ...). When a form (setf (ACCESS-FUN arg1 ... argn) + value) is being evaluated, the FORMs are first evaluated as a PROGN + with the parameters in DEFMACRO-LAMBDA-LIST bound to ARG1 ... +- ARGn. Assuming that the last FORM returns five values (temp-var-1 +- ... temp-var-k) (value-from-1 ... value-form-k) (store-var) +- storing-form access-form in order, the whole SETF is then expanded +- into (let* ((temp-var-1 value-from-1) ... (temp-k value-form-k) +- (store-var VALUE)) storing-from) Incidentally, the five values are ++ ARGn. Assuming that the last FORM returns five values (temp-var-1 ++ ... temp-var-k) (value-from-1 ... value-form-k) (store-var) ++ storing-form access-form in order, the whole SETF is then expanded ++ into (let* ((temp-var-1 value-from-1) ... (temp-k value-form-k) ++ (store-var VALUE)) storing-from) Incidentally, the five values are + called the five gangs of a SETF method. The doc-string DOC, if + supplied, is saved as a SETF doc and can be retrieved by + (documentation 'NAME 'setf). +@@ -4145,7 +4136,7 @@ that variable has value :defaults, then + Partial: + defstructs, defvar, defparameter + Full: +- defmacro, defconstant, defsetf, define-setf-method, deftype, ++ defmacro, defconstant, defsetf, define-setf-method, deftype, + package ops, proclaim + None: + defun, others +@@ -4514,11 +4505,11 @@ File: gcl-si.info, Node: Symbols, Next + Package:LISP + + Returns the doc-string of DOC-TYPE for SYMBOL; NIL if none exists. +- Possible doc-types are: FUNCTION (special forms, macros, and +- functions) VARIABLE (dynamic variables, including constants) TYPE +- (types defined by DEFTYPE) STRUCTURE (structures defined by +- DEFSTRUCT) SETF (SETF methods defined by DEFSETF, +- DEFINE-SETF-METHOD, and DEFINE-MODIFY-MACRO) All built-in special ++ Possible doc-types are: FUNCTION (special forms, macros, and ++ functions) VARIABLE (dynamic variables, including constants) TYPE ++ (types defined by DEFTYPE) STRUCTURE (structures defined by ++ DEFSTRUCT) SETF (SETF methods defined by DEFSETF, ++ DEFINE-SETF-METHOD, and DEFINE-MODIFY-MACRO) All built-in special + forms, macros, functions, and variables have their doc-strings. + + -- Function: GENTEMP (&optional (prefix "t") (package *package*)) +@@ -4604,8 +4595,8 @@ File: gcl-si.info, Node: Operating Syst + + * Menu: + +-* Command Line:: +-* Operating System Definitions:: ++* Command Line:: ++* Operating System Definitions:: + +  + File: gcl-si.info, Node: Command Line, Next: Operating System Definitions, Prev: Operating System, Up: Operating System +@@ -4826,7 +4817,7 @@ File: gcl-si.info, Node: Operating Syst + the maximum number of pages for the type class + the percentage of used cells to cells so-far allocated + the number of times the garbage collector has been called +- to collect cells of the type class ++ to collect cells of the type class + the implementation types that belongs to the type class + the number of pages actually allocated for contiguous blocks + the maximum number of pages for contiguous blocks +@@ -5494,7 +5485,7 @@ File: gcl-si.info, Node: Type, Next: G + (deftype name lambda-list {decl | doc}* {form}*) + + Defines a new type-specifier abbreviation in terms of an +- 'expansion' function (lambda lambda-list1 {decl}* {form}*) where ++ 'expansion' function (lambda lambda-list1 {decl}* {form}*) where + lambda-list1 is identical to LAMBDA-LIST except that all optional + parameters with no default value specified in LAMBDA-LIST defaults + to the symbol '*', but not to NIL. When the type system of GCL +@@ -5744,7 +5735,7 @@ File: gcl-si.info, Node: GCL Specific, + + * Menu: + +-* Bignums:: ++* Bignums:: + +  + File: gcl-si.info, Node: Bignums, Prev: GCL Specific, Up: GCL Specific +@@ -5818,7 +5809,7 @@ File: gcl-si.info, Node: C Interface, + + * Menu: + +-* Available Symbols:: ++* Available Symbols:: + +  + File: gcl-si.info, Node: Available Symbols, Prev: C Interface, Up: C Interface +@@ -6215,7 +6206,7 @@ File: gcl-si.info, Node: System Definit + Package:SI + + GCL/BSD specific: Loads the FASL file FILE while linking the object +- files and libraries specified by STRING. For example, (faslink ++ files and libraries specified by STRING. For example, (faslink + "foo.o" "bar.o boo.o -lpixrect") loads foo.o while linking two + object files (bar.o and boo.o) and the library pixrect. Usually, + foo.o consists of the C language interface for the functions +@@ -6434,7 +6425,7 @@ File: gcl-si.info, Node: System Definit + package; /* the package symbols are in by default */ object index; + /* integer. The current_dump index on write */ object filepos; /* + nil or the position of the start */ object table_length; /* On read +- it is set to the size dump array needed or 0 */ object macro ; } ++ it is set to the size dump array needed or 0 */ object macro ; } + + We did not use a defstruct for this, because we want the compiler + to use this and it makes bootstrapping more difficult. It is in +@@ -6633,7 +6624,7 @@ File: gcl-si.info, Node: System Definit + + * Menu: + +-* Regular Expressions:: ++* Regular Expressions:: + +  + File: gcl-si.info, Node: Regular Expressions, Prev: System Definitions, Up: System Definitions +@@ -6771,8 +6762,8 @@ File: gcl-si.info, Node: Debugging, Ne + + * Menu: + +-* Source Level Debugging in Emacs:: +-* Low Level Debug Functions:: ++* Source Level Debugging in Emacs:: ++* Low Level Debug Functions:: + +  + File: gcl-si.info, Node: Source Level Debugging in Emacs, Next: Low Level Debug Functions, Prev: Debugging, Up: Debugging +@@ -6900,9 +6891,9 @@ File: gcl-si.info, Node: Miscellaneous, + + * Menu: + +-* Environment:: +-* Inititialization:: +-* Low Level X Interface:: ++* Environment:: ++* Inititialization:: ++* Low Level X Interface:: + +  + File: gcl-si.info, Node: Environment, Next: Inititialization, Prev: Miscellaneous, Up: Miscellaneous +@@ -7093,7 +7084,7 @@ Appendix A Function and Variable Index + * ***: User Interface. (line 25) + * *AFTER-GBC-HOOK*: System Definitions. (line 254) + * *APPLYHOOK*: Special Forms and Functions. +- (line 622) ++ (line 613) + * *BREAK-ENABLE*: User Interface. (line 44) + * *BREAK-ON-WARNINGS*: User Interface. (line 64) + * *CASE-FOLD-SEARCH*: System Definitions. (line 733) +@@ -7113,7 +7104,7 @@ Appendix A Function and Variable Index + * *DEFAULT-TIME-ZONE*: System Definitions. (line 365) + * *ERROR-OUTPUT*: User Interface. (line 98) + * *EVALHOOK*: Special Forms and Functions. +- (line 248) ++ (line 239) + * *FEATURES*: Compilation. (line 251) + * *GBC-MESSAGE*: System Definitions. (line 244) + * *GBC-NOTIFY*: System Definitions. (line 249) +@@ -7126,7 +7117,7 @@ Appendix A Function and Variable Index + * *LOAD-PATHNAME*: System Definitions. (line 640) + * *LOAD-VERBOSE*: Streams and Reading. (line 595) + * *MACROEXPAND-HOOK*: Special Forms and Functions. +- (line 376) ++ (line 367) + * *MAKE-CONSTANT: System Definitions. (line 186) + * *MAKE-SPECIAL: System Definitions. (line 281) + * *MODULES*: Operating System Definitions. +@@ -7214,12 +7205,12 @@ Appendix A Function and Variable Index + * ALPHA-CHAR-P: Characters. (line 151) + * ALPHANUMERICP: Characters. (line 230) + * AND: Special Forms and Functions. +- (line 450) ++ (line 441) + * APPEND: Lists. (line 585) + * APPLY: Special Forms and Functions. +- (line 410) ++ (line 401) + * APPLYHOOK: Special Forms and Functions. +- (line 368) ++ (line 359) + * APROPOS: Doc. (line 6) + * APROPOS-LIST: Symbols. (line 315) + * AREF: Sequences and Arrays and Hash Tables. +@@ -7284,7 +7275,7 @@ Appendix A Function and Variable Index + * BIT-XOR: Sequences and Arrays and Hash Tables. + (line 403) + * BLOCK: Special Forms and Functions. +- (line 391) ++ (line 382) + * BOOLE: Numbers. (line 135) + * BOOLE-1: Numbers. (line 493) + * BOOLE-2: Numbers. (line 554) +@@ -7329,16 +7320,16 @@ Appendix A Function and Variable Index + * CADDR: Lists. (line 574) + * CADR: Lists. (line 237) + * CALL-ARGUMENTS-LIMIT: Special Forms and Functions. +- (line 523) ++ (line 514) + * CAR: Lists. (line 460) + * CASE: Special Forms and Functions. +- (line 528) ++ (line 519) + * CATCH: Special Forms and Functions. +- (line 487) ++ (line 478) + * CATCH-BAD-SIGNALS: System Definitions. (line 225) + * CATCH-FATAL: System Definitions. (line 448) + * CCASE: Special Forms and Functions. +- (line 62) ++ (line 53) + * CDAAAR: Lists. (line 482) + * CDAADR: Lists. (line 143) + * CDAAR: Lists. (line 357) +@@ -7405,13 +7396,13 @@ Appendix A Function and Variable Index + * COMPILED-FUNCTION-NAME: System Definitions. (line 107) + * COMPILED-FUNCTION-P: Compilation. (line 196) + * COMPILER-LET: Special Forms and Functions. +- (line 559) ++ (line 550) + * COMPLEX: Numbers. (line 568) + * COMPLEXP: Numbers. (line 507) + * CONCATENATE: Sequences and Arrays and Hash Tables. + (line 464) + * COND: Special Forms and Functions. +- (line 469) ++ (line 460) + * CONJUGATE: Numbers. (line 712) + * CONS: Lists. (line 118) + * CONSP: Lists. (line 55) +@@ -7434,37 +7425,37 @@ Appendix A Function and Variable Index + * COUNT-IF-NOT: Sequences and Arrays and Hash Tables. + (line 380) + * CTYPECASE: Special Forms and Functions. +- (line 733) ++ (line 724) + * DBL: System Definitions. (line 662) + * DECF: Numbers. (line 448) + * DECLARE: Special Forms and Functions. +- (line 173) ++ (line 164) + * DECODE-FLOAT: Numbers. (line 366) + * DECODE-UNIVERSAL-TIME: Operating System Definitions. + (line 42) + * DEFCFUN: GCL Specific. (line 44) + * DEFCONSTANT: Special Forms and Functions. +- (line 675) ++ (line 666) + * DEFENTRY: GCL Specific. (line 153) + * DEFINE-COMPILER-MACRO: System Definitions. (line 654) + * DEFINE-INLINE-FUNCTION: System Definitions. (line 644) + * DEFINE-MODIFY-MACRO: Special Forms and Functions. +- (line 497) ++ (line 488) + * DEFINE-SETF-METHOD: Special Forms and Functions. +- (line 539) ++ (line 530) + * DEFLA: GCL Specific. (line 136) + * DEFMACRO: Special Forms and Functions. +- (line 216) ++ (line 207) + * DEFPARAMETER: Special Forms and Functions. +- (line 769) ++ (line 760) + * DEFSETF: Special Forms and Functions. +- (line 88) ++ (line 79) + * DEFSTRUCT: Structures. (line 6) + * DEFTYPE: Type. (line 58) + * DEFUN: Special Forms and Functions. +- (line 150) ++ (line 141) + * DEFVAR: Special Forms and Functions. +- (line 779) ++ (line 770) + * DELETE: Sequences and Arrays and Hash Tables. + (line 267) + * DELETE-DUPLICATES: Sequences and Arrays and Hash Tables. +@@ -7493,14 +7484,14 @@ Appendix A Function and Variable Index + * DOCUMENTATION: Symbols. (line 236) + * DOLIST: Iteration and Tests. (line 59) + * DOTIMES: Special Forms and Functions. +- (line 315) ++ (line 306) + * DOUBLE-FLOAT-EPSILON: Numbers. (line 754) + * DOUBLE-FLOAT-NEGATIVE-EPSILON: Numbers. (line 188) + * DPB: Numbers. (line 701) + * DRIBBLE: User Interface. (line 101) + * DYNAMIC-EXTENT: Type. (line 77) + * ECASE: Special Forms and Functions. +- (line 278) ++ (line 269) + * ED: User Interface. (line 56) + * EIGHTH: Lists. (line 76) + * ELT: Sequences and Arrays and Hash Tables. +@@ -7519,15 +7510,15 @@ Appendix A Function and Variable Index + * EQUAL: Iteration and Tests. (line 82) + * EQUALP: Iteration and Tests. (line 74) + * ERROR: Special Forms and Functions. +- (line 691) ++ (line 682) + * ERROR-SET: System Definitions. (line 97) + * ETYPECASE: Special Forms and Functions. +- (line 120) ++ (line 111) + * EVAL: Special Forms and Functions. +- (line 744) ++ (line 735) + * EVAL-WHEN: Compilation. (line 65) + * EVALHOOK: Special Forms and Functions. +- (line 716) ++ (line 707) + * EVENP: Numbers. (line 476) + * EVERY: Sequences and Arrays and Hash Tables. + (line 732) +@@ -7564,7 +7555,7 @@ Appendix A Function and Variable Index + * FIRST: Lists. (line 372) + * FIXNUMP: System Definitions. (line 191) + * FLET: Special Forms and Functions. +- (line 264) ++ (line 255) + * FLOAT: Numbers. (line 534) + * FLOAT-DIGITS: Numbers. (line 802) + * FLOAT-PRECISION: Numbers. (line 691) +@@ -7587,11 +7578,11 @@ Appendix A Function and Variable Index + * FRS-VS: System Definitions. (line 410) + * FTRUNCATE: Numbers. (line 169) + * FUNCALL: Special Forms and Functions. +- (line 518) ++ (line 509) + * FUNCTION: Special Forms and Functions. +- (line 354) ++ (line 345) + * FUNCTIONP: Special Forms and Functions. +- (line 253) ++ (line 244) + * FWRITE: System Definitions. (line 484) + * GBC: GCL Specific. (line 110) + * GBC-TIME: System Definitions. (line 475) +@@ -7610,10 +7601,8 @@ Appendix A Function and Variable Index + * GET-MACRO-CHARACTER: Streams and Reading. (line 512) + * GET-OUTPUT-STREAM-STRING: Streams and Reading. (line 671) + * GET-PROPERTIES: Lists. (line 541) +-* GET-SETF-METHOD: Special Forms and Functions. +- (line 9) + * GET-SETF-METHOD-MULTIPLE-VALUE: Special Forms and Functions. +- (line 480) ++ (line 471) + * GET-STRING-INPUT-STREAM-INDEX: System Definitions. (line 80) + * GET-UNIVERSAL-TIME: Operating System Definitions. + (line 144) +@@ -7622,7 +7611,7 @@ Appendix A Function and Variable Index + * GETHASH: Sequences and Arrays and Hash Tables. + (line 297) + * GO: Special Forms and Functions. +- (line 604) ++ (line 595) + * GPROF-QUIT: Compilation. (line 210) + * GPROF-SET: Compilation. (line 221) + * GPROF-START: Compilation. (line 201) +@@ -7636,9 +7625,9 @@ Appendix A Function and Variable Index + * HOST-NAMESTRING: Operating System Definitions. + (line 13) + * IDENTITY: Special Forms and Functions. +- (line 665) ++ (line 656) + * IF: Special Forms and Functions. +- (line 696) ++ (line 687) + * IHS-FUN: System Definitions. (line 180) + * IHS-VS: System Definitions. (line 118) + * IMAGPART: Numbers. (line 422) +@@ -7660,11 +7649,11 @@ Appendix A Function and Variable Index + * ISQRT: Numbers. (line 732) + * KEYWORDP: Symbols. (line 14) + * LABELS: Special Forms and Functions. +- (line 416) ++ (line 407) + * LAMBDA-LIST-KEYWORDS: Special Forms and Functions. + (line 6) + * LAMBDA-PARAMETERS-LIMIT: Special Forms and Functions. +- (line 259) ++ (line 250) + * LAST: Lists. (line 195) + * LCM: Numbers. (line 438) + * LDB: Numbers. (line 335) +@@ -7680,9 +7669,9 @@ Appendix A Function and Variable Index + * LEAST-POSITIVE-SINGLE-FLOAT: Numbers. (line 504) + * LENGTH: Lists. (line 81) + * LET: Special Forms and Functions. +- (line 460) ++ (line 451) + * LET*: Special Forms and Functions. +- (line 131) ++ (line 122) + * LINK: Compilation. (line 22) + * LISP-IMPLEMENTATION-TYPE: Operating System Definitions. + (line 195) +@@ -7700,7 +7689,7 @@ Appendix A Function and Variable Index + * LISTP: Lists. (line 65) + * LOAD: Streams and Reading. (line 16) + * LOCALLY: Special Forms and Functions. +- (line 657) ++ (line 648) + * LOG: Numbers. (line 182) + * LOGAND: Numbers. (line 549) + * LOGANDC1: Numbers. (line 499) +@@ -7729,11 +7718,11 @@ Appendix A Function and Variable Index + * MACHINE-VERSION: GCL Specific. (line 33) + * MACRO-FUNCTION: Symbols. (line 170) + * MACROEXPAND: Special Forms and Functions. +- (line 73) ++ (line 64) + * MACROEXPAND-1: Special Forms and Functions. +- (line 511) ++ (line 502) + * MACROLET: Special Forms and Functions. +- (line 592) ++ (line 583) + * MAKE-ALL-PROCLAIMS: Compiler Definitions. + (line 43) + * MAKE-ARRAY: Sequences and Arrays and Hash Tables. +@@ -7801,17 +7790,17 @@ Appendix A Function and Variable Index + * MOST-POSITIVE-SHORT-FLOAT: Numbers. (line 17) + * MOST-POSITIVE-SINGLE-FLOAT: Numbers. (line 496) + * MULTIPLE-VALUE-BIND: Special Forms and Functions. +- (line 164) ++ (line 155) + * MULTIPLE-VALUE-CALL: Special Forms and Functions. +- (line 80) ++ (line 71) + * MULTIPLE-VALUE-LIST: Special Forms and Functions. +- (line 575) ++ (line 566) + * MULTIPLE-VALUE-PROG1: Special Forms and Functions. +- (line 583) ++ (line 574) + * MULTIPLE-VALUE-SETQ: Special Forms and Functions. +- (line 648) ++ (line 639) + * MULTIPLE-VALUES-LIMIT: Special Forms and Functions. +- (line 363) ++ (line 354) + * NAME-CHAR: Characters. (line 6) + * NAMESTRING: Streams and Reading. (line 382) + * NANI: System Definitions. (line 318) +@@ -7822,7 +7811,7 @@ Appendix A Function and Variable Index + * NINTH: Lists. (line 477) + * NLOAD: System Definitions. (line 669) + * NOT: Special Forms and Functions. +- (line 670) ++ (line 661) + * NOTANY: Sequences and Arrays and Hash Tables. + (line 489) + * NOTEVERY: Sequences and Arrays and Hash Tables. +@@ -7858,7 +7847,7 @@ Appendix A Function and Variable Index + * OPEN: Streams and Reading. (line 22) + * OPEN-FASD: System Definitions. (line 578) + * OR: Special Forms and Functions. +- (line 723) ++ (line 714) + * OUTPUT-STREAM-P: Streams and Reading. (line 252) + * OUTPUT-STREAM-STRING: System Definitions. (line 74) + * PACKAGE-NAME: Symbols. (line 302) +@@ -7901,26 +7890,26 @@ Appendix A Function and Variable Index + * PROCLAMATION: GCL Specific. (line 146) + * PROF: System Definitions. (line 425) + * PROG: Special Forms and Functions. +- (line 613) ++ (line 604) + * PROG*: Special Forms and Functions. +- (line 382) ++ (line 373) + * PROG1: Special Forms and Functions. +- (line 141) ++ (line 132) + * PROG2: Special Forms and Functions. +- (line 289) ++ (line 280) + * PROGN: Special Forms and Functions. +- (line 401) ++ (line 392) + * PROGV: Special Forms and Functions. +- (line 298) ++ (line 289) + * PROVIDE: Compilation. (line 190) + * PSETF: Special Forms and Functions. +- (line 749) ++ (line 740) + * PSETQ: Symbols. (line 73) + * PUSH: Lists. (line 349) + * PUSHNEW: Lists. (line 395) + * PUTPROP: System Definitions. (line 33) + * QUOTE: Special Forms and Functions. +- (line 308) ++ (line 299) + * RANDOM: Numbers. (line 809) + * RANDOM-STATE-P: Numbers. (line 683) + * RASSOC: Lists. (line 86) +@@ -7968,9 +7957,9 @@ Appendix A Function and Variable Index + * RESET-STACK-LIMITS: System Definitions. (line 236) + * REST: Lists. (line 242) + * RETURN: Special Forms and Functions. +- (line 429) ++ (line 420) + * RETURN-FROM: Special Forms and Functions. +- (line 629) ++ (line 620) + * REVAPPEND: Lists. (line 227) + * REVERSE: Sequences and Arrays and Hash Tables. + (line 81) +@@ -7999,7 +7988,7 @@ Appendix A Function and Variable Index + * SET-MACRO-CHARACTER: Streams and Reading. (line 119) + * SET-SYNTAX-FROM-CHAR: Streams and Reading. (line 403) + * SETF: Special Forms and Functions. +- (line 27) ++ (line 18) + * SETQ: Symbols. (line 101) + * SEVENTH: Lists. (line 173) + * SGC-ON: System Definitions. (line 501) +@@ -8034,7 +8023,7 @@ Appendix A Function and Variable Index + * SORT: Sequences and Arrays and Hash Tables. + (line 371) + * SPECIAL-FORM-P: Special Forms and Functions. +- (line 325) ++ (line 316) + * SPECIALP: System Definitions. (line 68) + * SQRT: Numbers. (line 621) + * STABLE-SORT: Sequences and Arrays and Hash Tables. +@@ -8114,17 +8103,17 @@ Appendix A Function and Variable Index + * SYSTEM: GCL Specific. (line 6) + * T: Symbols. (line 118) + * TAGBODY: Special Forms and Functions. +- (line 112) ++ (line 103) + * TAILP: Lists. (line 50) + * TAN: Numbers. (line 233) + * TANH: Numbers. (line 241) + * TENTH: Lists. (line 60) + * TERPRI: Streams and Reading. (line 167) + * THE: Special Forms and Functions. +- (line 18) ++ (line 9) + * THIRD: Lists. (line 128) + * THROW: Special Forms and Functions. +- (line 759) ++ (line 750) + * TIME: Operating System Definitions. + (line 181) + * TOP-LEVEL: System Definitions. (line 401) +@@ -8134,7 +8123,7 @@ Appendix A Function and Variable Index + * TRUNCATE: Numbers. (line 323) + * TYPE-OF: Type. (line 11) + * TYPECASE: Special Forms and Functions. +- (line 439) ++ (line 430) + * TYPEP: Type. (line 22) + * UNCATCH-BAD-SIGNALS: System Definitions. (line 343) + * UNEXPORT: Symbols. (line 267) +@@ -8142,21 +8131,21 @@ Appendix A Function and Variable Index + * UNION: Lists. (line 438) + * UNIVERSAL-ERROR-HANDLER: System Definitions. (line 124) + * UNLESS: Special Forms and Functions. +- (line 639) ++ (line 630) + * UNREAD-CHAR: Streams and Reading. (line 387) + * UNTRACE: User Interface. (line 16) + * UNUSE-PACKAGE: Symbols. (line 112) + * UNWIND-PROTECT: Special Forms and Functions. +- (line 706) ++ (line 697) + * UPPER-CASE-P: Characters. (line 157) + * USE-FAST-LINKS: GCL Specific. (line 218) + * USE-PACKAGE: Symbols. (line 59) + * USER-HOMEDIR-PATHNAME: Operating System Definitions. + (line 51) + * VALUES: Special Forms and Functions. +- (line 570) ++ (line 561) + * VALUES-LIST: Special Forms and Functions. +- (line 686) ++ (line 677) + * VECTOR: Sequences and Arrays and Hash Tables. + (line 6) + * VECTOR-POP: Sequences and Arrays and Hash Tables. +@@ -8170,7 +8159,7 @@ Appendix A Function and Variable Index + * VS: System Definitions. (line 348) + * WARN: User Interface. (line 114) + * WHEN: Special Forms and Functions. +- (line 53) ++ (line 44) + * WHO-CALLS: Compiler Definitions. + (line 87) + * WITH-INPUT-FROM-STRING: Streams and Reading. (line 273) +@@ -8196,36 +8185,41 @@ Appendix A Function and Variable Index +  + Tag Table: + Node: Top291 +-Node: Numbers1233 +-Node: Sequences and Arrays and Hash Tables23630 +-Node: Characters49423 +-Node: Lists56819 +-Node: Streams and Reading70593 +-Node: Special Forms and Functions95980 +-Node: Compilation121632 +-Node: Symbols134272 +-Node: Operating System144030 +-Node: Command Line144238 +-Node: Operating System Definitions148244 +-Node: Structures155543 +-Node: Iteration and Tests157095 +-Node: User Interface160545 +-Node: Doc169571 +-Node: Type172820 +-Node: GCL Specific175480 +-Node: Bignums183907 +-Node: C Interface186597 +-Node: Available Symbols186761 +-Node: System Definitions187240 +-Node: Regular Expressions217547 +-Node: Debugging223637 +-Node: Source Level Debugging in Emacs223841 +-Node: Low Level Debug Functions228086 +-Node: Miscellaneous229086 +-Node: Environment229300 +-Node: Inititialization229925 +-Node: Low Level X Interface230469 +-Node: Compiler Definitions231066 +-Node: Function and Variable Index236361 ++Node: Numbers1147 ++Node: Sequences and Arrays and Hash Tables23544 ++Node: Characters49337 ++Node: Lists56733 ++Node: Streams and Reading70507 ++Node: Special Forms and Functions95894 ++Node: Compilation121157 ++Node: Symbols133797 ++Node: Operating System143555 ++Node: Command Line143745 ++Node: Operating System Definitions147751 ++Node: Structures155050 ++Node: Iteration and Tests156602 ++Node: User Interface160052 ++Node: Doc169078 ++Node: Type172327 ++Node: GCL Specific174987 ++Node: Bignums183411 ++Node: C Interface186101 ++Node: Available Symbols186263 ++Node: System Definitions186742 ++Node: Regular Expressions217047 ++Node: Debugging223137 ++Node: Source Level Debugging in Emacs223338 ++Node: Low Level Debug Functions227583 ++Node: Miscellaneous228583 ++Node: Environment228791 ++Node: Inititialization229416 ++Node: Low Level X Interface229960 ++Node: Compiler Definitions230557 ++Node: Function and Variable Index235852 +  + End Tag Table ++ ++ ++Local Variables: ++coding: utf-8 ++End: +--- gcl-2.6.12.orig/info/gcl-si/Available-Symbols.html ++++ gcl-2.6.12/info/gcl-si/Available-Symbols.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Available Symbols ++ ++Available Symbols (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Previous: , Up: C Interface   [Contents][Index]

++Previous: , Up: C Interface   [Contents][Index]

+
+
+- +-

16.1 Available Symbols

++

16.1 Available Symbols

+ +

When GCL is built, those symbols in the system libraries which + are referenced by functions linked in in the list of objects +--- gcl-2.6.12.orig/info/gcl-si/Bignums.html ++++ gcl-2.6.12/info/gcl-si/Bignums.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Bignums ++ ++Bignums (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Previous: , Up: GCL Specific   [Contents][Index]

++Previous: , Up: GCL Specific   [Contents][Index]

+
+
+- +-

15.1 Bignums

++

15.1 Bignums

+ +

A directory mp was added to hold the new multi precision arithmetic + code. The layout and a fair amount of code in the mp directory is an +@@ -95,6 +83,7 @@ gcl/akcl time in parentheses. +

+
+
++
+ pi-inv   akcl-566  franz        lucid         old kcl/akcl
+ ----------------------------------------
+ 10000      3.3     9.2(2.8 X)  15.3 (4.6X)    92.7   (29.5 X)
+@@ -122,7 +111,7 @@ pi-inv   akcl-566  franz        lucid
+ 
+
+

+-Previous: , Up: GCL Specific   [Contents][Index]

++Previous: , Up: GCL Specific   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/C-Interface.html ++++ gcl-2.6.12/info/gcl-si/C-Interface.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: C Interface ++ ++C Interface (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

16 C Interface

++

16 C Interface

+ + +- + + +--- gcl-2.6.12.orig/info/gcl-si/Characters.html ++++ gcl-2.6.12/info/gcl-si/Characters.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Characters ++ ++Characters (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

3 Characters

++

3 Characters

+ +
+-
Function: NAME-CHAR (name)
++
Function: NAME-CHAR (name)
+

Package:LISP +

+

Given an argument acceptable to string, +@@ -70,7 +58,7 @@ otherwise. NAME must be an object that +

+ +
+-
Function: CHAR-NAME (char)
++
Function: CHAR-NAME (char)
+

Package:LISP +

+

Returns the name for CHAR as a string; NIL if CHAR has no name. +@@ -81,7 +69,7 @@ and #\Rubout have names. +

+ +
+-
Function: BOTH-CASE-P (char)
++
Function: BOTH-CASE-P (char)
+

Package:LISP +

+

Returns T if CHAR is an alphabetic character; NIL otherwise. Equivalent to +@@ -91,7 +79,7 @@ ALPHA-CHAR-P. +

+ +
+-
Function: SCHAR (simple-string index)
++
Function: SCHAR (simple-string index)
+

Package:LISP +

+

Returns the character object representing the INDEX-th character in STRING. +@@ -101,7 +89,7 @@ This is faster than CHAR. +

+ +
+-
Constant: CHAR-SUPER-BIT
++
Constant: CHAR-SUPER-BIT
+

Package:LISP + The bit that indicates a super character. +

+@@ -109,7 +97,7 @@ The bit that indicates a super character +
+ +
+-
Constant: CHAR-FONT-LIMIT
++
Constant: CHAR-FONT-LIMIT
+

Package:LISP + The upper exclusive bound on values produced by CHAR-FONT. +

+@@ -117,7 +105,7 @@ The upper exclusive bound on values prod +
+ +
+-
Function: CHAR-DOWNCASE (char)
++
Function: CHAR-DOWNCASE (char)
+

Package:LISP +

+

Returns the lower-case equivalent of CHAR, if any. +@@ -127,7 +115,7 @@ If not, simply returns CHAR. +

+ +
+-
Function: STRING-CHAR-P (char)
++
Function: STRING-CHAR-P (char)
+

Package:LISP +

+

Returns T if CHAR can be stored in a string. In GCL, this function always +@@ -137,7 +125,7 @@ returns T since any character in GCL can +

+ +
+-
Function: CHAR-NOT-LESSP (char &rest more-chars)
++
Function: CHAR-NOT-LESSP (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly non-increasing order; NIL +@@ -148,7 +136,7 @@ is used. +

+ +
+-
Function: DISASSEMBLE (thing)
++
Function: DISASSEMBLE (thing)
+

Package:LISP +

+

Compiles the form specified by THING and prints the intermediate C language +@@ -163,7 +151,7 @@ Otherwise, THING itself is disassembled + + +

+-
Function: LOWER-CASE-P (char)
++
Function: LOWER-CASE-P (char)
+

Package:LISP +

+

Returns T if CHAR is a lower-case character; NIL otherwise. +@@ -172,7 +160,7 @@ Otherwise, THING itself is disassembled +

+ +
+-
Function: CHAR<= (char &rest more-chars)
++
Function: CHAR<= (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly non-decreasing order; NIL +@@ -182,7 +170,7 @@ otherwise. +

+ +
+-
Constant: CHAR-HYPER-BIT
++
Constant: CHAR-HYPER-BIT
+

Package:LISP + The bit that indicates a hyper character. +

+@@ -190,7 +178,7 @@ The bit that indicates a hyper character +
+ +
+-
Function: CODE-CHAR (code &optional (bits 0) (font 0))
++
Function: CODE-CHAR (code &optional (bits 0) (font 0))
+

Package:LISP +

+

Returns a character object with the specified code, if any. +@@ -200,7 +188,7 @@ If not, returns NIL. +

+ +
+-
Function: CHAR-CODE (char)
++
Function: CHAR-CODE (char)
+

Package:LISP +

+

Returns the code attribute of CHAR. +@@ -209,7 +197,7 @@ If not, returns NIL. +

+ +
+-
Constant: CHAR-CONTROL-BIT
++
Constant: CHAR-CONTROL-BIT
+

Package:LISP + The bit that indicates a control character. +

+@@ -217,7 +205,7 @@ The bit that indicates a control charact +
+ +
+-
Function: CHAR-LESSP (char &rest more-chars)
++
Function: CHAR-LESSP (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly increasing order; NIL +@@ -228,7 +216,7 @@ is used. +

+ +
+-
Function: CHAR-FONT (char)
++
Function: CHAR-FONT (char)
+

Package:LISP +

+

Returns the font attribute of CHAR. +@@ -237,7 +225,7 @@ is used. +

+ +
+-
Function: CHAR< (char &rest more-chars)
++
Function: CHAR< (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly increasing order; NIL otherwise. +@@ -246,7 +234,7 @@ is used. +

+ +
+-
Function: CHAR>= (char &rest more-chars)
++
Function: CHAR>= (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly non-increasing order; NIL +@@ -256,7 +244,7 @@ otherwise. +

+ +
+-
Constant: CHAR-META-BIT
++
Constant: CHAR-META-BIT
+

Package:LISP + The bit that indicates a meta character. +

+@@ -264,7 +252,7 @@ The bit that indicates a meta character. +
+ +
+-
Function: GRAPHIC-CHAR-P (char)
++
Function: GRAPHIC-CHAR-P (char)
+

Package:LISP +

+

Returns T if CHAR is a printing character, i.e., #\Space through #\~; +@@ -274,7 +262,7 @@ NIL otherwise. +

+ +
+-
Function: CHAR-NOT-EQUAL (char &rest more-chars)
++
Function: CHAR-NOT-EQUAL (char &rest more-chars)
+

Package:LISP +

+

Returns T if no two of CHARs are the same character; NIL otherwise. +@@ -284,7 +272,7 @@ Upper case character and its lower case +

+ +
+-
Constant: CHAR-BITS-LIMIT
++
Constant: CHAR-BITS-LIMIT
+

Package:LISP + The upper exclusive bound on values produced by CHAR-BITS. +

+@@ -292,7 +280,7 @@ The upper exclusive bound on values prod +
+ +
+-
Function: CHARACTERP (x)
++
Function: CHARACTERP (x)
+

Package:LISP +

+

Returns T if X is a character; NIL otherwise. +@@ -301,7 +289,7 @@ The upper exclusive bound on values prod +

+ +
+-
Function: CHAR= (char &rest more-chars)
++
Function: CHAR= (char &rest more-chars)
+

Package:LISP +

+

Returns T if all CHARs are the same character; NIL otherwise. +@@ -310,7 +298,7 @@ The upper exclusive bound on values prod +

+ +
+-
Function: ALPHA-CHAR-P (char)
++
Function: ALPHA-CHAR-P (char)
+

Package:LISP +

+

Returns T if CHAR is an alphabetic character, A-Z or a-z; NIL otherwise. +@@ -319,7 +307,7 @@ The upper exclusive bound on values prod +

+ +
+-
Function: UPPER-CASE-P (char)
++
Function: UPPER-CASE-P (char)
+

Package:LISP +

+

Returns T if CHAR is an upper-case character; NIL otherwise. +@@ -328,7 +316,7 @@ The upper exclusive bound on values prod +

+ +
+-
Function: CHAR-BIT (char name)
++
Function: CHAR-BIT (char name)
+

Package:LISP +

+

Returns T if the named bit is on in the character CHAR; NIL otherwise. +@@ -338,7 +326,7 @@ In GCL, this function always returns NIL +

+ +
+-
Function: MAKE-CHAR (char &optional (bits 0) (font 0))
++
Function: MAKE-CHAR (char &optional (bits 0) (font 0))
+

Package:LISP +

+

Returns a character object with the same code attribute as CHAR and with +@@ -348,7 +336,7 @@ the specified BITS and FONT attributes. +

+ +
+-
Function: CHARACTER (x)
++
Function: CHARACTER (x)
+

Package:LISP +

+

Coerces X into a character object if possible. +@@ -357,7 +345,7 @@ the specified BITS and FONT attributes. +

+ +
+-
Function: CHAR-EQUAL (char &rest more-chars)
++
Function: CHAR-EQUAL (char &rest more-chars)
+

Package:LISP +

+

Returns T if all of its arguments are the same character; NIL otherwise. +@@ -367,7 +355,7 @@ Upper case character and its lower case +

+ +
+-
Function: CHAR-NOT-GREATERP (char &rest more-chars)
++
Function: CHAR-NOT-GREATERP (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly non-decreasing order; NIL +@@ -378,7 +366,7 @@ is used. +

+ +
+-
Function: CHAR> (char &rest more-chars)
++
Function: CHAR> (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly decreasing order; NIL +@@ -388,7 +376,7 @@ otherwise. +

+ +
+-
Function: STANDARD-CHAR-P (char)
++
Function: STANDARD-CHAR-P (char)
+

Package:LISP +

+

Returns T if CHAR is a standard character, i.e., one of the 95 ASCII printing +@@ -398,7 +386,7 @@ characters #\Space to #\~ and #Newline; +

+ +
+-
Function: CHAR-UPCASE (char)
++
Function: CHAR-UPCASE (char)
+

Package:LISP +

+

Returns the upper-case equivalent of CHAR, if any. +@@ -408,7 +396,7 @@ If not, simply returns CHAR. +

+ +
+-
Function: DIGIT-CHAR-P (char &optional (radix 10))
++
Function: DIGIT-CHAR-P (char &optional (radix 10))
+

Package:LISP +

+

If CHAR represents a digit in RADIX, then returns the weight as an integer. +@@ -418,7 +406,7 @@ Otherwise, returns nil. +

+ +
+-
Function: CHAR/= (char &rest more-chars)
++
Function: CHAR/= (char &rest more-chars)
+

Package:LISP +

+

Returns T if no two of CHARs are the same character; NIL otherwise. +@@ -427,7 +415,7 @@ Otherwise, returns nil. +

+ +
+-
Function: CHAR-GREATERP (char &rest more-chars)
++
Function: CHAR-GREATERP (char &rest more-chars)
+

Package:LISP +

+

Returns T if the codes of CHARs are in strictly decreasing order; NIL +@@ -438,7 +426,7 @@ is used. +

+ +
+-
Function: ALPHANUMERICP (char)
++
Function: ALPHANUMERICP (char)
+

Package:LISP +

+

Returns T if CHAR is either numeric or alphabetic; NIL otherwise. +@@ -447,7 +435,7 @@ is used. +

+ +
+-
Function: CHAR-BITS (char)
++
Function: CHAR-BITS (char)
+

Package:LISP +

+

Returns the bits attribute (which is always 0 in GCL) of CHAR. +@@ -456,7 +444,7 @@ is used. +

+ +
+-
Function: DIGIT-CHAR (digit &optional (radix 10) (font 0))
++
Function: DIGIT-CHAR (digit &optional (radix 10) (font 0))
+

Package:LISP +

+

Returns a character object that represents the DIGIT in the specified RADIX. +@@ -466,7 +454,7 @@ Returns NIL if no such character exists. +

+ +
+-
Function: SET-CHAR-BIT (char name newvalue)
++
Function: SET-CHAR-BIT (char name newvalue)
+

Package:LISP +

+

Returns a character just like CHAR except that the named bit is set or +@@ -479,7 +467,7 @@ is useless in GCL. +


+ + + +--- gcl-2.6.12.orig/info/gcl-si/Command-Line.html ++++ gcl-2.6.12/info/gcl-si/Command-Line.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Command Line ++ ++Command Line (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

9.1 Command Line

++

9.1 Command Line

+ +

The variable si::*command-args* is set to the list of strings passed + in when gcl is invoked. +@@ -64,17 +52,17 @@ in when gcl is invoked. +

Various flags are understood. +

+
-eval +- ++ +
+

Call read and then eval on the command argument following -eval +

+
-load +- ++ +
+

Load the file whose pathname is specified after -load. +

+
-f +- ++ +
+

Replace si::*command-args* by the the list starting after -f. + Open the file following -f for input, skip the first line, and then +@@ -139,7 +127,7 @@ print hello world is faster + +

+
-batch +- ++ +
+

Do not enter the command print loop. Useful if the other command line + arguments do something. Do not print the License and acknowledgement +@@ -147,13 +135,13 @@ information. Note if your program does + it must print the GCL header information also. +

+
-dir +- ++ +
+

Directory where the executable binary that is running is located. + Needed by save and friends. This gets set as si::*system-directory* +

+
-libdir +- ++ +
+
+
   -libdir /d/wfs/gcl-2.0/
+@@ -165,33 +153,33 @@ concatting the path to the libdir path,
+ 
+
+
-compile +- ++ +
+

Invoke the compiler on the filename following -compile. + Other flags affect compilation. +

+
-o-file +- ++ +
+

If nil follows -o-file then do not produce an .o file. +

+
-c-file +- ++ +
+

If -c-file is specified, leave the intermediate .c file there. +

+
-h-file +- ++ +
+

If -h-file is specified, leave the intermediate .h file there. +

+
-data-file +- ++ +
+

If -data-file is specified, leave the intermediate .data file there. +

+
-system-p +- ++ +
+

If -system-p is specified then invoke compile-file with the + :system-p t keyword argument, meaning that the C init function +@@ -203,7 +191,7 @@ by name by C code. +


+ + + +--- gcl-2.6.12.orig/info/gcl-si/Compilation.html ++++ gcl-2.6.12/info/gcl-si/Compilation.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Compilation ++ ++Compilation (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

7 Compilation

++

7 Compilation

+ +
+-
Function: COMPILE (name &optional (definition nil))
++
Function: COMPILE (name &optional (definition nil))
+

Package:LISP +

+

If DEFINITION is NIL, NAME must be the name of a not-yet-compiled +@@ -78,7 +66,7 @@ NIL, these files are automatically delet +

+ +
+-
Function: LINK (files image &optional post extra-libs (run-user-init t) &aux raw init)
++ +

Package:LISP +

+

On systems where dlopen is used for relocations, one cannot make custom +@@ -122,7 +110,7 @@ method in a relatively transparent way. +

+ +
+-
Special Form: EVAL-WHEN
++
Special Form: EVAL-WHEN
+

Package:LISP +

+

Syntax: +@@ -139,7 +127,7 @@ be evaluated when the compiled code is l +

+ +
+-
Function: COMPILE-FILE (input-pathname &key output-file (load nil) (message-file nil) ;GCL specific keywords: system-p c-debug c-file h-file data-file)
++
Function: COMPILE-FILE (input-pathname &key output-file (load nil) (message-file nil) ;GCL specific keywords: system-p c-debug c-file h-file data-file)
+

Package:LISP +

+ +@@ -191,8 +179,7 @@ are given. Note that most common lisps +

+
+ +- +-

subsection Evaluation at Compile time

++

subsection Evaluation at Compile time

+ +

In GCL the eval-when behaviour was changed in order to allow + more efficient init code, and also to bring it into line with the resolution +@@ -252,7 +239,7 @@ compile-file and *fasd-data* is not eq t +

See OPTIMIZE on how to enable warnings of slow constructs. +

+
+-
Function: PROCLAIM (decl-spec)
++
Function: PROCLAIM (decl-spec)
+

Package:LISP +

+

Puts the declaration given by DECL-SPEC into effect globally. See the doc of +@@ -267,7 +254,7 @@ DECLARE for possible DECL-SPECs. + + +

+-
Function: PROVIDE (module-name)
++
Function: PROVIDE (module-name)
+

Package:LISP +

+

Adds the specified module to the list of modules maintained in *MODULES*. +@@ -276,7 +263,7 @@ DECLARE for possible DECL-SPECs. +

+ +
+-
Function: COMPILED-FUNCTION-P (x)
++
Function: COMPILED-FUNCTION-P (x)
+

Package:LISP +

+

Returns T if X is a compiled function; NIL otherwise. +@@ -285,7 +272,7 @@ DECLARE for possible DECL-SPECs. +

+ +
+-
Function: GPROF-START ()
++
Function: GPROF-START ()
+

Package:SYSTEM +

+

GCL now has preliminary support for profiling with gprof, an +@@ -298,7 +285,7 @@ counters. + + +

+-
Function: GPROF-QUIT ()
++
Function: GPROF-QUIT ()
+

Package:SYSTEM +

+

GCL now has preliminary support for profiling with gprof, an +@@ -313,7 +300,7 @@ their lisp names. Please see also the P + + +

+-
Function: GPROF-SET (begin end)
++
Function: GPROF-SET (begin end)
+

Package:SYSTEM +

+

GCL now has preliminary support for profiling with gprof, an +@@ -331,31 +318,31 @@ GPROF-SET with both argments set to 0. + + +

+-
Variable: *DEFAULT-SYSTEM-P*
++
Variable: *DEFAULT-SYSTEM-P*
+

Pakcage:COMPILER + Specifies the default setting of :SYSTEM-P used by COMPILE. Defaults to NIL. +

+ +
+-
Variable: *DEFAULT-C-FILE*
++
Variable: *DEFAULT-C-FILE*
+

Pakcage:COMPILER + Specifies the default setting of :C-FILE used by COMPILE. Defaults to NIL. +

+ +
+-
Variable: *DEFAULT-H-FILE*
++
Variable: *DEFAULT-H-FILE*
+

Pakcage:COMPILER + Specifies the default setting of :H-FILE used by COMPILE. Defaults to NIL. +

+ +
+-
Variable: *DEFAULT-DATA-FILE*
++
Variable: *DEFAULT-DATA-FILE*
+

Pakcage:COMPILER + Specifies the default setting of :DATA-FILE used by COMPILE. Defaults to NIL. +

+ +
+-
Variable: *FEATURES*
++
Variable: *FEATURES*
+

Package:LISP + List of symbols that name features of the current version of GCL. + These features are used to decide the read-time conditionalization facility +@@ -391,7 +378,7 @@ true. The NOT description is true only +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Compiler-Definitions.html ++++ gcl-2.6.12/info/gcl-si/Compiler-Definitions.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Compiler Definitions ++ ++Compiler Definitions (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

20 Compiler Definitions

++

20 Compiler Definitions

+ +
+-
Function: EMIT-FN (turn-on)
++
Function: EMIT-FN (turn-on)
+

Package:COMPILER +

+

If TURN-ON is t, the subsequent calls to COMPILE-FILE will +@@ -71,7 +59,7 @@ This latter file must be manually loaded + +

+
+-
Variable: *CMPINCLUDE-STRING*
++
Variable: *CMPINCLUDE-STRING*
+

Package:COMPILER + If it is a string it holds the text of the cmpinclude.h file appropriate for + this version. Otherwise the usual #include of *cmpinclude* will be used. To +@@ -80,7 +68,7 @@ disable this feature set *cmpinclude-str + +

+
+-
Function: EMIT-FN (turn-on)
++
Function: EMIT-FN (turn-on)
+

Package:COMPILER +

+ +@@ -106,7 +94,7 @@ tools. + +
+
+-
Function: MAKE-ALL-PROCLAIMS (&rest directories)
++
Function: MAKE-ALL-PROCLAIMS (&rest directories)
+

Package:COMPILER +

+ +@@ -135,7 +123,7 @@ proclamations. + +
+
+-
Function: MAKE-PROCLAIMS (&optional (stream *standard-output*))
++
Function: MAKE-PROCLAIMS (&optional (stream *standard-output*))
+

Package:COMPILER +

+ +@@ -146,7 +134,7 @@ on how to collect this. Simply use LOAD + +
+
+-
Function: LIST-UNDEFINED-FUNCTIONS ()
++
Function: LIST-UNDEFINED-FUNCTIONS ()
+

Package:COMPILER +

+ +@@ -165,7 +153,7 @@ or + +
+
+-
Function: WHO-CALLS (function-name)
++
Function: WHO-CALLS (function-name)
+

Package:COMPILER +

+ +@@ -174,7 +162,7 @@ or + +
+
+-
Function: LIST-UNCALLED-FUNCTIONS ()
++
Function: LIST-UNCALLED-FUNCTIONS ()
+

Package:COMPILER +

+ +@@ -187,7 +175,7 @@ special compiler optimizer properties wh + +
+
+-
Variable: *CC*
++
Variable: *CC*
+

Package:COMPILER + Has value a string which controls which C compiler is used by GCL. + Usually this string is obtained from the machine.defs file, but +@@ -196,7 +184,7 @@ may be reset by the user, to change comp + +

+
+-
Variable: *SPLIT-FILES*
++
Variable: *SPLIT-FILES*
+

Package:COMPILER + This affects the behaviour of compile-file, and is useful for cases where + the C compiler cannot handle large C files resulting from lisp compilation. +@@ -214,7 +202,7 @@ The package information will be inserted + +

+
+-
Variable: *COMPILE-ORDINARIES*
++
Variable: *COMPILE-ORDINARIES*
+

Package:COMPILER + If this has a non nil value [default = nil], then all top level + forms will be compiled into machine instructions. Otherwise +@@ -227,7 +215,7 @@ with (progn ’compile ...) will do +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Debugging.html ++++ gcl-2.6.12/info/gcl-si/Debugging.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Debugging ++ ++Debugging (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,22 +38,20 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

18 Debugging

++

18 Debugging

+ + + + +- +- + + +--- gcl-2.6.12.orig/info/gcl-si/Doc.html ++++ gcl-2.6.12/info/gcl-si/Doc.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Doc ++ ++Doc (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

13 Doc

++

13 Doc

+ +
+-
Function: APROPOS (string &optional (package nil))
++
Function: APROPOS (string &optional (package nil))
+

Package:LISP +

+

Prints those symbols whose print-names contain STRING as substring. +@@ -69,7 +57,7 @@ If PACKAGE is non-NIL, then only the spe +

+ +
+-
Function: INFO (string &optional (list-of-info-files *default-info-files*))
++
Function: INFO (string &optional (list-of-info-files *default-info-files*))
+

PACKAGE:SI +

+

Find all documentation about STRING in LIST-OF-INFO-FILES. The search +@@ -132,7 +120,7 @@ printed. + + +

+-
Variable: *info-paths*
++
Variable: *info-paths*
+

Package SI: +

+

A list of strings such as +@@ -161,7 +149,7 @@ purpose of finding maxima.info +

+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Environment.html ++++ gcl-2.6.12/info/gcl-si/Environment.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Environment ++ ++Environment (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Miscellaneous   [Contents][Index]

++Next: , Previous: , Up: Miscellaneous   [Contents][Index]

+
+
+- +-

19.1 Environment

++

19.1 Environment

+ +

The environment in GCL which is passed to macroexpand and + other functions requesting an environment, should be a +--- gcl-2.6.12.orig/info/gcl-si/Function-and-Variable-Index.html ++++ gcl-2.6.12/info/gcl-si/Function-and-Variable-Index.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL SI Manual: Function and Variable Index ++ ++Function and Variable Index (GCL SI Manual) + +- +- ++ ++ + + + +- +- ++ + + +- +- ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Previous: , Up: Top   [Contents][Index]

++Previous: , Up: Top   [Contents][Index]

+
+
+- +-

Appendix A Function and Variable Index

++

Appendix A Function and Variable Index

+ + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + +- +- ++ ++ + +
Jump to:   * +   + + +@@ -127,948 +115,947 @@ Previous: +
Index Entry  Section

*
*: Numbers
*: User Interface
**: User Interface
***: User Interface
*AFTER-GBC-HOOK*: System Definitions
*APPLYHOOK*: Special Forms and Functions
*BREAK-ENABLE*: User Interface
*BREAK-ON-WARNINGS*: User Interface
*CASE-FOLD-SEARCH*: System Definitions
*CC*: Compiler Definitions
*CMPINCLUDE-STRING*: Compiler Definitions
*COMPILE-ORDINARIES*: Compiler Definitions
*DEBUG-IO*: User Interface
*DEFAULT-C-FILE*: Compilation
*DEFAULT-DATA-FILE*: Compilation
*DEFAULT-H-FILE*: Compilation
*DEFAULT-PATHNAME-DEFAULTS*: Operating System Definitions
*DEFAULT-SYSTEM-P*: Compilation
*DEFAULT-TIME-ZONE*: System Definitions
*ERROR-OUTPUT*: User Interface
*EVALHOOK*: Special Forms and Functions
*FEATURES*: Compilation
*GBC-MESSAGE*: System Definitions
*GBC-NOTIFY*: System Definitions
*IGNORE-EOF-ON-TERMINAL-IO*: System Definitions
*IGNORE-MAXIMUM-PAGES*: GCL Specific
*INDENT-FORMATTED-OUTPUT*: System Definitions
*info-paths*: Doc
*INTERRUPT-ENABLE*: System Definitions
*LISP-MAXPAGES*: System Definitions
*LOAD-PATHNAME*: System Definitions
*LOAD-VERBOSE*: Streams and Reading
*MACROEXPAND-HOOK*: Special Forms and Functions
*MAKE-CONSTANT: System Definitions
*MAKE-SPECIAL: System Definitions
*MODULES*: Operating System Definitions
*MULTIPLY-STACKS*: System Definitions
*NOTIFY-GBC*: System Definitions
*OPTIMIZE-MAXIMUM-PAGES*: GCL Specific
*PACKAGE*: Symbols
*PRINT-ARRAY*: Streams and Reading
*PRINT-BASE*: Streams and Reading
*PRINT-CASE*: Streams and Reading
*PRINT-CIRCLE*: Streams and Reading
*PRINT-ESCAPE*: Streams and Reading
*PRINT-GENSYM*: Streams and Reading
*PRINT-LENGTH*: Streams and Reading
*PRINT-LEVEL*: Streams and Reading
*PRINT-PRETTY*: Streams and Reading
*PRINT-RADIX*: Streams and Reading
*QUERY-IO*: Streams and Reading
*RANDOM-STATE*: Numbers
*READ-BASE*: Streams and Reading
*READ-DEFAULT-FLOAT-FORMAT*: Streams and Reading
*READ-SUPPRESS*: Streams and Reading
*READLINE-PREFIX*: Streams and Reading
*READTABLE*: Streams and Reading
*SPLIT-FILES*: Compiler Definitions
*STANDARD-INPUT*: Streams and Reading
*STANDARD-OUTPUT*: Streams and Reading
*SYSTEM-DIRECTORY*: System Definitions
*TERMINAL-IO*: Streams and Reading
*TMP-DIR*: GCL Specific
*TOP-LEVEL-HOOK*: System Definitions
*TRACE-OUTPUT*: User Interface

+
+: Numbers
+: User Interface
++: User Interface
+++: User Interface

-
-: User Interface
-: User Interface
-batch: Command Line
-c-file: Command Line
-compile: Command Line
-data-file: Command Line
-dir: Command Line
-eval: Command Line
-f: Command Line
-h-file: Command Line
-libdir: Command Line
-load: Command Line
-o-file: Command Line
-system-p: Command Line

/
/: Numbers
/: User Interface
//: User Interface
///: User Interface
/=: Numbers

1
1+: Numbers
1-: Numbers

<
<: Numbers
<=: Numbers

=
=: Numbers

>
>: Numbers
>=: Numbers

A
ABS: Numbers
ACCEPT: System Definitions
ACONS: Lists
ACOS: Numbers
ACOSH: Numbers
ADDRESS: System Definitions
ADJOIN: Lists
ADJUST-ARRAY: Sequences and Arrays and Hash Tables
ADJUSTABLE-ARRAY-P: Sequences and Arrays and Hash Tables
ALLOCATE: GCL Specific
ALLOCATE-CONTIGUOUS-PAGES: System Definitions
ALLOCATE-GROWTH: System Definitions
ALLOCATE-RELOCATABLE-PAGES: System Definitions
ALLOCATE-SGC: System Definitions
ALLOCATED: System Definitions
ALLOCATED-CONTIGUOUS-PAGES: System Definitions
ALLOCATED-PAGES: System Definitions
ALLOCATED-RELOCATABLE-PAGES: System Definitions
ALPHA-CHAR-P: Characters
ALPHANUMERICP: Characters
AND: Special Forms and Functions
APPEND: Lists
APPLY: Special Forms and Functions
APPLYHOOK: Special Forms and Functions
APROPOS: Doc
APROPOS-LIST: Symbols
AREF: Sequences and Arrays and Hash Tables
ARGC: System Definitions
ARGV: System Definitions
ARRAY-DIMENSION: Sequences and Arrays and Hash Tables
ARRAY-DIMENSION-LIMIT: Sequences and Arrays and Hash Tables
ARRAY-DIMENSIONS: Sequences and Arrays and Hash Tables
ARRAY-ELEMENT-TYPE: Sequences and Arrays and Hash Tables
ARRAY-HAS-FILL-POINTER-P: Sequences and Arrays and Hash Tables
ARRAY-IN-BOUNDS-P: Sequences and Arrays and Hash Tables
ARRAY-RANK: Sequences and Arrays and Hash Tables
ARRAY-RANK-LIMIT: Sequences and Arrays and Hash Tables
ARRAY-ROW-MAJOR-INDEX: Sequences and Arrays and Hash Tables
ARRAY-TOTAL-SIZE: Sequences and Arrays and Hash Tables
ARRAY-TOTAL-SIZE-LIMIT: Sequences and Arrays and Hash Tables
ARRAYP: Sequences and Arrays and Hash Tables
ASH: Numbers
ASIN: Numbers
ASINH: Numbers
ASSERT: Type
ASSOC: Lists
ASSOC-IF: Lists
ASSOC-IF-NOT: Lists
ATAN: Numbers
ATANH: Numbers
ATOM: Lists

B
BDS-VAL: System Definitions
BDS-VAR: System Definitions
BIT: Sequences and Arrays and Hash Tables
BIT-AND: Numbers
BIT-ANDC1: Numbers
BIT-ANDC2: Numbers
BIT-EQV: Sequences and Arrays and Hash Tables
BIT-IOR: Sequences and Arrays and Hash Tables
BIT-NAND: Numbers
BIT-NOR: Numbers
BIT-NOT: Sequences and Arrays and Hash Tables
BIT-ORC1: Sequences and Arrays and Hash Tables
BIT-ORC2: Sequences and Arrays and Hash Tables
BIT-VECTOR-P: Sequences and Arrays and Hash Tables
BIT-XOR: Sequences and Arrays and Hash Tables
BLOCK: Special Forms and Functions
BOOLE: Numbers
BOOLE-1: Numbers
BOOLE-2: Numbers
BOOLE-AND: Numbers
BOOLE-ANDC1: Numbers
BOOLE-ANDC2: Numbers
BOOLE-C1: Numbers
BOOLE-C2: Numbers
BOOLE-CLR: Numbers
BOOLE-EQV: Numbers
BOOLE-IOR: Numbers
BOOLE-NAND: Numbers
BOOLE-NOR: Numbers
BOOLE-ORC1: Numbers
BOOLE-ORC2: Numbers
BOOLE-SET: Numbers
BOOLE-XOR: Numbers
BOTH-CASE-P: Characters
BOUNDP: Symbols
BREAK: User Interface
BREAK-FUNCTION: System Definitions
BREAK-ON-FLOATING-POINT-EXCEPTIONS: Operating System Definitions
BUTLAST: Lists
BY: GCL Specific
BYE: GCL Specific
BYTE: Numbers
BYTE-POSITION: Numbers
BYTE-SIZE: Numbers

C
CAAAAR: Lists
CAAADR: Lists
CAAAR: Lists
CAADAR: Lists
CAADDR: Lists
CAADR: Lists
CAAR: Lists
CADAAR: Lists
CADADR: Lists
CADAR: Lists
CADDAR: Lists
CADDDR: Lists
CADDR: Lists
CADR: Lists
CALL-ARGUMENTS-LIMIT: Special Forms and Functions
CAR: Lists
CASE: Special Forms and Functions
CATCH: Special Forms and Functions
CATCH-BAD-SIGNALS: System Definitions
CATCH-FATAL: System Definitions
CCASE: Special Forms and Functions
CDAAAR: Lists
CDAADR: Lists
CDAAR: Lists
CDADAR: Lists
CDADDR: Lists
CDADR: Lists
CDAR: Lists
CDDAAR: Lists
CDDADR: Lists
CDDAR: Lists
CDDDAR: Lists
CDDDDR: Lists
CDDDR: Lists
CDDR: Lists
CDR: Lists
CEILING: Numbers
CERROR: User Interface
CHAR: Sequences and Arrays and Hash Tables
CHAR-BIT: Characters
CHAR-BITS: Characters
CHAR-BITS-LIMIT: Characters
CHAR-CODE: Characters
CHAR-CODE-LIMIT: Numbers
CHAR-CONTROL-BIT: Characters
CHAR-DOWNCASE: Characters
CHAR-EQUAL: Characters
CHAR-FONT: Characters
CHAR-FONT-LIMIT: Characters
CHAR-GREATERP: Characters
CHAR-HYPER-BIT: Characters
CHAR-INT: Numbers
CHAR-LESSP: Characters
CHAR-META-BIT: Characters
CHAR-NAME: Characters
CHAR-NOT-EQUAL: Characters
CHAR-NOT-GREATERP: Characters
CHAR-NOT-LESSP: Characters
CHAR-SUPER-BIT: Characters
CHAR-UPCASE: Characters
CHAR/=: Characters
CHAR<: Characters
CHAR<=: Characters
CHAR=: Characters
CHAR>: Characters
CHAR>=: Characters
CHARACTER: Characters
CHARACTERP: Characters
CHDIR: System Definitions
CHECK-TYPE: Type
CIS: Numbers
CLEAR-INPUT: Streams and Reading
CLEAR-OUTPUT: Streams and Reading
CLINES: GCL Specific
CLOSE: Streams and Reading
CLOSE-FASD: System Definitions
CLRHASH: Sequences and Arrays and Hash Tables
CODE-CHAR: Characters
COERCE: Type
COMMONP: Type
COMPILE: Compilation
COMPILE-FILE: Compilation
COMPILED-FUNCTION-NAME: System Definitions
COMPILED-FUNCTION-P: Compilation
COMPILER-LET: Special Forms and Functions
COMPLEX: Numbers
COMPLEXP: Numbers
CONCATENATE: Sequences and Arrays and Hash Tables
COND: Special Forms and Functions
CONJUGATE: Numbers
CONS: Lists
CONSP: Lists
CONSTANTP: Type
COPY-ALIST: Lists
COPY-ARRAY-PORTION: GCL Specific
COPY-LIST: Lists
COPY-READTABLE: Streams and Reading
COPY-SEQ: Sequences and Arrays and Hash Tables
COPY-STREAM: System Definitions
COPY-SYMBOL: Symbols
COPY-TREE: Lists
COS: Numbers
COSH: Numbers
COUNT: Sequences and Arrays and Hash Tables
COUNT-IF: Sequences and Arrays and Hash Tables
COUNT-IF-NOT: Sequences and Arrays and Hash Tables
CTYPECASE: Special Forms and Functions

D
DBL: System Definitions
DECF: Numbers
DECLARE: Special Forms and Functions
DECODE-FLOAT: Numbers
DECODE-UNIVERSAL-TIME: Operating System Definitions
DEFCFUN: GCL Specific
DEFCONSTANT: Special Forms and Functions
DEFENTRY: GCL Specific
DEFINE-COMPILER-MACRO: System Definitions
DEFINE-INLINE-FUNCTION: System Definitions
DEFINE-MODIFY-MACRO: Special Forms and Functions
DEFINE-SETF-METHOD: Special Forms and Functions
DEFLA: GCL Specific
DEFMACRO: Special Forms and Functions
DEFPARAMETER: Special Forms and Functions
DEFSETF: Special Forms and Functions
DEFSTRUCT: Structures
DEFTYPE: Type
DEFUN: Special Forms and Functions
DEFVAR: Special Forms and Functions
DELETE: Sequences and Arrays and Hash Tables
DELETE-DUPLICATES: Sequences and Arrays and Hash Tables
DELETE-FILE: Operating System Definitions
DELETE-IF: Sequences and Arrays and Hash Tables
DELETE-IF-NOT: Sequences and Arrays and Hash Tables
DENOMINATOR: Numbers
DEPOSIT-FIELD: Numbers
DESCRIBE: User Interface
DIGIT-CHAR: Characters
DIGIT-CHAR-P: Characters
DIRECTORY: Operating System Definitions
DIRECTORY-NAMESTRING: Streams and Reading
DISASSEMBLE: Characters
DISPLACED-ARRAY-P: System Definitions
DO: Streams and Reading
DO*: Iteration and Tests
DO-ALL-SYMBOLS: Iteration and Tests
DO-EXTERNAL-SYMBOLS: Iteration and Tests
DO-SYMBOLS: Iteration and Tests
DOCUMENTATION: Symbols
DOLIST: Iteration and Tests
DOTIMES: Special Forms and Functions
DOUBLE-FLOAT-EPSILON: Numbers
DOUBLE-FLOAT-NEGATIVE-EPSILON: Numbers
DPB: Numbers
DRIBBLE: User Interface
DYNAMIC-EXTENT: Type

E
ECASE: Special Forms and Functions
ED: User Interface
EIGHTH: Lists
ELT: Sequences and Arrays and Hash Tables
EMIT-FN: Compiler Definitions
EMIT-FN: Compiler Definitions
ENCODE-UNIVERSAL-TIME: Operating System Definitions
ENDP: Lists
ENOUGH-NAMESTRING: Operating System Definitions
EQ: Iteration and Tests
EQL: Numbers
EQUAL: Iteration and Tests
EQUALP: Iteration and Tests
ERROR: Special Forms and Functions
ERROR-SET: System Definitions
ETYPECASE: Special Forms and Functions
EVAL: Special Forms and Functions
EVAL-WHEN: Compilation
EVALHOOK: Special Forms and Functions
EVENP: Numbers
EVERY: Sequences and Arrays and Hash Tables
EXP: Numbers
EXPORT: Symbols
EXPT: Numbers

F
FASLINK: System Definitions
FBOUNDP: Symbols
FCEILING: Numbers
FFLOOR: Numbers
FIFTH: Lists
FILE-AUTHOR: Operating System Definitions
FILE-LENGTH: Streams and Reading
FILE-NAMESTRING: Streams and Reading
FILE-POSITION: Operating System Definitions
FILE-WRITE-DATE: Streams and Reading
FILL: Sequences and Arrays and Hash Tables
FILL-POINTER: Sequences and Arrays and Hash Tables
FIND: Sequences and Arrays and Hash Tables
FIND-ALL-SYMBOLS: Symbols
FIND-IF: Sequences and Arrays and Hash Tables
FIND-IF-NOT: Sequences and Arrays and Hash Tables
FIND-PACKAGE: Symbols
FIND-SHARING-TOP: System Definitions
FIND-SYMBOL: Symbols
FINISH-OUTPUT: Streams and Reading
FIRST: Lists
FIXNUMP: System Definitions
FLET: Special Forms and Functions
FLOAT: Numbers
FLOAT-DIGITS: Numbers
FLOAT-PRECISION: Numbers
FLOAT-RADIX: Numbers
FLOAT-SIGN: Numbers
FLOATP: Numbers
FLOOR: Numbers
FMAKUNBOUND: Symbols
FORCE-OUTPUT: Streams and Reading
FORMAT: Streams and Reading
FOURTH: Lists
FP-INPUT-STREAM: System Definitions
FP-OUTPUT-STREAM: System Definitions
FREAD: System Definitions
FREEZE-DEFSTRUCT: System Definitions
FRESH-LINE: Streams and Reading
FROUND: Numbers
FRS-BDS: System Definitions
FRS-IHS: System Definitions
FRS-VS: System Definitions
FTRUNCATE: Numbers
FUNCALL: Special Forms and Functions
FUNCTION: Special Forms and Functions
FUNCTIONP: Special Forms and Functions
FWRITE: System Definitions

G
GBC: GCL Specific
GBC-TIME: System Definitions
GCD: Numbers
GENSYM: Symbols
GENTEMP: Symbols
GET: Symbols
GET-DECODED-TIME: Operating System Definitions
GET-DISPATCH-MACRO-CHARACTER: Streams and Reading
GET-HOLE-SIZE: System Definitions
GET-INTERNAL-REAL-TIME: Operating System Definitions
GET-INTERNAL-RUN-TIME: Operating System Definitions
GET-MACRO-CHARACTER: Streams and Reading
GET-OUTPUT-STREAM-STRING: Streams and Reading
GET-PROPERTIES: Lists
GET-SETF-METHOD: Special Forms and Functions
GET-SETF-METHOD-MULTIPLE-VALUE: Special Forms and Functions
GET-STRING-INPUT-STREAM-INDEX: System Definitions
GET-UNIVERSAL-TIME: Operating System Definitions
GETENV: System Definitions
GETF: Lists
GETHASH: Sequences and Arrays and Hash Tables
GO: Special Forms and Functions
GPROF-QUIT: Compilation
GPROF-SET: Compilation
GPROF-START: Compilation
GRAPHIC-CHAR-P: Characters

H
HASH-TABLE-COUNT: Sequences and Arrays and Hash Tables
HASH-TABLE-P: Sequences and Arrays and Hash Tables
HELP: Structures
HELP*: GCL Specific
HOST-NAMESTRING: Operating System Definitions

I
IDENTITY: Special Forms and Functions
IF: Special Forms and Functions
IHS-FUN: System Definitions
IHS-VS: System Definitions
IMAGPART: Numbers
IMPORT: Symbols
IN-PACKAGE: Symbols
INCF: Numbers
INFO: Doc
INIT-SYSTEM: System Definitions
INPUT-STREAM-P: Streams and Reading
INSPECT: User Interface
INT-CHAR: Numbers
INTEGER-DECODE-FLOAT: Numbers
INTEGER-LENGTH: Numbers
INTEGERP: Numbers
INTERN: Symbols
INTERNAL-TIME-UNITS-PER-SECOND: Operating System Definitions
INTERSECTION: Lists
ISQRT: Numbers

K
KEYWORDP: Symbols

L
LABELS: Special Forms and Functions
LAMBDA-LIST-KEYWORDS: Special Forms and Functions
LAMBDA-PARAMETERS-LIMIT: Special Forms and Functions
LAST: Lists
LCM: Numbers
LDB: Numbers
LDB-TEST: Numbers
LDIFF: Lists
LEAST-NEGATIVE-DOUBLE-FLOAT: Numbers
LEAST-NEGATIVE-LONG-FLOAT: Numbers
LEAST-NEGATIVE-SHORT-FLOAT: Numbers
LEAST-NEGATIVE-SINGLE-FLOAT: Numbers
LEAST-POSITIVE-DOUBLE-FLOAT: Numbers
LEAST-POSITIVE-LONG-FLOAT: Numbers
LEAST-POSITIVE-SHORT-FLOAT: Numbers
LEAST-POSITIVE-SINGLE-FLOAT: Numbers
LENGTH: Lists
LET: Special Forms and Functions
LET*: Special Forms and Functions
LINK: Compilation
LISP-IMPLEMENTATION-TYPE: Operating System Definitions
LISP-IMPLEMENTATION-VERSION: Operating System Definitions
LIST: Lists
LIST*: Lists
LIST-ALL-PACKAGES: Symbols
LIST-LENGTH: Lists
LIST-UNCALLED-FUNCTIONS: Compiler Definitions
LIST-UNDEFINED-FUNCTIONS: Compiler Definitions
LISTEN: Streams and Reading
LISTP: Lists
LOAD: Streams and Reading
LOCALLY: Special Forms and Functions
LOG: Numbers
LOGAND: Numbers
LOGANDC1: Numbers
LOGANDC2: Numbers
LOGBITP: Numbers
LOGCOUNT: Numbers
LOGEQV: Numbers
LOGIOR: Numbers
LOGNAND: Numbers
LOGNOR: Numbers
LOGNOT: Numbers
LOGORC1: Numbers
LOGORC2: Numbers
LOGTEST: Numbers
LOGXOR: Numbers
LONG-FLOAT-EPSILON: Numbers
LONG-FLOAT-NEGATIVE-EPSILON: Numbers
LONG-SITE-NAME: Operating System Definitions
LOOP: Iteration and Tests
LOWER-CASE-P: Characters

M
MACHINE-INSTANCE: Operating System Definitions
MACHINE-TYPE: Operating System Definitions
MACHINE-VERSION: GCL Specific
MACRO-FUNCTION: Symbols
MACROEXPAND: Special Forms and Functions
MACROEXPAND-1: Special Forms and Functions
MACROLET: Special Forms and Functions
MAKE-ALL-PROCLAIMS: Compiler Definitions
MAKE-ARRAY: Sequences and Arrays and Hash Tables
MAKE-BROADCAST-STREAM: Streams and Reading
MAKE-CHAR: Characters
MAKE-CONCATENATED-STREAM: Streams and Reading
MAKE-DISPATCH-MACRO-CHARACTER: Streams and Reading
MAKE-ECHO-STREAM: Streams and Reading
MAKE-HASH-TABLE: Sequences and Arrays and Hash Tables
MAKE-LIST: Lists
MAKE-PACKAGE: Symbols
MAKE-PATHNAME: Streams and Reading
MAKE-PROCLAIMS: Compiler Definitions
MAKE-RANDOM-STATE: Numbers
MAKE-SEQUENCE: Sequences and Arrays and Hash Tables
MAKE-STRING: Sequences and Arrays and Hash Tables
MAKE-STRING-INPUT-STREAM: Streams and Reading
MAKE-STRING-INPUT-STREAM: User Interface
MAKE-STRING-OUTPUT-STREAM: Streams and Reading
MAKE-STRING-OUTPUT-STREAM-FROM-STRING: System Definitions
MAKE-SYMBOL: Symbols
MAKE-SYNONYM-STREAM: Streams and Reading
MAKE-TWO-WAY-STREAM: Streams and Reading
MAKUNBOUND: Symbols
MAP: Sequences and Arrays and Hash Tables
MAPC: Lists
MAPCAN: Lists
MAPCAR: Iteration and Tests
MAPCON: Lists
MAPHASH: Iteration and Tests
MAPL: Lists
MAPLIST: Lists
MASK-FIELD: Numbers
MATCH-BEGINNING: System Definitions
MATCH-END: System Definitions
MAX: Numbers
MAXIMUM-ALLOCATABLE-PAGES: System Definitions
MAXIMUM-CONTIGUOUS-PAGES: System Definitions
MEMBER: Lists
MEMBER-IF: Lists
MEMBER-IF-NOT: Lists
MERGE: Sequences and Arrays and Hash Tables
MERGE-PATHNAMES: Streams and Reading
MIN: Numbers
MINUSP: Numbers
MISMATCH: Sequences and Arrays and Hash Tables
MOD: Numbers
MODF: Numbers
MOST-NEGATIVE-DOUBLE-FLOAT: Numbers
MOST-NEGATIVE-FIXNUM: Numbers
MOST-NEGATIVE-LONG-FLOAT: Numbers
MOST-NEGATIVE-SHORT-FLOAT: Numbers
MOST-NEGATIVE-SINGLE-FLOAT: Numbers
MOST-POSITIVE-DOUBLE-FLOAT: Numbers
MOST-POSITIVE-FIXNUM: Numbers
MOST-POSITIVE-LONG-FLOAT: Numbers
MOST-POSITIVE-SHORT-FLOAT: Numbers
MOST-POSITIVE-SINGLE-FLOAT: Numbers
MULTIPLE-VALUE-BIND: Special Forms and Functions
MULTIPLE-VALUE-CALL: Special Forms and Functions
MULTIPLE-VALUE-LIST: Special Forms and Functions
MULTIPLE-VALUE-PROG1: Special Forms and Functions
MULTIPLE-VALUE-SETQ: Special Forms and Functions
MULTIPLE-VALUES-LIMIT: Special Forms and Functions

N
NAME-CHAR: Characters
NAMESTRING: Streams and Reading
NANI: System Definitions
NBUTLAST: Lists
NCONC: Lists
NIL: Symbols
NINTERSECTION: Lists
NINTH: Lists
NLOAD: System Definitions
NOT: Special Forms and Functions
NOTANY: Sequences and Arrays and Hash Tables
NOTEVERY: Sequences and Arrays and Hash Tables
NRECONC: Lists
NREVERSE: Sequences and Arrays and Hash Tables
NSET-DIFFERENCE: Lists
NSET-EXCLUSIVE-OR: Lists
NSTRING-CAPITALIZE: Sequences and Arrays and Hash Tables
NSTRING-DOWNCASE: Sequences and Arrays and Hash Tables
NSTRING-UPCASE: Sequences and Arrays and Hash Tables
NSUBLIS: Lists
NSUBST: Lists
NSUBST-IF: Lists
NSUBST-IF-NOT: Lists
NSUBSTITUTE: Sequences and Arrays and Hash Tables
NSUBSTITUTE-IF: Sequences and Arrays and Hash Tables
NSUBSTITUTE-IF-NOT: Sequences and Arrays and Hash Tables
NTH: Lists
NTHCDR: Lists
NULL: Lists
NUMBERP: Numbers
NUMERATOR: Numbers
NUNION: Lists

O
ODDP: Numbers
OPEN: Streams and Reading
OPEN-FASD: System Definitions
OR: Special Forms and Functions
OUTPUT-STREAM-P: Streams and Reading
OUTPUT-STREAM-STRING: System Definitions

P
PACKAGE-NAME: Symbols
PACKAGE-NICKNAMES: Symbols
PACKAGE-SHADOWING-SYMBOLS: Symbols
PACKAGE-USE-LIST: Symbols
PACKAGE-USED-BY-LIST: Symbols
PACKAGEP: Symbols
PAIRLIS: Lists
PARSE-INTEGER: Numbers
PARSE-NAMESTRING: Streams and Reading
PATHNAME: Streams and Reading
PATHNAME-DEVICE: Streams and Reading
PATHNAME-DIRECTORY: Streams and Reading
PATHNAME-HOST: Operating System Definitions
PATHNAME-NAME: Streams and Reading
PATHNAME-TYPE: Streams and Reading
PATHNAME-VERSION: Streams and Reading
PATHNAMEP: Streams and Reading
PEEK-CHAR: Streams and Reading
PHASE: Numbers
PI: Numbers
PLUSP: Numbers
POP: Lists
POSITION: Sequences and Arrays and Hash Tables
POSITION-IF: Sequences and Arrays and Hash Tables
POSITION-IF-NOT: Sequences and Arrays and Hash Tables
PPRINT: Streams and Reading
PRIN1: Streams and Reading
PRIN1-TO-STRING: Streams and Reading
PRINC: Streams and Reading
PRINC-TO-STRING: Streams and Reading
PRINT: Streams and Reading
PROBE-FILE: Streams and Reading
PROCLAIM: Compilation
PROCLAMATION: GCL Specific
PROF: System Definitions
PROG: Special Forms and Functions
PROG*: Special Forms and Functions
PROG1: Special Forms and Functions
PROG2: Special Forms and Functions
PROGN: Special Forms and Functions
PROGV: Special Forms and Functions
PROVIDE: Compilation
PSETF: Special Forms and Functions
PSETQ: Symbols
PUSH: Lists
PUSHNEW: Lists
PUTPROP: System Definitions

Q
QUOTE: Special Forms and Functions

R
RANDOM: Numbers
RANDOM-STATE-P: Numbers
RASSOC: Lists
RASSOC-IF: Lists
RASSOC-IF-NOT: Lists
RATIONAL: Numbers
RATIONALIZE: Numbers
RATIONALP: Numbers
READ: Streams and Reading
READ-BYTE: Streams and Reading
READ-CHAR: Streams and Reading
READ-CHAR-NO-HANG: Streams and Reading
READ-DELIMITED-LIST: Streams and Reading
READ-FASD-TOP: System Definitions
READ-FROM-STRING: Streams and Reading
READ-LINE: Streams and Reading
READ-PRESERVING-WHITESPACE: Streams and Reading
READLINE-OFF: Streams and Reading
READLINE-ON: Streams and Reading
READTABLEP: Streams and Reading
REALPART: Numbers
REDUCE: Sequences and Arrays and Hash Tables
REM: Numbers
REMF: Symbols
REMHASH: Sequences and Arrays and Hash Tables
REMOVE: Sequences and Arrays and Hash Tables
REMOVE-DUPLICATES: Sequences and Arrays and Hash Tables
REMOVE-IF: Sequences and Arrays and Hash Tables
REMOVE-IF-NOT: Sequences and Arrays and Hash Tables
REMPROP: Symbols
RENAME-FILE: Operating System Definitions
RENAME-PACKAGE: Symbols
REPLACE: Sequences and Arrays and Hash Tables
REQUIRE: Operating System Definitions
RESET-GBC-COUNT: System Definitions
RESET-STACK-LIMITS: System Definitions
REST: Lists
RETURN: Special Forms and Functions
RETURN-FROM: Special Forms and Functions
REVAPPEND: Lists
REVERSE: Sequences and Arrays and Hash Tables
ROOM: Operating System Definitions
ROTATEF: Numbers
ROUND: Numbers
RPLACA: Lists
RPLACD: Lists
RUN-PROCESS: System Definitions

S
SAVE: GCL Specific
SAVE-SYSTEM: System Definitions
SBIT: Sequences and Arrays and Hash Tables
SCALE-FLOAT: Numbers
SCHAR: Characters
SEARCH: Sequences and Arrays and Hash Tables
SECOND: Lists
SET: Symbols
SET-CHAR-BIT: Characters
SET-DIFFERENCE: Lists
SET-DISPATCH-MACRO-CHARACTER: Streams and Reading
SET-EXCLUSIVE-OR: Lists
SET-HOLE-SIZE: System Definitions
SET-MACRO-CHARACTER: Streams and Reading
SET-SYNTAX-FROM-CHAR: Streams and Reading
SETF: Special Forms and Functions
SETQ: Symbols
SEVENTH: Lists
SGC-ON: System Definitions
SHADOW: Symbols
SHADOWING-IMPORT: Symbols
SHIFTF: Numbers
SHORT-FLOAT-EPSILON: Numbers
SHORT-FLOAT-NEGATIVE-EPSILON: Numbers
SHORT-SITE-NAME: Operating System Definitions
SIGNUM: Numbers
SIMPLE-BIT-VECTOR-P: Sequences and Arrays and Hash Tables
SIMPLE-STRING-P: Sequences and Arrays and Hash Tables
SIMPLE-VECTOR-P: Sequences and Arrays and Hash Tables
SIN: Numbers
SINGLE-FLOAT-EPSILON: Numbers
SINGLE-FLOAT-NEGATIVE-EPSILON: Numbers
SINH: Numbers
SIXTH: Lists
SLEEP: Operating System Definitions
SOCKET: System Definitions
SOFTWARE-TYPE: Operating System Definitions
SOFTWARE-VERSION: Operating System Definitions
SOME: Sequences and Arrays and Hash Tables
SORT: Sequences and Arrays and Hash Tables
SPECIAL-FORM-P: Special Forms and Functions
SPECIALP: System Definitions
SQRT: Numbers
STABLE-SORT: Sequences and Arrays and Hash Tables
STANDARD-CHAR-P: Characters
STEP: User Interface
STREAM-ELEMENT-TYPE: Streams and Reading
STREAMP: Streams and Reading
STRING: Sequences and Arrays and Hash Tables
STRING-CAPITALIZE: Sequences and Arrays and Hash Tables
STRING-CHAR-P: Characters
STRING-CONCATENATE: System Definitions
STRING-DOWNCASE: Sequences and Arrays and Hash Tables
STRING-EQUAL: Sequences and Arrays and Hash Tables
STRING-GREATERP: Sequences and Arrays and Hash Tables
STRING-LEFT-TRIM: Sequences and Arrays and Hash Tables
STRING-LESSP: Sequences and Arrays and Hash Tables
STRING-MATCH: System Definitions
STRING-NOT-EQUAL: Sequences and Arrays and Hash Tables
STRING-NOT-GREATERP: Sequences and Arrays and Hash Tables
STRING-NOT-LESSP: Sequences and Arrays and Hash Tables
STRING-RIGHT-TRIM: Sequences and Arrays and Hash Tables
STRING-TO-OBJECT: System Definitions
STRING-TRIM: Sequences and Arrays and Hash Tables
STRING-UPCASE: Sequences and Arrays and Hash Tables
STRING/=: Sequences and Arrays and Hash Tables
STRING<: Sequences and Arrays and Hash Tables
STRING<=: Sequences and Arrays and Hash Tables
STRING=: Sequences and Arrays and Hash Tables
STRING>: Sequences and Arrays and Hash Tables
STRING>=: Sequences and Arrays and Hash Tables
STRINGP: Sequences and Arrays and Hash Tables
STRUCTUREP: System Definitions
SUBLIS: Lists
SUBSEQ: Sequences and Arrays and Hash Tables
SUBSETP: Lists
SUBST: Lists
SUBST-IF: Lists
SUBST-IF-NOT: Lists
SUBSTITUTE: Sequences and Arrays and Hash Tables
SUBSTITUTE-IF: Sequences and Arrays and Hash Tables
SUBSTITUTE-IF-NOT: Sequences and Arrays and Hash Tables
SUBTYPEP: Type
SVREF: Sequences and Arrays and Hash Tables
SXHASH: Numbers
SYMBOL-FUNCTION: Symbols
SYMBOL-NAME: Symbols
SYMBOL-PACKAGE: Symbols
SYMBOL-PLIST: Symbols
SYMBOL-VALUE: Symbols
SYMBOLP: Symbols
SYSTEM: GCL Specific

T
T: Symbols
TAGBODY: Special Forms and Functions
TAILP: Lists
TAN: Numbers
TANH: Numbers
TENTH: Lists
TERPRI: Streams and Reading
THE: Special Forms and Functions
THIRD: Lists
THROW: Special Forms and Functions
TIME: Operating System Definitions
TOP-LEVEL: System Definitions
TRACE: User Interface
TREE-EQUAL: Lists
TRUENAME: Streams and Reading
TRUNCATE: Numbers
TYPE-OF: Type
TYPECASE: Special Forms and Functions
TYPEP: Type

U
UNCATCH-BAD-SIGNALS: System Definitions
UNEXPORT: Symbols
UNINTERN: Symbols
UNION: Lists
UNIVERSAL-ERROR-HANDLER: System Definitions
UNLESS: Special Forms and Functions
UNREAD-CHAR: Streams and Reading
UNTRACE: User Interface
UNUSE-PACKAGE: Symbols
UNWIND-PROTECT: Special Forms and Functions
UPPER-CASE-P: Characters
USE-FAST-LINKS: GCL Specific
USE-PACKAGE: Symbols
USER-HOMEDIR-PATHNAME: Operating System Definitions

V
VALUES: Special Forms and Functions
VALUES-LIST: Special Forms and Functions
VECTOR: Sequences and Arrays and Hash Tables
VECTOR-POP: Sequences and Arrays and Hash Tables
VECTOR-PUSH: Sequences and Arrays and Hash Tables
VECTOR-PUSH-EXTEND: Sequences and Arrays and Hash Tables
VECTORP: Sequences and Arrays and Hash Tables
VS: System Definitions

W
WARN: User Interface
WHEN: Special Forms and Functions
WHO-CALLS: Compiler Definitions
WITH-INPUT-FROM-STRING: Streams and Reading
WITH-OPEN-FILE: Streams and Reading
WITH-OPEN-STREAM: Streams and Reading
WITH-OUTPUT-TO-STRING: Streams and Reading
WRITE: Streams and Reading
WRITE-BYTE: Streams and Reading
WRITE-CHAR: Streams and Reading
WRITE-DEBUG-SYMBOLS: System Definitions
WRITE-FASD-TOP: System Definitions
WRITE-LINE: Streams and Reading
WRITE-STRING: Streams and Reading
WRITE-TO-STRING: Streams and Reading

X
XDR-OPEN: System Definitions
XDR-READ: System Definitions
XDR-WRITE: System Definitions

Y
Y-OR-N-P: Streams and Reading
YES-OR-NO-P: Iteration and Tests
*
*: Numbers
*: User Interface
**: User Interface
***: User Interface
*AFTER-GBC-HOOK*: System Definitions
*APPLYHOOK*: Special Forms and Functions
*BREAK-ENABLE*: User Interface
*BREAK-ON-WARNINGS*: User Interface
*CASE-FOLD-SEARCH*: System Definitions
*CC*: Compiler Definitions
*CMPINCLUDE-STRING*: Compiler Definitions
*COMPILE-ORDINARIES*: Compiler Definitions
*DEBUG-IO*: User Interface
*DEFAULT-C-FILE*: Compilation
*DEFAULT-DATA-FILE*: Compilation
*DEFAULT-H-FILE*: Compilation
*DEFAULT-PATHNAME-DEFAULTS*: Operating System Definitions
*DEFAULT-SYSTEM-P*: Compilation
*DEFAULT-TIME-ZONE*: System Definitions
*ERROR-OUTPUT*: User Interface
*EVALHOOK*: Special Forms and Functions
*FEATURES*: Compilation
*GBC-MESSAGE*: System Definitions
*GBC-NOTIFY*: System Definitions
*IGNORE-EOF-ON-TERMINAL-IO*: System Definitions
*IGNORE-MAXIMUM-PAGES*: GCL Specific
*INDENT-FORMATTED-OUTPUT*: System Definitions
*info-paths*: Doc
*INTERRUPT-ENABLE*: System Definitions
*LISP-MAXPAGES*: System Definitions
*LOAD-PATHNAME*: System Definitions
*LOAD-VERBOSE*: Streams and Reading
*MACROEXPAND-HOOK*: Special Forms and Functions
*MAKE-CONSTANT: System Definitions
*MAKE-SPECIAL: System Definitions
*MODULES*: Operating System Definitions
*MULTIPLY-STACKS*: System Definitions
*NOTIFY-GBC*: System Definitions
*OPTIMIZE-MAXIMUM-PAGES*: GCL Specific
*PACKAGE*: Symbols
*PRINT-ARRAY*: Streams and Reading
*PRINT-BASE*: Streams and Reading
*PRINT-CASE*: Streams and Reading
*PRINT-CIRCLE*: Streams and Reading
*PRINT-ESCAPE*: Streams and Reading
*PRINT-GENSYM*: Streams and Reading
*PRINT-LENGTH*: Streams and Reading
*PRINT-LEVEL*: Streams and Reading
*PRINT-PRETTY*: Streams and Reading
*PRINT-RADIX*: Streams and Reading
*QUERY-IO*: Streams and Reading
*RANDOM-STATE*: Numbers
*READ-BASE*: Streams and Reading
*READ-DEFAULT-FLOAT-FORMAT*: Streams and Reading
*READ-SUPPRESS*: Streams and Reading
*READLINE-PREFIX*: Streams and Reading
*READTABLE*: Streams and Reading
*SPLIT-FILES*: Compiler Definitions
*STANDARD-INPUT*: Streams and Reading
*STANDARD-OUTPUT*: Streams and Reading
*SYSTEM-DIRECTORY*: System Definitions
*TERMINAL-IO*: Streams and Reading
*TMP-DIR*: GCL Specific
*TOP-LEVEL-HOOK*: System Definitions
*TRACE-OUTPUT*: User Interface

+
+: Numbers
+: User Interface
++: User Interface
+++: User Interface

-
-: User Interface
-: User Interface
-batch: Command Line
-c-file: Command Line
-compile: Command Line
-data-file: Command Line
-dir: Command Line
-eval: Command Line
-f: Command Line
-h-file: Command Line
-libdir: Command Line
-load: Command Line
-o-file: Command Line
-system-p: Command Line

/
/: Numbers
/: User Interface
//: User Interface
///: User Interface
/=: Numbers

1
1+: Numbers
1-: Numbers

<
<: Numbers
<=: Numbers

=
=: Numbers

>
>: Numbers
>=: Numbers

A
ABS: Numbers
ACCEPT: System Definitions
ACONS: Lists
ACOS: Numbers
ACOSH: Numbers
ADDRESS: System Definitions
ADJOIN: Lists
ADJUST-ARRAY: Sequences and Arrays and Hash Tables
ADJUSTABLE-ARRAY-P: Sequences and Arrays and Hash Tables
ALLOCATE: GCL Specific
ALLOCATE-CONTIGUOUS-PAGES: System Definitions
ALLOCATE-GROWTH: System Definitions
ALLOCATE-RELOCATABLE-PAGES: System Definitions
ALLOCATE-SGC: System Definitions
ALLOCATED: System Definitions
ALLOCATED-CONTIGUOUS-PAGES: System Definitions
ALLOCATED-PAGES: System Definitions
ALLOCATED-RELOCATABLE-PAGES: System Definitions
ALPHA-CHAR-P: Characters
ALPHANUMERICP: Characters
AND: Special Forms and Functions
APPEND: Lists
APPLY: Special Forms and Functions
APPLYHOOK: Special Forms and Functions
APROPOS: Doc
APROPOS-LIST: Symbols
AREF: Sequences and Arrays and Hash Tables
ARGC: System Definitions
ARGV: System Definitions
ARRAY-DIMENSION: Sequences and Arrays and Hash Tables
ARRAY-DIMENSION-LIMIT: Sequences and Arrays and Hash Tables
ARRAY-DIMENSIONS: Sequences and Arrays and Hash Tables
ARRAY-ELEMENT-TYPE: Sequences and Arrays and Hash Tables
ARRAY-HAS-FILL-POINTER-P: Sequences and Arrays and Hash Tables
ARRAY-IN-BOUNDS-P: Sequences and Arrays and Hash Tables
ARRAY-RANK: Sequences and Arrays and Hash Tables
ARRAY-RANK-LIMIT: Sequences and Arrays and Hash Tables
ARRAY-ROW-MAJOR-INDEX: Sequences and Arrays and Hash Tables
ARRAY-TOTAL-SIZE: Sequences and Arrays and Hash Tables
ARRAY-TOTAL-SIZE-LIMIT: Sequences and Arrays and Hash Tables
ARRAYP: Sequences and Arrays and Hash Tables
ASH: Numbers
ASIN: Numbers
ASINH: Numbers
ASSERT: Type
ASSOC: Lists
ASSOC-IF: Lists
ASSOC-IF-NOT: Lists
ATAN: Numbers
ATANH: Numbers
ATOM: Lists

B
BDS-VAL: System Definitions
BDS-VAR: System Definitions
BIT: Sequences and Arrays and Hash Tables
BIT-AND: Numbers
BIT-ANDC1: Numbers
BIT-ANDC2: Numbers
BIT-EQV: Sequences and Arrays and Hash Tables
BIT-IOR: Sequences and Arrays and Hash Tables
BIT-NAND: Numbers
BIT-NOR: Numbers
BIT-NOT: Sequences and Arrays and Hash Tables
BIT-ORC1: Sequences and Arrays and Hash Tables
BIT-ORC2: Sequences and Arrays and Hash Tables
BIT-VECTOR-P: Sequences and Arrays and Hash Tables
BIT-XOR: Sequences and Arrays and Hash Tables
BLOCK: Special Forms and Functions
BOOLE: Numbers
BOOLE-1: Numbers
BOOLE-2: Numbers
BOOLE-AND: Numbers
BOOLE-ANDC1: Numbers
BOOLE-ANDC2: Numbers
BOOLE-C1: Numbers
BOOLE-C2: Numbers
BOOLE-CLR: Numbers
BOOLE-EQV: Numbers
BOOLE-IOR: Numbers
BOOLE-NAND: Numbers
BOOLE-NOR: Numbers
BOOLE-ORC1: Numbers
BOOLE-ORC2: Numbers
BOOLE-SET: Numbers
BOOLE-XOR: Numbers
BOTH-CASE-P: Characters
BOUNDP: Symbols
BREAK: User Interface
BREAK-FUNCTION: System Definitions
BREAK-ON-FLOATING-POINT-EXCEPTIONS: Operating System Definitions
BUTLAST: Lists
BY: GCL Specific
BYE: GCL Specific
BYTE: Numbers
BYTE-POSITION: Numbers
BYTE-SIZE: Numbers

C
CAAAAR: Lists
CAAADR: Lists
CAAAR: Lists
CAADAR: Lists
CAADDR: Lists
CAADR: Lists
CAAR: Lists
CADAAR: Lists
CADADR: Lists
CADAR: Lists
CADDAR: Lists
CADDDR: Lists
CADDR: Lists
CADR: Lists
CALL-ARGUMENTS-LIMIT: Special Forms and Functions
CAR: Lists
CASE: Special Forms and Functions
CATCH: Special Forms and Functions
CATCH-BAD-SIGNALS: System Definitions
CATCH-FATAL: System Definitions
CCASE: Special Forms and Functions
CDAAAR: Lists
CDAADR: Lists
CDAAR: Lists
CDADAR: Lists
CDADDR: Lists
CDADR: Lists
CDAR: Lists
CDDAAR: Lists
CDDADR: Lists
CDDAR: Lists
CDDDAR: Lists
CDDDDR: Lists
CDDDR: Lists
CDDR: Lists
CDR: Lists
CEILING: Numbers
CERROR: User Interface
CHAR: Sequences and Arrays and Hash Tables
CHAR-BIT: Characters
CHAR-BITS: Characters
CHAR-BITS-LIMIT: Characters
CHAR-CODE: Characters
CHAR-CODE-LIMIT: Numbers
CHAR-CONTROL-BIT: Characters
CHAR-DOWNCASE: Characters
CHAR-EQUAL: Characters
CHAR-FONT: Characters
CHAR-FONT-LIMIT: Characters
CHAR-GREATERP: Characters
CHAR-HYPER-BIT: Characters
CHAR-INT: Numbers
CHAR-LESSP: Characters
CHAR-META-BIT: Characters
CHAR-NAME: Characters
CHAR-NOT-EQUAL: Characters
CHAR-NOT-GREATERP: Characters
CHAR-NOT-LESSP: Characters
CHAR-SUPER-BIT: Characters
CHAR-UPCASE: Characters
CHAR/=: Characters
CHAR<: Characters
CHAR<=: Characters
CHAR=: Characters
CHAR>: Characters
CHAR>=: Characters
CHARACTER: Characters
CHARACTERP: Characters
CHDIR: System Definitions
CHECK-TYPE: Type
CIS: Numbers
CLEAR-INPUT: Streams and Reading
CLEAR-OUTPUT: Streams and Reading
CLINES: GCL Specific
CLOSE: Streams and Reading
CLOSE-FASD: System Definitions
CLRHASH: Sequences and Arrays and Hash Tables
CODE-CHAR: Characters
COERCE: Type
COMMONP: Type
COMPILE: Compilation
COMPILE-FILE: Compilation
COMPILED-FUNCTION-NAME: System Definitions
COMPILED-FUNCTION-P: Compilation
COMPILER-LET: Special Forms and Functions
COMPLEX: Numbers
COMPLEXP: Numbers
CONCATENATE: Sequences and Arrays and Hash Tables
COND: Special Forms and Functions
CONJUGATE: Numbers
CONS: Lists
CONSP: Lists
CONSTANTP: Type
COPY-ALIST: Lists
COPY-ARRAY-PORTION: GCL Specific
COPY-LIST: Lists
COPY-READTABLE: Streams and Reading
COPY-SEQ: Sequences and Arrays and Hash Tables
COPY-STREAM: System Definitions
COPY-SYMBOL: Symbols
COPY-TREE: Lists
COS: Numbers
COSH: Numbers
COUNT: Sequences and Arrays and Hash Tables
COUNT-IF: Sequences and Arrays and Hash Tables
COUNT-IF-NOT: Sequences and Arrays and Hash Tables
CTYPECASE: Special Forms and Functions

D
DBL: System Definitions
DECF: Numbers
DECLARE: Special Forms and Functions
DECODE-FLOAT: Numbers
DECODE-UNIVERSAL-TIME: Operating System Definitions
DEFCFUN: GCL Specific
DEFCONSTANT: Special Forms and Functions
DEFENTRY: GCL Specific
DEFINE-COMPILER-MACRO: System Definitions
DEFINE-INLINE-FUNCTION: System Definitions
DEFINE-MODIFY-MACRO: Special Forms and Functions
DEFINE-SETF-METHOD: Special Forms and Functions
DEFLA: GCL Specific
DEFMACRO: Special Forms and Functions
DEFPARAMETER: Special Forms and Functions
DEFSETF: Special Forms and Functions
DEFSTRUCT: Structures
DEFTYPE: Type
DEFUN: Special Forms and Functions
DEFVAR: Special Forms and Functions
DELETE: Sequences and Arrays and Hash Tables
DELETE-DUPLICATES: Sequences and Arrays and Hash Tables
DELETE-FILE: Operating System Definitions
DELETE-IF: Sequences and Arrays and Hash Tables
DELETE-IF-NOT: Sequences and Arrays and Hash Tables
DENOMINATOR: Numbers
DEPOSIT-FIELD: Numbers
DESCRIBE: User Interface
DIGIT-CHAR: Characters
DIGIT-CHAR-P: Characters
DIRECTORY: Operating System Definitions
DIRECTORY-NAMESTRING: Streams and Reading
DISASSEMBLE: Characters
DISPLACED-ARRAY-P: System Definitions
DO: Streams and Reading
DO*: Iteration and Tests
DO-ALL-SYMBOLS: Iteration and Tests
DO-EXTERNAL-SYMBOLS: Iteration and Tests
DO-SYMBOLS: Iteration and Tests
DOCUMENTATION: Symbols
DOLIST: Iteration and Tests
DOTIMES: Special Forms and Functions
DOUBLE-FLOAT-EPSILON: Numbers
DOUBLE-FLOAT-NEGATIVE-EPSILON: Numbers
DPB: Numbers
DRIBBLE: User Interface
DYNAMIC-EXTENT: Type

E
ECASE: Special Forms and Functions
ED: User Interface
EIGHTH: Lists
ELT: Sequences and Arrays and Hash Tables
EMIT-FN: Compiler Definitions
EMIT-FN: Compiler Definitions
ENCODE-UNIVERSAL-TIME: Operating System Definitions
ENDP: Lists
ENOUGH-NAMESTRING: Operating System Definitions
EQ: Iteration and Tests
EQL: Numbers
EQUAL: Iteration and Tests
EQUALP: Iteration and Tests
ERROR: Special Forms and Functions
ERROR-SET: System Definitions
ETYPECASE: Special Forms and Functions
EVAL: Special Forms and Functions
EVAL-WHEN: Compilation
EVALHOOK: Special Forms and Functions
EVENP: Numbers
EVERY: Sequences and Arrays and Hash Tables
EXP: Numbers
EXPORT: Symbols
EXPT: Numbers

F
FASLINK: System Definitions
FBOUNDP: Symbols
FCEILING: Numbers
FFLOOR: Numbers
FIFTH: Lists
FILE-AUTHOR: Operating System Definitions
FILE-LENGTH: Streams and Reading
FILE-NAMESTRING: Streams and Reading
FILE-POSITION: Operating System Definitions
FILE-WRITE-DATE: Streams and Reading
FILL: Sequences and Arrays and Hash Tables
FILL-POINTER: Sequences and Arrays and Hash Tables
FIND: Sequences and Arrays and Hash Tables
FIND-ALL-SYMBOLS: Symbols
FIND-IF: Sequences and Arrays and Hash Tables
FIND-IF-NOT: Sequences and Arrays and Hash Tables
FIND-PACKAGE: Symbols
FIND-SHARING-TOP: System Definitions
FIND-SYMBOL: Symbols
FINISH-OUTPUT: Streams and Reading
FIRST: Lists
FIXNUMP: System Definitions
FLET: Special Forms and Functions
FLOAT: Numbers
FLOAT-DIGITS: Numbers
FLOAT-PRECISION: Numbers
FLOAT-RADIX: Numbers
FLOAT-SIGN: Numbers
FLOATP: Numbers
FLOOR: Numbers
FMAKUNBOUND: Symbols
FORCE-OUTPUT: Streams and Reading
FORMAT: Streams and Reading
FOURTH: Lists
FP-INPUT-STREAM: System Definitions
FP-OUTPUT-STREAM: System Definitions
FREAD: System Definitions
FREEZE-DEFSTRUCT: System Definitions
FRESH-LINE: Streams and Reading
FROUND: Numbers
FRS-BDS: System Definitions
FRS-IHS: System Definitions
FRS-VS: System Definitions
FTRUNCATE: Numbers
FUNCALL: Special Forms and Functions
FUNCTION: Special Forms and Functions
FUNCTIONP: Special Forms and Functions
FWRITE: System Definitions

G
GBC: GCL Specific
GBC-TIME: System Definitions
GCD: Numbers
GENSYM: Symbols
GENTEMP: Symbols
GET: Symbols
GET-DECODED-TIME: Operating System Definitions
GET-DISPATCH-MACRO-CHARACTER: Streams and Reading
GET-HOLE-SIZE: System Definitions
GET-INTERNAL-REAL-TIME: Operating System Definitions
GET-INTERNAL-RUN-TIME: Operating System Definitions
GET-MACRO-CHARACTER: Streams and Reading
GET-OUTPUT-STREAM-STRING: Streams and Reading
GET-PROPERTIES: Lists
GET-SETF-METHOD-MULTIPLE-VALUE: Special Forms and Functions
GET-STRING-INPUT-STREAM-INDEX: System Definitions
GET-UNIVERSAL-TIME: Operating System Definitions
GETENV: System Definitions
GETF: Lists
GETHASH: Sequences and Arrays and Hash Tables
GO: Special Forms and Functions
GPROF-QUIT: Compilation
GPROF-SET: Compilation
GPROF-START: Compilation
GRAPHIC-CHAR-P: Characters

H
HASH-TABLE-COUNT: Sequences and Arrays and Hash Tables
HASH-TABLE-P: Sequences and Arrays and Hash Tables
HELP: Structures
HELP*: GCL Specific
HOST-NAMESTRING: Operating System Definitions

I
IDENTITY: Special Forms and Functions
IF: Special Forms and Functions
IHS-FUN: System Definitions
IHS-VS: System Definitions
IMAGPART: Numbers
IMPORT: Symbols
IN-PACKAGE: Symbols
INCF: Numbers
INFO: Doc
INIT-SYSTEM: System Definitions
INPUT-STREAM-P: Streams and Reading
INSPECT: User Interface
INT-CHAR: Numbers
INTEGER-DECODE-FLOAT: Numbers
INTEGER-LENGTH: Numbers
INTEGERP: Numbers
INTERN: Symbols
INTERNAL-TIME-UNITS-PER-SECOND: Operating System Definitions
INTERSECTION: Lists
ISQRT: Numbers

K
KEYWORDP: Symbols

L
LABELS: Special Forms and Functions
LAMBDA-LIST-KEYWORDS: Special Forms and Functions
LAMBDA-PARAMETERS-LIMIT: Special Forms and Functions
LAST: Lists
LCM: Numbers
LDB: Numbers
LDB-TEST: Numbers
LDIFF: Lists
LEAST-NEGATIVE-DOUBLE-FLOAT: Numbers
LEAST-NEGATIVE-LONG-FLOAT: Numbers
LEAST-NEGATIVE-SHORT-FLOAT: Numbers
LEAST-NEGATIVE-SINGLE-FLOAT: Numbers
LEAST-POSITIVE-DOUBLE-FLOAT: Numbers
LEAST-POSITIVE-LONG-FLOAT: Numbers
LEAST-POSITIVE-SHORT-FLOAT: Numbers
LEAST-POSITIVE-SINGLE-FLOAT: Numbers
LENGTH: Lists
LET: Special Forms and Functions
LET*: Special Forms and Functions
LINK: Compilation
LISP-IMPLEMENTATION-TYPE: Operating System Definitions
LISP-IMPLEMENTATION-VERSION: Operating System Definitions
LIST: Lists
LIST*: Lists
LIST-ALL-PACKAGES: Symbols
LIST-LENGTH: Lists
LIST-UNCALLED-FUNCTIONS: Compiler Definitions
LIST-UNDEFINED-FUNCTIONS: Compiler Definitions
LISTEN: Streams and Reading
LISTP: Lists
LOAD: Streams and Reading
LOCALLY: Special Forms and Functions
LOG: Numbers
LOGAND: Numbers
LOGANDC1: Numbers
LOGANDC2: Numbers
LOGBITP: Numbers
LOGCOUNT: Numbers
LOGEQV: Numbers
LOGIOR: Numbers
LOGNAND: Numbers
LOGNOR: Numbers
LOGNOT: Numbers
LOGORC1: Numbers
LOGORC2: Numbers
LOGTEST: Numbers
LOGXOR: Numbers
LONG-FLOAT-EPSILON: Numbers
LONG-FLOAT-NEGATIVE-EPSILON: Numbers
LONG-SITE-NAME: Operating System Definitions
LOOP: Iteration and Tests
LOWER-CASE-P: Characters

M
MACHINE-INSTANCE: Operating System Definitions
MACHINE-TYPE: Operating System Definitions
MACHINE-VERSION: GCL Specific
MACRO-FUNCTION: Symbols
MACROEXPAND: Special Forms and Functions
MACROEXPAND-1: Special Forms and Functions
MACROLET: Special Forms and Functions
MAKE-ALL-PROCLAIMS: Compiler Definitions
MAKE-ARRAY: Sequences and Arrays and Hash Tables
MAKE-BROADCAST-STREAM: Streams and Reading
MAKE-CHAR: Characters
MAKE-CONCATENATED-STREAM: Streams and Reading
MAKE-DISPATCH-MACRO-CHARACTER: Streams and Reading
MAKE-ECHO-STREAM: Streams and Reading
MAKE-HASH-TABLE: Sequences and Arrays and Hash Tables
MAKE-LIST: Lists
MAKE-PACKAGE: Symbols
MAKE-PATHNAME: Streams and Reading
MAKE-PROCLAIMS: Compiler Definitions
MAKE-RANDOM-STATE: Numbers
MAKE-SEQUENCE: Sequences and Arrays and Hash Tables
MAKE-STRING: Sequences and Arrays and Hash Tables
MAKE-STRING-INPUT-STREAM: Streams and Reading
MAKE-STRING-INPUT-STREAM: User Interface
MAKE-STRING-OUTPUT-STREAM: Streams and Reading
MAKE-STRING-OUTPUT-STREAM-FROM-STRING: System Definitions
MAKE-SYMBOL: Symbols
MAKE-SYNONYM-STREAM: Streams and Reading
MAKE-TWO-WAY-STREAM: Streams and Reading
MAKUNBOUND: Symbols
MAP: Sequences and Arrays and Hash Tables
MAPC: Lists
MAPCAN: Lists
MAPCAR: Iteration and Tests
MAPCON: Lists
MAPHASH: Iteration and Tests
MAPL: Lists
MAPLIST: Lists
MASK-FIELD: Numbers
MATCH-BEGINNING: System Definitions
MATCH-END: System Definitions
MAX: Numbers
MAXIMUM-ALLOCATABLE-PAGES: System Definitions
MAXIMUM-CONTIGUOUS-PAGES: System Definitions
MEMBER: Lists
MEMBER-IF: Lists
MEMBER-IF-NOT: Lists
MERGE: Sequences and Arrays and Hash Tables
MERGE-PATHNAMES: Streams and Reading
MIN: Numbers
MINUSP: Numbers
MISMATCH: Sequences and Arrays and Hash Tables
MOD: Numbers
MODF: Numbers
MOST-NEGATIVE-DOUBLE-FLOAT: Numbers
MOST-NEGATIVE-FIXNUM: Numbers
MOST-NEGATIVE-LONG-FLOAT: Numbers
MOST-NEGATIVE-SHORT-FLOAT: Numbers
MOST-NEGATIVE-SINGLE-FLOAT: Numbers
MOST-POSITIVE-DOUBLE-FLOAT: Numbers
MOST-POSITIVE-FIXNUM: Numbers
MOST-POSITIVE-LONG-FLOAT: Numbers
MOST-POSITIVE-SHORT-FLOAT: Numbers
MOST-POSITIVE-SINGLE-FLOAT: Numbers
MULTIPLE-VALUE-BIND: Special Forms and Functions
MULTIPLE-VALUE-CALL: Special Forms and Functions
MULTIPLE-VALUE-LIST: Special Forms and Functions
MULTIPLE-VALUE-PROG1: Special Forms and Functions
MULTIPLE-VALUE-SETQ: Special Forms and Functions
MULTIPLE-VALUES-LIMIT: Special Forms and Functions

N
NAME-CHAR: Characters
NAMESTRING: Streams and Reading
NANI: System Definitions
NBUTLAST: Lists
NCONC: Lists
NIL: Symbols
NINTERSECTION: Lists
NINTH: Lists
NLOAD: System Definitions
NOT: Special Forms and Functions
NOTANY: Sequences and Arrays and Hash Tables
NOTEVERY: Sequences and Arrays and Hash Tables
NRECONC: Lists
NREVERSE: Sequences and Arrays and Hash Tables
NSET-DIFFERENCE: Lists
NSET-EXCLUSIVE-OR: Lists
NSTRING-CAPITALIZE: Sequences and Arrays and Hash Tables
NSTRING-DOWNCASE: Sequences and Arrays and Hash Tables
NSTRING-UPCASE: Sequences and Arrays and Hash Tables
NSUBLIS: Lists
NSUBST: Lists
NSUBST-IF: Lists
NSUBST-IF-NOT: Lists
NSUBSTITUTE: Sequences and Arrays and Hash Tables
NSUBSTITUTE-IF: Sequences and Arrays and Hash Tables
NSUBSTITUTE-IF-NOT: Sequences and Arrays and Hash Tables
NTH: Lists
NTHCDR: Lists
NULL: Lists
NUMBERP: Numbers
NUMERATOR: Numbers
NUNION: Lists

O
ODDP: Numbers
OPEN: Streams and Reading
OPEN-FASD: System Definitions
OR: Special Forms and Functions
OUTPUT-STREAM-P: Streams and Reading
OUTPUT-STREAM-STRING: System Definitions

P
PACKAGE-NAME: Symbols
PACKAGE-NICKNAMES: Symbols
PACKAGE-SHADOWING-SYMBOLS: Symbols
PACKAGE-USE-LIST: Symbols
PACKAGE-USED-BY-LIST: Symbols
PACKAGEP: Symbols
PAIRLIS: Lists
PARSE-INTEGER: Numbers
PARSE-NAMESTRING: Streams and Reading
PATHNAME: Streams and Reading
PATHNAME-DEVICE: Streams and Reading
PATHNAME-DIRECTORY: Streams and Reading
PATHNAME-HOST: Operating System Definitions
PATHNAME-NAME: Streams and Reading
PATHNAME-TYPE: Streams and Reading
PATHNAME-VERSION: Streams and Reading
PATHNAMEP: Streams and Reading
PEEK-CHAR: Streams and Reading
PHASE: Numbers
PI: Numbers
PLUSP: Numbers
POP: Lists
POSITION: Sequences and Arrays and Hash Tables
POSITION-IF: Sequences and Arrays and Hash Tables
POSITION-IF-NOT: Sequences and Arrays and Hash Tables
PPRINT: Streams and Reading
PRIN1: Streams and Reading
PRIN1-TO-STRING: Streams and Reading
PRINC: Streams and Reading
PRINC-TO-STRING: Streams and Reading
PRINT: Streams and Reading
PROBE-FILE: Streams and Reading
PROCLAIM: Compilation
PROCLAMATION: GCL Specific
PROF: System Definitions
PROG: Special Forms and Functions
PROG*: Special Forms and Functions
PROG1: Special Forms and Functions
PROG2: Special Forms and Functions
PROGN: Special Forms and Functions
PROGV: Special Forms and Functions
PROVIDE: Compilation
PSETF: Special Forms and Functions
PSETQ: Symbols
PUSH: Lists
PUSHNEW: Lists
PUTPROP: System Definitions

Q
QUOTE: Special Forms and Functions

R
RANDOM: Numbers
RANDOM-STATE-P: Numbers
RASSOC: Lists
RASSOC-IF: Lists
RASSOC-IF-NOT: Lists
RATIONAL: Numbers
RATIONALIZE: Numbers
RATIONALP: Numbers
READ: Streams and Reading
READ-BYTE: Streams and Reading
READ-CHAR: Streams and Reading
READ-CHAR-NO-HANG: Streams and Reading
READ-DELIMITED-LIST: Streams and Reading
READ-FASD-TOP: System Definitions
READ-FROM-STRING: Streams and Reading
READ-LINE: Streams and Reading
READ-PRESERVING-WHITESPACE: Streams and Reading
READLINE-OFF: Streams and Reading
READLINE-ON: Streams and Reading
READTABLEP: Streams and Reading
REALPART: Numbers
REDUCE: Sequences and Arrays and Hash Tables
REM: Numbers
REMF: Symbols
REMHASH: Sequences and Arrays and Hash Tables
REMOVE: Sequences and Arrays and Hash Tables
REMOVE-DUPLICATES: Sequences and Arrays and Hash Tables
REMOVE-IF: Sequences and Arrays and Hash Tables
REMOVE-IF-NOT: Sequences and Arrays and Hash Tables
REMPROP: Symbols
RENAME-FILE: Operating System Definitions
RENAME-PACKAGE: Symbols
REPLACE: Sequences and Arrays and Hash Tables
REQUIRE: Operating System Definitions
RESET-GBC-COUNT: System Definitions
RESET-STACK-LIMITS: System Definitions
REST: Lists
RETURN: Special Forms and Functions
RETURN-FROM: Special Forms and Functions
REVAPPEND: Lists
REVERSE: Sequences and Arrays and Hash Tables
ROOM: Operating System Definitions
ROTATEF: Numbers
ROUND: Numbers
RPLACA: Lists
RPLACD: Lists
RUN-PROCESS: System Definitions

S
SAVE: GCL Specific
SAVE-SYSTEM: System Definitions
SBIT: Sequences and Arrays and Hash Tables
SCALE-FLOAT: Numbers
SCHAR: Characters
SEARCH: Sequences and Arrays and Hash Tables
SECOND: Lists
SET: Symbols
SET-CHAR-BIT: Characters
SET-DIFFERENCE: Lists
SET-DISPATCH-MACRO-CHARACTER: Streams and Reading
SET-EXCLUSIVE-OR: Lists
SET-HOLE-SIZE: System Definitions
SET-MACRO-CHARACTER: Streams and Reading
SET-SYNTAX-FROM-CHAR: Streams and Reading
SETF: Special Forms and Functions
SETQ: Symbols
SEVENTH: Lists
SGC-ON: System Definitions
SHADOW: Symbols
SHADOWING-IMPORT: Symbols
SHIFTF: Numbers
SHORT-FLOAT-EPSILON: Numbers
SHORT-FLOAT-NEGATIVE-EPSILON: Numbers
SHORT-SITE-NAME: Operating System Definitions
SIGNUM: Numbers
SIMPLE-BIT-VECTOR-P: Sequences and Arrays and Hash Tables
SIMPLE-STRING-P: Sequences and Arrays and Hash Tables
SIMPLE-VECTOR-P: Sequences and Arrays and Hash Tables
SIN: Numbers
SINGLE-FLOAT-EPSILON: Numbers
SINGLE-FLOAT-NEGATIVE-EPSILON: Numbers
SINH: Numbers
SIXTH: Lists
SLEEP: Operating System Definitions
SOCKET: System Definitions
SOFTWARE-TYPE: Operating System Definitions
SOFTWARE-VERSION: Operating System Definitions
SOME: Sequences and Arrays and Hash Tables
SORT: Sequences and Arrays and Hash Tables
SPECIAL-FORM-P: Special Forms and Functions
SPECIALP: System Definitions
SQRT: Numbers
STABLE-SORT: Sequences and Arrays and Hash Tables
STANDARD-CHAR-P: Characters
STEP: User Interface
STREAM-ELEMENT-TYPE: Streams and Reading
STREAMP: Streams and Reading
STRING: Sequences and Arrays and Hash Tables
STRING-CAPITALIZE: Sequences and Arrays and Hash Tables
STRING-CHAR-P: Characters
STRING-CONCATENATE: System Definitions
STRING-DOWNCASE: Sequences and Arrays and Hash Tables
STRING-EQUAL: Sequences and Arrays and Hash Tables
STRING-GREATERP: Sequences and Arrays and Hash Tables
STRING-LEFT-TRIM: Sequences and Arrays and Hash Tables
STRING-LESSP: Sequences and Arrays and Hash Tables
STRING-MATCH: System Definitions
STRING-NOT-EQUAL: Sequences and Arrays and Hash Tables
STRING-NOT-GREATERP: Sequences and Arrays and Hash Tables
STRING-NOT-LESSP: Sequences and Arrays and Hash Tables
STRING-RIGHT-TRIM: Sequences and Arrays and Hash Tables
STRING-TO-OBJECT: System Definitions
STRING-TRIM: Sequences and Arrays and Hash Tables
STRING-UPCASE: Sequences and Arrays and Hash Tables
STRING/=: Sequences and Arrays and Hash Tables
STRING<: Sequences and Arrays and Hash Tables
STRING<=: Sequences and Arrays and Hash Tables
STRING=: Sequences and Arrays and Hash Tables
STRING>: Sequences and Arrays and Hash Tables
STRING>=: Sequences and Arrays and Hash Tables
STRINGP: Sequences and Arrays and Hash Tables
STRUCTUREP: System Definitions
SUBLIS: Lists
SUBSEQ: Sequences and Arrays and Hash Tables
SUBSETP: Lists
SUBST: Lists
SUBST-IF: Lists
SUBST-IF-NOT: Lists
SUBSTITUTE: Sequences and Arrays and Hash Tables
SUBSTITUTE-IF: Sequences and Arrays and Hash Tables
SUBSTITUTE-IF-NOT: Sequences and Arrays and Hash Tables
SUBTYPEP: Type
SVREF: Sequences and Arrays and Hash Tables
SXHASH: Numbers
SYMBOL-FUNCTION: Symbols
SYMBOL-NAME: Symbols
SYMBOL-PACKAGE: Symbols
SYMBOL-PLIST: Symbols
SYMBOL-VALUE: Symbols
SYMBOLP: Symbols
SYSTEM: GCL Specific

T
T: Symbols
TAGBODY: Special Forms and Functions
TAILP: Lists
TAN: Numbers
TANH: Numbers
TENTH: Lists
TERPRI: Streams and Reading
THE: Special Forms and Functions
THIRD: Lists
THROW: Special Forms and Functions
TIME: Operating System Definitions
TOP-LEVEL: System Definitions
TRACE: User Interface
TREE-EQUAL: Lists
TRUENAME: Streams and Reading
TRUNCATE: Numbers
TYPE-OF: Type
TYPECASE: Special Forms and Functions
TYPEP: Type

U
UNCATCH-BAD-SIGNALS: System Definitions
UNEXPORT: Symbols
UNINTERN: Symbols
UNION: Lists
UNIVERSAL-ERROR-HANDLER: System Definitions
UNLESS: Special Forms and Functions
UNREAD-CHAR: Streams and Reading
UNTRACE: User Interface
UNUSE-PACKAGE: Symbols
UNWIND-PROTECT: Special Forms and Functions
UPPER-CASE-P: Characters
USE-FAST-LINKS: GCL Specific
USE-PACKAGE: Symbols
USER-HOMEDIR-PATHNAME: Operating System Definitions

V
VALUES: Special Forms and Functions
VALUES-LIST: Special Forms and Functions
VECTOR: Sequences and Arrays and Hash Tables
VECTOR-POP: Sequences and Arrays and Hash Tables
VECTOR-PUSH: Sequences and Arrays and Hash Tables
VECTOR-PUSH-EXTEND: Sequences and Arrays and Hash Tables
VECTORP: Sequences and Arrays and Hash Tables
VS: System Definitions

W
WARN: User Interface
WHEN: Special Forms and Functions
WHO-CALLS: Compiler Definitions
WITH-INPUT-FROM-STRING: Streams and Reading
WITH-OPEN-FILE: Streams and Reading
WITH-OPEN-STREAM: Streams and Reading
WITH-OUTPUT-TO-STRING: Streams and Reading
WRITE: Streams and Reading
WRITE-BYTE: Streams and Reading
WRITE-CHAR: Streams and Reading
WRITE-DEBUG-SYMBOLS: System Definitions
WRITE-FASD-TOP: System Definitions
WRITE-LINE: Streams and Reading
WRITE-STRING: Streams and Reading
WRITE-TO-STRING: Streams and Reading

X
XDR-OPEN: System Definitions
XDR-READ: System Definitions
XDR-WRITE: System Definitions

Y
Y-OR-N-P: Streams and Reading
YES-OR-NO-P: Iteration and Tests

Z
ZEROP: Numbers
Z
ZEROP: Numbers

+
Jump to:   * +@@ -1142,96 +1129,96 @@ Previous: ++ +

Short Table of Contents

+ + + +- ++ +

Table of Contents

+ +
+ + +
+ +
+
+

+-Previous: , Up: Top   [Contents][Index]

++Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/GCL-Specific.html ++++ gcl-2.6.12/info/gcl-si/GCL-Specific.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: GCL Specific ++ ++GCL Specific (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

15 GCL Specific

++

15 GCL Specific

+ +
+-
Function: SYSTEM (string)
++
Function: SYSTEM (string)
+

Package:LISP +

+

GCL specific: Executes a Shell command as if STRING is an input to the +@@ -71,7 +59,7 @@ exit status and any possible terminating +

+ +
+-
Variable: *TMP-DIR*
++
Variable: *TMP-DIR*
+

Package:COMPILER + GCL specific: Directory in which temporary “gazonk” files used by the + compiler are to be created. +@@ -80,7 +68,7 @@ compiler are to be created. +

+ +
+-
Variable: *IGNORE-MAXIMUM-PAGES*
++
Variable: *IGNORE-MAXIMUM-PAGES*
+

Package:SI + GCL specific: Tells the GCL memory manager whether (non-NIL) or not (NIL) it + should expand memory whenever the maximum allocatable pages have been used +@@ -90,7 +78,7 @@ up. +

+ +
+-
Variable: *OPTIMIZE-MAXIMUM-PAGES*
++
Variable: *OPTIMIZE-MAXIMUM-PAGES*
+

Package:SI +

+

GCL specific: Tells the GCL memory manager whether to attempt to +@@ -102,7 +90,7 @@ to T. Set to NIL if you care more about +

+ +
+-
Function: MACHINE-VERSION ()
++
Function: MACHINE-VERSION ()
+

Package:LISP +

+

Returns a string that identifies the machine version of the machine +@@ -112,7 +100,7 @@ on which GCL is currently running. +

+ +
+-
Function: BY ()
++
Function: BY ()
+

Package:LISP +

+

GCL specific: Exits from GCL. +@@ -121,7 +109,7 @@ on which GCL is currently running. +

+ +
+-
Macro: DEFCFUN
++
Macro: DEFCFUN
+

Package:LISP +

+

Syntax: +@@ -165,6 +153,7 @@ Note to be loaded by load t +

Syntax: +

+
++
+         (defCfun header non-negative-integer
+                 { string
+                   | ( function-symbol { value }* )
+@@ -190,7 +179,7 @@ C-type:
+ 
+ +
+-
Macro: CLINES
++
Macro: CLINES
+

Package:LISP +

+

Syntax: +@@ -205,7 +194,7 @@ language code. The interpreter ignores +

+ +
+-
Function: ALLOCATE (type number &optional (really-allocate nil))
++
Function: ALLOCATE (type number &optional (really-allocate nil))
+

Package:LISP +

+

GCL specific: Sets the maximum number of pages for the type class of the +@@ -217,7 +206,7 @@ immediately. +

+ +
+-
Function: GBC (x)
++
Function: GBC (x)
+

Package:LISP +

+

GCL specific: Invokes the garbage collector (GC) with the collection level +@@ -228,7 +217,7 @@ the argument causes GC to collect everyt +

+ +
+-
Function: SAVE (pathname)
++
Function: SAVE (pathname)
+

Package:LISP +

+

GCL specific: Saves the current GCL core image into a program file specified +@@ -240,7 +229,7 @@ currently loaded .o files. +

+ +
+-
Function: HELP* (string &optional (package 'lisp))
++
Function: HELP* (string &optional (package 'lisp))
+

Package:LISP +

+

GCL specific: Prints the documentation associated with those symbols in the +@@ -252,7 +241,7 @@ is NIL, then all packages are searched. +

+ +
+-
Macro: DEFLA
++
Macro: DEFLA
+

Package:LISP +

+

Syntax: +@@ -267,7 +256,7 @@ equivalent to DEFUN, but the compiler ig +

+ +
+-
Function: PROCLAMATION (decl-spec)
++
Function: PROCLAMATION (decl-spec)
+

Package:LISP +

+

GCL specific: Returns T if the specified declaration is globally in effect; +@@ -277,7 +266,7 @@ NIL otherwise. See the doc of DECLARE f +

+ +
+-
Macro: DEFENTRY
++
Macro: DEFENTRY
+

Package:LISP +

+

Syntax: +@@ -338,7 +327,7 @@ If the C function may allocate storage, + +

+
+-
Function: COPY-ARRAY-PORTION (x,y,i1,i2,n1)
++
Function: COPY-ARRAY-PORTION (x,y,i1,i2,n1)
+

Package:SI + Copy elements from X to Y starting at X[i1] to Y[i2] and doing N1 + elements if N1 is supplied otherwise, doing the length of X - I1 +@@ -347,7 +336,7 @@ implementation dependent results. +

+ +
+-
Function: BYE ( &optional (exit-status 0))
++
Function: BYE ( &optional (exit-status 0))
+

Package:LISP +

+

GCL specific: Exits from GCL with exit-status. +@@ -356,7 +345,7 @@ implementation dependent results. +

+ +
+-
Function: USE-FAST-LINKS (turn-on)
++ +

Package:LISP +

+

GCL specific: If TURN-ON is not nil, the fast link mechanism is enabled, +@@ -369,14 +358,14 @@ off. +

+ + +- + + +
+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Inititialization.html ++++ gcl-2.6.12/info/gcl-si/Inititialization.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Inititialization ++ ++Inititialization (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

19.2 Initialization

++

19.2 Initialization

+ +

If the file init.lsp exists in the current directory, it is + loaded at startup. The first argument passed to the executable image +--- gcl-2.6.12.orig/info/gcl-si/Iteration-and-Tests.html ++++ gcl-2.6.12/info/gcl-si/Iteration-and-Tests.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Iteration and Tests ++ ++Iteration and Tests (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

11 Iteration and Tests

++

11 Iteration and Tests

+ +
+-
Macro: DO-EXTERNAL-SYMBOLS
++
Macro: DO-EXTERNAL-SYMBOLS
+

Package:LISP +

+

Syntax: +@@ -76,7 +64,7 @@ Then evaluates RESULT-FORM (which defaul +

+ +
+-
Special Form: DO*
++
Special Form: DO*
+

Package:LISP +

+

Syntax: +@@ -92,7 +80,7 @@ like LET* and SETQ do. +

+ +
+-
Macro: DO-ALL-SYMBOLS
++
Macro: DO-ALL-SYMBOLS
+

Package:LISP +

+

Syntax: +@@ -108,7 +96,7 @@ returns the value(s). +

+ +
+-
Function: YES-OR-NO-P (&optional (format-string nil) &rest args)
++
Function: YES-OR-NO-P (&optional (format-string nil) &rest args)
+

Package:LISP +

+

Asks the user a question whose answer is either ’YES’ or ’NO’. If FORMAT- +@@ -120,7 +108,7 @@ printed as if FORMAT-STRING and ARGs wer +

+ +
+-
Function: MAPHASH #'hash-table
++
Function: MAPHASH #'hash-table
+

Package:LISP +

+

For each entry in HASH-TABLE, calls FUNCTION on the key and value of the +@@ -130,7 +118,7 @@ entry; returns NIL. +

+ +
+-
Function: MAPCAR (fun list &rest more-lists)
++
Function: MAPCAR (fun list &rest more-lists)
+

Package:LISP +

+

Applies FUN to successive cars of LISTs and returns the results as a list. +@@ -139,7 +127,7 @@ entry; returns NIL. +

+ +
+-
Special Form: DOLIST
++
Special Form: DOLIST
+

Package:LISP +

+

Syntax: +@@ -154,7 +142,7 @@ LISTFORM. Then returns the value(s) of +

+ +
+-
Function: EQ (x y)
++
Function: EQ (x y)
+

Package:LISP +

+

Returns T if X and Y are the same identical object; NIL otherwise. +@@ -163,7 +151,7 @@ LISTFORM. Then returns the value(s) of +

+ +
+-
Function: EQUALP (x y)
++
Function: EQUALP (x y)
+

Package:LISP +

+

Returns T if X and Y are EQUAL, if they are characters and satisfy CHAR-EQUAL, +@@ -174,7 +162,7 @@ components that are all EQUALP. Returns +

+ +
+-
Function: EQUAL (x y)
++
Function: EQUAL (x y)
+

Package:LISP +

+

Returns T if X and Y are EQL or if they are of the same type and corresponding +@@ -186,7 +174,7 @@ arrays must be EQ to be EQUAL. +

+ +
+-
Macro: DO-SYMBOLS
++
Macro: DO-SYMBOLS
+

Package:LISP +

+

Syntax: +@@ -203,7 +191,7 @@ RESULT-FORM (which defaults to NIL) and +

+ +
+-
Special Form: LOOP
++
Special Form: LOOP
+

Package:LISP +

+

Syntax: +@@ -220,7 +208,7 @@ surrounded by an implicit NIL block. +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Lists.html ++++ gcl-2.6.12/info/gcl-si/Lists.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Lists ++ ++Lists (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

4 Lists

++

4 Lists

+ +
+-
Function: NINTERSECTION (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: NINTERSECTION (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns the intersection of LIST1 and LIST2. LIST1 may be destroyed. +@@ -68,7 +56,7 @@ Next: Function: RASSOC-IF (predicate alist) ++

Function: RASSOC-IF (predicate alist)
+

Package:LISP +

+

Returns the first cons in ALIST whose cdr satisfies PREDICATE. +@@ -77,7 +65,7 @@ Next: Function: MAKE-LIST (size &key (initial-element nil)) ++

Function: MAKE-LIST (size &key (initial-element nil))
+

Package:LISP +

+

Creates and returns a list containing SIZE elements, each of which is +@@ -87,7 +75,7 @@ initialized to INITIAL-ELEMENT. +

+ +
+-
Function: NTH (n list)
++
Function: NTH (n list)
+

Package:LISP +

+

Returns the N-th element of LIST, where the car of LIST is the zeroth +@@ -97,7 +85,7 @@ element. +

+ +
+-
Function: CAAR (x)
++
Function: CAAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR X)). +@@ -106,7 +94,7 @@ element. +

+ +
+-
Function: NULL (x)
++
Function: NULL (x)
+

Package:LISP +

+

Returns T if X is NIL; NIL otherwise. +@@ -115,7 +103,7 @@ element. +

+ +
+-
Function: FIFTH (x)
++
Function: FIFTH (x)
+

Package:LISP +

+

Equivalent to (CAR (CDDDDR X)). +@@ -124,7 +112,7 @@ element. +

+ +
+-
Function: NCONC (&rest lists)
++
Function: NCONC (&rest lists)
+

Package:LISP +

+

Concatenates LISTs by destructively modifying them. +@@ -133,7 +121,7 @@ element. +

+ +
+-
Function: TAILP (sublist list)
++
Function: TAILP (sublist list)
+

Package:LISP +

+

Returns T if SUBLIST is one of the conses in LIST; NIL otherwise. +@@ -142,7 +130,7 @@ element. +

+ +
+-
Function: CONSP (x)
++
Function: CONSP (x)
+

Package:LISP +

+

Returns T if X is a cons; NIL otherwise. +@@ -151,7 +139,7 @@ element. +

+ +
+-
Function: TENTH (x)
++
Function: TENTH (x)
+

Package:LISP +

+

Equivalent to (CADR (CDDDDR (CDDDDR X))). +@@ -160,7 +148,7 @@ element. +

+ +
+-
Function: LISTP (x)
++
Function: LISTP (x)
+

Package:LISP +

+

Returns T if X is either a cons or NIL; NIL otherwise. +@@ -169,7 +157,7 @@ element. +

+ +
+-
Function: MAPCAN (fun list &rest more-lists)
++
Function: MAPCAN (fun list &rest more-lists)
+

Package:LISP +

+

Applies FUN to successive cars of LISTs, NCONCs the results, and returns it. +@@ -178,7 +166,7 @@ element. +

+ +
+-
Function: EIGHTH (x)
++
Function: EIGHTH (x)
+

Package:LISP +

+

Equivalent to (CADDDR (CDDDDR X)). +@@ -187,7 +175,7 @@ element. +

+ +
+-
Function: LENGTH (sequence)
++
Function: LENGTH (sequence)
+

Package:LISP +

+

Returns the length of SEQUENCE. +@@ -196,7 +184,7 @@ element. +

+ +
+-
Function: RASSOC (item alist &key (test #'eql) test-not (key #'identity))
++
Function: RASSOC (item alist &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns the first cons in ALIST whose cdr is equal to ITEM. +@@ -205,7 +193,7 @@ element. +

+ +
+-
Function: NSUBST-IF-NOT (new test tree &key (key #'identity))
++
Function: NSUBST-IF-NOT (new test tree &key (key #'identity))
+

Package:LISP +

+

Substitutes NEW for subtrees of TREE that do not satisfy TEST. +@@ -214,7 +202,7 @@ element. +

+ +
+-
Function: NBUTLAST (list &optional (n 1))
++
Function: NBUTLAST (list &optional (n 1))
+

Package:LISP +

+

Changes the cdr of the N+1 th cons from the end of the list LIST to NIL. +@@ -226,7 +214,7 @@ Returns the whole list. + + +

+-
Function: CDR (list)
++
Function: CDR (list)
+

Package:LISP +

+

Returns the cdr of LIST. Returns NIL if LIST is NIL. +@@ -235,7 +223,7 @@ Returns the whole list. +

+ +
+-
Function: MAPC (fun list &rest more-lists)
++
Function: MAPC (fun list &rest more-lists)
+

Package:LISP +

+

Applies FUN to successive cars of LISTs. Returns the first LIST. +@@ -244,7 +232,7 @@ Returns the whole list. +

+ +
+-
Function: MAPL (fun list &rest more-lists)
++
Function: MAPL (fun list &rest more-lists)
+

Package:LISP +

+

Applies FUN to successive cdrs of LISTs. Returns the first LIST. +@@ -253,7 +241,7 @@ Returns the whole list. +

+ +
+-
Function: CONS (x y)
++
Function: CONS (x y)
+

Package:LISP +

+

Returns a new cons whose car and cdr are X and Y, respectively. +@@ -262,7 +250,7 @@ Returns the whole list. +

+ +
+-
Function: LIST (&rest args)
++
Function: LIST (&rest args)
+

Package:LISP +

+

Returns a list of its arguments +@@ -272,7 +260,7 @@ Returns the whole list. + + +

+-
Function: THIRD (x)
++
Function: THIRD (x)
+

Package:LISP +

+

Equivalent to (CADDR X). +@@ -281,7 +269,7 @@ Returns the whole list. +

+ +
+-
Function: CDDAAR (x)
++
Function: CDDAAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR (CAR (CAR X)))). +@@ -290,7 +278,7 @@ Returns the whole list. +

+ +
+-
Function: CDADAR (x)
++
Function: CDADAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR (CDR (CAR X)))). +@@ -299,7 +287,7 @@ Returns the whole list. +

+ +
+-
Function: CDAADR (x)
++
Function: CDAADR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR (CAR (CDR X)))). +@@ -308,7 +296,7 @@ Returns the whole list. +

+ +
+-
Function: CADDAR (x)
++
Function: CADDAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR (CDR (CAR X)))). +@@ -317,7 +305,7 @@ Returns the whole list. +

+ +
+-
Function: CADADR (x)
++
Function: CADADR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR (CAR (CDR X)))). +@@ -326,7 +314,7 @@ Returns the whole list. +

+ +
+-
Function: CAADDR (x)
++
Function: CAADDR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR (CDR (CDR X)))). +@@ -335,7 +323,7 @@ Returns the whole list. +

+ +
+-
Function: NTHCDR (n list)
++
Function: NTHCDR (n list)
+

Package:LISP +

+

Returns the result of performing the CDR operation N times on LIST. +@@ -344,7 +332,7 @@ Returns the whole list. +

+ +
+-
Function: PAIRLIS (keys data &optional (alist nil))
++
Function: PAIRLIS (keys data &optional (alist nil))
+

Package:LISP +

+

Constructs an association list from KEYS and DATA adding to ALIST. +@@ -353,7 +341,7 @@ Returns the whole list. +

+ +
+-
Function: SEVENTH (x)
++
Function: SEVENTH (x)
+

Package:LISP +

+

Equivalent to (CADDR (CDDDDR X)). +@@ -362,7 +350,7 @@ Returns the whole list. +

+ +
+-
Function: SUBSETP (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: SUBSETP (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns T if every element of LIST1 appears in LIST2; NIL otherwise. +@@ -371,7 +359,7 @@ Returns the whole list. +

+ +
+-
Function: NSUBST-IF (new test tree &key (key #'identity))
++
Function: NSUBST-IF (new test tree &key (key #'identity))
+

Package:LISP +

+

Substitutes NEW for subtrees of TREE that satisfy TEST. +@@ -380,7 +368,7 @@ Returns the whole list. +

+ +
+-
Function: COPY-LIST (list)
++
Function: COPY-LIST (list)
+

Package:LISP +

+

Returns a new copy of LIST. +@@ -389,7 +377,7 @@ Returns the whole list. +

+ +
+-
Function: LAST (list)
++
Function: LAST (list)
+

Package:LISP +

+

Returns the last cons in LIST +@@ -398,7 +386,7 @@ Returns the whole list. +

+ +
+-
Function: CAAAR (x)
++
Function: CAAAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR (CAR X))). +@@ -407,7 +395,7 @@ Returns the whole list. +

+ +
+-
Function: LIST-LENGTH (list)
++
Function: LIST-LENGTH (list)
+

Package:LISP +

+

Returns the length of LIST, or NIL if LIST is circular. +@@ -416,7 +404,7 @@ Returns the whole list. +

+ +
+-
Function: CDDDR (x)
++
Function: CDDDR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR (CDR X))). +@@ -425,7 +413,7 @@ Returns the whole list. +

+ +
+-
Function: INTERSECTION (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: INTERSECTION (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns the intersection of List1 and List2. +@@ -434,7 +422,7 @@ Returns the whole list. +

+ +
+-
Function: NSUBST (new old tree &key (test #'eql) test-not (key #'identity))
++
Function: NSUBST (new old tree &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Substitutes NEW for subtrees in TREE that match OLD. +@@ -443,7 +431,7 @@ Returns the whole list. +

+ +
+-
Function: REVAPPEND (x y)
++
Function: REVAPPEND (x y)
+

Package:LISP +

+

Equivalent to (APPEND (REVERSE X) Y) +@@ -452,7 +440,7 @@ Returns the whole list. +

+ +
+-
Function: CDAR (x)
++
Function: CDAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR X)). +@@ -461,7 +449,7 @@ Returns the whole list. +

+ +
+-
Function: CADR (x)
++
Function: CADR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR X)). +@@ -470,7 +458,7 @@ Returns the whole list. +

+ +
+-
Function: REST (x)
++
Function: REST (x)
+

Package:LISP +

+

Equivalent to (CDR X). +@@ -479,7 +467,7 @@ Returns the whole list. +

+ +
+-
Function: NSET-EXCLUSIVE-OR (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: NSET-EXCLUSIVE-OR (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns a list with elements which appear but once in LIST1 and LIST2. +@@ -488,7 +476,7 @@ Returns the whole list. +

+ +
+-
Function: ACONS (key datum alist)
++
Function: ACONS (key datum alist)
+

Package:LISP +

+

Constructs a new alist by adding the pair (KEY . DATUM) to ALIST. +@@ -497,7 +485,7 @@ Returns the whole list. +

+ +
+-
Function: SUBST-IF-NOT (new test tree &key (key #'identity))
++
Function: SUBST-IF-NOT (new test tree &key (key #'identity))
+

Package:LISP +

+

Substitutes NEW for subtrees of TREE that do not satisfy TEST. +@@ -506,7 +494,7 @@ Returns the whole list. +

+ +
+-
Function: RPLACA (x y)
++
Function: RPLACA (x y)
+

Package:LISP +

+

Replaces the car of X with Y, and returns the modified X. +@@ -515,7 +503,7 @@ Returns the whole list. +

+ +
+-
Function: SECOND (x)
++
Function: SECOND (x)
+

Package:LISP +

+

Equivalent to (CADR X). +@@ -524,7 +512,7 @@ Returns the whole list. +

+ +
+-
Function: NUNION (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: NUNION (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns the union of LIST1 and LIST2. LIST1 and/or LIST2 may be destroyed. +@@ -533,7 +521,7 @@ Returns the whole list. +

+ +
+-
Function: BUTLAST (list &optional (n 1))
++
Function: BUTLAST (list &optional (n 1))
+

Package:LISP +

+

Creates and returns a list with the same elements as LIST but without the +@@ -543,7 +531,7 @@ last N elements. +

+ +
+-
Function: COPY-ALIST (alist)
++
Function: COPY-ALIST (alist)
+

Package:LISP + Returns a new copy of ALIST. +

+@@ -551,7 +539,7 @@ last N elements. +
+ +
+-
Function: SIXTH (x)
++
Function: SIXTH (x)
+

Package:LISP + Equivalent to (CADR (CDDDDR X)). +

+@@ -559,7 +547,7 @@ last N elements. +
+ +
+-
Function: CAAAAR (x)
++
Function: CAAAAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR (CAR (CAR X)))). +@@ -568,7 +556,7 @@ last N elements. +

+ +
+-
Function: CDDDAR (x)
++
Function: CDDDAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR (CDR (CAR X)))). +@@ -577,7 +565,7 @@ last N elements. +

+ +
+-
Function: CDDADR (x)
++
Function: CDDADR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR (CAR (CDR X)))). +@@ -586,7 +574,7 @@ last N elements. +

+ +
+-
Function: CDADDR (x)
++
Function: CDADDR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR (CDR (CDR X)))). +@@ -595,7 +583,7 @@ last N elements. +

+ +
+-
Function: CADDDR (x)
++
Function: CADDDR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR (CDR (CDR X)))). +@@ -604,7 +592,7 @@ last N elements. +

+ +
+-
Function: FOURTH (x)
++
Function: FOURTH (x)
+

Package:LISP +

+

Equivalent to (CADDDR X). +@@ -613,7 +601,7 @@ last N elements. +

+ +
+-
Function: NSUBLIS (alist tree &key (test #'eql) test-not (key #'identity))
++
Function: NSUBLIS (alist tree &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Substitutes from ALIST for subtrees of TREE. +@@ -622,7 +610,7 @@ last N elements. +

+ +
+-
Function: SUBST-IF (new test tree &key (key #'identity))
++
Function: SUBST-IF (new test tree &key (key #'identity))
+

Package:LISP +

+

Substitutes NEW for subtrees of TREE that satisfy TEST. +@@ -631,7 +619,7 @@ last N elements. +

+ +
+-
Function: NSET-DIFFERENCE (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: NSET-DIFFERENCE (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns a list of elements of LIST1 that do not appear in LIST2. LIST1 may +@@ -641,7 +629,7 @@ be destroyed. +

+ +
+-
Special Form: POP
++
Special Form: POP
+

Package:LISP +

+

Syntax: +@@ -655,7 +643,7 @@ be destroyed. +

+ +
+-
Special Form: PUSH
++
Special Form: PUSH
+

Package:LISP +

+

Syntax: +@@ -669,7 +657,7 @@ be destroyed. +

+ +
+-
Function: CDAAR (x)
++
Function: CDAAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR (CAR X))). +@@ -678,7 +666,7 @@ be destroyed. +

+ +
+-
Function: CADAR (x)
++
Function: CADAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR (CAR X))). +@@ -687,7 +675,7 @@ be destroyed. +

+ +
+-
Function: CAADR (x)
++
Function: CAADR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR (CDR X))). +@@ -696,7 +684,7 @@ be destroyed. +

+ +
+-
Function: FIRST (x)
++
Function: FIRST (x)
+

Package:LISP +

+

Equivalent to (CAR X). +@@ -705,7 +693,7 @@ be destroyed. +

+ +
+-
Function: SUBST (new old tree &key (test #'eql) test-not (key #'identity))
++
Function: SUBST (new old tree &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Substitutes NEW for subtrees of TREE that match OLD. +@@ -714,7 +702,7 @@ be destroyed. +

+ +
+-
Function: ADJOIN (item list &key (test #'eql) test-not (key #'identity))
++
Function: ADJOIN (item list &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Adds ITEM to LIST unless ITEM is already a member of LIST. +@@ -723,7 +711,7 @@ be destroyed. +

+ +
+-
Function: MAPCON (fun list &rest more-lists)
++
Function: MAPCON (fun list &rest more-lists)
+

Package:LISP +

+

Applies FUN to successive cdrs of LISTs, NCONCs the results, and returns it. +@@ -732,7 +720,7 @@ be destroyed. +

+ +
+-
Macro: PUSHNEW
++
Macro: PUSHNEW
+

Package:LISP +

+

Syntax: +@@ -749,7 +737,7 @@ by supplying keywords :TEST, :TEST-NOT, +

+ +
+-
Function: SET-EXCLUSIVE-OR (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: SET-EXCLUSIVE-OR (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns a list of elements appearing exactly once in LIST1 and LIST2. +@@ -758,7 +746,7 @@ by supplying keywords :TEST, :TEST-NOT, +

+ +
+-
Function: TREE-EQUAL (x y &key (test #'eql) test-not)
++
Function: TREE-EQUAL (x y &key (test #'eql) test-not)
+

Package:LISP +

+

Returns T if X and Y are isomorphic trees with identical leaves. +@@ -767,7 +755,7 @@ by supplying keywords :TEST, :TEST-NOT, +

+ +
+-
Function: CDDR (x)
++
Function: CDDR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR X)). +@@ -776,7 +764,7 @@ by supplying keywords :TEST, :TEST-NOT, +

+ +
+-
Function: GETF (place indicator &optional (default nil))
++
Function: GETF (place indicator &optional (default nil))
+

Package:LISP +

+

Searches the property list stored in Place for an indicator EQ to Indicator. +@@ -787,7 +775,7 @@ returned. +

+ +
+-
Function: LDIFF (list sublist)
++
Function: LDIFF (list sublist)
+

Package:LISP +

+

Returns a new list, whose elements are those of LIST that appear before +@@ -797,7 +785,7 @@ SUBLIST. If SUBLIST is not a tail of LI +

+ +
+-
Function: UNION (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: UNION (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns the union of LIST1 and LIST2. +@@ -806,7 +794,7 @@ SUBLIST. If SUBLIST is not a tail of LI +

+ +
+-
Function: ASSOC-IF-NOT (test alist)
++
Function: ASSOC-IF-NOT (test alist)
+

Package:LISP +

+

Returns the first pair in ALIST whose car does not satisfy TEST. +@@ -815,7 +803,7 @@ SUBLIST. If SUBLIST is not a tail of LI +

+ +
+-
Function: RPLACD (x y)
++
Function: RPLACD (x y)
+

Package:LISP +

+

Replaces the cdr of X with Y, and returns the modified X. +@@ -824,7 +812,7 @@ SUBLIST. If SUBLIST is not a tail of LI +

+ +
+-
Function: MEMBER-IF-NOT (test list &key (key #'identity))
++
Function: MEMBER-IF-NOT (test list &key (key #'identity))
+

Package:LISP +

+

Returns the tail of LIST beginning with the first element not satisfying +@@ -834,7 +822,7 @@ TEST. +

+ +
+-
Function: CAR (list)
++
Function: CAR (list)
+

Package:LISP +

+

Returns the car of LIST. Returns NIL if LIST is NIL. +@@ -843,7 +831,7 @@ TEST. +

+ +
+-
Function: ENDP (x)
++
Function: ENDP (x)
+

Package:LISP +

+

Returns T if X is NIL. Returns NIL if X is a cons. Otherwise, signals an +@@ -853,7 +841,7 @@ error. +

+ +
+-
Function: LIST* (arg &rest others)
++
Function: LIST* (arg &rest others)
+

Package:LISP +

+

Returns a list of its arguments with the last cons being a dotted pair of +@@ -863,7 +851,7 @@ the next to the last argument and the la +

+ +
+-
Function: NINTH (x)
++
Function: NINTH (x)
+

Package:LISP +

+

Equivalent to (CAR (CDDDDR (CDDDDR X))). +@@ -872,7 +860,7 @@ the next to the last argument and the la +

+ +
+-
Function: CDAAAR (x)
++
Function: CDAAAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR (CAR (CAR X)))). +@@ -881,7 +869,7 @@ the next to the last argument and the la +

+ +
+-
Function: CADAAR (x)
++
Function: CADAAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR (CAR (CAR X)))). +@@ -890,7 +878,7 @@ the next to the last argument and the la +

+ +
+-
Function: CAADAR (x)
++
Function: CAADAR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR (CDR (CAR X)))). +@@ -899,7 +887,7 @@ the next to the last argument and the la +

+ +
+-
Function: CAAADR (x)
++
Function: CAAADR (x)
+

Package:LISP +

+

Equivalent to (CAR (CAR (CAR (CDR X)))). +@@ -908,7 +896,7 @@ the next to the last argument and the la +

+ +
+-
Function: CDDDDR (x)
++
Function: CDDDDR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR (CDR (CDR X)))). +@@ -917,7 +905,7 @@ the next to the last argument and the la +

+ +
+-
Function: SUBLIS (alist tree &key (test #'eql) test-not (key #'identity))
++
Function: SUBLIS (alist tree &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Substitutes from ALIST for subtrees of TREE nondestructively. +@@ -926,7 +914,7 @@ the next to the last argument and the la +

+ +
+-
Function: RASSOC-IF-NOT (predicate alist)
++
Function: RASSOC-IF-NOT (predicate alist)
+

Package:LISP +

+

Returns the first cons in ALIST whose cdr does not satisfy PREDICATE. +@@ -935,7 +923,7 @@ the next to the last argument and the la +

+ +
+-
Function: NRECONC (x y)
++
Function: NRECONC (x y)
+

Package:LISP +

+

Equivalent to (NCONC (NREVERSE X) Y). +@@ -944,7 +932,7 @@ the next to the last argument and the la +

+ +
+-
Function: MAPLIST (fun list &rest more-lists)
++
Function: MAPLIST (fun list &rest more-lists)
+

Package:LISP +

+

Applies FUN to successive cdrs of LISTs and returns the results as a list. +@@ -953,7 +941,7 @@ the next to the last argument and the la +

+ +
+-
Function: SET-DIFFERENCE (list1 list2 &key (test #'eql) test-not (key #'identity))
++
Function: SET-DIFFERENCE (list1 list2 &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns a list of elements of LIST1 that do not appear in LIST2. +@@ -962,7 +950,7 @@ the next to the last argument and the la +

+ +
+-
Function: ASSOC-IF (test alist)
++
Function: ASSOC-IF (test alist)
+

Package:LISP +

+

Returns the first pair in ALIST whose car satisfies TEST. +@@ -971,7 +959,7 @@ the next to the last argument and the la +

+ +
+-
Function: GET-PROPERTIES (place indicator-list)
++
Function: GET-PROPERTIES (place indicator-list)
+

Package:LISP +

+

Looks for the elements of INDICATOR-LIST in the property list stored in PLACE. +@@ -982,7 +970,7 @@ returns NILs as its three values. +

+ +
+-
Function: MEMBER-IF (test list &key (key #'identity))
++
Function: MEMBER-IF (test list &key (key #'identity))
+

Package:LISP +

+

Returns the tail of LIST beginning with the first element satisfying TEST. +@@ -991,7 +979,7 @@ returns NILs as its three values. +

+ +
+-
Function: COPY-TREE (object)
++
Function: COPY-TREE (object)
+

Package:LISP +

+

Recursively copies conses in OBJECT and returns the result. +@@ -1000,7 +988,7 @@ returns NILs as its three values. +

+ +
+-
Function: ATOM (x)
++
Function: ATOM (x)
+

Package:LISP +

+

Returns T if X is not a cons; NIL otherwise. +@@ -1009,7 +997,7 @@ returns NILs as its three values. +

+ +
+-
Function: CDDAR (x)
++
Function: CDDAR (x)
+

Package:LISP +

+

Equivalent to (CDR (CDR (CAR X))). +@@ -1018,7 +1006,7 @@ returns NILs as its three values. +

+ +
+-
Function: CDADR (x)
++
Function: CDADR (x)
+

Package:LISP +

+

Equivalent to (CDR (CAR (CDR X))). +@@ -1027,7 +1015,7 @@ returns NILs as its three values. +

+ +
+-
Function: CADDR (x)
++
Function: CADDR (x)
+

Package:LISP +

+

Equivalent to (CAR (CDR (CDR X))). +@@ -1036,7 +1024,7 @@ returns NILs as its three values. +

+ +
+-
Function: ASSOC (item alist &key (test #'eql) test-not)
++
Function: ASSOC (item alist &key (test #'eql) test-not)
+

Package:LISP +

+

Returns the first pair in ALIST whose car is equal (in the sense of TEST) to +@@ -1046,7 +1034,7 @@ ITEM. +

+ +
+-
Function: APPEND (&rest lists)
++
Function: APPEND (&rest lists)
+

Package:LISP +

+

Constructs a new list by concatenating its arguments. +@@ -1055,7 +1043,7 @@ ITEM. +

+ +
+-
Function: MEMBER (item list &key (test #'eql) test-not (key #'identity))
++
Function: MEMBER (item list &key (test #'eql) test-not (key #'identity))
+

Package:LISP +

+

Returns the tail of LIST beginning with the first ITEM. +@@ -1066,7 +1054,7 @@ ITEM. +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Low-Level-Debug-Functions.html ++++ gcl-2.6.12/info/gcl-si/Low-Level-Debug-Functions.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Low Level Debug Functions ++ ++Low Level Debug Functions (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

18.2 Low Level Debug Functions

++

18.2 Low Level Debug Functions

+ +

Use the following functions to directly access GCL stacks. +

+--- gcl-2.6.12.orig/info/gcl-si/Low-Level-X-Interface.html ++++ gcl-2.6.12/info/gcl-si/Low-Level-X-Interface.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Low Level X Interface ++ ++Low Level X Interface (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Previous: , Up: Miscellaneous   [Contents][Index]

++Previous: , Up: Miscellaneous   [Contents][Index]

+
+
+- +-

19.3 Low Level X Interface

++

19.3 Low Level X Interface

+ +

A sample program for drawing things on X windows from lisp + is included in the file gcl/lsp/littleXlsp.lsp +--- gcl-2.6.12.orig/info/gcl-si/Miscellaneous.html ++++ gcl-2.6.12/info/gcl-si/Miscellaneous.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Miscellaneous ++ ++Miscellaneous (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,22 +38,20 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

19 Miscellaneous

++

19 Miscellaneous

+ + +- +- +- + + +--- gcl-2.6.12.orig/info/gcl-si/Numbers.html ++++ gcl-2.6.12/info/gcl-si/Numbers.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Numbers ++ ++Numbers (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,19 +38,17 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

1 Numbers

++

1 Numbers

+ + +
+-
Function: SIGNUM (number)
++
Function: SIGNUM (number)
+

Package:LISP +

+

If NUMBER is zero, returns NUMBER; else returns (/ NUMBER (ABS NUMBER)). +@@ -69,7 +57,7 @@ Next: Function: LOGNOT (integer) ++

Function: LOGNOT (integer)
+

Package:LISP +

+

Returns the bit-wise logical NOT of INTEGER. +@@ -78,7 +66,7 @@ Next: Constant: MOST-POSITIVE-SHORT-FLOAT ++

Constant: MOST-POSITIVE-SHORT-FLOAT
+

Package:LISP + The short-float closest in value to positive infinity. +

+@@ -86,7 +74,7 @@ The short-float closest in value to posi +
+ +
+-
Function: INTEGER-DECODE-FLOAT (float)
++
Function: INTEGER-DECODE-FLOAT (float)
+

Package:LISP +

+

Returns, as three values, the integer interpretation of significand F, +@@ -100,7 +88,7 @@ the exponent E, and the sign S of the gi +

+ +
+-
Function: MINUSP (number)
++
Function: MINUSP (number)
+

Package:LISP +

+

Returns T if NUMBER < 0; NIL otherwise. +@@ -109,7 +97,7 @@ the exponent E, and the sign S of the gi +

+ +
+-
Function: LOGORC1 (integer1 integer2)
++
Function: LOGORC1 (integer1 integer2)
+

Package:LISP +

+

Returns the logical OR of (LOGNOT INTEGER1) and INTEGER2. +@@ -118,7 +106,7 @@ the exponent E, and the sign S of the gi +

+ +
+-
Constant: MOST-NEGATIVE-SINGLE-FLOAT
++
Constant: MOST-NEGATIVE-SINGLE-FLOAT
+

Package:LISP + Same as MOST-NEGATIVE-LONG-FLOAT. +

+@@ -126,7 +114,7 @@ Same as MOST-NEGATIVE-LONG-FLOAT. +
+ +
+-
Constant: BOOLE-C1
++
Constant: BOOLE-C1
+

Package:LISP + Makes BOOLE return the complement of INTEGER1. +

+@@ -134,7 +122,7 @@ Makes BOOLE return the complement of INT +
+ +
+-
Constant: LEAST-POSITIVE-SHORT-FLOAT
++
Constant: LEAST-POSITIVE-SHORT-FLOAT
+

Package:LISP + The positive short-float closest in value to zero. +

+@@ -142,7 +130,7 @@ The positive short-float closest in valu +
+ +
+-
Function: BIT-NAND (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-NAND (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical NAND on the elements of BIT-ARRAY1 and +@@ -153,7 +141,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: INT-CHAR (integer)
++
Function: INT-CHAR (integer)
+

Package:LISP +

+

Performs the inverse of CHAR-INT. Equivalent to CODE-CHAR in GCL. +@@ -162,7 +150,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: CHAR-INT (char)
++
Function: CHAR-INT (char)
+

Package:LISP +

+

Returns the font, bits, and code attributes as a single non-negative integer. +@@ -172,7 +160,7 @@ Equivalent to CHAR-CODE in GCL. +

+ +
+-
Constant: LEAST-NEGATIVE-SINGLE-FLOAT
++
Constant: LEAST-NEGATIVE-SINGLE-FLOAT
+

Package:LISP + Same as LEAST-NEGATIVE-LONG-FLOAT. +

+@@ -180,7 +168,7 @@ Same as LEAST-NEGATIVE-LONG-FLOAT. +
+ +
+-
Function: /= (number &rest more-numbers)
++
Function: /= (number &rest more-numbers)
+

Package:LISP +

+

Returns T if no two of its arguments are numerically equal; NIL otherwise. +@@ -189,7 +177,7 @@ Same as LEAST-NEGATIVE-LONG-FLOAT. +

+ +
+-
Function: LDB-TEST (bytespec integer)
++
Function: LDB-TEST (bytespec integer)
+

Package:LISP +

+

Returns T if at least one of the bits in the specified bytes of INTEGER is 1; +@@ -199,7 +187,7 @@ NIL otherwise. +

+ +
+-
Constant: CHAR-CODE-LIMIT
++
Constant: CHAR-CODE-LIMIT
+

Package:LISP + The upper exclusive bound on values produced by CHAR-CODE. +

+@@ -207,7 +195,7 @@ The upper exclusive bound on values prod +
+ +
+-
Function: RATIONAL (number)
++
Function: RATIONAL (number)
+

Package:LISP +

+

Converts NUMBER into rational accurately and returns it. +@@ -216,7 +204,7 @@ The upper exclusive bound on values prod +

+ +
+-
Constant: PI
++
Constant: PI
+

Package:LISP + The floating-point number that is appropriately equal to the ratio of the + circumference of the circle to the diameter. +@@ -225,7 +213,7 @@ circumference of the circle to the diame +

+ +
+-
Function: SIN (radians)
++
Function: SIN (radians)
+

Package:LISP +

+

Returns the sine of RADIANS. +@@ -234,7 +222,7 @@ circumference of the circle to the diame +

+ +
+-
Constant: BOOLE-ORC2
++
Constant: BOOLE-ORC2
+

Package:LISP + Makes BOOLE return LOGORC2 of INTEGER1 and INTEGER2. +

+@@ -242,7 +230,7 @@ Makes BOOLE return LOGORC2 of INTEGER1 a +
+ +
+-
Function: NUMERATOR (rational)
++
Function: NUMERATOR (rational)
+

Package:LISP +

+

Returns as an integer the numerator of the given rational number. +@@ -251,7 +239,7 @@ Makes BOOLE return LOGORC2 of INTEGER1 a +

+ +
+-
Function: MASK-FIELD (bytespec integer)
++
Function: MASK-FIELD (bytespec integer)
+

Package:LISP +

+

Extracts the specified byte from INTEGER. +@@ -260,7 +248,7 @@ Makes BOOLE return LOGORC2 of INTEGER1 a +

+ +
+-
Special Form: INCF
++
Special Form: INCF
+

Package:LISP +

+

Syntax: +@@ -275,7 +263,7 @@ in PLACE. +

+ +
+-
Function: SINH (number)
++
Function: SINH (number)
+

Package:LISP +

+

Returns the hyperbolic sine of NUMBER. +@@ -284,7 +272,7 @@ in PLACE. +

+ +
+-
Function: PHASE (number)
++
Function: PHASE (number)
+

Package:LISP +

+

Returns the angle part of the polar representation of a complex number. +@@ -294,7 +282,7 @@ For non-complex numbers, this is 0. +

+ +
+-
Function: BOOLE (op integer1 integer2)
++
Function: BOOLE (op integer1 integer2)
+

Package:LISP +

+

Returns an integer produced by performing the logical operation specified by +@@ -310,7 +298,7 @@ See the variable docs of these constants +

+ +
+-
Constant: SHORT-FLOAT-EPSILON
++
Constant: SHORT-FLOAT-EPSILON
+

Package:LISP + The smallest positive short-float that satisfies + (not (= (float 1 e) (+ (float 1 e) e))). +@@ -319,7 +307,7 @@ The smallest positive short-float that s +

+ +
+-
Function: LOGORC2 (integer1 integer2)
++
Function: LOGORC2 (integer1 integer2)
+

Package:LISP +

+

Returns the logical OR of INTEGER1 and (LOGNOT INTEGER2). +@@ -328,7 +316,7 @@ The smallest positive short-float that s +

+ +
+-
Constant: BOOLE-C2
++
Constant: BOOLE-C2
+

Package:LISP + Makes BOOLE return the complement of INTEGER2. +

+@@ -336,7 +324,7 @@ Makes BOOLE return the complement of INT +
+ +
+-
Function: REALPART (number)
++
Function: REALPART (number)
+

Package:LISP +

+

Extracts the real part of NUMBER. +@@ -346,7 +334,7 @@ Makes BOOLE return the complement of INT + + +

+-
Constant: BOOLE-CLR
++
Constant: BOOLE-CLR
+

Package:LISP + Makes BOOLE return 0. +

+@@ -354,7 +342,7 @@ Makes BOOLE return 0. +
+ +
+-
Constant: BOOLE-IOR
++
Constant: BOOLE-IOR
+

Package:LISP + Makes BOOLE return LOGIOR of INTEGER1 and INTEGER2. +

+@@ -362,7 +350,7 @@ Makes BOOLE return LOGIOR of INTEGER1 an +
+ +
+-
Function: FTRUNCATE (number &optional (divisor 1))
++
Function: FTRUNCATE (number &optional (divisor 1))
+

Package:LISP +

+

Values: (quotient remainder) +@@ -372,7 +360,7 @@ Same as TRUNCATE, but returns first valu +

+ +
+-
Function: EQL (x y)
++
Function: EQL (x y)
+

Package:LISP +

+

Returns T if X and Y are EQ, or if they are numbers of the same type with +@@ -383,7 +371,7 @@ character. Returns NIL otherwise. +

+ +
+-
Function: LOG (number &optional base)
++
Function: LOG (number &optional base)
+

Package:LISP +

+

Returns the logarithm of NUMBER in the base BASE. BASE defaults to the base +@@ -393,7 +381,7 @@ of natural logarithms. +

+ +
+-
Constant: DOUBLE-FLOAT-NEGATIVE-EPSILON
++
Constant: DOUBLE-FLOAT-NEGATIVE-EPSILON
+

Package:LISP + Same as LONG-FLOAT-NEGATIVE-EPSILON. +

+@@ -401,7 +389,7 @@ Same as LONG-FLOAT-NEGATIVE-EPSILON. +
+ +
+-
Function: LOGIOR (&rest integers)
++
Function: LOGIOR (&rest integers)
+

Package:LISP +

+

Returns the bit-wise INCLUSIVE OR of its arguments. +@@ -410,7 +398,7 @@ Same as LONG-FLOAT-NEGATIVE-EPSILON. +

+ +
+-
Constant: MOST-NEGATIVE-DOUBLE-FLOAT
++
Constant: MOST-NEGATIVE-DOUBLE-FLOAT
+

Package:LISP + Same as MOST-NEGATIVE-LONG-FLOAT. +

+@@ -418,7 +406,7 @@ Same as MOST-NEGATIVE-LONG-FLOAT. +
+ +
+-
Function: / (number &rest more-numbers)
++
Function: / (number &rest more-numbers)
+

Package:LISP +

+

Divides the first NUMBER by each of the subsequent NUMBERS. +@@ -428,7 +416,7 @@ With one arg, returns the reciprocal of +

+ +
+-
Variable: *RANDOM-STATE*
++
Variable: *RANDOM-STATE*
+

Package:LISP + The default random-state object used by RAMDOM. +

+@@ -436,7 +424,7 @@ The default random-state object used by +
+ +
+-
Function: 1+ (number)
++
Function: 1+ (number)
+

Package:LISP +

+

Returns NUMBER + 1. +@@ -445,7 +433,7 @@ The default random-state object used by +

+ +
+-
Constant: LEAST-NEGATIVE-DOUBLE-FLOAT
++
Constant: LEAST-NEGATIVE-DOUBLE-FLOAT
+

Package:LISP + Same as LEAST-NEGATIVE-LONG-FLOAT. +

+@@ -453,7 +441,7 @@ Same as LEAST-NEGATIVE-LONG-FLOAT. +
+ +
+-
Function: FCEILING (number &optional (divisor 1))
++
Function: FCEILING (number &optional (divisor 1))
+

Package:LISP +

+

Same as CEILING, but returns a float as the first value. +@@ -462,7 +450,7 @@ Same as LEAST-NEGATIVE-LONG-FLOAT. +

+ +
+-
Constant: MOST-POSITIVE-FIXNUM
++
Constant: MOST-POSITIVE-FIXNUM
+

Package:LISP + The fixnum closest in value to positive infinity. +

+@@ -470,7 +458,7 @@ The fixnum closest in value to positive +
+ +
+-
Function: BIT-ANDC1 (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-ANDC1 (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical ANDC1 on the elements of BIT-ARRAY1 and +@@ -482,7 +470,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: TAN (radians)
++
Function: TAN (radians)
+

Package:LISP +

+

Returns the tangent of RADIANS. +@@ -491,7 +479,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Constant: BOOLE-NAND
++
Constant: BOOLE-NAND
+

Package:LISP + Makes BOOLE return LOGNAND of INTEGER1 and INTEGER2. +

+@@ -499,7 +487,7 @@ Makes BOOLE return LOGNAND of INTEGER1 a +
+ +
+-
Function: TANH (number)
++
Function: TANH (number)
+

Package:LISP +

+

Returns the hyperbolic tangent of NUMBER. +@@ -508,7 +496,7 @@ Makes BOOLE return LOGNAND of INTEGER1 a +

+ +
+-
Function: ASIN (number)
++
Function: ASIN (number)
+

Package:LISP +

+

Returns the arc sine of NUMBER. +@@ -517,7 +505,7 @@ Makes BOOLE return LOGNAND of INTEGER1 a +

+ +
+-
Function: BYTE (size position)
++
Function: BYTE (size position)
+

Package:LISP +

+

Returns a byte specifier. In GCL, a byte specifier is represented by +@@ -527,7 +515,7 @@ a dotted pair (<size> . <positi +

+ +
+-
Function: ASINH (number)
++
Function: ASINH (number)
+

Package:LISP +

+

Returns the hyperbolic arc sine of NUMBER. +@@ -536,7 +524,7 @@ a dotted pair (<size> . <positi +

+ +
+-
Constant: MOST-POSITIVE-LONG-FLOAT
++
Constant: MOST-POSITIVE-LONG-FLOAT
+

Package:LISP + The long-float closest in value to positive infinity. +

+@@ -544,7 +532,7 @@ The long-float closest in value to posit +
+ +
+-
Macro: SHIFTF
++
Macro: SHIFTF
+

Package:LISP +

+

Syntax: +@@ -560,7 +548,7 @@ form. +

+ +
+-
Constant: LEAST-POSITIVE-LONG-FLOAT
++
Constant: LEAST-POSITIVE-LONG-FLOAT
+

Package:LISP + The positive long-float closest in value to zero. +

+@@ -568,7 +556,7 @@ The positive long-float closest in value +
+ +
+-
Function: DEPOSIT-FIELD (newbyte bytespec integer)
++
Function: DEPOSIT-FIELD (newbyte bytespec integer)
+

Package:LISP +

+

Returns an integer computed by replacing the specified byte of INTEGER with +@@ -578,7 +566,7 @@ the specified byte of NEWBYTE. +

+ +
+-
Function: BIT-AND (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-AND (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical AND on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -589,7 +577,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: LOGNAND (integer1 integer2)
++
Function: LOGNAND (integer1 integer2)
+

Package:LISP +

+

Returns the complement of the logical AND of INTEGER1 and INTEGER2. +@@ -598,7 +586,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: BYTE-POSITION (bytespec)
++
Function: BYTE-POSITION (bytespec)
+

Package:LISP +

+

Returns the position part (in GCL, the cdr part) of the byte specifier. +@@ -607,7 +595,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Macro: ROTATEF
++
Macro: ROTATEF
+

Package:LISP +

+

Syntax: +@@ -623,7 +611,7 @@ Returns NIL always. +

+ +
+-
Function: BIT-ANDC2 (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-ANDC2 (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical ANDC2 on the elements of BIT-ARRAY1 and +@@ -635,7 +623,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: TRUNCATE (number &optional (divisor 1))
++
Function: TRUNCATE (number &optional (divisor 1))
+

Package:LISP +

+

Values: (quotient remainder) +@@ -646,7 +634,7 @@ value is the remainder. +

+ +
+-
Constant: BOOLE-EQV
++
Constant: BOOLE-EQV
+

Package:LISP + Makes BOOLE return LOGEQV of INTEGER1 and INTEGER2. +

+@@ -654,7 +642,7 @@ Makes BOOLE return LOGEQV of INTEGER1 an +
+ +
+-
Constant: BOOLE-SET
++
Constant: BOOLE-SET
+

Package:LISP + Makes BOOLE return -1. +

+@@ -662,7 +650,7 @@ Makes BOOLE return -1. +
+ +
+-
Function: LDB (bytespec integer)
++
Function: LDB (bytespec integer)
+

Package:LISP +

+

Extracts and right-justifies the specified byte of INTEGER, and returns the +@@ -672,7 +660,7 @@ result. +

+ +
+-
Function: BYTE-SIZE (bytespec)
++
Function: BYTE-SIZE (bytespec)
+

Package:LISP +

+

Returns the size part (in GCL, the car part) of the byte specifier. +@@ -681,7 +669,7 @@ result. +

+ +
+-
Constant: SHORT-FLOAT-NEGATIVE-EPSILON
++
Constant: SHORT-FLOAT-NEGATIVE-EPSILON
+

Package:LISP + The smallest positive short-float that satisfies + (not (= (float 1 e) (- (float 1 e) e))). +@@ -690,7 +678,7 @@ The smallest positive short-float that s +

+ +
+-
Function: REM (number divisor)
++
Function: REM (number divisor)
+

Package:LISP +

+

Returns the second value of (TRUNCATE NUMBER DIVISOR). +@@ -699,7 +687,7 @@ The smallest positive short-float that s +

+ +
+-
Function: MIN (number &rest more-numbers)
++
Function: MIN (number &rest more-numbers)
+

Package:LISP +

+

Returns the least of its arguments. +@@ -708,7 +696,7 @@ The smallest positive short-float that s +

+ +
+-
Function: EXP (number)
++
Function: EXP (number)
+

Package:LISP +

+

Calculates e raised to the power NUMBER, where e is the base of natural +@@ -718,7 +706,7 @@ logarithms. +

+ +
+-
Function: DECODE-FLOAT (float)
++
Function: DECODE-FLOAT (float)
+

Package:LISP +

+

Returns, as three values, the significand F, the exponent E, and the sign S +@@ -734,7 +722,7 @@ is an integer. +

+ +
+-
Constant: LONG-FLOAT-EPSILON
++
Constant: LONG-FLOAT-EPSILON
+

Package:LISP + The smallest positive long-float that satisfies + (not (= (float 1 e) (+ (float 1 e) e))). +@@ -743,7 +731,7 @@ The smallest positive long-float that sa +

+ +
+-
Function: FROUND (number &optional (divisor 1))
++
Function: FROUND (number &optional (divisor 1))
+

Package:LISP +

+

Same as ROUND, but returns first value as a float. +@@ -752,7 +740,7 @@ The smallest positive long-float that sa +

+ +
+-
Function: LOGEQV (&rest integers)
++
Function: LOGEQV (&rest integers)
+

Package:LISP +

+

Returns the bit-wise EQUIVALENCE of its arguments. +@@ -761,7 +749,7 @@ The smallest positive long-float that sa +

+ +
+-
Constant: MOST-NEGATIVE-SHORT-FLOAT
++
Constant: MOST-NEGATIVE-SHORT-FLOAT
+

Package:LISP + The short-float closest in value to negative infinity. +

+@@ -769,7 +757,7 @@ The short-float closest in value to nega +
+ +
+-
Function: BIT-NOR (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-NOR (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical NOR on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -780,7 +768,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: CEILING (number &optional (divisor 1))
++
Function: CEILING (number &optional (divisor 1))
+

Package:LISP +

+

Returns the smallest integer not less than or NUMBER/DIVISOR. Returns the +@@ -790,7 +778,7 @@ remainder as the second value. +

+ +
+-
Constant: LEAST-NEGATIVE-SHORT-FLOAT
++
Constant: LEAST-NEGATIVE-SHORT-FLOAT
+

Package:LISP + The negative short-float closest in value to zero. +

+@@ -798,7 +786,7 @@ The negative short-float closest in valu +
+ +
+-
Function: 1- (number)
++
Function: 1- (number)
+

Package:LISP +

+

Returns NUMBER - 1. +@@ -807,7 +795,7 @@ The negative short-float closest in valu +

+ +
+-
Function: <= (number &rest more-numbers)
++
Function: <= (number &rest more-numbers)
+

Package:LISP +

+

Returns T if arguments are in strictly non-decreasing order; NIL otherwise. +@@ -816,7 +804,7 @@ The negative short-float closest in valu +

+ +
+-
Function: IMAGPART (number)
++
Function: IMAGPART (number)
+

Package:LISP +

+

Extracts the imaginary part of NUMBER. +@@ -825,7 +813,7 @@ The negative short-float closest in valu +

+ +
+-
Function: INTEGERP (x)
++
Function: INTEGERP (x)
+

Package:LISP +

+

Returns T if X is an integer (fixnum or bignum); NIL otherwise. +@@ -834,7 +822,7 @@ The negative short-float closest in valu +

+ +
+-
Function: ASH (integer count)
++
Function: ASH (integer count)
+

Package:LISP +

+

Shifts INTEGER left by COUNT places. Shifts right if COUNT is negative. +@@ -843,7 +831,7 @@ The negative short-float closest in valu +

+ +
+-
Function: LCM (integer &rest more-integers)
++
Function: LCM (integer &rest more-integers)
+

Package:LISP +

+

Returns the least common multiple of the arguments. +@@ -852,7 +840,7 @@ The negative short-float closest in valu +

+ +
+-
Function: COS (radians)
++
Function: COS (radians)
+

Package:LISP +

+

Returns the cosine of RADIANS. +@@ -861,7 +849,7 @@ The negative short-float closest in valu +

+ +
+-
Special Form: DECF
++
Special Form: DECF
+

Package:LISP +

+

Syntax: +@@ -876,7 +864,7 @@ PLACE. +

+ +
+-
Function: ATAN (x &optional (y 1))
++
Function: ATAN (x &optional (y 1))
+

Package:LISP + Returns the arc tangent of + X/Y. +@@ -885,7 +873,7 @@ X/Y. +

+ +
+-
Constant: BOOLE-ANDC1
++
Constant: BOOLE-ANDC1
+

Package:LISP + Makes BOOLE return LOGANDC1 of INTEGER1 and INTEGER2. +

+@@ -893,7 +881,7 @@ Makes BOOLE return LOGANDC1 of INTEGER1 +
+ +
+-
Function: COSH (number)
++
Function: COSH (number)
+

Package:LISP + Returns the hyperbolic cosine of + NUMBER. +@@ -902,7 +890,7 @@ NUMBER. +

+ +
+-
Function: FLOAT-RADIX (float)
++
Function: FLOAT-RADIX (float)
+

Package:LISP +

+

Returns the representation radix (or base) of the floating-point +@@ -912,7 +900,7 @@ number. +

+ +
+-
Function: ATANH (number)
++
Function: ATANH (number)
+

Package:LISP +

+

Returns the hyperbolic arc tangent of NUMBER. +@@ -921,7 +909,7 @@ number. +

+ +
+-
Function: EVENP (integer)
++
Function: EVENP (integer)
+

Package:LISP + Returns T + if INTEGER is even. Returns NIL if INTEGER is odd. +@@ -930,7 +918,7 @@ if INTEGER is even. Returns NIL if INTE +

+ +
+-
Function: ZEROP (number)
++
Function: ZEROP (number)
+

Package:LISP + Returns T if NUMBER = 0; NIL + otherwise. +@@ -939,7 +927,7 @@ otherwise. +

+ +
+-
Function: FLOATP (x)
++
Function: FLOATP (x)
+

Package:LISP +

+

Returns T if X is a floating-point number; NIL otherwise. +@@ -948,7 +936,7 @@ otherwise. +

+ +
+-
Function: SXHASH (object)
++
Function: SXHASH (object)
+

Package:LISP +

+

Computes a hash code for OBJECT and returns it as an integer. +@@ -957,7 +945,7 @@ otherwise. +

+ +
+-
Constant: BOOLE-1
++
Constant: BOOLE-1
+

Package:LISP + Makes BOOLE return INTEGER1. +

+@@ -965,7 +953,7 @@ Makes BOOLE return INTEGER1. +
+ +
+-
Constant: MOST-POSITIVE-SINGLE-FLOAT
++
Constant: MOST-POSITIVE-SINGLE-FLOAT
+

Package:LISP + Same as MOST-POSITIVE-LONG-FLOAT. +

+@@ -973,7 +961,7 @@ Same as MOST-POSITIVE-LONG-FLOAT. +
+ +
+-
Function: LOGANDC1 (integer1 integer2)
++
Function: LOGANDC1 (integer1 integer2)
+

Package:LISP +

+

Returns the logical AND of (LOGNOT INTEGER1) and INTEGER2. +@@ -982,7 +970,7 @@ Same as MOST-POSITIVE-LONG-FLOAT. +

+ +
+-
Constant: LEAST-POSITIVE-SINGLE-FLOAT
++
Constant: LEAST-POSITIVE-SINGLE-FLOAT
+

Package:LISP + Same as LEAST-POSITIVE-LONG-FLOAT. +

+@@ -990,7 +978,7 @@ Same as LEAST-POSITIVE-LONG-FLOAT. +
+ +
+-
Function: COMPLEXP (x)
++
Function: COMPLEXP (x)
+

Package:LISP +

+

Returns T if X is a complex number; NIL otherwise. +@@ -999,7 +987,7 @@ Same as LEAST-POSITIVE-LONG-FLOAT. +

+ +
+-
Constant: BOOLE-AND
++
Constant: BOOLE-AND
+

Package:LISP + Makes BOOLE return LOGAND of INTEGER1 and INTEGER2. +

+@@ -1007,7 +995,7 @@ Makes BOOLE return LOGAND of INTEGER1 an +
+ +
+-
Function: MAX (number &rest more-numbers)
++
Function: MAX (number &rest more-numbers)
+

Package:LISP +

+

Returns the greatest of its arguments. +@@ -1016,7 +1004,7 @@ Makes BOOLE return LOGAND of INTEGER1 an +

+ +
+-
Function: FLOAT-SIGN (float1 &optional (float2 (float 1 float1)))
++
Function: FLOAT-SIGN (float1 &optional (float2 (float 1 float1)))
+

Package:LISP +

+

Returns a floating-point number with the same sign as FLOAT1 and with the +@@ -1026,7 +1014,7 @@ same absolute value as FLOAT2. +

+ +
+-
Constant: BOOLE-ANDC2
++
Constant: BOOLE-ANDC2
+

Package:LISP + Makes BOOLE return LOGANDC2 of INTEGER1 and INTEGER2. +

+@@ -1034,7 +1022,7 @@ Makes BOOLE return LOGANDC2 of INTEGER1 +
+ +
+-
Function: DENOMINATOR (rational)
++
Function: DENOMINATOR (rational)
+

Package:LISP +

+

Returns the denominator of RATIONAL as an integer. +@@ -1043,7 +1031,7 @@ Makes BOOLE return LOGANDC2 of INTEGER1 +

+ +
+-
Function: FLOAT (number &optional other)
++
Function: FLOAT (number &optional other)
+

Package:LISP +

+

Converts a non-complex number to a floating-point number. If NUMBER is +@@ -1056,7 +1044,7 @@ as OTHER’s. +

+ +
+-
Function: ROUND (number &optional (divisor 1))
++
Function: ROUND (number &optional (divisor 1))
+

Package:LISP +

+

Rounds NUMBER/DIVISOR to nearest integer. The second returned value is the +@@ -1066,7 +1054,7 @@ remainder. +

+ +
+-
Function: LOGAND (&rest integers)
++
Function: LOGAND (&rest integers)
+

Package:LISP +

+

Returns the bit-wise AND of its arguments. +@@ -1075,7 +1063,7 @@ remainder. +

+ +
+-
Constant: BOOLE-2
++
Constant: BOOLE-2
+

Package:LISP + Makes BOOLE return INTEGER2. +

+@@ -1083,7 +1071,7 @@ Makes BOOLE return INTEGER2. +
+ +
+-
Function: * (&rest numbers)
++
Function: * (&rest numbers)
+

Package:LISP +

+

Returns the product of its arguments. With no args, returns 1. +@@ -1092,7 +1080,7 @@ Makes BOOLE return INTEGER2. +

+ +
+-
Function: < (number &rest more-numbers)
++
Function: < (number &rest more-numbers)
+

Package:LISP +

+

Returns T if its arguments are in strictly increasing order; NIL otherwise. +@@ -1101,7 +1089,7 @@ Makes BOOLE return INTEGER2. +

+ +
+-
Function: COMPLEX (realpart &optional (imagpart 0))
++
Function: COMPLEX (realpart &optional (imagpart 0))
+

Package:LISP +

+

Returns a complex number with the given real and imaginary parts. +@@ -1110,7 +1098,7 @@ Makes BOOLE return INTEGER2. +

+ +
+-
Constant: SINGLE-FLOAT-EPSILON
++
Constant: SINGLE-FLOAT-EPSILON
+

Package:LISP + Same as LONG-FLOAT-EPSILON. +

+@@ -1118,7 +1106,7 @@ Same as LONG-FLOAT-EPSILON. +
+ +
+-
Function: LOGANDC2 (integer1 integer2)
++
Function: LOGANDC2 (integer1 integer2)
+

Package:LISP +

+

Returns the logical AND of INTEGER1 and (LOGNOT INTEGER2). +@@ -1127,7 +1115,7 @@ Same as LONG-FLOAT-EPSILON. +

+ +
+-
Function: INTEGER-LENGTH (integer)
++
Function: INTEGER-LENGTH (integer)
+

Package:LISP +

+

Returns the number of significant bits in the absolute value of INTEGER. +@@ -1136,7 +1124,7 @@ Same as LONG-FLOAT-EPSILON. +

+ +
+-
Constant: MOST-NEGATIVE-FIXNUM
++
Constant: MOST-NEGATIVE-FIXNUM
+

Package:LISP + The fixnum closest in value to negative infinity. +

+@@ -1144,7 +1132,7 @@ The fixnum closest in value to negative +
+ +
+-
Constant: LONG-FLOAT-NEGATIVE-EPSILON
++
Constant: LONG-FLOAT-NEGATIVE-EPSILON
+

Package:LISP + The smallest positive long-float that satisfies + (not (= (float 1 e) (- (float 1 e) e))). +@@ -1153,7 +1141,7 @@ The smallest positive long-float that sa +

+ +
+-
Function: >= (number &rest more-numbers)
++
Function: >= (number &rest more-numbers)
+

Package:LISP +

+

Returns T if arguments are in strictly non-increasing order; NIL otherwise. +@@ -1162,7 +1150,7 @@ The smallest positive long-float that sa +

+ +
+-
Constant: BOOLE-NOR
++
Constant: BOOLE-NOR
+

Package:LISP + Makes BOOLE return LOGNOR of INTEGER1 and INTEGER2. +

+@@ -1170,7 +1158,7 @@ Makes BOOLE return LOGNOR of INTEGER1 an +
+ +
+-
Function: ACOS (number)
++
Function: ACOS (number)
+

Package:LISP +

+

Returns the arc cosine of NUMBER. +@@ -1179,7 +1167,7 @@ Makes BOOLE return LOGNOR of INTEGER1 an +

+ +
+-
Function: MAKE-RANDOM-STATE (&optional (state *random-state*))
++
Function: MAKE-RANDOM-STATE (&optional (state *random-state*))
+

Package:LISP +

+

Creates and returns a copy of the specified random state. If STATE is NIL, +@@ -1190,7 +1178,7 @@ random state object generated from the u +

+ +
+-
Function: EXPT (base-number power-number)
++
Function: EXPT (base-number power-number)
+

Package:LISP +

+

Returns BASE-NUMBER raised to the power POWER-NUMBER. +@@ -1199,7 +1187,7 @@ random state object generated from the u +

+ +
+-
Function: SQRT (number)
++
Function: SQRT (number)
+

Package:LISP +

+

Returns the principal square root of NUMBER. +@@ -1208,7 +1196,7 @@ random state object generated from the u +

+ +
+-
Function: SCALE-FLOAT (float integer)
++
Function: SCALE-FLOAT (float integer)
+

Package:LISP +

+

Returns (* FLOAT (expt (float-radix FLOAT) INTEGER)). +@@ -1217,7 +1205,7 @@ random state object generated from the u +

+ +
+-
Function: ACOSH (number)
++
Function: ACOSH (number)
+

Package:LISP +

+

Returns the hyperbolic arc cosine of NUMBER. +@@ -1226,7 +1214,7 @@ random state object generated from the u +

+ +
+-
Constant: MOST-NEGATIVE-LONG-FLOAT
++
Constant: MOST-NEGATIVE-LONG-FLOAT
+

Package:LISP + The long-float closest in value to negative infinity. +

+@@ -1234,7 +1222,7 @@ The long-float closest in value to negat +
+ +
+-
Constant: LEAST-NEGATIVE-LONG-FLOAT
++
Constant: LEAST-NEGATIVE-LONG-FLOAT
+

Package:LISP + The negative long-float closest in value to zero. +

+@@ -1242,7 +1230,7 @@ The negative long-float closest in value +
+ +
+-
Function: FFLOOR (number &optional (divisor 1))
++
Function: FFLOOR (number &optional (divisor 1))
+

Package:LISP +

+

Same as FLOOR, but returns a float as the first value. +@@ -1251,7 +1239,7 @@ The negative long-float closest in value +

+ +
+-
Function: LOGNOR (integer1 integer2)
++
Function: LOGNOR (integer1 integer2)
+

Package:LISP +

+

Returns the complement of the logical OR of INTEGER1 and INTEGER2. +@@ -1260,7 +1248,7 @@ The negative long-float closest in value +

+ +
+-
Function: PARSE-INTEGER (string &key (start 0) (end (length string)) (radix 10) (junk-allowed nil))
++
Function: PARSE-INTEGER (string &key (start 0) (end (length string)) (radix 10) (junk-allowed nil))
+

Package:LISP +

+

Parses STRING for an integer and returns it. +@@ -1269,7 +1257,7 @@ The negative long-float closest in value +

+ +
+-
Function: + (&rest numbers)
++
Function: + (&rest numbers)
+

Package:LISP +

+

Returns the sum of its arguments. With no args, returns 0. +@@ -1278,7 +1266,7 @@ The negative long-float closest in value +

+ +
+-
Function: = (number &rest more-numbers)
++
Function: = (number &rest more-numbers)
+

Package:LISP +

+

Returns T if all of its arguments are numerically equal; NIL otherwise. +@@ -1287,7 +1275,7 @@ The negative long-float closest in value +

+ +
+-
Function: NUMBERP (x)
++
Function: NUMBERP (x)
+

Package:LISP +

+

Returns T if X is any kind of number; NIL otherwise. +@@ -1296,7 +1284,7 @@ The negative long-float closest in value +

+ +
+-
Constant: MOST-POSITIVE-DOUBLE-FLOAT
++
Constant: MOST-POSITIVE-DOUBLE-FLOAT
+

Package:LISP + Same as MOST-POSITIVE-LONG-FLOAT. +

+@@ -1304,7 +1292,7 @@ Same as MOST-POSITIVE-LONG-FLOAT. +
+ +
+-
Function: LOGTEST (integer1 integer2)
++
Function: LOGTEST (integer1 integer2)
+

Package:LISP +

+

Returns T if LOGAND of INTEGER1 and INTEGER2 is not zero; NIL otherwise. +@@ -1313,7 +1301,7 @@ Same as MOST-POSITIVE-LONG-FLOAT. +

+ +
+-
Function: RANDOM-STATE-P (x)
++
Function: RANDOM-STATE-P (x)
+

Package:LISP +

+

Returns T if X is a random-state object; NIL otherwise. +@@ -1322,7 +1310,7 @@ Same as MOST-POSITIVE-LONG-FLOAT. +

+ +
+-
Constant: LEAST-POSITIVE-DOUBLE-FLOAT
++
Constant: LEAST-POSITIVE-DOUBLE-FLOAT
+

Package:LISP + Same as LEAST-POSITIVE-LONG-FLOAT. +

+@@ -1330,7 +1318,7 @@ Same as LEAST-POSITIVE-LONG-FLOAT. +
+ +
+-
Function: FLOAT-PRECISION (float)
++
Function: FLOAT-PRECISION (float)
+

Package:LISP +

+

Returns the number of significant radix-B digits used to represent the +@@ -1340,7 +1328,7 @@ significand F of the floating-point numb +

+ +
+-
Constant: BOOLE-XOR
++
Constant: BOOLE-XOR
+

Package:LISP + Makes BOOLE return LOGXOR of INTEGER1 and INTEGER2. +

+@@ -1348,7 +1336,7 @@ Makes BOOLE return LOGXOR of INTEGER1 an +
+ +
+-
Function: DPB (newbyte bytespec integer)
++
Function: DPB (newbyte bytespec integer)
+

Package:LISP +

+

Returns an integer computed by replacing the specified byte of INTEGER with +@@ -1358,7 +1346,7 @@ NEWBYTE. +

+ +
+-
Function: ABS (number)
++
Function: ABS (number)
+

Package:LISP +

+

Returns the absolute value of NUMBER. +@@ -1367,7 +1355,7 @@ NEWBYTE. +

+ +
+-
Function: CONJUGATE (number)
++
Function: CONJUGATE (number)
+

Package:LISP +

+

Returns the complex conjugate of NUMBER. +@@ -1376,7 +1364,7 @@ NEWBYTE. +

+ +
+-
Function: CIS (radians)
++
Function: CIS (radians)
+

Package:LISP +

+

Returns e raised to i*RADIANS. +@@ -1385,7 +1373,7 @@ NEWBYTE. +

+ +
+-
Function: ODDP (integer)
++
Function: ODDP (integer)
+

Package:LISP +

+

Returns T if INTEGER is odd; NIL otherwise. +@@ -1394,7 +1382,7 @@ NEWBYTE. +

+ +
+-
Function: RATIONALIZE (number)
++
Function: RATIONALIZE (number)
+

Package:LISP +

+

Converts NUMBER into rational approximately and returns it. +@@ -1403,7 +1391,7 @@ NEWBYTE. +

+ +
+-
Function: ISQRT (integer)
++
Function: ISQRT (integer)
+

Package:LISP +

+

Returns the greatest integer less than or equal to the square root of the +@@ -1413,7 +1401,7 @@ given non-negative integer. +

+ +
+-
Function: LOGXOR (&rest integers)
++
Function: LOGXOR (&rest integers)
+

Package:LISP +

+

Returns the bit-wise EXCLUSIVE OR of its arguments. +@@ -1422,7 +1410,7 @@ given non-negative integer. +

+ +
+-
Function: > (number &rest more-numbers)
++
Function: > (number &rest more-numbers)
+

Package:LISP +

+

Returns T if its arguments are in strictly decreasing order; NIL otherwise. +@@ -1431,7 +1419,7 @@ given non-negative integer. +

+ +
+-
Function: LOGBITP (index integer)
++
Function: LOGBITP (index integer)
+

Package:LISP +

+

Returns T if the INDEX-th bit of INTEGER is 1. +@@ -1440,7 +1428,7 @@ given non-negative integer. +

+ +
+-
Constant: DOUBLE-FLOAT-EPSILON
++
Constant: DOUBLE-FLOAT-EPSILON
+

Package:LISP + Same as LONG-FLOAT-EPSILON. +

+@@ -1448,7 +1436,7 @@ Same as LONG-FLOAT-EPSILON. +
+ +
+-
Function: LOGCOUNT (integer)
++
Function: LOGCOUNT (integer)
+

Package:LISP +

+

If INTEGER is negative, returns the number of 0 bits. Otherwise, returns +@@ -1458,7 +1446,7 @@ the number of 1 bits. +

+ +
+-
Function: GCD (&rest integers)
++
Function: GCD (&rest integers)
+

Package:LISP +

+

Returns the greatest common divisor of INTEGERs. +@@ -1467,7 +1455,7 @@ the number of 1 bits. +

+ +
+-
Function: RATIONALP (x)
++
Function: RATIONALP (x)
+

Package:LISP +

+

Returns T if X is an integer or a ratio; NIL otherwise. +@@ -1476,7 +1464,7 @@ the number of 1 bits. +

+ +
+-
Function: MOD (number divisor)
++
Function: MOD (number divisor)
+

Package:LISP +

+

Returns the second result of (FLOOR NUMBER DIVISOR). +@@ -1485,7 +1473,7 @@ the number of 1 bits. +

+ +
+-
Function: MODF (number)
++
Function: MODF (number)
+

Package:SYSTEM +

+

Returns the integer and fractional part of a floating point number mod 1.0. +@@ -1494,7 +1482,7 @@ the number of 1 bits. +

+ +
+-
Constant: BOOLE-ORC1
++
Constant: BOOLE-ORC1
+

Package:LISP + Makes BOOLE return LOGORC1 of INTEGER1 and INTEGER2. +

+@@ -1502,7 +1490,7 @@ Makes BOOLE return LOGORC1 of INTEGER1 a +
+ +
+-
Constant: SINGLE-FLOAT-NEGATIVE-EPSILON
++
Constant: SINGLE-FLOAT-NEGATIVE-EPSILON
+

Package:LISP + Same as LONG-FLOAT-NEGATIVE-EPSILON. +

+@@ -1510,7 +1498,7 @@ Same as LONG-FLOAT-NEGATIVE-EPSILON. +
+ +
+-
Function: FLOOR (number &optional (divisor 1))
++
Function: FLOOR (number &optional (divisor 1))
+

Package:LISP +

+

Returns the largest integer not larger than the NUMBER divided by DIVISOR. +@@ -1520,7 +1508,7 @@ The second returned value is (- NUMBER ( +

+ +
+-
Function: PLUSP (number)
++
Function: PLUSP (number)
+

Package:LISP +

+

Returns T if NUMBER > 0; NIL otherwise. +@@ -1529,7 +1517,7 @@ The second returned value is (- NUMBER ( +

+ +
+-
Function: FLOAT-DIGITS (float)
++
Function: FLOAT-DIGITS (float)
+

Package:LISP +

+

Returns the number of radix-B digits used to represent the significand F of +@@ -1539,7 +1527,7 @@ the floating-point number, where B = (FL +

+ +
+-
Function: RANDOM (number &optional (state *random-state*))
++
Function: RANDOM (number &optional (state *random-state*))
+

Package:LISP +

+

Generates a uniformly distributed pseudo-random number between zero +@@ -1551,7 +1539,7 @@ the floating-point number, where B = (FL +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Operating-System-Definitions.html ++++ gcl-2.6.12/info/gcl-si/Operating-System-Definitions.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Operating System Definitions ++ ++Operating System Definitions (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Previous: , Up: Operating System   [Contents][Index]

++Previous: , Up: Operating System   [Contents][Index]

+
+
+- +-

9.2 Operating System Definitions

++

9.2 Operating System Definitions

+ +
+-
Function: GET-DECODED-TIME ()
++
Function: GET-DECODED-TIME ()
+

Package:LISP +

+

Returns the current time in decoded time format. Returns nine values: second, +@@ -70,7 +58,7 @@ time-zone. +

+ +
+-
Function: HOST-NAMESTRING (pathname)
++
Function: HOST-NAMESTRING (pathname)
+

Package:LISP +

+

Returns the host part of PATHNAME as a string. +@@ -79,7 +67,7 @@ time-zone. +

+ +
+-
Function: RENAME-FILE (file new-name)
++
Function: RENAME-FILE (file new-name)
+

Package:LISP +

+

Renames the file FILE to NEW-NAME. FILE may be a string, a pathname, or +@@ -89,7 +77,7 @@ a stream. +

+ +
+-
Function: FILE-AUTHOR (file)
++
Function: FILE-AUTHOR (file)
+

Package:LISP +

+

Returns the author name of the specified file, as a string. +@@ -99,7 +87,7 @@ FILE may be a string or a stream +

+ +
+-
Function: PATHNAME-HOST (pathname)
++
Function: PATHNAME-HOST (pathname)
+

Package:LISP +

+

Returns the host slot of PATHNAME. +@@ -108,7 +96,7 @@ FILE may be a string or a stream +

+ +
+-
Function: FILE-POSITION (file-stream &optional position)
++
Function: FILE-POSITION (file-stream &optional position)
+

Package:LISP +

+

Sets the file pointer of the specified file to POSITION, if POSITION is given. +@@ -118,7 +106,7 @@ Otherwise, returns the current file posi +

+ +
+-
Function: DECODE-UNIVERSAL-TIME (universal-time &optional (timezone -9))
++
Function: DECODE-UNIVERSAL-TIME (universal-time &optional (timezone -9))
+

Package:LISP +

+

Converts UNIVERSAL-TIME into a decoded time at the TIMEZONE. +@@ -130,7 +118,7 @@ TIMEZONE in GCL defaults to 6, the time +

+ +
+-
Function: USER-HOMEDIR-PATHNAME (&optional host)
++
Function: USER-HOMEDIR-PATHNAME (&optional host)
+

Package:LISP +

+

Returns the home directory of the logged in user as a pathname. HOST +@@ -141,7 +129,7 @@ is ignored. + + +

+-
Variable: *MODULES*
++
Variable: *MODULES*
+

Package:LISP + A list of names of the modules that have been loaded into GCL. +

+@@ -149,7 +137,7 @@ A list of names of the modules that have +
+ +
+-
Function: SHORT-SITE-NAME ()
++
Function: SHORT-SITE-NAME ()
+

Package:LISP +

+

Returns a string that identifies the physical location of the current GCL. +@@ -158,7 +146,7 @@ A list of names of the modules that have +

+ +
+-
Function: DIRECTORY (name)
++
Function: DIRECTORY (name)
+

Package:LISP +

+

Returns a list of files that match NAME. NAME may be a string, a pathname, +@@ -168,7 +156,7 @@ or a file stream. +

+ +
+-
Function: SOFTWARE-VERSION ()
++
Function: SOFTWARE-VERSION ()
+

Package:LISP +

+

Returns a string that identifies the software version of the software +@@ -178,7 +166,7 @@ under which GCL is currently running. +

+ +
+-
Constant: INTERNAL-TIME-UNITS-PER-SECOND
++
Constant: INTERNAL-TIME-UNITS-PER-SECOND
+

Package:LISP + The number of internal time units that fit into a second. +

+@@ -186,7 +174,7 @@ The number of internal time units that f +
+ +
+-
Function: ENOUGH-NAMESTRING (pathname &optional (defaults *default-pathname-defaults*))
++
Function: ENOUGH-NAMESTRING (pathname &optional (defaults *default-pathname-defaults*))
+

Package:LISP +

+

Returns a string which uniquely identifies PATHNAME with respect to +@@ -196,7 +184,7 @@ DEFAULTS. +

+ +
+-
Function: REQUIRE (module-name &optional (pathname))
++
Function: REQUIRE (module-name &optional (pathname))
+

Package:LISP +

+

If the specified module is not present, then loads the appropriate file(s). +@@ -206,7 +194,7 @@ PATHNAME may be a single pathname or it +

+ +
+-
Function: ENCODE-UNIVERSAL-TIME (second minute hour date month year &optional (timezone ))
++
Function: ENCODE-UNIVERSAL-TIME (second minute hour date month year &optional (timezone ))
+

Package:LISP +

+

Does the inverse operation of DECODE-UNIVERSAL-TIME. +@@ -215,7 +203,7 @@ PATHNAME may be a single pathname or it +

+ +
+-
Function: LISP-IMPLEMENTATION-VERSION ()
++
Function: LISP-IMPLEMENTATION-VERSION ()
+

Package:LISP +

+

Returns a string that tells you when the current GCL implementation is +@@ -225,7 +213,7 @@ brought up. +

+ +
+-
Function: MACHINE-INSTANCE ()
++
Function: MACHINE-INSTANCE ()
+

Package:LISP +

+

Returns a string that identifies the machine instance of the machine +@@ -235,7 +223,7 @@ on which GCL is currently running. +

+ +
+-
Function: ROOM (&optional (x t))
++
Function: ROOM (&optional (x t))
+

Package:LISP +

+

Displays information about storage allocation in the following format. +@@ -270,7 +258,7 @@ if the number is zero. The optional X i +

+ +
+-
Function: GET-UNIVERSAL-TIME ()
++
Function: GET-UNIVERSAL-TIME ()
+

Package:LISP +

+

Returns the current time as a single integer in universal time format. +@@ -279,7 +267,7 @@ if the number is zero. The optional X i +

+ +
+-
Function: GET-INTERNAL-RUN-TIME ()
++
Function: GET-INTERNAL-RUN-TIME ()
+

Package:LISP +

+

Returns the run time in the internal time format. This is useful for +@@ -290,7 +278,7 @@ containing CPU usage of child processes +

+ +
+-
Variable: *DEFAULT-PATHNAME-DEFAULTS*
++
Variable: *DEFAULT-PATHNAME-DEFAULTS*
+

Package:LISP + The default pathname-defaults pathname. +

+@@ -298,7 +286,7 @@ The default pathname-defaults pathname. +
+ +
+-
Function: LONG-SITE-NAME ()
++
Function: LONG-SITE-NAME ()
+

Package:LISP +

+

Returns a string that identifies the physical location of the current GCL. +@@ -307,7 +295,7 @@ The default pathname-defaults pathname. +

+ +
+-
Function: DELETE-FILE (file)
++
Function: DELETE-FILE (file)
+

Package:LISP + Deletes FILE. +

+@@ -315,7 +303,7 @@ The default pathname-defaults pathname. +
+ +
+-
Function: GET-INTERNAL-REAL-TIME ()
++
Function: GET-INTERNAL-REAL-TIME ()
+

Package:LISP +

+

Returns the real time in the internal time format. This is useful for +@@ -325,7 +313,7 @@ finding elapsed time. +

+ +
+-
Function: MACHINE-TYPE ()
++
Function: MACHINE-TYPE ()
+

Package:LISP +

+

Returns a string that identifies the machine type of the machine +@@ -335,7 +323,7 @@ on which GCL is currently running. +

+ +
+-
Macro: TIME
++
Macro: TIME
+

Package:LISP +

+

Syntax: +@@ -349,7 +337,7 @@ on which GCL is currently running. +

+ +
+-
Function: SOFTWARE-TYPE ()
++
Function: SOFTWARE-TYPE ()
+

Package:LISP +

+

Returns a string that identifies the software type of the software +@@ -359,7 +347,7 @@ under which GCL is currently running. +

+ +
+-
Function: LISP-IMPLEMENTATION-TYPE ()
++
Function: LISP-IMPLEMENTATION-TYPE ()
+

Package:LISP +

+

Returns a string that tells you that you are using a version of GCL. +@@ -368,7 +356,7 @@ under which GCL is currently running. +

+ +
+-
Function: SLEEP (n)
++
Function: SLEEP (n)
+

Package:LISP +

+

This function causes execution to be suspended for N seconds. N may +@@ -378,7 +366,7 @@ be any non-negative, non-complex number. +

+ +
+-
Function: BREAK-ON-FLOATING-POINT-EXCEPTIONS (&key division-by-zero
++
Function: BREAK-ON-FLOATING-POINT-EXCEPTIONS (&key division-by-zero
+

floating-point-invalid-operation + floating-point-overflow + floating-point-underflow +@@ -410,7 +398,7 @@ in gcl_fpe.lsp. +


+
+

+-Previous: , Up: Operating System   [Contents][Index]

++Previous: , Up: Operating System   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Operating-System.html ++++ gcl-2.6.12/info/gcl-si/Operating-System.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Operating System ++ ++Operating System (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,20 +38,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

9 Operating System

++

9 Operating System

+ + +- +- + + +--- gcl-2.6.12.orig/info/gcl-si/Regular-Expressions.html ++++ gcl-2.6.12/info/gcl-si/Regular-Expressions.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Regular Expressions ++ ++Regular Expressions (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

17.1 Regular Expressions

++

17.1 Regular Expressions

+ +

The function string-match (*Index string-match::) is used to + match a regular expression against a string. If the variable +@@ -111,8 +99,7 @@ for the full list of ASCII characters be + + + +- +-

Ordering Multiple Matches

++

Ordering Multiple Matches

+ +

In general there may be more than one way to match a regular expression + to an input string. For example, consider the command +@@ -202,7 +189,7 @@ follow an atom if it is interpreted as a +


+ + + +--- gcl-2.6.12.orig/info/gcl-si/Sequences-and-Arrays-and-Hash-Tables.html ++++ gcl-2.6.12/info/gcl-si/Sequences-and-Arrays-and-Hash-Tables.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Sequences and Arrays and Hash Tables ++ ++Sequences and Arrays and Hash Tables (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

2 Sequences and Arrays and Hash Tables

++

2 Sequences and Arrays and Hash Tables

+ +
+-
Function: VECTOR (&rest objects)
++
Function: VECTOR (&rest objects)
+

Package:LISP +

+

Constructs a Simple-Vector from the given objects. +@@ -68,7 +56,7 @@ Next: Function: SUBSEQ (sequence start &optional (end (length sequence))) ++

Function: SUBSEQ (sequence start &optional (end (length sequence)))
+

Package:LISP +

+

Returns a copy of a subsequence of SEQUENCE between START (inclusive) and +@@ -78,7 +66,7 @@ END (exclusive). +

+ +
+-
Function: COPY-SEQ (sequence)
++
Function: COPY-SEQ (sequence)
+

Package:LISP +

+

Returns a copy of SEQUENCE. +@@ -87,7 +75,7 @@ END (exclusive). +

+ +
+-
Function: POSITION (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
++
Function: POSITION (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the index of the first element in SEQUENCE that satisfies TEST with +@@ -97,7 +85,7 @@ ITEM; NIL if no such element exists. +

+ +
+-
Function: ARRAY-RANK (array)
++
Function: ARRAY-RANK (array)
+

Package:LISP +

+

Returns the number of dimensions of ARRAY. +@@ -106,7 +94,7 @@ ITEM; NIL if no such element exists. +

+ +
+-
Function: SBIT (simple-bit-array &rest subscripts)
++
Function: SBIT (simple-bit-array &rest subscripts)
+

Package:LISP +

+

Returns the bit from SIMPLE-BIT-ARRAY at SUBSCRIPTS. +@@ -115,7 +103,7 @@ ITEM; NIL if no such element exists. +

+ +
+-
Function: STRING-CAPITALIZE (string &key (start 0) (end (length string)))
++
Function: STRING-CAPITALIZE (string &key (start 0) (end (length string)))
+

Package:LISP +

+

Returns a copy of STRING with the first character of each word converted to +@@ -125,7 +113,7 @@ upper-case, and remaining characters in +

+ +
+-
Function: NSUBSTITUTE-IF-NOT (new test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: NSUBSTITUTE-IF-NOT (new test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence of the same kind as SEQUENCE with the same elements +@@ -137,7 +125,7 @@ SEQUENCE may be destroyed. +

+ +
+-
Function: FIND-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
++
Function: FIND-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the index of the first element in SEQUENCE that satisfies TEST; NIL if +@@ -147,7 +135,7 @@ no such element exists. +

+ +
+-
Function: BIT-EQV (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-EQV (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical EQV on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -158,7 +146,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: STRING< (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING< (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

If STRING1 is lexicographically less than STRING2, then returns the longest +@@ -168,7 +156,7 @@ common prefix of the strings. Otherwise +

+ +
+-
Function: REVERSE (sequence)
++
Function: REVERSE (sequence)
+

Package:LISP +

+

Returns a new sequence containing the same elements as SEQUENCE but in +@@ -178,7 +166,7 @@ reverse order. +

+ +
+-
Function: NSTRING-UPCASE (string &key (start 0) (end (length string)))
++
Function: NSTRING-UPCASE (string &key (start 0) (end (length string)))
+

Package:LISP +

+

Returns STRING with all lower case characters converted to uppercase. +@@ -187,7 +175,7 @@ reverse order. +

+ +
+-
Function: STRING>= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING>= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

If STRING1 is lexicographically greater than or equal to STRING2, then returns +@@ -197,7 +185,7 @@ the longest common prefix of the strings +

+ +
+-
Function: ARRAY-ROW-MAJOR-INDEX (array &rest subscripts)
++
Function: ARRAY-ROW-MAJOR-INDEX (array &rest subscripts)
+

Package:LISP +

+

Returns the index into the data vector of ARRAY for the element of ARRAY +@@ -208,7 +196,7 @@ specified by SUBSCRIPTS. + + +

+-
Function: ARRAY-DIMENSION (array axis-number)
++
Function: ARRAY-DIMENSION (array axis-number)
+

Package:LISP +

+

Returns the length of AXIS-NUMBER of ARRAY. +@@ -217,7 +205,7 @@ specified by SUBSCRIPTS. +

+ +
+-
Function: FIND (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
++
Function: FIND (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the first element in SEQUENCE satisfying TEST with ITEM; NIL if no +@@ -227,7 +215,7 @@ such element exists. +

+ +
+-
Function: STRING-NOT-EQUAL (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING-NOT-EQUAL (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Similar to STRING=, but ignores cases. +@@ -236,7 +224,7 @@ such element exists. +

+ +
+-
Function: STRING-RIGHT-TRIM (char-bag string)
++
Function: STRING-RIGHT-TRIM (char-bag string)
+

Package:LISP +

+

Returns a copy of STRING with the characters in CHAR-BAG removed from the +@@ -246,7 +234,7 @@ right end. +

+ +
+-
Function: DELETE-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: DELETE-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence formed by destructively removing the elements not +@@ -256,7 +244,7 @@ satisfying TEST from SEQUENCE. +

+ +
+-
Function: REMOVE-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: REMOVE-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a copy of SEQUENCE with elements not satisfying TEST removed. +@@ -265,7 +253,7 @@ satisfying TEST from SEQUENCE. +

+ +
+-
Function: STRING= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Returns T if the two strings are character-wise CHAR=; NIL otherwise. +@@ -274,7 +262,7 @@ satisfying TEST from SEQUENCE. +

+ +
+-
Function: NSUBSTITUTE-IF (new test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: NSUBSTITUTE-IF (new test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence of the same kind as SEQUENCE with the same elements +@@ -285,7 +273,7 @@ may be destroyed. +

+ +
+-
Function: SOME (predicate sequence &rest more-sequences)
++
Function: SOME (predicate sequence &rest more-sequences)
+

Package:LISP +

+

Returns T if at least one of the elements in SEQUENCEs satisfies PREDICATE; +@@ -295,7 +283,7 @@ NIL otherwise. +

+ +
+-
Function: MAKE-STRING (size &key (initial-element #\Space))
++
Function: MAKE-STRING (size &key (initial-element #\Space))
+

Package:LISP +

+

Creates and returns a new string of SIZE length whose elements are all +@@ -305,7 +293,7 @@ INITIAL-ELEMENT. +

+ +
+-
Function: NSUBSTITUTE (newitem olditem sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: NSUBSTITUTE (newitem olditem sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence of the same kind as SEQUENCE with the same elements +@@ -315,7 +303,7 @@ except that OLDITEMs are replaced with N +

+ +
+-
Function: STRING-EQUAL (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING-EQUAL (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Given two strings (string1 and string2), and optional integers start1, +@@ -326,7 +314,7 @@ string2 (using char-equal). +

+ +
+-
Function: STRING-NOT-GREATERP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING-NOT-GREATERP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Similar to STRING<=, but ignores cases. +@@ -335,7 +323,7 @@ string2 (using char-equal). +

+ +
+-
Function: STRING> (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING> (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

If STRING1 is lexicographically greater than STRING2, then returns the +@@ -345,7 +333,7 @@ longest common prefix of the strings. O +

+ +
+-
Function: STRINGP (x)
++
Function: STRINGP (x)
+

Package:LISP +

+

Returns T if X is a string; NIL otherwise. +@@ -354,7 +342,7 @@ longest common prefix of the strings. O +

+ +
+-
Function: DELETE-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: DELETE-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence formed by removing the elements satisfying TEST +@@ -364,7 +352,7 @@ destructively from SEQUENCE. +

+ +
+-
Function: SIMPLE-STRING-P (x)
++
Function: SIMPLE-STRING-P (x)
+

Package:LISP +

+

Returns T if X is a simple string; NIL otherwise. +@@ -373,7 +361,7 @@ destructively from SEQUENCE. +

+ +
+-
Function: REMOVE-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: REMOVE-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a copy of SEQUENCE with elements satisfying TEST removed. +@@ -382,7 +370,7 @@ destructively from SEQUENCE. +

+ +
+-
Function: HASH-TABLE-COUNT (hash-table)
++
Function: HASH-TABLE-COUNT (hash-table)
+

Package:LISP +

+

Returns the number of entries in the given Hash-Table. +@@ -391,7 +379,7 @@ destructively from SEQUENCE. +

+ +
+-
Function: ARRAY-DIMENSIONS (array)
++
Function: ARRAY-DIMENSIONS (array)
+

Package:LISP +

+

Returns a list whose elements are the dimensions of ARRAY +@@ -400,7 +388,7 @@ destructively from SEQUENCE. +

+ +
+-
Function: SUBSTITUTE-IF-NOT (new test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: SUBSTITUTE-IF-NOT (new test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence of the same kind as SEQUENCE with the same elements +@@ -410,7 +398,7 @@ except that all elements not satisfying +

+ +
+-
Function: ADJUSTABLE-ARRAY-P (array)
++
Function: ADJUSTABLE-ARRAY-P (array)
+

Package:LISP +

+

Returns T if ARRAY is adjustable; NIL otherwise. +@@ -419,7 +407,7 @@ except that all elements not satisfying +

+ +
+-
Function: SVREF (simple-vector index)
++
Function: SVREF (simple-vector index)
+

Package:LISP +

+

Returns the INDEX-th element of SIMPLE-VECTOR. +@@ -428,7 +416,7 @@ except that all elements not satisfying +

+ +
+-
Function: VECTOR-PUSH-EXTEND (new-element vector &optional (extension (length vector)))
++
Function: VECTOR-PUSH-EXTEND (new-element vector &optional (extension (length vector)))
+

Package:LISP +

+

Similar to VECTOR-PUSH except that, if the fill pointer gets too large, +@@ -438,7 +426,7 @@ extends VECTOR rather then simply return +

+ +
+-
Function: DELETE (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: DELETE (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence formed by removing the specified ITEM destructively from +@@ -448,7 +436,7 @@ SEQUENCE. +

+ +
+-
Function: REMOVE (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: REMOVE (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a copy of SEQUENCE with ITEM removed. +@@ -457,7 +445,7 @@ SEQUENCE. +

+ +
+-
Function: STRING (x)
++
Function: STRING (x)
+

Package:LISP +

+

Coerces X into a string. If X is a string, then returns X itself. If X is a +@@ -469,7 +457,7 @@ coerced into a string. +

+ +
+-
Function: STRING-UPCASE (string &key (start 0) (end (length string)))
++
Function: STRING-UPCASE (string &key (start 0) (end (length string)))
+

Package:LISP +

+

Returns a copy of STRING with all lower case characters converted to +@@ -479,7 +467,7 @@ uppercase. +

+ +
+-
Function: GETHASH (key hash-table &optional (default nil))
++
Function: GETHASH (key hash-table &optional (default nil))
+

Package:LISP +

+

Finds the entry in HASH-TABLE whose key is KEY and returns the associated +@@ -490,7 +478,7 @@ such entry. +

+ +
+-
Function: MAKE-HASH-TABLE (&key (test 'eql) (size 1024) (rehash-size 1.5) (rehash-threshold 0.7))
++
Function: MAKE-HASH-TABLE (&key (test 'eql) (size 1024) (rehash-size 1.5) (rehash-threshold 0.7))
+

Package:LISP +

+

Creates and returns a hash table. +@@ -499,7 +487,7 @@ such entry. +

+ +
+-
Function: STRING/= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING/= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Returns NIL if STRING1 and STRING2 are character-wise CHAR=. Otherwise, +@@ -509,7 +497,7 @@ returns the index to the longest common +

+ +
+-
Function: STRING-GREATERP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING-GREATERP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Similar to STRING>, but ignores cases. +@@ -518,7 +506,7 @@ returns the index to the longest common +

+ +
+-
Function: ELT (sequence index)
++
Function: ELT (sequence index)
+

Package:LISP +

+

Returns the INDEX-th element of SEQUENCE. +@@ -527,7 +515,7 @@ returns the index to the longest common +

+ +
+-
Function: MAKE-ARRAY (dimensions &key (element-type t) initial-element (initial-contents nil) (adjustable nil) (fill-pointer nil) (displaced-to nil) (displaced-index-offset 0) static)
++
Function: MAKE-ARRAY (dimensions &key (element-type t) initial-element (initial-contents nil) (adjustable nil) (fill-pointer nil) (displaced-to nil) (displaced-index-offset 0) static)
+

Package:LISP +

+

Creates an array of the specified DIMENSIONS. The default for INITIAL- +@@ -564,7 +552,7 @@ nil, will cause the array body to be non +

+ +
+-
Function: NSTRING-DOWNCASE (string &key (start 0) (end (length string)))
++
Function: NSTRING-DOWNCASE (string &key (start 0) (end (length string)))
+

Package:LISP + Returns STRING with all upper case + characters converted to lowercase. +@@ -573,7 +561,7 @@ characters converted to lowercase. +

+ +
+-
Function: ARRAY-IN-BOUNDS-P (array &rest subscripts)
++
Function: ARRAY-IN-BOUNDS-P (array &rest subscripts)
+

Package:LISP + Returns T if SUBSCRIPTS are valid subscripts for + ARRAY; NIL otherwise. +@@ -582,7 +570,7 @@ ARRAY; NIL otherwise. +

+ +
+-
Function: SORT (sequence predicate &key (key #'identity))
++
Function: SORT (sequence predicate &key (key #'identity))
+

Package:LISP + Destructively sorts SEQUENCE. + PREDICATE should return non-NIL if its first argument is to precede +@@ -592,7 +580,7 @@ its second argument. +

+ +
+-
Function: HASH-TABLE-P (x)
++
Function: HASH-TABLE-P (x)
+

Package:LISP +

+

Returns T if X is a hash table object; NIL +@@ -602,7 +590,7 @@ otherwise. +

+ +
+-
Function: COUNT-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
++
Function: COUNT-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the number of elements in SEQUENCE not satisfying TEST. +@@ -611,7 +599,7 @@ otherwise. +

+ +
+-
Function: FILL-POINTER (vector)
++
Function: FILL-POINTER (vector)
+

Package:LISP +

+

Returns the fill pointer of VECTOR. +@@ -621,7 +609,7 @@ otherwise. + + +

+-
Function: ARRAYP (x)
++
Function: ARRAYP (x)
+

Package:LISP +

+

Returns T if X is an array; NIL otherwise. +@@ -630,7 +618,7 @@ otherwise. +

+ +
+-
Function: REPLACE (sequence1 sequence2 &key (start1 0) (end1 (length sequence1)) (start2 0) (end2 (length sequence2)))
++
Function: REPLACE (sequence1 sequence2 &key (start1 0) (end1 (length sequence1)) (start2 0) (end2 (length sequence2)))
+

Package:LISP +

+

Destructively modifies SEQUENCE1 by copying successive elements into it from +@@ -640,7 +628,7 @@ SEQUENCE2. +

+ +
+-
Function: BIT-XOR (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-XOR (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical XOR on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -651,7 +639,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: CLRHASH (hash-table)
++
Function: CLRHASH (hash-table)
+

Package:LISP +

+

Removes all entries of HASH-TABLE and returns the hash table itself. +@@ -660,7 +648,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: SUBSTITUTE-IF (newitem test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: SUBSTITUTE-IF (newitem test sequence &key (from-end nil) (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence of the same kind as SEQUENCE with the same elements +@@ -670,7 +658,7 @@ except that all elements satisfying TEST +

+ +
+-
Function: MISMATCH (sequence1 sequence2 &key (from-end nil) (test #'eql) test-not (start1 0) (start2 0) (end1 (length sequence1)) (end2 (length sequence2)) (key #'identity))
++
Function: MISMATCH (sequence1 sequence2 &key (from-end nil) (test #'eql) test-not (start1 0) (start2 0) (end1 (length sequence1)) (end2 (length sequence2)) (key #'identity))
+

Package:LISP +

+

The specified subsequences of SEQUENCE1 and SEQUENCE2 are compared +@@ -684,7 +672,7 @@ SEQUENCE1 beyond the last position teste +

+ +
+-
Constant: ARRAY-TOTAL-SIZE-LIMIT
++
Constant: ARRAY-TOTAL-SIZE-LIMIT
+

Package:LISP + The exclusive upper bound on the total number of elements of an array. +

+@@ -692,7 +680,7 @@ The exclusive upper bound on the total n +
+ +
+-
Function: VECTOR-POP (vector)
++
Function: VECTOR-POP (vector)
+

Package:LISP +

+

Attempts to decrease the fill-pointer of VECTOR by 1 and returns the element +@@ -703,7 +691,7 @@ the fill pointer is 0. +

+ +
+-
Function: SUBSTITUTE (newitem olditem sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
++
Function: SUBSTITUTE (newitem olditem sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (count most-positive-fixnum) (key #'identity))
+

Package:LISP +

+

Returns a sequence of the same kind as SEQUENCE with the same elements +@@ -713,7 +701,7 @@ except that OLDITEMs are replaced with N +

+ +
+-
Function: ARRAY-HAS-FILL-POINTER-P (array)
++
Function: ARRAY-HAS-FILL-POINTER-P (array)
+

Package:LISP +

+

Returns T if ARRAY has a fill pointer; NIL otherwise. +@@ -722,7 +710,7 @@ except that OLDITEMs are replaced with N +

+ +
+-
Function: CONCATENATE (result-type &rest sequences)
++
Function: CONCATENATE (result-type &rest sequences)
+

Package:LISP +

+

Returns a new sequence of the specified RESULT-TYPE, consisting of all +@@ -732,7 +720,7 @@ elements in SEQUENCEs. +

+ +
+-
Function: VECTOR-PUSH (new-element vector)
++
Function: VECTOR-PUSH (new-element vector)
+

Package:LISP +

+

Attempts to set the element of ARRAY designated by its fill pointer to +@@ -743,7 +731,7 @@ pointer is too large. Otherwise, return +

+ +
+-
Function: STRING-TRIM (char-bag string)
++
Function: STRING-TRIM (char-bag string)
+

Package:LISP +

+

Returns a copy of STRING with the characters in CHAR-BAG removed from both +@@ -753,7 +741,7 @@ ends. +

+ +
+-
Function: ARRAY-ELEMENT-TYPE (array)
++
Function: ARRAY-ELEMENT-TYPE (array)
+

Package:LISP +

+

Returns the type of the elements of ARRAY +@@ -762,7 +750,7 @@ ends. +

+ +
+-
Function: NOTANY (predicate sequence &rest more-sequences)
++
Function: NOTANY (predicate sequence &rest more-sequences)
+

Package:LISP +

+

Returns T if none of the elements in SEQUENCEs satisfies PREDICATE; NIL +@@ -772,7 +760,7 @@ otherwise. +

+ +
+-
Function: BIT-NOT (bit-array &optional (result-bit-array nil))
++
Function: BIT-NOT (bit-array &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical NOT in the elements of BIT-ARRAY. +@@ -783,7 +771,7 @@ BIT-ARRAY if RESULT-BIT-ARRAY is T, or i +

+ +
+-
Function: BIT-ORC1 (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-ORC1 (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical ORC1 on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -794,7 +782,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: COUNT-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
++
Function: COUNT-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the number of elements in SEQUENCE satisfying TEST. +@@ -803,7 +791,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: MAP (result-type function sequence &rest more-sequences)
++
Function: MAP (result-type function sequence &rest more-sequences)
+

Package:LISP +

+

FUNCTION must take as many arguments as there are sequences provided. The +@@ -814,7 +802,7 @@ FUNCTION to the i-th elements of the SEQ +

+ +
+-
Constant: ARRAY-RANK-LIMIT
++
Constant: ARRAY-RANK-LIMIT
+

Package:LISP + The exclusive upper bound on the rank of an array. +

+@@ -822,7 +810,7 @@ The exclusive upper bound on the rank of +
+ +
+-
Function: COUNT (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
++
Function: COUNT (item sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the number of elements in SEQUENCE satisfying TEST with ITEM. +@@ -831,7 +819,7 @@ The exclusive upper bound on the rank of +

+ +
+-
Function: BIT-VECTOR-P (x)
++
Function: BIT-VECTOR-P (x)
+

Package:LISP +

+

Returns T if X is a bit vector; NIL otherwise. +@@ -840,7 +828,7 @@ The exclusive upper bound on the rank of +

+ +
+-
Function: NSTRING-CAPITALIZE (string &key (start 0) (end (length string)))
++
Function: NSTRING-CAPITALIZE (string &key (start 0) (end (length string)))
+

Package:LISP +

+

Returns STRING with the first character of each word converted to upper-case, +@@ -850,7 +838,7 @@ and remaining characters in the word con +

+ +
+-
Function: ADJUST-ARRAY (array dimensions &key (element-type (array-element-type array)) initial-element (initial-contents nil) (fill-pointer nil) (displaced-to nil) (displaced-index-offset 0))
++
Function: ADJUST-ARRAY (array dimensions &key (element-type (array-element-type array)) initial-element (initial-contents nil) (fill-pointer nil) (displaced-to nil) (displaced-index-offset 0))
+

Package:LISP +

+

Adjusts the dimensions of ARRAY to the given DIMENSIONS. The default value +@@ -860,7 +848,7 @@ of INITIAL-ELEMENT depends on ELEMENT-TY +

+ +
+-
Function: SEARCH (sequence1 sequence2 &key (from-end nil) (test #'eql) test-not (start1 0) (start2 0) (end1 (length sequence1)) (end2 (length sequence2)) (key #'identity))
++ +

Package:LISP +

+

A search is conducted for the first subsequence of SEQUENCE2 which +@@ -872,7 +860,7 @@ returned. +

+ +
+-
Function: SIMPLE-BIT-VECTOR-P (x)
++
Function: SIMPLE-BIT-VECTOR-P (x)
+

Package:LISP +

+

Returns T if X is a simple bit-vector; NIL otherwise. +@@ -881,7 +869,7 @@ returned. +

+ +
+-
Function: MAKE-SEQUENCE (type length &key initial-element)
++
Function: MAKE-SEQUENCE (type length &key initial-element)
+

Package:LISP +

+

Returns a sequence of the given TYPE and LENGTH, with elements initialized +@@ -891,7 +879,7 @@ to INITIAL-ELEMENT. The default value o +

+ +
+-
Function: BIT-ORC2 (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-ORC2 (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical ORC2 on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -902,7 +890,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: NREVERSE (sequence)
++
Function: NREVERSE (sequence)
+

Package:LISP +

+

Returns a sequence of the same elements as SEQUENCE but in reverse order. +@@ -912,7 +900,7 @@ SEQUENCE may be destroyed. +

+ +
+-
Constant: ARRAY-DIMENSION-LIMIT
++
Constant: ARRAY-DIMENSION-LIMIT
+

Package:LISP + The exclusive upper bound of the array dimension. +

+@@ -920,7 +908,7 @@ The exclusive upper bound of the array d +
+ +
+-
Function: NOTEVERY (predicate sequence &rest more-sequences)
++
Function: NOTEVERY (predicate sequence &rest more-sequences)
+

Package:LISP +

+

Returns T if at least one of the elements in SEQUENCEs does not satisfy +@@ -930,7 +918,7 @@ PREDICATE; NIL otherwise. +

+ +
+-
Function: POSITION-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
++
Function: POSITION-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the index of the first element in SEQUENCE that does not satisfy TEST; +@@ -940,7 +928,7 @@ NIL if no such element exists. +

+ +
+-
Function: STRING-DOWNCASE (string &key (start 0) (end (length string)))
++
Function: STRING-DOWNCASE (string &key (start 0) (end (length string)))
+

Package:LISP +

+

Returns a copy of STRING with all upper case characters converted to +@@ -950,7 +938,7 @@ lowercase. +

+ +
+-
Function: BIT (bit-array &rest subscripts)
++
Function: BIT (bit-array &rest subscripts)
+

Package:LISP +

+

Returns the bit from BIT-ARRAY at SUBSCRIPTS. +@@ -959,7 +947,7 @@ lowercase. +

+ +
+-
Function: STRING-NOT-LESSP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING-NOT-LESSP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Similar to STRING>=, but ignores cases. +@@ -968,7 +956,7 @@ lowercase. +

+ +
+-
Function: CHAR (string index)
++
Function: CHAR (string index)
+

Package:LISP +

+

Returns the INDEX-th character in STRING. +@@ -977,7 +965,7 @@ lowercase. +

+ +
+-
Function: AREF (array &rest subscripts)
++
Function: AREF (array &rest subscripts)
+

Package:LISP +

+

Returns the element of ARRAY specified by SUBSCRIPTS. +@@ -986,7 +974,7 @@ lowercase. +

+ +
+-
Function: FILL (sequence item &key (start 0) (end (length sequence)))
++
Function: FILL (sequence item &key (start 0) (end (length sequence)))
+

Package:LISP +

+

Replaces the specified elements of SEQUENCE all with ITEM. +@@ -995,7 +983,7 @@ lowercase. +

+ +
+-
Function: STABLE-SORT (sequence predicate &key (key #'identity))
++
Function: STABLE-SORT (sequence predicate &key (key #'identity))
+

Package:LISP +

+

Destructively sorts SEQUENCE. PREDICATE should return non-NIL if its first +@@ -1005,7 +993,7 @@ argument is to precede its second argume +

+ +
+-
Function: BIT-IOR (bit-array1 bit-array2 &optional (result-bit-array nil))
++
Function: BIT-IOR (bit-array1 bit-array2 &optional (result-bit-array nil))
+

Package:LISP +

+

Performs a bit-wise logical IOR on the elements of BIT-ARRAY1 and BIT-ARRAY2. +@@ -1016,7 +1004,7 @@ BIT-ARRAY1 if RESULT-BIT-ARRAY is T, or +

+ +
+-
Function: REMHASH (key hash-table)
++
Function: REMHASH (key hash-table)
+

Package:LISP +

+

Removes any entry for KEY in HASH-TABLE. Returns T if such an entry +@@ -1026,7 +1014,7 @@ existed; NIL otherwise. +

+ +
+-
Function: VECTORP (x)
++
Function: VECTORP (x)
+

Package:LISP +

+

Returns T if X is a vector; NIL otherwise. +@@ -1035,7 +1023,7 @@ existed; NIL otherwise. +

+ +
+-
Function: STRING<= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING<= (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

If STRING1 is lexicographically less than or equal to STRING2, then returns +@@ -1045,7 +1033,7 @@ the longest common prefix of the two str +

+ +
+-
Function: SIMPLE-VECTOR-P (x)
++
Function: SIMPLE-VECTOR-P (x)
+

Package:LISP +

+

Returns T if X is a simple vector; NIL otherwise. +@@ -1054,7 +1042,7 @@ the longest common prefix of the two str +

+ +
+-
Function: STRING-LEFT-TRIM (char-bag string)
++
Function: STRING-LEFT-TRIM (char-bag string)
+

Package:LISP +

+

Returns a copy of STRING with the characters in CHAR-BAG removed from the +@@ -1064,7 +1052,7 @@ left end. +

+ +
+-
Function: ARRAY-TOTAL-SIZE (array)
++
Function: ARRAY-TOTAL-SIZE (array)
+

Package:LISP +

+

Returns the total number of elements of ARRAY. +@@ -1073,7 +1061,7 @@ left end. +

+ +
+-
Function: FIND-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
++
Function: FIND-IF-NOT (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the index of the first element in SEQUENCE that does not satisfy +@@ -1083,7 +1071,7 @@ TEST; NIL if no such element exists. +

+ +
+-
Function: DELETE-DUPLICATES (sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
++
Function: DELETE-DUPLICATES (sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns a sequence formed by removing duplicated elements destructively from +@@ -1093,7 +1081,7 @@ SEQUENCE. +

+ +
+-
Function: REMOVE-DUPLICATES (sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
++
Function: REMOVE-DUPLICATES (sequence &key (from-end nil) (test #'eql) test-not (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

The elements of SEQUENCE are examined, and if any two match, one is discarded. +@@ -1103,7 +1091,7 @@ Returns the resulting sequence. +

+ +
+-
Function: POSITION-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
++
Function: POSITION-IF (test sequence &key (from-end nil) (start 0) (end (length sequence)) (key #'identity))
+

Package:LISP +

+

Returns the index of the first element in SEQUENCE that satisfies TEST; NIL +@@ -1113,7 +1101,7 @@ if no such element exists. +

+ +
+-
Function: MERGE (result-type sequence1 sequence2 predicate &key (key #'identity))
++
Function: MERGE (result-type sequence1 sequence2 predicate &key (key #'identity))
+

Package:LISP +

+

SEQUENCE1 and SEQUENCE2 are destructively merged into a sequence of type +@@ -1123,7 +1111,7 @@ RESULT-TYPE using PREDICATE to order the +

+ +
+-
Function: EVERY (predicate sequence &rest more-sequences)
++
Function: EVERY (predicate sequence &rest more-sequences)
+

Package:LISP +

+

Returns T if every elements of SEQUENCEs satisfy PREDICATE; NIL otherwise. +@@ -1132,7 +1120,7 @@ RESULT-TYPE using PREDICATE to order the +

+ +
+-
Function: REDUCE (function sequence &key (from-end nil) (start 0) (end (length sequence)) initial-value)
++
Function: REDUCE (function sequence &key (from-end nil) (start 0) (end (length sequence)) initial-value)
+

Package:LISP +

+

Combines all the elements of SEQUENCE using a binary operation FUNCTION. +@@ -1142,7 +1130,7 @@ If INITIAL-VALUE is supplied, it is logi +

+ +
+-
Function: STRING-LESSP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
++
Function: STRING-LESSP (string1 string2 &key (start1 0) (end1 (length string1)) (start2 0) (end2 (length string2)))
+

Package:LISP +

+

Similar to STRING<, but ignores cases. +@@ -1153,7 +1141,7 @@ If INITIAL-VALUE is supplied, it is logi +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Source-Level-Debugging-in-Emacs.html ++++ gcl-2.6.12/info/gcl-si/Source-Level-Debugging-in-Emacs.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Source Level Debugging in Emacs ++ ++Source Level Debugging in Emacs (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,15 +38,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Debugging   [Contents][Index]

++Next: , Previous: , Up: Debugging   [Contents][Index]

+
+
+- +-

18.1 Source Level Debugging in Emacs

++

18.1 Source Level Debugging in Emacs

+ +

In emacs load (load "dbl.el") from the gcl/doc directory. + [ It also requires gcl.el from that directory. Your system +@@ -161,7 +149,7 @@ a special meaning: +


+
+

+-Next: , Previous: , Up: Debugging   [Contents][Index]

++Next: , Previous: , Up: Debugging   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Special-Forms-and-Functions.html ++++ gcl-2.6.12/info/gcl-si/Special-Forms-and-Functions.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Special Forms and Functions ++ ++Special Forms and Functions (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

6 Special Forms and Functions

++

6 Special Forms and Functions

+ +
+-
Constant: LAMBDA-LIST-KEYWORDS
++
Constant: LAMBDA-LIST-KEYWORDS
+

Package:LISP + List of all the lambda-list keywords used in GCL. +

+@@ -67,20 +55,7 @@ List of all the lambda-list keywords use +
+ +
+-
Function: GET-SETF-METHOD (form)
+-

Package:LISP +-

+-

Returns the five values (or five ’gangs’) constituting the SETF method for +-FORM. See the doc of DEFINE-SETF-METHOD for the meanings of the gangs. It +-is an error if the third value (i.e., the list of store variables) is not a +-one-element list. See the doc of GET-SETF-METHOD-MULTIPLE-VALUE for +-comparison. +-

+- +-
+- +-
+-
Special Form: THE
++
Special Form: THE
+

Package:LISP +

+

Syntax: +@@ -95,7 +70,7 @@ this is not the case. +

+ +
+-
Special Form: SETF
++
Special Form: SETF
+

Package:LISP +

+

Syntax: +@@ -129,7 +104,7 @@ apply +

+ +
+-
Special Form: WHEN
++
Special Form: WHEN
+

Package:LISP +

+

Syntax: +@@ -144,7 +119,7 @@ simply returns NIL. +

+ +
+-
Macro: CCASE
++
Macro: CCASE
+

Package:LISP +

+

Syntax: +@@ -160,7 +135,7 @@ returns the value(s) of the last FORM. +

+ +
+-
Function: MACROEXPAND (form &optional (env nil))
++
Function: MACROEXPAND (form &optional (env nil))
+

Package:LISP +

+

If FORM is a macro form, then expands it repeatedly until it is not a macro +@@ -171,7 +146,7 @@ indicating whether the original form was +

+ +
+-
Special Form: MULTIPLE-VALUE-CALL
++
Special Form: MULTIPLE-VALUE-CALL
+

Package:LISP +

+

Syntax: +@@ -185,7 +160,7 @@ indicating whether the original form was +

+ +
+-
Macro: DEFSETF
++
Macro: DEFSETF
+

Package:LISP +

+

Syntax: +@@ -217,7 +192,7 @@ symbols TEMP1 ... TEMPn and with STORE-V +

+ +
+-
Special Form: TAGBODY
++
Special Form: TAGBODY
+

Package:LISP +

+

Syntax: +@@ -232,7 +207,7 @@ symbols TEMP1 ... TEMPn and with STORE-V + + +

+-
Macro: ETYPECASE
++
Macro: ETYPECASE
+

Package:LISP +

+

Syntax: +@@ -248,7 +223,7 @@ returns the value(s) of the last FORM. +

+ +
+-
Special Form: LET*
++
Special Form: LET*
+

Package:LISP +

+

Syntax: +@@ -263,7 +238,7 @@ from left to right, then evaluates FORMs +

+ +
+-
Special Form: PROG1
++
Special Form: PROG1
+

Package:LISP +

+

Syntax: +@@ -277,7 +252,7 @@ from left to right, then evaluates FORMs +

+ +
+-
Special Form: DEFUN
++
Special Form: DEFUN
+

Package:LISP +

+

Syntax: +@@ -300,7 +275,7 @@ retrieved by (documentation ’NAME +

+ +
+-
Special Form: MULTIPLE-VALUE-BIND
++
Special Form: MULTIPLE-VALUE-BIND
+

Package:LISP +

+

Syntax: +@@ -315,7 +290,7 @@ NIL) and evaluates FORMs in order. +

+ +
+-
Special Form: DECLARE
++
Special Form: DECLARE
+

Package:LISP +

+

Syntax: +@@ -371,7 +346,7 @@ For example +

+ +
+-
Special Form: DEFMACRO
++
Special Form: DEFMACRO
+

Package:LISP +

+

Syntax: +@@ -414,7 +389,7 @@ Also, see the function doc of PPRINT for +

+ +
+-
Variable: *EVALHOOK*
++
Variable: *EVALHOOK*
+

Package:LISP + If *EVALHOOK* is not NIL, its value must be a function that can receive + two arguments: a form to evaluate and an environment. This function does +@@ -424,7 +399,7 @@ the evaluation instead of EVAL. +

+ +
+-
Function: FUNCTIONP (x)
++
Function: FUNCTIONP (x)
+

Package:LISP +

+

Returns T if X is a function, suitable for use by FUNCALL or APPLY. Returns +@@ -434,7 +409,7 @@ NIL otherwise. +

+ +
+-
Constant: LAMBDA-PARAMETERS-LIMIT
++
Constant: LAMBDA-PARAMETERS-LIMIT
+

Package:LISP + The exclusive upper bound on the number of distinct parameter names that may + appear in a single lambda-list. Actually, however, there is no such upper +@@ -444,7 +419,7 @@ bound in GCL. +

+ +
+-
Special Form: FLET
++
Special Form: FLET
+

Package:LISP +

+

Syntax: +@@ -463,7 +438,7 @@ ignored. +

+ +
+-
Macro: ECASE
++
Macro: ECASE
+

Package:LISP +

+

Syntax: +@@ -479,7 +454,7 @@ returns the value(s) of the last FORM. +

+ +
+-
Special Form: PROG2
++
Special Form: PROG2
+

Package:LISP +

+

Syntax: +@@ -494,7 +469,7 @@ of SECOND. +

+ +
+-
Special Form: PROGV
++
Special Form: PROGV
+

Package:LISP +

+

Syntax: +@@ -510,7 +485,7 @@ special) to the corresponding value. +

+ +
+-
Special Form: QUOTE
++
Special Form: QUOTE
+

Package:LISP +

+

Syntax: +@@ -524,7 +499,7 @@ Simply returns X without evaluating it. +

+ +
+-
Special Form: DOTIMES
++
Special Form: DOTIMES
+

Package:LISP +

+

Syntax: +@@ -540,7 +515,7 @@ the value of COUNTFORM (exclusive). The +

+ +
+-
Function: SPECIAL-FORM-P (symbol)
++
Function: SPECIAL-FORM-P (symbol)
+

Package:LISP +

+

Returns T if SYMBOL globally names a special form; NIL otherwise. +@@ -577,7 +552,7 @@ dotimes prog* +

+ +
+-
Special Form: FUNCTION
++
Special Form: FUNCTION
+

Package:LISP +

+

Syntax: +@@ -593,7 +568,7 @@ returns that function. +

+ +
+-
Constant: MULTIPLE-VALUES-LIMIT
++
Constant: MULTIPLE-VALUES-LIMIT
+

Package:LISP + The exclusive upper bound on the number of values that may be returned from + a function. Actually, however, there is no such upper bound in GCL. +@@ -602,7 +577,7 @@ a function. Actually, however, there is +

+ +
+-
Function: APPLYHOOK (function args evalhookfn applyhookfn &optional (env nil))
++
Function: APPLYHOOK (function args evalhookfn applyhookfn &optional (env nil))
+

Package:LISP +

+

Applies FUNCTION to ARGS, with *EVALHOOK* bound to EVALHOOKFN and with +@@ -613,7 +588,7 @@ top-level application of FUNCTION to ARG +

+ +
+-
Variable: *MACROEXPAND-HOOK*
++
Variable: *MACROEXPAND-HOOK*
+

Package:LISP + Holds a function that can take two arguments (a macro expansion function + and the macro form to be expanded) and returns the expanded form. This +@@ -624,7 +599,7 @@ function is whenever a macro-expansion t +

+ +
+-
Special Form: PROG*
++
Special Form: PROG*
+

Package:LISP +

+

Syntax: +@@ -638,7 +613,7 @@ function is whenever a macro-expansion t +

+ +
+-
Special Form: BLOCK
++
Special Form: BLOCK
+

Package:LISP +

+

Syntax: +@@ -654,7 +629,7 @@ within the block. +

+ +
+-
Special Form: PROGN
++
Special Form: PROGN
+

Package:LISP +

+

Syntax: +@@ -668,7 +643,7 @@ within the block. +

+ +
+-
Function: APPLY (function arg &rest more-args)
++
Function: APPLY (function arg &rest more-args)
+

Package:LISP +

+

Applies FUNCTION. The arguments to the function consist of all ARGs +@@ -678,7 +653,7 @@ except for the last, and all elements of +

+ +
+-
Special Form: LABELS
++
Special Form: LABELS
+

Package:LISP +

+

Syntax: +@@ -696,7 +671,7 @@ functions are simply ignored. +

+ +
+-
Special Form: RETURN
++
Special Form: RETURN
+

Package:LISP +

+

Syntax: +@@ -711,7 +686,7 @@ which defaults to NIL, is returned as th +

+ +
+-
Macro: TYPECASE
++
Macro: TYPECASE
+

Package:LISP +

+

Syntax: +@@ -727,7 +702,7 @@ returns the value of the last FORM. If +

+ +
+-
Special Form: AND
++
Special Form: AND
+

Package:LISP +

+

Syntax: +@@ -743,7 +718,7 @@ last FORM. +

+ +
+-
Special Form: LET
++
Special Form: LET
+

Package:LISP +

+

Syntax: +@@ -758,7 +733,7 @@ all at once, then evaluates FORMs as a P +

+ +
+-
Special Form: COND
++
Special Form: COND
+

Package:LISP +

+

Syntax: +@@ -775,7 +750,7 @@ TEST. Returns NIL, if all TESTs evaluat +

+ +
+-
Function: GET-SETF-METHOD-MULTIPLE-VALUE (form)
++
Function: GET-SETF-METHOD-MULTIPLE-VALUE (form)
+

Package:LISP + Returns the five values (or five ’gangs’) + constituting the SETF method for FORM. See the doc of +@@ -788,7 +763,7 @@ comparison. +

+ +
+-
Special Form: CATCH
++
Special Form: CATCH
+

Package:LISP +

+

Syntax: +@@ -805,7 +780,7 @@ the catcher tag. +

+ +
+-
Macro: DEFINE-MODIFY-MACRO
++
Macro: DEFINE-MODIFY-MACRO
+

Package:LISP +

+

Syntax: +@@ -824,7 +799,7 @@ retrieved by (documentation ’NAME +

+ +
+-
Function: MACROEXPAND-1 (form &optional (env nil))
++
Function: MACROEXPAND-1 (form &optional (env nil))
+

Package:LISP +

+

If FORM is a macro form, then expands it once. Returns two values: the +@@ -835,7 +810,7 @@ a macro. +

+ +
+-
Function: FUNCALL (function &rest arguments)
++
Function: FUNCALL (function &rest arguments)
+

Package:LISP +

+

Applies FUNCTION to the ARGUMENTs +@@ -844,7 +819,7 @@ a macro. +

+ +
+-
Constant: CALL-ARGUMENTS-LIMIT
++
Constant: CALL-ARGUMENTS-LIMIT
+

Package:LISP + The upper exclusive bound on the number of arguments that may be passed to + a function. Actually, however, there is no such upper bound in GCL. +@@ -853,7 +828,7 @@ a function. Actually, however, there is +

+ +
+-
Special Form: CASE
++
Special Form: CASE
+

Package:LISP +

+

Syntax: +@@ -869,7 +844,7 @@ returns the value(s) of the last FORM. +

+ +
+-
Macro: DEFINE-SETF-METHOD
++
Macro: DEFINE-SETF-METHOD
+

Package:LISP +

+

Syntax: +@@ -900,7 +875,7 @@ by (documentation ’NAME ’set +

+ +
+-
Special Form: COMPILER-LET
++
Special Form: COMPILER-LET
+

Package:LISP +

+

Syntax: +@@ -916,7 +891,7 @@ time, but no bindings occur when the com +

+ +
+-
Function: VALUES (&rest args)
++
Function: VALUES (&rest args)
+

Package:LISP +

+

Returns ARGs in order, as values. +@@ -925,7 +900,7 @@ time, but no bindings occur when the com +

+ +
+-
Special Form: MULTIPLE-VALUE-LIST
++
Special Form: MULTIPLE-VALUE-LIST
+

Package:LISP +

+

Syntax: +@@ -939,7 +914,7 @@ time, but no bindings occur when the com +

+ +
+-
Special Form: MULTIPLE-VALUE-PROG1
++
Special Form: MULTIPLE-VALUE-PROG1
+

Package:LISP +

+

Syntax: +@@ -954,7 +929,7 @@ the other FORMs. Returns the saved valu +

+ +
+-
Special Form: MACROLET
++
Special Form: MACROLET
+

Package:LISP +

+

Syntax: +@@ -971,7 +946,7 @@ Doc-strings for local macros are simply +

+ +
+-
Special Form: GO
++
Special Form: GO
+

Package:LISP +

+

Syntax: +@@ -985,7 +960,7 @@ Doc-strings for local macros are simply +

+ +
+-
Special Form: PROG
++
Special Form: PROG
+

Package:LISP +

+

Syntax: +@@ -999,7 +974,7 @@ Doc-strings for local macros are simply +

+ +
+-
Variable: *APPLYHOOK*
++
Variable: *APPLYHOOK*
+

Package:LISP + Used to substitute another function for the implicit APPLY normally done + within EVAL. If *APPLYHOOK* is not NIL, its value must be a function +@@ -1010,7 +985,7 @@ and an environment. This function does +

+ +
+-
Special Form: RETURN-FROM
++
Special Form: RETURN-FROM
+

Package:LISP +

+

Syntax: +@@ -1025,7 +1000,7 @@ of RESULT, which defaults to NIL, is ret +

+ +
+-
Special Form: UNLESS
++
Special Form: UNLESS
+

Package:LISP +

+

Syntax: +@@ -1040,7 +1015,7 @@ simply returns NIL. +

+ +
+-
Special Form: MULTIPLE-VALUE-SETQ
++
Special Form: MULTIPLE-VALUE-SETQ
+

Package:LISP +

+

Syntax: +@@ -1055,7 +1030,7 @@ Returns the value assigned to the first +

+ +
+-
Special Form: LOCALLY
++
Special Form: LOCALLY
+

Package:LISP +

+

Syntax: +@@ -1069,7 +1044,7 @@ Returns the value assigned to the first +

+ +
+-
Function: IDENTITY (x)
++
Function: IDENTITY (x)
+

Package:LISP +

+

Simply returns X. +@@ -1078,7 +1053,7 @@ Returns the value assigned to the first +

+ +
+-
Function: NOT (x)
++
Function: NOT (x)
+

Package:LISP +

+

Returns T if X is NIL; NIL otherwise. +@@ -1087,7 +1062,7 @@ Returns the value assigned to the first +

+ +
+-
Macro: DEFCONSTANT
++
Macro: DEFCONSTANT
+

Package:LISP +

+

Syntax: +@@ -1103,7 +1078,7 @@ and can be retrieved by (documentation & +

+ +
+-
Function: VALUES-LIST (list)
++
Function: VALUES-LIST (list)
+

Package:LISP +

+

Returns all of the elements of LIST in order, as values. +@@ -1112,7 +1087,7 @@ and can be retrieved by (documentation & +

+ +
+-
Function: ERROR (control-string &rest args)
++
Function: ERROR (control-string &rest args)
+

Package:LISP +

+

Signals a fatal error. +@@ -1121,7 +1096,7 @@ and can be retrieved by (documentation & +

+ +
+-
Special Form: IF
++
Special Form: IF
+

Package:LISP +

+

Syntax: +@@ -1136,7 +1111,7 @@ If not, evaluates ELSE (which defaults t +

+ +
+-
Special Form: UNWIND-PROTECT
++
Special Form: UNWIND-PROTECT
+

Package:LISP +

+

Syntax: +@@ -1152,7 +1127,7 @@ form. +

+ +
+-
Function: EVALHOOK (form evalhookfn applyhookfn &optional (env nil))
++
Function: EVALHOOK (form evalhookfn applyhookfn &optional (env nil))
+

Package:LISP +

+

Evaluates FORM with *EVALHOOK* bound to EVALHOOKFN and *APPLYHOOK* bound +@@ -1163,7 +1138,7 @@ of FORM. +

+ +
+-
Special Form: OR
++
Special Form: OR
+

Package:LISP +

+

Syntax: +@@ -1179,7 +1154,7 @@ returns whatever values it returns. +

+ +
+-
Macro: CTYPECASE
++
Macro: CTYPECASE
+

Package:LISP +

+

Syntax: +@@ -1195,7 +1170,7 @@ returns the value(s) of the last FORM. +

+ +
+-
Function: EVAL (exp)
++
Function: EVAL (exp)
+

Package:LISP +

+

Evaluates EXP and returns the result(s). +@@ -1204,7 +1179,7 @@ returns the value(s) of the last FORM. +

+ +
+-
Macro: PSETF
++
Macro: PSETF
+

Package:LISP +

+

Syntax: +@@ -1220,7 +1195,7 @@ NIL always. +

+ +
+-
Special Form: THROW
++
Special Form: THROW
+

Package:LISP +

+

Syntax: +@@ -1236,7 +1211,7 @@ returned. +

+ +
+-
Macro: DEFPARAMETER
++
Macro: DEFPARAMETER
+

Package:LISP +

+

Syntax: +@@ -1252,7 +1227,7 @@ retrieved by (documentation ’NAME +

+ +
+-
Macro: DEFVAR
++
Macro: DEFVAR
+

Package:LISP +

+

Syntax: +@@ -1270,7 +1245,7 @@ retrieved by (documentation ’NAME +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Streams-and-Reading.html ++++ gcl-2.6.12/info/gcl-si/Streams-and-Reading.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Streams and Reading ++ ++Streams and Reading (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

5 Streams and Reading

++

5 Streams and Reading

+ +
+-
Function: MAKE-ECHO-STREAM (input-stream output-stream)
++
Function: MAKE-ECHO-STREAM (input-stream output-stream)
+

Package:LISP +

+

Returns a bidirectional stream which gets its input from INPUT-STREAM and +@@ -70,7 +58,7 @@ OUTPUT-STREAM. +

+ +
+-
Variable: *READTABLE*
++
Variable: *READTABLE*
+

Package:LISP + The current readtable. +

+@@ -78,7 +66,7 @@ The current readtable. +
+ +
+-
Function: LOAD (filename &key (verbose *load-verbose*) (print nil) (if-does-not-exist :error))
++
Function: LOAD (filename &key (verbose *load-verbose*) (print nil) (if-does-not-exist :error))
+

Package:LISP +

+

Loads the file named by FILENAME into GCL. +@@ -87,7 +75,7 @@ The current readtable. +

+ +
+-
Function: OPEN (filename &key (direction :input) (element-type 'string-char) (if-exists :error) (if-does-not-exist :error))
++
Function: OPEN (filename &key (direction :input) (element-type 'string-char) (if-exists :error) (if-does-not-exist :error))
+

Package:LISP +

+

Opens the file specified by FILENAME, which may be a string, a pathname, +@@ -114,7 +102,7 @@ the posix description of popen for more +

+ +
+-
Variable: *PRINT-BASE*
++
Variable: *PRINT-BASE*
+

Package:LISP + The radix in which the GCL printer prints integers and rationals. + The value must be an integer from 2 to 36, inclusive. +@@ -123,7 +111,7 @@ The value must be an integer from 2 to 3 +

+ +
+-
Function: MAKE-STRING-INPUT-STREAM (string &optional (start 0) (end (length string)))
++
Function: MAKE-STRING-INPUT-STREAM (string &optional (start 0) (end (length string)))
+

Package:LISP +

+

Returns an input stream which will supply the characters of String between +@@ -133,7 +121,7 @@ Start and End in order. +

+ +
+-
Function: PPRINT (object &optional (stream *standard-output*))
++
Function: PPRINT (object &optional (stream *standard-output*))
+

Package:LISP +

+

Pretty-prints OBJECT. Returns OBJECT. Equivalent to +@@ -149,7 +137,7 @@ to the symbol DO. +

+ +
+-
Variable: *READ-DEFAULT-FLOAT-FORMAT*
++
Variable: *READ-DEFAULT-FLOAT-FORMAT*
+

Package:LISP + The floating-point format the GCL reader uses when reading floating-point + numbers that have no exponent marker or have e or E for an exponent marker. +@@ -159,7 +147,7 @@ Must be one of SHORT-FLOAT, SINGLE-FLOAT +

+ +
+-
Function: READ-PRESERVING-WHITESPACE (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
++
Function: READ-PRESERVING-WHITESPACE (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
+

Package:LISP +

+

Reads an object from STREAM, preserving the whitespace that followed the +@@ -169,7 +157,7 @@ object. +

+ +
+-
Function: STREAMP (x)
++
Function: STREAMP (x)
+

Package:LISP +

+

Returns T if X is a stream object; NIL otherwise. +@@ -179,7 +167,7 @@ object. + + +

+-
Function: SET-DISPATCH-MACRO-CHARACTER (disp-char sub-char function &optional (readtable *readtable*))
++
Function: SET-DISPATCH-MACRO-CHARACTER (disp-char sub-char function &optional (readtable *readtable*))
+

Package:LISP +

+

Causes FUNCTION to be called when the DISP-CHAR followed by SUB-CHAR is +@@ -189,7 +177,7 @@ read. +

+ +
+-
Macro: WITH-OUTPUT-TO-STRING
++
Macro: WITH-OUTPUT-TO-STRING
+

Package:LISP +

+

Syntax: +@@ -205,7 +193,7 @@ the string is returned. +

+ +
+-
Function: FILE-LENGTH (file-stream)
++
Function: FILE-LENGTH (file-stream)
+

Package:LISP +

+

Returns the length of the specified file stream. +@@ -214,7 +202,7 @@ the string is returned. +

+ +
+-
Variable: *PRINT-CASE*
++
Variable: *PRINT-CASE*
+

Package:LISP + The case in which the GCL printer should print ordinary symbols. + The value must be one of the keywords :UPCASE, :DOWNCASE, and :CAPITALIZE. +@@ -223,7 +211,7 @@ The value must be one of the keywords :U +

+ +
+-
Function: PRINT (object &optional (stream *standard-output*))
++
Function: PRINT (object &optional (stream *standard-output*))
+

Package:LISP +

+

Outputs a newline character, and then prints OBJECT in the mostly readable +@@ -234,7 +222,7 @@ representation. Returns OBJECT. Equiva +

+ +
+-
Function: SET-MACRO-CHARACTER (char function &optional (non-terminating-p nil) (readtable *readtable*))
++
Function: SET-MACRO-CHARACTER (char function &optional (non-terminating-p nil) (readtable *readtable*))
+

Package:LISP +

+

Causes CHAR to be a macro character that, when seen by READ, causes FUNCTION +@@ -244,7 +232,7 @@ to be called. +

+ +
+-
Function: FORCE-OUTPUT (&optional (stream *standard-output*))
++
Function: FORCE-OUTPUT (&optional (stream *standard-output*))
+

Package:LISP +

+

Attempts to force any buffered output to be sent. +@@ -253,7 +241,7 @@ to be called. +

+ +
+-
Variable: *PRINT-ARRAY*
++
Variable: *PRINT-ARRAY*
+

Package:LISP + Whether the GCL printer should print array elements. +

+@@ -261,7 +249,7 @@ Whether the GCL printer should print arr +
+ +
+-
Function: STREAM-ELEMENT-TYPE (stream)
++
Function: STREAM-ELEMENT-TYPE (stream)
+

Package:LISP +

+

Returns a type specifier for the kind of object returned by STREAM. +@@ -270,7 +258,7 @@ Whether the GCL printer should print arr +

+ +
+-
Function: WRITE-BYTE (integer stream)
++
Function: WRITE-BYTE (integer stream)
+

Package:LISP +

+

Outputs INTEGER to the binary stream STREAM. Returns INTEGER. +@@ -279,7 +267,7 @@ Whether the GCL printer should print arr +

+ +
+-
Function: MAKE-CONCATENATED-STREAM (&rest streams)
++
Function: MAKE-CONCATENATED-STREAM (&rest streams)
+

Package:LISP +

+

Returns a stream which takes its input from each of the STREAMs in turn, +@@ -289,7 +277,7 @@ going on to the next at end of stream. +

+ +
+-
Function: PRIN1 (object &optional (stream *standard-output*))
++
Function: PRIN1 (object &optional (stream *standard-output*))
+

Package:LISP +

+

Prints OBJECT in the mostly readable representation. Returns OBJECT. +@@ -299,7 +287,7 @@ Equivalent to (WRITE OBJECT :STREAM STRE +

+ +
+-
Function: PRINC (object &optional (stream *standard-output*))
++
Function: PRINC (object &optional (stream *standard-output*))
+

Package:LISP +

+

Prints OBJECT without escape characters. Returns OBJECT. Equivalent to +@@ -309,7 +297,7 @@ Equivalent to (WRITE OBJECT :STREAM STRE +

+ +
+-
Function: CLEAR-OUTPUT (&optional (stream *standard-output*))
++
Function: CLEAR-OUTPUT (&optional (stream *standard-output*))
+

Package:LISP +

+

Clears the output stream STREAM. +@@ -318,7 +306,7 @@ Equivalent to (WRITE OBJECT :STREAM STRE +

+ +
+-
Function: TERPRI (&optional (stream *standard-output*))
++
Function: TERPRI (&optional (stream *standard-output*))
+

Package:LISP +

+

Outputs a newline character. +@@ -327,7 +315,7 @@ Equivalent to (WRITE OBJECT :STREAM STRE +

+ +
+-
Function: FINISH-OUTPUT (&optional (stream *standard-output*))
++
Function: FINISH-OUTPUT (&optional (stream *standard-output*))
+

Package:LISP +

+

Attempts to ensure that all output sent to STREAM has reached its destination, +@@ -337,7 +325,7 @@ and only then returns. +

+ +
+-
Macro: WITH-OPEN-FILE
++
Macro: WITH-OPEN-FILE
+

Package:LISP +

+

Syntax: +@@ -353,7 +341,7 @@ The file is automatically closed on exit +

+ +
+-
Special Form: DO
++
Special Form: DO
+

Package:LISP +

+

Syntax: +@@ -373,7 +361,7 @@ bindings and assignments all at once, ju +

+ +
+-
Function: READ-FROM-STRING (string &optional (eof-error-p t) (eof-value nil) &key (start 0) (end (length string)) (preserve-whitespace nil))
++
Function: READ-FROM-STRING (string &optional (eof-error-p t) (eof-value nil) &key (start 0) (end (length string)) (preserve-whitespace nil))
+

Package:LISP +

+

Reads an object from STRING. +@@ -382,7 +370,7 @@ bindings and assignments all at once, ju +

+ +
+-
Function: WRITE-STRING (string &optional (stream *standard-output*) &key (start 0) (end (length string)))
++
Function: WRITE-STRING (string &optional (stream *standard-output*) &key (start 0) (end (length string)))
+

Package:LISP +

+

Outputs STRING and returns it. +@@ -391,7 +379,7 @@ bindings and assignments all at once, ju +

+ +
+-
Variable: *PRINT-LEVEL*
++
Variable: *PRINT-LEVEL*
+

Package:LISP + How many levels deep the GCL printer should print. Unlimited if NIL. +

+@@ -399,7 +387,7 @@ How many levels deep the GCL printer sho +
+ +
+-
Variable: *PRINT-RADIX*
++
Variable: *PRINT-RADIX*
+

Package:LISP + Whether the GCL printer should print the radix indicator when printing + integers and rationals. +@@ -408,7 +396,7 @@ integers and rationals. +

+ +
+-
Function: Y-OR-N-P (&optional (format-string nil) &rest args)
++
Function: Y-OR-N-P (&optional (format-string nil) &rest args)
+

Package:LISP +

+

Asks the user a question whose answer is either ’Y’ or ’N’. If FORMAT-STRING +@@ -420,7 +408,7 @@ if FORMAT-STRING and ARGs were given to +

+ +
+-
Function: MAKE-BROADCAST-STREAM (&rest streams)
++
Function: MAKE-BROADCAST-STREAM (&rest streams)
+

Package:LISP +

+

Returns an output stream which sends its output to all of the given streams. +@@ -429,7 +417,7 @@ if FORMAT-STRING and ARGs were given to +

+ +
+-
Function: READ-CHAR (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
++
Function: READ-CHAR (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
+

Package:LISP +

+

Reads a character from STREAM. +@@ -438,7 +426,7 @@ if FORMAT-STRING and ARGs were given to +

+ +
+-
Function: PEEK-CHAR (&optional (peek-type nil) (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
++
Function: PEEK-CHAR (&optional (peek-type nil) (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
+

Package:LISP +

+

Peeks at the next character in the input stream STREAM. +@@ -447,7 +435,7 @@ if FORMAT-STRING and ARGs were given to +

+ +
+-
Function: OUTPUT-STREAM-P (stream)
++
Function: OUTPUT-STREAM-P (stream)
+

Package:LISP +

+

Returns non-nil if STREAM can handle output operations; NIL otherwise. +@@ -456,7 +444,7 @@ if FORMAT-STRING and ARGs were given to +

+ +
+-
Variable: *QUERY-IO*
++
Variable: *QUERY-IO*
+

Package:LISP + The query I/O stream. +

+@@ -464,7 +452,7 @@ The query I/O stream. +
+ +
+-
Variable: *READ-BASE*
++
Variable: *READ-BASE*
+

Package:LISP + The radix that the GCL reader reads numbers in. +

+@@ -472,7 +460,7 @@ The radix that the GCL reader reads numb +
+ +
+-
Macro: WITH-OPEN-STREAM
++
Macro: WITH-OPEN-STREAM
+

Package:LISP +

+

Syntax: +@@ -487,7 +475,7 @@ is automatically closed on exit. +

+ +
+-
Macro: WITH-INPUT-FROM-STRING
++
Macro: WITH-INPUT-FROM-STRING
+

Package:LISP +

+

Syntax: +@@ -504,7 +492,7 @@ the FORMs. The stream is automatically +

+ +
+-
Function: CLEAR-INPUT (&optional (stream *standard-input*))
++
Function: CLEAR-INPUT (&optional (stream *standard-input*))
+

Package:LISP + Clears the input + stream STREAM. +@@ -513,7 +501,7 @@ stream STREAM. +

+ +
+-
Variable: *TERMINAL-IO*
++
Variable: *TERMINAL-IO*
+

Package:LISP + The terminal I/O stream. +

+@@ -521,7 +509,7 @@ The terminal I/O stream. +
+ +
+-
Function: LISTEN (&optional (stream *standard-input*))
++
Function: LISTEN (&optional (stream *standard-input*))
+

Package:LISP +

+

Returns T if a character is available on STREAM; NIL otherwise. This function +@@ -532,7 +520,7 @@ mechanism in the underlying operating sy +

+ +
+-
Function: MAKE-PATHNAME (&key (defaults (parse-namestring "" (pathname-host *default-pathname-defaults*))) (host (pathname-host defaults)) (device (pathname-device defaults)) (directory (pathname-directory defaults)) (name (pathname-name defaults)) (type (pathname-type defaults)) (version (pathname-version defaults)))
++
Function: MAKE-PATHNAME (&key (defaults (parse-namestring "" (pathname-host *default-pathname-defaults*))) (host (pathname-host defaults)) (device (pathname-device defaults)) (directory (pathname-directory defaults)) (name (pathname-name defaults)) (type (pathname-type defaults)) (version (pathname-version defaults)))
+

Package:LISP +

+

Create a pathname from HOST, DEVICE, DIRECTORY, NAME, TYPE and VERSION. +@@ -541,7 +529,7 @@ mechanism in the underlying operating sy +

+ +
+-
Function: PATHNAME-TYPE (pathname)
++
Function: PATHNAME-TYPE (pathname)
+

Package:LISP +

+

Returns the type slot of PATHNAME. +@@ -550,7 +538,7 @@ mechanism in the underlying operating sy +

+ +
+-
Variable: *PRINT-GENSYM*
++
Variable: *PRINT-GENSYM*
+

Package:LISP + Whether the GCL printer should prefix symbols with no home package + with "#:". +@@ -559,7 +547,7 @@ with "#:". +

+ +
+-
Function: READ-LINE (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
++
Function: READ-LINE (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
+

Package:LISP +

+

Returns a line of text read from STREAM as a string, discarding the newline +@@ -611,7 +599,7 @@ Input file name: /tmp/myfile +

+ +
+-
Function: WRITE-TO-STRING (object &key (escape *print-escape*) (radix *print-radix*) (base *print-base*) (circle *print-circle*) (pretty *print-pretty*) (level *print-level*) (length *print-length*) (case *print-case*) (array *print-array*) (gensym *print-gensym*))
++
Function: WRITE-TO-STRING (object &key (escape *print-escape*) (radix *print-radix*) (base *print-base*) (circle *print-circle*) (pretty *print-pretty*) (level *print-level*) (length *print-length*) (case *print-case*) (array *print-array*) (gensym *print-gensym*))
+

Package:LISP +

+

Returns as a string the printed representation of OBJECT in the specified +@@ -621,7 +609,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Function: PATHNAMEP (x)
++
Function: PATHNAMEP (x)
+

Package:LISP +

+

Returns T if X is a pathname object; NIL otherwise. +@@ -630,7 +618,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Function: READTABLEP (x)
++
Function: READTABLEP (x)
+

Package:LISP +

+

Returns T if X is a readtable object; NIL otherwise. +@@ -639,7 +627,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Function: READ (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursivep nil))
++
Function: READ (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursivep nil))
+

Package:LISP +

+

Reads in the next object from STREAM. +@@ -648,7 +636,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Function: NAMESTRING (pathname)
++
Function: NAMESTRING (pathname)
+

Package:LISP +

+

Returns the full form of PATHNAME as a string. +@@ -657,7 +645,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Function: UNREAD-CHAR (character &optional (stream *standard-input*))
++
Function: UNREAD-CHAR (character &optional (stream *standard-input*))
+

Package:LISP +

+

Puts CHARACTER back on the front of the input stream STREAM. +@@ -666,7 +654,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Function: CLOSE (stream &key (abort nil))
++
Function: CLOSE (stream &key (abort nil))
+

Package:LISP +

+

Closes STREAM. A non-NIL value of :ABORT indicates an abnormal termination. +@@ -675,7 +663,7 @@ mode. See the variable docs of *PRINT-. +

+ +
+-
Variable: *PRINT-LENGTH*
++
Variable: *PRINT-LENGTH*
+

Package:LISP + How many elements the GCL printer should print at each level of nested data + object. Unlimited if NIL. +@@ -684,7 +672,7 @@ object. Unlimited if NIL. +

+ +
+-
Function: SET-SYNTAX-FROM-CHAR (to-char from-char &optional (to-readtable *readtable*) (from-readtable nil))
++
Function: SET-SYNTAX-FROM-CHAR (to-char from-char &optional (to-readtable *readtable*) (from-readtable nil))
+

Package:LISP +

+

Makes the syntax of TO-CHAR in TO-READTABLE be the same as the syntax of +@@ -694,7 +682,7 @@ FROM-CHAR in FROM-READTABLE. +

+ +
+-
Function: INPUT-STREAM-P (stream)
++
Function: INPUT-STREAM-P (stream)
+

Package:LISP +

+

Returns non-NIL if STREAM can handle input operations; NIL otherwise. +@@ -703,7 +691,7 @@ FROM-CHAR in FROM-READTABLE. +

+ +
+-
Function: PATHNAME (x)
++
Function: PATHNAME (x)
+

Package:LISP +

+

Turns X into a pathname. X may be a string, symbol, stream, or pathname. +@@ -712,7 +700,7 @@ FROM-CHAR in FROM-READTABLE. +

+ +
+-
Function: FILE-NAMESTRING (pathname)
++
Function: FILE-NAMESTRING (pathname)
+

Package:LISP +

+

Returns the written representation of PATHNAME as a string. +@@ -721,7 +709,7 @@ FROM-CHAR in FROM-READTABLE. +

+ +
+-
Function: MAKE-DISPATCH-MACRO-CHARACTER (char &optional (non-terminating-p nil) (readtable *readtable*))
++
Function: MAKE-DISPATCH-MACRO-CHARACTER (char &optional (non-terminating-p nil) (readtable *readtable*))
+

Package:LISP +

+

Causes the character CHAR to be a dispatching macro character in READTABLE. +@@ -730,7 +718,7 @@ FROM-CHAR in FROM-READTABLE. +

+ +
+-
Variable: *STANDARD-OUTPUT*
++
Variable: *STANDARD-OUTPUT*
+

Package:LISP + The default output stream used by the GCL printer. +

+@@ -738,7 +726,7 @@ The default output stream used by the GC +
+ +
+-
Function: MAKE-TWO-WAY-STREAM (input-stream output-stream)
++
Function: MAKE-TWO-WAY-STREAM (input-stream output-stream)
+

Package:LISP +

+

Returns a bidirectional stream which gets its input from INPUT-STREAM and +@@ -748,7 +736,7 @@ sends its output to OUTPUT-STREAM. +

+ +
+-
Variable: *PRINT-ESCAPE*
++
Variable: *PRINT-ESCAPE*
+

Package:LISP + Whether the GCL printer should put escape characters whenever appropriate. +

+@@ -756,7 +744,7 @@ Whether the GCL printer should put escap +
+ +
+-
Function: COPY-READTABLE (&optional (from-readtable *readtable*) (to-readtable nil))
++
Function: COPY-READTABLE (&optional (from-readtable *readtable*) (to-readtable nil))
+

Package:LISP +

+

Returns a copy of the readtable FROM-READTABLE. If TO-READTABLE is non-NIL, +@@ -766,7 +754,7 @@ then copies into TO-READTABLE. Otherwis +

+ +
+-
Function: DIRECTORY-NAMESTRING (pathname)
++
Function: DIRECTORY-NAMESTRING (pathname)
+

Package:LISP +

+

Returns the directory part of PATHNAME as a string. +@@ -775,7 +763,7 @@ then copies into TO-READTABLE. Otherwis +

+ +
+-
Function: TRUENAME (pathname)
++
Function: TRUENAME (pathname)
+

Package:LISP +

+

Returns the pathname for the actual file described by PATHNAME. +@@ -784,7 +772,7 @@ then copies into TO-READTABLE. Otherwis +

+ +
+-
Variable: *READ-SUPPRESS*
++
Variable: *READ-SUPPRESS*
+

Package:LISP + When the value of this variable is NIL, the GCL reader operates normally. + When it is non-NIL, then the reader parses input characters but much of what +@@ -794,7 +782,7 @@ is read is not interpreted. +

+ +
+-
Function: GET-DISPATCH-MACRO-CHARACTER (disp-char sub-char &optional (readtable *readtable*))
++
Function: GET-DISPATCH-MACRO-CHARACTER (disp-char sub-char &optional (readtable *readtable*))
+

Package:LISP +

+

Returns the macro-character function for SUB-CHAR under DISP-CHAR. +@@ -803,7 +791,7 @@ is read is not interpreted. +

+ +
+-
Function: PATHNAME-DEVICE (pathname)
++
Function: PATHNAME-DEVICE (pathname)
+

Package:LISP +

+

Returns the device slot of PATHNAME. +@@ -812,7 +800,7 @@ is read is not interpreted. +

+ +
+-
Function: READ-CHAR-NO-HANG (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
++
Function: READ-CHAR-NO-HANG (&optional (stream *standard-input*) (eof-error-p t) (eof-value nil) (recursive-p nil))
+

Package:LISP +

+

Returns the next character from STREAM if one is available; NIL otherwise. +@@ -821,7 +809,7 @@ is read is not interpreted. +

+ +
+-
Function: FRESH-LINE (&optional (stream *standard-output*))
++
Function: FRESH-LINE (&optional (stream *standard-output*))
+

Package:LISP +

+

Outputs a newline if it is not positioned at the beginning of a line. Returns +@@ -831,7 +819,7 @@ T if it output a newline; NIL otherwise. +

+ +
+-
Function: WRITE-CHAR (char &optional (stream *standard-output*))
++
Function: WRITE-CHAR (char &optional (stream *standard-output*))
+

Package:LISP +

+

Outputs CHAR and returns it. +@@ -840,7 +828,7 @@ T if it output a newline; NIL otherwise. +

+ +
+-
Function: PARSE-NAMESTRING (thing &optional host (defaults *default-pathname-defaults*) &key (start 0) (end (length thing)) (junk-allowed nil))
++
Function: PARSE-NAMESTRING (thing &optional host (defaults *default-pathname-defaults*) &key (start 0) (end (length thing)) (junk-allowed nil))
+

Package:LISP +

+

Parses a string representation of a pathname into a pathname. HOST +@@ -850,7 +838,7 @@ is ignored. +

+ +
+-
Function: PATHNAME-DIRECTORY (pathname)
++
Function: PATHNAME-DIRECTORY (pathname)
+

Package:LISP +

+

Returns the directory slot of PATHNAME. +@@ -859,7 +847,7 @@ is ignored. +

+ +
+-
Function: GET-MACRO-CHARACTER (char &optional (readtable *readtable*))
++
Function: GET-MACRO-CHARACTER (char &optional (readtable *readtable*))
+

Package:LISP +

+

Returns the function associated with CHAR and, as a second value, returns +@@ -869,7 +857,7 @@ the non-terminating-p flag. +

+ +
+-
Function: FORMAT (destination control-string &rest arguments)
++
Function: FORMAT (destination control-string &rest arguments)
+

Package:LISP +

+

Provides various facilities for formatting output. +@@ -888,6 +876,7 @@ usually consuming one or more of ARGUMEN +

A few useful directives are: +

+
++
+ ~A, ~nA, ~n@A	Prints one argument as if by PRINC
+ ~S, ~nS, ~n@S	Prints one argument as if by PRIN1
+ ~D, ~B, ~O, ~X	Prints one integer in decimal, binary, octal, and hexa
+@@ -938,7 +927,7 @@ usually consuming one or more of ARGUMEN
+ 
+ +
+-
Function: PATHNAME-NAME (pathname)
++
Function: PATHNAME-NAME (pathname)
+

Package:LISP +

+

Returns the name slot of PATHNAME. +@@ -947,7 +936,7 @@ usually consuming one or more of ARGUMEN +

+ +
+-
Function: MAKE-STRING-OUTPUT-STREAM ()
++
Function: MAKE-STRING-OUTPUT-STREAM ()
+

Package:LISP +

+

Returns an output stream which will accumulate all output given it for +@@ -957,7 +946,7 @@ the benefit of the function GET-OUTPUT-S +

+ +
+-
Function: MAKE-SYNONYM-STREAM (symbol)
++
Function: MAKE-SYNONYM-STREAM (symbol)
+

Package:LISP +

+

Returns a stream which performs its operations on the stream which is the +@@ -967,7 +956,7 @@ value of the dynamic variable named by S +

+ +
+-
Variable: *LOAD-VERBOSE*
++
Variable: *LOAD-VERBOSE*
+

Package:LISP + The default for the VERBOSE argument to LOAD. +

+@@ -975,7 +964,7 @@ The default for the VERBOSE argument to +
+ +
+-
Variable: *PRINT-CIRCLE*
++
Variable: *PRINT-CIRCLE*
+

Package:LISP + Whether the GCL printer should take care of circular lists. +

+@@ -983,7 +972,7 @@ Whether the GCL printer should take care +
+ +
+-
Variable: *PRINT-PRETTY*
++
Variable: *PRINT-PRETTY*
+

Package:LISP + Whether the GCL printer should pretty-print. See the function doc of PPRINT + for more information about pretty-printing. +@@ -992,7 +981,7 @@ for more information about pretty-printi +

+ +
+-
Function: FILE-WRITE-DATE (file)
++
Function: FILE-WRITE-DATE (file)
+

Package:LISP +

+

Returns the time at which the specified file is written, as an integer in +@@ -1002,7 +991,7 @@ universal time format. FILE may be a st +

+ +
+-
Function: PRIN1-TO-STRING (object)
++
Function: PRIN1-TO-STRING (object)
+

Package:LISP +

+

Returns as a string the printed representation of OBJECT in the mostly +@@ -1013,7 +1002,7 @@ Equivalent to (WRITE-TO-STRING OBJECT :E +

+ +
+-
Function: MERGE-PATHNAMES (pathname &optional (defaults *default-pathname-defaults*) default-version)
++
Function: MERGE-PATHNAMES (pathname &optional (defaults *default-pathname-defaults*) default-version)
+

Package:LISP +

+

Fills in unspecified slots of PATHNAME from DEFAULTS. DEFAULT-VERSION +@@ -1023,7 +1012,7 @@ is ignored in GCL. +

+ +
+-
Function: READ-BYTE (stream &optional (eof-error-p t) (eof-value nil))
++
Function: READ-BYTE (stream &optional (eof-error-p t) (eof-value nil))
+

Package:LISP +

+

Reads the next byte from STREAM. +@@ -1032,7 +1021,7 @@ is ignored in GCL. +

+ +
+-
Function: PRINC-TO-STRING (object)
++
Function: PRINC-TO-STRING (object)
+

Package:LISP +

+

Returns as a string the printed representation of OBJECT without escape +@@ -1043,7 +1032,7 @@ characters. Equivalent to +

+ +
+-
Variable: *STANDARD-INPUT*
++
Variable: *STANDARD-INPUT*
+

Package:LISP + The default input stream used by the GCL reader. +

+@@ -1051,7 +1040,7 @@ The default input stream used by the GCL +
+ +
+-
Function: PROBE-FILE (file)
++
Function: PROBE-FILE (file)
+

Package:LISP +

+

Returns the truename of file if the file exists. +@@ -1061,7 +1050,7 @@ Returns NIL otherwise. +

+ +
+-
Function: PATHNAME-VERSION (pathname)
++
Function: PATHNAME-VERSION (pathname)
+

Package:LISP +

+

Returns the version slot of PATHNAME. +@@ -1070,7 +1059,7 @@ Returns NIL otherwise. +

+ +
+-
Function: WRITE-LINE (string &optional (stream *standard-output*) &key (start 0) (end (length string)))
++
Function: WRITE-LINE (string &optional (stream *standard-output*) &key (start 0) (end (length string)))
+

Package:LISP +

+

Outputs STRING and then outputs a newline character. Returns STRING. +@@ -1079,7 +1068,7 @@ Returns NIL otherwise. +

+ +
+-
Function: WRITE (object &key (stream *standard-output*) (escape *print-escape*) (radix *print-radix*) (base *print-base*) (circle *print-circle*) (pretty *print-pretty*) (level *print-level*) (length *print-length*) (case *print-case*) (array *print-array*) (gensym *print-gensym*))
++
Function: WRITE (object &key (stream *standard-output*) (escape *print-escape*) (radix *print-radix*) (base *print-base*) (circle *print-circle*) (pretty *print-pretty*) (level *print-level*) (length *print-length*) (case *print-case*) (array *print-array*) (gensym *print-gensym*))
+

Package:LISP +

+

Prints OBJECT in the specified mode. See the variable docs of *PRINT-...* +@@ -1089,7 +1078,7 @@ for the mode. +

+ +
+-
Function: GET-OUTPUT-STREAM-STRING (stream)
++
Function: GET-OUTPUT-STREAM-STRING (stream)
+

Package:LISP +

+

Returns a string of all the characters sent to STREAM made by +@@ -1099,7 +1088,7 @@ MAKE-STRING-OUTPUT-STREAM since the last +

+ +
+-
Function: READ-DELIMITED-LIST (char &optional (stream *standard-input*) (recursive-p nil))
++
Function: READ-DELIMITED-LIST (char &optional (stream *standard-input*) (recursive-p nil))
+

Package:LISP +

+

Reads objects from STREAM until the next character after an object’s +@@ -1109,7 +1098,7 @@ representation is CHAR. Returns a list +

+ +
+-
Function: READLINE-ON ()
++
Function: READLINE-ON ()
+

Package:SI +

+

Begins readline command editing mode when possible. In addition to +@@ -1134,7 +1123,7 @@ completed. The comparison is case insen +

+ +
+-
Function: READLINE-OFF ()
++
Function: READLINE-OFF ()
+

Package:SI +

+

Disables readline command editing mode. +@@ -1142,7 +1131,7 @@ completed. The comparison is case insen +

+ +
+-
Variable: *READLINE-PREFIX*
++
Variable: *READLINE-PREFIX*
+

Package:SI +

+

A string implicitly prepended to input text for use in readline +@@ -1165,7 +1154,7 @@ the internal symbols in the maxima packa +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Structures.html ++++ gcl-2.6.12/info/gcl-si/Structures.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Structures ++ ++Structures (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

10 Structures

++

10 Structures

+ +
+-
Macro: DEFSTRUCT
++
Macro: DEFSTRUCT
+

Package:LISP +

+

Syntax: +@@ -92,7 +80,7 @@ a lisp structure correspond to a C struc +

+ +
+-
Function: HELP (&optional symbol)
++
Function: HELP (&optional symbol)
+

Package:LISP +

+

GCL specific: Prints the documentation associated with SYMBOL. With no +--- gcl-2.6.12.orig/info/gcl-si/Symbols.html ++++ gcl-2.6.12/info/gcl-si/Symbols.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Symbols ++ ++Symbols (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

8 Symbols

++

8 Symbols

+ +
+-
Function: GENSYM (&optional (x nil))
++
Function: GENSYM (&optional (x nil))
+

Package:LISP +

+

Creates and returns a new uninterned symbol whose name is a prefix string +@@ -71,7 +59,7 @@ string, it becomes the new prefix. +

+ +
+-
Function: KEYWORDP (x)
++
Function: KEYWORDP (x)
+

Package:LISP +

+

Returns T if X is a symbol and it belongs to the KEYWORD package; NIL +@@ -81,7 +69,7 @@ otherwise. +

+ +
+-
Function: REMPROP (symbol indicator)
++
Function: REMPROP (symbol indicator)
+

Package:LISP +

+

Look on property list of SYMBOL for property with specified +@@ -91,7 +79,7 @@ the plist, and return T. If not found, r +

+ +
+-
Function: SYMBOL-PACKAGE (symbol)
++
Function: SYMBOL-PACKAGE (symbol)
+

Package:LISP +

+

Returns the contents of the package cell of the symbol SYMBOL. +@@ -100,7 +88,7 @@ the plist, and return T. If not found, r +

+ +
+-
Variable: *PACKAGE*
++
Variable: *PACKAGE*
+

Package:LISP + The current package. +

+@@ -109,7 +97,7 @@ The current package. + + +
+-
Function: SHADOWING-IMPORT (symbols &optional (package *package*))
++
Function: SHADOWING-IMPORT (symbols &optional (package *package*))
+

Package:LISP +

+

Imports SYMBOLS into PACKAGE, disregarding any name conflict. If a symbol +@@ -120,7 +108,7 @@ be a list of symbols or a symbol. +

+ +
+-
Macro: REMF
++
Macro: REMF
+

Package:LISP +

+

Syntax: +@@ -137,7 +125,7 @@ property was present; NIL otherwise. +

+ +
+-
Function: MAKUNBOUND (symbol)
++
Function: MAKUNBOUND (symbol)
+

Package:LISP +

+

Makes empty the value slot of SYMBOL. Returns SYMBOL. +@@ -146,7 +134,7 @@ property was present; NIL otherwise. +

+ +
+-
Function: USE-PACKAGE (packages-to-use &optional (package *package*))
++
Function: USE-PACKAGE (packages-to-use &optional (package *package*))
+

Package:LISP +

+

Adds all packages in PACKAGE-TO-USE list to the use list for PACKAGE so that +@@ -157,7 +145,7 @@ in PACKAGE. +

+ +
+-
Function: MAKE-SYMBOL (string)
++
Function: MAKE-SYMBOL (string)
+

Package:LISP +

+

Creates and returns a new uninterned symbol whose print name is STRING. +@@ -166,7 +154,7 @@ in PACKAGE. +

+ +
+-
Special Form: PSETQ
++
Special Form: PSETQ
+

Package:LISP +

+

Syntax: +@@ -181,7 +169,7 @@ the corresponding VAR. Returns NIL alwa +

+ +
+-
Function: PACKAGE-USED-BY-LIST (package)
++
Function: PACKAGE-USED-BY-LIST (package)
+

Package:LISP +

+

Returns the list of packages that use PACKAGE. +@@ -190,7 +178,7 @@ the corresponding VAR. Returns NIL alwa +

+ +
+-
Function: SYMBOLP (x)
++
Function: SYMBOLP (x)
+

Package:LISP +

+

Returns T if X is a symbol; NIL otherwise. +@@ -199,7 +187,7 @@ the corresponding VAR. Returns NIL alwa +

+ +
+-
Constant: NIL
++
Constant: NIL
+

Package:LISP + Holds NIL. +

+@@ -207,7 +195,7 @@ Holds NIL. +
+ +
+-
Function: SET (symbol value)
++
Function: SET (symbol value)
+

Package:LISP +

+

Assigns the value of VALUE to the dynamic variable named by SYMBOL, and +@@ -217,7 +205,7 @@ returns the value assigned. +

+ +
+-
Special Form: SETQ
++
Special Form: SETQ
+

Package:LISP +

+

Syntax: +@@ -233,7 +221,7 @@ VAR, and so on. Returns the last value +

+ +
+-
Function: UNUSE-PACKAGE (packages-to-unuse &optional (package *package*))
++
Function: UNUSE-PACKAGE (packages-to-unuse &optional (package *package*))
+

Package:LISP +

+

Removes PACKAGES-TO-UNUSE from the use list for PACKAGE. +@@ -242,7 +230,7 @@ VAR, and so on. Returns the last value +

+ +
+-
Constant: T
++
Constant: T
+

Package:LISP + Holds T. +

+@@ -250,7 +238,7 @@ Holds T. +
+ +
+-
Function: PACKAGE-USE-LIST (package)
++
Function: PACKAGE-USE-LIST (package)
+

Package:LISP +

+

Returns the list of packages used by PACKAGE. +@@ -259,7 +247,7 @@ Holds T. +

+ +
+-
Function: LIST-ALL-PACKAGES ()
++
Function: LIST-ALL-PACKAGES ()
+

Package:LISP +

+

Returns a list of all existing packages. +@@ -268,7 +256,7 @@ Holds T. +

+ +
+-
Function: COPY-SYMBOL (symbol &optional (copy-props nil))
++
Function: COPY-SYMBOL (symbol &optional (copy-props nil))
+

Package:LISP +

+

Returns a new uninterned symbol with the same print name as SYMBOL. +@@ -280,7 +268,7 @@ values of the corresponding slots of SYM +

+ +
+-
Function: SYMBOL-PLIST (symbol)
++
Function: SYMBOL-PLIST (symbol)
+

Package:LISP +

+

Returns the property list of SYMBOL. +@@ -289,7 +277,7 @@ values of the corresponding slots of SYM +

+ +
+-
Function: SYMBOL-NAME (symbol)
++
Function: SYMBOL-NAME (symbol)
+

Package:LISP +

+

Returns the print name of the symbol SYMBOL. +@@ -298,7 +286,7 @@ values of the corresponding slots of SYM +

+ +
+-
Function: FIND-SYMBOL (name &optional (package *package*))
++
Function: FIND-SYMBOL (name &optional (package *package*))
+

Package:LISP +

+

Returns the symbol named NAME in +@@ -310,7 +298,7 @@ no symbol is found then both values are +

+ +
+-
Function: SHADOW (symbols &optional (package *package*))
++
Function: SHADOW (symbols &optional (package *package*))
+

Package:LISP +

+

Creates an internal symbol in PACKAGE with the same name as each of the +@@ -321,7 +309,7 @@ specified SYMBOLS. SYMBOLS must be a li + + +

+-
Function: FBOUNDP (symbol)
++
Function: FBOUNDP (symbol)
+

Package:LISP +

+

Returns T if SYMBOL has a global function definition or if SYMBOL names a +@@ -331,7 +319,7 @@ special form or a macro; NIL otherwise. +

+ +
+-
Function: MACRO-FUNCTION (symbol)
++
Function: MACRO-FUNCTION (symbol)
+

Package:LISP +

+

If SYMBOL globally names a macro, then returns the expansion function. +@@ -341,7 +329,7 @@ Returns NIL otherwise. +

+ +
+-
Function: IN-PACKAGE (package-name &key (nicknames nil) (use '(lisp)))
++
Function: IN-PACKAGE (package-name &key (nicknames nil) (use '(lisp)))
+

Package:LISP +

+

Sets *PACKAGE* to the package with PACKAGE-NAME, creating the package if +@@ -354,7 +342,7 @@ is not currently used, then it is added +

+ +
+-
Function: MAKE-PACKAGE (package-name &key (nicknames nil) (use '(lisp)))
++
Function: MAKE-PACKAGE (package-name &key (nicknames nil) (use '(lisp)))
+

Package:LISP +

+

Makes a new package having the specified PACKAGE-NAME and NICKNAMES. The +@@ -364,7 +352,7 @@ package will inherit all external symbol +

+ +
+-
Function: PACKAGE-SHADOWING-SYMBOLS (package)
++
Function: PACKAGE-SHADOWING-SYMBOLS (package)
+

Package:LISP +

+

Returns the list of symbols that have been declared as shadowing symbols +@@ -374,7 +362,7 @@ in PACKAGE. +

+ +
+-
Function: INTERN (name &optional (package *package*))
++
Function: INTERN (name &optional (package *package*))
+

Package:LISP +

+

Returns a symbol having the specified name, creating it if necessary. +@@ -385,7 +373,7 @@ Returns as the second value one of the s +

+ +
+-
Function: EXPORT (symbols &optional (package *package*))
++
Function: EXPORT (symbols &optional (package *package*))
+

Package:LISP +

+

Makes SYMBOLS external symbols of PACKAGE. SYMBOLS must be a list of symbols +@@ -395,7 +383,7 @@ or a symbol. +

+ +
+-
Function: PACKAGEP (x)
++
Function: PACKAGEP (x)
+

Package:LISP +

+

Returns T if X is a package; NIL otherwise. +@@ -404,7 +392,7 @@ or a symbol. +

+ +
+-
Function: SYMBOL-FUNCTION (symbol)
++
Function: SYMBOL-FUNCTION (symbol)
+

Package:LISP +

+

Returns the current global function definition named by SYMBOL. +@@ -413,7 +401,7 @@ or a symbol. +

+ +
+-
Function: SYMBOL-VALUE (symbol)
++
Function: SYMBOL-VALUE (symbol)
+

Package:LISP +

+

Returns the current value of the dynamic (special) variable named by SYMBOL. +@@ -422,7 +410,7 @@ or a symbol. +

+ +
+-
Function: BOUNDP (symbol)
++
Function: BOUNDP (symbol)
+

Package:LISP +

+

Returns T if the global variable named by SYMBOL has a value; NIL otherwise. +@@ -431,7 +419,7 @@ or a symbol. +

+ +
+-
Function: DOCUMENTATION (symbol doc-type)
++
Function: DOCUMENTATION (symbol doc-type)
+

Package:LISP +

+

Returns the doc-string of DOC-TYPE for SYMBOL; NIL if none exists. +@@ -449,7 +437,7 @@ doc-strings. +

+ +
+-
Function: GENTEMP (&optional (prefix "t") (package *package*))
++
Function: GENTEMP (&optional (prefix "t") (package *package*))
+

Package:LISP +

+

Creates a new symbol interned in the package PACKAGE with the given PREFIX. +@@ -458,7 +446,7 @@ doc-strings. +

+ +
+-
Function: RENAME-PACKAGE (package new-name &optional (new-nicknames nil))
++
Function: RENAME-PACKAGE (package new-name &optional (new-nicknames nil))
+

Package:LISP +

+

Replaces the old name and nicknames of PACKAGE with NEW-NAME and +@@ -468,7 +456,7 @@ NEW-NICKNAMES. +

+ +
+-
Function: UNINTERN (symbol &optional (package *package*))
++
Function: UNINTERN (symbol &optional (package *package*))
+

Package:LISP +

+

Makes SYMBOL no longer present in PACKAGE. Returns T if SYMBOL was present; +@@ -479,7 +467,7 @@ uninterned. +

+ +
+-
Function: UNEXPORT (symbols &optional (package *package*))
++
Function: UNEXPORT (symbols &optional (package *package*))
+

Package:LISP +

+

Makes SYMBOLS no longer accessible as external symbols in PACKAGE. SYMBOLS +@@ -489,7 +477,7 @@ must be a list of symbols or a symbol. +

+ +
+-
Function: PACKAGE-NICKNAMES (package)
++
Function: PACKAGE-NICKNAMES (package)
+

Package:LISP +

+

Returns as a list the nickname strings for the specified PACKAGE. +@@ -498,7 +486,7 @@ must be a list of symbols or a symbol. +

+ +
+-
Function: IMPORT (symbols &optional (package *package*))
++
Function: IMPORT (symbols &optional (package *package*))
+

Package:LISP +

+

Makes SYMBOLS internal symbols of PACKAGE. SYMBOLS must be a list of symbols +@@ -508,7 +496,7 @@ or a symbol. +

+ +
+-
Function: GET (symbol indicator &optional (default nil))
++
Function: GET (symbol indicator &optional (default nil))
+

Package:LISP +

+

Looks on the property list of SYMBOL for the specified INDICATOR. If this +@@ -518,7 +506,7 @@ is found, returns the associated value. +

+ +
+-
Function: FIND-ALL-SYMBOLS (string-or-symbol)
++
Function: FIND-ALL-SYMBOLS (string-or-symbol)
+

Package:LISP +

+

Returns a list of all symbols that have the specified name. +@@ -527,7 +515,7 @@ is found, returns the associated value. +

+ +
+-
Function: FMAKUNBOUND (symbol)
++
Function: FMAKUNBOUND (symbol)
+

Package:LISP +

+

Discards the global function definition named by SYMBOL. Returns SYMBOL. +@@ -536,7 +524,7 @@ is found, returns the associated value. +

+ +
+-
Function: PACKAGE-NAME (package)
++
Function: PACKAGE-NAME (package)
+

Package:LISP +

+

Returns the string that names the specified PACKAGE. +@@ -545,7 +533,7 @@ is found, returns the associated value. +

+ +
+-
Function: FIND-PACKAGE (name)
++
Function: FIND-PACKAGE (name)
+

Package:LISP +

+

Returns the specified package if it already exists; NIL otherwise. NAME may +@@ -557,7 +545,7 @@ a symbol, in which case the symbol&rsquo + + +

+-
Function: APROPOS-LIST (string &optional (package nil))
++
Function: APROPOS-LIST (string &optional (package nil))
+

Package:LISP +

+

Returns, as a list, all symbols whose print-names contain STRING as substring. +@@ -571,7 +559,7 @@ If PACKAGE is non-NIL, then only the spe +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/System-Definitions.html ++++ gcl-2.6.12/info/gcl-si/System-Definitions.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: System Definitions ++ ++System Definitions (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,19 +38,17 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

17 System Definitions

++

17 System Definitions

+ + +
+-
Function: ALLOCATE-CONTIGUOUS-PAGES (number &optional (really-allocate nil))
++
Function: ALLOCATE-CONTIGUOUS-PAGES (number &optional (really-allocate nil))
+

Package:SI +

+

GCL specific: Sets the maximum number of pages for contiguous blocks to +@@ -70,7 +58,7 @@ number of pages will be allocated immedi + +

+
+-
Function: FREEZE-DEFSTRUCT (name)
++
Function: FREEZE-DEFSTRUCT (name)
+

Package:SI +

+

The inline defstruct type checker will be made more efficient, in that +@@ -80,7 +68,7 @@ calling this the defstruct should not be + +

+
+-
Function: MAXIMUM-ALLOCATABLE-PAGES (type)
++
Function: MAXIMUM-ALLOCATABLE-PAGES (type)
+

Package:SI +

+

GCL specific: Returns the current maximum number of pages for the type class +@@ -89,7 +77,7 @@ of the GCL implementation type TYPE. + +

+
+-
Function: ALLOCATED-RELOCATABLE-PAGES ()
++
Function: ALLOCATED-RELOCATABLE-PAGES ()
+

Package:SI +

+

GCL specific: Returns the number of pages currently allocated for relocatable +@@ -98,7 +86,7 @@ blocks. + +

+
+-
Function: PUTPROP (symbol value indicator)
++
Function: PUTPROP (symbol value indicator)
+

Package:SI +

+

Give SYMBOL the VALUE on INDICATOR property. +@@ -106,7 +94,7 @@ blocks. + +

+
+-
Function: ALLOCATED-PAGES (type)
++
Function: ALLOCATED-PAGES (type)
+

Package:SI +

+

GCL specific: Returns the number of pages currently allocated for the type +@@ -115,7 +103,7 @@ class of the GCL implementation type TYP + +

+
+-
Function: ALLOCATE-RELOCATABLE-PAGES (number)
++
Function: ALLOCATE-RELOCATABLE-PAGES (number)
+

Package:SI +

+

GCL specific: Sets the maximum number of pages for relocatable blocks to +@@ -124,7 +112,7 @@ NUMBER. + +

+
+-
Function: ALLOCATED-CONTIGUOUS-PAGES ()
++
Function: ALLOCATED-CONTIGUOUS-PAGES ()
+

Package:SI +

+

GCL specific: Returns the number of pages currently allocated for contiguous +@@ -133,7 +121,7 @@ blocks. + +

+
+-
Function: MAXIMUM-CONTIGUOUS-PAGES ()
++
Function: MAXIMUM-CONTIGUOUS-PAGES ()
+

Package:SI +

+

GCL specific: Returns the current maximum number of pages for contiguous +@@ -142,7 +130,7 @@ blocks. + +

+
+-
Function: GET-HOLE-SIZE ()
++
Function: GET-HOLE-SIZE ()
+

Package:SI +

+

GCL specific: Returns as a fixnum the size of the memory hole (in pages). +@@ -150,7 +138,7 @@ blocks. + +

+
+-
Function: SPECIALP (symbol)
++
Function: SPECIALP (symbol)
+

Package:SI +

+

GCL specific: Returns T if the SYMBOL is a globally special variable; NIL +@@ -159,7 +147,7 @@ otherwise. + +

+
+-
Function: OUTPUT-STREAM-STRING (string-output-stream)
++
Function: OUTPUT-STREAM-STRING (string-output-stream)
+

Package:SI +

+

GCL specific: Returns the string corresponding to the STRING-OUTPUT-STREAM. +@@ -167,7 +155,7 @@ otherwise. + +

+
+-
Function: GET-STRING-INPUT-STREAM-INDEX (string-input-stream)
++
Function: GET-STRING-INPUT-STREAM-INDEX (string-input-stream)
+

Package:SI +

+

GCL specific: Returns the current index of the STRING-INPUT-STREAM. +@@ -175,7 +163,7 @@ otherwise. + +

+
+-
Function: STRING-CONCATENATE (&rest strings)
++
Function: STRING-CONCATENATE (&rest strings)
+

Package:SI +

+

GCL specific: Returns the result of concatenating the given STRINGS. +@@ -183,7 +171,7 @@ otherwise. + +

+
+-
Function: BDS-VAR (i)
++
Function: BDS-VAR (i)
+

Package:SI +

+

GCL specific: Returns the symbol of the i-th entity in the bind stack. +@@ -191,7 +179,7 @@ otherwise. + +

+
+-
Function: ERROR-SET (form)
++
Function: ERROR-SET (form)
+

Package:SI +

+

GCL specific: Evaluates the FORM in the null environment. If the evaluation +@@ -204,7 +192,7 @@ value. + +

+
+-
Function: COMPILED-FUNCTION-NAME (compiled-function-object)
++
Function: COMPILED-FUNCTION-NAME (compiled-function-object)
+

Package:SI +

+

GCL specific: Returns the name of the COMPILED-FUNCTION-OBJECT. +@@ -212,7 +200,7 @@ value. + +

+
+-
Function: STRUCTUREP (object)
++
Function: STRUCTUREP (object)
+

Package:SI +

+

GCL specific: Returns T if the OBJECT is a structure; NIL otherwise. +@@ -220,7 +208,7 @@ value. + +

+
+-
Function: IHS-VS (i)
++
Function: IHS-VS (i)
+

Package:SI +

+

GCL specific: Returns the value stack index of the i-th entity in the +@@ -229,7 +217,7 @@ invocation history stack. + +

+
+-
Function: UNIVERSAL-ERROR-HANDLER (error-name correctable function-name continue-format-string error-format-string &rest args)
++
Function: UNIVERSAL-ERROR-HANDLER (error-name correctable function-name continue-format-string error-format-string &rest args)
+

Package:SI +

+

GCL specific: Starts the error handler of GCL. When an error is detected, +@@ -245,7 +233,7 @@ HANDLER. + +

+
+-
Variable: *INTERRUPT-ENABLE*
++
Variable: *INTERRUPT-ENABLE*
+

Package:SI + GCL specific: If the value of SI:*INTERRUPT-ENABLE* is non-NIL, GCL signals + an error on the terminal interrupt (this is the default case). If it is NIL, +@@ -254,7 +242,7 @@ GCL ignores the interrupt and assigns T + +

+
+-
Function: CHDIR (pathname)
++
Function: CHDIR (pathname)
+

Package:SI +

+

GCL/UNIX specific: Changes the current working directory to the specified +@@ -263,7 +251,7 @@ pathname. + +

+
+-
Function: COPY-STREAM (in-stream out-stream)
++
Function: COPY-STREAM (in-stream out-stream)
+

Package:SI +

+

GCL specific: Copies IN-STREAM to OUT-STREAM until the end-of-file on IN- +@@ -272,7 +260,7 @@ STREAM. + +

+
+-
Function: INIT-SYSTEM ()
++
Function: INIT-SYSTEM ()
+

Package:SI +

+

GCL specific: Initializes the library and the compiler of GCL. Since they +@@ -282,7 +270,7 @@ SYSTEM will cause an error. + +

+
+-
Variable: *INDENT-FORMATTED-OUTPUT*
++
Variable: *INDENT-FORMATTED-OUTPUT*
+

Package:SI + GCL specific: The FORMAT directive ~% indents the next line if the value of + this variable is non-NIL. If NIL, ~% simply does Newline. +@@ -290,7 +278,7 @@ this variable is non-NIL. If NIL, ~% si + +

+
+-
Function: SET-HOLE-SIZE (fixnum)
++
Function: SET-HOLE-SIZE (fixnum)
+

Package:SI +

+

GCL specific: Sets the size of the memory hole (in pages). +@@ -298,7 +286,7 @@ this variable is non-NIL. If NIL, ~% si + +

+
+-
Function: FRS-BDS (i)
++
Function: FRS-BDS (i)
+

Package:SI +

+

GCL specific: Returns the bind stack index of the i-th entity in the frame +@@ -307,7 +295,7 @@ stack. + +

+
+-
Function: IHS-FUN (i)
++
Function: IHS-FUN (i)
+

Package:SI +

+

GCL specific: Returns the function value of the i-th entity in the invocation +@@ -316,7 +304,7 @@ history stack. + +

+
+-
Function: *MAKE-CONSTANT (symbol value)
++
Function: *MAKE-CONSTANT (symbol value)
+

Package:SI +

+

GCL specific: Makes the SYMBOL a constant with the specified VALUE. +@@ -324,7 +312,7 @@ history stack. + +

+
+-
Function: FIXNUMP (object)
++
Function: FIXNUMP (object)
+

Package:SI +

+

GCL specific: Returns T if the OBJECT is a fixnum; NIL otherwise. +@@ -332,7 +320,7 @@ history stack. + +

+
+-
Function: BDS-VAL (i)
++
Function: BDS-VAL (i)
+

Package:SI +

+

GCL specific: Returns the value of the i-th entity in the bind stack. +@@ -340,7 +328,7 @@ history stack. + +

+
+-
Function: STRING-TO-OBJECT (string)
++
Function: STRING-TO-OBJECT (string)
+

Package:SI +

+

GCL specific: (SI:STRING-TO-OBJECT STRING) is equivalent to +@@ -349,14 +337,14 @@ history stack. + +

+
+-
Variable: *SYSTEM-DIRECTORY*
++
Variable: *SYSTEM-DIRECTORY*
+

Package:SI + GCL specific: Holds the name of the system directory of GCL. +

+ +
+
+-
Function: FRS-IHS (i)
++
Function: FRS-IHS (i)
+

Package:SI +

+

GCL specific: Returns the invocation history stack index of the i-th entity +@@ -365,7 +353,7 @@ in the frame stack. + +

+
+-
Function: RESET-GBC-COUNT ()
++
Function: RESET-GBC-COUNT ()
+

Package:SI +

+

GCL specific: Resets the counter of the garbage collector that records how +@@ -375,7 +363,7 @@ type. + +

+
+-
Function: CATCH-BAD-SIGNALS ()
++
Function: CATCH-BAD-SIGNALS ()
+

Package:SI +

+

GCL/BSD specific: Installs a signal catcher for bad signals: +@@ -388,7 +376,7 @@ is caught during garbage collection, GCL + +

+
+-
Function: RESET-STACK-LIMITS ()
++
Function: RESET-STACK-LIMITS ()
+

Package:SI +

+

GCL specific: Resets the stack limits to the normal state. When a stack has +@@ -399,7 +387,7 @@ SI:RESET-STACK-LIMITS. + +

+
+-
Variable: *GBC-MESSAGE*
++
Variable: *GBC-MESSAGE*
+

Package:SI + GCL specific: If the value of SI:*GBC-MESSAGE* is non-NIL, the garbage + collector prints some information on the terminal. Usually SI:*GBC-MESSAGE* +@@ -408,7 +396,7 @@ should be set NIL. + +

+
+-
Variable: *GBC-NOTIFY*
++
Variable: *GBC-NOTIFY*
+

Package:SI + GCL specific: If the value is non-NIL, the garbage + collector prints a very brief one line message about the area causing the collection, +@@ -417,7 +405,7 @@ and the time spent in internal time unit + +

+
+-
Variable: *AFTER-GBC-HOOK*
++
Variable: *AFTER-GBC-HOOK*
+

Package:SI + Defaults to nil, but may be set to a function of one argument TYPE which is + a lisp variable indicating the TYPE which caused the current collection. +@@ -425,7 +413,7 @@ a lisp variable indicating the TYPE whic + +

+
+-
Funcition: ALLOCATED (type)
++
Funcition: ALLOCATED (type)
+

Package:SI +

+

Returns 6 values: +@@ -460,7 +448,7 @@ CONS BIGNUM RATIO COMPLEX STRUCTURE. +

+ +
+-
Function: *MAKE-SPECIAL (symbol)
++
Function: *MAKE-SPECIAL (symbol)
+

Package:SI +

+

GCL specific: Makes the SYMBOL globally special. +@@ -468,7 +456,7 @@ CONS BIGNUM RATIO COMPLEX STRUCTURE. + +

+
+-
Function: MAKE-STRING-OUTPUT-STREAM-FROM-STRING (string)
++
Function: MAKE-STRING-OUTPUT-STREAM-FROM-STRING (string)
+

Package:SI +

+

GCL specific: Creates a string-output-stream corresponding to the STRING and +@@ -477,7 +465,7 @@ returns it. The STRING should have a fi + +

+
+-
Variable: *IGNORE-EOF-ON-TERMINAL-IO*
++
Variable: *IGNORE-EOF-ON-TERMINAL-IO*
+

Package:SI + GCL specific: If the value of SI:*IGNORE-EOF-ON-TERMINAL-IO* is non-NIL, GCL + ignores the eof-character (usually ^D) on the terminal and the terminal never +@@ -487,7 +475,7 @@ NIL. + +

+
+-
Function: ADDRESS (object)
++
Function: ADDRESS (object)
+

Package:SI +

+

GCL specific: Returns the address of the OBJECT as a fixnum. The address of +@@ -497,7 +485,7 @@ an object depends on the version of GCL. + +

+
+-
Variable: *LISP-MAXPAGES*
++
Variable: *LISP-MAXPAGES*
+

Package:SI + GCL specific: Holds the maximum number of pages (1 page = 2048 bytes) for the + GCL process. The result of changing the value of SI:*LISP-MAXPAGES* is +@@ -506,7 +494,7 @@ unpredictable. + +

+
+-
Function: ARGC ()
++
Function: ARGC ()
+

Package:SI +

+

GCL specific: Returns the number of arguments on the command line that invoked +@@ -515,7 +503,7 @@ the GCL process. + +

+
+-
Function: NANI (fixnum)
++
Function: NANI (fixnum)
+

Package:SI +

+

GCL specific: Returns the object in the address FIXNUM. This function is +@@ -525,7 +513,7 @@ SI:NANI is quite dangerous and should be + +

+
+-
Variable: *NOTIFY-GBC*
++
Variable: *NOTIFY-GBC*
+

Package:SI + GCL specific: If the value of this variable is non-NIL, then the garbage + collector notifies that it begins to run whenever it is invoked. Otherwise, +@@ -534,7 +522,7 @@ garbage collection begins silently. + +

+
+-
Function: SAVE-SYSTEM (pathname)
++
Function: SAVE-SYSTEM (pathname)
+

Package:SI +

+

GCL specific: Saves the current GCL core imange into a program file specified +@@ -548,7 +536,7 @@ resetting io streams. It would not be + +

+
+-
Function: UNCATCH-BAD-SIGNALS ()
++
Function: UNCATCH-BAD-SIGNALS ()
+

Package:SI +

+

GCL/BSD specific: Undoes the effect of SI:CATCH-BAD-SIGNALS. +@@ -556,7 +544,7 @@ resetting io streams. It would not be + +

+
+-
Function: VS (i)
++
Function: VS (i)
+

Package:SI +

+

GCL specific: Returns the i-th entity in the value stack. +@@ -564,7 +552,7 @@ resetting io streams. It would not be + +

+
+-
Function: DISPLACED-ARRAY-P (array)
++
Function: DISPLACED-ARRAY-P (array)
+

Package:SI +

+

GCL specific: Returns T if the ARRAY is a displaced array; NIL otherwise. +@@ -572,7 +560,7 @@ resetting io streams. It would not be + +

+
+-
Function: ARGV (fixnum)
++
Function: ARGV (fixnum)
+

Package:SI +

+

GCL specific: Returns the FIXNUM-th argument on the command line that invoked +@@ -581,7 +569,7 @@ the GCL process. + +

+
+-
Variable: *DEFAULT-TIME-ZONE*
++
Variable: *DEFAULT-TIME-ZONE*
+

Package:SI + GCL specific: Holds the default time zone. The initial value of SI:*DEFAULT- + TIME-ZONE* is 6 (the time zone of Austin, Texas). +@@ -589,7 +577,7 @@ TIME-ZONE* is 6 (the time zone of Austin + +

+
+-
Function: GETENV (string)
++
Function: GETENV (string)
+

Package:SI +

+

GCL/UNIX specific: Returns the environment with the name STRING as a string; +@@ -598,7 +586,7 @@ if the environment specified by STRING i + +

+
+-
Function: FASLINK (file string)
++ +

Package:SI +

+

GCL/BSD specific: Loads the FASL file FILE while linking the object files and +@@ -624,7 +612,7 @@ you should of course add joe.o to the ab + +

+
+-
Function: TOP-LEVEL ()
++
Function: TOP-LEVEL ()
+

Package:SI +

+

GCL specific: Starts the standard top-level listner of GCL. When the GCL +@@ -636,7 +624,7 @@ redefined top-level. + +

+
+-
Function: FRS-VS (i)
++
Function: FRS-VS (i)
+

Package:SI +

+

GCL specific: Returns the value stack index of the i-th entity in the frame +@@ -645,7 +633,7 @@ stack. + +

+
+-
Function: WRITE-DEBUG-SYMBOLS (start file &key (main-file "/usr/local/schelter/xgcl/unixport/raw_gcl") (output-file "debug-symbols.o" ))
++
Function: WRITE-DEBUG-SYMBOLS (start file &key (main-file "/usr/local/schelter/xgcl/unixport/raw_gcl") (output-file "debug-symbols.o" ))
+

Package:SI +

+

Write out a file of debug-symbols using address START as the place +@@ -657,7 +645,7 @@ last is a keyword argument. + +

+
+-
Function: PROF (x y)
++
Function: PROF (x y)
+

Package:SI +

+

These functions in the SI package are GCL specific, and allow monitoring +@@ -688,7 +676,7 @@ the code. + +

+
+-
Function: CATCH-FATAL (i)
++
Function: CATCH-FATAL (i)
+

Package:SI +

+ +@@ -703,7 +691,7 @@ than zero. Catching can be turned off b + +
+
+-
Variable: *MULTIPLY-STACKS*
++
Variable: *MULTIPLY-STACKS*
+

Package:SI +

+

If this variable is set to a positive fixnum, then the next time through the +@@ -723,7 +711,7 @@ can leave you in an inconsistent state. + +

+
+-
Function: GBC-TIME (&optional x)
++
Function: GBC-TIME (&optional x)
+

Package:SI +

+

Sets the internal C variable gc_time to X if X is supplied and then +@@ -735,7 +723,7 @@ internal time units spent there. The i + +

+
+-
Function: FWRITE (string start count stream)
++
Function: FWRITE (string start count stream)
+

Package:SI +

+

Write from STRING starting at char START (or 0 if it is nil) COUNT characters +@@ -746,7 +734,7 @@ returned by FP-OUTPUT-STREAM. Returns n + +

+
+-
Function: FREAD (string start count stream)
++
Function: FREAD (string start count stream)
+

Package:SI +

+

Read characters into STRING starting at char START (or 0 if it is nil) COUNT +@@ -758,7 +746,7 @@ if it succeeds. + +

+
+-
Function: SGC-ON (&optional ON)
++
Function: SGC-ON (&optional ON)
+

Package:SI +

+

If ON is not nil then SGC (stratified garbage collection) is turned +@@ -797,7 +785,7 @@ cannot tell which pages have been writte + +

+
+-
Function: ALLOCATE-SGC (type min-pages max-pages percent-free)
++
Function: ALLOCATE-SGC (type min-pages max-pages percent-free)
+

Package:SI +

+

If MIN-PAGES is 0, then this type will not be swept by SGC. Otherwise +@@ -809,7 +797,7 @@ A list of the previous values for min, m + +

+
+-
Function: ALLOCATE-GROWTH (type min max percent percent-free)
++
Function: ALLOCATE-GROWTH (type min max percent percent-free)
+

Package:SI +

+ +@@ -845,7 +833,7 @@ would return the current values, but not + +
+
+-
Function: OPEN-FASD (stream direction eof-value table)
++
Function: OPEN-FASD (stream direction eof-value table)
+

Package:SI +

+

Given file STREAM open for input or output in DIRECTION, +@@ -880,7 +868,7 @@ and it makes bootstrapping more difficul + +

+
+-
Function: WRITE-FASD-TOP (X FASD-STREAM)
++
Function: WRITE-FASD-TOP (X FASD-STREAM)
+

Package:SI +

+

Write X to FASD-STREAM. +@@ -888,7 +876,7 @@ and it makes bootstrapping more difficul + +

+
+-
Function: READ-FASD-TOP (FASD-STREAM)
++
Function: READ-FASD-TOP (FASD-STREAM)
+

Package:SI +

+

Read the next object from FASD-STREAM. Return the eof-value of FASD-STREAM if we +@@ -898,7 +886,7 @@ stream causes an error. + +

+
+-
Function: CLOSE-FASD (FASD-STREAM)
++
Function: CLOSE-FASD (FASD-STREAM)
+

Package:SI +

+

On output write an eof marker to the associated file stream, and then +@@ -915,7 +903,7 @@ to OPEN-FASD the same file or file strea + +

+
+-
Function: FIND-SHARING-TOP (x table)
++
Function: FIND-SHARING-TOP (x table)
+

Package:SI +

+

X is any lisp object and TABLE is an eq hash table. This walks through X +@@ -927,14 +915,14 @@ file, which you wish to share structure. + +

+
+-
Variable: *LOAD-PATHNAME*
++
Variable: *LOAD-PATHNAME*
+

Package:SI + Load binds this to the pathname of the file being loaded. +

+ +
+
+-
Macro: DEFINE-INLINE-FUNCTION (fname vars &body body)
++
Macro: DEFINE-INLINE-FUNCTION (fname vars &body body)
+

Package:SI +

+

This is equivalent to defun except that VARS may not contain +@@ -948,7 +936,7 @@ Example: + +

+
+-
Macro: DEFINE-COMPILER-MACRO (fname vars &body body)
++
Macro: DEFINE-COMPILER-MACRO (fname vars &body body)
+

Package:SI +

+

FNAME may be the name of a function, but at compile time the macro +@@ -959,7 +947,7 @@ expansion given by this is used. + +

+
+-
Function: DBL ()
++
Function: DBL ()
+

Package:SI +

+

Invoke a top level loop, in which debug commands may be entered. +@@ -970,7 +958,7 @@ See SOURCE-LEVEL-DEBUG + +

+
+-
Function: NLOAD (file)
++
Function: NLOAD (file)
+

Package:SI +

+

Load a file with the readtable bound to a special readtable, which +@@ -980,7 +968,7 @@ see SOURCE-LEVEL-DEBUG + +

+
+-
Function: BREAK-FUNCTION (function &optional line absolute)
++
Function: BREAK-FUNCTION (function &optional line absolute)
+

Package:SI +

+

Set a breakpoint for a FUNCTION at LINE if the function has source +@@ -991,7 +979,7 @@ emacs command. + +

+
+-
Function: XDR-OPEN (stream)
++
Function: XDR-OPEN (stream)
+

Package:SI +

+

Returns an object suitable for passing to XDR-READ if the stream +@@ -1003,7 +991,7 @@ or si::fp-output-stream would act as the + +

+
+-
Function: FP-INPUT-STREAM (stream)
++
Function: FP-INPUT-STREAM (stream)
+

Package:SI +

+

Return a unix stream for input associated to STREAM if possible, +@@ -1012,7 +1000,7 @@ otherwise return nil. + +

+
+-
Function: FP-OUTPUT-STREAM (stream)
++
Function: FP-OUTPUT-STREAM (stream)
+

Package:SI +

+

Return a unix stream for output associated to STREAM if possible, +@@ -1022,7 +1010,7 @@ otherwise return nil. + +

+
+-
Function: XDR-READ (stream element)
++
Function: XDR-READ (stream element)
+

Package:SI +

+

Read one item from STREAM of type the type of ELEMENT. The representation +@@ -1032,7 +1020,7 @@ used by the basic unix rpc calls. + +

+
+-
Function: XDR-WRITE (stream element)
++
Function: XDR-WRITE (stream element)
+

Package:SI +

+

Write to STREAM the given ELEMENT. +@@ -1042,7 +1030,7 @@ used by the basic unix rpc calls. + +

+
+-
Variable: *TOP-LEVEL-HOOK*
++
Variable: *TOP-LEVEL-HOOK*
+

Package:SI + If this variable is has a function as its value at start up time, then + it is run immediately after the init.lsp file is loaded. This is useful +@@ -1051,7 +1039,7 @@ for starting up an alternate top level l + +

+
+-
Function: RUN-PROCESS (string arglist)
++
Function: RUN-PROCESS (string arglist)
+

Package:SI +

+ +@@ -1067,13 +1055,13 @@ if you call it too many times. +
+ +
+-
Variable: *CASE-FOLD-SEARCH*
++
Variable: *CASE-FOLD-SEARCH*
+

Package: SI + Non nil means that a string-match should ignore case +

+ +
+-
Function: STRING-MATCH (pattern string &optional start end)
++
Function: STRING-MATCH (pattern string &optional start end)
+

Package: SI + Match regexp PATTERN in STRING starting in string starting at START + and ending at END. Return -1 if match not found, otherwise +@@ -1083,24 +1071,24 @@ the matches, to be obtained with match-b + If it already contains such an array, then the contents of it will + be over written. +

+-

The form of a regexp pattern is discussed in See Regular Expressions. ++

The form of a regexp pattern is discussed in See Regular Expressions. +

+
+ +
+-
Function: MATCH-BEGINNING (index)
++
Function: MATCH-BEGINNING (index)
+

Returns the beginning of the I’th match from the previous STRING-MATCH, + where the 0th is for the whole regexp and the subsequent ones match parenthetical expressions. -1 is returned if there is no match, or if the *match-data* + vector is not a fixnum array. +

+ +
+-
Function: MATCH-END (index)
++
Function: MATCH-END (index)
+

Returns the end of the I’th match from the previous STRING-MATCH +

+ +
+-
Function: SOCKET (port &key host server async myaddr myport daemon)
++
Function: SOCKET (port &key host server async myaddr myport daemon)
+
+

Establishes a socket connection to the specified PORT under a variety + of circumstances. +@@ -1131,7 +1119,7 @@ and call the SERVER function on the stre +

+ +
+-
Function: ACCEPT (stream)
++
Function: ACCEPT (stream)
+
+

Creates a new two-way stream to handle an individual incoming + connection to STREAM, which must have been created with the SOCKET +@@ -1143,14 +1131,14 @@ will be called automatically as needed. +

+ + +- + + +
+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/Type.html ++++ gcl-2.6.12/info/gcl-si/Type.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: Type ++ ++Type (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

14 Type

++

14 Type

+ +
+-
Function: COERCE (x type)
++
Function: COERCE (x type)
+

Package:LISP +

+

Coerces X to an object of the type TYPE. +@@ -68,7 +56,7 @@ Next: Function: TYPE-OF (x) ++

Function: TYPE-OF (x)
+

Package:LISP +

+

Returns the type of X. +@@ -77,7 +65,7 @@ Next: Function: CONSTANTP (symbol) ++

Function: CONSTANTP (symbol)
+

Package:LISP +

+

Returns T if the variable named by SYMBOL is a constant; NIL otherwise. +@@ -86,7 +74,7 @@ Next: Function: TYPEP (x type) ++

Function: TYPEP (x type)
+

Package:LISP +

+

Returns T if X is of the type TYPE; NIL otherwise. +@@ -95,7 +83,7 @@ Next: Function: COMMONP (x) ++

Function: COMMONP (x)
+

Package:LISP +

+

Returns T if X is a Common Lisp object; NIL otherwise. +@@ -104,7 +92,7 @@ Next: Function: SUBTYPEP (type1 type2) ++

Function: SUBTYPEP (type1 type2)
+

Package:LISP +

+

Returns T if TYPE1 is a subtype of TYPE2; NIL otherwise. If it could not +@@ -115,7 +103,7 @@ is T. +

+ +
+-
Macro: CHECK-TYPE
++
Macro: CHECK-TYPE
+

Package:LISP +

+

Syntax: +@@ -129,7 +117,7 @@ is T. +

+ +
+-
Macro: ASSERT
++
Macro: ASSERT
+

Package:LISP +

+

Syntax: +@@ -144,7 +132,7 @@ used as the error message. ARGs are arg +

+ +
+-
Macro: DEFTYPE
++
Macro: DEFTYPE
+

Package:LISP +

+

Syntax: +@@ -168,7 +156,7 @@ supplied, is saved as the TYPE doc of NA +

+ +
+-
Declaration: DYNAMIC-EXTENT
++
Declaration: DYNAMIC-EXTENT
+

Package:LISP + Declaration to allow locals to be cons’d on the C stack. + For example +@@ -188,7 +176,7 @@ also are handled on the stack, for dynam +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/User-Interface.html ++++ gcl-2.6.12/info/gcl-si/User-Interface.html +@@ -1,46 +1,36 @@ + + +- ++ + +-GCL SI Manual: User Interface ++ ++User Interface (GCL SI Manual) + +- +- ++ ++ + + + +- +- +- ++ ++ + +- +- +- ++ ++ ++ + +@@ -48,18 +38,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+
+- +-

12 User Interface

++

12 User Interface

+ +
+-
Special Variable: -
++
Special Variable: -
+

Package:LISP + Holds the top-level form that GCL is currently evaluating. +

+@@ -67,7 +55,7 @@ Holds the top-level form that GCL is cur +
+ +
+-
Function: - (number &rest more-numbers)
++
Function: - (number &rest more-numbers)
+

Package:LISP +

+

Subtracts the second and all subsequent NUMBERs from the first NUMBER. +@@ -77,7 +65,7 @@ With one arg, negates it. +

+ +
+-
Macro: UNTRACE
++
Macro: UNTRACE
+

Package:LISP +

+

Syntax: +@@ -92,7 +80,7 @@ untraces all functions. +

+ +
+-
Variable: ***
++
Variable: ***
+

Package:LISP + Gets the previous value of ** when GCL evaluates a top-level form. +

+@@ -100,7 +88,7 @@ Gets the previous value of ** when GCL e +
+ +
+-
Function: MAKE-STRING-INPUT-STREAM (string &optional (start 0) (end (length string)))
++
Function: MAKE-STRING-INPUT-STREAM (string &optional (start 0) (end (length string)))
+

Package:LISP +

+

Returns an input stream which will supply the characters of String between +@@ -110,7 +98,7 @@ Start and End in order. +

+ +
+-
Macro: STEP
++
Macro: STEP
+

Package:LISP +

+

Syntax: +@@ -124,7 +112,7 @@ Start and End in order. +

+ +
+-
Variable: *BREAK-ENABLE*
++
Variable: *BREAK-ENABLE*
+

Package:LISP + GCL specific: When an error occurrs, control enters to the break loop only + if the value of this variable is non-NIL. +@@ -133,7 +121,7 @@ if the value of this variable is non-NIL +

+ +
+-
Special Variable: /
++
Special Variable: /
+

Package:LISP + Holds a list of the values of the last top-level form. +

+@@ -141,7 +129,7 @@ Holds a list of the values of the last t +
+ +
+-
Function: DESCRIBE (x)
++
Function: DESCRIBE (x)
+

Package:LISP +

+

Prints a description of the object X. +@@ -150,7 +138,7 @@ Holds a list of the values of the last t +

+ +
+-
Function: ED (&optional x)
++
Function: ED (&optional x)
+

Package:LISP +

+

Invokes the editor. The action depends on the version of GCL. +@@ -159,7 +147,7 @@ Holds a list of the values of the last t +

+ +
+-
Variable: *DEBUG-IO*
++
Variable: *DEBUG-IO*
+

Package:LISP + Holds the I/O stream used by the GCL debugger. +

+@@ -167,7 +155,7 @@ Holds the I/O stream used by the GCL deb +
+ +
+-
Variable: *BREAK-ON-WARNINGS*
++
Variable: *BREAK-ON-WARNINGS*
+

Package:LISP + When the function WARN is called, control enters to the break loop only + if the value of this varialbe is non-NIL. +@@ -176,7 +164,7 @@ if the value of this varialbe is non-NIL +

+ +
+-
Function: CERROR (continue-format-string error-format-string &rest args)
++
Function: CERROR (continue-format-string error-format-string &rest args)
+

Package:LISP +

+

Signals a correctable error. +@@ -185,7 +173,7 @@ if the value of this varialbe is non-NIL +

+ +
+-
Variable: **
++
Variable: **
+

Package:LISP + Gets the previous value of * when GCL evaluates a top-level form. +

+@@ -193,7 +181,7 @@ Gets the previous value of * when GCL ev +
+ +
+-
Special Variable: +++
++
Special Variable: +++
+

Package:LISP + Gets the previous value of ++ when GCL evaluates a top-level form. +

+@@ -201,7 +189,7 @@ Gets the previous value of ++ when GCL e +
+ +
+-
Function: INSPECT (x)
++
Function: INSPECT (x)
+

Package:LISP +

+

Shows the information about the object X in an interactive manner +@@ -210,7 +198,7 @@ Gets the previous value of ++ when GCL e +

+ +
+-
Special Variable: //
++
Special Variable: //
+

Package:LISP + Gets the previous value of / when GCL evaluates a top-level form. +

+@@ -218,7 +206,7 @@ Gets the previous value of / when GCL ev +
+ +
+-
Variable: *TRACE-OUTPUT*
++
Variable: *TRACE-OUTPUT*
+

Package:LISP + The trace output stream. +

+@@ -226,7 +214,7 @@ The trace output stream. +
+ +
+-
Special Variable: ++
++
Special Variable: ++
+

Package:LISP + Gets the previous value of + when GCL evaluates a top-level form. +

+@@ -234,7 +222,7 @@ Gets the previous value of + when GCL ev +
+ +
+-
Variable: *ERROR-OUTPUT*
++
Variable: *ERROR-OUTPUT*
+

Package:LISP + Holds the output stream for error messages. +

+@@ -242,7 +230,7 @@ Holds the output stream for error messag +
+ +
+-
Function: DRIBBLE (&optional pathname)
++
Function: DRIBBLE (&optional pathname)
+

Package:LISP +

+

If PATHNAME is given, begins to record the interaction to the specified file. +@@ -252,7 +240,7 @@ If PATHNAME is not given, ends the recor +

+ +
+-
Variable: *
++
Variable: *
+

Package:LISP + Holds the value of the last top-level form. +

+@@ -260,7 +248,7 @@ Holds the value of the last top-level fo +
+ +
+-
Special Variable: ///
++
Special Variable: ///
+

Package:LISP + Gets the previous value of // when GCL evaluates a top-level form. +

+@@ -268,7 +256,7 @@ Gets the previous value of // when GCL e +
+ +
+-
Function: WARN (format-string &rest args)
++
Function: WARN (format-string &rest args)
+

Package:LISP +

+

Formats FORMAT-STRING and ARGs to *ERROR-OUTPUT* as a warning message. +@@ -277,7 +265,7 @@ Gets the previous value of // when GCL e +

+ +
+-
Function: BREAK (&optional (format-string nil) &rest args)
++
Function: BREAK (&optional (format-string nil) &rest args)
+

Package:LISP +

+

Enters a break loop. If FORMAT-STRING is non-NIL, formats FORMAT-STRING +@@ -288,7 +276,7 @@ Typing :HELP at the break loop will list +

+ +
+-
Special Variable: +
++
Special Variable: +
+

Package:LISP + Holds the last top-level form. +

+@@ -296,7 +284,7 @@ Holds the last top-level form. +
+ +
+-
Macro: TRACE
++
Macro: TRACE
+

Package:LISP +

+

Syntax: +@@ -476,7 +464,7 @@ evaluated, and the call is not traced. +


+
+

+-Next: , Previous: , Up: Top   [Contents][Index]

++Next: , Previous: , Up: Top   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-si/index.html ++++ gcl-2.6.12/info/gcl-si/index.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL SI Manual: Top ++ ++Top (GCL SI Manual) + +- +- ++ ++ + + + +- + +- ++ + + +- ++ + +@@ -47,7 +37,7 @@ ul.no-bullet {list-style: none} + + + +- ++ + + + +@@ -55,103 +45,107 @@ ul.no-bullet {list-style: none} + + + +- +-
++
+

+-Next: , Previous: , Up: (dir)   [Contents][Index]

++Next: , Previous: , Up: (dir)   [Contents][Index]

+
+
+- +- ++ + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- + + + + +- + +- +- + + +
+
+

+-Next: , Previous: , Up: (dir)   [Contents][Index]

++Next: , Previous: , Up: (dir)   [Contents][Index]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk.info ++++ gcl-2.6.12/info/gcl-tk.info +@@ -1,4 +1,4 @@ +-This is gcl-tk.info, produced by makeinfo version 5.2 from gcl-tk.texi. ++This is gcl-tk.info, produced by makeinfo version 6.7 from gcl-tk.texi. + + INFO-DIR-SECTION GNU Common Lisp + START-INFO-DIR-ENTRY +@@ -12,61 +12,66 @@ This is a Texinfo GCL TK Manual +  + Indirect: + gcl-tk.info-1: 258 +-gcl-tk.info-2: 301240 ++gcl-tk.info-2: 300905 +  + Tag Table: + (Indirect) + Node: Top258 +-Node: General1286 +-Node: Introduction1589 +-Node: Getting Started3086 +-Node: Common Features of Widgets4688 +-Node: Return Values8350 +-Node: Argument Lists12408 +-Node: Lisp Functions Invoked from Graphics15840 +-Node: Linked Variables20893 +-Node: tkconnect24626 +-Node: Widgets26553 +-Node: button26886 +-Node: listbox33607 +-Node: scale42026 +-Node: canvas49273 +-Node: menu109974 +-Node: scrollbar129133 +-Node: checkbutton136422 +-Node: menubutton146160 +-Node: text154138 +-Node: entry188279 +-Node: message198621 +-Node: frame204579 +-Node: label208582 +-Node: radiobutton211997 +-Node: toplevel221434 +-Node: Control225276 +-Node: after225730 +-Node: bind226886 +-Node: destroy242569 +-Node: tk-dialog243154 +-Node: exit244969 +-Node: focus245646 +-Node: grab250361 +-Node: tk-listbox-single-select255029 +-Node: lower255933 +-Node: tk-menu-bar256811 +-Node: option262479 +-Node: options265561 +-Node: pack-old283145 +-Node: pack290905 +-Node: place301241 +-Node: raise310062 +-Node: selection310921 +-Node: send316127 +-Node: tk317948 +-Node: tkerror319785 +-Node: tkvars321509 +-Node: tkwait323777 +-Node: update325261 +-Node: winfo326783 +-Node: wm335226 ++Node: General1087 ++Node: Introduction1374 ++Node: Getting Started2871 ++Node: Common Features of Widgets4473 ++Node: Return Values8135 ++Node: Argument Lists12193 ++Node: Lisp Functions Invoked from Graphics15625 ++Node: Linked Variables20678 ++Node: tkconnect24411 ++Node: Widgets26338 ++Node: button26626 ++Node: listbox33347 ++Node: scale41766 ++Node: canvas49013 ++Node: menu109714 ++Node: scrollbar128873 ++Node: checkbutton136162 ++Node: menubutton145900 ++Node: text153878 ++Node: entry188019 ++Node: message198361 ++Node: frame204319 ++Node: label208322 ++Node: radiobutton211737 ++Node: toplevel221174 ++Node: Control225016 ++Node: after225395 ++Node: bind226551 ++Node: destroy242234 ++Node: tk-dialog242819 ++Node: exit244634 ++Node: focus245311 ++Node: grab250026 ++Node: tk-listbox-single-select254694 ++Node: lower255598 ++Node: tk-menu-bar256476 ++Node: option262144 ++Node: options265226 ++Node: pack-old282810 ++Node: pack290570 ++Node: place300906 ++Node: raise309727 ++Node: selection310586 ++Node: send315792 ++Node: tk317613 ++Node: tkerror319450 ++Node: tkvars321174 ++Node: tkwait323442 ++Node: update324926 ++Node: winfo326448 ++Node: wm334891 +  + End Tag Table ++ ++ ++Local Variables: ++coding: utf-8 ++End: +--- gcl-2.6.12.orig/info/gcl-tk.info-1 ++++ gcl-2.6.12/info/gcl-tk.info-1 +@@ -1,4 +1,4 @@ +-This is gcl-tk.info, produced by makeinfo version 5.2 from gcl-tk.texi. ++This is gcl-tk.info, produced by makeinfo version 6.7 from gcl-tk.texi. + + INFO-DIR-SECTION GNU Common Lisp + START-INFO-DIR-ENTRY +@@ -14,68 +14,68 @@ File: gcl-tk.info, Node: Top, Next: Ge + + * Menu: + +-* General:: +-* Widgets:: +-* Control:: ++* General:: ++* Widgets:: ++* Control:: + + -- The Detailed Node Listing -- + + General + +-* Introduction:: +-* Getting Started:: +-* Common Features of Widgets:: +-* Return Values:: +-* Argument Lists:: +-* Lisp Functions Invoked from Graphics:: +-* Linked Variables:: +-* tkconnect:: ++* Introduction:: ++* Getting Started:: ++* Common Features of Widgets:: ++* Return Values:: ++* Argument Lists:: ++* Lisp Functions Invoked from Graphics:: ++* Linked Variables:: ++* tkconnect:: + + Widgets + +-* button:: +-* listbox:: +-* scale:: +-* canvas:: +-* menu:: +-* scrollbar:: +-* checkbutton:: +-* menubutton:: +-* text:: +-* entry:: +-* message:: +-* frame:: +-* label:: +-* radiobutton:: +-* toplevel:: ++* button:: ++* listbox:: ++* scale:: ++* canvas:: ++* menu:: ++* scrollbar:: ++* checkbutton:: ++* menubutton:: ++* text:: ++* entry:: ++* message:: ++* frame:: ++* label:: ++* radiobutton:: ++* toplevel:: + + Control + +-* after:: +-* bind:: +-* destroy:: +-* tk-dialog:: +-* exit:: +-* focus:: +-* grab:: +-* tk-listbox-single-select:: +-* lower:: +-* tk-menu-bar:: +-* option:: +-* options:: +-* pack-old:: +-* pack:: +-* place:: +-* raise:: +-* selection:: +-* send:: +-* tk:: +-* tkerror:: +-* tkvars:: +-* tkwait:: +-* update:: +-* winfo:: +-* wm:: ++* after:: ++* bind:: ++* destroy:: ++* tk-dialog:: ++* exit:: ++* focus:: ++* grab:: ++* tk-listbox-single-select:: ++* lower:: ++* tk-menu-bar:: ++* option:: ++* options:: ++* pack-old:: ++* pack:: ++* place:: ++* raise:: ++* selection:: ++* send:: ++* tk:: ++* tkerror:: ++* tkvars:: ++* tkwait:: ++* update:: ++* winfo:: ++* wm:: + +  + File: gcl-tk.info, Node: General, Next: Widgets, Prev: Top, Up: Top +@@ -85,14 +85,14 @@ File: gcl-tk.info, Node: General, Next + + * Menu: + +-* Introduction:: +-* Getting Started:: +-* Common Features of Widgets:: +-* Return Values:: +-* Argument Lists:: +-* Lisp Functions Invoked from Graphics:: +-* Linked Variables:: +-* tkconnect:: ++* Introduction:: ++* Getting Started:: ++* Common Features of Widgets:: ++* Return Values:: ++* Argument Lists:: ++* Lisp Functions Invoked from Graphics:: ++* Linked Variables:: ++* tkconnect:: + +  + File: gcl-tk.info, Node: Introduction, Next: Getting Started, Prev: General, Up: General +@@ -680,21 +680,21 @@ File: gcl-tk.info, Node: Widgets, Next + + * Menu: + +-* button:: +-* listbox:: +-* scale:: +-* canvas:: +-* menu:: +-* scrollbar:: +-* checkbutton:: +-* menubutton:: +-* text:: +-* entry:: +-* message:: +-* frame:: +-* label:: +-* radiobutton:: +-* toplevel:: ++* button:: ++* listbox:: ++* scale:: ++* canvas:: ++* menu:: ++* scrollbar:: ++* checkbutton:: ++* menubutton:: ++* text:: ++* entry:: ++* message:: ++* frame:: ++* label:: ++* radiobutton:: ++* toplevel:: + +  + File: gcl-tk.info, Node: button, Next: listbox, Prev: Widgets, Up: Widgets +@@ -4877,31 +4877,31 @@ File: gcl-tk.info, Node: Control, Prev + + * Menu: + +-* after:: +-* bind:: +-* destroy:: +-* tk-dialog:: +-* exit:: +-* focus:: +-* grab:: +-* tk-listbox-single-select:: +-* lower:: +-* tk-menu-bar:: +-* option:: +-* options:: +-* pack-old:: +-* pack:: +-* place:: +-* raise:: +-* selection:: +-* send:: +-* tk:: +-* tkerror:: +-* tkvars:: +-* tkwait:: +-* update:: +-* winfo:: +-* wm:: ++* after:: ++* bind:: ++* destroy:: ++* tk-dialog:: ++* exit:: ++* focus:: ++* grab:: ++* tk-listbox-single-select:: ++* lower:: ++* tk-menu-bar:: ++* option:: ++* options:: ++* pack-old:: ++* pack:: ++* place:: ++* raise:: ++* selection:: ++* send:: ++* tk:: ++* tkerror:: ++* tkvars:: ++* tkwait:: ++* update:: ++* winfo:: ++* wm:: + +  + File: gcl-tk.info, Node: after, Next: bind, Prev: Control, Up: Control +--- gcl-2.6.12.orig/info/gcl-tk.info-2 ++++ gcl-2.6.12/info/gcl-tk.info-2 +@@ -1,4 +1,4 @@ +-This is gcl-tk.info, produced by makeinfo version 5.2 from gcl-tk.texi. ++This is gcl-tk.info, produced by makeinfo version 6.7 from gcl-tk.texi. + + INFO-DIR-SECTION GNU Common Lisp + START-INFO-DIR-ENTRY +--- gcl-2.6.12.orig/info/gcl-tk/Argument-Lists.html ++++ gcl-2.6.12/info/gcl-tk/Argument-Lists.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Argument Lists ++ ++Argument Lists (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,18 +37,15 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

1.5 Argument Lists

++

1.5 Argument Lists

+ +- +-

1.5.1 Widget Functions

++

1.5.1 Widget Functions

+ +

The rule is that the first argument for a widget function is a keyword, + called the option. The pattern of the remaining arguments depends +@@ -75,18 +62,18 @@ keyword/value pair list which is used in + button widget, the other valid options are :deactivate, + :flash, and :invoke. To find these, since + .hello was constructed with the button constructor, you +-should see See button. ++should see See button. + The argument pattern for other options depends completely on the option + and the widget function. + For example if .scrollbar is a scroll bar window, then the option + :set must be followed by 4 numeric arguments, which indicate how +-the scrollbar should be displayed, see See scrollbar. ++the scrollbar should be displayed, see See scrollbar. +

+
+
(.scrollbar :set a1 a2 a3 a4)
+ 
+ +-

If on the other hand .scale is a scale (see scale), then we have ++

If on the other hand .scale is a scale (see scale), then we have +

+
+
(.scale :set a1 )
+@@ -94,8 +81,7 @@ the scrollbar should be displayed, see S
+ 

only one numeric argument should be supplied, in order to position the + scale. +

+- +-

1.5.2 Widget Constructor Argument Lists

++

1.5.2 Widget Constructor Argument Lists

+ +

These are +

+@@ -104,10 +90,9 @@ scale. +
+ +

to create the widget whose name is pathname. The possible keywords +-allowed are specified in the corresponding section of See Widgets. ++allowed are specified in the corresponding section of See Widgets. +

+- +-

1.5.3 Concatenation Using ‘:’ in Argument List

++

1.5.3 Concatenation Using ‘:’ in Argument List

+ +

What has been said so far about arguments is not quite true. A + special string concatenation construction is allowed in argument lists +@@ -151,7 +136,7 @@ monitor usage of conses by other program +


+ + + +--- gcl-2.6.12.orig/info/gcl-tk/Common-Features-of-Widgets.html ++++ gcl-2.6.12/info/gcl-tk/Common-Features-of-Widgets.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Common Features of Widgets ++ ++Common Features of Widgets (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: General   [Contents]

++Next: , Previous: , Up: General   [Contents]

+
+
+- +-

1.3 Common Features of Widgets

++

1.3 Common Features of Widgets

+ +

A widget is a lisp symbol which has a function binding. The + first argument is always a keyword and is called the option. +@@ -67,7 +55,7 @@ of the widget. +

+

A widget is created by means of a widget constructor, of + which there are currently 15, each of them appearing as the title of a +-section in Widgets. They live in the "TK" package, and for ++section in Widgets. They live in the "TK" package, and for + the moment we will assume we have switched to this package. Thus for + example button is such a widget constructor function. Of course + this is lisp, and you can make your own widget constructors, but when +@@ -87,7 +75,7 @@ are sometimes referred to as pathname + parent widget .hello might be called .hello.joe, and + a child of this last might be .hello.joe.bar. The parent of + everyone is called . . Multiple top level windows are created +-using the toplevel command (see toplevel). ++using the toplevel command (see toplevel). +

+

The widget constructor functions take keyword and value pairs, which + allow you to specify attributes at the time of creation: +@@ -154,7 +142,7 @@ messages you can do +


+
+

+-Next: , Previous: , Up: General   [Contents]

++Next: , Previous: , Up: General   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/Control.html ++++ gcl-2.6.12/info/gcl-tk/Control.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Control ++ ++Control (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,66 +37,64 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Previous: , Up: Top   [Contents]

++Previous: , Up: Top   [Contents]

+
+
+- +-

3 Control

++

3 Control

+ + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + + +--- gcl-2.6.12.orig/info/gcl-tk/General.html ++++ gcl-2.6.12/info/gcl-tk/General.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: General ++ ++General (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,32 +37,30 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents]

++Next: , Previous: , Up: Top   [Contents]

+
+
+- +-

1 General

++

1 General

+ + +- +- +- +- +- +- +- +- + + +--- gcl-2.6.12.orig/info/gcl-tk/Getting-Started.html ++++ gcl-2.6.12/info/gcl-tk/Getting-Started.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Getting Started ++ ++Getting Started (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: General   [Contents]

++Next: , Previous: , Up: General   [Contents]

+
+
+- +-

1.2 Getting Started

++

1.2 Getting Started

+ +

Once GCL has been properly installed you should be able to do the + following simple example: +@@ -69,7 +57,7 @@ following simple example: +

+

We first switched to the "TK" package, so that functions like button + and pack would be found. +-After doing the tkconnect, a window should appear on your screen, see See tkconnect. ++After doing the tkconnect, a window should appear on your screen, see See tkconnect. + The invocation of the function button creates a new function + called .hello which is a widget function. It is then + made visible in the window by using the pack function. +--- gcl-2.6.12.orig/info/gcl-tk/Introduction.html ++++ gcl-2.6.12/info/gcl-tk/Introduction.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Introduction ++ ++Introduction (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-

++ ++
+

+-Next: , Previous: , Up: General   [Contents]

++Next: , Previous: , Up: General   [Contents]

+
+
+- +-

1.1 Introduction

++

1.1 Introduction

+ +

GCL-TK is a windowing interface for GNU Common Lisp. It provides the + functionality of the TK widget set, which in turn implements a widget +@@ -81,8 +69,8 @@ libraries, and is on the order of 150Kby +

This chapter describes some of the common features of the command + structure of widgets, and of control functions. The actual functions + for construction of windows +-are discussed in Widgets, and more general functions +-for making them appear, lowering them, querying about them in Control. ++are discussed in Widgets, and more general functions ++for making them appear, lowering them, querying about them in Control. +

+ + +--- gcl-2.6.12.orig/info/gcl-tk/Linked-Variables.html ++++ gcl-2.6.12/info/gcl-tk/Linked-Variables.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Linked Variables ++ ++Linked Variables (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

1.7 Linked Variables

++

1.7 Linked Variables

+ +

It is possible to link lisp variables to TK variables. In general + when the TK variable is changed, by for instance clicking on a +@@ -109,7 +97,7 @@ always a variable containing a string. +

The first two examples are the same in that the default variable type + for a checkbutton is boolean. Notice that the specification of a + variable type is by (type variable). The types which are +-permissible are those which have coercion-fucntions, See Return Values. In the first example a variable *joe* will be linked, and ++permissible are those which have coercion-fucntions, See Return Values. In the first example a variable *joe* will be linked, and + its default initial value will be set to nil, since the default initial + state of the check button is off, and the default off value is nil. + Actually on the TK side, the corresponding boolean values are "1" +@@ -120,7 +108,7 @@ and nil. + type is t). The initial value will be made to be -1, + since the checkbutton is off. Clicking on .checkbutton3 will + result in the value of *debug* being changed to 100, and the light +-in the button will be toggled to on, See checkbutton. You may ++in the button will be toggled to on, See checkbutton. You may + set the variable to be another value besides 100. +

+

You may also call +@@ -152,7 +140,7 @@ call link-variable. +


+ + + +--- gcl-2.6.12.orig/info/gcl-tk/Lisp-Functions-Invoked-from-Graphics.html ++++ gcl-2.6.12/info/gcl-tk/Lisp-Functions-Invoked-from-Graphics.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Lisp Functions Invoked from Graphics ++ ++Lisp Functions Invoked from Graphics (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: General   [Contents]

++Next: , Previous: , Up: General   [Contents]

+
+
+- +-

1.6 Lisp Functions Invoked from Graphics

++

1.6 Lisp Functions Invoked from Graphics

+ + +

It is possible to make certain areas of a window mouse sensitive, +@@ -106,7 +94,7 @@ this will be done when the command is in +

+ +

and in addition bind takes a command as its third argument, +-see See bind. ++see See bind. +

+

Below we give three different examples using the 3 possibilities for + a command: functionp, string, and lisp form. They all accomplish +@@ -123,7 +111,7 @@ so that something changes, the function + arguments giving the totalsize of the text, maximum number of units + the window can display, the index of the top unit, and finally the + index of the bottom unit. What these arguments are is specific +-to the widget listbox and is documented See listbox. ++to the widget listbox and is documented See listbox. +

+

joe might be used to do anything, but a common usage is to have + joe alter the position of some other window, such as a scroll +@@ -170,11 +158,11 @@ scrollbar setting using a lisp form is: +

+ +

The bind command and :bind keyword, have an additional +-wrinkle, see See bind. These are associated to an event in a ++wrinkle, see See bind. These are associated to an event in a + particular window, and the lisp function or form to be evaled must have + access to that information. For example the x y position, the window + name, the key pressed, etc. This is done via percent symbols which +-are specified, see See bind. ++are specified, see See bind. +

+
+
(bind "Entry" "<Control-KeyPress>" '(emacs-move  %W %A ))
+@@ -203,7 +191,7 @@ function
+ 
+
+

+-Next: , Previous: , Up: General   [Contents]

++Next: , Previous: , Up: General   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/Return-Values.html ++++ gcl-2.6.12/info/gcl-tk/Return-Values.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Return Values ++ ++Return Values (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,18 +37,15 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++ +
+- +-

1.4 Return Values

++

1.4 Return Values

+ +- +-

1.4.1 Widget Constructor Return Values

++

1.4.1 Widget Constructor Return Values

+ +

On successful completion, the widget constructor functions return the + symbol passed in as the first argument. It will now have a functional +@@ -66,8 +53,7 @@ binding. It is an error to pass in a s + to a widget, without first calling the destroy command. On failure, + an error is signalled. +

+- +-

1.4.2 Widget Return Values

++

1.4.2 Widget Return Values

+ +

The widget functions themselves, do not normally return any value. + Indeed the lisp process does not wait for them to return, but merely +@@ -154,10 +140,9 @@ lisp object, and whose cdr + to send to the graphics server. Often the two functions are inverse + functions one of the other up to equal. +

+- +-

1.4.3 Control Function Return Values

++

1.4.3 Control Function Return Values

+ +-

The control funcions (see Control) do not return a value ++

The control funcions (see Control) do not return a value + or wait unless requested to do so, using the :return keyword. + The types and method of specification are the same as for the + Widget Functions in the previous section. +@@ -172,7 +157,7 @@ wide. +


+ + + +--- gcl-2.6.12.orig/info/gcl-tk/Widgets.html ++++ gcl-2.6.12/info/gcl-tk/Widgets.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: Widgets ++ ++Widgets (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,46 +37,44 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Top   [Contents]

++Next: , Previous: , Up: Top   [Contents]

+
+
+- +-

2 Widgets

++

2 Widgets

+ + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + + +--- gcl-2.6.12.orig/info/gcl-tk/after.html ++++ gcl-2.6.12/info/gcl-tk/after.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: after ++ ++after (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.1 after

++

3.1 after

+ +

after - Execute a command after a time delay +-

+-

Synopsis

++

Synopsis

+

after ms ?arg1 arg2 arg3 ...? +

+- +-

Description

++

Description

+ +

This command is used to delay execution of the program or to execute + a command in background after a delay. The ms argument gives +@@ -85,10 +71,9 @@ If an error occurs while executing the d +

+

The after command always returns an empty string. +

+-

See tkerror. ++

See tkerror. +

+- +-

Keywords

++

Keywords

+

delay, sleep, time +

+ +--- gcl-2.6.12.orig/info/gcl-tk/bind.html ++++ gcl-2.6.12/info/gcl-tk/bind.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: bind ++ ++bind (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,26 +37,22 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.2 bind

++

3.2 bind

+ +

bind \- Arrange for X events to invoke Tcl commands +-

+-

Synopsis

++

Synopsis

+

bind windowSpec
+
bind windowSpec sequence
+
bind windowSpec sequence command
+ bind windowSpec sequence +command +

+- +-

Description

++

Description

+ +

If all three arguments are specified, bind will + arrange for command (a Tcl +@@ -473,15 +459,14 @@ the last one is used for purposes of mat + The command will be executed at global level (outside the context + of any Tcl procedure). +

+-

See tkerror. ++

See tkerror. +

+- +-

Keywords

++

Keywords

+

form, manual +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/button.html ++++ gcl-2.6.12/info/gcl-tk/button.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: button ++ ++button (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.1 button

++

2.1 button

+ +

button \- Create and manipulate button widgets +-

+-

Synopsis

++

Synopsis

+

button pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -73,9 +59,8 @@ background disabledForeground pa +
+ + +-

See options, for more information. +-

+-

Arguments for Button

++

See options, for more information. ++

Arguments for Button

+ + +
+@@ -137,8 +122,7 @@ from the size of the bitmap or text bein +

+
+ +- +-

Description

++

Description

+ +

The button command creates a new window (given by the + pathName argument) and makes it into a button widget. +@@ -162,8 +146,7 @@ button (by pressing mouse button 1 with + button), then the Tcl command specified in the :command + option is invoked. +

+- +-

A Button Widget’s Arguments

++

A Button Widget’s Arguments

+ +

The button command creates a new Tcl command whose + name is pathName. This +@@ -223,8 +206,7 @@ This command is ignored if the button&rs +

+
+
+- +-

"Default Bindings"

++

"Default Bindings"

+ +

Tk automatically creates class bindings for buttons that give them + the following default behavior: +@@ -248,13 +230,12 @@ actions occur: the button is completely +

The behavior of buttons can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

Keywords

++

Keywords

+

button, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/canvas.html ++++ gcl-2.6.12/info/gcl-tk/canvas.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: canvas ++ ++canvas (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.4 canvas

++

2.4 canvas

+ +

canvas \- Create and manipulate canvas widgets +-

+-

Synopsis

++

Synopsis

+

canvas pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -73,9 +59,8 @@ insertBackground insertWidth selec +
+ + +-

See options, for more information. +-

+-

Arguments for Canvas

++

See options, for more information. ++

Arguments for Canvas

+ + +
+@@ -155,8 +140,7 @@ of the forms described in the COORDINATE +

+
+ +- +-

Introduction

++

Introduction

+ +

The canvas command creates a new window (given + by the pathName argument) and makes it into a canvas widget. +@@ -180,8 +164,7 @@ the mouse cursor over an item. + This means that items in a canvas can have behaviors defined by + the Tcl scripts bound to them. +

+- +-

Display List

++

Display List

+ +

The items in a canvas are ordered for purposes of display, + with the first item in the display list being displayed +@@ -194,8 +177,7 @@ display list, on top of everything else. + Widget commands may be used to re-arrange the order of the + display list. +

+- +-

Item Ids And Tags

++

Item Ids And Tags

+ +

Items in a canvas widget may be named in either of two ways: + by id or by tag. +@@ -241,8 +223,7 @@ the display list that is suitable for th + Exceptions are noted in the widget command descriptions + below. +

+- +-

Coordinates

++

Coordinates

+ +

All coordinates related to canvases are stored as floating-point + numbers. +@@ -256,8 +237,7 @@ the screen; if it is c then the + Larger y-coordinates refer to points lower on the screen; larger + x-coordinates refer to points farther to the right. +

+- +-

Transformations

++

Transformations

+ +

Normally the origin of the canvas coordinate system is at the + upper-left corner of the window containing the canvas. +@@ -271,8 +251,7 @@ system relative to the window coordinate +

Indidividual items may be moved or scaled using widget commands + described below, but they may not be rotated. +

+- +-

Indices

++

Indices

+ +

Text items support the notion of an index for identifying + particular positions within the item. +@@ -324,8 +303,7 @@ line that is closest to the given point. +

+
+
+- +-

A Canvas Widget’s Arguments

++

A Canvas Widget’s Arguments

+ +

The canvas command creates a new Tcl command whose + name is pathName. This +@@ -929,8 +907,7 @@ and so on. The return value is an empty +

+
+
+- +-

Overview Of Item Types

++

Overview Of Item Types

+ +

The sections below describe the various types of items supported + by canvas widgets. Each item type is characterized by two things: +@@ -944,8 +921,7 @@ Where items do support these facilities, + in the descriptions below (at present, only text items provide + this support). +

+- +-

Arc Items

++

Arc Items

+ +

Items of type arc appear on the display as arc-shaped regions. + An arc is a section of an oval delimited by two angles (specified +@@ -1032,8 +1008,7 @@ This option defaults to 1.0. +

+
+ +- +-

Bitmap Items

++

Bitmap Items

+ +

Items of type bitmap appear on the display as images with + two colors, foreground and background. +@@ -1087,8 +1062,7 @@ existing tags for the item. +

+
+
+- +-

Line Items

++

Line Items

+ +

Items of type line appear on the display as one or more connected + line segments or curves. +@@ -1189,8 +1163,7 @@ If this option isn’t specified the +

+
+
+- +-

Oval Items

++

Oval Items

+ +

Items of type oval appear as circular or oval regions on + the display. Each oval may have an outline, a fill, or +@@ -1255,8 +1228,7 @@ This option defaults to 1.0. +

+
+
+- +-

Polygon Items

++

Polygon Items

+ +

Items of type polygon appear as polygonal or curved filled regions + on the display. +@@ -1316,8 +1288,7 @@ existing tags for the item. +

+
+ +- +-

Rectangle Items

++

Rectangle Items

+ +

Items of type rectangle appear as rectangular regions on + the display. Each rectangle may have an outline, a fill, or +@@ -1379,8 +1350,7 @@ This option defaults to 1.0. +

+
+
+- +-

Text Items

++

Text Items

+ +

A text item displays a string of characters on the screen in one + or more lines. +@@ -1470,8 +1440,7 @@ character. +

+
+
+- +-

Window Items

++

Window Items

+ +

Items of type window cause a particular window to be displayed + at a given position on the canvas. +@@ -1529,8 +1498,7 @@ the canvas widget or a child of some anc +

+
+
+- +-

Application-Defined Item Types

++

Application-Defined Item Types

+ +

It is possible for individual applications to define new item + types for canvas widgets using C code. +@@ -1539,15 +1507,13 @@ and it’s possible they may change, + see how they work by examining the code for some of the existing + item types. +

+- +-

Bindings

++

Bindings

+ +

In the current implementation, new canvases are not given any + default behavior: you’ll have to execute explicit Tcl commands + to give the canvas its behavior. +

+- +-

Credits

++

Credits

+ +

Tk’s canvas widget is a blatant ripoff of ideas from Joel Bartlett’s + ezd program. Ezd provides structured graphics in a Scheme +@@ -1555,13 +1521,12 @@ environment and preceded canvases by a y + mechanisms for placing and animating graphical objects inspired the + functions of canvases. +

+- +-

Keywords

++

Keywords

+

canvas, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/checkbutton.html ++++ gcl-2.6.12/info/gcl-tk/checkbutton.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: checkbutton ++ ++checkbutton (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.7 checkbutton

++

2.7 checkbutton

+ +

checkbutton \- Create and manipulate check-button widgets +-

+-

Synopsis

++

Synopsis

+

checkbutton pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -73,9 +59,8 @@ background disabledForeground pa +
+ + +-

See options, for more information. +-

+-

Arguments for Checkbutton

++

See options, for more information. ++

Arguments for Checkbutton

+ + +
+@@ -186,8 +171,7 @@ from the size of the bitmap or text bein +

+
+ +- +-

Description

++

Description

+ +

The checkbutton command creates a new window (given by the + pathName argument) and makes it into a check-button widget. +@@ -228,8 +212,7 @@ In addition, each check button monitors + automatically selects and deselects itself when the variables value + changes to and from the button’s “on” value. +

+- +-

A Checkbutton Widget’s Arguments

++

A Checkbutton Widget’s Arguments

+ +

The checkbutton command creates a new Tcl command whose + name is pathName. This +@@ -305,8 +288,7 @@ modifying its associated variable to ref +

+
+
+- +-

Bindings

++

Bindings

+ +

Tk automatically creates class bindings for check buttons that give them + the following default behavior: +@@ -332,13 +314,12 @@ actions occur: the check button is comp +

The behavior of check buttons can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

Keywords

++

Keywords

+

check button, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/destroy.html ++++ gcl-2.6.12/info/gcl-tk/destroy.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: destroy ++ ++destroy (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.3 destroy

++

3.3 destroy

+ +

destroy \- Destroy one or more windows +-

+-

Synopsis

++

Synopsis

+

destroy ?window window ...? +

+- +-

Description

++

Description

+ +

This command deletes the windows given by the + window arguments, plus all of their descendants. +@@ -73,8 +59,7 @@ The windows are destroyed in orde + in destroying a window the command aborts without destroying the + remaining windows. +

+- +-

Keywords

++

Keywords

+

application, destroy, window +

+ +--- gcl-2.6.12.orig/info/gcl-tk/entry.html ++++ gcl-2.6.12/info/gcl-tk/entry.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: entry ++ ++entry (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.10 entry

++

2.10 entry

+ +

entry \- Create and manipulate entry widgets +-

+-

Synopsis

++

Synopsis

+

entry pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -74,9 +60,8 @@ font insertOnTime select +
+ + +-

See options, for more information. +-

+-

Arguments for Entry

++

See options, for more information. ++

Arguments for Entry

+ + +
+@@ -102,8 +87,7 @@ in average-size characters of the widget +

+
+ +- +-

Description

++

Description

+ +

The entry command creates a new window (given by the + pathName argument) and makes it into an entry widget. +@@ -136,8 +120,7 @@ the standard scrollCommand mechan + scrollbars (see the description of the scrollCommand option + for details). They also support scanning, as described below. +

+- +-

A Entry Widget’s Arguments

++

A Entry Widget’s Arguments

+ +

The entry command creates a new Tcl command whose + name is pathName. This +@@ -290,8 +273,7 @@ at the left edge of the window. Returns +

+
+
+- +-

"Default Bindings"

++

"Default Bindings"

+ +

Tk automatically creates class bindings for entries that give them + the following default behavior: +@@ -336,13 +318,12 @@ take place. +

The behavior of entries can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

Keywords

++

Keywords

+

entry, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/exit.html ++++ gcl-2.6.12/info/gcl-tk/exit.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: exit ++ ++exit (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.5 exit

++

3.5 exit

+ +

exit \- Exit the process +-

+-

Synopsis

++

Synopsis

+

exit ?returnCode? +

+- +-

Description

++

Description

+ +

Terminate the process, returning returnCode (an integer) to the + system as the exit status. +@@ -76,8 +62,7 @@ the process. + This allows various cleanup operations to be performed, such + as removing application names from the global registry of applications. +

+- +-

Keywords

++

Keywords

+

exit, process +

+ +--- gcl-2.6.12.orig/info/gcl-tk/focus.html ++++ gcl-2.6.12/info/gcl-tk/focus.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: focus ++ ++focus (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,25 +37,21 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.6 focus

++

3.6 focus

+ +

focus \- Direct keyboard events to a particular window +-

+-

Synopsis

++

Synopsis

+

focus
+
focus window
+ focus option ?arg arg ...? +

+- +-

Description

++

Description

+ +

The focus command is used to manage the Tk input focus. + At any given time, one window in an application is designated as +@@ -108,8 +94,7 @@ will be discarded. +

+ + +- +-

"Focus Events"

++

"Focus Events"

+ +

Tk’s model of the input focus is different than X’s model, and the + focus window set with the focus command is not usually the +@@ -167,13 +152,12 @@ Furthermore, the mode field in fo + NotifyNormal and the only values ever present in the + detail field are NotifyAncestor and NotifyVirtual. +

+- +-

Keywords

++

Keywords

+

events, focus, keyboard, top-level, window manager +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/frame.html ++++ gcl-2.6.12/info/gcl-tk/frame.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: frame ++ ++frame (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.12 frame

++

2.12 frame

+ +

frame \- Create and manipulate frame widgets +-

+-

Synopsis

++

Synopsis

+

frame pathName ?:class className? ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -71,9 +57,8 @@ borderWidth geometry +
+ + +-

See options, for more information. +-

+-

Arguments for Frame

++

See options, for more information. ++

Arguments for Frame

+ + +
+@@ -107,8 +92,7 @@ all. +

+
+ +- +-

Description

++

Description

+ +

The frame command creates a new window (given by the + pathName argument) and makes it into a frame widget. +@@ -137,8 +121,7 @@ name will affect the lookup of the other + the :class option may not be queried or changed using the + config command described below. +

+- +-

A Frame Widget’s Arguments

++

A Frame Widget’s Arguments

+ +

The frame command creates a new Tcl command whose + name is the same as the path name of the frame’s window. This +@@ -171,19 +154,17 @@ command. +

+ + +- +-

Bindings

++

Bindings

+ +

When a new frame is created, it has no default event bindings: + frames are not intended to be interactive. +

+- +-

Keywords

++

Keywords

+

frame, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/grab.html ++++ gcl-2.6.12/info/gcl-tk/grab.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: grab ++ ++grab (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,24 +37,20 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.7 grab

++

3.7 grab

+ +

grab \- Confine pointer and keyboard events to a window sub-tree +-

+-

Synopsis

++

Synopsis

+

grab ?:globalwindow
+ grab option ?arg arg ...? +

+- +-

Description

++

Description

+ +

This command implements simple pointer and keyboard grabs for Tk. + Tk’s grabs are different than the grabs +@@ -151,8 +137,7 @@ does nothing. Returns an empty string. +

+ + +- +-

Bugs

++

Bugs

+ +

It took an incredibly complex and gross implementation to produce + the simple grab effect described above. +@@ -167,13 +152,12 @@ only one of those applications can have + display at any given time. If the applications are in different + processes, this restriction doesn’t exist. +

+- +-

Keywords

++

Keywords

+

grab, keyboard events, pointer events, window +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/index.html ++++ gcl-2.6.12/info/gcl-tk/index.html +@@ -1,44 +1,34 @@ + + +- ++ + +-GCL TK Manual: Top ++ ++Top (GCL TK Manual) + +- +- ++ ++ + + + +- + + + +- ++ + +@@ -46,7 +36,7 @@ ul.no-bullet {list-style: none} + + + +- ++ + + + +@@ -54,127 +44,128 @@ ul.no-bullet {list-style: none} + + + +- +-
++
+

+-Next: , Previous: , Up: (dir)   [Contents]

++Next: , Previous: , Up: (dir)   [Contents]

+
+
+- +- ++ + +- +- +- + +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- + +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- + + +@@ -182,7 +173,7 @@ Control +
+
+

+-Next: , Previous: , Up: (dir)   [Contents]

++Next: , Previous: , Up: (dir)   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/label.html ++++ gcl-2.6.12/info/gcl-tk/label.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: label ++ ++label (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.13 label

++

2.13 label

+ +

label \- Create and manipulate label widgets +-

+-

Synopsis

++

Synopsis

+

label pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -72,9 +58,8 @@ bitmap font padY +
+ + +-

See options, for more information. +-

+-

Arguments for Label

++

See options, for more information. ++

Arguments for Label

+ + +
+@@ -106,8 +91,7 @@ from the size of the bitmap or text bein +

+
+ +- +-

Description

++

Description

+ +

The label command creates a new window (given by the + pathName argument) and makes it into a label widget. +@@ -125,8 +109,7 @@ that displays a textual string or bitmap + The label can be manipulated in a few simple ways, such as + changing its relief or text, using the commands described below. +

+- +-

A Label Widget’s Arguments

++

A Label Widget’s Arguments

+ +

The label command creates a new Tcl command whose + name is pathName. This +@@ -158,19 +141,17 @@ command. +

+ + +- +-

Bindings

++

Bindings

+ +

When a new label is created, it has no default event bindings: + labels are not intended to be interactive. +

+- +-

Keywords

++

Keywords

+

label, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/listbox.html ++++ gcl-2.6.12/info/gcl-tk/listbox.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: listbox ++ ++listbox (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.2 listbox

++

2.2 listbox

+ +

listbox \- Create and manipulate listbox widgets +-

+-

Synopsis

++

Synopsis

+

listbox pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -73,15 +59,13 @@ exportSelection relief setGrid +
+ + +-

See options, for more information. +-

+-

Arguments for Listbox

++

See options, for more information. ++

Arguments for Listbox

+ + +

None. +

+- +-

Description

++

Description

+ +

The listbox command creates a new window (given by the + pathName argument) and makes it into a listbox widget. +@@ -112,8 +96,7 @@ scrolling in both directions using the s + and yScrollCommand options. + They also support scanning, as described below. +

+- +-

A Listbox’s Arguments

++

A Listbox’s Arguments

+ +

The listbox command creates a new Tcl command whose + name is pathName. This +@@ -249,8 +232,7 @@ element of the listbox. Returns an empt +

+ + +- +-

"Default Bindings"

++

"Default Bindings"

+ +

Tk automatically creates class bindings for listboxes that give them + the following default behavior: +@@ -274,13 +256,12 @@ In addition, the procedure tk_listbox + invoked to change listbox behavior so that only a single element + may be selected at once. +

+- +-

Keywords

++

Keywords

+

listbox, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/lower.html ++++ gcl-2.6.12/info/gcl-tk/lower.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: lower ++ ++lower (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.9 lower

++

3.9 lower

+ +

lower \- Change a window’s position in the stacking order +-

+-

Synopsis

++

Synopsis

+

lower window ?belowThis? +

+- +-

Description

++

Description

+ +

If the belowThis argument is omitted then the command lowers + window so that it is below all of its siblings in the stacking +@@ -77,8 +63,7 @@ In this case the lower command wi + (or the ancestor of belowThis that is a sibling of window); + this could end up either raising or lowering window. +

+- +-

Keywords

++

Keywords

+

lower, obscure, stacking order +

+ +--- gcl-2.6.12.orig/info/gcl-tk/menu.html ++++ gcl-2.6.12/info/gcl-tk/menu.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: menu ++ ++menu (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.5 menu

++

2.5 menu

+ +

menu \- Create and manipulate menu widgets +-

+-

Synopsis

++

Synopsis

+

menu pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -72,9 +58,8 @@ activeForeground cursor +
+ + +-

See options, for more information. +-

+-

Arguments for Menu

++

See options, for more information. ++

Arguments for Menu

+ + +
+@@ -100,8 +85,7 @@ or radio button is selected. +

+
+ +- +-

Introduction

++

Introduction

+ +

The menu command creates a new top-level window (given + by the pathName argument) and makes it into a menu widget. +@@ -147,23 +131,20 @@ with dimmer colors. A disabled entry ca + Disabled entries may be re-enabled, at which point it becomes + possible to activate and invoke them again. +

+- +-

Command Entries

++

Command Entries

+ +

The most common kind of menu entry is a command entry, which + behaves much like a button widget. When a command entry is + invoked, a Tcl command is executed. The Tcl + command is specified with the :command option. +

+- +-

Separator Entries

++

Separator Entries

+ +

A separator is an entry that is displayed as a horizontal dividing + line. A separator may not be activated or invoked, and it has + no behavior other than its display appearance. +

+- +-

Check-Button Entries

++

Check-Button Entries

+ +

A check-button menu entry behaves much like a check-button widget. + When it is invoked it toggles back and forth between the selected +@@ -181,8 +162,7 @@ entry, then its value is evaluated as a + is invoked; this happens after toggling the entry’s + selected state. +

+- +-

Radio-Button Entries

++

Radio-Button Entries

+ +

A radio-button menu entry behaves much like a radio-button widget. + Radio-button entries are organized in groups of which only one +@@ -206,8 +186,7 @@ the menu. If a :command option i + entry, then its value is evaluated as a Tcl command each time the entry + is invoked; this happens after selecting the entry. +

+- +-

Cascade Entries

++

Cascade Entries

+ +

A cascade entry is one with an associated menu (determined + by the :menu option). Cascade entries allow the construction +@@ -243,8 +222,7 @@ the form + evaluated as a Tcl command each time the associated menu is posted (the + evaluation occurs before the menu is posted). +

+- +-

A Menu Widget’s Arguments

++

A Menu Widget’s Arguments

+ +

The menu command creates a new Tcl command whose + name is pathName. This +@@ -504,8 +482,7 @@ window of the topmost pixel in the entry + + + +- +-

Default Bindings

++

Default Bindings

+ + +

Tk automatically creates class bindings for menus that give them +@@ -532,20 +509,18 @@ ignore mouse button presses and releases +

The behavior of menus can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

Bugs

++

Bugs

+ +

At present it isn’t possible to use the + option database to specify values for the options to individual + entries. +

+- +-

Keywords

++

Keywords

+

menu, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/menubutton.html ++++ gcl-2.6.12/info/gcl-tk/menubutton.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: menubutton ++ ++menubutton (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.8 menubutton

++

2.8 menubutton

+ +

menubutton \- Create and manipulate menubutton widgets +-

+-

Synopsis

++

Synopsis

+

menubutton pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -73,9 +59,8 @@ background disabledForeground pa +
+ + +-

See options, for more information. +-

+-

Arguments for Menubutton

++

See options, for more information. ++

Arguments for Menubutton

+ + +
+@@ -137,8 +122,7 @@ from the size of the bitmap or text bein +

+
+ +- +-

Introduction

++

Introduction

+ +

The menubutton command creates a new window (given by the + pathName argument) and makes it into a menubutton widget. +@@ -170,8 +154,7 @@ new menubutton is posted instead. + The tk-menu-bar procedure is used to set up menu bars for + scanning; see that procedure for more details. +

+- +-

A Menubutton Widget’s Arguments

++

A Menubutton Widget’s Arguments

+ +

The menubutton command creates a new Tcl command whose + name is pathName. This +@@ -220,8 +203,7 @@ use “pathName :configure +

+ + +- +-

"Default Bindings"

++

"Default Bindings"

+ + +

Tk automatically creates class bindings for menu buttons that give them +@@ -266,13 +248,12 @@ actions occur: the menu button is compl +

The behavior of menu buttons can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

Keywords

++

Keywords

+

menubutton, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/message.html ++++ gcl-2.6.12/info/gcl-tk/message.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: message ++ ++message (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.11 message

++

2.11 message

+ +

message \- Create and manipulate message widgets +-

+-

Synopsis

++

Synopsis

+

message pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -72,9 +58,8 @@ borderWidth foreground relief +
+ + +-

See options, for more information. +-

+-

Arguments for Message

++

See options, for more information. ++

Arguments for Message

+ + +
+@@ -138,8 +123,7 @@ the aspect option determines the +

+
+ +- +-

Description

++

Description

+ +

The message command creates a new window (given by the + pathName argument) and makes it into a message widget. +@@ -177,8 +161,7 @@ the character. In the unusual case wher + all of the characters in “0123456789abcdef\ex” then control + characters and undefined characters are not displayed at all. +

+- +-

A Message Widget’s Arguments

++

A Message Widget’s Arguments

+ +

The message command creates a new Tcl command whose + name is pathName. This +@@ -210,25 +193,22 @@ command. +

+ + +- +-

"Default Bindings"

++

"Default Bindings"

+ +

When a new message is created, it has no default event bindings: + messages are intended for output purposes only. +

+- +-

Bugs

++

Bugs

+ +

Tabs don’t work very well with text that is centered or right-justified. + The most common result is that the line is justified wrong. +

+- +-

Keywords

++

Keywords

+

message, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/option.html ++++ gcl-2.6.12/info/gcl-tk/option.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: option ++ ++option (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,19 +37,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.11 option

++

3.11 option

+ +

option \- Add/retrieve window options to/from the option database +-

+-

Synopsis

++

Synopsis

+

option :add pattern value ?priority? +


+

option :clear +@@ -68,8 +55,7 @@ Next:
+

option :readfile fileName ?priority? +

+- +-

Description

++

Description

+ +

The option command allows you to add entries to the Tk option + database or to retrieve options from the database. The add +@@ -137,13 +123,12 @@ may be specified numerically using integ + inclusive. The numeric form is probably a bad idea except for new priority + levels other than the ones given above. +

+- +-

Keywords

++

Keywords

+

database, option, priority, retrieve +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/options.html ++++ gcl-2.6.12/info/gcl-tk/options.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: options ++ ++options (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,20 +37,17 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.12 options

++

3.12 options

+ +

options \- Standard options supported by widgets +

+- +-

Description

++

Description

+

This manual entry describes the common configuration options supported + by widgets in the Tk toolkit. Every widget does not necessarily support + every option (see the manual entries for individual widgets for a list +@@ -79,6 +66,7 @@ command +

+
+
++
+ (.a.b.c  :configure  :foreground "black")
+ 
+ +@@ -651,13 +639,12 @@ on how this option is used. +

+ + +- +-

Keywords

++

Keywords

+

class, name, standard option, switch +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/pack.html ++++ gcl-2.6.12/info/gcl-tk/pack.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: pack ++ ++pack (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.14 pack

++

3.14 pack

+ +

pack \- Geometry manager that packs around edges of cavity +-

+-

Synopsis

++

Synopsis

+

pack option arg ?arg ...? +

+- +-

Description

++

Description

+ +

The pack command is used to communicate with the packer, + a geometry manager that arranges the children of a parent by +@@ -208,8 +194,7 @@ If master has no slaves then an e +

+ + +- +-

"The Packer Algorithm"

++

"The Packer Algorithm"

+ +

For each master the packer maintains an ordered list of slaves + called the packing list. +@@ -273,8 +258,7 @@ If the cavity shrinks to zero size, then + on the packing list will be unmapped from the screen until + the master window becomes large enough to hold them again. +

+- +-

"Expansion"

++

"Expansion"

+ +

If a master window is so large that there will be extra space + left over after all of its slaves have been packed, then the +@@ -285,8 +269,7 @@ slaves whose :sidetop or bottom. +

+- +-

"Geometry Propagation"

++

"Geometry Propagation"

+ +

The packer normally computes how large a master must be to + just exactly meet the needs of its slaves, and it sets the +@@ -301,8 +284,7 @@ the requested width and height of the pa + This may be useful if, for example, you wish for a master + window to have a fixed size that you specify. +

+- +-

"Restrictions On Master Windows"

++

"Restrictions On Master Windows"

+ +

The master for each slave must either be the slave’s parent + (the default) or a descendant of the slave’s parent. +@@ -310,8 +292,7 @@ This restriction is necessary to guarant + slave can be placed over any part of its master that is + visible without danger of the slave being clipped by its parent. +

+- +-

"Packing Order"

++

"Packing Order"

+ +

If the master for a slave is not its parent then you must make sure + that the slave is higher in the stacking order than the master. +@@ -323,13 +304,12 @@ will be highest in the stacking order. + Or, you can use the raise and lower commands to change + the stacking order of either the master or the slave. +

+- +-

Keywords

++

Keywords

+

geometry manager, location, packer, parcel, propagation, size +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/pack_002dold.html ++++ gcl-2.6.12/info/gcl-tk/pack_002dold.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: pack-old ++ ++pack-old (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,19 +37,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.13 pack-old

++

3.13 pack-old

+ +

pack \- Obsolete syntax for packer geometry manager +-

+-

Synopsis

++

Synopsis

+

pack after sibling window options ?window options ...? +


+

pack append parent window options ?window options ...? +@@ -70,8 +57,7 @@ Next:
+

pack unpack window +

+- +-

Description

++

Description

+ +

Note: this manual entry describes the syntax for the pack\fI + command as it before Tk version 3.3. +@@ -264,13 +250,12 @@ such that zero space would be leftover f +

+ + +- +-

Keywords

++

Keywords

+

geometry manager, location, packer, parcel, size +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/place.html ++++ gcl-2.6.12/info/gcl-tk/place.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: place ++ ++place (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,19 +37,16 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.15 place

++

3.15 place

+ +

place \- Geometry manager for fixed or rubber-sheet placement +-

+-

Synopsis

++

Synopsis

+

place window option value ?option value ...? +


+

place configure window option value ?option value ...? +@@ -70,8 +57,7 @@ Next:
+

place slaves window +

+- +-

Description

++

Description

+ +

The placer is a geometry manager for Tk. + It provides simple fixed placement of windows, where you specify +@@ -232,8 +218,7 @@ the saved information. +

+ + +- +-

"Fine Points"

++

"Fine Points"

+ +

It is not necessary for the master window to be the parent + of the slave window. +@@ -271,13 +256,12 @@ set their requested sizes). + To control the sizes of these windows, make them windows like + frames and canvases that provide configuration options for this purpose. +

+- +-

Keywords

++

Keywords

+

geometry manager, height, location, master, place, rubber sheet, slave, width +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/radiobutton.html ++++ gcl-2.6.12/info/gcl-tk/radiobutton.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: radiobutton ++ ++radiobutton (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.14 radiobutton

++

2.14 radiobutton

+ +

radiobutton \- Create and manipulate radio-button widgets +-

+-

Synopsis

++

Synopsis

+

radiobutton pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -73,9 +59,8 @@ background disabledForeground pa +
+ + +-

See options, for more information. +-

+-

Arguments for Radiobutton

++

See options, for more information. ++

Arguments for Radiobutton

+ + +
+@@ -174,8 +159,7 @@ from the size of the bitmap or text bein +

+
+ +- +-

Description

++

Description

+ +

The radiobutton command creates a new window (given by the + pathName argument) and makes it into a radiobutton widget. +@@ -220,8 +204,7 @@ plus the variable to be stored into it, + on the command line or in the option database. By default a radio + button is configured to select itself on button clicks. +

+- +-

A Radiobutton Widget’s Arguments

++

A Radiobutton Widget’s Arguments

+ +

The radiobutton command creates a new Tcl command whose + name is pathName. This +@@ -294,8 +277,7 @@ to this widget. +

+ + +- +-

Bindings

++

Bindings

+ +

Tk automatically creates class bindings for radio buttons that give them + the following default behavior: +@@ -318,13 +300,12 @@ over the radio button when button 1 is r +

The behavior of radio buttons can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

Keywords

++

Keywords

+

radio button, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/raise.html ++++ gcl-2.6.12/info/gcl-tk/raise.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: raise ++ ++raise (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.16 raise

++

3.16 raise

+ +

raise \- Change a window’s position in the stacking order +-

+-

Synopsis

++

Synopsis

+

raise window ?aboveThis? +

+- +-

Description

++

Description

+ +

If the aboveThis argument is omitted then the command raises + window so that it is above all of its siblings in the stacking +@@ -77,8 +63,7 @@ In this case the raise command wi + (or the ancestor of aboveThis that is a sibling of window); + this could end up either raising or lowering window. +

+- +-

Keywords

++

Keywords

+

obscure, raise, stacking order +

+ +--- gcl-2.6.12.orig/info/gcl-tk/scale.html ++++ gcl-2.6.12/info/gcl-tk/scale.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: scale ++ ++scale (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.3 scale

++

2.3 scale

+ +

scale \- Create and manipulate scale widgets +-

+-

Synopsis

++

Synopsis

+

scale pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -71,9 +57,8 @@ background cursor for +
+ + +-

See options, for more information. +-

+-

Arguments for Scale

++

See options, for more information. ++

Arguments for Scale

+ + +
+@@ -210,8 +195,7 @@ this is the scale’s height. +

+
+ +- +-

Description

++

Description

+ +

The scale command creates a new window (given by the + pathName argument) and makes it into a scale widget. +@@ -243,8 +227,7 @@ the current value for vertical scales). + annotations may be selectively enabled or disabled using the + configuration options. +

+- +-

A Scale’s"Argumentsommand"

++

A Scale’s"Argumentsommand"

+ +

The scale command creates a new Tcl command whose + name is pathName. This +@@ -284,8 +267,7 @@ gives the new value for the scale. +

+ + +- +-

Bindings

++

Bindings

+ +

When a new scale is created, it is given the following initial + behavior by default: +@@ -313,13 +295,12 @@ the current mouse position. +

+ + +- +-

Keywords

++

Keywords

+

scale, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/scrollbar.html ++++ gcl-2.6.12/info/gcl-tk/scrollbar.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: scrollbar ++ ++scrollbar (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.6 scrollbar

++

2.6 scrollbar

+ +

scrollbar \- Create and manipulate scrollbar widgets +-

+-

Synopsis

++

Synopsis

+

scrollbar pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -72,9 +58,8 @@ borderWidth orient +
+ + +-

See options, for more information. +-

+-

Arguments for Scrollbar

++

See options, for more information. ++

Arguments for Scrollbar

+ + +
+@@ -105,8 +90,7 @@ The value may have any of the forms acce +

+
+ +- +-

Description

++

Description

+ +

The scrollbar command creates a new window (given by the + pathName argument) and makes it into a scrollbar widget. +@@ -134,8 +118,7 @@ the top third of its object. + by clicking or dragging with the mouse. See the BINDINGS section + below for details. +

+- +-

A Scrollbar Widget’s Arguments

++

A Scrollbar Widget’s Arguments

+ +

The scrollbar command creates a new Tcl command whose + name is pathName. This +@@ -188,8 +171,7 @@ changes size and whenever it changes the +

+ + +- +-

Bindings

++

Bindings

+ +

The description below assumes a vertically-oriented scrollbar. + For a horizontally-oriented scrollbar replace the words “up”, “down”, +@@ -243,13 +225,12 @@ the scrollbar. +

+ + +- +-

Keywords

++

Keywords

+

scrollbar, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/selection.html ++++ gcl-2.6.12/info/gcl-tk/selection.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: selection ++ ++selection (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.17 selection

++

3.17 selection

+ +

selection \- Manipulate the X selection +-

+-

Synopsis

++

Synopsis

+

selection option ?arg arg ...? +

+- +-

Description

++

Description

+ +

This command provides a Tcl interface to the X selection mechanism and + implements the full selection functionality described in the +@@ -162,13 +148,12 @@ application owns the selection. +

+ + +- +-

Keywords

++

Keywords

+

clear, format, handler, ICCCM, own, selection, target, type +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/send.html ++++ gcl-2.6.12/info/gcl-tk/send.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: send ++ ++send (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.18 send

++

3.18 send

+ +

send \- Execute a command in a different interpreter +-

+-

Synopsis

++

Synopsis

+

send interp cmd ?arg arg ...? +

+- +-

Description

++

Description

+ +

This command arranges for cmd (and args) to be executed in the + interpreter named by interp. It returns the result or +@@ -76,8 +62,7 @@ contained entirely within the cmd + more args are present, they are concatenated to form the + command to be executed, just as for the eval Tcl command. +

+- +-

Security

++

Security

+ +

The send command is potentially a serious security loophole, + since any application that can connect to your X server can send +@@ -97,13 +82,12 @@ This means that applications cannot conn + they use some other form of authorization + such as that provide by xauth. +

+- +-

Keywords

++

Keywords

+

interpreter, remote execution, security, send +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/text.html ++++ gcl-2.6.12/info/gcl-tk/text.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: text ++ ++text (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.9 text

++

2.9 text

+ +

text \- Create and manipulate text widgets +-

+-

Synopsis

++

Synopsis

+

text pathName ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -74,9 +60,8 @@ font insertOnTime select +
+ + +-

See options, for more information. +-

+-

Arguments for Text

++

See options, for more information. ++

Arguments for Text

+ + +
+@@ -134,8 +119,7 @@ in word mode a line break will on +

+
+ +- +-

Description

++

Description

+ +

The text command creates a new window (given by the + pathName argument) and makes it into a text widget. +@@ -167,8 +151,7 @@ See MARKS below for more details. + in the text widget. + See WINDOWS below for more details. +

+- +-

Indices

++

Indices

+ +

Many of the widget commands for texts take one or more indices + as arguments. +@@ -286,8 +269,7 @@ refers to the next-to-last character in + “\fBinsert wordstart \- 1 c” refers to the character just before + the first one in the word containing the insertion cursor. +

+- +-

Tags

++

Tags

+ +

The first form of annotation in text widgets is a tag. + A tag is a textual string that is associated with some of the characters +@@ -397,8 +379,7 @@ See THE SELECTION below. +

+ + +- +-

Marks

++

Marks

+ +

The second form of annotation in text widgets is a mark. + Marks are used for remembering particular places in a text. +@@ -432,15 +413,13 @@ motions if a mouse button is down; the + until all mouse buttons have been released). + Neither of these special marks may be unset. +

+- +-

Windows

++

Windows

+ +

The third form of annotation in text widgets is a window. + Window support isn’t implemented yet, but when it is it will be + described here. +

+- +-

The Selection

++

The Selection

+ +

Text widgets support the standard X selection. + Selection support is implemented via tags. +@@ -469,8 +448,7 @@ the text widget are tied to the :back + tag: changes in either will automatically be reflected in the + other. +

+- +-

The Insertion Cursor

++

The Insertion Cursor

+ +

The mark named insert has special significance in text widgets. + It is defined automatically when a text widget is created and it +@@ -480,8 +458,7 @@ The insert mark represents the po + cursor, and the insertion cursor will automatically be drawn at + this point whenever the text widget has the input focus. +

+- +-

A Text Widget’s Arguments

++

A Text Widget’s Arguments

+ +

The text command creates a new Tcl command whose + name is the same as the path name of the text’s window. This +@@ -823,8 +800,7 @@ This command returns an empty string. + + + +- +-

Bindings

++

Bindings

+ +

Tk automatically creates class bindings for texts that give them + the following default behavior: +@@ -875,8 +851,7 @@ take place. +

The behavior of texts can be changed by defining new bindings for + individual widgets or by redefining the class bindings. +

+- +-

"Performance Issues"

++

"Performance Issues"

+ +

Text widgets should run efficiently under a variety + of conditions. The text widget uses about 2-3 bytes of +@@ -895,13 +870,12 @@ Hundreds of tags should be fine, or even + but tens of thousands of tags will make texts consume a lot of + memory and run slowly. +

+- +-

Keywords

++

Keywords

+

text, widget +


+
+

+-Next: , Previous: , Up: Widgets   [Contents]

++Next: , Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tk.html ++++ gcl-2.6.12/info/gcl-tk/tk.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tk ++ ++tk (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.19 tk

++

3.19 tk

+ +

tk \- Manipulate Tk internal state +-

+-

Synopsis

++

Synopsis

+

tk option ?arg arg ...? +

+- +-

Description

++

Description

+ +

The tk command provides access to miscellaneous + elements of Tk’s internal state. +@@ -102,13 +88,12 @@ an application is not allowed to change + unless the screen has at least two bit planes. + .RE +

+- +-

Keywords

++

Keywords

+

color model, internal state +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tk_002ddialog.html ++++ gcl-2.6.12/info/gcl-tk/tk_002ddialog.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tk-dialog ++ ++tk-dialog (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.4 tk-dialog

++

3.4 tk-dialog

+ +

tk-dialog \- Create modal dialog and wait for response +-

+-

Synopsis

++

Synopsis

+

tk-dialog window title text bitmap default string string ... +

+- +-

Description

++

Description

+ +

This procedure is part of the Tk script library. + Its arguments describe a dialog box: +@@ -108,13 +94,12 @@ in any way except to invoke the dialog b +

+ + +- +-

Keywords

++

Keywords

+

bitmap, dialog, modal +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tk_002dlistbox_002dsingle_002dselect.html ++++ gcl-2.6.12/info/gcl-tk/tk_002dlistbox_002dsingle_002dselect.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tk-listbox-single-select ++ ++tk-listbox-single-select (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.8 tk-listbox-single-select

++

3.8 tk-listbox-single-select

+ +

tk-listbox-single-select \- Allow only one selected element in listbox(es) +-

+-

Synopsis

++

Synopsis

+

tk-listbox-single-select arg ?arg arg ...? +

+- +-

Description

++

Description

+ +

This command is a Tcl procedure provided as part of the Tk script library. + It takes as arguments the path names of one or more listbox widgets, +@@ -76,8 +62,7 @@ If the keyword Listbox +- +-

Keywords

++

Keywords

+

listbox, selection +

+ +--- gcl-2.6.12.orig/info/gcl-tk/tk_002dmenu_002dbar.html ++++ gcl-2.6.12/info/gcl-tk/tk_002dmenu_002dbar.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tk-menu-bar ++ ++tk-menu-bar (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,25 +37,21 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.10 tk-menu-bar

++

3.10 tk-menu-bar

+ +

tk-menu-bar, tk_bindForTraversal \- Support for menu bars +-

+-

Synopsis

++

Synopsis

+

tk-menu-bar frame ?menu menu ...? +


+

tk_bindForTraversal arg arg ... +

+- +-

Description

++

Description

+ +

These two commands are Tcl procedures in the Tk script library. + They provide support for menu bars. +@@ -129,8 +115,7 @@ It sets up bindings for all the named wi + classes so that the menu traversal system will be invoked when + appropriate keystrokes are typed in those widgets or classes. +

+- +-

"Menu Traversal Bindings"

++

"Menu Traversal Bindings"

+ +

Once an application has made the three arrangements described + above, menu traversal will be available. +@@ -185,13 +170,12 @@ to be taken, and the menu traversal to e +

When a menu traversal completes, the input focus reverts to the + window that contained it when the traversal started. +

+- +-

Keywords

++

Keywords

+

keyboard traversal, menu, menu bar, post +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tkconnect.html ++++ gcl-2.6.12/info/gcl-tk/tkconnect.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tkconnect ++ ++tkconnect (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,15 +37,13 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Previous: , Up: General   [Contents]

++Previous: , Up: General   [Contents]

+
+
+- +-

1.8 tkconnect

++

1.8 tkconnect

+ +
+
tkconnect &key host display can-rsh gcltksrv
+@@ -101,7 +89,7 @@ there, to connect back to the appropriat
+ 

+

You may indicate that different toplevel windows be on different + displays, by using the :display argument when creating the +-window, See toplevel. ++window, See toplevel. +

+

Clearly you must have a copy of the program gcltksrv and TK + libraries installed on the machine where you wish to run the server. +@@ -112,7 +100,7 @@ libraries installed on the machine where +


+
+

+-Previous: , Up: General   [Contents]

++Previous: , Up: General   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tkerror.html ++++ gcl-2.6.12/info/gcl-tk/tkerror.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tkerror ++ ++tkerror (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.20 tkerror

++

3.20 tkerror

+ +

tkerror \- Command invoked to process background errors +-

+-

Synopsis

++

Synopsis

+

tkerror message +

+- +-

Description

++

Description

+ +

The tkerror command doesn’t exist as built-in part of Tk. Instead, + individual applications or users can define a tkerror +@@ -97,13 +83,12 @@ that posts a dialog box containing the e + the user a chance to see a stack trace that shows where the + error occurred. +

+- +-

Keywords

++

Keywords

+

background error, reporting +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tkvars.html ++++ gcl-2.6.12/info/gcl-tk/tkvars.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tkvars ++ ++tkvars (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,20 +37,17 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.21 tkvars

++

3.21 tkvars

+ +

tkvars \- Variables used or set by Tk +

+- +-

Description

++

Description

+ +

The following Tcl variables are either set or used by Tk at various times + in its execution: +@@ -111,13 +98,12 @@ will be deleted soon. +

+ + +- +-

Keywords

++

Keywords

+

variables, version +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/tkwait.html ++++ gcl-2.6.12/info/gcl-tk/tkwait.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: tkwait ++ ++tkwait (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,25 +37,21 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.22 tkwait

++

3.22 tkwait

+ +

tkwait \- Wait for variable to change or window to be destroyed +-

+-

Synopsis

++

Synopsis

+

tkwait :variable name
+
tkwait :visibility name
+ tkwait :window name +

+- +-

Description

++

Description

+ +

The tkwait command waits for one of several things to happen, + then it returns without taking any other actions. +@@ -89,8 +75,7 @@ with a dialog box before using the resul + the normal fashion, so the application will continue to respond + to user interactions. +

+- +-

Keywords

++

Keywords

+

variable, visibility, wait, window +

+ +--- gcl-2.6.12.orig/info/gcl-tk/toplevel.html ++++ gcl-2.6.12/info/gcl-tk/toplevel.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: toplevel ++ ++toplevel (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,22 +37,18 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Previous: , Up: Widgets   [Contents]

++Previous: , Up: Widgets   [Contents]

+
+
+- +-

2.15 toplevel

++

2.15 toplevel

+ +

toplevel \- Create and manipulate toplevel widgets +-

+-

Synopsis

++

Synopsis

+

toplevel pathName ?:screen screenName? ?:class className? ?options? +-

+-

Standard Options

++

Standard Options

+ + +
+@@ -71,12 +57,10 @@ borderWidth relief +
+ + +-

See options, for more information. +-

+-

Arguments for Toplevel

++

See options, for more information. ++

Arguments for Toplevel

+ +- +-

Description

++

Description

+ +

The toplevel command creates a new toplevel widget (given + by the pathName argument). Additional +@@ -116,8 +100,7 @@ below. However, the winfo :class + the class of a window, and winfo :screen may be used to query + its screen. +

+- +-

A Toplevel Widget’s Arguments

++

A Toplevel Widget’s Arguments

+ +

The toplevel command creates a new Tcl command whose + name is the same as the path name of the toplevel’s window. This +@@ -150,14 +133,12 @@ command. +

+ + +- +-

Bindings

++

Bindings

+ +

When a new toplevel is created, it has no default event bindings: + toplevels are not intended to be interactive. +

+- +-

Keywords

++

Keywords

+

toplevel, widget +

+ +@@ -166,7 +147,7 @@ toplevels are not intended to be interac +
+
+

+-Previous: , Up: Widgets   [Contents]

++Previous: , Up: Widgets   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/update.html ++++ gcl-2.6.12/info/gcl-tk/update.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: update ++ ++update (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.23 update

++

3.23 update

+ +

update \- Process pending events and/or when-idle handlers +-

+-

Synopsis

++

Synopsis

+

update ?:idletasks? +

+- +-

Description

++

Description

+ +

This command is used to bring the entire application world + “up to date.” +@@ -90,8 +76,7 @@ the application to respond to user inter + call update then user input will be processed during the + next call to update. +

+- +-

Keywords

++

Keywords

+

event, flush, handler, idle, update +

+ +--- gcl-2.6.12.orig/info/gcl-tk/winfo.html ++++ gcl-2.6.12/info/gcl-tk/winfo.html +@@ -1,45 +1,35 @@ + + +- ++ + +-GCL TK Manual: winfo ++ ++winfo (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- +- ++ ++ ++ + +@@ -47,23 +37,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+
+- +-

3.24 winfo

++

3.24 winfo

+ +

winfo \- Return window-related information +-

+-

Synopsis

++

Synopsis

+

winfo option ?arg arg ...? +

+- +-

Description

++

Description

+ +

The winfo command is used to retrieve information about windows + managed by Tk. It can take any of a number of different forms, +@@ -286,14 +272,13 @@ has no border). +

+ + +- +-

Keywords

++

Keywords

+

atom, children, class, geometry, height, identifier, information, interpreters, + mapped, parent, path name, screen, virtual root, width, window +


+
+

+-Next: , Previous: , Up: Control   [Contents]

++Next: , Previous: , Up: Control   [Contents]

+
+ + +--- gcl-2.6.12.orig/info/gcl-tk/wm.html ++++ gcl-2.6.12/info/gcl-tk/wm.html +@@ -1,44 +1,34 @@ + + +- ++ + +-GCL TK Manual: wm ++ ++wm (GCL TK Manual) + +- +- ++ ++ + + + +- +- ++ + +- +- ++ ++ + +@@ -46,23 +36,19 @@ ul.no-bullet {list-style: none} + + + +- +- +-
++ ++
+

+-Previous: , Up: Control   [Contents]

++Previous: , Up: Control   [Contents]

+
+
+- +-

3.25 wm

++

3.25 wm

+ +

wm \- Communicate with window manager +-

+-

Synopsis

++

Synopsis

+

wm option window ?args? +

+- +-

Description

++

Description

+ +

The wm command is used to interact with window managers in + order to control such things as the title for a window, its geometry, +@@ -437,8 +423,7 @@ such as group. +

+ + +- +-

"Sources Of Geometry Information"

++

"Sources Of Geometry Information"

+ +

Size-related information for top-level windows + can come from three sources. +@@ -461,8 +446,7 @@ The second and third types of geometry r + external requests in the discussion below; Tk treats + these two kinds of requests identically. +

+- +-

"Ungridded Geometry Management"

++

"Ungridded Geometry Management"

+ +

Tk allows the geometry of a top-level window to be managed in + either of two general ways: ungridded or gridded. +@@ -503,8 +487,7 @@ To return to internal control over the w + If a window has been manually resized or moved, the wm :geometry + command will return the geometry that was requested interactively. +

+- +-

"Gridded Geometry Management"

++

"Gridded Geometry Management"

+ +

The second style of geometry management is called gridded. + This approach occurs when one of the widgets of an application +@@ -547,8 +530,7 @@ work together: the externally-specified + the size of the window in grid units, and the information from the + last wm :grid command maps from grid units to pixel units. +

+- +-

Bugs

++

Bugs

+ +

The window manager interactions seem too complicated, especially + for managing geometry. Suggestions on how to simplify this would +@@ -559,394 +541,393 @@ operation of the wm command. For + take effect if the window is already active: the window will have + to be withdrawn and de-iconified in order to make the change happen. +

+- +-

Keywords

++

Keywords

+

aspect ratio, deiconify, focus model, geometry, grid, group, icon, iconify, increments, position, size, title, top-level window, units, window manager +

+- ++ +

Short Table of Contents

+ + + +- ++ +

Table of Contents

+ +
+ + +@@ -955,7 +936,7 @@ to be withdrawn and de-iconified in orde +
+
+

+-Previous: , Up: Control   [Contents]

++Previous: , Up: Control   [Contents]

+
+ + +--- /dev/null ++++ gcl-2.6.12/info/gcl.info +@@ -0,0 +1,1472 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++Indirect: ++gcl.info-1: 314 ++gcl.info-2: 301351 ++gcl.info-3: 608702 ++gcl.info-4: 900342 ++gcl.info-5: 1205418 ++gcl.info-6: 1502760 ++gcl.info-7: 1802947 ++gcl.info-8: 2100572 ++gcl.info-9: 2402082 ++ ++Tag Table: ++(Indirect) ++Node: Top314 ++Node: Introduction (Introduction)41180 ++Node: Scope41532 ++Node: Scope and Purpose41780 ++Node: History42223 ++Node: Organization of the Document51793 ++Node: Referenced Publications54048 ++Node: Definitions57705 ++Node: Notational Conventions58097 ++Node: Font Key58726 ++Node: Modified BNF Syntax60567 ++Node: Splicing in Modified BNF Syntax60942 ++Node: Indirection in Modified BNF Syntax63438 ++Node: Additional Uses for Indirect Definitions in Modified BNF Syntax64086 ++Node: Special Symbols65255 ++Node: Objects with Multiple Notations70029 ++Node: Case in Symbols70473 ++Node: Numbers (Objects with Multiple Notations)71643 ++Node: Use of the Dot Character72043 ++Node: NIL72985 ++Node: Designators75105 ++Node: Nonsense Words77513 ++Node: Error Terminology78192 ++Node: Sections Not Formally Part Of This Standard85515 ++Node: Interpreting Dictionary Entries87025 ++Node: The "Affected By" Section of a Dictionary Entry89424 ++Node: The "Arguments" Section of a Dictionary Entry89957 ++Node: The "Arguments and Values" Section of a Dictionary Entry90479 ++Node: The "Binding Types Affected" Section of a Dictionary Entry91242 ++Node: The "Class Precedence List" Section of a Dictionary Entry91930 ++Node: Dictionary Entries for Type Specifiers93106 ++Node: The "Compound Type Specifier Kind" Section of a Dictionary Entry94248 ++Node: The "Compound Type Specifier Syntax" Section of a Dictionary Entry95299 ++Node: The "Compound Type Specifier Arguments" Section of a Dictionary Entry95975 ++Node: The "Compound Type Specifier Description" Section of a Dictionary Entry96542 ++Node: The "Constant Value" Section of a Dictionary Entry97093 ++Node: The "Description" Section of a Dictionary Entry97547 ++Node: The "Examples" Section of a Dictionary Entry98072 ++Node: The "Exceptional Situations" Section of a Dictionary Entry98561 ++Node: The "Initial Value" Section of a Dictionary Entry99402 ++Node: The "Argument Precedence Order" Section of a Dictionary Entry99926 ++Node: The "Method Signature" Section of a Dictionary Entry100454 ++Node: The "Name" Section of a Dictionary Entry101986 ++Node: The "Notes" Section of a Dictionary Entry104046 ++Node: The "Pronunciation" Section of a Dictionary Entry104756 ++Node: The "See Also" Section of a Dictionary Entry105571 ++Node: The "Side Effects" Section of a Dictionary Entry106046 ++Node: The "Supertypes" Section of a Dictionary Entry106478 ++Node: The "Syntax" Section of a Dictionary Entry107115 ++Node: Special "Syntax" Notations for Overloaded Operators108300 ++Node: Naming Conventions for Rest Parameters109438 ++Node: Requiring Non-Null Rest Parameters in The "Syntax" Section110293 ++Node: Return values in The "Syntax" Section111185 ++Node: No Arguments or Values in The "Syntax" Section111864 ++Node: Unconditional Transfer of Control in The "Syntax" Section112460 ++Node: The "Valid Context" Section of a Dictionary Entry113025 ++Node: The "Value Type" Section of a Dictionary Entry113666 ++Node: Conformance114021 ++Node: Conforming Implementations114437 ++Node: Required Language Features115042 ++Node: Documentation of Implementation-Dependent Features115671 ++Node: Documentation of Extensions116398 ++Node: Treatment of Exceptional Situations117041 ++Node: Resolution of Apparent Conflicts in Exceptional Situations117440 ++Node: Examples of Resolution of Apparent Conflict in Exceptional Situations118110 ++Node: Conformance Statement119114 ++Node: Conforming Programs120097 ++Node: Use of Implementation-Defined Language Features121058 ++Node: Use of Read-Time Conditionals122270 ++Node: Language Extensions123421 ++Node: Language Subsets125834 ++Node: Deprecated Language Features126551 ++Node: Deprecated Functions127392 ++Node: Deprecated Argument Conventions128051 ++Node: Deprecated Variables129164 ++Node: Deprecated Reader Syntax129413 ++Node: Symbols in the COMMON-LISP Package129884 ++Node: Syntax160374 ++Node: Character Syntax160618 ++Node: Readtables161371 ++Node: The Current Readtable162277 ++Node: The Standard Readtable162862 ++Node: The Initial Readtable163399 ++Node: Variables that affect the Lisp Reader163854 ++Node: Standard Characters164438 ++Node: Character Syntax Types169760 ++Node: Constituent Characters173982 ++Node: Constituent Traits174597 ++Node: Invalid Characters179000 ++Node: Macro Characters179548 ++Node: Multiple Escape Characters182322 ++Node: Examples of Multiple Escape Characters182977 ++Node: Single Escape Character183478 ++Node: Examples of Single Escape Characters183973 ++Node: Whitespace Characters184463 ++Node: Examples of Whitespace Characters184812 ++Node: Reader Algorithm185173 ++Node: Interpretation of Tokens191679 ++Node: Numbers as Tokens192039 ++Node: Potential Numbers as Tokens193289 ++Node: Escape Characters and Potential Numbers195879 ++Node: Examples of Potential Numbers196644 ++Node: Constructing Numbers from Tokens197804 ++Node: Syntax of a Rational198605 ++Node: Syntax of an Integer198820 ++Node: Syntax of a Ratio199411 ++Node: Syntax of a Float200691 ++Node: Syntax of a Complex203539 ++Node: The Consing Dot204595 ++Node: Symbols as Tokens205119 ++Node: Valid Patterns for Tokens209047 ++Node: Package System Consistency Rules212748 ++Node: Standard Macro Characters214409 ++Node: Left-Parenthesis215181 ++Node: Right-Parenthesis216709 ++Node: Single-Quote217036 ++Node: Examples of Single-Quote217494 ++Node: Semicolon217728 ++Node: Examples of Semicolon218292 ++Node: Notes about Style for Semicolon218518 ++Node: Use of Single Semicolon218935 ++Node: Use of Double Semicolon219526 ++Node: Use of Triple Semicolon220024 ++Node: Use of Quadruple Semicolon220404 ++Node: Examples of Style for Semicolon220914 ++Node: Double-Quote221887 ++Node: Backquote223390 ++Node: Notes about Backquote227313 ++Node: Comma228384 ++Node: Sharpsign228675 ++Node: Sharpsign Backslash233650 ++Node: Sharpsign Single-Quote234813 ++Node: Sharpsign Left-Parenthesis235285 ++Node: Sharpsign Asterisk236805 ++Node: Examples of Sharpsign Asterisk238069 ++Node: Sharpsign Colon238487 ++Node: Sharpsign Dot239003 ++Node: Sharpsign B239681 ++Node: Sharpsign O240070 ++Node: Sharpsign X240474 ++Node: Sharpsign R240978 ++Node: Sharpsign C242440 ++Node: Sharpsign A243600 ++Node: Sharpsign S244797 ++Node: Sharpsign P245904 ++Node: Sharpsign Equal-Sign246321 ++Node: Sharpsign Sharpsign246842 ++Node: Sharpsign Plus247911 ++Node: Sharpsign Minus248953 ++Node: Sharpsign Vertical-Bar249312 ++Node: Examples of Sharpsign Vertical-Bar249679 ++Node: Notes about Style for Sharpsign Vertical-Bar252661 ++Node: Sharpsign Less-Than-Sign253631 ++Node: Sharpsign Whitespace254069 ++Node: Sharpsign Right-Parenthesis254456 ++Node: Re-Reading Abbreviated Expressions254756 ++Node: Evaluation and Compilation255249 ++Node: Evaluation255630 ++Node: Introduction to Environments256918 ++Node: The Global Environment257776 ++Node: Dynamic Environments258427 ++Node: Lexical Environments259586 ++Node: The Null Lexical Environment260811 ++Node: Environment Objects261325 ++Node: The Evaluation Model262292 ++Node: Form Evaluation262987 ++Node: Symbols as Forms263290 ++Node: Lexical Variables265379 ++Node: Dynamic Variables266410 ++Node: Constant Variables268155 ++Node: Symbols Naming Both Lexical and Dynamic Variables268871 ++Node: Conses as Forms269722 ++Node: Special Forms270669 ++Node: Macro Forms272315 ++Node: Function Forms274152 ++Node: Lambda Forms276705 ++Node: Self-Evaluating Objects277363 ++Node: Examples of Self-Evaluating Objects278085 ++Node: Lambda Expressions278541 ++Node: Closures and Lexical Binding279180 ++Node: Shadowing282933 ++Node: Extent286104 ++Node: Return Values288370 ++Node: Compilation289751 ++Node: Compiler Terminology290058 ++Node: Compilation Semantics294351 ++Node: Compiler Macros295034 ++Node: Purpose of Compiler Macros296703 ++Node: Naming of Compiler Macros298418 ++Node: When Compiler Macros Are Used299396 ++Node: Notes about the Implementation of Compiler Macros301351 ++Node: Minimal Compilation302468 ++Node: Semantic Constraints303644 ++Node: File Compilation307298 ++Node: Processing of Top Level Forms309271 ++Node: Processing of Defining Macros313498 ++Node: Constraints on Macros and Compiler Macros316041 ++Node: Literal Objects in Compiled Files316841 ++Node: Externalizable Objects318251 ++Node: Similarity of Literal Objects319879 ++Node: Similarity of Aggregate Objects320123 ++Node: Definition of Similarity320707 ++Node: Extensions to Similarity Rules325575 ++Node: Additional Constraints on Externalizable Objects326451 ++Node: Exceptional Situations in the Compiler331188 ++Node: Declarations333287 ++Node: Minimal Declaration Processing Requirements334074 ++Node: Declaration Specifiers335240 ++Node: Declaration Identifiers335742 ++Node: Shorthand notation for Type Declarations336588 ++Node: Declaration Scope336955 ++Node: Examples of Declaration Scope338928 ++Node: Lambda Lists342126 ++Node: Ordinary Lambda Lists345136 ++Node: Specifiers for the required parameters347779 ++Node: Specifiers for optional parameters348629 ++Node: A specifier for a rest parameter349810 ++Node: Specifiers for keyword parameters350815 ++Node: Suppressing Keyword Argument Checking354838 ++Node: Examples of Suppressing Keyword Argument Checking355529 ++Node: Specifiers for &aux variables356767 ++Node: Examples of Ordinary Lambda Lists357617 ++Node: Generic Function Lambda Lists361535 ++Node: Specialized Lambda Lists362950 ++Node: Macro Lambda Lists364388 ++Node: Destructuring by Lambda Lists369811 ++Node: Data-directed Destructuring by Lambda Lists371002 ++Node: Examples of Data-directed Destructuring by Lambda Lists371549 ++Node: Lambda-list-directed Destructuring by Lambda Lists372262 ++Node: Destructuring Lambda Lists375323 ++Node: Boa Lambda Lists376623 ++Node: Defsetf Lambda Lists380499 ++Node: Deftype Lambda Lists381527 ++Node: Define-modify-macro Lambda Lists382145 ++Node: Define-method-combination Arguments Lambda Lists383015 ++Node: Syntactic Interaction of Documentation Strings and Declarations383866 ++Node: Error Checking in Function Calls384617 ++Node: Argument Mismatch Detection384888 ++Node: Safe and Unsafe Calls385377 ++Node: Error Detection Time in Safe Calls388140 ++Node: Too Few Arguments388723 ++Node: Too Many Arguments389248 ++Node: Unrecognized Keyword Arguments389896 ++Node: Invalid Keyword Arguments390516 ++Node: Odd Number of Keyword Arguments391120 ++Node: Destructuring Mismatch391706 ++Node: Errors When Calling a Next Method392243 ++Node: Traversal Rules and Side Effects393218 ++Node: Destructive Operations394464 ++Node: Modification of Literal Objects394789 ++Node: Transfer of Control during a Destructive Operation397187 ++Node: Examples of Transfer of Control during a Destructive Operation397684 ++Node: Evaluation and Compilation Dictionary398560 ++Node: lambda (Symbol)399243 ++Node: lambda400441 ++Node: compile401555 ++Node: eval404765 ++Node: eval-when406697 ++Node: load-time-value413134 ++Node: quote418947 ++Node: compiler-macro-function420509 ++Node: define-compiler-macro421471 ++Node: defmacro428947 ++Node: macro-function435110 ++Node: macroexpand437354 ++Node: define-symbol-macro442384 ++Node: symbol-macrolet444934 ++Node: *macroexpand-hook*448057 ++Node: proclaim450319 ++Node: declaim452448 ++Node: declare453256 ++Node: ignore457465 ++Node: dynamic-extent459502 ++Node: type465888 ++Node: inline472661 ++Node: ftype476487 ++Node: declaration478021 ++Node: optimize478949 ++Node: special481191 ++Node: locally485670 ++Node: the487835 ++Node: special-operator-p490228 ++Node: constantp491141 ++Node: Types and Classes494160 ++Node: Introduction (Types and Classes)494422 ++Node: Types496580 ++Node: Data Type Definition496792 ++Node: Type Relationships498074 ++Node: Type Specifiers499999 ++Node: Classes509366 ++Node: Introduction to Classes510281 ++Node: Standard Metaclasses515009 ++Node: Defining Classes515968 ++Node: Creating Instances of Classes517640 ++Node: Inheritance518431 ++Node: Examples of Inheritance518895 ++Node: Inheritance of Class Options519872 ++Node: Determining the Class Precedence List520692 ++Node: Topological Sorting522752 ++Node: Examples of Class Precedence List Determination525185 ++Node: Redefining Classes528739 ++Node: Modifying the Structure of Instances531843 ++Node: Initializing Newly Added Local Slots (Redefining Classes)533028 ++Node: Customizing Class Redefinition534929 ++Node: Integrating Types and Classes536008 ++Node: Types and Classes Dictionary542615 ++Node: nil (Type)543384 ++Node: boolean543840 ++Node: function (System Class)544640 ++Node: compiled-function549403 ++Node: generic-function550242 ++Node: standard-generic-function551279 ++Node: class551802 ++Node: built-in-class552338 ++Node: structure-class553264 ++Node: standard-class553679 ++Node: method554077 ++Node: standard-method555216 ++Node: structure-object555647 ++Node: standard-object556246 ++Node: method-combination556684 ++Node: t (System Class)557343 ++Node: satisfies557709 ++Node: member (Type Specifier)558878 ++Node: not (Type Specifier)559889 ++Node: and (Type Specifier)560601 ++Node: or (Type Specifier)561435 ++Node: values (Type Specifier)562462 ++Node: eql (Type Specifier)563725 ++Node: coerce564496 ++Node: deftype569142 ++Node: subtypep572288 ++Node: type-of579324 ++Node: typep582215 ++Node: type-error585608 ++Node: type-error-datum586311 ++Node: simple-type-error587646 ++Node: Data and Control Flow588390 ++Node: Generalized Reference588655 ++Node: Overview of Places and Generalized Reference588982 ++Node: Evaluation of Subforms to Places591408 ++Node: Examples of Evaluation of Subforms to Places593913 ++Node: Setf Expansions594635 ++Node: Examples of Setf Expansions596705 ++Node: Kinds of Places598807 ++Node: Variable Names as Places599445 ++Node: Function Call Forms as Places599723 ++Node: VALUES Forms as Places608702 ++Node: THE Forms as Places609840 ++Node: APPLY Forms as Places610299 ++Node: Setf Expansions and Places611667 ++Node: Macro Forms as Places612087 ++Node: Symbol Macros as Places612621 ++Node: Other Compound Forms as Places613000 ++Node: Treatment of Other Macros Based on SETF614031 ++Node: Transfer of Control to an Exit Point615455 ++Node: Data and Control Flow Dictionary617276 ++Node: apply618510 ++Node: defun620529 ++Node: fdefinition624262 ++Node: fboundp626100 ++Node: fmakunbound627895 ++Node: flet628871 ++Node: funcall636716 ++Node: function (Special Operator)638413 ++Node: function-lambda-expression640490 ++Node: functionp643711 ++Node: compiled-function-p644654 ++Node: call-arguments-limit645784 ++Node: lambda-list-keywords646417 ++Node: lambda-parameters-limit647160 ++Node: defconstant647811 ++Node: defparameter650648 ++Node: destructuring-bind657202 ++Node: let658519 ++Node: progv661823 ++Node: setq663323 ++Node: psetq664997 ++Node: block666963 ++Node: catch668763 ++Node: go671446 ++Node: return-from672881 ++Node: return675149 ++Node: tagbody676129 ++Node: throw678542 ++Node: unwind-protect681203 ++Node: nil686428 ++Node: not686822 ++Node: t687661 ++Node: eq688642 ++Node: eql691050 ++Node: equal694007 ++Node: equalp697789 ++Node: identity701900 ++Node: complement702652 ++Node: constantly704343 ++Node: every705309 ++Node: and708278 ++Node: cond710024 ++Node: if711655 ++Node: or712902 ++Node: when714301 ++Node: case716873 ++Node: typecase721961 ++Node: multiple-value-bind727520 ++Node: multiple-value-call729380 ++Node: multiple-value-list730626 ++Node: multiple-value-prog1731440 ++Node: multiple-value-setq732390 ++Node: values733989 ++Node: values-list735907 ++Node: multiple-values-limit736879 ++Node: nth-value737705 ++Node: prog738988 ++Node: prog1742723 ++Node: progn744858 ++Node: define-modify-macro746234 ++Node: defsetf748708 ++Node: define-setf-expander754820 ++Node: get-setf-expansion759642 ++Node: setf761389 ++Node: shiftf763835 ++Node: rotatef766420 ++Node: control-error768135 ++Node: program-error768756 ++Node: undefined-function769302 ++Node: Iteration769907 ++Node: The LOOP Facility770081 ++Node: Overview of the Loop Facility770547 ++Node: Simple vs Extended Loop771328 ++Node: Simple Loop771629 ++Node: Extended Loop772322 ++Node: Loop Keywords772953 ++Node: Parsing Loop Clauses773887 ++Node: Expanding Loop Forms775510 ++Node: Summary of Loop Clauses778207 ++Node: Summary of Variable Initialization and Stepping Clauses778508 ++Node: Summary of Value Accumulation Clauses779341 ++Node: Summary of Termination Test Clauses781131 ++Node: Summary of Unconditional Execution Clauses782838 ++Node: Summary of Conditional Execution Clauses783558 ++Node: Summary of Miscellaneous Clauses784650 ++Node: Order of Execution785343 ++Node: Destructuring787215 ++Node: Restrictions on Side-Effects791628 ++Node: Variable Initialization and Stepping Clauses791865 ++Node: Iteration Control792717 ++Node: The for-as-arithmetic subclause795631 ++Node: Examples of for-as-arithmetic subclause799477 ++Node: The for-as-in-list subclause800227 ++Node: Examples of for-as-in-list subclause801021 ++Node: The for-as-on-list subclause801807 ++Node: Examples of for-as-on-list subclause802560 ++Node: The for-as-equals-then subclause803179 ++Node: Examples of for-as-equals-then subclause803937 ++Node: The for-as-across subclause804393 ++Node: Examples of for-as-across subclause805095 ++Node: The for-as-hash subclause805482 ++Node: The for-as-package subclause807704 ++Node: Examples of for-as-package subclause810268 ++Node: Local Variable Initializations810888 ++Node: Examples of WITH clause813729 ++Node: Value Accumulation Clauses814766 ++Node: Examples of COLLECT clause820602 ++Node: Examples of APPEND and NCONC clauses821352 ++Node: Examples of COUNT clause821971 ++Node: Examples of MAXIMIZE and MINIMIZE clauses822292 ++Node: Examples of SUM clause823158 ++Node: Termination Test Clauses823561 ++Node: Examples of REPEAT clause827731 ++Node: Examples of ALWAYS828256 ++Node: Examples of WHILE and UNTIL clauses830272 ++Node: Unconditional Execution Clauses831065 ++Node: Examples of unconditional execution831958 ++Node: Conditional Execution Clauses832454 ++Node: Examples of WHEN clause834159 ++Node: Miscellaneous Clauses835835 ++Node: Control Transfer Clauses836150 ++Node: Examples of NAMED clause836978 ++Node: Initial and Final Execution837368 ++Node: Examples of Miscellaneous Loop Features838997 ++Node: Examples of clause grouping840063 ++Node: Notes about Loop842504 ++Node: Iteration Dictionary843526 ++Node: do843731 ++Node: dotimes852155 ++Node: dolist855595 ++Node: loop857806 ++Node: loop-finish863496 ++Node: Objects866312 ++Node: Object Creation and Initialization866616 ++Node: Initialization Arguments870528 ++Node: Declaring the Validity of Initialization Arguments873135 ++Node: Defaulting of Initialization Arguments876634 ++Node: Rules for Initialization Arguments879905 ++Node: Shared-Initialize883867 ++Node: Initialize-Instance886549 ++Node: Definitions of Make-Instance and Initialize-Instance889284 ++Node: Changing the Class of an Instance891382 ++Node: Modifying the Structure of the Instance892634 ++Node: Initializing Newly Added Local Slots (Changing the Class of an Instance)893572 ++Node: Customizing the Change of Class of an Instance895309 ++Node: Reinitializing an Instance896112 ++Node: Customizing Reinitialization897575 ++Node: Meta-Objects898239 ++Node: Standard Meta-objects898765 ++Node: Slots899804 ++Node: Introduction to Slots900342 ++Node: Accessing Slots902980 ++Node: Inheritance of Slots and Slot Options905557 ++Node: Generic Functions and Methods910299 ++Node: Introduction to Generic Functions910794 ++Node: Introduction to Methods914311 ++Node: Agreement on Parameter Specializers and Qualifiers920459 ++Node: Congruent Lambda-lists for all Methods of a Generic Function921456 ++Node: Keyword Arguments in Generic Functions and Methods923598 ++Node: Examples of Keyword Arguments in Generic Functions and Methods925290 ++Node: Method Selection and Combination926629 ++Node: Determining the Effective Method928095 ++Node: Selecting the Applicable Methods928689 ++Node: Sorting the Applicable Methods by Precedence Order929030 ++Node: Applying method combination to the sorted list of applicable methods931095 ++Node: Standard Method Combination933262 ++Node: Declarative Method Combination938209 ++Node: Built-in Method Combination Types939120 ++Node: Inheritance of Methods943201 ++Node: Objects Dictionary943772 ++Node: function-keywords944780 ++Node: ensure-generic-function946392 ++Node: allocate-instance949695 ++Node: reinitialize-instance951209 ++Node: shared-initialize953435 ++Node: update-instance-for-different-class957934 ++Node: update-instance-for-redefined-class962063 ++Node: change-class967328 ++Node: slot-boundp971337 ++Node: slot-exists-p973114 ++Node: slot-makunbound973911 ++Node: slot-missing975444 ++Node: slot-unbound977774 ++Node: slot-value979437 ++Node: method-qualifiers982234 ++Node: no-applicable-method983020 ++Node: no-next-method984136 ++Node: remove-method985330 ++Node: make-instance986143 ++Node: make-instances-obsolete987545 ++Node: make-load-form988847 ++Node: make-load-form-saving-slots1000335 ++Node: with-accessors1002278 ++Node: with-slots1005210 ++Node: defclass1008569 ++Node: defgeneric1020992 ++Node: defmethod1031724 ++Node: find-class1038765 ++Node: next-method-p1040735 ++Node: call-method1041835 ++Node: call-next-method1044841 ++Node: compute-applicable-methods1047897 ++Node: define-method-combination1048950 ++Node: find-method1072775 ++Node: add-method1075420 ++Node: initialize-instance1076645 ++Node: class-name1078428 ++Node: setf class-name1079176 ++Node: class-of1079796 ++Node: unbound-slot1080787 ++Node: unbound-slot-instance1081455 ++Node: Structures1082018 ++Node: Structures Dictionary1082163 ++Node: defstruct1082343 ++Node: copy-structure1123250 ++Node: Conditions1123841 ++Node: Condition System Concepts1124016 ++Node: Condition Types1127625 ++Node: Serious Conditions1130192 ++Node: Creating Conditions1130573 ++Node: Condition Designators1131126 ++Node: Printing Conditions1132964 ++Node: Recommended Style in Condition Reporting1134307 ++Node: Capitalization and Punctuation in Condition Reports1135436 ++Node: Leading and Trailing Newlines in Condition Reports1136159 ++Node: Embedded Newlines in Condition Reports1137121 ++Node: Note about Tabs in Condition Reports1138294 ++Node: Mentioning Containing Function in Condition Reports1138919 ++Node: Signaling and Handling Conditions1139404 ++Node: Signaling1141672 ++Node: Resignaling a Condition1142872 ++Node: Restarts1143932 ++Node: Interactive Use of Restarts1146109 ++Node: Interfaces to Restarts1147305 ++Node: Restart Tests1148314 ++Node: Associating a Restart with a Condition1148794 ++Node: Assertions1149692 ++Node: Notes about the Condition System`s Background1150197 ++Node: Conditions Dictionary1150688 ++Node: condition1151703 ++Node: warning1153497 ++Node: style-warning1153854 ++Node: serious-condition1155058 ++Node: error (Condition Type)1156291 ++Node: cell-error1156656 ++Node: cell-error-name1157262 ++Node: parse-error1158252 ++Node: storage-condition1158722 ++Node: assert1160308 ++Node: error1164258 ++Node: cerror1167945 ++Node: check-type1173062 ++Node: simple-error1177338 ++Node: invalid-method-error1177837 ++Node: method-combination-error1179389 ++Node: signal1180514 ++Node: simple-condition1183070 ++Node: simple-condition-format-control1183999 ++Node: warn1185367 ++Node: simple-warning1187791 ++Node: invoke-debugger1188264 ++Node: break1189761 ++Node: *debugger-hook*1192196 ++Node: *break-on-signals*1194690 ++Node: handler-bind1197327 ++Node: handler-case1199912 ++Node: ignore-errors1205418 ++Node: define-condition1207307 ++Node: make-condition1218846 ++Node: restart1220148 ++Node: compute-restarts1220780 ++Node: find-restart1223539 ++Node: invoke-restart1225537 ++Node: invoke-restart-interactively1227272 ++Node: restart-bind1229585 ++Node: restart-case1233660 ++Node: restart-name1243486 ++Node: with-condition-restarts1244446 ++Node: with-simple-restart1245778 ++Node: abort (Restart)1249259 ++Node: continue1250253 ++Node: muffle-warning1251413 ++Node: store-value1253030 ++Node: use-value1254265 ++Node: abort (Function)1254902 ++Node: Symbols1261190 ++Node: Symbol Concepts1261346 ++Node: Symbols Dictionary1261959 ++Node: symbol1262389 ++Node: keyword1267402 ++Node: symbolp1268002 ++Node: keywordp1268744 ++Node: make-symbol1269613 ++Node: copy-symbol1271217 ++Node: gensym1273635 ++Node: *gensym-counter*1275934 ++Node: gentemp1276704 ++Node: symbol-function1279543 ++Node: symbol-name1282489 ++Node: symbol-package1283184 ++Node: symbol-plist1285017 ++Node: symbol-value1286216 ++Node: get1288207 ++Node: remprop1291439 ++Node: boundp1294044 ++Node: makunbound1295027 ++Node: set1295785 ++Node: unbound-variable1297509 ++Node: Packages1298080 ++Node: Package Concepts1298247 ++Node: Introduction to Packages1298460 ++Node: Package Names and Nicknames1300364 ++Node: Symbols in a Package1301135 ++Node: Internal and External Symbols1301348 ++Node: Package Inheritance1302263 ++Node: Accessibility of Symbols in a Package1303213 ++Node: Locating a Symbol in a Package1304826 ++Node: Prevention of Name Conflicts in Packages1305445 ++Node: Standardized Packages1308809 ++Node: The COMMON-LISP Package1309771 ++Node: Constraints on the COMMON-LISP Package for Conforming Implementations1311106 ++Node: Constraints on the COMMON-LISP Package for Conforming Programs1312652 ++Node: Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs1314763 ++Node: The COMMON-LISP-USER Package1316610 ++Node: The KEYWORD Package1317209 ++Node: Interning a Symbol in the KEYWORD Package1318072 ++Node: Notes about The KEYWORD Package1318662 ++Node: Implementation-Defined Packages1319585 ++Node: Packages Dictionary1320154 ++Node: package1320826 ++Node: export1321279 ++Node: find-symbol1324350 ++Node: find-package1326759 ++Node: find-all-symbols1327777 ++Node: import1328760 ++Node: list-all-packages1331258 ++Node: rename-package1331926 ++Node: shadow1333203 ++Node: shadowing-import1335565 ++Node: delete-package1337486 ++Node: make-package1342466 ++Node: with-package-iterator1344509 ++Node: unexport1350151 ++Node: unintern1351699 ++Node: in-package1353784 ++Node: unuse-package1354752 ++Node: use-package1356156 ++Node: defpackage1358234 ++Node: do-symbols1366658 ++Node: intern1370217 ++Node: package-name1372552 ++Node: package-nicknames1373598 ++Node: package-shadowing-symbols1374371 ++Node: package-use-list1375592 ++Node: package-used-by-list1376482 ++Node: packagep1377348 ++Node: *package*1377992 ++Node: package-error1379358 ++Node: package-error-package1380017 ++Node: Numbers (Numbers)1380709 ++Node: Number Concepts1380875 ++Node: Numeric Operations1381253 ++Node: Associativity and Commutativity in Numeric Operations1383468 ++Node: Examples of Associativity and Commutativity in Numeric Operations1384591 ++Node: Contagion in Numeric Operations1386251 ++Node: Viewing Integers as Bits and Bytes1386768 ++Node: Logical Operations on Integers1387022 ++Node: Byte Operations on Integers1388140 ++Node: Implementation-Dependent Numeric Constants1388967 ++Node: Rational Computations1390246 ++Node: Rule of Unbounded Rational Precision1390658 ++Node: Rule of Canonical Representation for Rationals1391113 ++Node: Rule of Float Substitutability1392224 ++Node: Floating-point Computations1395202 ++Node: Rule of Float and Rational Contagion1395682 ++Node: Examples of Rule of Float and Rational Contagion1396579 ++Node: Rule of Float Approximation1397637 ++Node: Rule of Float Underflow and Overflow1398819 ++Node: Rule of Float Precision Contagion1399261 ++Node: Complex Computations1399612 ++Node: Rule of Complex Substitutability1400099 ++Node: Rule of Complex Contagion1400500 ++Node: Rule of Canonical Representation for Complex Rationals1400907 ++Node: Examples of Rule of Canonical Representation for Complex Rationals1401771 ++Node: Principal Values and Branch Cuts1402428 ++Node: Interval Designators1404479 ++Node: Random-State Operations1405994 ++Node: Numbers Dictionary1406361 ++Node: number1407732 ++Node: complex (System Class)1408894 ++Node: real1411134 ++Node: float (System Class)1412289 ++Node: short-float1414947 ++Node: rational (System Class)1418992 ++Node: ratio1420024 ++Node: integer1420623 ++Node: signed-byte1421991 ++Node: unsigned-byte1423024 ++Node: mod (System Class)1424150 ++Node: bit (System Class)1424892 ++Node: fixnum1425253 ++Node: bignum1425744 ++Node: =1426050 ++Node: max1429657 ++Node: minusp1431700 ++Node: zerop1432619 ++Node: floor1433595 ++Node: sin1438404 ++Node: asin1439217 ++Node: pi1446395 ++Node: sinh1447503 ++Node: *1452173 ++Node: +1453003 ++Node: -1453795 ++Node: /1454940 ++Node: 1+1456552 ++Node: abs1457502 ++Node: evenp1458937 ++Node: exp1459840 ++Node: gcd1463019 ++Node: incf1464041 ++Node: lcm1465218 ++Node: log1466321 ++Node: mod (Function)1468475 ++Node: signum1469773 ++Node: sqrt1471430 ++Node: random-state1473492 ++Node: make-random-state1474337 ++Node: random1476274 ++Node: random-state-p1477768 ++Node: *random-state*1478532 ++Node: numberp1479960 ++Node: cis1480624 ++Node: complex1481194 ++Node: complexp1482836 ++Node: conjugate1483483 ++Node: phase1484250 ++Node: realpart1485801 ++Node: upgraded-complex-part-type1486786 ++Node: realp1487765 ++Node: numerator1488388 ++Node: rational (Function)1489436 ++Node: rationalp1490984 ++Node: ash1491644 ++Node: integer-length1493141 ++Node: integerp1494787 ++Node: parse-integer1495428 ++Node: boole1497537 ++Node: boole-11502760 ++Node: logand1503868 ++Node: logbitp1507989 ++Node: logcount1509172 ++Node: logtest1510574 ++Node: byte1511637 ++Node: deposit-field1512870 ++Node: dpb1513891 ++Node: ldb1515329 ++Node: ldb-test1516924 ++Node: mask-field1517755 ++Node: most-positive-fixnum1519081 ++Node: decode-float1519755 ++Node: float1525479 ++Node: floatp1526406 ++Node: most-positive-short-float1527031 ++Node: short-float-epsilon1531332 ++Node: arithmetic-error1532717 ++Node: arithmetic-error-operands1533471 ++Node: division-by-zero1534382 ++Node: floating-point-invalid-operation1534860 ++Node: floating-point-inexact1535648 ++Node: floating-point-overflow1536403 ++Node: floating-point-underflow1536912 ++Node: Characters1537395 ++Node: Character Concepts1537571 ++Node: Introduction to Characters1538065 ++Node: Introduction to Scripts and Repertoires1539529 ++Node: Character Scripts1539837 ++Node: Character Repertoires1540850 ++Node: Character Attributes1541761 ++Node: Character Categories1542769 ++Node: Graphic Characters1543992 ++Node: Alphabetic Characters1544919 ++Node: Characters With Case1545582 ++Node: Uppercase Characters1546036 ++Node: Lowercase Characters1546491 ++Node: Corresponding Characters in the Other Case1546965 ++Node: Case of Implementation-Defined Characters1547496 ++Node: Numeric Characters1547997 ++Node: Alphanumeric Characters1548505 ++Node: Digits in a Radix1548824 ++Node: Identity of Characters1549552 ++Node: Ordering of Characters1549822 ++Node: Character Names1551612 ++Node: Treatment of Newline during Input and Output1552755 ++Node: Character Encodings1553306 ++Node: Documentation of Implementation-Defined Scripts1554104 ++Node: Characters Dictionary1555575 ++Node: character (System Class)1556078 ++Node: base-char1556689 ++Node: standard-char1558673 ++Node: extended-char1559213 ++Node: char=1559674 ++Node: character1565738 ++Node: characterp1566607 ++Node: alpha-char-p1567533 ++Node: alphanumericp1568695 ++Node: digit-char1570080 ++Node: digit-char-p1571187 ++Node: graphic-char-p1572675 ++Node: standard-char-p1573552 ++Node: char-upcase1574392 ++Node: upper-case-p1576811 ++Node: char-code1578338 ++Node: char-int1579058 ++Node: code-char1580045 ++Node: char-code-limit1580800 ++Node: char-name1581460 ++Node: name-char1583367 ++Node: Conses1584236 ++Node: Cons Concepts1584384 ++Node: Conses as Trees1584933 ++Node: General Restrictions on Parameters that must be Trees1585981 ++Node: Conses as Lists1586415 ++Node: Lists as Association Lists1587871 ++Node: Lists as Sets1588406 ++Node: General Restrictions on Parameters that must be Lists1588991 ++Node: Conses Dictionary1589648 ++Node: list (System Class)1590410 ++Node: null (System Class)1591644 ++Node: cons (System Class)1592136 ++Node: atom (Type)1593362 ++Node: cons1593602 ++Node: consp1594506 ++Node: atom1595216 ++Node: rplaca1595909 ++Node: car1597033 ++Node: copy-tree1603439 ++Node: sublis1605051 ++Node: subst1608774 ++Node: tree-equal1613121 ++Node: copy-list1614893 ++Node: list (Function)1616197 ++Node: list-length1617800 ++Node: listp1619699 ++Node: make-list1620493 ++Node: push1621445 ++Node: pop1622678 ++Node: first1623966 ++Node: nth1626733 ++Node: endp1627775 ++Node: null1629168 ++Node: nconc1629967 ++Node: append1632083 ++Node: revappend1633205 ++Node: butlast1635378 ++Node: last1637185 ++Node: ldiff1638932 ++Node: nthcdr1642556 ++Node: rest1643680 ++Node: member (Function)1644647 ++Node: mapc1646928 ++Node: acons1651120 ++Node: assoc1652126 ++Node: copy-alist1655345 ++Node: pairlis1656609 ++Node: rassoc1658125 ++Node: get-properties1660236 ++Node: getf1661608 ++Node: remf1664450 ++Node: intersection1665796 ++Node: adjoin1669716 ++Node: pushnew1671648 ++Node: set-difference1674378 ++Node: set-exclusive-or1677734 ++Node: subsetp1680812 ++Node: union1682826 ++Node: Arrays1685909 ++Node: Array Concepts1686055 ++Node: Array Elements1686243 ++Node: Array Indices1686800 ++Node: Array Dimensions1687215 ++Node: Implementation Limits on Individual Array Dimensions1687805 ++Node: Array Rank1688230 ++Node: Vectors1688715 ++Node: Fill Pointers1688921 ++Node: Multidimensional Arrays1689653 ++Node: Storage Layout for Multidimensional Arrays1689864 ++Node: Implementation Limits on Array Rank1690378 ++Node: Specialized Arrays1690752 ++Node: Array Upgrading1692213 ++Node: Required Kinds of Specialized Arrays1693595 ++Node: Arrays Dictionary1695222 ++Node: array1696037 ++Node: simple-array1699085 ++Node: vector (System Class)1701034 ++Node: simple-vector1703130 ++Node: bit-vector1704139 ++Node: simple-bit-vector1705180 ++Node: make-array1706162 ++Node: adjust-array1714817 ++Node: adjustable-array-p1722816 ++Node: aref1723785 ++Node: array-dimension1725459 ++Node: array-dimensions1726318 ++Node: array-element-type1727164 ++Node: array-has-fill-pointer-p1728548 ++Node: array-displacement1729698 ++Node: array-in-bounds-p1731369 ++Node: array-rank1732539 ++Node: array-row-major-index1733308 ++Node: array-total-size1734825 ++Node: arrayp1736094 ++Node: fill-pointer1736845 ++Node: row-major-aref1737986 ++Node: upgraded-array-element-type1739073 ++Node: array-dimension-limit1740675 ++Node: array-rank-limit1741204 ++Node: array-total-size-limit1741698 ++Node: simple-vector-p1742466 ++Node: svref1743218 ++Node: vector1744277 ++Node: vector-pop1745173 ++Node: vector-push1746434 ++Node: vectorp1749247 ++Node: bit (Array)1749944 ++Node: bit-and1751266 ++Node: bit-vector-p1755663 ++Node: simple-bit-vector-p1756459 ++Node: Strings1757161 ++Node: String Concepts1757314 ++Node: Implications of Strings Being Arrays1757530 ++Node: Subtypes of STRING1758019 ++Node: Strings Dictionary1758426 ++Node: string (System Class)1758765 ++Node: base-string1759833 ++Node: simple-string1760779 ++Node: simple-base-string1761818 ++Node: simple-string-p1762728 ++Node: char1763481 ++Node: string1764998 ++Node: string-upcase1766257 ++Node: string-trim1770275 ++Node: string=1771901 ++Node: stringp1777370 ++Node: make-string1777983 ++Node: Sequences1778920 ++Node: Sequence Concepts1779117 ++Node: General Restrictions on Parameters that must be Sequences1780930 ++Node: Rules about Test Functions1781315 ++Node: Satisfying a Two-Argument Test1781584 ++Node: Examples of Satisfying a Two-Argument Test1784144 ++Node: Satisfying a One-Argument Test1785436 ++Node: Examples of Satisfying a One-Argument Test1787366 ++Node: Sequences Dictionary1787959 ++Node: sequence1788398 ++Node: copy-seq1789105 ++Node: elt1790257 ++Node: fill1791330 ++Node: make-sequence1792716 ++Node: subseq1794821 ++Node: map1796902 ++Node: map-into1799758 ++Node: reduce1802947 ++Node: count1806240 ++Node: length1808318 ++Node: reverse1809299 ++Node: sort1811428 ++Node: find1816863 ++Node: position1819099 ++Node: search1821241 ++Node: mismatch1823167 ++Node: replace1825470 ++Node: substitute1827776 ++Node: concatenate1833684 ++Node: merge1835854 ++Node: remove1839996 ++Node: remove-duplicates1846346 ++Node: Hash Tables1849840 ++Node: Hash Table Concepts1850016 ++Node: Hash-Table Operations1850248 ++Node: Modifying Hash Table Keys1852287 ++Node: Visible Modification of Objects with respect to EQ and EQL1854196 ++Node: Visible Modification of Objects with respect to EQUAL1854657 ++Node: Visible Modification of Conses with respect to EQUAL1855252 ++Node: Visible Modification of Bit Vectors and Strings with respect to EQUAL1855739 ++Node: Visible Modification of Objects with respect to EQUALP1856400 ++Node: Visible Modification of Structures with respect to EQUALP1857010 ++Node: Visible Modification of Arrays with respect to EQUALP1857491 ++Node: Visible Modification of Hash Tables with respect to EQUALP1858095 ++Node: Visible Modifications by Language Extensions1858804 ++Node: Hash Tables Dictionary1859564 ++Node: hash-table1859986 ++Node: make-hash-table1860763 ++Node: hash-table-p1863671 ++Node: hash-table-count1864408 ++Node: hash-table-rehash-size1865794 ++Node: hash-table-rehash-threshold1867305 ++Node: hash-table-size1868350 ++Node: hash-table-test1869123 ++Node: gethash1869981 ++Node: remhash1872121 ++Node: maphash1872958 ++Node: with-hash-table-iterator1874789 ++Node: clrhash1878221 ++Node: sxhash1879063 ++Node: Filenames1882037 ++Node: Overview of Filenames1882241 ++Node: Namestrings as Filenames1883040 ++Node: Pathnames as Filenames1884133 ++Node: Parsing Namestrings Into Pathnames1887573 ++Node: Pathnames1888315 ++Node: Pathname Components1888553 ++Node: The Pathname Host Component1889041 ++Node: The Pathname Device Component1889349 ++Node: The Pathname Directory Component1889730 ++Node: The Pathname Name Component1890079 ++Node: The Pathname Type Component1890396 ++Node: The Pathname Version Component1890809 ++Node: Interpreting Pathname Component Values1891458 ++Node: Strings in Component Values1892662 ++Node: Special Characters in Pathname Components1892933 ++Node: Case in Pathname Components1893835 ++Node: Local Case in Pathname Components1894626 ++Node: Common Case in Pathname Components1895425 ++Node: Special Pathname Component Values1896218 ++Node: NIL as a Component Value1896486 ++Node: ->WILD as a Component Value1897030 ++Node: ->UNSPECIFIC as a Component Value1898061 ++Node: Relation between component values NIL and ->UNSPECIFIC1899452 ++Node: Restrictions on Wildcard Pathnames1900299 ++Node: Restrictions on Examining Pathname Components1901162 ++Node: Restrictions on Examining a Pathname Host Component1902210 ++Node: Restrictions on Examining a Pathname Device Component1902649 ++Node: Restrictions on Examining a Pathname Directory Component1903353 ++Node: Directory Components in Non-Hierarchical File Systems1906956 ++Node: Restrictions on Examining a Pathname Name Component1907604 ++Node: Restrictions on Examining a Pathname Type Component1908031 ++Node: Restrictions on Examining a Pathname Version Component1908459 ++Node: Notes about the Pathname Version Component1909438 ++Node: Restrictions on Constructing Pathnames1910050 ++Node: Merging Pathnames1911592 ++Node: Examples of Merging Pathnames1912370 ++Node: Logical Pathnames1913247 ++Node: Syntax of Logical Pathname Namestrings1913486 ++Node: Additional Information about Parsing Logical Pathname Namestrings1915466 ++Node: The Host part of a Logical Pathname Namestring1915856 ++Node: The Device part of a Logical Pathname Namestring1916501 ++Node: The Directory part of a Logical Pathname Namestring1917032 ++Node: The Type part of a Logical Pathname Namestring1917630 ++Node: The Version part of a Logical Pathname Namestring1918125 ++Node: Wildcard Words in a Logical Pathname Namestring1918777 ++Node: Lowercase Letters in a Logical Pathname Namestring1919292 ++Node: Other Syntax in a Logical Pathname Namestring1919732 ++Node: Logical Pathname Components1920247 ++Node: Unspecific Components of a Logical Pathname1920554 ++Node: Null Strings as Components of a Logical Pathname1920986 ++Node: Filenames Dictionary1921348 ++Node: pathname (System Class)1921904 ++Node: logical-pathname (System Class)1922348 ++Node: pathname1922971 ++Node: make-pathname1925689 ++Node: pathnamep1930205 ++Node: pathname-host1931073 ++Node: load-logical-pathname-translations1935777 ++Node: logical-pathname-translations1937628 ++Node: logical-pathname1945662 ++Node: *default-pathname-defaults*1947029 ++Node: namestring1948249 ++Node: parse-namestring1952181 ++Node: wild-pathname-p1956931 ++Node: pathname-match-p1959054 ++Node: translate-logical-pathname1960272 ++Node: translate-pathname1962950 ++Node: merge-pathnames1969567 ++Node: Files1974203 ++Node: File System Concepts1974354 ++Node: Coercion of Streams to Pathnames1975365 ++Node: File Operations on Open and Closed Streams1976302 ++Node: Truenames1977550 ++Node: Examples of Truenames1978465 ++Node: Files Dictionary1980035 ++Node: directory1980352 ++Node: probe-file1981901 ++Node: ensure-directories-exist1983162 ++Node: truename1984788 ++Node: file-author1987420 ++Node: file-write-date1988445 ++Node: rename-file1989708 ++Node: delete-file1992235 ++Node: file-error1994031 ++Node: file-error-pathname1994790 ++Node: Streams1995334 ++Node: Stream Concepts1995484 ++Node: Introduction to Streams1995770 ++Node: Abstract Classifications of Streams (Introduction to Streams)1997026 ++Node: Input1997281 ++Node: Open and Closed Streams1999009 ++Node: Interactive Streams1999965 ++Node: Abstract Classifications of Streams2001361 ++Node: File Streams2001593 ++Node: Other Subclasses of Stream2002297 ++Node: Stream Variables2003645 ++Node: Stream Arguments to Standardized Functions2004974 ++Node: Restrictions on Composite Streams2008023 ++Node: Streams Dictionary2008530 ++Node: stream2009807 ++Node: broadcast-stream2010400 ++Node: concatenated-stream2013185 ++Node: echo-stream2014430 ++Node: file-stream2015186 ++Node: string-stream2015754 ++Node: synonym-stream2016377 ++Node: two-way-stream2017201 ++Node: input-stream-p2017757 ++Node: interactive-stream-p2018860 ++Node: open-stream-p2019944 ++Node: stream-element-type2020838 ++Node: streamp2022189 ++Node: read-byte2022844 ++Node: write-byte2024279 ++Node: peek-char2025398 ++Node: read-char2028204 ++Node: read-char-no-hang2030033 ++Node: terpri2032230 ++Node: unread-char2033786 ++Node: write-char2035753 ++Node: read-line2036631 ++Node: write-string2038643 ++Node: read-sequence2040229 ++Node: write-sequence2042524 ++Node: file-length2044145 ++Node: file-position2045180 ++Node: file-string-length2049033 ++Node: open2049809 ++Node: stream-external-format2059560 ++Node: with-open-file2060490 ++Node: close2063775 ++Node: with-open-stream2065934 ++Node: listen2067178 ++Node: clear-input2068292 ++Node: finish-output2070138 ++Node: y-or-n-p2071814 ++Node: make-synonym-stream2074450 ++Node: synonym-stream-symbol2075547 ++Node: broadcast-stream-streams2076067 ++Node: make-broadcast-stream2076608 ++Node: make-two-way-stream2077665 ++Node: two-way-stream-input-stream2078733 ++Node: echo-stream-input-stream2079574 ++Node: make-echo-stream2080330 ++Node: concatenated-stream-streams2081397 ++Node: make-concatenated-stream2082176 ++Node: get-output-stream-string2083073 ++Node: make-string-input-stream2084652 ++Node: make-string-output-stream2085812 ++Node: with-input-from-string2086933 ++Node: with-output-to-string2089485 ++Node: *debug-io*2092171 ++Node: *terminal-io*2096865 ++Node: stream-error2098379 ++Node: stream-error-stream2099028 ++Node: end-of-file2099768 ++Node: Printer2100572 ++Node: The Lisp Printer2100773 ++Node: Overview of The Lisp Printer2101056 ++Node: Multiple Possible Textual Representations2101758 ++Node: Printer Escaping2103947 ++Node: Printer Dispatching2104871 ++Node: Default Print-Object Methods2105437 ++Node: Printing Numbers2106348 ++Node: Printing Integers2106542 ++Node: Printing Ratios2107275 ++Node: Printing Floats2108025 ++Node: Printing Complexes2109660 ++Node: Note about Printing Numbers2110160 ++Node: Printing Characters2110508 ++Node: Printing Symbols2111447 ++Node: Package Prefixes for Symbols2112970 ++Node: Effect of Readtable Case on the Lisp Printer2114863 ++Node: Examples of Effect of Readtable Case on the Lisp Printer2116716 ++Node: Printing Strings2120133 ++Node: Printing Lists and Conses2120764 ++Node: Printing Bit Vectors2123210 ++Node: Printing Other Vectors2123859 ++Node: Printing Other Arrays2125357 ++Node: Examples of Printing Arrays2127618 ++Node: Printing Random States2128341 ++Node: Printing Pathnames2129226 ++Node: Printing Structures2129813 ++Node: Printing Other Objects2130755 ++Node: Examples of Printer Behavior2131631 ++Node: The Lisp Pretty Printer2133132 ++Node: Pretty Printer Concepts2133432 ++Node: Dynamic Control of the Arrangement of Output2135046 ++Node: Format Directive Interface2138088 ++Node: Compiling Format Strings2139476 ++Node: Pretty Print Dispatch Tables2140109 ++Node: Pretty Printer Margins2141713 ++Node: Examples of using the Pretty Printer2142210 ++Node: Notes about the Pretty Printer`s Background2153911 ++Node: Formatted Output2154432 ++Node: FORMAT Basic Output2159127 ++Node: Tilde C-> Character2159454 ++Node: Tilde Percent-> Newline2161259 ++Node: Tilde Ampersand-> Fresh-Line2161613 ++Node: Tilde Vertical-Bar-> Page2162023 ++Node: Tilde Tilde-> Tilde2162314 ++Node: FORMAT Radix Control2162523 ++Node: Tilde R-> Radix2162836 ++Node: Tilde D-> Decimal2164101 ++Node: Tilde B-> Binary2165416 ++Node: Tilde O-> Octal2165853 ++Node: Tilde X-> Hexadecimal2166291 ++Node: FORMAT Floating-Point Printers2166724 ++Node: Tilde F-> Fixed-Format Floating-Point2167121 ++Node: Tilde E-> Exponential Floating-Point2171212 ++Node: Tilde G-> General Floating-Point2176329 ++Node: Tilde Dollarsign-> Monetary Floating-Point2177696 ++Node: FORMAT Printer Operations2179962 ++Node: Tilde A-> Aesthetic2180261 ++Node: Tilde S-> Standard2181500 ++Node: Tilde W-> Write2181927 ++Node: FORMAT Pretty Printer Operations2182735 ++Node: Tilde Underscore-> Conditional Newline2183173 ++Node: Tilde Less-Than-Sign-> Logical Block2183665 ++Node: Tilde I-> Indent2187183 ++Node: Tilde Slash-> Call Function2187549 ++Node: FORMAT Layout Control2189409 ++Node: Tilde T-> Tabulate2189744 ++Node: Tilde Less-Than-Sign-> Justification2191969 ++Node: Tilde Greater-Than-Sign-> End of Justification2195385 ++Node: FORMAT Control-Flow Operations2195718 ++Node: Tilde Asterisk-> Go-To2196207 ++Node: Tilde Left-Bracket-> Conditional Expression2197100 ++Node: Tilde Right-Bracket-> End of Conditional Expression2199603 ++Node: Tilde Left-Brace-> Iteration2200004 ++Node: Tilde Right-Brace-> End of Iteration2203282 ++Node: Tilde Question-Mark-> Recursive Processing2203637 ++Node: FORMAT Miscellaneous Operations2204990 ++Node: Tilde Left-Paren-> Case Conversion2205353 ++Node: Tilde Right-Paren-> End of Case Conversion2206635 ++Node: Tilde P-> Plural2206989 ++Node: FORMAT Miscellaneous Pseudo-Operations2207768 ++Node: Tilde Semicolon-> Clause Separator2208166 ++Node: Tilde Circumflex-> Escape Upward2208551 ++Node: Tilde Newline-> Ignored Newline2211983 ++Node: Additional Information about FORMAT Operations2213395 ++Node: Nesting of FORMAT Operations2213839 ++Node: Missing and Additional FORMAT Arguments2215230 ++Node: Additional FORMAT Parameters2215723 ++Node: Undefined FORMAT Modifier Combinations2216124 ++Node: Examples of FORMAT2216535 ++Node: Notes about FORMAT2220515 ++Node: Printer Dictionary2221157 ++Node: copy-pprint-dispatch2221926 ++Node: formatter2222666 ++Node: pprint-dispatch2223856 ++Node: pprint-exit-if-list-exhausted2225386 ++Node: pprint-fill2226979 ++Node: pprint-indent2230407 ++Node: pprint-logical-block2232263 ++Node: pprint-newline2237752 ++Node: pprint-pop2242091 ++Node: pprint-tab2245302 ++Node: print-object2246687 ++Node: print-unreadable-object2251444 ++Node: set-pprint-dispatch2253262 ++Node: write2255448 ++Node: write-to-string2259749 ++Node: *print-array*2261941 ++Node: *print-base*2262789 ++Node: *print-case*2265097 ++Node: *print-circle*2267453 ++Node: *print-escape*2269073 ++Node: *print-gensym*2270212 ++Node: *print-level*2270862 ++Node: *print-lines*2273942 ++Node: *print-miser-width*2275328 ++Node: *print-pprint-dispatch*2275874 ++Node: *print-pretty*2277184 ++Node: *print-readably*2279094 ++Node: *print-right-margin*2282865 ++Node: print-not-readable2283743 ++Node: print-not-readable-object2284589 ++Node: format2285160 ++Node: Reader2286919 ++Node: Reader Concepts2287079 ++Node: Dynamic Control of the Lisp Reader2287365 ++Node: Effect of Readtable Case on the Lisp Reader2287751 ++Node: Examples of Effect of Readtable Case on the Lisp Reader2288796 ++Node: Argument Conventions of Some Reader Functions2290317 ++Node: The EOF-ERROR-P argument2290638 ++Node: The RECURSIVE-P argument2292267 ++Node: Reader Dictionary2295038 ++Node: readtable2295558 ++Node: copy-readtable2296367 ++Node: make-dispatch-macro-character2298260 ++Node: read2299513 ++Node: read-delimited-list2304716 ++Node: read-from-string2308419 ++Node: readtable-case2310892 ++Node: readtablep2312085 ++Node: set-dispatch-macro-character2312749 ++Node: set-macro-character2315815 ++Node: set-syntax-from-char2318369 ++Node: with-standard-io-syntax2320481 ++Node: *read-base*2323161 ++Node: *read-default-float-format*2324515 ++Node: *read-eval*2326054 ++Node: *read-suppress*2326764 ++Node: *readtable*2330412 ++Node: reader-error2331464 ++Node: System Construction2331998 ++Node: System Construction Concepts2332214 ++Node: Loading2332466 ++Node: Features2333423 ++Node: Feature Expressions2333932 ++Node: Examples of Feature Expressions2334955 ++Node: System Construction Dictionary2336740 ++Node: compile-file2337147 ++Node: compile-file-pathname2341905 ++Node: load2343950 ++Node: with-compilation-unit2349533 ++Node: *features*2351754 ++Node: *compile-file-pathname*2357191 ++Node: *load-pathname*2358503 ++Node: *compile-print*2359725 ++Node: *load-print*2360327 ++Node: *modules*2360965 ++Node: provide2361523 ++Node: Environment2364364 ++Node: The External Environment2364565 ++Node: Top level loop2364832 ++Node: Debugging Utilities2365701 ++Node: Environment Inquiry2366224 ++Node: Time2366959 ++Node: Decoded Time2368260 ++Node: Universal Time2369831 ++Node: Internal Time2370911 ++Node: Seconds2371529 ++Node: Environment Dictionary2372078 ++Node: decode-universal-time2372784 ++Node: encode-universal-time2374722 ++Node: get-universal-time2375884 ++Node: sleep2378019 ++Node: apropos2379099 ++Node: describe2380635 ++Node: describe-object2382478 ++Node: trace2385370 ++Node: step2388238 ++Node: time2389565 ++Node: internal-time-units-per-second2391440 ++Node: get-internal-real-time2392052 ++Node: get-internal-run-time2392902 ++Node: disassemble2394235 ++Node: documentation2395612 ++Node: room2402082 ++Node: ed2403175 ++Node: inspect2404633 ++Node: dribble2405524 ++Node: - (Variable)2407399 ++Node: + (Variable)2408041 ++Node: * (Variable)2409103 ++Node: / (Variable)2410639 ++Node: lisp-implementation-type2411783 ++Node: short-site-name2413000 ++Node: machine-instance2413949 ++Node: machine-type2414747 ++Node: machine-version2415402 ++Node: software-type2416108 ++Node: user-homedir-pathname2417114 ++Node: Glossary (Glossary)2418420 ++Node: Glossary2418561 ++Node: Appendix2579627 ++Node: Removed Language Features2579765 ++Node: Requirements for removed and deprecated features2580128 ++Node: Removed Types2581331 ++Node: Removed Operators2581564 ++Node: Removed Argument Conventions2581943 ++Node: Removed Variables2582261 ++Node: Removed Reader Syntax2582625 ++Node: Packages No Longer Required2582881 ++ ++End Tag Table ++ ++ ++Local Variables: ++coding: utf-8 ++End: +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-1 +@@ -0,0 +1,8012 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: Top, Next: Introduction (Introduction), Prev: (dir), Up: (dir) ++ ++* Menu: ++ ++* Introduction (Introduction):: ++* Syntax:: ++* Evaluation and Compilation:: ++* Types and Classes:: ++* Data and Control Flow:: ++* Iteration:: ++* Objects:: ++* Structures:: ++* Conditions:: ++* Symbols:: ++* Packages:: ++* Numbers (Numbers):: ++* Characters:: ++* Conses:: ++* Arrays:: ++* Strings:: ++* Sequences:: ++* Hash Tables:: ++* Filenames:: ++* Files:: ++* Streams:: ++* Printer:: ++* Reader:: ++* System Construction:: ++* Environment:: ++* Glossary (Glossary):: ++* Appendix:: ++ ++ -- The Detailed Node Listing -- ++ ++Introduction ++ ++* Scope:: ++* Organization of the Document:: ++* Referenced Publications:: ++* Definitions:: ++* Conformance:: ++* Language Extensions:: ++* Language Subsets:: ++* Deprecated Language Features:: ++* Symbols in the COMMON-LISP Package:: ++ ++Scope, Purpose, and History ++ ++* Scope and Purpose:: ++* History:: ++ ++Definitions ++ ++* Notational Conventions:: ++* Error Terminology:: ++* Sections Not Formally Part Of This Standard:: ++* Interpreting Dictionary Entries:: ++ ++Notational Conventions ++ ++* Font Key:: ++* Modified BNF Syntax:: ++* Splicing in Modified BNF Syntax:: ++* Indirection in Modified BNF Syntax:: ++* Additional Uses for Indirect Definitions in Modified BNF Syntax:: ++* Special Symbols:: ++* Objects with Multiple Notations:: ++* Case in Symbols:: ++* Numbers (Objects with Multiple Notations):: ++* Use of the Dot Character:: ++* NIL:: ++* Designators:: ++* Nonsense Words:: ++ ++Interpreting Dictionary Entries ++ ++* The "Affected By" Section of a Dictionary Entry:: ++* The "Arguments" Section of a Dictionary Entry:: ++* The "Arguments and Values" Section of a Dictionary Entry:: ++* The "Binding Types Affected" Section of a Dictionary Entry:: ++* The "Class Precedence List" Section of a Dictionary Entry:: ++* Dictionary Entries for Type Specifiers:: ++* The "Compound Type Specifier Kind" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Syntax" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Arguments" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Description" Section of a Dictionary Entry:: ++* The "Constant Value" Section of a Dictionary Entry:: ++* The "Description" Section of a Dictionary Entry:: ++* The "Examples" Section of a Dictionary Entry:: ++* The "Exceptional Situations" Section of a Dictionary Entry:: ++* The "Initial Value" Section of a Dictionary Entry:: ++* The "Argument Precedence Order" Section of a Dictionary Entry:: ++* The "Method Signature" Section of a Dictionary Entry:: ++* The "Name" Section of a Dictionary Entry:: ++* The "Notes" Section of a Dictionary Entry:: ++* The "Pronunciation" Section of a Dictionary Entry:: ++* The "See Also" Section of a Dictionary Entry:: ++* The "Side Effects" Section of a Dictionary Entry:: ++* The "Supertypes" Section of a Dictionary Entry:: ++* The "Syntax" Section of a Dictionary Entry:: ++* Special "Syntax" Notations for Overloaded Operators:: ++* Naming Conventions for Rest Parameters:: ++* Requiring Non-Null Rest Parameters in The "Syntax" Section:: ++* Return values in The "Syntax" Section:: ++* No Arguments or Values in The "Syntax" Section:: ++* Unconditional Transfer of Control in The "Syntax" Section:: ++* The "Valid Context" Section of a Dictionary Entry:: ++* The "Value Type" Section of a Dictionary Entry:: ++ ++Conformance ++ ++* Conforming Implementations:: ++* Conforming Programs:: ++ ++Conforming Implementations ++ ++* Required Language Features:: ++* Documentation of Implementation-Dependent Features:: ++* Documentation of Extensions:: ++* Treatment of Exceptional Situations:: ++* Resolution of Apparent Conflicts in Exceptional Situations:: ++* Examples of Resolution of Apparent Conflict in Exceptional Situations:: ++* Conformance Statement:: ++ ++Conforming Programs ++ ++* Use of Implementation-Defined Language Features:: ++* Use of Read-Time Conditionals:: ++ ++Deprecated Language Features ++ ++* Deprecated Functions:: ++* Deprecated Argument Conventions:: ++* Deprecated Variables:: ++* Deprecated Reader Syntax:: ++ ++Syntax ++ ++* Character Syntax:: ++* Reader Algorithm:: ++* Interpretation of Tokens:: ++* Standard Macro Characters:: ++ ++Character Syntax ++ ++* Readtables:: ++* Variables that affect the Lisp Reader:: ++* Standard Characters:: ++* Character Syntax Types:: ++ ++Readtables ++ ++* The Current Readtable:: ++* The Standard Readtable:: ++* The Initial Readtable:: ++ ++Character Syntax Types ++ ++* Constituent Characters:: ++* Constituent Traits:: ++* Invalid Characters:: ++* Macro Characters:: ++* Multiple Escape Characters:: ++* Examples of Multiple Escape Characters:: ++* Single Escape Character:: ++* Examples of Single Escape Characters:: ++* Whitespace Characters:: ++* Examples of Whitespace Characters:: ++ ++Interpretation of Tokens ++ ++* Numbers as Tokens:: ++* Constructing Numbers from Tokens:: ++* The Consing Dot:: ++* Symbols as Tokens:: ++* Valid Patterns for Tokens:: ++* Package System Consistency Rules:: ++ ++Numbers as Tokens ++ ++* Potential Numbers as Tokens:: ++* Escape Characters and Potential Numbers:: ++* Examples of Potential Numbers:: ++ ++Constructing Numbers from Tokens ++ ++* Syntax of a Rational:: ++* Syntax of an Integer:: ++* Syntax of a Ratio:: ++* Syntax of a Float:: ++* Syntax of a Complex:: ++ ++Standard Macro Characters ++ ++* Left-Parenthesis:: ++* Right-Parenthesis:: ++* Single-Quote:: ++* Semicolon:: ++* Double-Quote:: ++* Backquote:: ++* Comma:: ++* Sharpsign:: ++* Re-Reading Abbreviated Expressions:: ++ ++Single-Quote ++ ++* Examples of Single-Quote:: ++ ++Semicolon ++ ++* Examples of Semicolon:: ++* Notes about Style for Semicolon:: ++* Use of Single Semicolon:: ++* Use of Double Semicolon:: ++* Use of Triple Semicolon:: ++* Use of Quadruple Semicolon:: ++* Examples of Style for Semicolon:: ++ ++Backquote ++ ++* Notes about Backquote:: ++ ++Sharpsign ++ ++* Sharpsign Backslash:: ++* Sharpsign Single-Quote:: ++* Sharpsign Left-Parenthesis:: ++* Sharpsign Asterisk:: ++* Examples of Sharpsign Asterisk:: ++* Sharpsign Colon:: ++* Sharpsign Dot:: ++* Sharpsign B:: ++* Sharpsign O:: ++* Sharpsign X:: ++* Sharpsign R:: ++* Sharpsign C:: ++* Sharpsign A:: ++* Sharpsign S:: ++* Sharpsign P:: ++* Sharpsign Equal-Sign:: ++* Sharpsign Sharpsign:: ++* Sharpsign Plus:: ++* Sharpsign Minus:: ++* Sharpsign Vertical-Bar:: ++* Examples of Sharpsign Vertical-Bar:: ++* Notes about Style for Sharpsign Vertical-Bar:: ++* Sharpsign Less-Than-Sign:: ++* Sharpsign Whitespace:: ++* Sharpsign Right-Parenthesis:: ++ ++Evaluation and Compilation ++ ++* Evaluation:: ++* Compilation:: ++* Declarations:: ++* Lambda Lists:: ++* Error Checking in Function Calls:: ++* Traversal Rules and Side Effects:: ++* Destructive Operations:: ++* Evaluation and Compilation Dictionary:: ++ ++Evaluation ++ ++* Introduction to Environments:: ++* The Evaluation Model:: ++* Lambda Expressions:: ++* Closures and Lexical Binding:: ++* Shadowing:: ++* Extent:: ++* Return Values:: ++ ++Introduction to Environments ++ ++* The Global Environment:: ++* Dynamic Environments:: ++* Lexical Environments:: ++* The Null Lexical Environment:: ++* Environment Objects:: ++ ++The Evaluation Model ++ ++* Form Evaluation:: ++* Symbols as Forms:: ++* Lexical Variables:: ++* Dynamic Variables:: ++* Constant Variables:: ++* Symbols Naming Both Lexical and Dynamic Variables:: ++* Conses as Forms:: ++* Special Forms:: ++* Macro Forms:: ++* Function Forms:: ++* Lambda Forms:: ++* Self-Evaluating Objects:: ++* Examples of Self-Evaluating Objects:: ++ ++Compilation ++ ++* Compiler Terminology:: ++* Compilation Semantics:: ++* File Compilation:: ++* Literal Objects in Compiled Files:: ++* Exceptional Situations in the Compiler:: ++ ++Compilation Semantics ++ ++* Compiler Macros:: ++* Purpose of Compiler Macros:: ++* Naming of Compiler Macros:: ++* When Compiler Macros Are Used:: ++* Notes about the Implementation of Compiler Macros:: ++* Minimal Compilation:: ++* Semantic Constraints:: ++ ++File Compilation ++ ++* Processing of Top Level Forms:: ++* Processing of Defining Macros:: ++* Constraints on Macros and Compiler Macros:: ++ ++Literal Objects in Compiled Files ++ ++* Externalizable Objects:: ++* Similarity of Literal Objects:: ++* Similarity of Aggregate Objects:: ++* Definition of Similarity:: ++* Extensions to Similarity Rules:: ++* Additional Constraints on Externalizable Objects:: ++ ++Declarations ++ ++* Minimal Declaration Processing Requirements:: ++* Declaration Specifiers:: ++* Declaration Identifiers:: ++* Declaration Scope:: ++ ++Declaration Identifiers ++ ++* Shorthand notation for Type Declarations:: ++ ++Declaration Scope ++ ++* Examples of Declaration Scope:: ++ ++Lambda Lists ++ ++* Ordinary Lambda Lists:: ++* Generic Function Lambda Lists:: ++* Specialized Lambda Lists:: ++* Macro Lambda Lists:: ++* Destructuring Lambda Lists:: ++* Boa Lambda Lists:: ++* Defsetf Lambda Lists:: ++* Deftype Lambda Lists:: ++* Define-modify-macro Lambda Lists:: ++* Define-method-combination Arguments Lambda Lists:: ++* Syntactic Interaction of Documentation Strings and Declarations:: ++ ++Ordinary Lambda Lists ++ ++* Specifiers for the required parameters:: ++* Specifiers for optional parameters:: ++* A specifier for a rest parameter:: ++* Specifiers for keyword parameters:: ++* Suppressing Keyword Argument Checking:: ++* Examples of Suppressing Keyword Argument Checking:: ++* Specifiers for &aux variables:: ++* Examples of Ordinary Lambda Lists:: ++ ++Macro Lambda Lists ++ ++* Destructuring by Lambda Lists:: ++* Data-directed Destructuring by Lambda Lists:: ++* Examples of Data-directed Destructuring by Lambda Lists:: ++* Lambda-list-directed Destructuring by Lambda Lists:: ++ ++Error Checking in Function Calls ++ ++* Argument Mismatch Detection:: ++ ++Argument Mismatch Detection ++ ++* Safe and Unsafe Calls:: ++* Error Detection Time in Safe Calls:: ++* Too Few Arguments:: ++* Too Many Arguments:: ++* Unrecognized Keyword Arguments:: ++* Invalid Keyword Arguments:: ++* Odd Number of Keyword Arguments:: ++* Destructuring Mismatch:: ++* Errors When Calling a Next Method:: ++ ++Destructive Operations ++ ++* Modification of Literal Objects:: ++* Transfer of Control during a Destructive Operation:: ++ ++Transfer of Control during a Destructive Operation ++ ++* Examples of Transfer of Control during a Destructive Operation:: ++ ++Evaluation and Compilation Dictionary ++ ++* lambda (Symbol):: ++* lambda:: ++* compile:: ++* eval:: ++* eval-when:: ++* load-time-value:: ++* quote:: ++* compiler-macro-function:: ++* define-compiler-macro:: ++* defmacro:: ++* macro-function:: ++* macroexpand:: ++* define-symbol-macro:: ++* symbol-macrolet:: ++* *macroexpand-hook*:: ++* proclaim:: ++* declaim:: ++* declare:: ++* ignore:: ++* dynamic-extent:: ++* type:: ++* inline:: ++* ftype:: ++* declaration:: ++* optimize:: ++* special:: ++* locally:: ++* the:: ++* special-operator-p:: ++* constantp:: ++ ++Types and Classes ++ ++* Introduction (Types and Classes):: ++* Types:: ++* Classes:: ++* Types and Classes Dictionary:: ++ ++Types ++ ++* Data Type Definition:: ++* Type Relationships:: ++* Type Specifiers:: ++ ++Classes ++ ++* Introduction to Classes:: ++* Defining Classes:: ++* Creating Instances of Classes:: ++* Inheritance:: ++* Determining the Class Precedence List:: ++* Redefining Classes:: ++* Integrating Types and Classes:: ++ ++Introduction to Classes ++ ++* Standard Metaclasses:: ++ ++Inheritance ++ ++* Examples of Inheritance:: ++* Inheritance of Class Options:: ++ ++Determining the Class Precedence List ++ ++* Topological Sorting:: ++* Examples of Class Precedence List Determination:: ++ ++Redefining Classes ++ ++* Modifying the Structure of Instances:: ++* Initializing Newly Added Local Slots (Redefining Classes):: ++* Customizing Class Redefinition:: ++ ++Types and Classes Dictionary ++ ++* nil (Type):: ++* boolean:: ++* function (System Class):: ++* compiled-function:: ++* generic-function:: ++* standard-generic-function:: ++* class:: ++* built-in-class:: ++* structure-class:: ++* standard-class:: ++* method:: ++* standard-method:: ++* structure-object:: ++* standard-object:: ++* method-combination:: ++* t (System Class):: ++* satisfies:: ++* member (Type Specifier):: ++* not (Type Specifier):: ++* and (Type Specifier):: ++* or (Type Specifier):: ++* values (Type Specifier):: ++* eql (Type Specifier):: ++* coerce:: ++* deftype:: ++* subtypep:: ++* type-of:: ++* typep:: ++* type-error:: ++* type-error-datum:: ++* simple-type-error:: ++ ++Data and Control Flow ++ ++* Generalized Reference:: ++* Transfer of Control to an Exit Point:: ++* Data and Control Flow Dictionary:: ++ ++Generalized Reference ++ ++* Overview of Places and Generalized Reference:: ++* Kinds of Places:: ++* Treatment of Other Macros Based on SETF:: ++ ++Overview of Places and Generalized Reference ++ ++* Evaluation of Subforms to Places:: ++* Examples of Evaluation of Subforms to Places:: ++* Setf Expansions:: ++* Examples of Setf Expansions:: ++ ++Kinds of Places ++ ++* Variable Names as Places:: ++* Function Call Forms as Places:: ++* VALUES Forms as Places:: ++* THE Forms as Places:: ++* APPLY Forms as Places:: ++* Setf Expansions and Places:: ++* Macro Forms as Places:: ++* Symbol Macros as Places:: ++* Other Compound Forms as Places:: ++ ++Data and Control Flow Dictionary ++ ++* apply:: ++* defun:: ++* fdefinition:: ++* fboundp:: ++* fmakunbound:: ++* flet:: ++* funcall:: ++* function (Special Operator):: ++* function-lambda-expression:: ++* functionp:: ++* compiled-function-p:: ++* call-arguments-limit:: ++* lambda-list-keywords:: ++* lambda-parameters-limit:: ++* defconstant:: ++* defparameter:: ++* destructuring-bind:: ++* let:: ++* progv:: ++* setq:: ++* psetq:: ++* block:: ++* catch:: ++* go:: ++* return-from:: ++* return:: ++* tagbody:: ++* throw:: ++* unwind-protect:: ++* nil:: ++* not:: ++* t:: ++* eq:: ++* eql:: ++* equal:: ++* equalp:: ++* identity:: ++* complement:: ++* constantly:: ++* every:: ++* and:: ++* cond:: ++* if:: ++* or:: ++* when:: ++* case:: ++* typecase:: ++* multiple-value-bind:: ++* multiple-value-call:: ++* multiple-value-list:: ++* multiple-value-prog1:: ++* multiple-value-setq:: ++* values:: ++* values-list:: ++* multiple-values-limit:: ++* nth-value:: ++* prog:: ++* prog1:: ++* progn:: ++* define-modify-macro:: ++* defsetf:: ++* define-setf-expander:: ++* get-setf-expansion:: ++* setf:: ++* shiftf:: ++* rotatef:: ++* control-error:: ++* program-error:: ++* undefined-function:: ++ ++Iteration ++ ++* The LOOP Facility:: ++* Iteration Dictionary:: ++ ++The LOOP Facility ++ ++* Overview of the Loop Facility:: ++* Variable Initialization and Stepping Clauses:: ++* Value Accumulation Clauses:: ++* Termination Test Clauses:: ++* Unconditional Execution Clauses:: ++* Conditional Execution Clauses:: ++* Miscellaneous Clauses:: ++* Examples of Miscellaneous Loop Features:: ++* Notes about Loop:: ++ ++Overview of the Loop Facility ++ ++* Simple vs Extended Loop:: ++* Simple Loop:: ++* Extended Loop:: ++* Loop Keywords:: ++* Parsing Loop Clauses:: ++* Expanding Loop Forms:: ++* Summary of Loop Clauses:: ++* Summary of Variable Initialization and Stepping Clauses:: ++* Summary of Value Accumulation Clauses:: ++* Summary of Termination Test Clauses:: ++* Summary of Unconditional Execution Clauses:: ++* Summary of Conditional Execution Clauses:: ++* Summary of Miscellaneous Clauses:: ++* Order of Execution:: ++* Destructuring:: ++* Restrictions on Side-Effects:: ++ ++Variable Initialization and Stepping Clauses ++ ++* Iteration Control:: ++* The for-as-arithmetic subclause:: ++* Examples of for-as-arithmetic subclause:: ++* The for-as-in-list subclause:: ++* Examples of for-as-in-list subclause:: ++* The for-as-on-list subclause:: ++* Examples of for-as-on-list subclause:: ++* The for-as-equals-then subclause:: ++* Examples of for-as-equals-then subclause:: ++* The for-as-across subclause:: ++* Examples of for-as-across subclause:: ++* The for-as-hash subclause:: ++* The for-as-package subclause:: ++* Examples of for-as-package subclause:: ++* Local Variable Initializations:: ++* Examples of WITH clause:: ++ ++Value Accumulation Clauses ++ ++* Examples of COLLECT clause:: ++* Examples of APPEND and NCONC clauses:: ++* Examples of COUNT clause:: ++* Examples of MAXIMIZE and MINIMIZE clauses:: ++* Examples of SUM clause:: ++ ++Termination Test Clauses ++ ++* Examples of REPEAT clause:: ++* Examples of ALWAYS:: ++* Examples of WHILE and UNTIL clauses:: ++ ++Unconditional Execution Clauses ++ ++* Examples of unconditional execution:: ++ ++Conditional Execution Clauses ++ ++* Examples of WHEN clause:: ++ ++Miscellaneous Clauses ++ ++* Control Transfer Clauses:: ++* Examples of NAMED clause:: ++* Initial and Final Execution:: ++ ++Examples of Miscellaneous Loop Features ++ ++* Examples of clause grouping:: ++ ++Iteration Dictionary ++ ++* do:: ++* dotimes:: ++* dolist:: ++* loop:: ++* loop-finish:: ++ ++Objects ++ ++* Object Creation and Initialization:: ++* Changing the Class of an Instance:: ++* Reinitializing an Instance:: ++* Meta-Objects:: ++* Slots:: ++* Generic Functions and Methods:: ++* Objects Dictionary:: ++ ++Object Creation and Initialization ++ ++* Initialization Arguments:: ++* Declaring the Validity of Initialization Arguments:: ++* Defaulting of Initialization Arguments:: ++* Rules for Initialization Arguments:: ++* Shared-Initialize:: ++* Initialize-Instance:: ++* Definitions of Make-Instance and Initialize-Instance:: ++ ++Changing the Class of an Instance ++ ++* Modifying the Structure of the Instance:: ++* Initializing Newly Added Local Slots (Changing the Class of an Instance):: ++* Customizing the Change of Class of an Instance:: ++ ++Reinitializing an Instance ++ ++* Customizing Reinitialization:: ++ ++Meta-Objects ++ ++* Standard Meta-objects:: ++ ++Slots ++ ++* Introduction to Slots:: ++* Accessing Slots:: ++* Inheritance of Slots and Slot Options:: ++ ++Generic Functions and Methods ++ ++* Introduction to Generic Functions:: ++* Introduction to Methods:: ++* Agreement on Parameter Specializers and Qualifiers:: ++* Congruent Lambda-lists for all Methods of a Generic Function:: ++* Keyword Arguments in Generic Functions and Methods:: ++* Method Selection and Combination:: ++* Inheritance of Methods:: ++ ++Keyword Arguments in Generic Functions and Methods ++ ++* Examples of Keyword Arguments in Generic Functions and Methods:: ++ ++Method Selection and Combination ++ ++* Determining the Effective Method:: ++* Selecting the Applicable Methods:: ++* Sorting the Applicable Methods by Precedence Order:: ++* Applying method combination to the sorted list of applicable methods:: ++* Standard Method Combination:: ++* Declarative Method Combination:: ++* Built-in Method Combination Types:: ++ ++Objects Dictionary ++ ++* function-keywords:: ++* ensure-generic-function:: ++* allocate-instance:: ++* reinitialize-instance:: ++* shared-initialize:: ++* update-instance-for-different-class:: ++* update-instance-for-redefined-class:: ++* change-class:: ++* slot-boundp:: ++* slot-exists-p:: ++* slot-makunbound:: ++* slot-missing:: ++* slot-unbound:: ++* slot-value:: ++* method-qualifiers:: ++* no-applicable-method:: ++* no-next-method:: ++* remove-method:: ++* make-instance:: ++* make-instances-obsolete:: ++* make-load-form:: ++* make-load-form-saving-slots:: ++* with-accessors:: ++* with-slots:: ++* defclass:: ++* defgeneric:: ++* defmethod:: ++* find-class:: ++* next-method-p:: ++* call-method:: ++* call-next-method:: ++* compute-applicable-methods:: ++* define-method-combination:: ++* find-method:: ++* add-method:: ++* initialize-instance:: ++* class-name:: ++* (setf class-name):: ++* class-of:: ++* unbound-slot:: ++* unbound-slot-instance:: ++ ++Structures ++ ++* Structures Dictionary:: ++ ++Structures Dictionary ++ ++* defstruct:: ++* copy-structure:: ++ ++Conditions ++ ++* Condition System Concepts:: ++* Conditions Dictionary:: ++ ++Condition System Concepts ++ ++* Condition Types:: ++* Creating Conditions:: ++* Printing Conditions:: ++* Signaling and Handling Conditions:: ++* Assertions:: ++* Notes about the Condition System`s Background:: ++ ++Condition Types ++ ++* Serious Conditions:: ++ ++Creating Conditions ++ ++* Condition Designators:: ++ ++Printing Conditions ++ ++* Recommended Style in Condition Reporting:: ++* Capitalization and Punctuation in Condition Reports:: ++* Leading and Trailing Newlines in Condition Reports:: ++* Embedded Newlines in Condition Reports:: ++* Note about Tabs in Condition Reports:: ++* Mentioning Containing Function in Condition Reports:: ++ ++Signaling and Handling Conditions ++ ++* Signaling:: ++* Resignaling a Condition:: ++* Restarts:: ++* Interactive Use of Restarts:: ++* Interfaces to Restarts:: ++* Restart Tests:: ++* Associating a Restart with a Condition:: ++ ++Conditions Dictionary ++ ++* condition:: ++* warning:: ++* style-warning:: ++* serious-condition:: ++* error (Condition Type):: ++* cell-error:: ++* cell-error-name:: ++* parse-error:: ++* storage-condition:: ++* assert:: ++* error:: ++* cerror:: ++* check-type:: ++* simple-error:: ++* invalid-method-error:: ++* method-combination-error:: ++* signal:: ++* simple-condition:: ++* simple-condition-format-control:: ++* warn:: ++* simple-warning:: ++* invoke-debugger:: ++* break:: ++* *debugger-hook*:: ++* *break-on-signals*:: ++* handler-bind:: ++* handler-case:: ++* ignore-errors:: ++* define-condition:: ++* make-condition:: ++* restart:: ++* compute-restarts:: ++* find-restart:: ++* invoke-restart:: ++* invoke-restart-interactively:: ++* restart-bind:: ++* restart-case:: ++* restart-name:: ++* with-condition-restarts:: ++* with-simple-restart:: ++* abort (Restart):: ++* continue:: ++* muffle-warning:: ++* store-value:: ++* use-value:: ++* abort (Function):: ++ ++Symbols ++ ++* Symbol Concepts:: ++* Symbols Dictionary:: ++ ++Symbols Dictionary ++ ++* symbol:: ++* keyword:: ++* symbolp:: ++* keywordp:: ++* make-symbol:: ++* copy-symbol:: ++* gensym:: ++* *gensym-counter*:: ++* gentemp:: ++* symbol-function:: ++* symbol-name:: ++* symbol-package:: ++* symbol-plist:: ++* symbol-value:: ++* get:: ++* remprop:: ++* boundp:: ++* makunbound:: ++* set:: ++* unbound-variable:: ++ ++Packages ++ ++* Package Concepts:: ++* Packages Dictionary:: ++ ++Package Concepts ++ ++* Introduction to Packages:: ++* Standardized Packages:: ++ ++Introduction to Packages ++ ++* Package Names and Nicknames:: ++* Symbols in a Package:: ++* Internal and External Symbols:: ++* Package Inheritance:: ++* Accessibility of Symbols in a Package:: ++* Locating a Symbol in a Package:: ++* Prevention of Name Conflicts in Packages:: ++ ++Standardized Packages ++ ++* The COMMON-LISP Package:: ++* Constraints on the COMMON-LISP Package for Conforming Implementations:: ++* Constraints on the COMMON-LISP Package for Conforming Programs:: ++* Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs:: ++* The COMMON-LISP-USER Package:: ++* The KEYWORD Package:: ++* Interning a Symbol in the KEYWORD Package:: ++* Notes about The KEYWORD Package:: ++* Implementation-Defined Packages:: ++ ++Packages Dictionary ++ ++* package:: ++* export:: ++* find-symbol:: ++* find-package:: ++* find-all-symbols:: ++* import:: ++* list-all-packages:: ++* rename-package:: ++* shadow:: ++* shadowing-import:: ++* delete-package:: ++* make-package:: ++* with-package-iterator:: ++* unexport:: ++* unintern:: ++* in-package:: ++* unuse-package:: ++* use-package:: ++* defpackage:: ++* do-symbols:: ++* intern:: ++* package-name:: ++* package-nicknames:: ++* package-shadowing-symbols:: ++* package-use-list:: ++* package-used-by-list:: ++* packagep:: ++* *package*:: ++* package-error:: ++* package-error-package:: ++ ++Numbers ++ ++* Number Concepts:: ++* Numbers Dictionary:: ++ ++Number Concepts ++ ++* Numeric Operations:: ++* Implementation-Dependent Numeric Constants:: ++* Rational Computations:: ++* Floating-point Computations:: ++* Complex Computations:: ++* Interval Designators:: ++* Random-State Operations:: ++ ++Numeric Operations ++ ++* Associativity and Commutativity in Numeric Operations:: ++* Examples of Associativity and Commutativity in Numeric Operations:: ++* Contagion in Numeric Operations:: ++* Viewing Integers as Bits and Bytes:: ++* Logical Operations on Integers:: ++* Byte Operations on Integers:: ++ ++Rational Computations ++ ++* Rule of Unbounded Rational Precision:: ++* Rule of Canonical Representation for Rationals:: ++* Rule of Float Substitutability:: ++ ++Floating-point Computations ++ ++* Rule of Float and Rational Contagion:: ++* Examples of Rule of Float and Rational Contagion:: ++* Rule of Float Approximation:: ++* Rule of Float Underflow and Overflow:: ++* Rule of Float Precision Contagion:: ++ ++Complex Computations ++ ++* Rule of Complex Substitutability:: ++* Rule of Complex Contagion:: ++* Rule of Canonical Representation for Complex Rationals:: ++* Examples of Rule of Canonical Representation for Complex Rationals:: ++* Principal Values and Branch Cuts:: ++ ++Numbers Dictionary ++ ++* number:: ++* complex (System Class):: ++* real:: ++* float (System Class):: ++* short-float:: ++* rational (System Class):: ++* ratio:: ++* integer:: ++* signed-byte:: ++* unsigned-byte:: ++* mod (System Class):: ++* bit (System Class):: ++* fixnum:: ++* bignum:: ++* =:: ++* max:: ++* minusp:: ++* zerop:: ++* floor:: ++* sin:: ++* asin:: ++* pi:: ++* sinh:: ++* *:: ++* +:: ++* -:: ++* /:: ++* 1+:: ++* abs:: ++* evenp:: ++* exp:: ++* gcd:: ++* incf:: ++* lcm:: ++* log:: ++* mod (Function):: ++* signum:: ++* sqrt:: ++* random-state:: ++* make-random-state:: ++* random:: ++* random-state-p:: ++* *random-state*:: ++* numberp:: ++* cis:: ++* complex:: ++* complexp:: ++* conjugate:: ++* phase:: ++* realpart:: ++* upgraded-complex-part-type:: ++* realp:: ++* numerator:: ++* rational (Function):: ++* rationalp:: ++* ash:: ++* integer-length:: ++* integerp:: ++* parse-integer:: ++* boole:: ++* boole-1:: ++* logand:: ++* logbitp:: ++* logcount:: ++* logtest:: ++* byte:: ++* deposit-field:: ++* dpb:: ++* ldb:: ++* ldb-test:: ++* mask-field:: ++* most-positive-fixnum:: ++* decode-float:: ++* float:: ++* floatp:: ++* most-positive-short-float:: ++* short-float-epsilon:: ++* arithmetic-error:: ++* arithmetic-error-operands:: ++* division-by-zero:: ++* floating-point-invalid-operation:: ++* floating-point-inexact:: ++* floating-point-overflow:: ++* floating-point-underflow:: ++ ++Characters ++ ++* Character Concepts:: ++* Characters Dictionary:: ++ ++Character Concepts ++ ++* Introduction to Characters:: ++* Introduction to Scripts and Repertoires:: ++* Character Attributes:: ++* Character Categories:: ++* Identity of Characters:: ++* Ordering of Characters:: ++* Character Names:: ++* Treatment of Newline during Input and Output:: ++* Character Encodings:: ++* Documentation of Implementation-Defined Scripts:: ++ ++Introduction to Scripts and Repertoires ++ ++* Character Scripts:: ++* Character Repertoires:: ++ ++Character Categories ++ ++* Graphic Characters:: ++* Alphabetic Characters:: ++* Characters With Case:: ++* Uppercase Characters:: ++* Lowercase Characters:: ++* Corresponding Characters in the Other Case:: ++* Case of Implementation-Defined Characters:: ++* Numeric Characters:: ++* Alphanumeric Characters:: ++* Digits in a Radix:: ++ ++Characters Dictionary ++ ++* character (System Class):: ++* base-char:: ++* standard-char:: ++* extended-char:: ++* char=:: ++* character:: ++* characterp:: ++* alpha-char-p:: ++* alphanumericp:: ++* digit-char:: ++* digit-char-p:: ++* graphic-char-p:: ++* standard-char-p:: ++* char-upcase:: ++* upper-case-p:: ++* char-code:: ++* char-int:: ++* code-char:: ++* char-code-limit:: ++* char-name:: ++* name-char:: ++ ++Conses ++ ++* Cons Concepts:: ++* Conses Dictionary:: ++ ++Cons Concepts ++ ++* Conses as Trees:: ++* Conses as Lists:: ++ ++Conses as Trees ++ ++* General Restrictions on Parameters that must be Trees:: ++ ++Conses as Lists ++ ++* Lists as Association Lists:: ++* Lists as Sets:: ++* General Restrictions on Parameters that must be Lists:: ++ ++Conses Dictionary ++ ++* list (System Class):: ++* null (System Class):: ++* cons (System Class):: ++* atom (Type):: ++* cons:: ++* consp:: ++* atom:: ++* rplaca:: ++* car:: ++* copy-tree:: ++* sublis:: ++* subst:: ++* tree-equal:: ++* copy-list:: ++* list (Function):: ++* list-length:: ++* listp:: ++* make-list:: ++* push:: ++* pop:: ++* first:: ++* nth:: ++* endp:: ++* null:: ++* nconc:: ++* append:: ++* revappend:: ++* butlast:: ++* last:: ++* ldiff:: ++* nthcdr:: ++* rest:: ++* member (Function):: ++* mapc:: ++* acons:: ++* assoc:: ++* copy-alist:: ++* pairlis:: ++* rassoc:: ++* get-properties:: ++* getf:: ++* remf:: ++* intersection:: ++* adjoin:: ++* pushnew:: ++* set-difference:: ++* set-exclusive-or:: ++* subsetp:: ++* union:: ++ ++Arrays ++ ++* Array Concepts:: ++* Arrays Dictionary:: ++ ++Array Concepts ++ ++* Array Elements:: ++* Specialized Arrays:: ++ ++Array Elements ++ ++* Array Indices:: ++* Array Dimensions:: ++* Implementation Limits on Individual Array Dimensions:: ++* Array Rank:: ++* Vectors:: ++* Fill Pointers:: ++* Multidimensional Arrays:: ++* Storage Layout for Multidimensional Arrays:: ++* Implementation Limits on Array Rank:: ++ ++Specialized Arrays ++ ++* Array Upgrading:: ++* Required Kinds of Specialized Arrays:: ++ ++Arrays Dictionary ++ ++* array:: ++* simple-array:: ++* vector (System Class):: ++* simple-vector:: ++* bit-vector:: ++* simple-bit-vector:: ++* make-array:: ++* adjust-array:: ++* adjustable-array-p:: ++* aref:: ++* array-dimension:: ++* array-dimensions:: ++* array-element-type:: ++* array-has-fill-pointer-p:: ++* array-displacement:: ++* array-in-bounds-p:: ++* array-rank:: ++* array-row-major-index:: ++* array-total-size:: ++* arrayp:: ++* fill-pointer:: ++* row-major-aref:: ++* upgraded-array-element-type:: ++* array-dimension-limit:: ++* array-rank-limit:: ++* array-total-size-limit:: ++* simple-vector-p:: ++* svref:: ++* vector:: ++* vector-pop:: ++* vector-push:: ++* vectorp:: ++* bit (Array):: ++* bit-and:: ++* bit-vector-p:: ++* simple-bit-vector-p:: ++ ++Strings ++ ++* String Concepts:: ++* Strings Dictionary:: ++ ++String Concepts ++ ++* Implications of Strings Being Arrays:: ++* Subtypes of STRING:: ++ ++Strings Dictionary ++ ++* string (System Class):: ++* base-string:: ++* simple-string:: ++* simple-base-string:: ++* simple-string-p:: ++* char:: ++* string:: ++* string-upcase:: ++* string-trim:: ++* string=:: ++* stringp:: ++* make-string:: ++ ++Sequences ++ ++* Sequence Concepts:: ++* Rules about Test Functions:: ++* Sequences Dictionary:: ++ ++Sequence Concepts ++ ++* General Restrictions on Parameters that must be Sequences:: ++ ++Rules about Test Functions ++ ++* Satisfying a Two-Argument Test:: ++* Satisfying a One-Argument Test:: ++ ++Satisfying a Two-Argument Test ++ ++* Examples of Satisfying a Two-Argument Test:: ++ ++Satisfying a One-Argument Test ++ ++* Examples of Satisfying a One-Argument Test:: ++ ++Sequences Dictionary ++ ++* sequence:: ++* copy-seq:: ++* elt:: ++* fill:: ++* make-sequence:: ++* subseq:: ++* map:: ++* map-into:: ++* reduce:: ++* count:: ++* length:: ++* reverse:: ++* sort:: ++* find:: ++* position:: ++* search:: ++* mismatch:: ++* replace:: ++* substitute:: ++* concatenate:: ++* merge:: ++* remove:: ++* remove-duplicates:: ++ ++Hash Tables ++ ++* Hash Table Concepts:: ++* Hash Tables Dictionary:: ++ ++Hash Table Concepts ++ ++* Hash-Table Operations:: ++* Modifying Hash Table Keys:: ++ ++Modifying Hash Table Keys ++ ++* Visible Modification of Objects with respect to EQ and EQL:: ++* Visible Modification of Objects with respect to EQUAL:: ++* Visible Modification of Conses with respect to EQUAL:: ++* Visible Modification of Bit Vectors and Strings with respect to EQUAL:: ++* Visible Modification of Objects with respect to EQUALP:: ++* Visible Modification of Structures with respect to EQUALP:: ++* Visible Modification of Arrays with respect to EQUALP:: ++* Visible Modification of Hash Tables with respect to EQUALP:: ++* Visible Modifications by Language Extensions:: ++ ++Hash Tables Dictionary ++ ++* hash-table:: ++* make-hash-table:: ++* hash-table-p:: ++* hash-table-count:: ++* hash-table-rehash-size:: ++* hash-table-rehash-threshold:: ++* hash-table-size:: ++* hash-table-test:: ++* gethash:: ++* remhash:: ++* maphash:: ++* with-hash-table-iterator:: ++* clrhash:: ++* sxhash:: ++ ++Filenames ++ ++* Overview of Filenames:: ++* Pathnames:: ++* Logical Pathnames:: ++* Filenames Dictionary:: ++ ++Overview of Filenames ++ ++* Namestrings as Filenames:: ++* Pathnames as Filenames:: ++* Parsing Namestrings Into Pathnames:: ++ ++Pathnames ++ ++* Pathname Components:: ++* Interpreting Pathname Component Values:: ++* Merging Pathnames:: ++ ++Pathname Components ++ ++* The Pathname Host Component:: ++* The Pathname Device Component:: ++* The Pathname Directory Component:: ++* The Pathname Name Component:: ++* The Pathname Type Component:: ++* The Pathname Version Component:: ++ ++Interpreting Pathname Component Values ++ ++* Strings in Component Values:: ++* Special Characters in Pathname Components:: ++* Case in Pathname Components:: ++* Local Case in Pathname Components:: ++* Common Case in Pathname Components:: ++* Special Pathname Component Values:: ++* NIL as a Component Value:: ++* ->WILD as a Component Value:: ++* ->UNSPECIFIC as a Component Value:: ++* Relation between component values NIL and ->UNSPECIFIC:: ++* Restrictions on Wildcard Pathnames:: ++* Restrictions on Examining Pathname Components:: ++* Restrictions on Examining a Pathname Host Component:: ++* Restrictions on Examining a Pathname Device Component:: ++* Restrictions on Examining a Pathname Directory Component:: ++* Directory Components in Non-Hierarchical File Systems:: ++* Restrictions on Examining a Pathname Name Component:: ++* Restrictions on Examining a Pathname Type Component:: ++* Restrictions on Examining a Pathname Version Component:: ++* Notes about the Pathname Version Component:: ++* Restrictions on Constructing Pathnames:: ++ ++Merging Pathnames ++ ++* Examples of Merging Pathnames:: ++ ++Logical Pathnames ++ ++* Syntax of Logical Pathname Namestrings:: ++* Logical Pathname Components:: ++ ++Syntax of Logical Pathname Namestrings ++ ++* Additional Information about Parsing Logical Pathname Namestrings:: ++* The Host part of a Logical Pathname Namestring:: ++* The Device part of a Logical Pathname Namestring:: ++* The Directory part of a Logical Pathname Namestring:: ++* The Type part of a Logical Pathname Namestring:: ++* The Version part of a Logical Pathname Namestring:: ++* Wildcard Words in a Logical Pathname Namestring:: ++* Lowercase Letters in a Logical Pathname Namestring:: ++* Other Syntax in a Logical Pathname Namestring:: ++ ++Logical Pathname Components ++ ++* Unspecific Components of a Logical Pathname:: ++* Null Strings as Components of a Logical Pathname:: ++ ++Filenames Dictionary ++ ++* pathname (System Class):: ++* logical-pathname (System Class):: ++* pathname:: ++* make-pathname:: ++* pathnamep:: ++* pathname-host:: ++* load-logical-pathname-translations:: ++* logical-pathname-translations:: ++* logical-pathname:: ++* *default-pathname-defaults*:: ++* namestring:: ++* parse-namestring:: ++* wild-pathname-p:: ++* pathname-match-p:: ++* translate-logical-pathname:: ++* translate-pathname:: ++* merge-pathnames:: ++ ++Files ++ ++* File System Concepts:: ++* Files Dictionary:: ++ ++File System Concepts ++ ++* Coercion of Streams to Pathnames:: ++* File Operations on Open and Closed Streams:: ++* Truenames:: ++ ++Truenames ++ ++* Examples of Truenames:: ++ ++Files Dictionary ++ ++* directory:: ++* probe-file:: ++* ensure-directories-exist:: ++* truename:: ++* file-author:: ++* file-write-date:: ++* rename-file:: ++* delete-file:: ++* file-error:: ++* file-error-pathname:: ++ ++Streams ++ ++* Stream Concepts:: ++* Streams Dictionary:: ++ ++Stream Concepts ++ ++* Introduction to Streams:: ++* Stream Variables:: ++* Stream Arguments to Standardized Functions:: ++* Restrictions on Composite Streams:: ++ ++Introduction to Streams ++ ++* Abstract Classifications of Streams (Introduction to Streams):: ++* Input:: ++* Open and Closed Streams:: ++* Interactive Streams:: ++* Abstract Classifications of Streams:: ++* File Streams:: ++* Other Subclasses of Stream:: ++ ++Streams Dictionary ++ ++* stream:: ++* broadcast-stream:: ++* concatenated-stream:: ++* echo-stream:: ++* file-stream:: ++* string-stream:: ++* synonym-stream:: ++* two-way-stream:: ++* input-stream-p:: ++* interactive-stream-p:: ++* open-stream-p:: ++* stream-element-type:: ++* streamp:: ++* read-byte:: ++* write-byte:: ++* peek-char:: ++* read-char:: ++* read-char-no-hang:: ++* terpri:: ++* unread-char:: ++* write-char:: ++* read-line:: ++* write-string:: ++* read-sequence:: ++* write-sequence:: ++* file-length:: ++* file-position:: ++* file-string-length:: ++* open:: ++* stream-external-format:: ++* with-open-file:: ++* close:: ++* with-open-stream:: ++* listen:: ++* clear-input:: ++* finish-output:: ++* y-or-n-p:: ++* make-synonym-stream:: ++* synonym-stream-symbol:: ++* broadcast-stream-streams:: ++* make-broadcast-stream:: ++* make-two-way-stream:: ++* two-way-stream-input-stream:: ++* echo-stream-input-stream:: ++* make-echo-stream:: ++* concatenated-stream-streams:: ++* make-concatenated-stream:: ++* get-output-stream-string:: ++* make-string-input-stream:: ++* make-string-output-stream:: ++* with-input-from-string:: ++* with-output-to-string:: ++* *debug-io*:: ++* *terminal-io*:: ++* stream-error:: ++* stream-error-stream:: ++* end-of-file:: ++ ++Printer ++ ++* The Lisp Printer:: ++* The Lisp Pretty Printer:: ++* Formatted Output:: ++* Printer Dictionary:: ++ ++The Lisp Printer ++ ++* Overview of The Lisp Printer:: ++* Printer Dispatching:: ++* Default Print-Object Methods:: ++* Examples of Printer Behavior:: ++ ++Overview of The Lisp Printer ++ ++* Multiple Possible Textual Representations:: ++* Printer Escaping:: ++ ++Default Print-Object Methods ++ ++* Printing Numbers:: ++* Printing Integers:: ++* Printing Ratios:: ++* Printing Floats:: ++* Printing Complexes:: ++* Note about Printing Numbers:: ++* Printing Characters:: ++* Printing Symbols:: ++* Package Prefixes for Symbols:: ++* Effect of Readtable Case on the Lisp Printer:: ++* Examples of Effect of Readtable Case on the Lisp Printer:: ++* Printing Strings:: ++* Printing Lists and Conses:: ++* Printing Bit Vectors:: ++* Printing Other Vectors:: ++* Printing Other Arrays:: ++* Examples of Printing Arrays:: ++* Printing Random States:: ++* Printing Pathnames:: ++* Printing Structures:: ++* Printing Other Objects:: ++ ++The Lisp Pretty Printer ++ ++* Pretty Printer Concepts:: ++* Examples of using the Pretty Printer:: ++* Notes about the Pretty Printer`s Background:: ++ ++Pretty Printer Concepts ++ ++* Dynamic Control of the Arrangement of Output:: ++* Format Directive Interface:: ++* Compiling Format Strings:: ++* Pretty Print Dispatch Tables:: ++* Pretty Printer Margins:: ++ ++Formatted Output ++ ++* FORMAT Basic Output:: ++* FORMAT Radix Control:: ++* FORMAT Floating-Point Printers:: ++* FORMAT Printer Operations:: ++* FORMAT Pretty Printer Operations:: ++* FORMAT Layout Control:: ++* FORMAT Control-Flow Operations:: ++* FORMAT Miscellaneous Operations:: ++* FORMAT Miscellaneous Pseudo-Operations:: ++* Additional Information about FORMAT Operations:: ++* Examples of FORMAT:: ++* Notes about FORMAT:: ++ ++FORMAT Basic Output ++ ++* Tilde C-> Character:: ++* Tilde Percent-> Newline:: ++* Tilde Ampersand-> Fresh-Line:: ++* Tilde Vertical-Bar-> Page:: ++* Tilde Tilde-> Tilde:: ++ ++FORMAT Radix Control ++ ++* Tilde R-> Radix:: ++* Tilde D-> Decimal:: ++* Tilde B-> Binary:: ++* Tilde O-> Octal:: ++* Tilde X-> Hexadecimal:: ++ ++FORMAT Floating-Point Printers ++ ++* Tilde F-> Fixed-Format Floating-Point:: ++* Tilde E-> Exponential Floating-Point:: ++* Tilde G-> General Floating-Point:: ++* Tilde Dollarsign-> Monetary Floating-Point:: ++ ++FORMAT Printer Operations ++ ++* Tilde A-> Aesthetic:: ++* Tilde S-> Standard:: ++* Tilde W-> Write:: ++ ++FORMAT Pretty Printer Operations ++ ++* Tilde Underscore-> Conditional Newline:: ++* Tilde Less-Than-Sign-> Logical Block:: ++* Tilde I-> Indent:: ++* Tilde Slash-> Call Function:: ++ ++FORMAT Layout Control ++ ++* Tilde T-> Tabulate:: ++* Tilde Less-Than-Sign-> Justification:: ++* Tilde Greater-Than-Sign-> End of Justification:: ++ ++FORMAT Control-Flow Operations ++ ++* Tilde Asterisk-> Go-To:: ++* Tilde Left-Bracket-> Conditional Expression:: ++* Tilde Right-Bracket-> End of Conditional Expression:: ++* Tilde Left-Brace-> Iteration:: ++* Tilde Right-Brace-> End of Iteration:: ++* Tilde Question-Mark-> Recursive Processing:: ++ ++FORMAT Miscellaneous Operations ++ ++* Tilde Left-Paren-> Case Conversion:: ++* Tilde Right-Paren-> End of Case Conversion:: ++* Tilde P-> Plural:: ++ ++FORMAT Miscellaneous Pseudo-Operations ++ ++* Tilde Semicolon-> Clause Separator:: ++* Tilde Circumflex-> Escape Upward:: ++* Tilde Newline-> Ignored Newline:: ++ ++Additional Information about FORMAT Operations ++ ++* Nesting of FORMAT Operations:: ++* Missing and Additional FORMAT Arguments:: ++* Additional FORMAT Parameters:: ++* Undefined FORMAT Modifier Combinations:: ++ ++Printer Dictionary ++ ++* copy-pprint-dispatch:: ++* formatter:: ++* pprint-dispatch:: ++* pprint-exit-if-list-exhausted:: ++* pprint-fill:: ++* pprint-indent:: ++* pprint-logical-block:: ++* pprint-newline:: ++* pprint-pop:: ++* pprint-tab:: ++* print-object:: ++* print-unreadable-object:: ++* set-pprint-dispatch:: ++* write:: ++* write-to-string:: ++* *print-array*:: ++* *print-base*:: ++* *print-case*:: ++* *print-circle*:: ++* *print-escape*:: ++* *print-gensym*:: ++* *print-level*:: ++* *print-lines*:: ++* *print-miser-width*:: ++* *print-pprint-dispatch*:: ++* *print-pretty*:: ++* *print-readably*:: ++* *print-right-margin*:: ++* print-not-readable:: ++* print-not-readable-object:: ++* format:: ++ ++Reader ++ ++* Reader Concepts:: ++* Reader Dictionary:: ++ ++Reader Concepts ++ ++* Dynamic Control of the Lisp Reader:: ++* Effect of Readtable Case on the Lisp Reader:: ++* Argument Conventions of Some Reader Functions:: ++ ++Effect of Readtable Case on the Lisp Reader ++ ++* Examples of Effect of Readtable Case on the Lisp Reader:: ++ ++Argument Conventions of Some Reader Functions ++ ++* The EOF-ERROR-P argument:: ++* The RECURSIVE-P argument:: ++ ++Reader Dictionary ++ ++* readtable:: ++* copy-readtable:: ++* make-dispatch-macro-character:: ++* read:: ++* read-delimited-list:: ++* read-from-string:: ++* readtable-case:: ++* readtablep:: ++* set-dispatch-macro-character:: ++* set-macro-character:: ++* set-syntax-from-char:: ++* with-standard-io-syntax:: ++* *read-base*:: ++* *read-default-float-format*:: ++* *read-eval*:: ++* *read-suppress*:: ++* *readtable*:: ++* reader-error:: ++ ++System Construction ++ ++* System Construction Concepts:: ++* System Construction Dictionary:: ++ ++System Construction Concepts ++ ++* Loading:: ++* Features:: ++ ++Features ++ ++* Feature Expressions:: ++* Examples of Feature Expressions:: ++ ++System Construction Dictionary ++ ++* compile-file:: ++* compile-file-pathname:: ++* load:: ++* with-compilation-unit:: ++* *features*:: ++* *compile-file-pathname*:: ++* *load-pathname*:: ++* *compile-print*:: ++* *load-print*:: ++* *modules*:: ++* provide:: ++ ++Environment ++ ++* The External Environment:: ++* Environment Dictionary:: ++ ++The External Environment ++ ++* Top level loop:: ++* Debugging Utilities:: ++* Environment Inquiry:: ++* Time:: ++ ++Time ++ ++* Decoded Time:: ++* Universal Time:: ++* Internal Time:: ++* Seconds:: ++ ++Environment Dictionary ++ ++* decode-universal-time:: ++* encode-universal-time:: ++* get-universal-time:: ++* sleep:: ++* apropos:: ++* describe:: ++* describe-object:: ++* trace:: ++* step:: ++* time:: ++* internal-time-units-per-second:: ++* get-internal-real-time:: ++* get-internal-run-time:: ++* disassemble:: ++* documentation:: ++* room:: ++* ed:: ++* inspect:: ++* dribble:: ++* -:: ++* +:: ++* *:: ++* /:: ++* lisp-implementation-type:: ++* short-site-name:: ++* machine-instance:: ++* machine-type:: ++* machine-version:: ++* software-type:: ++* user-homedir-pathname:: ++ ++Glossary ++ ++* Glossary:: ++ ++Appendix ++ ++* Removed Language Features:: ++ ++Removed Language Features ++ ++* Requirements for removed and deprecated features:: ++* Removed Types:: ++* Removed Operators:: ++* Removed Argument Conventions:: ++* Removed Variables:: ++* Removed Reader Syntax:: ++* Packages No Longer Required:: ++ ++ ++File: gcl.info, Node: Introduction (Introduction), Next: Syntax, Prev: Top, Up: Top ++ ++1 Introduction ++************** ++ ++* Menu: ++ ++* Scope:: ++* Organization of the Document:: ++* Referenced Publications:: ++* Definitions:: ++* Conformance:: ++* Language Extensions:: ++* Language Subsets:: ++* Deprecated Language Features:: ++* Symbols in the COMMON-LISP Package:: ++ ++ ++File: gcl.info, Node: Scope, Next: Organization of the Document, Prev: Introduction (Introduction), Up: Introduction (Introduction) ++ ++1.1 Scope, Purpose, and History ++=============================== ++ ++* Menu: ++ ++* Scope and Purpose:: ++* History:: ++ ++ ++File: gcl.info, Node: Scope and Purpose, Next: History, Prev: Scope, Up: Scope ++ ++1.1.1 Scope and Purpose ++----------------------- ++ ++The specification set forth in this document is designed to promote the ++portability of Common Lisp programs among a variety of data processing ++systems. It is a language specification aimed at an audience of ++implementors and knowledgeable programmers. It is neither a tutorial ++nor an implementation guide. ++ ++ ++File: gcl.info, Node: History, Prev: Scope and Purpose, Up: Scope ++ ++1.1.2 History ++------------- ++ ++Lisp is a family of languages with a long history. Early key ideas in ++Lisp were developed by John McCarthy during the 1956 Dartmouth Summer ++Research Project on Artificial Intelligence. McCarthy's motivation was ++to develop an algebraic list processing language for artificial ++intelligence work. Implementation efforts for early dialects of Lisp ++were undertaken on the IBM~704, the IBM~7090, the Digital Equipment ++Corporation (DEC) PDP-1, the DEC~PDP-6, and the PDP-10. The primary ++dialect of Lisp between 1960 and 1965 was Lisp~1.5. By the early 1970's ++there were two predominant dialects of Lisp, both arising from these ++early efforts: MacLisp and Interlisp. For further information about ++very early Lisp dialects, see The Anatomy of Lisp or Lisp 1.5 ++Programmer's Manual. ++ ++ MacLisp improved on the Lisp~1.5 notion of special variables and ++error handling. MacLisp also introduced the concept of functions that ++could take a variable number of arguments, macros, arrays, non-local ++dynamic exits, fast arithmetic, the first good Lisp compiler, and an ++emphasis on execution speed. By the end of the 1970's, MacLisp was in ++use at over 50 sites. For further information about Maclisp, see ++Maclisp Reference Manual, Revision~0 or The Revised Maclisp Manual. ++ ++ Interlisp introduced many ideas into Lisp programming environments ++and methodology. One of the Interlisp ideas that influenced Common Lisp ++was an iteration construct implemented by Warren Teitelman that inspired ++the loop macro used both on the Lisp Machines and in MacLisp, and now in ++Common Lisp. For further information about Interlisp, see Interlisp ++Reference Manual. ++ ++ Although the first implementations of Lisp were on the IBM~704 and ++the IBM~7090, later work focussed on the DEC PDP-6 and, later, PDP-10 ++computers, the latter being the mainstay of Lisp and artificial ++intelligence work at such places as Massachusetts Institute of ++Technology (MIT), Stanford University, and Carnegie Mellon University ++(CMU) from the mid-1960's through much of the 1970's. The PDP-10 ++computer and its predecessor the PDP-6 computer were, by design, ++especially well-suited to Lisp because they had 36-bit words and 18-bit ++addresses. This architecture allowed a cons cell to be stored in one ++word; single instructions could extract the car and cdr parts. The ++PDP-6 and PDP-10 had fast, powerful stack instructions that enabled fast ++function calling. But the limitations of the PDP-10 were evident by ++1973: it supported a small number of researchers using Lisp, and the ++small, 18-bit address space (2^18 = 262,144 words) limited the size of a ++single program. One response to the address space problem was the Lisp ++Machine, a special-purpose computer designed to run Lisp programs. The ++other response was to use general-purpose computers with address spaces ++larger than 18~bits, such as the DEC VAX and the S-1~Mark~IIA. For ++further information about S-1 Common Lisp, see S-1 Common Lisp ++Implementation. ++ ++ The Lisp machine concept was developed in the late 1960's. In the ++early 1970's, Peter Deutsch, working with Daniel Bobrow, implemented a ++Lisp on the Alto, a single-user minicomputer, using microcode to ++interpret a byte-code implementation language. Shortly thereafter, ++Richard Greenblatt began work on a different hardware and instruction ++set design at MIT. Although the Alto was not a total success as a Lisp ++machine, a dialect of Interlisp known as Interlisp-D became available on ++the D-series machines manufactured by Xerox--the Dorado, Dandelion, ++Dandetiger, and Dove (or Daybreak). An upward-compatible extension of ++MacLisp called Lisp Machine Lisp became available on the early MIT Lisp ++Machines. Commercial Lisp machines from Xerox, Lisp Machines (LMI), and ++Symbolics were on the market by 1981. For further information about ++Lisp Machine Lisp, see Lisp Machine Manual. ++ ++ During the late 1970's, Lisp Machine Lisp began to expand towards a ++much fuller language. Sophisticated lambda lists, setf, multiple ++values, and structures like those in Common Lisp are the results of ++early experimentation with programming styles by the Lisp Machine group. ++Jonl White and others migrated these features to MacLisp. Around 1980, ++Scott Fahlman and others at CMU began work on a Lisp to run on the ++Scientific Personal Integrated Computing Environment (SPICE) ++workstation. One of the goals of the project was to design a simpler ++dialect than Lisp Machine Lisp. ++ ++ The Macsyma group at MIT began a project during the late 1970's ++called the New Implementation of Lisp (NIL) for the VAX, which was ++headed by White. One of the stated goals of the NIL project was to fix ++many of the historic, but annoying, problems with Lisp while retaining ++significant compatibility with MacLisp. At about the same time, a ++research group at Stanford University and Lawrence Livermore National ++Laboratory headed by Richard P. Gabriel began the design of a Lisp to ++run on the S-1~Mark~IIA supercomputer. S-1~Lisp, never completely ++functional, was the test bed for adapting advanced compiler techniques ++to Lisp implementation. Eventually the S-1 and NIL groups collaborated. ++For further information about the NIL project, see NIL--A Perspective. ++ ++ The first effort towards Lisp standardization was made in 1969, when ++Anthony Hearn and Martin Griss at the University of Utah defined ++Standard Lisp--a subset of Lisp~1.5 and other dialects--to transport ++REDUCE, a symbolic algebra system. During the 1970's, the Utah group ++implemented first a retargetable optimizing compiler for Standard Lisp, ++and then an extended implementation known as Portable Standard Lisp ++(PSL). By the mid 1980's, PSL ran on about a dozen kinds of computers. ++For further information about Standard Lisp, see Standard LISP Report. ++ ++ PSL and Franz Lisp--a MacLisp-like dialect for Unix machines--were ++the first examples of widely available Lisp dialects on multiple ++hardware platforms. ++ ++ One of the most important developments in Lisp occurred during the ++second half of the 1970's: Scheme. Scheme, designed by Gerald J. ++Sussman and Guy L. Steele Jr., is a simple dialect of Lisp whose design ++brought to Lisp some of the ideas from programming language semantics ++developed in the 1960's. Sussman was one of the prime innovators behind ++many other advances in Lisp technology from the late 1960's through the ++1970's. The major contributions of Scheme were lexical scoping, lexical ++closures, first-class continuations, and simplified syntax (no ++separation of value cells and function cells). Some of these ++contributions made a large impact on the design of Common Lisp. For ++further information about Scheme, see IEEE Standard for the Scheme ++Programming Language or Revised^3 Report on the Algorithmic Language ++Scheme. ++ ++ In the late 1970's object-oriented programming concepts started to ++make a strong impact on Lisp. At MIT, certain ideas from Smalltalk made ++their way into several widely used programming systems. Flavors, an ++object-oriented programming system with multiple inheritance, was ++developed at MIT for the Lisp machine community by Howard Cannon and ++others. At Xerox, the experience with Smalltalk and Knowledge ++Representation Language (KRL) led to the development of Lisp Object ++Oriented Programming System (LOOPS) and later Common LOOPS. For further ++information on Smalltalk, see Smalltalk-80: The Language and its ++Implementation. For further information on Flavors, see Flavors: A ++Non-Hierarchical Approach to Object-Oriented Programming. ++ ++ These systems influenced the design of the Common Lisp Object System ++(CLOS). CLOS was developed specifically for this standardization effort, ++and was separately written up in Common Lisp Object System ++Specification. However, minor details of its design have changed ++slightly since that publication, and that paper should not be taken as ++an authoritative reference to the semantics of the object system as ++described in this document. ++ ++ In 1980 Symbolics and LMI were developing Lisp Machine Lisp; ++stock-hardware implementation groups were developing NIL, Franz Lisp, ++and PSL; Xerox was developing Interlisp; and the SPICE project at CMU ++was developing a MacLisp-like dialect of Lisp called SpiceLisp. ++ ++ In April 1981, after a DARPA-sponsored meeting concerning the ++splintered Lisp community, Symbolics, the SPICE project, the NIL ++project, and the S-1~Lisp project joined together to define Common Lisp. ++Initially spearheaded by White and Gabriel, the driving force behind ++this grassroots effort was provided by Fahlman, Daniel Weinreb, David ++Moon, Steele, and Gabriel. Common Lisp was designed as a description of ++a family of languages. The primary influences on Common Lisp were Lisp ++Machine Lisp, MacLisp, NIL, S-1~Lisp, Spice Lisp, and Scheme. Common ++Lisp: The Language is a description of that design. Its semantics were ++intentionally underspecified in places where it was felt that a tight ++specification would overly constrain Common Lisp research and use. ++ ++ In 1986 X3J13 was formed as a technical working group to produce a ++draft for an ANSI Common Lisp standard. Because of the acceptance of ++Common Lisp, the goals of this group differed from those of the original ++designers. These new goals included stricter standardization for ++portability, an object-oriented programming system, a condition system, ++iteration facilities, and a way to handle large character sets. To ++accommodate those goals, a new language specification, this document, ++was developed. ++ ++ ++File: gcl.info, Node: Organization of the Document, Next: Referenced Publications, Prev: Scope, Up: Introduction (Introduction) ++ ++1.2 Organization of the Document ++================================ ++ ++This is a reference document, not a tutorial document. Where possible ++and convenient, the order of presentation has been chosen so that the ++more primitive topics precede those that build upon them; however, ++linear readability has not been a priority. ++ ++ This document is divided into chapters by topic. Any given chapter ++might contain conceptual material, dictionary entries, or both. ++ ++ Defined names within the dictionary portion of a chapter are grouped ++in a way that brings related topics into physical proximity. Many such ++groupings were possible, and no deep significance should be inferred ++from the particular grouping that was chosen. To see defined names ++grouped alphabetically, consult the index. For a complete list of ++defined names, see *note Symbols in the COMMON-LISP Package::. ++ ++ In order to compensate for the sometimes-unordered portions of this ++document, a glossary has been provided; see *note Glossary::. The ++glossary provides connectivity by providing easy access to definitions ++of terms, and in some cases by providing examples or cross references to ++additional conceptual material. ++ ++ For information about notational conventions used in this document, ++see *note Definitions::. ++ ++ For information about conformance, see *note Conformance::. ++ ++ For information about extensions and subsets, see *note Language ++Extensions:: and *note Language Subsets::. ++ ++ For information about how programs in the language are parsed by the ++Lisp reader, see *note Syntax::. ++ ++ For information about how programs in the language are compiled and ++executed, see *note Evaluation and Compilation::. ++ ++ For information about data types, see *note Types and Classes::. Not ++all types and classes are defined in this chapter; many are defined in ++chapter corresponding to their topic-for example, the numeric types are ++defined in *note Numbers (Numbers)::. For a complete list of ++standardized types, see Figure~4-2. ++ ++ For information about general purpose control and data flow, see ++*note Data and Control Flow:: or *note Iteration::. ++ ++ ++File: gcl.info, Node: Referenced Publications, Next: Definitions, Prev: Organization of the Document, Up: Introduction (Introduction) ++ ++1.3 Referenced Publications ++=========================== ++ ++* ++ The Anatomy of Lisp, John Allen, McGraw-Hill, Inc., 1978. ++ ++* ++ The Art of Computer Programming, Volume 3, Donald E. Knuth, ++ Addison-Wesley Company (Reading, MA), 1973. ++ ++* ++ The Art of the Metaobject Protocol, Kiczales et al., MIT Press ++ (Cambridge, MA), 1991. ++ ++* ++ Common Lisp Object System Specification, D. Bobrow, L. DiMichiel, ++ R.P. Gabriel, S. Keene, G. Kiczales, D. Moon, SIGPLAN Notices V23, ++ September, 1988. ++ ++* ++ Common Lisp: The Language, Guy L. Steele Jr., Digital Press ++ (Burlington, MA), 1984. ++ ++* ++ Common Lisp: The Language, Second Edition, Guy L. Steele Jr., ++ Digital Press (Bedford, MA), 1990. ++ ++* ++ Exceptional Situations in Lisp, Kent M. Pitman, Proceedings of the ++ First European Conference on the Practical Application of LISP\/ ++ (EUROPAL '90), Churchill College, Cambridge, England, March 27-29, ++ 1990. ++ ++* ++ Flavors: A Non-Hierarchical Approach to Object-Oriented ++ Programming, Howard I. Cannon, 1982. ++ ++* ++ IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Std ++ 754-1985, Institute of Electrical and Electronics Engineers, Inc. ++ (New York), 1985. ++ ++* ++ IEEE Standard for the Scheme Programming Language, IEEE Std ++ 1178-1990, Institute of Electrical and Electronic Engineers, Inc. ++ (New York), 1991. ++ ++* ++ Interlisp Reference Manual, Third Revision, Teitelman, Warren, et ++ al, Xerox Palo Alto Research Center (Palo Alto, CA), 1978. ++ ++* ++ ISO 6937/2, Information processing--Coded character sets for text ++ communication--Part 2: Latin alphabetic and non-alphabetic graphic ++ characters, ISO, 1983. ++ ++* ++ Lisp 1.5 Programmer's Manual, John McCarthy, MIT Press (Cambridge, ++ MA), August, 1962. ++ ++* ++ Lisp Machine Manual, D.L. Weinreb and D.A. Moon, Artificial ++ Intelligence Laboratory, MIT (Cambridge, MA), July, 1981. ++ ++* ++ Maclisp Reference Manual, Revision~0, David A. Moon, Project MAC ++ (Laboratory for Computer Science), MIT (Cambridge, MA), March, ++ 1974. ++ ++* ++ NIL--A Perspective, JonL White, Macsyma User's Conference, 1979. ++ ++* ++ Performance and Evaluation of Lisp Programs, Richard P. Gabriel, ++ MIT Press (Cambridge, MA), 1985. ++ ++* ++ Principal Values and Branch Cuts in Complex APL, Paul Penfield Jr., ++ APL 81 Conference Proceedings, ACM SIGAPL (San Francisco, September ++ 1981), 248-256. Proceedings published as APL Quote Quad 12, 1 ++ (September 1981). ++ ++* ++ The Revised Maclisp Manual, Kent M. Pitman, Technical Report 295, ++ Laboratory for Computer Science, MIT (Cambridge, MA), May 1983. ++ ++* ++ Revised^3 Report on the Algorithmic Language Scheme, Jonathan Rees ++ and William Clinger (editors), SIGPLAN Notices V21, #12, December, ++ 1986. ++ ++* ++ S-1 Common Lisp Implementation, R.A. Brooks, R.P. Gabriel, and G.L. ++ Steele, Conference Record of the 1982 ACM Symposium on Lisp and ++ Functional Programming, 108-113, 1982. ++ ++* ++ Smalltalk-80: The Language and its Implementation, A. Goldberg and ++ D. Robson, Addison-Wesley, 1983. ++ ++* ++ Standard LISP Report, J.B. Marti, A.C. Hearn, M.L. Griss, and C. ++ Griss, SIGPLAN Notices V14, #10, October, 1979. ++ ++* ++ Webster's Third New International Dictionary the English Language, ++ Unabridged, Merriam Webster (Springfield, MA), 1986. ++ ++* ++ XP: A Common Lisp Pretty Printing System, R.C. Waters, Memo 1102a, ++ Artificial Intelligence Laboratory, MIT (Cambridge, MA), September ++ 1989. ++ ++ ++File: gcl.info, Node: Definitions, Next: Conformance, Prev: Referenced Publications, Up: Introduction (Introduction) ++ ++1.4 Definitions ++=============== ++ ++This section contains notational conventions and definitions of terms ++used in this manual. ++ ++* Menu: ++ ++* Notational Conventions:: ++* Error Terminology:: ++* Sections Not Formally Part Of This Standard:: ++* Interpreting Dictionary Entries:: ++ ++ ++File: gcl.info, Node: Notational Conventions, Next: Error Terminology, Prev: Definitions, Up: Definitions ++ ++1.4.1 Notational Conventions ++---------------------------- ++ ++The following notational conventions are used throughout this document. ++ ++* Menu: ++ ++* Font Key:: ++* Modified BNF Syntax:: ++* Splicing in Modified BNF Syntax:: ++* Indirection in Modified BNF Syntax:: ++* Additional Uses for Indirect Definitions in Modified BNF Syntax:: ++* Special Symbols:: ++* Objects with Multiple Notations:: ++* Case in Symbols:: ++* Numbers (Objects with Multiple Notations):: ++* Use of the Dot Character:: ++* NIL:: ++* Designators:: ++* Nonsense Words:: ++ ++ ++File: gcl.info, Node: Font Key, Next: Modified BNF Syntax, Prev: Notational Conventions, Up: Notational Conventions ++ ++1.4.1.1 Font Key ++................ ++ ++Fonts are used in this document to convey information. ++ ++name ++ Denotes a formal term whose meaning is defined in the Glossary. ++ When this font is used, the Glossary definition takes precedence ++ over normal English usage. ++ ++ Sometimes a glossary term appears subscripted, as in ++ "whitespace_2." Such a notation selects one particular Glossary ++ definition out of several, in this case the second. The subscript ++ notation for Glossary terms is generally used where the context ++ might be insufficient to disambiguate among the available ++ definitions. ++ ++name ++ ++ Denotes the introduction of a formal term locally to the current ++ text. There is still a corresponding glossary entry, and is ++ formally equivalent to a use of "name," but the hope is that making ++ such uses conspicuous will save the reader a trip to the glossary ++ in some cases. ++ ++name ++ Denotes a symbol in the COMMON-LISP package. For information about ++ case conventions, see *note Case in Symbols::. ++ ++name ++ Denotes a sample name or piece of code that a programmer might ++ write in Common Lisp. ++ ++ This font is also used for certain standardized names that are not ++ names of external symbols of the COMMON-LISP package, such as ++ keywords_1, package names, and loop keywords. ++ ++name ++ Denotes the name of a parameter or value. ++ ++ In some situations the notation "<>" (i.e., the same font, ++ but with surrounding "angle brackets") is used instead in order to ++ provide better visual separation from surrounding characters. ++ These "angle brackets" are metasyntactic, and never actually appear ++ in program input or output. ++ ++ ++File: gcl.info, Node: Modified BNF Syntax, Next: Splicing in Modified BNF Syntax, Prev: Font Key, Up: Notational Conventions ++ ++1.4.1.2 Modified BNF Syntax ++........................... ++ ++This specification uses an extended Backus Normal Form (BNF) to describe ++the syntax of Common Lisp macro forms and special forms. This section ++discusses the syntax of BNF expressions. ++ ++ ++File: gcl.info, Node: Splicing in Modified BNF Syntax, Next: Indirection in Modified BNF Syntax, Prev: Modified BNF Syntax, Up: Notational Conventions ++ ++1.4.1.3 Splicing in Modified BNF Syntax ++....................................... ++ ++The primary extension used is the following: ++ ++ [[O]] ++ ++ An expression of this form appears whenever a list of elements is to ++be spliced into a larger structure and the elements can appear in any ++order. The symbol O represents a description of the syntax of some ++number of syntactic elements to be spliced; that description must be of ++the form ++ ++ O_1 | ... | O_l ++ ++where each O_i can be of the form S or of the form S* or of the form ++S^1. ++ ++ The expression [[O]] means that a list of the form ++ ++ (O_{i_1}... O_{i_j}) 1<= j ++ ++is spliced into the enclosing expression, such that if n != m and 1<= ++n,m<= j, then either O_{i_n}!= O_{i_m} or O_{i_n} = O_{i_m} = Q_k, where ++for some 1<= k <= n, O_k is of the form Q_k*. ++ ++ Furthermore, for each O_{i_n} that is of the form Q_k^1, that element ++is required to appear somewhere in the list to be spliced. ++ ++ For example, the expression ++ ++ (x [[A | B* | C]] y) ++ ++means that at most one A, any number of B's, and at most one C can occur ++in any order. It is a description of any of these: ++ ++ (x y) ++ (x B A C y) ++ (x A B B B B B C y) ++ (x C B A B B B y) ++ ++but not any of these: ++ ++ (x B B A A C C y) ++ (x C B C y) ++ ++In the first case, both A and C appear too often, and in the second case ++C appears too often. ++ ++ The notation [[O_1 | O_2 | ...]]^+ adds the additional restriction ++that at least one item from among the possible choices must be used. ++For example: ++ ++ (x [[A | B* | C]]^+ y) ++ ++means that at most one A, any number of B's, and at most one C can occur ++in any order, but that in any case at least one of these options must be ++selected. It is a description of any of these: ++ ++ (x B y) ++ (x B A C y) ++ (x A B B B B B C y) ++ (x C B A B B B y) ++ ++but not any of these: ++ ++ (x y) ++ (x B B A A C C y) ++ (x C B C y) ++ ++In the first case, no item was used; in the second case, both A and C ++appear too often; and in the third case C appears too often. ++ ++ Also, the expression: ++ ++ (x [[A^1 | B^1 | C]] y) ++ ++can generate exactly these and no others: ++ ++ (x A B C y) ++ (x A C B y) ++ (x A B y) ++ (x B A C y) ++ (x B C A y) ++ (x B A y) ++ (x C A B y) ++ (x C B A y) ++ ++ ++File: gcl.info, Node: Indirection in Modified BNF Syntax, Next: Additional Uses for Indirect Definitions in Modified BNF Syntax, Prev: Splicing in Modified BNF Syntax, Up: Notational Conventions ++ ++1.4.1.4 Indirection in Modified BNF Syntax ++.......................................... ++ ++An indirection extension is introduced in order to make this new syntax ++more readable: ++ ++ !O ++ ++If O is a non-terminal symbol, the right-hand side of its definition is ++substituted for the entire expression !O. For example, the following BNF ++is equivalent to the BNF in the previous example: ++ ++ (x [[!O]] y) ++ ++ O ::=A | B* | C ++ ++ ++File: gcl.info, Node: Additional Uses for Indirect Definitions in Modified BNF Syntax, Next: Special Symbols, Prev: Indirection in Modified BNF Syntax, Up: Notational Conventions ++ ++1.4.1.5 Additional Uses for Indirect Definitions in Modified BNF Syntax ++....................................................................... ++ ++In some cases, an auxiliary definition in the BNF might appear to be ++unused within the BNF, but might still be useful elsewhere. For ++example, consider the following definitions: ++ ++ 'case' keyform {!normal-clause}* [!otherwise-clause] => {result}* ++ ++ 'ccase' keyplace {!normal-clause}* => {result}* ++ ++ 'ecase' keyform {!normal-clause}* => {result}* ++ ++ normal-clause ::=(keys {form}*) ++ ++ otherwise-clause ::=({otherwise | t} {form}*) ++ ++ clause ::=normal-clause | otherwise-clause ++ ++ Here the term "clause" might appear to be "dead" in that it is not ++used in the BNF. However, the purpose of the BNF is not just to guide ++parsing, but also to define useful terms for reference in the ++descriptive text which follows. As such, the term "clause" might appear ++in text that follows, as shorthand for "normal-clause or ++otherwise-clause." ++ ++ ++File: gcl.info, Node: Special Symbols, Next: Objects with Multiple Notations, Prev: Additional Uses for Indirect Definitions in Modified BNF Syntax, Up: Notational Conventions ++ ++1.4.1.6 Special Symbols ++....................... ++ ++The special symbols described here are used as a notational convenience ++within this document, and are part of neither the Common Lisp language ++nor its environment. ++ ++=> ++ This indicates evaluation. For example: ++ ++ (+ 4 5) => 9 ++ ++ This means that the result of evaluating the form (+ 4 5) is 9. ++ ++ If a form returns multiple values, those values might be shown ++ separated by spaces, line breaks, or commas. For example: ++ ++ (truncate 7 5) ++ => 1 2 ++ (truncate 7 5) ++ => 1 ++ 2 ++ (truncate 7 5) ++ => 1, 2 ++ ++ Each of the above three examples is equivalent, and specifies that ++ (truncate 7 5) returns two values, which are 1 and 2. ++ ++ Some conforming implementations actually type an arrow (or some ++ other indicator) before showing return values, while others do not. ++ ++OR=> ++ The notation "OR=>" is used to denote one of several possible ++ alternate results. The example ++ ++ (char-name #\a) ++ => NIL ++ OR=> "LOWERCASE-a" ++ OR=> "Small-A" ++ OR=> "LA01" ++ ++ indicates that nil, "LOWERCASE-a", "Small-A", "LA01" are among the ++ possible results of (char-name #\a)--each with equal preference. ++ Unless explicitly specified otherwise, it should not be assumed ++ that the set of possible results shown is exhaustive. Formally, ++ the above example is equivalent to ++ ++ (char-name #\a) => implementation-dependent ++ ++ but it is intended to provide additional information to illustrate ++ some of the ways in which it is permitted for implementations to ++ diverge. ++ ++NOT=> ++ The notation "NOT=>" is used to denote a result which is not ++ possible. This might be used, for example, in order to emphasize a ++ situation where some anticipated misconception might lead the ++ reader to falsely believe that the result might be possible. For ++ example, ++ ++ (function-lambda-expression ++ (funcall #'(lambda (x) #'(lambda () x)) nil)) ++ => NIL, true, NIL ++ OR=> (LAMBDA () X), true, NIL ++ NOT=> NIL, false, NIL ++ NOT=> (LAMBDA () X), false, NIL ++ ++== ++ This indicates code equivalence. For example: ++ ++ (gcd x (gcd y z)) == (gcd (gcd x y) z) ++ ++ This means that the results and observable side-effects of ++ evaluating the form (gcd x (gcd y z)) are always the same as the ++ results and observable side-effects of (gcd (gcd x y) z) for any x, ++ y, and z. ++ ++|> ++ Common Lisp specifies input and output with respect to a ++ non-interactive stream model. The specific details of how ++ interactive input and output are mapped onto that non-interactive ++ model are implementation-defined. ++ ++ For example, conforming implementations are permitted to differ in ++ issues of how interactive input is terminated. For example, the ++ function read terminates when the final delimiter is typed on a ++ non-interactive stream. In some implementations, an interactive ++ call to read returns as soon as the final delimiter is typed, even ++ if that delimiter is not a newline. In other implementations, a ++ final newline is always required. In still other implementations, ++ there might be a command which "activates" a buffer full of input ++ without the command itself being visible on the program's input ++ stream. ++ ++ In the examples in this document, the notation " |> " precedes ++ lines where interactive input and output occurs. Within such a ++ scenario, "|>>this notation<<|" notates user input. ++ ++ For example, the notation ++ ++ (+ 1 (print (+ (sqrt (read)) (sqrt (read))))) ++ |> |>>9 16 <<| ++ |> 7 ++ => 8 ++ ++ shows an interaction in which "(+ 1 (print (+ (sqrt (read)) (sqrt ++ (read)))))" is a form to be evaluated, "9 16 " is interactive ++ input, "7" is interactive output, and "8" is the value yielded from ++ the evaluation. ++ ++ The use of this notation is intended to disguise small differences ++ in interactive input and output behavior between implementations. ++ ++ Sometimes, the non-interactive stream model calls for a newline. ++ How that newline character is interactively entered is an ++ implementation-defined detail of the user interface, but in that ++ case, either the notation "" or "[<-~]" might be used. ++ ++ (progn (format t "~&Who? ") (read-line)) ++ |> Who? |>>Fred, Mary, and Sally [<-~]<<| ++ => "Fred, Mary, and Sally", false ++ ++ ++File: gcl.info, Node: Objects with Multiple Notations, Next: Case in Symbols, Prev: Special Symbols, Up: Notational Conventions ++ ++1.4.1.7 Objects with Multiple Notations ++....................................... ++ ++Some objects in Common Lisp can be notated in more than one way. In ++such situations, the choice of which notation to use is technically ++arbitrary, but conventions may exist which convey a "point of view" or ++"sense of intent." ++ ++ ++File: gcl.info, Node: Case in Symbols, Next: Numbers (Objects with Multiple Notations), Prev: Objects with Multiple Notations, Up: Notational Conventions ++ ++1.4.1.8 Case in Symbols ++....................... ++ ++While case is significant in the process of interning a symbol, the Lisp ++reader, by default, attempts to canonicalize the case of a symbol prior ++to interning; see *note Effect of Readtable Case on the Lisp Reader::. ++As such, case in symbols is not, by default, significant. Throughout ++this document, except as explicitly noted otherwise, the case in which a ++symbol appears is not significant; that is, HELLO, Hello, hElLo, and ++hello are all equivalent ways to denote a symbol whose name is "HELLO". ++ ++ The characters backslash and vertical-bar are used to explicitly ++quote the case and other parsing-related aspects of characters. As ++such, the notations |hello| and \h\e\l\l\o are equivalent ways to refer ++to a symbol whose name is "hello", and which is distinct from any symbol ++whose name is "HELLO". ++ ++ The symbols that correspond to Common Lisp defined names have ++uppercase names even though their names generally appear in lowercase in ++this document. ++ ++ ++File: gcl.info, Node: Numbers (Objects with Multiple Notations), Next: Use of the Dot Character, Prev: Case in Symbols, Up: Notational Conventions ++ ++1.4.1.9 Numbers ++............... ++ ++Although Common Lisp provides a variety of ways for programs to ++manipulate the input and output radix for rational numbers, all numbers ++in this document are in decimal notation unless explicitly noted ++otherwise. ++ ++ ++File: gcl.info, Node: Use of the Dot Character, Next: NIL, Prev: Numbers (Objects with Multiple Notations), Up: Notational Conventions ++ ++1.4.1.10 Use of the Dot Character ++................................. ++ ++The dot appearing by itself in an expression such as ++ ++ (item1 item2 . tail) ++ ++ means that tail represents a list of objects at the end of a list. ++For example, ++ ++ (A B C . (D E F)) ++ ++ is notationally equivalent to: ++ ++ (A B C D E F) ++ ++ Although dot is a valid constituent character in a symbol, no ++standardized symbols contain the character dot, so a period that follows ++a reference to a symbol at the end of a sentence in this document should ++always be interpreted as a period and never as part of the symbol's ++name. For example, within this document, a sentence such as "This ++sample sentence refers to the symbol car." refers to a symbol whose ++name is "CAR" (with three letters), and never to a four-letter symbol ++"CAR." ++ ++ ++File: gcl.info, Node: NIL, Next: Designators, Prev: Use of the Dot Character, Up: Notational Conventions ++ ++1.4.1.11 NIL ++............ ++ ++nil has a variety of meanings. It is a symbol in the COMMON-LISP ++package with the name "NIL", it is boolean (and generalized boolean) ++false, it is the empty list, and it is the name of the empty type (a ++subtype of all types). ++ ++ Within Common Lisp, nil can be notated interchangeably as either NIL ++or (). By convention, the choice of notation offers a hint as to which ++of its many roles it is playing. ++ ++ For Evaluation? Notation Typically Implied Role ++ ________________________________________________________ ++ Yes nil use as a boolean. ++ Yes 'nil use as a symbol. ++ Yes '() use as an empty list ++ No nil use as a symbol or boolean. ++ No () use as an empty list. ++ ++ Figure 1-1: Notations for NIL ++ ++ ++ Within this document only, nil is also sometimes notated as false to ++emphasize its role as a boolean. ++ ++ For example: ++ ++ (print ()) ;avoided ++ (defun three nil 3) ;avoided ++ '(nil nil) ;list of two symbols ++ '(() ()) ;list of empty lists ++ (defun three () 3) ;Emphasize empty parameter list. ++ (append '() '()) => () ;Emphasize use of empty lists ++ (not nil) => true ;Emphasize use as Boolean false ++ (get 'nil 'color) ;Emphasize use as a symbol ++ ++ A function is sometimes said to "be false" or "be true" in some ++circumstance. Since no function object can be the same as nil and all ++function objects represent true when viewed as booleans, it would be ++meaningless to say that the function was literally false and ++uninteresting to say that it was literally true. Instead, these phrases ++are just traditional alternative ways of saying that the function ++"returns false" or "returns true," respectively. ++ ++ ++File: gcl.info, Node: Designators, Next: Nonsense Words, Prev: NIL, Up: Notational Conventions ++ ++1.4.1.12 Designators ++.................... ++ ++A designator is an object that denotes another object. ++ ++ Where a parameter of an operator is described as a designator, the ++description of the operator is written in a way that assumes that the ++value of the parameter is the denoted object; that is, that the ++parameter is already of the denoted type. (The specific nature of the ++object denoted by a "<> designator" or a "designator for a ++<>" can be found in the Glossary entry for "<> designator.") ++ ++ For example, "nil" and "the value of *standard-output*" are ++operationally indistinguishable as stream designators. Similarly, the ++symbol foo and the string "FOO" are operationally indistinguishable as ++string designators. ++ ++ Except as otherwise noted, in a situation where the denoted object ++might be used multiple times, it is implementation-dependent whether the ++object is coerced only once or whether the coercion occurs each time the ++object must be used. ++ ++ For example, mapcar receives a function designator as an argument, ++and its description is written as if this were simply a function. In ++fact, it is implementation-dependent whether the function designator is ++coerced right away or whether it is carried around internally in the ++form that it was given as an argument and re-coerced each time it is ++needed. In most cases, conforming programs cannot detect the ++distinction, but there are some pathological situations (particularly ++those involving self-redefining or mutually-redefining functions) which ++do conform and which can detect this difference. The following program ++is a conforming program, but might or might not have portably correct ++results, depending on whether its correctness depends on one or the ++other of the results: ++ ++ (defun add-some (x) ++ (defun add-some (x) (+ x 2)) ++ (+ x 1)) => ADD-SOME ++ (mapcar 'add-some '(1 2 3 4)) ++ => (2 3 4 5) ++ OR=> (2 4 5 6) ++ ++ In a few rare situations, there may be a need in a dictionary entry ++to refer to the object that was the original designator for a parameter. ++Since naming the parameter would refer to the denoted object, the phrase ++"the <> designator" can be used to refer to the ++designator which was the argument from which the value of ++<> was computed. ++ ++ ++File: gcl.info, Node: Nonsense Words, Prev: Designators, Up: Notational Conventions ++ ++1.4.1.13 Nonsense Words ++....................... ++ ++When a word having no pre-attached semantics is required (e.g., in an ++example), it is common in the Lisp community to use one of the words ++"foo," "bar," "baz," and "quux." For example, in ++ ++ (defun foo (x) (+ x 1)) ++ ++ the use of the name foo is just a shorthand way of saying "please ++substitute your favorite name here." ++ ++ These nonsense words have gained such prevalance of usage, that it is ++commonplace for newcomers to the community to begin to wonder if there ++is an attached semantics which they are overlooking--there is not. ++ ++ ++File: gcl.info, Node: Error Terminology, Next: Sections Not Formally Part Of This Standard, Prev: Notational Conventions, Up: Definitions ++ ++1.4.2 Error Terminology ++----------------------- ++ ++Situations in which errors might, should, or must be signaled are ++described in the standard. The wording used to describe such situations ++is intended to have precise meaning. The following list is a glossary ++of those meanings. ++ ++Safe code ++ ++ This is code processed with the safety optimization at its highest ++ setting (3). safety is a lexical property of code. The phrase ++ "the function F should signal an error" means that if F is invoked ++ from code processed with the highest safety optimization, an error ++ is signaled. It is implementation-dependent whether F or the ++ calling code signals the error. ++ ++Unsafe code ++ ++ This is code processed with lower safety levels. ++ ++ Unsafe code might do error checking. Implementations are permitted ++ to treat all code as safe code all the time. ++ ++An error is signaled ++ ++ This means that an error is signaled in both safe and unsafe code. ++ Conforming code may rely on the fact that the error is signaled in ++ both safe and unsafe code. Every implementation is required to ++ detect the error in both safe and unsafe code. For example, "an ++ error is signaled if unexport is given a symbol not accessible in ++ the current package." ++ ++ If an explicit error type is not specified, the default is error. ++ ++An error should be signaled ++ ++ This means that an error is signaled in safe code, and an error ++ might be signaled in unsafe code. Conforming code may rely on the ++ fact that the error is signaled in safe code. Every implementation ++ is required to detect the error at least in safe code. When the ++ error is not signaled, the "consequences are undefined" (see ++ below). For example, "+ should signal an error of type type-error ++ if any argument is not of type number." ++ ++Should be prepared to signal an error ++ ++ This is similar to "should be signaled" except that it does not ++ imply that 'extra effort' has to be taken on the part of an ++ operator to discover an erroneous situation if the normal action of ++ that operator can be performed successfully with only 'lazy' ++ checking. An implementation is always permitted to signal an ++ error, but even in safe code, it is only required to signal the ++ error when failing to signal it might lead to incorrect results. ++ In unsafe code, the consequences are undefined. ++ ++ For example, defining that "find should be prepared to signal an ++ error of type type-error if its second argument is not a proper ++ list" does not imply that an error is always signaled. The form ++ ++ (find 'a '(a b . c)) ++ ++ must either signal an error of type type-error in safe code, else ++ return A. In unsafe code, the consequences are undefined. By ++ contrast, ++ ++ (find 'd '(a b . c)) ++ ++ must signal an error of type type-error in safe code. In unsafe ++ code, the consequences are undefined. Also, ++ ++ (find 'd '#1=(a b . #1#)) ++ ++ in safe code might return nil (as an implementation-defined ++ extension), might never return, or might signal an error of type ++ type-error. In unsafe code, the consequences are undefined. ++ ++ Typically, the "should be prepared to signal" terminology is used ++ in type checking situations where there are efficiency ++ considerations that make it impractical to detect errors that are ++ not relevant to the correct operation of the operator. ++ ++The consequences are unspecified ++ ++ This means that the consequences are unpredictable but harmless. ++ Implementations are permitted to specify the consequences of this ++ situation. No conforming code may depend on the results or effects ++ of this situation, and all conforming code is required to treat the ++ results and effects of this situation as unpredictable but ++ harmless. For example, "if the second argument to ++ shared-initialize specifies a name that does not correspond to any ++ slots accessible in the object, the results are unspecified." ++ ++The consequences are undefined ++ ++ This means that the consequences are unpredictable. The ++ consequences may range from harmless to fatal. No conforming code ++ may depend on the results or effects. Conforming code must treat ++ the consequences as unpredictable. In places where the words ++ "must," "must not," or "may not" are used, then "the consequences ++ are undefined" if the stated requirement is not met and no specific ++ consequence is explicitly stated. An implementation is permitted ++ to signal an error in this case. ++ ++ For example: "Once a name has been declared by defconstant to be ++ constant, any further assignment or binding of that variable has ++ undefined consequences." ++ ++An error might be signaled ++ ++ This means that the situation has undefined consequences; however, ++ if an error is signaled, it is of the specified type. For example, ++ "open might signal an error of type file-error." ++ ++The return values are unspecified ++ ++ This means that only the number and nature of the return values of ++ a form are not specified. However, the issue of whether or not any ++ side-effects or transfer of control occurs is still well-specified. ++ ++ A program can be well-specified even if it uses a function whose ++ returns values are unspecified. For example, even if the return ++ values of some function F are unspecified, an expression such as ++ (length (list (F))) is still well-specified because it does not ++ rely on any particular aspect of the value or values returned by F. ++ ++Implementations may be extended to cover this situation ++ ++ This means that the situation has undefined consequences; however, ++ a conforming implementation is free to treat the situation in a ++ more specific way. For example, an implementation might define ++ that an error is signaled, or that an error should be signaled, or ++ even that a certain well-defined non-error behavior occurs. ++ ++ No conforming code may depend on the consequences of such a ++ situation; all conforming code must treat the consequences of the ++ situation as undefined. Implementations are required to document ++ how the situation is treated. ++ ++ For example, "implementations may be extended to define other type ++ specifiers to have a corresponding class." ++ ++Implementations are free to extend the syntax ++ ++ This means that in this situation implementations are permitted to ++ define unambiguous extensions to the syntax of the form being ++ described. No conforming code may depend on this extension. ++ Implementations are required to document each such extension. All ++ conforming code is required to treat the syntax as meaningless. ++ The standard might disallow certain extensions while allowing ++ others. For example, "no implementation is free to extend the ++ syntax of defclass." ++ ++A warning might be issued ++ ++ This means that implementations are encouraged to issue a warning ++ if the context is appropriate (e.g., when compiling). However, a ++ conforming implementation is not required to issue a warning. ++ ++ ++File: gcl.info, Node: Sections Not Formally Part Of This Standard, Next: Interpreting Dictionary Entries, Prev: Error Terminology, Up: Definitions ++ ++1.4.3 Sections Not Formally Part Of This Standard ++------------------------------------------------- ++ ++Front matter and back matter, such as the "Table of Contents," "Index," ++"Figures," "Credits," and "Appendix" are not considered formally part of ++this standard, so that we retain the flexibility needed to update these ++sections even at the last minute without fear of needing a formal vote ++to change those parts of the document. These items are quite short and ++very useful, however, and it is not recommended that they be removed ++even in an abridged version of this document. ++ ++ Within the concept sections, subsections whose names begin with the ++words "Note" or "Notes" or "Example" or "Examples" are provided for ++illustration purposes only, and are not considered part of the standard. ++ ++ An attempt has been made to place these sections last in their parent ++section, so that they could be removed without disturbing the contiguous ++numbering of the surrounding sections in order to produce a document of ++smaller size. ++ ++ Likewise, the "Examples" and "Notes" sections in a dictionary entry ++are not considered part of the standard and could be removed if ++necessary. ++ ++ Nevertheless, the examples provide important clarifications and ++consistency checks for the rest of the material, and such abridging is ++not recommended unless absolutely unavoidable. ++ ++ ++File: gcl.info, Node: Interpreting Dictionary Entries, Prev: Sections Not Formally Part Of This Standard, Up: Definitions ++ ++1.4.4 Interpreting Dictionary Entries ++------------------------------------- ++ ++The dictionary entry for each defined name is partitioned into sections. ++Except as explicitly indicated otherwise below, each section is ++introduced by a label identifying that section. The omission of a ++section implies that the section is either not applicable, or would ++provide no interesting information. ++ ++ This section defines the significance of each potential section in a ++dictionary entry. ++ ++* Menu: ++ ++* The "Affected By" Section of a Dictionary Entry:: ++* The "Arguments" Section of a Dictionary Entry:: ++* The "Arguments and Values" Section of a Dictionary Entry:: ++* The "Binding Types Affected" Section of a Dictionary Entry:: ++* The "Class Precedence List" Section of a Dictionary Entry:: ++* Dictionary Entries for Type Specifiers:: ++* The "Compound Type Specifier Kind" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Syntax" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Arguments" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Description" Section of a Dictionary Entry:: ++* The "Constant Value" Section of a Dictionary Entry:: ++* The "Description" Section of a Dictionary Entry:: ++* The "Examples" Section of a Dictionary Entry:: ++* The "Exceptional Situations" Section of a Dictionary Entry:: ++* The "Initial Value" Section of a Dictionary Entry:: ++* The "Argument Precedence Order" Section of a Dictionary Entry:: ++* The "Method Signature" Section of a Dictionary Entry:: ++* The "Name" Section of a Dictionary Entry:: ++* The "Notes" Section of a Dictionary Entry:: ++* The "Pronunciation" Section of a Dictionary Entry:: ++* The "See Also" Section of a Dictionary Entry:: ++* The "Side Effects" Section of a Dictionary Entry:: ++* The "Supertypes" Section of a Dictionary Entry:: ++* The "Syntax" Section of a Dictionary Entry:: ++* Special "Syntax" Notations for Overloaded Operators:: ++* Naming Conventions for Rest Parameters:: ++* Requiring Non-Null Rest Parameters in The "Syntax" Section:: ++* Return values in The "Syntax" Section:: ++* No Arguments or Values in The "Syntax" Section:: ++* Unconditional Transfer of Control in The "Syntax" Section:: ++* The "Valid Context" Section of a Dictionary Entry:: ++* The "Value Type" Section of a Dictionary Entry:: ++ ++ ++File: gcl.info, Node: The "Affected By" Section of a Dictionary Entry, Next: The "Arguments" Section of a Dictionary Entry, Prev: Interpreting Dictionary Entries, Up: Interpreting Dictionary Entries ++ ++1.4.4.1 The "Affected By" Section of a Dictionary Entry ++....................................................... ++ ++For an operator, anything that can affect the side effects of or values ++returned by the operator. ++ ++ For a variable, anything that can affect the value of the variable ++including functions that bind or assign it. ++ ++ ++File: gcl.info, Node: The "Arguments" Section of a Dictionary Entry, Next: The "Arguments and Values" Section of a Dictionary Entry, Prev: The "Affected By" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.2 The "Arguments" Section of a Dictionary Entry ++..................................................... ++ ++This information describes the syntax information of entries such as ++those for declarations and special expressions which are never evaluated ++as forms, and so do not return values. ++ ++ ++File: gcl.info, Node: The "Arguments and Values" Section of a Dictionary Entry, Next: The "Binding Types Affected" Section of a Dictionary Entry, Prev: The "Arguments" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.3 The "Arguments and Values" Section of a Dictionary Entry ++................................................................ ++ ++An English language description of what arguments the operator accepts ++and what values it returns, including information about defaults for ++parameters corresponding to omittable arguments (such as optional ++parameters and keyword parameters). For special operators and macros, ++their arguments are not evaluated unless it is explicitly stated in ++their descriptions that they are evaluated. ++ ++ ++File: gcl.info, Node: The "Binding Types Affected" Section of a Dictionary Entry, Next: The "Class Precedence List" Section of a Dictionary Entry, Prev: The "Arguments and Values" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.4 The "Binding Types Affected" Section of a Dictionary Entry ++.................................................................. ++ ++This information alerts the reader to the kinds of bindings that might ++potentially be affected by a declaration. Whether in fact any ++particular such binding is actually affected is dependent on additional ++factors as well. See The "Description" Section of the declaration in ++question for details. ++ ++ ++File: gcl.info, Node: The "Class Precedence List" Section of a Dictionary Entry, Next: Dictionary Entries for Type Specifiers, Prev: The "Binding Types Affected" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.5 The "Class Precedence List" Section of a Dictionary Entry ++................................................................. ++ ++This appears in the dictionary entry for a class, and contains an ++ordered list of the classes defined by Common Lisp that must be in the ++class precedence list of this class. ++ ++ It is permissible for other (implementation-defined) classes to ++appear in the implementation's class precedence list for the class. ++ ++ It is permissible for either standard-object or structure-object to ++appear in the implementation's class precedence list; for details, see ++*note Type Relationships::. ++ ++ Except as explicitly indicated otherwise somewhere in this ++specification, no additional standardized classes may appear in the ++implementation's class precedence list. ++ ++ By definition of the relationship between classes and types, the ++classes listed in this section are also supertypes of the type denoted ++by the class. ++ ++ ++File: gcl.info, Node: Dictionary Entries for Type Specifiers, Next: The "Compound Type Specifier Kind" Section of a Dictionary Entry, Prev: The "Class Precedence List" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.6 Dictionary Entries for Type Specifiers ++.............................................. ++ ++The atomic type specifiers are those defined names listed in Figure~4-2. ++Such dictionary entries are of kind "Class," "Condition Type," "System ++Class," or "Type." A description of how to interpret a symbol naming ++one of these types or classes as an atomic type specifier is found in ++The "Description" Section of such dictionary entries. ++ ++ The compound type specifiers are those defined names listed in ++Figure~4-3. Such dictionary entries are of kind "Class," "System ++Class," "Type," or "Type Specifier." A description of how to interpret ++as a compound type specifier a list whose car is such a symbol is found ++in the "Compound Type Specifier Kind," "Compound Type Specifier Syntax," ++"Compound Type Specifier Arguments," and "Compound Type Specifier ++Description" sections of such dictionary entries. ++ ++ ++File: gcl.info, Node: The "Compound Type Specifier Kind" Section of a Dictionary Entry, Next: The "Compound Type Specifier Syntax" Section of a Dictionary Entry, Prev: Dictionary Entries for Type Specifiers, Up: Interpreting Dictionary Entries ++ ++1.4.4.7 The "Compound Type Specifier Kind" Section of a Dictionary Entry ++........................................................................ ++ ++An "abbreviating" type specifier is one that describes a subtype for ++which it is in principle possible to enumerate the elements, but for ++which in practice it is impractical to do so. ++ ++ A "specializing" type specifier is one that describes a subtype by ++restricting the type of one or more components of the type, such as ++element type or complex part type. ++ ++ A "predicating" type specifier is one that describes a subtype ++containing only those objects that satisfy a given predicate. ++ ++ A "combining" type specifier is one that describes a subtype in a ++compositional way, using combining operations (such as "and," "or," and ++"not") on other types. ++ ++ ++File: gcl.info, Node: The "Compound Type Specifier Syntax" Section of a Dictionary Entry, Next: The "Compound Type Specifier Arguments" Section of a Dictionary Entry, Prev: The "Compound Type Specifier Kind" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.8 The "Compound Type Specifier Syntax" Section of a Dictionary Entry ++.......................................................................... ++ ++This information about a type describes the syntax of a compound type ++specifier for that type. ++ ++ Whether or not the type is acceptable as an atomic type specifier is ++not represented here; see *note Dictionary Entries for Type ++Specifiers::. ++ ++ ++File: gcl.info, Node: The "Compound Type Specifier Arguments" Section of a Dictionary Entry, Next: The "Compound Type Specifier Description" Section of a Dictionary Entry, Prev: The "Compound Type Specifier Syntax" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.9 The "Compound Type Specifier Arguments" Section of a Dictionary Entry ++............................................................................. ++ ++This information describes type information for the structures defined ++in The "Compound Type Specifier Syntax" Section. ++ ++ ++File: gcl.info, Node: The "Compound Type Specifier Description" Section of a Dictionary Entry, Next: The "Constant Value" Section of a Dictionary Entry, Prev: The "Compound Type Specifier Arguments" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.10 The "Compound Type Specifier Description" Section of a Dictionary Entry ++................................................................................ ++ ++This information describes the meaning of the structures defined in The ++"Compound Type Specifier Syntax" Section. ++ ++ ++File: gcl.info, Node: The "Constant Value" Section of a Dictionary Entry, Next: The "Description" Section of a Dictionary Entry, Prev: The "Compound Type Specifier Description" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.11 The "Constant Value" Section of a Dictionary Entry ++........................................................... ++ ++This information describes the unchanging type and value of a constant ++variable. ++ ++ ++File: gcl.info, Node: The "Description" Section of a Dictionary Entry, Next: The "Examples" Section of a Dictionary Entry, Prev: The "Constant Value" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.12 The "Description" Section of a Dictionary Entry ++........................................................ ++ ++A summary of the operator and all intended aspects of the operator, but ++does not necessarily include all the fields referenced below it ("Side ++Effects," "Exceptional Situations," etc.) ++ ++ ++File: gcl.info, Node: The "Examples" Section of a Dictionary Entry, Next: The "Exceptional Situations" Section of a Dictionary Entry, Prev: The "Description" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.13 The "Examples" Section of a Dictionary Entry ++..................................................... ++ ++Examples of use of the operator. These examples are not considered part ++of the standard; see *note Sections Not Formally Part Of This ++Standard::. ++ ++ ++File: gcl.info, Node: The "Exceptional Situations" Section of a Dictionary Entry, Next: The "Initial Value" Section of a Dictionary Entry, Prev: The "Examples" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.14 The "Exceptional Situations" Section of a Dictionary Entry ++................................................................... ++ ++Three kinds of information may appear here: ++ ++* ++ Situations that are detected by the function and formally signaled. ++* ++ Situations that are handled by the function. ++* ++ Situations that may be detected by the function. ++ ++ This field does not include conditions that could be signaled by ++functions passed to and called by this operator as arguments or through ++dynamic variables, nor by executing subforms of this operator if it is a ++macro or special operator. ++ ++ ++File: gcl.info, Node: The "Initial Value" Section of a Dictionary Entry, Next: The "Argument Precedence Order" Section of a Dictionary Entry, Prev: The "Exceptional Situations" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.15 The "Initial Value" Section of a Dictionary Entry ++.......................................................... ++ ++This information describes the initial value of a dynamic variable. ++Since this variable might change, see type restrictions in The "Value ++Type" Section. ++ ++ ++File: gcl.info, Node: The "Argument Precedence Order" Section of a Dictionary Entry, Next: The "Method Signature" Section of a Dictionary Entry, Prev: The "Initial Value" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.16 The "Argument Precedence Order" Section of a Dictionary Entry ++...................................................................... ++ ++This information describes the argument precedence order. If it is ++omitted, the argument precedence order is the default (left to right). ++ ++ ++File: gcl.info, Node: The "Method Signature" Section of a Dictionary Entry, Next: The "Name" Section of a Dictionary Entry, Prev: The "Argument Precedence Order" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.17 The "Method Signature" Section of a Dictionary Entry ++............................................................. ++ ++The description of a generic function includes descriptions of the ++methods that are defined on that generic function by the standard. A ++method signature is used to describe the parameters and parameter ++specializers for each method. Methods defined for the generic function ++must be of the form described by the method signature. ++ ++ 'F' (x class) (y t) &optional z &key k ++ ++This signature indicates that this method on the generic function F has ++two required parameters: x, which must be a generalized instance of the ++class class; and y, which can be any object (i.e., a generalized ++instance of the class t). In addition, there is an optional parameter z ++and a keyword parameter k. This signature also indicates that this ++method on F is a primary method and has no qualifiers. ++ ++ For each parameter, the argument supplied must be in the intersection ++of the type specified in the description of the corresponding generic ++function and the type given in the signature of some method (including ++not only those methods defined in this specification, but also ++implementation-defined or user-defined methods in situations where the ++definition of such methods is permitted). ++ ++ ++File: gcl.info, Node: The "Name" Section of a Dictionary Entry, Next: The "Notes" Section of a Dictionary Entry, Prev: The "Method Signature" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.18 The "Name" Section of a Dictionary Entry ++................................................. ++ ++This section introduces the dictionary entry. It is not explicitly ++labeled. It appears preceded and followed by a horizontal bar. ++ ++ In large print at left, the defined name appears; if more than one ++defined name is to be described by the entry, all such names are shown ++separated by commas. ++ ++ In somewhat smaller italic print at right is an indication of what ++kind of dictionary entry this is. Possible values are: ++ ++Accessor ++ This is an accessor function. ++ ++Class ++ This is a class. ++ ++Condition Type ++ This is a subtype of type condition. ++ ++Constant Variable ++ This is a constant variable. ++ ++Declaration ++ This is a declaration identifier. ++ ++Function ++ This is a function. ++ ++Local Function ++ This is a function that is defined only lexically within the scope ++ of some other macro form. ++ ++Local Macro ++ This is a macro that is defined only lexically within the scope of ++ some other macro form. ++ ++Macro ++ This is a macro. ++ ++Restart ++ This is a restart. ++ ++Special Operator ++ This is a special operator. ++ ++Standard Generic Function ++ This is a standard generic function. ++ ++Symbol ++ This is a symbol that is specially recognized in some particular ++ situation, such as the syntax of a macro. ++ ++System Class ++ This is like class, but it identifies a class that is potentially a ++ built-in class. (No class is actually required to be a built-in ++ class.) ++ ++Type ++ This is an atomic type specifier, and depending on information for ++ each particular entry, may subject to form other type specifiers. ++ ++Type Specifier ++ This is a defined name that is not an atomic type specifier, but ++ that can be used in constructing valid type specifiers. ++ ++Variable ++ This is a dynamic variable. ++ ++ ++File: gcl.info, Node: The "Notes" Section of a Dictionary Entry, Next: The "Pronunciation" Section of a Dictionary Entry, Prev: The "Name" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.19 The "Notes" Section of a Dictionary Entry ++.................................................. ++ ++Information not found elsewhere in this description which pertains to ++this operator. Among other things, this might include cross reference ++information, code equivalences, stylistic hints, implementation hints, ++typical uses. This information is not considered part of the standard; ++any conforming implementation or conforming program is permitted to ++ignore the presence of this information. ++ ++ ++File: gcl.info, Node: The "Pronunciation" Section of a Dictionary Entry, Next: The "See Also" Section of a Dictionary Entry, Prev: The "Notes" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.20 The "Pronunciation" Section of a Dictionary Entry ++.......................................................... ++ ++This offers a suggested pronunciation for defined names so that people ++not in verbal communication with the original designers can figure out ++how to pronounce words that are not in normal English usage. This ++information is advisory only, and is not considered part of the ++standard. For brevity, it is only provided for entries with names that ++are specific to Common Lisp and would not be found in Webster's Third ++New International Dictionary the English Language, Unabridged. ++ ++ ++File: gcl.info, Node: The "See Also" Section of a Dictionary Entry, Next: The "Side Effects" Section of a Dictionary Entry, Prev: The "Pronunciation" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.21 The "See Also" Section of a Dictionary Entry ++..................................................... ++ ++List of references to other parts of this standard that offer ++information relevant to this operator. This list is not part of the ++standard. ++ ++ ++File: gcl.info, Node: The "Side Effects" Section of a Dictionary Entry, Next: The "Supertypes" Section of a Dictionary Entry, Prev: The "See Also" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.22 The "Side Effects" Section of a Dictionary Entry ++......................................................... ++ ++Anything that is changed as a result of the evaluation of the form ++containing this operator. ++ ++ ++File: gcl.info, Node: The "Supertypes" Section of a Dictionary Entry, Next: The "Syntax" Section of a Dictionary Entry, Prev: The "Side Effects" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.23 The "Supertypes" Section of a Dictionary Entry ++....................................................... ++ ++This appears in the dictionary entry for a type, and contains a list of ++the standardized types that must be supertypes of this type. ++ ++ In implementations where there is a corresponding class, the order of ++the classes in the class precedence list is consistent with the order ++presented in this section. ++ ++ ++File: gcl.info, Node: The "Syntax" Section of a Dictionary Entry, Next: Special "Syntax" Notations for Overloaded Operators, Prev: The "Supertypes" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.24 The "Syntax" Section of a Dictionary Entry ++................................................... ++ ++This section describes how to use the defined name in code. The ++"Syntax" description for a generic function describes the lambda list of ++the generic function itself, while The "Method Signatures" describe the ++lambda lists of the defined methods. The "Syntax" description for an ++ordinary function, a macro, or a special operator describes its ++parameters. ++ ++ For example, an operator description might say: ++ ++ 'F' x y &optional z &key k ++ ++This description indicates that the function F has two required ++parameters, x and y. In addition, there is an optional parameter z and ++a keyword parameter k. ++ ++ For macros and special operators, syntax is given in modified BNF ++notation; see *note Modified BNF Syntax::. For functions a lambda list ++is given. In both cases, however, the outermost parentheses are ++omitted, and default value information is omitted. ++ ++ ++File: gcl.info, Node: Special "Syntax" Notations for Overloaded Operators, Next: Naming Conventions for Rest Parameters, Prev: The "Syntax" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.25 Special "Syntax" Notations for Overloaded Operators ++............................................................ ++ ++If two descriptions exist for the same operation but with different ++numbers of arguments, then the extra arguments are to be treated as ++optional. For example, this pair of lines: ++ ++ 'file-position' stream => position ++ ++ 'file-position' stream position-spec => success-p ++ ++is operationally equivalent to this line: ++ ++ 'file-position' stream &optional position-spec => result ++ ++and differs only in that it provides on opportunity to introduce ++different names for parameter and values for each case. The separated ++(multi-line) notation is used when an operator is overloaded in such a ++way that the parameters are used in different ways depending on how many ++arguments are supplied (e.g., for the function /) or the return values ++are different in the two cases (e.g., for the function file-position). ++ ++ ++File: gcl.info, Node: Naming Conventions for Rest Parameters, Next: Requiring Non-Null Rest Parameters in The "Syntax" Section, Prev: Special "Syntax" Notations for Overloaded Operators, Up: Interpreting Dictionary Entries ++ ++1.4.4.26 Naming Conventions for Rest Parameters ++............................................... ++ ++Within this specification, if the name of a rest parameter is chosen to ++be a plural noun, use of that name in parameter font refers to the list ++to which the rest parameter is bound. Use of the singular form of that ++name in parameter font refers to an element of that list. ++ ++ For example, given a syntax description such as: ++ ++ 'F' &rest arguments ++ ++it is appropriate to refer either to the rest parameter named arguments ++by name, or to one of its elements by speaking of "an argument," "some ++argument," "each argument" etc. ++ ++ ++File: gcl.info, Node: Requiring Non-Null Rest Parameters in The "Syntax" Section, Next: Return values in The "Syntax" Section, Prev: Naming Conventions for Rest Parameters, Up: Interpreting Dictionary Entries ++ ++1.4.4.27 Requiring Non-Null Rest Parameters in The "Syntax" Section ++................................................................... ++ ++In some cases it is useful to refer to all arguments equally as a single ++aggregation using a rest parameter while at the same time requiring at ++least one argument. A variety of imperative and declarative means are ++available in code for expressing such a restriction, however they ++generally do not manifest themselves in a lambda list. For descriptive ++purposes within this specification, ++ ++ 'F' &rest arguments^+ ++ ++means the same as ++ ++ 'F' &rest arguments ++ ++but introduces the additional requirement that there be at least one ++argument. ++ ++ ++File: gcl.info, Node: Return values in The "Syntax" Section, Next: No Arguments or Values in The "Syntax" Section, Prev: Requiring Non-Null Rest Parameters in The "Syntax" Section, Up: Interpreting Dictionary Entries ++ ++1.4.4.28 Return values in The "Syntax" Section ++.............................................. ++ ++An evaluation arrow "=>" precedes a list of values to be returned. For ++example: ++ ++ 'F' a b c => x ++ ++indicates that F is an operator that has three required parameters ++(i.e., a, b, and c) and that returns one value (i.e., x). If more than ++one value is returned by an operator, the names of the values are ++separated by commas, as in: ++ ++ 'F' a b c => x, y, z ++ ++ ++File: gcl.info, Node: No Arguments or Values in The "Syntax" Section, Next: Unconditional Transfer of Control in The "Syntax" Section, Prev: Return values in The "Syntax" Section, Up: Interpreting Dictionary Entries ++ ++1.4.4.29 No Arguments or Values in The "Syntax" Section ++....................................................... ++ ++If no arguments are permitted, or no values are returned, a special ++notation is used to make this more visually apparent. For example, ++ ++ 'F' => ++ ++ indicates that F is an operator that accepts no arguments and returns ++no values. ++ ++ ++File: gcl.info, Node: Unconditional Transfer of Control in The "Syntax" Section, Next: The "Valid Context" Section of a Dictionary Entry, Prev: No Arguments or Values in The "Syntax" Section, Up: Interpreting Dictionary Entries ++ ++1.4.4.30 Unconditional Transfer of Control in The "Syntax" Section ++.................................................................. ++ ++Some operators perform an unconditional transfer of control, and so ++never have any return values. Such operators are notated using a ++notation such as the following: ++ ++ 'F' a b c => # ++ ++ ++File: gcl.info, Node: The "Valid Context" Section of a Dictionary Entry, Next: The "Value Type" Section of a Dictionary Entry, Prev: Unconditional Transfer of Control in The "Syntax" Section, Up: Interpreting Dictionary Entries ++ ++1.4.4.31 The "Valid Context" Section of a Dictionary Entry ++.......................................................... ++ ++This information is used by dictionary entries such as "Declarations" in ++order to restrict the context in which the declaration may appear. ++ ++ A given "Declaration" might appear in a declaration (i.e., a declare ++expression), a proclamation (i.e., a declaim or proclaim form), or both. ++ ++ ++File: gcl.info, Node: The "Value Type" Section of a Dictionary Entry, Prev: The "Valid Context" Section of a Dictionary Entry, Up: Interpreting Dictionary Entries ++ ++1.4.4.32 The "Value Type" Section of a Dictionary Entry ++....................................................... ++ ++This information describes any type restrictions on a dynamic variable. ++ ++ ++File: gcl.info, Node: Conformance, Next: Language Extensions, Prev: Definitions, Up: Introduction (Introduction) ++ ++1.5 Conformance ++=============== ++ ++This standard presents the syntax and semantics to be implemented by a ++conforming implementation (and its accompanying documentation). In ++addition, it imposes requirements on conforming programs. ++ ++* Menu: ++ ++* Conforming Implementations:: ++* Conforming Programs:: ++ ++ ++File: gcl.info, Node: Conforming Implementations, Next: Conforming Programs, Prev: Conformance, Up: Conformance ++ ++1.5.1 Conforming Implementations ++-------------------------------- ++ ++A conforming implementation shall adhere to the requirements outlined in ++this section. ++ ++* Menu: ++ ++* Required Language Features:: ++* Documentation of Implementation-Dependent Features:: ++* Documentation of Extensions:: ++* Treatment of Exceptional Situations:: ++* Resolution of Apparent Conflicts in Exceptional Situations:: ++* Examples of Resolution of Apparent Conflict in Exceptional Situations:: ++* Conformance Statement:: ++ ++ ++File: gcl.info, Node: Required Language Features, Next: Documentation of Implementation-Dependent Features, Prev: Conforming Implementations, Up: Conforming Implementations ++ ++1.5.1.1 Required Language Features ++.................................. ++ ++A conforming implementation shall accept all features (including ++deprecated features) of the language specified in this standard, with ++the meanings defined in this standard. ++ ++ A conforming implementation shall not require the inclusion of ++substitute or additional language elements in code in order to ++accomplish a feature of the language that is specified in this standard. ++ ++ ++File: gcl.info, Node: Documentation of Implementation-Dependent Features, Next: Documentation of Extensions, Prev: Required Language Features, Up: Conforming Implementations ++ ++1.5.1.2 Documentation of Implementation-Dependent Features ++.......................................................... ++ ++A conforming implementation shall be accompanied by a document that ++provides a definition of all implementation-defined aspects of the ++language defined by this specification. ++ ++ In addition, a conforming implementation is encouraged (but not ++required) to document items in this standard that are identified as ++implementation-dependent, although in some cases such documentation ++might simply identify the item as "undefined." ++ ++ ++File: gcl.info, Node: Documentation of Extensions, Next: Treatment of Exceptional Situations, Prev: Documentation of Implementation-Dependent Features, Up: Conforming Implementations ++ ++1.5.1.3 Documentation of Extensions ++................................... ++ ++A conforming implementation shall be accompanied by a document that ++separately describes any features accepted by the implementation that ++are not specified in this standard, but that do not cause any ambiguity ++or contradiction when added to the language standard. Such extensions ++shall be described as being "extensions to Common Lisp as specified by ++ANSI <>." ++ ++ ++File: gcl.info, Node: Treatment of Exceptional Situations, Next: Resolution of Apparent Conflicts in Exceptional Situations, Prev: Documentation of Extensions, Up: Conforming Implementations ++ ++1.5.1.4 Treatment of Exceptional Situations ++........................................... ++ ++A conforming implementation shall treat exceptional situations in a ++manner consistent with this specification. ++ ++ ++File: gcl.info, Node: Resolution of Apparent Conflicts in Exceptional Situations, Next: Examples of Resolution of Apparent Conflict in Exceptional Situations, Prev: Treatment of Exceptional Situations, Up: Conforming Implementations ++ ++1.5.1.5 Resolution of Apparent Conflicts in Exceptional Situations ++.................................................................. ++ ++If more than one passage in this specification appears to apply to the ++same situation but in conflicting ways, the passage that appears to ++describe the situation in the most specific way (not necessarily the ++passage that provides the most constrained kind of error detection) ++takes precedence. ++ ++ ++File: gcl.info, Node: Examples of Resolution of Apparent Conflict in Exceptional Situations, Next: Conformance Statement, Prev: Resolution of Apparent Conflicts in Exceptional Situations, Up: Conforming Implementations ++ ++1.5.1.6 Examples of Resolution of Apparent Conflict in Exceptional Situations ++............................................................................. ++ ++Suppose that function foo is a member of a set S of functions that ++operate on numbers. Suppose that one passage states that an error must ++be signaled if any function in S is ever given an argument of 17. ++Suppose that an apparently conflicting passage states that the ++consequences are undefined if foo receives an argument of 17. Then the ++second passage (the one specifically about foo) would dominate because ++the description of the situational context is the most specific, and it ++would not be required that foo signal an error on an argument of 17 even ++though other functions in the set S would be required to do so. ++ ++ ++File: gcl.info, Node: Conformance Statement, Prev: Examples of Resolution of Apparent Conflict in Exceptional Situations, Up: Conforming Implementations ++ ++1.5.1.7 Conformance Statement ++............................. ++ ++A conforming implementation shall produce a conformance statement as a ++consequence of using the implementation, or that statement shall be ++included in the accompanying documentation. If the implementation ++conforms in all respects with this standard, the conformance statement ++shall be ++ ++ "<> conforms with the requirements of ANSI ++ <>" ++ ++ If the implementation conforms with some but not all of the ++requirements of this standard, then the conformance statement shall be ++ ++ "<> conforms with the requirements of ANSI ++ <> with the following exceptions: <>." ++ ++ ++File: gcl.info, Node: Conforming Programs, Prev: Conforming Implementations, Up: Conformance ++ ++1.5.2 Conforming Programs ++------------------------- ++ ++Code conforming with the requirements of this standard shall adhere to ++the following: ++ ++1. ++ Conforming code shall use only those features of the language ++ syntax and semantics that are either specified in this standard or ++ defined using the extension mechanisms specified in the standard. ++ ++2. ++ Conforming code shall not rely on any particular interpretation of ++ implementation-dependent features. ++ ++3. ++ Conforming code shall not depend on the consequences of undefined ++ or unspecified situations. ++ ++4. ++ Conforming code does not use any constructions that are prohibited ++ by the standard. ++ ++5. ++ Conforming code does not depend on extensions included in an ++ implementation. ++ ++* Menu: ++ ++* Use of Implementation-Defined Language Features:: ++* Use of Read-Time Conditionals:: ++ ++ ++File: gcl.info, Node: Use of Implementation-Defined Language Features, Next: Use of Read-Time Conditionals, Prev: Conforming Programs, Up: Conforming Programs ++ ++1.5.2.1 Use of Implementation-Defined Language Features ++....................................................... ++ ++Note that conforming code may rely on particular implementation-defined ++values or features. Also note that the requirements for conforming code ++and conforming implementations do not require that the results produced ++by conforming code always be the same when processed by a conforming ++implementation. The results may be the same, or they may differ. ++ ++ Portable code is written using only standard characters. ++ ++ Conforming code may run in all conforming implementations, but might ++have allowable implementation-defined behavior that makes it ++non-portable code. For example, the following are examples of forms ++that are conforming, but that might return different values in different ++implementations: ++ ++ (evenp most-positive-fixnum) => implementation-dependent ++ (random) => implementation-dependent ++ (> lambda-parameters-limit 93) => implementation-dependent ++ (char-name #\A) => implementation-dependent ++ ++ ++File: gcl.info, Node: Use of Read-Time Conditionals, Prev: Use of Implementation-Defined Language Features, Up: Conforming Programs ++ ++1.5.2.2 Use of Read-Time Conditionals ++..................................... ++ ++Use of #+ and #- does not automatically disqualify a program from being ++conforming. A program which uses #+ and #- is considered conforming if ++there is no set of features in which the program would not be ++conforming. Of course, conforming programs are not necessarily working ++programs. The following program is conforming: ++ ++ (defun foo () ++ #+ACME (acme:initialize-something) ++ (print 'hello-there)) ++ ++ However, this program might or might not work, depending on whether ++the presence of the feature ACME really implies that a function named ++acme:initialize-something is present in the environment. In effect, ++using #+ or #- in a conforming program means that the variable ++*features* ++ ++ becomes just one more piece of input data to that program. Like any ++other data coming into a program, the programmer is responsible for ++assuring that the program does not make unwarranted assumptions on the ++basis of input data. ++ ++ ++File: gcl.info, Node: Language Extensions, Next: Language Subsets, Prev: Conformance, Up: Introduction (Introduction) ++ ++1.6 Language Extensions ++======================= ++ ++A language extension is any documented implementation-defined behavior ++of a defined name in this standard that varies from the behavior ++described in this standard, or a documented consequence of a situation ++that the standard specifies as undefined, unspecified, or extendable by ++the implementation. For example, if this standard says that "the ++results are unspecified," an extension would be to specify the results. ++ ++ [Reviewer Note by Barmar: This contradicts previous definitions of ++conforming code.] If the correct behavior of a program depends on the ++results provided by an extension, only implementations with the same ++extension will execute the program correctly. Note that such a program ++might be non-conforming. Also, if this standard says that "an ++implementation may be extended," a conforming, but possibly ++non-portable, program can be written using an extension. ++ ++ An implementation can have extensions, provided they do not alter the ++behavior of conforming code and provided they are not explicitly ++prohibited by this standard. ++ ++ The term "extension" refers only to extensions available upon ++startup. An implementation is free to allow or prohibit redefinition of ++an extension. ++ ++ The following list contains specific guidance to implementations ++concerning certain types of extensions. ++ ++Extra return values ++ ++ An implementation must return exactly the number of return values ++ specified by this standard unless the standard specifically ++ indicates otherwise. ++ ++Unsolicited messages ++ ++ No output can be produced by a function other than that specified ++ in the standard or due to the signaling of conditions detected by ++ the function. ++ ++ Unsolicited output, such as garbage collection notifications and ++ autoload heralds, should not go directly to the stream that is the ++ value of a stream variable defined in this standard, but can go ++ indirectly to terminal I/O by using a synonym stream to ++ *terminal-io*. ++ ++ Progress reports from such functions as load and compile are ++ considered solicited, and are not covered by this prohibition. ++ ++Implementation of macros and special forms ++ ++ Macros and special operators defined in this standard must not be ++ functions. ++ ++ ++File: gcl.info, Node: Language Subsets, Next: Deprecated Language Features, Prev: Language Extensions, Up: Introduction (Introduction) ++ ++1.7 Language Subsets ++==================== ++ ++The language described in this standard contains no subsets, though ++subsets are not forbidden. ++ ++ For a language to be considered a subset, it must have the property ++that any valid program in that language has equivalent semantics and ++will run directly (with no extralingual pre-processing, and no special ++compatibility packages) in any conforming implementation of the full ++language. ++ ++ A language that conforms to this requirement shall be described as ++being a "subset of Common Lisp as specified by ANSI <>." ++ ++ ++File: gcl.info, Node: Deprecated Language Features, Next: Symbols in the COMMON-LISP Package, Prev: Language Subsets, Up: Introduction (Introduction) ++ ++1.8 Deprecated Language Features ++================================ ++ ++Deprecated language features are not expected to appear in future Common ++Lisp standards, but are required to be implemented for conformance with ++this standard; see *note Required Language Features::. ++ ++ Conforming programs can use deprecated features; however, it is ++considered good programming style to avoid them. It is permissible for ++the compiler to produce style warnings about the use of such features at ++compile time, but there should be no such warnings at program execution ++time. ++ ++* Menu: ++ ++* Deprecated Functions:: ++* Deprecated Argument Conventions:: ++* Deprecated Variables:: ++* Deprecated Reader Syntax:: ++ ++ ++File: gcl.info, Node: Deprecated Functions, Next: Deprecated Argument Conventions, Prev: Deprecated Language Features, Up: Deprecated Language Features ++ ++1.8.1 Deprecated Functions ++-------------------------- ++ ++The functions in Figure 1-2 are deprecated. ++ assoc-if-not nsubst-if-not require ++ count-if-not nsubstitute-if-not set ++ delete-if-not position-if-not subst-if-not ++ find-if-not provide substitute-if-not ++ gentemp rassoc-if-not ++ member-if-not remove-if-not ++ ++ Figure 1-2: Deprecated Functions ++ ++ ++ ++File: gcl.info, Node: Deprecated Argument Conventions, Next: Deprecated Variables, Prev: Deprecated Functions, Up: Deprecated Language Features ++ ++1.8.2 Deprecated Argument Conventions ++------------------------------------- ++ ++The ability to pass a numeric argument to gensym has been deprecated. ++ ++ The :test-not argument to the functions in Figure 1-3 are deprecated. ++ ++ adjoin nset-difference search ++ assoc nset-exclusive-or set-difference ++ count nsublis set-exclusive-or ++ delete nsubst sublis ++ delete-duplicates nsubstitute subsetp ++ find nunion subst ++ intersection position substitute ++ member rassoc tree-equal ++ mismatch remove union ++ nintersection remove-duplicates ++ ++ Figure 1-3: Functions with Deprecated :TEST-NOT Arguments ++ ++ ++ The use of the situation names compile, load, and eval in eval-when ++is deprecated. ++ ++ ++File: gcl.info, Node: Deprecated Variables, Next: Deprecated Reader Syntax, Prev: Deprecated Argument Conventions, Up: Deprecated Language Features ++ ++1.8.3 Deprecated Variables ++-------------------------- ++ ++The variable *modules* is deprecated. ++ ++ ++File: gcl.info, Node: Deprecated Reader Syntax, Prev: Deprecated Variables, Up: Deprecated Language Features ++ ++1.8.4 Deprecated Reader Syntax ++------------------------------ ++ ++The #S reader macro forces keyword names into the KEYWORD package; see ++*note Sharpsign S::. This feature is deprecated; in the future, keyword ++names will be taken in the package they are read in, so symbols that are ++actually in the KEYWORD package should be used if that is what is ++desired. ++ ++ ++File: gcl.info, Node: Symbols in the COMMON-LISP Package, Prev: Deprecated Language Features, Up: Introduction (Introduction) ++ ++1.9 Symbols in the COMMON-LISP Package ++====================================== ++ ++The figures on the next twelve pages contain a complete enumeration of ++the 978 external symbols in the COMMON-LISP package. ++ ++ &allow-other-keys *print-miser-width* ++ &aux *print-pprint-dispatch* ++ &body *print-pretty* ++ &environment *print-radix* ++ &key *print-readably* ++ &optional *print-right-margin* ++ &rest *query-io* ++ &whole *random-state* ++ * *read-base* ++ ** *read-default-float-format* ++ *** *read-eval* ++ *break-on-signals* *read-suppress* ++ *compile-file-pathname* *readtable* ++ *compile-file-truename* *standard-input* ++ *compile-print* *standard-output* ++ *compile-verbose* *terminal-io* ++ *debug-io* *trace-output* ++ *debugger-hook* + ++ *default-pathname-defaults* ++ ++ *error-output* +++ ++ *features* - ++ *gensym-counter* / ++ *load-pathname* // ++ *load-print* /// ++ *load-truename* /= ++ *load-verbose* 1+ ++ *macroexpand-hook* 1- ++ *modules* < ++ *package* <= ++ *print-array* = ++ *print-base* > ++ *print-case* >= ++ *print-circle* abort ++ *print-escape* abs ++ *print-gensym* acons ++ *print-length* acos ++ *print-level* acosh ++ *print-lines* add-method ++ ++ Figure 1-4: Symbols in the COMMON-LISP package (part one of twelve). ++ ++ ++ adjoin atom boundp ++ adjust-array base-char break ++ adjustable-array-p base-string broadcast-stream ++ allocate-instance bignum broadcast-stream-streams ++ alpha-char-p bit built-in-class ++ alphanumericp bit-and butlast ++ and bit-andc1 byte ++ append bit-andc2 byte-position ++ apply bit-eqv byte-size ++ apropos bit-ior caaaar ++ apropos-list bit-nand caaadr ++ aref bit-nor caaar ++ arithmetic-error bit-not caadar ++ arithmetic-error-operands bit-orc1 caaddr ++ arithmetic-error-operation bit-orc2 caadr ++ array bit-vector caar ++ array-dimension bit-vector-p cadaar ++ array-dimension-limit bit-xor cadadr ++ array-dimensions block cadar ++ array-displacement boole caddar ++ array-element-type boole-1 cadddr ++ array-has-fill-pointer-p boole-2 caddr ++ array-in-bounds-p boole-and cadr ++ array-rank boole-andc1 call-arguments-limit ++ array-rank-limit boole-andc2 call-method ++ array-row-major-index boole-c1 call-next-method ++ array-total-size boole-c2 car ++ array-total-size-limit boole-clr case ++ arrayp boole-eqv catch ++ ash boole-ior ccase ++ asin boole-nand cdaaar ++ asinh boole-nor cdaadr ++ assert boole-orc1 cdaar ++ assoc boole-orc2 cdadar ++ assoc-if boole-set cdaddr ++ assoc-if-not boole-xor cdadr ++ atan boolean cdar ++ atanh both-case-p cddaar ++ ++ Figure 1-5: Symbols in the COMMON-LISP package (part two of twelve). ++ ++ ++ cddadr clear-input copy-tree ++ cddar clear-output cos ++ cdddar close cosh ++ cddddr clrhash count ++ cdddr code-char count-if ++ cddr coerce count-if-not ++ cdr compilation-speed ctypecase ++ ceiling compile debug ++ cell-error compile-file decf ++ cell-error-name compile-file-pathname declaim ++ cerror compiled-function declaration ++ change-class compiled-function-p declare ++ char compiler-macro decode-float ++ char-code compiler-macro-function decode-universal-time ++ char-code-limit complement defclass ++ char-downcase complex defconstant ++ char-equal complexp defgeneric ++ char-greaterp compute-applicable-methods define-compiler-macro ++ char-int compute-restarts define-condition ++ char-lessp concatenate define-method-combination ++ char-name concatenated-stream define-modify-macro ++ char-not-equal concatenated-stream-streams define-setf-expander ++ char-not-greaterp cond define-symbol-macro ++ char-not-lessp condition defmacro ++ char-upcase conjugate defmethod ++ char/= cons defpackage ++ char< consp defparameter ++ char<= constantly defsetf ++ char= constantp defstruct ++ char> continue deftype ++ char>= control-error defun ++ character copy-alist defvar ++ characterp copy-list delete ++ check-type copy-pprint-dispatch delete-duplicates ++ cis copy-readtable delete-file ++ class copy-seq delete-if ++ class-name copy-structure delete-if-not ++ class-of copy-symbol delete-package ++ ++ Figure 1-6: Symbols in the COMMON-LISP package (part three of twelve). ++ ++ ++ denominator eq ++ deposit-field eql ++ describe equal ++ describe-object equalp ++ destructuring-bind error ++ digit-char etypecase ++ digit-char-p eval ++ directory eval-when ++ directory-namestring evenp ++ disassemble every ++ division-by-zero exp ++ do export ++ do* expt ++ do-all-symbols extended-char ++ do-external-symbols fboundp ++ do-symbols fceiling ++ documentation fdefinition ++ dolist ffloor ++ dotimes fifth ++ double-float file-author ++ double-float-epsilon file-error ++ double-float-negative-epsilon file-error-pathname ++ dpb file-length ++ dribble file-namestring ++ dynamic-extent file-position ++ ecase file-stream ++ echo-stream file-string-length ++ echo-stream-input-stream file-write-date ++ echo-stream-output-stream fill ++ ed fill-pointer ++ eighth find ++ elt find-all-symbols ++ encode-universal-time find-class ++ end-of-file find-if ++ endp find-if-not ++ enough-namestring find-method ++ ensure-directories-exist find-package ++ ensure-generic-function find-restart ++ ++ Figure 1-7: Symbols in the COMMON-LISP package (part four of twelve). ++ ++ ++ find-symbol get-internal-run-time ++ finish-output get-macro-character ++ first get-output-stream-string ++ fixnum get-properties ++ flet get-setf-expansion ++ float get-universal-time ++ float-digits getf ++ float-precision gethash ++ float-radix go ++ float-sign graphic-char-p ++ floating-point-inexact handler-bind ++ floating-point-invalid-operation handler-case ++ floating-point-overflow hash-table ++ floating-point-underflow hash-table-count ++ floatp hash-table-p ++ floor hash-table-rehash-size ++ fmakunbound hash-table-rehash-threshold ++ force-output hash-table-size ++ format hash-table-test ++ formatter host-namestring ++ fourth identity ++ fresh-line if ++ fround ignorable ++ ftruncate ignore ++ ftype ignore-errors ++ funcall imagpart ++ function import ++ function-keywords in-package ++ function-lambda-expression incf ++ functionp initialize-instance ++ gcd inline ++ generic-function input-stream-p ++ gensym inspect ++ gentemp integer ++ get integer-decode-float ++ get-decoded-time integer-length ++ get-dispatch-macro-character integerp ++ get-internal-real-time interactive-stream-p ++ ++ Figure 1-8: Symbols in the COMMON-LISP package (part five of twelve). ++ ++ ++ intern lisp-implementation-type ++ internal-time-units-per-second lisp-implementation-version ++ intersection list ++ invalid-method-error list* ++ invoke-debugger list-all-packages ++ invoke-restart list-length ++ invoke-restart-interactively listen ++ isqrt listp ++ keyword load ++ keywordp load-logical-pathname-translations ++ labels load-time-value ++ lambda locally ++ lambda-list-keywords log ++ lambda-parameters-limit logand ++ last logandc1 ++ lcm logandc2 ++ ldb logbitp ++ ldb-test logcount ++ ldiff logeqv ++ least-negative-double-float logical-pathname ++ least-negative-long-float logical-pathname-translations ++ least-negative-normalized-double-float logior ++ least-negative-normalized-long-float lognand ++ least-negative-normalized-short-float lognor ++ least-negative-normalized-single-float lognot ++ least-negative-short-float logorc1 ++ least-negative-single-float logorc2 ++ least-positive-double-float logtest ++ least-positive-long-float logxor ++ least-positive-normalized-double-float long-float ++ least-positive-normalized-long-float long-float-epsilon ++ least-positive-normalized-short-float long-float-negative-epsilon ++ least-positive-normalized-single-float long-site-name ++ least-positive-short-float loop ++ least-positive-single-float loop-finish ++ length lower-case-p ++ let machine-instance ++ let* machine-type ++ ++ Figure 1-9: Symbols in the COMMON-LISP package (part six of twelve). ++ ++ ++ machine-version mask-field ++ macro-function max ++ macroexpand member ++ macroexpand-1 member-if ++ macrolet member-if-not ++ make-array merge ++ make-broadcast-stream merge-pathnames ++ make-concatenated-stream method ++ make-condition method-combination ++ make-dispatch-macro-character method-combination-error ++ make-echo-stream method-qualifiers ++ make-hash-table min ++ make-instance minusp ++ make-instances-obsolete mismatch ++ make-list mod ++ make-load-form most-negative-double-float ++ make-load-form-saving-slots most-negative-fixnum ++ make-method most-negative-long-float ++ make-package most-negative-short-float ++ make-pathname most-negative-single-float ++ make-random-state most-positive-double-float ++ make-sequence most-positive-fixnum ++ make-string most-positive-long-float ++ make-string-input-stream most-positive-short-float ++ make-string-output-stream most-positive-single-float ++ make-symbol muffle-warning ++ make-synonym-stream multiple-value-bind ++ make-two-way-stream multiple-value-call ++ makunbound multiple-value-list ++ map multiple-value-prog1 ++ map-into multiple-value-setq ++ mapc multiple-values-limit ++ mapcan name-char ++ mapcar namestring ++ mapcon nbutlast ++ maphash nconc ++ mapl next-method-p ++ maplist nil ++ ++ Figure 1-10: Symbols in the COMMON-LISP package (part seven of twelve). ++ ++ ++ nintersection package-error ++ ninth package-error-package ++ no-applicable-method package-name ++ no-next-method package-nicknames ++ not package-shadowing-symbols ++ notany package-use-list ++ notevery package-used-by-list ++ notinline packagep ++ nreconc pairlis ++ nreverse parse-error ++ nset-difference parse-integer ++ nset-exclusive-or parse-namestring ++ nstring-capitalize pathname ++ nstring-downcase pathname-device ++ nstring-upcase pathname-directory ++ nsublis pathname-host ++ nsubst pathname-match-p ++ nsubst-if pathname-name ++ nsubst-if-not pathname-type ++ nsubstitute pathname-version ++ nsubstitute-if pathnamep ++ nsubstitute-if-not peek-char ++ nth phase ++ nth-value pi ++ nthcdr plusp ++ null pop ++ number position ++ numberp position-if ++ numerator position-if-not ++ nunion pprint ++ oddp pprint-dispatch ++ open pprint-exit-if-list-exhausted ++ open-stream-p pprint-fill ++ optimize pprint-indent ++ or pprint-linear ++ otherwise pprint-logical-block ++ output-stream-p pprint-newline ++ package pprint-pop ++ ++ Figure 1-11: Symbols in the COMMON-LISP package (part eight of twelve). ++ ++ ++ pprint-tab read-char ++ pprint-tabular read-char-no-hang ++ prin1 read-delimited-list ++ prin1-to-string read-from-string ++ princ read-line ++ princ-to-string read-preserving-whitespace ++ print read-sequence ++ print-not-readable reader-error ++ print-not-readable-object readtable ++ print-object readtable-case ++ print-unreadable-object readtablep ++ probe-file real ++ proclaim realp ++ prog realpart ++ prog* reduce ++ prog1 reinitialize-instance ++ prog2 rem ++ progn remf ++ program-error remhash ++ progv remove ++ provide remove-duplicates ++ psetf remove-if ++ psetq remove-if-not ++ push remove-method ++ pushnew remprop ++ quote rename-file ++ random rename-package ++ random-state replace ++ random-state-p require ++ rassoc rest ++ rassoc-if restart ++ rassoc-if-not restart-bind ++ ratio restart-case ++ rational restart-name ++ rationalize return ++ rationalp return-from ++ read revappend ++ read-byte reverse ++ ++ Figure 1-12: Symbols in the COMMON-LISP package (part nine of twelve). ++ ++ ++ room simple-bit-vector ++ rotatef simple-bit-vector-p ++ round simple-condition ++ row-major-aref simple-condition-format-arguments ++ rplaca simple-condition-format-control ++ rplacd simple-error ++ safety simple-string ++ satisfies simple-string-p ++ sbit simple-type-error ++ scale-float simple-vector ++ schar simple-vector-p ++ search simple-warning ++ second sin ++ sequence single-float ++ serious-condition single-float-epsilon ++ set single-float-negative-epsilon ++ set-difference sinh ++ set-dispatch-macro-character sixth ++ set-exclusive-or sleep ++ set-macro-character slot-boundp ++ set-pprint-dispatch slot-exists-p ++ set-syntax-from-char slot-makunbound ++ setf slot-missing ++ setq slot-unbound ++ seventh slot-value ++ shadow software-type ++ shadowing-import software-version ++ shared-initialize some ++ shiftf sort ++ short-float space ++ short-float-epsilon special ++ short-float-negative-epsilon special-operator-p ++ short-site-name speed ++ signal sqrt ++ signed-byte stable-sort ++ signum standard ++ simple-array standard-char ++ simple-base-string standard-char-p ++ ++ Figure 1-13: Symbols in the COMMON-LISP package (part ten of twelve). ++ ++ ++ standard-class sublis ++ standard-generic-function subseq ++ standard-method subsetp ++ standard-object subst ++ step subst-if ++ storage-condition subst-if-not ++ store-value substitute ++ stream substitute-if ++ stream-element-type substitute-if-not ++ stream-error subtypep ++ stream-error-stream svref ++ stream-external-format sxhash ++ streamp symbol ++ string symbol-function ++ string-capitalize symbol-macrolet ++ string-downcase symbol-name ++ string-equal symbol-package ++ string-greaterp symbol-plist ++ string-left-trim symbol-value ++ string-lessp symbolp ++ string-not-equal synonym-stream ++ string-not-greaterp synonym-stream-symbol ++ string-not-lessp t ++ string-right-trim tagbody ++ string-stream tailp ++ string-trim tan ++ string-upcase tanh ++ string/= tenth ++ string< terpri ++ string<= the ++ string= third ++ string> throw ++ string>= time ++ stringp trace ++ structure translate-logical-pathname ++ structure-class translate-pathname ++ structure-object tree-equal ++ style-warning truename ++ ++ Figure 1-14: Symbols in the COMMON-LISP package (part eleven of twelve). ++ ++ ++ truncate values-list ++ two-way-stream variable ++ two-way-stream-input-stream vector ++ two-way-stream-output-stream vector-pop ++ type vector-push ++ type-error vector-push-extend ++ type-error-datum vectorp ++ type-error-expected-type warn ++ type-of warning ++ typecase when ++ typep wild-pathname-p ++ unbound-slot with-accessors ++ unbound-slot-instance with-compilation-unit ++ unbound-variable with-condition-restarts ++ undefined-function with-hash-table-iterator ++ unexport with-input-from-string ++ unintern with-open-file ++ union with-open-stream ++ unless with-output-to-string ++ unread-char with-package-iterator ++ unsigned-byte with-simple-restart ++ untrace with-slots ++ unuse-package with-standard-io-syntax ++ unwind-protect write ++ update-instance-for-different-class write-byte ++ update-instance-for-redefined-class write-char ++ upgraded-array-element-type write-line ++ upgraded-complex-part-type write-sequence ++ upper-case-p write-string ++ use-package write-to-string ++ use-value y-or-n-p ++ user-homedir-pathname yes-or-no-p ++ values zerop ++ ++ Figure 1-15: Symbols in the COMMON-LISP package (part twelve of twelve). ++ ++ ++ ++File: gcl.info, Node: Syntax, Next: Evaluation and Compilation, Prev: Introduction (Introduction), Up: Top ++ ++2 Syntax ++******** ++ ++* Menu: ++ ++* Character Syntax:: ++* Reader Algorithm:: ++* Interpretation of Tokens:: ++* Standard Macro Characters:: ++ ++ ++File: gcl.info, Node: Character Syntax, Next: Reader Algorithm, Prev: Syntax, Up: Syntax ++ ++2.1 Character Syntax ++==================== ++ ++The Lisp reader takes characters from a stream, interprets them as a ++printed representation of an object, constructs that object, and returns ++it. ++ ++ The syntax described by this chapter is called the standard syntax . ++Operations are provided by Common Lisp so that various aspects of the ++syntax information represented by a readtable can be modified under ++program control; see *note Reader::. Except as explicitly stated ++otherwise, the syntax used throughout this document is standard syntax. ++ ++* Menu: ++ ++* Readtables:: ++* Variables that affect the Lisp Reader:: ++* Standard Characters:: ++* Character Syntax Types:: ++ ++ ++File: gcl.info, Node: Readtables, Next: Variables that affect the Lisp Reader, Prev: Character Syntax, Up: Character Syntax ++ ++2.1.1 Readtables ++---------------- ++ ++Syntax information for use by the Lisp reader is embodied in an object ++called a readtable . Among other things, the readtable contains the ++association between characters and syntax types. ++ ++ Figure 2-1 lists some defined names that are applicable to ++readtables. ++ ++ *readtable* readtable-case ++ copy-readtable readtablep ++ get-dispatch-macro-character set-dispatch-macro-character ++ get-macro-character set-macro-character ++ make-dispatch-macro-character set-syntax-from-char ++ ++ Figure 2-1: Readtable defined names ++ ++ ++* Menu: ++ ++* The Current Readtable:: ++* The Standard Readtable:: ++* The Initial Readtable:: ++ ++ ++File: gcl.info, Node: The Current Readtable, Next: The Standard Readtable, Prev: Readtables, Up: Readtables ++ ++2.1.1.1 The Current Readtable ++............................. ++ ++Several readtables describing different syntaxes can exist, but at any ++given time only one, called the current readtable , affects the way in ++which expressions_2 are parsed into objects by the Lisp reader. The ++current readtable in a given dynamic environment is the value of ++*readtable* in that environment. To make a different readtable become ++the current readtable, *readtable* can be assigned or bound. ++ ++ ++File: gcl.info, Node: The Standard Readtable, Next: The Initial Readtable, Prev: The Current Readtable, Up: Readtables ++ ++2.1.1.2 The Standard Readtable ++.............................. ++ ++The standard readtable conforms to standard syntax. The consequences ++are undefined if an attempt is made to modify the standard readtable. ++To achieve the effect of altering or extending standard syntax, a copy ++of the standard readtable can be created; see the function ++copy-readtable. ++ ++ The readtable case of the standard readtable is :upcase. ++ ++ ++File: gcl.info, Node: The Initial Readtable, Prev: The Standard Readtable, Up: Readtables ++ ++2.1.1.3 The Initial Readtable ++............................. ++ ++The initial readtable is the readtable that is the current readtable at ++the time when the Lisp image starts. At that time, it conforms to ++standard syntax. The initial readtable is distinct from the standard ++readtable. It is permissible for a conforming program to modify the ++initial readtable. ++ ++ ++File: gcl.info, Node: Variables that affect the Lisp Reader, Next: Standard Characters, Prev: Readtables, Up: Character Syntax ++ ++2.1.2 Variables that affect the Lisp Reader ++------------------------------------------- ++ ++The Lisp reader is influenced not only by the current readtable, but ++also by various dynamic variables. Figure 2-2 lists the variables that ++influence the behavior of the Lisp reader. ++ ++ *package* *read-default-float-format* *readtable* ++ *read-base* *read-suppress* ++ ++ Figure 2-2: Variables that influence the Lisp reader. ++ ++ ++ ++File: gcl.info, Node: Standard Characters, Next: Character Syntax Types, Prev: Variables that affect the Lisp Reader, Up: Character Syntax ++ ++2.1.3 Standard Characters ++------------------------- ++ ++All implementations must support a character repertoire called ++standard-char; characters that are members of that repertoire are called ++standard characters . ++ ++ The standard-char repertoire consists of the non-graphic character ++newline, the graphic character space, and the following additional ++ninety-four graphic characters or their equivalents: ++ ++ Graphic ID Glyph Description Graphic ID Glyph Description ++ LA01 a small a LN01 n small n ++ LA02 A capital A LN02 N capital N ++ LB01 b small b LO01 o small o ++ LB02 B capital B LO02 O capital O ++ LC01 c small c LP01 p small p ++ LC02 C capital C LP02 P capital P ++ LD01 d small d LQ01 q small q ++ LD02 D capital D LQ02 Q capital Q ++ LE01 e small e LR01 r small r ++ LE02 E capital E LR02 R capital R ++ LF01 f small f LS01 s small s ++ LF02 F capital F LS02 S capital S ++ LG01 g small g LT01 t small t ++ LG02 G capital G LT02 T capital T ++ LH01 h small h LU01 u small u ++ LH02 H capital H LU02 U capital U ++ LI01 i small i LV01 v small v ++ LI02 I capital I LV02 V capital V ++ LJ01 j small j LW01 w small w ++ LJ02 J capital J LW02 W capital W ++ LK01 k small k LX01 x small x ++ LK02 K capital K LX02 X capital X ++ LL01 l small l LY01 y small y ++ LL02 L capital L LY02 Y capital Y ++ LM01 m small m LZ01 z small z ++ LM02 M capital M LZ02 Z capital Z ++ ++ Figure 2-3: Standard Character Subrepertoire (Part 1 of 3: Latin Characters) ++ ++ ++ Graphic ID Glyph Description Graphic ID Glyph Description ++ ND01 1 digit 1 ND06 6 digit 6 ++ ND02 2 digit 2 ND07 7 digit 7 ++ ND03 3 digit 3 ND08 8 digit 8 ++ ND04 4 digit 4 ND09 9 digit 9 ++ ND05 5 digit 5 ND10 0 digit 0 ++ ++ Figure 2-4: Standard Character Subrepertoire (Part 2 of 3: Numeric Characters) ++ ++ ++ Graphic ID Glyph Description ++ SP02 ! exclamation mark ++ SC03 $ dollar sign ++ SP04 " quotation mark, or double quote ++ SP05 ' apostrophe, or [single] quote ++ SP06 ( left parenthesis, or open parenthesis ++ SP07 ) right parenthesis, or close parenthesis ++ SP08 , comma ++ SP09 _ low line, or underscore ++ SP10 - hyphen, or minus [sign] ++ SP11 . full stop, period, or dot ++ SP12 / solidus, or slash ++ SP13 : colon ++ SP14 ; semicolon ++ SP15 ? question mark ++ SA01 + plus [sign] ++ SA03 < less-than [sign] ++ SA04 = equals [sign] ++ SA05 > greater-than [sign] ++ SM01 # number sign, or sharp[sign] ++ SM02 % percent [sign] ++ SM03 & ampersand ++ SM04 * asterisk, or star ++ SM05 @ commercial at, or at-sign ++ SM06 [ left [square] bracket ++ SM07 \ reverse solidus, or backslash ++ SM08 ] right [square] bracket ++ SM11 { left curly bracket, or left brace ++ SM13 | vertical bar ++ SM14 } right curly bracket, or right brace ++ SD13 ` grave accent, or backquote ++ SD15 ^ circumflex accent ++ SD19 ~ tilde ++ ++ Figure 2-5: Standard Character Subrepertoire (Part 3 of 3: Special Characters) ++ ++ ++ The graphic IDs are not used within Common Lisp, but are provided for ++cross reference purposes with ISO 6937/2. Note that the first letter of ++the graphic ID categorizes the character as follows: L--Latin, ++N--Numeric, S--Special. ++ ++ ++File: gcl.info, Node: Character Syntax Types, Prev: Standard Characters, Up: Character Syntax ++ ++2.1.4 Character Syntax Types ++---------------------------- ++ ++The Lisp reader constructs an object from the input text by interpreting ++each character according to its syntax type. The Lisp reader cannot ++accept as input everything that the Lisp printer produces, and the Lisp ++reader has features that are not used by the Lisp printer. The Lisp ++reader can be used as a lexical analyzer for a more general user-written ++parser. ++ ++ When the Lisp reader is invoked, it reads a single character from the ++input stream and dispatches according to the syntax type of that ++character. Every character that can appear in the input stream is of ++one of the syntax types shown in Figure~2-6. ++ ++ constituent macro character single escape ++ invalid multiple escape whitespace_2 ++ ++ Figure 2-6: Possible Character Syntax Types ++ ++ ++ The syntax type of a character in a readtable determines how that ++character is interpreted by the Lisp reader while that readtable is the ++current readtable. At any given time, every character has exactly one ++syntax type. ++ ++ Figure~2-7 lists the syntax type of each character in standard ++syntax. ++ ++ character syntax type character syntax type ++ Backspace constituent 0-9 constituent ++ Tab whitespace_2 : constituent ++ Newline whitespace_2 ; terminating macro char ++ Linefeed whitespace_2 < constituent ++ Page whitespace_2 = constituent ++ Return whitespace_2 > constituent ++ Space whitespace_2 ? constituent* ++ ! constituent* @ constituent ++ " terminating macro char A-Z constituent ++ # non-terminating macro char [ constituent* ++ $ constituent \ single escape ++ % constituent ] constituent* ++ & constituent ^ constituent ++ ' terminating macro char _ constituent ++ ( terminating macro char ' terminating macro char ++ ) terminating macro char a-z constituent ++ * constituent { constituent* ++ + constituent | multiple escape ++ , terminating macro char } constituent* ++ - constituent ~ constituent ++ . constituent Rubout constituent ++ / constituent ++ ++ Figure 2-7: Character Syntax Types in Standard Syntax ++ ++ ++ The characters marked with an asterisk (*) are initially ++constituents, but they are not used in any standard Common Lisp ++notations. These characters are explicitly reserved to the programmer. ++~ is not used in Common Lisp, and reserved to implementors. $ and % are ++alphabetic_2 characters, but are not used in the names of any standard ++Common Lisp defined names. ++ ++ Whitespace_2 characters serve as separators but are otherwise ++ignored. Constituent and escape characters are accumulated to make a ++token, which is then interpreted as a number or symbol. Macro ++characters trigger the invocation of functions (possibly user-supplied) ++that can perform arbitrary parsing actions. Macro characters are ++divided into two kinds, terminating and non-terminating, depending on ++whether or not they terminate a token. The following are descriptions ++of each kind of syntax type. ++ ++* Menu: ++ ++* Constituent Characters:: ++* Constituent Traits:: ++* Invalid Characters:: ++* Macro Characters:: ++* Multiple Escape Characters:: ++* Examples of Multiple Escape Characters:: ++* Single Escape Character:: ++* Examples of Single Escape Characters:: ++* Whitespace Characters:: ++* Examples of Whitespace Characters:: ++ ++ ++File: gcl.info, Node: Constituent Characters, Next: Constituent Traits, Prev: Character Syntax Types, Up: Character Syntax Types ++ ++2.1.4.1 Constituent Characters ++.............................. ++ ++Constituent characters are used in tokens. A token is a representation ++of a number or a symbol. Examples of constituent characters are letters ++and digits. ++ ++ Letters in symbol names are sometimes converted to letters in the ++opposite case when the name is read; see *note Effect of Readtable Case ++on the Lisp Reader::. Case conversion can be suppressed by the use of ++single escape or multiple escape characters. ++ ++ ++File: gcl.info, Node: Constituent Traits, Next: Invalid Characters, Prev: Constituent Characters, Up: Character Syntax Types ++ ++2.1.4.2 Constituent Traits ++.......................... ++ ++Every character has one or more constituent traits that define how the ++character is to be interpreted by the Lisp reader when the character is ++a constituent character. These constituent traits are alphabetic_2, ++digit, package marker, plus sign, minus sign, dot, decimal point, ratio ++marker, exponent marker, and invalid. Figure~2-8 shows the constituent ++traits of the standard characters and of certain semi-standard ++characters; no mechanism is provided for changing the constituent trait ++of a character. Any character with the alphadigit constituent trait in ++that figure is a digit if the current input base is greater than that ++character's digit value, otherwise the character is alphabetic_2. Any ++character quoted by a single escape is treated as an alphabetic_2 ++constituent, regardless of its normal syntax. ++ ++ constituent traits constituent traits ++ character character ++ ________________________________________________________________________________ ++ Backspace invalid { alphabetic_2 ++ Tab invalid* } alphabetic_2 ++ Newline invalid* + alphabetic_2, plus sign ++ Linefeed invalid* - alphabetic_2, minus sign ++ Page invalid* . alphabetic_2, dot, decimal point ++ Return invalid* / alphabetic_2, ratio marker ++ Space invalid* A, a alphadigit ++ ! alphabetic_2 B, b alphadigit ++ " alphabetic_2* C, c alphadigit ++ # alphabetic_2* D, d alphadigit, double-float exponent marker ++ $ alphabetic_2 E, e alphadigit, float exponent marker ++ % alphabetic_2 F, f alphadigit, single-float exponent marker ++ & alphabetic_2 G, g alphadigit ++ ' alphabetic_2* H, h alphadigit ++ ( alphabetic_2* I, i alphadigit ++ ) alphabetic_2* J, j alphadigit ++ * alphabetic_2 K, k alphadigit ++ , alphabetic_2* L, l alphadigit, long-float exponent marker ++ 0-9 alphadigit M, m alphadigit ++ : package marker N, n alphadigit ++ ; alphabetic_2* O, o alphadigit ++ < alphabetic_2 P, p alphadigit ++ = alphabetic_2 Q, q alphadigit ++ > alphabetic_2 R, r alphadigit ++ ? alphabetic_2 S, s alphadigit, short-float exponent marker ++ @ alphabetic_2 T, t alphadigit ++ [ alphabetic_2 U, u alphadigit ++ \ alphabetic_2* V, v alphadigit ++ ] alphabetic_2 W, w alphadigit ++ ^ alphabetic_2 X, x alphadigit ++ _ alphabetic_2 Y, y alphadigit ++ ' alphabetic_2* Z, z alphadigit ++ | alphabetic_2* Rubout invalid ++ ~ alphabetic_2 ++ ++ Figure 2-8: Constituent Traits of Standard Characters and Semi-Standard Characters ++ ++ The interpretations in this table apply only to characters whose ++syntax type is constituent. Entries marked with an asterisk (*) are ++normally shadowed_2 because the indicated characters are of syntax type ++whitespace_2, macro character, single escape, or multiple escape; these ++constituent traits apply to them only if their syntax types are changed ++to constituent. ++ ++ ++File: gcl.info, Node: Invalid Characters, Next: Macro Characters, Prev: Constituent Traits, Up: Character Syntax Types ++ ++2.1.4.3 Invalid Characters ++.......................... ++ ++Characters with the constituent trait invalid cannot ever appear in a ++token except under the control of a single escape character. If an ++invalid character is encountered while an object is being read, an error ++of type reader-error is signaled. If an invalid character is preceded ++by a single escape character, it is treated as an alphabetic_2 ++constituent instead. ++ ++ ++File: gcl.info, Node: Macro Characters, Next: Multiple Escape Characters, Prev: Invalid Characters, Up: Character Syntax Types ++ ++2.1.4.4 Macro Characters ++........................ ++ ++When the Lisp reader encounters a macro character on an input stream, ++special parsing of subsequent characters on the input stream is ++performed. ++ ++ A macro character has an associated function called a reader macro ++function that implements its specialized parsing behavior. An ++association of this kind can be established or modified under control of ++a conforming program by using the functions set-macro-character and ++set-dispatch-macro-character. ++ ++ Upon encountering a macro character, the Lisp reader calls its reader ++macro function, which parses one specially formatted object from the ++input stream. The function either returns the parsed object, or else it ++returns no values to indicate that the characters scanned by the ++function are being ignored (e.g., in the case of a comment). Examples ++of macro characters are backquote, single-quote, left-parenthesis, and ++right-parenthesis. ++ ++ A macro character is either terminating or non-terminating. The ++difference between terminating and non-terminating macro characters lies ++in what happens when such characters occur in the middle of a token. If ++a non-terminating macro character occurs in the middle of a token, the ++function associated with the non-terminating macro character is not ++called, and the non-terminating macro character does not terminate the ++token's name; it becomes part of the name as if the macro character were ++really a constituent character. A terminating macro character ++terminates any token, and its associated reader macro function is called ++no matter where the character appears. The only non-terminating macro ++character in standard syntax is sharpsign. ++ ++ If a character is a dispatching macro character C_1, its reader macro ++function is a function supplied by the implementation. This function ++reads decimal digit characters until a non-digit C_2 is read. If any ++digits were read, they are converted into a corresponding integer infix ++parameter P; otherwise, the infix parameter P is nil. The terminating ++non-digit C_2 is a character (sometimes called a "sub-character" to ++emphasize its subordinate role in the dispatching) that is looked up in ++the dispatch table associated with the dispatching macro character C_1. ++The reader macro function associated with the sub-character C_2 is ++invoked with three arguments: the stream, the sub-character C_2, and the ++infix parameter P. For more information about dispatch characters, see ++the function set-dispatch-macro-character. ++ ++ For information about the macro characters that are available in ++standard syntax, see *note Standard Macro Characters::. ++ ++ ++File: gcl.info, Node: Multiple Escape Characters, Next: Examples of Multiple Escape Characters, Prev: Macro Characters, Up: Character Syntax Types ++ ++2.1.4.5 Multiple Escape Characters ++.................................. ++ ++A pair of multiple escape characters is used to indicate that an ++enclosed sequence of characters, including possible macro characters and ++whitespace_2 characters, are to be treated as alphabetic_2 characters ++with case preserved. Any single escape and multiple escape characters ++that are to appear in the sequence must be preceded by a single escape ++character. ++ ++ Vertical-bar is a multiple escape character in standard syntax. ++ ++ ++File: gcl.info, Node: Examples of Multiple Escape Characters, Next: Single Escape Character, Prev: Multiple Escape Characters, Up: Character Syntax Types ++ ++2.1.4.6 Examples of Multiple Escape Characters ++.............................................. ++ ++ ;; The following examples assume the readtable case of *readtable* ++ ;; and *print-case* are both :upcase. ++ (eq 'abc 'ABC) => true ++ (eq 'abc '|ABC|) => true ++ (eq 'abc 'a|B|c) => true ++ (eq 'abc '|abc|) => false ++ ++ ++File: gcl.info, Node: Single Escape Character, Next: Examples of Single Escape Characters, Prev: Examples of Multiple Escape Characters, Up: Character Syntax Types ++ ++2.1.4.7 Single Escape Character ++............................... ++ ++A single escape is used to indicate that the next character is to be ++treated as an alphabetic_2 character with its case preserved, no matter ++what the character is or which constituent traits it has. ++ ++ Slash is a single escape character in standard syntax. ++ ++ ++File: gcl.info, Node: Examples of Single Escape Characters, Next: Whitespace Characters, Prev: Single Escape Character, Up: Character Syntax Types ++ ++2.1.4.8 Examples of Single Escape Characters ++............................................ ++ ++ ;; The following examples assume the readtable case of *readtable* ++ ;; and *print-case* are both :upcase. ++ (eq 'abc '\A\B\C) => true ++ (eq 'abc 'a\Bc) => true ++ (eq 'abc '\ABC) => true ++ (eq 'abc '\abc) => false ++ ++ ++File: gcl.info, Node: Whitespace Characters, Next: Examples of Whitespace Characters, Prev: Examples of Single Escape Characters, Up: Character Syntax Types ++ ++2.1.4.9 Whitespace Characters ++............................. ++ ++Whitespace_2 characters are used to separate tokens. ++ ++ Space and newline are whitespace_2 characters in standard syntax. ++ ++ ++File: gcl.info, Node: Examples of Whitespace Characters, Prev: Whitespace Characters, Up: Character Syntax Types ++ ++2.1.4.10 Examples of Whitespace Characters ++.......................................... ++ ++ (length '(this-that)) => 1 ++ (length '(this - that)) => 3 ++ (length '(a ++ b)) => 2 ++ (+ 34) => 34 ++ (+ 3 4) => 7 ++ ++ ++File: gcl.info, Node: Reader Algorithm, Next: Interpretation of Tokens, Prev: Character Syntax, Up: Syntax ++ ++2.2 Reader Algorithm ++==================== ++ ++This section describes the algorithm used by the Lisp reader to parse ++objects from an input character stream, including how the Lisp reader ++processes macro characters. ++ ++ When dealing with tokens, the reader's basic function is to ++distinguish representations of symbols from those of numbers. When a ++token is accumulated, it is assumed to represent a number if it ++satisfies the syntax for numbers listed in Figure~2-9. If it does not ++represent a number, it is then assumed to be a potential number if it ++satisfies the rules governing the syntax for a potential number. If a ++valid token is neither a representation of a number nor a potential ++number, it represents a symbol. ++ ++ The algorithm performed by the Lisp reader is as follows: ++ ++1. ++ If at end of file, end-of-file processing is performed as specified ++ in read. Otherwise, one character, x, is read from the input ++ stream, and dispatched according to the syntax type of x to one of ++ steps 2 to 7. ++ ++2. ++ If x is an invalid character, an error of type reader-error is ++ signaled. ++ ++3. ++ If x is a whitespace_2 character, then it is discarded and step 1 ++ is re-entered. ++ ++4. ++ If x is a terminating or non-terminating macro character then its ++ associated reader macro function is called with two arguments, the ++ input stream and x. ++ ++ The reader macro function may read characters from the input ++ stream; if it does, it will see those characters following the ++ macro character. The Lisp reader may be invoked recursively from ++ the reader macro function. ++ ++ The reader macro function must not have any side effects other than ++ on the input stream; because of backtracking and restarting of the ++ read operation, front ends to the Lisp reader (e.g., "editors" and ++ "rubout handlers") may cause the reader macro function to be called ++ repeatedly during the reading of a single expression in which x ++ only appears once. ++ ++ The reader macro function may return zero values or one value. If ++ one value is returned, then that value is returned as the result of ++ the read operation; the algorithm is done. If zero values are ++ returned, then step 1 is re-entered. ++ ++5. ++ If x is a single escape character then the next character, y, is ++ read, or an error of type end-of-file is signaled if at the end of ++ file. y is treated as if it is a constituent whose only ++ constituent trait is alphabetic_2. y is used to begin a token, and ++ step 8 is entered. ++ ++6. ++ If x is a multiple escape character then a token (initially ++ containing no characters) is begun and step 9 is entered. ++ ++7. ++ If x is a constituent character, then it begins a token. After the ++ token is read in, it will be interpreted either as a Lisp object or ++ as being of invalid syntax. If the token represents an object, ++ that object is returned as the result of the read operation. If ++ the token is of invalid syntax, an error is signaled. If x is a ++ character with case, it might be replaced with the corresponding ++ character of the opposite case, depending on the readtable case of ++ the current readtable, as outlined in *note Effect of Readtable ++ Case on the Lisp Reader::. X is used to begin a token, and step 8 ++ is entered. ++ ++8. ++ At this point a token is being accumulated, and an even number of ++ multiple escape characters have been encountered. If at end of ++ file, step 10 is entered. Otherwise, a character, y, is read, and ++ one of the following actions is performed according to its syntax ++ type: ++ ++ * ++ If y is a constituent or non-terminating macro character: ++ ++ - ++ If y is a character with case, it might be replaced with ++ the corresponding character of the opposite case, ++ depending on the readtable case of the current readtable, ++ as outlined in *note Effect of Readtable Case on the Lisp ++ Reader::. ++ - ++ Y is appended to the token being built. ++ - ++ Step 8 is repeated. ++ ++ * ++ If y is a single escape character, then the next character, z, ++ is read, or an error of type end-of-file is signaled if at end ++ of file. Z is treated as if it is a constituent whose only ++ constituent trait is alphabetic_2. Z is appended to the token ++ being built, and step 8 is repeated. ++ ++ * ++ If y is a multiple escape character, then step 9 is entered. ++ ++ * ++ If y is an invalid character, an error of type reader-error is ++ signaled. ++ ++ * ++ If y is a terminating macro character, then it terminates the ++ token. First the character y is unread (see unread-char), and ++ then step 10 is entered. ++ ++ * ++ If y is a whitespace_2 character, then it terminates the ++ token. First the character y is unread if appropriate (see ++ read-preserving-whitespace), and then step 10 is entered. ++ ++9. ++ At this point a token is being accumulated, and an odd number of ++ multiple escape characters have been encountered. If at end of ++ file, an error of type end-of-file is signaled. Otherwise, a ++ character, y, is read, and one of the following actions is ++ performed according to its syntax type: ++ ++ * ++ If y is a constituent, macro, or whitespace_2 character, y is ++ treated as a constituent whose only constituent trait is ++ alphabetic_2. Y is appended to the token being built, and ++ step 9 is repeated. ++ ++ * ++ If y is a single escape character, then the next character, z, ++ is read, or an error of type end-of-file is signaled if at end ++ of file. Z is treated as a constituent whose only constituent ++ trait is alphabetic_2. Z is appended to the token being ++ built, and step 9 is repeated. ++ ++ * ++ If y is a multiple escape character, then step 8 is entered. ++ ++ * ++ If y is an invalid character, an error of type reader-error is ++ signaled. ++ ++10. ++ An entire token has been accumulated. The object represented by ++ the token is returned as the result of the read operation, or an ++ error of type reader-error is signaled if the token is not of valid ++ syntax. ++ ++ ++File: gcl.info, Node: Interpretation of Tokens, Next: Standard Macro Characters, Prev: Reader Algorithm, Up: Syntax ++ ++2.3 Interpretation of Tokens ++============================ ++ ++* Menu: ++ ++* Numbers as Tokens:: ++* Constructing Numbers from Tokens:: ++* The Consing Dot:: ++* Symbols as Tokens:: ++* Valid Patterns for Tokens:: ++* Package System Consistency Rules:: ++ ++ ++File: gcl.info, Node: Numbers as Tokens, Next: Constructing Numbers from Tokens, Prev: Interpretation of Tokens, Up: Interpretation of Tokens ++ ++2.3.1 Numbers as Tokens ++----------------------- ++ ++When a token is read, it is interpreted as a number or symbol. The ++token is interpreted as a number if it satisfies the syntax for numbers ++specified in Figure 2-9. ++ ++ numeric-token ::= !integer | !ratio | !float ++ integer ::= [sign] {decimal-digit}^+ decimal-point | [sign] {digit}^+ ++ ratio ::= [sign] {digit}^+ slash {digit}^+ ++ float ::= [sign] {decimal-digit}* decimal-point {decimal-digit}^+ [!exponent] ++ | [sign] {decimal-digit}^+ [decimal-point {decimal-digit}*] !exponent ++ exponent ::= exponent-marker [sign] {digit}^+ ++ sign--a sign. ++ slash--a slash ++ decimal-point--a dot. ++ exponent-marker--an exponent marker. ++ decimal-digit--a digit in radix 10. ++ digit--a digit in the current input radix. ++ ++ Figure 2-9: Syntax for Numeric Tokens ++ ++* Menu: ++ ++* Potential Numbers as Tokens:: ++* Escape Characters and Potential Numbers:: ++* Examples of Potential Numbers:: ++ ++ ++File: gcl.info, Node: Potential Numbers as Tokens, Next: Escape Characters and Potential Numbers, Prev: Numbers as Tokens, Up: Numbers as Tokens ++ ++2.3.1.1 Potential Numbers as Tokens ++................................... ++ ++To allow implementors and future Common Lisp standards to extend the ++syntax of numbers, a syntax for potential numbers is defined that is ++more general than the syntax for numbers. A token is a potential number ++if it satisfies all of the following requirements: ++ ++1. ++ The token consists entirely of digits, signs, ratio markers, ++ decimal points (.), extension characters (^ or _), and number ++ markers. A number marker is a letter. Whether a letter may be ++ treated as a number marker depends on context, but no letter that ++ is adjacent to another letter may ever be treated as a number ++ marker. Exponent markers are number markers. ++ ++2. ++ The token contains at least one digit. Letters may be considered ++ to be digits, depending on the current input base, but only in ++ tokens containing no decimal points. ++ ++3. ++ The token begins with a digit, sign, decimal point, or extension ++ character, ++ ++ [Reviewer Note by Barmar: This section is unnecessary because the ++ first bullet already omits discussion of a colon (package marker).] ++ but not a package marker. The syntax involving a leading package ++ marker followed by a potential number is not well-defined. The ++ consequences of the use of notation such as :1, :1/2, and :2^3 in a ++ position where an expression appropriate for read is expected are ++ unspecified. ++ ++4. ++ The token does not end with a sign. ++ ++ If a potential number has number syntax, a number of the appropriate ++type is constructed and returned, if the number is representable in an ++implementation. A number will not be representable in an implementation ++if it is outside the boundaries set by the implementation-dependent ++constants for numbers. For example, specifying too large or too small ++an exponent for a float may make the number impossible to represent in ++the implementation. A ratio with denominator zero (such as -35/000) is ++not represented in any implementation. When a token with the syntax of ++a number cannot be converted to an internal number, an error of type ++reader-error is signaled. An error must not be signaled for specifying ++too many significant digits for a float; a truncated or rounded value ++should be produced. ++ ++ If there is an ambiguity as to whether a letter should be treated as ++a digit or as a number marker, the letter is treated as a digit. ++ ++ ++File: gcl.info, Node: Escape Characters and Potential Numbers, Next: Examples of Potential Numbers, Prev: Potential Numbers as Tokens, Up: Numbers as Tokens ++ ++2.3.1.2 Escape Characters and Potential Numbers ++............................................... ++ ++A potential number cannot contain any escape characters. An escape ++character robs the following character of all syntactic qualities, ++forcing it to be strictly alphabetic_2 and therefore unsuitable for use ++in a potential number. For example, all of the following ++representations are interpreted as symbols, not numbers: ++ ++ \256 25\64 1.0\E6 |100| 3\.14159 |3/4| 3\/4 5|| ++ ++ In each case, removing the escape character (or characters) would ++cause the token to be a potential number. ++ ++ ++File: gcl.info, Node: Examples of Potential Numbers, Prev: Escape Characters and Potential Numbers, Up: Numbers as Tokens ++ ++2.3.1.3 Examples of Potential Numbers ++..................................... ++ ++As examples, the tokens in Figure 2-10 are potential numbers, but they ++are not actually numbers, and so are reserved tokens; a conforming ++implementation is permitted, but not required, to define their meaning. ++ ++ 1b5000 777777q 1.7J -3/4+6.7J 12/25/83 ++ 27^19 3^4/5 6//7 3.1.2.6 ^-43^ ++ 3.141_592_653_589_793_238_4 -3.7+2.6i-6.17j+19.6k ++ ++ Figure 2-10: Examples of reserved tokens ++ ++ ++ The tokens in Figure 2-11 are not potential numbers; they are always ++treated as symbols: ++ ++ / /5 + 1+ 1- ++ foo+ ab.cd _ ^ ^/- ++ ++ Figure 2-11: Examples of symbols ++ ++ ++ The tokens in Figure 2-12 are potential numbers if the current input ++base is 16, but they are always treated as symbols if the current input ++base is 10. ++ ++ bad-face 25-dec-83 a/b fad_cafe f^ ++ ++ Figure 2-12: Examples of symbols or potential numbers ++ ++ ++ ++File: gcl.info, Node: Constructing Numbers from Tokens, Next: The Consing Dot, Prev: Numbers as Tokens, Up: Interpretation of Tokens ++ ++2.3.2 Constructing Numbers from Tokens ++-------------------------------------- ++ ++A real is constructed directly from a corresponding numeric token; see ++Figure~2-9. ++ ++ A complex is notated as a #C (or #c) followed by a list of two reals; ++see *note Sharpsign C::. ++ ++ The reader macros #B, #O, #X, and #R may also be useful in ++controlling the input radix in which rationals are parsed; see *note ++Sharpsign B::, *note Sharpsign O::, *note Sharpsign X::, and *note ++Sharpsign R::. ++ ++ This section summarizes the full syntax for numbers. ++ ++* Menu: ++ ++* Syntax of a Rational:: ++* Syntax of an Integer:: ++* Syntax of a Ratio:: ++* Syntax of a Float:: ++* Syntax of a Complex:: ++ ++ ++File: gcl.info, Node: Syntax of a Rational, Next: Syntax of an Integer, Prev: Constructing Numbers from Tokens, Up: Constructing Numbers from Tokens ++ ++2.3.2.1 Syntax of a Rational ++............................ ++ ++ ++File: gcl.info, Node: Syntax of an Integer, Next: Syntax of a Ratio, Prev: Syntax of a Rational, Up: Constructing Numbers from Tokens ++ ++2.3.2.2 Syntax of an Integer ++............................ ++ ++Integers can be written as a sequence of digits, optionally preceded by ++a sign and optionally followed by a decimal point; see Figure~2-9. When ++a decimal point is used, the digits are taken to be in radix 10; when no ++decimal point is used, the digits are taken to be in radix given by the ++current input base. ++ ++ For information on how integers are printed, see *note Printing ++Integers::. ++ ++ ++File: gcl.info, Node: Syntax of a Ratio, Next: Syntax of a Float, Prev: Syntax of an Integer, Up: Constructing Numbers from Tokens ++ ++2.3.2.3 Syntax of a Ratio ++......................... ++ ++Ratios can be written as an optional sign followed by two non-empty ++sequences of digits separated by a slash; see Figure~2-9. The second ++sequence may not consist entirely of zeros. Examples of ratios are in ++Figure 2-13. ++ ++ 2/3 ;This is in canonical form ++ 4/6 ;A non-canonical form for 2/3 ++ -17/23 ;A ratio preceded by a sign ++ -30517578125/32768 ;This is (-5/2)^15 ++ 10/5 ;The canonical form for this is 2 ++ #o-101/75 ;Octal notation for -65/61 ++ #3r120/21 ;Ternary notation for 15/7 ++ #Xbc/ad ;Hexadecimal notation for 188/173 ++ #xFADED/FACADE ;Hexadecimal notation for 1027565/16435934 ++ ++ Figure 2-13: Examples of Ratios ++ ++ ++ [Reviewer Note by Barmar: #o, #3r, #X, and #x mentioned above are not ++in the syntax rules defined just above that.] ++ ++ For information on how ratios are printed, see *note Printing ++Ratios::. ++ ++ ++File: gcl.info, Node: Syntax of a Float, Next: Syntax of a Complex, Prev: Syntax of a Ratio, Up: Constructing Numbers from Tokens ++ ++2.3.2.4 Syntax of a Float ++......................... ++ ++Floats can be written in either decimal fraction or computerized ++scientific notation: an optional sign, then a non-empty sequence of ++digits with an embedded decimal point, then an optional decimal exponent ++specification. If there is no exponent specifier, then the decimal ++point is required, and there must be digits after it. The exponent ++specifier consists of an exponent marker, an optional sign, and a ++non-empty sequence of digits. If no exponent specifier is present, or ++if the exponent marker e (or E) is used, then the format specified by ++*read-default-float-format* is used. See Figure~2-9. ++ ++ An implementation may provide one or more kinds of float that ++collectively make up the type float. The letters s, f, d, and l (or ++their respective uppercase equivalents) explicitly specify the use of ++the types short-float, single-float, double-float, and long-float, ++respectively. ++ ++ The internal format used for an external representation depends only ++on the exponent marker, and not on the number of decimal digits in the ++external representation. ++ ++ Figure 2-14 contains examples of notations for floats: ++ ++ 0.0 ;Floating-point zero in default format ++ 0E0 ;As input, this is also floating-point zero in default format. ++ ;As output, this would appear as 0.0. ++ 0e0 ;As input, this is also floating-point zero in default format. ++ ;As output, this would appear as 0.0. ++ -.0 ;As input, this might be a zero or a minus zero, ++ ; depending on whether the implementation supports ++ ; a distinct minus zero. ++ ;As output, 0.0 is zero and -0.0 is minus zero. ++ 0. ;On input, the integer zero--not a floating-point number! ++ ;Whether this appears as 0 or 0. on output depends ++ ;on the value of *print-radix*. ++ 0.0s0 ;A floating-point zero in short format ++ 0s0 ;As input, this is a floating-point zero in short format. ++ ;As output, such a zero would appear as 0.0s0 ++ ; (or as 0.0 if short-float was the default format). ++ 6.02E+23 ;Avogadro's number, in default format ++ 602E+21 ;Also Avogadro's number, in default format ++ ++ Figure 2-14: Examples of Floating-point numbers ++ ++ ++ For information on how floats are printed, see *note Printing ++Floats::. ++ ++ ++File: gcl.info, Node: Syntax of a Complex, Prev: Syntax of a Float, Up: Constructing Numbers from Tokens ++ ++2.3.2.5 Syntax of a Complex ++........................... ++ ++A complex has a Cartesian structure, with a real part and an imaginary ++part each of which is a ++ ++ real. ++ ++ The parts of a complex are not necessarily floats but both parts must ++be of the same type: ++ ++ [Editorial Note by KMP: This is not the same as saying they must be ++the same type. Maybe we mean they are of the same 'precision' or ++'format'? GLS had suggestions which are not yet merged.] either both ++are rationals, or both are of the same float subtype. When constructing ++a complex, if the specified parts are not the same type, the parts are ++converted to be the same type internally (i.e., the rational part is ++converted to a float). An object of type (complex rational) is ++converted internally and represented thereafter as a rational if its ++imaginary part is an integer whose value is 0. ++ ++ For further information, see *note Sharpsign C:: and *note Printing ++Complexes::. ++ ++ ++File: gcl.info, Node: The Consing Dot, Next: Symbols as Tokens, Prev: Constructing Numbers from Tokens, Up: Interpretation of Tokens ++ ++2.3.3 The Consing Dot ++--------------------- ++ ++If a token consists solely of dots (with no escape characters), then an ++error of type reader-error is signaled, except in one circumstance: if ++the token is a single dot and appears in a situation where dotted pair ++notation permits a dot, then it is accepted as part of such syntax and ++no error is signaled. See *note Left-Parenthesis::. ++ ++ ++File: gcl.info, Node: Symbols as Tokens, Next: Valid Patterns for Tokens, Prev: The Consing Dot, Up: Interpretation of Tokens ++ ++2.3.4 Symbols as Tokens ++----------------------- ++ ++Any token that is not a potential number, does not contain a package ++marker, and does not consist entirely of dots will always be interpreted ++as a symbol. Any token that is a potential number but does not fit the ++number syntax is a reserved token and has an implementation-dependent ++interpretation. In all other cases, the token is construed to be the ++name of a symbol. ++ ++ Examples of the printed representation of symbols are in Figure 2-15. ++For presentational simplicity, these examples assume that the readtable ++case of the current readtable is :upcase. ++ ++ FROBBOZ The symbol whose name is FROBBOZ. ++ frobboz Another way to notate the same symbol. ++ fRObBoz Yet another way to notate it. ++ unwind-protect A symbol with a hyphen in its name. ++ +$ The symbol named +$. ++ 1+ The symbol named 1+. ++ +1 This is the integer 1, not a symbol. ++ pascal_style This symbol has an underscore in its name. ++ file.rel.43 This symbol has periods in its name. ++ \( The symbol whose name is (. ++ \+1 The symbol whose name is +1. ++ +\1 Also the symbol whose name is +1. ++ \frobboz The symbol whose name is fROBBOZ. ++ 3.14159265\s0 The symbol whose name is 3.14159265s0. ++ 3.14159265\S0 A different symbol, whose name is 3.14159265S0. ++ 3.14159265s0 A possible short float approximation to \pi. ++ ++ Figure 2-15: Examples of the printed representation of symbols (Part 1 of 2) ++ ++ ++ APL\\360 The symbol whose name is APL\360. ++ apl\\360 Also the symbol whose name is APL\360. ++ \(b^2\)\ -\ 4*a*c The name is (B^2) - 4*A*C. ++ Parentheses and two spaces in it. ++ \(\b^2\)\ -\4*\a*\c The name is (b^2) - 4*a*c. ++ Letters explicitly lowercase. ++ |"| The same as writing \". ++ |(b^2) - 4*a*c| The name is (b^2) - 4*a*c. ++ |frobboz| The name is frobboz, not FROBBOZ. ++ |APL\360| The name is APL360. ++ |APL\\360| The name is APL\360. ++ |apl\\360| The name is apl\360. ++ |\|\|| Same as \|\| --the name is ||. ++ |(B^2) - 4*A*C| The name is (B^2) - 4*A*C. ++ Parentheses and two spaces in it. ++ |(b^2) - 4*a*c| The name is (b^2) - 4*a*c. ++ ++ Figure 2-16: Examples of the printed representation of symbols (Part 2 of 2) ++ ++ ++ In the process of parsing a symbol, it is implementation-dependent ++which implementation-defined attributes are removed from the characters ++forming a token that represents a symbol. ++ ++ When parsing the syntax for a symbol, the Lisp reader looks up the ++name of that symbol in the current package. This lookup may involve ++looking in other packages whose external symbols are inherited by the ++current package. If the name is found, the corresponding symbol is ++returned. If the name is not found (that is, there is no symbol of that ++name accessible in the current package), a new symbol is created and is ++placed in the current package as an internal symbol. The current ++package becomes the owner (home package) of the symbol, and the symbol ++becomes interned in the current package. If the name is later read ++again while this same package is current, the same symbol will be found ++and returned. ++ ++ ++File: gcl.info, Node: Valid Patterns for Tokens, Next: Package System Consistency Rules, Prev: Symbols as Tokens, Up: Interpretation of Tokens ++ ++2.3.5 Valid Patterns for Tokens ++------------------------------- ++ ++The valid patterns for tokens are summarized in Figure 2-17. ++ ++ nnnnn a number ++ xxxxx a symbol in the current package ++ :xxxxx a symbol in the the KEYWORD package ++ ppppp:xxxxx an external symbol in the ppppp package ++ ppppp::xxxxx a (possibly internal) symbol in the ppppp package ++ :nnnnn undefined ++ ppppp:nnnnn undefined ++ ppppp::nnnnn undefined ++ ::aaaaa undefined ++ aaaaa: undefined ++ aaaaa:aaaaa:aaaaa undefined ++ ++ Figure 2-17: Valid patterns for tokens ++ ++ ++ Note that nnnnn has number syntax, neither xxxxx nor ppppp has number ++syntax, and aaaaa has any syntax. ++ ++ A summary of rules concerning package markers follows. In each case, ++examples are offered to illustrate the case; for presentational ++simplicity, the examples assume that the readtable case of the current ++readtable is :upcase. ++ ++1. ++ If there is a single package marker, and it occurs at the beginning ++ of the token, then the token is interpreted as a symbol in the ++ KEYWORD package. It also sets the symbol-value of the ++ newly-created symbol to that same symbol so that the symbol will ++ self-evaluate. ++ ++ For example, :bar, when read, interns BAR as an external symbol in ++ the KEYWORD package. ++ ++2. ++ If there is a single package marker not at the beginning or end of ++ the token, then it divides the token into two parts. The first ++ part specifies a package; the second part is the name of an ++ external symbol available in that package. ++ ++ For example, foo:bar, when read, looks up BAR among the external ++ symbols of the package named FOO. ++ ++3. ++ If there are two adjacent package markers not at the beginning or ++ end of the token, then they divide the token into two parts. The ++ first part specifies a package; the second part is the name of a ++ symbol within that package (possibly an internal symbol). ++ ++ For example, foo::bar, when read, interns BAR in the package named ++ FOO. ++ ++4. ++ If the token contains no package markers, and does not have ++ potential number syntax, then the entire token is the name of the ++ symbol. The symbol is looked up in the current package. ++ ++ For example, bar, when read, interns BAR in the current package. ++ ++5. ++ The consequences are unspecified if any other pattern of package ++ markers in a token is used. All other uses of package markers ++ within names of symbols are not defined by this standard but are ++ reserved for implementation-dependent use. ++ ++ For example, assuming the readtable case of the current readtable is ++:upcase, editor:buffer refers to the external symbol named BUFFER ++present in the package named editor, regardless of whether there is a ++symbol named BUFFER in the current package. If there is no package ++named editor, or if no symbol named BUFFER is present in editor, or if ++BUFFER is not exported by editor, the reader signals a correctable ++error. If editor::buffer is seen, the effect is exactly the same as ++reading buffer with the EDITOR package being the current package. ++ ++ ++File: gcl.info, Node: Package System Consistency Rules, Prev: Valid Patterns for Tokens, Up: Interpretation of Tokens ++ ++2.3.6 Package System Consistency Rules ++-------------------------------------- ++ ++The following rules apply to the package system as long as the value of ++*package* is not changed: ++ ++Read-read consistency ++ Reading the same symbol name always results in the same symbol. ++ ++Print-read consistency ++ An interned symbol always prints as a sequence of characters that, ++ when read back in, yields the same symbol. ++ ++ For information about how the Lisp printer treats symbols, see ++ *note Printing Symbols::. ++ ++Print-print consistency ++ If two interned symbols are not the same, then their printed ++ representations will be different sequences of characters. ++ ++ These rules are true regardless of any implicit interning. As long ++as the current package is not changed, results are reproducible ++regardless of the order of loading files or the exact history of what ++symbols were typed in when. If the value of *package* is changed and ++then changed back to the previous value, consistency is maintained. The ++rules can be violated by changing the value of *package*, forcing a ++change to symbols or to packages or to both by continuing from an error, ++or calling one of the following functions: unintern, unexport, shadow, ++shadowing-import, or unuse-package. ++ ++ An inconsistency only applies if one of the restrictions is violated ++between two of the named symbols. shadow, unexport, unintern, and ++shadowing-import can only affect the consistency of symbols with the ++same names (under string=) as the ones supplied as arguments. ++ ++ ++File: gcl.info, Node: Standard Macro Characters, Prev: Interpretation of Tokens, Up: Syntax ++ ++2.4 Standard Macro Characters ++============================= ++ ++If the reader encounters a macro character, then its associated reader ++macro function is invoked and may produce an object to be returned. ++This function may read the characters following the macro character in ++the stream in any syntax and return the object represented by that ++syntax. ++ ++ Any character can be made to be a macro character. The macro ++characters defined initially in a conforming implementation include the ++following: ++ ++* Menu: ++ ++* Left-Parenthesis:: ++* Right-Parenthesis:: ++* Single-Quote:: ++* Semicolon:: ++* Double-Quote:: ++* Backquote:: ++* Comma:: ++* Sharpsign:: ++* Re-Reading Abbreviated Expressions:: ++ ++ ++File: gcl.info, Node: Left-Parenthesis, Next: Right-Parenthesis, Prev: Standard Macro Characters, Up: Standard Macro Characters ++ ++2.4.1 Left-Parenthesis ++---------------------- ++ ++The left-parenthesis initiates reading of a list. read is called ++recursively to read successive objects until a right parenthesis is ++found in the input stream. A list of the objects read is returned. ++Thus ++ ++ (a b c) ++ ++ is read as a list of three objects (the symbols a, b, and c). The ++right parenthesis need not immediately follow the printed representation ++of the last object; whitespace_2 characters and comments may precede it. ++ ++ If no objects precede the right parenthesis, it reads as a list of ++zero objects (the empty list). ++ ++ If a token that is just a dot not immediately preceded by an escape ++character is read after some object then exactly one more object must ++follow the dot, possibly preceded or followed by whitespace_2 or a ++comment, followed by the right parenthesis: ++ ++ (a b c . d) ++ ++ This means that the cdr of the last cons in the list is not nil, but ++rather the object whose representation followed the dot. The above ++example might have been the result of evaluating ++ ++ (cons 'a (cons 'b (cons 'c 'd))) ++ ++ Similarly, ++ ++ (cons 'this-one 'that-one) => (this-one . that-one) ++ ++ It is permissible for the object following the dot to be a list: ++ ++ (a b c d . (e f . (g))) == (a b c d e f g) ++ ++ For information on how the Lisp printer prints lists and conses, see ++*note Printing Lists and Conses::. ++ ++ ++File: gcl.info, Node: Right-Parenthesis, Next: Single-Quote, Prev: Left-Parenthesis, Up: Standard Macro Characters ++ ++2.4.2 Right-Parenthesis ++----------------------- ++ ++The right-parenthesis is invalid except when used in conjunction with ++the left parenthesis character. For more information, see *note Reader ++Algorithm::. ++ ++ ++File: gcl.info, Node: Single-Quote, Next: Semicolon, Prev: Right-Parenthesis, Up: Standard Macro Characters ++ ++2.4.3 Single-Quote ++------------------ ++ ++Syntax: '<> ++ ++ A single-quote introduces an expression to be "quoted." Single-quote ++followed by an expression exp is treated by the Lisp reader as an ++abbreviation for and is parsed identically to the expression (quote ++exp). See the special operator quote. ++ ++* Menu: ++ ++* Examples of Single-Quote:: ++ ++ ++File: gcl.info, Node: Examples of Single-Quote, Prev: Single-Quote, Up: Single-Quote ++ ++2.4.3.1 Examples of Single-Quote ++................................ ++ ++ 'foo => FOO ++ ''foo => (QUOTE FOO) ++ (car ''foo) => QUOTE ++ ++ ++File: gcl.info, Node: Semicolon, Next: Double-Quote, Prev: Single-Quote, Up: Standard Macro Characters ++ ++2.4.4 Semicolon ++--------------- ++ ++Syntax: ;<> ++ ++ A semicolon introduces characters that are to be ignored, such as ++comments. The semicolon and all characters up to and including the next ++newline or end of file are ignored. ++ ++* Menu: ++ ++* Examples of Semicolon:: ++* Notes about Style for Semicolon:: ++* Use of Single Semicolon:: ++* Use of Double Semicolon:: ++* Use of Triple Semicolon:: ++* Use of Quadruple Semicolon:: ++* Examples of Style for Semicolon:: ++ ++ ++File: gcl.info, Node: Examples of Semicolon, Next: Notes about Style for Semicolon, Prev: Semicolon, Up: Semicolon ++ ++2.4.4.1 Examples of Semicolon ++............................. ++ ++ (+ 3 ; three ++ 4) ++ => 7 ++ ++ ++File: gcl.info, Node: Notes about Style for Semicolon, Next: Use of Single Semicolon, Prev: Examples of Semicolon, Up: Semicolon ++ ++2.4.4.2 Notes about Style for Semicolon ++....................................... ++ ++Some text editors make assumptions about desired indentation based on ++the number of semicolons that begin a comment. The following style ++conventions are common, although not by any means universal. ++ ++ ++File: gcl.info, Node: Use of Single Semicolon, Next: Use of Double Semicolon, Prev: Notes about Style for Semicolon, Up: Semicolon ++ ++2.4.4.3 Use of Single Semicolon ++............................... ++ ++Comments that begin with a single semicolon are all aligned to the same ++column at the right (sometimes called the "comment column"). The text ++of such a comment generally applies only to the line on which it ++appears. Occasionally two or three contain a single sentence together; ++this is sometimes indicated by indenting all but the first with an ++additional space (after the semicolon). ++ ++ ++File: gcl.info, Node: Use of Double Semicolon, Next: Use of Triple Semicolon, Prev: Use of Single Semicolon, Up: Semicolon ++ ++2.4.4.4 Use of Double Semicolon ++............................... ++ ++Comments that begin with a double semicolon are all aligned to the same ++level of indentation as a form would be at that same position in the ++code. The text of such a comment usually describes the state of the ++program at the point where the comment occurs, the code which follows ++the comment, or both. ++ ++ ++File: gcl.info, Node: Use of Triple Semicolon, Next: Use of Quadruple Semicolon, Prev: Use of Double Semicolon, Up: Semicolon ++ ++2.4.4.5 Use of Triple Semicolon ++............................... ++ ++Comments that begin with a triple semicolon are all aligned to the left ++margin. Usually they are used prior to a definition or set of ++definitions, rather than within a definition. ++ ++ ++File: gcl.info, Node: Use of Quadruple Semicolon, Next: Examples of Style for Semicolon, Prev: Use of Triple Semicolon, Up: Semicolon ++ ++2.4.4.6 Use of Quadruple Semicolon ++.................................. ++ ++Comments that begin with a quadruple semicolon are all aligned to the ++left margin, and generally contain only a short piece of text that serve ++as a title for the code which follows, and might be used in the header ++or footer of a program that prepares code for presentation as a hardcopy ++document. ++ ++ ++File: gcl.info, Node: Examples of Style for Semicolon, Prev: Use of Quadruple Semicolon, Up: Semicolon ++ ++2.4.4.7 Examples of Style for Semicolon ++....................................... ++ ++ ;;;; Math Utilities ++ ++ ;;; FIB computes the the Fibonacci function in the traditional ++ ;;; recursive way. ++ ++ (defun fib (n) ++ (check-type n integer) ++ ;; At this point we're sure we have an integer argument. ++ ;; Now we can get down to some serious computation. ++ (cond ((< n 0) ++ ;; Hey, this is just supposed to be a simple example. ++ ;; Did you really expect me to handle the general case? ++ (error "FIB got ~D as an argument." n)) ++ ((< n 2) n) ;fib[0]=0 and fib[1]=1 ++ ;; The cheap cases didn't work. ++ ;; Nothing more to do but recurse. ++ (t (+ (fib (- n 1)) ;The traditional formula ++ (fib (- n 2)))))) ; is fib[n-1]+fib[n-2]. ++ ++ ++File: gcl.info, Node: Double-Quote, Next: Backquote, Prev: Semicolon, Up: Standard Macro Characters ++ ++2.4.5 Double-Quote ++------------------ ++ ++Syntax: "<>" ++ ++ The double-quote is used to begin and end a string. When a ++double-quote is encountered, characters are read from the input stream ++and accumulated until another double-quote is encountered. If a single ++escape character is seen, the single escape character is discarded, the ++next character is accumulated, and accumulation continues. The ++accumulated characters up to but not including the matching double-quote ++are made into a simple string and returned. ++ ++ It is implementation-dependent which attributes of the accumulated ++characters are removed in this process. ++ ++ Examples of the use of the double-quote character are in Figure 2-18. ++ ++ "Foo" ;A string with three characters in it ++ "" ;An empty string ++ "\"APL\\360?\" he cried." ;A string with twenty characters ++ "|x| = |-x|" ;A ten-character string ++ ++ Figure 2-18: Examples of the use of double-quote ++ ++ ++ Note that to place a single escape character or a double-quote into a ++string, such a character must be preceded by a single escape character. ++Note, too, that a multiple escape character need not be quoted by a ++single escape character within a string. ++ ++ For information on how the Lisp printer prints strings, see *note ++Printing Strings::. ++ ++ ++File: gcl.info, Node: Backquote, Next: Comma, Prev: Double-Quote, Up: Standard Macro Characters ++ ++2.4.6 Backquote ++--------------- ++ ++The backquote introduces a template of a data structure to be built. ++For example, writing ++ ++ `(cond ((numberp ,x) ,@y) (t (print ,x) ,@y)) ++ ++ is roughly equivalent to writing ++ ++ (list 'cond ++ (cons (list 'numberp x) y) ++ (list* 't (list 'print x) y)) ++ ++ Where a comma occurs in the template, the expression following the ++comma is to be evaluated to produce an object to be inserted at that ++point. Assume b has the value 3, for example, then evaluating the form ++denoted by `(a b ,b ,(+ b 1) b) produces the result (a b 3 4 b). ++ ++ If a comma is immediately followed by an at-sign, then the form ++following the at-sign is evaluated to produce a list of objects. These ++objects are then "spliced" into place in the template. For example, if ++x has the value (a b c), then ++ ++ `(x ,x ,@x foo ,(cadr x) bar ,(cdr x) baz ,@(cdr x)) ++ => (x (a b c) a b c foo b bar (b c) baz b c) ++ ++ The backquote syntax can be summarized formally as follows. ++ ++* ++ `basic is the same as 'basic, that is, (quote basic), for any ++ expression basic that is not a list or a general vector. ++ ++* ++ `,form is the same as form, for any form, provided that the ++ representation of form does not begin with at-sign or dot. (A ++ similar caveat holds for all occurrences of a form after a comma.) ++ ++* ++ `,@form has undefined consequences. ++ ++* ++ `(x1 x2 x3 ... xn . atom) may be interpreted to mean ++ ++ (append [ x1 ] [ x2 ] [ x3 ] ... [ xn ] (quote atom)) ++ ++ where the brackets are used to indicate a transformation of an xj ++ as follows: ++ ++ - ++ [form] is interpreted as (list `form), which contains a ++ backquoted form that must then be further interpreted. ++ ++ - ++ [,form] is interpreted as (list form). ++ ++ - ++ [,@form] is interpreted as form. ++ ++* ++ `(x1 x2 x3 ... xn) may be interpreted to mean the same as the ++ backquoted form `(x1 x2 x3 ... xn . nil), thereby reducing it to ++ the previous case. ++ ++* ++ `(x1 x2 x3 ... xn . ,form) may be interpreted to mean ++ ++ (append [ x1 ] [ x2 ] [ x3 ] ... [ xn ] form) ++ ++ where the brackets indicate a transformation of an xj as described ++ above. ++ ++* ++ `(x1 x2 x3 ... xn . ,@form) has undefined consequences. ++ ++* ++ `#(x1 x2 x3 ... xn) may be interpreted to mean (apply #'vector `(x1 ++ x2 x3 ... xn)). ++ ++ Anywhere ",@" may be used, the syntax ",." may be used instead to ++indicate that it is permissible to operate destructively on the list ++structure produced by the form following the ",." (in effect, to use ++nconc instead of append). ++ ++ If the backquote syntax is nested, the innermost backquoted form ++should be expanded first. This means that if several commas occur in a ++row, the leftmost one belongs to the innermost backquote. ++ ++ An implementation is free to interpret a backquoted form F_1 as any ++form F_2 that, when evaluated, will produce a result that is the same ++under equal as the result implied by the above definition, provided that ++the side-effect behavior of the substitute form F_2 is also consistent ++with the description given above. The constructed copy of the template ++might or might not share list structure with the template itself. As an ++example, the above definition implies that ++ ++ `((,a b) ,c ,@d) ++ ++ will be interpreted as if it were ++ ++ (append (list (append (list a) (list 'b) 'nil)) (list c) d 'nil) ++ ++ but it could also be legitimately interpreted to mean any of the ++following: ++ ++ (append (list (append (list a) (list 'b))) (list c) d) ++ (append (list (append (list a) '(b))) (list c) d) ++ (list* (cons a '(b)) c d) ++ (list* (cons a (list 'b)) c d) ++ (append (list (cons a '(b))) (list c) d) ++ (list* (cons a '(b)) c (copy-list d)) ++ ++* Menu: ++ ++* Notes about Backquote:: ++ ++ ++File: gcl.info, Node: Notes about Backquote, Prev: Backquote, Up: Backquote ++ ++2.4.6.1 Notes about Backquote ++............................. ++ ++Since the exact manner in which the Lisp reader will parse an expression ++involving the backquote reader macro is not specified, an implementation ++is free to choose any representation that preserves the semantics ++described. ++ ++ Often an implementation will choose a representation that facilitates ++pretty printing of the expression, so that (pprint `(a ,b)) will display ++`(a ,b) and not, for example, (list 'a b). However, this is not a ++requirement. ++ ++ Implementors who have no particular reason to make one choice or ++another might wish to refer to IEEE Standard for the Scheme Programming ++Language, which identifies a popular choice of representation for such ++expressions that might provide useful to be useful compatibility for ++some user communities. There is no requirement, however, that any ++conforming implementation use this particular representation. This ++information is provided merely for cross-reference purposes. ++ ++ ++File: gcl.info, Node: Comma, Next: Sharpsign, Prev: Backquote, Up: Standard Macro Characters ++ ++2.4.7 Comma ++----------- ++ ++The comma is part of the backquote syntax; see *note Backquote::. Comma ++is invalid if used other than inside the body of a backquote expression ++as described above. ++ ++ ++File: gcl.info, Node: Sharpsign, Next: Re-Reading Abbreviated Expressions, Prev: Comma, Up: Standard Macro Characters ++ ++2.4.8 Sharpsign ++--------------- ++ ++Sharpsign is a non-terminating dispatching macro character. It reads an ++optional sequence of digits and then one more character, and uses that ++character to select a function to run as a reader macro function. ++ ++ The standard syntax includes constructs introduced by the # ++character. The syntax of these constructs is as follows: a character ++that identifies the type of construct is followed by arguments in some ++form. If the character is a letter, its case is not important; #O and ++#o are considered to be equivalent, for example. ++ ++ Certain # constructs allow an unsigned decimal number to appear ++between the # and the character. ++ ++ The reader macros associated with the dispatching macro character # ++are described later in this section and summarized in Figure 2-19. ++ ++ dispatch char purpose dispatch char purpose ++ Backspace signals error { undefined* ++ Tab signals error } undefined* ++ Newline signals error + read-time conditional ++ Linefeed signals error - read-time conditional ++ Page signals error . read-time evaluation ++ Return signals error / undefined ++ Space signals error A, a array ++ ! undefined* B, b binary rational ++ " undefined C, c complex number ++ # reference to = label D, d undefined ++ $ undefined E, e undefined ++ % undefined F, f undefined ++ & undefined G, g undefined ++ ' function abbreviation H, h undefined ++ ( simple vector I, i undefined ++ ) signals error J, j undefined ++ * bit vector K, k undefined ++ , undefined L, l undefined ++ : uninterned symbol M, m undefined ++ ; undefined N, n undefined ++ < signals error O, o octal rational ++ = labels following object P, p pathname ++ > undefined Q, q undefined ++ ? undefined* R, r radix-n rational ++ @ undefined S, s structure ++ [ undefined* T, t undefined ++ \ character object U, u undefined ++ ] undefined* V, v undefined ++ ^ undefined W, w undefined ++ _ undefined X, x hexadecimal rational ++ ' undefined Y, y undefined ++ | balanced comment Z, z undefined ++ ~ undefined Rubout undefined ++ ++ Figure 2-19: Standard # Dispatching Macro Character Syntax ++ ++ ++ The combinations marked by an asterisk (*) are explicitly reserved to ++the user. No conforming implementation defines them. ++ ++ Note also that digits do not appear in the preceding table. This is ++because the notations #0, #1, ..., #9 are reserved for another purpose ++which occupies the same syntactic space. When a digit follows a ++sharpsign, it is not treated as a dispatch character. Instead, an ++unsigned integer argument is accumulated and passed as an argument to ++the reader macro for the character that follows the digits. For ++example, #2A((1 2) (3 4)) is a use of #A with an argument of 2. ++ ++* Menu: ++ ++* Sharpsign Backslash:: ++* Sharpsign Single-Quote:: ++* Sharpsign Left-Parenthesis:: ++* Sharpsign Asterisk:: ++* Examples of Sharpsign Asterisk:: ++* Sharpsign Colon:: ++* Sharpsign Dot:: ++* Sharpsign B:: ++* Sharpsign O:: ++* Sharpsign X:: ++* Sharpsign R:: ++* Sharpsign C:: ++* Sharpsign A:: ++* Sharpsign S:: ++* Sharpsign P:: ++* Sharpsign Equal-Sign:: ++* Sharpsign Sharpsign:: ++* Sharpsign Plus:: ++* Sharpsign Minus:: ++* Sharpsign Vertical-Bar:: ++* Examples of Sharpsign Vertical-Bar:: ++* Notes about Style for Sharpsign Vertical-Bar:: ++* Sharpsign Less-Than-Sign:: ++* Sharpsign Whitespace:: ++* Sharpsign Right-Parenthesis:: ++ ++ ++File: gcl.info, Node: Sharpsign Backslash, Next: Sharpsign Single-Quote, Prev: Sharpsign, Up: Sharpsign ++ ++2.4.8.1 Sharpsign Backslash ++........................... ++ ++Syntax: #\<> ++ ++ When the token x is a single character long, this parses as the ++literal character char. Uppercase and lowercase letters are ++distinguished after #\; #\A and #\a denote different character objects. ++Any single character works after #\, even those that are normally ++special to read, such as left-parenthesis and right-parenthesis. ++ ++ In the single character case, the x must be followed by a ++non-constituent character. After #\ is read, the reader backs up over ++the slash and then reads a token, treating the initial slash as a single ++escape character (whether it really is or not in the current readtable). ++ ++ When the token x is more than one character long, the x must have the ++syntax of a symbol with no embedded package markers. In this case, the ++sharpsign backslash notation parses as the character whose name is ++(string-upcase x); see *note Character Names::. ++ ++ For information about how the Lisp printer prints character objects, ++see *note Printing Characters::. ++ ++ ++File: gcl.info, Node: Sharpsign Single-Quote, Next: Sharpsign Left-Parenthesis, Prev: Sharpsign Backslash, Up: Sharpsign ++ ++2.4.8.2 Sharpsign Single-Quote ++.............................. ++ ++Any expression preceded by #' (sharpsign followed by single-quote), as ++in #'expression, is treated by the Lisp reader as an abbreviation for ++and parsed identically to the expression (function expression). See ++function. For example, ++ ++ (apply #'+ l) == (apply (function +) l) ++ ++ ++File: gcl.info, Node: Sharpsign Left-Parenthesis, Next: Sharpsign Asterisk, Prev: Sharpsign Single-Quote, Up: Sharpsign ++ ++2.4.8.3 Sharpsign Left-Parenthesis ++.................................. ++ ++#( and ) are used to notate a simple vector. ++ ++ If an unsigned decimal integer appears between the # and (, it ++specifies explicitly the length of the vector. The consequences are ++undefined if the number of objects specified before the closing ) ++exceeds the unsigned decimal integer. If the number of objects supplied ++before the closing ) is less than the unsigned decimal integer but ++greater than zero, the last object is used to fill all remaining ++elements of the vector. ++ ++ [Editorial Note by Barmar: This should say "signals...".] The ++consequences are undefined if the unsigned decimal integer is non-zero ++and number of objects supplied before the closing ) is zero. For ++example, ++ ++ #(a b c c c c) ++ #6(a b c c c c) ++ #6(a b c) ++ #6(a b c c) ++ ++ all mean the same thing: a vector of length 6 with elements a, b, and ++four occurrences of c. Other examples follow: ++ ++ #(a b c) ;A vector of length 3 ++ #(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47) ++ ;A vector containing the primes below 50 ++ #() ;An empty vector ++ ++ The notation #() denotes an empty vector, as does #0(). ++ ++ For information on how the Lisp printer prints vectors, see *note ++Printing Strings::, *note Printing Bit Vectors::, or *note Printing ++Other Vectors::. ++ ++ ++File: gcl.info, Node: Sharpsign Asterisk, Next: Examples of Sharpsign Asterisk, Prev: Sharpsign Left-Parenthesis, Up: Sharpsign ++ ++2.4.8.4 Sharpsign Asterisk ++.......................... ++ ++Syntax: #*<> ++ ++ A simple bit vector is constructed containing the indicated bits (0's ++and 1's), where the leftmost bit has index zero and the subsequent bits ++have increasing indices. ++ ++ Syntax: #<>*<> ++ ++ With an argument n, the vector to be created is of length n. If the ++number of bits is less than n but greater than zero, the last bit is ++used to fill all remaining bits of the bit vector. ++ ++ The notations #* and #0* each denote an empty bit vector. ++ ++ Regardless of whether the optional numeric argument n is provided, ++the token that follows the asterisk is delimited by a normal token ++delimiter. However, (unless the value of *read-suppress* is true) an ++error of type reader-error is signaled if that token is not composed ++entirely of 0's and 1's, or if n was supplied and the token is composed ++of more than n bits, or if n is greater than one, but no bits were ++specified. Neither a single escape nor a multiple escape is permitted ++in this token. ++ ++ For information on how the Lisp printer prints bit vectors, see *note ++Printing Bit Vectors::. ++ ++ ++File: gcl.info, Node: Examples of Sharpsign Asterisk, Next: Sharpsign Colon, Prev: Sharpsign Asterisk, Up: Sharpsign ++ ++2.4.8.5 Examples of Sharpsign Asterisk ++...................................... ++ ++For example, ++ #*101111 ++ #6*101111 ++ #6*101 ++ #6*1011 ++ ++ all mean the same thing: a vector of length 6 with elements 1, 0, 1, ++1, 1, and 1. ++ ++ For example: ++ ++ #* ;An empty bit-vector ++ ++ ++File: gcl.info, Node: Sharpsign Colon, Next: Sharpsign Dot, Prev: Examples of Sharpsign Asterisk, Up: Sharpsign ++ ++2.4.8.6 Sharpsign Colon ++....................... ++ ++Syntax: #:<> ++ ++ #: introduces an uninterned symbol whose name is symbol-name. Every ++time this syntax is encountered, a distinct uninterned symbol is ++created. The symbol-name must have the syntax of a symbol with no ++package prefix. ++ ++ For information on how the Lisp reader prints uninterned symbols, see ++*note Printing Symbols::. ++ ++ ++File: gcl.info, Node: Sharpsign Dot, Next: Sharpsign B, Prev: Sharpsign Colon, Up: Sharpsign ++ ++2.4.8.7 Sharpsign Dot ++..................... ++ ++#.foo is read as the object resulting from the evaluation of the object ++represented by foo. The evaluation is done during the read process, ++when the #. notation is encountered. The #. syntax therefore performs a ++read-time evaluation of foo. ++ ++ The normal effect of #. is inhibited when the value of *read-eval* is ++false. ++ ++ In that situation, an error of type reader-error is signaled. ++ ++ For an object that does not have a convenient printed representation, ++a form that computes the object can be given using the #. notation. ++ ++ ++File: gcl.info, Node: Sharpsign B, Next: Sharpsign O, Prev: Sharpsign Dot, Up: Sharpsign ++ ++2.4.8.8 Sharpsign B ++................... ++ ++#Brational reads rational in binary (radix 2). For example, ++ ++ #B1101 == 13 ;1101_2 ++ #b101/11 == 5/3 ++ ++ The consequences are undefined if the token immediately following the ++#B does not have the syntax of a binary (i.e., radix 2) rational. ++ ++ ++File: gcl.info, Node: Sharpsign O, Next: Sharpsign X, Prev: Sharpsign B, Up: Sharpsign ++ ++2.4.8.9 Sharpsign O ++................... ++ ++#Orational reads rational in octal (radix 8). For example, ++ ++ #o37/15 == 31/13 ++ #o777 == 511 ++ #o105 == 69 ;105_8 ++ ++ The consequences are undefined if the token immediately following the ++#O does not have the syntax of an octal (i.e., radix 8) rational. ++ ++ ++File: gcl.info, Node: Sharpsign X, Next: Sharpsign R, Prev: Sharpsign O, Up: Sharpsign ++ ++2.4.8.10 Sharpsign X ++.................... ++ ++#Xrational reads rational in hexadecimal (radix 16). The digits above 9 ++are the letters A through F (the lowercase letters a through f are also ++acceptable). For example, ++ ++ #xF00 == 3840 ++ #x105 == 261 ;105_16 ++ ++ The consequences are undefined if the token immediately following the ++#X does not have the syntax of a hexadecimal (i.e., radix 16) rational. ++ ++ ++File: gcl.info, Node: Sharpsign R, Next: Sharpsign C, Prev: Sharpsign X, Up: Sharpsign ++ ++2.4.8.11 Sharpsign R ++.................... ++ ++#nR ++ ++ #radixRrational reads rational in radix radix. radix must consist of ++only digits that are interpreted as an integer in decimal radix; its ++value must be between 2 and 36 (inclusive). Only valid digits for the ++specified radix may be used. ++ ++ For example, #3r102 is another way of writing 11 (decimal), and ++#11R32 is another way of writing 35 (decimal). For radices larger than ++10, letters of the alphabet are used in order for the digits after 9. ++No alternate # notation exists for the decimal radix since a decimal ++point suffices. ++ ++ Figure 2-20 contains examples of the use of #B, #O, #X, and #R. ++ ++ #2r11010101 ;Another way of writing 213 decimal ++ #b11010101 ;Ditto ++ #b+11010101 ;Ditto ++ #o325 ;Ditto, in octal radix ++ #xD5 ;Ditto, in hexadecimal radix ++ #16r+D5 ;Ditto ++ #o-300 ;Decimal -192, written in base 8 ++ #3r-21010 ;Same thing in base 3 ++ #25R-7H ;Same thing in base 25 ++ #xACCEDED ;181202413, in hexadecimal radix ++ ++ Figure 2-20: Radix Indicator Example ++ ++ ++ The consequences are undefined if the token immediately following the ++#nR does not have the syntax of a rational in radix n. ++ ++ ++File: gcl.info, Node: Sharpsign C, Next: Sharpsign A, Prev: Sharpsign R, Up: Sharpsign ++ ++2.4.8.12 Sharpsign C ++.................... ++ ++#C reads a following object, which must be a list of length two whose ++elements are both reals. These reals denote, respectively, the real and ++imaginary parts of a complex number. ++ ++ If the two parts as notated are not of the same data type, then they ++are converted according to the rules of floating-point contagion ++described in *note Contagion in Numeric Operations::. ++ ++ #C(real imag) is equivalent to #.(complex (quote real) (quote imag)), ++except that #C is not affected by *read-eval*. See the function ++complex. ++ ++ Figure 2-21 contains examples of the use of #C. ++ ++ #C(3.0s1 2.0s-1) ;A complex with small float parts. ++ #C(5 -3) ;A "Gaussian integer" ++ #C(5/3 7.0) ;Will be converted internally to #C(1.66666 7.0) ++ #C(0 1) ;The imaginary unit; that is, i. ++ ++ Figure 2-21: Complex Number Example ++ ++ ++ For further information, see *note Printing Complexes:: and *note ++Syntax of a Complex::. ++ ++ ++File: gcl.info, Node: Sharpsign A, Next: Sharpsign S, Prev: Sharpsign C, Up: Sharpsign ++ ++2.4.8.13 Sharpsign A ++.................... ++ ++#nA ++ ++ #nAobject constructs an n-dimensional array, using object as the ++value of the :initial-contents argument to make-array. ++ ++ For example, #2A((0 1 5) (foo 2 (hot dog))) represents a 2-by-3 ++matrix: ++ ++ 0 1 5 ++ foo 2 (hot dog) ++ ++ In contrast, #1A((0 1 5) (foo 2 (hot dog))) represents a vector of ++length 2 whose elements are lists: ++ ++ (0 1 5) (foo 2 (hot dog)) ++ ++ #0A((0 1 5) (foo 2 (hot dog))) represents a zero-dimensional array ++whose sole element is a list: ++ ++ ((0 1 5) (foo 2 (hot dog))) ++ ++ #0A foo represents a zero-dimensional array whose sole element is the ++symbol foo. The notation #1A foo is not valid because foo is not a ++sequence. ++ ++ If some dimension of the array whose representation is being parsed ++is found to be 0, all dimensions to the right (i.e., the higher numbered ++dimensions) are also considered to be 0. ++ ++ For information on how the Lisp printer prints arrays, see *note ++Printing Strings::, *note Printing Bit Vectors::, *note Printing Other ++Vectors::, or *note Printing Other Arrays::. ++ ++ ++File: gcl.info, Node: Sharpsign S, Next: Sharpsign P, Prev: Sharpsign A, Up: Sharpsign ++ ++2.4.8.14 Sharpsign S ++.................... ++ ++#s(name slot1 value1 slot2 value2 ...) denotes a structure. This is ++valid only if name is the name of a structure type already defined by ++defstruct and if the structure type has a standard constructor function. ++Let cm stand for the name of this constructor function; then this syntax ++is equivalent to ++ ++ #.(cm keyword1 'value1 keyword2 'value2 ...) ++ ++ where each keywordj is the result of computing ++ ++ (intern (string slotj) (find-package 'keyword)) ++ ++ The net effect is that the constructor function is called with the ++specified slots having the specified values. ++ ++ (This coercion feature is deprecated; in the future, keyword names ++will be taken in the package they are read in, so symbols that are ++actually in the KEYWORD package should be used if that is what is ++desired.) ++ ++ Whatever object the constructor function returns is returned by the ++#S syntax. ++ ++ For information on how the Lisp printer prints structures, see *note ++Printing Structures::. ++ ++ ++File: gcl.info, Node: Sharpsign P, Next: Sharpsign Equal-Sign, Prev: Sharpsign S, Up: Sharpsign ++ ++2.4.8.15 Sharpsign P ++.................... ++ ++#P reads a following object, which must be a string. ++ ++ #P<> is equivalent to #.(parse-namestring ++'<>), except that #P is not affected by *read-eval*. ++ ++ For information on how the Lisp printer prints pathnames, see *note ++Printing Pathnames::. ++ ++ ++File: gcl.info, Node: Sharpsign Equal-Sign, Next: Sharpsign Sharpsign, Prev: Sharpsign P, Up: Sharpsign ++ ++2.4.8.16 Sharpsign Equal-Sign ++............................. ++ ++#n= ++ ++ #n=object reads as whatever object has object as its printed ++representation. However, that object is labeled by n, a required ++unsigned decimal integer, for possible reference by the syntax #n#. The ++scope of the label is the expression being read by the outermost call to ++read; within this expression, the same label may not appear twice. ++ ++ ++File: gcl.info, Node: Sharpsign Sharpsign, Next: Sharpsign Plus, Prev: Sharpsign Equal-Sign, Up: Sharpsign ++ ++2.4.8.17 Sharpsign Sharpsign ++............................ ++ ++#n# ++ ++ #n#, where n is a required unsigned decimal integer, provides a ++reference to some object labeled by #n=; that is, #n# represents a ++pointer to the same (eq) object labeled by #n=. For example, a ++structure created in the variable y by this code: ++ ++ (setq x (list 'p 'q)) ++ (setq y (list (list 'a 'b) x 'foo x)) ++ (rplacd (last y) (cdr y)) ++ ++ could be represented in this way: ++ ++ ((a b) . #1=(#2=(p q) foo #2# . #1#)) ++ ++ Without this notation, but with *print-length* set to 10 and ++*print-circle* set to nil, the structure would print in this way: ++ ++ ((a b) (p q) foo (p q) (p q) foo (p q) (p q) foo (p q) ...) ++ ++ A reference #n# may only occur after a label #n=; forward references ++are not permitted. The reference may not appear as the labeled object ++itself (that is, #n=#n#) may not be written because the object labeled ++by #n= is not well defined in this case. ++ ++ ++File: gcl.info, Node: Sharpsign Plus, Next: Sharpsign Minus, Prev: Sharpsign Sharpsign, Up: Sharpsign ++ ++2.4.8.18 Sharpsign Plus ++....................... ++ ++#+ provides a read-time conditionalization facility; the syntax is ++#+test expression. If the feature expression test succeeds, then this ++textual notation represents an object whose printed representation is ++expression. If the feature expression test fails, then this textual ++notation is treated as whitespace_2; that is, it is as if the "#+ test ++expression" did not appear and only a space appeared in its place. ++ ++ For a detailed description of success and failure in feature ++expressions, see *note Feature Expressions::. ++ ++ #+ operates by first reading the feature expression and then skipping ++over the form if the feature expression fails. ++ ++ While reading the test, the current package is the KEYWORD package. ++ ++ Skipping over the form is accomplished by binding *read-suppress* to ++true and then calling read. ++ ++ For examples, see *note Examples of Feature Expressions::. ++ ++ ++File: gcl.info, Node: Sharpsign Minus, Next: Sharpsign Vertical-Bar, Prev: Sharpsign Plus, Up: Sharpsign ++ ++2.4.8.19 Sharpsign Minus ++........................ ++ ++#- is like #+ except that it skips the expression if the test succeeds; ++that is, ++ ++ #-test expression == #+(not test) expression ++ ++ For examples, see *note Examples of Feature Expressions::. ++ ++ ++File: gcl.info, Node: Sharpsign Vertical-Bar, Next: Examples of Sharpsign Vertical-Bar, Prev: Sharpsign Minus, Up: Sharpsign ++ ++2.4.8.20 Sharpsign Vertical-Bar ++............................... ++ ++#|...|# is treated as a comment by the reader. It must be balanced with ++respect to other occurrences of #| and |#, but otherwise may contain any ++characters whatsoever. ++ ++ ++File: gcl.info, Node: Examples of Sharpsign Vertical-Bar, Next: Notes about Style for Sharpsign Vertical-Bar, Prev: Sharpsign Vertical-Bar, Up: Sharpsign ++ ++2.4.8.21 Examples of Sharpsign Vertical-Bar ++........................................... ++ ++The following are some examples that exploit the #|...|# notation: ++ ++ ;;; In this example, some debugging code is commented out with #|...|# ++ ;;; Note that this kind of comment can occur in the middle of a line ++ ;;; (because a delimiter marks where the end of the comment occurs) ++ ;;; where a semicolon comment can only occur at the end of a line ++ ;;; (because it comments out the rest of the line). ++ (defun add3 (n) #|(format t "~&Adding 3 to ~D." n)|# (+ n 3)) ++ ++ ;;; The examples that follow show issues related to #| ... |# nesting. ++ ++ ;;; In this first example, #| and |# always occur properly paired, ++ ;;; so nesting works naturally. ++ (defun mention-fun-fact-1a () ++ (format t "CL uses ; and #|...|# in comments.")) ++ => MENTION-FUN-FACT-1A ++ (mention-fun-fact-1a) ++ |> CL uses ; and #|...|# in comments. ++ => NIL ++ #| (defun mention-fun-fact-1b () ++ (format t "CL uses ; and #|...|# in comments.")) |# ++ (fboundp 'mention-fun-fact-1b) => NIL ++ ++ ;;; In this example, vertical-bar followed by sharpsign needed to appear ++ ;;; in a string without any matching sharpsign followed by vertical-bar ++ ;;; having preceded this. To compensate, the programmer has included a ++ ;;; slash separating the two characters. In case 2a, the slash is ++ ;;; unnecessary but harmless, but in case 2b, the slash is critical to ++ ;;; allowing the outer #| ... |# pair match. If the slash were not present, ++ ;;; the outer comment would terminate prematurely. ++ (defun mention-fun-fact-2a () ++ (format t "Don't use |\# unmatched or you'll get in trouble!")) ++ => MENTION-FUN-FACT-2A ++ (mention-fun-fact-2a) ++ |> Don't use |# unmatched or you'll get in trouble! ++ => NIL ++ #| (defun mention-fun-fact-2b () ++ (format t "Don't use |\# unmatched or you'll get in trouble!") |# ++ (fboundp 'mention-fun-fact-2b) => NIL ++ ++ ;;; In this example, the programmer attacks the mismatch problem in a ++ ;;; different way. The sharpsign vertical bar in the comment is not needed ++ ;;; for the correct parsing of the program normally (as in case 3a), but ++ ;;; becomes important to avoid premature termination of a comment when such ++ ;;; a program is commented out (as in case 3b). ++ (defun mention-fun-fact-3a () ; #| ++ (format t "Don't use |# unmatched or you'll get in trouble!")) ++ => MENTION-FUN-FACT-3A ++ (mention-fun-fact-3a) ++ |> Don't use |# unmatched or you'll get in trouble! ++ => NIL ++ #| ++ (defun mention-fun-fact-3b () ; #| ++ (format t "Don't use |# unmatched or you'll get in trouble!")) ++ |# ++ (fboundp 'mention-fun-fact-3b) => NIL ++ ++ ++File: gcl.info, Node: Notes about Style for Sharpsign Vertical-Bar, Next: Sharpsign Less-Than-Sign, Prev: Examples of Sharpsign Vertical-Bar, Up: Sharpsign ++ ++2.4.8.22 Notes about Style for Sharpsign Vertical-Bar ++..................................................... ++ ++Some text editors that purport to understand Lisp syntax treat any |...| ++as balanced pairs that cannot nest (as if they were just balanced pairs ++of the multiple escapes used in notating certain symbols). To ++compensate for this deficiency, some programmers use the notation ++#||...#||...||#...||# instead of #|...#|...|#...|#. Note that this ++alternate usage is not a different reader macro; it merely exploits the ++fact that the additional vertical-bars occur within the comment in a way ++that tricks certain text editor into better supporting nested comments. ++As such, one might sometimes see code like: ++ ++ #|| (+ #|| 3 ||# 4 5) ||# ++ ++ Such code is equivalent to: ++ ++ #| (+ #| 3 |# 4 5) |# ++ ++ ++File: gcl.info, Node: Sharpsign Less-Than-Sign, Next: Sharpsign Whitespace, Prev: Notes about Style for Sharpsign Vertical-Bar, Up: Sharpsign ++ ++2.4.8.23 Sharpsign Less-Than-Sign ++................................. ++ ++#< is not valid reader syntax. The Lisp reader will signal an error ++ ++ of type reader-error ++ ++ on encountering #<. This syntax is typically used in the printed ++representation of objects that cannot be read back in. ++ ++ ++File: gcl.info, Node: Sharpsign Whitespace, Next: Sharpsign Right-Parenthesis, Prev: Sharpsign Less-Than-Sign, Up: Sharpsign ++ ++2.4.8.24 Sharpsign Whitespace ++............................. ++ ++# followed immediately by whitespace_1 is not valid reader syntax. The ++Lisp reader will signal an error of type reader-error if it encounters ++the reader macro notation # or #. ++ ++ ++File: gcl.info, Node: Sharpsign Right-Parenthesis, Prev: Sharpsign Whitespace, Up: Sharpsign ++ ++2.4.8.25 Sharpsign Right-Parenthesis ++.................................... ++ ++This is not valid reader syntax. ++ ++ The Lisp reader will signal an error ++ ++ of type reader-error ++ ++ upon encountering #). ++ ++ ++File: gcl.info, Node: Re-Reading Abbreviated Expressions, Prev: Sharpsign, Up: Standard Macro Characters ++ ++2.4.9 Re-Reading Abbreviated Expressions ++---------------------------------------- ++ ++Note that the Lisp reader will generally signal an error of type ++reader-error when reading an expression_2 that has been abbreviated ++because of length or level limits (see *print-level*, *print-length*, ++and *print-lines*) due to restrictions on "..", "...", "#" followed by ++whitespace_1, and "#)". ++ ++ ++File: gcl.info, Node: Evaluation and Compilation, Next: Types and Classes, Prev: Syntax, Up: Top ++ ++3 Evaluation and Compilation ++**************************** ++ ++* Menu: ++ ++* Evaluation:: ++* Compilation:: ++* Declarations:: ++* Lambda Lists:: ++* Error Checking in Function Calls:: ++* Traversal Rules and Side Effects:: ++* Destructive Operations:: ++* Evaluation and Compilation Dictionary:: ++ ++ ++File: gcl.info, Node: Evaluation, Next: Compilation, Prev: Evaluation and Compilation, Up: Evaluation and Compilation ++ ++3.1 Evaluation ++============== ++ ++Execution of code can be accomplished by a variety of means ranging from ++direct interpretation of a form representing a program to invocation of ++compiled code produced by a compiler. ++ ++ Evaluation is the process by which a program is executed in Common ++Lisp. The mechanism of evaluation is manifested both implicitly through ++the effect of the Lisp read-eval-print loop, and explicitly through the ++presence of the functions eval, compile, compile-file, and load. Any of ++these facilities might share the same execution strategy, or each might ++use a different one. ++ ++ The behavior of a conforming program processed by eval and by ++compile-file might differ; see *note Semantic Constraints::. ++ ++ Evaluation can be understood in terms of a model in which an ++interpreter recursively traverses a form performing each step of the ++computation as it goes. This model, which describes the semantics of ++Common Lisp programs, is described in *note The Evaluation Model::. ++ ++* Menu: ++ ++* Introduction to Environments:: ++* The Evaluation Model:: ++* Lambda Expressions:: ++* Closures and Lexical Binding:: ++* Shadowing:: ++* Extent:: ++* Return Values:: ++ ++ ++File: gcl.info, Node: Introduction to Environments, Next: The Evaluation Model, Prev: Evaluation, Up: Evaluation ++ ++3.1.1 Introduction to Environments ++---------------------------------- ++ ++A binding is an association between a name and that which the name ++denotes. Bindings are established in a lexical environment or a dynamic ++environment by particular special operators. ++ ++ An environment is a set of bindings and other information used during ++evaluation (e.g., to associate meanings with names). ++ ++ Bindings in an environment are partitioned into namespaces . A ++single name can simultaneously have more than one associated binding per ++environment, but can have only one associated binding per namespace. ++ ++* Menu: ++ ++* The Global Environment:: ++* Dynamic Environments:: ++* Lexical Environments:: ++* The Null Lexical Environment:: ++* Environment Objects:: ++ ++ ++File: gcl.info, Node: The Global Environment, Next: Dynamic Environments, Prev: Introduction to Environments, Up: Introduction to Environments ++ ++3.1.1.1 The Global Environment ++.............................. ++ ++The global environment is that part of an environment that contains ++bindings with both indefinite scope and indefinite extent. The global ++environment contains, among other things, the following: ++ ++* ++ bindings of dynamic variables and constant variables. ++* ++ bindings of functions, macros, and special operators. ++* ++ ++ bindings of compiler macros. ++ ++* ++ bindings of type and class names ++* ++ information about proclamations. ++ ++ ++File: gcl.info, Node: Dynamic Environments, Next: Lexical Environments, Prev: The Global Environment, Up: Introduction to Environments ++ ++3.1.1.2 Dynamic Environments ++............................ ++ ++A dynamic environment for evaluation is that part of an environment that ++contains bindings whose duration is bounded by points of establishment ++and disestablishment within the execution of the form that established ++the binding. A dynamic environment contains, among other things, the ++following: ++ ++* ++ bindings for dynamic variables. ++* ++ information about active catch tags. ++* ++ information about exit points established by unwind-protect. ++* ++ information about active handlers and restarts. ++ ++ The dynamic environment that is active at any given point in the ++execution of a program is referred to by definite reference as "the ++current dynamic environment," or sometimes as just "the dynamic ++environment." ++ ++ Within a given namespace, a name is said to be bound in a dynamic ++environment if there is a binding associated with its name in the ++dynamic environment or, if not, there is a binding associated with its ++name in the global environment. ++ ++ ++File: gcl.info, Node: Lexical Environments, Next: The Null Lexical Environment, Prev: Dynamic Environments, Up: Introduction to Environments ++ ++3.1.1.3 Lexical Environments ++............................ ++ ++A lexical environment for evaluation at some position in a program is ++that part of the environment that contains information having lexical ++scope within the forms containing that position. A lexical environment ++contains, among other things, the following: ++ ++* ++ bindings of lexical variables and symbol macros. ++* ++ bindings of functions and macros. (Implicit in this is information ++ about those compiler macros that are locally disabled.) ++* ++ bindings of block tags. ++* ++ bindings of go tags. ++* ++ information about declarations. ++ ++ The lexical environment that is active at any given position in a ++program being semantically processed is referred to by definite ++reference as "the current lexical environment," or sometimes as just ++"the lexical environment." ++ ++ Within a given namespace, a name is said to be bound in a lexical ++environment if there is a binding associated with its name in the ++lexical environment or, if not, there is a binding associated with its ++name in the global environment. ++ ++ ++File: gcl.info, Node: The Null Lexical Environment, Next: Environment Objects, Prev: Lexical Environments, Up: Introduction to Environments ++ ++3.1.1.4 The Null Lexical Environment ++.................................... ++ ++The null lexical environment is equivalent to the global environment. ++ ++ Although in general the representation of an environment object is ++implementation-dependent, nil can be used in any situation where an ++environment object is called for in order to denote the null lexical ++environment. ++ ++ ++File: gcl.info, Node: Environment Objects, Prev: The Null Lexical Environment, Up: Introduction to Environments ++ ++3.1.1.5 Environment Objects ++........................... ++ ++Some operators make use of an object, called an environment object , ++that represents the set of lexical bindings needed to perform semantic ++analysis on a form in a given lexical environment. The set of bindings ++in an environment object may be a subset of the bindings that would be ++needed to actually perform an evaluation; for example, values associated ++with variable names and function names in the corresponding lexical ++environment might not be available in an environment object. ++ ++ The type and nature of an environment object is ++implementation-dependent. The values of environment parameters to macro ++functions are examples of environment objects. ++ ++ The object nil when used as an environment object denotes the null ++lexical environment; see *note The Null Lexical Environment::. ++ ++ ++File: gcl.info, Node: The Evaluation Model, Next: Lambda Expressions, Prev: Introduction to Environments, Up: Evaluation ++ ++3.1.2 The Evaluation Model ++-------------------------- ++ ++A Common Lisp system evaluates forms with respect to lexical, dynamic, ++and global environments. The following sections describe the components ++of the Common Lisp evaluation model. ++ ++* Menu: ++ ++* Form Evaluation:: ++* Symbols as Forms:: ++* Lexical Variables:: ++* Dynamic Variables:: ++* Constant Variables:: ++* Symbols Naming Both Lexical and Dynamic Variables:: ++* Conses as Forms:: ++* Special Forms:: ++* Macro Forms:: ++* Function Forms:: ++* Lambda Forms:: ++* Self-Evaluating Objects:: ++* Examples of Self-Evaluating Objects:: ++ ++ ++File: gcl.info, Node: Form Evaluation, Next: Symbols as Forms, Prev: The Evaluation Model, Up: The Evaluation Model ++ ++3.1.2.1 Form Evaluation ++....................... ++ ++Forms fall into three categories: symbols, conses, and self-evaluating ++objects. The following sections explain these categories. ++ ++ ++File: gcl.info, Node: Symbols as Forms, Next: Lexical Variables, Prev: Form Evaluation, Up: The Evaluation Model ++ ++3.1.2.2 Symbols as Forms ++........................ ++ ++If a form is a symbol, then it is either a symbol macro or a variable. ++ ++ The symbol names a symbol macro if there is a binding of the symbol ++as a symbol macro in the current lexical environment ++ ++ (see define-symbol-macro and symbol-macrolet). ++ ++ If the symbol is a symbol macro, its expansion function is obtained. ++The expansion function is a function of two arguments, and is invoked by ++calling the macroexpand hook with the expansion function as its first ++argument, the symbol as its second argument, and an environment object ++(corresponding to the current lexical environment) as its third ++argument. The macroexpand hook, in turn, calls the expansion function ++with the form as its first argument and the environment as its second ++argument. The value of the expansion function, which is passed through ++by the macroexpand hook, is a form. This resulting form is processed in ++place of the original symbol. ++ ++ If a form is a symbol that is not a symbol macro, then it is the name ++of a variable, and the value of that variable is returned. There are ++three kinds of variables: lexical variables, dynamic variables, and ++constant variables. A variable can store one object. The main ++operations on a variable are to read_1 and to write_1 its value. ++ ++ An error of type unbound-variable should be signaled if an unbound ++variable is referenced. ++ ++ Non-constant variables can be assigned by using setq or bound_3 by ++using let. Figure 3-1 lists some defined names that are applicable to ++assigning, binding, and defining variables. ++ ++ boundp let progv ++ defconstant let* psetq ++ defparameter makunbound set ++ defvar multiple-value-bind setq ++ lambda multiple-value-setq symbol-value ++ ++ Figure 3-1: Some Defined Names Applicable to Variables ++ ++ ++ The following is a description of each kind of variable. ++ ++ ++File: gcl.info, Node: Lexical Variables, Next: Dynamic Variables, Prev: Symbols as Forms, Up: The Evaluation Model ++ ++3.1.2.3 Lexical Variables ++......................... ++ ++A lexical variable is a variable that can be referenced only within the ++lexical scope of the form that establishes that variable; lexical ++variables have lexical scope. Each time a form creates a lexical ++binding of a variable, a fresh binding is established. ++ ++ Within the scope of a binding for a lexical variable name, uses of ++that name as a variable are considered to be references to that binding ++except where the variable is shadowed_2 by a form that establishes a ++fresh binding for that variable name, or by a form that locally declares ++the name special. ++ ++ A lexical variable always has a value. There is no operator that ++introduces a binding for a lexical variable without giving it an initial ++value, nor is there any operator that can make a lexical variable be ++unbound. ++ ++ Bindings of lexical variables are found in the lexical environment. ++ ++ ++File: gcl.info, Node: Dynamic Variables, Next: Constant Variables, Prev: Lexical Variables, Up: The Evaluation Model ++ ++3.1.2.4 Dynamic Variables ++......................... ++ ++A variable is a dynamic variable if one of the following conditions ++hold: ++ ++* ++ It is locally declared or globally proclaimed special. ++ ++* ++ It occurs textually within a form that creates a dynamic binding ++ for a variable of the same name, and the binding is not shadowed_2 ++ by a form that creates a lexical binding of the same variable name. ++ ++ A dynamic variable can be referenced at any time in any program; ++there is no textual limitation on references to dynamic variables. At ++any given time, all dynamic variables with a given name refer to exactly ++one binding, either in the dynamic environment or in the global ++environment. ++ ++ The value part of the binding for a dynamic variable might be empty; ++in this case, the dynamic variable is said to have no value, or to be ++unbound. A dynamic variable can be made unbound by using makunbound. ++ ++ The effect of binding a dynamic variable is to create a new binding ++to which all references to that dynamic variable in any program refer ++for the duration of the evaluation of the form that creates the dynamic ++binding. ++ ++ A dynamic variable can be referenced outside the dynamic extent of a ++form that binds it. Such a variable is sometimes called a "global ++variable" but is still in all respects just a dynamic variable whose ++binding happens to exist in the global environment rather than in some ++dynamic environment. ++ ++ A dynamic variable is unbound unless and until explicitly assigned a ++value, except for those variables whose initial value is defined in this ++specification or by an implementation. ++ ++ ++File: gcl.info, Node: Constant Variables, Next: Symbols Naming Both Lexical and Dynamic Variables, Prev: Dynamic Variables, Up: The Evaluation Model ++ ++3.1.2.5 Constant Variables ++.......................... ++ ++Certain variables, called constant variables, are reserved as "named ++constants." The consequences are undefined if an attempt is made to ++assign a value to, or create a binding for a constant variable, except ++that a 'compatible' redefinition of a constant variable using ++defconstant is permitted; see the macro defconstant. ++ ++ Keywords, symbols defined by Common Lisp or the implementation as ++constant (such as nil, t, and pi), and symbols declared as constant ++using defconstant are constant variables. ++ ++ ++File: gcl.info, Node: Symbols Naming Both Lexical and Dynamic Variables, Next: Conses as Forms, Prev: Constant Variables, Up: The Evaluation Model ++ ++3.1.2.6 Symbols Naming Both Lexical and Dynamic Variables ++......................................................... ++ ++The same symbol can name both a lexical variable and a dynamic variable, ++but never in the same lexical environment. ++ ++ In the following example, the symbol x is used, at different times, ++as the name of a lexical variable and as the name of a dynamic variable. ++ ++ (let ((x 1)) ;Binds a special variable X ++ (declare (special x)) ++ (let ((x 2)) ;Binds a lexical variable X ++ (+ x ;Reads a lexical variable X ++ (locally (declare (special x)) ++ x)))) ;Reads a special variable X ++ => 3 ++ ++ ++File: gcl.info, Node: Conses as Forms, Next: Special Forms, Prev: Symbols Naming Both Lexical and Dynamic Variables, Up: The Evaluation Model ++ ++3.1.2.7 Conses as Forms ++....................... ++ ++A cons that is used as a form is called a compound form. ++ ++ If the car of that compound form is a symbol, that symbol is the name ++of an operator, and the form is either a special form, a macro form, or ++a function form, depending on the function binding of the operator in ++the current lexical environment. If the operator is neither a special ++operator nor a macro name, it is assumed to be a function name (even if ++there is no definition for such a function). ++ ++ If the car of the compound form is not a symbol, then that car must ++be a lambda expression, in which case the compound form is a lambda ++form. ++ ++ How a compound form is processed depends on whether it is classified ++as a special form, a macro form, a function form, or a lambda form. ++ ++ ++File: gcl.info, Node: Special Forms, Next: Macro Forms, Prev: Conses as Forms, Up: The Evaluation Model ++ ++3.1.2.8 Special Forms ++..................... ++ ++A special form is a form with special syntax, special evaluation rules, ++or both, possibly manipulating the evaluation environment, control flow, ++or both. A special operator has access to the current lexical ++environment and the current dynamic environment. Each special operator ++defines the manner in which its subexpressions are treated--which are ++forms, which are special syntax, etc. ++ ++ Some special operators create new lexical or dynamic environments for ++use during the evaluation of subforms of the special form. For example, ++block creates a new lexical environment that is the same as the one in ++force at the point of evaluation of the block form with the addition of ++a binding of the block name to an exit point from the block. ++ ++ The set of special operator names is fixed in Common Lisp; no way is ++provided for the user to define a special operator. Figure 3-2 lists ++all of the Common Lisp symbols that have definitions as special ++operators. ++ ++ block let* return-from ++ catch load-time-value setq ++ eval-when locally symbol-macrolet ++ flet macrolet tagbody ++ function multiple-value-call the ++ go multiple-value-prog1 throw ++ if progn unwind-protect ++ labels progv ++ let quote ++ ++ Figure 3-2: Common Lisp Special Operators ++ ++ ++ ++File: gcl.info, Node: Macro Forms, Next: Function Forms, Prev: Special Forms, Up: The Evaluation Model ++ ++3.1.2.9 Macro Forms ++................... ++ ++If the operator names a macro, its associated macro function is applied ++to the entire form and the result of that application is used in place ++of the original form. ++ ++ Specifically, a symbol names a macro in a given lexical environment ++if macro-function is true of the symbol and that environment. The ++function returned by macro-function is a function of two arguments, ++called the expansion function. The expansion function is invoked by ++calling the macroexpand hook with the expansion function as its first ++argument, the entire macro form as its second argument, and an ++environment object (corresponding to the current lexical environment) as ++its third argument. The macroexpand hook, in turn, calls the expansion ++function with the form as its first argument and the environment as its ++second argument. The value of the expansion function, which is passed ++through by the macroexpand hook, is a form. The returned form is ++evaluated in place of the original form. ++ ++ The consequences are undefined if a macro function destructively ++modifies any part of its form argument. ++ ++ A macro name is not a function designator, and cannot be used as the ++function argument to functions such as apply, funcall, or map. ++ ++ An implementation is free to implement a Common Lisp special operator ++as a macro. An implementation is free to implement any macro operator ++as a special operator, but only if an equivalent definition of the macro ++is also provided. ++ ++ Figure 3-3 lists some defined names that are applicable to macros. ++ ++ *macroexpand-hook* macro-function macroexpand-1 ++ defmacro macroexpand macrolet ++ ++ Figure 3-3: Defined names applicable to macros ++ ++ ++ ++File: gcl.info, Node: Function Forms, Next: Lambda Forms, Prev: Macro Forms, Up: The Evaluation Model ++ ++3.1.2.10 Function Forms ++....................... ++ ++If the operator is a symbol naming a function, the form represents a ++function form, and the cdr of the list contains the forms which when ++evaluated will supply the arguments passed to the function. ++ ++ When a function name is not defined, an error of type ++undefined-function should be signaled at run time; see *note Semantic ++Constraints::. ++ ++ A function form is evaluated as follows: ++ ++ The subforms in the cdr of the original form are evaluated in ++left-to-right order in the current lexical and dynamic environments. ++The primary value of each such evaluation becomes an argument to the ++named function; any additional values returned by the subforms are ++discarded. ++ ++ The functional value of the operator is retrieved from the lexical ++environment, and that function is invoked with the indicated arguments. ++ ++ Although the order of evaluation of the argument subforms themselves ++is strictly left-to-right, it is not specified whether the definition of ++the operator in a function form is looked up before the evaluation of ++the argument subforms, after the evaluation of the argument subforms, or ++between the evaluation of any two argument subforms if there is more ++than one such argument subform. For example, the following might return ++23 or~24. ++ ++ (defun foo (x) (+ x 3)) ++ (defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4)))) ++ (foo (progn (bar) 20)) ++ ++ A binding for a function name can be established in one of several ++ways. A binding for a function name in the global environment can be ++established by defun, setf of fdefinition, setf of symbol-function, ++ensure-generic-function, defmethod (implicitly, due to ++ensure-generic-function), or defgeneric. A binding for a function name ++in the lexical environment can be established by flet or labels. ++ ++ Figure 3-4 lists some defined names that are applicable to functions. ++ ++ apply fdefinition mapcan ++ call-arguments-limit flet mapcar ++ complement fmakunbound mapcon ++ constantly funcall mapl ++ defgeneric function maplist ++ defmethod functionp multiple-value-call ++ defun labels reduce ++ fboundp map symbol-function ++ ++ Figure 3-4: Some function-related defined names ++ ++ ++ ++File: gcl.info, Node: Lambda Forms, Next: Self-Evaluating Objects, Prev: Function Forms, Up: The Evaluation Model ++ ++3.1.2.11 Lambda Forms ++..................... ++ ++A lambda form is similar to a function form, except that the function ++name is replaced by a lambda expression. ++ ++ A lambda form is equivalent to using funcall of a lexical closure of ++the lambda expression on the given arguments. (In practice, some ++compilers are more likely to produce inline code for a lambda form than ++for an arbitrary named function that has been declared inline; however, ++such a difference is not semantic.) ++ ++ For further information, see *note Lambda Expressions::. ++ ++ ++File: gcl.info, Node: Self-Evaluating Objects, Next: Examples of Self-Evaluating Objects, Prev: Lambda Forms, Up: The Evaluation Model ++ ++3.1.2.12 Self-Evaluating Objects ++................................ ++ ++A form that is neither a symbol nor a cons is defined to be a ++self-evaluating object. Evaluating such an object yields the same ++object as a result. ++ ++ Certain specific symbols and conses might also happen to be ++"self-evaluating" but only as a special case of a more general set of ++rules for the evaluation of symbols and conses; such objects are not ++considered to be self-evaluating objects. ++ ++ The consequences are undefined if literal objects (including ++self-evaluating objects) are destructively modified. ++ ++ ++File: gcl.info, Node: Examples of Self-Evaluating Objects, Prev: Self-Evaluating Objects, Up: The Evaluation Model ++ ++3.1.2.13 Examples of Self-Evaluating Objects ++............................................ ++ ++Numbers, pathnames, and arrays are examples of self-evaluating objects. ++ ++ 3 => 3 ++ #c(2/3 5/8) => #C(2/3 5/8) ++ #p"S:[BILL]OTHELLO.TXT" => #P"S:[BILL]OTHELLO.TXT" ++ #(a b c) => #(A B C) ++ "fred smith" => "fred smith" ++ ++ ++File: gcl.info, Node: Lambda Expressions, Next: Closures and Lexical Binding, Prev: The Evaluation Model, Up: Evaluation ++ ++3.1.3 Lambda Expressions ++------------------------ ++ ++In a lambda expression, the body is evaluated in a lexical environment ++that is formed by adding the binding of each parameter in the lambda ++list with the corresponding value from the arguments to the current ++lexical environment. ++ ++ For further discussion of how bindings are established based on the ++lambda list, see *note Lambda Lists::. ++ ++ The body of a lambda expression is an implicit progn; the values it ++returns are returned by the lambda expression. ++ ++ ++File: gcl.info, Node: Closures and Lexical Binding, Next: Shadowing, Prev: Lambda Expressions, Up: Evaluation ++ ++3.1.4 Closures and Lexical Binding ++---------------------------------- ++ ++A lexical closure is a function that can refer to and alter the values ++of lexical bindings established by binding forms that textually include ++the function definition. ++ ++ Consider this code, where x is not declared special: ++ ++ (defun two-funs (x) ++ (list (function (lambda () x)) ++ (function (lambda (y) (setq x y))))) ++ (setq funs (two-funs 6)) ++ (funcall (car funs)) => 6 ++ (funcall (cadr funs) 43) => 43 ++ (funcall (car funs)) => 43 ++ ++ The function special form coerces a lambda expression into a closure ++in which the lexical environment in effect when the special form is ++evaluated is captured along with the lambda expression. ++ ++ The function two-funs returns a list of two functions, each of which ++refers to the binding of the variable x created on entry to the function ++two-funs when it was called. This variable has the value 6 initially, ++but setq can alter this binding. The lexical closure created for the ++first lambda expression does not "snapshot" the value 6 for x when the ++closure is created; rather it captures the binding of x. The second ++function can be used to alter the value in the same (captured) binding ++(to 43, in the example), and this altered variable binding then affects ++the value returned by the first function. ++ ++ In situations where a closure of a lambda expression over the same ++set of bindings may be produced more than once, the various resulting ++closures may or may not be identical, at the discretion of the ++implementation. That is, two functions that are behaviorally ++indistinguishable might or might not be identical. Two functions that ++are behaviorally distinguishable are distinct. For example: ++ ++ (let ((x 5) (funs '())) ++ (dotimes (j 10) ++ (push #'(lambda (z) ++ (if (null z) (setq x 0) (+ x z))) ++ funs)) ++ funs) ++ ++ The result of the above form is a list of ten closures. Each ++requires only the binding of x. It is the same binding in each case, ++but the ten closure objects might or might not be identical. On the ++other hand, the result of the form ++ ++ (let ((funs '())) ++ (dotimes (j 10) ++ (let ((x 5)) ++ (push (function (lambda (z) ++ (if (null z) (setq x 0) (+ x z)))) ++ funs))) ++ funs) ++ ++ is also a list of ten closures. However, in this case no two of the ++closure objects can be identical because each closure is closed over a ++distinct binding of x, and these bindings can be behaviorally ++distinguished because of the use of setq. ++ ++ The result of the form ++ ++ (let ((funs '())) ++ (dotimes (j 10) ++ (let ((x 5)) ++ (push (function (lambda (z) (+ x z))) ++ funs))) ++ funs) ++ ++ is a list of ten closure objects that might or might not be ++identical. A different binding of x is involved for each closure, but ++the bindings cannot be distinguished because their values are the same ++and immutable (there being no occurrence of setq on x). A compiler ++could internally transform the form to ++ ++ (let ((funs '())) ++ (dotimes (j 10) ++ (push (function (lambda (z) (+ 5 z))) ++ funs)) ++ funs) ++ ++ where the closures may be identical. ++ ++ It is possible that a closure does not close over any variable ++bindings. In the code fragment ++ ++ (mapcar (function (lambda (x) (+ x 2))) y) ++ ++ the function (lambda (x) (+ x 2)) contains no references to any ++outside object. In this case, the same closure might be returned for ++all evaluations of the function form. ++ ++ ++File: gcl.info, Node: Shadowing, Next: Extent, Prev: Closures and Lexical Binding, Up: Evaluation ++ ++3.1.5 Shadowing ++--------------- ++ ++If two forms that establish lexical bindings with the same name N are ++textually nested, then references to N within the inner form refer to ++the binding established by the inner form; the inner binding for N ++shadows the outer binding for N. Outside the inner form but inside the ++outer one, references to N refer to the binding established by the outer ++form. For example: ++ ++ (defun test (x z) ++ (let ((z (* x 2))) ++ (print z)) ++ z) ++ ++ The binding of the variable z by let shadows the parameter binding ++for the function test. The reference to the variable z in the print ++form refers to the let binding. The reference to z at the end of the ++function test refers to the parameter named z. ++ ++ Constructs that are lexically scoped act as if new names were ++generated for each object on each execution. Therefore, dynamic ++shadowing cannot occur. For example: ++ ++ (defun contorted-example (f g x) ++ (if (= x 0) ++ (funcall f) ++ (block here ++ (+ 5 (contorted-example g ++ #'(lambda () (return-from here 4)) ++ (- x 1)))))) ++ ++ Consider the call (contorted-example nil nil 2). This produces 4. ++During the course of execution, there are three calls to ++contorted-example, interleaved with two blocks: ++ ++ (contorted-example nil nil 2) ++ (block here_1 ...) ++ (contorted-example nil #'(lambda () (return-from here_1 4)) 1) ++ (block here_2 ...) ++ (contorted-example #'(lambda () (return-from here_1 4)) ++ #'(lambda () (return-from here_2 4)) ++ 0) ++ (funcall f) ++ where f => #'(lambda () (return-from here_1 4)) ++ (return-from here_1 4) ++ ++ At the time the funcall is executed there are two block exit points ++outstanding, each apparently named here. The return-from form executed ++as a result of the funcall operation refers to the outer outstanding ++exit point (here_1), not the inner one (here_2). It refers to that exit ++point textually visible at the point of execution of function (here ++abbreviated by the #' syntax) that resulted in creation of the function ++object actually invoked by funcall. ++ ++ If, in this example, one were to change the (funcall f) to (funcall ++g), then the value of the call (contorted-example nil nil 2) would be 9. ++The value would change because funcall would cause the execution of ++(return-from here_2 4), thereby causing a return from the inner exit ++point (here_2). When that occurs, the value 4 is returned from the ++middle invocation of contorted-example, 5 is added to that to get 9, and ++that value is returned from the outer block and the outermost call to ++contorted-example. The point is that the choice of exit point returned ++from has nothing to do with its being innermost or outermost; rather, it ++depends on the lexical environment that is packaged up with a lambda ++expression when function is executed. ++ ++ ++File: gcl.info, Node: Extent, Next: Return Values, Prev: Shadowing, Up: Evaluation ++ ++3.1.6 Extent ++------------ ++ ++Contorted-example works only because the function named by f is invoked ++during the extent of the exit point. Once the flow of execution has ++left the block, the exit point is disestablished. For example: ++ ++ (defun invalid-example () ++ (let ((y (block here #'(lambda (z) (return-from here z))))) ++ (if (numberp y) y (funcall y 5)))) ++ ++ One might expect the call (invalid-example) to produce 5 by the ++following incorrect reasoning: let binds y to the value of block; this ++value is a function resulting from the lambda expression. Because y is ++not a number, it is invoked on the value 5. The return-from should then ++return this value from the exit point named here, thereby exiting from ++the block again and giving y the value 5 which, being a number, is then ++returned as the value of the call to invalid-example. ++ ++ The argument fails only because exit points have dynamic extent. The ++argument is correct up to the execution of return-from. The execution ++of return-from should signal an error of type control-error, however, ++not because it cannot refer to the exit point, but because it does ++correctly refer to an exit point and that exit point has been ++disestablished. ++ ++ A reference by name to a dynamic exit point binding such as a catch ++tag refers to the most recently established binding of that name that ++has not been disestablished. For example: ++ ++ (defun fun1 (x) ++ (catch 'trap (+ 3 (fun2 x)))) ++ (defun fun2 (y) ++ (catch 'trap (* 5 (fun3 y)))) ++ (defun fun3 (z) ++ (throw 'trap z)) ++ ++ Consider the call (fun1 7). The result is 10. At the time the throw ++is executed, there are two outstanding catchers with the name trap: one ++established within procedure fun1, and the other within procedure fun2. ++The latter is the more recent, and so the value 7 is returned from catch ++in fun2. Viewed from within fun3, the catch in fun2 shadows the one in ++fun1. Had fun2 been defined as ++ ++ (defun fun2 (y) ++ (catch 'snare (* 5 (fun3 y)))) ++ ++ then the two exit points would have different names, and therefore ++the one in fun1 would not be shadowed. The result would then have been ++7. ++ ++ ++File: gcl.info, Node: Return Values, Prev: Extent, Up: Evaluation ++ ++3.1.7 Return Values ++------------------- ++ ++Ordinarily the result of calling a function is a single object. ++Sometimes, however, it is convenient for a function to compute several ++objects and return them. ++ ++ In order to receive other than exactly one value from a form, one of ++several special forms or macros must be used to request those values. ++If a form produces multiple values which were not requested in this way, ++then the first value is given to the caller and all others are ++discarded; if the form produces zero values, then the caller receives ++nil as a value. ++ ++ Figure 3-5 lists some operators for receiving multiple values_2. ++These operators can be used to specify one or more forms to evaluate and ++where to put the values returned by those forms. ++ ++ multiple-value-bind multiple-value-prog1 return-from ++ multiple-value-call multiple-value-setq throw ++ multiple-value-list return ++ ++ Figure 3-5: Some operators applicable to receiving multiple values ++ ++ ++ The function values can produce multiple values_2. (values) returns ++zero values; (values form) returns the primary value returned by form; ++(values form1 form2) returns two values, the primary value of form1 and ++the primary value of form2; and so on. ++ ++ See multiple-values-limit and values-list. ++ ++ ++File: gcl.info, Node: Compilation, Next: Declarations, Prev: Evaluation, Up: Evaluation and Compilation ++ ++3.2 Compilation ++=============== ++ ++* Menu: ++ ++* Compiler Terminology:: ++* Compilation Semantics:: ++* File Compilation:: ++* Literal Objects in Compiled Files:: ++* Exceptional Situations in the Compiler:: ++ ++ ++File: gcl.info, Node: Compiler Terminology, Next: Compilation Semantics, Prev: Compilation, Up: Compilation ++ ++3.2.1 Compiler Terminology ++-------------------------- ++ ++The following terminology is used in this section. ++ ++ The compiler is a utility that translates code into an ++implementation-dependent form that might be represented or executed ++efficiently. The term compiler refers to both of the functions compile ++and compile-file. ++ ++ The term compiled code refers to objects representing compiled ++programs, such as objects constructed by compile or by load when loading ++a compiled file. ++ ++ The term implicit compilation refers to compilation performed during ++evaluation. ++ ++ The term literal object refers to a quoted object or a ++self-evaluating object or an object that is a substructure of such an ++object. A constant variable is not itself a literal object. ++ ++ The term coalesce is defined as follows. Suppose A and B are two ++literal constants in the source code, and that A' and B' are the ++corresponding objects in the compiled code. If A' and B' are eql but A ++and B are not eql, then it is said that A and B have been coalesced by ++the compiler. ++ ++ The term minimal compilation refers to actions the compiler must take ++at compile time. These actions are specified in *note Compilation ++Semantics::. ++ ++ The verb process refers to performing minimal compilation, ++determining the time of evaluation for a form, and possibly evaluating ++that form (if required). ++ ++ The term further compilation refers to implementation-dependent ++compilation beyond minimal compilation. That is, processing does not ++imply complete compilation. Block compilation and generation of ++machine-specific instructions are examples of further compilation. ++Further compilation is permitted to take place at run time. ++ ++ Four different environments relevant to compilation are ++distinguished: the startup environment, the compilation environment, the ++evaluation environment, and the run-time environment. ++ ++ The startup environment is the environment of the Lisp image from ++which the compiler was invoked. ++ ++ The compilation environment is maintained by the compiler and is used ++to hold definitions and declarations to be used internally by the ++compiler. Only those parts of a definition needed for correct ++compilation are saved. The compilation environment is used as the ++environment argument to macro expanders called by the compiler. It is ++unspecified whether a definition available in the compilation ++environment can be used in an evaluation initiated in the startup ++environment or evaluation environment. ++ ++ The evaluation environment is a run-time environment in which macro ++expanders and code specified by eval-when to be evaluated are evaluated. ++All evaluations initiated by the compiler take place in the evaluation ++environment. ++ ++ The run-time environment is the environment in which the program ++being compiled will be executed. ++ ++ The compilation environment inherits from the evaluation environment, ++and the compilation environment and evaluation environment might be ++identical. The evaluation environment inherits from the startup ++environment, and the startup environment and evaluation environment ++might be identical. ++ ++ The term compile time refers to the duration of time that the ++compiler is processing source code. At compile time, only the ++compilation environment and the evaluation environment are available. ++ ++ The term compile-time definition refers to a definition in the ++compilation environment. For example, when compiling a file, the ++definition of a function might be retained in the compilation ++environment if it is declared inline. This definition might not be ++available in the evaluation environment. ++ ++ The term run time refers to the duration of time that the loader is ++loading compiled code or compiled code is being executed. At run time, ++only the run-time environment is available. ++ ++ The term run-time definition refers to a definition in the run-time ++environment. ++ ++ The term run-time compiler refers to the function compile or implicit ++compilation, for which the compilation and run-time environments are ++maintained in the same Lisp image. Note that when the run-time compiler ++is used, the run-time environment and startup environment are the same. ++ ++ ++File: gcl.info, Node: Compilation Semantics, Next: File Compilation, Prev: Compiler Terminology, Up: Compilation ++ ++3.2.2 Compilation Semantics ++--------------------------- ++ ++Conceptually, compilation is a process that traverses code, performs ++certain kinds of syntactic and semantic analyses using information (such ++as proclamations and macro definitions) present in the compilation ++environment, and produces equivalent, possibly more efficient code. ++ ++* Menu: ++ ++* Compiler Macros:: ++* Purpose of Compiler Macros:: ++* Naming of Compiler Macros:: ++* When Compiler Macros Are Used:: ++* Notes about the Implementation of Compiler Macros:: ++* Minimal Compilation:: ++* Semantic Constraints:: ++ ++ ++File: gcl.info, Node: Compiler Macros, Next: Purpose of Compiler Macros, Prev: Compilation Semantics, Up: Compilation Semantics ++ ++3.2.2.1 Compiler Macros ++....................... ++ ++A compiler macro can be defined for a name that also names a function or ++macro. That is, it is possible for a function name to name both a ++function and a compiler macro. ++ ++ A function name names a compiler macro if compiler-macro-function is ++true of the function name in the lexical environment in which it ++appears. Creating a lexical binding for the function name not only ++creates a new local function or macro definition, but also shadows_2 the ++compiler macro. ++ ++ The function returned by compiler-macro-function is a function of two ++arguments, called the expansion function. To expand a compiler macro, ++the expansion function is invoked by calling the macroexpand hook with ++the expansion function as its first argument, the entire compiler macro ++form as its second argument, and the current compilation environment (or ++with the current lexical environment, if the form is being processed by ++something other than compile-file) as its third argument. The ++macroexpand hook, in turn, calls the expansion function with the form as ++its first argument and the environment as its second argument. The ++return value from the expansion function, which is passed through by the ++macroexpand hook, might either be the same form, or else a form that ++can, at the discretion of the code doing the expansion, be used in place ++of the original form. ++ ++ *macroexpand-hook* compiler-macro-function define-compiler-macro ++ ++ Figure 3-6: Defined names applicable to compiler macros ++ ++ ++ ++File: gcl.info, Node: Purpose of Compiler Macros, Next: Naming of Compiler Macros, Prev: Compiler Macros, Up: Compilation Semantics ++ ++3.2.2.2 Purpose of Compiler Macros ++.................................. ++ ++The purpose of the compiler macro facility is to permit selective source ++code transformations as optimization advice to the compiler. When a ++compound form is being processed (as by the compiler), if the operator ++names a compiler macro then the compiler macro function may be invoked ++on the form, and the resulting expansion recursively processed in ++preference to performing the usual processing on the original form ++according to its normal interpretation as a function form or macro form. ++ ++ A compiler macro function, like a macro function, is a function of ++two arguments: the entire call form and the environment. Unlike an ++ordinary macro function, a compiler macro function can decline to ++provide an expansion merely by returning a value that is the same as the ++original form. The consequences are undefined if a compiler macro ++function destructively modifies any part of its form argument. ++ ++ The form passed to the compiler macro function can either be a list ++whose car is the function name, or a list whose car is funcall and whose ++cadr is a list (function name); note that this affects destructuring of ++the form argument by the compiler macro function. define-compiler-macro ++arranges for destructuring of arguments to be performed correctly for ++both possible formats. ++ ++ When compile-file chooses to expand a top level form that is a ++compiler macro form, the expansion is also treated as a top level form ++for the purposes of eval-when processing; see *note Processing of Top ++Level Forms::. ++ ++ ++File: gcl.info, Node: Naming of Compiler Macros, Next: When Compiler Macros Are Used, Prev: Purpose of Compiler Macros, Up: Compilation Semantics ++ ++3.2.2.3 Naming of Compiler Macros ++................................. ++ ++Compiler macros may be defined for function names that name macros as ++well as functions. ++ ++ Compiler macro definitions are strictly global. There is no ++provision for defining local compiler macros in the way that macrolet ++defines local macros. Lexical bindings of a function name shadow any ++compiler macro definition associated with the name as well as its global ++function or macro definition. ++ ++ Note that the presence of a compiler macro definition does not affect ++the values returned by ++ ++ functions that access function definitions (e.g., fboundp) or macro ++definitions (e.g., macroexpand). Compiler macros are global, and the ++function compiler-macro-function is sufficient to resolve their ++interaction with other lexical and global definitions. ++ ++ ++File: gcl.info, Node: When Compiler Macros Are Used, Next: Notes about the Implementation of Compiler Macros, Prev: Naming of Compiler Macros, Up: Compilation Semantics ++ ++3.2.2.4 When Compiler Macros Are Used ++..................................... ++ ++The presence of a compiler macro definition for a function or macro ++indicates that it is desirable for the compiler to use the expansion of ++the compiler macro instead of the original function form or macro form. ++However, no language processor (compiler, evaluator, or other code ++walker) is ever required to actually invoke compiler macro functions, or ++to make use of the resulting expansion if it does invoke a compiler ++macro function. ++ ++ When the compiler encounters a form during processing that represents ++a call to a compiler macro name (that is not declared notinline), the ++compiler might expand the compiler macro, and might use the expansion in ++place of the original form. ++ ++ When eval encounters a form during processing that represents a call ++to a compiler macro name (that is not declared notinline), eval might ++expand the compiler macro, and might use the expansion in place of the ++original form. ++ ++ There are two situations in which a compiler macro definition must ++not be applied by any language processor: ++ ++* ++ The global function name binding associated with the compiler macro ++ is shadowed by a lexical binding of the function name. ++ ++* ++ The function name has been declared or proclaimed notinline and the ++ call form appears within the scope of the declaration. ++ ++ It is unspecified whether compiler macros are expanded or used in any ++other situations. ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-2 +@@ -0,0 +1,8302 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: Notes about the Implementation of Compiler Macros, Next: Minimal Compilation, Prev: When Compiler Macros Are Used, Up: Compilation Semantics ++ ++3.2.2.5 Notes about the Implementation of Compiler Macros ++......................................................... ++ ++Although it is technically permissible, as described above, for eval to ++treat compiler macros in the same situations as compiler might, this is ++not necessarily a good idea in interpreted implementations. ++ ++ Compiler macros exist for the purpose of trading compile-time speed ++for run-time speed. Programmers who write compiler macros tend to ++assume that the compiler macros can take more time than normal functions ++and macros in order to produce code which is especially optimal for use ++at run time. Since eval in an interpreted implementation might perform ++semantic analysis of the same form multiple times, it might be ++inefficient in general for the implementation to choose to call compiler ++macros on every such evaluation. ++ ++ Nevertheless, the decision about what to do in these situations is ++left to each implementation. ++ ++ ++File: gcl.info, Node: Minimal Compilation, Next: Semantic Constraints, Prev: Notes about the Implementation of Compiler Macros, Up: Compilation Semantics ++ ++3.2.2.6 Minimal Compilation ++........................... ++ ++Minimal compilation is defined as follows: ++ ++* ++ All compiler macro calls appearing in the source code being ++ compiled are expanded, if at all, at compile time; they will not be ++ expanded at run time. ++ ++* ++ All macro and symbol macro calls appearing in the source code being ++ compiled are expanded at compile time in such a way that they will ++ not be expanded again at run time. macrolet ++ ++ and symbol-macrolet ++ ++ are effectively replaced by forms corresponding to their bodies in ++ which calls to macros are replaced by their expansions. ++ ++* ++ The first argument in a load-time-value ++ ++ form in source code processed by compile ++ ++ is evaluated at compile time; in source code processed by ++ compile-file , the compiler arranges for it to be evaluated at load ++ time. In either case, the result of the evaluation is remembered ++ and used later as the value of the load-time-value form at ++ execution time. ++ ++ ++File: gcl.info, Node: Semantic Constraints, Prev: Minimal Compilation, Up: Compilation Semantics ++ ++3.2.2.7 Semantic Constraints ++............................ ++ ++All conforming programs must obey the following constraints, which are ++designed to minimize the observable differences between compiled and ++interpreted programs: ++ ++* ++ Definitions of any referenced macros must be present in the ++ compilation environment. Any form that is a list beginning with a ++ symbol that does not name a special operator or a macro defined in ++ the compilation environment is treated by the compiler as a ++ function call. ++ ++* ++ Special proclamations for dynamic variables must be made in the ++ compilation environment. Any binding for which there is no special ++ declaration or proclamation in the compilation environment is ++ treated by the compiler as a lexical binding. ++ ++* ++ The definition of a function that is defined and declared inline in ++ the compilation environment must be the same at run time. ++ ++* ++ Within a function named F, the compiler may (but is not required ++ to) assume that an apparent recursive call to a function named F ++ refers to the same definition of F, unless that function has been ++ declared notinline. The consequences of redefining such a ++ recursively defined function F while it is executing are undefined. ++ ++* ++ A call within a file to a named function that is defined in the ++ same file refers to that function, unless that function has been ++ declared notinline. The consequences are unspecified if functions ++ are redefined individually at run time or multiply defined in the ++ same file. ++ ++* ++ The argument syntax and number of return values for all functions ++ whose ftype is declared at compile time must remain the same at run ++ time. ++ ++* ++ Constant variables defined in the compilation environment must have ++ a similar value at run time. A reference to a constant variable in ++ source code is equivalent to a reference to a literal object that ++ is the value of the constant variable. ++ ++* ++ Type definitions made with deftype or defstruct in the compilation ++ environment must retain the same definition at run time. Classes ++ defined by defclass in the compilation environment must be defined ++ at run time to have the same superclasses and same metaclass. ++ ++ This implies that subtype/supertype relationships of type ++ specifiers must not change between compile time and run time. ++ ++* ++ Type declarations present in the compilation environment must ++ accurately describe the corresponding values at run time; ++ otherwise, the consequences are undefined. It is permissible for ++ an unknown type to appear in a declaration at compile time, though ++ a warning might be signaled in such a case. ++ ++* ++ Except in the situations explicitly listed above, a function ++ defined in the evaluation environment is permitted to have a ++ different definition or a different signature at run time, and the ++ run-time definition prevails. ++ ++ Conforming programs should not be written using any additional ++assumptions about consistency between the run-time environment and the ++startup, evaluation, and compilation environments. ++ ++ Except where noted, when a compile-time and a run-time definition are ++different, one of the following occurs at run time: ++ ++* ++ an error of type error is signaled ++* ++ the compile-time definition prevails ++* ++ the run-time definition prevails ++ ++ If the compiler processes a function form whose operator is not ++defined at compile time, no error is signaled at compile time. ++ ++ ++File: gcl.info, Node: File Compilation, Next: Literal Objects in Compiled Files, Prev: Compilation Semantics, Up: Compilation ++ ++3.2.3 File Compilation ++---------------------- ++ ++The function compile-file performs compilation of forms in a file ++following the rules specified in *note Compilation Semantics::, and ++produces an output file that can be loaded by using load. ++ ++ Normally, the top level forms appearing in a file compiled with ++compile-file are evaluated only when the resulting compiled file is ++loaded, and not when the file is compiled. However, it is typically the ++case that some forms in the file need to be evaluated at compile time so ++the remainder of the file can be read and compiled correctly. ++ ++ The eval-when special form can be used to control whether a top level ++form is evaluated at compile time, load time, or both. It is possible ++to specify any of three situations with eval-when, denoted by the ++symbols :compile-toplevel, :load-toplevel, and :execute. For top level ++eval-when forms, :compile-toplevel specifies that the compiler must ++evaluate the body at compile time, and :load-toplevel specifies that the ++compiler must arrange to evaluate the body at load time. For non-top ++level eval-when forms, :execute specifies that the body must be executed ++in the run-time environment. ++ ++ The behavior of this form can be more precisely understood in terms ++of a model of how compile-file processes forms in a file to be compiled. ++There are two processing modes, called "not-compile-time" and ++"compile-time-too". ++ ++ Successive forms are read from the file by compile-file and processed ++in not-compile-time mode; in this mode, compile-file arranges for forms ++to be evaluated only at load time and not at compile time. When ++compile-file is in compile-time-too mode, forms are evaluated both at ++compile time and load time. ++ ++* Menu: ++ ++* Processing of Top Level Forms:: ++* Processing of Defining Macros:: ++* Constraints on Macros and Compiler Macros:: ++ ++ ++File: gcl.info, Node: Processing of Top Level Forms, Next: Processing of Defining Macros, Prev: File Compilation, Up: File Compilation ++ ++3.2.3.1 Processing of Top Level Forms ++..................................... ++ ++Processing of top level forms in the file compiler is defined as ++follows: ++ ++1. ++ If the form is a compiler macro form (not disabled by a notinline ++ declaration), the implementation might or might not choose to ++ compute the compiler macro expansion of the form and, having ++ performed the expansion, might or might not choose to process the ++ result as a top level form in the same processing mode ++ (compile-time-too or not-compile-time). If it declines to obtain ++ or use the expansion, it must process the original form. ++ ++2. ++ If the form is a macro form, its macro expansion is computed and ++ processed as a top level form in the same processing mode ++ (compile-time-too or not-compile-time). ++ ++3. ++ If the form is a progn form, each of its body forms is sequentially ++ processed as a top level form in the same processing mode. ++ ++4. ++ If the form is a locally, macrolet, or symbol-macrolet, ++ compile-file establishes the appropriate bindings and processes the ++ body forms as top level forms with those bindings in effect in the ++ same processing mode. (Note that this implies that the lexical ++ environment in which top level forms are processed is not ++ necessarily the null lexical environment.) ++ ++5. ++ If the form is an eval-when form, it is handled according to Figure ++ 3-7. ++ ++ plus .5 fil \offinterlineskip ++ CT LT E Mode Action New Mode ++ _________________________________________________ ++ Yes Yes -- -- Process compile-time-too ++ No Yes Yes CTT Process compile-time-too ++ No Yes Yes NCT Process not-compile-time ++ No Yes No -- Process not-compile-time ++ Yes No -- -- Evaluate -- ++ No No Yes CTT Evaluate -- ++ No No Yes NCT Discard -- ++ No No No -- Discard -- ++ ++ Figure 3-7: EVAL-WHEN processing ++ ++ Column CT indicates whether :compile-toplevel is specified. Column ++ LT indicates whether :load-toplevel is specified. Column E ++ indicates whether :execute is specified. Column Mode indicates the ++ processing mode; a dash (--) indicates that the processing mode is ++ not relevant. ++ ++ The Action column specifies one of three actions: ++ ++ ++ Process: process the body as top level forms in the specified ++ mode. ++ ++ ++ Evaluate: evaluate the body in the dynamic execution context ++ of the compiler, using the evaluation environment as the ++ global environment and the lexical environment in which the ++ eval-when appears. ++ ++ ++ Discard: ignore the form. ++ ++ The New Mode column indicates the new processing mode. A dash (--) ++ indicates the compiler remains in its current mode. ++ ++6. ++ Otherwise, the form is a top level form that is not one of the ++ special cases. In compile-time-too mode, the compiler first ++ evaluates the form in the evaluation environment and then minimally ++ compiles it. In not-compile-time mode, the form is simply ++ minimally compiled. All subforms are treated as non-top-level ++ forms. ++ ++ Note that top level forms are processed in the order in which they ++ textually appear in the file and that each top level form read by ++ the compiler is processed before the next is read. However, the ++ order of processing (including macro expansion) of subforms that ++ are not top level forms and the order of further compilation is ++ unspecified as long as Common Lisp semantics are preserved. ++ ++ eval-when forms cause compile-time evaluation only at top level. ++Both :compile-toplevel and :load-toplevel situation specifications are ++ignored for non-top-level forms. For non-top-level forms, an eval-when ++specifying the :execute situation is treated as an implicit progn ++including the forms in the body of the eval-when form; otherwise, the ++forms in the body are ignored. ++ ++ ++File: gcl.info, Node: Processing of Defining Macros, Next: Constraints on Macros and Compiler Macros, Prev: Processing of Top Level Forms, Up: File Compilation ++ ++3.2.3.2 Processing of Defining Macros ++..................................... ++ ++Defining macros (such as defmacro or defvar) appearing within a file ++being processed by compile-file normally have compile-time side effects ++which affect how subsequent forms in the same file are compiled. A ++convenient model for explaining how these side effects happen is that ++the defining macro expands into one or more eval-when forms, and that ++the calls which cause the compile-time side effects to happen appear in ++the body of an (eval-when (:compile-toplevel) ...) form. ++ ++ The compile-time side effects may cause information about the ++definition to be stored differently than if the defining macro had been ++processed in the 'normal' way (either interpretively or by loading the ++compiled file). ++ ++ In particular, the information stored by the defining macros at ++compile time might or might not be available to the interpreter (either ++during or after compilation), or during subsequent calls to the ++compiler. For example, the following code is nonportable because it ++assumes that the compiler stores the macro definition of foo where it is ++available to the interpreter: ++ ++ (defmacro foo (x) `(car ,x)) ++ (eval-when (:execute :compile-toplevel :load-toplevel) ++ (print (foo '(a b c)))) ++ ++ A portable way to do the same thing would be to include the macro ++definition inside the eval-when form, as in: ++ ++ (eval-when (:execute :compile-toplevel :load-toplevel) ++ (defmacro foo (x) `(car ,x)) ++ (print (foo '(a b c)))) ++ ++ Figure 3-8 lists macros that make definitions available both in the ++compilation and run-time environments. It is not specified whether ++definitions made available in the compilation environment are available ++in the evaluation environment, nor is it specified whether they are ++available in subsequent compilation units or subsequent invocations of ++the compiler. As with eval-when, these compile-time side effects happen ++only when the defining macros appear at top level. ++ ++ declaim define-modify-macro defsetf ++ defclass define-setf-expander defstruct ++ defconstant defmacro deftype ++ define-compiler-macro defpackage defvar ++ define-condition defparameter ++ ++ Figure 3-8: Defining Macros That Affect the Compile-Time Environment ++ ++ ++ ++File: gcl.info, Node: Constraints on Macros and Compiler Macros, Prev: Processing of Defining Macros, Up: File Compilation ++ ++3.2.3.3 Constraints on Macros and Compiler Macros ++................................................. ++ ++Except where explicitly stated otherwise, no macro defined in the Common ++Lisp standard produces an expansion that could cause any of the subforms ++of the macro form to be treated as top level forms. If an ++implementation also provides a special operator definition of a Common ++Lisp macro, the special operator definition must be semantically ++equivalent in this respect. ++ ++ Compiler macro expansions must also have the same top level ++evaluation semantics as the form which they replace. This is of concern ++both to conforming implementations and to conforming programs. ++ ++ ++File: gcl.info, Node: Literal Objects in Compiled Files, Next: Exceptional Situations in the Compiler, Prev: File Compilation, Up: Compilation ++ ++3.2.4 Literal Objects in Compiled Files ++--------------------------------------- ++ ++The functions eval and compile are required to ensure that literal ++objects referenced within the resulting interpreted or compiled code ++objects are the same as the corresponding objects in the source code. ++compile-file, on the other hand, must produce a compiled file that, when ++loaded with load, constructs the objects defined by the source code and ++produces references to them. ++ ++ In the case of compile-file, objects constructed by load of the ++compiled file cannot be spoken of as being the same as the objects ++constructed at compile time, because the compiled file may be loaded ++into a different Lisp image than the one in which it was compiled. This ++section defines the concept of similarity which relates objects in the ++evaluation environment to the corresponding objects in the run-time ++environment. ++ ++ The constraints on literal objects described in this section apply ++only to compile-file; eval and compile do not copy or coalesce ++constants. ++ ++* Menu: ++ ++* Externalizable Objects:: ++* Similarity of Literal Objects:: ++* Similarity of Aggregate Objects:: ++* Definition of Similarity:: ++* Extensions to Similarity Rules:: ++* Additional Constraints on Externalizable Objects:: ++ ++ ++File: gcl.info, Node: Externalizable Objects, Next: Similarity of Literal Objects, Prev: Literal Objects in Compiled Files, Up: Literal Objects in Compiled Files ++ ++3.2.4.1 Externalizable Objects ++.............................. ++ ++The fact that the file compiler represents literal objects externally in ++a compiled file and must later reconstruct suitable equivalents of those ++objects when that file is loaded imposes a need for constraints on the ++nature of the objects that can be used as literal objects in code to be ++processed by the file compiler. ++ ++ An object that can be used as a literal object in code to be ++processed by the file compiler is called an externalizable object . ++ ++ We define that two objects are similar if they satisfy a two-place ++conceptual equivalence predicate (defined below), which is independent ++of the Lisp image so that the two objects in different Lisp images can ++be understood to be equivalent under this predicate. Further, by ++inspecting the definition of this conceptual predicate, the programmer ++can anticipate what aspects of an object are reliably preserved by file ++compilation. ++ ++ The file compiler must cooperate with the loader in order to assure ++that in each case where an externalizable object is processed as a ++literal object, the loader will construct a similar object. ++ ++ The set of objects that are externalizable objects are those for ++which the new conceptual term "similar" is defined, such that when a ++compiled file is loaded, an object can be constructed which can be shown ++to be similar to the original object which existed at the time the file ++compiler was operating. ++ ++ ++File: gcl.info, Node: Similarity of Literal Objects, Next: Similarity of Aggregate Objects, Prev: Externalizable Objects, Up: Literal Objects in Compiled Files ++ ++3.2.4.2 Similarity of Literal Objects ++..................................... ++ ++ ++File: gcl.info, Node: Similarity of Aggregate Objects, Next: Definition of Similarity, Prev: Similarity of Literal Objects, Up: Literal Objects in Compiled Files ++ ++3.2.4.3 Similarity of Aggregate Objects ++....................................... ++ ++Of the types over which similarity is defined, some are treated as ++aggregate objects. For these types, similarity is defined recursively. ++We say that an object of these types has certain "basic qualities" and ++to satisfy the similarity relationship, the values of the corresponding ++qualities of the two objects must also be similar. ++ ++ ++File: gcl.info, Node: Definition of Similarity, Next: Extensions to Similarity Rules, Prev: Similarity of Aggregate Objects, Up: Literal Objects in Compiled Files ++ ++3.2.4.4 Definition of Similarity ++................................ ++ ++Two objects S (in source code) and C (in compiled code) are defined to ++be similar if and only if they are both of one of the types listed here ++(or defined by the implementation) and they both satisfy all additional ++requirements of similarity indicated for that type. ++ ++number ++ Two numbers S and C are similar if they are of the same type and ++ represent the same mathematical value. ++ ++character ++ Two simple characters S and C are similar if they have similar code ++ attributes. ++ ++ Implementations providing additional, implementation-defined ++ attributes must define whether and how non-simple characters can be ++ regarded as similar. ++ ++symbol ++ Two apparently uninterned symbols S and C are similar if their ++ names are similar. ++ ++ Two interned symbols S and C are similar if their names are ++ similar, and if either S is accessible in the current package at ++ compile time and C is accessible in the current package at load ++ time, or C is accessible in the package that is similar to the home ++ package of S. ++ ++ (Note that similarity of symbols is dependent on neither the ++ current readtable nor how the function read would parse the ++ characters in the name of the symbol.) ++ ++package ++ Two packages S and C are similar if their names are similar. ++ ++ Note that although a package object is an externalizable object, ++ the programmer is responsible for ensuring that the corresponding ++ package is already in existence when code referencing it as a ++ literal object is loaded. The loader finds the corresponding ++ package object as if by calling find-package with that name as an ++ argument. An error is signaled by the loader if no package exists ++ at load time. ++ ++random-state ++ Two random states S and C are similar if S would always produce the ++ same sequence of pseudo-random numbers as a copy_5 of C when given ++ as the random-state argument to the function random, assuming ++ equivalent limit arguments in each case. ++ ++ (Note that since C has been processed by the file compiler, it ++ cannot be used directly as an argument to random because random ++ would perform a side effect.) ++ ++cons ++ Two conses, S and C, are similar if the car_2 of S is similar to ++ the car_2 of C, and the cdr_2 of S is similar to the cdr_2 of C. ++ ++array ++ Two one-dimensional arrays, S and C, are similar if the length of S ++ is similar to the length of C, the actual array element type of S ++ is similar to the actual array element type of C, and each active ++ element of S is similar to the corresponding element of C. ++ ++ Two arrays of rank other than one, S and C, are similar if the rank ++ of S is similar to the rank of C, each dimension_1 of S is similar ++ to the corresponding dimension_1 of C, the actual array element ++ type of S is similar to the actual array element type of C, and ++ each element of S is similar to the corresponding element of C. ++ ++ In addition, if S is a simple array, then C must also be a simple ++ array. If S is a displaced array, has a fill pointer, or is ++ actually adjustable, C is permitted to lack any or all of these ++ qualities. ++ ++hash-table ++ Two hash tables S and C are similar if they meet the following ++ three requirements: ++ ++ 1. ++ They both have the same test (e.g., they are both eql hash ++ tables). ++ ++ 2. ++ There is a unique one-to-one correspondence between the keys ++ of the two hash tables, such that the corresponding keys are ++ similar. ++ ++ 3. ++ For all keys, the values associated with two corresponding ++ keys are similar. ++ ++ If there is more than one possible one-to-one correspondence ++ between the keys of S and C, the consequences are unspecified. A ++ conforming program cannot use a table such as S as an ++ externalizable constant. ++ ++pathname ++ Two pathnames S and C are similar if all corresponding pathname ++ components are similar. ++ ++function ++ ++ Functions are not externalizable objects. ++ ++structure-object and standard-object ++ ++ A general-purpose concept of similarity does not exist for ++ structures and standard objects. However, a conforming program is ++ permitted to define a make-load-form method for any class K defined ++ by that program that is a subclass of either structure-object or ++ standard-object. The effect of such a method is to define that an ++ object S of type K in source code is similar to an object C of type ++ K in compiled code if C was constructed from code produced by ++ calling make-load-form on S. ++ ++ ++File: gcl.info, Node: Extensions to Similarity Rules, Next: Additional Constraints on Externalizable Objects, Prev: Definition of Similarity, Up: Literal Objects in Compiled Files ++ ++3.2.4.5 Extensions to Similarity Rules ++...................................... ++ ++Some objects, such as streams, readtables, and methods are not ++externalizable objects under the definition of similarity given above. ++That is, such objects may not portably appear as literal objects in code ++to be processed by the file compiler. ++ ++ An implementation is permitted to extend the rules of similarity, so ++that other kinds of objects are externalizable objects for that ++implementation. ++ ++ If for some kind of object, similarity is neither defined by this ++specification nor by the implementation, then the file compiler must ++signal an error upon encountering such an object as a literal constant. ++ ++ ++File: gcl.info, Node: Additional Constraints on Externalizable Objects, Prev: Extensions to Similarity Rules, Up: Literal Objects in Compiled Files ++ ++3.2.4.6 Additional Constraints on Externalizable Objects ++........................................................ ++ ++If two literal objects appearing in the source code for a single file ++processed with the file compiler are the identical, the corresponding ++objects in the compiled code must also be the identical. ++ ++ With the exception of symbols and packages, any two literal objects ++in code being processed by the file compiler may be coalesced if and ++only if they are similar; if they are either both symbols or both ++packages, they may only be coalesced if and only if they are identical. ++ ++ Objects containing circular references can be externalizable objects. ++The file compiler is required to preserve eqlness of substructures ++within a file. Preserving eqlness means that subobjects that are the ++same in the source code must be the same in the corresponding compiled ++code. ++ ++ In addition, the following are constraints on the handling of literal ++objects by the file compiler: ++ ++ array: If an array in the source code is a simple array, then the ++ corresponding array in the compiled code will also be a simple ++ array. If an array in the source code is displaced, has a fill ++ pointer, or is actually adjustable, the corresponding array in the ++ compiled code might lack any or all of these qualities. If an ++ array in the source code has a fill pointer, then the corresponding ++ array in the compiled code might be only the size implied by the ++ fill pointer. ++ ++ packages: The loader is required to find the corresponding package ++ object as if by calling find-package with the package name as an ++ argument. An error of type package-error is signaled if no package ++ of that name exists at load time. ++ ++ random-state: A constant random state object cannot be used as the ++ state argument to the function random because random modifies this ++ data structure. ++ ++ structure, standard-object: Objects of type structure-object and ++ standard-object may appear in compiled constants if there is an ++ appropriate make-load-form method defined for that type. ++ ++ The file compiler calls make-load-form on any object that is ++ referenced as a literal object if the object is a generalized ++ instance of standard-object, structure-object, condition, or any of ++ a (possibly empty) implementation-dependent set of other classes. ++ The file compiler only calls make-load-form once for any given ++ object within a single file. ++ ++ symbol: In order to guarantee that compiled files can be loaded ++ correctly, users must ensure that the packages referenced in those ++ files are defined consistently at compile time and load time. ++ Conforming programs must satisfy the following requirements: ++ ++ 1. ++ The current package when a top level form in the file is ++ processed by compile-file must be the same as the current ++ package when the code corresponding to that top level form in ++ the compiled file is executed by load. In particular: ++ ++ a. ++ Any top level form in a file that alters the current ++ package must change it to a package of the same name both ++ at compile time and at load time. ++ ++ b. ++ If the first non-atomic top level form in the file is not ++ an in-package form, then the current package at the time ++ load is called must be a package with the same name as ++ the package that was the current package at the time ++ compile-file was called. ++ ++ 2. ++ For all symbols appearing lexically within a top level form ++ that were accessible in the package that was the current ++ package during processing of that top level form at compile ++ time, but whose home package was another package, at load time ++ there must be a symbol with the same name that is accessible ++ in both the load-time current package and in the package with ++ the same name as the compile-time home package. ++ ++ 3. ++ For all symbols represented in the compiled file that were ++ external symbols in their home package at compile time, there ++ must be a symbol with the same name that is an external symbol ++ in the package with the same name at load time. ++ ++ If any of these conditions do not hold, the package in which the ++ loader looks for the affected symbols is unspecified. ++ Implementations are permitted to signal an error or to define this ++ behavior. ++ ++ ++File: gcl.info, Node: Exceptional Situations in the Compiler, Prev: Literal Objects in Compiled Files, Up: Compilation ++ ++3.2.5 Exceptional Situations in the Compiler ++-------------------------------------------- ++ ++compile and compile-file are permitted to signal errors and warnings, ++including errors due to compile-time processing of (eval-when ++(:compile-toplevel) ...) forms, macro expansion, and conditions signaled ++by the compiler itself. ++ ++ Conditions of type error might be signaled by the compiler in ++situations where the compilation cannot proceed without intervention. ++ ++ In addition to situations for which the standard specifies that ++conditions of type warning must or might be signaled, warnings might be ++signaled in situations where the compiler can determine that the ++consequences are undefined or that a run-time error will be signaled. ++Examples of this situation are as follows: violating type declarations, ++altering or assigning the value of a constant defined with defconstant, ++calling built-in Lisp functions with a wrong number of arguments or ++malformed keyword argument lists, and using unrecognized declaration ++specifiers. ++ ++ The compiler is permitted to issue warnings about matters of ++programming style as conditions of type style-warning. Examples of this ++situation are as follows: redefining a function using a different ++argument list, calling a function with a wrong number of arguments, not ++declaring ignore of a local variable that is not referenced, and ++referencing a variable declared ignore. ++ ++ Both compile and compile-file are permitted (but not required) to ++establish a handler for conditions of type error. For example, they ++might signal a warning, and restart compilation from some ++implementation-dependent point in order to let the compilation proceed ++without manual intervention. ++ ++ Both compile and compile-file return three values, the second two ++indicating whether the source code being compiled contained errors and ++whether style warnings were issued. ++ ++ Some warnings might be deferred until the end of compilation. See ++with-compilation-unit. ++ ++ ++File: gcl.info, Node: Declarations, Next: Lambda Lists, Prev: Compilation, Up: Evaluation and Compilation ++ ++3.3 Declarations ++================ ++ ++Declarations provide a way of specifying information for use by program ++processors, such as the evaluator or the compiler. ++ ++ Local declarations ++ ++ can be embedded in executable code using declare. Global ++declarations , or proclamations , are established by proclaim or ++declaim. ++ ++ The the special form provides a shorthand notation for making a local ++declaration about the type of the value of a given form. ++ ++ The consequences are undefined if a program violates a declaration or ++a proclamation. ++ ++* Menu: ++ ++* Minimal Declaration Processing Requirements:: ++* Declaration Specifiers:: ++* Declaration Identifiers:: ++* Declaration Scope:: ++ ++ ++File: gcl.info, Node: Minimal Declaration Processing Requirements, Next: Declaration Specifiers, Prev: Declarations, Up: Declarations ++ ++3.3.1 Minimal Declaration Processing Requirements ++------------------------------------------------- ++ ++In general, an implementation is free to ignore declaration specifiers ++except for the declaration , notinline , safety , and special ++declaration specifiers. ++ ++ A declaration declaration must suppress warnings about unrecognized ++declarations of the kind that it declares. If an implementation does ++not produce warnings about unrecognized declarations, it may safely ++ignore this declaration. ++ ++ A notinline declaration must be recognized by any implementation that ++supports inline functions or compiler macros in order to disable those ++facilities. An implementation that does not use inline functions or ++compiler macros may safely ignore this declaration. ++ ++ A safety declaration that increases the current safety level must ++always be recognized. An implementation that always processes code as ++if safety were high may safely ignore this declaration. ++ ++ A special declaration must be processed by all implementations. ++ ++ ++File: gcl.info, Node: Declaration Specifiers, Next: Declaration Identifiers, Prev: Minimal Declaration Processing Requirements, Up: Declarations ++ ++3.3.2 Declaration Specifiers ++---------------------------- ++ ++A declaration specifier is an expression that can appear at top level of ++a declare expression or a declaim form, or as the argument to proclaim. ++It is a list whose car is a declaration identifier, and whose cdr is ++data interpreted according to rules specific to the declaration ++identifier. ++ ++ ++File: gcl.info, Node: Declaration Identifiers, Next: Declaration Scope, Prev: Declaration Specifiers, Up: Declarations ++ ++3.3.3 Declaration Identifiers ++----------------------------- ++ ++Figure 3-9 shows a list of all declaration identifiers ++ ++ defined by this standard. ++ ++ declaration ignore special ++ dynamic-extent inline type ++ ftype notinline ++ ignorable optimize ++ ++ Figure 3-9: Common Lisp Declaration Identifiers ++ ++ ++ An implementation is free to support other (implementation-defined) ++declaration identifiers as well. A warning might be issued if a ++declaration identifier is not among those defined above, is not defined ++by the implementation, is not a type name, and has not been declared in ++a declaration proclamation. ++ ++* Menu: ++ ++* Shorthand notation for Type Declarations:: ++ ++ ++File: gcl.info, Node: Shorthand notation for Type Declarations, Prev: Declaration Identifiers, Up: Declaration Identifiers ++ ++3.3.3.1 Shorthand notation for Type Declarations ++................................................ ++ ++A type specifier can be used as a declaration identifier. ++(type-specifier {var}*) is taken as shorthand for (type type-specifier ++{var}*). ++ ++ ++File: gcl.info, Node: Declaration Scope, Prev: Declaration Identifiers, Up: Declarations ++ ++3.3.4 Declaration Scope ++----------------------- ++ ++Declarations can be divided into two kinds: those that apply to the ++bindings of variables or functions; and those that do not apply to ++bindings. ++ ++ A declaration that appears at the head of a binding form and applies ++to a variable or function binding made by that form is called a bound ++declaration ; such a declaration affects both the binding and any ++references within the scope of the declaration. ++ ++ Declarations that are not bound declarations are called free ++declarations . ++ ++ A free declaration in a form F1 that applies to a binding for a name ++N established by some form F2 of which F1 is a subform affects only ++references to N within F1; it does not to apply to other references to N ++outside of F1, nor does it affect the manner in which the binding of N ++by F2 is established. ++ ++ Declarations that do not apply to bindings can only appear as free ++declarations. ++ ++ The scope of a bound declaration is the same as the lexical scope of ++the binding to which it applies; for special variables, this means the ++scope that the binding would have had had it been a lexical binding. ++ ++ Unless explicitly stated otherwise, the scope of a free declaration ++includes only the body subforms of the form at whose head it appears, ++and no other subforms. The scope of free declarations specifically does ++not include initialization forms for bindings established by the form ++containing the declarations. ++ ++ Some iteration forms include step, end-test, or result subforms that ++are also included in the scope of declarations that appear in the ++iteration form. Specifically, the iteration forms and subforms involved ++are: ++ ++* ++ do, do*: step-forms, end-test-form, and result-forms. ++* ++ dolist, dotimes: result-form ++* ++ do-all-symbols, do-external-symbols, do-symbols: result-form ++ ++* Menu: ++ ++* Examples of Declaration Scope:: ++ ++ ++File: gcl.info, Node: Examples of Declaration Scope, Prev: Declaration Scope, Up: Declaration Scope ++ ++3.3.4.1 Examples of Declaration Scope ++..................................... ++ ++Here is an example illustrating the scope of bound declarations. ++ ++ (let ((x 1)) ;[1] 1st occurrence of x ++ (declare (special x)) ;[2] 2nd occurrence of x ++ (let ((x 2)) ;[3] 3rd occurrence of x ++ (let ((old-x x) ;[4] 4th occurrence of x ++ (x 3)) ;[5] 5th occurrence of x ++ (declare (special x)) ;[6] 6th occurrence of x ++ (list old-x x)))) ;[7] 7th occurrence of x ++ => (2 3) ++ ++ The first occurrence of x establishes a dynamic binding of x because ++of the special declaration for x in the second line. The third ++occurrence of x establishes a lexical binding of x (because there is no ++special declaration in the corresponding let form). The fourth ++occurrence of x x is a reference to the lexical binding of x established ++in the third line. The fifth occurrence of x establishes a dynamic ++binding of x for the body of the let form that begins on that line ++because of the special declaration for x in the sixth line. The ++reference to x in the fourth line is not affected by the special ++declaration in the sixth line because that reference is not within the ++"would-be lexical scope" of the variable x in the fifth line. The ++reference to x in the seventh line is a reference to the dynamic binding ++of x established in the fifth line. ++ ++ Here is another example, to illustrate the scope of a free ++declaration. In the following: ++ ++ (lambda (&optional (x (foo 1))) ;[1] ++ (declare (notinline foo)) ;[2] ++ (foo x)) ;[3] ++ ++ the call to foo in the first line might be compiled inline even ++though the call to foo in the third line must not be. This is because ++the notinline declaration for foo in the second line applies only to the ++body on the third line. In order to suppress inlining for both calls, ++one might write: ++ ++ (locally (declare (notinline foo)) ;[1] ++ (lambda (&optional (x (foo 1))) ;[2] ++ (foo x))) ;[3] ++ ++ or, alternatively: ++ ++ (lambda (&optional ;[1] ++ (x (locally (declare (notinline foo)) ;[2] ++ (foo 1)))) ;[3] ++ (declare (notinline foo)) ;[4] ++ (foo x)) ;[5] ++ ++ Finally, here is an example that shows the scope of declarations in ++an iteration form. ++ ++ (let ((x 1)) ;[1] ++ (declare (special x)) ;[2] ++ (let ((x 2)) ;[3] ++ (dotimes (i x x) ;[4] ++ (declare (special x))))) ;[5] ++ => 1 ++ ++ In this example, the first reference to x on the fourth line is to ++the lexical binding of x established on the third line. However, the ++second occurrence of x on the fourth line lies within the scope of the ++free declaration on the fifth line (because this is the result-form of ++the dotimes) and therefore refers to the dynamic binding of x. ++ ++ ++File: gcl.info, Node: Lambda Lists, Next: Error Checking in Function Calls, Prev: Declarations, Up: Evaluation and Compilation ++ ++3.4 Lambda Lists ++================ ++ ++A lambda list is a list that specifies a set of parameters (sometimes ++called lambda variables) and a protocol for receiving values for those ++parameters. ++ ++ There are several kinds of lambda lists. ++ ++ Context Kind of Lambda List ++ defun form ordinary lambda list ++ defmacro form macro lambda list ++ lambda expression ordinary lambda list ++ flet local function definition ordinary lambda list ++ labels local function definition ordinary lambda list ++ handler-case clause specification ordinary lambda list ++ restart-case clause specification ordinary lambda list ++ macrolet local macro definition macro lambda list ++ define-method-combination ordinary lambda list ++ define-method-combination :arguments option define-method-combination arguments lambda list ++ defstruct :constructor option boa lambda list ++ defgeneric form generic function lambda list ++ defgeneric method clause specialized lambda list ++ defmethod form specialized lambda list ++ defsetf form defsetf lambda list ++ define-setf-expander form macro lambda list ++ deftype form deftype lambda list ++ destructuring-bind form destructuring lambda list ++ define-compiler-macro form macro lambda list ++ define-modify-macro form define-modify-macro lambda list ++ ++ Figure 3-10: What Kind of Lambda Lists to Use ++ ++ ++ Figure 3-11 lists some defined names that are applicable to lambda ++lists. ++ ++ lambda-list-keywords lambda-parameters-limit ++ ++ Figure 3-11: Defined names applicable to lambda lists ++ ++ ++* Menu: ++ ++* Ordinary Lambda Lists:: ++* Generic Function Lambda Lists:: ++* Specialized Lambda Lists:: ++* Macro Lambda Lists:: ++* Destructuring Lambda Lists:: ++* Boa Lambda Lists:: ++* Defsetf Lambda Lists:: ++* Deftype Lambda Lists:: ++* Define-modify-macro Lambda Lists:: ++* Define-method-combination Arguments Lambda Lists:: ++* Syntactic Interaction of Documentation Strings and Declarations:: ++ ++ ++File: gcl.info, Node: Ordinary Lambda Lists, Next: Generic Function Lambda Lists, Prev: Lambda Lists, Up: Lambda Lists ++ ++3.4.1 Ordinary Lambda Lists ++--------------------------- ++ ++An ordinary lambda list is used to describe how a set of arguments is ++received by an ordinary function. The defined names in Figure 3-12 are ++those which use ordinary lambda lists: ++ ++ define-method-combination handler-case restart-case ++ defun labels ++ flet lambda ++ ++ Figure 3-12: Standardized Operators that use Ordinary Lambda Lists ++ ++ ++ An ordinary lambda list can contain the lambda list keywords shown in ++Figure 3-13. ++ ++ &allow-other-keys &key &rest ++ &aux &optional ++ ++ Figure 3-13: Lambda List Keywords used by Ordinary Lambda Lists ++ ++ ++ Each element of a lambda list is either a parameter specifier or a ++lambda list keyword. Implementations are free to provide additional ++lambda list keywords. For a list of all lambda list keywords used by ++the implementation, see lambda-list-keywords. ++ ++ The syntax for ordinary lambda lists is as follows: ++ ++ lambda-list ::=({var}* ++ [&optional {var | (var [init-form [supplied-p-parameter ]])}*] ++ [&rest var] ++ [&key {var | ({var | (keyword-name var)} [init-form [supplied-p-parameter]])}* pt [&allow-other-keys]] ++ [&aux {var | (var [init-form])}*]) ++ ++ A var or supplied-p-parameter must be a symbol that is not the name ++of a constant variable. ++ ++ An init-form can be any form. Whenever any init-form is evaluated ++for any parameter specifier, that form may refer to any parameter ++variable to the left of the specifier in which the init-form appears, ++including any supplied-p-parameter variables, and may rely on the fact ++that no other parameter variable has yet been bound (including its own ++parameter variable). ++ ++ A keyword-name can be any symbol, but by convention is normally a ++keyword_1; all standardized functions follow that convention. ++ ++ An ordinary lambda list has five parts, any or all of which may be ++empty. For information about the treatment of argument mismatches, see ++*note Error Checking in Function Calls::. ++ ++* Menu: ++ ++* Specifiers for the required parameters:: ++* Specifiers for optional parameters:: ++* A specifier for a rest parameter:: ++* Specifiers for keyword parameters:: ++* Suppressing Keyword Argument Checking:: ++* Examples of Suppressing Keyword Argument Checking:: ++* Specifiers for &aux variables:: ++* Examples of Ordinary Lambda Lists:: ++ ++ ++File: gcl.info, Node: Specifiers for the required parameters, Next: Specifiers for optional parameters, Prev: Ordinary Lambda Lists, Up: Ordinary Lambda Lists ++ ++3.4.1.1 Specifiers for the required parameters ++.............................................. ++ ++These are all the parameter specifiers up to the first lambda list ++keyword; if there are no lambda list keywords, then all the specifiers ++are for required parameters. Each required parameter is specified by a ++parameter variable var. var is bound as a lexical variable unless it is ++declared special. ++ ++ If there are n required parameters (n may be zero), there must be at ++least n passed arguments, and the required parameters are bound to the ++first n passed arguments; see *note Error Checking in Function Calls::. ++The other parameters are then processed using any remaining arguments. ++ ++ ++File: gcl.info, Node: Specifiers for optional parameters, Next: A specifier for a rest parameter, Prev: Specifiers for the required parameters, Up: Ordinary Lambda Lists ++ ++3.4.1.2 Specifiers for optional parameters ++.......................................... ++ ++If &optional is present, the optional parameter specifiers are those ++following &optional up to the next lambda list keyword or the end of the ++list. If optional parameters are specified, then each one is processed ++as follows. If any unprocessed arguments remain, then the parameter ++variable var is bound to the next remaining argument, just as for a ++required parameter. If no arguments remain, however, then init-form is ++evaluated, and the parameter variable is bound to the resulting value ++(or to nil if no init-form appears in the parameter specifier). If ++another variable name supplied-p-parameter appears in the specifier, it ++is bound to true if an argument had been available, and to false if no ++argument remained (and therefore init-form had to be evaluated). ++Supplied-p-parameter is bound not to an argument but to a value ++indicating whether or not an argument had been supplied for the ++corresponding var. ++ ++ ++File: gcl.info, Node: A specifier for a rest parameter, Next: Specifiers for keyword parameters, Prev: Specifiers for optional parameters, Up: Ordinary Lambda Lists ++ ++3.4.1.3 A specifier for a rest parameter ++........................................ ++ ++&rest, if present, must be followed by a single rest parameter ++specifier, which in turn must be followed by another lambda list keyword ++or the end of the lambda list. After all optional parameter specifiers ++have been processed, then there may or may not be a rest parameter. If ++there is a rest parameter, it is bound to a list of all ++as-yet-unprocessed arguments. If no unprocessed arguments remain, the ++rest parameter is bound to the empty list. If there is no rest ++parameter and there are no keyword parameters, then an error should be ++signaled if any unprocessed arguments remain; see *note Error Checking ++in Function Calls::. The value of a rest parameter is permitted, but ++not required, to share structure with the last argument to apply. ++ ++ ++File: gcl.info, Node: Specifiers for keyword parameters, Next: Suppressing Keyword Argument Checking, Prev: A specifier for a rest parameter, Up: Ordinary Lambda Lists ++ ++3.4.1.4 Specifiers for keyword parameters ++......................................... ++ ++If &key is present, all specifiers up to the next lambda list keyword or ++the end of the list are keyword parameter specifiers. When keyword ++parameters are processed, the same arguments are processed that would be ++made into a list for a rest parameter. It is permitted to specify both ++&rest and &key. In this case the remaining arguments are used for both ++purposes; that is, all remaining arguments are made into a list for the ++rest parameter, and are also processed for the &key parameters. ++ ++ If &key is specified, there must remain an even number of arguments; ++see *note Odd Number of Keyword Arguments::. ++ ++ These arguments are considered as pairs, the first argument in each ++pair being interpreted as a name and the second as the corresponding ++value. The first object of each pair must be a symbol; see *note ++Invalid Keyword Arguments::. The keyword parameter specifiers may ++optionally be followed by the lambda list keyword &allow-other-keys. ++ ++ In each keyword parameter specifier must be a name var for the ++parameter variable. ++ ++ If the var appears alone or in a (var init-form) combination, the ++keyword name used when matching arguments to parameters is a symbol in ++the KEYWORD package whose name is the same (under string=) as var's. If ++the notation ((keyword-name var) init-form) is used, then the keyword ++name used to match arguments to parameters is keyword-name, which may be ++a symbol in any package. (Of course, if it is not a symbol in the ++KEYWORD package, it does not necessarily self-evaluate, so care must be ++taken when calling the function to make sure that normal evaluation ++still yields the keyword name.) ++ ++ Thus ++ ++ (defun foo (&key radix (type 'integer)) ...) ++ ++ means exactly the same as ++ ++ (defun foo (&key ((:radix radix)) ((:type type) 'integer)) ...) ++ ++ The keyword parameter specifiers are, like all parameter specifiers, ++effectively processed from left to right. For each keyword parameter ++specifier, if there is an argument pair whose name matches that ++specifier's name (that is, the names are eq), then the parameter ++variable for that specifier is bound to the second item (the value) of ++that argument pair. If more than one such argument pair matches, the ++leftmost argument pair is used. If no such argument pair exists, then ++the init-form for that specifier is evaluated and the parameter variable ++is bound to that value (or to nil if no init-form was specified). ++supplied-p-parameter is treated as for &optional parameters: it is bound ++to true if there was a matching argument pair, and to false otherwise. ++ ++ Unless keyword argument checking is suppressed, an argument pair must ++a name matched by a parameter specifier; see *note Unrecognized Keyword ++Arguments::. ++ ++ If keyword argument checking is suppressed, then it is permitted for ++an argument pair to match no parameter specifier, and the argument pair ++is ignored, but such an argument pair is accessible through the rest ++parameter if one was supplied. The purpose of these mechanisms is to ++allow sharing of argument lists among several lambda expressions and to ++allow either the caller or the called lambda expression to specify that ++such sharing may be taking place. ++ ++ Note that if &key is present, a keyword argument of :allow-other-keys ++is always permitted--regardless of whether the associated value is true ++or false. However, if the value is false, other non-matching keywords ++are not tolerated (unless &allow-other-keys was used). ++ ++ Furthermore, if the receiving argument list specifies a regular ++argument which would be flagged by :allow-other-keys, then ++:allow-other-keys has both its special-cased meaning (identifying ++whether additional keywords are permitted) and its normal meaning (data ++flow into the function in question). ++ ++ ++File: gcl.info, Node: Suppressing Keyword Argument Checking, Next: Examples of Suppressing Keyword Argument Checking, Prev: Specifiers for keyword parameters, Up: Ordinary Lambda Lists ++ ++3.4.1.5 Suppressing Keyword Argument Checking ++............................................. ++ ++If &allow-other-keys was specified in the lambda list of a function, ++keyword_2 argument checking is suppressed in calls to that function. ++ ++ If the :allow-other-keys argument is true in a call to a function, ++keyword_2 argument checking is suppressed in that call. ++ ++ The :allow-other-keys argument is permissible in all situations ++involving keyword_2 arguments, even when its associated value is false. ++ ++ ++File: gcl.info, Node: Examples of Suppressing Keyword Argument Checking, Next: Specifiers for &aux variables, Prev: Suppressing Keyword Argument Checking, Up: Ordinary Lambda Lists ++ ++3.4.1.6 Examples of Suppressing Keyword Argument Checking ++......................................................... ++ ++ ;;; The caller can supply :ALLOW-OTHER-KEYS T to suppress checking. ++ ((lambda (&key x) x) :x 1 :y 2 :allow-other-keys t) => 1 ++ ;;; The callee can use &ALLOW-OTHER-KEYS to suppress checking. ++ ((lambda (&key x &allow-other-keys) x) :x 1 :y 2) => 1 ++ ;;; :ALLOW-OTHER-KEYS NIL is always permitted. ++ ((lambda (&key) t) :allow-other-keys nil) => T ++ ;;; As with other keyword arguments, only the left-most pair ++ ;;; named :ALLOW-OTHER-KEYS has any effect. ++ ((lambda (&key x) x) ++ :x 1 :y 2 :allow-other-keys t :allow-other-keys nil) ++ => 1 ++ ;;; Only the left-most pair named :ALLOW-OTHER-KEYS has any effect, ++ ;;; so in safe code this signals a PROGRAM-ERROR (and might enter the ++ ;;; debugger). In unsafe code, the consequences are undefined. ++ ((lambda (&key x) x) ;This call is not valid ++ :x 1 :y 2 :allow-other-keys nil :allow-other-keys t) ++ ++ ++File: gcl.info, Node: Specifiers for &aux variables, Next: Examples of Ordinary Lambda Lists, Prev: Examples of Suppressing Keyword Argument Checking, Up: Ordinary Lambda Lists ++ ++3.4.1.7 Specifiers for &aux variables ++..................................... ++ ++These are not really parameters. If the lambda list keyword &aux is ++present, all specifiers after it are auxiliary variable specifiers. ++After all parameter specifiers have been processed, the auxiliary ++variable specifiers (those following &aux) are processed from left to ++right. For each one, init-form is evaluated and var is bound to that ++value (or to nil if no init-form was specified). &aux variable ++processing is analogous to let* processing. ++ ++ (lambda (x y &aux (a (car x)) (b 2) c) (list x y a b c)) ++ == (lambda (x y) (let* ((a (car x)) (b 2) c) (list x y a b c))) ++ ++ ++File: gcl.info, Node: Examples of Ordinary Lambda Lists, Prev: Specifiers for &aux variables, Up: Ordinary Lambda Lists ++ ++3.4.1.8 Examples of Ordinary Lambda Lists ++......................................... ++ ++Here are some examples involving optional parameters and rest ++parameters: ++ ++ ((lambda (a b) (+ a (* b 3))) 4 5) => 19 ++ ((lambda (a &optional (b 2)) (+ a (* b 3))) 4 5) => 19 ++ ((lambda (a &optional (b 2)) (+ a (* b 3))) 4) => 10 ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x))) ++ => (2 NIL 3 NIL NIL) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6) ++ => (6 T 3 NIL NIL) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3) ++ => (6 T 3 T NIL) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3 8) ++ => (6 T 3 T (8)) ++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) ++ 6 3 8 9 10 11) ++ => (6 t 3 t (8 9 10 11)) ++ ++ Here are some examples involving keyword parameters: ++ ++ ((lambda (a b &key c d) (list a b c d)) 1 2) => (1 2 NIL NIL) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6) => (1 2 6 NIL) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8) => (1 2 NIL 8) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6 :d 8) => (1 2 6 8) ++ ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8 :c 6) => (1 2 6 8) ++ ((lambda (a b &key c d) (list a b c d)) :a 1 :d 8 :c 6) => (:a 1 6 8) ++ ((lambda (a b &key c d) (list a b c d)) :a :b :c :d) => (:a :b :d NIL) ++ ((lambda (a b &key ((:sea c)) d) (list a b c d)) 1 2 :sea 6) => (1 2 6 NIL) ++ ((lambda (a b &key ((c c)) d) (list a b c d)) 1 2 'c 6) => (1 2 6 NIL) ++ ++ Here are some examples involving optional parameters, rest ++parameters, and keyword parameters together: ++ ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1) ++ => (1 3 NIL 1 ()) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 2) ++ => (1 2 NIL 1 ()) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) :c 7) ++ => (:c 7 NIL :c ()) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 6 :c 7) ++ => (1 6 7 1 (:c 7)) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 6 :d 8) ++ => (1 6 NIL 8 (:d 8)) ++ ((lambda (a &optional (b 3) &rest x &key c (d a)) ++ (list a b c d x)) 1 6 :d 8 :c 9 :d 10) ++ => (1 6 9 8 (:d 8 :c 9 :d 10)) ++ ++ As an example of the use of &allow-other-keys and :allow-other-keys, ++consider a function that takes two named arguments of its own and also ++accepts additional named arguments to be passed to make-array: ++ ++ (defun array-of-strings (str dims &rest named-pairs ++ &key (start 0) end &allow-other-keys) ++ (apply #'make-array dims ++ :initial-element (subseq str start end) ++ :allow-other-keys t ++ named-pairs)) ++ ++ This function takes a string and dimensioning information and returns ++an array of the specified dimensions, each of whose elements is the ++specified string. However, :start and :end named arguments may be used ++to specify that a substring of the given string should be used. In ++addition, the presence of &allow-other-keys in the lambda list indicates ++that the caller may supply additional named arguments; the rest ++parameter provides access to them. These additional named arguments are ++passed to make-array. The function make-array normally does not allow ++the named arguments :start and :end to be used, and an error should be ++signaled if such named arguments are supplied to make-array. However, ++the presence in the call to make-array of the named argument ++:allow-other-keys with a true value causes any extraneous named ++arguments, including :start and :end, to be acceptable and ignored. ++ ++ ++File: gcl.info, Node: Generic Function Lambda Lists, Next: Specialized Lambda Lists, Prev: Ordinary Lambda Lists, Up: Lambda Lists ++ ++3.4.2 Generic Function Lambda Lists ++----------------------------------- ++ ++A generic function lambda list is used to describe the overall shape of ++the argument list to be accepted by a generic function. Individual ++method signatures might contribute additional keyword parameters to the ++lambda list of the effective method. ++ ++ A generic function lambda list is used by defgeneric. ++ ++ A generic function lambda list has the following syntax: ++ ++ lambda-list ::=({var}* [&optional {var | (var)}*] ++ [&rest var] ++ [&key {var | ({var | (keyword-name var)})}* pt [&allow-other-keys]]) ++ ++ ++ A generic function lambda list can contain the lambda list keywords ++shown in Figure 3-14. ++ ++ &allow-other-keys &optional ++ &key &rest ++ ++ Figure 3-14: Lambda List Keywords used by Generic Function Lambda Lists ++ ++ ++ A generic function lambda list differs from an ordinary lambda list ++in the following ways: ++ ++Required arguments ++ Zero or more required parameters must be specified. ++ ++Optional and keyword arguments ++ Optional parameters and keyword parameters may not have default ++ initial value forms nor use supplied-p parameters. ++ ++Use of &aux ++ The use of &aux is not allowed. ++ ++ ++File: gcl.info, Node: Specialized Lambda Lists, Next: Macro Lambda Lists, Prev: Generic Function Lambda Lists, Up: Lambda Lists ++ ++3.4.3 Specialized Lambda Lists ++------------------------------ ++ ++A specialized lambda list is used to specialize a method for a ++particular signature and to describe how arguments matching that ++signature are received by the method. The defined names in Figure 3-15 ++use specialized lambda lists in some way; see the dictionary entry for ++each for information about how. ++ ++ defmethod defgeneric ++ ++ Figure 3-15: Standardized Operators that use Specialized Lambda Lists ++ ++ ++ A specialized lambda list can contain the lambda list keywords shown ++in Figure 3-16. ++ ++ &allow-other-keys &key &rest ++ &aux &optional ++ ++ Figure 3-16: Lambda List Keywords used by Specialized Lambda Lists ++ ++ ++ A specialized lambda list is syntactically the same as an ordinary ++lambda list except that each required parameter may optionally be ++associated with a class or object for which that parameter is ++specialized. ++ ++ lambda-list ::=({var | (var [specializer])}* ++ [&optional {var | (var [init-form [supplied-p-parameter]])}*] ++ [&rest var] ++ [&key {var | ({var | (keyword-name var)} [init-form [supplied-p-parameter]])}* [&allow-other-keys]] ++ [&aux {var | (var [init-form])}*]) ++ ++ ++File: gcl.info, Node: Macro Lambda Lists, Next: Destructuring Lambda Lists, Prev: Specialized Lambda Lists, Up: Lambda Lists ++ ++3.4.4 Macro Lambda Lists ++------------------------ ++ ++A macro lambda list is used in describing macros defined by the ++operators in Figure 3-17. ++ ++ define-compiler-macro defmacro macrolet ++ define-setf-expander ++ ++ Figure 3-17: Operators that use Macro Lambda Lists ++ ++ ++ With the additional restriction that an environment parameter may ++appear only once (at any of the positions indicated), a macro lambda ++list has the following syntax: ++ ++ reqvars ::={var | !pattern}* ++ ++ optvars ::=[&optional {var | ({var | !pattern} [init-form [supplied-p-parameter]])}*] ++ ++ restvar ::=[{&rest | &body} {var | !pattern}] ++ ++ keyvars ::=[&key {var | ({var | (keyword-name {var | !pattern})} [init-form [supplied-p-parameter]])}* ++ [&allow-other-keys]] ++ ++ auxvars ::=[&aux {var | (var [init-form])}*] ++ ++ envvar ::=[&environment var] ++ ++ wholevar ::=[&whole var] ++ ++ lambda-list ::=(!wholevar !envvar !reqvars !envvar !optvars !envvar ++ !restvar !envvar !keyvars !envvar !auxvars !envvar) | ++ (!wholevar !envvar !reqvars !envvar !optvars !envvar . var) ++ ++ pattern ::=(!wholevar !reqvars !optvars !restvar !keyvars !auxvars) | ++ (!wholevar !reqvars !optvars . var) ++ ++ A macro lambda list can contain the lambda list keywords shown in ++Figure 3-18. ++ ++ &allow-other-keys &environment &rest ++ &aux &key &whole ++ &body &optional ++ ++ Figure 3-18: Lambda List Keywords used by Macro Lambda Lists ++ ++ ++ Optional parameters (introduced by &optional) and keyword parameters ++(introduced by &key) can be supplied in a macro lambda list, just as in ++an ordinary lambda list. Both may contain default initialization forms ++and supplied-p parameters. ++ ++ &body ++ ++ is identical in function to &rest, but it can be used to inform ++certain output-formatting and editing functions that the remainder of ++the form is treated as a body, and should be indented accordingly. Only ++one of &body or &rest can be used at any particular level; see *note ++Destructuring by Lambda Lists::. ++ ++ &body can appear at any level of a macro lambda list; for details, ++see *note Destructuring by Lambda Lists::. ++ ++ &whole ++ ++ is followed by a single variable that is bound to the entire ++macro-call form; this is the value that the macro function receives as ++its first argument. ++ ++ If &whole and a following variable appear, they must appear first in ++lambda-list, ++ ++ before any other parameter or lambda list keyword. ++ ++ &whole can appear at any level of a macro lambda list. At inner ++levels, the &whole variable is bound to the corresponding part of the ++argument, as with &rest, but unlike &rest, other arguments are also ++allowed. The use of &whole does not affect the pattern of arguments ++specified. ++ ++ &environment ++ ++ is followed by a single variable that is bound to an environment ++representing the lexical environment in which the macro call is to be ++interpreted. This environment should be used with ++ ++ macro-function, ++ ++ get-setf-expansion, ++ ++ compiler-macro-function, ++ ++ and macroexpand (for example) in computing the expansion of the ++macro, to ensure that any lexical bindings or definitions established in ++the compilation environment are taken into account. ++ ++ &environment can only appear at the top level of a macro lambda list, ++and can only appear once, but can appear anywhere in that list; ++ ++ the &environment parameter is bound along with &whole before any ++other variables in the lambda list, regardless of where &environment ++appears in the lambda list. ++ ++ The object that is bound to the environment parameter has dynamic ++extent. ++ ++ Destructuring allows a macro lambda list to express the structure of ++a macro call syntax. If no lambda list keywords appear, then the macro ++lambda list is a tree containing parameter names at the leaves. The ++pattern and the macro form must have compatible tree structure; that is, ++their tree structure must be equivalent, or it must differ only in that ++some leaves of the pattern match non-atomic objects of the macro form. ++ ++ For information about error detection in this situation, see *note ++Destructuring Mismatch::. ++ ++ A destructuring lambda list (whether at top level or embedded) can be ++dotted, ending in a parameter name. This situation is treated exactly ++as if the parameter name that ends the list had appeared preceded by ++&rest. ++ ++ It is permissible for a macro form (or a subexpression of a macro ++form) to be a dotted list only when (... &rest var) or (... . var) is ++used to match it. It is the responsibility of the macro to recognize ++and deal with such situations. ++ ++ [Editorial Note by KMP: Apparently the dotted-macro-forms cleanup ++doesn't allow for the macro to 'manually' notice dotted forms and fix ++them as well. It shouldn't be required that this be done only by &REST ++or a dotted pattern; it should only matter that ultimately the non-macro ++result of a full-macro expansion not contain dots. Anyway, I plan to ++address this editorially unless someone raises an objection.] ++ ++* Menu: ++ ++* Destructuring by Lambda Lists:: ++* Data-directed Destructuring by Lambda Lists:: ++* Examples of Data-directed Destructuring by Lambda Lists:: ++* Lambda-list-directed Destructuring by Lambda Lists:: ++ ++ ++File: gcl.info, Node: Destructuring by Lambda Lists, Next: Data-directed Destructuring by Lambda Lists, Prev: Macro Lambda Lists, Up: Macro Lambda Lists ++ ++3.4.4.1 Destructuring by Lambda Lists ++..................................... ++ ++Anywhere in a macro lambda list where a parameter name can appear, and ++where ordinary lambda list syntax (as described in *note Ordinary Lambda ++Lists::) does not otherwise allow a list, a destructuring lambda list ++can appear in place of the parameter name. When this is done, then the ++argument that would match the parameter is treated as a (possibly ++dotted) list, to be used as an argument list for satisfying the ++parameters in the embedded lambda list. This is known as destructuring. ++ ++ Destructuring is the process of decomposing a compound object into ++its component parts, using an abbreviated, declarative syntax, rather ++than writing it out by hand using the primitive component-accessing ++functions. Each component part is bound to a variable. ++ ++ A destructuring operation requires an object to be decomposed, a ++pattern that specifies what components are to be extracted, and the ++names of the variables whose values are to be the components. ++ ++ ++File: gcl.info, Node: Data-directed Destructuring by Lambda Lists, Next: Examples of Data-directed Destructuring by Lambda Lists, Prev: Destructuring by Lambda Lists, Up: Macro Lambda Lists ++ ++3.4.4.2 Data-directed Destructuring by Lambda Lists ++................................................... ++ ++In data-directed destructuring, the pattern is a sample object of the ++type to be decomposed. Wherever a component is to be extracted, a ++symbol appears in the pattern; this symbol is the name of the variable ++whose value will be that component. ++ ++ ++File: gcl.info, Node: Examples of Data-directed Destructuring by Lambda Lists, Next: Lambda-list-directed Destructuring by Lambda Lists, Prev: Data-directed Destructuring by Lambda Lists, Up: Macro Lambda Lists ++ ++3.4.4.3 Examples of Data-directed Destructuring by Lambda Lists ++............................................................... ++ ++An example pattern is ++ ++ (a b c) ++ ++ which destructures a list of three elements. The variable a is ++assigned to the first element, b to the second, etc. A more complex ++example is ++ ++ ((first . rest) . more) ++ ++ The important features of data-directed destructuring are its ++syntactic simplicity and the ability to extend it to ++lambda-list-directed destructuring. ++ ++ ++File: gcl.info, Node: Lambda-list-directed Destructuring by Lambda Lists, Prev: Examples of Data-directed Destructuring by Lambda Lists, Up: Macro Lambda Lists ++ ++3.4.4.4 Lambda-list-directed Destructuring by Lambda Lists ++.......................................................... ++ ++An extension of data-directed destructuring of trees is ++lambda-list-directed destructuring. This derives from the analogy ++between the three-element destructuring pattern ++ ++ (first second third) ++ ++ and the three-argument lambda list ++ ++ (first second third) ++ ++ Lambda-list-directed destructuring is identical to data-directed ++destructuring if no lambda list keywords appear in the pattern. Any ++list in the pattern (whether a sub-list or the whole pattern itself) ++that contains a lambda list keyword is interpreted specially. Elements ++of the list to the left of the first lambda list keyword are treated as ++destructuring patterns, as usual, but the remaining elements of the list ++are treated like a function's lambda list except that where a variable ++would normally be required, an arbitrary destructuring pattern is ++allowed. Note that in case of ambiguity, lambda list syntax is ++preferred over destructuring syntax. Thus, after &optional a list of ++elements is a list of a destructuring pattern and a default value form. ++ ++ The detailed behavior of each lambda list keyword in a ++lambda-list-directed destructuring pattern is as follows: ++ ++&optional ++ Each following element is a variable or a list of a destructuring ++ pattern, a default value form, and a supplied-p variable. The ++ default value and the supplied-p variable can be omitted. If the ++ list being destructured ends early, so that it does not have an ++ element to match against this destructuring (sub)-pattern, the ++ default form is evaluated and destructured instead. The supplied-p ++ variable receives the value nil if the default form is used, t ++ otherwise. ++ ++&rest, &body ++ The next element is a destructuring pattern that matches the rest ++ of the list. &body is identical to &rest but declares that what is ++ being matched is a list of forms that constitutes the body of form. ++ This next element must be the last unless a lambda list keyword ++ follows it. ++ ++&aux ++ The remaining elements are not destructuring patterns at all, but ++ are auxiliary variable bindings. ++ ++&whole ++ The next element is a destructuring pattern that matches the entire ++ form in a macro, or the entire subexpression at inner levels. ++ ++&key ++ Each following element is one of ++ ++ ++ a variable, ++ ++ or ++ a list of a variable, an optional initialization form, and an ++ optional supplied-p variable. ++ ++ or ++ a list of a list of a keyword and a destructuring pattern, an ++ optional initialization form, and an optional supplied-p ++ variable. ++ ++ The rest of the list being destructured is taken to be alternating ++ keywords and values and is taken apart appropriately. ++ ++&allow-other-keys ++ Stands by itself. ++ ++ ++File: gcl.info, Node: Destructuring Lambda Lists, Next: Boa Lambda Lists, Prev: Macro Lambda Lists, Up: Lambda Lists ++ ++3.4.5 Destructuring Lambda Lists ++-------------------------------- ++ ++A destructuring lambda list is used by destructuring-bind. ++ ++ Destructuring lambda lists are closely related to macro lambda lists; ++see *note Macro Lambda Lists::. A destructuring lambda list can contain ++all of the lambda list keywords listed for macro lambda lists except for ++&environment, and supports destructuring in the same way. Inner lambda ++lists nested within a macro lambda list have the syntax of destructuring ++lambda lists. ++ ++ A destructuring lambda list has the following syntax: ++ ++ reqvars ::={var | !lambda-list}* ++ ++ optvars ::=[&optional {var | ({var | !lambda-list} [init-form [supplied-p-parameter]])}*] ++ ++ restvar ::=[{&rest | &body} {var | !lambda-list}] ++ ++ keyvars ::=[&key {var | ({var | (keyword-name {var | !lambda-list})} [init-form [supplied-p-parameter]])}* ++ [&allow-other-keys]] ++ ++ auxvars ::=[&aux {var | (var [init-form])}*] ++ ++ envvar ::=[&environment var] ++ ++ wholevar ::=[&whole var] ++ ++ lambda-list ::=(!wholevar !reqvars !optvars !restvar !keyvars !auxvars) | ++ (!wholevar !reqvars !optvars . var) ++ ++ ++File: gcl.info, Node: Boa Lambda Lists, Next: Defsetf Lambda Lists, Prev: Destructuring Lambda Lists, Up: Lambda Lists ++ ++3.4.6 Boa Lambda Lists ++---------------------- ++ ++A boa lambda list is a lambda list that is syntactically like an ++ordinary lambda list, but that is processed in "by order of argument" ++style. ++ ++ A boa lambda list is used only in a defstruct form, when explicitly ++specifying the lambda list of a constructor function (sometimes called a ++"boa constructor"). ++ ++ The &optional, &rest, &aux, ++ ++ &key, and &allow-other-keys ++ ++ lambda list keywords are recognized in a boa lambda list. The way ++these lambda list keywords differ from their use in an ordinary lambda ++list follows. ++ ++ Consider this example, which describes how destruct processes its ++:constructor option. ++ ++ (:constructor create-foo ++ (a &optional b (c 'sea) &rest d &aux e (f 'eff))) ++ ++ This defines create-foo to be a constructor of one or more arguments. ++The first argument is used to initialize the a slot. The second ++argument is used to initialize the b slot. If there isn't any second ++argument, then the default value given in the body of the defstruct (if ++given) is used instead. The third argument is used to initialize the c ++slot. If there isn't any third argument, then the symbol sea is used ++instead. Any arguments following the third argument are collected into ++a list and used to initialize the d slot. If there are three or fewer ++arguments, then nil is placed in the d slot. The e slot is not ++initialized; its initial value is implementation-defined. Finally, the ++f slot is initialized to contain the symbol eff. ++ ++ &key and &allow-other-keys arguments default in a manner similar to ++that of &optional arguments: if no default is supplied in the lambda ++list then the default value given in the body of the defstruct (if ++given) is used instead. For example: ++ ++ (defstruct (foo (:constructor CREATE-FOO (a &optional b (c 'sea) ++ &key (d 2) ++ &aux e (f 'eff)))) ++ (a 1) (b 2) (c 3) (d 4) (e 5) (f 6)) ++ ++ (create-foo 10) => #S(FOO A 10 B 2 C SEA D 2 E implemention-dependent F EFF) ++ (create-foo 10 'bee 'see :d 'dee) ++ => #S(FOO A 10 B BEE C SEE D DEE E implemention-dependent F EFF) ++ ++ If keyword arguments of the form ((key var) [default [svar]]) are ++specified, the slot name is matched with var (not key). ++ ++ The actions taken in the b and e cases were carefully chosen to allow ++the user to specify all possible behaviors. The &aux variables can be ++used to completely override the default initializations given in the ++body. ++ ++ If no default value is supplied for an aux variable variable, the ++consequences are undefined if an attempt is later made to read the ++corresponding slot's value before a value is explicitly assigned. If ++such a slot has a :type option specified, this suppressed initialization ++does not imply a type mismatch situation; the declared type is only ++required to apply when the slot is finally assigned. ++ ++ With this definition, the following can be written: ++ ++ (create-foo 1 2) ++ ++ instead of ++ ++ (make-foo :a 1 :b 2) ++ ++ and create-foo provides defaulting different from that of make-foo. ++ ++ Additional arguments that do not correspond to slot names but are ++merely present to supply values used in subsequent initialization ++computations are allowed. For example, in the definition ++ ++ (defstruct (frob (:constructor create-frob ++ (a &key (b 3 have-b) (c-token 'c) ++ (c (list c-token (if have-b 7 2)))))) ++ a b c) ++ ++ the c-token argument is used merely to supply a value used in the ++initialization of the c slot. The supplied-p parameters associated with ++optional parameters and keyword parameters might also be used this way. ++ ++ ++File: gcl.info, Node: Defsetf Lambda Lists, Next: Deftype Lambda Lists, Prev: Boa Lambda Lists, Up: Lambda Lists ++ ++3.4.7 Defsetf Lambda Lists ++-------------------------- ++ ++A defsetf lambda list is used by defsetf. ++ ++ A defsetf lambda list has the following syntax: ++ ++ lambda-list ::=({var}* ++ [&optional {var | (var [init-form [supplied-p-parameter]])}*] ++ [&rest var] ++ [&key {var | ({var | (keyword-name var)} [init-form [supplied-p-parameter]])}* pt [&allow-other-keys]] ++ [&environment var] ++ ++ A defsetf lambda list can contain the lambda list keywords shown in ++Figure 3-19. ++ ++ &allow-other-keys &key &rest ++ &environment &optional ++ ++ Figure 3-19: Lambda List Keywords used by Defsetf Lambda Lists ++ ++ ++ A defsetf lambda list differs from an ordinary lambda list only in ++that it does not permit the use of &aux, and that it permits use of ++&environment, which introduces an environment parameter. ++ ++ ++File: gcl.info, Node: Deftype Lambda Lists, Next: Define-modify-macro Lambda Lists, Prev: Defsetf Lambda Lists, Up: Lambda Lists ++ ++3.4.8 Deftype Lambda Lists ++-------------------------- ++ ++A deftype lambda list is used by deftype. ++ ++ A deftype lambda list has the same syntax as a macro lambda list, and ++can therefore contain the lambda list keywords as a macro lambda list. ++ ++ A deftype lambda list differs from a macro lambda list only in that ++if no init-form is supplied for an optional parameter or keyword ++parameter in the lambda-list, the default value for that parameter is ++the symbol * (rather than nil). ++ ++ ++File: gcl.info, Node: Define-modify-macro Lambda Lists, Next: Define-method-combination Arguments Lambda Lists, Prev: Deftype Lambda Lists, Up: Lambda Lists ++ ++3.4.9 Define-modify-macro Lambda Lists ++-------------------------------------- ++ ++A define-modify-macro lambda list is used by define-modify-macro. ++ ++ A define-modify-macro lambda list can contain the lambda list ++keywords shown in Figure 3-20. ++ ++ &optional &rest ++ ++ Figure 3-20: Lambda List Keywords used by Define-modify-macro Lambda Lists ++ ++ ++ Define-modify-macro lambda lists are similar to ordinary lambda ++lists, but do not support keyword arguments. define-modify-macro has no ++need match keyword arguments, and a rest parameter is sufficient. Aux ++variables are also not supported, since define-modify-macro has no body ++forms which could refer to such bindings. See the macro ++define-modify-macro. ++ ++ ++File: gcl.info, Node: Define-method-combination Arguments Lambda Lists, Next: Syntactic Interaction of Documentation Strings and Declarations, Prev: Define-modify-macro Lambda Lists, Up: Lambda Lists ++ ++3.4.10 Define-method-combination Arguments Lambda Lists ++------------------------------------------------------- ++ ++A define-method-combination arguments lambda list is used by the ++:arguments option to define-method-combination. ++ ++ A define-method-combination arguments lambda list can contain the ++lambda list keywords shown in Figure 3-21. ++ ++ &allow-other-keys &key &rest ++ &aux &optional &whole ++ ++ Figure 3-21: Lambda List Keywords used by Define-method-combination arguments Lambda Lists ++ ++ ++ Define-method-combination arguments lambda lists are similar to ++ordinary lambda lists, but also permit the use of &whole. ++ ++ ++File: gcl.info, Node: Syntactic Interaction of Documentation Strings and Declarations, Prev: Define-method-combination Arguments Lambda Lists, Up: Lambda Lists ++ ++3.4.11 Syntactic Interaction of Documentation Strings and Declarations ++---------------------------------------------------------------------- ++ ++In a number of situations, a documentation string can appear amidst a ++series of declare expressions prior to a series of forms. ++ ++ In that case, if a string S appears where a documentation string is ++permissible and is not followed by either a declare expression or a form ++then S is taken to be a form; otherwise, S is taken as a documentation ++string. The consequences are unspecified if more than one such ++documentation string is present. ++ ++ ++File: gcl.info, Node: Error Checking in Function Calls, Next: Traversal Rules and Side Effects, Prev: Lambda Lists, Up: Evaluation and Compilation ++ ++3.5 Error Checking in Function Calls ++==================================== ++ ++* Menu: ++ ++* Argument Mismatch Detection:: ++ ++ ++File: gcl.info, Node: Argument Mismatch Detection, Prev: Error Checking in Function Calls, Up: Error Checking in Function Calls ++ ++3.5.1 Argument Mismatch Detection ++--------------------------------- ++ ++* Menu: ++ ++* Safe and Unsafe Calls:: ++* Error Detection Time in Safe Calls:: ++* Too Few Arguments:: ++* Too Many Arguments:: ++* Unrecognized Keyword Arguments:: ++* Invalid Keyword Arguments:: ++* Odd Number of Keyword Arguments:: ++* Destructuring Mismatch:: ++* Errors When Calling a Next Method:: ++ ++ ++File: gcl.info, Node: Safe and Unsafe Calls, Next: Error Detection Time in Safe Calls, Prev: Argument Mismatch Detection, Up: Argument Mismatch Detection ++ ++3.5.1.1 Safe and Unsafe Calls ++............................. ++ ++A call is a safe call if each of the following is either safe code or ++system code (other than system code that results from macro expansion of ++programmer code): ++ ++* ++ the call. ++* ++ the definition of the function being called. ++* ++ the point of functional evaluation ++ ++ The following special cases require some elaboration: ++ ++* ++ If the function being called is a generic function, it is ++ considered safe if all of the following are ++ ++ safe code or system code: ++ ++ - ++ its definition (if it was defined explicitly). ++ - ++ the method definitions for all applicable methods. ++ - ++ the definition of its method combination. ++ ++* ++ For the form (coerce x 'function), where x is a lambda expression, ++ the value of the optimize quality safety in the global environment ++ at the time the coerce is executed applies to the resulting ++ function. ++ ++* ++ For a call to the function ensure-generic-function, the value of ++ the optimize quality safety in the environment object passed as the ++ :environment argument applies to the resulting generic function. ++ ++* ++ For a call to compile with a lambda expression as the argument, the ++ value of the optimize quality safety in the global environment at ++ the time compile is called applies to the resulting compiled ++ function. ++ ++* ++ For a call to compile with only one argument, if the original ++ definition of the function was safe, then the resulting compiled ++ function must also be safe. ++ ++* ++ A call to a method by call-next-method must be considered safe if ++ each of the following is ++ ++ safe code or system code: ++ ++ - ++ the definition of the generic function (if it was defined ++ explicitly). ++ - ++ the method definitions for all applicable methods. ++ - ++ the definition of the method combination. ++ - ++ the point of entry into the body of the method defining form, ++ where the binding of call-next-method is established. ++ - ++ the point of functional evaluation of the name ++ call-next-method. ++ ++ An unsafe call is a call that is not a safe call. ++ ++ The informal intent is that the programmer can rely on a call to be ++safe, even when system code is involved, if all reasonable steps have ++been taken to ensure that the call is safe. For example, if a ++programmer calls mapcar from safe code and supplies a function that was ++compiled as safe, the implementation is required to ensure that mapcar ++makes a safe call as well. ++ ++ ++File: gcl.info, Node: Error Detection Time in Safe Calls, Next: Too Few Arguments, Prev: Safe and Unsafe Calls, Up: Argument Mismatch Detection ++ ++3.5.1.2 Error Detection Time in Safe Calls ++.......................................... ++ ++If an error is signaled in a safe call, the exact point of the signal is ++implementation-dependent. In particular, it might be signaled at ++compile time or at run time, and if signaled at run time, it might be ++prior to, during, or after executing the call. However, it is always ++prior to the execution of the body of the function being called. ++ ++ ++File: gcl.info, Node: Too Few Arguments, Next: Too Many Arguments, Prev: Error Detection Time in Safe Calls, Up: Argument Mismatch Detection ++ ++3.5.1.3 Too Few Arguments ++......................... ++ ++It is not permitted to supply too few arguments to a function. Too few ++arguments means fewer arguments than the number of required parameters ++for the function. ++ ++ If this situation occurs in a safe call, ++ ++ an error of type program-error must be signaled; and in an unsafe ++call the situation has undefined consequences. ++ ++ ++File: gcl.info, Node: Too Many Arguments, Next: Unrecognized Keyword Arguments, Prev: Too Few Arguments, Up: Argument Mismatch Detection ++ ++3.5.1.4 Too Many Arguments ++.......................... ++ ++It is not permitted to supply too many arguments to a function. Too ++many arguments means more arguments than the number of required ++parameters plus the number of optional parameters; however, if the ++function uses &rest or &key, it is not possible for it to receive too ++many arguments. ++ ++ If this situation occurs in a safe call, ++ ++ an error of type program-error must be signaled; and in an unsafe ++call the situation has undefined consequences. ++ ++ ++File: gcl.info, Node: Unrecognized Keyword Arguments, Next: Invalid Keyword Arguments, Prev: Too Many Arguments, Up: Argument Mismatch Detection ++ ++3.5.1.5 Unrecognized Keyword Arguments ++...................................... ++ ++It is not permitted to supply a keyword argument to a function using a ++name that is not recognized by that function unless keyword argument ++checking is suppressed as described in *note Suppressing Keyword ++Argument Checking::. ++ ++ If this situation occurs in a safe call, ++ ++ an error of type program-error must be signaled; and in an unsafe ++call the situation has undefined consequences. ++ ++ ++File: gcl.info, Node: Invalid Keyword Arguments, Next: Odd Number of Keyword Arguments, Prev: Unrecognized Keyword Arguments, Up: Argument Mismatch Detection ++ ++3.5.1.6 Invalid Keyword Arguments ++................................. ++ ++It is not permitted to supply a keyword argument to a function using a ++name that is not a symbol. ++ ++ If this situation occurs in a safe call, ++ ++ an error of type program-error must be signaled unless keyword ++argument checking is suppressed as described in *note Suppressing ++Keyword Argument Checking::; and in an unsafe call the situation has ++undefined consequences. ++ ++ ++File: gcl.info, Node: Odd Number of Keyword Arguments, Next: Destructuring Mismatch, Prev: Invalid Keyword Arguments, Up: Argument Mismatch Detection ++ ++3.5.1.7 Odd Number of Keyword Arguments ++....................................... ++ ++An odd number of arguments must not be supplied for the keyword ++parameters. ++ ++ If this situation occurs in a safe call, ++ ++ an error of type program-error must be signaled unless keyword ++argument checking is suppressed as described in *note Suppressing ++Keyword Argument Checking::; and in an unsafe call the situation has ++undefined consequences. ++ ++ ++File: gcl.info, Node: Destructuring Mismatch, Next: Errors When Calling a Next Method, Prev: Odd Number of Keyword Arguments, Up: Argument Mismatch Detection ++ ++3.5.1.8 Destructuring Mismatch ++.............................. ++ ++When matching a destructuring lambda list against a form, the pattern ++and the form must have compatible tree structure, as described in *note ++Macro Lambda Lists::. ++ ++ Otherwise, in a safe call, an error of type program-error must be ++signaled; and in an unsafe call the situation has undefined ++consequences. ++ ++ ++File: gcl.info, Node: Errors When Calling a Next Method, Prev: Destructuring Mismatch, Up: Argument Mismatch Detection ++ ++3.5.1.9 Errors When Calling a Next Method ++......................................... ++ ++If call-next-method is called with arguments, the ordered set of ++applicable methods for the changed set of arguments for call-next-method ++must be the same as the ordered set of applicable methods for the ++original arguments to the generic function, or else an error should be ++signaled. ++ ++ The comparison between the set of methods applicable to the new ++arguments and the set applicable to the original arguments is ++insensitive to order differences among methods with the same ++specializers. ++ ++ If call-next-method is called with arguments that specify a different ++ordered set of applicable methods and there is no next method available, ++the test for different methods and the associated error signaling (when ++present) takes precedence over calling no-next-method. ++ ++ ++File: gcl.info, Node: Traversal Rules and Side Effects, Next: Destructive Operations, Prev: Error Checking in Function Calls, Up: Evaluation and Compilation ++ ++3.6 Traversal Rules and Side Effects ++==================================== ++ ++The consequences are undefined when code executed during an ++object-traversing operation destructively modifies the object in a way ++that might affect the ongoing traversal operation. In particular, the ++following rules apply. ++ ++List traversal ++ For list traversal operations, the cdr chain of the list is not ++ allowed to be destructively modified. ++ ++Array traversal ++ For array traversal operations, the array is not allowed to be ++ adjusted and its fill pointer, if any, is not allowed to be ++ changed. ++ ++Hash-table traversal ++ For hash table traversal operations, new elements may not be added ++ or deleted except that the element corresponding to the current ++ hash key may be changed or removed. ++ ++Package traversal ++ For package traversal operations (e.g., do-symbols), new symbols ++ may not be interned in or uninterned from the package being ++ traversed or any package that it uses except that the current ++ symbol may be uninterned from the package being traversed. ++ ++ ++File: gcl.info, Node: Destructive Operations, Next: Evaluation and Compilation Dictionary, Prev: Traversal Rules and Side Effects, Up: Evaluation and Compilation ++ ++3.7 Destructive Operations ++========================== ++ ++* Menu: ++ ++* Modification of Literal Objects:: ++* Transfer of Control during a Destructive Operation:: ++ ++ ++File: gcl.info, Node: Modification of Literal Objects, Next: Transfer of Control during a Destructive Operation, Prev: Destructive Operations, Up: Destructive Operations ++ ++3.7.1 Modification of Literal Objects ++------------------------------------- ++ ++The consequences are undefined if literal objects are destructively ++modified. For this purpose, the following operations are considered ++destructive: ++ ++random-state ++ Using it as an argument to the function random. ++ ++cons ++ Changing the car_1 or cdr_1 of the cons, or performing a ++ destructive operation on an object which is either the car_2 or the ++ cdr_2 of the cons. ++ ++array ++ Storing a new value into some element of the array, or performing a ++ destructive operation on an object that is already such an element. ++ ++ Changing the fill pointer, dimensions, or displacement of the array ++ (regardless of whether the array is actually adjustable). ++ ++ Performing a destructive operation on another array that is ++ displaced to the array or that otherwise shares its contents with ++ the array. ++ ++hash-table ++ Performing a destructive operation on any key. ++ ++ Storing a new value_4 for any key, or performing a destructive ++ operation on any object that is such a value. ++ ++ Adding or removing entries from the hash table. ++ ++structure-object ++ Storing a new value into any slot, or performing a destructive ++ operation on an object that is the value of some slot. ++ ++standard-object ++ Storing a new value into any slot, or performing a destructive ++ operation on an object that is the value of some slot. ++ ++ Changing the class of the object (e.g., using the function ++ change-class). ++ ++readtable ++ Altering the readtable case. ++ ++ Altering the syntax type of any character in this readtable. ++ ++ Altering the reader macro function associated with any character in ++ the readtable, or altering the reader macro functions associated ++ with characters defined as dispatching macro characters in the ++ readtable. ++ ++stream ++ Performing I/O operations on the stream, or closing the stream. ++ ++All other standardized types ++ [This category includes, for example, character, condition, ++ function, method-combination, method, number, package, pathname, ++ restart, and symbol.] ++ ++ There are no standardized destructive operations defined on objects ++ of these types. ++ ++ ++File: gcl.info, Node: Transfer of Control during a Destructive Operation, Prev: Modification of Literal Objects, Up: Destructive Operations ++ ++3.7.2 Transfer of Control during a Destructive Operation ++-------------------------------------------------------- ++ ++Should a transfer of control out of a destructive operation occur (e.g., ++due to an error) the state of the object being modified is ++implementation-dependent. ++ ++* Menu: ++ ++* Examples of Transfer of Control during a Destructive Operation:: ++ ++ ++File: gcl.info, Node: Examples of Transfer of Control during a Destructive Operation, Prev: Transfer of Control during a Destructive Operation, Up: Transfer of Control during a Destructive Operation ++ ++3.7.2.1 Examples of Transfer of Control during a Destructive Operation ++...................................................................... ++ ++The following examples illustrate some of the many ways in which the ++implementation-dependent nature of the modification can manifest itself. ++ ++ (let ((a (list 2 1 4 3 7 6 'five))) ++ (ignore-errors (sort a #'<)) ++ a) ++ => (1 2 3 4 6 7 FIVE) ++ OR=> (2 1 4 3 7 6 FIVE) ++ OR=> (2) ++ ++ (prog foo ((a (list 1 2 3 4 5 6 7 8 9 10))) ++ (sort a #'(lambda (x y) (if (zerop (random 5)) (return-from foo a) (> x y))))) ++ => (1 2 3 4 5 6 7 8 9 10) ++ OR=> (3 4 5 6 2 7 8 9 10 1) ++ OR=> (1 2 4 3) ++ ++ ++File: gcl.info, Node: Evaluation and Compilation Dictionary, Prev: Destructive Operations, Up: Evaluation and Compilation ++ ++3.8 Evaluation and Compilation Dictionary ++========================================= ++ ++* Menu: ++ ++* lambda (Symbol):: ++* lambda:: ++* compile:: ++* eval:: ++* eval-when:: ++* load-time-value:: ++* quote:: ++* compiler-macro-function:: ++* define-compiler-macro:: ++* defmacro:: ++* macro-function:: ++* macroexpand:: ++* define-symbol-macro:: ++* symbol-macrolet:: ++* *macroexpand-hook*:: ++* proclaim:: ++* declaim:: ++* declare:: ++* ignore:: ++* dynamic-extent:: ++* type:: ++* inline:: ++* ftype:: ++* declaration:: ++* optimize:: ++* special:: ++* locally:: ++* the:: ++* special-operator-p:: ++* constantp:: ++ ++ ++File: gcl.info, Node: lambda (Symbol), Next: lambda, Prev: Evaluation and Compilation Dictionary, Up: Evaluation and Compilation Dictionary ++ ++3.8.1 lambda [Symbol] ++--------------------- ++ ++Syntax:: ++........ ++ ++'lambda' lambda-list [[{declaration}* | documentation]] {form}* ++ ++Arguments:: ++........... ++ ++lambda-list--an ordinary lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ form--a form. ++ ++Description:: ++............. ++ ++A lambda expression is a list that can be used in place of a function ++name in certain contexts to denote a function by directly describing its ++behavior rather than indirectly by referring to the name of an ++established function. ++ ++ Documentation is attached to the denoted function (if any is actually ++created) as a documentation string. ++ ++See Also:: ++.......... ++ ++function, *note documentation:: , *note Lambda Expressions::, *note ++Lambda Forms::, *note Syntactic Interaction of Documentation Strings and ++Declarations:: ++ ++Notes:: ++....... ++ ++The lambda form ++ ++ ((lambda lambda-list . body) . arguments) ++ ++ is semantically equivalent to the function form ++ ++ (funcall #'(lambda lambda-list . body) . arguments) ++ ++ ++File: gcl.info, Node: lambda, Next: compile, Prev: lambda (Symbol), Up: Evaluation and Compilation Dictionary ++ ++3.8.2 lambda [Macro] ++-------------------- ++ ++'lambda' lambda-list [[{declaration}* | documentation]] {form}* => ++function ++ ++Arguments and Values:: ++...................... ++ ++lambda-list--an ordinary lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ form--a form. ++ ++ function--a function. ++ ++Description:: ++............. ++ ++Provides a shorthand notation for a function special form involving a ++lambda expression such that: ++ ++ (lambda lambda-list [[{declaration}* | documentation]] {form}*) ++ == (function (lambda lambda-list [[{declaration}* | documentation]] {form}*)) ++ == #'(lambda lambda-list [[{declaration}* | documentation]] {form}*) ++ ++Examples:: ++.......... ++ ++ (funcall (lambda (x) (+ x 3)) 4) => 7 ++ ++See Also:: ++.......... ++ ++lambda (symbol) ++ ++Notes:: ++....... ++ ++This macro could be implemented by: ++ ++ (defmacro lambda (&whole form &rest bvl-decls-and-body) ++ (declare (ignore bvl-decls-and-body)) ++ `#',form) ++ ++ ++File: gcl.info, Node: compile, Next: eval, Prev: lambda, Up: Evaluation and Compilation Dictionary ++ ++3.8.3 compile [Function] ++------------------------ ++ ++'compile' name &optional definition => function, warnings-p, failure-p ++ ++Arguments and Values:: ++...................... ++ ++name--a function name, or nil. ++ ++ definition--a lambda expression or a function. The default is the ++function definition of name if it names a function, or the macro ++function of name if it names a macro. The consequences are undefined if ++no definition is supplied when the name is nil. ++ ++ function--the function-name, ++ ++ or a compiled function. ++ ++ warnings-p--a generalized boolean. ++ ++ failure-p--a generalized boolean. ++ ++Description:: ++............. ++ ++Compiles an interpreted function. ++ ++ compile produces a compiled function from definition. If the ++definition is a lambda expression, it is coerced to a function. ++ ++ If the definition is already a compiled function, compile either ++produces that function itself (i.e., is an identity operation) or an ++equivalent function. ++ ++ [Editorial Note by KMP: There are a number of ambiguities here that ++still need resolution.] If the name is nil, the resulting compiled ++function is returned directly as the primary value. If a non-nil name ++is given, then the resulting compiled function replaces the existing ++function definition of name and the name is returned as the primary ++value; if name is a symbol that names a macro, its macro function is ++updated and the name is returned as the primary value. ++ ++ Literal objects appearing in code processed by the compile function ++are neither copied nor coalesced. The code resulting from the execution ++of compile references objects that are eql to the corresponding objects ++in the source code. ++ ++ compile is permitted, but not required, to establish a handler for ++conditions of type error. For example, the handler might issue a ++warning and restart compilation from some implementation-dependent point ++in order to let the compilation proceed without manual intervention. ++ ++ The secondary value, warnings-p, is false if no conditions of type ++error or warning were detected by the compiler, and true otherwise. ++ ++ The tertiary value, failure-p, is false if no conditions of type ++error or warning (other than style-warning) were detected by the ++compiler, and true otherwise. ++ ++Examples:: ++.......... ++ ++ (defun foo () "bar") => FOO ++ (compiled-function-p #'foo) => implementation-dependent ++ (compile 'foo) => FOO ++ (compiled-function-p #'foo) => true ++ (setf (symbol-function 'foo) ++ (compile nil '(lambda () "replaced"))) => # ++ (foo) => "replaced" ++ ++Affected By:: ++............. ++ ++*error-output*, ++ ++ *macroexpand-hook*. ++ ++ The presence of macro definitions and proclamations. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if the lexical environment surrounding ++the function to be compiled contains any bindings other than those for ++macros, symbol macros, or declarations. ++ ++ For information about errors detected during the compilation process, ++see *note Exceptional Situations in the Compiler::. ++ ++See Also:: ++.......... ++ ++*note compile-file:: ++ ++ ++File: gcl.info, Node: eval, Next: eval-when, Prev: compile, Up: Evaluation and Compilation Dictionary ++ ++3.8.4 eval [Function] ++--------------------- ++ ++'eval' form => {result}* ++ ++Arguments and Values:: ++...................... ++ ++form--a form. ++ ++ results--the values yielded by the evaluation of form. ++ ++Description:: ++............. ++ ++Evaluates form in the current dynamic environment and the null lexical ++environment. ++ ++ eval is a user interface to the evaluator. ++ ++ The evaluator expands macro calls as if through the use of ++macroexpand-1. ++ ++ Constants appearing in code processed by eval are not copied nor ++coalesced. The code resulting from the execution of eval references ++objects that are eql to the corresponding objects in the source code. ++ ++Examples:: ++.......... ++ ++ (setq form '(1+ a) a 999) => 999 ++ (eval form) => 1000 ++ (eval 'form) => (1+ A) ++ (let ((a '(this would break if eval used local value))) (eval form)) ++ => 1000 ++ ++See Also:: ++.......... ++ ++macroexpand-1, *note The Evaluation Model:: ++ ++Notes:: ++....... ++ ++To obtain the current dynamic value of a symbol, use of symbol-value is ++equivalent (and usually preferable) to use of eval. ++ ++ Note that an eval form involves two levels of evaluation for its ++argument. First, form is evaluated by the normal argument evaluation ++mechanism as would occur with any call. The object that results from ++this normal argument evaluation becomes the value of the form parameter, ++and is then evaluated as part of the eval form. For example: ++ ++ (eval (list 'cdr (car '((quote (a . b)) c)))) => b ++ ++ The argument form (list 'cdr (car '((quote (a . b)) c))) is evaluated ++in the usual way to produce the argument (cdr (quote (a . b))); eval ++then evaluates its argument, (cdr (quote (a . b))), to produce b. Since ++a single evaluation already occurs for any argument form in any function ++form, eval is sometimes said to perform "an extra level of evaluation." ++ ++ ++File: gcl.info, Node: eval-when, Next: load-time-value, Prev: eval, Up: Evaluation and Compilation Dictionary ++ ++3.8.5 eval-when [Special Operator] ++---------------------------------- ++ ++'eval-when' ({situation}*) {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++situation--One of the symbols :compile-toplevel , :load-toplevel , ++:execute , compile , load , or eval . ++ ++ The use of eval, compile, and load is deprecated. ++ ++ forms--an implicit progn. ++ ++ results--the values of the forms if they are executed, or nil if they ++are not. ++ ++Description:: ++............. ++ ++The body of an eval-when form is processed as an implicit progn, but ++only in the situations listed. ++ ++ The use of the situations :compile-toplevel (or compile) and ++:load-toplevel (or load) controls whether and when evaluation occurs ++when eval-when appears as a top level form in code processed by ++compile-file. See *note File Compilation::. ++ ++ The use of the situation :execute (or eval) controls whether ++evaluation occurs for other eval-when forms; that is, those that are not ++top level forms, or those in code processed by eval or compile. If the ++:execute situation is specified in such a form, then the body forms are ++processed as an implicit progn; otherwise, the eval-when form returns ++nil. ++ ++ eval-when normally appears as a top level form, but it is meaningful ++for it to appear as a non-top-level form. However, the compile-time ++side effects described in *note Compilation:: only take place when ++eval-when appears as a top level form. ++ ++Examples:: ++.......... ++ ++One example of the use of eval-when is that for the compiler to be able ++to read a file properly when it uses user-defined reader macros, it is ++necessary to write ++ ++ (eval-when (:compile-toplevel :load-toplevel :execute) ++ (set-macro-character #\$ #'(lambda (stream char) ++ (declare (ignore char)) ++ (list 'dollar (read stream))))) => T ++ ++ This causes the call to set-macro-character to be executed in the ++compiler's execution environment, thereby modifying its reader syntax ++table. ++ ++ ;;; The EVAL-WHEN in this case is not at toplevel, so only the :EXECUTE ++ ;;; keyword is considered. At compile time, this has no effect. ++ ;;; At load time (if the LET is at toplevel), or at execution time ++ ;;; (if the LET is embedded in some other form which does not execute ++ ;;; until later) this sets (SYMBOL-FUNCTION 'FOO1) to a function which ++ ;;; returns 1. ++ (let ((x 1)) ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (setf (symbol-function 'foo1) #'(lambda () x)))) ++ ++ ;;; If this expression occurs at the toplevel of a file to be compiled, ++ ;;; it has BOTH a compile time AND a load-time effect of setting ++ ;;; (SYMBOL-FUNCTION 'FOO2) to a function which returns 2. ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (let ((x 2)) ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (setf (symbol-function 'foo2) #'(lambda () x))))) ++ ++ ;;; If this expression occurs at the toplevel of a file to be compiled, ++ ;;; it has BOTH a compile time AND a load-time effect of setting the ++ ;;; function cell of FOO3 to a function which returns 3. ++ (eval-when (:execute :load-toplevel :compile-toplevel) ++ (setf (symbol-function 'foo3) #'(lambda () 3))) ++ ++ ;;; #4: This always does nothing. It simply returns NIL. ++ (eval-when (:compile-toplevel) ++ (eval-when (:compile-toplevel) ++ (print 'foo4))) ++ ++ ;;; If this form occurs at toplevel of a file to be compiled, FOO5 is ++ ;;; printed at compile time. If this form occurs in a non-top-level ++ ;;; position, nothing is printed at compile time. Regardless of context, ++ ;;; nothing is ever printed at load time or execution time. ++ (eval-when (:compile-toplevel) ++ (eval-when (:execute) ++ (print 'foo5))) ++ ++ ;;; If this form occurs at toplevel of a file to be compiled, FOO6 is ++ ;;; printed at compile time. If this form occurs in a non-top-level ++ ;;; position, nothing is printed at compile time. Regardless of context, ++ ;;; nothing is ever printed at load time or execution time. ++ (eval-when (:execute :load-toplevel) ++ (eval-when (:compile-toplevel) ++ (print 'foo6))) ++ ++See Also:: ++.......... ++ ++*note compile-file:: , *note Compilation:: ++ ++Notes:: ++....... ++ ++The following effects are logical consequences of the definition of ++eval-when: ++ ++* ++ Execution of a single eval-when expression executes the body code ++ at most once. ++ ++* ++ Macros intended for use in top level forms should be written so ++ that side-effects are done by the forms in the macro expansion. ++ The macro-expander itself should not do the side-effects. ++ ++ For example: ++ ++ Wrong: ++ ++ (defmacro foo () ++ (really-foo) ++ `(really-foo)) ++ ++ Right: ++ ++ (defmacro foo () ++ `(eval-when (:compile-toplevel :execute :load-toplevel) (really-foo))) ++ ++ Adherence to this convention means that such macros behave ++ intuitively when appearing as non-top-level forms. ++ ++* ++ Placing a variable binding around an eval-when reliably captures ++ the binding because the compile-time-too mode cannot occur (i.e., ++ introducing a variable binding means that the eval-when is not a ++ top level form). For example, ++ ++ (let ((x 3)) ++ (eval-when (:execute :load-toplevel :compile-toplevel) (print x))) ++ ++ prints 3 at execution (i.e., load) time, and does not print ++ anything at compile time. This is important so that expansions of ++ defun and defmacro can be done in terms of eval-when and can ++ correctly capture the lexical environment. ++ ++ (defun bar (x) (defun foo () (+ x 3))) ++ ++ might expand into ++ ++ (defun bar (x) ++ (progn (eval-when (:compile-toplevel) ++ (compiler::notice-function-definition 'foo '(x))) ++ (eval-when (:execute :load-toplevel) ++ (setf (symbol-function 'foo) #'(lambda () (+ x 3)))))) ++ ++ which would be treated by the above rules the same as ++ ++ (defun bar (x) ++ (setf (symbol-function 'foo) #'(lambda () (+ x 3)))) ++ ++ when the definition of bar is not a top level form. ++ ++ ++File: gcl.info, Node: load-time-value, Next: quote, Prev: eval-when, Up: Evaluation and Compilation Dictionary ++ ++3.8.6 load-time-value [Special Operator] ++---------------------------------------- ++ ++'load-time-value' form &optional read-only-p => object ++ ++Arguments and Values:: ++...................... ++ ++form--a form; evaluated as described below. ++ ++ read-only-p--a boolean; not evaluated. ++ ++ object--the primary value resulting from evaluating form. ++ ++Description:: ++............. ++ ++load-time-value provides a mechanism for delaying evaluation of form ++until the expression is in the run-time environment; see *note ++Compilation::. ++ ++ Read-only-p designates whether the result can be considered a ++constant object. If t, the result is a read-only quantity that can, if ++appropriate to the implementation, be copied into read-only space and/or ++coalesced with similar constant objects from other programs. If nil ++(the default), the result must be neither copied nor coalesced; it must ++be considered to be potentially modifiable data. ++ ++ If a load-time-value expression is processed by compile-file, the ++compiler performs its normal semantic processing (such as macro ++expansion and translation into machine code) on form, but arranges for ++the execution of form to occur at load time in a null lexical ++environment, with the result of this evaluation then being treated as a ++literal object at run time. It is guaranteed that the evaluation of ++form will take place only once when the file is loaded, but the order of ++evaluation with respect to the evaluation of top level forms in the file ++is implementation-dependent. ++ ++ If a load-time-value expression appears within a function compiled ++with compile, the form is evaluated at compile time in a null lexical ++environment. The result of this compile-time evaluation is treated as a ++literal object in the compiled code. ++ ++ If a load-time-value expression is processed by eval, form is ++evaluated in a null lexical environment, and one value is returned. ++Implementations that implicitly compile (or partially compile) ++expressions processed by eval might evaluate form only once, at the time ++this compilation is performed. ++ ++ If the same list (load-time-value form) is evaluated or compiled more ++than once, it is implementation-dependent whether form is evaluated only ++once or is evaluated more than once. This can happen both when an ++expression being evaluated or compiled shares substructure, and when the ++same form is processed by eval or compile multiple times. Since a ++load-time-value expression can be referenced in more than one place and ++can be evaluated multiple times by eval, it is implementation-dependent ++whether each execution returns a fresh object or returns the same object ++as some other execution. Users must use caution when destructively ++modifying the resulting object. ++ ++ If two lists (load-time-value form) that are the same under equal but ++are not identical are evaluated or compiled, their values always come ++from distinct evaluations of form. Their values may not be coalesced ++unless read-only-p is t. ++ ++Examples:: ++.......... ++ ++ ;;; The function INCR1 always returns the same value, even in different images. ++ ;;; The function INCR2 always returns the same value in a given image, ++ ;;; but the value it returns might vary from image to image. ++ (defun incr1 (x) (+ x #.(random 17))) ++ (defun incr2 (x) (+ x (load-time-value (random 17)))) ++ ++ ;;; The function FOO1-REF references the nth element of the first of ++ ;;; the *FOO-ARRAYS* that is available at load time. It is permissible for ++ ;;; that array to be modified (e.g., by SET-FOO1-REF); FOO1-REF will see the ++ ;;; updated values. ++ (defvar *foo-arrays* (list (make-array 7) (make-array 8))) ++ (defun foo1-ref (n) (aref (load-time-value (first *my-arrays*) nil) n)) ++ (defun set-foo1-ref (n val) ++ (setf (aref (load-time-value (first *my-arrays*) nil) n) val)) ++ ++ ;;; The function BAR1-REF references the nth element of the first of ++ ;;; the *BAR-ARRAYS* that is available at load time. The programmer has ++ ;;; promised that the array will be treated as read-only, so the system ++ ;;; can copy or coalesce the array. ++ (defvar *bar-arrays* (list (make-array 7) (make-array 8))) ++ (defun bar1-ref (n) (aref (load-time-value (first *my-arrays*) t) n)) ++ ++ ;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced ++ ;;; even though NIL was specified, because the object was already read-only ++ ;;; when it was written as a literal vector rather than created by a constructor. ++ ;;; User programs must treat the vector v as read-only. ++ (defun baz-ref (n) ++ (let ((v (load-time-value #(A B C) nil))) ++ (values (svref v n) v))) ++ ++ ;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced ++ ;;; even though NIL was specified in the outer situation because T was specified ++ ;;; in the inner situation. User programs must treat the vector v as read-only. ++ (defun baz-ref (n) ++ (let ((v (load-time-value (load-time-value (vector 1 2 3) t) nil))) ++ (values (svref v n) v))) ++ ++See Also:: ++.......... ++ ++*note compile-file:: , *note compile:: , *note eval:: , *note Minimal ++Compilation::, *note Compilation:: ++ ++Notes:: ++....... ++ ++load-time-value must appear outside of quoted structure in a "for ++evaluation" position. In situations which would appear to call for use ++of load-time-value within a quoted structure, the backquote reader macro ++is probably called for; see *note Backquote::. ++ ++ Specifying nil for read-only-p is not a way to force an object to ++become modifiable if it has already been made read-only. It is only a ++way to say that, for an object that is modifiable, this operation is not ++intended to make that object read-only. ++ ++ ++File: gcl.info, Node: quote, Next: compiler-macro-function, Prev: load-time-value, Up: Evaluation and Compilation Dictionary ++ ++3.8.7 quote [Special Operator] ++------------------------------ ++ ++'quote' object => object ++ ++Arguments and Values:: ++...................... ++ ++object--an object; not evaluated. ++ ++Description:: ++............. ++ ++The quote special operator just returns object. ++ ++ The consequences are undefined if literal objects (including quoted ++objects) are destructively modified. ++ ++Examples:: ++.......... ++ ++ (setq a 1) => 1 ++ (quote (setq a 3)) => (SETQ A 3) ++ a => 1 ++ 'a => A ++ ''a => (QUOTE A) ++ '''a => (QUOTE (QUOTE A)) ++ (setq a 43) => 43 ++ (list a (cons a 3)) => (43 (43 . 3)) ++ (list (quote a) (quote (cons a 3))) => (A (CONS A 3)) ++ 1 => 1 ++ '1 => 1 ++ "foo" => "foo" ++ '"foo" => "foo" ++ (car '(a b)) => A ++ '(car '(a b)) => (CAR (QUOTE (A B))) ++ #(car '(a b)) => #(CAR (QUOTE (A B))) ++ '#(car '(a b)) => #(CAR (QUOTE (A B))) ++ ++See Also:: ++.......... ++ ++*note Evaluation::, *note Single-Quote::, ++ ++ *note Compiler Terminology:: ++ ++Notes:: ++....... ++ ++The textual notation 'object is equivalent to (quote object); see *note ++Compiler Terminology::. ++ ++ Some objects, called self-evaluating objects, do not require ++quotation by quote. However, symbols and lists are used to represent ++parts of programs, and so would not be useable as constant data in a ++program without quote. Since quote suppresses the evaluation of these ++objects, they become data rather than program. ++ ++ ++File: gcl.info, Node: compiler-macro-function, Next: define-compiler-macro, Prev: quote, Up: Evaluation and Compilation Dictionary ++ ++3.8.8 compiler-macro-function [Accessor] ++---------------------------------------- ++ ++'compiler-macro-function' name &optional environment => function ++ ++ (setf (' compiler-macro-function' name &optional environment) ++new-function) ++ ++Arguments and Values:: ++...................... ++ ++name--a function name. ++ ++ environment--an environment object. ++ ++ function, new-function--a compiler macro function, or nil. ++ ++Description:: ++............. ++ ++Accesses the compiler macro function named name, if any, in the ++environment. ++ ++ A value of nil denotes the absence of a compiler macro function named ++name. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if environment is non-nil in a use of ++setf of compiler-macro-function. ++ ++See Also:: ++.......... ++ ++*note define-compiler-macro:: , *note Compiler Macros:: ++ ++ ++File: gcl.info, Node: define-compiler-macro, Next: defmacro, Prev: compiler-macro-function, Up: Evaluation and Compilation Dictionary ++ ++3.8.9 define-compiler-macro [Macro] ++----------------------------------- ++ ++'define-compiler-macro' name lambda-list [[{declaration}* | ++documentation]] {form}* ++=> name ++ ++Arguments and Values:: ++...................... ++ ++name--a function name. ++ ++ lambda-list--a macro lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ form--a form. ++ ++Description:: ++............. ++ ++[Editorial Note by KMP: This definition probably needs to be fully ++expanded to not refer through the definition of defmacro, but should ++suffice for now.] ++ ++ This is the normal mechanism for defining a compiler macro function. ++Its manner of definition is the same as for defmacro; the only ++differences are: ++ ++* ++ The name can be a function name naming any function or macro. ++ ++* ++ The expander function is installed as a compiler macro function for ++ the name, rather than as a macro function. ++ ++* ++ The &whole argument is bound to the form argument that is passed to ++ the compiler macro function. The remaining lambda-list parameters ++ are specified as if this form contained the function name in the ++ car and the actual arguments in the cdr, but if the car of the ++ actual form is the symbol funcall, then the destructuring of the ++ arguments is actually performed using its cddr instead. ++ ++* ++ ++ Documentation is attached as a documentation string to name (as ++ kind compiler-macro) and to the compiler macro function. ++ ++* ++ Unlike an ordinary macro, a compiler macro can decline to provide ++ an expansion merely by returning a form that is the same as the ++ original (which can be obtained by using &whole). ++ ++Examples:: ++.......... ++ ++ (defun square (x) (expt x 2)) => SQUARE ++ (define-compiler-macro square (&whole form arg) ++ (if (atom arg) ++ `(expt ,arg 2) ++ (case (car arg) ++ (square (if (= (length arg) 2) ++ `(expt ,(nth 1 arg) 4) ++ form)) ++ (expt (if (= (length arg) 3) ++ (if (numberp (nth 2 arg)) ++ `(expt ,(nth 1 arg) ,(* 2 (nth 2 arg))) ++ `(expt ,(nth 1 arg) (* 2 ,(nth 2 arg)))) ++ form)) ++ (otherwise `(expt ,arg 2))))) => SQUARE ++ (square (square 3)) => 81 ++ (macroexpand '(square x)) => (SQUARE X), false ++ (funcall (compiler-macro-function 'square) '(square x) nil) ++ => (EXPT X 2) ++ (funcall (compiler-macro-function 'square) '(square (square x)) nil) ++ => (EXPT X 4) ++ (funcall (compiler-macro-function 'square) '(funcall #'square x) nil) ++ => (EXPT X 2) ++ ++ (defun distance-positional (x1 y1 x2 y2) ++ (sqrt (+ (expt (- x2 x1) 2) (expt (- y2 y1) 2)))) ++ => DISTANCE-POSITIONAL ++ (defun distance (&key (x1 0) (y1 0) (x2 x1) (y2 y1)) ++ (distance-positional x1 y1 x2 y2)) ++ => DISTANCE ++ (define-compiler-macro distance (&whole form ++ &rest key-value-pairs ++ &key (x1 0 x1-p) ++ (y1 0 y1-p) ++ (x2 x1 x2-p) ++ (y2 y1 y2-p) ++ &allow-other-keys ++ &environment env) ++ (flet ((key (n) (nth (* n 2) key-value-pairs)) ++ (arg (n) (nth (1+ (* n 2)) key-value-pairs)) ++ (simplep (x) ++ (let ((expanded-x (macroexpand x env))) ++ (or (constantp expanded-x env) ++ (symbolp expanded-x))))) ++ (let ((n (/ (length key-value-pairs) 2))) ++ (multiple-value-bind (x1s y1s x2s y2s others) ++ (loop for (key) on key-value-pairs by #'cddr ++ count (eq key ':x1) into x1s ++ count (eq key ':y1) into y1s ++ count (eq key ':x2) into x2s ++ count (eq key ':y1) into y2s ++ count (not (member key '(:x1 :x2 :y1 :y2))) ++ into others ++ finally (return (values x1s y1s x2s y2s others))) ++ (cond ((and (= n 4) ++ (eq (key 0) :x1) ++ (eq (key 1) :y1) ++ (eq (key 2) :x2) ++ (eq (key 3) :y2)) ++ `(distance-positional ,x1 ,y1 ,x2 ,y2)) ++ ((and (if x1-p (and (= x1s 1) (simplep x1)) t) ++ (if y1-p (and (= y1s 1) (simplep y1)) t) ++ (if x2-p (and (= x2s 1) (simplep x2)) t) ++ (if y2-p (and (= y2s 1) (simplep y2)) t) ++ (zerop others)) ++ `(distance-positional ,x1 ,y1 ,x2 ,y2)) ++ ((and (< x1s 2) (< y1s 2) (< x2s 2) (< y2s 2) ++ (zerop others)) ++ (let ((temps (loop repeat n collect (gensym)))) ++ `(let ,(loop for i below n ++ collect (list (nth i temps) (arg i))) ++ (distance ++ ,@(loop for i below n ++ append (list (key i) (nth i temps))))))) ++ (t form)))))) ++ => DISTANCE ++ (dolist (form ++ '((distance :x1 (setq x 7) :x2 (decf x) :y1 (decf x) :y2 (decf x)) ++ (distance :x1 (setq x 7) :y1 (decf x) :x2 (decf x) :y2 (decf x)) ++ (distance :x1 (setq x 7) :y1 (incf x)) ++ (distance :x1 (setq x 7) :y1 (incf x) :x1 (incf x)) ++ (distance :x1 a1 :y1 b1 :x2 a2 :y2 b2) ++ (distance :x1 a1 :x2 a2 :y1 b1 :y2 b2) ++ (distance :x1 a1 :y1 b1 :z1 c1 :x2 a2 :y2 b2 :z2 c2))) ++ (print (funcall (compiler-macro-function 'distance) form nil))) ++ |> (LET ((#:G6558 (SETQ X 7)) ++ |> (#:G6559 (DECF X)) ++ |> (#:G6560 (DECF X)) ++ |> (#:G6561 (DECF X))) ++ |> (DISTANCE :X1 #:G6558 :X2 #:G6559 :Y1 #:G6560 :Y2 #:G6561)) ++ |> (DISTANCE-POSITIONAL (SETQ X 7) (DECF X) (DECF X) (DECF X)) ++ |> (LET ((#:G6567 (SETQ X 7)) ++ |> (#:G6568 (INCF X))) ++ |> (DISTANCE :X1 #:G6567 :Y1 #:G6568)) ++ |> (DISTANCE :X1 (SETQ X 7) :Y1 (INCF X) :X1 (INCF X)) ++ |> (DISTANCE-POSITIONAL A1 B1 A2 B2) ++ |> (DISTANCE-POSITIONAL A1 B1 A2 B2) ++ |> (DISTANCE :X1 A1 :Y1 B1 :Z1 C1 :X2 A2 :Y2 B2 :Z2 C2) ++ => NIL ++ ++See Also:: ++.......... ++ ++*note compiler-macro-function:: , *note defmacro:: , *note ++documentation:: , *note Syntactic Interaction of Documentation Strings ++and Declarations:: ++ ++Notes:: ++....... ++ ++The consequences of writing a compiler macro definition for a function ++in the COMMON-LISP package are undefined; it is quite possible that in ++some implementations such an attempt would override an equivalent or ++equally important definition. In general, it is recommended that a ++programmer only write compiler macro definitions for functions he or she ++personally maintains-writing a compiler macro definition for a function ++maintained elsewhere is normally considered a violation of traditional ++rules of modularity and data abstraction. ++ ++ ++File: gcl.info, Node: defmacro, Next: macro-function, Prev: define-compiler-macro, Up: Evaluation and Compilation Dictionary ++ ++3.8.10 defmacro [Macro] ++----------------------- ++ ++'defmacro' name lambda-list [[{declaration}* | documentation]] {form}* ++=> name ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ lambda-list--a macro lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ form--a form. ++ ++Description:: ++............. ++ ++Defines name as a macro by associating a macro function with that name ++in the global environment. ++ ++ The macro function is defined in the same lexical environment in ++which the defmacro form appears. ++ ++ The parameter variables in lambda-list are bound to destructured ++portions of the macro call. ++ ++ The expansion function accepts two arguments, a form and an ++environment. The expansion function returns a form. The body of the ++expansion function is specified by forms. Forms are executed in order. ++The value of the last form executed is returned as the expansion of the ++macro. ++ ++ The body forms of the expansion function (but not the lambda-list) ++ ++ are implicitly enclosed in a block whose name is name. ++ ++ The lambda-list conforms to the requirements described in *note Macro ++Lambda Lists::. ++ ++ Documentation is attached as a documentation string to name (as kind ++function) and to the macro function. ++ ++ defmacro can be used to redefine a macro or to replace a function ++definition with a macro definition. ++ ++ Recursive expansion of the form returned must terminate, including ++the expansion of other macros which are subforms of other forms ++returned. ++ ++ The consequences are undefined if the result of fully macroexpanding ++a form contains any circular list structure except in literal objects. ++ ++ If a defmacro form appears as a top level form, the compiler must ++store the macro definition at compile time, so that occurrences of the ++macro later on in the file can be expanded correctly. Users must ensure ++that the body of the macro can be evaluated at compile time if it is ++referenced within the file being compiled. ++ ++Examples:: ++.......... ++ ++ (defmacro mac1 (a b) "Mac1 multiplies and adds" ++ `(+ ,a (* ,b 3))) => MAC1 ++ (mac1 4 5) => 19 ++ (documentation 'mac1 'function) => "Mac1 multiplies and adds" ++ (defmacro mac2 (&optional (a 2 b) (c 3 d) &rest x) `'(,a ,b ,c ,d ,x)) => MAC2 ++ (mac2 6) => (6 T 3 NIL NIL) ++ (mac2 6 3 8) => (6 T 3 T (8)) ++ (defmacro mac3 (&whole r a &optional (b 3) &rest x &key c (d a)) ++ `'(,r ,a ,b ,c ,d ,x)) => MAC3 ++ (mac3 1 6 :d 8 :c 9 :d 10) => ((MAC3 1 6 :D 8 :C 9 :D 10) 1 6 9 8 (:D 8 :C 9 :D 10)) ++ ++ The stipulation that an embedded destructuring lambda list is ++permitted only where ordinary lambda list syntax would permit a ++parameter name but not a list is made to prevent ambiguity. For ++example, the following is not valid: ++ ++ (defmacro loser (x &optional (a b &rest c) &rest z) ++ ...) ++ ++ because ordinary lambda list syntax does permit a list following ++&optional; the list (a b &rest c) would be interpreted as describing an ++optional parameter named a whose default value is that of the form b, ++with a supplied-p parameter named &rest (not valid), and an extraneous ++symbol c in the list (also not valid). An almost correct way to express ++this is ++ ++ (defmacro loser (x &optional ((a b &rest c)) &rest z) ++ ...) ++ ++ The extra set of parentheses removes the ambiguity. However, the ++definition is now incorrect because a macro call such as (loser (car ++pool)) would not provide any argument form for the lambda list (a b ++&rest c), and so the default value against which to match the lambda ++list would be nil because no explicit default value was specified. The ++consequences of this are unspecified since the empty list, nil, does not ++have forms to satisfy the parameters a and b. The fully correct ++definition would be either ++ ++ (defmacro loser (x &optional ((a b &rest c) '(nil nil)) &rest z) ++ ...) ++ ++ or ++ ++ (defmacro loser (x &optional ((&optional a b &rest c)) &rest z) ++ ...) ++ ++ These differ slightly: the first requires that if the macro call ++specifies a explicitly then it must also specify b explicitly, whereas ++the second does not have this requirement. For example, ++ ++ (loser (car pool) ((+ x 1))) ++ ++ would be a valid call for the second definition but not for the ++first. ++ ++ (defmacro dm1a (&whole x) `',x) ++ (macroexpand '(dm1a)) => (QUOTE (DM1A)) ++ (macroexpand '(dm1a a)) is an error. ++ ++ (defmacro dm1b (&whole x a &optional b) `'(,x ,a ,b)) ++ (macroexpand '(dm1b)) is an error. ++ (macroexpand '(dm1b q)) => (QUOTE ((DM1B Q) Q NIL)) ++ (macroexpand '(dm1b q r)) => (QUOTE ((DM1B Q R) Q R)) ++ (macroexpand '(dm1b q r s)) is an error. ++ ++ (defmacro dm2a (&whole form a b) `'(form ,form a ,a b ,b)) ++ (macroexpand '(dm2a x y)) => (QUOTE (FORM (DM2A X Y) A X B Y)) ++ (dm2a x y) => (FORM (DM2A X Y) A X B Y) ++ ++ (defmacro dm2b (&whole form a (&whole b (c . d) &optional (e 5)) ++ &body f &environment env) ++ ``(,',form ,,a ,',b ,',(macroexpand c env) ,',d ,',e ,',f)) ++ ;Note that because backquote is involved, implementations may differ ++ ;slightly in the nature (though not the functionality) of the expansion. ++ (macroexpand '(dm2b x1 (((incf x2) x3 x4)) x5 x6)) ++ => (LIST* '(DM2B X1 (((INCF X2) X3 X4)) ++ X5 X6) ++ X1 ++ '((((INCF X2) X3 X4)) (SETQ X2 (+ X2 1)) (X3 X4) 5 (X5 X6))), ++ T ++ (let ((x1 5)) ++ (macrolet ((segundo (x) `(cadr ,x))) ++ (dm2b x1 (((segundo x2) x3 x4)) x5 x6))) ++ => ((DM2B X1 (((SEGUNDO X2) X3 X4)) X5 X6) ++ 5 (((SEGUNDO X2) X3 X4)) (CADR X2) (X3 X4) 5 (X5 X6)) ++ ++See Also:: ++.......... ++ ++*note define-compiler-macro:: , ++ ++ *note destructuring-bind:: , *note documentation:: , *note ++macroexpand:: , *macroexpand-hook*, macrolet, *note macro-function:: , ++*note Evaluation::, *note Compilation::, *note Syntactic Interaction of ++Documentation Strings and Declarations:: ++ ++ ++File: gcl.info, Node: macro-function, Next: macroexpand, Prev: defmacro, Up: Evaluation and Compilation Dictionary ++ ++3.8.11 macro-function [Accessor] ++-------------------------------- ++ ++'macro-function' symbol &optional environment => function ++ ++ (setf (' macro-function' symbol &optional environment) new-function) ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ environment--an environment object. ++ ++ function--a macro function or nil. ++ ++ new-function--a macro function. ++ ++Description:: ++............. ++ ++Determines whether symbol has a function definition as a macro in the ++specified environment. ++ ++ If so, the macro expansion function, a function of two arguments, is ++returned. If symbol has no function definition in the lexical ++environment environment, or its definition is not a macro, ++macro-function returns nil. ++ ++ It is possible for both macro-function and ++ ++ special-operator-p ++ ++ to return true of symbol. The macro definition must be available for ++use by programs that understand only the standard Common Lisp special ++forms. ++ ++Examples:: ++.......... ++ ++ (defmacro macfun (x) '(macro-function 'macfun)) => MACFUN ++ (not (macro-function 'macfun)) => false ++ ++ (macrolet ((foo (&environment env) ++ (if (macro-function 'bar env) ++ ''yes ++ ''no))) ++ (list (foo) ++ (macrolet ((bar () :beep)) ++ (foo)))) ++ ++ => (NO YES) ++ ++Affected By:: ++............. ++ ++(setf macro-function), defmacro, and macrolet. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if environment is non-nil in a use of ++setf of macro-function. ++ ++See Also:: ++.......... ++ ++*note defmacro:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++setf can be used with macro-function to install a macro as a symbol's ++global function definition: ++ ++ (setf (macro-function symbol) fn) ++ ++ The value installed must be a function that accepts two arguments, ++the entire macro call and an environment, and computes the expansion for ++that call. Performing this operation causes symbol to have only that ++macro definition as its global function definition; any previous ++definition, whether as a macro or as a function, is lost. ++ ++ ++File: gcl.info, Node: macroexpand, Next: define-symbol-macro, Prev: macro-function, Up: Evaluation and Compilation Dictionary ++ ++3.8.12 macroexpand, macroexpand-1 [Function] ++-------------------------------------------- ++ ++'macroexpand' form &optional env => expansion, expanded-p ++ ++ 'macroexpand-' 1 => form &optional env expansion, expanded-p ++ ++Arguments and Values:: ++...................... ++ ++form--a form. ++ ++ env--an environment object. The default is nil. ++ ++ expansion--a form. ++ ++ expanded-p--a generalized boolean. ++ ++Description:: ++............. ++ ++macroexpand and macroexpand-1 expand macros. ++ ++ If form is a macro form, then macroexpand-1 expands the macro form ++call once. ++ ++ macroexpand repeatedly expands form until it is no longer a macro ++form. In effect, macroexpand calls macroexpand-1 repeatedly until the ++secondary value it returns is nil. ++ ++ If form is a macro form, then the expansion is a macro expansion and ++expanded-p is true. Otherwise, the expansion is the given form and ++expanded-p is false. ++ ++ Macro expansion is carried out as follows. Once macroexpand-1 has ++determined that the form is a macro form, it obtains an appropriate ++expansion function for the macro or symbol macro. The value of ++*macroexpand-hook* is ++ ++ coerced to a function and ++ ++ then called as a function of three arguments: the expansion function, ++the form, and the env. The value returned from this call is taken to be ++the expansion of the form. ++ ++ In addition to macro definitions in the global environment, any local ++macro definitions established within env by macrolet or symbol-macrolet ++are considered. If only form is supplied as an argument, then the ++environment is effectively null, and only global macro definitions as ++established by defmacro are considered. Macro definitions are shadowed ++by local function definitions. ++ ++Examples:: ++.......... ++ ++ (defmacro alpha (x y) `(beta ,x ,y)) => ALPHA ++ (defmacro beta (x y) `(gamma ,x ,y)) => BETA ++ (defmacro delta (x y) `(gamma ,x ,y)) => EPSILON ++ (defmacro expand (form &environment env) ++ (multiple-value-bind (expansion expanded-p) ++ (macroexpand form env) ++ `(values ',expansion ',expanded-p))) => EXPAND ++ (defmacro expand-1 (form &environment env) ++ (multiple-value-bind (expansion expanded-p) ++ (macroexpand-1 form env) ++ `(values ',expansion ',expanded-p))) => EXPAND-1 ++ ++ ;; Simple examples involving just the global environment ++ (macroexpand-1 '(alpha a b)) => (BETA A B), true ++ (expand-1 (alpha a b)) => (BETA A B), true ++ (macroexpand '(alpha a b)) => (GAMMA A B), true ++ (expand (alpha a b)) => (GAMMA A B), true ++ (macroexpand-1 'not-a-macro) => NOT-A-MACRO, false ++ (expand-1 not-a-macro) => NOT-A-MACRO, false ++ (macroexpand '(not-a-macro a b)) => (NOT-A-MACRO A B), false ++ (expand (not-a-macro a b)) => (NOT-A-MACRO A B), false ++ ++ ;; Examples involving lexical environments ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (macroexpand-1 '(alpha a b))) => (BETA A B), true ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (expand-1 (alpha a b))) => (DELTA A B), true ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (macroexpand '(alpha a b))) => (GAMMA A B), true ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (expand (alpha a b))) => (GAMMA A B), true ++ (macrolet ((beta (x y) `(epsilon ,x ,y))) ++ (expand (alpha a b))) => (EPSILON A B), true ++ (let ((x (list 1 2 3))) ++ (symbol-macrolet ((a (first x))) ++ (expand a))) => (FIRST X), true ++ (let ((x (list 1 2 3))) ++ (symbol-macrolet ((a (first x))) ++ (macroexpand 'a))) => A, false ++ (symbol-macrolet ((b (alpha x y))) ++ (expand-1 b)) => (ALPHA X Y), true ++ (symbol-macrolet ((b (alpha x y))) ++ (expand b)) => (GAMMA X Y), true ++ (symbol-macrolet ((b (alpha x y)) ++ (a b)) ++ (expand-1 a)) => B, true ++ (symbol-macrolet ((b (alpha x y)) ++ (a b)) ++ (expand a)) => (GAMMA X Y), true ++ ++ ;; Examples of shadowing behavior ++ (flet ((beta (x y) (+ x y))) ++ (expand (alpha a b))) => (BETA A B), true ++ (macrolet ((alpha (x y) `(delta ,x ,y))) ++ (flet ((alpha (x y) (+ x y))) ++ (expand (alpha a b)))) => (ALPHA A B), false ++ (let ((x (list 1 2 3))) ++ (symbol-macrolet ((a (first x))) ++ (let ((a x)) ++ (expand a)))) => A, false ++ ++Affected By:: ++............. ++ ++defmacro, setf of macro-function, macrolet, symbol-macrolet ++ ++See Also:: ++.......... ++ ++*macroexpand-hook*, *note defmacro:: , *note setf:: of *note ++macro-function:: , macrolet, *note symbol-macrolet:: , *note ++Evaluation:: ++ ++Notes:: ++....... ++ ++Neither macroexpand nor macroexpand-1 makes any explicit attempt to ++expand macro forms that are either subforms of the form or subforms of ++the expansion. Such expansion might occur implicitly, however, due to ++the semantics or implementation of the macro function. ++ ++ ++File: gcl.info, Node: define-symbol-macro, Next: symbol-macrolet, Prev: macroexpand, Up: Evaluation and Compilation Dictionary ++ ++3.8.13 define-symbol-macro [Macro] ++---------------------------------- ++ ++'define-symbol-macro' symbol expansion ++=> symbol ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ expansion--a form. ++ ++Description:: ++............. ++ ++Provides a mechanism for globally affecting the macro expansion of the ++indicated symbol. ++ ++ Globally establishes an expansion function for the symbol macro named ++by symbol. The only guaranteed property of an expansion function for a ++symbol macro is that when it is applied to the form and the environment ++it returns the correct expansion. (In particular, it is ++implementation-dependent whether the expansion is conceptually stored in ++the expansion function, the environment, or both.) ++ ++ Each global reference to symbol (i.e., not shadowed_2 by a binding ++for a variable or symbol macro named by the same symbol) is expanded by ++the normal macro expansion process; see *note Symbols as Forms::. The ++expansion of a symbol macro is subject to further macro expansion in the ++same lexical environment as the symbol macro reference, exactly ++analogous to normal macros. ++ ++ The consequences are unspecified if a special declaration is made for ++symbol while in the scope of this definition (i.e., when it is not ++shadowed_2 by a binding for a variable or symbol macro named by the same ++symbol). ++ ++ Any use of setq to set the value of the symbol while in the scope of ++this definition is treated as if it were a setf. psetq of symbol is ++treated as if it were a psetf, and multiple-value-setq is treated as if ++it were a setf of values. ++ ++ A binding for a symbol macro can be shadowed_2 by let or ++symbol-macrolet. ++ ++Examples:: ++.......... ++ ++ (defvar *things* (list 'alpha 'beta 'gamma)) => *THINGS* ++ ++ (define-symbol-macro thing1 (first *things*)) => THING1 ++ (define-symbol-macro thing2 (second *things*)) => THING2 ++ (define-symbol-macro thing3 (third *things*)) => THING3 ++ ++ thing1 => ALPHA ++ (setq thing1 'ONE) => ONE ++ *things* => (ONE BETA GAMMA) ++ (multiple-value-setq (thing2 thing3) (values 'two 'three)) => TWO ++ thing3 => THREE ++ *things* => (ONE TWO THREE) ++ ++ (list thing2 (let ((thing2 2)) thing2)) => (TWO 2) ++ ++Exceptional Situations:: ++........................ ++ ++If symbol is already defined as a global variable, an error of type ++program-error is signaled. ++ ++See Also:: ++.......... ++ ++*note symbol-macrolet:: , *note macroexpand:: ++ ++ ++File: gcl.info, Node: symbol-macrolet, Next: *macroexpand-hook*, Prev: define-symbol-macro, Up: Evaluation and Compilation Dictionary ++ ++3.8.14 symbol-macrolet [Special Operator] ++----------------------------------------- ++ ++'symbol-macrolet' ({(symbol expansion )}*) {declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ expansion--a form. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++symbol-macrolet provides a mechanism for affecting the macro expansion ++environment for symbols. ++ ++ symbol-macrolet lexically establishes expansion functions for each of ++the symbol macros named by symbols. ++ ++ The only guaranteed property of an expansion function for a symbol ++macro is that when it is applied to the form and the environment it ++returns the correct expansion. (In particular, it is ++implementation-dependent whether the expansion is conceptually stored in ++the expansion function, the environment, or both.) ++ ++ Each reference to symbol as a variable within the lexical scope of ++symbol-macrolet is expanded by the normal macro expansion process; see ++*note Symbols as Forms::. The expansion of a symbol macro is subject to ++further macro expansion in the same lexical environment as the symbol ++macro invocation, exactly analogous to normal macros. ++ ++ Exactly the same declarations are allowed as for let with one ++exception: symbol-macrolet signals an error if a special declaration ++names one of the symbols being defined by symbol-macrolet. ++ ++ When the forms of the symbol-macrolet form are expanded, any use of ++setq to set the value of one of the specified variables is treated as if ++it were a setf. psetq of a symbol defined as a symbol macro is treated ++as if it were a psetf, and multiple-value-setq is treated as if it were ++a setf of values. ++ ++ The use of symbol-macrolet can be shadowed by let. In other words, ++symbol-macrolet only substitutes for occurrences of symbol that would be ++in the scope of a lexical binding of symbol surrounding the forms. ++ ++Examples:: ++.......... ++ ++ ;;; The following is equivalent to ++ ;;; (list 'foo (let ((x 'bar)) x)), ++ ;;; not ++ ;;; (list 'foo (let (('foo 'bar)) 'foo)) ++ (symbol-macrolet ((x 'foo)) ++ (list x (let ((x 'bar)) x))) ++ => (foo bar) ++ NOT=> (foo foo) ++ ++ (symbol-macrolet ((x '(foo x))) ++ (list x)) ++ => ((FOO X)) ++ ++Exceptional Situations:: ++........................ ++ ++If an attempt is made to bind a symbol that is defined as a global ++variable, an error of type program-error is signaled. ++ ++ If declaration contains a special declaration that names one of the ++symbols being bound by symbol-macrolet, an error of type program-error ++is signaled. ++ ++See Also:: ++.......... ++ ++*note with-slots:: , *note macroexpand:: ++ ++Notes:: ++....... ++ ++The special form symbol-macrolet is the basic mechanism that is used to ++implement with-slots. ++ ++ If a symbol-macrolet form is a top level form, the forms are also ++processed as top level forms. See *note File Compilation::. ++ ++ ++File: gcl.info, Node: *macroexpand-hook*, Next: proclaim, Prev: symbol-macrolet, Up: Evaluation and Compilation Dictionary ++ ++3.8.15 *macroexpand-hook* [Variable] ++------------------------------------ ++ ++Value Type:: ++............ ++ ++a designator for a function of three arguments: a macro function, a ++macro form, and an environment object. ++ ++Initial Value:: ++............... ++ ++a designator for a function that is equivalent to the function funcall, ++but that might have additional implementation-dependent side-effects. ++ ++Description:: ++............. ++ ++Used as the expansion interface hook by macroexpand-1 to control the ++macro expansion process. When a macro form is to be expanded, this ++function is called with three arguments: the macro function, the macro ++form, and the environment in which the macro form is to be expanded. ++ ++ The environment object has dynamic extent; the consequences are ++undefined if the environment object is referred to outside the dynamic ++extent of the macro expansion function. ++ ++Examples:: ++.......... ++ ++ (defun hook (expander form env) ++ (format t "Now expanding: ~S~ ++ (funcall expander form env)) => HOOK ++ (defmacro machook (x y) `(/ (+ ,x ,y) 2)) => MACHOOK ++ (macroexpand '(machook 1 2)) => (/ (+ 1 2) 2), true ++ (let ((*macroexpand-hook* #'hook)) (macroexpand '(machook 1 2))) ++ |> Now expanding (MACHOOK 1 2) ++ => (/ (+ 1 2) 2), true ++ ++See Also:: ++.......... ++ ++*note macroexpand:: , macroexpand-1, *note funcall:: , *note ++Evaluation:: ++ ++Notes:: ++....... ++ ++The net effect of the chosen initial value is to just invoke the macro ++function, giving it the macro form and environment as its two arguments. ++ ++ Users or user programs can assign this variable to customize or trace ++the macro expansion mechanism. Note, however, that this variable is a ++global resource, potentially shared by multiple programs; as such, if ++any two programs depend for their correctness on the setting of this ++variable, those programs may not be able to run in the same Lisp image. ++For this reason, it is frequently best to confine its uses to debugging ++situations. ++ ++ Users who put their own function into *macroexpand-hook* should ++consider saving the previous value of the hook, and calling that value ++from their own. ++ ++ ++File: gcl.info, Node: proclaim, Next: declaim, Prev: *macroexpand-hook*, Up: Evaluation and Compilation Dictionary ++ ++3.8.16 proclaim [Function] ++-------------------------- ++ ++'proclaim' declaration-specifier => implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++declaration-specifier--a declaration specifier. ++ ++Description:: ++............. ++ ++Establishes the declaration specified by declaration-specifier in the ++global environment. ++ ++ Such a declaration, sometimes called a global declaration or a ++proclamation, is always in force unless locally shadowed. ++ ++ Names of variables and functions within declaration-specifier refer ++to dynamic variables and global function definitions, respectively. ++ ++ Figure 3-22 shows a list of declaration identifiers that can be used ++with proclaim. ++ ++ declaration inline optimize type ++ ftype notinline special ++ ++ Figure 3-22: Global Declaration Specifiers ++ ++ ++ An implementation is free to support other (implementation-defined) ++declaration identifiers as well. ++ ++Examples:: ++.......... ++ ++ (defun declare-variable-types-globally (type vars) ++ (proclaim `(type ,type ,@vars)) ++ type) ++ ++ ;; Once this form is executed, the dynamic variable *TOLERANCE* ++ ;; must always contain a float. ++ (declare-variable-types-globally 'float '(*tolerance*)) ++ => FLOAT ++ ++See Also:: ++.......... ++ ++*note declaim:: , declare, *note Compilation:: ++ ++Notes:: ++....... ++ ++Although the execution of a proclaim form has effects that might affect ++compilation, the compiler does not make any attempt to recognize and ++specially process proclaim forms. A proclamation such as the following, ++even if a top level form, does not have any effect until it is executed: ++ ++ (proclaim '(special *x*)) ++ ++ If compile time side effects are desired, eval-when may be useful. ++For example: ++ ++ (eval-when (:execute :compile-toplevel :load-toplevel) ++ (proclaim '(special *x*))) ++ ++ In most such cases, however, it is preferrable to use declaim for ++this purpose. ++ ++ Since proclaim forms are ordinary function forms, macro forms can ++expand into them. ++ ++ ++File: gcl.info, Node: declaim, Next: declare, Prev: proclaim, Up: Evaluation and Compilation Dictionary ++ ++3.8.17 declaim [Macro] ++---------------------- ++ ++'declaim' {declaration-specifier}* => implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++declaration-specifier--a declaration specifier; not evaluated. ++ ++Description:: ++............. ++ ++Establishes the declarations specified by the declaration-specifiers. ++ ++ If a use of this macro appears as a top level form in a file being ++processed by the file compiler, the proclamations are also made at ++compile-time. As with other defining macros, it is unspecified whether ++or not the compile-time side-effects of a declaim persist after the file ++has been compiled. ++ ++Examples:: ++.......... ++ ++See Also:: ++.......... ++ ++declare, *note proclaim:: ++ ++ ++File: gcl.info, Node: declare, Next: ignore, Prev: declaim, Up: Evaluation and Compilation Dictionary ++ ++3.8.18 declare [Symbol] ++----------------------- ++ ++Syntax:: ++........ ++ ++'declare' {declaration-specifier}* ++ ++Arguments:: ++........... ++ ++declaration-specifier--a declaration specifier; not evaluated. ++ ++Description:: ++............. ++ ++A declare expression, sometimes called a declaration, can occur only at ++the beginning of the bodies of certain forms; that is, it may be ++preceded only by other declare expressions, or by a documentation string ++if the context permits. ++ ++ A declare expression can occur in a lambda expression or in any of ++the forms listed in Figure 3-23. ++ ++ defgeneric do-external-symbols prog ++ define-compiler-macro do-symbols prog* ++ define-method-combination dolist restart-case ++ define-setf-expander dotimes symbol-macrolet ++ defmacro flet with-accessors ++ defmethod handler-case with-hash-table-iterator ++ defsetf labels with-input-from-string ++ deftype let with-open-file ++ defun let* with-open-stream ++ destructuring-bind locally with-output-to-string ++ do macrolet with-package-iterator ++ do* multiple-value-bind with-slots ++ do-all-symbols pprint-logical-block ++ ++ Figure 3-23: Standardized Forms In Which Declarations Can Occur ++ ++ ++ A declare expression can only occur where specified by the syntax of ++these forms. The consequences of attempting to evaluate a declare ++expression are undefined. In situations where such expressions can ++appear, explicit checks are made for their presence and they are never ++actually evaluated; it is for this reason that they are called "declare ++expressions" rather than "declare forms." ++ ++ Macro forms cannot expand into declarations; declare expressions must ++appear as actual subexpressions of the form to which they refer. ++ ++ Figure 3-24 shows a list of declaration identifiers that can be used ++with declare. ++ ++ dynamic-extent ignore optimize ++ ftype inline special ++ ignorable notinline type ++ ++ Figure 3-24: Local Declaration Specifiers ++ ++ ++ An implementation is free to support other (implementation-defined) ++declaration identifiers as well. ++ ++Examples:: ++.......... ++ ++ (defun nonsense (k x z) ++ (foo z x) ;First call to foo ++ (let ((j (foo k x)) ;Second call to foo ++ (x (* k k))) ++ (declare (inline foo) (special x z)) ++ (foo x j z))) ;Third call to foo ++ ++ In this example, the inline declaration applies only to the third ++call to foo, but not to the first or second ones. The special ++declaration of x causes let to make a dynamic binding for x, and causes ++the reference to x in the body of let to be a dynamic reference. The ++reference to x in the second call to foo is a local reference to the ++second parameter of nonsense. The reference to x in the first call to ++foo is a local reference, not a special one. The special declaration of ++z causes the reference to z in the third call to foo to be a dynamic ++reference; it does not refer to the parameter to nonsense named z, ++because that parameter binding has not been declared to be special. ++(The special declaration of z does not appear in the body of defun, but ++in an inner form, and therefore does not affect the binding of the ++parameter.) ++ ++Exceptional Situations:: ++........................ ++ ++The consequences of trying to use a declare expression as a form to be ++evaluated are undefined. ++ ++ [Editorial Note by KMP: Probably we need to say something here about ++ill-formed declare expressions.] ++ ++See Also:: ++.......... ++ ++*note proclaim:: , *note Type Specifiers::, declaration, dynamic-extent, ++ftype, ignorable, ignore, inline, notinline, optimize, type ++ ++ ++File: gcl.info, Node: ignore, Next: dynamic-extent, Prev: declare, Up: Evaluation and Compilation Dictionary ++ ++3.8.19 ignore, ignorable [Declaration] ++-------------------------------------- ++ ++Syntax:: ++........ ++ ++(ignore {var | (function fn)}*) ++ ++ (ignorable {var | (function fn)}*) ++ ++Arguments:: ++........... ++ ++var--a variable name. ++ ++ fn--a function name. ++ ++Valid Context:: ++............... ++ ++declaration ++ ++Binding Types Affected:: ++........................ ++ ++variable, function ++ ++Description:: ++............. ++ ++The ignore and ignorable declarations refer to for-value references to ++variable bindings for the vars and to function bindings for the fns. ++ ++ An ignore declaration specifies that for-value references to the ++indicated bindings will not occur within the scope of the declaration. ++Within the scope of such a declaration, it is desirable for a compiler ++to issue a warning about the presence of either a for-value reference to ++any var or fn, or a special declaration for any var. ++ ++ An ignorable declaration specifies that for-value references to the ++indicated bindings might or might not occur within the scope of the ++declaration. Within the scope of such a declaration, it is not ++desirable for a compiler to issue a warning about the presence or ++absence of either a for-value reference to any var or fn, or a special ++declaration for any var. ++ ++ When not within the scope of a ignore or ignorable declaration, it is ++desirable for a compiler to issue a warning about any var for which ++there is neither a for-value reference nor a special declaration, or ++about any fn for which there is no for-value reference. ++ ++ Any warning about a "used" or "unused" binding must be of type ++style-warning, and may not affect program semantics. ++ ++ The stream variables established by with-open-file, with-open-stream, ++with-input-from-string, and with-output-to-string, and all iteration ++variables are, by definition, always "used". Using (declare (ignore ++v)), for such a variable v has unspecified consequences. ++ ++See Also:: ++.......... ++ ++declare ++ ++ ++File: gcl.info, Node: dynamic-extent, Next: type, Prev: ignore, Up: Evaluation and Compilation Dictionary ++ ++3.8.20 dynamic-extent [Declaration] ++----------------------------------- ++ ++Syntax:: ++........ ++ ++(dynamic-extent [[{var}* | (function fn)*]]) ++ ++Arguments:: ++........... ++ ++var--a variable name. ++ ++ fn--a function name. ++ ++Valid Context:: ++............... ++ ++declaration ++ ++Binding Types Affected:: ++........................ ++ ++variable, function ++ ++Description:: ++............. ++ ++In some containing form, F, this declaration asserts for each var_i ++(which need not be bound by F), and for each value v_{ij} that var_i ++takes on, and for each object x_{ijk} that is an otherwise inaccessible ++part of v_{ij} at any time when v_{ij} becomes the value of var_i, that ++just after the execution of F terminates, x_{ijk} is either inaccessible ++(if F established a binding for var_i) or still an otherwise ++inaccessible part of the current value of var_i (if F did not establish ++a binding for var_i). ++ ++ The same relation holds for each fn_i, except that the bindings are ++in the function namespace. ++ ++ The compiler is permitted to use this information in any way that is ++appropriate to the implementation and that does not conflict with the ++semantics of Common Lisp. ++ ++ dynamic-extent declarations can be free declarations or bound ++declarations. ++ ++ The vars and fns named in a dynamic-extent declaration must not refer ++to symbol macro or macro bindings. ++ ++Examples:: ++.......... ++ ++Since stack allocation of the initial value entails knowing at the ++object's creation time that the object can be stack-allocated, it is not ++generally useful to make a dynamic-extent declaration for variables ++which have no lexically apparent initial value. For example, it is ++probably useful to write: ++ ++ (defun f () ++ (let ((x (list 1 2 3))) ++ (declare (dynamic-extent x)) ++ ...)) ++ ++ This would permit those compilers that wish to do so to stack ++allocate the list held by the local variable x. It is permissible, but ++in practice probably not as useful, to write: ++ ++ (defun g (x) (declare (dynamic-extent x)) ...) ++ (defun f () (g (list 1 2 3))) ++ ++ Most compilers would probably not stack allocate the argument to g in ++f because it would be a modularity violation for the compiler to assume ++facts about g from within f. Only an implementation that was willing to ++be responsible for recompiling f if the definition of g changed ++incompatibly could legitimately stack allocate the list argument to g in ++f. ++ ++ Here is another example: ++ ++ (declaim (inline g)) ++ (defun g (x) (declare (dynamic-extent x)) ...) ++ (defun f () (g (list 1 2 3))) ++ ++ (defun f () ++ (flet ((g (x) (declare (dynamic-extent x)) ...)) ++ (g (list 1 2 3)))) ++ ++ ++ In the previous example, some compilers might determine that ++optimization was possible and others might not. ++ ++ A variant of this is the so-called "stack allocated rest list" that ++can be achieved (in implementations supporting the optimization) by: ++ ++ (defun f (&rest x) ++ (declare (dynamic-extent x)) ++ ...) ++ ++ Note that although the initial value of x is not explicit, the f ++function is responsible for assembling the list x from the passed ++arguments, so the f function can be optimized by the compiler to ++construct a stack-allocated list instead of a heap-allocated list in ++implementations that support such. ++ ++ In the following example, ++ ++ (let ((x (list 'a1 'b1 'c1)) ++ (y (cons 'a2 (cons 'b2 (cons 'c2 nil))))) ++ (declare (dynamic-extent x y)) ++ ...) ++ ++ The otherwise inaccessible parts of x are three conses, and the ++otherwise inaccessible parts of y are three other conses. None of the ++symbols a1, b1, c1, a2, b2, c2, or nil is an otherwise inaccessible part ++of x or y because each is interned and hence accessible by the package ++(or packages) in which it is interned. However, if a freshly allocated ++uninterned symbol had been used, it would have been an otherwise ++inaccessible part of the list which contained it. ++ ++ ;; In this example, the implementation is permitted to stack allocate ++ ;; the list that is bound to X. ++ (let ((x (list 1 2 3))) ++ (declare (dynamic-extent x)) ++ (print x) ++ :done) ++ |> (1 2 3) ++ => :DONE ++ ++ ;; In this example, the list to be bound to L can be stack-allocated. ++ (defun zap (x y z) ++ (do ((l (list x y z) (cdr l))) ++ ((null l)) ++ (declare (dynamic-extent l)) ++ (prin1 (car l)))) => ZAP ++ (zap 1 2 3) ++ |> 123 ++ => NIL ++ ++ ;; Some implementations might open-code LIST-ALL-PACKAGES in a way ++ ;; that permits using stack allocation of the list to be bound to L. ++ (do ((l (list-all-packages) (cdr l))) ++ ((null l)) ++ (declare (dynamic-extent l)) ++ (let ((name (package-name (car l)))) ++ (when (string-search "COMMON-LISP" name) (print name)))) ++ |> "COMMON-LISP" ++ |> "COMMON-LISP-USER" ++ => NIL ++ ++ ;; Some implementations might have the ability to stack allocate ++ ;; rest lists. A declaration such as the following should be a cue ++ ;; to such implementations that stack-allocation of the rest list ++ ;; would be desirable. ++ (defun add (&rest x) ++ (declare (dynamic-extent x)) ++ (apply #'+ x)) => ADD ++ (add 1 2 3) => 6 ++ ++ (defun zap (n m) ++ ;; Computes (RANDOM (+ M 1)) at relative speed of roughly O(N). ++ ;; It may be slow, but with a good compiler at least it ++ ;; doesn't waste much heap storage. :-} ++ (let ((a (make-array n))) ++ (declare (dynamic-extent a)) ++ (dotimes (i n) ++ (declare (dynamic-extent i)) ++ (setf (aref a i) (random (+ i 1)))) ++ (aref a m))) => ZAP ++ (< (zap 5 3) 3) => true ++ ++ The following are in error, since the value of x is used outside of ++its extent: ++ ++ (length (list (let ((x (list 1 2 3))) ; Invalid ++ (declare (dynamic-extent x)) ++ x))) ++ ++ (progn (let ((x (list 1 2 3))) ; Invalid ++ (declare (dynamic-extent x)) ++ x) ++ nil) ++ ++See Also:: ++.......... ++ ++declare ++ ++Notes:: ++....... ++ ++The most common optimization is to stack allocate the initial value of ++the objects named by the vars. ++ ++ It is permissible for an implementation to simply ignore this ++declaration. ++ ++ ++File: gcl.info, Node: type, Next: inline, Prev: dynamic-extent, Up: Evaluation and Compilation Dictionary ++ ++3.8.21 type [Declaration] ++------------------------- ++ ++Syntax:: ++........ ++ ++(type typespec {var}*) ++ ++ (typespec {var}*) ++ ++Arguments:: ++........... ++ ++typespec--a type specifier. ++ ++ var--a variable name. ++ ++Valid Context:: ++............... ++ ++declaration or proclamation ++ ++Binding Types Affected:: ++........................ ++ ++variable ++ ++Description:: ++............. ++ ++Affects only variable bindings and specifies that the vars take on ++values only of the specified typespec. In particular, values assigned ++to the variables by setq, as well as the initial values of the vars must ++be of the specified typespec. type declarations never apply to function ++bindings (see ftype). ++ ++ A type declaration of a symbol defined by symbol-macrolet is ++equivalent to wrapping a the expression around the expansion of that ++symbol, ++ ++ although the symbol's macro expansion is not actually affected. ++ ++ The meaning of a type declaration is equivalent to changing each ++reference to a variable (var) within the scope of the declaration to ++(the typespec var), changing each expression assigned to the variable ++(new-value) within the scope of the declaration to (the typespec ++new-value), and executing (the typespec var) at the moment the scope of ++the declaration is entered. ++ ++ A type declaration is valid in all declarations. The interpretation ++of a type declaration is as follows: ++ ++1. ++ During the execution of any reference to the declared variable ++ within the scope of the declaration, the consequences are undefined ++ if the value of the declared variable is not of the declared type. ++ ++2. ++ During the execution of any setq of the declared variable within ++ the scope of the declaration, the consequences are undefined if the ++ newly assigned value of the declared variable is not of the ++ declared type. ++ ++3. ++ At the moment the scope of the declaration is entered, the ++ consequences are undefined if the value of the declared variable is ++ not of the declared type. ++ ++ A type declaration affects only variable references within its scope. ++ ++ If nested type declarations refer to the same variable, then the ++value of the variable must be a member of the intersection of the ++declared types. ++ ++ If there is a local type declaration for a dynamic variable, and ++there is also a global type proclamation for that same variable, then ++the value of the variable within the scope of the local declaration must ++be a member of the intersection of the two declared types. ++ ++ type declarations can be free declarations or bound declarations. ++ ++ A symbol cannot be both the name of a type and the name of a ++declaration. Defining a symbol as the name of a class, structure, ++condition, or type, when the symbol has been declared as a declaration ++name, or vice versa, signals an error. ++ ++ Within the lexical scope of an array type declaration, all references ++to array elements are assumed to satisfy the expressed array element ++type (as opposed to the upgraded array element type). A compiler can ++treat the code within the scope of the array type declaration as if each ++access of an array element were surrounded by an appropriate the form. ++ ++Examples:: ++.......... ++ ++ (defun f (x y) ++ (declare (type fixnum x y)) ++ (let ((z (+ x y))) ++ (declare (type fixnum z)) ++ z)) => F ++ (f 1 2) => 3 ++ ;; The previous definition of F is equivalent to ++ (defun f (x y) ++ ;; This declaration is a shorthand form of the TYPE declaration ++ (declare (fixnum x y)) ++ ;; To declare the type of a return value, it's not necessary to ++ ;; create a named variable. A THE special form can be used instead. ++ (the fixnum (+ x y))) => F ++ (f 1 2) => 3 ++ ++ (defvar *one-array* (make-array 10 :element-type '(signed-byte 5))) ++ (defvar *another-array* (make-array 10 :element-type '(signed-byte 8))) ++ ++ (defun frob (an-array) ++ (declare (type (array (signed-byte 5) 1) an-array)) ++ (setf (aref an-array 1) 31) ++ (setf (aref an-array 2) 127) ++ (setf (aref an-array 3) (* 2 (aref an-array 3))) ++ (let ((foo 0)) ++ (declare (type (signed-byte 5) foo)) ++ (setf foo (aref an-array 0)))) ++ ++ (frob *one-array*) ++ (frob *another-array*) ++ ++ The above definition of frob is equivalent to: ++ ++ (defun frob (an-array) ++ (setf (the (signed-byte 5) (aref an-array 1)) 31) ++ (setf (the (signed-byte 5) (aref an-array 2)) 127) ++ (setf (the (signed-byte 5) (aref an-array 3)) ++ (* 2 (the (signed-byte 5) (aref an-array 3)))) ++ (let ((foo 0)) ++ (declare (type (signed-byte 5) foo)) ++ (setf foo (the (signed-byte 5) (aref an-array 0))))) ++ ++ Given an implementation in which fixnums are 29 bits but fixnum ++arrays are upgraded to signed 32-bit arrays, the following could be ++compiled with all fixnum arithmetic: ++ ++ (defun bump-counters (counters) ++ (declare (type (array fixnum *) bump-counters)) ++ (dotimes (i (length counters)) ++ (incf (aref counters i)))) ++ ++See Also:: ++.......... ++ ++declare, *note declaim:: , *note proclaim:: ++ ++Notes:: ++....... ++ ++(typespec {var}*) is an abbreviation for (type typespec {var}*). ++ ++ A type declaration for the arguments to a function does not ++necessarily imply anything about the type of the result. The following ++function is not permitted to be compiled using implementation-dependent ++fixnum-only arithmetic: ++ ++ (defun f (x y) (declare (fixnum x y)) (+ x y)) ++ ++ To see why, consider (f most-positive-fixnum 1). Common Lisp defines ++that F must return a bignum here, rather than signal an error or produce ++a mathematically incorrect result. If you have special knowledge such ++"fixnum overflow" cases will not come up, you can declare the result ++value to be in the fixnum range, enabling some compilers to use more ++efficient arithmetic: ++ ++ (defun f (x y) ++ (declare (fixnum x y)) ++ (the fixnum (+ x y))) ++ ++ Note, however, that in the three-argument case, because of the ++possibility of an implicit intermediate value growing too large, the ++following will not cause implementation-dependent fixnum-only arithmetic ++to be used: ++ ++ (defun f (x y) ++ (declare (fixnum x y z)) ++ (the fixnum (+ x y z))) ++ ++ To see why, consider (f most-positive-fixnum 1 -1). Although the ++arguments and the result are all fixnums, an intermediate value is not a ++fixnum. If it is important that implementation-dependent fixnum-only ++arithmetic be selected in implementations that provide it, consider ++writing something like this instead: ++ ++ (defun f (x y) ++ (declare (fixnum x y z)) ++ (the fixnum (+ (the fixnum (+ x y)) z))) ++ ++ ++File: gcl.info, Node: inline, Next: ftype, Prev: type, Up: Evaluation and Compilation Dictionary ++ ++3.8.22 inline, notinline [Declaration] ++-------------------------------------- ++ ++Syntax:: ++........ ++ ++(inline {function-name}*) ++ ++ (notinline {function-name}*) ++ ++Arguments:: ++........... ++ ++function-name--a function name. ++ ++Valid Context:: ++............... ++ ++declaration or proclamation ++ ++Binding Types Affected:: ++........................ ++ ++function ++ ++Description:: ++............. ++ ++inline specifies that it is desirable for the compiler to produce inline ++calls to the functions named by function-names; that is, the code for a ++specified function-name ++ ++ should be integrated into the calling routine, appearing "in line" in ++place of a procedure call. A compiler is free to ignore this ++declaration. inline declarations never apply to variable bindings. ++ ++ If one of the functions mentioned has a lexically apparent local ++definition (as made by flet or labels), then the declaration applies to ++that local definition and not to the global function definition. ++ ++ While no conforming implementation is required to perform inline ++expansion of user-defined functions, those implementations that do ++attempt to recognize the following paradigm: ++ ++ To define a function f that is not inline by default but for which ++(declare (inline f)) will make f be locally inlined, the proper ++definition sequence is: ++ ++ (declaim (inline f)) ++ (defun f ...) ++ (declaim (notinline f)) ++ ++ The inline proclamation preceding the defun form ensures that the ++compiler has the opportunity save the information necessary for inline ++expansion, and the notinline proclamation following the defun form ++prevents f from being expanded inline everywhere. ++ ++ notinline specifies that it is ++ ++ undesirable to compile the functions named by function-names in-line. ++A compiler is not free to ignore this declaration; calls to the ++specified functions must be implemented as out-of-line subroutine calls. ++ ++ If one of the functions mentioned has a lexically apparent local ++definition (as made by flet or labels), then the declaration applies to ++that local definition and not to the global function definition. ++ ++ In the presence of a compiler macro definition for function-name, a ++notinline declaration prevents that ++ ++ compiler macro from being used. ++ ++ An inline declaration may be used to encourage use of compiler macro ++definitions. inline and notinline declarations otherwise have no effect ++when the lexically visible definition of function-name is a macro ++definition. ++ ++ inline and notinline declarations can be free declarations or bound ++declarations. inline and notinline declarations of functions that ++appear before the body of a flet or labels ++ ++ form that defines that function are bound declarations. Such ++declarations in other contexts are free declarations. ++ ++Examples:: ++.......... ++ ++ ;; The globally defined function DISPATCH should be open-coded, ++ ;; if the implementation supports inlining, unless a NOTINLINE ++ ;; declaration overrides this effect. ++ (declaim (inline dispatch)) ++ (defun dispatch (x) (funcall (get (car x) 'dispatch) x)) ++ ;; Here is an example where inlining would be encouraged. ++ (defun top-level-1 () (dispatch (read-command))) ++ ;; Here is an example where inlining would be prohibited. ++ (defun top-level-2 () ++ (declare (notinline dispatch)) ++ (dispatch (read-command))) ++ ;; Here is an example where inlining would be prohibited. ++ (declaim (notinline dispatch)) ++ (defun top-level-3 () (dispatch (read-command))) ++ ;; Here is an example where inlining would be encouraged. ++ (defun top-level-4 () ++ (declare (inline dispatch)) ++ (dispatch (read-command))) ++ ++See Also:: ++.......... ++ ++declare, *note declaim:: , *note proclaim:: ++ ++ ++File: gcl.info, Node: ftype, Next: declaration, Prev: inline, Up: Evaluation and Compilation Dictionary ++ ++3.8.23 ftype [Declaration] ++-------------------------- ++ ++Syntax:: ++........ ++ ++(ftype type {function-name}*) ++ ++Arguments:: ++........... ++ ++function-name--a function name. ++ ++ type--a type specifier. ++ ++Valid Context:: ++............... ++ ++declaration or proclamation ++ ++Binding Types Affected:: ++........................ ++ ++function ++ ++Description:: ++............. ++ ++Specifies that the functions named by function-names are of the ++functional type type. For example: ++ ++ (declare (ftype (function (integer list) t) ith) ++ (ftype (function (number) float) sine cosine)) ++ ++ If one of the functions mentioned has a lexically apparent local ++definition (as made by flet or labels), then the declaration applies to ++that local definition and not to the global function definition. ftype ++declarations never apply to variable bindings (see type). ++ ++ The lexically apparent bindings of function-names must not be macro ++definitions. (This is because ftype declares the functional definition ++of each function name to be of a particular subtype of function, and ++macros do not denote functions.) ++ ++ ftype ++ ++ declarations can be free declarations or bound declarations. ftype ++declarations of functions that appear before the body of a flet or ++labels ++ ++ form that defines that function are bound declarations. Such ++declarations in other contexts are free declarations. ++ ++See Also:: ++.......... ++ ++declare, *note declaim:: , *note proclaim:: ++ ++ ++File: gcl.info, Node: declaration, Next: optimize, Prev: ftype, Up: Evaluation and Compilation Dictionary ++ ++3.8.24 declaration [Declaration] ++-------------------------------- ++ ++Syntax:: ++........ ++ ++(declaration {name}*) ++ ++Arguments:: ++........... ++ ++name--a symbol. ++ ++Valid Context:: ++............... ++ ++proclamation only ++ ++Description:: ++............. ++ ++Advises the compiler that each name is a valid but potentially ++non-standard declaration name. The purpose of this is to tell one ++compiler not to issue warnings for declarations meant for another ++compiler or other program processor. ++ ++Examples:: ++.......... ++ ++ (declaim (declaration author target-language target-machine)) ++ (declaim (target-language ada)) ++ (declaim (target-machine IBM-650)) ++ (defun strangep (x) ++ (declare (author "Harry Tweeker")) ++ (member x '(strange weird odd peculiar))) ++ ++See Also:: ++.......... ++ ++*note declaim:: , *note proclaim:: ++ ++ ++File: gcl.info, Node: optimize, Next: special, Prev: declaration, Up: Evaluation and Compilation Dictionary ++ ++3.8.25 optimize [Declaration] ++----------------------------- ++ ++Syntax:: ++........ ++ ++(optimize {quality | (quality value)}*) ++ ++Arguments:: ++........... ++ ++quality--an optimize quality. ++ ++ value--one of the integers 0, 1, 2, or 3. ++ ++Valid Context:: ++............... ++ ++declaration or proclamation ++ ++Description:: ++............. ++ ++Advises the compiler that each quality should be given attention ++according to the specified corresponding value. Each quality must be a ++symbol naming an optimize quality; the names and meanings of the ++standard optimize qualities are shown in Figure 3-25. ++ ++ Name Meaning ++ compilation-speed speed of the compilation process ++ debug ease of debugging ++ safety run-time error checking ++ space both code size and run-time space ++ speed speed of the object code ++ ++ Figure 3-25: Optimize qualities ++ ++ ++ There may be other, implementation-defined optimize qualities. ++ ++ A value 0 means that the corresponding quality is totally ++unimportant, and 3 that the quality is extremely important; 1 and 2 are ++intermediate values, with 1 the neutral value. (quality 3) can be ++abbreviated to quality. ++ ++ Note that code which has the optimization (safety 3), or just safety, ++is called safe code. ++ ++ The consequences are unspecified if a quality appears more than once ++with different values. ++ ++Examples:: ++.......... ++ ++ (defun often-used-subroutine (x y) ++ (declare (optimize (safety 2))) ++ (error-check x y) ++ (hairy-setup x) ++ (do ((i 0 (+ i 1)) ++ (z x (cdr z))) ++ ((null z)) ++ ;; This inner loop really needs to burn. ++ (declare (optimize speed)) ++ (declare (fixnum i)) ++ )) ++ ++See Also:: ++.......... ++ ++declare, *note declaim:: , *note proclaim:: , *note Declaration Scope:: ++ ++Notes:: ++....... ++ ++An optimize declaration never applies to either a variable or a function ++binding. An optimize declaration can only be a free declaration. For ++more information, see *note Declaration Scope::. ++ ++ ++File: gcl.info, Node: special, Next: locally, Prev: optimize, Up: Evaluation and Compilation Dictionary ++ ++3.8.26 special [Declaration] ++---------------------------- ++ ++Syntax:: ++........ ++ ++(special {var}*) ++ ++Arguments:: ++........... ++ ++var--a symbol. ++ ++Valid Context:: ++............... ++ ++declaration or proclamation ++ ++Binding Types Affected:: ++........................ ++ ++variable ++ ++Description:: ++............. ++ ++Specifies that all of the vars named are dynamic. This specifier ++affects variable bindings and affects references. All variable bindings ++affected are made to be dynamic bindings, and affected variable ++references refer to the current dynamic binding. For example: ++ ++ (defun hack (thing *mod*) ;The binding of the parameter ++ (declare (special *mod*)) ; *mod* is visible to hack1, ++ (hack1 (car thing))) ; but not that of thing. ++ (defun hack1 (arg) ++ (declare (special *mod*)) ;Declare references to *mod* ++ ;within hack1 to be special. ++ (if (atom arg) *mod* ++ (cons (hack1 (car arg)) (hack1 (cdr arg))))) ++ ++ A special declaration does not affect inner bindings of a var; the ++inner bindings implicitly shadow a special declaration and must be ++explicitly re-declared to be special. special declarations never apply ++to function bindings. ++ ++ special declarations can be either bound declarations, affecting both ++a binding and references, or free declarations, affecting only ++references, depending on whether the declaration is attached to a ++variable binding. ++ ++ When used in a proclamation, a special declaration specifier applies ++to all bindings as well as to all references of the mentioned variables. ++For example, after ++ ++ (declaim (special x)) ++ ++ then in a function definition such as ++ ++ (defun example (x) ...) ++ ++ the parameter x is bound as a dynamic variable rather than as a ++lexical variable. ++ ++Examples:: ++.......... ++ ++ (defun declare-eg (y) ;this y is special ++ (declare (special y)) ++ (let ((y t)) ;this y is lexical ++ (list y ++ (locally (declare (special y)) y)))) ;this y refers to the ++ ;special binding of y ++ => DECLARE-EG ++ (declare-eg nil) => (T NIL) ++ ++ (setf (symbol-value 'x) 6) ++ (defun foo (x) ;a lexical binding of x ++ (print x) ++ (let ((x (1+ x))) ;a special binding of x ++ (declare (special x)) ;and a lexical reference ++ (bar)) ++ (1+ x)) ++ (defun bar () ++ (print (locally (declare (special x)) ++ x))) ++ (foo 10) ++ |> 10 ++ |> 11 ++ => 11 ++ ++ (setf (symbol-value 'x) 6) ++ (defun bar (x y) ;[1] 1st occurrence of x ++ (let ((old-x x) ;[2] 2nd occurrence of x -- same as 1st occurrence ++ (x y)) ;[3] 3rd occurrence of x ++ (declare (special x)) ++ (list old-x x))) ++ (bar 'first 'second) => (FIRST SECOND) ++ ++ (defun few (x &optional (y *foo*)) ++ (declare (special *foo*)) ++ ...) ++ ++ The reference to *foo* in the first line of this example is not ++special even though there is a special declaration in the second line. ++ ++ (declaim (special prosp)) => implementation-dependent ++ (setq prosp 1 reg 1) => 1 ++ (let ((prosp 2) (reg 2)) ;the binding of prosp is special ++ (set 'prosp 3) (set 'reg 3) ;due to the preceding proclamation, ++ (list prosp reg)) ;whereas the variable reg is lexical ++ => (3 2) ++ (list prosp reg) => (1 3) ++ ++ (declaim (special x)) ;x is always special. ++ (defun example (x y) ++ (declare (special y)) ++ (let ((y 3) (x (* x 2))) ++ (print (+ y (locally (declare (special y)) y))) ++ (let ((y 4)) (declare (special y)) (foo x)))) => EXAMPLE ++ ++ In the contorted code above, the outermost and innermost bindings of ++y are dynamic, but the middle binding is lexical. The two arguments to +++ are different, one being the value, which is 3, of the lexical ++variable y, and the other being the value of the dynamic variable named ++y (a binding of which happens, coincidentally, to lexically surround it ++at an outer level). All the bindings of x and references to x are ++dynamic, however, because of the proclamation that x is always special. ++ ++See Also:: ++.......... ++ ++*note defparameter:: , defvar ++ ++ ++File: gcl.info, Node: locally, Next: the, Prev: special, Up: Evaluation and Compilation Dictionary ++ ++3.8.27 locally [Special Operator] ++--------------------------------- ++ ++'locally' {declaration}* {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++Declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values of the forms. ++ ++Description:: ++............. ++ ++Sequentially evaluates a body of forms in a lexical environment where ++the given declarations have effect. ++ ++Examples:: ++.......... ++ ++ (defun sample-function (y) ;this y is regarded as special ++ (declare (special y)) ++ (let ((y t)) ;this y is regarded as lexical ++ (list y ++ (locally (declare (special y)) ++ ;; this next y is regarded as special ++ y)))) ++ => SAMPLE-FUNCTION ++ (sample-function nil) => (T NIL) ++ (setq x '(1 2 3) y '(4 . 5)) => (4 . 5) ++ ++ ;;; The following declarations are not notably useful in specific. ++ ;;; They just offer a sample of valid declaration syntax using LOCALLY. ++ (locally (declare (inline floor) (notinline car cdr)) ++ (declare (optimize space)) ++ (floor (car x) (cdr y))) => 0, 1 ++ ++ ;;; This example shows a definition of a function that has a particular set ++ ;;; of OPTIMIZE settings made locally to that definition. ++ (locally (declare (optimize (safety 3) (space 3) (speed 0))) ++ (defun frob (w x y &optional (z (foo x y))) ++ (mumble x y z w))) ++ => FROB ++ ++ ;;; This is like the previous example, except that the optimize settings ++ ;;; remain in effect for subsequent definitions in the same compilation unit. ++ (declaim (optimize (safety 3) (space 3) (speed 0))) ++ (defun frob (w x y &optional (z (foo x y))) ++ (mumble x y z w)) ++ => FROB ++ ++See Also:: ++.......... ++ ++declare ++ ++Notes:: ++....... ++ ++The special declaration may be used with locally to affect references ++to, rather than bindings of, variables. ++ ++ If a locally form is a top level form, the body forms are also ++processed as top level forms. See *note File Compilation::. ++ ++ ++File: gcl.info, Node: the, Next: special-operator-p, Prev: locally, Up: Evaluation and Compilation Dictionary ++ ++3.8.28 the [Special Operator] ++----------------------------- ++ ++'the' value-type form => {result}* ++ ++Arguments and Values:: ++...................... ++ ++value-type--a type specifier; not evaluated. ++ ++ form--a form; evaluated. ++ ++ results--the values resulting from the evaluation of form. These ++values must conform to the type supplied by value-type; see below. ++ ++Description:: ++............. ++ ++the specifies that the values_{1a} returned by form are of the types ++specified by value-type. The consequences are undefined if any result ++is not of the declared type. ++ ++ It is permissible for form to yield a different number of values than ++are specified by value-type, provided that the values for which types ++are declared are indeed of those types. Missing values are treated as ++nil for the purposes of checking their types. ++ ++ Regardless of number of values declared by value-type, the number of ++values returned by the the special form is the same as the number of ++values returned by form. ++ ++Examples:: ++.......... ++ ++ (the symbol (car (list (gensym)))) => #:G9876 ++ (the fixnum (+ 5 7)) => 12 ++ (the (values) (truncate 3.2 2)) => 1, 1.2 ++ (the integer (truncate 3.2 2)) => 1, 1.2 ++ (the (values integer) (truncate 3.2 2)) => 1, 1.2 ++ (the (values integer float) (truncate 3.2 2)) => 1, 1.2 ++ (the (values integer float symbol) (truncate 3.2 2)) => 1, 1.2 ++ (the (values integer float symbol t null list) ++ (truncate 3.2 2)) => 1, 1.2 ++ (let ((i 100)) ++ (declare (fixnum i)) ++ (the fixnum (1+ i))) => 101 ++ (let* ((x (list 'a 'b 'c)) ++ (y 5)) ++ (setf (the fixnum (car x)) y) ++ x) => (5 B C) ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if the values yielded by the form are not ++of the type specified by value-type. ++ ++See Also:: ++.......... ++ ++values ++ ++Notes:: ++....... ++ ++The values type specifier can be used to indicate the types of multiple ++values: ++ ++ (the (values integer integer) (floor x y)) ++ (the (values string t) ++ (gethash the-key the-string-table)) ++ ++ setf can be used with the type declarations. In this case the ++declaration is transferred to the form that specifies the new value. ++The resulting setf form is then analyzed. ++ ++ ++File: gcl.info, Node: special-operator-p, Next: constantp, Prev: the, Up: Evaluation and Compilation Dictionary ++ ++3.8.29 special-operator-p [Function] ++------------------------------------ ++ ++'special-operator-p' symbol => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if symbol is a special operator; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (special-operator-p 'if) => true ++ (special-operator-p 'car) => false ++ (special-operator-p 'one) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its argument is not a symbol. ++ ++Notes:: ++....... ++ ++Historically, this function was called special-form-p. The name was ++finally declared a misnomer and changed, since it returned true for ++special operators, not special forms. ++ ++ ++File: gcl.info, Node: constantp, Prev: special-operator-p, Up: Evaluation and Compilation Dictionary ++ ++3.8.30 constantp [Function] ++--------------------------- ++ ++'constantp' form &optional environment => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++form--a form. ++ ++ environment--an environment object. The default is nil. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if form can be determined by the implementation to be a ++constant form in the indicated environment; otherwise, it returns false ++indicating either that the form is not a constant form or that it cannot ++be determined whether or not form is a constant form. ++ ++ The following kinds of forms are considered constant forms: ++ ++* ++ Self-evaluating objects (such as numbers, characters, and the ++ various kinds of arrays) are always considered constant forms and ++ must be recognized as such by constantp. ++ ++* ++ Constant variables, such as keywords, symbols defined by Common ++ Lisp as constant (such as nil, t, and pi), and symbols declared as ++ constant by the user in the indicated environment using defconstant ++ are always considered constant forms and must be recognized as such ++ by constantp. ++ ++* ++ quote forms are always considered constant forms and must be ++ recognized as such by constantp. ++ ++* ++ An implementation is permitted, but not required, to detect ++ additional constant forms. If it does, it is also permitted, but ++ not required, to make use of information in the environment. ++ Examples of constant forms for which constantp might or might not ++ return true are: (sqrt pi), (+ 3 2), (length '(a b c)), and (let ++ ((x 7)) (zerop x)). ++ ++ If an implementation chooses to make use of the environment ++information, such actions as expanding macros or performing function ++inlining are permitted to be used, but not required; however, expanding ++compiler macros is not permitted. ++ ++Examples:: ++.......... ++ ++ (constantp 1) => true ++ (constantp 'temp) => false ++ (constantp ''temp)) => true ++ (defconstant this-is-a-constant 'never-changing) => THIS-IS-A-CONSTANT ++ (constantp 'this-is-a-constant) => true ++ (constantp "temp") => true ++ (setq a 6) => 6 ++ (constantp a) => true ++ (constantp '(sin pi)) => implementation-dependent ++ (constantp '(car '(x))) => implementation-dependent ++ (constantp '(eql x x)) => implementation-dependent ++ (constantp '(typep x 'nil)) => implementation-dependent ++ (constantp '(typep x 't)) => implementation-dependent ++ (constantp '(values this-is-a-constant)) => implementation-dependent ++ (constantp '(values 'x 'y)) => implementation-dependent ++ (constantp '(let ((a '(a b c))) (+ (length a) 6))) => implementation-dependent ++ ++Affected By:: ++............. ++ ++The state of the global environment (e.g., which symbols have been ++declared to be the names of constant variables). ++ ++See Also:: ++.......... ++ ++*note defconstant:: ++ ++ ++File: gcl.info, Node: Types and Classes, Next: Data and Control Flow, Prev: Evaluation and Compilation, Up: Top ++ ++4 Types and Classes ++******************* ++ ++* Menu: ++ ++* Introduction (Types and Classes):: ++* Types:: ++* Classes:: ++* Types and Classes Dictionary:: ++ ++ ++File: gcl.info, Node: Introduction (Types and Classes), Next: Types, Prev: Types and Classes, Up: Types and Classes ++ ++4.1 Introduction ++================ ++ ++A type is a (possibly infinite) set of objects. An object can belong to ++more than one type. Types are never explicitly represented as objects ++by Common Lisp. Instead, they are referred to indirectly by the use of ++type specifiers, which are objects that denote types. ++ ++ New types can be defined using deftype, defstruct, defclass, and ++define-condition. ++ ++ The function typep, a set membership test, is used to determine ++whether a given object is of a given type. The function subtypep, a ++subset test, is used to determine whether a given type is a subtype of ++another given type. The function type-of returns a particular type to ++which a given object belongs, even though that object must belong to one ++or more other types as well. (For example, every object is of type t, ++but type-of always returns a type specifier for a type more specific ++than t.) ++ ++ Objects, not variables, have types. Normally, any variable can have ++any object as its value. It is possible to declare that a variable ++takes on only values of a given type by making an explicit type ++declaration. Types are arranged in a directed acyclic graph, except for ++the presence of equivalences. ++ ++ Declarations can be made about types using declare, proclaim, ++declaim, or the. For more information about declarations, see *note ++Declarations::. ++ ++ Among the fundamental objects of the object system are classes. A ++class determines the structure and behavior of a set of other objects, ++which are called its instances. Every object is a direct instance of a ++class. The class of an object determines the set of operations that can ++be performed on the object. For more information, see *note Classes::. ++ ++ It is possible to write functions that have behavior specialized to ++the class of the objects which are their arguments. For more ++information, see *note Generic Functions and Methods::. ++ ++ The class of the class of an object is called its metaclass . For ++more information about metaclasses, see *note Meta-Objects::. ++ ++ ++File: gcl.info, Node: Types, Next: Classes, Prev: Introduction (Types and Classes), Up: Types and Classes ++ ++4.2 Types ++========= ++ ++* Menu: ++ ++* Data Type Definition:: ++* Type Relationships:: ++* Type Specifiers:: ++ ++ ++File: gcl.info, Node: Data Type Definition, Next: Type Relationships, Prev: Types, Up: Types ++ ++4.2.1 Data Type Definition ++-------------------------- ++ ++Information about type usage is located in the sections specified in ++Figure~4-1. Figure~4-7 lists some classes that are particularly ++relevant to the object system. Figure~9-1 lists the defined condition ++types. ++ ++ Section Data Type ++ _________________________________________________________________________ ++ *note Classes:: Object System types ++ *note Slots:: Object System types ++ *note Objects:: Object System types ++ *note Generic Functions and Methods:: Object System types ++ *note Condition System Concepts:: Condition System types ++ *note Types and Classes:: Miscellaneous types ++ *note Syntax:: All types--read and print syntax ++ *note The Lisp Printer:: All types--print syntax ++ *note Compilation:: All types--compilation issues ++ ++ Figure 4-1: Cross-References to Data Type Information ++ ++ ++ ++File: gcl.info, Node: Type Relationships, Next: Type Specifiers, Prev: Data Type Definition, Up: Types ++ ++4.2.2 Type Relationships ++------------------------ ++ ++* ++ The types cons, symbol, array, number, character, hash-table, ++ ++ function, ++ ++ readtable, package, pathname, stream, random-state, condition, ++ restart, and any single other type created by defstruct, ++ ++ define-condition, ++ ++ or defclass are pairwise disjoint, except for type relations ++ explicitly established by specifying superclasses in defclass ++ ++ or define-condition ++ ++ or the :include option of destruct. ++ ++* ++ Any two types created by defstruct are disjoint unless one is a ++ supertype of the other by virtue of the defstruct :include option. ++ ++ [Editorial Note by KMP: The comments in the source say gray ++ suggested some change from "common superclass" to "common subclass" ++ in the following, but the result looks suspicious to me.] ++ ++* ++ Any two distinct classes created by defclass or define-condition ++ are disjoint unless they have a common subclass or one class is a ++ subclass of the other. ++ ++* ++ An implementation may be extended to add other subtype ++ relationships between the specified types, as long as they do not ++ violate the type relationships and disjointness requirements ++ specified here. An implementation may define additional types that ++ are subtypes or supertypes of any specified types, as long as each ++ additional type is a subtype of type t and a supertype of type nil ++ and the disjointness requirements are not violated. ++ ++ At the discretion of the implementation, either standard-object or ++ structure-object might appear in any class precedence list for a ++ system class that does not already specify either standard-object ++ or structure-object. If it does, it must precede the class t and ++ follow all other standardized classes. ++ ++ ++File: gcl.info, Node: Type Specifiers, Prev: Type Relationships, Up: Types ++ ++4.2.3 Type Specifiers ++--------------------- ++ ++Type specifiers can be symbols, classes, or lists. Figure~4-2 lists ++symbols that are standardized atomic type specifiers, and Figure~4-3 ++lists standardized compound type specifier names. For syntax ++information, see the dictionary entry for the corresponding type ++specifier. It is possible to define new type specifiers using defclass, ++define-condition, defstruct, or deftype. ++ ++ arithmetic-error function simple-condition ++ array generic-function simple-error ++ atom hash-table simple-string ++ base-char integer simple-type-error ++ base-string keyword simple-vector ++ bignum list simple-warning ++ bit logical-pathname single-float ++ bit-vector long-float standard-char ++ broadcast-stream method standard-class ++ built-in-class method-combination standard-generic-function ++ cell-error nil standard-method ++ character null standard-object ++ class number storage-condition ++ compiled-function package stream ++ complex package-error stream-error ++ concatenated-stream parse-error string ++ condition pathname string-stream ++ cons print-not-readable structure-class ++ control-error program-error structure-object ++ division-by-zero random-state style-warning ++ double-float ratio symbol ++ echo-stream rational synonym-stream ++ end-of-file reader-error t ++ error readtable two-way-stream ++ extended-char real type-error ++ file-error restart unbound-slot ++ file-stream sequence unbound-variable ++ fixnum serious-condition undefined-function ++ float short-float unsigned-byte ++ floating-point-inexact signed-byte vector ++ floating-point-invalid-operation simple-array warning ++ floating-point-overflow simple-base-string ++ floating-point-underflow simple-bit-vector ++ ++ Figure 4-2: Standardized Atomic Type Specifiers ++ ++ ++ \indent If a type specifier is a list, the car of the list is a ++symbol, and the rest of the list is subsidiary type information. Such a ++type specifier is called a compound type specifier . Except as ++explicitly stated otherwise, the subsidiary items can be unspecified. ++The unspecified subsidiary items are indicated by writing *. For ++example, to completely specify a vector, the type of the elements and ++the length of the vector must be present. ++ ++ (vector double-float 100) ++ ++ The following leaves the length unspecified: ++ ++ (vector double-float *) ++ ++ The following leaves the element type unspecified: ++ ++ (vector * 100) ++ ++ Suppose that two type specifiers are the same except that the first ++has a * where the second has a more explicit specification. Then the ++second denotes a subtype of the type denoted by the first. ++ ++ If a list has one or more unspecified items at the end, those items ++can be dropped. If dropping all occurrences of * results in a singleton ++list, then the parentheses can be dropped as well (the list can be ++replaced by the symbol in its car). For example, (vector double-float ++*) can be abbreviated to (vector double-float), and (vector * *) can be ++abbreviated to (vector) and then to vector. ++ ++ and long-float simple-base-string ++ array member simple-bit-vector ++ base-string mod simple-string ++ bit-vector not simple-vector ++ complex or single-float ++ cons rational string ++ double-float real unsigned-byte ++ eql satisfies values ++ float short-float vector ++ function signed-byte ++ integer simple-array ++ ++ Figure 4-3: Standardized Compound Type Specifier Names ++ ++ ++ Figure 4-4 show the defined names that can be used as compound type ++specifier names but that cannot be used as atomic type specifiers. ++ ++ and mod satisfies ++ eql not values ++ member or ++ ++ Figure 4-4: Standardized Compound-Only Type Specifier Names ++ ++ ++ New type specifiers can come into existence in two ways. ++ ++* ++ Defining a structure by using defstruct without using the :type ++ specifier or defining a class by using defclass or define-condition ++ automatically causes the name of the structure or class to be a new ++ type specifier symbol. ++* ++ deftype can be used to define derived type specifiers , which act ++ as 'abbreviations' for other type specifiers. ++ ++ A class object can be used as a type specifier. When used this way, ++it denotes the set of all members of that class. ++ ++ Figure 4-5 shows some defined names relating to types and ++declarations. ++ ++ coerce defstruct subtypep ++ declaim deftype the ++ declare ftype type ++ defclass locally type-of ++ define-condition proclaim typep ++ ++ Figure 4-5: Defined names relating to types and declarations. ++ ++ ++ Figure 4-6 shows all defined names that are type specifier names, ++whether for atomic type specifiers or compound type specifiers; this ++list is the union of the lists in Figure~4-2 and Figure~4-3. ++ ++ and function simple-array ++ arithmetic-error generic-function simple-base-string ++ array hash-table simple-bit-vector ++ atom integer simple-condition ++ base-char keyword simple-error ++ base-string list simple-string ++ bignum logical-pathname simple-type-error ++ bit long-float simple-vector ++ bit-vector member simple-warning ++ broadcast-stream method single-float ++ built-in-class method-combination standard-char ++ cell-error mod standard-class ++ character nil standard-generic-function ++ class not standard-method ++ compiled-function null standard-object ++ complex number storage-condition ++ concatenated-stream or stream ++ condition package stream-error ++ cons package-error string ++ control-error parse-error string-stream ++ division-by-zero pathname structure-class ++ double-float print-not-readable structure-object ++ echo-stream program-error style-warning ++ end-of-file random-state symbol ++ eql ratio synonym-stream ++ error rational t ++ extended-char reader-error two-way-stream ++ file-error readtable type-error ++ file-stream real unbound-slot ++ fixnum restart unbound-variable ++ float satisfies undefined-function ++ floating-point-inexact sequence unsigned-byte ++ floating-point-invalid-operation serious-condition values ++ floating-point-overflow short-float vector ++ floating-point-underflow signed-byte warning ++ ++ Figure 4-6: Standardized Type Specifier Names ++ ++ ++ ++File: gcl.info, Node: Classes, Next: Types and Classes Dictionary, Prev: Types, Up: Types and Classes ++ ++4.3 Classes ++=========== ++ ++While the object system is general enough to describe all standardized ++classes (including, for example, number, hash-table, and symbol), Figure ++4-7 contains a list of classes that are especially relevant to ++understanding the object system. ++ ++ built-in-class method-combination standard-object ++ class standard-class structure-class ++ generic-function standard-generic-function structure-object ++ method standard-method ++ ++ Figure 4-7: Object System Classes ++ ++ ++* Menu: ++ ++* Introduction to Classes:: ++* Defining Classes:: ++* Creating Instances of Classes:: ++* Inheritance:: ++* Determining the Class Precedence List:: ++* Redefining Classes:: ++* Integrating Types and Classes:: ++ ++ ++File: gcl.info, Node: Introduction to Classes, Next: Defining Classes, Prev: Classes, Up: Classes ++ ++4.3.1 Introduction to Classes ++----------------------------- ++ ++A class is an object that determines the structure and behavior of a set ++of other objects, which are called its instances . ++ ++ A class can inherit structure and behavior from other classes. A ++class whose definition refers to other classes for the purpose of ++inheriting from them is said to be a subclass of each of those classes. ++The classes that are designated for purposes of inheritance are said to ++be superclasses of the inheriting class. ++ ++ A class can have a name. The function class-name takes a class ++object and returns its name. The name of an anonymous class is nil. A ++symbol can name a class. The function find-class takes a symbol and ++returns the class that the symbol names. A class has a proper name if ++the name is a symbol and if the name of the class names that class. ++That is, a class~C has the proper name~S if S= (class-name C) and C= ++(find-class S). Notice that it is possible for (find-class S_1) = ++(find-class S_2) and S_1!= S_2. If C= (find-class S), we say that C is ++the class named S. ++ ++ A class C_1 is a direct superclass of a class C_2 if C_2 explicitly ++designates C_1 as a superclass in its definition. In this case C_2 is a ++direct subclass of C_1. A class C_n is a superclass of a class C_1 if ++there exists a series of classes C_2,...,C_{n-1} such that C_{i+1} is a ++direct superclass of C_i for 1 <= i= 2, be the classes from ++S_C with no predecessors. Let (C_1... C_n), n>= 1, be the class ++precedence list constructed so far. C_1 is the most specific class, and ++C_n is the least specific. Let 1<= j<= n be the largest number such ++that there exists an i where 1<= i<= m and N_i is a direct superclass of ++C_j; N_i is placed next. ++ ++ The effect of this rule for selecting from a set of classes with no ++predecessors is that the classes in a simple superclass chain are ++adjacent in the class precedence list and that classes in each ++relatively separated subgraph are adjacent in the class precedence list. ++For example, let T_1 and T_2 be subgraphs whose only element in common ++is the class J. Suppose that no superclass of J appears in either T_1 or ++T_2, and that J is in the superclass chain of every class in both T_1 ++and T_2. Let C_1 be the bottom of T_1; and let C_2 be the bottom of ++T_2. Suppose C is a class whose direct superclasses are C_1 and C_2 in ++that order, then the class precedence list for C starts with C and is ++followed by all classes in T_1 except J. All the classes of T_2 are ++next. The class J and its superclasses appear last. ++ ++ ++File: gcl.info, Node: Examples of Class Precedence List Determination, Prev: Topological Sorting, Up: Determining the Class Precedence List ++ ++4.3.5.2 Examples of Class Precedence List Determination ++....................................................... ++ ++This example determines a class precedence list for the class pie. The ++following classes are defined: ++ ++ (defclass pie (apple cinnamon) ()) ++ ++ (defclass apple (fruit) ()) ++ ++ (defclass cinnamon (spice) ()) ++ ++ (defclass fruit (food) ()) ++ ++ (defclass spice (food) ()) ++ ++ (defclass food () ()) ++ ++ The set S_{pie}~= {pie, apple, cinnamon, fruit, spice, food, ++standard-object, t }. The set R~= { (pie, apple), (apple, cinnamon), ++(apple, fruit), (cinnamon, spice), \break (fruit, food), (spice, food), ++(food, standard-object), (standard-object, t) }. ++ ++ The class pie is not preceded by anything, so it comes first; the ++result so far is (pie). Remove pie from S and pairs mentioning pie from ++R to get S~= {apple, cinnamon, fruit, spice, food, standard-object, t } ++and R~=~{(apple, cinnamon), (apple, fruit), (cinnamon, spice),\break ++(fruit, food), (spice, food), (food, standard-object), (standard-object, ++t) }. ++ ++ The class apple is not preceded by anything, so it is next; the ++result is (pie apple). Removing apple and the relevant pairs results in ++S~= { cinnamon, fruit, spice, food, standard-object, t } and R~= { ++(cinnamon, spice), (fruit, food), (spice, food), (food, ++standard-object),\break (standard-object, t) }. ++ ++ The classes cinnamon and fruit are not preceded by anything, so the ++one with a direct subclass rightmost in the class precedence list ++computed so far goes next. The class apple is a direct subclass of ++fruit, and the class pie is a direct subclass of cinnamon. Because ++apple appears to the right of pie in the class precedence list, fruit ++goes next, and the result so far is (pie apple fruit). S~= { cinnamon, ++spice, food, standard-object, t }; R~= {(cinnamon, spice), (spice, ++food),\break (food, standard-object), (standard-object, t) }. ++ ++ The class cinnamon is next, giving the result so far as (pie apple ++fruit cinnamon). At this point S~= { spice, food, standard-object, t }; ++R~= { (spice, food), (food, standard-object), (standard-object, t) }. ++ ++ The classes spice, food, standard-object, and t are added in that ++order, and the class precedence list is (pie apple fruit cinnamon spice ++food standard-object t). ++ ++ It is possible to write a set of class definitions that cannot be ++ordered. For example: ++ ++ (defclass new-class (fruit apple) ()) ++ ++ (defclass apple (fruit) ()) ++ ++ The class fruit must precede apple because the local ordering of ++superclasses must be preserved. The class apple must precede fruit ++because a class always precedes its own superclasses. When this ++situation occurs, an error is signaled, as happens here when the system ++tries to compute the class precedence list of new-class. ++ ++ The following might appear to be a conflicting set of definitions: ++ ++ (defclass pie (apple cinnamon) ()) ++ ++ (defclass pastry (cinnamon apple) ()) ++ ++ (defclass apple () ()) ++ ++ (defclass cinnamon () ()) ++ ++ The class precedence list for pie is (pie apple cinnamon ++standard-object t). ++ ++ The class precedence list for pastry is (pastry cinnamon apple ++standard-object t). ++ ++ It is not a problem for apple to precede cinnamon in the ordering of ++the superclasses of pie but not in the ordering for pastry. However, it ++is not possible to build a new class that has both pie and pastry as ++superclasses. ++ ++ ++File: gcl.info, Node: Redefining Classes, Next: Integrating Types and Classes, Prev: Determining the Class Precedence List, Up: Classes ++ ++4.3.6 Redefining Classes ++------------------------ ++ ++A class that is a direct instance of standard-class can be redefined if ++the new class is also a direct instance of standard-class. Redefining a ++class modifies the existing class object to reflect the new class ++definition; it does not create a new class object for the class. Any ++method object created by a :reader, :writer, or :accessor option ++specified by the old defclass form is removed from the corresponding ++generic function. Methods specified by the new defclass form are added. ++ ++ When the class C is redefined, changes are propagated to its ++instances and to instances of any of its subclasses. Updating such an ++instance occurs at an implementation-dependent time, but no later than ++the next time a slot of that instance is read or written. Updating an ++instance does not change its identity as defined by the function eq. ++The updating process may change the slots of that particular instance, ++but it does not create a new instance. Whether updating an instance ++consumes storage is implementation-dependent. ++ ++ Note that redefining a class may cause slots to be added or deleted. ++If a class is redefined in a way that changes the set of local slots ++accessible in instances, the instances are updated. It is ++implementation-dependent whether instances are updated if a class is ++redefined in a way that does not change the set of local slots ++accessible in instances. ++ ++ The value of a slot that is specified as shared both in the old class ++and in the new class is retained. If such a shared slot was unbound in ++the old class, it is unbound in the new class. Slots that were local in ++the old class and that are shared in the new class are initialized. ++Newly added shared slots are initialized. ++ ++ Each newly added shared slot is set to the result of evaluating the ++captured initialization form for the slot that was specified in the ++defclass form for the new class. If there was no initialization form, ++the slot is unbound. ++ ++ If a class is redefined in such a way that the set of local slots ++accessible in an instance of the class is changed, a two-step process of ++updating the instances of the class takes place. The process may be ++explicitly started by invoking the generic function ++make-instances-obsolete. This two-step process can happen in other ++circumstances in some implementations. For example, in some ++implementations this two-step process is triggered if the order of slots ++in storage is changed. ++ ++ The first step modifies the structure of the instance by adding new ++local slots and discarding local slots that are not defined in the new ++version of the class. The second step initializes the newly-added local ++slots and performs any other user-defined actions. These two steps are ++further specified in the next two sections. ++ ++* Menu: ++ ++* Modifying the Structure of Instances:: ++* Initializing Newly Added Local Slots (Redefining Classes):: ++* Customizing Class Redefinition:: ++ ++ ++File: gcl.info, Node: Modifying the Structure of Instances, Next: Initializing Newly Added Local Slots (Redefining Classes), Prev: Redefining Classes, Up: Redefining Classes ++ ++4.3.6.1 Modifying the Structure of Instances ++............................................ ++ ++[Reviewer Note by Barmar: What about shared slots that are deleted?] ++ ++ The first step modifies the structure of instances of the redefined ++class to conform to its new class definition. Local slots specified by ++the new class definition that are not specified as either local or ++shared by the old class are added, and slots not specified as either ++local or shared by the new class definition that are specified as local ++by the old class are discarded. The names of these added and discarded ++slots are passed as arguments to update-instance-for-redefined-class as ++described in the next section. ++ ++ The values of local slots specified by both the new and old classes ++are retained. If such a local slot was unbound, it remains unbound. ++ ++ The value of a slot that is specified as shared in the old class and ++as local in the new class is retained. If such a shared slot was ++unbound, the local slot is unbound. ++ ++ ++File: gcl.info, Node: Initializing Newly Added Local Slots (Redefining Classes), Next: Customizing Class Redefinition, Prev: Modifying the Structure of Instances, Up: Redefining Classes ++ ++4.3.6.2 Initializing Newly Added Local Slots ++............................................ ++ ++The second step initializes the newly added local slots and performs any ++other user-defined actions. This step is implemented by the generic ++function update-instance-for-redefined-class, which is called after ++completion of the first step of modifying the structure of the instance. ++ ++ The generic function update-instance-for-redefined-class takes four ++required arguments: the instance being updated after it has undergone ++the first step, a list of the names of local slots that were added, a ++list of the names of local slots that were discarded, and a property ++list containing the slot names and values of slots that were discarded ++and had values. Included among the discarded slots are slots that were ++local in the old class and that are shared in the new class. ++ ++ The generic function update-instance-for-redefined-class also takes ++any number of initialization arguments. When it is called by the system ++to update an instance whose class has been redefined, no initialization ++arguments are provided. ++ ++ There is a system-supplied primary method for ++update-instance-for-redefined-class whose parameter specializer for its ++instance argument is the class standard-object. First this method ++checks the validity of initialization arguments and signals an error if ++an initialization argument is supplied that is not declared as valid. ++(For more information, see *note Declaring the Validity of ++Initialization Arguments::.) Then it calls the generic function ++shared-initialize with the following arguments: the instance, the list ++of names of the newly added slots, and the initialization arguments it ++received. ++ ++ ++File: gcl.info, Node: Customizing Class Redefinition, Prev: Initializing Newly Added Local Slots (Redefining Classes), Up: Redefining Classes ++ ++4.3.6.3 Customizing Class Redefinition ++...................................... ++ ++[Reviewer Note by Barmar: This description is hard to follow.] ++ ++ Methods for update-instance-for-redefined-class may be defined to ++specify actions to be taken when an instance is updated. If only after ++methods for update-instance-for-redefined-class are defined, they will ++be run after the system-supplied primary method for initialization and ++therefore will not interfere with the default behavior of ++update-instance-for-redefined-class. Because no initialization ++arguments are passed to update-instance-for-redefined-class when it is ++called by the system, the initialization forms for slots that are filled ++by before methods for update-instance-for-redefined-class will not be ++evaluated by shared-initialize. ++ ++ Methods for shared-initialize may be defined to customize class ++redefinition. For more information, see *note Shared-Initialize::. ++ ++ ++File: gcl.info, Node: Integrating Types and Classes, Prev: Redefining Classes, Up: Classes ++ ++4.3.7 Integrating Types and Classes ++----------------------------------- ++ ++The object system maps the space of classes into the space of types. ++Every class that has a proper name has a corresponding type with the ++same name. ++ ++ The proper name of every class is a valid type specifier. In ++addition, every class object is a valid type specifier. Thus the ++expression (typep object class) evaluates to true if the class of object ++is class itself or a subclass of class. The evaluation of the ++expression (subtypep class1 class2) returns the values true and true if ++class1 is a subclass of class2 or if they are the same class; otherwise ++it returns the values false and true. If I is an instance of some class ++C named S and C is an instance of standard-class, the evaluation of the ++expression (type-of I\/) returns S if S is the proper name of C; ++otherwise, it returns C. ++ ++ Because the names of classes and class objects are type specifiers, ++they may be used in the special form the and in type declarations. ++ ++ Many but not all of the predefined type specifiers have a ++corresponding class with the same proper name as the type. These type ++specifiers are listed in Figure~4-8. For example, the type array has a ++corresponding class named array. No type specifier that is a list, such ++as (vector double-float 100), has a corresponding class. The operator ++deftype does not create any classes. ++ ++ Each class that corresponds to a predefined type specifier can be ++implemented in one of three ways, at the discretion of each ++implementation. It can be a standard class, a structure class, ++ ++ or a system class. ++ ++ A built-in class is one whose generalized instances have restricted ++capabilities or special representations. Attempting to use defclass to ++define subclasses of a built-in-class signals an error. Calling ++make-instance to create a generalized instance of a built-in class ++signals an error. Calling slot-value on a generalized instance of a ++built-in class signals an error. Redefining a built-in class or using ++change-class to change the class of an object to or from a built-in ++class signals an error. However, built-in classes can be used as ++parameter specializers in methods. ++ ++ It is possible to determine whether a class is a built-in class by ++checking the metaclass. A standard class is an instance of the class ++standard-class, a built-in class is an instance of the class ++built-in-class, and a structure class is an instance of the class ++structure-class. ++ ++ Each structure type created by defstruct without using the :type ++option has a corresponding class. This class is a generalized instance ++of the class structure-class. The :include option of defstruct creates ++a direct subclass of the class that corresponds to the included ++structure type. ++ ++ It is implementation-dependent whether slots are involved in the ++operation of functions defined in this specification on instances of ++classes defined in this specification, except when slots are explicitly ++defined by this specification. ++ ++ If in a particular implementation a class defined in this ++specification has slots that are not defined by this specfication, the ++names of these slots must not be external symbols of packages defined in ++this specification nor otherwise accessible in the CL-USER package. ++ ++ The purpose of specifying that many of the standard type specifiers ++have a corresponding class is to enable users to write methods that ++discriminate on these types. Method selection requires that a class ++precedence list can be determined for each class. ++ ++ The hierarchical relationships among the type specifiers are mirrored ++by relationships among the classes corresponding to those types. ++ ++ Figure~4-8 lists the set of classes that correspond to predefined ++type specifiers. ++ ++ arithmetic-error generic-function simple-error ++ array hash-table simple-type-error ++ bit-vector integer simple-warning ++ broadcast-stream list standard-class ++ built-in-class logical-pathname standard-generic-function ++ cell-error method standard-method ++ character method-combination standard-object ++ class null storage-condition ++ complex number stream ++ concatenated-stream package stream-error ++ condition package-error string ++ cons parse-error string-stream ++ control-error pathname structure-class ++ division-by-zero print-not-readable structure-object ++ echo-stream program-error style-warning ++ end-of-file random-state symbol ++ error ratio synonym-stream ++ file-error rational t ++ file-stream reader-error two-way-stream ++ float readtable type-error ++ floating-point-inexact real unbound-slot ++ floating-point-invalid-operation restart unbound-variable ++ floating-point-overflow sequence undefined-function ++ floating-point-underflow serious-condition vector ++ function simple-condition warning ++ ++ Figure 4-8: Classes that correspond to pre-defined type specifiers ++ ++ ++ The class precedence list information specified in the entries for ++each of these classes are those that are required by the object system. ++ ++ Individual implementations may be extended to define other type ++specifiers to have a corresponding class. Individual implementations ++may be extended to add other subclass relationships and to add other ++elements to the class precedence lists as long as they do not violate ++the type relationships and disjointness requirements specified by this ++standard. A standard class defined with no direct superclasses is ++guaranteed to be disjoint from all of the classes in the table, except ++for the class named t. ++ ++ ++File: gcl.info, Node: Types and Classes Dictionary, Prev: Classes, Up: Types and Classes ++ ++4.4 Types and Classes Dictionary ++================================ ++ ++* Menu: ++ ++* nil (Type):: ++* boolean:: ++* function (System Class):: ++* compiled-function:: ++* generic-function:: ++* standard-generic-function:: ++* class:: ++* built-in-class:: ++* structure-class:: ++* standard-class:: ++* method:: ++* standard-method:: ++* structure-object:: ++* standard-object:: ++* method-combination:: ++* t (System Class):: ++* satisfies:: ++* member (Type Specifier):: ++* not (Type Specifier):: ++* and (Type Specifier):: ++* or (Type Specifier):: ++* values (Type Specifier):: ++* eql (Type Specifier):: ++* coerce:: ++* deftype:: ++* subtypep:: ++* type-of:: ++* typep:: ++* type-error:: ++* type-error-datum:: ++* simple-type-error:: ++ ++ ++File: gcl.info, Node: nil (Type), Next: boolean, Prev: Types and Classes Dictionary, Up: Types and Classes Dictionary ++ ++4.4.1 nil [Type] ++---------------- ++ ++Supertypes:: ++............ ++ ++all types ++ ++Description:: ++............. ++ ++The type nil contains no objects and so is also called the empty type. ++The type nil is a subtype of every type. No object is of type nil. ++ ++Notes:: ++....... ++ ++The type containing the object nil is the type null, not the type nil. ++ ++ ++File: gcl.info, Node: boolean, Next: function (System Class), Prev: nil (Type), Up: Types and Classes Dictionary ++ ++4.4.2 boolean [Type] ++-------------------- ++ ++Supertypes:: ++............ ++ ++boolean, symbol, t ++ ++Description:: ++............. ++ ++The type boolean contains the symbols t and nil, which represent true ++and false, respectively. ++ ++See Also:: ++.......... ++ ++t (constant variable), nil (constant variable), *note if:: , *note not:: ++, *note complement:: ++ ++Notes:: ++....... ++ ++Conditional operations, such as if, permit the use of generalized ++booleans, not just booleans; any non-nil value, not just t, counts as ++true for a generalized boolean. However, as a matter of convention, the ++symbol t is considered the canonical value to use even for a generalized ++boolean when no better choice presents itself. ++ ++ ++File: gcl.info, Node: function (System Class), Next: compiled-function, Prev: boolean, Up: Types and Classes Dictionary ++ ++4.4.3 function [System Class] ++----------------------------- ++ ++Class Precedence List:: ++....................... ++ ++function, t ++ ++Description:: ++............. ++ ++A function is an object that represents code to be executed when an ++appropriate number of arguments is supplied. A function is produced by ++the function special form, the function coerce, ++ ++ or the function compile. A function can be directly invoked by using ++it as the first argument to funcall, apply, or multiple-value-call. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('function'{[arg-typespec [value-typespec]]}) ++ ++ arg-typespec ::=({typespec}* ++ [&optional {typespec}*] ++ [&rest typespec] ++ [&key {(keyword typespec )}*]) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++typespec--a type specifier. ++ ++ value-typespec--a type specifier. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++[Editorial Note by KMP: Isn't there some context info about ftype ++declarations to be merged here?] ++ ++ [Editorial Note by KMP: This could still use some cleaning up.] ++ ++ [Editorial Note by Sandra: Still need clarification about what ++happens if the number of arguments doesn't match the FUNCTION type ++declaration.] ++ ++ The list form of the function type-specifier can be used only for ++declaration and not for discrimination. Every element of this type is a ++function that accepts arguments of the types specified by the argj-types ++and returns values that are members of the types specified by ++value-type. The &optional, &rest, &key, ++ ++ and &allow-other-keys ++ ++ markers can appear in the list of argument types. ++ ++ The type specifier provided with &rest is the type of each actual ++argument, not the type of the corresponding variable. ++ ++ The &key parameters should be supplied as lists of the form (keyword ++type). The keyword must be a valid keyword-name symbol as must be ++supplied in the actual arguments of a call. ++ ++ This is usually a symbol in the KEYWORD package but can be any ++symbol. ++ ++ When &key is given in a function type specifier lambda list, the ++keyword parameters given are exhaustive unless &allow-other-keys is also ++present. &allow-other-keys is an indication that other keyword ++arguments might actually be supplied and, if supplied, can be used. For ++example, the type of the function make-list could be declared as ++follows: ++ ++ (function ((integer 0) &key (:initial-element t)) list) ++ ++ The value-type can be a values type specifier in order to indicate ++the types of multiple values. ++ ++ Consider a declaration of the following form: ++ ++ (ftype (function (arg0-type arg1-type ...) val-type) f)) ++ ++ Any form (f arg0 arg1 ...) within the scope of that declaration is ++equivalent to the following: ++ ++ (the val-type (f (the arg0-type arg0) (the arg1-type arg1) ...)) ++ ++ That is, the consequences are undefined if any of the arguments are ++not of the specified types or the result is not of the specified type. ++In particular, if any argument is not of the correct type, the result is ++not guaranteed to be of the specified type. ++ ++ Thus, an ftype declaration for a function describes calls to the ++function, not the actual definition of the function. ++ ++ Consider a declaration of the following form: ++ ++ (type (function (arg0-type arg1-type ...) val-type) fn-valued-variable) ++ ++ This declaration has the interpretation that, within the scope of the ++declaration, the consequences are unspecified if the value of ++fn-valued-variable is called with arguments not of the specified types; ++the value resulting from a valid call will be of type val-type. ++ ++ As with variable type declarations, nested declarations imply ++intersections of types, as follows: ++ ++* ++ Consider the following two declarations of ftype: ++ ++ (ftype (function (arg0-type1 arg1-type1 ...) val-type1) f)) ++ ++ and ++ ++ (ftype (function (arg0-type2 arg1-type2 ...) val-type2) f)) ++ ++ If both these declarations are in effect, then within the shared ++ scope of the declarations, calls to f can be treated as if f were ++ declared as follows: ++ ++ (ftype (function ((and arg0-type1 arg0-type2) (and arg1-type1 arg1-type2 ...) ...) ++ (and val-type1 val-type2)) ++ f)) ++ ++ It is permitted to ignore one or all of the ftype declarations in ++ force. ++ ++* ++ If two (or more) type declarations are in effect for a variable, ++ and they are both function declarations, the declarations combine ++ similarly. ++ ++ ++File: gcl.info, Node: compiled-function, Next: generic-function, Prev: function (System Class), Up: Types and Classes Dictionary ++ ++4.4.4 compiled-function [Type] ++------------------------------ ++ ++Supertypes:: ++............ ++ ++compiled-function, function, t ++ ++Description:: ++............. ++ ++Any function may be considered by an implementation to be a a compiled ++function if it contains no references to macros that must be expanded at ++run time, and it contains no unresolved references to load time values. ++See *note Compilation Semantics::. ++ ++ Functions whose definitions appear lexically within a file that has ++been compiled with compile-file and then loaded with load are of type ++compiled-function. ++ ++ Functions produced by the compile function are of type ++compiled-function. ++ ++ Other functions might also be of type compiled-function. ++ ++ ++File: gcl.info, Node: generic-function, Next: standard-generic-function, Prev: compiled-function, Up: Types and Classes Dictionary ++ ++4.4.5 generic-function [System Class] ++------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++generic-function, function, t ++ ++Description:: ++............. ++ ++A generic function is a function whose behavior depends on the classes ++or identities of the arguments supplied to it. A generic function ++object contains a set of methods, a lambda list, a method combination ++type, and other information. The methods define the class-specific ++behavior and operations of the generic function; a method is said to ++specialize a generic function. When invoked, a generic function ++executes a subset of its methods based on the classes or identities of ++its arguments. ++ ++ A generic function can be used in the same ways that an ordinary ++function can be used; specifically, a generic function can be used as an ++argument to funcall and apply, and can be given a global or a local ++name. ++ ++ ++File: gcl.info, Node: standard-generic-function, Next: class, Prev: generic-function, Up: Types and Classes Dictionary ++ ++4.4.6 standard-generic-function [System Class] ++---------------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++standard-generic-function, generic-function, function, t ++ ++Description:: ++............. ++ ++The class standard-generic-function is the default class of generic ++functions established by defmethod, ensure-generic-function, defgeneric, ++ ++ and defclass forms. ++ ++ ++File: gcl.info, Node: class, Next: built-in-class, Prev: standard-generic-function, Up: Types and Classes Dictionary ++ ++4.4.7 class [System Class] ++-------------------------- ++ ++Class Precedence List:: ++....................... ++ ++class, ++ ++ standard-object, ++ ++ t ++ ++Description:: ++............. ++ ++The type class represents objects that determine the structure and ++behavior of their instances. Associated with an object of type class is ++information describing its place in the directed acyclic graph of ++classes, its slots, and its options. ++ ++ ++File: gcl.info, Node: built-in-class, Next: structure-class, Prev: class, Up: Types and Classes Dictionary ++ ++4.4.8 built-in-class [System Class] ++----------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++built-in-class, class, ++ ++ standard-object, ++ ++ t ++ ++Description:: ++............. ++ ++A built-in class is a class whose instances have restricted capabilities ++or special representations. Attempting to use defclass to define ++subclasses of a built-in class signals an error of type error. Calling ++make-instance to create an instance of a built-in class signals an error ++of type error. Calling slot-value on an instance of a built-in class ++signals an error of type error. Redefining a built-in class or using ++change-class to change the class of an instance to or from a built-in ++class signals an error of type error. However, built-in classes can be ++used as parameter specializers in methods. ++ ++ ++File: gcl.info, Node: structure-class, Next: standard-class, Prev: built-in-class, Up: Types and Classes Dictionary ++ ++4.4.9 structure-class [System Class] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++structure-class, class, ++ ++ standard-object, ++ ++ t ++ ++Description:: ++............. ++ ++All classes defined by means of defstruct are instances of the class ++structure-class. ++ ++ ++File: gcl.info, Node: standard-class, Next: method, Prev: structure-class, Up: Types and Classes Dictionary ++ ++4.4.10 standard-class [System Class] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++standard-class, class, ++ ++ standard-object, ++ ++ t ++ ++Description:: ++............. ++ ++The class standard-class is the default class of classes defined by ++defclass. ++ ++ ++File: gcl.info, Node: method, Next: standard-method, Prev: standard-class, Up: Types and Classes Dictionary ++ ++4.4.11 method [System Class] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++method, t ++ ++Description:: ++............. ++ ++A method is an object that represents a modular part of the behavior of ++a generic function. ++ ++ A method contains code to implement the method's behavior, a sequence ++of parameter specializers that specify when the given method is ++applicable, and a sequence of qualifiers that is used by the method ++combination facility to distinguish among methods. Each required ++parameter of each method has an associated parameter specializer, and ++the method will be invoked only on arguments that satisfy its parameter ++specializers. ++ ++ The method combination facility controls the selection of methods, ++the order in which they are run, and the values that are returned by the ++generic function. The object system offers a default method combination ++type and provides a facility for declaring new types of method ++combination. ++ ++See Also:: ++.......... ++ ++*note Generic Functions and Methods:: ++ ++ ++File: gcl.info, Node: standard-method, Next: structure-object, Prev: method, Up: Types and Classes Dictionary ++ ++4.4.12 standard-method [System Class] ++------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++standard-method, method, ++ ++ standard-object, ++ ++ t ++ ++Description:: ++............. ++ ++The class standard-method is the default class of methods defined by the ++defmethod and defgeneric forms. ++ ++ ++File: gcl.info, Node: structure-object, Next: standard-object, Prev: standard-method, Up: Types and Classes Dictionary ++ ++4.4.13 structure-object [Class] ++------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++structure-object, t ++ ++Description:: ++............. ++ ++The class structure-object is an instance of structure-class and is a ++superclass of every class that is an instance of structure-class except ++itself, and is a superclass of every class that is defined by defstruct. ++ ++See Also:: ++.......... ++ ++*note defstruct:: , *note Sharpsign S::, *note Printing Structures:: ++ ++ ++File: gcl.info, Node: standard-object, Next: method-combination, Prev: structure-object, Up: Types and Classes Dictionary ++ ++4.4.14 standard-object [Class] ++------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++standard-object, t ++ ++Description:: ++............. ++ ++The class standard-object is an instance of standard-class and is a ++superclass of every class that is an instance of standard-class except ++itself. ++ ++ ++File: gcl.info, Node: method-combination, Next: t (System Class), Prev: standard-object, Up: Types and Classes Dictionary ++ ++4.4.15 method-combination [System Class] ++---------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++method-combination, t ++ ++Description:: ++............. ++ ++Every method combination object is an indirect instance of the class ++method-combination. A method combination object represents the ++information about the method combination being used by a generic ++function. A method combination object contains information about both ++the type of method combination and the arguments being used with that ++type. ++ ++ ++File: gcl.info, Node: t (System Class), Next: satisfies, Prev: method-combination, Up: Types and Classes Dictionary ++ ++4.4.16 t [System Class] ++----------------------- ++ ++Class Precedence List:: ++....................... ++ ++t ++ ++Description:: ++............. ++ ++The set of all objects. The type t is a supertype of every type, ++including itself. Every object is of type t. ++ ++ ++File: gcl.info, Node: satisfies, Next: member (Type Specifier), Prev: t (System Class), Up: Types and Classes Dictionary ++ ++4.4.17 satisfies [Type Specifier] ++--------------------------------- ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Predicating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('satisfies'{predicate-name}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++predicate-name--a symbol. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of all objects that satisfy the predicate ++predicate-name, which must be a symbol whose global function definition ++is a one-argument predicate. A name is required for predicate-name; ++lambda expressions are not allowed. For example, the type specifier ++(and integer (satisfies evenp)) denotes the set of all even integers. ++The form (typep x '(satisfies p)) is equivalent to (if (p x) t nil). ++ ++ The argument is required. The symbol * can be the argument, but it ++denotes itself (the symbol *), and does not represent an unspecified ++value. ++ ++ The symbol satisfies is not valid as a type specifier. ++ ++ ++File: gcl.info, Node: member (Type Specifier), Next: not (Type Specifier), Prev: satisfies, Up: Types and Classes Dictionary ++ ++4.4.18 member [Type Specifier] ++------------------------------ ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Combining. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('member'{{object}*}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++object--an object. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set containing the named objects. An object is of this ++type if and only if it is eql to one of the specified objects. ++ ++ The type specifiers (member) and nil are equivalent. * can be among ++the objects, but if so it denotes itself (the symbol *) and does not ++represent an unspecified value. The symbol member is not valid as a ++type specifier; and, specifically, it is not an abbreviation for either ++(member) or (member *). ++ ++See Also:: ++.......... ++ ++the type eql ++ ++ ++File: gcl.info, Node: not (Type Specifier), Next: and (Type Specifier), Prev: member (Type Specifier), Up: Types and Classes Dictionary ++ ++4.4.19 not [Type Specifier] ++--------------------------- ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Combining. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('not'{typespec}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++typespec--a type specifier. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of all objects that are not of the type typespec. ++ ++ The argument is required, and cannot be *. ++ ++ The symbol not is not valid as a type specifier. ++ ++ ++File: gcl.info, Node: and (Type Specifier), Next: or (Type Specifier), Prev: not (Type Specifier), Up: Types and Classes Dictionary ++ ++4.4.20 and [Type Specifier] ++--------------------------- ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Combining. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('and'{{typespec}*}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++typespec--a type specifier. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of all objects of the type determined by the ++intersection of the typespecs. ++ ++ * is not permitted as an argument. ++ ++ The type specifiers (and) and t are equivalent. The symbol and is ++not valid as a type specifier, and, specifically, it is not an ++abbreviation for (and). ++ ++ ++File: gcl.info, Node: or (Type Specifier), Next: values (Type Specifier), Prev: and (Type Specifier), Up: Types and Classes Dictionary ++ ++4.4.21 or [Type Specifier] ++-------------------------- ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Combining. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('or'{{typespec}*}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++typespec--a type specifier. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of all objects of the type determined by the union ++of the typespecs. For example, the type list by definition is the same ++as (or null cons). Also, the value returned by position is an object of ++type (or null (integer 0 *)); i.e., either nil or a non-negative ++integer. ++ ++ * is not permitted as an argument. ++ ++ The type specifiers (or) and nil are equivalent. The symbol or is ++not valid as a type specifier; and, specifically, it is not an ++abbreviation for (or). ++ ++ ++File: gcl.info, Node: values (Type Specifier), Next: eql (Type Specifier), Prev: or (Type Specifier), Up: Types and Classes Dictionary ++ ++4.4.22 values [Type Specifier] ++------------------------------ ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('values'{!value-typespec}) ++ ++ [Reviewer Note by Barmar: Missing &key] ++ ++ value-typespec ::={typespec}* [&optional {typespec}*] [&rest typespec ] [&allow-other-keys] ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++typespec--a type specifier. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This type specifier can be used only as the value-type in a function ++type specifier or a the special form. It is used to specify individual ++types when multiple values are involved. The &optional and &rest ++markers can appear in the value-type list; they indicate the parameter ++list of a function that, when given to multiple-value-call along with ++the values, would correctly receive those values. ++ ++ The symbol * may not be among the value-types. ++ ++ The symbol values is not valid as a type specifier; and, ++specifically, it is not an abbreviation for (values). ++ ++ ++File: gcl.info, Node: eql (Type Specifier), Next: coerce, Prev: values (Type Specifier), Up: Types and Classes Dictionary ++ ++4.4.23 eql [Type Specifier] ++--------------------------- ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Combining. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('eql'{object}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++object--an object. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++Represents the type whose only element is object. ++ ++ The argument object is required. The object can be *, but if so it ++denotes itself (the symbol *) and does not represent an unspecified ++value. The symbol eql is not valid as an atomic type specifier. ++ ++ ++File: gcl.info, Node: coerce, Next: deftype, Prev: eql (Type Specifier), Up: Types and Classes Dictionary ++ ++4.4.24 coerce [Function] ++------------------------ ++ ++'coerce' object result-type => result ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ result-type--a type specifier. ++ ++ result--an object, of type result-type except in situations described ++in *note Rule of Canonical Representation for Complex Rationals::. ++ ++Description:: ++............. ++ ++Coerces the object to type result-type. ++ ++ If object is already of type result-type, the object itself is ++returned, regardless of whether it would have been possible in general ++to coerce an object of some other type to result-type. ++ ++ Otherwise, the object is coerced to type result-type according to the ++following rules: ++ ++sequence ++ ++ If the result-type is a recognizable subtype of list, and the ++ object is a sequence, then the result is a list that has the same ++ elements as object. ++ ++ If the result-type is a recognizable subtype of vector, and the ++ object is a sequence, then the result is a vector that has the same ++ elements as object. If result-type is a specialized type, the ++ result has an actual array element type that is the result of ++ upgrading the element type part of that specialized type. If no ++ element type is specified, the element type defaults to t. If the ++ implementation cannot determine the element type, an error is ++ signaled. ++ ++character ++ If the result-type is character and the object is a character ++ designator, the result is the character it denotes. ++ ++complex ++ If the result-type is complex and the object is a number, then the ++ result is obtained by constructing a complex whose real part is the ++ object and whose imaginary part is the result of coercing an ++ integer zero to the type of the object (using coerce). (If the ++ real part is a rational, however, then the result must be ++ represented as a rational rather than a complex; see *note Rule of ++ Canonical Representation for Complex Rationals::. So, for example, ++ (coerce 3 'complex) is permissible, but will return 3, which is not ++ a complex.) ++ ++float ++ If the result-type is any of float, short-float, single-float, ++ double-float, long-float, and the object is a ++ ++ real, ++ ++ then the result is a float of type result-type which is equal in ++ sign and magnitude to the object to whatever degree of ++ representational precision is permitted by that float ++ representation. (If the result-type is float and object is not ++ already a float, then the result is a single float.) ++ ++function ++ If the result-type is function, and object is any ++ ++ function name ++ ++ that is fbound but that is globally defined neither as a macro name ++ nor as a special operator, then the result is the functional value ++ of object. ++ ++ If the result-type is function, and object is a lambda expression, ++ then the result is a closure of object in the null lexical ++ environment. ++ ++t ++ Any object can be coerced to an object of type t. In this case, ++ the object is simply returned. ++ ++Examples:: ++.......... ++ ++ (coerce '(a b c) 'vector) => #(A B C) ++ (coerce 'a 'character) => #\A ++ (coerce 4.56 'complex) => #C(4.56 0.0) ++ (coerce 4.5s0 'complex) => #C(4.5s0 0.0s0) ++ (coerce 7/2 'complex) => 7/2 ++ (coerce 0 'short-float) => 0.0s0 ++ (coerce 3.5L0 'float) => 3.5L0 ++ (coerce 7/2 'float) => 3.5 ++ (coerce (cons 1 2) t) => (1 . 2) ++ ++ All the following forms should signal an error: ++ ++ (coerce '(a b c) '(vector * 4)) ++ (coerce #(a b c) '(vector * 4)) ++ (coerce '(a b c) '(vector * 2)) ++ (coerce #(a b c) '(vector * 2)) ++ (coerce "foo" '(string 2)) ++ (coerce #(#\a #\b #\c) '(string 2)) ++ (coerce '(0 1) '(simple-bit-vector 3)) ++ ++Exceptional Situations:: ++........................ ++ ++If a coercion is not possible, an error of type type-error is signaled. ++ ++ (coerce x 'nil) always signals an error of type type-error. ++ ++ An error of type error is signaled if the result-type is function but ++object is a symbol that is not fbound or if the symbol names a macro or ++a special operator. ++ ++ An error of type type-error should be signaled if result-type ++specifies the number of elements and object is of a different length. ++ ++See Also:: ++.......... ++ ++*note rational (Function):: , *note floor:: , *note char-code:: , *note ++char-int:: ++ ++Notes:: ++....... ++ ++Coercions from floats to rationals and from ratios to integers are not ++provided because of rounding problems. ++ ++ (coerce x 't) == (identity x) == x ++ ++ ++File: gcl.info, Node: deftype, Next: subtypep, Prev: coerce, Up: Types and Classes Dictionary ++ ++4.4.25 deftype [Macro] ++---------------------- ++ ++'deftype' name lambda-list [[{declaration}* | documentation]] {form}* => ++name ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ lambda-list--a deftype lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ form--a form. ++ ++Description:: ++............. ++ ++deftype defines a derived type specifier named name. ++ ++ The meaning of the new type specifier is given in terms of a function ++which expands the type specifier into another type specifier, which ++itself will be expanded if it contains references to another derived ++type specifier. ++ ++ The newly defined type specifier may be referenced as a list of the ++form (name arg_1 arg_2 ...)\/. The number of arguments must be ++appropriate to the lambda-list. If the new type specifier takes no ++arguments, or if all of its arguments are optional, the type specifier ++may be used as an atomic type specifier. ++ ++ The argument expressions to the type specifier, arg_1 ... arg_n, are ++not evaluated. Instead, these literal objects become the objects to ++which corresponding parameters become bound. ++ ++ The body of the deftype form ++ ++ (but not the lambda-list) ++ ++ is ++ ++ implicitly enclosed in a block named name, ++ ++ and is evaluated as an implicit progn, returning a new type ++specifier. ++ ++ The lexical environment of the body is the one which was current at ++the time the deftype form was evaluated, augmented by the variables in ++the lambda-list. ++ ++ Recursive expansion of the type specifier returned as the expansion ++must terminate, including the expansion of type specifiers which are ++nested within the expansion. ++ ++ The consequences are undefined if the result of fully expanding a ++type specifier contains any circular structure, except within the ++objects referred to by member and eql type specifiers. ++ ++ Documentation is attached to name as a documentation string of kind ++type. ++ ++ If a deftype form appears as a top level form, the compiler must ++ensure that the name is recognized in subsequent type declarations. The ++programmer must ensure that the body of a deftype form can be evaluated ++at compile time if the name is referenced in subsequent type ++declarations. If the expansion of a type specifier is not defined fully ++at compile time (perhaps because it expands into an unknown type ++specifier or a satisfies of a named function that isn't defined in the ++compile-time environment), an implementation may ignore any references ++to this type in declarations and/or signal a warning. ++ ++Examples:: ++.......... ++ ++ (defun equidimensional (a) ++ (or (< (array-rank a) 2) ++ (apply #'= (array-dimensions a)))) => EQUIDIMENSIONAL ++ (deftype square-matrix (&optional type size) ++ `(and (array ,type (,size ,size)) ++ (satisfies equidimensional))) => SQUARE-MATRIX ++ ++See Also:: ++.......... ++ ++declare, *note defmacro:: , *note documentation:: , *note Type ++Specifiers::, *note Syntactic Interaction of Documentation Strings and ++Declarations:: ++ ++ ++File: gcl.info, Node: subtypep, Next: type-of, Prev: deftype, Up: Types and Classes Dictionary ++ ++4.4.26 subtypep [Function] ++-------------------------- ++ ++'subtypep' type-1 type-2 &optional environment => subtype-p, valid-p ++ ++Arguments and Values:: ++...................... ++ ++type-1--a type specifier. ++ ++ type-2--a type specifier. ++ ++ environment--an environment object. The default is nil, denoting the ++null lexical environment and the current global environment. ++ ++ subtype-p--a generalized boolean. ++ ++ valid-p--a generalized boolean. ++ ++Description:: ++............. ++ ++If type-1 is a recognizable subtype of type-2, the first value is true. ++Otherwise, the first value is false, indicating that either type-1 is ++not a subtype of type-2, or else type-1 is a subtype of type-2 but is ++not a recognizable subtype. ++ ++ A second value is also returned indicating the 'certainty' of the ++first value. If this value is true, then the first value is an accurate ++indication of the subtype relationship. (The second value is always ++true when the first value is true.) ++ ++ Figure 4-9 summarizes the possible combinations of values that might ++result. ++ ++ Value 1 Value 2 Meaning ++ true true type-1 is definitely a subtype of type-2. ++ false true type-1 is definitely not a subtype of type-2. ++ false false subtypep could not determine the relationship, ++ so type-1 might or might not be a subtype of type-2. ++ ++ Figure 4-9: Result possibilities for subtypep ++ ++ ++ subtypep is permitted to return the values false and false only when ++at least one argument involves one of these type specifiers: and, eql, ++the list form of function, member, not, or, satisfies, or values. (A ++type specifier 'involves' such a symbol if, after being type expanded, ++it contains that symbol in a position that would call for its meaning as ++a type specifier to be used.) One consequence of this is that if ++neither type-1 nor type-2 involves any of these type specifiers, then ++subtypep is obliged to determine the relationship accurately. In ++particular, subtypep returns the values true and true if the arguments ++are equal and do not involve any of these type specifiers. ++ ++ subtypep never returns a second value of nil when both type-1 and ++type-2 involve only the names in Figure~4-2, or names of types defined ++by defstruct, define-condition, or defclass, or derived types that ++expand into only those names. While type specifiers listed in ++Figure~4-2 and names of defclass and defstruct can in some cases be ++implemented as derived types, subtypep regards them as primitive. ++ ++ The relationships between types reflected by subtypep are those ++specific to the particular implementation. For example, if an ++implementation supports only a single type of floating-point numbers, in ++that implementation (subtypep 'float 'long-float) returns the values ++true and true (since the two types are identical). ++ ++ For all T1 and T2 other than *, (array T1) and (array T2) are two ++different type specifiers that always refer to the same sets of things ++if and only if they refer to arrays of exactly the same specialized ++representation, i.e., if (upgraded-array-element-type 'T1) and ++(upgraded-array-element-type 'T2) return two different type specifiers ++that always refer to the same sets of objects. This is another way of ++saying that `(array type-specifier) and `(array ++,(upgraded-array-element-type 'type-specifier)) refer to the same set of ++specialized array representations. For all T1 and T2 other than *, the ++intersection of (array T1) and (array T2) is the empty set if and only ++if they refer to arrays of different, distinct specialized ++representations. ++ ++ Therefore, ++ ++ (subtypep '(array T1) '(array T2)) => true ++ ++ if and only if ++ ++ (upgraded-array-element-type 'T1) and ++ (upgraded-array-element-type 'T2) ++ ++ return two different type specifiers that always refer to the same ++sets of objects. ++ ++ For all type-specifiers T1 and T2 other than *, ++ ++ (subtypep '(complex T1) '(complex T2)) => true, true ++ ++ if: ++ ++1. ++ T1 is a subtype of T2, or ++2. ++ (upgraded-complex-part-type 'T1) and (upgraded-complex-part-type ++ 'T2) return two different type specifiers that always refer to the ++ same sets of objects; in this case, (complex T1) and (complex T2) ++ both refer to the same specialized representation. ++ ++ The values are false and true otherwise. ++ ++ The form ++ ++ (subtypep '(complex single-float) '(complex float)) ++ ++ must return true in all implementations, but ++ ++ (subtypep '(array single-float) '(array float)) ++ ++ returns true only in implementations that do not have a specialized ++array representation for single floats distinct from that for other ++floats. ++ ++Examples:: ++.......... ++ ++ (subtypep 'compiled-function 'function) => true, true ++ (subtypep 'null 'list) => true, true ++ (subtypep 'null 'symbol) => true, true ++ (subtypep 'integer 'string) => false, true ++ (subtypep '(satisfies dummy) nil) => false, implementation-dependent ++ (subtypep '(integer 1 3) '(integer 1 4)) => true, true ++ (subtypep '(integer (0) (0)) 'nil) => true, true ++ (subtypep 'nil '(integer (0) (0))) => true, true ++ (subtypep '(integer (0) (0)) '(member)) => true, true ;or false, false ++ (subtypep '(member) 'nil) => true, true ;or false, false ++ (subtypep 'nil '(member)) => true, true ;or false, false ++ ++ Let and be two distinct type specifiers that do not ++always refer to the same sets of objects in a given implementation, but ++for which make-array, will return an object of the same array type. ++ ++ Thus, in each case, ++ ++ (subtypep (array-element-type (make-array 0 :element-type ')) ++ (array-element-type (make-array 0 :element-type '))) ++ => true, true ++ ++ (subtypep (array-element-type (make-array 0 :element-type ')) ++ (array-element-type (make-array 0 :element-type '))) ++ => true, true ++ ++ If (array ) and (array ) are different names for ++exactly the same set of objects, these names should always refer to the ++same sets of objects. That implies that the following set of tests are ++also true: ++ ++ (subtypep '(array ) '(array )) => true, true ++ (subtypep '(array ) '(array )) => true, true ++ ++See Also:: ++.......... ++ ++*note Types:: ++ ++Notes:: ++....... ++ ++The small differences between the subtypep specification for the array ++and complex types are necessary because there is no creation function ++for complexes which allows the specification of the resultant part type ++independently of the actual types of the parts. Thus in the case of the ++type complex, the actual type of the parts is referred to, although a ++number can be a member of more than one type. For example, 17 is of ++type (mod 18) as well as type (mod 256) and type integer; and 2.3f5 is ++of type single-float as well as type float. ++ ++ ++File: gcl.info, Node: type-of, Next: typep, Prev: subtypep, Up: Types and Classes Dictionary ++ ++4.4.27 type-of [Function] ++------------------------- ++ ++'type-of' object => typespec ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ typespec--a type specifier. ++ ++Description:: ++............. ++ ++Returns a type specifier, typespec, for a type that has the object as an ++element. The typespec satisfies the following: ++ ++1. ++ For any object that is an element of some built-in type: ++ ++ a. ++ the type returned is a recognizable subtype of that built-in ++ type. ++ ++ b. ++ the type returned does not involve and, eql, member, not, or, ++ satisfies, or values. ++ ++2. ++ For all objects, (typep object (type-of object)) returns true. ++ Implicit in this is that type specifiers which are not valid for ++ use with typep, such as the list form of the function type ++ specifier, are never returned by type-of. ++ ++3. ++ The type returned by type-of is always a recognizable subtype of ++ the class returned by class-of. That is, ++ ++ (subtypep (type-of object) (class-of object)) => true, true ++ ++4. ++ For objects of metaclass structure-class or standard-class, ++ ++ and for conditions, ++ ++ type-of returns the proper name of the class returned by class-of ++ if it has a proper name, and otherwise returns the class itself. ++ In particular, for objects created by the constructor function of a ++ structure defined with defstruct without a :type option, type-of ++ returns the structure name; and for objects created by ++ make-condition, the typespec is the name of the condition type. ++ ++5. ++ For each of the types short-float, single-float, double-float, or ++ long-float of which the object is an element, the typespec is a ++ recognizable subtype of that type. ++ ++Examples:: ++.......... ++ ++ ++ (type-of 'a) => SYMBOL ++ (type-of '(1 . 2)) ++ => CONS ++ OR=> (CONS FIXNUM FIXNUM) ++ (type-of #c(0 1)) ++ => COMPLEX ++ OR=> (COMPLEX INTEGER) ++ (defstruct temp-struct x y z) => TEMP-STRUCT ++ (type-of (make-temp-struct)) => TEMP-STRUCT ++ (type-of "abc") ++ => STRING ++ OR=> (STRING 3) ++ (subtypep (type-of "abc") 'string) => true, true ++ (type-of (expt 2 40)) ++ => BIGNUM ++ OR=> INTEGER ++ OR=> (INTEGER 1099511627776 1099511627776) ++ OR=> SYSTEM::TWO-WORD-BIGNUM ++ OR=> FIXNUM ++ (subtypep (type-of 112312) 'integer) => true, true ++ (defvar *foo* (make-array 5 :element-type t)) => *FOO* ++ (class-name (class-of *foo*)) => VECTOR ++ (type-of *foo*) ++ => VECTOR ++ OR=> (VECTOR T 5) ++ ++See Also:: ++.......... ++ ++*note array-element-type:: , *note class-of:: , *note defstruct:: , ++*note typecase:: , *note typep:: , *note Types:: ++ ++Notes:: ++....... ++ ++Implementors are encouraged to arrange for type-of to return ++ ++ a portable value. ++ ++ ++File: gcl.info, Node: typep, Next: type-error, Prev: type-of, Up: Types and Classes Dictionary ++ ++4.4.28 typep [Function] ++----------------------- ++ ++'typep' object type-specifier &optional environment => ++generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ type-specifier--any type specifier except ++ ++ values, or a type specifier list whose first element is either ++function or values. ++ ++ environment--an environment object. The default is nil, denoting the ++null lexical environment and the and current global environment. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of the type specified by type-specifier; ++otherwise, returns false. ++ ++ A type-specifier of the form (satisfies fn) is handled by applying ++the function fn to object. ++ ++ (typep object '(array type-specifier)), where type-specifier is not ++*, returns true if and only if object is an array that could be the ++result of supplying type-specifier as the :element-type argument to ++make-array. (array *) refers to all arrays regardless of element type, ++while (array type-specifier) refers only to those arrays that can result ++from giving type-specifier as the :element-type argument to make-array. ++A similar interpretation applies to (simple-array type-specifier) and ++(vector type-specifier). See *note Array Upgrading::. ++ ++ (typep object '(complex type-specifier)) returns true for all complex ++numbers that can result from giving numbers of type type-specifier to ++the function complex, plus all other complex numbers of the same ++specialized representation. Both the real and the imaginary parts of ++any such complex number must satisfy: ++ ++ (typep realpart 'type-specifier) ++ (typep imagpart 'type-specifier) ++ ++ See the function upgraded-complex-part-type. ++ ++Examples:: ++.......... ++ ++ (typep 12 'integer) => true ++ (typep (1+ most-positive-fixnum) 'fixnum) => false ++ (typep nil t) => true ++ (typep nil nil) => false ++ (typep 1 '(mod 2)) => true ++ (typep #c(1 1) '(complex (eql 1))) => true ++ ;; To understand this next example, you might need to refer to ++ ;; *note Rule of Canonical Representation for Complex Rationals::. ++ (typep #c(0 0) '(complex (eql 0))) => false ++ ++ Let A_x and A_y be two type specifiers that denote different types, ++but for which ++ ++ (upgraded-array-element-type 'A_x) ++ ++ and ++ ++ (upgraded-array-element-type 'A_y) ++ ++ denote the same type. Notice that ++ ++ (typep (make-array 0 :element-type 'A_x) '(array A_x)) => true ++ (typep (make-array 0 :element-type 'A_y) '(array A_y)) => true ++ (typep (make-array 0 :element-type 'A_x) '(array A_y)) => true ++ (typep (make-array 0 :element-type 'A_y) '(array A_x)) => true ++ ++Exceptional Situations:: ++........................ ++ ++An error of type error is signaled if type-specifier is values, or a ++type specifier list whose first element is either function or values. ++ ++ The consequences are undefined if the type-specifier is not a type ++specifier. ++ ++See Also:: ++.......... ++ ++*note type-of:: , *note upgraded-array-element-type:: , *note ++upgraded-complex-part-type:: , *note Type Specifiers:: ++ ++Notes:: ++....... ++ ++Implementations are encouraged to recognize and optimize the case of ++(typep x (the class y)), since it does not involve any need for ++expansion of deftype information at runtime. ++ ++ ++ ++ ++File: gcl.info, Node: type-error, Next: type-error-datum, Prev: typep, Up: Types and Classes Dictionary ++ ++4.4.29 type-error [Condition Type] ++---------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++type-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type type-error represents a situation in which an object is not of ++the expected type. The "offending datum" and "expected type" are ++initialized by the initialization arguments named :datum and ++:expected-type to make-condition, and are accessed by the functions ++type-error-datum and type-error-expected-type. ++ ++See Also:: ++.......... ++ ++*note type-error-datum:: , type-error-expected-type ++ ++ ++File: gcl.info, Node: type-error-datum, Next: simple-type-error, Prev: type-error, Up: Types and Classes Dictionary ++ ++4.4.30 type-error-datum, type-error-expected-type [Function] ++------------------------------------------------------------ ++ ++'type-error-datum' condition => datum ++ ++ 'type-error-expected-type' condition => expected-type ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type type-error. ++ ++ datum--an object. ++ ++ expected-type--a type specifier. ++ ++Description:: ++............. ++ ++type-error-datum returns the offending datum in the situation ++represented by the condition. ++ ++ type-error-expected-type returns the expected type of the offending ++datum in the situation represented by the condition. ++ ++Examples:: ++.......... ++ ++ (defun fix-digits (condition) ++ (check-type condition type-error) ++ (let* ((digits '(zero one two three four ++ five six seven eight nine)) ++ (val (position (type-error-datum condition) digits))) ++ (if (and val (subtypep 'fixnum (type-error-expected-type condition))) ++ (store-value 7)))) ++ ++ (defun foo (x) ++ (handler-bind ((type-error #'fix-digits)) ++ (check-type x number) ++ (+ x 3))) ++ ++ (foo 'seven) ++ => 10 ++ ++See Also:: ++.......... ++ ++type-error, *note Conditions:: ++ ++ ++File: gcl.info, Node: simple-type-error, Prev: type-error-datum, Up: Types and Classes Dictionary ++ ++4.4.31 simple-type-error [Condition Type] ++----------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++simple-type-error, simple-condition, type-error, error, ++serious-condition, condition, t ++ ++Description:: ++............. ++ ++Conditions of type simple-type-error are like conditions of type ++type-error, except that they provide an alternate mechanism for ++specifying how the condition is to be reported; see the type ++simple-condition. ++ ++See Also:: ++.......... ++ ++simple-condition, ++ ++ *note simple-condition-format-control:: , ++ ++ simple-condition-format-arguments, *note type-error-datum:: , ++type-error-expected-type ++ ++ ++File: gcl.info, Node: Data and Control Flow, Next: Iteration, Prev: Types and Classes, Up: Top ++ ++5 Data and Control Flow ++*********************** ++ ++* Menu: ++ ++* Generalized Reference:: ++* Transfer of Control to an Exit Point:: ++* Data and Control Flow Dictionary:: ++ ++ ++File: gcl.info, Node: Generalized Reference, Next: Transfer of Control to an Exit Point, Prev: Data and Control Flow, Up: Data and Control Flow ++ ++5.1 Generalized Reference ++========================= ++ ++* Menu: ++ ++* Overview of Places and Generalized Reference:: ++* Kinds of Places:: ++* Treatment of Other Macros Based on SETF:: ++ ++ ++File: gcl.info, Node: Overview of Places and Generalized Reference, Next: Kinds of Places, Prev: Generalized Reference, Up: Generalized Reference ++ ++5.1.1 Overview of Places and Generalized Reference ++-------------------------------------------------- ++ ++A generalized reference is the use of a form, sometimes called a place , ++as if it were a variable that could be read and written. The value of a ++place is the object to which the place form evaluates. The value of a ++place can be changed by using setf. The concept of binding a place is ++not defined in Common Lisp, but an implementation is permitted to extend ++the language by defining this concept. ++ ++ Figure 5-1 contains examples of the use of setf. Note that the ++values returned by evaluating the forms in column two are not ++necessarily the same as those obtained by evaluating the forms in column ++three. In general, the exact macro expansion of a setf form is not ++guaranteed and can even be implementation-dependent; all that is ++guaranteed is that the expansion is an update form that works for that ++particular implementation, that the left-to-right evaluation of subforms ++is preserved, and that the ultimate result of evaluating setf is the ++value or values being stored. ++ ++ Access function Update Function Update using setf ++ x (setq x datum) (setf x datum) ++ (car x) (rplaca x datum) (setf (car x) datum) ++ (symbol-value x) (set x datum) (setf (symbol-value x) datum) ++ ++ Figure 5-1: Examples of setf ++ ++ ++ Figure 5-2 shows operators relating to places and generalized ++reference. ++ ++ assert defsetf push ++ ccase get-setf-expansion remf ++ ctypecase getf rotatef ++ decf incf setf ++ define-modify-macro pop shiftf ++ define-setf-expander psetf ++ ++ Figure 5-2: Operators relating to places and generalized reference. ++ ++ ++ Some of the operators above manipulate places and some manipulate ++setf expanders. A setf expansion can be derived from any place. ++ ++ New setf expanders can be defined by using defsetf and ++define-setf-expander. ++ ++* Menu: ++ ++* Evaluation of Subforms to Places:: ++* Examples of Evaluation of Subforms to Places:: ++* Setf Expansions:: ++* Examples of Setf Expansions:: ++ ++ ++File: gcl.info, Node: Evaluation of Subforms to Places, Next: Examples of Evaluation of Subforms to Places, Prev: Overview of Places and Generalized Reference, Up: Overview of Places and Generalized Reference ++ ++5.1.1.1 Evaluation of Subforms to Places ++........................................ ++ ++The following rules apply to the evaluation of subforms in a place: ++ ++1. ++ The evaluation ordering of subforms within a place is determined by ++ the order specified by the second value returned by ++ ++ get-setf-expansion. ++ ++ For all places defined by this specification (e.g., getf, ldb, ++ ...), this order of evaluation is left-to-right. ++ ++ When a place is derived from a macro expansion, this rule is ++ applied after the macro is expanded to find the appropriate place. ++ ++ Places defined by using defmacro or ++ ++ define-setf-expander ++ ++ use the evaluation order defined by those definitions. For ++ example, consider the following: ++ ++ (defmacro wrong-order (x y) `(getf ,y ,x)) ++ ++ This following form evaluates place2 first and then place1 because ++ that is the order they are evaluated in the macro expansion: ++ ++ (push value (wrong-order place1 place2)) ++ ++2. ++ ++ For the macros that manipulate places (push, pushnew, remf, incf, ++ decf, shiftf, rotatef, psetf, setf, pop, and those defined by ++ define-modify-macro) the subforms of the macro call are evaluated ++ exactly once in left-to-right order, with the subforms of the ++ places evaluated in the order specified in (1). ++ ++ push, pushnew, remf, incf, decf, shiftf, rotatef, psetf, pop ++ evaluate all subforms before modifying any of the place locations. ++ setf (in the case when setf has more than two arguments) performs ++ its operation on each pair in sequence. For example, in ++ ++ (setf place1 value1 place2 value2 ...) ++ ++ the subforms of place1 and value1 are evaluated, the location ++ specified by place1 is modified to contain the value returned by ++ value1, and then the rest of the setf form is processed in a like ++ manner. ++ ++3. ++ For check-type, ctypecase, and ccase, subforms of the place are ++ evaluated once as in (1), but might be evaluated again if the type ++ check fails in the case of check-type or none of the cases hold in ++ ctypecase and ccase. ++ ++4. ++ For assert, the order of evaluation of the generalized references ++ is not specified. ++ ++ Rules 2, 3 and 4 cover all standardized macros that manipulate ++places. ++ ++ ++File: gcl.info, Node: Examples of Evaluation of Subforms to Places, Next: Setf Expansions, Prev: Evaluation of Subforms to Places, Up: Overview of Places and Generalized Reference ++ ++5.1.1.2 Examples of Evaluation of Subforms to Places ++.................................................... ++ ++ (let ((ref2 (list '()))) ++ (push (progn (princ "1") 'ref-1) ++ (car (progn (princ "2") ref2)))) ++ |> 12 ++ => (REF1) ++ ++ (let (x) ++ (push (setq x (list 'a)) ++ (car (setq x (list 'b)))) ++ x) ++ => (((A) . B)) ++ ++ push first evaluates (setq x (list 'a)) => (a), then evaluates (setq ++x (list 'b)) => (b), then modifies the car of this latest value to be ++((a) . b). ++ ++ ++File: gcl.info, Node: Setf Expansions, Next: Examples of Setf Expansions, Prev: Examples of Evaluation of Subforms to Places, Up: Overview of Places and Generalized Reference ++ ++5.1.1.3 Setf Expansions ++....................... ++ ++Sometimes it is possible to avoid evaluating subforms of a place ++multiple times or in the wrong order. A ++ ++ setf expansion ++ ++ for a given access form can be expressed as an ordered collection of ++five objects: ++ ++List of temporary variables ++ a list of symbols naming temporary variables to be bound ++ sequentially, as if by let*, to values resulting from value forms. ++ ++List of value forms ++ a list of forms (typically, subforms of the place) which when ++ evaluated yield the values to which the corresponding temporary ++ variables should be bound. ++ ++List of store variables ++ a list of symbols naming temporary store variables which are to ++ hold the new values that will be assigned to the place. ++ ++Storing form ++ a form which can reference both the temporary and the store ++ variables, and which changes the value of the place and guarantees ++ to return as its values the values of the store variables, which ++ are the correct values for setf to return. ++ ++Accessing form ++ a form which can reference the temporary variables, and which ++ returns the value of the place. ++ ++ The value returned by the accessing form is affected by execution of ++the storing form, but either of these forms might be evaluated any ++number of times. ++ ++ It is possible to do more than one setf in parallel via psetf, ++shiftf, and rotatef. Because of this, the ++ ++ setf expander ++ ++ must produce new temporary and store variable names every time. For ++examples of how to do this, see gensym. ++ ++ For each standardized accessor function F, unless it is explicitly ++documented otherwise, it is implementation-dependent whether the ability ++to use an F form as a setf place is implemented by a setf expander or a ++setf function. Also, it follows from this that it is ++implementation-dependent whether the name (setf F) is fbound. ++ ++ ++File: gcl.info, Node: Examples of Setf Expansions, Prev: Setf Expansions, Up: Overview of Places and Generalized Reference ++ ++5.1.1.4 Examples of Setf Expansions ++................................... ++ ++Examples of the contents of the constituents of setf expansions follow. ++ ++ For a variable x: ++ ++ () ;list of temporary variables ++ () ;list of value forms ++ (g0001) ;list of store variables ++ (setq x g0001) ;storing form ++ x ;accessing form ++ ++ Figure 5-3: Sample Setf Expansion of a Variable ++ ++ ++ For (car exp): ++ ++ (g0002) ;list of temporary variables ++ (exp) ;list of value forms ++ (g0003) ;list of store variables ++ (progn (rplaca g0002 g0003) g0003) ;storing form ++ (car g0002) ;accessing form ++ ++ Figure 5-4: Sample Setf Expansion of a CAR Form ++ ++ ++ For (subseq seq s e): ++ ++ (g0004 g0005 g0006) ;list of temporary variables ++ (seq s e) ;list of value forms ++ (g0007) ;list of store variables ++ (progn (replace g0004 g0007 :start1 g0005 :end1 g0006) g0007) ++ ;storing form ++ (subseq g0004 g0005 g0006) ; accessing form ++ ++ Figure 5-5: Sample Setf Expansion of a SUBSEQ Form ++ ++ ++ In some cases, if a subform of a place is itself a place, it is ++necessary to expand the subform in order to compute some of the values ++in the expansion of the outer place. For (ldb bs (car exp)): ++ ++ (g0001 g0002) ;list of temporary variables ++ (bs exp) ;list of value forms ++ (g0003) ;list of store variables ++ (progn (rplaca g0002 (dpb g0003 g0001 (car g0002))) g0003) ++ ;storing form ++ (ldb g0001 (car g0002)) ; accessing form ++ ++ Figure 5-6: Sample Setf Expansion of a LDB Form ++ ++ ++ ++File: gcl.info, Node: Kinds of Places, Next: Treatment of Other Macros Based on SETF, Prev: Overview of Places and Generalized Reference, Up: Generalized Reference ++ ++5.1.2 Kinds of Places ++--------------------- ++ ++Several kinds of places are defined by Common Lisp; this section ++enumerates them. This set can be extended by implementations and by ++programmer code. ++ ++* Menu: ++ ++* Variable Names as Places:: ++* Function Call Forms as Places:: ++* VALUES Forms as Places:: ++* THE Forms as Places:: ++* APPLY Forms as Places:: ++* Setf Expansions and Places:: ++* Macro Forms as Places:: ++* Symbol Macros as Places:: ++* Other Compound Forms as Places:: ++ ++ ++File: gcl.info, Node: Variable Names as Places, Next: Function Call Forms as Places, Prev: Kinds of Places, Up: Kinds of Places ++ ++5.1.2.1 Variable Names as Places ++................................ ++ ++The name of a lexical variable or dynamic variable can be used as a ++place. ++ ++ ++File: gcl.info, Node: Function Call Forms as Places, Next: VALUES Forms as Places, Prev: Variable Names as Places, Up: Kinds of Places ++ ++5.1.2.2 Function Call Forms as Places ++..................................... ++ ++A function form can be used as a place if it falls into one of the ++following categories: ++ ++* ++ A function call form whose first element is the name of any one of ++ the functions in Figure 5-7. ++ ++ [Editorial Note by KMP: Note that what are in some places still ++ called 'condition accessors' are deliberately omitted from this ++ table, and are not labeled as accessors in their entries. I have ++ not yet had time to do a full search for these items and eliminate ++ stray references to them as 'accessors', which they are not, but I ++ will do that at some point.] ++ ++ aref cdadr get ++ bit cdar gethash ++ caaaar cddaar logical-pathname-translations ++ caaadr cddadr macro-function ++ caaar cddar ninth ++ caadar cdddar nth ++ caaddr cddddr readtable-case ++ caadr cdddr rest ++ caar cddr row-major-aref ++ cadaar cdr sbit ++ cadadr char schar ++ cadar class-name second ++ caddar compiler-macro-function seventh ++ cadddr documentation sixth ++ caddr eighth slot-value ++ cadr elt subseq ++ car fdefinition svref ++ cdaaar fifth symbol-function ++ cdaadr fill-pointer symbol-plist ++ cdaar find-class symbol-value ++ cdadar first tenth ++ cdaddr fourth third ++ ++ Figure 5-7: Functions that setf can be used with--1 ++ ++ ++ In the case of subseq, the replacement value must be a sequence ++ whose elements might be contained by the sequence argument to ++ subseq, but does not have to be a sequence of the same type as the ++ sequence of which the subsequence is specified. If the length of ++ the replacement value does not equal the length of the subsequence ++ to be replaced, then the shorter length determines the number of ++ elements to be stored, as for replace. ++ ++* ++ A function call form whose first element is the name of a selector ++ function constructed by defstruct. ++ ++ The function name must refer to the global function definition, ++ rather than a locally defined function. ++ ++* ++ A function call form whose first element is the name of any one of ++ the functions in Figure 5-8, provided that the supplied argument to ++ that function is in turn a place form; in this case the new place ++ has stored back into it the result of applying the supplied ++ "update" function. ++ ++ Function name Argument that is a place Update function used ++ ldb second dpb ++ mask-field second deposit-field ++ getf first implementation-dependent ++ ++ Figure 5-8: Functions that setf can be used with--2 ++ ++ ++ During the setf expansion of these forms, it is necessary to call ++ ++ get-setf-expansion ++ ++ in order to figure out how the inner, nested generalized variable ++ must be treated. ++ ++ The information from ++ ++ get-setf-expansion ++ ++ is used as follows. ++ ++ ldb ++ In a form such as: ++ ++ (setf (ldb byte-spec place-form) value-form) ++ ++ the place referred to by the place-form must always be both ++ read and written; note that the update is to the generalized ++ variable specified by place-form, not to any object of type ++ integer. ++ ++ Thus this setf should generate code to do the following: ++ ++ 1. ++ Evaluate byte-spec (and bind it into a temporary ++ variable). ++ 2. ++ Bind the temporary variables for place-form. ++ 3. ++ Evaluate value-form (and bind ++ ++ its value or values into the store variable). ++ ++ 4. ++ Do the read from place-form. ++ 5. ++ Do the write into place-form with the given bits of the ++ integer fetched in step 4 replaced with the value from ++ step 3. ++ ++ If the evaluation of value-form in step 3 alters what is found ++ in place-form, such as setting different bits of integer, then ++ the change of the bits denoted by byte-spec is to that altered ++ integer, because step 4 is done after the value-form ++ evaluation. Nevertheless, the evaluations required for ++ binding the temporary variables are done in steps 1 and 2, and ++ thus the expected left-to-right evaluation order is seen. For ++ example: ++ ++ (setq integer #x69) => #x69 ++ (rotatef (ldb (byte 4 4) integer) ++ (ldb (byte 4 0) integer)) ++ integer => #x96 ++ ;;; This example is trying to swap two independent bit fields ++ ;;; in an integer. Note that the generalized variable of ++ ;;; interest here is just the (possibly local) program variable ++ ;;; integer. ++ ++ mask-field ++ This case is the same as ldb in all essential aspects. ++ ++ getf ++ In a form such as: ++ ++ (setf (getf place-form ind-form) value-form) ++ ++ the place referred to by place-form must always be both read ++ and written; note that the update is to the generalized ++ variable specified by place-form, not necessarily to the ++ particular list that is the property list in question. ++ ++ Thus this setf should generate code to do the following: ++ ++ 1. ++ Bind the temporary variables for place-form. ++ 2. ++ Evaluate ind-form (and bind it into a temporary ++ variable). ++ 3. ++ Evaluate value-form (and bind ++ ++ its value or values into the store variable). ++ ++ 4. ++ Do the read from place-form. ++ 5. ++ Do the write into place-form with a possibly-new property ++ list obtained by combining the values from steps 2, 3, ++ and 4. (Note that the phrase "possibly-new property ++ list" can mean that the former property list is somehow ++ destructively re-used, or it can mean partial or full ++ copying of it. Since either copying or destructive ++ re-use can occur, the treatment of the resultant value ++ for the possibly-new property list must proceed as if it ++ were a different copy needing to be stored back into the ++ generalized variable.) ++ ++ If the evaluation of value-form in step 3 alters what is found ++ in place-form, such as setting a different named property in ++ the list, then the change of the property denoted by ind-form ++ is to that altered list, because step 4 is done after the ++ value-form evaluation. Nevertheless, the evaluations required ++ for binding the temporary variables are done in steps 1 and 2, ++ and thus the expected left-to-right evaluation order is seen. ++ ++ For example: ++ ++ (setq s (setq r (list (list 'a 1 'b 2 'c 3)))) => ((a 1 b 2 c 3)) ++ (setf (getf (car r) 'b) ++ (progn (setq r nil) 6)) => 6 ++ r => NIL ++ s => ((A 1 B 6 C 3)) ++ ;;; Note that the (setq r nil) does not affect the actions of ++ ;;; the SETF because the value of R had already been saved in ++ ;;; a temporary variable as part of the step 1. Only the CAR ++ ;;; of this value will be retrieved, and subsequently modified ++ ;;; after the value computation. ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-3 +@@ -0,0 +1,8719 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: VALUES Forms as Places, Next: THE Forms as Places, Prev: Function Call Forms as Places, Up: Kinds of Places ++ ++5.1.2.3 VALUES Forms as Places ++.............................. ++ ++A values form can be used as a place, provided that each of its subforms ++is also a place form. ++ ++ A form such as ++ ++ (setf (values place-1 \dots place-n) values-form) ++ ++ does the following: ++ ++1. ++ The subforms of each nested place are evaluated in left-to-right ++ order. ++2. ++ The values-form is evaluated, and the first store variable from ++ each place is bound to its return values as if by ++ multiple-value-bind. ++3. ++ If the setf expansion for any place involves more than one store ++ variable, then the additional store variables are bound to nil. ++4. ++ The storing forms for each place are evaluated in left-to-right ++ order. ++ ++ The storing form in the setf expansion of values returns as multiple ++values_2 the values of the store variables in step 2. That is, the ++number of values returned is the same as the number of place forms. ++This may be more or fewer values than are produced by the values-form. ++ ++ ++File: gcl.info, Node: THE Forms as Places, Next: APPLY Forms as Places, Prev: VALUES Forms as Places, Up: Kinds of Places ++ ++5.1.2.4 THE Forms as Places ++........................... ++ ++A the form can be used as a place, in which case the declaration is ++transferred to the newvalue form, and the resulting setf is analyzed. ++For example, ++ ++ (setf (the integer (cadr x)) (+ y 3)) ++ ++ is processed as if it were ++ ++ (setf (cadr x) (the integer (+ y 3))) ++ ++ ++File: gcl.info, Node: APPLY Forms as Places, Next: Setf Expansions and Places, Prev: THE Forms as Places, Up: Kinds of Places ++ ++5.1.2.5 APPLY Forms as Places ++............................. ++ ++The following situations involving setf of apply must be supported: ++ ++* ++ (setf (apply #'aref array {subscript}* more-subscripts) ++ new-element) ++* ++ (setf (apply #'bit array {subscript}* more-subscripts) new-element) ++* ++ (setf (apply #'sbit array {subscript}* more-subscripts) ++ new-element) ++ ++ In all three cases, the element of array designated by the ++concatenation of subscripts and more-subscripts (i.e., the same element ++which would be read by the call to apply if it were not part of a setf ++form) is changed to have the value given by new-element. ++ ++ For these usages, the function name (aref, bit, or sbit) must refer ++to the global function definition, rather than a locally defined ++function. ++ ++ No other standardized function is required to be supported, but an ++implementation may define such support. An implementation may also ++define support for implementation-defined operators. ++ ++ If a user-defined function is used in this context, the following ++equivalence is true, except that care is taken to preserve proper ++left-to-right evaluation of argument subforms: ++ ++ (setf (apply #'name {arg}*) val) ++ == (apply #'(setf name) val {arg}*) ++ ++ ++File: gcl.info, Node: Setf Expansions and Places, Next: Macro Forms as Places, Prev: APPLY Forms as Places, Up: Kinds of Places ++ ++5.1.2.6 Setf Expansions and Places ++.................................. ++ ++Any compound form for which the operator has a ++ ++ setf expander ++ ++ defined can be used as a place. ++ ++ The operator must refer to the global function definition, rather ++than a locally defined function or macro. ++ ++ ++File: gcl.info, Node: Macro Forms as Places, Next: Symbol Macros as Places, Prev: Setf Expansions and Places, Up: Kinds of Places ++ ++5.1.2.7 Macro Forms as Places ++............................. ++ ++A macro form can be used as a place, in which case Common Lisp expands ++the macro form ++ ++ as if by macroexpand-1 ++ ++ and then uses the macro expansion in place of the original place. ++ ++ Such macro expansion is attempted only after exhausting all other ++possibilities other than expanding into a call to a function named (setf ++reader). ++ ++ ++File: gcl.info, Node: Symbol Macros as Places, Next: Other Compound Forms as Places, Prev: Macro Forms as Places, Up: Kinds of Places ++ ++5.1.2.8 Symbol Macros as Places ++............................... ++ ++A reference to a symbol that has been established as a symbol macro can ++be used as a place. In this case, setf expands the reference and then ++analyzes the resulting form. ++ ++ ++File: gcl.info, Node: Other Compound Forms as Places, Prev: Symbol Macros as Places, Up: Kinds of Places ++ ++5.1.2.9 Other Compound Forms as Places ++...................................... ++ ++For any other compound form for which the operator is a symbol f, the ++setf form expands into a call to the function named (setf f). The first ++argument in the newly constructed function form is newvalue and the ++remaining arguments are the remaining elements of place. This expansion ++occurs regardless of whether f or (setf f) is defined as a function ++locally, globally, or not at all. For example, ++ ++ (setf (f arg1 arg2 ...) new-value) ++ ++ expands into a form with the same effect and value as ++ ++ (let ((#:temp-1 arg1) ;force correct order of evaluation ++ (#:temp-2 arg2) ++ ... ++ (#:temp-0 new-value)) ++ (funcall (function (setf f)) #:temp-0 #:temp-1 #:temp-2...)) ++ ++ A function named (setf f) must return its first argument as its only ++value in order to preserve the semantics of setf. ++ ++ ++File: gcl.info, Node: Treatment of Other Macros Based on SETF, Prev: Kinds of Places, Up: Generalized Reference ++ ++5.1.3 Treatment of Other Macros Based on SETF ++--------------------------------------------- ++ ++For each of the "read-modify-write" operators in Figure 5-9, and for any ++additional macros defined by the programmer using define-modify-macro, ++an exception is made to the normal rule of left-to-right evaluation of ++arguments. Evaluation of argument forms occurs in left-to-right order, ++with the exception that for the place argument, the actual read of the ++"old value" from that place happens after all of the argument form ++evaluations, and just before a "new value" is computed and written back ++into the place. ++ ++ Specifically, each of these operators can be viewed as involving a ++form with the following general syntax: ++ ++ (operator {preceding-form}* place {following-form}*) ++ ++ The evaluation of each such form proceeds like this: ++ ++1. ++ Evaluate each of the preceding-forms, in left-to-right order. ++2. ++ Evaluate the subforms of the place, in the order specified by the ++ second value of the setf expansion for that place. ++3. ++ Evaluate each of the following-forms, in left-to-right order. ++4. ++ Read the old value from place. ++5. ++ Compute the new value. ++6. ++ Store the new value into place. ++ ++ decf pop pushnew ++ incf push remf ++ ++ Figure 5-9: Read-Modify-Write Macros ++ ++ ++ ++File: gcl.info, Node: Transfer of Control to an Exit Point, Next: Data and Control Flow Dictionary, Prev: Generalized Reference, Up: Data and Control Flow ++ ++5.2 Transfer of Control to an Exit Point ++======================================== ++ ++When a transfer of control is initiated by go, return-from, or throw the ++following events occur in order to accomplish the transfer of control. ++Note that for go, the exit point is the form within the tagbody that is ++being executed at the time the go is performed; for return-from, the ++exit point is the corresponding block form; and for throw, the exit ++point is the corresponding catch form. ++ ++1. ++ Intervening exit points are "abandoned" (i.e., their extent ends ++ and it is no longer valid to attempt to transfer control through ++ them). ++ ++2. ++ The cleanup clauses of any intervening unwind-protect clauses are ++ evaluated. ++ ++3. ++ Intervening dynamic bindings of special variables, catch tags, ++ condition handlers, and restarts are undone. ++ ++4. ++ The extent of the exit point being invoked ends, and control is ++ passed to the target. ++ ++ The extent of an exit being "abandoned" because it is being passed ++over ends as soon as the transfer of control is initiated. That is, ++event 1 occurs at the beginning of the initiation of the transfer of ++control. The consequences are undefined if an attempt is made to ++transfer control to an exit point whose dynamic extent has ended. ++ ++ Events 2 and 3 are actually performed interleaved, in the order ++corresponding to the reverse order in which they were established. The ++effect of this is that the cleanup clauses of an unwind-protect see the ++same dynamic bindings of variables and catch tags as were visible when ++the unwind-protect was entered. ++ ++ Event 4 occurs at the end of the transfer of control. ++ ++ ++File: gcl.info, Node: Data and Control Flow Dictionary, Prev: Transfer of Control to an Exit Point, Up: Data and Control Flow ++ ++5.3 Data and Control Flow Dictionary ++==================================== ++ ++* Menu: ++ ++* apply:: ++* defun:: ++* fdefinition:: ++* fboundp:: ++* fmakunbound:: ++* flet:: ++* funcall:: ++* function (Special Operator):: ++* function-lambda-expression:: ++* functionp:: ++* compiled-function-p:: ++* call-arguments-limit:: ++* lambda-list-keywords:: ++* lambda-parameters-limit:: ++* defconstant:: ++* defparameter:: ++* destructuring-bind:: ++* let:: ++* progv:: ++* setq:: ++* psetq:: ++* block:: ++* catch:: ++* go:: ++* return-from:: ++* return:: ++* tagbody:: ++* throw:: ++* unwind-protect:: ++* nil:: ++* not:: ++* t:: ++* eq:: ++* eql:: ++* equal:: ++* equalp:: ++* identity:: ++* complement:: ++* constantly:: ++* every:: ++* and:: ++* cond:: ++* if:: ++* or:: ++* when:: ++* case:: ++* typecase:: ++* multiple-value-bind:: ++* multiple-value-call:: ++* multiple-value-list:: ++* multiple-value-prog1:: ++* multiple-value-setq:: ++* values:: ++* values-list:: ++* multiple-values-limit:: ++* nth-value:: ++* prog:: ++* prog1:: ++* progn:: ++* define-modify-macro:: ++* defsetf:: ++* define-setf-expander:: ++* get-setf-expansion:: ++* setf:: ++* shiftf:: ++* rotatef:: ++* control-error:: ++* program-error:: ++* undefined-function:: ++ ++ ++File: gcl.info, Node: apply, Next: defun, Prev: Data and Control Flow Dictionary, Up: Data and Control Flow Dictionary ++ ++5.3.1 apply [Function] ++---------------------- ++ ++'apply' function &rest args^+ => {result}* ++ ++Arguments and Values:: ++...................... ++ ++function--a function designator. ++ ++ args--a spreadable argument list designator. ++ ++ results--the values returned by function. ++ ++Description:: ++............. ++ ++Applies the function to the args. ++ ++ When the function receives its arguments via &rest, it is permissible ++(but not required) for the implementation to bind the rest parameter to ++an object that shares structure with the last argument to apply. ++Because a function can neither detect whether it was called via apply ++nor whether (if so) the last argument to apply was a constant, ++conforming programs must neither rely on the list structure of a rest ++list to be freshly consed, nor modify that list structure. ++ ++ setf can be used with apply in certain circumstances; see *note APPLY ++Forms as Places::. ++ ++Examples:: ++.......... ++ ++ (setq f '+) => + ++ (apply f '(1 2)) => 3 ++ (setq f #'-) => # ++ (apply f '(1 2)) => -1 ++ (apply #'max 3 5 '(2 7 3)) => 7 ++ (apply 'cons '((+ 2 3) 4)) => ((+ 2 3) . 4) ++ (apply #'+ '()) => 0 ++ ++ (defparameter *some-list* '(a b c)) ++ (defun strange-test (&rest x) (eq x *some-list*)) ++ (apply #'strange-test *some-list*) => implementation-dependent ++ ++ (defun bad-boy (&rest x) (rplacd x 'y)) ++ (bad-boy 'a 'b 'c) has undefined consequences. ++ (apply #'bad-boy *some-list*) has undefined consequences. ++ ++ (defun foo (size &rest keys &key double &allow-other-keys) ++ (let ((v (apply #'make-array size :allow-other-keys t keys))) ++ (if double (concatenate (type-of v) v v) v))) ++ (foo 4 :initial-contents '(a b c d) :double t) ++ => #(A B C D A B C D) ++ ++See Also:: ++.......... ++ ++*note funcall:: , *note fdefinition:: , function, *note Evaluation::, ++*note APPLY Forms as Places:: ++ ++ ++File: gcl.info, Node: defun, Next: fdefinition, Prev: apply, Up: Data and Control Flow Dictionary ++ ++5.3.2 defun [Macro] ++------------------- ++ ++'defun' function-name lambda-list [[{declaration}* | documentation]] ++{form}* ++=> function-name ++ ++Arguments and Values:: ++...................... ++ ++function-name--a function name. ++ ++ lambda-list--an ordinary lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ forms--an implicit progn. ++ ++ block-name--the function block name of the function-name. ++ ++Description:: ++............. ++ ++Defines a new function named function-name in the global environment. ++The body of the function defined by defun consists of forms; they are ++executed as an implicit progn when the function is called. defun can be ++used to define a new function, to install a corrected version of an ++incorrect definition, to redefine an already-defined function, or to ++redefine a macro as a function. ++ ++ defun implicitly puts a block named block-name around the body forms ++ ++ (but not the forms in the lambda-list) ++ ++ of the function defined. ++ ++ Documentation is attached as a documentation string to name (as kind ++function) and to the function object. ++ ++ Evaluating defun causes function-name to be a global name for the ++function specified by the lambda expression ++ ++ (lambda lambda-list ++ [[{declaration}* | documentation]] ++ (block block-name {form}*)) ++ ++ processed in the lexical environment in which defun was executed. ++ ++ (None of the arguments are evaluated at macro expansion time.) ++ ++ defun is not required to perform any compile-time side effects. In ++particular, defun does not make the function definition available at ++compile time. An implementation may choose to store information about ++the function for the purposes of compile-time error-checking (such as ++checking the number of arguments on calls), or to enable the function to ++be expanded inline. ++ ++Examples:: ++.......... ++ ++ (defun recur (x) ++ (when (> x 0) ++ (recur (1- x)))) => RECUR ++ (defun ex (a b &optional c (d 66) &rest keys &key test (start 0)) ++ (list a b c d keys test start)) => EX ++ (ex 1 2) => (1 2 NIL 66 NIL NIL 0) ++ (ex 1 2 3 4 :test 'equal :start 50) ++ => (1 2 3 4 (:TEST EQUAL :START 50) EQUAL 50) ++ (ex :test 1 :start 2) => (:TEST 1 :START 2 NIL NIL 0) ++ ++ ;; This function assumes its callers have checked the types of the ++ ;; arguments, and authorizes the compiler to build in that assumption. ++ (defun discriminant (a b c) ++ (declare (number a b c)) ++ "Compute the discriminant for a quadratic equation." ++ (- (* b b) (* 4 a c))) => DISCRIMINANT ++ (discriminant 1 2/3 -2) => 76/9 ++ ++ ;; This function assumes its callers have not checked the types of the ++ ;; arguments, and performs explicit type checks before making any assumptions. ++ (defun careful-discriminant (a b c) ++ "Compute the discriminant for a quadratic equation." ++ (check-type a number) ++ (check-type b number) ++ (check-type c number) ++ (locally (declare (number a b c)) ++ (- (* b b) (* 4 a c)))) => CAREFUL-DISCRIMINANT ++ (careful-discriminant 1 2/3 -2) => 76/9 ++ ++See Also:: ++.......... ++ ++*note flet:: , labels, *note block:: , *note return-from:: , declare, ++*note documentation:: , *note Evaluation::, *note Ordinary Lambda ++Lists::, *note Syntactic Interaction of Documentation Strings and ++Declarations:: ++ ++Notes:: ++....... ++ ++return-from can be used to return prematurely from a function defined by ++defun. ++ ++ Additional side effects might take place when additional information ++(typically debugging information) about the function definition is ++recorded. ++ ++ ++File: gcl.info, Node: fdefinition, Next: fboundp, Prev: defun, Up: Data and Control Flow Dictionary ++ ++5.3.3 fdefinition [Accessor] ++---------------------------- ++ ++'fdefinition' function-name => definition ++ ++ (setf (' fdefinition' function-name) new-definition) ++ ++Arguments and Values:: ++...................... ++ ++function-name--a function name. ++ ++ In the non-setf case, the name must be fbound in the global ++environment. ++ ++ definition--Current global function definition named by ++function-name. ++ ++ new-definition--a function. ++ ++Description:: ++............. ++ ++fdefinition accesses the current global function definition named by ++function-name. The definition may be a function or may be an object ++representing a special form or macro. ++ ++ The value returned by fdefinition when fboundp returns true but the ++function-name denotes a macro or special form is not well-defined, but ++fdefinition does not signal an error. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if function-name is not a ++function name. ++ ++ An error of type undefined-function is signaled in the non-setf case ++if function-name is not fbound. ++ ++See Also:: ++.......... ++ ++*note fboundp:: , *note fmakunbound:: , *note macro-function:: , ++ ++ *note special-operator-p:: , ++ ++ *note symbol-function:: ++ ++Notes:: ++....... ++ ++fdefinition cannot access the value of a lexical function name produced ++by flet or labels; it can access only the global function value. ++ ++ setf can be used with fdefinition to replace a global function ++definition when the function-name's function definition does not ++represent a special form. ++ ++ setf of fdefinition requires a function as the new value. It is an ++error to set the fdefinition of a function-name to a symbol, a list, or ++the value returned by fdefinition on the name of a macro or special ++form. ++ ++ ++File: gcl.info, Node: fboundp, Next: fmakunbound, Prev: fdefinition, Up: Data and Control Flow Dictionary ++ ++5.3.4 fboundp [Function] ++------------------------ ++ ++'fboundp' name => generalized-boolean ++ ++Pronunciation:: ++............... ++ ++pronounced ,ef 'baund p\=e ++ ++Arguments and Values:: ++...................... ++ ++name--a function name. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if name is fbound; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (fboundp 'car) => true ++ (fboundp 'nth-value) => false ++ (fboundp 'with-open-file) => true ++ (fboundp 'unwind-protect) => true ++ (defun my-function (x) x) => MY-FUNCTION ++ (fboundp 'my-function) => true ++ (let ((saved-definition (symbol-function 'my-function))) ++ (unwind-protect (progn (fmakunbound 'my-function) ++ (fboundp 'my-function)) ++ (setf (symbol-function 'my-function) saved-definition))) ++ => false ++ (fboundp 'my-function) => true ++ (defmacro my-macro (x) `',x) => MY-MACRO ++ (fboundp 'my-macro) => true ++ (fmakunbound 'my-function) => MY-FUNCTION ++ (fboundp 'my-function) => false ++ (flet ((my-function (x) x)) ++ (fboundp 'my-function)) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if name is not a function ++name. ++ ++See Also:: ++.......... ++ ++*note symbol-function:: , *note fmakunbound:: , *note fdefinition:: ++ ++Notes:: ++....... ++ ++It is permissible to call symbol-function on any symbol that is fbound. ++ ++ fboundp is sometimes used to "guard" an access to the function cell, ++as in: ++ (if (fboundp x) (symbol-function x)) ++ ++ Defining a setf expander F does not cause the setf function (setf F) ++to become defined. ++ ++ ++File: gcl.info, Node: fmakunbound, Next: flet, Prev: fboundp, Up: Data and Control Flow Dictionary ++ ++5.3.5 fmakunbound [Function] ++---------------------------- ++ ++'fmakunbound' name => name ++ ++Pronunciation:: ++............... ++ ++pronounced ,ef 'mak e n,baund or pronounced ,ef 'm\=a k e n,baund ++ ++Arguments and Values:: ++...................... ++ ++name--a function name. ++ ++Description:: ++............. ++ ++Removes the function or macro definition, if any, of name in the global ++environment. ++ ++Examples:: ++.......... ++ ++ (defun add-some (x) (+ x 19)) => ADD-SOME ++ (fboundp 'add-some) => true ++ (flet ((add-some (x) (+ x 37))) ++ (fmakunbound 'add-some) ++ (add-some 1)) => 38 ++ (fboundp 'add-some) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if name is not a function ++name. ++ ++ The consequences are undefined if name is a special operator. ++ ++See Also:: ++.......... ++ ++*note fboundp:: , *note makunbound:: ++ ++ ++File: gcl.info, Node: flet, Next: funcall, Prev: fmakunbound, Up: Data and Control Flow Dictionary ++ ++5.3.6 flet, labels, macrolet [Special Operator] ++----------------------------------------------- ++ ++'flet' ({(function-name lambda-list [[{local-declaration}* | ++local-documentation]] {local-form}*)}*) {declaration}* {form}* ++=> {result}* ++ ++ 'labels' ({(function-name lambda-list [[{local-declaration}* | ++local-documentation]] {local-form}*)}*) {declaration}* {form}* ++=> {result}* ++ ++ 'macrolet' ({(name lambda-list [[{local-declaration}* | ++local-documentation]] {local-form}*)}*) {declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++function-name--a function name. ++ ++ name--a symbol. ++ ++ lambda-list--a lambda list; for flet and labels, it is an ordinary ++lambda list; for macrolet, it is a macro lambda list. ++ ++ local-declaration--a declare expression; not evaluated. ++ ++ declaration--a declare expression; not evaluated. ++ ++ local-documentation--a string; not evaluated. ++ ++ local-forms, forms--an implicit progn. ++ ++ results--the values of the forms. ++ ++Description:: ++............. ++ ++flet, labels, and macrolet define local functions and macros, and ++execute forms using the local definitions. Forms are executed in order ++of occurrence. ++ ++ The body forms (but not the lambda list) ++ ++ of each function created by flet and labels and each macro created by ++macrolet are enclosed in an implicit block whose name is the function ++block name of the function-name or name, as appropriate. ++ ++ The scope of the declarations between the list of local ++function/macro definitions and the body forms in flet and labels does ++not include the bodies of the locally defined functions, except that for ++labels, any inline, notinline, or ftype declarations that refer to the ++locally defined functions do apply to the local function bodies. That ++is, their scope is the same as the function name that they affect. ++ ++ The scope of these declarations does not include the bodies of the ++macro expander functions defined by macrolet. ++ ++flet ++ flet defines locally named functions and executes a series of forms ++ with these definition bindings. Any number of such local functions ++ can be defined. ++ ++ The scope of the name binding encompasses only the body. Within ++ the body of flet, function-names matching those defined by flet ++ refer to the locally defined functions rather than to the global ++ function definitions of the same name. ++ ++ Also, within the scope of flet, global setf expander definitions of ++ the function-name defined by flet do not apply. Note that this ++ applies to (defsetf f ...), not (defmethod (setf f) ...). ++ ++ The names of functions defined by flet are in the lexical ++ environment; they retain their local definitions only within the ++ body of flet. The function definition bindings are visible only in ++ the body of flet, not the definitions themselves. Within the ++ function definitions, local function names that match those being ++ defined refer to functions or macros defined outside the flet. ++ flet can locally shadow a global function name, and the new ++ definition can refer to the global definition. ++ ++ Any local-documentation is attached to the corresponding local ++ function (if one is actually created) as a documentation string. ++ ++labels ++ labels is equivalent to flet except that the scope of the defined ++ function names for labels encompasses the function definitions ++ themselves as well as the body. ++ ++macrolet ++ macrolet establishes local macro definitions, using the same format ++ used by defmacro. ++ ++ Within the body of macrolet, global setf expander definitions of ++ the names defined by the macrolet do not apply; rather, setf ++ expands the macro form and recursively process the resulting form. ++ ++ The macro-expansion functions defined by macrolet are defined in ++ the ++ ++ lexical environment in which the macrolet form appears. ++ Declarations and macrolet and symbol-macrolet definitions affect ++ the local macro definitions in a macrolet, but the consequences are ++ undefined if the local macro definitions reference any local ++ variable or function bindings that are visible in that lexical ++ environment. ++ ++ Any local-documentation is attached to the corresponding local ++ macro function as a documentation string. ++ ++Examples:: ++.......... ++ ++ (defun foo (x flag) ++ (macrolet ((fudge (z) ++ ;The parameters x and flag are not accessible ++ ; at this point; a reference to flag would be to ++ ; the global variable of that name. ++ ` (if flag (* ,z ,z) ,z))) ++ ;The parameters x and flag are accessible here. ++ (+ x ++ (fudge x) ++ (fudge (+ x 1))))) ++ == ++ (defun foo (x flag) ++ (+ x ++ (if flag (* x x) x) ++ (if flag (* (+ x 1) (+ x 1)) (+ x 1)))) ++ ++ after macro expansion. The occurrences of x and flag legitimately ++refer to the parameters of the function foo because those parameters are ++visible at the site of the macro call which produced the expansion. ++ ++ (flet ((flet1 (n) (+ n n))) ++ (flet ((flet1 (n) (+ 2 (flet1 n)))) ++ (flet1 2))) => 6 ++ ++ (defun dummy-function () 'top-level) => DUMMY-FUNCTION ++ (funcall #'dummy-function) => TOP-LEVEL ++ (flet ((dummy-function () 'shadow)) ++ (funcall #'dummy-function)) => SHADOW ++ (eq (funcall #'dummy-function) (funcall 'dummy-function)) ++ => true ++ (flet ((dummy-function () 'shadow)) ++ (eq (funcall #'dummy-function) ++ (funcall 'dummy-function))) ++ => false ++ ++ (defun recursive-times (k n) ++ (labels ((temp (n) ++ (if (zerop n) 0 (+ k (temp (1- n)))))) ++ (temp n))) => RECURSIVE-TIMES ++ (recursive-times 2 3) => 6 ++ ++ (defmacro mlets (x &environment env) ++ (let ((form `(babbit ,x))) ++ (macroexpand form env))) => MLETS ++ (macrolet ((babbit (z) `(+ ,z ,z))) (mlets 5)) => 10 ++ ++ (flet ((safesqrt (x) (sqrt (abs x)))) ++ ;; The safesqrt function is used in two places. ++ (safesqrt (apply #'+ (map 'list #'safesqrt '(1 2 3 4 5 6))))) ++ => 3.291173 ++ ++ (defun integer-power (n k) ++ (declare (integer n)) ++ (declare (type (integer 0 *) k)) ++ (labels ((expt0 (x k a) ++ (declare (integer x a) (type (integer 0 *) k)) ++ (cond ((zerop k) a) ++ ((evenp k) (expt1 (* x x) (floor k 2) a)) ++ (t (expt0 (* x x) (floor k 2) (* x a))))) ++ (expt1 (x k a) ++ (declare (integer x a) (type (integer 0 *) k)) ++ (cond ((evenp k) (expt1 (* x x) (floor k 2) a)) ++ (t (expt0 (* x x) (floor k 2) (* x a)))))) ++ (expt0 n k 1))) => INTEGER-POWER ++ ++ (defun example (y l) ++ (flet ((attach (x) ++ (setq l (append l (list x))))) ++ (declare (inline attach)) ++ (dolist (x y) ++ (unless (null (cdr x)) ++ (attach x))) ++ l)) ++ ++ (example '((a apple apricot) (b banana) (c cherry) (d) (e)) ++ '((1) (2) (3) (4 2) (5) (6 3 2))) ++ => ((1) (2) (3) (4 2) (5) (6 3 2) (A APPLE APRICOT) (B BANANA) (C CHERRY)) ++ ++See Also:: ++.......... ++ ++declare, *note defmacro:: , *note defun:: , *note documentation:: , ++*note let:: , *note Evaluation::, *note Syntactic Interaction of ++Documentation Strings and Declarations:: ++ ++Notes:: ++....... ++ ++It is not possible to define recursive functions with flet. labels can ++be used to define mutually recursive functions. ++ ++ If a macrolet form is a top level form, the body forms are also ++processed as top level forms. See *note File Compilation::. ++ ++ ++File: gcl.info, Node: funcall, Next: function (Special Operator), Prev: flet, Up: Data and Control Flow Dictionary ++ ++5.3.7 funcall [Function] ++------------------------ ++ ++'funcall' function &rest args => {result}* ++ ++Arguments and Values:: ++...................... ++ ++function--a function designator. ++ ++ args--arguments to the function. ++ ++ results--the values returned by the function. ++ ++Description:: ++............. ++ ++funcall applies function to args. ++ ++ If function is a symbol, it is coerced to a function as if by finding ++its functional value in the global environment. ++ ++Examples:: ++.......... ++ ++ (funcall #'+ 1 2 3) => 6 ++ (funcall 'car '(1 2 3)) => 1 ++ (funcall 'position 1 '(1 2 3 2 1) :start 1) => 4 ++ (cons 1 2) => (1 . 2) ++ (flet ((cons (x y) `(kons ,x ,y))) ++ (let ((cons (symbol-function '+))) ++ (funcall #'cons ++ (funcall 'cons 1 2) ++ (funcall cons 1 2)))) ++ => (KONS (1 . 2) 3) ++ ++Exceptional Situations:: ++........................ ++ ++An error of type undefined-function should be signaled if function is a ++symbol that does not have a global definition as a function or that has ++a global definition as a macro or a special operator. ++ ++See Also:: ++.......... ++ ++*note apply:: , function, *note Evaluation:: ++ ++Notes:: ++....... ++ ++ (funcall function arg1 arg2 ...) ++ == (apply function arg1 arg2 ... nil) ++ == (apply function (list arg1 arg2 ...)) ++ ++ The difference between funcall and an ordinary function call is that ++in the former case the function is obtained by ordinary evaluation of a ++form, and in the latter case it is obtained by the special ++interpretation of the function position that normally occurs. ++ ++ ++File: gcl.info, Node: function (Special Operator), Next: function-lambda-expression, Prev: funcall, Up: Data and Control Flow Dictionary ++ ++5.3.8 function [Special Operator] ++--------------------------------- ++ ++'function' name => function ++ ++Arguments and Values:: ++...................... ++ ++name--a function name or lambda expression. ++ ++ function--a function object. ++ ++Description:: ++............. ++ ++The value of function is the functional value of name in the current ++lexical environment. ++ ++ If name is a function name, the functional definition of that name is ++that established by the innermost lexically enclosing flet, labels, or ++macrolet form, if there is one. Otherwise the global functional ++definition of the function name is returned. ++ ++ If name is a lambda expression, then a lexical closure is returned. ++In situations where a closure over the same set of bindings might be ++produced more than once, the various resulting closures might or might ++not be eq. ++ ++ It is an error to use function on a function name that does not ++denote a function in the lexical environment in which the function form ++appears. Specifically, it is an error to use function on a symbol that ++denotes a macro or special form. An implementation may choose not to ++signal this error for performance reasons, but implementations are ++forbidden from defining the failure to signal an error as a useful ++behavior. ++ ++Examples:: ++.......... ++ ++ (defun adder (x) (function (lambda (y) (+ x y)))) ++ ++ The result of (adder 3) is a function that adds 3 to its argument: ++ ++ (setq add3 (adder 3)) ++ (funcall add3 5) => 8 ++ ++ This works because function creates a closure of the lambda ++expression that is able to refer to the value 3 of the variable x even ++after control has returned from the function adder. ++ ++See Also:: ++.......... ++ ++*note defun:: , *note fdefinition:: , *note flet:: , labels, *note ++symbol-function:: , *note Symbols as Forms::, *note Sharpsign ++Single-Quote::, *note Printing Other Objects:: ++ ++Notes:: ++....... ++ ++The notation #'name may be used as an abbreviation for (function name). ++ ++ ++File: gcl.info, Node: function-lambda-expression, Next: functionp, Prev: function (Special Operator), Up: Data and Control Flow Dictionary ++ ++5.3.9 function-lambda-expression [Function] ++------------------------------------------- ++ ++'function-lambda-expression' function ++=> lambda-expression, closure-p, name ++ ++Arguments and Values:: ++...................... ++ ++function--a function. ++ ++ lambda-expression--a lambda expression or nil. ++ ++ closure-p--a generalized boolean. ++ ++ name--an object. ++ ++Description:: ++............. ++ ++Returns information about function as follows: ++ ++ The primary value, lambda-expression, is function's defining lambda ++expression, or nil if the information is not available. The lambda ++expression may have been pre-processed in some ways, but it should ++remain a suitable argument to compile or function. Any implementation ++may legitimately return nil as the lambda-expression of any function. ++ ++ The secondary value, closure-p, is nil if function's definition was ++enclosed in the null lexical environment or something non-nil if ++function's definition might have been enclosed in some non-null lexical ++environment. Any implementation may legitimately return true as the ++closure-p of any function. ++ ++ The tertiary value, name, is the "name" of function. The name is ++intended for debugging only and is not necessarily one that would be ++valid for use as a name in defun or function, for example. By ++convention, nil is used to mean that function has no name. Any ++implementation may legitimately return nil as the name of any function. ++ ++Examples:: ++.......... ++ ++The following examples illustrate some possible return values, but are ++not intended to be exhaustive: ++ ++ (function-lambda-expression #'(lambda (x) x)) ++ => NIL, false, NIL ++ OR=> NIL, true, NIL ++ OR=> (LAMBDA (X) X), true, NIL ++ OR=> (LAMBDA (X) X), false, NIL ++ ++ (function-lambda-expression ++ (funcall #'(lambda () #'(lambda (x) x)))) ++ => NIL, false, NIL ++ OR=> NIL, true, NIL ++ OR=> (LAMBDA (X) X), true, NIL ++ OR=> (LAMBDA (X) X), false, NIL ++ ++ (function-lambda-expression ++ (funcall #'(lambda (x) #'(lambda () x)) nil)) ++ => NIL, true, NIL ++ OR=> (LAMBDA () X), true, NIL ++ NOT=> NIL, false, NIL ++ NOT=> (LAMBDA () X), false, NIL ++ ++ (flet ((foo (x) x)) ++ (setf (symbol-function 'bar) #'foo) ++ (function-lambda-expression #'bar)) ++ => NIL, false, NIL ++ OR=> NIL, true, NIL ++ OR=> (LAMBDA (X) (BLOCK FOO X)), true, NIL ++ OR=> (LAMBDA (X) (BLOCK FOO X)), false, FOO ++ OR=> (SI::BLOCK-LAMBDA FOO (X) X), false, FOO ++ ++ (defun foo () ++ (flet ((bar (x) x)) ++ #'bar)) ++ (function-lambda-expression (foo)) ++ => NIL, false, NIL ++ OR=> NIL, true, NIL ++ OR=> (LAMBDA (X) (BLOCK BAR X)), true, NIL ++ OR=> (LAMBDA (X) (BLOCK BAR X)), true, (:INTERNAL FOO 0 BAR) ++ OR=> (LAMBDA (X) (BLOCK BAR X)), false, "BAR in FOO" ++ ++Notes:: ++....... ++ ++Although implementations are free to return "nil, true, nil" in all ++cases, they are encouraged to return a lambda expression as the primary ++value in the case where the argument was created by a call to compile or ++eval (as opposed to being created by loading a compiled file). ++ ++ ++File: gcl.info, Node: functionp, Next: compiled-function-p, Prev: function-lambda-expression, Up: Data and Control Flow Dictionary ++ ++5.3.10 functionp [Function] ++--------------------------- ++ ++'functionp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type function; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (functionp 'append) => false ++ (functionp #'append) => true ++ (functionp (symbol-function 'append)) => true ++ (flet ((f () 1)) (functionp #'f)) => true ++ (functionp (compile nil '(lambda () 259))) => true ++ (functionp nil) => false ++ (functionp 12) => false ++ (functionp '(lambda (x) (* x x))) => false ++ (functionp #'(lambda (x) (* x x))) => true ++ ++Notes:: ++....... ++ ++ (functionp object) == (typep object 'function) ++ ++ ++File: gcl.info, Node: compiled-function-p, Next: call-arguments-limit, Prev: functionp, Up: Data and Control Flow Dictionary ++ ++5.3.11 compiled-function-p [Function] ++------------------------------------- ++ ++'compiled-function-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type compiled-function; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (defun f (x) x) => F ++ (compiled-function-p #'f) ++ => false ++ OR=> true ++ (compiled-function-p 'f) => false ++ (compile 'f) => F ++ (compiled-function-p #'f) => true ++ (compiled-function-p 'f) => false ++ (compiled-function-p (compile nil '(lambda (x) x))) ++ => true ++ (compiled-function-p #'(lambda (x) x)) ++ => false ++ OR=> true ++ (compiled-function-p '(lambda (x) x)) => false ++ ++See Also:: ++.......... ++ ++*note compile:: , *note compile-file:: , *note compiled-function:: ++ ++Notes:: ++....... ++ ++ (compiled-function-p object) == (typep object 'compiled-function) ++ ++ ++File: gcl.info, Node: call-arguments-limit, Next: lambda-list-keywords, Prev: compiled-function-p, Up: Data and Control Flow Dictionary ++ ++5.3.12 call-arguments-limit [Constant Variable] ++----------------------------------------------- ++ ++Constant Value:: ++................ ++ ++An integer not smaller than 50 and at least as great as the value of ++lambda-parameters-limit, the exact magnitude of which is ++implementation-dependent. ++ ++Description:: ++............. ++ ++The upper exclusive bound on the number of arguments that may be passed ++to a function. ++ ++See Also:: ++.......... ++ ++*note lambda-parameters-limit:: , *note multiple-values-limit:: ++ ++ ++File: gcl.info, Node: lambda-list-keywords, Next: lambda-parameters-limit, Prev: call-arguments-limit, Up: Data and Control Flow Dictionary ++ ++5.3.13 lambda-list-keywords [Constant Variable] ++----------------------------------------------- ++ ++Constant Value:: ++................ ++ ++a list, the elements of which are implementation-dependent, but which ++must contain at least the symbols &allow-other-keys, &aux, &body, ++&environment, &key, &optional, &rest, and &whole. ++ ++Description:: ++............. ++ ++A list of all the lambda list keywords used in the implementation, ++including the additional ones used only by macro definition forms. ++ ++See Also:: ++.......... ++ ++*note defun:: , *note flet:: , *note defmacro:: , macrolet, *note The ++Evaluation Model:: ++ ++ ++File: gcl.info, Node: lambda-parameters-limit, Next: defconstant, Prev: lambda-list-keywords, Up: Data and Control Flow Dictionary ++ ++5.3.14 lambda-parameters-limit [Constant Variable] ++-------------------------------------------------- ++ ++Constant Value:: ++................ ++ ++implementation-dependent, but not smaller than 50. ++ ++Description:: ++............. ++ ++A positive integer that is the upper exclusive bound on the number of ++parameter names that can appear in a single lambda list. ++ ++See Also:: ++.......... ++ ++*note call-arguments-limit:: ++ ++Notes:: ++....... ++ ++Implementors are encouraged to make the value of lambda-parameters-limit ++as large as possible. ++ ++ ++File: gcl.info, Node: defconstant, Next: defparameter, Prev: lambda-parameters-limit, Up: Data and Control Flow Dictionary ++ ++5.3.15 defconstant [Macro] ++-------------------------- ++ ++'defconstant' name initial-value [documentation] => name ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol; not evaluated. ++ ++ initial-value--a form; evaluated. ++ ++ documentation--a string; not evaluated. ++ ++Description:: ++............. ++ ++defconstant causes the global variable named by name to be given a value ++that is the result of evaluating initial-value. ++ ++ A constant defined by defconstant can be redefined with defconstant. ++However, the consequences are undefined if an attempt is made to assign ++a value to the symbol using another operator, or to assign it to a ++different value using a subsequent defconstant. ++ ++ If documentation is supplied, it is attached to name as a ++documentation string of kind variable. ++ ++ defconstant normally appears as a top level form, but it is ++meaningful for it to appear as a non-top-level form. However, the ++compile-time side effects described below only take place when ++defconstant appears as a top level form. ++ ++ The consequences are undefined if there are any bindings of the ++variable named by name at the time defconstant is executed or if the ++value is not eql to the value of initial-value. ++ ++ The consequences are undefined when constant symbols are rebound as ++either lexical or dynamic variables. In other words, a reference to a ++symbol declared with defconstant always refers to its global value. ++ ++ The side effects of the execution of defconstant must be equivalent ++to at least the side effects of the execution of the following code: ++ ++ (setf (symbol-value 'name) initial-value) ++ (setf (documentation 'name 'variable) 'documentation) ++ ++ If a defconstant form appears as a top level form, the compiler must ++recognize that name names a constant variable. An implementation may ++choose to evaluate the value-form at compile time, load time, or both. ++Therefore, users must ensure that the initial-value can be evaluated at ++compile time (regardless of whether or not references to name appear in ++the file) and that it always evaluates to the same value. ++ ++ [Editorial Note by KMP: Does "same value" here mean eql or similar?] ++ ++ [Reviewer Note by Moon: Probably depends on whether load time is ++compared to compile time, or two compiles.] ++ ++Examples:: ++.......... ++ ++ (defconstant this-is-a-constant 'never-changing "for a test") => THIS-IS-A-CONSTANT ++ this-is-a-constant => NEVER-CHANGING ++ (documentation 'this-is-a-constant 'variable) => "for a test" ++ (constantp 'this-is-a-constant) => true ++ ++See Also:: ++.......... ++ ++*note declaim:: , *note defparameter:: , defvar, *note documentation:: , ++*note proclaim:: , *note Constant Variables::, *note Compilation:: ++ ++ ++File: gcl.info, Node: defparameter, Next: destructuring-bind, Prev: defconstant, Up: Data and Control Flow Dictionary ++ ++5.3.16 defparameter, defvar [Macro] ++----------------------------------- ++ ++'defparameter' name initial-value [documentation] => name ++ ++ 'defvar' name [initial-value [documentation]] => name ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol; not evaluated. ++ ++ initial-value--a form; for defparameter, it is always evaluated, but ++for defvar it is evaluated only if name is not already bound. ++ ++ documentation--a string; not evaluated. ++ ++Description:: ++............. ++ ++defparameter and defvar establish name as a dynamic variable. ++ ++ defparameter unconditionally assigns the initial-value to the dynamic ++variable named name. defvar, by contrast, assigns initial-value (if ++supplied) to the dynamic variable named name only if name is not already ++bound. ++ ++ If no initial-value is supplied, defvar leaves the value cell of the ++dynamic variable named name undisturbed; if name was previously bound, ++its old value persists, and if it was previously unbound, it remains ++unbound. ++ ++ If documentation is supplied, it is attached to name as a ++documentation string of kind variable. ++ ++ defparameter and defvar normally appear as a top level form, but it ++is meaningful for them to appear as non-top-level forms. However, the ++compile-time side effects described below only take place when they ++appear as top level forms. ++ ++Examples:: ++.......... ++ ++ (defparameter *p* 1) => *P* ++ *p* => 1 ++ (constantp '*p*) => false ++ (setq *p* 2) => 2 ++ (defparameter *p* 3) => *P* ++ *p* => 3 ++ ++ (defvar *v* 1) => *V* ++ *v* => 1 ++ (constantp '*v*) => false ++ (setq *v* 2) => 2 ++ (defvar *v* 3) => *V* ++ *v* => 2 ++ ++ (defun foo () ++ (let ((*p* 'p) (*v* 'v)) ++ (bar))) => FOO ++ (defun bar () (list *p* *v*)) => BAR ++ (foo) => (P V) ++ ++ The principal operational distinction between defparameter and defvar ++is that defparameter makes an unconditional assignment to name, while ++defvar makes a conditional one. In practice, this means that ++defparameter is useful in situations where loading or reloading the ++definition would want to pick up a new value of the variable, while ++defvar is used in situations where the old value would want to be ++retained if the file were loaded or reloaded. For example, one might ++create a file which contained: ++ ++ (defvar *the-interesting-numbers* '()) ++ (defmacro define-interesting-number (name n) ++ `(progn (defvar ,name ,n) ++ (pushnew ,name *the-interesting-numbers*) ++ ',name)) ++ (define-interesting-number *my-height* 168) ;cm ++ (define-interesting-number *my-weight* 13) ;stones ++ ++ Here the initial value, (), for the variable ++*the-interesting-numbers* is just a seed that we are never likely to ++want to reset to something else once something has been grown from it. ++As such, we have used defvar to avoid having the *interesting-numbers* ++information reset if the file is loaded a second time. It is true that ++the two calls to define-interesting-number here would be reprocessed, ++but if there were additional calls in another file, they would not be ++and that information would be lost. On the other hand, consider the ++following code: ++ ++ (defparameter *default-beep-count* 3) ++ (defun beep (&optional (n *default-beep-count*)) ++ (dotimes (i n) (si: ++ ++ Here we could easily imagine editing the code to change the initial ++value of *default-beep-count*, and then reloading the file to pick up ++the new value. In order to make value updating easy, we have used ++defparameter. ++ ++ On the other hand, there is potential value to using defvar in this ++situation. For example, suppose that someone had predefined an ++alternate value for *default-beep-count*, or had loaded the file and ++then manually changed the value. In both cases, if we had used defvar ++instead of defparameter, those user preferences would not be overridden ++by (re)loading the file. ++ ++ The choice of whether to use defparameter or defvar has visible ++consequences to programs, but is nevertheless often made for subjective ++reasons. ++ ++Side Effects:: ++.............. ++ ++If a defvar or defparameter form appears as a top level form, the ++compiler must recognize that the name has been proclaimed special. ++However, it must neither evaluate the initial-value form nor assign the ++dynamic variable named name at compile time. ++ ++ There may be additional (implementation-defined) compile-time or ++run-time side effects, as long as such effects do not interfere with the ++correct operation of conforming programs. ++ ++Affected By:: ++............. ++ ++defvar is affected by whether name is already bound. ++ ++See Also:: ++.......... ++ ++*note declaim:: , *note defconstant:: , *note documentation:: , *note ++Compilation:: ++ ++Notes:: ++....... ++ ++It is customary to name dynamic variables with an asterisk at the ++beginning and end of the name. e.g., *foo* is a good name for a dynamic ++variable, but not for a lexical variable; foo is a good name for a ++lexical variable, but not for a dynamic variable. This naming ++convention is observed for all defined names in Common Lisp; however, ++neither conforming programs nor conforming implementations are obliged ++to adhere to this convention. ++ ++ The intent of the permission for additional side effects is to allow ++implementations to do normal "bookkeeping" that accompanies definitions. ++For example, the macro expansion of a defvar or defparameter form might ++include code that arranges to record the name of the source file in ++which the definition occurs. ++ ++ defparameter and defvar might be defined as follows: ++ ++ (defmacro defparameter (name initial-value ++ &optional (documentation nil documentation-p)) ++ `(progn (declaim (special ,name)) ++ (setf (symbol-value ',name) ,initial-value) ++ ,(when documentation-p ++ `(setf (documentation ',name 'variable) ',documentation)) ++ ',name)) ++ (defmacro defvar (name &optional ++ (initial-value nil initial-value-p) ++ (documentation nil documentation-p)) ++ `(progn (declaim (special ,name)) ++ ,(when initial-value-p ++ `(unless (boundp ',name) ++ (setf (symbol-value ',name) ,initial-value))) ++ ,(when documentation-p ++ `(setf (documentation ',name 'variable) ',documentation)) ++ ',name)) ++ ++ ++File: gcl.info, Node: destructuring-bind, Next: let, Prev: defparameter, Up: Data and Control Flow Dictionary ++ ++5.3.17 destructuring-bind [Macro] ++--------------------------------- ++ ++'destructuring-bind' lambda-list expression {declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++lambda-list--a destructuring lambda list. ++ ++ expression--a form. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++destructuring-bind binds the variables specified in lambda-list to the ++corresponding values in the tree structure resulting from the evaluation ++of expression; then destructuring-bind evaluates forms. ++ ++ The lambda-list supports destructuring as described in *note ++Destructuring Lambda Lists::. ++ ++Examples:: ++.......... ++ ++ (defun iota (n) (loop for i from 1 to n collect i)) ;helper ++ (destructuring-bind ((a &optional (b 'bee)) one two three) ++ `((alpha) ,@(iota 3)) ++ (list a b three two one)) => (ALPHA BEE 3 2 1) ++ ++Exceptional Situations:: ++........................ ++ ++If the result of evaluating the expression does not match the ++destructuring pattern, an error of type error should be signaled. ++ ++See Also:: ++.......... ++ ++macrolet, *note defmacro:: ++ ++ ++File: gcl.info, Node: let, Next: progv, Prev: destructuring-bind, Up: Data and Control Flow Dictionary ++ ++5.3.18 let, let* [Special Operator] ++----------------------------------- ++ ++'let' ({var | (var [init-form])}*) {declaration}* {form}* => {result}* ++ ++ 'let*' ({var | (var [init-form])}*) {declaration}* {form}* => ++{result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol. ++ ++ init-form--a form. ++ ++ declaration--a declare expression; not evaluated. ++ ++ form--a form. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++let and let* create new variable bindings and execute a series of forms ++that use these bindings. let performs the bindings in parallel and let* ++does them sequentially. ++ ++ The form ++ ++ (let ((var1 init-form-1) ++ (var2 init-form-2) ++ ... ++ (varm init-form-m)) ++ declaration1 ++ declaration2 ++ ... ++ declarationp ++ form1 ++ form2 ++ ... ++ formn) ++ ++ first evaluates the expressions init-form-1, init-form-2, and so on, ++ ++ in that order, saving the resulting values. Then all of the ++variables varj are bound to the corresponding values; each binding is ++lexical unless there is a special declaration to the contrary. The ++expressions formk are then evaluated in order; the values of all but the ++last are discarded (that is, the body of a let is an implicit progn). ++ ++ let* is similar to let, but the bindings of variables are performed ++sequentially rather than in parallel. The expression for the init-form ++of a var can refer to vars previously bound in the let*. ++ ++ The form ++ ++ (let* ((var1 init-form-1) ++ (var2 init-form-2) ++ ... ++ (varm init-form-m)) ++ declaration1 ++ declaration2 ++ ... ++ declarationp ++ form1 ++ form2 ++ ... ++ formn) ++ ++ first evaluates the expression init-form-1, then binds the variable ++var1 to that value; then it evaluates init-form-2 and binds ++ ++ var2, and so on. The expressions formj are then evaluated in order; ++the values of all but the last are discarded (that is, the body of let* ++is an implicit progn). ++ ++ For both let and let*, if there is not an init-form associated with a ++var, var is initialized to nil. ++ ++ The special form let has the property that the scope of the name ++binding does not include any initial value form. For let*, a variable's ++scope also includes the remaining initial value forms for subsequent ++variable bindings. ++ ++Examples:: ++.......... ++ ++ (setq a 'top) => TOP ++ (defun dummy-function () a) => DUMMY-FUNCTION ++ (let ((a 'inside) (b a)) ++ (format nil "~S ~S ~S" a b (dummy-function))) => "INSIDE TOP TOP" ++ (let* ((a 'inside) (b a)) ++ (format nil "~S ~S ~S" a b (dummy-function))) => "INSIDE INSIDE TOP" ++ (let ((a 'inside) (b a)) ++ (declare (special a)) ++ (format nil "~S ~S ~S" a b (dummy-function))) => "INSIDE TOP INSIDE" ++ ++ The code ++ ++ (let (x) ++ (declare (integer x)) ++ (setq x (gcd y z)) ++ ...) ++ ++ is incorrect; although x is indeed set before it is used, and is set ++to a value of the declared type integer, nevertheless x initially takes ++on the value nil in violation of the type declaration. ++ ++See Also:: ++.......... ++ ++*note progv:: ++ ++ ++File: gcl.info, Node: progv, Next: setq, Prev: let, Up: Data and Control Flow Dictionary ++ ++5.3.19 progv [Special Operator] ++------------------------------- ++ ++'progv' symbols values {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++symbols--a list of symbols; evaluated. ++ ++ values--a list of objects; evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++progv creates new dynamic variable bindings and executes each form using ++those bindings. Each form is evaluated in order. ++ ++ progv allows binding one or more dynamic variables whose names may be ++determined at run time. Each form is evaluated in order with the ++dynamic variables whose names are in symbols bound to corresponding ++values. If too few values are supplied, the remaining symbols are bound ++and then made to have no value. If too many values are supplied, the ++excess values are ignored. The bindings of the dynamic variables are ++undone on exit from progv. ++ ++Examples:: ++.......... ++ ++ (setq *x* 1) => 1 ++ (progv '(*x*) '(2) *x*) => 2 ++ *x* => 1 ++ ++ Assuming *x* is not globally special, ++ ++ (let ((*x* 3)) ++ (progv '(*x*) '(4) ++ (list *x* (symbol-value '*x*)))) => (3 4) ++ ++See Also:: ++.......... ++ ++*note let:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++Among other things, progv is useful when writing interpreters for ++languages embedded in Lisp; it provides a handle on the mechanism for ++binding dynamic variables. ++ ++ ++File: gcl.info, Node: setq, Next: psetq, Prev: progv, Up: Data and Control Flow Dictionary ++ ++5.3.20 setq [Special Form] ++-------------------------- ++ ++'setq' {!pair}* => result ++ ++ pair ::=var form ++ ++Pronunciation:: ++............... ++ ++pronounced 'set ,ky\"u ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol naming a variable other than a constant variable. ++ ++ form--a form. ++ ++ result--the primary value of the last form, or nil if no pairs were ++supplied. ++ ++Description:: ++............. ++ ++Assigns values to variables. ++ ++ (setq var1 form1 var2 form2 ...) is the simple variable assignment ++statement of Lisp. First form1 is evaluated and the result is stored in ++the variable var1, then form2 is evaluated and the result stored in ++var2, and so forth. setq may be used for assignment of both lexical and ++dynamic variables. ++ ++ If any var refers to a binding made by symbol-macrolet, then that var ++is treated as if setf (not setq) had been used. ++ ++Examples:: ++.......... ++ ++ ;; A simple use of SETQ to establish values for variables. ++ (setq a 1 b 2 c 3) => 3 ++ a => 1 ++ b => 2 ++ c => 3 ++ ++ ;; Use of SETQ to update values by sequential assignment. ++ (setq a (1+ b) b (1+ a) c (+ a b)) => 7 ++ a => 3 ++ b => 4 ++ c => 7 ++ ++ ;; This illustrates the use of SETQ on a symbol macro. ++ (let ((x (list 10 20 30))) ++ (symbol-macrolet ((y (car x)) (z (cadr x))) ++ (setq y (1+ z) z (1+ y)) ++ (list x y z))) ++ => ((21 22 30) 21 22) ++ ++Side Effects:: ++.............. ++ ++The primary value of each form is assigned to the corresponding var. ++ ++See Also:: ++.......... ++ ++*note psetq:: , *note set:: , *note setf:: ++ ++ ++File: gcl.info, Node: psetq, Next: block, Prev: setq, Up: Data and Control Flow Dictionary ++ ++5.3.21 psetq [Macro] ++-------------------- ++ ++'psetq' {!pair}* => nil ++ ++ pair ::=var form ++ ++Pronunciation:: ++............... ++ ++psetq: pronounced ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol naming a variable other than a constant variable. ++ ++ form--a form. ++ ++Description:: ++............. ++ ++Assigns values to variables. ++ ++ This is just like setq, except that the assignments happen "in ++parallel." That is, first all of the forms are evaluated, and only then ++are the variables set to the resulting values. In this way, the ++assignment to one variable does not affect the value computation of ++another in the way that would occur with setq's sequential assignment. ++ ++ If any var refers to a binding made by symbol-macrolet, then that var ++is treated as if psetf (not psetq) had been used. ++ ++Examples:: ++.......... ++ ++ ;; A simple use of PSETQ to establish values for variables. ++ ;; As a matter of style, many programmers would prefer SETQ ++ ;; in a simple situation like this where parallel assignment ++ ;; is not needed, but the two have equivalent effect. ++ (psetq a 1 b 2 c 3) => NIL ++ a => 1 ++ b => 2 ++ c => 3 ++ ++ ;; Use of PSETQ to update values by parallel assignment. ++ ;; The effect here is very different than if SETQ had been used. ++ (psetq a (1+ b) b (1+ a) c (+ a b)) => NIL ++ a => 3 ++ b => 2 ++ c => 3 ++ ++ ;; Use of PSETQ on a symbol macro. ++ (let ((x (list 10 20 30))) ++ (symbol-macrolet ((y (car x)) (z (cadr x))) ++ (psetq y (1+ z) z (1+ y)) ++ (list x y z))) ++ => ((21 11 30) 21 11) ++ ++ ;; Use of parallel assignment to swap values of A and B. ++ (let ((a 1) (b 2)) ++ (psetq a b b a) ++ (values a b)) ++ => 2, 1 ++ ++Side Effects:: ++.............. ++ ++The values of forms are assigned to vars. ++ ++See Also:: ++.......... ++ ++psetf, *note setq:: ++ ++ ++File: gcl.info, Node: block, Next: catch, Prev: psetq, Up: Data and Control Flow Dictionary ++ ++5.3.22 block [Special Operator] ++------------------------------- ++ ++'block' name form* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ form--a form. ++ ++ results--the values of the forms if a normal return occurs, or else, ++if an explicit return occurs, the values that were transferred. ++ ++Description:: ++............. ++ ++block establishes a block named name and then evaluates forms as an ++implicit progn. ++ ++ The special operators block and return-from work together to provide ++a structured, lexical, non-local exit facility. At any point lexically ++contained within forms, return-from can be used with the given name to ++return control and values from the block form, except when an ++intervening block with the same name has been established, in which case ++the outer block is shadowed by the inner one. ++ ++ The block named name has lexical scope and dynamic extent. ++ ++ Once established, a block may only be exited once, whether by normal ++return or explicit return. ++ ++Examples:: ++.......... ++ ++ (block empty) => NIL ++ (block whocares (values 1 2) (values 3 4)) => 3, 4 ++ (let ((x 1)) ++ (block stop (setq x 2) (return-from stop) (setq x 3)) ++ x) => 2 ++ (block early (return-from early (values 1 2)) (values 3 4)) => 1, 2 ++ (block outer (block inner (return-from outer 1)) 2) => 1 ++ (block twin (block twin (return-from twin 1)) 2) => 2 ++ ;; Contrast behavior of this example with corresponding example of CATCH. ++ (block b ++ (flet ((b1 () (return-from b 1))) ++ (block b (b1) (print 'unreachable)) ++ 2)) => 1 ++ ++See Also:: ++.......... ++ ++*note return:: , *note return-from:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: catch, Next: go, Prev: block, Up: Data and Control Flow Dictionary ++ ++5.3.23 catch [Special Operator] ++------------------------------- ++ ++'catch' tag {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++tag--a catch tag; evaluated. ++ ++ forms--an implicit progn. ++ ++ results--if the forms exit normally, the values returned by the ++forms; if a throw occurs to the tag, the values that are thrown. ++ ++Description:: ++............. ++ ++catch is used as the destination of a non-local control transfer by ++throw. Tags are used to find the catch to which a throw is transferring ++control. (catch 'foo form) catches a (throw 'foo form) but not a (throw ++'bar form). ++ ++ The order of execution of catch follows: ++ ++1. ++ Tag is evaluated. It serves as the name of the catch. ++ ++2. ++ Forms are then evaluated as an implicit progn, and the results of ++ the last form are returned unless a throw occurs. ++ ++3. ++ If a throw occurs during the execution of one of the forms, control ++ is transferred to the catch form whose tag is eq to the tag ++ argument of the throw and which is the most recently established ++ catch with that tag. No further evaluation of forms occurs. ++ ++4. ++ The tag established by catch is disestablished just before the ++ results are returned. ++ ++ If during the execution of one of the forms, a throw is executed ++whose tag is eq to the catch tag, then the values specified by the throw ++are returned as the result of the dynamically most recently established ++catch form with that tag. ++ ++ The mechanism for catch and throw works even if throw is not within ++the lexical scope of catch. throw must occur within the dynamic extent ++of the evaluation of the body of a catch with a corresponding tag. ++ ++Examples:: ++.......... ++ ++ (catch 'dummy-tag 1 2 (throw 'dummy-tag 3) 4) => 3 ++ (catch 'dummy-tag 1 2 3 4) => 4 ++ (defun throw-back (tag) (throw tag t)) => THROW-BACK ++ (catch 'dummy-tag (throw-back 'dummy-tag) 2) => T ++ ++ ;; Contrast behavior of this example with corresponding example of BLOCK. ++ (catch 'c ++ (flet ((c1 () (throw 'c 1))) ++ (catch 'c (c1) (print 'unreachable)) ++ 2)) => 2 ++ ++Exceptional Situations:: ++........................ ++ ++An error of type control-error is signaled if throw is done when there ++is no suitable catch tag. ++ ++See Also:: ++.......... ++ ++*note throw:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++It is customary for symbols to be used as tags, but any object is ++permitted. However, numbers should not be used because the comparison ++is done using eq. ++ ++ catch differs from block in that catch tags have dynamic scope while ++block names have lexical scope. ++ ++ ++File: gcl.info, Node: go, Next: return-from, Prev: catch, Up: Data and Control Flow Dictionary ++ ++5.3.24 go [Special Operator] ++---------------------------- ++ ++'go' tag => # ++ ++Arguments and Values:: ++...................... ++ ++tag--a go tag. ++ ++Description:: ++............. ++ ++go transfers control to the point in the body of an enclosing tagbody ++form labeled by a tag eql to tag. If there is no such tag in the body, ++the bodies of lexically containing tagbody forms (if any) are examined ++as well. If several tags are eql to tag, control is transferred to ++whichever matching tag is contained in the innermost tagbody form that ++contains the go. The consequences are undefined if there is no matching ++tag lexically visible to the point of the go. ++ ++ The transfer of control initiated by go is performed as described in ++*note Transfer of Control to an Exit Point::. ++ ++Examples:: ++.......... ++ ++ (tagbody ++ (setq val 2) ++ (go lp) ++ (incf val 3) ++ lp (incf val 4)) => NIL ++ val => 6 ++ ++ The following is in error because there is a normal exit of the ++tagbody before the go is executed. ++ ++ (let ((a nil)) ++ (tagbody t (setq a #'(lambda () (go t)))) ++ (funcall a)) ++ ++ The following is in error because the tagbody is passed over before ++the go form is executed. ++ ++ (funcall (block nil ++ (tagbody a (return #'(lambda () (go a)))))) ++ ++See Also:: ++.......... ++ ++*note tagbody:: ++ ++ ++File: gcl.info, Node: return-from, Next: return, Prev: go, Up: Data and Control Flow Dictionary ++ ++5.3.25 return-from [Special Operator] ++------------------------------------- ++ ++'return-from' name [result] => # ++ ++Arguments and Values:: ++...................... ++ ++name--a block tag; not evaluated. ++ ++ result--a form; evaluated. The default is nil. ++ ++Description:: ++............. ++ ++Returns control and multiple values_2 from a lexically enclosing block. ++ ++ A block form named name must lexically enclose the occurrence of ++return-from; any values yielded by the evaluation of result are ++immediately returned from the innermost such lexically enclosing block. ++ ++ The transfer of control initiated by return-from is performed as ++described in *note Transfer of Control to an Exit Point::. ++ ++Examples:: ++.......... ++ ++ (block alpha (return-from alpha) 1) => NIL ++ (block alpha (return-from alpha 1) 2) => 1 ++ (block alpha (return-from alpha (values 1 2)) 3) => 1, 2 ++ (let ((a 0)) ++ (dotimes (i 10) (incf a) (when (oddp i) (return))) ++ a) => 2 ++ (defun temp (x) ++ (if x (return-from temp 'dummy)) ++ 44) => TEMP ++ (temp nil) => 44 ++ (temp t) => DUMMY ++ (block out ++ (flet ((exit (n) (return-from out n))) ++ (block out (exit 1))) ++ 2) => 1 ++ (block nil ++ (unwind-protect (return-from nil 1) ++ (return-from nil 2))) ++ => 2 ++ (dolist (flag '(nil t)) ++ (block nil ++ (let ((x 5)) ++ (declare (special x)) ++ (unwind-protect (return-from nil) ++ (print x)))) ++ (print 'here)) ++ |> 5 ++ |> HERE ++ |> 5 ++ |> HERE ++ => NIL ++ (dolist (flag '(nil t)) ++ (block nil ++ (let ((x 5)) ++ (declare (special x)) ++ (unwind-protect ++ (if flag (return-from nil)) ++ (print x)))) ++ (print 'here)) ++ |> 5 ++ |> HERE ++ |> 5 ++ |> HERE ++ => NIL ++ ++ The following has undefined consequences because the block form exits ++normally before the return-from form is attempted. ++ ++ (funcall (block nil #'(lambda () (return-from nil)))) is an error. ++ ++See Also:: ++.......... ++ ++*note block:: , *note return:: , *note Evaluation:: ++ ++ ++File: gcl.info, Node: return, Next: tagbody, Prev: return-from, Up: Data and Control Flow Dictionary ++ ++5.3.26 return [Macro] ++--------------------- ++ ++'return' [result] => # ++ ++Arguments and Values:: ++...................... ++ ++result--a form; evaluated. The default is nil. ++ ++Description:: ++............. ++ ++Returns, as if by return-from, from the block named nil. ++ ++Examples:: ++.......... ++ ++ (block nil (return) 1) => NIL ++ (block nil (return 1) 2) => 1 ++ (block nil (return (values 1 2)) 3) => 1, 2 ++ (block nil (block alpha (return 1) 2)) => 1 ++ (block alpha (block nil (return 1)) 2) => 2 ++ (block nil (block nil (return 1) 2)) => 1 ++ ++See Also:: ++.......... ++ ++*note block:: , *note return-from:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++ (return) == (return-from nil) ++ (return form) == (return-from nil form) ++ ++ The implicit blocks established by macros such as do are often named ++nil, so that return can be used to exit from such forms. ++ ++ ++File: gcl.info, Node: tagbody, Next: throw, Prev: return, Up: Data and Control Flow Dictionary ++ ++5.3.27 tagbody [Special Operator] ++--------------------------------- ++ ++'tagbody' {tag | statement}* => nil ++ ++Arguments and Values:: ++...................... ++ ++tag--a go tag; not evaluated. ++ ++ statement--a compound form; evaluated as described below. ++ ++Description:: ++............. ++ ++Executes zero or more statements in a lexical environment that provides ++for control transfers to labels indicated by the tags. ++ ++ The statements in a tagbody are evaluated in order from left to ++right, and their values are discarded. If at any time there are no ++remaining statements, tagbody returns nil. However, if (go tag) is ++evaluated, control jumps to the part of the body labeled with the tag. ++(Tags are compared with eql.) ++ ++ A tag established by tagbody has lexical scope and has dynamic ++extent. Once tagbody has been exited, it is no longer valid to go to a ++tag in its body. It is permissible for go to jump to a tagbody that is ++not the innermost tagbody containing that go; the tags established by a ++tagbody only shadow other tags of like name. ++ ++ The determination of which elements of the body are tags and which ++are statements is made prior to any macro expansion of that element. If ++a statement is a macro form and its macro expansion is an atom, that ++atom is treated as a statement, not a tag. ++ ++Examples:: ++.......... ++ ++ (let (val) ++ (tagbody ++ (setq val 1) ++ (go point-a) ++ (incf val 16) ++ point-c ++ (incf val 04) ++ (go point-b) ++ (incf val 32) ++ point-a ++ (incf val 02) ++ (go point-c) ++ (incf val 64) ++ point-b ++ (incf val 08)) ++ val) ++ => 15 ++ (defun f1 (flag) ++ (let ((n 1)) ++ (tagbody ++ (setq n (f2 flag #'(lambda () (go out)))) ++ out ++ (prin1 n)))) ++ => F1 ++ (defun f2 (flag escape) ++ (if flag (funcall escape) 2)) ++ => F2 ++ (f1 nil) ++ |> 2 ++ => NIL ++ (f1 t) ++ |> 1 ++ => NIL ++ ++See Also:: ++.......... ++ ++*note go:: ++ ++Notes:: ++....... ++ ++The macros in Figure 5-10 have implicit tagbodies. ++ ++ do do-external-symbols dotimes ++ do* do-symbols prog ++ do-all-symbols dolist prog* ++ ++ Figure 5-10: Macros that have implicit tagbodies. ++ ++ ++ ++File: gcl.info, Node: throw, Next: unwind-protect, Prev: tagbody, Up: Data and Control Flow Dictionary ++ ++5.3.28 throw [Special Operator] ++------------------------------- ++ ++'throw' tag result-form => # ++ ++Arguments and Values:: ++...................... ++ ++tag--a catch tag; evaluated. ++ ++ result-form--a form; evaluated as described below. ++ ++Description:: ++............. ++ ++throw causes a non-local control transfer to a catch whose tag is eq to ++tag. ++ ++ Tag is evaluated first to produce an object called the throw tag; ++then result-form is evaluated, and its results are saved. If the ++result-form produces multiple values, then all the values are saved. ++The most recent outstanding catch whose tag is eq to the throw tag is ++exited; the saved results are returned as the value or values of catch. ++ ++ The transfer of control initiated by throw is performed as described ++in *note Transfer of Control to an Exit Point::. ++ ++Examples:: ++.......... ++ ++ (catch 'result ++ (setq i 0 j 0) ++ (loop (incf j 3) (incf i) ++ (if (= i 3) (throw 'result (values i j))))) => 3, 9 ++ ++ ++ (catch nil ++ (unwind-protect (throw nil 1) ++ (throw nil 2))) => 2 ++ ++ The consequences of the following are undefined because the catch of ++b is passed over by the first throw, hence portable programs must assume ++that its dynamic extent is terminated. The binding of the catch tag is ++not yet disestablished and therefore it is the target of the second ++throw. ++ ++ (catch 'a ++ (catch 'b ++ (unwind-protect (throw 'a 1) ++ (throw 'b 2)))) ++ ++ The following prints "The inner catch returns :SECOND-THROW" and then ++returns :outer-catch. ++ ++ (catch 'foo ++ (format t "The inner catch returns ~s.~ ++ (catch 'foo ++ (unwind-protect (throw 'foo :first-throw) ++ (throw 'foo :second-throw)))) ++ :outer-catch) ++ |> The inner catch returns :SECOND-THROW ++ => :OUTER-CATCH ++ ++Exceptional Situations:: ++........................ ++ ++If there is no outstanding catch tag that matches the throw tag, no ++unwinding of the stack is performed, and an error of type control-error ++is signaled. When the error is signaled, the dynamic environment is ++that which was in force at the point of the throw. ++ ++See Also:: ++.......... ++ ++*note block:: , *note catch:: , *note return-from:: , *note ++unwind-protect:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++catch and throw are normally used when the exit point must have dynamic ++scope (e.g., the throw is not lexically enclosed by the catch), while ++block and return are used when lexical scope is sufficient. ++ ++ ++File: gcl.info, Node: unwind-protect, Next: nil, Prev: throw, Up: Data and Control Flow Dictionary ++ ++5.3.29 unwind-protect [Special Operator] ++---------------------------------------- ++ ++'unwind-protect' protected-form {cleanup-form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++protected-form--a form. ++ ++ cleanup-form--a form. ++ ++ results--the values of the protected-form. ++ ++Description:: ++............. ++ ++unwind-protect evaluates protected-form and guarantees that ++cleanup-forms are executed before unwind-protect exits, whether it ++terminates normally or is aborted by a control transfer of some kind. ++unwind-protect is intended to be used to make sure that certain side ++effects take place after the evaluation of protected-form. ++ ++ If a non-local exit occurs during execution of cleanup-forms, no ++special action is taken. The cleanup-forms of unwind-protect are not ++protected by that unwind-protect. ++ ++ unwind-protect protects against all attempts to exit from ++protected-form, including go, handler-case, ignore-errors, restart-case, ++return-from, throw, and with-simple-restart. ++ ++ Undoing of handler and restart bindings during an exit happens in ++parallel with the undoing of the bindings of dynamic variables and catch ++tags, in the reverse order in which they were established. The effect ++of this is that cleanup-form sees the same handler and restart bindings, ++as well as dynamic variable bindings and catch tags, as were visible ++when the unwind-protect was entered. ++ ++Examples:: ++.......... ++ ++ (tagbody ++ (let ((x 3)) ++ (unwind-protect ++ (if (numberp x) (go out)) ++ (print x))) ++ out ++ ...) ++ ++ When go is executed, the call to print is executed first, and then ++the transfer of control to the tag out is completed. ++ ++ (defun dummy-function (x) ++ (setq state 'running) ++ (unless (numberp x) (throw 'abort 'not-a-number)) ++ (setq state (1+ x))) => DUMMY-FUNCTION ++ (catch 'abort (dummy-function 1)) => 2 ++ state => 2 ++ (catch 'abort (dummy-function 'trash)) => NOT-A-NUMBER ++ state => RUNNING ++ (catch 'abort (unwind-protect (dummy-function 'trash) ++ (setq state 'aborted))) => NOT-A-NUMBER ++ state => ABORTED ++ ++ The following code is not correct: ++ ++ (unwind-protect ++ (progn (incf *access-count*) ++ (perform-access)) ++ (decf *access-count*)) ++ ++ If an exit occurs before completion of incf, the decf form is ++executed anyway, resulting in an incorrect value for *access-count*. ++The correct way to code this is as follows: ++ ++ (let ((old-count *access-count*)) ++ (unwind-protect ++ (progn (incf *access-count*) ++ (perform-access)) ++ (setq *access-count* old-count))) ++ ++ ;;; The following returns 2. ++ (block nil ++ (unwind-protect (return 1) ++ (return 2))) ++ ++ ;;; The following has undefined consequences. ++ (block a ++ (block b ++ (unwind-protect (return-from a 1) ++ (return-from b 2)))) ++ ++ ;;; The following returns 2. ++ (catch nil ++ (unwind-protect (throw nil 1) ++ (throw nil 2))) ++ ++ ;;; The following has undefined consequences because the catch of B is ++ ;;; passed over by the first THROW, hence portable programs must assume ++ ;;; its dynamic extent is terminated. The binding of the catch tag is not ++ ;;; yet disestablished and therefore it is the target of the second throw. ++ (catch 'a ++ (catch 'b ++ (unwind-protect (throw 'a 1) ++ (throw 'b 2)))) ++ ++ ;;; The following prints "The inner catch returns :SECOND-THROW" ++ ;;; and then returns :OUTER-CATCH. ++ (catch 'foo ++ (format t "The inner catch returns ~s.~ ++ (catch 'foo ++ (unwind-protect (throw 'foo :first-throw) ++ (throw 'foo :second-throw)))) ++ :outer-catch) ++ ++ ;;; The following returns 10. The inner CATCH of A is passed over, but ++ ;;; because that CATCH is disestablished before the THROW to A is executed, ++ ;;; it isn't seen. ++ (catch 'a ++ (catch 'b ++ (unwind-protect (1+ (catch 'a (throw 'b 1))) ++ (throw 'a 10)))) ++ ++ ;;; The following has undefined consequences because the extent of ++ ;;; the (CATCH 'BAR ...) exit ends when the (THROW 'FOO ...) ++ ;;; commences. ++ (catch 'foo ++ (catch 'bar ++ (unwind-protect (throw 'foo 3) ++ (throw 'bar 4) ++ (print 'xxx)))) ++ ++ ;;; The following returns 4; XXX is not printed. ++ ;;; The (THROW 'FOO ...) has no effect on the scope of the BAR ++ ;;; catch tag or the extent of the (CATCH 'BAR ...) exit. ++ (catch 'bar ++ (catch 'foo ++ (unwind-protect (throw 'foo 3) ++ (throw 'bar 4) ++ (print 'xxx)))) ++ ++ ;;; The following prints 5. ++ (block nil ++ (let ((x 5)) ++ (declare (special x)) ++ (unwind-protect (return) ++ (print x)))) ++ ++See Also:: ++.......... ++ ++*note catch:: , *note go:: , *note handler-case:: , *note restart-case:: ++, *note return:: , *note return-from:: , *note throw:: , *note ++Evaluation:: ++ ++ ++File: gcl.info, Node: nil, Next: not, Prev: unwind-protect, Up: Data and Control Flow Dictionary ++ ++5.3.30 nil [Constant Variable] ++------------------------------ ++ ++Constant Value:: ++................ ++ ++nil. ++ ++Description:: ++............. ++ ++nil represents both boolean (and generalized boolean) false and the ++empty list. ++ ++Examples:: ++.......... ++ ++ nil => NIL ++ ++See Also:: ++.......... ++ ++*note t:: ++ ++ ++File: gcl.info, Node: not, Next: t, Prev: nil, Up: Data and Control Flow Dictionary ++ ++5.3.31 not [Function] ++--------------------- ++ ++'not' x => boolean ++ ++Arguments and Values:: ++...................... ++ ++x--a generalized boolean (i.e., any object). ++ ++ boolean--a boolean. ++ ++Description:: ++............. ++ ++Returns t if x is false; otherwise, returns nil. ++ ++Examples:: ++.......... ++ ++ (not nil) => T ++ (not '()) => T ++ (not (integerp 'sss)) => T ++ (not (integerp 1)) => NIL ++ (not 3.7) => NIL ++ (not 'apple) => NIL ++ ++See Also:: ++.......... ++ ++*note null:: ++ ++Notes:: ++....... ++ ++not is intended to be used to invert the 'truth value' of a boolean (or ++generalized boolean) whereas null is intended to be used to test for the ++empty list. Operationally, not and null compute the same result; which ++to use is a matter of style. ++ ++ ++File: gcl.info, Node: t, Next: eq, Prev: not, Up: Data and Control Flow Dictionary ++ ++5.3.32 t [Constant Variable] ++---------------------------- ++ ++Constant Value:: ++................ ++ ++t. ++ ++Description:: ++............. ++ ++The boolean representing true, and the canonical generalized boolean ++representing true. Although any object other than nil is considered ++true, t is generally used when there is no special reason to prefer one ++such object over another. ++ ++ The symbol t is also sometimes used for other purposes as well. For ++example, as the name of a class, as a designator (e.g., a stream ++designator) or as a special symbol for some syntactic reason (e.g., in ++case and typecase to label the otherwise-clause). ++ ++Examples:: ++.......... ++ ++ t => T ++ (eq t 't) => true ++ (find-class 't) => # ++ (case 'a (a 1) (t 2)) => 1 ++ (case 'b (a 1) (t 2)) => 2 ++ (prin1 'hello t) ++ |> HELLO ++ => HELLO ++ ++See Also:: ++.......... ++ ++*note NIL:: ++ ++ ++File: gcl.info, Node: eq, Next: eql, Prev: t, Up: Data and Control Flow Dictionary ++ ++5.3.33 eq [Function] ++-------------------- ++ ++'eq' x y => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++x--an object. ++ ++ y--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if its arguments are the same, identical object; otherwise, ++returns false. ++ ++Examples:: ++.......... ++ ++ (eq 'a 'b) => false ++ (eq 'a 'a) => true ++ (eq 3 3) ++ => true ++ OR=> false ++ (eq 3 3.0) => false ++ (eq 3.0 3.0) ++ => true ++ OR=> false ++ (eq #c(3 -4) #c(3 -4)) ++ => true ++ OR=> false ++ (eq #c(3 -4.0) #c(3 -4)) => false ++ (eq (cons 'a 'b) (cons 'a 'c)) => false ++ (eq (cons 'a 'b) (cons 'a 'b)) => false ++ (eq '(a . b) '(a . b)) ++ => true ++ OR=> false ++ (progn (setq x (cons 'a 'b)) (eq x x)) => true ++ (progn (setq x '(a . b)) (eq x x)) => true ++ (eq #\A #\A) ++ => true ++ OR=> false ++ (let ((x "Foo")) (eq x x)) => true ++ (eq "Foo" "Foo") ++ => true ++ OR=> false ++ (eq "Foo" (copy-seq "Foo")) => false ++ (eq "FOO" "foo") => false ++ (eq "string-seq" (copy-seq "string-seq")) => false ++ (let ((x 5)) (eq x x)) ++ => true ++ OR=> false ++ ++See Also:: ++.......... ++ ++*note eql:: , *note equal:: , *note equalp:: , *note =:: , *note ++Compilation:: ++ ++Notes:: ++....... ++ ++Objects that appear the same when printed are not necessarily eq to each ++other. Symbols that print the same usually are eq to each other because ++of the use of the intern function. However, numbers with the same value ++need not be eq, and two similar lists are usually not identical. ++ ++ An implementation is permitted to make "copies" of characters and ++numbers at any time. The effect is that Common Lisp makes no guarantee ++that eq is true even when both its arguments are "the same thing" if ++that thing is a character or number. ++ ++ Most Common Lisp operators use eql rather than eq to compare objects, ++or else they default to eql and only use eq if specifically requested to ++do so. However, the following operators are defined to use eq rather ++than eql in a way that cannot be overridden by the code which employs ++them: ++ ++ catch getf throw ++ get remf ++ get-properties remprop ++ ++ Figure 5-11: Operators that always prefer EQ over EQL ++ ++ ++ ++File: gcl.info, Node: eql, Next: equal, Prev: eq, Up: Data and Control Flow Dictionary ++ ++5.3.34 eql [Function] ++--------------------- ++ ++'eql' x y => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++x--an object. ++ ++ y--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++The value of eql is true of two objects, x and y, in the folowing cases: ++ ++1. ++ If x and y are eq. ++2. ++ If x and y are both numbers of the same type and the same value. ++3. ++ If they are both characters that represent the same character. ++ ++ Otherwise the value of eql is false. ++ ++ If an implementation supports positive and negative zeros as distinct ++values, then (eql 0.0 -0.0) returns false. Otherwise, when the syntax ++-0.0 is read it is interpreted as the value 0.0, and so (eql 0.0 -0.0) ++returns true. ++ ++Examples:: ++.......... ++ ++ (eql 'a 'b) => false ++ (eql 'a 'a) => true ++ (eql 3 3) => true ++ (eql 3 3.0) => false ++ (eql 3.0 3.0) => true ++ (eql #c(3 -4) #c(3 -4)) => true ++ (eql #c(3 -4.0) #c(3 -4)) => false ++ (eql (cons 'a 'b) (cons 'a 'c)) => false ++ (eql (cons 'a 'b) (cons 'a 'b)) => false ++ (eql '(a . b) '(a . b)) ++ => true ++ OR=> false ++ (progn (setq x (cons 'a 'b)) (eql x x)) => true ++ (progn (setq x '(a . b)) (eql x x)) => true ++ (eql #\A #\A) => true ++ (eql "Foo" "Foo") ++ => true ++ OR=> false ++ (eql "Foo" (copy-seq "Foo")) => false ++ (eql "FOO" "foo") => false ++ ++ Normally (eql 1.0s0 1.0d0) is false, under the assumption that 1.0s0 ++and 1.0d0 are of distinct data types. However, implementations that do ++not provide four distinct floating-point formats are permitted to ++"collapse" the four formats into some smaller number of them; in such an ++implementation (eql 1.0s0 1.0d0) might be true. ++ ++See Also:: ++.......... ++ ++*note eq:: , *note equal:: , *note equalp:: , *note =:: , *note char=:: ++ ++Notes:: ++....... ++ ++eql is the same as eq, except that if the arguments are characters or ++numbers of the same type then their values are compared. Thus eql tells ++whether two objects are conceptually the same, whereas eq tells whether ++two objects are implementationally identical. It is for this reason ++that eql, not eq, is the default comparison predicate for operators that ++take sequences as arguments. ++ ++ eql may not be true of two floats even when they represent the same ++value. = is used to compare mathematical values. ++ ++ Two complex numbers are considered to be eql if their real parts are ++eql and their imaginary parts are eql. For example, (eql #C(4 5) #C(4 ++5)) is true and (eql #C(4 5) #C(4.0 5.0)) is false. Note that while ++(eql #C(5.0 0.0) 5.0) is false, (eql #C(5 0) 5) is true. In the case of ++(eql #C(5.0 0.0) 5.0) the two arguments are of different types, and so ++cannot satisfy eql. In the case of (eql #C(5 0) 5), #C(5 0) is not a ++complex number, but is automatically reduced to the integer 5. ++ ++ ++File: gcl.info, Node: equal, Next: equalp, Prev: eql, Up: Data and Control Flow Dictionary ++ ++5.3.35 equal [Function] ++----------------------- ++ ++'equal' x y => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++x--an object. ++ ++ y--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if x and y are structurally similar (isomorphic) objects. ++Objects are treated as follows by equal. ++ ++Symbols, Numbers, and Characters ++ equal is true of two objects if they are symbols that are eq, if ++ they are numbers that are eql, or if they are characters that are ++ eql. ++ ++Conses ++ For conses, equal is defined recursively as the two cars being ++ equal and the two cdrs being equal. ++ ++Arrays ++ Two arrays are equal only if they are eq, with one exception: ++ strings and bit vectors are compared element-by-element (using ++ eql). If either x or y has a fill pointer, the fill pointer limits ++ the number of elements examined by equal. Uppercase and lowercase ++ letters in strings are considered by equal to be different. ++ ++Pathnames ++ Two pathnames are equal if and only if all the corresponding ++ components (host, device, and so on) are equivalent. Whether or ++ not uppercase and lowercase letters are considered equivalent in ++ strings appearing in components is implementation-dependent. ++ pathnames that are equal should be functionally equivalent. ++ ++Other (Structures, hash-tables, instances, ...) ++ Two other objects are equal only if they are eq. ++ ++ equal does not descend any objects other than the ones explicitly ++specified above. Figure 5-12 summarizes the information given in the ++previous list. In addition, the figure specifies the priority of the ++behavior of equal, with upper entries taking priority over lower ones. ++ ++ Type Behavior ++ number uses eql ++ character uses eql ++ cons descends ++ bit vector descends ++ string descends ++ pathname "functionally equivalent" ++ structure uses eq ++ Other array uses eq ++ hash table uses eq ++ Other object uses eq ++ ++ Figure 5-12: Summary and priorities of behavior of equal ++ ++ ++ Any two objects that are eql are also equal. ++ ++ equal may fail to terminate if x or y is circular. ++ ++Examples:: ++.......... ++ ++ (equal 'a 'b) => false ++ (equal 'a 'a) => true ++ (equal 3 3) => true ++ (equal 3 3.0) => false ++ (equal 3.0 3.0) => true ++ (equal #c(3 -4) #c(3 -4)) => true ++ (equal #c(3 -4.0) #c(3 -4)) => false ++ (equal (cons 'a 'b) (cons 'a 'c)) => false ++ (equal (cons 'a 'b) (cons 'a 'b)) => true ++ (equal #\A #\A) => true ++ (equal #\A #\a) => false ++ (equal "Foo" "Foo") => true ++ (equal "Foo" (copy-seq "Foo")) => true ++ (equal "FOO" "foo") => false ++ (equal "This-string" "This-string") => true ++ (equal "This-string" "this-string") => false ++ ++See Also:: ++.......... ++ ++*note eq:: , *note eql:: , *note equalp:: , *note =:: , *note string=:: ++, string-equal, *note char=:: , char-equal, *note tree-equal:: ++ ++Notes:: ++....... ++ ++Object equality is not a concept for which there is a uniquely ++determined correct algorithm. The appropriateness of an equality ++predicate can be judged only in the context of the needs of some ++particular program. Although these functions take any type of argument ++and their names sound very generic, equal and equalp are not appropriate ++for every application. ++ ++ A rough rule of thumb is that two objects are equal if and only if ++their printed representations are the same. ++ ++ ++File: gcl.info, Node: equalp, Next: identity, Prev: equal, Up: Data and Control Flow Dictionary ++ ++5.3.36 equalp [Function] ++------------------------ ++ ++'equalp' x y => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++x--an object. ++ ++ y--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if x and y are equal, or if they have components that are ++of the same type as each other and if those components are equalp; ++specifically, equalp returns true in the following cases: ++ ++Characters ++ If two characters are char-equal. ++ ++Numbers ++ If two numbers are the same under =. ++ ++Conses ++ If the two cars in the conses are equalp and the two cdrs in the ++ conses are equalp. ++ ++Arrays ++ If two arrays have the same number of dimensions, the dimensions ++ match, and the corresponding active elements are equalp. The types ++ for which the arrays are specialized need not match; for example, a ++ string and a general array that happens to contain the same ++ characters are equalp. Because equalp performs element-by-element ++ comparisons of strings and ignores the case of characters, case ++ distinctions are ignored when equalp compares strings. ++ ++Structures ++ If two structures S_1 and S_2 have the same class and the value of ++ each slot in S_1 is the same under equalp as the value of the ++ corresponding slot in S_2. ++ ++Hash Tables ++ equalp descends hash-tables by first comparing the count of entries ++ and the :test function; if those are the same, it compares the keys ++ of the tables using the :test function and then the values of the ++ matching keys using equalp recursively. ++ ++ equalp does not descend any objects other than the ones explicitly ++specified above. Figure 5-13 summarizes the information given in the ++previous list. In addition, the figure specifies the priority of the ++behavior of equalp, with upper entries taking priority over lower ones. ++ ++ Type Behavior ++ number uses = ++ character uses char-equal ++ cons descends ++ bit vector descends ++ string descends ++ pathname same as equal ++ structure descends, as described above ++ Other array descends ++ hash table descends, as described above ++ Other object uses eq ++ ++ Figure 5-13: Summary and priorities of behavior of equalp ++ ++ ++Examples:: ++.......... ++ ++ (equalp 'a 'b) => false ++ (equalp 'a 'a) => true ++ (equalp 3 3) => true ++ (equalp 3 3.0) => true ++ (equalp 3.0 3.0) => true ++ (equalp #c(3 -4) #c(3 -4)) => true ++ (equalp #c(3 -4.0) #c(3 -4)) => true ++ (equalp (cons 'a 'b) (cons 'a 'c)) => false ++ (equalp (cons 'a 'b) (cons 'a 'b)) => true ++ (equalp #\A #\A) => true ++ (equalp #\A #\a) => true ++ (equalp "Foo" "Foo") => true ++ (equalp "Foo" (copy-seq "Foo")) => true ++ (equalp "FOO" "foo") => true ++ ++ (setq array1 (make-array 6 :element-type 'integer ++ :initial-contents '(1 1 1 3 5 7))) ++ => #(1 1 1 3 5 7) ++ (setq array2 (make-array 8 :element-type 'integer ++ :initial-contents '(1 1 1 3 5 7 2 6) ++ :fill-pointer 6)) ++ => #(1 1 1 3 5 7) ++ (equalp array1 array2) => true ++ (setq vector1 (vector 1 1 1 3 5 7)) => #(1 1 1 3 5 7) ++ (equalp array1 vector1) => true ++ ++See Also:: ++.......... ++ ++*note eq:: , *note eql:: , *note equal:: , *note =:: , *note string=:: , ++string-equal, *note char=:: , char-equal ++ ++Notes:: ++....... ++ ++Object equality is not a concept for which there is a uniquely ++determined correct algorithm. The appropriateness of an equality ++predicate can be judged only in the context of the needs of some ++particular program. Although these functions take any type of argument ++and their names sound very generic, equal and equalp are not appropriate ++for every application. ++ ++ ++File: gcl.info, Node: identity, Next: complement, Prev: equalp, Up: Data and Control Flow Dictionary ++ ++5.3.37 identity [Function] ++-------------------------- ++ ++'identity' object => object ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++Description:: ++............. ++ ++Returns its argument object. ++ ++Examples:: ++.......... ++ ++ (identity 101) => 101 ++ (mapcan #'identity (list (list 1 2 3) '(4 5 6))) => (1 2 3 4 5 6) ++ ++Notes:: ++....... ++ ++identity is intended for use with functions that require a function as ++an argument. ++ ++ (eql x (identity x)) returns true for all possible values of x, but ++(eq x (identity x)) might return false when x is a number or character. ++ ++ identity could be defined by ++ ++ (defun identity (x) x) ++ ++ ++File: gcl.info, Node: complement, Next: constantly, Prev: identity, Up: Data and Control Flow Dictionary ++ ++5.3.38 complement [Function] ++---------------------------- ++ ++'complement' function => complement-function ++ ++Arguments and Values:: ++...................... ++ ++function--a function. ++ ++ complement-function--a function. ++ ++Description:: ++............. ++ ++Returns a function that takes the same arguments as function, and has ++the same side-effect behavior as function, but returns only a single ++value: a generalized boolean with the opposite truth value of that which ++would be returned as the primary value of function. That is, when the ++function would have returned true as its primary value the ++complement-function returns false, and when the function would have ++returned false as its primary value the complement-function returns ++true. ++ ++Examples:: ++.......... ++ ++ (funcall (complement #'zerop) 1) => true ++ (funcall (complement #'characterp) #\A) => false ++ (funcall (complement #'member) 'a '(a b c)) => false ++ (funcall (complement #'member) 'd '(a b c)) => true ++ ++See Also:: ++.......... ++ ++*note not:: ++ ++Notes:: ++....... ++ ++ (complement x) == #'(lambda (&rest arguments) (not (apply x arguments))) ++ ++ In Common Lisp, functions with names like "xxx-if-not" are related to ++functions with names like "xxx-if" in that ++ ++ (xxx-if-not f . arguments) == (xxx-if (complement f) . arguments) ++ ++ For example, ++ ++ (find-if-not #'zerop '(0 0 3)) == ++ (find-if (complement #'zerop) '(0 0 3)) => 3 ++ ++ Note that since the "xxx-if-not" functions and the :test-not ++arguments have been deprecated, uses of "xxx-if" functions or :test ++arguments with complement are preferred. ++ ++ ++File: gcl.info, Node: constantly, Next: every, Prev: complement, Up: Data and Control Flow Dictionary ++ ++5.3.39 constantly [Function] ++---------------------------- ++ ++'constantly' value => function ++ ++Arguments and Values:: ++...................... ++ ++value--an object. ++ ++ function--a function. ++ ++Description:: ++............. ++ ++constantly returns a function that accepts any number of arguments, that ++has no side-effects, and that always returns value. ++ ++Examples:: ++.......... ++ ++ (mapcar (constantly 3) '(a b c d)) => (3 3 3 3) ++ (defmacro with-vars (vars &body forms) ++ `((lambda ,vars ,@forms) ,@(mapcar (constantly nil) vars))) ++ => WITH-VARS ++ (macroexpand '(with-vars (a b) (setq a 3 b (* a a)) (list a b))) ++ => ((LAMBDA (A B) (SETQ A 3 B (* A A)) (LIST A B)) NIL NIL), true ++ ++See Also:: ++.......... ++ ++*note not:: ++ ++Notes:: ++....... ++ ++constantly could be defined by: ++ ++ (defun constantly (object) ++ #'(lambda (&rest arguments) object)) ++ ++ ++File: gcl.info, Node: every, Next: and, Prev: constantly, Up: Data and Control Flow Dictionary ++ ++5.3.40 every, some, notevery, notany [Function] ++----------------------------------------------- ++ ++'every' predicate &rest sequences^+ => generalized-boolean ++ ++ 'some' predicate &rest sequences^+ => result ++ ++ 'notevery' predicate &rest sequences^+ => generalized-boolean ++ ++ 'notany' predicate &rest sequences^+ => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++predicate--a designator for a function of as many arguments as there are ++sequences. ++ ++ sequence--a sequence. ++ ++ result--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++every, some, notevery, and notany test elements of sequences for ++satisfaction of a given predicate. The first argument to predicate is ++an element of the first sequence; each succeeding argument is an element ++of a succeeding sequence. ++ ++ Predicate is first applied to the elements with index 0 in each of ++the sequences, and possibly then to the elements with index 1, and so ++on, until a termination criterion is met or the end of the shortest of ++the sequences is reached. ++ ++ every returns false as soon as any invocation of predicate returns ++false. If the end of a sequence is reached, every returns true. Thus, ++every returns true if and only if every invocation of predicate returns ++true. ++ ++ some returns the first non-nil value which is returned by an ++invocation of predicate. If the end of a sequence is reached without ++any invocation of the predicate returning true, some returns false. ++Thus, some returns true if and only if some invocation of predicate ++returns true. ++ ++ notany returns false as soon as any invocation of predicate returns ++true. If the end of a sequence is reached, notany returns true. Thus, ++notany returns true if and only if it is not the case that any ++invocation of predicate returns true. ++ ++ notevery returns true as soon as any invocation of predicate returns ++false. If the end of a sequence is reached, notevery returns false. ++Thus, notevery returns true if and only if it is not the case that every ++invocation of predicate returns true. ++ ++Examples:: ++.......... ++ ++ (every #'characterp "abc") => true ++ (some #'= '(1 2 3 4 5) '(5 4 3 2 1)) => true ++ (notevery #'< '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) => false ++ (notany #'> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its first argument is neither a symbol nor a ++function or if any subsequent argument is not a proper sequence. ++ ++ Other exceptional situations are possible, depending on the nature of ++the predicate. ++ ++See Also:: ++.......... ++ ++*note and:: , *note or:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++ (notany predicate {sequence}*) == (not (some predicate {sequence}*)) ++ (notevery predicate {sequence}*) == (not (every predicate {sequence}*)) ++ ++ ++File: gcl.info, Node: and, Next: cond, Prev: every, Up: Data and Control Flow Dictionary ++ ++5.3.41 and [Macro] ++------------------ ++ ++'and' {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++form--a form. ++ ++ results--the values resulting from the evaluation of the last form, ++or the symbols nil or t. ++ ++Description:: ++............. ++ ++The macro and evaluates each form one at a time from left to right. As ++soon as any form evaluates to nil, and returns nil without evaluating ++the remaining forms. If all forms but the last evaluate to true values, ++and returns the results produced by evaluating the last form. ++ ++ If no forms are supplied, (and) returns t. ++ ++ and passes back multiple values from the last subform but not from ++subforms other than the last. ++ ++Examples:: ++.......... ++ ++ (if (and (>= n 0) ++ (< n (length a-simple-vector)) ++ (eq (elt a-simple-vector n) 'foo)) ++ (princ "Foo!")) ++ ++ The above expression prints Foo! if element n of a-simple-vector is ++the symbol foo, provided also that n is indeed a valid index for ++a-simple-vector. Because and guarantees left-to-right testing of its ++parts, elt is not called if n is out of range. ++ ++ (setq temp1 1 temp2 1 temp3 1) => 1 ++ (and (incf temp1) (incf temp2) (incf temp3)) => 2 ++ (and (eql 2 temp1) (eql 2 temp2) (eql 2 temp3)) => true ++ (decf temp3) => 1 ++ (and (decf temp1) (decf temp2) (eq temp3 'nil) (decf temp3)) => NIL ++ (and (eql temp1 temp2) (eql temp2 temp3)) => true ++ (and) => T ++ ++See Also:: ++.......... ++ ++*note cond:: , *note every:: , *note if:: , *note or:: , *note when:: ++ ++Notes:: ++....... ++ ++ (and form) == (let () form) ++ (and form1 form2 ...) == (when form1 (and form2 ...)) ++ ++ ++File: gcl.info, Node: cond, Next: if, Prev: and, Up: Data and Control Flow Dictionary ++ ++5.3.42 cond [Macro] ++------------------- ++ ++'cond' {!clause}* => {result}* ++ ++ clause ::=(test-form {form}*) ++ ++Arguments and Values:: ++...................... ++ ++test-form--a form. ++ ++ forms--an implicit progn. ++ ++ results--the values of the forms in the first clause whose test-form ++yields true, or the primary value of the test-form if there are no forms ++in that clause, or else nil if no test-form yields true. ++ ++Description:: ++............. ++ ++cond allows the execution of forms to be dependent on test-form. ++ ++ Test-forms are evaluated one at a time in the order in which they are ++given in the argument list until a test-form is found that evaluates to ++true. ++ ++ If there are no forms in that clause, the primary value of the ++test-form is returned by the cond form. Otherwise, the forms associated ++with this test-form are evaluated in order, left to right, as an ++implicit progn, and the values returned by the last form are returned by ++the cond form. ++ ++ Once one test-form has yielded true, no additional test-forms are ++evaluated. If no test-form yields true, nil is returned. ++ ++Examples:: ++.......... ++ ++ (defun select-options () ++ (cond ((= a 1) (setq a 2)) ++ ((= a 2) (setq a 3)) ++ ((and (= a 3) (floor a 2))) ++ (t (floor a 3)))) => SELECT-OPTIONS ++ (setq a 1) => 1 ++ (select-options) => 2 ++ a => 2 ++ (select-options) => 3 ++ a => 3 ++ (select-options) => 1 ++ (setq a 5) => 5 ++ (select-options) => 1, 2 ++ ++See Also:: ++.......... ++ ++*note if:: , *note case:: . ++ ++ ++File: gcl.info, Node: if, Next: or, Prev: cond, Up: Data and Control Flow Dictionary ++ ++5.3.43 if [Special Operator] ++---------------------------- ++ ++'if' test-form then-form [else-form] => {result}* ++ ++Arguments and Values:: ++...................... ++ ++Test-form--a form. ++ ++ Then-form--a form. ++ ++ Else-form--a form. The default is nil. ++ ++ results--if the test-form yielded true, the values returned by the ++then-form; otherwise, the values returned by the else-form. ++ ++Description:: ++............. ++ ++if allows the execution of a form to be dependent on a single test-form. ++ ++ First test-form is evaluated. If the result is true, then then-form ++is selected; otherwise else-form is selected. Whichever form is ++selected is then evaluated. ++ ++Examples:: ++.......... ++ ++ (if t 1) => 1 ++ (if nil 1 2) => 2 ++ (defun test () ++ (dolist (truth-value '(t nil 1 (a b c))) ++ (if truth-value (print 'true) (print 'false)) ++ (prin1 truth-value))) => TEST ++ (test) ++ |> TRUE T ++ |> FALSE NIL ++ |> TRUE 1 ++ |> TRUE (A B C) ++ => NIL ++ ++See Also:: ++.......... ++ ++*note cond:: , unless, *note when:: ++ ++Notes:: ++....... ++ ++ (if test-form then-form else-form) ++ == (cond (test-form then-form) (t else-form)) ++ ++ ++File: gcl.info, Node: or, Next: when, Prev: if, Up: Data and Control Flow Dictionary ++ ++5.3.44 or [Macro] ++----------------- ++ ++'or' {form}* => {results}* ++ ++Arguments and Values:: ++...................... ++ ++form--a form. ++ ++ results--the values or primary value (see below) resulting from the ++evaluation of the last form executed or nil. ++ ++Description:: ++............. ++ ++or evaluates each form, one at a time, from left to right. The ++evaluation of all forms terminates when a form evaluates to true (i.e., ++something other than nil). ++ ++ If the evaluation of any form other than the last returns a primary ++value that is true, or immediately returns that value (but no additional ++values) without evaluating the remaining forms. If every form but the ++last returns false as its primary value, or returns all values returned ++by the last form. If no forms are supplied, or returns nil. ++ ++Examples:: ++.......... ++ ++ (or) => NIL ++ (setq temp0 nil temp1 10 temp2 20 temp3 30) => 30 ++ (or temp0 temp1 (setq temp2 37)) => 10 ++ temp2 => 20 ++ (or (incf temp1) (incf temp2) (incf temp3)) => 11 ++ temp1 => 11 ++ temp2 => 20 ++ temp3 => 30 ++ (or (values) temp1) => 11 ++ (or (values temp1 temp2) temp3) => 11 ++ (or temp0 (values temp1 temp2)) => 11, 20 ++ (or (values temp0 temp1) (values temp2 temp3)) => 20, 30 ++ ++See Also:: ++.......... ++ ++*note and:: , some, unless ++ ++ ++File: gcl.info, Node: when, Next: case, Prev: or, Up: Data and Control Flow Dictionary ++ ++5.3.45 when, unless [Macro] ++--------------------------- ++ ++'when' test-form {form}* => {result}* ++ ++ 'unless' test-form {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++test-form--a form. ++ ++ forms--an implicit progn. ++ ++ results--the values of the forms in a when form if the test-form ++yields true or in an unless form if the test-form yields false; ++otherwise nil. ++ ++Description:: ++............. ++ ++when and unless allow the execution of forms to be dependent on a single ++test-form. ++ ++ In a when form, if the test-form yields true, the forms are evaluated ++in order from left to right and the values returned by the forms are ++returned from the when form. Otherwise, if the test-form yields false, ++the forms are not evaluated, and the when form returns nil. ++ ++ In an unless form, if the test-form yields false, the forms are ++evaluated in order from left to right and the values returned by the ++forms are returned from the unless form. Otherwise, if the test-form ++yields false, the forms are not evaluated, and the unless form returns ++nil. ++ ++Examples:: ++.......... ++ ++ (when t 'hello) => HELLO ++ (unless t 'hello) => NIL ++ (when nil 'hello) => NIL ++ (unless nil 'hello) => HELLO ++ (when t) => NIL ++ (unless nil) => NIL ++ (when t (prin1 1) (prin1 2) (prin1 3)) ++ |> 123 ++ => 3 ++ (unless t (prin1 1) (prin1 2) (prin1 3)) => NIL ++ (when nil (prin1 1) (prin1 2) (prin1 3)) => NIL ++ (unless nil (prin1 1) (prin1 2) (prin1 3)) ++ |> 123 ++ => 3 ++ (let ((x 3)) ++ (list (when (oddp x) (incf x) (list x)) ++ (when (oddp x) (incf x) (list x)) ++ (unless (oddp x) (incf x) (list x)) ++ (unless (oddp x) (incf x) (list x)) ++ (if (oddp x) (incf x) (list x)) ++ (if (oddp x) (incf x) (list x)) ++ (if (not (oddp x)) (incf x) (list x)) ++ (if (not (oddp x)) (incf x) (list x)))) ++ => ((4) NIL (5) NIL 6 (6) 7 (7)) ++ ++See Also:: ++.......... ++ ++*note and:: , *note cond:: , *note if:: , *note or:: ++ ++Notes:: ++....... ++ ++ (when test {form}^+) == (and test (progn {form}^+)) ++ (when test {form}^+) == (cond (test {form}^+)) ++ (when test {form}^+) == (if test (progn {form}^+) nil) ++ (when test {form}^+) == (unless (not test) {form}^+) ++ (unless test {form}^+) == (cond ((not test) {form}^+)) ++ (unless test {form}^+) == (if test nil (progn {form}^+)) ++ (unless test {form}^+) == (when (not test) {form}^+) ++ ++ ++File: gcl.info, Node: case, Next: typecase, Prev: when, Up: Data and Control Flow Dictionary ++ ++5.3.46 case, ccase, ecase [Macro] ++--------------------------------- ++ ++'case' keyform {!normal-clause}* [!otherwise-clause] => {result}* ++ ++ 'ccase' keyplace {!normal-clause}* => {result}* ++ ++ 'ecase' keyform {!normal-clause}* => {result}* ++ ++ normal-clause ::=(keys {form}*) ++ ++ otherwise-clause ::=({otherwise | t} {form}*) ++ ++ clause ::=normal-clause | otherwise-clause ++ ++Arguments and Values:: ++...................... ++ ++keyform--a form; evaluated to produce a test-key. ++ ++ keyplace--a form; evaluated initially to produce a test-key. ++Possibly also used later as a place if no keys match. ++ ++ test-key--an object produced by evaluating keyform or keyplace. ++ ++ keys--a designator for a list of objects. In the case of case, the ++symbols t and otherwise may not be used as the keys designator. To ++refer to these symbols by themselves as keys, the designators (t) and ++(otherwise), respectively, must be used instead. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms in the matching clause. ++ ++Description:: ++............. ++ ++These macros allow the conditional execution of a body of forms in a ++clause that is selected by matching the test-key on the basis of its ++identity. ++ ++ The keyform or keyplace is evaluated to produce the test-key. ++ ++ Each of the normal-clauses is then considered in turn. If the ++test-key is the same as any key for that clause, the forms in that ++clause are evaluated as an implicit progn, and the values it returns are ++returned as the value of the case, ccase, or ecase form. ++ ++ These macros differ only in their behavior when no normal-clause ++matches; specifically: ++ ++case ++ If no normal-clause matches, and there is an otherwise-clause, then ++ that otherwise-clause automatically matches; the forms in that ++ clause are evaluated as an implicit progn, and the values it ++ returns are returned as the value of the case. ++ ++ If there is no otherwise-clause, case returns nil. ++ ++ccase ++ If no normal-clause matches, a correctable error of type type-error ++ is signaled. The offending datum is the test-key and the expected ++ type is type equivalent to (member key1 key2 ...). The store-value ++ restart can be used to correct the error. ++ ++ If the store-value restart is invoked, its argument becomes the new ++ test-key, and is stored in keyplace as if by (setf keyplace ++ test-key). Then ccase starts over, considering each clause anew. ++ ++ [Reviewer Note by Barmar: Will it prompt for multiple values if ++ keyplace is a VALUES general ref?] ++ ++ The subforms of keyplace might be evaluated again if none of the ++ cases holds. ++ ++ecase ++ If no normal-clause matches, a non-correctable error of type ++ type-error is signaled. The offending datum is the test-key and ++ the expected type is type equivalent to (member key1 key2 ...). ++ ++ Note that in contrast with ccase, the caller of ecase may rely on ++ the fact that ecase does not return if a normal-clause does not ++ match. ++ ++Examples:: ++.......... ++ ++ (dolist (k '(1 2 3 :four #\v () t 'other)) ++ (format t "~S " ++ (case k ((1 2) 'clause1) ++ (3 'clause2) ++ (nil 'no-keys-so-never-seen) ++ ((nil) 'nilslot) ++ ((:four #\v) 'clause4) ++ ((t) 'tslot) ++ (otherwise 'others)))) ++ |> CLAUSE1 CLAUSE1 CLAUSE2 CLAUSE4 CLAUSE4 NILSLOT TSLOT OTHERS ++ => NIL ++ (defun add-em (x) (apply #'+ (mapcar #'decode x))) ++ => ADD-EM ++ (defun decode (x) ++ (ccase x ++ ((i uno) 1) ++ ((ii dos) 2) ++ ((iii tres) 3) ++ ((iv cuatro) 4))) ++ => DECODE ++ (add-em '(uno iii)) => 4 ++ (add-em '(uno iiii)) ++ |> Error: The value of X, IIII, is not I, UNO, II, DOS, III, ++ |> TRES, IV, or CUATRO. ++ |> 1: Supply a value to use instead. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Value to evaluate and use for X: |>>'IV<<| ++ => 5 ++ ++Side Effects:: ++.............. ++ ++The debugger might be entered. If the store-value restart is invoked, ++the value of keyplace might be changed. ++ ++Affected By:: ++............. ++ ++ccase and ecase, since they might signal an error, are potentially ++affected by existing handlers and *debug-io*. ++ ++Exceptional Situations:: ++........................ ++ ++ccase and ecase signal an error of type type-error if no normal-clause ++matches. ++ ++See Also:: ++.......... ++ ++*note cond:: , *note typecase:: , *note setf:: , *note Generalized ++Reference:: ++ ++Notes:: ++....... ++ ++ (case test-key ++ {(({key}*) {form}*)}*) ++ == ++ (let ((#1=#:g0001 test-key)) ++ (cond {((member #1# '({key}*)) {form}*)}*)) ++ ++ The specific error message used by ecase and ccase can vary between ++implementations. In situations where control of the specific wording of ++the error message is important, it is better to use case with an ++otherwise-clause that explicitly signals an error with an appropriate ++message. ++ ++ ++File: gcl.info, Node: typecase, Next: multiple-value-bind, Prev: case, Up: Data and Control Flow Dictionary ++ ++5.3.47 typecase, ctypecase, etypecase [Macro] ++--------------------------------------------- ++ ++'typecase' keyform {!normal-clause}* [!otherwise-clause] => {result}* ++ ++ 'ctypecase' keyplace {!normal-clause}* => {result}* ++ ++ 'etypecase' keyform {!normal-clause}* => {result}* ++ ++ normal-clause ::=(type {form}*) ++ ++ otherwise-clause ::=({otherwise | t} {form}*) ++ ++ clause ::=normal-clause | otherwise-clause ++ ++Arguments and Values:: ++...................... ++ ++keyform--a form; evaluated to produce a test-key. ++ ++ keyplace--a form; evaluated initially to produce a test-key. ++Possibly also used later as a place if no types match. ++ ++ test-key--an object produced by evaluating keyform or keyplace. ++ ++ type--a type specifier. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms in the matching clause. ++ ++Description:: ++............. ++ ++These macros allow the conditional execution of a body of forms in a ++clause that is selected by matching the test-key on the basis of its ++type. ++ ++ The keyform or keyplace is evaluated to produce the test-key. ++ ++ Each of the normal-clauses is then considered in turn. If the ++test-key is of the type given by the clauses's type, the forms in that ++clause are evaluated as an implicit progn, and the values it returns are ++returned as the value of the typecase, ctypecase, or etypecase form. ++ ++ These macros differ only in their behavior when no normal-clause ++matches; specifically: ++ ++typecase ++ If no normal-clause matches, and there is an otherwise-clause, then ++ that otherwise-clause automatically matches; the forms in that ++ clause are evaluated as an implicit progn, and the values it ++ returns are returned as the value of the typecase. ++ ++ If there is no otherwise-clause, typecase returns nil. ++ ++ctypecase ++ If no normal-clause matches, a correctable error of type type-error ++ is signaled. The offending datum is the test-key and the expected ++ type is type equivalent to (or type1 type2 ...). The store-value ++ restart can be used to correct the error. ++ ++ If the store-value restart is invoked, its argument becomes the new ++ test-key, and is stored in keyplace as if by (setf keyplace ++ test-key). Then ctypecase starts over, considering each clause ++ anew. ++ ++ If the store-value restart is invoked interactively, the user is ++ prompted for a new test-key to use. ++ ++ The subforms of keyplace might be evaluated again if none of the ++ cases holds. ++ ++etypecase ++ If no normal-clause matches, a non-correctable error of type ++ type-error is signaled. The offending datum is the test-key and ++ the expected type is type equivalent to (or type1 type2 ...). ++ ++ Note that in contrast with ctypecase, the caller of etypecase may ++ rely on the fact that etypecase does not return if a normal-clause ++ does not match. ++ ++ In all three cases, is permissible for more than one clause to ++specify a matching type, particularly if one is a subtype of another; ++the earliest applicable clause is chosen. ++ ++Examples:: ++.......... ++ ++ ;;; (Note that the parts of this example which use TYPE-OF ++ ;;; are implementation-dependent.) ++ (defun what-is-it (x) ++ (format t "~&~S is ~A.~ ++ x (typecase x ++ (float "a float") ++ (null "a symbol, boolean false, or the empty list") ++ (list "a list") ++ (t (format nil "a(n) ~(~A~)" (type-of x)))))) ++ => WHAT-IS-IT ++ (map 'nil #'what-is-it '(nil (a b) 7.0 7 box)) ++ |> NIL is a symbol, boolean false, or the empty list. ++ |> (A B) is a list. ++ |> 7.0 is a float. ++ |> 7 is a(n) integer. ++ |> BOX is a(n) symbol. ++ => NIL ++ (setq x 1/3) ++ => 1/3 ++ (ctypecase x ++ (integer (* x 4)) ++ (symbol (symbol-value x))) ++ |> Error: The value of X, 1/3, is neither an integer nor a symbol. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use instead. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Use value: |>>3.7<<| ++ |> Error: The value of X, 3.7, is neither an integer nor a symbol. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use instead. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Use value: |>>12<<| ++ => 48 ++ x => 12 ++ ++Affected By:: ++............. ++ ++ctypecase and etypecase, since they might signal an error, are ++potentially affected by existing handlers and *debug-io*. ++ ++Exceptional Situations:: ++........................ ++ ++ctypecase and etypecase signal an error of type type-error if no ++normal-clause matches. ++ ++ The compiler may choose to issue a warning of type style-warning if a ++clause will never be selected because it is completely shadowed by ++earlier clauses. ++ ++See Also:: ++.......... ++ ++*note case:: , *note cond:: , *note setf:: , *note Generalized ++Reference:: ++ ++Notes:: ++....... ++ ++ (typecase test-key ++ {(type {form}*)}*) ++ == ++ (let ((#1=#:g0001 test-key)) ++ (cond {((typep #1# 'type) {form}*)}*)) ++ ++ The specific error message used by etypecase and ctypecase can vary ++between implementations. In situations where control of the specific ++wording of the error message is important, it is better to use typecase ++with an otherwise-clause that explicitly signals an error with an ++appropriate message. ++ ++ ++File: gcl.info, Node: multiple-value-bind, Next: multiple-value-call, Prev: typecase, Up: Data and Control Flow Dictionary ++ ++5.3.48 multiple-value-bind [Macro] ++---------------------------------- ++ ++'multiple-value-bind' ({var}*) values-form {declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol naming a variable; not evaluated. ++ ++ values-form--a form; evaluated. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++Creates new variable bindings for the vars and executes a series of ++forms that use these bindings. ++ ++ The variable bindings created are lexical unless special declarations ++are specified. ++ ++ Values-form is evaluated, and each of the vars is bound to the ++respective value returned by that form. If there are more vars than ++values returned, extra values of nil are given to the remaining vars. ++If there are more values than vars, the excess values are discarded. ++The vars are bound to the values over the execution of the forms, which ++make up an implicit progn. The consequences are unspecified if a type ++declaration is specified for a var, but the value to which that var is ++bound is not consistent with the type declaration. ++ ++ The scopes of the name binding and declarations do not include the ++values-form. ++ ++Examples:: ++.......... ++ ++ (multiple-value-bind (f r) ++ (floor 130 11) ++ (list f r)) => (11 9) ++ ++See Also:: ++.......... ++ ++*note let:: , *note multiple-value-call:: ++ ++Notes:: ++....... ++ ++ (multiple-value-bind ({var}*) values-form {form}*) ++ == (multiple-value-call #'(lambda (&optional {var}* &rest #1=#:ignore) ++ (declare (ignore #1#)) ++ {form}*) ++ values-form) ++ ++ ++File: gcl.info, Node: multiple-value-call, Next: multiple-value-list, Prev: multiple-value-bind, Up: Data and Control Flow Dictionary ++ ++5.3.49 multiple-value-call [Special Operator] ++--------------------------------------------- ++ ++'multiple-value-call' function-form form* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++function-form--a form; evaluated to produce function. ++ ++ function--a function designator resulting from the evaluation of ++function-form. ++ ++ form--a form. ++ ++ results--the values returned by the function. ++ ++Description:: ++............. ++ ++Applies function to a list of the objects collected from groups of ++multiple values_2. ++ ++ multiple-value-call first evaluates the function-form to obtain ++function, and then evaluates each form. All the values of each form are ++gathered together (not just one value from each) and given as arguments ++to the function. ++ ++Examples:: ++.......... ++ ++ (multiple-value-call #'list 1 '/ (values 2 3) '/ (values) '/ (floor 2.5)) ++ => (1 / 2 3 / / 2 0.5) ++ (+ (floor 5 3) (floor 19 4)) == (+ 1 4) ++ => 5 ++ (multiple-value-call #'+ (floor 5 3) (floor 19 4)) == (+ 1 2 4 3) ++ => 10 ++ ++See Also:: ++.......... ++ ++*note multiple-value-list:: , *note multiple-value-bind:: ++ ++ ++File: gcl.info, Node: multiple-value-list, Next: multiple-value-prog1, Prev: multiple-value-call, Up: Data and Control Flow Dictionary ++ ++5.3.50 multiple-value-list [Macro] ++---------------------------------- ++ ++'multiple-value-list' form => list ++ ++Arguments and Values:: ++...................... ++ ++form--a form; evaluated as described below. ++ ++ list--a list of the values returned by form. ++ ++Description:: ++............. ++ ++multiple-value-list evaluates form and creates a list of the multiple ++values_2 it returns. ++ ++Examples:: ++.......... ++ ++ (multiple-value-list (floor -3 4)) => (-1 1) ++ ++See Also:: ++.......... ++ ++*note values-list:: , *note multiple-value-call:: ++ ++Notes:: ++....... ++ ++multiple-value-list and values-list are inverses of each other. ++ ++ (multiple-value-list form) == (multiple-value-call #'list form) ++ ++ ++File: gcl.info, Node: multiple-value-prog1, Next: multiple-value-setq, Prev: multiple-value-list, Up: Data and Control Flow Dictionary ++ ++5.3.51 multiple-value-prog1 [Special Operator] ++---------------------------------------------- ++ ++'multiple-value-prog' 1 => first-form {form}* ++ ++ first-form-results ++ ++Arguments and Values:: ++...................... ++ ++first-form--a form; evaluated as described below. ++ ++ form--a form; evaluated as described below. ++ ++ first-form-results--the values resulting from the evaluation of ++first-form. ++ ++Description:: ++............. ++ ++multiple-value-prog1 evaluates first-form and saves all the values ++produced by that form. It then evaluates each form from left to right, ++discarding their values. ++ ++Examples:: ++.......... ++ ++ (setq temp '(1 2 3)) => (1 2 3) ++ (multiple-value-prog1 ++ (values-list temp) ++ (setq temp nil) ++ (values-list temp)) => 1, 2, 3 ++ ++See Also:: ++.......... ++ ++*note prog1:: ++ ++ ++File: gcl.info, Node: multiple-value-setq, Next: values, Prev: multiple-value-prog1, Up: Data and Control Flow Dictionary ++ ++5.3.52 multiple-value-setq [Macro] ++---------------------------------- ++ ++'multiple-value-setq' vars form => result ++ ++Arguments and Values:: ++...................... ++ ++vars--a list of symbols that are either variable names or names of ++symbol macros. ++ ++ form--a form. ++ ++ result--The primary value returned by the form. ++ ++Description:: ++............. ++ ++multiple-value-setq assigns values to vars. ++ ++ The form is evaluated, and each var is assigned to the corresponding ++value returned by that form. If there are more vars than values ++returned, nil is assigned to the extra vars. If there are more values ++than vars, the extra values are discarded. ++ ++ If any var is the name of a symbol macro, then it is assigned as if ++by setf. Specifically, ++ ++ (multiple-value-setq (symbol_1 ... symbol_n) value-producing-form) ++ ++ is defined to always behave in the same way as ++ ++ (values (setf (values symbol_1 ... symbol_n) value-producing-form)) ++ ++ in order that the rules for order of evaluation and side-effects be ++consistent with those used by setf. ++ ++ See *note VALUES Forms as Places::. ++ ++Examples:: ++.......... ++ ++ (multiple-value-setq (quotient remainder) (truncate 3.2 2)) => 1 ++ quotient => 1 ++ remainder => 1.2 ++ (multiple-value-setq (a b c) (values 1 2)) => 1 ++ a => 1 ++ b => 2 ++ c => NIL ++ (multiple-value-setq (a b) (values 4 5 6)) => 4 ++ a => 4 ++ b => 5 ++ ++See Also:: ++.......... ++ ++*note setq:: , *note symbol-macrolet:: ++ ++ ++File: gcl.info, Node: values, Next: values-list, Prev: multiple-value-setq, Up: Data and Control Flow Dictionary ++ ++5.3.53 values [Accessor] ++------------------------ ++ ++'values' &rest object => {object}* ++ ++ (setf (' values' &rest place) new-values) ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ place--a place. ++ ++ new-value--an object. ++ ++Description:: ++............. ++ ++values returns the objects as multiple values_2. ++ ++ setf of values is used to store the multiple values_2 new-values into ++the places. See *note VALUES Forms as Places::. ++ ++Examples:: ++.......... ++ ++ (values) => ++ (values 1) => 1 ++ (values 1 2) => 1, 2 ++ (values 1 2 3) => 1, 2, 3 ++ (values (values 1 2 3) 4 5) => 1, 4, 5 ++ (defun polar (x y) ++ (values (sqrt (+ (* x x) (* y y))) (atan y x))) => POLAR ++ (multiple-value-bind (r theta) (polar 3.0 4.0) ++ (vector r theta)) ++ => #(5.0 0.927295) ++ ++ Sometimes it is desirable to indicate explicitly that a function ++returns exactly one value. For example, the function ++ ++ (defun foo (x y) ++ (floor (+ x y) y)) => FOO ++ ++ returns two values because floor returns two values. It may be that ++the second value makes no sense, or that for efficiency reasons it is ++desired not to compute the second value. values is the standard idiom ++for indicating that only one value is to be returned: ++ ++ (defun foo (x y) ++ (values (floor (+ x y) y))) => FOO ++ ++ This works because values returns exactly one value for each of args; ++as for any function call, if any of args produces more than one value, ++all but the first are discarded. ++ ++See Also:: ++.......... ++ ++*note values-list:: , *note multiple-value-bind:: , *note ++multiple-values-limit:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++Since values is a function, not a macro or special form, it receives as ++arguments only the primary values of its argument forms. ++ ++ ++File: gcl.info, Node: values-list, Next: multiple-values-limit, Prev: values, Up: Data and Control Flow Dictionary ++ ++5.3.54 values-list [Function] ++----------------------------- ++ ++'values-list' list => {element}* ++ ++Arguments and Values:: ++...................... ++ ++list--a list. ++ ++ elements--the elements of the list. ++ ++Description:: ++............. ++ ++Returns the elements of the list as multiple values_2. ++ ++Examples:: ++.......... ++ ++ (values-list nil) => ++ (values-list '(1)) => 1 ++ (values-list '(1 2)) => 1, 2 ++ (values-list '(1 2 3)) => 1, 2, 3 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its argument is not a proper list. ++ ++See Also:: ++.......... ++ ++*note multiple-value-bind:: , *note multiple-value-list:: , *note ++multiple-values-limit:: , *note values:: ++ ++Notes:: ++....... ++ ++ (values-list list) == (apply #'values list) ++ ++ (equal x (multiple-value-list (values-list x))) returns true for all ++lists x. ++ ++ ++File: gcl.info, Node: multiple-values-limit, Next: nth-value, Prev: values-list, Up: Data and Control Flow Dictionary ++ ++5.3.55 multiple-values-limit [Constant Variable] ++------------------------------------------------ ++ ++Constant Value:: ++................ ++ ++An integer not smaller than 20, the exact magnitude of which is ++implementation-dependent. ++ ++Description:: ++............. ++ ++The upper exclusive bound on the number of values that may be returned ++from a function, ++ ++ bound or assigned by multiple-value-bind or multiple-value-setq, or ++passed as a first argument to nth-value. (If these individual limits ++might differ, the minimum value is used.) ++ ++See Also:: ++.......... ++ ++*note lambda-parameters-limit:: , *note call-arguments-limit:: ++ ++Notes:: ++....... ++ ++Implementors are encouraged to make this limit as large as possible. ++ ++ ++File: gcl.info, Node: nth-value, Next: prog, Prev: multiple-values-limit, Up: Data and Control Flow Dictionary ++ ++5.3.56 nth-value [Macro] ++------------------------ ++ ++'nth-value' n form => object ++ ++Arguments and Values:: ++...................... ++ ++n--a non-negative integer; evaluated. ++ ++ form--a form; evaluated as described below. ++ ++ object--an object. ++ ++Description:: ++............. ++ ++Evaluates n and then form, returning as its only value the nth value ++yielded by form, or nil if n is greater than or equal to the number of ++values returned by form. (The first returned value is numbered 0.) ++ ++Examples:: ++.......... ++ ++ (nth-value 0 (values 'a 'b)) => A ++ (nth-value 1 (values 'a 'b)) => B ++ (nth-value 2 (values 'a 'b)) => NIL ++ (let* ((x 83927472397238947423879243432432432) ++ (y 32423489732) ++ (a (nth-value 1 (floor x y))) ++ (b (mod x y))) ++ (values a b (= a b))) ++ => 3332987528, 3332987528, true ++ ++See Also:: ++.......... ++ ++*note multiple-value-list:: , *note nth:: ++ ++Notes:: ++....... ++ ++Operationally, the following relationship is true, although nth-value ++might be more efficient in some implementations because, for example, ++some consing might be avoided. ++ ++ (nth-value n form) == (nth n (multiple-value-list form)) ++ ++ ++File: gcl.info, Node: prog, Next: prog1, Prev: nth-value, Up: Data and Control Flow Dictionary ++ ++5.3.57 prog, prog* [Macro] ++-------------------------- ++ ++'prog' ({var | (var [init-form])}*) {declaration}* {tag | statement}* ++=> {result}* ++ ++ 'prog*' ({var | (var [init-form])}*) {declaration}* {tag | ++statement}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--variable name. ++ ++ init-form--a form. ++ ++ declaration--a declare expression; not evaluated. ++ ++ tag--a go tag; not evaluated. ++ ++ statement--a compound form; evaluated as described below. ++ ++ results--nil if a normal return occurs, or else, if an explicit ++return occurs, the values that were transferred. ++ ++Description:: ++............. ++ ++Three distinct operations are performed by prog and prog*: they bind ++local variables, they permit use of the return statement, and they ++permit use of the go statement. A typical prog looks like this: ++ ++ (prog (var1 var2 (var3 init-form-3) var4 (var5 init-form-5)) ++ {declaration}* ++ statement1 ++ tag1 ++ statement2 ++ statement3 ++ statement4 ++ tag2 ++ statement5 ++ ... ++ ) ++ ++ For prog, init-forms are evaluated first, in the order in which they ++are supplied. The vars are then bound to the corresponding values in ++parallel. If no init-form is supplied for a given var, that var is ++bound to nil. ++ ++ The body of prog is executed as if it were a tagbody form; the go ++statement can be used to transfer control to a tag. Tags label ++statements. ++ ++ prog implicitly establishes a block named nil around the entire prog ++form, so that return can be used at any time to exit from the prog form. ++ ++ The difference between prog* and prog is that in prog* the binding ++and initialization of the vars is done sequentially, so that the ++init-form for each one can use the values of previous ones. ++ ++Examples:: ++.......... ++ ++ (prog* ((y z) (x (car y))) ++ (return x)) ++ ++ returns the car of the value of z. ++ ++ (setq a 1) => 1 ++ (prog ((a 2) (b a)) (return (if (= a b) '= '/=))) => /= ++ (prog* ((a 2) (b a)) (return (if (= a b) '= '/=))) => = ++ (prog () 'no-return-value) => NIL ++ ++ (defun king-of-confusion (w) ++ "Take a cons of two lists and make a list of conses. ++ Think of this function as being like a zipper." ++ (prog (x y z) ;Initialize x, y, z to NIL ++ (setq y (car w) z (cdr w)) ++ loop ++ (cond ((null y) (return x)) ++ ((null z) (go err))) ++ rejoin ++ (setq x (cons (cons (car y) (car z)) x)) ++ (setq y (cdr y) z (cdr z)) ++ (go loop) ++ err ++ (cerror "Will self-pair extraneous items" ++ "Mismatch - gleep! ~S" y) ++ (setq z y) ++ (go rejoin))) => KING-OF-CONFUSION ++ ++ This can be accomplished more perspicuously as follows: ++ ++ (defun prince-of-clarity (w) ++ "Take a cons of two lists and make a list of conses. ++ Think of this function as being like a zipper." ++ (do ((y (car w) (cdr y)) ++ (z (cdr w) (cdr z)) ++ (x '() (cons (cons (car y) (car z)) x))) ++ ((null y) x) ++ (when (null z) ++ (cerror "Will self-pair extraneous items" ++ "Mismatch - gleep! ~S" y) ++ (setq z y)))) => PRINCE-OF-CLARITY ++ ++See Also:: ++.......... ++ ++*note block:: , *note let:: , *note tagbody:: , *note go:: , *note ++return:: , *note Evaluation:: ++ ++Notes:: ++....... ++ ++prog can be explained in terms of block, let, and tagbody as follows: ++ ++ (prog variable-list declaration . body) ++ == (block nil (let variable-list declaration (tagbody . body))) ++ ++ ++File: gcl.info, Node: prog1, Next: progn, Prev: prog, Up: Data and Control Flow Dictionary ++ ++5.3.58 prog1, prog2 [Macro] ++--------------------------- ++ ++'prog' 1 => first-form {form}* result-1 'prog' 2 => first-form ++second-form {form}* result-2 ++ ++Arguments and Values:: ++...................... ++ ++first-form--a form; evaluated as described below. ++ ++ second-form--a form; evaluated as described below. ++ ++ forms--an implicit progn; evaluated as described below. ++ ++ result-1--the primary value resulting from the evaluation of ++first-form. ++ ++ result-2--the primary value resulting from the evaluation of ++second-form. ++ ++Description:: ++............. ++ ++prog1 evaluates first-form and then forms, yielding as its only value ++the primary value yielded by first-form. ++ ++ prog2 evaluates first-form, then second-form, and then forms, ++yielding as its only value the primary value yielded by first-form. ++ ++Examples:: ++.......... ++ ++ (setq temp 1) => 1 ++ (prog1 temp (print temp) (incf temp) (print temp)) ++ |> 1 ++ |> 2 ++ => 1 ++ (prog1 temp (setq temp nil)) => 2 ++ temp => NIL ++ (prog1 (values 1 2 3) 4) => 1 ++ (setq temp (list 'a 'b 'c)) ++ (prog1 (car temp) (setf (car temp) 'alpha)) => A ++ temp => (ALPHA B C) ++ (flet ((swap-symbol-values (x y) ++ (setf (symbol-value x) ++ (prog1 (symbol-value y) ++ (setf (symbol-value y) (symbol-value x)))))) ++ (let ((*foo* 1) (*bar* 2)) ++ (declare (special *foo* *bar*)) ++ (swap-symbol-values '*foo* '*bar*) ++ (values *foo* *bar*))) ++ => 2, 1 ++ (setq temp 1) => 1 ++ (prog2 (incf temp) (incf temp) (incf temp)) => 3 ++ temp => 4 ++ (prog2 1 (values 2 3 4) 5) => 2 ++ ++See Also:: ++.......... ++ ++*note multiple-value-prog1:: , *note progn:: ++ ++Notes:: ++....... ++ ++prog1 and prog2 are typically used to evaluate one or more forms with ++side effects and return a value that must be computed before some or all ++of the side effects happen. ++ ++ (prog1 {form}*) == (values (multiple-value-prog1 {form}*)) ++ (prog2 form1 {form}*) == (let () form1 (prog1 {form}*)) ++ ++ ++File: gcl.info, Node: progn, Next: define-modify-macro, Prev: prog1, Up: Data and Control Flow Dictionary ++ ++5.3.59 progn [Special Operator] ++------------------------------- ++ ++'progn' {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++forms--an implicit progn. ++ ++ results--the values of the forms. ++ ++Description:: ++............. ++ ++progn evaluates forms, in the order in which they are given. ++ ++ The values of each form but the last are discarded. ++ ++ If progn appears as a top level form, then all forms within that ++progn are considered by the compiler to be top level forms. ++ ++Examples:: ++.......... ++ ++ (progn) => NIL ++ (progn 1 2 3) => 3 ++ (progn (values 1 2 3)) => 1, 2, 3 ++ (setq a 1) => 1 ++ (if a ++ (progn (setq a nil) 'here) ++ (progn (setq a t) 'there)) => HERE ++ a => NIL ++ ++See Also:: ++.......... ++ ++*note prog1:: , prog2, *note Evaluation:: ++ ++Notes:: ++....... ++ ++Many places in Common Lisp involve syntax that uses implicit progns. ++That is, part of their syntax allows many forms to be written that are ++to be evaluated sequentially, discarding the results of all forms but ++the last and returning the results of the last form. Such places ++include, but are not limited to, the following: the body of a lambda ++expression; the bodies of various control and conditional forms (e.g., ++case, catch, progn, and when). ++ ++ ++File: gcl.info, Node: define-modify-macro, Next: defsetf, Prev: progn, Up: Data and Control Flow Dictionary ++ ++5.3.60 define-modify-macro [Macro] ++---------------------------------- ++ ++'define-modify-macro' name lambda-list function [documentation] => name ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ lambda-list--a define-modify-macro lambda list ++ ++ function--a symbol. ++ ++ documentation--a string; not evaluated. ++ ++Description:: ++............. ++ ++define-modify-macro defines a macro named name to read and write a ++place. ++ ++ The arguments to the new macro are a place, followed by the arguments ++that are supplied in lambda-list. ++ ++ Macros defined with define-modify-macro correctly pass the ++environment parameter to ++ ++ get-setf-expansion. ++ ++ When the macro is invoked, function is applied to the old contents of ++the place and the lambda-list arguments to obtain the new value, and the ++place is updated to contain the result. ++ ++ Except for the issue of avoiding multiple evaluation (see below), the ++expansion of a define-modify-macro is equivalent to the following: ++ ++ (defmacro name (reference . lambda-list) ++ documentation ++ `(setf ,reference ++ (function ,reference ,arg1 ,arg2 ...))) ++ ++ where arg1, arg2, ..., are the parameters appearing in lambda-list; ++appropriate provision is made for a rest parameter. ++ ++ The subforms of the macro calls defined by define-modify-macro are ++evaluated as specified in *note Evaluation of Subforms to Places::. ++ ++ Documentation is attached as a documentation string to name (as kind ++function) and to the macro function. ++ ++ If a define-modify-macro form appears as a top level form, the ++compiler must store the macro definition at compile time, so that ++occurrences of the macro later on in the file can be expanded correctly. ++ ++Examples:: ++.......... ++ ++ (define-modify-macro appendf (&rest args) ++ append "Append onto list") => APPENDF ++ (setq x '(a b c) y x) => (A B C) ++ (appendf x '(d e f) '(1 2 3)) => (A B C D E F 1 2 3) ++ x => (A B C D E F 1 2 3) ++ y => (A B C) ++ (define-modify-macro new-incf (&optional (delta 1)) +) ++ (define-modify-macro unionf (other-set &rest keywords) union) ++ ++Side Effects:: ++.............. ++ ++A macro definition is assigned to name. ++ ++See Also:: ++.......... ++ ++*note defsetf:: , ++ ++ *note define-setf-expander:: , ++ ++ *note documentation:: , *note Syntactic Interaction of Documentation ++Strings and Declarations:: ++ ++ ++File: gcl.info, Node: defsetf, Next: define-setf-expander, Prev: define-modify-macro, Up: Data and Control Flow Dictionary ++ ++5.3.61 defsetf [Macro] ++---------------------- ++ ++The "short form": ++ ++ 'defsetf' access-fn update-fn [documentation] ++=> access-fn ++ ++ The "long form": ++ ++ 'defsetf' access-fn lambda-list ({store-variable}*) [[{declaration}* ++| documentation]] {form}* ++=> access-fn ++ ++Arguments and Values:: ++...................... ++ ++access-fn--a symbol which names a function or a macro. ++ ++ update-fn--a symbol naming a function or macro. ++ ++ lambda-list--a defsetf lambda list. ++ ++ store-variable--a symbol (a variable name). ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ form--a form. ++ ++Description:: ++............. ++ ++defsetf defines how to setf a place of the form (access-fn ...) for ++relatively simple cases. (See define-setf-expander for more general ++access to this facility.) ++ ++ It must be the case that the function or macro named by access-fn ++evaluates all of its arguments. ++ ++ defsetf may take one of two forms, called the "short form" and the ++"long form," which are distinguished by the type of the second argument. ++ ++ When the short form is used, update-fn must name a function (or ++macro) that takes one more argument than access-fn takes. When setf is ++given a place that is a call on access-fn, it expands into a call on ++update-fn that is given all the arguments to access-fn and also, as its ++last argument, the new value (which must be returned by update-fn as its ++value). ++ ++ The long form defsetf resembles defmacro. The lambda-list describes ++the arguments of access-fn. The store-variables describe the value ++ ++ or values ++ ++ to be stored into the place. The body must compute the expansion of ++a setf of a call on access-fn. ++ ++ The expansion function is defined in the same lexical environment in ++which the defsetf form appears. ++ ++ During the evaluation of the forms, the variables in the lambda-list ++and the store-variables are bound to names of temporary variables, ++generated as if by gensym or gentemp, that will be bound by the ++expansion of setf to the values of those subforms. This binding permits ++the forms to be written without regard for order-of-evaluation issues. ++defsetf arranges for the temporary variables to be optimized out of the ++final result in cases where that is possible. ++ ++ The body code in defsetf is implicitly enclosed in a block whose name ++is access-fn ++ ++ defsetf ensures that subforms of the place are evaluated exactly ++once. ++ ++ Documentation is attached to access-fn as a documentation string of ++kind setf. ++ ++ If a defsetf form appears as a top level form, the compiler must make ++the setf expander available so that it may be used to expand calls to ++setf later on in the file. Users must ensure that the forms, if any, ++can be evaluated at compile time if the access-fn is used in a place ++later in the same file. The compiler must make these setf expanders ++available to compile-time calls to get-setf-expansion when its ++environment argument is a value received as the environment parameter of ++a macro. ++ ++Examples:: ++.......... ++ ++The effect of ++ ++ (defsetf symbol-value set) ++ ++ is built into the Common Lisp system. This causes the form (setf ++(symbol-value foo) fu) to expand into (set foo fu). ++ ++ Note that ++ ++ (defsetf car rplaca) ++ ++ would be incorrect because rplaca does not return its last argument. ++ ++ (defun middleguy (x) (nth (truncate (1- (list-length x)) 2) x)) => MIDDLEGUY ++ (defun set-middleguy (x v) ++ (unless (null x) ++ (rplaca (nthcdr (truncate (1- (list-length x)) 2) x) v)) ++ v) => SET-MIDDLEGUY ++ (defsetf middleguy set-middleguy) => MIDDLEGUY ++ (setq a (list 'a 'b 'c 'd) ++ b (list 'x) ++ c (list 1 2 3 (list 4 5 6) 7 8 9)) => (1 2 3 (4 5 6) 7 8 9) ++ (setf (middleguy a) 3) => 3 ++ (setf (middleguy b) 7) => 7 ++ (setf (middleguy (middleguy c)) 'middleguy-symbol) => MIDDLEGUY-SYMBOL ++ a => (A 3 C D) ++ b => (7) ++ c => (1 2 3 (4 MIDDLEGUY-SYMBOL 6) 7 8 9) ++ ++ An example of the use of the long form of defsetf: ++ ++ (defsetf subseq (sequence start &optional end) (new-sequence) ++ `(progn (replace ,sequence ,new-sequence ++ :start1 ,start :end1 ,end) ++ ,new-sequence)) => SUBSEQ ++ ++ (defvar *xy* (make-array '(10 10))) ++ (defun xy (&key ((x x) 0) ((y y) 0)) (aref *xy* x y)) => XY ++ (defun set-xy (new-value &key ((x x) 0) ((y y) 0)) ++ (setf (aref *xy* x y) new-value)) => SET-XY ++ (defsetf xy (&key ((x x) 0) ((y y) 0)) (store) ++ `(set-xy ,store 'x ,x 'y ,y)) => XY ++ (get-setf-expansion '(xy a b)) ++ => (#:t0 #:t1), ++ (a b), ++ (#:store), ++ ((lambda (&key ((x #:x)) ((y #:y))) ++ (set-xy #:store 'x #:x 'y #:y)) ++ #:t0 #:t1), ++ (xy #:t0 #:t1) ++ (xy 'x 1) => NIL ++ (setf (xy 'x 1) 1) => 1 ++ (xy 'x 1) => 1 ++ (let ((a 'x) (b 'y)) ++ (setf (xy a 1 b 2) 3) ++ (setf (xy b 5 a 9) 14)) ++ => 14 ++ (xy 'y 0 'x 1) => 1 ++ (xy 'x 1 'y 2) => 3 ++ ++See Also:: ++.......... ++ ++*note documentation:: , *note setf:: , ++ ++ *note define-setf-expander:: , *note get-setf-expansion:: , ++ ++ *note Generalized Reference::, *note Syntactic Interaction of ++Documentation Strings and Declarations:: ++ ++Notes:: ++....... ++ ++forms must include provision for returning the correct value (the value ++ ++ or values ++ ++ of store-variable). This is handled by forms rather than by defsetf ++because in many cases this value can be returned at no extra cost, by ++calling a function that simultaneously stores into the place and returns ++the correct value. ++ ++ A setf of a call on access-fn also evaluates all of access-fn's ++arguments; it cannot treat any of them specially. This means that ++defsetf cannot be used to describe how to store into a generalized ++reference to a byte, such as (ldb field reference). ++ ++ define-setf-expander ++ ++ is used to handle situations that do not fit the restrictions imposed ++by defsetf and gives the user additional control. ++ ++ ++File: gcl.info, Node: define-setf-expander, Next: get-setf-expansion, Prev: defsetf, Up: Data and Control Flow Dictionary ++ ++5.3.62 define-setf-expander [Macro] ++----------------------------------- ++ ++'define-setf-expander' access-fn lambda-list [[{declaration}* | ++documentation]] {form}* ++=> access-fn ++ ++Arguments and Values:: ++...................... ++ ++access-fn--a symbol that names a function or macro. ++ ++ lambda-list - macro lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ forms--an implicit progn. ++ ++Description:: ++............. ++ ++define-setf-expander specifies the means by which setf updates a place ++that is referenced by access-fn. ++ ++ When setf is given a place that is specified in terms of access-fn ++and a new value for the place, it is expanded into a form that performs ++the appropriate update. ++ ++ The lambda-list supports destructuring. See *note Macro Lambda ++Lists::. ++ ++ Documentation is attached to access-fn as a documentation string of ++kind setf. ++ ++ Forms constitute the body of the ++ ++ setf expander ++ ++ definition and must compute the setf expansion for a call on setf ++that references the place by means of the given access-fn. ++ ++ The setf expander function is defined in the same lexical environment ++in which the define-setf-expander form appears. ++ ++ While forms are being executed, the variables in lambda-list are ++bound to parts of the place form. ++ ++ The body forms (but not the lambda-list) ++ ++ in a define-setf-expander form are implicitly enclosed in a block ++whose name is access-fn. ++ ++ The evaluation of forms must result in the five values described in ++*note Setf Expansions::. ++ ++ If a define-setf-expander form appears as a top level form, the ++compiler must make the setf expander available so that it may be used to ++expand calls to setf later on in the file. Programmers must ensure that ++the forms can be evaluated at compile time if the access-fn is used in a ++place later in the same file. The compiler must make these setf ++expanders available to compile-time calls to get-setf-expansion when its ++environment argument is a value received as the environment parameter of ++a macro. ++ ++Examples:: ++.......... ++ ++ (defun lastguy (x) (car (last x))) => LASTGUY ++ (define-setf-expander lastguy (x &environment env) ++ "Set the last element in a list to the given value." ++ (multiple-value-bind (dummies vals newval setter getter) ++ (get-setf-expansion x env) ++ (let ((store (gensym))) ++ (values dummies ++ vals ++ `(,store) ++ `(progn (rplaca (last ,getter) ,store) ,store) ++ `(lastguy ,getter))))) => LASTGUY ++ (setq a (list 'a 'b 'c 'd) ++ b (list 'x) ++ c (list 1 2 3 (list 4 5 6))) => (1 2 3 (4 5 6)) ++ (setf (lastguy a) 3) => 3 ++ (setf (lastguy b) 7) => 7 ++ (setf (lastguy (lastguy c)) 'lastguy-symbol) => LASTGUY-SYMBOL ++ a => (A B C 3) ++ b => (7) ++ c => (1 2 3 (4 5 LASTGUY-SYMBOL)) ++ ++ ;;; Setf expander for the form (LDB bytespec int). ++ ;;; Recall that the int form must itself be suitable for SETF. ++ (define-setf-expander ldb (bytespec int &environment env) ++ (multiple-value-bind (temps vals stores ++ store-form access-form) ++ (get-setf-expansion int env);Get setf expansion for int. ++ (let ((btemp (gensym)) ;Temp var for byte specifier. ++ (store (gensym)) ;Temp var for byte to store. ++ (stemp (first stores))) ;Temp var for int to store. ++ (if (cdr stores) (error "Can't expand this.")) ++ ;;; Return the setf expansion for LDB as five values. ++ (values (cons btemp temps) ;Temporary variables. ++ (cons bytespec vals) ;Value forms. ++ (list store) ;Store variables. ++ `(let ((,stemp (dpb ,store ,btemp ,access-form))) ++ ,store-form ++ ,store) ;Storing form. ++ `(ldb ,btemp ,access-form) ;Accessing form. ++ )))) ++ ++See Also:: ++.......... ++ ++*note setf:: , *note defsetf:: , *note documentation:: , *note ++get-setf-expansion:: , *note Syntactic Interaction of Documentation ++Strings and Declarations:: ++ ++Notes:: ++....... ++ ++define-setf-expander differs from the long form of defsetf in that while ++the body is being executed the variables in lambda-list are bound to ++parts of the place form, not to temporary variables that will be bound ++to the values of such parts. In addition, define-setf-expander does not ++have defsetf's restriction that access-fn must be a function or a ++function-like macro; an arbitrary defmacro destructuring pattern is ++permitted in lambda-list. ++ ++ ++File: gcl.info, Node: get-setf-expansion, Next: setf, Prev: define-setf-expander, Up: Data and Control Flow Dictionary ++ ++5.3.63 get-setf-expansion [Function] ++------------------------------------ ++ ++'get-setf-expansion' place &optional environment ++=> vars, vals, store-vars, writer-form, reader-form ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++ environment--an environment object. ++ ++ vars, vals, store-vars, writer-form, reader-form--a setf expansion. ++ ++Description:: ++............. ++ ++Determines five values constituting the setf expansion for place in ++environment; see *note Setf Expansions::. ++ ++ If environment is not supplied or nil, the environment is the null ++lexical environment. ++ ++Examples:: ++.......... ++ ++ (get-setf-expansion 'x) ++ => NIL, NIL, (#:G0001), (SETQ X #:G0001), X ++ ++ ;;; This macro is like POP ++ ++ (defmacro xpop (place &environment env) ++ (multiple-value-bind (dummies vals new setter getter) ++ (get-setf-expansion place env) ++ `(let* (,@(mapcar #'list dummies vals) (,(car new) ,getter)) ++ (if (cdr new) (error "Can't expand this.")) ++ (prog1 (car ,(car new)) ++ (setq ,(car new) (cdr ,(car new))) ++ ,setter)))) ++ ++ (defsetf frob (x) (value) ++ `(setf (car ,x) ,value)) => FROB ++ ;;; The following is an error; an error might be signaled at macro expansion time ++ (flet ((frob (x) (cdr x))) ;Invalid ++ (xpop (frob z))) ++ ++ ++See Also:: ++.......... ++ ++*note defsetf:: , *note define-setf-expander:: , *note setf:: ++ ++Notes:: ++....... ++ ++Any compound form is a valid place, since any compound form whose ++operator f has no setf expander are expanded into a call to (setf f). ++ ++ ++File: gcl.info, Node: setf, Next: shiftf, Prev: get-setf-expansion, Up: Data and Control Flow Dictionary ++ ++5.3.64 setf, psetf [Macro] ++-------------------------- ++ ++'setf' {!pair}* => {result}* ++ ++ 'psetf' {!pair}* => nil ++ ++ pair ::=place newvalue ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++ newvalue--a form. ++ ++ results--the multiple values_2 returned by the storing form for the ++last place, or nil if there are no pairs. ++ ++Description:: ++............. ++ ++setf changes the value of place to be newvalue. ++ ++ (setf place newvalue) expands into an update form that stores the ++result of evaluating newvalue into the location referred to by place. ++Some place forms involve uses of accessors that take optional arguments. ++Whether those optional arguments are permitted by setf, or what their ++use is, is up to the setf expander function and is not under the control ++of setf. The documentation for any function that accepts &optional, ++&rest, or &key arguments and that claims to be usable with setf must ++specify how those arguments are treated. ++ ++ If more than one pair is supplied, the pairs are processed ++sequentially; that is, ++ ++ (setf place-1 newvalue-1 ++ place-2 newvalue-2 ++ ... ++ place-N newvalue-N) ++ ++ is precisely equivalent to ++ ++ (progn (setf place-1 newvalue-1) ++ (setf place-2 newvalue-2) ++ ... ++ (setf place-N newvalue-N)) ++ ++ For psetf, if more than one pair is supplied then the assignments of ++new values to places are done in parallel. More precisely, all subforms ++(in both the place and newvalue forms) that are to be evaluated are ++evaluated from left to right; after all evaluations have been performed, ++all of the assignments are performed in an unpredictable order. ++ ++ For detailed treatment of the expansion of setf and psetf, see *note ++Kinds of Places::. ++ ++Examples:: ++.......... ++ ++ (setq x (cons 'a 'b) y (list 1 2 3)) => (1 2 3) ++ (setf (car x) 'x (cadr y) (car x) (cdr x) y) => (1 X 3) ++ x => (X 1 X 3) ++ y => (1 X 3) ++ (setq x (cons 'a 'b) y (list 1 2 3)) => (1 2 3) ++ (psetf (car x) 'x (cadr y) (car x) (cdr x) y) => NIL ++ x => (X 1 A 3) ++ y => (1 A 3) ++ ++Affected By:: ++............. ++ ++define-setf-expander, defsetf, *macroexpand-hook* ++ ++See Also:: ++.......... ++ ++*note define-setf-expander:: , *note defsetf:: , macroexpand-1, *note ++rotatef:: , *note shiftf:: , *note Generalized Reference:: ++ ++ ++File: gcl.info, Node: shiftf, Next: rotatef, Prev: setf, Up: Data and Control Flow Dictionary ++ ++5.3.65 shiftf [Macro] ++--------------------- ++ ++'shiftf' {place}^+ newvalue => old-value-1 ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++ newvalue--a form; evaluated. ++ ++ old-value-1--an object (the old value of the first place). ++ ++Description:: ++............. ++ ++shiftf modifies the values of each place by storing newvalue into the ++last place, and shifting the values of the second through the last place ++into the remaining places. ++ ++ If newvalue produces more values than there are store variables, the ++extra values are ignored. If newvalue produces fewer values than there ++are store variables, the missing values are set to nil. ++ ++ In the form (shiftf place1 place2 ... placen newvalue), the values in ++place1 through placen are read and saved, and newvalue is evaluated, for ++a total of n+1 values in all. Values 2 through n+1 are then stored into ++place1 through placen, respectively. It is as if all the places form a ++shift register; the newvalue is shifted in from the right, all values ++shift over to the left one place, and the value shifted out of place1 is ++returned. ++ ++ For information about the evaluation of subforms of places, see *note ++Evaluation of Subforms to Places::. ++ ++Examples:: ++.......... ++ ++ (setq x (list 1 2 3) y 'trash) => TRASH ++ (shiftf y x (cdr x) '(hi there)) => TRASH ++ x => (2 3) ++ y => (1 HI THERE) ++ ++ (setq x (list 'a 'b 'c)) => (A B C) ++ (shiftf (cadr x) 'z) => B ++ x => (A Z C) ++ (shiftf (cadr x) (cddr x) 'q) => Z ++ x => (A (C) . Q) ++ (setq n 0) => 0 ++ (setq x (list 'a 'b 'c 'd)) => (A B C D) ++ (shiftf (nth (setq n (+ n 1)) x) 'z) => B ++ x => (A Z C D) ++ ++Affected By:: ++............. ++ ++define-setf-expander, defsetf, *macroexpand-hook* ++ ++See Also:: ++.......... ++ ++*note setf:: , *note rotatef:: , *note Generalized Reference:: ++ ++Notes:: ++....... ++ ++The effect of (shiftf place1 place2 ... placen newvalue) is roughly ++equivalent to ++ ++ (let ((var1 place1) ++ (var2 place2) ++ ... ++ (varn placen) ++ (var0 newvalue)) ++ (setf place1 var2) ++ (setf place2 var3) ++ ... ++ (setf placen var0) ++ var1) ++ ++ except that the latter would evaluate any subforms of each place ++twice, whereas shiftf evaluates them once. For example, ++ ++ (setq n 0) => 0 ++ (setq x (list 'a 'b 'c 'd)) => (A B C D) ++ (prog1 (nth (setq n (+ n 1)) x) ++ (setf (nth (setq n (+ n 1)) x) 'z)) => B ++ x => (A B Z D) ++ ++ ++File: gcl.info, Node: rotatef, Next: control-error, Prev: shiftf, Up: Data and Control Flow Dictionary ++ ++5.3.66 rotatef [Macro] ++---------------------- ++ ++'rotatef' {place}* => nil ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++Description:: ++............. ++ ++rotatef modifies the values of each place by rotating values from one ++place into another. ++ ++ If a place produces more values than there are store variables, the ++extra values are ignored. If a place produces fewer values than there ++are store variables, the missing values are set to nil. ++ ++ In the form (rotatef place1 place2 ... placen), the values in place1 ++through placen are read and written. Values 2 through n and value 1 are ++then stored into place1 through placen. It is as if all the places form ++an end-around shift register that is rotated one place to the left, with ++the value of place1 being shifted around the end to placen. ++ ++ For information about the evaluation of subforms of places, see *note ++Evaluation of Subforms to Places::. ++ ++Examples:: ++.......... ++ ++ (let ((n 0) ++ (x (list 'a 'b 'c 'd 'e 'f 'g))) ++ (rotatef (nth (incf n) x) ++ (nth (incf n) x) ++ (nth (incf n) x)) ++ x) => (A C D B E F G) ++ ++See Also:: ++.......... ++ ++*note define-setf-expander:: , *note defsetf:: , *note setf:: , *note ++shiftf:: , *macroexpand-hook*, *note Generalized Reference:: ++ ++Notes:: ++....... ++ ++The effect of (rotatef place1 place2 ... placen) is roughly equivalent ++to ++ ++ (psetf place1 place2 ++ place2 place3 ++ ... ++ placen place1) ++ ++ except that the latter would evaluate any subforms of each place ++twice, whereas rotatef evaluates them once. ++ ++ ++File: gcl.info, Node: control-error, Next: program-error, Prev: rotatef, Up: Data and Control Flow Dictionary ++ ++5.3.67 control-error [Condition Type] ++------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++control-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type control-error consists of error conditions that result from ++invalid dynamic transfers of control in a program. The errors that ++result from giving throw a tag that is not active or from giving go or ++return-from a tag that is no longer dynamically available are of type ++control-error. ++ ++ ++File: gcl.info, Node: program-error, Next: undefined-function, Prev: control-error, Up: Data and Control Flow Dictionary ++ ++5.3.68 program-error [Condition Type] ++------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++program-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type program-error consists of error conditions related to incorrect ++program syntax. The errors that result from naming a go tag or a block ++tag that is not lexically apparent are of type program-error. ++ ++ ++File: gcl.info, Node: undefined-function, Prev: program-error, Up: Data and Control Flow Dictionary ++ ++5.3.69 undefined-function [Condition Type] ++------------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++undefined-function, cell-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type undefined-function consists of error conditions that represent ++attempts to read the definition of an undefined function. ++ ++ The name of the cell (see cell-error) is the function name which was ++funbound. ++ ++See Also:: ++.......... ++ ++*note cell-error-name:: ++ ++ ++File: gcl.info, Node: Iteration, Next: Objects, Prev: Data and Control Flow, Up: Top ++ ++6 Iteration ++*********** ++ ++* Menu: ++ ++* The LOOP Facility:: ++* Iteration Dictionary:: ++ ++ ++File: gcl.info, Node: The LOOP Facility, Next: Iteration Dictionary, Prev: Iteration, Up: Iteration ++ ++6.1 The LOOP Facility ++===================== ++ ++* Menu: ++ ++* Overview of the Loop Facility:: ++* Variable Initialization and Stepping Clauses:: ++* Value Accumulation Clauses:: ++* Termination Test Clauses:: ++* Unconditional Execution Clauses:: ++* Conditional Execution Clauses:: ++* Miscellaneous Clauses:: ++* Examples of Miscellaneous Loop Features:: ++* Notes about Loop:: ++ ++ ++File: gcl.info, Node: Overview of the Loop Facility, Next: Variable Initialization and Stepping Clauses, Prev: The LOOP Facility, Up: The LOOP Facility ++ ++6.1.1 Overview of the Loop Facility ++----------------------------------- ++ ++The loop macro performs iteration. ++ ++* Menu: ++ ++* Simple vs Extended Loop:: ++* Simple Loop:: ++* Extended Loop:: ++* Loop Keywords:: ++* Parsing Loop Clauses:: ++* Expanding Loop Forms:: ++* Summary of Loop Clauses:: ++* Summary of Variable Initialization and Stepping Clauses:: ++* Summary of Value Accumulation Clauses:: ++* Summary of Termination Test Clauses:: ++* Summary of Unconditional Execution Clauses:: ++* Summary of Conditional Execution Clauses:: ++* Summary of Miscellaneous Clauses:: ++* Order of Execution:: ++* Destructuring:: ++* Restrictions on Side-Effects:: ++ ++ ++File: gcl.info, Node: Simple vs Extended Loop, Next: Simple Loop, Prev: Overview of the Loop Facility, Up: Overview of the Loop Facility ++ ++6.1.1.1 Simple vs Extended Loop ++............................... ++ ++loop forms are partitioned into two categories: simple loop forms and ++extended loop forms. ++ ++ ++File: gcl.info, Node: Simple Loop, Next: Extended Loop, Prev: Simple vs Extended Loop, Up: Overview of the Loop Facility ++ ++6.1.1.2 Simple Loop ++................... ++ ++A simple loop form is one that has a body containing only compound ++forms. Each form is evaluated in turn from left to right. When the ++last form has been evaluated, then the first form is evaluated again, ++and so on, in a never-ending cycle. A simple loop form establishes an ++implicit block named nil. The execution of a simple loop can be ++terminated by explicitly transfering control to the implicit block ++(using return or return-from) or to some exit point outside of the block ++(e.g., using throw, go, or return-from). ++ ++ ++File: gcl.info, Node: Extended Loop, Next: Loop Keywords, Prev: Simple Loop, Up: Overview of the Loop Facility ++ ++6.1.1.3 Extended Loop ++..................... ++ ++An extended loop form is one that has a body containing atomic ++expressions. When the loop macro processes such a form, it invokes a ++facility that is commonly called "the Loop Facility." ++ ++ The Loop Facility provides standardized access to mechanisms commonly ++used in iterations through Loop schemas, which are introduced by loop ++keywords. ++ ++ The body of an extended loop form is divided into loop clauses, each ++which is in turn made up of loop keywords and forms. ++ ++ ++File: gcl.info, Node: Loop Keywords, Next: Parsing Loop Clauses, Prev: Extended Loop, Up: Overview of the Loop Facility ++ ++6.1.1.4 Loop Keywords ++..................... ++ ++Loop keywords are not true keywords_1; they are special symbols, ++recognized by name rather than object identity, that are meaningful only ++to the loop facility. A loop keyword is a symbol but is recognized by ++its name (not its identity), regardless of the packages in which it is ++accessible. ++ ++ In general, loop keywords are not external symbols of the COMMON-LISP ++package, except in the coincidental situation that a symbol with the ++same name as a loop keyword was needed for some other purpose in Common ++Lisp. For example, there is a symbol in the COMMON-LISP package whose ++name is "UNLESS" but not one whose name is "UNTIL". ++ ++ If no loop keywords are supplied in a loop form, the Loop Facility ++executes the loop body repeatedly; see *note Simple Loop::. ++ ++ ++File: gcl.info, Node: Parsing Loop Clauses, Next: Expanding Loop Forms, Prev: Loop Keywords, Up: Overview of the Loop Facility ++ ++6.1.1.5 Parsing Loop Clauses ++............................ ++ ++The syntactic parts of an extended loop form are called clauses; the ++rules for parsing are determined by that clause's keyword. The ++following example shows a loop form with six clauses: ++ ++ (loop for i from 1 to (compute-top-value) ; first clause ++ while (not (unacceptable i)) ; second clause ++ collect (square i) ; third clause ++ do (format t "Working on ~D now" i) ; fourth clause ++ when (evenp i) ; fifth clause ++ do (format t "~D is a non-odd number" i) ++ finally (format t "About to exit!")) ; sixth clause ++ ++ Each loop keyword introduces either a compound loop clause or a ++simple loop clause that can consist of a loop keyword followed by a ++single form. The number of forms in a clause is determined by the loop ++keyword that begins the clause and by the auxiliary keywords in the ++clause. The keywords do, ++ ++ doing, ++ ++ initially, and finally are the only loop keywords that can take any ++number of forms and group them as an implicit progn. ++ ++ Loop clauses can contain auxiliary keywords, which are sometimes ++called prepositions. For example, the first clause in the code above ++includes the prepositions from and to, which mark the value from which ++stepping begins and the value at which stepping ends. ++ ++ For detailed information about loop syntax, see the macro loop. ++ ++ ++File: gcl.info, Node: Expanding Loop Forms, Next: Summary of Loop Clauses, Prev: Parsing Loop Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.6 Expanding Loop Forms ++............................ ++ ++A loop macro form expands into a form containing one or more binding ++forms (that establish bindings of loop variables) and a block and a ++tagbody (that express a looping control structure). The variables ++established in loop are bound as if by let or lambda. ++ ++ Implementations can interleave the setting of initial values with the ++bindings. However, the assignment of the initial values is always ++calculated in the order specified by the user. A variable is thus ++sometimes bound to a meaningless value of the correct type, and then ++later in the prologue it is set to the true initial value by using setq. ++ ++ One implication of this interleaving is that it is ++implementation-dependent whether the lexical environment in which the ++initial value forms (variously called the form1, form2, form3, step-fun, ++vector, hash-table, and package) in any for-as-subclause, except ++for-as-equals-then, are evaluated includes only the loop variables ++preceding that form or includes more or all of the loop variables; the ++form1 and form2 in a for-as-equals-then form includes the lexical ++environment of all the loop variables. ++ ++ After the form is expanded, it consists of three basic parts in the ++tagbody: the loop prologue, the loop body, and the loop epilogue. ++ ++Loop prologue ++ The loop prologue contains forms that are executed before iteration ++ begins, such as any automatic variable initializations prescribed ++ by the variable clauses, along with any initially clauses in the ++ order they appear in the source. ++ ++Loop body ++ The loop body contains those forms that are executed during ++ iteration, including application-specific calculations, termination ++ tests, and variable stepping_1. ++ ++Loop epilogue ++ The loop epilogue contains forms that are executed after iteration ++ terminates, such as finally clauses, if any, along with any ++ implicit return value from an accumulation clause or an ++ termination-test clause. ++ ++ Some clauses from the source form contribute code only to the loop ++prologue; these clauses must come before other clauses that are in the ++main body of the loop form. Others contribute code only to the loop ++epilogue. All other clauses contribute to the final translated form in ++the same order given in the original source form of the loop. ++ ++ Expansion of the loop macro produces an implicit block named nil ++ ++ unless named is supplied. ++ ++ Thus, return-from (and sometimes return) can be used to return values ++from loop or to exit loop. ++ ++ ++File: gcl.info, Node: Summary of Loop Clauses, Next: Summary of Variable Initialization and Stepping Clauses, Prev: Expanding Loop Forms, Up: Overview of the Loop Facility ++ ++6.1.1.7 Summary of Loop Clauses ++............................... ++ ++Loop clauses fall into one of the following categories: ++ ++ ++File: gcl.info, Node: Summary of Variable Initialization and Stepping Clauses, Next: Summary of Value Accumulation Clauses, Prev: Summary of Loop Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.8 Summary of Variable Initialization and Stepping Clauses ++............................................................... ++ ++The for and as constructs provide iteration control clauses that ++establish a variable to be initialized. for and as clauses can be ++combined with the loop keyword and to get parallel initialization and ++stepping_1. Otherwise, the initialization and stepping_1 are ++sequential. ++ ++ The with construct is similar to a single let clause. with clauses ++can be combined using the loop keyword and to get parallel ++initialization. ++ ++ For more information, see *note Variable Initialization and Stepping ++Clauses::. ++ ++ ++File: gcl.info, Node: Summary of Value Accumulation Clauses, Next: Summary of Termination Test Clauses, Prev: Summary of Variable Initialization and Stepping Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.9 Summary of Value Accumulation Clauses ++............................................. ++ ++The collect (or collecting) construct takes one form in its clause and ++adds the value of that form to the end of a list of values. By default, ++the list of values is returned when the loop finishes. ++ ++ The append (or appending) construct takes one form in its clause and ++appends the value of that form to the end of a list of values. By ++default, the list of values is returned when the loop finishes. ++ ++ The nconc (or nconcing) construct is similar to the append construct, ++but its list values are concatenated as if by the function nconc. By ++default, the list of values is returned when the loop finishes. ++ ++ The sum (or summing) construct takes one form in its clause that must ++evaluate to a number and accumulates the sum of all these numbers. By ++default, the cumulative sum is returned when the loop finishes. ++ ++ The count (or counting) construct takes one form in its clause and ++counts the number of times that the form evaluates to true. By default, ++the count is returned when the loop finishes. ++ ++ The minimize (or minimizing) construct takes one form in its clause ++and determines the minimum value obtained by evaluating that form. By ++default, the minimum value is returned when the loop finishes. ++ ++ The maximize (or maximizing) construct takes one form in its clause ++and determines the maximum value obtained by evaluating that form. By ++default, the maximum value is returned when the loop finishes. ++ ++ For more information, see *note Value Accumulation Clauses::. ++ ++ ++File: gcl.info, Node: Summary of Termination Test Clauses, Next: Summary of Unconditional Execution Clauses, Prev: Summary of Value Accumulation Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.10 Summary of Termination Test Clauses ++............................................ ++ ++The for and as constructs provide a termination test that is determined ++by the iteration control clause. ++ ++ The repeat construct causes termination after a specified number of ++iterations. (It uses an internal variable to keep track of the number ++of iterations.) ++ ++ The while construct takes one form, a test, and terminates the ++iteration if the test evaluates to false. A while clause is equivalent ++to the expression (if (not test) (loop-finish)). ++ ++ The until construct is the inverse of while; it terminates the ++iteration if the test evaluates to any non-nil value. An until clause ++is equivalent to the expression (if test (loop-finish)). ++ ++ The always construct takes one form and terminates the loop if the ++form ever evaluates to false; in this case, the loop form returns nil. ++Otherwise, it provides a default return value of t. ++ ++ The never construct takes one form and terminates the loop if the ++form ever evaluates to true; in this case, the loop form returns nil. ++Otherwise, it provides a default return value of t. ++ ++ The thereis construct takes one form and terminates the loop if the ++form ever evaluates to a non-nil object; in this case, the loop form ++returns that object. ++ ++ Otherwise, it provides a default return value of nil. ++ ++ If multiple termination test clauses are specified, the loop form ++terminates if any are satisfied. ++ ++ For more information, see *note Termination Test Clauses::. ++ ++ ++File: gcl.info, Node: Summary of Unconditional Execution Clauses, Next: Summary of Conditional Execution Clauses, Prev: Summary of Termination Test Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.11 Summary of Unconditional Execution Clauses ++................................................... ++ ++The do (or doing) construct evaluates all forms in its clause. ++ ++ The return construct takes one ++ ++ form. Any values returned by the form are immediately returned by ++the loop form. It is equivalent to the clause do (return-from ++block-name value), where block-name is the name specified in a named ++clause, or nil if there is no named clause. ++ ++ For more information, see *note Unconditional Execution Clauses::. ++ ++ ++File: gcl.info, Node: Summary of Conditional Execution Clauses, Next: Summary of Miscellaneous Clauses, Prev: Summary of Unconditional Execution Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.12 Summary of Conditional Execution Clauses ++................................................. ++ ++The if and when constructs take one form as a test and a clause that is ++executed when the test yields true. The clause can be a value ++accumulation, unconditional, or another conditional clause; it can also ++be any combination of such clauses connected by the loop and keyword. ++ ++ The loop unless construct is similar to the loop when construct ++except that it complements the test result. ++ ++ The loop else construct provides an optional component of if, when, ++and unless clauses that is executed when an if or when test yields false ++or when an unless test yields true. The component is one of the clauses ++described under if. ++ ++ The loop end construct provides an optional component to mark the end ++of a conditional clause. ++ ++ For more information, see *note Conditional Execution Clauses::. ++ ++ ++File: gcl.info, Node: Summary of Miscellaneous Clauses, Next: Order of Execution, Prev: Summary of Conditional Execution Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.13 Summary of Miscellaneous Clauses ++......................................... ++ ++The loop named construct gives a name for the block of the loop. ++ ++ The loop initially construct causes its forms to be evaluated in the ++loop prologue, which precedes all loop code except for initial settings ++supplied by the constructs with, for, or as. ++ ++ The loop finally construct causes its forms to be evaluated in the ++loop epilogue after normal iteration terminates. ++ ++ For more information, see *note Miscellaneous Clauses::. ++ ++ ++File: gcl.info, Node: Order of Execution, Next: Destructuring, Prev: Summary of Miscellaneous Clauses, Up: Overview of the Loop Facility ++ ++6.1.1.14 Order of Execution ++........................... ++ ++With the exceptions listed below, clauses are executed in the loop body ++in the order in which they appear in the source. Execution is repeated ++until a clause terminates the loop or until a return, go, or throw form ++is encountered which transfers control to a point outside of the loop. ++The following actions are exceptions to the linear order of execution: ++ ++* ++ All variables are initialized first, regardless of where the ++ establishing clauses appear in the source. The order of ++ initialization follows the order of these clauses. ++ ++* ++ The code for any initially clauses is collected into one progn in ++ the order in which the clauses appear in the source. The collected ++ code is executed once in the loop prologue after any implicit ++ variable initializations. ++ ++* ++ The code for any finally clauses is collected into one progn in the ++ order in which the clauses appear in the source. The collected ++ code is executed once in the loop epilogue before any implicit ++ values from the accumulation clauses are returned. Explicit ++ returns anywhere in the source, however, will exit the loop without ++ executing the epilogue code. ++ ++* ++ A with clause introduces a variable binding and an optional initial ++ value. The initial values are calculated in the order in which the ++ with clauses occur. ++ ++* ++ Iteration control clauses implicitly perform the following actions: ++ ++ - ++ initialize variables; ++ ++ - ++ step variables, generally between each execution of the loop ++ body; ++ ++ - ++ perform termination tests, generally just before the execution ++ of the loop body. ++ ++ ++File: gcl.info, Node: Destructuring, Next: Restrictions on Side-Effects, Prev: Order of Execution, Up: Overview of the Loop Facility ++ ++6.1.1.15 Destructuring ++...................... ++ ++The d-type-spec argument is used for destructuring. If the d-type-spec ++argument consists solely of the type fixnum, float, t, or nil, the ++of-type keyword is optional. The of-type construct is optional in these ++cases to provide backwards compatibility; thus, the following two ++expressions are the same: ++ ++ ;;; This expression uses the old syntax for type specifiers. ++ (loop for i fixnum upfrom 3 ...) ++ ++ ;;; This expression uses the new syntax for type specifiers. ++ (loop for i of-type fixnum upfrom 3 ...) ++ ++ ;; Declare X and Y to be of type VECTOR and FIXNUM respectively. ++ (loop for (x y) of-type (vector fixnum) ++ in l do ...) ++ ++ A type specifier for a destructuring pattern is a tree of type ++specifiers with the same shape as the tree of variable names, with the ++following exceptions: ++ ++* ++ When aligning the trees, an atom in the tree of type specifiers ++ that matches a cons in the variable tree declares the same type for ++ each variable in the subtree rooted at the cons. ++ ++* ++ A cons in the tree of type specifiers that matches an atom in the ++ tree of variable names is a compound type specifer. ++ ++ Destructuring allows binding of a set of variables to a corresponding ++set of values anywhere that a value can normally be bound to a single ++variable. During loop expansion, each variable in the variable list is ++matched with the values in the values list. If there are more variables ++in the variable list than there are values in the values list, the ++remaining variables are given a value of nil. If there are more values ++than variables listed, the extra values are discarded. ++ ++ To assign values from a list to the variables a, b, and c, the for ++clause could be used to bind the variable numlist to the car of the ++supplied form, and then another for clause could be used to bind the ++variables a, b, and c sequentially. ++ ++ ;; Collect values by using FOR constructs. ++ (loop for numlist in '((1 2 4.0) (5 6 8.3) (8 9 10.4)) ++ for a of-type integer = (first numlist) ++ and b of-type integer = (second numlist) ++ and c of-type float = (third numlist) ++ collect (list c b a)) ++ => ((4.0 2 1) (8.3 6 5) (10.4 9 8)) ++ ++ Destructuring makes this process easier by allowing the variables to ++be bound in each loop iteration. Types can be declared by using a list ++of type-spec arguments. If all the types are the same, a shorthand ++destructuring syntax can be used, as the second example illustrates. ++ ++ ;; Destructuring simplifies the process. ++ (loop for (a b c) of-type (integer integer float) in ++ '((1 2 4.0) (5 6 8.3) (8 9 10.4)) ++ collect (list c b a)) ++ => ((4.0 2 1) (8.3 6 5) (10.4 9 8)) ++ ++ ;; If all the types are the same, this way is even simpler. ++ (loop for (a b c) of-type float in ++ '((1.0 2.0 4.0) (5.0 6.0 8.3) (8.0 9.0 10.4)) ++ collect (list c b a)) ++ => ((4.0 2.0 1.0) (8.3 6.0 5.0) (10.4 9.0 8.0)) ++ ++ If destructuring is used to declare or initialize a number of groups ++of variables into types, the loop keyword and can be used to simplify ++the process further. ++ ++ ;; Initialize and declare variables in parallel by using the AND construct.\kern-7pt ++ (loop with (a b) of-type float = '(1.0 2.0) ++ and (c d) of-type integer = '(3 4) ++ and (e f) ++ return (list a b c d e f)) ++ => (1.0 2.0 3 4 NIL NIL) ++ ++ If nil is used in a destructuring list, no variable is provided for ++its place. ++ ++ (loop for (a nil b) = '(1 2 3) ++ do (return (list a b))) ++ => (1 3) ++ ++ Note that dotted lists can specify destructuring. ++ ++ (loop for (x . y) = '(1 . 2) ++ do (return y)) ++ => 2 ++ (loop for ((a . b) (c . d)) of-type ((float . float) (integer . integer)) in ++ '(((1.2 . 2.4) (3 . 4)) ((3.4 . 4.6) (5 . 6))) ++ collect (list a b c d)) ++ => ((1.2 2.4 3 4) (3.4 4.6 5 6)) ++ ++ An error of type program-error is signaled (at macro expansion time) ++if the same variable is bound twice in any variable-binding clause of a ++single loop expression. Such variables include local variables, ++iteration control variables, and variables found by destructuring. ++ ++ ++File: gcl.info, Node: Restrictions on Side-Effects, Prev: Destructuring, Up: Overview of the Loop Facility ++ ++6.1.1.16 Restrictions on Side-Effects ++..................................... ++ ++See *note Traversal Rules and Side Effects::. ++ ++ ++File: gcl.info, Node: Variable Initialization and Stepping Clauses, Next: Value Accumulation Clauses, Prev: Overview of the Loop Facility, Up: The LOOP Facility ++ ++6.1.2 Variable Initialization and Stepping Clauses ++-------------------------------------------------- ++ ++* Menu: ++ ++* Iteration Control:: ++* The for-as-arithmetic subclause:: ++* Examples of for-as-arithmetic subclause:: ++* The for-as-in-list subclause:: ++* Examples of for-as-in-list subclause:: ++* The for-as-on-list subclause:: ++* Examples of for-as-on-list subclause:: ++* The for-as-equals-then subclause:: ++* Examples of for-as-equals-then subclause:: ++* The for-as-across subclause:: ++* Examples of for-as-across subclause:: ++* The for-as-hash subclause:: ++* The for-as-package subclause:: ++* Examples of for-as-package subclause:: ++* Local Variable Initializations:: ++* Examples of WITH clause:: ++ ++ ++File: gcl.info, Node: Iteration Control, Next: The for-as-arithmetic subclause, Prev: Variable Initialization and Stepping Clauses, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.1 Iteration Control ++......................... ++ ++Iteration control clauses allow direction of loop iteration. The loop ++keywords for and as designate iteration control clauses. Iteration ++control clauses differ with respect to the specification of termination ++tests and to the initialization and stepping_1 of loop variables. ++Iteration clauses by themselves do not cause the Loop Facility to return ++values, but they can be used in conjunction with value-accumulation ++clauses to return values. ++ ++ All variables are initialized in the loop prologue. A variable ++binding has lexical scope unless it is proclaimed special; thus, by ++default, the variable can be accessed only by forms that lie textually ++within the loop. Stepping assignments are made in the loop body before ++any other forms are evaluated in the body. ++ ++ The variable argument in iteration control clauses can be a ++destructuring list. A destructuring list is a tree whose non-nil atoms ++are variable names. See *note Destructuring::. ++ ++ The iteration control clauses for, as, and repeat must precede any ++other loop clauses, except initially, with, and named, since they ++establish variable bindings. When iteration control clauses are used in ++a loop, the corresponding termination tests in the loop body are ++evaluated before any other loop body code is executed. ++ ++ If multiple iteration clauses are used to control iteration, variable ++initialization and stepping_1 occur sequentially by default. The and ++construct can be used to connect two or more iteration clauses when ++sequential binding and stepping_1 are not necessary. The iteration ++behavior of clauses joined by and is analogous to the behavior of the ++macro do with respect to do*. ++ ++ The for and as clauses iterate by using one or more local loop ++variables that are initialized to some value and that can be modified or ++stepped_1 after each iteration. For these clauses, iteration terminates ++when a local variable reaches some supplied value or when some other ++loop clause terminates iteration. At each iteration, variables can be ++stepped_1 by an increment or a decrement or can be assigned a new value ++by the evaluation of a form). Destructuring can be used to assign ++values to variables during iteration. ++ ++ The for and as keywords are synonyms; they can be used ++interchangeably. There are seven syntactic formats for these ++constructs. In each syntactic format, the type of var can be supplied ++by the optional type-spec argument. If var is a destructuring list, the ++type supplied by the type-spec argument must appropriately match the ++elements of the list. By convention, for introduces new iterations and ++as introduces iterations that depend on a previous iteration ++specification. ++ ++ ++File: gcl.info, Node: The for-as-arithmetic subclause, Next: Examples of for-as-arithmetic subclause, Prev: Iteration Control, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.2 The for-as-arithmetic subclause ++....................................... ++ ++In the for-as-arithmetic subclause, the for or as construct iterates ++from the value supplied by form1 to the value supplied by form2 in ++increments or decrements denoted by form3. Each expression is evaluated ++only once and must evaluate to a number. The variable var is bound to ++the value of form1 in the first iteration and is stepped_1 by the value ++of form3 in each succeeding iteration, or by 1 if form3 is not provided. ++The following loop keywords serve as valid prepositions within this ++syntax. At least one of the prepositions must be used; and at most one ++from each line may be used in a single subclause. ++ ++from | downfrom | upfrom ++to | downto | upto | below | above ++by ++ ++ The prepositional phrases in each subclause may appear in any order. ++For example, either "from x by y" or "by y from x" is permitted. ++However, because left-to-right order of evaluation is preserved, the ++effects will be different in the case of side effects. ++ ++ Consider: ++ ++ (let ((x 1)) (loop for i from x by (incf x) to 10 collect i)) ++ => (1 3 5 7 9) ++ (let ((x 1)) (loop for i by (incf x) from x to 10 collect i)) ++ => (2 4 6 8 10) ++ ++ The descriptions of the prepositions follow: ++ ++from ++ The loop keyword from specifies the value from which stepping_1 ++ begins, as supplied by form1. Stepping_1 is incremental by ++ default. If decremental stepping_1 is desired, the preposition ++ downto or above must be used with form2. For incremental ++ stepping_1, the default from value is 0. ++ ++downfrom, upfrom ++ The loop keyword downfrom indicates that the variable var is ++ decreased in decrements supplied by form3; the loop keyword upfrom ++ indicates that var is increased in increments supplied by form3. ++ ++to ++ The loop keyword to marks the end value for stepping_1 supplied in ++ form2. Stepping_1 is incremental by default. If decremental ++ stepping_1 is desired, the preposition downfrom must be used with ++ form1, or else the preposition downto or above should be used ++ instead of to with form2. ++ ++downto, upto ++ The loop keyword downto specifies decremental stepping; the loop ++ keyword upto specifies incremental stepping. In both cases, the ++ amount of change on each step is specified by form3, and the loop ++ terminates when the variable var passes the value of form2. Since ++ there is no default for form1 in decremental stepping_1, a form1 ++ value must be supplied (using from or downfrom) when downto is ++ supplied. ++ ++below, above ++ The loop keywords below and above are analogous to upto and downto ++ respectively. These keywords stop iteration just before the value ++ of the variable var reaches the value supplied by form2; the end ++ value of form2 is not included. Since there is no default for ++ form1 in decremental stepping_1, a form1 value must be supplied ++ (using from or downfrom) when above is supplied. ++ ++by ++ The loop keyword by marks the increment or decrement supplied by ++ form3. The value of form3 can be any positive number. The default ++ value is 1. ++ ++ In an iteration control clause, the for or as construct causes ++termination when the supplied limit is reached. That is, iteration ++continues until the value var is stepped to the exclusive or inclusive ++limit supplied by form2. The range is exclusive if form3 increases or ++decreases var to the value of form2 without reaching that value; the ++loop keywords below and above provide exclusive limits. An inclusive ++limit allows var to attain the value of form2; to, downto, and upto ++provide inclusive limits. ++ ++ ++File: gcl.info, Node: Examples of for-as-arithmetic subclause, Next: The for-as-in-list subclause, Prev: The for-as-arithmetic subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.3 Examples of for-as-arithmetic subclause ++............................................... ++ ++ ;; Print some numbers. ++ (loop for i from 1 to 3 ++ do (print i)) ++ |> 1 ++ |> 2 ++ |> 3 ++ => NIL ++ ++ ;; Print every third number. ++ (loop for i from 10 downto 1 by 3 ++ do (print i)) ++ |> 10 ++ |> 7 ++ |> 4 ++ |> 1 ++ => NIL ++ ++ ;; Step incrementally from the default starting value. ++ (loop for i below 3 ++ do (print i)) ++ |> 0 ++ |> 1 ++ |> 2 ++ => NIL ++ ++ ++File: gcl.info, Node: The for-as-in-list subclause, Next: Examples of for-as-in-list subclause, Prev: Examples of for-as-arithmetic subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.4 The for-as-in-list subclause ++.................................... ++ ++In the for-as-in-list subclause, the for or as construct iterates over ++the contents of a list. It checks for the end of the list as if by ++using endp. The variable var is bound to the successive elements of the ++list in form1 before each iteration. At the end of each iteration, the ++function step-fun is applied to the list; the default value for step-fun ++is cdr. The loop keywords in and by serve as valid prepositions in this ++syntax. The for or as construct causes termination when the end of the ++list is reached. ++ ++ ++File: gcl.info, Node: Examples of for-as-in-list subclause, Next: The for-as-on-list subclause, Prev: The for-as-in-list subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.5 Examples of for-as-in-list subclause ++............................................ ++ ++ ;; Print every item in a list. ++ (loop for item in '(1 2 3) do (print item)) ++ |> 1 ++ |> 2 ++ |> 3 ++ => NIL ++ ++ ;; Print every other item in a list. ++ (loop for item in '(1 2 3 4 5) by #'cddr ++ do (print item)) ++ |> 1 ++ |> 3 ++ |> 5 ++ => NIL ++ ++ ;; Destructure a list, and sum the x values using fixnum arithmetic. ++ (loop for (item . x) of-type (t . fixnum) in '((A . 1) (B . 2) (C . 3)) ++ unless (eq item 'B) sum x) ++ => 4 ++ ++ ++File: gcl.info, Node: The for-as-on-list subclause, Next: Examples of for-as-on-list subclause, Prev: Examples of for-as-in-list subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.6 The for-as-on-list subclause ++.................................... ++ ++In the for-as-on-list subclause, the for or as construct iterates over a ++list. It checks for the end of the list as if by using atom. ++ ++ The variable var is bound to the successive tails of the list in ++form1. At the end of each iteration, the function step-fun is applied ++to the list; the default value for step-fun is cdr. The loop keywords ++on and by serve as valid prepositions in this syntax. The for or as ++construct causes termination when the end of the list is reached. ++ ++ ++File: gcl.info, Node: Examples of for-as-on-list subclause, Next: The for-as-equals-then subclause, Prev: The for-as-on-list subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.7 Examples of for-as-on-list subclause ++............................................ ++ ++ ;; Collect successive tails of a list. ++ (loop for sublist on '(a b c d) ++ collect sublist) ++ => ((A B C D) (B C D) (C D) (D)) ++ ++ ;; Print a list by using destructuring with the loop keyword ON. ++ (loop for (item) on '(1 2 3) ++ do (print item)) ++ |> 1 ++ |> 2 ++ |> 3 ++ => NIL ++ ++ ++ ++File: gcl.info, Node: The for-as-equals-then subclause, Next: Examples of for-as-equals-then subclause, Prev: Examples of for-as-on-list subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.8 The for-as-equals-then subclause ++........................................ ++ ++In the for-as-equals-then subclause the for or as construct initializes ++the variable var by setting it to the result of evaluating form1 on the ++first iteration, then setting it to the result of evaluating form2 on ++the second and subsequent iterations. If form2 is omitted, the ++construct uses form1 on the second and subsequent iterations. The loop ++keywords = and then serve as valid prepositions in this syntax. This ++construct does not provide any termination tests. ++ ++ ++File: gcl.info, Node: Examples of for-as-equals-then subclause, Next: The for-as-across subclause, Prev: The for-as-equals-then subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.9 Examples of for-as-equals-then subclause ++................................................ ++ ++ ;; Collect some numbers. ++ (loop for item = 1 then (+ item 10) ++ for iteration from 1 to 5 ++ collect item) ++ => (1 11 21 31 41) ++ ++ ++File: gcl.info, Node: The for-as-across subclause, Next: Examples of for-as-across subclause, Prev: Examples of for-as-equals-then subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.10 The for-as-across subclause ++.................................... ++ ++In the for-as-across subclause the for or as construct binds the ++variable var to the value of each element in the array vector. The loop ++keyword across marks the array vector; across is used as a preposition ++in this syntax. Iteration stops when there are no more elements in the ++supplied array that can be referenced. Some implementations might ++recognize a the special form in the vector form to produce more ++efficient code. ++ ++ ++File: gcl.info, Node: Examples of for-as-across subclause, Next: The for-as-hash subclause, Prev: The for-as-across subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.11 Examples of for-as-across subclause ++............................................ ++ ++ (loop for char across (the simple-string (find-message channel)) ++ do (write-char char stream)) ++ ++ ++File: gcl.info, Node: The for-as-hash subclause, Next: The for-as-package subclause, Prev: Examples of for-as-across subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.12 The for-as-hash subclause ++.................................. ++ ++In the for-as-hash subclause the for or as construct iterates over the ++elements, keys, and values of a hash-table. In this syntax, a compound ++preposition is used to designate access to a hash table. The variable ++var takes on the value of each hash key or hash value in the supplied ++hash-table. The following loop keywords serve as valid prepositions ++within this syntax: ++ ++being ++ The keyword being introduces either the Loop schema hash-key or ++ hash-value. ++ ++each, the ++ The loop keyword each follows the loop keyword being when hash-key ++ or hash-value is used. The loop keyword the is used with hash-keys ++ and hash-values only for ease of reading. This agreement isn't ++ required. ++ ++hash-key, hash-keys ++ These loop keywords access each key entry of the hash table. If ++ the name hash-value is supplied in a using construct with one of ++ these Loop schemas, the iteration can optionally access the keyed ++ value. The order in which the keys are accessed is undefined; ++ empty slots in the hash table are ignored. ++ ++hash-value, hash-values ++ These loop keywords access each value entry of a hash table. If ++ the name hash-key is supplied in a using construct with one of ++ these Loop schemas, the iteration can optionally access the key ++ that corresponds to the value. The order in which the keys are ++ accessed is undefined; empty slots in the hash table are ignored. ++ ++using ++ The loop keyword using introduces the optional key or the keyed ++ value to be accessed. It allows access to the hash key if ++ iteration is over the hash values, and the hash value if iteration ++ is over the hash keys. ++ ++in, of ++ These loop prepositions introduce hash-table. ++ ++ In effect ++ ++ being {each | the} {hash-value | hash-values | hash-key | hash-keys} ++{in | of} ++ ++ is a compound preposition. ++ ++ Iteration stops when there are no more hash keys or hash values to be ++referenced in the supplied hash-table. ++ ++ ++File: gcl.info, Node: The for-as-package subclause, Next: Examples of for-as-package subclause, Prev: The for-as-hash subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.13 The for-as-package subclause ++..................................... ++ ++In the for-as-package subclause the for or as construct iterates over ++the symbols in a package. In this syntax, a compound preposition is ++used to designate access to a package. The variable var takes on the ++value of each symbol in the supplied package. The following loop ++keywords serve as valid prepositions within this syntax: ++ ++being ++ The keyword being introduces either the Loop schema symbol, ++ present-symbol, or external-symbol. ++ ++each, the ++ The loop keyword each follows the loop keyword being when symbol, ++ present-symbol, or external-symbol is used. The loop keyword the ++ is used with symbols, present-symbols, and external-symbols only ++ for ease of reading. This agreement isn't required. ++ ++present-symbol, present-symbols ++ These Loop schemas iterate over the symbols ++ ++ that are present in a package. ++ ++ The package to be iterated over is supplied in the same way that ++ package arguments to find-package are supplied. If the package for ++ the iteration is not supplied, the current package is used. If a ++ package that does not exist is supplied, an error of type ++ package-error is signaled. ++ ++symbol, symbols ++ These Loop schemas iterate over symbols that are accessible in a ++ given package. The package to be iterated over is supplied in the ++ same way that package arguments to find-package are supplied. If ++ the package for the iteration is not supplied, the current package ++ is used. If a package that does not exist is supplied, an error of ++ type package-error is signaled. ++ ++external-symbol, external-symbols ++ These Loop schemas iterate over the external symbols of a package. ++ The package to be iterated over is supplied in the same way that ++ package arguments to find-package are supplied. If the package for ++ the iteration is not supplied, the current package is used. If a ++ package that does not exist is supplied, an error of type ++ package-error is signaled. ++ ++in, of ++ These loop prepositions introduce package. ++ ++ In effect ++ ++ being {each | the} {symbol | symbols | present-symbol | ++present-symbols | external-symbol | external-symbols} {in | of} ++ ++ is a compound preposition. ++ ++ Iteration stops when there are no more symbols to be referenced in ++the supplied package. ++ ++ ++File: gcl.info, Node: Examples of for-as-package subclause, Next: Local Variable Initializations, Prev: The for-as-package subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.14 Examples of for-as-package subclause ++............................................. ++ ++ (let ((*package* (make-package "TEST-PACKAGE-1"))) ++ ;; For effect, intern some symbols ++ (read-from-string "(THIS IS A TEST)") ++ (export (intern "THIS")) ++ (loop for x being each present-symbol of *package* ++ do (print x))) ++ |> A ++ |> TEST ++ |> THIS ++ |> IS ++ => NIL ++ ++ ++File: gcl.info, Node: Local Variable Initializations, Next: Examples of WITH clause, Prev: Examples of for-as-package subclause, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.15 Local Variable Initializations ++....................................... ++ ++When a loop form is executed, the local variables are bound and are ++initialized to some value. These local variables exist until loop ++iteration terminates, at which point they cease to exist. Implicit ++variables are also established by iteration control clauses and the into ++preposition of accumulation clauses. ++ ++ The with construct initializes variables that are local to a loop. ++The variables are initialized one time only. If the optional type-spec ++argument is supplied for the variable var, but there is no related ++expression to be evaluated, var is initialized to an appropriate default ++value for its type. For example, for the types t, number, and float, ++the default values are nil, 0, and 0.0 respectively. The consequences ++are undefined if a type-spec argument is supplied for var if the related ++expression returns a value that is not of the supplied type. By ++default, the with construct initializes variables sequentially; that is, ++one variable is assigned a value before the next expression is ++evaluated. However, by using the loop keyword and to join several with ++clauses, initializations can be forced to occur in parallel; that is, ++all of the supplied forms are evaluated, and the results are bound to ++the respective variables simultaneously. ++ ++ Sequential binding is used when it is desireable for the ++initialization of some variables to depend on the values of previously ++bound variables. For example, suppose the variables a, b, and c are to ++be bound in sequence: ++ ++ (loop with a = 1 ++ with b = (+ a 2) ++ with c = (+ b 3) ++ return (list a b c)) ++ => (1 3 6) ++ ++ The execution of the above loop is equivalent to the execution of the ++following code: ++ ++ (block nil ++ (let* ((a 1) ++ (b (+ a 2)) ++ (c (+ b 3))) ++ (tagbody ++ (next-loop (return (list a b c)) ++ (go next-loop) ++ end-loop)))) ++ ++ If the values of previously bound variables are not needed for the ++initialization of other local variables, an and clause can be used to ++specify that the bindings are to occur in parallel: ++ ++ (loop with a = 1 ++ and b = 2 ++ and c = 3 ++ return (list a b c)) ++ => (1 2 3) ++ ++ The execution of the above loop is equivalent to the execution of the ++following code: ++ ++ (block nil ++ (let ((a 1) ++ (b 2) ++ (c 3)) ++ (tagbody ++ (next-loop (return (list a b c)) ++ (go next-loop) ++ end-loop)))) ++ ++ ++File: gcl.info, Node: Examples of WITH clause, Prev: Local Variable Initializations, Up: Variable Initialization and Stepping Clauses ++ ++6.1.2.16 Examples of WITH clause ++................................ ++ ++ ;; These bindings occur in sequence. ++ (loop with a = 1 ++ with b = (+ a 2) ++ with c = (+ b 3) ++ return (list a b c)) ++ => (1 3 6) ++ ++ ;; These bindings occur in parallel. ++ (setq a 5 b 10) ++ => 10 ++ (loop with a = 1 ++ and b = (+ a 2) ++ and c = (+ b 3) ++ return (list a b c)) ++ => (1 7 13) ++ ++ ;; This example shows a shorthand way to declare local variables ++ ;; that are of different types. ++ (loop with (a b c) of-type (float integer float) ++ return (format nil "~A ~A ~A" a b c)) ++ => "0.0 0 0.0" ++ ++ ;; This example shows a shorthand way to declare local variables ++ ;; that are the same type. ++ (loop with (a b c) of-type float ++ return (format nil "~A ~A ~A" a b c)) ++ => "0.0 0.0 0.0" ++ ++ ++File: gcl.info, Node: Value Accumulation Clauses, Next: Termination Test Clauses, Prev: Variable Initialization and Stepping Clauses, Up: The LOOP Facility ++ ++6.1.3 Value Accumulation Clauses ++-------------------------------- ++ ++The constructs collect, collecting, append, appending, nconc, nconcing, ++count, counting, maximize, maximizing, minimize, minimizing, sum, and ++summing, allow values to be accumulated in a loop. ++ ++ The constructs collect, collecting, append, appending, nconc, and ++nconcing, designate clauses that accumulate values in lists and return ++them. The constructs count, counting, maximize, maximizing, minimize, ++minimizing, sum, and summing designate clauses that accumulate and ++return numerical values. ++ ++ During each iteration, the constructs collect and collecting collect ++the value of the supplied form into a list. When iteration terminates, ++the list is returned. The argument var is set to the list of collected ++values; if var is supplied, the loop does not return the final list ++automatically. If var is not supplied, it is equivalent to supplying an ++internal name for var and returning its value in a finally clause. The ++var argument is bound as if by the construct with. No mechanism is ++provided for declaring the type of var; it must be of type list. ++ ++ The constructs append, appending, nconc, and nconcing are similar to ++collect except that the values of the supplied form must be lists. ++ ++* ++ The append keyword causes its list values to be concatenated into a ++ single list, as if they were arguments to the function append. ++ ++* ++ The nconc keyword causes its list values to be concatenated into a ++ single list, as if they were arguments to the function nconc. ++ ++ The argument var is set to the list of concatenated values; if var is ++supplied, loop does not return the final list automatically. The var ++argument is bound as if by the construct with. A type cannot be ++supplied for var; it must be of type list. The construct nconc ++destructively modifies its argument lists. ++ ++ The count construct counts the number of times that the supplied form ++returns true. The argument var accumulates the number of occurrences; ++if var is supplied, loop does not return the final count automatically. ++The var argument is bound as if by the construct with to a zero of the ++appropriate type. Subsequent values (including any necessary coercions) ++are computed as if by the function 1+. If into var is used, a type can ++be supplied for var with the type-spec argument; the consequences are ++unspecified if a nonnumeric type is supplied. If there is no into ++variable, the optional type-spec argument applies to the internal ++variable that is keeping the count. The default type is ++implementation-dependent; but it must be a supertype of type fixnum. ++ ++ The maximize and minimize constructs compare the value of the ++supplied form obtained during the first iteration with values obtained ++in successive iterations. The maximum (for maximize) or minimum (for ++minimize) value encountered is determined (as if by the function max for ++maximize and as if by the function min for minimize) and returned. If ++the maximize or minimize clause is never executed, the accumulated value ++is unspecified. The argument var accumulates the maximum or minimum ++value; if var is supplied, loop does not return the maximum or minimum ++automatically. The var argument is bound as if by the construct with. ++If into var is used, a type can be supplied for var with the type-spec ++argument; the consequences are unspecified if a nonnumeric type is ++supplied. If there is no into variable, the optional type-spec argument ++applies to the internal variable that is keeping the maximum or minimum ++value. The default type is implementation-dependent; but it must be a ++supertype of type real. ++ ++ The sum construct forms a cumulative sum of the successive primary ++values of the supplied form at each iteration. The argument var is used ++to accumulate the sum; if var is supplied, loop does not return the ++final sum automatically. The var argument is bound as if by the ++construct with to a zero of the appropriate type. Subsequent values ++(including any necessary coercions) are computed as if by the function +++. If into var is used, a type can be supplied for var with the ++type-spec argument; the consequences are unspecified if a nonnumeric ++type is supplied. If there is no into variable, the optional type-spec ++argument applies to the internal variable that is keeping the sum. The ++default type is implementation-dependent; but it must be a supertype of ++type number. ++ ++ If into is used, the construct does not provide a default return ++value; however, the variable is available for use in any finally clause. ++ ++ Certain kinds of accumulation clauses can be combined in a loop if ++their destination is the same (the result of loop or an into var) ++because they are considered to accumulate conceptually compatible ++quantities. In particular, any elements of following sets of ++accumulation clauses can be mixed with other elements of the same set ++for the same destination in a loop form: ++ ++* ++ collect, append, nconc ++ ++* ++ sum, count ++ ++* ++ maximize, minimize ++ ++ ;; Collect every name and the kids in one list by using ++ ;; COLLECT and APPEND. ++ (loop for name in '(fred sue alice joe june) ++ for kids in '((bob ken) () () (kris sunshine) ()) ++ collect name ++ append kids) ++ => (FRED BOB KEN SUE ALICE JOE KRIS SUNSHINE JUNE) ++ ++ Any two clauses that do not accumulate the same type of object can ++coexist in a loop only if each clause accumulates its values into a ++different variable. ++ ++* Menu: ++ ++* Examples of COLLECT clause:: ++* Examples of APPEND and NCONC clauses:: ++* Examples of COUNT clause:: ++* Examples of MAXIMIZE and MINIMIZE clauses:: ++* Examples of SUM clause:: ++ ++ ++File: gcl.info, Node: Examples of COLLECT clause, Next: Examples of APPEND and NCONC clauses, Prev: Value Accumulation Clauses, Up: Value Accumulation Clauses ++ ++6.1.3.1 Examples of COLLECT clause ++.................................. ++ ++ ;; Collect all the symbols in a list. ++ (loop for i in '(bird 3 4 turtle (1 . 4) horse cat) ++ when (symbolp i) collect i) ++ => (BIRD TURTLE HORSE CAT) ++ ++ ;; Collect and return odd numbers. ++ (loop for i from 1 to 10 ++ if (oddp i) collect i) ++ => (1 3 5 7 9) ++ ++ ;; Collect items into local variable, but don't return them. ++ (loop for i in '(a b c d) by #'cddr ++ collect i into my-list ++ finally (print my-list)) ++ |> (A C) ++ => NIL ++ ++ ++File: gcl.info, Node: Examples of APPEND and NCONC clauses, Next: Examples of COUNT clause, Prev: Examples of COLLECT clause, Up: Value Accumulation Clauses ++ ++6.1.3.2 Examples of APPEND and NCONC clauses ++............................................ ++ ++ ;; Use APPEND to concatenate some sublists. ++ (loop for x in '((a) (b) ((c))) ++ append x) ++ => (A B (C)) ++ ++ ;; NCONC some sublists together. Note that only lists made by the ++ ;; call to LIST are modified. ++ (loop for i upfrom 0 ++ as x in '(a b (c)) ++ nconc (if (evenp i) (list x) nil)) ++ => (A (C)) ++ ++ ++File: gcl.info, Node: Examples of COUNT clause, Next: Examples of MAXIMIZE and MINIMIZE clauses, Prev: Examples of APPEND and NCONC clauses, Up: Value Accumulation Clauses ++ ++6.1.3.3 Examples of COUNT clause ++................................ ++ ++ (loop for i in '(a b nil c nil d e) ++ count i) ++ => 5 ++ ++ ++File: gcl.info, Node: Examples of MAXIMIZE and MINIMIZE clauses, Next: Examples of SUM clause, Prev: Examples of COUNT clause, Up: Value Accumulation Clauses ++ ++6.1.3.4 Examples of MAXIMIZE and MINIMIZE clauses ++................................................. ++ ++ (loop for i in '(2 1 5 3 4) ++ maximize i) ++ => 5 ++ (loop for i in '(2 1 5 3 4) ++ minimize i) ++ => 1 ++ ++ ;; In this example, FIXNUM applies to the internal variable that holds ++ ;; the maximum value. ++ (setq series '(1.2 4.3 5.7)) ++ => (1.2 4.3 5.7) ++ (loop for v in series ++ maximize (round v) of-type fixnum) ++ => 6 ++ ++ ;; In this example, FIXNUM applies to the variable RESULT. ++ (loop for v of-type float in series ++ minimize (round v) into result of-type fixnum ++ finally (return result)) ++ => 1 ++ ++ ++File: gcl.info, Node: Examples of SUM clause, Prev: Examples of MAXIMIZE and MINIMIZE clauses, Up: Value Accumulation Clauses ++ ++6.1.3.5 Examples of SUM clause ++.............................. ++ ++ (loop for i of-type fixnum in '(1 2 3 4 5) ++ sum i) ++ => 15 ++ (setq series '(1.2 4.3 5.7)) ++ => (1.2 4.3 5.7) ++ (loop for v in series ++ sum (* 2.0 v)) ++ => 22.4 ++ ++ ++File: gcl.info, Node: Termination Test Clauses, Next: Unconditional Execution Clauses, Prev: Value Accumulation Clauses, Up: The LOOP Facility ++ ++6.1.4 Termination Test Clauses ++------------------------------ ++ ++The repeat construct causes iteration to terminate after a specified ++number of times. The loop body executes n times, where n is the value ++of the expression form. The form argument is evaluated one time in the ++loop prologue. If the expression evaluates to 0 or to a negative ++number, the loop body is not evaluated. ++ ++ The constructs always, never, thereis, while, until, and the macro ++loop-finish allow conditional termination of iteration within a loop. ++ ++ The constructs always, never, and thereis provide specific values to ++be returned when a loop terminates. Using always, never, or thereis in ++a loop with value accumulation clauses that are not into causes an error ++of type program-error to be signaled (at macro expansion time). Since ++always, never, and thereis use ++ ++ the return-from special operator ++ ++ to terminate iteration, any finally clause that is supplied is not ++evaluated when exit occurs due to any of these constructs. In all other ++respects these constructs behave like the while and until constructs. ++ ++ The always construct takes one form and terminates the loop if the ++form ever evaluates to nil; in this case, it returns nil. Otherwise, it ++provides a default return value of t. If the value of the supplied form ++is never nil, some other construct can terminate the iteration. ++ ++ The never construct terminates iteration the first time that the ++value of the supplied form is non-nil; the loop returns nil. If the ++value of the supplied form is always nil, some other construct can ++terminate the iteration. Unless some other clause contributes a return ++value, the default value returned is t. ++ ++ The thereis construct terminates iteration the first time that the ++value of the supplied form is non-nil; the loop returns the value of the ++supplied form. If the value of the supplied form is always nil, some ++other construct can terminate the iteration. Unless some other clause ++contributes a return value, the default value returned is nil. ++ ++ There are two differences between the thereis and until constructs: ++ ++* ++ The until construct does not return a value or nil based on the ++ value of the supplied form. ++ ++* ++ The until construct executes any finally clause. Since thereis ++ uses ++ ++ the return-from special operator ++ ++ to terminate iteration, any finally clause that is supplied is not ++ evaluated when exit occurs due to thereis. ++ ++ The while construct allows iteration to continue until the supplied ++form evaluates to false. The supplied form is reevaluated at the ++location of the while clause. ++ ++ The until construct is equivalent to while (not form)\dots. If the ++value of the supplied form is non-nil, iteration terminates. ++ ++ Termination-test control constructs can be used anywhere within the ++loop body. The termination tests are used in the order in which they ++appear. If an until or while clause causes termination, any clauses ++that precede it in the source are still evaluated. If the until and ++while constructs cause termination, control is passed to the loop ++epilogue, where any finally clauses will be executed. ++ ++ There are two differences between the never and until constructs: ++ ++* ++ The until construct does not return t or nil based on the value of ++ the supplied form. ++ ++* ++ The until construct does not bypass any finally clauses. Since ++ never uses ++ ++ the return-from special operator ++ ++ to terminate iteration, any finally clause that is supplied is not ++ evaluated when exit occurs due to never. ++ ++ In most cases it is not necessary to use loop-finish because other ++loop control clauses terminate the loop. The macro loop-finish is used ++to provide a normal exit from a nested conditional inside a loop. Since ++loop-finish transfers control to the loop epilogue, using loop-finish ++within a finally expression can cause infinite looping. ++ ++* Menu: ++ ++* Examples of REPEAT clause:: ++* Examples of ALWAYS:: ++* Examples of WHILE and UNTIL clauses:: ++ ++ ++File: gcl.info, Node: Examples of REPEAT clause, Next: Examples of ALWAYS, Prev: Termination Test Clauses, Up: Termination Test Clauses ++ ++6.1.4.1 Examples of REPEAT clause ++................................. ++ ++ (loop repeat 3 ++ do (format t "~&What I say three times is true.~ ++ |> What I say three times is true. ++ |> What I say three times is true. ++ |> What I say three times is true. ++ => NIL ++ (loop repeat -15 ++ do (format t "What you see is what you expect~ ++ => NIL ++ ++ ++File: gcl.info, Node: Examples of ALWAYS, Next: Examples of WHILE and UNTIL clauses, Prev: Examples of REPEAT clause, Up: Termination Test Clauses ++ ++6.1.4.2 Examples of ALWAYS, NEVER, and THEREIS clauses ++...................................................... ++ ++ ;; Make sure I is always less than 11 (two ways). ++ ;; The FOR construct terminates these loops. ++ (loop for i from 0 to 10 ++ always (< i 11)) ++ => T ++ (loop for i from 0 to 10 ++ never (> i 11)) ++ => T ++ ++ ;; If I exceeds 10 return I; otherwise, return NIL. ++ ;; The THEREIS construct terminates this loop. ++ (loop for i from 0 ++ thereis (when (> i 10) i) ) ++ => 11 ++ ++ ;;; The FINALLY clause is not evaluated in these examples. ++ (loop for i from 0 to 10 ++ always (< i 9) ++ finally (print "you won't see this")) ++ => NIL ++ (loop never t ++ finally (print "you won't see this")) ++ => NIL ++ (loop thereis "Here is my value" ++ finally (print "you won't see this")) ++ => "Here is my value" ++ ++ ;; The FOR construct terminates this loop, so the FINALLY clause ++ ;; is evaluated. ++ (loop for i from 1 to 10 ++ thereis (> i 11) ++ finally (prin1 'got-here)) ++ |> GOT-HERE ++ => NIL ++ ++ ;; If this code could be used to find a counterexample to Fermat's ++ ;; last theorem, it would still not return the value of the ++ ;; counterexample because all of the THEREIS clauses in this example ++ ;; only return T. But if Fermat is right, that won't matter ++ ;; because this won't terminate. ++ ++ (loop for z upfrom 2 ++ thereis ++ (loop for n upfrom 3 below (log z 2) ++ thereis ++ (loop for x below z ++ thereis ++ (loop for y below z ++ thereis (= (+ (expt x n) (expt y n)) ++ (expt z n)))))) ++ ++ ++File: gcl.info, Node: Examples of WHILE and UNTIL clauses, Prev: Examples of ALWAYS, Up: Termination Test Clauses ++ ++6.1.4.3 Examples of WHILE and UNTIL clauses ++........................................... ++ ++ (loop while (hungry-p) do (eat)) ++ ++ ;; UNTIL NOT is equivalent to WHILE. ++ (loop until (not (hungry-p)) do (eat)) ++ ++ ;; Collect the length and the items of STACK. ++ (let ((stack '(a b c d e f))) ++ (loop for item = (length stack) then (pop stack) ++ collect item ++ while stack)) ++ => (6 A B C D E F) ++ ++ ;; Use WHILE to terminate a loop that otherwise wouldn't terminate. ++ ;; Note that WHILE occurs after the WHEN. ++ (loop for i fixnum from 3 ++ when (oddp i) collect i ++ while (< i 5)) ++ => (3 5) ++ ++ ++File: gcl.info, Node: Unconditional Execution Clauses, Next: Conditional Execution Clauses, Prev: Termination Test Clauses, Up: The LOOP Facility ++ ++6.1.5 Unconditional Execution Clauses ++------------------------------------- ++ ++The do and doing constructs evaluate the supplied forms wherever they ++occur in the expanded form of loop. The form argument can be any ++compound form. Each form is evaluated in every iteration. Because ++every loop clause must begin with a loop keyword, the keyword do is used ++when no control action other than execution is required. ++ ++ The return construct takes one form. Any values returned by the form ++are immediately returned by the loop form. It is equivalent to the ++clause do (return-from block-name value), where block-name is the name ++specified in a named clause, or nil if there is no named clause. ++ ++* Menu: ++ ++* Examples of unconditional execution:: ++ ++ ++File: gcl.info, Node: Examples of unconditional execution, Prev: Unconditional Execution Clauses, Up: Unconditional Execution Clauses ++ ++6.1.5.1 Examples of unconditional execution ++........................................... ++ ++ ;; Print numbers and their squares. ++ ;; The DO construct applies to multiple forms. ++ (loop for i from 1 to 3 ++ do (print i) ++ (print (* i i))) ++ |> 1 ++ |> 1 ++ |> 2 ++ |> 4 ++ |> 3 ++ |> 9 ++ => NIL ++ ++ ++ ++File: gcl.info, Node: Conditional Execution Clauses, Next: Miscellaneous Clauses, Prev: Unconditional Execution Clauses, Up: The LOOP Facility ++ ++6.1.6 Conditional Execution Clauses ++----------------------------------- ++ ++The if, when, and unless constructs establish conditional control in a ++loop. If the test passes, the succeeding loop clause is executed. If ++the test does not pass, the succeeding clause is skipped, and program ++control moves to the clause that follows the loop keyword else. If the ++test does not pass and no else clause is supplied, control is ++transferred to the clause or construct following the entire conditional ++clause. ++ ++ If conditional clauses are nested, each else is paired with the ++closest preceding conditional clause that has no associated else or end. ++ ++ In the if and when clauses, which are synonymous, the test passes if ++the value of form is true. ++ ++ In the unless clause, the test passes if the value of form is false. ++ ++ Clauses that follow the test expression can be grouped by using the ++loop keyword and to produce a conditional block consisting of a compound ++clause. ++ ++ The loop keyword it can be used to refer to the result of the test ++expression in a clause. Use the loop keyword it in place of the form in ++a return clause or an accumulation clause that is inside a conditional ++execution clause. If multiple clauses are connected with and, the it ++construct must be in the first clause in the block. ++ ++ The optional loop keyword end marks the end of the clause. If this ++keyword is not supplied, the next loop keyword marks the end. The ++construct end can be used to distinguish the scoping of compound ++clauses. ++ ++* Menu: ++ ++* Examples of WHEN clause:: ++ ++ ++File: gcl.info, Node: Examples of WHEN clause, Prev: Conditional Execution Clauses, Up: Conditional Execution Clauses ++ ++6.1.6.1 Examples of WHEN clause ++............................... ++ ++ ;; Signal an exceptional condition. ++ (loop for item in '(1 2 3 a 4 5) ++ when (not (numberp item)) ++ return (cerror "enter new value" "non-numeric value: ~s" item)) ++ Error: non-numeric value: A ++ ++ ;; The previous example is equivalent to the following one. ++ (loop for item in '(1 2 3 a 4 5) ++ when (not (numberp item)) ++ do (return ++ (cerror "Enter new value" "non-numeric value: ~s" item))) ++ Error: non-numeric value: A ++ ++ ;; This example parses a simple printed string representation from ++ ;; BUFFER (which is itself a string) and returns the index of the ++ ;; closing double-quote character. ++ (let ((buffer "\"a\" \"b\"")) ++ (loop initially (unless (char= (char buffer 0) #\") ++ (loop-finish)) ++ for i of-type fixnum from 1 below (length (the string buffer)) ++ when (char= (char buffer i) #\") ++ return i)) ++ => 2 ++ ++ ;; The collected value is returned. ++ (loop for i from 1 to 10 ++ when (> i 5) ++ collect i ++ finally (prin1 'got-here)) ++ |> GOT-HERE ++ => (6 7 8 9 10) ++ ++ ;; Return both the count of collected numbers and the numbers. ++ (loop for i from 1 to 10 ++ when (> i 5) ++ collect i into number-list ++ and count i into number-count ++ finally (return (values number-count number-list))) ++ => 5, (6 7 8 9 10) ++ ++ ++File: gcl.info, Node: Miscellaneous Clauses, Next: Examples of Miscellaneous Loop Features, Prev: Conditional Execution Clauses, Up: The LOOP Facility ++ ++6.1.7 Miscellaneous Clauses ++--------------------------- ++ ++* Menu: ++ ++* Control Transfer Clauses:: ++* Examples of NAMED clause:: ++* Initial and Final Execution:: ++ ++ ++File: gcl.info, Node: Control Transfer Clauses, Next: Examples of NAMED clause, Prev: Miscellaneous Clauses, Up: Miscellaneous Clauses ++ ++6.1.7.1 Control Transfer Clauses ++................................ ++ ++The named construct establishes a name for an implicit block surrounding ++the ++ ++ entire ++ ++ loop so that the return-from special operator can be used to return ++values from or to exit loop. Only one name per loop form can be ++assigned. If used, the named construct must be the first clause in the ++loop expression. ++ ++ The return construct takes one form. Any values returned by the form ++are immediately returned by the loop form. ++ ++ This construct is similar to the return-from special operator and the ++return macro. The return construct ++ ++ does not execute any finally clause that ++ ++ the loop form ++ ++ is given. ++ ++ ++File: gcl.info, Node: Examples of NAMED clause, Next: Initial and Final Execution, Prev: Control Transfer Clauses, Up: Miscellaneous Clauses ++ ++6.1.7.2 Examples of NAMED clause ++................................ ++ ++ ;; Just name and return. ++ (loop named max ++ for i from 1 to 10 ++ do (print i) ++ do (return-from max 'done)) ++ |> 1 ++ => DONE ++ ++ ++File: gcl.info, Node: Initial and Final Execution, Prev: Examples of NAMED clause, Up: Miscellaneous Clauses ++ ++6.1.7.3 Initial and Final Execution ++................................... ++ ++The initially and finally constructs evaluate forms that occur before ++and after the loop body. ++ ++ The initially construct causes the supplied compound-forms to be ++evaluated in the loop prologue, which precedes all loop code except for ++initial settings supplied by constructs with, for, or as. The code for ++any initially clauses is executed in the order in which the clauses ++appeared in the loop. ++ ++ The finally construct causes the supplied compound-forms to be ++evaluated in the loop epilogue after normal iteration terminates. The ++code for any finally clauses is executed in the order in which the ++clauses appeared in the loop. The collected code is executed once in ++the loop epilogue before any implicit values are returned from the ++accumulation clauses. An explicit transfer of control (e.g., by return, ++go, or throw) from the loop body, however, will exit the loop without ++executing the epilogue code. ++ ++ Clauses such as return, always, never, and thereis can bypass the ++finally clause. ++ ++ return (or return-from, if the named option was supplied) ++ ++ can be used after finally to return values from a loop. ++ ++ Such an explicit return ++ ++ inside the finally clause takes precedence over returning the ++accumulation from clauses supplied by such keywords as collect, nconc, ++append, sum, count, maximize, and minimize; the accumulation values for ++these preempted clauses are not returned by loop if return or ++return-from is used. ++ ++ ++File: gcl.info, Node: Examples of Miscellaneous Loop Features, Next: Notes about Loop, Prev: Miscellaneous Clauses, Up: The LOOP Facility ++ ++6.1.8 Examples of Miscellaneous Loop Features ++--------------------------------------------- ++ ++ (let ((i 0)) ; no loop keywords are used ++ (loop (incf i) (if (= i 3) (return i)))) => 3 ++ (let ((i 0)(j 0)) ++ (tagbody ++ (loop (incf j 3) (incf i) (if (= i 3) (go exit))) ++ exit) ++ j) => 9 ++ ++ In the following example, the variable x is stepped before y is ++stepped; thus, the value of y reflects the updated value of x: ++ ++ (loop for x from 1 to 10 ++ for y = nil then x ++ collect (list x y)) ++ => ((1 NIL) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10)) ++ ++ In this example, x and y are stepped in parallel: ++ ++ (loop for x from 1 to 10 ++ and y = nil then x ++ collect (list x y)) ++ => ((1 NIL) (2 1) (3 2) (4 3) (5 4) (6 5) (7 6) (8 7) (9 8) (10 9)) ++ ++* Menu: ++ ++* Examples of clause grouping:: ++ ++ ++File: gcl.info, Node: Examples of clause grouping, Prev: Examples of Miscellaneous Loop Features, Up: Examples of Miscellaneous Loop Features ++ ++6.1.8.1 Examples of clause grouping ++................................... ++ ++ ;; Group conditional clauses. ++ (loop for i in '(1 324 2345 323 2 4 235 252) ++ when (oddp i) ++ do (print i) ++ and collect i into odd-numbers ++ and do (terpri) ++ else ; I is even. ++ collect i into even-numbers ++ finally ++ (return (values odd-numbers even-numbers))) ++ |> 1 ++ |> ++ |> 2345 ++ |> ++ |> 323 ++ |> ++ |> 235 ++ => (1 2345 323 235), (324 2 4 252) ++ ++ ;; Collect numbers larger than 3. ++ (loop for i in '(1 2 3 4 5 6) ++ when (and (> i 3) i) ++ collect it) ; IT refers to (and (> i 3) i). ++ => (4 5 6) ++ ++ ;; Find a number in a list. ++ (loop for i in '(1 2 3 4 5 6) ++ when (and (> i 3) i) ++ return it) ++ => 4 ++ ++ ;; The above example is similar to the following one. ++ (loop for i in '(1 2 3 4 5 6) ++ thereis (and (> i 3) i)) ++ => 4 ++ ++ ;; Nest conditional clauses. ++ (let ((list '(0 3.0 apple 4 5 9.8 orange banana))) ++ (loop for i in list ++ when (numberp i) ++ when (floatp i) ++ collect i into float-numbers ++ else ; Not (floatp i) ++ collect i into other-numbers ++ else ; Not (numberp i) ++ when (symbolp i) ++ collect i into symbol-list ++ else ; Not (symbolp i) ++ do (error "found a funny value in list ~S, value ~S~ ++ finally (return (values float-numbers other-numbers symbol-list)))) ++ => (3.0 9.8), (0 4 5), (APPLE ORANGE BANANA) ++ ++ ;; Without the END preposition, the last AND would apply to the ++ ;; inner IF rather than the outer one. ++ (loop for x from 0 to 3 ++ do (print x) ++ if (zerop (mod x 2)) ++ do (princ " a") ++ and if (zerop (floor x 2)) ++ do (princ " b") ++ end ++ and do (princ " c")) ++ |> 0 a b c ++ |> 1 ++ |> 2 a c ++ |> 3 ++ => NIL ++ ++ ++File: gcl.info, Node: Notes about Loop, Prev: Examples of Miscellaneous Loop Features, Up: The LOOP Facility ++ ++6.1.9 Notes about Loop ++---------------------- ++ ++Types can be supplied for loop variables. It is not necessary to supply ++a type for any variable, but supplying the type can ensure that the ++variable has a correctly typed initial value, and it can also enable ++compiler optimizations (depending on the implementation). ++ ++ The clause repeat n ... is roughly equivalent to a clause such as ++ ++ (loop for internal-variable downfrom (- n 1) to 0 ...) ++ ++ but in some implementations, the repeat construct might be more ++efficient. ++ ++ Within the executable parts of the loop clauses and around the entire ++loop form, variables can be bound by using let. ++ ++ Use caution when using a variable named IT (in any package) in ++connection with loop, since it is a loop keyword that can be used in ++place of a form in certain contexts. ++ ++ There is ++ ++ no ++ ++ standardized mechanism for users to add extensions to loop. ++ ++ ++File: gcl.info, Node: Iteration Dictionary, Prev: The LOOP Facility, Up: Iteration ++ ++6.2 Iteration Dictionary ++======================== ++ ++* Menu: ++ ++* do:: ++* dotimes:: ++* dolist:: ++* loop:: ++* loop-finish:: ++ ++ ++File: gcl.info, Node: do, Next: dotimes, Prev: Iteration Dictionary, Up: Iteration Dictionary ++ ++6.2.1 do, do* [Macro] ++--------------------- ++ ++'do' ({var | (var [init-form [step-form]])}*) (end-test-form ++{result-form}*) {declaration}* {tag | statement}* ++=> {result}* ++ ++ 'do*' ({var | (var [init-form [step-form]])}*) (end-test-form ++{result-form}*) {declaration}* {tag | statement}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol. ++ ++ init-form--a form. ++ ++ step-form--a form. ++ ++ end-test-form--a form. ++ ++ result-forms--an implicit progn. ++ ++ declaration--a declare expression; not evaluated. ++ ++ tag--a go tag; not evaluated. ++ ++ statement--a compound form; evaluated as described below. ++ ++ results--if a return or return-from form is executed, the values ++passed from that form; otherwise, the values returned by the ++result-forms. ++ ++Description:: ++............. ++ ++do iterates over a group of statements while a test condition holds. do ++accepts an arbitrary number of iteration vars which are bound within the ++iteration and stepped in parallel. An initial value may be supplied for ++each iteration variable by use of an init-form. Step-forms may be used ++to specify how the vars should be updated on succeeding iterations ++through the loop. Step-forms may be used both to generate successive ++values or to accumulate results. If the end-test-form condition is met ++prior to an execution of the body, the iteration terminates. Tags label ++statements. ++ ++ do* is exactly like do except that the bindings and steppings of the ++vars are performed sequentially rather than in parallel. ++ ++ Before the first iteration, all the init-forms are evaluated, and ++each var is bound to the value of its respective init-form, if supplied. ++This is a binding, not an assignment; when the loop terminates, the old ++values of those variables will be restored. For do, all of the ++init-forms are evaluated before any var is bound. The init-forms can ++refer to the bindings of the vars visible before beginning execution of ++do. For do*, the first init-form is evaluated, then the first var is ++bound to that value, then the second init-form is evaluated, then the ++second var is bound, and so on; in general, the kth init-form can refer ++to the new binding of the jth var if j < k, and otherwise to the old ++binding of the jth var. ++ ++ At the beginning of each iteration, after processing the variables, ++the end-test-form is evaluated. If the result is false, execution ++proceeds with the body of the do (or do*) form. If the result is true, ++the result-forms are evaluated in order as an implicit progn, and then ++do or do* returns. ++ ++ At the beginning of each iteration other than the first, vars are ++updated as follows. All the step-forms, if supplied, are evaluated, ++from left to right, and the resulting values are assigned to the ++respective vars. Any var that has no associated step-form is not ++assigned to. For do, all the step-forms are evaluated before any var is ++updated; the assignment of values to vars is done in parallel, as if by ++psetq. Because all of the step-forms are evaluated before any of the ++vars are altered, a step-form when evaluated always has access to the ++old values of all the vars, even if other step-forms precede it. For ++do*, the first step-form is evaluated, then the value is assigned to the ++first var, then the second step-form is evaluated, then the value is ++assigned to the second var, and so on; the assignment of values to ++variables is done sequentially, as if by setq. For either do or do*, ++after the vars have been updated, the end-test-form is evaluated as ++described above, and the iteration continues. ++ ++ The remainder of the do (or do*) form constitutes an implicit ++tagbody. Tags may appear within the body of a do loop for use by go ++statements appearing in the body (but such go statements may not appear ++in the variable specifiers, the end-test-form, or the result-forms). ++When the end of a do body is reached, the next iteration cycle ++(beginning with the evaluation of step-forms) occurs. ++ ++ An implicit block named nil surrounds the entire do (or do*) form. A ++return statement may be used at any point to exit the loop immediately. ++ ++ Init-form is an initial value for the var with which it is ++associated. If init-form is omitted, the initial value of var is nil. ++If a declaration is supplied for a var, init-form must be consistent ++with the declaration. ++ ++ Declarations can appear at the beginning of a do (or do*) body. They ++apply to code in the do (or do*) body, to the bindings of the do (or ++do*) vars, to the step-forms, to the end-test-form, and to the ++result-forms. ++ ++Examples:: ++.......... ++ ++ (do ((temp-one 1 (1+ temp-one)) ++ (temp-two 0 (1- temp-two))) ++ ((> (- temp-one temp-two) 5) temp-one)) => 4 ++ ++ (do ((temp-one 1 (1+ temp-one)) ++ (temp-two 0 (1+ temp-one))) ++ ((= 3 temp-two) temp-one)) => 3 ++ ++ (do* ((temp-one 1 (1+ temp-one)) ++ (temp-two 0 (1+ temp-one))) ++ ((= 3 temp-two) temp-one)) => 2 ++ ++ (do ((j 0 (+ j 1))) ++ (nil) ;Do forever. ++ (format t "~ ++ (let ((item (read))) ++ (if (null item) (return) ;Process items until NIL seen. ++ (format t "~&Output ~D: ~S" j item)))) ++ |> Input 0: |>>banana<<| ++ |> Output 0: BANANA ++ |> Input 1: |>>(57 boxes)<<| ++ |> Output 1: (57 BOXES) ++ |> Input 2: |>>NIL<<| ++ => NIL ++ ++ (setq a-vector (vector 1 nil 3 nil)) ++ (do ((i 0 (+ i 1)) ;Sets every null element of a-vector to zero. ++ (n (array-dimension a-vector 0))) ++ ((= i n)) ++ (when (null (aref a-vector i)) ++ (setf (aref a-vector i) 0))) => NIL ++ a-vector => #(1 0 3 0) ++ ++ (do ((x e (cdr x)) ++ (oldx x x)) ++ ((null x)) ++ body) ++ ++ is an example of parallel assignment to index variables. On the ++first iteration, the value of oldx is whatever value x had before the do ++was entered. On succeeding iterations, oldx contains the value that x ++had on the previous iteration. ++ ++ (do ((x foo (cdr x)) ++ (y bar (cdr y)) ++ (z '() (cons (f (car x) (car y)) z))) ++ ((or (null x) (null y)) ++ (nreverse z))) ++ ++ does the same thing as (mapcar #'f foo bar). The step computation ++for z is an example of the fact that variables are stepped in parallel. ++Also, the body of the loop is empty. ++ ++ (defun list-reverse (list) ++ (do ((x list (cdr x)) ++ (y '() (cons (car x) y))) ++ ((endp x) y))) ++ ++ As an example of nested iterations, consider a data structure that is ++a list of conses. The car of each cons is a list of symbols, and the ++cdr of each cons is a list of equal length containing corresponding ++values. Such a data structure is similar to an association list, but is ++divided into "frames"; the overall structure resembles a rib-cage. A ++lookup function on such a data structure might be: ++ ++ (defun ribcage-lookup (sym ribcage) ++ (do ((r ribcage (cdr r))) ++ ((null r) nil) ++ (do ((s (caar r) (cdr s)) ++ (v (cdar r) (cdr v))) ++ ((null s)) ++ (when (eq (car s) sym) ++ (return-from ribcage-lookup (car v)))))) => RIBCAGE-LOOKUP ++ ++See Also:: ++.......... ++ ++other iteration functions ( *note dolist:: , *note dotimes:: , and *note ++loop:: ) and more primitive functionality ( *note tagbody:: , *note go:: ++, *note block:: , *note return:: , ++ ++ *note let:: , and *note setq:: ) ++ ++Notes:: ++....... ++ ++If end-test-form is nil, the test will never succeed. This provides an ++idiom for "do forever": the body of the do or do* is executed ++repeatedly. The infinite loop can be terminated by the use of return, ++return-from, go to an outer level, or throw. ++ ++ A do form may be explained in terms of the more primitive forms ++block, return, let, loop, tagbody, and psetq as follows: ++ ++ (block nil ++ (let ((var1 init1) ++ (var2 init2) ++ ... ++ (varn initn)) ++ declarations ++ (loop (when end-test (return (progn . result))) ++ (tagbody . tagbody) ++ (psetq var1 step1 ++ var2 step2 ++ ... ++ varn stepn)))) ++ ++ do* is similar, except that let* and setq replace the let and psetq, ++respectively. ++ ++ ++File: gcl.info, Node: dotimes, Next: dolist, Prev: do, Up: Iteration Dictionary ++ ++6.2.2 dotimes [Macro] ++--------------------- ++ ++'dotimes' (var count-form [result-form]) {declaration}* {tag | ++statement}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol. ++ ++ count-form--a form. ++ ++ result-form--a form. ++ ++ declaration--a declare expression; not evaluated. ++ ++ tag--a go tag; not evaluated. ++ ++ statement--a compound form; evaluated as described below. ++ ++ results--if a return or return-from form is executed, the values ++passed from that form; otherwise, the values returned by the result-form ++or nil if there is no result-form. ++ ++Description:: ++............. ++ ++dotimes iterates over a series of integers. ++ ++ dotimes evaluates count-form, which should produce an integer. If ++count-form is zero or negative, the body is not executed. dotimes then ++executes the body once for each integer from 0 up to but not including ++the value of count-form, in the order in which the tags and statements ++occur, with var bound to each integer. Then result-form is evaluated. ++At the time result-form is processed, var is bound to the number of ++times the body was executed. Tags label statements. ++ ++ An implicit block named nil surrounds dotimes. return may be used to ++terminate the loop immediately without performing any further ++iterations, returning zero or more values. ++ ++ The body of the loop is an implicit tagbody; it may contain tags to ++serve as the targets of go statements. Declarations may appear before ++the body of the loop. ++ ++ The scope of the binding of var does not include the count-form, but ++the result-form is included. ++ ++ It is implementation-dependent whether dotimes establishes a new ++binding of var on each iteration or whether it establishes a binding for ++var once at the beginning and then assigns it on any subsequent ++iterations. ++ ++Examples:: ++.......... ++ ++ (dotimes (temp-one 10 temp-one)) => 10 ++ (setq temp-two 0) => 0 ++ (dotimes (temp-one 10 t) (incf temp-two)) => T ++ temp-two => 10 ++ ++ Here is an example of the use of dotimes in processing strings: ++ ++ ;;; True if the specified subsequence of the string is a ++ ;;; palindrome (reads the same forwards and backwards). ++ (defun palindromep (string &optional ++ (start 0) ++ (end (length string))) ++ (dotimes (k (floor (- end start) 2) t) ++ (unless (char-equal (char string (+ start k)) ++ (char string (- end k 1))) ++ (return nil)))) ++ (palindromep "Able was I ere I saw Elba") => T ++ (palindromep "A man, a plan, a canal--Panama!") => NIL ++ (remove-if-not #'alpha-char-p ;Remove punctuation. ++ "A man, a plan, a canal--Panama!") ++ => "AmanaplanacanalPanama" ++ (palindromep ++ (remove-if-not #'alpha-char-p ++ "A man, a plan, a canal--Panama!")) => T ++ (palindromep ++ (remove-if-not ++ #'alpha-char-p ++ "Unremarkable was I ere I saw Elba Kramer, nu?")) => T ++ (palindromep ++ (remove-if-not ++ #'alpha-char-p ++ "A man, a plan, a cat, a ham, a yak, ++ a yam, a hat, a canal--Panama!")) => T ++ ++See Also:: ++.......... ++ ++*note do:: , *note dolist:: , *note tagbody:: ++ ++Notes:: ++....... ++ ++go may be used within the body of dotimes to transfer control to a ++statement labeled by a tag. ++ ++ ++File: gcl.info, Node: dolist, Next: loop, Prev: dotimes, Up: Iteration Dictionary ++ ++6.2.3 dolist [Macro] ++-------------------- ++ ++'dolist' (var list-form [result-form]) {declaration}* {tag | statement}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a symbol. ++ ++ list-form--a form. ++ ++ result-form--a form. ++ ++ declaration--a declare expression; not evaluated. ++ ++ tag--a go tag; not evaluated. ++ ++ statement--a compound form; evaluated as described below. ++ ++ results--if a return or return-from form is executed, the values ++passed from that form; otherwise, the values returned by the result-form ++or nil if there is no result-form. ++ ++Description:: ++............. ++ ++dolist iterates over the elements of a list. The body of dolist is like ++a tagbody. It consists of a series of tags and statements. ++ ++ dolist evaluates list-form, which should produce a list. It then ++executes the body once for each element in the list, in the order in ++which the tags and statements occur, with var bound to the element. ++Then result-form is evaluated. tags label statements. ++ ++ At the time result-form is processed, var is bound to nil. ++ ++ An implicit block named nil surrounds dolist. return may be used to ++terminate the loop immediately without performing any further ++iterations, returning zero or more values. ++ ++ The scope of the binding of var does not include the list-form, but ++the result-form is included. ++ ++ It is implementation-dependent whether dolist establishes a new ++binding of var on each iteration or whether it establishes a binding for ++var once at the beginning and then assigns it on any subsequent ++iterations. ++ ++Examples:: ++.......... ++ ++ (setq temp-two '()) => NIL ++ (dolist (temp-one '(1 2 3 4) temp-two) (push temp-one temp-two)) => (4 3 2 1) ++ ++ (setq temp-two 0) => 0 ++ (dolist (temp-one '(1 2 3 4)) (incf temp-two)) => NIL ++ temp-two => 4 ++ ++ (dolist (x '(a b c d)) (prin1 x) (princ " ")) ++ |> A B C D ++ => NIL ++ ++See Also:: ++.......... ++ ++*note do:: , *note dotimes:: , *note tagbody:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++go may be used within the body of dolist to transfer control to a ++statement labeled by a tag. ++ ++ ++File: gcl.info, Node: loop, Next: loop-finish, Prev: dolist, Up: Iteration Dictionary ++ ++6.2.4 loop [Macro] ++------------------ ++ ++The "simple" loop form: ++ ++ 'loop' {compound-form}* => {result}* ++ ++ The "extended" loop form: ++ ++ 'loop' [!name-clause] {!variable-clause}* {!main-clause}* => ++{result}* ++ ++ name-clause ::=named name ++ ++ variable-clause ::=!with-clause | !initial-final | !for-as-clause ++ ++ with-clause ::=with var1 [type-spec] [= form1] {and var2 [type-spec] [= form2]}* ++ ++ main-clause ::=!unconditional | !accumulation | !conditional | !termination-test | !initial-final ++ ++ initial-final ::=initially {compound-form}^+ | finally {compound-form}^+ ++ ++ unconditional ::={do | doing} {compound-form}^+ | return {form | it} ++ ++ accumulation ::=!list-accumulation | !numeric-accumulation ++ ++ list-accumulation ::={collect | collecting | append | appending | nconc | nconcing} {form | it} ++ [into simple-var] ++ ++ numeric-accumulation ::={count | counting | sum | summing | } maximize | maximizing | minimize | minimizing {form | it} ++ [into simple-var] [type-spec] ++ ++ conditional ::={if | when | unless} form !selectable-clause {and !selectable-clause}* ++ [else !selectable-clause {and !selectable-clause}*] ++ [end] ++ ++ selectable-clause ::=!unconditional | !accumulation | !conditional ++ ++ termination-test ::=while form | until form | repeat form | always form | never form | thereis form ++ ++ for-as-clause ::={for | as} !for-as-subclause {and !for-as-subclause}* ++ ++ for-as-subclause ::=!for-as-arithmetic | !for-as-in-list | !for-as-on-list | !for-as-equals-then | ++ !for-as-across | !for-as-hash | !for-as-package ++ ++ for-as-arithmetic ::=var [type-spec] !for-as-arithmetic-subclause ++ ++ for-as-arithmetic-subclause ::=!arithmetic-up | !arithmetic-downto | !arithmetic-downfrom ++ ++ arithmetic-up ::=[[{from | upfrom} form1 | {to | upto | below} form2 | by form3]]^+ ++ ++ arithmetic-downto ::=[[{from form1}^1 | {{downto | above} form2}^1 | by form3]] ++ ++ arithmetic-downfrom ::=[[{downfrom form1}^1 | {to | downto | above} form2 | by form3]] ++ ++ for-as-in-list ::=var [type-spec] in form1 [by step-fun] ++ ++ for-as-on-list ::=var [type-spec] on form1 [by step-fun] ++ ++ for-as-equals-then ::=var [type-spec] = form1 [then form2] ++ ++ for-as-across ::=var [type-spec] across vector ++ ++ for-as-hash ::=var [type-spec] being {each | the} ++ {{hash-key | hash-keys} {in | of} hash-table ++ [using (hash-value other-var)] | ++ {hash-value | hash-values} {in | of} hash-table ++ [using (hash-key other-var)]} ++ ++ for-as-package ::=var [type-spec] being {each | the} ++ {symbol | symbols | ++ present-symbol | present-symbols | ++ external-symbol | external-symbols} ++ [{in | of} package] ++ ++ type-spec ::=!simple-type-spec | !destructured-type-spec ++ ++ simple-type-spec ::=fixnum | float | t | nil ++ ++ destructured-type-spec ::=of-type d-type-spec ++ ++ d-type-spec ::=type-specifier | (d-type-spec . d-type-spec) ++ ++ var ::=!d-var-spec ++ ++ var1 ::=!d-var-spec ++ ++ var2 ::=!d-var-spec ++ ++ other-var ::=!d-var-spec ++ ++ d-var-spec ::=simple-var | nil | (!d-var-spec . !d-var-spec) ++ ++Arguments and Values:: ++...................... ++ ++compound-form--a compound form. ++ ++ name--a symbol. ++ ++ simple-var--a symbol (a variable name). ++ ++ form, form1, form2, form3--a form. ++ ++ step-fun--a form that evaluates to a function of one argument. ++ ++ vector--a form that evaluates to a vector. ++ ++ hash-table--a form that evaluates to a hash table. ++ ++ package--a form that evaluates to a package designator. ++ ++ type-specifier--a type specifier. This might be either an atomic ++type specifier or a compound type specifier, which introduces some ++additional complications to proper parsing in the face of destructuring; ++for further information, see *note Destructuring::. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++For details, see *note The LOOP Facility::. ++ ++Examples:: ++.......... ++ ++ ;; An example of the simple form of LOOP. ++ (defun sqrt-advisor () ++ (loop (format t "~&Number: ") ++ (let ((n (parse-integer (read-line) :junk-allowed t))) ++ (when (not n) (return)) ++ (format t "~&The square root of ~D is ~D.~%" n (sqrt n))))) ++ => SQRT-ADVISOR ++ (sqrt-advisor) ++ |> Number: |>>5 [<-~]<<| ++ |> The square root of 5 is 2.236068. ++ |> Number: |>>4 [<-~]<<| ++ |> The square root of 4 is 2. ++ |> Number: |>>done [<-~]<<| ++ => NIL ++ ++ ;; An example of the extended form of LOOP. ++ (defun square-advisor () ++ (loop as n = (progn (format t "~&Number: ") ++ (parse-integer (read-line) :junk-allowed t)) ++ while n ++ do (format t "~&The square of ~D is ~D.~ ++ => SQUARE-ADVISOR ++ (square-advisor) ++ |> Number: |>>4 [<-~]<<| ++ |> The square of 4 is 16. ++ |> Number: |>>23 [<-~]<<| ++ |> The square of 23 is 529. ++ |> Number: |>>done [<-~]<<| ++ => NIL ++ ++ ;; Another example of the extended form of LOOP. ++ (loop for n from 1 to 10 ++ when (oddp n) ++ collect n) ++ => (1 3 5 7 9) ++ ++See Also:: ++.......... ++ ++*note do:: , *note dolist:: , *note dotimes:: , *note return:: , *note ++go:: , *note throw:: , *note Destructuring:: ++ ++Notes:: ++....... ++ ++Except that loop-finish cannot be used within a simple loop form, a ++simple loop form is related to an extended loop form in the following ++way: ++ ++ (loop {compound-form}*) == (loop do {compound-form}*) ++ ++ ++File: gcl.info, Node: loop-finish, Prev: loop, Up: Iteration Dictionary ++ ++6.2.5 loop-finish [Local Macro] ++------------------------------- ++ ++Syntax:: ++........ ++ ++'loop-finish' => # ++ ++Description:: ++............. ++ ++The loop-finish macro can be used lexically within an extended loop form ++to terminate that form "normally." That is, it transfers control to the ++loop epilogue of the lexically innermost extended loop form. This ++permits execution of any finally clause (for effect) and the return of ++any accumulated result. ++ ++Examples:: ++.......... ++ ++ ;; Terminate the loop, but return the accumulated count. ++ (loop for i in '(1 2 3 stop-here 4 5 6) ++ when (symbolp i) do (loop-finish) ++ count i) ++ => 3 ++ ++ ;; The preceding loop is equivalent to: ++ (loop for i in '(1 2 3 stop-here 4 5 6) ++ until (symbolp i) ++ count i) ++ => 3 ++ ++ ;; While LOOP-FINISH can be used can be used in a variety of ++ ;; situations it is really most needed in a situation where a need ++ ;; to exit is detected at other than the loop's `top level' ++ ;; (where UNTIL or WHEN often work just as well), or where some ++ ;; computation must occur between the point where a need to exit is ++ ;; detected and the point where the exit actually occurs. For example: ++ (defun tokenize-sentence (string) ++ (macrolet ((add-word (wvar svar) ++ `(when ,wvar ++ (push (coerce (nreverse ,wvar) 'string) ,svar) ++ (setq ,wvar nil)))) ++ (loop with word = '() and sentence = '() and endpos = nil ++ for i below (length string) ++ do (let ((char (aref string i))) ++ (case char ++ (#\Space (add-word word sentence)) ++ (#\. (setq endpos (1+ i)) (loop-finish)) ++ (otherwise (push char word)))) ++ finally (add-word word sentence) ++ (return (values (nreverse sentence) endpos))))) ++ => TOKENIZE-SENTENCE ++ ++ (tokenize-sentence "this is a sentence. this is another sentence.") ++ => ("this" "is" "a" "sentence"), 19 ++ ++ (tokenize-sentence "this is a sentence") ++ => ("this" "is" "a" "sentence"), NIL ++ ++ ++Side Effects:: ++.............. ++ ++Transfers control. ++ ++Exceptional Situations:: ++........................ ++ ++Whether or not loop-finish is fbound in the global environment is ++implementation-dependent; however, the restrictions on redefinition and ++shadowing of loop-finish are the same as for symbols in the COMMON-LISP ++package which are fbound in the global environment. The consequences of ++attempting to use loop-finish outside of loop are undefined. ++ ++See Also:: ++.......... ++ ++*note loop:: , *note The LOOP Facility:: ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: Objects, Next: Structures, Prev: Iteration, Up: Top ++ ++7 Objects ++********* ++ ++* Menu: ++ ++* Object Creation and Initialization:: ++* Changing the Class of an Instance:: ++* Reinitializing an Instance:: ++* Meta-Objects:: ++* Slots:: ++* Generic Functions and Methods:: ++* Objects Dictionary:: ++ ++ ++File: gcl.info, Node: Object Creation and Initialization, Next: Changing the Class of an Instance, Prev: Objects, Up: Objects ++ ++7.1 Object Creation and Initialization ++====================================== ++ ++The generic function make-instance creates and returns a new instance of ++a class. The first argument is a class or the name of a class, and the ++remaining arguments form an initialization argument list . ++ ++ The initialization of a new instance consists of several distinct ++steps, including the following: combining the explicitly supplied ++initialization arguments with default values for the unsupplied ++initialization arguments, checking the validity of the initialization ++arguments, allocating storage for the instance, filling slots with ++values, and executing user-supplied methods that perform additional ++initialization. Each step of make-instance is implemented by a generic ++function to provide a mechanism for customizing that step. In addition, ++make-instance is itself a generic function and thus also can be ++customized. ++ ++ The object system specifies system-supplied primary methods for each ++step and thus specifies a well-defined standard behavior for the entire ++initialization process. The standard behavior provides four simple ++mechanisms for controlling initialization: ++ ++* ++ Declaring a symbol to be an initialization argument for a slot. An ++ initialization argument is declared by using the :initarg slot ++ option to defclass. This provides a mechanism for supplying a ++ value for a slot in a call to make-instance. ++ ++* ++ Supplying a default value form for an initialization argument. ++ Default value forms for initialization arguments are defined by ++ using the :default-initargs class option to defclass. If an ++ initialization argument is not explicitly provided as an argument ++ to make-instance, the default value form is evaluated in the ++ lexical environment of the defclass form that defined it, and the ++ resulting value is used as the value of the initialization ++ argument. ++ ++* ++ Supplying a default initial value form for a slot. A default ++ initial value form for a slot is defined by using the :initform ++ slot option to defclass. If no initialization argument associated ++ with that slot is given as an argument to make-instance or is ++ defaulted by :default-initargs, this default initial value form is ++ evaluated in the lexical environment of the defclass form that ++ defined it, and the resulting value is stored in the slot. The ++ :initform form for a local slot may be used when creating an ++ instance, when updating an instance to conform to a redefined ++ class, or when updating an instance to conform to the definition of ++ a different class. The :initform form for a shared slot may be ++ used when defining or re-defining the class. ++ ++* ++ Defining methods for initialize-instance and shared-initialize. ++ The slot-filling behavior described above is implemented by a ++ system-supplied primary method for initialize-instance which ++ invokes shared-initialize. The generic function shared-initialize ++ implements the parts of initialization shared by these four ++ situations: when making an instance, when re-initializing an ++ instance, when updating an instance to conform to a redefined ++ class, and when updating an instance to conform to the definition ++ of a different class. The system-supplied primary method for ++ shared-initialize directly implements the slot-filling behavior ++ described above, and initialize-instance simply invokes ++ shared-initialize. ++ ++* Menu: ++ ++* Initialization Arguments:: ++* Declaring the Validity of Initialization Arguments:: ++* Defaulting of Initialization Arguments:: ++* Rules for Initialization Arguments:: ++* Shared-Initialize:: ++* Initialize-Instance:: ++* Definitions of Make-Instance and Initialize-Instance:: ++ ++ ++File: gcl.info, Node: Initialization Arguments, Next: Declaring the Validity of Initialization Arguments, Prev: Object Creation and Initialization, Up: Object Creation and Initialization ++ ++7.1.1 Initialization Arguments ++------------------------------ ++ ++An initialization argument controls object creation and initialization. ++It is often convenient to use keyword symbols to name initialization ++arguments, but the name of an initialization argument can be any symbol, ++including nil. An initialization argument can be used in two ways: to ++fill a slot with a value or to provide an argument for an initialization ++method. A single initialization argument can be used for both purposes. ++ ++ An initialization argument list is a property list of initialization ++argument names and values. Its structure is identical to a property ++list and also to the portion of an argument list processed for &key ++parameters. As in those lists, if an initialization argument name ++appears more than once in an initialization argument list, the leftmost ++occurrence supplies the value and the remaining occurrences are ignored. ++The arguments to make-instance (after the first argument) form an ++initialization argument list. ++ ++ An initialization argument can be associated with a slot. If the ++initialization argument has a value in the initialization argument list, ++the value is stored into the slot of the newly created object, ++overriding any :initform form associated with the slot. A single ++initialization argument can initialize more than one slot. An ++initialization argument that initializes a shared slot stores its value ++into the shared slot, replacing any previous value. ++ ++ An initialization argument can be associated with a method. When an ++object is created and a particular initialization argument is supplied, ++the generic functions initialize-instance, shared-initialize, and ++allocate-instance are called with that initialization argument's name ++and value as a keyword argument pair. If a value for the initialization ++argument is not supplied in the initialization argument list, the ++method's lambda list supplies a default value. ++ ++ Initialization arguments are used in four situations: when making an ++instance, when re-initializing an instance, when updating an instance to ++conform to a redefined class, and when updating an instance to conform ++to the definition of a different class. ++ ++ Because initialization arguments are used to control the creation and ++initialization of an instance of some particular class, we say that an ++initialization argument is "an initialization argument for" that class. ++ ++ ++File: gcl.info, Node: Declaring the Validity of Initialization Arguments, Next: Defaulting of Initialization Arguments, Prev: Initialization Arguments, Up: Object Creation and Initialization ++ ++7.1.2 Declaring the Validity of Initialization Arguments ++-------------------------------------------------------- ++ ++Initialization arguments are checked for validity in each of the four ++situations that use them. An initialization argument may be valid in ++one situation and not another. For example, the system-supplied primary ++method for make-instance defined for the class standard-class checks the ++validity of its initialization arguments and signals an error if an ++initialization argument is supplied that is not declared as valid in ++that situation. ++ ++ There are two means for declaring initialization arguments valid. ++ ++* ++ Initialization arguments that fill slots are declared as valid by ++ the :initarg slot option to defclass. The :initarg slot option is ++ inherited from superclasses. Thus the set of valid initialization ++ arguments that fill slots for a class is the union of the ++ initialization arguments that fill slots declared as valid by that ++ class and its superclasses. Initialization arguments that fill ++ slots are valid in all four contexts. ++ ++* ++ Initialization arguments that supply arguments to methods are ++ declared as valid by defining those methods. The keyword name of ++ each keyword parameter specified in the method's lambda list ++ becomes an initialization argument for all classes for which the ++ method is applicable. ++ ++ The presence of &allow-other-keys in the lambda list of an ++ applicable method disables validity checking of initialization ++ arguments. ++ ++ Thus method inheritance controls the set of valid initialization ++ arguments that supply arguments to methods. The generic functions ++ for which method definitions serve to declare initialization ++ arguments valid are as follows: ++ ++ - ++ Making an instance of a class: allocate-instance, ++ initialize-instance, and shared-initialize. Initialization ++ arguments declared as valid by these methods are valid when ++ making an instance of a class. ++ ++ - ++ Re-initializing an instance: reinitialize-instance and ++ shared-initialize. Initialization arguments declared as valid ++ by these methods are valid when re-initializing an instance. ++ ++ - ++ Updating an instance to conform to a redefined class: ++ update-instance-for-redefined-class and shared-initialize. ++ Initialization arguments declared as valid by these methods ++ are valid when updating an instance to conform to a redefined ++ class. ++ ++ - ++ Updating an instance to conform to the definition of a ++ different class: update-instance-for-different-class and ++ shared-initialize. Initialization arguments declared as valid ++ by these methods are valid when updating an instance to ++ conform to the definition of a different class. ++ ++ The set of valid initialization arguments for a class is the set of ++valid initialization arguments that either fill slots or supply ++arguments to methods, along with the predefined initialization argument ++:allow-other-keys. The default value for :allow-other-keys is nil. ++ ++ Validity checking of initialization arguments is disabled if the ++value of the initialization argument :allow-other-keys is true. ++ ++ ++File: gcl.info, Node: Defaulting of Initialization Arguments, Next: Rules for Initialization Arguments, Prev: Declaring the Validity of Initialization Arguments, Up: Object Creation and Initialization ++ ++7.1.3 Defaulting of Initialization Arguments ++-------------------------------------------- ++ ++A default value form can be supplied for an initialization argument by ++using the :default-initargs class option. If an initialization argument ++is declared valid by some particular class, its default value form might ++be specified by a different class. In this case :default-initargs is ++used to supply a default value for an inherited initialization argument. ++ ++ The :default-initargs option is used only to provide default values ++for initialization arguments; it does not declare a symbol as a valid ++initialization argument name. Furthermore, the :default-initargs option ++is used only to provide default values for initialization arguments when ++making an instance. ++ ++ The argument to the :default-initargs class option is a list of ++alternating initialization argument names and forms. Each form is the ++default value form for the corresponding initialization argument. The ++default value form of an initialization argument is used and evaluated ++only if that initialization argument does not appear in the arguments to ++make-instance and is not defaulted by a more specific class. The ++default value form is evaluated in the lexical environment of the ++defclass form that supplied it; the resulting value is used as the ++initialization argument's value. ++ ++ The initialization arguments supplied to make-instance are combined ++with defaulted initialization arguments to produce a defaulted ++initialization argument list. A defaulted initialization argument list ++is a list of alternating initialization argument names and values in ++which unsupplied initialization arguments are defaulted and in which the ++explicitly supplied initialization arguments appear earlier in the list ++than the defaulted initialization arguments. Defaulted initialization ++arguments are ordered according to the order in the class precedence ++list of the classes that supplied the default values. ++ ++ There is a distinction between the purposes of the :default-initargs ++and the :initform options with respect to the initialization of slots. ++The :default-initargs class option provides a mechanism for the user to ++give a default value form for an initialization argument without knowing ++whether the initialization argument initializes a slot or is passed to a ++method. If that initialization argument is not explicitly supplied in a ++call to make-instance, the default value form is used, just as if it had ++been supplied in the call. In contrast, the :initform slot option ++provides a mechanism for the user to give a default initial value form ++for a slot. An :initform form is used to initialize a slot only if no ++initialization argument associated with that slot is given as an ++argument to make-instance or is defaulted by :default-initargs. ++ ++ The order of evaluation of default value forms for initialization ++arguments and the order of evaluation of :initform forms are undefined. ++If the order of evaluation is important, initialize-instance or ++shared-initialize methods should be used instead. ++ ++ ++File: gcl.info, Node: Rules for Initialization Arguments, Next: Shared-Initialize, Prev: Defaulting of Initialization Arguments, Up: Object Creation and Initialization ++ ++7.1.4 Rules for Initialization Arguments ++---------------------------------------- ++ ++The :initarg slot option may be specified more than once for a given ++slot. ++ ++ The following rules specify when initialization arguments may be ++multiply defined: ++ ++* ++ A given initialization argument can be used to initialize more than ++ one slot if the same initialization argument name appears in more ++ than one :initarg slot option. ++ ++* ++ A given initialization argument name can appear in the lambda list ++ of more than one initialization method. ++ ++* ++ A given initialization argument name can appear both in an :initarg ++ slot option and in the lambda list of an initialization method. ++ ++ [Reviewer Note by The next three paragraphs could be replaced by "If ++two or more initialization arguments that initialize the same slot ++appear in the defaulted initialization argument list, the leftmost of ++these supplies the value, even if they have different names." And the ++rest would follow from the rules above.] ++ ++ If two or more initialization arguments that initialize the same slot ++are given in the arguments to make-instance, the leftmost of these ++initialization arguments in the initialization argument list supplies ++the value, even if the initialization arguments have different names. ++ ++ If two or more different initialization arguments that initialize the ++same slot have default values and none is given explicitly in the ++arguments to make-instance, the initialization argument that appears in ++a :default-initargs class option in the most specific of the classes ++supplies the value. If a single :default-initargs class option ++specifies two or more initialization arguments that initialize the same ++slot and none is given explicitly in the arguments to make-instance, the ++leftmost in the :default-initargs class option supplies the value, and ++the values of the remaining default value forms are ignored. ++ ++ Initialization arguments given explicitly in the arguments to ++make-instance appear to the left of defaulted initialization arguments. ++Suppose that the classes C_1 and C_2 supply the values of defaulted ++initialization arguments for different slots, and suppose that C_1 is ++more specific than C_2; then the defaulted initialization argument whose ++value is supplied by C_1 is to the left of the defaulted initialization ++argument whose value is supplied by C_2 in the defaulted initialization ++argument list. If a single :default-initargs class option supplies the ++values of initialization arguments for two different slots, the ++initialization argument whose value is specified farther to the left in ++the :default-initargs class option appears farther to the left in the ++defaulted initialization argument list. ++ ++ [Reviewer Note by Barmar: End of claim made three paragraphs back.] ++ ++ If a slot has both an :initform form and an :initarg slot option, and ++the initialization argument is defaulted using :default-initargs or is ++supplied to make-instance, the captured :initform form is neither used ++nor evaluated. ++ ++ The following is an example of the above rules: ++ ++ (defclass q () ((x :initarg a))) ++ (defclass r (q) ((x :initarg b)) ++ (:default-initargs a 1 b 2)) ++ ++ Defaulted ++ Form Initialization Argument List Contents of Slot X ++ _____________________________________________________________________________ ++ (make-instance 'r) (a 1 b 2) 1 ++ (make-instance 'r 'a 3) (a 3 b 2) 3 ++ (make-instance 'r 'b 4) (b 4 a 1) 4 ++ (make-instance 'r 'a 1 'a 2) (a 1 a 2 b 2) 1 ++ ++ ++ ++File: gcl.info, Node: Shared-Initialize, Next: Initialize-Instance, Prev: Rules for Initialization Arguments, Up: Object Creation and Initialization ++ ++7.1.5 Shared-Initialize ++----------------------- ++ ++The generic function shared-initialize is used to fill the slots of an ++instance using initialization arguments and :initform forms when an ++instance is created, when an instance is re-initialized, when an ++instance is updated to conform to a redefined class, and when an ++instance is updated to conform to a different class. It uses standard ++method combination. It takes the following arguments: the instance to ++be initialized, a specification of a set of names of slots accessible in ++that instance, and any number of initialization arguments. The ++arguments after the first two must form an initialization argument list. ++ ++ The second argument to shared-initialize may be one of the following: ++ ++* ++ It can be a (possibly empty) list of slot names, which specifies ++ the set of those slot names. ++ ++* ++ It can be the symbol t, which specifies the set of all of the ++ slots. ++ ++ There is a system-supplied primary method for shared-initialize whose ++first parameter specializer is the class standard-object. This method ++behaves as follows on each slot, whether shared or local: ++ ++* ++ If an initialization argument in the initialization argument list ++ specifies a value for that slot, that value is stored into the ++ slot, even if a value has already been stored in the slot before ++ the method is run. The affected slots are independent of which ++ slots are indicated by the second argument to shared-initialize. ++ ++* ++ Any slots indicated by the second argument that are still unbound ++ at this point are initialized according to their :initform forms. ++ For any such slot that has an :initform form, that form is ++ evaluated in the lexical environment of its defining defclass form ++ and the result is stored into the slot. For example, if a before ++ method stores a value in the slot, the :initform form will not be ++ used to supply a value for the slot. If the second argument ++ specifies a name that does not correspond to any slots accessible ++ in the instance, the results are unspecified. ++ ++* ++ The rules mentioned in *note Rules for Initialization Arguments:: ++ are obeyed. ++ ++ The generic function shared-initialize is called by the ++system-supplied primary methods for reinitialize-instance, ++update-instance-for-different-class, ++update-instance-for-redefined-class, and initialize-instance. Thus, ++methods can be written for shared-initialize to specify actions that ++should be taken in all of these contexts. ++ ++ ++File: gcl.info, Node: Initialize-Instance, Next: Definitions of Make-Instance and Initialize-Instance, Prev: Shared-Initialize, Up: Object Creation and Initialization ++ ++7.1.6 Initialize-Instance ++------------------------- ++ ++The generic function initialize-instance is called by make-instance to ++initialize a newly created instance. It uses standard method ++combination. Methods for initialize-instance can be defined in order to ++perform any initialization that cannot be achieved simply by supplying ++initial values for slots. ++ ++ During initialization, initialize-instance is invoked after the ++following actions have been taken: ++ ++* ++ The defaulted initialization argument list has been computed by ++ combining the supplied initialization argument list with any ++ default initialization arguments for the class. ++ ++* ++ The validity of the defaulted initialization argument list has been ++ checked. If any of the initialization arguments has not been ++ declared as valid, an error is signaled. ++ ++* ++ A new instance whose slots are unbound has been created. ++ ++ The generic function initialize-instance is called with the new ++instance and the defaulted initialization arguments. There is a ++system-supplied primary method for initialize-instance whose parameter ++specializer is the class standard-object. This method calls the generic ++function shared-initialize to fill in the slots according to the ++initialization arguments and the :initform forms for the slots; the ++generic function shared-initialize is called with the following ++arguments: the instance, t, and the defaulted initialization arguments. ++ ++ Note that initialize-instance provides the defaulted initialization ++argument list in its call to shared-initialize, so the first step ++performed by the system-supplied primary method for shared-initialize ++takes into account both the initialization arguments provided in the ++call to make-instance and the defaulted initialization argument list. ++ ++ Methods for initialize-instance can be defined to specify actions to ++be taken when an instance is initialized. If only after methods for ++initialize-instance are defined, they will be run after the ++system-supplied primary method for initialization and therefore will not ++interfere with the default behavior of initialize-instance. ++ ++ The object system provides two functions that are useful in the ++bodies of initialize-instance methods. The function slot-boundp returns ++a generic boolean value that indicates whether a specified slot has a ++value; this provides a mechanism for writing after methods for ++initialize-instance that initialize slots only if they have not already ++been initialized. The function slot-makunbound causes the slot to have ++no value. ++ ++ ++File: gcl.info, Node: Definitions of Make-Instance and Initialize-Instance, Prev: Initialize-Instance, Up: Object Creation and Initialization ++ ++7.1.7 Definitions of Make-Instance and Initialize-Instance ++---------------------------------------------------------- ++ ++The generic function make-instance behaves as if it were defined as ++follows, except that certain optimizations are permitted: ++ ++ (defmethod make-instance ((class standard-class) &rest initargs) ++ ... ++ (let ((instance (apply #'allocate-instance class initargs))) ++ (apply #'initialize-instance instance initargs) ++ instance)) ++ ++ (defmethod make-instance ((class-name symbol) &rest initargs) ++ (apply #'make-instance (find-class class-name) initargs)) ++ ++ The elided code in the definition of make-instance augments the ++initargs with any defaulted initialization arguments and checks the ++resulting initialization arguments to determine whether an ++initialization argument was supplied that neither filled a slot nor ++supplied an argument to an applicable method. ++ ++ The generic function initialize-instance behaves as if it were ++defined as follows, except that certain optimizations are permitted: ++ ++ (defmethod initialize-instance ((instance standard-object) &rest initargs) ++ (apply #'shared-initialize instance t initargs))) ++ ++ These procedures can be customized. ++ ++ Customizing at the Programmer Interface level includes using the ++:initform, :initarg, and :default-initargs options to defclass, as well ++as defining methods for make-instance, allocate-instance, and ++initialize-instance. It is also possible to define methods for ++shared-initialize, which would be invoked by the generic functions ++reinitialize-instance, update-instance-for-redefined-class, ++update-instance-for-different-class, and initialize-instance. The ++meta-object level supports additional customization. ++ ++ Implementations are permitted to make certain optimizations to ++initialize-instance and shared-initialize. The description of ++shared-initialize in Chapter~7 mentions the possible optimizations. ++ ++ ++File: gcl.info, Node: Changing the Class of an Instance, Next: Reinitializing an Instance, Prev: Object Creation and Initialization, Up: Objects ++ ++7.2 Changing the Class of an Instance ++===================================== ++ ++The function change-class can be used to change the class of an instance ++from its current class, C_{from}, to a different class, C_{to}; it ++changes the structure of the instance to conform to the definition of ++the class C_{to}. ++ ++ Note that changing the class of an instance may cause slots to be ++added or deleted. Changing the class of an instance does not change its ++identity as defined by the eq function. ++ ++ When change-class is invoked on an instance, a two-step updating ++process takes place. The first step modifies the structure of the ++instance by adding new local slots and discarding local slots that are ++not specified in the new version of the instance. The second step ++initializes the newly added local slots and performs any other ++user-defined actions. These two steps are further described in the two ++following sections. ++ ++* Menu: ++ ++* Modifying the Structure of the Instance:: ++* Initializing Newly Added Local Slots (Changing the Class of an Instance):: ++* Customizing the Change of Class of an Instance:: ++ ++ ++File: gcl.info, Node: Modifying the Structure of the Instance, Next: Initializing Newly Added Local Slots (Changing the Class of an Instance), Prev: Changing the Class of an Instance, Up: Changing the Class of an Instance ++ ++7.2.1 Modifying the Structure of the Instance ++--------------------------------------------- ++ ++In order to make the instance conform to the class C_{to}, local slots ++specified by the class C_{to} that are not specified by the class ++C_{from} are added, and local slots not specified by the class C_{to} ++that are specified by the class C_{from} are discarded. ++ ++ The values of local slots specified by both the class C_{to} and the ++class C_{from} are retained. If such a local slot was unbound, it ++remains unbound. ++ ++ The values of slots specified as shared in the class C_{from} and as ++local in the class C_{to} are retained. ++ ++ This first step of the update does not affect the values of any ++shared slots. ++ ++ ++File: gcl.info, Node: Initializing Newly Added Local Slots (Changing the Class of an Instance), Next: Customizing the Change of Class of an Instance, Prev: Modifying the Structure of the Instance, Up: Changing the Class of an Instance ++ ++7.2.2 Initializing Newly Added Local Slots ++------------------------------------------ ++ ++The second step of the update initializes the newly added slots and ++performs any other user-defined actions. This step is implemented by ++the generic function update-instance-for-different-class. The generic ++function update-instance-for-different-class is invoked by change-class ++after the first step of the update has been completed. ++ ++ The generic function update-instance-for-different-class is invoked ++on arguments computed by change-class. The first argument passed is a ++copy of the instance being updated and is an instance of the class ++C_{from}; this copy has dynamic extent within the generic function ++change-class. The second argument is the instance as updated so far by ++change-class and is an instance of the class C_{to}. The remaining ++arguments are an initialization argument list. ++ ++ There is a system-supplied primary method for ++update-instance-for-different-class that has two parameter specializers, ++each of which is the class standard-object. First this method checks ++the validity of initialization arguments and signals an error if an ++initialization argument is supplied that is not declared as valid. (For ++more information, see *note Declaring the Validity of Initialization ++Arguments::.) Then it calls the generic function shared-initialize with ++the following arguments: the new instance, a list of names of the newly ++added slots, and the initialization arguments it received. ++ ++ ++File: gcl.info, Node: Customizing the Change of Class of an Instance, Prev: Initializing Newly Added Local Slots (Changing the Class of an Instance), Up: Changing the Class of an Instance ++ ++7.2.3 Customizing the Change of Class of an Instance ++---------------------------------------------------- ++ ++Methods for update-instance-for-different-class may be defined to ++specify actions to be taken when an instance is updated. If only after ++methods for update-instance-for-different-class are defined, they will ++be run after the system-supplied primary method for initialization and ++will not interfere with the default behavior of ++update-instance-for-different-class. ++ ++ Methods for shared-initialize may be defined to customize class ++redefinition. For more information, see *note Shared-Initialize::. ++ ++ ++File: gcl.info, Node: Reinitializing an Instance, Next: Meta-Objects, Prev: Changing the Class of an Instance, Up: Objects ++ ++7.3 Reinitializing an Instance ++============================== ++ ++The generic function reinitialize-instance may be used to change the ++values of slots according to initialization arguments. ++ ++ The process of reinitialization changes the values of some slots and ++performs any user-defined actions. It does not modify the structure of ++an instance to add or delete slots, and it does not use any :initform ++forms to initialize slots. ++ ++ The generic function reinitialize-instance may be called directly. ++It takes one required argument, the instance. It also takes any number ++of initialization arguments to be used by methods for ++reinitialize-instance or for shared-initialize. The arguments after the ++required instance must form an initialization argument list. ++ ++ There is a system-supplied primary method for reinitialize-instance ++whose parameter specializer is the class standard-object. First this ++method checks the validity of initialization arguments and signals an ++error if an initialization argument is supplied that is not declared as ++valid. (For more information, see *note Declaring the Validity of ++Initialization Arguments::.) Then it calls the generic function ++shared-initialize with the following arguments: the instance, nil, and ++the initialization arguments it received. ++ ++* Menu: ++ ++* Customizing Reinitialization:: ++ ++ ++File: gcl.info, Node: Customizing Reinitialization, Prev: Reinitializing an Instance, Up: Reinitializing an Instance ++ ++7.3.1 Customizing Reinitialization ++---------------------------------- ++ ++Methods for reinitialize-instance may be defined to specify actions to ++be taken when an instance is updated. If only after methods for ++reinitialize-instance are defined, they will be run after the ++system-supplied primary method for initialization and therefore will not ++interfere with the default behavior of reinitialize-instance. ++ ++ Methods for shared-initialize may be defined to customize class ++redefinition. For more information, see *note Shared-Initialize::. ++ ++ ++File: gcl.info, Node: Meta-Objects, Next: Slots, Prev: Reinitializing an Instance, Up: Objects ++ ++7.4 Meta-Objects ++================ ++ ++The implementation of the object system manipulates classes, methods, ++and generic functions. The object system contains a set of generic ++functions defined by methods on classes; the behavior of those generic ++functions defines the behavior of the object system. The instances of ++the classes on which those methods are defined are called meta-objects. ++ ++* Menu: ++ ++* Standard Meta-objects:: ++ ++ ++File: gcl.info, Node: Standard Meta-objects, Prev: Meta-Objects, Up: Meta-Objects ++ ++7.4.1 Standard Meta-objects ++--------------------------- ++ ++The object system supplies a set of meta-objects, called standard ++meta-objects. These include the class standard-object and instances of ++the classes standard-method, standard-generic-function, and ++method-combination. ++ ++ [Editorial Note by KMP: This is said redundantly in the definition ++ of STANDARD-METHOD.] ++* ++ The class standard-method is the default class of methods defined ++ by the defmethod and defgeneric forms. ++ ++* ++ The class standard-generic-function is the default class of generic ++ functions defined by the forms defmethod, defgeneric, ++ ++ and defclass. ++ ++* ++ The class named standard-object is an instance of the class ++ standard-class and is a superclass of every class that is an ++ instance of standard-class except itself and structure-class. ++ ++* ++ Every method combination object is an instance of a subclass of ++ class method-combination. ++ ++ ++File: gcl.info, Node: Slots, Next: Generic Functions and Methods, Prev: Meta-Objects, Up: Objects ++ ++7.5 Slots ++========= ++ ++* Menu: ++ ++* Introduction to Slots:: ++* Accessing Slots:: ++* Inheritance of Slots and Slot Options:: ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-4 +@@ -0,0 +1,8292 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: Introduction to Slots, Next: Accessing Slots, Prev: Slots, Up: Slots ++ ++7.5.1 Introduction to Slots ++--------------------------- ++ ++An object of metaclass standard-class has zero or more named slots. The ++slots of an object are determined by the class of the object. Each slot ++can hold one value. ++ ++ [Reviewer Note by Barmar: All symbols are valid variable names. ++Perhaps this means to preclude the use of named constants? We have a ++terminology problem to solve.] The name of a slot is a symbol that is ++syntactically valid for use as a variable name. ++ ++ When a slot does not have a value, the slot is said to be unbound. ++When an unbound slot is read, ++ ++ [Reviewer Note by Barmar: from an object whose metaclass is ++standard-class?] the generic function slot-unbound is invoked. The ++system-supplied primary method for slot-unbound on class t signals an ++error. ++ ++ If slot-unbound returns, its primary value is used that time as the ++value of the slot. ++ ++ The default initial value form for a slot is defined by the :initform ++slot option. When the :initform form is used to supply a value, it is ++evaluated in the lexical environment in which the defclass form was ++evaluated. The :initform along with the lexical environment in which ++the defclass form was evaluated is called a captured initialization ++form. For more details, see *note Object Creation and Initialization::. ++ ++ A local slot is defined to be a slot that is accessible to exactly ++one instance, namely the one in which the slot is allocated. A shared ++slot is defined to be a slot that is visible to more than one instance ++of a given class and its subclasses. ++ ++ A class is said to define a slot with a given name when the defclass ++form for that class contains a slot specifier with that name. Defining ++a local slot does not immediately create a slot; it causes a slot to be ++created each time an instance of the class is created. Defining a ++shared slot immediately creates a slot. ++ ++ The :allocation slot option to defclass controls the kind of slot ++that is defined. If the value of the :allocation slot option is ++:instance, a local slot is created. If the value of :allocation is ++:class, a shared slot is created. ++ ++ A slot is said to be accessible in an instance of a class if the slot ++is defined by the class of the instance or is inherited from a ++superclass of that class. At most one slot of a given name can be ++accessible in an instance. A shared slot defined by a class is ++accessible in all instances of that class. A detailed explanation of ++the inheritance of slots is given in *note Inheritance of Slots and Slot ++Options::. ++ ++ ++File: gcl.info, Node: Accessing Slots, Next: Inheritance of Slots and Slot Options, Prev: Introduction to Slots, Up: Slots ++ ++7.5.2 Accessing Slots ++--------------------- ++ ++Slots can be accessed in two ways: by use of the primitive function ++slot-value and by use of generic functions generated by the defclass ++form. ++ ++ The function slot-value can be used with any of the slot names ++specified in the defclass form to access a specific slot accessible in ++an instance of the given class. ++ ++ The macro defclass provides syntax for generating methods to read and ++write slots. If a reader method is requested, a method is automatically ++generated for reading the value of the slot, but no method for storing a ++value into it is generated. If a writer method is requested, a method ++is automatically generated for storing a value into the slot, but no ++method for reading its value is generated. If an accessor method is ++requested, a method for reading the value of the slot and a method for ++storing a value into the slot are automatically generated. Reader and ++writer methods are implemented using slot-value. ++ ++ When a reader or writer method is specified for a slot, the name of ++the generic function to which the generated method belongs is directly ++specified. If the name specified for the writer method is the symbol ++name, the name of the generic function for writing the slot is the ++symbol name, and the generic function takes two arguments: the new value ++and the instance, in that order. If the name specified for the accessor ++method is the symbol name, the name of the generic function for reading ++the slot is the symbol name, and the name of the generic function for ++writing the slot is the list (setf name). ++ ++ A generic function created or modified by supplying :reader, :writer, ++or :accessor slot options can be treated exactly as an ordinary generic ++function. ++ ++ Note that slot-value can be used to read or write the value of a slot ++whether or not reader or writer methods exist for that slot. When ++slot-value is used, no reader or writer methods are invoked. ++ ++ The macro with-slots can be used to establish a lexical environment ++in which specified slots are lexically available as if they were ++variables. The macro with-slots invokes the function slot-value to ++access the specified slots. ++ ++ The macro with-accessors can be used to establish a lexical ++environment in which specified slots are lexically available through ++their accessors as if they were variables. The macro with-accessors ++invokes the appropriate accessors to access the specified slots. ++ ++ ++File: gcl.info, Node: Inheritance of Slots and Slot Options, Prev: Accessing Slots, Up: Slots ++ ++7.5.3 Inheritance of Slots and Slot Options ++------------------------------------------- ++ ++The set of the names of all slots accessible in an instance of a class C ++is the union of the sets of names of slots defined by C and its ++superclasses. The structure of an instance is the set of names of local ++slots in that instance. ++ ++ In the simplest case, only one class among C and its superclasses ++defines a slot with a given slot name. If a slot is defined by a ++superclass of C, the slot is said to be inherited. The characteristics ++of the slot are determined by the slot specifier of the defining class. ++Consider the defining class for a slot S. If the value of the ++:allocation slot option is :instance, then S is a local slot and each ++instance of C has its own slot named S that stores its own value. If ++the value of the :allocation slot option is :class, then S is a shared ++slot, the class that defined S stores the value, and all instances of C ++can access that single slot. If the :allocation slot option is omitted, ++:instance is used. ++ ++ In general, more than one class among C and its superclasses can ++define a slot with a given name. In such cases, only one slot with the ++given name is accessible in an instance of C, and the characteristics of ++that slot are a combination of the several slot specifiers, computed as ++follows: ++ ++* ++ All the slot specifiers for a given slot name are ordered from most ++ specific to least specific, according to the order in C's class ++ precedence list of the classes that define them. All references to ++ the specificity of slot specifiers immediately below refers to this ++ ordering. ++ ++* ++ The allocation of a slot is controlled by the most specific slot ++ specifier. If the most specific slot specifier does not contain an ++ :allocation slot option, :instance is used. Less specific slot ++ specifiers do not affect the allocation. ++ ++* ++ The default initial value form for a slot is the value of the ++ :initform slot option in the most specific slot specifier that ++ contains one. If no slot specifier contains an :initform slot ++ option, the slot has no default initial value form. ++ ++* ++ The contents of a slot will always be of type (and T_1 ... T_n) ++ where T_1 ... T_n are the values of the :type slot options ++ contained in all of the slot specifiers. If no slot specifier ++ contains the :type slot option, the contents of the slot will ++ always be of type t. The consequences of attempting to store in a ++ slot a value that does not satisfy the type of the slot are ++ undefined. ++ ++* ++ The set of initialization arguments that initialize a given slot is ++ the union of the initialization arguments declared in the :initarg ++ slot options in all the slot specifiers. ++ ++* ++ The documentation string for a slot is the value of the ++ :documentation slot option in the most specific slot specifier that ++ contains one. If no slot specifier contains a :documentation slot ++ option, the slot has no documentation string. ++ ++ A consequence of the allocation rule is that a shared slot can be ++shadowed. For example, if a class C_1 defines a slot named S whose ++value for the :allocation slot option is :class, that slot is accessible ++in instances of C_1 and all of its subclasses. However, if C_2 is a ++subclass of C_1 and also defines a slot named S, C_1's slot is not ++shared by instances of C_2 and its subclasses. When a class C_1 defines ++a shared slot, any subclass C_2 of C_1 will share this single slot ++unless the defclass form for C_2 specifies a slot of the same name or ++there is a superclass of C_2 that precedes C_1 in the class precedence ++list of C_2 that defines a slot of the same name. ++ ++ A consequence of the type rule is that the value of a slot satisfies ++the type constraint of each slot specifier that contributes to that ++slot. Because the result of attempting to store in a slot a value that ++does not satisfy the type constraint for the slot is undefined, the ++value in a slot might fail to satisfy its type constraint. ++ ++ The :reader, :writer, and :accessor slot options create methods ++rather than define the characteristics of a slot. Reader and writer ++methods are inherited in the sense described in *note Inheritance of ++Methods::. ++ ++ Methods that access slots use only the name of the slot and the type ++of the slot's value. Suppose a superclass provides a method that ++expects to access a shared slot of a given name, and a subclass defines ++a local slot with the same name. If the method provided by the ++superclass is used on an instance of the subclass, the method accesses ++the local slot. ++ ++ ++File: gcl.info, Node: Generic Functions and Methods, Next: Objects Dictionary, Prev: Slots, Up: Objects ++ ++7.6 Generic Functions and Methods ++================================= ++ ++* Menu: ++ ++* Introduction to Generic Functions:: ++* Introduction to Methods:: ++* Agreement on Parameter Specializers and Qualifiers:: ++* Congruent Lambda-lists for all Methods of a Generic Function:: ++* Keyword Arguments in Generic Functions and Methods:: ++* Method Selection and Combination:: ++* Inheritance of Methods:: ++ ++ ++File: gcl.info, Node: Introduction to Generic Functions, Next: Introduction to Methods, Prev: Generic Functions and Methods, Up: Generic Functions and Methods ++ ++7.6.1 Introduction to Generic Functions ++--------------------------------------- ++ ++A generic function is a function whose behavior depends on the classes ++or identities of the arguments supplied to it. A generic function ++object is associated with a set of methods, a lambda list, a method ++combination_2, and other information. ++ ++ Like an ordinary function, a generic function takes arguments, ++performs a series of operations, and perhaps returns useful values. An ++ordinary function has a single body of code that is always executed when ++the function is called. A generic function has a set of bodies of code ++of which a subset is selected for execution. The selected bodies of ++code and the manner of their combination are determined by the classes ++or identities of one or more of the arguments to the generic function ++and by its method combination. ++ ++ Ordinary functions and generic functions are called with identical ++syntax. ++ ++ Generic functions are true functions that can be passed as arguments ++and used as the first argument to funcall and apply. ++ ++ A binding of a function name to a generic function can be established ++in one of several ways. It can be established in the global environment ++by ensure-generic-function, defmethod (implicitly, due to ++ensure-generic-function) or defgeneric (also implicitly, due to ++ensure-generic-function). ++ ++ No standardized mechanism is provided for establishing a binding of a ++function name to a generic function in the lexical environment. ++ ++ When a defgeneric form is evaluated, one of three actions is taken ++(due to ensure-generic-function): ++ ++* ++ If a generic function of the given name already exists, the ++ existing generic function object is modified. Methods specified by ++ the current defgeneric form are added, and any methods in the ++ existing generic function that were defined by a previous ++ defgeneric form are removed. Methods added by the current ++ defgeneric form might replace methods defined by defmethod, ++ defclass, define-condition, or defstruct. No other methods in the ++ generic function are affected or replaced. ++ ++* ++ If the given name names an ordinary function, a macro, or a special ++ operator, an error is signaled. ++ ++* ++ Otherwise a generic function is created with the methods specified ++ by the method definitions in the defgeneric form. ++ ++ Some operators permit specification of the options of a generic ++function, such as the type of method combination it uses or its argument ++precedence order. These operators will be referred to as "operators ++that specify generic function options." ++ ++ The only standardized operator in this category is defgeneric. ++ ++ Some operators define methods for a generic function. These ++operators will be referred to as method-defining operators ; their ++associated forms are called method-defining forms. The standardized ++method-defining operators are listed in Figure 7-2. ++ ++ defgeneric defmethod defclass ++ define-condition defstruct ++ ++ Figure 7-2: Standardized Method-Defining Operators ++ ++ ++ Note that of the standardized method-defining operators only ++defgeneric can specify generic function options. defgeneric and any ++implementation-defined operators that can specify generic function ++options are also referred to as "operators that specify generic function ++options." ++ ++ ++File: gcl.info, Node: Introduction to Methods, Next: Agreement on Parameter Specializers and Qualifiers, Prev: Introduction to Generic Functions, Up: Generic Functions and Methods ++ ++7.6.2 Introduction to Methods ++----------------------------- ++ ++Methods define the class-specific or identity-specific behavior and ++operations of a generic function. ++ ++ A method object is associated with code that implements the method's ++behavior, a sequence of parameter specializers that specify when the ++given method is applicable, a lambda list, and a sequence of qualifiers ++that are used by the method combination facility to distinguish among ++methods. ++ ++ A method object is not a function and cannot be invoked as a ++function. Various mechanisms in the object system take a method object ++and invoke its method function, as is the case when a generic function ++is invoked. When this occurs it is said that the method is invoked or ++called. ++ ++ A method-defining form contains the code that is to be run when the ++arguments to the generic function cause the method that it defines to be ++invoked. When a method-defining form is evaluated, a method object is ++created and one of four actions is taken: ++ ++* ++ If a generic function of the given name already exists and if a ++ method object already exists that agrees with the new one on ++ parameter specializers and qualifiers, the new method object ++ replaces the old one. For a definition of one method agreeing with ++ another on parameter specializers and qualifiers, see *note ++ Agreement on Parameter Specializers and Qualifiers::. ++ ++* ++ If a generic function of the given name already exists and if there ++ is no method object that agrees with the new one on parameter ++ specializers and qualifiers, the existing generic function object ++ is modified to contain the new method object. ++ ++* ++ If the given name names an ordinary function, a macro, or a special ++ operator, an error is signaled. ++ ++* ++ Otherwise a generic function is created with the method specified ++ by the method-defining form. ++ ++ If the lambda list of a new method is not congruent with the lambda ++list of the generic function, an error is signaled. If a ++method-defining operator that cannot specify generic function options ++creates a new generic function, a lambda list for that generic function ++is derived from the lambda list of the method in the method-defining ++form in such a way as to be congruent with it. For a discussion of ++congruence , see *note Congruent Lambda-lists for all Methods of a ++Generic Function::. ++ ++ Each method has a specialized lambda list, which determines when that ++method can be applied. A specialized lambda list is like an ordinary ++lambda list except that a specialized parameter may occur instead of the ++name of a required parameter. A specialized parameter is a list ++(variable-name parameter-specializer-name), where ++parameter-specializer-name is one of the following: ++ ++a symbol ++ denotes a parameter specializer which is the class named by that ++ symbol. ++ ++a class ++ denotes a parameter specializer which is the class itself. ++ ++(eql form) ++ denotes a parameter specializer which satisfies the type specifier ++ (eql object), where object is the result of evaluating form. The ++ form form is evaluated in the lexical environment in which the ++ method-defining form is evaluated. Note that form is evaluated ++ only once, at the time the method is defined, not each time the ++ generic function is called. ++ ++ Parameter specializer names are used in macros intended as the ++user-level interface (defmethod), while parameter specializers are used ++in the functional interface. ++ ++ Only required parameters may be specialized, and there must be a ++parameter specializer for each required parameter. For notational ++simplicity, if some required parameter in a specialized lambda list in a ++method-defining form is simply a variable name, its parameter ++specializer defaults to the class t. ++ ++ Given a generic function and a set of arguments, an applicable method ++is a method for that generic function whose parameter specializers are ++satisfied by their corresponding arguments. The following definition ++specifies what it means for a method to be applicable and for an ++argument to satisfy a parameter specializer. ++ ++ Let < A_1, ..., A_n> be the required arguments to a generic function ++in order. Let < P_1, ..., P_n> be the parameter specializers ++corresponding to the required parameters of the method M in order. The ++method M is applicable when each A_i is of the type specified by the ++type specifier P_i. Because every valid parameter specializer is also a ++valid type specifier, the function typep can be used during method ++selection to determine whether an argument satisfies a parameter ++specializer. ++ ++ A method all of whose parameter specializers are the class t is ++called a default method ; it is always applicable but may be shadowed by ++a more specific method. ++ ++ Methods can have qualifiers, which give the method combination ++procedure a way to distinguish among methods. A method that has one or ++more qualifiers is called a qualified method. A method with no ++qualifiers is called an unqualified method. A qualifier is any ++non-list. The qualifiers defined by the standardized method combination ++types are symbols. ++ ++ In this specification, the terms "primary method" and "auxiliary ++method" are used to partition methods within a method combination type ++according to their intended use. In standard method combination, ++primary methods are unqualified methods and auxiliary methods are ++methods with a single qualifier that is one of :around, :before, or ++:after. Methods with these qualifiers are called around methods, before ++methods, and after methods, respectively. When a method combination ++type is defined using the short form of define-method-combination, ++primary methods are methods qualified with the name of the type of ++method combination, and auxiliary methods have the qualifier :around. ++Thus the terms "primary method" and "auxiliary method" have only a ++relative definition within a given method combination type. ++ ++ ++File: gcl.info, Node: Agreement on Parameter Specializers and Qualifiers, Next: Congruent Lambda-lists for all Methods of a Generic Function, Prev: Introduction to Methods, Up: Generic Functions and Methods ++ ++7.6.3 Agreement on Parameter Specializers and Qualifiers ++-------------------------------------------------------- ++ ++Two methods are said to agree with each other on parameter specializers ++and qualifiers if the following conditions hold: ++ ++1. ++ Both methods have the same number of required parameters. Suppose ++ the parameter specializers of the two methods are P_{1,1}... ++ P_{1,n} and P_{2,1}... P_{2,n}. ++ ++2. ++ For each 1<= i<= n, P_{1,i} agrees with P_{2,i}. The parameter ++ specializer P_{1,i} agrees with P_{2,i} if P_{1,i} and P_{2,i} are ++ the same class or if P_{1,i}=(eql object_1), P_{2,i}=(eql ++ object_2), and (eql object_1 object_2). Otherwise P_{1,i} and ++ P_{2,i} do not agree. ++ ++3. ++ The two lists of qualifiers are the same under equal. ++ ++ ++File: gcl.info, Node: Congruent Lambda-lists for all Methods of a Generic Function, Next: Keyword Arguments in Generic Functions and Methods, Prev: Agreement on Parameter Specializers and Qualifiers, Up: Generic Functions and Methods ++ ++7.6.4 Congruent Lambda-lists for all Methods of a Generic Function ++------------------------------------------------------------------ ++ ++These rules define the congruence of a set of lambda lists, including ++the lambda list of each method for a given generic function and the ++lambda list specified for the generic function itself, if given. ++ ++1. ++ Each lambda list must have the same number of required parameters. ++ ++2. ++ Each lambda list must have the same number of optional parameters. ++ Each method can supply its own default for an optional parameter. ++ ++3. ++ If any lambda list mentions &rest or &key, each lambda list must ++ mention one or both of them. ++ ++4. ++ If the generic function lambda list mentions &key, each method must ++ accept all of the keyword names mentioned after &key, either by ++ accepting them explicitly, by specifying &allow-other-keys, or by ++ specifying &rest but not &key. Each method can accept additional ++ keyword arguments of its own. The checking of the validity of ++ keyword names is done in the generic function, not in each method. ++ A method is invoked as if the keyword argument pair whose name is ++ :allow-other-keys and whose value is true were supplied, though no ++ such argument pair will be passed. ++ ++5. ++ The use of &allow-other-keys need not be consistent across lambda ++ lists. If &allow-other-keys is mentioned in the lambda list of any ++ applicable method or of the generic function, any keyword arguments ++ may be mentioned in the call to the generic function. ++ ++6. ++ The use of &aux need not be consistent across methods. ++ ++ If a method-defining operator that cannot specify generic function ++ options creates a generic function, and if the lambda list for the ++ method mentions keyword arguments, the lambda list of the generic ++ function will mention &key (but no keyword arguments). ++ ++ ++File: gcl.info, Node: Keyword Arguments in Generic Functions and Methods, Next: Method Selection and Combination, Prev: Congruent Lambda-lists for all Methods of a Generic Function, Up: Generic Functions and Methods ++ ++7.6.5 Keyword Arguments in Generic Functions and Methods ++-------------------------------------------------------- ++ ++When a generic function or any of its methods mentions &key in a lambda ++list, the specific set of keyword arguments accepted by the generic ++function varies according to the applicable methods. The set of keyword ++arguments accepted by the generic function for a particular call is the ++union of the keyword arguments accepted by all applicable methods and ++the keyword arguments mentioned after &key in the generic function ++definition, if any. A method that has &rest but not &key does not ++affect the set of acceptable keyword arguments. If the lambda list of ++any applicable method or of the generic function definition contains ++&allow-other-keys, all keyword arguments are accepted by the generic ++function. ++ ++ The lambda list congruence rules require that each method accept all ++of the keyword arguments mentioned after &key in the generic function ++definition, by accepting them explicitly, by specifying ++&allow-other-keys, or by specifying &rest but not &key. Each method can ++accept additional keyword arguments of its own, in addition to the ++keyword arguments mentioned in the generic function definition. ++ ++ If a generic function is passed a keyword argument that no applicable ++method accepts, an error should be signaled; see *note Error Checking in ++Function Calls::. ++ ++* Menu: ++ ++* Examples of Keyword Arguments in Generic Functions and Methods:: ++ ++ ++File: gcl.info, Node: Examples of Keyword Arguments in Generic Functions and Methods, Prev: Keyword Arguments in Generic Functions and Methods, Up: Keyword Arguments in Generic Functions and Methods ++ ++7.6.5.1 Examples of Keyword Arguments in Generic Functions and Methods ++...................................................................... ++ ++For example, suppose there are two methods defined for width as follows: ++ ++ (defmethod width ((c character-class) &key font) ...) ++ ++ (defmethod width ((p picture-class) &key pixel-size) ...) ++ ++Assume that there are no other methods and no generic function ++definition for width. The evaluation of the following form should ++signal an error because the keyword argument :pixel-size is not accepted ++by the applicable method. ++ ++ (width (make-instance `character-class :char #\Q) ++ :font 'baskerville :pixel-size 10) ++ ++ The evaluation of the following form should signal an error. ++ ++ (width (make-instance `picture-class :glyph (glyph #\Q)) ++ :font 'baskerville :pixel-size 10) ++ ++ The evaluation of the following form will not signal an error if the ++class named character-picture-class is a subclass of both picture-class ++and character-class. ++ ++ (width (make-instance `character-picture-class :char #\Q) ++ :font 'baskerville :pixel-size 10) ++ ++ ++File: gcl.info, Node: Method Selection and Combination, Next: Inheritance of Methods, Prev: Keyword Arguments in Generic Functions and Methods, Up: Generic Functions and Methods ++ ++7.6.6 Method Selection and Combination ++-------------------------------------- ++ ++When a generic function is called with particular arguments, it must ++determine the code to execute. This code is called the effective method ++for those arguments. The effective method is a combination of the ++applicable methods in the generic function that calls some or all of the ++methods. ++ ++ If a generic function is called and no methods are applicable, the ++generic function no-applicable-method is invoked, with the results from ++that call being used as the results of the call to the original generic ++function. Calling no-applicable-method takes precedence over checking ++for acceptable keyword arguments; see *note Keyword Arguments in Generic ++Functions and Methods::. ++ ++ When the effective method has been determined, it is invoked with the ++same arguments as were passed to the generic function. Whatever values ++it returns are returned as the values of the generic function. ++ ++* Menu: ++ ++* Determining the Effective Method:: ++* Selecting the Applicable Methods:: ++* Sorting the Applicable Methods by Precedence Order:: ++* Applying method combination to the sorted list of applicable methods:: ++* Standard Method Combination:: ++* Declarative Method Combination:: ++* Built-in Method Combination Types:: ++ ++ ++File: gcl.info, Node: Determining the Effective Method, Next: Selecting the Applicable Methods, Prev: Method Selection and Combination, Up: Method Selection and Combination ++ ++7.6.6.1 Determining the Effective Method ++........................................ ++ ++The effective method is determined by the following three-step ++procedure: ++ ++1. ++ Select the applicable methods. ++ ++2. ++ Sort the applicable methods by precedence order, putting the most ++ specific method first. ++ ++3. ++ Apply method combination to the sorted list of applicable methods, ++ producing the effective method. ++ ++ ++File: gcl.info, Node: Selecting the Applicable Methods, Next: Sorting the Applicable Methods by Precedence Order, Prev: Determining the Effective Method, Up: Method Selection and Combination ++ ++7.6.6.2 Selecting the Applicable Methods ++........................................ ++ ++This step is described in *note Introduction to Methods::. ++ ++ ++File: gcl.info, Node: Sorting the Applicable Methods by Precedence Order, Next: Applying method combination to the sorted list of applicable methods, Prev: Selecting the Applicable Methods, Up: Method Selection and Combination ++ ++7.6.6.3 Sorting the Applicable Methods by Precedence Order ++.......................................................... ++ ++To compare the precedence of two methods, their parameter specializers ++are examined in order. The default examination order is from left to ++right, but an alternative order may be specified by the ++:argument-precedence-order option to defgeneric or to any of the other ++operators that specify generic function options. ++ ++ The corresponding parameter specializers from each method are ++compared. When a pair of parameter specializers agree, the next pair ++are compared for agreement. If all corresponding parameter specializers ++agree, the two methods must have different qualifiers; in this case, ++either method can be selected to precede the other. For information ++about agreement, see *note Agreement on Parameter Specializers and ++Qualifiers::. ++ ++ If some corresponding parameter specializers do not agree, the first ++pair of parameter specializers that do not agree determines the ++precedence. If both parameter specializers are classes, the more ++specific of the two methods is the method whose parameter specializer ++appears earlier in the class precedence list of the corresponding ++argument. Because of the way in which the set of applicable methods is ++chosen, the parameter specializers are guaranteed to be present in the ++class precedence list of the class of the argument. ++ ++ If just one of a pair of corresponding parameter specializers is (eql ++object), the method with that parameter specializer precedes the other ++method. If both parameter specializers are eql expressions, the ++specializers must agree (otherwise the two methods would not both have ++been applicable to this argument). ++ ++ The resulting list of applicable methods has the most specific method ++first and the least specific method last. ++ ++ ++File: gcl.info, Node: Applying method combination to the sorted list of applicable methods, Next: Standard Method Combination, Prev: Sorting the Applicable Methods by Precedence Order, Up: Method Selection and Combination ++ ++7.6.6.4 Applying method combination to the sorted list of applicable methods ++............................................................................ ++ ++In the simple case--if standard method combination is used and all ++applicable methods are primary methods--the effective method is the most ++specific method. That method can call the next most specific method by ++using the function call-next-method. The method that call-next-method ++will call is referred to as the next method . The predicate ++next-method-p tests whether a next method exists. If call-next-method ++is called and there is no next most specific method, the generic ++function no-next-method is invoked. ++ ++ In general, the effective method is some combination of the ++applicable methods. It is described by a form that contains calls to ++some or all of the applicable methods, returns the value or values that ++will be returned as the value or values of the generic function, and ++optionally makes some of the methods accessible by means of ++call-next-method. ++ ++ The role of each method in the effective method is determined by its ++qualifiers and the specificity of the method. A qualifier serves to ++mark a method, and the meaning of a qualifier is determined by the way ++that these marks are used by this step of the procedure. If an ++applicable method has an unrecognized qualifier, this step signals an ++error and does not include that method in the effective method. ++ ++ When standard method combination is used together with qualified ++methods, the effective method is produced as described in *note Standard ++Method Combination::. ++ ++ Another type of method combination can be specified by using the ++:method-combination option of defgeneric or of any of the other ++operators that specify generic function options. In this way this step ++of the procedure can be customized. ++ ++ New types of method combination can be defined by using the ++define-method-combination macro. ++ ++ ++File: gcl.info, Node: Standard Method Combination, Next: Declarative Method Combination, Prev: Applying method combination to the sorted list of applicable methods, Up: Method Selection and Combination ++ ++7.6.6.5 Standard Method Combination ++................................... ++ ++Standard method combination is supported by the class ++standard-generic-function. It is used if no other type of method ++combination is specified or if the built-in method combination type ++standard is specified. ++ ++ Primary methods define the main action of the effective method, while ++auxiliary methods modify that action in one of three ways. A primary ++method has no method qualifiers. ++ ++ An auxiliary method is a method whose qualifier is :before, :after, ++or :around. Standard method combination allows no more than one ++qualifier per method; if a method definition specifies more than one ++qualifier per method, an error is signaled. ++ ++* ++ A before method has the keyword :before as its only qualifier. A ++ before method specifies code that is to be run before any primary ++ methods. ++ ++* ++ An after method has the keyword :after as its only qualifier. An ++ after method specifies code that is to be run after primary ++ methods. ++ ++* ++ An around method has the keyword :around as its only qualifier. An ++ around method specifies code that is to be run instead of other ++ applicable methods, but which might contain explicit code which ++ calls some of those shadowed methods (via call-next-method). ++ ++ The semantics of standard method combination is as follows: ++ ++* ++ If there are any around methods, the most specific around method is ++ called. It supplies the value or values of the generic function. ++ ++* ++ Inside the body of an around method, call-next-method can be used ++ to call the next method. When the next method returns, the around ++ method can execute more code, perhaps based on the returned value ++ or values. The generic function no-next-method is invoked if ++ call-next-method is used and there is no applicable method to call. ++ The function next-method-p may be used to determine whether a next ++ method exists. ++ ++* ++ If an around method invokes call-next-method, the next most ++ specific around method is called, if one is applicable. If there ++ are no around methods or if call-next-method is called by the least ++ specific around method, the other methods are called as follows: ++ ++ - ++ All the before methods are called, in most-specific-first ++ order. Their values are ignored. An error is signaled if ++ call-next-method is used in a before method. ++ ++ - ++ The most specific primary method is called. Inside the body ++ of a primary method, call-next-method may be used to call the ++ next most specific primary method. When that method returns, ++ the previous primary method can execute more code, perhaps ++ based on the returned value or values. The generic function ++ no-next-method is invoked if call-next-method is used and ++ there are no more applicable primary methods. The function ++ next-method-p may be used to determine whether a next method ++ exists. If call-next-method is not used, only the most ++ specific primary method is called. ++ ++ - ++ All the after methods are called in most-specific-last order. ++ Their values are ignored. An error is signaled if ++ call-next-method is used in an after method. ++ ++* ++ If no around methods were invoked, the most specific primary method ++ supplies the value or values returned by the generic function. The ++ value or values returned by the invocation of call-next-method in ++ the least specific around method are those returned by the most ++ specific primary method. ++ ++ In standard method combination, if there is an applicable method but ++no applicable primary method, an error is signaled. ++ ++ The before methods are run in most-specific-first order while the ++after methods are run in least-specific-first order. The design ++rationale for this difference can be illustrated with an example. ++Suppose class C_1 modifies the behavior of its superclass, C_2, by ++adding before methods and after methods. Whether the behavior of the ++class C_2 is defined directly by methods on C_2 or is inherited from its ++superclasses does not affect the relative order of invocation of methods ++on instances of the class C_1. Class C_1's before method runs before ++all of class C_2's methods. Class C_1's after method runs after all of ++class C_2's methods. ++ ++ By contrast, all around methods run before any other methods run. ++Thus a less specific around method runs before a more specific primary ++method. ++ ++ If only primary methods are used and if call-next-method is not used, ++only the most specific method is invoked; that is, more specific methods ++shadow more general ones. ++ ++ ++File: gcl.info, Node: Declarative Method Combination, Next: Built-in Method Combination Types, Prev: Standard Method Combination, Up: Method Selection and Combination ++ ++7.6.6.6 Declarative Method Combination ++...................................... ++ ++The macro define-method-combination defines new forms of method ++combination. It provides a mechanism for customizing the production of ++the effective method. The default procedure for producing an effective ++method is described in *note Determining the Effective Method::. There ++are two forms of define-method-combination. The short form is a simple ++facility while the long form is more powerful and more verbose. The ++long form resembles defmacro in that the body is an expression that ++computes a Lisp form; it provides mechanisms for implementing arbitrary ++control structures within method combination and for arbitrary ++processing of method qualifiers. ++ ++ ++File: gcl.info, Node: Built-in Method Combination Types, Prev: Declarative Method Combination, Up: Method Selection and Combination ++ ++7.6.6.7 Built-in Method Combination Types ++......................................... ++ ++The object system provides a set of built-in method combination types. ++To specify that a generic function is to use one of these method ++combination types, the name of the method combination type is given as ++the argument to the :method-combination option to defgeneric or to the ++:method-combination option to any of the other operators that specify ++generic function options. ++ ++ The names of the built-in method combination types are listed in ++Figure 7-3. ++ ++ + append max nconc progn ++ and list min or standard ++ ++ Figure 7-3: Built-in Method Combination Types ++ ++ ++ The semantics of the standard built-in method combination type is ++described in *note Standard Method Combination::. The other built-in ++method combination types are called simple built-in method combination ++types. ++ ++ The simple built-in method combination types act as though they were ++defined by the short form of define-method-combination. They recognize ++two roles for methods: ++ ++* ++ An around method has the keyword symbol :around as its sole ++ qualifier. The meaning of :around methods is the same as in ++ standard method combination. Use of the functions call-next-method ++ and next-method-p is supported in around methods. ++ ++* ++ A primary method has the name of the method combination type as its ++ sole qualifier. For example, the built-in method combination type ++ and recognizes methods whose sole qualifier is and; these are ++ primary methods. Use of the functions call-next-method and ++ next-method-p is not supported in primary methods. ++ ++ The semantics of the simple built-in method combination types is as ++follows: ++ ++* ++ If there are any around methods, the most specific around method is ++ called. It supplies the value or values of the generic function. ++ ++* ++ Inside the body of an around method, the function call-next-method ++ can be used to call the next method. The generic function ++ no-next-method is invoked if call-next-method is used and there is ++ no applicable method to call. The function next-method-p may be ++ used to determine whether a next method exists. When the next ++ method returns, the around method can execute more code, perhaps ++ based on the returned value or values. ++ ++* ++ If an around method invokes call-next-method, the next most ++ specific around method is called, if one is applicable. If there ++ are no around methods or if call-next-method is called by the least ++ specific around method, a Lisp form derived from the name of the ++ built-in method combination type and from the list of applicable ++ primary methods is evaluated to produce the value of the generic ++ function. Suppose the name of the method combination type is ++ operator and the call to the generic function is of the form ++ ++ (generic-function a_1... a_n) ++ ++ Let M_1,...,M_k be the applicable primary methods in order; then ++ the derived Lisp form is ++ ++ (operator < M_1 ++ a_1... a_n>...< M_k a_1... a_n>) ++ ++ If the expression < M_i a_1... a_n> is evaluated, the method M_i ++ will be applied to the arguments a_1... a_n. For example, if ++ operator is or, the expression < M_i a_1... a_n> is evaluated only ++ if < M_j a_1... a_n>, 1<= j keys, allow-other-keys-p ++ ++Method Signatures:: ++................... ++ ++'function-keywords' (method standard-method) ++ ++Arguments and Values:: ++...................... ++ ++method--a method. ++ ++ keys--a list. ++ ++ allow-other-keys-p--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns the keyword parameter specifiers for a method. ++ ++ Two values are returned: a list of the explicitly named keywords and ++a generalized boolean that states whether &allow-other-keys had been ++specified in the method definition. ++ ++Examples:: ++.......... ++ ++ (defmethod gf1 ((a integer) &optional (b 2) ++ &key (c 3) ((:dee d) 4) e ((eff f))) ++ (list a b c d e f)) ++ => # ++ (find-method #'gf1 '() (list (find-class 'integer))) ++ => # ++ (function-keywords *) ++ => (:C :DEE :E EFF), false ++ (defmethod gf2 ((a integer)) ++ (list a b c d e f)) ++ => # ++ (function-keywords (find-method #'gf1 '() (list (find-class 'integer)))) ++ => (), false ++ (defmethod gf3 ((a integer) &key b c d &allow-other-keys) ++ (list a b c d e f)) ++ (function-keywords *) ++ => (:B :C :D), true ++ ++Affected By:: ++............. ++ ++defmethod ++ ++See Also:: ++.......... ++ ++*note defmethod:: ++ ++ ++File: gcl.info, Node: ensure-generic-function, Next: allocate-instance, Prev: function-keywords, Up: Objects Dictionary ++ ++7.7.2 ensure-generic-function [Function] ++---------------------------------------- ++ ++'ensure-generic-function' function-name &key argument-precedence-order ++declare documentation environment generic-function-class lambda-list ++method-class method-combination ++=> generic-function ++ ++Arguments and Values:: ++...................... ++ ++function-name--a function name. ++ ++ The keyword arguments correspond to the option arguments of ++defgeneric, except that the :method-class and :generic-function-class ++arguments can be class objects as well as names. ++ ++ Method-combination - method combination object. ++ ++ Environment - the same as the &environment argument to macro ++expansion functions and is used to distinguish between compile-time and ++run-time environments. ++ ++ [Editorial Note by KMP: What about documentation. Missing from this ++arguments enumeration, and confusing in description below.] ++ ++ generic-function--a generic function object. ++ ++Description:: ++............. ++ ++The function ensure-generic-function is used to define a globally named ++generic function with no methods or to specify or modify options and ++declarations that pertain to a globally named generic function as a ++whole. ++ ++ If function-name is not fbound in the global environment, a new ++generic function is created. If ++ ++ (fdefinition function-name) ++ ++ is an ordinary function, a macro, or a special operator, an error is ++signaled. ++ ++ If function-name is a list, it must be of the form (setf symbol). If ++function-name specifies a generic function that has a different value ++for any of the following arguments, the generic function is modified to ++have the new value: :argument-precedence-order, :declare, ++:documentation, :method-combination. ++ ++ If function-name specifies a generic function that has a different ++value for the :lambda-list argument, and the new value is congruent with ++the lambda lists of all existing methods or there are no methods, the ++value is changed; otherwise an error is signaled. ++ ++ If function-name specifies a generic function that has a different ++value for the :generic-function-class argument and if the new generic ++function class is compatible with the old, change-class is called to ++change the class of the generic function; otherwise an error is ++signaled. ++ ++ If function-name specifies a generic function that has a different ++value for the :method-class argument, the value is changed, but any ++existing methods are not changed. ++ ++Affected By:: ++............. ++ ++Existing function binding of function-name. ++ ++Exceptional Situations:: ++........................ ++ ++If ++ ++ (fdefinition function-name) ++ ++ is an ordinary function, a macro, or a special operator, an error of ++type error is signaled. ++ ++ If function-name specifies a generic function that has a different ++value for the :lambda-list argument, and the new value is not congruent ++with the lambda list of any existing method, an error of type error is ++signaled. ++ ++ If function-name specifies a generic function that has a different ++value for the :generic-function-class argument and if the new generic ++function class not is compatible with the old, an error of type error is ++signaled. ++ ++See Also:: ++.......... ++ ++*note defgeneric:: ++ ++ ++File: gcl.info, Node: allocate-instance, Next: reinitialize-instance, Prev: ensure-generic-function, Up: Objects Dictionary ++ ++7.7.3 allocate-instance [Standard Generic Function] ++--------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'allocate-instance' class &rest initargs &key &allow-other-keys => ++new-instance ++ ++Method Signatures:: ++................... ++ ++'allocate-instance' (class standard-class) &rest initargs ++ ++ 'allocate-instance' (class structure-class) &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++class--a class. ++ ++ initargs--a list of keyword/value pairs (initialization argument ++names and values). ++ ++ new-instance--an object whose class is class. ++ ++Description:: ++............. ++ ++The generic function allocate-instance creates and returns a new ++instance of the class, without initializing it. When the class is a ++standard class, this means that the slots are unbound; when the class is ++a structure class, this means the slots' values are unspecified. ++ ++ The caller of allocate-instance is expected to have already checked ++the initialization arguments. ++ ++ The generic function allocate-instance is called by make-instance, as ++described in *note Object Creation and Initialization::. ++ ++See Also:: ++.......... ++ ++*note defclass:: , *note make-instance:: , *note class-of:: , *note ++Object Creation and Initialization:: ++ ++Notes:: ++....... ++ ++The consequences of adding methods to allocate-instance is unspecified. ++This capability might be added by the Metaobject Protocol. ++ ++ ++File: gcl.info, Node: reinitialize-instance, Next: shared-initialize, Prev: allocate-instance, Up: Objects Dictionary ++ ++7.7.4 reinitialize-instance [Standard Generic Function] ++------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'reinitialize-instance' instance &rest initargs &key &allow-other-keys ++=> instance ++ ++Method Signatures:: ++................... ++ ++'reinitialize-instance' (instance standard-object) &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++instance--an object. ++ ++ initargs--an initialization argument list. ++ ++Description:: ++............. ++ ++The generic function reinitialize-instance can be used to change the ++values of local slots of an instance according to initargs. This ++generic function can be called by users. ++ ++ The system-supplied primary method for reinitialize-instance checks ++the validity of initargs and signals an error if an initarg is supplied ++that is not declared as valid. The method then calls the generic ++function shared-initialize with the following arguments: the instance, ++nil (which means no slots should be initialized according to their ++initforms), and the initargs it received. ++ ++Side Effects:: ++.............. ++ ++The generic function reinitialize-instance changes the values of local ++slots. ++ ++Exceptional Situations:: ++........................ ++ ++The system-supplied primary method for reinitialize-instance signals an ++error if an initarg is supplied that is not declared as valid. ++ ++See Also:: ++.......... ++ ++*note Initialize-Instance:: , *note Shared-Initialize:: , *note ++update-instance-for-redefined-class:: , *note ++update-instance-for-different-class:: , *note slot-boundp:: , *note ++slot-makunbound:: , *note Reinitializing an Instance::, *note Rules for ++Initialization Arguments::, *note Declaring the Validity of ++Initialization Arguments:: ++ ++Notes:: ++....... ++ ++Initargs are declared as valid by using the :initarg option to defclass, ++or by defining methods for reinitialize-instance or shared-initialize. ++The keyword name of each keyword parameter specifier in the lambda list ++of any method defined on reinitialize-instance or shared-initialize is ++declared as a valid initialization argument name for all classes for ++which that method is applicable. ++ ++ ++File: gcl.info, Node: shared-initialize, Next: update-instance-for-different-class, Prev: reinitialize-instance, Up: Objects Dictionary ++ ++7.7.5 shared-initialize [Standard Generic Function] ++--------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'shared-initialize' instance slot-names &rest initargs &key ++&allow-other-keys => instance ++ ++Method Signatures:: ++................... ++ ++'shared-initialize' (instance standard-object) slot-names &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++instance--an object. ++ ++ slot-names--a list or t. ++ ++ initargs--a list of keyword/value pairs (of initialization argument ++names and values). ++ ++Description:: ++............. ++ ++The generic function shared-initialize is used to fill the slots of an ++instance using initargs and :initform forms. It is called when an ++instance is created, when an instance is re-initialized, when an ++instance is updated to conform to a redefined class, and when an ++instance is updated to conform to a different class. The generic ++function shared-initialize is called by the system-supplied primary ++method for initialize-instance, reinitialize-instance, ++update-instance-for-redefined-class, and ++update-instance-for-different-class. ++ ++ The generic function shared-initialize takes the following arguments: ++the instance to be initialized, a specification of a set of slot-names ++accessible in that instance, and any number of initargs. The arguments ++after the first two must form an initialization argument list. The ++system-supplied primary method on shared-initialize initializes the ++slots with values according to the initargs and supplied :initform ++forms. Slot-names indicates which slots should be initialized according ++to their :initform forms if no initargs are provided for those slots. ++ ++ The system-supplied primary method behaves as follows, regardless of ++whether the slots are local or shared: ++ ++* ++ If an initarg in the initialization argument list specifies a value ++ for that slot, that value is stored into the slot, even if a value ++ has already been stored in the slot before the method is run. ++ ++* ++ Any slots indicated by slot-names that are still unbound at this ++ point are initialized according to their :initform forms. For any ++ such slot that has an :initform form, that form is evaluated in the ++ lexical environment of its defining defclass form and the result is ++ stored into the slot. For example, if a before method stores a ++ value in the slot, the :initform form will not be used to supply a ++ value for the slot. ++ ++* ++ The rules mentioned in *note Rules for Initialization Arguments:: ++ are obeyed. ++ ++ The slots-names argument specifies the slots that are to be ++initialized according to their :initform forms if no initialization ++arguments apply. It can be a list of slot names, which specifies the ++set of those slot names; or it can be the symbol t, which specifies the ++set of all of the slots. ++ ++See Also:: ++.......... ++ ++*note Initialize-Instance:: , *note reinitialize-instance:: , *note ++update-instance-for-redefined-class:: , *note ++update-instance-for-different-class:: , *note slot-boundp:: , *note ++slot-makunbound:: , *note Object Creation and Initialization::, *note ++Rules for Initialization Arguments::, *note Declaring the Validity of ++Initialization Arguments:: ++ ++Notes:: ++....... ++ ++Initargs are declared as valid by using the :initarg option to defclass, ++or by defining methods for shared-initialize. The keyword name of each ++keyword parameter specifier in the lambda list of any method defined on ++shared-initialize is declared as a valid initarg name for all classes ++for which that method is applicable. ++ ++ Implementations are permitted to optimize :initform forms that ++neither produce nor depend on side effects, by evaluating these forms ++and storing them into slots before running any initialize-instance ++methods, rather than by handling them in the primary initialize-instance ++method. (This optimization might be implemented by having the ++allocate-instance method copy a prototype instance.) ++ ++ Implementations are permitted to optimize default initial value forms ++for initargs associated with slots by not actually creating the complete ++initialization argument list when the only method that would receive the ++complete list is the method on standard-object. In this case default ++initial value forms can be treated like :initform forms. This ++optimization has no visible effects other than a performance ++improvement. ++ ++ ++File: gcl.info, Node: update-instance-for-different-class, Next: update-instance-for-redefined-class, Prev: shared-initialize, Up: Objects Dictionary ++ ++7.7.6 update-instance-for-different-class [Standard Generic Function] ++--------------------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'update-instance-for-different-class' previous current &rest initargs ++&key &allow-other-keys => implementation-dependent ++ ++Method Signatures:: ++................... ++ ++'update-instance-for-different-class' (previous standard-object) ++(current standard-object) &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++previous--a copy of the original instance. ++ ++ current--the original instance (altered). ++ ++ initargs--an initialization argument list. ++ ++Description:: ++............. ++ ++The generic function update-instance-for-different-class is not intended ++to be called by programmers. Programmers may write methods for it. The ++function update-instance-for-different-class is called only by the ++function change-class. ++ ++ The system-supplied primary method on ++update-instance-for-different-class checks the validity of initargs and ++signals an error if an initarg is supplied that is not declared as ++valid. This method then initializes slots with values according to the ++initargs, and initializes the newly added slots with values according to ++their :initform forms. It does this by calling the generic function ++shared-initialize with the following arguments: the instance (current), ++a list of names of the newly added slots, and the initargs it received. ++Newly added slots are those local slots for which no slot of the same ++name exists in the previous class. ++ ++ Methods for update-instance-for-different-class can be defined to ++specify actions to be taken when an instance is updated. If only after ++methods for update-instance-for-different-class are defined, they will ++be run after the system-supplied primary method for initialization and ++therefore will not interfere with the default behavior of ++update-instance-for-different-class. ++ ++ Methods on update-instance-for-different-class can be defined to ++initialize slots differently from change-class. The default behavior of ++change-class is described in *note Changing the Class of an Instance::. ++ ++ The arguments to update-instance-for-different-class are computed by ++change-class. When change-class is invoked on an instance, a copy of ++that instance is made; change-class then destructively alters the ++original instance. The first argument to ++update-instance-for-different-class, previous, is that copy; it holds ++the old slot values temporarily. This argument has dynamic extent ++within change-class; if it is referenced in any way once ++update-instance-for-different-class returns, the results are undefined. ++The second argument to update-instance-for-different-class, current, is ++the altered original instance. The intended use of previous is to ++extract old slot values by using slot-value or with-slots or by invoking ++a reader generic function, or to run other methods that were applicable ++to instances of the original class. ++ ++Examples:: ++.......... ++ ++See the example for the function change-class. ++ ++Exceptional Situations:: ++........................ ++ ++The system-supplied primary method on ++update-instance-for-different-class signals an error if an ++initialization argument is supplied that is not declared as valid. ++ ++See Also:: ++.......... ++ ++*note change-class:: , *note Shared-Initialize:: , *note Changing the ++Class of an Instance::, *note Rules for Initialization Arguments::, ++*note Declaring the Validity of Initialization Arguments:: ++ ++Notes:: ++....... ++ ++Initargs are declared as valid by using the :initarg option to defclass, ++or by defining methods for update-instance-for-different-class or ++shared-initialize. The keyword name of each keyword parameter specifier ++in the lambda list of any method defined on ++update-instance-for-different-class or shared-initialize is declared as ++a valid initarg name for all classes for which that method is ++applicable. ++ ++ The value returned by update-instance-for-different-class is ignored ++by change-class. ++ ++ ++File: gcl.info, Node: update-instance-for-redefined-class, Next: change-class, Prev: update-instance-for-different-class, Up: Objects Dictionary ++ ++7.7.7 update-instance-for-redefined-class [Standard Generic Function] ++--------------------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'update-instance-for-redefined-class' instance added-slots ++discarded-slots property-list &rest initargs &key &allow-other-keys ++=> {result}* ++ ++Method Signatures:: ++................... ++ ++'update-instance-for-redefined-class' (instance standard-object) ++added-slots discarded-slots property-list &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++instance--an object. ++ ++ added-slots--a list. ++ ++ discarded-slots--a list. ++ ++ property-list--a list. ++ ++ initargs--an initialization argument list. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++The generic function update-instance-for-redefined-class is not intended ++to be called by programmers. Programmers may write methods for it. The ++generic function update-instance-for-redefined-class is called by the ++mechanism activated by make-instances-obsolete. ++ ++ The system-supplied primary method on ++update-instance-for-redefined-class checks the validity of initargs and ++signals an error if an initarg is supplied that is not declared as ++valid. This method then initializes slots with values according to the ++initargs, and initializes the newly added-slots with values according to ++their :initform forms. It does this by calling the generic function ++shared-initialize with the following arguments: the instance, a list of ++names of the newly added-slots to instance, and the initargs it ++received. Newly added-slots are those local slots for which no slot of ++the same name exists in the old version of the class. ++ ++ When make-instances-obsolete is invoked or when a class has been ++redefined and an instance is being updated, a property-list is created ++that captures the slot names and values of all the discarded-slots with ++values in the original instance. The structure of the instance is ++transformed so that it conforms to the current class definition. The ++arguments to update-instance-for-redefined-class are this transformed ++instance, a list of added-slots to the instance, a list discarded-slots ++from the instance, and the property-list containing the slot names and ++values for slots that were discarded and had values. Included in this ++list of discarded slots are slots that were local in the old class and ++are shared in the new class. ++ ++ The value returned by update-instance-for-redefined-class is ignored. ++ ++Examples:: ++.......... ++ ++ ++ (defclass position () ()) ++ ++ (defclass x-y-position (position) ++ ((x :initform 0 :accessor position-x) ++ (y :initform 0 :accessor position-y))) ++ ++ ;;; It turns out polar coordinates are used more than Cartesian ++ ;;; coordinates, so the representation is altered and some new ++ ;;; accessor methods are added. ++ ++ (defmethod update-instance-for-redefined-class :before ++ ((pos x-y-position) added deleted plist &key) ++ ;; Transform the x-y coordinates to polar coordinates ++ ;; and store into the new slots. ++ (let ((x (getf plist 'x)) ++ (y (getf plist 'y))) ++ (setf (position-rho pos) (sqrt (+ (* x x) (* y y))) ++ (position-theta pos) (atan y x)))) ++ ++ (defclass x-y-position (position) ++ ((rho :initform 0 :accessor position-rho) ++ (theta :initform 0 :accessor position-theta))) ++ ++ ;;; All instances of the old x-y-position class will be updated ++ ;;; automatically. ++ ++ ;;; The new representation is given the look and feel of the old one. ++ ++ (defmethod position-x ((pos x-y-position)) ++ (with-slots (rho theta) pos (* rho (cos theta)))) ++ ++ (defmethod (setf position-x) (new-x (pos x-y-position)) ++ (with-slots (rho theta) pos ++ (let ((y (position-y pos))) ++ (setq rho (sqrt (+ (* new-x new-x) (* y y))) ++ theta (atan y new-x)) ++ new-x))) ++ ++ (defmethod position-y ((pos x-y-position)) ++ (with-slots (rho theta) pos (* rho (sin theta)))) ++ ++ (defmethod (setf position-y) (new-y (pos x-y-position)) ++ (with-slots (rho theta) pos ++ (let ((x (position-x pos))) ++ (setq rho (sqrt (+ (* x x) (* new-y new-y))) ++ theta (atan new-y x)) ++ new-y))) ++ ++ ++Exceptional Situations:: ++........................ ++ ++The system-supplied primary method on ++update-instance-for-redefined-class signals an error if an initarg is ++supplied that is not declared as valid. ++ ++See Also:: ++.......... ++ ++*note make-instances-obsolete:: , *note Shared-Initialize:: , *note ++Redefining Classes::, *note Rules for Initialization Arguments::, *note ++Declaring the Validity of Initialization Arguments:: ++ ++Notes:: ++....... ++ ++Initargs are declared as valid by using the :initarg option to defclass, ++or by defining methods for update-instance-for-redefined-class or ++shared-initialize. The keyword name of each keyword parameter specifier ++in the lambda list of any method defined on ++update-instance-for-redefined-class or shared-initialize is declared as ++a valid initarg name for all classes for which that method is ++applicable. ++ ++ ++File: gcl.info, Node: change-class, Next: slot-boundp, Prev: update-instance-for-redefined-class, Up: Objects Dictionary ++ ++7.7.8 change-class [Standard Generic Function] ++---------------------------------------------- ++ ++Syntax:: ++........ ++ ++'change-class' instance new-class &key &allow-other-keys => instance ++ ++Method Signatures:: ++................... ++ ++'change-class' (instance standard-object) (new-class standard-class) ++&rest initargs ++ ++ 'change-class' (instance t) (new-class symbol) &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++instance--an object. ++ ++ new-class--a class designator. ++ ++ initargs--an initialization argument list. ++ ++Description:: ++............. ++ ++The generic function change-class changes the class of an instance to ++new-class. It destructively modifies and returns the instance. ++ ++ If in the old class there is any slot of the same name as a local ++slot in the new-class, the value of that slot is retained. This means ++that if the slot has a value, the value returned by slot-value after ++change-class is invoked is eql to the value returned by slot-value ++before change-class is invoked. Similarly, if the slot was unbound, it ++remains unbound. The other slots are initialized as described in *note ++Changing the Class of an Instance::. ++ ++ After completing all other actions, change-class invokes ++update-instance-for-different-class. The generic function ++update-instance-for-different-class can be used to assign values to ++slots in the transformed instance. ++ ++ See *note Initializing Newly Added Local Slots (Changing the Class of ++an Instance)::. ++ ++ If the second of the above methods is selected, that method invokes ++change-class on instance, (find-class new-class), and the initargs. ++ ++Examples:: ++.......... ++ ++ ++ (defclass position () ()) ++ ++ (defclass x-y-position (position) ++ ((x :initform 0 :initarg :x) ++ (y :initform 0 :initarg :y))) ++ ++ (defclass rho-theta-position (position) ++ ((rho :initform 0) ++ (theta :initform 0))) ++ ++ (defmethod update-instance-for-different-class :before ((old x-y-position) ++ (new rho-theta-position) ++ &key) ++ ;; Copy the position information from old to new to make new ++ ;; be a rho-theta-position at the same position as old. ++ (let ((x (slot-value old 'x)) ++ (y (slot-value old 'y))) ++ (setf (slot-value new 'rho) (sqrt (+ (* x x) (* y y))) ++ (slot-value new 'theta) (atan y x)))) ++ ++ ;;; At this point an instance of the class x-y-position can be ++ ;;; changed to be an instance of the class rho-theta-position using ++ ;;; change-class: ++ ++ (setq p1 (make-instance 'x-y-position :x 2 :y 0)) ++ ++ (change-class p1 'rho-theta-position) ++ ++ ;;; The result is that the instance bound to p1 is now an instance of ++ ;;; the class rho-theta-position. The update-instance-for-different-class ++ ;;; method performed the initialization of the rho and theta slots based ++ ;;; on the value of the x and y slots, which were maintained by ++ ;;; the old instance. ++ ++ ++See Also:: ++.......... ++ ++*note update-instance-for-different-class:: , *note Changing the Class ++of an Instance:: ++ ++Notes:: ++....... ++ ++The generic function change-class has several semantic difficulties. ++First, it performs a destructive operation that can be invoked within a ++method on an instance that was used to select that method. When ++multiple methods are involved because methods are being combined, the ++methods currently executing or about to be executed may no longer be ++applicable. Second, some implementations might use compiler ++optimizations of slot access, and when the class of an instance is ++changed the assumptions the compiler made might be violated. This ++implies that a programmer must not use change-class inside a method if ++any methods for that generic function access any slots, or the results ++are undefined. ++ ++ ++File: gcl.info, Node: slot-boundp, Next: slot-exists-p, Prev: change-class, Up: Objects Dictionary ++ ++7.7.9 slot-boundp [Function] ++---------------------------- ++ ++'slot-boundp' instance slot-name => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++instance--an object. ++ ++ slot-name--a symbol naming a slot of instance. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if the slot named slot-name in instance is bound; ++otherwise, returns false. ++ ++Exceptional Situations:: ++........................ ++ ++If no slot of the name slot-name exists in the instance, slot-missing is ++called as follows: ++ ++ (slot-missing (class-of instance) ++ instance ++ slot-name ++ 'slot-boundp) ++ ++ (If slot-missing is invoked and returns a value, a boolean equivalent ++to its primary value is returned by slot-boundp.) ++ ++ The specific behavior depends on instance's metaclass. An error is ++never signaled if instance has metaclass standard-class. An error is ++always signaled if instance has metaclass built-in-class. The ++consequences are undefined if instance has any other metaclass-an error ++might or might not be signaled in this situation. Note in particular ++that the behavior for conditions and structures is not specified. ++ ++See Also:: ++.......... ++ ++*note slot-makunbound:: , *note slot-missing:: ++ ++Notes:: ++....... ++ ++The function slot-boundp allows for writing after methods on ++initialize-instance in order to initialize only those slots that have ++not already been bound. ++ ++ Although no implementation is required to do so, implementors are ++strongly encouraged to implement the function slot-boundp using the ++function slot-boundp-using-class described in the Metaobject Protocol. ++ ++ ++File: gcl.info, Node: slot-exists-p, Next: slot-makunbound, Prev: slot-boundp, Up: Objects Dictionary ++ ++7.7.10 slot-exists-p [Function] ++------------------------------- ++ ++'slot-exists-p' object slot-name => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ slot-name--a symbol. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if the object has a slot named slot-name. ++ ++Affected By:: ++............. ++ ++defclass, defstruct ++ ++See Also:: ++.......... ++ ++*note defclass:: , *note slot-missing:: ++ ++Notes:: ++....... ++ ++Although no implementation is required to do so, implementors are ++strongly encouraged to implement the function slot-exists-p using the ++function slot-exists-p-using-class described in the Metaobject Protocol. ++ ++ ++File: gcl.info, Node: slot-makunbound, Next: slot-missing, Prev: slot-exists-p, Up: Objects Dictionary ++ ++7.7.11 slot-makunbound [Function] ++--------------------------------- ++ ++'slot-makunbound' instance slot-name => instance ++ ++Arguments and Values:: ++...................... ++ ++instance - instance. ++ ++ Slot-name--a symbol. ++ ++Description:: ++............. ++ ++The function slot-makunbound restores a slot of the name slot-name in an ++instance to the unbound state. ++ ++Exceptional Situations:: ++........................ ++ ++If no slot of the name slot-name exists in the instance, slot-missing is ++called as follows: ++ ++ (slot-missing (class-of instance) ++ instance ++ slot-name ++ 'slot-makunbound) ++ ++ (Any values returned by slot-missing in this case are ignored by ++slot-makunbound.) ++ ++ The specific behavior depends on instance's metaclass. An error is ++never signaled if instance has metaclass standard-class. An error is ++always signaled if instance has metaclass built-in-class. The ++consequences are undefined if instance has any other metaclass-an error ++might or might not be signaled in this situation. Note in particular ++that the behavior for conditions and structures is not specified. ++ ++See Also:: ++.......... ++ ++*note slot-boundp:: , *note slot-missing:: ++ ++Notes:: ++....... ++ ++Although no implementation is required to do so, implementors are ++strongly encouraged to implement the function slot-makunbound using the ++function slot-makunbound-using-class described in the Metaobject ++Protocol. ++ ++ ++File: gcl.info, Node: slot-missing, Next: slot-unbound, Prev: slot-makunbound, Up: Objects Dictionary ++ ++7.7.12 slot-missing [Standard Generic Function] ++----------------------------------------------- ++ ++Syntax:: ++........ ++ ++'slot-missing' class object slot-name operation &optional new-value => ++{result}* ++ ++Method Signatures:: ++................... ++ ++'slot-missing' (class t) object slot-name operation &optional new-value ++ ++Arguments and Values:: ++...................... ++ ++class--the class of object. ++ ++ object--an object. ++ ++ slot-name--a symbol (the name of a would-be slot). ++ ++ operation--one of the symbols setf, slot-boundp, slot-makunbound, or ++slot-value. ++ ++ new-value--an object. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++The generic function slot-missing is invoked when an attempt is made to ++access a slot in an object whose metaclass is standard-class and the ++slot of the name slot-name is not a name of a slot in that class. The ++default method signals an error. ++ ++ The generic function slot-missing is not intended to be called by ++programmers. Programmers may write methods for it. ++ ++ The generic function slot-missing may be called during evaluation of ++slot-value, (setf slot-value), slot-boundp, and slot-makunbound. For ++each of these operations the corresponding symbol for the operation ++argument is slot-value, setf, slot-boundp, and slot-makunbound ++respectively. ++ ++ The optional new-value argument to slot-missing is used when the ++operation is attempting to set the value of the slot. ++ ++ If slot-missing returns, its values will be treated as follows: ++ ++* ++ If the operation is setf or slot-makunbound, any values will be ++ ignored by the caller. ++ ++* ++ If the operation is slot-value, only the primary value will be used ++ by the caller, and all other values will be ignored. ++ ++* ++ If the operation is slot-boundp, any boolean equivalent of the ++ primary value of the method might be is used, and all other values ++ will be ignored. ++ ++Exceptional Situations:: ++........................ ++ ++The default method on slot-missing signals an error of type error. ++ ++See Also:: ++.......... ++ ++*note defclass:: , *note slot-exists-p:: , *note slot-value:: ++ ++Notes:: ++....... ++ ++The set of arguments (including the class of the instance) facilitates ++defining methods on the metaclass for slot-missing. ++ ++ ++File: gcl.info, Node: slot-unbound, Next: slot-value, Prev: slot-missing, Up: Objects Dictionary ++ ++7.7.13 slot-unbound [Standard Generic Function] ++----------------------------------------------- ++ ++Syntax:: ++........ ++ ++'slot-unbound' class instance slot-name => {result}* ++ ++Method Signatures:: ++................... ++ ++'slot-unbound' (class t) instance slot-name ++ ++Arguments and Values:: ++...................... ++ ++class--the class of the instance. ++ ++ instance--the instance in which an attempt was made to read the ++unbound slot. ++ ++ slot-name--the name of the unbound slot. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++The generic function slot-unbound is called when an unbound slot is read ++in an instance whose metaclass is standard-class. The default method ++signals an error ++ ++ of type unbound-slot. The name slot of the unbound-slot condition is ++initialized to the name of the offending variable, and the instance slot ++of the unbound-slot condition is initialized to the offending instance. ++ ++ The generic function slot-unbound is not intended to be called by ++programmers. Programmers may write methods for it. The function ++slot-unbound is called only indirectly by slot-value. ++ ++ If slot-unbound returns, only the primary value will be used by the ++caller, and all other values will be ignored. ++ ++Exceptional Situations:: ++........................ ++ ++The default method on slot-unbound signals an error of type ++unbound-slot. ++ ++See Also:: ++.......... ++ ++*note slot-makunbound:: ++ ++Notes:: ++....... ++ ++An unbound slot may occur if no :initform form was specified for the ++slot and the slot value has not been set, or if slot-makunbound has been ++called on the slot. ++ ++ ++File: gcl.info, Node: slot-value, Next: method-qualifiers, Prev: slot-unbound, Up: Objects Dictionary ++ ++7.7.14 slot-value [Function] ++---------------------------- ++ ++'slot-value' object slot-name => value ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ name--a symbol. ++ ++ value--an object. ++ ++Description:: ++............. ++ ++The function slot-value returns the value of the slot named slot-name in ++the object. If there is no slot named slot-name, slot-missing is ++called. If the slot is unbound, slot-unbound is called. ++ ++ The macro setf can be used with slot-value to change the value of a ++slot. ++ ++Examples:: ++.......... ++ ++ (defclass foo () ++ ((a :accessor foo-a :initarg :a :initform 1) ++ (b :accessor foo-b :initarg :b) ++ (c :accessor foo-c :initform 3))) ++ => # ++ (setq foo1 (make-instance 'foo :a 'one :b 'two)) ++ => # ++ (slot-value foo1 'a) => ONE ++ (slot-value foo1 'b) => TWO ++ (slot-value foo1 'c) => 3 ++ (setf (slot-value foo1 'a) 'uno) => UNO ++ (slot-value foo1 'a) => UNO ++ (defmethod foo-method ((x foo)) ++ (slot-value x 'a)) ++ => # ++ (foo-method foo1) => UNO ++ ++Exceptional Situations:: ++........................ ++ ++If an attempt is made to read a slot and no slot of the name slot-name ++exists in the object, slot-missing is called as follows: ++ ++ (slot-missing (class-of instance) ++ instance ++ slot-name ++ 'slot-value) ++ ++ (If slot-missing is invoked, its primary value is returned by ++slot-value.) ++ ++ If an attempt is made to write a slot and no slot of the name ++slot-name exists in the object, slot-missing is called as follows: ++ ++ (slot-missing (class-of instance) ++ instance ++ slot-name ++ 'setf ++ new-value) ++ ++ (If slot-missing returns in this case, any values are ignored.) ++ ++ The specific behavior depends on object's metaclass. An error is ++never signaled if object has metaclass standard-class. An error is ++always signaled if object has metaclass built-in-class. The ++consequences are unspecified if object has any other metaclass-an error ++might or might not be signaled in this situation. Note in particular ++that the behavior for conditions and structures is not specified. ++ ++See Also:: ++.......... ++ ++*note slot-missing:: , *note slot-unbound:: , *note with-slots:: ++ ++Notes:: ++....... ++ ++Although no implementation is required to do so, implementors are ++strongly encouraged to implement the function slot-value using the ++function slot-value-using-class described in the Metaobject Protocol. ++ ++ Implementations may optimize slot-value by compiling it inline. ++ ++ ++File: gcl.info, Node: method-qualifiers, Next: no-applicable-method, Prev: slot-value, Up: Objects Dictionary ++ ++7.7.15 method-qualifiers [Standard Generic Function] ++---------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'method-qualifiers' method => qualifiers ++ ++Method Signatures:: ++................... ++ ++'method-qualifiers' (method standard-method) ++ ++Arguments and Values:: ++...................... ++ ++method--a method. ++ ++ qualifiers--a proper list. ++ ++Description:: ++............. ++ ++Returns a list of the qualifiers of the method. ++ ++Examples:: ++.......... ++ ++ (defmethod some-gf :before ((a integer)) a) ++ => # ++ (method-qualifiers *) => (:BEFORE) ++ ++See Also:: ++.......... ++ ++*note define-method-combination:: ++ ++ ++File: gcl.info, Node: no-applicable-method, Next: no-next-method, Prev: method-qualifiers, Up: Objects Dictionary ++ ++7.7.16 no-applicable-method [Standard Generic Function] ++------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'no-applicable-method' generic-function &rest function-arguments => ++{result}* ++ ++Method Signatures:: ++................... ++ ++'no-applicable-method' (generic-function t) &rest function-arguments ++ ++Arguments and Values:: ++...................... ++ ++generic-function--a generic function on which no applicable method was ++found. ++ ++ function-arguments--arguments to the generic-function. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++The generic function no-applicable-method is called when a generic ++function is invoked and no method on that generic function is ++applicable. The default method signals an error. ++ ++ The generic function no-applicable-method is not intended to be ++called by programmers. Programmers may write methods for it. ++ ++Exceptional Situations:: ++........................ ++ ++The default method signals an error of type error. ++ ++See Also:: ++.......... ++ ++ ++File: gcl.info, Node: no-next-method, Next: remove-method, Prev: no-applicable-method, Up: Objects Dictionary ++ ++7.7.17 no-next-method [Standard Generic Function] ++------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'no-next-method' generic-function method &rest args => {result}* ++ ++Method Signatures:: ++................... ++ ++'no-next-method' (generic-function standard-generic-function) (method ++standard-method) &rest args ++ ++Arguments and Values:: ++...................... ++ ++generic-function - generic function to which method belongs. ++ ++ method - method that contained the call to call-next-method for which ++there is no next method. ++ ++ args - arguments to call-next-method. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++The generic function no-next-method is called by call-next-method when ++there is no next method. ++ ++ The generic function no-next-method is not intended to be called by ++programmers. Programmers may write methods for it. ++ ++Exceptional Situations:: ++........................ ++ ++The system-supplied method on no-next-method signals an error of type ++error. [Editorial Note by KMP: perhaps control-error??] ++ ++See Also:: ++.......... ++ ++*note call-next-method:: ++ ++ ++File: gcl.info, Node: remove-method, Next: make-instance, Prev: no-next-method, Up: Objects Dictionary ++ ++7.7.18 remove-method [Standard Generic Function] ++------------------------------------------------ ++ ++Syntax:: ++........ ++ ++'remove-method' generic-function method => generic-function ++ ++Method Signatures:: ++................... ++ ++'remove-method' (generic-function standard-generic-function) method ++ ++Arguments and Values:: ++...................... ++ ++generic-function--a generic function. ++ ++ method--a method. ++ ++Description:: ++............. ++ ++The generic function remove-method removes a method from ++generic-function by modifying the generic-function (if necessary). ++ ++ remove-method must not signal an error if the method is not one of ++the methods on the generic-function. ++ ++See Also:: ++.......... ++ ++*note find-method:: ++ ++ ++File: gcl.info, Node: make-instance, Next: make-instances-obsolete, Prev: remove-method, Up: Objects Dictionary ++ ++7.7.19 make-instance [Standard Generic Function] ++------------------------------------------------ ++ ++Syntax:: ++........ ++ ++'make-instance' class &rest initargs &key &allow-other-keys => instance ++ ++Method Signatures:: ++................... ++ ++'make-instance' (class standard-class) &rest initargs ++ ++ 'make-instance' (class symbol) &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++class--a class, or a symbol that names a class. ++ ++ initargs--an initialization argument list. ++ ++ instance--a fresh instance of class class. ++ ++Description:: ++............. ++ ++The generic function make-instance creates and returns a new instance of ++the given class. ++ ++ If the second of the above methods is selected, that method invokes ++make-instance on the arguments (find-class class) and initargs. ++ ++ The initialization arguments are checked within make-instance. ++ ++ The generic function make-instance may be used as described in *note ++Object Creation and Initialization::. ++ ++Exceptional Situations:: ++........................ ++ ++If any of the initialization arguments has not been declared as valid, ++an error of type error is signaled. ++ ++See Also:: ++.......... ++ ++*note defclass:: , *note class-of:: , *note allocate-instance:: , *note ++Initialize-Instance:: , *note Object Creation and Initialization:: ++ ++ ++File: gcl.info, Node: make-instances-obsolete, Next: make-load-form, Prev: make-instance, Up: Objects Dictionary ++ ++7.7.20 make-instances-obsolete [Standard Generic Function] ++---------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'make-instances-obsolete' class => class ++ ++Method Signatures:: ++................... ++ ++'make-instances-obsolete' (class standard-class) ++ ++ 'make-instances-obsolete' (class symbol) ++ ++Arguments and Values:: ++...................... ++ ++class--a class designator. ++ ++Description:: ++............. ++ ++The function make-instances-obsolete has the effect of initiating the ++process of updating the instances of the class. During updating, the ++generic function update-instance-for-redefined-class will be invoked. ++ ++ The generic function make-instances-obsolete is invoked automatically ++by the system when defclass has been used to redefine an existing ++standard class and the set of local slots accessible in an instance is ++changed or the order of slots in storage is changed. It can also be ++explicitly invoked by the user. ++ ++ If the second of the above methods is selected, that method invokes ++make-instances-obsolete on (find-class class). ++ ++Examples:: ++.......... ++ ++See Also:: ++.......... ++ ++*note update-instance-for-redefined-class:: , *note Redefining Classes:: ++ ++ ++File: gcl.info, Node: make-load-form, Next: make-load-form-saving-slots, Prev: make-instances-obsolete, Up: Objects Dictionary ++ ++7.7.21 make-load-form [Standard Generic Function] ++------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'make-load-form' object &optional environment => creation-form [, ++initialization-form ] ++ ++Method Signatures:: ++................... ++ ++'make-load-form' (object standard-object) &optional environment ++ ++ 'make-load-form' (object structure-object) &optional environment ++ ++ 'make-load-form' (object condition) &optional environment ++ ++ 'make-load-form' (object class) &optional environment ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ environment--an environment object. ++ ++ creation-form--a form. ++ ++ initialization-form--a form. ++ ++Description:: ++............. ++ ++The generic function make-load-form creates and returns one or two ++forms, a creation-form and an initialization-form, that enable load to ++construct an object equivalent to object. Environment is an environment ++object corresponding to the lexical environment in which the forms will ++be processed. ++ ++ The file compiler calls make-load-form to process certain classes of ++literal objects; see *note Additional Constraints on Externalizable ++Objects::. ++ ++ Conforming programs may call make-load-form directly, providing ++object is a generalized instance of standard-object, structure-object, ++or condition. ++ ++ The creation form is a form that, when evaluated at load time, should ++return an object that is equivalent to object. The exact meaning of ++equivalent depends on the type of object and is up to the programmer who ++defines a method for make-load-form; see *note Literal Objects in ++Compiled Files::. ++ ++ The initialization form is a form that, when evaluated at load time, ++should perform further initialization of the object. The value returned ++by the initialization form is ignored. If make-load-form returns only ++one value, the initialization form is nil, which has no effect. If ++object appears as a constant in the initialization form, at load time it ++will be replaced by the equivalent object constructed by the creation ++form; this is how the further initialization gains access to the object. ++ ++ Both the creation-form and the initialization-form may contain ++references to any externalizable object. However, there must not be any ++circular dependencies in creation forms. An example of a circular ++dependency is when the creation form for the object X contains a ++reference to the object Y, and the creation form for the object Y ++contains a reference to the object X. Initialization forms are not ++subject to any restriction against circular dependencies, which is the ++reason that initialization forms exist; see the example of circular data ++structures below. ++ ++ The creation form for an object is always evaluated before the ++initialization form for that object. When either the creation form or ++the initialization form references other objects that have not been ++referenced earlier in the file being compiled, the compiler ensures that ++all of the referenced objects have been created before evaluating the ++referencing form. When the referenced object is of a type which the ++file compiler processes using make-load-form, this involves evaluating ++the creation form returned for it. (This is the reason for the ++prohibition against circular references among creation forms). ++ ++ Each initialization form is evaluated as soon as possible after its ++associated creation form, as determined by data flow. If the ++initialization form for an object does not reference any other objects ++not referenced earlier in the file and processed by the file compiler ++using make-load-form, the initialization form is evaluated immediately ++after the creation form. If a creation or initialization form F does ++contain references to such objects, the creation forms for those other ++objects are evaluated before F, and the initialization forms for those ++other objects are also evaluated before F whenever they do not depend on ++the object created or initialized by F. Where these rules do not ++uniquely determine an order of evaluation between two ++creation/initialization forms, the order of evaluation is unspecified. ++ ++ While these creation and initialization forms are being evaluated, ++the objects are possibly in an uninitialized state, analogous to the ++state of an object between the time it has been created by ++allocate-instance and it has been processed fully by ++initialize-instance. Programmers writing methods for make-load-form ++must take care in manipulating objects not to depend on slots that have ++not yet been initialized. ++ ++ It is implementation-dependent whether load calls eval on the forms ++or does some other operation that has an equivalent effect. For ++example, the forms might be translated into different but equivalent ++forms and then evaluated, they might be compiled and the resulting ++functions called by load, or they might be interpreted by a ++special-purpose function different from eval. All that is required is ++that the effect be equivalent to evaluating the forms. ++ ++ The method specialized on class returns a creation form using the ++name of the class if the class has a proper name in environment, ++signaling an error of type error if it does not have a proper name. ++Evaluation of the creation form uses the name to find the class with ++that name, as if by calling find-class. If a class with that name has ++not been defined, then a class may be computed in an ++implementation-defined manner. If a class cannot be returned as the ++result of evaluating the creation form, then an error of type error is ++signaled. ++ ++ Both conforming implementations and conforming programs may further ++specialize make-load-form. ++ ++Examples:: ++.......... ++ ++ (defclass obj () ++ ((x :initarg :x :reader obj-x) ++ (y :initarg :y :reader obj-y) ++ (dist :accessor obj-dist))) ++ => # ++ (defmethod shared-initialize :after ((self obj) slot-names &rest keys) ++ (declare (ignore slot-names keys)) ++ (unless (slot-boundp self 'dist) ++ (setf (obj-dist self) ++ (sqrt (+ (expt (obj-x self) 2) (expt (obj-y self) 2)))))) ++ => # ++ (defmethod make-load-form ((self obj) &optional environment) ++ (declare (ignore environment)) ++ ;; Note that this definition only works because X and Y do not ++ ;; contain information which refers back to the object itself. ++ ;; For a more general solution to this problem, see revised example below. ++ `(make-instance ',(class-of self) ++ :x ',(obj-x self) :y ',(obj-y self))) ++ => # ++ (setq obj1 (make-instance 'obj :x 3.0 :y 4.0)) => # ++ (obj-dist obj1) => 5.0 ++ (make-load-form obj1) => (MAKE-INSTANCE 'OBJ :X '3.0 :Y '4.0) ++ ++ In the above example, an equivalent instance of obj is reconstructed ++by using the values of two of its slots. The value of the third slot is ++derived from those two values. ++ ++ Another way to write the make-load-form method in that example is to ++use make-load-form-saving-slots. The code it generates might yield a ++slightly different result from the make-load-form method shown above, ++but the operational effect will be the same. For example: ++ ++ ;; Redefine method defined above. ++ (defmethod make-load-form ((self obj) &optional environment) ++ (make-load-form-saving-slots self ++ :slot-names '(x y) ++ :environment environment)) ++ => # ++ ;; Try MAKE-LOAD-FORM on object created above. ++ (make-load-form obj1) ++ => (ALLOCATE-INSTANCE '#), ++ (PROGN ++ (SETF (SLOT-VALUE '# 'X) '3.0) ++ (SETF (SLOT-VALUE '# 'Y) '4.0) ++ (INITIALIZE-INSTANCE '#)) ++ ++ In the following example, instances of my-frob are "interned" in some ++way. An equivalent instance is reconstructed by using the value of the ++name slot as a key for searching existing objects. In this case the ++programmer has chosen to create a new object if no existing object is ++found; alternatively an error could have been signaled in that case. ++ ++ (defclass my-frob () ++ ((name :initarg :name :reader my-name))) ++ (defmethod make-load-form ((self my-frob) &optional environment) ++ (declare (ignore environment)) ++ `(find-my-frob ',(my-name self) :if-does-not-exist :create)) ++ ++ In the following example, the data structure to be dumped is ++circular, because each parent has a list of its children and each child ++has a reference back to its parent. If make-load-form is called on one ++object in such a structure, the creation form creates an equivalent ++object and fills in the children slot, which forces creation of ++equivalent objects for all of its children, grandchildren, etc. At this ++point none of the parent slots have been filled in. The initialization ++form fills in the parent slot, which forces creation of an equivalent ++object for the parent if it was not already created. Thus the entire ++tree is recreated at load time. At compile time, make-load-form is ++called once for each object in the tree. All of the creation forms are ++evaluated, in implementation-dependent order, and then all of the ++initialization forms are evaluated, also in implementation-dependent ++order. ++ ++ (defclass tree-with-parent () ((parent :accessor tree-parent) ++ (children :initarg :children))) ++ (defmethod make-load-form ((x tree-with-parent) &optional environment) ++ (declare (ignore environment)) ++ (values ++ ;; creation form ++ `(make-instance ',(class-of x) :children ',(slot-value x 'children)) ++ ;; initialization form ++ `(setf (tree-parent ',x) ',(slot-value x 'parent)))) ++ ++ In the following example, the data structure to be dumped has no ++special properties and an equivalent structure can be reconstructed ++simply by reconstructing the slots' contents. ++ ++ (defstruct my-struct a b c) ++ (defmethod make-load-form ((s my-struct) &optional environment) ++ (make-load-form-saving-slots s :environment environment)) ++ ++Exceptional Situations:: ++........................ ++ ++The methods specialized on standard-object, structure-object, and ++condition all signal an error of type error. ++ ++ It is implementation-dependent whether calling make-load-form on a ++generalized instance of a system class signals an error or returns ++creation and initialization forms. ++ ++See Also:: ++.......... ++ ++*note compile-file:: , *note make-load-form-saving-slots:: , *note ++Additional Constraints on Externalizable Objects:: *note Evaluation::, ++*note Compilation:: ++ ++Notes:: ++....... ++ ++The file compiler calls make-load-form in specific circumstances ++detailed in *note Additional Constraints on Externalizable Objects::. ++ ++ Some implementations may provide facilities for defining new ++subclasses of classes which are specified as system classes. (Some ++likely candidates include generic-function, method, and stream). Such ++implementations should document how the file compiler processes ++instances of such classes when encountered as literal objects, and ++should document any relevant methods for make-load-form. ++ ++ ++File: gcl.info, Node: make-load-form-saving-slots, Next: with-accessors, Prev: make-load-form, Up: Objects Dictionary ++ ++7.7.22 make-load-form-saving-slots [Function] ++--------------------------------------------- ++ ++'make-load-form-saving-slots' object &key slot-names environment ++=> creation-form, initialization-form ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ slot-names--a list. ++ ++ environment--an environment object. ++ ++ creation-form--a form. ++ ++ initialization-form--a form. ++ ++Description:: ++............. ++ ++Returns forms that, when evaluated, will construct an object equivalent ++to object, without executing initialization forms. The slots in the new ++object that correspond to initialized slots in object are initialized ++using the values from object. Uninitialized slots in object are not ++initialized in the new object. make-load-form-saving-slots works for ++any instance of standard-object or structure-object. ++ ++ Slot-names is a list of the names of the slots to preserve. If ++slot-names is not supplied, its value is all of the local slots. ++ ++ make-load-form-saving-slots returns two values, thus it can deal with ++circular structures. Whether the result is useful in an application ++depends on whether the object's type and slot contents fully capture the ++application's idea of the object's state. ++ ++ Environment is the environment in which the forms will be processed. ++ ++See Also:: ++.......... ++ ++*note make-load-form:: , *note make-instance:: , *note setf:: , *note ++slot-value:: , *note slot-makunbound:: ++ ++Notes:: ++....... ++ ++make-load-form-saving-slots can be useful in user-written make-load-form ++methods. ++ ++ When the object is an instance of standard-object, ++make-load-form-saving-slots could return a creation form that calls ++allocate-instance and an initialization form that contains calls to setf ++of slot-value and slot-makunbound, though other functions of similar ++effect might actually be used. ++ ++ ++File: gcl.info, Node: with-accessors, Next: with-slots, Prev: make-load-form-saving-slots, Up: Objects Dictionary ++ ++7.7.23 with-accessors [Macro] ++----------------------------- ++ ++'with-accessors' ({slot-entry}*) instance-form {declaration}* {form}* ++=> {result}* ++ ++ slot-entry ::=(variable-name accessor-name ) ++ ++Arguments and Values:: ++...................... ++ ++variable-name--a variable name; not evaluated. ++ ++ accessor-name--a function name; not evaluated. ++ ++ instance-form--a form; evaluated. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++Creates a lexical environment in which the slots specified by slot-entry ++are lexically available through their accessors as if they were ++variables. The macro with-accessors invokes the appropriate accessors ++to access the slots specified by slot-entry. Both setf and setq can be ++used to set the value of the slot. ++ ++Examples:: ++.......... ++ ++ (defclass thing () ++ ((x :initarg :x :accessor thing-x) ++ (y :initarg :y :accessor thing-y))) ++ => # ++ (defmethod (setf thing-x) :before (new-x (thing thing)) ++ (format t "~&Changing X from ~D to ~D in ~S.~ ++ (thing-x thing) new-x thing)) ++ (setq thing1 (make-instance 'thing :x 1 :y 2)) => # ++ (setq thing2 (make-instance 'thing :x 7 :y 8)) => # ++ (with-accessors ((x1 thing-x) (y1 thing-y)) ++ thing1 ++ (with-accessors ((x2 thing-x) (y2 thing-y)) ++ thing2 ++ (list (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setq x1 (+ y1 x2)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setf (thing-x thing2) (list x1)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2))))) ++ |> Changing X from 1 to 9 in #. ++ |> Changing X from 7 to (9) in #. ++ => ((1 1 2 2 7 7 8 8) ++ 9 ++ (9 9 2 2 7 7 8 8) ++ (9) ++ (9 9 2 2 (9) (9) 8 8)) ++ ++Affected By:: ++............. ++ ++defclass ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if any accessor-name is not the name of ++an accessor for the instance. ++ ++See Also:: ++.......... ++ ++*note with-slots:: , *note symbol-macrolet:: ++ ++Notes:: ++....... ++ ++A with-accessors expression of the form: ++ ++ ++ (with-accessors (slot-entry_1 ...slot-entry_n) instance-form form_1 ...form_k) ++ ++ ++expands into the equivalent of ++ ++ ++ (let ((in instance-form)) ++ ++ (symbol-macrolet (Q_1... Q_n) form_1 ...form_k)) ++ ++ ++where Q_i is ++ ++ (variable-name_i () ++ (accessor-name_i in)) ++ ++ ++File: gcl.info, Node: with-slots, Next: defclass, Prev: with-accessors, Up: Objects Dictionary ++ ++7.7.24 with-slots [Macro] ++------------------------- ++ ++'with-slots' ({slot-entry}*) instance-form {declaration}* {form}* ++=> {result}* ++ ++ slot-entry ::=slot-name | (variable-name slot-name) ++ ++Arguments and Values:: ++...................... ++ ++slot-name--a slot name; not evaluated. ++ ++ variable-name--a variable name; not evaluated. ++ ++ instance-form--a form; evaluted to produce instance. ++ ++ instance--an object. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++The macro with-slots establishes a lexical environment for referring to ++the slots in the instance named by the given slot-names as though they ++were variables. Within such a context the value of the slot can be ++specified by using its slot name, as if it were a lexically bound ++variable. Both setf and setq can be used to set the value of the slot. ++ ++ The macro with-slots translates an appearance of the slot name as a ++variable into a call to slot-value. ++ ++Examples:: ++.......... ++ ++ (defclass thing () ++ ((x :initarg :x :accessor thing-x) ++ (y :initarg :y :accessor thing-y))) ++ => # ++ (defmethod (setf thing-x) :before (new-x (thing thing)) ++ (format t "~&Changing X from ~D to ~D in ~S.~ ++ (thing-x thing) new-x thing)) ++ (setq thing (make-instance 'thing :x 0 :y 1)) => # ++ (with-slots (x y) thing (incf x) (incf y)) => 2 ++ (values (thing-x thing) (thing-y thing)) => 1, 2 ++ (setq thing1 (make-instance 'thing :x 1 :y 2)) => # ++ (setq thing2 (make-instance 'thing :x 7 :y 8)) => # ++ (with-slots ((x1 x) (y1 y)) ++ thing1 ++ (with-slots ((x2 x) (y2 y)) ++ thing2 ++ (list (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setq x1 (+ y1 x2)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2)) ++ (setf (thing-x thing2) (list x1)) ++ (list x1 (thing-x thing1) y1 (thing-y thing1) ++ x2 (thing-x thing2) y2 (thing-y thing2))))) ++ |> Changing X from 7 to (9) in #. ++ => ((1 1 2 2 7 7 8 8) ++ 9 ++ (9 9 2 2 7 7 8 8) ++ (9) ++ (9 9 2 2 (9) (9) 8 8)) ++ ++Affected By:: ++............. ++ ++defclass ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if any slot-name is not the name of a ++slot in the instance. ++ ++See Also:: ++.......... ++ ++*note with-accessors:: , *note slot-value:: , *note symbol-macrolet:: ++ ++Notes:: ++....... ++ ++A with-slots expression of the form: ++ ++ ++ (with-slots (slot-entry_1 ...slot-entry_n) instance-form form_1 ...form_k) ++ ++ ++expands into the equivalent of ++ ++ ++ (let ((in instance-form)) ++ ++ (symbol-macrolet (Q_1... Q_n) form_1 ...form_k)) ++ ++ ++where Q_i is ++ ++ (slot-entry_i () ++ (slot-value in 'slot-entry_i)) ++ ++if slot-entry_i is a symbol and is ++ ++ (variable-name_i () ++ (slot-value in 'slot-name_i)) ++ ++if slot-entry_i is of the form ++ ++ (variable-name_i ++ slot-name_i) ++ ++ ++File: gcl.info, Node: defclass, Next: defgeneric, Prev: with-slots, Up: Objects Dictionary ++ ++7.7.25 defclass [Macro] ++----------------------- ++ ++'defclass' class-name ({superclass-name}*) ({slot-specifier}*) ++[[!class-option]] ++=> new-class ++ ++ slot-specifier::=slot-name | (slot-name [[!slot-option]]) ++ ++ slot-name::= symbol ++ ++ slot-option::={:reader reader-function-name}* | ++ {:writer writer-function-name}* | ++ {:accessor reader-function-name}* | ++ {:allocation allocation-type} | ++ {:initarg initarg-name}* | ++ {:initform form} | ++ {:type type-specifier} | ++ {:documentation string} ++ ++ function-name::= {symbol | (setf symbol)} ++ ++ class-option::=(:default-initargs . initarg-list) | ++ (:documentation string) | ++ (:metaclass class-name) ++ ++Arguments and Values:: ++...................... ++ ++Class-name--a non-nil symbol. ++ ++ Superclass-name-a non-nil symbol. ++ ++ Slot-name-a symbol. The slot-name argument is a symbol that is ++syntactically valid for use as a variable name. ++ ++ Reader-function-name--a non-nil symbol. :reader can be supplied more ++than once for a given slot. ++ ++ Writer-function-name--a generic function name. :writer can be ++supplied more than once for a given slot. ++ ++ Reader-function-name--a non-nil symbol. :accessor can be supplied ++more than once for a given slot. ++ ++ Allocation-type--(member :instance :class). :allocation can be ++supplied once at most for a given slot. ++ ++ Initarg-name--a symbol. :initarg can be supplied more than once for ++a given slot. ++ ++ Form--a form. :init-form can be supplied once at most for a given ++slot. ++ ++ Type-specifier--a type specifier. :type can be supplied once at most ++for a given slot. ++ ++ Class-option-- refers to the class as a whole or to all class slots. ++ ++ Initarg-list--a list of alternating initialization argument names and ++default initial value forms. :default-initargs can be supplied at most ++once. ++ ++ Class-name--a non-nil symbol. :metaclass can be supplied once at ++most. ++ ++ new-class--the new class object. ++ ++Description:: ++............. ++ ++The macro defclass defines a new named class. It returns the new class ++object as its result. ++ ++ The syntax of defclass provides options for specifying initialization ++arguments for slots, for specifying default initialization values for ++slots, and for requesting that methods on specified generic functions be ++automatically generated for reading and writing the values of slots. No ++reader or writer functions are defined by default; their generation must ++be explicitly requested. However, slots can always be accessed using ++slot-value. ++ ++ Defining a new class also causes a type of the same name to be ++defined. The predicate (typep object class-name) returns true if the ++class of the given object is the class named by class-name itself or a ++subclass of the class class-name. A class object can be used as a type ++specifier. Thus (typep object class) returns true if the class of the ++object is class itself or a subclass of class. ++ ++ The class-name argument specifies the proper name of the new class. ++If a class with the same proper name already exists and that class is an ++instance of standard-class, and if the defclass form for the definition ++of the new class specifies a class of class standard-class, the existing ++class is redefined, and instances of it (and its subclasses) are updated ++to the new definition at the time that they are next accessed. For ++details, see *note Redefining Classes::. ++ ++ Each superclass-name argument specifies a direct superclass of the ++new class. If the superclass list is empty, then the superclass ++defaults depending on the metaclass, with standard-object being the ++default for standard-class. ++ ++ The new class will inherit slots and methods from each of its direct ++superclasses, from their direct superclasses, and so on. For a ++discussion of how slots and methods are inherited, see *note ++Inheritance::. ++ ++ The following slot options are available: ++ ++* ++ The :reader slot option specifies that an unqualified method is to ++ be defined on the generic function named reader-function-name to ++ read the value of the given slot. ++ ++* ++ The :writer slot option specifies that an unqualified method is to ++ be defined on the generic function named writer-function-name to ++ write the value of the slot. ++ ++* ++ The :accessor slot option specifies that an unqualified method is ++ to be defined on the generic function named reader-function-name to ++ read the value of the given slot and that an unqualified method is ++ to be defined on the generic function named (setf ++ reader-function-name) to be used with setf to modify the value of ++ the slot. ++ ++* ++ The :allocation slot option is used to specify where storage is to ++ be allocated for the given slot. Storage for a slot can be located ++ in each instance or in the class object itself. The value of the ++ allocation-type argument can be either the keyword :instance or the ++ keyword :class. If the :allocation slot option is not specified, ++ the effect is the same as specifying :allocation :instance. ++ ++ - ++ If allocation-type is :instance, a local slot of the name ++ slot-name is allocated in each instance of the class. ++ ++ - ++ If allocation-type is :class, a shared slot of the given name ++ is allocated in the class object created by this defclass ++ form. The value of the slot is shared by all instances of the ++ class. If a class C_1 defines such a shared slot, any ++ subclass C_2 of C_1 will share this single slot unless the ++ defclass form for C_2 specifies a slot of the same name or ++ there is a superclass of C_2 that precedes C_1 in the class ++ precedence list of C_2 and that defines a slot of the same ++ name. ++ ++* ++ The :initform slot option is used to provide a default initial ++ value form to be used in the initialization of the slot. This form ++ is evaluated every time it is used to initialize the slot. The ++ lexical environment in which this form is evaluated is the lexical ++ environment in which the defclass form was evaluated. Note that ++ the lexical environment refers both to variables and to functions. ++ For local slots, the dynamic environment is the dynamic environment ++ in which make-instance is called; for shared slots, the dynamic ++ environment is the dynamic environment in which the defclass form ++ was evaluated. See *note Object Creation and Initialization::. ++ ++ No implementation is permitted to extend the syntax of defclass to ++ allow (slot-name form) as an abbreviation for (slot-name :initform ++ form). ++ ++ [Reviewer Note by Barmar: Can you extend this to mean something ++ else?] ++ ++* ++ The :initarg slot option declares an initialization argument named ++ initarg-name and specifies that this initialization argument ++ initializes the given slot. If the initialization argument has a ++ value in the call to initialize-instance, the value will be stored ++ into the given slot, and the slot's :initform slot option, if any, ++ is not evaluated. If none of the initialization arguments ++ specified for a given slot has a value, the slot is initialized ++ according to the :initform slot option, if specified. ++ ++* ++ The :type slot option specifies that the contents of the slot will ++ always be of the specified data type. It effectively declares the ++ result type of the reader generic function when applied to an ++ object of this class. The consequences of attempting to store in a ++ slot a value that does not satisfy the type of the slot are ++ undefined. The :type slot option is further discussed in *note ++ Inheritance of Slots and Slot Options::. ++ ++* ++ The :documentation slot option provides a documentation string for ++ the slot. :documentation can be supplied once at most for a given ++ slot. [Reviewer Note by Barmar: How is this retrieved?] ++ ++ Each class option is an option that refers to the class as a whole. ++The following class options are available: ++ ++* ++ The :default-initargs class option is followed by a list of ++ alternating initialization argument names and default initial value ++ forms. If any of these initialization arguments does not appear in ++ the initialization argument list supplied to make-instance, the ++ corresponding default initial value form is evaluated, and the ++ initialization argument name and the form's value are added to the ++ end of the initialization argument list before the instance is ++ created; see *note Object Creation and Initialization::. The ++ default initial value form is evaluated each time it is used. The ++ lexical environment in which this form is evaluated is the lexical ++ environment in which the defclass form was evaluated. The dynamic ++ environment is the dynamic environment in which make-instance was ++ called. If an initialization argument name appears more than once ++ in a :default-initargs class option, an error is signaled. ++ ++* ++ ++ The :documentation class option causes a documentation string to be ++ attached with the class object, and attached with kind type to the ++ class-name. :documentation can be supplied once at most. ++ ++* ++ The :metaclass class option is used to specify that instances of ++ the class being defined are to have a different metaclass than the ++ default provided by the system (the class standard-class). ++ ++ Note the following rules of defclass for standard classes: ++ ++* ++ It is not required that the superclasses of a class be defined ++ before the defclass form for that class is evaluated. ++ ++* ++ All the superclasses of a class must be defined before an instance ++ of the class can be made. ++ ++* ++ A class must be defined before it can be used as a parameter ++ specializer in a defmethod form. ++ ++ The object system can be extended to cover situations where these ++rules are not obeyed. ++ ++ Some slot options are inherited by a class from its superclasses, and ++some can be shadowed or altered by providing a local slot description. ++No class options except :default-initargs are inherited. For a detailed ++description of how slots and slot options are inherited, see *note ++Inheritance of Slots and Slot Options::. ++ ++ The options to defclass can be extended. It is required that all ++implementations signal an error if they observe a class option or a slot ++option that is not implemented locally. ++ ++ It is valid to specify more than one reader, writer, accessor, or ++initialization argument for a slot. No other slot option can appear ++more than once in a single slot description, or an error is signaled. ++ ++ If no reader, writer, or accessor is specified for a slot, the slot ++can only be accessed by the function slot-value. ++ ++ If a defclass form appears as a top level form, the compiler must ++make the class name be recognized as a valid type name in subsequent ++declarations (as for deftype) and be recognized as a valid class name ++for defmethod parameter specializers and for use as the :metaclass ++option of a subsequent defclass. The compiler must make the class ++definition available to be returned by find-class when its environment ++argument is a value received as the environment parameter of a macro. ++ ++Exceptional Situations:: ++........................ ++ ++If there are any duplicate slot names, an error of type program-error is ++signaled. ++ ++ If an initialization argument name appears more than once in ++:default-initargs class option, an error of type program-error is ++signaled. ++ ++ If any of the following slot options appears more than once in a ++single slot description, an error of type program-error is signaled: ++:allocation, :initform, :type, :documentation. ++ ++ It is required that all implementations signal an error of type ++program-error if they observe a class option or a slot option that is ++not implemented locally. ++ ++See Also:: ++.......... ++ ++*note documentation:: , *note Initialize-Instance:: , *note ++make-instance:: , *note slot-value:: , *note Classes::, *note ++Inheritance::, *note Redefining Classes::, *note Determining the Class ++Precedence List::, *note Object Creation and Initialization:: ++ ++ ++File: gcl.info, Node: defgeneric, Next: defmethod, Prev: defclass, Up: Objects Dictionary ++ ++7.7.26 defgeneric [Macro] ++------------------------- ++ ++'defgeneric' function-name gf-lambda-list [[!option | ++{!method-description}*]] ++=> new-generic ++ ++ option ::=(:argument-precedence-order {parameter-name}^+) | ++ (declare {gf-declaration}^+) | ++ (:documentation gf-documentation) | ++ (:method-combination method-combination {method-combination-argument}*) | ++ (:generic-function-class generic-function-class) | ++ (:method-class method-class) ++ ++ method-description ::=(:method {method-qualifier}* specialized-lambda-list [[{declaration}* | documentation]] {form}*) ++ ++Arguments and Values:: ++...................... ++ ++function-name--a function name. ++ ++ generic-function-class--a non-nil symbol naming a class. ++ ++ gf-declaration--an optimize declaration specifier; other declaration ++specifiers are not permitted. ++ ++ gf-documentation--a string; not evaluated. ++ ++ gf-lambda-list--a generic function lambda list. ++ ++ method-class--a non-nil symbol naming a class. ++ ++ method-combination-argument--an object. ++ ++ method-combination-name--a symbol naming a method combination type. ++ ++ method-qualifiers, specialized-lambda-list, declarations, ++documentation, forms--as per defmethod. ++ ++ new-generic--the generic function object. ++ ++ parameter-name--a symbol that names a required parameter in the ++lambda-list. (If the :argument-precedence-order option is specified, ++each required parameter in the lambda-list must be used exactly once as ++a parameter-name.) ++ ++Description:: ++............. ++ ++The macro defgeneric is used to define a generic function or to specify ++options and declarations that pertain to a generic function as a whole. ++ ++ If function-name is a list it must be of the form (setf symbol). If ++(fboundp function-name) is false, a new generic function is created. ++ ++ If (fdefinition function-name) is a generic function, that ++ ++ generic function is modified. If function-name names an ordinary ++function, a macro, or a special operator, an error is signaled. ++ ++ The effect of the defgeneric macro is as if the following three steps ++were performed: first, methods defined by previous defgeneric forms are ++removed; ++ ++ [Reviewer Note by Barmar: Shouldn't this (second) be first?] second, ++ensure-generic-function is called; and finally, methods specified by the ++current defgeneric form are added to the generic function. ++ ++ Each method-description defines a method on the generic function. ++The lambda list of each method must be congruent with the lambda list ++specified by the gf-lambda-list option. If no method descriptions are ++specified and a generic function of the same name does not already ++exist, a generic function with no methods is created. ++ ++ The gf-lambda-list argument of defgeneric specifies the shape of ++lambda lists for the methods on this generic function. All methods on ++the resulting generic function must have lambda lists that are congruent ++with this shape. If a defgeneric form is evaluated and some methods for ++that generic function have lambda lists that are not congruent with that ++given in the defgeneric form, an error is signaled. For further details ++on method congruence, see *note Congruent Lambda-lists for all Methods ++of a Generic Function::. ++ ++ The generic function passes to the method all the argument values ++passed to it, and only those; default values are not supported. Note ++that optional and keyword arguments in method definitions, however, can ++have default initial value forms and can use supplied-p parameters. ++ ++ The following options are provided. ++ ++ Except as otherwise noted, ++ ++ a given option may occur only once. ++ ++* ++ The :argument-precedence-order option is used to specify the order ++ in which the required arguments in a call to the generic function ++ are tested for specificity when selecting a particular method. ++ Each required argument, as specified in the gf-lambda-list ++ argument, must be included exactly once as a parameter-name so that ++ the full and unambiguous precedence order is supplied. If this ++ condition is not met, an error is signaled. ++ ++ [Reviewer Note by Barmar: What is the default order?] ++ ++* ++ The declare option is used to specify declarations that pertain to ++ the generic function. ++ ++ An optimize declaration specifier is allowed. It specifies whether ++ method selection should be optimized for speed or space, but it has ++ no effect on methods. To control how a method is optimized, an ++ optimize declaration must be placed directly in the defmethod form ++ or method description. The optimization qualities speed and space ++ are the only qualities this standard requires, but an ++ implementation can extend the object system to recognize other ++ qualities. A simple implementation that has only one method ++ selection technique and ignores optimize declaration specifiers is ++ valid. ++ ++ The special, ftype, function, inline, notinline, and declaration ++ declarations are not permitted. Individual implementations can ++ extend the declare option to support additional declarations. ++ ++ [Editorial Note by KMP: Does "additional" mean including special, ++ ftype, etc.? Or only other things that are not mentioned here?] ++ If an implementation notices a declaration specifier that it does ++ not support and that has not been proclaimed as a non-standard ++ declaration identifier name in a declaration proclamation, it ++ should issue a warning. [Editorial Note by KMP: The wording of ++ this previous sentence, particularly the word "and" suggests to me ++ that you can 'proclaim declaration' of an unsupported declaration ++ (e.g., ftype) in order to suppress the warning. That seems wrong. ++ Perhaps it instead means to say "does not support or is both ++ undefined and not proclaimed declaration."] ++ ++ The declare option may be specified more than once. The effect is ++ the same as if the lists of declaration specifiers had been ++ appended together into a single list and specified as a single ++ declare option. ++ ++* ++ The :documentation argument is a documentation string to be ++ attached to the generic function object, and to be attached with ++ kind function to the function-name. ++ ++* ++ The :generic-function-class option may be used to specify that the ++ generic function is to have a different class than the default ++ provided by the system (the class standard-generic-function). The ++ class-name argument is the name of a class that can be the class of ++ a generic function. If function-name specifies an existing generic ++ function that has a different value for the :generic-function-class ++ argument and the new generic function class is compatible with the ++ old, change-class is called to change the class of the generic ++ function; otherwise an error is signaled. ++ ++* ++ The :method-class option is used to specify that all methods on ++ this generic function are to have a different class from the ++ default provided by the system (the class standard-method). The ++ class-name argument is the name of a class that is capable of being ++ the class of a method. ++ ++ [Reviewer Note by Barmar: Is change-class called on existing ++ methods?] ++ ++* ++ The :method-combination option is followed by a symbol that names a ++ type of method combination. The arguments (if any) that follow ++ that symbol depend on the type of method combination. Note that ++ the standard method combination type does not support any ++ arguments. However, all types of method combination defined by the ++ short form of define-method-combination accept an optional argument ++ named order, defaulting to :most-specific-first, where a value of ++ :most-specific-last reverses the order of the primary methods ++ without affecting the order of the auxiliary methods. ++ ++ The method-description arguments define methods that will be ++associated with the generic function. The method-qualifier and ++specialized-lambda-list arguments in a method description are the same ++as for defmethod. ++ ++ The form arguments specify the method body. The body of the method ++is enclosed in an implicit block. If function-name is a symbol, this ++block bears the same name as the generic function. If function-name is ++a list of the form (setf symbol), the name of the block is symbol. ++ ++ Implementations can extend defgeneric to include other options. It ++is required that an implementation signal an error if it observes an ++option that is not implemented locally. ++ ++ defgeneric is not required to perform any compile-time side effects. ++In particular, the methods are not installed for invocation during ++compilation. An implementation may choose to store information about ++the generic function for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls, or noting that a ++definition for the function name has been seen). ++ ++Examples:: ++.......... ++ ++Exceptional Situations:: ++........................ ++ ++If function-name names an ordinary function, a macro, or a special ++operator, an error of type program-error is signaled. ++ ++ Each required argument, as specified in the gf-lambda-list argument, ++must be included exactly once as a parameter-name, or an error of type ++program-error is signaled. ++ ++ The lambda list of each method specified by a method-description must ++be congruent with the lambda list specified by the gf-lambda-list ++option, or an error of type error is signaled. ++ ++ If a defgeneric form is evaluated and some methods for that generic ++function have lambda lists that are not congruent with that given in the ++defgeneric form, an error of type error is signaled. ++ ++ A given option may occur only once, or an error of type program-error ++is signaled. ++ ++ [Reviewer Note by Barmar: This says that an error is signaled if you ++specify the same generic function class as it already has!] If ++function-name specifies an existing generic function that has a ++different value for the :generic-function-class argument and the new ++generic function class is compatible with the old, change-class is ++called to change the class of the generic function; otherwise an error ++of type error is signaled. ++ ++ Implementations can extend defgeneric to include other options. It ++is required that an implementation signal an error of type program-error ++if it observes an option that is not implemented locally. ++ ++See Also:: ++.......... ++ ++*note defmethod:: , *note documentation:: , *note ++ensure-generic-function:: , ++ ++ generic-function, ++ ++ *note Congruent Lambda-lists for all Methods of a Generic Function:: ++ ++ ++File: gcl.info, Node: defmethod, Next: find-class, Prev: defgeneric, Up: Objects Dictionary ++ ++7.7.27 defmethod [Macro] ++------------------------ ++ ++'defmethod' function-name {method-qualifier}* specialized-lambda-list ++[[{declaration}* | documentation]] {form}* ++=> new-method ++ ++ function-name::= {symbol | (setf symbol)} ++ ++ method-qualifier::= non-list ++ ++ specialized-lambda-list::= ({var | (var parameter-specializer-name)}* ++ [&optional {var | (var [initform [supplied-p-parameter] ])}*] ++ [&rest var] ++ [&key{var | ({var | (keywordvar)} [initform [supplied-p-parameter] ])}* ++ [&allow-other-keys] ] ++ [&aux {var | (var [initform] )}*] ) ++ ++ parameter-specializer-name::= symbol | (eql eql-specializer-form) ++ ++Arguments and Values:: ++...................... ++ ++declaration--a declare expression; not evaluated. ++ ++ documentation--a string; not evaluated. ++ ++ var--a variable name. ++ ++ eql-specializer-form--a form. ++ ++ Form--a form. ++ ++ Initform--a form. ++ ++ Supplied-p-parameter--variable name. ++ ++ new-method--the new method object. ++ ++Description:: ++............. ++ ++The macro defmethod defines a method on a generic function. ++ ++ If (fboundp function-name) is nil, a generic function is created with ++default values for the argument precedence order (each argument is more ++specific than the arguments to its right in the argument list), for the ++generic function class (the class standard-generic-function), for the ++method class (the class standard-method), and for the method combination ++type (the standard method combination type). The lambda list of the ++generic function is congruent with the lambda list of the method being ++defined; if the defmethod form mentions keyword arguments, the lambda ++list of the generic function will mention &key (but no keyword ++arguments). If function-name names an ordinary function, a macro, or a ++special operator, an error is signaled. ++ ++ If a generic function is currently named by function-name, the lambda ++list of the method must be congruent with the lambda list of the generic ++function. If this condition does not hold, an error is signaled. For a ++definition of congruence in this context, see *note Congruent ++Lambda-lists for all Methods of a Generic Function::. ++ ++ Each method-qualifier argument is an object that is used by method ++combination to identify the given method. The method combination type ++might further restrict what a method qualifier can be. The standard ++method combination type allows for unqualified methods and methods whose ++sole qualifier is one of the keywords :before, :after, or :around. ++ ++ The specialized-lambda-list argument is like an ordinary lambda list ++except that the names of required parameters can be replaced by ++specialized parameters. A specialized parameter is a list of the form ++(var parameter-specializer-name). Only required parameters can be ++specialized. If parameter-specializer-name is a symbol it names a ++class; if it is a list, it is of the form (eql eql-specializer-form). ++The parameter specializer name (eql eql-specializer-form) indicates that ++the corresponding argument must be eql to the object that is the value ++of eql-specializer-form for the method to be applicable. The ++eql-specializer-form is evaluated at the time that the expansion of the ++defmethod macro is evaluated. If no parameter specializer name is ++specified for a given required parameter, the parameter specializer ++defaults to the class t. For further discussion, see *note Introduction ++to Methods::. ++ ++ The form arguments specify the method body. The body of the method ++is enclosed in an implicit block. If function-name is a symbol, this ++block bears the same name as the generic function. If function-name is ++a list of the form (setf symbol), the name of the block is symbol. ++ ++ The class of the method object that is created is that given by the ++method class option of the generic function on which the method is ++defined. ++ ++ If the generic function already has a method that agrees with the ++method being defined on parameter specializers and qualifiers, defmethod ++replaces the existing method with the one now being defined. For a ++definition of agreement in this context. see *note Agreement on ++Parameter Specializers and Qualifiers::. ++ ++ The parameter specializers are derived from the parameter specializer ++names as described in *note Introduction to Methods::. ++ ++ The expansion of the defmethod macro "refers to" each specialized ++parameter (see the description of ignore within the description of ++declare). This includes parameters that have an explicit parameter ++specializer name of t. This means that a compiler warning does not ++occur if the body of the method does not refer to a specialized ++parameter, while a warning might occur if the body of the method does ++not refer to an unspecialized parameter. For this reason, a parameter ++that specializes on t is not quite synonymous with an unspecialized ++parameter in this context. ++ ++ Declarations at the head of the method body that apply to the ++method's lambda variables are treated as bound declarations whose scope ++is the same as the corresponding bindings. ++ ++ Declarations at the head of the method body that apply to the ++functional bindings of call-next-method or next-method-p apply to ++references to those functions within the method body forms. Any outer ++bindings of the function names call-next-method and next-method-p, and ++declarations associated with such bindings are shadowed_2 within the ++method body forms. ++ ++ The scope of free declarations at the head of the method body is the ++entire method body, which includes any implicit local function ++definitions but excludes initialization forms for the lambda variables. ++ ++ defmethod is not required to perform any compile-time side effects. ++In particular, the methods are not installed for invocation during ++compilation. An implementation may choose to store information about ++the generic function for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls, or noting that a ++definition for the function name has been seen). ++ ++ Documentation is attached as a documentation string to the method ++object. ++ ++Affected By:: ++............. ++ ++The definition of the referenced generic function. ++ ++Exceptional Situations:: ++........................ ++ ++If function-name names an ordinary function, a macro, or a special ++operator, an error of type error is signaled. ++ ++ If a generic function is currently named by function-name, the lambda ++list of the method must be congruent with the lambda list of the generic ++function, or an error of type error is signaled. ++ ++See Also:: ++.......... ++ ++*note defgeneric:: , *note documentation:: , *note Introduction to ++Methods::, *note Congruent Lambda-lists for all Methods of a Generic ++Function::, *note Agreement on Parameter Specializers and Qualifiers::, ++*note Syntactic Interaction of Documentation Strings and Declarations:: ++ ++ ++File: gcl.info, Node: find-class, Next: next-method-p, Prev: defmethod, Up: Objects Dictionary ++ ++7.7.28 find-class [Accessor] ++---------------------------- ++ ++'find-class' symbol &optional errorp environment => class ++ ++ (setf (' find-class' symbol &optional errorp environment) new-class) ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ errorp--a generalized boolean. The default is true. ++ ++ environment - same as the &environment argument to macro expansion ++functions and is used to distinguish between compile-time and run-time ++environments. ++ ++ The &environment argument has dynamic extent; the consequences are ++undefined if the &environment argument is referred to outside the ++dynamic extent of the macro expansion function. ++ ++ class--a class object, or nil. ++ ++Description:: ++............. ++ ++Returns the class object named by the symbol in the environment. If ++there is no such class, nil is returned if errorp is false; otherwise, ++if errorp is true, an error is signaled. ++ ++ The class associated with a particular symbol can be changed by using ++setf with find-class; ++ ++ or, if the new class given to setf is nil, the class association is ++removed (but the class object itself is not affected). ++ ++ The results are undefined if the user attempts to change ++ ++ or remove ++ ++ the class associated with a symbol that is defined as a type ++specifier in this standard. See *note Integrating Types and Classes::. ++ ++ When using setf of find-class, any errorp argument is evaluated for ++effect, but any values it returns are ignored; the errorp parameter is ++permitted primarily so that the environment parameter can be used. ++ ++ The environment might be used to distinguish between a compile-time ++and a run-time environment. ++ ++Exceptional Situations:: ++........................ ++ ++If there is no such class and errorp is true, find-class signals an ++error of type error. ++ ++See Also:: ++.......... ++ ++*note defmacro:: , *note Integrating Types and Classes:: ++ ++ ++File: gcl.info, Node: next-method-p, Next: call-method, Prev: find-class, Up: Objects Dictionary ++ ++7.7.29 next-method-p [Local Function] ++------------------------------------- ++ ++Syntax:: ++........ ++ ++'next-method-p' => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++The locally defined function next-method-p can be used ++ ++ within the body forms (but not the lambda list) ++ ++ defined by a method-defining form to determine whether a next method ++exists. ++ ++ The function next-method-p has lexical scope and indefinite extent. ++ ++ Whether or not next-method-p is fbound in the global environment is ++implementation-dependent; however, the restrictions on redefinition and ++shadowing of next-method-p are the same as for symbols in the ++COMMON-LISP package which are fbound in the global environment. The ++consequences of attempting to use next-method-p outside of a ++method-defining form are undefined. ++ ++See Also:: ++.......... ++ ++*note call-next-method:: , *note defmethod:: , *note call-method:: ++ ++ ++File: gcl.info, Node: call-method, Next: call-next-method, Prev: next-method-p, Up: Objects Dictionary ++ ++7.7.30 call-method, make-method [Local Macro] ++--------------------------------------------- ++ ++Syntax:: ++........ ++ ++'call-method' method &optional next-method-list => {result}* ++ ++ 'make-method' form => method-object ++ ++Arguments and Values:: ++...................... ++ ++method--a method object, or a list (see below); not evaluated. ++ ++ method-object--a method object. ++ ++ next-method-list--a list of method objects; not evaluated. ++ ++ results--the values returned by the method invocation. ++ ++Description:: ++............. ++ ++The macro call-method is used in method combination. It hides the ++implementation-dependent details of how methods are called. The macro ++call-method has lexical scope and can only be used within an effective ++method form. ++ ++ [Editorial Note by KMP: This next paragraph still needs some work.] ++ ++ Whether or not call-method is fbound in the global environment is ++implementation-dependent; however, the restrictions on redefinition and ++shadowing of call-method are the same as for symbols in the COMMON-LISP ++package which are fbound in the global environment. The consequences of ++attempting to use call-method outside of an effective method form are ++undefined. ++ ++ The macro call-method invokes the specified method, supplying it with ++arguments and with definitions for call-next-method and for ++next-method-p. If the invocation of call-method is lexically inside of ++a make-method, the arguments are those that were supplied to that ++method. Otherwise the arguments are those that were supplied to the ++generic function. The definitions of call-next-method and next-method-p ++rely on the specified next-method-list. ++ ++ If method is a list, the first element of the list must be the symbol ++make-method and the second element must be a form. Such a list ++specifies a method object whose method function has a body that is the ++given form. ++ ++ Next-method-list can contain method objects or lists, the first ++element of which must be the symbol make-method and the second element ++of which must be a form. ++ ++ Those are the only two places where make-method can be used. The ++form used with make-method is evaluated in the null lexical environment ++augmented with a local macro definition for call-method and with ++bindings named by symbols not accessible from the COMMON-LISP-USER ++package. ++ ++ The call-next-method function available to method will call the first ++method in next-method-list. The call-next-method function available in ++that method, in turn, will call the second method in next-method-list, ++and so on, until the list of next methods is exhausted. ++ ++ If next-method-list is not supplied, the call-next-method function ++available to method signals an error of type control-error and the ++next-method-p function available to method returns nil. ++ ++Examples:: ++.......... ++ ++See Also:: ++.......... ++ ++*note call-next-method:: , *note define-method-combination:: , *note ++next-method-p:: ++ ++ ++File: gcl.info, Node: call-next-method, Next: compute-applicable-methods, Prev: call-method, Up: Objects Dictionary ++ ++7.7.31 call-next-method [Local Function] ++---------------------------------------- ++ ++Syntax:: ++........ ++ ++'call-next-method' &rest args => {result}* ++ ++Arguments and Values:: ++...................... ++ ++arg--an object. ++ ++ results--the values returned by the method it calls. ++ ++Description:: ++............. ++ ++The function call-next-method can be used ++ ++ within the body forms (but not the lambda list) ++ ++ of a method defined by a method-defining form to call the next ++method. ++ ++ If there is no next method, the generic function no-next-method is ++called. ++ ++ The type of method combination used determines which methods can ++invoke call-next-method. The standard method combination type allows ++call-next-method to be used within primary methods and around methods. ++For generic functions using a type of method combination defined by the ++short form of define-method-combination, call-next-method can be used in ++around methods only. ++ ++ When call-next-method is called with no arguments, it passes the ++current method's original arguments to the next method. Neither ++argument defaulting, nor using setq, nor rebinding variables with the ++same names as parameters of the method affects the values ++call-next-method passes to the method it calls. ++ ++ When call-next-method is called with arguments, the next method is ++called with those arguments. ++ ++ If call-next-method is called with arguments but omits optional ++arguments, the next method called defaults those arguments. ++ ++ The function call-next-method returns any values that are returned by ++the next method. ++ ++ The function call-next-method has lexical scope and indefinite extent ++and can only be used within the body of a method defined by a ++method-defining form. ++ ++ Whether or not call-next-method is fbound in the global environment ++is implementation-dependent; however, the restrictions on redefinition ++and shadowing of call-next-method are the same as for symbols in the ++COMMON-LISP package which are fbound in the global environment. The ++consequences of attempting to use call-next-method outside of a ++method-defining form are undefined. ++ ++Affected By:: ++............. ++ ++defmethod, call-method, define-method-combination. ++ ++Exceptional Situations:: ++........................ ++ ++When providing arguments to call-next-method, the following rule must be ++satisfied or an error of type error should be signaled: the ordered set ++of applicable methods for a changed set of arguments for ++call-next-method must be the same as the ordered set of applicable ++methods for the original arguments to the generic function. ++Optimizations of the error checking are possible, but they must not ++change the semantics of call-next-method. ++ ++See Also:: ++.......... ++ ++*note define-method-combination:: , *note defmethod:: , *note ++next-method-p:: , *note no-next-method:: , *note call-method:: , *note ++Method Selection and Combination::, *note Standard Method Combination::, ++*note Built-in Method Combination Types:: ++ ++ ++File: gcl.info, Node: compute-applicable-methods, Next: define-method-combination, Prev: call-next-method, Up: Objects Dictionary ++ ++7.7.32 compute-applicable-methods [Standard Generic Function] ++------------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'compute-applicable-methods' generic-function function-arguments => ++methods ++ ++Method Signatures:: ++................... ++ ++'compute-applicable-methods' (generic-function ++standard-generic-function) ++ ++Arguments and Values:: ++...................... ++ ++generic-function--a generic function. ++ ++ function-arguments--a list of arguments for the generic-function. ++ ++ methods--a list of method objects. ++ ++Description:: ++............. ++ ++Given a generic-function and a set of function-arguments, the function ++compute-applicable-methods returns the set of methods that are ++applicable for those arguments sorted according to precedence order. ++See *note Method Selection and Combination::. ++ ++Affected By:: ++............. ++ ++defmethod ++ ++See Also:: ++.......... ++ ++*note Method Selection and Combination:: ++ ++ ++File: gcl.info, Node: define-method-combination, Next: find-method, Prev: compute-applicable-methods, Up: Objects Dictionary ++ ++7.7.33 define-method-combination [Macro] ++---------------------------------------- ++ ++'define-method-combination' name [[!short-form-option]] ++=> name ++ ++ 'define-method-combination' name lambda-list ++({method-group-specifier}*) [(:arguments . args-lambda-list)] ++[(:generic-function generic-function-symbol)] [[{declaration}* | ++documentation]] {form}* ++=> name ++ ++ short-form-option ::=:documentation documentation | ++ :identity-with-one-argument identity-with-one-argument | ++ :operator operator ++ ++ method-group-specifier ::=(name {{qualifier-pattern}^+ | predicate} [[!long-form-option]]) ++ ++ long-form-option ::=:description description | ++ :order order | ++ :required required-p ++ ++Arguments and Values:: ++...................... ++ ++args-lambda-list-- a define-method-combination arguments lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ description--a format control. ++ ++ documentation--a string; not evaluated. ++ ++ forms--an implicit progn that must compute and return the form that ++specifies how the methods are combined, that is, the effective method. ++ ++ generic-function-symbol--a symbol. ++ ++ identity-with-one-argument--a generalized boolean. ++ ++ lambda-list--ordinary lambda list. ++ ++ name--a symbol. Non-keyword, non-nil symbols are usually used. ++ ++ operator--an operator. Name and operator are often the same symbol. ++This is the default, but it is not required. ++ ++ order--:most-specific-first or :most-specific-last; evaluated. ++ ++ predicate--a symbol that names a function of one argument that ++returns a generalized boolean. ++ ++ qualifier-pattern--a list, or the symbol *. ++ ++ required-p--a generalized boolean. ++ ++Description:: ++............. ++ ++The macro define-method-combination is used to define new types of ++method combination. ++ ++ There are two forms of define-method-combination. The short form is ++a simple facility for the cases that are expected to be most commonly ++needed. The long form is more powerful but more verbose. It resembles ++defmacro in that the body is an expression, usually using backquote, ++that computes a form. Thus arbitrary control structures can be ++implemented. The long form also allows arbitrary processing of method ++qualifiers. ++ ++Short Form ++ The short form syntax of define-method-combination is recognized ++ when the second subform is a non-nil symbol or is not present. ++ When the short form is used, name is defined as a type of method ++ combination that produces a Lisp form (operator method-call ++ method-call ...). The operator is a symbol that can be the name of ++ a function, macro, or special operator. The operator can be ++ supplied by a keyword option; it defaults to name. ++ ++ Keyword options for the short form are the following: ++ ++ * ++ The :documentation option is used to document the ++ method-combination type; see description of long form below. ++ ++ * ++ The :identity-with-one-argument option enables an optimization ++ when its value is true (the default is false). If there is ++ exactly one applicable method and it is a primary method, that ++ method serves as the effective method and operator is not ++ called. This optimization avoids the need to create a new ++ effective method and avoids the overhead of a function call. ++ This option is designed to be used with operators such as ++ progn, and, +, and max. ++ ++ * ++ The :operator option specifies the name of the operator. The ++ operator argument is a symbol that can be the name of a ++ function, macro, or special form. ++ ++ These types of method combination require exactly one qualifier per ++ method. An error is signaled if there are applicable methods with ++ no qualifiers or with qualifiers that are not supported by the ++ method combination type. ++ ++ A method combination procedure defined in this way recognizes two ++ roles for methods. A method whose one qualifier is the symbol ++ naming this type of method combination is defined to be a primary ++ method. At least one primary method must be applicable or an error ++ is signaled. A method with :around as its one qualifier is an ++ auxiliary method that behaves the same as an around method in ++ standard method combination. The function call-next-method can ++ only be used in around methods; it cannot be used in primary ++ methods defined by the short form of the define-method-combination ++ macro. ++ ++ A method combination procedure defined in this way accepts an ++ optional argument named order, which defaults to ++ :most-specific-first. A value of :most-specific-last reverses the ++ order of the primary methods without affecting the order of the ++ auxiliary methods. ++ ++ The short form automatically includes error checking and support ++ for around methods. ++ ++ For a discussion of built-in method combination types, see *note ++ Built-in Method Combination Types::. ++ ++Long Form ++ The long form syntax of define-method-combination is recognized ++ when the second subform is a list. ++ ++ The lambda-list receives any arguments provided after the name of ++ the method combination type in the :method-combination option to ++ defgeneric. ++ ++ A list of method group specifiers follows. Each specifier selects ++ a subset of the applicable methods to play a particular role, ++ either by matching their qualifiers against some patterns or by ++ testing their qualifiers with a predicate. These method group ++ specifiers define all method qualifiers that can be used with this ++ type of method combination. ++ ++ The car of each method-group-specifier is a symbol which names a ++ variable. During the execution of the forms in the body of ++ define-method-combination, this variable is bound to a list of the ++ methods in the method group. The methods in this list occur in the ++ order specified by the :order option. ++ ++ If qualifier-pattern is a symbol it must be *. A method matches a ++ qualifier-pattern if the method's list of qualifiers is equal to ++ the qualifier-pattern (except that the symbol * in a ++ qualifier-pattern matches anything). Thus a qualifier-pattern can ++ be one of the following: the empty list, which matches unqualified ++ methods; the symbol *, which matches all methods; a true list, ++ which matches methods with the same number of qualifiers as the ++ length of the list when each qualifier matches the corresponding ++ list element; or a dotted list that ends in the symbol * (the * ++ matches any number of additional qualifiers). ++ ++ Each applicable method is tested against the qualifier-patterns and ++ predicates in left-to-right order. As soon as a qualifier-pattern ++ matches or a predicate returns true, the method becomes a member of ++ the corresponding method group and no further tests are made. Thus ++ if a method could be a member of more than one method group, it ++ joins only the first such group. If a method group has more than ++ one qualifier-pattern, a method need only satisfy one of the ++ qualifier-patterns to be a member of the group. ++ ++ The name of a predicate function can appear instead of ++ qualifier-patterns in a method group specifier. The predicate is ++ called for each method that has not been assigned to an earlier ++ method group; it is called with one argument, the method's ++ qualifier list. The predicate should return true if the method is ++ to be a member of the method group. A predicate can be ++ distinguished from a qualifier-pattern because it is a symbol other ++ than nil or *. ++ ++ If there is an applicable method that does not fall into any method ++ group, the function invalid-method-error is called. ++ ++ Method group specifiers can have keyword options following the ++ qualifier patterns or predicate. Keyword options can be ++ distinguished from additional qualifier patterns because they are ++ neither lists nor the symbol *. The keyword options are as ++ follows: ++ ++ * ++ The :description option is used to provide a description of ++ the role of methods in the method group. Programming ++ environment tools use (apply #'format stream format-control ++ (method-qualifiers method)) to print this description, which ++ is expected to be concise. This keyword option allows the ++ description of a method qualifier to be defined in the same ++ module that defines the meaning of the method qualifier. In ++ most cases, format-control will not contain any format ++ directives, but they are available for generality. If ++ :description is not supplied, a default description is ++ generated based on the variable name and the qualifier ++ patterns and on whether this method group includes the ++ unqualified methods. ++ ++ * ++ The :order option specifies the order of methods. The order ++ argument is a form that evaluates to :most-specific-first or ++ :most-specific-last. If it evaluates to any other value, an ++ error is signaled. If :order is not supplied, it defaults to ++ :most-specific-first. ++ ++ * ++ The :required option specifies whether at least one method in ++ this method group is required. If its value is true and the ++ method group is empty (that is, no applicable methods match ++ the qualifier patterns or satisfy the predicate), an error is ++ signaled. If :required is not supplied, it defaults to nil. ++ ++ The use of method group specifiers provides a convenient syntax to ++ select methods, to divide them among the possible roles, and to ++ perform the necessary error checking. It is possible to perform ++ further filtering of methods in the body forms by using normal ++ list-processing operations and the functions method-qualifiers and ++ invalid-method-error. It is permissible to use setq on the ++ variables named in the method group specifiers and to bind ++ additional variables. It is also possible to bypass the method ++ group specifier mechanism and do everything in the body forms. ++ This is accomplished by writing a single method group with * as its ++ only qualifier-pattern; the variable is then bound to a list of all ++ of the applicable methods, in most-specific-first order. ++ ++ The body forms compute and return the form that specifies how the ++ methods are combined, that is, the effective method. The effective ++ method is evaluated in the null lexical environment augmented with ++ a local macro definition for call-method and with bindings named by ++ symbols not accessible from the COMMON-LISP-USER package. Given a ++ method object in one of the lists produced by the method group ++ specifiers and a list of next methods, call-method will invoke the ++ method such that call-next-method has available the next methods. ++ ++ When an effective method has no effect other than to call a single ++ method, some implementations employ an optimization that uses the ++ single method directly as the effective method, thus avoiding the ++ need to create a new effective method. This optimization is active ++ when the effective method form consists entirely of an invocation ++ of the call-method macro whose first subform is a method object and ++ whose second subform is nil or unsupplied. Each ++ define-method-combination body is responsible for stripping off ++ redundant invocations of progn, and, multiple-value-prog1, and the ++ like, if this optimization is desired. ++ ++ The list (:arguments . lambda-list) can appear before any ++ declarations or documentation string. This form is useful when the ++ method combination type performs some specific behavior as part of ++ the combined method and that behavior needs access to the arguments ++ to the generic function. Each parameter variable defined by ++ lambda-list is bound to a form that can be inserted into the ++ effective method. When this form is evaluated during execution of ++ the effective method, its value is the corresponding argument to ++ the generic function; the consequences of using such a form as the ++ place in a setf form are undefined. ++ ++ Argument correspondence is computed by dividing the :arguments ++ lambda-list and the generic function lambda-list into three ++ sections: the required parameters, the optional parameters, and the ++ keyword and rest parameters. The arguments supplied to the generic ++ function for a particular call are also divided into three ++ sections; the required arguments section contains as many arguments ++ as the generic function has required parameters, the optional ++ arguments section contains as many arguments as the generic ++ function has optional parameters, and the keyword/rest arguments ++ section contains the remaining arguments. Each parameter in the ++ required and optional sections of the :arguments lambda-list ++ accesses the argument at the same position in the corresponding ++ section of the arguments. If the section of the :arguments ++ lambda-list is shorter, extra arguments are ignored. If the ++ section of the :arguments lambda-list is longer, excess required ++ parameters are bound to forms that evaluate to nil and excess ++ optional parameters are bound to their initforms. The keyword ++ parameters and rest parameters in the :arguments lambda-list access ++ the keyword/rest section of the arguments. If the :arguments ++ lambda-list contains &key, it behaves as if it also contained ++ &allow-other-keys. ++ ++ In addition, &whole var can be placed first in the :arguments ++ lambda-list. It causes var to be bound to a form that evaluates to ++ a list of all of the arguments supplied to the generic function. ++ This is different from &rest because it accesses all of the ++ arguments, not just the keyword/rest arguments. ++ ++ Erroneous conditions detected by the body should be reported with ++ method-combination-error or invalid-method-error; these functions ++ add any necessary contextual information to the error message and ++ will signal the appropriate error. ++ ++ The body forms are evaluated inside of the bindings created by the ++ lambda list and method group specifiers. ++ ++ [Reviewer Note by Barmar: Are they inside or outside the :ARGUMENTS ++ bindings?] Declarations at the head of the body are positioned ++ directly inside of bindings created by the lambda list and outside ++ of the bindings of the method group variables. Thus method group ++ variables cannot be declared in this way. locally may be used ++ around the body, however. ++ ++ Within the body forms, generic-function-symbol is bound to the ++ generic function object. ++ ++ Documentation is attached as a documentation string to name (as ++ kind method-combination) and to the method combination object. ++ ++ Note that two methods with identical specializers, but with ++ different qualifiers, are not ordered by the algorithm described in ++ Step 2 of the method selection and combination process described in ++ *note Method Selection and Combination::. Normally the two methods ++ play different roles in the effective method because they have ++ different qualifiers, and no matter how they are ordered in the ++ result of Step 2, the effective method is the same. If the two ++ methods play the same role and their order matters, ++ ++ [Reviewer Note by Barmar: How does the system know when the order ++ matters?] an error is signaled. This happens as part of the ++ qualifier pattern matching in define-method-combination. ++ ++ If a define-method-combination form appears as a top level form, the ++compiler must make the method combination name be recognized as a valid ++method combination name in subsequent defgeneric forms. However, the ++method combination is executed no earlier than when the ++define-method-combination form is executed, and possibly as late as the ++time that generic functions that use the method combination are ++executed. ++ ++Examples:: ++.......... ++ ++Most examples of the long form of define-method-combination also ++illustrate the use of the related functions that are provided as part of ++the declarative method combination facility. ++ ++ ;;; Examples of the short form of define-method-combination ++ ++ (define-method-combination and :identity-with-one-argument t) ++ ++ (defmethod func and ((x class1) y) ...) ++ ++ ;;; The equivalent of this example in the long form is: ++ ++ (define-method-combination and ++ (&optional (order :most-specific-first)) ++ ((around (:around)) ++ (primary (and) :order order :required t)) ++ (let ((form (if (rest primary) ++ `(and ,@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ primary)) ++ `(call-method ,(first primary))))) ++ (if around ++ `(call-method ,(first around) ++ (,@(rest around) ++ (make-method ,form))) ++ form))) ++ ++ ;;; Examples of the long form of define-method-combination ++ ++ ;The default method-combination technique ++ (define-method-combination standard () ++ ((around (:around)) ++ (before (:before)) ++ (primary () :required t) ++ (after (:after))) ++ (flet ((call-methods (methods) ++ (mapcar #'(lambda (method) ++ `(call-method ,method)) ++ methods))) ++ (let ((form (if (or before after (rest primary)) ++ `(multiple-value-prog1 ++ (progn ,@(call-methods before) ++ (call-method ,(first primary) ++ ,(rest primary))) ++ ,@(call-methods (reverse after))) ++ `(call-method ,(first primary))))) ++ (if around ++ `(call-method ,(first around) ++ (,@(rest around) ++ (make-method ,form))) ++ form)))) ++ ++ ;A simple way to try several methods until one returns non-nil ++ (define-method-combination or () ++ ((methods (or))) ++ `(or ,@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ methods))) ++ ++ ;A more complete version of the preceding ++ (define-method-combination or ++ (&optional (order ':most-specific-first)) ++ ((around (:around)) ++ (primary (or))) ++ ;; Process the order argument ++ (case order ++ (:most-specific-first) ++ (:most-specific-last (setq primary (reverse primary))) ++ (otherwise (method-combination-error "~S is an invalid order.~@ ++ :most-specific-first and :most-specific-last are the possible values." ++ order))) ++ ;; Must have a primary method ++ (unless primary ++ (method-combination-error "A primary method is required.")) ++ ;; Construct the form that calls the primary methods ++ (let ((form (if (rest primary) ++ `(or ,@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ primary)) ++ `(call-method ,(first primary))))) ++ ;; Wrap the around methods around that form ++ (if around ++ `(call-method ,(first around) ++ (,@(rest around) ++ (make-method ,form))) ++ form))) ++ ++ ;The same thing, using the :order and :required keyword options ++ (define-method-combination or ++ (&optional (order ':most-specific-first)) ++ ((around (:around)) ++ (primary (or) :order order :required t)) ++ (let ((form (if (rest primary) ++ `(or ,@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ primary)) ++ `(call-method ,(first primary))))) ++ (if around ++ `(call-method ,(first around) ++ (,@(rest around) ++ (make-method ,form))) ++ form))) ++ ++ ;This short-form call is behaviorally identical to the preceding ++ (define-method-combination or :identity-with-one-argument t) ++ ++ ;Order methods by positive integer qualifiers ++ ;:around methods are disallowed to keep the example small ++ (define-method-combination example-method-combination () ++ ((methods positive-integer-qualifier-p)) ++ `(progn ,@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ (stable-sort methods #'< ++ :key #'(lambda (method) ++ (first (method-qualifiers method))))))) ++ ++ (defun positive-integer-qualifier-p (method-qualifiers) ++ (and (= (length method-qualifiers) 1) ++ (typep (first method-qualifiers) '(integer 0 *)))) ++ ++ ;;; Example of the use of :arguments ++ (define-method-combination progn-with-lock () ++ ((methods ())) ++ (:arguments object) ++ `(unwind-protect ++ (progn (lock (object-lock ,object)) ++ ,@(mapcar #'(lambda (method) ++ `(call-method ,method)) ++ methods)) ++ (unlock (object-lock ,object)))) ++ ++ ++Side Effects:: ++.............. ++ ++The compiler is not required to perform any compile-time side-effects. ++ ++Exceptional Situations:: ++........................ ++ ++Method combination types defined with the short form require exactly one ++qualifier per method. An error of type error is signaled if there are ++applicable methods with no qualifiers or with qualifiers that are not ++supported by the method combination type. At least one primary method ++must be applicable or an error of type error is signaled. ++ ++ If an applicable method does not fall into any method group, the ++system signals an error of type error indicating that the method is ++invalid for the kind of method combination in use. ++ ++ If the value of the :required option is true and the method group is ++empty (that is, no applicable methods match the qualifier patterns or ++satisfy the predicate), an error of type error is signaled. ++ ++ If the :order option evaluates to a value other than ++:most-specific-first or :most-specific-last, an error of type error is ++signaled. ++ ++See Also:: ++.......... ++ ++*note call-method:: , *note call-next-method:: , *note documentation:: , ++*note method-qualifiers:: , *note method-combination-error:: , *note ++invalid-method-error:: , *note defgeneric:: , *note Method Selection and ++Combination::, *note Built-in Method Combination Types::, *note ++Syntactic Interaction of Documentation Strings and Declarations:: ++ ++Notes:: ++....... ++ ++The :method-combination option of defgeneric is used to specify that a ++generic function should use a particular method combination type. The ++first argument to the :method-combination option is the name of a method ++combination type and the remaining arguments are options for that type. ++ ++ ++File: gcl.info, Node: find-method, Next: add-method, Prev: define-method-combination, Up: Objects Dictionary ++ ++7.7.34 find-method [Standard Generic Function] ++---------------------------------------------- ++ ++Syntax:: ++........ ++ ++'find-method' generic-function method-qualifiers specializers &optional ++errorp ++=> method ++ ++Method Signatures:: ++................... ++ ++'find-method' (generic-function standard-generic-function) ++method-qualifiers specializers &optional errorp ++ ++Arguments and Values:: ++...................... ++ ++generic-function--a generic function. ++ ++ method-qualifiers--a list. ++ ++ specializers--a list. ++ ++ errorp--a generalized boolean. The default is true. ++ ++ method--a method object, or nil. ++ ++Description:: ++............. ++ ++The generic function find-method takes a generic function and returns ++the method object that agrees on qualifiers and parameter specializers ++with the method-qualifiers and specializers arguments of find-method. ++Method-qualifiers contains the method qualifiers for the method. The ++order of the method qualifiers is significant. For a definition of ++agreement in this context, see *note Agreement on Parameter Specializers ++and Qualifiers::. ++ ++ The specializers argument contains the parameter specializers for the ++method. It must correspond in length to the number of required ++arguments of the generic function, or an error is signaled. This means ++that to obtain the default method on a given generic-function, a list ++whose elements are the class t must be given. ++ ++ If there is no such method and errorp is true, find-method signals an ++error. If there is no such method and errorp is false, find-method ++returns nil. ++ ++Examples:: ++.......... ++ ++ (defmethod some-operation ((a integer) (b float)) (list a b)) ++ => # ++ (find-method #'some-operation '() (mapcar #'find-class '(integer float))) ++ => # ++ (find-method #'some-operation '() (mapcar #'find-class '(integer integer))) ++ |> Error: No matching method ++ (find-method #'some-operation '() (mapcar #'find-class '(integer integer)) nil) ++ => NIL ++ ++Affected By:: ++............. ++ ++add-method, defclass, defgeneric, defmethod ++ ++Exceptional Situations:: ++........................ ++ ++If the specializers argument does not correspond in length to the number ++of required arguments of the generic-function, an an error of type error ++is signaled. ++ ++ If there is no such method and errorp is true, find-method signals an ++error of type error. ++ ++See Also:: ++.......... ++ ++*note Agreement on Parameter Specializers and Qualifiers:: ++ ++ ++File: gcl.info, Node: add-method, Next: initialize-instance, Prev: find-method, Up: Objects Dictionary ++ ++7.7.35 add-method [Standard Generic Function] ++--------------------------------------------- ++ ++Syntax:: ++........ ++ ++'add-method' generic-function method => generic-function ++ ++Method Signatures:: ++................... ++ ++'add-method' (generic-function standard-generic-function) (method ++method) ++ ++Arguments and Values:: ++...................... ++ ++generic-function--a generic function object. ++ ++ method--a method object. ++ ++Description:: ++............. ++ ++The generic function add-method adds a method to a generic function. ++ ++ If method agrees with an existing method of generic-function on ++parameter specializers and qualifiers, the existing method is replaced. ++ ++Exceptional Situations:: ++........................ ++ ++The lambda list of the method function of method must be congruent with ++the lambda list of generic-function, or an error of type error is ++signaled. ++ ++ If method is a method object of another generic function, an error of ++type error is signaled. ++ ++See Also:: ++.......... ++ ++*note defmethod:: , *note defgeneric:: , *note find-method:: , *note ++remove-method:: , *note Agreement on Parameter Specializers and ++Qualifiers:: ++ ++ ++File: gcl.info, Node: initialize-instance, Next: class-name, Prev: add-method, Up: Objects Dictionary ++ ++7.7.36 initialize-instance [Standard Generic Function] ++------------------------------------------------------ ++ ++Syntax:: ++........ ++ ++'initialize-instance' instance &rest initargs &key &allow-other-keys => ++instance ++ ++Method Signatures:: ++................... ++ ++'initialize-instance' (instance standard-object) &rest initargs ++ ++Arguments and Values:: ++...................... ++ ++instance--an object. ++ ++ initargs--a defaulted initialization argument list. ++ ++Description:: ++............. ++ ++Called by make-instance to initialize a newly created instance. The ++generic function is called with the new instance and the defaulted ++initialization argument list. ++ ++ The system-supplied primary method on initialize-instance initializes ++the slots of the instance with values according to the initargs and the ++:initform forms of the slots. It does this by calling the generic ++function shared-initialize with the following arguments: the instance, t ++(this indicates that all slots for which no initialization arguments are ++provided should be initialized according to their :initform forms), and ++the initargs. ++ ++ Programmers can define methods for initialize-instance to specify ++actions to be taken when an instance is initialized. If only after ++methods are defined, they will be run after the system-supplied primary ++method for initialization and therefore will not interfere with the ++default behavior of initialize-instance. ++ ++See Also:: ++.......... ++ ++*note Shared-Initialize:: , *note make-instance:: , *note slot-boundp:: ++, *note slot-makunbound:: , *note Object Creation and Initialization::, ++*note Rules for Initialization Arguments::, *note Declaring the Validity ++of Initialization Arguments:: ++ ++ ++File: gcl.info, Node: class-name, Next: setf class-name, Prev: initialize-instance, Up: Objects Dictionary ++ ++7.7.37 class-name [Standard Generic Function] ++--------------------------------------------- ++ ++Syntax:: ++........ ++ ++'class-name' class => name ++ ++Method Signatures:: ++................... ++ ++'class-name' (class class) ++ ++Arguments and Values:: ++...................... ++ ++class--a class object. ++ ++ name--a symbol. ++ ++Description:: ++............. ++ ++Returns the name of the given class. ++ ++See Also:: ++.......... ++ ++*note find-class:: , *note Classes:: ++ ++Notes:: ++....... ++ ++If S is a symbol such that S =(class-name C) and C =(find-class S), then ++S is the proper name of C. For further discussion, see *note Classes::. ++ ++ The name of an anonymous class is nil. ++ ++ ++File: gcl.info, Node: setf class-name, Next: class-of, Prev: class-name, Up: Objects Dictionary ++ ++7.7.38 setf class-name [Standard Generic Function] ++-------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'setf class-name' new-value class => new-value ++ ++Method Signatures:: ++................... ++ ++'setf class-name' new-value (class class) ++ ++Arguments and Values:: ++...................... ++ ++new-value--a symbol. ++ ++ class--a class. ++ ++Description:: ++............. ++ ++The generic function setf class-name sets the name of a class object. ++ ++See Also:: ++.......... ++ ++*note find-class:: , proper name, *note Classes:: ++ ++ ++File: gcl.info, Node: class-of, Next: unbound-slot, Prev: setf class-name, Up: Objects Dictionary ++ ++7.7.39 class-of [Function] ++-------------------------- ++ ++'class-of' object => class ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ class--a class object. ++ ++Description:: ++............. ++ ++Returns the class of which the object is a direct instance. ++ ++Examples:: ++.......... ++ ++ (class-of 'fred) => # ++ (class-of 2/3) => # ++ ++ (defclass book () ()) => # ++ (class-of (make-instance 'book)) => # ++ ++ (defclass novel (book) ()) => # ++ (class-of (make-instance 'novel)) => # ++ ++ (defstruct kons kar kdr) => KONS ++ (class-of (make-kons :kar 3 :kdr 4)) => # ++ ++See Also:: ++.......... ++ ++*note make-instance:: , *note type-of:: ++ ++ ++File: gcl.info, Node: unbound-slot, Next: unbound-slot-instance, Prev: class-of, Up: Objects Dictionary ++ ++7.7.40 unbound-slot [Condition Type] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++unbound-slot, cell-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The object having the unbound slot is initialized by the :instance ++initialization argument to make-condition, and is accessed by the ++function unbound-slot-instance. ++ ++ The name of the cell (see cell-error) is the name of the slot. ++ ++See Also:: ++.......... ++ ++*note cell-error-name:: , unbound-slot-object, *note Condition System ++Concepts:: ++ ++ ++File: gcl.info, Node: unbound-slot-instance, Prev: unbound-slot, Up: Objects Dictionary ++ ++7.7.41 unbound-slot-instance [Function] ++--------------------------------------- ++ ++'unbound-slot-instance' condition => instance ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type unbound-slot. ++ ++ instance--an object. ++ ++Description:: ++............. ++ ++Returns the instance which had the unbound slot in the situation ++represented by the condition. ++ ++See Also:: ++.......... ++ ++*note cell-error-name:: , unbound-slot, *note Condition System ++Concepts:: ++ ++ ++File: gcl.info, Node: Structures, Next: Conditions, Prev: Objects, Up: Top ++ ++8 Structures ++************ ++ ++* Menu: ++ ++* Structures Dictionary:: ++ ++ ++File: gcl.info, Node: Structures Dictionary, Prev: Structures, Up: Structures ++ ++8.1 Structures Dictionary ++========================= ++ ++* Menu: ++ ++* defstruct:: ++* copy-structure:: ++ ++ ++File: gcl.info, Node: defstruct, Next: copy-structure, Prev: Structures Dictionary, Up: Structures Dictionary ++ ++8.1.1 defstruct [Macro] ++----------------------- ++ ++'defstruct' name-and-options [documentation] {!slot-description}* ++=> structure-name ++ ++ name-and-options ::=structure-name | (structure-name [[!options]]) ++ ++ options ::=!conc-name-option | {!constructor-option}* | ++ !copier-option | !include-option | ++ !initial-offset-option | !named-option | ++ !predicate-option | !printer-option | ++ !type-option ++ ++ conc-name-option ::=:conc-name | (:conc-name) | (:conc-name conc-name) ++ ++ constructor-option ::=:constructor | ++ (:constructor) | ++ (:constructor constructor-name) | ++ (:constructor constructor-name constructor-arglist) ++ ++ copier-option ::=:copier | (:copier) | (:copier copier-name) ++ ++ predicate-option ::=:predicate | (:predicate) | (:predicate predicate-name) ++ ++ include-option ::=(:include included-structure-name {!slot-description}*) ++ ++ printer-option ::=!print-object-option | !print-function-option ++ ++ print-object-option ::=(:print-object printer-name) | (:print-object) ++ ++ print-function-option ::=(:print-function printer-name) | (:print-function) ++ ++ type-option ::=(:type type) ++ ++ named-option ::=:named ++ ++ initial-offset-option ::=(:initial-offset initial-offset) ++ ++ slot-description ::=slot-name | ++ (slot-name [slot-initform [[!slot-option]]]) ++ ++ slot-option ::=:type slot-type | ++ :read-only slot-read-only-p ++ ++Arguments and Values:: ++...................... ++ ++conc-name--a string designator. ++ ++ constructor-arglist--a boa lambda list. ++ ++ constructor-name--a symbol. ++ ++ copier-name--a symbol. ++ ++ included-structure-name--an already-defined structure name. ++ ++ Note that a derived type is not permissible, even if it would expand ++into a structure name. ++ ++ initial-offset--a non-negative integer. ++ ++ predicate-name--a symbol. ++ ++ printer-name--a function name or a lambda expression. ++ ++ slot-name--a symbol. ++ ++ slot-initform--a form. ++ ++ slot-read-only-p--a generalized boolean. ++ ++ structure-name--a symbol. ++ ++ type--one of the type specifiers list, vector, or (vector size), or ++some other type specifier defined by the implementation to be ++appropriate. ++ ++ documentation--a string; not evaluated. ++ ++Description:: ++............. ++ ++defstruct defines a structured type, named structure-type, with named ++slots as specified by the slot-options. ++ ++ defstruct defines readers for the slots and arranges for setf to work ++properly on such reader functions. Also, unless overridden, it defines ++a predicate named name-p, defines a constructor function named ++make-constructor-name, and defines a copier function named ++copy-constructor-name. All names of automatically created functions ++might automatically be declared inline (at the discretion of the ++implementation). ++ ++ If documentation is supplied, it is attached to structure-name as a ++documentation string of kind structure, ++ ++ and unless :type is used, the documentation is also attached to ++structure-name as a documentation string of kind type and as a ++documentation string to the class object for the class named ++structure-name. ++ ++ defstruct defines a constructor function that is used to create ++instances of the structure created by defstruct. The default name is ++make-structure-name. A different name can be supplied by giving the ++name as the argument to the constructor option. nil indicates that no ++constructor function will be created. ++ ++ After a new structure type has been defined, instances of that type ++normally can be created by using the constructor function for the type. ++A call to a constructor function is of the following form: ++ ++ (constructor-function-name ++ slot-keyword-1 form-1 ++ slot-keyword-2 form-2 ++ ...) ++ ++ The arguments to the constructor function are all keyword arguments. ++Each slot keyword argument must be a keyword whose name corresponds to ++the name of a structure slot. All the keywords and forms are evaluated. ++If a slot is not initialized in this way, it is initialized by ++evaluating slot-initform in the slot description ++ ++ at the time the constructor function is called. ++ ++ If no slot-initform is supplied, the consequences are undefined if an ++attempt is later made to read the slot's value before a value is ++explicitly assigned. ++ ++ Each slot-initform supplied for a defstruct component, when used by ++the constructor function for an otherwise unsupplied component, is ++re-evaluated on every call to the constructor function. ++ ++ The slot-initform is not evaluated unless it is needed in the ++creation of a particular structure instance. If it is never needed, ++there can be no type-mismatch error, even if the type of the slot is ++specified; no warning should be issued in this case. ++ ++ For example, in the following sequence, only the last call is an ++error. ++ ++ (defstruct person (name 007 :type string)) ++ (make-person :name "James") ++ (make-person) ++ ++ It is as if the slot-initforms were used as initialization forms for ++the keyword parameters of the constructor function. ++ ++ The symbols which name the slots must not be used by the ++implementation as the names for the lambda variables in the constructor ++function, since one or more of those symbols might have been proclaimed ++special or might be defined as the name of a constant variable. The ++slot default init forms are evaluated in the lexical environment in ++which the defstruct form itself appears and in the dynamic environment ++in which the call to the constructor function appears. ++ ++ For example, if the form (gensym) were used as an initialization ++form, either in the constructor-function call or as the default ++initialization form in defstruct, then every call to the constructor ++function would call gensym once to generate a new symbol. ++ ++ Each slot-description in defstruct can specify zero or more ++slot-options. ++ ++ A slot-option consists of a pair of a keyword and a value (which is ++not a form to be evaluated, but the value itself). For example: ++ ++ (defstruct ship ++ (x-position 0.0 :type short-float) ++ (y-position 0.0 :type short-float) ++ (x-velocity 0.0 :type short-float) ++ (y-velocity 0.0 :type short-float) ++ (mass *default-ship-mass* :type short-float :read-only t)) ++ ++ This specifies that each slot always contains a short float, and that ++the last slot cannot be altered once a ship is constructed. ++ ++ The available slot-options are: ++ ++:type type ++ This specifies that the contents of the slot is always of type ++ type. This is entirely analogous to the declaration of a variable ++ or function; it effectively declares the result type of the reader ++ function. It is implementation-dependent whether the type is ++ checked when initializing a slot or when assigning to it. Type is ++ not evaluated; it must be a valid type specifier. ++ ++:read-only x ++ When x is true, this specifies that this slot cannot be altered; it ++ will always contain the value supplied at construction time. setf ++ will not accept the reader function for this slot. If x is false, ++ this slot-option has no effect. X is not evaluated. ++ ++ When this option is false or unsupplied, it is ++ implementation-dependent whether the ability to write the slot is ++ implemented by a setf function or a setf expander. ++ ++ The following keyword options are available for use with defstruct. ++A defstruct option can be either a keyword or a list of a keyword and ++arguments for that keyword; specifying the keyword by itself is ++equivalent to specifying a list consisting of the keyword and no ++arguments. The syntax for defstruct options differs from the pair ++syntax used for slot-options. No part of any of these options is ++evaluated. ++ ++:conc-name ++ This provides for automatic prefixing of names of reader (or ++ access) functions. The default behavior is to begin the names of ++ all the reader functions of a structure with the name of the ++ structure followed by a hyphen. ++ ++ :conc-name supplies an alternate prefix to be used. If a hyphen is ++ to be used as a separator, it must be supplied as part of the ++ prefix. If :conc-name is nil or no argument is supplied, then no ++ prefix is used; then the names of the reader functions are the same ++ as the slot names. If a non-nil prefix is given, the name of the ++ reader function for each slot is constructed by concatenating that ++ prefix and the name of the slot, and interning the resulting symbol ++ in the package that is current at the time the defstruct form is ++ expanded. ++ ++ Note that no matter what is supplied for :conc-name, slot keywords ++ that match the slot names with no prefix attached are used with a ++ constructor function. The reader function name is used in ++ conjunction with setf. Here is an example: ++ ++ (defstruct (door (:conc-name dr-)) knob-color width material) => DOOR ++ (setq my-door (make-door :knob-color 'red :width 5.0)) ++ => #S(DOOR :KNOB-COLOR RED :WIDTH 5.0 :MATERIAL NIL) ++ (dr-width my-door) => 5.0 ++ (setf (dr-width my-door) 43.7) => 43.7 ++ (dr-width my-door) => 43.7 ++ ++ Whether or not the :conc-name option is explicitly supplied, the ++ following rule governs name conflicts of generated reader (or ++ accessor) names: For any structure type S_1 having a reader ++ function named R for a slot named X_1 that is inherited by another ++ structure type S_2 that would have a reader function with the same ++ name R for a slot named X_2, no definition for R is generated by ++ the definition of S_2; instead, the definition of R is inherited ++ from the definition of S_1. (In such a case, if X_1 and X_2 are ++ different slots, the implementation might signal a style warning.) ++ ++:constructor ++ This option takes zero, one, or two arguments. If at least one ++ argument is supplied and the first argument is not nil, then that ++ argument is a symbol which specifies the name of the constructor ++ function. If the argument is not supplied (or if the option itself ++ is not supplied), the name of the constructor is produced by ++ concatenating the string "MAKE-" and the name of the structure, ++ interning the name in whatever package is current at the time ++ defstruct is expanded. If the argument is provided and is nil, no ++ constructor function is defined. ++ ++ If :constructor is given as (:constructor name arglist), then ++ instead of making a keyword driven constructor function, defstruct ++ defines a "positional" constructor function, taking arguments whose ++ meaning is determined by the argument's position and possibly by ++ keywords. Arglist is used to describe what the arguments to the ++ constructor will be. In the simplest case something like ++ (:constructor make-foo (a b c)) defines make-foo to be a ++ three-argument constructor function whose arguments are used to ++ initialize the slots named a, b, and c. ++ ++ Because a constructor of this type operates "By Order of ++ Arguments," it is sometimes known as a "boa constructor." ++ ++ For information on how the arglist for a "boa constructor" is ++ processed, see *note Boa Lambda Lists::. ++ ++ It is permissible to use the :constructor option more than once, so ++ that you can define several different constructor functions, each ++ taking different parameters. ++ ++ [Reviewer Note by Barmar: What about (:constructor) and ++ (:constructor nil). Should we worry about it?] ++ ++ defstruct creates the default-named keyword constructor function ++ only if no explicit :constructor options are specified, or if the ++ :constructor option is specified without a name argument. ++ ++ (:constructor nil) is meaningful only when there are no other ++ :constructor options specified. It prevents defstruct from ++ generating any constructors at all. ++ ++ Otherwise, defstruct creates a constructor function corresponding ++ to each supplied :constructor option. It is permissible to specify ++ multiple keyword constructor functions as well as multiple "boa ++ constructors". ++ ++:copier ++ This option takes one argument, a symbol, which specifies the name ++ of the copier function. If the argument is not provided or if the ++ option itself is not provided, the name of the copier is produced ++ by concatenating the string "COPY-" and the name of the structure, ++ interning the name in whatever package is current at the time ++ defstruct is expanded. If the argument is provided and is nil, no ++ copier function is defined. ++ ++ The automatically defined copier function is a function of one ++ argument, ++ ++ which must be of the structure type being defined. ++ ++ The copier function creates a fresh structure that has the same ++ type as its argument, and that has the same component values as the ++ original structure; that is, the component values are not copied ++ recursively. ++ ++ If the defstruct :type option was not used, the following ++ equivalence applies: ++ ++ (copier-name x) = (copy-structure (the structure-name x)) ++ ++:include ++ This option is used for building a new structure definition as an ++ extension of another structure definition. For example: ++ ++ (defstruct person name age sex) ++ ++ To make a new structure to represent an astronaut that has the ++ attributes of name, age, and sex, and functions that operate on ++ person structures, astronaut is defined with :include as follows: ++ ++ (defstruct (astronaut (:include person) ++ (:conc-name astro-)) ++ helmet-size ++ (favorite-beverage 'tang)) ++ ++ :include causes the structure being defined to have the same slots ++ as the included structure. This is done in such a way that the ++ reader functions for the included structure also work on the ++ structure being defined. In this example, an astronaut therefore ++ has five slots: the three defined in person and the two defined in ++ astronaut itself. The reader functions defined by the person ++ structure can be applied to instances of the astronaut structure, ++ and they work correctly. Moreover, astronaut has its own reader ++ functions for components defined by the person structure. The ++ following examples illustrate the use of astronaut structures: ++ ++ (setq x (make-astronaut :name 'buzz ++ :age 45. ++ :sex t ++ :helmet-size 17.5)) ++ (person-name x) => BUZZ ++ (astro-name x) => BUZZ ++ (astro-favorite-beverage x) => TANG ++ ++ (reduce #'+ astros :key #'person-age) ; obtains the total of the ages ++ ; of the possibly empty ++ ; sequence of astros ++ ++ The difference between the reader functions person-name and ++ astro-name is that person-name can be correctly applied to any ++ person, including an astronaut, while astro-name can be correctly ++ applied only to an astronaut. An implementation might check for ++ incorrect use of reader functions. ++ ++ At most one :include can be supplied in a single defstruct. The ++ argument to :include is required and must be the name of some ++ previously defined structure. If the structure being defined has ++ no :type option, then the included structure must also have had no ++ :type option supplied for it. If the structure being defined has a ++ :type option, then the included structure must have been declared ++ with a :type option specifying the same representation type. ++ ++ If no :type option is involved, then the structure name of the ++ including structure definition becomes the name of a data type, and ++ therefore a valid type specifier recognizable by typep; it becomes ++ a subtype of the included structure. In the above example, ++ astronaut is a subtype of person; hence ++ ++ (typep (make-astronaut) 'person) => true ++ ++ indicating that all operations on persons also work on astronauts. ++ ++ The structure using :include can specify default values or ++ slot-options for the included slots different from those the ++ included structure specifies, by giving the :include option as: ++ ++ (:include included-structure-name {slot-description}*) ++ ++ Each slot-description must have a slot-name that is the same as ++ that of some slot in the included structure. If a slot-description ++ has no slot-initform, then in the new structure the slot has no ++ initial value. Otherwise its initial value form is replaced by the ++ slot-initform in the slot-description. A normally writable slot ++ can be made read-only. If a slot is read-only in the included ++ structure, then it must also be so in the including structure. If ++ a type is supplied for a slot, it must be a subtype of the type ++ specified in the included structure. ++ ++ For example, if the default age for an astronaut is 45, then ++ ++ (defstruct (astronaut (:include person (age 45))) ++ helmet-size ++ (favorite-beverage 'tang)) ++ ++ If :include is used with the :type option, then the effect is first ++ to skip over as many representation elements as needed to represent ++ the included structure, then to skip over any additional elements ++ supplied by the :initial-offset option, and then to begin ++ allocation of elements from that point. For example: ++ ++ (defstruct (binop (:type list) :named (:initial-offset 2)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) => BINOP ++ (defstruct (annotated-binop (:type list) ++ (:initial-offset 3) ++ (:include binop)) ++ commutative associative identity) => ANNOTATED-BINOP ++ (make-annotated-binop :operator '* ++ :operand-1 'x ++ :operand-2 5 ++ :commutative t ++ :associative t ++ :identity 1) ++ => (NIL NIL BINOP * X 5 NIL NIL NIL T T 1) ++ ++ The first two nil elements stem from the :initial-offset of 2 in ++ the definition of binop. The next four elements contain the ++ structure name and three slots for binop. The next three nil ++ elements stem from the :initial-offset of 3 in the definition of ++ annotated-binop. The last three list elements contain the ++ additional slots for an annotated-binop. ++ ++:initial-offset ++ :initial-offset instructs defstruct to skip over a certain number ++ of slots before it starts allocating the slots described in the ++ body. This option's argument is the number of slots defstruct ++ should skip. :initial-offset can be used only if :type is also ++ supplied. ++ ++ [Reviewer Note by Barmar: What are initial values of the skipped ++ slots?] ++ ++ :initial-offset allows slots to be allocated beginning at a ++ representational element other than the first. For example, the ++ form ++ ++ (defstruct (binop (:type list) (:initial-offset 2)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) => BINOP ++ ++ would result in the following behavior for make-binop: ++ ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) ++ => (NIL NIL + X 5) ++ (make-binop :operand-2 4 :operator '*) ++ => (NIL NIL * NIL 4) ++ ++ The selector functions binop-operator, binop-operand-1, and ++ binop-operand-2 would be essentially equivalent to third, fourth, ++ and fifth, respectively. Similarly, the form ++ ++ (defstruct (binop (:type list) :named (:initial-offset 2)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) => BINOP ++ ++ would result in the following behavior for make-binop: ++ ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) => (NIL NIL BINOP + X 5) ++ (make-binop :operand-2 4 :operator '*) => (NIL NIL BINOP * NIL 4) ++ ++ The first two nil elements stem from the :initial-offset of 2 in ++ the definition of binop. The next four elements contain the ++ structure name and three slots for binop. ++ ++:named ++ :named specifies that the structure is named. If no :type is ++ supplied, then the structure is always named. ++ ++ For example: ++ ++ (defstruct (binop (:type list)) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) => BINOP ++ ++ This defines a constructor function make-binop and three selector ++ functions, namely binop-operator, binop-operand-1, and ++ binop-operand-2. (It does not, however, define a predicate ++ binop-p, for reasons explained below.) ++ ++ The effect of make-binop is simply to construct a list of length ++ three: ++ ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) => (+ X 5) ++ (make-binop :operand-2 4 :operator '*) => (* NIL 4) ++ ++ It is just like the function list except that it takes keyword ++ arguments and performs slot defaulting appropriate to the binop ++ conceptual data type. Similarly, the selector functions ++ binop-operator, binop-operand-1, and binop-operand-2 are ++ essentially equivalent to car, cadr, and caddr, respectively. They ++ might not be completely equivalent because, for example, an ++ implementation would be justified in adding error-checking code to ++ ensure that the argument to each selector function is a length-3 ++ list. ++ ++ binop is a conceptual data type in that it is not made a part of ++ the Common Lisp type system. typep does not recognize binop as a ++ type specifier, and type-of returns list when given a binop ++ structure. There is no way to distinguish a data structure ++ constructed by make-binop from any other list that happens to have ++ the correct structure. ++ ++ There is not any way to recover the structure name binop from a ++ structure created by make-binop. This can only be done if the ++ structure is named. A named structure has the property that, given ++ an instance of the structure, the structure name (that names the ++ type) can be reliably recovered. For structures defined with no ++ :type option, the structure name actually becomes part of the ++ Common Lisp data-type system. type-of, when applied to such a ++ structure, returns the structure name as the type of the object; ++ typep recognizes the structure name as a valid type specifier. ++ ++ For structures defined with a :type option, type-of returns a type ++ specifier such as list or (vector t), depending on the type ++ supplied to the :type option. The structure name does not become a ++ valid type specifier. However, if the :named option is also ++ supplied, then the first component of the structure (as created by ++ a defstruct constructor function) always contains the structure ++ name. This allows the structure name to be recovered from an ++ instance of the structure and allows a reasonable predicate for the ++ conceptual type to be defined: the automatically defined name-p ++ predicate for the structure operates by first checking that its ++ argument is of the proper type (list, (vector t), or whatever) and ++ then checking whether the first component contains the appropriate ++ type name. ++ ++ Consider the binop example shown above, modified only to include ++ the :named option: ++ ++ (defstruct (binop (:type list) :named) ++ (operator '? :type symbol) ++ operand-1 ++ operand-2) => BINOP ++ ++ As before, this defines a constructor function make-binop and three ++ selector functions binop-operator, binop-operand-1, and ++ binop-operand-2. It also defines a predicate binop-p. The effect ++ of make-binop is now to construct a list of length four: ++ ++ (make-binop :operator '+ :operand-1 'x :operand-2 5) => (BINOP + X 5) ++ (make-binop :operand-2 4 :operator '*) => (BINOP * NIL 4) ++ ++ The structure has the same layout as before except that the ++ structure name binop is included as the first list element. The ++ selector functions binop-operator, binop-operand-1, and ++ binop-operand-2 are essentially equivalent to cadr, caddr, and ++ cadddr, respectively. The predicate binop-p is more or less ++ equivalent to this definition: ++ ++ (defun binop-p (x) ++ (and (consp x) (eq (car x) 'binop))) => BINOP-P ++ ++ The name binop is still not a valid type specifier recognizable to ++ typep, but at least there is a way of distinguishing binop ++ structures from other similarly defined structures. ++ ++:predicate ++ This option takes one argument, which specifies the name of the ++ type predicate. If the argument is not supplied or if the option ++ itself is not supplied, the name of the predicate is made by ++ concatenating the name of the structure to the string "-P", ++ interning the name in whatever package is current at the time ++ defstruct is expanded. If the argument is provided and is nil, no ++ predicate is defined. A predicate can be defined only if the ++ structure is named; if :type is supplied and :named is not ++ supplied, then :predicate must either be unsupplied or have the ++ value nil. ++ ++:print-function, :print-object ++ The :print-function and :print-object options specify that a ++ print-object method for structures of type structure-name should be ++ generated. These options are not synonyms, but do perform a ++ similar service; the choice of which option (:print-function or ++ :print-object) is used affects how the function named printer-name ++ is called. Only one of these options may be used, and these ++ options may be used only if :type is not supplied. ++ ++ If the :print-function option is used, then when a structure of ++ type structure-name is to be printed, the designated printer ++ function is called on three arguments: ++ ++ - ++ the structure to be printed (a generalized instance of ++ structure-name). ++ ++ - ++ a stream to print to. ++ ++ - ++ an integer indicating the current depth. The magnitude of ++ this integer may vary between implementations; however, it can ++ reliably be compared against *print-level* to determine ++ whether depth abbreviation is appropriate. ++ ++ Specifying (:print-function printer-name) is approximately ++ equivalent to specifying: ++ ++ (defmethod print-object ((object structure-name) stream) ++ (funcall (function printer-name) object stream <>)) ++ ++ where the <> represents the printer's belief ++ of how deep it is currently printing. It is ++ implementation-dependent whether <> is always ++ 0 and *print-level*, if non-nil, is re-bound to successively ++ smaller values as printing descends recursively, or whether ++ current-print-depth varies in value as printing descends ++ recursively and *print-level* remains constant during the same ++ traversal. ++ ++ If the :print-object option is used, then when a structure of type ++ structure-name is to be printed, the designated printer function is ++ called on two arguments: ++ ++ - ++ the structure to be printed. ++ ++ - ++ the stream to print to. ++ ++ Specifying (:print-object printer-name) is equivalent to ++ specifying: ++ ++ (defmethod print-object ((object structure-name) stream) ++ (funcall (function printer-name) object stream)) ++ ++ If no :type option is supplied, and if either a :print-function or ++ a :print-object option is supplied, and if no printer-name is ++ supplied, then a print-object method specialized for structure-name ++ is generated that calls a function that implements the default ++ printing behavior for structures using #S notation; see *note ++ Printing Structures::. ++ ++ If neither a :print-function nor a :print-object option is ++ supplied, then defstruct does not generate a print-object method ++ specialized for structure-name and some default behavior is ++ inherited either from a structure named in an :include option or ++ from the default behavior for printing structures; see the function ++ print-object and *note Printing Structures::. ++ ++ When *print-circle* is true, a user-defined print function can ++ print objects to the supplied stream using write, prin1, princ, or ++ format and expect circularities to be detected and printed using ++ the #n# syntax. This applies to methods on print-object in ++ addition to :print-function options. If a user-defined print ++ function prints to a stream other than the one that was supplied, ++ then circularity detection starts over for that stream. See the ++ variable *print-circle*. ++ ++:type ++ :type explicitly specifies the representation to be used for the ++ structure. Its argument must be one of these types: ++ ++ vector ++ This produces the same result as specifying (vector t). The ++ structure is represented as a general vector, storing ++ components as vector elements. The first component is vector ++ element 1 if the structure is :named, and element 0 otherwise. ++ ++ [Reviewer Note by Barmar: Do any implementations create ++ non-simple vectors?] ++ ++ (vector element-type) ++ The structure is represented as a (possibly specialized) ++ vector, storing components as vector elements. Every ++ component must be of a type that can be stored in a vector of ++ the type specified. The first component is vector element 1 ++ if the structure is :named, and element 0 otherwise. The ++ structure can be :named only if the type symbol is a subtype ++ of the supplied element-type. ++ ++ list ++ The structure is represented as a list. The first component ++ is the cadr if the structure is :named, and the car if it is ++ not :named. ++ ++ Specifying this option has the effect of forcing a specific ++ representation and of forcing the components to be stored in the ++ order specified in defstruct in corresponding successive elements ++ of the specified representation. It also prevents the structure ++ name from becoming a valid type specifier recognizable by typep. ++ ++ For example: ++ ++ (defstruct (quux (:type list) :named) x y) ++ ++ should make a constructor that builds a list exactly like the one ++ that list produces, with quux as its car. ++ ++ If this type is defined: ++ ++ (deftype quux () '(satisfies quux-p)) ++ ++ then this form ++ ++ (typep (make-quux) 'quux) ++ ++ should return precisely what this one does ++ ++ (typep (list 'quux nil nil) 'quux) ++ ++ If :type is not supplied, the structure is represented as an object ++ of type structure-object. ++ ++ defstruct without a :type option defines a class with the structure ++ name as its name. The metaclass of structure instances is ++ structure-class. ++ ++ The consequences of redefining a defstruct structure are undefined. ++ ++ In the case where no defstruct options have been supplied, the ++following functions are automatically defined to operate on instances of ++the new structure: ++ ++Predicate ++ A predicate with the name structure-name-p is defined to test ++ membership in the structure type. The predicate (structure-name-p ++ object) is true if an object is of this type; otherwise it is ++ false. typep can also be used with the name of the new type to ++ test whether an object belongs to the type. Such a function call ++ has the form (typep object 'structure-name). ++ ++Component reader functions ++ Reader functions are defined to read the components of the ++ structure. For each slot name, there is a corresponding reader ++ function with the name structure-name-slot-name. This function ++ reads the contents of that slot. Each reader function takes one ++ argument, which is an instance of the structure type. setf can be ++ used with any of these reader functions to alter the slot contents. ++ ++Constructor function ++ A constructor function with the name make-structure-name is ++ defined. This function creates and returns new instances of the ++ structure type. ++ ++Copier function ++ A copier function with the name copy-structure-name is defined. ++ The copier function takes an object of the structure type and ++ creates a new object of the same type that is a copy of the first. ++ The copier function creates a new structure with the same component ++ entries as the original. Corresponding components of the two ++ structure instances are eql. ++ ++ If a defstruct form appears as a top level form, the compiler must ++make the structure type name recognized as a valid type name in ++subsequent declarations (as for deftype) and make the structure slot ++readers known to setf. In addition, the compiler must save enough ++information about the structure type so that further defstruct ++definitions can use :include in a subsequent deftype in the same file to ++refer to the structure type name. The functions which defstruct ++generates are not defined in the compile time environment, although the ++compiler may save enough information about the functions to code ++subsequent calls inline. The #S reader macro might or might not ++recognize the newly defined structure type name at compile time. ++ ++Examples:: ++.......... ++ ++An example of a structure definition follows: ++ ++ (defstruct ship ++ x-position ++ y-position ++ x-velocity ++ y-velocity ++ mass) ++ ++ This declares that every ship is an object with five named ++components. The evaluation of this form does the following: ++ ++1. ++ It defines ship-x-position to be a function of one argument, a ++ ship, that returns the x-position of the ship; ship-y-position and ++ the other components are given similar function definitions. These ++ functions are called the access functions, as they are used to ++ access elements of the structure. ++ ++2. ++ ship becomes the name of a type of which instances of ships are ++ elements. ship becomes acceptable to typep, for example; (typep x ++ 'ship) is true if x is a ship and false if x is any object other ++ than a ship. ++ ++3. ++ A function named ship-p of one argument is defined; it is a ++ predicate that is true if its argument is a ship and is false ++ otherwise. ++ ++4. ++ A function called make-ship is defined that, when invoked, creates ++ a data structure with five components, suitable for use with the ++ access functions. Thus executing ++ ++ (setq ship2 (make-ship)) ++ ++ sets ship2 to a newly created ship object. One can supply the ++ initial values of any desired component in the call to make-ship by ++ using keyword arguments in this way: ++ ++ (setq ship2 (make-ship :mass *default-ship-mass* ++ :x-position 0 ++ :y-position 0)) ++ ++ This constructs a new ship and initializes three of its components. ++ This function is called the "constructor function" because it ++ constructs a new structure. ++ ++5. ++ A function called copy-ship of one argument is defined that, when ++ given a ship object, creates a new ship object that is a copy of ++ the given one. This function is called the "copier function." ++ ++ setf can be used to alter the components of a ship: ++ ++ (setf (ship-x-position ship2) 100) ++ ++ This alters the x-position of ship2 to be 100. This works because ++defstruct behaves as if it generates an appropriate defsetf for each ++access function. ++ ++ ;;; ++ ;;; Example 1 ++ ;;; define town structure type ++ ;;; area, watertowers, firetrucks, population, elevation are its components ++ ;;; ++ (defstruct town ++ area ++ watertowers ++ (firetrucks 1 :type fixnum) ;an initialized slot ++ population ++ (elevation 5128 :read-only t)) ;a slot that can't be changed ++ => TOWN ++ ;create a town instance ++ (setq town1 (make-town :area 0 :watertowers 0)) => #S(TOWN...) ++ ;town's predicate recognizes the new instance ++ (town-p town1) => true ++ ;new town's area is as specified by make-town ++ (town-area town1) => 0 ++ ;new town's elevation has initial value ++ (town-elevation town1) => 5128 ++ ;setf recognizes reader function ++ (setf (town-population town1) 99) => 99 ++ (town-population town1) => 99 ++ ;copier function makes a copy of town1 ++ (setq town2 (copy-town town1)) => #S(TOWN...) ++ (= (town-population town1) (town-population town2)) => true ++ ;since elevation is a read-only slot, its value can be set only ++ ;when the structure is created ++ (setq town3 (make-town :area 0 :watertowers 3 :elevation 1200)) ++ => #S(TOWN...) ++ ;;; ++ ;;; Example 2 ++ ;;; define clown structure type ++ ;;; this structure uses a nonstandard prefix ++ ;;; ++ (defstruct (clown (:conc-name bozo-)) ++ (nose-color 'red) ++ frizzy-hair-p polkadots) => CLOWN ++ (setq funny-clown (make-clown)) => #S(CLOWN) ++ ;use non-default reader name ++ (bozo-nose-color funny-clown) => RED ++ (defstruct (klown (:constructor make-up-klown) ;similar def using other ++ (:copier clone-klown) ;customizing keywords ++ (:predicate is-a-bozo-p)) ++ nose-color frizzy-hair-p polkadots) => klown ++ ;custom constructor now exists ++ (fboundp 'make-up-klown) => true ++ ;;; ++ ;;; Example 3 ++ ;;; define a vehicle structure type ++ ;;; then define a truck structure type that includes ++ ;;; the vehicle structure ++ ;;; ++ (defstruct vehicle name year (diesel t :read-only t)) => VEHICLE ++ (defstruct (truck (:include vehicle (year 79))) ++ load-limit ++ (axles 6)) => TRUCK ++ (setq x (make-truck :name 'mac :diesel t :load-limit 17)) ++ => #S(TRUCK...) ++ ;vehicle readers work on trucks ++ (vehicle-name x) ++ => MAC ++ ;default taken from :include clause ++ (vehicle-year x) ++ => 79 ++ (defstruct (pickup (:include truck)) ;pickup type includes truck ++ camper long-bed four-wheel-drive) => PICKUP ++ (setq x (make-pickup :name 'king :long-bed t)) => #S(PICKUP...) ++ ;:include default inherited ++ (pickup-year x) => 79 ++ ;;; ++ ;;; Example 4 ++ ;;; use of BOA constructors ++ ;;; ++ (defstruct (dfs-boa ;BOA constructors ++ (:constructor make-dfs-boa (a b c)) ++ (:constructor create-dfs-boa ++ (a &optional b (c 'cc) &rest d &aux e (f 'ff)))) ++ a b c d e f) => DFS-BOA ++ ;a, b, and c set by position, and the rest are uninitialized ++ (setq x (make-dfs-boa 1 2 3)) => #(DFS-BOA...) ++ (dfs-boa-a x) => 1 ++ ;a and b set, c and f defaulted ++ (setq x (create-dfs-boa 1 2)) => #(DFS-BOA...) ++ (dfs-boa-b x) => 2 ++ (eq (dfs-boa-c x) 'cc) => true ++ ;a, b, and c set, and the rest are collected into d ++ (setq x (create-dfs-boa 1 2 3 4 5 6)) => #(DFS-BOA...) ++ (dfs-boa-d x) => (4 5 6) ++ ++Exceptional Situations:: ++........................ ++ ++If any two slot names (whether present directly or inherited by the ++:include option) are the same under string=, defstruct should signal an ++error of type program-error. ++ ++ The consequences are undefined if the included-structure-name does ++not name a structure type. ++ ++See Also:: ++.......... ++ ++*note documentation:: , *note print-object:: , *note setf:: , *note ++subtypep:: , *note type-of:: , *note typep:: , *note Compilation:: ++ ++Notes:: ++....... ++ ++The printer-name should observe the values of such printer-control ++variables as *print-escape*. ++ ++ The restriction against issuing a warning for type mismatches between ++a slot-initform and the corresponding slot's :type option is necessary ++because a slot-initform must be specified in order to specify slot ++options; in some cases, no suitable default may exist. ++ ++ The mechanism by which defstruct arranges for slot accessors to be ++usable with setf is implementation-dependent; for example, it may use ++setf functions, setf expanders, or some other implementation-dependent ++mechanism known to that implementation's code for setf. ++ ++ ++File: gcl.info, Node: copy-structure, Prev: defstruct, Up: Structures Dictionary ++ ++8.1.2 copy-structure [Function] ++------------------------------- ++ ++'copy-structure' structure => copy ++ ++Arguments and Values:: ++...................... ++ ++structure--a structure. ++ ++ copy--a copy of the structure. ++ ++Description:: ++............. ++ ++Returns a copy_6 of the structure. ++ ++ Only the structure itself is copied; not the values of the slots. ++ ++See Also:: ++.......... ++ ++the :copier option to *note defstruct:: ++ ++Notes:: ++....... ++ ++The copy is the same as the given structure under equalp, but not under ++equal. ++ ++ ++File: gcl.info, Node: Conditions, Next: Symbols, Prev: Structures, Up: Top ++ ++9 Conditions ++************ ++ ++* Menu: ++ ++* Condition System Concepts:: ++* Conditions Dictionary:: ++ ++ ++File: gcl.info, Node: Condition System Concepts, Next: Conditions Dictionary, Prev: Conditions, Up: Conditions ++ ++9.1 Condition System Concepts ++============================= ++ ++Common Lisp constructs are described not only in terms of their behavior ++in situations during which they are intended to be used (see the ++"Description" part of each operator specification), but in all other ++situations (see the "Exceptional Situations" part of each operator ++specification). ++ ++ A situation is the evaluation of an expression in a specific context. ++A condition is an object that represents a specific situation that has ++been detected. Conditions are generalized instances of the class ++condition. A hierarchy of condition classes is defined in Common Lisp. ++A condition has slots that contain data relevant to the situation that ++the condition represents. ++ ++ An error is a situation in which normal program execution cannot ++continue correctly without some form of intervention (either ++interactively by the user or under program control). Not all errors are ++detected. When an error goes undetected, the effects can be ++implementation-dependent, implementation-defined, unspecified, or ++undefined. See *note Definitions::. All detected errors can be ++represented by conditions, but not all conditions represent errors. ++ ++ Signaling is the process by which a condition can alter the flow of ++control in a program by raising the condition which can then be handled. ++The functions error, cerror, signal, and warn are used to signal ++conditions. ++ ++ The process of signaling involves the selection and invocation of a ++handler from a set of active handlers. A handler is a function of one ++argument (the condition) that is invoked to handle a condition. Each ++handler is associated with a condition type, and a handler will be ++invoked only on a condition of the handler's associated type. ++ ++ Active handlers are established dynamically (see handler-bind or ++handler-case). Handlers are invoked in a dynamic environment equivalent ++to that of the signaler, except that the set of active handlers is bound ++in such a way as to include only those that were active at the time the ++handler being invoked was established. Signaling a condition has no ++side-effect on the condition, and there is no dynamic state contained in ++a condition. ++ ++ If a handler is invoked, it can address the situation in one of three ++ways: ++ ++Decline ++ It can decline to handle the condition. It does this by simply ++ returning rather than transferring control. When this happens, any ++ values returned by the handler are ignored and the next most ++ recently established handler is invoked. If there is no such ++ handler and the signaling function is error or cerror, the debugger ++ is entered in the dynamic environment of the signaler. If there is ++ no such handler and the signaling function is either signal or ++ warn, the signaling function simply returns~nil. ++ ++Handle ++ It can handle the condition by performing a non-local transfer of ++ control. This can be done either primitively by using go, return, ++ throw or more abstractly by using a function such as abort or ++ invoke-restart. ++ ++Defer ++ It can put off a decision about whether to handle or decline, by ++ any of a number of actions, but most commonly by signaling another ++ condition, resignaling the same condition, or forcing entry into ++ the debugger. ++ ++* Menu: ++ ++* Condition Types:: ++* Creating Conditions:: ++* Printing Conditions:: ++* Signaling and Handling Conditions:: ++* Assertions:: ++* Notes about the Condition System`s Background:: ++ ++ ++File: gcl.info, Node: Condition Types, Next: Creating Conditions, Prev: Condition System Concepts, Up: Condition System Concepts ++ ++9.1.1 Condition Types ++--------------------- ++ ++Figure 9-1 lists the standardized condition types. Additional condition ++types can be defined by using define-condition. ++ ++ arithmetic-error floating-point-overflow simple-type-error ++ cell-error floating-point-underflow simple-warning ++ condition package-error storage-condition ++ control-error parse-error stream-error ++ division-by-zero print-not-readable style-warning ++ end-of-file program-error type-error ++ error reader-error unbound-slot ++ file-error serious-condition unbound-variable ++ floating-point-inexact simple-condition undefined-function ++ floating-point-invalid-operation simple-error warning ++ ++ Figure 9-1: Standardized Condition Types ++ ++ ++ All condition types are subtypes of type condition. That is, ++ ++ (typep c 'condition) => true ++ ++ if and only if c is a condition. ++ ++ Implementations must define all specified subtype relationships. ++Except where noted, all subtype relationships indicated in this document ++are not mutually exclusive. A condition inherits the structure of its ++supertypes. ++ ++ The metaclass of the class condition is not specified. Names of ++condition types may be used to specify supertype relationships in ++define-condition, but the consequences are not specified if an attempt ++is made to use a condition type as a superclass in a defclass form. ++ ++ Figure 9-2 shows operators that define condition types and creating ++conditions. ++ ++ define-condition make-condition ++ ++ Figure 9-2: Operators that define and create conditions. ++ ++ ++ Figure 9-3 shows operators that read the value of condition slots. ++ ++ arithmetic-error-operands simple-condition-format-arguments ++ arithmetic-error-operation simple-condition-format-control ++ cell-error-name stream-error-stream ++ file-error-pathname type-error-datum ++ package-error-package type-error-expected-type ++ print-not-readable-object unbound-slot-instance ++ ++ Figure 9-3: Operators that read condition slots. ++ ++ ++* Menu: ++ ++* Serious Conditions:: ++ ++ ++File: gcl.info, Node: Serious Conditions, Prev: Condition Types, Up: Condition Types ++ ++9.1.1.1 Serious Conditions ++.......................... ++ ++A serious condition is a condition serious enough to require interactive ++intervention if not handled. Serious conditions are typically signaled ++with error or cerror; non-serious conditions are typically signaled with ++signal or warn. ++ ++ ++File: gcl.info, Node: Creating Conditions, Next: Printing Conditions, Prev: Condition Types, Up: Condition System Concepts ++ ++9.1.2 Creating Conditions ++------------------------- ++ ++The function make-condition can be used to construct a condition object ++explicitly. Functions such as error, cerror, signal, and warn operate ++on conditions and might create condition objects implicitly. Macros ++such as ccase, ctypecase, ecase, etypecase, check-type, and assert might ++also implicitly create (and signal) conditions. ++ ++* Menu: ++ ++* Condition Designators:: ++ ++ ++File: gcl.info, Node: Condition Designators, Prev: Creating Conditions, Up: Creating Conditions ++ ++9.1.2.1 Condition Designators ++............................. ++ ++A number of the functions in the condition system take arguments which ++are identified as condition designators . By convention, those ++arguments are notated as ++ ++ datum &rest arguments ++ ++ Taken together, the datum and the arguments are "designators for a ++condition of default type default-type." How the denoted condition is ++computed depends on the type of the datum: ++ ++* If the datum is a symbol ++ naming a condition type ... The denoted condition is the result of ++ ++ (apply #'make-condition datum arguments) ++ ++* If the datum is a format control ... ++ ++ The denoted condition is the result of ++ ++ (make-condition defaulted-type ++ :format-control datum ++ :format-arguments arguments) ++ ++ where the defaulted-type is a subtype of default-type. ++ ++* If the datum is a condition ... ++ The denoted condition is the datum itself. In this case, unless ++ otherwise specified by the description of the operator in question, ++ the arguments must be null; that is, the consequences are undefined ++ if any arguments were supplied. ++ ++ Note that the default-type gets used only in the case where the datum ++string is supplied. In the other situations, the resulting condition is ++not necessarily of type default-type. ++ ++ Here are some illustrations of how different condition designators ++can denote equivalent condition objects: ++ ++ (let ((c (make-condition 'arithmetic-error :operator '/ :operands '(7 0)))) ++ (error c)) ++ == (error 'arithmetic-error :operator '/ :operands '(7 0)) ++ ++ (error "Bad luck.") ++ == (error 'simple-error :format-control "Bad luck." :format-arguments '()) ++ ++ ++File: gcl.info, Node: Printing Conditions, Next: Signaling and Handling Conditions, Prev: Creating Conditions, Up: Condition System Concepts ++ ++9.1.3 Printing Conditions ++------------------------- ++ ++If the :report argument to define-condition is used, a print function is ++defined that is called whenever the defined condition is printed while ++the value of *print-escape* is false. This function is called the ++condition reporter ; the text which it outputs is called a report ++message . ++ ++ When a condition is printed and *print-escape* is false, the ++condition reporter for the condition is invoked. Conditions are printed ++automatically by functions such as invoke-debugger, break, and warn. ++ ++ When *print-escape* is true, the object should print in an ++abbreviated fashion according to the style of the implementation (e.g., ++by print-unreadable-object). It is not required that a condition can be ++recreated by reading its printed representation. ++ ++ No function is provided for directly accessing or invoking condition ++reporters. ++ ++* Menu: ++ ++* Recommended Style in Condition Reporting:: ++* Capitalization and Punctuation in Condition Reports:: ++* Leading and Trailing Newlines in Condition Reports:: ++* Embedded Newlines in Condition Reports:: ++* Note about Tabs in Condition Reports:: ++* Mentioning Containing Function in Condition Reports:: ++ ++ ++File: gcl.info, Node: Recommended Style in Condition Reporting, Next: Capitalization and Punctuation in Condition Reports, Prev: Printing Conditions, Up: Printing Conditions ++ ++9.1.3.1 Recommended Style in Condition Reporting ++................................................ ++ ++In order to ensure a properly aesthetic result when presenting report ++messages to the user, certain stylistic conventions are recommended. ++ ++ There are stylistic recommendations for the content of the messages ++output by condition reporters, but there are no formal requirements on ++those programs. If a program violates the recommendations for some ++message, the display of that message might be less aesthetic than if the ++guideline had been observed, but the program is still considered a ++conforming program. ++ ++ The requirements on a program or implementation which invokes a ++condition reporter are somewhat stronger. A conforming program must be ++permitted to assume that if these style guidelines are followed, proper ++aesthetics will be maintained. Where appropriate, any specific ++requirements on such routines are explicitly mentioned below. ++ ++ ++File: gcl.info, Node: Capitalization and Punctuation in Condition Reports, Next: Leading and Trailing Newlines in Condition Reports, Prev: Recommended Style in Condition Reporting, Up: Printing Conditions ++ ++9.1.3.2 Capitalization and Punctuation in Condition Reports ++........................................................... ++ ++It is recommended that a report message be a complete sentences, in the ++proper case and correctly punctuated. In English, for example, this ++means the first letter should be uppercase, and there should be a ++trailing period. ++ ++ (error "This is a message") ; Not recommended ++ (error "this is a message.") ; Not recommended ++ ++ (error "This is a message.") ; Recommended instead ++ ++ ++File: gcl.info, Node: Leading and Trailing Newlines in Condition Reports, Next: Embedded Newlines in Condition Reports, Prev: Capitalization and Punctuation in Condition Reports, Up: Printing Conditions ++ ++9.1.3.3 Leading and Trailing Newlines in Condition Reports ++.......................................................... ++ ++It is recommended that a report message not begin with any introductory ++text, such as "Error: " or "Warning: " or even just freshline or ++newline. Such text is added, if appropriate to the context, by the ++routine invoking the condition reporter. ++ ++ It is recommended that a report message not be followed by a trailing ++freshline or newline. Such text is added, if appropriate to the ++context, by the routine invoking the condition reporter. ++ ++ (error "This is a message.~ ++ (error "~&This is a message.") ; Not recommended ++ (error "~&This is a message.~ ++ ++ (error "This is a message.") ; Recommended instead ++ ++ ++File: gcl.info, Node: Embedded Newlines in Condition Reports, Next: Note about Tabs in Condition Reports, Prev: Leading and Trailing Newlines in Condition Reports, Up: Printing Conditions ++ ++9.1.3.4 Embedded Newlines in Condition Reports ++.............................................. ++ ++Especially if it is long, it is permissible and appropriate for a report ++message to contain one or more embedded newlines. ++ ++ If the calling routine conventionally inserts some additional prefix ++(such as "Error: " or ";; Error: ") on the first line of the message, it ++must also assure that an appropriate prefix will be added to each ++subsequent line of the output, so that the left edge of the message ++output by the condition reporter will still be properly aligned. ++ ++ (defun test () ++ (error "This is an error message.~%It has two lines.")) ++ ++ ;; Implementation A ++ (test) ++ This is an error message. ++ It has two lines. ++ ++ ;; Implementation B ++ (test) ++ ;; Error: This is an error message. ++ ;; It has two lines. ++ ++ ;; Implementation C ++ (test) ++ >> Error: This is an error message. ++ It has two lines. ++ ++ ++File: gcl.info, Node: Note about Tabs in Condition Reports, Next: Mentioning Containing Function in Condition Reports, Prev: Embedded Newlines in Condition Reports, Up: Printing Conditions ++ ++9.1.3.5 Note about Tabs in Condition Reports ++............................................ ++ ++Because the indentation of a report message might be shifted to the ++right or left by an arbitrary amount, special care should be taken with ++the semi-standard character (in those implementations that support ++such a character). Unless the implementation specifically defines its ++behavior in this context, its use should be avoided. ++ ++ ++File: gcl.info, Node: Mentioning Containing Function in Condition Reports, Prev: Note about Tabs in Condition Reports, Up: Printing Conditions ++ ++9.1.3.6 Mentioning Containing Function in Condition Reports ++........................................................... ++ ++The name of the containing function should generally not be mentioned in ++report messages. It is assumed that the debugger will make this ++information accessible in situations where it is necessary and ++appropriate. ++ ++ ++File: gcl.info, Node: Signaling and Handling Conditions, Next: Assertions, Prev: Printing Conditions, Up: Condition System Concepts ++ ++9.1.4 Signaling and Handling Conditions ++--------------------------------------- ++ ++The operation of the condition system depends on the ordering of active ++applicable handlers from most recent to least recent. ++ ++ Each handler is associated with a type specifier that must designate ++a subtype of type condition. A handler is said to be applicable to a ++condition if that condition is of the type designated by the associated ++type specifier. ++ ++ Active handlers are established by using handler-bind (or an ++abstraction based on handler-bind, such as handler-case or ++ignore-errors). ++ ++ Active handlers can be established within the dynamic scope of other ++active handlers. At any point during program execution, there is a set ++of active handlers. When a condition is signaled, the most recent ++active applicable handler for that condition is selected from this set. ++Given a condition, the order of recentness of active applicable handlers ++is defined by the following two rules: ++ ++1. ++ Each handler in a set of active handlers H_1 is more recent than ++ every handler in a set H_2 if the handlers in H_2 were active when ++ the handlers in H_1 were established. ++ ++2. ++ Let h_1 and h_2 be two applicable active handlers established by ++ the same form. Then h_1 is more recent than h_2 if h_1 was defined ++ to the left of h_2 in the form that established them. ++ ++ Once a handler in a handler binding form (such as handler-bind or ++handler-case) has been selected, all handlers in that form become ++inactive for the remainder of the signaling process. While the selected ++handler runs, no other handler established by that form is active. That ++is, if the handler declines, no other handler established by that form ++will be considered for possible invocation. ++ ++ Figure 9-4 shows operators relating to the handling of conditions. ++ ++ handler-bind handler-case ignore-errors ++ ++ Figure 9-4: Operators relating to handling conditions. ++ ++ ++* Menu: ++ ++* Signaling:: ++* Resignaling a Condition:: ++* Restarts:: ++* Interactive Use of Restarts:: ++* Interfaces to Restarts:: ++* Restart Tests:: ++* Associating a Restart with a Condition:: ++ ++ ++File: gcl.info, Node: Signaling, Next: Resignaling a Condition, Prev: Signaling and Handling Conditions, Up: Signaling and Handling Conditions ++ ++9.1.4.1 Signaling ++................. ++ ++When a condition is signaled, the most recent applicable active handler ++is invoked. Sometimes a handler will decline by simply returning ++without a transfer of control. In such cases, the next most recent ++applicable active handler is invoked. ++ ++ If there are no applicable handlers for a condition that has been ++signaled, or if all applicable handlers decline, the condition is ++unhandled. ++ ++ The functions cerror and error invoke the interactive condition ++handler (the debugger) rather than return if the condition being ++signaled, regardless of its type, is unhandled. In contrast, signal ++returns nil if the condition being signaled, regardless of its type, is ++unhandled. ++ ++ The variable *break-on-signals* can be used to cause the debugger to ++be entered before the signaling process begins. ++ ++ Figure 9-5 shows defined names relating to the signaling of ++conditions. ++ ++ *break-on-signals* error warn ++ cerror signal ++ ++ Figure 9-5: Defined names relating to signaling conditions. ++ ++ ++ ++File: gcl.info, Node: Resignaling a Condition, Next: Restarts, Prev: Signaling, Up: Signaling and Handling Conditions ++ ++9.1.4.2 Resignaling a Condition ++............................... ++ ++During the dynamic extent of the signaling process for a particular ++condition object, signaling the same condition object again is permitted ++if and only if the situation represented in both cases are the same. ++ ++ For example, a handler might legitimately signal the condition object ++that is its argument in order to allow outer handlers first opportunity ++to handle the condition. (Such a handlers is sometimes called a ++"default handler.") This action is permitted because the situation ++which the second signaling process is addressing is really the same ++situation. ++ ++ On the other hand, in an implementation that implemented asynchronous ++keyboard events by interrupting the user process with a call to signal, ++it would not be permissible for two distinct asynchronous keyboard ++events to signal identical condition objects at the same time for ++different situations. ++ ++ ++File: gcl.info, Node: Restarts, Next: Interactive Use of Restarts, Prev: Resignaling a Condition, Up: Signaling and Handling Conditions ++ ++9.1.4.3 Restarts ++................ ++ ++The interactive condition handler returns only through non-local ++transfer of control to specially defined restarts that can be set up ++either by the system or by user code. Transferring control to a restart ++is called "invoking" the restart. Like handlers, active restarts are ++established dynamically, and only active restarts can be invoked. An ++active restart can be invoked by the user from the debugger or by a ++program by using invoke-restart. ++ ++ A restart contains a function to be called when the restart is ++invoked, an optional name that can be used to find or invoke the ++restart, and an optional set of interaction information for the debugger ++to use to enable the user to manually invoke a restart. ++ ++ The name of a restart is used by invoke-restart. Restarts that can ++be invoked only within the debugger do not need names. ++ ++ Restarts can be established by using restart-bind, restart-case, and ++with-simple-restart. A restart function can itself invoke any other ++restart that was active at the time of establishment of the restart of ++which the function is part. ++ ++ The restarts established by a restart-bind form, a restart-case form, ++or a with-simple-restart form have dynamic extent which extends for the ++duration of that form's execution. ++ ++ Restarts of the same name can be ordered from least recent to most ++recent according to the following two rules: ++ ++1. ++ Each restart in a set of active restarts R_1 is more recent than ++ every restart in a set R_2 if the restarts in R_2 were active when ++ the restarts in R_1 were established. ++ ++2. ++ Let r_1 and r_2 be two active restarts with the same name ++ established by the same form. Then r_1 is more recent than r_2 if ++ r_1 was defined to the left of r_2 in the form that established ++ them. ++ ++ If a restart is invoked but does not transfer control, the values ++resulting from the restart function are returned by the function that ++invoked the restart, either invoke-restart or ++invoke-restart-interactively. ++ ++ ++File: gcl.info, Node: Interactive Use of Restarts, Next: Interfaces to Restarts, Prev: Restarts, Up: Signaling and Handling Conditions ++ ++9.1.4.4 Interactive Use of Restarts ++................................... ++ ++For interactive handling, two pieces of information are needed from a ++restart: a report function and an interactive function. ++ ++ The report function is used by a program such as the debugger to ++present a description of the action the restart will take. The report ++function is specified and established by the :report-function keyword to ++restart-bind or the :report keyword to restart-case. ++ ++ The interactive function, which can be specified using the ++:interactive-function keyword to restart-bind or :interactive keyword to ++restart-case, is used when the restart is invoked interactively, such as ++from the debugger, to produce a suitable list of arguments. ++ ++ invoke-restart invokes the most recently established restart whose ++name is the same as the first argument to invoke-restart. If a restart ++is invoked interactively by the debugger and does not transfer control ++but rather returns values, the precise action of the debugger on those ++values is implementation-defined. ++ ++ ++File: gcl.info, Node: Interfaces to Restarts, Next: Restart Tests, Prev: Interactive Use of Restarts, Up: Signaling and Handling Conditions ++ ++9.1.4.5 Interfaces to Restarts ++.............................. ++ ++Some restarts have functional interfaces, such as abort, continue, ++muffle-warning, store-value, and use-value. They are ordinary functions ++that use find-restart and invoke-restart internally, that have the same ++name as the restarts they manipulate, and that are provided simply for ++notational convenience. ++ ++ Figure 9-6 shows defined names relating to restarts. ++ ++ abort invoke-restart-interactively store-value ++ compute-restarts muffle-warning use-value ++ continue restart-bind with-simple-restart ++ find-restart restart-case ++ invoke-restart restart-name ++ ++ Figure 9-6: Defined names relating to restarts. ++ ++ ++ ++File: gcl.info, Node: Restart Tests, Next: Associating a Restart with a Condition, Prev: Interfaces to Restarts, Up: Signaling and Handling Conditions ++ ++9.1.4.6 Restart Tests ++..................... ++ ++Each restart has an associated test, which is a function of one argument ++(a condition or nil) which returns true if the restart should be visible ++in the current situation. This test is created by the :test-function ++option to restart-bind or the :test option to restart-case. ++ ++ ++File: gcl.info, Node: Associating a Restart with a Condition, Prev: Restart Tests, Up: Signaling and Handling Conditions ++ ++9.1.4.7 Associating a Restart with a Condition ++.............................................. ++ ++A restart can be "associated with" a condition explicitly by ++with-condition-restarts, or implicitly by restart-case. Such an ++assocation has dynamic extent. ++ ++ A single restart may be associated with several conditions at the ++same time. A single condition may have several associated restarts at ++the same time. ++ ++ Active restarts associated with a particular condition can be ++detected by calling a function such as find-restart, supplying that ++condition as the condition argument. Active restarts can also be ++detected without regard to any associated condition by calling such a ++function without a condition argument, or by supplying a value of nil ++for such an argument. ++ ++ ++File: gcl.info, Node: Assertions, Next: Notes about the Condition System`s Background, Prev: Signaling and Handling Conditions, Up: Condition System Concepts ++ ++9.1.5 Assertions ++---------------- ++ ++Conditional signaling of conditions based on such things as key match, ++form evaluation, and type are handled by assertion operators. Figure ++9-7 shows operators relating to assertions. ++ ++ assert check-type ecase ++ ccase ctypecase etypecase ++ ++ Figure 9-7: Operators relating to assertions. ++ ++ ++ ++File: gcl.info, Node: Notes about the Condition System`s Background, Prev: Assertions, Up: Condition System Concepts ++ ++9.1.6 Notes about the Condition System's Background ++--------------------------------------------------- ++ ++For a background reference to the abstract concepts detailed in this ++section, see Exceptional Situations in Lisp. The details of that paper ++are not binding on this document, but may be helpful in establishing a ++conceptual basis for understanding this material. ++ ++ ++File: gcl.info, Node: Conditions Dictionary, Prev: Condition System Concepts, Up: Conditions ++ ++9.2 Conditions Dictionary ++========================= ++ ++* Menu: ++ ++* condition:: ++* warning:: ++* style-warning:: ++* serious-condition:: ++* error (Condition Type):: ++* cell-error:: ++* cell-error-name:: ++* parse-error:: ++* storage-condition:: ++* assert:: ++* error:: ++* cerror:: ++* check-type:: ++* simple-error:: ++* invalid-method-error:: ++* method-combination-error:: ++* signal:: ++* simple-condition:: ++* simple-condition-format-control:: ++* warn:: ++* simple-warning:: ++* invoke-debugger:: ++* break:: ++* *debugger-hook*:: ++* *break-on-signals*:: ++* handler-bind:: ++* handler-case:: ++* ignore-errors:: ++* define-condition:: ++* make-condition:: ++* restart:: ++* compute-restarts:: ++* find-restart:: ++* invoke-restart:: ++* invoke-restart-interactively:: ++* restart-bind:: ++* restart-case:: ++* restart-name:: ++* with-condition-restarts:: ++* with-simple-restart:: ++* abort (Restart):: ++* continue:: ++* muffle-warning:: ++* store-value:: ++* use-value:: ++* abort (Function):: ++ ++ ++File: gcl.info, Node: condition, Next: warning, Prev: Conditions Dictionary, Up: Conditions Dictionary ++ ++9.2.1 condition [Condition Type] ++-------------------------------- ++ ++[Reviewer Note by Barrett: I think CONDITION-RESTARTS is not fully ++integrated.] ++ ++Class Precedence List:: ++....................... ++ ++condition, t ++ ++Description:: ++............. ++ ++All types of conditions, whether error or non-error, must inherit from ++this type. ++ ++ No additional subtype relationships among the specified subtypes of ++type condition are allowed, except when explicitly mentioned in the ++text; however implementations are permitted to introduce additional ++types and one of these types can be a subtype of any number of the ++subtypes of type condition. ++ ++ Whether a user-defined condition type has slots that are accessible ++by with-slots is implementation-dependent. Furthermore, even in an ++implementation in which user-defined condition types would have slots, ++it is implementation-dependent whether any condition types defined in ++this document have such slots or, if they do, what their names might be; ++only the reader functions documented by this specification may be relied ++upon by portable code. ++ ++ Conforming code must observe the following restrictions related to ++conditions: ++ ++* ++ define-condition, not defclass, must be used to define new ++ condition types. ++ ++* ++ make-condition, not make-instance, must be used to create condition ++ objects explicitly. ++ ++* ++ The :report option of define-condition, not defmethod for ++ print-object, must be used to define a condition reporter. ++ ++* ++ slot-value, slot-boundp, slot-makunbound, and with-slots must not ++ be used on condition objects. Instead, the appropriate accessor ++ functions (defined by define-condition) should be used. ++ ++ ++File: gcl.info, Node: warning, Next: style-warning, Prev: condition, Up: Conditions Dictionary ++ ++9.2.2 warning [Condition Type] ++------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++warning, condition, t ++ ++Description:: ++............. ++ ++The type warning consists of all types of warnings. ++ ++See Also:: ++.......... ++ ++style-warning ++ ++ ++File: gcl.info, Node: style-warning, Next: serious-condition, Prev: warning, Up: Conditions Dictionary ++ ++9.2.3 style-warning [Condition Type] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++style-warning, warning, condition, t ++ ++Description:: ++............. ++ ++The type style-warning includes those conditions that represent ++situations involving code that is conforming code but that is ++nevertheless considered to be faulty or substandard. ++ ++See Also:: ++.......... ++ ++*note muffle-warning:: ++ ++Notes:: ++....... ++ ++An implementation might signal such a condition if it encounters code ++that uses deprecated features or that appears unaesthetic or ++inefficient. ++ ++ An 'unused variable' warning must be of type style-warning. ++ ++ In general, the question of whether code is faulty or substandard is ++a subjective decision to be made by the facility processing that code. ++The intent is that whenever such a facility wishes to complain about ++code on such subjective grounds, it should use this condition type so ++that any clients who wish to redirect or muffle superfluous warnings can ++do so without risking that they will be redirecting or muffling other, ++more serious warnings. ++ ++ ++File: gcl.info, Node: serious-condition, Next: error (Condition Type), Prev: style-warning, Up: Conditions Dictionary ++ ++9.2.4 serious-condition [Condition Type] ++---------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++serious-condition, condition, t ++ ++Description:: ++............. ++ ++All conditions serious enough to require interactive intervention if not ++handled should inherit from the type serious-condition. This condition ++type is provided primarily so that it may be included as a superclass of ++other condition types; it is not intended to be signaled directly. ++ ++Notes:: ++....... ++ ++Signaling a serious condition does not itself force entry into the ++debugger. However, except in the unusual situation where the programmer ++can assure that no harm will come from failing to handle a serious ++condition, such a condition is usually signaled with error rather than ++signal in order to assure that the program does not continue without ++handling the condition. (And conversely, it is conventional to use ++signal rather than error to signal conditions which are not serious ++conditions, since normally the failure to handle a non-serious condition ++is not reason enough for the debugger to be entered.) ++ ++ ++File: gcl.info, Node: error (Condition Type), Next: cell-error, Prev: serious-condition, Up: Conditions Dictionary ++ ++9.2.5 error [Condition Type] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type error consists of all conditions that represent errors. ++ ++ ++File: gcl.info, Node: cell-error, Next: cell-error-name, Prev: error (Condition Type), Up: Conditions Dictionary ++ ++9.2.6 cell-error [Condition Type] ++--------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++cell-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type cell-error consists of error conditions that occur during a ++location access. The name of the offending cell is initialized by the ++:name initialization argument to make-condition, and is accessed by the ++function cell-error-name. ++ ++See Also:: ++.......... ++ ++*note cell-error-name:: ++ ++ ++File: gcl.info, Node: cell-error-name, Next: parse-error, Prev: cell-error, Up: Conditions Dictionary ++ ++9.2.7 cell-error-name [Function] ++-------------------------------- ++ ++'cell-error-name' condition => name ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type cell-error. ++ ++ name--an object. ++ ++Description:: ++............. ++ ++Returns the name of the offending cell involved in the situation ++represented by condition. ++ ++ The nature of the result depends on the specific type of condition. ++For example, if the condition is of type unbound-variable, the result is ++the name of the unbound variable which was being accessed, if the ++condition is of type undefined-function, this is the name of the ++undefined function which was being accessed, and if the condition is of ++type unbound-slot, this is the name of the slot which was being ++accessed. ++ ++See Also:: ++.......... ++ ++cell-error, unbound-slot, unbound-variable, undefined-function, *note ++Condition System Concepts:: ++ ++ ++File: gcl.info, Node: parse-error, Next: storage-condition, Prev: cell-error-name, Up: Conditions Dictionary ++ ++9.2.8 parse-error [Condition Type] ++---------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++parse-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type parse-error consists of error conditions that are related to ++parsing. ++ ++See Also:: ++.......... ++ ++*note parse-namestring:: , *note reader-error:: ++ ++ ++File: gcl.info, Node: storage-condition, Next: assert, Prev: parse-error, Up: Conditions Dictionary ++ ++9.2.9 storage-condition [Condition Type] ++---------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++storage-condition, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type storage-condition consists of serious conditions that relate to ++problems with memory management that are potentially due to ++implementation-dependent limits rather than semantic errors in ++conforming programs, and that typically warrant entry to the debugger if ++not handled. Depending on the details of the implementation, these ++might include such problems as stack overflow, memory region overflow, ++and storage exhausted. ++ ++Notes:: ++....... ++ ++While some Common Lisp operations might signal storage-condition because ++they are defined to create objects, it is unspecified whether operations ++that are not defined to create objects create them anyway and so might ++also signal storage-condition. Likewise, the evaluator itself might ++create objects and so might signal storage-condition. (The natural ++assumption might be that such object creation is naturally inefficient, ++but even that is implementation-dependent.) In general, the entire ++question of how storage allocation is done is implementation-dependent, ++and so any operation might signal storage-condition at any time. ++Because such a condition is indicative of a limitation of the ++implementation or of the image rather than an error in a program, ++objects of type storage-condition are not of type error. ++ ++ ++File: gcl.info, Node: assert, Next: error, Prev: storage-condition, Up: Conditions Dictionary ++ ++9.2.10 assert [Macro] ++--------------------- ++ ++'assert' test-form [({place}*) [datum-form {argument-form}*]] ++=> nil ++ ++Arguments and Values:: ++...................... ++ ++test-form--a form; always evaluated. ++ ++ place--a place; evaluated if an error is signaled. ++ ++ datum-form--a form that evaluates to a datum. Evaluated each time an ++error is to be signaled, or not at all if no error is to be signaled. ++ ++ argument-form--a form that evaluates to an argument. Evaluated each ++time an error is to be signaled, or not at all if no error is to be ++signaled. ++ ++ datum, arguments--designators for a condition of default type error. ++(These designators are the result of evaluating datum-form and each of ++the argument-forms.) ++ ++Description:: ++............. ++ ++assert assures that test-form evaluates to true. If test-form evaluates ++to false, assert signals a correctable error (denoted by datum and ++arguments). Continuing from this error using the continue restart makes ++it possible for the user to alter the values of the places before assert ++evaluates test-form again. If the value of test-form is non-nil, assert ++returns nil. ++ ++ The places are generalized references to data upon which test-form ++depends, whose values can be changed by the user in attempting to ++correct the error. Subforms of each place are only evaluated if an ++error is signaled, and might be re-evaluated if the error is re-signaled ++(after continuing without actually fixing the problem). ++ ++ The order of evaluation of the places is not specified; see *note ++Evaluation of Subforms to Places::. ++ ++ If a place form is supplied that produces more values than there are ++store variables, the extra values are ignored. If the supplied form ++produces fewer values than there are store variables, the missing values ++are set to nil. ++ ++Examples:: ++.......... ++ ++ (setq x (make-array '(3 5) :initial-element 3)) ++ => #2A((3 3 3 3 3) (3 3 3 3 3) (3 3 3 3 3)) ++ (setq y (make-array '(3 5) :initial-element 7)) ++ => #2A((7 7 7 7 7) (7 7 7 7 7) (7 7 7 7 7)) ++ (defun matrix-multiply (a b) ++ (let ((*print-array* nil)) ++ (assert (and (= (array-rank a) (array-rank b) 2) ++ (= (array-dimension a 1) (array-dimension b 0))) ++ (a b) ++ "Cannot multiply ~S by ~S." a b) ++ (really-matrix-multiply a b))) => MATRIX-MULTIPLY ++ (matrix-multiply x y) ++ |> Correctable error in MATRIX-MULTIPLY: ++ |> Cannot multiply # by #. ++ |> Restart options: ++ |> 1: You will be prompted for one or more new values. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Value for A: |>>x<<| ++ |> Value for B: |>>(make-array '(5 3) :initial-element 6)<<| ++ => #2A((54 54 54 54 54) ++ (54 54 54 54 54) ++ (54 54 54 54 54) ++ (54 54 54 54 54) ++ (54 54 54 54 54)) ++ ++ (defun double-safely (x) (assert (numberp x) (x)) (+ x x)) ++ (double-safely 4) ++ => 8 ++ ++ (double-safely t) ++ |> Correctable error in DOUBLE-SAFELY: The value of (NUMBERP X) must be non-NIL. ++ |> Restart options: ++ |> 1: You will be prompted for one or more new values. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Value for X: |>>7<<| ++ => 14 ++ ++Affected By:: ++............. ++ ++*break-on-signals* ++ ++ The set of active condition handlers. ++ ++See Also:: ++.......... ++ ++*note check-type:: , *note error:: , *note Generalized Reference:: ++ ++Notes:: ++....... ++ ++The debugger need not include the test-form in the error message, and ++the places should not be included in the message, but they should be ++made available for the user's perusal. If the user gives the "continue" ++command, the values of any of the references can be altered. The ++details of this depend on the implementation's style of user interface. ++ ++ ++File: gcl.info, Node: error, Next: cerror, Prev: assert, Up: Conditions Dictionary ++ ++9.2.11 error [Function] ++----------------------- ++ ++'error' datum &rest arguments => # ++ ++Arguments and Values:: ++...................... ++ ++datum, arguments--designators for a condition of default type ++simple-error. ++ ++Description:: ++............. ++ ++error effectively invokes signal on the denoted condition. ++ ++ If the condition is not handled, (invoke-debugger condition) is done. ++As a consequence of calling invoke-debugger, error cannot directly ++return; the only exit from error can come by non-local transfer of ++control in a handler or by use of an interactive debugging command. ++ ++Examples:: ++.......... ++ ++ (defun factorial (x) ++ (cond ((or (not (typep x 'integer)) (minusp x)) ++ (error "~S is not a valid argument to FACTORIAL." x)) ++ ((zerop x) 1) ++ (t (* x (factorial (- x 1)))))) ++ => FACTORIAL ++ (factorial 20) ++ => 2432902008176640000 ++ (factorial -1) ++ |> Error: -1 is not a valid argument to FACTORIAL. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Return to Lisp Toplevel. ++ |> Debug> ++ ++ (setq a 'fred) ++ => FRED ++ (if (numberp a) (1+ a) (error "~S is not a number." A)) ++ |> Error: FRED is not a number. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Return to Lisp Toplevel. ++ |> Debug> |>>:Continue 1<<| ++ |> Return to Lisp Toplevel. ++ ++ (define-condition not-a-number (error) ++ ((argument :reader not-a-number-argument :initarg :argument)) ++ (:report (lambda (condition stream) ++ (format stream "~S is not a number." ++ (not-a-number-argument condition))))) ++ => NOT-A-NUMBER ++ ++ (if (numberp a) (1+ a) (error 'not-a-number :argument a)) ++ |> Error: FRED is not a number. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Return to Lisp Toplevel. ++ |> Debug> |>>:Continue 1<<| ++ |> Return to Lisp Toplevel. ++ ++Side Effects:: ++.............. ++ ++Handlers for the specified condition, if any, are invoked and might have ++side effects. Program execution might stop, and the debugger might be ++entered. ++ ++Affected By:: ++............. ++ ++Existing handler bindings. ++ ++ *break-on-signals* ++ ++ Signals an error of type type-error if datum and arguments are not ++designators for a condition. ++ ++See Also:: ++.......... ++ ++*note cerror:: , *note signal:: , *note format:: , *note ignore-errors:: ++, *break-on-signals*, *note handler-bind:: , *note Condition System ++Concepts:: ++ ++Notes:: ++....... ++ ++Some implementations may provide debugger commands for interactively ++returning from individual stack frames. However, it should be possible ++for the programmer to feel confident about writing code like: ++ ++ (defun wargames:no-win-scenario () ++ (if (error "pushing the button would be stupid.")) ++ (push-the-button)) ++ ++ In this scenario, there should be no chance that error will return ++and the button will get pushed. ++ ++ While the meaning of this program is clear and it might be proven ++'safe' by a formal theorem prover, such a proof is no guarantee that the ++program is safe to execute. Compilers have been known to have bugs, ++computers to have signal glitches, and human beings to manually ++intervene in ways that are not always possible to predict. Those kinds ++of errors, while beyond the scope of the condition system to formally ++model, are not beyond the scope of things that should seriously be ++considered when writing code that could have the kinds of sweeping ++effects hinted at by this example. ++ ++ ++File: gcl.info, Node: cerror, Next: check-type, Prev: error, Up: Conditions Dictionary ++ ++9.2.12 cerror [Function] ++------------------------ ++ ++'cerror' continue-format-control datum &rest arguments => nil ++ ++Arguments and Values:: ++...................... ++ ++Continue-format-control--a format control. ++ ++ [Reviewer Note by Barmar: What is continue-format-control used for??] ++ ++ datum, arguments--designators for a condition of default type ++simple-error. ++ ++Description:: ++............. ++ ++cerror effectively invokes error on the condition named by datum. As ++with any function that implicitly calls error, if the condition is not ++handled, (invoke-debugger condition) is executed. While signaling is ++going on, and while in the debugger if it is reached, it is possible to ++continue code execution (i.e., to return from cerror) using the continue ++restart. ++ ++ If datum is a condition, arguments can be supplied, but are used only ++in conjunction with the continue-format-control. ++ ++Examples:: ++.......... ++ ++ (defun real-sqrt (n) ++ (when (minusp n) ++ (setq n (- n)) ++ (cerror "Return sqrt(~D) instead." "Tried to take sqrt(-~D)." n)) ++ (sqrt n)) ++ ++ (real-sqrt 4) ++ => 2.0 ++ ++ (real-sqrt -9) ++ |> Correctable error in REAL-SQRT: Tried to take sqrt(-9). ++ |> Restart options: ++ |> 1: Return sqrt(9) instead. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ => 3.0 ++ ++ (define-condition not-a-number (error) ++ ((argument :reader not-a-number-argument :initarg :argument)) ++ (:report (lambda (condition stream) ++ (format stream "~S is not a number." ++ (not-a-number-argument condition))))) ++ ++ (defun assure-number (n) ++ (loop (when (numberp n) (return n)) ++ (cerror "Enter a number." ++ 'not-a-number :argument n) ++ (format t "~&Type a number: ") ++ (setq n (read)) ++ (fresh-line))) ++ ++ (assure-number 'a) ++ |> Correctable error in ASSURE-NUMBER: A is not a number. ++ |> Restart options: ++ |> 1: Enter a number. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Type a number: |>>1/2<<| ++ => 1/2 ++ ++ (defun assure-large-number (n) ++ (loop (when (and (numberp n) (> n 73)) (return n)) ++ (cerror "Enter a number~:[~; a bit larger than ~D~]." ++ "~*~A is not a large number." ++ (numberp n) n) ++ (format t "~&Type a large number: ") ++ (setq n (read)) ++ (fresh-line))) ++ ++ (assure-large-number 10000) ++ => 10000 ++ ++ (assure-large-number 'a) ++ |> Correctable error in ASSURE-LARGE-NUMBER: A is not a large number. ++ |> Restart options: ++ |> 1: Enter a number. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Type a large number: |>>88<<| ++ => 88 ++ ++ (assure-large-number 37) ++ |> Correctable error in ASSURE-LARGE-NUMBER: 37 is not a large number. ++ |> Restart options: ++ |> 1: Enter a number a bit larger than 37. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Type a large number: |>>259<<| ++ => 259 ++ ++ (define-condition not-a-large-number (error) ++ ((argument :reader not-a-large-number-argument :initarg :argument)) ++ (:report (lambda (condition stream) ++ (format stream "~S is not a large number." ++ (not-a-large-number-argument condition))))) ++ ++ (defun assure-large-number (n) ++ (loop (when (and (numberp n) (> n 73)) (return n)) ++ (cerror "Enter a number~3*~:[~; a bit larger than ~*~D~]." ++ 'not-a-large-number ++ :argument n ++ :ignore (numberp n) ++ :ignore n ++ :allow-other-keys t) ++ (format t "~&Type a large number: ") ++ (setq n (read)) ++ (fresh-line))) ++ ++ (assure-large-number 'a) ++ |> Correctable error in ASSURE-LARGE-NUMBER: A is not a large number. ++ |> Restart options: ++ |> 1: Enter a number. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Type a large number: |>>88<<| ++ => 88 ++ ++ (assure-large-number 37) ++ |> Correctable error in ASSURE-LARGE-NUMBER: A is not a large number. ++ |> Restart options: ++ |> 1: Enter a number a bit larger than 37. ++ |> 2: Top level. ++ |> Debug> |>>:continue 1<<| ++ |> Type a large number: |>>259<<| ++ => 259 ++ ++Affected By:: ++............. ++ ++*break-on-signals*. ++ ++ Existing handler bindings. ++ ++See Also:: ++.......... ++ ++*note error:: , *note format:: , *note handler-bind:: , ++*break-on-signals*, simple-type-error ++ ++Notes:: ++....... ++ ++If datum is a condition type rather than a string, the format directive ++~* may be especially useful in the continue-format-control in order to ++ignore the keywords in the initialization argument list. For example: ++ ++ (cerror "enter a new value to replace ~*~s" ++ 'not-a-number ++ :argument a) ++ ++ ++File: gcl.info, Node: check-type, Next: simple-error, Prev: cerror, Up: Conditions Dictionary ++ ++9.2.13 check-type [Macro] ++------------------------- ++ ++'check-type' place typespec [string] => nil ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++ typespec--a type specifier. ++ ++ string--a string; evaluated. ++ ++Description:: ++............. ++ ++check-type signals a correctable error of type type-error if the ++contents of place are not of the type typespec. ++ ++ check-type can return only if the store-value restart is invoked, ++either explicitly from a handler or implicitly as one of the options ++offered by the debugger. If the store-value restart is invoked, ++check-type stores the new value that is the argument to the restart ++invocation (or that is prompted for interactively by the debugger) in ++place and starts over, checking the type of the new value and signaling ++another error if it is still not of the desired type. ++ ++ The first time place is evaluated, it is evaluated by normal ++evaluation rules. It is later evaluated as a place if the type check ++fails and the store-value restart is used; see *note Evaluation of ++Subforms to Places::. ++ ++ string should be an English description of the type, starting with an ++indefinite article ("a" or "an"). If string is not supplied, it is ++computed automatically from typespec. The automatically generated ++message mentions place, its contents, and the desired type. An ++implementation may choose to generate a somewhat differently worded ++error message if it recognizes that place is of a particular form, such ++as one of the arguments to the function that called check-type. string ++is allowed because some applications of check-type may require a more ++specific description of what is wanted than can be generated ++automatically from typespec. ++ ++Examples:: ++.......... ++ ++ (setq aardvarks '(sam harry fred)) ++ => (SAM HARRY FRED) ++ (check-type aardvarks (array * (3))) ++ |> Error: The value of AARDVARKS, (SAM HARRY FRED), ++ |> is not a 3-long array. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use instead. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Use Value: |>>#(SAM FRED HARRY)<<| ++ => NIL ++ aardvarks ++ => # ++ (map 'list #'identity aardvarks) ++ => (SAM FRED HARRY) ++ (setq aardvark-count 'foo) ++ => FOO ++ (check-type aardvark-count (integer 0 *) "A positive integer") ++ |> Error: The value of AARDVARK-COUNT, FOO, is not a positive integer. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use instead. ++ |> 2: Top level. ++ |> Debug> |>>:CONTINUE 2<<| ++ ++ (defmacro define-adder (name amount) ++ (check-type name (and symbol (not null)) "a name for an adder function") ++ (check-type amount integer) ++ `(defun ,name (x) (+ x ,amount))) ++ ++ (macroexpand '(define-adder add3 3)) ++ => (defun add3 (x) (+ x 3)) ++ ++ (macroexpand '(define-adder 7 7)) ++ |> Error: The value of NAME, 7, is not a name for an adder function. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use instead. ++ |> 2: Top level. ++ |> Debug> |>>:Continue 1<<| ++ |> Specify a value to use instead. ++ |> Type a form to be evaluated and used instead: |>>'ADD7<<| ++ => (defun add7 (x) (+ x 7)) ++ ++ (macroexpand '(define-adder add5 something)) ++ |> Error: The value of AMOUNT, SOMETHING, is not an integer. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use instead. ++ |> 2: Top level. ++ |> Debug> |>>:Continue 1<<| ++ |> Type a form to be evaluated and used instead: |>>5<<| ++ => (defun add5 (x) (+ x 5)) ++ ++ ++ Control is transferred to a handler. ++ ++Side Effects:: ++.............. ++ ++The debugger might be entered. ++ ++Affected By:: ++............. ++ ++*break-on-signals* ++ ++ The implementation. ++ ++See Also:: ++.......... ++ ++*note Condition System Concepts:: ++ ++Notes:: ++....... ++ ++ (check-type place typespec) ++ == (assert (typep place 'typespec) (place) ++ 'type-error :datum place :expected-type 'typespec) ++ ++ ++File: gcl.info, Node: simple-error, Next: invalid-method-error, Prev: check-type, Up: Conditions Dictionary ++ ++9.2.14 simple-error [Condition Type] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++simple-error, simple-condition, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type simple-error consists of conditions that are signaled by error ++or cerror when a ++ ++ format control ++ ++ is supplied as the function's first argument. ++ ++ ++File: gcl.info, Node: invalid-method-error, Next: method-combination-error, Prev: simple-error, Up: Conditions Dictionary ++ ++9.2.15 invalid-method-error [Function] ++-------------------------------------- ++ ++'invalid-method-error' method format-control &rest args => ++implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++method--a method. ++ ++ format-control--a format control. ++ ++ args--format arguments for the format-control. ++ ++Description:: ++............. ++ ++The function invalid-method-error is used to signal an error of type ++error when there is an applicable method whose qualifiers are not valid ++for the method combination type. The error message is constructed by ++using the format-control suitable for format and any args to it. ++Because an implementation may need to add additional contextual ++information to the error message, invalid-method-error should be called ++only within the dynamic extent of a method combination function. ++ ++ The function invalid-method-error is called automatically when a ++method fails to satisfy every qualifier pattern and predicate in a ++define-method-combination form. A method combination function that ++imposes additional restrictions should call invalid-method-error ++explicitly if it encounters a method it cannot accept. ++ ++ Whether invalid-method-error returns to its caller or exits via throw ++is implementation-dependent. ++ ++Side Effects:: ++.............. ++ ++The debugger might be entered. ++ ++Affected By:: ++............. ++ ++*break-on-signals* ++ ++See Also:: ++.......... ++ ++*note define-method-combination:: ++ ++ ++File: gcl.info, Node: method-combination-error, Next: signal, Prev: invalid-method-error, Up: Conditions Dictionary ++ ++9.2.16 method-combination-error [Function] ++------------------------------------------ ++ ++'method-combination-error' format-control &rest args => ++implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++format-control--a format control. ++ ++ args--format arguments for format-control. ++ ++Description:: ++............. ++ ++The function method-combination-error is used to signal an error in ++method combination. ++ ++ The error message is constructed by using a format-control suitable ++for format and any args to it. Because an implementation may need to ++add additional contextual information to the error message, ++method-combination-error should be called only within the dynamic extent ++of a method combination function. ++ ++ Whether method-combination-error returns to its caller or exits via ++throw is implementation-dependent. ++ ++Side Effects:: ++.............. ++ ++The debugger might be entered. ++ ++Affected By:: ++............. ++ ++*break-on-signals* ++ ++See Also:: ++.......... ++ ++*note define-method-combination:: ++ ++ ++File: gcl.info, Node: signal, Next: simple-condition, Prev: method-combination-error, Up: Conditions Dictionary ++ ++9.2.17 signal [Function] ++------------------------ ++ ++'signal' datum &rest arguments => nil ++ ++Arguments and Values:: ++...................... ++ ++datum, arguments--designators for a condition of default type ++simple-condition. ++ ++Description:: ++............. ++ ++Signals the condition denoted by the given datum and arguments. If the ++condition is not handled, signal returns nil. ++ ++Examples:: ++.......... ++ ++ (defun handle-division-conditions (condition) ++ (format t "Considering condition for division condition handling~ ++ (when (and (typep condition 'arithmetic-error) ++ (eq '/ (arithmetic-error-operation condition))) ++ (invoke-debugger condition))) ++ HANDLE-DIVISION-CONDITIONS ++ (defun handle-other-arithmetic-errors (condition) ++ (format t "Considering condition for arithmetic condition handling~ ++ (when (typep condition 'arithmetic-error) ++ (abort))) ++ HANDLE-OTHER-ARITHMETIC-ERRORS ++ (define-condition a-condition-with-no-handler (condition) ()) ++ A-CONDITION-WITH-NO-HANDLER ++ (signal 'a-condition-with-no-handler) ++ NIL ++ (handler-bind ((condition #'handle-division-conditions) ++ (condition #'handle-other-arithmetic-errors)) ++ (signal 'a-condition-with-no-handler)) ++ Considering condition for division condition handling ++ Considering condition for arithmetic condition handling ++ NIL ++ (handler-bind ((arithmetic-error #'handle-division-conditions) ++ (arithmetic-error #'handle-other-arithmetic-errors)) ++ (signal 'arithmetic-error :operation '* :operands '(1.2 b))) ++ Considering condition for division condition handling ++ Considering condition for arithmetic condition handling ++ Back to Lisp Toplevel ++ ++Side Effects:: ++.............. ++ ++The debugger might be entered due to *break-on-signals*. ++ ++ Handlers for the condition being signaled might transfer control. ++ ++Affected By:: ++............. ++ ++Existing handler bindings. ++ ++ *break-on-signals* ++ ++See Also:: ++.......... ++ ++*break-on-signals*, *note error:: , simple-condition, *note Signaling ++and Handling Conditions:: ++ ++Notes:: ++....... ++ ++If (typep datum *break-on-signals*) yields true, the debugger is entered ++prior to beginning the signaling process. The continue restart can be ++used to continue with the signaling process. This is also true for all ++other functions and macros that should, might, or must signal ++conditions. ++ ++ ++File: gcl.info, Node: simple-condition, Next: simple-condition-format-control, Prev: signal, Up: Conditions Dictionary ++ ++9.2.18 simple-condition [Condition Type] ++---------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++simple-condition, condition, t ++ ++Description:: ++............. ++ ++The type simple-condition represents conditions that are signaled by ++signal whenever a format-control is supplied as the function's first ++argument. ++ ++ The format control and format arguments are initialized with the ++initialization arguments named :format-control ++ ++ and :format-arguments to make-condition, and are accessed by the ++functions ++ ++ simple-condition-format-control ++ ++ and simple-condition-format-arguments. If format arguments are not ++supplied to make-condition, nil is used as a default. ++ ++See Also:: ++.......... ++ ++*note simple-condition-format-control:: , ++ ++ simple-condition-format-arguments ++ ++ ++File: gcl.info, Node: simple-condition-format-control, Next: warn, Prev: simple-condition, Up: Conditions Dictionary ++ ++9.2.19 simple-condition-format-control, simple-condition-format-arguments ++------------------------------------------------------------------------- ++ ++ [Function] ++ ++ 'simple-condition-format-control' condition => format-control ++ ++ 'simple-condition-format-arguments' condition => format-arguments ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type simple-condition. ++ ++ format-control--a format control. ++ ++ format-arguments--a list. ++ ++Description:: ++............. ++ ++simple-condition-format-control returns the format control needed to ++process the condition's format arguments. ++ ++ simple-condition-format-arguments returns a list of format arguments ++needed to process the condition's format control. ++ ++Examples:: ++.......... ++ ++ (setq foo (make-condition 'simple-condition ++ :format-control "Hi ~S" ++ :format-arguments '(ho))) ++ => # ++ (apply #'format nil (simple-condition-format-control foo) ++ (simple-condition-format-arguments foo)) ++ => "Hi HO" ++ ++See Also:: ++.......... ++ ++*note simple-condition:: , *note Condition System Concepts:: ++ ++ ++File: gcl.info, Node: warn, Next: simple-warning, Prev: simple-condition-format-control, Up: Conditions Dictionary ++ ++9.2.20 warn [Function] ++---------------------- ++ ++'warn' datum &rest arguments => nil ++ ++Arguments and Values:: ++...................... ++ ++datum, arguments--designators for a condition of default type ++simple-warning. ++ ++Description:: ++............. ++ ++Signals a condition of type warning. If the condition is not handled, ++reports the condition to error output. ++ ++ The precise mechanism for warning is as follows: ++ ++The warning condition is signaled ++ While the warning condition is being signaled, the muffle-warning ++ restart is established for use by a handler. If invoked, this ++ restart bypasses further action by warn, which in turn causes warn ++ to immediately return nil. ++ ++If no handler for the warning condition is found ++ If no handlers for the warning condition are found, or if all such ++ handlers decline, then the condition is reported to error output by ++ warn in an implementation-dependent format. ++ ++nil is returned ++ The value returned by warn if it returns is nil. ++ ++Examples:: ++.......... ++ ++ (defun foo (x) ++ (let ((result (* x 2))) ++ (if (not (typep result 'fixnum)) ++ (warn "You're using very big numbers.")) ++ result)) ++ => FOO ++ ++ (foo 3) ++ => 6 ++ ++ (foo most-positive-fixnum) ++ |> Warning: You're using very big numbers. ++ => 4294967294 ++ ++ (setq *break-on-signals* t) ++ => T ++ ++ (foo most-positive-fixnum) ++ |> Break: Caveat emptor. ++ |> To continue, type :CONTINUE followed by an option number. ++ |> 1: Return from Break. ++ |> 2: Abort to Lisp Toplevel. ++ |> Debug> :continue 1 ++ |> Warning: You're using very big numbers. ++ => 4294967294 ++ ++Side Effects:: ++.............. ++ ++A warning is issued. The debugger might be entered. ++ ++Affected By:: ++............. ++ ++Existing handler bindings. ++ ++ *break-on-signals*, *error-output*. ++ ++Exceptional Situations:: ++........................ ++ ++If datum is a condition and if the condition is not of type warning, or ++arguments is non-nil, an error of type type-error is signaled. ++ ++ If datum is a condition type, the result of (apply #'make-condition ++datum arguments) must be of type warning or an error of type type-error ++is signaled. ++ ++See Also:: ++.......... ++ ++*break-on-signals*, *note muffle-warning:: , *note signal:: ++ ++ ++File: gcl.info, Node: simple-warning, Next: invoke-debugger, Prev: warn, Up: Conditions Dictionary ++ ++9.2.21 simple-warning [Condition Type] ++-------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++simple-warning, simple-condition, warning, condition, t ++ ++Description:: ++............. ++ ++The type simple-warning represents conditions that are signaled by warn ++whenever a ++ ++ format control ++ ++ is supplied as the function's first argument. ++ ++ ++File: gcl.info, Node: invoke-debugger, Next: break, Prev: simple-warning, Up: Conditions Dictionary ++ ++9.2.22 invoke-debugger [Function] ++--------------------------------- ++ ++'invoke-debugger' condition => # ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition object. ++ ++Description:: ++............. ++ ++invoke-debugger attempts to enter the debugger with condition. ++ ++ If *debugger-hook* is not nil, it should be a function (or the name ++of a function) to be called prior to entry to the standard debugger. ++The function is called with *debugger-hook* bound to nil, and the ++function must accept two arguments: the condition and the value of ++*debugger-hook* prior to binding it to nil. If the function returns ++normally, the standard debugger is entered. ++ ++ The standard debugger never directly returns. Return can occur only ++by a non-local transfer of control, such as the use of a restart ++function. ++ ++Examples:: ++.......... ++ ++ (ignore-errors ;Normally, this would suppress debugger entry ++ (handler-bind ((error #'invoke-debugger)) ;But this forces debugger entry ++ (error "Foo."))) ++ Debug: Foo. ++ To continue, type :CONTINUE followed by an option number: ++ 1: Return to Lisp Toplevel. ++ Debug> ++ ++Side Effects:: ++.............. ++ ++*debugger-hook* is bound to nil, program execution is discontinued, and ++the debugger is entered. ++ ++Affected By:: ++............. ++ ++*debug-io* and *debugger-hook*. ++ ++See Also:: ++.......... ++ ++*note error:: , *note break:: ++ ++ ++File: gcl.info, Node: break, Next: *debugger-hook*, Prev: invoke-debugger, Up: Conditions Dictionary ++ ++9.2.23 break [Function] ++----------------------- ++ ++'break' &optional format-control &rest format-arguments => nil ++ ++Arguments and Values:: ++...................... ++ ++format-control--a format control. ++ ++ The default is implementation-dependent. ++ ++ format-arguments--format arguments for the format-control. ++ ++Description:: ++............. ++ ++break formats format-control and format-arguments and then goes directly ++into the debugger without allowing any possibility of interception by ++programmed error-handling facilities. ++ ++ If the continue restart is used while in the debugger, break ++immediately returns nil without taking any unusual recovery action. ++ ++ break binds *debugger-hook* to nil before attempting to enter the ++debugger. ++ ++Examples:: ++.......... ++ ++ (break "You got here with arguments: ~:S." '(FOO 37 A)) ++ |> BREAK: You got here with these arguments: FOO, 37, A. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Return from BREAK. ++ |> 2: Top level. ++ |> Debug> :CONTINUE 1 ++ |> Return from BREAK. ++ => NIL ++ ++ ++Side Effects:: ++.............. ++ ++The debugger is entered. ++ ++Affected By:: ++............. ++ ++*debug-io*. ++ ++See Also:: ++.......... ++ ++*note error:: , *note invoke-debugger:: . ++ ++Notes:: ++....... ++ ++break is used as a way of inserting temporary debugging "breakpoints" in ++a program, not as a way of signaling errors. For this reason, break ++does not take the continue-format-control argument that cerror takes. ++This and the lack of any possibility of interception by condition ++handling are the only program-visible differences between break and ++cerror. ++ ++ The user interface aspects of break and cerror are permitted to vary ++more widely, in order to accomodate the interface needs of the ++implementation. For example, it is permissible for a Lisp ++read-eval-print loop to be entered by break rather than the conventional ++debugger. ++ ++ break could be defined by: ++ ++ (defun break (&optional (format-control "Break") &rest format-arguments) ++ (with-simple-restart (continue "Return from BREAK.") ++ (let ((*debugger-hook* nil)) ++ (invoke-debugger ++ (make-condition 'simple-condition ++ :format-control format-control ++ :format-arguments format-arguments)))) ++ nil) ++ ++ ++File: gcl.info, Node: *debugger-hook*, Next: *break-on-signals*, Prev: break, Up: Conditions Dictionary ++ ++9.2.24 *debugger-hook* [Variable] ++--------------------------------- ++ ++Value Type:: ++............ ++ ++a designator for a function of two arguments (a condition and the value ++of *debugger-hook* at the time the debugger was entered), or nil. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++When the value of *debugger-hook* is non-nil, it is called prior to ++normal entry into the debugger, either due to a call to invoke-debugger ++or due to automatic entry into the debugger from a call to error or ++cerror with a condition that is not handled. The function may either ++handle the condition (transfer control) or return normally (allowing the ++standard debugger to run). To minimize recursive errors while ++debugging, *debugger-hook* is bound to nil by invoke-debugger prior to ++calling the function. ++ ++Examples:: ++.......... ++ ++ (defun one-of (choices &optional (prompt "Choice")) ++ (let ((n (length choices)) (i)) ++ (do ((c choices (cdr c)) (i 1 (+ i 1))) ++ ((null c)) ++ (format t "~&[~D] ~A~ ++ (do () ((typep i `(integer 1 ,n))) ++ (format t "~&~A: " prompt) ++ (setq i (read)) ++ (fresh-line)) ++ (nth (- i 1) choices))) ++ ++ (defun my-debugger (condition me-or-my-encapsulation) ++ (format t "~&Fooey: ~A" condition) ++ (let ((restart (one-of (compute-restarts)))) ++ (if (not restart) (error "My debugger got an error.")) ++ (let ((*debugger-hook* me-or-my-encapsulation)) ++ (invoke-restart-interactively restart)))) ++ ++ (let ((*debugger-hook* #'my-debugger)) ++ (+ 3 'a)) ++ |> Fooey: The argument to +, A, is not a number. ++ |> [1] Supply a replacement for A. ++ |> [2] Return to Cloe Toplevel. ++ |> Choice: 1 ++ |> Form to evaluate and use: (+ 5 'b) ++ |> Fooey: The argument to +, B, is not a number. ++ |> [1] Supply a replacement for B. ++ |> [2] Supply a replacement for A. ++ |> [3] Return to Cloe Toplevel. ++ |> Choice: 1 ++ |> Form to evaluate and use: 1 ++ => 9 ++ ++Affected By:: ++............. ++ ++invoke-debugger ++ ++Notes:: ++....... ++ ++When evaluating code typed in by the user interactively, it is sometimes ++useful to have the hook function bind *debugger-hook* to the function ++that was its second argument so that recursive errors can be handled ++using the same interactive facility. ++ ++ ++File: gcl.info, Node: *break-on-signals*, Next: handler-bind, Prev: *debugger-hook*, Up: Conditions Dictionary ++ ++9.2.25 *break-on-signals* [Variable] ++------------------------------------ ++ ++Value Type:: ++............ ++ ++a type specifier. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++When (typep condition *break-on-signals*) returns true, calls to signal, ++and to other operators such as error that implicitly call signal, enter ++the debugger prior to signaling the condition. ++ ++ The continue restart can be used to continue with the normal ++signaling process when a break occurs process due to *break-on-signals*. ++ ++Examples:: ++.......... ++ ++ *break-on-signals* => NIL ++ (ignore-errors (error 'simple-error :format-control "Fooey!")) ++ => NIL, # ++ ++ (let ((*break-on-signals* 'error)) ++ (ignore-errors (error 'simple-error :format-control "Fooey!"))) ++ |> Break: Fooey! ++ |> BREAK entered because of *BREAK-ON-SIGNALS*. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Continue to signal. ++ |> 2: Top level. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Continue to signal. ++ => NIL, # ++ ++ (let ((*break-on-signals* 'error)) ++ (error 'simple-error :format-control "Fooey!")) ++ |> Break: Fooey! ++ |> BREAK entered because of *BREAK-ON-SIGNALS*. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Continue to signal. ++ |> 2: Top level. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Continue to signal. ++ |> Error: Fooey! ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Top level. ++ |> Debug> |>>:CONTINUE 1<<| ++ |> Top level. ++ ++See Also:: ++.......... ++ ++*note break:: , *note signal:: , *note warn:: , *note error:: , *note ++typep:: , *note Condition System Concepts:: ++ ++Notes:: ++....... ++ ++*break-on-signals* is intended primarily for use in debugging code that ++does signaling. When setting *break-on-signals*, the user is encouraged ++to choose the most restrictive specification that suffices. Setting ++*break-on-signals* effectively violates the modular handling of ++condition signaling. In practice, the complete effect of setting ++*break-on-signals* might be unpredictable in some cases since the user ++might not be aware of the variety or number of calls to signal that are ++used in code called only incidentally. ++ ++ *break-on-signals* enables an early entry to the debugger but such an ++entry does not preclude an additional entry to the debugger in the case ++of operations such as error and cerror. ++ ++ ++File: gcl.info, Node: handler-bind, Next: handler-case, Prev: *break-on-signals*, Up: Conditions Dictionary ++ ++9.2.26 handler-bind [Macro] ++--------------------------- ++ ++'handler-bind' ({!binding}*) {form}* => {result}* ++ ++ binding ::=(type handler) ++ ++Arguments and Values:: ++...................... ++ ++type--a type specifier. ++ ++ handler--a form; evaluated to produce a handler-function. ++ ++ handler-function--a designator for a function of one argument. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++Executes forms in a dynamic environment where the indicated handler ++bindings are in effect. ++ ++ Each handler should evaluate to a handler-function, which is used to ++handle conditions of the given type during execution of the forms. This ++function should take a single argument, the condition being signaled. ++ ++ If more than one handler binding is supplied, the handler bindings ++are searched sequentially from top to bottom in search of a match (by ++visual analogy with typecase). If an appropriate type is found, the ++associated handler is run in a dynamic environment where none of these ++handler bindings are visible (to avoid recursive errors). If the ++handler declines, the search continues for another handler. ++ ++ If no appropriate handler is found, other handlers are sought from ++dynamically enclosing contours. If no handler is found outside, then ++signal returns or error enters the debugger. ++ ++Examples:: ++.......... ++ ++In the following code, if an unbound variable error is signaled in the ++body (and not handled by an intervening handler), the first function is ++called. ++ ++ (handler-bind ((unbound-variable #'(lambda ...)) ++ (error #'(lambda ...))) ++ ...) ++ ++ If any other kind of error is signaled, the second function is ++called. In either case, neither handler is active while executing the ++code in the associated function. ++ ++ (defun trap-error-handler (condition) ++ (format *error-output* "~&~A~&" condition) ++ (throw 'trap-errors nil)) ++ ++ (defmacro trap-errors (&rest forms) ++ `(catch 'trap-errors ++ (handler-bind ((error #'trap-error-handler)) ++ ,@forms))) ++ ++ (list (trap-errors (signal "Foo.") 1) ++ (trap-errors (error "Bar.") 2) ++ (+ 1 2)) ++ |> Bar. ++ => (1 NIL 3) ++ ++ Note that "Foo." is not printed because the condition made by signal ++is a simple condition, which is not of type error, so it doesn't trigger ++the handler for error set up by trap-errors. ++ ++See Also:: ++.......... ++ ++*note handler-case:: ++ ++ ++File: gcl.info, Node: handler-case, Next: ignore-errors, Prev: handler-bind, Up: Conditions Dictionary ++ ++9.2.27 handler-case [Macro] ++--------------------------- ++ ++'handler-case' expression [[{!error-clause}* | !no-error-clause]] => ++{result}* ++ ++ clause ::=!error-clause | !no-error-clause ++ ++ error-clause ::=(typespec ([var]) {declaration}* {form}*) ++ ++ no-error-clause ::=(:no-error lambda-list {declaration}* {form}*) ++ ++Arguments and Values:: ++...................... ++ ++expression--a form. ++ ++ typespec--a type specifier. ++ ++ var--a variable name. ++ ++ lambda-list--an ordinary lambda list. ++ ++ declaration--a declare expression; not evaluated. ++ ++ form--a form. ++ ++ results--In the normal situation, the values returned are those that ++result from the evaluation of expression; in the exceptional situation ++when control is transferred to a clause, the value of the last form in ++that clause is returned. ++ ++Description:: ++............. ++ ++handler-case executes expression in a dynamic environment where various ++handlers are active. Each error-clause specifies how to handle a ++condition matching the indicated typespec. A no-error-clause allows the ++specification of a particular action if control returns normally. ++ ++ If a condition is signaled for which there is an appropriate ++error-clause during the execution of expression (i.e., one for which ++(typep condition 'typespec) returns true) and if there is no intervening ++handler for a condition of that type, then control is transferred to the ++body of the relevant error-clause. In this case, the dynamic state is ++unwound appropriately (so that the handlers established around the ++expression are no longer active), and var is bound to the condition that ++had been signaled. If more than one case is provided, those cases are ++made accessible in parallel. That is, in ++ ++ (handler-case form ++ (typespec1 (var1) form1) ++ (typespec2 (var2) form2)) ++ ++ if the first clause (containing form1) has been selected, the handler ++for the second is no longer visible (or vice versa). ++ ++ The clauses are searched sequentially from top to bottom. If there ++is type overlap between typespecs, the earlier of the clauses is ++selected. ++ ++ If var is not needed, it can be omitted. That is, a clause such as: ++ ++ (typespec (var) (declare (ignore var)) form) ++ ++ can be written (typespec () form). ++ ++ If there are no forms in a selected clause, the case, and therefore ++handler-case, returns nil. If execution of expression returns normally ++and no no-error-clause exists, the values returned by expression are ++returned by handler-case. If execution of expression returns normally ++and a no-error-clause does exist, the values returned are used as ++arguments to the function described by constructing (lambda lambda-list ++{form}*) from the no-error-clause, and the values of that function call ++are returned by handler-case. The handlers which were established ++around the expression are no longer active at the time of this call. ++ ++Examples:: ++.......... ++ ++ (defun assess-condition (condition) ++ (handler-case (signal condition) ++ (warning () "Lots of smoke, but no fire.") ++ ((or arithmetic-error control-error cell-error stream-error) ++ (condition) ++ (format nil "~S looks especially bad." condition)) ++ (serious-condition (condition) ++ (format nil "~S looks serious." condition)) ++ (condition () "Hardly worth mentioning."))) ++ => ASSESS-CONDITION ++ (assess-condition (make-condition 'stream-error :stream *terminal-io*)) ++ => "# looks especially bad." ++ (define-condition random-condition (condition) () ++ (:report (lambda (condition stream) ++ (declare (ignore condition)) ++ (princ "Yow" stream)))) ++ => RANDOM-CONDITION ++ (assess-condition (make-condition 'random-condition)) ++ => "Hardly worth mentioning." ++ ++See Also:: ++.......... ++ ++*note handler-bind:: , *note ignore-errors:: , *note Condition System ++Concepts:: ++ ++Notes:: ++....... ++ ++ (handler-case form ++ (type1 (var1) . body1) ++ (type2 (var2) . body2) ...) ++ ++ is approximately equivalent to: ++ ++ (block #1=#:g0001 ++ (let ((#2=#:g0002 nil)) ++ (tagbody ++ (handler-bind ((type1 #'(lambda (temp) ++ (setq #1# temp) ++ (go #3=#:g0003))) ++ (type2 #'(lambda (temp) ++ (setq #2# temp) ++ (go #4=#:g0004))) ...) ++ (return-from #1# form)) ++ #3# (return-from #1# (let ((var1 #2#)) . body1)) ++ #4# (return-from #1# (let ((var2 #2#)) . body2)) ...))) ++ ++ (handler-case form ++ (type1 (var1) . body1) ++ ... ++ (:no-error (varN-1 varN-2 ...) . bodyN)) ++ ++ is approximately equivalent to: ++ ++ ++ (block #1=#:error-return ++ (multiple-value-call #'(lambda (varN-1 varN-2 ...) . bodyN) ++ (block #2=#:normal-return ++ (return-from #1# ++ (handler-case (return-from #2# form) ++ (type1 (var1) . body1) ...))))) ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-5 +@@ -0,0 +1,9892 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: ignore-errors, Next: define-condition, Prev: handler-case, Up: Conditions Dictionary ++ ++9.2.28 ignore-errors [Macro] ++---------------------------- ++ ++'ignore-errors' {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++forms--an implicit progn. ++ ++ results--In the normal situation, the values of the forms are ++returned; in the exceptional situation, two values are returned: nil and ++the condition. ++ ++Description:: ++............. ++ ++ignore-errors is used to prevent conditions of type error from causing ++entry into the debugger. ++ ++ Specifically, ignore-errors executes forms in a dynamic environment ++where a handler for conditions of type error has been established; if ++invoked, it handles such conditions by returning two values, nil and the ++condition that was signaled, from the ignore-errors form. ++ ++ If a normal return from the forms occurs, any values returned are ++returned by ignore-errors. ++ ++Examples:: ++.......... ++ ++ (defun load-init-file (program) ++ (let ((win nil)) ++ (ignore-errors ;if this fails, don't enter debugger ++ (load (merge-pathnames (make-pathname :name program :type :lisp) ++ (user-homedir-pathname))) ++ (setq win t)) ++ (unless win (format t "~&Init file failed to load.~ ++ win)) ++ ++ (load-init-file "no-such-program") ++ |> Init file failed to load. ++ NIL ++ ++See Also:: ++.......... ++ ++*note handler-case:: , *note Condition System Concepts:: ++ ++Notes:: ++....... ++ ++ (ignore-errors . forms) ++ ++ is equivalent to: ++ ++ (handler-case (progn . forms) ++ (error (condition) (values nil condition))) ++ ++ Because the second return value is a condition in the exceptional ++case, it is common (but not required) to arrange for the second return ++value in the normal case to be missing or nil so that the two situations ++can be distinguished. ++ ++ ++File: gcl.info, Node: define-condition, Next: make-condition, Prev: ignore-errors, Up: Conditions Dictionary ++ ++9.2.29 define-condition [Macro] ++------------------------------- ++ ++[Editorial Note by KMP: This syntax stuff is still very confused and ++needs lots of work.] ++ ++ 'define-condition' name ({parent-type}*) ({!slot-spec}*) {option}* ++=> name ++ ++ slot-spec ::=slot-name | (slot-name !slot-option) ++ ++ slot-option ::=[[ {:reader symbol}* | ++ {:writer !function-name}* | ++ {:accessor symbol}* | ++ {:allocation !allocation-type} | ++ {:initarg symbol}* | ++ {:initform form} | ++ {:type type-specifier} ]] ++ ++ option ::=[[ (:default-initargs . initarg-list) | ++ (:documentation string) | ++ (:report report-name) ]] ++ ++ function-name ::={symbol | (setf symbol)} ++ ++ allocation-type ::=:instance | :class ++ ++ report-name ::=string | symbol | lambda expression ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ parent-type--a symbol naming a condition type. If no parent-types ++are supplied, the parent-types default to (condition). ++ ++ default-initargs--a list of keyword/value pairs. ++ ++ [Editorial Note by KMP: This is all mixed up as to which is a slot ++option and which is a main option. I'll sort that out. Also, some of ++this is implied by the bnf and needn't be stated explicitly.] ++ ++ Slot-spec - the name of a slot or a list consisting of the slot-name ++followed by zero or more slot-options. ++ ++ Slot-name - a slot name (a symbol), the list of a slot name, or the ++list of slot name/slot form pairs. ++ ++ Option - Any of the following: ++ ++:reader ++ :reader can be supplied more than once for a given slot and cannot ++ be nil. ++ ++:writer ++ :writer can be supplied more than once for a given slot and must ++ name a generic function. ++ ++:accessor ++ :accessor can be supplied more than once for a given slot and ++ cannot be nil. ++ ++:allocation ++ :allocation can be supplied once at most for a given slot. The ++ default if :allocation is not supplied is :instance. ++ ++:initarg ++ :initarg can be supplied more than once for a given slot. ++ ++:initform ++ :initform can be supplied once at most for a given slot. ++ ++:type ++ :type can be supplied once at most for a given slot. ++ ++:documentation ++ :documentation can be supplied once at most for a given slot. ++ ++:report ++ :report can be supplied once at most. ++ ++Description:: ++............. ++ ++define-condition defines a new condition type called name, which is a ++subtype of ++ ++ the type or types named by parent-type. Each parent-type argument ++specifies a direct supertype of the new condition. The new condition ++inherits slots and methods from each of its direct supertypes, and so ++on. ++ ++ If a slot name/slot form pair is supplied, the slot form is a form ++that can be evaluated by make-condition to produce a default value when ++an explicit value is not provided. If no slot form is supplied, the ++contents of the slot is initialized in an implementation-dependent way. ++ ++ If the type being defined and some other type from which it inherits ++have a slot by the same name, only one slot is allocated in the ++condition, but the supplied slot form overrides any slot form that might ++otherwise have been inherited from a parent-type. If no slot form is ++supplied, the inherited slot form (if any) is still visible. ++ ++ Accessors are created according to the same rules as used by ++defclass. ++ ++ A description of slot-options follows: ++ ++:reader ++ The :reader slot option specifies that an unqualified method is to ++ be defined on the generic function named by the argument to :reader ++ to read the value of the given slot. ++ ++* ++ The :initform slot option is used to provide a default initial ++ value form to be used in the initialization of the slot. This form ++ is evaluated every time it is used to initialize the slot. The ++ lexical environment in which this form is evaluated is the lexical ++ environment in which the define-condition form was evaluated. Note ++ that the lexical environment refers both to variables and to ++ functions. For local slots, the dynamic environment is the dynamic ++ environment in which make-condition was called; for shared slots, ++ the dynamic environment is the dynamic environment in which the ++ define-condition form was evaluated. ++ ++ [Reviewer Note by Barmar: Issue CLOS-CONDITIONS doesn't say this.] ++ No implementation is permitted to extend the syntax of ++ define-condition to allow (slot-name form) as an abbreviation for ++ (slot-name :initform form). ++ ++:initarg ++ The :initarg slot option declares an initialization argument named ++ by its symbol argument and specifies that this initialization ++ argument initializes the given slot. If the initialization ++ argument has a value in the call to initialize-instance, the value ++ is stored into the given slot, and the slot's :initform slot ++ option, if any, is not evaluated. If none of the initialization ++ arguments specified for a given slot has a value, the slot is ++ initialized according to the :initform slot option, if specified. ++ ++:type ++ The :type slot option specifies that the contents of the slot is ++ always of the specified type. It effectively declares the result ++ type of the reader generic function when applied to an object of ++ this condition type. The consequences of attempting to store in a ++ slot a value that does not satisfy the type of the slot is ++ undefined. ++ ++:default-initargs ++ ++ [Editorial Note by KMP: This is an option, not a slot option.] ++ ++ This option is treated the same as it would be defclass. ++ ++:documentation ++ ++ [Editorial Note by KMP: This is both an option and a slot option.] ++ ++ The :documentation slot option provides a documentation string for ++ the slot. ++ ++:report ++ ++ [Editorial Note by KMP: This is an option, not a slot option.] ++ ++ Condition reporting is mediated through the print-object method for ++ the condition type in question, with *print-escape* always being ++ nil. Specifying (:report report-name) in the definition of a ++ condition type C is equivalent to: ++ ++ (defmethod print-object ((x c) stream) ++ (if *print-escape* (call-next-method) (report-name x stream))) ++ ++ If the value supplied by the argument to :report (report-name) is a ++ symbol or a lambda expression, it must be acceptable to function. ++ (function report-name) is evaluated in the current lexical ++ environment. It should return a function of two arguments, a ++ condition and a stream, that prints on the stream a description of ++ the condition. This function is called whenever the condition is ++ printed while *print-escape* is nil. ++ ++ If report-name is a string, it is a shorthand for ++ ++ (lambda (condition stream) ++ (declare (ignore condition)) ++ (write-string report-name stream)) ++ ++ This option is processed after the new condition type has been ++ defined, so use of the slot accessors within the :report function ++ is permitted. If this option is not supplied, information about ++ how to report this type of condition is inherited from the ++ parent-type. ++ ++ The consequences are unspecifed if an attempt is made to read a slot ++that has not been explicitly initialized and that has not been given a ++default value. ++ ++ The consequences are unspecified if an attempt is made to assign the ++slots by using setf. ++ ++ If a define-condition form appears as a top level form, the compiler ++must make name recognizable as a valid type name, and it must be ++possible to reference the condition type as the parent-type of another ++condition type in a subsequent define-condition form in the file being ++compiled. ++ ++Examples:: ++.......... ++ ++The following form defines a condition of type peg/hole-mismatch which ++inherits from a condition type called blocks-world-error: ++ ++ (define-condition peg/hole-mismatch ++ (blocks-world-error) ++ ((peg-shape :initarg :peg-shape ++ :reader peg/hole-mismatch-peg-shape) ++ (hole-shape :initarg :hole-shape ++ :reader peg/hole-mismatch-hole-shape)) ++ (:report (lambda (condition stream) ++ (format stream "A ~A peg cannot go in a ~A hole." ++ (peg/hole-mismatch-peg-shape condition) ++ (peg/hole-mismatch-hole-shape condition))))) ++ ++ The new type has slots peg-shape and hole-shape, so make-condition ++accepts :peg-shape and :hole-shape keywords. The readers ++peg/hole-mismatch-peg-shape and peg/hole-mismatch-hole-shape apply to ++objects of this type, as illustrated in the :report information. ++ ++ The following form defines a condition type named machine-error which ++inherits from error: ++ ++ (define-condition machine-error ++ (error) ++ ((machine-name :initarg :machine-name ++ :reader machine-error-machine-name)) ++ (:report (lambda (condition stream) ++ (format stream "There is a problem with ~A." ++ (machine-error-machine-name condition))))) ++ ++ Building on this definition, a new error condition can be defined ++which is a subtype of machine-error for use when machines are not ++available: ++ ++ (define-condition machine-not-available-error (machine-error) () ++ (:report (lambda (condition stream) ++ (format stream "The machine ~A is not available." ++ (machine-error-machine-name condition))))) ++ ++ This defines a still more specific condition, built upon ++machine-not-available-error, which provides a slot initialization form ++for machine-name but which does not provide any new slots or report ++information. It just gives the machine-name slot a default ++initialization: ++ ++ (define-condition my-favorite-machine-not-available-error ++ (machine-not-available-error) ++ ((machine-name :initform "mc.lcs.mit.edu"))) ++ ++ Note that since no :report clause was given, the information ++inherited from machine-not-available-error is used to report this type ++of condition. ++ ++ (define-condition ate-too-much (error) ++ ((person :initarg :person :reader ate-too-much-person) ++ (weight :initarg :weight :reader ate-too-much-weight) ++ (kind-of-food :initarg :kind-of-food ++ :reader :ate-too-much-kind-of-food))) ++ => ATE-TOO-MUCH ++ (define-condition ate-too-much-ice-cream (ate-too-much) ++ ((kind-of-food :initform 'ice-cream) ++ (flavor :initarg :flavor ++ :reader ate-too-much-ice-cream-flavor ++ :initform 'vanilla )) ++ (:report (lambda (condition stream) ++ (format stream "~A ate too much ~A ice-cream" ++ (ate-too-much-person condition) ++ (ate-too-much-ice-cream-flavor condition))))) ++ => ATE-TOO-MUCH-ICE-CREAM ++ (make-condition 'ate-too-much-ice-cream ++ :person 'fred ++ :weight 300 ++ :flavor 'chocolate) ++ => # ++ (format t "~A" *) ++ |> FRED ate too much CHOCOLATE ice-cream ++ => NIL ++ ++See Also:: ++.......... ++ ++*note make-condition:: , *note defclass:: , *note Condition System ++Concepts:: ++ ++ ++File: gcl.info, Node: make-condition, Next: restart, Prev: define-condition, Up: Conditions Dictionary ++ ++9.2.30 make-condition [Function] ++-------------------------------- ++ ++'make-condition' type &rest slot-initializations => condition ++ ++Arguments and Values:: ++...................... ++ ++type--a type specifier (for a subtype of condition). ++ ++ slot-initializations--an initialization argument list. ++ ++ condition--a condition. ++ ++Description:: ++............. ++ ++Constructs and returns a condition of type type using ++slot-initializations for the initial values of the slots. The newly ++created condition is returned. ++ ++Examples:: ++.......... ++ ++ (defvar *oops-count* 0) ++ ++ (setq a (make-condition 'simple-error ++ :format-control "This is your ~:R error." ++ :format-arguments (list (incf *oops-count*)))) ++ => # ++ ++ (format t "~&~A~ ++ |> This is your first error. ++ => NIL ++ ++ (error a) ++ |> Error: This is your first error. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Return to Lisp Toplevel. ++ |> Debug> ++ ++Affected By:: ++............. ++ ++The set of defined condition types. ++ ++See Also:: ++.......... ++ ++*note define-condition:: , *note Condition System Concepts:: ++ ++ ++File: gcl.info, Node: restart, Next: compute-restarts, Prev: make-condition, Up: Conditions Dictionary ++ ++9.2.31 restart [System Class] ++----------------------------- ++ ++Class Precedence List:: ++....................... ++ ++restart, t ++ ++Description:: ++............. ++ ++An object of type restart represents a function that can be called to ++perform some form of recovery action, usually a transfer of control to ++an outer point in the running program. ++ ++ An implementation is free to implement a restart in whatever manner ++is most convenient; a restart has only dynamic extent relative to the ++scope of the binding form which establishes it. ++ ++ ++File: gcl.info, Node: compute-restarts, Next: find-restart, Prev: restart, Up: Conditions Dictionary ++ ++9.2.32 compute-restarts [Function] ++---------------------------------- ++ ++'compute-restarts' &optional condition => restarts ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition object, or nil. ++ ++ restarts--a list of restarts. ++ ++Description:: ++............. ++ ++compute-restarts uses the dynamic state of the program to compute a list ++of the restarts which are currently active. ++ ++ The resulting list is ordered so that the innermost (more-recently ++established) restarts are nearer the head of the list. ++ ++ When condition is non-nil, only those restarts are considered that ++are either explicitly associated with that condition, or not associated ++with any condition; that is, the excluded restarts are those that are ++associated with a non-empty set of conditions of which the given ++condition is not an element. If condition is nil, all restarts are ++considered. ++ ++ compute-restarts returns all applicable restarts, including anonymous ++ones, even if some of them have the same name as others and would ++therefore not be found by find-restart when given a symbol argument. ++ ++ Implementations are permitted, but not required, to return distinct ++lists from repeated calls to compute-restarts while in the same dynamic ++environment. The consequences are undefined if the list returned by ++compute-restarts is every modified. ++ ++Examples:: ++.......... ++ ++ ;; One possible way in which an interactive debugger might present ++ ;; restarts to the user. ++ (defun invoke-a-restart () ++ (let ((restarts (compute-restarts))) ++ (do ((i 0 (+ i 1)) (r restarts (cdr r))) ((null r)) ++ (format t "~&~D: ~A~ ++ (let ((n nil) (k (length restarts))) ++ (loop (when (and (typep n 'integer) (>= n 0) (< n k)) ++ (return t)) ++ (format t "~&Option: ") ++ (setq n (read)) ++ (fresh-line)) ++ (invoke-restart-interactively (nth n restarts))))) ++ ++ (restart-case (invoke-a-restart) ++ (one () 1) ++ (two () 2) ++ (nil () :report "Who knows?" 'anonymous) ++ (one () 'I) ++ (two () 'II)) ++ |> 0: ONE ++ |> 1: TWO ++ |> 2: Who knows? ++ |> 3: ONE ++ |> 4: TWO ++ |> 5: Return to Lisp Toplevel. ++ |> Option: |>>4<<| ++ => II ++ ++ ;; Note that in addition to user-defined restart points, COMPUTE-RESTARTS ++ ;; also returns information about any system-supplied restarts, such as ++ ;; the "Return to Lisp Toplevel" restart offered above. ++ ++ ++Affected By:: ++............. ++ ++Existing restarts. ++ ++See Also:: ++.......... ++ ++*note find-restart:: , *note invoke-restart:: , *note restart-bind:: ++ ++ ++File: gcl.info, Node: find-restart, Next: invoke-restart, Prev: compute-restarts, Up: Conditions Dictionary ++ ++9.2.33 find-restart [Function] ++------------------------------ ++ ++'find-restart' identifier &optional condition restart ++ ++Arguments and Values:: ++...................... ++ ++identifier--a non-nil symbol, or a restart. ++ ++ condition--a condition object, or nil. ++ ++ restart--a restart or nil. ++ ++Description:: ++............. ++ ++find-restart searches for a particular restart in the current dynamic ++environment. ++ ++ When condition is non-nil, only those restarts are considered that ++are either explicitly associated with that condition, or not associated ++with any condition; that is, the excluded restarts are those that are ++associated with a non-empty set of conditions of which the given ++condition is not an element. If condition is nil, all restarts are ++considered. ++ ++ If identifier is a symbol, then the innermost (most recently ++established) applicable restart with that name is returned. nil is ++returned if no such restart is found. ++ ++ If identifier is a currently active restart, then it is returned. ++Otherwise, nil is returned. ++ ++Examples:: ++.......... ++ ++ (restart-case ++ (let ((r (find-restart 'my-restart))) ++ (format t "~S is named ~S" r (restart-name r))) ++ (my-restart () nil)) ++ |> # is named MY-RESTART ++ => NIL ++ (find-restart 'my-restart) ++ => NIL ++ ++Affected By:: ++............. ++ ++Existing restarts. ++ ++ restart-case, restart-bind, with-condition-restarts. ++ ++See Also:: ++.......... ++ ++*note compute-restarts:: ++ ++Notes:: ++....... ++ ++ (find-restart identifier) ++ == (find identifier (compute-restarts) :key :restart-name) ++ ++ Although anonymous restarts have a name of nil, the consequences are ++unspecified if nil is given as an identifier. Occasionally, programmers ++lament that nil is not permissible as an identifier argument. In most ++such cases, compute-restarts can probably be used to simulate the ++desired effect. ++ ++ ++File: gcl.info, Node: invoke-restart, Next: invoke-restart-interactively, Prev: find-restart, Up: Conditions Dictionary ++ ++9.2.34 invoke-restart [Function] ++-------------------------------- ++ ++'invoke-restart' restart &rest arguments => {result}* ++ ++Arguments and Values:: ++...................... ++ ++restart--a restart designator. ++ ++ argument--an object. ++ ++ results--the values returned by the function associated with restart, ++if that function returns. ++ ++Description:: ++............. ++ ++Calls the function associated with restart, passing arguments to it. ++Restart must be valid in the current dynamic environment. ++ ++Examples:: ++.......... ++ ++ (defun add3 (x) (check-type x number) (+ x 3)) ++ ++ (foo 'seven) ++ |> Error: The value SEVEN was not of type NUMBER. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a different value to use. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>(invoke-restart 'store-value 7)<<| ++ => 10 ++ ++Side Effects:: ++.............. ++ ++A non-local transfer of control might be done by the restart. ++ ++Affected By:: ++............. ++ ++Existing restarts. ++ ++Exceptional Situations:: ++........................ ++ ++If restart is not valid, an error of type control-error is signaled. ++ ++See Also:: ++.......... ++ ++*note find-restart:: , *note restart-bind:: , *note restart-case:: , ++*note invoke-restart-interactively:: ++ ++Notes:: ++....... ++ ++The most common use for invoke-restart is in a handler. It might be ++used explicitly, or implicitly through invoke-restart-interactively or a ++restart function. ++ ++ Restart functions call invoke-restart, not vice versa. That is, ++invoke-restart provides primitive functionality, and restart functions ++are non-essential "syntactic sugar." ++ ++ ++File: gcl.info, Node: invoke-restart-interactively, Next: restart-bind, Prev: invoke-restart, Up: Conditions Dictionary ++ ++9.2.35 invoke-restart-interactively [Function] ++---------------------------------------------- ++ ++'invoke-restart-interactively' restart => {result}* ++ ++Arguments and Values:: ++...................... ++ ++restart--a restart designator. ++ ++ results--the values returned by the function associated with restart, ++if that function returns. ++ ++Description:: ++............. ++ ++invoke-restart-interactively calls the function associated with restart, ++prompting for any necessary arguments. If restart is a name, it must be ++valid in the current dynamic environment. ++ ++ invoke-restart-interactively prompts for arguments by executing the ++code provided in the :interactive keyword to restart-case or ++:interactive-function keyword to restart-bind. ++ ++ If no such options have been supplied in the corresponding ++restart-bind or restart-case, then the consequences are undefined if the ++restart takes required arguments. If the arguments are optional, an ++argument list of nil is used. ++ ++ Once the arguments have been determined, invoke-restart-interactively ++executes the following: ++ ++ (apply #'invoke-restart restart arguments) ++ ++Examples:: ++.......... ++ ++ (defun add3 (x) (check-type x number) (+ x 3)) ++ ++ (add3 'seven) ++ |> Error: The value SEVEN was not of type NUMBER. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a different value to use. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>(invoke-restart-interactively 'store-value)<<| ++ |> Type a form to evaluate and use: |>>7<<| ++ => 10 ++ ++Side Effects:: ++.............. ++ ++If prompting for arguments is necesary, some typeout may occur (on query ++I/O). ++ ++ A non-local transfer of control might be done by the restart. ++ ++Affected By:: ++............. ++ ++*query-io*, active restarts ++ ++Exceptional Situations:: ++........................ ++ ++If restart is not valid, an error of type control-error is signaled. ++ ++See Also:: ++.......... ++ ++*note find-restart:: , *note invoke-restart:: , *note restart-case:: , ++*note restart-bind:: ++ ++Notes:: ++....... ++ ++invoke-restart-interactively is used internally by the debugger and may ++also be useful in implementing other portable, interactive debugging ++tools. ++ ++ ++File: gcl.info, Node: restart-bind, Next: restart-case, Prev: invoke-restart-interactively, Up: Conditions Dictionary ++ ++9.2.36 restart-bind [Macro] ++--------------------------- ++ ++'restart-bind' ({(name function {!key-val-pair}*)}) {form}* ++=> {result}* ++ ++ key-val-pair ::=:interactive-function interactive-function | ++ :report-function report-function | ++ :test-function test-function ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol; not evaluated. ++ ++ function--a form; evaluated. ++ ++ forms--an implicit progn. ++ ++ interactive-function--a form; evaluated. ++ ++ report-function--a form; evaluated. ++ ++ test-function--a form; evaluated. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++restart-bind executes the body of forms in a dynamic environment where ++restarts with the given names are in effect. ++ ++ If a name is nil, it indicates an anonymous restart; if a name is a ++non-nil symbol, it indicates a named restart. ++ ++ The function, interactive-function, and report-function are ++unconditionally evaluated in the current lexical and dynamic environment ++prior to evaluation of the body. Each of these forms must evaluate to a ++function. ++ ++ If invoke-restart is done on that restart, the function which ++resulted from evaluating function is called, in the dynamic environment ++of the invoke-restart, with the arguments given to invoke-restart. The ++function may either perform a non-local transfer of control or may ++return normally. ++ ++ If the restart is invoked interactively from the debugger (using ++invoke-restart-interactively), the arguments are defaulted by calling ++the function which resulted from evaluating interactive-function. That ++function may optionally prompt interactively on query I/O, and should ++return a list of arguments to be used by invoke-restart-interactively ++when invoking the restart. ++ ++ If a restart is invoked interactively but no interactive-function is ++used, then an argument list of nil is used. In that case, the function ++must be compatible with an empty argument list. ++ ++ If the restart is presented interactively (e.g., by the debugger), ++the presentation is done by calling the function which resulted from ++evaluating report-function. This function must be a function of one ++argument, a stream. It is expected to print a description of the action ++that the restart takes to that stream. This function is called any time ++the restart is printed while *print-escape* is nil. ++ ++ In the case of interactive invocation, the result is dependent on the ++value of :interactive-function as follows. ++ ++:interactive-function ++ Value is evaluated in the current lexical environment and should ++ return a function of no arguments which constructs a list of ++ arguments to be used by invoke-restart-interactively when invoking ++ this restart. The function may prompt interactively using query ++ I/O if necessary. ++ ++:report-function ++ Value is evaluated in the current lexical environment and should ++ return a function of one argument, a stream, which prints on the ++ stream a summary of the action that this restart takes. This ++ function is called whenever the restart is reported (printed while ++ *print-escape* is nil). If no :report-function option is provided, ++ the manner in which the restart is reported is ++ implementation-dependent. ++ ++:test-function ++ Value is evaluated in the current lexical environment and should ++ return a function of one argument, a condition, which returns true ++ if the restart is to be considered visible. ++ ++Affected By:: ++............. ++ ++*query-io*. ++ ++See Also:: ++.......... ++ ++*note restart-case:: , *note with-simple-restart:: ++ ++Notes:: ++....... ++ ++restart-bind is primarily intended to be used to implement restart-case ++and might be useful in implementing other macros. Programmers who are ++uncertain about whether to use restart-case or restart-bind should ++prefer restart-case for the cases where it is powerful enough, using ++restart-bind only in cases where its full generality is really needed. ++ ++ ++File: gcl.info, Node: restart-case, Next: restart-name, Prev: restart-bind, Up: Conditions Dictionary ++ ++9.2.37 restart-case [Macro] ++--------------------------- ++ ++'restart-case' restartable-form {!clause} => {result}* ++ ++ clause ::=( case-name lambda-list ++ [[:interactive interactive-expression | :report report-expression | :test test-expression]] ++ {declaration}* {form}*) ++ ++Arguments and Values:: ++...................... ++ ++restartable-form--a form. ++ ++ case-name--a symbol or nil. ++ ++ lambda-list--an ordinary lambda list. ++ ++ interactive-expression--a symbol or a lambda expression. ++ ++ report-expression--a string, a symbol, or a lambda expression. ++ ++ test-expression--a symbol or a lambda expression. ++ ++ declaration--a declare expression; not evaluated. ++ ++ form--a form. ++ ++ results--the values resulting from the evaluation of ++restartable-form, or the values returned by the last form executed in a ++chosen clause, or nil. ++ ++Description:: ++............. ++ ++restart-case evaluates restartable-form in a dynamic environment where ++the clauses have special meanings as points to which control may be ++transferred. If restartable-form finishes executing and returns any ++values, all values returned are returned by restart-case and processing ++has completed. While restartable-form is executing, any code may ++transfer control to one of the clauses (see invoke-restart). If a ++transfer occurs, the forms in the body of that clause is evaluated and ++any values returned by the last such form are returned by restart-case. ++In this case, the dynamic state is unwound appropriately (so that the ++restarts established around the restartable-form are no longer active) ++prior to execution of the clause. ++ ++ If there are no forms in a selected clause, restart-case returns nil. ++ ++ If case-name is a symbol, it names this restart. ++ ++ It is possible to have more than one clause use the same case-name. ++In this case, the first clause with that name is found by find-restart. ++The other clauses are accessible using compute-restarts. ++ ++ Each arglist is an ordinary lambda list to be bound during the ++execution of its corresponding forms. These parameters are used by the ++restart-case clause to receive any necessary data from a call to ++invoke-restart. ++ ++ By default, invoke-restart-interactively passes no arguments and all ++arguments must be optional in order to accomodate interactive ++restarting. However, the arguments need not be optional if the ++:interactive keyword has been used to inform ++invoke-restart-interactively about how to compute a proper argument ++list. ++ ++ Keyword options have the following meaning. ++ ++:interactive ++ The value supplied by :interactive value must be a suitable ++ argument to function. (function value) is evaluated in the current ++ lexical environment. It should return a function of no arguments ++ which returns arguments to be used by invoke-restart-interactively ++ when it is invoked. invoke-restart-interactively is called in the ++ dynamic environment available prior to any restart attempt, and ++ uses query I/O for user interaction. ++ ++ If a restart is invoked interactively but no :interactive option ++ was supplied, the argument list used in the invocation is the empty ++ list. ++ ++:report ++ If the value supplied by :report value is a lambda expression or a ++ symbol, it must be acceptable to function. (function value) is ++ evaluated in the current lexical environment. It should return a ++ function of one argument, a stream, which prints on the stream a ++ description of the restart. This function is called whenever the ++ restart is printed while *print-escape* is nil. ++ ++ If value is a string, it is a shorthand for ++ ++ (lambda (stream) (write-string value stream)) ++ ++ If a named restart is asked to report but no report information has ++ been supplied, the name of the restart is used in generating ++ default report text. ++ ++ When *print-escape* is nil, the printer uses the report information ++ for a restart. For example, a debugger might announce the action ++ of typing a "continue" command by: ++ ++ (format t "~&~S -- ~A~ ++ ++ which might then display as something like: ++ ++ :CONTINUE -- Return to command level ++ ++ The consequences are unspecified if an unnamed restart is specified ++ but no :report option is provided. ++ ++:test ++ The value supplied by :test value must be a suitable argument to ++ function. (function value) is evaluated in the current lexical ++ environment. It should return a function of one argument, the ++ condition, that returns true if the restart is to be considered ++ visible. ++ ++ The default for this option is equivalent to (lambda (c) (declare ++ (ignore c)) t). ++ ++ If the restartable-form is a list whose car is any of the symbols ++signal, error, cerror, or warn (or is a macro form which macroexpands ++into such a list), then with-condition-restarts is used implicitly to ++associate the indicated restarts with the condition to be signaled. ++ ++Examples:: ++.......... ++ ++ (restart-case ++ (handler-bind ((error #'(lambda (c) ++ (declare (ignore condition)) ++ (invoke-restart 'my-restart 7)))) ++ (error "Foo.")) ++ (my-restart (&optional v) v)) ++ => 7 ++ ++ (define-condition food-error (error) ()) ++ => FOOD-ERROR ++ (define-condition bad-tasting-sundae (food-error) ++ ((ice-cream :initarg :ice-cream :reader bad-tasting-sundae-ice-cream) ++ (sauce :initarg :sauce :reader bad-tasting-sundae-sauce) ++ (topping :initarg :topping :reader bad-tasting-sundae-topping)) ++ (:report (lambda (condition stream) ++ (format stream "Bad tasting sundae with ~S, ~S, and ~S" ++ (bad-tasting-sundae-ice-cream condition) ++ (bad-tasting-sundae-sauce condition) ++ (bad-tasting-sundae-topping condition))))) ++ => BAD-TASTING-SUNDAE ++ (defun all-start-with-same-letter (symbol1 symbol2 symbol3) ++ (let ((first-letter (char (symbol-name symbol1) 0))) ++ (and (eql first-letter (char (symbol-name symbol2) 0)) ++ (eql first-letter (char (symbol-name symbol3) 0))))) ++ => ALL-START-WITH-SAME-LETTER ++ (defun read-new-value () ++ (format t "Enter a new value: ") ++ (multiple-value-list (eval (read)))) ++ => READ-NEW-VALUE ++ (defun verify-or-fix-perfect-sundae (ice-cream sauce topping) ++ (do () ++ ((all-start-with-same-letter ice-cream sauce topping)) ++ (restart-case ++ (error 'bad-tasting-sundae ++ :ice-cream ice-cream ++ :sauce sauce ++ :topping topping) ++ (use-new-ice-cream (new-ice-cream) ++ :report "Use a new ice cream." ++ :interactive read-new-value ++ (setq ice-cream new-ice-cream)) ++ (use-new-sauce (new-sauce) ++ :report "Use a new sauce." ++ :interactive read-new-value ++ (setq sauce new-sauce)) ++ (use-new-topping (new-topping) ++ :report "Use a new topping." ++ :interactive read-new-value ++ (setq topping new-topping)))) ++ (values ice-cream sauce topping)) ++ => VERIFY-OR-FIX-PERFECT-SUNDAE ++ (verify-or-fix-perfect-sundae 'vanilla 'caramel 'cherry) ++ |> Error: Bad tasting sundae with VANILLA, CARAMEL, and CHERRY. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Use a new ice cream. ++ |> 2: Use a new sauce. ++ |> 3: Use a new topping. ++ |> 4: Return to Lisp Toplevel. ++ |> Debug> |>>:continue 1<<| ++ |> Use a new ice cream. ++ |> Enter a new ice cream: |>>'chocolate<<| ++ => CHOCOLATE, CARAMEL, CHERRY ++ ++See Also:: ++.......... ++ ++*note restart-bind:: , *note with-simple-restart:: . ++ ++Notes:: ++....... ++ ++ (restart-case expression ++ (name1 arglist1 ...options1... . body1) ++ (name2 arglist2 ...options2... . body2)) ++ ++ is essentially equivalent to ++ ++ (block #1=#:g0001 ++ (let ((#2=#:g0002 nil)) ++ (tagbody ++ (restart-bind ((name1 #'(lambda (&rest temp) ++ (setq #2# temp) ++ (go #3=#:g0003)) ++ ...slightly-transformed-options1...) ++ (name2 #'(lambda (&rest temp) ++ (setq #2# temp) ++ (go #4=#:g0004)) ++ ...slightly-transformed-options2...)) ++ (return-from #1# expression)) ++ #3# (return-from #1# ++ (apply #'(lambda arglist1 . body1) #2#)) ++ #4# (return-from #1# ++ (apply #'(lambda arglist2 . body2) #2#))))) ++ ++ Unnamed restarts are generally only useful interactively and an ++interactive option which has no description is of little value. ++Implementations are encouraged to warn if an unnamed restart is used and ++no report information is provided at compilation time. At runtime, this ++error might be noticed when entering the debugger. Since signaling an ++error would probably cause recursive entry into the debugger (causing ++yet another recursive error, etc.) it is suggested that the debugger ++print some indication of such problems when they occur but not actually ++signal errors. ++ ++ (restart-case (signal fred) ++ (a ...) ++ (b ...)) ++ == ++ (restart-case ++ (with-condition-restarts fred ++ (list (find-restart 'a) ++ (find-restart 'b)) ++ (signal fred)) ++ (a ...) ++ (b ...)) ++ ++ ++File: gcl.info, Node: restart-name, Next: with-condition-restarts, Prev: restart-case, Up: Conditions Dictionary ++ ++9.2.38 restart-name [Function] ++------------------------------ ++ ++'restart-name' restart => name ++ ++Arguments and Values:: ++...................... ++ ++restart--a restart. ++ ++ name--a symbol. ++ ++Description:: ++............. ++ ++Returns the name of the restart, or nil if the restart is not named. ++ ++Examples:: ++.......... ++ ++ (restart-case ++ (loop for restart in (compute-restarts) ++ collect (restart-name restart)) ++ (case1 () :report "Return 1." 1) ++ (nil () :report "Return 2." 2) ++ (case3 () :report "Return 3." 3) ++ (case1 () :report "Return 4." 4)) ++ => (CASE1 NIL CASE3 CASE1 ABORT) ++ ;; In the example above the restart named ABORT was not created ++ ;; explicitly, but was implicitly supplied by the system. ++ ++See Also:: ++.......... ++ ++*note compute-restarts:: ++ ++ *note find-restart:: ++ ++ ++File: gcl.info, Node: with-condition-restarts, Next: with-simple-restart, Prev: restart-name, Up: Conditions Dictionary ++ ++9.2.39 with-condition-restarts [Macro] ++-------------------------------------- ++ ++'with-condition-restarts' condition-form restarts-form {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++condition-form--a form; evaluated to produce a condition. ++ ++ condition--a condition object resulting from the evaluation of ++condition-form. ++ ++ restart-form--a form; evaluated to produce a restart-list. ++ ++ restart-list--a list of restart objects resulting from the evaluation ++of restart-form. ++ ++ forms--an implicit progn; evaluated. ++ ++ results--the values returned by forms. ++ ++Description:: ++............. ++ ++First, the condition-form and restarts-form are evaluated in normal ++left-to-right order; the primary values yielded by these evaluations are ++respectively called the condition and the restart-list. ++ ++ Next, the forms are evaluated in a dynamic environment in which each ++restart in restart-list is associated with the condition. See *note ++Associating a Restart with a Condition::. ++ ++See Also:: ++.......... ++ ++*note restart-case:: ++ ++Notes:: ++....... ++ ++Usually this macro is not used explicitly in code, since restart-case ++handles most of the common cases in a way that is syntactically more ++concise. ++ ++ ++File: gcl.info, Node: with-simple-restart, Next: abort (Restart), Prev: with-condition-restarts, Up: Conditions Dictionary ++ ++9.2.40 with-simple-restart [Macro] ++---------------------------------- ++ ++'with-simple-restart' (name format-control {format-argument}*) {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ format-control--a format control. ++ ++ format-argument--an object (i.e., a format argument). ++ ++ forms--an implicit progn. ++ ++ results--in the normal situation, the values returned by the forms; ++in the exceptional situation where the restart named name is invoked, ++two values--nil and t. ++ ++Description:: ++............. ++ ++with-simple-restart establishes a restart. ++ ++ If the restart designated by name is not invoked while executing ++forms, all values returned by the last of forms are returned. If the ++restart designated by name is invoked, control is transferred to ++with-simple-restart, which returns two values, nil and t. ++ ++ If name is nil, an anonymous restart is established. ++ ++ The format-control and format-arguments are used report the restart. ++ ++Examples:: ++.......... ++ ++ (defun read-eval-print-loop (level) ++ (with-simple-restart (abort "Exit command level ~D." level) ++ (loop ++ (with-simple-restart (abort "Return to command level ~D." level) ++ (let ((form (prog2 (fresh-line) (read) (fresh-line)))) ++ (prin1 (eval form))))))) ++ => READ-EVAL-PRINT-LOOP ++ (read-eval-print-loop 1) ++ (+ 'a 3) ++ |> Error: The argument, A, to the function + was of the wrong type. ++ |> The function expected a number. ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Specify a value to use this time. ++ |> 2: Return to command level 1. ++ |> 3: Exit command level 1. ++ |> 4: Return to Lisp Toplevel. ++ ++ (defun compute-fixnum-power-of-2 (x) ++ (with-simple-restart (nil "Give up on computing 2^~D." x) ++ (let ((result 1)) ++ (dotimes (i x result) ++ (setq result (* 2 result)) ++ (unless (fixnump result) ++ (error "Power of 2 is too large.")))))) ++ COMPUTE-FIXNUM-POWER-OF-2 ++ (defun compute-power-of-2 (x) ++ (or (compute-fixnum-power-of-2 x) 'something big)) ++ COMPUTE-POWER-OF-2 ++ (compute-power-of-2 10) ++ 1024 ++ (compute-power-of-2 10000) ++ |> Error: Power of 2 is too large. ++ |> To continue, type :CONTINUE followed by an option number. ++ |> 1: Give up on computing 2^10000. ++ |> 2: Return to Lisp Toplevel ++ |> Debug> |>>:continue 1<<| ++ => SOMETHING-BIG ++ ++See Also:: ++.......... ++ ++*note restart-case:: ++ ++Notes:: ++....... ++ ++with-simple-restart is shorthand for one of the most common uses of ++restart-case. ++ ++ with-simple-restart could be defined by: ++ ++ (defmacro with-simple-restart ((restart-name format-control ++ &rest format-arguments) ++ &body forms) ++ `(restart-case (progn ,@forms) ++ (,restart-name () ++ :report (lambda (stream) ++ (format stream ,format-control ,@format-arguments)) ++ (values nil t)))) ++ ++ Because the second return value is t in the exceptional case, it is ++common (but not required) to arrange for the second return value in the ++normal case to be missing or nil so that the two situations can be ++distinguished. ++ ++ ++File: gcl.info, Node: abort (Restart), Next: continue, Prev: with-simple-restart, Up: Conditions Dictionary ++ ++9.2.41 abort [Restart] ++---------------------- ++ ++Data Arguments Required:: ++......................... ++ ++None. ++ ++Description:: ++............. ++ ++The intent of the abort restart is to allow return to the innermost ++"command level." Implementors are encouraged to make sure that there is ++always a restart named abort around any user code so that user code can ++call abort at any time and expect something reasonable to happen; ++exactly what the reasonable thing is may vary somewhat. Typically, in ++an interactive listener, the invocation of abort returns to the Lisp ++reader phase of the Lisp read-eval-print loop, though in some batch or ++multi-processing situations there may be situations in which having it ++kill the running process is more appropriate. ++ ++See Also:: ++.......... ++ ++*note Restarts::, *note Interfaces to Restarts::, *note invoke-restart:: ++, *note abort (Function):: (function) ++ ++ ++File: gcl.info, Node: continue, Next: muffle-warning, Prev: abort (Restart), Up: Conditions Dictionary ++ ++9.2.42 continue [Restart] ++------------------------- ++ ++Data Arguments Required:: ++......................... ++ ++None. ++ ++Description:: ++............. ++ ++The continue restart is generally part of protocols where there is a ++single "obvious" way to continue, such as in break and cerror. Some ++user-defined protocols may also wish to incorporate it for similar ++reasons. In general, however, it is more reliable to design a special ++purpose restart with a name that more directly suits the particular ++application. ++ ++Examples:: ++.......... ++ ++ (let ((x 3)) ++ (handler-bind ((error #'(lambda (c) ++ (let ((r (find-restart 'continue c))) ++ (when r (invoke-restart r)))))) ++ (cond ((not (floatp x)) ++ (cerror "Try floating it." "~D is not a float." x) ++ (float x)) ++ (t x)))) => 3.0 ++ ++See Also:: ++.......... ++ ++*note Restarts::, *note Interfaces to Restarts::, *note invoke-restart:: ++, *note continue:: (function), *note assert:: , *note cerror:: ++ ++ ++File: gcl.info, Node: muffle-warning, Next: store-value, Prev: continue, Up: Conditions Dictionary ++ ++9.2.43 muffle-warning [Restart] ++------------------------------- ++ ++Data Arguments Required:: ++......................... ++ ++None. ++ ++Description:: ++............. ++ ++This restart is established by warn so that handlers of warning ++conditions have a way to tell warn that a warning has already been dealt ++with and that no further action is warranted. ++ ++Examples:: ++.......... ++ ++ (defvar *all-quiet* nil) => *ALL-QUIET* ++ (defvar *saved-warnings* '()) => *SAVED-WARNINGS* ++ (defun quiet-warning-handler (c) ++ (when *all-quiet* ++ (let ((r (find-restart 'muffle-warning c))) ++ (when r ++ (push c *saved-warnings*) ++ (invoke-restart r))))) ++ => CUSTOM-WARNING-HANDLER ++ (defmacro with-quiet-warnings (&body forms) ++ `(let ((*all-quiet* t) ++ (*saved-warnings* '())) ++ (handler-bind ((warning #'quiet-warning-handler)) ++ ,@forms ++ *saved-warnings*))) ++ => WITH-QUIET-WARNINGS ++ (setq saved ++ (with-quiet-warnings ++ (warn "Situation #1.") ++ (let ((*all-quiet* nil)) ++ (warn "Situation #2.")) ++ (warn "Situation #3."))) ++ |> Warning: Situation #2. ++ => (# #) ++ (dolist (s saved) (format t "~&~A~ ++ |> Situation #3. ++ |> Situation #1. ++ => NIL ++ ++See Also:: ++.......... ++ ++*note Restarts::, *note Interfaces to Restarts::, *note invoke-restart:: ++, *note muffle-warning:: (function), *note warn:: ++ ++ ++File: gcl.info, Node: store-value, Next: use-value, Prev: muffle-warning, Up: Conditions Dictionary ++ ++9.2.44 store-value [Restart] ++---------------------------- ++ ++Data Arguments Required:: ++......................... ++ ++a value to use instead (on an ongoing basis). ++ ++Description:: ++............. ++ ++The store-value restart is generally used by handlers trying to recover ++from errors of types such as cell-error or type-error, which may wish to ++supply a replacement datum to be stored permanently. ++ ++Examples:: ++.......... ++ ++ (defun type-error-auto-coerce (c) ++ (when (typep c 'type-error) ++ (let ((r (find-restart 'store-value c))) ++ (handler-case (let ((v (coerce (type-error-datum c) ++ (type-error-expected-type c)))) ++ (invoke-restart r v)) ++ (error ()))))) => TYPE-ERROR-AUTO-COERCE ++ (let ((x 3)) ++ (handler-bind ((type-error #'type-error-auto-coerce)) ++ (check-type x float) ++ x)) => 3.0 ++ ++See Also:: ++.......... ++ ++*note Restarts::, *note Interfaces to Restarts::, *note invoke-restart:: ++, *note store-value:: (function), ccase, *note check-type:: , ctypecase, ++*note use-value:: (function and restart) ++ ++ ++File: gcl.info, Node: use-value, Next: abort (Function), Prev: store-value, Up: Conditions Dictionary ++ ++9.2.45 use-value [Restart] ++-------------------------- ++ ++Data Arguments Required:: ++......................... ++ ++a value to use instead (once). ++ ++Description:: ++............. ++ ++The use-value restart is generally used by handlers trying to recover ++from errors of types such as cell-error, where the handler may wish to ++supply a replacement datum for one-time use. ++ ++See Also:: ++.......... ++ ++*note Restarts::, *note Interfaces to Restarts::, *note invoke-restart:: ++, *note use-value:: (function), *note store-value:: (function and ++restart) ++ ++ ++File: gcl.info, Node: abort (Function), Prev: use-value, Up: Conditions Dictionary ++ ++9.2.46 abort, continue, muffle-warning, store-value, use-value [Function] ++------------------------------------------------------------------------- ++ ++'abort' &optional condition => # ++ ++ 'continue' &optional condition => nil ++ ++ 'muffle-warning' &optional condition => # ++ ++ 'store-value' value &optional condition => nil ++ ++ 'use-value' value &optional condition => nil ++ ++Arguments and Values:: ++...................... ++ ++value--an object. ++ ++ condition--a condition object, or nil. ++ ++Description:: ++............. ++ ++Transfers control to the most recently established applicable restart ++having the same name as the function. That is, the function abort ++searches for an applicable abort restart, the function continue searches ++for an applicable continue restart, and so on. ++ ++ If no such restart exists, the functions continue, store-value, and ++use-value return nil, and the functions abort and muffle-warning signal ++an error of type control-error. ++ ++ When condition is non-nil, only those restarts are considered that ++are either explicitly associated with that condition, or not associated ++with any condition; that is, the excluded restarts are those that are ++associated with a non-empty set of conditions of which the given ++condition is not an element. If condition is nil, all restarts are ++considered. ++ ++Examples:: ++.......... ++ ++ ;;; Example of the ABORT retart ++ ++ (defmacro abort-on-error (&body forms) ++ `(handler-bind ((error #'abort)) ++ ,@forms)) => ABORT-ON-ERROR ++ (abort-on-error (+ 3 5)) => 8 ++ (abort-on-error (error "You lose.")) ++ |> Returned to Lisp Top Level. ++ ++ ;;; Example of the CONTINUE restart ++ ++ (defun real-sqrt (n) ++ (when (minusp n) ++ (setq n (- n)) ++ (cerror "Return sqrt(~D) instead." "Tried to take sqrt(-~D)." n)) ++ (sqrt n)) ++ ++ (real-sqrt 4) => 2 ++ (real-sqrt -9) ++ |> Error: Tried to take sqrt(-9). ++ |> To continue, type :CONTINUE followed by an option number: ++ |> 1: Return sqrt(9) instead. ++ |> 2: Return to Lisp Toplevel. ++ |> Debug> |>>(continue)<<| ++ |> Return sqrt(9) instead. ++ => 3 ++ ++ (handler-bind ((error #'(lambda (c) (continue)))) ++ (real-sqrt -9)) => 3 ++ ++ ;;; Example of the MUFFLE-WARNING restart ++ ++ (defun count-down (x) ++ (do ((counter x (1- counter))) ++ ((= counter 0) 'done) ++ (when (= counter 1) ++ (warn "Almost done")) ++ (format t "~&~D~ ++ => COUNT-DOWN ++ (count-down 3) ++ |> 3 ++ |> 2 ++ |> Warning: Almost done ++ |> 1 ++ => DONE ++ (defun ignore-warnings-while-counting (x) ++ (handler-bind ((warning #'ignore-warning)) ++ (count-down x))) ++ => IGNORE-WARNINGS-WHILE-COUNTING ++ (defun ignore-warning (condition) ++ (declare (ignore condition)) ++ (muffle-warning)) ++ => IGNORE-WARNING ++ (ignore-warnings-while-counting 3) ++ |> 3 ++ |> 2 ++ |> 1 ++ => DONE ++ ++ ;;; Example of the STORE-VALUE and USE-VALUE restarts ++ ++ (defun careful-symbol-value (symbol) ++ (check-type symbol symbol) ++ (restart-case (if (boundp symbol) ++ (return-from careful-symbol-value ++ (symbol-value symbol)) ++ (error 'unbound-variable ++ :name symbol)) ++ (use-value (value) ++ :report "Specify a value to use this time." ++ value) ++ (store-value (value) ++ :report "Specify a value to store and use in the future." ++ (setf (symbol-value symbol) value)))) ++ (setq a 1234) => 1234 ++ (careful-symbol-value 'a) => 1234 ++ (makunbound 'a) => A ++ (careful-symbol-value 'a) ++ |> Error: A is not bound. ++ |> To continue, type :CONTINUE followed by an option number. ++ |> 1: Specify a value to use this time. ++ |> 2: Specify a value to store and use in the future. ++ |> 3: Return to Lisp Toplevel. ++ |> Debug> |>>(use-value 12)<<| ++ => 12 ++ (careful-symbol-value 'a) ++ |> Error: A is not bound. ++ |> To continue, type :CONTINUE followed by an option number. ++ |> 1: Specify a value to use this time. ++ |> 2: Specify a value to store and use in the future. ++ |> 3: Return to Lisp Toplevel. ++ |> Debug> |>>(store-value 24)<<| ++ => 24 ++ (careful-symbol-value 'a) ++ => 24 ++ ++ ;;; Example of the USE-VALUE restart ++ ++ (defun add-symbols-with-default (default &rest symbols) ++ (handler-bind ((sys:unbound-symbol ++ #'(lambda (c) ++ (declare (ignore c)) ++ (use-value default)))) ++ (apply #'+ (mapcar #'careful-symbol-value symbols)))) ++ => ADD-SYMBOLS-WITH-DEFAULT ++ (setq x 1 y 2) => 2 ++ (add-symbols-with-default 3 'x 'y 'z) => 6 ++ ++ ++Side Effects:: ++.............. ++ ++A transfer of control may occur if an appropriate restart is available, ++or (in the case of the function abort or the function muffle-warning) ++execution may be stopped. ++ ++Affected By:: ++............. ++ ++Each of these functions can be affected by the presence of a restart ++having the same name. ++ ++Exceptional Situations:: ++........................ ++ ++If an appropriate abort restart is not available for the function abort, ++or an appropriate muffle-warning restart is not available for the ++function muffle-warning, an error of type control-error is signaled. ++ ++See Also:: ++.......... ++ ++*note invoke-restart:: , *note Restarts::, *note Interfaces to ++Restarts::, *note assert:: , ccase, *note cerror:: , *note check-type:: ++, ctypecase, *note use-value:: , *note warn:: ++ ++Notes:: ++....... ++ ++ (abort condition) == (invoke-restart 'abort) ++ (muffle-warning) == (invoke-restart 'muffle-warning) ++ (continue) == (let ((r (find-restart 'continue))) (if r (invoke-restart r))) ++ (use-value x) == (let ((r (find-restart 'use-value))) (if r (invoke-restart r x))) ++ (store-value x) == (let ((r (find-restart 'store-value))) (if r (invoke-restart r x))) ++ ++ No functions defined in this specification are required to provide a ++use-value restart. ++ ++ ++File: gcl.info, Node: Symbols, Next: Packages, Prev: Conditions, Up: Top ++ ++10 Symbols ++********** ++ ++* Menu: ++ ++* Symbol Concepts:: ++* Symbols Dictionary:: ++ ++ ++File: gcl.info, Node: Symbol Concepts, Next: Symbols Dictionary, Prev: Symbols, Up: Symbols ++ ++10.1 Symbol Concepts ++==================== ++ ++Figure 10-1 lists some defined names that are applicable to the property ++lists of symbols. ++ ++ get remprop symbol-plist ++ ++ Figure 10-1: Property list defined names ++ ++ ++ Figure 10-2 lists some defined names that are applicable to the ++creation of and inquiry about symbols. ++ ++ copy-symbol keywordp symbol-package ++ gensym make-symbol symbol-value ++ gentemp symbol-name ++ ++ Figure 10-2: Symbol creation and inquiry defined names ++ ++ ++ ++File: gcl.info, Node: Symbols Dictionary, Prev: Symbol Concepts, Up: Symbols ++ ++10.2 Symbols Dictionary ++======================= ++ ++* Menu: ++ ++* symbol:: ++* keyword:: ++* symbolp:: ++* keywordp:: ++* make-symbol:: ++* copy-symbol:: ++* gensym:: ++* *gensym-counter*:: ++* gentemp:: ++* symbol-function:: ++* symbol-name:: ++* symbol-package:: ++* symbol-plist:: ++* symbol-value:: ++* get:: ++* remprop:: ++* boundp:: ++* makunbound:: ++* set:: ++* unbound-variable:: ++ ++ ++File: gcl.info, Node: symbol, Next: keyword, Prev: Symbols Dictionary, Up: Symbols Dictionary ++ ++10.2.1 symbol [System Class] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++symbol, t ++ ++Description:: ++............. ++ ++Symbols are used for their object identity to name various entities in ++Common Lisp, including (but not limited to) linguistic entities such as ++variables and functions. ++ ++ Symbols can be collected together into packages. A symbol is said to ++be interned in a package if it is accessible in that package; the same ++symbol can be interned in more than one package. If a symbol is not ++interned in any package, it is called uninterned. ++ ++ An interned symbol is uniquely identifiable by its name from any ++package in which it is accessible. ++ ++ Symbols have the following attributes. For historically reasons, ++these are sometimes referred to as cells, although the actual internal ++representation of symbols and their attributes is ++implementation-dependent. ++ ++Name ++ The name of a symbol is a string used to identify the symbol. ++ Every symbol has a name, ++ ++ and the consequences are undefined if that name is altered. ++ ++ The name is used as part of the external, printed representation of ++ the symbol; see *note Character Syntax::. The function symbol-name ++ returns the name of a given symbol. ++ ++ A symbol may have any character in its name. ++ ++Package ++ The object in this cell is called the home package of the symbol. ++ If the home package is nil, the symbol is sometimes said to have no ++ home package. ++ ++ When a symbol is first created, it has no home package. When it is ++ first interned, the package in which it is initially interned ++ becomes its home package. The home package of a symbol can be ++ accessed by using the function symbol-package. ++ ++ If a symbol is uninterned from the package which is its home ++ package, its home package is set to nil. Depending on whether ++ there is another package in which the symbol is interned, the ++ symbol might or might not really be an uninterned symbol. A symbol ++ with no home package is therefore called apparently uninterned. ++ ++ The consequences are undefined if an attempt is made to alter the ++ home package of a symbol external in the COMMON-LISP package or the ++ KEYWORD package. ++ ++Property list ++ The property list of a symbol provides a mechanism for associating ++ named attributes with that symbol. The operations for adding and ++ removing entries are destructive to the property list. Common Lisp ++ provides operators both for direct manipulation of property list ++ objects (e.g., see getf, remf, and symbol-plist) and for implicit ++ manipulation of a symbol's property list by reference to the symbol ++ (e.g., see get and remprop). The property list associated with a ++ fresh symbol is initially null. ++ ++Value ++ If a symbol has a value attribute, it is said to be bound, and that ++ fact can be detected by the function boundp. The object contained ++ in the value cell of a bound symbol is the value of the global ++ variable named by that symbol, and can be accessed by the function ++ symbol-value. A symbol can be made to be unbound by the function ++ makunbound. ++ ++ The consequences are undefined if an attempt is made to change the ++ value of a symbol that names a constant variable, or to make such a ++ symbol be unbound. ++ ++Function ++ If a symbol has a function attribute, it is said to be fbound, and ++ that fact can be detected by the function fboundp. If the symbol ++ is the name of a function in the global environment, the function ++ cell contains the function, and can be accessed by the function ++ symbol-function. If the symbol is the name of either a macro in ++ the global environment (see macro-function) or a special operator ++ (see special-operator-p), the symbol is fbound, and can be accessed ++ by the function symbol-function, but the object which the function ++ cell contains is of implementation-dependent type and purpose. A ++ symbol can be made to be funbound by the function fmakunbound. ++ ++ The consequences are undefined if an attempt is made to change the ++ functional value of a symbol that names a special form. ++ ++ Operations on a symbol's value cell and function cell are sometimes ++described in terms of their effect on the symbol itself, but the user ++should keep in mind that there is an intimate relationship between the ++contents of those cells and the global variable or global function ++definition, respectively. ++ ++ Symbols are used as identifiers for lexical variables and lexical ++function definitions, but in that role, only their object identity is ++significant. Common Lisp provides no operation on a symbol that can ++have any effect on a lexical variable or on a lexical function ++definition. ++ ++See Also:: ++.......... ++ ++*note Symbols as Tokens::, *note Potential Numbers as Tokens::, *note ++Printing Symbols:: ++ ++ ++File: gcl.info, Node: keyword, Next: symbolp, Prev: symbol, Up: Symbols Dictionary ++ ++10.2.2 keyword [Type] ++--------------------- ++ ++Supertypes:: ++............ ++ ++keyword, symbol, t ++ ++Description:: ++............. ++ ++The type keyword includes all symbols interned the KEYWORD package. ++ ++ Interning a symbol in the KEYWORD package has three automatic ++effects: ++ ++1. ++ It causes the symbol to become bound to itself. ++2. ++ It causes the symbol to become an external symbol of the KEYWORD ++ package. ++3. ++ It causes the symbol to become a constant variable. ++ ++See Also:: ++.......... ++ ++*note keywordp:: ++ ++ ++File: gcl.info, Node: symbolp, Next: keywordp, Prev: keyword, Up: Symbols Dictionary ++ ++10.2.3 symbolp [Function] ++------------------------- ++ ++'symbolp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type symbol; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (symbolp 'elephant) => true ++ (symbolp 12) => false ++ (symbolp nil) => true ++ (symbolp '()) => true ++ (symbolp :test) => true ++ (symbolp "hello") => false ++ ++See Also:: ++.......... ++ ++*note keywordp:: , symbol, *note typep:: ++ ++Notes:: ++....... ++ ++ (symbolp object) == (typep object 'symbol) ++ ++ ++File: gcl.info, Node: keywordp, Next: make-symbol, Prev: symbolp, Up: Symbols Dictionary ++ ++10.2.4 keywordp [Function] ++-------------------------- ++ ++'keywordp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is a keyword_1; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (keywordp 'elephant) => false ++ (keywordp 12) => false ++ (keywordp :test) => true ++ (keywordp ':test) => true ++ (keywordp nil) => false ++ (keywordp :nil) => true ++ (keywordp '(:test)) => false ++ (keywordp "hello") => false ++ (keywordp ":hello") => false ++ (keywordp '&optional) => false ++ ++See Also:: ++.......... ++ ++*note constantp:: , *note keyword:: , *note symbolp:: , *note ++symbol-package:: ++ ++ ++File: gcl.info, Node: make-symbol, Next: copy-symbol, Prev: keywordp, Up: Symbols Dictionary ++ ++10.2.5 make-symbol [Function] ++----------------------------- ++ ++'make-symbol' name => new-symbol ++ ++Arguments and Values:: ++...................... ++ ++name--a string. ++ ++ new-symbol--a fresh, uninterned symbol. ++ ++Description:: ++............. ++ ++make-symbol creates and returns a fresh, uninterned symbol whose name is ++the given name. The new-symbol is neither bound nor fbound and has a ++null property list. ++ ++ It is implementation-dependent whether the string that becomes the ++new-symbol's name is the given name or a copy of it. Once a string has ++been given as the name argument to make-symbol, the consequences are ++undefined if a subsequent attempt is made to alter that string. ++ ++Examples:: ++.......... ++ ++ (setq temp-string "temp") => "temp" ++ (setq temp-symbol (make-symbol temp-string)) => #:|temp| ++ (symbol-name temp-symbol) => "temp" ++ (eq (symbol-name temp-symbol) temp-string) => implementation-dependent ++ (find-symbol "temp") => NIL, NIL ++ (eq (make-symbol temp-string) (make-symbol temp-string)) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if name is not a string. ++ ++See Also:: ++.......... ++ ++*note copy-symbol:: ++ ++Notes:: ++....... ++ ++No attempt is made by make-symbol to convert the case of the name to ++uppercase. The only case conversion which ever occurs for symbols is ++done by the Lisp reader. The program interface to symbol creation ++retains case, and the program interface to interning symbols is ++case-sensitive. ++ ++ ++File: gcl.info, Node: copy-symbol, Next: gensym, Prev: make-symbol, Up: Symbols Dictionary ++ ++10.2.6 copy-symbol [Function] ++----------------------------- ++ ++'copy-symbol' symbol &optional copy-properties => new-symbol ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ copy-properties--a generalized boolean. The default is false. ++ ++ new-symbol--a fresh, uninterned symbol. ++ ++Description:: ++............. ++ ++copy-symbol returns a fresh, uninterned symbol, the name of which is ++string= to and possibly the same as the name of the given symbol. ++ ++ If copy-properties is false, the new-symbol is neither bound nor ++fbound and has a null property list. If copy-properties is true, then ++the initial value of new-symbol is the value of symbol, the initial ++function definition of new-symbol is the functional value of symbol, and ++the property list of new-symbol is ++ ++ a copy_2 of the property list of symbol. ++ ++Examples:: ++.......... ++ ++ (setq fred 'fred-smith) => FRED-SMITH ++ (setf (symbol-value fred) 3) => 3 ++ (setq fred-clone-1a (copy-symbol fred nil)) => #:FRED-SMITH ++ (setq fred-clone-1b (copy-symbol fred nil)) => #:FRED-SMITH ++ (setq fred-clone-2a (copy-symbol fred t)) => #:FRED-SMITH ++ (setq fred-clone-2b (copy-symbol fred t)) => #:FRED-SMITH ++ (eq fred fred-clone-1a) => false ++ (eq fred-clone-1a fred-clone-1b) => false ++ (eq fred-clone-2a fred-clone-2b) => false ++ (eq fred-clone-1a fred-clone-2a) => false ++ (symbol-value fred) => 3 ++ (boundp fred-clone-1a) => false ++ (symbol-value fred-clone-2a) => 3 ++ (setf (symbol-value fred-clone-2a) 4) => 4 ++ (symbol-value fred) => 3 ++ (symbol-value fred-clone-2a) => 4 ++ (symbol-value fred-clone-2b) => 3 ++ (boundp fred-clone-1a) => false ++ (setf (symbol-function fred) #'(lambda (x) x)) => # ++ (fboundp fred) => true ++ (fboundp fred-clone-1a) => false ++ (fboundp fred-clone-2a) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note make-symbol:: ++ ++Notes:: ++....... ++ ++Implementors are encouraged not to copy the string which is the symbol's ++name unnecessarily. Unless there is a good reason to do so, the normal ++implementation strategy is for the new-symbol's name to be identical to ++the given symbol's name. ++ ++ ++File: gcl.info, Node: gensym, Next: *gensym-counter*, Prev: copy-symbol, Up: Symbols Dictionary ++ ++10.2.7 gensym [Function] ++------------------------ ++ ++'gensym' &optional x => new-symbol ++ ++Arguments and Values:: ++...................... ++ ++x--a string or a non-negative integer. Complicated defaulting behavior; ++see below. ++ ++ new-symbol--a fresh, uninterned symbol. ++ ++Description:: ++............. ++ ++Creates and returns a fresh, uninterned symbol, as if by calling ++make-symbol. (The only difference between gensym and make-symbol is in ++how the new-symbol's name is determined.) ++ ++ The name of the new-symbol is the concatenation of a prefix, which ++defaults to "G", and ++ ++ a suffix, which is the decimal representation of a number that ++defaults to the value of *gensym-counter*. ++ ++ If x is supplied, and is a string, then that string is used as a ++prefix instead of "G" for this call to gensym only. ++ ++ If x is supplied, and is an integer, then that integer, instead of ++the value of *gensym-counter*, is used as the suffix for this call to ++gensym only. ++ ++ If and only if no explicit suffix is supplied, *gensym-counter* is ++incremented after it is used. ++ ++Examples:: ++.......... ++ ++ (setq sym1 (gensym)) => #:G3142 ++ (symbol-package sym1) => NIL ++ (setq sym2 (gensym 100)) => #:G100 ++ (setq sym3 (gensym 100)) => #:G100 ++ (eq sym2 sym3) => false ++ (find-symbol "G100") => NIL, NIL ++ (gensym "T") => #:T3143 ++ (gensym) => #:G3144 ++ ++Side Effects:: ++.............. ++ ++Might increment *gensym-counter*. ++ ++Affected By:: ++............. ++ ++*gensym-counter* ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if x is not a string or a ++non-negative integer. ++ ++See Also:: ++.......... ++ ++*note gentemp:: , *gensym-counter* ++ ++Notes:: ++....... ++ ++The ability to pass a numeric argument to gensym has been deprecated; ++explicitly binding *gensym-counter* is now stylistically preferred. ++(The somewhat baroque conventions for the optional argument are ++historical in nature, and supported primarily for compatibility with ++older dialects of Lisp. In modern code, it is recommended that the only ++kind of argument used be a string prefix. In general, though, to obtain ++more flexible control of the new-symbol's name, consider using ++make-symbol instead.) ++ ++ ++File: gcl.info, Node: *gensym-counter*, Next: gentemp, Prev: gensym, Up: Symbols Dictionary ++ ++10.2.8 *gensym-counter* [Variable] ++---------------------------------- ++ ++Value Type:: ++............ ++ ++a non-negative integer. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++A number which will be used in constructing the name of the next symbol ++generated by the function gensym. ++ ++ *gensym-counter* can be either assigned or bound at any time, but its ++value must always be a non-negative integer. ++ ++Affected By:: ++............. ++ ++gensym. ++ ++See Also:: ++.......... ++ ++*note gensym:: ++ ++Notes:: ++....... ++ ++The ability to pass a numeric argument to gensym has been deprecated; ++explicitly binding *gensym-counter* is now stylistically preferred. ++ ++ ++File: gcl.info, Node: gentemp, Next: symbol-function, Prev: *gensym-counter*, Up: Symbols Dictionary ++ ++10.2.9 gentemp [Function] ++------------------------- ++ ++'gentemp' &optional prefix package => new-symbol ++ ++Arguments and Values:: ++...................... ++ ++prefix--a string. The default is "T". ++ ++ package--a package designator. The default is the current package. ++ ++ new-symbol--a fresh, interned symbol. ++ ++Description:: ++............. ++ ++gentemp creates and returns a fresh symbol, interned in the indicated ++package. The symbol is guaranteed to be one that was not previously ++accessible in package. It is neither bound nor fbound, and has a null ++property list. ++ ++ The name of the new-symbol is the concatenation of the prefix and a ++suffix, which is taken from an internal counter used only by gentemp. ++(If a symbol by that name is already accessible in package, the counter ++is incremented as many times as is necessary to produce a name that is ++not already the name of a symbol accessible in package.) ++ ++Examples:: ++.......... ++ ++ (gentemp) => T1298 ++ (gentemp "FOO") => FOO1299 ++ (find-symbol "FOO1300") => NIL, NIL ++ (gentemp "FOO") => FOO1300 ++ (find-symbol "FOO1300") => FOO1300, :INTERNAL ++ (intern "FOO1301") => FOO1301, :INTERNAL ++ (gentemp "FOO") => FOO1302 ++ (gentemp) => T1303 ++ ++Side Effects:: ++.............. ++ ++Its internal counter is incremented one or more times. ++ ++ Interns the new-symbol in package. ++ ++Affected By:: ++............. ++ ++The current state of its internal counter, and the current state of the ++package. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if prefix is not a string. ++Should signal an error of type type-error if package is not a package ++designator. ++ ++See Also:: ++.......... ++ ++*note gensym:: ++ ++Notes:: ++....... ++ ++The function gentemp is deprecated. ++ ++ If package is the KEYWORD package, the result is an external symbol ++of package. Otherwise, the result is an internal symbol of package. ++ ++ The gentemp internal counter is independent of *gensym-counter*, the ++counter used by gensym. There is no provision for accessing the gentemp ++internal counter. ++ ++ Just because gentemp creates a symbol which did not previously exist ++does not mean that such a symbol might not be seen in the future (e.g., ++in a data file--perhaps even created by the same program in another ++session). As such, this symbol is not truly unique in the same sense as ++a gensym would be. In particular, programs which do automatic code ++generation should be careful not to attach global attributes to such ++generated symbols (e.g., special declarations) and then write them into ++a file because such global attributes might, in a different session, end ++up applying to other symbols that were automatically generated on ++another day for some other purpose. ++ ++ ++File: gcl.info, Node: symbol-function, Next: symbol-name, Prev: gentemp, Up: Symbols Dictionary ++ ++10.2.10 symbol-function [Accessor] ++---------------------------------- ++ ++'symbol-function' symbol => contents ++ ++ (setf (' symbol-function' symbol) new-contents) ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ contents-- ++ ++ If the symbol is globally defined as a macro or a special operator, ++an object of implementation-dependent nature and identity is returned. ++If the symbol is not globally defined as either a macro or a special ++operator, and if the symbol is fbound, a function object is returned. ++ ++ new-contents--a function. ++ ++Description:: ++............. ++ ++Accesses the symbol's function cell. ++ ++Examples:: ++.......... ++ ++ (symbol-function 'car) => # ++ (symbol-function 'twice) is an error ;because TWICE isn't defined. ++ (defun twice (n) (* n 2)) => TWICE ++ (symbol-function 'twice) => # ++ (list (twice 3) ++ (funcall (function twice) 3) ++ (funcall (symbol-function 'twice) 3)) ++ => (6 6 6) ++ (flet ((twice (x) (list x x))) ++ (list (twice 3) ++ (funcall (function twice) 3) ++ (funcall (symbol-function 'twice) 3))) ++ => ((3 3) (3 3) 6) ++ (setf (symbol-function 'twice) #'(lambda (x) (list x x))) ++ => # ++ (list (twice 3) ++ (funcall (function twice) 3) ++ (funcall (symbol-function 'twice) 3)) ++ => ((3 3) (3 3) (3 3)) ++ (fboundp 'defun) => true ++ (symbol-function 'defun) ++ => implementation-dependent ++ (functionp (symbol-function 'defun)) ++ => implementation-dependent ++ (defun symbol-function-or-nil (symbol) ++ (if (and (fboundp symbol) ++ (not (macro-function symbol)) ++ (not (special-operator-p symbol))) ++ (symbol-function symbol) ++ nil)) => SYMBOL-FUNCTION-OR-NIL ++ (symbol-function-or-nil 'car) => # ++ (symbol-function-or-nil 'defun) => NIL ++ ++Affected By:: ++............. ++ ++defun ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++ Should signal undefined-function if symbol is not fbound and an ++attempt is made to read its definition. (No such error is signaled on ++an attempt to write its definition.) ++ ++See Also:: ++.......... ++ ++*note fboundp:: , *note fmakunbound:: , *note macro-function:: , ++ ++ *note special-operator-p:: ++ ++Notes:: ++....... ++ ++symbol-function cannot access the value of a lexical function name ++produced by flet or labels; it can access only the global function ++value. ++ ++ setf may be used with symbol-function to replace a global function ++definition when the symbol's function definition does not represent a ++special operator. ++ ++ (symbol-function symbol) == (fdefinition symbol) ++ ++ However, fdefinition accepts arguments other than just symbols. ++ ++ ++File: gcl.info, Node: symbol-name, Next: symbol-package, Prev: symbol-function, Up: Symbols Dictionary ++ ++10.2.11 symbol-name [Function] ++------------------------------ ++ ++'symbol-name' symbol => name ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ name--a string. ++ ++Description:: ++............. ++ ++symbol-name returns the name of symbol. ++ ++ The consequences are undefined if name is ever modified. ++ ++Examples:: ++.......... ++ ++ (symbol-name 'temp) => "TEMP" ++ (symbol-name :start) => "START" ++ (symbol-name (gensym)) => "G1234" ;for example ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++ ++File: gcl.info, Node: symbol-package, Next: symbol-plist, Prev: symbol-name, Up: Symbols Dictionary ++ ++10.2.12 symbol-package [Function] ++--------------------------------- ++ ++'symbol-package' symbol => contents ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ contents--a package object or nil. ++ ++Description:: ++............. ++ ++Returns the home package of symbol. ++ ++Examples:: ++.......... ++ ++ (in-package "CL-USER") => # ++ (symbol-package 'car) => # ++ (symbol-package 'bus) => # ++ (symbol-package :optional) => # ++ ;; Gensyms are uninterned, so have no home package. ++ (symbol-package (gensym)) => NIL ++ (make-package 'pk1) => # ++ (intern "SAMPLE1" "PK1") => PK1::SAMPLE1, NIL ++ (export (find-symbol "SAMPLE1" "PK1") "PK1") => T ++ (make-package 'pk2 :use '(pk1)) => # ++ (find-symbol "SAMPLE1" "PK2") => PK1:SAMPLE1, :INHERITED ++ (symbol-package 'pk1::sample1) => # ++ (symbol-package 'pk2::sample1) => # ++ (symbol-package 'pk1::sample2) => # ++ (symbol-package 'pk2::sample2) => # ++ ;; The next several forms create a scenario in which a symbol ++ ;; is not really uninterned, but is "apparently uninterned", ++ ;; and so SYMBOL-PACKAGE still returns NIL. ++ (setq s3 'pk1::sample3) => PK1::SAMPLE3 ++ (import s3 'pk2) => T ++ (unintern s3 'pk1) => T ++ (symbol-package s3) => NIL ++ (eq s3 'pk2::sample3) => T ++ ++Affected By:: ++............. ++ ++import, intern, unintern ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note intern:: ++ ++ ++File: gcl.info, Node: symbol-plist, Next: symbol-value, Prev: symbol-package, Up: Symbols Dictionary ++ ++10.2.13 symbol-plist [Accessor] ++------------------------------- ++ ++'symbol-plist' symbol => plist ++ ++ (setf (' symbol-plist' symbol) new-plist) ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ plist, new-plist--a property list. ++ ++Description:: ++............. ++ ++Accesses the property list of symbol. ++ ++Examples:: ++.......... ++ ++ (setq sym (gensym)) => #:G9723 ++ (symbol-plist sym) => () ++ (setf (get sym 'prop1) 'val1) => VAL1 ++ (symbol-plist sym) => (PROP1 VAL1) ++ (setf (get sym 'prop2) 'val2) => VAL2 ++ (symbol-plist sym) => (PROP2 VAL2 PROP1 VAL1) ++ (setf (symbol-plist sym) (list 'prop3 'val3)) => (PROP3 VAL3) ++ (symbol-plist sym) => (PROP3 VAL3) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note get:: , *note remprop:: ++ ++Notes:: ++....... ++ ++The use of setf should be avoided, since a symbol's property list is a ++global resource that can contain information established and depended ++upon by unrelated programs in the same Lisp image. ++ ++ ++File: gcl.info, Node: symbol-value, Next: get, Prev: symbol-plist, Up: Symbols Dictionary ++ ++10.2.14 symbol-value [Accessor] ++------------------------------- ++ ++'symbol-value' symbol => value ++ ++ (setf (' symbol-value' symbol) new-value) ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol that must have a value. ++ ++ value, new-value--an object. ++ ++Description:: ++............. ++ ++Accesses the symbol's value cell. ++ ++Examples:: ++.......... ++ ++ (setf (symbol-value 'a) 1) => 1 ++ (symbol-value 'a) => 1 ++ ;; SYMBOL-VALUE cannot see lexical variables. ++ (let ((a 2)) (symbol-value 'a)) => 1 ++ (let ((a 2)) (setq a 3) (symbol-value 'a)) => 1 ++ ;; SYMBOL-VALUE can see dynamic variables. ++ (let ((a 2)) ++ (declare (special a)) ++ (symbol-value 'a)) => 2 ++ (let ((a 2)) ++ (declare (special a)) ++ (setq a 3) ++ (symbol-value 'a)) => 3 ++ (let ((a 2)) ++ (setf (symbol-value 'a) 3) ++ a) => 2 ++ a => 3 ++ (symbol-value 'a) => 3 ++ (let ((a 4)) ++ (declare (special a)) ++ (let ((b (symbol-value 'a))) ++ (setf (symbol-value 'a) 5) ++ (values a b))) => 5, 4 ++ a => 3 ++ (symbol-value :any-keyword) => :ANY-KEYWORD ++ (symbol-value 'nil) => NIL ++ (symbol-value '()) => NIL ++ ;; The precision of this next one is implementation-dependent. ++ (symbol-value 'pi) => 3.141592653589793d0 ++ ++Affected By:: ++............. ++ ++makunbound, set, setq ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++ Should signal unbound-variable if symbol is unbound and an attempt is ++made to read its value. (No such error is signaled on an attempt to ++write its value.) ++ ++See Also:: ++.......... ++ ++*note boundp:: , *note makunbound:: , *note set:: , *note setq:: ++ ++Notes:: ++....... ++ ++symbol-value can be used to get the value of a constant variable. ++symbol-value cannot access the value of a lexical variable. ++ ++ ++File: gcl.info, Node: get, Next: remprop, Prev: symbol-value, Up: Symbols Dictionary ++ ++10.2.15 get [Accessor] ++---------------------- ++ ++'get' symbol indicator &optional default => value ++ ++ (setf (' get' symbol indicator &optional default) new-value) ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ indicator--an object. ++ ++ default--an object. The default is nil. ++ ++ value--if the indicated property exists, the object that is its ++value; otherwise, the specified default. ++ ++ new-value--an object. ++ ++Description:: ++............. ++ ++get finds a property on the property list_2 of symbol whose property ++indicator is identical to indicator, and returns its corresponding ++property value. ++ ++ If there are multiple properties_1 with that property indicator, get ++uses the first such property. ++ ++ If there is no property with that property indicator, default is ++returned. ++ ++ setf of get may be used to associate a new object with an existing ++indicator already on the symbol's property list, or to create a new ++assocation if none exists. ++ ++ If there are multiple properties_1 with that property indicator, setf ++of get associates the new-value with the first such property. ++ ++ When a get form is used as a setf place, any default which is ++supplied is evaluated according to normal left-to-right evaluation ++rules, but its value is ignored. ++ ++Examples:: ++.......... ++ ++ (defun make-person (first-name last-name) ++ (let ((person (gensym "PERSON"))) ++ (setf (get person 'first-name) first-name) ++ (setf (get person 'last-name) last-name) ++ person)) => MAKE-PERSON ++ (defvar *john* (make-person "John" "Dow")) => *JOHN* ++ *john* => #:PERSON4603 ++ (defvar *sally* (make-person "Sally" "Jones")) => *SALLY* ++ (get *john* 'first-name) => "John" ++ (get *sally* 'last-name) => "Jones" ++ (defun marry (man woman married-name) ++ (setf (get man 'wife) woman) ++ (setf (get woman 'husband) man) ++ (setf (get man 'last-name) married-name) ++ (setf (get woman 'last-name) married-name) ++ married-name) => MARRY ++ (marry *john* *sally* "Dow-Jones") => "Dow-Jones" ++ (get *john* 'last-name) => "Dow-Jones" ++ (get (get *john* 'wife) 'first-name) => "Sally" ++ (symbol-plist *john*) ++ => (WIFE #:PERSON4604 LAST-NAME "Dow-Jones" FIRST-NAME "John") ++ (defmacro age (person &optional (default ''thirty-something)) ++ `(get ,person 'age ,default)) => AGE ++ (age *john*) => THIRTY-SOMETHING ++ (age *john* 20) => 20 ++ (setf (age *john*) 25) => 25 ++ (age *john*) => 25 ++ (age *john* 20) => 25 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note getf:: , *note symbol-plist:: , *note remprop:: ++ ++Notes:: ++....... ++ ++ (get x y) == (getf (symbol-plist x) y) ++ ++ Numbers and characters are not recommended for use as indicators in ++portable code since get tests with eq rather than eql, and consequently ++the effect of using such indicators is implementation-dependent. ++ ++ There is no way using get to distinguish an absent property from one ++whose value is default. However, see get-properties. ++ ++ ++File: gcl.info, Node: remprop, Next: boundp, Prev: get, Up: Symbols Dictionary ++ ++10.2.16 remprop [Function] ++-------------------------- ++ ++'remprop' symbol indicator => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ indicator--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++remprop removes from the property list_2 of symbol a property_1 with a ++property indicator identical to indicator. ++ ++ If there are multiple properties_1 with the identical key, remprop ++only removes the first such property. ++ ++ remprop returns false if no such property was found, or true if a ++property was found. ++ ++ The property indicator and the corresponding property value are ++removed in an undefined order by destructively splicing the property ++list. ++ ++ The permissible side-effects correspond to those permitted for remf, ++such that: ++ ++ (remprop x y) == (remf (symbol-plist x) y) ++ ++Examples:: ++.......... ++ ++ (setq test (make-symbol "PSEUDO-PI")) => #:PSEUDO-PI ++ (symbol-plist test) => () ++ (setf (get test 'constant) t) => T ++ (setf (get test 'approximation) 3.14) => 3.14 ++ (setf (get test 'error-range) 'noticeable) => NOTICEABLE ++ (symbol-plist test) ++ => (ERROR-RANGE NOTICEABLE APPROXIMATION 3.14 CONSTANT T) ++ (setf (get test 'approximation) nil) => NIL ++ (symbol-plist test) ++ => (ERROR-RANGE NOTICEABLE APPROXIMATION NIL CONSTANT T) ++ (get test 'approximation) => NIL ++ (remprop test 'approximation) => true ++ (get test 'approximation) => NIL ++ (symbol-plist test) ++ => (ERROR-RANGE NOTICEABLE CONSTANT T) ++ (remprop test 'approximation) => NIL ++ (symbol-plist test) ++ => (ERROR-RANGE NOTICEABLE CONSTANT T) ++ (remprop test 'error-range) => true ++ (setf (get test 'approximation) 3) => 3 ++ (symbol-plist test) ++ => (APPROXIMATION 3 CONSTANT T) ++ ++Side Effects:: ++.............. ++ ++The property list of symbol is modified. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note remf:: , *note symbol-plist:: ++ ++Notes:: ++....... ++ ++Numbers and characters are not recommended for use as indicators in ++portable code since remprop tests with eq rather than eql, and ++consequently the effect of using such indicators is ++implementation-dependent. Of course, if you've gotten as far as needing ++to remove such a property, you don't have much choice--the time to have ++been thinking about this was when you used setf of get to establish the ++property. ++ ++ ++File: gcl.info, Node: boundp, Next: makunbound, Prev: remprop, Up: Symbols Dictionary ++ ++10.2.17 boundp [Function] ++------------------------- ++ ++'boundp' symbol => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if symbol is bound; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (setq x 1) => 1 ++ (boundp 'x) => true ++ (makunbound 'x) => X ++ (boundp 'x) => false ++ (let ((x 2)) (boundp 'x)) => false ++ (let ((x 2)) (declare (special x)) (boundp 'x)) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note set:: , *note setq:: , *note symbol-value:: , *note makunbound:: ++ ++Notes:: ++....... ++ ++The function bound determines only whether a symbol has a value in the ++global environment; any lexical bindings are ignored. ++ ++ ++File: gcl.info, Node: makunbound, Next: set, Prev: boundp, Up: Symbols Dictionary ++ ++10.2.18 makunbound [Function] ++----------------------------- ++ ++'makunbound' symbol => symbol ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol ++ ++Description:: ++............. ++ ++Makes the symbol be unbound, regardless of whether it was previously ++bound. ++ ++Examples:: ++.......... ++ ++ (setf (symbol-value 'a) 1) ++ (boundp 'a) => true ++ a => 1 ++ (makunbound 'a) => A ++ (boundp 'a) => false ++ ++Side Effects:: ++.............. ++ ++The value cell of symbol is modified. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if symbol is not a symbol. ++ ++See Also:: ++.......... ++ ++*note boundp:: , *note fmakunbound:: ++ ++ ++File: gcl.info, Node: set, Next: unbound-variable, Prev: makunbound, Up: Symbols Dictionary ++ ++10.2.19 set [Function] ++---------------------- ++ ++'set' symbol value => value ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ value--an object. ++ ++Description:: ++............. ++ ++set changes the contents of the value cell of symbol to the given value. ++ ++ (set symbol value) == (setf (symbol-value symbol) value) ++ ++Examples:: ++.......... ++ ++ (setf (symbol-value 'n) 1) => 1 ++ (set 'n 2) => 2 ++ (symbol-value 'n) => 2 ++ (let ((n 3)) ++ (declare (special n)) ++ (setq n (+ n 1)) ++ (setf (symbol-value 'n) (* n 10)) ++ (set 'n (+ (symbol-value 'n) n)) ++ n) => 80 ++ n => 2 ++ (let ((n 3)) ++ (setq n (+ n 1)) ++ (setf (symbol-value 'n) (* n 10)) ++ (set 'n (+ (symbol-value 'n) n)) ++ n) => 4 ++ n => 44 ++ (defvar *n* 2) ++ (let ((*n* 3)) ++ (setq *n* (+ *n* 1)) ++ (setf (symbol-value '*n*) (* *n* 10)) ++ (set '*n* (+ (symbol-value '*n*) *n*)) ++ *n*) => 80 ++ *n* => 2 ++ (defvar *even-count* 0) => *EVEN-COUNT* ++ (defvar *odd-count* 0) => *ODD-COUNT* ++ (defun tally-list (list) ++ (dolist (element list) ++ (set (if (evenp element) '*even-count* '*odd-count*) ++ (+ element (if (evenp element) *even-count* *odd-count*))))) ++ (tally-list '(1 9 4 3 2 7)) => NIL ++ *even-count* => 6 ++ *odd-count* => 20 ++ ++Side Effects:: ++.............. ++ ++The value of symbol is changed. ++ ++See Also:: ++.......... ++ ++*note setq:: , *note progv:: , *note symbol-value:: ++ ++Notes:: ++....... ++ ++The function set is deprecated. ++ ++ set cannot change the value of a lexical variable. ++ ++ ++File: gcl.info, Node: unbound-variable, Prev: set, Up: Symbols Dictionary ++ ++10.2.20 unbound-variable [Condition Type] ++----------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++unbound-variable, cell-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type unbound-variable consists of error conditions that represent ++attempts to read the value of an unbound variable. ++ ++ The name of the cell (see cell-error) is the name of the variable ++that was unbound. ++ ++See Also:: ++.......... ++ ++*note cell-error-name:: ++ ++ ++File: gcl.info, Node: Packages, Next: Numbers (Numbers), Prev: Symbols, Up: Top ++ ++11 Packages ++*********** ++ ++* Menu: ++ ++* Package Concepts:: ++* Packages Dictionary:: ++ ++ ++File: gcl.info, Node: Package Concepts, Next: Packages Dictionary, Prev: Packages, Up: Packages ++ ++11.1 Package Concepts ++===================== ++ ++* Menu: ++ ++* Introduction to Packages:: ++* Standardized Packages:: ++ ++ ++File: gcl.info, Node: Introduction to Packages, Next: Standardized Packages, Prev: Package Concepts, Up: Package Concepts ++ ++11.1.1 Introduction to Packages ++------------------------------- ++ ++A package establishes a mapping from names to symbols. At any given ++time, one package is current. The current package is the one that is ++the value of *package*. When using the Lisp reader, it is possible to ++refer to symbols in packages other than the current one through the use ++of package prefixes in the printed representation of the symbol. ++ ++ Figure 11-1 lists some defined names that are applicable to packages. ++Where an operator takes an argument that is either a symbol or a list of ++symbols, an argument of nil is treated as an empty list of symbols. Any ++package argument may be either a string, a symbol, or a package. If a ++symbol is supplied, its name will be used as the package name. ++ ++ *modules* import provide ++ *package* in-package rename-package ++ defpackage intern require ++ do-all-symbols list-all-packages shadow ++ do-external-symbols make-package shadowing-import ++ do-symbols package-name unexport ++ export package-nicknames unintern ++ find-all-symbols package-shadowing-symbols unuse-package ++ find-package package-use-list use-package ++ find-symbol package-used-by-list ++ ++ Figure 11-1: Some Defined Names related to Packages ++ ++ ++* Menu: ++ ++* Package Names and Nicknames:: ++* Symbols in a Package:: ++* Internal and External Symbols:: ++* Package Inheritance:: ++* Accessibility of Symbols in a Package:: ++* Locating a Symbol in a Package:: ++* Prevention of Name Conflicts in Packages:: ++ ++ ++File: gcl.info, Node: Package Names and Nicknames, Next: Symbols in a Package, Prev: Introduction to Packages, Up: Introduction to Packages ++ ++11.1.1.1 Package Names and Nicknames ++.................................... ++ ++Each package has a name (a string) and perhaps some nicknames (also ++strings). These are assigned when the package is created and can be ++changed later. ++ ++ There is a single namespace for packages. The function find-package ++translates a package name or nickname into the associated package. The ++function package-name returns the name of a package. The function ++package-nicknames returns a list of all nicknames for a package. ++rename-package removes a package's current name and nicknames and ++replaces them with new ones specified by the caller. ++ ++ ++File: gcl.info, Node: Symbols in a Package, Next: Internal and External Symbols, Prev: Package Names and Nicknames, Up: Introduction to Packages ++ ++11.1.1.2 Symbols in a Package ++............................. ++ ++ ++File: gcl.info, Node: Internal and External Symbols, Next: Package Inheritance, Prev: Symbols in a Package, Up: Introduction to Packages ++ ++11.1.1.3 Internal and External Symbols ++...................................... ++ ++The mappings in a package are divided into two classes, external and ++internal. The symbols targeted by these different mappings are called ++external symbols and internal symbols of the package. Within a package, ++a name refers to one symbol or to none; if it does refer to a symbol, ++then it is either external or internal in that package, but not both. ++External symbols ++ ++ are part of the package's public interface to other packages. ++Symbols become external symbols of a given package if they have been ++exported from that package. ++ ++ A symbol has the same name no matter what package it is present in, ++but it might be an external symbol of some packages and an internal ++symbol of others. ++ ++ ++File: gcl.info, Node: Package Inheritance, Next: Accessibility of Symbols in a Package, Prev: Internal and External Symbols, Up: Introduction to Packages ++ ++11.1.1.4 Package Inheritance ++............................ ++ ++Packages can be built up in layers. From one point of view, a package ++is a single collection of mappings from strings into internal symbols ++and external symbols. However, some of these mappings might be ++established within the package itself, while other mappings are ++inherited from other packages via use-package. A symbol is said to be ++present in a package if the mapping is in the package itself and is not ++inherited from somewhere else. ++ ++ There is no way to inherit the internal symbols of another package; ++to refer to an internal symbol using the Lisp reader, a package ++containing the symbol must be made to be the current package, a package ++prefix must be used, or the symbol must be imported into the current ++package. ++ ++ ++File: gcl.info, Node: Accessibility of Symbols in a Package, Next: Locating a Symbol in a Package, Prev: Package Inheritance, Up: Introduction to Packages ++ ++11.1.1.5 Accessibility of Symbols in a Package ++.............................................. ++ ++A symbol becomes accessible in a package if that is its home package ++when it is created, or if it is imported into that package, or by ++inheritance via use-package. ++ ++ If a symbol is accessible in a package, it can be referred to when ++using the Lisp reader without a package prefix when that package is the ++current package, regardless of whether it is present or inherited. ++ ++ Symbols from one package can be made accessible in another package in ++two ways. ++ ++- ++ Any individual symbol can be added to a package by use of import. ++ After the call to import the symbol is present in the importing ++ package. The status of the symbol in the package it came from (if ++ any) is unchanged, and the home package for this symbol is ++ unchanged. Once imported, a symbol is present in the importing ++ package and can be removed only by calling unintern. ++ ++ A symbol is shadowed_3 by another symbol in some package if the ++ first symbol would be accessible by inheritance if not for the ++ presence of the second symbol. See shadowing-import. ++ ++- ++ The second mechanism for making symbols from one package accessible ++ in another is provided by use-package. All of the external symbols ++ of the used package are inherited by the using package. The ++ function unuse-package undoes the effects of a previous ++ use-package. ++ ++ ++File: gcl.info, Node: Locating a Symbol in a Package, Next: Prevention of Name Conflicts in Packages, Prev: Accessibility of Symbols in a Package, Up: Introduction to Packages ++ ++11.1.1.6 Locating a Symbol in a Package ++....................................... ++ ++When a symbol is to be located in a given package the following occurs: ++ ++- ++ The external symbols and internal symbols of the package are ++ searched for the symbol. ++- ++ The external symbols of the used packages are searched in some ++ unspecified order. The order does not matter; see the rules for ++ handling name conflicts listed below. ++ ++ ++File: gcl.info, Node: Prevention of Name Conflicts in Packages, Prev: Locating a Symbol in a Package, Up: Introduction to Packages ++ ++11.1.1.7 Prevention of Name Conflicts in Packages ++................................................. ++ ++Within one package, any particular name can refer to at most one symbol. ++A name conflict is said to occur when there would be more than one ++candidate symbol. Any time a name conflict is about to occur, a ++correctable error is signaled. ++ ++ The following rules apply to name conflicts: ++ ++- ++ Name conflicts are detected when they become possible, that is, ++ when the package structure is altered. Name conflicts are not ++ checked during every name lookup. ++ ++- ++ If the same symbol is accessible to a package through more than one ++ path, there is no name conflict. A symbol cannot conflict with ++ itself. Name conflicts occur only between distinct symbols with ++ the same name (under string=). ++ ++- ++ Every package has a list of shadowing symbols. A shadowing symbol ++ takes precedence over any other symbol of the same name that would ++ otherwise be accessible in the package. A name conflict involving ++ a shadowing symbol is always resolved in favor of the shadowing ++ symbol, without signaling an error (except for one exception ++ involving import). See shadow and shadowing-import. ++ ++- ++ The functions use-package, import, and export check for name ++ conflicts. ++ ++- ++ shadow and shadowing-import never signal a name-conflict error. ++ ++- ++ unuse-package and unexport do not need to do any name-conflict ++ checking. unintern does name-conflict checking only when a symbol ++ being uninterned is a shadowing symbol . ++ ++- ++ Giving a shadowing symbol to unintern can uncover a name conflict ++ that had previously been resolved by the shadowing. ++ ++- ++ Package functions signal name-conflict errors of type package-error ++ before making any change to the package structure. When multiple ++ changes are to be made, it is permissible for the implementation to ++ process each change separately. For example, when export is given ++ a list of symbols, aborting from a name conflict caused by the ++ second symbol in the list might still export the first symbol in ++ the list. However, a name-conflict error caused by export of a ++ single symbol will be signaled before that symbol's accessibility ++ in any package is changed. ++ ++- ++ Continuing from a name-conflict error must offer the user a chance ++ to resolve the name conflict in favor of either of the candidates. ++ The package structure should be altered to reflect the resolution ++ of the name conflict, via shadowing-import, unintern, or unexport. ++ ++- ++ A name conflict in use-package between a symbol present in the ++ using package and an external symbol of the used package is ++ resolved in favor of the first symbol by making it a shadowing ++ symbol, or in favor of the second symbol by uninterning the first ++ symbol from the using package. ++ ++- ++ A name conflict in export or unintern due to a package's inheriting ++ two distinct symbols with the same name (under string=) from two ++ other packages can be resolved in favor of either symbol by ++ importing it into the using package and making it a shadowing ++ symbol , just as with use-package. ++ ++ ++File: gcl.info, Node: Standardized Packages, Prev: Introduction to Packages, Up: Package Concepts ++ ++11.1.2 Standardized Packages ++---------------------------- ++ ++This section describes the packages that are available in every ++conforming implementation. A summary of the names and nicknames of ++those standardized packages is given in Figure 11-2. ++ ++ Name Nicknames ++ COMMON-LISP CL ++ COMMON-LISP-USER CL-USER ++ KEYWORD none ++ ++ Figure 11-2: Standardized Package Names ++ ++ ++* Menu: ++ ++* The COMMON-LISP Package:: ++* Constraints on the COMMON-LISP Package for Conforming Implementations:: ++* Constraints on the COMMON-LISP Package for Conforming Programs:: ++* Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs:: ++* The COMMON-LISP-USER Package:: ++* The KEYWORD Package:: ++* Interning a Symbol in the KEYWORD Package:: ++* Notes about The KEYWORD Package:: ++* Implementation-Defined Packages:: ++ ++ ++File: gcl.info, Node: The COMMON-LISP Package, Next: Constraints on the COMMON-LISP Package for Conforming Implementations, Prev: Standardized Packages, Up: Standardized Packages ++ ++11.1.2.1 The COMMON-LISP Package ++................................ ++ ++The COMMON-LISP package contains the primitives of the Common Lisp ++system as defined by this specification. Its external symbols include ++all of the defined names (except for defined names in the KEYWORD ++package) that are present in the Common Lisp system, such as car, cdr, ++*package*, etc. The COMMON-LISP package has the nickname CL. ++ ++ The COMMON-LISP package has as external symbols those symbols ++enumerated in the figures in *note Symbols in the COMMON-LISP Package::, ++and no others. These external symbols are present in the COMMON-LISP ++package but their home package need not be the COMMON-LISP package. ++ ++ For example, the symbol HELP cannot be an external symbol of the ++COMMON-LISP package because it is not mentioned in *note Symbols in the ++COMMON-LISP Package::. In contrast, the symbol variable must be an ++external symbol of the COMMON-LISP package even though it has no ++definition because it is listed in that section (to support its use as a ++valid second argument to the function documentation). ++ ++ The COMMON-LISP package can have additional internal symbols. ++ ++ ++File: gcl.info, Node: Constraints on the COMMON-LISP Package for Conforming Implementations, Next: Constraints on the COMMON-LISP Package for Conforming Programs, Prev: The COMMON-LISP Package, Up: Standardized Packages ++ ++11.1.2.2 Constraints on the COMMON-LISP Package for Conforming Implementations ++.............................................................................. ++ ++In a conforming implementation, an external symbol of the COMMON-LISP ++package can have a function, macro, or special operator definition, a ++global variable definition (or other status as a dynamic variable due to ++a special proclamation), or a type definition only if explicitly ++permitted in this standard. For example, fboundp yields false for any ++external symbol of the COMMON-LISP package that is not the name of a ++standardized function, macro or special operator, and boundp returns ++false for any external symbol of the COMMON-LISP package that is not the ++name of a standardized global variable. It also follows that conforming ++programs can use external symbols of the COMMON-LISP package as the ++names of local lexical variables with confidence that those names have ++not been proclaimed special by the implementation unless those symbols ++are names of standardized global variables. ++ ++ A conforming implementation must not place any property on an ++external symbol of the COMMON-LISP package using a property indicator ++that is either an external symbol of any standardized package or a ++symbol that is otherwise accessible in the COMMON-LISP-USER package. ++ ++ ++File: gcl.info, Node: Constraints on the COMMON-LISP Package for Conforming Programs, Next: Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs, Prev: Constraints on the COMMON-LISP Package for Conforming Implementations, Up: Standardized Packages ++ ++11.1.2.3 Constraints on the COMMON-LISP Package for Conforming Programs ++....................................................................... ++ ++Except where explicitly allowed, the consequences are undefined if any ++of the following actions are performed on an external symbol of the ++COMMON-LISP package: ++ ++1. ++ Binding or altering its value (lexically or dynamically). (Some ++ exceptions are noted below.) ++ ++2. ++ Defining, ++ ++ undefining, ++ ++ or binding it as a function. (Some exceptions are noted below.) ++ ++3. ++ Defining, ++ ++ undefining, ++ ++ or binding it as a macro ++ ++ or compiler macro. ++ ++ (Some exceptions are noted below.) ++ ++4. ++ Defining it as a type specifier (via defstruct, defclass, deftype, ++ define-condition). ++ ++5. ++ Defining it as a structure (via defstruct). ++ ++6. ++ Defining it as a declaration with a declaration proclamation. ++ ++7. ++ Defining it as a symbol macro. ++ ++8. ++ Altering its home package. ++ ++9. ++ Tracing it (via trace). ++ ++10. ++ Declaring or proclaiming it special (via declare, ++ ++ declaim, ++ ++ or proclaim). ++ ++11. ++ Declaring or proclaiming its type or ftype (via declare, ++ ++ declaim, ++ ++ or proclaim). (Some exceptions are noted below.) ++ ++12. ++ Removing it from the COMMON-LISP package. ++ ++13. ++ Defining a setf expander for it (via defsetf or ++ define-setf-method). ++ ++14. ++ Defining, undefining, or binding its setf function name. ++ ++15. ++ Defining it as a method combination type (via ++ define-method-combination). ++ ++16. ++ Using it as the class-name argument to setf of find-class. ++ ++17. ++ Binding it as a catch tag. ++ ++18. ++ Binding it as a restart name. ++ ++19. ++ Defining a method for a standardized generic function which is ++ applicable when all of the arguments are direct instances of ++ standardized classes. ++ ++ ++File: gcl.info, Node: Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs, Next: The COMMON-LISP-USER Package, Prev: Constraints on the COMMON-LISP Package for Conforming Programs, Up: Standardized Packages ++ ++11.1.2.4 Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs ++.......................................................................................... ++ ++If an external symbol of the COMMON-LISP package is not globally defined ++as a standardized dynamic variable or constant variable, it is allowed ++to lexically bind it and to declare the type of that binding, and it is ++allowed to locally establish it as a symbol macro (e.g., with ++symbol-macrolet). ++ ++ Unless explicitly specified otherwise, if an external symbol of the ++COMMON-LISP package is globally defined as a standardized dynamic ++variable, it is permitted to bind or assign that dynamic variable ++provided that the "Value Type" constraints on the dynamic variable are ++maintained, and that the new value of the variable is consistent with ++the stated purpose of the variable. ++ ++ If an external symbol of the COMMON-LISP package is not defined as a ++standardized function, macro, or special operator, it is allowed to ++lexically bind it as a function (e.g., with flet), to declare the ftype ++of that binding, and (in implementations which provide the ability to do ++so) to trace that binding. ++ ++ If an external symbol of the COMMON-LISP package is not defined as a ++standardized function, macro, or special operator, it is allowed to ++lexically bind it as a macro (e.g., with macrolet). ++ ++ If an external symbol of the COMMON-LISP package is not defined as a ++standardized function, macro, or special operator, it is allowed to ++lexically bind its setf function name as a function, and to declare the ++ftype of that binding. ++ ++ ++File: gcl.info, Node: The COMMON-LISP-USER Package, Next: The KEYWORD Package, Prev: Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs, Up: Standardized Packages ++ ++11.1.2.5 The COMMON-LISP-USER Package ++..................................... ++ ++The COMMON-LISP-USER package is the current package when a Common Lisp ++system starts up. This package uses the COMMON-LISP package. The ++COMMON-LISP-USER package has the nickname CL-USER. ++ ++ The COMMON-LISP-USER package can have additional symbols interned ++within it; it can use other implementation-defined packages. ++ ++ ++File: gcl.info, Node: The KEYWORD Package, Next: Interning a Symbol in the KEYWORD Package, Prev: The COMMON-LISP-USER Package, Up: Standardized Packages ++ ++11.1.2.6 The KEYWORD Package ++............................ ++ ++The KEYWORD package contains symbols, called keywords_1, that are ++typically used as special markers in programs and their associated data ++expressions_1. ++ ++ Symbol tokens that start with a package marker are parsed by the Lisp ++reader as symbols in the KEYWORD package; see *note Symbols as Tokens::. ++This makes it notationally convenient to use keywords when communicating ++between programs in different packages. For example, the mechanism for ++passing keyword parameters in a call uses keywords_1 to name the ++corresponding arguments; see *note Ordinary Lambda Lists::. ++ ++ Symbols in the KEYWORD package are, by definition, of type keyword. ++ ++ ++File: gcl.info, Node: Interning a Symbol in the KEYWORD Package, Next: Notes about The KEYWORD Package, Prev: The KEYWORD Package, Up: Standardized Packages ++ ++11.1.2.7 Interning a Symbol in the KEYWORD Package ++.................................................. ++ ++The KEYWORD package is treated differently than other packages in that ++special actions are taken when a symbol is interned in it. In ++particular, when a symbol is interned in the KEYWORD package, it is ++automatically made to be an external symbol and is automatically made to ++be a constant variable with itself as a value. ++ ++ ++File: gcl.info, Node: Notes about The KEYWORD Package, Next: Implementation-Defined Packages, Prev: Interning a Symbol in the KEYWORD Package, Up: Standardized Packages ++ ++11.1.2.8 Notes about The KEYWORD Package ++........................................ ++ ++It is generally best to confine the use of keywords to situations in ++which there are a finitely enumerable set of names to be selected ++between. For example, if there were two states of a light switch, they ++might be called :on and :off. ++ ++ In situations where the set of names is not finitely enumerable ++(i.e., where name conflicts might arise) it is frequently best to use ++symbols in some package other than KEYWORD so that conflicts will be ++naturally avoided. For example, it is generally not wise for a program ++to use a keyword_1 as a property indicator, since if there were ever ++another program that did the same thing, each would clobber the other's ++data. ++ ++ ++File: gcl.info, Node: Implementation-Defined Packages, Prev: Notes about The KEYWORD Package, Up: Standardized Packages ++ ++11.1.2.9 Implementation-Defined Packages ++........................................ ++ ++Other, implementation-defined packages might be present in the initial ++Common Lisp environment. ++ ++ It is recommended, but not required, that the documentation for a ++conforming implementation contain a full list of all package names ++initially present in that implementation but not specified in this ++specification. (See also the function list-all-packages.) ++ ++ ++File: gcl.info, Node: Packages Dictionary, Prev: Package Concepts, Up: Packages ++ ++11.2 Packages Dictionary ++======================== ++ ++* Menu: ++ ++* package:: ++* export:: ++* find-symbol:: ++* find-package:: ++* find-all-symbols:: ++* import:: ++* list-all-packages:: ++* rename-package:: ++* shadow:: ++* shadowing-import:: ++* delete-package:: ++* make-package:: ++* with-package-iterator:: ++* unexport:: ++* unintern:: ++* in-package:: ++* unuse-package:: ++* use-package:: ++* defpackage:: ++* do-symbols:: ++* intern:: ++* package-name:: ++* package-nicknames:: ++* package-shadowing-symbols:: ++* package-use-list:: ++* package-used-by-list:: ++* packagep:: ++* *package*:: ++* package-error:: ++* package-error-package:: ++ ++ ++File: gcl.info, Node: package, Next: export, Prev: Packages Dictionary, Up: Packages Dictionary ++ ++11.2.1 package [System Class] ++----------------------------- ++ ++Class Precedence List:: ++....................... ++ ++package, t ++ ++Description:: ++............. ++ ++A package is a namespace that maps symbol names to symbols; see *note ++Package Concepts::. ++ ++See Also:: ++.......... ++ ++*note Package Concepts::, *note Printing Other Objects::, *note Symbols ++as Tokens:: ++ ++ ++File: gcl.info, Node: export, Next: find-symbol, Prev: package, Up: Packages Dictionary ++ ++11.2.2 export [Function] ++------------------------ ++ ++'export' symbols &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++symbols--a designator for a list of symbols. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++Description:: ++............. ++ ++export makes one or more symbols that are accessible in package (whether ++directly or by inheritance) be external symbols of that package. ++ ++ If any of the symbols is already accessible as an external symbol of ++package, export has no effect on that symbol. If the symbol is present ++in package as an internal symbol, it is simply changed to external ++status. If it is accessible as an internal symbol via use-package, it ++is first imported into package, then exported. (The symbol is then ++present in the package whether or not package continues to use the ++package through which the symbol was originally inherited.) ++ ++ export makes each symbol accessible to all the packages that use ++package. All of these packages are checked for name conflicts: (export ++s p) does (find-symbol (symbol-name s) q) for each package q in ++(package-used-by-list p). Note that in the usual case of an export ++during the initial definition of a package, the result of ++package-used-by-list is nil and the name-conflict checking takes ++negligible time. When multiple changes are to be made, for example when ++export is given a list of symbols, it is permissible for the ++implementation to process each change separately, so that aborting from ++a name conflict caused by any but the first symbol in the list does not ++unexport the first symbol in the list. However, aborting from a ++name-conflict error caused by export of one of symbols does not leave ++that symbol accessible to some packages and inaccessible to others; with ++respect to each of symbols processed, export behaves as if it were as an ++atomic operation. ++ ++ A name conflict in export between one of symbols being exported and a ++symbol already present in a package that would inherit the ++newly-exported symbol may be resolved in favor of the exported symbol by ++uninterning the other one, or in favor of the already-present symbol by ++making it a shadowing symbol. ++ ++Examples:: ++.......... ++ ++ (make-package 'temp :use nil) => # ++ (use-package 'temp) => T ++ (intern "TEMP-SYM" 'temp) => TEMP::TEMP-SYM, NIL ++ (find-symbol "TEMP-SYM") => NIL, NIL ++ (export (find-symbol "TEMP-SYM" 'temp) 'temp) => T ++ (find-symbol "TEMP-SYM") => TEMP-SYM, :INHERITED ++ ++Side Effects:: ++.............. ++ ++The package system is modified. ++ ++Affected By:: ++............. ++ ++Accessible symbols. ++ ++Exceptional Situations:: ++........................ ++ ++If any of the symbols is not accessible at all in package, an error of ++type package-error is signaled that is correctable by permitting the ++user to interactively specify whether that symbol should be imported. ++ ++See Also:: ++.......... ++ ++*note import:: , *note unexport:: , *note Package Concepts:: ++ ++ ++File: gcl.info, Node: find-symbol, Next: find-package, Prev: export, Up: Packages Dictionary ++ ++11.2.3 find-symbol [Function] ++----------------------------- ++ ++'find-symbol' string &optional package => symbol, status ++ ++Arguments and Values:: ++...................... ++ ++string--a string. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++ symbol--a symbol accessible in the package, or nil. ++ ++ status--one of :inherited, :external, :internal, or nil. ++ ++Description:: ++............. ++ ++find-symbol locates a symbol whose name is string in a package. If a ++symbol named string is found in package, directly or by inheritance, the ++symbol found is returned as the first value; the second value is as ++follows: ++ ++:internal ++ If the symbol is present in package as an internal symbol. ++ ++:external ++ If the symbol is present in package as an external symbol. ++ ++:inherited ++ If the symbol is inherited by package through use-package, but is ++ not present in package. ++ ++ If no such symbol is accessible in package, both values are nil. ++ ++Examples:: ++.......... ++ ++ (find-symbol "NEVER-BEFORE-USED") => NIL, NIL ++ (find-symbol "NEVER-BEFORE-USED") => NIL, NIL ++ (intern "NEVER-BEFORE-USED") => NEVER-BEFORE-USED, NIL ++ (intern "NEVER-BEFORE-USED") => NEVER-BEFORE-USED, :INTERNAL ++ (find-symbol "NEVER-BEFORE-USED") => NEVER-BEFORE-USED, :INTERNAL ++ (find-symbol "never-before-used") => NIL, NIL ++ (find-symbol "CAR" 'common-lisp-user) => CAR, :INHERITED ++ (find-symbol "CAR" 'common-lisp) => CAR, :EXTERNAL ++ (find-symbol "NIL" 'common-lisp-user) => NIL, :INHERITED ++ (find-symbol "NIL" 'common-lisp) => NIL, :EXTERNAL ++ (find-symbol "NIL" (prog1 (make-package "JUST-TESTING" :use '()) ++ (intern "NIL" "JUST-TESTING"))) ++ => JUST-TESTING::NIL, :INTERNAL ++ (export 'just-testing::nil 'just-testing) ++ (find-symbol "NIL" 'just-testing) => JUST-TESTING:NIL, :EXTERNAL ++ (find-symbol "NIL" "KEYWORD") ++ => NIL, NIL ++ OR=> :NIL, :EXTERNAL ++ (find-symbol (symbol-name :nil) "KEYWORD") => :NIL, :EXTERNAL ++ ++Affected By:: ++............. ++ ++intern, import, export, use-package, unintern, unexport, unuse-package ++ ++See Also:: ++.......... ++ ++*note intern:: , *note find-all-symbols:: ++ ++Notes:: ++....... ++ ++find-symbol is operationally equivalent to intern, except that it never ++creates a new symbol. ++ ++ ++File: gcl.info, Node: find-package, Next: find-all-symbols, Prev: find-symbol, Up: Packages Dictionary ++ ++11.2.4 find-package [Function] ++------------------------------ ++ ++'find-package' name => package ++ ++Arguments and Values:: ++...................... ++ ++name--a string designator or a package object. ++ ++ package--a package object or nil. ++ ++Description:: ++............. ++ ++If name is a string designator, find-package locates and returns the ++package whose name or nickname is name. This search is case sensitive. ++If there is no such package, find-package returns nil. ++ ++ If name is a package object, that package object is returned. ++ ++Examples:: ++.......... ++ ++ (find-package 'common-lisp) => # ++ (find-package "COMMON-LISP-USER") => # ++ (find-package 'not-there) => NIL ++ ++Affected By:: ++............. ++ ++The set of packages created by the implementation. ++ ++ defpackage, delete-package, make-package, rename-package ++ ++See Also:: ++.......... ++ ++*note make-package:: ++ ++ ++File: gcl.info, Node: find-all-symbols, Next: import, Prev: find-package, Up: Packages Dictionary ++ ++11.2.5 find-all-symbols [Function] ++---------------------------------- ++ ++'find-all-symbols' string => symbols ++ ++Arguments and Values:: ++...................... ++ ++string--a string designator. ++ ++ symbols--a list of symbols. ++ ++Description:: ++............. ++ ++find-all-symbols searches every registered package for symbols that have ++a name that is the same (under string=) as string. A list of all such ++symbols is returned. Whether or how the list is ordered is ++implementation-dependent. ++ ++Examples:: ++.......... ++ ++ (find-all-symbols 'car) ++ => (CAR) ++ OR=> (CAR VEHICLES:CAR) ++ OR=> (VEHICLES:CAR CAR) ++ (intern "CAR" (make-package 'temp :use nil)) => TEMP::CAR, NIL ++ (find-all-symbols 'car) ++ => (TEMP::CAR CAR) ++ OR=> (CAR TEMP::CAR) ++ OR=> (TEMP::CAR CAR VEHICLES:CAR) ++ OR=> (CAR TEMP::CAR VEHICLES:CAR) ++ ++See Also:: ++.......... ++ ++*note find-symbol:: ++ ++ ++File: gcl.info, Node: import, Next: list-all-packages, Prev: find-all-symbols, Up: Packages Dictionary ++ ++11.2.6 import [Function] ++------------------------ ++ ++'import' symbols &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++symbols--a designator for a list of symbols. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++Description:: ++............. ++ ++import adds symbol or symbols to the internals of package, checking for ++name conflicts with existing symbols either present in package or ++accessible to it. Once the symbols have been imported, they may be ++referenced in the importing package without the use of a package prefix ++when using the Lisp reader. ++ ++ A name conflict in import between the symbol being imported and a ++symbol inherited from some other package can be resolved in favor of the ++symbol being imported by making it a shadowing symbol, or in favor of ++the symbol already accessible by not doing the import. A name conflict ++in import with a symbol already present in the package may be resolved ++by uninterning that symbol, or by not doing the import. ++ ++ The imported symbol is not automatically exported from the current ++package, but if it is already present and external, then the fact that ++it is external is not changed. ++ ++ If any symbol to be imported has no home package (i.e., ++(symbol-package symbol) => nil), import sets the home package of the ++symbol to package. ++ ++ If the symbol is already present in the importing package, import has ++no effect. ++ ++Examples:: ++.......... ++ ++ (import 'common-lisp::car (make-package 'temp :use nil)) => T ++ (find-symbol "CAR" 'temp) => CAR, :INTERNAL ++ (find-symbol "CDR" 'temp) => NIL, NIL ++ ++ The form (import 'editor:buffer) takes the external symbol named ++buffer in the EDITOR package (this symbol was located when the form was ++read by the Lisp reader) and adds it to the current package as an ++internal symbol. The symbol buffer is then present in the current ++package. ++ ++Side Effects:: ++.............. ++ ++The package system is modified. ++ ++Affected By:: ++............. ++ ++Current state of the package system. ++ ++Exceptional Situations:: ++........................ ++ ++import signals a correctable error of type package-error if any of the ++symbols to be imported has the same name (under string=) as some ++distinct symbol (under eql) already accessible in the package, even if ++the conflict is with a shadowing symbol of the package. ++ ++See Also:: ++.......... ++ ++*note shadow:: , *note export:: ++ ++ ++File: gcl.info, Node: list-all-packages, Next: rename-package, Prev: import, Up: Packages Dictionary ++ ++11.2.7 list-all-packages [Function] ++----------------------------------- ++ ++'list-all-packages' => packages ++ ++Arguments and Values:: ++...................... ++ ++packages--a list of package objects. ++ ++Description:: ++............. ++ ++list-all-packages returns a ++ ++ fresh ++ ++ list of ++ ++ all registered packages. ++ ++Examples:: ++.......... ++ ++ (let ((before (list-all-packages))) ++ (make-package 'temp) ++ (set-difference (list-all-packages) before)) => (#) ++ ++Affected By:: ++............. ++ ++defpackage, delete-package, make-package ++ ++ ++File: gcl.info, Node: rename-package, Next: shadow, Prev: list-all-packages, Up: Packages Dictionary ++ ++11.2.8 rename-package [Function] ++-------------------------------- ++ ++'rename-package' package new-name &optional new-nicknames => ++package-object ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ new-name--a package designator. ++ ++ new-nicknames--a list of string designators. The default is the ++empty list. ++ ++ package-object--the renamed package object. ++ ++Description:: ++............. ++ ++Replaces the name and nicknames of package. The old name and all of the ++old nicknames of package are eliminated and are replaced by new-name and ++new-nicknames. ++ ++ The consequences are undefined if new-name or any new-nickname ++conflicts with any existing package names. ++ ++Examples:: ++.......... ++ ++ (make-package 'temporary :nicknames '("TEMP")) => # ++ (rename-package 'temp 'ephemeral) => # ++ (package-nicknames (find-package 'ephemeral)) => () ++ (find-package 'temporary) => NIL ++ (rename-package 'ephemeral 'temporary '(temp fleeting)) ++ => # ++ (package-nicknames (find-package 'temp)) => ("TEMP" "FLEETING") ++ ++See Also:: ++.......... ++ ++*note make-package:: ++ ++ ++File: gcl.info, Node: shadow, Next: shadowing-import, Prev: rename-package, Up: Packages Dictionary ++ ++11.2.9 shadow [Function] ++------------------------ ++ ++'shadow' symbol-names &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++symbol-names--a designator for a list of string designators. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++Description:: ++............. ++ ++shadow assures that symbols with names given by symbol-names are present ++in the package. ++ ++ Specifically, package is searched for symbols with the names supplied ++by symbol-names. ++ ++ For each such name, if a corresponding symbol is not present in ++package (directly, not by inheritance), then a corresponding symbol is ++created with that name, and inserted into package as an internal symbol. ++The corresponding symbol, whether pre-existing or newly created, is then ++added, if not already present, to the shadowing symbols list of package. ++ ++Examples:: ++.......... ++ ++ (package-shadowing-symbols (make-package 'temp)) => NIL ++ (find-symbol 'car 'temp) => CAR, :INHERITED ++ (shadow 'car 'temp) => T ++ (find-symbol 'car 'temp) => TEMP::CAR, :INTERNAL ++ (package-shadowing-symbols 'temp) => (TEMP::CAR) ++ ++ (make-package 'test-1) => # ++ (intern "TEST" (find-package 'test-1)) => TEST-1::TEST, NIL ++ (shadow 'test-1::test (find-package 'test-1)) => T ++ (shadow 'TEST (find-package 'test-1)) => T ++ (assert (not (null (member 'test-1::test (package-shadowing-symbols ++ (find-package 'test-1)))))) ++ ++ (make-package 'test-2) => # ++ (intern "TEST" (find-package 'test-2)) => TEST-2::TEST, NIL ++ (export 'test-2::test (find-package 'test-2)) => T ++ (use-package 'test-2 (find-package 'test-1)) ;should not error ++ ++ ++Side Effects:: ++.............. ++ ++shadow changes the state of the package system in such a way that the ++package consistency rules do not hold across the change. ++ ++Affected By:: ++............. ++ ++Current state of the package system. ++ ++See Also:: ++.......... ++ ++*note package-shadowing-symbols:: , *note Package Concepts:: ++ ++Notes:: ++....... ++ ++If a symbol with a name in symbol-names already exists in package, but ++by inheritance, the inherited symbol becomes shadowed_3 by a newly ++created internal symbol. ++ ++ ++File: gcl.info, Node: shadowing-import, Next: delete-package, Prev: shadow, Up: Packages Dictionary ++ ++11.2.10 shadowing-import [Function] ++----------------------------------- ++ ++'shadowing-import' symbols &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++symbols--a designator for a list of symbols. ++ ++ package --a package designator. ++ ++ The default is the current package. ++ ++Description:: ++............. ++ ++shadowing-import is like import, but it does not signal an error even if ++the importation of a symbol would shadow some symbol already accessible ++in package. ++ ++ shadowing-import inserts each of symbols into package as an internal ++symbol, regardless of whether another symbol of the same name is ++shadowed by this action. If a different symbol of the same name is ++already present in package, that symbol is first uninterned from ++package. The new symbol is added to package's shadowing-symbols list. ++ ++ shadowing-import does name-conflict checking to the extent that it ++checks whether a distinct existing symbol with the same name is ++accessible; if so, it is shadowed by the new symbol, which implies that ++it must be uninterned if it was present in package. ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ (setq sym (intern "CONFLICT")) => CONFLICT ++ (intern "CONFLICT" (make-package 'temp)) => TEMP::CONFLICT, NIL ++ (package-shadowing-symbols 'temp) => NIL ++ (shadowing-import sym 'temp) => T ++ (package-shadowing-symbols 'temp) => (CONFLICT) ++ ++Side Effects:: ++.............. ++ ++shadowing-import changes the state of the package system in such a way ++that the consistency rules do not hold across the change. ++ ++ package's shadowing-symbols list is modified. ++ ++Affected By:: ++............. ++ ++Current state of the package system. ++ ++See Also:: ++.......... ++ ++*note import:: , *note unintern:: , *note package-shadowing-symbols:: ++ ++ ++File: gcl.info, Node: delete-package, Next: make-package, Prev: shadowing-import, Up: Packages Dictionary ++ ++11.2.11 delete-package [Function] ++--------------------------------- ++ ++'delete-package' package => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++delete-package deletes package from all package system data structures. ++If the operation is successful, delete-package returns true, otherwise ++nil. The effect of delete-package is that the name and nicknames of ++package cease to be recognized package names. The package object is ++still a package (i.e., packagep is true of it) but package-name returns ++nil. The consequences of deleting the COMMON-LISP package or the ++KEYWORD package are undefined. The consequences of invoking any other ++package operation on package once it has been deleted are unspecified. ++In particular, the consequences of invoking find-symbol, intern and ++other functions that look for a symbol name in a package are unspecified ++if they are called with *package* bound to the deleted package or with ++the deleted package as an argument. ++ ++ If package is a package object that has already been deleted, ++delete-package immediately returns nil. ++ ++ After this operation completes, the home package of any symbol whose ++home package had previously been package is implementation-dependent. ++Except for this, symbols accessible in package are not modified in any ++other way; symbols whose home package is not package remain unchanged. ++ ++Examples:: ++.......... ++ ++ (setq *foo-package* (make-package "FOO" :use nil)) ++ (setq *foo-symbol* (intern "FOO" *foo-package*)) ++ (export *foo-symbol* *foo-package*) ++ ++ (setq *bar-package* (make-package "BAR" :use '("FOO"))) ++ (setq *bar-symbol* (intern "BAR" *bar-package*)) ++ (export *foo-symbol* *bar-package*) ++ (export *bar-symbol* *bar-package*) ++ ++ (setq *baz-package* (make-package "BAZ" :use '("BAR"))) ++ ++ (symbol-package *foo-symbol*) => # ++ (symbol-package *bar-symbol*) => # ++ ++ (prin1-to-string *foo-symbol*) => "FOO:FOO" ++ (prin1-to-string *bar-symbol*) => "BAR:BAR" ++ ++ (find-symbol "FOO" *bar-package*) => FOO:FOO, :EXTERNAL ++ ++ (find-symbol "FOO" *baz-package*) => FOO:FOO, :INHERITED ++ (find-symbol "BAR" *baz-package*) => BAR:BAR, :INHERITED ++ ++ (packagep *foo-package*) => true ++ (packagep *bar-package*) => true ++ (packagep *baz-package*) => true ++ ++ (package-name *foo-package*) => "FOO" ++ (package-name *bar-package*) => "BAR" ++ (package-name *baz-package*) => "BAZ" ++ ++ (package-use-list *foo-package*) => () ++ (package-use-list *bar-package*) => (#) ++ (package-use-list *baz-package*) => (#) ++ ++ (package-used-by-list *foo-package*) => (#) ++ (package-used-by-list *bar-package*) => (#) ++ (package-used-by-list *baz-package*) => () ++ ++ (delete-package *bar-package*) ++ |> Error: Package BAZ uses package BAR. ++ |> If continued, BAZ will be made to unuse-package BAR, ++ |> and then BAR will be deleted. ++ |> Type :CONTINUE to continue. ++ |> Debug> |>>:CONTINUE<<| ++ => T ++ ++ (symbol-package *foo-symbol*) => # ++ (symbol-package *bar-symbol*) is unspecified ++ ++ (prin1-to-string *foo-symbol*) => "FOO:FOO" ++ (prin1-to-string *bar-symbol*) is unspecified ++ ++ (find-symbol "FOO" *bar-package*) is unspecified ++ ++ (find-symbol "FOO" *baz-package*) => NIL, NIL ++ (find-symbol "BAR" *baz-package*) => NIL, NIL ++ ++ (packagep *foo-package*) => T ++ (packagep *bar-package*) => T ++ (packagep *baz-package*) => T ++ ++ (package-name *foo-package*) => "FOO" ++ (package-name *bar-package*) => NIL ++ (package-name *baz-package*) => "BAZ" ++ ++ (package-use-list *foo-package*) => () ++ (package-use-list *bar-package*) is unspecified ++ (package-use-list *baz-package*) => () ++ ++ (package-used-by-list *foo-package*) => () ++ (package-used-by-list *bar-package*) is unspecified ++ (package-used-by-list *baz-package*) => () ++ ++Exceptional Situations:: ++........................ ++ ++If the package designator is a name that does not currently name a ++package, a correctable error of type package-error is signaled. If ++correction is attempted, no deletion action is attempted; instead, ++delete-package immediately returns nil. ++ ++ If package is used by other packages, a correctable error of type ++package-error is signaled. If correction is attempted, unuse-package is ++effectively called to remove any dependencies, causing package's ++external symbols to cease being accessible to those packages that use ++package. delete-package then deletes package just as it would have had ++there been no packages that used it. ++ ++See Also:: ++.......... ++ ++*note unuse-package:: ++ ++ ++File: gcl.info, Node: make-package, Next: with-package-iterator, Prev: delete-package, Up: Packages Dictionary ++ ++11.2.12 make-package [Function] ++------------------------------- ++ ++'make-package' package-name &key nicknames use => package ++ ++Arguments and Values:: ++...................... ++ ++package-name--a string designator. ++ ++ nicknames--a list of string designators. The default is the empty ++list. ++ ++ use-- a list of package designators. ++ ++ The default is implementation-defined. ++ ++ package--a package. ++ ++Description:: ++............. ++ ++Creates a new package with the name package-name. ++ ++ Nicknames are additional names which may be used to refer to the new ++package. ++ ++ use specifies zero or more packages the external symbols of which are ++to be inherited by the new package. See the function use-package. ++ ++Examples:: ++.......... ++ ++ (make-package 'temporary :nicknames '("TEMP" "temp")) => # ++ (make-package "OWNER" :use '("temp")) => # ++ (package-used-by-list 'temp) => (#) ++ (package-use-list 'owner) => (#) ++ ++Affected By:: ++............. ++ ++The existence of other packages in the system. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are unspecified if packages denoted by use do not ++exist. ++ ++ A correctable error is signaled if the package-name or any of the ++nicknames is already the name or nickname of an existing package. ++ ++See Also:: ++.......... ++ ++*note defpackage:: , *note use-package:: ++ ++Notes:: ++....... ++ ++In situations where the packages to be used contain symbols which would ++conflict, it is necessary to first create the package with :use '(), ++then to use shadow or shadowing-import to address the conflicts, and ++then after that to use use-package once the conflicts have been ++addressed. ++ ++ When packages are being created as part of the static definition of a ++program rather than dynamically by the program, it is generally ++considered more stylistically appropriate to use defpackage rather than ++make-package. ++ ++ ++File: gcl.info, Node: with-package-iterator, Next: unexport, Prev: make-package, Up: Packages Dictionary ++ ++11.2.13 with-package-iterator [Macro] ++------------------------------------- ++ ++'with-package-iterator' (name package-list-form &rest symbol-types) ++{declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++name--a symbol. ++ ++ package-list-form--a form; evaluated once to produce a package-list. ++ ++ package-list--a designator for a list of package designators. ++ ++ symbol-type--one of the symbols :internal, :external, or :inherited. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values of the forms. ++ ++Description:: ++............. ++ ++Within the lexical scope of the body forms, the name is defined via ++macrolet such that successive invocations of (name) will return the ++symbols, one by one, from the packages in package-list. ++ ++ It is unspecified whether symbols inherited from multiple packages ++are returned more than once. The order of symbols returned does not ++necessarily reflect the order of packages in package-list. When ++package-list has more than one element, it is unspecified whether ++duplicate symbols are returned once or more than once. ++ ++ Symbol-types controls which symbols that are accessible in a package ++are returned as follows: ++ ++:internal ++ The symbols that are present in the package, but that are not ++ exported. ++ ++:external ++ The symbols that are present in the package and are exported. ++ ++:inherited ++ The symbols that are exported by used packages and that are not ++ shadowed. ++ ++ When more than one argument is supplied for symbol-types, a symbol is ++returned if its accessibility matches any one of the symbol-types ++supplied. Implementations may extend this syntax by recognizing ++additional symbol accessibility types. ++ ++ An invocation of (name) returns four values as follows: ++ ++1. ++ A flag that indicates whether a symbol is returned (true means that ++ a symbol is returned). ++2. ++ A symbol that is accessible in one the indicated packages. ++3. ++ The accessibility type for that symbol; i.e., one of the symbols ++ :internal, :external, or :inherited. ++4. ++ The package from which the symbol was obtained. The package is one ++ of the packages present or named in package-list. ++ ++ After all symbols have been returned by successive invocations of ++(name), then only one value is returned, namely nil. ++ ++ The meaning of the second, third, and fourth values is that the ++returned symbol is accessible in the returned package in the way ++indicated by the second return value as follows: ++ ++:internal ++ Means present and not exported. ++ ++:external ++ Means present and exported. ++ ++:inherited ++ Means not present (thus not shadowed) but inherited from some used ++ package. ++ ++ It is unspecified what happens if any of the implicit interior state ++of an iteration is returned outside the dynamic extent of the ++with-package-iterator form such as by returning some closure over the ++invocation form. ++ ++ Any number of invocations of with-package-iterator can be nested, and ++the body of the innermost one can invoke all of the locally established ++macros, provided all those macros have distinct names. ++ ++Examples:: ++.......... ++ ++The following function should return t on any package, and signal an ++error if the usage of with-package-iterator does not agree with the ++corresponding usage of do-symbols. ++ ++ (defun test-package-iterator (package) ++ (unless (packagep package) ++ (setq package (find-package package))) ++ (let ((all-entries '()) ++ (generated-entries '())) ++ (do-symbols (x package) ++ (multiple-value-bind (symbol accessibility) ++ (find-symbol (symbol-name x) package) ++ (push (list symbol accessibility) all-entries))) ++ (with-package-iterator (generator-fn package ++ :internal :external :inherited) ++ (loop ++ (multiple-value-bind (more? symbol accessibility pkg) ++ (generator-fn) ++ (unless more? (return)) ++ (let ((l (multiple-value-list (find-symbol (symbol-name symbol) ++ package)))) ++ (unless (equal l (list symbol accessibility)) ++ (error "Symbol ~S not found as ~S in package ~A [~S]" ++ symbol accessibility (package-name package) l)) ++ (push l generated-entries))))) ++ (unless (and (subsetp all-entries generated-entries :test #'equal) ++ (subsetp generated-entries all-entries :test #'equal)) ++ (error "Generated entries and Do-Symbols entries don't correspond")) ++ t)) ++ ++ The following function prints out every present symbol (possibly more ++than once): ++ ++ (defun print-all-symbols () ++ (with-package-iterator (next-symbol (list-all-packages) ++ :internal :external) ++ (loop ++ (multiple-value-bind (more? symbol) (next-symbol) ++ (if more? ++ (print symbol) ++ (return)))))) ++ ++Exceptional Situations:: ++........................ ++ ++with-package-iterator signals an error of type program-error if no ++symbol-types are supplied or if a symbol-type is not recognized by the ++implementation is supplied. ++ ++ The consequences are undefined if the local function named name ++established by with-package-iterator is called after it has returned ++false as its primary value. ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: unexport, Next: unintern, Prev: with-package-iterator, Up: Packages Dictionary ++ ++11.2.14 unexport [Function] ++--------------------------- ++ ++'unexport' symbols &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++symbols--a designator for a list of symbols. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++Description:: ++............. ++ ++unexport reverts external symbols in package to internal status; it ++undoes the effect of export. ++ ++ unexport works only on symbols present in package, switching them ++back to internal status. If unexport is given a symbol that is already ++accessible as an internal symbol in package, it does nothing. ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ (export (intern "CONTRABAND" (make-package 'temp)) 'temp) => T ++ (find-symbol "CONTRABAND") => NIL, NIL ++ (use-package 'temp) => T ++ (find-symbol "CONTRABAND") => CONTRABAND, :INHERITED ++ (unexport 'contraband 'temp) => T ++ (find-symbol "CONTRABAND") => NIL, NIL ++ ++Side Effects:: ++.............. ++ ++Package system is modified. ++ ++Affected By:: ++............. ++ ++Current state of the package system. ++ ++Exceptional Situations:: ++........................ ++ ++If unexport is given a symbol not accessible in package at all, an error ++of type package-error is signaled. ++ ++ The consequences are undefined if package is the KEYWORD package or ++the COMMON-LISP package. ++ ++See Also:: ++.......... ++ ++*note export:: , *note Package Concepts:: ++ ++ ++File: gcl.info, Node: unintern, Next: in-package, Prev: unexport, Up: Packages Dictionary ++ ++11.2.15 unintern [Function] ++--------------------------- ++ ++'unintern' symbol &optional package => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++unintern removes symbol from package. If symbol is present in package, ++it is removed from package and also from package's shadowing symbols ++list if it is present there. If package is the home package for symbol, ++symbol is made to have no home package. Symbol may continue to be ++accessible in package by inheritance. ++ ++ Use of unintern can result in a symbol that has no recorded home ++package, but that in fact is accessible in some package. Common Lisp ++does not check for this pathological case, and such symbols are always ++printed preceded by #:. ++ ++ unintern returns true if it removes symbol, and nil otherwise. ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ (setq temps-unpack (intern "UNPACK" (make-package 'temp))) => TEMP::UNPACK ++ (unintern temps-unpack 'temp) => T ++ (find-symbol "UNPACK" 'temp) => NIL, NIL ++ temps-unpack => #:UNPACK ++ ++Side Effects:: ++.............. ++ ++unintern changes the state of the package system in such a way that the ++consistency rules do not hold across the change. ++ ++Affected By:: ++............. ++ ++Current state of the package system. ++ ++Exceptional Situations:: ++........................ ++ ++Giving a shadowing symbol to unintern can uncover a name conflict that ++had previously been resolved by the shadowing. If package A uses ++packages B and C, A contains a shadowing symbol x, and B and C each ++contain external symbols named x, then removing the shadowing symbol x ++from A will reveal a name conflict between b:x and c:x if those two ++symbols are distinct. In this case unintern will signal an error. ++ ++See Also:: ++.......... ++ ++*note Package Concepts:: ++ ++ ++File: gcl.info, Node: in-package, Next: unuse-package, Prev: unintern, Up: Packages Dictionary ++ ++11.2.16 in-package [Macro] ++-------------------------- ++ ++'in-package' name => package ++ ++Arguments and Values:: ++...................... ++ ++name--a string designator; not evaluated. ++ ++ package--the package named by name. ++ ++Description:: ++............. ++ ++Causes the the package named by name to become the current package--that ++is, the value of *package*. If no such package already exists, an error ++of type package-error is signaled. ++ ++ Everything in-package does is also performed at compile time if the ++call appears as a top level form. ++ ++Side Effects:: ++.............. ++ ++The variable *package* is assigned. If the in-package form is a top ++level form, this assignment also occurs at compile time. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type package-error is signaled if the specified package does ++not exist. ++ ++See Also:: ++.......... ++ ++*note package:: ++ ++ ++File: gcl.info, Node: unuse-package, Next: use-package, Prev: in-package, Up: Packages Dictionary ++ ++11.2.17 unuse-package [Function] ++-------------------------------- ++ ++'unuse-package' packages-to-unuse &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++packages-to-unuse--a designator for a list of package designators. ++ ++ package--a package designator. The default is the current package. ++ ++Description:: ++............. ++ ++unuse-package causes package to cease inheriting all the external ++symbols of packages-to-unuse; unuse-package undoes the effects of ++use-package. The packages-to-unuse are removed from the use list of ++package. ++ ++ Any symbols that have been imported into package continue to be ++present in package. ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ (export (intern "SHOES" (make-package 'temp)) 'temp) => T ++ (find-symbol "SHOES") => NIL, NIL ++ (use-package 'temp) => T ++ (find-symbol "SHOES") => SHOES, :INHERITED ++ (find (find-package 'temp) (package-use-list 'common-lisp-user)) => # ++ (unuse-package 'temp) => T ++ (find-symbol "SHOES") => NIL, NIL ++ ++Side Effects:: ++.............. ++ ++The use list of package is modified. ++ ++Affected By:: ++............. ++ ++Current state of the package system. ++ ++See Also:: ++.......... ++ ++*note use-package:: , *note package-use-list:: ++ ++ ++File: gcl.info, Node: use-package, Next: defpackage, Prev: unuse-package, Up: Packages Dictionary ++ ++11.2.18 use-package [Function] ++------------------------------ ++ ++'use-package' packages-to-use &optional package => t ++ ++Arguments and Values:: ++...................... ++ ++packages-to-use--a designator for a list of package designators. The ++KEYWORD package may not be supplied. ++ ++ package--a package designator. The KEYWORD package cannot be ++supplied. The default is the current package. ++ ++Description:: ++............. ++ ++use-package causes package to inherit all the external symbols of ++packages-to-use. The inherited symbols become accessible as internal ++symbols of package. ++ ++ Packages-to-use are added to the use list of package if they are not ++there already. All external symbols in packages-to-use become ++accessible in package as internal symbols. use-package does not cause ++any new symbols to be present in package but only makes them accessible ++by inheritance. ++ ++ use-package checks for name conflicts between the newly imported ++symbols and those already accessible in package. A name conflict in ++use-package between two external symbols inherited by package from ++packages-to-use may be resolved in favor of either symbol by importing ++one of them into package and making it a shadowing symbol. ++ ++Examples:: ++.......... ++ ++ (export (intern "LAND-FILL" (make-package 'trash)) 'trash) => T ++ (find-symbol "LAND-FILL" (make-package 'temp)) => NIL, NIL ++ (package-use-list 'temp) => (#) ++ (use-package 'trash 'temp) => T ++ (package-use-list 'temp) => (# #) ++ (find-symbol "LAND-FILL" 'temp) => TRASH:LAND-FILL, :INHERITED ++ ++Side Effects:: ++.............. ++ ++The use list of package may be modified. ++ ++See Also:: ++.......... ++ ++*note unuse-package:: , *note package-use-list:: , *note Package ++Concepts:: ++ ++Notes:: ++....... ++ ++It is permissible for a package P_1 to use a package P_2 even if P_2 ++already uses P_1. The using of packages is not transitive, so no ++problem results from the apparent circularity. ++ ++ ++File: gcl.info, Node: defpackage, Next: do-symbols, Prev: use-package, Up: Packages Dictionary ++ ++11.2.19 defpackage [Macro] ++-------------------------- ++ ++'defpackage' defined-package-name [[!option]] => package ++ ++ option ::={(:nicknames {nickname}*)}* | ++ (:documentation string) | ++ {(:use {package-name}*)}* | ++ {(:shadow {!symbol-name}*)}* | ++ {(:shadowing-import-from package-name {!symbol-name}*)}* | ++ {(:import-from package-name {!symbol-name}*)}* | ++ {(:export {!symbol-name}*)}* | ++ {(:intern {!symbol-name}*)}* | (:size integer) ++ ++ symbol-name ::=(symbol | string) ++ ++Arguments and Values:: ++...................... ++ ++defined-package-name--a string designator. ++ ++ package-name--a package designator. ++ ++ nickname--a string designator. ++ ++ symbol-name--a string designator. ++ ++ package--the package named package-name. ++ ++Description:: ++............. ++ ++defpackage creates a package as specified and returns the package. ++ ++ If defined-package-name already refers to an existing package, the ++name-to-package mapping for that name is not changed. If the new ++definition is at variance with the current state of that package, the ++consequences are undefined; an implementation might choose to modify the ++existing package to reflect the new definition. If defined-package-name ++is a symbol, its name is used. ++ ++ The standard options are described below. ++ ++:nicknames ++ The arguments to :nicknames set the package's nicknames to the ++ supplied names. ++ ++:documentation ++ The argument to :documentation specifies a documentation string; it ++ is attached as a documentation string to the package. At most one ++ :documentation option can appear in a single defpackage form. ++ ++:use ++ The arguments to :use set the packages that the package named by ++ package-name will inherit from. If :use is not supplied, ++ ++ it defaults to the same implementation-dependent value as the :use ++ argument to make-package. ++ ++:shadow ++ The arguments to :shadow, symbol-names, name symbols that are to be ++ created in the package being defined. These symbols are added to ++ the list of shadowing symbols effectively as if by shadow. ++ ++:shadowing-import-from ++ The symbols named by the argument symbol-names are found (involving ++ a lookup as if by find-symbol) in the specified package-name. The ++ resulting symbols are imported into the package being defined, and ++ placed on the shadowing symbols list as if by shadowing-import. In ++ no case are symbols created in any package other than the one being ++ defined. ++ ++:import-from ++ The symbols named by the argument symbol-names are found in the ++ package named by package-name and they are imported into the ++ package being defined. In no case are symbols created in any ++ package other than the one being defined. ++ ++:export ++ The symbols named by the argument symbol-names are found or created ++ in the package being defined and exported. The :export option ++ interacts with the :use option, since inherited symbols can be used ++ rather than new ones created. The :export option interacts with ++ the :import-from and :shadowing-import-from options, since imported ++ symbols can be used rather than new ones created. If an argument ++ to the :export option is accessible as an (inherited) internal ++ symbol via use-package, that the symbol named by symbol-name is ++ first imported into the package being defined, and is then exported ++ from that package. ++ ++:intern ++ The symbols named by the argument symbol-names are found or created ++ in the package being defined. The :intern option interacts with ++ the :use option, since inherited symbols can be used rather than ++ new ones created. ++ ++:size ++ The argument to the :size option declares the approximate number of ++ symbols expected in the package. This is an efficiency hint only ++ and might be ignored by an implementation. ++ ++ The order in which the options appear in a defpackage form is ++irrelevant. The order in which they are executed is as follows: ++ ++1. ++ :shadow and :shadowing-import-from. ++2. ++ :use. ++3. ++ :import-from and :intern. ++4. ++ :export. ++ ++ Shadows are established first, since they might be necessary to block ++spurious name conflicts when the :use option is processed. The :use ++option is executed next so that :intern and :export options can refer to ++normally inherited symbols. The :export option is executed last so that ++it can refer to symbols created by any of the other options; in ++particular, shadowing symbols and imported symbols can be made external. ++ ++ If a defpackage form appears as a top level form, all of the actions ++normally performed by this macro at load time must also be performed at ++compile time. ++ ++Examples:: ++.......... ++ ++ (defpackage "MY-PACKAGE" ++ (:nicknames "MYPKG" "MY-PKG") ++ (:use "COMMON-LISP") ++ (:shadow "CAR" "CDR") ++ (:shadowing-import-from "VENDOR-COMMON-LISP" "CONS") ++ (:import-from "VENDOR-COMMON-LISP" "GC") ++ (:export "EQ" "CONS" "FROBOLA") ++ ) ++ ++ (defpackage my-package ++ (:nicknames mypkg :MY-PKG) ; remember Common Lisp conventions for case ++ (:use common-lisp) ; conversion on symbols ++ (:shadow CAR :cdr #:cons) ++ (:export "CONS") ; this is the shadowed one. ++ ) ++ ++Affected By:: ++............. ++ ++Existing packages. ++ ++Exceptional Situations:: ++........................ ++ ++If one of the supplied :nicknames already refers to an existing package, ++an error of type package-error is signaled. ++ ++ An error of type program-error should be signaled if :size or ++:documentation appears more than once. ++ ++ Since implementations might allow extended options an error of type ++program-error should be signaled if an option is present that is not ++actually supported in the host implementation. ++ ++ The collection of symbol-name arguments given to the options :shadow, ++:intern, :import-from, and :shadowing-import-from must all be disjoint; ++additionally, the symbol-name arguments given to :export and :intern ++must be disjoint. Disjoint in this context is defined as no two of the ++symbol-names being string= with each other. If either condition is ++violated, an error of type program-error should be signaled. ++ ++ For the :shadowing-import-from and :import-from options, a ++correctable error of type package-error is signaled if no symbol is ++accessible in the package named by package-name for one of the argument ++symbol-names. ++ ++ Name conflict errors are handled by the underlying calls to ++make-package, use-package, import, and export. See *note Package ++Concepts::. ++ ++See Also:: ++.......... ++ ++*note documentation:: , *note Package Concepts::, *note Compilation:: ++ ++Notes:: ++....... ++ ++The :intern option is useful if an :import-from or a ++:shadowing-import-from option in a subsequent call to defpackage (for ++some other package) expects to find these symbols accessible but not ++necessarily external. ++ ++ It is recommended that the entire package definition is put in a ++single place, and that all the package definitions of a program are in a ++single file. This file can be loaded before loading or compiling ++anything else that depends on those packages. Such a file can be read ++in the COMMON-LISP-USER package, avoiding any initial state issues. ++ ++ defpackage cannot be used to create two "mutually recursive" ++packages, such as: ++ ++ (defpackage my-package ++ (:use common-lisp your-package) ;requires your-package to exist first ++ (:export "MY-FUN")) ++ (defpackage your-package ++ (:use common-lisp) ++ (:import-from my-package "MY-FUN") ;requires my-package to exist first ++ (:export "MY-FUN")) ++ ++ However, nothing prevents the user from using the package-affecting ++functions such as use-package, import, and export to establish such ++links after a more standard use of defpackage. ++ ++ The macroexpansion of defpackage could usefully canonicalize the ++names into strings, so that even if a source file has random symbols in ++the defpackage form, the compiled file would only contain strings. ++ ++ Frequently additional implementation-dependent options take the form ++of a keyword standing by itself as an abbreviation for a list (keyword ++T); this syntax should be properly reported as an unrecognized option in ++implementations that do not support it. ++ ++ ++File: gcl.info, Node: do-symbols, Next: intern, Prev: defpackage, Up: Packages Dictionary ++ ++11.2.20 do-symbols, do-external-symbols, do-all-symbols [Macro] ++--------------------------------------------------------------- ++ ++'do-symbols' (var [package [result-form]]) {declaration}* {tag | ++statement}* ++=> {result}* ++ ++ 'do-external-symbols' (var [package [result-form]]) {declaration}* ++{tag | statement}* ++=> {result}* ++ ++ 'do-all-symbols' (var [result-form]) {declaration}* {tag | ++statement}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a variable name; not evaluated. ++ ++ package--a package designator; evaluated. ++ ++ The default in do-symbols and do-external-symbols is the current ++package. ++ ++ result-form--a form; evaluated as described below. The default is ++nil. ++ ++ declaration--a declare expression; not evaluated. ++ ++ tag--a go tag; not evaluated. ++ ++ statement--a compound form; evaluated as described below. ++ ++ results--the values returned by the result-form if a normal return ++occurs, or else, if an explicit return occurs, the values that were ++transferred. ++ ++Description:: ++............. ++ ++do-symbols, do-external-symbols, and do-all-symbols iterate over the ++symbols of packages. For each symbol in the set of packages chosen, the ++var is bound to the symbol, and the statements in the body are executed. ++When all the symbols have been processed, result-form is evaluated and ++returned as the value of the macro. ++ ++ do-symbols iterates over the symbols accessible in package. ++ ++ Statements may execute more than once for symbols that are inherited ++from multiple packages. ++ ++ do-all-symbols iterates on every registered package. do-all-symbols ++will not process every symbol whatsoever, because a symbol not ++accessible in any registered package will not be processed. ++do-all-symbols may cause a symbol that is present in several packages to ++be processed more than once. ++ ++ do-external-symbols iterates on the external symbols of package. ++ ++ When result-form is evaluated, var is bound and has the value nil. ++ ++ An implicit block named nil surrounds the entire do-symbols, ++do-external-symbols, or do-all-symbols form. ++ ++ return or return-from may be used to terminate the iteration ++prematurely. ++ ++ If execution of the body affects which symbols are contained in the ++set of packages over which iteration is occurring, other than to remove ++the symbol currently the value of var by using unintern, the ++consequences are undefined. ++ ++ For each of these macros, the scope of the name binding does not ++include any initial value form, but the optional result forms are ++included. ++ ++ Any tag in the body is treated as with tagbody. ++ ++Examples:: ++.......... ++ ++ (make-package 'temp :use nil) => # ++ (intern "SHY" 'temp) => TEMP::SHY, NIL ;SHY will be an internal symbol ++ ;in the package TEMP ++ (export (intern "BOLD" 'temp) 'temp) => T ;BOLD will be external ++ (let ((lst ())) ++ (do-symbols (s (find-package 'temp)) (push s lst)) ++ lst) ++ => (TEMP::SHY TEMP:BOLD) ++ OR=> (TEMP:BOLD TEMP::SHY) ++ (let ((lst ())) ++ (do-external-symbols (s (find-package 'temp) lst) (push s lst)) ++ lst) ++ => (TEMP:BOLD) ++ (let ((lst ())) ++ (do-all-symbols (s lst) ++ (when (eq (find-package 'temp) (symbol-package s)) (push s lst))) ++ lst) ++ => (TEMP::SHY TEMP:BOLD) ++ OR=> (TEMP:BOLD TEMP::SHY) ++ ++See Also:: ++.......... ++ ++*note intern:: , *note export:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: intern, Next: package-name, Prev: do-symbols, Up: Packages Dictionary ++ ++11.2.21 intern [Function] ++------------------------- ++ ++'intern' string &optional package => symbol, status ++ ++Arguments and Values:: ++...................... ++ ++string--a string. ++ ++ package--a package designator. ++ ++ The default is the current package. ++ ++ symbol--a symbol. ++ ++ status--one of :inherited, :external, :internal, or nil. ++ ++Description:: ++............. ++ ++intern enters a symbol named string into package. If a symbol whose ++name is the same as string is already accessible in package, it is ++returned. If no such symbol is accessible in package, a new symbol with ++the given name is created and entered into package as an internal ++symbol, or as an external symbol if the package is the KEYWORD package; ++package becomes the home package of the created symbol. ++ ++ The first value returned by intern, symbol, is the symbol that was ++found or created. The meaning of the secondary value, status, is as ++follows: ++ ++:internal ++ The symbol was found and is present in package as an internal ++ symbol. ++ ++:external ++ The symbol was found and is present as an external symbol. ++ ++:inherited ++ The symbol was found and is inherited via use-package (which ++ implies that the symbol is internal). ++ ++nil ++ No pre-existing symbol was found, so one was created. ++ ++ It is implementation-dependent whether the string that becomes the ++ new symbol's name is the given string or a copy of it. Once a ++ string has been given as the string argument to intern in this ++ situation where a new symbol is created, the consequences are ++ undefined if a subsequent attempt is made to alter that string. ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ (intern "Never-Before") => |Never-Before|, NIL ++ (intern "Never-Before") => |Never-Before|, :INTERNAL ++ (intern "NEVER-BEFORE" "KEYWORD") => :NEVER-BEFORE, NIL ++ (intern "NEVER-BEFORE" "KEYWORD") => :NEVER-BEFORE, :EXTERNAL ++ ++See Also:: ++.......... ++ ++*note find-symbol:: , *note read:: , symbol, *note unintern:: , *note ++Symbols as Tokens:: ++ ++Notes:: ++....... ++ ++intern does not need to do any name conflict checking because it never ++creates a new symbol if there is already an accessible symbol with the ++name given. ++ ++ ++File: gcl.info, Node: package-name, Next: package-nicknames, Prev: intern, Up: Packages Dictionary ++ ++11.2.22 package-name [Function] ++------------------------------- ++ ++'package-name' package => name ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ name--a string ++ ++ or nil. ++ ++Description:: ++............. ++ ++package-name returns the string that names package, ++ ++ or nil if the package designator is a package object that has no name ++(see the function delete-package). ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ (package-name *package*) => "COMMON-LISP-USER" ++ (package-name (symbol-package :test)) => "KEYWORD" ++ (package-name (find-package 'common-lisp)) => "COMMON-LISP" ++ ++ (defvar *foo-package* (make-package "FOO")) ++ (rename-package "FOO" "FOO0") ++ (package-name *foo-package*) => "FOO0" ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if package is not a package ++designator. ++ ++ ++File: gcl.info, Node: package-nicknames, Next: package-shadowing-symbols, Prev: package-name, Up: Packages Dictionary ++ ++11.2.23 package-nicknames [Function] ++------------------------------------ ++ ++'package-nicknames' package => nicknames ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ nicknames--a list of strings. ++ ++Description:: ++............. ++ ++Returns the list of nickname strings for package, not including the name ++of package. ++ ++Examples:: ++.......... ++ ++ (package-nicknames (make-package 'temporary ++ :nicknames '("TEMP" "temp"))) ++ => ("temp" "TEMP") ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if package is not a package ++designator. ++ ++ ++File: gcl.info, Node: package-shadowing-symbols, Next: package-use-list, Prev: package-nicknames, Up: Packages Dictionary ++ ++11.2.24 package-shadowing-symbols [Function] ++-------------------------------------------- ++ ++'package-shadowing-symbols' package => symbols ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ symbols--a list of symbols. ++ ++Description:: ++............. ++ ++Returns a list of symbols that have been declared as shadowing symbols ++in package by shadow or shadowing-import (or the equivalent defpackage ++options). All symbols on this list are present in package. ++ ++Examples:: ++.......... ++ ++ (package-shadowing-symbols (make-package 'temp)) => () ++ (shadow 'cdr 'temp) => T ++ (package-shadowing-symbols 'temp) => (TEMP::CDR) ++ (intern "PILL" 'temp) => TEMP::PILL, NIL ++ (shadowing-import 'pill 'temp) => T ++ (package-shadowing-symbols 'temp) => (PILL TEMP::CDR) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if package is not a package ++designator. ++ ++See Also:: ++.......... ++ ++*note shadow:: , *note shadowing-import:: ++ ++Notes:: ++....... ++ ++Whether the list of symbols is fresh is implementation-dependent. ++ ++ ++File: gcl.info, Node: package-use-list, Next: package-used-by-list, Prev: package-shadowing-symbols, Up: Packages Dictionary ++ ++11.2.25 package-use-list [Function] ++----------------------------------- ++ ++'package-use-list' package => use-list ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ use-list--a list of package objects. ++ ++Description:: ++............. ++ ++Returns a list of other packages used by package. ++ ++Examples:: ++.......... ++ ++ (package-use-list (make-package 'temp)) => (#) ++ (use-package 'common-lisp-user 'temp) => T ++ (package-use-list 'temp) => (# #) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if package is not a package ++designator. ++ ++See Also:: ++.......... ++ ++*note use-package:: , *note unuse-package:: ++ ++ ++File: gcl.info, Node: package-used-by-list, Next: packagep, Prev: package-use-list, Up: Packages Dictionary ++ ++11.2.26 package-used-by-list [Function] ++--------------------------------------- ++ ++'package-used-by-list' package => used-by-list ++ ++Arguments and Values:: ++...................... ++ ++package--a package designator. ++ ++ used-by-list--a list of package objects. ++ ++Description:: ++............. ++ ++package-used-by-list returns a list of other packages that use package. ++ ++Examples:: ++.......... ++ ++ (package-used-by-list (make-package 'temp)) => () ++ (make-package 'trash :use '(temp)) => # ++ (package-used-by-list 'temp) => (#) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if package is not a package. ++ ++See Also:: ++.......... ++ ++*note use-package:: , *note unuse-package:: ++ ++ ++File: gcl.info, Node: packagep, Next: *package*, Prev: package-used-by-list, Up: Packages Dictionary ++ ++11.2.27 packagep [Function] ++--------------------------- ++ ++'packagep' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type package; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (packagep *package*) => true ++ (packagep 'common-lisp) => false ++ (packagep (find-package 'common-lisp)) => true ++ ++Notes:: ++....... ++ ++ (packagep object) == (typep object 'package) ++ ++ ++File: gcl.info, Node: *package*, Next: package-error, Prev: packagep, Up: Packages Dictionary ++ ++11.2.28 *package* [Variable] ++---------------------------- ++ ++Value Type:: ++............ ++ ++a package object. ++ ++Initial Value:: ++............... ++ ++the COMMON-LISP-USER package. ++ ++Description:: ++............. ++ ++Whatever package object is currently the value of *package* is referred ++to as the current package. ++ ++Examples:: ++.......... ++ ++ (in-package "COMMON-LISP-USER") => # ++ *package* => # ++ (make-package "SAMPLE-PACKAGE" :use '("COMMON-LISP")) ++ => # ++ (list ++ (symbol-package ++ (let ((*package* (find-package 'sample-package))) ++ (setq *some-symbol* (read-from-string "just-testing")))) ++ *package*) ++ => (# #) ++ (list (symbol-package (read-from-string "just-testing")) ++ *package*) ++ => (# #) ++ (eq 'foo (intern "FOO")) => true ++ (eq 'foo (let ((*package* (find-package 'sample-package))) ++ (intern "FOO"))) ++ => false ++ ++Affected By:: ++............. ++ ++load, compile-file, in-package ++ ++See Also:: ++.......... ++ ++*note compile-file:: , *note in-package:: , *note load:: , *note ++package:: ++ ++ ++File: gcl.info, Node: package-error, Next: package-error-package, Prev: *package*, Up: Packages Dictionary ++ ++11.2.29 package-error [Condition Type] ++-------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++package-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type package-error consists of error conditions related to ++operations on packages. The offending package (or package name) is ++initialized by the :package initialization argument to make-condition, ++and is accessed by the function package-error-package. ++ ++See Also:: ++.......... ++ ++*note package-error-package:: , *note Conditions:: ++ ++ ++File: gcl.info, Node: package-error-package, Prev: package-error, Up: Packages Dictionary ++ ++11.2.30 package-error-package [Function] ++---------------------------------------- ++ ++'package-error-package' condition => package ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type package-error. ++ ++ package--a package designator. ++ ++Description:: ++............. ++ ++Returns a designator for the offending package in the situation ++represented by the condition. ++ ++Examples:: ++.......... ++ ++ (package-error-package ++ (make-condition 'package-error ++ :package (find-package "COMMON-LISP"))) ++ => # ++ ++See Also:: ++.......... ++ ++package-error ++ ++ ++File: gcl.info, Node: Numbers (Numbers), Next: Characters, Prev: Packages, Up: Top ++ ++12 Numbers ++********** ++ ++* Menu: ++ ++* Number Concepts:: ++* Numbers Dictionary:: ++ ++ ++File: gcl.info, Node: Number Concepts, Next: Numbers Dictionary, Prev: Numbers (Numbers), Up: Numbers (Numbers) ++ ++12.1 Number Concepts ++==================== ++ ++* Menu: ++ ++* Numeric Operations:: ++* Implementation-Dependent Numeric Constants:: ++* Rational Computations:: ++* Floating-point Computations:: ++* Complex Computations:: ++* Interval Designators:: ++* Random-State Operations:: ++ ++ ++File: gcl.info, Node: Numeric Operations, Next: Implementation-Dependent Numeric Constants, Prev: Number Concepts, Up: Number Concepts ++ ++12.1.1 Numeric Operations ++------------------------- ++ ++Common Lisp provides a large variety of operations related to numbers. ++This section provides an overview of those operations by grouping them ++into categories that emphasize some of the relationships among them. ++ ++ Figure 12-1 shows operators relating to arithmetic operations. ++ ++ * 1+ gcd ++ + 1- incf ++ - conjugate lcm ++ / decf ++ ++ Figure 12-1: Operators relating to Arithmetic. ++ ++ ++ Figure 12-2 shows defined names relating to exponential, logarithmic, ++and trigonometric operations. ++ ++ abs cos signum ++ acos cosh sin ++ acosh exp sinh ++ asin expt sqrt ++ asinh isqrt tan ++ atan log tanh ++ atanh phase ++ cis pi ++ ++ Figure 12-2: Defined names relating to Exponentials, Logarithms, and Trigonometry. ++ ++ ++ Figure 12-3 shows operators relating to numeric comparison and ++predication. ++ ++ /= >= oddp ++ < evenp plusp ++ <= max zerop ++ = min ++ > minusp ++ ++ Figure 12-3: Operators for numeric comparison and predication. ++ ++ ++ Figure 12-4 shows defined names relating to numeric type manipulation ++and coercion. ++ ++ ceiling float-radix rational ++ complex float-sign rationalize ++ decode-float floor realpart ++ denominator fround rem ++ fceiling ftruncate round ++ ffloor imagpart scale-float ++ float integer-decode-float truncate ++ float-digits mod ++ float-precision numerator ++ ++ Figure 12-4: Defined names relating to numeric type manipulation and coercion. ++ ++ ++* Menu: ++ ++* Associativity and Commutativity in Numeric Operations:: ++* Examples of Associativity and Commutativity in Numeric Operations:: ++* Contagion in Numeric Operations:: ++* Viewing Integers as Bits and Bytes:: ++* Logical Operations on Integers:: ++* Byte Operations on Integers:: ++ ++ ++File: gcl.info, Node: Associativity and Commutativity in Numeric Operations, Next: Examples of Associativity and Commutativity in Numeric Operations, Prev: Numeric Operations, Up: Numeric Operations ++ ++12.1.1.1 Associativity and Commutativity in Numeric Operations ++.............................................................. ++ ++For functions that are mathematically associative (and possibly ++commutative), a conforming implementation may process the arguments in ++any manner consistent with associative (and possibly commutative) ++rearrangement. This does not affect the order in which the argument ++forms are evaluated; for a discussion of evaluation order, see *note ++Function Forms::. What is unspecified is only the order in which the ++parameter values are processed. This implies that implementations may ++differ in which automatic coercions are applied; see *note Contagion in ++Numeric Operations::. ++ ++ A conforming program can control the order of processing explicitly ++by separating the operations into separate (possibly nested) function ++forms, or by writing explicit calls to functions that perform coercions. ++ ++ ++File: gcl.info, Node: Examples of Associativity and Commutativity in Numeric Operations, Next: Contagion in Numeric Operations, Prev: Associativity and Commutativity in Numeric Operations, Up: Numeric Operations ++ ++12.1.1.2 Examples of Associativity and Commutativity in Numeric Operations ++.......................................................................... ++ ++Consider the following expression, in which we assume that 1.0 and ++1.0e-15 both denote single floats: ++ ++ (+ 1/3 2/3 1.0d0 1.0 1.0e-15) ++ ++ One conforming implementation might process the arguments from left ++to right, first adding 1/3 and 2/3 to get 1, then converting that to a ++double float for combination with 1.0d0, then successively converting ++and adding 1.0 and 1.0e-15. ++ ++ Another conforming implementation might process the arguments from ++right to left, first performing a single float addition of 1.0 and ++1.0e-15 (perhaps losing accuracy in the process), then converting the ++sum to a double float and adding 1.0d0, then converting 2/3 to a double ++float and adding it, and then converting 1/3 and adding that. ++ ++ A third conforming implementation might first scan all the arguments, ++process all the rationals first to keep that part of the computation ++exact, then find an argument of the largest floating-point format among ++all the arguments and add that, and then add in all other arguments, ++converting each in turn (all in a perhaps misguided attempt to make the ++computation as accurate as possible). ++ ++ In any case, all three strategies are legitimate. ++ ++ A conforming program could control the order by writing, for example, ++ ++ (+ (+ 1/3 2/3) (+ 1.0d0 1.0e-15) 1.0) ++ ++ ++File: gcl.info, Node: Contagion in Numeric Operations, Next: Viewing Integers as Bits and Bytes, Prev: Examples of Associativity and Commutativity in Numeric Operations, Up: Numeric Operations ++ ++12.1.1.3 Contagion in Numeric Operations ++........................................ ++ ++For information about the contagion rules for implicit coercions of ++arguments in numeric operations, see *note Rule of Float Precision ++Contagion::, *note Rule of Float and Rational Contagion::, and *note ++Rule of Complex Contagion::. ++ ++ ++File: gcl.info, Node: Viewing Integers as Bits and Bytes, Next: Logical Operations on Integers, Prev: Contagion in Numeric Operations, Up: Numeric Operations ++ ++12.1.1.4 Viewing Integers as Bits and Bytes ++........................................... ++ ++ ++File: gcl.info, Node: Logical Operations on Integers, Next: Byte Operations on Integers, Prev: Viewing Integers as Bits and Bytes, Up: Numeric Operations ++ ++12.1.1.5 Logical Operations on Integers ++....................................... ++ ++Logical operations require integers as arguments; an error of type ++type-error should be signaled if an argument is supplied that is not an ++integer. Integer arguments to logical operations are treated as if they ++were represented in two's-complement notation. ++ ++ Figure 12-5 shows defined names relating to logical operations on ++numbers. ++ ++ ash boole-ior logbitp ++ boole boole-nand logcount ++ boole-1 boole-nor logeqv ++ boole-2 boole-orc1 logior ++ boole-and boole-orc2 lognand ++ boole-andc1 boole-set lognor ++ boole-andc2 boole-xor lognot ++ boole-c1 integer-length logorc1 ++ boole-c2 logand logorc2 ++ boole-clr logandc1 logtest ++ boole-eqv logandc2 logxor ++ ++ Figure 12-5: Defined names relating to logical operations on numbers. ++ ++ ++ ++File: gcl.info, Node: Byte Operations on Integers, Prev: Logical Operations on Integers, Up: Numeric Operations ++ ++12.1.1.6 Byte Operations on Integers ++.................................... ++ ++The byte-manipulation functions use objects called byte specifiers to ++designate the size and position of a specific byte within an integer. ++The representation of a byte specifier is implementation-dependent; it ++might or might not be a number. The function byte will construct a byte ++specifier, which various other byte-manipulation functions will accept. ++ ++ Figure 12-6 shows defined names relating to manipulating bytes of ++numbers. ++ ++ byte deposit-field ldb-test ++ byte-position dpb mask-field ++ byte-size ldb ++ ++ Figure 12-6: Defined names relating to byte manipulation. ++ ++ ++ ++File: gcl.info, Node: Implementation-Dependent Numeric Constants, Next: Rational Computations, Prev: Numeric Operations, Up: Number Concepts ++ ++12.1.2 Implementation-Dependent Numeric Constants ++------------------------------------------------- ++ ++Figure 12-7 shows defined names relating to implementation-dependent ++details about numbers. ++ ++ double-float-epsilon most-negative-fixnum ++ double-float-negative-epsilon most-negative-long-float ++ least-negative-double-float most-negative-short-float ++ least-negative-long-float most-negative-single-float ++ least-negative-short-float most-positive-double-float ++ least-negative-single-float most-positive-fixnum ++ least-positive-double-float most-positive-long-float ++ least-positive-long-float most-positive-short-float ++ least-positive-short-float most-positive-single-float ++ least-positive-single-float short-float-epsilon ++ long-float-epsilon short-float-negative-epsilon ++ long-float-negative-epsilon single-float-epsilon ++ most-negative-double-float single-float-negative-epsilon ++ ++ Figure 12-7: Defined names relating to implementation-dependent details about numbers. ++ ++ ++ ++File: gcl.info, Node: Rational Computations, Next: Floating-point Computations, Prev: Implementation-Dependent Numeric Constants, Up: Number Concepts ++ ++12.1.3 Rational Computations ++---------------------------- ++ ++The rules in this section apply to rational computations. ++ ++* Menu: ++ ++* Rule of Unbounded Rational Precision:: ++* Rule of Canonical Representation for Rationals:: ++* Rule of Float Substitutability:: ++ ++ ++File: gcl.info, Node: Rule of Unbounded Rational Precision, Next: Rule of Canonical Representation for Rationals, Prev: Rational Computations, Up: Rational Computations ++ ++12.1.3.1 Rule of Unbounded Rational Precision ++............................................. ++ ++Rational computations cannot overflow in the usual sense (though there ++may not be enough storage to represent a result), since integers and ++ratios may in principle be of any magnitude. ++ ++ ++File: gcl.info, Node: Rule of Canonical Representation for Rationals, Next: Rule of Float Substitutability, Prev: Rule of Unbounded Rational Precision, Up: Rational Computations ++ ++12.1.3.2 Rule of Canonical Representation for Rationals ++....................................................... ++ ++If any computation produces a result that is a mathematical ratio of two ++integers such that the denominator evenly divides the numerator, then ++the result is converted to the equivalent integer. ++ ++ If the denominator does not evenly divide the numerator, the ++canonical representation of a rational number is as the ratio that ++numerator and that denominator, where the greatest common divisor of the ++numerator and denominator is one, and where the denominator is positive ++and greater than one. ++ ++ When used as input (in the default syntax), the notation -0 always ++denotes the integer 0. A conforming implementation must not have a ++representation of "minus zero" for integers that is distinct from its ++representation of zero for integers. However, such a distinction is ++possible for floats; see the type float. ++ ++ ++File: gcl.info, Node: Rule of Float Substitutability, Prev: Rule of Canonical Representation for Rationals, Up: Rational Computations ++ ++12.1.3.3 Rule of Float Substitutability ++....................................... ++ ++When the arguments to an irrational mathematical function ++ ++ [Reviewer Note by Barmar: There should be a table of these ++functions.] are all rational and the true mathematical result is also ++(mathematically) rational, then unless otherwise noted an implementation ++is free to return either an accurate rational result or a single float ++approximation. If the arguments are all rational but the result cannot ++be expressed as a rational number, then a single float approximation is ++always returned. ++ ++ If the arguments to a mathematical function are all of type (or ++rational (complex rational)) and the true mathematical result is ++(mathematically) a complex number with rational real and imaginary ++parts, then unless otherwise noted an implementation is free to return ++either an accurate result of type (or rational (complex rational)) or a ++single float (permissible only if the imaginary part of the true ++mathematical result is zero) or (complex single-float). If the ++arguments are all of type (or rational (complex rational)) but the ++result cannot be expressed as a rational or complex rational, then the ++returned value will be of type single-float (permissible only if the ++imaginary part of the true mathematical result is zero) or (complex ++single-float). ++ ++ Function Sample Results ++ abs (abs #c(3 4)) => 5 or 5.0 ++ acos (acos 1) => 0 or 0.0 ++ acosh (acosh 1) => 0 or 0.0 ++ asin (asin 0) => 0 or 0.0 ++ asinh (asinh 0) => 0 or 0.0 ++ atan (atan 0) => 0 or 0.0 ++ atanh (atanh 0) => 0 or 0.0 ++ cis (cis 0) => #c(1 0) or #c(1.0 0.0) ++ cos (cos 0) => 1 or 1.0 ++ cosh (cosh 0) => 1 or 1.0 ++ exp (exp 0) => 1 or 1.0 ++ expt (expt 8 1/3) => 2 or 2.0 ++ log (log 1) => 0 or 0.0 ++ (log 8 2) => 3 or 3.0 ++ phase (phase 7) => 0 or 0.0 ++ signum (signum #c(3 4)) => #c(3/5 4/5) or #c(0.6 0.8) ++ sin (sin 0) => 0 or 0.0 ++ sinh (sinh 0) => 0 or 0.0 ++ sqrt (sqrt 4) => 2 or 2.0 ++ (sqrt 9/16) => 3/4 or 0.75 ++ tan (tan 0) => 0 or 0.0 ++ tanh (tanh 0) => 0 or 0.0 ++ ++ Figure 12-8: Functions Affected by Rule of Float Substitutability ++ ++ ++ ++File: gcl.info, Node: Floating-point Computations, Next: Complex Computations, Prev: Rational Computations, Up: Number Concepts ++ ++12.1.4 Floating-point Computations ++---------------------------------- ++ ++The following rules apply to floating point computations. ++ ++* Menu: ++ ++* Rule of Float and Rational Contagion:: ++* Examples of Rule of Float and Rational Contagion:: ++* Rule of Float Approximation:: ++* Rule of Float Underflow and Overflow:: ++* Rule of Float Precision Contagion:: ++ ++ ++File: gcl.info, Node: Rule of Float and Rational Contagion, Next: Examples of Rule of Float and Rational Contagion, Prev: Floating-point Computations, Up: Floating-point Computations ++ ++12.1.4.1 Rule of Float and Rational Contagion ++............................................. ++ ++When rationals and floats are combined by a numerical function, the ++rational is first converted to a float of the same format. For ++functions such as + that take more than two arguments, it is permitted ++that part of the operation be carried out exactly using rationals and ++the rest be done using floating-point arithmetic. ++ ++ When rationals and floats are compared by a numerical function, the ++function rational is effectively called to convert the float to a ++rational and then an exact comparison is performed. In the case of ++complex numbers, the real and imaginary parts are effectively handled ++individually. ++ ++ ++File: gcl.info, Node: Examples of Rule of Float and Rational Contagion, Next: Rule of Float Approximation, Prev: Rule of Float and Rational Contagion, Up: Floating-point Computations ++ ++12.1.4.2 Examples of Rule of Float and Rational Contagion ++......................................................... ++ ++ ;;;; Combining rationals with floats. ++ ;;; This example assumes an implementation in which ++ ;;; (float-radix 0.5) is 2 (as in IEEE) or 16 (as in IBM/360), ++ ;;; or else some other implementation in which 1/2 has an exact ++ ;;; representation in floating point. ++ (+ 1/2 0.5) => 1.0 ++ (- 1/2 0.5d0) => 0.0d0 ++ (+ 0.5 -0.5 1/2) => 0.5 ++ ++ ;;;; Comparing rationals with floats. ++ ;;; This example assumes an implementation in which the default float ++ ;;; format is IEEE single-float, IEEE double-float, or some other format ++ ;;; in which 5/7 is rounded upwards by FLOAT. ++ (< 5/7 (float 5/7)) => true ++ (< 5/7 (rational (float 5/7))) => true ++ (< (float 5/7) (float 5/7)) => false ++ ++ ++File: gcl.info, Node: Rule of Float Approximation, Next: Rule of Float Underflow and Overflow, Prev: Examples of Rule of Float and Rational Contagion, Up: Floating-point Computations ++ ++12.1.4.3 Rule of Float Approximation ++.................................... ++ ++Computations with floats are only approximate, although they are ++described as if the results were mathematically accurate. Two ++mathematically identical expressions may be computationally different ++because of errors inherent in the floating-point approximation process. ++The precision of a float is not necessarily correlated with the accuracy ++of that number. For instance, 3.142857142857142857 is a more precise ++approximation to \pi than 3.14159, but the latter is more accurate. The ++precision refers to the number of bits retained in the representation. ++When an operation combines a short float with a long float, the result ++will be a long float. Common Lisp functions assume that the accuracy of ++arguments to them does not exceed their precision. Therefore when two ++small floats are combined, the result is a small float. Common Lisp ++functions never convert automatically from a larger size to a smaller ++one. ++ ++ ++File: gcl.info, Node: Rule of Float Underflow and Overflow, Next: Rule of Float Precision Contagion, Prev: Rule of Float Approximation, Up: Floating-point Computations ++ ++12.1.4.4 Rule of Float Underflow and Overflow ++............................................. ++ ++An error of type floating-point-overflow or floating-point-underflow ++should be signaled if a floating-point computation causes exponent ++overflow or underflow, respectively. ++ ++ ++File: gcl.info, Node: Rule of Float Precision Contagion, Prev: Rule of Float Underflow and Overflow, Up: Floating-point Computations ++ ++12.1.4.5 Rule of Float Precision Contagion ++.......................................... ++ ++The result of a numerical function is a float of the largest format ++among all the floating-point arguments to the function. ++ ++ ++File: gcl.info, Node: Complex Computations, Next: Interval Designators, Prev: Floating-point Computations, Up: Number Concepts ++ ++12.1.5 Complex Computations ++--------------------------- ++ ++The following rules apply to complex computations: ++ ++* Menu: ++ ++* Rule of Complex Substitutability:: ++* Rule of Complex Contagion:: ++* Rule of Canonical Representation for Complex Rationals:: ++* Examples of Rule of Canonical Representation for Complex Rationals:: ++* Principal Values and Branch Cuts:: ++ ++ ++File: gcl.info, Node: Rule of Complex Substitutability, Next: Rule of Complex Contagion, Prev: Complex Computations, Up: Complex Computations ++ ++12.1.5.1 Rule of Complex Substitutability ++......................................... ++ ++Except during the execution of irrational and transcendental functions, ++no numerical function ever yields a complex unless one or more of its ++arguments is a complex. ++ ++ ++File: gcl.info, Node: Rule of Complex Contagion, Next: Rule of Canonical Representation for Complex Rationals, Prev: Rule of Complex Substitutability, Up: Complex Computations ++ ++12.1.5.2 Rule of Complex Contagion ++.................................. ++ ++When a ++ ++ real ++ ++ and a complex are both part of a computation, the ++ ++ real ++ ++ is first converted to a complex by providing an imaginary part of 0. ++ ++ ++File: gcl.info, Node: Rule of Canonical Representation for Complex Rationals, Next: Examples of Rule of Canonical Representation for Complex Rationals, Prev: Rule of Complex Contagion, Up: Complex Computations ++ ++12.1.5.3 Rule of Canonical Representation for Complex Rationals ++............................................................... ++ ++If the result of any computation would be a complex number whose real ++part is of type rational and whose imaginary part is zero, the result is ++converted to the rational which is the real part. This rule does not ++apply to complex numbers whose parts are floats. For example, #C(5 0) ++and 5 are not different objects in Common Lisp (they are always the same ++under eql); #C(5.0 0.0) and 5.0 are always different objects in Common ++Lisp (they are never the same under eql, although they are the same ++under equalp and =). ++ ++ ++File: gcl.info, Node: Examples of Rule of Canonical Representation for Complex Rationals, Next: Principal Values and Branch Cuts, Prev: Rule of Canonical Representation for Complex Rationals, Up: Complex Computations ++ ++12.1.5.4 Examples of Rule of Canonical Representation for Complex Rationals ++........................................................................... ++ ++ #c(1.0 1.0) => #C(1.0 1.0) ++ #c(0.0 0.0) => #C(0.0 0.0) ++ #c(1.0 1) => #C(1.0 1.0) ++ #c(0.0 0) => #C(0.0 0.0) ++ #c(1 1) => #C(1 1) ++ #c(0 0) => 0 ++ (typep #c(1 1) '(complex (eql 1))) => true ++ (typep #c(0 0) '(complex (eql 0))) => false ++ ++ ++File: gcl.info, Node: Principal Values and Branch Cuts, Prev: Examples of Rule of Canonical Representation for Complex Rationals, Up: Complex Computations ++ ++12.1.5.5 Principal Values and Branch Cuts ++......................................... ++ ++Many of the irrational and transcendental functions are multiply defined ++in the complex domain; for example, there are in general an infinite ++number of complex values for the logarithm function. In each such case, ++a principal value must be chosen for the function to return. In ++general, such values cannot be chosen so as to make the range ++continuous; lines in the domain called branch cuts must be defined, ++which in turn define the discontinuities in the range. Common Lisp ++defines the branch cuts, principal values, and boundary conditions for ++the complex functions following "Principal Values and Branch Cuts in ++Complex APL." The branch cut rules that apply to each function are ++located with the description of that function. ++ ++ Figure 12-9 lists the identities that are obeyed throughout the ++applicable portion of the complex domain, even on the branch cuts: ++ ++ sin i z = i sinh z sinh i z = i sin z arctan i z = i arctanh z ++ cos i z = cosh z cosh i z = cos z arcsinh i z = i arcsin z ++ tan i z = i tanh z arcsin i z = i arcsinh z arctanh i z = i arctan z ++ ++ Figure 12-9: Trigonometric Identities for Complex Domain ++ ++ ++ The quadrant numbers referred to in the discussions of branch cuts ++are as illustrated in Figure 12-10. ++ ++ Imaginary Axis ++ | ++ | ++ II | I ++ | ++ | ++ | ++ ______________________________________ Real Axis ++ | ++ | ++ | ++ III | IV ++ | ++ | ++ | ++ | ++ ++ ++ Figure 12-9: Quadrant Numbering for Branch Cuts ++ ++ ++File: gcl.info, Node: Interval Designators, Next: Random-State Operations, Prev: Complex Computations, Up: Number Concepts ++ ++12.1.6 Interval Designators ++--------------------------- ++ ++The compound type specifier form of the numeric type specifiers in ++Figure 12-10 permit the user to specify an interval on the real number ++line which describe a subtype of the type which would be described by ++the corresponding atomic type specifier. A subtype of some type T is ++specified using an ordered pair of objects called interval designators ++for type T. ++ ++ The first of the two interval designators for type T can be any of ++the following: ++ ++a number N of type T ++ This denotes a lower inclusive bound of N. That is, elements of the ++ subtype of T will be greater than or equal to N. ++ ++a singleton list whose element is ++ a number M of type T This denotes a lower exclusive bound of M. ++ That is, elements of the subtype of T will be greater than M. ++ ++the symbol * ++ This denotes the absence of a lower bound on the interval. ++ ++ The second of the two interval designators for type T can be any of ++the following: ++ ++a number N of type T ++ This denotes an upper inclusive bound of N. That is, elements of ++ the subtype of T will be less than or equal to N. ++ ++a singleton list whose element is ++ a number M of type T This denotes an upper exclusive bound of M. ++ That is, elements of the subtype of T will be less than M. ++ ++the symbol * ++ This denotes the absence of an upper bound on the interval. ++ ++ ++File: gcl.info, Node: Random-State Operations, Prev: Interval Designators, Up: Number Concepts ++ ++12.1.7 Random-State Operations ++------------------------------ ++ ++Figure 12-10 lists some defined names that are applicable to random ++states. ++ ++ *random-state* random ++ make-random-state random-state-p ++ ++ Figure 12-10: Random-state defined names ++ ++ ++ ++File: gcl.info, Node: Numbers Dictionary, Prev: Number Concepts, Up: Numbers (Numbers) ++ ++12.2 Numbers Dictionary ++======================= ++ ++* Menu: ++ ++* number:: ++* complex (System Class):: ++* real:: ++* float (System Class):: ++* short-float:: ++* rational (System Class):: ++* ratio:: ++* integer:: ++* signed-byte:: ++* unsigned-byte:: ++* mod (System Class):: ++* bit (System Class):: ++* fixnum:: ++* bignum:: ++* =:: ++* max:: ++* minusp:: ++* zerop:: ++* floor:: ++* sin:: ++* asin:: ++* pi:: ++* sinh:: ++* *:: ++* +:: ++* -:: ++* /:: ++* 1+:: ++* abs:: ++* evenp:: ++* exp:: ++* gcd:: ++* incf:: ++* lcm:: ++* log:: ++* mod (Function):: ++* signum:: ++* sqrt:: ++* random-state:: ++* make-random-state:: ++* random:: ++* random-state-p:: ++* *random-state*:: ++* numberp:: ++* cis:: ++* complex:: ++* complexp:: ++* conjugate:: ++* phase:: ++* realpart:: ++* upgraded-complex-part-type:: ++* realp:: ++* numerator:: ++* rational (Function):: ++* rationalp:: ++* ash:: ++* integer-length:: ++* integerp:: ++* parse-integer:: ++* boole:: ++* boole-1:: ++* logand:: ++* logbitp:: ++* logcount:: ++* logtest:: ++* byte:: ++* deposit-field:: ++* dpb:: ++* ldb:: ++* ldb-test:: ++* mask-field:: ++* most-positive-fixnum:: ++* decode-float:: ++* float:: ++* floatp:: ++* most-positive-short-float:: ++* short-float-epsilon:: ++* arithmetic-error:: ++* arithmetic-error-operands:: ++* division-by-zero:: ++* floating-point-invalid-operation:: ++* floating-point-inexact:: ++* floating-point-overflow:: ++* floating-point-underflow:: ++ ++ ++File: gcl.info, Node: number, Next: complex (System Class), Prev: Numbers Dictionary, Up: Numbers Dictionary ++ ++12.2.1 number [System Class] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++number, t ++ ++Description:: ++............. ++ ++The type number contains objects which represent mathematical numbers. ++ ++ The types real and complex are disjoint subtypes of number. ++ ++ The function = tests for numerical equality. The function eql, when ++its arguments are both numbers, tests that they have both the same type ++and numerical value. Two numbers that are the same under eql or = are ++not necessarily the same under eq. ++ ++Notes:: ++....... ++ ++Common Lisp differs from mathematics on some naming issues. In ++mathematics, the set of real numbers is traditionally described as a ++subset of the complex numbers, but in Common Lisp, the type real and the ++type complex are disjoint. The Common Lisp type which includes all ++mathematical complex numbers is called number. The reasons for these ++differences include historical precedent, compatibility with most other ++popular computer languages, and various issues of time and space ++efficiency. ++ ++ ++File: gcl.info, Node: complex (System Class), Next: real, Prev: number, Up: Numbers Dictionary ++ ++12.2.2 complex [System Class] ++----------------------------- ++ ++Class Precedence List:: ++....................... ++ ++complex, number, t ++ ++Description:: ++............. ++ ++The type complex includes all mathematical complex numbers other than ++those included in the type rational. Complexes are expressed in ++Cartesian form with a real part and an imaginary part, each of which is ++a real. The real part and imaginary part are either both rational or ++both of the same float type. The imaginary part can be a float zero, ++but can never be a rational zero, for such a number is always ++represented by Common Lisp as a rational rather than a complex. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('complex'{[typespec | *]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++typespec--a type specifier that denotes a subtype of type real. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++[Editorial Note by KMP: If you ask me, this definition is a complete ++mess. Looking at issue ++ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING does not help me ++figure it out, either. Anyone got any suggestions?] ++ ++ Every element of this type is a complex whose real part and imaginary ++part are each of type ++ ++ (upgraded-complex-part-type typespec). ++ ++ This type encompasses those complexes that can result by giving ++numbers of type typespec to complex. ++ ++ (complex type-specifier) refers to all complexes that can result from ++giving numbers of type type-specifier to the function complex, plus all ++other complexes of the same specialized representation. ++ ++See Also:: ++.......... ++ ++*note Rule of Canonical Representation for Complex Rationals::, *note ++Constructing Numbers from Tokens::, *note Printing Complexes:: ++ ++Notes:: ++....... ++ ++The input syntax for a complex with real part r and imaginary part i is ++#C(r i). For further details, see *note Standard Macro Characters::. ++ ++ For every float, n, there is a complex which represents the same ++mathematical number and which can be obtained by (COERCE n 'COMPLEX). ++ ++ ++File: gcl.info, Node: real, Next: float (System Class), Prev: complex (System Class), Up: Numbers Dictionary ++ ++12.2.3 real [System Class] ++-------------------------- ++ ++Class Precedence List:: ++....................... ++ ++real, number, t ++ ++Description:: ++............. ++ ++The type real includes all numbers that represent mathematical real ++numbers, though there are mathematical real numbers (e.g., irrational ++numbers) that do not have an exact representation in Common Lisp. Only ++reals can be ordered using the <, >, <=, and >= functions. ++ ++ The types rational and float are disjoint subtypes of type real. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('real'{[lower-limit [upper-limit]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++lower-limit, upper-limit--interval designators for type real. The ++defaults for each of lower-limit and upper-limit is the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the reals on the interval described by lower-limit and ++upper-limit. ++ ++ ++File: gcl.info, Node: float (System Class), Next: short-float, Prev: real, Up: Numbers Dictionary ++ ++12.2.4 float [System Class] ++--------------------------- ++ ++Class Precedence List:: ++....................... ++ ++float, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++A float is a mathematical rational (but not a Common Lisp rational) of ++the form s\cdot f\cdot b^e-p, where s is +1 or -1, the sign; b is an ++integer greater than~1, the base or radix of the representation; p is a ++positive integer, the precision (in base-b digits) of the float; f is a ++positive integer between b^p-1 and b^p-1 (inclusive), the significand; ++and e is an integer, the exponent. The value of p and the range of~e ++depends on the implementation and on the type of float within that ++implementation. In addition, there is a floating-point zero; depending ++on the implementation, there can also be a "minus zero". If there is no ++minus zero, then 0.0 and~-0.0 are both interpreted as simply a ++floating-point zero. (= 0.0 -0.0) is always true. If there is a minus ++zero, (eql -0.0 0.0) is false, otherwise it is true. ++ ++ [Reviewer Note by Barmar: What about IEEE NaNs and infinities?] ++ ++ [Reviewer Note by RWK: In the following, what is the "ordering"? ++precision? range? Can there be additional subtypes of float or does ++"others" in the list of four?] ++ ++ The types short-float, single-float, double-float, and long-float are ++subtypes of type float. Any two of them must be either disjoint types ++or the same type; if the same type, then any other types between them in ++the above ordering must also be the same type. For example, if the type ++single-float and the type long-float are the same type, then the type ++double-float must be the same type also. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('float'{[lower-limit [upper-limit]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++lower-limit, upper-limit--interval designators for type float. The ++defaults for each of lower-limit and upper-limit is the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the floats on the interval described by lower-limit and ++upper-limit. ++ ++See Also:: ++.......... ++ ++Figure~2-9, *note Constructing Numbers from Tokens::, *note Printing ++Floats:: ++ ++Notes:: ++....... ++ ++Note that all mathematical integers are representable not only as Common ++Lisp reals, but also as complex floats. For example, possible ++representations of the mathematical number 1 include the integer 1, the ++float 1.0, or the complex #C(1.0 0.0). ++ ++ ++File: gcl.info, Node: short-float, Next: rational (System Class), Prev: float (System Class), Up: Numbers Dictionary ++ ++12.2.5 short-float, single-float, double-float, long-float [Type] ++----------------------------------------------------------------- ++ ++Supertypes:: ++............ ++ ++short-float: short-float, float, ++ ++ real, ++ ++ number, t ++ ++ single-float: single-float, float, ++ ++ real, ++ ++ number, t ++ ++ double-float: double-float, float, ++ ++ real, ++ ++ number, t ++ ++ long-float: long-float, float, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++For the four defined subtypes of type float, it is true that ++intermediate between the type short-float and the type long-float are ++the type single-float and the type double-float. The precise definition ++of these categories is implementation-defined. The precision (measured ++in "bits", computed as p\log_2b) and the exponent size (also measured in ++"bits," computed as \log_2(n+1), where n is the maximum exponent value) ++is recommended to be at least as great as the values in Figure 12-11. ++Each of the defined subtypes of type float might or might not have a ++minus zero. ++ ++ Format Minimum Precision Minimum Exponent Size ++ __________________________________________________ ++ Short 13 bits 5 bits ++ Single 24 bits 8 bits ++ Double 50 bits 8 bits ++ Long 50 bits 8 bits ++ ++ Figure 12-11: Recommended Minimum Floating-Point Precision and Exponent Size ++ ++ ++ There can be fewer than four internal representations for floats. If ++there are fewer distinct representations, the following rules apply: ++ ++- ++ If there is only one, it is the type single-float. In this ++ representation, an object is simultaneously of types single-float, ++ double-float, short-float, and long-float. ++- ++ Two internal representations can be arranged in either of the ++ following ways: ++ ++ * ++ Two types are provided: single-float and short-float. An ++ object is simultaneously of types single-float, double-float, ++ and long-float. ++ * ++ Two types are provided: single-float and double-float. An ++ object is simultaneously of types single-float and ++ short-float, or double-float and long-float. ++ ++- ++ Three internal representations can be arranged in either of the ++ following ways: ++ ++ * ++ Three types are provided: short-float, single-float, and ++ double-float. An object can simultaneously be of type ++ double-float and long-float. ++ * ++ Three types are provided: single-float, double-float, and ++ long-float. An object can simultaneously be of types ++ single-float and short-float. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('short-float'{[short-lower-limit [short-upper-limit]]}) ++('single-float'{[single-lower-limit [single-upper-limit]]}) ++('double-float'{[double-lower-limit [double-upper-limit]]}) ++('long-float'{[long-lower-limit [long-upper-limit]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++short-lower-limit, short-upper-limit--interval designators for type ++short-float. The defaults for each of lower-limit and upper-limit is ++the symbol *. ++ ++ single-lower-limit, single-upper-limit--interval designators for type ++single-float. The defaults for each of lower-limit and upper-limit is ++the symbol *. ++ ++ double-lower-limit, double-upper-limit--interval designators for type ++double-float. The defaults for each of lower-limit and upper-limit is ++the symbol *. ++ ++ long-lower-limit, long-upper-limit--interval designators for type ++long-float. The defaults for each of lower-limit and upper-limit is the ++symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++Each of these denotes the set of floats of the indicated type that are ++on the interval specified by the interval designators. ++ ++ ++File: gcl.info, Node: rational (System Class), Next: ratio, Prev: short-float, Up: Numbers Dictionary ++ ++12.2.6 rational [System Class] ++------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++The canonical representation of a rational is as an integer if its value ++is integral, and otherwise as a ratio. ++ ++ The types integer and ratio are disjoint subtypes of type rational. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('rational'{[lower-limit [upper-limit]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++lower-limit, upper-limit--interval designators for type rational. The ++defaults for each of lower-limit and upper-limit is the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the rationals on the interval described by lower-limit and ++upper-limit. ++ ++ ++File: gcl.info, Node: ratio, Next: integer, Prev: rational (System Class), Up: Numbers Dictionary ++ ++12.2.7 ratio [System Class] ++--------------------------- ++ ++Class Precedence List:: ++....................... ++ ++ratio, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++A ratio is a number representing the mathematical ratio of two non-zero ++integers, the numerator and denominator, whose greatest common divisor ++is one, and of which the denominator is positive and greater than one. ++ ++See Also:: ++.......... ++ ++Figure~2-9, *note Constructing Numbers from Tokens::, *note Printing ++Ratios:: ++ ++ ++File: gcl.info, Node: integer, Next: signed-byte, Prev: ratio, Up: Numbers Dictionary ++ ++12.2.8 integer [System Class] ++----------------------------- ++ ++Class Precedence List:: ++....................... ++ ++integer, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++An integer is a mathematical integer. There is no limit on the ++magnitude of an integer. ++ ++ The types fixnum and bignum form an exhaustive partition of type ++integer. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('integer'{[lower-limit [upper-limit]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++lower-limit, upper-limit--interval designators for type integer. The ++defaults for each of lower-limit and upper-limit is the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the integers on the interval described by lower-limit and ++upper-limit. ++ ++See Also:: ++.......... ++ ++Figure~2-9, *note Constructing Numbers from Tokens::, *note Printing ++Integers:: ++ ++Notes:: ++....... ++ ++The type (integer lower upper), where lower and upper are ++most-negative-fixnum and most-positive-fixnum, respectively, is also ++called fixnum. ++ ++ The type (integer 0 1) is also called bit. The type (integer 0 *) is ++also called unsigned-byte. ++ ++ ++File: gcl.info, Node: signed-byte, Next: unsigned-byte, Prev: integer, Up: Numbers Dictionary ++ ++12.2.9 signed-byte [Type] ++------------------------- ++ ++Supertypes:: ++............ ++ ++signed-byte, integer, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++The atomic type specifier signed-byte denotes the same type as is ++denoted by the type specifier integer; however, the list forms of these ++two type specifiers have different semantics. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('signed-byte'{[s | *]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++s--a positive integer. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of integers that can be represented in ++two's-complement form in a byte of s bits. This is equivalent to ++(integer -2^s-1 2^s-1-1). The type signed-byte or the type (signed-byte ++*) is the same as the type integer. ++ ++ ++File: gcl.info, Node: unsigned-byte, Next: mod (System Class), Prev: signed-byte, Up: Numbers Dictionary ++ ++12.2.10 unsigned-byte [Type] ++---------------------------- ++ ++Supertypes:: ++............ ++ ++unsigned-byte, signed-byte, integer, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++The atomic type specifier unsigned-byte denotes the same type as is ++denoted by the type specifier (integer 0 *). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('unsigned-byte'{[s | *]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++s--a positive integer. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of non-negative integers that can be represented in ++a byte of size s (bits). This is equivalent to (mod m) for m=2^s, or to ++(integer 0 n) for n=2^s-1. The type unsigned-byte or the type ++(unsigned-byte *) is the same as the type (integer 0 *), the set of ++non-negative integers. ++ ++Notes:: ++....... ++ ++The type (unsigned-byte 1) is also called bit. ++ ++ ++File: gcl.info, Node: mod (System Class), Next: bit (System Class), Prev: unsigned-byte, Up: Numbers Dictionary ++ ++12.2.11 mod [Type Specifier] ++---------------------------- ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('mod'{n}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++n--a positive integer. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of non-negative integers less than n. This is ++equivalent to (integer 0 (n)) or to (integer 0 m), where m=n-1. ++ ++ The argument is required, and cannot be *. ++ ++ The symbol mod is not valid as a type specifier. ++ ++ ++File: gcl.info, Node: bit (System Class), Next: fixnum, Prev: mod (System Class), Up: Numbers Dictionary ++ ++12.2.12 bit [Type] ++------------------ ++ ++Supertypes:: ++............ ++ ++bit, unsigned-byte, signed-byte, integer, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++The type bit is equivalent to the type (integer 0 1) and (unsigned-byte ++1). ++ ++ ++File: gcl.info, Node: fixnum, Next: bignum, Prev: bit (System Class), Up: Numbers Dictionary ++ ++12.2.13 fixnum [Type] ++--------------------- ++ ++Supertypes:: ++............ ++ ++fixnum, integer, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++A fixnum is an integer whose value is between most-negative-fixnum and ++most-positive-fixnum inclusive. Exactly which integers are fixnums is ++implementation-defined. ++ ++ The type fixnum is required to be a supertype of (signed-byte 16). ++ ++ ++File: gcl.info, Node: bignum, Next: =, Prev: fixnum, Up: Numbers Dictionary ++ ++12.2.14 bignum [Type] ++--------------------- ++ ++Supertypes:: ++............ ++ ++bignum, integer, rational, ++ ++ real, ++ ++ number, t ++ ++Description:: ++............. ++ ++The type bignum is defined to be exactly (and integer (not fixnum)). ++ ++ ++File: gcl.info, Node: =, Next: max, Prev: bignum, Up: Numbers Dictionary ++ ++12.2.15 =, /=, <, >, <=, >= [Function] ++-------------------------------------- ++ ++'=' &rest numbers^+ => generalized-boolean ++ ++ '/=' &rest numbers^+ => generalized-boolean ++ ++ '<' &rest numbers^+ => generalized-boolean ++ ++ '>' &rest numbers^+ => generalized-boolean ++ ++ '<=' &rest numbers^+ => generalized-boolean ++ ++ '>=' &rest numbers^+ => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++number--for <, >, <=, >=: a real; for =, /=: a number. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++=, /=, <, >, <=, and >= perform arithmetic comparisons on their ++arguments as follows: ++ ++= ++ The value of = is true if all numbers are the same in value; ++ otherwise it is false. Two complexes are considered equal by = if ++ their real and imaginary parts are equal according to =. ++ ++/= ++ The value of /= is true if no two numbers are the same in value; ++ otherwise it is false. ++ ++< ++ The value of < is true if the numbers are in monotonically ++ increasing order; otherwise it is false. ++ ++> ++ The value of > is true if the numbers are in monotonically ++ decreasing order; otherwise it is false. ++ ++<= ++ The value of <= is true if the numbers are in monotonically ++ nondecreasing order; otherwise it is false. ++ ++>= ++ The value of >= is true if the numbers are in monotonically ++ nonincreasing order; otherwise it is false. ++ ++ =, /=, <, >, <=, and >= perform necessary type conversions. ++ ++Examples:: ++.......... ++ ++The uses of these functions are illustrated in Figure 12-12. ++ ++ (= 3 3) is true. (/= 3 3) is false. ++ (= 3 5) is false. (/= 3 5) is true. ++ (= 3 3 3 3) is true. (/= 3 3 3 3) is false. ++ (= 3 3 5 3) is false. (/= 3 3 5 3) is false. ++ (= 3 6 5 2) is false. (/= 3 6 5 2) is true. ++ (= 3 2 3) is false. (/= 3 2 3) is false. ++ (< 3 5) is true. (<= 3 5) is true. ++ (< 3 -5) is false. (<= 3 -5) is false. ++ (< 3 3) is false. (<= 3 3) is true. ++ (< 0 3 4 6 7) is true. (<= 0 3 4 6 7) is true. ++ (< 0 3 4 4 6) is false. (<= 0 3 4 4 6) is true. ++ (> 4 3) is true. (>= 4 3) is true. ++ (> 4 3 2 1 0) is true. (>= 4 3 2 1 0) is true. ++ (> 4 3 3 2 0) is false. (>= 4 3 3 2 0) is true. ++ (> 4 3 1 2 0) is false. (>= 4 3 1 2 0) is false. ++ (= 3) is true. (/= 3) is true. ++ (< 3) is true. (<= 3) is true. ++ (= 3.0 #c(3.0 0.0)) is true. (/= 3.0 #c(3.0 1.0)) is true. ++ (= 3 3.0) is true. (= 3.0s0 3.0d0) is true. ++ (= 0.0 -0.0) is true. (= 5/2 2.5) is true. ++ (> 0.0 -0.0) is false. (= 0 -0.0) is true. ++ (<= 0 x 9) is true if x is between 0 and 9, inclusive ++ (< 0.0 x 1.0) is true if x is between 0.0 and 1.0, exclusive ++ (< -1 j (length v)) is true if j is a valid array index for a vector v ++ ++ Figure 12-12: Uses of /=, =, <, >, <=, and >= ++ ++ ++Exceptional Situations:: ++........................ ++ ++Might signal type-error if some argument is not a real. Might signal ++arithmetic-error if otherwise unable to fulfill its contract. ++ ++Notes:: ++....... ++ ++= differs from eql in that (= 0.0 -0.0) is always true, because = ++compares the mathematical values of its operands, whereas eql compares ++the representational values, so to speak. ++ ++ ++File: gcl.info, Node: max, Next: minusp, Prev: =, Up: Numbers Dictionary ++ ++12.2.16 max, min [Function] ++--------------------------- ++ ++'max' &rest reals^+ => max-real ++ ++ 'min' &rest reals^+ => min-real ++ ++Arguments and Values:: ++...................... ++ ++real--a real. ++ ++ max-real, min-real--a real. ++ ++Description:: ++............. ++ ++max returns the real that is greatest (closest to positive infinity). ++min returns the real that is least (closest to negative infinity). ++ ++ For max, the implementation has the choice of returning the largest ++argument as is or applying the rules of floating-point contagion, taking ++all the arguments into consideration for contagion purposes. Also, if ++one or more of the arguments are =, then any one of them may be chosen ++as the value to return. For example, if the reals are a mixture of ++rationals and floats, and the largest argument is a rational, then the ++implementation is free to produce either that rational or its float ++approximation; if the largest argument is a float of a smaller format ++than the largest format of any float argument, then the implementation ++is free to return the argument in its given format or expanded to the ++larger format. Similar remarks apply to min (replacing "largest ++argument" by "smallest argument"). ++ ++Examples:: ++.......... ++ ++ (max 3) => 3 ++ (min 3) => 3 ++ (max 6 12) => 12 ++ (min 6 12) => 6 ++ (max -6 -12) => -6 ++ (min -6 -12) => -12 ++ (max 1 3 2 -7) => 3 ++ (min 1 3 2 -7) => -7 ++ (max -2 3 0 7) => 7 ++ (min -2 3 0 7) => -2 ++ (max 5.0 2) => 5.0 ++ (min 5.0 2) ++ => 2 ++ OR=> 2.0 ++ (max 3.0 7 1) ++ => 7 ++ OR=> 7.0 ++ (min 3.0 7 1) ++ => 1 ++ OR=> 1.0 ++ (max 1.0s0 7.0d0) => 7.0d0 ++ (min 1.0s0 7.0d0) ++ => 1.0s0 ++ OR=> 1.0d0 ++ (max 3 1 1.0s0 1.0d0) ++ => 3 ++ OR=> 3.0d0 ++ (min 3 1 1.0s0 1.0d0) ++ => 1 ++ OR=> 1.0s0 ++ OR=> 1.0d0 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if any number is not a real. ++ ++ ++File: gcl.info, Node: minusp, Next: zerop, Prev: max, Up: Numbers Dictionary ++ ++12.2.17 minusp, plusp [Function] ++-------------------------------- ++ ++'minusp' real => generalized-boolean ++ ++ 'plusp' real => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++real--a real. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++minusp returns true if real is less than zero; otherwise, returns false. ++ ++ plusp returns true if real is greater than zero; otherwise, returns ++false. ++ ++ Regardless of whether an implementation provides distinct ++representations for positive and negative float zeros, (minusp -0.0) ++always returns false. ++ ++Examples:: ++.......... ++ ++ (minusp -1) => true ++ (plusp 0) => false ++ (plusp least-positive-single-float) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if real is not a real. ++ ++ ++File: gcl.info, Node: zerop, Next: floor, Prev: minusp, Up: Numbers Dictionary ++ ++12.2.18 zerop [Function] ++------------------------ ++ ++'zerop' number => generalized-boolean ++ ++Pronunciation:: ++............... ++ ++pronounced 'z\=e (, )r\=o(, )p\=e ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if number is zero (integer, float, or complex); otherwise, ++returns false. ++ ++ Regardless of whether an implementation provides distinct ++representations for positive and negative floating-point zeros, (zerop ++-0.0) always returns true. ++ ++Examples:: ++.......... ++ ++ (zerop 0) => true ++ (zerop 1) => false ++ (zerop -0.0) => true ++ (zerop 0/100) => true ++ (zerop #c(0 0.0)) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if number is not a number. ++ ++Notes:: ++....... ++ ++ (zerop number) == (= number 0) ++ ++ ++File: gcl.info, Node: floor, Next: sin, Prev: zerop, Up: Numbers Dictionary ++ ++12.2.19 floor, ffloor, ceiling, fceiling, ++----------------------------------------- ++ ++truncate, ftruncate, round, fround ++---------------------------------- ++ ++ [Function] ++ ++ 'floor' number &optional divisor => quotient, remainder ++ ++ 'ffloor' number &optional divisor => quotient, remainder ++ ++ 'ceiling' number &optional divisor => quotient, remainder ++ ++ 'fceiling' number &optional divisor => quotient, remainder ++ ++ 'truncate' number &optional divisor => quotient, remainder ++ ++ 'ftruncate' number &optional divisor => quotient, remainder ++ ++ 'round' number &optional divisor => quotient, remainder ++ ++ 'fround' number &optional divisor => quotient, remainder ++ ++Arguments and Values:: ++...................... ++ ++number--a real. ++ ++ divisor--a non-zero real. The default is the integer 1. ++ ++ quotient--for floor, ceiling, truncate, and round: an integer; for ++ffloor, fceiling, ftruncate, and fround: a float. ++ ++ remainder--a real. ++ ++Description:: ++............. ++ ++These functions divide number by divisor, returning a quotient and ++remainder, such that ++ ++ quotient\cdot divisor+remainder=number ++ ++ The quotient always represents a mathematical integer. When more ++than one mathematical integer might be possible (i.e., when the ++remainder is not zero), the kind of rounding or truncation depends on ++the operator: ++ ++floor, ffloor ++ floor and ffloor produce a quotient that has been truncated toward ++ negative infinity; that is, the quotient represents the largest ++ mathematical integer that is not larger than the mathematical ++ quotient. ++ ++ceiling, fceiling ++ ceiling and fceiling produce a quotient that has been truncated ++ toward positive infinity; that is, the quotient represents the ++ smallest mathematical integer that is not smaller than the ++ mathematical result. ++ ++truncate, ftruncate ++ truncate and ftruncate produce a quotient that has been truncated ++ towards zero; that is, the quotient represents the mathematical ++ integer of the same sign as the mathematical quotient, and that has ++ the greatest integral magnitude not greater than that of the ++ mathematical quotient. ++ ++round, fround ++ round and fround produce a quotient that has been rounded to the ++ nearest mathematical integer; if the mathematical quotient is ++ exactly halfway between two integers, (that is, it has the form ++ integer+1\over2), then the quotient has been rounded to the even ++ (divisible by two) integer. ++ ++ All of these functions perform type conversion operations on numbers. ++ ++ The remainder is an integer if both x and y are integers, is a ++rational if both x and y are rationals, and is a float if either x or y ++is a float. ++ ++ ffloor, fceiling, ftruncate, and fround handle arguments of different ++types in the following way: If number is a float, and divisor is not a ++float of longer format, then the first result is a float of the same ++type as number. Otherwise, the first result is of the type determined ++by contagion rules; see *note Contagion in Numeric Operations::. ++ ++Examples:: ++.......... ++ ++ (floor 3/2) => 1, 1/2 ++ (ceiling 3 2) => 2, -1 ++ (ffloor 3 2) => 1.0, 1 ++ (ffloor -4.7) => -5.0, 0.3 ++ (ffloor 3.5d0) => 3.0d0, 0.5d0 ++ (fceiling 3/2) => 2.0, -1/2 ++ (truncate 1) => 1, 0 ++ (truncate .5) => 0, 0.5 ++ (round .5) => 0, 0.5 ++ (ftruncate -7 2) => -3.0, -1 ++ (fround -7 2) => -4.0, 1 ++ (dolist (n '(2.6 2.5 2.4 0.7 0.3 -0.3 -0.7 -2.4 -2.5 -2.6)) ++ (format t "~&~4,1@F ~2,' D ~2,' D ~2,' D ~2,' D" ++ n (floor n) (ceiling n) (truncate n) (round n))) ++ |> +2.6 2 3 2 3 ++ |> +2.5 2 3 2 2 ++ |> +2.4 2 3 2 2 ++ |> +0.7 0 1 0 1 ++ |> +0.3 0 1 0 0 ++ |> -0.3 -1 0 0 0 ++ |> -0.7 -1 0 0 -1 ++ |> -2.4 -3 -2 -2 -2 ++ |> -2.5 -3 -2 -2 -2 ++ |> -2.6 -3 -2 -2 -3 ++ => NIL ++ ++Notes:: ++....... ++ ++When only number is given, the two results are exact; the mathematical ++sum of the two results is always equal to the mathematical value of ++number. ++ ++ (function number divisor) and (function (/ number divisor)) (where ++function is any of one of floor, ceiling, ffloor, fceiling, truncate, ++round, ftruncate, and fround) return the same first value, but they ++return different remainders as the second value. For example: ++ ++ (floor 5 2) => 2, 1 ++ (floor (/ 5 2)) => 2, 1/2 ++ ++ If an effect is desired that is similar to round, but that always ++rounds up or down (rather than toward the nearest even integer) if the ++mathematical quotient is exactly halfway between two integers, the ++programmer should consider a construction such as (floor (+ x 1/2)) or ++(ceiling (- x 1/2)). ++ ++ ++File: gcl.info, Node: sin, Next: asin, Prev: floor, Up: Numbers Dictionary ++ ++12.2.20 sin, cos, tan [Function] ++-------------------------------- ++ ++'sin' radians => number ++ ++ 'cos' radians => number ++ ++ 'tan' radians => number ++ ++Arguments and Values:: ++...................... ++ ++radians--a number given in radians. ++ ++ number--a number. ++ ++Description:: ++............. ++ ++sin, cos, and tan return the sine, cosine, and tangent, respectively, of ++radians. ++ ++Examples:: ++.......... ++ ++ (sin 0) => 0.0 ++ (cos 0.7853982) => 0.707107 ++ (tan #c(0 1)) => #C(0.0 0.761594) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if radians is not a number. ++Might signal arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note asin:: , acos, atan, *note Rule of Float Substitutability:: ++ ++ ++File: gcl.info, Node: asin, Next: pi, Prev: sin, Up: Numbers Dictionary ++ ++12.2.21 asin, acos, atan [Function] ++----------------------------------- ++ ++'asin' number => radians ++ ++ 'acos' number => radians ++ ++ 'atan' number1 &optional number2 => radians ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ number1--a number if number2 is not supplied, or a real if number2 is ++supplied. ++ ++ number2--a real. ++ ++ radians--a number (of radians). ++ ++Description:: ++............. ++ ++asin, acos, and atan compute the arc sine, arc cosine, and arc tangent ++respectively. ++ ++ The arc sine, arc cosine, and arc tangent (with only number1 ++supplied) functions can be defined mathematically for number or number1 ++specified as x as in Figure 12-13. ++ ++ Function Definition ++ Arc sine -i log (ix+ \sqrt1-x^2 ) ++ Arc cosine (\pi/2) - arcsin x ++ Arc tangent -i log ((1+ix) \sqrt1/(1+x^2) ) ++ ++ Figure 12-13: Mathematical definition of arc sine, arc cosine, and arc tangent ++ ++ ++ These formulae are mathematically correct, assuming completely ++accurate computation. They are not necessarily the simplest ones for ++real-valued computations. ++ ++ If both number1 and number2 are supplied for atan, the result is the ++arc tangent of number1/number2. The value of atan is always between ++-\pi (exclusive) and~\pi (inclusive) ++ ++ when minus zero is not supported. The range of the two-argument arc ++tangent when minus zero is supported includes -\pi. ++ ++ For a ++ ++ real ++ ++ number1, the result is ++ ++ a real ++ ++ and lies between -\pi/2 and~\pi/2 (both exclusive). number1 can be a ++complex if number2 is not supplied. If both are supplied, number2 can ++be zero provided number1 is not zero. ++ ++ [Reviewer Note by Barmar: Should add "However, if the implementation ++distinguishes positive and negative zero, both may be signed zeros, and ++limits are used to define the result."] ++ ++ The following definition for arc sine determines the range and branch ++cuts: ++ ++ arcsin z = -i log (iz+\sqrt1-z^2\Bigr) ++ ++ The branch cut for the arc sine function is in two pieces: one along ++the negative real axis to the left of~-1 (inclusive), continuous with ++quadrant II, and one along the positive real axis to the right of~1 ++(inclusive), continuous with quadrant IV. The range is that strip of the ++complex plane containing numbers whose real part is between -\pi/2 ++and~\pi/2. A number with real part equal to -\pi/2 is in the range if ++and only if its imaginary part is non-negative; a number with real part ++equal to \pi/2 is in the range if and only if its imaginary part is ++non-positive. ++ ++ The following definition for arc cosine determines the range and ++branch cuts: ++ ++ arccos z = \pi\over2 - arcsin z ++ ++ or, which are equivalent, ++ ++ arccos z = -i log (z+i \sqrt1-z^2\Bigr) ++ ++ arccos z = 2 log (\sqrt(1+z)/2 + i \sqrt(1-z)/2)\overi ++ ++ The branch cut for the arc cosine function is in two pieces: one ++along the negative real axis to the left of~-1 (inclusive), continuous ++with quadrant II, and one along the positive real axis to the right of~1 ++(inclusive), continuous with quadrant IV. This is the same branch cut as ++for arc sine. The range is that strip of the complex plane containing ++numbers whose real part is between 0 and~\pi. A number with real part ++equal to 0 is in the range if and only if its imaginary part is ++non-negative; a number with real part equal to \pi is in the range if ++and only if its imaginary part is non-positive. ++ ++ The following definition for (one-argument) arc tangent determines ++the range and branch cuts: ++ ++ arctan z = log (1+iz) - log (1-iz)\over2i ++ ++ Beware of simplifying this formula; "obvious" simplifications are ++likely to alter the branch cuts or the values on the branch cuts ++incorrectly. The branch cut for the arc tangent function is in two ++pieces: one along the positive imaginary axis above i (exclusive), ++continuous with quadrant II, and one along the negative imaginary axis ++below -i (exclusive), continuous with quadrant IV. The points i and~-i ++are excluded from the domain. The range is that strip of the complex ++plane containing numbers whose real part is between -\pi/2 and~\pi/2. A ++number with real part equal to -\pi/2 is in the range if and only if its ++imaginary part is strictly positive; a number with real part equal to ++\pi/2 is in the range if and only if its imaginary part is strictly ++negative. Thus the range of arc tangent is identical to that of arc ++sine with the points -\pi/2 and~\pi/2 excluded. ++ ++ For atan, the signs of number1 (indicated as x) and number2 ++(indicated as y) are used to derive quadrant information. Figure 12-14 ++details various special cases. ++ ++ The asterisk (*) indicates that the entry in the figure applies to ++implementations that support minus zero. ++ ++ to 1pcy Condition x Condition Cartesian locus Range of result ++ to 1pc y = 0 x > 0 Positive x-axis 0 ++ to 1pc* y = +0 x > 0 Positive x-axis +0 ++ to 1pc* y = -0 x > 0 Positive x-axis -0 ++ to 1pc y > 0 x > 0 Quadrant I 0 < result < \pi/2 ++ to 1pc y > 0 x = 0 Positive y-axis \pi/2 ++ to 1pc y > 0 x < 0 Quadrant II \pi/2 < result < \pi ++ to 1pc y = 0 x < 0 Negative x-axis \pi ++ to 1pc* y = +0 x < 0 Negative x-axis +\pi ++ to 1pc* y = -0 x < 0 Negative x-axis -\pi ++ to 1pc y < 0 x < 0 Quadrant III -\pi < result < -\pi/2 ++ to 1pc y < 0 x = 0 Negative y-axis -\pi/2 ++ to 1pc y < 0 x > 0 Quadrant IV -\pi/2 < result < 0 ++ to 1pc y = 0 x = 0 Origin undefined consequences ++ to 1pc* y = +0 x = +0 Origin +0 ++ to 1pc* y = -0 x = +0 Origin -0 ++ to 1pc* y = +0 x = -0 Origin +\pi ++ to 1pc* y = -0 x = -0 Origin -\pi ++ ++ Figure 12-14: Quadrant information for arc tangent ++ ++ ++Examples:: ++.......... ++ ++ (asin 0) => 0.0 ++ (acos #c(0 1)) => #C(1.5707963267948966 -0.8813735870195432) ++ (/ (atan 1 (sqrt 3)) 6) => 0.087266 ++ (atan #c(0 2)) => #C(-1.5707964 0.54930615) ++ ++Exceptional Situations:: ++........................ ++ ++acos and asin should signal an error of type type-error if number is not ++a number. atan should signal type-error if one argument is supplied and ++that argument is not a number, or if two arguments are supplied and both ++of those arguments are not reals. ++ ++ acos, asin, and atan might signal arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note log:: , *note sqrt:: , *note Rule of Float Substitutability:: ++ ++Notes:: ++....... ++ ++The result of either asin or acos can be a complex even if number is not ++a complex; this occurs when the absolute value of number is greater than ++one. ++ ++ ++File: gcl.info, Node: pi, Next: sinh, Prev: asin, Up: Numbers Dictionary ++ ++12.2.22 pi [Constant Variable] ++------------------------------ ++ ++Value:: ++....... ++ ++an implementation-dependent long float. ++ ++Description:: ++............. ++ ++The best long float approximation to the mathematical constant \pi. ++ ++Examples:: ++.......... ++ ++ ;; In each of the following computations, the precision depends ++ ;; on the implementation. Also, if `long float' is treated by ++ ;; the implementation as equivalent to some other float format ++ ;; (e.g., `double float') the exponent marker might be the marker ++ ;; for that equivalent (e.g., `D' instead of `L'). ++ pi => 3.141592653589793L0 ++ (cos pi) => -1.0L0 ++ ++ (defun sin-of-degrees (degrees) ++ (let ((x (if (floatp degrees) degrees (float degrees pi)))) ++ (sin (* x (/ (float pi x) 180))))) ++ ++Notes:: ++....... ++ ++An approximation to \pi in some other precision can be obtained by ++writing (float pi x), where x is a float of the desired precision, or by ++writing (coerce pi type), where type is the desired type, such as ++short-float. ++ ++ ++File: gcl.info, Node: sinh, Next: *, Prev: pi, Up: Numbers Dictionary ++ ++12.2.23 sinh, cosh, tanh, asinh, acosh, atanh [Function] ++-------------------------------------------------------- ++ ++'sinh' number => result ++ ++ 'cosh' number => result ++ ++ 'tanh' number => result ++ ++ 'asinh' number => result ++ ++ 'acosh' number => result ++ ++ 'atanh' number => result ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ result--a number. ++ ++Description:: ++............. ++ ++These functions compute the hyperbolic sine, cosine, tangent, arc sine, ++arc cosine, and arc tangent functions, which are mathematically defined ++for an argument x as given in Figure 12-15. ++ ++ Function Definition ++ Hyperbolic sine (e^x-e^-x)/2 ++ Hyperbolic cosine (e^x+e^-x)/2 ++ Hyperbolic tangent (e^x-e^-x)/(e^x+e^-x) ++ Hyperbolic arc sine log (x+\sqrt1+x^2) ++ Hyperbolic arc cosine 2 log (\sqrt(x+1)/2 + \sqrt(x-1)/2) ++ Hyperbolic arc tangent (log (1+x) - log (1-x))/2 ++ ++ Figure 12-15: Mathematical definitions for hyperbolic functions ++ ++ ++ The following definition for the inverse hyperbolic cosine determines ++the range and branch cuts: ++ ++ arccosh z = 2 log (\sqrt(z+1)/2 + \sqrt(z-1)/2\Bigr). ++ ++ The branch cut for the inverse hyperbolic cosine function lies along ++the real axis to the left of~1 (inclusive), extending indefinitely along ++the negative real axis, continuous with quadrant II and (between 0 ++and~1) with quadrant I. The range is that half-strip of the complex ++plane containing numbers whose real part is non-negative and whose ++imaginary part is between -\pi (exclusive) and~\pi (inclusive). A ++number with real part zero is in the range if its imaginary part is ++between zero (inclusive) and~\pi (inclusive). ++ ++ The following definition for the inverse hyperbolic sine determines ++the range and branch cuts: ++ ++ arcsinh z = log (z+\sqrt1+z^2\Bigr). ++ ++ The branch cut for the inverse hyperbolic sine function is in two ++pieces: one along the positive imaginary axis above i (inclusive), ++continuous with quadrant I, and one along the negative imaginary axis ++below -i (inclusive), continuous with quadrant III. The range is that ++strip of the complex plane containing numbers whose imaginary part is ++between -\pi/2 and~\pi/2. A number with imaginary part equal to -\pi/2 ++is in the range if and only if its real part is non-positive; a number ++with imaginary part equal to \pi/2 is in the range if and only if its ++imaginary part is non-negative. ++ ++ The following definition for the inverse hyperbolic tangent ++determines the range and branch cuts: ++ ++ arctanh z = log (1+z) - log (1-z)\over2. ++ ++ Note that: ++ ++ i arctan z = arctanh iz. ++ ++ The branch cut for the inverse hyperbolic tangent function is in two ++pieces: one along the negative real axis to the left of -1 (inclusive), ++continuous with quadrant III, and one along the positive real axis to ++the right of~1 (inclusive), continuous with quadrant I. The points -1 ++and~1 are excluded from the domain. The range is that strip of the ++complex plane containing numbers whose imaginary part is between -\pi/2 ++and \pi/2. A number with imaginary part equal to -\pi/2 is in the range ++if and only if its real part is strictly negative; a number with ++imaginary part equal to \pi/2 is in the range if and only if its ++imaginary part is strictly positive. Thus the range of the inverse ++hyperbolic tangent function is identical to that of the inverse ++hyperbolic sine function with the points -\pi i/2 and~\pi i/2 excluded. ++ ++Examples:: ++.......... ++ ++ (sinh 0) => 0.0 ++ (cosh (complex 0 -1)) => #C(0.540302 -0.0) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if number is not a number. ++Might signal arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note log:: , *note sqrt:: , *note Rule of Float Substitutability:: ++ ++Notes:: ++....... ++ ++The result of acosh may be a complex even if number is not a complex; ++this occurs when number is less than one. Also, the result of atanh may ++be a complex even if number is not a complex; this occurs when the ++absolute value of number is greater than one. ++ ++ The branch cut formulae are mathematically correct, assuming ++completely accurate computation. Implementors should consult a good ++text on numerical analysis. The formulae given above are not ++necessarily the simplest ones for real-valued computations; they are ++chosen to define the branch cuts in desirable ways for the complex case. ++ ++ ++File: gcl.info, Node: *, Next: +, Prev: sinh, Up: Numbers Dictionary ++ ++12.2.24 * [Function] ++-------------------- ++ ++'*' &rest numbers => product ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ product--a number. ++ ++Description:: ++............. ++ ++Returns the product of numbers, performing any necessary type ++conversions in the process. If no numbers are supplied, 1 is returned. ++ ++Examples:: ++.......... ++ ++ (*) => 1 ++ (* 3 5) => 15 ++ (* 1.0 #c(22 33) 55/98) => #C(12.346938775510203 18.520408163265305) ++ ++Exceptional Situations:: ++........................ ++ ++Might signal type-error if some argument is not a number. Might signal ++arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note Numeric Operations::, *note Rational Computations::, *note ++Floating-point Computations::, *note Complex Computations:: ++ ++ ++File: gcl.info, Node: +, Next: -, Prev: *, Up: Numbers Dictionary ++ ++12.2.25 + [Function] ++-------------------- ++ ++'+' &rest numbers => sum ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ sum--a number. ++ ++Description:: ++............. ++ ++Returns the sum of numbers, performing any necessary type conversions in ++the process. If no numbers are supplied, 0 is returned. ++ ++Examples:: ++.......... ++ ++ (+) => 0 ++ (+ 1) => 1 ++ (+ 31/100 69/100) => 1 ++ (+ 1/5 0.8) => 1.0 ++ ++Exceptional Situations:: ++........................ ++ ++Might signal type-error if some argument is not a number. Might signal ++arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note Numeric Operations::, *note Rational Computations::, *note ++Floating-point Computations::, *note Complex Computations:: ++ ++ ++File: gcl.info, Node: -, Next: /, Prev: +, Up: Numbers Dictionary ++ ++12.2.26 - [Function] ++-------------------- ++ ++'-' number => negation ++ ++ '-' minuend &rest subtrahends^+ => difference ++ ++Arguments and Values:: ++...................... ++ ++number, minuend, subtrahend--a number. ++ ++ negation, difference--a number. ++ ++Description:: ++............. ++ ++The function - performs arithmetic subtraction and negation. ++ ++ If only one number is supplied, the negation of that number is ++returned. ++ ++ If more than one argument is given, it subtracts all of the ++subtrahends from the minuend and returns the result. ++ ++ The function - performs necessary type conversions. ++ ++Examples:: ++.......... ++ ++ (- 55.55) => -55.55 ++ (- #c(3 -5)) => #C(-3 5) ++ (- 0) => 0 ++ (eql (- 0.0) -0.0) => true ++ (- #c(100 45) #c(0 45)) => 100 ++ (- 10 1 2 3 4) => 0 ++ ++Exceptional Situations:: ++........................ ++ ++Might signal type-error if some argument is not a number. Might signal ++arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note Numeric Operations::, *note Rational Computations::, *note ++Floating-point Computations::, *note Complex Computations:: ++ ++ ++File: gcl.info, Node: /, Next: 1+, Prev: -, Up: Numbers Dictionary ++ ++12.2.27 / [Function] ++-------------------- ++ ++'/' number => reciprocal ++ ++ '/' numerator &rest denominators^+ => quotient ++ ++Arguments and Values:: ++...................... ++ ++number, denominator--a non-zero number. ++ ++ numerator, quotient, reciprocal--a number. ++ ++Description:: ++............. ++ ++The function / performs division or reciprocation. ++ ++ If no denominators are supplied, the function / returns the ++reciprocal of number. ++ ++ If at least one denominator is supplied, the function / divides the ++numerator by all of the denominators and returns the resulting quotient. ++ ++ If each argument is either an integer or a ratio, and the result is ++not an integer, then it is a ratio. ++ ++ The function / performs necessary type conversions. ++ ++ If any argument is a float then the rules of floating-point contagion ++apply; see *note Floating-point Computations::. ++ ++Examples:: ++.......... ++ ++ (/ 12 4) => 3 ++ (/ 13 4) => 13/4 ++ (/ -8) => -1/8 ++ (/ 3 4 5) => 3/20 ++ (/ 0.5) => 2.0 ++ (/ 20 5) => 4 ++ (/ 5 20) => 1/4 ++ (/ 60 -2 3 5.0) => -2.0 ++ (/ 2 #c(2 2)) => #C(1/2 -1/2) ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are unspecified if any argument other than the first is ++zero. If there is only one argument, the consequences are unspecified ++if it is zero. ++ ++ Might signal type-error if some argument is not a number. Might ++signal division-by-zero if division by zero is attempted. Might signal ++arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note floor:: , ceiling, truncate, round ++ ++ ++File: gcl.info, Node: 1+, Next: abs, Prev: /, Up: Numbers Dictionary ++ ++12.2.28 1+, 1- [Function] ++------------------------- ++ ++'1' + => number successor '1' - => number predecessor ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ successor, predecessor--a number. ++ ++Description:: ++............. ++ ++1+ returns a number that is one more than its argument number. 1- ++returns a number that is one less than its argument number. ++ ++Examples:: ++.......... ++ ++ (1+ 99) => 100 ++ (1- 100) => 99 ++ (1+ (complex 0.0)) => #C(1.0 0.0) ++ (1- 5/3) => 2/3 ++ ++Exceptional Situations:: ++........................ ++ ++Might signal type-error if its argument is not a number. Might signal ++arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note incf:: , decf ++ ++Notes:: ++....... ++ ++ (1+ number) == (+ number 1) ++ (1- number) == (- number 1) ++ ++ Implementors are encouraged to make the performance of both the ++previous expressions be the same. ++ ++ ++File: gcl.info, Node: abs, Next: evenp, Prev: 1+, Up: Numbers Dictionary ++ ++12.2.29 abs [Function] ++---------------------- ++ ++'abs' number => absolute-value ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ absolute-value--a non-negative real. ++ ++Description:: ++............. ++ ++abs returns the absolute value of number. ++ ++ If number is ++ ++ a real, ++ ++ the result is of the same type as number. ++ ++ If number is a complex, the result is a positive ++ ++ real ++ ++ with the same magnitude as number. The result can be a float ++ ++ [Reviewer Note by Barmar: Single-float.] even if number's components ++are rationals and an exact rational result would have been possible. ++Thus the result of (abs #c(3 4)) can be either 5 or 5.0, depending on ++the implementation. ++ ++Examples:: ++.......... ++ ++ (abs 0) => 0 ++ (abs 12/13) => 12/13 ++ (abs -1.09) => 1.09 ++ (abs #c(5.0 -5.0)) => 7.071068 ++ (abs #c(5 5)) => 7.071068 ++ (abs #c(3/5 4/5)) => 1 or approximately 1.0 ++ (eql (abs -0.0) -0.0) => true ++ ++See Also:: ++.......... ++ ++*note Rule of Float Substitutability:: ++ ++Notes:: ++....... ++ ++If number is a complex, the result is equivalent to the following: ++ ++ (sqrt (+ (expt (realpart number) 2) (expt (imagpart number) 2))) ++ ++ An implementation should not use this formula directly for all ++complexes but should handle very large or very small components ++specially to avoid intermediate overflow or underflow. ++ ++ ++File: gcl.info, Node: evenp, Next: exp, Prev: abs, Up: Numbers Dictionary ++ ++12.2.30 evenp, oddp [Function] ++------------------------------ ++ ++'evenp' integer => generalized-boolean ++ ++ 'oddp' integer => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++integer--an integer. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++evenp returns true if integer is even (divisible by two); otherwise, ++returns false. ++ ++ oddp returns true if integer is odd (not divisible by two); ++otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (evenp 0) => true ++ (oddp 10000000000000000000000) => false ++ (oddp -1) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if integer is not an integer. ++ ++Notes:: ++....... ++ ++ (evenp integer) == (not (oddp integer)) ++ (oddp integer) == (not (evenp integer)) ++ ++ ++File: gcl.info, Node: exp, Next: gcd, Prev: evenp, Up: Numbers Dictionary ++ ++12.2.31 exp, expt [Function] ++---------------------------- ++ ++'exp' number => result ++ ++ 'expt' base-number power-number => result ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ base-number--a number. ++ ++ power-number--a number. ++ ++ result--a number. ++ ++Description:: ++............. ++ ++exp and expt perform exponentiation. ++ ++ exp returns e raised to the power number, where e is the base of the ++natural logarithms. exp has no branch cut. ++ ++ expt returns base-number raised to the power power-number. If the ++base-number is a rational and power-number is an integer, the ++calculation is exact and the result will be of type rational; otherwise ++a floating-point approximation might result. ++ ++ For expt of a complex rational to an integer power, the calculation ++must be exact and the result is of type (or rational (complex ++rational)). ++ ++ The result of expt can be a complex, even when neither argument is a ++complex, if base-number is negative and power-number is not an integer. ++The result is always the principal complex value. For example, (expt -8 ++1/3) is not permitted to return -2, even though -2 is one of the cube ++roots of -8. The principal cube root is a complex approximately equal ++to #C(1.0 1.73205), not -2. ++ ++ expt is defined as b^x = e^x log b\/. This defines the principal ++values precisely. The range of expt is the entire complex plane. ++Regarded as a function of x, with b fixed, there is no branch cut. ++Regarded as a function of b, with x fixed, there is in general a branch ++cut along the negative real axis, continuous with quadrant II. The ++domain excludes the origin. By definition, 0^0=1. If b=0 and the real ++part of x is strictly positive, then b^x=0. For all other values of x, ++0^x is an error. ++ ++ When power-number is an integer 0, then the result is always the ++value one in the type of base-number, even if the base-number is zero ++(of any type). That is: ++ ++ (expt x 0) == (coerce 1 (type-of x)) ++ ++ If power-number is a zero of any other type, then the result is also ++the value one, in the type of the arguments after the application of the ++contagion rules in *note Contagion in Numeric Operations::, with one ++exception: the consequences are undefined if base-number is zero when ++power-number is zero and not of type integer. ++ ++Examples:: ++.......... ++ ++ (exp 0) => 1.0 ++ (exp 1) => 2.718282 ++ (exp (log 5)) => 5.0 ++ (expt 2 8) => 256 ++ (expt 4 .5) => 2.0 ++ (expt #c(0 1) 2) => -1 ++ (expt #c(2 2) 3) => #C(-16 16) ++ (expt #c(2 2) 4) => -64 ++ ++See Also:: ++.......... ++ ++*note log:: , *note Rule of Float Substitutability:: ++ ++Notes:: ++....... ++ ++Implementations of expt are permitted to use different algorithms for ++the cases of a power-number of type rational and a power-number of type ++float. ++ ++ Note that by the following logic, (sqrt (expt x 3)) is not equivalent ++to (expt x 3/2). ++ ++ (setq x (exp (/ (* 2 pi #c(0 1)) 3))) ;exp(2.pi.i/3) ++ (expt x 3) => 1 ;except for round-off error ++ (sqrt (expt x 3)) => 1 ;except for round-off error ++ (expt x 3/2) => -1 ;except for round-off error ++ ++ ++File: gcl.info, Node: gcd, Next: incf, Prev: exp, Up: Numbers Dictionary ++ ++12.2.32 gcd [Function] ++---------------------- ++ ++'gcd' &rest integers => greatest-common-denominator ++ ++Arguments and Values:: ++...................... ++ ++integer--an integer. ++ ++ greatest-common-denominator--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the greatest common divisor of integers. If only one integer is ++supplied, its absolute value is returned. If no integers are given, gcd ++returns 0, which is an identity for this operation. ++ ++Examples:: ++.......... ++ ++ (gcd) => 0 ++ (gcd 60 42) => 6 ++ (gcd 3333 -33 101) => 1 ++ (gcd 3333 -33 1002001) => 11 ++ (gcd 91 -49) => 7 ++ (gcd 63 -42 35) => 7 ++ (gcd 5) => 5 ++ (gcd -4) => 4 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if any integer is not an ++integer. ++ ++See Also:: ++.......... ++ ++*note lcm:: ++ ++Notes:: ++....... ++ ++For three or more arguments, ++ ++ (gcd b c ... z) == (gcd (gcd a b) c ... z) ++ ++ ++File: gcl.info, Node: incf, Next: lcm, Prev: gcd, Up: Numbers Dictionary ++ ++12.2.33 incf, decf [Macro] ++-------------------------- ++ ++'incf' place [delta-form] => new-value ++ ++ 'decf' place [delta-form] => new-value ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++ delta-form--a form; evaluated to produce a delta. The default is 1. ++ ++ delta--a number. ++ ++ new-value--a number. ++ ++Description:: ++............. ++ ++incf and decf are used for incrementing and decrementing the value of ++place, respectively. ++ ++ The delta is added to (in the case of incf) or subtracted from (in ++the case of decf) the number in place and the result is stored in place. ++ ++ Any necessary type conversions are performed automatically. ++ ++ For information about the evaluation of subforms of places, see *note ++Evaluation of Subforms to Places::. ++ ++Examples:: ++.......... ++ ++ (setq n 0) ++ (incf n) => 1 ++ n => 1 ++ (decf n 3) => -2 ++ n => -2 ++ (decf n -5) => 3 ++ (decf n) => 2 ++ (incf n 0.5) => 2.5 ++ (decf n) => 1.5 ++ n => 1.5 ++ ++Side Effects:: ++.............. ++ ++Place is modified. ++ ++See Also:: ++.......... ++ +++, *note -:: , 1+, 1-, *note setf:: ++ ++ ++File: gcl.info, Node: lcm, Next: log, Prev: incf, Up: Numbers Dictionary ++ ++12.2.34 lcm [Function] ++---------------------- ++ ++'lcm' &rest integers => least-common-multiple ++ ++Arguments and Values:: ++...................... ++ ++integer--an integer. ++ ++ least-common-multiple--a non-negative integer. ++ ++Description:: ++............. ++ ++lcm returns the least common multiple of the integers. ++ ++ If no integer is supplied, the integer 1 is returned. ++ ++ If only one integer is supplied, the absolute value of that integer ++is returned. ++ ++ For two arguments that are not both zero, ++ ++ (lcm a b) == (/ (abs (* a b)) (gcd a b)) ++ ++ If one or both arguments are zero, ++ ++ (lcm a 0) == (lcm 0 a) == 0 ++ ++ For three or more arguments, ++ ++ (lcm a b c ... z) == (lcm (lcm a b) c ... z) ++ ++Examples:: ++.......... ++ ++ (lcm 10) => 10 ++ (lcm 25 30) => 150 ++ (lcm -24 18 10) => 360 ++ (lcm 14 35) => 70 ++ (lcm 0 5) => 0 ++ (lcm 1 2 3 4 5 6) => 60 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if any argument is not an integer. ++ ++See Also:: ++.......... ++ ++*note gcd:: ++ ++ ++File: gcl.info, Node: log, Next: mod (Function), Prev: lcm, Up: Numbers Dictionary ++ ++12.2.35 log [Function] ++---------------------- ++ ++'log' number &optional base => logarithm ++ ++Arguments and Values:: ++...................... ++ ++number--a non-zero number. ++ ++ base--a number. ++ ++ logarithm--a number. ++ ++Description:: ++............. ++ ++log returns the logarithm of number in base base. If base is not ++supplied its value is e, the base of the natural logarithms. ++ ++ log may return a complex when given a ++ ++ real ++ ++ negative number. ++ ++ (log -1.0) == (complex 0.0 (float pi 0.0)) ++ ++ If base is zero, log returns zero. ++ ++ The result of (log 8 2) may be either 3 or 3.0, depending on the ++implementation. An implementation can use floating-point calculations ++even if an exact integer result is possible. ++ ++ The branch cut for the logarithm function of one argument (natural ++logarithm) lies along the negative real axis, continuous with quadrant ++II. The domain excludes the origin. ++ ++ The mathematical definition of a complex logarithm is as follows, ++whether or not minus zero is supported by the implementation: ++ ++ (log x) == (complex (log (abs x)) (phase x)) ++ ++ Therefore the range of the one-argument logarithm function is that ++strip of the complex plane containing numbers with imaginary parts ++between ++ ++ -\pi (exclusive) and~\pi (inclusive) if minus zero is not supported, ++or -\pi (inclusive) and~\pi (inclusive) if minus zero is supported. ++ ++ The two-argument logarithm function is defined as ++ ++ (log base number) ++ == (/ (log number) (log base)) ++ ++ This defines the principal values precisely. The range of the ++two-argument logarithm function is the entire complex plane. ++ ++Examples:: ++.......... ++ ++ (log 100 10) ++ => 2.0 ++ => 2 ++ (log 100.0 10) => 2.0 ++ (log #c(0 1) #c(0 -1)) ++ => #C(-1.0 0.0) ++ OR=> #C(-1 0) ++ (log 8.0 2) => 3.0 ++ ++ (log #c(-16 16) #c(2 2)) => 3 or approximately #c(3.0 0.0) ++ or approximately 3.0 (unlikely) ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++See Also:: ++.......... ++ ++*note exp:: , expt, *note Rule of Float Substitutability:: ++ ++ ++File: gcl.info, Node: mod (Function), Next: signum, Prev: log, Up: Numbers Dictionary ++ ++12.2.36 mod, rem [Function] ++--------------------------- ++ ++'mod' number divisor => modulus ++ ++ 'rem' number divisor => remainder ++ ++Arguments and Values:: ++...................... ++ ++number--a real. ++ ++ divisor--a real. ++ ++ modulus, remainder--a real. ++ ++Description:: ++............. ++ ++mod and rem are generalizations of the modulus and remainder functions ++respectively. ++ ++ mod performs the operation floor on number and divisor and returns ++the remainder of the floor operation. ++ ++ rem performs the operation truncate on number and divisor and returns ++the remainder of the truncate operation. ++ ++ mod and rem are the modulus and remainder functions when number and ++divisor are integers. ++ ++Examples:: ++.......... ++ ++ (rem -1 5) => -1 ++ (mod -1 5) => 4 ++ (mod 13 4) => 1 ++ (rem 13 4) => 1 ++ (mod -13 4) => 3 ++ (rem -13 4) => -1 ++ (mod 13 -4) => -3 ++ (rem 13 -4) => 1 ++ (mod -13 -4) => -1 ++ (rem -13 -4) => -1 ++ (mod 13.4 1) => 0.4 ++ (rem 13.4 1) => 0.4 ++ (mod -13.4 1) => 0.6 ++ (rem -13.4 1) => -0.4 ++ ++See Also:: ++.......... ++ ++*note floor:: , truncate ++ ++Notes:: ++....... ++ ++The result of mod is either zero or a ++ ++ real ++ ++ with the same sign as divisor. ++ ++ ++File: gcl.info, Node: signum, Next: sqrt, Prev: mod (Function), Up: Numbers Dictionary ++ ++12.2.37 signum [Function] ++------------------------- ++ ++'signum' number => signed-prototype ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ signed-prototype--a number. ++ ++Description:: ++............. ++ ++signum determines a numerical value that indicates whether number is ++negative, zero, or positive. ++ ++ For a rational, signum returns one of -1, 0, or 1 according to ++whether number is negative, zero, or positive. For a float, the result ++is a float of the same format whose value is minus one, zero, or one. ++For a complex number z, (signum z) is a complex number of the same phase ++but with unit magnitude, unless z is a complex zero, in which case the ++result is z. ++ ++ For rational arguments, signum is a rational function, but it may be ++irrational for complex arguments. ++ ++ If number is a float, the result is a float. If number is a ++rational, the result is a rational. If number is a complex float, the ++result is a complex float. If number is a complex rational, the result ++is a complex, but it is implementation-dependent whether that result is ++a complex rational or a complex float. ++ ++Examples:: ++.......... ++ ++ (signum 0) => 0 ++ (signum 99) => 1 ++ (signum 4/5) => 1 ++ (signum -99/100) => -1 ++ (signum 0.0) => 0.0 ++ (signum #c(0 33)) => #C(0.0 1.0) ++ (signum #c(7.5 10.0)) => #C(0.6 0.8) ++ (signum #c(0.0 -14.7)) => #C(0.0 -1.0) ++ (eql (signum -0.0) -0.0) => true ++ ++See Also:: ++.......... ++ ++*note Rule of Float Substitutability:: ++ ++Notes:: ++....... ++ ++ (signum x) == (if (zerop x) x (/ x (abs x))) ++ ++ ++File: gcl.info, Node: sqrt, Next: random-state, Prev: signum, Up: Numbers Dictionary ++ ++12.2.38 sqrt, isqrt [Function] ++------------------------------ ++ ++'sqrt' number => root ++ ++ 'isqrt' natural => natural-root ++ ++Arguments and Values:: ++...................... ++ ++number, root--a number. ++ ++ natural, natural-root--a non-negative integer. ++ ++Description:: ++............. ++ ++sqrt and isqrt compute square roots. ++ ++ sqrt returns the principal square root of number. If the number is ++not a complex but is negative, then the result is a complex. ++ ++ isqrt returns the greatest integer less than or equal to the exact ++positive square root of natural. ++ ++ If number is a positive rational, it is implementation-dependent ++whether root is a rational or a float. If number is a negative ++rational, it is implementation-dependent whether root is a complex ++rational or a complex float. ++ ++ The mathematical definition of complex square root (whether or not ++minus zero is supported) follows: ++ ++ (sqrt x) = (exp (/ (log x) 2)) ++ ++ The branch cut for square root lies along the negative real axis, ++continuous with quadrant II. The range consists of the right half-plane, ++including the non-negative imaginary axis and excluding the negative ++imaginary axis. ++ ++Examples:: ++.......... ++ ++ (sqrt 9.0) => 3.0 ++ (sqrt -9.0) => #C(0.0 3.0) ++ (isqrt 9) => 3 ++ (sqrt 12) => 3.4641016 ++ (isqrt 12) => 3 ++ (isqrt 300) => 17 ++ (isqrt 325) => 18 ++ (sqrt 25) ++ => 5 ++ OR=> 5.0 ++ (isqrt 25) => 5 ++ (sqrt -1) => #C(0.0 1.0) ++ (sqrt #c(0 2)) => #C(1.0 1.0) ++ ++Exceptional Situations:: ++........................ ++ ++The function sqrt should signal type-error if its argument is not a ++number. ++ ++ The function isqrt should signal type-error if its argument is not a ++non-negative integer. ++ ++ The functions sqrt and isqrt might signal arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note exp:: , *note log:: , *note Rule of Float Substitutability:: ++ ++Notes:: ++....... ++ ++ (isqrt x) == (values (floor (sqrt x))) ++ ++ but it is potentially more efficient. ++ ++ ++File: gcl.info, Node: random-state, Next: make-random-state, Prev: sqrt, Up: Numbers Dictionary ++ ++12.2.39 random-state [System Class] ++----------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++random-state, t ++ ++Description:: ++............. ++ ++A random state object contains state information used by the ++pseudo-random number generator. The nature of a random state object is ++implementation-dependent. It can be printed out and successfully read ++back in by the same implementation, but might not function correctly as ++a random state in another implementation. ++ ++ Implementations are required to provide a read syntax for objects of ++type random-state, but the specific nature of that syntax is ++implementation-dependent. ++ ++See Also:: ++.......... ++ ++*note random-state:: , *note random:: , *note Printing Random States:: ++ ++ ++File: gcl.info, Node: make-random-state, Next: random, Prev: random-state, Up: Numbers Dictionary ++ ++12.2.40 make-random-state [Function] ++------------------------------------ ++ ++'make-random-state' &optional state => new-state ++ ++Arguments and Values:: ++...................... ++ ++state--a random state, or nil, or t. The default is nil. ++ ++ new-state--a random state object. ++ ++Description:: ++............. ++ ++Creates a fresh object of type random-state suitable for use as the ++value of *random-state*. ++ ++ If state is a random state object, the new-state is a copy_5 of that ++object. If state is nil, the new-state is a copy_5 of the current ++random state. If state is t, the new-state is a fresh random state ++object that has been randomly initialized by some means. ++ ++Examples:: ++.......... ++ ++ (let* ((rs1 (make-random-state nil)) ++ (rs2 (make-random-state t)) ++ (rs3 (make-random-state rs2)) ++ (rs4 nil)) ++ (list (loop for i from 1 to 10 ++ collect (random 100) ++ when (= i 5) ++ do (setq rs4 (make-random-state))) ++ (loop for i from 1 to 10 collect (random 100 rs1)) ++ (loop for i from 1 to 10 collect (random 100 rs2)) ++ (loop for i from 1 to 10 collect (random 100 rs3)) ++ (loop for i from 1 to 10 collect (random 100 rs4)))) ++ => ((29 25 72 57 55 68 24 35 54 65) ++ (29 25 72 57 55 68 24 35 54 65) ++ (93 85 53 99 58 62 2 23 23 59) ++ (93 85 53 99 58 62 2 23 23 59) ++ (68 24 35 54 65 54 55 50 59 49)) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if state is not a random ++state, or nil, or t. ++ ++See Also:: ++.......... ++ ++*note random:: , *note random-state:: ++ ++Notes:: ++....... ++ ++One important use of make-random-state is to allow the same series of ++pseudo-random numbers to be generated many times within a single ++program. ++ ++ ++File: gcl.info, Node: random, Next: random-state-p, Prev: make-random-state, Up: Numbers Dictionary ++ ++12.2.41 random [Function] ++------------------------- ++ ++'random' limit &optional random-state => random-number ++ ++Arguments and Values:: ++...................... ++ ++limit--a positive integer, or a positive float. ++ ++ random-state--a random state. The default is the current random ++state. ++ ++ random-number--a non-negative number less than limit and of the same ++type as limit. ++ ++Description:: ++............. ++ ++Returns a pseudo-random number that is a non-negative number less than ++limit and of the same type as limit. ++ ++ The random-state, which is modified by this function, encodes the ++internal state maintained by the random number generator. ++ ++ An approximately uniform choice distribution is used. If limit is an ++integer, each of the possible results occurs with (approximate) ++probability 1/limit. ++ ++Examples:: ++.......... ++ ++ (<= 0 (random 1000) 1000) => true ++ (let ((state1 (make-random-state)) ++ (state2 (make-random-state))) ++ (= (random 1000 state1) (random 1000 state2))) => true ++ ++Side Effects:: ++.............. ++ ++The random-state is modified. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if limit is not a positive ++integer or a positive real. ++ ++See Also:: ++.......... ++ ++*note make-random-state:: , *note random-state:: ++ ++Notes:: ++....... ++ ++See Common Lisp: The Language for information about generating random ++numbers. ++ ++ ++File: gcl.info, Node: random-state-p, Next: *random-state*, Prev: random, Up: Numbers Dictionary ++ ++12.2.42 random-state-p [Function] ++--------------------------------- ++ ++'random-state-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type random-state; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (random-state-p *random-state*) => true ++ (random-state-p (make-random-state)) => true ++ (random-state-p 'test-function) => false ++ ++See Also:: ++.......... ++ ++*note make-random-state:: , *note random-state:: ++ ++Notes:: ++....... ++ ++ (random-state-p object) == (typep object 'random-state) ++ ++ ++File: gcl.info, Node: *random-state*, Next: numberp, Prev: random-state-p, Up: Numbers Dictionary ++ ++12.2.43 *random-state* [Variable] ++--------------------------------- ++ ++Value Type:: ++............ ++ ++a random state. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The current random state, which is used, for example, by the function ++random when a random state is not explicitly supplied. ++ ++Examples:: ++.......... ++ ++ (random-state-p *random-state*) => true ++ (setq snap-shot (make-random-state)) ++ ;; The series from any given point is random, ++ ;; but if you backtrack to that point, you get the same series. ++ (list (loop for i from 1 to 10 collect (random)) ++ (let ((*random-state* snap-shot)) ++ (loop for i from 1 to 10 collect (random))) ++ (loop for i from 1 to 10 collect (random)) ++ (let ((*random-state* snap-shot)) ++ (loop for i from 1 to 10 collect (random)))) ++ => ((19 16 44 19 96 15 76 96 13 61) ++ (19 16 44 19 96 15 76 96 13 61) ++ (16 67 0 43 70 79 58 5 63 50) ++ (16 67 0 43 70 79 58 5 63 50)) ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++ random. ++ ++See Also:: ++.......... ++ ++*note make-random-state:: , *note random:: , random-state ++ ++Notes:: ++....... ++ ++Binding *random-state* to a different random state object correctly ++saves and restores the old random state object. ++ ++ ++File: gcl.info, Node: numberp, Next: cis, Prev: *random-state*, Up: Numbers Dictionary ++ ++12.2.44 numberp [Function] ++-------------------------- ++ ++'numberp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type number; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (numberp 12) => true ++ (numberp (expt 2 130)) => true ++ (numberp #c(5/3 7.2)) => true ++ (numberp nil) => false ++ (numberp (cons 1 2)) => false ++ ++Notes:: ++....... ++ ++ (numberp object) == (typep object 'number) ++ ++ ++File: gcl.info, Node: cis, Next: complex, Prev: numberp, Up: Numbers Dictionary ++ ++12.2.45 cis [Function] ++---------------------- ++ ++'cis' radians => number ++ ++Arguments and Values:: ++...................... ++ ++radians--a real. ++ ++ number--a complex. ++ ++Description:: ++............. ++ ++cis returns the value of~e^i\cdot radians, which is a complex in which ++the real part is equal to the cosine of radians, and the imaginary part ++is equal to the sine of radians. ++ ++Examples:: ++.......... ++ ++ (cis 0) => #C(1.0 0.0) ++ ++See Also:: ++.......... ++ ++*note Rule of Float Substitutability:: ++ ++ ++File: gcl.info, Node: complex, Next: complexp, Prev: cis, Up: Numbers Dictionary ++ ++12.2.46 complex [Function] ++-------------------------- ++ ++'complex' realpart &optional imagpart => complex ++ ++Arguments and Values:: ++...................... ++ ++realpart--a real. ++ ++ imagpart--a real. ++ ++ complex--a rational or a complex. ++ ++Description:: ++............. ++ ++complex returns a number whose real part is realpart and whose imaginary ++part is imagpart. ++ ++ If realpart is a rational and imagpart is the rational number zero, ++the result of complex is realpart, a rational. Otherwise, the result is ++a complex. ++ ++ If either realpart or imagpart is a float, the non-float is converted ++to a float before the complex is created. If imagpart is not supplied, ++the imaginary part is a zero of the same type as realpart; i.e., (coerce ++0 (type-of realpart)) is effectively used. ++ ++ Type upgrading implies a movement upwards in the type hierarchy ++lattice. In the case of complexes, the type-specifier ++ ++ [Reviewer Note by Barmar: What type specifier?] must be a subtype of ++(upgraded-complex-part-type type-specifier). If type-specifier1 is a ++subtype of type-specifier2, then (upgraded-complex-element-type ++'type-specifier1) must also be a subtype of ++(upgraded-complex-element-type 'type-specifier2). Two disjoint types ++can be upgraded into the same thing. ++ ++Examples:: ++.......... ++ ++ (complex 0) => 0 ++ (complex 0.0) => #C(0.0 0.0) ++ (complex 1 1/2) => #C(1 1/2) ++ (complex 1 .99) => #C(1.0 0.99) ++ (complex 3/2 0.0) => #C(1.5 0.0) ++ ++See Also:: ++.......... ++ ++*note realpart:: , imagpart ++ ++Notes:: ++....... ++ ++ #c(a b) == #.(complex a b) ++ ++ ++File: gcl.info, Node: complexp, Next: conjugate, Prev: complex, Up: Numbers Dictionary ++ ++12.2.47 complexp [Function] ++--------------------------- ++ ++'complexp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type complex; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (complexp 1.2d2) => false ++ (complexp #c(5/3 7.2)) => true ++ ++ ++See Also:: ++.......... ++ ++*note complex:: (function and type), *note typep:: ++ ++Notes:: ++....... ++ ++ (complexp object) == (typep object 'complex) ++ ++ ++File: gcl.info, Node: conjugate, Next: phase, Prev: complexp, Up: Numbers Dictionary ++ ++12.2.48 conjugate [Function] ++---------------------------- ++ ++'conjugate' number => conjugate ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ conjugate--a number. ++ ++Description:: ++............. ++ ++Returns the complex conjugate of number. The conjugate of a ++ ++ real ++ ++ number is itself. ++ ++Examples:: ++.......... ++ ++ (conjugate #c(0 -1)) => #C(0 1) ++ (conjugate #c(1 1)) => #C(1 -1) ++ (conjugate 1.5) => 1.5 ++ (conjugate #C(3/5 4/5)) => #C(3/5 -4/5) ++ (conjugate #C(0.0D0 -1.0D0)) => #C(0.0D0 1.0D0) ++ (conjugate 3.7) => 3.7 ++ ++Notes:: ++....... ++ ++For a complex number z, ++ ++ (conjugate z) == (complex (realpart z) (- (imagpart z))) ++ ++ ++File: gcl.info, Node: phase, Next: realpart, Prev: conjugate, Up: Numbers Dictionary ++ ++12.2.49 phase [Function] ++------------------------ ++ ++'phase' number => phase ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ phase--a number. ++ ++Description:: ++............. ++ ++phase returns the phase of number (the angle part of its polar ++representation) in radians, in the range ++ ++ -\pi (exclusive) if minus zero is not supported, or -\pi (inclusive) ++if minus zero is supported, ++ ++ to \pi (inclusive). The phase of a positive ++ ++ real ++ ++ number is zero; that of a negative ++ ++ real ++ ++ number is \pi. The phase of zero is defined to be zero. ++ ++ If number is a complex float, the result is a float of the same type ++as the components of number. If number is a float, the result is a ++float of the same type. If number is a rational or a complex rational, ++the result is a single float. ++ ++ The branch cut for phase lies along the negative real axis, ++continuous with quadrant II. The range consists of that portion of the ++real axis between -\pi (exclusive) and~\pi (inclusive). ++ ++ The mathematical definition of phase is as follows: ++ ++ (phase x) = (atan (imagpart x) (realpart x)) ++ ++Examples:: ++.......... ++ ++ (phase 1) => 0.0s0 ++ (phase 0) => 0.0s0 ++ (phase (cis 30)) => -1.4159266 ++ (phase #c(0 1)) => 1.5707964 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its argument is not a number. Might signal ++arithmetic-error. ++ ++See Also:: ++.......... ++ ++*note Rule of Float Substitutability:: ++ ++ ++File: gcl.info, Node: realpart, Next: upgraded-complex-part-type, Prev: phase, Up: Numbers Dictionary ++ ++12.2.50 realpart, imagpart [Function] ++------------------------------------- ++ ++'realpart' number => real ++ ++ 'imagpart' number => real ++ ++Arguments and Values:: ++...................... ++ ++number--a number. ++ ++ real--a real. ++ ++Description:: ++............. ++ ++realpart and imagpart return the real and imaginary parts of number ++respectively. If number is ++ ++ real, ++ ++ then realpart returns number and imagpart returns (* 0 number), which ++has the effect that the imaginary part of a rational is 0 and that of a ++float is a floating-point zero of the same format. ++ ++Examples:: ++.......... ++ ++ (realpart #c(23 41)) => 23 ++ (imagpart #c(23 41.0)) => 41.0 ++ (realpart #c(23 41.0)) => 23.0 ++ (imagpart 23.0) => 0.0 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if number is not a number. ++ ++See Also:: ++.......... ++ ++*note complex:: ++ ++ ++File: gcl.info, Node: upgraded-complex-part-type, Next: realp, Prev: realpart, Up: Numbers Dictionary ++ ++12.2.51 upgraded-complex-part-type [Function] ++--------------------------------------------- ++ ++'upgraded-complex-part-type' typespec &optional environment => ++upgraded-typespec ++ ++Arguments and Values:: ++...................... ++ ++typespec--a type specifier. ++ ++ environment--an environment object. The default is nil, denoting the ++null lexical environment and the and current global environment. ++ ++ upgraded-typespec--a type specifier. ++ ++Description:: ++............. ++ ++upgraded-complex-part-type returns the part type of the most specialized ++complex number representation that can hold parts of type typespec. ++ ++ The typespec is a subtype of (and possibly type equivalent to) the ++upgraded-typespec. ++ ++ The purpose of upgraded-complex-part-type is to reveal how an ++implementation does its upgrading. ++ ++See Also:: ++.......... ++ ++*note complex:: (function and type) ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: realp, Next: numerator, Prev: upgraded-complex-part-type, Up: Numbers Dictionary ++ ++12.2.52 realp [Function] ++------------------------ ++ ++'realp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type real; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (realp 12) => true ++ (realp #c(5/3 7.2)) => false ++ (realp nil) => false ++ (realp (cons 1 2)) => false ++ ++Notes:: ++....... ++ ++ (realp object) == (typep object 'real) ++ ++ ++File: gcl.info, Node: numerator, Next: rational (Function), Prev: realp, Up: Numbers Dictionary ++ ++12.2.53 numerator, denominator [Function] ++----------------------------------------- ++ ++'numerator' rational => numerator ++ ++ 'denominator' rational => denominator ++ ++Arguments and Values:: ++...................... ++ ++rational--a rational. ++ ++ numerator--an integer. ++ ++ denominator--a positive integer. ++ ++Description:: ++............. ++ ++numerator and denominator reduce rational to canonical form and compute ++the numerator or denominator of that number. ++ ++ numerator and denominator return the numerator or denominator of the ++canonical form of rational. ++ ++ If rational is an integer, numerator returns rational and denominator ++returns 1. ++ ++Examples:: ++.......... ++ ++ (numerator 1/2) => 1 ++ (denominator 12/36) => 3 ++ (numerator -1) => -1 ++ (denominator (/ -33)) => 33 ++ (numerator (/ 8 -6)) => -4 ++ (denominator (/ 8 -6)) => 3 ++ ++See Also:: ++.......... ++ ++*note /:: ++ ++Notes:: ++....... ++ ++ (gcd (numerator x) (denominator x)) => 1 ++ ++ ++File: gcl.info, Node: rational (Function), Next: rationalp, Prev: numerator, Up: Numbers Dictionary ++ ++12.2.54 rational, rationalize [Function] ++---------------------------------------- ++ ++'rational' number => rational ++ ++ 'rationalize' number => rational ++ ++Arguments and Values:: ++...................... ++ ++number--a real. ++ ++ rational--a rational. ++ ++Description:: ++............. ++ ++rational and rationalize convert ++ ++ reals ++ ++ to rationals. ++ ++ If number is already rational, it is returned. ++ ++ If number is a float, rational returns a rational that is ++mathematically equal in value to the float. rationalize returns a ++rational that approximates the float to the accuracy of the underlying ++floating-point representation. ++ ++ rational assumes that the float is completely accurate. ++ ++ rationalize assumes that the float is accurate only to the precision ++of the floating-point representation. ++ ++Examples:: ++.......... ++ ++ (rational 0) => 0 ++ (rationalize -11/100) => -11/100 ++ (rational .1) => 13421773/134217728 ;implementation-dependent ++ (rationalize .1) => 1/10 ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if number is not a real. ++Might signal arithmetic-error. ++ ++Notes:: ++....... ++ ++It is always the case that ++ ++ (float (rational x) x) == x ++ ++ and ++ ++ (float (rationalize x) x) == x ++ ++ That is, rationalizing a float by either method and then converting ++it back to a float of the same format produces the original number. ++ ++ ++File: gcl.info, Node: rationalp, Next: ash, Prev: rational (Function), Up: Numbers Dictionary ++ ++12.2.55 rationalp [Function] ++---------------------------- ++ ++'rationalp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type rational; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (rationalp 12) => true ++ (rationalp 6/5) => true ++ (rationalp 1.212) => false ++ ++See Also:: ++.......... ++ ++*note rational (Function):: ++ ++Notes:: ++....... ++ ++ (rationalp object) == (typep object 'rational) ++ ++ ++File: gcl.info, Node: ash, Next: integer-length, Prev: rationalp, Up: Numbers Dictionary ++ ++12.2.56 ash [Function] ++---------------------- ++ ++'ash' integer count => shifted-integer ++ ++Arguments and Values:: ++...................... ++ ++integer--an integer. ++ ++ count--an integer. ++ ++ shifted-integer--an integer. ++ ++Description:: ++............. ++ ++ash performs the arithmetic shift operation on the binary representation ++of integer, which is treated as if it were binary. ++ ++ ash shifts integer arithmetically left by count bit positions if ++count is positive, or right count bit positions if count is negative. ++The shifted value of the same sign as integer is returned. ++ ++ Mathematically speaking, ash performs the computation ++floor(integer\cdot 2^count). Logically, ash moves all of the bits in ++integer to the left, adding zero-bits at the right, or moves them to the ++right, discarding bits. ++ ++ ash is defined to behave as if integer were represented in two's ++complement form, regardless of how integers are represented internally. ++ ++Examples:: ++.......... ++ ++ (ash 16 1) => 32 ++ (ash 16 0) => 16 ++ (ash 16 -1) => 8 ++ (ash -100000000000000000000000000000000 -100) => -79 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if integer is not an integer. ++Should signal an error of type type-error if count is not an integer. ++Might signal arithmetic-error. ++ ++Notes:: ++....... ++ ++ (logbitp j (ash n k)) ++ == (and (>= j k) (logbitp (- j k) n)) ++ ++ ++File: gcl.info, Node: integer-length, Next: integerp, Prev: ash, Up: Numbers Dictionary ++ ++12.2.57 integer-length [Function] ++--------------------------------- ++ ++'integer-length' integer => number-of-bits ++ ++Arguments and Values:: ++...................... ++ ++integer--an integer. ++ ++ number-of-bits--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the number of bits needed to represent integer in binary ++two's-complement format. ++ ++Examples:: ++.......... ++ ++ (integer-length 0) => 0 ++ (integer-length 1) => 1 ++ (integer-length 3) => 2 ++ (integer-length 4) => 3 ++ (integer-length 7) => 3 ++ (integer-length -1) => 0 ++ (integer-length -4) => 2 ++ (integer-length -7) => 3 ++ (integer-length -8) => 3 ++ (integer-length (expt 2 9)) => 10 ++ (integer-length (1- (expt 2 9))) => 9 ++ (integer-length (- (expt 2 9))) => 9 ++ (integer-length (- (1+ (expt 2 9)))) => 10 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if integer is not an integer. ++ ++Notes:: ++....... ++ ++This function could have been defined by: ++ ++ (defun integer-length (integer) ++ (ceiling (log (if (minusp integer) ++ (- integer) ++ (1+ integer)) ++ 2))) ++ ++ If integer is non-negative, then its value can be represented in ++unsigned binary form in a field whose width in bits is no smaller than ++(integer-length integer). Regardless of the sign of integer, its value ++can be represented in signed binary two's-complement form in a field ++whose width in bits is no smaller than (+ (integer-length integer) 1). ++ ++ ++File: gcl.info, Node: integerp, Next: parse-integer, Prev: integer-length, Up: Numbers Dictionary ++ ++12.2.58 integerp [Function] ++--------------------------- ++ ++'integerp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type integer; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (integerp 1) => true ++ (integerp (expt 2 130)) => true ++ (integerp 6/5) => false ++ (integerp nil) => false ++ ++ ++Notes:: ++....... ++ ++ (integerp object) == (typep object 'integer) ++ ++ ++File: gcl.info, Node: parse-integer, Next: boole, Prev: integerp, Up: Numbers Dictionary ++ ++12.2.59 parse-integer [Function] ++-------------------------------- ++ ++'parse-integer' string &key start end radix junk-allowed => integer, pos ++ ++Arguments and Values:: ++...................... ++ ++string--a string. ++ ++ start, end--bounding index designators of string. The defaults for ++start and end are 0 and nil, respectively. ++ ++ radix--a radix. The default is 10. ++ ++ junk-allowed--a generalized boolean. The default is false. ++ ++ integer--an integer or false. ++ ++ pos--a bounding index of string. ++ ++Description:: ++............. ++ ++parse-integer parses an integer in the specified radix from the ++substring of string delimited by start and end. ++ ++ parse-integer expects an optional sign (+ or -) followed by a a ++non-empty sequence of digits to be interpreted in the specified radix. ++Optional leading and trailing whitespace_1 is ignored. ++ ++ parse-integer does not recognize the syntactic radix-specifier ++prefixes #O, #B, #X, and #nR, nor does it recognize a trailing decimal ++point. ++ ++ If junk-allowed is false, an error of type parse-error is signaled if ++substring does not consist entirely of the representation of a signed ++integer, possibly surrounded on either side by whitespace_1 characters. ++ ++ The first value returned is either the integer that was parsed, or ++else nil if no syntactically correct integer was seen but junk-allowed ++was true. ++ ++ The second value is either the index into the string of the delimiter ++that terminated the parse, or the upper bounding index of the substring ++if the parse terminated at the end of the substring (as is always the ++case if junk-allowed is false). ++ ++Examples:: ++.......... ++ ++ (parse-integer "123") => 123, 3 ++ (parse-integer "123" :start 1 :radix 5) => 13, 3 ++ (parse-integer "no-integer" :junk-allowed t) => NIL, 0 ++ ++Exceptional Situations:: ++........................ ++ ++If junk-allowed is false, an error is signaled if substring does not ++consist entirely of the representation of an integer, possibly ++surrounded on either side by whitespace_1 characters. ++ ++ ++File: gcl.info, Node: boole, Next: boole-1, Prev: parse-integer, Up: Numbers Dictionary ++ ++12.2.60 boole [Function] ++------------------------ ++ ++'boole' op integer-1 integer-2 => result-integer ++ ++Arguments and Values:: ++...................... ++ ++Op--a bit-wise logical operation specifier. ++ ++ integer-1--an integer. ++ ++ integer-2--an integer. ++ ++ result-integer--an integer. ++ ++Description:: ++............. ++ ++boole performs bit-wise logical operations on integer-1 and integer-2, ++which are treated as if they were binary and in two's complement ++representation. ++ ++ The operation to be performed and the return value are determined by ++op. ++ ++ boole returns the values specified for any op in Figure 12-16. ++ ++ Op Result ++ boole-1 integer-1 ++ boole-2 integer-2 ++ boole-andc1 and complement of integer-1 with integer-2 ++ boole-andc2 and integer-1 with complement of integer-2 ++ boole-and and ++ boole-c1 complement of integer-1 ++ boole-c2 complement of integer-2 ++ boole-clr always 0 (all zero bits) ++ boole-eqv equivalence (exclusive nor) ++ boole-ior inclusive or ++ boole-nand not-and ++ boole-nor not-or ++ boole-orc1 or complement of integer-1 with integer-2 ++ boole-orc2 or integer-1 with complement of integer-2 ++ boole-set always -1 (all one bits) ++ boole-xor exclusive or ++ ++ Figure 12-16: Bit-Wise Logical Operations ++ ++ ++Examples:: ++.......... ++ ++ (boole boole-ior 1 16) => 17 ++ (boole boole-and -2 5) => 4 ++ (boole boole-eqv 17 15) => -31 ++ ++ ;;; These examples illustrate the result of applying BOOLE and each ++ ;;; of the possible values of OP to each possible combination of bits. ++ (progn ++ (format t "~&Results of (BOOLE #b0011 #b0101) ...~ ++ ~ ++ (dolist (symbol '(boole-1 boole-2 boole-and boole-andc1 ++ boole-andc2 boole-c1 boole-c2 boole-clr ++ boole-eqv boole-ior boole-nand boole-nor ++ boole-orc1 boole-orc2 boole-set boole-xor)) ++ (let ((result (boole (symbol-value symbol) #b0011 #b0101))) ++ (format t "~& ~A~13T~3,' D~23T~:*~5,' B~31T ...~4,'0B~ ++ symbol result (logand result #b1111))))) ++ |> Results of (BOOLE #b0011 #b0101) ... ++ |> ---Op-------Decimal-----Binary----Bits--- ++ |> BOOLE-1 3 11 ...0011 ++ |> BOOLE-2 5 101 ...0101 ++ |> BOOLE-AND 1 1 ...0001 ++ |> BOOLE-ANDC1 4 100 ...0100 ++ |> BOOLE-ANDC2 2 10 ...0010 ++ |> BOOLE-C1 -4 -100 ...1100 ++ |> BOOLE-C2 -6 -110 ...1010 ++ |> BOOLE-CLR 0 0 ...0000 ++ |> BOOLE-EQV -7 -111 ...1001 ++ |> BOOLE-IOR 7 111 ...0111 ++ |> BOOLE-NAND -2 -10 ...1110 ++ |> BOOLE-NOR -8 -1000 ...1000 ++ |> BOOLE-ORC1 -3 -11 ...1101 ++ |> BOOLE-ORC2 -5 -101 ...1011 ++ |> BOOLE-SET -1 -1 ...1111 ++ |> BOOLE-XOR 6 110 ...0110 ++ => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its first argument is not a bit-wise logical ++operation specifier or if any subsequent argument is not an integer. ++ ++See Also:: ++.......... ++ ++*note logand:: ++ ++Notes:: ++....... ++ ++In general, ++ ++ (boole boole-and x y) == (logand x y) ++ ++ Programmers who would prefer to use numeric indices rather than ++bit-wise logical operation specifiers can get an equivalent effect by a ++technique such as the following: ++ ++ ;; The order of the values in this `table' are such that ++ ;; (logand (boole (elt boole-n-vector n) #b0101 #b0011) #b1111) => n ++ (defconstant boole-n-vector ++ (vector boole-clr boole-and boole-andc1 boole-2 ++ boole-andc2 boole-1 boole-xor boole-ior ++ boole-nor boole-eqv boole-c1 boole-orc1 ++ boole-c2 boole-orc2 boole-nand boole-set)) ++ => BOOLE-N-VECTOR ++ (proclaim '(inline boole-n)) ++ => implementation-dependent ++ (defun boole-n (n integer &rest more-integers) ++ (apply #'boole (elt boole-n-vector n) integer more-integers)) ++ => BOOLE-N ++ (boole-n #b0111 5 3) => 7 ++ (boole-n #b0001 5 3) => 1 ++ (boole-n #b1101 5 3) => -3 ++ (loop for n from #b0000 to #b1111 collect (boole-n n 5 3)) ++ => (0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1) ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-6 +@@ -0,0 +1,10582 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: boole-1, Next: logand, Prev: boole, Up: Numbers Dictionary ++ ++12.2.61 boole-1, boole-2, boole-and, boole-andc1, boole-andc2, ++-------------------------------------------------------------- ++ ++boole-c1, boole-c2, boole-clr, boole-eqv, boole-ior, ++---------------------------------------------------- ++ ++boole-nand, boole-nor, boole-orc1, boole-orc2, boole-set, ++--------------------------------------------------------- ++ ++boole-xor ++--------- ++ ++ [Constant Variable] ++ ++Constant Value:: ++................ ++ ++The identity and nature of the values of each of these variables is ++implementation-dependent, except that it must be distinct from each of ++the values of the others, and it must be a valid first argument to the ++function boole. ++ ++Description:: ++............. ++ ++Each of these constants has a value which is one of the sixteen possible ++bit-wise logical operation specifiers. ++ ++Examples:: ++.......... ++ ++ (boole boole-ior 1 16) => 17 ++ (boole boole-and -2 5) => 4 ++ (boole boole-eqv 17 15) => -31 ++ ++See Also:: ++.......... ++ ++*note boole:: ++ ++ ++File: gcl.info, Node: logand, Next: logbitp, Prev: boole-1, Up: Numbers Dictionary ++ ++12.2.62 logand, logandc1, logandc2, logeqv, logior, ++--------------------------------------------------- ++ ++lognand, lognor, lognot, logorc1, logorc2, ++------------------------------------------ ++ ++logxor ++------ ++ ++ [Function] ++ ++ 'logand' &rest integers => result-integer ++ ++ 'logandc' 1 => integer-1 integer-2 result-integer 'logandc' 2 => ++integer-1 integer-2 result-integer 'logeqv' &rest integers => ++result-integer ++ ++ 'logior' &rest integers => result-integer ++ ++ 'lognand' integer-1 integer-2 => result-integer ++ ++ 'lognor' integer-1 integer-2 => result-integer ++ ++ 'lognot' integer => result-integer ++ ++ 'logorc' 1 => integer-1 integer-2 result-integer 'logorc' 2 => ++integer-1 integer-2 result-integer 'logxor' &rest integers => ++result-integer ++ ++Arguments and Values:: ++...................... ++ ++integers--integers. ++ ++ integer--an integer. ++ ++ integer-1--an integer. ++ ++ integer-2--an integer. ++ ++ result-integer--an integer. ++ ++Description:: ++............. ++ ++The functions logandc1, logandc2, logand, logeqv, logior, lognand, ++lognor, lognot, logorc1, logorc2, and logxor perform bit-wise logical ++operations on their arguments, that are treated as if they were binary. ++ ++ Figure 12-17 lists the meaning of each of the functions. Where an ++'identity' is shown, it indicates the value yielded by the function when ++no arguments are supplied. ++ ++ Function Identity Operation performed ++ logandc1 -- and complement of integer-1 with integer-2 ++ logandc2 -- and integer-1 with complement of integer-2 ++ logand -1 and ++ logeqv -1 equivalence (exclusive nor) ++ logior 0 inclusive or ++ lognand -- complement of integer-1 and integer-2 ++ lognor -- complement of integer-1 or integer-2 ++ lognot -- complement ++ logorc1 -- or complement of integer-1 with integer-2 ++ logorc2 -- or integer-1 with complement of integer-2 ++ logxor 0 exclusive or ++ ++ Figure 12-17: Bit-wise Logical Operations on Integers ++ ++ ++ Negative integers are treated as if they were in two's-complement ++notation. ++ ++Examples:: ++.......... ++ ++ (logior 1 2 4 8) => 15 ++ (logxor 1 3 7 15) => 10 ++ (logeqv) => -1 ++ (logand 16 31) => 16 ++ (lognot 0) => -1 ++ (lognot 1) => -2 ++ (lognot -1) => 0 ++ (lognot (1+ (lognot 1000))) => 999 ++ ++ ;;; In the following example, m is a mask. For each bit in ++ ;;; the mask that is a 1, the corresponding bits in x and y are ++ ;;; exchanged. For each bit in the mask that is a 0, the ++ ;;; corresponding bits of x and y are left unchanged. ++ (flet ((show (m x y) ++ (format t "~ ++ m x y))) ++ (let ((m #o007750) ++ (x #o452576) ++ (y #o317407)) ++ (show m x y) ++ (let ((z (logand (logxor x y) m))) ++ (setq x (logxor z x)) ++ (setq y (logxor z y)) ++ (show m x y)))) ++ |> m = #o007750 ++ |> x = #o452576 ++ |> y = #o317407 ++ |> ++ |> m = #o007750 ++ |> x = #o457426 ++ |> y = #o312557 ++ => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if any argument is not an integer. ++ ++See Also:: ++.......... ++ ++*note boole:: ++ ++Notes:: ++....... ++ ++(logbitp k -1) returns true for all values of k. ++ ++ Because the following functions are not associative, they take ++exactly two arguments rather than any number of arguments. ++ ++ (lognand n1 n2) == (lognot (logand n1 n2)) ++ (lognor n1 n2) == (lognot (logior n1 n2)) ++ (logandc1 n1 n2) == (logand (lognot n1) n2) ++ (logandc2 n1 n2) == (logand n1 (lognot n2)) ++ (logiorc1 n1 n2) == (logior (lognot n1) n2) ++ (logiorc2 n1 n2) == (logior n1 (lognot n2)) ++ (logbitp j (lognot x)) == (not (logbitp j x)) ++ ++ ++File: gcl.info, Node: logbitp, Next: logcount, Prev: logand, Up: Numbers Dictionary ++ ++12.2.63 logbitp [Function] ++-------------------------- ++ ++'logbitp' index integer => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++index--a non-negative integer. ++ ++ integer--an integer. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++logbitp is used to test the value of a particular bit in integer, that ++is treated as if it were binary. The value of logbitp is true if the ++bit in integer whose index is index (that is, its weight is 2^index) is ++a one-bit; otherwise it is false. ++ ++ Negative integers are treated as if they were in two's-complement ++notation. ++ ++Examples:: ++.......... ++ ++ (logbitp 1 1) => false ++ (logbitp 0 1) => true ++ (logbitp 3 10) => true ++ (logbitp 1000000 -1) => true ++ (logbitp 2 6) => true ++ (logbitp 0 6) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if index is not a non-negative ++integer. Should signal an error of type type-error if integer is not an ++integer. ++ ++Notes:: ++....... ++ ++ (logbitp k n) == (ldb-test (byte 1 k) n) ++ ++ ++File: gcl.info, Node: logcount, Next: logtest, Prev: logbitp, Up: Numbers Dictionary ++ ++12.2.64 logcount [Function] ++--------------------------- ++ ++'logcount' integer => number-of-on-bits ++ ++Arguments and Values:: ++...................... ++ ++integer--an integer. ++ ++ number-of-on-bits--a non-negative integer. ++ ++Description:: ++............. ++ ++Computes and returns the number of bits in the two's-complement binary ++representation of integer that are 'on' or 'set'. If integer is ++negative, the 0 bits are counted; otherwise, the 1 bits are counted. ++ ++Examples:: ++.......... ++ ++ (logcount 0) => 0 ++ (logcount -1) => 0 ++ (logcount 7) => 3 ++ (logcount 13) => 3 ;Two's-complement binary: ...0001101 ++ (logcount -13) => 2 ;Two's-complement binary: ...1110011 ++ (logcount 30) => 4 ;Two's-complement binary: ...0011110 ++ (logcount -30) => 4 ;Two's-complement binary: ...1100010 ++ (logcount (expt 2 100)) => 1 ++ (logcount (- (expt 2 100))) => 100 ++ (logcount (- (1+ (expt 2 100)))) => 1 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its argument is not an integer. ++ ++Notes:: ++....... ++ ++Even if the implementation does not represent integers internally in ++two's complement binary, logcount behaves as if it did. ++ ++ The following identity always holds: ++ ++ (logcount x) ++ == (logcount (- (+ x 1))) ++ == (logcount (lognot x)) ++ ++ ++File: gcl.info, Node: logtest, Next: byte, Prev: logcount, Up: Numbers Dictionary ++ ++12.2.65 logtest [Function] ++-------------------------- ++ ++'logtest' integer-1 integer-2 => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++integer-1--an integer. ++ ++ integer-2--an integer. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if any of the bits designated by the 1's in integer-1 is 1 ++in integer-2; otherwise it is false. integer-1 and integer-2 are ++treated as if they were binary. ++ ++ Negative integer-1 and integer-2 are treated as if they were ++represented in two's-complement binary. ++ ++Examples:: ++.......... ++ ++ (logtest 1 7) => true ++ (logtest 1 2) => false ++ (logtest -2 -1) => true ++ (logtest 0 -1) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if integer-1 is not an ++integer. Should signal an error of type type-error if integer-2 is not ++an integer. ++ ++Notes:: ++....... ++ ++ (logtest x y) == (not (zerop (logand x y))) ++ ++ ++File: gcl.info, Node: byte, Next: deposit-field, Prev: logtest, Up: Numbers Dictionary ++ ++12.2.66 byte, byte-size, byte-position [Function] ++------------------------------------------------- ++ ++'byte' size position => bytespec ++ ++ 'byte-size' bytespec => size ++ ++ 'byte-position' bytespec => position ++ ++Arguments and Values:: ++...................... ++ ++size, position--a non-negative integer. ++ ++ bytespec--a byte specifier. ++ ++Description:: ++............. ++ ++byte returns a byte specifier that indicates a byte of width size and ++whose bits have weights 2^position + size - 1\/ through 2^position, and ++whose representation is implementation-dependent. ++ ++ byte-size returns the number of bits specified by bytespec. ++ ++ byte-position returns the position specified by bytespec. ++ ++Examples:: ++.......... ++ ++ (setq b (byte 100 200)) => # ++ (byte-size b) => 100 ++ (byte-position b) => 200 ++ ++See Also:: ++.......... ++ ++*note ldb:: , *note dpb:: ++ ++Notes:: ++....... ++ ++ (byte-size (byte j k)) == j ++ (byte-position (byte j k)) == k ++ ++ A byte of size of 0 is permissible; it refers to a byte of width ++zero. For example, ++ ++ (ldb (byte 0 3) #o7777) => 0 ++ (dpb #o7777 (byte 0 3) 0) => 0 ++ ++ ++File: gcl.info, Node: deposit-field, Next: dpb, Prev: byte, Up: Numbers Dictionary ++ ++12.2.67 deposit-field [Function] ++-------------------------------- ++ ++'deposit-field' newbyte bytespec integer => result-integer ++ ++Arguments and Values:: ++...................... ++ ++newbyte--an integer. ++ ++ bytespec--a byte specifier. ++ ++ integer--an integer. ++ ++ result-integer--an integer. ++ ++Description:: ++............. ++ ++Replaces a field of bits within integer; specifically, returns an ++integer that contains the bits of newbyte within the byte specified by ++bytespec, and elsewhere contains the bits of integer. ++ ++Examples:: ++.......... ++ ++ (deposit-field 7 (byte 2 1) 0) => 6 ++ (deposit-field -1 (byte 4 0) 0) => 15 ++ (deposit-field 0 (byte 2 1) -3) => -7 ++ ++See Also:: ++.......... ++ ++*note byte:: , *note dpb:: ++ ++Notes:: ++....... ++ ++ (logbitp j (deposit-field m (byte s p) n)) ++ == (if (and (>= j p) (< j (+ p s))) ++ (logbitp j m) ++ (logbitp j n)) ++ ++ deposit-field is to mask-field as dpb is to ldb. ++ ++ ++File: gcl.info, Node: dpb, Next: ldb, Prev: deposit-field, Up: Numbers Dictionary ++ ++12.2.68 dpb [Function] ++---------------------- ++ ++'dpb' newbyte bytespec integer => result-integer ++ ++Pronunciation:: ++............... ++ ++pronounced ,de 'pib or pronounced ,de 'pe b or pronounced 'd\=e 'p\=e ++'b\=e ++ ++Arguments and Values:: ++...................... ++ ++newbyte--an integer. ++ ++ bytespec--a byte specifier. ++ ++ integer--an integer. ++ ++ result-integer--an integer. ++ ++Description:: ++............. ++ ++dpb (deposit byte) is used to replace a field of bits within integer. ++dpb returns an integer that is the same as integer except in the bits ++specified by bytespec. ++ ++ Let s be the size specified by bytespec; then the low s bits of ++newbyte appear in the result in the byte specified by bytespec. Newbyte ++is interpreted as being right-justified, as if it were the result of ++ldb. ++ ++Examples:: ++.......... ++ ++ (dpb 1 (byte 1 10) 0) => 1024 ++ (dpb -2 (byte 2 10) 0) => 2048 ++ (dpb 1 (byte 2 10) 2048) => 1024 ++ ++See Also:: ++.......... ++ ++*note byte:: , *note deposit-field:: , *note ldb:: ++ ++Notes:: ++....... ++ ++ (logbitp j (dpb m (byte s p) n)) ++ == (if (and (>= j p) (< j (+ p s))) ++ (logbitp (- j p) m) ++ (logbitp j n)) ++ ++ In general, ++ ++ (dpb x (byte 0 y) z) => z ++ ++ for all valid values of x, y, and z. ++ ++ Historically, the name "dpb" comes from a DEC PDP-10 assembly ++language instruction meaning "deposit byte." ++ ++ ++File: gcl.info, Node: ldb, Next: ldb-test, Prev: dpb, Up: Numbers Dictionary ++ ++12.2.69 ldb [Accessor] ++---------------------- ++ ++'ldb' bytespec integer => byte ++ ++ (setf (' ldb' bytespec place) new-byte) ++ ++Pronunciation:: ++............... ++ ++pronounced 'lid ib or pronounced 'lid e b or pronounced 'el 'd\=e 'b\=e ++ ++Arguments and Values:: ++...................... ++ ++bytespec--a byte specifier. ++ ++ integer--an integer. ++ ++ byte, new-byte--a non-negative integer. ++ ++Description:: ++............. ++ ++ldb extracts and returns the byte of integer specified by bytespec. ++ ++ ldb returns an integer in which the bits with weights 2^(s-1) through ++2^0 are the same as those in integer with weights 2^(p+s-1) through 2^p, ++and all other bits zero; s is (byte-size bytespec) and p is ++(byte-position bytespec). ++ ++ setf may be used with ldb to modify a byte within the integer that is ++stored in a given place. ++ ++ The order of evaluation, when an ldb form is supplied to setf, is ++exactly left-to-right. ++ ++ The effect is to perform a dpb operation and then store the result ++back into the place. ++ ++Examples:: ++.......... ++ ++ (ldb (byte 2 1) 10) => 1 ++ (setq a (list 8)) => (8) ++ (setf (ldb (byte 2 1) (car a)) 1) => 1 ++ a => (10) ++ ++See Also:: ++.......... ++ ++*note byte:: , byte-position, byte-size, *note dpb:: ++ ++Notes:: ++....... ++ ++ (logbitp j (ldb (byte s p) n)) ++ == (and (< j s) (logbitp (+ j p) n)) ++ ++ In general, ++ ++ (ldb (byte 0 x) y) => 0 ++ ++ for all valid values of x and y. ++ ++ Historically, the name "ldb" comes from a DEC PDP-10 assembly ++language instruction meaning "load byte." ++ ++ ++File: gcl.info, Node: ldb-test, Next: mask-field, Prev: ldb, Up: Numbers Dictionary ++ ++12.2.70 ldb-test [Function] ++--------------------------- ++ ++'ldb-test' bytespec integer => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++bytespec--a byte specifier. ++ ++ integer--an integer. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if any of the bits of the byte in integer specified by ++bytespec is non-zero; otherwise returns false. ++ ++Examples:: ++.......... ++ ++ (ldb-test (byte 4 1) 16) => true ++ (ldb-test (byte 3 1) 16) => false ++ (ldb-test (byte 3 2) 16) => true ++ ++See Also:: ++.......... ++ ++*note byte:: , *note ldb:: , *note zerop:: ++ ++Notes:: ++....... ++ ++ (ldb-test bytespec n) == ++ (not (zerop (ldb bytespec n))) == ++ (logtest (ldb bytespec -1) n) ++ ++ ++File: gcl.info, Node: mask-field, Next: most-positive-fixnum, Prev: ldb-test, Up: Numbers Dictionary ++ ++12.2.71 mask-field [Accessor] ++----------------------------- ++ ++'mask-field' bytespec integer => masked-integer ++ ++ (setf (' mask-field' bytespec place) new-masked-integer) ++ ++Arguments and Values:: ++...................... ++ ++bytespec--a byte specifier. ++ ++ integer--an integer. ++ ++ masked-integer, new-masked-integer--a non-negative integer. ++ ++Description:: ++............. ++ ++mask-field performs a "mask" operation on integer. It returns an ++integer that has the same bits as integer in the byte specified by ++bytespec, but that has zero-bits everywhere else. ++ ++ setf may be used with mask-field to modify a byte within the integer ++that is stored in a given place. The effect is to perform a ++deposit-field operation and then store the result back into the place. ++ ++Examples:: ++.......... ++ ++ (mask-field (byte 1 5) -1) => 32 ++ (setq a 15) => 15 ++ (mask-field (byte 2 0) a) => 3 ++ a => 15 ++ (setf (mask-field (byte 2 0) a) 1) => 1 ++ a => 13 ++ ++See Also:: ++.......... ++ ++*note byte:: , *note ldb:: ++ ++Notes:: ++....... ++ ++ (ldb bs (mask-field bs n)) == (ldb bs n) ++ (logbitp j (mask-field (byte s p) n)) ++ == (and (>= j p) (< j s) (logbitp j n)) ++ (mask-field bs n) == (logand n (dpb -1 bs 0)) ++ ++ ++File: gcl.info, Node: most-positive-fixnum, Next: decode-float, Prev: mask-field, Up: Numbers Dictionary ++ ++12.2.72 most-positive-fixnum, most-negative-fixnum [Constant Variable] ++---------------------------------------------------------------------- ++ ++Constant Value:: ++................ ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++most-positive-fixnum is that fixnum closest in value to positive ++infinity provided by the implementation, ++ ++ and greater than or equal to both 2^15 - 1 and array-dimension-limit. ++ ++ most-negative-fixnum is that fixnum closest in value to negative ++infinity provided by the implementation, ++ ++ and less than or equal to -2^15. ++ ++ ++File: gcl.info, Node: decode-float, Next: float, Prev: most-positive-fixnum, Up: Numbers Dictionary ++ ++12.2.73 decode-float, scale-float, float-radix, float-sign, ++----------------------------------------------------------- ++ ++float-digits, float-precision, integer-decode-float ++--------------------------------------------------- ++ ++ [Function] ++ ++ 'decode-float' float => significand, exponent, sign ++ ++ 'scale-float' float integer => scaled-float ++ ++ 'float-radix' float => float-radix ++ ++ 'float-sign' float-1 &optional float-2 => signed-float ++ ++ 'float-digits' float => digits1 ++ ++ 'float-precision' float => digits2 ++ ++ 'integer-decode-float' float => significand, exponent, integer-sign ++ ++Arguments and Values:: ++...................... ++ ++digits1--a non-negative integer. ++ ++ digits2--a non-negative integer. ++ ++ exponent--an integer. ++ ++ float--a float. ++ ++ float-1--a float. ++ ++ float-2--a float. ++ ++ float-radix--an integer. ++ ++ integer--a non-negative integer. ++ ++ integer-sign--the integer -1, or the integer 1. ++ ++ scaled-float--a float. ++ ++ sign--A float of the same type as float but numerically equal to 1.0 ++or -1.0. ++ ++ signed-float--a float. ++ ++ significand--a float. ++ ++Description:: ++............. ++ ++decode-float computes three values that characterize float. The first ++value is of the same type as float and represents the significand. The ++second value represents the exponent to which the radix (notated in this ++description by b) must be raised to obtain the value that, when ++multiplied with the first result, produces the absolute value of float. ++If float is zero, any integer value may be returned, provided that the ++identity shown for scale-float holds. The third value is of the same ++type as float and is 1.0 if float is greater than or equal to zero or ++-1.0 otherwise. ++ ++ decode-float divides float by an integral power of b so as to bring ++its value between 1/b (inclusive) and~1 (exclusive), and returns the ++quotient as the first value. If float is zero, however, the result ++equals the absolute value of float (that is, if there is a negative ++zero, its significand is considered to be a positive zero). ++ ++ scale-float returns (* float (expt (float b float) integer))\/, where ++b is the radix of the floating-point representation. float is not ++necessarily between 1/b and~1. ++ ++ float-radix returns the radix of float. ++ ++ float-sign returns a number z such that z and float-1 have the same ++sign and also such that z and float-2 have the same absolute value. If ++float-2 is not supplied, its value is (float 1 float-1). If an ++implementation has distinct representations for negative zero and ++positive zero, then (float-sign -0.0) => -1.0. ++ ++ float-digits returns the number of radix b digits used in the ++representation of float (including any implicit digits, such as a ++"hidden bit"). ++ ++ float-precision returns the number of significant radix b digits ++present in float; if float is a float zero, then the result is an ++integer zero. ++ ++ For normalized floats, the results of float-digits and ++float-precision are the same, but the precision is less than the number ++of representation digits for a denormalized or zero number. ++ ++ integer-decode-float computes three values that characterize float - ++the significand scaled so as to be an integer, and the same last two ++values that are returned by decode-float. If float is zero, ++integer-decode-float returns zero as the first value. The second value ++bears the same relationship to the first value as for decode-float: ++ ++ (multiple-value-bind (signif expon sign) ++ (integer-decode-float f) ++ (scale-float (float signif f) expon)) == (abs f) ++ ++Examples:: ++.......... ++ ++ ;; Note that since the purpose of this functionality is to expose ++ ;; details of the implementation, all of these examples are necessarily ++ ;; very implementation-dependent. Results may vary widely. ++ ;; Values shown here are chosen consistently from one particular implementation. ++ (decode-float .5) => 0.5, 0, 1.0 ++ (decode-float 1.0) => 0.5, 1, 1.0 ++ (scale-float 1.0 1) => 2.0 ++ (scale-float 10.01 -2) => 2.5025 ++ (scale-float 23.0 0) => 23.0 ++ (float-radix 1.0) => 2 ++ (float-sign 5.0) => 1.0 ++ (float-sign -5.0) => -1.0 ++ (float-sign 0.0) => 1.0 ++ (float-sign 1.0 0.0) => 0.0 ++ (float-sign 1.0 -10.0) => 10.0 ++ (float-sign -1.0 10.0) => -10.0 ++ (float-digits 1.0) => 24 ++ (float-precision 1.0) => 24 ++ (float-precision least-positive-single-float) => 1 ++ (integer-decode-float 1.0) => 8388608, -23, 1 ++ ++Affected By:: ++............. ++ ++The implementation's representation for floats. ++ ++Exceptional Situations:: ++........................ ++ ++The functions decode-float, float-radix, float-digits, float-precision, ++and integer-decode-float should signal an error if their only argument ++is not a float. ++ ++ The function scale-float should signal an error if its first argument ++is not a float or if its second argument is not an integer. ++ ++ The function float-sign should signal an error if its first argument ++is not a float or if its second argument is supplied but is not a float. ++ ++Notes:: ++....... ++ ++The product of the first result of decode-float or integer-decode-float, ++of the radix raised to the power of the second result, and of the third ++result is exactly equal to the value of float. ++ ++ (multiple-value-bind (signif expon sign) ++ (decode-float f) ++ (scale-float signif expon)) ++ == (abs f) ++ ++ and ++ ++ (multiple-value-bind (signif expon sign) ++ (decode-float f) ++ (* (scale-float signif expon) sign)) ++ == f ++ ++ ++File: gcl.info, Node: float, Next: floatp, Prev: decode-float, Up: Numbers Dictionary ++ ++12.2.74 float [Function] ++------------------------ ++ ++'float' number &optional prototype => float ++ ++Arguments and Values:: ++...................... ++ ++number--a real. ++ ++ prototype--a float. ++ ++ float--a float. ++ ++Description:: ++............. ++ ++float converts a ++ ++ real ++ ++ number to a float. ++ ++ If a prototype is supplied, a float is returned that is ++mathematically equal to number but has the same format as prototype. ++ ++ If prototype is not supplied, then if the number is already a float, ++it is returned; otherwise, a float is returned that is mathematically ++equal to number but is a single float. ++ ++Examples:: ++.......... ++ ++ (float 0) => 0.0 ++ (float 1 .5) => 1.0 ++ (float 1.0) => 1.0 ++ (float 1/2) => 0.5 ++ => 1.0d0 ++ OR=> 1.0 ++ (eql (float 1.0 1.0d0) 1.0d0) => true ++ ++See Also:: ++.......... ++ ++*note coerce:: ++ ++ ++File: gcl.info, Node: floatp, Next: most-positive-short-float, Prev: float, Up: Numbers Dictionary ++ ++12.2.75 floatp [Function] ++------------------------- ++ ++'floatp' object generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type float; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (floatp 1.2d2) => true ++ (floatp 1.212) => true ++ (floatp 1.2s2) => true ++ (floatp (expt 2 130)) => false ++ ++Notes:: ++....... ++ ++ (floatp object) == (typep object 'float) ++ ++ ++File: gcl.info, Node: most-positive-short-float, Next: short-float-epsilon, Prev: floatp, Up: Numbers Dictionary ++ ++12.2.76 most-positive-short-float, least-positive-short-float, ++-------------------------------------------------------------- ++ ++least-positive-normalized-short-float, ++-------------------------------------- ++ ++most-positive-double-float, least-positive-double-float, ++-------------------------------------------------------- ++ ++least-positive-normalized-double-float, ++--------------------------------------- ++ ++most-positive-long-float, least-positive-long-float, ++---------------------------------------------------- ++ ++least-positive-normalized-long-float, ++------------------------------------- ++ ++most-positive-single-float, least-positive-single-float, ++-------------------------------------------------------- ++ ++least-positive-normalized-single-float, ++--------------------------------------- ++ ++most-negative-short-float, least-negative-short-float, ++------------------------------------------------------ ++ ++least-negative-normalized-short-float, ++-------------------------------------- ++ ++most-negative-single-float, least-negative-single-float, ++-------------------------------------------------------- ++ ++least-negative-normalized-single-float, ++--------------------------------------- ++ ++most-negative-double-float, least-negative-double-float, ++-------------------------------------------------------- ++ ++least-negative-normalized-double-float, ++--------------------------------------- ++ ++most-negative-long-float, least-negative-long-float, ++---------------------------------------------------- ++ ++least-negative-normalized-long-float ++------------------------------------ ++ ++ [Constant Variable] ++ ++Constant Value:: ++................ ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++These constant variables provide a way for programs to examine the ++implementation-defined limits for the various float formats. ++ ++ Of these variables, each which has "-normalized" in its name must ++have a value which is a normalized float, and each which does not have ++"-normalized" in its name may have a value which is either a normalized ++float or a denormalized float, as appropriate. ++ ++ Of these variables, each which has "short-float" in its name must ++have a value which is a short float, each which has "single-float" in ++its name must have a value which is a single float, each which has ++"double-float" in its name must have a value which is a double float, ++and each which has "long-float" in its name must have a value which is a ++long float. ++ ++* ++ most-positive-short-float, most-positive-single-float, ++ most-positive-double-float, most-positive-long-float ++ ++ Each of these constant variables has as its value the positive ++ float of the largest magnitude (closest in value to, but not equal ++ to, positive infinity) for the float format implied by its name. ++ ++* ++ least-positive-short-float, least-positive-normalized-short-float, ++ least-positive-single-float, ++ least-positive-normalized-single-float, ++ least-positive-double-float, ++ least-positive-normalized-double-float, least-positive-long-float, ++ least-positive-normalized-long-float ++ ++ Each of these constant variables has as its value the smallest ++ positive (nonzero) float for the float format implied by its name. ++ ++* ++ least-negative-short-float, least-negative-normalized-short-float, ++ least-negative-single-float, ++ least-negative-normalized-single-float, ++ least-negative-double-float, ++ least-negative-normalized-double-float, least-negative-long-float, ++ least-negative-normalized-long-float ++ ++ Each of these constant variables has as its value the negative ++ (nonzero) float of the smallest magnitude for the float format ++ implied by its name. (If an implementation supports minus zero as ++ a different object from positive zero, this value must not be minus ++ zero.) ++ ++* ++ most-negative-short-float, most-negative-single-float, ++ most-negative-double-float, most-negative-long-float ++ ++ Each of these constant variables has as its value the negative ++ float of the largest magnitude (closest in value to, but not equal ++ to, negative infinity) for the float format implied by its name. ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: short-float-epsilon, Next: arithmetic-error, Prev: most-positive-short-float, Up: Numbers Dictionary ++ ++12.2.77 short-float-epsilon, short-float-negative-epsilon, ++---------------------------------------------------------- ++ ++single-float-epsilon, single-float-negative-epsilon, ++---------------------------------------------------- ++ ++double-float-epsilon, double-float-negative-epsilon, ++---------------------------------------------------- ++ ++long-float-epsilon, long-float-negative-epsilon ++----------------------------------------------- ++ ++ [Constant Variable] ++ ++Constant Value:: ++................ ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The value of each of the constants short-float-epsilon, ++single-float-epsilon, double-float-epsilon, and long-float-epsilon is ++the smallest positive float \epsilon of the given format, such that the ++following expression is true when evaluated: ++ ++ (not (= (float 1 \epsilon) (+ (float 1 \epsilon) \epsilon)))\/ ++ ++ The value of each of the constants short-float-negative-epsilon, ++single-float-negative-epsilon, double-float-negative-epsilon, and ++long-float-negative-epsilon is the smallest positive float \epsilon of ++the given format, such that the following expression is true when ++evaluated: ++ ++ (not (= (float 1 \epsilon) (- (float 1 \epsilon) \epsilon)))\/ ++ ++ ++File: gcl.info, Node: arithmetic-error, Next: arithmetic-error-operands, Prev: short-float-epsilon, Up: Numbers Dictionary ++ ++12.2.78 arithmetic-error [Condition Type] ++----------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++arithmetic-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type arithmetic-error consists of error conditions that occur during ++arithmetic operations. The operation and operands are initialized with ++the initialization arguments named :operation and :operands to ++make-condition, and are accessed by the functions ++arithmetic-error-operation and arithmetic-error-operands. ++ ++See Also:: ++.......... ++ ++arithmetic-error-operation, *note arithmetic-error-operands:: ++ ++ ++File: gcl.info, Node: arithmetic-error-operands, Next: division-by-zero, Prev: arithmetic-error, Up: Numbers Dictionary ++ ++12.2.79 arithmetic-error-operands, arithmetic-error-operation [Function] ++------------------------------------------------------------------------ ++ ++'arithmetic-error-operands' condition => operands ++ ++ 'arithmetic-error-operation' condition => operation ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type arithmetic-error. ++ ++ operands--a list. ++ ++ operation--a function designator. ++ ++Description:: ++............. ++ ++arithmetic-error-operands returns a list of the operands which were used ++in the offending call to the operation that signaled the condition. ++ ++ arithmetic-error-operation returns a list of the offending operation ++in the offending call that signaled the condition. ++ ++See Also:: ++.......... ++ ++arithmetic-error, *note Conditions:: ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: division-by-zero, Next: floating-point-invalid-operation, Prev: arithmetic-error-operands, Up: Numbers Dictionary ++ ++12.2.80 division-by-zero [Condition Type] ++----------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++division-by-zero, arithmetic-error, error, serious-condition, condition, ++t ++ ++Description:: ++............. ++ ++The type division-by-zero consists of error conditions that occur ++because of division by zero. ++ ++ ++File: gcl.info, Node: floating-point-invalid-operation, Next: floating-point-inexact, Prev: division-by-zero, Up: Numbers Dictionary ++ ++12.2.81 floating-point-invalid-operation [Condition Type] ++--------------------------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++floating-point-invalid-operation, arithmetic-error, error, ++serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type floating-point-invalid-operation consists of error conditions ++that occur because of certain floating point traps. ++ ++ It is implementation-dependent whether floating point traps occur, ++and whether or how they may be enabled or disabled. Therefore, ++conforming code may establish handlers for this condition, but must not ++depend on its being signaled. ++ ++ ++File: gcl.info, Node: floating-point-inexact, Next: floating-point-overflow, Prev: floating-point-invalid-operation, Up: Numbers Dictionary ++ ++12.2.82 floating-point-inexact [Condition Type] ++----------------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++floating-point-inexact, arithmetic-error, error, serious-condition, ++condition, t ++ ++Description:: ++............. ++ ++The type floating-point-inexact consists of error conditions that occur ++because of certain floating point traps. ++ ++ It is implementation-dependent whether floating point traps occur, ++and whether or how they may be enabled or disabled. Therefore, ++conforming code may establish handlers for this condition, but must not ++depend on its being signaled. ++ ++ ++File: gcl.info, Node: floating-point-overflow, Next: floating-point-underflow, Prev: floating-point-inexact, Up: Numbers Dictionary ++ ++12.2.83 floating-point-overflow [Condition Type] ++------------------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++floating-point-overflow, arithmetic-error, error, serious-condition, ++condition, t ++ ++Description:: ++............. ++ ++The type floating-point-overflow consists of error conditions that occur ++because of floating-point overflow. ++ ++ ++File: gcl.info, Node: floating-point-underflow, Prev: floating-point-overflow, Up: Numbers Dictionary ++ ++12.2.84 floating-point-underflow [Condition Type] ++------------------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++floating-point-underflow, arithmetic-error, error, serious-condition, ++condition, t ++ ++Description:: ++............. ++ ++The type floating-point-underflow consists of error conditions that ++occur because of floating-point underflow. ++ ++ ++File: gcl.info, Node: Characters, Next: Conses, Prev: Numbers (Numbers), Up: Top ++ ++13 Characters ++************* ++ ++* Menu: ++ ++* Character Concepts:: ++* Characters Dictionary:: ++ ++ ++File: gcl.info, Node: Character Concepts, Next: Characters Dictionary, Prev: Characters, Up: Characters ++ ++13.1 Character Concepts ++======================= ++ ++* Menu: ++ ++* Introduction to Characters:: ++* Introduction to Scripts and Repertoires:: ++* Character Attributes:: ++* Character Categories:: ++* Identity of Characters:: ++* Ordering of Characters:: ++* Character Names:: ++* Treatment of Newline during Input and Output:: ++* Character Encodings:: ++* Documentation of Implementation-Defined Scripts:: ++ ++ ++File: gcl.info, Node: Introduction to Characters, Next: Introduction to Scripts and Repertoires, Prev: Character Concepts, Up: Character Concepts ++ ++13.1.1 Introduction to Characters ++--------------------------------- ++ ++A character is an object that represents a unitary token (e.g., a ++letter, a special symbol, or a "control character") in an aggregate ++quantity of text (e.g., a string or a text stream). ++ ++ Common Lisp allows an implementation to provide support for ++international language characters as well as characters used in ++specialized arenas (e.g., mathematics). ++ ++ The following figures contain lists of defined names applicable to ++characters. ++ ++ Figure 13-1 lists some defined names relating to character attributes ++and character predicates. ++ ++ alpha-char-p char-not-equal char> ++ alphanumericp char-not-greaterp char>= ++ both-case-p char-not-lessp digit-char-p ++ char-code-limit char/= graphic-char-p ++ char-equal char< lower-case-p ++ char-greaterp char<= standard-char-p ++ char-lessp char= upper-case-p ++ ++ Figure 13-1: Character defined names - 1 ++ ++ ++ Figure 13-2 lists some character construction and conversion defined ++names. ++ ++ char-code char-name code-char ++ char-downcase char-upcase digit-char ++ char-int character name-char ++ ++ Figure 13-2: Character defined names - 2 ++ ++ ++ ++File: gcl.info, Node: Introduction to Scripts and Repertoires, Next: Character Attributes, Prev: Introduction to Characters, Up: Character Concepts ++ ++13.1.2 Introduction to Scripts and Repertoires ++---------------------------------------------- ++ ++* Menu: ++ ++* Character Scripts:: ++* Character Repertoires:: ++ ++ ++File: gcl.info, Node: Character Scripts, Next: Character Repertoires, Prev: Introduction to Scripts and Repertoires, Up: Introduction to Scripts and Repertoires ++ ++13.1.2.1 Character Scripts ++.......................... ++ ++A script is one of possibly several sets that form an exhaustive ++partition of the type character. ++ ++ The number of such sets and boundaries between them is ++implementation-defined. Common Lisp does not require these sets to be ++types, but an implementation is permitted to define such types as an ++extension. Since no character from one script can ever be a member of ++another script, it is generally more useful to speak about character ++repertoires. ++ ++ Although the term "script" is chosen for definitional compatibility ++with ISO terminology, no conforming implementation is required to use ++any particular scripts standardized by ISO or by any other standards ++organization. ++ ++ Whether and how the script or scripts used by any given ++implementation are named is implementation-dependent. ++ ++ ++File: gcl.info, Node: Character Repertoires, Prev: Character Scripts, Up: Introduction to Scripts and Repertoires ++ ++13.1.2.2 Character Repertoires ++.............................. ++ ++A repertoire is a type specifier for a subtype of type character. ++ ++ This term is generally used when describing a collection of ++characters independent of their coding. Characters in repertoires are ++only identified by name, by glyph, or by character description. ++ ++ A repertoire can contain characters from several scripts, and a ++character can appear in more than one repertoire. ++ ++ For some examples of repertoires, see the coded character standards ++ISO 8859/1, ISO 8859/2, and ISO 6937/2. Note, however, that although ++the term "repertoire" is chosen for definitional compatibility with ISO ++terminology, no conforming implementation is required to use repertoires ++standardized by ISO or any other standards organization. ++ ++ ++File: gcl.info, Node: Character Attributes, Next: Character Categories, Prev: Introduction to Scripts and Repertoires, Up: Character Concepts ++ ++13.1.3 Character Attributes ++--------------------------- ++ ++Characters have only one standardized attribute: a code. A character's ++code is a non-negative integer. This code is composed from a character ++script and a character label in an implementation-dependent way. See ++the functions char-code and code-char. ++ ++ Additional, implementation-defined attributes of characters are also ++permitted so that, for example, two characters with the same code may ++differ in some other, implementation-defined way. ++ ++ For any implementation-defined attribute there is a distinguished ++value called the null value for that attribute. A character for which ++each implementation-defined attribute has the null value for that ++attribute is called a simple character. If the implementation has no ++implementation-defined attributes, then all characters are simple ++characters. ++ ++ ++File: gcl.info, Node: Character Categories, Next: Identity of Characters, Prev: Character Attributes, Up: Character Concepts ++ ++13.1.4 Character Categories ++--------------------------- ++ ++There are several (overlapping) categories of characters that have no ++formally associated type but that are nevertheless useful to name. They ++include graphic characters, alphabetic_1 characters, characters with ++case (uppercase and lowercase characters), numeric characters, ++alphanumeric characters, and digits (in a given radix). ++ ++ For each implementation-defined attribute of a character, the ++documentation for that implementation must specify whether characters ++that differ only in that attribute are permitted to differ in whether ++are not they are members of one of the aforementioned categories. ++ ++ Note that these terms are defined independently of any special syntax ++which might have been enabled in the current readtable. ++ ++* Menu: ++ ++* Graphic Characters:: ++* Alphabetic Characters:: ++* Characters With Case:: ++* Uppercase Characters:: ++* Lowercase Characters:: ++* Corresponding Characters in the Other Case:: ++* Case of Implementation-Defined Characters:: ++* Numeric Characters:: ++* Alphanumeric Characters:: ++* Digits in a Radix:: ++ ++ ++File: gcl.info, Node: Graphic Characters, Next: Alphabetic Characters, Prev: Character Categories, Up: Character Categories ++ ++13.1.4.1 Graphic Characters ++........................... ++ ++Characters that are classified as graphic , or displayable, are each ++associated with a glyph, a visual representation of the character. ++ ++ A graphic character is one that has a standard textual representation ++as a single glyph, such as A or * or =. Space, which effectively has a ++blank glyph, is defined to be a graphic. ++ ++ Of the standard characters, newline is non-graphic and all others are ++graphic; see *note Standard Characters::. ++ ++ Characters that are not graphic are called non-graphic . ++ ++ Non-graphic characters are sometimes informally called "formatting ++characters" or "control characters." ++ ++ #\Backspace, #\Tab, #\Rubout, #\Linefeed, #\Return, and #\Page, if ++they are supported by the implementation, are non-graphic. ++ ++ ++File: gcl.info, Node: Alphabetic Characters, Next: Characters With Case, Prev: Graphic Characters, Up: Character Categories ++ ++13.1.4.2 Alphabetic Characters ++.............................. ++ ++The alphabetic_1 characters are a subset of the graphic characters. Of ++the standard characters, only these are the alphabetic_1 characters: ++ ++ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ++ ++ a b c d e f g h i j k l m n o p q r s t u v w x y z ++ ++ Any implementation-defined character that has case must be ++alphabetic_1. For each implementation-defined graphic character that ++has no case, it is implementation-defined whether that character is ++alphabetic_1. ++ ++ ++File: gcl.info, Node: Characters With Case, Next: Uppercase Characters, Prev: Alphabetic Characters, Up: Character Categories ++ ++13.1.4.3 Characters With Case ++............................. ++ ++The characters with case are a subset of the alphabetic_1 characters. A ++character with case has the property of being either uppercase or ++lowercase. Every character with case is in one-to-one correspondence ++with some other character with the opposite case. ++ ++ ++File: gcl.info, Node: Uppercase Characters, Next: Lowercase Characters, Prev: Characters With Case, Up: Character Categories ++ ++13.1.4.4 Uppercase Characters ++............................. ++ ++An uppercase character is one that has a corresponding lowercase ++character that is different (and can be obtained using char-downcase). ++ ++ Of the standard characters, only these are uppercase characters: ++ ++ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ++ ++ ++File: gcl.info, Node: Lowercase Characters, Next: Corresponding Characters in the Other Case, Prev: Uppercase Characters, Up: Character Categories ++ ++13.1.4.5 Lowercase Characters ++............................. ++ ++A lowercase character is one that has a corresponding uppercase ++character that is different (and can be obtained using char-upcase). ++ ++ Of the standard characters, only these are lowercase characters: ++ ++ a b c d e f g h i j k l m n o p q r s t u v w x y z ++ ++ ++File: gcl.info, Node: Corresponding Characters in the Other Case, Next: Case of Implementation-Defined Characters, Prev: Lowercase Characters, Up: Character Categories ++ ++13.1.4.6 Corresponding Characters in the Other Case ++................................................... ++ ++The uppercase standard characters A through Z mentioned above ++respectively correspond to the lowercase standard characters a through z ++mentioned above. For example, the uppercase character E corresponds to ++the lowercase character e, and vice versa. ++ ++ ++File: gcl.info, Node: Case of Implementation-Defined Characters, Next: Numeric Characters, Prev: Corresponding Characters in the Other Case, Up: Character Categories ++ ++13.1.4.7 Case of Implementation-Defined Characters ++.................................................. ++ ++An implementation may define that other implementation-defined graphic ++characters have case. Such definitions must always be done in ++pairs--one uppercase character in one-to-one correspondence with one ++lowercase character. ++ ++ ++File: gcl.info, Node: Numeric Characters, Next: Alphanumeric Characters, Prev: Case of Implementation-Defined Characters, Up: Character Categories ++ ++13.1.4.8 Numeric Characters ++........................... ++ ++The numeric characters are a subset of the graphic characters. Of the ++standard characters, only these are numeric characters: ++ ++ 0 1 2 3 4 5 6 7 8 9 ++ ++ For each implementation-defined graphic character that has no case, ++the implementation must define whether or not it is a numeric character. ++ ++ ++File: gcl.info, Node: Alphanumeric Characters, Next: Digits in a Radix, Prev: Numeric Characters, Up: Character Categories ++ ++13.1.4.9 Alphanumeric Characters ++................................ ++ ++The set of alphanumeric characters is the union of the set of ++alphabetic_1 characters and the set of numeric characters. ++ ++ ++File: gcl.info, Node: Digits in a Radix, Prev: Alphanumeric Characters, Up: Character Categories ++ ++13.1.4.10 Digits in a Radix ++........................... ++ ++What qualifies as a digit depends on the radix (an integer between 2 and ++36, inclusive). The potential digits are: ++ ++ 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y ++Z ++ ++ Their respective weights are 0, 1, 2, ... 35. In any given radix n, ++only the first n potential digits are considered to be digits. For ++example, the digits in radix 2 are 0 and 1, the digits in radix 10 are 0 ++through 9, and the digits in radix 16 are 0 through F. ++ ++ Case is not significant in digits; for example, in radix 16, both F ++and f are digits with weight 15. ++ ++ ++File: gcl.info, Node: Identity of Characters, Next: Ordering of Characters, Prev: Character Categories, Up: Character Concepts ++ ++13.1.5 Identity of Characters ++----------------------------- ++ ++Two characters that are eql, char=, or char-equal are not necessarily ++eq. ++ ++ ++File: gcl.info, Node: Ordering of Characters, Next: Character Names, Prev: Identity of Characters, Up: Character Concepts ++ ++13.1.6 Ordering of Characters ++----------------------------- ++ ++The total ordering on characters is guaranteed to have the following ++properties: ++ ++* ++ If two characters have the same implementation-defined attributes, ++ then their ordering by char< is consistent with the numerical ++ ordering by the predicate < on their code attributes. ++ ++* ++ If two characters differ in any attribute, then they are not char=. ++ ++ [Reviewer Note by Barmar: I wonder if we should say that the ++ ordering may be dependent on the implementation-defined ++ attributes.] ++ ++* ++ The total ordering is not necessarily the same as the total ++ ordering on the integers produced by applying char-int to the ++ characters. ++ ++* ++ While alphabetic_1 standard characters of a given case must obey a ++ partial ordering, they need not be contiguous; it is permissible ++ for uppercase and lowercase characters to be interleaved. Thus ++ (char<= #\a x #\z) is not a valid way of determining whether or not ++ x is a lowercase character. ++ ++ Of the standard characters, those which are alphanumeric obey the ++following partial ordering: ++ ++ A, char<=, char>=, ++--------------------------------------------------- ++ ++char-equal, char-not-equal, char-lessp, char-greaterp, char-not-greaterp, ++------------------------------------------------------------------------- ++ ++char-not-lessp ++-------------- ++ ++ [Function] ++ ++ 'char=' &rest characters^+ => generalized-boolean ++ ++ 'char/=' &rest characters^+ => generalized-boolean ++ ++ 'char<' &rest characters^+ => generalized-boolean ++ ++ 'char>' &rest characters^+ => generalized-boolean ++ ++ 'char<=' &rest characters^+ => generalized-boolean ++ ++ 'char>=' &rest characters^+ => generalized-boolean ++ ++ 'char-equal' &rest characters^+ => generalized-boolean ++ ++ 'char-not-equal' &rest characters^+ => generalized-boolean ++ ++ 'char-lessp' &rest characters^+ => generalized-boolean ++ ++ 'char-greaterp' &rest characters^+ => generalized-boolean ++ ++ 'char-not-greaterp' &rest characters^+ => generalized-boolean ++ ++ 'char-not-lessp' &rest characters^+ => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++These predicates compare characters. ++ ++ char= returns true if all characters are the same; otherwise, it ++returns false. ++ ++ If two characters differ in any implementation-defined attributes, ++then they are not char=. ++ ++ char/= returns true if all characters are different; otherwise, it ++returns false. ++ ++ char< returns true if the characters are monotonically increasing; ++otherwise, it returns false. ++ ++ If two characters have identical implementation-defined attributes, ++then their ordering by char< is consistent with the numerical ordering ++by the predicate < on their codes. ++ ++ char> returns true if the characters are monotonically decreasing; ++otherwise, it returns false. ++ ++ If two characters have identical implementation-defined attributes, ++then their ordering by char> is consistent with the numerical ordering ++by the predicate > on their codes. ++ ++ char<= returns true if the characters are monotonically ++nondecreasing; otherwise, it returns false. ++ ++ If two characters have identical implementation-defined attributes, ++then their ordering by char<= is consistent with the numerical ordering ++by the predicate <= on their codes. ++ ++ char>= returns true if the characters are monotonically ++nonincreasing; otherwise, it returns false. ++ ++ If two characters have identical implementation-defined attributes, ++then their ordering by char>= is consistent with the numerical ordering ++by the predicate >= on their codes. ++ ++ char-equal, char-not-equal, char-lessp, char-greaterp, ++char-not-greaterp, and char-not-lessp are similar to char=, char/=, ++char<, char>, char<=, char>=, respectively, except that they ignore ++differences in case and ++ ++ might have an implementation-defined behavior for non-simple ++characters. For example, an implementation might define that ++char-equal, etc. ignore certain implementation-defined attributes. The ++effect, if any, of each implementation-defined attribute upon these ++functions must be specified as part of the definition of that attribute. ++ ++Examples:: ++.......... ++ ++ (char= #\d #\d) => true ++ (char= #\A #\a) => false ++ (char= #\d #\x) => false ++ (char= #\d #\D) => false ++ (char/= #\d #\d) => false ++ (char/= #\d #\x) => true ++ (char/= #\d #\D) => true ++ (char= #\d #\d #\d #\d) => true ++ (char/= #\d #\d #\d #\d) => false ++ (char= #\d #\d #\x #\d) => false ++ (char/= #\d #\d #\x #\d) => false ++ (char= #\d #\y #\x #\c) => false ++ (char/= #\d #\y #\x #\c) => true ++ (char= #\d #\c #\d) => false ++ (char/= #\d #\c #\d) => false ++ (char< #\d #\x) => true ++ (char<= #\d #\x) => true ++ (char< #\d #\d) => false ++ (char<= #\d #\d) => true ++ (char< #\a #\e #\y #\z) => true ++ (char<= #\a #\e #\y #\z) => true ++ (char< #\a #\e #\e #\y) => false ++ (char<= #\a #\e #\e #\y) => true ++ (char> #\e #\d) => true ++ (char>= #\e #\d) => true ++ (char> #\d #\c #\b #\a) => true ++ (char>= #\d #\c #\b #\a) => true ++ (char> #\d #\d #\c #\a) => false ++ (char>= #\d #\d #\c #\a) => true ++ (char> #\e #\d #\b #\c #\a) => false ++ (char>= #\e #\d #\b #\c #\a) => false ++ (char> #\z #\A) => implementation-dependent ++ (char> #\Z #\a) => implementation-dependent ++ (char-equal #\A #\a) => true ++ (stable-sort (list #\b #\A #\B #\a #\c #\C) #'char-lessp) ++ => (#\A #\a #\b #\B #\c #\C) ++ (stable-sort (list #\b #\A #\B #\a #\c #\C) #'char<) ++ => (#\A #\B #\C #\a #\b #\c) ;Implementation A ++ => (#\a #\b #\c #\A #\B #\C) ;Implementation B ++ => (#\a #\A #\b #\B #\c #\C) ;Implementation C ++ => (#\A #\a #\B #\b #\C #\c) ;Implementation D ++ => (#\A #\B #\a #\b #\C #\c) ;Implementation E ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type program-error if at least one character ++is not supplied. ++ ++See Also:: ++.......... ++ ++*note Character Syntax::, *note Documentation of Implementation-Defined ++Scripts:: ++ ++Notes:: ++....... ++ ++If characters differ in their code attribute or any ++implementation-defined attribute, they are considered to be different by ++char=. ++ ++ There is no requirement that (eq c1 c2) be true merely because (char= ++c1 c2) is true. While eq can distinguish two characters that char= does ++not, it is distinguishing them not as characters, but in some sense on ++the basis of a lower level implementation characteristic. If (eq c1 c2) ++is true, then (char= c1 c2) is also true. eql and equal compare ++characters in the same way that char= does. ++ ++ The manner in which case is used by char-equal, char-not-equal, ++char-lessp, char-greaterp, char-not-greaterp, and char-not-lessp implies ++an ordering for standard characters such that A=a, B=b, and so on, up to ++Z=z, and furthermore either 9 denoted-character ++ ++Arguments and Values:: ++...................... ++ ++character--a character designator. ++ ++ denoted-character--a character. ++ ++Description:: ++............. ++ ++Returns the character denoted by the character designator. ++ ++Examples:: ++.......... ++ ++ (character #\a) => #\a ++ (character "a") => #\a ++ (character 'a) => #\A ++ (character '\a) => #\a ++ (character 65.) is an error. ++ (character 'apple) is an error. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if object is not a character ++designator. ++ ++See Also:: ++.......... ++ ++*note coerce:: ++ ++Notes:: ++....... ++ ++ (character object) == (coerce object 'character) ++ ++ ++File: gcl.info, Node: characterp, Next: alpha-char-p, Prev: character, Up: Characters Dictionary ++ ++13.2.7 characterp [Function] ++---------------------------- ++ ++'characterp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type character; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (characterp #\a) => true ++ (characterp 'a) => false ++ (characterp "a") => false ++ (characterp 65.) => false ++ (characterp #\Newline) => true ++ ;; This next example presupposes an implementation ++ ;; in which #\Rubout is an implementation-defined character. ++ (characterp #\Rubout) => true ++ ++See Also:: ++.......... ++ ++*note character:: (type and function), *note typep:: ++ ++Notes:: ++....... ++ ++ (characterp object) == (typep object 'character) ++ ++ ++File: gcl.info, Node: alpha-char-p, Next: alphanumericp, Prev: characterp, Up: Characters Dictionary ++ ++13.2.8 alpha-char-p [Function] ++------------------------------ ++ ++'alpha-char-p' character => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if character is an alphabetic_1 character; otherwise, ++returns false. ++ ++Examples:: ++.......... ++ ++ (alpha-char-p #\a) => true ++ (alpha-char-p #\5) => false ++ (alpha-char-p #\Newline) => false ++ ;; This next example presupposes an implementation ++ ;; in which #\\alpha is a defined character. ++ (alpha-char-p #\\alpha) => implementation-dependent ++ ++Affected By:: ++............. ++ ++None. (In particular, the results of this predicate are independent of ++any special syntax which might have been enabled in the current ++readtable.) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note alphanumericp:: , *note Documentation of Implementation-Defined ++Scripts:: ++ ++ ++File: gcl.info, Node: alphanumericp, Next: digit-char, Prev: alpha-char-p, Up: Characters Dictionary ++ ++13.2.9 alphanumericp [Function] ++------------------------------- ++ ++'alphanumericp' character => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if character is an alphabetic_1 character or a numeric ++character; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (alphanumericp #\Z) => true ++ (alphanumericp #\9) => true ++ (alphanumericp #\Newline) => false ++ (alphanumericp #\#) => false ++ ++Affected By:: ++............. ++ ++None. (In particular, the results of this predicate are independent of ++any special syntax which might have been enabled in the current ++readtable.) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note alpha-char-p:: , *note graphic-char-p:: , *note digit-char-p:: ++ ++Notes:: ++....... ++ ++Alphanumeric characters are graphic as defined by graphic-char-p. The ++alphanumeric characters are a subset of the graphic characters. The ++standard characters A through Z, a through z, and 0 through 9 are ++alphanumeric characters. ++ ++ (alphanumericp x) ++ == (or (alpha-char-p x) (not (null (digit-char-p x)))) ++ ++ ++File: gcl.info, Node: digit-char, Next: digit-char-p, Prev: alphanumericp, Up: Characters Dictionary ++ ++13.2.10 digit-char [Function] ++----------------------------- ++ ++'digit-char' weight &optional radix => char ++ ++Arguments and Values:: ++...................... ++ ++weight--a non-negative integer. ++ ++ radix--a radix. The default is 10. ++ ++ char--a character or false. ++ ++Description:: ++............. ++ ++If weight is less than radix, digit-char returns a character which has ++that weight when considered as a digit in the specified radix. If the ++resulting character is to be an alphabetic_1 character, it will be an ++uppercase character. ++ ++ If weight is greater than or equal to radix, digit-char returns ++false. ++ ++Examples:: ++.......... ++ ++ (digit-char 0) => #\0 ++ (digit-char 10 11) => #\A ++ (digit-char 10 10) => false ++ (digit-char 7) => #\7 ++ (digit-char 12) => false ++ (digit-char 12 16) => #\C ;not #\c ++ (digit-char 6 2) => false ++ (digit-char 1 2) => #\1 ++ ++See Also:: ++.......... ++ ++*note digit-char-p:: , *note graphic-char-p:: , *note Character Syntax:: ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: digit-char-p, Next: graphic-char-p, Prev: digit-char, Up: Characters Dictionary ++ ++13.2.11 digit-char-p [Function] ++------------------------------- ++ ++'digit-char-p' char &optional radix => weight ++ ++Arguments and Values:: ++...................... ++ ++char--a character. ++ ++ radix--a radix. The default is 10. ++ ++ weight--either a non-negative integer less than radix, or false. ++ ++Description:: ++............. ++ ++Tests whether char is a digit in the specified radix (i.e., with a ++weight less than radix). If it is a digit in that radix, its weight is ++returned as an integer; otherwise nil is returned. ++ ++Examples:: ++.......... ++ ++ (digit-char-p #\5) => 5 ++ (digit-char-p #\5 2) => false ++ (digit-char-p #\A) => false ++ (digit-char-p #\a) => false ++ (digit-char-p #\A 11) => 10 ++ (digit-char-p #\a 11) => 10 ++ (mapcar #'(lambda (radix) ++ (map 'list #'(lambda (x) (digit-char-p x radix)) ++ "059AaFGZ")) ++ '(2 8 10 16 36)) ++ => ((0 NIL NIL NIL NIL NIL NIL NIL) ++ (0 5 NIL NIL NIL NIL NIL NIL) ++ (0 5 9 NIL NIL NIL NIL NIL) ++ (0 5 9 10 10 15 NIL NIL) ++ (0 5 9 10 10 15 16 35)) ++ ++Affected By:: ++............. ++ ++None. (In particular, the results of this predicate are independent of ++any special syntax which might have been enabled in the current ++readtable.) ++ ++See Also:: ++.......... ++ ++*note alphanumericp:: ++ ++Notes:: ++....... ++ ++Digits are graphic characters. ++ ++ ++File: gcl.info, Node: graphic-char-p, Next: standard-char-p, Prev: digit-char-p, Up: Characters Dictionary ++ ++13.2.12 graphic-char-p [Function] ++--------------------------------- ++ ++'graphic-char-p' char => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++char--a character. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if character is a graphic character; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (graphic-char-p #\G) => true ++ (graphic-char-p #\#) => true ++ (graphic-char-p #\Space) => true ++ (graphic-char-p #\Newline) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note read:: , *note Character Syntax::, *note Documentation of ++Implementation-Defined Scripts:: ++ ++ ++File: gcl.info, Node: standard-char-p, Next: char-upcase, Prev: graphic-char-p, Up: Characters Dictionary ++ ++13.2.13 standard-char-p [Function] ++---------------------------------- ++ ++'standard-char-p' character => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if character is of type standard-char; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (standard-char-p #\Space) => true ++ (standard-char-p #\~) => true ++ ;; This next example presupposes an implementation ++ ;; in which #\Bell is a defined character. ++ (standard-char-p #\Bell) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++ ++File: gcl.info, Node: char-upcase, Next: upper-case-p, Prev: standard-char-p, Up: Characters Dictionary ++ ++13.2.14 char-upcase, char-downcase [Function] ++--------------------------------------------- ++ ++'char-upcase' character => corresponding-character ++ ++ 'char-downcase' character => corresponding-character ++ ++Arguments and Values:: ++...................... ++ ++character, corresponding-character--a character. ++ ++Description:: ++............. ++ ++If character is a lowercase character, char-upcase returns the ++corresponding uppercase character. Otherwise, char-upcase just returns ++the given character. ++ ++ If character is an uppercase character, char-downcase returns the ++corresponding lowercase character. Otherwise, char-downcase just ++returns the given character. ++ ++ The result only ever differs from character in its code attribute; ++all implementation-defined attributes are preserved. ++ ++Examples:: ++.......... ++ ++ (char-upcase #\a) => #\A ++ (char-upcase #\A) => #\A ++ (char-downcase #\a) => #\a ++ (char-downcase #\A) => #\a ++ (char-upcase #\9) => #\9 ++ (char-downcase #\9) => #\9 ++ (char-upcase #\@) => #\@ ++ (char-downcase #\@) => #\@ ++ ;; Note that this next example might run for a very long time in ++ ;; some implementations if CHAR-CODE-LIMIT happens to be very large ++ ;; for that implementation. ++ (dotimes (code char-code-limit) ++ (let ((char (code-char code))) ++ (when char ++ (unless (cond ((upper-case-p char) (char= (char-upcase (char-downcase char)) char)) ++ ((lower-case-p char) (char= (char-downcase (char-upcase char)) char)) ++ (t (and (char= (char-upcase (char-downcase char)) char) ++ (char= (char-downcase (char-upcase char)) char)))) ++ (return char))))) ++ => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note upper-case-p:: , *note alpha-char-p:: , *note Characters With ++Case::, *note Documentation of Implementation-Defined Scripts:: ++ ++Notes:: ++....... ++ ++If the corresponding-char is different than character, then both the ++character and the corresponding-char have case. ++ ++ Since char-equal ignores the case of the characters it compares, the ++corresponding-character is always the same as character under ++char-equal. ++ ++ ++File: gcl.info, Node: upper-case-p, Next: char-code, Prev: char-upcase, Up: Characters Dictionary ++ ++13.2.15 upper-case-p, lower-case-p, both-case-p [Function] ++---------------------------------------------------------- ++ ++'upper-case-p' character => generalized-boolean ++ ++ 'lower-case-p' character => generalized-boolean ++ ++ 'both-case-p' character => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++These functions test the case of a given character. ++ ++ upper-case-p returns true if character is an uppercase character; ++otherwise, returns false. ++ ++ lower-case-p returns true if character is a lowercase character; ++otherwise, returns false. ++ ++ both-case-p returns true if character is a character with case; ++otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (upper-case-p #\A) => true ++ (upper-case-p #\a) => false ++ (both-case-p #\a) => true ++ (both-case-p #\5) => false ++ (lower-case-p #\5) => false ++ (upper-case-p #\5) => false ++ ;; This next example presupposes an implementation ++ ;; in which #\Bell is an implementation-defined character. ++ (lower-case-p #\Bell) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note char-upcase:: , char-downcase, *note Characters With Case::, *note ++Documentation of Implementation-Defined Scripts:: ++ ++ ++File: gcl.info, Node: char-code, Next: char-int, Prev: upper-case-p, Up: Characters Dictionary ++ ++13.2.16 char-code [Function] ++---------------------------- ++ ++'char-code' character => code ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ code--a character code. ++ ++Description:: ++............. ++ ++char-code returns the code attribute of character. ++ ++Examples:: ++.......... ++ ++ ;; An implementation using ASCII character encoding ++ ;; might return these values: ++ (char-code #\$) => 36 ++ (char-code #\a) => 97 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note char-code-limit:: ++ ++ ++File: gcl.info, Node: char-int, Next: code-char, Prev: char-code, Up: Characters Dictionary ++ ++13.2.17 char-int [Function] ++--------------------------- ++ ++'char-int' character => integer ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ integer--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns a non-negative integer encoding the character object. The ++manner in which the integer is computed is implementation-dependent. In ++contrast to sxhash, the result is not guaranteed to be independent of ++the particular Lisp image. ++ ++ If character has no implementation-defined attributes, the results of ++char-int and char-code are the same. ++ ++ (char= c1 c2) == (= (char-int c1) (char-int c2)) ++ ++ for characters c1 and c2. ++ ++Examples:: ++.......... ++ ++ (char-int #\A) => 65 ; implementation A ++ (char-int #\A) => 577 ; implementation B ++ (char-int #\A) => 262145 ; implementation C ++ ++See Also:: ++.......... ++ ++*note char-code:: ++ ++ ++File: gcl.info, Node: code-char, Next: char-code-limit, Prev: char-int, Up: Characters Dictionary ++ ++13.2.18 code-char [Function] ++---------------------------- ++ ++'code-char' code => char-p ++ ++Arguments and Values:: ++...................... ++ ++code--a character code. ++ ++ char-p--a character or nil. ++ ++Description:: ++............. ++ ++Returns a character with the code attribute given by code. If no such ++character exists and one cannot be created, nil is returned. ++ ++Examples:: ++.......... ++ ++ (code-char 65.) => #\A ;in an implementation using ASCII codes ++ (code-char (char-code #\Space)) => #\Space ;in any implementation ++ ++Affected By:: ++............. ++ ++The implementation's character encoding. ++ ++See Also:: ++.......... ++ ++*note char-code:: ++ ++Notes:: ++....... ++ ++ ++File: gcl.info, Node: char-code-limit, Next: char-name, Prev: code-char, Up: Characters Dictionary ++ ++13.2.19 char-code-limit [Constant Variable] ++------------------------------------------- ++ ++Constant Value:: ++................ ++ ++A non-negative integer, the exact magnitude of which is ++implementation-dependent, but which is not less than 96 (the number of ++standard characters). ++ ++Description:: ++............. ++ ++The upper exclusive bound on the value returned by the function ++char-code. ++ ++See Also:: ++.......... ++ ++*note char-code:: ++ ++Notes:: ++....... ++ ++The value of char-code-limit might be larger than the actual number of ++characters supported by the implementation. ++ ++ ++File: gcl.info, Node: char-name, Next: name-char, Prev: char-code-limit, Up: Characters Dictionary ++ ++13.2.20 char-name [Function] ++---------------------------- ++ ++'char-name' character => name ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ name--a string or nil. ++ ++Description:: ++............. ++ ++Returns a string that is the name of the character, or nil if the ++character has no name. ++ ++ All non-graphic characters are required to have names unless they ++have some implementation-defined attribute which is not null. Whether ++or not other characters have names is implementation-dependent. ++ ++ The standard characters and have the respective ++names "Newline" and "Space". The semi-standard characters , ++, , , , and (if they are ++supported by the implementation) have the respective names "Tab", ++"Page", "Rubout", "Linefeed", "Return", and "Backspace" (in the ++indicated case, even though name lookup by "#\" and by the function ++name-char is not case sensitive). ++ ++Examples:: ++.......... ++ ++ (char-name #\ ) => "Space" ++ (char-name #\Space) => "Space" ++ (char-name #\Page) => "Page" ++ ++ (char-name #\a) ++ => NIL ++ OR=> "LOWERCASE-a" ++ OR=> "Small-A" ++ OR=> "LA01" ++ ++ (char-name #\A) ++ => NIL ++ OR=> "UPPERCASE-A" ++ OR=> "Capital-A" ++ OR=> "LA02" ++ ++ ;; Even though its CHAR-NAME can vary, #\A prints as #\A ++ (prin1-to-string (read-from-string (format nil "#\\~A" (or (char-name #\A) "A")))) ++ => "#\\A" ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if character is not a ++character. ++ ++See Also:: ++.......... ++ ++*note name-char:: , *note Printing Characters:: ++ ++Notes:: ++....... ++ ++Non-graphic characters having names are written by the Lisp printer as ++"#\" followed by the their name; see *note Printing Characters::. ++ ++ ++File: gcl.info, Node: name-char, Prev: char-name, Up: Characters Dictionary ++ ++13.2.21 name-char [Function] ++---------------------------- ++ ++'name-char' name => char-p ++ ++Arguments and Values:: ++...................... ++ ++name--a string designator. ++ ++ char-p--a character or nil. ++ ++Description:: ++............. ++ ++Returns the character object whose name is name (as determined by ++string-equal--i.e., lookup is not case sensitive). If such a character ++does not exist, nil is returned. ++ ++Examples:: ++.......... ++ ++ (name-char 'space) => #\Space ++ (name-char "space") => #\Space ++ (name-char "Space") => #\Space ++ (let ((x (char-name #\a))) ++ (or (not x) (eql (name-char x) #\a))) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if name is not a string ++designator. ++ ++See Also:: ++.......... ++ ++*note char-name:: ++ ++ ++File: gcl.info, Node: Conses, Next: Arrays, Prev: Characters, Up: Top ++ ++14 Conses ++********* ++ ++* Menu: ++ ++* Cons Concepts:: ++* Conses Dictionary:: ++ ++ ++File: gcl.info, Node: Cons Concepts, Next: Conses Dictionary, Prev: Conses, Up: Conses ++ ++14.1 Cons Concepts ++================== ++ ++A cons is a compound data object having two components called the car ++and the cdr. ++ ++ car cons rplacd ++ cdr rplaca ++ ++ Figure 14-1: Some defined names relating to conses. ++ ++ ++ Depending on context, a group of connected conses can be viewed in a ++variety of different ways. A variety of operations is provided to ++support each of these various views. ++ ++* Menu: ++ ++* Conses as Trees:: ++* Conses as Lists:: ++ ++ ++File: gcl.info, Node: Conses as Trees, Next: Conses as Lists, Prev: Cons Concepts, Up: Cons Concepts ++ ++14.1.1 Conses as Trees ++---------------------- ++ ++A tree is a binary recursive data structure made up of conses and atoms: ++the conses are themselves also trees (sometimes called "subtrees" or ++"branches"), and the atoms are terminal nodes (sometimes called leaves ++). Typically, the leaves represent data while the branches establish ++some relationship among that data. ++ ++ caaaar caddar cdar nsubst ++ caaadr cadddr cddaar nsubst-if ++ caaar caddr cddadr nsubst-if-not ++ caadar cadr cddar nthcdr ++ caaddr cdaaar cdddar sublis ++ caadr cdaadr cddddr subst ++ caar cdaar cdddr subst-if ++ cadaar cdadar cddr subst-if-not ++ cadadr cdaddr copy-tree tree-equal ++ cadar cdadr nsublis ++ ++ Figure 14-2: Some defined names relating to trees. ++ ++ ++* Menu: ++ ++* General Restrictions on Parameters that must be Trees:: ++ ++ ++File: gcl.info, Node: General Restrictions on Parameters that must be Trees, Prev: Conses as Trees, Up: Conses as Trees ++ ++14.1.1.1 General Restrictions on Parameters that must be Trees ++.............................................................. ++ ++Except as explicitly stated otherwise, for any standardized function ++that takes a parameter that is required to be a tree, the consequences ++are undefined if that tree is circular. ++ ++ ++File: gcl.info, Node: Conses as Lists, Prev: Conses as Trees, Up: Cons Concepts ++ ++14.1.2 Conses as Lists ++---------------------- ++ ++A list is a chain of conses in which the car of each cons is an element ++of the list, and the cdr of each cons is either the next link in the ++chain or a terminating atom. ++ ++ A proper list is a list terminated by the empty list. The empty list ++is a proper list, but is not a cons. ++ ++ An improper list is a list that is not a proper list; that is, it is ++a circular list or a dotted list. ++ ++ A dotted list is a list that has a terminating atom that is not the ++empty list. A non-nil atom by itself is not considered to be a list of ++any kind--not even a dotted list. ++ ++ A circular list is a chain of conses that has no termination because ++some cons in the chain is the cdr of a later cons. ++ ++ append last nbutlast rest ++ butlast ldiff nconc revappend ++ copy-alist list ninth second ++ copy-list list* nreconc seventh ++ eighth list-length nth sixth ++ endp make-list nthcdr tailp ++ fifth member pop tenth ++ first member-if push third ++ fourth member-if-not pushnew ++ ++ Figure 14-3: Some defined names relating to lists. ++ ++ ++* Menu: ++ ++* Lists as Association Lists:: ++* Lists as Sets:: ++* General Restrictions on Parameters that must be Lists:: ++ ++ ++File: gcl.info, Node: Lists as Association Lists, Next: Lists as Sets, Prev: Conses as Lists, Up: Conses as Lists ++ ++14.1.2.1 Lists as Association Lists ++................................... ++ ++An association list is a list of conses representing an association of ++keys with values, where the car of each cons is the key and the cdr is ++the value associated with that key. ++ ++ acons assoc-if pairlis rassoc-if ++ assoc assoc-if-not rassoc rassoc-if-not ++ ++ Figure 14-4: Some defined names related to assocation lists. ++ ++ ++ ++File: gcl.info, Node: Lists as Sets, Next: General Restrictions on Parameters that must be Lists, Prev: Lists as Association Lists, Up: Conses as Lists ++ ++14.1.2.2 Lists as Sets ++...................... ++ ++Lists are sometimes viewed as sets by considering their elements ++unordered and by assuming there is no duplication of elements. ++ ++ adjoin nset-difference set-difference union ++ intersection nset-exclusive-or set-exclusive-or ++ nintersection nunion subsetp ++ ++ Figure 14-5: Some defined names related to sets. ++ ++ ++ ++File: gcl.info, Node: General Restrictions on Parameters that must be Lists, Prev: Lists as Sets, Up: Conses as Lists ++ ++14.1.2.3 General Restrictions on Parameters that must be Lists ++.............................................................. ++ ++Except as explicitly specified otherwise, any standardized function that ++takes a parameter that is required to be a list should be prepared to ++signal an error of type type-error if the value received is a dotted ++list. ++ ++ Except as explicitly specified otherwise, for any standardized ++function that takes a parameter that is required to be a list, the ++consequences are undefined if that list is circular. ++ ++ ++File: gcl.info, Node: Conses Dictionary, Prev: Cons Concepts, Up: Conses ++ ++14.2 Conses Dictionary ++====================== ++ ++* Menu: ++ ++* list (System Class):: ++* null (System Class):: ++* cons (System Class):: ++* atom (Type):: ++* cons:: ++* consp:: ++* atom:: ++* rplaca:: ++* car:: ++* copy-tree:: ++* sublis:: ++* subst:: ++* tree-equal:: ++* copy-list:: ++* list (Function):: ++* list-length:: ++* listp:: ++* make-list:: ++* push:: ++* pop:: ++* first:: ++* nth:: ++* endp:: ++* null:: ++* nconc:: ++* append:: ++* revappend:: ++* butlast:: ++* last:: ++* ldiff:: ++* nthcdr:: ++* rest:: ++* member (Function):: ++* mapc:: ++* acons:: ++* assoc:: ++* copy-alist:: ++* pairlis:: ++* rassoc:: ++* get-properties:: ++* getf:: ++* remf:: ++* intersection:: ++* adjoin:: ++* pushnew:: ++* set-difference:: ++* set-exclusive-or:: ++* subsetp:: ++* union:: ++ ++ ++File: gcl.info, Node: list (System Class), Next: null (System Class), Prev: Conses Dictionary, Up: Conses Dictionary ++ ++14.2.1 list [System Class] ++-------------------------- ++ ++Class Precedence List:: ++....................... ++ ++list, sequence, t ++ ++Description:: ++............. ++ ++A list is a chain of conses in which the car of each cons is an element ++of the list, and the cdr of each cons is either the next link in the ++chain or a terminating atom. ++ ++ A proper list is a chain of conses terminated by the empty list , (), ++which is itself a proper list. A dotted list is a list which has a ++terminating atom that is not the empty list. A circular list is a chain ++of conses that has no termination because some cons in the chain is the ++cdr of a later cons. ++ ++ Dotted lists and circular lists are also lists, but usually the ++unqualified term "list" within this specification means proper list. ++Nevertheless, the type list unambiguously includes dotted lists and ++circular lists. ++ ++ For each element of a list there is a cons. The empty list has no ++elements and is not a cons. ++ ++ The types cons and null form an exhaustive partition of the type ++list. ++ ++See Also:: ++.......... ++ ++*note Left-Parenthesis::, *note Printing Lists and Conses:: ++ ++ ++File: gcl.info, Node: null (System Class), Next: cons (System Class), Prev: list (System Class), Up: Conses Dictionary ++ ++14.2.2 null [System Class] ++-------------------------- ++ ++Class Precedence List:: ++....................... ++ ++null, symbol, list, sequence, t ++ ++Description:: ++............. ++ ++The only object of type null is nil, which represents the empty list and ++can also be notated (). ++ ++See Also:: ++.......... ++ ++*note Symbols as Tokens::, *note Left-Parenthesis::, *note Printing ++Symbols:: ++ ++ ++File: gcl.info, Node: cons (System Class), Next: atom (Type), Prev: null (System Class), Up: Conses Dictionary ++ ++14.2.3 cons [System Class] ++-------------------------- ++ ++Class Precedence List:: ++....................... ++ ++cons, list, sequence, t ++ ++Description:: ++............. ++ ++A cons is a compound object having two components, called the car and ++cdr. These form a dotted pair. Each component can be any object. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('cons'{[car-typespec [cdr-typespec]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++car-typespec--a type specifier, or the symbol *. The default is the ++symbol *. ++ ++ cdr-typespec--a type specifier, or the symbol *. The default is the ++symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of conses whose car is constrained to be of type ++car-typespec and whose cdr is constrained to be of type cdr-typespec. ++(If either car-typespec or cdr-typespec is *, it is as if the type t had ++been denoted.) ++ ++See Also:: ++.......... ++ ++*note Left-Parenthesis::, *note Printing Lists and Conses:: ++ ++ ++File: gcl.info, Node: atom (Type), Next: cons, Prev: cons (System Class), Up: Conses Dictionary ++ ++14.2.4 atom [Type] ++------------------ ++ ++Supertypes:: ++............ ++ ++atom, t ++ ++Description:: ++............. ++ ++It is equivalent to (not cons). ++ ++ ++File: gcl.info, Node: cons, Next: consp, Prev: atom (Type), Up: Conses Dictionary ++ ++14.2.5 cons [Function] ++---------------------- ++ ++'cons' object-1 object-2 => cons ++ ++Arguments and Values:: ++...................... ++ ++object-1--an object. ++ ++ object-2--an object. ++ ++ cons--a cons. ++ ++Description:: ++............. ++ ++Creates a fresh cons, the car of which is object-1 and the cdr of which ++is object-2. ++ ++Examples:: ++.......... ++ ++ (cons 1 2) => (1 . 2) ++ (cons 1 nil) => (1) ++ (cons nil 2) => (NIL . 2) ++ (cons nil nil) => (NIL) ++ (cons 1 (cons 2 (cons 3 (cons 4 nil)))) => (1 2 3 4) ++ (cons 'a 'b) => (A . B) ++ (cons 'a (cons 'b (cons 'c '()))) => (A B C) ++ (cons 'a '(b c d)) => (A B C D) ++ ++See Also:: ++.......... ++ ++*note list (Function):: ++ ++Notes:: ++....... ++ ++If object-2 is a list, cons can be thought of as producing a new list ++which is like it but has object-1 prepended. ++ ++ ++File: gcl.info, Node: consp, Next: atom, Prev: cons, Up: Conses Dictionary ++ ++14.2.6 consp [Function] ++----------------------- ++ ++'consp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type cons; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (consp nil) => false ++ (consp (cons 1 2)) => true ++ ++ The empty list is not a cons, so ++ ++ (consp '()) == (consp 'nil) => false ++ ++See Also:: ++.......... ++ ++*note listp:: ++ ++Notes:: ++....... ++ ++ (consp object) == (typep object 'cons) == (not (typep object 'atom)) == (typep object '(not atom)) ++ ++ ++File: gcl.info, Node: atom, Next: rplaca, Prev: consp, Up: Conses Dictionary ++ ++14.2.7 atom [Function] ++---------------------- ++ ++'atom' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type atom; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (atom 'sss) => true ++ (atom (cons 1 2)) => false ++ (atom nil) => true ++ (atom '()) => true ++ (atom 3) => true ++ ++Notes:: ++....... ++ ++ (atom object) == (typep object 'atom) == (not (consp object)) ++ == (not (typep object 'cons)) == (typep object '(not cons)) ++ ++ ++File: gcl.info, Node: rplaca, Next: car, Prev: atom, Up: Conses Dictionary ++ ++14.2.8 rplaca, rplacd [Function] ++-------------------------------- ++ ++'rplaca' cons object => cons ++ ++ 'rplacd' cons object => cons ++ ++Pronunciation:: ++............... ++ ++rplaca: pronounced ,r\=e 'plak e or pronounced ,re 'plak e ++ ++ rplacd: pronounced ,r\=e 'plak de or pronounced ,re 'plak de or ++pronounced ,r\=e 'plak d\=e or pronounced ,re 'plak d\=e ++ ++Arguments and Values:: ++...................... ++ ++cons--a cons. ++ ++ object--an object. ++ ++Description:: ++............. ++ ++rplaca replaces the car of the cons with object. ++ ++ rplacd replaces the cdr of the cons with object. ++ ++Examples:: ++.......... ++ ++ (defparameter *some-list* (list* 'one 'two 'three 'four)) => *some-list* ++ *some-list* => (ONE TWO THREE . FOUR) ++ (rplaca *some-list* 'uno) => (UNO TWO THREE . FOUR) ++ *some-list* => (UNO TWO THREE . FOUR) ++ (rplacd (last *some-list*) (list 'IV)) => (THREE IV) ++ *some-list* => (UNO TWO THREE IV) ++ ++Side Effects:: ++.............. ++ ++The cons is modified. ++ ++ Should signal an error of type type-error if cons is not a cons. ++ ++ ++File: gcl.info, Node: car, Next: copy-tree, Prev: rplaca, Up: Conses Dictionary ++ ++14.2.9 car, cdr, ++---------------- ++ ++caar, cadr, cdar, cddr, ++----------------------- ++ ++caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr, ++------------------------------------------------------- ++ ++caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr, ++--------------------------------------------------------------- ++ ++cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr ++-------------------------------------------------------------- ++ ++ [Accessor] ++ ++ 'car' x => object (setf ('car' x) new-object) ++ ++ 'cdr' x => object (setf ('cdr' x) new-object) ++ ++ '\vksip 5pt' x => object (setf ('\vksip 5pt' x) new-object) ++ ++ 'caar' x => object (setf ('caar' x) new-object) ++ ++ 'cadr' x => object (setf ('cadr' x) new-object) ++ ++ 'cdar' x => object (setf ('cdar' x) new-object) ++ ++ 'cddr' x => object (setf ('cddr' x) new-object) ++ ++ '\vksip 5pt' x => object (setf ('\vksip 5pt' x) new-object) ++ ++ 'caaar' x => object (setf ('caaar' x) new-object) ++ ++ 'caadr' x => object (setf ('caadr' x) new-object) ++ ++ 'cadar' x => object (setf ('cadar' x) new-object) ++ ++ 'caddr' x => object (setf ('caddr' x) new-object) ++ ++ 'cdaar' x => object (setf ('cdaar' x) new-object) ++ ++ 'cdadr' x => object (setf ('cdadr' x) new-object) ++ ++ 'cddar' x => object (setf ('cddar' x) new-object) ++ ++ 'cdddr' x => object (setf ('cdddr' x) new-object) ++ ++ '\vksip 5pt' x => object (setf ('\vksip 5pt' x) new-object) ++ ++ 'caaaar' x => object (setf ('caaaar' x) new-object) ++ ++ 'caaadr' x => object (setf ('caaadr' x) new-object) ++ ++ 'caadar' x => object (setf ('caadar' x) new-object) ++ ++ 'caaddr' x => object (setf ('caaddr' x) new-object) ++ ++ 'cadaar' x => object (setf ('cadaar' x) new-object) ++ ++ 'cadadr' x => object (setf ('cadadr' x) new-object) ++ ++ 'caddar' x => object (setf ('caddar' x) new-object) ++ ++ 'cadddr' x => object (setf ('cadddr' x) new-object) ++ ++ 'cdaaar' x => object (setf ('cdaaar' x) new-object) ++ ++ 'cdaadr' x => object (setf ('cdaadr' x) new-object) ++ ++ 'cdadar' x => object (setf ('cdadar' x) new-object) ++ ++ 'cdaddr' x => object (setf ('cdaddr' x) new-object) ++ ++ 'cddaar' x => object (setf ('cddaar' x) new-object) ++ ++ 'cddadr' x => object (setf ('cddadr' x) new-object) ++ ++ 'cdddar' x => object (setf ('cdddar' x) new-object) ++ ++ 'cddddr' x => object (setf ('cddddr' x) new-object) ++ ++Pronunciation:: ++............... ++ ++cadr: pronounced 'ka ,de r ++ ++ caddr: pronounced 'kad e ,de r or pronounced 'ka ,dude r ++ ++ cdr: pronounced 'ku ,de r ++ ++ cddr: pronounced 'kud e ,de r or pronounced 'ke ,dude r ++ ++Arguments and Values:: ++...................... ++ ++x--a list. ++ ++ object--an object. ++ ++ new-object--an object. ++ ++Description:: ++............. ++ ++If x is a cons, car returns the car of that cons. If x is nil, car ++returns nil. ++ ++ If x is a cons, cdr returns the cdr of that cons. If x is nil, cdr ++returns nil. ++ ++ Functions are provided which perform compositions of up to four car ++and cdr operations. Their names consist of a C, followed by two, three, ++or four occurrences of A or D, and finally an R. The series of A's and ++D's in each function's name is chosen to identify the series of car and ++cdr operations that is performed by the function. The order in which ++the A's and D's appear is the inverse of the order in which the ++corresponding operations are performed. Figure 14-6 defines the ++relationships precisely. ++ ++ This place ... Is equivalent to this place ... ++ (caar x) (car (car x)) ++ (cadr x) (car (cdr x)) ++ (cdar x) (cdr (car x)) ++ (cddr x) (cdr (cdr x)) ++ (caaar x) (car (car (car x))) ++ (caadr x) (car (car (cdr x))) ++ (cadar x) (car (cdr (car x))) ++ (caddr x) (car (cdr (cdr x))) ++ (cdaar x) (cdr (car (car x))) ++ (cdadr x) (cdr (car (cdr x))) ++ (cddar x) (cdr (cdr (car x))) ++ (cdddr x) (cdr (cdr (cdr x))) ++ (caaaar x) (car (car (car (car x)))) ++ (caaadr x) (car (car (car (cdr x)))) ++ (caadar x) (car (car (cdr (car x)))) ++ (caaddr x) (car (car (cdr (cdr x)))) ++ (cadaar x) (car (cdr (car (car x)))) ++ (cadadr x) (car (cdr (car (cdr x)))) ++ (caddar x) (car (cdr (cdr (car x)))) ++ (cadddr x) (car (cdr (cdr (cdr x)))) ++ (cdaaar x) (cdr (car (car (car x)))) ++ (cdaadr x) (cdr (car (car (cdr x)))) ++ (cdadar x) (cdr (car (cdr (car x)))) ++ (cdaddr x) (cdr (car (cdr (cdr x)))) ++ (cddaar x) (cdr (cdr (car (car x)))) ++ (cddadr x) (cdr (cdr (car (cdr x)))) ++ (cdddar x) (cdr (cdr (cdr (car x)))) ++ (cddddr x) (cdr (cdr (cdr (cdr x)))) ++ ++ Figure 14-6: CAR and CDR variants ++ ++ ++ setf can also be used with any of these functions to change an ++existing component of x, but setf will not make new components. So, for ++example, the car of a cons can be assigned with setf of car, but the car ++of nil cannot be assigned with setf of car. Similarly, the car of the ++car of a cons whose car is a cons can be assigned with setf of caar, but ++neither nil nor a cons whose car is nil can be assigned with setf of ++caar. ++ ++ The argument x is permitted to be a dotted list or a circular list. ++ ++Examples:: ++.......... ++ ++ (car nil) => NIL ++ (cdr '(1 . 2)) => 2 ++ (cdr '(1 2)) => (2) ++ (cadr '(1 2)) => 2 ++ (car '(a b c)) => A ++ (cdr '(a b c)) => (B C) ++ ++Exceptional Situations:: ++........................ ++ ++The functions car and cdr should signal type-error if they receive an ++argument which is not a list. The other functions (caar, cadr, ... ++cddddr) should behave for the purpose of error checking as if defined by ++appropriate calls to car and cdr. ++ ++See Also:: ++.......... ++ ++*note rplaca:: , *note first:: , *note rest:: ++ ++Notes:: ++....... ++ ++The car of a cons can also be altered by using rplaca, and the cdr of a ++cons can be altered by using rplacd. ++ ++ (car x) == (first x) ++ (cadr x) == (second x) == (car (cdr x)) ++ (caddr x) == (third x) == (car (cdr (cdr x))) ++ (cadddr x) == (fourth x) == (car (cdr (cdr (cdr x)))) ++ ++ ++File: gcl.info, Node: copy-tree, Next: sublis, Prev: car, Up: Conses Dictionary ++ ++14.2.10 copy-tree [Function] ++---------------------------- ++ ++'copy-tree' tree => new-tree ++ ++Arguments and Values:: ++...................... ++ ++tree--a tree. ++ ++ new-tree--a tree. ++ ++Description:: ++............. ++ ++Creates a copy of a tree of conses. ++ ++ If tree is not a cons, it is returned; otherwise, the result is a new ++cons of the results of calling copy-tree on the car and cdr of tree. In ++other words, all conses in the tree represented by tree are copied ++recursively, stopping only when non-conses are encountered. ++ ++ copy-tree does not preserve circularities and the sharing of ++substructure. ++ ++Examples:: ++.......... ++ ++ (setq object (list (cons 1 "one") ++ (cons 2 (list 'a 'b 'c)))) ++ => ((1 . "one") (2 A B C)) ++ (setq object-too object) => ((1 . "one") (2 A B C)) ++ (setq copy-as-list (copy-list object)) ++ (setq copy-as-alist (copy-alist object)) ++ (setq copy-as-tree (copy-tree object)) ++ (eq object object-too) => true ++ (eq copy-as-tree object) => false ++ (eql copy-as-tree object) => false ++ (equal copy-as-tree object) => true ++ (setf (first (cdr (second object))) "a" ++ (car (second object)) "two" ++ (car object) '(one . 1)) => (ONE . 1) ++ object => ((ONE . 1) ("two" "a" B C)) ++ object-too => ((ONE . 1) ("two" "a" B C)) ++ copy-as-list => ((1 . "one") ("two" "a" B C)) ++ copy-as-alist => ((1 . "one") (2 "a" B C)) ++ copy-as-tree => ((1 . "one") (2 A B C)) ++ ++See Also:: ++.......... ++ ++*note tree-equal:: ++ ++ ++File: gcl.info, Node: sublis, Next: subst, Prev: copy-tree, Up: Conses Dictionary ++ ++14.2.11 sublis, nsublis [Function] ++---------------------------------- ++ ++'sublis' alist tree &key key test test-not => new-tree ++ ++ 'nsublis' alist tree &key key test test-not => new-tree ++ ++Arguments and Values:: ++...................... ++ ++alist--an association list. ++ ++ tree--a tree. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ new-tree--a tree. ++ ++Description:: ++............. ++ ++sublis makes substitutions for objects in tree (a structure of conses). ++nsublis is like sublis but destructively modifies the relevant parts of ++the tree. ++ ++ sublis looks at all subtrees and leaves of tree; if a subtree or leaf ++appears as a key in alist (that is, the key and the subtree or leaf ++satisfy the test), it is replaced by the object with which that key is ++associated. This operation is non-destructive. In effect, sublis can ++perform several subst operations simultaneously. ++ ++ If sublis succeeds, a new copy of tree is returned in which each ++occurrence of such a subtree or leaf is replaced by the object with ++which it is associated. If no changes are made, the original tree is ++returned. The original tree is left unchanged, but the result tree may ++share cells with it. ++ ++ nsublis is permitted to modify tree but otherwise returns the same ++values as sublis. ++ ++Examples:: ++.......... ++ ++ (sublis '((x . 100) (z . zprime)) ++ '(plus x (minus g z x p) 4 . x)) ++ => (PLUS 100 (MINUS G ZPRIME 100 P) 4 . 100) ++ (sublis '(((+ x y) . (- x y)) ((- x y) . (+ x y))) ++ '(* (/ (+ x y) (+ x p)) (- x y)) ++ :test #'equal) ++ => (* (/ (- X Y) (+ X P)) (+ X Y)) ++ (setq tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4))))) ++ => (1 (1 2) ((1 2 3)) (((1 2 3 4)))) ++ (sublis '((3 . "three")) tree1) ++ => (1 (1 2) ((1 2 "three")) (((1 2 "three" 4)))) ++ (sublis '((t . "string")) ++ (sublis '((1 . "") (4 . 44)) tree1) ++ :key #'stringp) ++ => ("string" ("string" 2) (("string" 2 3)) ((("string" 2 3 44)))) ++ tree1 => (1 (1 2) ((1 2 3)) (((1 2 3 4)))) ++ (setq tree2 '("one" ("one" "two") (("one" "Two" "three")))) ++ => ("one" ("one" "two") (("one" "Two" "three"))) ++ (sublis '(("two" . 2)) tree2) ++ => ("one" ("one" "two") (("one" "Two" "three"))) ++ tree2 => ("one" ("one" "two") (("one" "Two" "three"))) ++ (sublis '(("two" . 2)) tree2 :test 'equal) ++ => ("one" ("one" 2) (("one" "Two" "three"))) ++ ++ (nsublis '((t . 'temp)) ++ tree1 ++ :key #'(lambda (x) (or (atom x) (< (list-length x) 3)))) ++ => ((QUOTE TEMP) (QUOTE TEMP) QUOTE TEMP) ++ ++Side Effects:: ++.............. ++ ++nsublis modifies tree. ++ ++See Also:: ++.......... ++ ++*note subst:: , ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ Because the side-effecting variants (e.g., nsublis) potentially ++change the path that is being traversed, their effects in the presence ++of shared or circular structure structure may vary in surprising ways ++when compared to their non-side-effecting alternatives. To see this, ++consider the following side-effect behavior, which might be exhibited by ++some implementations: ++ ++ (defun test-it (fn) ++ (let* ((shared-piece (list 'a 'b)) ++ (data (list shared-piece shared-piece))) ++ (funcall fn '((a . b) (b . a)) data))) ++ (test-it #'sublis) => ((B A) (B A)) ++ (test-it #'nsublis) => ((A B) (A B)) ++ ++ ++File: gcl.info, Node: subst, Next: tree-equal, Prev: sublis, Up: Conses Dictionary ++ ++14.2.12 subst, subst-if, subst-if-not, nsubst, nsubst-if, nsubst-if-not ++----------------------------------------------------------------------- ++ ++ [Function] ++ ++ 'subst' new old tree &key key test test-not => new-tree ++ ++ 'subst-if' new predicate tree &key key => new-tree ++ ++ 'subst-if-not' new predicate tree &key key => new-tree ++ ++ 'nsubst' new old tree &key key test test-not => new-tree ++ ++ 'nsubst-if' new predicate tree &key key => new-tree ++ ++ 'nsubst-if-not' new predicate tree &key key => new-tree ++ ++Arguments and Values:: ++...................... ++ ++new--an object. ++ ++ old--an object. ++ ++ predicate--a symbol that names a function, or a function of one ++argument that returns a generalized boolean value. ++ ++ tree--a tree. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ new-tree--a tree. ++ ++Description:: ++............. ++ ++subst, subst-if, and subst-if-not perform substitution operations on ++tree. Each function searches tree for occurrences of a particular old ++item of an element or subexpression that satisfies the test. ++ ++ nsubst, nsubst-if, and nsubst-if-not are like subst, subst-if, and ++subst-if-not respectively, except that the original tree is modified. ++ ++ subst makes a copy of tree, substituting new for every subtree or ++leaf of tree (whether the subtree or leaf is a car or a cdr of its ++parent) such that old and the subtree or leaf satisfy the test. ++ ++ nsubst is a destructive version of subst. The list structure of tree ++is altered by destructively replacing with new each leaf of the tree ++such that old and the leaf satisfy the test. ++ ++ For subst, subst-if, and subst-if-not, if the functions succeed, a ++new copy of the tree is returned in which each occurrence of such an ++element is replaced by the new element or subexpression. If no changes ++are made, the original tree may be returned. The original tree is left ++unchanged, but the result tree may share storage with it. ++ ++ For nsubst, nsubst-if, and nsubst-if-not the original tree is ++modified and returned as the function result, but the result may not be ++eq to tree. ++ ++Examples:: ++.......... ++ ++ (setq tree1 '(1 (1 2) (1 2 3) (1 2 3 4))) => (1 (1 2) (1 2 3) (1 2 3 4)) ++ (subst "two" 2 tree1) => (1 (1 "two") (1 "two" 3) (1 "two" 3 4)) ++ (subst "five" 5 tree1) => (1 (1 2) (1 2 3) (1 2 3 4)) ++ (eq tree1 (subst "five" 5 tree1)) => implementation-dependent ++ (subst 'tempest 'hurricane ++ '(shakespeare wrote (the hurricane))) ++ => (SHAKESPEARE WROTE (THE TEMPEST)) ++ (subst 'foo 'nil '(shakespeare wrote (twelfth night))) ++ => (SHAKESPEARE WROTE (TWELFTH NIGHT . FOO) . FOO) ++ (subst '(a . cons) '(old . pair) ++ '((old . spice) ((old . shoes) old . pair) (old . pair)) ++ :test #'equal) ++ => ((OLD . SPICE) ((OLD . SHOES) A . CONS) (A . CONS)) ++ ++ (subst-if 5 #'listp tree1) => 5 ++ (subst-if-not '(x) #'consp tree1) ++ => (1 X) ++ ++ tree1 => (1 (1 2) (1 2 3) (1 2 3 4)) ++ (nsubst 'x 3 tree1 :key #'(lambda (y) (and (listp y) (third y)))) ++ => (1 (1 2) X X) ++ tree1 => (1 (1 2) X X) ++ ++Side Effects:: ++.............. ++ ++nsubst, nsubst-if, and nsubst-if-not might alter the tree structure of ++tree. ++ ++See Also:: ++.......... ++ ++*note substitute:: , nsubstitute, ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ The functions subst-if-not and nsubst-if-not are deprecated. ++ ++ One possible definition of subst: ++ ++ (defun subst (old new tree &rest x &key test test-not key) ++ (cond ((satisfies-the-test old tree :test test ++ :test-not test-not :key key) ++ new) ++ ((atom tree) tree) ++ (t (let ((a (apply #'subst old new (car tree) x)) ++ (d (apply #'subst old new (cdr tree) x))) ++ (if (and (eql a (car tree)) ++ (eql d (cdr tree))) ++ tree ++ (cons a d)))))) ++ ++ ++File: gcl.info, Node: tree-equal, Next: copy-list, Prev: subst, Up: Conses Dictionary ++ ++14.2.13 tree-equal [Function] ++----------------------------- ++ ++'tree-equal' tree-1 tree-2 &key test test-not => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++tree-1--a tree. ++ ++ tree-2--a tree. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++tree-equal tests whether two trees are of the same shape and have the ++same leaves. tree-equal returns true if tree-1 and tree-2 are both ++atoms and satisfy the test, or if they are both conses and the car of ++tree-1 is tree-equal to the car of tree-2 and the cdr of tree-1 is ++tree-equal to the cdr of tree-2. Otherwise, tree-equal returns false. ++ ++ tree-equal recursively compares conses but not any other objects that ++have components. ++ ++ The first argument to the :test or :test-not function is tree-1 or a ++car or cdr of tree-1; the second argument is tree-2 or a car or cdr of ++tree-2. ++ ++Examples:: ++.......... ++ ++ (setq tree1 '(1 (1 2)) ++ tree2 '(1 (1 2))) => (1 (1 2)) ++ (tree-equal tree1 tree2) => true ++ (eql tree1 tree2) => false ++ (setq tree1 '('a ('b 'c)) ++ tree2 '('a ('b 'c))) => ('a ('b 'c)) ++ => ((QUOTE A) ((QUOTE B) (QUOTE C))) ++ (tree-equal tree1 tree2 :test 'eq) => true ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if both tree-1 and tree-2 are circular. ++ ++See Also:: ++.......... ++ ++*note equal:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ ++File: gcl.info, Node: copy-list, Next: list (Function), Prev: tree-equal, Up: Conses Dictionary ++ ++14.2.14 copy-list [Function] ++---------------------------- ++ ++'copy-list' list => copy ++ ++Arguments and Values:: ++...................... ++ ++list--a proper list or a dotted list. ++ ++ copy--a list. ++ ++Description:: ++............. ++ ++Returns a copy of list. If list is a dotted list, the resulting list ++will also be a dotted list. ++ ++ Only the list structure of list is copied; the elements of the ++resulting list are the same as the corresponding elements of the given ++list. ++ ++Examples:: ++.......... ++ ++ (setq lst (list 1 (list 2 3))) => (1 (2 3)) ++ (setq slst lst) => (1 (2 3)) ++ (setq clst (copy-list lst)) => (1 (2 3)) ++ (eq slst lst) => true ++ (eq clst lst) => false ++ (equal clst lst) => true ++ (rplaca lst "one") => ("one" (2 3)) ++ slst => ("one" (2 3)) ++ clst => (1 (2 3)) ++ (setf (caadr lst) "two") => "two" ++ lst => ("one" ("two" 3)) ++ slst => ("one" ("two" 3)) ++ clst => (1 ("two" 3)) ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if list is a circular list. ++ ++See Also:: ++.......... ++ ++*note copy-alist:: , *note copy-seq:: , *note copy-tree:: ++ ++Notes:: ++....... ++ ++The copy created is equal to list, but not eq. ++ ++ ++File: gcl.info, Node: list (Function), Next: list-length, Prev: copy-list, Up: Conses Dictionary ++ ++14.2.15 list, list* [Function] ++------------------------------ ++ ++'list' &rest objects => list ++ ++ 'list*' &rest objects^+ => result ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ list--a list. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++list returns a list containing the supplied objects. ++ ++ list* is like list except that the last argument to list becomes the ++car of the last cons constructed, while the last argument to list* ++becomes the cdr of the last cons constructed. Hence, any given call to ++list* always produces one fewer conses than a call to list with the same ++number of arguments. ++ ++ If the last argument to list* is a list, the effect is to construct a ++new list which is similar, but which has additional elements added to ++the front corresponding to the preceding arguments of list*. ++ ++ If list* receives only one object, that object is returned, ++regardless of whether or not it is a list. ++ ++Examples:: ++.......... ++ ++ (list 1) => (1) ++ (list* 1) => 1 ++ (setq a 1) => 1 ++ (list a 2) => (1 2) ++ '(a 2) => (A 2) ++ (list 'a 2) => (A 2) ++ (list* a 2) => (1 . 2) ++ (list) => NIL ;i.e., () ++ (setq a '(1 2)) => (1 2) ++ (eq a (list* a)) => true ++ (list 3 4 'a (car '(b . c)) (+ 6 -2)) => (3 4 A B 4) ++ (list* 'a 'b 'c 'd) == (cons 'a (cons 'b (cons 'c 'd))) => (A B C . D) ++ (list* 'a 'b 'c '(d e f)) => (A B C D E F) ++ ++See Also:: ++.......... ++ ++*note cons:: ++ ++Notes:: ++....... ++ ++ (list* x) == x ++ ++ ++File: gcl.info, Node: list-length, Next: listp, Prev: list (Function), Up: Conses Dictionary ++ ++14.2.16 list-length [Function] ++------------------------------ ++ ++'list-length' list => length ++ ++Arguments and Values:: ++...................... ++ ++list--a proper list or a circular list. ++ ++ length--a non-negative integer, or nil. ++ ++Description:: ++............. ++ ++Returns the length of list if list is a proper list. Returns nil if ++list is a circular list. ++ ++Examples:: ++.......... ++ ++ (list-length '(a b c d)) => 4 ++ (list-length '(a (b c) d)) => 3 ++ (list-length '()) => 0 ++ (list-length nil) => 0 ++ (defun circular-list (&rest elements) ++ (let ((cycle (copy-list elements))) ++ (nconc cycle cycle))) ++ (list-length (circular-list 'a 'b)) => NIL ++ (list-length (circular-list 'a)) => NIL ++ (list-length (circular-list)) => 0 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if list is not a proper list ++or a circular list. ++ ++See Also:: ++.......... ++ ++*note length:: ++ ++Notes:: ++....... ++ ++list-length could be implemented as follows: ++ ++ (defun list-length (x) ++ (do ((n 0 (+ n 2)) ;Counter. ++ (fast x (cddr fast)) ;Fast pointer: leaps by 2. ++ (slow x (cdr slow))) ;Slow pointer: leaps by 1. ++ (nil) ++ ;; If fast pointer hits the end, return the count. ++ (when (endp fast) (return n)) ++ (when (endp (cdr fast)) (return (+ n 1))) ++ ;; If fast pointer eventually equals slow pointer, ++ ;; then we must be stuck in a circular list. ++ ;; (A deeper property is the converse: if we are ++ ;; stuck in a circular list, then eventually the ++ ;; fast pointer will equal the slow pointer. ++ ;; That fact justifies this implementation.) ++ (when (and (eq fast slow) (> n 0)) (return nil)))) ++ ++ ++ ++File: gcl.info, Node: listp, Next: make-list, Prev: list-length, Up: Conses Dictionary ++ ++14.2.17 listp [Function] ++------------------------ ++ ++'listp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type list; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (listp nil) => true ++ (listp (cons 1 2)) => true ++ (listp (make-array 6)) => false ++ (listp t) => false ++ ++See Also:: ++.......... ++ ++*note consp:: ++ ++Notes:: ++....... ++ ++If object is a cons, listp does not check whether object is a proper ++list; it returns true for any kind of list. ++ ++ (listp object) == (typep object 'list) == (typep object '(or cons null)) ++ ++ ++File: gcl.info, Node: make-list, Next: push, Prev: listp, Up: Conses Dictionary ++ ++14.2.18 make-list [Function] ++---------------------------- ++ ++'make-list' size &key initial-element => list ++ ++Arguments and Values:: ++...................... ++ ++size--a non-negative integer. ++ ++ initial-element--an object. The default is nil. ++ ++ list--a list. ++ ++Description:: ++............. ++ ++Returns a list of length given by size, each of the elements of which is ++initial-element. ++ ++Examples:: ++.......... ++ ++ (make-list 5) => (NIL NIL NIL NIL NIL) ++ (make-list 3 :initial-element 'rah) => (RAH RAH RAH) ++ (make-list 2 :initial-element '(1 2 3)) => ((1 2 3) (1 2 3)) ++ (make-list 0) => NIL ;i.e., () ++ (make-list 0 :initial-element 'new-element) => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if size is not a non-negative ++integer. ++ ++See Also:: ++.......... ++ ++*note cons:: , *note list (Function):: ++ ++ ++File: gcl.info, Node: push, Next: pop, Prev: make-list, Up: Conses Dictionary ++ ++14.2.19 push [Macro] ++-------------------- ++ ++'push' item place => new-place-value ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ place--a place, the value of which may be any object. ++ ++ new-place-value--a list (the new value of place). ++ ++Description:: ++............. ++ ++push prepends item to the list that is stored in place, stores the ++resulting list in place, and returns the list. ++ ++ For information about the evaluation of subforms of place, see *note ++Evaluation of Subforms to Places::. ++ ++Examples:: ++.......... ++ ++ (setq llst '(nil)) => (NIL) ++ (push 1 (car llst)) => (1) ++ llst => ((1)) ++ (push 1 (car llst)) => (1 1) ++ llst => ((1 1)) ++ (setq x '(a (b c) d)) => (A (B C) D) ++ (push 5 (cadr x)) => (5 B C) ++ x => (A (5 B C) D) ++ ++Side Effects:: ++.............. ++ ++The contents of place are modified. ++ ++See Also:: ++.......... ++ ++*note pop:: , *note pushnew:: , *note Generalized Reference:: ++ ++Notes:: ++....... ++ ++The effect of (push item place) is equivalent to ++ ++ (setf place (cons item place)) ++ ++ except that the subforms of place are evaluated only once, and item ++is evaluated before place. ++ ++ ++File: gcl.info, Node: pop, Next: first, Prev: push, Up: Conses Dictionary ++ ++14.2.20 pop [Macro] ++------------------- ++ ++'pop' place => element ++ ++Arguments and Values:: ++...................... ++ ++place--a place, the value of which is a list (possibly, but necessarily, ++a dotted list or circular list). ++ ++ element--an object (the car of the contents of place). ++ ++Description:: ++............. ++ ++pop reads the value of place, remembers the car of the list which was ++retrieved, writes the cdr of the list back into the place, and finally ++yields the car of the originally retrieved list. ++ ++ For information about the evaluation of subforms of place, see *note ++Evaluation of Subforms to Places::. ++ ++Examples:: ++.......... ++ ++ (setq stack '(a b c)) => (A B C) ++ (pop stack) => A ++ stack => (B C) ++ (setq llst '((1 2 3 4))) => ((1 2 3 4)) ++ (pop (car llst)) => 1 ++ llst => ((2 3 4)) ++ ++Side Effects:: ++.............. ++ ++The contents of place are modified. ++ ++See Also:: ++.......... ++ ++*note push:: , *note pushnew:: , *note Generalized Reference:: ++ ++Notes:: ++....... ++ ++The effect of (pop place) is roughly equivalent to ++ ++ (prog1 (car place) (setf place (cdr place))) ++ ++ except that the latter would evaluate any subforms of place three ++times, while pop evaluates them only once. ++ ++ ++File: gcl.info, Node: first, Next: nth, Prev: pop, Up: Conses Dictionary ++ ++14.2.21 first, second, third, fourth, fifth, ++-------------------------------------------- ++ ++sixth, seventh, eighth, ninth, tenth ++------------------------------------ ++ ++ [Accessor] ++ ++ 'first' list => object (setf ('first' list) new-object) ++ ++ 'second' list => object (setf ('second' list) new-object) ++ ++ 'third' list => object (setf ('third' list) new-object) ++ ++ 'fourth' list => object (setf ('fourth' list) new-object) ++ ++ 'fifth' list => object (setf ('fifth' list) new-object) ++ ++ 'sixth' list => object (setf ('sixth' list) new-object) ++ ++ 'seventh' list => object (setf ('seventh' list) new-object) ++ ++ 'eighth' list => object (setf ('eighth' list) new-object) ++ ++ 'ninth' list => object (setf ('ninth' list) new-object) ++ ++ 'tenth' list => object (setf ('tenth' list) new-object) ++ ++Arguments and Values:: ++...................... ++ ++list--a list, ++ ++ which might be a dotted list or a circular list. ++ ++ object, new-object--an object. ++ ++Description:: ++............. ++ ++The functions first, second, third, fourth, fifth, sixth, seventh, ++eighth, ninth, and tenth access the first, second, third, fourth, fifth, ++sixth, seventh, eighth, ninth, and tenth elements of list, respectively. ++Specifically, ++ ++ (first list) == (car list) ++ (second list) == (car (cdr list)) ++ (third list) == (car (cddr list)) ++ (fourth list) == (car (cdddr list)) ++ (fifth list) == (car (cddddr list)) ++ (sixth list) == (car (cdr (cddddr list))) ++ (seventh list) == (car (cddr (cddddr list))) ++ (eighth list) == (car (cdddr (cddddr list))) ++ (ninth list) == (car (cddddr (cddddr list))) ++ (tenth list) == (car (cdr (cddddr (cddddr list)))) ++ ++ setf can also be used with any of these functions to change an ++existing component. The same equivalences apply. For example: ++ ++ (setf (fifth list) new-object) == (setf (car (cddddr list)) new-object) ++ ++Examples:: ++.......... ++ ++ (setq lst '(1 2 3 (4 5 6) ((V)) vi 7 8 9 10)) ++ => (1 2 3 (4 5 6) ((V)) VI 7 8 9 10) ++ (first lst) => 1 ++ (tenth lst) => 10 ++ (fifth lst) => ((V)) ++ (second (fourth lst)) => 5 ++ (sixth '(1 2 3)) => NIL ++ (setf (fourth lst) "four") => "four" ++ lst => (1 2 3 "four" ((V)) VI 7 8 9 10) ++ ++See Also:: ++.......... ++ ++*note car:: , *note nth:: ++ ++Notes:: ++....... ++ ++first is functionally equivalent to car, second is functionally ++equivalent to cadr, third is functionally equivalent to caddr, and ++fourth is functionally equivalent to cadddr. ++ ++ The ordinal numbering used here is one-origin, as opposed to the ++zero-origin numbering used by nth: ++ ++ (fifth x) == (nth 4 x) ++ ++ ++File: gcl.info, Node: nth, Next: endp, Prev: first, Up: Conses Dictionary ++ ++14.2.22 nth [Accessor] ++---------------------- ++ ++'nth' n list => object ++ ++ (setf (' nth' n list) new-object) ++ ++Arguments and Values:: ++...................... ++ ++n--a non-negative integer. ++ ++ list--a list, ++ ++ which might be a dotted list or a circular list. ++ ++ object--an object. ++ ++ new-object--an object. ++ ++Description:: ++............. ++ ++nth locates the nth element of list, where the car of the list is the ++"zeroth" element. ++ ++ Specifically, ++ ++ (nth n list) == (car (nthcdr n list)) ++ ++ nth may be used to specify a place to setf. ++ ++ Specifically, ++ ++ (setf (nth n list) new-object) == (setf (car (nthcdr n list)) new-object) ++ ++Examples:: ++.......... ++ ++ (nth 0 '(foo bar baz)) => FOO ++ (nth 1 '(foo bar baz)) => BAR ++ (nth 3 '(foo bar baz)) => NIL ++ (setq 0-to-3 (list 0 1 2 3)) => (0 1 2 3) ++ (setf (nth 2 0-to-3) "two") => "two" ++ 0-to-3 => (0 1 "two" 3) ++ ++See Also:: ++.......... ++ ++*note elt:: , *note first:: , *note nthcdr:: ++ ++ ++File: gcl.info, Node: endp, Next: null, Prev: nth, Up: Conses Dictionary ++ ++14.2.23 endp [Function] ++----------------------- ++ ++'endp' list => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++list--a list, ++ ++ which might be a dotted list or a circular list. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if list is the empty list. Returns false if list is a ++cons. ++ ++Examples:: ++.......... ++ ++ (endp nil) => true ++ (endp '(1 2)) => false ++ (endp (cddr '(1 2))) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if list is not a list. ++ ++Notes:: ++....... ++ ++The purpose of endp is to test for the end of proper list. Since endp ++does not descend into a cons, it is well-defined to pass it a dotted ++list. However, if shorter "lists" are iteratively produced by calling ++cdr on such a dotted list and those "lists" are tested with endp, a ++situation that has undefined consequences will eventually result when ++the non-nil atom (which is not in fact a list) finally becomes the ++argument to endp. Since this is the usual way in which endp is used, it ++is conservative programming style and consistent with the intent of endp ++to treat endp as simply a function on proper lists which happens not to ++enforce an argument type of proper list except when the argument is ++atomic. ++ ++ ++File: gcl.info, Node: null, Next: nconc, Prev: endp, Up: Conses Dictionary ++ ++14.2.24 null [Function] ++----------------------- ++ ++'null' object => boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ boolean--a boolean. ++ ++Description:: ++............. ++ ++Returns t if object is the empty list; otherwise, returns nil. ++ ++Examples:: ++.......... ++ ++ (null '()) => T ++ (null nil) => T ++ (null t) => NIL ++ (null 1) => NIL ++ ++See Also:: ++.......... ++ ++*note not:: ++ ++Notes:: ++....... ++ ++null is intended to be used to test for the empty list whereas not is ++intended to be used to invert a boolean (or generalized boolean). ++Operationally, null and not compute the same result; which to use is a ++matter of style. ++ ++ (null object) == (typep object 'null) == (eq object '()) ++ ++ ++File: gcl.info, Node: nconc, Next: append, Prev: null, Up: Conses Dictionary ++ ++14.2.25 nconc [Function] ++------------------------ ++ ++'nconc' &rest lists => concatenated-list ++ ++Arguments and Values:: ++...................... ++ ++list--each but the last must be a list (which might be a dotted list but ++must not be a circular list); the last list may be any object. ++ ++ concatenated-list--a list. ++ ++Description:: ++............. ++ ++Returns a list that is the concatenation of lists. If no lists are ++supplied, (nconc) returns nil. ++ ++ nconc is defined using the following recursive relationship: ++ ++ (nconc) => () ++ (nconc nil . lists) == (nconc . lists) ++ (nconc list) => list ++ (nconc list-1 list-2) == (progn (rplacd (last list-1) list-2) list-1) ++ (nconc list-1 list-2 . lists) == (nconc (nconc list-1 list-2) . lists) ++ ++Examples:: ++.......... ++ ++ (nconc) => NIL ++ (setq x '(a b c)) => (A B C) ++ (setq y '(d e f)) => (D E F) ++ (nconc x y) => (A B C D E F) ++ x => (A B C D E F) ++ ++ Note, in the example, that the value of x is now different, since its ++last cons has been rplacd'd to the value of y. If (nconc x y) were ++evaluated again, it would yield a piece of a circular list, whose ++printed representation would be (A B C D E F D E F D E F ...), repeating ++forever; if the *print-circle* switch were non-nil, it would be printed ++as (A B C . #1=(D E F . #1#)). ++ ++ (setq foo (list 'a 'b 'c 'd 'e) ++ bar (list 'f 'g 'h 'i 'j) ++ baz (list 'k 'l 'm)) => (K L M) ++ (setq foo (nconc foo bar baz)) => (A B C D E F G H I J K L M) ++ foo => (A B C D E F G H I J K L M) ++ bar => (F G H I J K L M) ++ baz => (K L M) ++ ++ (setq foo (list 'a 'b 'c 'd 'e) ++ bar (list 'f 'g 'h 'i 'j) ++ baz (list 'k 'l 'm)) => (K L M) ++ (setq foo (nconc nil foo bar nil baz)) => (A B C D E F G H I J K L M) ++ foo => (A B C D E F G H I J K L M) ++ bar => (F G H I J K L M) ++ baz => (K L M) ++ ++Side Effects:: ++.............. ++ ++The lists are modified rather than copied. ++ ++See Also:: ++.......... ++ ++*note append:: , *note concatenate:: ++ ++ ++File: gcl.info, Node: append, Next: revappend, Prev: nconc, Up: Conses Dictionary ++ ++14.2.26 append [Function] ++------------------------- ++ ++'append' &rest lists => result ++ ++Arguments and Values:: ++...................... ++ ++list--each must be a proper list except the last, which may be any ++object. ++ ++ result--an object. This will be a list unless the last list was not ++a list and all preceding lists were null. ++ ++Description:: ++............. ++ ++append returns a new list that is the concatenation of the copies. ++lists are left unchanged; the list structure of each of lists except the ++last is copied. The last argument is not copied; it becomes the cdr of ++the final dotted pair of the concatenation of the preceding lists, or is ++returned directly if there are no preceding non-empty lists. ++ ++Examples:: ++.......... ++ ++ (append '(a b c) '(d e f) '() '(g)) => (A B C D E F G) ++ (append '(a b c) 'd) => (A B C . D) ++ (setq lst '(a b c)) => (A B C) ++ (append lst '(d)) => (A B C D) ++ lst => (A B C) ++ (append) => NIL ++ (append 'a) => A ++ ++See Also:: ++.......... ++ ++*note nconc:: , *note concatenate:: ++ ++ ++File: gcl.info, Node: revappend, Next: butlast, Prev: append, Up: Conses Dictionary ++ ++14.2.27 revappend, nreconc [Function] ++------------------------------------- ++ ++'revappend' list tail => result-list ++ ++ 'nreconc' list tail => result-list ++ ++Arguments and Values:: ++...................... ++ ++list--a proper list. ++ ++ tail--an object. ++ ++ result-list--an object. ++ ++Description:: ++............. ++ ++revappend constructs a copy_2 of list, but with the elements in reverse ++order. It then appends (as if by nconc) the tail to that reversed list ++and returns the result. ++ ++ nreconc reverses the order of elements in list (as if by nreverse). ++It then appends (as if by nconc) the tail to that reversed list and ++returns the result. ++ ++ The resulting list shares list structure with tail. ++ ++Examples:: ++.......... ++ ++ (let ((list-1 (list 1 2 3)) ++ (list-2 (list 'a 'b 'c))) ++ (print (revappend list-1 list-2)) ++ (print (equal list-1 '(1 2 3))) ++ (print (equal list-2 '(a b c)))) ++ |> (3 2 1 A B C) ++ |> T ++ |> T ++ => T ++ ++ (revappend '(1 2 3) '()) => (3 2 1) ++ (revappend '(1 2 3) '(a . b)) => (3 2 1 A . B) ++ (revappend '() '(a b c)) => (A B C) ++ (revappend '(1 2 3) 'a) => (3 2 1 . A) ++ (revappend '() 'a) => A ;degenerate case ++ ++ (let ((list-1 '(1 2 3)) ++ (list-2 '(a b c))) ++ (print (nreconc list-1 list-2)) ++ (print (equal list-1 '(1 2 3))) ++ (print (equal list-2 '(a b c)))) ++ |> (3 2 1 A B C) ++ |> NIL ++ |> T ++ => T ++ ++ ++Side Effects:: ++.............. ++ ++revappend does not modify either of its arguments. nreconc is permitted ++to modify list but not tail. ++ ++ Although it might be implemented differently, nreconc is constrained ++to have side-effect behavior equivalent to: ++ ++ (nconc (nreverse list) tail) ++ ++See Also:: ++.......... ++ ++*note reverse:: , nreverse, *note nconc:: ++ ++Notes:: ++....... ++ ++The following functional equivalences are true, although good ++implementations will typically use a faster algorithm for achieving the ++same effect: ++ ++ (revappend list tail) == (nconc (reverse list) tail) ++ (nreconc list tail) == (nconc (nreverse list) tail) ++ ++ ++File: gcl.info, Node: butlast, Next: last, Prev: revappend, Up: Conses Dictionary ++ ++14.2.28 butlast, nbutlast [Function] ++------------------------------------ ++ ++'butlast' list &optional n => result-list ++ ++ 'nbutlast' list &optional n => result-list ++ ++Arguments and Values:: ++...................... ++ ++list--a list, ++ ++ which might be a dotted list but must not be a circular list. ++ ++ n--a non-negative integer. ++ ++ result-list--a list. ++ ++Description:: ++............. ++ ++butlast returns a copy of list from which the last n ++ ++ conses ++ ++ have been omitted. If n is not supplied, its value is 1. If there ++are fewer than n ++ ++ conses ++ ++ in list, nil is returned and, in the case of nbutlast, list is not ++modified. ++ ++ nbutlast is like butlast, but nbutlast may modify list. It changes ++the cdr of the cons n+1 from the end of the list to nil. ++ ++Examples:: ++.......... ++ ++ (setq lst '(1 2 3 4 5 6 7 8 9)) => (1 2 3 4 5 6 7 8 9) ++ (butlast lst) => (1 2 3 4 5 6 7 8) ++ (butlast lst 5) => (1 2 3 4) ++ (butlast lst (+ 5 5)) => NIL ++ lst => (1 2 3 4 5 6 7 8 9) ++ (nbutlast lst 3) => (1 2 3 4 5 6) ++ lst => (1 2 3 4 5 6) ++ (nbutlast lst 99) => NIL ++ lst => (1 2 3 4 5 6) ++ (butlast '(a b c d)) => (A B C) ++ (butlast '((a b) (c d))) => ((A B)) ++ (butlast '(a)) => NIL ++ (butlast nil) => NIL ++ (setq foo (list 'a 'b 'c 'd)) => (A B C D) ++ (nbutlast foo) => (A B C) ++ foo => (A B C) ++ (nbutlast (list 'a)) => NIL ++ (nbutlast '()) => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if list is not a proper list ++or a dotted list. ++ ++ Should signal an error of type type-error if n is not a non-negative ++integer. ++ ++Notes:: ++....... ++ ++ (butlast list n) == (ldiff list (last list n)) ++ ++ ++File: gcl.info, Node: last, Next: ldiff, Prev: butlast, Up: Conses Dictionary ++ ++14.2.29 last [Function] ++----------------------- ++ ++'last' list &optional n => tail ++ ++Arguments and Values:: ++...................... ++ ++list--a list, ++ ++ which might be a dotted list but must not be a circular list. ++ ++ n--a non-negative integer. The default is 1. ++ ++ tail--an object. ++ ++Description:: ++............. ++ ++last returns the last n conses (not the last n elements) of list). If ++list is (), last returns (). ++ ++ If n is zero, the atom that terminates list is returned. If n is ++greater than or equal to the number of cons cells in list, the result is ++list. ++ ++Examples:: ++.......... ++ ++ (last nil) => NIL ++ (last '(1 2 3)) => (3) ++ (last '(1 2 . 3)) => (2 . 3) ++ (setq x (list 'a 'b 'c 'd)) => (A B C D) ++ (last x) => (D) ++ (rplacd (last x) (list 'e 'f)) x => (A B C D E F) ++ (last x) => (F) ++ ++ (last '(a b c)) => (C) ++ ++ (last '(a b c) 0) => () ++ (last '(a b c) 1) => (C) ++ (last '(a b c) 2) => (B C) ++ (last '(a b c) 3) => (A B C) ++ (last '(a b c) 4) => (A B C) ++ ++ (last '(a . b) 0) => B ++ (last '(a . b) 1) => (A . B) ++ (last '(a . b) 2) => (A . B) ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if list is a circular list. ++ ++ Should signal an error of type type-error if n is not a non-negative ++integer. ++ ++See Also:: ++.......... ++ ++*note butlast:: , *note nth:: ++ ++Notes:: ++....... ++ ++The following code could be used to define last. ++ ++ (defun last (list &optional (n 1)) ++ (check-type n (integer 0)) ++ (do ((l list (cdr l)) ++ (r list) ++ (i 0 (+ i 1))) ++ ((atom l) r) ++ (if (>= i n) (pop r)))) ++ ++ ++File: gcl.info, Node: ldiff, Next: nthcdr, Prev: last, Up: Conses Dictionary ++ ++14.2.30 ldiff, tailp [Function] ++------------------------------- ++ ++'ldiff' list object => result-list ++ ++ 'tailp' object list => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++list--a list, ++ ++ which might be a dotted list. ++ ++ object--an object. ++ ++ result-list--a list. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++If object is the same as some tail of list, tailp returns true; ++otherwise, it returns false. ++ ++ If object is the same as some tail of list, ldiff returns a fresh ++list of the elements of list that precede object in the list structure ++of list; otherwise, it returns a copy_2 of list. ++ ++Examples:: ++.......... ++ ++ (let ((lists '#((a b c) (a b c . d)))) ++ (dotimes (i (length lists)) () ++ (let ((list (aref lists i))) ++ (format t "~2&list=~S ~21T(tailp object list)~ ++ ~44T(ldiff list object)~ ++ (let ((objects (vector list (cddr list) (copy-list (cddr list)) ++ '(f g h) '() 'd 'x))) ++ (dotimes (j (length objects)) () ++ (let ((object (aref objects j))) ++ (format t "~& object=~S ~21T~S ~44T~S" ++ object (tailp object list) (ldiff list object)))))))) ++ |> ++ |> list=(A B C) (tailp object list) (ldiff list object) ++ |> object=(A B C) T NIL ++ |> object=(C) T (A B) ++ |> object=(C) NIL (A B C) ++ |> object=(F G H) NIL (A B C) ++ |> object=NIL T (A B C) ++ |> object=D NIL (A B C) ++ |> object=X NIL (A B C) ++ |> ++ |> list=(A B C . D) (tailp object list) (ldiff list object) ++ |> object=(A B C . D) T NIL ++ |> object=(C . D) T (A B) ++ |> object=(C . D) NIL (A B C . D) ++ |> object=(F G H) NIL (A B C . D) ++ |> object=NIL NIL (A B C . D) ++ |> object=D T (A B C) ++ |> object=X NIL (A B C . D) ++ => NIL ++ ++Side Effects:: ++.............. ++ ++Neither ldiff nor tailp modifies either of its arguments. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list is not ++a proper list or a dotted list. ++ ++See Also:: ++.......... ++ ++*note set-difference:: ++ ++Notes:: ++....... ++ ++If the list is a circular list, tailp will reliably yield a value only ++if the given object is in fact a tail of list. Otherwise, the ++consequences are unspecified: a given implementation which detects the ++circularity must return false, but since an implementation is not ++obliged to detect such a situation, tailp might just loop indefinitely ++without returning in that case. ++ ++ tailp could be defined as follows: ++ ++ (defun tailp (object list) ++ (do ((list list (cdr list))) ++ ((atom list) (eql list object)) ++ (if (eql object list) ++ (return t)))) ++ ++ and ldiff could be defined by: ++ ++ (defun ldiff (list object) ++ (do ((list list (cdr list)) ++ (r '() (cons (car list) r))) ++ ((atom list) ++ (if (eql list object) (nreverse r) (nreconc r list))) ++ (when (eql object list) ++ (return (nreverse r))))) ++ ++ ++File: gcl.info, Node: nthcdr, Next: rest, Prev: ldiff, Up: Conses Dictionary ++ ++14.2.31 nthcdr [Function] ++------------------------- ++ ++'nthcdr' n list => tail ++ ++Arguments and Values:: ++...................... ++ ++n--a non-negative integer. ++ ++ list--a list, ++ ++ which might be a dotted list or a circular list. ++ ++ tail--an object. ++ ++Description:: ++............. ++ ++Returns the tail of list that would be obtained by calling cdr n times ++in succession. ++ ++Examples:: ++.......... ++ ++ (nthcdr 0 '()) => NIL ++ (nthcdr 3 '()) => NIL ++ (nthcdr 0 '(a b c)) => (A B C) ++ (nthcdr 2 '(a b c)) => (C) ++ (nthcdr 4 '(a b c)) => () ++ (nthcdr 1 '(0 . 1)) => 1 ++ ++ (locally (declare (optimize (safety 3))) ++ (nthcdr 3 '(0 . 1))) ++ Error: Attempted to take CDR of 1. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if n is not a non-negative ++integer. ++ ++ For n being an integer greater than 1, the error checking done by ++(nthcdr n list) is the same as for (nthcdr (- n 1) (cdr list)); see the ++function cdr. ++ ++See Also:: ++.......... ++ ++cdr, *note nth:: , *note rest:: ++ ++ ++File: gcl.info, Node: rest, Next: member (Function), Prev: nthcdr, Up: Conses Dictionary ++ ++14.2.32 rest [Accessor] ++----------------------- ++ ++'rest' list => tail ++ ++ (setf (' rest' list) new-tail) ++ ++Arguments and Values:: ++...................... ++ ++list--a list, ++ ++ which might be a dotted list or a circular list. ++ ++ tail--an object. ++ ++Description:: ++............. ++ ++rest performs the same operation as cdr, but mnemonically complements ++first. Specifically, ++ ++ (rest list) == (cdr list) ++ (setf (rest list) new-tail) == (setf (cdr list) new-tail) ++ ++Examples:: ++.......... ++ ++ (rest '(1 2)) => (2) ++ (rest '(1 . 2)) => 2 ++ (rest '(1)) => NIL ++ (setq *cons* '(1 . 2)) => (1 . 2) ++ (setf (rest *cons*) "two") => "two" ++ *cons* => (1 . "two") ++ ++See Also:: ++.......... ++ ++cdr, *note nthcdr:: ++ ++Notes:: ++....... ++ ++rest is often preferred stylistically over cdr when the argument is to ++being subjectively viewed as a list rather than as a cons. ++ ++ ++File: gcl.info, Node: member (Function), Next: mapc, Prev: rest, Up: Conses Dictionary ++ ++14.2.33 member, member-if, member-if-not [Function] ++--------------------------------------------------- ++ ++'member' item list &key key test test-not => tail ++ ++ 'member-if' predicate list &key key => tail ++ ++ 'member-if-not' predicate list &key key => tail ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ list--a proper list. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ tail--a list. ++ ++Description:: ++............. ++ ++member, member-if, and member-if-not each search list for item or for a ++top-level element that satisfies the test. The argument to the ++predicate function is an element of list. ++ ++ If some element satisfies the test, the tail of list beginning with ++this element is returned; otherwise nil is returned. ++ ++ list is searched on the top level only. ++ ++Examples:: ++.......... ++ ++ (member 2 '(1 2 3)) => (2 3) ++ (member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) => ((3 . 4)) ++ (member 'e '(a b c d)) => NIL ++ ++ (member-if #'listp '(a b nil c d)) => (NIL C D) ++ (member-if #'numberp '(a #\Space 5/3 foo)) => (5/3 FOO) ++ (member-if-not #'zerop ++ '(3 6 9 11 . 12) ++ :key #'(lambda (x) (mod x 3))) => (11 . 12) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list is not ++a proper list. ++ ++See Also:: ++.......... ++ ++*note find:: , *note position:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ The function member-if-not is deprecated. ++ ++ In the following ++ ++ (member 'a '(g (a y) c a d e a f)) => (A D E A F) ++ ++ the value returned by member is identical to the portion of the list ++beginning with a. Thus rplaca on the result of member can be used to ++alter the part of the list where a was found (assuming a check has been ++made that member did not return nil). ++ ++ ++File: gcl.info, Node: mapc, Next: acons, Prev: member (Function), Up: Conses Dictionary ++ ++14.2.34 mapc, mapcar, mapcan, mapl, maplist, mapcon [Function] ++-------------------------------------------------------------- ++ ++'mapc' function &rest lists^+ => list-1 ++ ++ 'mapcar' function &rest lists^+ => result-list ++ ++ 'mapcan' function &rest lists^+ => concatenated-results ++ ++ 'mapl' function &rest lists^+ => list-1 ++ ++ 'maplist' function &rest lists^+ => result-list ++ ++ 'mapcon' function &rest lists^+ => concatenated-results ++ ++Arguments and Values:: ++...................... ++ ++function--a designator for a function that must take as many arguments ++as there are lists. ++ ++ list--a proper list. ++ ++ list-1--the first list (which must be a proper list). ++ ++ result-list--a list. ++ ++ concatenated-results--a list. ++ ++Description:: ++............. ++ ++The mapping operation involves applying function to successive sets of ++arguments in which one argument is obtained from each sequence. Except ++for mapc and mapl, the result contains the results returned by function. ++In the cases of mapc and mapl, the resulting sequence is list. ++ ++ function is called first on all the elements with index 0, then on ++all those with index 1, and so on. result-type specifies the type of ++the resulting sequence. ++ ++ If function is a symbol, it is coerced to a function as if by ++symbol-function. ++ ++ mapcar operates on successive elements of the lists. function is ++applied to the first element of each list, then to the second element of ++each list, and so on. The iteration terminates when the shortest list ++runs out, and excess elements in other lists are ignored. The value ++returned by mapcar is a list of the results of successive calls to ++function. ++ ++ mapc is like mapcar except that the results of applying function are ++not accumulated. The list argument is returned. ++ ++ maplist is like mapcar except that function is applied to successive ++sublists of the lists. function is first applied to the lists ++themselves, and then to the cdr of each list, and then to the cdr of the ++cdr of each list, and so on. ++ ++ mapl is like maplist except that the results of applying function are ++not accumulated; list-1 is returned. ++ ++ mapcan and mapcon are like mapcar and maplist respectively, except ++that the results of applying function are combined into a list by the ++use of nconc rather than list. That is, ++ ++ (mapcon f x1 ... xn) ++ == (apply #'nconc (maplist f x1 ... xn)) ++ ++ and similarly for the relationship between mapcan and mapcar. ++ ++Examples:: ++.......... ++ ++ (mapcar #'car '((1 a) (2 b) (3 c))) => (1 2 3) ++ (mapcar #'abs '(3 -4 2 -5 -6)) => (3 4 2 5 6) ++ (mapcar #'cons '(a b c) '(1 2 3)) => ((A . 1) (B . 2) (C . 3)) ++ ++ (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3)) ++ => ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3)) ++ (maplist #'(lambda (x) (cons 'foo x)) '(a b c d)) ++ => ((FOO A B C D) (FOO B C D) (FOO C D) (FOO D)) ++ (maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c)) ++ => (0 0 1 0 1 1 1) ++ ;An entry is 1 if the corresponding element of the input ++ ; list was the last instance of that element in the input list. ++ ++ (setq dummy nil) => NIL ++ (mapc #'(lambda (&rest x) (setq dummy (append dummy x))) ++ '(1 2 3 4) ++ '(a b c d e) ++ '(x y z)) => (1 2 3 4) ++ dummy => (1 A X 2 B Y 3 C Z) ++ ++ (setq dummy nil) => NIL ++ (mapl #'(lambda (x) (push x dummy)) '(1 2 3 4)) => (1 2 3 4) ++ dummy => ((4) (3 4) (2 3 4) (1 2 3 4)) ++ ++ (mapcan #'(lambda (x y) (if (null x) nil (list x y))) ++ '(nil nil nil d e) ++ '(1 2 3 4 5 6)) => (D 4 E 5) ++ (mapcan #'(lambda (x) (and (numberp x) (list x))) ++ '(a 1 b c 3 4 d 5)) ++ => (1 3 4 5) ++ ++ In this case the function serves as a filter; this is a standard Lisp ++idiom using mapcan. ++ ++ (mapcon #'list '(1 2 3 4)) => ((1 2 3 4) (2 3 4) (3 4) (4)) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if any list is ++not a proper list. ++ ++See Also:: ++.......... ++ ++*note dolist:: , *note map:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: acons, Next: assoc, Prev: mapc, Up: Conses Dictionary ++ ++14.2.35 acons [Function] ++------------------------ ++ ++'acons' key datum alist => new-alist ++ ++Arguments and Values:: ++...................... ++ ++key--an object. ++ ++ datum--an object. ++ ++ alist--an association list. ++ ++ new-alist--an association list. ++ ++Description:: ++............. ++ ++Creates a fresh cons, the cdr of which is alist and the car of which is ++another fresh cons, the car of which is key and the cdr of which is ++datum. ++ ++Examples:: ++.......... ++ ++ (setq alist '()) => NIL ++ (acons 1 "one" alist) => ((1 . "one")) ++ alist => NIL ++ (setq alist (acons 1 "one" (acons 2 "two" alist))) => ((1 . "one") (2 . "two")) ++ (assoc 1 alist) => (1 . "one") ++ (setq alist (acons 1 "uno" alist)) => ((1 . "uno") (1 . "one") (2 . "two")) ++ (assoc 1 alist) => (1 . "uno") ++ ++See Also:: ++.......... ++ ++*note assoc:: , *note pairlis:: ++ ++Notes:: ++....... ++ ++ (acons key datum alist) == (cons (cons key datum) alist) ++ ++ ++File: gcl.info, Node: assoc, Next: copy-alist, Prev: acons, Up: Conses Dictionary ++ ++14.2.36 assoc, assoc-if, assoc-if-not [Function] ++------------------------------------------------ ++ ++'assoc' item alist &key key test test-not => entry ++ ++ 'assoc-if' predicate alist &key key => entry ++ ++ 'assoc-if-not' predicate alist &key key => entry ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ alist--an association list. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ entry--a cons that is an element of alist, or nil. ++ ++Description:: ++............. ++ ++assoc, assoc-if, and assoc-if-not return the first cons in alist whose ++car satisfies the test, or nil if no such cons is found. ++ ++ For assoc, assoc-if, and assoc-if-not, if nil appears in alist in ++place of a pair, it is ignored. ++ ++Examples:: ++.......... ++ ++ (setq values '((x . 100) (y . 200) (z . 50))) => ((X . 100) (Y . 200) (Z . 50)) ++ (assoc 'y values) => (Y . 200) ++ (rplacd (assoc 'y values) 201) => (Y . 201) ++ (assoc 'y values) => (Y . 201) ++ (setq alist '((1 . "one")(2 . "two")(3 . "three"))) ++ => ((1 . "one") (2 . "two") (3 . "three")) ++ (assoc 2 alist) => (2 . "two") ++ (assoc-if #'evenp alist) => (2 . "two") ++ (assoc-if-not #'(lambda(x) (< x 3)) alist) => (3 . "three") ++ (setq alist '(("one" . 1)("two" . 2))) => (("one" . 1) ("two" . 2)) ++ (assoc "one" alist) => NIL ++ (assoc "one" alist :test #'equalp) => ("one" . 1) ++ (assoc "two" alist :key #'(lambda(x) (char x 2))) => NIL ++ (assoc #\o alist :key #'(lambda(x) (char x 2))) => ("two" . 2) ++ (assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z))) => (R . X) ++ (assoc 'goo '((foo . bar) (zoo . goo))) => NIL ++ (assoc '2 '((1 a b c) (2 b c d) (-7 x y z))) => (2 B C D) ++ (setq alist '(("one" . 1) ("2" . 2) ("three" . 3))) ++ => (("one" . 1) ("2" . 2) ("three" . 3)) ++ (assoc-if-not #'alpha-char-p alist ++ :key #'(lambda (x) (char x 0))) => ("2" . 2) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if alist is not ++an association list. ++ ++See Also:: ++.......... ++ ++*note rassoc:: , *note find:: , *note member (Function):: , *note ++position:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ The function assoc-if-not is deprecated. ++ ++ It is possible to rplacd the result of assoc, provided that it is not ++nil, in order to "update" alist. ++ ++ The two expressions ++ ++ (assoc item list :test fn) ++ ++ and ++ ++ (find item list :test fn :key #'car) ++ ++ are equivalent in meaning with one exception: if nil appears in alist ++in place of a pair, and item is nil, find will compute the car of the ++nil in alist, find that it is equal to item, and return nil, whereas ++assoc will ignore the nil in alist and continue to search for an actual ++cons whose car is nil. ++ ++ ++File: gcl.info, Node: copy-alist, Next: pairlis, Prev: assoc, Up: Conses Dictionary ++ ++14.2.37 copy-alist [Function] ++----------------------------- ++ ++'copy-alist' alist => new-alist ++ ++Arguments and Values:: ++...................... ++ ++alist--an association list. ++ ++ new-alist--an association list. ++ ++Description:: ++............. ++ ++copy-alist returns a copy of alist. ++ ++ The list structure of alist is copied, and the elements of alist ++which are conses are also copied (as conses only). Any other objects ++which are referred to, whether directly or indirectly, by the alist ++continue to be shared. ++ ++Examples:: ++.......... ++ ++ (defparameter *alist* (acons 1 "one" (acons 2 "two" '()))) ++ *alist* => ((1 . "one") (2 . "two")) ++ (defparameter *list-copy* (copy-list *alist*)) ++ *list-copy* => ((1 . "one") (2 . "two")) ++ (defparameter *alist-copy* (copy-alist *alist*)) ++ *alist-copy* => ((1 . "one") (2 . "two")) ++ (setf (cdr (assoc 2 *alist-copy*)) "deux") => "deux" ++ *alist-copy* => ((1 . "one") (2 . "deux")) ++ *alist* => ((1 . "one") (2 . "two")) ++ (setf (cdr (assoc 1 *list-copy*)) "uno") => "uno" ++ *list-copy* => ((1 . "uno") (2 . "two")) ++ *alist* => ((1 . "uno") (2 . "two")) ++ ++See Also:: ++.......... ++ ++*note copy-list:: ++ ++ ++File: gcl.info, Node: pairlis, Next: rassoc, Prev: copy-alist, Up: Conses Dictionary ++ ++14.2.38 pairlis [Function] ++-------------------------- ++ ++'pairlis' keys data &optional alist => new-alist ++ ++Arguments and Values:: ++...................... ++ ++keys--a proper list. ++ ++ data--a proper list. ++ ++ alist--an association list. The default is the empty list. ++ ++ new-alist--an association list. ++ ++Description:: ++............. ++ ++Returns an association list that associates elements of keys to ++corresponding elements of data. The consequences are undefined if keys ++and data are not of the same length. ++ ++ If alist is supplied, pairlis returns a modified alist with the new ++pairs prepended to it. The new pairs may appear in the resulting ++association list in either forward or backward order. The result of ++ ++ (pairlis '(one two) '(1 2) '((three . 3) (four . 19))) ++ ++ might be ++ ++ ((one . 1) (two . 2) (three . 3) (four . 19)) ++ ++ or ++ ++ ((two . 2) (one . 1) (three . 3) (four . 19)) ++ ++Examples:: ++.......... ++ ++ (setq keys '(1 2 3) ++ data '("one" "two" "three") ++ alist '((4 . "four"))) => ((4 . "four")) ++ (pairlis keys data) => ((3 . "three") (2 . "two") (1 . "one")) ++ (pairlis keys data alist) ++ => ((3 . "three") (2 . "two") (1 . "one") (4 . "four")) ++ alist => ((4 . "four")) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if keys and ++data are not proper lists. ++ ++See Also:: ++.......... ++ ++*note acons:: ++ ++ ++File: gcl.info, Node: rassoc, Next: get-properties, Prev: pairlis, Up: Conses Dictionary ++ ++14.2.39 rassoc, rassoc-if, rassoc-if-not [Function] ++--------------------------------------------------- ++ ++'rassoc' item alist &key key test test-not => entry ++ ++ 'rassoc-if' predicate alist &key key => entry ++ ++ 'rassoc-if-not' predicate alist &key key => entry ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ alist--an association list. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ entry--a cons that is an element of the alist, or nil. ++ ++Description:: ++............. ++ ++rassoc, rassoc-if, and rassoc-if-not return the first cons whose cdr ++satisfies the test. If no such cons is found, nil is returned. ++ ++ If nil appears in alist in place of a pair, it is ignored. ++ ++Examples:: ++.......... ++ ++ (setq alist '((1 . "one") (2 . "two") (3 . 3))) ++ => ((1 . "one") (2 . "two") (3 . 3)) ++ (rassoc 3 alist) => (3 . 3) ++ (rassoc "two" alist) => NIL ++ (rassoc "two" alist :test 'equal) => (2 . "two") ++ (rassoc 1 alist :key #'(lambda (x) (if (numberp x) (/ x 3)))) => (3 . 3) ++ (rassoc 'a '((a . b) (b . c) (c . a) (z . a))) => (C . A) ++ (rassoc-if #'stringp alist) => (1 . "one") ++ (rassoc-if-not #'vectorp alist) => (3 . 3) ++ ++See Also:: ++.......... ++ ++*note assoc:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ The function rassoc-if-not is deprecated. ++ ++ It is possible to rplaca the result of rassoc, provided that it is ++not nil, in order to "update" alist. ++ ++ The expressions ++ ++ (rassoc item list :test fn) ++ ++ and ++ ++ (find item list :test fn :key #'cdr) ++ ++ are equivalent in meaning, except when the item is nil and nil ++appears in place of a pair in the alist. See the function assoc. ++ ++ ++File: gcl.info, Node: get-properties, Next: getf, Prev: rassoc, Up: Conses Dictionary ++ ++14.2.40 get-properties [Function] ++--------------------------------- ++ ++'get-properties' plist indicator-list => indicator, value, tail ++ ++Arguments and Values:: ++...................... ++ ++plist--a property list. ++ ++ indicator-list--a proper list (of indicators). ++ ++ indicator--an object that is an element of indicator-list. ++ ++ value--an object. ++ ++ tail--a list. ++ ++Description:: ++............. ++ ++get-properties is used to look up any of several property list entries ++all at once. ++ ++ It searches the plist for the first entry whose indicator is ++identical to one of the objects in indicator-list. If such an entry is ++found, the indicator and value returned are the property indicator and ++its associated property value, and the tail returned is the tail of the ++plist that begins with the found entry (i.e., whose car is the ++indicator). If no such entry is found, the indicator, value, and tail ++are all nil. ++ ++Examples:: ++.......... ++ ++ (setq x '()) => NIL ++ (setq *indicator-list* '(prop1 prop2)) => (PROP1 PROP2) ++ (getf x 'prop1) => NIL ++ (setf (getf x 'prop1) 'val1) => VAL1 ++ (eq (getf x 'prop1) 'val1) => true ++ (get-properties x *indicator-list*) => PROP1, VAL1, (PROP1 VAL1) ++ x => (PROP1 VAL1) ++ ++See Also:: ++.......... ++ ++*note get:: , *note getf:: ++ ++ ++File: gcl.info, Node: getf, Next: remf, Prev: get-properties, Up: Conses Dictionary ++ ++14.2.41 getf [Accessor] ++----------------------- ++ ++'getf' plist indicator &optional default => value ++ ++ (setf (' getf' place indicator &optional default) new-value) ++ ++Arguments and Values:: ++...................... ++ ++plist--a property list. ++ ++ place--a place, the value of which is a property list. ++ ++ indicator--an object. ++ ++ default--an object. The default is nil. ++ ++ value--an object. ++ ++ new-value--an object. ++ ++Description:: ++............. ++ ++getf finds a property on the plist whose property indicator is identical ++to indicator, and returns its corresponding property value. ++ ++ If there are multiple properties_1 with that property indicator, getf ++uses the first such property. ++ ++ If there is no property with that property indicator, default is ++returned. ++ ++ setf of getf may be used to associate a new object with an existing ++indicator in the property list held by place, or to create a new ++assocation if none exists. ++ ++ If there are multiple properties_1 with that property indicator, setf ++of getf associates the new-value with the first such property. ++ ++ When a getf form is used as a setf place, any default which is ++supplied is evaluated according to normal left-to-right evaluation ++rules, but its value is ignored. ++ ++ setf of getf is permitted to either write the value of place itself, ++or modify of any part, car or cdr, of the list structure held by place. ++ ++Examples:: ++.......... ++ ++ (setq x '()) => NIL ++ (getf x 'prop1) => NIL ++ (getf x 'prop1 7) => 7 ++ (getf x 'prop1) => NIL ++ (setf (getf x 'prop1) 'val1) => VAL1 ++ (eq (getf x 'prop1) 'val1) => true ++ (getf x 'prop1) => VAL1 ++ (getf x 'prop1 7) => VAL1 ++ x => (PROP1 VAL1) ++ ++ ;; Examples of implementation variation permitted. ++ (setq foo (list 'a 'b 'c 'd 'e 'f)) => (A B C D E F) ++ (setq bar (cddr foo)) => (C D E F) ++ (remf foo 'c) => true ++ foo => (A B E F) ++ bar ++ => (C D E F) ++ OR=> (C) ++ OR=> (NIL) ++ OR=> (C NIL) ++ OR=> (C D) ++ ++See Also:: ++.......... ++ ++*note get:: , *note get-properties:: , *note setf:: , *note Function ++Call Forms as Places:: ++ ++Notes:: ++....... ++ ++There is no way (using getf) to distinguish an absent property from one ++whose value is default; but see get-properties. ++ ++ Note that while supplying a default argument to getf in a setf ++situation is sometimes not very interesting, it is still important ++because some macros, such as push and incf, require a place argument ++which data is both read from and written to. In such a context, if a ++default argument is to be supplied for the read situation, it must be ++syntactically valid for the write situation as well. For example, ++ ++ (let ((plist '())) ++ (incf (getf plist 'count 0)) ++ plist) => (COUNT 1) ++ ++ ++File: gcl.info, Node: remf, Next: intersection, Prev: getf, Up: Conses Dictionary ++ ++14.2.42 remf [Macro] ++-------------------- ++ ++'remf' place indicator => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++place--a place. ++ ++ indicator--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++remf removes from the property list stored in place a property_1 with a ++property indicator identical to indicator. ++ ++ If there are multiple properties_1 with the identical key, remf only ++removes the first such property. ++ ++ remf returns false if no such property was found, or true if a ++property was found. ++ ++ The property indicator and the corresponding property value are ++removed in an undefined order by destructively splicing the property ++list. ++ ++ remf is permitted to either setf place or to setf any part, car or ++cdr, of the list structure held by that place. ++ ++ For information about the evaluation of subforms of place, see *note ++Evaluation of Subforms to Places::. ++ ++Examples:: ++.......... ++ ++ (setq x (cons () ())) => (NIL) ++ (setf (getf (car x) 'prop1) 'val1) => VAL1 ++ (remf (car x) 'prop1) => true ++ (remf (car x) 'prop1) => false ++ ++Side Effects:: ++.............. ++ ++The property list stored in place is modified. ++ ++See Also:: ++.......... ++ ++*note remprop:: , *note getf:: ++ ++ ++File: gcl.info, Node: intersection, Next: adjoin, Prev: remf, Up: Conses Dictionary ++ ++14.2.43 intersection, nintersection [Function] ++---------------------------------------------- ++ ++'intersection' list-1 list-2 &key key test test-not => result-list ++ ++ 'nintersection' list-1 list-2 &key key test test-not => result-list ++ ++Arguments and Values:: ++...................... ++ ++list-1--a proper list. ++ ++ list-2--a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-list--a list. ++ ++Description:: ++............. ++ ++intersection and nintersection return a list that contains every element ++that occurs in both list-1 and list-2. ++ ++ nintersection is the destructive version of intersection. It ++performs the same operation, but may destroy list-1 using its cells to ++construct the result. ++ ++ list-2 is not destroyed. ++ ++ The intersection operation is described as follows. For all possible ++ordered pairs consisting of one element from list-1 and one element from ++list-2, :test or :test-not are used to determine whether they satisfy ++the test. The first argument to the :test or :test-not function is an ++element of list-1; the second argument is an element of list-2. If ++:test or :test-not is not supplied, eql is used. It is an error if ++:test and :test-not are supplied in the same function call. ++ ++ If :key is supplied (and not nil), it is used to extract the part to ++be tested from the list element. The argument to the :key function is ++an element of either list-1 or list-2; the :key function typically ++returns part of the supplied element. If :key is not supplied or nil, ++the list-1 and list-2 elements are used. ++ ++ For every pair that satifies the test, exactly one of the two ++elements of the pair will be put in the result. No element from either ++list appears in the result that does not satisfy the test for an element ++from the other list. If one of the lists contains duplicate elements, ++there may be duplication in the result. ++ ++ There is no guarantee that the order of elements in the result will ++reflect the ordering of the arguments in any particular way. The result ++list may share cells with, or be eq to, either list-1 or list-2 if ++appropriate. ++ ++Examples:: ++.......... ++ ++ (setq list1 (list 1 1 2 3 4 a b c "A" "B" "C" "d") ++ list2 (list 1 4 5 b c d "a" "B" "c" "D")) ++ => (1 4 5 B C D "a" "B" "c" "D") ++ (intersection list1 list2) => (C B 4 1 1) ++ (intersection list1 list2 :test 'equal) => ("B" C B 4 1 1) ++ (intersection list1 list2 :test #'equalp) => ("d" "C" "B" "A" C B 4 1 1) ++ (nintersection list1 list2) => (1 1 4 B C) ++ list1 => implementation-dependent ;e.g., (1 1 4 B C) ++ list2 => implementation-dependent ;e.g., (1 4 5 B C D "a" "B" "c" "D") ++ (setq list1 (copy-list '((1 . 2) (2 . 3) (3 . 4) (4 . 5)))) ++ => ((1 . 2) (2 . 3) (3 . 4) (4 . 5)) ++ (setq list2 (copy-list '((1 . 3) (2 . 4) (3 . 6) (4 . 8)))) ++ => ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) ++ (nintersection list1 list2 :key #'cdr) => ((2 . 3) (3 . 4)) ++ list1 => implementation-dependent ;e.g., ((1 . 2) (2 . 3) (3 . 4)) ++ list2 => implementation-dependent ;e.g., ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) ++ ++Side Effects:: ++.............. ++ ++nintersection can modify list-1, ++ ++ but not list-2. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list-1 and ++list-2 are not proper lists. ++ ++See Also:: ++.......... ++ ++*note union:: , ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ Since the nintersection side effect is not required, it should not be ++used in for-effect-only positions in portable code. ++ ++ ++File: gcl.info, Node: adjoin, Next: pushnew, Prev: intersection, Up: Conses Dictionary ++ ++14.2.44 adjoin [Function] ++------------------------- ++ ++'adjoin' item list &key key test test-not => new-list ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ list--a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ new-list--a list. ++ ++Description:: ++............. ++ ++Tests whether item is the same as an existing element of list. If the ++item is not an existing element, adjoin adds it to list (as if by cons) ++and returns the resulting list; otherwise, nothing is added and the ++original list is returned. ++ ++ The test, test-not, and key affect how it is determined whether item ++is the same as an element of list. For details, see *note Satisfying a ++Two-Argument Test::.\ifvmode\else\endgraf \ifdim \prevdepth>-1000pt ++\NIS\parskip \normalparskip\relax\fi ++ ++Examples:: ++.......... ++ ++ (setq slist '()) => NIL ++ (adjoin 'a slist) => (A) ++ slist => NIL ++ (setq slist (adjoin '(test-item 1) slist)) => ((TEST-ITEM 1)) ++ (adjoin '(test-item 1) slist) => ((TEST-ITEM 1) (TEST-ITEM 1)) ++ (adjoin '(test-item 1) slist :test 'equal) => ((TEST-ITEM 1)) ++ (adjoin '(new-test-item 1) slist :key #'cadr) => ((TEST-ITEM 1)) ++ (adjoin '(new-test-item 1) slist) => ((NEW-TEST-ITEM 1) (TEST-ITEM 1)) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list is not ++a proper list. ++ ++See Also:: ++.......... ++ ++*note pushnew:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ (adjoin item list :key fn) ++ == (if (member (fn item) list :key fn) list (cons item list)) ++ ++ ++File: gcl.info, Node: pushnew, Next: set-difference, Prev: adjoin, Up: Conses Dictionary ++ ++14.2.45 pushnew [Macro] ++----------------------- ++ ++'pushnew' item place &key key test test-not ++=> new-place-value ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ place--a place, the value of which is a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ new-place-value--a list (the new value of place). ++ ++Description:: ++............. ++ ++pushnew tests whether item is the same as any existing element of the ++list stored in place. If item is not, it is prepended to the list, and ++the new list is stored in place. ++ ++ pushnew returns the new list that is stored in place. ++ ++ Whether or not item is already a member of the list that is in place ++is determined by comparisons using :test or :test-not. The first ++argument to the :test or :test-not function is item; the second argument ++is an element of the list in place as returned by the :key function (if ++supplied). ++ ++ If :key is supplied, it is used to extract the part to be tested from ++both item and the list element, as for adjoin. ++ ++ The argument to the :key function is an element of the list stored in ++place. The :key function typically returns part part of the element of ++the list. If :key is not supplied or nil, the list element is used. ++ ++ For information about the evaluation of subforms of place, see *note ++Evaluation of Subforms to Places::. ++ ++ It is implementation-dependent whether or not pushnew actually ++executes the storing form for its place in the situation where the item ++is already a member of the list held by place. ++ ++Examples:: ++.......... ++ ++ (setq x '(a (b c) d)) => (A (B C) D) ++ (pushnew 5 (cadr x)) => (5 B C) ++ x => (A (5 B C) D) ++ (pushnew 'b (cadr x)) => (5 B C) ++ x => (A (5 B C) D) ++ (setq lst '((1) (1 2) (1 2 3))) => ((1) (1 2) (1 2 3)) ++ (pushnew '(2) lst) => ((2) (1) (1 2) (1 2 3)) ++ (pushnew '(1) lst) => ((1) (2) (1) (1 2) (1 2 3)) ++ (pushnew '(1) lst :test 'equal) => ((1) (2) (1) (1 2) (1 2 3)) ++ (pushnew '(1) lst :key #'car) => ((1) (2) (1) (1 2) (1 2 3)) ++ ++Side Effects:: ++.............. ++ ++The contents of place may be modified. ++ ++See Also:: ++.......... ++ ++*note push:: , *note adjoin:: , *note Generalized Reference:: ++ ++Notes:: ++....... ++ ++The effect of ++ (pushnew item place :test p) ++ ++ is roughly equivalent to ++ (setf place (adjoin item place :test p)) ++ ++ except that the subforms of place are evaluated only once, and item ++is evaluated before place. ++ ++ ++File: gcl.info, Node: set-difference, Next: set-exclusive-or, Prev: pushnew, Up: Conses Dictionary ++ ++14.2.46 set-difference, nset-difference [Function] ++-------------------------------------------------- ++ ++'set-difference' list-1 list-2 &key key test test-not => result-list ++ ++ 'nset-difference' list-1 list-2 &key key test test-not => result-list ++ ++Arguments and Values:: ++...................... ++ ++list-1--a proper list. ++ ++ list-2--a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-list--a list. ++ ++Description:: ++............. ++ ++set-difference returns a list of elements of list-1 that do not appear ++in list-2. ++ ++ nset-difference is the destructive version of set-difference. It may ++destroy list-1. ++ ++ For all possible ordered pairs consisting of one element from list-1 ++and one element from list-2, the :test or :test-not function is used to ++determine whether they satisfy the test. The first argument to the ++:test or :test-not function is the part of an element of list-1 that is ++returned by the :key function (if supplied); the second argument is the ++part of an element of list-2 that is returned by the :key function (if ++supplied). ++ ++ If :key is supplied, its argument is a list-1 or list-2 element. The ++:key function typically returns part of the supplied element. If :key ++is not supplied, the list-1 or list-2 element is used. ++ ++ An element of list-1 appears in the result if and only if it does not ++match any element of list-2. ++ ++ There is no guarantee that the order of elements in the result will ++reflect the ordering of the arguments in any particular way. The result ++list may share cells with, or be eq to, either of list-1 or list-2, if ++appropriate. ++ ++Examples:: ++.......... ++ ++ (setq lst1 (list "A" "b" "C" "d") ++ lst2 (list "a" "B" "C" "d")) => ("a" "B" "C" "d") ++ (set-difference lst1 lst2) => ("d" "C" "b" "A") ++ (set-difference lst1 lst2 :test 'equal) => ("b" "A") ++ (set-difference lst1 lst2 :test #'equalp) => NIL ++ (nset-difference lst1 lst2 :test #'string=) => ("A" "b") ++ (setq lst1 '(("a" . "b") ("c" . "d") ("e" . "f"))) ++ => (("a" . "b") ("c" . "d") ("e" . "f")) ++ (setq lst2 '(("c" . "a") ("e" . "b") ("d" . "a"))) ++ => (("c" . "a") ("e" . "b") ("d" . "a")) ++ (nset-difference lst1 lst2 :test #'string= :key #'cdr) ++ => (("c" . "d") ("e" . "f")) ++ lst1 => (("a" . "b") ("c" . "d") ("e" . "f")) ++ lst2 => (("c" . "a") ("e" . "b") ("d" . "a")) ++ ++ ;; Remove all flavor names that contain "c" or "w". ++ (set-difference '("strawberry" "chocolate" "banana" ++ "lemon" "pistachio" "rhubarb") ++ '(#\c #\w) ++ :test #'(lambda (s c) (find c s))) ++ => ("banana" "rhubarb" "lemon") ;One possible ordering. ++ ++Side Effects:: ++.............. ++ ++nset-difference may destroy list-1. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list-1 and ++list-2 are not proper lists. ++ ++See Also:: ++.......... ++ ++*note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ ++File: gcl.info, Node: set-exclusive-or, Next: subsetp, Prev: set-difference, Up: Conses Dictionary ++ ++14.2.47 set-exclusive-or, nset-exclusive-or [Function] ++------------------------------------------------------ ++ ++'set-exclusive-or' list-1 list-2 &key key test test-not => result-list ++ ++ 'nset-exclusive-or' list-1 list-2 &key key test test-not => ++result-list ++ ++Arguments and Values:: ++...................... ++ ++list-1--a proper list. ++ ++ list-2--a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-list--a list. ++ ++Description:: ++............. ++ ++set-exclusive-or returns a list of elements that appear in exactly one ++of list-1 and list-2. ++ ++ nset-exclusive-or is the destructive version of set-exclusive-or. ++ ++ For all possible ordered pairs consisting of one element from list-1 ++and one element from list-2, the :test or :test-not function is used to ++determine whether they satisfy the test. ++ ++ If :key is supplied, it is used to extract the part to be tested from ++the list-1 or list-2 element. The first argument to the :test or ++:test-not function is the part of an element of list-1 extracted by the ++:key function (if supplied); the second argument is the part of an ++element of list-2 extracted by the :key function (if supplied). If :key ++is not supplied or nil, the list-1 or list-2 element is used. ++ ++ The result contains precisely those elements of list-1 and list-2 ++that appear in no matching pair. ++ ++ The result list of set-exclusive-or might share storage with one of ++list-1 or list-2. ++ ++Examples:: ++.......... ++ ++ (setq lst1 (list 1 "a" "b") ++ lst2 (list 1 "A" "b")) => (1 "A" "b") ++ (set-exclusive-or lst1 lst2) => ("b" "A" "b" "a") ++ (set-exclusive-or lst1 lst2 :test #'equal) => ("A" "a") ++ (set-exclusive-or lst1 lst2 :test 'equalp) => NIL ++ (nset-exclusive-or lst1 lst2) => ("a" "b" "A" "b") ++ (setq lst1 (list (("a" . "b") ("c" . "d") ("e" . "f")))) ++ => (("a" . "b") ("c" . "d") ("e" . "f")) ++ (setq lst2 (list (("c" . "a") ("e" . "b") ("d" . "a")))) ++ => (("c" . "a") ("e" . "b") ("d" . "a")) ++ (nset-exclusive-or lst1 lst2 :test #'string= :key #'cdr) ++ => (("c" . "d") ("e" . "f") ("c" . "a") ("d" . "a")) ++ lst1 => (("a" . "b") ("c" . "d") ("e" . "f")) ++ lst2 => (("c" . "a") ("d" . "a")) ++ ++Side Effects:: ++.............. ++ ++nset-exclusive-or is permitted to modify any part, car or cdr, of the ++list structure of list-1 or list-2. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list-1 and ++list-2 are not proper lists. ++ ++See Also:: ++.......... ++ ++*note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ Since the nset-exclusive-or side effect is not required, it should ++not be used in for-effect-only positions in portable code. ++ ++ ++File: gcl.info, Node: subsetp, Next: union, Prev: set-exclusive-or, Up: Conses Dictionary ++ ++14.2.48 subsetp [Function] ++-------------------------- ++ ++'subsetp' list-1 list-2 &key key test test-not => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++list-1--a proper list. ++ ++ list-2--a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++subsetp returns true if every element of list-1 matches some element of ++list-2, and false otherwise. ++ ++ Whether a list element is the same as another list element is ++determined by the functions specified by the keyword arguments. The ++first argument to the :test or :test-not function is typically part of ++an element of list-1 extracted by the :key function; the second argument ++is typically part of an element of list-2 extracted by the :key ++function. ++ ++ The argument to the :key function is an element of either list-1 or ++list-2; the return value is part of the element of the supplied list ++element. If :key is not supplied or nil, the list-1 or list-2 element ++itself is supplied to the :test or :test-not function. ++ ++Examples:: ++.......... ++ ++ (setq cosmos '(1 "a" (1 2))) => (1 "a" (1 2)) ++ (subsetp '(1) cosmos) => true ++ (subsetp '((1 2)) cosmos) => false ++ (subsetp '((1 2)) cosmos :test 'equal) => true ++ (subsetp '(1 "A") cosmos :test #'equalp) => true ++ (subsetp '((1) (2)) '((1) (2))) => false ++ (subsetp '((1) (2)) '((1) (2)) :key #'car) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list-1 and ++list-2 are not proper lists. ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ ++File: gcl.info, Node: union, Prev: subsetp, Up: Conses Dictionary ++ ++14.2.49 union, nunion [Function] ++-------------------------------- ++ ++'union' list-1 list-2 &key key test test-not => result-list ++ ++ 'nunion' list-1 list-2 &key key test test-not => result-list ++ ++Arguments and Values:: ++...................... ++ ++list-1--a proper list. ++ ++ list-2--a proper list. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-list--a list. ++ ++Description:: ++............. ++ ++union and nunion return a list that contains every element that occurs ++in either list-1 or list-2. ++ ++ For all possible ordered pairs consisting of one element from list-1 ++and one element from list-2, :test or :test-not is used to determine ++whether they satisfy the test. The first argument to the :test or ++:test-not function is the part of the element of list-1 extracted by the ++:key function (if supplied); the second argument is the part of the ++element of list-2 extracted by the :key function (if supplied). ++ ++ The argument to the :key function is an element of list-1 or list-2; ++the return value is part of the supplied element. If :key is not ++supplied or nil, the element of list-1 or list-2 itself is supplied to ++the :test or :test-not function. ++ ++ For every matching pair, one of the two elements of the pair will be ++in the result. Any element from either list-1 or list-2 that matches no ++element of the other will appear in the result. ++ ++ If there is a duplication between list-1 and list-2, only one of the ++duplicate instances will be in the result. If either list-1 or list-2 ++has duplicate entries within it, the redundant entries might or might ++not appear in the result. ++ ++ The order of elements in the result do not have to reflect the ++ordering of list-1 or list-2 in any way. The result list may be eq to ++either list-1 or list-2 if appropriate. ++ ++Examples:: ++.......... ++ ++ (union '(a b c) '(f a d)) ++ => (A B C F D) ++ OR=> (B C F A D) ++ OR=> (D F A B C) ++ (union '((x 5) (y 6)) '((z 2) (x 4)) :key #'car) ++ => ((X 5) (Y 6) (Z 2)) ++ OR=> ((X 4) (Y 6) (Z 2)) ++ ++ (setq lst1 (list 1 2 '(1 2) "a" "b") ++ lst2 (list 2 3 '(2 3) "B" "C")) ++ => (2 3 (2 3) "B" "C") ++ (nunion lst1 lst2) ++ => (1 (1 2) "a" "b" 2 3 (2 3) "B" "C") ++ OR=> (1 2 (1 2) "a" "b" "C" "B" (2 3) 3) ++ ++Side Effects:: ++.............. ++ ++nunion is permitted to modify any part, car or cdr, of the list ++structure of list-1 or list-2. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if list-1 and ++list-2 are not proper lists. ++ ++See Also:: ++.......... ++ ++*note intersection:: , ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not parameter is deprecated. ++ ++ Since the nunion side effect is not required, it should not be used ++in for-effect-only positions in portable code. ++ ++ ++File: gcl.info, Node: Arrays, Next: Strings, Prev: Conses, Up: Top ++ ++15 Arrays ++********* ++ ++* Menu: ++ ++* Array Concepts:: ++* Arrays Dictionary:: ++ ++ ++File: gcl.info, Node: Array Concepts, Next: Arrays Dictionary, Prev: Arrays, Up: Arrays ++ ++15.1 Array Concepts ++=================== ++ ++* Menu: ++ ++* Array Elements:: ++* Specialized Arrays:: ++ ++ ++File: gcl.info, Node: Array Elements, Next: Specialized Arrays, Prev: Array Concepts, Up: Array Concepts ++ ++15.1.1 Array Elements ++--------------------- ++ ++An array contains a set of objects called elements that can be ++referenced individually according to a rectilinear coordinate system. ++ ++* Menu: ++ ++* Array Indices:: ++* Array Dimensions:: ++* Implementation Limits on Individual Array Dimensions:: ++* Array Rank:: ++* Vectors:: ++* Fill Pointers:: ++* Multidimensional Arrays:: ++* Storage Layout for Multidimensional Arrays:: ++* Implementation Limits on Array Rank:: ++ ++ ++File: gcl.info, Node: Array Indices, Next: Array Dimensions, Prev: Array Elements, Up: Array Elements ++ ++15.1.1.1 Array Indices ++...................... ++ ++An array element is referred to by a (possibly empty) series of indices. ++The length of the series must equal the rank of the array. ++ ++ Each index must be a non-negative fixnum ++ ++ less than the corresponding array dimension. Array indexing is ++zero-origin. ++ ++ ++File: gcl.info, Node: Array Dimensions, Next: Implementation Limits on Individual Array Dimensions, Prev: Array Indices, Up: Array Elements ++ ++15.1.1.2 Array Dimensions ++......................... ++ ++An axis of an array is called a dimension . ++ ++ Each dimension is a non-negative ++ ++ fixnum; ++ ++ if any dimension of an array is zero, the array has no elements. It ++is permissible for a dimension to be zero, in which case the array has ++no elements, and any attempt to access an element is an error. However, ++other properties of the array, such as the dimensions themselves, may be ++used. ++ ++ ++File: gcl.info, Node: Implementation Limits on Individual Array Dimensions, Next: Array Rank, Prev: Array Dimensions, Up: Array Elements ++ ++15.1.1.3 Implementation Limits on Individual Array Dimensions ++............................................................. ++ ++An implementation may impose a limit on dimensions of an array, but ++there is a minimum requirement on that limit. See the variable ++array-dimension-limit. ++ ++ ++File: gcl.info, Node: Array Rank, Next: Vectors, Prev: Implementation Limits on Individual Array Dimensions, Up: Array Elements ++ ++15.1.1.4 Array Rank ++................... ++ ++An array can have any number of dimensions (including zero). The number ++of dimensions is called the rank . ++ ++ If the rank of an array is zero then the array is said to have no ++dimensions, and the product of the dimensions (see array-total-size) is ++then 1; a zero-rank array therefore has a single element. ++ ++ ++File: gcl.info, Node: Vectors, Next: Fill Pointers, Prev: Array Rank, Up: Array Elements ++ ++15.1.1.5 Vectors ++................ ++ ++An array of rank one (i.e., a one-dimensional array) is called a vector ++. ++ ++ ++File: gcl.info, Node: Fill Pointers, Next: Multidimensional Arrays, Prev: Vectors, Up: Array Elements ++ ++15.1.1.6 Fill Pointers ++...................... ++ ++A fill pointer is a non-negative integer no larger than the total number ++of elements in a vector. Not all vectors have fill pointers. See the ++functions make-array and adjust-array. ++ ++ An element of a vector is said to be active if it has an index that ++is greater than or equal to zero, but less than the fill pointer (if ++any). For an array that has no fill pointer, all elements are ++considered active. ++ ++ Only vectors may have fill pointers; multidimensional arrays may not. ++A multidimensional array that is displaced to a vector that has a fill ++pointer can be created. ++ ++ ++File: gcl.info, Node: Multidimensional Arrays, Next: Storage Layout for Multidimensional Arrays, Prev: Fill Pointers, Up: Array Elements ++ ++15.1.1.7 Multidimensional Arrays ++................................ ++ ++ ++File: gcl.info, Node: Storage Layout for Multidimensional Arrays, Next: Implementation Limits on Array Rank, Prev: Multidimensional Arrays, Up: Array Elements ++ ++15.1.1.8 Storage Layout for Multidimensional Arrays ++................................................... ++ ++Multidimensional arrays store their components in row-major order; that ++is, internally a multidimensional array is stored as a one-dimensional ++array, with the multidimensional index sets ordered lexicographically, ++last index varying fastest. ++ ++ ++File: gcl.info, Node: Implementation Limits on Array Rank, Prev: Storage Layout for Multidimensional Arrays, Up: Array Elements ++ ++15.1.1.9 Implementation Limits on Array Rank ++............................................ ++ ++An implementation may impose a limit on the rank of an array, but there ++is a minimum requirement on that limit. See the variable ++array-rank-limit. ++ ++ ++File: gcl.info, Node: Specialized Arrays, Prev: Array Elements, Up: Array Concepts ++ ++15.1.2 Specialized Arrays ++------------------------- ++ ++An array can be a general array, meaning each element may be any object, ++or it may be a specialized array, meaning that each element must be of a ++restricted type. ++ ++ The phrasing "an array specialized to type <>" is sometimes ++used to emphasize the element type of an array. This phrasing is ++tolerated even when the <> is t, even though an array specialized ++to type t is a general array, not a specialized array. ++ ++ Figure 15-1 lists some defined names that are applicable to array ++creation, access, and information operations. ++ ++ adjust-array array-in-bounds-p svref ++ adjustable-array-p array-rank upgraded-array-element-type ++ aref array-rank-limit upgraded-complex-part-type ++ array-dimension array-row-major-index vector ++ array-dimension-limit array-total-size vector-pop ++ array-dimensions array-total-size-limit vector-push ++ array-element-type fill-pointer vector-push-extend ++ array-has-fill-pointer-p make-array ++ ++ Figure 15-1: General Purpose Array-Related Defined Names ++ ++ ++* Menu: ++ ++* Array Upgrading:: ++* Required Kinds of Specialized Arrays:: ++ ++ ++File: gcl.info, Node: Array Upgrading, Next: Required Kinds of Specialized Arrays, Prev: Specialized Arrays, Up: Specialized Arrays ++ ++15.1.2.1 Array Upgrading ++........................ ++ ++The upgraded array element type of a type T_1 is a type T_2 that is a ++supertype of T_1 and that is used instead of T_1 whenever T_1 is used as ++an array element type for object creation or type discrimination. ++ ++ During creation of an array, the element type that was requested is ++called the expressed array element type . The upgraded array element ++type of the expressed array element type becomes the actual array ++element type of the array that is created. ++ ++ Type upgrading implies a movement upwards in the type hierarchy ++lattice. A type is always a subtype of its upgraded array element type. ++Also, if a type T_x is a subtype of another type T_y, then the upgraded ++array element type of T_x must be a subtype of the upgraded array ++element type of T_y. Two disjoint types can be upgraded to the same ++type. ++ ++ The upgraded array element type T_2 of a type T_1 is a function only ++of T_1 itself; that is, it is independent of any other property of the ++array for which T_2 will be used, such as rank, adjustability, fill ++pointers, or displacement. The function upgraded-array-element-type can ++be used by conforming programs to predict how the implementation will ++upgrade a given type. ++ ++ ++File: gcl.info, Node: Required Kinds of Specialized Arrays, Prev: Array Upgrading, Up: Specialized Arrays ++ ++15.1.2.2 Required Kinds of Specialized Arrays ++............................................. ++ ++Vectors whose elements are restricted to type ++ ++ character or a subtype of character ++ ++ are called strings . Strings are of type string. Figure 15-2 lists ++some defined names related to strings. ++ ++ Strings are specialized arrays and might logically have been included ++in this chapter. However, for purposes of readability most information ++about strings does not appear in this chapter; see instead *note ++Strings::. ++ ++ char string-equal string-upcase ++ make-string string-greaterp string/= ++ nstring-capitalize string-left-trim string< ++ nstring-downcase string-lessp string<= ++ nstring-upcase string-not-equal string= ++ schar string-not-greaterp string> ++ string string-not-lessp string>= ++ string-capitalize string-right-trim ++ string-downcase string-trim ++ ++ Figure 15-2: Operators that Manipulate Strings ++ ++ ++ Vectors whose elements are restricted to type bit are called bit ++vectors . Bit vectors are of type bit-vector. Figure 15-3 lists some ++defined names for operations on bit arrays. ++ ++ bit bit-ior bit-orc2 ++ bit-and bit-nand bit-xor ++ bit-andc1 bit-nor sbit ++ bit-andc2 bit-not ++ bit-eqv bit-orc1 ++ ++ Figure 15-3: Operators that Manipulate Bit Arrays ++ ++ ++ ++File: gcl.info, Node: Arrays Dictionary, Prev: Array Concepts, Up: Arrays ++ ++15.2 Arrays Dictionary ++====================== ++ ++* Menu: ++ ++* array:: ++* simple-array:: ++* vector (System Class):: ++* simple-vector:: ++* bit-vector:: ++* simple-bit-vector:: ++* make-array:: ++* adjust-array:: ++* adjustable-array-p:: ++* aref:: ++* array-dimension:: ++* array-dimensions:: ++* array-element-type:: ++* array-has-fill-pointer-p:: ++* array-displacement:: ++* array-in-bounds-p:: ++* array-rank:: ++* array-row-major-index:: ++* array-total-size:: ++* arrayp:: ++* fill-pointer:: ++* row-major-aref:: ++* upgraded-array-element-type:: ++* array-dimension-limit:: ++* array-rank-limit:: ++* array-total-size-limit:: ++* simple-vector-p:: ++* svref:: ++* vector:: ++* vector-pop:: ++* vector-push:: ++* vectorp:: ++* bit (Array):: ++* bit-and:: ++* bit-vector-p:: ++* simple-bit-vector-p:: ++ ++ ++File: gcl.info, Node: array, Next: simple-array, Prev: Arrays Dictionary, Up: Arrays Dictionary ++ ++15.2.1 array [System Class] ++--------------------------- ++ ++Class Precedence List:: ++....................... ++ ++array, t ++ ++Description:: ++............. ++ ++An array contains objects arranged according to a Cartesian coordinate ++system. An array provides mappings from a set of ++ ++ fixnums ++ ++ \left{i_0,i_1,\dots,i_{r-1}\right} to corresponding elements of the ++array, where 0 \le i_j < d_j, r is the rank of the array, and d_j is the ++size of dimension j of the array. ++ ++ When an array is created, the program requesting its creation may ++declare that all elements are of a particular type, called the expressed ++array element type. The implementation is permitted to upgrade this ++type in order to produce the actual array element type, which is the ++element type for the array is actually specialized. See the function ++upgraded-array-element-type. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('array'{[{element-type | *} [dimension-spec]]}) ++ ++ dimension-spec ::=rank | * | ({dimension | *}*) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++dimension--a valid array dimension. ++ ++ element-type--a type specifier. ++ ++ rank--a non-negative fixnum. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of arrays whose element type, rank, and dimensions ++match any given element-type, rank, and dimensions. Specifically: ++ ++ If element-type is the symbol *, arrays are not excluded on the basis ++of their element type. Otherwise, only those arrays are included whose ++actual array element type ++ ++ is the result of upgrading element-type; see *note Array Upgrading::. ++ ++ If the dimension-spec is a rank, the set includes only those arrays ++having that rank. If the dimension-spec is a list of dimensions, the ++set includes only those arrays having a rank given by the length of the ++dimensions, and having the indicated dimensions; in this case, * matches ++any value for the corresponding dimension. If the dimension-spec is the ++symbol *, the set is not restricted on the basis of rank or dimension. ++ ++See Also:: ++.......... ++ ++*print-array*, *note aref:: , *note make-array:: , vector, *note ++Sharpsign A::, *note Printing Other Arrays:: ++ ++Notes:: ++....... ++ ++Note that the type (array t) is a proper subtype of the type (array *). ++The reason is that the type (array t) is the set of arrays that can hold ++any object (the elements are of type t, which includes all objects). On ++the other hand, the type (array *) is the set of all arrays whatsoever, ++including for example arrays that can hold only characters. The type ++(array character) is not a subtype of the type (array t); the two sets ++are disjoint because the type (array character) is not the set of all ++arrays that can hold characters, but rather the set of arrays that are ++specialized to hold precisely characters and no other objects. ++ ++ ++File: gcl.info, Node: simple-array, Next: vector (System Class), Prev: array, Up: Arrays Dictionary ++ ++15.2.2 simple-array [Type] ++-------------------------- ++ ++Supertypes:: ++............ ++ ++simple-array, array, t ++ ++Description:: ++............. ++ ++The type of an array that is not displaced to another array, has no fill ++pointer, and is not expressly adjustable is a subtype of type ++simple-array. The concept of a simple array exists to allow the ++implementation to use a specialized representation and to allow the user ++to declare that certain values will always be simple arrays. ++ ++ The types simple-vector, simple-string, and simple-bit-vector are ++disjoint subtypes of type simple-array, for they respectively mean ++(simple-array t (*)), the union of all (simple-array c (*)) for any c ++being a subtype of type character, and (simple-array bit (*)). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('simple-array'{[{element-type | *} [dimension-spec]]}) ++ ++ dimension-spec ::=rank | * | ({dimension | *}*) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++dimension--a valid array dimension. ++ ++ element-type--a type specifier. ++ ++ rank--a non-negative fixnum. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This compound type specifier is treated exactly as the corresponding ++compound type specifier for type array would be treated, except that the ++set is further constrained to include only simple arrays. ++ ++Notes:: ++....... ++ ++It is implementation-dependent whether displaced arrays, vectors with ++fill pointers, or arrays that are actually adjustable are simple arrays. ++ ++ (simple-array *) refers to all simple arrays regardless of element ++type, (simple-array type-specifier) refers only to those simple arrays ++that can result from giving type-specifier as the :element-type argument ++to make-array. ++ ++ ++File: gcl.info, Node: vector (System Class), Next: simple-vector, Prev: simple-array, Up: Arrays Dictionary ++ ++15.2.3 vector [System Class] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++vector, array, sequence, t ++ ++Description:: ++............. ++ ++Any one-dimensional array is a vector. ++ ++ The type vector is a subtype of type array; for all types x, (vector ++x) is the same as (array x (*)). ++ ++ The type (vector t), the type string, and the type bit-vector are ++disjoint subtypes of type vector. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('vector'{[{element-type | *} [{size | *}]]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum. ++ ++ element-type--a type specifier. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the set of specialized vectors whose element type and ++dimension match the specified values. Specifically: ++ ++ If element-type is the symbol *, vectors are not excluded on the ++basis of their element type. Otherwise, only those vectors are included ++whose actual array element type ++ ++ is the result of upgrading element-type; see *note Array Upgrading::. ++ ++ If a size is specified, the set includes only those vectors whose ++only dimension is size. If the symbol * is specified instead of a size, ++the set is not restricted on the basis of dimension. ++ ++See Also:: ++.......... ++ ++*note Required Kinds of Specialized Arrays::, *note Sharpsign ++Left-Parenthesis::, *note Printing Other Vectors::, *note Sharpsign A:: ++ ++Notes:: ++....... ++ ++The type (vector e s) is equivalent to the type (array e (s)). ++ ++ The type (vector bit) has the name bit-vector. ++ ++ The union of all types (vector C), where C is any subtype of ++character, has the name string. ++ ++ (vector *) refers to all vectors regardless of element type, (vector ++type-specifier) refers only to those vectors that can result from giving ++type-specifier as the :element-type argument to make-array. ++ ++ ++File: gcl.info, Node: simple-vector, Next: bit-vector, Prev: vector (System Class), Up: Arrays Dictionary ++ ++15.2.4 simple-vector [Type] ++--------------------------- ++ ++Supertypes:: ++............ ++ ++simple-vector, vector, simple-array, array, sequence, t ++ ++Description:: ++............. ++ ++The type of a vector that is not displaced to another array, has no fill ++pointer, is not expressly adjustable and is able to hold elements of any ++type is a subtype of type simple-vector. ++ ++ The type simple-vector is a subtype of type vector, and is a subtype ++of type (vector t). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Specializing. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('simple-vector'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. The default is the symbol ++*. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This is the same as (simple-array t (size)). ++ ++ ++File: gcl.info, Node: bit-vector, Next: simple-bit-vector, Prev: simple-vector, Up: Arrays Dictionary ++ ++15.2.5 bit-vector [System Class] ++-------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++bit-vector, vector, array, sequence, t ++ ++Description:: ++............. ++ ++A bit vector is a vector the element type of which is bit. ++ ++ The type bit-vector is a subtype of type vector, for bit-vector means ++(vector bit). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('bit-vector'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the same type as the type (array bit (size)); that is, the ++set of bit vectors of size size. ++ ++See Also:: ++.......... ++ ++*note Sharpsign Asterisk::, *note Printing Bit Vectors::, *note Required ++Kinds of Specialized Arrays:: ++ ++ ++File: gcl.info, Node: simple-bit-vector, Next: make-array, Prev: bit-vector, Up: Arrays Dictionary ++ ++15.2.6 simple-bit-vector [Type] ++------------------------------- ++ ++Supertypes:: ++............ ++ ++simple-bit-vector, bit-vector, vector, simple-array, array, sequence, t ++ ++Description:: ++............. ++ ++The type of a bit vector that is not displaced to another array, has no ++fill pointer, and is not expressly adjustable is a subtype of type ++simple-bit-vector. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('simple-bit-vector'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. The default is the symbol ++*. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the same type as the type (simple-array bit (size)); that ++is, the set of simple bit vectors of size size. ++ ++ ++File: gcl.info, Node: make-array, Next: adjust-array, Prev: simple-bit-vector, Up: Arrays Dictionary ++ ++15.2.7 make-array [Function] ++---------------------------- ++ ++'make-array' dimensions &key element-type initial-element ++initial-contents adjustable fill-pointer displaced-to ++displaced-index-offset ++=> new-array ++ ++Arguments and Values:: ++...................... ++ ++dimensions--a designator for a list of valid array dimensions. ++ ++ element-type--a type specifier. The default is t. ++ ++ initial-element--an object. ++ ++ initial-contents--an object. ++ ++ adjustable--a generalized boolean. The default is nil. ++ ++ fill-pointer--a valid fill pointer for the array to be created, or t ++or nil. The default is nil. ++ ++ displaced-to--an array or nil. The default is nil. This option must ++not be supplied if either initial-element or initial-contents is ++supplied. ++ ++ displaced-index-offset--a valid array row-major index for ++displaced-to. The default is 0. This option must not be supplied ++unless a non-nil displaced-to is supplied. ++ ++ new-array--an array. ++ ++Description:: ++............. ++ ++Creates and returns an array constructed of the most specialized type ++that can accommodate elements of type given by element-type. If ++dimensions is nil then a zero-dimensional array is created. ++ ++ Dimensions represents the dimensionality of the new array. ++ ++ element-type indicates the type of the elements intended to be stored ++in the new-array. The new-array can actually store any objects of the ++type which results from upgrading element-type; see *note Array ++Upgrading::. ++ ++ If initial-element is supplied, it is used to initialize each element ++of new-array. If initial-element is supplied, it must be of the type ++given by element-type. initial-element cannot be supplied if either the ++:initial-contents option is supplied or displaced-to is non-nil. If ++initial-element is not supplied, ++ ++ the consequences of later reading an uninitialized element of ++new-array are undefined ++ ++ unless either initial-contents is supplied or displaced-to is ++non-nil. ++ ++ initial-contents is used to initialize the contents of array. For ++example: ++ ++ (make-array '(4 2 3) :initial-contents ++ '(((a b c) (1 2 3)) ++ ((d e f) (3 1 2)) ++ ((g h i) (2 3 1)) ++ ((j k l) (0 0 0)))) ++ ++ initial-contents is composed of a nested structure of sequences. The ++numbers of levels in the structure must equal the rank of array. Each ++leaf of the nested structure must be of the type given by element-type. ++If array is zero-dimensional, then initial-contents specifies the single ++element. Otherwise, initial-contents must be a sequence whose length is ++equal to the first dimension; each element must be a nested structure ++for an array whose dimensions are the remaining dimensions, and so on. ++Initial-contents cannot be supplied if either initial-element is ++supplied or displaced-to is non-nil. If initial-contents is not ++supplied, ++ ++ the consequences of later reading an uninitialized element of ++new-array are undefined ++ ++ unless either initial-element is supplied or displaced-to is non-nil. ++ ++ If adjustable is non-nil, the array is expressly adjustable (and so ++actually adjustable); otherwise, the array is not expressly adjustable ++(and it is implementation-dependent whether the array is actually ++adjustable). ++ ++ If fill-pointer is non-nil, the array must be one-dimensional; that ++is, the array must be a vector. If fill-pointer is t, the length of the ++vector is used to initialize the fill pointer. If fill-pointer is an ++integer, it becomes the initial fill pointer for the vector. ++ ++ If displaced-to is non-nil, make-array will create a displaced array ++and displaced-to is the target of that displaced array. In that case, ++the consequences are undefined if the actual array element type of ++displaced-to is not type equivalent to the actual array element type of ++the array being created. If displaced-to is nil, the array is not a ++displaced array. ++ ++ The displaced-index-offset is made to be the index offset of the ++array. When an array A is given as the :displaced-to argument to ++make-array when creating array B, then array B is said to be displaced ++to array A. The total number of elements in an array, called the total ++size of the array, is calculated as the product of all the dimensions. ++It is required that the total size of A be no smaller than the sum of ++the total size of B plus the offset n supplied by the ++displaced-index-offset. The effect of displacing is that array B does ++not have any elements of its own, but instead maps accesses to itself ++into accesses to array A. The mapping treats both arrays as if they were ++one-dimensional by taking the elements in row-major order, and then maps ++an access to element k of array B to an access to element k+n of array ++A. ++ ++ If make-array is called with adjustable, fill-pointer, and ++displaced-to each nil, then the result is a simple array. ++ ++ If make-array is called with one or more of adjustable, fill-pointer, ++or displaced-to being true, whether the resulting array is a simple ++array is implementation-dependent. ++ ++ When an array A is given as the :displaced-to argument to make-array ++when creating array B, then array B is said to be displaced to array A. ++The total number of elements in an array, called the total size of the ++array, is calculated as the product of all the dimensions. The ++consequences are unspecified if the total size of A is smaller than the ++sum of the total size of B plus the offset n supplied by the ++displaced-index-offset. The effect of displacing is that array B does ++not have any elements of its own, but instead maps accesses to itself ++into accesses to array A. The mapping treats both arrays as if they were ++one-dimensional by taking the elements in row-major order, and then maps ++an access to element k of array B to an access to element k+n of array ++A. ++ ++Examples:: ++.......... ++ ++ ++ (make-array 5) ;; Creates a one-dimensional array of five elements. ++ (make-array '(3 4) :element-type '(mod 16)) ;; Creates a ++ ;;two-dimensional array, 3 by 4, with four-bit elements. ++ (make-array 5 :element-type 'single-float) ;; Creates an array of single-floats. ++ ++ (make-array nil :initial-element nil) => #0ANIL ++ (make-array 4 :initial-element nil) => #(NIL NIL NIL NIL) ++ (make-array '(2 4) ++ :element-type '(unsigned-byte 2) ++ :initial-contents '((0 1 2 3) (3 2 1 0))) ++ => #2A((0 1 2 3) (3 2 1 0)) ++ (make-array 6 ++ :element-type 'character ++ :initial-element #\a ++ :fill-pointer 3) => "aaa" ++ ++ The following is an example of making a displaced array. ++ ++ (setq a (make-array '(4 3))) ++ => # ++ (dotimes (i 4) ++ (dotimes (j 3) ++ (setf (aref a i j) (list i 'x j '= (* i j))))) ++ => NIL ++ (setq b (make-array 8 :displaced-to a ++ :displaced-index-offset 2)) ++ => # ++ (dotimes (i 8) ++ (print (list i (aref b i)))) ++ |> (0 (0 X 2 = 0)) ++ |> (1 (1 X 0 = 0)) ++ |> (2 (1 X 1 = 1)) ++ |> (3 (1 X 2 = 2)) ++ |> (4 (2 X 0 = 0)) ++ |> (5 (2 X 1 = 2)) ++ |> (6 (2 X 2 = 4)) ++ |> (7 (3 X 0 = 0)) ++ => NIL ++ ++ The last example depends on the fact that arrays are, in effect, ++stored in row-major order. ++ ++ (setq a1 (make-array 50)) ++ => # ++ (setq b1 (make-array 20 :displaced-to a1 :displaced-index-offset 10)) ++ => # ++ (length b1) => 20 ++ ++ (setq a2 (make-array 50 :fill-pointer 10)) ++ => # ++ (setq b2 (make-array 20 :displaced-to a2 :displaced-index-offset 10)) ++ => # ++ (length a2) => 10 ++ (length b2) => 20 ++ ++ (setq a3 (make-array 50 :fill-pointer 10)) ++ => # ++ (setq b3 (make-array 20 :displaced-to a3 :displaced-index-offset 10 ++ :fill-pointer 5)) ++ => # ++ (length a3) => 10 ++ (length b3) => 5 ++ ++See Also:: ++.......... ++ ++*note adjustable-array-p:: , *note aref:: , *note arrayp:: , *note ++array-element-type:: , *note array-rank-limit:: , *note ++array-dimension-limit:: , *note fill-pointer:: , *note ++upgraded-array-element-type:: ++ ++Notes:: ++....... ++ ++There is no specified way to create an array for which ++adjustable-array-p definitely returns false. There is no specified way ++to create an array that is not a simple array. ++ ++ ++File: gcl.info, Node: adjust-array, Next: adjustable-array-p, Prev: make-array, Up: Arrays Dictionary ++ ++15.2.8 adjust-array [Function] ++------------------------------ ++ ++'adjust-array' array new-dimensions &key element-type initial-element ++initial-contents fill-pointer displaced-to displaced-index-offset ++=> adjusted-array ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ new-dimensions--a valid array dimension or a list of valid array ++dimensions. ++ ++ element-type--a type specifier. ++ ++ initial-element--an object. Initial-element must not be supplied if ++either initial-contents or displaced-to is supplied. ++ ++ initial-contents--an object. If array has rank greater than zero, ++then initial-contents is composed of nested sequences, the depth of ++which must equal the rank of array. Otherwise, array is ++zero-dimensional and initial-contents supplies the single element. ++initial-contents must not be supplied if either initial-element or ++displaced-to is given. ++ ++ fill-pointer--a valid fill pointer for the array to be created, or t, ++or nil. The default is nil. ++ ++ displaced-to--an array or nil. initial-elements and initial-contents ++must not be supplied if displaced-to is supplied. ++ ++ displaced-index-offset--an object of type (fixnum 0 n) where n is ++(array-total-size displaced-to). displaced-index-offset may be supplied ++only if displaced-to is supplied. ++ ++ adjusted-array--an array. ++ ++Description:: ++............. ++ ++adjust-array changes the dimensions or elements of array. The result is ++an array of the same type and rank as array, that is either the modified ++array, or a newly created array to which array can be displaced, and ++that has the given new-dimensions. ++ ++ New-dimensions specify the size of each dimension of array. ++ ++ Element-type specifies the type of the elements of the resulting ++array. If element-type is supplied, the consequences are unspecified if ++the upgraded array element type of element-type is not the same as the ++actual array element type of array. ++ ++ If initial-contents is supplied, it is treated as for make-array. In ++this case none of the original contents of array appears in the ++resulting array. ++ ++ If fill-pointer is an integer, it becomes the fill pointer for the ++resulting array. If fill-pointer is the symbol t, it indicates that the ++size of the resulting array should be used as the fill pointer. If ++fill-pointer is nil, it indicates that the fill pointer should be left ++as it is. ++ ++ If displaced-to non-nil, a displaced array is created. The resulting ++array shares its contents with the array given by displaced-to. The ++resulting array cannot contain more elements than the array it is ++displaced to. If displaced-to is not supplied or nil, the resulting ++array is not a displaced array. If array A is created displaced to ++array B and subsequently array B is given to adjust-array, array A will ++still be displaced to array B. Although array might be a displaced ++array, the resulting array is not a displaced array unless displaced-to ++is supplied and not nil. ++ ++ The interaction between adjust-array and displaced arrays is as ++follows given three arrays, A, B, and~C: ++ ++A is not displaced before or after the call ++ (adjust-array A ...) ++ ++ The dimensions of A are altered, and the contents rearranged as ++ appropriate. Additional elements of A are taken from ++ initial-element. The use of initial-contents causes all old ++ contents to be discarded. ++ ++A is not displaced before, but is displaced to ++ C after the call ++ (adjust-array A ... :displaced-to C) ++ ++ None of the original contents of A appears in A afterwards; A now ++ contains the contents of C, without any rearrangement of C. ++ ++A is displaced to B ++ before the call, and is displaced to C after the call ++ (adjust-array A ... :displaced-to B) ++ (adjust-array A ... :displaced-to C) ++ ++ B and C might be the same. The contents of B do not appear in A ++ afterward unless such contents also happen to be in C If ++ displaced-index-offset is not supplied in the adjust-array call, it ++ defaults to zero; the old offset into B is not retained. ++ ++A is displaced to B before the call, but not displaced ++ afterward. ++ (adjust-array A ... :displaced-to B) ++ (adjust-array A ... :displaced-to nil) ++ ++ A gets a new "data region," and contents of B are copied into it as ++ appropriate to maintain the existing old contents; additional ++ elements of A are taken from initial-element if supplied. However, ++ the use of initial-contents causes all old contents to be ++ discarded. ++ ++ If displaced-index-offset is supplied, it specifies the offset of the ++resulting array from the beginning of the array that it is displaced to. ++If displaced-index-offset is not supplied, the offset is~0. The size of ++the resulting array plus the offset value cannot exceed the size of the ++array that it is displaced to. ++ ++ If only new-dimensions and an initial-element argument are supplied, ++those elements of array that are still in bounds appear in the resulting ++array. The elements of the resulting array that are not in the bounds ++of array are initialized to initial-element; if initial-element is not ++provided, ++ ++ the consequences of later reading any such new element of new-array ++before it has been initialized are undefined. ++ ++ If initial-contents or displaced-to is supplied, then none of the ++original contents of array appears in the new array. ++ ++ The consequences are unspecified if array is adjusted to a size ++smaller than its fill pointer without supplying the fill-pointer ++argument so that its fill-pointer is properly adjusted in the process. ++ ++ If A is displaced to B, the consequences are unspecified if B is ++adjusted in such a way that it no longer has enough elements to satisfy ++A. ++ ++ If adjust-array is applied to an array that is actually adjustable, ++the array returned is identical to array. If the array returned by ++adjust-array is distinct from array, then the argument array is ++unchanged. ++ ++ Note that if an array A is displaced to another array B, and B is ++displaced to another array C, and B is altered by adjust-array, A must ++now refer to the adjust contents of B. This means that an implementation ++cannot collapse the chain to make A refer to C directly and forget that ++the chain of reference passes through B. However, caching techniques are ++permitted as long as they preserve the semantics specified here. ++ ++Examples:: ++.......... ++ ++ (adjustable-array-p ++ (setq ada (adjust-array ++ (make-array '(2 3) ++ :adjustable t ++ :initial-contents '((a b c) (1 2 3))) ++ '(4 6)))) => T ++ (array-dimensions ada) => (4 6) ++ (aref ada 1 1) => 2 ++ (setq beta (make-array '(2 3) :adjustable t)) ++ => #2A((NIL NIL NIL) (NIL NIL NIL)) ++ (adjust-array beta '(4 6) :displaced-to ada) ++ => #2A((A B C NIL NIL NIL) ++ (1 2 3 NIL NIL NIL) ++ (NIL NIL NIL NIL NIL NIL) ++ (NIL NIL NIL NIL NIL NIL)) ++ (array-dimensions beta) => (4 6) ++ (aref beta 1 1) => 2 ++ ++ Suppose that the 4-by-4 array in m looks like this: ++ ++ #2A(( alpha beta gamma delta ) ++ ( epsilon zeta eta theta ) ++ ( iota kappa lambda mu ) ++ ( nu xi omicron pi )) ++ ++ Then the result of ++ ++ (adjust-array m '(3 5) :initial-element 'baz) ++ ++ is a 3-by-5 array with contents ++ ++ #2A(( alpha beta gamma delta baz ) ++ ( epsilon zeta eta theta baz ) ++ ( iota kappa lambda mu baz )) ++ ++Exceptional Situations:: ++........................ ++ ++An error of type error is signaled if fill-pointer is supplied and ++non-nil but array has no fill pointer. ++ ++See Also:: ++.......... ++ ++*note adjustable-array-p:: , *note make-array:: , *note ++array-dimension-limit:: , *note array-total-size-limit:: , array ++ ++ ++File: gcl.info, Node: adjustable-array-p, Next: aref, Prev: adjust-array, Up: Arrays Dictionary ++ ++15.2.9 adjustable-array-p [Function] ++------------------------------------ ++ ++'adjustable-array-p' array => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if and only if adjust-array could return a value which is ++identical to array when given that array as its first argument. ++ ++Examples:: ++.......... ++ ++ (adjustable-array-p ++ (make-array 5 ++ :element-type 'character ++ :adjustable t ++ :fill-pointer 3)) => true ++ (adjustable-array-p (make-array 4)) => implementation-dependent ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its argument is not an ++array. ++ ++See Also:: ++.......... ++ ++*note adjust-array:: , *note make-array:: ++ ++ ++File: gcl.info, Node: aref, Next: array-dimension, Prev: adjustable-array-p, Up: Arrays Dictionary ++ ++15.2.10 aref [Accessor] ++----------------------- ++ ++'aref' array &rest subscripts => element ++ ++ (setf (' aref' array &rest subscripts) new-element) ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ subscripts--a list of valid array indices for the array. ++ ++ element, new-element--an object. ++ ++Description:: ++............. ++ ++Accesses the array element specified by the subscripts. If no ++subscripts are supplied and array is zero rank, aref accesses the sole ++element of array. ++ ++ aref ignores fill pointers. It is permissible to use aref to access ++any array element, whether active or not. ++ ++Examples:: ++.......... ++ ++If the variable foo names a 3-by-5 array, then the first index could be ++0, 1, or 2, and then second index could be 0, 1, 2, 3, or 4. The array ++elements can be referred to by using the function aref; for example, ++(aref foo 2 1) refers to element (2, 1) of the array. ++ ++ (aref (setq alpha (make-array 4)) 3) => implementation-dependent ++ (setf (aref alpha 3) 'sirens) => SIRENS ++ (aref alpha 3) => SIRENS ++ (aref (setq beta (make-array '(2 4) ++ :element-type '(unsigned-byte 2) ++ :initial-contents '((0 1 2 3) (3 2 1 0)))) ++ 1 2) => 1 ++ (setq gamma '(0 2)) ++ (apply #'aref beta gamma) => 2 ++ (setf (apply #'aref beta gamma) 3) => 3 ++ (apply #'aref beta gamma) => 3 ++ (aref beta 0 2) => 3 ++ ++See Also:: ++.......... ++ ++*note bit (Array):: , *note char:: , *note elt:: , *note ++row-major-aref:: , *note svref:: , ++ ++ *note Compiler Terminology:: ++ ++ ++File: gcl.info, Node: array-dimension, Next: array-dimensions, Prev: aref, Up: Arrays Dictionary ++ ++15.2.11 array-dimension [Function] ++---------------------------------- ++ ++'array-dimension' array axis-number => dimension ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ axis-number--an integer greater than or equal to zero and less than ++the rank of the array. ++ ++ dimension--a non-negative integer. ++ ++Description:: ++............. ++ ++array-dimension returns the axis-number dimension_1 of array. (Any fill ++pointer is ignored.) ++ ++Examples:: ++.......... ++ ++ (array-dimension (make-array 4) 0) => 4 ++ (array-dimension (make-array '(2 3)) 1) => 3 ++ ++Affected By:: ++............. ++ ++None. ++ ++See Also:: ++.......... ++ ++*note array-dimensions:: , *note length:: ++ ++Notes:: ++....... ++ ++ (array-dimension array n) == (nth n (array-dimensions array)) ++ ++ ++File: gcl.info, Node: array-dimensions, Next: array-element-type, Prev: array-dimension, Up: Arrays Dictionary ++ ++15.2.12 array-dimensions [Function] ++----------------------------------- ++ ++'array-dimensions' array => dimensions ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ dimensions--a list of integers. ++ ++Description:: ++............. ++ ++Returns a list of the dimensions of array. (If array is a vector with a ++fill pointer, that fill pointer is ignored.) ++ ++Examples:: ++.......... ++ ++ (array-dimensions (make-array 4)) => (4) ++ (array-dimensions (make-array '(2 3))) => (2 3) ++ (array-dimensions (make-array 4 :fill-pointer 2)) => (4) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its argument is not an ++array. ++ ++See Also:: ++.......... ++ ++*note array-dimension:: ++ ++ ++File: gcl.info, Node: array-element-type, Next: array-has-fill-pointer-p, Prev: array-dimensions, Up: Arrays Dictionary ++ ++15.2.13 array-element-type [Function] ++------------------------------------- ++ ++'array-element-type' array => typespec ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ typespec--a type specifier. ++ ++Description:: ++............. ++ ++Returns a type specifier which represents the actual array element type ++of the array, which is the set of objects that such an array can hold. ++(Because of array upgrading, this type specifier can in some cases ++denote a supertype of the expressed array element type of the array.) ++ ++Examples:: ++.......... ++ ++ (array-element-type (make-array 4)) => T ++ (array-element-type (make-array 12 :element-type '(unsigned-byte 8))) ++ => implementation-dependent ++ (array-element-type (make-array 12 :element-type '(unsigned-byte 5))) ++ => implementation-dependent ++ ++ (array-element-type (make-array 5 :element-type '(mod 5))) ++ ++ could be (mod 5), (mod 8), fixnum, t, or any other type of which (mod ++5) is a subtype. ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its argument is not an ++array. ++ ++See Also:: ++.......... ++ ++array, *note make-array:: , *note subtypep:: , *note ++upgraded-array-element-type:: ++ ++ ++File: gcl.info, Node: array-has-fill-pointer-p, Next: array-displacement, Prev: array-element-type, Up: Arrays Dictionary ++ ++15.2.14 array-has-fill-pointer-p [Function] ++------------------------------------------- ++ ++'array-has-fill-pointer-p' array => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if array has a fill pointer; otherwise returns false. ++ ++Examples:: ++.......... ++ ++ (array-has-fill-pointer-p (make-array 4)) => implementation-dependent ++ (array-has-fill-pointer-p (make-array '(2 3))) => false ++ (array-has-fill-pointer-p ++ (make-array 8 ++ :fill-pointer 2 ++ :initial-element 'filler)) => true ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its argument is not an ++array. ++ ++See Also:: ++.......... ++ ++*note make-array:: , *note fill-pointer:: ++ ++Notes:: ++....... ++ ++Since arrays of rank other than one cannot have a fill pointer, ++array-has-fill-pointer-p always returns nil when its argument is such an ++array. ++ ++ ++File: gcl.info, Node: array-displacement, Next: array-in-bounds-p, Prev: array-has-fill-pointer-p, Up: Arrays Dictionary ++ ++15.2.15 array-displacement [Function] ++------------------------------------- ++ ++'array-displacement' array => displaced-to, displaced-index-offset ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ displaced-to--an array or nil. ++ ++ displaced-index-offset--a non-negative fixnum. ++ ++Description:: ++............. ++ ++If the array is a displaced array, returns the values of the ++:displaced-to and :displaced-index-offset options for the array (see the ++functions make-array and adjust-array). If the array is not a displaced ++array, nil and 0 are returned. ++ ++ If array-displacement is called on an array for which a non-nil ++object was provided as the :displaced-to argument to make-array or ++adjust-array, it must return that object as its first value. It is ++implementation-dependent whether array-displacement returns a non-nil ++primary value for any other array. ++ ++Examples:: ++.......... ++ ++ (setq a1 (make-array 5)) => # ++ (setq a2 (make-array 4 :displaced-to a1 ++ :displaced-index-offset 1)) ++ => # ++ (array-displacement a2) ++ => #, 1 ++ (setq a3 (make-array 2 :displaced-to a2 ++ :displaced-index-offset 2)) ++ => # ++ (array-displacement a3) ++ => #, 2 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if array is not an array. ++ ++See Also:: ++.......... ++ ++*note make-array:: ++ ++ ++File: gcl.info, Node: array-in-bounds-p, Next: array-rank, Prev: array-displacement, Up: Arrays Dictionary ++ ++15.2.16 array-in-bounds-p [Function] ++------------------------------------ ++ ++'array-in-bounds-p' array &rest subscripts => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ subscripts--a list of integers of length equal to the rank of the ++array. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if the subscripts are all in bounds for array; otherwise ++returns false. (If array is a vector with a fill pointer, that fill ++pointer is ignored.) ++ ++Examples:: ++.......... ++ ++ (setq a (make-array '(7 11) :element-type 'string-char)) ++ (array-in-bounds-p a 0 0) => true ++ (array-in-bounds-p a 6 10) => true ++ (array-in-bounds-p a 0 -1) => false ++ (array-in-bounds-p a 0 11) => false ++ (array-in-bounds-p a 7 0) => false ++ ++See Also:: ++.......... ++ ++*note array-dimensions:: ++ ++Notes:: ++....... ++ ++ (array-in-bounds-p array subscripts) ++ == (and (not (some #'minusp (list subscripts))) ++ (every #'< (list subscripts) (array-dimensions array))) ++ ++ ++File: gcl.info, Node: array-rank, Next: array-row-major-index, Prev: array-in-bounds-p, Up: Arrays Dictionary ++ ++15.2.17 array-rank [Function] ++----------------------------- ++ ++'array-rank' array => rank ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ rank--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the number of dimensions of array. ++ ++Examples:: ++.......... ++ ++ (array-rank (make-array '())) => 0 ++ (array-rank (make-array 4)) => 1 ++ (array-rank (make-array '(4))) => 1 ++ (array-rank (make-array '(2 3))) => 2 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its argument is not an ++array. ++ ++See Also:: ++.......... ++ ++*note array-rank-limit:: , *note make-array:: ++ ++ ++File: gcl.info, Node: array-row-major-index, Next: array-total-size, Prev: array-rank, Up: Arrays Dictionary ++ ++15.2.18 array-row-major-index [Function] ++---------------------------------------- ++ ++'array-row-major-index' array &rest subscripts => index ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ subscripts--a list of valid array indices for the array. ++ ++ index--a valid array row-major index for the array. ++ ++Description:: ++............. ++ ++Computes the position according to the row-major ordering of array for ++the element that is specified by subscripts, and returns the offset of ++the element in the computed position from the beginning of array. ++ ++ For a one-dimensional array, the result of array-row-major-index ++equals subscript. ++ ++ array-row-major-index ignores fill pointers. ++ ++Examples:: ++.......... ++ ++ (setq a (make-array '(4 7) :element-type '(unsigned-byte 8))) ++ (array-row-major-index a 1 2) => 9 ++ (array-row-major-index ++ (make-array '(2 3 4) ++ :element-type '(unsigned-byte 8) ++ :displaced-to a ++ :displaced-index-offset 4) ++ 0 2 1) => 9 ++ ++Notes:: ++....... ++ ++A possible definition of array-row-major-index, with no error-checking, ++is ++ ++ (defun array-row-major-index (a &rest subscripts) ++ (apply #'+ (maplist #'(lambda (x y) ++ (* (car x) (apply #'* (cdr y)))) ++ subscripts ++ (array-dimensions a)))) ++ ++ ++File: gcl.info, Node: array-total-size, Next: arrayp, Prev: array-row-major-index, Up: Arrays Dictionary ++ ++15.2.19 array-total-size [Function] ++----------------------------------- ++ ++'array-total-size' array => size ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ size--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the array total size of the array. ++ ++Examples:: ++.......... ++ ++ (array-total-size (make-array 4)) => 4 ++ (array-total-size (make-array 4 :fill-pointer 2)) => 4 ++ (array-total-size (make-array 0)) => 0 ++ (array-total-size (make-array '(4 2))) => 8 ++ (array-total-size (make-array '(4 0))) => 0 ++ (array-total-size (make-array '())) => 1 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its argument is not an ++array. ++ ++See Also:: ++.......... ++ ++*note make-array:: , *note array-dimensions:: ++ ++Notes:: ++....... ++ ++If the array is a vector with a fill pointer, the fill pointer is ++ignored when calculating the array total size. ++ ++ Since the product of no arguments is one, the array total size of a ++zero-dimensional array is one. ++ ++ (array-total-size x) ++ == (apply #'* (array-dimensions x)) ++ == (reduce #'* (array-dimensions x)) ++ ++ ++File: gcl.info, Node: arrayp, Next: fill-pointer, Prev: array-total-size, Up: Arrays Dictionary ++ ++15.2.20 arrayp [Function] ++------------------------- ++ ++'arrayp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type array; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (arrayp (make-array '(2 3 4) :adjustable t)) => true ++ (arrayp (make-array 6)) => true ++ (arrayp #*1011) => true ++ (arrayp "hi") => true ++ (arrayp 'hi) => false ++ (arrayp 12) => false ++ ++See Also:: ++.......... ++ ++*note typep:: ++ ++Notes:: ++....... ++ ++ (arrayp object) == (typep object 'array) ++ ++ ++File: gcl.info, Node: fill-pointer, Next: row-major-aref, Prev: arrayp, Up: Arrays Dictionary ++ ++15.2.21 fill-pointer [Accessor] ++------------------------------- ++ ++'fill-pointer' vector => fill-pointer ++ ++ (setf (' fill-pointer' vector) new-fill-pointer) ++ ++Arguments and Values:: ++...................... ++ ++vector--a vector with a fill pointer. ++ ++ fill-pointer, new-fill-pointer--a valid fill pointer for the vector. ++ ++Description:: ++............. ++ ++Accesses the fill pointer of vector. ++ ++Examples:: ++.......... ++ ++ (setq a (make-array 8 :fill-pointer 4)) => #(NIL NIL NIL NIL) ++ (fill-pointer a) => 4 ++ (dotimes (i (length a)) (setf (aref a i) (* i i))) => NIL ++ a => #(0 1 4 9) ++ (setf (fill-pointer a) 3) => 3 ++ (fill-pointer a) => 3 ++ a => #(0 1 4) ++ (setf (fill-pointer a) 8) => 8 ++ a => #(0 1 4 9 NIL NIL NIL NIL) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if vector is not a vector with ++a fill pointer. ++ ++See Also:: ++.......... ++ ++*note make-array:: , *note length:: ++ ++Notes:: ++....... ++ ++There is no operator that will remove a vector's fill pointer. ++ ++ ++File: gcl.info, Node: row-major-aref, Next: upgraded-array-element-type, Prev: fill-pointer, Up: Arrays Dictionary ++ ++15.2.22 row-major-aref [Accessor] ++--------------------------------- ++ ++'row-major-aref' array index => element ++ ++ (setf (' row-major-aref' array index) new-element) ++ ++Arguments and Values:: ++...................... ++ ++array--an array. ++ ++ index--a valid array row-major index for the array. ++ ++ element, new-element--an object. ++ ++Description:: ++............. ++ ++Considers array as a vector by viewing its elements in row-major order, ++and returns the element of that vector which is referred to by the given ++index. ++ ++ row-major-aref is valid for use with setf. ++ ++See Also:: ++.......... ++ ++*note aref:: , *note array-row-major-index:: ++ ++Notes:: ++....... ++ ++ (row-major-aref array index) == ++ (aref (make-array (array-total-size array) ++ :displaced-to array ++ :element-type (array-element-type array)) ++ index) ++ ++ (aref array i1 i2 ...) == ++ (row-major-aref array (array-row-major-index array i1 i2)) ++ ++ ++File: gcl.info, Node: upgraded-array-element-type, Next: array-dimension-limit, Prev: row-major-aref, Up: Arrays Dictionary ++ ++15.2.23 upgraded-array-element-type [Function] ++---------------------------------------------- ++ ++'upgraded-array-element-type' typespec &optional environment => ++upgraded-typespec ++ ++Arguments and Values:: ++...................... ++ ++typespec--a type specifier. ++ ++ environment--an environment object. The default is nil, denoting the ++null lexical environment and the current global environment. ++ ++ upgraded-typespec--a type specifier. ++ ++Description:: ++............. ++ ++Returns the element type of the most specialized array representation ++capable of holding items of the type denoted by typespec. ++ ++ The typespec is a subtype of (and possibly type equivalent to) the ++upgraded-typespec. ++ ++ If typespec is bit, the result is type equivalent to bit. ++ ++ If typespec is base-char, the result is type equivalent to base-char. ++ ++ If typespec is character, the result is type equivalent to character. ++ ++ The purpose of upgraded-array-element-type is to reveal how an ++implementation does its upgrading. ++ ++ The environment is used to expand any derived type specifiers that ++are mentioned in the typespec. ++ ++See Also:: ++.......... ++ ++*note array-element-type:: , *note make-array:: ++ ++Notes:: ++....... ++ ++Except for storage allocation consequences and dealing correctly with ++the optional environment argument, upgraded-array-element-type could be ++defined as: ++ ++ (defun upgraded-array-element-type (type &optional environment) ++ (array-element-type (make-array 0 :element-type type))) ++ ++ ++File: gcl.info, Node: array-dimension-limit, Next: array-rank-limit, Prev: upgraded-array-element-type, Up: Arrays Dictionary ++ ++15.2.24 array-dimension-limit [Constant Variable] ++------------------------------------------------- ++ ++Constant Value:: ++................ ++ ++A positive ++ ++ fixnum, ++ ++ the exact magnitude of which is implementation-dependent, but which ++is not less than 1024. ++ ++Description:: ++............. ++ ++The upper exclusive bound on each individual dimension of an array. ++ ++See Also:: ++.......... ++ ++*note make-array:: ++ ++ ++File: gcl.info, Node: array-rank-limit, Next: array-total-size-limit, Prev: array-dimension-limit, Up: Arrays Dictionary ++ ++15.2.25 array-rank-limit [Constant Variable] ++-------------------------------------------- ++ ++Constant Value:: ++................ ++ ++A positive ++ ++ fixnum, ++ ++ the exact magnitude of which is implementation-dependent, but which ++is not less than 8. ++ ++Description:: ++............. ++ ++The upper exclusive bound on the rank of an array. ++ ++See Also:: ++.......... ++ ++*note make-array:: ++ ++ ++File: gcl.info, Node: array-total-size-limit, Next: simple-vector-p, Prev: array-rank-limit, Up: Arrays Dictionary ++ ++15.2.26 array-total-size-limit [Constant Variable] ++-------------------------------------------------- ++ ++Constant Value:: ++................ ++ ++A positive ++ ++ fixnum, ++ ++ the exact magnitude of which is implementation-dependent, but which ++is not less than 1024. ++ ++Description:: ++............. ++ ++The upper exclusive bound on the array total size of an array. ++ ++ The actual limit on the array total size imposed by the ++implementation might vary according the element type of the array; in ++this case, the value of array-total-size-limit will be the smallest of ++these possible limits. ++ ++See Also:: ++.......... ++ ++*note make-array:: , *note array-element-type:: ++ ++ ++File: gcl.info, Node: simple-vector-p, Next: svref, Prev: array-total-size-limit, Up: Arrays Dictionary ++ ++15.2.27 simple-vector-p [Function] ++---------------------------------- ++ ++'simple-vector-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type simple-vector; otherwise, returns ++false.. ++ ++Examples:: ++.......... ++ ++ (simple-vector-p (make-array 6)) => true ++ (simple-vector-p "aaaaaa") => false ++ (simple-vector-p (make-array 6 :fill-pointer t)) => false ++ ++See Also:: ++.......... ++ ++simple-vector ++ ++Notes:: ++....... ++ ++ (simple-vector-p object) == (typep object 'simple-vector) ++ ++ ++File: gcl.info, Node: svref, Next: vector, Prev: simple-vector-p, Up: Arrays Dictionary ++ ++15.2.28 svref [Accessor] ++------------------------ ++ ++'svref' simple-vector index => element ++ ++ (setf (' svref' simple-vector index) new-element) ++ ++Arguments and Values:: ++...................... ++ ++simple-vector--a simple vector. ++ ++ index--a valid array index for the simple-vector. ++ ++ element, new-element--an object (whose type is a subtype of the array ++element type of the simple-vector). ++ ++Description:: ++............. ++ ++Accesses the element of simple-vector specified by index. ++ ++Examples:: ++.......... ++ ++ (simple-vector-p (setq v (vector 1 2 'sirens))) => true ++ (svref v 0) => 1 ++ (svref v 2) => SIRENS ++ (setf (svref v 1) 'newcomer) => NEWCOMER ++ v => #(1 NEWCOMER SIRENS) ++ ++See Also:: ++.......... ++ ++*note aref:: , sbit, schar, *note vector:: , ++ ++ *note Compiler Terminology:: ++ ++Notes:: ++....... ++ ++svref is identical to aref except that it requires its first argument to ++be a simple vector. ++ ++ (svref v i) == (aref (the simple-vector v) i) ++ ++ ++File: gcl.info, Node: vector, Next: vector-pop, Prev: svref, Up: Arrays Dictionary ++ ++15.2.29 vector [Function] ++------------------------- ++ ++'vector' &rest objects => vector ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ vector--a vector of type (vector t *). ++ ++Description:: ++............. ++ ++Creates a fresh simple general vector whose size corresponds to the ++number of objects. ++ ++ The vector is initialized to contain the objects. ++ ++Examples:: ++.......... ++ ++ (arrayp (setq v (vector 1 2 'sirens))) => true ++ (vectorp v) => true ++ (simple-vector-p v) => true ++ (length v) => 3 ++ ++See Also:: ++.......... ++ ++*note make-array:: ++ ++Notes:: ++....... ++ ++vector is analogous to list. ++ ++ (vector a_1 a_2 ... a_n) ++ == (make-array (list n) :element-type t ++ :initial-contents ++ (list a_1 a_2 ... a_n)) ++ ++ ++File: gcl.info, Node: vector-pop, Next: vector-push, Prev: vector, Up: Arrays Dictionary ++ ++15.2.30 vector-pop [Function] ++----------------------------- ++ ++'vector-pop' vector => element ++ ++Arguments and Values:: ++...................... ++ ++vector--a vector with a fill pointer. ++ ++ element--an object. ++ ++Description:: ++............. ++ ++Decreases the fill pointer of vector by one, and retrieves the element ++of vector that is designated by the new fill pointer. ++ ++Examples:: ++.......... ++ ++ (vector-push (setq fable (list 'fable)) ++ (setq fa (make-array 8 ++ :fill-pointer 2 ++ :initial-element 'sisyphus))) => 2 ++ (fill-pointer fa) => 3 ++ (eq (vector-pop fa) fable) => true ++ (vector-pop fa) => SISYPHUS ++ (fill-pointer fa) => 1 ++ ++Side Effects:: ++.............. ++ ++The fill pointer is decreased by one. ++ ++Affected By:: ++............. ++ ++The value of the fill pointer. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type type-error is signaled if vector does not have a fill ++pointer. ++ ++ If the fill pointer is zero, vector-pop signals an error of type ++error. ++ ++See Also:: ++.......... ++ ++*note vector-push:: , vector-push-extend, *note fill-pointer:: ++ ++ ++File: gcl.info, Node: vector-push, Next: vectorp, Prev: vector-pop, Up: Arrays Dictionary ++ ++15.2.31 vector-push, vector-push-extend [Function] ++-------------------------------------------------- ++ ++'vector-push' new-element vector => new-index-p ++ ++ 'vector-push-extend' new-element vector &optional extension => ++new-index ++ ++Arguments and Values:: ++...................... ++ ++new-element--an object. ++ ++ vector--a vector with a fill pointer. ++ ++ extension--a positive integer. The default is ++implementation-dependent. ++ ++ new-index-p--a valid array index for vector, or nil. ++ ++ new-index--a valid array index for vector. ++ ++Description:: ++............. ++ ++vector-push and vector-push-extend store new-element in vector. ++vector-push attempts to store new-element in the element of vector ++designated by the fill pointer, and to increase the fill pointer by one. ++If the (>= (fill-pointer vector) (array-dimension vector 0)), neither ++vector nor its fill pointer are affected. Otherwise, the store and ++increment take place and vector-push returns the former value of the ++fill pointer which is one less than the one it leaves in vector. ++ ++ vector-push-extend is just like vector-push except that if the fill ++pointer gets too large, vector is extended using adjust-array so that it ++can contain more elements. Extension is the minimum number of elements ++to be added to vector if it must be extended. ++ ++ vector-push and vector-push-extend return the index of new-element in ++vector. If (>= (fill-pointer vector) (array-dimension vector 0)), ++vector-push returns nil. ++ ++Examples:: ++.......... ++ ++ (vector-push (setq fable (list 'fable)) ++ (setq fa (make-array 8 ++ :fill-pointer 2 ++ :initial-element 'first-one))) => 2 ++ (fill-pointer fa) => 3 ++ (eq (aref fa 2) fable) => true ++ (vector-push-extend #\X ++ (setq aa ++ (make-array 5 ++ :element-type 'character ++ :adjustable t ++ :fill-pointer 3))) => 3 ++ (fill-pointer aa) => 4 ++ (vector-push-extend #\Y aa 4) => 4 ++ (array-total-size aa) => at least 5 ++ (vector-push-extend #\Z aa 4) => 5 ++ (array-total-size aa) => 9 ;(or more) ++ ++Affected By:: ++............. ++ ++The value of the fill pointer. ++ ++ How vector was created. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type error is signaled by vector-push-extend if it tries to ++extend vector and vector is not actually adjustable. ++ ++ An error of type error is signaled if vector does not have a fill ++pointer. ++ ++See Also:: ++.......... ++ ++*note adjustable-array-p:: , *note fill-pointer:: , *note vector-pop:: ++ ++ ++File: gcl.info, Node: vectorp, Next: bit (Array), Prev: vector-push, Up: Arrays Dictionary ++ ++15.2.32 vectorp [Function] ++-------------------------- ++ ++'vectorp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type vector; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (vectorp "aaaaaa") => true ++ (vectorp (make-array 6 :fill-pointer t)) => true ++ (vectorp (make-array '(2 3 4))) => false ++ (vectorp #*11) => true ++ (vectorp #b11) => false ++ ++Notes:: ++....... ++ ++ (vectorp object) == (typep object 'vector) ++ ++ ++File: gcl.info, Node: bit (Array), Next: bit-and, Prev: vectorp, Up: Arrays Dictionary ++ ++15.2.33 bit, sbit [Accessor] ++---------------------------- ++ ++'bit' bit-array &rest subscripts => bit ++ ++ 'sbit' bit-array &rest subscripts => bit ++ ++ (setf ('bit' bit-array &rest subscripts) new-bit) ++(setf ('sbit' bit-array &rest subscripts) new-bit) ++ ++Arguments and Values:: ++...................... ++ ++bit-array--for bit, a bit array; for sbit, a simple bit array. ++ ++ subscripts--a list of valid array indices for the bit-array. ++ ++ bit--a bit. ++ ++Description:: ++............. ++ ++bit and sbit access the bit-array element specified by subscripts. ++ ++ These functions ignore the fill pointer when accessing elements. ++ ++Examples:: ++.......... ++ ++ (bit (setq ba (make-array 8 ++ :element-type 'bit ++ :initial-element 1)) ++ 3) => 1 ++ (setf (bit ba 3) 0) => 0 ++ (bit ba 3) => 0 ++ (sbit ba 5) => 1 ++ (setf (sbit ba 5) 1) => 1 ++ (sbit ba 5) => 1 ++ ++See Also:: ++.......... ++ ++*note aref:: , ++ ++ *note Compiler Terminology:: ++ ++Notes:: ++....... ++ ++bit and sbit are like aref except that they require arrays to be a bit ++array and a simple bit array, respectively. ++ ++ bit and sbit, unlike char and schar, allow the first argument to be ++an array of any rank. ++ ++ ++File: gcl.info, Node: bit-and, Next: bit-vector-p, Prev: bit (Array), Up: Arrays Dictionary ++ ++15.2.34 bit-and, bit-andc1, bit-andc2, bit-eqv, ++----------------------------------------------- ++ ++bit-ior, bit-nand, bit-nor, bit-not, bit-orc1, bit-orc2, bit-xor ++---------------------------------------------------------------- ++ ++ [Function] ++ ++ 'bit-and' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-andc1' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-andc2' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-eqv' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-ior' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-nand' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-nor' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-orc1' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-orc2' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-xor' bit-array1 bit-array2 &optional opt-arg => ++resulting-bit-array ++ ++ 'bit-not' bit-array &optional opt-arg => resulting-bit-array ++ ++Arguments and Values:: ++...................... ++ ++bit-array, bit-array1, bit-array2--a bit array. ++ ++ Opt-arg--a bit array, or t, or nil. The default is nil. ++ ++ Bit-array, bit-array1, bit-array2, and opt-arg (if an array) must all ++be of the same rank and dimensions. ++ ++ resulting-bit-array--a bit array. ++ ++Description:: ++............. ++ ++These functions perform bit-wise logical operations on bit-array1 and ++bit-array2 and return an array of matching rank and dimensions, such ++that any given bit of the result is produced by operating on ++corresponding bits from each of the arguments. ++ ++ In the case of bit-not, an array of rank and dimensions matching ++bit-array is returned that contains a copy of bit-array with all the ++bits inverted. ++ ++ If opt-arg is of type (array bit) the contents of the result are ++destructively placed into opt-arg. If opt-arg is the symbol t, ++bit-array or bit-array1 is replaced with the result; if opt-arg is nil ++or omitted, a new array is created to contain the result. ++ ++ Figure 15-4 indicates the logical operation performed by each of the ++functions. ++ ++ 2 ++Function Operation ++_______________________________________________________________________________________________________ ++ ++bit-and and ++bit-eqv equivalence (exclusive nor) ++bit-not complement ++bit-ior inclusive or ++bit-xor exclusive or ++bit-nand complement of bit-array1 and bit-array2 ++bit-nor complement of bit-array1 or bit-array2 ++bit-andc1 and complement of bit-array1 with bit-array2 ++bit-andc2 and bit-array1 with complement of bit-array2 ++bit-orc1 or complement of bit-array1 with bit-array2 ++bit-orc2 or bit-array1 with complement of bit-array2 ++ Figure 15-3: Bit-wise Logical Operations on Bit Arrays ++ ++Examples:: ++.......... ++ ++ (bit-and (setq ba #*11101010) #*01101011) => #*01101010 ++ (bit-and #*1100 #*1010) => #*1000 ++ (bit-andc1 #*1100 #*1010) => #*0010 ++ (setq rba (bit-andc2 ba #*00110011 t)) => #*11001000 ++ (eq rba ba) => true ++ (bit-not (setq ba #*11101010)) => #*00010101 ++ (setq rba (bit-not ba ++ (setq tba (make-array 8 ++ :element-type 'bit)))) ++ => #*00010101 ++ (equal rba tba) => true ++ (bit-xor #*1100 #*1010) => #*0110 ++ ++See Also:: ++.......... ++ ++lognot, *note logand:: ++ ++ ++File: gcl.info, Node: bit-vector-p, Next: simple-bit-vector-p, Prev: bit-and, Up: Arrays Dictionary ++ ++15.2.35 bit-vector-p [Function] ++------------------------------- ++ ++'bit-vector-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type bit-vector; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (bit-vector-p (make-array 6 ++ :element-type 'bit ++ :fill-pointer t)) => true ++ (bit-vector-p #*) => true ++ (bit-vector-p (make-array 6)) => false ++ ++See Also:: ++.......... ++ ++*note typep:: ++ ++Notes:: ++....... ++ ++ (bit-vector-p object) == (typep object 'bit-vector) ++ ++ ++File: gcl.info, Node: simple-bit-vector-p, Prev: bit-vector-p, Up: Arrays Dictionary ++ ++15.2.36 simple-bit-vector-p [Function] ++-------------------------------------- ++ ++'simple-bit-vector-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type simple-bit-vector; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (simple-bit-vector-p (make-array 6)) => false ++ (simple-bit-vector-p #*) => true ++ ++See Also:: ++.......... ++ ++*note simple-vector-p:: ++ ++Notes:: ++....... ++ ++ (simple-bit-vector-p object) == (typep object 'simple-bit-vector) ++ ++ ++File: gcl.info, Node: Strings, Next: Sequences, Prev: Arrays, Up: Top ++ ++16 Strings ++********** ++ ++* Menu: ++ ++* String Concepts:: ++* Strings Dictionary:: ++ ++ ++File: gcl.info, Node: String Concepts, Next: Strings Dictionary, Prev: Strings, Up: Strings ++ ++16.1 String Concepts ++==================== ++ ++* Menu: ++ ++* Implications of Strings Being Arrays:: ++* Subtypes of STRING:: ++ ++ ++File: gcl.info, Node: Implications of Strings Being Arrays, Next: Subtypes of STRING, Prev: String Concepts, Up: String Concepts ++ ++16.1.1 Implications of Strings Being Arrays ++------------------------------------------- ++ ++Since all strings are arrays, all rules which apply generally to arrays ++also apply to strings. See *note Array Concepts::. ++ ++ For example, strings can have fill pointers, and strings are also ++subject to the rules of element type upgrading that apply to arrays. ++ ++ ++File: gcl.info, Node: Subtypes of STRING, Prev: Implications of Strings Being Arrays, Up: String Concepts ++ ++16.1.2 Subtypes of STRING ++------------------------- ++ ++All functions that operate on strings will operate on subtypes of string ++as well. ++ ++ However, the consequences are undefined if a character is inserted ++into a string for which the element type of the string does not include ++that character. ++ ++ ++File: gcl.info, Node: Strings Dictionary, Prev: String Concepts, Up: Strings ++ ++16.2 Strings Dictionary ++======================= ++ ++* Menu: ++ ++* string (System Class):: ++* base-string:: ++* simple-string:: ++* simple-base-string:: ++* simple-string-p:: ++* char:: ++* string:: ++* string-upcase:: ++* string-trim:: ++* string=:: ++* stringp:: ++* make-string:: ++ ++ ++File: gcl.info, Node: string (System Class), Next: base-string, Prev: Strings Dictionary, Up: Strings Dictionary ++ ++16.2.1 string [System Class] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++string, vector, array, sequence, t ++ ++Description:: ++............. ++ ++A string is a specialized vector whose elements are of type character or ++a subtype of type character. When used as a type specifier for object ++creation, string means (vector character). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('string'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the union of all types (array c (size)) for all subtypes c ++of character; that is, the set of strings of size size. ++ ++See Also:: ++.......... ++ ++*note String Concepts::, *note Double-Quote::, *note Printing Strings:: ++ ++ ++File: gcl.info, Node: base-string, Next: simple-string, Prev: string (System Class), Up: Strings Dictionary ++ ++16.2.2 base-string [Type] ++------------------------- ++ ++Supertypes:: ++............ ++ ++base-string, string, vector, array, sequence, t ++ ++Description:: ++............. ++ ++The type base-string is equivalent to ++ ++ (vector base-char). ++ ++ The base string representation is the most efficient string ++representation that can hold an arbitrary sequence of standard ++characters. ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('base-string'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This is equivalent to the type (vector base-char size); that is, the set ++of base strings of size size. ++ ++ ++File: gcl.info, Node: simple-string, Next: simple-base-string, Prev: base-string, Up: Strings Dictionary ++ ++16.2.3 simple-string [Type] ++--------------------------- ++ ++Supertypes:: ++............ ++ ++simple-string, string, vector, simple-array, array, sequence, t ++ ++Description:: ++............. ++ ++A simple string is a specialized one-dimensional simple array whose ++elements are of type character or a subtype of type character. When ++used as a type specifier for object creation, simple-string means ++(simple-array character (size)). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('simple-string'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This denotes the union of all types (simple-array c (size)) for all ++subtypes c of character; that is, the set of simple strings of size ++size. ++ ++ ++File: gcl.info, Node: simple-base-string, Next: simple-string-p, Prev: simple-string, Up: Strings Dictionary ++ ++16.2.4 simple-base-string [Type] ++-------------------------------- ++ ++Supertypes:: ++............ ++ ++simple-base-string, base-string, simple-string, string, vector, ++simple-array, array, sequence, t ++ ++Description:: ++............. ++ ++The type simple-base-string is equivalent to ++ ++ (simple-array base-char (*)). ++ ++Compound Type Specifier Kind:: ++.............................. ++ ++Abbreviating. ++ ++Compound Type Specifier Syntax:: ++................................ ++ ++('simple-base-string'{[size]}) ++ ++Compound Type Specifier Arguments:: ++................................... ++ ++size--a non-negative fixnum, or the symbol *. ++ ++Compound Type Specifier Description:: ++..................................... ++ ++This is equivalent to the type (simple-array base-char (size)); that is, ++the set of simple base strings of size size. ++ ++ ++File: gcl.info, Node: simple-string-p, Next: char, Prev: simple-base-string, Up: Strings Dictionary ++ ++16.2.5 simple-string-p [Function] ++--------------------------------- ++ ++'simple-string-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type simple-string; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (simple-string-p "aaaaaa") => true ++ (simple-string-p (make-array 6 ++ :element-type 'character ++ :fill-pointer t)) => false ++ ++Notes:: ++....... ++ ++ (simple-string-p object) == (typep object 'simple-string) ++ ++ ++File: gcl.info, Node: char, Next: string, Prev: simple-string-p, Up: Strings Dictionary ++ ++16.2.6 char, schar [Accessor] ++----------------------------- ++ ++'char' string index => character ++ ++ 'schar' string index => character ++ ++ (setf ('char' string index) new-character) ++(setf ('schar' string index) new-character) ++ ++Arguments and Values:: ++...................... ++ ++string--for char, a string; for schar, a simple string. ++ ++ index--a valid array index for the string. ++ ++ character, new-character--a character. ++ ++Description:: ++............. ++ ++char and schar access the element of string specified by index. ++ ++ char ignores fill pointers when accessing elements. ++ ++Examples:: ++.......... ++ ++ (setq my-simple-string (make-string 6 :initial-element #\A)) => "AAAAAA" ++ (schar my-simple-string 4) => #\A ++ (setf (schar my-simple-string 4) #\B) => #\B ++ my-simple-string => "AAAABA" ++ (setq my-filled-string ++ (make-array 6 :element-type 'character ++ :fill-pointer 5 ++ :initial-contents my-simple-string)) ++ => "AAAAB" ++ (char my-filled-string 4) => #\B ++ (char my-filled-string 5) => #\A ++ (setf (char my-filled-string 3) #\C) => #\C ++ (setf (char my-filled-string 5) #\D) => #\D ++ (setf (fill-pointer my-filled-string) 6) => 6 ++ my-filled-string => "AAACBD" ++ ++See Also:: ++.......... ++ ++*note aref:: , *note elt:: , ++ ++ *note Compiler Terminology:: ++ ++Notes:: ++....... ++ ++ (char s j) == (aref (the string s) j) ++ ++ ++File: gcl.info, Node: string, Next: string-upcase, Prev: char, Up: Strings Dictionary ++ ++16.2.7 string [Function] ++------------------------ ++ ++'string' x => string ++ ++Arguments and Values:: ++...................... ++ ++x--a string, a symbol, or a character. ++ ++ string--a string. ++ ++Description:: ++............. ++ ++Returns a string described by x; specifically: ++ ++* ++ If x is a string, it is returned. ++* ++ If x is a symbol, its name is returned. ++* ++ ++ If x is a character, ++ ++ then a string containing that one character is returned. ++* ++ ++ string might perform additional, implementation-defined ++ conversions. ++ ++Examples:: ++.......... ++ ++ (string "already a string") => "already a string" ++ (string 'elm) => "ELM" ++ (string #\c) => "c" ++ ++Exceptional Situations:: ++........................ ++ ++In the case where a conversion is defined neither by this specification ++nor by the implementation, an error of type type-error is signaled. ++ ++See Also:: ++.......... ++ ++*note coerce:: , string (type). ++ ++Notes:: ++....... ++ ++coerce can be used to convert a sequence of characters to a string. ++ ++ prin1-to-string, princ-to-string, write-to-string, or format (with a ++first argument of nil) can be used to get a string representation of a ++number or any other object. ++ ++ ++File: gcl.info, Node: string-upcase, Next: string-trim, Prev: string, Up: Strings Dictionary ++ ++16.2.8 string-upcase, string-downcase, string-capitalize, ++--------------------------------------------------------- ++ ++nstring-upcase, nstring-downcase, nstring-capitalize ++---------------------------------------------------- ++ ++ [Function] ++ ++ 'string-upcase' string &key start end => cased-string ++ ++ 'string-downcase' string &key start end => cased-string ++ ++ 'string-capitalize' string &key start end => cased-string ++ ++ 'nstring-upcase' string &key start end => string ++ ++ 'nstring-downcase' string &key start end => string ++ ++ 'nstring-capitalize' string &key start end => string ++ ++Arguments and Values:: ++...................... ++ ++string--a string designator. For nstring-upcase, nstring-downcase, and ++nstring-capitalize, the string designator must be a string. ++ ++ start, end--bounding index designators of string. The defaults for ++start and end are 0 and nil, respectively. ++ ++ cased-string--a string. ++ ++Description:: ++............. ++ ++string-upcase, string-downcase, string-capitalize, nstring-upcase, ++nstring-downcase, nstring-capitalize change the case of the subsequence ++of string bounded by start and end as follows: ++ ++string-upcase ++ string-upcase returns a string just like string with all lowercase ++ characters replaced by the corresponding uppercase characters. ++ More precisely, each character of the result string is produced by ++ applying the function char-upcase to the corresponding character of ++ string. ++ ++string-downcase ++ string-downcase is like string-upcase except that all uppercase ++ characters are replaced by the corresponding lowercase characters ++ (using char-downcase). ++ ++string-capitalize ++ string-capitalize produces a copy of string such that, for every ++ word in the copy, the first character of the "word," if it has ++ case, is uppercase and any other characters with case in the word ++ are lowercase. For the purposes of string-capitalize, a "word" is ++ defined to be a consecutive subsequence consisting of alphanumeric ++ characters, delimited at each end either by a non-alphanumeric ++ character or by an end of the string. ++ ++nstring-upcase, nstring-downcase, nstring-capitalize ++ nstring-upcase, nstring-downcase, and nstring-capitalize are ++ identical to string-upcase, string-downcase, and string-capitalize ++ respectively except that they modify string. ++ ++ For string-upcase, string-downcase, and string-capitalize, string is ++not modified. However, if no characters in string require conversion, ++the result may be either string or a copy of it, at the implementation's ++discretion. ++ ++Examples:: ++.......... ++ ++ (string-upcase "abcde") => "ABCDE" ++ (string-upcase "Dr. Livingston, I presume?") ++ => "DR. LIVINGSTON, I PRESUME?" ++ (string-upcase "Dr. Livingston, I presume?" :start 6 :end 10) ++ => "Dr. LiVINGston, I presume?" ++ (string-downcase "Dr. Livingston, I presume?") ++ => "dr. livingston, i presume?" ++ ++ (string-capitalize "elm 13c arthur;fig don't") => "Elm 13c Arthur;Fig Don'T" ++ (string-capitalize " hello ") => " Hello " ++ (string-capitalize "occlUDeD cASEmenTs FOreSTAll iNADVertent DEFenestraTION") ++ => "Occluded Casements Forestall Inadvertent Defenestration" ++ (string-capitalize 'kludgy-hash-search) => "Kludgy-Hash-Search" ++ (string-capitalize "DON'T!") => "Don'T!" ;not "Don't!" ++ (string-capitalize "pipe 13a, foo16c") => "Pipe 13a, Foo16c" ++ ++ (setq str (copy-seq "0123ABCD890a")) => "0123ABCD890a" ++ (nstring-downcase str :start 5 :end 7) => "0123AbcD890a" ++ str => "0123AbcD890a" ++ ++Side Effects:: ++.............. ++ ++nstring-upcase, nstring-downcase, and nstring-capitalize modify string ++as appropriate rather than constructing a new string. ++ ++See Also:: ++.......... ++ ++*note char-upcase:: , char-downcase ++ ++Notes:: ++....... ++ ++The result is always of the same length as string. ++ ++ ++File: gcl.info, Node: string-trim, Next: string=, Prev: string-upcase, Up: Strings Dictionary ++ ++16.2.9 string-trim, string-left-trim, string-right-trim [Function] ++------------------------------------------------------------------ ++ ++'string-trim' character-bag string => trimmed-string ++ ++ 'string-left-trim' character-bag string => trimmed-string ++ ++ 'string-right-trim' character-bag string => trimmed-string ++ ++Arguments and Values:: ++...................... ++ ++character-bag--a sequence containing characters. ++ ++ string--a string designator. ++ ++ trimmed-string--a string. ++ ++Description:: ++............. ++ ++string-trim returns a substring of string, with all characters in ++character-bag stripped off the beginning and end. string-left-trim is ++similar but strips characters off only the beginning; string-right-trim ++strips off only the end. ++ ++ If no characters need to be trimmed from the string, then either ++string itself or a copy of it may be returned, at the discretion of the ++implementation. ++ ++ All of these functions observe the fill pointer. ++ ++Examples:: ++.......... ++ ++ (string-trim "abc" "abcaakaaakabcaaa") => "kaaak" ++ (string-trim '(#\Space #\Tab #\Newline) " garbanzo beans ++ ") => "garbanzo beans" ++ (string-trim " (*)" " ( *three (silly) words* ) ") ++ => "three (silly) words" ++ ++ (string-left-trim "abc" "labcabcabc") => "labcabcabc" ++ (string-left-trim " (*)" " ( *three (silly) words* ) ") ++ => "three (silly) words* ) " ++ ++ (string-right-trim " (*)" " ( *three (silly) words* ) ") ++ => " ( *three (silly) words" ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++ ++File: gcl.info, Node: string=, Next: stringp, Prev: string-trim, Up: Strings Dictionary ++ ++16.2.10 string=, string/=, string<, string>, string<=, string>=, ++---------------------------------------------------------------- ++ ++string-equal, string-not-equal, string-lessp, ++--------------------------------------------- ++ ++string-greaterp, string-not-greaterp, string-not-lessp ++------------------------------------------------------ ++ ++ [Function] ++ ++ 'string=' string1 string2 &key start1 end1 start2 end2 => ++generalized-boolean ++ ++ 'string/=' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string<' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string>' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string<=' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string>=' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string-equal' string1 string2 &key start1 end1 start2 end2 => ++generalized-boolean ++ ++ 'string-not-equal' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string-lessp' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string-greaterp' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string-not-greaterp' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++ 'string-not-lessp' string1 string2 &key start1 end1 start2 end2 => ++mismatch-index ++ ++Arguments and Values:: ++...................... ++ ++string1--a string designator. ++ ++ string2--a string designator. ++ ++ start1, end1--bounding index designators of string1. The defaults ++for start and end are 0 and nil, respectively. ++ ++ start2, end2--bounding index designators of string2. The defaults ++for start and end are 0 and nil, respectively. ++ ++ generalized-boolean--a generalized boolean. ++ ++ mismatch-index--a bounding index of string1, or nil. ++ ++Description:: ++............. ++ ++These functions perform lexicographic comparisons on string1 and ++string2. string= and string-equal are called equality functions; the ++others are called inequality functions. The comparison operations these ++functions perform are restricted to the subsequence of string1 bounded ++by start1 and end1 and to the subsequence of string2 bounded by start2 ++and end2. ++ ++ A string a is equal to a string b if it contains the same number of ++characters, and the corresponding characters are the same under char= or ++char-equal, as appropriate. ++ ++ A string a is less than a string b if in the first position in which ++they differ the character of a is less than the corresponding character ++of b according to char< or char-lessp as appropriate, or if string a is ++a proper prefix of string b (of shorter length and matching in all the ++characters of a). ++ ++ The equality functions return a generalized boolean that is true if ++the strings are equal, or false otherwise. ++ ++ The inequality functions return a mismatch-index that is true if the ++strings are not equal, or false otherwise. When the mismatch-index is ++true, it is an integer representing the first character position at ++which the two substrings differ, as an offset from the beginning of ++string1. ++ ++ The comparison has one of the following results: ++ ++string= ++ string= is true if the supplied substrings are of the same length ++ and contain the same characters in corresponding positions; ++ otherwise it is false. ++ ++string/= ++ string/= is true if the supplied substrings are different; ++ otherwise it is false. ++ ++string-equal ++ string-equal is just like string= except that differences in case ++ are ignored; two characters are considered to be the same if ++ char-equal is true of them. ++ ++string< ++ string< is true if substring1 is less than substring2; otherwise it ++ is false. ++ ++string> ++ string> is true if substring1 is greater than substring2; otherwise ++ it is false. ++ ++string-lessp, string-greaterp ++ string-lessp and string-greaterp are exactly like string< and ++ string>, respectively, except that distinctions between uppercase ++ and lowercase letters are ignored. It is as if char-lessp were ++ used instead of char< for comparing characters. ++ ++string<= ++ string<= is true if substring1 is less than or equal to substring2; ++ otherwise it is false. ++ ++string>= ++ string>= is true if substring1 is greater than or equal to ++ substring2; otherwise it is false. ++ ++string-not-greaterp, string-not-lessp ++ string-not-greaterp and string-not-lessp are exactly like string<= ++ and string>=, respectively, except that distinctions between ++ uppercase and lowercase letters are ignored. It is as if ++ char-lessp were used instead of char< for comparing characters. ++ ++Examples:: ++.......... ++ ++ (string= "foo" "foo") => true ++ (string= "foo" "Foo") => false ++ (string= "foo" "bar") => false ++ (string= "together" "frog" :start1 1 :end1 3 :start2 2) => true ++ (string-equal "foo" "Foo") => true ++ (string= "abcd" "01234abcd9012" :start2 5 :end2 9) => true ++ (string< "aaaa" "aaab") => 3 ++ (string>= "aaaaa" "aaaa") => 4 ++ (string-not-greaterp "Abcde" "abcdE") => 5 ++ (string-lessp "012AAAA789" "01aaab6" :start1 3 :end1 7 ++ :start2 2 :end2 6) => 6 ++ (string-not-equal "AAAA" "aaaA") => false ++ ++See Also:: ++.......... ++ ++*note char=:: ++ ++Notes:: ++....... ++ ++equal calls string= if applied to two strings. ++ ++ ++File: gcl.info, Node: stringp, Next: make-string, Prev: string=, Up: Strings Dictionary ++ ++16.2.11 stringp [Function] ++-------------------------- ++ ++'stringp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type string; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (stringp "aaaaaa") => true ++ (stringp #\a) => false ++ ++See Also:: ++.......... ++ ++*note typep:: , string (type) ++ ++Notes:: ++....... ++ ++ (stringp object) == (typep object 'string) ++ ++ ++File: gcl.info, Node: make-string, Prev: stringp, Up: Strings Dictionary ++ ++16.2.12 make-string [Function] ++------------------------------ ++ ++'make-string' size &key initial-element element-type => string ++ ++Arguments and Values:: ++...................... ++ ++size--a valid array dimension. ++ ++ initial-element--a character. ++ ++ The default is implementation-dependent. ++ ++ element-type--a type specifier. The default is character. ++ ++ string--a simple string. ++ ++Description:: ++............. ++ ++make-string returns a simple string of length size whose elements have ++been initialized to initial-element. ++ ++ The element-type names the type of the elements of the string; a ++string is constructed of the most specialized type that can accommodate ++elements of the given type. ++ ++Examples:: ++.......... ++ ++ (make-string 10 :initial-element #\5) => "5555555555" ++ (length (make-string 10)) => 10 ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++ ++File: gcl.info, Node: Sequences, Next: Hash Tables, Prev: Strings, Up: Top ++ ++17 Sequences ++************ ++ ++* Menu: ++ ++* Sequence Concepts:: ++* Rules about Test Functions:: ++* Sequences Dictionary:: ++ ++ ++File: gcl.info, Node: Sequence Concepts, Next: Rules about Test Functions, Prev: Sequences, Up: Sequences ++ ++17.1 Sequence Concepts ++====================== ++ ++A sequence is an ordered collection of elements, implemented as either a ++vector or a list. ++ ++ Sequences can be created by the function make-sequence, as well as ++other functions that create objects of types that are subtypes of ++sequence (e.g., list, make-list, mapcar, and vector). ++ ++ A sequence function is a function defined by this specification or ++added as an extension by the implementation that operates on one or more ++sequences. Whenever a sequence function must construct and return a new ++vector, it always returns a simple vector. Similarly, any strings ++constructed will be simple strings. ++ ++ concatenate length remove ++ copy-seq map remove-duplicates ++ count map-into remove-if ++ count-if merge remove-if-not ++ count-if-not mismatch replace ++ delete notany reverse ++ delete-duplicates notevery search ++ delete-if nreverse some ++ delete-if-not nsubstitute sort ++ elt nsubstitute-if stable-sort ++ every nsubstitute-if-not subseq ++ fill position substitute ++ find position-if substitute-if ++ find-if position-if-not substitute-if-not ++ find-if-not reduce ++ ++ Figure 17-1: Standardized Sequence Functions ++ ++ ++* Menu: ++ ++* General Restrictions on Parameters that must be Sequences:: ++ ++ ++File: gcl.info, Node: General Restrictions on Parameters that must be Sequences, Prev: Sequence Concepts, Up: Sequence Concepts ++ ++17.1.1 General Restrictions on Parameters that must be Sequences ++---------------------------------------------------------------- ++ ++In general, lists (including association lists and property lists) that ++are treated as sequences must be proper lists. ++ ++ ++File: gcl.info, Node: Rules about Test Functions, Next: Sequences Dictionary, Prev: Sequence Concepts, Up: Sequences ++ ++17.2 Rules about Test Functions ++=============================== ++ ++* Menu: ++ ++* Satisfying a Two-Argument Test:: ++* Satisfying a One-Argument Test:: ++ ++ ++File: gcl.info, Node: Satisfying a Two-Argument Test, Next: Satisfying a One-Argument Test, Prev: Rules about Test Functions, Up: Rules about Test Functions ++ ++17.2.1 Satisfying a Two-Argument Test ++------------------------------------- ++ ++When an object O is being considered iteratively against each element ++E_i of a sequence S by an operator F listed in Figure 17-2, it is ++sometimes useful to control the way in which the presence of O is tested ++in S is tested by F. This control is offered on the basis of a function ++designated with either a :test or :test-not argument. ++ ++ adjoin nset-exclusive-or search ++ assoc nsublis set-difference ++ count nsubst set-exclusive-or ++ delete nsubstitute sublis ++ find nunion subsetp ++ intersection position subst ++ member pushnew substitute ++ mismatch rassoc tree-equal ++ nintersection remove union ++ nset-difference remove-duplicates ++ ++ Figure 17-2: Operators that have Two-Argument Tests to be Satisfied ++ ++ ++ The object O might not be compared directly to E_i. If a :key ++argument is provided, it is a designator for a function of one argument ++to be called with each E_i as an argument, and yielding an object Z_i to ++be used for comparison. (If there is no :key argument, Z_i is E_i.) ++ ++ The function designated by the :key argument is never called on O ++itself. However, if the function operates on multiple sequences (e.g., ++as happens in set-difference), O will be the result of calling the :key ++function on an element of the other sequence. ++ ++ A :test argument, if supplied to F, is a designator for a function of ++two arguments, O and Z_i. An E_i is said (or, sometimes, an O and an ++E_i are said) to satisfy the test ++ ++ if this :test function returns a generalized boolean representing ++true. ++ ++ A :test-not argument, if supplied to F, is designator for a function ++of two arguments, O and Z_i. An E_i is said (or, sometimes, an O and an ++E_i are said) to satisfy the test ++ ++ if this :test-not function returns a generalized boolean representing ++false. ++ ++ If neither a :test nor a :test-not argument is supplied, it is as if ++a :test argument of #'eql was supplied. ++ ++ The consequences are unspecified if both a :test and a :test-not ++argument are supplied in the same call to F. ++ ++* Menu: ++ ++* Examples of Satisfying a Two-Argument Test:: ++ ++ ++File: gcl.info, Node: Examples of Satisfying a Two-Argument Test, Prev: Satisfying a Two-Argument Test, Up: Satisfying a Two-Argument Test ++ ++17.2.1.1 Examples of Satisfying a Two-Argument Test ++................................................... ++ ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'equal) ++ => (foo bar "BAR" "foo" "bar") ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'equalp) ++ => (foo bar "BAR" "bar") ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'string-equal) ++ => (bar "BAR" "bar") ++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'string=) ++ => (BAR "BAR" "foo" "bar") ++ ++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'eql) ++ => (1) ++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'=) ++ => (1 1.0 #C(1.0 0.0)) ++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test (complement #'=)) ++ => (1 1.0 #C(1.0 0.0)) ++ ++ (count 1 '((one 1) (uno 1) (two 2) (dos 2)) :key #'cadr) => 2 ++ ++ (count 2.0 '(1 2 3) :test #'eql :key #'float) => 1 ++ ++ (count "FOO" (list (make-pathname :name "FOO" :type "X") ++ (make-pathname :name "FOO" :type "Y")) ++ :key #'pathname-name ++ :test #'equal) ++ => 2 ++ ++ ++File: gcl.info, Node: Satisfying a One-Argument Test, Prev: Satisfying a Two-Argument Test, Up: Rules about Test Functions ++ ++17.2.2 Satisfying a One-Argument Test ++------------------------------------- ++ ++When using one of the functions in Figure 17-3, the elements E of a ++sequence S are filtered not on the basis of the presence or absence of ++an object O under a two argument predicate, as with the functions ++described in *note Satisfying a Two-Argument Test::, but rather on the ++basis of a one argument predicate. ++ ++ assoc-if member-if rassoc-if ++ assoc-if-not member-if-not rassoc-if-not ++ count-if nsubst-if remove-if ++ count-if-not nsubst-if-not remove-if-not ++ delete-if nsubstitute-if subst-if ++ delete-if-not nsubstitute-if-not subst-if-not ++ find-if position-if substitute-if ++ find-if-not position-if-not substitute-if-not ++ ++ Figure 17-3: Operators that have One-Argument Tests to be Satisfied ++ ++ ++ The element E_i might not be considered directly. If a :key argument ++is provided, it is a designator for a function of one argument to be ++called with each E_i as an argument, and yielding an object Z_i to be ++used for comparison. (If there is no :key argument, Z_i is E_i.) ++ ++ Functions defined in this specification and having a name that ends ++in "-if" accept a first argument that is a designator for a function of ++one argument, Z_i. An E_i is said to satisfy the test if this :test ++function returns a generalized boolean representing true. ++ ++ Functions defined in this specification and having a name that ends ++in "-if-not" accept a first argument that is a designator for a function ++of one argument, Z_i. An E_i is said to satisfy the test if this :test ++function returns a generalized boolean representing false. ++ ++* Menu: ++ ++* Examples of Satisfying a One-Argument Test:: ++ ++ ++File: gcl.info, Node: Examples of Satisfying a One-Argument Test, Prev: Satisfying a One-Argument Test, Up: Satisfying a One-Argument Test ++ ++17.2.2.1 Examples of Satisfying a One-Argument Test ++................................................... ++ ++ (count-if #'zerop '(1 #C(0.0 0.0) 0 0.0d0 0.0s0 3)) => 4 ++ ++ (remove-if-not #'symbolp '(0 1 2 3 4 5 6 7 8 9 A B C D E F)) ++ => (A B C D E F) ++ (remove-if (complement #'symbolp) '(0 1 2 3 4 5 6 7 8 9 A B C D E F)) ++ => (A B C D E F) ++ ++ (count-if #'zerop '("foo" "" "bar" "" "" "baz" "quux") :key #'length) ++ => 3 ++ ++ ++File: gcl.info, Node: Sequences Dictionary, Prev: Rules about Test Functions, Up: Sequences ++ ++17.3 Sequences Dictionary ++========================= ++ ++* Menu: ++ ++* sequence:: ++* copy-seq:: ++* elt:: ++* fill:: ++* make-sequence:: ++* subseq:: ++* map:: ++* map-into:: ++* reduce:: ++* count:: ++* length:: ++* reverse:: ++* sort:: ++* find:: ++* position:: ++* search:: ++* mismatch:: ++* replace:: ++* substitute:: ++* concatenate:: ++* merge:: ++* remove:: ++* remove-duplicates:: ++ ++ ++File: gcl.info, Node: sequence, Next: copy-seq, Prev: Sequences Dictionary, Up: Sequences Dictionary ++ ++17.3.1 sequence [System Class] ++------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++sequence, t ++ ++Description:: ++............. ++ ++Sequences are ordered collections of objects, called the elements of the ++sequence. ++ ++ The types vector and the type list are disjoint subtypes of type ++sequence, but are not necessarily an exhaustive partition of sequence. ++ ++ When viewing a vector as a sequence, only the active elements of that ++vector are considered elements of the sequence; that is, sequence ++operations respect the fill pointer when given sequences represented as ++vectors. ++ ++ ++File: gcl.info, Node: copy-seq, Next: elt, Prev: sequence, Up: Sequences Dictionary ++ ++17.3.2 copy-seq [Function] ++-------------------------- ++ ++'copy-seq' sequence => copied-sequence ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ copied-sequence--a proper sequence. ++ ++Description:: ++............. ++ ++Creates a copy of sequence. The elements of the new sequence are the ++same as the corresponding elements of the given sequence. ++ ++ If sequence is a vector, the result is a fresh simple array of rank ++one that has the same actual array element type as sequence. If ++sequence is a list, the result is a fresh list. ++ ++Examples:: ++.......... ++ ++ (setq str "a string") => "a string" ++ (equalp str (copy-seq str)) => true ++ (eql str (copy-seq str)) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note copy-list:: ++ ++Notes:: ++....... ++ ++From a functional standpoint, ++ (copy-seq x) == (subseq x 0) ++ ++ However, the programmer intent is typically very different in these ++two cases. ++ ++ ++File: gcl.info, Node: elt, Next: fill, Prev: copy-seq, Up: Sequences Dictionary ++ ++17.3.3 elt [Accessor] ++--------------------- ++ ++'elt' sequence index => object ++ ++ (setf (' elt' sequence index) new-object) ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ index--a valid sequence index for sequence. ++ ++ object--an object. ++ ++ new-object--an object. ++ ++Description:: ++............. ++ ++Accesses the element of sequence specified by index. ++ ++Examples:: ++.......... ++ ++ (setq str (copy-seq "0123456789")) => "0123456789" ++ (elt str 6) => #\6 ++ (setf (elt str 0) #\#) => #\# ++ str => "#123456789" ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. Should signal an error of type type-error if ++index is not a valid sequence index for sequence. ++ ++See Also:: ++.......... ++ ++*note aref:: , *note nth:: , ++ ++ *note Compiler Terminology:: ++ ++Notes:: ++....... ++ ++aref may be used to access vector elements that are beyond the vector's ++fill pointer. ++ ++ ++File: gcl.info, Node: fill, Next: make-sequence, Prev: elt, Up: Sequences Dictionary ++ ++17.3.4 fill [Function] ++---------------------- ++ ++'fill' sequence item &key start end => sequence ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ item--a sequence. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++Description:: ++............. ++ ++Replaces the elements of sequence bounded by start and end with item. ++ ++Examples:: ++.......... ++ ++ (fill (list 0 1 2 3 4 5) '(444)) => ((444) (444) (444) (444) (444) (444)) ++ (fill (copy-seq "01234") #\e :start 3) => "012ee" ++ (setq x (vector 'a 'b 'c 'd 'e)) => #(A B C D E) ++ (fill x 'z :start 1 :end 3) => #(A Z Z D E) ++ x => #(A Z Z D E) ++ (fill x 'p) => #(P P P P P) ++ x => #(P P P P P) ++ ++Side Effects:: ++.............. ++ ++Sequence is destructively modified. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. Should signal an error of type type-error if ++start is not a non-negative integer. Should signal an error of type ++type-error if end is not a non-negative integer or nil. ++ ++See Also:: ++.......... ++ ++*note replace:: , nsubstitute ++ ++Notes:: ++....... ++ ++(fill sequence item) == (nsubstitute-if item (constantly t) sequence) ++ ++ ++File: gcl.info, Node: make-sequence, Next: subseq, Prev: fill, Up: Sequences Dictionary ++ ++17.3.5 make-sequence [Function] ++------------------------------- ++ ++'make-sequence' result-type size &key initial-element => sequence ++ ++Arguments and Values:: ++...................... ++ ++result-type--a sequence type specifier. ++ ++ size--a non-negative integer. ++ ++ initial-element--an object. The default is implementation-dependent. ++ ++ sequence--a proper sequence. ++ ++Description:: ++............. ++ ++Returns a sequence of the type result-type and of length size, each of ++the elements of which has been initialized to initial-element. ++ ++ If the result-type is a subtype of list, the result will be a list. ++ ++ If the result-type is a subtype of vector, then if the implementation ++can determine the element type specified for the result-type, the ++element type of the resulting array is the result of upgrading that ++element type; or, if the implementation can determine that the element ++type is unspecified (or *), the element type of the resulting array is ++t; otherwise, an error is signaled. ++ ++Examples:: ++.......... ++ ++ (make-sequence 'list 0) => () ++ (make-sequence 'string 26 :initial-element #\.) ++ => ".........................." ++ (make-sequence '(vector double-float) 2 ++ :initial-element 1d0) ++ => #(1.0d0 1.0d0) ++ ++ (make-sequence '(vector * 2) 3) should signal an error ++ (make-sequence '(vector * 4) 3) should signal an error ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are unspecified if initial-element is not an object ++which can be stored in the resulting sequence. ++ ++ An error of type type-error must be signaled if the result-type is ++neither a recognizable subtype of list, nor a recognizable subtype of ++vector. ++ ++ An error of type type-error should be signaled if result-type ++specifies the number of elements and size is different from that number. ++ ++See Also:: ++.......... ++ ++*note make-array:: , *note make-list:: ++ ++Notes:: ++....... ++ ++ (make-sequence 'string 5) == (make-string 5) ++ ++ ++File: gcl.info, Node: subseq, Next: map, Prev: make-sequence, Up: Sequences Dictionary ++ ++17.3.6 subseq [Accessor] ++------------------------ ++ ++'subseq' sequence start &optional end => subsequence ++ ++ (setf (' subseq' sequence start &optional end) new-subsequence) ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ start, end--bounding index designators of sequence. The default for ++end is nil. ++ ++ subsequence--a proper sequence. ++ ++ new-subsequence--a proper sequence. ++ ++Description:: ++............. ++ ++subseq creates a sequence that is a copy of the subsequence of sequence ++bounded by start and end. ++ ++ Start specifies an offset into the original sequence and marks the ++beginning position of the subsequence. end marks the position following ++the last element of the subsequence. ++ ++ subseq always allocates a new sequence for a result; it never shares ++storage with an old sequence. The result subsequence is always of the ++same type as sequence. ++ ++ If sequence is a vector, the result is a fresh simple array of rank ++one that has the same actual array element type as sequence. If ++sequence is a list, the result is a fresh list. ++ ++ setf may be used with subseq to destructively replace elements of a ++subsequence with elements taken from a sequence of new values. If the ++subsequence and the new sequence are not of equal length, the shorter ++length determines the number of elements that are replaced. The ++remaining elements at the end of the longer sequence are not modified in ++the operation. ++ ++Examples:: ++.......... ++ ++ (setq str "012345") => "012345" ++ (subseq str 2) => "2345" ++ (subseq str 3 5) => "34" ++ (setf (subseq str 4) "abc") => "abc" ++ str => "0123ab" ++ (setf (subseq str 0 2) "A") => "A" ++ str => "A123ab" ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. Should be prepared to signal an error of type ++type-error if new-subsequence is not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note replace:: ++ ++ ++File: gcl.info, Node: map, Next: map-into, Prev: subseq, Up: Sequences Dictionary ++ ++17.3.7 map [Function] ++--------------------- ++ ++'map' result-type function &rest sequences^+ => result ++ ++Arguments and Values:: ++...................... ++ ++result-type - a sequence type specifier, or nil. ++ ++ function--a function designator. function must take as many ++arguments as there are sequences. ++ ++ sequence--a proper sequence. ++ ++ result--if result-type is a type specifier other than nil, then a ++sequence of the type it denotes; otherwise (if the result-type is nil), ++nil. ++ ++Description:: ++............. ++ ++Applies function to successive sets of arguments in which one argument ++is obtained from each sequence. The function is called first on all the ++elements with index 0, then on all those with index 1, and so on. The ++result-type specifies the type of the resulting sequence. ++ ++ map returns nil if result-type is nil. Otherwise, map returns a ++sequence such that element j is the result of applying function to ++element j of each of the sequences. The result sequence is as long as ++the shortest of the sequences. The consequences are undefined if the ++result of applying function to the successive elements of the sequences ++cannot be contained in a sequence of the type given by result-type. ++ ++ If the result-type is a subtype of list, the result will be a list. ++ ++ If the result-type is a subtype of vector, then if the implementation ++can determine the element type specified for the result-type, the ++element type of the resulting array is the result of upgrading that ++element type; or, if the implementation can determine that the element ++type is unspecified (or *), the element type of the resulting array is ++t; otherwise, an error is signaled. ++ ++Examples:: ++.......... ++ ++ (map 'string #'(lambda (x y) ++ (char "01234567890ABCDEF" (mod (+ x y) 16))) ++ '(1 2 3 4) ++ '(10 9 8 7)) => "AAAA" ++ (setq seq '("lower" "UPPER" "" "123")) => ("lower" "UPPER" "" "123") ++ (map nil #'nstring-upcase seq) => NIL ++ seq => ("LOWER" "UPPER" "" "123") ++ (map 'list #'- '(1 2 3 4)) => (-1 -2 -3 -4) ++ (map 'string ++ #'(lambda (x) (if (oddp x) #\1 #\0)) ++ '(1 2 3 4)) => "1010" ++ ++ (map '(vector * 4) #'cons "abc" "de") should signal an error ++ ++Exceptional Situations:: ++........................ ++ ++An error of type type-error must be signaled if the result-type is not a ++recognizable subtype of list, not a recognizable subtype of vector, and ++not nil. ++ ++ Should be prepared to signal an error of type type-error if any ++sequence is not a proper sequence. ++ ++ An error of type type-error should be signaled if result-type ++specifies the number of elements and the minimum length of the sequences ++is different from that number. ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: map-into, Next: reduce, Prev: map, Up: Sequences Dictionary ++ ++17.3.8 map-into [Function] ++-------------------------- ++ ++'map-into' result-sequence function &rest sequences => result-sequence ++ ++Arguments and Values:: ++...................... ++ ++result-sequence--a proper sequence. ++ ++ function--a designator for a function of as many arguments as there ++are sequences. ++ ++ sequence--a proper sequence. ++ ++Description:: ++............. ++ ++Destructively modifies result-sequence to contain the results of ++applying function to each element in the argument sequences in turn. ++ ++ result-sequence and each element of sequences can each be either a ++list or a vector. If result-sequence and each element of sequences are ++not all the same length, the iteration terminates when the shortest ++sequence (of any of the sequences or the result-sequence) is exhausted. ++If result-sequence is a vector with a fill pointer, the fill pointer is ++ignored when deciding how many iterations to perform, and afterwards the ++fill pointer is set to the number of times function was applied. If ++result-sequence is longer than the shortest element of sequences, extra ++elements at the end of result-sequence are left unchanged. If ++result-sequence is nil, map-into immediately returns nil, since nil is a ++sequence of length zero. ++ ++ If function has side effects, it can count on being called first on ++all of the elements with index 0, then on all of those numbered 1, and ++so on. ++ ++Examples:: ++.......... ++ ++ (setq a (list 1 2 3 4) b (list 10 10 10 10)) => (10 10 10 10) ++ (map-into a #'+ a b) => (11 12 13 14) ++ a => (11 12 13 14) ++ b => (10 10 10 10) ++ (setq k '(one two three)) => (ONE TWO THREE) ++ (map-into a #'cons k a) => ((ONE . 11) (TWO . 12) (THREE . 13) 14) ++ (map-into a #'gensym) => (#:G9090 #:G9091 #:G9092 #:G9093) ++ a => (#:G9090 #:G9091 #:G9092 #:G9093) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if ++result-sequence is not a proper sequence. Should be prepared to signal ++an error of type type-error if sequence is not a proper sequence. ++ ++Notes:: ++....... ++ ++map-into differs from map in that it modifies an existing sequence ++rather than creating a new one. In addition, map-into can be called ++with only two arguments, while map requires at least three arguments. ++ ++ map-into could be defined by: ++ ++ (defun map-into (result-sequence function &rest sequences) ++ (loop for index below (apply #'min ++ (length result-sequence) ++ (mapcar #'length sequences)) ++ do (setf (elt result-sequence index) ++ (apply function ++ (mapcar #'(lambda (seq) (elt seq index)) ++ sequences)))) ++ result-sequence) ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-7 +@@ -0,0 +1,9206 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: reduce, Next: count, Prev: map-into, Up: Sequences Dictionary ++ ++17.3.9 reduce [Function] ++------------------------ ++ ++'reduce' function sequence &key key from-end start end initial-value => ++result ++ ++Arguments and Values:: ++...................... ++ ++function--a designator for a function that might be called with either ++zero or two arguments. ++ ++ sequence--a proper sequence. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ initial-value--an object. ++ ++ result--an object. ++ ++Description:: ++............. ++ ++reduce uses a binary operation, function, to combine the elements of ++sequence bounded by start and end. ++ ++ The function must accept as arguments two elements of sequence or the ++results from combining those elements. The function must also be able ++to accept no arguments. ++ ++ If key is supplied, it is used is used to extract the values to ++reduce. The key function is applied exactly once to each element of ++sequence in the order implied by the reduction order but not to the ++value of initial-value, if supplied. ++ ++ The key function typically returns part of the element of sequence. ++If key is not supplied or is nil, the sequence element itself is used. ++ ++ The reduction is left-associative, unless from-end is true in which ++case it is right-associative. ++ ++ If initial-value is supplied, it is logically placed before the ++subsequence (or after it if from-end is true) and included in the ++reduction operation. ++ ++ In the normal case, the result of reduce is the combined result of ++function's being applied to successive pairs of elements of sequence. ++If the subsequence contains exactly one element and no initial-value is ++given, then that element is returned and function is not called. If the ++subsequence is empty and an initial-value is given, then the ++initial-value is returned and function is not called. If the ++subsequence is empty and no initial-value is given, then the function is ++called with zero arguments, and reduce returns whatever function does. ++This is the only case where the function is called with other than two ++arguments. ++ ++Examples:: ++.......... ++ ++ (reduce #'* '(1 2 3 4 5)) => 120 ++ (reduce #'append '((1) (2)) :initial-value '(i n i t)) => (I N I T 1 2) ++ (reduce #'append '((1) (2)) :from-end t ++ :initial-value '(i n i t)) => (1 2 I N I T) ++ (reduce #'- '(1 2 3 4)) == (- (- (- 1 2) 3) 4) => -8 ++ (reduce #'- '(1 2 3 4) :from-end t) ;Alternating sum. ++ == (- 1 (- 2 (- 3 4))) => -2 ++ (reduce #'+ '()) => 0 ++ (reduce #'+ '(3)) => 3 ++ (reduce #'+ '(foo)) => FOO ++ (reduce #'list '(1 2 3 4)) => (((1 2) 3) 4) ++ (reduce #'list '(1 2 3 4) :from-end t) => (1 (2 (3 4))) ++ (reduce #'list '(1 2 3 4) :initial-value 'foo) => ((((foo 1) 2) 3) 4) ++ (reduce #'list '(1 2 3 4) ++ :from-end t :initial-value 'foo) => (1 (2 (3 (4 foo)))) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: count, Next: length, Prev: reduce, Up: Sequences Dictionary ++ ++17.3.10 count, count-if, count-if-not [Function] ++------------------------------------------------ ++ ++'count' item sequence &key from-end start end key test test-not => n ++ ++ 'count-if' predicate sequence &key from-end start end key => n ++ ++ 'count-if-not' predicate sequence &key from-end start end key => n ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ sequence--a proper sequence. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ n--a non-negative integer less than or equal to the length of ++sequence. ++ ++Description:: ++............. ++ ++count, count-if, and count-if-not count and return the number of ++elements in the sequence bounded by start and end that satisfy the test. ++ ++ The from-end has no direct effect on the result. However, if ++from-end is true, the elements of sequence will be supplied as arguments ++to the test, test-not, and key in reverse order, which may change the ++side-effects, if any, of those functions. ++ ++Examples:: ++.......... ++ ++ (count #\a "how many A's are there in here?") => 2 ++ (count-if-not #'oddp '((1) (2) (3) (4)) :key #'car) => 2 ++ (count-if #'upper-case-p "The Crying of Lot 49" :start 4) => 2 ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note Rules about Test Functions::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ The function count-if-not is deprecated. ++ ++ ++File: gcl.info, Node: length, Next: reverse, Prev: count, Up: Sequences Dictionary ++ ++17.3.11 length [Function] ++------------------------- ++ ++'length' sequence => n ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ n--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the number of elements in sequence. ++ ++ If sequence is a vector with a fill pointer, the active length as ++specified by the fill pointer is returned. ++ ++Examples:: ++.......... ++ ++ (length "abc") => 3 ++ (setq str (make-array '(3) :element-type 'character ++ :initial-contents "abc" ++ :fill-pointer t)) => "abc" ++ (length str) => 3 ++ (setf (fill-pointer str) 2) => 2 ++ (length str) => 2 ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note list-length:: , sequence ++ ++ ++File: gcl.info, Node: reverse, Next: sort, Prev: length, Up: Sequences Dictionary ++ ++17.3.12 reverse, nreverse [Function] ++------------------------------------ ++ ++'reverse' sequence => reversed-sequence ++ ++ 'nreverse' sequence => reversed-sequence ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ reversed-sequence--a sequence. ++ ++Description:: ++............. ++ ++reverse and nreverse return a new sequence of the same kind as sequence, ++containing the same elements, but in reverse order. ++ ++ reverse and nreverse differ in that reverse always creates and ++returns a new sequence, whereas nreverse might modify and return the ++given sequence. reverse never modifies the given sequence. ++ ++ For reverse, if sequence is a vector, the result is a fresh simple ++array of rank one that has the same actual array element type as ++sequence. If sequence is a list, the result is a fresh list. ++ ++ For nreverse, if sequence is a vector, the result is a vector that ++has the same actual array element type as sequence. If sequence is a ++list, the result is a list. ++ ++ For nreverse, sequence might be destroyed and re-used to produce the ++result. The result might or might not be identical to sequence. ++ ++ Specifically, when sequence is a list, nreverse is permitted to setf ++any part, car or cdr, of any cons that is part of the list structure of ++sequence. When sequence is a vector, nreverse is permitted to re-order ++the elements of sequence in order to produce the resulting vector. ++ ++Examples:: ++.......... ++ ++ (setq str "abc") => "abc" ++ (reverse str) => "cba" ++ str => "abc" ++ (setq str (copy-seq str)) => "abc" ++ (nreverse str) => "cba" ++ str => implementation-dependent ++ (setq l (list 1 2 3)) => (1 2 3) ++ (nreverse l) => (3 2 1) ++ l => implementation-dependent ++ ++Side Effects:: ++.............. ++ ++nreverse might either create a new sequence, modify the argument ++sequence, or both. (reverse does not modify sequence.) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++ ++File: gcl.info, Node: sort, Next: find, Prev: reverse, Up: Sequences Dictionary ++ ++17.3.13 sort, stable-sort [Function] ++------------------------------------ ++ ++'sort' sequence predicate &key key => sorted-sequence ++ ++ 'stable-sort' sequence predicate &key key => sorted-sequence ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ predicate--a designator for a function of two arguments that returns ++a generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ sorted-sequence--a sequence. ++ ++Description:: ++............. ++ ++sort and stable-sort destructively sort sequences according to the order ++determined by the predicate function. ++ ++ If sequence is a vector, the result is a vector that has the same ++actual array element type as sequence. The result might or might not be ++simple, and might or might not be identical to sequence. If sequence is ++a list, the result is a list. ++ ++ sort determines the relationship between two elements by giving keys ++extracted from the elements to the predicate. The first argument to the ++predicate function is the part of one element of sequence extracted by ++the key function (if supplied); the second argument is the part of ++another element of sequence extracted by the key function (if supplied). ++Predicate should return true if and only if the first argument is ++strictly less than the second (in some appropriate sense). If the first ++argument is greater than or equal to the second (in the appropriate ++sense), then the predicate should return false. ++ ++ The argument to the key function is the sequence element. The return ++value of the key function becomes an argument to predicate. If key is ++not supplied or nil, the sequence element itself is used. There is no ++guarantee on the number of times the key will be called. ++ ++ If the key and predicate always return, then the sorting operation ++will always terminate, producing a sequence containing the same elements ++as sequence (that is, the result is a permutation of sequence). This is ++guaranteed even if the predicate does not really consistently represent ++a total order (in which case the elements will be scrambled in some ++unpredictable way, but no element will be lost). If the key ++consistently returns meaningful keys, and the predicate does reflect ++some total ordering criterion on those keys, then the elements of the ++sorted-sequence will be properly sorted according to that ordering. ++ ++ The sorting operation performed by sort is not guaranteed stable. ++Elements considered equal by the predicate might or might not stay in ++their original order. The predicate is assumed to consider two elements ++x and y to be equal if (funcall predicate x y) and (funcall predicate y ++x) are both false. stable-sort guarantees stability. ++ ++ The sorting operation can be destructive in all cases. In the case ++of a vector argument, this is accomplished by permuting the elements in ++place. In the case of a list, the list is destructively reordered in ++the same manner as for nreverse. ++ ++Examples:: ++.......... ++ ++ (setq tester (copy-seq "lkjashd")) => "lkjashd" ++ (sort tester #'char-lessp) => "adhjkls" ++ (setq tester (list '(1 2 3) '(4 5 6) '(7 8 9))) => ((1 2 3) (4 5 6) (7 8 9)) ++ (sort tester #'> :key #'car) => ((7 8 9) (4 5 6) (1 2 3)) ++ (setq tester (list 1 2 3 4 5 6 7 8 9 0)) => (1 2 3 4 5 6 7 8 9 0) ++ (stable-sort tester #'(lambda (x y) (and (oddp x) (evenp y)))) ++ => (1 3 5 7 9 2 4 6 8 0) ++ (sort (setq committee-data ++ (vector (list (list "JonL" "White") "Iteration") ++ (list (list "Dick" "Waters") "Iteration") ++ (list (list "Dick" "Gabriel") "Objects") ++ (list (list "Kent" "Pitman") "Conditions") ++ (list (list "Gregor" "Kiczales") "Objects") ++ (list (list "David" "Moon") "Objects") ++ (list (list "Kathy" "Chapman") "Editorial") ++ (list (list "Larry" "Masinter") "Cleanup") ++ (list (list "Sandra" "Loosemore") "Compiler"))) ++ #'string-lessp :key #'cadar) ++ => #((("Kathy" "Chapman") "Editorial") ++ (("Dick" "Gabriel") "Objects") ++ (("Gregor" "Kiczales") "Objects") ++ (("Sandra" "Loosemore") "Compiler") ++ (("Larry" "Masinter") "Cleanup") ++ (("David" "Moon") "Objects") ++ (("Kent" "Pitman") "Conditions") ++ (("Dick" "Waters") "Iteration") ++ (("JonL" "White") "Iteration")) ++ ;; Note that individual alphabetical order within `committees' ++ ;; is preserved. ++ (setq committee-data ++ (stable-sort committee-data #'string-lessp :key #'cadr)) ++ => #((("Larry" "Masinter") "Cleanup") ++ (("Sandra" "Loosemore") "Compiler") ++ (("Kent" "Pitman") "Conditions") ++ (("Kathy" "Chapman") "Editorial") ++ (("Dick" "Waters") "Iteration") ++ (("JonL" "White") "Iteration") ++ (("Dick" "Gabriel") "Objects") ++ (("Gregor" "Kiczales") "Objects") ++ (("David" "Moon") "Objects")) ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note merge:: , ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects::, ++ ++ *note Destructive Operations:: ++ ++ ++File: gcl.info, Node: find, Next: position, Prev: sort, Up: Sequences Dictionary ++ ++17.3.14 find, find-if, find-if-not [Function] ++--------------------------------------------- ++ ++'find' item sequence &key from-end test test-not start end key => ++element ++ ++ 'find-if' predicate sequence &key from-end start end key => element ++ ++ 'find-if-not' predicate sequence &key from-end start end key => ++element ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ sequence--a proper sequence. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ element--an element of the sequence, or nil. ++ ++Description:: ++............. ++ ++find, find-if, and find-if-not each search for an element of the ++sequence bounded by start and end that satisfies the predicate predicate ++or that satisfies the test test or test-not, as appropriate. ++ ++ If from-end is true, then the result is the rightmost element that ++satisfies the test. ++ ++ If the sequence contains an element that satisfies the test, then the ++leftmost or rightmost sequence element, depending on from-end, is ++returned; otherwise nil is returned. ++ ++Examples:: ++.......... ++ ++ (find #\d "here are some letters that can be looked at" :test #'char>) ++ => #\Space ++ (find-if #'oddp '(1 2 3 4 5) :end 3 :from-end t) => 3 ++ (find-if-not #'complexp ++ '#(3.5 2 #C(1.0 0.0) #C(0.0 1.0)) ++ :start 2) => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note position:: , *note Rules about Test Functions::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ The function find-if-not is deprecated. ++ ++ ++File: gcl.info, Node: position, Next: search, Prev: find, Up: Sequences Dictionary ++ ++17.3.15 position, position-if, position-if-not [Function] ++--------------------------------------------------------- ++ ++'position' item sequence &key from-end test test-not start end key => ++position ++ ++ 'position-if' predicate sequence &key from-end start end key => ++position ++ ++ 'position-if-not' predicate sequence &key from-end start end key => ++position ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ sequence--a proper sequence. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ position--a bounding index of sequence, or nil. ++ ++Description:: ++............. ++ ++position, position-if, and position-if-not each search sequence for an ++element that satisfies the test. ++ ++ The position returned is the index within sequence of the leftmost ++(if from-end is true) or of the rightmost (if from-end is false) element ++that satisfies the test; otherwise nil is returned. The index returned ++is relative to the left-hand end of the entire sequence, regardless of ++the value of start, end, or from-end. ++ ++Examples:: ++.......... ++ ++ (position #\a "baobab" :from-end t) => 4 ++ (position-if #'oddp '((1) (2) (3) (4)) :start 1 :key #'car) => 2 ++ (position 595 '()) => NIL ++ (position-if-not #'integerp '(1 2 3 4 5.0)) => 4 ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note find:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ The function position-if-not is deprecated. ++ ++ ++File: gcl.info, Node: search, Next: mismatch, Prev: position, Up: Sequences Dictionary ++ ++17.3.16 search [Function] ++------------------------- ++ ++'search' sequence-1 sequence-2 &key from-end test test-not key start1 ++start2 end1 end2 ++=> position ++ ++Arguments and Values:: ++...................... ++ ++Sequence-1--a sequence. ++ ++ Sequence-2--a sequence. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ start1, end1--bounding index designators of sequence-1. The defaults ++for start1 and end1 are 0 and nil, respectively. ++ ++ start2, end2--bounding index designators of sequence-2. The defaults ++for start2 and end2 are 0 and nil, respectively. ++ ++ position--a bounding index of sequence-2, or nil. ++ ++Description:: ++............. ++ ++Searches sequence-2 for a subsequence that matches sequence-1. ++ ++ The implementation may choose to search sequence-2 in any order; ++there is no guarantee on the number of times the test is made. For ++example, when start-end is true, the sequence might actually be searched ++from left to right instead of from right to left (but in either case ++would return the rightmost matching subsequence). If the search ++succeeds, search returns the offset into sequence-2 of the first element ++of the leftmost or rightmost matching subsequence, depending on ++from-end; otherwise search returns nil. ++ ++ If from-end is true, the index of the leftmost element of the ++rightmost matching subsequence is returned. ++ ++Examples:: ++.......... ++ ++ (search "dog" "it's a dog's life") => 7 ++ (search '(0 1) '(2 4 6 1 3 5) :key #'oddp) => 2 ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ ++File: gcl.info, Node: mismatch, Next: replace, Prev: search, Up: Sequences Dictionary ++ ++17.3.17 mismatch [Function] ++--------------------------- ++ ++'mismatch' sequence-1 sequence-2 &key from-end test test-not key start1 ++start2 end1 end2 ++=> position ++ ++Arguments and Values:: ++...................... ++ ++Sequence-1--a sequence. ++ ++ Sequence-2--a sequence. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start1, end1--bounding index designators of sequence-1. The defaults ++for start1 and end1 are 0 and nil, respectively. ++ ++ start2, end2--bounding index designators of sequence-2. The defaults ++for start2 and end2 are 0 and nil, respectively. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ position--a bounding index of sequence-1, or nil. ++ ++Description:: ++............. ++ ++The specified subsequences of sequence-1 and sequence-2 are compared ++element-wise. ++ ++ The key argument is used for both the sequence-1 and the sequence-2. ++ ++ If sequence-1 and sequence-2 are of equal length and match in every ++element, the result is false. Otherwise, the result is a non-negative ++integer, the index within sequence-1 of the leftmost or rightmost ++position, depending on from-end, at which the two subsequences fail to ++match. If one subsequence is shorter than and a matching prefix of the ++other, the result is the index relative to sequence-1 beyond the last ++position tested. ++ ++ If from-end is true, then one plus the index of the rightmost ++position in which the sequences differ is returned. In effect, the ++subsequences are aligned at their right-hand ends; then, the last ++elements are compared, the penultimate elements, and so on. The index ++returned is an index relative to sequence-1. ++ ++Examples:: ++.......... ++ ++ (mismatch "abcd" "ABCDE" :test #'char-equal) => 4 ++ (mismatch '(3 2 1 1 2 3) '(1 2 3) :from-end t) => 3 ++ (mismatch '(1 2 3) '(2 3 4) :test-not #'eq :key #'oddp) => NIL ++ (mismatch '(1 2 3 4 5 6) '(3 4 5 6 7) :start1 2 :end2 4) => NIL ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ ++File: gcl.info, Node: replace, Next: substitute, Prev: mismatch, Up: Sequences Dictionary ++ ++17.3.18 replace [Function] ++-------------------------- ++ ++'replace' sequence-1 sequence-2 &key start1 end1 start2 end2 => ++sequence-1 ++ ++Arguments and Values:: ++...................... ++ ++sequence-1--a sequence. ++ ++ sequence-2--a sequence. ++ ++ start1, end1--bounding index designators of sequence-1. The defaults ++for start1 and end1 are 0 and nil, respectively. ++ ++ start2, end2--bounding index designators of sequence-2. The defaults ++for start2 and end2 are 0 and nil, respectively. ++ ++Description:: ++............. ++ ++Destructively modifies sequence-1 by replacing the elements of ++subsequence-1 bounded by start1 and end1 with the elements of ++subsequence-2 bounded by start2 and end2. ++ ++ Sequence-1 is destructively modified by copying successive elements ++into it from sequence-2. Elements of the subsequence of sequence-2 ++bounded by start2 and end2 are copied into the subsequence of sequence-1 ++bounded by start1 and end1. If these subsequences are not of the same ++length, then the shorter length determines how many elements are copied; ++the extra elements near the end of the longer subsequence are not ++involved in the operation. The number of elements copied can be ++expressed as: ++ ++ (min (- end1 start1) (- end2 start2)) ++ ++ If sequence-1 and sequence-2 are the same object and the region being ++modified overlaps the region being copied from, then it is as if the ++entire source region were copied to another place and only then copied ++back into the target region. However, if sequence-1 and sequence-2 are ++not the same, but the region being modified overlaps the region being ++copied from (perhaps because of shared list structure or displaced ++arrays), then after the replace operation the subsequence of sequence-1 ++being modified will have unpredictable contents. It is an error if the ++elements of sequence-2 are not of a type that can be stored into ++sequence-1. ++ ++Examples:: ++.......... ++ ++ (replace "abcdefghij" "0123456789" :start1 4 :end1 7 :start2 4) ++ => "abcd456hij" ++ (setq lst "012345678") => "012345678" ++ (replace lst lst :start1 2 :start2 0) => "010123456" ++ lst => "010123456" ++ ++Side Effects:: ++.............. ++ ++The sequence-1 is modified. ++ ++See Also:: ++.......... ++ ++*note fill:: ++ ++ ++File: gcl.info, Node: substitute, Next: concatenate, Prev: replace, Up: Sequences Dictionary ++ ++17.3.19 substitute, substitute-if, substitute-if-not, ++----------------------------------------------------- ++ ++nsubstitute, nsubstitute-if, nsubstitute-if-not ++----------------------------------------------- ++ ++ [Function] ++ ++ 'substitute' newitem olditem sequence &key from-end test test-not ++start end count key ++=> result-sequence ++ ++ 'substitute-if' newitem predicate sequence &key from-end start end ++count key ++=> result-sequence ++ ++ 'substitute-if-not' newitem predicate sequence &key from-end start ++end count key ++=> result-sequence ++ ++ 'nsubstitute' newitem olditem sequence &key from-end test test-not ++start end count key ++=> sequence ++ ++ 'nsubstitute-if' newitem predicate sequence &key from-end start end ++count key ++=> sequence ++ ++ 'nsubstitute-if-not' newitem predicate sequence &key from-end start ++end count key ++=> sequence ++ ++Arguments and Values:: ++...................... ++ ++newitem--an object. ++ ++ olditem--an object. ++ ++ sequence--a proper sequence. ++ ++ predicate--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ count--an integer or nil. ++ ++ The default is nil. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-sequence--a sequence. ++ ++Description:: ++............. ++ ++substitute, substitute-if, and substitute-if-not return a copy of ++sequence in which each element that satisfies the test has been replaced ++with newitem. ++ ++ nsubstitute, nsubstitute-if, and nsubstitute-if-not are like ++substitute, substitute-if, and substitute-if-not respectively, but they ++may modify sequence. ++ ++ If sequence is a vector, the result is a vector that has the same ++actual array element type as sequence. The result might or might not be ++simple, and might or might not be identical to sequence. If sequence is ++a list, the result is a list. ++ ++ Count, if supplied, limits the number of elements altered; if more ++than count elements satisfy the test, then of these elements only the ++leftmost or rightmost, depending on from-end, are replaced, as many as ++specified by count. ++ ++ If count is supplied and negative, the behavior is as if zero had ++been supplied instead. ++ ++ If count is nil, all matching items are affected. ++ ++ Supplying a from-end of true matters only when the count is provided ++(and non-nil); in that case, only the rightmost count elements ++satisfying the test are removed (instead of the leftmost). ++ ++ predicate, test, and test-not might be called more than once for each ++sequence element, and their side effects can happen in any order. ++ ++ The result of all these functions is a sequence of the same type as ++sequence that has the same elements except that those in the subsequence ++bounded by start and end and satisfying the test have been replaced by ++newitem. ++ ++ substitute, substitute-if, and substitute-if-not return a sequence ++which can share with sequence or may be identical to the input sequence ++if no elements need to be changed. ++ ++ nsubstitute and nsubstitute-if are required to setf any car (if ++sequence is a list) or aref (if sequence is a vector) of sequence that ++is required to be replaced with newitem. If sequence is a list, none of ++the cdrs of the top-level list can be modified. ++ ++Examples:: ++.......... ++ ++ (substitute #\. #\SPACE "0 2 4 6") => "0.2.4.6" ++ (substitute 9 4 '(1 2 4 1 3 4 5)) => (1 2 9 1 3 9 5) ++ (substitute 9 4 '(1 2 4 1 3 4 5) :count 1) => (1 2 9 1 3 4 5) ++ (substitute 9 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) ++ => (1 2 4 1 3 9 5) ++ (substitute 9 3 '(1 2 4 1 3 4 5) :test #'>) => (9 9 4 9 3 4 5) ++ ++ (substitute-if 0 #'evenp '((1) (2) (3) (4)) :start 2 :key #'car) ++ => ((1) (2) (3) 0) ++ (substitute-if 9 #'oddp '(1 2 4 1 3 4 5)) => (9 2 4 9 9 4 9) ++ (substitute-if 9 #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t) ++ => (1 2 4 1 3 9 5) ++ ++ (setq some-things (list 'a 'car 'b 'cdr 'c)) => (A CAR B CDR C) ++ (nsubstitute-if "function was here" #'fboundp some-things ++ :count 1 :from-end t) => (A CAR B "function was here" C) ++ some-things => (A CAR B "function was here" C) ++ (setq alpha-tester (copy-seq "ab ")) => "ab " ++ (nsubstitute-if-not #\z #'alpha-char-p alpha-tester) => "abz" ++ alpha-tester => "abz" ++ ++Side Effects:: ++.............. ++ ++nsubstitute, nsubstitute-if, and nsubstitute-if-not modify sequence. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note subst:: , nsubst, ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ The functions substitute-if-not and nsubstitute-if-not are ++deprecated. ++ ++ nsubstitute and nsubstitute-if can be used in for-effect-only ++positions in code. ++ ++ Because the side-effecting variants (e.g., nsubstitute) potentially ++change the path that is being traversed, their effects in the presence ++of shared or circular structure may vary in surprising ways when ++compared to their non-side-effecting alternatives. To see this, ++consider the following side-effect behavior, which might be exhibited by ++some implementations: ++ ++ (defun test-it (fn) ++ (let ((x (cons 'b nil))) ++ (rplacd x x) ++ (funcall fn 'a 'b x :count 1))) ++ (test-it #'substitute) => (A . #1=(B . #1#)) ++ (test-it #'nsubstitute) => (A . #1#) ++ ++ ++File: gcl.info, Node: concatenate, Next: merge, Prev: substitute, Up: Sequences Dictionary ++ ++17.3.20 concatenate [Function] ++------------------------------ ++ ++'concatenate' result-type &rest sequences => result-sequence ++ ++Arguments and Values:: ++...................... ++ ++result-type--a sequence type specifier. ++ ++ sequences--a sequence. ++ ++ result-sequence--a proper sequence of type result-type. ++ ++Description:: ++............. ++ ++concatenate returns a sequence that contains all the individual elements ++of all the sequences in the order that they are supplied. The sequence ++is of type result-type, which must be a subtype of type sequence. ++ ++ All of the sequences are copied from; the result does not share any ++structure with any of the sequences. Therefore, if only one sequence is ++provided and it is of type result-type, concatenate is required to copy ++sequence rather than simply returning it. ++ ++ It is an error if any element of the sequences cannot be an element ++of the sequence result. ++ ++ [Reviewer Note by Barmar: Should signal?] ++ ++ If the result-type is a subtype of list, the result will be a list. ++ ++ If the result-type is a subtype of vector, then if the implementation ++can determine the element type specified for the result-type, the ++element type of the resulting array is the result of upgrading that ++element type; or, if the implementation can determine that the element ++type is unspecified (or *), the element type of the resulting array is ++t; otherwise, an error is signaled. ++ ++Examples:: ++.......... ++ ++ (concatenate 'string "all" " " "together" " " "now") => "all together now" ++ (concatenate 'list "ABC" '(d e f) #(1 2 3) #*1011) ++ => (#\A #\B #\C D E F 1 2 3 1 0 1 1) ++ (concatenate 'list) => NIL ++ ++ (concatenate '(vector * 2) "a" "bc") should signal an error ++ ++Exceptional Situations:: ++........................ ++ ++An error is signaled if the result-type is neither a recognizable ++subtype of list, nor a recognizable subtype of vector. ++ ++ An error of type type-error should be signaled if result-type ++specifies the number of elements and the sum of sequences is different ++from that number. ++ ++See Also:: ++.......... ++ ++*note append:: ++ ++ ++File: gcl.info, Node: merge, Next: remove, Prev: concatenate, Up: Sequences Dictionary ++ ++17.3.21 merge [Function] ++------------------------ ++ ++'merge' result-type sequence-1 sequence-2 predicate &key key => ++result-sequence ++ ++Arguments and Values:: ++...................... ++ ++result-type--a sequence type specifier. ++ ++ sequence-1--a sequence. ++ ++ sequence-2--a sequence. ++ ++ predicate--a designator for a function of two arguments that returns ++a generalized boolean. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-sequence--a proper sequence of type result-type. ++ ++Description:: ++............. ++ ++Destructively merges sequence-1 with sequence-2 according to an order ++determined by the predicate. merge determines the relationship between ++two elements by giving keys extracted from the sequence elements to the ++predicate. ++ ++ The first argument to the predicate function is an element of ++sequence-1 as returned by the key (if supplied); the second argument is ++an element of sequence-2 as returned by the key (if supplied). ++Predicate should return true if and only if its first argument is ++strictly less than the second (in some appropriate sense). If the first ++argument is greater than or equal to the second (in the appropriate ++sense), then predicate should return false. merge considers two ++elements x and y to be equal if (funcall predicate x y) and (funcall ++predicate y x) both yield false. ++ ++ The argument to the key is the sequence element. Typically, the ++return value of the key becomes the argument to predicate. If key is ++not supplied or nil, the sequence element itself is used. The key may ++be executed more than once for each sequence element, and its side ++effects may occur in any order. ++ ++ If key and predicate return, then the merging operation will ++terminate. The result of merging two sequences x and y is a new ++sequence of type result-type z, such that the length of z is the sum of ++the lengths of x and y, and z contains all the elements of x and y. If ++x1 and x2 are two elements of x, and x1 precedes x2 in x, then x1 ++precedes x2 in z, and similarly for elements of y. In short, z is an ++interleaving of x and y. ++ ++ If x and y were correctly sorted according to the predicate, then z ++will also be correctly sorted. If x or y is not so sorted, then z will ++not be sorted, but will nevertheless be an interleaving of x and y. ++ ++ The merging operation is guaranteed stable; if two or more elements ++are considered equal by the predicate, then the elements from sequence-1 ++will precede those from sequence-2 in the result. ++ ++ sequence-1 and/or sequence-2 may be destroyed. ++ ++ If the result-type is a subtype of list, the result will be a list. ++ ++ If the result-type is a subtype of vector, then if the implementation ++can determine the element type specified for the result-type, the ++element type of the resulting array is the result of upgrading that ++element type; or, if the implementation can determine that the element ++type is unspecified (or *), the element type of the resulting array is ++t; otherwise, an error is signaled. ++ ++Examples:: ++.......... ++ ++ (setq test1 (list 1 3 4 6 7)) ++ (setq test2 (list 2 5 8)) ++ (merge 'list test1 test2 #'<) => (1 2 3 4 5 6 7 8) ++ (setq test1 (copy-seq "BOY")) ++ (setq test2 (copy-seq :nosy")) ++ (merge 'string test1 test2 #'char-lessp) => "BnOosYy" ++ (setq test1 (vector ((red . 1) (blue . 4)))) ++ (setq test2 (vector ((yellow . 2) (green . 7)))) ++ (merge 'vector test1 test2 #'< :key #'cdr) ++ => #((RED . 1) (YELLOW . 2) (BLUE . 4) (GREEN . 7)) ++ ++ (merge '(vector * 4) '(1 5) '(2 4 6) #'<) should signal an error ++ ++Exceptional Situations:: ++........................ ++ ++An error must be signaled if the result-type is neither a recognizable ++subtype of list, nor a recognizable subtype of vector. ++ ++ An error of type type-error should be signaled if result-type ++specifies the number of elements and the sum of the lengths of ++sequence-1 and sequence-2 is different from that number. ++ ++See Also:: ++.......... ++ ++*note sort:: , stable-sort, ++ ++ *note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: remove, Next: remove-duplicates, Prev: merge, Up: Sequences Dictionary ++ ++17.3.22 remove, remove-if, remove-if-not, ++----------------------------------------- ++ ++delete, delete-if, delete-if-not ++-------------------------------- ++ ++ [Function] ++ ++ 'remove' item sequence &key from-end test test-not start end count ++key => result-sequence ++ ++ 'remove-if' test sequence &key from-end start end count key => ++result-sequence ++ ++ 'remove-if-not' test sequence &key from-end start end count key => ++result-sequence ++ ++ 'delete' item sequence &key from-end test test-not start end count ++key => result-sequence ++ ++ 'delete-if' test sequence &key from-end start end count key => ++result-sequence ++ ++ 'delete-if-not' test sequence &key from-end start end count key => ++result-sequence ++ ++Arguments and Values:: ++...................... ++ ++item--an object. ++ ++ sequence--a proper sequence. ++ ++ test--a designator for a function of one argument that returns a ++generalized boolean. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ count--an integer or nil. ++ ++ The default is nil. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-sequence--a sequence. ++ ++Description:: ++............. ++ ++remove, remove-if, and remove-if-not return a sequence from which the ++elements that satisfy the test have been removed. ++ ++ delete, delete-if, and delete-if-not are like remove, remove-if, and ++remove-if-not respectively, but they may modify sequence. ++ ++ If sequence is a vector, the result is a vector that has the same ++actual array element type as sequence. The result might or might not be ++simple, and might or might not be identical to sequence. If sequence is ++a list, the result is a list. ++ ++ Supplying a from-end of true matters only when the count is provided; ++in that case only the rightmost count elements satisfying the test are ++deleted. ++ ++ Count, if supplied, limits the number of elements removed or deleted; ++if more than count elements satisfy the test, then of these elements ++only the leftmost or rightmost, depending on from-end, are deleted or ++removed, as many as specified by count. ++ ++ If count is supplied and negative, the behavior is as if zero had ++been supplied instead. ++ ++ If count is nil, all matching items are affected. ++ ++ For all these functions, elements not removed or deleted occur in the ++same order in the result as they did in sequence. ++ ++ remove, remove-if, remove-if-not return a sequence of the same type ++as sequence that has the same elements except that those in the ++subsequence bounded by start and end and satisfying the test have been ++removed. This is a non-destructive operation. If any elements need to ++be removed, the result will be a copy. The result of remove may share ++with sequence; the result may be identical to the input sequence if no ++elements need to be removed. ++ ++ delete, delete-if, and delete-if-not return a sequence of the same ++type as sequence that has the same elements except that those in the ++subsequence bounded by start and end and satisfying the test have been ++deleted. Sequence may be destroyed and used to construct the result; ++however, the result might or might not be identical to sequence. ++ ++ delete, when sequence is a list, is permitted to setf any part, car ++or cdr, of the top-level list structure in that sequence. When sequence ++is a vector, delete is permitted to change the dimensions of the vector ++and to slide its elements into new positions without permuting them to ++produce the resulting vector. ++ ++ delete-if is constrained to behave exactly as follows: ++ ++ (delete nil sequence ++ :test #'(lambda (ignore item) (funcall test item)) ++ ...) ++ ++Examples:: ++.......... ++ ++ (remove 4 '(1 3 4 5 9)) => (1 3 5 9) ++ (remove 4 '(1 2 4 1 3 4 5)) => (1 2 1 3 5) ++ (remove 4 '(1 2 4 1 3 4 5) :count 1) => (1 2 1 3 4 5) ++ (remove 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) => (1 2 4 1 3 5) ++ (remove 3 '(1 2 4 1 3 4 5) :test #'>) => (4 3 4 5) ++ (setq lst '(list of four elements)) => (LIST OF FOUR ELEMENTS) ++ (setq lst2 (copy-seq lst)) => (LIST OF FOUR ELEMENTS) ++ (setq lst3 (delete 'four lst)) => (LIST OF ELEMENTS) ++ (equal lst lst2) => false ++ (remove-if #'oddp '(1 2 4 1 3 4 5)) => (2 4 4) ++ (remove-if #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t) ++ => (1 2 4 1 3 5) ++ (remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9) :count 2 :from-end t) ++ => (1 2 3 4 5 6 8) ++ (setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5) ++ (delete 4 tester) => (1 2 1 3 5) ++ (setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5) ++ (delete 4 tester :count 1) => (1 2 1 3 4 5) ++ (setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5) ++ (delete 4 tester :count 1 :from-end t) => (1 2 4 1 3 5) ++ (setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5) ++ (delete 3 tester :test #'>) => (4 3 4 5) ++ (setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5) ++ (delete-if #'oddp tester) => (2 4 4) ++ (setq tester (list 1 2 4 1 3 4 5)) => (1 2 4 1 3 4 5) ++ (delete-if #'evenp tester :count 1 :from-end t) => (1 2 4 1 3 5) ++ (setq tester (list 1 2 3 4 5 6)) => (1 2 3 4 5 6) ++ (delete-if #'evenp tester) => (1 3 5) ++ tester => implementation-dependent ++ ++ (setq foo (list 'a 'b 'c)) => (A B C) ++ (setq bar (cdr foo)) => (B C) ++ (setq foo (delete 'b foo)) => (A C) ++ bar => ((C)) or ... ++ (eq (cdr foo) (car bar)) => T or ... ++ ++Side Effects:: ++.............. ++ ++For delete, delete-if, and delete-if-not, sequence may be destroyed and ++used to construct the result. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. ++ ++See Also:: ++.......... ++ ++*note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ The functions delete-if-not and remove-if-not are deprecated. ++ ++ ++File: gcl.info, Node: remove-duplicates, Prev: remove, Up: Sequences Dictionary ++ ++17.3.23 remove-duplicates, delete-duplicates [Function] ++------------------------------------------------------- ++ ++'remove-duplicates' sequence &key from-end test test-not start end key ++=> result-sequence ++ ++ 'delete-duplicates' sequence &key from-end test test-not start end ++key ++=> result-sequence ++ ++Arguments and Values:: ++...................... ++ ++sequence--a proper sequence. ++ ++ from-end--a generalized boolean. The default is false. ++ ++ test--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ test-not--a designator for a function of two arguments that returns a ++generalized boolean. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ key--a designator for a function of one argument, or nil. ++ ++ result-sequence--a sequence. ++ ++Description:: ++............. ++ ++remove-duplicates returns a modified copy of sequence from which any ++element that matches another element occurring in sequence has been ++removed. ++ ++ If sequence is a vector, the result is a vector that has the same ++actual array element type as sequence. The result might or might not be ++simple, and might or might not be identical to sequence. If sequence is ++a list, the result is a list. ++ ++ delete-duplicates is like remove-duplicates, but delete-duplicates ++may modify sequence. ++ ++ The elements of sequence are compared pairwise, and if any two match, ++then the one occurring earlier in sequence is discarded, unless from-end ++is true, in which case the one later in sequence is discarded. ++ ++ remove-duplicates and delete-duplicates return a sequence of the same ++type as sequence with enough elements removed so that no two of the ++remaining elements match. The order of the elements remaining in the ++result is the same as the order in which they appear in sequence. ++ ++ remove-duplicates returns a sequence that may share with sequence or ++may be identical to sequence if no elements need to be removed. ++ ++ delete-duplicates, when sequence is a list, is permitted to setf any ++part, car or cdr, of the top-level list structure in that sequence. ++When sequence is a vector, delete-duplicates is permitted to change the ++dimensions of the vector and to slide its elements into new positions ++without permuting them to produce the resulting vector. ++ ++Examples:: ++.......... ++ ++ (remove-duplicates "aBcDAbCd" :test #'char-equal :from-end t) => "aBcD" ++ (remove-duplicates '(a b c b d d e)) => (A C B D E) ++ (remove-duplicates '(a b c b d d e) :from-end t) => (A B C D E) ++ (remove-duplicates '((foo #\a) (bar #\%) (baz #\A)) ++ :test #'char-equal :key #'cadr) => ((BAR #\%) (BAZ #\A)) ++ (remove-duplicates '((foo #\a) (bar #\%) (baz #\A)) ++ :test #'char-equal :key #'cadr :from-end t) => ((FOO #\a) (BAR #\%)) ++ (setq tester (list 0 1 2 3 4 5 6)) ++ (delete-duplicates tester :key #'oddp :start 1 :end 6) => (0 4 5 6) ++ ++Side Effects:: ++.............. ++ ++delete-duplicates might destructively modify sequence. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if sequence is not a proper ++sequence. ++ ++See Also:: ++.......... ++ ++*note Compiler Terminology::, ++ ++ *note Traversal Rules and Side Effects:: ++ ++Notes:: ++....... ++ ++The :test-not argument is deprecated. ++ ++ These functions are useful for converting sequence into a canonical ++form suitable for representing a set. ++ ++ ++File: gcl.info, Node: Hash Tables, Next: Filenames, Prev: Sequences, Up: Top ++ ++18 Hash Tables ++************** ++ ++* Menu: ++ ++* Hash Table Concepts:: ++* Hash Tables Dictionary:: ++ ++ ++File: gcl.info, Node: Hash Table Concepts, Next: Hash Tables Dictionary, Prev: Hash Tables, Up: Hash Tables ++ ++18.1 Hash Table Concepts ++======================== ++ ++* Menu: ++ ++* Hash-Table Operations:: ++* Modifying Hash Table Keys:: ++ ++ ++File: gcl.info, Node: Hash-Table Operations, Next: Modifying Hash Table Keys, Prev: Hash Table Concepts, Up: Hash Table Concepts ++ ++18.1.1 Hash-Table Operations ++---------------------------- ++ ++Figure 18-1 lists some defined names that are applicable to hash tables. ++The following rules apply to hash tables. ++ ++- ++ A hash table can only associate one value with a given key. If an ++ attempt is made to add a second value for a given key, the second ++ value will replace the first. Thus, adding a value to a hash table ++ is a destructive operation; the hash table is modified. ++ ++- ++ There are four kinds of hash tables: those whose keys are compared ++ with eq, those whose keys are compared with eql, those whose keys ++ are compared with equal, and ++ ++ those whose keys are compared with equalp. ++ ++- ++ Hash tables are created by make-hash-table. gethash is used to ++ look up a key and find the associated value. New entries are added ++ to hash tables using setf with gethash. remhash is used to remove ++ an entry. For example: ++ ++ (setq a (make-hash-table)) => # ++ (setf (gethash 'color a) 'brown) => BROWN ++ (setf (gethash 'name a) 'fred) => FRED ++ (gethash 'color a) => BROWN, true ++ (gethash 'name a) => FRED, true ++ (gethash 'pointy a) => NIL, false ++ ++ In this example, the symbols color and name are being used as keys, ++ and the symbols brown and fred are being used as the associated ++ values. The hash table has two items in it, one of which ++ associates from color to brown, and the other of which associates ++ from name to fred. ++ ++- ++ A key or a value may be any object. ++ ++- ++ The existence of an entry in the hash table can be determined from ++ the secondary value returned by gethash. ++ ++ clrhash hash-table-p remhash ++ gethash make-hash-table sxhash ++ hash-table-count maphash ++ ++ Figure 18-1: Hash-table defined names ++ ++ ++ ++File: gcl.info, Node: Modifying Hash Table Keys, Prev: Hash-Table Operations, Up: Hash Table Concepts ++ ++18.1.2 Modifying Hash Table Keys ++-------------------------------- ++ ++The function supplied as the :test argument to make-hash-table specifies ++the 'equivalence test' for the hash table it creates. ++ ++ An object is 'visibly modified' with regard to an equivalence test if ++there exists some set of objects (or potential objects) which are ++equivalent to the object before the modification but are no longer ++equivalent afterwards. ++ ++ If an object O_1 is used as a key in a hash table H and is then ++visibly modified with regard to the equivalence test of H, then the ++consequences are unspecified if O_1, or any object O_2 equivalent to O_1 ++under the equivalence test (either before or after the modification), is ++used as a key in further operations on H. The consequences of using O_1 ++as a key are unspecified even if O_1 is visibly modified and then later ++modified again in such a way as to undo the visible modification. ++ ++ Following are specifications of the modifications which are visible ++to the equivalence tests which must be supported by hash tables. The ++modifications are described in terms of modification of components, and ++are defined recursively. Visible modifications of components of the ++object are visible modifications of the object. ++ ++* Menu: ++ ++* Visible Modification of Objects with respect to EQ and EQL:: ++* Visible Modification of Objects with respect to EQUAL:: ++* Visible Modification of Conses with respect to EQUAL:: ++* Visible Modification of Bit Vectors and Strings with respect to EQUAL:: ++* Visible Modification of Objects with respect to EQUALP:: ++* Visible Modification of Structures with respect to EQUALP:: ++* Visible Modification of Arrays with respect to EQUALP:: ++* Visible Modification of Hash Tables with respect to EQUALP:: ++* Visible Modifications by Language Extensions:: ++ ++ ++File: gcl.info, Node: Visible Modification of Objects with respect to EQ and EQL, Next: Visible Modification of Objects with respect to EQUAL, Prev: Modifying Hash Table Keys, Up: Modifying Hash Table Keys ++ ++18.1.2.1 Visible Modification of Objects with respect to EQ and EQL ++................................................................... ++ ++No standardized function is provided that is capable of visibly ++modifying an object with regard to eq or eql. ++ ++ ++File: gcl.info, Node: Visible Modification of Objects with respect to EQUAL, Next: Visible Modification of Conses with respect to EQUAL, Prev: Visible Modification of Objects with respect to EQ and EQL, Up: Modifying Hash Table Keys ++ ++18.1.2.2 Visible Modification of Objects with respect to EQUAL ++.............................................................. ++ ++As a consequence of the behavior for equal, the rules for visible ++modification of objects not explicitly mentioned in this section are ++inherited from those in *note Visible Modification of Objects with ++respect to EQ and EQL::. ++ ++ ++File: gcl.info, Node: Visible Modification of Conses with respect to EQUAL, Next: Visible Modification of Bit Vectors and Strings with respect to EQUAL, Prev: Visible Modification of Objects with respect to EQUAL, Up: Modifying Hash Table Keys ++ ++18.1.2.3 Visible Modification of Conses with respect to EQUAL ++............................................................. ++ ++Any visible change to the car or the cdr of a cons is considered a ++visible modification with regard to equal. ++ ++ ++File: gcl.info, Node: Visible Modification of Bit Vectors and Strings with respect to EQUAL, Next: Visible Modification of Objects with respect to EQUALP, Prev: Visible Modification of Conses with respect to EQUAL, Up: Modifying Hash Table Keys ++ ++18.1.2.4 Visible Modification of Bit Vectors and Strings with respect to EQUAL ++.............................................................................. ++ ++For a vector of type bit-vector or of type string, any visible change to ++an active element of the vector, or to the length of the vector (if it ++is actually adjustable or has a fill pointer) is considered a visible ++modification with regard to equal. ++ ++ ++File: gcl.info, Node: Visible Modification of Objects with respect to EQUALP, Next: Visible Modification of Structures with respect to EQUALP, Prev: Visible Modification of Bit Vectors and Strings with respect to EQUAL, Up: Modifying Hash Table Keys ++ ++18.1.2.5 Visible Modification of Objects with respect to EQUALP ++............................................................... ++ ++As a consequence of the behavior for equalp, the rules for visible ++modification of objects not explicitly mentioned in this section are ++inherited from those in *note Visible Modification of Objects with ++respect to EQUAL::. ++ ++ ++File: gcl.info, Node: Visible Modification of Structures with respect to EQUALP, Next: Visible Modification of Arrays with respect to EQUALP, Prev: Visible Modification of Objects with respect to EQUALP, Up: Modifying Hash Table Keys ++ ++18.1.2.6 Visible Modification of Structures with respect to EQUALP ++.................................................................. ++ ++Any visible change to a slot of a structure is considered a visible ++modification with regard to equalp. ++ ++ ++File: gcl.info, Node: Visible Modification of Arrays with respect to EQUALP, Next: Visible Modification of Hash Tables with respect to EQUALP, Prev: Visible Modification of Structures with respect to EQUALP, Up: Modifying Hash Table Keys ++ ++18.1.2.7 Visible Modification of Arrays with respect to EQUALP ++.............................................................. ++ ++In an array, any visible change to an active element, to the fill ++pointer (if the array can and does have one), or to the dimensions (if ++the array is actually adjustable) is considered a visible modification ++with regard to equalp. ++ ++ ++File: gcl.info, Node: Visible Modification of Hash Tables with respect to EQUALP, Next: Visible Modifications by Language Extensions, Prev: Visible Modification of Arrays with respect to EQUALP, Up: Modifying Hash Table Keys ++ ++18.1.2.8 Visible Modification of Hash Tables with respect to EQUALP ++................................................................... ++ ++In a hash table, any visible change to the count of entries in the hash ++table, to the keys, or to the values associated with the keys is ++considered a visible modification with regard to equalp. ++ ++ Note that the visibility of modifications to the keys depends on the ++equivalence test of the hash table, not on the specification of equalp. ++ ++ ++File: gcl.info, Node: Visible Modifications by Language Extensions, Prev: Visible Modification of Hash Tables with respect to EQUALP, Up: Modifying Hash Table Keys ++ ++18.1.2.9 Visible Modifications by Language Extensions ++..................................................... ++ ++Implementations that extend the language by providing additional mutator ++functions (or additional behavior for existing mutator functions) must ++document how the use of these extensions interacts with equivalence ++tests and hash table searches. ++ ++ Implementations that extend the language by defining additional ++acceptable equivalence tests for hash tables (allowing additional values ++for the :test argument to make-hash-table) must document the visible ++components of these tests. ++ ++ ++File: gcl.info, Node: Hash Tables Dictionary, Prev: Hash Table Concepts, Up: Hash Tables ++ ++18.2 Hash Tables Dictionary ++=========================== ++ ++* Menu: ++ ++* hash-table:: ++* make-hash-table:: ++* hash-table-p:: ++* hash-table-count:: ++* hash-table-rehash-size:: ++* hash-table-rehash-threshold:: ++* hash-table-size:: ++* hash-table-test:: ++* gethash:: ++* remhash:: ++* maphash:: ++* with-hash-table-iterator:: ++* clrhash:: ++* sxhash:: ++ ++ ++File: gcl.info, Node: hash-table, Next: make-hash-table, Prev: Hash Tables Dictionary, Up: Hash Tables Dictionary ++ ++18.2.1 hash-table [System Class] ++-------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++hash-table, t ++ ++Description:: ++............. ++ ++Hash tables provide a way of mapping any object (a key) to an associated ++object (a value). ++ ++See Also:: ++.......... ++ ++*note Hash Table Concepts::, *note Printing Other Objects:: ++ ++Notes:: ++....... ++ ++The intent is that this mapping be implemented by a hashing mechanism, ++such as that described in Section 6.4 "Hashing" of The Art of Computer ++Programming, Volume 3 (pp506-549). In spite of this intent, no ++conforming implementation is required to use any particular technique to ++implement the mapping. ++ ++ ++File: gcl.info, Node: make-hash-table, Next: hash-table-p, Prev: hash-table, Up: Hash Tables Dictionary ++ ++18.2.2 make-hash-table [Function] ++--------------------------------- ++ ++'make-hash-table' &key test size rehash-size rehash-threshold => ++hash-table ++ ++Arguments and Values:: ++...................... ++ ++test--a designator for one of the functions eq, eql, equal, or ++ ++ equalp. ++ ++ The default is eql. ++ ++ size--a non-negative integer. ++ ++ The default is implementation-dependent. ++ ++ rehash-size--a real of type (or (integer 1 *) (float (1.0) *)). The ++default is implementation-dependent. ++ ++ rehash-threshold--a real of type (real 0 1). The default is ++implementation-dependent. ++ ++ hash-table--a hash table. ++ ++Description:: ++............. ++ ++Creates and returns a new hash table. ++ ++ test determines how keys are compared. An object is said to be ++present in the hash-table if that object is the same under the test as ++the key for some entry in the hash-table. ++ ++ size is a hint to the implementation about how much initial space to ++allocate in the hash-table. ++ ++ This information, taken together with the rehash-threshold, controls ++the approximate number of entries which it should be possible to insert ++before the table has to grow. ++ ++ The actual size might be rounded up from size to the next 'good' ++size; for example, some implementations might round to the next prime ++number. ++ ++ rehash-size specifies a minimum amount to increase the size of the ++hash-table when it becomes full enough to require rehashing; see ++rehash-theshold below. ++ ++ If rehash-size is an integer, the expected growth rate for the table ++is additive and the integer is the number of entries to add; if it is a ++float, the expected growth rate for the table is multiplicative and the ++float is the ratio of the new size to the old size. ++ ++ As with size, the actual size of the increase might be rounded up. ++ ++ rehash-threshold specifies how full the hash-table can get before it ++must grow. ++ ++ It specifies the maximum desired hash-table occupancy level. ++ ++ The values of rehash-size and rehash-threshold do not constrain the ++implementation to use any particular method for computing when and by ++how much the size of hash-table should be enlarged. Such decisions are ++implementation-dependent, and these values only hints from the ++programmer to the implementation, and the implementation is permitted to ++ignore them. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (setf (gethash "one" table) 1) => 1 ++ (gethash "one" table) => NIL, false ++ (setq table (make-hash-table :test 'equal)) => # ++ (setf (gethash "one" table) 1) => 1 ++ (gethash "one" table) => 1, T ++ (make-hash-table :rehash-size 1.5 :rehash-threshold 0.7) ++ => # ++ ++See Also:: ++.......... ++ ++*note gethash:: , hash-table ++ ++ ++File: gcl.info, Node: hash-table-p, Next: hash-table-count, Prev: make-hash-table, Up: Hash Tables Dictionary ++ ++18.2.3 hash-table-p [Function] ++------------------------------ ++ ++'hash-table-p' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type hash-table; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (hash-table-p table) => true ++ (hash-table-p 37) => false ++ (hash-table-p '((a . 1) (b . 2))) => false ++ ++Notes:: ++....... ++ ++ (hash-table-p object) == (typep object 'hash-table) ++ ++ ++File: gcl.info, Node: hash-table-count, Next: hash-table-rehash-size, Prev: hash-table-p, Up: Hash Tables Dictionary ++ ++18.2.4 hash-table-count [Function] ++---------------------------------- ++ ++'hash-table-count' hash-table => count ++ ++Arguments and Values:: ++...................... ++ ++hash-table--a hash table. ++ ++ count--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the number of entries in the hash-table. If hash-table has just ++been created or newly cleared (see clrhash) the entry count is 0. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (hash-table-count table) => 0 ++ (setf (gethash 57 table) "fifty-seven") => "fifty-seven" ++ (hash-table-count table) => 1 ++ (dotimes (i 100) (setf (gethash i table) i)) => NIL ++ (hash-table-count table) => 100 ++ ++Affected By:: ++............. ++ ++clrhash, remhash, setf of gethash ++ ++See Also:: ++.......... ++ ++*note hash-table-size:: ++ ++Notes:: ++....... ++ ++The following relationships are functionally correct, although in ++practice using hash-table-count is probably much faster: ++ ++ (hash-table-count table) == ++ (loop for value being the hash-values of table count t) == ++ (let ((total 0)) ++ (maphash #'(lambda (key value) ++ (declare (ignore key value)) ++ (incf total)) ++ table) ++ total) ++ ++ ++File: gcl.info, Node: hash-table-rehash-size, Next: hash-table-rehash-threshold, Prev: hash-table-count, Up: Hash Tables Dictionary ++ ++18.2.5 hash-table-rehash-size [Function] ++---------------------------------------- ++ ++'hash-table-rehash-size' hash-table => rehash-size ++ ++Arguments and Values:: ++...................... ++ ++hash-table--a hash table. ++ ++ rehash-size--a real of type (or (integer 1 *) (float (1.0) *)). ++ ++Description:: ++............. ++ ++Returns the current rehash size of hash-table, suitable for use in a ++call to make-hash-table in order to produce a hash table with state ++corresponding to the current state of the hash-table. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table :size 100 :rehash-size 1.4)) ++ => # ++ (hash-table-rehash-size table) => 1.4 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if hash-table is not a hash ++table. ++ ++See Also:: ++.......... ++ ++*note make-hash-table:: , *note hash-table-rehash-threshold:: ++ ++Notes:: ++....... ++ ++If the hash table was created with an integer rehash size, the result is ++an integer, indicating that the rate of growth of the hash-table when ++rehashed is intended to be additive; otherwise, the result is a float, ++indicating that the rate of growth of the hash-table when rehashed is ++intended to be multiplicative. However, this value is only advice to ++the implementation; the actual amount by which the hash-table will grow ++upon rehash is implementation-dependent. ++ ++ ++File: gcl.info, Node: hash-table-rehash-threshold, Next: hash-table-size, Prev: hash-table-rehash-size, Up: Hash Tables Dictionary ++ ++18.2.6 hash-table-rehash-threshold [Function] ++--------------------------------------------- ++ ++'hash-table-rehash-threshold' hash-table => rehash-threshold ++ ++Arguments and Values:: ++...................... ++ ++hash-table--a hash table. ++ ++ rehash-threshold--a real of type (real 0 1). ++ ++Description:: ++............. ++ ++Returns the current rehash threshold of hash-table, which is suitable ++for use in a call to make-hash-table in order to produce a hash table ++with state corresponding to the current state of the hash-table. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table :size 100 :rehash-threshold 0.5)) ++ => # ++ (hash-table-rehash-threshold table) => 0.5 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if hash-table is not a hash ++table. ++ ++See Also:: ++.......... ++ ++*note make-hash-table:: , *note hash-table-rehash-size:: ++ ++ ++File: gcl.info, Node: hash-table-size, Next: hash-table-test, Prev: hash-table-rehash-threshold, Up: Hash Tables Dictionary ++ ++18.2.7 hash-table-size [Function] ++--------------------------------- ++ ++'hash-table-size' hash-table => size ++ ++Arguments and Values:: ++...................... ++ ++hash-table--a hash table. ++ ++ size--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns the current size of hash-table, which is suitable for use in a ++call to make-hash-table in order to produce a hash table with state ++corresponding to the current state of the hash-table. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if hash-table is not a hash ++table. ++ ++See Also:: ++.......... ++ ++*note hash-table-count:: , *note make-hash-table:: ++ ++ ++File: gcl.info, Node: hash-table-test, Next: gethash, Prev: hash-table-size, Up: Hash Tables Dictionary ++ ++18.2.8 hash-table-test [Function] ++--------------------------------- ++ ++'hash-table-test' hash-table => test ++ ++Arguments and Values:: ++...................... ++ ++hash-table--a hash table. ++ ++ test--a function designator. For the four standardized hash table ++test functions (see make-hash-table), the test value returned is always ++a symbol. If an implementation permits additional tests, it is ++implementation-dependent whether such tests are returned as function ++objects or function names. ++ ++Description:: ++............. ++ ++Returns the test used for comparing keys in hash-table. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if hash-table is not a hash ++table. ++ ++See Also:: ++.......... ++ ++*note make-hash-table:: ++ ++ ++File: gcl.info, Node: gethash, Next: remhash, Prev: hash-table-test, Up: Hash Tables Dictionary ++ ++18.2.9 gethash [Accessor] ++------------------------- ++ ++'gethash' key hash-table &optional default => value, present-p ++ ++ (setf (' gethash' key hash-table &optional default) new-value) ++ ++Arguments and Values:: ++...................... ++ ++key--an object. ++ ++ hash-table--a hash table. ++ ++ default--an object. The default is nil. ++ ++ value--an object. ++ ++ present-p--a generalized boolean. ++ ++Description:: ++............. ++ ++Value is the object in hash-table whose key is the same as key under the ++hash-table's equivalence test. If there is no such entry, value is the ++default. ++ ++ Present-p is true if an entry is found; otherwise, it is false. ++ ++ setf may be used with gethash to modify the value associated with a ++given key, or to add a new entry. ++ ++ When a gethash form is used as a setf place, any default which is ++supplied is evaluated according to normal left-to-right evaluation ++rules, but its value is ignored. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (gethash 1 table) => NIL, false ++ (gethash 1 table 2) => 2, false ++ (setf (gethash 1 table) "one") => "one" ++ (setf (gethash 2 table "two") "two") => "two" ++ (gethash 1 table) => "one", true ++ (gethash 2 table) => "two", true ++ (gethash nil table) => NIL, false ++ (setf (gethash nil table) nil) => NIL ++ (gethash nil table) => NIL, true ++ (defvar *counters* (make-hash-table)) => *COUNTERS* ++ (gethash 'foo *counters*) => NIL, false ++ (gethash 'foo *counters* 0) => 0, false ++ (defmacro how-many (obj) `(values (gethash ,obj *counters* 0))) => HOW-MANY ++ (defun count-it (obj) (incf (how-many obj))) => COUNT-IT ++ (dolist (x '(bar foo foo bar bar baz)) (count-it x)) ++ (how-many 'foo) => 2 ++ (how-many 'bar) => 3 ++ (how-many 'quux) => 0 ++ ++See Also:: ++.......... ++ ++*note remhash:: ++ ++Notes:: ++....... ++ ++The secondary value, present-p, can be used to distinguish the absence ++of an entry from the presence of an entry that has a value of default. ++ ++ ++File: gcl.info, Node: remhash, Next: maphash, Prev: gethash, Up: Hash Tables Dictionary ++ ++18.2.10 remhash [Function] ++-------------------------- ++ ++'remhash' key hash-table => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++key--an object. ++ ++ hash-table--a hash table. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Removes the entry for key in hash-table, if any. Returns true if there ++was such an entry, or false otherwise. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (setf (gethash 100 table) "C") => "C" ++ (gethash 100 table) => "C", true ++ (remhash 100 table) => true ++ (gethash 100 table) => NIL, false ++ (remhash 100 table) => false ++ ++Side Effects:: ++.............. ++ ++The hash-table is modified. ++ ++ ++File: gcl.info, Node: maphash, Next: with-hash-table-iterator, Prev: remhash, Up: Hash Tables Dictionary ++ ++18.2.11 maphash [Function] ++-------------------------- ++ ++'maphash' function hash-table => nil ++ ++Arguments and Values:: ++...................... ++ ++function--a designator for a function of two arguments, the key and the ++value. ++ ++ hash-table--a hash table. ++ ++Description:: ++............. ++ ++Iterates over all entries in the hash-table. For each entry, the ++function is called with two arguments-the key and the value of that ++entry. ++ ++ The consequences are unspecified if any attempt is made to add or ++remove an entry from the hash-table while a maphash is in progress, with ++two exceptions: the function can use can use setf of gethash to change ++the value part of the entry currently being processed, or it can use ++remhash to remove that entry. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (dotimes (i 10) (setf (gethash i table) i)) => NIL ++ (let ((sum-of-squares 0)) ++ (maphash #'(lambda (key val) ++ (let ((square (* val val))) ++ (incf sum-of-squares square) ++ (setf (gethash key table) square))) ++ table) ++ sum-of-squares) => 285 ++ (hash-table-count table) => 10 ++ (maphash #'(lambda (key val) ++ (when (oddp val) (remhash key table))) ++ table) => NIL ++ (hash-table-count table) => 5 ++ (maphash #'(lambda (k v) (print (list k v))) table) ++ (0 0) ++ (8 64) ++ (2 4) ++ (6 36) ++ (4 16) ++ => NIL ++ ++Side Effects:: ++.............. ++ ++None, other than any which might be done by the function. ++ ++See Also:: ++.......... ++ ++*note loop:: , *note with-hash-table-iterator:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: with-hash-table-iterator, Next: clrhash, Prev: maphash, Up: Hash Tables Dictionary ++ ++18.2.12 with-hash-table-iterator [Macro] ++---------------------------------------- ++ ++'with-hash-table-iterator' (name hash-table) {declaration}* {form}* => ++{result}* ++ ++Arguments and Values:: ++...................... ++ ++name--a name suitable for the first argument to macrolet. ++ ++ hash-table--a form, evaluated once, that should produce a hash table. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by forms. ++ ++Description:: ++............. ++ ++Within the lexical scope of the body, name is defined via macrolet such ++that successive invocations of (name) return the items, one by one, from ++the hash table that is obtained by evaluating hash-table only once. ++ ++ An invocation (name) returns three values as follows: ++ ++1. ++ A generalized boolean that is true if an entry is returned. ++2. ++ The key from the hash-table entry. ++3. ++ The value from the hash-table entry. ++ ++ After all entries have been returned by successive invocations of ++(name), then only one value is returned, namely nil. ++ ++ It is unspecified what happens if any of the implicit interior state ++of an iteration is returned outside the dynamic extent of the ++with-hash-table-iterator form such as by returning some closure over the ++invocation form. ++ ++ Any number of invocations of with-hash-table-iterator can be nested, ++and the body of the innermost one can invoke all of the locally ++established macros, provided all of those macros have distinct names. ++ ++Examples:: ++.......... ++ ++The following function should return t on any hash table, and signal an ++error if the usage of with-hash-table-iterator does not agree with the ++corresponding usage of maphash. ++ ++ (defun test-hash-table-iterator (hash-table) ++ (let ((all-entries '()) ++ (generated-entries '()) ++ (unique (list nil))) ++ (maphash #'(lambda (key value) (push (list key value) all-entries)) ++ hash-table) ++ (with-hash-table-iterator (generator-fn hash-table) ++ (loop ++ (multiple-value-bind (more? key value) (generator-fn) ++ (unless more? (return)) ++ (unless (eql value (gethash key hash-table unique)) ++ (error "Key ~S not found for value ~S" key value)) ++ (push (list key value) generated-entries)))) ++ (unless (= (length all-entries) ++ (length generated-entries) ++ (length (union all-entries generated-entries ++ :key #'car :test (hash-table-test hash-table)))) ++ (error "Generated entries and Maphash entries don't correspond")) ++ t)) ++ ++ The following could be an acceptable definition of maphash, ++implemented by with-hash-table-iterator. ++ ++ (defun maphash (function hash-table) ++ (with-hash-table-iterator (next-entry hash-table) ++ (loop (multiple-value-bind (more key value) (next-entry) ++ (unless more (return nil)) ++ (funcall function key value))))) ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if the local function named name ++established by with-hash-table-iterator is called after it has returned ++false as its primary value. ++ ++See Also:: ++.......... ++ ++*note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: clrhash, Next: sxhash, Prev: with-hash-table-iterator, Up: Hash Tables Dictionary ++ ++18.2.13 clrhash [Function] ++-------------------------- ++ ++'clrhash' hash-table => hash-table ++ ++Arguments and Values:: ++...................... ++ ++hash-table--a hash table. ++ ++Description:: ++............. ++ ++Removes all entries from hash-table, and then returns that empty hash ++table. ++ ++Examples:: ++.......... ++ ++ (setq table (make-hash-table)) => # ++ (dotimes (i 100) (setf (gethash i table) (format nil "~R" i))) => NIL ++ (hash-table-count table) => 100 ++ (gethash 57 table) => "fifty-seven", true ++ (clrhash table) => # ++ (hash-table-count table) => 0 ++ (gethash 57 table) => NIL, false ++ ++Side Effects:: ++.............. ++ ++The hash-table is modified. ++ ++ ++File: gcl.info, Node: sxhash, Prev: clrhash, Up: Hash Tables Dictionary ++ ++18.2.14 sxhash [Function] ++------------------------- ++ ++'sxhash' object => hash-code ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ hash-code--a non-negative fixnum. ++ ++Description:: ++............. ++ ++sxhash returns a hash code for object. ++ ++ The manner in which the hash code is computed is ++implementation-dependent, but subject to certain constraints: ++ ++1. ++ (equal x y) implies (= (sxhash x) (sxhash y)). ++ ++2. ++ For any two objects, x and y, both of which are bit vectors, ++ characters, conses, numbers, pathnames, strings, or symbols, and ++ which are similar, (sxhash x) and (sxhash y) yield the same ++ mathematical value even if x and y exist in different Lisp images ++ of the same implementation. See *note Literal Objects in Compiled ++ Files::. ++ ++3. ++ The hash-code for an object is always the same within a single ++ session provided that the object is not visibly modified with ++ regard to the equivalence test equal. See *note Modifying Hash ++ Table Keys::. ++ ++4. ++ The hash-code is intended for hashing. This places no verifiable ++ constraint on a conforming implementation, but the intent is that ++ an implementation should make a good-faith effort to produce ++ hash-codes that are well distributed within the range of ++ non-negative fixnums. ++ ++5. ++ Computation of the hash-code must terminate, even if the object ++ contains circularities. ++ ++Examples:: ++.......... ++ ++ (= (sxhash (list 'list "ab")) (sxhash (list 'list "ab"))) => true ++ (= (sxhash "a") (sxhash (make-string 1 :initial-element #\a))) => true ++ (let ((r (make-random-state))) ++ (= (sxhash r) (sxhash (make-random-state r)))) ++ => implementation-dependent ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++Notes:: ++....... ++ ++Many common hashing needs are satisfied by make-hash-table and the ++related functions on hash tables. sxhash is intended for use where the ++pre-defined abstractions are insufficient. Its main intent is to allow ++the user a convenient means of implementing more complicated hashing ++paradigms than are provided through hash tables. ++ ++ The hash codes returned by sxhash are not necessarily related to any ++hashing strategy used by any other function in Common Lisp. ++ ++ For objects of types that equal compares with eq, item 3 requires ++that the hash-code be based on some immutable quality of the identity of ++the object. Another legitimate implementation technique would be to ++have sxhash assign (and cache) a random hash code for these objects, ++since there is no requirement that similar but non-eq objects have the ++same hash code. ++ ++ Although similarity is defined for symbols in terms of both the ++symbol's name and the packages in which the symbol is accessible, item 3 ++disallows using package information to compute the hash code, since ++changes to the package status of a symbol are not visible to equal. ++ ++ ++File: gcl.info, Node: Filenames, Next: Files, Prev: Hash Tables, Up: Top ++ ++19 Filenames ++************ ++ ++* Menu: ++ ++* Overview of Filenames:: ++* Pathnames:: ++* Logical Pathnames:: ++* Filenames Dictionary:: ++ ++ ++File: gcl.info, Node: Overview of Filenames, Next: Pathnames, Prev: Filenames, Up: Filenames ++ ++19.1 Overview of Filenames ++========================== ++ ++There are many kinds of file systems, varying widely both in their ++superficial syntactic details, and in their underlying power and ++structure. The facilities provided by Common Lisp for referring to and ++manipulating files has been chosen to be compatible with many kinds of ++file systems, while at the same time minimizing the program-visible ++differences between kinds of file systems. ++ ++ Since file systems vary in their conventions for naming files, there ++are two distinct ways to represent filenames: as namestrings and as ++pathnames. ++ ++* Menu: ++ ++* Namestrings as Filenames:: ++* Pathnames as Filenames:: ++* Parsing Namestrings Into Pathnames:: ++ ++ ++File: gcl.info, Node: Namestrings as Filenames, Next: Pathnames as Filenames, Prev: Overview of Filenames, Up: Overview of Filenames ++ ++19.1.1 Namestrings as Filenames ++------------------------------- ++ ++A namestring is a string that represents a filename. ++ ++ In general, the syntax of namestrings involves the use of ++implementation-defined conventions, usually those customary for the file ++system in which the named file resides. The only exception is the ++syntax of a logical pathname namestring, which is defined in this ++specification; see *note Syntax of Logical Pathname Namestrings::. ++ ++ A conforming program must never unconditionally use a literal ++namestring other than a logical pathname namestring because Common Lisp ++does not define any namestring syntax other than that for logical ++pathnames that would be guaranteed to be portable. However, a ++conforming program can, if it is careful, successfully manipulate ++user-supplied data which contains or refers to non-portable namestrings. ++ ++ A namestring can be coerced to a pathname by the functions pathname ++or parse-namestring. ++ ++ ++File: gcl.info, Node: Pathnames as Filenames, Next: Parsing Namestrings Into Pathnames, Prev: Namestrings as Filenames, Up: Overview of Filenames ++ ++19.1.2 Pathnames as Filenames ++----------------------------- ++ ++Pathnames are structured objects that can represent, in an ++implementation-independent way, the filenames that are used natively by ++an underlying file system. ++ ++ In addition, pathnames can also represent certain partially composed ++filenames for which an underlying file system might not have a specific ++namestring representation. ++ ++ A pathname need not correspond to any file that actually exists, and ++more than one pathname can refer to the same file. For example, the ++pathname with a version of :newest might refer to the same file as a ++pathname with the same components except a certain number as the ++version. Indeed, a pathname with version :newest might refer to ++different files as time passes, because the meaning of such a pathname ++depends on the state of the file system. ++ ++ Some file systems naturally use a structural model for their ++filenames, while others do not. Within the Common Lisp pathname model, ++all filenames are seen as having a particular structure, even if that ++structure is not reflected in the underlying file system. The nature of ++the mapping between structure imposed by pathnames and the structure, if ++any, that is used by the underlying file system is ++implementation-defined. ++ ++ Every pathname has six components: a host, a device, a directory, a ++name, a type, and a version. By naming files with pathnames, Common ++Lisp programs can work in essentially the same way even in file systems ++that seem superficially quite different. For a detailed description of ++these components, see *note Pathname Components::. ++ ++ The mapping of the pathname components into the concepts peculiar to ++each file system is implementation-defined. There exist conceivable ++pathnames for which there is no mapping to a syntactically valid ++filename in a particular implementation. An implementation may use ++various strategies in an attempt to find a mapping; for example, an ++implementation may quietly truncate filenames that exceed length ++limitations imposed by the underlying file system, or ignore certain ++pathname components for which the file system provides no support. If ++such a mapping cannot be found, an error of type file-error is signaled. ++ ++ The time at which this mapping and associated error signaling occurs ++is implementation-dependent. Specifically, it may occur at the time the ++pathname is constructed, when coercing a pathname to a namestring, or ++when an attempt is made to open or otherwise access the file designated ++by the pathname. ++ ++ Figure 19-1 lists some defined names that are applicable to ++pathnames. ++ ++ *default-pathname-defaults* namestring pathname-name ++ directory-namestring open pathname-type ++ enough-namestring parse-namestring pathname-version ++ file-namestring pathname pathnamep ++ file-string-length pathname-device translate-pathname ++ host-namestring pathname-directory truename ++ make-pathname pathname-host user-homedir-pathname ++ merge-pathnames pathname-match-p wild-pathname-p ++ ++ Figure 19-1: Pathname Operations ++ ++ ++ ++File: gcl.info, Node: Parsing Namestrings Into Pathnames, Prev: Pathnames as Filenames, Up: Overview of Filenames ++ ++19.1.3 Parsing Namestrings Into Pathnames ++----------------------------------------- ++ ++Parsing is the operation used to convert a namestring into a pathname. ++ ++ Except in the case of parsing logical pathname namestrings, ++ ++ this operation is implementation-dependent, because the format of ++namestrings is implementation-dependent. ++ ++ A conforming implementation is free to accommodate other file system ++features in its pathname representation and provides a parser that can ++process such specifications in namestrings. Conforming programs must ++not depend on any such features, since those features will not be ++portable. ++ ++ ++File: gcl.info, Node: Pathnames, Next: Logical Pathnames, Prev: Overview of Filenames, Up: Filenames ++ ++19.2 Pathnames ++============== ++ ++* Menu: ++ ++* Pathname Components:: ++* Interpreting Pathname Component Values:: ++* Merging Pathnames:: ++ ++ ++File: gcl.info, Node: Pathname Components, Next: Interpreting Pathname Component Values, Prev: Pathnames, Up: Pathnames ++ ++19.2.1 Pathname Components ++-------------------------- ++ ++A pathname has six components: a host, a device, a directory, a name, a ++type, and a version. ++ ++* Menu: ++ ++* The Pathname Host Component:: ++* The Pathname Device Component:: ++* The Pathname Directory Component:: ++* The Pathname Name Component:: ++* The Pathname Type Component:: ++* The Pathname Version Component:: ++ ++ ++File: gcl.info, Node: The Pathname Host Component, Next: The Pathname Device Component, Prev: Pathname Components, Up: Pathname Components ++ ++19.2.1.1 The Pathname Host Component ++.................................... ++ ++The name of the file system on which the file resides, or the name of a ++logical host. ++ ++ ++File: gcl.info, Node: The Pathname Device Component, Next: The Pathname Directory Component, Prev: The Pathname Host Component, Up: Pathname Components ++ ++19.2.1.2 The Pathname Device Component ++...................................... ++ ++Corresponds to the "device" or "file structure" concept in many host ++file systems: the name of a logical or physical device containing files. ++ ++ ++File: gcl.info, Node: The Pathname Directory Component, Next: The Pathname Name Component, Prev: The Pathname Device Component, Up: Pathname Components ++ ++19.2.1.3 The Pathname Directory Component ++......................................... ++ ++Corresponds to the "directory" concept in many host file systems: the ++name of a group of related files. ++ ++ ++File: gcl.info, Node: The Pathname Name Component, Next: The Pathname Type Component, Prev: The Pathname Directory Component, Up: Pathname Components ++ ++19.2.1.4 The Pathname Name Component ++.................................... ++ ++The "name" part of a group of files that can be thought of as ++conceptually related. ++ ++ ++File: gcl.info, Node: The Pathname Type Component, Next: The Pathname Version Component, Prev: The Pathname Name Component, Up: Pathname Components ++ ++19.2.1.5 The Pathname Type Component ++.................................... ++ ++Corresponds to the "filetype" or "extension" concept in many host file ++systems. This says what kind of file this is. This component is always ++a string, nil, :wild, or :unspecific. ++ ++ ++File: gcl.info, Node: The Pathname Version Component, Prev: The Pathname Type Component, Up: Pathname Components ++ ++19.2.1.6 The Pathname Version Component ++....................................... ++ ++Corresponds to the "version number" concept in many host file systems. ++ ++ The version is either a positive integer or a symbol from the ++following list: nil, :wild, :unspecific, or :newest (refers to the ++largest version number that already exists in the file system when ++reading a file, or to a version number greater than any already existing ++in the file system when writing a new file). Implementations can define ++other special version symbols. ++ ++ ++File: gcl.info, Node: Interpreting Pathname Component Values, Next: Merging Pathnames, Prev: Pathname Components, Up: Pathnames ++ ++19.2.2 Interpreting Pathname Component Values ++--------------------------------------------- ++ ++* Menu: ++ ++* Strings in Component Values:: ++* Special Characters in Pathname Components:: ++* Case in Pathname Components:: ++* Local Case in Pathname Components:: ++* Common Case in Pathname Components:: ++* Special Pathname Component Values:: ++* NIL as a Component Value:: ++* ->WILD as a Component Value:: ++* ->UNSPECIFIC as a Component Value:: ++* Relation between component values NIL and ->UNSPECIFIC:: ++* Restrictions on Wildcard Pathnames:: ++* Restrictions on Examining Pathname Components:: ++* Restrictions on Examining a Pathname Host Component:: ++* Restrictions on Examining a Pathname Device Component:: ++* Restrictions on Examining a Pathname Directory Component:: ++* Directory Components in Non-Hierarchical File Systems:: ++* Restrictions on Examining a Pathname Name Component:: ++* Restrictions on Examining a Pathname Type Component:: ++* Restrictions on Examining a Pathname Version Component:: ++* Notes about the Pathname Version Component:: ++* Restrictions on Constructing Pathnames:: ++ ++ ++File: gcl.info, Node: Strings in Component Values, Next: Special Characters in Pathname Components, Prev: Interpreting Pathname Component Values, Up: Interpreting Pathname Component Values ++ ++19.2.2.1 Strings in Component Values ++.................................... ++ ++ ++File: gcl.info, Node: Special Characters in Pathname Components, Next: Case in Pathname Components, Prev: Strings in Component Values, Up: Interpreting Pathname Component Values ++ ++19.2.2.2 Special Characters in Pathname Components ++.................................................. ++ ++Strings in pathname component values never contain special characters ++that represent separation between pathname fields, such as slash in Unix ++filenames. Whether separator characters are permitted as part of a ++string in a pathname component is implementation-defined; however, if ++the implementation does permit it, it must arrange to properly "quote" ++the character for the file system when constructing a namestring. For ++example, ++ ++ ;; In a TOPS-20 implementation, which uses ^V to quote ++ (NAMESTRING (MAKE-PATHNAME :HOST "OZ" :NAME "")) ++ => #P"OZ:PS:^V" ++ NOT=> #P"OZ:PS:" ++ ++ ++File: gcl.info, Node: Case in Pathname Components, Next: Local Case in Pathname Components, Prev: Special Characters in Pathname Components, Up: Interpreting Pathname Component Values ++ ++19.2.2.3 Case in Pathname Components ++.................................... ++ ++Namestrings always use local file system case conventions, but Common ++Lisp functions that manipulate pathname components allow the caller to ++select either of two conventions for representing case in component ++values by supplying a value for the :case keyword argument. Figure 19-2 ++lists the functions relating to pathnames that permit a :case argument: ++ ++ make-pathname pathname-directory pathname-name ++ pathname-device pathname-host pathname-type ++ ++ Figure 19-2: Pathname functions using a :CASE argument ++ ++ ++ ++File: gcl.info, Node: Local Case in Pathname Components, Next: Common Case in Pathname Components, Prev: Case in Pathname Components, Up: Interpreting Pathname Component Values ++ ++19.2.2.4 Local Case in Pathname Components ++.......................................... ++ ++For the functions in Figure~19-2, a value of :local for the :case ++argument (the default for these functions) indicates that the functions ++should receive and yield strings in component values as if they were ++already represented according to the host file system's convention for ++case. ++ ++ If the file system supports both cases, strings given or received as ++pathname component values under this protocol are to be used exactly as ++written. If the file system only supports one case, the strings will be ++translated to that case. ++ ++ ++File: gcl.info, Node: Common Case in Pathname Components, Next: Special Pathname Component Values, Prev: Local Case in Pathname Components, Up: Interpreting Pathname Component Values ++ ++19.2.2.5 Common Case in Pathname Components ++........................................... ++ ++For the functions in Figure~19-2, a value of :common for the :case ++argument that these functions should receive and yield strings in ++component values according to the following conventions: ++ ++* ++ All uppercase means to use a file system's customary case. ++* ++ All lowercase means to use the opposite of the customary case. ++* ++ Mixed case represents itself. ++ ++ Note that these conventions have been chosen in such a way that ++translation from :local to :common and back to :local is ++information-preserving. ++ ++ ++File: gcl.info, Node: Special Pathname Component Values, Next: NIL as a Component Value, Prev: Common Case in Pathname Components, Up: Interpreting Pathname Component Values ++ ++19.2.2.6 Special Pathname Component Values ++.......................................... ++ ++ ++File: gcl.info, Node: NIL as a Component Value, Next: ->WILD as a Component Value, Prev: Special Pathname Component Values, Up: Interpreting Pathname Component Values ++ ++19.2.2.7 NIL as a Component Value ++................................. ++ ++As a pathname component value, nil represents that the component is ++"unfilled"; see *note Merging Pathnames::. ++ ++ The value of any pathname component can be nil. ++ ++ When constructing a pathname, nil in the host component might mean a ++default host rather than an actual nil in some implementations. ++ ++ ++File: gcl.info, Node: ->WILD as a Component Value, Next: ->UNSPECIFIC as a Component Value, Prev: NIL as a Component Value, Up: Interpreting Pathname Component Values ++ ++19.2.2.8 :WILD as a Component Value ++................................... ++ ++If :wild is the value of a pathname component, that component is ++considered to be a wildcard, which matches anything. ++ ++ A conforming program must be prepared to encounter a value of :wild ++as the value of any pathname component, or as an element of a list that ++is the value of the directory component. ++ ++ When constructing a pathname, a conforming program may use :wild as ++the value of any or all of the directory, name, type, or version ++component, but must not use :wild as the value of the host, or device ++component. ++ ++ If :wild is used as the value of the directory component in the ++construction of a pathname, the effect is equivalent to specifying the ++list (:absolute :wild-inferiors), or the same as (:absolute :wild) in a ++file system that does not support :wild-inferiors. ++ ++ ++File: gcl.info, Node: ->UNSPECIFIC as a Component Value, Next: Relation between component values NIL and ->UNSPECIFIC, Prev: ->WILD as a Component Value, Up: Interpreting Pathname Component Values ++ ++19.2.2.9 :UNSPECIFIC as a Component Value ++......................................... ++ ++If :unspecific is the value of a pathname component, the component is ++considered to be "absent" or to "have no meaning" in the filename being ++represented by the pathname. ++ ++ Whether a value of :unspecific is permitted for any component on any ++given file system accessible to the implementation is ++implementation-defined. A conforming program must never unconditionally ++use a :unspecific as the value of a pathname component because such a ++value is not guaranteed to be permissible in all implementations. ++However, a conforming program can, if it is careful, successfully ++manipulate user-supplied data which contains or refers to non-portable ++pathname components. And certainly a conforming program should be ++prepared for the possibility that any components of a pathname could be ++:unspecific. ++ ++ When reading_1 the value of any pathname component, conforming ++programs should be prepared for the value to be :unspecific. ++ ++ When writing_1 the value of any pathname component, the consequences ++are undefined if :unspecific is given for a pathname in a file system ++for which it does not make sense. ++ ++ ++File: gcl.info, Node: Relation between component values NIL and ->UNSPECIFIC, Next: Restrictions on Wildcard Pathnames, Prev: ->UNSPECIFIC as a Component Value, Up: Interpreting Pathname Component Values ++ ++19.2.2.10 Relation between component values NIL and :UNSPECIFIC ++............................................................... ++ ++If a pathname is converted to a namestring, the symbols nil and ++:unspecific cause the field to be treated as if it were empty. That is, ++both nil and :unspecific cause the component not to appear in the ++namestring. ++ ++ However, when merging a pathname with a set of defaults, only a nil ++value for a component will be replaced with the default for that ++component, while a value of :unspecific will be left alone as if the ++field were "filled"; see the function merge-pathnames and *note Merging ++Pathnames::. ++ ++ ++File: gcl.info, Node: Restrictions on Wildcard Pathnames, Next: Restrictions on Examining Pathname Components, Prev: Relation between component values NIL and ->UNSPECIFIC, Up: Interpreting Pathname Component Values ++ ++19.2.2.11 Restrictions on Wildcard Pathnames ++............................................ ++ ++Wildcard pathnames can be used with directory but not with open, and ++return true from wild-pathname-p. When examining wildcard components of ++a wildcard pathname, conforming programs must be prepared to encounter ++any of the following additional values in any component or any element ++of a list that is the directory component: ++ ++* ++ The symbol :wild, which matches anything. ++ ++* ++ A string containing implementation-dependent special wildcard ++ characters. ++ ++* ++ Any object, representing an implementation-dependent wildcard ++ pattern. ++ ++ ++File: gcl.info, Node: Restrictions on Examining Pathname Components, Next: Restrictions on Examining a Pathname Host Component, Prev: Restrictions on Wildcard Pathnames, Up: Interpreting Pathname Component Values ++ ++19.2.2.12 Restrictions on Examining Pathname Components ++....................................................... ++ ++The space of possible objects that a conforming program must be prepared ++to read_1 as the value of a pathname component is substantially larger ++than the space of possible objects that a conforming program is ++permitted to write_1 into such a component. ++ ++ While the values discussed in the subsections of this section, in ++*note Special Pathname Component Values::, and in *note Restrictions on ++Wildcard Pathnames:: apply to values that might be seen when reading the ++component values, substantially more restrictive rules apply to ++constructing pathnames; see *note Restrictions on Constructing ++Pathnames::. ++ ++ When examining pathname components, conforming programs should be ++aware of the following restrictions. ++ ++ ++File: gcl.info, Node: Restrictions on Examining a Pathname Host Component, Next: Restrictions on Examining a Pathname Device Component, Prev: Restrictions on Examining Pathname Components, Up: Interpreting Pathname Component Values ++ ++19.2.2.13 Restrictions on Examining a Pathname Host Component ++............................................................. ++ ++It is implementation-dependent what object is used to represent the ++host. ++ ++ ++File: gcl.info, Node: Restrictions on Examining a Pathname Device Component, Next: Restrictions on Examining a Pathname Directory Component, Prev: Restrictions on Examining a Pathname Host Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.14 Restrictions on Examining a Pathname Device Component ++............................................................... ++ ++The device might be a string, :wild, :unspecific, or nil. ++ ++ Note that :wild might result from an attempt to read_1 the pathname ++component, even though portable programs are restricted from writing_1 ++such a component value; see *note Restrictions on Wildcard Pathnames:: ++and *note Restrictions on Constructing Pathnames::. ++ ++ ++File: gcl.info, Node: Restrictions on Examining a Pathname Directory Component, Next: Directory Components in Non-Hierarchical File Systems, Prev: Restrictions on Examining a Pathname Device Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.15 Restrictions on Examining a Pathname Directory Component ++.................................................................. ++ ++The directory might be a string, :wild, :unspecific, or nil. ++ ++ The directory can be a list of strings and symbols. ++ ++ The car of the list is one of the symbols :absolute or :relative , ++meaning: ++ ++:absolute ++ A list whose car is the symbol :absolute represents a directory ++ path starting from the root directory. The list (:absolute) ++ represents the root directory. The list (:absolute "foo" "bar" ++ "baz") represents the directory called "/foo/bar/baz" in Unix ++ (except possibly for case). ++ ++:relative ++ A list whose car is the symbol :relative represents a directory ++ path starting from a default directory. The list (:relative) has ++ the same meaning as nil and hence is not used. The list (:relative ++ "foo" "bar") represents the directory named "bar" in the directory ++ named "foo" in the default directory. ++ ++ Each remaining element of the list is a string or a symbol. ++ ++ Each string names a single level of directory structure. The strings ++should contain only the directory names themselves--no punctuation ++characters. ++ ++ In place of a string, at any point in the list, symbols can occur to ++indicate special file notations. Figure 19-3 lists the symbols that ++have standard meanings. Implementations are permitted to add additional ++objects of any type that is disjoint from string if necessary to ++represent features of their file systems that cannot be represented with ++the standard strings and symbols. ++ ++ Supplying any non-string, including any of the symbols listed below, ++to a file system for which it does not make sense signals an error of ++type file-error. For example, Unix does not support :wild-inferiors in ++most implementations. ++ ++ Symbol Meaning ++ :wild Wildcard match of one level of directory structure ++ :wild-inferiors Wildcard match of any number of directory levels ++ :up Go upward in directory structure (semantic) ++ :back Go upward in directory structure (syntactic) ++ ++ Figure 19-3: Special Markers In Directory Component ++ ++ ++ The following notes apply to the previous figure: ++ ++Invalid Combinations ++ Using :absolute or :wild-inferiors immediately followed by :up or ++ :back signals an error of type file-error. ++ ++Syntactic vs Semantic ++ "Syntactic" means that the action of :back depends only on the ++ pathname and not on the contents of the file system. ++ ++ "Semantic" means that the action of :up depends on the contents of ++ the file system; to resolve a pathname containing :up to a pathname ++ whose directory component contains only :absolute and strings ++ requires probing the file system. ++ ++ :up differs from :back only in file systems that support multiple ++ names for directories, perhaps via symbolic links. For example, ++ suppose that there is a directory (:absolute "X" "Y" "Z") linked to ++ (:absolute "A" "B" "C") and there also exist directories (:absolute ++ "A" "B" "Q") and (:absolute "X" "Y" "Q"). Then (:absolute "X" "Y" ++ "Z" :up "Q") designates (:absolute "A" "B" "Q") while (:absolute ++ "X" "Y" "Z" :back "Q") designates (:absolute "X" "Y" "Q") ++ ++ ++File: gcl.info, Node: Directory Components in Non-Hierarchical File Systems, Next: Restrictions on Examining a Pathname Name Component, Prev: Restrictions on Examining a Pathname Directory Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.16 Directory Components in Non-Hierarchical File Systems ++............................................................... ++ ++In non-hierarchical file systems, the only valid list values for the ++directory component of a pathname are (:absolute string) and (:absolute ++:wild). :relative directories and the keywords :wild-inferiors, :up, ++and :back are not used in non-hierarchical file systems. ++ ++ ++File: gcl.info, Node: Restrictions on Examining a Pathname Name Component, Next: Restrictions on Examining a Pathname Type Component, Prev: Directory Components in Non-Hierarchical File Systems, Up: Interpreting Pathname Component Values ++ ++19.2.2.17 Restrictions on Examining a Pathname Name Component ++............................................................. ++ ++The name might be a string, :wild, :unspecific, or nil. ++ ++ ++File: gcl.info, Node: Restrictions on Examining a Pathname Type Component, Next: Restrictions on Examining a Pathname Version Component, Prev: Restrictions on Examining a Pathname Name Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.18 Restrictions on Examining a Pathname Type Component ++............................................................. ++ ++The type might be a string, :wild, :unspecific, or nil. ++ ++ ++File: gcl.info, Node: Restrictions on Examining a Pathname Version Component, Next: Notes about the Pathname Version Component, Prev: Restrictions on Examining a Pathname Type Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.19 Restrictions on Examining a Pathname Version Component ++................................................................ ++ ++The version can be any symbol or any integer. ++ ++ The symbol :newest refers to the largest version number that already ++exists in the file system when reading, overwriting, appending, ++superseding, or directory listing an existing file. The symbol :newest ++refers to the smallest version number greater than any existing version ++number when creating a new file. ++ ++ The symbols nil, :unspecific, and :wild have special meanings and ++restrictions; see *note Special Pathname Component Values:: and *note ++Restrictions on Constructing Pathnames::. ++ ++ Other symbols and integers have implementation-defined meaning. ++ ++ ++File: gcl.info, Node: Notes about the Pathname Version Component, Next: Restrictions on Constructing Pathnames, Prev: Restrictions on Examining a Pathname Version Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.20 Notes about the Pathname Version Component ++.................................................... ++ ++It is suggested, but not required, that implementations do the ++following: ++ ++* ++ Use positive integers starting at 1 as version numbers. ++ ++* ++ Recognize the symbol :oldest to designate the smallest existing ++ version number. ++ ++* ++ Use keywords for other special versions. ++ ++ ++File: gcl.info, Node: Restrictions on Constructing Pathnames, Prev: Notes about the Pathname Version Component, Up: Interpreting Pathname Component Values ++ ++19.2.2.21 Restrictions on Constructing Pathnames ++................................................ ++ ++When constructing a pathname from components, conforming programs must ++follow these rules: ++ ++* ++ Any component can be nil. nil in the host might mean a default ++ host rather than an actual nil in some implementations. ++ ++* ++ The host, device, directory, name, and type can be strings. There ++ are implementation-dependent limits on the number and type of ++ characters in these strings. ++ ++* ++ The directory can be a list of strings and symbols. There are ++ implementation-dependent limits on the list's length and contents. ++ ++* ++ The version can be :newest. ++ ++* ++ Any component can be taken from the corresponding component of ++ another pathname. When the two pathnames are for different file ++ systems (in implementations that support multiple file systems), an ++ appropriate translation occurs. If no meaningful translation is ++ possible, an error is signaled. The definitions of "appropriate" ++ and "meaningful" are implementation-dependent. ++ ++* ++ An implementation might support other values for some components, ++ but a portable program cannot use those values. A conforming ++ program can use implementation-dependent values but this can make ++ it non-portable; for example, it might work only with Unix file ++ systems. ++ ++ ++File: gcl.info, Node: Merging Pathnames, Prev: Interpreting Pathname Component Values, Up: Pathnames ++ ++19.2.3 Merging Pathnames ++------------------------ ++ ++Merging takes a pathname with unfilled components and supplies values ++for those components from a source of defaults. ++ ++ If a component's value is nil, that component is considered to be ++unfilled. If a component's value is any non-nil object, including ++:unspecific, that component is considered to be filled. ++ ++ Except as explicitly specified otherwise, for functions that ++manipulate or inquire about files in the file system, the pathname ++argument to such a function is merged with *default-pathname-defaults* ++before accessing the file system (as if by merge-pathnames). ++ ++* Menu: ++ ++* Examples of Merging Pathnames:: ++ ++ ++File: gcl.info, Node: Examples of Merging Pathnames, Prev: Merging Pathnames, Up: Merging Pathnames ++ ++19.2.3.1 Examples of Merging Pathnames ++...................................... ++ ++Although the following examples are possible to execute only in ++implementations which permit :unspecific in the indicated position ++andwhich permit four-letter type components, they serve to illustrate ++the basic concept of pathname merging. ++ ++ (pathname-type ++ (merge-pathnames (make-pathname :type "LISP") ++ (make-pathname :type "TEXT"))) ++ => "LISP" ++ ++ (pathname-type ++ (merge-pathnames (make-pathname :type nil) ++ (make-pathname :type "LISP"))) ++ => "LISP" ++ ++ (pathname-type ++ (merge-pathnames (make-pathname :type :unspecific) ++ (make-pathname :type "LISP"))) ++ => :UNSPECIFIC ++ ++ ++File: gcl.info, Node: Logical Pathnames, Next: Filenames Dictionary, Prev: Pathnames, Up: Filenames ++ ++19.3 Logical Pathnames ++====================== ++ ++* Menu: ++ ++* Syntax of Logical Pathname Namestrings:: ++* Logical Pathname Components:: ++ ++ ++File: gcl.info, Node: Syntax of Logical Pathname Namestrings, Next: Logical Pathname Components, Prev: Logical Pathnames, Up: Logical Pathnames ++ ++19.3.1 Syntax of Logical Pathname Namestrings ++--------------------------------------------- ++ ++The syntax of a logical pathname namestring is as follows. (Note that ++unlike many notational descriptions in this document, this is a ++syntactic description of character sequences, not a structural ++description of objects.) ++ ++ logical-pathname ::=[!host host-marker] ++ [!relative-directory-marker] {!directory directory-marker}* ++ [!name] [type-marker !type [version-marker !version]] ++ ++ host ::=!word ++ ++ directory ::=!word | !wildcard-word | !wild-inferiors-word ++ ++ name ::=!word | !wildcard-word ++ ++ type ::=!word | !wildcard-word ++ ++ version ::=!pos-int | newest-word | wildcard-version ++ ++ host-marker--a colon. ++ ++ relative-directory-marker--a semicolon. ++ ++ directory-marker--a semicolon. ++ ++ type-marker--a dot. ++ ++ version-marker--a dot. ++ ++ wild-inferiors-word--The two character sequence "**" (two asterisks). ++ ++ newest-word--The six character sequence "newest" or the six character ++sequence "NEWEST". ++ ++ wildcard-version--an asterisk. ++ ++ wildcard-word--one or more asterisks, uppercase letters, digits, and ++hyphens, including at least one asterisk, with no two asterisks ++adjacent. ++ ++ word--one or more uppercase letters, digits, and hyphens. ++ ++ pos-int--a positive integer. ++ ++* Menu: ++ ++* Additional Information about Parsing Logical Pathname Namestrings:: ++* The Host part of a Logical Pathname Namestring:: ++* The Device part of a Logical Pathname Namestring:: ++* The Directory part of a Logical Pathname Namestring:: ++* The Type part of a Logical Pathname Namestring:: ++* The Version part of a Logical Pathname Namestring:: ++* Wildcard Words in a Logical Pathname Namestring:: ++* Lowercase Letters in a Logical Pathname Namestring:: ++* Other Syntax in a Logical Pathname Namestring:: ++ ++ ++File: gcl.info, Node: Additional Information about Parsing Logical Pathname Namestrings, Next: The Host part of a Logical Pathname Namestring, Prev: Syntax of Logical Pathname Namestrings, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.1 Additional Information about Parsing Logical Pathname Namestrings ++.......................................................................... ++ ++ ++File: gcl.info, Node: The Host part of a Logical Pathname Namestring, Next: The Device part of a Logical Pathname Namestring, Prev: Additional Information about Parsing Logical Pathname Namestrings, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.2 The Host part of a Logical Pathname Namestring ++....................................................... ++ ++The host must have been defined as a logical pathname host; this can be ++done by using setf of logical-pathname-translations. ++ ++ The logical pathname host name "SYS" is reserved for the ++implementation. The existence and meaning of SYS: logical pathnames is ++implementation-defined. ++ ++ ++File: gcl.info, Node: The Device part of a Logical Pathname Namestring, Next: The Directory part of a Logical Pathname Namestring, Prev: The Host part of a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.3 The Device part of a Logical Pathname Namestring ++......................................................... ++ ++There is no syntax for a logical pathname device since the device ++component of a logical pathname is always :unspecific; see *note ++Unspecific Components of a Logical Pathname::. ++ ++ ++File: gcl.info, Node: The Directory part of a Logical Pathname Namestring, Next: The Type part of a Logical Pathname Namestring, Prev: The Device part of a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.4 The Directory part of a Logical Pathname Namestring ++............................................................ ++ ++If a relative-directory-marker precedes the directories, the directory ++component parsed is as relative; otherwise, the directory component is ++parsed as absolute. ++ ++ If a wild-inferiors-marker is specified, it parses into ++:wild-inferiors. ++ ++ ++File: gcl.info, Node: The Type part of a Logical Pathname Namestring, Next: The Version part of a Logical Pathname Namestring, Prev: The Directory part of a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.5 The Type part of a Logical Pathname Namestring ++....................................................... ++ ++The type of a logical pathname for a source file is "LISP". This should ++be translated into whatever type is appropriate in a physical pathname. ++ ++ ++File: gcl.info, Node: The Version part of a Logical Pathname Namestring, Next: Wildcard Words in a Logical Pathname Namestring, Prev: The Type part of a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.6 The Version part of a Logical Pathname Namestring ++.......................................................... ++ ++Some file systems do not have versions. Logical pathname translation to ++such a file system ignores the version. This implies that a program ++cannot rely on being able to store more than one version of a file named ++by a logical pathname. ++ ++ If a wildcard-version is specified, it parses into :wild. ++ ++ ++File: gcl.info, Node: Wildcard Words in a Logical Pathname Namestring, Next: Lowercase Letters in a Logical Pathname Namestring, Prev: The Version part of a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.7 Wildcard Words in a Logical Pathname Namestring ++........................................................ ++ ++Each asterisk in a wildcard-word matches a sequence of zero or more ++characters. The wildcard-word "*" parses into :wild; other ++wildcard-words parse into strings. ++ ++ ++File: gcl.info, Node: Lowercase Letters in a Logical Pathname Namestring, Next: Other Syntax in a Logical Pathname Namestring, Prev: Wildcard Words in a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.8 Lowercase Letters in a Logical Pathname Namestring ++........................................................... ++ ++When parsing words and wildcard-words, lowercase letters are translated ++to uppercase. ++ ++ ++File: gcl.info, Node: Other Syntax in a Logical Pathname Namestring, Prev: Lowercase Letters in a Logical Pathname Namestring, Up: Syntax of Logical Pathname Namestrings ++ ++19.3.1.9 Other Syntax in a Logical Pathname Namestring ++...................................................... ++ ++The consequences of using characters other than those specified here in ++a logical pathname namestring are unspecified. ++ ++ The consequences of using any value not specified here as a logical ++pathname component are unspecified. ++ ++ ++File: gcl.info, Node: Logical Pathname Components, Prev: Syntax of Logical Pathname Namestrings, Up: Logical Pathnames ++ ++19.3.2 Logical Pathname Components ++---------------------------------- ++ ++* Menu: ++ ++* Unspecific Components of a Logical Pathname:: ++* Null Strings as Components of a Logical Pathname:: ++ ++ ++File: gcl.info, Node: Unspecific Components of a Logical Pathname, Next: Null Strings as Components of a Logical Pathname, Prev: Logical Pathname Components, Up: Logical Pathname Components ++ ++19.3.2.1 Unspecific Components of a Logical Pathname ++.................................................... ++ ++The device component of a logical pathname is always :unspecific; no ++other component of a logical pathname can be :unspecific. ++ ++ ++File: gcl.info, Node: Null Strings as Components of a Logical Pathname, Prev: Unspecific Components of a Logical Pathname, Up: Logical Pathname Components ++ ++19.3.2.2 Null Strings as Components of a Logical Pathname ++......................................................... ++ ++The null string, "", is not a valid value for any component of a logical ++pathname. ++ ++ ++File: gcl.info, Node: Filenames Dictionary, Prev: Logical Pathnames, Up: Filenames ++ ++19.4 Filenames Dictionary ++========================= ++ ++* Menu: ++ ++* pathname (System Class):: ++* logical-pathname (System Class):: ++* pathname:: ++* make-pathname:: ++* pathnamep:: ++* pathname-host:: ++* load-logical-pathname-translations:: ++* logical-pathname-translations:: ++* logical-pathname:: ++* *default-pathname-defaults*:: ++* namestring:: ++* parse-namestring:: ++* wild-pathname-p:: ++* pathname-match-p:: ++* translate-logical-pathname:: ++* translate-pathname:: ++* merge-pathnames:: ++ ++ ++File: gcl.info, Node: pathname (System Class), Next: logical-pathname (System Class), Prev: Filenames Dictionary, Up: Filenames Dictionary ++ ++19.4.1 pathname [System Class] ++------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++pathname, t ++ ++Description:: ++............. ++ ++A pathname is a structured object which represents a filename. ++ ++ There are two kinds of pathnames--physical pathnames and logical ++pathnames. ++ ++ ++File: gcl.info, Node: logical-pathname (System Class), Next: pathname, Prev: pathname (System Class), Up: Filenames Dictionary ++ ++19.4.2 logical-pathname [System Class] ++-------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++logical-pathname, pathname, t ++ ++Description:: ++............. ++ ++A pathname that uses a namestring syntax that is ++implementation-independent, and that has component values that are ++implementation-independent. Logical pathnames do not refer directly to ++filenames ++ ++See Also:: ++.......... ++ ++*note File System Concepts::, *note Sharpsign P::, *note Printing ++Pathnames:: ++ ++ ++File: gcl.info, Node: pathname, Next: make-pathname, Prev: logical-pathname (System Class), Up: Filenames Dictionary ++ ++19.4.3 pathname [Function] ++-------------------------- ++ ++'pathname' pathspec => pathname ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a pathname designator. ++ ++ pathname--a pathname. ++ ++Description:: ++............. ++ ++Returns the pathname denoted by pathspec. ++ ++ If the pathspec designator is a stream, the stream can be either open ++or closed; in both cases, the pathname returned corresponds to the ++filename used to open the file. pathname returns the same pathname for ++a file stream after it is closed as it did when it was open. ++ ++ If the pathspec designator is a file stream created by opening a ++logical pathname, a logical pathname is returned. ++ ++Examples:: ++.......... ++ ++ ;; There is a great degree of variability permitted here. The next ++ ;; several examples are intended to illustrate just a few of the many ++ ;; possibilities. Whether the name is canonicalized to a particular ++ ;; case (either upper or lower) depends on both the file system and the ++ ;; implementation since two different implementations using the same ++ ;; file system might differ on many issues. How information is stored ++ ;; internally (and possibly presented in #S notation) might vary, ++ ;; possibly requiring `accessors' such as PATHNAME-NAME to perform case ++ ;; conversion upon access. The format of a namestring is dependent both ++ ;; on the file system and the implementation since, for example, one ++ ;; implementation might include the host name in a namestring, and ++ ;; another might not. #S notation would generally only be used in a ++ ;; situation where no appropriate namestring could be constructed for use ++ ;; with #P. ++ (setq p1 (pathname "test")) ++ => #P"CHOCOLATE:TEST" ; with case canonicalization (e.g., VMS) ++ OR=> #P"VANILLA:test" ; without case canonicalization (e.g., Unix) ++ OR=> #P"test" ++ OR=> #S(PATHNAME :HOST "STRAWBERRY" :NAME "TEST") ++ OR=> #S(PATHNAME :HOST "BELGIAN-CHOCOLATE" :NAME "test") ++ (setq p2 (pathname "test")) ++ => #P"CHOCOLATE:TEST" ++ OR=> #P"VANILLA:test" ++ OR=> #P"test" ++ OR=> #S(PATHNAME :HOST "STRAWBERRY" :NAME "TEST") ++ OR=> #S(PATHNAME :HOST "BELGIAN-CHOCOLATE" :NAME "test") ++ (pathnamep p1) => true ++ (eq p1 (pathname p1)) => true ++ (eq p1 p2) ++ => true ++ OR=> false ++ (with-open-file (stream "test" :direction :output) ++ (pathname stream)) ++ => #P"ORANGE-CHOCOLATE:>Gus>test.lisp.newest" ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: make-pathname, Next: pathnamep, Prev: pathname, Up: Filenames Dictionary ++ ++19.4.4 make-pathname [Function] ++------------------------------- ++ ++'make-pathname' &key host device directory name type version defaults ++case ++=> pathname ++ ++Arguments and Values:: ++...................... ++ ++host--a valid physical pathname host. Complicated defaulting behavior; ++see below. ++ ++ device--a valid pathname device. Complicated defaulting behavior; ++see below. ++ ++ directory--a valid pathname directory. Complicated defaulting ++behavior; see below. ++ ++ name--a valid pathname name. Complicated defaulting behavior; see ++below. ++ ++ type--a valid pathname type. Complicated defaulting behavior; see ++below. ++ ++ version--a valid pathname version. Complicated defaulting behavior; ++see below. ++ ++ defaults--a pathname designator. The default is a pathname whose ++host component is the same as the host component of the value of ++*default-pathname-defaults*, and whose other components are all nil. ++ ++ case--one of :common or :local. The default is :local. ++ ++ pathname--a pathname. ++ ++Description:: ++............. ++ ++Constructs and returns a pathname from the supplied keyword arguments. ++ ++ After the components supplied explicitly by host, device, directory, ++name, type, and version are filled in, the merging rules used by ++merge-pathnames are used to fill in any unsupplied components from the ++defaults supplied by defaults. ++ ++ Whenever a pathname is constructed the components may be ++canonicalized if appropriate. For the explanation of the arguments that ++can be supplied for each component, see *note Pathname Components::. ++ ++ If case is supplied, it is treated as described in *note Case in ++Pathname Components::. ++ ++ The resulting pathname is a logical pathname if and only its host ++component is a logical host or a string that names a defined logical ++host. ++ ++ If the directory is a string, it should be the name of a top level ++directory, and should not contain any punctuation characters; that is, ++specifying a string, str, is equivalent to specifying the list ++(:absolute str). Specifying the symbol :wild is equivalent to ++specifying the list (:absolute :wild-inferiors), or (:absolute :wild) in ++a file system that does not support :wild-inferiors. ++ ++Examples:: ++.......... ++ ++ ;; Implementation A -- an implementation with access to a single ++ ;; Unix file system. This implementation happens to never display ++ ;; the `host' information in a namestring, since there is only one host. ++ (make-pathname :directory '(:absolute "public" "games") ++ :name "chess" :type "db") ++ => #P"/public/games/chess.db" ++ ++ ;; Implementation B -- an implementation with access to one or more ++ ;; VMS file systems. This implementation displays `host' information ++ ;; in the namestring only when the host is not the local host. ++ ;; It uses a double colon to separate a host name from the host's local ++ ;; file name. ++ (make-pathname :directory '(:absolute "PUBLIC" "GAMES") ++ :name "CHESS" :type "DB") ++ => #P"SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++ (make-pathname :host "BOBBY" ++ :directory '(:absolute "PUBLIC" "GAMES") ++ :name "CHESS" :type "DB") ++ => #P"BOBBY::SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++ ++ ;; Implementation C -- an implementation with simultaneous access to ++ ;; multiple file systems from the same Lisp image. In this ++ ;; implementation, there is a convention that any text preceding the ++ ;; first colon in a pathname namestring is a host name. ++ (dolist (case '(:common :local)) ++ (dolist (host '("MY-LISPM" "MY-VAX" "MY-UNIX")) ++ (print (make-pathname :host host :case case ++ :directory '(:absolute "PUBLIC" "GAMES") ++ :name "CHESS" :type "DB")))) ++ |> #P"MY-LISPM:>public>games>chess.db" ++ |> #P"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++ |> #P"MY-UNIX:/public/games/chess.db" ++ |> #P"MY-LISPM:>public>games>chess.db" ++ |> #P"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB" ++ |> #P"MY-UNIX:/PUBLIC/GAMES/CHESS.DB" ++ => NIL ++ ++Affected By:: ++............. ++ ++The file system. ++ ++See Also:: ++.......... ++ ++*note merge-pathnames:: , pathname, logical-pathname, *note File System ++Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++Portable programs should not supply :unspecific for any component. See ++*note ->UNSPECIFIC as a Component Value::. ++ ++ ++File: gcl.info, Node: pathnamep, Next: pathname-host, Prev: make-pathname, Up: Filenames Dictionary ++ ++19.4.5 pathnamep [Function] ++--------------------------- ++ ++'pathnamep' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type pathname; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (setq q "test") => "test" ++ (pathnamep q) => false ++ (setq q (pathname "test")) ++ => #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" :TYPE NIL ++ :VERSION NIL) ++ (pathnamep q) => true ++ (setq q (logical-pathname "SYS:SITE;FOO.SYSTEM")) ++ => #P"SYS:SITE;FOO.SYSTEM" ++ (pathnamep q) => true ++ ++Notes:: ++....... ++ ++ (pathnamep object) == (typep object 'pathname) ++ ++ ++File: gcl.info, Node: pathname-host, Next: load-logical-pathname-translations, Prev: pathnamep, Up: Filenames Dictionary ++ ++19.4.6 pathname-host, pathname-device, pathname-directory, ++---------------------------------------------------------- ++ ++pathname-name, pathname-type, pathname-version ++---------------------------------------------- ++ ++ [Function] ++ ++ 'pathname-host' pathname &key case => host ++ ++ 'pathname-device' pathname &key case => device ++ ++ 'pathname-directory' pathname &key case => directory ++ ++ 'pathname-name' pathname &key case => name ++ ++ 'pathname-type' pathname &key case => type ++ ++ 'pathname-version' pathname => version ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator. ++ ++ case--one of :local or :common. The default is :local. ++ ++ host--a valid pathname host. ++ ++ device--a valid pathname device. ++ ++ directory--a valid pathname directory. ++ ++ name--a valid pathname name. ++ ++ type--a valid pathname type. ++ ++ version--a valid pathname version. ++ ++Description:: ++............. ++ ++These functions return the components of pathname. ++ ++ If the pathname designator is a pathname, it represents the name used ++to open the file. This may be, but is not required to be, the actual ++name of the file. ++ ++ If case is supplied, it is treated as described in *note Case in ++Pathname Components::. ++ ++Examples:: ++.......... ++ ++ (setq q (make-pathname :host "KATHY" ++ :directory "CHAPMAN" ++ :name "LOGIN" :type "COM")) ++ => #P"KATHY::[CHAPMAN]LOGIN.COM" ++ (pathname-host q) => "KATHY" ++ (pathname-name q) => "LOGIN" ++ (pathname-type q) => "COM" ++ ++ ;; Because namestrings are used, the results shown in the remaining ++ ;; examples are not necessarily the only possible results. Mappings ++ ;; from namestring representation to pathname representation are ++ ;; dependent both on the file system involved and on the implementation ++ ;; (since there may be several implementations which can manipulate the ++ ;; the same file system, and those implementations are not constrained ++ ;; to agree on all details). Consult the documentation for each ++ ;; implementation for specific information on how namestrings are treated ++ ;; that implementation. ++ ++ ;; VMS ++ (pathname-directory (parse-namestring "[FOO.*.BAR]BAZ.LSP")) ++ => (:ABSOLUTE "FOO" "BAR") ++ (pathname-directory (parse-namestring "[FOO.*.BAR]BAZ.LSP") :case :common) ++ => (:ABSOLUTE "FOO" "BAR") ++ ++ ;; Unix ++ (pathname-directory "foo.l") => NIL ++ (pathname-device "foo.l") => :UNSPECIFIC ++ (pathname-name "foo.l") => "foo" ++ (pathname-name "foo.l" :case :local) => "foo" ++ (pathname-name "foo.l" :case :common) => "FOO" ++ (pathname-type "foo.l") => "l" ++ (pathname-type "foo.l" :case :local) => "l" ++ (pathname-type "foo.l" :case :common) => "L" ++ (pathname-type "foo") => :UNSPECIFIC ++ (pathname-type "foo" :case :common) => :UNSPECIFIC ++ (pathname-type "foo.") => "" ++ (pathname-type "foo." :case :common) => "" ++ (pathname-directory (parse-namestring "/foo/bar/baz.lisp") :case :local) ++ => (:ABSOLUTE "foo" "bar") ++ (pathname-directory (parse-namestring "/foo/bar/baz.lisp") :case :local) ++ => (:ABSOLUTE "FOO" "BAR") ++ (pathname-directory (parse-namestring "../baz.lisp")) ++ => (:RELATIVE :UP) ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/BAR/../Mum/baz")) ++ => (:ABSOLUTE "foo" "BAR" :UP "Mum") ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/BAR/../Mum/baz") :case :common) ++ => (:ABSOLUTE "FOO" "bar" :UP "Mum") ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/*/bar/baz.l")) ++ => (:ABSOLUTE "foo" :WILD "bar") ++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/*/bar/baz.l") :case :common) ++ => (:ABSOLUTE "FOO" :WILD "BAR") ++ ++ ;; Symbolics LMFS ++ (pathname-directory (parse-namestring ">foo>**>bar>baz.lisp")) ++ => (:ABSOLUTE "foo" :WILD-INFERIORS "bar") ++ (pathname-directory (parse-namestring ">foo>*>bar>baz.lisp")) ++ => (:ABSOLUTE "foo" :WILD "bar") ++ (pathname-directory (parse-namestring ">foo>*>bar>baz.lisp") :case :common) ++ => (:ABSOLUTE "FOO" :WILD "BAR") ++ (pathname-device (parse-namestring ">foo>baz.lisp")) => :UNSPECIFIC ++ ++Affected By:: ++............. ++ ++The implementation and the host file system. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if its first argument is not a ++pathname. ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: load-logical-pathname-translations, Next: logical-pathname-translations, Prev: pathname-host, Up: Filenames Dictionary ++ ++19.4.7 load-logical-pathname-translations [Function] ++---------------------------------------------------- ++ ++'load-logical-pathname-translations' host => just-loaded ++ ++Arguments and Values:: ++...................... ++ ++host--a string. ++ ++ just-loaded--a generalized boolean. ++ ++Description:: ++............. ++ ++Searches for and loads the definition of a logical host named host, if ++it is not already defined. The specific nature of the search is ++implementation-defined. ++ ++ If the host is already defined, no attempt to find or load a ++definition is attempted, and false is returned. If the host is not ++already defined, but a definition is successfully found and loaded, true ++is returned. Otherwise, an error is signaled. ++ ++Examples:: ++.......... ++ ++ (translate-logical-pathname "hacks:weather;barometer.lisp.newest") ++ |> Error: The logical host HACKS is not defined. ++ (load-logical-pathname-translations "HACKS") ++ |> ;; Loading SYS:SITE;HACKS.TRANSLATIONS ++ |> ;; Loading done. ++ => true ++ (translate-logical-pathname "hacks:weather;barometer.lisp.newest") ++ => #P"HELIUM:[SHARED.HACKS.WEATHER]BAROMETER.LSP;0" ++ (load-logical-pathname-translations "HACKS") ++ => false ++ ++Exceptional Situations:: ++........................ ++ ++If no definition is found, an error of type error is signaled. ++ ++See Also:: ++.......... ++ ++logical-pathname ++ ++Notes:: ++....... ++ ++Logical pathname definitions will be created not just by implementors ++but also by programmers. As such, it is important that the search ++strategy be documented. For example, an implementation might define ++that the definition of a host is to be found in a file called ++"host.translations" in some specifically named directory. ++ ++ ++File: gcl.info, Node: logical-pathname-translations, Next: logical-pathname, Prev: load-logical-pathname-translations, Up: Filenames Dictionary ++ ++19.4.8 logical-pathname-translations [Accessor] ++----------------------------------------------- ++ ++'logical-pathname-translations' host => translations ++ ++ (setf (' logical-pathname-translations' host) new-translations) ++ ++Arguments and Values:: ++...................... ++ ++host-a logical host designator. ++ ++ translations, new-translations--a list. ++ ++Description:: ++............. ++ ++Returns the host's list of translations. Each translation is a list of ++at least two elements: from-wildcard and to-wildcard. Any additional ++elements are implementation-defined. From-wildcard is a logical ++pathname whose host is host. To-wildcard is a pathname. ++ ++ [Reviewer Note by Laddaga: Can this be a logical pathname?] ++ ++ (setf (logical-pathname-translations host) translations) sets a ++logical pathname host's list of translations. If host is a string that ++has not been previously used as a logical pathname host, a new logical ++pathname host is defined; otherwise an existing host's translations are ++replaced. logical pathname host names are compared with string-equal. ++ ++ When setting the translations list, each from-wildcard can be a ++logical pathname whose host is host or a logical pathname namestring ++parseable by (parse-namestring string host), where host represents the ++appropriate object as defined by parse-namestring. Each to-wildcard can ++be anything coercible to a pathname by (pathname to-wildcard). If ++to-wildcard coerces to a logical pathname, translate-logical-pathname ++will perform repeated translation steps when it uses it. ++ ++ host is either the host component of a logical pathname or a string ++that has been defined as a logical pathname host name by setf of ++logical-pathname-translations. ++ ++Examples:: ++.......... ++ ++[Reviewer Note by Laddaga: Shouldn't there be some *.*'s in the list of ++translations for PROG below?] ++ ++ ;;;A very simple example of setting up a logical pathname host. No ++ ;;;translations are necessary to get around file system restrictions, so ++ ;;;all that is necessary is to specify the root of the physical directory ++ ;;;tree that contains the logical file system. ++ ;;;The namestring syntax on the right-hand side is implementation-dependent. ++ (setf (logical-pathname-translations "foo") ++ '(("**;*.*.*" "MY-LISPM:>library>foo>**>"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "foo:bar;baz;mum.quux.3") ++ => #P"MY-LISPM:>library>foo>bar>baz>mum.quux.3" ++ ++ ;;;A more complex example, dividing the files among two file servers ++ ;;;and several different directories. This Unix doesn't support ++ ;;;:WILD-INFERIORS in the directory, so each directory level must ++ ;;;be translated individually. No file name or type translations ++ ;;;are required except for .MAIL to .MBX. ++ ;;;The namestring syntax on the right-hand side is implementation-dependent. ++ (setf (logical-pathname-translations "prog") ++ '(("RELEASED;*.*.*" "MY-UNIX:/sys/bin/my-prog/") ++ ("RELEASED;*;*.*.*" "MY-UNIX:/sys/bin/my-prog/*/") ++ ("EXPERIMENTAL;*.*.*" "MY-UNIX:/usr/Joe/development/prog/") ++ ("EXPERIMENTAL;DOCUMENTATION;*.*.*" ++ "MY-VAX:SYS$DISK:[JOE.DOC]") ++ ("EXPERIMENTAL;*;*.*.*" "MY-UNIX:/usr/Joe/development/prog/*/") ++ ("MAIL;**;*.MAIL" "MY-VAX:SYS$DISK:[JOE.MAIL.PROG...]*.MBX"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:mail;save;ideas.mail.3") ++ => #P"MY-VAX:SYS$DISK:[JOE.MAIL.PROG.SAVE]IDEAS.MBX.3" ++ ++ ;;;Example translations for a program that uses three files main.lisp, ++ ;;;auxiliary.lisp, and documentation.lisp. These translations might be ++ ;;;supplied by a software supplier as examples. ++ ++ ;;;For Unix with long file names ++ (setf (logical-pathname-translations "prog") ++ '(("CODE;*.*.*" "/lib/prog/"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++ => #P"/lib/prog/documentation.lisp" ++ ++ ;;;For Unix with 14-character file names, using .lisp as the type ++ (setf (logical-pathname-translations "prog") ++ '(("CODE;DOCUMENTATION.*.*" "/lib/prog/docum.*") ++ ("CODE;*.*.*" "/lib/prog/"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++ => #P"/lib/prog/docum.lisp" ++ ++ ;;;For Unix with 14-character file names, using .l as the type ++ ;;;The second translation shortens the compiled file type to .b ++ (setf (logical-pathname-translations "prog") ++ `(("**;*.LISP.*" ,(logical-pathname "PROG:**;*.L.*")) ++ (,(compile-file-pathname (logical-pathname "PROG:**;*.LISP.*")) ++ ,(logical-pathname "PROG:**;*.B.*")) ++ ("CODE;DOCUMENTATION.*.*" "/lib/prog/documentatio.*") ++ ("CODE;*.*.*" "/lib/prog/"))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++ => #P"/lib/prog/documentatio.l" ++ ++ ;;;For a Cray with 6 character names and no directories, types, or versions. ++ (setf (logical-pathname-translations "prog") ++ (let ((l '(("MAIN" "PGMN") ++ ("AUXILIARY" "PGAUX") ++ ("DOCUMENTATION" "PGDOC"))) ++ (logpath (logical-pathname "prog:code;")) ++ (phypath (pathname "XXX"))) ++ (append ++ ;; Translations for source files ++ (mapcar #'(lambda (x) ++ (let ((log (first x)) ++ (phy (second x))) ++ (list (make-pathname :name log ++ :type "LISP" ++ :version :wild ++ :defaults logpath) ++ (make-pathname :name phy ++ :defaults phypath)))) ++ l) ++ ;; Translations for compiled files ++ (mapcar #'(lambda (x) ++ (let* ((log (first x)) ++ (phy (second x)) ++ (com (compile-file-pathname ++ (make-pathname :name log ++ :type "LISP" ++ :version :wild ++ :defaults logpath)))) ++ (setq phy (concatenate 'string phy "B")) ++ (list com ++ (make-pathname :name phy ++ :defaults phypath)))) ++ l)))) ++ ++ ;;;Sample use of that logical pathname. The return value ++ ;;;is implementation-dependent. ++ (translate-logical-pathname "prog:code;documentation.lisp") ++ => #P"PGDOC" ++ ++Exceptional Situations:: ++........................ ++ ++If host is incorrectly supplied, an error of type type-error is ++signaled. ++ ++See Also:: ++.......... ++ ++logical-pathname, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++Implementations can define additional functions that operate on logical ++pathname hosts, for example to specify additional translation rules or ++options. ++ ++ ++File: gcl.info, Node: logical-pathname, Next: *default-pathname-defaults*, Prev: logical-pathname-translations, Up: Filenames Dictionary ++ ++19.4.9 logical-pathname [Function] ++---------------------------------- ++ ++'logical-pathname' pathspec => logical-pathname ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a logical pathname, a logical pathname namestring, or a ++stream. ++ ++ logical-pathname--a logical pathname. ++ ++Description:: ++............. ++ ++logical-pathname converts pathspec to a logical pathname and returns the ++new logical pathname. If pathspec is a logical pathname namestring, it ++should contain a host component and its following colon. If pathspec is ++a stream, it should be one for which pathname returns a logical ++pathname. ++ ++ If pathspec is a stream, the stream can be either open or closed. ++logical-pathname returns the same logical pathname after a file is ++closed as it did when the file was open. ++ ++ It is an error if pathspec is a stream that is created with ++make-two-way-stream, make-echo-stream, make-broadcast-stream, ++make-concatenated-stream, make-string-input-stream, or ++make-string-output-stream. ++ ++Exceptional Situations:: ++........................ ++ ++Signals an error of type type-error if pathspec isn't supplied ++correctly. ++ ++See Also:: ++.......... ++ ++logical-pathname, *note translate-logical-pathname:: , *note Logical ++Pathnames:: ++ ++ ++File: gcl.info, Node: *default-pathname-defaults*, Next: namestring, Prev: logical-pathname, Up: Filenames Dictionary ++ ++19.4.10 *default-pathname-defaults* [Variable] ++---------------------------------------------- ++ ++Value Type:: ++............ ++ ++a pathname object. ++ ++Initial Value:: ++............... ++ ++An implementation-dependent pathname, typically in the working directory ++that was current when Common Lisp was started up. ++ ++Description:: ++............. ++ ++a pathname, used as the default whenever a function needs a default ++pathname and one is not supplied. ++ ++Examples:: ++.......... ++ ++ ;; This example illustrates a possible usage for a hypothetical Lisp running on a ++ ;; DEC TOPS-20 file system. Since pathname conventions vary between Lisp ++ ;; implementations and host file system types, it is not possible to provide a ++ ;; general-purpose, conforming example. ++ *default-pathname-defaults* => #P"PS:" ++ (merge-pathnames (make-pathname :name "CALENDAR")) ++ => #P"PS:CALENDAR" ++ (let ((*default-pathname-defaults* (pathname ""))) ++ (merge-pathnames (make-pathname :name "CALENDAR"))) ++ => #P"CALENDAR" ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++ ++File: gcl.info, Node: namestring, Next: parse-namestring, Prev: *default-pathname-defaults*, Up: Filenames Dictionary ++ ++19.4.11 namestring, file-namestring, directory-namestring, ++---------------------------------------------------------- ++ ++host-namestring, enough-namestring ++---------------------------------- ++ ++ [Function] ++ ++ 'namestring' pathname => namestring ++ ++ 'file-namestring' pathname => namestring ++ ++ 'directory-namestring' pathname => namestring ++ ++ 'host-namestring' pathname => namestring ++ ++ 'enough-namestring' pathname &optional defaults => namestring ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator. ++ ++ defaults--a pathname designator. ++ ++ The default is the value of *default-pathname-defaults*. ++ ++ namestring--a string or nil. ++ ++ [Editorial Note by KMP: Under what circumstances can NIL be ++returned??] ++ ++Description:: ++............. ++ ++These functions convert pathname into a namestring. The name ++represented by pathname is returned as a namestring in an ++implementation-dependent canonical form. ++ ++ namestring returns the full form of pathname. ++ ++ file-namestring returns just the name, type, and version components ++of pathname. ++ ++ directory-namestring returns the directory name portion. ++ ++ host-namestring returns the host name. ++ ++ enough-namestring returns an abbreviated namestring that is just ++sufficient to identify the file named by pathname when considered ++relative to the defaults. It is required that ++ ++ (merge-pathnames (enough-namestring pathname defaults) defaults) ++ == (merge-pathnames (parse-namestring pathname nil defaults) defaults) ++ ++ in all cases, and the result of enough-namestring is the shortest ++reasonable string that will satisfy this criterion. ++ ++ It is not necessarily possible to construct a valid namestring by ++concatenating some of the three shorter namestrings in some order. ++ ++Examples:: ++.......... ++ ++ (namestring "getty") ++ => "getty" ++ (setq q (make-pathname :host "kathy" ++ :directory ++ (pathname-directory *default-pathname-defaults*) ++ :name "getty")) ++ => #S(PATHNAME :HOST "kathy" :DEVICE NIL :DIRECTORY directory-name ++ :NAME "getty" :TYPE NIL :VERSION NIL) ++ (file-namestring q) => "getty" ++ (directory-namestring q) => directory-name ++ (host-namestring q) => "kathy" ++ ++ ;;;Using Unix syntax and the wildcard conventions used by the ++ ;;;particular version of Unix on which this example was created: ++ (namestring ++ (translate-pathname "/usr/dmr/hacks/frob.l" ++ "/usr/d*/hacks/*.l" ++ "/usr/d*/backup/hacks/backup-*.*")) ++ => "/usr/dmr/backup/hacks/backup-frob.l" ++ (namestring ++ (translate-pathname "/usr/dmr/hacks/frob.l" ++ "/usr/d*/hacks/fr*.l" ++ "/usr/d*/backup/hacks/backup-*.*")) ++ => "/usr/dmr/backup/hacks/backup-ob.l" ++ ++ ;;;This is similar to the above example but uses two different hosts, ++ ;;;U: which is a Unix and V: which is a VMS. Note the translation ++ ;;;of file type and alphabetic case conventions. ++ (namestring ++ (translate-pathname "U:/usr/dmr/hacks/frob.l" ++ "U:/usr/d*/hacks/*.l" ++ "V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*")) ++ => "V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-FROB.LSP" ++ (namestring ++ (translate-pathname "U:/usr/dmr/hacks/frob.l" ++ "U:/usr/d*/hacks/fr*.l" ++ "V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*")) ++ => "V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-OB.LSP" ++ ++See Also:: ++.......... ++ ++*note truename:: , *note merge-pathnames:: , pathname, logical-pathname, ++*note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: parse-namestring, Next: wild-pathname-p, Prev: namestring, Up: Filenames Dictionary ++ ++19.4.12 parse-namestring [Function] ++----------------------------------- ++ ++'parse-namestring' thing &optional host default-pathname &key start end ++junk-allowed ++=> pathname, position ++ ++Arguments and Values:: ++...................... ++ ++thing--a string, a pathname, or a stream associated with a file. ++ ++ host--a valid pathname host, a logical host, or nil. ++ ++ default-pathname--a pathname designator. The default is the value of ++*default-pathname-defaults*. ++ ++ start, end--bounding index designators of thing. The defaults for ++start and end are 0 and nil, respectively. ++ ++ junk-allowed--a generalized boolean. The default is false. ++ ++ pathname--a pathname, or nil. ++ ++ position--a bounding index designator for thing. ++ ++Description:: ++............. ++ ++Converts thing into a pathname. ++ ++ The host supplies a host name with respect to which the parsing ++occurs. ++ ++ If thing is a stream associated with a file, processing proceeds as ++if the pathname used to open that file had been supplied instead. ++ ++ If thing is a pathname, the host and the host component of thing are ++compared. If they match, two values are immediately returned: thing and ++start; otherwise (if they do not match), an error is signaled. ++ ++ Otherwise (if thing is a string), parse-namestring parses the name of ++a file within the substring of thing bounded by start and end. ++ ++ If thing is a string then the substring of thing bounded by start and ++end is parsed into a pathname as follows: ++ ++* ++ If host is a logical host then thing is parsed as a logical ++ pathname namestring on the host. ++ ++* ++ If host is nil and thing is a syntactically valid logical pathname ++ namestring containing an explicit host, then it is parsed as a ++ logical pathname namestring. ++ ++* ++ If host is nil, default-pathname is a logical pathname, and thing ++ is a syntactically valid logical pathname namestring without an ++ explicit host, then it is parsed as a logical pathname namestring ++ on the host that is the host component of default-pathname. ++ ++* ++ Otherwise, the parsing of thing is implementation-defined. ++ ++ In the first of these cases, the host portion of the logical pathname ++namestring and its following colon are optional. ++ ++ If the host portion of the namestring and host are both present and ++do not match, an error is signaled. ++ ++ If junk-allowed is true, then the primary value is the pathname ++parsed or, if no syntactically correct pathname was seen, nil. If ++junk-allowed is false, then the entire substring is scanned, and the ++primary value is the pathname parsed. ++ ++ In either case, the secondary value is the index into thing of the ++delimiter that terminated the parse, or the index beyond the substring ++if the parse terminated at the end of the substring (as will always be ++the case if junk-allowed is false). ++ ++ Parsing a null string always succeeds, producing a pathname with all ++components (except the host) equal to nil. ++ ++ If thing contains an explicit host name and no explicit device name, ++then it is implementation-defined whether parse-namestring will supply ++the standard default device for that host as the device component of the ++resulting pathname. ++ ++Examples:: ++.......... ++ ++ (setq q (parse-namestring "test")) ++ => #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" ++ :TYPE NIL :VERSION NIL) ++ (pathnamep q) => true ++ (parse-namestring "test") ++ => #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" ++ :TYPE NIL :VERSION NIL), 4 ++ (setq s (open xxx)) => # ++ (parse-namestring s) ++ => #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME xxx ++ :TYPE NIL :VERSION NIL), 0 ++ (parse-namestring "test" nil nil :start 2 :end 4 ) ++ => #S(PATHNAME ...), 15 ++ (parse-namestring "foo.lisp") ++ => #P"foo.lisp" ++ ++Exceptional Situations:: ++........................ ++ ++If junk-allowed is false, an error of type parse-error is signaled if ++thing does not consist entirely of the representation of a pathname, ++possibly surrounded on either side by whitespace_1 characters if that is ++appropriate to the cultural conventions of the implementation. ++ ++ If host is supplied and not nil, and thing contains a manifest host ++name, an error of type error is signaled if the hosts do not match. ++ ++ If thing is a logical pathname namestring and if the host portion of ++the namestring and host are both present and do not match, an error of ++type error is signaled. ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note ->UNSPECIFIC as a Component Value::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: wild-pathname-p, Next: pathname-match-p, Prev: parse-namestring, Up: Filenames Dictionary ++ ++19.4.13 wild-pathname-p [Function] ++---------------------------------- ++ ++'wild-pathname-p' pathname &optional field-key => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator. ++ ++ Field-key--one of :host, :device :directory, :name, :type, :version, ++or nil. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++wild-pathname-p tests pathname for the presence of wildcard components. ++ ++ If pathname is a pathname (as returned by pathname) it represents the ++name used to open the file. This may be, but is not required to be, the ++actual name of the file. ++ ++ If field-key is not supplied or nil, wild-pathname-p returns true if ++pathname has any wildcard components, nil if pathname has none. If ++field-key is non-nil, wild-pathname-p returns true if the indicated ++component of pathname is a wildcard, nil if the component is not a ++wildcard. ++ ++Examples:: ++.......... ++ ++ ;;;The following examples are not portable. They are written to run ++ ;;;with particular file systems and particular wildcard conventions. ++ ;;;Other implementations will behave differently. These examples are ++ ;;;intended to be illustrative, not to be prescriptive. ++ ++ (wild-pathname-p (make-pathname :name :wild)) => true ++ (wild-pathname-p (make-pathname :name :wild) :name) => true ++ (wild-pathname-p (make-pathname :name :wild) :type) => false ++ (wild-pathname-p (pathname "s:>foo>**>")) => true ;Lispm ++ (wild-pathname-p (pathname :name "F*O")) => true ;Most places ++ ++Exceptional Situations:: ++........................ ++ ++If pathname is not a pathname, a string, or a stream associated with a ++file an error of type type-error is signaled. ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++Not all implementations support wildcards in all fields. See *note ++->WILD as a Component Value:: and *note Restrictions on Wildcard ++Pathnames::. ++ ++ ++File: gcl.info, Node: pathname-match-p, Next: translate-logical-pathname, Prev: wild-pathname-p, Up: Filenames Dictionary ++ ++19.4.14 pathname-match-p [Function] ++----------------------------------- ++ ++'pathname-match-p' pathname wildcard => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator. ++ ++ wildcard--a designator for a wild pathname. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++pathname-match-p returns true if pathname matches wildcard, otherwise ++nil. The matching rules are implementation-defined but should be ++consistent with directory. Missing components of wildcard default to ++:wild. ++ ++ It is valid for pathname to be a wild pathname; a wildcard field in ++pathname only matches a wildcard field in wildcard (i.e., ++pathname-match-p is not commutative). It is valid for wildcard to be a ++non-wild pathname. ++ ++Exceptional Situations:: ++........................ ++ ++If pathname or wildcard is not a pathname, string, or stream associated ++with a file an error of type type-error is signaled. ++ ++See Also:: ++.......... ++ ++*note directory:: , pathname, logical-pathname, *note File System ++Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: translate-logical-pathname, Next: translate-pathname, Prev: pathname-match-p, Up: Filenames Dictionary ++ ++19.4.15 translate-logical-pathname [Function] ++--------------------------------------------- ++ ++'translate-logical-pathname' pathname &key => physical-pathname ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator, or a logical pathname namestring. ++ ++ physical-pathname--a physical pathname. ++ ++Description:: ++............. ++ ++Translates pathname to a physical pathname, which it returns. ++ ++ If pathname is a stream, the stream can be either open or closed. ++translate-logical-pathname returns the same physical pathname after a ++file is closed as it did when the file was open. ++ ++ It is an error if pathname is a stream that is created with ++make-two-way-stream, make-echo-stream, make-broadcast-stream, ++make-concatenated-stream, make-string-input-stream, ++make-string-output-stream. ++ ++ If pathname is a logical pathname namestring, the host portion of the ++logical pathname namestring and its following colon are required. ++ ++ Pathname is first coerced to a pathname. If the coerced pathname is ++a physical pathname, it is returned. If the coerced pathname is a ++logical pathname, the first matching translation (according to ++pathname-match-p) of the logical pathname host is applied, as if by ++calling translate-pathname. If the result is a logical pathname, this ++process is repeated. When the result is finally a physical pathname, it ++is returned. If no translation matches, an error is signaled. ++ ++ translate-logical-pathname might perform additional translations, ++typically to provide translation of file types to local naming ++conventions, to accomodate physical file systems with limited length ++names, or to deal with special character requirements such as ++translating hyphens to underscores or uppercase letters to lowercase. ++Any such additional translations are implementation-defined. Some ++implementations do no additional translations. ++ ++ There are no specified keyword arguments for ++translate-logical-pathname, but implementations are permitted to extend ++it by adding keyword arguments. ++ ++Examples:: ++.......... ++ ++See logical-pathname-translations. ++ ++Exceptional Situations:: ++........................ ++ ++If pathname is incorrectly supplied, an error of type type-error is ++signaled. ++ ++ If no translation matches, an error of type file-error is signaled. ++ ++ [Editorial Note by KMP: Is file-error really right, or should it be ++pathname-error?] ++ ++See Also:: ++.......... ++ ++*note logical-pathname:: , *note logical-pathname-translations:: , ++logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: translate-pathname, Next: merge-pathnames, Prev: translate-logical-pathname, Up: Filenames Dictionary ++ ++19.4.16 translate-pathname [Function] ++------------------------------------- ++ ++'translate-pathname' source from-wildcard to-wildcard &key ++=> translated-pathname ++ ++Arguments and Values:: ++...................... ++ ++source--a pathname designator. ++ ++ from-wildcard--a pathname designator. ++ ++ to-wildcard--a pathname designator. ++ ++ translated-pathname--a pathname. ++ ++Description:: ++............. ++ ++translate-pathname translates source (that matches from-wildcard) into a ++corresponding pathname that matches to-wildcard, and returns the ++corresponding pathname. ++ ++ The resulting pathname is to-wildcard with each wildcard or missing ++field replaced by a portion of source. A "wildcard field" is a pathname ++component with a value of :wild, a :wild element of a list-valued ++directory component, or an implementation-defined portion of a ++component, such as the "*" in the complex wildcard string "foo*bar" that ++some implementations support. An implementation that adds other ++wildcard features, such as regular expressions, must define how ++translate-pathname extends to those features. A "missing field" is a ++pathname component with a value of nil. ++ ++ The portion of source that is copied into the resulting pathname is ++implementation-defined. Typically it is determined by the user ++interface conventions of the file systems involved. Usually it is the ++portion of source that matches a wildcard field of from-wildcard that is ++in the same position as the wildcard or missing field of to-wildcard. ++If there is no wildcard field in from-wildcard at that position, then ++usually it is the entire corresponding pathname component of source, or ++in the case of a list-valued directory component, the entire ++corresponding list element. ++ ++ During the copying of a portion of source into the resulting ++pathname, additional implementation-defined translations of case or file ++naming conventions might occur, especially when from-wildcard and ++to-wildcard are for different hosts. ++ ++ It is valid for source to be a wild pathname; in general this will ++produce a wild result. It is valid for from-wildcard and/or to-wildcard ++to be non-wild pathnames. ++ ++ There are no specified keyword arguments for translate-pathname, but ++implementations are permitted to extend it by adding keyword arguments. ++ ++ translate-pathname maps customary case in source into customary case ++in the output pathname. ++ ++Examples:: ++.......... ++ ++ ;; The results of the following five forms are all implementation-dependent. ++ ;; The second item in particular is shown with multiple results just to ++ ;; emphasize one of many particular variations which commonly occurs. ++ (pathname-name (translate-pathname "foobar" "foo*" "*baz")) => "barbaz" ++ (pathname-name (translate-pathname "foobar" "foo*" "*")) ++ => "foobar" ++ OR=> "bar" ++ (pathname-name (translate-pathname "foobar" "*" "foo*")) => "foofoobar" ++ (pathname-name (translate-pathname "bar" "*" "foo*")) => "foobar" ++ (pathname-name (translate-pathname "foobar" "foo*" "baz*")) => "bazbar" ++ ++ (defun translate-logical-pathname-1 (pathname rules) ++ (let ((rule (assoc pathname rules :test #'pathname-match-p))) ++ (unless rule (error "No translation rule for ~A" pathname)) ++ (translate-pathname pathname (first rule) (second rule)))) ++ (translate-logical-pathname-1 "FOO:CODE;BASIC.LISP" ++ '(("FOO:DOCUMENTATION;" "MY-UNIX:/doc/foo/") ++ ("FOO:CODE;" "MY-UNIX:/lib/foo/") ++ ("FOO:PATCHES;*;" "MY-UNIX:/lib/foo/patch/*/"))) ++ => #P"MY-UNIX:/lib/foo/basic.l" ++ ++ ;;;This example assumes one particular set of wildcard conventions ++ ;;;Not all file systems will run this example exactly as written ++ (defun rename-files (from to) ++ (dolist (file (directory from)) ++ (rename-file file (translate-pathname file from to)))) ++ (rename-files "/usr/me/*.lisp" "/dev/her/*.l") ++ ;Renames /usr/me/init.lisp to /dev/her/init.l ++ (rename-files "/usr/me/pcl*/*" "/sys/pcl/*/") ++ ;Renames /usr/me/pcl-5-may/low.lisp to /sys/pcl/pcl-5-may/low.lisp ++ ;In some file systems the result might be /sys/pcl/5-may/low.lisp ++ (rename-files "/usr/me/pcl*/*" "/sys/library/*/") ++ ;Renames /usr/me/pcl-5-may/low.lisp to /sys/library/pcl-5-may/low.lisp ++ ;In some file systems the result might be /sys/library/5-may/low.lisp ++ (rename-files "/usr/me/foo.bar" "/usr/me2/") ++ ;Renames /usr/me/foo.bar to /usr/me2/foo.bar ++ (rename-files "/usr/joe/*-recipes.text" "/usr/jim/cookbook/joe's-*-rec.text") ++ ;Renames /usr/joe/lamb-recipes.text to /usr/jim/cookbook/joe's-lamb-rec.text ++ ;Renames /usr/joe/pork-recipes.text to /usr/jim/cookbook/joe's-pork-rec.text ++ ;Renames /usr/joe/veg-recipes.text to /usr/jim/cookbook/joe's-veg-rec.text ++ ++Exceptional Situations:: ++........................ ++ ++If any of source, from-wildcard, or to-wildcard is not a pathname, a ++string, or a stream associated with a file an error of type type-error ++is signaled. ++ ++ (pathname-match-p source from-wildcard) must be true or an error of ++type error is signaled. ++ ++See Also:: ++.......... ++ ++*note namestring:: , *note pathname-host:: , ++ ++ pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++The exact behavior of translate-pathname cannot be dictated by the ++Common Lisp language and must be allowed to vary, depending on the user ++interface conventions of the file systems involved. ++ ++ The following is an implementation guideline. One file system ++performs this operation by examining each piece of the three pathnames ++in turn, where a piece is a pathname component or a list element of a ++structured component such as a hierarchical directory. Hierarchical ++directory elements in from-wildcard and to-wildcard are matched by ++whether they are wildcards, not by depth in the directory hierarchy. If ++the piece in to-wildcard is present and not wild, it is copied into the ++result. If the piece in to-wildcard is :wild or nil, the piece in ++source is copied into the result. Otherwise, the piece in to-wildcard ++might be a complex wildcard such as "foo*bar" and the piece in ++from-wildcard should be wild; the portion of the piece in source that ++matches the wildcard portion of the piece in from-wildcard replaces the ++wildcard portion of the piece in to-wildcard and the value produced is ++used in the result. ++ ++ ++File: gcl.info, Node: merge-pathnames, Prev: translate-pathname, Up: Filenames Dictionary ++ ++19.4.17 merge-pathnames [Function] ++---------------------------------- ++ ++'merge-pathnames' pathname &optional default-pathname default-version ++=> merged-pathname ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator. ++ ++ default-pathname--a pathname designator. ++ ++ The default is the value of *default-pathname-defaults*. ++ ++ default-version--a valid pathname version. ++ ++ The default is :newest. ++ ++ merged-pathname--a pathname. ++ ++Description:: ++............. ++ ++Constructs a pathname from pathname by filling in any unsupplied ++components with the corresponding values from default-pathname and ++default-version. ++ ++ Defaulting of pathname components is done by filling in components ++taken from another pathname. ++ ++ This is especially useful for cases such as a program that has an ++input file and an output file. Unspecified components of the output ++pathname will come from the input pathname, except that the type should ++not default to the type of the input pathname but rather to the ++appropriate default type for output from the program; for example, see ++the function compile-file-pathname. ++ ++ If no version is supplied, default-version is used. If ++default-version is nil, the version component will remain unchanged. ++ ++ If pathname explicitly specifies a host and not a device, and if the ++host component of default-pathname matches the host component of ++pathname, then the device is taken from the default-pathname; otherwise ++the device will be the default file device for that host. If pathname ++does not specify a host, device, directory, name, or type, each such ++component is copied from default-pathname. If pathname does not specify ++a name, then the version, if not provided, will come from ++default-pathname, just like the other components. If pathname does ++specify a name, then the version is not affected by default-pathname. ++If this process leaves the version missing, the default-version is used. ++If the host's file name syntax provides a way to input a version without ++a name or type, the user can let the name and type default but supply a ++version different from the one in default-pathname. ++ ++ If pathname is a stream, pathname effectively becomes (pathname ++pathname). merge-pathnames can be used on either an open or a closed ++stream. ++ ++ If pathname is a pathname it represents the name used to open the ++file. This may be, but is not required to be, the actual name of the ++file. ++ ++ merge-pathnames recognizes a logical pathname namestring when ++default-pathname is a logical pathname, ++ ++ or when the namestring begins with the name of a defined logical host ++followed by a colon. In the first of these two cases, ++ ++ the host portion of the logical pathname namestring and its following ++colon are optional. ++ ++ merge-pathnames returns a logical pathname if and only if its first ++argument is a logical pathname, ++ ++ or its first argument is a logical pathname namestring with an ++explicit host, or its first argument does not specify a host and the ++default-pathname is a logical pathname. ++ ++ Pathname merging treats a relative directory specially. If ++(pathname-directory pathname) is a list whose car is :relative, and ++(pathname-directory default-pathname) is a list, then the merged ++directory is the value of ++ ++ (append (pathname-directory default-pathname) ++ (cdr ;remove :relative from the front ++ (pathname-directory pathname))) ++ ++ except that if the resulting list contains a string or :wild ++immediately followed by :back, both of them are removed. This removal ++of redundant :back keywords is repeated as many times as possible. If ++(pathname-directory default-pathname) is not a list or ++(pathname-directory pathname) is not a list whose car is :relative, the ++merged directory is (or (pathname-directory pathname) ++(pathname-directory default-pathname)) ++ ++ merge-pathnames maps customary case in pathname into customary case ++in the output pathname. ++ ++Examples:: ++.......... ++ ++ (merge-pathnames "CMUC::FORMAT" ++ "CMUC::PS:.FASL") ++ => #P"CMUC::PS:FORMAT.FASL.0" ++ ++See Also:: ++.......... ++ ++*default-pathname-defaults*, pathname, logical-pathname, *note File ++System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++The net effect is that if just a name is supplied, the host, device, ++directory, and type will come from default-pathname, but the version ++will come from default-version. If nothing or just a directory is ++supplied, the name, type, and version will come from default-pathname ++together. ++ ++ ++File: gcl.info, Node: Files, Next: Streams, Prev: Filenames, Up: Top ++ ++20 Files ++******** ++ ++* Menu: ++ ++* File System Concepts:: ++* Files Dictionary:: ++ ++ ++File: gcl.info, Node: File System Concepts, Next: Files Dictionary, Prev: Files, Up: Files ++ ++20.1 File System Concepts ++========================= ++ ++This section describes the Common Lisp interface to file systems. The ++model used by this interface assumes that files are named by filenames , ++that a filename can be represented by a pathname object, and that given ++a pathname a stream can be constructed that connects to a file whose ++filename it represents. ++ ++ For information about opening and closing files, and manipulating ++their contents, see *note Streams::. ++ ++ Figure 20-1 lists some operators that are applicable to files and ++directories. ++ ++ compile-file file-length open ++ delete-file file-position probe-file ++ directory file-write-date rename-file ++ file-author load with-open-file ++ ++ Figure 20-1: File and Directory Operations ++ ++ ++* Menu: ++ ++* Coercion of Streams to Pathnames:: ++* File Operations on Open and Closed Streams:: ++* Truenames:: ++ ++ ++File: gcl.info, Node: Coercion of Streams to Pathnames, Next: File Operations on Open and Closed Streams, Prev: File System Concepts, Up: File System Concepts ++ ++20.1.1 Coercion of Streams to Pathnames ++--------------------------------------- ++ ++A stream associated with a file is either a file stream or a synonym ++stream whose target is a stream associated with a file . Such streams ++can be used as pathname designators. ++ ++ Normally, when a stream associated with a file is used as a pathname ++designator, it denotes the pathname used to open the file; this may be, ++but is not required to be, the actual name of the file. ++ ++ Some functions, such as truename and delete-file, coerce streams to ++pathnames in a different way that involves referring to the actual file ++that is open, which might or might not be the file whose name was opened ++originally. Such special situations are always notated specifically and ++are not the default. ++ ++ ++File: gcl.info, Node: File Operations on Open and Closed Streams, Next: Truenames, Prev: Coercion of Streams to Pathnames, Up: File System Concepts ++ ++20.1.2 File Operations on Open and Closed Streams ++------------------------------------------------- ++ ++Many functions that perform file operations accept either open or closed ++streams as arguments; see *note Stream Arguments to Standardized ++Functions::. ++ ++ Of these, the functions in Figure 20-2 treat open and closed streams ++differently. ++ ++ delete-file file-author probe-file ++ directory file-write-date truename ++ ++ Figure 20-2: File Functions that Treat Open and Closed Streams Differently ++ ++ ++ Since treatment of open streams by the file system may vary ++considerably between implementations, however, a closed stream might be ++the most reliable kind of argument for some of these functions--in ++particular, those in Figure 20-3. For example, in some file systems, ++open files are written under temporary names and not renamed until ++closed and/or are held invisible until closed. In general, any code ++that is intended to be portable should use such functions carefully. ++ ++ directory probe-file truename ++ ++ Figure 20-3: File Functions where Closed Streams Might Work Best ++ ++ ++ ++File: gcl.info, Node: Truenames, Prev: File Operations on Open and Closed Streams, Up: File System Concepts ++ ++20.1.3 Truenames ++---------------- ++ ++Many file systems permit more than one filename to designate a ++particular file. ++ ++ Even where multiple names are possible, most file systems have a ++convention for generating a canonical filename in such situations. Such ++a canonical filename (or the pathname representing such a filename) is ++called a truename . ++ ++ The truename of a file may differ from other filenames for the file ++because of symbolic links, version numbers, logical device translations ++in the file system, logical pathname translations within Common Lisp, or ++other artifacts of the file system. ++ ++ The truename for a file is often, but not necessarily, unique for ++each file. For instance, a Unix file with multiple hard links could ++have several truenames. ++ ++* Menu: ++ ++* Examples of Truenames:: ++ ++ ++File: gcl.info, Node: Examples of Truenames, Prev: Truenames, Up: Truenames ++ ++20.1.3.1 Examples of Truenames ++.............................. ++ ++For example, a DEC TOPS-20 system with files PS:FOO.TXT.1 and ++PS:FOO.TXT.2 might permit the second file to be referred to as ++PS:FOO.TXT.0, since the ".0" notation denotes "newest" version of ++several files. In the same file system, a "logical device" "JOE:" might ++be taken to refer to PS:" and so the names JOE:FOO.TXT.2 or ++JOE:FOO.TXT.0 might refer to PS:FOO.TXT.2. In all of these cases, ++the truename of the file would probably be PS:FOO.TXT.2. ++ ++ If a file is a symbolic link to another file (in a file system ++permitting such a thing), it is conventional for the truename to be the ++canonical name of the file after any symbolic links have been followed; ++that is, it is the canonical name of the file whose contents would ++become available if an input stream to that file were opened. ++ ++ In the case of a file still being created (that is, of an output ++stream open to such a file), the exact truename of the file might not be ++known until the stream is closed. In this case, the function truename ++might return different values for such a stream before and after it was ++closed. In fact, before it is closed, the name returned might not even ++be a valid name in the file system--for example, while a file is being ++written, it might have version :newest and might only take on a specific ++numeric value later when the file is closed even in a file system where ++all files have numeric versions. ++ ++ ++File: gcl.info, Node: Files Dictionary, Prev: File System Concepts, Up: Files ++ ++20.2 Files Dictionary ++===================== ++ ++* Menu: ++ ++* directory:: ++* probe-file:: ++* ensure-directories-exist:: ++* truename:: ++* file-author:: ++* file-write-date:: ++* rename-file:: ++* delete-file:: ++* file-error:: ++* file-error-pathname:: ++ ++ ++File: gcl.info, Node: directory, Next: probe-file, Prev: Files Dictionary, Up: Files Dictionary ++ ++20.2.1 directory [Function] ++--------------------------- ++ ++'directory' pathspec &key => pathnames ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a pathname designator, which may contain wild components. ++ ++ pathnames--a list of ++ ++ physical pathnames. ++ ++Description:: ++............. ++ ++Determines which, if any, files that are present in the file system have ++names matching pathspec, and returns a ++ ++ fresh ++ ++ list of pathnames corresponding to the truenames of those files. ++ ++ An implementation may be extended to accept implementation-defined ++keyword arguments to directory. ++ ++Affected By:: ++............. ++ ++The host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++If the attempt to obtain a directory listing is not successful, an error ++of type file-error is signaled. ++ ++See Also:: ++.......... ++ ++pathname, ++ ++ logical-pathname, ++ ++ *note ensure-directories-exist:: , *note File System Concepts::, ++*note File Operations on Open and Closed Streams::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++If the pathspec is not wild, the resulting list will contain either zero ++or one elements. ++ ++ Common Lisp specifies "&key" in the argument list to directory even ++though no standardized keyword arguments to directory are defined. ++":allow-other-keys t" may be used in conforming programs in order to ++quietly ignore any additional keywords which are passed by the program ++but not supported by the implementation. ++ ++ ++File: gcl.info, Node: probe-file, Next: ensure-directories-exist, Prev: directory, Up: Files Dictionary ++ ++20.2.2 probe-file [Function] ++---------------------------- ++ ++'probe-file' pathspec => truename ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a pathname designator. ++ ++ truename--a physical pathname or nil. ++ ++Description:: ++............. ++ ++probe-file tests whether a file exists. ++ ++ probe-file returns false if there is no file named pathspec, and ++otherwise returns the truename of pathspec. ++ ++ If the pathspec designator is an open stream, then probe-file ++produces the truename of its associated file. ++ ++ If pathspec is a stream, whether open or closed, it is coerced to a ++pathname as if by the function pathname. ++ ++Affected By:: ++............. ++ ++The host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type file-error is signaled if pathspec is wild. ++ ++ An error of type file-error is signaled if the file system cannot ++perform the requested operation. ++ ++See Also:: ++.......... ++ ++*note truename:: , *note open:: , *note ensure-directories-exist:: , ++pathname, ++ ++ logical-pathname, ++ ++ *note File System Concepts::, *note File Operations on Open and ++Closed Streams::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: ensure-directories-exist, Next: truename, Prev: probe-file, Up: Files Dictionary ++ ++20.2.3 ensure-directories-exist [Function] ++------------------------------------------ ++ ++'ensure-directories-exist' pathspec &key verbose => pathspec, created ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a pathname designator. ++ ++ verbose--a generalized boolean. ++ ++ created--a generalized boolean. ++ ++Description:: ++............. ++ ++Tests whether the directories containing the specified file actually ++exist, and attempts to create them if they do not. ++ ++ If the containing directories do not exist and if verbose is true, ++then the implementation is permitted (but not required) to perform ++output to standard output saying what directories were created. If the ++containing directories exist, or if verbose is false, this function ++performs no output. ++ ++ The primary value is the given pathspec so that this operation can be ++straightforwardly composed with other file manipulation expressions. ++The secondary value, created, is true if any directories were created. ++ ++Affected By:: ++............. ++ ++The host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type file-error is signaled if the host, device, or ++directory part of pathspec is wild. ++ ++ If the directory creation attempt is not successful, an error of type ++file-error is signaled; if this occurs, it might be the case that none, ++some, or all of the requested creations have actually occurred within ++the file system. ++ ++See Also:: ++.......... ++ ++*note probe-file:: , *note open:: , ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: truename, Next: file-author, Prev: ensure-directories-exist, Up: Files Dictionary ++ ++20.2.4 truename [Function] ++-------------------------- ++ ++'truename' filespec => truename ++ ++Arguments and Values:: ++...................... ++ ++filespec--a pathname designator. ++ ++ truename--a physical pathname. ++ ++Description:: ++............. ++ ++truename tries to find the file indicated by filespec and returns its ++truename. If the filespec designator is an open stream, its associated ++file is used. ++ ++ If filespec is a stream, truename can be used whether the stream is ++open or closed. It is permissible for truename to return more specific ++information after the stream is closed than when the stream was open. ++ ++ If filespec is a pathname it represents the name used to open the ++file. This may be, but is not required to be, the actual name of the ++file. ++ ++Examples:: ++.......... ++ ++ ;; An example involving version numbers. Note that the precise nature of ++ ;; the truename is implementation-dependent while the file is still open. ++ (with-open-file (stream ">vistor>test.text.newest") ++ (values (pathname stream) ++ (truename stream))) ++ => #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.1" ++ OR=> #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.newest" ++ OR=> #P"S:>vistor>test.text.newest", #P"S:>vistor>_temp_._temp_.1" ++ ++ ;; In this case, the file is closed when the truename is tried, so the ++ ;; truename information is reliable. ++ (with-open-file (stream ">vistor>test.text.newest") ++ (close stream) ++ (values (pathname stream) ++ (truename stream))) ++ => #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.1" ++ ++ ;; An example involving TOP-20's implementation-dependent concept ++ ;; of logical devices -- in this case, "DOC:" is shorthand for ++ ;; "PS:" ... ++ (with-open-file (stream "CMUC::DOC:DUMPER.HLP") ++ (values (pathname stream) ++ (truename stream))) ++ => #P"CMUC::DOC:DUMPER.HLP", #P"CMUC::PS:DUMPER.HLP.13" ++ ++Exceptional Situations:: ++........................ ++ ++An error of type file-error is signaled if an appropriate file cannot be ++located within the file system for the given filespec, ++ ++ or if the file system cannot perform the requested operation. ++ ++ An error of type file-error is signaled if pathname is wild. ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++truename may be used to account for any filename translations performed ++by the file system. ++ ++ ++File: gcl.info, Node: file-author, Next: file-write-date, Prev: truename, Up: Files Dictionary ++ ++20.2.5 file-author [Function] ++----------------------------- ++ ++'file-author' pathspec => author ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a pathname designator. ++ ++ author--a string or nil. ++ ++Description:: ++............. ++ ++Returns a string naming the author of the file specified by pathspec, or ++nil if the author's name cannot be determined. ++ ++Examples:: ++.......... ++ ++ (with-open-file (stream ">relativity>general.text") ++ (file-author s)) ++ => "albert" ++ ++Affected By:: ++............. ++ ++The host computer's file system. ++ ++ Other users of the file named by pathspec. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type file-error is signaled if pathspec is wild. ++ ++ An error of type file-error is signaled if the file system cannot ++perform the requested operation. ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: file-write-date, Next: rename-file, Prev: file-author, Up: Files Dictionary ++ ++20.2.6 file-write-date [Function] ++--------------------------------- ++ ++'file-write-date' pathspec => date ++ ++Arguments and Values:: ++...................... ++ ++pathspec--a pathname designator. ++ ++ date--a universal time or nil. ++ ++Description:: ++............. ++ ++Returns a universal time representing the time at which the file ++specified by pathspec was last written (or created), or returns nil if ++such a time cannot be determined. ++ ++Examples:: ++.......... ++ ++ (with-open-file (s "noel.text" ++ :direction :output :if-exists :error) ++ (format s "~&Dear Santa,~2 ++ Please leave lots of toys.~2 ++ ~2 ++ (truename s)) ++ => #P"CUPID:/susan/noel.text" ++ (with-open-file (s "noel.text") ++ (file-write-date s)) ++ => 2902600800 ++ ++Affected By:: ++............. ++ ++The host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type file-error is signaled if pathspec is wild. ++ ++ An error of type file-error is signaled if the file system cannot ++perform the requested operation. ++ ++See Also:: ++.......... ++ ++*note Universal Time::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: rename-file, Next: delete-file, Prev: file-write-date, Up: Files Dictionary ++ ++20.2.7 rename-file [Function] ++----------------------------- ++ ++'rename-file' filespec new-name => defaulted-new-name, old-truename, ++new-truename ++ ++Arguments and Values:: ++...................... ++ ++filespec--a pathname designator. ++ ++ new-name--a pathname designator other than a stream. ++ ++ defaulted-new-name--a pathname ++ ++ old-truename--a physical pathname. ++ ++ new-truename--a physical pathname. ++ ++Description:: ++............. ++ ++rename-file modifies the file system in such a way that the file ++indicated by filespec is renamed to defaulted-new-name. ++ ++ It is an error to specify a filename containing a wild component, for ++filespec to contain a nil component where the file system does not ++permit a nil component, or for the result of defaulting missing ++components of new-name from filespec to contain a nil component where ++the file system does not permit a nil component. ++ ++ If new-name is a logical pathname, rename-file returns a logical ++pathname as its primary value. ++ ++ rename-file returns three values if successful. The primary value, ++defaulted-new-name, is the resulting name which is composed of new-name ++with any missing components filled in by performing a merge-pathnames ++operation using filespec as the defaults. The secondary value, ++old-truename, is the truename of the file before it was renamed. The ++tertiary value, new-truename, is the truename of the file after it was ++renamed. ++ ++ If the filespec designator is an open stream, then the stream itself ++and the file associated with it are affected (if the file system ++permits). ++ ++Examples:: ++.......... ++ ++ ;; An example involving logical pathnames. ++ (with-open-file (stream "sys:chemistry;lead.text" ++ :direction :output :if-exists :error) ++ (princ "eureka" stream) ++ (values (pathname stream) (truename stream))) ++ => #P"SYS:CHEMISTRY;LEAD.TEXT.NEWEST", #P"Q:>sys>chem>lead.text.1" ++ (rename-file "sys:chemistry;lead.text" "gold.text") ++ => #P"SYS:CHEMISTRY;GOLD.TEXT.NEWEST", ++ #P"Q:>sys>chem>lead.text.1", ++ #P"Q:>sys>chem>gold.text.1" ++ ++Exceptional Situations:: ++........................ ++ ++If the renaming operation is not successful, an error of type file-error ++is signaled. ++ ++ An error of type file-error might be signaled if filespec is wild. ++ ++See Also:: ++.......... ++ ++*note truename:: , pathname, logical-pathname, *note File System ++Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: delete-file, Next: file-error, Prev: rename-file, Up: Files Dictionary ++ ++20.2.8 delete-file [Function] ++----------------------------- ++ ++'delete-file' filespec => t ++ ++Arguments and Values:: ++...................... ++ ++filespec--a pathname designator. ++ ++Description:: ++............. ++ ++Deletes the file specified by filespec. ++ ++ If the filespec designator is an open stream, then filespec and the ++file associated with it are affected (if the file system permits), in ++which case filespec might be closed immediately, and the deletion might ++be immediate or delayed until filespec is explicitly closed, depending ++on the requirements of the file system. ++ ++ It is implementation-dependent whether an attempt to delete a ++nonexistent file is considered to be successful. ++ ++ delete-file returns true if it succeeds, or signals an error of type ++file-error if it does not. ++ ++ The consequences are undefined if filespec has a wild component, or ++if filespec has a nil component and the file system does not permit a ++nil component. ++ ++Examples:: ++.......... ++ ++ (with-open-file (s "delete-me.text" :direction :output :if-exists :error)) ++ => NIL ++ (setq p (probe-file "delete-me.text")) => #P"R:>fred>delete-me.text.1" ++ (delete-file p) => T ++ (probe-file "delete-me.text") => false ++ (with-open-file (s "delete-me.text" :direction :output :if-exists :error) ++ (delete-file s)) ++ => T ++ (probe-file "delete-me.text") => false ++ ++Exceptional Situations:: ++........................ ++ ++If the deletion operation is not successful, an error of type file-error ++is signaled. ++ ++ An error of type file-error might be signaled if filespec is wild. ++ ++See Also:: ++.......... ++ ++pathname, logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: file-error, Next: file-error-pathname, Prev: delete-file, Up: Files Dictionary ++ ++20.2.9 file-error [Condition Type] ++---------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++file-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type file-error consists of error conditions that occur during an ++attempt to open or close a file, or during some low-level transactions ++with a file system. The "offending pathname" is initialized by the ++:pathname initialization argument to make-condition, and is accessed by ++the function file-error-pathname. ++ ++See Also:: ++.......... ++ ++file-error-pathname, *note open:: , *note probe-file:: , *note ++directory:: , *note ensure-directories-exist:: ++ ++ ++File: gcl.info, Node: file-error-pathname, Prev: file-error, Up: Files Dictionary ++ ++20.2.10 file-error-pathname [Function] ++-------------------------------------- ++ ++'file-error-pathname' condition => pathspec ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type file-error. ++ ++ pathspec--a pathname designator. ++ ++Description:: ++............. ++ ++Returns the "offending pathname" of a condition of type file-error. ++ ++Exceptional Situations:: ++........................ ++ ++See Also:: ++.......... ++ ++file-error, *note Conditions:: ++ ++ ++File: gcl.info, Node: Streams, Next: Printer, Prev: Files, Up: Top ++ ++21 Streams ++********** ++ ++* Menu: ++ ++* Stream Concepts:: ++* Streams Dictionary:: ++ ++ ++File: gcl.info, Node: Stream Concepts, Next: Streams Dictionary, Prev: Streams, Up: Streams ++ ++21.1 Stream Concepts ++==================== ++ ++* Menu: ++ ++* Introduction to Streams:: ++* Stream Variables:: ++* Stream Arguments to Standardized Functions:: ++* Restrictions on Composite Streams:: ++ ++ ++File: gcl.info, Node: Introduction to Streams, Next: Stream Variables, Prev: Stream Concepts, Up: Stream Concepts ++ ++21.1.1 Introduction to Streams ++------------------------------ ++ ++A stream is an object that can be used with an input or output function ++to identify an appropriate source or sink of characters or bytes for ++that operation. A character stream is a source or sink of characters. ++A binary stream is a source or sink of bytes. ++ ++ Some operations may be performed on any kind of stream; Figure 21-1 ++provides a list of standardized operations that are potentially useful ++with any kind of stream. ++ ++ close stream-element-type ++ input-stream-p streamp ++ interactive-stream-p with-open-stream ++ output-stream-p ++ ++ Figure 21-1: Some General-Purpose Stream Operations ++ ++ ++ Other operations are only meaningful on certain stream types. For ++example, read-char is only defined for character streams and read-byte ++is only defined for binary streams. ++ ++* Menu: ++ ++* Abstract Classifications of Streams (Introduction to Streams):: ++* Input:: ++* Open and Closed Streams:: ++* Interactive Streams:: ++* Abstract Classifications of Streams:: ++* File Streams:: ++* Other Subclasses of Stream:: ++ ++ ++File: gcl.info, Node: Abstract Classifications of Streams (Introduction to Streams), Next: Input, Prev: Introduction to Streams, Up: Introduction to Streams ++ ++21.1.1.1 Abstract Classifications of Streams ++............................................ ++ ++ ++File: gcl.info, Node: Input, Next: Open and Closed Streams, Prev: Abstract Classifications of Streams (Introduction to Streams), Up: Introduction to Streams ++ ++21.1.1.2 Input, Output, and Bidirectional Streams ++................................................. ++ ++A stream, whether a character stream or a binary stream, can be an input ++stream (source of data), an output stream (sink for data), both, or ++(e.g., when ":direction :probe" is given to open) neither. ++ ++ Figure 21-2 shows operators relating to input streams. ++ ++ clear-input read-byte read-from-string ++ listen read-char read-line ++ peek-char read-char-no-hang read-preserving-whitespace ++ read read-delimited-list unread-char ++ ++ Figure 21-2: Operators relating to Input Streams. ++ ++ ++ Figure 21-3 shows operators relating to output streams. ++ ++ clear-output prin1 write ++ finish-output prin1-to-string write-byte ++ force-output princ write-char ++ format princ-to-string write-line ++ fresh-line print write-string ++ pprint terpri write-to-string ++ ++ Figure 21-3: Operators relating to Output Streams. ++ ++ ++ A stream that is both an input stream and an output stream is called ++a bidirectional stream . See the functions input-stream-p and ++output-stream-p. ++ ++ Any of the operators listed in Figure~21-2 or Figure~21-3 can be used ++with bidirectional streams. In addition, Figure 21-4 shows a list of ++operators that relate specificaly to bidirectional streams. ++ ++ y-or-n-p yes-or-no-p ++ ++ Figure 21-4: Operators relating to Bidirectional Streams. ++ ++ ++ ++File: gcl.info, Node: Open and Closed Streams, Next: Interactive Streams, Prev: Input, Up: Introduction to Streams ++ ++21.1.1.3 Open and Closed Streams ++................................ ++ ++Streams are either open or closed . ++ ++ Except as explicitly specified otherwise, operations that create and ++return streams return open streams. ++ ++ The action of closing a stream marks the end of its use as a source ++or sink of data, permitting the implementation to reclaim its internal ++data structures, and to free any external resources which might have ++been locked by the stream when it was opened. ++ ++ Except as explicitly specified otherwise, the consequences are ++undefined when a closed stream is used where a stream is called for. ++ ++ Coercion of streams to pathnames is permissible for closed streams; ++in some situations, such as for a truename computation, the result might ++be different for an open stream and for that same stream once it has ++been closed. ++ ++ ++File: gcl.info, Node: Interactive Streams, Next: Abstract Classifications of Streams, Prev: Open and Closed Streams, Up: Introduction to Streams ++ ++21.1.1.4 Interactive Streams ++............................ ++ ++An interactive stream is one on which it makes sense to perform ++interactive querying. ++ ++ The precise meaning of an interactive stream is ++implementation-defined, and may depend on the underlying operating ++system. Some examples of the things that an implementation might choose ++to use as identifying characteristics of an interactive stream include: ++ ++* ++ The stream is connected to a person (or equivalent) in such a way ++ that the program can prompt for information and expect to receive ++ different input depending on the prompt. ++ ++* ++ The program is expected to prompt for input and support "normal ++ input editing". ++ ++* ++ read-char might wait for the user to type something before ++ returning instead of immediately returning a character or ++ end-of-file. ++ ++ The general intent of having some streams be classified as ++interactive streams is to allow them to be distinguished from streams ++containing batch (or background or command-file) input. Output to batch ++streams is typically discarded or saved for later viewing, so ++interactive queries to such streams might not have the expected effect. ++ ++ Terminal I/O might or might not be an interactive stream. ++ ++ ++File: gcl.info, Node: Abstract Classifications of Streams, Next: File Streams, Prev: Interactive Streams, Up: Introduction to Streams ++ ++21.1.1.5 Abstract Classifications of Streams ++............................................ ++ ++ ++File: gcl.info, Node: File Streams, Next: Other Subclasses of Stream, Prev: Abstract Classifications of Streams, Up: Introduction to Streams ++ ++21.1.1.6 File Streams ++..................... ++ ++Some streams, called file streams , provide access to files. An object ++of class file-stream is used to represent a file stream. ++ ++ The basic operation for opening a file is open, which typically ++returns a file stream (see its dictionary entry for details). The basic ++operation for closing a stream is close. The macro with-open-file is ++useful to express the common idiom of opening a file for the duration of ++a given body of code, and assuring that the resulting stream is closed ++upon exit from that body. ++ ++ ++File: gcl.info, Node: Other Subclasses of Stream, Prev: File Streams, Up: Introduction to Streams ++ ++21.1.1.7 Other Subclasses of Stream ++................................... ++ ++The class stream has a number of subclasses defined by this ++specification. Figure 21-5 shows some information about these ++subclasses. ++ ++ Class Related Operators ++ broadcast-stream make-broadcast-stream ++ broadcast-stream-streams ++ concatenated-stream make-concatenated-stream ++ concatenated-stream-streams ++ echo-stream make-echo-stream ++ echo-stream-input-stream ++ echo-stream-output-stream ++ string-stream make-string-input-stream ++ with-input-from-string ++ make-string-output-stream ++ with-output-to-string ++ get-output-stream-string ++ synonym-stream make-synonym-stream ++ synonym-stream-symbol ++ two-way-stream make-two-way-stream ++ two-way-stream-input-stream ++ two-way-stream-output-stream ++ ++ Figure 21-5: Defined Names related to Specialized Streams ++ ++ ++ ++File: gcl.info, Node: Stream Variables, Next: Stream Arguments to Standardized Functions, Prev: Introduction to Streams, Up: Stream Concepts ++ ++21.1.2 Stream Variables ++----------------------- ++ ++Variables whose values must be streams are sometimes called stream ++variables . ++ ++ Certain stream variables are defined by this specification to be the ++proper source of input or output in various situations where no specific ++stream has been specified instead. A complete list of such standardized ++stream variables appears in Figure 21-6. The consequences are undefined ++if at any time the value of any of these variables is not an open ++stream. ++ ++ Glossary Term Variable Name ++ debug I/O *debug-io* ++ error output *error-output* ++ query I/O *query-io* ++ standard input *standard-input* ++ standard output *standard-output* ++ terminal I/O *terminal-io* ++ trace output *trace-output* ++ ++ Figure 21-6: Standardized Stream Variables ++ ++ ++ Note that, by convention, standardized stream variables have names ++ending in "-input*" if they must be input streams, ending in "-output*" ++if they must be output streams, or ending in "-io*" if they must be ++bidirectional streams. ++ ++ User programs may assign or bind any standardized stream variable ++except *terminal-io*. ++ ++ ++File: gcl.info, Node: Stream Arguments to Standardized Functions, Next: Restrictions on Composite Streams, Prev: Stream Variables, Up: Stream Concepts ++ ++21.1.3 Stream Arguments to Standardized Functions ++------------------------------------------------- ++ ++The operators in Figure 21-7 accept stream arguments that might be ++either open or closed streams. ++ ++ broadcast-stream-streams file-author pathnamep ++ close file-namestring probe-file ++ compile-file file-write-date rename-file ++ compile-file-pathname host-namestring streamp ++ concatenated-stream-streams load synonym-stream-symbol ++ delete-file logical-pathname translate-logical-pathname ++ directory merge-pathnames translate-pathname ++ directory-namestring namestring truename ++ dribble open two-way-stream-input-stream ++ echo-stream-input-stream open-stream-p two-way-stream-output-stream ++ echo-stream-ouput-stream parse-namestring wild-pathname-p ++ ed pathname with-open-file ++ enough-namestring pathname-match-p ++ ++ Figure 21-7: Operators that accept either Open or Closed Streams ++ ++ ++ The operators in Figure 21-8 accept stream arguments that must be ++open streams. ++ ++ clear-input output-stream-p read-char-no-hang ++ clear-output peek-char read-delimited-list ++ file-length pprint read-line ++ file-position pprint-fill read-preserving-whitespace ++ file-string-length pprint-indent stream-element-type ++ finish-output pprint-linear stream-external-format ++ force-output pprint-logical-block terpri ++ format pprint-newline unread-char ++ fresh-line pprint-tab with-open-stream ++ get-output-stream-string pprint-tabular write ++ input-stream-p prin1 write-byte ++ interactive-stream-p princ write-char ++ listen print write-line ++ make-broadcast-stream print-object write-string ++ make-concatenated-stream print-unreadable-object y-or-n-p ++ make-echo-stream read yes-or-no-p ++ make-synonym-stream read-byte ++ make-two-way-stream read-char ++ ++ Figure 21-8: Operators that accept Open Streams only ++ ++ ++ ++File: gcl.info, Node: Restrictions on Composite Streams, Prev: Stream Arguments to Standardized Functions, Up: Stream Concepts ++ ++21.1.4 Restrictions on Composite Streams ++---------------------------------------- ++ ++The consequences are undefined if any component of a composite stream is ++closed before the composite stream is closed. ++ ++ The consequences are undefined if the synonym stream symbol is not ++bound to an open stream from the time of the synonym stream's creation ++until the time it is closed. ++ ++ ++File: gcl.info, Node: Streams Dictionary, Prev: Stream Concepts, Up: Streams ++ ++21.2 Streams Dictionary ++======================= ++ ++* Menu: ++ ++* stream:: ++* broadcast-stream:: ++* concatenated-stream:: ++* echo-stream:: ++* file-stream:: ++* string-stream:: ++* synonym-stream:: ++* two-way-stream:: ++* input-stream-p:: ++* interactive-stream-p:: ++* open-stream-p:: ++* stream-element-type:: ++* streamp:: ++* read-byte:: ++* write-byte:: ++* peek-char:: ++* read-char:: ++* read-char-no-hang:: ++* terpri:: ++* unread-char:: ++* write-char:: ++* read-line:: ++* write-string:: ++* read-sequence:: ++* write-sequence:: ++* file-length:: ++* file-position:: ++* file-string-length:: ++* open:: ++* stream-external-format:: ++* with-open-file:: ++* close:: ++* with-open-stream:: ++* listen:: ++* clear-input:: ++* finish-output:: ++* y-or-n-p:: ++* make-synonym-stream:: ++* synonym-stream-symbol:: ++* broadcast-stream-streams:: ++* make-broadcast-stream:: ++* make-two-way-stream:: ++* two-way-stream-input-stream:: ++* echo-stream-input-stream:: ++* make-echo-stream:: ++* concatenated-stream-streams:: ++* make-concatenated-stream:: ++* get-output-stream-string:: ++* make-string-input-stream:: ++* make-string-output-stream:: ++* with-input-from-string:: ++* with-output-to-string:: ++* *debug-io*:: ++* *terminal-io*:: ++* stream-error:: ++* stream-error-stream:: ++* end-of-file:: ++ ++ ++File: gcl.info, Node: stream, Next: broadcast-stream, Prev: Streams Dictionary, Up: Streams Dictionary ++ ++21.2.1 stream [System Class] ++---------------------------- ++ ++Class Precedence List:: ++....................... ++ ++stream, t ++ ++Description:: ++............. ++ ++A stream is an object that can be used with an input or output function ++to identify an appropriate source or sink of characters or bytes for ++that operation. ++ ++ For more complete information, see *note Stream Concepts::. ++ ++See Also:: ++.......... ++ ++*note Stream Concepts::, *note Printing Other Objects::, *note ++Printer::, *note Reader:: ++ ++ ++File: gcl.info, Node: broadcast-stream, Next: concatenated-stream, Prev: stream, Up: Streams Dictionary ++ ++21.2.2 broadcast-stream [System Class] ++-------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++broadcast-stream, stream, t ++ ++Description:: ++............. ++ ++A broadcast stream is an output stream which has associated with it a ++set of zero or more output streams such that any output sent to the ++broadcast stream gets passed on as output to each of the associated ++output streams. (If a broadcast stream has no component streams, then ++all output to the broadcast stream is discarded.) ++ ++ The set of operations that may be performed on a broadcast stream is ++the intersection of those for its associated output streams. ++ ++ Some output operations (e.g., fresh-line) return values based on the ++state of the stream at the time of the operation. ++ ++ Since these values might differ for each of the component streams, it ++is necessary to describe their return value specifically: ++ ++* ++ stream-element-type returns the value from the last component ++ stream, or t if there are no component streams. ++ ++* ++ fresh-line returns the value from the last component stream, or nil ++ if there are no component streams. ++ ++* ++ The functions file-length, file-position, file-string-length, and ++ stream-external-format return the value from the last component ++ stream; if there are no component streams, file-length and ++ file-position return 0, file-string-length returns 1, and ++ stream-external-format returns :default. ++ ++* ++ The functions streamp and output-stream-p always return true for ++ broadcast streams. ++ ++* ++ The functions open-stream-p tests whether the broadcast stream is ++ open_2, not whether its component streams are open. ++ ++* ++ The functions input-stream-p and interactive-stream-p return an ++ implementation-defined, generalized boolean value. ++ ++* ++ For the input operations clear-input listen, peek-char, read-byte, ++ read-char-no-hang, read-char, read-line, and unread-char, the ++ consequences are undefined if the indicated operation is performed. ++ However, an implementation is permitted to define such a behavior ++ as an implementation-dependent extension. ++ ++ For any output operations not having their return values explicitly ++specified above or elsewhere in this document, it is defined that the ++values returned by such an operation are the values resulting from ++performing the operation on the last of its component streams; the ++values resulting from performing the operation on all preceding streams ++are discarded. If there are no component streams, the value is ++implementation-dependent. ++ ++See Also:: ++.......... ++ ++*note broadcast-stream-streams:: , *note make-broadcast-stream:: ++ ++ ++File: gcl.info, Node: concatenated-stream, Next: echo-stream, Prev: broadcast-stream, Up: Streams Dictionary ++ ++21.2.3 concatenated-stream [System Class] ++----------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++concatenated-stream, stream, t ++ ++Description:: ++............. ++ ++A concatenated stream is an input stream which is a composite stream of ++zero or more other input streams, such that the sequence of data which ++can be read from the concatenated stream is the same as the ++concatenation of the sequences of data which could be read from each of ++the constituent streams. ++ ++ Input from a concatenated stream is taken from the first of the ++associated input streams until it reaches end of file_1; then that ++stream is discarded, and subsequent input is taken from the next input ++stream, and so on. An end of file on the associated input streams is ++always managed invisibly by the concatenated stream--the only time a ++client of a concatenated stream sees an end of file is when an attempt ++is made to obtain data from the concatenated stream but it has no ++remaining input streams from which to obtain such data. ++ ++See Also:: ++.......... ++ ++*note concatenated-stream-streams:: , *note make-concatenated-stream:: ++ ++ ++File: gcl.info, Node: echo-stream, Next: file-stream, Prev: concatenated-stream, Up: Streams Dictionary ++ ++21.2.4 echo-stream [System Class] ++--------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++echo-stream, stream, t ++ ++Description:: ++............. ++ ++An echo stream is a bidirectional stream that gets its input from an ++associated input stream and sends its output to an associated output ++stream. ++ ++ All input taken from the input stream is echoed to the output stream. ++Whether the input is echoed immediately after it is encountered, or ++after it has been read from the input stream is ++implementation-dependent. ++ ++See Also:: ++.......... ++ ++*note echo-stream-input-stream:: , echo-stream-output-stream, *note ++make-echo-stream:: ++ ++ ++File: gcl.info, Node: file-stream, Next: string-stream, Prev: echo-stream, Up: Streams Dictionary ++ ++21.2.5 file-stream [System Class] ++--------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++file-stream, stream, t ++ ++Description:: ++............. ++ ++An object of type file-stream is a stream the direct source or sink of ++which is a file. Such a stream is created explicitly by open and ++with-open-file, and implicitly by functions such as load that process ++files. ++ ++See Also:: ++.......... ++ ++*note load:: , *note open:: , *note with-open-file:: ++ ++ ++File: gcl.info, Node: string-stream, Next: synonym-stream, Prev: file-stream, Up: Streams Dictionary ++ ++21.2.6 string-stream [System Class] ++----------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++string-stream, stream, t ++ ++Description:: ++............. ++ ++A string stream is a stream which reads input from or writes output to ++an associated string. ++ ++ The stream element type of a string stream is always a subtype of ++type character. ++ ++See Also:: ++.......... ++ ++*note make-string-input-stream:: , *note make-string-output-stream:: , ++*note with-input-from-string:: , *note with-output-to-string:: ++ ++ ++File: gcl.info, Node: synonym-stream, Next: two-way-stream, Prev: string-stream, Up: Streams Dictionary ++ ++21.2.7 synonym-stream [System Class] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++synonym-stream, stream, t ++ ++Description:: ++............. ++ ++A stream that is an alias for another stream, which is the value of a ++dynamic variable whose name is the synonym stream symbol of the synonym ++stream. ++ ++ Any operations on a synonym stream will be performed on the stream ++that is then the value of the dynamic variable named by the synonym ++stream symbol. If the value of the variable should change, or if the ++variable should be bound, then the stream will operate on the new value ++of the variable. ++ ++See Also:: ++.......... ++ ++*note make-synonym-stream:: , *note synonym-stream-symbol:: ++ ++ ++File: gcl.info, Node: two-way-stream, Next: input-stream-p, Prev: synonym-stream, Up: Streams Dictionary ++ ++21.2.8 two-way-stream [System Class] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++two-way-stream, stream, t ++ ++Description:: ++............. ++ ++A bidirectional composite stream that receives its input from an ++associated input stream and sends its output to an associated output ++stream. ++ ++See Also:: ++.......... ++ ++*note make-two-way-stream:: , *note two-way-stream-input-stream:: , ++two-way-stream-output-stream ++ ++ ++File: gcl.info, Node: input-stream-p, Next: interactive-stream-p, Prev: two-way-stream, Up: Streams Dictionary ++ ++21.2.9 input-stream-p, output-stream-p [Function] ++------------------------------------------------- ++ ++'input-stream-p' stream => generalized-boolean ++ ++ 'output-stream-p' stream => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++input-stream-p returns true if stream is an input stream; otherwise, ++returns false. ++ ++ output-stream-p returns true if stream is an output stream; ++otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (input-stream-p *standard-input*) => true ++ (input-stream-p *terminal-io*) => true ++ (input-stream-p (make-string-output-stream)) => false ++ ++ (output-stream-p *standard-output*) => true ++ (output-stream-p *terminal-io*) => true ++ (output-stream-p (make-string-input-stream "jr")) => false ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream. ++ ++ ++File: gcl.info, Node: interactive-stream-p, Next: open-stream-p, Prev: input-stream-p, Up: Streams Dictionary ++ ++21.2.10 interactive-stream-p [Function] ++--------------------------------------- ++ ++'interactive-stream-p' stream => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if stream is an interactive stream; otherwise, returns ++false. ++ ++Examples:: ++.......... ++ ++ (when (> measured limit) ++ (let ((error (round (* (- measured limit) 100) ++ limit))) ++ (unless (if (interactive-stream-p *query-io*) ++ (yes-or-no-p "The frammis is out of tolerance by ~D ++ Is it safe to proceed? " error) ++ (< error 15)) ;15 ++ (error "The frammis is out of tolerance by ~D ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream. ++ ++See Also:: ++.......... ++ ++*note Stream Concepts:: ++ ++ ++File: gcl.info, Node: open-stream-p, Next: stream-element-type, Prev: interactive-stream-p, Up: Streams Dictionary ++ ++21.2.11 open-stream-p [Function] ++-------------------------------- ++ ++'open-stream-p' stream => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if stream is an open stream; otherwise, returns false. ++ ++ Streams are open until they have been explicitly closed with close, ++or until they are implicitly closed due to exit from a ++with-output-to-string, with-open-file, with-input-from-string, or ++with-open-stream form. ++ ++Examples:: ++.......... ++ ++ (open-stream-p *standard-input*) => true ++ ++Affected By:: ++............. ++ ++close. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream. ++ ++ ++File: gcl.info, Node: stream-element-type, Next: streamp, Prev: open-stream-p, Up: Streams Dictionary ++ ++21.2.12 stream-element-type [Function] ++-------------------------------------- ++ ++'stream-element-type' stream => typespec ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream. ++ ++ typespec--a type specifier. ++ ++Description:: ++............. ++ ++stream-element-type returns a type specifier that indicates the types of ++objects that may be read from or written to stream. ++ ++ Streams created by open have an element type restricted to integer or ++a subtype of type character. ++ ++Examples:: ++.......... ++ ++ ;; Note that the stream must accomodate at least the specified type, ++ ;; but might accomodate other types. Further note that even if it does ++ ;; accomodate exactly the specified type, the type might be specified in ++ ;; any of several ways. ++ (with-open-file (s "test" :element-type '(integer 0 1) ++ :if-exists :error ++ :direction :output) ++ (stream-element-type s)) ++ => INTEGER ++ OR=> (UNSIGNED-BYTE 16) ++ OR=> (UNSIGNED-BYTE 8) ++ OR=> BIT ++ OR=> (UNSIGNED-BYTE 1) ++ OR=> (INTEGER 0 1) ++ OR=> (INTEGER 0 (2)) ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream. ++ ++ ++File: gcl.info, Node: streamp, Next: read-byte, Prev: stream-element-type, Up: Streams Dictionary ++ ++21.2.13 streamp [Function] ++-------------------------- ++ ++'streamp' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type stream; otherwise, returns false. ++ ++ streamp is unaffected by whether object, if it is a stream, is open ++or closed. ++ ++Examples:: ++.......... ++ ++ (streamp *terminal-io*) => true ++ (streamp 1) => false ++ ++Notes:: ++....... ++ ++ (streamp object) == (typep object 'stream) ++ ++ ++File: gcl.info, Node: read-byte, Next: write-byte, Prev: streamp, Up: Streams Dictionary ++ ++21.2.14 read-byte [Function] ++---------------------------- ++ ++'read-byte' stream &optional eof-error-p eof-value => byte ++ ++Arguments and Values:: ++...................... ++ ++stream--a binary input stream. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. The default is nil. ++ ++ byte--an integer, or the eof-value. ++ ++Description:: ++............. ++ ++read-byte reads and returns one byte from stream. ++ ++ If an end of file_2 occurs and eof-error-p is false, the eof-value is ++returned. ++ ++Examples:: ++.......... ++ ++ (with-open-file (s "temp-bytes" ++ :direction :output ++ :element-type 'unsigned-byte) ++ (write-byte 101 s)) => 101 ++ (with-open-file (s "temp-bytes" :element-type 'unsigned-byte) ++ (format t "~S ~S" (read-byte s) (read-byte s nil 'eof))) ++ |> 101 EOF ++ => NIL ++ ++Side Effects:: ++.............. ++ ++Modifies stream. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream. ++ ++ Should signal an error of type error if stream is not a binary input ++stream. ++ ++ If there are no bytes remaining in the stream and eof-error-p is ++true, an error of type end-of-file is signaled. ++ ++See Also:: ++.......... ++ ++*note read-char:: , ++ ++ *note read-sequence:: , ++ ++ *note write-byte:: ++ ++ ++File: gcl.info, Node: write-byte, Next: peek-char, Prev: read-byte, Up: Streams Dictionary ++ ++21.2.15 write-byte [Function] ++----------------------------- ++ ++'write-byte' byte stream => byte ++ ++Arguments and Values:: ++...................... ++ ++byte--an integer of the stream element type of stream. ++ ++ stream--a binary output stream. ++ ++Description:: ++............. ++ ++write-byte writes one byte, byte, to stream. ++ ++Examples:: ++.......... ++ ++ (with-open-file (s "temp-bytes" ++ :direction :output ++ :element-type 'unsigned-byte) ++ (write-byte 101 s)) => 101 ++ ++Side Effects:: ++.............. ++ ++stream is modified. ++ ++Affected By:: ++............. ++ ++The element type of the stream. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream. ++Should signal an error of type error if stream is not a binary output ++stream. ++ ++ Might signal an error of type type-error if byte is not an integer of ++the stream element type of stream. ++ ++See Also:: ++.......... ++ ++*note read-byte:: , *note write-char:: , ++ ++ *note write-sequence:: ++ ++ ++File: gcl.info, Node: peek-char, Next: read-char, Prev: write-byte, Up: Streams Dictionary ++ ++21.2.16 peek-char [Function] ++---------------------------- ++ ++'peek-char' &optional peek-type input-stream eof-error-p eof-value ++recursive-p => char ++ ++Arguments and Values:: ++...................... ++ ++peek-type--a character or t or nil. ++ ++ input-stream--input stream designator. The default is standard ++input. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. The default is nil. ++ ++ recursive-p--a generalized boolean. The default is false. ++ ++ char--a character or the eof-value. ++ ++Description:: ++............. ++ ++peek-char obtains the next character in input-stream without actually ++reading it, thus leaving the character to be read at a later time. It ++can also be used to skip over and discard intervening characters in the ++input-stream until a particular character is found. ++ ++ If peek-type is not supplied or nil, peek-char returns the next ++character to be read from input-stream, without actually removing it ++from input-stream. The next time input is done from input-stream, the ++character will still be there. If peek-type is t, then peek-char skips ++over whitespace_2 characters, but not comments, and then performs the ++peeking operation on the next character. The last character examined, ++the one that starts an object, is not removed from input-stream. If ++peek-type is a character, then peek-char skips over input characters ++until a character that is char= to that character is found; that ++character is left in input-stream. ++ ++ If an end of file_2 occurs and eof-error-p is false, eof-value is ++returned. ++ ++ If recursive-p is true, this call is expected to be embedded in a ++higher-level call to read or a similar function used by the Lisp reader. ++ ++ When input-stream is an echo stream, characters that are only peeked ++at are not echoed. In the case that peek-type is not nil, the ++characters that are passed by peek-char are treated as if by read-char, ++and so are echoed unless they have been marked otherwise by unread-char. ++ ++Examples:: ++.......... ++ ++ (with-input-from-string (input-stream " 1 2 3 4 5") ++ (format t "~S ~S ~S" ++ (peek-char t input-stream) ++ (peek-char #\4 input-stream) ++ (peek-char nil input-stream))) ++ |> #\1 #\4 #\4 ++ => NIL ++ ++Affected By:: ++............. ++ ++*readtable*, *standard-input*, *terminal-io*. ++ ++Exceptional Situations:: ++........................ ++ ++If eof-error-p is true and an end of file_2 occurs an error of type ++end-of-file is signaled. ++ ++ If peek-type is a character, an end of file_2 occurs, and eof-error-p ++is true, an error of type end-of-file is signaled. ++ ++ If recursive-p is true and an end of file_2 occurs, an error of type ++end-of-file is signaled. ++ ++ ++File: gcl.info, Node: read-char, Next: read-char-no-hang, Prev: peek-char, Up: Streams Dictionary ++ ++21.2.17 read-char [Function] ++---------------------------- ++ ++'read-char' &optional input-stream eof-error-p eof-value recursive-p => ++char ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream designator. The default is standard ++input. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. The default is nil. ++ ++ recursive-p--a generalized boolean. The default is false. ++ ++ char--a character or the eof-value. ++ ++Description:: ++............. ++ ++read-char returns the next character from input-stream. ++ ++ When input-stream is an echo stream, the character is echoed on ++input-stream the first time the character is seen. Characters that are ++not echoed by read-char are those that were put there by unread-char and ++hence are assumed to have been echoed already by a previous call to ++read-char. ++ ++ If recursive-p is true, this call is expected to be embedded in a ++higher-level call to read or a similar function used by the Lisp reader. ++ ++ If an end of file_2 occurs and eof-error-p is false, eof-value is ++returned. ++ ++Examples:: ++.......... ++ ++ (with-input-from-string (is "0123") ++ (do ((c (read-char is) (read-char is nil 'the-end))) ++ ((not (characterp c))) ++ (format t "~S " c))) ++ |> #\0 #\1 #\2 #\3 ++ => NIL ++ ++Affected By:: ++............. ++ ++*standard-input*, *terminal-io*. ++ ++Exceptional Situations:: ++........................ ++ ++If an end of file_2 occurs before a character can be read, and ++eof-error-p is true, an error of type end-of-file is signaled. ++ ++See Also:: ++.......... ++ ++*note read-byte:: , ++ ++ *note read-sequence:: , ++ ++ *note write-char:: , *note read:: ++ ++Notes:: ++....... ++ ++The corresponding output function is write-char. ++ ++ ++File: gcl.info, Node: read-char-no-hang, Next: terpri, Prev: read-char, Up: Streams Dictionary ++ ++21.2.18 read-char-no-hang [Function] ++------------------------------------ ++ ++'read-char-no-hang' &optional input-stream eof-error-p eof-value ++recursive-p => char ++ ++Arguments and Values:: ++...................... ++ ++input-stream - an input stream designator. The default is standard ++input. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. The default is nil. ++ ++ recursive-p--a generalized boolean. The default is false. ++ ++ char--a character or nil or the eof-value. ++ ++Description:: ++............. ++ ++read-char-no-hang returns a character from input-stream if such a ++character is available. If no character is available, read-char-no-hang ++returns nil. ++ ++ If recursive-p is true, this call is expected to be embedded in a ++higher-level call to read or a similar function used by the Lisp reader. ++ ++ If an end of file_2 occurs and eof-error-p is false, eof-value is ++returned. ++ ++Examples:: ++.......... ++ ++ ;; This code assumes an implementation in which a newline is not ++ ;; required to terminate input from the console. ++ (defun test-it () ++ (unread-char (read-char)) ++ (list (read-char-no-hang) ++ (read-char-no-hang) ++ (read-char-no-hang))) ++ => TEST-IT ++ ;; Implementation A, where a Newline is not required to terminate ++ ;; interactive input on the console. ++ (test-it) ++ |> |>>a<<| ++ => (#\a NIL NIL) ++ ;; Implementation B, where a Newline is required to terminate ++ ;; interactive input on the console, and where that Newline remains ++ ;; on the input stream. ++ (test-it) ++ |> |>>a[<-~]<<| ++ => (#\a #\Newline NIL) ++ ++Affected By:: ++............. ++ ++*standard-input*, *terminal-io*. ++ ++Exceptional Situations:: ++........................ ++ ++If an end of file_2 occurs when eof-error-p is true, an error of type ++end-of-file is signaled . ++ ++See Also:: ++.......... ++ ++*note listen:: ++ ++Notes:: ++....... ++ ++read-char-no-hang is exactly like read-char, except that if it would be ++necessary to wait in order to get a character (as from a keyboard), nil ++is immediately returned without waiting. ++ ++ ++File: gcl.info, Node: terpri, Next: unread-char, Prev: read-char-no-hang, Up: Streams Dictionary ++ ++21.2.19 terpri, fresh-line [Function] ++------------------------------------- ++ ++'terpri' &optional output-stream => nil ++ ++ 'fresh-line' &optional output-stream => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++output-stream - an output stream designator. The default is standard ++output. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++terpri outputs a newline to output-stream. ++ ++ fresh-line is similar to terpri but outputs a newline only if the ++output-stream is not already at the start of a line. If for some reason ++this cannot be determined, then a newline is output anyway. fresh-line ++returns true if it outputs a newline; otherwise it returns false. ++ ++Examples:: ++.......... ++ ++ (with-output-to-string (s) ++ (write-string "some text" s) ++ (terpri s) ++ (terpri s) ++ (write-string "more text" s)) ++ => "some text ++ ++ more text" ++ (with-output-to-string (s) ++ (write-string "some text" s) ++ (fresh-line s) ++ (fresh-line s) ++ (write-string "more text" s)) ++ => "some text ++ more text" ++ ++Side Effects:: ++.............. ++ ++The output-stream is modified. ++ ++Affected By:: ++............. ++ ++*standard-output*, *terminal-io*. ++ ++Exceptional Situations:: ++........................ ++ ++None. ++ ++ [Reviewer Note by Barmar: What if stream is closed?] ++ ++Notes:: ++....... ++ ++terpri is identical in effect to ++ ++ (write-char #\Newline output-stream) ++ ++ ++File: gcl.info, Node: unread-char, Next: write-char, Prev: terpri, Up: Streams Dictionary ++ ++21.2.20 unread-char [Function] ++------------------------------ ++ ++'unread-char' character &optional input-stream => nil ++ ++Arguments and Values:: ++...................... ++ ++character--a character; must be the last character that was read from ++input-stream. ++ ++ input-stream--an input stream designator. The default is standard ++input. ++ ++Description:: ++............. ++ ++unread-char places character back onto the front of input-stream so that ++it will again be the next character in input-stream. ++ ++ When input-stream is an echo stream, no attempt is made to undo any ++echoing of the character that might already have been done on ++input-stream. However, characters placed on input-stream by unread-char ++are marked in such a way as to inhibit later re-echo by read-char. ++ ++ It is an error to invoke unread-char twice consecutively on the same ++stream without an intervening call to read-char (or some other input ++operation which implicitly reads characters) on that stream. ++ ++ Invoking peek-char or read-char commits all previous characters. The ++consequences of invoking unread-char on any character preceding that ++which is returned by peek-char (including those passed over by peek-char ++that has a non-nil peek-type) are unspecified. In particular, the ++consequences of invoking unread-char after peek-char are unspecified. ++ ++Examples:: ++.......... ++ ++ (with-input-from-string (is "0123") ++ (dotimes (i 6) ++ (let ((c (read-char is))) ++ (if (evenp i) (format t "~&~S ~S~ ++ |> 0 #\0 ++ |> 2 #\1 ++ |> 4 #\2 ++ => NIL ++ ++Affected By:: ++............. ++ ++*standard-input*, *terminal-io*. ++ ++See Also:: ++.......... ++ ++*note peek-char:: , *note read-char:: , *note Stream Concepts:: ++ ++Notes:: ++....... ++ ++unread-char is intended to be an efficient mechanism for allowing the ++Lisp reader and other parsers to perform one-character lookahead in ++input-stream. ++ ++ ++File: gcl.info, Node: write-char, Next: read-line, Prev: unread-char, Up: Streams Dictionary ++ ++21.2.21 write-char [Function] ++----------------------------- ++ ++'write-char' character &optional output-stream => character ++ ++Arguments and Values:: ++...................... ++ ++character--a character. ++ ++ output-stream - an output stream designator. The default is standard ++output. ++ ++Description:: ++............. ++ ++write-char outputs character to output-stream. ++ ++Examples:: ++.......... ++ ++ (write-char #\a) ++ |> a ++ => #\a ++ (with-output-to-string (s) ++ (write-char #\a s) ++ (write-char #\Space s) ++ (write-char #\b s)) ++ => "a b" ++ ++Side Effects:: ++.............. ++ ++The output-stream is modified. ++ ++Affected By:: ++............. ++ ++*standard-output*, *terminal-io*. ++ ++See Also:: ++.......... ++ ++*note read-char:: , *note write-byte:: , ++ ++ *note write-sequence:: ++ ++ ++File: gcl.info, Node: read-line, Next: write-string, Prev: write-char, Up: Streams Dictionary ++ ++21.2.22 read-line [Function] ++---------------------------- ++ ++'read-line' &optional input-stream eof-error-p eof-value recursive-p ++=> line, missing-newline-p ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream designator. The default is standard ++input. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. The default is nil. ++ ++ recursive-p--a generalized boolean. The default is false. ++ ++ line--a string or the eof-value. ++ ++ missing-newline-p--a generalized boolean. ++ ++Description:: ++............. ++ ++Reads from input-stream a line of text that is terminated by a newline ++or end of file. ++ ++ If recursive-p is true, this call is expected to be embedded in a ++higher-level call to read or a similar function used by the Lisp reader. ++ ++ The primary value, line, is the line that is read, represented as a ++string (without the trailing newline, if any). If eof-error-p is false ++and the end of file for input-stream is reached before any characters ++are read, eof-value is returned as the line. ++ ++ The secondary value, missing-newline-p, is a generalized boolean that ++is false if the line was terminated by a newline, or true if the line ++was terminated by the end of file for input-stream (or if the line is ++the eof-value). ++ ++Examples:: ++.......... ++ ++ (setq a "line 1 ++ line2") ++ => "line 1 ++ line2" ++ (read-line (setq input-stream (make-string-input-stream a))) ++ => "line 1", false ++ (read-line input-stream) ++ => "line2", true ++ (read-line input-stream nil nil) ++ => NIL, true ++ ++Affected By:: ++............. ++ ++*standard-input*, *terminal-io*. ++ ++Exceptional Situations:: ++........................ ++ ++If an end of file_2 occurs before any characters are read in the line, ++an error is signaled if eof-error-p is true. ++ ++See Also:: ++.......... ++ ++*note read:: ++ ++Notes:: ++....... ++ ++The corresponding output function is write-line. ++ ++ ++File: gcl.info, Node: write-string, Next: read-sequence, Prev: read-line, Up: Streams Dictionary ++ ++21.2.23 write-string, write-line [Function] ++------------------------------------------- ++ ++'write-string' string &optional output-stream &key start end => string ++ ++ 'write-line' string &optional output-stream &key start end => string ++ ++Arguments and Values:: ++...................... ++ ++string--a string. ++ ++ output-stream - an output stream designator. The default is standard ++output. ++ ++ start, end--bounding index designators of string. The defaults for ++start and end are 0 and nil, respectively. ++ ++Description:: ++............. ++ ++write-string writes the characters of the subsequence of string bounded ++by start and end to output-stream. write-line does the same thing, but ++then outputs a newline afterwards. ++ ++Examples:: ++.......... ++ ++ (prog1 (write-string "books" nil :end 4) (write-string "worms")) ++ |> bookworms ++ => "books" ++ (progn (write-char #\*) ++ (write-line "test12" *standard-output* :end 5) ++ (write-line "*test2") ++ (write-char #\*) ++ nil) ++ |> *test1 ++ |> *test2 ++ |> * ++ => NIL ++ ++Affected By:: ++............. ++ ++*standard-output*, *terminal-io*. ++ ++See Also:: ++.......... ++ ++*note read-line:: , *note write-char:: ++ ++Notes:: ++....... ++ ++write-line and write-string return string, not the substring bounded by ++start and end. ++ ++ (write-string string) ++ == (dotimes (i (length string) ++ (write-char (char string i))) ++ ++ (write-line string) ++ == (prog1 (write-string string) (terpri)) ++ ++ ++File: gcl.info, Node: read-sequence, Next: write-sequence, Prev: write-string, Up: Streams Dictionary ++ ++21.2.24 read-sequence [Function] ++-------------------------------- ++ ++'read-sequence' sequence stream &key start end => position ++ ++ sequence--a sequence. ++ ++ stream--an input stream. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++ position--an integer greater than or equal to zero, and less than or ++equal to the length of the sequence. ++ ++Description:: ++............. ++ ++Destructively modifies sequence by replacing the elements of sequence ++bounded by start and end with elements read from stream. ++ ++ Sequence is destructively modified by copying successive elements ++into it from stream. If the end of file for stream is reached before ++copying all elements of the subsequence, then the extra elements near ++the end of sequence are not updated. ++ ++ Position is the index of the first element of sequence that was not ++updated, which might be less than end because the end of file was ++reached. ++ ++Examples:: ++.......... ++ ++ (defvar *data* (make-array 15 :initial-element nil)) ++ (values (read-sequence *data* (make-string-input-stream "test string")) *data*) ++ => 11, #(#\t #\e #\s #\t #\Space #\s #\t #\r #\i #\n #\g NIL NIL NIL NIL) ++ ++Side Effects:: ++.............. ++ ++Modifies stream and sequence. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. Should signal an error of type type-error if ++start is not a non-negative integer. Should signal an error of type ++type-error if end is not a non-negative integer or nil. ++ ++ Might signal an error of type type-error if an element read from the ++stream is not a member of the element type of the sequence. ++ ++See Also:: ++.......... ++ ++*note Compiler Terminology::, *note write-sequence:: , *note read-line:: ++ ++Notes:: ++....... ++ ++read-sequence is identical in effect to iterating over the indicated ++subsequence and reading one element at a time from stream and storing it ++into sequence, but may be more efficient than the equivalent loop. An ++efficient implementation is more likely to exist for the case where the ++sequence is a vector with the same element type as the stream. ++ ++ ++File: gcl.info, Node: write-sequence, Next: file-length, Prev: read-sequence, Up: Streams Dictionary ++ ++21.2.25 write-sequence [Function] ++--------------------------------- ++ ++'write-sequence' sequence stream &key start end => sequence ++ ++ sequence--a sequence. ++ ++ stream--an output stream. ++ ++ start, end--bounding index designators of sequence. The defaults for ++start and end are 0 and nil, respectively. ++ ++Description:: ++............. ++ ++write-sequence writes the elements of the subsequence of sequence ++bounded by start and end to stream. ++ ++Examples:: ++.......... ++ ++ (write-sequence "bookworms" *standard-output* :end 4) ++ |> book ++ => "bookworms" ++ ++Side Effects:: ++.............. ++ ++Modifies stream. ++ ++Exceptional Situations:: ++........................ ++ ++Should be prepared to signal an error of type type-error if sequence is ++not a proper sequence. Should signal an error of type type-error if ++start is not a non-negative integer. Should signal an error of type ++type-error if end is not a non-negative integer or nil. ++ ++ Might signal an error of type type-error if an element of the bounded ++sequence is not a member of the stream element type of the stream. ++ ++See Also:: ++.......... ++ ++*note Compiler Terminology::, *note read-sequence:: , *note ++write-string:: , write-line ++ ++Notes:: ++....... ++ ++write-sequence is identical in effect to iterating over the indicated ++subsequence and writing one element at a time to stream, but may be more ++efficient than the equivalent loop. An efficient implementation is more ++likely to exist for the case where the sequence is a vector with the ++same element type as the stream. ++ ++ ++File: gcl.info, Node: file-length, Next: file-position, Prev: write-sequence, Up: Streams Dictionary ++ ++21.2.26 file-length [Function] ++------------------------------ ++ ++'file-length' stream => length ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream associated with a file. ++ ++ length--a non-negative integer or nil. ++ ++Description:: ++............. ++ ++file-length returns the length of stream, or nil if the length cannot be ++determined. ++ ++ For a binary file, the length is measured in units of the element ++type of the stream. ++ ++Examples:: ++.......... ++ ++ (with-open-file (s "decimal-digits.text" ++ :direction :output :if-exists :error) ++ (princ "0123456789" s) ++ (truename s)) ++ => #P"A:>Joe>decimal-digits.text.1" ++ (with-open-file (s "decimal-digits.text") ++ (file-length s)) ++ => 10 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if stream is not a stream ++associated with a file. ++ ++See Also:: ++.......... ++ ++*note open:: ++ ++ ++File: gcl.info, Node: file-position, Next: file-string-length, Prev: file-length, Up: Streams Dictionary ++ ++21.2.27 file-position [Function] ++-------------------------------- ++ ++'file-position' stream => position ++ ++ 'file-position' stream position-spec => success-p ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream. ++ ++ position-spec--a file position designator. ++ ++ position--a file position or nil. ++ ++ success-p--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns or changes the current position within a stream. ++ ++ When position-spec is not supplied, file-position returns the current ++file position in the stream, or nil if this cannot be determined. ++ ++ When position-spec is supplied, the file position in stream is set to ++that file position (if possible). file-position returns true if the ++repositioning is performed successfully, or false if it is not. ++ ++ An integer returned by file-position of one argument should be ++acceptable as position-spec for use with the same file. ++ ++ For a character file, performing a single read-char or write-char ++operation may cause the file position to be increased by more than 1 ++because of character-set translations (such as translating between the ++Common Lisp #\Newline character and an external ASCII ++carriage-return/line-feed sequence) and other aspects of the ++implementation. For a binary file, every read-byte or write-byte ++operation increases the file position by 1. ++ ++Examples:: ++.......... ++ ++ (defun tester () ++ (let ((noticed '()) file-written) ++ (flet ((notice (x) (push x noticed) x)) ++ (with-open-file (s "test.bin" ++ :element-type '(unsigned-byte 8) ++ :direction :output ++ :if-exists :error) ++ (notice (file-position s)) ;1 ++ (write-byte 5 s) ++ (write-byte 6 s) ++ (let ((p (file-position s))) ++ (notice p) ;2 ++ (notice (when p (file-position s (1- p))))) ;3 ++ (write-byte 7 s) ++ (notice (file-position s)) ;4 ++ (setq file-written (truename s))) ++ (with-open-file (s file-written ++ :element-type '(unsigned-byte 8) ++ :direction :input) ++ (notice (file-position s)) ;5 ++ (let ((length (file-length s))) ++ (notice length) ;6 ++ (when length ++ (dotimes (i length) ++ (notice (read-byte s)))))) ;7,... ++ (nreverse noticed)))) ++ => tester ++ (tester) ++ => (0 2 T 2 0 2 5 7) ++ OR=> (0 2 NIL 3 0 3 5 6 7) ++ OR=> (NIL NIL NIL NIL NIL NIL) ++ ++Side Effects:: ++.............. ++ ++When the position-spec argument is supplied, the file position in the ++stream might be moved. ++ ++Affected By:: ++............. ++ ++The value returned by file-position increases monotonically as input or ++output operations are performed. ++ ++Exceptional Situations:: ++........................ ++ ++If position-spec is supplied, but is too large or otherwise ++inappropriate, an error is signaled. ++ ++See Also:: ++.......... ++ ++*note file-length:: , *note file-string-length:: , *note open:: ++ ++Notes:: ++....... ++ ++Implementations that have character files represented as a sequence of ++records of bounded size might choose to encode the file position as, for ++example, ++<>*<>+<>. This ++is a valid encoding because it increases monotonically as each character ++is read or written, though not necessarily by 1 at each step. An ++integer might then be considered "inappropriate" as position-spec to ++file-position if, when decoded into record number and character number, ++it turned out that the supplied record was too short for the specified ++character number. ++ ++ ++File: gcl.info, Node: file-string-length, Next: open, Prev: file-position, Up: Streams Dictionary ++ ++21.2.28 file-string-length [Function] ++------------------------------------- ++ ++'file-string-length' stream object => length ++ ++Arguments and Values:: ++...................... ++ ++stream--an output character file stream. ++ ++ object--a string or a character. ++ ++ length--a non-negative integer, or nil. ++ ++Description:: ++............. ++ ++file-string-length returns the difference between what (file-position ++stream) would be after writing object and its current value, or nil if ++this cannot be determined. ++ ++ The returned value corresponds to the current state of stream at the ++time of the call and might not be the same if it is called again when ++the state of the stream has changed. ++ ++ ++File: gcl.info, Node: open, Next: stream-external-format, Prev: file-string-length, Up: Streams Dictionary ++ ++21.2.29 open [Function] ++----------------------- ++ ++'open' filespec &key direction element-type if-exists if-does-not-exist ++external-format ++=> stream ++ ++Arguments and Values:: ++...................... ++ ++filespec--a pathname designator. ++ ++ direction--one of :input, :output, :io, or :probe. The default is ++:input. ++ ++ element-type--a type specifier for recognizable subtype of character; ++or a type specifier for a finite recognizable subtype of integer; or one ++of the symbols signed-byte, unsigned-byte, or :default. The default is ++character. ++ ++ if-exists--one of :error, :new-version, :rename, :rename-and-delete, ++:overwrite, :append, :supersede, or nil. The default is :new-version if ++the version component of filespec is :newest, or :error otherwise. ++ ++ if-does-not-exist--one of :error, :create, or nil. The default is ++:error if direction is :input or if-exists is :overwrite or :append; ++:create if direction is :output or :io, and if-exists is neither ++:overwrite nor :append; or nil when direction is :probe. ++ ++ external-format--an external file format designator. The default is ++:default. ++ ++ stream--a file stream or nil. ++ ++Description:: ++............. ++ ++open creates, opens, and returns a file stream that is connected to the ++file specified by filespec. Filespec is the name of the file to be ++opened. If the filespec designator is a stream, that stream is not ++closed first or otherwise affected. ++ ++ The keyword arguments to open specify the characteristics of the file ++stream that is returned, and how to handle errors. ++ ++ If direction is :input or :probe, or if if-exists is not :new-version ++and the version component of the filespec is :newest, then the file ++opened is that file already existing in the file system that has a ++version greater than that of any other file in the file system whose ++other pathname components are the same as those of filespec. ++ ++ An implementation is required to recognize all of the open keyword ++options and to do something reasonable in the context of the host ++operating system. For example, if a file system does not support ++distinct file versions and does not distinguish the notions of deletion ++and expunging, :new-version might be treated the same as :rename or ++:supersede, and :rename-and-delete might be treated the same as ++:supersede. ++ ++:direction ++ These are the possible values for direction, and how they affect ++ the nature of the stream that is created: ++ ++ :input ++ Causes the creation of an input file stream. ++ ++ :output ++ Causes the creation of an output file stream. ++ ++ :io ++ Causes the creation of a bidirectional file stream. ++ ++ :probe ++ Causes the creation of a "no-directional" file stream; in ++ effect, the file stream is created and then closed prior to ++ being returned by open. ++ ++:element-type ++ The element-type specifies the unit of transaction for the file ++ stream. If it is :default, the unit is determined by file system, ++ possibly based on the file. ++ ++:if-exists ++ if-exists specifies the action to be taken if direction is :output ++ or :io and a file of the name filespec already exists. If ++ direction is :input, not supplied, or :probe, if-exists is ignored. ++ These are the results of open as modified by if-exists: ++ ++ :error ++ An error of type file-error is signaled. ++ ++ :new-version ++ A new file is created with a larger version number. ++ ++ :rename ++ The existing file is renamed to some other name and then a new ++ file is created. ++ ++ :rename-and-delete ++ The existing file is renamed to some other name, then it is ++ deleted but not expunged, and then a new file is created. ++ ++ :overwrite ++ Output operations on the stream destructively modify the ++ existing file. If direction is :io the file is opened in a ++ bidirectional mode that allows both reading and writing. The ++ file pointer is initially positioned at the beginning of the ++ file; however, the file is not truncated back to length zero ++ when it is opened. ++ ++ :append ++ Output operations on the stream destructively modify the ++ existing file. The file pointer is initially positioned at ++ the end of the file. ++ ++ If direction is :io, the file is opened in a bidirectional ++ mode that allows both reading and writing. ++ ++ :supersede ++ The existing file is superseded; that is, a new file with the ++ same name as the old one is created. If possible, the ++ implementation should not destroy the old file until the new ++ stream is closed. ++ ++ nil ++ No file or stream is created; instead, nil is returned to ++ indicate failure. ++ ++:if-does-not-exist ++ if-does-not-exist specifies the action to be taken if a file of ++ name filespec does not already exist. These are the results of ++ open as modified by if-does-not-exist: ++ ++ :error ++ An error of type file-error is signaled. ++ ++ :create ++ An empty file is created. Processing continues as if the file ++ had already existed but no processing as directed by if-exists ++ is performed. ++ ++ nil ++ No file or stream is created; instead, nil is returned to ++ indicate failure. ++ ++:external-format ++ This option selects an external file format for the file: The only ++ standardized value for this option is :default, although ++ implementations are permitted to define additional external file ++ formats and implementation-dependent values returned by ++ stream-external-format can also be used by conforming programs. ++ ++ The external-format is meaningful for any kind of file stream whose ++ element type is a subtype of character. This option is ignored for ++ streams for which it is not meaningful; however, implementations ++ may define other element types for which it is meaningful. The ++ consequences are unspecified if a character is written that cannot ++ be represented by the given external file format. ++ ++ When a file is opened, a file stream is constructed to serve as the ++file system's ambassador to the Lisp environment; operations on the file ++stream are reflected by operations on the file in the file system. ++ ++ A file can be deleted, renamed, or destructively modified by open. ++ ++ For information about opening relative pathnames, see *note Merging ++Pathnames::. ++ ++Examples:: ++.......... ++ ++ (open filespec :direction :probe) => # ++ (setq q (merge-pathnames (user-homedir-pathname) "test")) ++ => # ++ (open filespec :if-does-not-exist :create) => # ++ (setq s (open filespec :direction :probe)) => # ++ (truename s) => # ++ (open s :direction :output :if-exists nil) => NIL ++ ++Affected By:: ++............. ++ ++The nature and state of the host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++If if-exists is :error, (subject to the constraints on the meaning of ++if-exists listed above), an error of type file-error is signaled. ++ ++ If if-does-not-exist is :error (subject to the constraints on the ++meaning of if-does-not-exist listed above), an error of type file-error ++is signaled. ++ ++ If it is impossible for an implementation to handle some option in a ++manner close to what is specified here, an error of type error might be ++signaled. ++ ++ An error of type file-error is signaled if (wild-pathname-p filespec) ++returns true. ++ ++ An error of type error is signaled if the external-format is not ++understood by the implementation. ++ ++ The various file systems in existence today have widely differing ++capabilities, and some aspects of the file system are beyond the scope ++of this specification to define. A given implementation might not be ++able to support all of these options in exactly the manner stated. An ++implementation is required to recognize all of these option keywords and ++to try to do something "reasonable" in the context of the host file ++system. Where necessary to accomodate the file system, an ++implementation deviate slightly from the semantics specified here ++without being disqualified for consideration as a conforming ++implementation. If it is utterly impossible for an implementation to ++handle some option in a manner similar to what is specified here, it may ++simply signal an error. ++ ++ With regard to the :element-type option, if a type is requested that ++is not supported by the file system, a substitution of types such as ++that which goes on in upgrading is permissible. As a minimum ++requirement, it should be the case that opening an output stream to a ++file in a given element type and later opening an input stream to the ++same file in the same element type should work compatibly. ++ ++See Also:: ++.......... ++ ++*note with-open-file:: , *note close:: , pathname, logical-pathname, ++ ++ *note Merging Pathnames::, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++open does not automatically close the file when an abnormal exit occurs. ++ ++ When element-type is a subtype of character, read-char and/or ++write-char can be used on the resulting file stream. ++ ++ When element-type is a subtype of integer, read-byte and/or ++write-byte can be used on the resulting file stream. ++ ++ When element-type is :default, the type can be determined by using ++stream-element-type. ++ ++ ++File: gcl.info, Node: stream-external-format, Next: with-open-file, Prev: open, Up: Streams Dictionary ++ ++21.2.30 stream-external-format [Function] ++----------------------------------------- ++ ++'stream-external-format' stream => format ++ ++Arguments and Values:: ++...................... ++ ++stream--a file stream. ++ ++ format--an external file format. ++ ++Description:: ++............. ++ ++Returns an external file format designator for the stream. ++ ++Examples:: ++.......... ++ ++ (with-open-file (stream "test" :direction :output) ++ (stream-external-format stream)) ++ => :DEFAULT ++ OR=> :ISO8859/1-1987 ++ OR=> (:ASCII :SAIL) ++ OR=> ACME::PROPRIETARY-FILE-FORMAT-17 ++ OR=> # ++ ++See Also:: ++.......... ++ ++the :external-format argument to the function *note open:: and the *note ++with-open-file:: macro. ++ ++Notes:: ++....... ++ ++The format returned is not necessarily meaningful to other ++implementations. ++ ++ ++File: gcl.info, Node: with-open-file, Next: close, Prev: stream-external-format, Up: Streams Dictionary ++ ++21.2.31 with-open-file [macro] ++------------------------------ ++ ++Syntax:: ++........ ++ ++'with-open-file' (stream filespec {options}*) {declaration}* {form}* ++=> results ++ ++Arguments and Values:: ++...................... ++ ++stream - a variable. ++ ++ filespec--a pathname designator. ++ ++ options - forms; evaluated. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++with-open-file uses open to create a file stream ++ ++ to file named by filespec. Filespec is the name of the file to be ++opened. Options are used as keyword arguments to open. ++ ++ The stream object to which the stream variable is bound has dynamic ++extent; its extent ends when the form is exited. ++ ++ with-open-file evaluates the forms as an implicit progn with stream ++bound to ++ ++ the value returned by open. ++ ++ When control leaves the body, either normally or abnormally (such as ++by use of throw), the file is automatically closed. If a new output ++file is being written, and control leaves abnormally, the file is ++aborted and the file system is left, so far as possible, as if the file ++had never been opened. ++ ++ It is possible by the use of :if-exists nil or :if-does-not-exist nil ++for stream to be bound to nil. ++ ++ Users of :if-does-not-exist nil should check for a valid stream. ++ ++ The consequences are undefined if an attempt is made to assign the ++stream variable. The compiler may choose to issue a warning if such an ++attempt is detected. ++ ++Examples:: ++.......... ++ ++ (setq p (merge-pathnames "test")) ++ => # ++ (with-open-file (s p :direction :output :if-exists :supersede) ++ (format s "Here are a couple~ ++ (with-open-file (s p) ++ (do ((l (read-line s) (read-line s nil 'eof))) ++ ((eq l 'eof) "Reached end of file.") ++ (format t "~&*** ~A~ ++ |> *** Here are a couple ++ |> *** of test data lines ++ => "Reached end of file." ++ ++ ;; Normally one would not do this intentionally because it is ++ ;; not perspicuous, but beware when using :IF-DOES-NOT-EXIST NIL ++ ;; that this doesn't happen to you accidentally... ++ (with-open-file (foo "no-such-file" :if-does-not-exist nil) ++ (read foo)) ++ |> |>>hello?<<| ++ => HELLO? ;This value was read from the terminal, not a file! ++ ++ ;; Here's another bug to avoid... ++ (with-open-file (foo "no-such-file" :direction :output :if-does-not-exist nil) ++ (format foo "Hello")) ++ => "Hello" ;FORMAT got an argument of NIL! ++ ++Side Effects:: ++.............. ++ ++Creates a stream to the file named by filename (upon entry), and closes ++the stream (upon exit). In some implementations, the file might be ++locked in some way while it is open. If the stream is an output stream, ++a file might be created. ++ ++Affected By:: ++............. ++ ++The host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++See the function open. ++ ++See Also:: ++.......... ++ ++*note open:: , *note close:: , pathname, logical-pathname, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: close, Next: with-open-stream, Prev: with-open-file, Up: Streams Dictionary ++ ++21.2.32 close [Function] ++------------------------ ++ ++'close' stream &key abort => result ++ ++Arguments and Values:: ++...................... ++ ++stream--a stream (either open or closed). ++ ++ abort--a generalized boolean. The default is false. ++ ++ result--t if the stream was open at the time it was received as an ++argument, or implementation-dependent otherwise. ++ ++Description:: ++............. ++ ++close closes stream. Closing a stream means that it may no longer be ++used in input or output operations. The act of closing a file stream ++ends the association between the stream and its associated file; the ++transaction with the file system is terminated, and input/output may no ++longer be performed on the stream. ++ ++ If abort is true, an attempt is made to clean up any side effects of ++having created stream. If stream performs output to a file that was ++created when the stream was created, the file is deleted and any ++previously existing file is not superseded. ++ ++ It is permissible to close an already closed stream, but in that case ++the result is implementation-dependent. ++ ++ After stream is closed, it is still possible to perform the following ++query operations upon it: ++ ++ streamp, pathname, truename, merge-pathnames, pathname-host, ++pathname-device, pathname-directory,pathname-name, pathname-type, ++pathname-version, namestring, file-namestring, directory-namestring, ++host-namestring, enough-namestring, open, probe-file, and directory. ++ ++ The effect of close on a constructed stream is to close the argument ++stream only. There is no effect on the constituents of composite ++streams. ++ ++ For a stream created with make-string-output-stream, the result of ++get-output-stream-string is unspecified after close. ++ ++Examples:: ++.......... ++ ++ (setq s (make-broadcast-stream)) => # ++ (close s) => T ++ (output-stream-p s) => true ++ ++Side Effects:: ++.............. ++ ++The stream is closed (if necessary). If abort is true and the stream is ++an output file stream, its associated file might be deleted. ++ ++See Also:: ++.......... ++ ++*note open:: ++ ++ ++File: gcl.info, Node: with-open-stream, Next: listen, Prev: close, Up: Streams Dictionary ++ ++21.2.33 with-open-stream [Macro] ++-------------------------------- ++ ++'with-open-stream' (var stream) {declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a variable name. ++ ++ stream--a form; evaluated to produce a stream. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++with-open-stream performs a series of operations on stream, returns a ++value, and then closes the stream. ++ ++ Var is bound to the value of stream, and then forms are executed as ++an implicit progn. stream is automatically closed on exit from ++with-open-stream, no matter whether the exit is normal or abnormal. ++ ++ The stream has dynamic extent; its extent ends when the form is ++exited. ++ ++ The consequences are undefined if an attempt is made to assign the ++the variable var with the forms. ++ ++Examples:: ++.......... ++ ++ (with-open-stream (s (make-string-input-stream "1 2 3 4")) ++ (+ (read s) (read s) (read s))) => 6 ++ ++Side Effects:: ++.............. ++ ++The stream is closed (upon exit). ++ ++See Also:: ++.......... ++ ++*note close:: ++ ++ ++File: gcl.info, Node: listen, Next: clear-input, Prev: with-open-stream, Up: Streams Dictionary ++ ++21.2.34 listen [Function] ++------------------------- ++ ++'listen' &optional input-stream => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream designator. The default is standard ++input. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if there is a character immediately available from ++input-stream; otherwise, returns false. On a non-interactive ++input-stream, listen returns true except when at end of file_1. If an ++end of file is encountered, listen returns false. listen is intended to ++be used when input-stream obtains characters from an interactive device ++such as a keyboard. ++ ++Examples:: ++.......... ++ ++ (progn (unread-char (read-char)) (list (listen) (read-char))) ++ |> |>>1<<| ++ => (T #\1) ++ (progn (clear-input) (listen)) ++ => NIL ;Unless you're a very fast typist! ++ ++Affected By:: ++............. ++ ++*standard-input* ++ ++See Also:: ++.......... ++ ++*note interactive-stream-p:: , *note read-char-no-hang:: ++ ++ ++File: gcl.info, Node: clear-input, Next: finish-output, Prev: listen, Up: Streams Dictionary ++ ++21.2.35 clear-input [Function] ++------------------------------ ++ ++'clear-input' &optional input-stream => nil ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream designator. The default is standard ++input. ++ ++Description:: ++............. ++ ++Clears any available input from input-stream. ++ ++ If clear-input does not make sense for input-stream, then clear-input ++does nothing. ++ ++Examples:: ++.......... ++ ++ ;; The exact I/O behavior of this example might vary from implementation ++ ;; to implementation depending on the kind of interactive buffering that ++ ;; occurs. (The call to SLEEP here is intended to help even out the ++ ;; differences in implementations which do not do line-at-a-time buffering.) ++ ++ (defun read-sleepily (&optional (clear-p nil) (zzz 0)) ++ (list (progn (print '>) (read)) ++ ;; Note that input typed within the first ZZZ seconds ++ ;; will be discarded. ++ (progn (print '>) ++ (if zzz (sleep zzz)) ++ (print '>>) ++ (if clear-p (clear-input)) ++ (read)))) ++ ++ (read-sleepily) ++ |> > |>>10<<| ++ |> > ++ |> >> |>>20<<| ++ => (10 20) ++ ++ (read-sleepily t) ++ |> > |>>10<<| ++ |> > ++ |> >> |>>20<<| ++ => (10 20) ++ ++ (read-sleepily t 10) ++ |> > |>>10<<| ++ |> > |>>20<<| ; Some implementations won't echo typeahead here. ++ |> >> |>>30<<| ++ => (10 30) ++ ++Side Effects:: ++.............. ++ ++The input-stream is modified. ++ ++Affected By:: ++............. ++ ++*standard-input* ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if input-stream is not a ++stream designator. ++ ++See Also:: ++.......... ++ ++clear-output ++ ++ ++File: gcl.info, Node: finish-output, Next: y-or-n-p, Prev: clear-input, Up: Streams Dictionary ++ ++21.2.36 finish-output, force-output, clear-output [Function] ++------------------------------------------------------------ ++ ++'finish-output' &optional output-stream => nil ++ ++ 'force-output' &optional output-stream => nil ++ ++ 'clear-output' &optional output-stream => nil ++ ++Arguments and Values:: ++...................... ++ ++output-stream--an output stream designator. The default is standard ++output. ++ ++Description:: ++............. ++ ++finish-output, force-output, and clear-output exercise control over the ++internal handling of buffered stream output. ++ ++ finish-output attempts to ensure that any buffered output sent to ++output-stream has reached its destination, and then returns. ++ ++ force-output initiates the emptying of any internal buffers but does ++not wait for completion or acknowledgment to return. ++ ++ clear-output attempts to abort any outstanding output operation in ++progress in order to allow as little output as possible to continue to ++the destination. ++ ++ If any of these operations does not make sense for output-stream, ++then it does nothing. The precise actions of these functions are ++implementation-dependent. ++ ++Examples:: ++.......... ++ ++ ;; Implementation A ++ (progn (princ "am i seen?") (clear-output)) ++ => NIL ++ ++ ;; Implementation B ++ (progn (princ "am i seen?") (clear-output)) ++ |> am i seen? ++ => NIL ++ ++Affected By:: ++............. ++ ++*standard-output* ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if output-stream is not a ++stream designator. ++ ++See Also:: ++.......... ++ ++*note clear-input:: ++ ++ ++File: gcl.info, Node: y-or-n-p, Next: make-synonym-stream, Prev: finish-output, Up: Streams Dictionary ++ ++21.2.37 y-or-n-p, yes-or-no-p [Function] ++---------------------------------------- ++ ++'y-or-n-p' &optional control &rest arguments => generalized-boolean ++ ++ 'yes-or-no-p' &optional control &rest arguments => ++generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++control--a format control. ++ ++ arguments--format arguments for control. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++These functions ask a question and parse a response from the user. They ++return true if the answer is affirmative, or false if the answer is ++negative. ++ ++ y-or-n-p is for asking the user a question whose answer is either ++"yes" or "no." It is intended that the reply require the user to answer ++a yes-or-no question with a single character. yes-or-no-p is also for ++asking the user a question whose answer is either "Yes" or "No." It is ++intended that the reply require the user to take more action than just a ++single keystroke, such as typing the full word yes or no followed by a ++newline. ++ ++ y-or-n-p types out a message (if supplied), reads an answer in some ++implementation-dependent manner (intended to be short and simple, such ++as reading a single character such as Y or N). yes-or-no-p types out a ++message (if supplied), attracts the user's attention (for example, by ++ringing the terminal's bell), and reads an answer in some ++implementation-dependent manner (intended to be multiple characters, ++such as YES or NO). ++ ++ If format-control is supplied and not nil, then a fresh-line ++operation is performed; then a message is printed as if format-control ++and arguments were given to format. In any case, yes-or-no-p and ++y-or-n-p will provide a prompt such as "(Y or N)" or "(Yes or No)" if ++appropriate. ++ ++ All input and output are performed using query I/O. ++ ++Examples:: ++.......... ++ ++ (y-or-n-p "(t or nil) given by") ++ |> (t or nil) given by (Y or N) |>>Y<<| ++ => true ++ (yes-or-no-p "a ~S message" 'frightening) ++ |> a FRIGHTENING message (Yes or No) |>>no<<| ++ => false ++ (y-or-n-p "Produce listing file?") ++ |> Produce listing file? ++ |> Please respond with Y or N. |>>n<<| ++ => false ++ ++Side Effects:: ++.............. ++ ++Output to and input from query I/O will occur. ++ ++Affected By:: ++............. ++ ++*query-io*. ++ ++See Also:: ++.......... ++ ++*note format:: ++ ++Notes:: ++....... ++ ++yes-or-no-p and yes-or-no-p do not add question marks to the end of the ++prompt string, so any desired question mark or other punctuation should ++be explicitly included in the text query. ++ ++ ++File: gcl.info, Node: make-synonym-stream, Next: synonym-stream-symbol, Prev: y-or-n-p, Up: Streams Dictionary ++ ++21.2.38 make-synonym-stream [Function] ++-------------------------------------- ++ ++'make-synonym-stream' symbol => synonym-stream ++ ++Arguments and Values:: ++...................... ++ ++symbol--a symbol that names a dynamic variable. ++ ++ synonym-stream--a synonym stream. ++ ++Description:: ++............. ++ ++Returns a synonym stream whose synonym stream symbol is symbol. ++ ++Examples:: ++.......... ++ ++ (setq a-stream (make-string-input-stream "a-stream") ++ b-stream (make-string-input-stream "b-stream")) ++ => # ++ (setq s-stream (make-synonym-stream 'c-stream)) ++ => # ++ (setq c-stream a-stream) ++ => # ++ (read s-stream) => A-STREAM ++ (setq c-stream b-stream) ++ => # ++ (read s-stream) => B-STREAM ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if its argument is not a symbol. ++ ++See Also:: ++.......... ++ ++*note Stream Concepts:: ++ ++ ++File: gcl.info, Node: synonym-stream-symbol, Next: broadcast-stream-streams, Prev: make-synonym-stream, Up: Streams Dictionary ++ ++21.2.39 synonym-stream-symbol [Function] ++---------------------------------------- ++ ++'synonym-stream-symbol' synonym-stream => symbol ++ ++Arguments and Values:: ++...................... ++ ++synonym-stream--a synonym stream. ++ ++ symbol--a symbol. ++ ++Description:: ++............. ++ ++Returns the symbol whose symbol-value the synonym-stream is using. ++ ++See Also:: ++.......... ++ ++*note make-synonym-stream:: ++ ++ ++File: gcl.info, Node: broadcast-stream-streams, Next: make-broadcast-stream, Prev: synonym-stream-symbol, Up: Streams Dictionary ++ ++21.2.40 broadcast-stream-streams [Function] ++------------------------------------------- ++ ++'broadcast-stream-streams' broadcast-stream => streams ++ ++Arguments and Values:: ++...................... ++ ++broadcast-stream--a broadcast stream. ++ ++ streams--a list of streams. ++ ++Description:: ++............. ++ ++Returns a list of output streams that constitute all the streams to ++which the broadcast-stream is broadcasting. ++ ++ ++File: gcl.info, Node: make-broadcast-stream, Next: make-two-way-stream, Prev: broadcast-stream-streams, Up: Streams Dictionary ++ ++21.2.41 make-broadcast-stream [Function] ++---------------------------------------- ++ ++'make-broadcast-stream' &rest streams => broadcast-stream ++ ++Arguments and Values:: ++...................... ++ ++stream--an output stream. ++ ++ broadcast-stream--a broadcast stream. ++ ++Description:: ++............. ++ ++Returns a broadcast stream. ++ ++Examples:: ++.......... ++ ++ (setq a-stream (make-string-output-stream) ++ b-stream (make-string-output-stream)) => # ++ (format (make-broadcast-stream a-stream b-stream) ++ "this will go to both streams") => NIL ++ (get-output-stream-string a-stream) => "this will go to both streams" ++ (get-output-stream-string b-stream) => "this will go to both streams" ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if any stream is not an output ++stream. ++ ++See Also:: ++.......... ++ ++*note broadcast-stream-streams:: ++ ++ ++File: gcl.info, Node: make-two-way-stream, Next: two-way-stream-input-stream, Prev: make-broadcast-stream, Up: Streams Dictionary ++ ++21.2.42 make-two-way-stream [Function] ++-------------------------------------- ++ ++'make-two-way-stream' input-stream output-stream => two-way-stream ++ ++Arguments and Values:: ++...................... ++ ++input-stream--a stream. ++ ++ output-stream--a stream. ++ ++ two-way-stream--a two-way stream. ++ ++Description:: ++............. ++ ++Returns a two-way stream that gets its input from input-stream and sends ++its output to output-stream. ++ ++Examples:: ++.......... ++ ++ (with-output-to-string (out) ++ (with-input-from-string (in "input...") ++ (let ((two (make-two-way-stream in out))) ++ (format two "output...") ++ (setq what-is-read (read two))))) => "output..." ++ what-is-read => INPUT... ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if input-stream is not an ++input stream. Should signal an error of type type-error if ++output-stream is not an output stream. ++ ++ ++File: gcl.info, Node: two-way-stream-input-stream, Next: echo-stream-input-stream, Prev: make-two-way-stream, Up: Streams Dictionary ++ ++21.2.43 two-way-stream-input-stream, two-way-stream-output-stream ++----------------------------------------------------------------- ++ ++ [Function] ++ ++ 'two-way-stream-input-stream' two-way-stream => input-stream ++ ++ 'two-way-stream-output-stream' two-way-stream => output-stream ++ ++Arguments and Values:: ++...................... ++ ++two-way-stream--a two-way stream. ++ ++ input-stream--an input stream. ++ ++ output-stream--an output stream. ++ ++Description:: ++............. ++ ++two-way-stream-input-stream returns the stream from which two-way-stream ++receives input. ++ ++ two-way-stream-output-stream returns the stream to which ++two-way-stream sends output. ++ ++ ++File: gcl.info, Node: echo-stream-input-stream, Next: make-echo-stream, Prev: two-way-stream-input-stream, Up: Streams Dictionary ++ ++21.2.44 echo-stream-input-stream, echo-stream-output-stream [Function] ++---------------------------------------------------------------------- ++ ++'echo-stream-input-stream' echo-stream => input-stream ++ ++ 'echo-stream-output-stream' echo-stream => output-stream ++ ++Arguments and Values:: ++...................... ++ ++echo-stream--an echo stream. ++ ++ input-stream--an input stream. ++ ++ output-stream--an output stream. ++ ++Description:: ++............. ++ ++echo-stream-input-stream returns the input stream from which echo-stream ++receives input. ++ ++ echo-stream-output-stream returns the output stream to which ++echo-stream sends output. ++ ++ ++File: gcl.info, Node: make-echo-stream, Next: concatenated-stream-streams, Prev: echo-stream-input-stream, Up: Streams Dictionary ++ ++21.2.45 make-echo-stream [Function] ++----------------------------------- ++ ++'make-echo-stream' input-stream output-stream => echo-stream ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream. ++ ++ output-stream--an output stream. ++ ++ echo-stream--an echo stream. ++ ++Description:: ++............. ++ ++Creates and returns an echo stream that takes input from input-stream ++and sends output to output-stream. ++ ++Examples:: ++.......... ++ ++ (let ((out (make-string-output-stream))) ++ (with-open-stream ++ (s (make-echo-stream ++ (make-string-input-stream "this-is-read-and-echoed") ++ out)) ++ (read s) ++ (format s " * this-is-direct-output") ++ (get-output-stream-string out))) ++ => "this-is-read-and-echoed * this-is-direct-output" ++ ++See Also:: ++.......... ++ ++*note echo-stream-input-stream:: , echo-stream-output-stream, *note ++make-two-way-stream:: ++ ++ ++File: gcl.info, Node: concatenated-stream-streams, Next: make-concatenated-stream, Prev: make-echo-stream, Up: Streams Dictionary ++ ++21.2.46 concatenated-stream-streams [Function] ++---------------------------------------------- ++ ++'concatenated-stream-streams' concatenated-stream => streams ++ ++Arguments and Values:: ++...................... ++ ++concatenated-stream - a concatenated stream. ++ ++ streams--a list of input streams. ++ ++Description:: ++............. ++ ++Returns a list of input streams that constitute the ordered set of ++streams the concatenated-stream still has to read from, starting with ++the current one it is reading from. The list may be empty if no more ++streams remain to be read. ++ ++ The consequences are undefined if the list structure of the streams ++is ever modified. ++ ++ ++File: gcl.info, Node: make-concatenated-stream, Next: get-output-stream-string, Prev: concatenated-stream-streams, Up: Streams Dictionary ++ ++21.2.47 make-concatenated-stream [Function] ++------------------------------------------- ++ ++'make-concatenated-stream' &rest input-streams => concatenated-stream ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream. ++ ++ concatenated-stream--a concatenated stream. ++ ++Description:: ++............. ++ ++Returns a concatenated stream that has the indicated input-streams ++initially associated with it. ++ ++Examples:: ++.......... ++ ++ (read (make-concatenated-stream ++ (make-string-input-stream "1") ++ (make-string-input-stream "2"))) => 12 ++ ++Exceptional Situations:: ++........................ ++ ++Should signal type-error if any argument is not an input stream. ++ ++See Also:: ++.......... ++ ++*note concatenated-stream-streams:: ++ ++ ++File: gcl.info, Node: get-output-stream-string, Next: make-string-input-stream, Prev: make-concatenated-stream, Up: Streams Dictionary ++ ++21.2.48 get-output-stream-string [Function] ++------------------------------------------- ++ ++'get-output-stream-string' string-output-stream => string ++ ++Arguments and Values:: ++...................... ++ ++string-output-stream--a stream. ++ ++ string--a string. ++ ++Description:: ++............. ++ ++Returns a string containing, in order, all the characters that have been ++output to string-output-stream. This operation clears any characters on ++string-output-stream, so the string contains only those characters which ++have been output since the last call to get-output-stream-string or ++since the creation of the string-output-stream, whichever occurred most ++recently. ++ ++Examples:: ++.......... ++ ++ (setq a-stream (make-string-output-stream) ++ a-string "abcdefghijklm") => "abcdefghijklm" ++ (write-string a-string a-stream) => "abcdefghijklm" ++ (get-output-stream-string a-stream) => "abcdefghijklm" ++ (get-output-stream-string a-stream) => "" ++ ++Side Effects:: ++.............. ++ ++The string-output-stream is cleared. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if stream-output-string is closed. ++ ++ The consequences are undefined if string-output-stream is a stream ++that was not produced by make-string-output-stream. ++ ++ The consequences are undefined if string-output-stream was created ++implicitly by with-output-to-string or format. ++ ++See Also:: ++.......... ++ ++*note make-string-output-stream:: ++ ++ ++File: gcl.info, Node: make-string-input-stream, Next: make-string-output-stream, Prev: get-output-stream-string, Up: Streams Dictionary ++ ++21.2.49 make-string-input-stream [Function] ++------------------------------------------- ++ ++'make-string-input-stream' string &optional start end => string-stream ++ ++Arguments and Values:: ++...................... ++ ++string--a string. ++ ++ start, end--bounding index designators of string. The defaults for ++start and end are 0 and nil, respectively. ++ ++ string-stream--an input string stream. ++ ++Description:: ++............. ++ ++Returns an input string stream. This stream will supply, in order, the ++characters in the substring of string bounded by start and end. After ++the last character has been supplied, the string stream will then be at ++end of file. ++ ++Examples:: ++.......... ++ ++ (let ((string-stream (make-string-input-stream "1 one "))) ++ (list (read string-stream nil nil) ++ (read string-stream nil nil) ++ (read string-stream nil nil))) ++ => (1 ONE NIL) ++ ++ (read (make-string-input-stream "prefixtargetsuffix" 6 12)) => TARGET ++ ++See Also:: ++.......... ++ ++*note with-input-from-string:: ++ ++ ++File: gcl.info, Node: make-string-output-stream, Next: with-input-from-string, Prev: make-string-input-stream, Up: Streams Dictionary ++ ++21.2.50 make-string-output-stream [Function] ++-------------------------------------------- ++ ++'make-string-output-stream' &key element-type => string-stream ++ ++Arguments and Values:: ++...................... ++ ++element-type--a type specifier. The default is character. ++ ++ string-stream--an output string stream. ++ ++Description:: ++............. ++ ++Returns ++ ++ an output string stream that accepts characters and makes available ++(via get-output-stream-string) a string that contains the characters ++that were actually output. ++ ++ The element-type names the type of the elements of the string; a ++string is constructed of the most specialized type that can accommodate ++elements of that element-type. ++ ++Examples:: ++.......... ++ ++ (let ((s (make-string-output-stream))) ++ (write-string "testing... " s) ++ (prin1 1234 s) ++ (get-output-stream-string s)) ++ => "testing... 1234" ++ ++ None.. ++ ++See Also:: ++.......... ++ ++*note get-output-stream-string:: , *note with-output-to-string:: ++ ++ ++File: gcl.info, Node: with-input-from-string, Next: with-output-to-string, Prev: make-string-output-stream, Up: Streams Dictionary ++ ++21.2.51 with-input-from-string [Macro] ++-------------------------------------- ++ ++'with-input-from-string' (var string &key index start end) ++{declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a variable name. ++ ++ string--a form; evaluated to produce a string. ++ ++ index--a place. ++ ++ start, end--bounding index designators of string. The defaults for ++start and end are 0 and nil, respectively. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ result--the values returned by the forms. ++ ++Description:: ++............. ++ ++Creates an ++ ++ input string stream, ++ ++ provides an opportunity to perform operations on the stream ++(returning zero or more values), and then closes the string stream. ++ ++ String is evaluated first, and var is bound to a character input ++string stream that supplies characters from the subsequence of the ++resulting string bounded by start and end. The body is executed as an ++implicit progn. ++ ++ The input string stream is automatically closed on exit from ++with-input-from-string, no matter whether the exit is normal or ++abnormal. ++ ++ The input string stream to which the variable var is bound has ++dynamic extent; its extent ends when the form is exited. ++ ++ The index is a pointer within the string to be advanced. If ++with-input-from-string is exited normally, then index will have as its ++value the index into the string indicating the first character not read ++which is (length string) if all characters were used. The place ++specified by index is not updated as reading progresses, but only at the ++end of the operation. ++ ++ start and index may both specify the same variable, which is a ++pointer within the string to be advanced, perhaps repeatedly by some ++containing loop. ++ ++ The consequences are undefined if an attempt is made to assign the ++variable var. ++ ++Examples:: ++.......... ++ ++ (with-input-from-string (s "XXX1 2 3 4xxx" ++ :index ind ++ :start 3 :end 10) ++ (+ (read s) (read s) (read s))) => 6 ++ ind => 9 ++ (with-input-from-string (s "Animal Crackers" :index j :start 6) ++ (read s)) => CRACKERS ++ ++ The variable j is set to 15. ++ ++Side Effects:: ++.............. ++ ++The value of the place named by index, if any, is modified. ++ ++See Also:: ++.......... ++ ++*note make-string-input-stream:: , ++ ++ *note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: with-output-to-string, Next: *debug-io*, Prev: with-input-from-string, Up: Streams Dictionary ++ ++21.2.52 with-output-to-string [Macro] ++------------------------------------- ++ ++'with-output-to-string' (var &optional string-form &key element-type) ++{declaration}* {form}* ++=> {result}* ++ ++Arguments and Values:: ++...................... ++ ++var--a variable name. ++ ++ string-form--a form or nil; if non-nil, evaluated to produce string. ++ ++ string--a string that has a fill pointer. ++ ++ element-type--a type specifier; evaluated. ++ ++ The default is character. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++ results--If a string-form is not supplied or nil, a string; ++otherwise, the values returned by the forms. ++ ++Description:: ++............. ++ ++with-output-to-string creates a ++ ++ character output stream, performs a series of operations that may ++send results to this stream, and then closes the stream. ++ ++ The element-type names the type of the elements of the stream; a ++stream is constructed of the most specialized type that can accommodate ++elements of the given type. ++ ++ The body is executed as an implicit progn with var bound to an output ++string stream. All output to that string stream is saved in a string. ++ ++ If string is supplied, element-type is ignored, and the output is ++incrementally appended to string as if by use of vector-push-extend. ++ ++ The output stream is automatically closed on exit from ++with-output-from-string, no matter whether the exit is normal or ++abnormal. ++ ++ The output string stream to which the variable var is bound has ++dynamic extent; its extent ends when the form is exited. ++ ++ If no string is provided, then with-output-from-string ++ ++ produces a stream that accepts characters and returns a string of the ++indicated element-type. ++ ++ If string is provided, with-output-to-string returns the results of ++evaluating the last form. ++ ++ The consequences are undefined if an attempt is made to assign the ++variable var. ++ ++Examples:: ++.......... ++ ++ (setq fstr (make-array '(0) :element-type 'base-char ++ :fill-pointer 0 :adjustable t)) => "" ++ (with-output-to-string (s fstr) ++ (format s "here's some output") ++ (input-stream-p s)) => false ++ fstr => "here's some output" ++ ++Side Effects:: ++.............. ++ ++The string is modified. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if destructive modifications are ++performed directly on the string during the dynamic extent of the call. ++ ++See Also:: ++.......... ++ ++*note make-string-output-stream:: , vector-push-extend, ++ ++ *note Traversal Rules and Side Effects:: ++ ++ ++File: gcl.info, Node: *debug-io*, Next: *terminal-io*, Prev: with-output-to-string, Up: Streams Dictionary ++ ++21.2.53 *debug-io*, *error-output*, *query-io*, ++----------------------------------------------- ++ ++*standard-input*, *standard-output*, ++------------------------------------ ++ ++*trace-output* ++-------------- ++ ++ [Variable] ++ ++Value Type:: ++............ ++ ++For *standard-input*: an input stream ++ ++ For *error-output*, *standard-output*, and *trace-output*: an output ++stream. ++ ++ For *debug-io*, *query-io*: a bidirectional stream. ++ ++Initial Value:: ++............... ++ ++implementation-dependent, but it must be an open stream that is not a ++generalized synonym stream to an I/O customization variables but that ++might be a generalized synonym stream to the value of some I/O ++customization variable. The initial value might also be a generalized ++synonym stream to either the symbol *terminal-io* or to the stream that ++is its value. ++ ++Description:: ++............. ++ ++These variables are collectively called the standardized I/O ++customization variables. They can be bound or assigned in order to ++change the default destinations for input and/or output used by various ++standardized operators and facilities. ++ ++ The value of *debug-io*, called debug I/O, is a stream to be used for ++interactive debugging purposes. ++ ++ The value of *error-output*, called error output, is a stream to ++which warnings and non-interactive error messages should be sent. ++ ++ The value of *query-io*, called query I/O, is a bidirectional stream ++to be used when asking questions of the user. The question should be ++output to this stream, and the answer read from it. ++ ++ The value of *standard-input*, called standard input, is a stream ++that is used by many operators as a default source of input when no ++specific input stream is explicitly supplied. ++ ++ The value of *standard-output*, called standard output, is a stream ++that is used by many operators as a default destination for output when ++no specific output stream is explicitly supplied. ++ ++ The value of *trace-output*, called trace output, is the stream on ++which traced functions (see trace) and the time macro print their ++output. ++ ++Examples:: ++.......... ++ ++ (with-output-to-string (*error-output*) ++ (warn "this string is sent to *error-output*")) ++ => "Warning: this string is sent to *error-output* ++ " ;The exact format of this string is implementation-dependent. ++ ++ (with-input-from-string (*standard-input* "1001") ++ (+ 990 (read))) => 1991 ++ ++ (progn (setq out (with-output-to-string (*standard-output*) ++ (print "print and format t send things to") ++ (format t "*standard-output* now going to a string"))) ++ :done) ++ => :DONE ++ out ++ => " ++ \"print and format t send things to\" *standard-output* now going to a string" ++ ++ (defun fact (n) (if (< n 2) 1 (* n (fact (- n 1))))) ++ => FACT ++ (trace fact) ++ => (FACT) ++ ;; Of course, the format of traced output is implementation-dependent. ++ (with-output-to-string (*trace-output*) ++ (fact 3)) ++ => " ++ 1 Enter FACT 3 ++ | 2 Enter FACT 2 ++ | 3 Enter FACT 1 ++ | 3 Exit FACT 1 ++ | 2 Exit FACT 2 ++ 1 Exit FACT 6" ++ ++See Also:: ++.......... ++ ++*terminal-io*, synonym-stream, *note Time:: , *note trace:: , *note ++Conditions::, *note Reader::, *note Printer:: ++ ++Notes:: ++....... ++ ++The intent of the constraints on the initial value of the I/O ++customization variables is to ensure that it is always safe to bind or ++assign such a variable to the value of another I/O customization ++variable, without unduly restricting implementation flexibility. ++ ++ It is common for an implementation to make the initial values of ++*debug-io* and *query-io* be the same stream, and to make the initial ++values of *error-output* and *standard-output* be the same stream. ++ ++ The functions y-or-n-p and yes-or-no-p use query I/O for their input ++and output. ++ ++ In the normal Lisp read-eval-print loop, input is read from standard ++input. Many input functions, including read and read-char, take a ++stream argument that defaults to standard input. ++ ++ In the normal Lisp read-eval-print loop, output is sent to standard ++output. Many output functions, including print and write-char, take a ++stream argument that defaults to standard output. ++ ++ A program that wants, for example, to divert output to a file should ++do so by binding *standard-output*; that way error messages sent to ++*error-output* can still get to the user by going through *terminal-io* ++(if *error-output* is bound to *terminal-io*), which is usually what is ++desired. ++ ++ ++File: gcl.info, Node: *terminal-io*, Next: stream-error, Prev: *debug-io*, Up: Streams Dictionary ++ ++21.2.54 *terminal-io* [Variable] ++-------------------------------- ++ ++Value Type:: ++............ ++ ++a bidirectional stream. ++ ++Initial Value:: ++............... ++ ++implementation-dependent, but it must be an open stream that is not a ++generalized synonym stream to an I/O customization variables but that ++might be a generalized synonym stream to the value of some I/O ++customization variable. ++ ++Description:: ++............. ++ ++The value of *terminal-io*, called terminal I/O, is ordinarily a ++bidirectional stream that connects to the user's console. Typically, ++writing to this stream would cause the output to appear on a display ++screen, for example, and reading from the stream would accept input from ++a keyboard. It is intended that standard input functions such as read ++and read-char, when used with this stream, cause echoing of the input ++into the output side of the stream. The means by which this is ++accomplished are implementation-dependent. ++ ++ The effect of changing the value of *terminal-io*, either by binding ++or assignment, is implementation-defined. ++ ++Examples:: ++.......... ++ ++ (progn (prin1 'foo) (prin1 'bar *terminal-io*)) ++ |> FOOBAR ++ => BAR ++ (with-output-to-string (*standard-output*) ++ (prin1 'foo) ++ (prin1 'bar *terminal-io*)) ++ |> BAR ++ => "FOO" ++ ++See Also:: ++.......... ++ ++*debug-io*, *error-output*, *query-io*, *standard-input*, ++*standard-output*, *trace-output* ++ ++ ++File: gcl.info, Node: stream-error, Next: stream-error-stream, Prev: *terminal-io*, Up: Streams Dictionary ++ ++21.2.55 stream-error [Condition Type] ++------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++stream-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type stream-error consists of error conditions that are related to ++receiving input from or sending output to a stream. The "offending ++stream" is initialized by the :stream initialization argument to ++make-condition, and is accessed by the function stream-error-stream. ++ ++See Also:: ++.......... ++ ++*note stream-error-stream:: ++ ++ ++File: gcl.info, Node: stream-error-stream, Next: end-of-file, Prev: stream-error, Up: Streams Dictionary ++ ++21.2.56 stream-error-stream [Function] ++-------------------------------------- ++ ++'stream-error-stream' condition => stream ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type stream-error. ++ ++ stream--a stream. ++ ++Description:: ++............. ++ ++Returns the offending stream of a condition of type stream-error. ++ ++Examples:: ++.......... ++ ++ (with-input-from-string (s "(FOO") ++ (handler-case (read s) ++ (end-of-file (c) ++ (format nil "~&End of file on ~S." (stream-error-stream c))))) ++ "End of file on #." ++ ++See Also:: ++.......... ++ ++stream-error, *note Conditions:: ++ ++ ++File: gcl.info, Node: end-of-file, Prev: stream-error-stream, Up: Streams Dictionary ++ ++21.2.57 end-of-file [Condition Type] ++------------------------------------ ++ ++Class Precedence List:: ++....................... ++ ++end-of-file, stream-error, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type end-of-file consists of error conditions related to read ++operations that are done on streams that have no more data. ++ ++See Also:: ++.......... ++ ++*note stream-error-stream:: ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-8 +@@ -0,0 +1,8650 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: Printer, Next: Reader, Prev: Streams, Up: Top ++ ++22 Printer ++********** ++ ++* Menu: ++ ++* The Lisp Printer:: ++* The Lisp Pretty Printer:: ++* Formatted Output:: ++* Printer Dictionary:: ++ ++ ++File: gcl.info, Node: The Lisp Printer, Next: The Lisp Pretty Printer, Prev: Printer, Up: Printer ++ ++22.1 The Lisp Printer ++===================== ++ ++* Menu: ++ ++* Overview of The Lisp Printer:: ++* Printer Dispatching:: ++* Default Print-Object Methods:: ++* Examples of Printer Behavior:: ++ ++ ++File: gcl.info, Node: Overview of The Lisp Printer, Next: Printer Dispatching, Prev: The Lisp Printer, Up: The Lisp Printer ++ ++22.1.1 Overview of The Lisp Printer ++----------------------------------- ++ ++Common Lisp provides a representation of most objects in the form of ++printed text called the printed representation. Functions such as print ++take an object and send the characters of its printed representation to ++a stream. The collection of routines that does this is known as the ++(Common Lisp) printer. ++ ++ Reading a printed representation typically produces an object that is ++equal to the originally printed object. ++ ++* Menu: ++ ++* Multiple Possible Textual Representations:: ++* Printer Escaping:: ++ ++ ++File: gcl.info, Node: Multiple Possible Textual Representations, Next: Printer Escaping, Prev: Overview of The Lisp Printer, Up: Overview of The Lisp Printer ++ ++22.1.1.1 Multiple Possible Textual Representations ++.................................................. ++ ++Most objects have more than one possible textual representation. For ++example, the positive integer with a magnitude of twenty-seven can be ++textually expressed in any of these ways: ++ ++ 27 27. #o33 #x1B #b11011 #.(* 3 3 3) 81/3 ++ ++ A list containing the two symbols A and B can also be textually ++expressed in a variety of ways: ++ ++ (A B) (a b) ( a b ) (\A |B|) ++ (|\A| ++ B ++ ) ++ ++ In general, ++ ++ from the point of view of the Lisp reader, ++ ++ wherever whitespace is permissible in a textual representation, any ++number of spaces and newlines can appear in standard syntax. ++ ++ When a function such as print produces a printed representation, it ++must choose from among many possible textual representations. In most ++cases, it chooses a program readable representation, but in certain ++cases it might use a more compact notation that is not program-readable. ++ ++ A number of option variables, called printer control variables , are ++provided to permit control of individual aspects of the printed ++representation of objects. Figure 22-1 shows the standardized printer ++control variables; there might also be implementation-defined printer ++control variables. ++ ++ *print-array* *print-gensym* *print-pprint-dispatch* ++ *print-base* *print-length* *print-pretty* ++ *print-case* *print-level* *print-radix* ++ *print-circle* *print-lines* *print-readably* ++ *print-escape* *print-miser-width* *print-right-margin* ++ ++ Figure 22-1: Standardized Printer Control Variables ++ ++ ++ In addition to the printer control variables, the following ++additional defined names relate to or affect the behavior of the Lisp ++printer: ++ ++ *package* *read-eval* readtable-case ++ *read-default-float-format* *readtable* ++ ++ Figure 22-2: Additional Influences on the Lisp printer. ++ ++ ++ ++File: gcl.info, Node: Printer Escaping, Prev: Multiple Possible Textual Representations, Up: Overview of The Lisp Printer ++ ++22.1.1.2 Printer Escaping ++......................... ++ ++The variable *print-escape* controls whether the Lisp printer tries to ++produce notations such as escape characters and package prefixes. ++ ++ The variable *print-readably* can be used to override many of the ++individual aspects controlled by the other printer control variables ++when program-readable output is especially important. ++ ++ One of the many effects of making the value of *print-readably* be ++true is that the Lisp printer behaves as if *print-escape* were also ++true. For notational convenience, we say that if the value of either ++*print-readably* or *print-escape* is true, then printer escaping is ++"enabled"; and we say that if the values of both *print-readably* and ++*print-escape* are false, then printer escaping is "disabled". ++ ++ ++File: gcl.info, Node: Printer Dispatching, Next: Default Print-Object Methods, Prev: Overview of The Lisp Printer, Up: The Lisp Printer ++ ++22.1.2 Printer Dispatching ++-------------------------- ++ ++The Lisp printer makes its determination of how to print an object as ++follows: ++ ++ If the value of *print-pretty* is true, printing is controlled by the ++current pprint dispatch table; see *note Pretty Print Dispatch Tables::. ++ ++ Otherwise (if the value of *print-pretty* is false), the object's ++print-object method is used; see *note Default Print-Object Methods::. ++ ++ ++File: gcl.info, Node: Default Print-Object Methods, Next: Examples of Printer Behavior, Prev: Printer Dispatching, Up: The Lisp Printer ++ ++22.1.3 Default Print-Object Methods ++----------------------------------- ++ ++This section describes the default behavior of print-object methods for ++the standardized types. ++ ++* Menu: ++ ++* Printing Numbers:: ++* Printing Integers:: ++* Printing Ratios:: ++* Printing Floats:: ++* Printing Complexes:: ++* Note about Printing Numbers:: ++* Printing Characters:: ++* Printing Symbols:: ++* Package Prefixes for Symbols:: ++* Effect of Readtable Case on the Lisp Printer:: ++* Examples of Effect of Readtable Case on the Lisp Printer:: ++* Printing Strings:: ++* Printing Lists and Conses:: ++* Printing Bit Vectors:: ++* Printing Other Vectors:: ++* Printing Other Arrays:: ++* Examples of Printing Arrays:: ++* Printing Random States:: ++* Printing Pathnames:: ++* Printing Structures:: ++* Printing Other Objects:: ++ ++ ++File: gcl.info, Node: Printing Numbers, Next: Printing Integers, Prev: Default Print-Object Methods, Up: Default Print-Object Methods ++ ++22.1.3.1 Printing Numbers ++......................... ++ ++ ++File: gcl.info, Node: Printing Integers, Next: Printing Ratios, Prev: Printing Numbers, Up: Default Print-Object Methods ++ ++22.1.3.2 Printing Integers ++.......................... ++ ++Integers are printed in the radix specified by the current output base ++in positional notation, most significant digit first. If appropriate, a ++radix specifier can be printed; see *print-radix*. If an integer is ++negative, a minus sign is printed and then the absolute value of the ++integer is printed. The integer zero is represented by the single digit ++0 and never has a sign. A decimal point might be printed, depending on ++the value of *print-radix*. ++ ++ For related information about the syntax of an integer, see *note ++Syntax of an Integer::. ++ ++ ++File: gcl.info, Node: Printing Ratios, Next: Printing Floats, Prev: Printing Integers, Up: Default Print-Object Methods ++ ++22.1.3.3 Printing Ratios ++........................ ++ ++Ratios are printed as follows: the absolute value of the numerator is ++printed, as for an integer; then a /; then the denominator. The ++numerator and denominator are both printed in the radix specified by the ++current output base; they are obtained as if by numerator and ++denominator, and so ratios are printed in reduced form (lowest terms). ++If appropriate, a radix specifier can be printed; see *print-radix*. If ++the ratio is negative, a minus sign is printed before the numerator. ++ ++ For related information about the syntax of a ratio, see *note Syntax ++of a Ratio::. ++ ++ ++File: gcl.info, Node: Printing Floats, Next: Printing Complexes, Prev: Printing Ratios, Up: Default Print-Object Methods ++ ++22.1.3.4 Printing Floats ++........................ ++ ++If the magnitude of the float is either zero or between 10^-3 ++(inclusive) and 10^7 (exclusive), it is printed as the integer part of ++the number, then a decimal point, followed by the fractional part of the ++number; there is always at least one digit on each side of the decimal ++point. If the sign of the number (as determined by float-sign) is ++negative, then a minus sign is printed before the number. If the format ++of the number does not match that specified by ++*read-default-float-format*, then the exponent marker for that format ++and the digit 0 are also printed. For example, the base of the natural ++logarithms as a short float might be printed as 2.71828S0. ++ ++ For non-zero magnitudes outside of the range 10^-3 to 10^7, a float ++is printed in computerized scientific notation. The representation of ++the number is scaled to be between 1 (inclusive) and 10 (exclusive) and ++then printed, with one digit before the decimal point and at least one ++digit after the decimal point. Next the exponent marker for the format ++is printed, except that if the format of the number matches that ++specified by *read-default-float-format*, then the exponent marker E is ++used. Finally, the power of ten by which the fraction must be ++multiplied to equal the original number is printed as a decimal integer. ++For example, Avogadro's number as a short float is printed as 6.02S23. ++ ++ For related information about the syntax of a float, see *note Syntax ++of a Float::. ++ ++ ++File: gcl.info, Node: Printing Complexes, Next: Note about Printing Numbers, Prev: Printing Floats, Up: Default Print-Object Methods ++ ++22.1.3.5 Printing Complexes ++........................... ++ ++A complex is printed as #C, an open parenthesis, the printed ++representation of its real part, a space, the printed representation of ++its imaginary part, and finally a close parenthesis. ++ ++ For related information about the syntax of a complex, see *note ++Syntax of a Complex:: and *note Sharpsign C::. ++ ++ ++File: gcl.info, Node: Note about Printing Numbers, Next: Printing Characters, Prev: Printing Complexes, Up: Default Print-Object Methods ++ ++22.1.3.6 Note about Printing Numbers ++.................................... ++ ++The printed representation of a number must not contain escape ++characters; see *note Escape Characters and Potential Numbers::. ++ ++ ++File: gcl.info, Node: Printing Characters, Next: Printing Symbols, Prev: Note about Printing Numbers, Up: Default Print-Object Methods ++ ++22.1.3.7 Printing Characters ++............................ ++ ++When printer escaping is disabled, ++ ++ a character prints as itself; it is sent directly to the output ++stream. ++ ++ When printer escaping is enabled, ++ ++ then #\ syntax is used. ++ ++ When the printer types out the name of a character, it uses the same ++table as the #\ reader macro would use; therefore any character name ++that is typed out is acceptable as input (in that implementation). If a ++non-graphic character has a standardized name_5, that name is preferred ++over non-standard names for printing in #\ notation. For the graphic ++standard characters, the character itself is always used for printing in ++#\ notation--even if the character also has a name_5. ++ ++ For details about the #\ reader macro, see *note Sharpsign ++Backslash::. ++ ++ ++File: gcl.info, Node: Printing Symbols, Next: Package Prefixes for Symbols, Prev: Printing Characters, Up: Default Print-Object Methods ++ ++22.1.3.8 Printing Symbols ++......................... ++ ++When printer escaping is disabled, ++ ++ only the characters of the symbol's name are output ++ ++ (but the case in which to print characters in the name is controlled ++by *print-case*; see *note Effect of Readtable Case on the Lisp ++Printer::). ++ ++ The remainder of this section applies only ++ ++ when printer escaping is enabled. ++ ++ When printing a symbol, the printer inserts enough single escape ++and/or multiple escape characters (backslashes and/or vertical-bars) so ++that if read were called with the same *readtable* and with *read-base* ++bound to the current output base, it would return the same symbol (if it ++is not apparently uninterned) or an uninterned symbol with the same ++print name (otherwise). ++ ++ For example, if the value of *print-base* were 16 when printing the ++symbol face, it would have to be printed as \FACE or \Face or |FACE|, ++because the token face would be read as a hexadecimal number (decimal ++value 64206) if the value of *read-base* were 16. ++ ++ For additional restrictions concerning characters with nonstandard ++syntax types in the current readtable, see the variable *print-readably* ++ ++ For information about how the Lisp reader parses symbols, see *note ++Symbols as Tokens:: and *note Sharpsign Colon::. ++ ++ nil might be printed as () ++ ++ when *print-pretty* is true and printer escaping is enabled. ++ ++ ++File: gcl.info, Node: Package Prefixes for Symbols, Next: Effect of Readtable Case on the Lisp Printer, Prev: Printing Symbols, Up: Default Print-Object Methods ++ ++22.1.3.9 Package Prefixes for Symbols ++..................................... ++ ++Package prefixes are printed if necessary. The rules for package ++prefixes are as follows. When the symbol is printed, if it is in the ++KEYWORD package, then it is printed with a preceding colon; otherwise, ++if it is accessible in the current package, it is printed without any ++package prefix; otherwise, it is printed with a package prefix. ++ ++ A symbol that is apparently uninterned is printed preceded by "#:" ++ ++ if *print-gensym* is true and printer escaping is enabled; if ++*print-gensym* is false or printer escaping is disabled, ++ ++ then the symbol is printed without a prefix, as if it were in the ++current package. ++ ++ Because the #: syntax does not intern the following symbol, it is ++necessary to use circular-list syntax if *print-circle* is true and the ++same uninterned symbol appears several times in an expression to be ++printed. For example, the result of ++ ++ (let ((x (make-symbol "FOO"))) (list x x)) ++ ++ would be printed as (#:foo #:foo) if *print-circle* were false, but ++as (#1=#:foo #1#) if *print-circle* were true. ++ ++ A summary of the preceding package prefix rules follows: ++ ++foo:bar ++ foo:bar is printed when symbol bar is external in its home package ++ foo and is not accessible in the current package. ++ ++foo::bar ++ foo::bar is printed when bar is internal in its home package foo ++ and is not accessible in the current package. ++ ++:bar ++ :bar is printed when the home package of bar is the KEYWORD ++ package. ++ ++#:bar ++ #:bar is printed when bar is apparently uninterned, even in the ++ pathological case that bar has no home package but is nevertheless ++ somehow accessible in the current package. ++ ++ ++File: gcl.info, Node: Effect of Readtable Case on the Lisp Printer, Next: Examples of Effect of Readtable Case on the Lisp Printer, Prev: Package Prefixes for Symbols, Up: Default Print-Object Methods ++ ++22.1.3.10 Effect of Readtable Case on the Lisp Printer ++...................................................... ++ ++When printer escaping is disabled, or the characters under consideration ++are not already quoted specifically by single escape or multiple escape ++syntax, ++ ++ the readtable case of the current readtable affects the way the Lisp ++printer writes symbols in the following ways: ++ ++:upcase ++ When the readtable case is :upcase, uppercase characters are ++ printed in the case specified by *print-case*, and lowercase ++ characters are printed in their own case. ++ ++:downcase ++ When the readtable case is :downcase, uppercase characters are ++ printed in their own case, and lowercase characters are printed in ++ the case specified by *print-case*. ++ ++:preserve ++ When the readtable case is :preserve, all alphabetic characters are ++ printed in their own case. ++ ++:invert ++ When the readtable case is :invert, the case of all alphabetic ++ characters in single case symbol names is inverted. Mixed-case ++ symbol names are printed as is. ++ ++ The rules for escaping alphabetic characters in symbol names are ++affected by the readtable-case ++ ++ if printer escaping is enabled. ++ ++ Alphabetic characters are escaped as follows: ++ ++:upcase ++ When the readtable case is :upcase, all lowercase characters must ++ be escaped. ++ ++:downcase ++ When the readtable case is :downcase, all uppercase characters must ++ be escaped. ++ ++:preserve ++ When the readtable case is :preserve, no alphabetic characters need ++ be escaped. ++ ++:invert ++ When the readtable case is :invert, no alphabetic characters need ++ be escaped. ++ ++ ++File: gcl.info, Node: Examples of Effect of Readtable Case on the Lisp Printer, Next: Printing Strings, Prev: Effect of Readtable Case on the Lisp Printer, Up: Default Print-Object Methods ++ ++22.1.3.11 Examples of Effect of Readtable Case on the Lisp Printer ++.................................................................. ++ ++ (defun test-readtable-case-printing () ++ (let ((*readtable* (copy-readtable nil)) ++ (*print-case* *print-case*)) ++ (format t "READTABLE-CASE *PRINT-CASE* Symbol-name Output~ ++ ~ ++ ~ ++ (dolist (readtable-case '(:upcase :downcase :preserve :invert)) ++ (setf (readtable-case *readtable*) readtable-case) ++ (dolist (print-case '(:upcase :downcase :capitalize)) ++ (dolist (symbol '(|ZEBRA| |Zebra| |zebra|)) ++ (setq *print-case* print-case) ++ (format t "~&:~A~15T:~A~29T~A~42T~A" ++ (string-upcase readtable-case) ++ (string-upcase print-case) ++ (symbol-name symbol) ++ (prin1-to-string symbol))))))) ++ ++ The output from (test-readtable-case-printing) should be as follows: ++ ++ READTABLE-CASE *PRINT-CASE* Symbol-name Output ++ -------------------------------------------------- ++ :UPCASE :UPCASE ZEBRA ZEBRA ++ :UPCASE :UPCASE Zebra |Zebra| ++ :UPCASE :UPCASE zebra |zebra| ++ :UPCASE :DOWNCASE ZEBRA zebra ++ :UPCASE :DOWNCASE Zebra |Zebra| ++ :UPCASE :DOWNCASE zebra |zebra| ++ :UPCASE :CAPITALIZE ZEBRA Zebra ++ :UPCASE :CAPITALIZE Zebra |Zebra| ++ :UPCASE :CAPITALIZE zebra |zebra| ++ :DOWNCASE :UPCASE ZEBRA |ZEBRA| ++ :DOWNCASE :UPCASE Zebra |Zebra| ++ :DOWNCASE :UPCASE zebra ZEBRA ++ :DOWNCASE :DOWNCASE ZEBRA |ZEBRA| ++ :DOWNCASE :DOWNCASE Zebra |Zebra| ++ :DOWNCASE :DOWNCASE zebra zebra ++ :DOWNCASE :CAPITALIZE ZEBRA |ZEBRA| ++ :DOWNCASE :CAPITALIZE Zebra |Zebra| ++ :DOWNCASE :CAPITALIZE zebra Zebra ++ :PRESERVE :UPCASE ZEBRA ZEBRA ++ :PRESERVE :UPCASE Zebra Zebra ++ :PRESERVE :UPCASE zebra zebra ++ :PRESERVE :DOWNCASE ZEBRA ZEBRA ++ :PRESERVE :DOWNCASE Zebra Zebra ++ :PRESERVE :DOWNCASE zebra zebra ++ :PRESERVE :CAPITALIZE ZEBRA ZEBRA ++ :PRESERVE :CAPITALIZE Zebra Zebra ++ :PRESERVE :CAPITALIZE zebra zebra ++ :INVERT :UPCASE ZEBRA zebra ++ :INVERT :UPCASE Zebra Zebra ++ :INVERT :UPCASE zebra ZEBRA ++ :INVERT :DOWNCASE ZEBRA zebra ++ :INVERT :DOWNCASE Zebra Zebra ++ :INVERT :DOWNCASE zebra ZEBRA ++ :INVERT :CAPITALIZE ZEBRA zebra ++ :INVERT :CAPITALIZE Zebra Zebra ++ :INVERT :CAPITALIZE zebra ZEBRA ++ ++ ++File: gcl.info, Node: Printing Strings, Next: Printing Lists and Conses, Prev: Examples of Effect of Readtable Case on the Lisp Printer, Up: Default Print-Object Methods ++ ++22.1.3.12 Printing Strings ++.......................... ++ ++The characters of the string are output in order. ++ ++ If printer escaping is enabled, ++ ++ a double-quote is output before and after, and all double-quotes and ++single escapes are preceded by backslash. The printing of strings is ++not affected by *print-array*. Only the active elements of the string ++are printed. ++ ++ For information on how the Lisp reader parses strings, see *note ++Double-Quote::. ++ ++ ++File: gcl.info, Node: Printing Lists and Conses, Next: Printing Bit Vectors, Prev: Printing Strings, Up: Default Print-Object Methods ++ ++22.1.3.13 Printing Lists and Conses ++................................... ++ ++Wherever possible, list notation is preferred over dot notation. ++Therefore the following algorithm is used to print a cons x: ++ ++1. ++ A left-parenthesis is printed. ++ ++2. ++ The car of x is printed. ++ ++3. ++ If the cdr of x is itself a cons, it is made to be the current cons ++ (i.e., x becomes that cons), ++ ++ a space ++ ++ is printed, and step 2 is re-entered. ++ ++4. ++ If the cdr of x is not null, ++ ++ a space, ++ ++ a dot, ++ ++ a space, ++ ++ and the cdr of x are printed. ++ ++5. ++ A right-parenthesis is printed. ++ ++ Actually, the above algorithm is only used when *print-pretty* is ++false. When *print-pretty* is true (or when pprint is used), additional ++whitespace_1 may replace the use of a single space, and a more elaborate ++algorithm with similar goals but more presentational flexibility is ++used; see *note Printer Dispatching::. ++ ++ Although the two expressions below are equivalent, and the reader ++accepts either one and produces the same cons, the printer always prints ++such a cons in the second form. ++ ++ (a . (b . ((c . (d . nil)) . (e . nil)))) ++ (a b (c d) e) ++ ++ The printing of conses is affected by *print-level*, *print-length*, ++and *print-circle*. ++ ++ Following are examples of printed representations of lists: ++ ++ (a . b) ;A dotted pair of a and b ++ (a.b) ;A list of one element, the symbol named a.b ++ (a. b) ;A list of two elements a. and b ++ (a .b) ;A list of two elements a and .b ++ (a b . c) ;A dotted list of a and b with c at the end; two conses ++ .iot ;The symbol whose name is .iot ++ (. b) ;Invalid -- an error is signaled if an attempt is made to read ++ ;this syntax. ++ (a .) ;Invalid -- an error is signaled. ++ (a .. b) ;Invalid -- an error is signaled. ++ (a . . b) ;Invalid -- an error is signaled. ++ (a b c ...) ;Invalid -- an error is signaled. ++ (a \. b) ;A list of three elements a, ., and b ++ (a |.| b) ;A list of three elements a, ., and b ++ (a \... b) ;A list of three elements a, ..., and b ++ (a |...| b) ;A list of three elements a, ..., and b ++ ++ For information on how the Lisp reader parses lists and conses, see ++*note Left-Parenthesis::. ++ ++ ++File: gcl.info, Node: Printing Bit Vectors, Next: Printing Other Vectors, Prev: Printing Lists and Conses, Up: Default Print-Object Methods ++ ++22.1.3.14 Printing Bit Vectors ++.............................. ++ ++A bit vector is printed as #* followed by the bits of the bit vector in ++order. If *print-array* is false, then the bit vector is printed in a ++format (using #<) that is concise but not readable. Only the active ++elements of the bit vector are printed. ++ ++ [Reviewer Note by Barrett: Need to provide for #5*0 as an alternate ++notation for #*00000.] ++ ++ For information on Lisp reader parsing of bit vectors, see *note ++Sharpsign Asterisk::. ++ ++ ++File: gcl.info, Node: Printing Other Vectors, Next: Printing Other Arrays, Prev: Printing Bit Vectors, Up: Default Print-Object Methods ++ ++22.1.3.15 Printing Other Vectors ++................................ ++ ++If *print-array* is true and *print-readably* is false, any ++ ++ vector other than a string or bit vector is printed using ++general-vector syntax; this means that information about specialized ++vector representations does not appear. The printed representation of a ++zero-length vector is #(). The printed representation of a ++non-zero-length vector begins with #(. Following that, the first ++element of the vector is printed. ++ ++ If there are any other elements, they are printed in turn, with each ++such additional element preceded by a space if *print-pretty* is false, ++or whitespace_1 if *print-pretty* is true. ++ ++ A right-parenthesis after the last element terminates the printed ++representation of the vector. The printing of vectors is affected by ++*print-level* and *print-length*. If the vector has a fill pointer, ++then only those elements below the fill pointer are printed. ++ ++ If both *print-array* and *print-readably* are false, ++ ++ the vector is not printed as described above, but in a format (using ++#<) that is concise but not readable. ++ ++ If *print-readably* is true, the vector prints in an ++implementation-defined manner; see the variable *print-readably*. ++ ++ For information on how the Lisp reader parses these "other vectors," ++see *note Sharpsign Left-Parenthesis::. ++ ++ ++File: gcl.info, Node: Printing Other Arrays, Next: Examples of Printing Arrays, Prev: Printing Other Vectors, Up: Default Print-Object Methods ++ ++22.1.3.16 Printing Other Arrays ++............................... ++ ++If *print-array* is true and *print-readably* is false, any ++ ++ array other than a vector is printed using #nA format. Let n be the ++rank of the array. Then # is printed, then n as a decimal integer, then ++A, then n open parentheses. Next the elements are scanned in row-major ++order, using write on each element, and separating elements from each ++other with whitespace_1. The array's dimensions are numbered 0 to n-1 ++from left to right, and are enumerated with the rightmost index changing ++fastest. Every time the index for dimension j is incremented, the ++following actions are taken: ++ ++* ++ If j < n-1, then a close parenthesis is printed. ++ ++* ++ If incrementing the index for dimension j caused it to equal ++ dimension j, that index is reset to zero and the index for ++ dimension j-1 is incremented (thereby performing these three steps ++ recursively), unless j=0, in which case the entire algorithm is ++ terminated. If incrementing the index for dimension j did not ++ cause it to equal dimension j, then a space is printed. ++ ++* ++ If j < n-1, then an open parenthesis is printed. ++ ++ This causes the contents to be printed in a format suitable for ++:initial-contents to make-array. The lists effectively printed by this ++procedure are subject to truncation by *print-level* and *print-length*. ++ ++ If the array is of a specialized type, containing bits or characters, ++then the innermost lists generated by the algorithm given above can ++instead be printed using bit-vector or string syntax, provided that ++these innermost lists would not be subject to truncation by ++*print-length*. ++ ++ If both *print-array* and *print-readably* are false, ++ ++ then the array is printed in a format (using #<) that is concise but ++not readable. ++ ++ If *print-readably* is true, the array prints in an ++implementation-defined manner; see the variable *print-readably*. ++ ++ In particular, this may be important for arrays having some dimension ++0. ++ ++ For information on how the Lisp reader parses these "other arrays," ++see *note Sharpsign A::. ++ ++ ++File: gcl.info, Node: Examples of Printing Arrays, Next: Printing Random States, Prev: Printing Other Arrays, Up: Default Print-Object Methods ++ ++22.1.3.17 Examples of Printing Arrays ++..................................... ++ ++ (let ((a (make-array '(3 3))) ++ (*print-pretty* t) ++ (*print-array* t)) ++ (dotimes (i 3) (dotimes (j 3) (setf (aref a i j) (format nil "<~D,~D>" i j)))) ++ (print a) ++ (print (make-array 9 :displaced-to a))) ++ |> #2A(("<0,0>" "<0,1>" "<0,2>") ++ |> ("<1,0>" "<1,1>" "<1,2>") ++ |> ("<2,0>" "<2,1>" "<2,2>")) ++ |> #("<0,0>" "<0,1>" "<0,2>" "<1,0>" "<1,1>" "<1,2>" "<2,0>" "<2,1>" "<2,2>") ++ => # ++ ++ ++File: gcl.info, Node: Printing Random States, Next: Printing Pathnames, Prev: Examples of Printing Arrays, Up: Default Print-Object Methods ++ ++22.1.3.18 Printing Random States ++................................ ++ ++A specific syntax for printing objects of type random-state is not ++specified. However, every implementation must arrange to print a random ++state object in such a way that, within the same implementation, read ++can construct from the printed representation a copy of the random state ++object as if the copy had been made by make-random-state. ++ ++ If the type random state is effectively implemented by using the ++machinery for defstruct, the usual structure syntax can then be used for ++printing random state objects; one might look something like ++ ++ #S(RANDOM-STATE :DATA #(14 49 98436589 786345 8734658324 ... )) ++ ++ where the components are implementation-dependent. ++ ++ ++File: gcl.info, Node: Printing Pathnames, Next: Printing Structures, Prev: Printing Random States, Up: Default Print-Object Methods ++ ++22.1.3.19 Printing Pathnames ++............................ ++ ++When printer escaping is enabled, ++ ++ the syntax #P"..." is how a pathname is printed by write and the ++other functions herein described. The "..." is the namestring ++representation of the pathname. ++ ++ When printer escaping is disabled, ++ ++ write writes a pathname P by writing (namestring P) instead. ++ ++ For information on how the Lisp reader parses pathnames, see *note ++Sharpsign P::. ++ ++ ++File: gcl.info, Node: Printing Structures, Next: Printing Other Objects, Prev: Printing Pathnames, Up: Default Print-Object Methods ++ ++22.1.3.20 Printing Structures ++............................. ++ ++By default, a structure of type S is printed using #S syntax. This ++behavior can be customized by specifying a :print-function or ++:print-object option to the defstruct form that defines S, or by writing ++a print-object method that is specialized for objects of type S. ++ ++ Different structures might print out in different ways; the default ++notation for structures is: ++ ++ #S(structure-name {slot-key slot-value}*) ++ ++ where #S indicates structure syntax, structure-name is a structure ++name, each slot-key is an initialization argument name for a slot in the ++structure, and each corresponding slot-value is a representation of the ++object in that slot. ++ ++ For information on how the Lisp reader parses structures, see *note ++Sharpsign S::. ++ ++ ++File: gcl.info, Node: Printing Other Objects, Prev: Printing Structures, Up: Default Print-Object Methods ++ ++22.1.3.21 Printing Other Objects ++................................ ++ ++Other objects are printed in an implementation-dependent manner. It is ++not required that an implementation print those objects readably. ++ ++ For example, hash tables, readtables, packages, streams, and ++functions might not print readably. ++ ++ A common notation to use in this circumstance is #<...>. Since #< is ++not readable by the Lisp reader, the precise format of the text which ++follows is not important, but a common format to use is that provided by ++the print-unreadable-object macro. ++ ++ For information on how the Lisp reader treats this notation, see ++*note Sharpsign Less-Than-Sign::. For information on how to notate ++objects that cannot be printed readably, see *note Sharpsign Dot::. ++ ++ ++File: gcl.info, Node: Examples of Printer Behavior, Prev: Default Print-Object Methods, Up: The Lisp Printer ++ ++22.1.4 Examples of Printer Behavior ++----------------------------------- ++ ++ (let ((*print-escape* t)) (fresh-line) (write #\a)) ++ |> #\a ++ => #\a ++ (let ((*print-escape* nil) (*print-readably* nil)) ++ (fresh-line) ++ (write #\a)) ++ |> a ++ => #\a ++ (progn (fresh-line) (prin1 #\a)) ++ |> #\a ++ => #\a ++ (progn (fresh-line) (print #\a)) ++ |> ++ |> #\a ++ => #\a ++ (progn (fresh-line) (princ #\a)) ++ |> a ++ => #\a ++ ++ (dolist (val '(t nil)) ++ (let ((*print-escape* val) (*print-readably* val)) ++ (print '#\a) ++ (prin1 #\a) (write-char #\Space) ++ (princ #\a) (write-char #\Space) ++ (write #\a))) ++ |> #\a #\a a #\a ++ |> #\a #\a a a ++ => NIL ++ ++ (progn (fresh-line) (write '(let ((a 1) (b 2)) (+ a b)))) ++ |> (LET ((A 1) (B 2)) (+ A B)) ++ => (LET ((A 1) (B 2)) (+ A B)) ++ ++ (progn (fresh-line) (pprint '(let ((a 1) (b 2)) (+ a b)))) ++ |> (LET ((A 1) ++ |> (B 2)) ++ |> (+ A B)) ++ => (LET ((A 1) (B 2)) (+ A B)) ++ ++ (progn (fresh-line) ++ (write '(let ((a 1) (b 2)) (+ a b)) :pretty t)) ++ |> (LET ((A 1) ++ |> (B 2)) ++ |> (+ A B)) ++ => (LET ((A 1) (B 2)) (+ A B)) ++ ++ (with-output-to-string (s) ++ (write 'write :stream s) ++ (prin1 'prin1 s)) ++ => "WRITEPRIN1" ++ ++ ++File: gcl.info, Node: The Lisp Pretty Printer, Next: Formatted Output, Prev: The Lisp Printer, Up: Printer ++ ++22.2 The Lisp Pretty Printer ++============================ ++ ++* Menu: ++ ++* Pretty Printer Concepts:: ++* Examples of using the Pretty Printer:: ++* Notes about the Pretty Printer`s Background:: ++ ++ ++File: gcl.info, Node: Pretty Printer Concepts, Next: Examples of using the Pretty Printer, Prev: The Lisp Pretty Printer, Up: The Lisp Pretty Printer ++ ++22.2.1 Pretty Printer Concepts ++------------------------------ ++ ++The facilities provided by the pretty printer permit programs to ++redefine the way in which code is displayed, and allow the full power of ++pretty printing to be applied to complex combinations of data ++structures. ++ ++ Whether any given style of output is in fact "pretty" is inherently a ++somewhat subjective issue. However, since the effect of the pretty ++printer can be customized by conforming programs, the necessary ++flexibility is provided for individual programs to achieve an arbitrary ++degree of aesthetic control. ++ ++ By providing direct access to the mechanisms within the pretty ++printer that make dynamic decisions about layout, the macros and ++functions pprint-logical-block, pprint-newline, and pprint-indent make ++it possible to specify pretty printing layout rules as a part of any ++function that produces output. They also make it very easy for the ++detection of circularity and sharing, and abbreviation based on length ++and nesting depth to be supported by the function. ++ ++ The pretty printer is driven entirely by dispatch based on the value ++of *print-pprint-dispatch*. The function set-pprint-dispatch makes it ++possible for conforming programs to associate new pretty printing ++functions with a type. ++ ++* Menu: ++ ++* Dynamic Control of the Arrangement of Output:: ++* Format Directive Interface:: ++* Compiling Format Strings:: ++* Pretty Print Dispatch Tables:: ++* Pretty Printer Margins:: ++ ++ ++File: gcl.info, Node: Dynamic Control of the Arrangement of Output, Next: Format Directive Interface, Prev: Pretty Printer Concepts, Up: Pretty Printer Concepts ++ ++22.2.1.1 Dynamic Control of the Arrangement of Output ++..................................................... ++ ++The actions of the pretty printer when a piece of output is too large to ++fit in the space available can be precisely controlled. Three concepts ++underlie the way these operations work--logical blocks , conditional ++newlines , and sections . Before proceeding further, it is important to ++define these terms. ++ ++ The first line of Figure 22-3 shows a schematic piece of output. ++Each of the characters in the output is represented by "-". The ++positions of conditional newlines are indicated by digits. The ++beginnings and ends of logical blocks are indicated by "<" and ">" ++respectively. ++ ++ The output as a whole is a logical block and the outermost section. ++This section is indicated by the 0's on the second line of Figure 1. ++Logical blocks nested within the output are specified by the macro ++pprint-logical-block. Conditional newline positions are specified by ++calls to pprint-newline. Each conditional newline defines two sections ++(one before it and one after it) and is associated with a third (the ++section immediately containing it). ++ ++ The section after a conditional newline consists of: all the output ++up to, but not including, (a) the next conditional newline immediately ++contained in the same logical block; or if (a) is not applicable, (b) ++the next newline that is at a lesser level of nesting in logical blocks; ++or if (b) is not applicable, (c) the end of the output. ++ ++ The section before a conditional newline consists of: all the output ++back to, but not including, (a) the previous conditional newline that is ++immediately contained in the same logical block; or if (a) is not ++applicable, (b) the beginning of the immediately containing logical ++block. The last four lines in Figure 1 indicate the sections before and ++after the four conditional newlines. ++ ++ The section immediately containing a conditional newline is the ++shortest section that contains the conditional newline in question. In ++Figure 22-3, the first conditional newline is immediately contained in ++the section marked with 0's, the second and third conditional newlines ++are immediately contained in the section before the fourth conditional ++newline, and the fourth conditional newline is immediately contained in ++the section after the first conditional newline. ++ ++ <-1---<--<--2---3->--4-->-> ++ 000000000000000000000000000 ++ 11 111111111111111111111111 ++ 22 222 ++ 333 3333 ++ 44444444444444 44444 ++ ++ Figure 22-2: Example of Logical Blocks, Conditional Newlines, and Sections ++ ++ Whenever possible, the pretty printer displays the entire contents of ++a section on a single line. However, if the section is too long to fit ++in the space available, line breaks are inserted at conditional newline ++positions within the section. ++ ++ ++File: gcl.info, Node: Format Directive Interface, Next: Compiling Format Strings, Prev: Dynamic Control of the Arrangement of Output, Up: Pretty Printer Concepts ++ ++22.2.1.2 Format Directive Interface ++................................... ++ ++The primary interface to operations for dynamically determining the ++arrangement of output is provided through the functions and macros of ++the pretty printer. Figure 22-3 shows the defined names related to ++pretty printing. ++ ++ *print-lines* pprint-dispatch pprint-pop ++ *print-miser-width* pprint-exit-if-list-exhausted pprint-tab ++ *print-pprint-dispatch* pprint-fill pprint-tabular ++ *print-right-margin* pprint-indent set-pprint-dispatch ++ copy-pprint-dispatch pprint-linear write ++ format pprint-logical-block ++ formatter pprint-newline ++ ++ Figure 22-3: Defined names related to pretty printing. ++ ++ ++ Figure 22-4 identifies a set of format directives which serve as an ++alternate interface to the same pretty printing operations in a more ++textually compact form. ++ ++ ~I ~W ~<...~:> ++ ~:T ~/.../ ~_ ++ ++ Figure 22-4: Format directives related to Pretty Printing ++ ++ ++ ++File: gcl.info, Node: Compiling Format Strings, Next: Pretty Print Dispatch Tables, Prev: Format Directive Interface, Up: Pretty Printer Concepts ++ ++22.2.1.3 Compiling Format Strings ++................................. ++ ++A format string is essentially a program in a special-purpose language ++that performs printing, and that is interpreted by the function format. ++The formatter macro provides the efficiency of using a compiled function ++to do that same printing but without losing the textual compactness of ++format strings. ++ ++ A format control is either a format string or a function that was ++returned by the the formatter macro. ++ ++ ++File: gcl.info, Node: Pretty Print Dispatch Tables, Next: Pretty Printer Margins, Prev: Compiling Format Strings, Up: Pretty Printer Concepts ++ ++22.2.1.4 Pretty Print Dispatch Tables ++..................................... ++ ++A pprint dispatch table is a mapping from keys to pairs of values. Each ++key is a type specifier. The values associated with a key are a ++"function" (specifically, a function designator or nil) and a "numerical ++priority" (specifically, a real). Basic insertion and retrieval is done ++based on the keys with the equality of keys being tested by equal. ++ ++ When *print-pretty* is true, the current pprint dispatch table (in ++*print-pprint-dispatch*) controls how objects are printed. The ++information in this table takes precedence over all other mechanisms for ++specifying how to print objects. In particular, it has priority over ++user-defined print-object methods ++ ++ because the current pprint dispatch table is consulted first. ++ ++ The function is chosen from the current pprint dispatch table by ++finding the highest priority function that is associated with a type ++specifier that matches the object; if there is more than one such ++function, it is implementation-dependent which is used. ++ ++ However, if there is no information in the table about how to pretty ++print a particular kind of object, a function is invoked which uses ++print-object to print the object. The value of *print-pretty* is still ++true when this function is called, and individual methods for ++print-object might still elect to produce output in a special format ++conditional on the value of *print-pretty*. ++ ++ ++File: gcl.info, Node: Pretty Printer Margins, Prev: Pretty Print Dispatch Tables, Up: Pretty Printer Concepts ++ ++22.2.1.5 Pretty Printer Margins ++............................... ++ ++A primary goal of pretty printing is to keep the output between a pair ++of margins. The column where the output begins is taken as the left ++margin. If the current column cannot be determined at the time output ++begins, the left margin is assumed to be zero. The right margin is ++controlled by *print-right-margin*. ++ ++ ++File: gcl.info, Node: Examples of using the Pretty Printer, Next: Notes about the Pretty Printer`s Background, Prev: Pretty Printer Concepts, Up: The Lisp Pretty Printer ++ ++22.2.2 Examples of using the Pretty Printer ++------------------------------------------- ++ ++As an example of the interaction of logical blocks, conditional ++newlines, and indentation, consider the function simple-pprint-defun ++below. This function prints out lists whose cars are defun in the ++standard way assuming that the list has exactly length 4. ++ ++ (defun simple-pprint-defun (*standard-output* list) ++ (pprint-logical-block (*standard-output* list :prefix "(" :suffix ")") ++ (write (first list)) ++ (write-char #\Space) ++ (pprint-newline :miser) ++ (pprint-indent :current 0) ++ (write (second list)) ++ (write-char #\Space) ++ (pprint-newline :fill) ++ (write (third list)) ++ (pprint-indent :block 1) ++ (write-char #\Space) ++ (pprint-newline :linear) ++ (write (fourth list)))) ++ ++ Suppose that one evaluates the following: ++ ++ (simple-pprint-defun *standard-output* '(defun prod (x y) (* x y))) ++ ++ If the line width available is greater than or equal to 26, then all ++of the output appears on one line. If the line width available is ++reduced to 25, a line break is inserted at the linear-style conditional ++newline ++ ++ before the expression (* x y), producing the output shown. The ++(pprint-indent :block 1) causes (* x y) to be printed at a relative ++indentation of 1 in the logical block. ++ ++ (DEFUN PROD (X Y) ++ (* X Y)) ++ ++ If the line width available is 15, a line break is also inserted at ++the fill style conditional newline before the argument list. The call ++on (pprint-indent :current 0) causes the argument list to line up under ++the function name. ++ ++ (DEFUN PROD ++ (X Y) ++ (* X Y)) ++ ++ If *print-miser-width* were greater than or equal to 14, the example ++output above would have been as follows, because all indentation changes ++are ignored in miser mode and line breaks are inserted at miser-style ++conditional newlines. ++ ++ (DEFUN ++ PROD ++ (X Y) ++ (* X Y)) ++ ++ As an example of a per-line prefix, consider that evaluating the ++following produces the output shown with a line width of 20 and ++*print-miser-width* of nil. ++ ++ (pprint-logical-block (*standard-output* nil :per-line-prefix ";;; ") ++ (simple-pprint-defun *standard-output* '(defun prod (x y) (* x y)))) ++ ++ ;;; (DEFUN PROD ++ ;;; (X Y) ++ ;;; (* X Y)) ++ ++ As a more complex (and realistic) example, consider the function ++pprint-let below. This specifies how to print a let form in the ++traditional style. It is more complex than the example above, because ++it has to deal with nested structure. Also, unlike the example above it ++contains complete code to readably print any possible list that begins ++with the symbol let. The outermost pprint-logical-block form handles ++the printing of the input list as a whole and specifies that parentheses ++should be printed in the output. The second pprint-logical-block form ++handles the list of binding pairs. Each pair in the list is itself ++printed by the innermost pprint-logical-block. (A loop form is used ++instead of merely decomposing the pair into two objects so that readable ++output will be produced no matter whether the list corresponding to the ++pair has one element, two elements, or (being malformed) has more than ++two elements.) A space and a fill-style conditional newline ++ ++ are placed after each pair except the last. The loop at the end of ++the topmost pprint-logical-block form prints out the forms in the body ++of the let form separated by spaces and linear-style conditional ++newlines. ++ ++ (defun pprint-let (*standard-output* list) ++ (pprint-logical-block (nil list :prefix "(" :suffix ")") ++ (write (pprint-pop)) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-logical-block (nil (pprint-pop) :prefix "(" :suffix ")") ++ (pprint-exit-if-list-exhausted) ++ (loop (pprint-logical-block (nil (pprint-pop) :prefix "(" :suffix ")") ++ (pprint-exit-if-list-exhausted) ++ (loop (write (pprint-pop)) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-newline :linear))) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-newline :fill))) ++ (pprint-indent :block 1) ++ (loop (pprint-exit-if-list-exhausted) ++ (write-char #\Space) ++ (pprint-newline :linear) ++ (write (pprint-pop))))) ++ ++ Suppose that one evaluates the following with *print-level* being 4, ++and *print-circle* being true. ++ ++ (pprint-let *standard-output* ++ '#1=(let (x (*print-length* (f (g 3))) ++ (z . 2) (k (car y))) ++ (setq x (sqrt z)) #1#)) ++ ++ If the line length is greater than or equal to 77, the output ++produced appears on one line. However, if the line length is 76, line ++breaks are inserted at the linear-style conditional newlines separating ++the forms in the body and the output below is produced. Note that, the ++degenerate binding pair x is printed readably even though it fails to be ++a list; a depth abbreviation marker is printed in place of (g 3); the ++binding pair (z . 2) is printed readably even though it is not a proper ++list; and appropriate circularity markers are printed. ++ ++ #1=(LET (X (*PRINT-LENGTH* (F #)) (Z . 2) (K (CAR Y))) ++ (SETQ X (SQRT Z)) ++ #1#) ++ ++ If the line length is reduced to 35, a line break is inserted at one ++of the fill-style conditional newlines separating the binding pairs. ++ ++ #1=(LET (X (*PRINT-PRETTY* (F #)) ++ (Z . 2) (K (CAR Y))) ++ (SETQ X (SQRT Z)) ++ #1#) ++ ++ Suppose that the line length is further reduced to 22 and ++*print-length* is set to 3. In this situation, line breaks are inserted ++after both the first and second binding pairs. In addition, the second ++binding pair is itself broken across two lines. Clause (b) of the ++description of fill-style conditional newlines (see the function ++pprint-newline) prevents the binding pair (z . 2) from being printed at ++the end of the third line. Note that the length abbreviation hides the ++circularity from view and therefore the printing of circularity markers ++disappears. ++ ++ (LET (X ++ (*PRINT-LENGTH* ++ (F #)) ++ (Z . 2) ...) ++ (SETQ X (SQRT Z)) ++ ...) ++ ++ The next function prints a vector using "#(...)" notation. ++ ++ (defun pprint-vector (*standard-output* v) ++ (pprint-logical-block (nil nil :prefix "#(" :suffix ")") ++ (let ((end (length v)) (i 0)) ++ (when (plusp end) ++ (loop (pprint-pop) ++ (write (aref v i)) ++ (if (= (incf i) end) (return nil)) ++ (write-char #\Space) ++ (pprint-newline :fill)))))) ++ ++ Evaluating the following with a line length of 15 produces the output ++shown. ++ ++ (pprint-vector *standard-output* '#(12 34 567 8 9012 34 567 89 0 1 23)) ++ ++ #(12 34 567 8 ++ 9012 34 567 ++ 89 0 1 23) ++ ++ As examples of the convenience of specifying pretty printing with ++format strings, consider that the functions simple-pprint-defun and ++pprint-let used as examples above can be compactly defined as follows. ++(The function pprint-vector cannot be defined using format because the ++data structure it traverses is not a list.) ++ ++ (defun simple-pprint-defun (*standard-output* list) ++ (format T "~:<~W ~@_~:I~W ~:_~W~1I ~_~W~:>" list)) ++ ++ (defun pprint-let (*standard-output* list) ++ (format T "~:<~W~^~:<~@{~:<~@{~W~^~_~}~:>~^~:_~}~:>~1I~@{~^~_~W~}~:>" list)) ++ ++ In the following example, the first form restores ++*print-pprint-dispatch* to the equivalent of its initial value. The ++next two forms then set up a special way to pretty print ratios. Note ++that the more specific type specifier has to be associated with a higher ++priority. ++ ++ (setq *print-pprint-dispatch* (copy-pprint-dispatch nil)) ++ ++ (set-pprint-dispatch 'ratio ++ #'(lambda (s obj) ++ (format s "#.(/ ~W ~W)" ++ (numerator obj) (denominator obj)))) ++ ++ (set-pprint-dispatch '(and ratio (satisfies minusp)) ++ #'(lambda (s obj) ++ (format s "#.(- (/ ~W ~W))" ++ (- (numerator obj)) (denominator obj))) ++ 5) ++ ++ (pprint '(1/3 -2/3)) ++ (#.(/ 1 3) #.(- (/ 2 3))) ++ ++ The following two forms illustrate the definition of pretty printing ++functions for types of code. The first form illustrates how to specify ++the traditional method for printing quoted objects using single-quote. ++Note the care taken to ensure that data lists that happen to begin with ++quote will be printed readably. The second form specifies that lists ++beginning with the symbol my-let should print the same way that lists ++beginning with let print when the initial pprint dispatch table is in ++effect. ++ ++ (set-pprint-dispatch '(cons (member quote)) () ++ #'(lambda (s list) ++ (if (and (consp (cdr list)) (null (cddr list))) ++ (funcall (formatter "'~W") s (cadr list)) ++ (pprint-fill s list)))) ++ ++ (set-pprint-dispatch '(cons (member my-let)) ++ (pprint-dispatch '(let) nil)) ++ ++ The next example specifies a default method for printing lists that ++do not correspond to function calls. Note that the functions ++pprint-linear, pprint-fill, and pprint-tabular are all defined with ++optional colon-p and at-sign-p arguments so that they can be used as ++pprint dispatch functions as well as ~/.../ functions. ++ ++ (set-pprint-dispatch '(cons (not (and symbol (satisfies fboundp)))) ++ #'pprint-fill -5) ++ ++ ;; Assume a line length of 9 ++ (pprint '(0 b c d e f g h i j k)) ++ (0 b c d ++ e f g h ++ i j k) ++ ++ This final example shows how to define a pretty printing function for ++a user defined data structure. ++ ++ (defstruct family mom kids) ++ ++ (set-pprint-dispatch 'family ++ #'(lambda (s f) ++ (funcall (formatter "~@<#<~;~W and ~2I~_~/pprint-fill/~;>~:>") ++ s (family-mom f) (family-kids f)))) ++ ++ The pretty printing function for the structure family specifies how ++to adjust the layout of the output so that it can fit aesthetically into ++a variety of line widths. In addition, it obeys the printer control ++variables *print-level*, *print-length*, *print-lines*, *print-circle* ++and *print-escape*, and can tolerate several different kinds of ++malformity in the data structure. The output below shows what is ++printed out with a right margin of 25, *print-pretty* being true, ++*print-escape* being false, and a malformed kids list. ++ ++ (write (list 'principal-family ++ (make-family :mom "Lucy" ++ :kids '("Mark" "Bob" . "Dan"))) ++ :right-margin 25 :pretty T :escape nil :miser-width nil) ++ (PRINCIPAL-FAMILY ++ #) ++ ++ Note that a pretty printing function for a structure is different ++from the structure's print-object method. While print-object methods ++are permanently associated with a structure, pretty printing functions ++are stored in pprint dispatch tables and can be rapidly changed to ++reflect different printing needs. If there is no pretty printing ++function for a structure in the current pprint dispatch table, its ++print-object method is used instead. ++ ++ ++File: gcl.info, Node: Notes about the Pretty Printer`s Background, Prev: Examples of using the Pretty Printer, Up: The Lisp Pretty Printer ++ ++22.2.3 Notes about the Pretty Printer's Background ++-------------------------------------------------- ++ ++For a background reference to the abstract concepts detailed in this ++section, see XP: A Common Lisp Pretty Printing System. The details of ++that paper are not binding on this document, but may be helpful in ++establishing a conceptual basis for understanding this material. ++ ++ ++File: gcl.info, Node: Formatted Output, Next: Printer Dictionary, Prev: The Lisp Pretty Printer, Up: Printer ++ ++22.3 Formatted Output ++===================== ++ ++[Editorial Note by KMP: This is transplanted from FORMAT and will need a ++bit of work before it looks good standing alone. Bear with me.] ++ ++ format is useful for producing nicely formatted text, producing ++good-looking messages, and so on. format can generate and return a ++string or output to destination. ++ ++ The control-string argument to format is actually a format control. ++That is, it can be either a format string or a function, for example a ++function returned by the formatter macro. ++ ++ If it is a function, the function is called with the appropriate ++output stream as its first argument and the data arguments to format as ++its remaining arguments. The function should perform whatever output is ++necessary and return the unused tail of the arguments (if any). ++ ++ The compilation process performed by formatter produces a function ++that would do with its arguments as the format interpreter would do with ++those arguments. ++ ++ The remainder of this section describes what happens if the ++control-string is a format string. ++ ++ Control-string is composed of simple text (characters) and embedded ++directives. ++ ++ format writes the simple text as is; each embedded directive ++specifies further text output that is to appear at the corresponding ++point within the simple text. Most directives use one or more elements ++of args to create their output. ++ ++ A directive consists of a tilde, optional prefix parameters separated ++by commas, optional colon and at-sign modifiers, and a single character ++indicating what kind of directive this is. ++ ++ There is no required ordering between the at-sign and colon modifier. ++ ++ The case of the directive character is ignored. Prefix parameters ++are notated as signed (sign is optional) decimal numbers, or as a ++single-quote followed by a character. For example, ~5,'0d can be used ++to print an integer in decimal radix in five columns with leading zeros, ++or ~5,'*d to get leading asterisks. ++ ++ In place of a prefix parameter to a directive, V (or v) can be used. ++In this case, format takes an argument from args as a parameter to the ++directive. The argument should be an integer or character. If the arg ++used by a V parameter is nil, the effect is as if the parameter had been ++omitted. # can be used in place of a prefix parameter; it represents ++the number of args remaining to be processed. When used within a ++recursive format, in the context of ~? or ~{, the # prefix parameter ++represents the number of format arguments remaining within the recursive ++call. ++ ++ Examples of format strings: ++ ++ "~S" ;This is an S directive with no parameters or modifiers. ++ "~3,-4:@s" ;This is an S directive with two parameters, 3 and -4, ++ ; and both the colon and at-sign flags. ++ "~,+4S" ;Here the first prefix parameter is omitted and takes ++ ; on its default value, while the second parameter is 4. ++ ++ Figure 22-5: Examples of format control strings ++ ++ ++ format sends the output to destination. If destination is nil, ++format creates and returns a string containing the output from ++control-string. If destination is non-nil, it must be a string with a ++fill pointer, a stream, or the symbol t. If destination is a string ++with a fill pointer, the output is added to the end of the string. If ++destination is a stream, the output is sent to that stream. If ++destination is t, the output is sent to standard output. ++ ++ In the description of the directives that follows, the term arg in ++general refers to the next item of the set of args to be processed. The ++word or phrase at the beginning of each description is a mnemonic for ++the directive. ++ ++ format directives do not bind any of the printer control variables ++(*print-...*) except as specified in the following descriptions. ++Implementations may specify the binding of new, implementation-specific ++printer control variables for each format directive, but they may ++neither bind any standard printer control variables not specified in ++description of a format directive nor fail to bind any standard printer ++control variables as specified in the description. ++ ++* Menu: ++ ++* FORMAT Basic Output:: ++* FORMAT Radix Control:: ++* FORMAT Floating-Point Printers:: ++* FORMAT Printer Operations:: ++* FORMAT Pretty Printer Operations:: ++* FORMAT Layout Control:: ++* FORMAT Control-Flow Operations:: ++* FORMAT Miscellaneous Operations:: ++* FORMAT Miscellaneous Pseudo-Operations:: ++* Additional Information about FORMAT Operations:: ++* Examples of FORMAT:: ++* Notes about FORMAT:: ++ ++ ++File: gcl.info, Node: FORMAT Basic Output, Next: FORMAT Radix Control, Prev: Formatted Output, Up: Formatted Output ++ ++22.3.1 FORMAT Basic Output ++-------------------------- ++ ++* Menu: ++ ++* Tilde C-> Character:: ++* Tilde Percent-> Newline:: ++* Tilde Ampersand-> Fresh-Line:: ++* Tilde Vertical-Bar-> Page:: ++* Tilde Tilde-> Tilde:: ++ ++ ++File: gcl.info, Node: Tilde C-> Character, Next: Tilde Percent-> Newline, Prev: FORMAT Basic Output, Up: FORMAT Basic Output ++ ++22.3.1.1 Tilde C: Character ++........................... ++ ++The next arg should be a character; it is printed according to the ++modifier flags. ++ ++ ~C prints the character as if by using write-char if it is a simple ++character. Characters that are not simple are not necessarily printed ++as if by write-char, but are displayed in an implementation-defined, ++abbreviated format. For example, ++ ++ (format nil "~C" #\A) => "A" ++ (format nil "~C" #\Space) => " " ++ ++ ~:C is the same as ~C for printing characters, but other characters ++are "spelled out." The intent is that this is a "pretty" format for ++printing characters. For simple characters that are not printing, what ++is spelled out is the name of the character (see char-name). For ++characters that are not simple and not printing, what is spelled out is ++implementation-defined. For example, ++ ++ (format nil "~:C" #\A) => "A" ++ (format nil "~:C" #\Space) => "Space" ++ ;; This next example assumes an implementation-defined "Control" attribute. ++ (format nil "~:C" #\Control-Space) ++ => "Control-Space" ++ OR=> "c-Space" ++ ++ ~:@C prints what ~:C would, and then if the character requires ++unusual shift keys on the keyboard to type it, this fact is mentioned. ++For example, ++ ++ (format nil "~:@C" #\Control-Partial) => "Control-\partial (Top-F)" ++ ++ This is the format used for telling the user about a key he is ++expected to type, in prompts, for instance. The precise output may ++depend not only on the implementation, but on the particular I/O devices ++in use. ++ ++ ~@C prints the character in a way that the Lisp reader can ++understand, using #\ syntax. ++ ++ ~@C binds *print-escape* to t. ++ ++ ++File: gcl.info, Node: Tilde Percent-> Newline, Next: Tilde Ampersand-> Fresh-Line, Prev: Tilde C-> Character, Up: FORMAT Basic Output ++ ++22.3.1.2 Tilde Percent: Newline ++............................... ++ ++This outputs a #\Newline character, thereby terminating the current ++output line and beginning a new one. ~n% outputs n newlines. No arg is ++used. ++ ++ ++File: gcl.info, Node: Tilde Ampersand-> Fresh-Line, Next: Tilde Vertical-Bar-> Page, Prev: Tilde Percent-> Newline, Up: FORMAT Basic Output ++ ++22.3.1.3 Tilde Ampersand: Fresh-Line ++.................................... ++ ++Unless it can be determined that the output stream is already at the ++beginning of a line, this outputs a newline. ~n& calls fresh-line and ++then outputs n- 1 newlines. ~0& does nothing. ++ ++ ++File: gcl.info, Node: Tilde Vertical-Bar-> Page, Next: Tilde Tilde-> Tilde, Prev: Tilde Ampersand-> Fresh-Line, Up: FORMAT Basic Output ++ ++22.3.1.4 Tilde Vertical-Bar: Page ++................................. ++ ++This outputs a page separator character, if possible. ~n| does this n ++times. ++ ++ ++File: gcl.info, Node: Tilde Tilde-> Tilde, Prev: Tilde Vertical-Bar-> Page, Up: FORMAT Basic Output ++ ++22.3.1.5 Tilde Tilde: Tilde ++........................... ++ ++This outputs a tilde. ~n~ outputs n tildes. ++ ++ ++File: gcl.info, Node: FORMAT Radix Control, Next: FORMAT Floating-Point Printers, Prev: FORMAT Basic Output, Up: Formatted Output ++ ++22.3.2 FORMAT Radix Control ++--------------------------- ++ ++* Menu: ++ ++* Tilde R-> Radix:: ++* Tilde D-> Decimal:: ++* Tilde B-> Binary:: ++* Tilde O-> Octal:: ++* Tilde X-> Hexadecimal:: ++ ++ ++File: gcl.info, Node: Tilde R-> Radix, Next: Tilde D-> Decimal, Prev: FORMAT Radix Control, Up: FORMAT Radix Control ++ ++22.3.2.1 Tilde R: Radix ++....................... ++ ++~nR prints arg in radix n. The modifier flags and any remaining ++parameters are used as for the ~D directive. ~D is the same as ~10R. ++The full form is ~radix,mincol,padchar,commachar,comma-intervalR. ++ ++ If no prefix parameters are given to ~R, then a different ++interpretation is given. The argument should be an integer. For ++example, if arg is 4: ++ ++* ++ ~R prints arg as a cardinal English number: four. ++ ++* ++ ~:R prints arg as an ordinal English number: fourth. ++ ++* ++ ~@R prints arg as a Roman numeral: IV. ++ ++* ++ ~:@R prints arg as an old Roman numeral: IIII. ++ ++ For example: ++ ++ (format nil "~,,' ,4:B" 13) => "1101" ++ (format nil "~,,' ,4:B" 17) => "1 0001" ++ (format nil "~19,0,' ,4:B" 3333) => "0000 1101 0000 0101" ++ (format nil "~3,,,' ,2:R" 17) => "1 22" ++ (format nil "~,,'|,2:D" #xFFFF) => "6|55|35" ++ ++ If and only if the first parameter, n, is supplied, ~R binds ++*print-escape* to false, *print-radix* to false, *print-base* to n, ++ ++ and *print-readably* to false. ++ ++ If and only if no parameters are supplied, ~R binds *print-base* to ++10. ++ ++ ++File: gcl.info, Node: Tilde D-> Decimal, Next: Tilde B-> Binary, Prev: Tilde R-> Radix, Up: FORMAT Radix Control ++ ++22.3.2.2 Tilde D: Decimal ++......................... ++ ++An arg, which should be an integer, is printed in decimal radix. ~D ++will never put a decimal point after the number. ++ ++ ~mincolD uses a column width of mincol; spaces are inserted on the ++left if the number requires fewer than mincol columns for its digits and ++sign. If the number doesn't fit in mincol columns, additional columns ++are used as needed. ++ ++ ~mincol,padcharD uses padchar as the pad character instead of space. ++ ++ If arg is not an integer, it is printed in ~A format and decimal ++base. ++ ++ The @ modifier causes the number's sign to be printed always; the ++default is to print it only if the number is negative. ++ ++ The : modifier causes commas to be printed between groups of digits; ++commachar may be used to change the character used as the comma. ++comma-interval must be an integer and defaults to 3. When the : ++modifier is given to any of these directives, the commachar is printed ++between groups of comma-interval digits. ++ ++ Thus the most general form of ~D is ++~mincol,padchar,commachar,comma-intervalD. ++ ++ ~D binds *print-escape* to false, *print-radix* to false, ++*print-base* to 10, ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde B-> Binary, Next: Tilde O-> Octal, Prev: Tilde D-> Decimal, Up: FORMAT Radix Control ++ ++22.3.2.3 Tilde B: Binary ++........................ ++ ++This is just like ~D but prints in binary radix (radix 2) instead of ++decimal. The full form is therefore ++~mincol,padchar,commachar,comma-intervalB. ++ ++ ~B binds *print-escape* to false, *print-radix* to false, ++*print-base* to 2, ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde O-> Octal, Next: Tilde X-> Hexadecimal, Prev: Tilde B-> Binary, Up: FORMAT Radix Control ++ ++22.3.2.4 Tilde O: Octal ++....................... ++ ++This is just like ~D but prints in octal radix (radix 8) instead of ++decimal. The full form is therefore ++~mincol,padchar,commachar,comma-intervalO. ++ ++ ~O binds *print-escape* to false, *print-radix* to false, ++*print-base* to 8, ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde X-> Hexadecimal, Prev: Tilde O-> Octal, Up: FORMAT Radix Control ++ ++22.3.2.5 Tilde X: Hexadecimal ++............................. ++ ++This is just like ~D but prints in hexadecimal radix (radix 16) instead ++of decimal. The full form is therefore ++~mincol,padchar,commachar,comma-intervalX. ++ ++ ~X binds *print-escape* to false, *print-radix* to false, ++*print-base* to 16, ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: FORMAT Floating-Point Printers, Next: FORMAT Printer Operations, Prev: FORMAT Radix Control, Up: Formatted Output ++ ++22.3.3 FORMAT Floating-Point Printers ++------------------------------------- ++ ++* Menu: ++ ++* Tilde F-> Fixed-Format Floating-Point:: ++* Tilde E-> Exponential Floating-Point:: ++* Tilde G-> General Floating-Point:: ++* Tilde Dollarsign-> Monetary Floating-Point:: ++ ++ ++File: gcl.info, Node: Tilde F-> Fixed-Format Floating-Point, Next: Tilde E-> Exponential Floating-Point, Prev: FORMAT Floating-Point Printers, Up: FORMAT Floating-Point Printers ++ ++22.3.3.1 Tilde F: Fixed-Format Floating-Point ++............................................. ++ ++The next arg is printed as a float. ++ ++ The full form is ~w,d,k,overflowchar,padcharF. The parameter w is ++the width of the field to be printed; d is the number of digits to print ++after the decimal point; k is a scale factor that defaults to zero. ++ ++ Exactly w characters will be output. First, leading copies of the ++character padchar (which defaults to a space) are printed, if necessary, ++to pad the field on the left. If the arg is negative, then a minus sign ++is printed; if the arg is not negative, then a plus sign is printed if ++and only if the @ modifier was supplied. Then a sequence of digits, ++containing a single embedded decimal point, is printed; this represents ++the magnitude of the value of arg times 10^k, rounded to d fractional ++digits. When rounding up and rounding down would produce printed values ++equidistant from the scaled value of arg, then the implementation is ++free to use either one. For example, printing the argument 6.375 using ++the format ~4,2F may correctly produce either 6.37 or 6.38. Leading ++zeros are not permitted, except that a single zero digit is output ++before the decimal point if the printed value is less than one, and this ++single zero digit is not output at all if w=d+1. ++ ++ If it is impossible to print the value in the required format in a ++field of width w, then one of two actions is taken. If the parameter ++overflowchar is supplied, then w copies of that parameter are printed ++instead of the scaled value of arg. If the overflowchar parameter is ++omitted, then the scaled value is printed using more than w characters, ++as many more as may be needed. ++ ++ If the w parameter is omitted, then the field is of variable width. ++In effect, a value is chosen for w in such a way that no leading pad ++characters need to be printed and exactly d characters will follow the ++decimal point. For example, the directive ~,2F will print exactly two ++digits after the decimal point and as many as necessary before the ++decimal point. ++ ++ If the parameter d is omitted, then there is no constraint on the ++number of digits to appear after the decimal point. A value is chosen ++for d in such a way that as many digits as possible may be printed ++subject to the width constraint imposed by the parameter w and the ++constraint that no trailing zero digits may appear in the fraction, ++except that if the fraction to be printed is zero, then a single zero ++digit should appear after the decimal point if permitted by the width ++constraint. ++ ++ If both w and d are omitted, then the effect is to print the value ++using ordinary free-format output; prin1 uses this format for any number ++whose magnitude is either zero or between 10^-3 (inclusive) and 10^7 ++(exclusive). ++ ++ If w is omitted, then if the magnitude of arg is so large (or, if d ++is also omitted, so small) that more than 100 digits would have to be ++printed, then an implementation is free, at its discretion, to print the ++number using exponential notation instead, as if by the directive ~E ++(with all parameters to ~E defaulted, not taking their values from the ++~F directive). ++ ++ If arg is a rational number, then it is coerced to be a single float ++and then printed. Alternatively, an implementation is permitted to ++process a rational number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow because of the ++coercion. If w and d are not supplied and the number has no exact ++decimal representation, for example 1/3, some precision cutoff must be ++chosen by the implementation since only a finite number of digits may be ++printed. ++ ++ If arg is a complex number or some non-numeric object, then it is ++printed using the format directive ~wD, thereby printing it in decimal ++radix and a minimum field width of w. ++ ++ ~F binds *print-escape* to false ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde E-> Exponential Floating-Point, Next: Tilde G-> General Floating-Point, Prev: Tilde F-> Fixed-Format Floating-Point, Up: FORMAT Floating-Point Printers ++ ++22.3.3.2 Tilde E: Exponential Floating-Point ++............................................ ++ ++The next arg is printed as a float in exponential notation. ++ ++ The full form is ~w,d,e,k,overflowchar,padchar,exponentcharE. The ++parameter w is the width of the field to be printed; d is the number of ++digits to print after the decimal point; e is the number of digits to ++use when printing the exponent; k is a scale factor that defaults to one ++(not zero). ++ ++ Exactly w characters will be output. First, leading copies of the ++character padchar (which defaults to a space) are printed, if necessary, ++to pad the field on the left. If the arg is negative, then a minus sign ++is printed; if the arg is not negative, then a plus sign is printed if ++and only if the @ modifier was supplied. Then a sequence of digits ++containing a single embedded decimal point is printed. The form of this ++sequence of digits depends on the scale factor k. If k is zero, then d ++digits are printed after the decimal point, and a single zero digit ++appears before the decimal point if the total field width will permit ++it. If k is positive, then it must be strictly less than d+2; k ++significant digits are printed before the decimal point, and d- k+1 ++digits are printed after the decimal point. If k is negative, then it ++must be strictly greater than - d; a single zero digit appears before ++the decimal point if the total field width will permit it, and after the ++decimal point are printed first - k zeros and then d+k significant ++digits. The printed fraction must be properly rounded. When rounding ++up and rounding down would produce printed values equidistant from the ++scaled value of arg, then the implementation is free to use either one. ++For example, printing the argument 637.5 using the format ~8,2E may ++correctly produce either 6.37E+2 or 6.38E+2. ++ ++ Following the digit sequence, the exponent is printed. First the ++character parameter exponentchar is printed; if this parameter is ++omitted, then the exponent marker that prin1 would use is printed, as ++determined from the type of the float and the current value of ++*read-default-float-format*. Next, either a plus sign or a minus sign ++is printed, followed by e digits representing the power of ten by which ++the printed fraction must be multiplied to properly represent the ++rounded value of arg. ++ ++ If it is impossible to print the value in the required format in a ++field of width w, possibly because k is too large or too small or ++because the exponent cannot be printed in e character positions, then ++one of two actions is taken. If the parameter overflowchar is supplied, ++then w copies of that parameter are printed instead of the scaled value ++of arg. If the overflowchar parameter is omitted, then the scaled value ++is printed using more than w characters, as many more as may be needed; ++if the problem is that d is too small for the supplied k or that e is ++too small, then a larger value is used for d or e as may be needed. ++ ++ If the w parameter is omitted, then the field is of variable width. ++In effect a value is chosen for w in such a way that no leading pad ++characters need to be printed. ++ ++ If the parameter d is omitted, then there is no constraint on the ++number of digits to appear. A value is chosen for d in such a way that ++as many digits as possible may be printed subject to the width ++constraint imposed by the parameter w, the constraint of the scale ++factor k, and the constraint that no trailing zero digits may appear in ++the fraction, except that if the fraction to be printed is zero then a ++single zero digit should appear after the decimal point. ++ ++ If the parameter e is omitted, then the exponent is printed using the ++smallest number of digits necessary to represent its value. ++ ++ If all of w, d, and e are omitted, then the effect is to print the ++value using ordinary free-format exponential-notation output; prin1 uses ++ ++ a similar ++ ++ format for any non-zero number whose magnitude is less than 10^-3 or ++greater than or equal to 10^7. ++ ++ The only difference is that the ~E directive always prints a plus or ++minus sign in front of the exponent, while prin1 omits the plus sign if ++the exponent is non-negative. ++ ++ If arg is a rational number, then it is coerced to be a single float ++and then printed. Alternatively, an implementation is permitted to ++process a rational number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow because of the ++coercion. If w and d are unsupplied and the number has no exact decimal ++representation, for example 1/3, some precision cutoff must be chosen by ++the implementation since only a finite number of digits may be printed. ++ ++ If arg is a complex number or some non-numeric object, then it is ++printed using the format directive ~wD, thereby printing it in decimal ++radix and a minimum field width of w. ++ ++ ~E binds *print-escape* to false ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde G-> General Floating-Point, Next: Tilde Dollarsign-> Monetary Floating-Point, Prev: Tilde E-> Exponential Floating-Point, Up: FORMAT Floating-Point Printers ++ ++22.3.3.3 Tilde G: General Floating-Point ++........................................ ++ ++The next arg is printed as a float in either fixed-format or exponential ++notation as appropriate. ++ ++ The full form is ~w,d,e,k,overflowchar,padchar,exponentcharG. The ++format in which to print arg depends on the magnitude (absolute value) ++of the arg. Let n be an integer such that 10^n-1 \le |arg| < 10^n. Let ++ee equal e+2, or 4 if e is omitted. Let ww equal w- ee, or nil if w is ++omitted. If d is omitted, first let q be the number of digits needed to ++print arg with no loss of information and without leading or trailing ++zeros; then let d equal (max q (min n 7)). Let dd equal d- n. ++ ++ If 0 \le dd \le d, then arg is printed as if by the format directives ++ ++ ~ww,dd,,overflowchar,padcharF~ee@T ++ ++ Note that the scale factor k is not passed to the ~F directive. For ++all other values of dd, arg is printed as if by the format directive ++ ++ ~w,d,e,k,overflowchar,padchar,exponentcharE ++ ++ In either case, an @ modifier is supplied to the ~F or ~E directive ++if and only if one was supplied to the ~G directive. ++ ++ ~G binds *print-escape* to false ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde Dollarsign-> Monetary Floating-Point, Prev: Tilde G-> General Floating-Point, Up: FORMAT Floating-Point Printers ++ ++22.3.3.4 Tilde Dollarsign: Monetary Floating-Point ++.................................................. ++ ++The next arg is printed as a float in fixed-format notation. ++ ++ The full form is ~d,n,w,padchar$. The parameter d is the number of ++digits to print after the decimal point (default value 2); n is the ++minimum number of digits to print before the decimal point (default ++value 1); w is the minimum total width of the field to be printed ++(default value 0). ++ ++ First padding and the sign are output. If the arg is negative, then ++a minus sign is printed; if the arg is not negative, then a plus sign is ++printed if and only if the @ modifier was supplied. If the : modifier ++is used, the sign appears before any padding, and otherwise after the ++padding. If w is supplied and the number of other characters to be ++output is less than w, then copies of padchar (which defaults to a ++space) are output to make the total field width equal w. Then n digits ++are printed for the integer part of arg, with leading zeros if ++necessary; then a decimal point; then d digits of fraction, properly ++rounded. ++ ++ If the magnitude of arg is so large that more than m digits would ++have to be printed, where m is the larger of w and 100, then an ++implementation is free, at its discretion, to print the number using ++exponential notation instead, as if by the directive ~w,q,,,,padcharE, ++where w and padchar are present or omitted according to whether they ++were present or omitted in the ~$ directive, and where q=d+n- 1, where d ++and n are the (possibly default) values given to the ~$ directive. ++ ++ If arg is a rational number, then it is coerced to be a single float ++and then printed. Alternatively, an implementation is permitted to ++process a rational number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow because of the ++coercion. ++ ++ If arg is a complex number or some non-numeric object, then it is ++printed using the format directive ~wD, thereby printing it in decimal ++radix and a minimum field width of w. ++ ++ ~$ binds *print-escape* to false ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: FORMAT Printer Operations, Next: FORMAT Pretty Printer Operations, Prev: FORMAT Floating-Point Printers, Up: Formatted Output ++ ++22.3.4 FORMAT Printer Operations ++-------------------------------- ++ ++* Menu: ++ ++* Tilde A-> Aesthetic:: ++* Tilde S-> Standard:: ++* Tilde W-> Write:: ++ ++ ++File: gcl.info, Node: Tilde A-> Aesthetic, Next: Tilde S-> Standard, Prev: FORMAT Printer Operations, Up: FORMAT Printer Operations ++ ++22.3.4.1 Tilde A: Aesthetic ++........................... ++ ++An arg, any object, is printed without escape characters (as by princ). ++If arg is a string, its characters will be output verbatim. If arg is ++nil it will be printed as nil; the colon modifier (~:A) will cause an ++arg of nil to be printed as (), but if arg is a composite structure, ++such as a list or vector, any contained occurrences of nil will still be ++printed as nil. ++ ++ ~mincolA inserts spaces on the right, if necessary, to make the width ++at least mincol columns. The @ modifier causes the spaces to be ++inserted on the left rather than the right. ++ ++ ~mincol,colinc,minpad,padcharA is the full form of ~A, which allows ++control of the padding. The string is padded on the right (or on the ++left if the @ modifier is used) with at least minpad copies of padchar; ++padding characters are then inserted colinc characters at a time until ++the total width is at least mincol. The defaults are 0 for mincol and ++minpad, 1 for colinc, and the space character for padchar. ++ ++ ~A binds *print-escape* to false, ++ ++ and *print-readably* to false. ++ ++ ++File: gcl.info, Node: Tilde S-> Standard, Next: Tilde W-> Write, Prev: Tilde A-> Aesthetic, Up: FORMAT Printer Operations ++ ++22.3.4.2 Tilde S: Standard ++.......................... ++ ++This is just like ~A, but arg is printed with escape characters (as by ++prin1 rather than princ). The output is therefore suitable for input to ++read. ~S accepts all the arguments and modifiers that ~A does. ++ ++ ~S binds *print-escape* to t. ++ ++ ++File: gcl.info, Node: Tilde W-> Write, Prev: Tilde S-> Standard, Up: FORMAT Printer Operations ++ ++22.3.4.3 Tilde W: Write ++....................... ++ ++An argument, any object, is printed obeying every printer control ++variable (as by write). In addition, ~W interacts correctly with depth ++abbreviation, by not resetting the depth counter to zero. ~W does not ++accept parameters. If given the colon modifier, ~W binds *print-pretty* ++to true. If given the at-sign modifier, ~W binds *print-level* and ++*print-length* to nil. ++ ++ ~W provides automatic support for the detection of circularity and ++sharing. If the value of *print-circle* is not nil and ~W is applied to ++an argument that is a circular (or shared) reference, an appropriate #n# ++marker is inserted in the output instead of printing the argument. ++ ++ ++File: gcl.info, Node: FORMAT Pretty Printer Operations, Next: FORMAT Layout Control, Prev: FORMAT Printer Operations, Up: Formatted Output ++ ++22.3.5 FORMAT Pretty Printer Operations ++--------------------------------------- ++ ++The following constructs provide access to the pretty printer: ++ ++* Menu: ++ ++* Tilde Underscore-> Conditional Newline:: ++* Tilde Less-Than-Sign-> Logical Block:: ++* Tilde I-> Indent:: ++* Tilde Slash-> Call Function:: ++ ++ ++File: gcl.info, Node: Tilde Underscore-> Conditional Newline, Next: Tilde Less-Than-Sign-> Logical Block, Prev: FORMAT Pretty Printer Operations, Up: FORMAT Pretty Printer Operations ++ ++22.3.5.1 Tilde Underscore: Conditional Newline ++.............................................. ++ ++Without any modifiers, ~_ is the same as (pprint-newline :linear). ~@_ ++is the same as (pprint-newline :miser). ~:_ is the same as ++(pprint-newline :fill). ~:@_ is the same as (pprint-newline ++:mandatory). ++ ++ ++File: gcl.info, Node: Tilde Less-Than-Sign-> Logical Block, Next: Tilde I-> Indent, Prev: Tilde Underscore-> Conditional Newline, Up: FORMAT Pretty Printer Operations ++ ++22.3.5.2 Tilde Less-Than-Sign: Logical Block ++............................................ ++ ++~<...~:> ++ ++ If ~:> is used to terminate a ~<...~>, the directive is equivalent to ++a call to pprint-logical-block. The argument corresponding to the ++~<...~:> directive is treated in the same way as the list argument to ++pprint-logical-block, thereby providing automatic support for non-list ++arguments and the detection of circularity, sharing, and depth ++abbreviation. The portion of the control-string nested within the ++~<...~:> specifies the :prefix (or :per-line-prefix), :suffix, and body ++of the pprint-logical-block. ++ ++ The control-string portion enclosed by ~<...~:> can be divided into ++segments ~ by ~; directives. If the first ++section is terminated by ~@;, it specifies a per-line prefix rather than ++a simple prefix. The prefix and suffix cannot contain format ++directives. An error is signaled if either the prefix or suffix fails ++to be a constant string or if the enclosed portion is divided into more ++than three segments. ++ ++ If the enclosed portion is divided into only two segments, the suffix ++defaults to the null string. If the enclosed portion consists of only a ++single segment, both the prefix and the suffix default to the null ++string. If the colon modifier is used (i.e., ~:<...~:>), the prefix and ++suffix default to "(" and ")" (respectively) instead of the null string. ++ ++ The body segment can be any arbitrary format string. This format ++string is applied to the elements of the list corresponding to the ++~<...~:> directive as a whole. Elements are extracted from this list ++using pprint-pop, thereby providing automatic support for malformed ++lists, and the detection of circularity, sharing, and length ++abbreviation. Within the body segment, ~^ acts like ++pprint-exit-if-list-exhausted. ++ ++ ~<...~:> supports a feature not supported by pprint-logical-block. ++If ~:@> is used to terminate the directive (i.e., ~<...~:@>), then a ++fill-style conditional newline is automatically inserted after each ++group of blanks immediately contained in the body (except for blanks ++after a ~ directive). This makes it easy to achieve the ++equivalent of paragraph filling. ++ ++ If the at-sign modifier is used with ~<...~:>, the entire remaining ++argument list is passed to the directive as its argument. All of the ++remaining arguments are always consumed by ~@<...~:>, even if they are ++not all used by the format string nested in the directive. Other than ++the difference in its argument, ~@<...~:> is exactly the same as ++~<...~:> except that circularity detection is not applied if ~@<...~:> ++is encountered at top level in a format string. This ensures that ++circularity detection is applied only to data lists, not to format ++argument lists. ++ ++ " . #n#" is printed if circularity or sharing has to be indicated for ++its argument as a whole. ++ ++ To a considerable extent, the basic form of the directive ~<...~> is ++incompatible with the dynamic control of the arrangement of output by ++~W, ~_, ~<...~:>, ~I, and ~:T. As a result, an error is signaled if any ++of these directives is nested within ~<...~>. Beyond this, an error is ++also signaled if the ~<...~:;...~> form of ~<...~> is used in the same ++format string with ~W, ~_, ~<...~:>, ~I, or ~:T. ++ ++ See also *note Tilde Less-Than-Sign-> Justification::. ++ ++ ++File: gcl.info, Node: Tilde I-> Indent, Next: Tilde Slash-> Call Function, Prev: Tilde Less-Than-Sign-> Logical Block, Up: FORMAT Pretty Printer Operations ++ ++22.3.5.3 Tilde I: Indent ++........................ ++ ++~nI is the same as (pprint-indent :block n). ++ ++ ~n:I is the same as (pprint-indent :current n). In both cases, n ++defaults to zero, if it is omitted. ++ ++ ++File: gcl.info, Node: Tilde Slash-> Call Function, Prev: Tilde I-> Indent, Up: FORMAT Pretty Printer Operations ++ ++22.3.5.4 Tilde Slash: Call Function ++................................... ++ ++~/name/ ++ ++ User defined functions can be called from within a format string by ++using the directive ~/name/. The colon modifier, the at-sign modifier, ++and arbitrarily many parameters can be specified with the ~/name/ ++directive. name can be any arbitrary string that does not contain a ++"/". All of the characters in name are treated as if they were upper ++case. If name contains a single colon (:) or double colon (::), then ++everything up to but not including the first ":" or "::" is taken to be ++a string that names a package. Everything after the first ":" or "::" ++(if any) is taken to be a string that names a symbol. The function ++corresponding to a ~/name/ directive is obtained by looking up the ++symbol that has the indicated name in the indicated package. If name ++does not contain a ":" or "::", then the whole name string is looked up ++in the COMMON-LISP-USER package. ++ ++ When a ~/name/ directive is encountered, the indicated function is ++called with four or more arguments. The first four arguments are: the ++output stream, the format argument corresponding to the directive, a ++generalized boolean that is true if the colon modifier was used, and a ++generalized boolean that is true if the at-sign modifier was used. The ++remaining arguments consist of any parameters specified with the ++directive. The function should print the argument appropriately. Any ++values returned by the function are ignored. ++ ++ The three functions pprint-linear, pprint-fill, and pprint-tabular ++are specifically designed so that they can be called by ~/.../ (i.e., ++~/pprint-linear/, ~/pprint-fill/, and ~/pprint-tabular/). In particular ++they take colon and at-sign arguments. ++ ++ ++File: gcl.info, Node: FORMAT Layout Control, Next: FORMAT Control-Flow Operations, Prev: FORMAT Pretty Printer Operations, Up: Formatted Output ++ ++22.3.6 FORMAT Layout Control ++---------------------------- ++ ++* Menu: ++ ++* Tilde T-> Tabulate:: ++* Tilde Less-Than-Sign-> Justification:: ++* Tilde Greater-Than-Sign-> End of Justification:: ++ ++ ++File: gcl.info, Node: Tilde T-> Tabulate, Next: Tilde Less-Than-Sign-> Justification, Prev: FORMAT Layout Control, Up: FORMAT Layout Control ++ ++22.3.6.1 Tilde T: Tabulate ++.......................... ++ ++This spaces over to a given column. ~colnum,colincT will output ++sufficient spaces to move the cursor to column colnum. If the cursor is ++already at or beyond column colnum, it will output spaces to move it to ++column colnum+k*colinc for the smallest positive integer k possible, ++unless colinc is zero, in which case no spaces are output if the cursor ++is already at or beyond column colnum. colnum and colinc default to 1. ++ ++ If for some reason the current absolute column position cannot be ++determined by direct inquiry, format may be able to deduce the current ++column position by noting that certain directives (such as ~%, or ~&, or ++~A with the argument being a string containing a newline) cause the ++column position to be reset to zero, and counting the number of ++characters emitted since that point. If that fails, format may attempt ++a similar deduction on the riskier assumption that the destination was ++at column zero when format was invoked. If even this heuristic fails or ++is implementationally inconvenient, at worst the ~T operation will ++simply output two spaces. ++ ++ ~@T performs relative tabulation. ~colrel,colinc@T outputs colrel ++spaces and then outputs the smallest non-negative number of additional ++spaces necessary to move the cursor to a column that is a multiple of ++colinc. For example, the directive ~3,8@T outputs three spaces and then ++moves the cursor to a "standard multiple-of-eight tab stop" if not at ++one already. If the current output column cannot be determined, ++however, then colinc is ignored, and exactly colrel spaces are output. ++ ++ If the colon modifier is used with the ~T directive, the tabbing ++computation is done relative to the horizontal position where the ++section immediately containing the directive begins, rather than with ++respect to a horizontal position of zero. The numerical parameters are ++both interpreted as being in units of ems and both default to 1. ~n,m:T ++is the same as (pprint-tab :section n m). ~n,m:@T is the same as ++(pprint-tab :section-relative n m). ++ ++ ++File: gcl.info, Node: Tilde Less-Than-Sign-> Justification, Next: Tilde Greater-Than-Sign-> End of Justification, Prev: Tilde T-> Tabulate, Up: FORMAT Layout Control ++ ++22.3.6.2 Tilde Less-Than-Sign: Justification ++............................................ ++ ++~mincol,colinc,minpad,padchar ++ ++ This justifies the text produced by processing str within a field at ++least mincol columns wide. str may be divided up into segments with ~;, ++in which case the spacing is evenly divided between the text segments. ++ ++ With no modifiers, the leftmost text segment is left justified in the ++field, and the rightmost text segment is right justified. If there is ++only one text element, as a special case, it is right justified. The : ++modifier causes spacing to be introduced before the first text segment; ++the @ modifier causes spacing to be added after the last. The minpad ++parameter (default 0) is the minimum number of padding characters to be ++output between each segment. The padding character is supplied by ++padchar, which defaults to the space character. If the total width ++needed to satisfy these constraints is greater than mincol, then the ++width used is mincol+k*colinc for the smallest possible non-negative ++integer value k. colinc defaults to 1, and mincol defaults to 0. ++ ++ Note that str may include format directives. All the clauses in str ++are processed in order; it is the resulting pieces of text that are ++justified. ++ ++ The ~^ directive may be used to terminate processing of the clauses ++prematurely, in which case only the completely processed clauses are ++justified. ++ ++ If the first clause of a ~< is terminated with ~:; instead of ~;, ++then it is used in a special way. All of the clauses are processed ++(subject to ~^ , of course), but the first one is not used in performing ++the spacing and padding. When the padded result has been determined, ++then if it will fit on the current line of output, it is output, and the ++text for the first clause is discarded. If, however, the padded text ++will not fit on the current line, then the text segment for the first ++clause is output before the padded text. The first clause ought to ++contain a newline (such as a ~% directive). The first clause is always ++processed, and so any arguments it refers to will be used; the decision ++is whether to use the resulting segment of text, not whether to process ++the first clause. If the ~:; has a prefix parameter n, then the padded ++text must fit on the current line with n character positions to spare to ++avoid outputting the first clause's text. For example, the control ++string ++ ++ "~ ++ ++ can be used to print a list of items separated by commas without ++breaking items over line boundaries, beginning each line with ;; . The ++prefix parameter 1 in ~1:; accounts for the width of the comma that will ++follow the justified item if it is not the last element in the list, or ++the period if it is. If ~:; has a second prefix parameter, then it is ++used as the width of the line, thus overriding the natural line width of ++the output stream. To make the preceding example use a line width of ++50, one would write ++ ++ "~ ++ ++ If the second argument is not supplied, then format uses the line ++width of the destination output stream. If this cannot be determined ++(for example, when producing a string result), then format uses 72 as ++the line length. ++ ++ See also *note Tilde Less-Than-Sign-> Logical Block::. ++ ++ ++File: gcl.info, Node: Tilde Greater-Than-Sign-> End of Justification, Prev: Tilde Less-Than-Sign-> Justification, Up: FORMAT Layout Control ++ ++22.3.6.3 Tilde Greater-Than-Sign: End of Justification ++...................................................... ++ ++~> terminates a ~<. The consequences of using it elsewhere are ++undefined. ++ ++ ++File: gcl.info, Node: FORMAT Control-Flow Operations, Next: FORMAT Miscellaneous Operations, Prev: FORMAT Layout Control, Up: Formatted Output ++ ++22.3.7 FORMAT Control-Flow Operations ++------------------------------------- ++ ++* Menu: ++ ++* Tilde Asterisk-> Go-To:: ++* Tilde Left-Bracket-> Conditional Expression:: ++* Tilde Right-Bracket-> End of Conditional Expression:: ++* Tilde Left-Brace-> Iteration:: ++* Tilde Right-Brace-> End of Iteration:: ++* Tilde Question-Mark-> Recursive Processing:: ++ ++ ++File: gcl.info, Node: Tilde Asterisk-> Go-To, Next: Tilde Left-Bracket-> Conditional Expression, Prev: FORMAT Control-Flow Operations, Up: FORMAT Control-Flow Operations ++ ++22.3.7.1 Tilde Asterisk: Go-To ++.............................. ++ ++The next arg is ignored. ~n* ignores the next n arguments. ++ ++ ~:* backs up in the list of arguments so that the argument last ++processed will be processed again. ~n:* backs up n arguments. ++ ++ When within a ~{ construct (see below), the ignoring (in either ++direction) is relative to the list of arguments being processed by the ++iteration. ++ ++ ~n@* goes to the nth arg, where 0 means the first one; n defaults to ++0, so ~@* goes back to the first arg. Directives after a ~n@* will take ++arguments in sequence beginning with the one gone to. When within a ~{ ++construct, the "goto" is relative to the list of arguments being ++processed by the iteration. ++ ++ ++File: gcl.info, Node: Tilde Left-Bracket-> Conditional Expression, Next: Tilde Right-Bracket-> End of Conditional Expression, Prev: Tilde Asterisk-> Go-To, Up: FORMAT Control-Flow Operations ++ ++22.3.7.2 Tilde Left-Bracket: Conditional Expression ++................................................... ++ ++~[str0~;str1~;...~;strn~] ++ ++ This is a set of control strings, called clauses, one of which is ++chosen and used. The clauses are separated by ~; and the construct is ++terminated by ~]. For example, ++ ++ "~[Siamese~;Manx~;Persian~] Cat" ++ ++ The argth clause is selected, where the first clause is number 0. If ++a prefix parameter is given (as ~n[), then the parameter is used instead ++of an argument. If arg is out of range then no clause is selected and ++no error is signaled. After the selected alternative has been ++processed, the control string continues after the ~]. ++ ++ ~[str0~;str1~;...~;strn~:;default~] has a default case. If the last ++~; used to separate clauses is ~:; instead, then the last clause is an ++else clause that is performed if no other clause is selected. For ++example: ++ ++ "~[Siamese~;Manx~;Persian~:;Alley~] Cat" ++ ++ ~:[alternative~;consequent~] selects the alternative control string ++if arg is false, and selects the consequent control string otherwise. ++ ++ ~@[consequent~] tests the argument. If it is true, then the argument ++is not used up by the ~[ command but remains as the next one to be ++processed, and the one clause consequent is processed. If the arg is ++false, then the argument is used up, and the clause is not processed. ++The clause therefore should normally use exactly one argument, and may ++expect it to be non-nil. For example: ++ ++ (setq *print-level* nil *print-length* 5) ++ (format nil ++ "~@[ print level = ~D~]~@[ print length = ~D~]" ++ *print-level* *print-length*) ++ => " print length = 5" ++ ++ Note also that ++ ++ (format stream "...~@[str~]..." ...) ++ == (format stream "...~:[~;~:*str~]..." ...) ++ ++ The combination of ~[ and # is useful, for example, for dealing with ++English conventions for printing lists: ++ ++ (setq foo "Items:~#[ none~; ~S~; ~S and ~S~ ++ ~:;~@{~#[~; and~] ~S~^ ,~}~].") ++ (format nil foo) => "Items: none." ++ (format nil foo 'foo) => "Items: FOO." ++ (format nil foo 'foo 'bar) => "Items: FOO and BAR." ++ (format nil foo 'foo 'bar 'baz) => "Items: FOO, BAR, and BAZ." ++ (format nil foo 'foo 'bar 'baz 'quux) => "Items: FOO, BAR, BAZ, and QUUX." ++ ++ ++File: gcl.info, Node: Tilde Right-Bracket-> End of Conditional Expression, Next: Tilde Left-Brace-> Iteration, Prev: Tilde Left-Bracket-> Conditional Expression, Up: FORMAT Control-Flow Operations ++ ++22.3.7.3 Tilde Right-Bracket: End of Conditional Expression ++........................................................... ++ ++~] terminates a ~[. The consequences of using it elsewhere are ++undefined. ++ ++ ++File: gcl.info, Node: Tilde Left-Brace-> Iteration, Next: Tilde Right-Brace-> End of Iteration, Prev: Tilde Right-Bracket-> End of Conditional Expression, Up: FORMAT Control-Flow Operations ++ ++22.3.7.4 Tilde Left-Brace: Iteration ++.................................... ++ ++~{str~} ++ ++ This is an iteration construct. The argument should be a list, which ++is used as a set of arguments as if for a recursive call to format. The ++string str is used repeatedly as the control string. Each iteration can ++absorb as many elements of the list as it likes as arguments; if str ++uses up two arguments by itself, then two elements of the list will get ++used up each time around the loop. If before any iteration step the ++list is empty, then the iteration is terminated. Also, if a prefix ++parameter n is given, then there will be at most n repetitions of ++processing of str. Finally, the ~^ directive can be used to terminate ++the iteration prematurely. ++ ++ For example: ++ ++ (format nil "The winners are:~{ ~S~}." ++ '(fred harry jill)) ++ => "The winners are: FRED HARRY JILL." ++ (format nil "Pairs:~{ <~S,~S>~}." ++ '(a 1 b 2 c 3)) ++ => "Pairs: ." ++ ++ ~:{ str~} is similar, but the argument should be a list of sublists. ++At each repetition step, one sublist is used as the set of arguments for ++processing str; on the next repetition, a new sublist is used, whether ++or not all of the last sublist had been processed. For example: ++ ++ (format nil "Pairs:~:{ <~S,~S>~} ." ++ '((a 1) (b 2) (c 3))) ++ => "Pairs: ." ++ ++ ~@{ str~} is similar to ~{ str~} , but instead of using one argument ++that is a list, all the remaining arguments are used as the list of ++arguments for the iteration. Example: ++ ++ (format nil "Pairs:~@{ <~S,~S>~} ." 'a 1 'b 2 'c 3) ++ => "Pairs: ." ++ ++ If the iteration is terminated before all the remaining arguments are ++consumed, then any arguments not processed by the iteration remain to be ++processed by any directives following the iteration construct. ++ ++ ~:@{ str~} combines the features of ~:{ str~} and ~@{ str~} . All ++the remaining arguments are used, and each one must be a list. On each ++iteration, the next argument is used as a list of arguments to str. ++Example: ++ ++ (format nil "Pairs:~:@{ <~S,~S>~} ." ++ '(a 1) '(b 2) '(c 3)) ++ => "Pairs: ." ++ ++ Terminating the repetition construct with ~:} instead of ~} forces ++str to be processed at least once, even if the initial list of arguments ++is null. However, this will not override an explicit prefix parameter ++of zero. ++ ++ If str is empty, then an argument is used as str. It must be a ++format control and precede any arguments processed by the iteration. As ++an example, the following are equivalent: ++ ++ (apply #'format stream string arguments) ++ == (format stream "~1{~:}" string arguments) ++ ++ This will use string as a formatting string. The ~1{ says it will be ++processed at most once, and the ~:} says it will be processed at least ++once. Therefore it is processed exactly once, using arguments as the ++arguments. This case may be handled more clearly by the ~? directive, ++but this general feature of ~{ is more powerful than ~?. ++ ++ ++File: gcl.info, Node: Tilde Right-Brace-> End of Iteration, Next: Tilde Question-Mark-> Recursive Processing, Prev: Tilde Left-Brace-> Iteration, Up: FORMAT Control-Flow Operations ++ ++22.3.7.5 Tilde Right-Brace: End of Iteration ++............................................ ++ ++~} terminates a ~{. The consequences of using it elsewhere are ++undefined. ++ ++ ++File: gcl.info, Node: Tilde Question-Mark-> Recursive Processing, Prev: Tilde Right-Brace-> End of Iteration, Up: FORMAT Control-Flow Operations ++ ++22.3.7.6 Tilde Question-Mark: Recursive Processing ++.................................................. ++ ++The next arg must be a format control, and the one after it a list; both ++are consumed by the ~? directive. The two are processed as a ++control-string, with the elements of the list as the arguments. Once ++the recursive processing has been finished, the processing of the ++control string containing the ~? directive is resumed. Example: ++ ++ (format nil "~? ~D" "<~A ~D>" '("Foo" 5) 7) => " 7" ++ (format nil "~? ~D" "<~A ~D>" '("Foo" 5 14) 7) => " 7" ++ ++ Note that in the second example three arguments are supplied to the ++format string "<~A ~D>", but only two are processed and the third is ++therefore ignored. ++ ++ With the @ modifier, only one arg is directly consumed. The arg must ++be a string; it is processed as part of the control string as if it had ++appeared in place of the ~@? construct, and any directives in the ++recursively processed control string may consume arguments of the ++control string containing the ~@? directive. Example: ++ ++ (format nil "~@? ~D" "<~A ~D>" "Foo" 5 7) => " 7" ++ (format nil "~@? ~D" "<~A ~D>" "Foo" 5 14 7) => " 14" ++ ++ ++File: gcl.info, Node: FORMAT Miscellaneous Operations, Next: FORMAT Miscellaneous Pseudo-Operations, Prev: FORMAT Control-Flow Operations, Up: Formatted Output ++ ++22.3.8 FORMAT Miscellaneous Operations ++-------------------------------------- ++ ++* Menu: ++ ++* Tilde Left-Paren-> Case Conversion:: ++* Tilde Right-Paren-> End of Case Conversion:: ++* Tilde P-> Plural:: ++ ++ ++File: gcl.info, Node: Tilde Left-Paren-> Case Conversion, Next: Tilde Right-Paren-> End of Case Conversion, Prev: FORMAT Miscellaneous Operations, Up: FORMAT Miscellaneous Operations ++ ++22.3.8.1 Tilde Left-Paren: Case Conversion ++.......................................... ++ ++~(str~) ++ ++ The contained control string str is processed, and what it produces ++is subject to case conversion. ++ ++ With no flags, every uppercase character is converted to the ++corresponding lowercase character. ++ ++ ~:( capitalizes all words, as if by string-capitalize. ++ ++ ~@( capitalizes just the first word and forces the rest to lower ++case. ++ ++ ~:@( converts every lowercase character to the corresponding ++uppercase character. ++ ++ In this example ~@( is used to cause the first word produced by ~@R ++to be capitalized: ++ ++ (format nil "~@R ~(~@R~)" 14 14) ++ => "XIV xiv" ++ (defun f (n) (format nil "~@(~R~) error~:P detected." n)) => F ++ (f 0) => "Zero errors detected." ++ (f 1) => "One error detected." ++ (f 23) => "Twenty-three errors detected." ++ ++ When case conversions appear nested, the outer conversion dominates, ++as illustrated in the following example: ++ ++ (format nil "~@(how is ~:(BOB SMITH~)?~)") ++ => "How is bob smith?" ++ NOT=> "How is Bob Smith?" ++ ++ ++File: gcl.info, Node: Tilde Right-Paren-> End of Case Conversion, Next: Tilde P-> Plural, Prev: Tilde Left-Paren-> Case Conversion, Up: FORMAT Miscellaneous Operations ++ ++22.3.8.2 Tilde Right-Paren: End of Case Conversion ++.................................................. ++ ++~) terminates a ~(. The consequences of using it elsewhere are ++undefined. ++ ++ ++File: gcl.info, Node: Tilde P-> Plural, Prev: Tilde Right-Paren-> End of Case Conversion, Up: FORMAT Miscellaneous Operations ++ ++22.3.8.3 Tilde P: Plural ++........................ ++ ++If arg is not eql to the integer 1, a lowercase s is printed; if arg is ++eql to 1, nothing is printed. If arg is a floating-point 1.0, the s is ++printed. ++ ++ ~:P does the same thing, after doing a ~:* to back up one argument; ++that is, it prints a lowercase s if the previous argument was not 1. ++ ++ ~@P prints y if the argument is 1, or ies if it is not. ~:@P does ++the same thing, but backs up first. ++ ++ (format nil "~D tr~:@P/~D win~:P" 7 1) => "7 tries/1 win" ++ (format nil "~D tr~:@P/~D win~:P" 1 0) => "1 try/0 wins" ++ (format nil "~D tr~:@P/~D win~:P" 1 3) => "1 try/3 wins" ++ ++ ++File: gcl.info, Node: FORMAT Miscellaneous Pseudo-Operations, Next: Additional Information about FORMAT Operations, Prev: FORMAT Miscellaneous Operations, Up: Formatted Output ++ ++22.3.9 FORMAT Miscellaneous Pseudo-Operations ++--------------------------------------------- ++ ++* Menu: ++ ++* Tilde Semicolon-> Clause Separator:: ++* Tilde Circumflex-> Escape Upward:: ++* Tilde Newline-> Ignored Newline:: ++ ++ ++File: gcl.info, Node: Tilde Semicolon-> Clause Separator, Next: Tilde Circumflex-> Escape Upward, Prev: FORMAT Miscellaneous Pseudo-Operations, Up: FORMAT Miscellaneous Pseudo-Operations ++ ++22.3.9.1 Tilde Semicolon: Clause Separator ++.......................................... ++ ++This separates clauses in ~[ and ~< constructs. The consequences of ++using it elsewhere are undefined. ++ ++ ++File: gcl.info, Node: Tilde Circumflex-> Escape Upward, Next: Tilde Newline-> Ignored Newline, Prev: Tilde Semicolon-> Clause Separator, Up: FORMAT Miscellaneous Pseudo-Operations ++ ++22.3.9.2 Tilde Circumflex: Escape Upward ++........................................ ++ ++~^ ++ ++ This is an escape construct. If there are no more arguments ++remaining to be processed, then the immediately enclosing ~{ or ~< ++construct is terminated. If there is no such enclosing construct, then ++the entire formatting operation is terminated. In the ~< case, the ++formatting is performed, but no more segments are processed before doing ++the justification. ~^ may appear anywhere in a ~{ construct. ++ ++ (setq donestr "Done.~^ ~D warning~:P.~^ ~D error~:P.") ++ => "Done.~^ ~D warning~:P.~^ ~D error~:P." ++ (format nil donestr) => "Done." ++ (format nil donestr 3) => "Done. 3 warnings." ++ (format nil donestr 1 5) => "Done. 1 warning. 5 errors." ++ ++ If a prefix parameter is given, then termination occurs if the ++parameter is zero. (Hence ~^ is equivalent to ~#^.) If two parameters ++are given, termination occurs if they are equal. ++ ++ [Reviewer Note by Barmar: Which equality predicate?] If three ++parameters are given, termination occurs if the first is less than or ++equal to the second and the second is less than or equal to the third. ++Of course, this is useless if all the prefix parameters are constants; ++at least one of them should be a # or a V parameter. ++ ++ If ~^ is used within a ~:{ construct, then it terminates the current ++iteration step because in the standard case it tests for remaining ++arguments of the current step only; the next iteration step commences ++immediately. ~:^ is used to terminate the iteration process. ++ ++ ~:^ may be used only if the command it would terminate is ~:{ or ~:@{ ++. The entire iteration process is terminated if and only if the sublist ++that is supplying the arguments for the current iteration step is the ++last sublist in the case of ~:{ , or the last format argument in the ++case of ~:@{ . ~:^ is not equivalent to ~#:^; the latter terminates the ++entire iteration if and only if no arguments remain for the current ++iteration step. For example: ++ ++ (format nil "~:{ ~@?~:^ ...~} " '(("a") ("b"))) => "a...b" ++ ++ If ~^ appears within a control string being processed under the ++control of a ~? directive, but not within any ~{ or ~< construct within ++that string, then the string being processed will be terminated, thereby ++ending processing of the ~? directive. Processing then continues within ++the string containing the ~? directive at the point following that ++directive. ++ ++ If ~^ appears within a ~[ or ~( construct, then all the commands up ++to the ~^ are properly selected or case-converted, the ~[ or ~( ++processing is terminated, and the outward search continues for a ~{ or ++~< construct to be terminated. For example: ++ ++ (setq tellstr "~@(~@[~R~]~^ ~A!~)") ++ => "~@(~@[~R~]~^ ~A!~)" ++ (format nil tellstr 23) => "Twenty-three!" ++ (format nil tellstr nil "losers") => " Losers!" ++ (format nil tellstr 23 "losers") => "Twenty-three losers!" ++ ++ Following are examples of the use of ~^ within a ~< construct. ++ ++ (format nil "~15<~S~;~^~S~;~^~S~>" 'foo) ++ => " FOO" ++ (format nil "~15<~S~;~^~S~;~^~S~>" 'foo 'bar) ++ => "FOO BAR" ++ (format nil "~15<~S~;~^~S~;~^~S~>" 'foo 'bar 'baz) ++ => "FOO BAR BAZ" ++ ++ ++File: gcl.info, Node: Tilde Newline-> Ignored Newline, Prev: Tilde Circumflex-> Escape Upward, Up: FORMAT Miscellaneous Pseudo-Operations ++ ++22.3.9.3 Tilde Newline: Ignored Newline ++....................................... ++ ++Tilde immediately followed by a newline ignores the newline and any ++following non-newline whitespace_1 characters. With a :, the newline is ++ignored, but any following whitespace_1 is left in place. With an @, ++the newline is left in place, but any following whitespace_1 is ignored. ++For example: ++ ++ (defun type-clash-error (fn nargs argnum right-type wrong-type) ++ (format *error-output* ++ "~&~S requires its ~:[~:R~;~*~]~ ++ argument to be of type ~S,~ ++ with an argument of type ~S.~ ++ fn (eql nargs 1) argnum right-type wrong-type)) ++ (type-clash-error 'aref nil 2 'integer 'vector) prints: ++ AREF requires its second argument to be of type INTEGER, ++ but it was called with an argument of type VECTOR. ++ NIL ++ (type-clash-error 'car 1 1 'list 'short-float) prints: ++ CAR requires its argument to be of type LIST, ++ but it was called with an argument of type SHORT-FLOAT. ++ NIL ++ ++ Note that in this example newlines appear in the output only as ++specified by the ~& and ~% directives; the actual newline characters in ++the control string are suppressed because each is preceded by a tilde. ++ ++ ++File: gcl.info, Node: Additional Information about FORMAT Operations, Next: Examples of FORMAT, Prev: FORMAT Miscellaneous Pseudo-Operations, Up: Formatted Output ++ ++22.3.10 Additional Information about FORMAT Operations ++------------------------------------------------------ ++ ++* Menu: ++ ++* Nesting of FORMAT Operations:: ++* Missing and Additional FORMAT Arguments:: ++* Additional FORMAT Parameters:: ++* Undefined FORMAT Modifier Combinations:: ++ ++ ++File: gcl.info, Node: Nesting of FORMAT Operations, Next: Missing and Additional FORMAT Arguments, Prev: Additional Information about FORMAT Operations, Up: Additional Information about FORMAT Operations ++ ++22.3.10.1 Nesting of FORMAT Operations ++...................................... ++ ++The case-conversion, conditional, iteration, and justification ++constructs can contain other formatting constructs by bracketing them. ++These constructs must nest properly with respect to each other. For ++example, it is not legitimate to put the start of a case-conversion ++construct in each arm of a conditional and the end of the ++case-conversion construct outside the conditional: ++ ++ (format nil "~:[abc~:@(def~;ghi~ ++ :@(jkl~]mno~)" x) ;Invalid! ++ ++ This notation is invalid because the ~[...~;...~] and ~(...~) ++constructs are not properly nested. ++ ++ The processing indirection caused by the ~? directive is also a kind ++of nesting for the purposes of this rule of proper nesting. It is not ++permitted to start a bracketing construct within a string processed ++under control of a ~? directive and end the construct at some point ++after the ~? construct in the string containing that construct, or vice ++versa. For example, this situation is invalid: ++ ++ (format nil "~@?ghi~)" "abc~@(def") ;Invalid! ++ ++ This notation is invalid because the ~? and ~(...~) constructs are ++not properly nested. ++ ++ ++File: gcl.info, Node: Missing and Additional FORMAT Arguments, Next: Additional FORMAT Parameters, Prev: Nesting of FORMAT Operations, Up: Additional Information about FORMAT Operations ++ ++22.3.10.2 Missing and Additional FORMAT Arguments ++................................................. ++ ++The consequences are undefined if no arg remains for a directive ++requiring an argument. However, it is permissible for one or more args ++to remain unprocessed by a directive; such args are ignored. ++ ++ ++File: gcl.info, Node: Additional FORMAT Parameters, Next: Undefined FORMAT Modifier Combinations, Prev: Missing and Additional FORMAT Arguments, Up: Additional Information about FORMAT Operations ++ ++22.3.10.3 Additional FORMAT Parameters ++...................................... ++ ++The consequences are undefined if a format directive is given more ++parameters than it is described here as accepting. ++ ++ ++File: gcl.info, Node: Undefined FORMAT Modifier Combinations, Prev: Additional FORMAT Parameters, Up: Additional Information about FORMAT Operations ++ ++22.3.10.4 Undefined FORMAT Modifier Combinations ++................................................ ++ ++The consequences are undefined if colon or at-sign modifiers are given ++to a directive in a combination not specifically described here as being ++meaningful. ++ ++ ++File: gcl.info, Node: Examples of FORMAT, Next: Notes about FORMAT, Prev: Additional Information about FORMAT Operations, Up: Formatted Output ++ ++22.3.11 Examples of FORMAT ++-------------------------- ++ ++ (format nil "foo") => "foo" ++ (setq x 5) => 5 ++ (format nil "The answer is ~D." x) => "The answer is 5." ++ (format nil "The answer is ~3D." x) => "The answer is 5." ++ (format nil "The answer is ~3,'0D." x) => "The answer is 005." ++ (format nil "The answer is ~:D." (expt 47 x)) ++ => "The answer is 229,345,007." ++ (setq y "elephant") => "elephant" ++ (format nil "Look at the ~A!" y) => "Look at the elephant!" ++ (setq n 3) => 3 ++ (format nil "~D item~:P found." n) => "3 items found." ++ (format nil "~R dog~:[s are~; is~] here." n (= n 1)) ++ => "three dogs are here." ++ (format nil "~R dog~:*~[s are~; is~:;s are~] here." n) ++ => "three dogs are here." ++ (format nil "Here ~[are~;is~:;are~] ~:*~R pupp~:@P." n) ++ => "Here are three puppies." ++ ++ (defun foo (x) ++ (format nil "~6,2F|~6,2,1,'*F|~6,2,,'?F|~6F|~,2F|~F" ++ x x x x x x)) => FOO ++ (foo 3.14159) => " 3.14| 31.42| 3.14|3.1416|3.14|3.14159" ++ (foo -3.14159) => " -3.14|-31.42| -3.14|-3.142|-3.14|-3.14159" ++ (foo 100.0) => "100.00|******|100.00| 100.0|100.00|100.0" ++ (foo 1234.0) => "1234.00|******|??????|1234.0|1234.00|1234.0" ++ (foo 0.006) => " 0.01| 0.06| 0.01| 0.006|0.01|0.006" ++ ++ (defun foo (x) ++ (format nil ++ "~9,2,1,,'*E|~10,3,2,2,'?,,'$E|~ ++ ~9,3,2,-2,' ++ x x x x)) ++ (foo 3.14159) => " 3.14E+0| 31.42$-01|+.003E+03| 3.14E+0" ++ (foo -3.14159) => " -3.14E+0|-31.42$-01|-.003E+03| -3.14E+0" ++ (foo 1100.0) => " 1.10E+3| 11.00$+02|+.001E+06| 1.10E+3" ++ (foo 1100.0L0) => " 1.10L+3| 11.00$+02|+.001L+06| 1.10L+3" ++ (foo 1.1E13) => "*********| 11.00$+12|+.001E+16| 1.10E+13" ++ (foo 1.1L120) => "*********|??????????| ++ (foo 1.1L1200) => "*********|??????????| ++ ++ As an example of the effects of varying the scale factor, the code ++ ++ (dotimes (k 13) ++ (format t "~ ++ (- k 5) (- k 5) 3.14159)) ++ ++ produces the following output: ++ ++ Scale factor -5: | 0.000003E+06| ++ Scale factor -4: | 0.000031E+05| ++ Scale factor -3: | 0.000314E+04| ++ Scale factor -2: | 0.003142E+03| ++ Scale factor -1: | 0.031416E+02| ++ Scale factor 0: | 0.314159E+01| ++ Scale factor 1: | 3.141590E+00| ++ Scale factor 2: | 31.41590E-01| ++ Scale factor 3: | 314.1590E-02| ++ Scale factor 4: | 3141.590E-03| ++ Scale factor 5: | 31415.90E-04| ++ Scale factor 6: | 314159.0E-05| ++ Scale factor 7: | 3141590.E-06| ++ ++ (defun foo (x) ++ (format nil "~9,2,1,,'*G|~9,3,2,3,'?,,'$G|~9,3,2,0,' ++ x x x x)) ++ (foo 0.0314159) => " 3.14E-2|314.2$-04|0.314E-01| 3.14E-2" ++ (foo 0.314159) => " 0.31 |0.314 |0.314 | 0.31 " ++ (foo 3.14159) => " 3.1 | 3.14 | 3.14 | 3.1 " ++ (foo 31.4159) => " 31. | 31.4 | 31.4 | 31. " ++ (foo 314.159) => " 3.14E+2| 314. | 314. | 3.14E+2" ++ (foo 3141.59) => " 3.14E+3|314.2$+01|0.314E+04| 3.14E+3" ++ (foo 3141.59L0) => " 3.14L+3|314.2$+01|0.314L+04| 3.14L+3" ++ (foo 3.14E12) => "*********|314.0$+10|0.314E+13| 3.14E+12" ++ (foo 3.14L120) => "*********|?????????| ++ (foo 3.14L1200) => "*********|?????????| ++ ++ (format nil "~10") => "foo bar" ++ (format nil "~10:") => " foo bar" ++ (format nil "~10") => " foobar" ++ (format nil "~10:") => " foobar" ++ (format nil "~10:@") => " foo bar " ++ (format nil "~10@") => "foobar " ++ (format nil "~10:@") => " foobar " ++ ++ (FORMAT NIL "Written to ~A." #P"foo.bin") ++ => "Written to foo.bin." ++ ++ ++File: gcl.info, Node: Notes about FORMAT, Prev: Examples of FORMAT, Up: Formatted Output ++ ++22.3.12 Notes about FORMAT ++-------------------------- ++ ++Formatted output is performed not only by format, but by certain other ++functions that accept a format control the way format does. For ++example, error-signaling functions such as cerror accept format ++controls. ++ ++ Note that the meaning of nil and t as destinations to format are ++different than those of nil and t as stream designators. ++ ++ The ~^ should appear only at the beginning of a ~< clause, because it ++aborts the entire clause in which it appears (as well as all following ++clauses). ++ ++ ++File: gcl.info, Node: Printer Dictionary, Prev: Formatted Output, Up: Printer ++ ++22.4 Printer Dictionary ++======================= ++ ++* Menu: ++ ++* copy-pprint-dispatch:: ++* formatter:: ++* pprint-dispatch:: ++* pprint-exit-if-list-exhausted:: ++* pprint-fill:: ++* pprint-indent:: ++* pprint-logical-block:: ++* pprint-newline:: ++* pprint-pop:: ++* pprint-tab:: ++* print-object:: ++* print-unreadable-object:: ++* set-pprint-dispatch:: ++* write:: ++* write-to-string:: ++* *print-array*:: ++* *print-base*:: ++* *print-case*:: ++* *print-circle*:: ++* *print-escape*:: ++* *print-gensym*:: ++* *print-level*:: ++* *print-lines*:: ++* *print-miser-width*:: ++* *print-pprint-dispatch*:: ++* *print-pretty*:: ++* *print-readably*:: ++* *print-right-margin*:: ++* print-not-readable:: ++* print-not-readable-object:: ++* format:: ++ ++ ++File: gcl.info, Node: copy-pprint-dispatch, Next: formatter, Prev: Printer Dictionary, Up: Printer Dictionary ++ ++22.4.1 copy-pprint-dispatch [Function] ++-------------------------------------- ++ ++'copy-pprint-dispatch' &optional table => new-table ++ ++Arguments and Values:: ++...................... ++ ++table--a pprint dispatch table, or nil. ++ ++ new-table--a fresh pprint dispatch table. ++ ++Description:: ++............. ++ ++Creates and returns a copy of the specified table, or of the value of ++*print-pprint-dispatch* if no table is specified, or of the initial ++value of *print-pprint-dispatch* if nil is specified. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if table is not a pprint ++dispatch table. ++ ++ ++File: gcl.info, Node: formatter, Next: pprint-dispatch, Prev: copy-pprint-dispatch, Up: Printer Dictionary ++ ++22.4.2 formatter [Macro] ++------------------------ ++ ++'formatter' control-string => function ++ ++Arguments and Values:: ++...................... ++ ++control-string--a format string; not evaluated. ++ ++ function--a function. ++ ++Description:: ++............. ++ ++Returns a function which has behavior equivalent to: ++ ++ #'(lambda (*standard-output* &rest arguments) ++ (apply #'format t control-string arguments) ++ arguments-tail) ++ ++ where arguments-tail is either the tail of arguments which has as its ++car the argument that would be processed next if there were more format ++directives in the control-string, or else nil if no more arguments ++follow the most recently processed argument. ++ ++Examples:: ++.......... ++ ++ (funcall (formatter "~&~A~A") *standard-output* 'a 'b 'c) ++ |> AB ++ => (C) ++ ++ (format t (formatter "~&~A~A") 'a 'b 'c) ++ |> AB ++ => NIL ++ ++Exceptional Situations:: ++........................ ++ ++Might signal an error (at macro expansion time or at run time) if the ++argument is not a valid format string. ++ ++See Also:: ++.......... ++ ++*note format:: ++ ++ ++File: gcl.info, Node: pprint-dispatch, Next: pprint-exit-if-list-exhausted, Prev: formatter, Up: Printer Dictionary ++ ++22.4.3 pprint-dispatch [Function] ++--------------------------------- ++ ++'pprint-dispatch' object &optional table => function, found-p ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ table--a pprint dispatch table, or nil. The default is the value of ++*print-pprint-dispatch*. ++ ++ function--a function designator. ++ ++ found-p--a generalized boolean. ++ ++Description:: ++............. ++ ++Retrieves the highest priority function in table that is associated with ++a type specifier that matches object. The function is chosen by finding ++all of the type specifiers in table that match the object and selecting ++the highest priority function associated with any of these type ++specifiers. If there is more than one highest priority function, an ++arbitrary choice is made. If no type specifiers match the object, a ++function is returned that prints object ++ ++ using print-object. ++ ++ The secondary value, found-p, is true if a matching type specifier ++was found in table, or false otherwise. ++ ++ If table is nil, retrieval is done in the initial pprint dispatch ++table. ++ ++Affected By:: ++............. ++ ++The state of the table. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if table is neither a ++pprint-dispatch-table nor nil. ++ ++Notes:: ++....... ++ ++ (let ((*print-pretty* t)) ++ (write object :stream s)) ++ == (funcall (pprint-dispatch object) s object) ++ ++ ++File: gcl.info, Node: pprint-exit-if-list-exhausted, Next: pprint-fill, Prev: pprint-dispatch, Up: Printer Dictionary ++ ++22.4.4 pprint-exit-if-list-exhausted [Local Macro] ++-------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'pprint-exit-if-list-exhausted' => nil ++ ++Description:: ++............. ++ ++Tests whether or not the list passed to the lexically current logical ++block has been exhausted; see *note Dynamic Control of the Arrangement ++of Output::. If this list has been reduced to nil, ++pprint-exit-if-list-exhausted terminates the execution of the lexically ++current logical block except for the printing of the suffix. Otherwise ++pprint-exit-if-list-exhausted returns nil. ++ ++ Whether or not pprint-exit-if-list-exhausted is fbound in the global ++environment is implementation-dependent; however, the restrictions on ++redefinition and shadowing of pprint-exit-if-list-exhausted are the same ++as for symbols in the COMMON-LISP package which are fbound in the global ++environment. The consequences of attempting to use ++pprint-exit-if-list-exhausted outside of pprint-logical-block are ++undefined. ++ ++Exceptional Situations:: ++........................ ++ ++An error is signaled (at macro expansion time or at run time) if ++pprint-exit-if-list-exhausted is used anywhere other than lexically ++within a call on pprint-logical-block. Also, the consequences of ++executing pprint-if-list-exhausted outside of the dynamic extent of the ++pprint-logical-block which lexically contains it are undefined. ++ ++See Also:: ++.......... ++ ++*note pprint-logical-block:: , *note pprint-pop:: . ++ ++ ++File: gcl.info, Node: pprint-fill, Next: pprint-indent, Prev: pprint-exit-if-list-exhausted, Up: Printer Dictionary ++ ++22.4.5 pprint-fill, pprint-linear, pprint-tabular [Function] ++------------------------------------------------------------ ++ ++'pprint-fill' stream object &optional colon-p at-sign-p => nil ++ ++ 'pprint-linear' stream object &optional colon-p at-sign-p => nil ++ ++ 'pprint-tabular' stream object &optional colon-p at-sign-p tabsize => ++nil ++ ++Arguments and Values:: ++...................... ++ ++stream--an output stream designator. ++ ++ object--an object. ++ ++ colon-p--a generalized boolean. The default is true. ++ ++ at-sign-p--a generalized boolean. The default is ++implementation-dependent. ++ ++ tabsize--a non-negative integer. The default is 16. ++ ++Description:: ++............. ++ ++The functions pprint-fill, pprint-linear, and pprint-tabular specify ++particular ways of pretty printing a list to stream. Each function ++prints parentheses around the output if and only if colon-p is true. ++Each function ignores its at-sign-p argument. (Both arguments are ++included even though only one is needed so that these functions can be ++used via ~/.../ and as set-pprint-dispatch functions, as well as ++directly.) Each function handles abbreviation and the detection of ++circularity and sharing correctly, and uses write to print object when ++it is a non-list. ++ ++ If object is a list and if the value of *print-pretty* is false, each ++of these functions prints object using a minimum of whitespace, as ++described in *note Printing Lists and Conses::. Otherwise (if object is ++a list and if the value of *print-pretty* is true): ++ ++* ++ The function pprint-linear prints a list either all on one line, or ++ with each element on a separate line. ++ ++* ++ The function pprint-fill prints a list with as many elements as ++ possible on each line. ++ ++* ++ The function pprint-tabular is the same as pprint-fill except that ++ it prints the elements so that they line up in columns. The ++ tabsize specifies the column spacing in ems, which is the total ++ spacing from the leading edge of one column to the leading edge of ++ the next. ++ ++Examples:: ++.......... ++ ++Evaluating the following with a line length of 25 produces the output ++shown. ++ ++ (progn (princ "Roads ") ++ (pprint-tabular *standard-output* '(elm main maple center) nil nil 8)) ++ Roads ELM MAIN ++ MAPLE CENTER ++ ++Side Effects:: ++.............. ++ ++Performs output to the indicated stream. ++ ++Affected By:: ++............. ++ ++The cursor position on the indicated stream, if it can be determined. ++ ++Notes:: ++....... ++ ++The function pprint-tabular could be defined as follows: ++ ++ (defun pprint-tabular (s list &optional (colon-p t) at-sign-p (tabsize nil)) ++ (declare (ignore at-sign-p)) ++ (when (null tabsize) (setq tabsize 16)) ++ (pprint-logical-block (s list :prefix (if colon-p "(" "") ++ :suffix (if colon-p ")" "")) ++ (pprint-exit-if-list-exhausted) ++ (loop (write (pprint-pop) :stream s) ++ (pprint-exit-if-list-exhausted) ++ (write-char #\Space s) ++ (pprint-tab :section-relative 0 tabsize s) ++ (pprint-newline :fill s)))) ++ ++ Note that it would have been inconvenient to specify this function ++using format, because of the need to pass its tabsize argument through ++to a ~:T format directive nested within an iteration over a list. ++ ++ ++File: gcl.info, Node: pprint-indent, Next: pprint-logical-block, Prev: pprint-fill, Up: Printer Dictionary ++ ++22.4.6 pprint-indent [Function] ++------------------------------- ++ ++'pprint-indent' relative-to n &optional stream => nil ++ ++Arguments and Values:: ++...................... ++ ++relative-to--either :block or :current. ++ ++ n--a real. ++ ++ stream--an output stream designator. The default is standard output. ++ ++Description:: ++............. ++ ++pprint-indent specifies the indentation to use in a logical block on ++stream. ++ ++ If stream is a pretty printing stream and the value of *print-pretty* ++is true, pprint-indent sets the indentation in the innermost dynamically ++enclosing logical block; otherwise, pprint-indent has no effect. ++ ++ N specifies the indentation in ems. If relative-to is :block, the ++indentation is set to the horizontal position of the first character in ++the dynamically current logical block plus n ems. If relative-to is ++:current, the indentation is set to the current output position plus n ++ems. (For robustness in the face of variable-width fonts, it is ++advisable to use :current with an n of zero whenever possible.) ++ ++ N can be negative; however, the total indentation cannot be moved ++left of the beginning of the line or left of the end of the rightmost ++per-line prefix--an attempt to move beyond one of these limits is ++treated the same as an attempt to move to that limit. Changes in ++indentation caused by pprint-indent do not take effect until after the ++next line break. In addition, in miser mode all calls to pprint-indent ++are ignored, forcing the lines corresponding to the logical block to ++line up under the first character in the block. ++ ++Exceptional Situations:: ++........................ ++ ++An error is signaled if relative-to is any object other than :block or ++:current. ++ ++See Also:: ++.......... ++ ++*note Tilde I-> Indent:: ++ ++ ++File: gcl.info, Node: pprint-logical-block, Next: pprint-newline, Prev: pprint-indent, Up: Printer Dictionary ++ ++22.4.7 pprint-logical-block [Macro] ++----------------------------------- ++ ++'pprint-logical-block' (stream-symbol object &key prefix per-line-prefix ++suffix) {declaration}* {form}* ++=> nil ++ ++Arguments and Values:: ++...................... ++ ++stream-symbol--a stream variable designator. ++ ++ object--an object; evaluated. ++ ++ :prefix--a string; evaluated. Complicated defaulting behavior; see ++below. ++ ++ :per-line-prefix--a string; evaluated. Complicated defaulting ++behavior; see below. ++ ++ :suffix--a string; evaluated. The default is the null string. ++ ++ declaration--a declare expression; not evaluated. ++ ++ forms--an implicit progn. ++ ++Description:: ++............. ++ ++Causes printing to be grouped into a logical block. ++ ++ The logical block is printed to the stream that is the value of the ++variable denoted by stream-symbol. During the execution of the forms, ++that variable is bound to a pretty printing stream that supports ++decisions about the arrangement of output and then forwards the output ++to the destination stream. ++ ++ All the standard printing functions (e.g., write, princ, and terpri) ++can be used to print output to the pretty printing stream. All and only ++the output sent to this pretty printing stream is treated as being in ++the logical block. ++ ++ The prefix specifies a prefix to be printed before the beginning of ++the logical block. The per-line-prefix specifies a prefix that is ++printed before the block and at the beginning of each new line in the ++block. The :prefix and :pre-line-prefix arguments are mutually ++exclusive. If neither :prefix nor :per-line-prefix is specified, a ++prefix of the null string is assumed. ++ ++ The suffix specifies a suffix that is printed just after the logical ++block. ++ ++ The object is normally a list that the body forms are responsible for ++printing. If object is not a list, it is printed using write. (This ++makes it easier to write printing functions that are robust in the face ++of malformed arguments.) If *print-circle* is non-nil and object is a ++circular (or shared) reference to a cons, then an appropriate "#n#" ++marker is printed. (This makes it easy to write printing functions that ++provide full support for circularity and sharing abbreviation.) If ++*print-level* is not nil and the logical block is at a dynamic nesting ++depth of greater than *print-level* in logical blocks, "#" is printed. ++(This makes easy to write printing functions that provide full support ++for depth abbreviation.) ++ ++ If either of the three conditions above occurs, the indicated output ++is printed on stream-symbol and the body forms are skipped along with ++the printing of the :prefix and :suffix. (If the body forms are not to ++be responsible for printing a list, then the first two tests above can ++be turned off by supplying nil for the object argument.) ++ ++ In addition to the object argument of pprint-logical-block, the ++arguments of the standard printing functions (such as write, print, ++prin1, and pprint, as well as the arguments of the standard format ++directives such as ~A, ~S, (and ~W) are all checked (when necessary) for ++circularity and sharing. However, such checking is not applied to the ++arguments of the functions write-line, write-string, and write-char or ++to the literal text output by format. A consequence of this is that you ++must use one of the latter functions if you want to print some literal ++text in the output that is not supposed to be checked for circularity or ++sharing. ++ ++ The body forms of a pprint-logical-block form must not perform any ++side-effects on the surrounding environment; for example, no variables ++must be assigned which have not been bound within its scope. ++ ++ The pprint-logical-block macro may be used regardless of the value of ++*print-pretty*. ++ ++Affected By:: ++............. ++ ++*print-circle*, *print-level*. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type type-error is signaled if any of the :suffix, :prefix, ++or :per-line-prefix is supplied but does not evaluate to a string. ++ ++ An error is signaled if :prefix and :pre-line-prefix are both used. ++ ++ pprint-logical-block and the pretty printing stream it creates have ++dynamic extent. The consequences are undefined if, outside of this ++extent, output is attempted to the pretty printing stream it creates. ++ ++ It is also unspecified what happens if, within this extent, any ++output is sent directly to the underlying destination stream. ++ ++See Also:: ++.......... ++ ++*note pprint-pop:: , *note pprint-exit-if-list-exhausted:: , *note Tilde ++Less-Than-Sign-> Logical Block:: ++ ++Notes:: ++....... ++ ++One reason for using the pprint-logical-block macro when the value of ++*print-pretty* is nil would be to allow it to perform checking for ++dotted lists, as well as (in conjunction with pprint-pop) checking for ++*print-level* or *print-length* being exceeded. ++ ++ Detection of circularity and sharing is supported by the pretty ++printer by in essence performing requested output twice. On the first ++pass, circularities and sharing are detected and the actual outputting ++of characters is suppressed. On the second pass, the appropriate "#n=" ++and "#n#" markers are inserted and characters are output. This is why ++the restriction on side-effects is necessary. Obeying this restriction ++is facilitated by using pprint-pop, instead of an ordinary pop when ++traversing a list being printed by the body forms of the ++pprint-logical-block form.) ++ ++ ++File: gcl.info, Node: pprint-newline, Next: pprint-pop, Prev: pprint-logical-block, Up: Printer Dictionary ++ ++22.4.8 pprint-newline [Function] ++-------------------------------- ++ ++'pprint-newline' kind &optional stream => nil ++ ++Arguments and Values:: ++...................... ++ ++kind--one of :linear, :fill, :miser, or :mandatory. ++ ++ stream--a stream designator. The default is standard output. ++ ++Description:: ++............. ++ ++If stream is a pretty printing stream and the value of *print-pretty* is ++true, a line break is inserted in the output when the appropriate ++condition below is satisfied; otherwise, pprint-newline has no effect. ++ ++ Kind specifies the style of conditional newline. This parameter is ++treated as follows: ++ ++:linear ++ This specifies a "linear-style" conditional newline. ++ ++ A line break is inserted if and only if the immediately containing ++ section cannot be printed on one line. The effect of this is that ++ line breaks are either inserted at every linear-style conditional ++ newline in a logical block or at none of them. ++ ++:miser ++ This specifies a "miser-style" conditional newline. ++ ++ A line break is inserted if and only if the immediately containing ++ section cannot be printed on one line and miser style is in effect ++ in the immediately containing logical block. The effect of this is ++ that miser-style conditional newlines act like linear-style ++ conditional newlines, but only when miser style is in effect. ++ Miser style is in effect for a logical block if and only if the ++ starting position of the logical block is less than or equal to ++ *print-miser-width* ems from the right margin. ++ ++:fill ++ This specifies a "fill-style" conditional newline. ++ ++ A line break is inserted if and only if either (a) the following ++ section cannot be printed on the end of the current line, (b) the ++ preceding section was not printed on a single line, or (c) the ++ immediately containing section cannot be printed on one line and ++ miser style is in effect in the immediately containing logical ++ block. If a logical block is broken up into a number of ++ subsections by fill-style conditional newlines, the basic effect is ++ that the logical block is printed with as many subsections as ++ possible on each line. However, if miser style is in effect, ++ fill-style conditional newlines act like linear-style conditional ++ newlines. ++ ++:mandatory ++ This specifies a "mandatory-style" conditional newline. ++ ++ A line break is always inserted. This implies that none of the ++ containing sections can be printed on a single line and will ++ therefore trigger the insertion of line breaks at linear-style ++ conditional newlines in these sections. ++ ++ When a line break is inserted by any type of conditional newline, any ++blanks that immediately precede the conditional newline are omitted from ++the output and indentation is introduced at the beginning of the next ++line. By default, the indentation causes the following line to begin in ++the same horizontal position as the first character in the immediately ++containing logical block. (The indentation can be changed via ++pprint-indent.) ++ ++ There are a variety of ways unconditional newlines can be introduced ++into the output (i.e., via terpri or by printing a string containing a ++newline character). As with mandatory conditional newlines, this ++prevents any of the containing sections from being printed on one line. ++In general, when an unconditional newline is encountered, it is printed ++out without suppression of the preceding blanks and without any ++indentation following it. However, if a per-line prefix has been ++specified (see pprint-logical-block), this prefix will always be printed ++no matter how a newline originates. ++ ++Examples:: ++.......... ++ ++See *note Examples of using the Pretty Printer::. ++ ++Side Effects:: ++.............. ++ ++Output to stream. ++ ++Affected By:: ++............. ++ ++*print-pretty*, *print-miser*. The presence of containing logical ++blocks. The placement of newlines and conditional newlines. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type type-error is signaled if kind is not one of :linear, ++:fill, :miser, or :mandatory. ++ ++See Also:: ++.......... ++ ++*note Tilde Underscore-> Conditional Newline::, *note Examples of using ++the Pretty Printer:: ++ ++ ++File: gcl.info, Node: pprint-pop, Next: pprint-tab, Prev: pprint-newline, Up: Printer Dictionary ++ ++22.4.9 pprint-pop [Local Macro] ++------------------------------- ++ ++Syntax:: ++........ ++ ++'pprint-pop' => object ++ ++Arguments and Values:: ++...................... ++ ++object--an element of the list being printed in the lexically current ++logical block, or nil. ++ ++Description:: ++............. ++ ++Pops one element from the list being printed in the lexically current ++logical block, obeying *print-length* and *print-circle* as described ++below. ++ ++ Each time pprint-pop is called, it pops the next value off the list ++passed to the lexically current logical block and returns it. However, ++before doing this, it performs three tests: ++ ++* ++ If the remaining 'list' is not a list, ". " is printed followed by ++ the remaining 'list.' (This makes it easier to write printing ++ functions that are robust in the face of malformed arguments.) ++ ++* ++ If *print-length* is non-nil, and pprint-pop has already been ++ called *print-length* times within the immediately containing ++ logical block, "..." is printed. (This makes it easy to write ++ printing functions that properly handle *print-length*.) ++ ++* ++ If *print-circle* is non-nil, and the remaining list is a circular ++ (or shared) reference, then ". " is printed followed by an ++ appropriate "#n#" marker. (This catches instances of cdr ++ circularity and sharing in lists.) ++ ++ If either of the three conditions above occurs, the indicated output ++is printed on the pretty printing stream created by the immediately ++containing pprint-logical-block and the execution of the immediately ++containing pprint-logical-block is terminated except for the printing of ++the suffix. ++ ++ If pprint-logical-block is given a 'list' argument of nil--because it ++is not processing a list--pprint-pop can still be used to obtain support ++for *print-length*. In this situation, the first and third tests above ++are disabled and pprint-pop always returns nil. See *note Examples of ++using the Pretty Printer::--specifically, the pprint-vector example. ++ ++ Whether or not pprint-pop is fbound in the global environment is ++implementation-dependent; however, the restrictions on redefinition and ++shadowing of pprint-pop are the same as for symbols in the COMMON-LISP ++package which are fbound in the global environment. The consequences of ++attempting to use pprint-pop outside of pprint-logical-block are ++undefined. ++ ++Side Effects:: ++.............. ++ ++Might cause output to the pretty printing stream associated with the ++lexically current logical block. ++ ++Affected By:: ++............. ++ ++*print-length*, *print-circle*. ++ ++Exceptional Situations:: ++........................ ++ ++An error is signaled (either at macro expansion time or at run time) if ++a usage of pprint-pop occurs where there is no lexically containing ++pprint-logical-block form. ++ ++ The consequences are undefined if pprint-pop is executed outside of ++the dynamic extent of this pprint-logical-block. ++ ++See Also:: ++.......... ++ ++*note pprint-exit-if-list-exhausted:: , *note pprint-logical-block:: . ++ ++Notes:: ++....... ++ ++It is frequently a good idea to call pprint-exit-if-list-exhausted ++before calling pprint-pop. ++ ++ ++File: gcl.info, Node: pprint-tab, Next: print-object, Prev: pprint-pop, Up: Printer Dictionary ++ ++22.4.10 pprint-tab [Function] ++----------------------------- ++ ++'pprint-tab' kind colnum colinc &optional stream => nil ++ ++Arguments and Values:: ++...................... ++ ++kind--one of :line, :section, :line-relative, or :section-relative. ++ ++ colnum--a non-negative integer. ++ ++ colinc--a non-negative integer. ++ ++ stream--an output stream designator. ++ ++Description:: ++............. ++ ++Specifies tabbing to stream as performed by the standard ~T format ++directive. ++ ++ If stream is a pretty printing stream and the value of *print-pretty* ++is true, ++ ++ tabbing is performed; otherwise, pprint-tab has no effect. ++ ++ The arguments colnum and colinc correspond to the two parameters to ++~T and are in terms of ems. The kind argument specifies the style of ++tabbing. It must be one of :line (tab as by ~T), :section (tab as by ++~:T, but measuring horizontal positions relative to the start of the ++dynamically enclosing section), :line-relative (tab as by ~@T), or ++:section-relative (tab as by ~:@T, but measuring horizontal positions ++relative to the start of the dynamically enclosing section). ++ ++Exceptional Situations:: ++........................ ++ ++An error is signaled if kind is not one of :line, :section, ++:line-relative, or :section-relative. ++ ++See Also:: ++.......... ++ ++*note pprint-logical-block:: ++ ++ ++File: gcl.info, Node: print-object, Next: print-unreadable-object, Prev: pprint-tab, Up: Printer Dictionary ++ ++22.4.11 print-object [Standard Generic Function] ++------------------------------------------------ ++ ++Syntax:: ++........ ++ ++'print-object' object stream => object ++ ++Method Signatures:: ++................... ++ ++'print-object' (object standard-object) stream ++ ++ 'print-object' (object structure-object) stream ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ stream--a stream. ++ ++Description:: ++............. ++ ++The generic function print-object writes the printed representation of ++object to stream. The function print-object is called by the Lisp ++printer; it should not be called by the user. ++ ++ Each implementation is required to provide a method on the class ++standard-object and on the class structure-object. In addition, each ++implementation must provide methods on enough other classes so as to ++ensure that there is always an applicable method. Implementations are ++free to add methods for other classes. Users may write methods for ++print-object for their own classes if they do not wish to inherit an ++implementation-dependent method. ++ ++ The method on the class structure-object prints the object in the ++default #S notation; see *note Printing Structures::. ++ ++ Methods on print-object are responsible for implementing their part ++of the semantics of the printer control variables, as follows: ++ ++*print-readably* ++ All methods for print-object must obey *print-readably*. This ++ includes both user-defined methods and implementation-defined ++ methods. Readable printing of structures and standard objects is ++ controlled by their print-object method, not by their ++ make-load-form method. Similarity for these objects is application ++ dependent and hence is defined to be whatever these methods do; see ++ *note Similarity of Literal Objects::. ++ ++*print-escape* ++ Each method must implement *print-escape*. ++ ++*print-pretty* ++ ++ The method may wish to perform specialized line breaking or other ++ output conditional on the value of *print-pretty*. For further ++ information, see (for example) the macro pprint-fill. See also ++ *note Pretty Print Dispatch Tables:: and *note Examples of using ++ the Pretty Printer::. ++ ++*print-length* ++ Methods that produce output of indefinite length must obey ++ *print-length*. ++ ++ For further information, see (for example) the macros ++ pprint-logical-block and pprint-pop. See also *note Pretty Print ++ Dispatch Tables:: and *note Examples of using the Pretty Printer::. ++ ++*print-level* ++ The printer takes care of *print-level* automatically, provided ++ that each method handles exactly one level of structure and calls ++ write (or an equivalent function) recursively if there are more ++ structural levels. The printer's decision of whether an object has ++ components (and therefore should not be printed when the printing ++ depth is not less than *print-level*) is implementation-dependent. ++ In some implementations its print-object method is not called; in ++ others the method is called, and the determination that the object ++ has components is based on what it tries to write to the stream. ++ ++*print-circle* ++ ++ When the value of *print-circle* is true, a user-defined ++ ++ print-object method ++ ++ can print objects to the supplied stream using write, prin1, princ, ++ or format and expect circularities to be detected and printed using ++ the #n# syntax. If a user-defined ++ ++ print-object method ++ ++ prints to a stream other than the one that was supplied, then ++ circularity detection starts over for that stream. See ++ *print-circle*. ++ ++*print-base*, ++ *print-radix*, *print-case*, *print-gensym*, and *print-array* ++ These printer control variables apply to specific types of objects ++ and are handled by the methods for those objects. ++ ++ If these rules are not obeyed, the results are undefined. ++ ++ In general, the printer and the print-object methods should not ++rebind the print control variables as they operate recursively through ++the structure, but this is implementation-dependent. ++ ++ In some implementations the stream argument passed to a print-object ++method is not the original stream, but is an intermediate stream that ++implements part of the printer. methods should therefore not depend on ++the identity of this stream. ++ ++See Also:: ++.......... ++ ++*note pprint-fill:: , *note pprint-logical-block:: , *note pprint-pop:: ++, *note write:: , *print-readably*, *print-escape*, *print-pretty*, ++*print-length*, *note Default Print-Object Methods::, ++ ++ *note Printing Structures::, ++ ++ *note Pretty Print Dispatch Tables::, *note Examples of using the ++Pretty Printer:: ++ ++ ++File: gcl.info, Node: print-unreadable-object, Next: set-pprint-dispatch, Prev: print-object, Up: Printer Dictionary ++ ++22.4.12 print-unreadable-object [Macro] ++--------------------------------------- ++ ++'print-unreadable-object' (object stream &key type identity) {form}* => ++nil ++ ++Arguments and Values:: ++...................... ++ ++object--an object; evaluated. ++ ++ stream-- a stream designator; evaluated. ++ ++ type--a generalized boolean; evaluated. ++ ++ identity--a generalized boolean; evaluated. ++ ++ forms--an implicit progn. ++ ++Description:: ++............. ++ ++Outputs a printed representation of object on stream, beginning with ++"#<" and ending with ">". Everything output to stream by the body forms ++is enclosed in the the angle brackets. If type is true, the output from ++forms is preceded by a brief description of the object's type and a ++space character. If identity is true, the output from forms is followed ++by a space character and a representation of the object's identity, ++typically a storage address. ++ ++ If either type or identity is not supplied, its value is false. It ++is valid to omit the body forms. If type and identity are both true and ++there are no body forms, only one space character separates the type and ++the identity. ++ ++Examples:: ++.......... ++ ++;; Note that in this example, the precise form of the output ;; is ++implementation-dependent. ++ ++ (defmethod print-object ((obj airplane) stream) ++ (print-unreadable-object (obj stream :type t :identity t) ++ (princ (tail-number obj) stream))) ++ ++ (prin1-to-string my-airplane) ++ => "#" ++ OR=> "#" ++ ++Exceptional Situations:: ++........................ ++ ++If *print-readably* is true, print-unreadable-object signals an error of ++type print-not-readable without printing anything. ++ ++ ++File: gcl.info, Node: set-pprint-dispatch, Next: write, Prev: print-unreadable-object, Up: Printer Dictionary ++ ++22.4.13 set-pprint-dispatch [Function] ++-------------------------------------- ++ ++'set-pprint-dispatch' type-specifier function &optional priority table ++=> nil ++ ++Arguments and Values:: ++...................... ++ ++type-specifier--a type specifier. ++ ++ function--a function, a function name, or nil. ++ ++ priority--a real. The default is 0. ++ ++ table--a pprint dispatch table. The default is the value of ++*print-pprint-dispatch*. ++ ++Description:: ++............. ++ ++Installs an entry into the pprint dispatch table which is table. ++ ++ Type-specifier is the key of the entry. The first action of ++set-pprint-dispatch is to remove any pre-existing entry associated with ++type-specifier. This guarantees that there will never be two entries ++associated with the same type specifier in a given pprint dispatch ++table. Equality of type specifiers is tested by equal. ++ ++ Two values are associated with each type specifier in a pprint ++dispatch table: a function and a priority. The function must accept two ++arguments: the stream to which output is sent and the object to be ++printed. The function should pretty print the object to the stream. ++The function can assume that object satisfies the type given by ++type-specifier. The function must obey *print-readably*. Any values ++returned by the function are ignored. ++ ++ Priority is a priority to resolve conflicts when an object matches ++more than one entry. ++ ++ It is permissible for function to be nil. In this situation, there ++will be no type-specifier entry in table after set-pprint-dispatch ++returns. ++ ++Exceptional Situations:: ++........................ ++ ++An error is signaled if priority is not a real. ++ ++Notes:: ++....... ++ ++Since pprint dispatch tables are often used to control the pretty ++printing of Lisp code, it is common for the type-specifier to be an ++expression of the form ++ ++ (cons car-type cdr-type) ++ ++ This signifies that the corresponding object must be a cons cell ++whose car matches the type specifier car-type and whose cdr matches the ++type specifier cdr-type. The cdr-type can be omitted in which case it ++defaults to t. ++ ++ ++File: gcl.info, Node: write, Next: write-to-string, Prev: set-pprint-dispatch, Up: Printer Dictionary ++ ++22.4.14 write, prin1, print, pprint, princ [Function] ++----------------------------------------------------- ++ ++'write' object &key \writekeysstream ++=> object ++ ++ 'prin' 1 => object &optional output-stream object 'princ' object ++&optional output-stream => object ++ ++ 'print' object &optional output-stream => object ++ ++ 'pprint' object &optional output-stream => ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ output-stream--an output stream designator. The default is standard ++output. ++ ++ \writekeydescriptionsstream--an output stream designator. The ++default is standard output. ++ ++Description:: ++............. ++ ++write, prin1, princ, print, and pprint write the printed representation ++of object to output-stream. ++ ++ write is the general entry point to the Lisp printer. For each ++explicitly supplied keyword parameter named in Figure 22-6, the ++corresponding printer control variable is dynamically bound to its value ++while printing goes on; for each keyword parameter in Figure 22-6 that ++is not explicitly supplied, the value of the corresponding printer ++control variable is the same as it was at the time write was invoked. ++Once the appropriate bindings are established, the object is output by ++the Lisp printer. ++ ++ Parameter Corresponding Dynamic Variable ++ array *print-array* ++ base *print-base* ++ case *print-case* ++ circle *print-circle* ++ escape *print-escape* ++ gensym *print-gensym* ++ length *print-length* ++ level *print-level* ++ lines *print-lines* ++ miser-width *print-miser-width* ++ pprint-dispatch *print-pprint-dispatch* ++ pretty *print-pretty* ++ radix *print-radix* ++ readably *print-readably* ++ right-margin *print-right-margin* ++ ++ Figure 22-6: Argument correspondences for the WRITE function. ++ ++ ++ prin1, princ, print, and pprint implicitly bind certain print ++parameters to particular values. The remaining parameter values are ++taken from *print-array*, *print-base*, *print-case*, *print-circle*, ++*print-escape*, *print-gensym*, *print-length*, *print-level*, ++*print-lines*, *print-miser-width*, *print-pprint-dispatch*, ++*print-pretty*, *print-radix*, and *print-right-margin*. ++ ++ prin1 produces output suitable for input to read. It binds ++*print-escape* to true. ++ ++ princ is just like prin1 except that the output has no escape ++characters. It binds *print-escape* to false ++ ++ and *print-readably* to false. ++ ++ The general rule is that output from princ is intended to look good ++to people, while output from prin1 is intended to be acceptable to read. ++ ++ print is just like prin1 except that the printed representation of ++object is preceded by a newline and followed by a space. ++ ++ pprint is just like print except that the trailing space is omitted ++and object is printed with the *print-pretty* flag non-nil to produce ++pretty output. ++ ++ Output-stream specifies the stream to which output is to be sent. ++ ++Affected By:: ++............. ++ ++*standard-output*, *terminal-io*, *print-escape*, *print-radix*, ++*print-base*, *print-circle*, *print-pretty*, *print-level*, ++*print-length*, *print-case*, *print-gensym*, *print-array*, ++*read-default-float-format*. ++ ++See Also:: ++.......... ++ ++*note readtable-case:: , *note FORMAT Printer Operations:: ++ ++Notes:: ++....... ++ ++The functions prin1 and print do not bind *print-readably*. ++ ++ (prin1 object output-stream) ++ == (write object :stream output-stream :escape t) ++ ++ (princ object output-stream) ++ == (write object stream output-stream :escape nil :readably nil) ++ ++ (print object output-stream) ++ == (progn (terpri output-stream) ++ (write object :stream output-stream ++ :escape t) ++ (write-char #\space output-stream)) ++ ++ (pprint object output-stream) ++ == (write object :stream output-stream :escape t :pretty t) ++ ++ ++File: gcl.info, Node: write-to-string, Next: *print-array*, Prev: write, Up: Printer Dictionary ++ ++22.4.15 write-to-string, prin1-to-string, princ-to-string [Function] ++-------------------------------------------------------------------- ++ ++'write-to-string' object &key \writekeys ++=> string ++ ++ 'prin' 1 => -to-string object string ++ ++ 'princ-to-string' object => string ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ \writekeydescriptions ++ ++ string--a string. ++ ++Description:: ++............. ++ ++write-to-string, prin1-to-string, and princ-to-string are used to create ++a string consisting of the printed representation of object. Object is ++effectively printed as if by write, prin1, or princ, respectively, and ++the characters that would be output are made into a string. ++ ++ write-to-string is the general output function. It has the ability ++to specify all the parameters applicable to the printing of object. ++ ++ prin1-to-string acts like write-to-string with :escape t, that is, ++escape characters are written where appropriate. ++ ++ princ-to-string acts like write-to-string with ++ ++ :escape nil :readably nil. ++ ++ Thus no escape characters are written. ++ ++ All other keywords that would be specified to write-to-string are ++default values when prin1-to-string or princ-to-string is invoked. ++ ++ The meanings and defaults for the keyword arguments to ++write-to-string are the same as those for write. ++ ++Examples:: ++.......... ++ ++ (prin1-to-string "abc") => "\"abc\"" ++ (princ-to-string "abc") => "abc" ++ ++Affected By:: ++............. ++ ++*print-escape*, *print-radix*, *print-base*, *print-circle*, ++*print-pretty*, *print-level*, *print-length*, *print-case*, ++*print-gensym*, *print-array*, *read-default-float-format*. ++ ++See Also:: ++.......... ++ ++*note write:: ++ ++Notes:: ++....... ++ ++ (write-to-string object {key argument}*) ++ == (with-output-to-string (#1=#:string-stream) ++ (write object :stream #1# {key argument}*)) ++ ++ (princ-to-string object) ++ == (with-output-to-string (string-stream) ++ (princ object string-stream)) ++ ++ (prin1-to-string object) ++ == (with-output-to-string (string-stream) ++ (prin1 object string-stream)) ++ ++ ++File: gcl.info, Node: *print-array*, Next: *print-base*, Prev: write-to-string, Up: Printer Dictionary ++ ++22.4.16 *print-array* [Variable] ++-------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++Controls the format in which arrays are printed. If it is false, the ++contents of arrays other than strings are never printed. Instead, ++arrays are printed in a concise form using #< that gives enough ++information for the user to be able to identify the array, but does not ++include the entire array contents. If it is true, non-string arrays are ++printed using #(...), #*, or #nA syntax. ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++See Also:: ++.......... ++ ++*note Sharpsign Left-Parenthesis::, *note Sharpsign Less-Than-Sign:: ++ ++ ++File: gcl.info, Node: *print-base*, Next: *print-case*, Prev: *print-array*, Up: Printer Dictionary ++ ++22.4.17 *print-base*, *print-radix* [Variable] ++---------------------------------------------- ++ ++Value Type:: ++............ ++ ++*print-base*--a radix. *print-radix*--a generalized boolean. ++ ++Initial Value:: ++............... ++ ++The initial value of *print-base* is 10. The initial value of ++*print-radix* is false. ++ ++Description:: ++............. ++ ++*print-base* and *print-radix* control the printing of rationals. The ++value of *print-base* is called the current output base . ++ ++ The value of *print-base* is the radix in which the printer will ++print rationals. For radices above 10, letters of the alphabet are used ++to represent digits above 9. ++ ++ If the value of *print-radix* is true, the printer will print a radix ++specifier to indicate the radix in which it is printing a rational ++number. The radix specifier is always printed using lowercase letters. ++If *print-base* is 2, 8, or 16, then the radix specifier used is #b, #o, ++or #x, respectively. For integers, base ten is indicated by a trailing ++decimal point instead of a leading radix specifier; for ratios, #10r is ++used. ++ ++Examples:: ++.......... ++ ++ (let ((*print-base* 24.) (*print-radix* t)) ++ (print 23.)) ++ |> #24rN ++ => 23 ++ (setq *print-base* 10) => 10 ++ (setq *print-radix* nil) => NIL ++ (dotimes (i 35) ++ (let ((*print-base* (+ i 2))) ;print the decimal number 40 ++ (write 40) ;in each base from 2 to 36 ++ (if (zerop (mod i 10)) (terpri) (format t " ")))) ++ |> 101000 ++ |> 1111 220 130 104 55 50 44 40 37 34 ++ |> 31 2C 2A 28 26 24 22 20 1J 1I ++ |> 1H 1G 1F 1E 1D 1C 1B 1A 19 18 ++ |> 17 16 15 14 ++ => NIL ++ (dolist (pb '(2 3 8 10 16)) ++ (let ((*print-radix* t) ;print the integer 10 and ++ (*print-base* pb)) ;the ratio 1/10 in bases 2, ++ (format t "~&~S ~S~ ++ |> #b1010 #b1/1010 ++ |> #3r101 #3r1/101 ++ |> #o12 #o1/12 ++ |> 10. #10r1/10 ++ |> #xA #x1/A ++ => NIL ++ ++Affected By:: ++............. ++ ++Might be bound by format, and write, write-to-string. ++ ++See Also:: ++.......... ++ ++*note format:: , *note write:: , *note write-to-string:: ++ ++ ++File: gcl.info, Node: *print-case*, Next: *print-circle*, Prev: *print-base*, Up: Printer Dictionary ++ ++22.4.18 *print-case* [Variable] ++------------------------------- ++ ++Value Type:: ++............ ++ ++One of the symbols :upcase, :downcase, or :capitalize. ++ ++Initial Value:: ++............... ++ ++The symbol :upcase. ++ ++Description:: ++............. ++ ++The value of *print-case* controls the case (upper, lower, or mixed) in ++which to print any uppercase characters in the names of symbols when ++vertical-bar syntax is not used. ++ ++ *print-case* has an effect at all times when the value of ++*print-escape* is false. *print-case* also has an effect when the value ++of *print-escape* is true unless inside an escape context (i.e., unless ++between vertical-bars or after a slash). ++ ++Examples:: ++.......... ++ ++ (defun test-print-case () ++ (dolist (*print-case* '(:upcase :downcase :capitalize)) ++ (format t "~&~S ~S~ ++ => TEST-PC ++ ;; Although the choice of which characters to escape is specified by ++ ;; *PRINT-CASE*, the choice of how to escape those characters ++ ;; (i.e., whether single escapes or multiple escapes are used) ++ ;; is implementation-dependent. The examples here show two of the ++ ;; many valid ways in which escaping might appear. ++ (test-print-case) ;Implementation A ++ |> THIS-AND-THAT |And-something-elSE| ++ |> this-and-that a\n\d-\s\o\m\e\t\h\i\n\g-\e\lse ++ |> This-And-That A\n\d-\s\o\m\e\t\h\i\n\g-\e\lse ++ => NIL ++ (test-print-case) ;Implementation B ++ |> THIS-AND-THAT |And-something-elSE| ++ |> this-and-that a|nd-something-el|se ++ |> This-And-That A|nd-something-el|se ++ => NIL ++ ++See Also:: ++.......... ++ ++*note write:: ++ ++Notes:: ++....... ++ ++read normally converts lowercase characters appearing in symbols to ++corresponding uppercase characters, so that internally print names ++normally contain only uppercase characters. ++ ++ If *print-escape* is true, lowercase characters in the name of a ++symbol are always printed in lowercase, and are preceded by a single ++escape character or enclosed by multiple escape characters; uppercase ++characters in the name of a symbol are printed in upper case, in lower ++case, or in mixed case so as to capitalize words, according to the value ++of *print-case*. The convention for what constitutes a "word" is the ++same as for string-capitalize. ++ ++ ++File: gcl.info, Node: *print-circle*, Next: *print-escape*, Prev: *print-case*, Up: Printer Dictionary ++ ++22.4.19 *print-circle* [Variable] ++--------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++false. ++ ++Description:: ++............. ++ ++Controls the attempt to detect circularity and sharing in an object ++being printed. ++ ++ If false, the printing process merely proceeds by recursive descent ++without attempting to detect circularity and sharing. ++ ++ If true, the printer will endeavor to detect cycles and sharing in ++the structure to be printed, and to use #n= and #n# syntax to indicate ++the circularities or shared components. ++ ++ If true, a user-defined ++ ++ print-object method ++ ++ can print objects to the supplied stream using write, prin1, princ, ++or format and expect circularities and sharing to be detected and ++printed using the #n# syntax. ++ ++ If a user-defined ++ ++ print-object method ++ ++ prints to a stream other than the one that was supplied, then ++circularity detection starts over for that stream. ++ ++ Note that implementations should not use #n# notation when the Lisp ++reader would automatically assure sharing without it (e.g., as happens ++with interned symbols). ++ ++Examples:: ++.......... ++ ++ (let ((a (list 1 2 3))) ++ (setf (cdddr a) a) ++ (let ((*print-circle* t)) ++ (write a) ++ :done)) ++ |> #1=(1 2 3 . #1#) ++ => :DONE ++ ++See Also:: ++.......... ++ ++*note write:: ++ ++Notes:: ++....... ++ ++An attempt to print a circular structure with *print-circle* set to nil ++may lead to looping behavior and failure to terminate. ++ ++ ++File: gcl.info, Node: *print-escape*, Next: *print-gensym*, Prev: *print-circle*, Up: Printer Dictionary ++ ++22.4.20 *print-escape* [Variable] ++--------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++true. ++ ++Description:: ++............. ++ ++If false, escape characters and package prefixes are not output when an ++expression is printed. ++ ++ If true, an attempt is made to print an expression in such a way that ++it can be read again to produce an equal expression. (This is only a ++guideline; not a requirement. See *print-readably*.) ++ ++ For more specific details of how the value of *print-escape* affects ++the printing of certain types, see *note Default Print-Object Methods::. ++ ++Examples:: ++.......... ++ ++ (let ((*print-escape* t)) (write #\a)) ++ |> #\a ++ => #\a ++ (let ((*print-escape* nil)) (write #\a)) ++ |> a ++ => #\a ++ ++Affected By:: ++............. ++ ++princ, prin1, format ++ ++See Also:: ++.......... ++ ++*note write:: , *note readtable-case:: ++ ++Notes:: ++....... ++ ++princ effectively binds *print-escape* to false. prin1 effectively ++binds *print-escape* to true. ++ ++ ++File: gcl.info, Node: *print-gensym*, Next: *print-level*, Prev: *print-escape*, Up: Printer Dictionary ++ ++22.4.21 *print-gensym* [Variable] ++--------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++true. ++ ++Description:: ++............. ++ ++Controls whether the prefix "#:" is printed before apparently uninterned ++symbols. The prefix is printed before such symbols if and only if the ++value of *print-gensym* is true. ++ ++Examples:: ++.......... ++ ++ (let ((*print-gensym* nil)) ++ (print (gensym))) ++ |> G6040 ++ => #:G6040 ++ ++See Also:: ++.......... ++ ++*note write:: , *print-escape* ++ ++ ++File: gcl.info, Node: *print-level*, Next: *print-lines*, Prev: *print-gensym*, Up: Printer Dictionary ++ ++22.4.22 *print-level*, *print-length* [Variable] ++------------------------------------------------ ++ ++Value Type:: ++............ ++ ++a non-negative integer, or nil. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++*print-level* controls how many levels deep a nested object will print. ++If it is false, then no control is exercised. Otherwise, it is an ++integer indicating the maximum level to be printed. An object to be ++printed is at level 0; its components (as of a list or vector) are at ++level 1; and so on. If an object to be recursively printed has ++components and is at a level equal to or greater than the value of ++*print-level*, then the object is printed as "#". ++ ++ *print-length* controls how many elements at a given level are ++printed. If it is false, there is no limit to the number of components ++printed. Otherwise, it is an integer indicating the maximum number of ++elements of an object to be printed. If exceeded, the printer will ++print "..." in place of the other elements. In the case of a dotted ++list, if the list contains exactly as many elements as the value of ++*print-length*, the terminating atom is printed rather than printing ++"..." ++ ++ *print-level* and *print-length* affect the printing of an any object ++printed with a list-like syntax. They do not affect the printing of ++symbols, strings, and bit vectors. ++ ++Examples:: ++.......... ++ ++ (setq a '(1 (2 (3 (4 (5 (6))))))) => (1 (2 (3 (4 (5 (6)))))) ++ (dotimes (i 8) ++ (let ((*print-level* i)) ++ (format t "~&~D -- ~S~ ++ |> 0 -- # ++ |> 1 -- (1 #) ++ |> 2 -- (1 (2 #)) ++ |> 3 -- (1 (2 (3 #))) ++ |> 4 -- (1 (2 (3 (4 #)))) ++ |> 5 -- (1 (2 (3 (4 (5 #))))) ++ |> 6 -- (1 (2 (3 (4 (5 (6)))))) ++ |> 7 -- (1 (2 (3 (4 (5 (6)))))) ++ => NIL ++ ++ (setq a '(1 2 3 4 5 6)) => (1 2 3 4 5 6) ++ (dotimes (i 7) ++ (let ((*print-length* i)) ++ (format t "~&~D -- ~S~ ++ |> 0 -- (...) ++ |> 1 -- (1 ...) ++ |> 2 -- (1 2 ...) ++ |> 3 -- (1 2 3 ...) ++ |> 4 -- (1 2 3 4 ...) ++ |> 5 -- (1 2 3 4 5 6) ++ |> 6 -- (1 2 3 4 5 6) ++ => NIL ++ ++ (dolist (level-length '((0 1) (1 1) (1 2) (1 3) (1 4) ++ (2 1) (2 2) (2 3) (3 2) (3 3) (3 4))) ++ (let ((*print-level* (first level-length)) ++ (*print-length* (second level-length))) ++ (format t "~&~D ~D -- ~S~ ++ *print-level* *print-length* ++ '(if (member x y) (+ (car x) 3) '(foo . #(a b c d "Baz")))))) ++ |> 0 1 -- # ++ |> 1 1 -- (IF ...) ++ |> 1 2 -- (IF # ...) ++ |> 1 3 -- (IF # # ...) ++ |> 1 4 -- (IF # # #) ++ |> 2 1 -- (IF ...) ++ |> 2 2 -- (IF (MEMBER X ...) ...) ++ |> 2 3 -- (IF (MEMBER X Y) (+ # 3) ...) ++ |> 3 2 -- (IF (MEMBER X ...) ...) ++ |> 3 3 -- (IF (MEMBER X Y) (+ (CAR X) 3) ...) ++ |> 3 4 -- (IF (MEMBER X Y) (+ (CAR X) 3) '(FOO . #(A B C D ...))) ++ => NIL ++ ++See Also:: ++.......... ++ ++*note write:: ++ ++ ++File: gcl.info, Node: *print-lines*, Next: *print-miser-width*, Prev: *print-level*, Up: Printer Dictionary ++ ++22.4.23 *print-lines* [Variable] ++-------------------------------- ++ ++Value Type:: ++............ ++ ++a non-negative integer, or nil. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++When the value of *print-lines* is other than nil, it is a limit on the ++number of output lines produced when something is pretty printed. If an ++attempt is made to go beyond that many lines, ".." is printed at the end ++of the last line followed by all of the suffixes (closing delimiters) ++that are pending to be printed. ++ ++Examples:: ++.......... ++ ++ (let ((*print-right-margin* 25) (*print-lines* 3)) ++ (pprint '(progn (setq a 1 b 2 c 3 d 4)))) ++ |> (PROGN (SETQ A 1 ++ |> B 2 ++ |> C 3 ..)) ++ => ++ ++Notes:: ++....... ++ ++The ".." notation is intentionally different than the "..." notation ++used for level abbreviation, so that the two different situations can be ++visually distinguished. ++ ++ This notation is used to increase the likelihood that the Lisp reader ++will signal an error if an attempt is later made to read the abbreviated ++output. Note however that if the truncation occurs in a string, as in ++"This string has been trunc..", the problem situation cannot be detected ++later and no such error will be signaled. ++ ++ ++File: gcl.info, Node: *print-miser-width*, Next: *print-pprint-dispatch*, Prev: *print-lines*, Up: Printer Dictionary ++ ++22.4.24 *print-miser-width* [Variable] ++-------------------------------------- ++ ++Value Type:: ++............ ++ ++a non-negative integer, or nil. ++ ++Initial Value:: ++............... ++ ++implementation-dependent ++ ++Description:: ++............. ++ ++If it is not nil, the pretty printer switches to a compact style of ++output (called miser style) whenever the width available for printing a ++substructure is less than or equal to this many ems. ++ ++ ++File: gcl.info, Node: *print-pprint-dispatch*, Next: *print-pretty*, Prev: *print-miser-width*, Up: Printer Dictionary ++ ++22.4.25 *print-pprint-dispatch* [Variable] ++------------------------------------------ ++ ++Value Type:: ++............ ++ ++a pprint dispatch table. ++ ++Initial Value:: ++............... ++ ++implementation-dependent, but the initial entries all use a special ++class of priorities that have the property that they are less than every ++priority that can be specified using set-pprint-dispatch, so that the ++initial contents of any entry can be overridden. ++ ++Description:: ++............. ++ ++The pprint dispatch table which currently controls the pretty printer. ++ ++See Also:: ++.......... ++ ++*print-pretty*, *note Pretty Print Dispatch Tables:: ++ ++Notes:: ++....... ++ ++The intent is that the initial value of this variable should cause ++'traditional' pretty printing of code. In general, however, you can put ++a value in *print-pprint-dispatch* that makes pretty-printed output look ++exactly like non-pretty-printed output. ++ ++ Setting *print-pretty* to true just causes the functions contained in ++the current pprint dispatch table to have priority over normal ++print-object methods; it has no magic way of enforcing that those ++functions actually produce pretty output. For details, see *note Pretty ++Print Dispatch Tables::. ++ ++ ++File: gcl.info, Node: *print-pretty*, Next: *print-readably*, Prev: *print-pprint-dispatch*, Up: Printer Dictionary ++ ++22.4.26 *print-pretty* [Variable] ++--------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++Controls whether the Lisp printer calls the pretty printer. ++ ++ If it is false, the pretty printer is not used and ++ ++ a minimum ++ ++ of whitespace_1 is output when printing an expression. ++ ++ If it is true, the pretty printer is used, and the Lisp printer will ++endeavor to insert extra whitespace_1 where appropriate to make ++expressions more readable. ++ ++ *print-pretty* has an effect even when the value of *print-escape* is ++false. ++ ++Examples:: ++.......... ++ ++ (setq *print-pretty* 'nil) => NIL ++ (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil) ++ |> (LET ((A 1) (B 2) (C 3)) (+ A B C)) ++ => NIL ++ (let ((*print-pretty* t)) ++ (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil)) ++ |> (LET ((A 1) ++ |> (B 2) ++ |> (C 3)) ++ |> (+ A B C)) ++ => NIL ++ ;; Note that the first two expressions printed by this next form ++ ;; differ from the second two only in whether escape characters are printed. ++ ;; In all four cases, extra whitespace is inserted by the pretty printer. ++ (flet ((test (x) ++ (let ((*print-pretty* t)) ++ (print x) ++ (format t "~ ++ (terpri) (princ x) (princ " ") ++ (format t "~ ++ (test '#'(lambda () (list "a" #'c #'d)))) ++ |> #'(LAMBDA () ++ |> (LIST "a" #'C #'D)) ++ |> #'(LAMBDA () ++ |> (LIST "a" #'C #'D)) ++ |> #'(LAMBDA () ++ |> (LIST a b 'C #'D)) ++ |> #'(LAMBDA () ++ |> (LIST a b 'C #'D)) ++ => NIL ++ ++See Also:: ++.......... ++ ++*note write:: ++ ++ ++File: gcl.info, Node: *print-readably*, Next: *print-right-margin*, Prev: *print-pretty*, Up: Printer Dictionary ++ ++22.4.27 *print-readably* [Variable] ++----------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++false. ++ ++Description:: ++............. ++ ++If *print-readably* is true, some special rules for printing objects go ++into effect. Specifically, printing any object O_1 produces a printed ++representation that, when seen by the Lisp reader while the standard ++readtable is in effect, will produce an object O_2 that is similar to ++O_1. The printed representation produced might or might not be the same ++as the printed representation produced when *print-readably* is false. ++If printing an object readably is not possible, an error of type ++print-not-readable is signaled rather than using a syntax (e.g., the ++"#<" syntax) that would not be readable by the same implementation. If ++the value of some other printer control variable is such that these ++requirements would be violated, the value of that other variable is ++ignored. ++ ++ Specifically, if *print-readably* is true, printing proceeds as if ++*print-escape*, *print-array*, and *print-gensym* were also true, and as ++if *print-length*, *print-level*, and *print-lines* were false. ++ ++ If *print-readably* is false, the normal rules for printing and the ++normal interpretations of other printer control variables are in effect. ++ ++ Individual methods for print-object, including user-defined methods, ++are responsible for implementing these requirements. ++ ++ If *read-eval* is false and *print-readably* is true, any such method ++that would output a reference to the "#." reader macro will either ++output something else or will signal an error (as described above). ++ ++Examples:: ++.......... ++ ++ (let ((x (list "a" '\a (gensym) '((a (b (c))) d e f g))) ++ (*print-escape* nil) ++ (*print-gensym* nil) ++ (*print-level* 3) ++ (*print-length* 3)) ++ (write x) ++ (let ((*print-readably* t)) ++ (terpri) ++ (write x) ++ :done)) ++ |> (a a G4581 ((A #) D E ...)) ++ |> ("a" |a| #:G4581 ((A (B (C))) D E F G)) ++ => :DONE ++ ++ ;; This is setup code is shared between the examples ++ ;; of three hypothetical implementations which follow. ++ (setq table (make-hash-table)) => # ++ (setf (gethash table 1) 'one) => ONE ++ (setf (gethash table 2) 'two) => TWO ++ ++ ;; Implementation A ++ (let ((*print-readably* t)) (print table)) ++ Error: Can't print # readably. ++ ++ ;; Implementation B ++ ;; No standardized #S notation for hash tables is defined, ++ ;; but there might be an implementation-defined notation. ++ (let ((*print-readably* t)) (print table)) ++ |> #S(HASH-TABLE :TEST EQL :SIZE 120 :CONTENTS (1 ONE 2 TWO)) ++ => # ++ ++ ;; Implementation C ++ ;; Note that #. notation can only be used if *READ-EVAL* is true. ++ ;; If *READ-EVAL* were false, this same implementation might have to ++ ;; signal an error unless it had yet another printing strategy to fall ++ ;; back on. ++ (let ((*print-readably* t)) (print table)) ++ |> #.(LET ((HASH-TABLE (MAKE-HASH-TABLE))) ++ |> (SETF (GETHASH 1 HASH-TABLE) ONE) ++ |> (SETF (GETHASH 2 HASH-TABLE) TWO) ++ |> HASH-TABLE) ++ => # ++ ++See Also:: ++.......... ++ ++*note write:: , *note print-unreadable-object:: ++ ++Notes:: ++....... ++ ++The rules for "similarity" imply that #A or #( syntax cannot be used for ++arrays of element type other than t. An implementation will have to use ++another syntax or signal an error of type print-not-readable. ++ ++ ++File: gcl.info, Node: *print-right-margin*, Next: print-not-readable, Prev: *print-readably*, Up: Printer Dictionary ++ ++22.4.28 *print-right-margin* [Variable] ++--------------------------------------- ++ ++Value Type:: ++............ ++ ++a non-negative integer, or nil. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++If it is non-nil, it specifies the right margin (as integer number of ++ems) to use when the pretty printer is making layout decisions. ++ ++ If it is nil, the right margin is taken to be the maximum line length ++such that output can be displayed without wraparound or truncation. If ++this cannot be determined, an implementation-dependent value is used. ++ ++Notes:: ++....... ++ ++This measure is in units of ems in order to be compatible with ++implementation-defined variable-width fonts while still not requiring ++the language to provide support for fonts. ++ ++ ++File: gcl.info, Node: print-not-readable, Next: print-not-readable-object, Prev: *print-right-margin*, Up: Printer Dictionary ++ ++22.4.29 print-not-readable [Condition Type] ++------------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++print-not-readable, error, serious-condition, condition, t ++ ++Description:: ++............. ++ ++The type print-not-readable consists of error conditions that occur ++during output while *print-readably* is true, as a result of attempting ++to write a printed representation with the Lisp printer that would not ++be correctly read back with the Lisp reader. The object which could not ++be printed is initialized by the :object initialization argument to ++make-condition, and is accessed by the function ++print-not-readable-object. ++ ++See Also:: ++.......... ++ ++*note print-not-readable-object:: ++ ++ ++File: gcl.info, Node: print-not-readable-object, Next: format, Prev: print-not-readable, Up: Printer Dictionary ++ ++22.4.30 print-not-readable-object [Function] ++-------------------------------------------- ++ ++'print-not-readable-object' condition => object ++ ++Arguments and Values:: ++...................... ++ ++condition--a condition of type print-not-readable. ++ ++ object--an object. ++ ++Description:: ++............. ++ ++Returns the object that could not be printed readably in the situation ++represented by condition. ++ ++See Also:: ++.......... ++ ++print-not-readable, *note Conditions:: ++ ++ ++File: gcl.info, Node: format, Prev: print-not-readable-object, Up: Printer Dictionary ++ ++22.4.31 format [Function] ++------------------------- ++ ++'format' destination control-string &rest args => result ++ ++Arguments and Values:: ++...................... ++ ++destination--nil, t, a stream, or a string with a fill pointer. ++ ++ control-string--a format control. ++ ++ args--format arguments for control-string. ++ ++ result--if destination is non-nil, then nil; otherwise, a string. ++ ++Description:: ++............. ++ ++format produces formatted output by outputting the characters of ++control-string and observing that a tilde introduces a directive. The ++character after the tilde, possibly preceded by prefix parameters and ++modifiers, specifies what kind of formatting is desired. Most ++directives use one or more elements of args to create their output. ++ ++ If destination is a string, a stream, or t, then the result is nil. ++Otherwise, the result is a string containing the 'output.' ++ ++ format is useful for producing nicely formatted text, producing ++good-looking messages, and so on. format can generate and return a ++string or output to destination. ++ ++ For details on how the control-string is interpreted, see *note ++Formatted Output::. ++ ++Affected By:: ++............. ++ ++*standard-output*, *print-escape*, *print-radix*, *print-base*, ++*print-circle*, *print-pretty*, *print-level*, *print-length*, ++*print-case*, *print-gensym*, *print-array*. ++ ++Exceptional Situations:: ++........................ ++ ++If destination is a string with a fill pointer, the consequences are ++undefined if destructive modifications are performed directly on the ++string during the dynamic extent of the call. ++ ++See Also:: ++.......... ++ ++*note write:: , *note Documentation of Implementation-Defined Scripts:: ++ ++ ++File: gcl.info, Node: Reader, Next: System Construction, Prev: Printer, Up: Top ++ ++23 Reader ++********* ++ ++* Menu: ++ ++* Reader Concepts:: ++* Reader Dictionary:: ++ ++ ++File: gcl.info, Node: Reader Concepts, Next: Reader Dictionary, Prev: Reader, Up: Reader ++ ++23.1 Reader Concepts ++==================== ++ ++* Menu: ++ ++* Dynamic Control of the Lisp Reader:: ++* Effect of Readtable Case on the Lisp Reader:: ++* Argument Conventions of Some Reader Functions:: ++ ++ ++File: gcl.info, Node: Dynamic Control of the Lisp Reader, Next: Effect of Readtable Case on the Lisp Reader, Prev: Reader Concepts, Up: Reader Concepts ++ ++23.1.1 Dynamic Control of the Lisp Reader ++----------------------------------------- ++ ++Various aspects of the Lisp reader can be controlled dynamically. See ++*note Readtables:: and *note Variables that affect the Lisp Reader::. ++ ++ ++File: gcl.info, Node: Effect of Readtable Case on the Lisp Reader, Next: Argument Conventions of Some Reader Functions, Prev: Dynamic Control of the Lisp Reader, Up: Reader Concepts ++ ++23.1.2 Effect of Readtable Case on the Lisp Reader ++-------------------------------------------------- ++ ++The readtable case of the current readtable affects the Lisp reader in ++the following ways: ++ ++:upcase ++ When the readtable case is :upcase, unescaped constituent ++ characters are converted to uppercase, as specified in *note Reader ++ Algorithm::. ++ ++:downcase ++ When the readtable case is :downcase, unescaped constituent ++ characters are converted to lowercase. ++ ++:preserve ++ When the readtable case is :preserve, the case of all characters ++ remains unchanged. ++ ++:invert ++ When the readtable case is :invert, then if all of the unescaped ++ letters in the extended token are of the same case, those ++ (unescaped) letters are converted to the opposite case. ++ ++* Menu: ++ ++* Examples of Effect of Readtable Case on the Lisp Reader:: ++ ++ ++File: gcl.info, Node: Examples of Effect of Readtable Case on the Lisp Reader, Prev: Effect of Readtable Case on the Lisp Reader, Up: Effect of Readtable Case on the Lisp Reader ++ ++23.1.2.1 Examples of Effect of Readtable Case on the Lisp Reader ++................................................................ ++ ++ (defun test-readtable-case-reading () ++ (let ((*readtable* (copy-readtable nil))) ++ (format t "READTABLE-CASE Input Symbol-name~ ++ ~ ++ ~ ++ (dolist (readtable-case '(:upcase :downcase :preserve :invert)) ++ (setf (readtable-case *readtable*) readtable-case) ++ (dolist (input '("ZEBRA" "Zebra" "zebra")) ++ (format t "~&:~A~16T~A~24T~A" ++ (string-upcase readtable-case) ++ input ++ (symbol-name (read-from-string input))))))) ++ ++ The output from (test-readtable-case-reading) should be as follows: ++ ++ READTABLE-CASE Input Symbol-name ++ ------------------------------------- ++ :UPCASE ZEBRA ZEBRA ++ :UPCASE Zebra ZEBRA ++ :UPCASE zebra ZEBRA ++ :DOWNCASE ZEBRA zebra ++ :DOWNCASE Zebra zebra ++ :DOWNCASE zebra zebra ++ :PRESERVE ZEBRA ZEBRA ++ :PRESERVE Zebra Zebra ++ :PRESERVE zebra zebra ++ :INVERT ZEBRA zebra ++ :INVERT Zebra Zebra ++ :INVERT zebra ZEBRA ++ ++ ++File: gcl.info, Node: Argument Conventions of Some Reader Functions, Prev: Effect of Readtable Case on the Lisp Reader, Up: Reader Concepts ++ ++23.1.3 Argument Conventions of Some Reader Functions ++---------------------------------------------------- ++ ++* Menu: ++ ++* The EOF-ERROR-P argument:: ++* The RECURSIVE-P argument:: ++ ++ ++File: gcl.info, Node: The EOF-ERROR-P argument, Next: The RECURSIVE-P argument, Prev: Argument Conventions of Some Reader Functions, Up: Argument Conventions of Some Reader Functions ++ ++23.1.3.1 The EOF-ERROR-P argument ++................................. ++ ++Eof-error-p in input function calls controls what happens if input is ++from a file (or any other input source that has a definite end) and the ++end of the file is reached. If eof-error-p is true (the default), an ++error of type end-of-file is signaled at end of file. If it is false, ++then no error is signaled, and instead the function returns eof-value. ++ ++ Functions such as read that read the representation of an object ++rather than a single character always signals an error, regardless of ++eof-error-p, if the file ends in the middle of an object representation. ++For example, if a file does not contain enough right parentheses to ++balance the left parentheses in it, read signals an error. If a file ++ends in a symbol or a number immediately followed by end-of-file, read ++reads the symbol or number successfully and when called again will act ++according to eof-error-p. Similarly, the function read-line ++successfully reads the last line of a file even if that line is ++terminated by end-of-file rather than the newline character. Ignorable ++text, such as lines containing only whitespace_2 or comments, are not ++considered to begin an object; if read begins to read an expression but ++sees only such ignorable text, it does not consider the file to end in ++the middle of an object. Thus an eof-error-p argument controls what ++happens when the file ends between objects. ++ ++ ++File: gcl.info, Node: The RECURSIVE-P argument, Prev: The EOF-ERROR-P argument, Up: Argument Conventions of Some Reader Functions ++ ++23.1.3.2 The RECURSIVE-P argument ++................................. ++ ++If recursive-p is supplied and not nil, it specifies that this function ++call is not an outermost call to read but an embedded call, typically ++from a reader macro function. It is important to distinguish such ++recursive calls for three reasons. ++ ++1. ++ An outermost call establishes the context within which the #n= and ++ #n# syntax is scoped. Consider, for example, the expression ++ ++ (cons '#3=(p q r) '(x y . #3#)) ++ ++ If the single-quote reader macro were defined in this way: ++ ++ (set-macro-character #\' ;incorrect ++ #'(lambda (stream char) ++ (declare (ignore char)) ++ (list 'quote (read stream)))) ++ ++ then each call to the single-quote reader macro function would ++ establish independent contexts for the scope of read information, ++ including the scope of identifications between markers like "#3=" ++ and "#3#". However, for this expression, the scope was clearly ++ intended to be determined by the outer set of parentheses, so such ++ a definition would be incorrect. The correct way to define the ++ single-quote reader macro uses recursive-p: ++ ++ (set-macro-character #\' ;correct ++ #'(lambda (stream char) ++ (declare (ignore char)) ++ (list 'quote (read stream t nil t)))) ++ ++2. ++ A recursive call does not alter whether the reading process is to ++ preserve whitespace_2 or not (as determined by whether the ++ outermost call was to read or read-preserving-whitespace). Suppose ++ again that single-quote were to be defined as shown above in the ++ incorrect definition. Then a call to read-preserving-whitespace ++ that read the expression 'foo would fail to preserve the ++ space character following the symbol foo because the single-quote ++ reader macro function calls read, not read-preserving-whitespace, ++ to read the following expression (in this case foo). The correct ++ definition, which passes the value true for recursive-p to read, ++ allows the outermost call to determine whether whitespace_2 is ++ preserved. ++ ++3. ++ When end-of-file is encountered and the eof-error-p argument is not ++ nil, the kind of error that is signaled may depend on the value of ++ recursive-p. If recursive-p is true, then the end-of-file is ++ deemed to have occurred within the middle of a printed ++ representation; if recursive-p is false, then the end-of-file may ++ be deemed to have occurred between objects rather than within the ++ middle of one. ++ ++ ++File: gcl.info, Node: Reader Dictionary, Prev: Reader Concepts, Up: Reader ++ ++23.2 Reader Dictionary ++====================== ++ ++* Menu: ++ ++* readtable:: ++* copy-readtable:: ++* make-dispatch-macro-character:: ++* read:: ++* read-delimited-list:: ++* read-from-string:: ++* readtable-case:: ++* readtablep:: ++* set-dispatch-macro-character:: ++* set-macro-character:: ++* set-syntax-from-char:: ++* with-standard-io-syntax:: ++* *read-base*:: ++* *read-default-float-format*:: ++* *read-eval*:: ++* *read-suppress*:: ++* *readtable*:: ++* reader-error:: ++ ++ ++File: gcl.info, Node: readtable, Next: copy-readtable, Prev: Reader Dictionary, Up: Reader Dictionary ++ ++23.2.1 readtable [System Class] ++------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++readtable, t ++ ++Description:: ++............. ++ ++A readtable maps characters into syntax types for the Lisp reader; see ++*note Syntax::. A readtable also contains associations between macro ++characters and their reader macro functions, and records information ++about the case conversion rules to be used by the Lisp reader when ++parsing symbols. ++ ++ Each simple character must be representable in the readtable. It is ++implementation-defined whether non-simple characters can have syntax ++descriptions in the readtable. ++ ++See Also:: ++.......... ++ ++*note Readtables::, *note Printing Other Objects:: ++ ++ ++File: gcl.info, Node: copy-readtable, Next: make-dispatch-macro-character, Prev: readtable, Up: Reader Dictionary ++ ++23.2.2 copy-readtable [Function] ++-------------------------------- ++ ++'copy-readtable' &optional from-readtable to-readtable => readtable ++ ++Arguments and Values:: ++...................... ++ ++from-readtable--a readtable designator. The default is the current ++readtable. ++ ++ to-readtable--a readtable or nil. The default is nil. ++ ++ readtable--the to-readtable if it is non-nil, or else a fresh ++readtable. ++ ++Description:: ++............. ++ ++copy-readtable copies from-readtable. ++ ++ If to-readtable is nil, a new readtable is created and returned. ++Otherwise the readtable specified by to-readtable is modified and ++returned. ++ ++ copy-readtable copies the setting of readtable-case. ++ ++Examples:: ++.......... ++ ++ (setq zvar 123) => 123 ++ (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) => T ++ zvar => 123 ++ (copy-readtable table2 *readtable*) => # ++ zvar => VAR ++ (setq *readtable* (copy-readtable)) => # ++ zvar => VAR ++ (setq *readtable* (copy-readtable nil)) => # ++ zvar => 123 ++ ++See Also:: ++.......... ++ ++readtable, *note readtable:: ++ ++Notes:: ++....... ++ ++ (setq *readtable* (copy-readtable nil)) ++ ++ restores the input syntax to standard Common Lisp syntax, even if the ++initial readtable has been clobbered (assuming it is not so badly ++clobbered that you cannot type in the above expression). ++ ++ On the other hand, ++ ++ (setq *readtable* (copy-readtable)) ++ ++ replaces the current readtable with a copy of itself. This is useful ++if you want to save a copy of a readtable for later use, protected from ++alteration in the meantime. It is also useful if you want to locally ++bind the readtable to a copy of itself, as in: ++ ++ (let ((*readtable* (copy-readtable))) ...) ++ ++ ++File: gcl.info, Node: make-dispatch-macro-character, Next: read, Prev: copy-readtable, Up: Reader Dictionary ++ ++23.2.3 make-dispatch-macro-character [Function] ++----------------------------------------------- ++ ++'make-dispatch-macro-character' char &optional non-terminating-p ++readtable => t ++ ++Arguments and Values:: ++...................... ++ ++char--a character. ++ ++ non-terminating-p--a generalized boolean. The default is false. ++ ++ readtable--a readtable. The default is the current readtable. ++ ++Description:: ++............. ++ ++make-dispatch-macro-character makes char be a dispatching macro ++character in readtable. ++ ++ Initially, every character in the dispatch table associated with the ++char has an associated function that signals an error of type ++reader-error. ++ ++ If non-terminating-p is true, the dispatching macro character is made ++a non-terminating macro character; if non-terminating-p is false, the ++dispatching macro character is made a terminating macro character. ++ ++Examples:: ++.......... ++ ++ (get-macro-character #\{) => NIL, false ++ (make-dispatch-macro-character #\{) => T ++ (not (get-macro-character #\{)) => false ++ ++ The readtable is altered. ++ ++See Also:: ++.......... ++ ++*note readtable:: , *note set-dispatch-macro-character:: ++ ++ ++File: gcl.info, Node: read, Next: read-delimited-list, Prev: make-dispatch-macro-character, Up: Reader Dictionary ++ ++23.2.4 read, read-preserving-whitespace [Function] ++-------------------------------------------------- ++ ++'read' &optional input-stream eof-error-p eof-value recursive-p => ++object ++ ++ 'read-preserving-whitespace' &optional input-stream eof-error-p ++eof-value recursive-p ++=> object ++ ++Arguments and Values:: ++...................... ++ ++input-stream--an input stream designator. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. ++ ++ The default is nil. ++ ++ recursive-p--a generalized boolean. The default is false. ++ ++ object--an object (parsed by the Lisp reader) or the eof-value. ++ ++Description:: ++............. ++ ++read parses the printed representation of an object from input-stream ++and builds such an object. ++ ++ read-preserving-whitespace is like read but preserves any ++whitespace_2 character that delimits the printed representation of the ++object. read-preserving-whitespace is exactly like read when the ++recursive-p argument to read-preserving-whitespace is true. ++ ++ When *read-suppress* is false, read throws away the delimiting ++character required by certain printed representations if it is a ++whitespace_2 character; but read preserves the character (using ++unread-char) if it is syntactically meaningful, because it could be the ++start of the next expression. ++ ++ If a file ends in a symbol or a number immediately followed by an end ++of file_1, read reads the symbol or number successfully; when called ++again, it sees the end of file_1 and only then acts according to ++eof-error-p. If a file contains ignorable text at the end, such as ++blank lines and comments, read does not consider it to end in the middle ++of an object. ++ ++ If recursive-p is true, the call to read is expected to be made from ++within some function that itself has been called from read or from a ++similar input function, rather than from the top level. ++ ++ Both functions return the object read from input-stream. Eof-value ++is returned if eof-error-p is false and end of file is reached before ++the beginning of an object. ++ ++Examples:: ++.......... ++ ++ (read) ++ |> |>>'a<<| ++ => (QUOTE A) ++ (with-input-from-string (is " ") (read is nil 'the-end)) => THE-END ++ (defun skip-then-read-char (s c n) ++ (if (char= c #\{) (read s t nil t) (read-preserving-whitespace s)) ++ (read-char-no-hang s)) => SKIP-THEN-READ-CHAR ++ (let ((*readtable* (copy-readtable nil))) ++ (set-dispatch-macro-character #\# #\{ #'skip-then-read-char) ++ (set-dispatch-macro-character #\# #\} #'skip-then-read-char) ++ (with-input-from-string (is "#{123 x #}123 y") ++ (format t "~S ~S" (read is) (read is)))) => #\x, #\Space, NIL ++ ++ As an example, consider this reader macro definition: ++ ++ (defun slash-reader (stream char) ++ (declare (ignore char)) ++ `(path . ,(loop for dir = (read-preserving-whitespace stream t nil t) ++ then (progn (read-char stream t nil t) ++ (read-preserving-whitespace stream t nil t)) ++ collect dir ++ while (eql (peek-char nil stream nil nil t) #\/)))) ++ (set-macro-character #\/ #'slash-reader) ++ ++ Consider now calling read on this expression: ++ ++ (zyedh /usr/games/zork /usr/games/boggle) ++ ++ The / macro reads objects separated by more / characters; thus ++/usr/games/zork is intended to read as (path usr games zork). The ++entire example expression should therefore be read as ++ ++ (zyedh (path usr games zork) (path usr games boggle)) ++ ++ However, if read had been used instead of read-preserving-whitespace, ++then after the reading of the symbol zork, the following space would be ++discarded; the next call to peek-char would see the following /, and the ++loop would continue, producing this interpretation: ++ ++ (zyedh (path usr games zork usr games boggle)) ++ ++ There are times when whitespace_2 should be discarded. If a command ++interpreter takes single-character commands, but occasionally reads an ++object then if the whitespace_2 after a symbol is not discarded it might ++be interpreted as a command some time later after the symbol had been ++read. ++ ++Affected By:: ++............. ++ ++*standard-input*, *terminal-io*, *readtable*, ++*read-default-float-format*, *read-base*, *read-suppress*, *package*, ++*read-eval*. ++ ++Exceptional Situations:: ++........................ ++ ++read signals an error of type end-of-file, regardless of eof-error-p, if ++the file ends in the middle of an object representation. For example, ++if a file does not contain enough right parentheses to balance the left ++parentheses in it, read signals an error. This is detected when read or ++read-preserving-whitespace is called with recursive-p and eof-error-p ++non-nil, and end-of-file is reached before the beginning of an object. ++ ++ If eof-error-p is true, an error of type end-of-file is signaled at ++the end of file. ++ ++See Also:: ++.......... ++ ++*note peek-char:: , *note read-char:: , *note unread-char:: , *note ++read-from-string:: , *note read-delimited-list:: , *note parse-integer:: ++, *note Syntax::, *note Reader Concepts:: ++ ++ ++File: gcl.info, Node: read-delimited-list, Next: read-from-string, Prev: read, Up: Reader Dictionary ++ ++23.2.5 read-delimited-list [Function] ++------------------------------------- ++ ++'read-delimited-list' char &optional input-stream recursive-p => list ++ ++Arguments and Values:: ++...................... ++ ++char--a character. ++ ++ input-stream--an input stream designator. The default is standard ++input. ++ ++ recursive-p--a generalized boolean. The default is false. ++ ++ list--a list of the objects read. ++ ++Description:: ++............. ++ ++read-delimited-list reads objects from input-stream until the next ++character after an object's representation (ignoring whitespace_2 ++characters and comments) is char. ++ ++ read-delimited-list looks ahead at each step for the next ++non-whitespace_2 character and peeks at it as if with peek-char. If it ++is char, then the character is consumed and the list of objects is ++returned. If it is a constituent or escape character, then read is used ++to read an object, which is added to the end of the list. If it is a ++macro character, its reader macro function is called; if the function ++returns a value, that value is added to the list. The peek-ahead ++process is then repeated. ++ ++ If recursive-p is true, this call is expected to be embedded in a ++higher-level call to read or a similar function. ++ ++ It is an error to reach end-of-file during the operation of ++read-delimited-list. ++ ++ The consequences are undefined if char has a syntax type of ++whitespace_2 in the current readtable. ++ ++Examples:: ++.......... ++ ++ (read-delimited-list #\]) 1 2 3 4 5 6 ] ++ => (1 2 3 4 5 6) ++ ++ Suppose you wanted #{a b c ... z} to read as a list of all pairs of ++the elements a, b, c, ..., z, for example. ++ ++ #{p q z a} reads as ((p q) (p z) (p a) (q z) (q a) (z a)) ++ ++ This can be done by specifying a macro-character definition for #{ ++that does two things: reads in all the items up to the }, and constructs ++the pairs. read-delimited-list performs the first task. ++ ++ (defun |#{-reader| (stream char arg) ++ (declare (ignore char arg)) ++ (mapcon #'(lambda (x) ++ (mapcar #'(lambda (y) (list (car x) y)) (cdr x))) ++ (read-delimited-list #\} stream t))) => |#{-reader| ++ ++ (set-dispatch-macro-character #\# #\{ #'|#{-reader|) => T ++ (set-macro-character #\} (get-macro-character #\) nil)) ++ ++ Note that true is supplied for the recursive-p argument. ++ ++ It is necessary here to give a definition to the character } as well ++to prevent it from being a constituent. If the line ++ ++ (set-macro-character #\} (get-macro-character #\) nil)) ++ ++ shown above were not included, then the } in ++ ++ #{ p q z a} ++ ++ would be considered a constituent character, part of the symbol named ++a}. This could be corrected by putting a space before the }, but it is ++better to call set-macro-character. ++ ++ Giving } the same definition as the standard definition of the ++character ) has the twin benefit of making it terminate tokens for use ++with read-delimited-list and also making it invalid for use in any other ++context. Attempting to read a stray } will signal an error. ++ ++Affected By:: ++............. ++ ++*standard-input*, *readtable*, *terminal-io*. ++ ++See Also:: ++.......... ++ ++*note read:: , *note peek-char:: , *note read-char:: , *note ++unread-char:: . ++ ++Notes:: ++....... ++ ++read-delimited-list is intended for use in implementing reader macros. ++Usually it is desirable for char to be a terminating macro character so ++that it can be used to delimit tokens; however, read-delimited-list ++makes no attempt to alter the syntax specified for char by the current ++readtable. The caller must make any necessary changes to the readtable ++syntax explicitly. ++ ++ ++File: gcl.info, Node: read-from-string, Next: readtable-case, Prev: read-delimited-list, Up: Reader Dictionary ++ ++23.2.6 read-from-string [Function] ++---------------------------------- ++ ++'read-from-string' string &optional eof-error-p eof-value &key start end ++preserve-whitespace ++=> object, position ++ ++Arguments and Values:: ++...................... ++ ++string--a string. ++ ++ eof-error-p--a generalized boolean. The default is true. ++ ++ eof-value--an object. ++ ++ The default is nil. ++ ++ start, end--bounding index designators of string. The defaults for ++start and end are 0 and nil, respectively. ++ ++ preserve-whitespace--a generalized boolean. The default is false. ++ ++ object--an object (parsed by the Lisp reader) or the eof-value. ++ ++ position--an integer greater than or equal to zero, and less than or ++equal to one more than the length of the string. ++ ++Description:: ++............. ++ ++Parses the printed representation of an object from the subsequence of ++string bounded by start and end, as if read had been called on an input ++stream containing those same characters. ++ ++ If preserve-whitespace is true, the operation will preserve ++whitespace_2 as read-preserving-whitespace would do. ++ ++ If an object is successfully parsed, the primary value, object, is ++the object that was parsed. If eof-error-p is false and if the end of ++the substring is reached, eof-value is returned. ++ ++ The secondary value, position, is the index of the first character in ++the bounded string that was not read. The position may depend upon the ++value of preserve-whitespace. If the entire string was read, the ++position returned is either the length of the string or one greater than ++the length of the string. ++ ++Examples:: ++.......... ++ ++ (read-from-string " 1 3 5" t nil :start 2) => 3, 5 ++ (read-from-string "(a b c)") => (A B C), 7 ++ ++Exceptional Situations:: ++........................ ++ ++If the end of the supplied substring occurs before an object can be ++read, an error is signaled if eof-error-p is true. An error is signaled ++if the end of the substring occurs in the middle of an incomplete ++object. ++ ++See Also:: ++.......... ++ ++*note read:: , read-preserving-whitespace ++ ++Notes:: ++....... ++ ++The reason that position is allowed to be beyond the length of the ++string is to permit (but not require) the implementation to work by ++simulating the effect of a trailing delimiter at the end of the bounded ++string. When preserve-whitespace is true, the position might count the ++simulated delimiter. ++ ++ ++File: gcl.info, Node: readtable-case, Next: readtablep, Prev: read-from-string, Up: Reader Dictionary ++ ++23.2.7 readtable-case [Accessor] ++-------------------------------- ++ ++'readtable-case' readtable => mode ++ ++ (setf (' readtable-case' readtable) mode) ++ ++Arguments and Values:: ++...................... ++ ++readtable--a readtable. ++ ++ mode--a case sensitivity mode. ++ ++Description:: ++............. ++ ++Accesses the readtable case of readtable, which affects the way in which ++the Lisp Reader reads symbols and the way in which the Lisp Printer ++writes symbols. ++ ++Examples:: ++.......... ++ ++See *note Examples of Effect of Readtable Case on the Lisp Reader:: and ++*note Examples of Effect of Readtable Case on the Lisp Printer::. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if readtable is not a ++readtable. Should signal an error of type type-error if mode is not a ++case sensitivity mode. ++ ++See Also:: ++.......... ++ ++*note readtable:: , *print-escape*, *note Reader Algorithm::, *note ++Effect of Readtable Case on the Lisp Reader::, *note Effect of Readtable ++Case on the Lisp Printer:: ++ ++Notes:: ++....... ++ ++copy-readtable copies the readtable case of the readtable. ++ ++ ++File: gcl.info, Node: readtablep, Next: set-dispatch-macro-character, Prev: readtable-case, Up: Reader Dictionary ++ ++23.2.8 readtablep [Function] ++---------------------------- ++ ++'readtablep' object => generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++Returns true if object is of type readtable; otherwise, returns false. ++ ++Examples:: ++.......... ++ ++ (readtablep *readtable*) => true ++ (readtablep (copy-readtable)) => true ++ (readtablep '*readtable*) => false ++ ++Notes:: ++....... ++ ++ (readtablep object) == (typep object 'readtable) ++ ++ ++File: gcl.info, Node: set-dispatch-macro-character, Next: set-macro-character, Prev: readtablep, Up: Reader Dictionary ++ ++23.2.9 set-dispatch-macro-character, get-dispatch-macro-character ++----------------------------------------------------------------- ++ ++ [Function] ++ ++ 'get-dispatch-macro-character' disp-char sub-char &optional readtable ++=> function ++ ++ 'set-dispatch-macro-character' disp-char sub-char new-function ++&optional readtable => t ++ ++Arguments and Values:: ++...................... ++ ++disp-char--a character. ++ ++ sub-char--a character. ++ ++ readtable--a readtable designator. ++ ++ The default is the current readtable. ++ ++ function--a function designator or nil. ++ ++ new-function--a function designator. ++ ++Description:: ++............. ++ ++set-dispatch-macro-character causes new-function to be called when ++disp-char followed by sub-char is read. If sub-char is a lowercase ++letter, it is converted to its uppercase equivalent. It is an error if ++sub-char is one of the ten decimal digits. ++ ++ set-dispatch-macro-character installs a new-function to be called ++when a particular dispatching macro character pair is read. ++New-function is installed as the dispatch function to be called when ++readtable is in use and when disp-char is followed by sub-char. ++ ++ For more information about how the new-function is invoked, see *note ++Macro Characters::. ++ ++ get-dispatch-macro-character retrieves the dispatch function ++associated with disp-char and sub-char in readtable. ++ ++ get-dispatch-macro-character returns the macro-character function for ++sub-char under disp-char, or nil if there is no function associated with ++sub-char. If sub-char is a decimal digit, get-dispatch-macro-character ++returns nil. ++ ++Examples:: ++.......... ++ ++ (get-dispatch-macro-character #\# #\{) => NIL ++ (set-dispatch-macro-character #\# #\{ ;dispatch on #{ ++ #'(lambda(s c n) ++ (let ((list (read s nil (values) t))) ;list is object after #n{ ++ (when (consp list) ;return nth element of list ++ (unless (and n (< 0 n (length list))) (setq n 0)) ++ (setq list (nth n list))) ++ list))) => T ++ #{(1 2 3 4) => 1 ++ #3{(0 1 2 3) => 3 ++ #{123 => 123 ++ ++ If it is desired that #$foo : as if it were (dollars foo). ++ ++ (defun |#$-reader| (stream subchar arg) ++ (declare (ignore subchar arg)) ++ (list 'dollars (read stream t nil t))) => |#$-reader| ++ (set-dispatch-macro-character #\# #\$ #'|#$-reader|) => T ++ ++See Also:: ++.......... ++ ++*note Macro Characters:: ++ ++Side Effects:: ++.............. ++ ++The readtable is modified. ++ ++Affected By:: ++............. ++ ++*readtable*. ++ ++Exceptional Situations:: ++........................ ++ ++For either function, an error is signaled if disp-char is not a ++dispatching macro character in readtable. ++ ++See Also:: ++.......... ++ ++*note readtable:: ++ ++Notes:: ++....... ++ ++It is necessary to use make-dispatch-macro-character to set up the ++dispatch character before specifying its sub-characters. ++ ++ ++File: gcl.info, Node: set-macro-character, Next: set-syntax-from-char, Prev: set-dispatch-macro-character, Up: Reader Dictionary ++ ++23.2.10 set-macro-character, get-macro-character [Function] ++----------------------------------------------------------- ++ ++'get-macro-character' char &optional readtable => function, ++non-terminating-p ++ ++ 'set-macro-character' char new-function &optional non-terminating-p ++readtable => t ++ ++Arguments and Values:: ++...................... ++ ++char--a character. ++ ++ non-terminating-p--a generalized boolean. The default is false. ++ ++ readtable--a readtable designator. ++ ++ The default is the current readtable. ++ ++ function--nil, or a designator for a function of two arguments. ++ ++ new-function--a function designator. ++ ++Description:: ++............. ++ ++get-macro-character returns as its primary value, function, the reader ++macro function associated with char in readtable (if any), or else nil ++if char is not a macro character in readtable. The secondary value, ++non-terminating-p, is true if char is a non-terminating macro character; ++otherwise, it is false. ++ ++ set-macro-character causes char to be a macro character associated ++with the reader macro function new-function (or the designator for ++new-function) in readtable. If non-terminating-p is true, char becomes ++a non-terminating macro character; otherwise it becomes a terminating ++macro character. ++ ++Examples:: ++.......... ++ ++ (get-macro-character #\{) => NIL, false ++ (not (get-macro-character #\;)) => false ++ ++ The following is a possible definition for the single-quote reader ++macro in standard syntax: ++ ++ (defun single-quote-reader (stream char) ++ (declare (ignore char)) ++ (list 'quote (read stream t nil t))) => SINGLE-QUOTE-READER ++ (set-macro-character #\' #'single-quote-reader) => T ++ ++ Here single-quote-reader reads an object following the single-quote ++and returns a list of quote and that object. The char argument is ++ignored. ++ ++ The following is a possible definition for the semicolon reader macro ++in standard syntax: ++ ++ (defun semicolon-reader (stream char) ++ (declare (ignore char)) ++ ;; First swallow the rest of the current input line. ++ ;; End-of-file is acceptable for terminating the comment. ++ (do () ((char= (read-char stream nil #\Newline t) #\Newline))) ++ ;; Return zero values. ++ (values)) => SEMICOLON-READER ++ (set-macro-character #\; #'semicolon-reader) => T ++ ++Side Effects:: ++.............. ++ ++The readtable is modified. ++ ++See Also:: ++.......... ++ ++*note readtable:: ++ ++ ++File: gcl.info, Node: set-syntax-from-char, Next: with-standard-io-syntax, Prev: set-macro-character, Up: Reader Dictionary ++ ++23.2.11 set-syntax-from-char [Function] ++--------------------------------------- ++ ++'set-syntax-from-char' to-char from-char &optional to-readtable ++from-readtable => t ++ ++Arguments and Values:: ++...................... ++ ++to-char--a character. ++ ++ from-char--a character. ++ ++ to-readtable--a readtable. The default is the current readtable. ++ ++ from-readtable--a readtable designator. The default is the standard ++readtable. ++ ++Description:: ++............. ++ ++set-syntax-from-char makes the syntax of to-char in to-readtable be the ++same as the syntax of from-char in from-readtable. ++ ++ set-syntax-from-char copies the syntax types of from-char. If ++from-char is a macro character, its reader macro function is copied ++also. If the character is a dispatching macro character, its entire ++dispatch table of reader macro functions is copied. The constituent ++traits of from-char are not copied. ++ ++ A macro definition from a character such as " can be copied to ++another character; the standard definition for " looks for another ++character that is the same as the character that invoked it. The ++definition of ( can not be meaningfully copied to {, on the other hand. ++The result is that lists are of the form {a b c), not {a b c}, because ++the definition always looks for a closing parenthesis, not a closing ++brace. ++ ++Examples:: ++.......... ++ ++ (set-syntax-from-char #\7 #\;) => T ++ 123579 => 1235 ++ ++Side Effects:: ++.............. ++ ++The to-readtable is modified. ++ ++Affected By:: ++............. ++ ++The existing values in the from-readtable. ++ ++See Also:: ++.......... ++ ++*note set-macro-character:: , *note make-dispatch-macro-character:: , ++*note Character Syntax Types:: ++ ++Notes:: ++....... ++ ++The constituent traits of a character are "hard wired" into the parser ++for extended tokens. For example, if the definition of S is copied to ++*, then * will become a constituent that is alphabetic_2 but that cannot ++be used as a short float exponent marker. For further information, see ++*note Constituent Traits::. ++ ++ ++File: gcl.info, Node: with-standard-io-syntax, Next: *read-base*, Prev: set-syntax-from-char, Up: Reader Dictionary ++ ++23.2.12 with-standard-io-syntax [Macro] ++--------------------------------------- ++ ++'with-standard-io-syntax' {form}* => {result}* ++ ++Arguments and Values:: ++...................... ++ ++forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++Within the dynamic extent of the body of forms, all reader/printer ++control variables, including any implementation-defined ones not ++specified by this standard, are bound to values that produce standard ++read/print behavior. The values for the variables specified by this ++standard are listed in Figure 23-1. ++ ++ [Reviewer Note by Barrett: *print-pprint-dispatch* should probably be ++mentioned here, too.] ++ ++ Variable Value ++ *package* The CL-USER package ++ *print-array* t ++ *print-base* 10 ++ *print-case* :upcase ++ *print-circle* nil ++ *print-escape* t ++ *print-gensym* t ++ *print-length* nil ++ *print-level* nil ++ *print-lines* nil ++ *print-miser-width* nil ++ *print-pprint-dispatch* The standard pprint dispatch table ++ *print-pretty* nil ++ *print-radix* nil ++ *print-readably* t ++ *print-right-margin* nil ++ *read-base* 10 ++ *read-default-float-format* single-float ++ *read-eval* t ++ *read-suppress* nil ++ *readtable* The standard readtable ++ ++ Figure 23-1: Values of standard control variables ++ ++ ++Examples:: ++.......... ++ ++ (with-open-file (file pathname :direction :output) ++ (with-standard-io-syntax ++ (print data file))) ++ ++ ;;; ... Later, in another Lisp: ++ ++ (with-open-file (file pathname :direction :input) ++ (with-standard-io-syntax ++ (setq data (read file)))) ++ ++ ++File: gcl.info, Node: *read-base*, Next: *read-default-float-format*, Prev: with-standard-io-syntax, Up: Reader Dictionary ++ ++23.2.13 *read-base* [Variable] ++------------------------------ ++ ++Value Type:: ++............ ++ ++a radix. ++ ++Initial Value:: ++............... ++ ++10. ++ ++Description:: ++............. ++ ++Controls the interpretation of tokens by read as being integers or ++ratios. ++ ++ The value of *read-base*, called the current input base , is the ++radix in which integers and ratios are to be read by the Lisp reader. ++The parsing of other numeric types (e.g., floats) is not affected by ++this option. ++ ++ The effect of *read-base* on the reading of any particular rational ++number can be locally overridden by explicit use of the #O, #X, #B, or ++#nR syntax or by a trailing decimal point. ++ ++Examples:: ++.......... ++ ++ (dotimes (i 6) ++ (let ((*read-base* (+ 10. i))) ++ (let ((object (read-from-string "(\\DAD DAD |BEE| BEE 123. 123)"))) ++ (print (list *read-base* object))))) ++ |> (10 (DAD DAD BEE BEE 123 123)) ++ |> (11 (DAD DAD BEE BEE 123 146)) ++ |> (12 (DAD DAD BEE BEE 123 171)) ++ |> (13 (DAD DAD BEE BEE 123 198)) ++ |> (14 (DAD 2701 BEE BEE 123 227)) ++ |> (15 (DAD 3088 BEE 2699 123 258)) ++ => NIL ++ ++Notes:: ++....... ++ ++Altering the input radix can be useful when reading data files in ++special formats. ++ ++ ++File: gcl.info, Node: *read-default-float-format*, Next: *read-eval*, Prev: *read-base*, Up: Reader Dictionary ++ ++23.2.14 *read-default-float-format* [Variable] ++---------------------------------------------- ++ ++Value Type:: ++............ ++ ++one of the atomic type specifiers short-float, single-float, ++double-float, or long-float, or else some other type specifier defined ++by the implementation to be acceptable. ++ ++Initial Value:: ++............... ++ ++The symbol single-float. ++ ++Description:: ++............. ++ ++Controls the floating-point format that is to be used when reading a ++floating-point number that has no exponent marker or that has e or E for ++an exponent marker. Other exponent markers explicitly prescribe the ++floating-point format to be used. ++ ++ The printer uses *read-default-float-format* to guide the choice of ++exponent markers when printing floating-point numbers. ++ ++Examples:: ++.......... ++ ++ (let ((*read-default-float-format* 'double-float)) ++ (read-from-string "(1.0 1.0e0 1.0s0 1.0f0 1.0d0 1.0L0)")) ++ => (1.0 1.0 1.0 1.0 1.0 1.0) ;Implementation has float format F. ++ => (1.0 1.0 1.0s0 1.0 1.0 1.0) ;Implementation has float formats S and F. ++ => (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0d0) ;Implementation has float formats F and D. ++ => (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0d0) ;Implementation has float formats S, F, D. ++ => (1.0d0 1.0d0 1.0 1.0 1.0d0 1.0L0) ;Implementation has float formats F, D, L. ++ => (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0L0) ;Implementation has formats S, F, D, L. ++ ++ ++File: gcl.info, Node: *read-eval*, Next: *read-suppress*, Prev: *read-default-float-format*, Up: Reader Dictionary ++ ++23.2.15 *read-eval* [Variable] ++------------------------------ ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++true. ++ ++Description:: ++............. ++ ++If it is true, the #. reader macro has its normal effect. Otherwise, ++that reader macro signals an error of type reader-error. ++ ++See Also:: ++.......... ++ ++*print-readably* ++ ++Notes:: ++....... ++ ++If *read-eval* is false and *print-readably* is true, any method for ++print-object that would output a reference to the #. reader macro either ++outputs something different or signals an error of type ++print-not-readable. ++ ++ ++File: gcl.info, Node: *read-suppress*, Next: *readtable*, Prev: *read-eval*, Up: Reader Dictionary ++ ++23.2.16 *read-suppress* [Variable] ++---------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++false. ++ ++Description:: ++............. ++ ++This variable is intended primarily to support the operation of the ++read-time conditional notations #+ and #-. It is important for the ++reader macros which implement these notations to be able to skip over ++the printed representation of an expression despite the possibility that ++the syntax of the skipped expression may not be entirely valid for the ++current implementation, since #+ and #- exist in order to allow the same ++program to be shared among several Lisp implementations (including ++dialects other than Common Lisp) despite small incompatibilities of ++syntax. ++ ++ If it is false, the Lisp reader operates normally. ++ ++ If the value of *read-suppress* is true, read, ++read-preserving-whitespace, read-delimited-list, and read-from-string ++all return a primary value of nil when they complete successfully; ++however, they continue to parse the representation of an object in the ++normal way, in order to skip over the object, and continue to indicate ++end of file in the normal way. Except as noted below, any standardized ++reader macro_2 that is defined to read_2 a following object or token ++will do so, but not signal an error if the object read is not of an ++appropriate type or syntax. The standard syntax and its associated ++reader macros will not construct any new objects (e.g., when reading the ++representation of a symbol, no symbol will be constructed or interned). ++ ++Extended tokens ++ All extended tokens are completely uninterpreted. Errors such as ++ those that might otherwise be signaled due to detection of invalid ++ potential numbers, invalid patterns of package markers, and invalid ++ uses of the dot character are suppressed. ++ ++Dispatching macro characters (including sharpsign) ++ Dispatching macro characters continue to parse an infix numerical ++ argument, and invoke the dispatch function. The standardized ++ sharpsign reader macros do not enforce any constraints on either ++ the presence of or the value of the numerical argument. ++ ++#= ++ The #= notation is totally ignored. It does not read a following ++ object. It produces no object, but is treated as whitespace_2. ++ ++## ++ The ## notation always produces nil. ++ ++ No matter what the value of *read-suppress*, parentheses still ++continue to delimit and construct lists; the #( notation continues to ++delimit vectors; and comments, strings, and the single-quote and ++backquote notations continue to be interpreted properly. Such ++situations as '), #<, #), and # continue to signal errors. ++ ++Examples:: ++.......... ++ ++ (let ((*read-suppress* t)) ++ (mapcar #'read-from-string ++ '("#(foo bar baz)" "#P(:type :lisp)" "#c1.2" ++ "#.(PRINT 'FOO)" "#3AHELLO" "#S(INTEGER)" ++ "#*ABC" "#\GARBAGE" "#RALPHA" "#3R444"))) ++ => (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) ++ ++See Also:: ++.......... ++ ++*note read:: , *note Syntax:: ++ ++Notes:: ++....... ++ ++Programmers and implementations that define additional macro characters ++are strongly encouraged to make them respect *read-suppress* just as ++standardized macro characters do. That is, when the value of ++*read-suppress* is true, they should ignore type errors when reading a ++following object and the functions that implement dispatching macro ++characters should tolerate nil as their infix parameter value even if a ++numeric value would ordinarily be required. ++ ++ ++File: gcl.info, Node: *readtable*, Next: reader-error, Prev: *read-suppress*, Up: Reader Dictionary ++ ++23.2.17 *readtable* [Variable] ++------------------------------ ++ ++Value Type:: ++............ ++ ++a readtable. ++ ++Initial Value:: ++............... ++ ++A readtable that conforms to the description of Common Lisp syntax in ++*note Syntax::. ++ ++Description:: ++............. ++ ++The value of *readtable* is called the current readtable. It controls ++the parsing behavior of the Lisp reader, and can also influence the Lisp ++printer (e.g., see the function readtable-case). ++ ++Examples:: ++.......... ++ ++ (readtablep *readtable*) => true ++ (setq zvar 123) => 123 ++ (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) => T ++ zvar => 123 ++ (setq *readtable* table2) => # ++ zvar => VAR ++ (setq *readtable* (copy-readtable nil)) => # ++ zvar => 123 ++ ++Affected By:: ++............. ++ ++compile-file, load ++ ++See Also:: ++.......... ++ ++*note compile-file:: , *note load:: , *note readtable:: , *note The ++Current Readtable:: ++ ++ ++File: gcl.info, Node: reader-error, Prev: *readtable*, Up: Reader Dictionary ++ ++23.2.18 reader-error [Condition Type] ++------------------------------------- ++ ++Class Precedence List:: ++....................... ++ ++reader-error, parse-error, stream-error, error, serious-condition, ++condition, t ++ ++Description:: ++............. ++ ++The type reader-error consists of error conditions that are related to ++tokenization and parsing done by the Lisp reader. ++ ++See Also:: ++.......... ++ ++*note read:: , *note stream-error-stream:: , *note Reader Concepts:: ++ ++ ++File: gcl.info, Node: System Construction, Next: Environment, Prev: Reader, Up: Top ++ ++24 System Construction ++********************** ++ ++* Menu: ++ ++* System Construction Concepts:: ++* System Construction Dictionary:: ++ ++ ++File: gcl.info, Node: System Construction Concepts, Next: System Construction Dictionary, Prev: System Construction, Up: System Construction ++ ++24.1 System Construction Concepts ++================================= ++ ++* Menu: ++ ++* Loading:: ++* Features:: ++ ++ ++File: gcl.info, Node: Loading, Next: Features, Prev: System Construction Concepts, Up: System Construction Concepts ++ ++24.1.1 Loading ++-------------- ++ ++To load a file is to treat its contents as code and execute that code. ++The file may contain source code or compiled code . ++ ++ A file containing source code is called a source file . Loading a ++source file is accomplished essentially by sequentially reading_2 the ++forms in the file, evaluating each immediately after it is read. ++ ++ A file containing compiled code is called a compiled file . Loading ++a compiled file is similar to loading a source file, except that the ++file does not contain text but rather an implementation-dependent ++representation of pre-digested expressions created by the compiler. ++Often, a compiled file can be loaded more quickly than a source file. ++See *note Compilation::. ++ ++ The way in which a source file is distinguished from a compiled file ++is implementation-dependent. ++ ++ ++File: gcl.info, Node: Features, Prev: Loading, Up: System Construction Concepts ++ ++24.1.2 Features ++--------------- ++ ++A feature is an aspect or attribute of Common Lisp, of the ++implementation, or of the environment. A feature is identified by a ++symbol. ++ ++ A feature is said to be present in a Lisp image if and only if the ++symbol naming it is an element of the list held by the variable ++*features*, which is called the features list . ++ ++* Menu: ++ ++* Feature Expressions:: ++* Examples of Feature Expressions:: ++ ++ ++File: gcl.info, Node: Feature Expressions, Next: Examples of Feature Expressions, Prev: Features, Up: Features ++ ++24.1.2.1 Feature Expressions ++............................ ++ ++Boolean combinations of features, called feature expressions , are used ++by the #+ and #- reader macros in order to direct conditional reading of ++expressions by the Lisp reader. ++ ++ The rules for interpreting a feature expression are as follows: ++ ++feature ++ If a symbol naming a feature is used as a feature expression, the ++ feature expression succeeds if that feature is present; otherwise ++ it fails. ++ ++(not feature-conditional) ++ A not feature expression succeeds if its argument ++ feature-conditional fails; otherwise, it succeeds. ++ ++(and {feature-conditional}*) ++ An and feature expression succeeds if all of its argument ++ feature-conditionals succeed; otherwise, it fails. ++ ++(or {feature-conditional}*) ++ An or feature expression succeeds if any of its argument ++ feature-conditionals succeed; otherwise, it fails. ++ ++ ++File: gcl.info, Node: Examples of Feature Expressions, Prev: Feature Expressions, Up: Features ++ ++24.1.2.2 Examples of Feature Expressions ++........................................ ++ ++For example, suppose that in implementation A, the features spice and ++perq are present, but the feature lispm is not present; in ++implementation B, the feature lispm is present, but the features spice ++and perq are not present; and in implementation C, none of the features ++spice, lispm, or perq are present. Figure 24-1 shows some sample ++expressions, and how they would be read_2 in these implementations. ++ ++ (cons #+spice "Spice" #-spice "Lispm" x) ++ in implementation A ... (CONS "Spice" X) ++ in implementation B ... (CONS "Lispm" X) ++ in implementation C ... (CONS "Lispm" X) ++ (cons #+spice "Spice" #+LispM "Lispm" x) ++ in implementation A ... (CONS "Spice" X) ++ in implementation B ... (CONS "Lispm" X) ++ in implementation C ... (CONS X) ++ (setq a '(1 2 #+perq 43 #+(not perq) 27)) ++ in implementation A ... (SETQ A '(1 2 43)) ++ in implementation B ... (SETQ A '(1 2 27)) ++ in implementation C ... (SETQ A '(1 2 27)) ++ (let ((a 3) #+(or spice lispm) (b 3)) (foo a)) ++ in implementation A ... (LET ((A 3) (B 3)) (FOO A)) ++ in implementation B ... (LET ((A 3) (B 3)) (FOO A)) ++ in implementation C ... (LET ((A 3)) (FOO A)) ++ (cons #+Lispm "#+Spice" #+Spice "foo" #-(or Lispm Spice) 7 x) ++ in implementation A ... (CONS "foo" X) ++ in implementation B ... (CONS "#+Spice" X) ++ in implementation C ... (CONS 7 X) ++ ++ Figure 24-1: Features examples ++ ++ ++ ++File: gcl.info, Node: System Construction Dictionary, Prev: System Construction Concepts, Up: System Construction ++ ++24.2 System Construction Dictionary ++=================================== ++ ++* Menu: ++ ++* compile-file:: ++* compile-file-pathname:: ++* load:: ++* with-compilation-unit:: ++* *features*:: ++* *compile-file-pathname*:: ++* *load-pathname*:: ++* *compile-print*:: ++* *load-print*:: ++* *modules*:: ++* provide:: ++ ++ ++File: gcl.info, Node: compile-file, Next: compile-file-pathname, Prev: System Construction Dictionary, Up: System Construction Dictionary ++ ++24.2.1 compile-file [Function] ++------------------------------ ++ ++'compile-file' input-file &key output-file verbose print external-format ++=> output-truename, warnings-p, failure-p ++ ++Arguments and Values:: ++...................... ++ ++input-file--a pathname designator. (Default fillers for unspecified ++components are taken from *default-pathname-defaults*.) ++ ++ output-file--a pathname designator. The default is ++implementation-defined. ++ ++ verbose--a generalized boolean. The default is the value of ++*compile-verbose*. ++ ++ print--a generalized boolean. The default is the value of ++*compile-print*. ++ ++ external-format--an external file format designator. The default is ++:default. ++ ++ output-truename--a pathname (the truename of the output file), or ++nil. ++ ++ warnings-p--a generalized boolean. ++ ++ failure-p--a generalized boolean. ++ ++Description:: ++............. ++ ++compile-file transforms the contents of the file specified by input-file ++into implementation-dependent binary data which are placed in the file ++specified by output-file. ++ ++ The file to which input-file refers should be a source file. ++output-file can be used to specify an output pathname; ++ ++ the actual pathname of the compiled file to which compiled code will ++be output is computed as if by calling compile-file-pathname. ++ ++ If input-file or output-file is a logical pathname, it is translated ++into a physical pathname as if by calling translate-logical-pathname. ++ ++ If verbose is true, compile-file prints a message in the form of a ++comment (i.e., with a leading semicolon) to standard output indicating ++what file is being compiled and other useful information. If verbose is ++false, compile-file does not print this information. ++ ++ If print is true, information about top level forms in the file being ++compiled is printed to standard output. Exactly what is printed is ++implementation-dependent, but nevertheless some information is printed. ++If print is nil, no information is printed. ++ ++ The external-format specifies the external file format to be used ++when opening the file; see the function open. compile-file and load ++must cooperate in such a way that the resulting compiled file can be ++loaded without specifying an external file format anew; see the function ++load. ++ ++ compile-file binds *readtable* and *package* to the values they held ++before processing the file. ++ ++ *compile-file-truename* is bound by compile-file to hold the truename ++of the pathname of the file being compiled. ++ ++ *compile-file-pathname* is bound by compile-file to hold a pathname ++denoted by the first argument to compile-file, merged against the ++defaults; that is, (pathname (merge-pathnames input-file)). ++ ++ The compiled functions contained in the compiled file become ++available for use when the compiled file is loaded into Lisp. ++ ++ Any function definition that is processed by the compiler, including ++#'(lambda ...) forms and local function definitions made by flet, labels ++and defun forms, result in an object of type compiled-function. ++ ++ The primary value returned by compile-file, output-truename, is the ++truename of the output file, or nil if the file could not be created. ++ ++ The secondary value, warnings-p, is false if no conditions of type ++error or warning were detected by the compiler, and true otherwise. ++ ++ The tertiary value, failure-p, is false if no conditions of type ++error or warning (other than style-warning) were detected by the ++compiler, and true otherwise. ++ ++ For general information about how files are processed by the file ++compiler, see *note File Compilation::. ++ ++ Programs to be compiled by the file compiler must only contain ++externalizable objects; for details on such objects, see *note Literal ++Objects in Compiled Files::. For information on how to extend the set ++of externalizable objects, see the function make-load-form and *note ++Additional Constraints on Externalizable Objects::. ++ ++Affected By:: ++............. ++ ++*error-output*, ++ ++ *standard-output*, *compile-verbose*, *compile-print* ++ ++ The computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++For information about errors detected during the compilation process, ++see *note Exceptional Situations in the Compiler::. ++ ++ An error of type file-error might be signaled if (wild-pathname-p ++input-file)\/ returns true. ++ ++ If either the attempt to open the source file for input or the ++attempt to open the compiled file for output fails, an error of type ++file-error is signaled. ++ ++See Also:: ++.......... ++ ++*note compile:: , declare, *note eval-when:: , pathname, ++logical-pathname, *note File System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: compile-file-pathname, Next: load, Prev: compile-file, Up: System Construction Dictionary ++ ++24.2.2 compile-file-pathname [Function] ++--------------------------------------- ++ ++'compile-file-pathname' input-file &key output-file &allow-other-keys => ++pathname ++ ++Arguments and Values:: ++...................... ++ ++input-file--a pathname designator. (Default fillers for unspecified ++components are taken from *default-pathname-defaults*.) ++ ++ output-file--a pathname designator. The default is ++implementation-defined. ++ ++ pathname--a pathname. ++ ++Description:: ++............. ++ ++Returns the pathname that compile-file would write into, if given the ++same arguments. ++ ++ The defaults for the output-file are taken from the pathname that ++results from merging the input-file with the value of ++*default-pathname-defaults*, except that the type component should ++default to the appropriate implementation-defined default type for ++compiled files. ++ ++ If input-file is a logical pathname and output-file is unsupplied, ++the result is a logical pathname. ++ ++ If input-file is a logical pathname, it is translated into a physical ++pathname as if by calling translate-logical-pathname. ++ ++ If input-file is a stream, the stream can be either open or closed. ++compile-file-pathname returns the same pathname after a file is closed ++as it did when the file was open. ++ ++ It is an error if input-file is a stream that is created with ++make-two-way-stream, make-echo-stream, make-broadcast-stream, ++make-concatenated-stream, make-string-input-stream, ++make-string-output-stream. ++ ++ If an implementation supports additional keyword arguments to ++compile-file, compile-file-pathname must accept the same arguments. ++ ++Examples:: ++.......... ++ ++See logical-pathname-translations. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type file-error might be signaled if either input-file or ++output-file is wild. ++ ++See Also:: ++.......... ++ ++*note compile-file:: , pathname, logical-pathname, *note File System ++Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: load, Next: with-compilation-unit, Prev: compile-file-pathname, Up: System Construction Dictionary ++ ++24.2.3 load [Function] ++---------------------- ++ ++'load' filespec &key verbose print if-does-not-exist external-format ++=> generalized-boolean ++ ++Arguments and Values:: ++...................... ++ ++filespec--a stream, or a pathname designator. The default is taken from ++*default-pathname-defaults*. ++ ++ verbose--a generalized boolean. The default is the value of ++*load-verbose*. ++ ++ print--a generalized boolean. The default is the value of ++*load-print*. ++ ++ if-does-not-exist--a generalized boolean. The default is true. ++ ++ external-format--an external file format designator. The default is ++:default. ++ ++ generalized-boolean--a generalized boolean. ++ ++Description:: ++............. ++ ++load loads the file named by filespec into the Lisp environment. ++ ++ The manner in which a source file is distinguished from a compiled ++file is implementation-dependent. If the file specification is not ++complete and both a source file and a compiled file exist which might ++match, then which of those files load selects is ++implementation-dependent. ++ ++ If filespec is a stream, load determines what kind of stream it is ++and loads directly from the stream. ++ ++ If filespec is a logical pathname, it is translated into a physical ++pathname as if by calling translate-logical-pathname. ++ ++ load sequentially executes each form it encounters in the file named ++by filespec. If the file is a source file and the implementation ++chooses to perform implicit compilation, load must recognize top level ++forms as described in *note Processing of Top Level Forms:: and arrange ++for each top level form to be executed before beginning implicit ++compilation of the next. (Note, however, that processing of eval-when ++forms by load is controlled by the :execute situation.) ++ ++ If verbose is true, load prints a message in the form of a comment ++(i.e., with a leading semicolon) to standard output indicating what file ++is being loaded and other useful information. ++ ++ If verbose is false, load does not print this information. ++ ++ If print is true, load incrementally prints information to standard ++output showing the progress of the loading process. For a source file, ++this information might mean printing the values yielded by each form in ++the file as soon as those values are returned. For a compiled file, ++what is printed might not reflect precisely the contents of the source ++file, but some information is generally printed. If print is false, ++load does not print this information. ++ ++ If the file named by filespec is successfully loaded, load returns ++true. ++ ++ [Reviewer Note by Loosemore: What happens if the file cannot be ++loaded for some reason other than that it doesn't exist?] [Editorial ++Note by KMP: i.e., can it return NIL? must it?] ++ ++ If the file does not exist, the specific action taken depends on ++if-does-not-exist: if it is nil, load returns nil; otherwise, load ++signals an error. ++ ++ The external-format specifies the external file format to be used ++when opening the file (see the function open), except that when the file ++named by filespec is a compiled file, the external-format is ignored. ++compile-file and load cooperate in an implementation-dependent way to ++assure the preservation of the similarity of characters referred to in ++the source file at the time the source file was processed by the file ++compiler under a given external file format, regardless of the value of ++external-format at the time the compiled file is loaded. ++ ++ load binds *readtable* and *package* to the values they held before ++loading the file. ++ ++ *load-truename* is bound by load to hold the truename of the pathname ++of the file being loaded. ++ ++ *load-pathname* is bound by load to hold a pathname that represents ++filespec merged against the defaults. That is, (pathname ++(merge-pathnames filespec)). ++ ++Examples:: ++.......... ++ ++ ;Establish a data file... ++ (with-open-file (str "data.in" :direction :output :if-exists :error) ++ (print 1 str) (print '(setq a 888) str) t) ++ => T ++ (load "data.in") => true ++ a => 888 ++ (load (setq p (merge-pathnames "data.in")) :verbose t) ++ ; Loading contents of file /fred/data.in ++ ; Finished loading /fred/data.in ++ => true ++ (load p :print t) ++ ; Loading contents of file /fred/data.in ++ ; 1 ++ ; 888 ++ ; Finished loading /fred/data.in ++ => true ++ ++ ;----[Begin file SETUP]---- ++ (in-package "MY-STUFF") ++ (defmacro compile-truename () `',*compile-file-truename*) ++ (defvar *my-compile-truename* (compile-truename) "Just for debugging.") ++ (defvar *my-load-pathname* *load-pathname*) ++ (defun load-my-system () ++ (dolist (module-name '("FOO" "BAR" "BAZ")) ++ (load (merge-pathnames module-name *my-load-pathname*)))) ++ ;----[End of file SETUP]---- ++ ++ (load "SETUP") ++ (load-my-system) ++ ++Affected By:: ++............. ++ ++The implementation, and the host computer's file system. ++ ++Exceptional Situations:: ++........................ ++ ++If :if-does-not-exist is supplied and is true, or is not supplied, load ++signals an error of type file-error if the file named by filespec does ++not exist, ++ ++ or if the file system cannot perform the requested operation. ++ ++ An error of type file-error might be signaled if (wild-pathname-p ++filespec) returns true. ++ ++See Also:: ++.......... ++ ++*note error:: , *note merge-pathnames:: , *load-verbose*, ++*default-pathname-defaults*, pathname, logical-pathname, *note File ++System Concepts::, ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: with-compilation-unit, Next: *features*, Prev: load, Up: System Construction Dictionary ++ ++24.2.4 with-compilation-unit [Macro] ++------------------------------------ ++ ++'with-compilation-unit' ([[!option]]) {form}* => {result}* ++ ++ option ::=:override override ++ ++Arguments and Values:: ++...................... ++ ++override--a generalized boolean; evaluated. The default is nil. ++ ++ forms--an implicit progn. ++ ++ results--the values returned by the forms. ++ ++Description:: ++............. ++ ++Executes forms from left to right. Within the dynamic environment of ++with-compilation-unit, actions deferred by the compiler until the end of ++compilation will be deferred until the end of the outermost call to ++with-compilation-unit. ++ ++ The set of options permitted may be extended by the implementation, ++but the only standardized keyword is :override. ++ ++ If nested dynamically only the outer call to with-compilation-unit ++has any effect unless the value associated with :override is true, in ++which case warnings are deferred only to the end of the innermost call ++for which override is true. ++ ++ The function compile-file provides the effect of ++ ++ (with-compilation-unit (:override nil) ...) ++ ++ around its code. ++ ++ Any implementation-dependent extensions can only be provided as the ++result of an explicit programmer request by use of an ++implementation-dependent keyword. Implementations are forbidden from ++attaching additional meaning to a use of this macro which involves ++either no keywords or just the keyword :override. ++ ++Examples:: ++.......... ++ ++If an implementation would normally defer certain kinds of warnings, ++such as warnings about undefined functions, to the end of a compilation ++unit (such as a file), the following example shows how to cause those ++warnings to be deferred to the end of the compilation of several files. ++ ++ (defun compile-files (&rest files) ++ (with-compilation-unit () ++ (mapcar #'(lambda (file) (compile-file file)) files))) ++ ++ (compile-files "A" "B" "C") ++ ++ Note however that if the implementation does not normally defer any ++warnings, use of with-compilation-unit might not have any effect. ++ ++See Also:: ++.......... ++ ++*note compile:: , *note compile-file:: ++ ++ ++File: gcl.info, Node: *features*, Next: *compile-file-pathname*, Prev: with-compilation-unit, Up: System Construction Dictionary ++ ++24.2.5 *features* [Variable] ++---------------------------- ++ ++Value Type:: ++............ ++ ++a proper list. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The value of *features* is called the features list. It is a list of ++symbols, called features, that correspond to some aspect of the ++implementation or environment. ++ ++ Most features have implementation-dependent meanings; The following ++meanings have been assigned to feature names: ++ ++:cltl1 ++ If present, indicates that the LISP package purports to conform to ++ the 1984 specification Common Lisp: The Language. It is possible, ++ but not required, for a conforming implementation to have this ++ feature because this specification specifies that its symbols are ++ to be in the COMMON-LISP package, not the LISP package. ++ ++:cltl2 ++ If present, indicates that the implementation purports to conform ++ to Common Lisp: The Language, Second Edition. This feature must ++ not be present in any conforming implementation, since conformance ++ to that document is not compatible with conformance to this ++ specification. The name, however, is reserved by this ++ specification in order to help programs distinguish implementations ++ which conform to that document from implementations which conform ++ to this specification. ++ ++:ieee-floating-point ++ If present, indicates that the implementation purports to conform ++ to the requirements of IEEE Standard for Binary Floating-Point ++ Arithmetic. ++ ++:x3j13 ++ If present, indicates that the implementation conforms to some ++ particular working draft of this specification, or to some subset ++ of features that approximates a belief about what this ++ specification might turn out to contain. A conforming ++ implementation might or might not contain such a feature. (This ++ feature is intended primarily as a stopgap in order to provide ++ implementors something to use prior to the availability of a draft ++ standard, in order to discourage them from introducing the ++ :draft-ansi-cl and :ansi-cl features prematurely.) ++ ++:draft-ansi-cl ++ If present, indicates that the implementation purports to conform ++ to the first full draft of this specification, which went to public ++ review in 1992. A conforming implementation which has the ++ :draft-ansi-cl-2 or :ansi-cl feature is not permitted to retain the ++ :draft-ansi-cl feature since incompatible changes were made ++ subsequent to the first draft. ++ ++:draft-ansi-cl-2 ++ If present, indicates that a second full draft of this ++ specification has gone to public review, and that the ++ implementation purports to conform to that specification. (If ++ additional public review drafts are produced, this keyword will ++ continue to refer to the second draft, and additional keywords will ++ be added to identify conformance with such later drafts. As such, ++ the meaning of this keyword can be relied upon not to change over ++ time.) A conforming implementation which has the :ansi-cl feature ++ is only permitted to retain the :draft-ansi-cl feature if the ++ finally approved standard is not incompatible with the draft ++ standard. ++ ++:ansi-cl ++ If present, indicates that this specification has been adopted by ++ ANSI as an official standard, and that the implementation purports ++ to conform. ++ ++:common-lisp ++ This feature must appear in *features* for any implementation that ++ has one or more of the features :x3j13, :draft-ansi-cl, or ++ :ansi-cl. It is intended that it should also appear in ++ implementations which have the features :cltl1 or :cltl2, but this ++ specification cannot force such behavior. The intent is that this ++ feature should identify the language family named "Common Lisp," ++ rather than some specific dialect within that family. ++ ++See Also:: ++.......... ++ ++*note Use of Read-Time Conditionals::, *note Standard Macro Characters:: ++ ++Notes:: ++....... ++ ++The value of *features* is used by the #+ and #- reader syntax. ++ ++ Symbols in the features list may be in any package, but in practice ++they are generally in the KEYWORD package. This is because KEYWORD is ++the package used by default when reading_2 feature expressions in the #+ ++and #- reader macros. Code that needs to name a feature_2 in a package ++P (other than KEYWORD) can do so by making explicit use of a package ++prefix for P, but note that such code must also assure that the package ++P exists in order for the feature expression to be read_2--even in cases ++where the feature expression is expected to fail. ++ ++ It is generally considered wise for an implementation to include one ++or more features identifying the specific implementation, so that ++conditional expressions can be written which distinguish idiosyncrasies ++of one implementation from those of another. Since features are ++normally symbols in the KEYWORD package where name collisions might ++easily result, and since no uniquely defined mechanism is designated for ++deciding who has the right to use which symbol for what reason, a ++conservative strategy is to prefer names derived from one's own company ++or product name, since those names are often trademarked and are hence ++less likely to be used unwittingly by another implementation. ++ ++ ++File: gcl.info, Node: *compile-file-pathname*, Next: *load-pathname*, Prev: *features*, Up: System Construction Dictionary ++ ++24.2.6 *compile-file-pathname*, *compile-file-truename* [Variable] ++------------------------------------------------------------------ ++ ++Value Type:: ++............ ++ ++The value of *compile-file-pathname* must always be a pathname or nil. ++The value of *compile-file-truename* must always be a physical pathname ++or nil. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++During a call to compile-file, *compile-file-pathname* is bound to the ++pathname denoted by the first argument to compile-file, merged against ++the defaults; that is, it is bound to (pathname (merge-pathnames ++input-file)). During the same time interval, *compile-file-truename* is ++bound to the truename of the file being compiled. ++ ++ At other times, the value of these variables is nil. ++ ++ If a break loop is entered while compile-file is ongoing, it is ++implementation-dependent whether these variables retain the values they ++had just prior to entering the break loop or whether they are bound to ++nil. ++ ++ The consequences are unspecified if an attempt is made to assign or ++bind either of these variables. ++ ++Affected By:: ++............. ++ ++The file system. ++ ++See Also:: ++.......... ++ ++*note compile-file:: ++ ++ ++File: gcl.info, Node: *load-pathname*, Next: *compile-print*, Prev: *compile-file-pathname*, Up: System Construction Dictionary ++ ++24.2.7 *load-pathname*, *load-truename* [Variable] ++-------------------------------------------------- ++ ++Value Type:: ++............ ++ ++The value of *load-pathname* must always be a pathname or nil. The ++value of *load-truename* must always be a physical pathname or nil. ++ ++Initial Value:: ++............... ++ ++nil. ++ ++Description:: ++............. ++ ++During a call to load, *load-pathname* is bound to the pathname denoted ++by the the first argument to load, merged against the defaults; that is, ++it is bound to (pathname (merge-pathnames filespec)). During the same ++time interval, *load-truename* is bound to the truename of the file ++being loaded. ++ ++ At other times, the value of these variables is nil. ++ ++ If a break loop is entered while load is ongoing, it is ++implementation-dependent whether these variables retain the values they ++had just prior to entering the break loop or whether they are bound to ++nil. ++ ++ The consequences are unspecified if an attempt is made to assign or ++bind either of these variables. ++ ++Affected By:: ++............. ++ ++The file system. ++ ++See Also:: ++.......... ++ ++*note load:: ++ ++ ++File: gcl.info, Node: *compile-print*, Next: *load-print*, Prev: *load-pathname*, Up: System Construction Dictionary ++ ++24.2.8 *compile-print*, *compile-verbose* [Variable] ++---------------------------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The value of *compile-print* is the default value of the :print argument ++to compile-file. The value of *compile-verbose* is the default value of ++the :verbose argument to compile-file. ++ ++See Also:: ++.......... ++ ++*note compile-file:: ++ ++ ++File: gcl.info, Node: *load-print*, Next: *modules*, Prev: *compile-print*, Up: System Construction Dictionary ++ ++24.2.9 *load-print*, *load-verbose* [Variable] ++---------------------------------------------- ++ ++Value Type:: ++............ ++ ++a generalized boolean. ++ ++Initial Value:: ++............... ++ ++The initial value of *load-print* is false. The initial value of ++*load-verbose* is implementation-dependent. ++ ++Description:: ++............. ++ ++The value of *load-print* is the default value of the :print argument to ++load. The value of *load-verbose* is the default value of the :verbose ++argument to load. ++ ++See Also:: ++.......... ++ ++*note load:: ++ ++ ++File: gcl.info, Node: *modules*, Next: provide, Prev: *load-print*, Up: System Construction Dictionary ++ ++24.2.10 *modules* [Variable] ++---------------------------- ++ ++Value Type:: ++............ ++ ++a list of strings. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The value of *modules* is a list of names of the modules that have been ++loaded into the current Lisp image. ++ ++Affected By:: ++............. ++ ++provide ++ ++See Also:: ++.......... ++ ++*note provide:: , require ++ ++Notes:: ++....... ++ ++The variable *modules* is deprecated. ++ ++ ++File: gcl.info, Node: provide, Prev: *modules*, Up: System Construction Dictionary ++ ++24.2.11 provide, require [Function] ++----------------------------------- ++ ++'provide' module-name => implementation-dependent ++ ++ 'require' module-name &optional pathname-list => ++implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++module-name--a string designator. ++ ++ pathname-list--nil, or a designator for a non-empty list of pathname ++designators. The default is nil. ++ ++Description:: ++............. ++ ++provide adds the module-name to the list held by *modules*, if such a ++name is not already present. ++ ++ require tests for the presence of the module-name in the list held by ++*modules*. If it is present, require immediately returns. ++ ++ Otherwise, an attempt is made to load an appropriate set of files as ++follows: The pathname-list argument, if non-nil, specifies a list of ++pathnames to be loaded in order, from left to right. If the ++pathname-list is nil, an implementation-dependent mechanism will be ++invoked in an attempt to load the module named module-name; if no such ++module can be loaded, an error of type error is signaled. ++ ++ Both functions use string= to test for the presence of a module-name. ++ ++Examples:: ++.......... ++ ++ ;;; This illustrates a nonportable use of REQUIRE, because it ++ ;;; depends on the implementation-dependent file-loading mechanism. ++ ++ (require "CALCULUS") ++ ++ ;;; This use of REQUIRE is nonportable because of the literal ++ ;;; physical pathname. ++ ++ (require "CALCULUS" "/usr/lib/lisp/calculus") ++ ++ ;;; One form of portable usage involves supplying a logical pathname, ++ ;;; with appropriate translations defined elsewhere. ++ ++ (require "CALCULUS" "lib:calculus") ++ ++ ;;; Another form of portable usage involves using a variable or ++ ;;; table lookup function to determine the pathname, which again ++ ;;; must be initialized elsewhere. ++ ++ (require "CALCULUS" *calculus-module-pathname*) ++ ++Side Effects:: ++.............. ++ ++provide modifies *modules*. ++ ++Affected By:: ++............. ++ ++The specific action taken by require is affected by calls to provide ++(or, in general, any changes to the value of *modules*). ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if module-name is not a string ++designator. ++ ++ If require fails to perform the requested operation due to a problem ++while interacting with the file system, an error of type file-error is ++signaled. ++ ++ An error of type file-error might be signaled if any pathname in ++pathname-list is a designator for a wild pathname. ++ ++See Also:: ++.......... ++ ++*modules*, ++ ++ *note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++The functions provide and require are deprecated. ++ ++ If a module consists of a single package, it is customary for the ++package and module names to be the same. ++ ++ ++File: gcl.info, Node: Environment, Next: Glossary (Glossary), Prev: System Construction, Up: Top ++ ++25 Environment ++************** ++ ++* Menu: ++ ++* The External Environment:: ++* Environment Dictionary:: ++ ++ ++File: gcl.info, Node: The External Environment, Next: Environment Dictionary, Prev: Environment, Up: Environment ++ ++25.1 The External Environment ++============================= ++ ++* Menu: ++ ++* Top level loop:: ++* Debugging Utilities:: ++* Environment Inquiry:: ++* Time:: ++ ++ ++File: gcl.info, Node: Top level loop, Next: Debugging Utilities, Prev: The External Environment, Up: The External Environment ++ ++25.1.1 Top level loop ++--------------------- ++ ++The top level loop is the Common Lisp mechanism by which the user ++normally interacts with the Common Lisp system. This loop is sometimes ++referred to as the Lisp read-eval-print loop because it typically ++consists of an endless loop that reads an expression, evaluates it and ++prints the results. ++ ++ The top level loop is not completely specified; thus the user ++interface is implementation-defined. The top level loop prints all ++values resulting from the evaluation of a form. Figure 25-1 lists ++variables that are maintained by the Lisp read-eval-print loop. ++ ++ * + / - ++ ** ++ // ++ *** +++ /// ++ ++ Figure 25-1: Variables maintained by the Read-Eval-Print Loop ++ ++ ++ ++File: gcl.info, Node: Debugging Utilities, Next: Environment Inquiry, Prev: Top level loop, Up: The External Environment ++ ++25.1.2 Debugging Utilities ++-------------------------- ++ ++Figure 25-2 shows defined names relating to debugging. ++ ++ *debugger-hook* documentation step ++ apropos dribble time ++ apropos-list ed trace ++ break inspect untrace ++ describe invoke-debugger ++ ++ Figure 25-2: Defined names relating to debugging ++ ++ ++ ++File: gcl.info, Node: Environment Inquiry, Next: Time, Prev: Debugging Utilities, Up: The External Environment ++ ++25.1.3 Environment Inquiry ++-------------------------- ++ ++Environment inquiry defined names provide information about the hardware ++and software configuration on which a Common Lisp program is being ++executed. ++ ++ Figure 25-3 shows defined names relating to environment inquiry. ++ ++ *features* machine-instance short-site-name ++ lisp-implementation-type machine-type software-type ++ lisp-implementation-version machine-version software-version ++ long-site-name room ++ ++ Figure 25-3: Defined names relating to environment inquiry. ++ ++ ++ ++File: gcl.info, Node: Time, Prev: Environment Inquiry, Up: The External Environment ++ ++25.1.4 Time ++----------- ++ ++Time is represented in four different ways in Common Lisp: decoded time, ++universal time, internal time, and seconds. Decoded time and universal ++time are used primarily to represent calendar time, and are precise only ++to one second. Internal time is used primarily to represent ++measurements of computer time (such as run time) and is precise to some ++implementation-dependent fraction of a second called an internal time ++unit, as specified by internal-time-units-per-second. An internal time ++can be used for either absolute and relative time measurements. Both a ++universal time and a decoded time can be used only for absolute time ++measurements. In the case of one function, sleep, time intervals are ++represented as a non-negative real number of seconds. ++ ++ Figure 25-4 shows defined names relating to time. ++ ++ decode-universal-time get-internal-run-time ++ encode-universal-time get-universal-time ++ get-decoded-time internal-time-units-per-second ++ get-internal-real-time sleep ++ ++ Figure 25-4: Defined names involving Time. ++ ++ ++* Menu: ++ ++* Decoded Time:: ++* Universal Time:: ++* Internal Time:: ++* Seconds:: ++ ++ ++File: gcl.info, Node: Decoded Time, Next: Universal Time, Prev: Time, Up: Time ++ ++25.1.4.1 Decoded Time ++..................... ++ ++A decoded time is an ordered series of nine values that, taken together, ++represent a point in calendar time (ignoring leap seconds): ++ ++Second ++ An integer between 0 and~59, inclusive. ++ ++Minute ++ An integer between 0 and~59, inclusive. ++ ++Hour ++ An integer between 0 and~23, inclusive. ++ ++Date ++ An integer between 1 and~31, inclusive (the upper limit actually ++ depends on the month and year, of course). ++ ++Month ++ An integer between 1 and 12, inclusive; 1~means January, 2~means ++ February, and so on; 12~means December. ++ ++Year ++ An integer indicating the year A.D. However, if this integer is ++ between 0 and 99, the "obvious" year is used; more precisely, that ++ year is assumed that is equal to the integer modulo 100 and within ++ fifty years of the current year (inclusive backwards and exclusive ++ forwards). Thus, in the year 1978, year 28 is 1928 but year 27 is ++ 2027. (Functions that return time in this format always return a ++ full year number.) ++ ++Day of week ++ An integer between~0 and~6, inclusive; 0~means Monday, 1~means ++ Tuesday, and so on; 6~means Sunday. ++ ++Daylight saving time flag ++ A generalized boolean that, if true, indicates that daylight saving ++ time is in effect. ++ ++Time zone ++ A time zone. ++ ++ Figure 25-5 shows defined names relating to decoded time. ++ ++ decode-universal-time get-decoded-time ++ ++ Figure 25-5: Defined names involving time in Decoded Time. ++ ++ ++ ++File: gcl.info, Node: Universal Time, Next: Internal Time, Prev: Decoded Time, Up: Time ++ ++25.1.4.2 Universal Time ++....................... ++ ++Universal time is an absolute time represented as a single non-negative ++integer--the number of seconds since midnight, January 1, 1900 GMT ++(ignoring leap seconds). Thus the time 1 is 00:00:01 (that is, 12:00:01 ++a.m.) on January 1, 1900 GMT. Similarly, the time 2398291201 ++corresponds to time 00:00:01 on January 1, 1976 GMT. Recall that the ++year 1900 was not a leap year; for the purposes of Common Lisp, a year ++is a leap year if and only if its number is divisible by 4, except that ++years divisible by 100 are not leap years, except that years divisible ++by 400 are leap years. Therefore the year 2000 will be a leap year. ++Because universal time must be a non-negative integer, times before the ++base time of midnight, January 1, 1900 GMT cannot be processed by Common ++Lisp. ++ ++ decode-universal-time get-universal-time ++ encode-universal-time ++ ++ Figure 25-6: Defined names involving time in Universal Time. ++ ++ ++ ++File: gcl.info, Node: Internal Time, Next: Seconds, Prev: Universal Time, Up: Time ++ ++25.1.4.3 Internal Time ++...................... ++ ++Internal time represents time as a single integer, in terms of an ++implementation-dependent unit called an internal time unit. Relative ++time is measured as a number of these units. Absolute time is relative ++to an arbitrary time base. ++ ++ Figure 25-7 shows defined names related to internal time. ++ ++ get-internal-real-time internal-time-units-per-second ++ get-internal-run-time ++ ++ Figure 25-7: Defined names involving time in Internal Time. ++ ++ ++ ++File: gcl.info, Node: Seconds, Prev: Internal Time, Up: Time ++ ++25.1.4.4 Seconds ++................ ++ ++One function, sleep, takes its argument as a non-negative real number of ++seconds. Informally, it may be useful to think of this as a relative ++universal time, but it differs in one important way: universal times are ++always non-negative integers, whereas the argument to sleep can be any ++kind of non-negative real, in order to allow for the possibility of ++fractional seconds. ++ ++ sleep ++ ++ Figure 25-8: Defined names involving time in Seconds. ++ ++ ++ ++File: gcl.info, Node: Environment Dictionary, Prev: The External Environment, Up: Environment ++ ++25.2 Environment Dictionary ++=========================== ++ ++* Menu: ++ ++* decode-universal-time:: ++* encode-universal-time:: ++* get-universal-time:: ++* sleep:: ++* apropos:: ++* describe:: ++* describe-object:: ++* trace:: ++* step:: ++* time:: ++* internal-time-units-per-second:: ++* get-internal-real-time:: ++* get-internal-run-time:: ++* disassemble:: ++* documentation:: ++* room:: ++* ed:: ++* inspect:: ++* dribble:: ++* - (Variable):: ++* + (Variable):: ++* * (Variable):: ++* / (Variable):: ++* lisp-implementation-type:: ++* short-site-name:: ++* machine-instance:: ++* machine-type:: ++* machine-version:: ++* software-type:: ++* user-homedir-pathname:: ++ ++ ++File: gcl.info, Node: decode-universal-time, Next: encode-universal-time, Prev: Environment Dictionary, Up: Environment Dictionary ++ ++25.2.1 decode-universal-time [Function] ++--------------------------------------- ++ ++'decode-universal-time' universal-time &optional time-zone ++=> second, minute, hour, date, month, year, day, daylight-p, zone ++ ++Arguments and Values:: ++...................... ++ ++universal-time--a universal time. ++ ++ time-zone--a time zone. ++ ++ second, minute, hour, date, month, year, day, daylight-p, zone--a ++decoded time. ++ ++Description:: ++............. ++ ++Returns the decoded time represented by the given universal time. ++ ++ If time-zone is not supplied, it defaults to the current time zone ++adjusted for daylight saving time. ++ ++ If time-zone is supplied, daylight saving time information is ++ignored. The daylight saving time flag is nil if time-zone is supplied. ++ ++Examples:: ++.......... ++ ++ (decode-universal-time 0 0) => 0, 0, 0, 1, 1, 1900, 0, false, 0 ++ ++ ;; The next two examples assume Eastern Daylight Time. ++ (decode-universal-time 2414296800 5) => 0, 0, 1, 4, 7, 1976, 6, false, 5 ++ (decode-universal-time 2414293200) => 0, 0, 1, 4, 7, 1976, 6, true, 5 ++ ++ ;; This example assumes that the time zone is Eastern Daylight Time ++ ;; (and that the time zone is constant throughout the example). ++ (let* ((here (nth 8 (multiple-value-list (get-decoded-time)))) ;Time zone ++ (recently (get-universal-time)) ++ (a (nthcdr 7 (multiple-value-list (decode-universal-time recently)))) ++ (b (nthcdr 7 (multiple-value-list (decode-universal-time recently here))))) ++ (list a b (equal a b))) => ((T 5) (NIL 5) NIL) ++ ++Affected By:: ++............. ++ ++Implementation-dependent mechanisms for calculating when or if daylight ++savings time is in effect for any given session. ++ ++See Also:: ++.......... ++ ++*note encode-universal-time:: , *note get-universal-time:: , *note ++Time:: ++ ++ ++File: gcl.info, Node: encode-universal-time, Next: get-universal-time, Prev: decode-universal-time, Up: Environment Dictionary ++ ++25.2.2 encode-universal-time [function] ++--------------------------------------- ++ ++Syntax:: ++........ ++ ++'encode-universal-time' second minute hour date month year &optional ++time-zone ++=> universal-time ++ ++Arguments and Values:: ++...................... ++ ++second, minute, hour, date, month, year, time-zone--the corresponding ++parts of a decoded time. (Note that some of the nine values in a full ++decoded time are redundant, and so are not used as inputs to this ++function.) ++ ++ universal-time--a universal time. ++ ++Description:: ++............. ++ ++encode-universal-time converts a time from Decoded Time format to a ++universal time. ++ ++ If time-zone is supplied, no adjustment for daylight savings time is ++performed. ++ ++Examples:: ++.......... ++ ++ (encode-universal-time 0 0 0 1 1 1900 0) => 0 ++ (encode-universal-time 0 0 1 4 7 1976 5) => 2414296800 ++ ;; The next example assumes Eastern Daylight Time. ++ (encode-universal-time 0 0 1 4 7 1976) => 2414293200 ++ ++See Also:: ++.......... ++ ++*note decode-universal-time:: , get-decoded-time ++ ++ ++File: gcl.info, Node: get-universal-time, Next: sleep, Prev: encode-universal-time, Up: Environment Dictionary ++ ++25.2.3 get-universal-time, get-decoded-time [Function] ++------------------------------------------------------ ++ ++'get-universal-time' => universal-time ++ ++ 'get-decoded-time' ++=> second, minute, hour, date, month, year, day, daylight-p, zone ++ ++Arguments and Values:: ++...................... ++ ++universal-time--a universal time. ++ ++ second, minute, hour, date, month, year, day, daylight-p, zone--a ++decoded time. ++ ++Description:: ++............. ++ ++get-universal-time returns the current time, represented as a universal ++time. ++ ++ get-decoded-time returns the current time, represented as a decoded ++time. ++ ++Examples:: ++.......... ++ ++ ;; At noon on July 4, 1976 in Eastern Daylight Time. ++ (get-decoded-time) => 0, 0, 12, 4, 7, 1976, 6, true, 5 ++ ;; At exactly the same instant. ++ (get-universal-time) => 2414332800 ++ ;; Exactly five minutes later. ++ (get-universal-time) => 2414333100 ++ ;; The difference is 300 seconds (five minutes) ++ (- * **) => 300 ++ ++Affected By:: ++............. ++ ++The time of day (i.e., the passage of time), the system clock's ability ++to keep accurate time, and the accuracy of the system clock's initial ++setting. ++ ++Exceptional Situations:: ++........................ ++ ++An error of type error might be signaled if the current time cannot be ++determined. ++ ++See Also:: ++.......... ++ ++*note decode-universal-time:: , *note encode-universal-time:: , *note ++Time:: ++ ++Notes:: ++....... ++ ++ (get-decoded-time) == (decode-universal-time (get-universal-time)) ++ ++ No implementation is required to have a way to verify that the time ++returned is correct. However, if an implementation provides a validity ++check (e.g., the failure to have properly initialized the system clock ++can be reliably detected) and that validity check fails, the ++implementation is strongly encouraged (but not required) to signal an ++error of type error (rather than, for example, returning a ++known-to-be-wrong value) that is correctable by allowing the user to ++interactively set the correct time. ++ ++ ++File: gcl.info, Node: sleep, Next: apropos, Prev: get-universal-time, Up: Environment Dictionary ++ ++25.2.4 sleep [Function] ++----------------------- ++ ++'sleep' seconds => nil ++ ++Arguments and Values:: ++...................... ++ ++seconds--a non-negative real. ++ ++Description:: ++............. ++ ++Causes execution to cease and become dormant for approximately the ++seconds of real time indicated by seconds, whereupon execution is ++resumed. ++ ++Examples:: ++.......... ++ ++ (sleep 1) => NIL ++ ++ ;; Actually, since SLEEP is permitted to use approximate timing, ++ ;; this might not always yield true, but it will often enough that ++ ;; we felt it to be a productive example of the intent. ++ (let ((then (get-universal-time)) ++ (now (progn (sleep 10) (get-universal-time)))) ++ (>= (- now then) 10)) ++ => true ++ ++Side Effects:: ++.............. ++ ++Causes processing to pause. ++ ++Affected By:: ++............. ++ ++The granularity of the scheduler. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if seconds is not a ++non-negative real. ++ ++ ++File: gcl.info, Node: apropos, Next: describe, Prev: sleep, Up: Environment Dictionary ++ ++25.2.5 apropos, apropos-list [Function] ++--------------------------------------- ++ ++'apropos' string &optional package => ++ ++ 'apropos-list' string &optional package => symbols ++ ++Arguments and Values:: ++...................... ++ ++string--a string designator. ++ ++ package--a package designator or nil. The default is nil. ++ ++ symbols--a list of symbols. ++ ++Description:: ++............. ++ ++These functions search for interned symbols whose names contain the ++substring string. ++ ++ For apropos, as each such symbol is found, its name is printed on ++standard output. In addition, if such a symbol is defined as a function ++or dynamic variable, information about those definitions might also be ++printed. ++ ++ For apropos-list, no output occurs as the search proceeds; instead a ++list of the matching symbols is returned when the search is complete. ++ ++ If package is non-nil, only the symbols accessible in that package ++are searched; otherwise all symbols accessible in any package are ++searched. ++ ++ Because a symbol might be available by way of more than one ++inheritance path, apropos might print information about the same symbol ++more than once, or apropos-list might return a list containing duplicate ++symbols. ++ ++ Whether or not the search is case-sensitive is ++implementation-defined. ++ ++Affected By:: ++............. ++ ++The set of symbols which are currently interned in any packages being ++searched. ++ ++ apropos is also affected by *standard-output*. ++ ++ ++File: gcl.info, Node: describe, Next: describe-object, Prev: apropos, Up: Environment Dictionary ++ ++25.2.6 describe [Function] ++-------------------------- ++ ++'describe' object &optional stream => ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ stream--an output stream designator. The default is standard output. ++ ++Description:: ++............. ++ ++describe displays information about object ++ ++ to stream. ++ ++ For example, describe of a symbol might show the symbol's value, its ++definition, and each of its properties. describe of a float might show ++the number's internal representation in a way that is useful for ++tracking down round-off errors. In all cases, however, the nature and ++format of the output of describe is implementation-dependent. ++ ++ describe can describe something that it finds inside the object; in ++such cases, a notational device such as increased indentation or ++positioning in a table is typically used in order to visually ++distinguish such recursive descriptions from descriptions of the ++argument object. ++ ++ The actual act of describing the object is implemented by ++describe-object. describe exists as an interface primarily to manage ++argument defaulting (including conversion of arguments t and nil into ++stream objects) and to inhibit any return values from describe-object. ++ ++ describe is not intended to be an interactive function. In a ++conforming implementation, describe must not, by default, prompt for ++user input. User-defined methods for describe-object are likewise ++restricted. ++ ++Side Effects:: ++.............. ++ ++Output to standard output or terminal I/O. ++ ++Affected By:: ++............. ++ ++*standard-output* and *terminal-io*, methods on describe-object and ++print-object for objects having user-defined classes. ++ ++See Also:: ++.......... ++ ++*note inspect:: , *note describe-object:: ++ ++ ++File: gcl.info, Node: describe-object, Next: trace, Prev: describe, Up: Environment Dictionary ++ ++25.2.7 describe-object [Standard Generic Function] ++-------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'describe-object' object stream => implementation-dependent ++ ++Method Signatures:: ++................... ++ ++'describe-object' (object standard-object) stream ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++ stream--a stream. ++ ++Description:: ++............. ++ ++The generic function describe-object prints a description of object to a ++stream. describe-object is called by describe; it must not be called by ++the user. ++ ++ Each implementation is required to provide a method on the class ++standard-object and methods on enough other classes so as to ensure that ++there is always an applicable method. Implementations are free to add ++methods for other classes. Users can write methods for describe-object ++for their own classes if they do not wish to inherit an ++implementation-supplied method. ++ ++ Methods on describe-object can recursively call describe. ++Indentation, depth limits, and circularity detection are all taken care ++of automatically, provided that each method handles exactly one level of ++structure and calls describe recursively if there are more structural ++levels. The consequences are undefined if this rule is not obeyed. ++ ++ In some implementations the stream argument passed to a ++describe-object method is not the original stream, but is an ++intermediate stream that implements parts of describe. Methods should ++therefore not depend on the identity of this stream. ++ ++Examples:: ++.......... ++ ++ (defclass spaceship () ++ ((captain :initarg :captain :accessor spaceship-captain) ++ (serial# :initarg :serial-number :accessor spaceship-serial-number))) ++ ++ (defclass federation-starship (spaceship) ()) ++ ++ (defmethod describe-object ((s spaceship) stream) ++ (with-slots (captain serial#) s ++ (format stream "~&~S is a spaceship of type ~S,~ ++ ~ ++ and with serial number ~D.~ ++ s (type-of s) captain serial#))) ++ ++ (make-instance 'federation-starship ++ :captain "Rachel Garrett" ++ :serial-number "NCC-1701-C") ++ => # ++ ++ (describe *) ++ |> # is a spaceship of type FEDERATION-STARSHIP, ++ |> with Rachel Garrett at the helm and with serial number NCC-1701-C. ++ => ++ ++See Also:: ++.......... ++ ++*note describe:: ++ ++Notes:: ++....... ++ ++The same implementation techniques that are applicable to print-object ++are applicable to describe-object. ++ ++ The reason for making the return values for describe-object ++unspecified is to avoid forcing users to include explicit (values) in ++all of their methods. describe takes care of that. ++ ++ ++File: gcl.info, Node: trace, Next: step, Prev: describe-object, Up: Environment Dictionary ++ ++25.2.8 trace, untrace [Macro] ++----------------------------- ++ ++'trace' {function-name}* => trace-result ++ ++ 'untrace' {function-name}* => untrace-result ++ ++Arguments and Values:: ++...................... ++ ++function-name--a function name. ++ ++ trace-result--implementation-dependent, unless no function-names are ++supplied, in which case trace-result is a list of function names. ++ ++ untrace-result--implementation-dependent. ++ ++Description:: ++............. ++ ++trace and untrace control the invocation of the trace facility. ++ ++ Invoking trace with one or more function-names causes the denoted ++functions to be "traced." Whenever a traced function is invoked, ++information about the call, about the arguments passed, and about any ++eventually returned values is printed to trace output. If trace is used ++with no function-names, no tracing action is performed; instead, a list ++of the functions currently being traced is returned. ++ ++ Invoking untrace with one or more function names causes those ++functions to be "untraced" (i.e., no longer traced). If untrace is used ++with no function-names, all functions currently being traced are ++untraced. ++ ++ If a function to be traced has been open-coded (e.g., because it was ++declared inline), a call to that function might not produce trace ++output. ++ ++Examples:: ++.......... ++ ++ (defun fact (n) (if (zerop n) 1 (* n (fact (- n 1))))) ++ => FACT ++ (trace fact) ++ => (FACT) ++ ;; Of course, the format of traced output is implementation-dependent. ++ (fact 3) ++ |> 1 Enter FACT 3 ++ |> | 2 Enter FACT 2 ++ |> | 3 Enter FACT 1 ++ |> | | 4 Enter FACT 0 ++ |> | | 4 Exit FACT 1 ++ |> | 3 Exit FACT 1 ++ |> | 2 Exit FACT 2 ++ |> 1 Exit FACT 6 ++ => 6 ++ ++Side Effects:: ++.............. ++ ++Might change the definitions of the functions named by function-names. ++ ++Affected By:: ++............. ++ ++Whether the functions named are defined or already being traced. ++ ++Exceptional Situations:: ++........................ ++ ++Tracing an already traced function, or untracing a function not ++currently being traced, should produce no harmful effects, but might ++signal a warning. ++ ++See Also:: ++.......... ++ ++*trace-output*, *note step:: ++ ++Notes:: ++....... ++ ++trace and untrace may also accept additional implementation-dependent ++argument formats. The format of the trace output is ++implementation-dependent. ++ ++ Although trace can be extended to permit non-standard options, ++implementations are nevertheless encouraged (but not required) to warn ++about the use of syntax or options that are neither specified by this ++standard nor added as an extension by the implementation, since they ++could be symptomatic of typographical errors or of reliance on features ++supported in implementations other than the current implementation. ++ ++ ++File: gcl.info, Node: step, Next: time, Prev: trace, Up: Environment Dictionary ++ ++25.2.9 step [Macro] ++------------------- ++ ++'step' form => {result}* ++ ++Arguments and Values:: ++...................... ++ ++form--a form; evaluated as described below. ++ ++ results--the values returned by the form. ++ ++Description:: ++............. ++ ++step implements a debugging paradigm wherein the programmer is allowed ++to step through the evaluation of a form. The specific nature of the ++interaction, ++ ++ including which I/O streams are used and whether the stepping has ++lexical or dynamic scope, ++ ++ is implementation-defined. ++ ++ step evaluates form in the current environment. A call to step can ++be compiled, but it is acceptable for an implementation to interactively ++step through only those parts of the computation that are interpreted. ++ ++ It is technically permissible for a conforming implementation to take ++no action at all other than normal execution of the form. In such a ++situation, (step form) is equivalent to, for example, (let () form). In ++implementations where this is the case, the associated documentation ++should mention that fact. ++ ++See Also:: ++.......... ++ ++*note trace:: ++ ++Notes:: ++....... ++ ++Implementations are encouraged to respond to the typing of ? or the ++pressing of a "help key" by providing help including a list of commands. ++ ++ ++File: gcl.info, Node: time, Next: internal-time-units-per-second, Prev: step, Up: Environment Dictionary ++ ++25.2.10 time [Macro] ++-------------------- ++ ++'time' form => {result}* ++ ++Arguments and Values:: ++...................... ++ ++form--a form; evaluated as described below. ++ ++ results--the values returned by the form. ++ ++Description:: ++............. ++ ++time evaluates form in the current environment (lexical and dynamic). A ++call to time can be compiled. ++ ++ time prints various timing data and other information to trace ++output. The nature and format of the printed information is ++implementation-defined. Implementations are encouraged to provide such ++information as elapsed real time, machine run time, and storage ++management statistics. ++ ++Affected By:: ++............. ++ ++The accuracy of the results depends, among other things, on the accuracy ++of the corresponding functions provided by the underlying operating ++system. ++ ++ The magnitude of the results may depend on the hardware, the ++operating system, the lisp implementation, and the state of the global ++environment. Some specific issues which frequently affect the outcome ++are hardware speed, nature of the scheduler (if any), number of ++competing processes (if any), system paging, whether the call is ++interpreted or compiled, whether functions called are compiled, the kind ++of garbage collector involved and whether it runs, whether internal data ++structures (e.g., hash tables) are implicitly reorganized, etc. ++ ++See Also:: ++.......... ++ ++*note get-internal-real-time:: , *note get-internal-run-time:: ++ ++Notes:: ++....... ++ ++In general, these timings are not guaranteed to be reliable enough for ++marketing comparisons. Their value is primarily heuristic, for tuning ++purposes. ++ ++ For useful background information on the complicated issues involved ++in interpreting timing results, see Performance and Evaluation of Lisp ++Programs. ++ ++ ++File: gcl.info, Node: internal-time-units-per-second, Next: get-internal-real-time, Prev: time, Up: Environment Dictionary ++ ++25.2.11 internal-time-units-per-second [Constant Variable] ++---------------------------------------------------------- ++ ++Constant Value:: ++................ ++ ++A positive integer, the magnitude of which is implementation-dependent. ++ ++Description:: ++............. ++ ++The number of internal time units in one second. ++ ++See Also:: ++.......... ++ ++*note get-internal-run-time:: , *note get-internal-real-time:: ++ ++Notes:: ++....... ++ ++These units form the basis of the Internal Time format representation. ++ ++ ++File: gcl.info, Node: get-internal-real-time, Next: get-internal-run-time, Prev: internal-time-units-per-second, Up: Environment Dictionary ++ ++25.2.12 get-internal-real-time [Function] ++----------------------------------------- ++ ++'get-internal-real-time' => internal-time ++ ++Arguments and Values:: ++...................... ++ ++internal-time--a non-negative integer. ++ ++Description:: ++............. ++ ++get-internal-real-time returns as an integer the current time in ++internal time units, relative to an arbitrary time base. The difference ++between the values of two calls to this function is the amount of ++elapsed real time (i.e., clock time) between the two calls. ++ ++Affected By:: ++............. ++ ++Time of day (i.e., the passage of time). The time base affects the ++result magnitude. ++ ++See Also:: ++.......... ++ ++*note internal-time-units-per-second:: ++ ++ ++File: gcl.info, Node: get-internal-run-time, Next: disassemble, Prev: get-internal-real-time, Up: Environment Dictionary ++ ++25.2.13 get-internal-run-time [Function] ++---------------------------------------- ++ ++'get-internal-run-time' => internal-time ++ ++Arguments and Values:: ++...................... ++ ++internal-time--a non-negative integer. ++ ++Description:: ++............. ++ ++Returns as an integer the current run time in internal time units. The ++precise meaning of this quantity is implementation-defined; it may ++measure real time, run time, CPU cycles, or some other quantity. The ++intent is that the difference between the values of two calls to this ++function be the amount of time between the two calls during which ++computational effort was expended on behalf of the executing program. ++ ++Affected By:: ++............. ++ ++The implementation, the time of day (i.e., the passage of time). ++ ++See Also:: ++.......... ++ ++*note internal-time-units-per-second:: ++ ++Notes:: ++....... ++ ++Depending on the implementation, paging time and garbage collection time ++might be included in this measurement. Also, in a multitasking ++environment, it might not be possible to show the time for just the ++running process, so in some implementations, time taken by other ++processes during the same time interval might be included in this ++measurement as well. ++ ++ ++File: gcl.info, Node: disassemble, Next: documentation, Prev: get-internal-run-time, Up: Environment Dictionary ++ ++25.2.14 disassemble [Function] ++------------------------------ ++ ++'disassemble' fn => nil ++ ++Arguments and Values:: ++...................... ++ ++fn--an extended function designator or a lambda expression. ++ ++Description:: ++............. ++ ++The function disassemble is a debugging aid that composes symbolic ++instructions or expressions in some implementation-dependent language ++which represent the code used to produce the function which is or is ++named by the argument fn. The result is displayed to standard output in ++an implementation-dependent format. ++ ++ If fn is a lambda expression or interpreted function, it is compiled ++first and the result is disassembled. ++ ++ If the fn designator is a function name, the function that it names ++is disassembled. ++ ++ (If that function is an interpreted function, it is first compiled ++but the result of this implicit compilation is not installed.) ++ ++Examples:: ++.......... ++ ++ (defun f (a) (1+ a)) => F ++ (eq (symbol-function 'f) ++ (progn (disassemble 'f) ++ (symbol-function 'f))) => true ++ ++Affected By:: ++............. ++ ++*standard-output*. ++ ++Exceptional Situations:: ++........................ ++ ++Should signal an error of type type-error if fn is not an extended ++function designator or a lambda expression. ++ ++ ++File: gcl.info, Node: documentation, Next: room, Prev: disassemble, Up: Environment Dictionary ++ ++25.2.15 documentation, (setf documentation) [Standard Generic Function] ++----------------------------------------------------------------------- ++ ++Syntax:: ++........ ++ ++'documentation' x doc-type => documentation ++ ++ '(setf documentation)' new-value x doc-type => new-value ++ ++Argument Precedence Order:: ++........................... ++ ++doc-type, object ++ ++Method Signatures:: ++................... ++ ++Functions, Macros, and Special Forms ++.................................... ++ ++documentation (x 'function') (doc-type (eql 't)) ++(setf documentation) new-value(x 'function') (doc-type (eql 't)) ++ ++ documentation (x 'function') (doc-type (eql 'function)) ++(setf documentation) new-value(x 'function') (doc-type (eql 'function)) ++ ++ documentation (x 'list') (doc-type (eql 'function)) ++(setf documentation) new-value(x 'list') (doc-type (eql 'function)) ++ ++ documentation (x 'list') (doc-type (eql 'compiler-macro)) ++(setf documentation) new-value(x 'list') (doc-type (eql ++'compiler-macro)) ++ ++ documentation (x 'symbol') (doc-type (eql 'function)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql 'function)) ++ ++ documentation (x 'symbol') (doc-type (eql 'compiler-macro)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql ++'compiler-macro)) ++ ++ documentation (x 'symbol') (doc-type (eql 'setf)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql 'setf)) ++ ++Method Combinations ++................... ++ ++documentation (x 'method-combination') (doc-type (eql 't)) ++(setf documentation) new-value(x 'method-combination') (doc-type (eql ++'t)) ++ ++ documentation (x 'method-combination') (doc-type (eql ++'method-combination)) ++(setf documentation) new-value(x 'method-combination') (doc-type (eql ++'method-combination)) ++ ++ documentation (x 'symbol') (doc-type (eql 'method-combination)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql ++'method-combination)) ++ ++Methods ++....... ++ ++documentation (x 'standard-method') (doc-type (eql 't)) ++(setf documentation) new-value(x 'standard-method') (doc-type (eql 't)) ++ ++Packages ++........ ++ ++documentation (x 'package') (doc-type (eql 't)) ++(setf documentation) new-value(x 'package') (doc-type (eql 't)) ++ ++Types, Classes, and Structure Names ++................................... ++ ++documentation (x 'standard-class') (doc-type (eql 't)) ++(setf documentation) new-value(x 'standard-class') (doc-type (eql 't)) ++ ++ documentation (x 'standard-class') (doc-type (eql 'type)) ++(setf documentation) new-value(x 'standard-class') (doc-type (eql ++'type)) ++ ++ documentation (x 'structure-class') (doc-type (eql 't)) ++(setf documentation) new-value(x 'structure-class') (doc-type (eql 't)) ++ ++ documentation (x 'structure-class') (doc-type (eql 'type)) ++(setf documentation) new-value(x 'structure-class') (doc-type (eql ++'type)) ++ ++ documentation (x 'symbol') (doc-type (eql 'type)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql 'type)) ++ ++ documentation (x 'symbol') (doc-type (eql 'structure)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql 'structure)) ++ ++Variables ++......... ++ ++documentation (x 'symbol') (doc-type (eql 'variable)) ++(setf documentation) new-value(x 'symbol') (doc-type (eql 'variable)) ++ ++Arguments and Values:: ++...................... ++ ++x--an object. ++ ++ doc-type--a symbol. ++ ++ documentation--a string, or nil. ++ ++ new-value--a string. ++ ++Description:: ++............. ++ ++The generic function documentation returns the documentation string ++associated with the given object if it is available; otherwise it ++returns nil. ++ ++ The generic function (setf documentation) updates the documentation ++string associated with x to new-value. If x is a list, it must be of ++the form (setf symbol). ++ ++ Documentation strings are made available for debugging purposes. ++Conforming programs are permitted to use documentation strings when they ++are present, but should not depend for their correct behavior on the ++presence of those documentation strings. An implementation is permitted ++to discard documentation strings at any time for implementation-defined ++reasons. ++ ++ The nature of the documentation string returned depends on the ++doc-type, as follows: ++ ++compiler-macro ++ Returns the documentation string of the compiler macro whose name ++ is the function name x. ++ ++function ++ If x is a function name, returns the documentation string of the ++ function, macro, or special operator whose name is x. ++ ++ If x is a function, returns the documentation string associated ++ with x. ++ ++method-combination ++ If x is a symbol, returns the documentation string of the method ++ combination whose name is x. ++ ++ If x is a method combination, returns the documentation string ++ associated with x. ++ ++setf ++ Returns the documentation string of ++ ++ the setf expander ++ ++ whose name is the symbol x. ++ ++structure ++ Returns the documentation string associated with the structure name ++ x. ++ ++t ++ Returns a documentation string specialized on the class of the ++ argument x itself. For example, if x is a function, the ++ documentation string associated with the function x is returned. ++ ++type ++ If x is a symbol, returns the documentation string of the class ++ whose name is the symbol x, if there is such a class. Otherwise, ++ it returns the documentation string of the type which is the type ++ specifier symbol x. ++ ++ If x is a structure class or standard class, returns the ++ documentation string associated with the class x. ++ ++variable ++ Returns the documentation string of the dynamic variable or ++ constant variable whose name is the symbol x. ++ ++ A conforming implementation or a conforming program may extend the ++set of symbols that are acceptable as the doc-type. ++ ++Notes:: ++....... ++ ++This standard prescribes no means to retrieve the documentation strings ++for individual slots specified in a defclass form, but implementations ++might still provide debugging tools and/or programming language ++extensions which manipulate this information. Implementors wishing to ++provide such support are encouraged to consult the Metaobject Protocol ++for suggestions about how this might be done. ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.info-9 +@@ -0,0 +1,4877 @@ ++This is gcl.info, produced by makeinfo version 6.7 from gcl.texi. ++ ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI ++standard for Common Lisp. ++ ++ Copyright 1994 William F. Schelter ++ ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++ ++ ++File: gcl.info, Node: room, Next: ed, Prev: documentation, Up: Environment Dictionary ++ ++25.2.16 room [Function] ++----------------------- ++ ++'room' &optional x => implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++x--one of t, nil, or :default. ++ ++Description:: ++............. ++ ++room prints, to standard output, information about the state of internal ++storage and its management. This might include descriptions of the ++amount of memory in use and the degree of memory compaction, possibly ++broken down by internal data type if that is appropriate. The nature ++and format of the printed information is implementation-dependent. The ++intent is to provide information that a programmer might use to tune a ++program for a particular implementation. ++ ++ (room nil) prints out a minimal amount of information. (room t) ++prints out a maximal amount of information. ++ ++ (room) or (room :default) prints out an intermediate amount of ++information that is likely to be useful. ++ ++Side Effects:: ++.............. ++ ++Output to standard output. ++ ++Affected By:: ++............. ++ ++*standard-output*. ++ ++ ++File: gcl.info, Node: ed, Next: inspect, Prev: room, Up: Environment Dictionary ++ ++25.2.17 ed [Function] ++--------------------- ++ ++'ed' &optional x => implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++x--nil, a pathname, a string, or a function name. ++ ++ The default is nil. ++ ++Description:: ++............. ++ ++ed invokes the editor if the implementation provides a resident editor. ++ ++ If x is nil, the editor is entered. If the editor had been ++previously entered, its prior state is resumed, if possible. ++ ++ If x is a pathname or string, it is taken as the pathname designator ++for a file to be edited. ++ ++ If x is a function name, the text of its definition is edited. The ++means by which the function text is obtained is implementation-defined. ++ ++Exceptional Situations:: ++........................ ++ ++The consequences are undefined if the implementation does not provide a ++resident editor. ++ ++ Might signal type-error if its argument is supplied but is not a ++symbol, a pathname, or nil. ++ ++ If a failure occurs when performing some operation on the file system ++while attempting to edit a file, an error of type file-error is ++signaled. ++ ++ An error of type file-error might be signaled if x is a designator ++for a wild pathname. ++ ++ Implementation-dependent additional conditions might be signaled as ++well. ++ ++See Also:: ++.......... ++ ++pathname, ++ ++ logical-pathname, ++ ++ *note compile-file:: , *note load:: , ++ ++ *note Pathnames as Filenames:: ++ ++ ++File: gcl.info, Node: inspect, Next: dribble, Prev: ed, Up: Environment Dictionary ++ ++25.2.18 inspect [Function] ++-------------------------- ++ ++'inspect' object => implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++object--an object. ++ ++Description:: ++............. ++ ++inspect is an interactive version of describe. The nature of the ++interaction is implementation-dependent, but the purpose of inspect is ++to make it easy to wander through a data structure, examining and ++modifying parts of it. ++ ++Side Effects:: ++.............. ++ ++implementation-dependent. ++ ++Affected By:: ++............. ++ ++implementation-dependent. ++ ++Exceptional Situations:: ++........................ ++ ++implementation-dependent. ++ ++See Also:: ++.......... ++ ++*note describe:: ++ ++Notes:: ++....... ++ ++Implementations are encouraged to respond to the typing of ? or a "help ++key" by providing help, including a list of commands. ++ ++ ++File: gcl.info, Node: dribble, Next: - (Variable), Prev: inspect, Up: Environment Dictionary ++ ++25.2.19 dribble [Function] ++-------------------------- ++ ++'dribble' &optional pathname => implementation-dependent ++ ++Arguments and Values:: ++...................... ++ ++pathname--a pathname designator. ++ ++Description:: ++............. ++ ++Either binds *standard-input* and *standard-output* or takes other ++appropriate action, so as to send a record of the input/output ++interaction to a file named by pathname. dribble is intended to create ++a readable record of an interactive session. ++ ++ If pathname is a logical pathname, it is translated into a physical ++pathname as if by calling translate-logical-pathname. ++ ++ (dribble) terminates the recording of input and output and closes the ++dribble file. ++ ++ If dribble is called while a stream to a "dribble file" is still open ++from a previous call to dribble, the effect is implementation-defined. ++For example, the already-open stream might be closed, or dribbling might ++occur both to the old stream and to a new one, or the old stream might ++stay open but not receive any further output, or the new request might ++be ignored, or some other action might be taken. ++ ++Affected By:: ++............. ++ ++The implementation. ++ ++Exceptional Situations:: ++........................ ++ ++If a failure occurs when performing some operation on the file system ++while creating the dribble file, an error of type file-error is ++signaled. ++ ++ An error of type file-error might be signaled if pathname is a ++designator for a wild pathname. ++ ++See Also:: ++.......... ++ ++*note Pathnames as Filenames:: ++ ++Notes:: ++....... ++ ++dribble can return before subsequent forms are executed. It also can ++enter a recursive interaction loop, returning only when (dribble) is ++done. ++ ++ dribble is intended primarily for interactive debugging; its effect ++cannot be relied upon when used in a program. ++ ++ ++File: gcl.info, Node: - (Variable), Next: + (Variable), Prev: dribble, Up: Environment Dictionary ++ ++25.2.20 - [Variable] ++-------------------- ++ ++Value Type:: ++............ ++ ++a form. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The value of - is the form that is currently being evaluated by the Lisp ++read-eval-print loop. ++ ++Examples:: ++.......... ++ ++ (format t "~&Evaluating ~S~ ++ |> Evaluating (FORMAT T "~&Evaluating ~S~ ++ => NIL ++ ++Affected By:: ++............. ++ ++Lisp read-eval-print loop. ++ ++See Also:: ++.......... ++ +++ (variable), * (variable), *note /:: (variable), *note Top level loop:: ++ ++ ++File: gcl.info, Node: + (Variable), Next: * (Variable), Prev: - (Variable), Up: Environment Dictionary ++ ++25.2.21 +, ++, +++ [Variable] ++----------------------------- ++ ++Value Type:: ++............ ++ ++an object. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The variables +, ++, and +++ are maintained by the Lisp read-eval-print ++loop to save forms that were recently evaluated. ++ ++ The value of + is the last form that was evaluated, the value of ++ ++is the previous value of +, and the value of +++ is the previous value ++of ++. ++ ++Examples:: ++.......... ++ ++ (+ 0 1) => 1 ++ (- 4 2) => 2 ++ (/ 9 3) => 3 ++ (list + ++ +++) => ((/ 9 3) (- 4 2) (+ 0 1)) ++ (setq a 1 b 2 c 3 d (list a b c)) => (1 2 3) ++ (setq a 4 b 5 c 6 d (list a b c)) => (4 5 6) ++ (list a b c) => (4 5 6) ++ (eval +++) => (1 2 3) ++ #.`(,@++ d) => (1 2 3 (1 2 3)) ++ ++Affected By:: ++............. ++ ++Lisp read-eval-print loop. ++ ++See Also:: ++.......... ++ ++*note -:: (variable), * (variable), *note /:: (variable), *note Top ++level loop:: ++ ++ ++File: gcl.info, Node: * (Variable), Next: / (Variable), Prev: + (Variable), Up: Environment Dictionary ++ ++25.2.22 *, **, *** [Variable] ++----------------------------- ++ ++Value Type:: ++............ ++ ++an object. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The variables *, **, and *** are maintained by the Lisp read-eval-print ++loop to save the values of results that are printed each time through ++the loop. ++ ++ The value of * is the most recent primary value that was printed, the ++value of ** is the previous value of *, and the value of *** is the ++previous value of **. ++ ++ If several values are produced, * contains the first value only; * ++contains nil if zero values are produced. ++ ++ The values of *, **, and *** are updated immediately prior to ++printing the return value of a top-level form by the Lisp ++read-eval-print loop. If the evaluation of such a form is aborted prior ++to its normal return, the values of *, **, and *** are not updated. ++ ++Examples:: ++.......... ++ ++ (values 'a1 'a2) => A1, A2 ++ 'b => B ++ (values 'c1 'c2 'c3) => C1, C2, C3 ++ (list * ** ***) => (C1 B A1) ++ ++ (defun cube-root (x) (expt x 1/3)) => CUBE-ROOT ++ (compile *) => CUBE-ROOT ++ (setq a (cube-root 27.0)) => 3.0 ++ (* * 9.0) => 27.0 ++ ++Affected By:: ++............. ++ ++Lisp read-eval-print loop. ++ ++See Also:: ++.......... ++ ++*note -:: (variable), + (variable), *note /:: (variable), *note Top ++level loop:: ++ ++Notes:: ++....... ++ ++ * == (car /) ++ ** == (car //) ++ *** == (car ///) ++ ++ ++File: gcl.info, Node: / (Variable), Next: lisp-implementation-type, Prev: * (Variable), Up: Environment Dictionary ++ ++25.2.23 /, //, /// [Variable] ++----------------------------- ++ ++Value Type:: ++............ ++ ++a proper list. ++ ++Initial Value:: ++............... ++ ++implementation-dependent. ++ ++Description:: ++............. ++ ++The variables /, //, and /// are maintained by the Lisp read-eval-print ++loop to save the values of results that were printed at the end of the ++loop. ++ ++ The value of / is a list of the most recent values that were printed, ++the value of // is the previous value of /, and the value of /// is the ++previous value of //. ++ ++ The values of /, //, and /// are updated immediately prior to ++printing the return value of a top-level form by the Lisp ++read-eval-print loop. If the evaluation of such a form is aborted prior ++to its normal return, the values of /, //, and /// are not updated. ++ ++Examples:: ++.......... ++ ++ (floor 22 7) => 3, 1 ++ (+ (* (car /) 7) (cadr /)) => 22 ++ ++Affected By:: ++............. ++ ++Lisp read-eval-print loop. ++ ++See Also:: ++.......... ++ ++*note -:: (variable), + (variable), * (variable), *note Top level loop:: ++ ++ ++File: gcl.info, Node: lisp-implementation-type, Next: short-site-name, Prev: / (Variable), Up: Environment Dictionary ++ ++25.2.24 lisp-implementation-type, ++--------------------------------- ++ ++lisp-implementation-version ++--------------------------- ++ ++ [Function] ++ ++ 'lisp-implementation-type' => description ++ ++ 'lisp-implementation-version' => description ++ ++Arguments and Values:: ++...................... ++ ++description--a string or nil. ++ ++Description:: ++............. ++ ++lisp-implementation-type and lisp-implementation-version identify the ++current implementation of Common Lisp. ++ ++ lisp-implementation-type returns a string that identifies the generic ++name of the particular Common Lisp implementation. ++ ++ lisp-implementation-version returns a string that identifies the ++version of the particular Common Lisp implementation. ++ ++ If no appropriate and relevant result can be produced, nil is ++returned instead of a string. ++ ++Examples:: ++.......... ++ ++ (lisp-implementation-type) ++ => "ACME Lisp" ++ OR=> "Joe's Common Lisp" ++ (lisp-implementation-version) ++ => "1.3a" ++ => "V2" ++ OR=> "Release 17.3, ECO #6" ++ ++ ++File: gcl.info, Node: short-site-name, Next: machine-instance, Prev: lisp-implementation-type, Up: Environment Dictionary ++ ++25.2.25 short-site-name, long-site-name [Function] ++-------------------------------------------------- ++ ++'short-site-name' => description ++ ++ 'long-site-name' => description ++ ++Arguments and Values:: ++...................... ++ ++description--a string or nil. ++ ++Description:: ++............. ++ ++short-site-name and long-site-name return a string that identifies the ++physical location of the computer hardware, or nil if no appropriate ++description can be produced. ++ ++Examples:: ++.......... ++ ++ (short-site-name) ++ => "MIT AI Lab" ++ OR=> "CMU-CSD" ++ (long-site-name) ++ => "MIT Artificial Intelligence Laboratory" ++ OR=> "CMU Computer Science Department" ++ ++Affected By:: ++............. ++ ++The implementation, the location of the computer hardware, and the ++installation/configuration process. ++ ++ ++File: gcl.info, Node: machine-instance, Next: machine-type, Prev: short-site-name, Up: Environment Dictionary ++ ++25.2.26 machine-instance [Function] ++----------------------------------- ++ ++'machine-instance' => description ++ ++Arguments and Values:: ++...................... ++ ++description--a string or nil. ++ ++Description:: ++............. ++ ++Returns a string that identifies the particular instance of the computer ++hardware on which Common Lisp is running, or nil if no such string can ++be computed. ++ ++Examples:: ++.......... ++ ++ (machine-instance) ++ => "ACME.COM" ++ OR=> "S/N 123231" ++ OR=> "18.26.0.179" ++ OR=> "AA-00-04-00-A7-A4" ++ ++Affected By:: ++............. ++ ++The machine instance, and the implementation. ++ ++See Also:: ++.......... ++ ++*note machine-type:: , *note machine-version:: ++ ++ ++File: gcl.info, Node: machine-type, Next: machine-version, Prev: machine-instance, Up: Environment Dictionary ++ ++25.2.27 machine-type [Function] ++------------------------------- ++ ++'machine-type' => description ++ ++Arguments and Values:: ++...................... ++ ++description--a string or nil. ++ ++Description:: ++............. ++ ++Returns a string that identifies the generic name of the computer ++hardware on which Common Lisp is running. ++ ++Examples:: ++.......... ++ ++ (machine-type) ++ => "DEC PDP-10" ++ OR=> "Symbolics LM-2" ++ ++Affected By:: ++............. ++ ++The machine type. The implementation. ++ ++See Also:: ++.......... ++ ++*note machine-version:: ++ ++ ++File: gcl.info, Node: machine-version, Next: software-type, Prev: machine-type, Up: Environment Dictionary ++ ++25.2.28 machine-version [Function] ++---------------------------------- ++ ++'machine-version' => description ++ ++Arguments and Values:: ++...................... ++ ++description--a string or nil. ++ ++Description:: ++............. ++ ++Returns a string that identifies the version of the computer hardware on ++which Common Lisp is running, or nil if no such value can be computed. ++ ++Examples:: ++.......... ++ ++ (machine-version) => "KL-10, microcode 9" ++ ++Affected By:: ++............. ++ ++The machine version, and the implementation. ++ ++See Also:: ++.......... ++ ++*note machine-type:: , *note machine-instance:: ++ ++ ++File: gcl.info, Node: software-type, Next: user-homedir-pathname, Prev: machine-version, Up: Environment Dictionary ++ ++25.2.29 software-type, software-version [Function] ++-------------------------------------------------- ++ ++'software-type' => description ++ ++ 'software-version' => description ++ ++Arguments and Values:: ++...................... ++ ++description--a string or nil. ++ ++Description:: ++............. ++ ++software-type returns a string that identifies the generic name of any ++relevant supporting software, or nil if no appropriate or relevant ++result can be produced. ++ ++ software-version returns a string that identifies the version of any ++relevant supporting software, or nil if no appropriate or relevant ++result can be produced. ++ ++Examples:: ++.......... ++ ++ (software-type) => "Multics" ++ (software-version) => "1.3x" ++ ++Affected By:: ++............. ++ ++Operating system environment. ++ ++Notes:: ++....... ++ ++This information should be of use to maintainers of the implementation. ++ ++ ++File: gcl.info, Node: user-homedir-pathname, Prev: software-type, Up: Environment Dictionary ++ ++25.2.30 user-homedir-pathname [Function] ++---------------------------------------- ++ ++'user-homedir-pathname' &optional host => pathname ++ ++Arguments and Values:: ++...................... ++ ++host--a string, a list of strings, or :unspecific. ++ ++ pathname--a pathname, or nil. ++ ++Description:: ++............. ++ ++user-homedir-pathname determines the pathname that corresponds to the ++user's home directory on host. If host is not supplied, its value is ++implementation-dependent. ++ ++ For a description of :unspecific, see *note Pathname Components::. ++ ++ The definition of home directory is implementation-dependent, but ++defined in Common Lisp to mean the directory where the user keeps ++personal files such as initialization files and mail. ++ ++ user-homedir-pathname returns a pathname without any name, type, or ++version component (those components are all nil) for the user's home ++directory on host. ++ ++ If it is impossible to determine the user's home directory on host, ++then nil is returned. user-homedir-pathname never returns nil if host ++is not supplied. ++ ++Examples:: ++.......... ++ ++ (pathnamep (user-homedir-pathname)) => true ++ ++Affected By:: ++............. ++ ++The host computer's file system, and the implementation. ++ ++ ++File: gcl.info, Node: Glossary (Glossary), Next: Appendix, Prev: Environment, Up: Top ++ ++26 Glossary ++*********** ++ ++* Menu: ++ ++* Glossary:: ++ ++ ++File: gcl.info, Node: Glossary, Prev: Glossary (Glossary), Up: Glossary (Glossary) ++ ++26.1 Glossary ++============= ++ ++Each entry in this glossary has the following parts: ++ ++* ++ the term being defined, set in boldface. ++ ++* ++ optional pronunciation, enclosed in square brackets and set in ++ boldface, as in the following example: pronounced 'a ,list . The ++ pronunciation key follows Webster's Third New International ++ Dictionary the English Language, Unabridged, except that "e" is ++ used to notate the schwa (upside-down "e") character. ++ ++* ++ the part or parts of speech, set in italics. If a term can be used ++ as several parts of speech, there is a separate definition for each ++ part of speech. ++ ++* ++ one or more definitions, organized as follows: ++ ++ - ++ an optional number, present if there are several definitions. ++ Lowercase letters might also be used in cases where ++ subdefinitions of a numbered definition are necessary. ++ ++ - ++ an optional part of speech, set in italics, present if the ++ term is one of several parts of speech. ++ ++ - ++ an optional discipline, set in italics, present if the term ++ has a standard definition being repeated. For example, ++ "Math." ++ ++ - ++ an optional context, present if this definition is meaningful ++ only in that context. For example, "(of a symbol)". ++ ++ - ++ the definition. ++ ++ - ++ an optional example sentence. For example, "This is an ++ example of an example." ++ ++ - ++ optional cross references. ++ ++ In addition, some terms have idiomatic usage in the Common Lisp ++community which is not shared by other communities, or which is not ++technically correct. Definitions labeled "Idiom." represent such ++idiomatic usage; these definitions are sometimes followed by an ++explanatory note. ++ ++ Words in this font are words with entries in the glossary. Words in ++example sentences do not follow this convention. ++ ++ When an ambiguity arises, the longest matching substring has ++precedence. For example, "complex float" refers to a single glossary ++entry for "complex float" rather than the combined meaning of the ++glossary terms "complex" and "float." ++ ++ Subscript notation, as in "something_n" means that the nth definition ++of "something" is intended. This notation is used only in situations ++where the context might be insufficient to disambiguate. ++ ++ The following are abbreviations used in the glossary: ++ ++ Abbreviation Meaning ++adj. ++ adjective ++adv. ++ adverb ++ANSI ++ compatible with one or more ANSI standards ++Comp. ++ computers ++Idiom. ++ idiomatic ++IEEE ++ compatible with one or more IEEE standards ++ISO ++ compatible with one or more ISO standards ++Math. ++ mathematics ++Trad. ++ traditional ++n. ++ noun ++v. ++ verb ++v.t. ++ transitive verb ++ ++Non-alphabetic ++-------------- ++ ++() ++ pronounced 'nil , n. an alternative notation for writing the ++ symbol~nil, used to emphasize the use of nil as an empty list. ++ ++A ++- ++ ++absolute ++ adj. 1. (of a time) representing a specific point in time. 2. ++ (of a pathname) representing a specific position in a directory ++ hierarchy. See relative. ++ ++access ++ n., v.t. 1. v.t. (a place, or array) to read_1 or write_1 the ++ value of the place or an element of the array. 2. n. (of a ++ place) an attempt to access_1 the value of the place. ++ ++accessibility ++ n. the state of being accessible. ++ ++accessible ++ adj. 1. (of an object) capable of being referenced. 2. (of ++ shared slots or local slots in an instance of a class) having been ++ defined by the class of the instance or inherited from a superclass ++ of that class. 3. (of a symbol in a package) capable of being ++ referenced without a package prefix when that package is current, ++ regardless of whether the symbol is present in that package or is ++ inherited. ++ ++accessor ++ n. an operator that performs an access. See reader and writer. ++ ++active ++ adj. 1. (of a handler, a restart, or a catch tag) having been ++ established but not yet disestablished. 2. (of an element of an ++ array) having an index that is greater than or equal to zero, but ++ less than the fill pointer (if any). For an array that has no fill ++ pointer, all elements are considered active. ++ ++actual adjustability ++ n. (of an array) a generalized boolean that is associated with the ++ array, representing whether the array is actually adjustable. See ++ also expressed adjustability and adjustable-array-p. ++ ++actual argument ++ n. Trad. an argument. ++ ++actual array element type ++ n. (of an array) the type for which the array is actually ++ specialized, which is the upgraded array element type of the ++ expressed array element type of the array. See the function ++ array-element-type. ++ ++actual complex part type ++ n. (of a complex) the type in which the real and imaginary parts ++ of the complex are actually represented, which is the upgraded ++ complex part type of the expressed complex part type of the ++ complex. ++ ++actual parameter ++ n. Trad. an argument. ++ ++actually adjustable ++ adj. (of an array) such that adjust-array can adjust its ++ characteristics by direct modification. A conforming program may ++ depend on an array being actually adjustable only if either that ++ array is known to have been expressly adjustable or if that array ++ has been explicitly tested by adjustable-array-p. ++ ++adjustability ++ n. (of an array) 1. expressed adjustability. 2. actual ++ adjustability. ++ ++adjustable ++ adj. (of an array) 1. expressly adjustable. 2. actually ++ adjustable. ++ ++after method ++ n. a method having the qualifier :after. ++ ++alist ++ pronounced '\=a ,list , n. an association list. ++ ++alphabetic ++ n., adj. 1. adj. (of a character) being one of the standard ++ characters A through Z or a through z, or being any ++ implementation-defined character that has case, or being some other ++ graphic character defined by the implementation to be alphabetic_1. ++ 2. a. n. one of several possible constituent traits of a ++ character. For details, see *note Constituent Characters:: and ++ *note Reader Algorithm::. b. adj. (of a character) being a ++ character that has syntax type constituent in the current readtable ++ and that has the constituent trait alphabetic_{2a}. See ++ Figure~2-8. ++ ++alphanumeric ++ adj. (of a character) being either an alphabetic_1 character or a ++ numeric character. ++ ++ampersand ++ n. the standard character that is called "ampersand" (&). See ++ Figure~2-5. ++ ++anonymous ++ adj. 1. (of a class or function) having no name 2. (of a ++ restart) having a name of nil. ++ ++apparently uninterned ++ adj. having a home package of nil. (An apparently uninterned ++ symbol might or might not be an uninterned symbol. Uninterned ++ symbols have a home package of nil, but symbols which have been ++ uninterned from their home package also have a home package of nil, ++ even though they might still be interned in some other package.) ++ ++applicable ++ adj. 1. (of a handler) being an applicable handler. 2. (of a ++ method) being an applicable method. 3. (of a restart) being an ++ applicable restart. ++ ++applicable handler ++ n. (for a condition being signaled) an active handler for which ++ the associated type contains the condition. ++ ++applicable method ++ n. (of a generic function called with arguments) a method of the ++ generic function for which the arguments satisfy the parameter ++ specializers of that method. See *note Selecting the Applicable ++ Methods::. ++ ++applicable restart ++ n. 1. (for a condition) an active handler for which the ++ associated test returns true when given the condition as an ++ argument. 2. (for no particular condition) an active handler for ++ which the associated test returns true when given nil as an ++ argument. ++ ++apply ++ v.t. (a function to a list) to call the function with arguments ++ that are the elements of the list. "Applying the function + to a ++ list of integers returns the sum of the elements of that list." ++ ++argument ++ n. 1. (of a function) an object which is offered as data to the ++ function when it is called. ++ ++ 2. (of a format control) a format argument. ++ ++argument evaluation order ++ n. the order in which arguments are evaluated in a function call. ++ "The argument evaluation order for Common Lisp is left to right." ++ See *note Evaluation::. ++ ++argument precedence order ++ n. the order in which the arguments to a generic function are ++ considered when sorting the applicable methods into precedence ++ order. ++ ++around method ++ n. a method having the qualifier :around. ++ ++array ++ n. an object of type array, which serves as a container for other ++ objects arranged in a Cartesian coordinate system. ++ ++array element type ++ n. (of an array) 1. a type associated with the array, and of ++ which all elements of the array are constrained to be members. 2. ++ the actual array element type of the array. 3. the expressed ++ array element type of the array. ++ ++array total size ++ n. the total number of elements in an array, computed by taking ++ the product of the dimensions of the array. (The size of a ++ zero-dimensional array is therefore one.) ++ ++assign ++ v.t. (a variable) to change the value of the variable in a binding ++ that has already been established. See the special operator setq. ++ ++association list ++ n. a list of conses representing an association of keys with ++ values, where the car of each cons is the key and the cdr is the ++ value associated with that key. ++ ++asterisk ++ n. the standard character that is variously called "asterisk" or ++ "star" (*). See Figure~2-5. ++ ++at-sign ++ n. the standard character that is variously called "commercial at" ++ or "at sign" (@). See Figure~2-5. ++ ++atom ++ n. any object that is not a cons. "A vector is an atom." ++ ++atomic ++ adj. being an atom. "The number 3, the symbol foo, and nil are ++ atomic." ++ ++atomic type specifier ++ n. a type specifier that is atomic. For every atomic type ++ specifier, x, there is an equivalent compound type specifier with ++ no arguments supplied, (x). ++ ++attribute ++ n. (of a character) a program-visible aspect of the character. ++ The only standardized attribute of a character is its code_2, but ++ implementations are permitted to have additional ++ implementation-defined attributes. See *note Character ++ Attributes::. "An implementation that support fonts might make ++ font information an attribute of a character, while others might ++ represent font information separately from characters." ++ ++aux variable ++ n. a variable that occurs in the part of a lambda list that was ++ introduced by &aux. Unlike all other variables introduced by a ++ lambda-list, aux variables are not parameters. ++ ++auxiliary method ++ n. a member of one of two sets of methods (the set of primary ++ methods is the other) that form an exhaustive partition of the set ++ of methods on the method's generic function. How these sets are ++ determined is dependent on the method combination type; see *note ++ Introduction to Methods::. ++ ++B ++- ++ ++backquote ++ n. the standard character that is variously called "grave accent" ++ or "backquote" (`). See Figure~2-5. ++ ++backslash ++ n. the standard character that is variously called "reverse ++ solidus" or "backslash" (\). See Figure~2-5. ++ ++base character ++ n. a character ++ ++ of type base-char. ++ ++base string ++ n. a string of type base-string. ++ ++before method ++ n. a method having the qualifier :before. ++ ++bidirectional ++ adj. (of a stream) being both an input stream and an output ++ stream. ++ ++binary ++ adj. 1. (of a stream) being a stream that has an element type ++ that is a subtype of type integer. The most fundamental operation ++ on a binary input stream is read-byte and on a binary output stream ++ is write-byte. See character. 2. (of a file) having been created ++ by opening a binary stream. (It is implementation-dependent ++ whether this is an detectable aspect of the file, or whether any ++ given character file can be treated as a binary file.) ++ ++bind ++ v.t. (a variable) to establish a binding for the variable. ++ ++binding ++ n. an association between a name and that which the name denotes. ++ "A lexical binding is a lexical association between a name and its ++ value." ++ ++bit ++ n. an object of type bit; that is, the integer 0 or the integer 1. ++ ++bit array ++ n. a specialized array that is of type (array bit), and whose ++ elements are of type bit. ++ ++bit vector ++ n. a specialized vector that is of type bit-vector, and whose ++ elements are of type bit. ++ ++bit-wise logical operation specifier ++ n. an object which names one of the sixteen possible bit-wise ++ logical operations that can be performed by the boole function, and ++ which is the value of exactly one of the constant variables ++ boole-clr, boole-set, boole-1, boole-2, boole-c1, boole-c2, ++ boole-and, boole-ior, boole-xor, boole-eqv, boole-nand, boole-nor, ++ boole-andc1, boole-andc2, boole-orc1, or boole-orc2. ++ ++block ++ n. a named lexical exit point, established explicitly by block or ++ implicitly by operators such as loop, do and prog, to which control ++ and values may be transfered by using a return-from form with the ++ name of the block. ++ ++block tag ++ n. the symbol that, within the lexical scope of a block form, ++ names the block established by that block form. See return or ++ return-from. ++ ++boa lambda list ++ n. a lambda list that is syntactically like an ordinary lambda ++ list, but that is processed in "by order of argument" style. See ++ *note Boa Lambda Lists::. ++ ++body parameter ++ n. a parameter available in certain lambda lists which from the ++ point of view of conforming programs is like a rest parameter in ++ every way except that it is introduced by &body instead of &rest. ++ (Implementations are permitted to provide extensions which ++ distinguish body parameters and rest parameters--e.g., the forms ++ for operators which were defined using a body parameter might be ++ pretty printed slightly differently than forms for operators which ++ were defined using rest parameters.) ++ ++boolean ++ n. an object of type boolean; that is, one of the following ++ objects: the symbol~t (representing true), or the symbol~nil ++ (representing false). See generalized boolean. ++ ++boolean equivalent ++ n. (of an object O_1) any object O_2 that has the same truth value ++ as O_1 when both O_1 and O_2 are viewed as generalized booleans. ++ ++bound ++ adj., v.t. 1. adj. having an associated denotation in a binding. ++ "The variables named by a let are bound within its body." See ++ unbound. 2. adj. having a local binding which shadows_2 another. ++ "The variable *print-escape* is bound while in the princ function." ++ 3. v.t. the past tense of bind. ++ ++bound declaration ++ n. a declaration that refers to or is associated with a variable ++ or function and that appears within the special form that ++ establishes the variable or function, but before the body of that ++ special form (specifically, at the head of that form's body). (If ++ a bound declaration refers to a function binding or a lexical ++ variable binding, the scope of the declaration is exactly the scope ++ of that binding. If the declaration refers to a dynamic variable ++ binding, the scope of the declaration is what the scope of the ++ binding would have been if it were lexical rather than dynamic.) ++ ++bounded ++ adj. (of a sequence S, by an ordered pair of bounding indices ++ i_{start} and i_{end}) restricted to a subrange of the elements of ++ S that includes each element beginning with (and including) the one ++ indexed by i_{start} and continuing up to (but not including) the ++ one indexed by i_{end}. ++ ++bounding index ++ n. (of a sequence with length n) either of a conceptual pair of ++ integers, i_{start} and i_{end}, respectively called the "lower ++ bounding index" and "upper bounding index", such that 0 <= ++ i_{start} <= i_{end} <= n, and which therefore delimit a subrange ++ of the sequence bounded by i_{start} and i_{end}. ++ ++bounding index designator ++ (for a sequence) one of two objects that, taken together as an ++ ordered pair, behave as a designator for bounding indices of the ++ sequence; that is, they denote bounding indices of the sequence, ++ and are either: an integer (denoting itself) and nil (denoting the ++ length of the sequence), or two integers (each denoting ++ themselves). ++ ++break loop ++ n. A variant of the normal Lisp read-eval-print loop that is ++ recursively entered, usually because the ongoing evaluation of some ++ other form has been suspended for the purpose of debugging. Often, ++ a break loop provides the ability to exit in such a way as to ++ continue the suspended computation. See the function break. ++ ++broadcast stream ++ n. an output stream of type broadcast-stream. ++ ++built-in class ++ n. a class that is a generalized instance of class built-in-class. ++ ++built-in type ++ n. one of the types in Figure~4-2. ++ ++byte ++ n. 1. adjacent bits within an integer. (The specific number of ++ bits can vary from point to point in the program; see the function ++ byte.) 2. an integer in a specified range. (The specific range ++ can vary from point to point in the program; see the functions open ++ and write-byte.) ++ ++byte specifier ++ n. An object of implementation-dependent nature that is returned ++ by the function byte and that specifies the range of bits in an ++ integer to be used as a byte by functions such as ldb. ++ ++C ++- ++ ++cadr ++ pronounced 'ka ,de r , n. (of an object) the car of the cdr of ++ that object. ++ ++call ++ v.t., n. 1. v.t. (a function with arguments) to cause the code ++ represented by that function to be executed in an environment where ++ bindings for the values of its parameters have been established ++ based on the arguments. "Calling the function + with the arguments ++ 5 and 1 yields a value of 6." 2. n. a situation in which a ++ function is called. ++ ++captured initialization form ++ n. an initialization form along with the lexical environment in ++ which the form that defined the initialization form was evaluated. ++ "Each newly added shared slot is set to the result of evaluating ++ the captured initialization form for the slot that was specified in ++ the defclass form for the new class." ++ ++car ++ n. 1. a. (of a cons) the component of a cons corresponding to ++ the first argument to cons; the other component is the cdr. "The ++ function rplaca modifies the car of a cons." b. (of a list) the ++ first element of the list, or nil if the list is the empty list. ++ 2. the object that is held in the car_1. "The function car ++ returns the car of a cons." ++ ++case ++ n. (of a character) the property of being either uppercase or ++ lowercase. Not all characters have case. "The characters #\A and ++ #\a have case, but the character #\$ has no case." See *note ++ Characters With Case:: and the function both-case-p. ++ ++case sensitivity mode ++ n. one of the symbols :upcase, :downcase, :preserve, or :invert. ++ ++catch ++ n. an exit point which is established by a catch form within the ++ dynamic scope of its body, which is named by a catch tag, and to ++ which control and values may be thrown. ++ ++catch tag ++ n. an object which names an active catch. (If more than one catch ++ is active with the same catch tag, it is only possible to throw to ++ the innermost such catch because the outer one is shadowed_2.) ++ ++cddr ++ pronounced 'kud e ,de r or pronounced 'ke ,dude r , n. (of an ++ object) the cdr of the cdr of that object. ++ ++cdr ++ pronounced 'ku ,de r , n. 1. a. (of a cons) the component of a ++ cons corresponding to the second argument to cons; the other ++ component is the car. "The function rplacd modifies the cdr of a ++ cons." b. (of a list L_1) either the list L_2 that contains the ++ elements of L_1 that follow after the first, or else nil if L_1 is ++ the empty list. 2. the object that is held in the cdr_1. "The ++ function cdr returns the cdr of a cons." ++ ++cell ++ n. Trad. (of an object) a conceptual slot of that object. The ++ dynamic variable and global function bindings of a symbol are ++ sometimes referred to as its value cell and function cell, ++ respectively. ++ ++character ++ n., adj. 1. n. an object of type character; that is, an object ++ that represents a unitary token in an aggregate quantity of text; ++ see *note Character Concepts::. 2. adj. a. (of a stream) having ++ an element type that is a subtype of type character. The most ++ fundamental operation on a character input stream is read-char and ++ on a character output stream is write-char. See binary. b. (of a ++ file) having been created by opening a character stream. (It is ++ implementation-dependent whether this is an inspectable aspect of ++ the file, or whether any given binary file can be treated as a ++ character file.) ++ ++character code ++ n. 1. one of possibly several attributes of a character. 2. a ++ non-negative integer less than the value of char-code-limit that is ++ suitable for use as a character code_1. ++ ++character designator ++ n. a designator for a character; that is, an object that denotes a ++ character and that is one of: a designator for a string of length ++ one (denoting the character that is its only element), ++ ++ or a character (denoting itself). ++ ++circular ++ adj. 1. (of a list) a circular list. 2. (of an arbitrary ++ object) having a component, element, constituent_2, or ++ subexpression (as appropriate to the context) that is the object ++ itself. ++ ++circular list ++ n. a chain of conses that has no termination because some cons in ++ the chain is the cdr of a later cons. ++ ++class ++ n. 1. an object that uniquely determines the structure and ++ behavior of a set of other objects called its direct instances, ++ that contributes structure and behavior to a set of other objects ++ called its indirect instances, and that acts as a type specifier ++ for a set of objects called its generalized instances. "The class ++ integer is a subclass of the class number." (Note that the phrase ++ "the class foo" is often substituted for the more precise phrase ++ "the class named foo"--in both cases, a class object (not a symbol) ++ is denoted.) 2. (of an object) the uniquely determined class of ++ which the object is a direct instance. See the function class-of. ++ "The class of the object returned by gensym is symbol." (Note that ++ with this usage a phrase such as "its class is foo" is often ++ substituted for the more precise phrase "its class is the class ++ named foo"--in both cases, a class object (not a symbol) is ++ denoted.) ++ ++class designator ++ n. a designator for a class; that is, an object that denotes a ++ class and that is one of: a symbol (denoting the class named by ++ that symbol; see the function find-class) or a class (denoting ++ itself). ++ ++class precedence list ++ n. a unique total ordering on a class and its superclasses that is ++ consistent with the local precedence orders for the class and its ++ superclasses. For detailed information, see *note Determining the ++ Class Precedence List::. ++ ++close ++ v.t. (a stream) to terminate usage of the stream as a source or ++ sink of data, permitting the implementation to reclaim its internal ++ data structures, and to free any external resources which might ++ have been locked by the stream when it was opened. ++ ++closed ++ adj. (of a stream) having been closed (see close). Some (but not ++ all) operations that are valid on open streams are not valid on ++ closed streams. See *note File Operations on Open and Closed ++ Streams::. ++ ++closure ++ n. a lexical closure. ++ ++coalesce ++ v.t. (literal objects that are similar) to consolidate the ++ identity of those objects, such that they become the same object. ++ See *note Compiler Terminology::. ++ ++code ++ n. 1. Trad. any representation of actions to be performed, ++ whether conceptual or as an actual object, such as forms, lambda ++ expressions, objects of type function, text in a source file, or ++ instruction sequences in a compiled file. This is a generic term; ++ the specific nature of the representation depends on its context. ++ 2. (of a character) a character code. ++ ++coerce ++ v.t. (an object to a type) to produce an object from the given ++ object, without modifying that object, by following some set of ++ coercion rules that must be specifically stated for any context in ++ which this term is used. The resulting object is necessarily of ++ the indicated type, except when that type is a subtype of type ++ complex; in that case, if a complex rational with an imaginary part ++ of zero would result, the result is a rational rather than a ++ complex--see *note Rule of Canonical Representation for Complex ++ Rationals::. ++ ++colon ++ n. the standard character that is called "colon" (:). See ++ Figure~2-5. ++ ++comma ++ n. the standard character that is called "comma" (,). See ++ Figure~2-5. ++ ++compilation ++ n. the process of compiling code by the compiler. ++ ++compilation environment ++ n. 1. An environment that represents information known by the ++ compiler about a form that is being compiled. See *note Compiler ++ Terminology::. 2. An object that represents the compilation ++ environment_1 and that is used as a second argument to a macro ++ function (which supplies a value for any &environment parameter in ++ the macro function's definition). ++ ++compilation unit ++ n. an interval during which a single unit of compilation is ++ occurring. See the macro with-compilation-unit. ++ ++compile ++ v.t. 1. (code) to perform semantic preprocessing of the code, ++ usually optimizing one or more qualities of the code, such as ++ run-time speed of execution or run-time storage usage. The minimum ++ semantic requirements of compilation are that it must remove all ++ macro calls and arrange for all load time values to be resolved ++ prior to run time. 2. (a function) to produce a new object of ++ type compiled-function which represents the result of compiling the ++ code represented by the function. See the function compile. 3. ++ (a source file) to produce a compiled file from a source file. See ++ the function compile-file. ++ ++compile time ++ n. the duration of time that the compiler is processing source ++ code. ++ ++compile-time definition ++ n. a definition in the compilation environment. ++ ++compiled code ++ n. 1. compiled functions. 2. code that represents compiled ++ functions, such as the contents of a compiled file. ++ ++compiled file ++ n. a file which represents the results of compiling the forms ++ which appeared in a corresponding source file, and which can be ++ loaded. See the function compile-file. ++ ++compiled function ++ n. an object of type compiled-function, which is a function that ++ has been compiled, which contains no references to macros that must ++ be expanded at run time, and which contains no unresolved ++ references to load time values. ++ ++compiler ++ n. a facility that is part of Lisp and that translates code into ++ an implementation-dependent form that might be represented or ++ executed efficiently. The functions compile and compile-file ++ permit programs to invoke the compiler. ++ ++compiler macro ++ n. an auxiliary macro definition for a globally defined function ++ or macro which might or might not be called by any given conforming ++ implementation and which must preserve the semantics of the ++ globally defined function or macro but which might perform some ++ additional optimizations. (Unlike a macro, a compiler macro does ++ not extend the syntax of Common Lisp; rather, it provides an ++ alternate implementation strategy for some existing syntax or ++ functionality.) ++ ++compiler macro expansion ++ n. 1. the process of translating a form into another form by a ++ compiler macro. 2. the form resulting from this process. ++ ++compiler macro form ++ n. a function form or macro form whose operator has a definition ++ as a compiler macro, or a funcall form whose first argument is a ++ function form whose argument is the name of a function that has a ++ definition as a compiler macro. ++ ++compiler macro function ++ n. a function of two arguments, a form and an environment, that ++ implements compiler macro expansion by producing either a form to ++ be used in place of the original argument form or else nil, ++ indicating that the original form should not be replaced. See ++ *note Compiler Macros::. ++ ++complex ++ n. an object of type complex. ++ ++complex float ++ n. an object of type complex which has a complex part type that is ++ a subtype of float. A complex float is a complex, but it is not a ++ float. ++ ++complex part type ++ n. (of a complex) 1. the type which is used to represent both the ++ real part and the imaginary part of the complex. 2. the actual ++ complex part type of the complex. 3. the expressed complex part ++ type of the complex. ++ ++complex rational ++ n. an object of type complex which has a complex part type that is ++ a subtype of rational. A complex rational is a complex, but it is ++ not a rational. No complex rational has an imaginary part of zero ++ because such a number is always represented by Common Lisp as an ++ object of type rational; see *note Rule of Canonical Representation ++ for Complex Rationals::. ++ ++complex single float ++ n. an object of type complex which has a complex part type that is ++ a subtype of single-float. A complex single float is a complex, ++ but it is not a single float. ++ ++composite stream ++ n. a stream that is composed of one or more other streams. ++ "make-synonym-stream creates a composite stream." ++ ++compound form ++ n. a non-empty list which is a form: a special form, a lambda ++ form, a macro form, or a function form. ++ ++compound type specifier ++ n. a type specifier that is a cons; i.e., a type specifier that is ++ not an atomic type specifier. "(vector single-float) is a compound ++ type specifier." ++ ++concatenated stream ++ n. an input stream of type concatenated-stream. ++ ++condition ++ n. 1. an object which represents a situation--usually, but not ++ necessarily, during signaling. 2. an object of type condition. ++ ++condition designator ++ n. one or more objects that, taken together, denote either an ++ existing condition object or a condition object to be implicitly ++ created. For details, see *note Condition Designators::. ++ ++condition handler ++ n. a function that might be invoked by the act of signaling, that ++ receives the condition being signaled as its only argument, and ++ that is permitted to handle the condition or to decline. See *note ++ Signaling::. ++ ++condition reporter ++ n. a function that describes how a condition is to be printed when ++ the Lisp printer is invoked while *print-escape* is false. See ++ *note Printing Conditions::. ++ ++conditional newline ++ n. a point in output where a newline might be inserted at the ++ discretion of the pretty printer. There are four kinds of ++ conditional newlines, called "linear-style," "fill-style," ++ "miser-style," and "mandatory-style." See the function ++ pprint-newline and *note Dynamic Control of the Arrangement of ++ Output::. ++ ++conformance ++ n. a state achieved by proper and complete adherence to the ++ requirements of this specification. See *note Conformance::. ++ ++conforming code ++ n. code that is all of part of a conforming program. ++ ++conforming implementation ++ n. an implementation, used to emphasize complete and correct ++ adherance to all conformance criteria. A conforming implementation ++ is capable of accepting a conforming program as input, preparing ++ that program for execution, and executing the prepared program in ++ accordance with this specification. An implementation which has ++ been extended may still be a conforming implementation provided ++ that no extension interferes with the correct function of any ++ conforming program. ++ ++conforming processor ++ n. ANSI a conforming implementation. ++ ++conforming program ++ n. a program, used to emphasize the fact that the program depends ++ for its correctness only upon documented aspects of Common Lisp, ++ and can therefore be expected to run correctly in any conforming ++ implementation. ++ ++congruent ++ n. conforming to the rules of lambda list congruency, as detailed ++ in *note Congruent Lambda-lists for all Methods of a Generic ++ Function::. ++ ++cons ++ n.v. 1. n. a compound data object having two components called ++ the car and the cdr. 2. v. to create such an object. 3. v. ++ Idiom. to create any object, or to allocate storage. ++ ++constant ++ n. 1. a constant form. 2. a constant variable. 3. a constant ++ object. 4. a self-evaluating object. ++ ++constant form ++ n. any form for which evaluation always yields the same value, ++ that neither affects nor is affected by the environment in which it ++ is evaluated (except that it is permitted to refer to the names of ++ constant variables defined in the environment), and that neither ++ affects nor is affected by the state of any object except those ++ objects that are otherwise inaccessible parts of objects created by ++ the form itself. "A car form in which the argument is a quote form ++ is a constant form." ++ ++constant object ++ n. an object that is constrained (e.g., by its context in a ++ program or by the source from which it was obtained) to be ++ immutable. "A literal object that has been processed by ++ compile-file is a constant object." ++ ++constant variable ++ n. a variable, the value of which can never change; that is, a ++ keyword_1 or a named constant. "The symbols t, nil, :direction, ++ and most-positive-fixnum are constant variables." ++ ++constituent ++ n., adj. 1. a. n. the syntax type of a character that is part ++ of a token. For details, see *note Constituent Characters::. b. ++ adj. (of a character) having the constituent_{1a} syntax type_2. ++ c. n. a constituent_{1b} character. 2. n. (of a composite ++ stream) one of possibly several objects that collectively comprise ++ the source or sink of that stream. ++ ++constituent trait ++ n. (of a character) one of several classifications of a ++ constituent character in a readtable. See *note Constituent ++ Characters::. ++ ++constructed stream ++ n. a stream whose source or sink is a Lisp object. Note that ++ since a stream is another Lisp object, composite streams are ++ considered constructed streams. "A string stream is a constructed ++ stream." ++ ++contagion ++ n. a process whereby operations on objects of differing types ++ (e.g., arithmetic on mixed types of numbers) produce a result whose ++ type is controlled by the dominance of one argument's type over the ++ types of the other arguments. See *note Contagion in Numeric ++ Operations::. ++ ++continuable ++ n. (of an error) an error that is correctable by the continue ++ restart. ++ ++control form ++ n. 1. a form that establishes one or more places to which control ++ can be transferred. 2. a form that transfers control. ++ ++copy ++ n. 1. (of a cons C) a fresh cons with the same car and cdr as C. ++ 2. (of a list L) a fresh list with the same elements as L. (Only ++ the list structure is fresh; the elements are the same.) See the ++ function copy-list. 3. (of an association list A with elements ++ A_i) a fresh list B with elements B_i, each of which is nil if A_i ++ is nil, or else a copy of the cons A_i. See the function ++ copy-alist. 4. (of a tree T) a fresh tree with the same leaves as ++ T. See the function copy-tree. 5. (of a random state R) a fresh ++ random state that, if used as an argument to to the function random ++ would produce the same series of "random" values as R would ++ produce. ++ ++ 6. (of a structure S) a fresh structure that has the same type as ++ S, and that has slot values, each of which is the same as the ++ corresponding slot value of S. ++ ++ (Note that since the difference between a cons, a list, and a tree ++ is a matter of "view" or "intention," there can be no ++ general-purpose function which, based solely on the type of an ++ object, can determine which of these distinct meanings is intended. ++ The distinction rests solely on the basis of the text description ++ within this document. For example, phrases like "a copy of the ++ given list" or "copy of the list x" imply the second definition.) ++ ++correctable ++ adj. (of an error) 1. (by a restart other than abort that has ++ been associated with the error) capable of being corrected by ++ invoking that restart. "The function cerror signals an error that ++ is correctable by the continue restart." ++ ++ (Note that correctability is not a property of an error object, but ++ rather a property of the dynamic environment that is in effect when ++ the error is signaled. Specifically, the restart is "associated ++ with" the error condition object. See *note Associating a Restart ++ with a Condition::.) ++ ++ 2. (when no specific restart is mentioned) correctable_1 by at ++ least one restart. "import signals a correctable error of type ++ package-error if any of the imported symbols has the same name as ++ some distinct symbol already accessible in the package." ++ ++current input base ++ n. (in a dynamic environment) the radix that is the value of ++ *read-base* in that environment, and that is the default radix ++ employed by the Lisp reader and its related functions. ++ ++current logical block ++ n. the context of the innermost lexically enclosing use of ++ pprint-logical-block. ++ ++current output base ++ n. (in a dynamic environment) the radix that is the value of ++ *print-base* in that environment, and that is the default radix ++ employed by the Lisp printer and its related functions. ++ ++current package ++ n. (in a dynamic environment) the package that is the value of ++ *package* in that environment, and that is the default package ++ employed by the Lisp reader and Lisp printer, and their related ++ functions. ++ ++current pprint dispatch table ++ n. (in a dynamic environment) the pprint dispatch table that is ++ the value of *print-pprint-dispatch* in that environment, and that ++ is the default pprint dispatch table employed by the pretty ++ printer. ++ ++current random state ++ n. (in a dynamic environment) the random state that is the value ++ of *random-state* in that environment, and that is the default ++ random state employed by random. ++ ++current readtable ++ n. (in a dynamic environment) the readtable that is the value of ++ *readtable* in that environment, and that affects the way in which ++ expressions_2 are parsed into objects by the Lisp reader. ++ ++D ++- ++ ++data type ++ n. Trad. a type. ++ ++debug I/O ++ n. the bidirectional stream that is the value of the variable ++ *debug-io*. ++ ++debugger ++ n. a facility that allows the user to handle a condition ++ interactively. For example, the debugger might permit interactive ++ selection of a restart from among the active restarts, and it might ++ perform additional implementation-defined services for the purposes ++ of debugging. ++ ++declaration ++ n. a global declaration or local declaration. ++ ++declaration identifier ++ n. one of the symbols declaration, dynamic-extent, ftype, ++ function, ignore, inline, notinline, optimize, special, or type; or ++ a symbol which is the name of a type; or a symbol which has been ++ declared to be a declaration identifier by using a declaration ++ declaration. ++ ++declaration specifier ++ n. an expression that can appear at top level of a declare ++ expression or a declaim form, or as the argument to proclaim, and ++ which has a car which is a declaration identifier, and which has a ++ cdr that is data interpreted according to rules specific to the ++ declaration identifier. ++ ++declare ++ v. to establish a declaration. See declare, declaim, or proclaim. ++ ++decline ++ v. (of a handler) to return normally without having handled the ++ condition being signaled, permitting the signaling process to ++ continue as if the handler had not been present. ++ ++decoded time ++ n. absolute time, represented as an ordered series of nine objects ++ which, taken together, form a description of a point in calendar ++ time, accurate to the nearest second (except that leap seconds are ++ ignored). See *note Decoded Time::. ++ ++default method ++ n. a method having no parameter specializers other than the class ++ t. Such a method is always an applicable method but might be ++ shadowed_2 by a more specific method. ++ ++defaulted initialization argument list ++ n. a list of alternating initialization argument names and values ++ in which unsupplied initialization arguments are defaulted, used in ++ the protocol for initializing and reinitializing instances of ++ classes. ++ ++define-method-combination arguments lambda list ++ n. a lambda list used by the :arguments option to ++ define-method-combination. See *note Define-method-combination ++ Arguments Lambda Lists::. ++ ++define-modify-macro lambda list ++ n. a lambda list used by define-modify-macro. See *note ++ Define-modify-macro Lambda Lists::. ++ ++defined name ++ n. a symbol the meaning of which is defined by Common Lisp. ++ ++defining form ++ n. a form that has the side-effect of establishing a definition. ++ "defun and defparameter are defining forms." ++ ++defsetf lambda list ++ n. a lambda list that is like an ordinary lambda list except that ++ it does not permit &aux and that it permits use of &environment. ++ See *note Defsetf Lambda Lists::. ++ ++deftype lambda list ++ n. a lambda list that is like a macro lambda list except that the ++ default value for unsupplied optional parameters and keyword ++ parameters is the symbol * (rather than nil). See *note Deftype ++ Lambda Lists::. ++ ++denormalized ++ adj., ANSI, IEEE (of a float) conforming to the description of ++ "denormalized" as described by IEEE Standard for Binary ++ Floating-Point Arithmetic. For example, in an implementation where ++ the minimum possible exponent was -7 but where 0.001 was a valid ++ mantissa, the number 1.0e-10 might be representable as 0.001e-7 ++ internally even if the normalized representation would call for it ++ to be represented instead as 1.0e-10 or 0.1e-9. By their nature, ++ denormalized floats generally have less precision than normalized ++ floats. ++ ++derived type ++ n. a type specifier which is defined in terms of an expansion into ++ another type specifier. deftype defines derived types, and there ++ may be other implementation-defined operators which do so as well. ++ ++derived type specifier ++ n. a type specifier for a derived type. ++ ++designator ++ n. an object that denotes another object. In the dictionary entry ++ for an operator if a parameter is described as a designator for a ++ type, the description of the operator is written in a way that ++ assumes that appropriate coercion to that type has already ++ occurred; that is, that the parameter is already of the denoted ++ type. For more detailed information, see *note Designators::. ++ ++destructive ++ adj. (of an operator) capable of modifying some program-visible ++ aspect of one or more objects that are either explicit arguments to ++ the operator or that can be obtained directly or indirectly from ++ the global environment by the operator. ++ ++destructuring lambda list ++ n. an extended lambda list used in destructuring-bind and nested ++ within macro lambda lists. See *note Destructuring Lambda Lists::. ++ ++different ++ adj. not the same "The strings "FOO" and "foo" are different under ++ equal but not under equalp." ++ ++digit ++ n. (in a radix) a character that is among the possible digits (0 ++ to 9, A to Z, and a to z) and that is defined to have an associated ++ numeric weight as a digit in that radix. See *note Digits in a ++ Radix::. ++ ++dimension ++ n. 1. a non-negative integer indicating the number of objects an ++ array can hold along one axis. If the array is a vector with a ++ fill pointer, the fill pointer is ignored. "The second dimension ++ of that array is 7." 2. an axis of an array. "This array has six ++ dimensions." ++ ++direct instance ++ n. (of a class C) an object whose class is C itself, rather than ++ some subclass of C. "The function make-instance always returns a ++ direct instance of the class which is (or is named by) its first ++ argument." ++ ++direct subclass ++ n. (of a class C_1) a class C_2, such that C_1 is a direct ++ superclass of C_2. ++ ++direct superclass ++ n. (of a class C_1) a class C_2 which was explicitly designated as ++ a superclass of C_1 in the definition of C_1. ++ ++disestablish ++ v.t. to withdraw the establishment of an object, a binding, an ++ exit point, a tag, a handler, a restart, or an environment. ++ ++disjoint ++ n. (of types) having no elements in common. ++ ++dispatching macro character ++ n. a macro character that has an associated table that specifies ++ the function to be called for each character that is seen following ++ the dispatching macro character. See the function ++ make-dispatch-macro-character. ++ ++displaced array ++ n. an array which has no storage of its own, but which is instead ++ indirected to the storage of another array, called its target, at a ++ specified offset, in such a way that any attempt to access the ++ displaced array implicitly references the target array. ++ ++distinct ++ adj. not identical. ++ ++documentation string ++ n. (in a defining form) A literal string which because of the ++ context in which it appears (rather than because of some ++ intrinsically observable aspect of the string) is taken as ++ documentation. In some cases, the documentation string is saved in ++ such a way that it can later be obtained by supplying either an ++ object, or by supplying a name and a "kind" to the function ++ documentation. "The body of code in a defmacro form can be ++ preceded by a documentation string of kind function." ++ ++dot ++ n. the standard character that is variously called "full stop," ++ "period," or "dot" (.). See Figure~2-5. ++ ++dotted list ++ n. a list which has a terminating atom that is not nil. (An atom ++ by itself is not a dotted list, however.) ++ ++dotted pair ++ n. 1. a cons whose cdr is a non-list. 2. any cons, used to ++ emphasize the use of the cons as a symmetric data pair. ++ ++double float ++ n. an object of type double-float. ++ ++double-quote ++ n. the standard character that is variously called "quotation ++ mark" or "double quote" ("). See Figure~2-5. ++ ++dynamic binding ++ n. a binding in a dynamic environment. ++ ++dynamic environment ++ n. that part of an environment that contains bindings with dynamic ++ extent. A dynamic environment contains, among other things: exit ++ points established by unwind-protect, and bindings of dynamic ++ variables, exit points established by catch, condition handlers, ++ and restarts. ++ ++dynamic extent ++ n. an extent whose duration is bounded by points of establishment ++ and disestablishment within the execution of a particular form. ++ See indefinite extent. "Dynamic variable bindings have dynamic ++ extent." ++ ++dynamic scope ++ n. indefinite scope along with dynamic extent. ++ ++dynamic variable ++ n. a variable the binding for which is in the dynamic environment. ++ See special. ++ ++E ++- ++ ++echo stream ++ n. a stream of type echo-stream. ++ ++effective method ++ n. the combination of applicable methods that are executed when a ++ generic function is invoked with a particular sequence of ++ arguments. ++ ++element ++ n. 1. (of a list) an object that is the car of one of the conses ++ that comprise the list. 2. (of an array) an object that is stored ++ in the array. 3. (of a sequence) an object that is an element of ++ the list or array that is the sequence. 4. (of a type) an object ++ that is a member of the set of objects designated by the type. 5. ++ (of an input stream) a character or number (as appropriate to the ++ element type of the stream) that is among the ordered series of ++ objects that can be read from the stream (using read-char or ++ read-byte, as appropriate to the stream). 6. (of an output ++ stream) a character or number (as appropriate to the element type ++ of the stream) that is among the ordered series of objects that has ++ been or will be written to the stream (using write-char or ++ write-byte, as appropriate to the stream). 7. (of a class) a ++ generalized instance of the class. ++ ++element type ++ n. 1. (of an array) the array element type of the array. 2. (of ++ a stream) the stream element type of the stream. ++ ++em ++ n. Trad. a context-dependent unit of measure commonly used in ++ typesetting, equal to the displayed width of of a letter "M" in the ++ current font. (The letter "M" is traditionally chosen because it ++ is typically represented by the widest glyph in the font, and other ++ characters' widths are typically fractions of an em. In ++ implementations providing non-Roman characters with wider ++ characters than "M," it is permissible for another character to be ++ the implementation-defined reference character for this measure, ++ and for "M" to be only a fraction of an em wide.) In a fixed width ++ font, a line with n characters is n ems wide; in a variable width ++ font, n ems is the expected upper bound on the width of such a ++ line. ++ ++empty list ++ n. the list containing no elements. See (). ++ ++empty type ++ n. the type that contains no elements, and that is a subtype of ++ all types (including itself). See nil. ++ ++end of file ++ n. 1. the point in an input stream beyond which there is no ++ further data. Whether or not there is such a point on an ++ interactive stream is implementation-defined. 2. a situation that ++ occurs upon an attempt to obtain data from an input stream that is ++ at the end of file_1. ++ ++environment ++ n. 1. a set of bindings. See *note Introduction to ++ Environments::. 2. an environment object. "macroexpand takes an ++ optional environment argument." ++ ++environment object ++ n. an object representing a set of lexical bindings, used in the ++ processing of a form to provide meanings for names within that ++ form. "macroexpand takes an optional environment argument." (The ++ object nil when used as an environment object denotes the null ++ lexical environment; the values of environment parameters to macro ++ functions are objects of implementation-dependent nature which ++ represent the environment_1 in which the corresponding macro form ++ is to be expanded.) See *note Environment Objects::. ++ ++environment parameter ++ n. A parameter in a defining form f for which there is no ++ corresponding argument; instead, this parameter receives as its ++ value an environment object which corresponds to the lexical ++ environment in which the defining form f appeared. ++ ++error ++ n. 1. (only in the phrase "is an error") a situation in which the ++ semantics of a program are not specified, and in which the ++ consequences are undefined. 2. a condition which represents an ++ error situation. See *note Error Terminology::. 3. an object of ++ type error. ++ ++error output ++ n. the output stream which is the value of the dynamic variable ++ *error-output*. ++ ++escape ++ n., adj. 1. n. a single escape or a multiple escape. 2. adj. ++ single escape or multiple escape. ++ ++establish ++ v.t. to build or bring into being a binding, a declaration, an ++ exit point, a tag, a handler, a restart, or an environment. "let ++ establishes lexical bindings." ++ ++evaluate ++ v.t. (a form or an implicit progn) to execute the code represented ++ by the form (or the series of forms making up the implicit progn) ++ by applying the rules of evaluation, returning zero or more values. ++ ++evaluation ++ n. a model whereby forms are executed, returning zero or more ++ values. Such execution might be implemented directly in one step ++ by an interpreter or in two steps by first compiling the form and ++ then executing the compiled code; this choice is dependent both on ++ context and the nature of the implementation, but in any case is ++ not in general detectable by any program. The evaluation model is ++ designed in such a way that a conforming implementation might ++ legitimately have only a compiler and no interpreter, or vice ++ versa. See *note The Evaluation Model::. ++ ++evaluation environment ++ n. a run-time environment in which macro expanders and code ++ specified by eval-when to be evaluated are evaluated. All ++ evaluations initiated by the compiler take place in the evaluation ++ environment. ++ ++execute ++ v.t. Trad. (code) to perform the imperative actions represented ++ by the code. ++ ++execution time ++ n. the duration of time that compiled code is being executed. ++ ++exhaustive partition ++ n. (of a type) a set of pairwise disjoint types that form an ++ exhaustive union. ++ ++exhaustive union ++ n. (of a type) a set of subtypes of the type, whose union contains ++ all elements of that type. ++ ++exit point ++ n. a point in a control form from which (e.g., block), through ++ which (e.g., unwind-protect), or to which (e.g., tagbody) control ++ and possibly values can be transferred both actively by using ++ another control form and passively through the normal control and ++ data flow of evaluation. "catch and block establish bindings for ++ exit points to which throw and return-from, respectively, can ++ transfer control and values; tagbody establishes a binding for an ++ exit point with lexical extent to which go can transfer control; ++ and unwind-protect establishes an exit point through which control ++ might be transferred by operators such as throw, return-from, and ++ go." ++ ++explicit return ++ n. the act of transferring control (and possibly values) to a ++ block by using return-from (or return). ++ ++explicit use ++ n. (of a variable V in a form F) a reference to V that is directly ++ apparent in the normal semantics of F; i.e., that does not expose ++ any undocumented details of the macro expansion of the form itself. ++ References to V exposed by expanding subforms of F are, however, ++ considered to be explicit uses of V. ++ ++exponent marker ++ n. a character that is used in the textual notation for a float to ++ separate the mantissa from the exponent. The characters defined as ++ exponent markers in the standard readtable are shown in Figure ++ 26-1. For more information, see *note Character Syntax::. "The ++ exponent marker 'd' in '3.0d7' indicates that this number is to be ++ represented as a double float." ++ ++ Marker Meaning ++ D or d double-float ++ E or e float (see *read-default-float-format*) ++ F or f single-float ++ L or l long-float ++ S or s short-float ++ ++ Figure 26-1: Exponent Markers ++ ++ ++export ++ v.t. (a symbol in a package) to add the symbol to the list of ++ external symbols of the package. ++ ++exported ++ adj. (of a symbol in a package) being an external symbol of the ++ package. ++ ++expressed adjustability ++ n. (of an array) a generalized boolean that is conceptually (but ++ not necessarily actually) associated with the array, representing ++ whether the array is expressly adjustable. See also actual ++ adjustability. ++ ++expressed array element type ++ n. (of an array) the type which is the array element type implied ++ by a type declaration for the array, or which is the requested ++ array element type at its time of creation, prior to any selection ++ of an upgraded array element type. (Common Lisp does not provide a ++ way of detecting this type directly at run time, but an ++ implementation is permitted to make assumptions about the array's ++ contents and the operations which may be performed on the array ++ when this type is noted during code analysis, even if those ++ assumptions would not be valid in general for the upgraded array ++ element type of the expressed array element type.) ++ ++expressed complex part type ++ n. (of a complex) the type which is implied as the complex part ++ type by a type declaration for the complex, or which is the ++ requested complex part type at its time of creation, prior to any ++ selection of an upgraded complex part type. (Common Lisp does not ++ provide a way of detecting this type directly at run time, but an ++ implementation is permitted to make assumptions about the ++ operations which may be performed on the complex when this type is ++ noted during code analysis, even if those assumptions would not be ++ valid in general for the upgraded complex part type of the ++ expressed complex part type.) ++ ++expression ++ n. 1. an object, often used to emphasize the use of the object to ++ encode or represent information in a specialized format, such as ++ program text. "The second expression in a let form is a list of ++ bindings." 2. the textual notation used to notate an object in a ++ source file. "The expression 'sample is equivalent to (quote ++ sample)." ++ ++expressly adjustable ++ adj. (of an array) being actually adjustable by virtue of an ++ explicit request for this characteristic having been made at the ++ time of its creation. All arrays that are expressly adjustable are ++ actually adjustable, but not necessarily vice versa. ++ ++extended character ++ n. a character ++ ++ of type extended-char: ++ ++ a character that is not a base character. ++ ++extended function designator ++ n. a designator for a function; that is, an object that denotes a ++ function and that is one of: a function name (denoting the function ++ it names in the global environment), or a function (denoting ++ itself). The consequences are undefined if a function name is used ++ as an extended function designator but it does not have a global ++ definition as a function, or if it is a symbol that has a global ++ definition as a macro or a special form. See also function ++ designator. ++ ++extended lambda list ++ n. a list resembling an ordinary lambda list in form and purpose, ++ but offering additional syntax or functionality not available in an ++ ordinary lambda list. "defmacro uses extended lambda lists." ++ ++extension ++ n. a facility in an implementation of Common Lisp that is not ++ specified by this standard. ++ ++extent ++ n. the interval of time during which a reference to an object, a ++ binding, an exit point, a tag, a handler, a restart, or an ++ environment is defined. ++ ++external file format ++ n. an object of implementation-dependent nature which determines ++ one of possibly several implementation-dependent ways in which ++ characters are encoded externally in a character file. ++ ++external file format designator ++ n. a designator for an external file format; that is, an object ++ that denotes an external file format and that is one of: the symbol ++ :default (denoting an implementation-dependent default external ++ file format that can accomodate at least the base characters), some ++ other object defined by the implementation to be an external file ++ format designator (denoting an implementation-defined external file ++ format), or some other object defined by the implementation to be ++ an external file format (denoting itself). ++ ++external symbol ++ n. (of a package) a symbol that is part of the 'external ++ interface' to the package and that are inherited_3 by any other ++ package that uses the package. When using the Lisp reader, if a ++ package prefix is used, the name of an external symbol is separated ++ from the package name by a single package marker while the name of ++ an internal symbol is separated from the package name by a double ++ package marker; see *note Symbols as Tokens::. ++ ++externalizable object ++ n. an object that can be used as a literal object in code to be ++ processed by the file compiler. ++ ++F ++- ++ ++false ++ n. the symbol nil, used to represent the failure of a predicate ++ test. ++ ++fbound ++ pronounced 'ef ,baund adj. (of a function name) bound in the ++ function namespace. (The names of macros and special operators are ++ fbound, but the nature and type of the object which is their value ++ is implementation-dependent. ++ ++ Further, defining a setf expander F does not cause the setf ++ function (setf F) to become defined; as such, if there is a such a ++ definition of a setf expander F, the function (setf F) can be ++ fbound if and only if, by design or coincidence, a function binding ++ for (setf F) has been independently established.) ++ ++ See the functions fboundp and symbol-function. ++ ++feature ++ n. 1. an aspect or attribute of Common Lisp, of the ++ implementation, or of the environment. 2. a symbol that names a ++ feature_1. See *note Features::. "The :ansi-cl feature is present ++ in all conforming implementations." ++ ++feature expression ++ n. A boolean combination of features used by the #+ and #- reader ++ macros in order to direct conditional reading of expressions by the ++ Lisp reader. See *note Feature Expressions::. ++ ++features list ++ n. the list that is the value of *features*. ++ ++file ++ n. a named entry in a file system, having an ++ implementation-defined nature. ++ ++file compiler ++ n. any compiler which compiles source code contained in a file, ++ producing a compiled file as output. The compile-file function is ++ the only interface to such a compiler provided by Common Lisp, but ++ there might be other, implementation-defined mechanisms for ++ invoking the file compiler. ++ ++file position ++ n. (in a stream) a non-negative integer that represents a position ++ in the stream. Not all streams are able to represent the notion of ++ file position; in the description of any operator which manipulates ++ file positions, the behavior for streams that don't have this ++ notion must be explicitly stated. For binary streams, the file ++ position represents the number of preceding bytes in the stream. ++ For character streams, the constraint is more relaxed: file ++ positions must increase monotonically, the amount of the increase ++ between file positions corresponding to any two successive ++ characters in the stream is implementation-dependent. ++ ++file position designator ++ n. (in a stream) a designator for a file position in that stream; ++ that is, the symbol :start (denoting 0, the first file position in ++ that stream), the symbol :end (denoting the last file position in ++ that stream; i.e., the position following the last element of the ++ stream), or a file position (denoting itself). ++ ++file stream ++ n. an object of type file-stream. ++ ++file system ++ n. a facility which permits aggregations of data to be stored in ++ named files on some medium that is external to the Lisp image and ++ that therefore persists from session to session. ++ ++filename ++ n. a handle, not necessarily ever directly represented as an ++ object, that can be used to refer to a file in a file system. ++ Pathnames and namestrings are two kinds of objects that substitute ++ for filenames in Common Lisp. ++ ++fill pointer ++ n. (of a vector) an integer associated with a vector that ++ represents the index above which no elements are active. (A fill ++ pointer is a non-negative integer no larger than the total number ++ of elements in the vector. Not all vectors have fill pointers.) ++ ++finite ++ adj. (of a type) having a finite number of elements. "The type ++ specifier (integer 0 5) denotes a finite type, but the type ++ specifiers integer and (integer 0) do not." ++ ++fixnum ++ n. an integer of type fixnum. ++ ++float ++ n. an object of type float. ++ ++for-value ++ adj. (of a reference to a binding) being a reference that reads_1 ++ the value of the binding. ++ ++form ++ n. 1. any object meant to be evaluated. 2. a symbol, a compound ++ form, or a self-evaluating object. 3. (for an operator, as in ++ "<> form") a compound form having that operator as its ++ first element. "A quote form is a constant form." ++ ++formal argument ++ n. Trad. a parameter. ++ ++formal parameter ++ n. Trad. a parameter. ++ ++format ++ v.t. (a format control and format arguments) to perform output as ++ if by format, using the format string and format arguments. ++ ++format argument ++ n. an object which is used as data by functions such as format ++ which interpret format controls. ++ ++format control ++ n. a format string, or a function that obeys the argument ++ conventions for a function returned by the formatter macro. See ++ *note Compiling Format Strings::. ++ ++format directive ++ n. 1. a sequence of characters in a format string which is ++ introduced by a tilde, and which is specially interpreted by code ++ which processes format strings to mean that some special operation ++ should be performed, possibly involving data supplied by the format ++ arguments that accompanied the format string. See the function ++ format. "In "~D base 10 = ~8R", the character sequences '~D' and ++ '~8R' are format directives." 2. the conceptual category of all ++ format directives_1 which use the same dispatch character. "Both ++ "~3d" and "~3,'0D" are valid uses of the '~D' format directive." ++ ++format string ++ n. a string which can contain both ordinary text and format ++ directives, and which is used in conjunction with format arguments ++ to describe how text output should be formatted by certain ++ functions, such as format. ++ ++free declaration ++ n. a declaration that is not a bound declaration. See declare. ++ ++fresh ++ adj. 1. (of an object yielded by a function) having been ++ newly-allocated by that function. (The caller of a function that ++ returns a fresh object may freely modify the object without fear ++ that such modification will compromise the future correct behavior ++ of that function.) 2. (of a binding for a name) newly-allocated; ++ not shared with other bindings for that name. ++ ++freshline ++ n. a conceptual operation on a stream, implemented by the function ++ fresh-line and by the format directive ~&, which advances the ++ display position to the beginning of the next line (as if a newline ++ had been typed, or the function terpri had been called) unless the ++ stream is already known to be positioned at the beginning of a ++ line. Unlike newline, freshline is not a character. ++ ++funbound ++ pronounced 'ef unbaund n. (of a function name) not fbound. ++ ++function ++ n. ++ ++ 1. an object representing code, which can be called with zero or ++ more arguments, and which produces zero or more values. 2. an ++ object of type function. ++ ++function block name ++ n. (of a function name) The symbol that would be used as the name ++ of an implicit block which surrounds the body of a function having ++ that function name. If the function name is a symbol, its function ++ block name is the function name itself. If the function name is a ++ list whose car is setf and whose cadr is a symbol, its function ++ block name is the symbol that is the cadr of the function name. An ++ implementation which supports additional kinds of function names ++ must specify for each how the corresponding function block name is ++ computed. ++ ++function cell ++ n. Trad. (of a symbol) The place which holds the definition of ++ the global function binding, if any, named by that symbol, and ++ which is accessed by symbol-function. See cell. ++ ++function designator ++ n. a designator for a function; that is, an object that denotes a ++ function and that is one of: a symbol (denoting the function named ++ by that symbol in the global environment), or a function (denoting ++ itself). The consequences are undefined if a symbol is used as a ++ function designator but it does not have a global definition as a ++ function, or it has a global definition as a macro or a special ++ form. See also extended function designator. ++ ++function form ++ n. a form that is a list and that has a first element which is the ++ name of a function to be called on arguments which are the result ++ of evaluating subsequent elements of the function form. ++ ++function name ++ n. (in an environment) A symbol or a list (setf symbol) that is ++ the name of a function in that environment. ++ ++functional evaluation ++ n. the process of extracting a functional value from a function ++ name or a lambda expression. The evaluator performs functional ++ evaluation implicitly when it encounters a function name or a ++ lambda expression in the car of a compound form, or explicitly when ++ it encounters a function special form. Neither a use of a symbol ++ as a function designator nor a use of the function symbol-function ++ to extract the functional value of a symbol is considered a ++ functional evaluation. ++ ++functional value ++ n. 1. (of a function name N in an environment E) The value of the ++ binding named N in the function namespace for environment E; that ++ is, the contents of the function cell named N in environment E. 2. ++ (of an fbound symbol S) the contents of the symbol's function cell; ++ that is, the value of the binding named S in the function namespace ++ of the global environment. (A name that is a macro name in the ++ global environment or is a special operator might or might not be ++ fbound. But if S is such a name and is fbound, the specific nature ++ of its functional value is implementation-dependent; in particular, ++ it might or might not be a function.) ++ ++further compilation ++ n. implementation-dependent compilation beyond minimal ++ compilation. Further compilation is permitted to take place at run ++ time. "Block compilation and generation of machine-specific ++ instructions are examples of further compilation." ++ ++G ++- ++ ++general ++ adj. (of an array) having element type t, and consequently able to ++ have any object as an element. ++ ++generalized boolean ++ n. an object used as a truth value, where the symbol~nil ++ represents false and all other objects represent true. See ++ boolean. ++ ++generalized instance ++ n. (of a class) an object the class of which is either that class ++ itself, or some subclass of that class. (Because of the ++ correspondence between types and classes, the term "generalized ++ instance of X" implies "object of type X" and in cases where X is a ++ class (or class name) the reverse is also true. The former ++ terminology emphasizes the view of X as a class while the latter ++ emphasizes the view of X as a type specifier.) ++ ++generalized reference ++ n. a reference to a location storing an object as if to a ++ variable. (Such a reference can be either to read or write the ++ location.) See *note Generalized Reference::. See also place. ++ ++generalized synonym stream ++ n. (with a synonym stream symbol) 1. (to a stream) a synonym ++ stream to the stream, or a composite stream which has as a target a ++ generalized synonym stream to the stream. 2. (to a symbol) a ++ synonym stream to the symbol, or a composite stream which has as a ++ target a generalized synonym stream to the symbol. ++ ++generic function ++ n. a function whose behavior depends on the classes or identities ++ of the arguments supplied to it and whose parts include, among ++ other things, a set of methods, a lambda list, and a method ++ combination type. ++ ++generic function lambda list ++ n. A lambda list that is used to describe data flow into a generic ++ function. See *note Generic Function Lambda Lists::. ++ ++gensym ++ n. Trad. an uninterned symbol. See the function gensym. ++ ++global declaration ++ n. a form that makes certain kinds of information about code ++ globally available; that is, a proclaim form or a declaim form. ++ ++global environment ++ n. that part of an environment that contains bindings with ++ indefinite scope and indefinite extent. ++ ++global variable ++ n. a dynamic variable or a constant variable. ++ ++glyph ++ n. a visual representation. "Graphic characters have associated ++ glyphs." ++ ++go ++ v. to transfer control to a go point. See the special operator ++ go. ++ ++go point ++ ++ one of possibly several exit points that are established by tagbody ++ (or other abstractions, such as prog, which are built from ++ tagbody). ++ ++go tag ++ n. the symbol or integer that, within the lexical scope of a ++ tagbody form, names an exit point established by that tagbody form. ++ ++graphic ++ adj. (of a character) being a "printing" or "displayable" ++ character that has a standard visual representation as a single ++ glyph, such as A or * or =. Space is defined to be graphic. Of ++ the standard characters, all but newline are graphic. See ++ non-graphic. ++ ++H ++- ++ ++handle ++ v. (of a condition being signaled) to perform a non-local transfer ++ of control, terminating the ongoing signaling of the condition. ++ ++handler ++ n. ++ ++ a condition handler. ++ ++hash table ++ n. an object of type hash-table, which provides a mapping from ++ keys to values. ++ ++home package ++ n. (of a symbol) the package, if any, which is contents of the ++ package cell of the symbol, and which dictates how the Lisp printer ++ prints the symbol when it is not accessible in the current package. ++ (Symbols which have nil in their package cell are said to have no ++ home package, and also to be apparently uninterned.) ++ ++I ++- ++ ++I/O customization variable ++ n. one of the stream variables in Figure 26-2, or some other ++ (implementation-defined) stream variable that is defined by the ++ implementation to be an I/O customization variable. ++ ++ *debug-io* *error-io* query-io* ++ *standard-input* *standard-output* *trace-output* ++ ++ Figure 26-2: Standardized I/O Customization Variables ++ ++ ++identical ++ adj. the same under eq. ++ ++identifier ++ n. 1. a symbol used to identify or to distinguish names. 2. a ++ string used the same way. ++ ++immutable ++ adj. not subject to change, either because no operator is provided ++ which is capable of effecting such change or because some ++ constraint exists which prohibits the use of an operator that might ++ otherwise be capable of effecting such a change. Except as ++ explicitly indicated otherwise, implementations are not required to ++ detect attempts to modify immutable objects or cells; the ++ consequences of attempting to make such modification are undefined. ++ "Numbers are immutable." ++ ++implementation ++ n. a system, mechanism, or body of code that implements the ++ semantics of Common Lisp. ++ ++implementation limit ++ n. a restriction imposed by an implementation. ++ ++implementation-defined ++ adj. implementation-dependent, but required by this specification ++ to be defined by each conforming implementation and to be ++ documented by the corresponding implementor. ++ ++implementation-dependent ++ adj. describing a behavior or aspect of Common Lisp which has been ++ deliberately left unspecified, that might be defined in some ++ conforming implementations but not in others, and whose details may ++ differ between implementations. A conforming implementation is ++ encouraged (but not required) to document its treatment of each ++ item in this specification which is marked ++ implementation-dependent, although in some cases such documentation ++ might simply identify the item as "undefined." ++ ++implementation-independent ++ adj. used to identify or emphasize a behavior or aspect of Common ++ Lisp which does not vary between conforming implementations. ++ ++implicit block ++ n. a block introduced by a macro form rather than by an explicit ++ block form. ++ ++implicit compilation ++ n. compilation performed during evaluation. ++ ++implicit progn ++ n. an ordered set of adjacent forms appearing in another form, and ++ defined by their context in that form to be executed as if within a ++ progn. ++ ++implicit tagbody ++ n. an ordered set of adjacent forms and/or tags appearing in ++ another form, and defined by their context in that form to be ++ executed as if within a tagbody. ++ ++import ++ v.t. (a symbol into a package) to make the symbol be present in ++ the package. ++ ++improper list ++ n. a list which is not a proper list: a circular list or a dotted ++ list. ++ ++inaccessible ++ adj. not accessible. ++ ++indefinite extent ++ n. an extent whose duration is unlimited. "Most Common Lisp ++ objects have indefinite extent." ++ ++indefinite scope ++ n. scope that is unlimited. ++ ++indicator ++ n. a property indicator. ++ ++indirect instance ++ n. (of a class C_1) an object of class C_2, where C_2 is a ++ subclass of C_1. "An integer is an indirect instance of the class ++ number." ++ ++inherit ++ v.t. 1. to receive or acquire a quality, trait, or ++ characteristic; to gain access to a feature defined elsewhere. 2. ++ (a class) to acquire the structure and behavior defined by a ++ superclass. 3. (a package) to make symbols exported by another ++ package accessible by using use-package. ++ ++initial pprint dispatch table ++ n. the value of *print-pprint-dispatch* at the time the Lisp image ++ is started. ++ ++initial readtable ++ n. the value of *readtable* at the time the Lisp image is started. ++ ++initialization argument list ++ n. a property list of initialization argument names and values ++ used in the protocol for initializing and reinitializing instances ++ of classes. See *note Object Creation and Initialization::. ++ ++initialization form ++ n. a form used to supply the initial value for a slot or variable. ++ "The initialization form for a slot in a defclass form is ++ introduced by the keyword :initform." ++ ++input ++ adj. (of a stream) supporting input operations (i.e., being a ++ "data source"). An input stream might also be an output stream, in ++ which case it is sometimes called a bidirectional stream. See the ++ function input-stream-p. ++ ++instance ++ n. 1. a direct instance. 2. a generalized instance. 3. an ++ indirect instance. ++ ++integer ++ n. an object of type integer, which represents a mathematical ++ integer. ++ ++interactive stream ++ n. a stream on which it makes sense to perform interactive ++ querying. See *note Interactive Streams::. ++ ++intern ++ v.t. 1. (a string in a package) to look up the string in the ++ package, returning either a symbol with that name which was already ++ accessible in the package or a newly created internal symbol of the ++ package with that name. 2. Idiom. generally, to observe a ++ protocol whereby objects which are equivalent or have equivalent ++ names under some predicate defined by the protocol are mapped to a ++ single canonical object. ++ ++internal symbol ++ n. (of a package) a symbol which is accessible in the package, but ++ which is not an external symbol of the package. ++ ++internal time ++ n. time, represented as an integer number of internal time units. ++ Absolute internal time is measured as an offset from an arbitrarily ++ chosen, implementation-dependent base. See *note Internal Time::. ++ ++internal time unit ++ n. a unit of time equal to 1/n of a second, for some ++ implementation-defined integer value of n. See the variable ++ internal-time-units-per-second. ++ ++interned ++ adj. Trad. 1. (of a symbol) accessible_3 in any package. 2. ++ (of a symbol in a specific package) present in that package. ++ ++interpreted function ++ n. a function that is not a compiled function. (It is possible ++ for there to be a conforming implementation which has no ++ interpreted functions, but a conforming program must not assume ++ that all functions are compiled functions.) ++ ++interpreted implementation ++ n. an implementation that uses an execution strategy for ++ interpreted functions that does not involve a one-time semantic ++ analysis pre-pass, and instead uses "lazy" (and sometimes ++ repetitious) semantic analysis of forms as they are encountered ++ during execution. ++ ++interval designator ++ n. (of type T) an ordered pair of objects that describe a subtype ++ of T by delimiting an interval on the real number line. See *note ++ Interval Designators::. ++ ++invalid ++ n., adj. 1. n. a possible constituent trait of a character which ++ if present signifies that the character cannot ever appear in a ++ token except under the control of a single escape character. For ++ details, see *note Constituent Characters::. 2. adj. (of a ++ character) being a character that has syntax type constituent in ++ the current readtable and that has the constituent trait invalid_1. ++ See Figure~2-8. ++ ++iteration form ++ n. a compound form whose operator is named in Figure 26-3, or a ++ compound form that has an implementation-defined operator and that ++ is defined by the implementation to be an iteration form. ++ ++ do do-external-symbols dotimes ++ do* do-symbols loop ++ do-all-symbols dolist ++ ++ Figure 26-3: Standardized Iteration Forms ++ ++ ++iteration variable ++ n. a variable V, the binding for which was created by an explicit ++ use of V in an iteration form. ++ ++K ++- ++ ++key ++ n. an object used for selection during retrieval. See association ++ list, property list, and hash table. Also, see *note Sequence ++ Concepts::. ++ ++keyword ++ n. 1. a symbol the home package of which is the KEYWORD package. ++ 2. any symbol, usually but not necessarily in the KEYWORD package, ++ that is used as an identifying marker in keyword-style argument ++ passing. See lambda. 3. Idiom. a lambda list keyword. ++ ++keyword parameter ++ n. A parameter for which a corresponding keyword argument is ++ optional. (There is no such thing as a required keyword argument.) ++ If the argument is not supplied, a default value is used. See also ++ supplied-p parameter. ++ ++keyword/value pair ++ n. two successive elements (a keyword and a value, respectively) ++ of a property list. ++ ++L ++- ++ ++lambda combination ++ n. Trad. a lambda form. ++ ++lambda expression ++ n. a list which can be used in place of a function name in certain ++ contexts to denote a function by directly describing its behavior ++ rather than indirectly by referring to the name of an established ++ function; its name derives from the fact that its first element is ++ the symbol lambda. See lambda. ++ ++lambda form ++ n. a form that is a list and that has a first element which is a ++ lambda expression representing a function to be called on arguments ++ which are the result of evaluating subsequent elements of the ++ lambda form. ++ ++lambda list ++ n. a list that specifies a set of parameters (sometimes called ++ lambda variables) and a protocol for receiving values for those ++ parameters; that is, an ordinary lambda list, an extended lambda ++ list, or a modified lambda list. ++ ++lambda list keyword ++ n. a symbol whose name begins with ampersand and that is specially ++ recognized in a lambda list. Note that no standardized lambda list ++ keyword is in the KEYWORD package. ++ ++lambda variable ++ n. a formal parameter, used to emphasize the variable's relation ++ to the lambda list that established it. ++ ++leaf ++ n. 1. an atom in a tree_1. 2. a terminal node of a tree_2. ++ ++leap seconds ++ n. additional one-second intervals of time that are occasionally ++ inserted into the true calendar by official timekeepers as a ++ correction similar to "leap years." All Common Lisp time ++ representations ignore leap seconds; every day is assumed to be ++ exactly 86400 seconds long. ++ ++left-parenthesis ++ n. the standard character "(", that is variously called "left ++ parenthesis" or "open parenthesis" See Figure~2-5. ++ ++length ++ n. (of a sequence) the number of elements in the sequence. (Note ++ that if the sequence is a vector with a fill pointer, its length is ++ the same as the fill pointer even though the total allocated size ++ of the vector might be larger.) ++ ++lexical binding ++ n. a binding in a lexical environment. ++ ++lexical closure ++ n. a function that, when invoked on arguments, executes the body ++ of a lambda expression in the lexical environment that was captured ++ at the time of the creation of the lexical closure, augmented by ++ bindings of the function's parameters to the corresponding ++ arguments. ++ ++lexical environment ++ n. that part of the environment that contains bindings whose names ++ have lexical scope. A lexical environment contains, among other ++ things: ordinary bindings of variable names to values, lexically ++ established bindings of function names to functions, macros, symbol ++ macros, blocks, tags, and local declarations (see declare). ++ ++lexical scope ++ n. scope that is limited to a spatial or textual region within the ++ establishing form. "The names of parameters to a function normally ++ are lexically scoped." ++ ++lexical variable ++ n. a variable the binding for which is in the lexical environment. ++ ++Lisp image ++ n. a running instantiation of a Common Lisp implementation. A ++ Lisp image is characterized by a single address space in which any ++ object can directly refer to any another in conformance with this ++ specification, and by a single, common, global environment. ++ (External operating systems sometimes call this a "core image," ++ "fork," "incarnation," "job," or "process." Note however, that the ++ issue of a "process" in such an operating system is technically ++ orthogonal to the issue of a Lisp image being defined here. ++ Depending on the operating system, a single "process" might have ++ multiple Lisp images, and multiple "processes" might reside in a ++ single Lisp image. Hence, it is the idea of a fully shared address ++ space for direct reference among all objects which is the defining ++ characteristic. Note, too, that two "processes" which have a ++ communication area that permits the sharing of some but not all ++ objects are considered to be distinct Lisp images.) ++ ++Lisp printer ++ n. Trad. the procedure that prints the character representation ++ of an object onto a stream. (This procedure is implemented by the ++ function write.) ++ ++Lisp read-eval-print loop ++ n. Trad. an endless loop that reads_2 a form, evaluates it, and ++ prints (i.e., writes_2) the results. In many implementations, the ++ default mode of interaction with Common Lisp during program ++ development is through such a loop. ++ ++Lisp reader ++ n. Trad. the procedure that parses character representations of ++ objects from a stream, producing objects. (This procedure is ++ implemented by the function read.) ++ ++list ++ n. 1. a chain of conses in which the car of each cons is an ++ element of the list, and the cdr of each cons is either the next ++ link in the chain or a terminating atom. See also proper list, ++ dotted list, or circular list. 2. the type that is the union of ++ null and cons. ++ ++list designator ++ n. a designator for a list of objects; that is, an object that ++ denotes a list and that is one of: a non-nil atom (denoting a ++ singleton list whose element is that non-nil atom) or a proper list ++ (denoting itself). ++ ++list structure ++ n. (of a list) the set of conses that make up the list. Note that ++ while the car_{1b} component of each such cons is part of the list ++ structure, the objects that are elements of the list (i.e., the ++ objects that are the cars_2 of each cons in the list) are not ++ themselves part of its list structure, even if they are conses, ++ except in the (circular_2) case where the list actually contains ++ one of its tails as an element. (The list structure of a list is ++ sometimes redundantly referred to as its "top-level list structure" ++ in order to emphasize that any conses that are elements of the list ++ are not involved.) ++ ++literal ++ adj. (of an object) referenced directly in a program rather than ++ being computed by the program; that is, appearing as data in a ++ quote form, or, if the object is a self-evaluating object, ++ appearing as unquoted data. "In the form (cons "one" '("two")), ++ the expressions "one", ("two"), and "two" are literal objects." ++ ++load ++ v.t. (a file) to cause the code contained in the file to be ++ executed. See the function load. ++ ++load time ++ n. the duration of time that the loader is loading compiled code. ++ ++load time value ++ n. an object referred to in code by a load-time-value form. The ++ value of such a form is some specific object which can only be ++ computed in the run-time environment. In the case of file ++ compilation, the value is computed once as part of the process of ++ loading the compiled file, and not again. See the special operator ++ load-time-value. ++ ++loader ++ n. a facility that is part of Lisp and that loads a file. See the ++ function load. ++ ++local declaration ++ n. an expression which may appear only in specially designated ++ positions of certain forms, and which provides information about ++ the code contained within the containing form; that is, a declare ++ expression. ++ ++local precedence order ++ n. (of a class) a list consisting of the class followed by its ++ direct superclasses in the order mentioned in the defining form for ++ the class. ++ ++local slot ++ n. (of a class) a slot accessible in only one instance, namely the ++ instance in which the slot is allocated. ++ ++logical block ++ n. a conceptual grouping of related output used by the pretty ++ printer. See the macro pprint-logical-block and *note Dynamic ++ Control of the Arrangement of Output::. ++ ++logical host ++ n. an object of implementation-dependent nature that is used as ++ the representation of a "host" in a logical pathname, and that has ++ an associated set of translation rules for converting logical ++ pathnames belonging to that host into physical pathnames. See ++ *note Logical Pathnames::. ++ ++logical host designator ++ n. a designator for a logical host; that is, an object that ++ denotes a logical host and that is one of: a string (denoting the ++ logical host that it names), or a logical host (denoting itself). ++ (Note that because the representation of a logical host is ++ implementation-dependent, it is possible that an implementation ++ might represent a logical host as the string that names it.) ++ ++logical pathname ++ n. an object of type logical-pathname. ++ ++long float ++ n. an object of type long-float. ++ ++loop keyword ++ n. Trad. a symbol that is a specially recognized part of the ++ syntax of an extended loop form. Such symbols are recognized by ++ their name (using string=), not by their identity; as such, they ++ may be in any package. A loop keyword is not a keyword. ++ ++lowercase ++ adj. (of a character) being among standard characters ++ corresponding to the small letters a through z, or being some other ++ implementation-defined character that is defined by the ++ implementation to be lowercase. See *note Characters With Case::. ++ ++M ++- ++ ++macro ++ n. 1. a macro form 2. a macro function. 3. a macro name. ++ ++macro character ++ n. a character which, when encountered by the Lisp reader in its ++ main dispatch loop, introduces a reader macro_1. (Macro characters ++ have nothing to do with macros.) ++ ++macro expansion ++ n. 1. the process of translating a macro form into another form. ++ 2. the form resulting from this process. ++ ++macro form ++ n. a form that stands for another form (e.g., for the purposes of ++ abstraction, information hiding, or syntactic convenience); that ++ is, either a compound form whose first element is a macro name, or ++ a form that is a symbol that names a symbol macro. ++ ++macro function ++ n. a function of two arguments, a form and an environment, that ++ implements macro expansion by producing a form to be evaluated in ++ place of the original argument form. ++ ++macro lambda list ++ n. an extended lambda list used in forms that establish macro ++ definitions, such as defmacro and macrolet. See *note Macro Lambda ++ Lists::. ++ ++macro name ++ n. a name for which macro-function returns true and which when ++ used as the first element of a compound form identifies that form ++ as a macro form. ++ ++macroexpand hook ++ n. the function that is the value of *macroexpand-hook*. ++ ++mapping ++ n. 1. a type of iteration in which a function is successively ++ applied to objects taken from corresponding entries in collections ++ such as sequences or hash tables. 2. Math. a relation between ++ two sets in which each element of the first set (the "domain") is ++ assigned one element of the second set (the "range"). ++ ++metaclass ++ n. 1. a class whose instances are classes. 2. (of an object) ++ the class of the class of the object. ++ ++Metaobject Protocol ++ n. one of many possible descriptions of how a conforming ++ implementation might implement various aspects of the object ++ system. This description is beyond the scope of this document, and ++ no conforming implementation is required to adhere to it except as ++ noted explicitly in this specification. Nevertheless, its ++ existence helps to establish normative practice, and implementors ++ with no reason to diverge from it are encouraged to consider making ++ their implementation adhere to it where possible. It is described ++ in detail in The Art of the Metaobject Protocol. ++ ++method ++ n. an object that is part of a generic function and which provides ++ information about how that generic function should behave when its ++ arguments are objects of certain classes or with certain ++ identities. ++ ++method combination ++ n. 1. generally, the composition of a set of methods to produce ++ an effective method for a generic function. 2. an object of type ++ method-combination, which represents the details of how the method ++ combination_1 for one or more specific generic functions is to be ++ performed. ++ ++method-defining form ++ n. a form that defines a method for a generic function, whether ++ explicitly or implicitly. See *note Introduction to Generic ++ Functions::. ++ ++method-defining operator ++ n. an operator corresponding to a method-defining form. See ++ Figure~7-1. ++ ++minimal compilation ++ n. actions the compiler must take at compile time. See *note ++ Compilation Semantics::. ++ ++modified lambda list ++ n. a list resembling an ordinary lambda list in form and purpose, ++ but which deviates in syntax or functionality from the definition ++ of an ordinary lambda list. See ordinary lambda list. "deftype ++ uses a modified lambda list." ++ ++most recent ++ adj. innermost; that is, having been established (and not yet ++ disestablished) more recently than any other of its kind. ++ ++multiple escape ++ n., adj. 1. n. the syntax type of a character that is used in ++ pairs to indicate that the enclosed characters are to be treated as ++ alphabetic_2 characters with their case preserved. For details, ++ see *note Multiple Escape Characters::. 2. adj. (of a character) ++ having the multiple escape syntax type. 3. n. a multiple ++ escape_2 character. (In the standard readtable, vertical-bar is a ++ multiple escape character.) ++ ++multiple values ++ n. 1. more than one value. "The function truncate returns ++ multiple values." 2. a variable number of values, possibly ++ including zero or one. "The function values returns multiple ++ values." 3. a fixed number of values other than one. "The macro ++ multiple-value-bind is among the few operators in Common Lisp which ++ can detect and manipulate multiple values." ++ ++N ++- ++ ++name ++ n., v.t. 1. n. an identifier by which an object, a binding, or ++ an exit point is referred to by association using a binding. 2. ++ v.t. to give a name to. 3. n. (of an object having a name ++ component) the object which is that component. "The string which ++ is a symbol's name is returned by symbol-name." 4. n. (of a ++ pathname) a. the name component, returned by pathname-name. b. ++ the entire namestring, returned by namestring. 5. n. (of a ++ character) a string that names the character and that has length ++ greater than one. (All non-graphic characters are required to have ++ names unless they have some implementation-defined attribute which ++ is not null. Whether or not other characters have names is ++ implementation-dependent.) ++ ++named constant ++ n. a variable that is defined by Common Lisp, by the ++ implementation, or by user code (see the macro defconstant) to ++ always yield the same value when evaluated. "The value of a named ++ constant may not be changed by assignment or by binding." ++ ++namespace ++ n. 1. bindings whose denotations are restricted to a particular ++ kind. "The bindings of names to tags is the tag namespace." 2. ++ any mapping whose domain is a set of names. "A package defines a ++ namespace." ++ ++namestring ++ n. a string that represents a filename using either the ++ standardized notation for naming logical pathnames described in ++ *note Syntax of Logical Pathname Namestrings::, or some ++ implementation-defined notation for naming a physical pathname. ++ ++newline ++ n. the standard character , notated for the Lisp reader ++ as #\Newline. ++ ++next method ++ n. the next method to be invoked with respect to a given method ++ for a particular set of arguments or argument classes. See *note ++ Applying method combination to the sorted list of applicable ++ methods::. ++ ++nickname ++ n. (of a package) one of possibly several names that can be used ++ to refer to the package but that is not the primary name of the ++ package. ++ ++nil ++ n. the object that is at once the symbol named "NIL" in the ++ COMMON-LISP package, the empty list, the boolean (or generalized ++ boolean) representing false, and the name of the empty type. ++ ++non-atomic ++ adj. being other than an atom; i.e., being a cons. ++ ++non-constant variable ++ n. a variable that is not a constant variable. ++ ++non-correctable ++ adj. (of an error) not intentionally correctable. (Because of the ++ dynamic nature of restarts, it is neither possible nor generally ++ useful to completely prohibit an error from being correctable. ++ This term is used in order to express an intent that no special ++ effort should be made by code signaling an error to make that error ++ correctable; however, there is no actual requirement on conforming ++ programs or conforming implementations imposed by this term.) ++ ++non-empty ++ adj. having at least one element. ++ ++non-generic function ++ n. a function that is not a generic function. ++ ++non-graphic ++ adj. (of a character) not graphic. See *note Graphic ++ Characters::. ++ ++non-list ++ n., adj. other than a list; i.e., a non-nil atom. ++ ++non-local exit ++ n. a transfer of control (and sometimes values) to an exit point ++ for reasons other than a normal return. "The operators go, throw, ++ and return-from cause a non-local exit." ++ ++non-nil ++ n., adj. not nil. Technically, any object which is not nil can be ++ referred to as true, but that would tend to imply a unique view of ++ the object as a generalized boolean. Referring to such an object ++ as non-nil avoids this implication. ++ ++non-null lexical environment ++ n. a lexical environment that has additional information not ++ present in the global environment, such as one or more bindings. ++ ++non-simple ++ adj. not simple. ++ ++non-terminating ++ adj. (of a macro character) being such that it is treated as a ++ constituent character when it appears in the middle of an extended ++ token. See *note Reader Algorithm::. ++ ++non-top-level form ++ n. a form that, by virtue of its position as a subform of another ++ form, is not a top level form. See *note Processing of Top Level ++ Forms::. ++ ++normal return ++ n. the natural transfer of control and values which occurs after ++ the complete execution of a form. ++ ++normalized ++ adj., ANSI, IEEE (of a float) conforming to the description of ++ "normalized" as described by IEEE Standard for Binary ++ Floating-Point Arithmetic. See denormalized. ++ ++null ++ adj., n. 1. adj. a. (of a list) having no elements: empty. See ++ empty list. b. (of a string) having a length of zero. (It is ++ common, both within this document and in observed spoken behavior, ++ to refer to an empty string by an apparent definite reference, as ++ in "the null string" even though no attempt is made to intern_2 ++ null strings. The phrase "a null string" is technically more ++ correct, but is generally considered awkward by most Lisp ++ programmers. As such, the phrase "the null string" should be ++ treated as an indefinite reference in all cases except for ++ anaphoric references.) c. (of an implementation-defined attribute ++ of a character) An object to which the value of that attribute ++ defaults if no specific value was requested. 2. n. an object of ++ type null (the only such object being nil). ++ ++null lexical environment ++ n. the lexical environment which has no bindings. ++ ++number ++ n. an object of type number. ++ ++numeric ++ adj. (of a character) being one of the standard characters 0 ++ through 9, or being some other graphic character defined by the ++ implementation to be numeric. ++ ++O ++- ++ ++object ++ n. 1. any Lisp datum. "The function cons creates an object which ++ refers to two other objects." 2. (immediately following the name ++ of a type) an object which is of that type, used to emphasize that ++ the object is not just a name for an object of that type but really ++ an element of the type in cases where objects of that type (such as ++ function or class) are commonly referred to by name. "The function ++ symbol-function takes a function name and returns a function ++ object." ++ ++object-traversing ++ adj. operating in succession on components of an object. "The ++ operators mapcar, maphash, with-package-iterator and count perform ++ object-traversing operations." ++ ++open ++ adj., v.t. (a file) 1. v.t. to create and return a stream to the ++ file. 2. adj. (of a stream) having been opened_1, but not yet ++ closed. ++ ++operator ++ n. 1. a function, macro, or special operator. 2. a symbol that ++ names such a function, macro, or special operator. 3. (in a ++ function special form) the cadr of the function special form, which ++ might be either an operator_2 or a lambda expression. 4. (of a ++ compound form) the car of the compound form, which might be either ++ an operator_2 or a lambda expression, and which is never (setf ++ symbol). ++ ++optimize quality ++ n. one of several aspects of a program that might be optimizable ++ by certain compilers. Since optimizing one such quality might ++ conflict with optimizing another, relative priorities for qualities ++ can be established in an optimize declaration. The standardized ++ optimize qualities are compilation-speed (speed of the compilation ++ process), ++ ++ debug (ease of debugging), ++ ++ safety (run-time error checking), space (both code size and ++ run-time space), and speed (of the object code). Implementations ++ may define additional optimize qualities. ++ ++optional parameter ++ n. A parameter for which a corresponding positional argument is ++ optional. If the argument is not supplied, a default value is ++ used. See also supplied-p parameter. ++ ++ordinary function ++ n. a function that is not a generic function. ++ ++ordinary lambda list ++ n. the kind of lambda list used by lambda. See modified lambda ++ list and extended lambda list. "defun uses an ordinary lambda ++ list." ++ ++otherwise inaccessible part ++ n. (of an object, O_1) an object, O_2, which would be made ++ inaccessible if O_1 were made inaccessible. (Every object is an ++ otherwise inaccessible part of itself.) ++ ++output ++ adj. (of a stream) supporting output operations (i.e., being a ++ "data sink"). An output stream might also be an input stream, in ++ which case it is sometimes called a bidirectional stream. See the ++ function output-stream-p. ++ ++P ++- ++ ++package ++ n. an object of type package. ++ ++package cell ++ n. Trad. (of a symbol) The place in a symbol that holds one of ++ possibly several packages in which the symbol is interned, called ++ the home package, or which holds nil if no such package exists or ++ is known. See the function symbol-package. ++ ++package designator ++ n. a designator for a package; that is, an object that denotes a ++ package and that is one of: a string designator (denoting the ++ package that has the string that it designates as its name or as ++ one of its nicknames), or a package (denoting itself). ++ ++package marker ++ n. a character which is used in the textual notation for a symbol ++ to separate the package name from the symbol name, and which is ++ colon in the standard readtable. See *note Character Syntax::. ++ ++package prefix ++ n. a notation preceding the name of a symbol in text that is ++ processed by the Lisp reader, which uses a package name followed by ++ one or more package markers, and which indicates that the symbol is ++ looked up in the indicated package. ++ ++package registry ++ n. A mapping of names to package objects. It is possible for ++ there to be a package object which is not in this mapping; such a ++ package is called an unregistered package. Operators such as ++ find-package consult this mapping in order to find a package from ++ its name. Operators such as do-all-symbols, find-all-symbols, and ++ list-all-packages operate only on packages that exist in the ++ package registry. ++ ++pairwise ++ adv. (of an adjective on a set) applying individually to all ++ possible pairings of elements of the set. "The types A, B, and C ++ are pairwise disjoint if A and B are disjoint, B and C are ++ disjoint, and A and C are disjoint." ++ ++parallel ++ adj. Trad. (of binding or assignment) done in the style of psetq, ++ let, or do; that is, first evaluating all of the forms that produce ++ values, and only then assigning or binding the variables (or ++ places). Note that this does not imply traditional computational ++ "parallelism" since the forms that produce values are evaluated ++ sequentially. See sequential. ++ ++parameter ++ n. 1. (of a function) a variable in the definition of a function ++ which takes on the value of a corresponding argument (or of a list ++ of corresponding arguments) to that function when it is called, or ++ which in some cases is given a default value because there is no ++ corresponding argument. 2. (of a format directive) an object ++ received as data flow by a format directive due to a prefix ++ notation within the format string at the format directive's point ++ of use. See *note Formatted Output::. "In "~3,'0D", the number 3 ++ and the character #\0 are parameters to the ~D format directive." ++ ++parameter specializer ++ n. 1. (of a method) an expression which constrains the method to ++ be applicable only to argument sequences in which the corresponding ++ argument matches the parameter specializer. 2. a class, or a list ++ (eql object). ++ ++parameter specializer name ++ n. 1. (of a method definition) an expression used in code to name ++ a parameter specializer. See *note Introduction to Methods::. 2. ++ a class, ++ ++ a symbol naming a class, ++ ++ or a list (eql form). ++ ++pathname ++ n. an object of type pathname, which is a structured ++ representation of the name of a file. A pathname has six ++ components: a "host," a "device," a "directory," a "name," a ++ "type," and a "version." ++ ++pathname designator ++ n. a designator for a pathname; that is, an object that denotes a ++ pathname and that is one of: ++ ++ a pathname namestring ++ ++ (denoting the corresponding pathname), ++ ++ a stream associated with a file (denoting the pathname used to open ++ the file; this may be, but is not required to be, the actual name ++ of the file), or a pathname (denoting itself). See *note File ++ Operations on Open and Closed Streams::. ++ ++physical pathname ++ n. a pathname that is not a logical pathname. ++ ++ [Editorial Note by KMP: Still need to reconcile some confusion in ++ the uses of "generalized reference" and "place." I think one was ++ supposed to refer to the abstract concept, and the other to an ++ object (a form), but the usages have become blurred.] ++ ++place ++ n. 1. a form which is suitable for use as a generalized ++ reference. 2. the conceptual location referred to by such a ++ place_1. ++ ++plist ++ pronounced 'p\=e ,list n. a property list. ++ ++portable ++ adj. (of code) required to produce equivalent results and ++ observable side effects in all conforming implementations. ++ ++potential copy ++ n. (of an object O_1 subject to constriants) an object O_2 that if ++ the specified constraints are satisfied by O_1 without any ++ modification might or might not be identical to O_1, or else that ++ must be a fresh object that resembles a copy of O_1 except that it ++ has been modified as necessary to satisfy the constraints. ++ ++potential number ++ n. A textual notation that might be parsed by the Lisp reader in ++ some conforming implementation as a number but is not required to ++ be parsed as a number. No object is a potential number--either an ++ object is a number or it is not. See *note Potential Numbers as ++ Tokens::. ++ ++pprint dispatch table ++ n. an object that can be the value of *print-pprint-dispatch* and ++ hence can control how objects are printed when *print-pretty* is ++ true. See *note Pretty Print Dispatch Tables::. ++ ++predicate ++ n. a function that returns a generalized boolean as its first ++ value. ++ ++present ++ n. 1. (of a feature in a Lisp image) a state of being that is in ++ effect if and only if the symbol naming the feature is an element ++ of the features list. 2. (of a symbol in a package) being ++ accessible in that package directly, rather than being inherited ++ from another package. ++ ++pretty print ++ v.t. (an object) to invoke the pretty printer on the object. ++ ++pretty printer ++ n. the procedure that prints the character representation of an ++ object onto a stream when the value of *print-pretty* is true, and ++ that uses layout techniques (e.g., indentation) that tend to ++ highlight the structure of the object in a way that makes it easier ++ for human readers to parse visually. See the variable ++ *print-pprint-dispatch* and *note The Lisp Pretty Printer::. ++ ++pretty printing stream ++ n. a stream that does pretty printing. Such streams are created ++ by the function pprint-logical-block as a link between the output ++ stream and the logical block. ++ ++primary method ++ n. a member of one of two sets of methods (the set of auxiliary ++ methods is the other) that form an exhaustive partition of the set ++ of methods on the method's generic function. How these sets are ++ determined is dependent on the method combination type; see *note ++ Introduction to Methods::. ++ ++primary value ++ n. (of values resulting from the evaluation of a form) the first ++ value, if any, or else nil if there are no values. "The primary ++ value returned by truncate is an integer quotient, truncated toward ++ zero." ++ ++principal ++ adj. (of a value returned by a Common Lisp function that ++ implements a mathematically irrational or transcendental function ++ defined in the complex domain) of possibly many (sometimes an ++ infinite number of) correct values for the mathematical function, ++ being the particular value which the corresponding Common Lisp ++ function has been defined to return. ++ ++print name ++ n. Trad. (usually of a symbol) a name_3. ++ ++printer control variable ++ n. a variable whose specific purpose is to control some action of ++ the Lisp printer; that is, one of the variables in Figure~22-1, or ++ else some implementation-defined variable which is defined by the ++ implementation to be a printer control variable. ++ ++printer escaping ++ n. The combined state of the printer control variables ++ *print-escape* and *print-readably*. If the value of either ++ *print-readably* or *print-escape* is true, then printer escaping ++ is "enabled"; otherwise (if the values of both *print-readably* and ++ *print-escape* are false), then printer escaping is "disabled". ++ ++printing ++ adj. (of a character) being a graphic character other than space. ++ ++process ++ v.t. (a form by the compiler) to perform minimal compilation, ++ determining the time of evaluation for a form, and possibly ++ evaluating that form (if required). ++ ++processor ++ n., ANSI an implementation. ++ ++proclaim ++ v.t. (a proclamation) to establish that proclamation. ++ ++proclamation ++ n. a global declaration. ++ ++prog tag ++ n. Trad. a go tag. ++ ++program ++ n. Trad. Common Lisp code. ++ ++programmer ++ n. an active entity, typically a human, that writes a program, and ++ that might or might not also be a user of the program. ++ ++programmer code ++ n. code that is supplied by the programmer; that is, code that is ++ not system code. ++ ++proper list ++ n. A list terminated by the empty list. (The empty list is a ++ proper list.) See improper list. ++ ++proper name ++ n. (of a class) a symbol that names the class whose name is that ++ symbol. See the functions class-name and find-class. ++ ++proper sequence ++ n. a sequence which is not an improper list; that is, a vector or ++ a proper list. ++ ++proper subtype ++ n. (of a type) a subtype of the type which is not the same type as ++ the type (i.e., its elements are a "proper subset" of the type). ++ ++property ++ n. (of a property list) 1. a conceptual pairing of a property ++ indicator and its associated property value on a property list. 2. ++ a property value. ++ ++property indicator ++ n. (of a property list) the name part of a property, used as a key ++ when looking up a property value on a property list. ++ ++property list ++ n. ++ ++ 1. a list containing an even number of elements that are ++ alternating names (sometimes called indicators or keys) and values ++ (sometimes called properties). When there is more than one name ++ and value pair with the identical name in a property list, the ++ first such pair determines the property. ++ ++ 2. (of a symbol) the component of the symbol containing a property ++ list. ++ ++property value ++ n. (of a property indicator on a property list) the object ++ associated with the property indicator on the property list. ++ ++purports to conform ++ v. makes a good-faith claim of conformance. This term expresses ++ intention to conform, regardless of whether the goal of that ++ intention is realized in practice. For example, language ++ implementations have been known to have bugs, and while an ++ implementation of this specification with bugs might not be a ++ conforming implementation, it can still purport to conform. This ++ is an important distinction in certain specific cases; e.g., see ++ the variable *features*. ++ ++Q ++- ++ ++qualified method ++ n. a method that has one or more qualifiers. ++ ++qualifier ++ n. (of a method for a generic function) one of possibly several ++ objects used to annotate the method in a way that identifies its ++ role in the method combination. The method combination type ++ determines how many qualifiers are permitted for each method, which ++ qualifiers are permitted, and the semantics of those qualifiers. ++ ++query I/O ++ n. the bidirectional stream that is the value of the variable ++ *query-io*. ++ ++quoted object ++ n. an object which is the second element of a quote form. ++ ++R ++- ++ ++radix ++ n. an integer between 2 and 36, inclusive, which can be used to ++ designate a base with respect to which certain kinds of numeric ++ input or output are performed. (There are n valid digit characters ++ for any given radix n, and those digits are the first n digits in ++ the sequence 0, 1, ..., 9, A, B, ..., Z, which have the weights 0, ++ 1, ..., 9, 10, 11, ..., 35, respectively. Case is not significant ++ in parsing numbers of radix greater than 10, so "9b8a" and "9B8A" ++ denote the same radix 16 number.) ++ ++random state ++ n. an object of type random-state. ++ ++rank ++ n. a non-negative integer indicating the number of dimensions of ++ an array. ++ ++ratio ++ n. an object of type ratio. ++ ++ratio marker ++ n. a character which is used in the textual notation for a ratio ++ to separate the numerator from the denominator, and which is slash ++ in the standard readtable. See *note Character Syntax::. ++ ++rational ++ n. an object of type rational. ++ ++read ++ v.t. ++ ++ 1. (a binding or slot or component) to obtain the value of the ++ binding or slot. ++ ++ 2. (an object from a stream) to parse an object from its ++ representation on the stream. ++ ++readably ++ adv. (of a manner of printing an object O_1) in such a way as to ++ permit the Lisp Reader to later parse the printed output into an ++ object O_2 that is similar to O_1. ++ ++reader ++ n. 1. a function that reads_1 a variable or slot. 2. the Lisp ++ reader. ++ ++reader macro ++ n. 1. a textual notation introduced by dispatch on one or two ++ characters that defines special-purpose syntax for use by the Lisp ++ reader, and that is implemented by a reader macro function. See ++ *note Reader Algorithm::. 2. the character or characters that ++ introduce a reader macro_1; that is, a macro character or the ++ conceptual pairing of a dispatching macro character and the ++ character that follows it. (A reader macro is not a kind of ++ macro.) ++ ++reader macro function ++ n. a function designator that denotes a function that implements a ++ reader macro_2. See the functions set-macro-character and ++ set-dispatch-macro-character. ++ ++readtable ++ n. an object of type readtable. ++ ++readtable case ++ n. an attribute of a readtable whose value is a case sensitivity ++ mode, and that selects the manner in which characters in a symbol's ++ name are to be treated by the Lisp reader and the Lisp printer. ++ See *note Effect of Readtable Case on the Lisp Reader:: and *note ++ Effect of Readtable Case on the Lisp Printer::. ++ ++readtable designator ++ n. a designator for a readtable; that is, an object that denotes a ++ readtable and that is one of: nil (denoting the standard ++ readtable), or a readtable (denoting itself). ++ ++recognizable subtype ++ n. (of a type) a subtype of the type which can be reliably ++ detected to be such by the implementation. See the function ++ subtypep. ++ ++reference ++ n., v.t. 1. n. an act or occurrence of referring to an object, a ++ binding, an exit point, a tag, or an environment. 2. v.t. to ++ refer to an object, a binding, an exit point, a tag, or an ++ environment, usually by name. ++ ++registered package ++ n. a package object that is installed in the package registry. ++ (Every registered package has a name that is a string, as well as ++ zero or more string nicknames. All packages that are initially ++ specified by Common Lisp or created by make-package or defpackage ++ are registered packages. Registered packages can be turned into ++ unregistered packages by delete-package.) ++ ++relative ++ adj. 1. (of a time) representing an offset from an absolute time ++ in the units appropriate to that time. For example, a relative ++ internal time is the difference between two absolute internal ++ times, and is measured in internal time units. 2. (of a pathname) ++ representing a position in a directory hierarchy by motion from a ++ position other than the root, which might therefore vary. "The ++ notation #P"../foo.text" denotes a relative pathname if the host ++ file system is Unix." See absolute. ++ ++repertoire ++ n., ISO a subtype of character. See *note Character Repertoires::. ++ ++report ++ n. (of a condition) to call the function print-object on the ++ condition in an environment where the value of *print-escape* is ++ false. ++ ++report message ++ n. the text that is output by a condition reporter. ++ ++required parameter ++ n. A parameter for which a corresponding positional argument must ++ be supplied when calling the function. ++ ++rest list ++ n. (of a function having a rest parameter) The list to which the ++ rest parameter is bound on some particular call to the function. ++ ++rest parameter ++ n. A parameter which was introduced by &rest. ++ ++restart ++ n. an object of type restart. ++ ++restart designator ++ n. a designator for a restart; that is, an object that denotes a ++ restart and that is one of: a non-nil symbol (denoting the most ++ recently established active restart whose name is that symbol), or ++ a restart (denoting itself). ++ ++restart function ++ n. a function that invokes a restart, as if by invoke-restart. ++ The primary purpose of a restart function is to provide an ++ alternate interface. By convention, a restart function usually has ++ the same name as the restart which it invokes. Figure 26-4 shows a ++ list of the standardized restart functions. ++ ++ abort muffle-warning use-value ++ continue store-value ++ ++ Figure 26-4: Standardized Restart Functions ++ ++ ++return ++ v.t. (of values) 1. (from a block) to transfer control and values ++ from the block; that is, to cause the block to yield the values ++ immediately without doing any further evaluation of the forms in ++ its body. 2. (from a form) to yield the values. ++ ++return value ++ n. Trad. a value_1 ++ ++right-parenthesis ++ n. the standard character ")", that is variously called "right ++ parenthesis" or "close parenthesis" See Figure~2-5. ++ ++run time ++ n. 1. load time 2. execution time ++ ++run-time compiler ++ n. refers to the compile function or to implicit compilation, for ++ which the compilation and run-time environments are maintained in ++ the same Lisp image. ++ ++run-time definition ++ n. a definition in the run-time environment. ++ ++run-time environment ++ n. the environment in which a program is executed. ++ ++S ++- ++ ++safe ++ adj. 1. (of code) processed in a lexical environment where the ++ the highest safety level (3) was in effect. See optimize. 2. (of ++ a call) a safe call. ++ ++safe call ++ n. a call in which the call, the function being called, and the ++ point of functional evaluation are all safe_1 code. For more ++ detailed information, see *note Safe and Unsafe Calls::. ++ ++same ++ adj. 1. (of objects under a specified predicate) ++ indistinguishable by that predicate. "The symbol car, the string ++ "car", and the string "CAR" are the same under string-equal". 2. ++ (of objects if no predicate is implied by context) ++ indistinguishable by eql. Note that eq might be capable of ++ distinguishing some numbers and characters which eql cannot ++ distinguish, but the nature of such, if any, is ++ implementation-dependent. Since eq is used only rarely in this ++ specification, eql is the default predicate when none is mentioned ++ explicitly. "The conses returned by two successive calls to cons ++ are never the same." 3. (of types) having the same set of ++ elements; that is, each type is a subtype of the others. "The ++ types specified by (integer 0 1), (unsigned-byte 1), and bit are ++ the same." ++ ++satisfy the test ++ v. (of an object being considered by a sequence function) 1. (for ++ a one argument test) to be in a state such that the function which ++ is the predicate argument to the sequence function returns true ++ when given a single argument that is the result of calling the ++ sequence function's key argument on the object being considered. ++ See *note Satisfying a One-Argument Test::. 2. (for a two ++ argument test) to be in a state such that the two-place predicate ++ which is the sequence function's test argument returns true when ++ given a first argument that is the object being considered, and ++ when given a second argument that is the result of calling the ++ sequence function's key argument on an element of the sequence ++ function's sequence argument which is being tested for equality; or ++ to be in a state such that the test-not function returns false ++ given the same arguments. See *note Satisfying a Two-Argument ++ Test::. ++ ++scope ++ n. the structural or textual region of code in which references to ++ an object, a binding, an exit point, a tag, or an environment ++ (usually by name) can occur. ++ ++script ++ n. ISO one of possibly several sets that form an exhaustive ++ partition of the type character. See *note Character Scripts::. ++ ++secondary value ++ n. (of values resulting from the evaluation of a form) the second ++ value, if any, or else nil if there are fewer than two values. ++ "The secondary value returned by truncate is a remainder." ++ ++section ++ n. a partitioning of output by a conditional newline on a pretty ++ printing stream. See *note Dynamic Control of the Arrangement of ++ Output::. ++ ++self-evaluating object ++ n. an object that is neither a symbol nor a cons. If a ++ self-evaluating object is evaluated, it yields itself as its only ++ value. "Strings are self-evaluating objects." ++ ++semi-standard ++ adj. (of a language feature) not required to be implemented by any ++ conforming implementation, but nevertheless recommended as the ++ canonical approach in situations where an implementation does plan ++ to support such a feature. The presence of semi-standard aspects ++ in the language is intended to lessen portability problems and ++ reduce the risk of gratuitous divergence among implementations that ++ might stand in the way of future standardization. ++ ++semicolon ++ n. the standard character that is called "semicolon" (;). See ++ Figure~2-5. ++ ++sequence ++ n. 1. an ordered collection of elements 2. a vector or a list. ++ ++sequence function ++ n. one of the functions in Figure~17-1, or an ++ implementation-defined function that operates on one or more ++ sequences. and that is defined by the implementation to be a ++ sequence function. ++ ++sequential ++ adj. Trad. (of binding or assignment) done in the style of setq, ++ let*, or do*; that is, interleaving the evaluation of the forms ++ that produce values with the assignments or bindings of the ++ variables (or places). See parallel. ++ ++sequentially ++ adv. in a sequential way. ++ ++serious condition ++ n. a condition of type serious-condition, which represents a ++ situation that is generally sufficiently severe that entry into the ++ debugger should be expected if the condition is signaled but not ++ handled. ++ ++session ++ n. the conceptual aggregation of events in a Lisp image from the ++ time it is started to the time it is terminated. ++ ++set ++ v.t. Trad. (any variable or a symbol that is the name of a ++ dynamic variable) to assign the variable. ++ ++setf expander ++ n. a function used by setf to compute the setf expansion of a ++ place. ++ ++setf expansion ++ n. a set of five expressions_1 that, taken together, describe how ++ to store into a place and which subforms of the macro call ++ associated with the place are evaluated. See *note Setf ++ Expansions::. ++ ++setf function ++ n. a function whose name is (setf symbol). ++ ++setf function name ++ n. (of a symbol S) the list (setf S). ++ ++shadow ++ v.t. 1. to override the meaning of. "That binding of X shadows ++ an outer one." 2. to hide the presence of. "That macrolet of F ++ shadows the outer flet of F." 3. to replace. "That package ++ shadows the symbol cl:car with its own symbol car." ++ ++shadowing symbol ++ n. (in a package) an element of the package's shadowing symbols ++ list. ++ ++shadowing symbols list ++ n. (of a package) a list, associated with the package, of symbols ++ that are to be exempted from 'symbol conflict errors' detected when ++ packages are used. See the function package-shadowing-symbols. ++ ++shared slot ++ n. (of a class) a slot accessible in more than one instance of a ++ class; specifically, such a slot is accessible in all direct ++ instances of the class and in those indirect instances whose class ++ does not shadow_1 the slot. ++ ++sharpsign ++ n. the standard character that is variously called "number sign," ++ "sharp," or "sharp sign" (#). See Figure~2-5. ++ ++short float ++ n. an object of type short-float. ++ ++sign ++ n. one of the standard characters "+" or "-". ++ ++signal ++ v. to announce, using a standard protocol, that a particular ++ situation, represented by a condition, has been detected. See ++ *note Condition System Concepts::. ++ ++signature ++ n. (of a method) a description of the parameters and parameter ++ specializers for the method which determines the method's ++ applicability for a given set of required arguments, and which also ++ describes the argument conventions for its other, non-required ++ arguments. ++ ++similar ++ adj. (of two objects) defined to be equivalent under the ++ similarity relationship. ++ ++similarity ++ n. a two-place conceptual equivalence predicate, which is ++ independent of the Lisp image so that two objects in different Lisp ++ images can be understood to be equivalent under this predicate. ++ See *note Literal Objects in Compiled Files::. ++ ++simple ++ adj. 1. (of an array) being of type simple-array. 2. (of a ++ character) having no implementation-defined attributes, or else ++ having implementation-defined attributes each of which has the null ++ value for that attribute. ++ ++simple array ++ n. an array of type simple-array. ++ ++simple bit array ++ n. a bit array that is a simple array; that is, an object of type ++ (simple-array bit). ++ ++simple bit vector ++ n. a bit vector of type simple-bit-vector. ++ ++simple condition ++ n. a condition of type simple-condition. ++ ++simple general vector ++ n. a simple vector. ++ ++simple string ++ n. a string of type simple-string. ++ ++simple vector ++ n. a vector of type simple-vector, sometimes called a "simple ++ general vector." Not all vectors that are simple are simple ++ vectors--only those that have element type t. ++ ++single escape ++ n., adj. 1. n. the syntax type of a character that indicates ++ that the next character is to be treated as an alphabetic_2 ++ character with its case preserved. For details, see *note Single ++ Escape Character::. 2. adj. (of a character) having the single ++ escape syntax type. 3. n. a single escape_2 character. (In the ++ standard readtable, slash is the only single escape.) ++ ++single float ++ n. an object of type single-float. ++ ++single-quote ++ n. the standard character that is variously called "apostrophe," ++ "acute accent," "quote," or "single quote" ('). See Figure~2-5. ++ ++singleton ++ adj. (of a sequence) having only one element. "(list 'hello) ++ returns a singleton list." ++ ++situation ++ n. the evaluation of a form in a specific environment. ++ ++slash ++ n. the standard character that is variously called "solidus" or ++ "slash" (/). See Figure~2-5. ++ ++slot ++ n. a component of an object that can store a value. ++ ++slot specifier ++ n. a representation of a slot that includes the name of the slot ++ and zero or more slot options. A slot option pertains only to a ++ single slot. ++ ++source code ++ n. code representing objects suitable for evaluation (e.g., ++ objects created by read, by macro expansion, ++ ++ or by compiler macro expansion). ++ ++source file ++ n. a file which contains a textual representation of source code, ++ that can be edited, loaded, or compiled. ++ ++space ++ n. the standard character , notated for the Lisp reader as ++ #\Space. ++ ++special form ++ n. a list, other than a macro form, which is a form with special ++ syntax or special evaluation rules or both, possibly manipulating ++ the evaluation environment or control flow or both. The first ++ element of a special form is a special operator. ++ ++special operator ++ n. one of a fixed set of symbols, enumerated in Figure~3-2, that ++ may appear in the car of a form in order to identify the form as a ++ special form. ++ ++special variable ++ n. Trad. a dynamic variable. ++ ++specialize ++ v.t. (a generic function) to define a method for the generic ++ function, or in other words, to refine the behavior of the generic ++ function by giving it a specific meaning for a particular set of ++ classes or arguments. ++ ++specialized ++ adj. 1. (of a generic function) having methods which specialize ++ the generic function. 2. (of an array) having an actual array ++ element type that is a proper subtype of the type t; see *note ++ Array Elements::. "(make-array 5 :element-type 'bit) makes an ++ array of length five that is specialized for bits." ++ ++specialized lambda list ++ n. an extended lambda list used in forms that establish method ++ definitions, such as defmethod. See *note Specialized Lambda ++ Lists::. ++ ++spreadable argument list designator ++ n. a designator for a list of objects; that is, an object that ++ denotes a list and that is a non-null list L1 of length n, whose ++ last element is a list L2 of length m (denoting a list L3 of length ++ m+n-1 whose elements are L1_i for i < n-1 followed by L2_j for j < ++ m). "The list (1 2 (3 4 5)) is a spreadable argument list ++ designator for the list (1 2 3 4 5)." ++ ++stack allocate ++ v.t. Trad. to allocate in a non-permanent way, such as on a ++ stack. Stack-allocation is an optimization technique used in some ++ implementations for allocating certain kinds of objects that have ++ dynamic extent. Such objects are allocated on the stack rather ++ than in the heap so that their storage can be freed as part of ++ unwinding the stack rather than taking up space in the heap until ++ the next garbage collection. What types (if any) can have dynamic ++ extent can vary from implementation to implementation. No ++ implementation is ever required to perform stack-allocation. ++ ++stack-allocated ++ adj. Trad. having been stack allocated. ++ ++standard character ++ n. a character of type standard-char, which is one of a fixed set ++ of 96 such characters required to be present in all conforming ++ implementations. See *note Standard Characters::. ++ ++standard class ++ n. a class that is a generalized instance of class standard-class. ++ ++standard generic function ++ ++ a function of type standard-generic-function. ++ ++standard input ++ n. the input stream which is the value of the dynamic variable ++ *standard-input*. ++ ++standard method combination ++ n. the method combination named standard. ++ ++standard object ++ n. an object that is a generalized instance of class ++ standard-object. ++ ++standard output ++ n. the output stream which is the value of the dynamic variable ++ *standard-output*. ++ ++standard pprint dispatch table ++ n. A pprint dispatch table that is different from the initial ++ pprint dispatch table, that implements pretty printing as described ++ in this specification, and that, unlike other pprint dispatch ++ tables, must never be modified by any program. (Although the ++ definite reference "the standard pprint dispatch table" is ++ generally used within this document, it is actually ++ implementation-dependent whether a single object fills the role of ++ the standard pprint dispatch table, or whether there might be ++ multiple such objects, any one of which could be used on any given ++ occasion where "the standard pprint dispatch table" is called for. ++ As such, this phrase should be seen as an indefinite reference in ++ all cases except for anaphoric references.) ++ ++standard readtable ++ n. A readtable that is different from the initial readtable, that ++ implements the expression syntax defined in this specification, and ++ that, unlike other readtables, must never be modified by any ++ program. (Although the definite reference "the standard readtable" ++ is generally used within this document, it is actually ++ implementation-dependent whether a single object fills the role of ++ the standard readtable, or whether there might be multiple such ++ objects, any one of which could be used on any given occasion where ++ "the standard readtable" is called for. As such, this phrase ++ should be seen as an indefinite reference in all cases except for ++ anaphoric references.) ++ ++standard syntax ++ n. the syntax represented by the standard readtable and used as a ++ reference syntax throughout this document. See *note Character ++ Syntax::. ++ ++standardized ++ adj. (of a name, object, or definition) having been defined by ++ Common Lisp. "All standardized variables that are required to hold ++ bidirectional streams have "-io*" in their name." ++ ++startup environment ++ n. the global environment of the running Lisp image from which the ++ compiler was invoked. ++ ++step ++ v.t., n. 1. v.t. (an iteration variable) to assign the variable ++ a new value at the end of an iteration, in preparation for a new ++ iteration. 2. n. the code that identifies how the next value in ++ an iteration is to be computed. 3. v.t. (code) to specially ++ execute the code, pausing at intervals to allow user confirmation ++ or intervention, usually for debugging. ++ ++stream ++ n. an object that can be used with an input or output function to ++ identify an appropriate source or sink of characters or bytes for ++ that operation. ++ ++stream associated with a file ++ n. a file stream, or a synonym stream the target of which is a ++ stream associated with a file. Such a stream cannot be created ++ with make-two-way-stream, make-echo-stream, make-broadcast-stream, ++ make-concatenated-stream, make-string-input-stream, or ++ make-string-output-stream. ++ ++stream designator ++ n. a designator for a stream; that is, an object that denotes a ++ stream and that is one of: t (denoting the value of *terminal-io*), ++ nil (denoting the value of *standard-input* for input stream ++ designators or denoting the value of *standard-output* for output ++ stream designators), or a stream (denoting itself). ++ ++stream element type ++ n. (of a stream) the type of data for which the stream is ++ specialized. ++ ++stream variable ++ n. a variable whose value must be a stream. ++ ++stream variable designator ++ n. a designator for a stream variable; that is, a symbol that ++ denotes a stream variable and that is one of: t (denoting ++ *terminal-io*), nil (denoting *standard-input* for input stream ++ variable designators or denoting *standard-output* for output ++ stream variable designators), or some other symbol (denoting ++ itself). ++ ++string ++ n. a specialized vector that is of type string, and whose elements ++ are of type character or a subtype of type character. ++ ++string designator ++ n. a designator for a string; that is, an object that denotes a ++ string and that is one of: a character (denoting a singleton string ++ that has the character as its only element), a symbol (denoting the ++ string that is its name), or a string (denoting itself). ++ ++ The intent is that this term be consistent with the behavior of ++ string; implementations that extend string must extend the meaning ++ of this term in a compatible way. ++ ++string equal ++ adj. the same under string-equal. ++ ++string stream ++ n. a stream of type string-stream. ++ ++structure ++ n. an object of type structure-object. ++ ++structure class ++ n. a class that is a generalized instance of class ++ structure-class. ++ ++structure name ++ n. a name defined with defstruct. Usually, such a type is also a ++ structure class, but there may be implementation-dependent ++ situations in which this is not so, if the :type option to ++ defstruct is used. ++ ++style warning ++ n. a condition of type style-warning. ++ ++subclass ++ n. a class that inherits from another class, called a superclass. ++ (No class is a subclass of itself.) ++ ++subexpression ++ n. (of an expression) an expression that is contained within the ++ expression. (In fact, the state of being a subexpression is not an ++ attribute of the subexpression, but really an attribute of the ++ containing expression since the same object can at once be a ++ subexpression in one context, and not in another.) ++ ++subform ++ n. (of a form) an expression that is a subexpression of the form, ++ and which by virtue of its position in that form is also a form. ++ "(f x) and x, but not exit, are subforms of (return-from exit (f ++ x))." ++ ++subrepertoire ++ n. a subset of a repertoire. ++ ++subtype ++ n. a type whose membership is the same as or a proper subset of ++ the membership of another type, called a supertype. (Every type is ++ a subtype of itself.) ++ ++superclass ++ n. a class from which another class (called a subclass) inherits. ++ (No class is a superclass of itself.) See subclass. ++ ++supertype ++ n. a type whose membership is the same as or a proper superset of ++ the membership of another type, called a subtype. (Every type is a ++ supertype of itself.) See subtype. ++ ++supplied-p parameter ++ n. a parameter which recieves its generalized boolean value ++ implicitly due to the presence or absence of an argument ++ corresponding to another parameter (such as an optional parameter ++ or a rest parameter). See *note Ordinary Lambda Lists::. ++ ++symbol ++ n. an object of type symbol. ++ ++symbol macro ++ n. a symbol that stands for another form. See the macro ++ symbol-macrolet. ++ ++synonym stream ++ n. 1. a stream of type synonym-stream, which is consequently a ++ stream that is an alias for another stream, which is the value of a ++ dynamic variable whose name is the synonym stream symbol of the ++ synonym stream. See the function make-synonym-stream. 2. (to a ++ stream) a synonym stream which has the stream as the value of its ++ synonym stream symbol. 3. (to a symbol) a synonym stream which ++ has the symbol as its synonym stream symbol. ++ ++synonym stream symbol ++ n. (of a synonym stream) the symbol which names the dynamic ++ variable which has as its value another stream for which the ++ synonym stream is an alias. ++ ++syntax type ++ n. (of a character) one of several classifications, enumerated in ++ Figure~2-6, that are used for dispatch during parsing by the Lisp ++ reader. See *note Character Syntax Types::. ++ ++system class ++ n. a class that may be of type built-in-class in a conforming ++ implementation and hence cannot be inherited by classes defined by ++ conforming programs. ++ ++system code ++ n. code supplied by the implementation to implement this ++ specification (e.g., the definition of mapcar) or generated ++ automatically in support of this specification (e.g., during method ++ combination); that is, code that is not programmer code. ++ ++T ++- ++ ++t ++ n. 1. a. the boolean representing true. b. the canonical ++ generalized boolean representing true. (Although any object other ++ than nil is considered true as a generalized boolean, t is ++ generally used when there is no special reason to prefer one such ++ object over another.) 2. the name of the type to which all ++ objects belong--the supertype of all types (including itself). 3. ++ the name of the superclass of all classes except itself. ++ ++tag ++ n. 1. a catch tag. 2. a go tag. ++ ++tail ++ n. (of a list) an object that is the same as either some cons ++ which makes up that list or the atom (if any) which terminates the ++ list. "The empty list is a tail of every proper list." ++ ++target ++ n. 1. (of a constructed stream) a constituent of the constructed ++ stream. "The target of a synonym stream is the value of its ++ synonym stream symbol." 2. (of a displaced array) the array to ++ which the displaced array is displaced. (In the case of a chain of ++ constructed streams or displaced arrays, the unqualified term ++ "target" always refers to the immediate target of the first item in ++ the chain, not the immediate target of the last item.) ++ ++terminal I/O ++ n. the bidirectional stream that is the value of the variable ++ *terminal-io*. ++ ++terminating ++ n. (of a macro character) being such that, if it appears while ++ parsing a token, it terminates that token. See *note Reader ++ Algorithm::. ++ ++tertiary value ++ n. (of values resulting from the evaluation of a form) the third ++ value, if any, or else nil if there are fewer than three values. ++ ++throw ++ v. to transfer control and values to a catch. See the special ++ operator throw. ++ ++tilde ++ n. the standard character that is called "tilde" (~). See ++ Figure~2-5. ++ ++time ++ ++ a representation of a point (absolute time) or an interval ++ (relative time) on a time line. See decoded time, internal time, ++ and universal time. ++ ++time zone ++ n. a rational multiple of 1/3600 between -24 (inclusive) and 24 ++ (inclusive) that represents a time zone as a number of hours offset ++ from Greenwich Mean Time. Time zone values increase with motion to ++ the west, so Massachusetts, U.S.A. is in time zone 5, California, ++ U.S.A. is time zone 8, and Moscow, Russia is time zone -3. (When ++ "daylight savings time" is separately represented as an argument or ++ return value, the time zone that accompanies it does not depend on ++ whether daylight savings time is in effect.) ++ ++token ++ n. a textual representation for a number or a symbol. See *note ++ Interpretation of Tokens::. ++ ++top level form ++ n. a form which is processed specially by compile-file for the ++ purposes of enabling compile time evaluation of that form. Top ++ level forms include those forms which are not subforms of any other ++ form, and certain other cases. See *note Processing of Top Level ++ Forms::. ++ ++trace output ++ n. the output stream which is the value of the dynamic variable ++ *trace-output*. ++ ++tree ++ n. 1. a binary recursive data structure made up of conses and ++ atoms: the conses are themselves also trees (sometimes called ++ "subtrees" or "branches"), and the atoms are terminal nodes ++ (sometimes called leaves). Typically, the leaves represent data ++ while the branches establish some relationship among that data. 2. ++ in general, any recursive data structure that has some notion of ++ "branches" and leaves. ++ ++tree structure ++ n. (of a tree_1) the set of conses that make up the tree. Note ++ that while the car_{1b} component of each such cons is part of the ++ tree structure, the objects that are the cars_2 of each cons in the ++ tree are not themselves part of its tree structure unless they are ++ also conses. ++ ++true ++ n. any object that is not false and that is used to represent the ++ success of a predicate test. See t_1. ++ ++truename ++ n. 1. the canonical filename of a file in the file system. See ++ *note Truenames::. 2. a pathname representing a truename_1. ++ ++two-way stream ++ n. a stream of type two-way-stream, which is a bidirectional ++ composite stream that receives its input from an associated input ++ stream and sends its output to an associated output stream. ++ ++type ++ n. 1. a set of objects, usually with common structure, behavior, ++ or purpose. (Note that the expression "X is of type S_a" naturally ++ implies that "X is of type S_b" if S_a is a subtype of S_b.) 2. ++ (immediately following the name of a type) a subtype of that type. ++ "The type vector is an array type." ++ ++type declaration ++ n. a declaration that asserts that every reference to a specified ++ binding within the scope of the declaration results in some object ++ of the specified type. ++ ++type equivalent ++ adj. (of two types X and Y) having the same elements; that is, X ++ is a subtype of Y and Y is a subtype of X. ++ ++type expand ++ n. to fully expand a type specifier, removing any references to ++ derived types. (Common Lisp provides no program interface to cause ++ this to occur, but the semantics of Common Lisp are such that every ++ implementation must be able to do this internally, and some ++ situations involving type specifiers are most easily described in ++ terms of a fully expanded type specifier.) ++ ++type specifier ++ n. an expression that denotes a type. "The symbol random-state, ++ the list (integer 3 5), the list (and list (not null)), and the ++ class named standard-class are type specifiers." ++ ++U ++- ++ ++unbound ++ adj. not having an associated denotation in a binding. See bound. ++ ++unbound variable ++ n. a name that is syntactically plausible as the name of a ++ variable but which is not bound in the variable namespace. ++ ++undefined function ++ n. a name that is syntactically plausible as the name of a ++ function but which is not bound in the function namespace. ++ ++unintern ++ v.t. (a symbol in a package) to make the symbol not be present in ++ that package. (The symbol might continue to be accessible by ++ inheritance.) ++ ++uninterned ++ adj. (of a symbol) not accessible in any package; i.e., not ++ interned_1. ++ ++universal time ++ n. time, represented as a non-negative integer number of seconds. ++ Absolute universal time is measured as an offset from the beginning ++ of the year 1900 (ignoring leap seconds). See *note Universal ++ Time::. ++ ++unqualified method ++ n. a method with no qualifiers. ++ ++unregistered package ++ n. a package object that is not present in the package registry. ++ An unregistered package has no name; i.e., its name is nil. See ++ the function delete-package. ++ ++unsafe ++ adj. (of code) not safe. (Note that, unless explicitly specified ++ otherwise, if a particular kind of error checking is guaranteed ++ only in a safe context, the same checking might or might not occur ++ in that context if it were unsafe; describing a context as unsafe ++ means that certain kinds of error checking are not reliably enabled ++ but does not guarantee that error checking is definitely disabled.) ++ ++unsafe call ++ n. a call that is not a safe call. For more detailed information, ++ see *note Safe and Unsafe Calls::. ++ ++upgrade ++ v.t. (a declared type to an actual type) 1. (when creating an ++ array) to substitute an actual array element type for an expressed ++ array element type when choosing an appropriately specialized array ++ representation. See the function upgraded-array-element-type. 2. ++ (when creating a complex) to substitute an actual complex part type ++ for an expressed complex part type when choosing an appropriately ++ specialized complex representation. See the function ++ upgraded-complex-part-type. ++ ++upgraded array element type ++ n. (of a type) a type that is a supertype of the type and that is ++ used instead of the type whenever the type is used as an array ++ element type for object creation or type discrimination. See *note ++ Array Upgrading::. ++ ++upgraded complex part type ++ n. (of a type) a type that is a supertype of the type and that is ++ used instead of the type whenever the type is used as a complex ++ part type for object creation or type discrimination. See the ++ function upgraded-complex-part-type. ++ ++uppercase ++ adj. (of a character) being among standard characters ++ corresponding to the capital letters A through Z, or being some ++ other implementation-defined character that is defined by the ++ implementation to be uppercase. See *note Characters With Case::. ++ ++use ++ v.t. (a package P_1) to inherit the external symbols of P_1. (If ++ a package P_2 uses P_1, the external symbols of P_1 become internal ++ symbols of P_2 unless they are explicitly exported.) "The package ++ CL-USER uses the package CL." ++ ++use list ++ n. (of a package) a (possibly empty) list associated with each ++ package which determines what other packages are currently being ++ used by that package. ++ ++user ++ n. an active entity, typically a human, that invokes or interacts ++ with a program at run time, but that is not necessarily a ++ programmer. ++ ++V ++- ++ ++valid array dimension ++ n. a fixnum suitable for use as an array dimension. Such a fixnum ++ must be greater than or equal to zero, and less than the value of ++ array-dimension-limit. When multiple array dimensions are to be ++ used together to specify a multi-dimensional array, there is also ++ an implied constraint that the product of all of the dimensions be ++ less than the value of array-total-size-limit. ++ ++valid array index ++ n. (of an array) a fixnum suitable for use as one of possibly ++ several indices needed to name an element of the array according to ++ a multi-dimensional Cartesian coordinate system. Such a fixnum ++ must be greater than or equal to zero, and must be less than the ++ corresponding dimension_1 of the array. (Unless otherwise ++ explicitly specified, the phrase "a list of valid array indices" ++ further implies that the length of the list must be the same as the ++ rank of the array.) "For a 2 by~3 array, valid array indices for ++ the first dimension are 0 and~1, and valid array indices for the ++ second dimension are 0, 1 and~2." ++ ++valid array row-major index ++ n. (of an array, which might have any number of dimensions_2) a ++ single fixnum suitable for use in naming any element of the array, ++ by viewing the array's storage as a linear series of elements in ++ row-major order. Such a fixnum must be greater than or equal to ++ zero, and less than the array total size of the array. ++ ++valid fill pointer ++ n. (of an array) a fixnum suitable for use as a fill pointer for ++ the array. Such a fixnum must be greater than or equal to zero, ++ and less than or equal to the array total size of the array. ++ ++ [Editorial Note by KMP: The "valid pathname xxx" definitions were ++ taken from text found in make-pathname, but look wrong to me. I'll ++ fix them later.] ++ ++valid logical pathname host ++ n. a string that has been defined as the name of a logical host. ++ See the function load-logical-pathname-translations. ++ ++valid pathname device ++ n. a string, nil, :unspecific, or some other object defined by the ++ implementation to be a valid pathname device. ++ ++valid pathname directory ++ n. a string, a list of strings, nil, ++ ++ :wild, ++ ++ :unspecific, or some other object defined by the implementation to ++ be a valid directory component. ++ ++valid pathname host ++ n. a valid physical pathname host or a valid logical pathname ++ host. ++ ++valid pathname name ++ n. a string, nil, :wild, :unspecific, or some other object defined ++ by the implementation to be a valid pathname name. ++ ++valid pathname type ++ n. a string, nil, :wild, :unspecific. ++ ++valid pathname version ++ n. a non-negative integer, or one of :wild, :newest, :unspecific, ++ or nil. The symbols :oldest, :previous, and :installed are ++ semi-standard special version symbols. ++ ++valid physical pathname host ++ n. any of a string, a list of strings, or the symbol :unspecific, ++ that is recognized by the implementation as the name of a host. ++ ++valid sequence index ++ n. (of a sequence) an integer suitable for use to name an element ++ of the sequence. Such an integer must be greater than or equal to ++ zero, and must be less than the length of the sequence. ++ ++ (If the sequence is an array, the valid sequence index is further ++ constrained to be a fixnum.) ++ ++value ++ n. 1. a. one of possibly several objects that are the result of ++ an evaluation. b. (in a situation where exactly one value is ++ expected from the evaluation of a form) the primary value returned ++ by the form. c. (of forms in an implicit progn) one of possibly ++ several objects that result from the evaluation of the last form, ++ or nil if there are no forms. 2. an object associated with a name ++ in a binding. 3. (of a symbol) the value of the dynamic variable ++ named by that symbol. 4. an object associated with a key in an ++ association list, a property list, or a hash table. ++ ++value cell ++ n. Trad. (of a symbol) The place which holds the value, if any, ++ of the dynamic variable named by that symbol, and which is accessed ++ by symbol-value. See cell. ++ ++variable ++ n. a binding in which a symbol is the name used to refer to an ++ object. ++ ++vector ++ n. a one-dimensional array. ++ ++vertical-bar ++ n. the standard character that is called "vertical bar" (|). See ++ Figure~2-5. ++ ++W ++- ++ ++whitespace ++ n. 1. one or more characters that are either the graphic ++ character #\Space or else non-graphic characters such as #\Newline ++ that only move the print position. 2. a. n. the syntax type of ++ a character that is a token separator. For details, see *note ++ Whitespace Characters::. b. adj. (of a character) having the ++ whitespace_{2a} syntax type_2. c. n. a whitespace_{2b} ++ character. ++ ++wild ++ adj. 1. (of a namestring) using an implementation-defined syntax ++ for naming files, which might "match" any of possibly several ++ possible filenames, and which can therefore be used to refer to the ++ aggregate of the files named by those filenames. 2. (of a ++ pathname) a structured representation of a name which might "match" ++ any of possibly several pathnames, and which can therefore be used ++ to refer to the aggregate of the files named by those pathnames. ++ The set of wild pathnames includes, but is not restricted to, ++ pathnames which have a component which is :wild, or which have a ++ directory component which contains :wild or :wild-inferors. See ++ the function wild-pathname-p. ++ ++write ++ v.t. ++ ++ 1. (a binding or slot or component) to change the value of the ++ binding or slot. ++ ++ 2. (an object to a stream) to output a representation of the ++ object to the stream. ++ ++writer ++ n. a function that writes_1 a variable or slot. ++ ++Y ++- ++ ++yield ++ v.t. (values) to produce the values as the result of evaluation. ++ "The form (+ 2 3) yields 5." ++ ++ ++File: gcl.info, Node: Appendix, Prev: Glossary (Glossary), Up: Top ++ ++27 Appendix ++*********** ++ ++* Menu: ++ ++* Removed Language Features:: ++ ++ ++File: gcl.info, Node: Removed Language Features, Prev: Appendix, Up: Appendix ++ ++27.1 Removed Language Features ++============================== ++ ++* Menu: ++ ++* Requirements for removed and deprecated features:: ++* Removed Types:: ++* Removed Operators:: ++* Removed Argument Conventions:: ++* Removed Variables:: ++* Removed Reader Syntax:: ++* Packages No Longer Required:: ++ ++ ++File: gcl.info, Node: Requirements for removed and deprecated features, Next: Removed Types, Prev: Removed Language Features, Up: Removed Language Features ++ ++27.1.1 Requirements for removed and deprecated features ++------------------------------------------------------- ++ ++For this standard, some features from the language described in Common ++Lisp: The Language have been removed, and others have been deprecated ++(and will most likely not appear in future Common Lisp standards). ++Which features were removed and which were deprecated was decided on a ++case-by-case basis by the X3J13 committee. ++ ++ Conforming implementations that wish to retain any removed features ++for compatibility must assure that such compatibility does not interfere ++with the correct function of conforming programs. For example, symbols ++corresponding to the names of removed functions may not appear in the ++the COMMON-LISP package. (Note, however, that this specification has ++been devised in such a way that there can be a package named LISP which ++can contain such symbols.) ++ ++ Conforming implementations must implement all deprecated features. ++For a list of deprecated features, see *note Deprecated Language ++Features::. ++ ++ ++File: gcl.info, Node: Removed Types, Next: Removed Operators, Prev: Requirements for removed and deprecated features, Up: Removed Language Features ++ ++27.1.2 Removed Types ++-------------------- ++ ++The type string-char was removed. ++ ++ ++File: gcl.info, Node: Removed Operators, Next: Removed Argument Conventions, Prev: Removed Types, Up: Removed Language Features ++ ++27.1.3 Removed Operators ++------------------------ ++ ++The functions ++ ++ int-char , char-bits , char-font , make-char , char-bit , ++set-char-bit , string-char-p , ++ ++ and commonp ++ ++ were removed. ++ ++ The special operator compiler-let was removed. ++ ++ ++File: gcl.info, Node: Removed Argument Conventions, Next: Removed Variables, Prev: Removed Operators, Up: Removed Language Features ++ ++27.1.4 Removed Argument Conventions ++----------------------------------- ++ ++The font argument to digit-char was removed. The bits and font ++arguments to code-char ++ ++ were removed. ++ ++ ++File: gcl.info, Node: Removed Variables, Next: Removed Reader Syntax, Prev: Removed Argument Conventions, Up: Removed Language Features ++ ++27.1.5 Removed Variables ++------------------------ ++ ++The variables ++ ++ char-font-limit , char-bits-limit , char-control-bit , char-meta-bit ++, char-super-bit , char-hyper-bit , ++ ++ and *break-on-warnings* ++ ++ were removed. ++ ++ ++File: gcl.info, Node: Removed Reader Syntax, Next: Packages No Longer Required, Prev: Removed Variables, Up: Removed Language Features ++ ++27.1.6 Removed Reader Syntax ++---------------------------- ++ ++The "#," reader macro in standard syntax was removed. ++ ++ ++File: gcl.info, Node: Packages No Longer Required, Prev: Removed Reader Syntax, Up: Removed Language Features ++ ++27.1.7 Packages No Longer Required ++---------------------------------- ++ ++The packages LISP , USER , and SYSTEM ++ ++ are no longer required. It is valid for packages with one or more of ++these names to be provided by a conforming implementation as extensions. ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl.texi +@@ -0,0 +1,2077 @@ ++\input texinfo ++@c -*-texinfo-*- ++@c %**start of header ++@setfilename gcl.info ++@settitle ANSI and GNU Common Lisp Document ++@c %**end of header ++@setchapternewpage odd ++ ++@ifinfo ++This is a Texinfo GNU Common Lisp Manual based on the draft ANSI standard ++for Common Lisp. ++ ++Copyright 1994 William F. Schelter ++ ++@format ++INFO-DIR-SECTION GNU Common Lisp ++START-INFO-DIR-ENTRY ++* gcl: (gcl.info). GNU Common Lisp Manual ++END-INFO-DIR-ENTRY ++@end format ++@end ifinfo ++ ++@titlepage ++@sp 10 ++@comment The title is printed in a large font. ++@center @titlefont{GNU Common Lisp Manual} ++@end titlepage ++ ++@defcodeindex fu ++@c function index ++@defcodeindex IR ++@c reference index ++@defcodeindex IC ++@c Code index ++@defindex IT ++@c Text index ++@defindex IG ++@c Glossary index ++@defindex IE ++@c Example index ++@defcodeindex IP ++@c Package index ++@c @defcodeindex IK ++@c Keyword Index ++ ++@node Top, Introduction (Introduction), (dir), (dir) ++ ++@menu ++* Introduction (Introduction):: ++* Syntax:: ++* Evaluation and Compilation:: ++* Types and Classes:: ++* Data and Control Flow:: ++* Iteration:: ++* Objects:: ++* Structures:: ++* Conditions:: ++* Symbols:: ++* Packages:: ++* Numbers (Numbers):: ++* Characters:: ++* Conses:: ++* Arrays:: ++* Strings:: ++* Sequences:: ++* Hash Tables:: ++* Filenames:: ++* Files:: ++* Streams:: ++* Printer:: ++* Reader:: ++* System Construction:: ++* Environment:: ++* Glossary (Glossary):: ++* Appendix:: ++ ++ --- The Detailed Node Listing --- ++ ++Introduction ++ ++* Scope:: ++* Organization of the Document:: ++* Referenced Publications:: ++* Definitions:: ++* Conformance:: ++* Language Extensions:: ++* Language Subsets:: ++* Deprecated Language Features:: ++* Symbols in the COMMON-LISP Package:: ++ ++Scope, Purpose, and History ++ ++* Scope and Purpose:: ++* History:: ++ ++Definitions ++ ++* Notational Conventions:: ++* Error Terminology:: ++* Sections Not Formally Part Of This Standard:: ++* Interpreting Dictionary Entries:: ++ ++Notational Conventions ++ ++* Font Key:: ++* Modified BNF Syntax:: ++* Splicing in Modified BNF Syntax:: ++* Indirection in Modified BNF Syntax:: ++* Additional Uses for Indirect Definitions in Modified BNF Syntax:: ++* Special Symbols:: ++* Objects with Multiple Notations:: ++* Case in Symbols:: ++* Numbers (Objects with Multiple Notations):: ++* Use of the Dot Character:: ++* NIL:: ++* Designators:: ++* Nonsense Words:: ++ ++Interpreting Dictionary Entries ++ ++* The "Affected By" Section of a Dictionary Entry:: ++* The "Arguments" Section of a Dictionary Entry:: ++* The "Arguments and Values" Section of a Dictionary Entry:: ++* The "Binding Types Affected" Section of a Dictionary Entry:: ++* The "Class Precedence List" Section of a Dictionary Entry:: ++* Dictionary Entries for Type Specifiers:: ++* The "Compound Type Specifier Kind" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Syntax" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Arguments" Section of a Dictionary Entry:: ++* The "Compound Type Specifier Description" Section of a Dictionary Entry:: ++* The "Constant Value" Section of a Dictionary Entry:: ++* The "Description" Section of a Dictionary Entry:: ++* The "Examples" Section of a Dictionary Entry:: ++* The "Exceptional Situations" Section of a Dictionary Entry:: ++* The "Initial Value" Section of a Dictionary Entry:: ++* The "Argument Precedence Order" Section of a Dictionary Entry:: ++* The "Method Signature" Section of a Dictionary Entry:: ++* The "Name" Section of a Dictionary Entry:: ++* The "Notes" Section of a Dictionary Entry:: ++* The "Pronunciation" Section of a Dictionary Entry:: ++* The "See Also" Section of a Dictionary Entry:: ++* The "Side Effects" Section of a Dictionary Entry:: ++* The "Supertypes" Section of a Dictionary Entry:: ++* The "Syntax" Section of a Dictionary Entry:: ++* Special "Syntax" Notations for Overloaded Operators:: ++* Naming Conventions for Rest Parameters:: ++* Requiring Non-Null Rest Parameters in The "Syntax" Section:: ++* Return values in The "Syntax" Section:: ++* No Arguments or Values in The "Syntax" Section:: ++* Unconditional Transfer of Control in The "Syntax" Section:: ++* The "Valid Context" Section of a Dictionary Entry:: ++* The "Value Type" Section of a Dictionary Entry:: ++ ++Conformance ++ ++* Conforming Implementations:: ++* Conforming Programs:: ++ ++Conforming Implementations ++ ++* Required Language Features:: ++* Documentation of Implementation-Dependent Features:: ++* Documentation of Extensions:: ++* Treatment of Exceptional Situations:: ++* Resolution of Apparent Conflicts in Exceptional Situations:: ++* Examples of Resolution of Apparent Conflict in Exceptional Situations:: ++* Conformance Statement:: ++ ++Conforming Programs ++ ++* Use of Implementation-Defined Language Features:: ++* Use of Read-Time Conditionals:: ++ ++Deprecated Language Features ++ ++* Deprecated Functions:: ++* Deprecated Argument Conventions:: ++* Deprecated Variables:: ++* Deprecated Reader Syntax:: ++ ++Syntax ++ ++* Character Syntax:: ++* Reader Algorithm:: ++* Interpretation of Tokens:: ++* Standard Macro Characters:: ++ ++Character Syntax ++ ++* Readtables:: ++* Variables that affect the Lisp Reader:: ++* Standard Characters:: ++* Character Syntax Types:: ++ ++Readtables ++ ++* The Current Readtable:: ++* The Standard Readtable:: ++* The Initial Readtable:: ++ ++Character Syntax Types ++ ++* Constituent Characters:: ++* Constituent Traits:: ++* Invalid Characters:: ++* Macro Characters:: ++* Multiple Escape Characters:: ++* Examples of Multiple Escape Characters:: ++* Single Escape Character:: ++* Examples of Single Escape Characters:: ++* Whitespace Characters:: ++* Examples of Whitespace Characters:: ++ ++Interpretation of Tokens ++ ++* Numbers as Tokens:: ++* Constructing Numbers from Tokens:: ++* The Consing Dot:: ++* Symbols as Tokens:: ++* Valid Patterns for Tokens:: ++* Package System Consistency Rules:: ++ ++Numbers as Tokens ++ ++* Potential Numbers as Tokens:: ++* Escape Characters and Potential Numbers:: ++* Examples of Potential Numbers:: ++ ++Constructing Numbers from Tokens ++ ++* Syntax of a Rational:: ++* Syntax of an Integer:: ++* Syntax of a Ratio:: ++* Syntax of a Float:: ++* Syntax of a Complex:: ++ ++Standard Macro Characters ++ ++* Left-Parenthesis:: ++* Right-Parenthesis:: ++* Single-Quote:: ++* Semicolon:: ++* Double-Quote:: ++* Backquote:: ++* Comma:: ++* Sharpsign:: ++* Re-Reading Abbreviated Expressions:: ++ ++Single-Quote ++ ++* Examples of Single-Quote:: ++ ++Semicolon ++ ++* Examples of Semicolon:: ++* Notes about Style for Semicolon:: ++* Use of Single Semicolon:: ++* Use of Double Semicolon:: ++* Use of Triple Semicolon:: ++* Use of Quadruple Semicolon:: ++* Examples of Style for Semicolon:: ++ ++Backquote ++ ++* Notes about Backquote:: ++ ++Sharpsign ++ ++* Sharpsign Backslash:: ++* Sharpsign Single-Quote:: ++* Sharpsign Left-Parenthesis:: ++* Sharpsign Asterisk:: ++* Examples of Sharpsign Asterisk:: ++* Sharpsign Colon:: ++* Sharpsign Dot:: ++* Sharpsign B:: ++* Sharpsign O:: ++* Sharpsign X:: ++* Sharpsign R:: ++* Sharpsign C:: ++* Sharpsign A:: ++* Sharpsign S:: ++* Sharpsign P:: ++* Sharpsign Equal-Sign:: ++* Sharpsign Sharpsign:: ++* Sharpsign Plus:: ++* Sharpsign Minus:: ++* Sharpsign Vertical-Bar:: ++* Examples of Sharpsign Vertical-Bar:: ++* Notes about Style for Sharpsign Vertical-Bar:: ++* Sharpsign Less-Than-Sign:: ++* Sharpsign Whitespace:: ++* Sharpsign Right-Parenthesis:: ++ ++Evaluation and Compilation ++ ++* Evaluation:: ++* Compilation:: ++* Declarations:: ++* Lambda Lists:: ++* Error Checking in Function Calls:: ++* Traversal Rules and Side Effects:: ++* Destructive Operations:: ++* Evaluation and Compilation Dictionary:: ++ ++Evaluation ++ ++* Introduction to Environments:: ++* The Evaluation Model:: ++* Lambda Expressions:: ++* Closures and Lexical Binding:: ++* Shadowing:: ++* Extent:: ++* Return Values:: ++ ++Introduction to Environments ++ ++* The Global Environment:: ++* Dynamic Environments:: ++* Lexical Environments:: ++* The Null Lexical Environment:: ++* Environment Objects:: ++ ++The Evaluation Model ++ ++* Form Evaluation:: ++* Symbols as Forms:: ++* Lexical Variables:: ++* Dynamic Variables:: ++* Constant Variables:: ++* Symbols Naming Both Lexical and Dynamic Variables:: ++* Conses as Forms:: ++* Special Forms:: ++* Macro Forms:: ++* Function Forms:: ++* Lambda Forms:: ++* Self-Evaluating Objects:: ++* Examples of Self-Evaluating Objects:: ++ ++Compilation ++ ++* Compiler Terminology:: ++* Compilation Semantics:: ++* File Compilation:: ++* Literal Objects in Compiled Files:: ++* Exceptional Situations in the Compiler:: ++ ++Compilation Semantics ++ ++* Compiler Macros:: ++* Purpose of Compiler Macros:: ++* Naming of Compiler Macros:: ++* When Compiler Macros Are Used:: ++* Notes about the Implementation of Compiler Macros:: ++* Minimal Compilation:: ++* Semantic Constraints:: ++ ++File Compilation ++ ++* Processing of Top Level Forms:: ++* Processing of Defining Macros:: ++* Constraints on Macros and Compiler Macros:: ++ ++Literal Objects in Compiled Files ++ ++* Externalizable Objects:: ++* Similarity of Literal Objects:: ++* Similarity of Aggregate Objects:: ++* Definition of Similarity:: ++* Extensions to Similarity Rules:: ++* Additional Constraints on Externalizable Objects:: ++ ++Declarations ++ ++* Minimal Declaration Processing Requirements:: ++* Declaration Specifiers:: ++* Declaration Identifiers:: ++* Declaration Scope:: ++ ++Declaration Identifiers ++ ++* Shorthand notation for Type Declarations:: ++ ++Declaration Scope ++ ++* Examples of Declaration Scope:: ++ ++Lambda Lists ++ ++* Ordinary Lambda Lists:: ++* Generic Function Lambda Lists:: ++* Specialized Lambda Lists:: ++* Macro Lambda Lists:: ++* Destructuring Lambda Lists:: ++* Boa Lambda Lists:: ++* Defsetf Lambda Lists:: ++* Deftype Lambda Lists:: ++* Define-modify-macro Lambda Lists:: ++* Define-method-combination Arguments Lambda Lists:: ++* Syntactic Interaction of Documentation Strings and Declarations:: ++ ++Ordinary Lambda Lists ++ ++* Specifiers for the required parameters:: ++* Specifiers for optional parameters:: ++* A specifier for a rest parameter:: ++* Specifiers for keyword parameters:: ++* Suppressing Keyword Argument Checking:: ++* Examples of Suppressing Keyword Argument Checking:: ++* Specifiers for @b{&aux} variables:: ++* Examples of Ordinary Lambda Lists:: ++ ++Macro Lambda Lists ++ ++* Destructuring by Lambda Lists:: ++* Data-directed Destructuring by Lambda Lists:: ++* Examples of Data-directed Destructuring by Lambda Lists:: ++* Lambda-list-directed Destructuring by Lambda Lists:: ++ ++Error Checking in Function Calls ++ ++* Argument Mismatch Detection:: ++ ++Argument Mismatch Detection ++ ++* Safe and Unsafe Calls:: ++* Error Detection Time in Safe Calls:: ++* Too Few Arguments:: ++* Too Many Arguments:: ++* Unrecognized Keyword Arguments:: ++* Invalid Keyword Arguments:: ++* Odd Number of Keyword Arguments:: ++* Destructuring Mismatch:: ++* Errors When Calling a Next Method:: ++ ++Destructive Operations ++ ++* Modification of Literal Objects:: ++* Transfer of Control during a Destructive Operation:: ++ ++Transfer of Control during a Destructive Operation ++ ++* Examples of Transfer of Control during a Destructive Operation:: ++ ++Evaluation and Compilation Dictionary ++ ++* lambda (Symbol):: ++* lambda:: ++* compile:: ++* eval:: ++* eval-when:: ++* load-time-value:: ++* quote:: ++* compiler-macro-function:: ++* define-compiler-macro:: ++* defmacro:: ++* macro-function:: ++* macroexpand:: ++* define-symbol-macro:: ++* symbol-macrolet:: ++* *macroexpand-hook*:: ++* proclaim:: ++* declaim:: ++* declare:: ++* ignore:: ++* dynamic-extent:: ++* type:: ++* inline:: ++* ftype:: ++* declaration:: ++* optimize:: ++* special:: ++* locally:: ++* the:: ++* special-operator-p:: ++* constantp:: ++ ++Types and Classes ++ ++* Introduction (Types and Classes):: ++* Types:: ++* Classes:: ++* Types and Classes Dictionary:: ++ ++Types ++ ++* Data Type Definition:: ++* Type Relationships:: ++* Type Specifiers:: ++ ++Classes ++ ++* Introduction to Classes:: ++* Defining Classes:: ++* Creating Instances of Classes:: ++* Inheritance:: ++* Determining the Class Precedence List:: ++* Redefining Classes:: ++* Integrating Types and Classes:: ++ ++Introduction to Classes ++ ++* Standard Metaclasses:: ++ ++Inheritance ++ ++* Examples of Inheritance:: ++* Inheritance of Class Options:: ++ ++Determining the Class Precedence List ++ ++* Topological Sorting:: ++* Examples of Class Precedence List Determination:: ++ ++Redefining Classes ++ ++* Modifying the Structure of Instances:: ++* Initializing Newly Added Local Slots (Redefining Classes):: ++* Customizing Class Redefinition:: ++ ++Types and Classes Dictionary ++ ++* nil (Type):: ++* boolean:: ++* function (System Class):: ++* compiled-function:: ++* generic-function:: ++* standard-generic-function:: ++* class:: ++* built-in-class:: ++* structure-class:: ++* standard-class:: ++* method:: ++* standard-method:: ++* structure-object:: ++* standard-object:: ++* method-combination:: ++* t (System Class):: ++* satisfies:: ++* member (Type Specifier):: ++* not (Type Specifier):: ++* and (Type Specifier):: ++* or (Type Specifier):: ++* values (Type Specifier):: ++* eql (Type Specifier):: ++* coerce:: ++* deftype:: ++* subtypep:: ++* type-of:: ++* typep:: ++* type-error:: ++* type-error-datum:: ++* simple-type-error:: ++ ++Data and Control Flow ++ ++* Generalized Reference:: ++* Transfer of Control to an Exit Point:: ++* Data and Control Flow Dictionary:: ++ ++Generalized Reference ++ ++* Overview of Places and Generalized Reference:: ++* Kinds of Places:: ++* Treatment of Other Macros Based on SETF:: ++ ++Overview of Places and Generalized Reference ++ ++* Evaluation of Subforms to Places:: ++* Examples of Evaluation of Subforms to Places:: ++* Setf Expansions:: ++* Examples of Setf Expansions:: ++ ++Kinds of Places ++ ++* Variable Names as Places:: ++* Function Call Forms as Places:: ++* VALUES Forms as Places:: ++* THE Forms as Places:: ++* APPLY Forms as Places:: ++* Setf Expansions and Places:: ++* Macro Forms as Places:: ++* Symbol Macros as Places:: ++* Other Compound Forms as Places:: ++ ++Data and Control Flow Dictionary ++ ++* apply:: ++* defun:: ++* fdefinition:: ++* fboundp:: ++* fmakunbound:: ++* flet:: ++* funcall:: ++* function (Special Operator):: ++* function-lambda-expression:: ++* functionp:: ++* compiled-function-p:: ++* call-arguments-limit:: ++* lambda-list-keywords:: ++* lambda-parameters-limit:: ++* defconstant:: ++* defparameter:: ++* destructuring-bind:: ++* let:: ++* progv:: ++* setq:: ++* psetq:: ++* block:: ++* catch:: ++* go:: ++* return-from:: ++* return:: ++* tagbody:: ++* throw:: ++* unwind-protect:: ++* nil:: ++* not:: ++* t:: ++* eq:: ++* eql:: ++* equal:: ++* equalp:: ++* identity:: ++* complement:: ++* constantly:: ++* every:: ++* and:: ++* cond:: ++* if:: ++* or:: ++* when:: ++* case:: ++* typecase:: ++* multiple-value-bind:: ++* multiple-value-call:: ++* multiple-value-list:: ++* multiple-value-prog1:: ++* multiple-value-setq:: ++* values:: ++* values-list:: ++* multiple-values-limit:: ++* nth-value:: ++* prog:: ++* prog1:: ++* progn:: ++* define-modify-macro:: ++* defsetf:: ++* define-setf-expander:: ++* get-setf-expansion:: ++* setf:: ++* shiftf:: ++* rotatef:: ++* control-error:: ++* program-error:: ++* undefined-function:: ++ ++Iteration ++ ++* The LOOP Facility:: ++* Iteration Dictionary:: ++ ++The LOOP Facility ++ ++* Overview of the Loop Facility:: ++* Variable Initialization and Stepping Clauses:: ++* Value Accumulation Clauses:: ++* Termination Test Clauses:: ++* Unconditional Execution Clauses:: ++* Conditional Execution Clauses:: ++* Miscellaneous Clauses:: ++* Examples of Miscellaneous Loop Features:: ++* Notes about Loop:: ++ ++Overview of the Loop Facility ++ ++* Simple vs Extended Loop:: ++* Simple Loop:: ++* Extended Loop:: ++* Loop Keywords:: ++* Parsing Loop Clauses:: ++* Expanding Loop Forms:: ++* Summary of Loop Clauses:: ++* Summary of Variable Initialization and Stepping Clauses:: ++* Summary of Value Accumulation Clauses:: ++* Summary of Termination Test Clauses:: ++* Summary of Unconditional Execution Clauses:: ++* Summary of Conditional Execution Clauses:: ++* Summary of Miscellaneous Clauses:: ++* Order of Execution:: ++* Destructuring:: ++* Restrictions on Side-Effects:: ++ ++Variable Initialization and Stepping Clauses ++ ++* Iteration Control:: ++* The for-as-arithmetic subclause:: ++* Examples of for-as-arithmetic subclause:: ++* The for-as-in-list subclause:: ++* Examples of for-as-in-list subclause:: ++* The for-as-on-list subclause:: ++* Examples of for-as-on-list subclause:: ++* The for-as-equals-then subclause:: ++* Examples of for-as-equals-then subclause:: ++* The for-as-across subclause:: ++* Examples of for-as-across subclause:: ++* The for-as-hash subclause:: ++* The for-as-package subclause:: ++* Examples of for-as-package subclause:: ++* Local Variable Initializations:: ++* Examples of WITH clause:: ++ ++Value Accumulation Clauses ++ ++* Examples of COLLECT clause:: ++* Examples of APPEND and NCONC clauses:: ++* Examples of COUNT clause:: ++* Examples of MAXIMIZE and MINIMIZE clauses:: ++* Examples of SUM clause:: ++ ++Termination Test Clauses ++ ++* Examples of REPEAT clause:: ++* Examples of ALWAYS:: ++* Examples of WHILE and UNTIL clauses:: ++ ++Unconditional Execution Clauses ++ ++* Examples of unconditional execution:: ++ ++Conditional Execution Clauses ++ ++* Examples of WHEN clause:: ++ ++Miscellaneous Clauses ++ ++* Control Transfer Clauses:: ++* Examples of NAMED clause:: ++* Initial and Final Execution:: ++ ++Examples of Miscellaneous Loop Features ++ ++* Examples of clause grouping:: ++ ++Iteration Dictionary ++ ++* do:: ++* dotimes:: ++* dolist:: ++* loop:: ++* loop-finish:: ++ ++Objects ++ ++* Object Creation and Initialization:: ++* Changing the Class of an Instance:: ++* Reinitializing an Instance:: ++* Meta-Objects:: ++* Slots:: ++* Generic Functions and Methods:: ++* Objects Dictionary:: ++ ++Object Creation and Initialization ++ ++* Initialization Arguments:: ++* Declaring the Validity of Initialization Arguments:: ++* Defaulting of Initialization Arguments:: ++* Rules for Initialization Arguments:: ++* Shared-Initialize:: ++* Initialize-Instance:: ++* Definitions of Make-Instance and Initialize-Instance:: ++ ++Changing the Class of an Instance ++ ++* Modifying the Structure of the Instance:: ++* Initializing Newly Added Local Slots (Changing the Class of an Instance):: ++* Customizing the Change of Class of an Instance:: ++ ++Reinitializing an Instance ++ ++* Customizing Reinitialization:: ++ ++Meta-Objects ++ ++* Standard Meta-objects:: ++ ++Slots ++ ++* Introduction to Slots:: ++* Accessing Slots:: ++* Inheritance of Slots and Slot Options:: ++ ++Generic Functions and Methods ++ ++* Introduction to Generic Functions:: ++* Introduction to Methods:: ++* Agreement on Parameter Specializers and Qualifiers:: ++* Congruent Lambda-lists for all Methods of a Generic Function:: ++* Keyword Arguments in Generic Functions and Methods:: ++* Method Selection and Combination:: ++* Inheritance of Methods:: ++ ++Keyword Arguments in Generic Functions and Methods ++ ++* Examples of Keyword Arguments in Generic Functions and Methods:: ++ ++Method Selection and Combination ++ ++* Determining the Effective Method:: ++* Selecting the Applicable Methods:: ++* Sorting the Applicable Methods by Precedence Order:: ++* Applying method combination to the sorted list of applicable methods:: ++* Standard Method Combination:: ++* Declarative Method Combination:: ++* Built-in Method Combination Types:: ++ ++Objects Dictionary ++ ++* function-keywords:: ++* ensure-generic-function:: ++* allocate-instance:: ++* reinitialize-instance:: ++* shared-initialize:: ++* update-instance-for-different-class:: ++* update-instance-for-redefined-class:: ++* change-class:: ++* slot-boundp:: ++* slot-exists-p:: ++* slot-makunbound:: ++* slot-missing:: ++* slot-unbound:: ++* slot-value:: ++* method-qualifiers:: ++* no-applicable-method:: ++* no-next-method:: ++* remove-method:: ++* make-instance:: ++* make-instances-obsolete:: ++* make-load-form:: ++* make-load-form-saving-slots:: ++* with-accessors:: ++* with-slots:: ++* defclass:: ++* defgeneric:: ++* defmethod:: ++* find-class:: ++* next-method-p:: ++* call-method:: ++* call-next-method:: ++* compute-applicable-methods:: ++* define-method-combination:: ++* find-method:: ++* add-method:: ++* initialize-instance:: ++* class-name:: ++* (setf class-name):: ++* class-of:: ++* unbound-slot:: ++* unbound-slot-instance:: ++ ++Structures ++ ++* Structures Dictionary:: ++ ++Structures Dictionary ++ ++* defstruct:: ++* copy-structure:: ++ ++Conditions ++ ++* Condition System Concepts:: ++* Conditions Dictionary:: ++ ++Condition System Concepts ++ ++* Condition Types:: ++* Creating Conditions:: ++* Printing Conditions:: ++* Signaling and Handling Conditions:: ++* Assertions:: ++* Notes about the Condition System`s Background:: ++ ++Condition Types ++ ++* Serious Conditions:: ++ ++Creating Conditions ++ ++* Condition Designators:: ++ ++Printing Conditions ++ ++* Recommended Style in Condition Reporting:: ++* Capitalization and Punctuation in Condition Reports:: ++* Leading and Trailing Newlines in Condition Reports:: ++* Embedded Newlines in Condition Reports:: ++* Note about Tabs in Condition Reports:: ++* Mentioning Containing Function in Condition Reports:: ++ ++Signaling and Handling Conditions ++ ++* Signaling:: ++* Resignaling a Condition:: ++* Restarts:: ++* Interactive Use of Restarts:: ++* Interfaces to Restarts:: ++* Restart Tests:: ++* Associating a Restart with a Condition:: ++ ++Conditions Dictionary ++ ++* condition:: ++* warning:: ++* style-warning:: ++* serious-condition:: ++* error (Condition Type):: ++* cell-error:: ++* cell-error-name:: ++* parse-error:: ++* storage-condition:: ++* assert:: ++* error:: ++* cerror:: ++* check-type:: ++* simple-error:: ++* invalid-method-error:: ++* method-combination-error:: ++* signal:: ++* simple-condition:: ++* simple-condition-format-control:: ++* warn:: ++* simple-warning:: ++* invoke-debugger:: ++* break:: ++* *debugger-hook*:: ++* *break-on-signals*:: ++* handler-bind:: ++* handler-case:: ++* ignore-errors:: ++* define-condition:: ++* make-condition:: ++* restart:: ++* compute-restarts:: ++* find-restart:: ++* invoke-restart:: ++* invoke-restart-interactively:: ++* restart-bind:: ++* restart-case:: ++* restart-name:: ++* with-condition-restarts:: ++* with-simple-restart:: ++* abort (Restart):: ++* continue:: ++* muffle-warning:: ++* store-value:: ++* use-value:: ++* abort (Function):: ++ ++Symbols ++ ++* Symbol Concepts:: ++* Symbols Dictionary:: ++ ++Symbols Dictionary ++ ++* symbol:: ++* keyword:: ++* symbolp:: ++* keywordp:: ++* make-symbol:: ++* copy-symbol:: ++* gensym:: ++* *gensym-counter*:: ++* gentemp:: ++* symbol-function:: ++* symbol-name:: ++* symbol-package:: ++* symbol-plist:: ++* symbol-value:: ++* get:: ++* remprop:: ++* boundp:: ++* makunbound:: ++* set:: ++* unbound-variable:: ++ ++Packages ++ ++* Package Concepts:: ++* Packages Dictionary:: ++ ++Package Concepts ++ ++* Introduction to Packages:: ++* Standardized Packages:: ++ ++Introduction to Packages ++ ++* Package Names and Nicknames:: ++* Symbols in a Package:: ++* Internal and External Symbols:: ++* Package Inheritance:: ++* Accessibility of Symbols in a Package:: ++* Locating a Symbol in a Package:: ++* Prevention of Name Conflicts in Packages:: ++ ++Standardized Packages ++ ++* The COMMON-LISP Package:: ++* Constraints on the COMMON-LISP Package for Conforming Implementations:: ++* Constraints on the COMMON-LISP Package for Conforming Programs:: ++* Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs:: ++* The COMMON-LISP-USER Package:: ++* The KEYWORD Package:: ++* Interning a Symbol in the KEYWORD Package:: ++* Notes about The KEYWORD Package:: ++* Implementation-Defined Packages:: ++ ++Packages Dictionary ++ ++* package:: ++* export:: ++* find-symbol:: ++* find-package:: ++* find-all-symbols:: ++* import:: ++* list-all-packages:: ++* rename-package:: ++* shadow:: ++* shadowing-import:: ++* delete-package:: ++* make-package:: ++* with-package-iterator:: ++* unexport:: ++* unintern:: ++* in-package:: ++* unuse-package:: ++* use-package:: ++* defpackage:: ++* do-symbols:: ++* intern:: ++* package-name:: ++* package-nicknames:: ++* package-shadowing-symbols:: ++* package-use-list:: ++* package-used-by-list:: ++* packagep:: ++* *package*:: ++* package-error:: ++* package-error-package:: ++ ++Numbers ++ ++* Number Concepts:: ++* Numbers Dictionary:: ++ ++Number Concepts ++ ++* Numeric Operations:: ++* Implementation-Dependent Numeric Constants:: ++* Rational Computations:: ++* Floating-point Computations:: ++* Complex Computations:: ++* Interval Designators:: ++* Random-State Operations:: ++ ++Numeric Operations ++ ++* Associativity and Commutativity in Numeric Operations:: ++* Examples of Associativity and Commutativity in Numeric Operations:: ++* Contagion in Numeric Operations:: ++* Viewing Integers as Bits and Bytes:: ++* Logical Operations on Integers:: ++* Byte Operations on Integers:: ++ ++Rational Computations ++ ++* Rule of Unbounded Rational Precision:: ++* Rule of Canonical Representation for Rationals:: ++* Rule of Float Substitutability:: ++ ++Floating-point Computations ++ ++* Rule of Float and Rational Contagion:: ++* Examples of Rule of Float and Rational Contagion:: ++* Rule of Float Approximation:: ++* Rule of Float Underflow and Overflow:: ++* Rule of Float Precision Contagion:: ++ ++Complex Computations ++ ++* Rule of Complex Substitutability:: ++* Rule of Complex Contagion:: ++* Rule of Canonical Representation for Complex Rationals:: ++* Examples of Rule of Canonical Representation for Complex Rationals:: ++* Principal Values and Branch Cuts:: ++ ++Numbers Dictionary ++ ++* number:: ++* complex (System Class):: ++* real:: ++* float (System Class):: ++* short-float:: ++* rational (System Class):: ++* ratio:: ++* integer:: ++* signed-byte:: ++* unsigned-byte:: ++* mod (System Class):: ++* bit (System Class):: ++* fixnum:: ++* bignum:: ++* =:: ++* max:: ++* minusp:: ++* zerop:: ++* floor:: ++* sin:: ++* asin:: ++* pi:: ++* sinh:: ++* *:: ++* +:: ++* -:: ++* /:: ++* 1+:: ++* abs:: ++* evenp:: ++* exp:: ++* gcd:: ++* incf:: ++* lcm:: ++* log:: ++* mod (Function):: ++* signum:: ++* sqrt:: ++* random-state:: ++* make-random-state:: ++* random:: ++* random-state-p:: ++* *random-state*:: ++* numberp:: ++* cis:: ++* complex:: ++* complexp:: ++* conjugate:: ++* phase:: ++* realpart:: ++* upgraded-complex-part-type:: ++* realp:: ++* numerator:: ++* rational (Function):: ++* rationalp:: ++* ash:: ++* integer-length:: ++* integerp:: ++* parse-integer:: ++* boole:: ++* boole-1:: ++* logand:: ++* logbitp:: ++* logcount:: ++* logtest:: ++* byte:: ++* deposit-field:: ++* dpb:: ++* ldb:: ++* ldb-test:: ++* mask-field:: ++* most-positive-fixnum:: ++* decode-float:: ++* float:: ++* floatp:: ++* most-positive-short-float:: ++* short-float-epsilon:: ++* arithmetic-error:: ++* arithmetic-error-operands:: ++* division-by-zero:: ++* floating-point-invalid-operation:: ++* floating-point-inexact:: ++* floating-point-overflow:: ++* floating-point-underflow:: ++ ++Characters ++ ++* Character Concepts:: ++* Characters Dictionary:: ++ ++Character Concepts ++ ++* Introduction to Characters:: ++* Introduction to Scripts and Repertoires:: ++* Character Attributes:: ++* Character Categories:: ++* Identity of Characters:: ++* Ordering of Characters:: ++* Character Names:: ++* Treatment of Newline during Input and Output:: ++* Character Encodings:: ++* Documentation of Implementation-Defined Scripts:: ++ ++Introduction to Scripts and Repertoires ++ ++* Character Scripts:: ++* Character Repertoires:: ++ ++Character Categories ++ ++* Graphic Characters:: ++* Alphabetic Characters:: ++* Characters With Case:: ++* Uppercase Characters:: ++* Lowercase Characters:: ++* Corresponding Characters in the Other Case:: ++* Case of Implementation-Defined Characters:: ++* Numeric Characters:: ++* Alphanumeric Characters:: ++* Digits in a Radix:: ++ ++Characters Dictionary ++ ++* character (System Class):: ++* base-char:: ++* standard-char:: ++* extended-char:: ++* char=:: ++* character:: ++* characterp:: ++* alpha-char-p:: ++* alphanumericp:: ++* digit-char:: ++* digit-char-p:: ++* graphic-char-p:: ++* standard-char-p:: ++* char-upcase:: ++* upper-case-p:: ++* char-code:: ++* char-int:: ++* code-char:: ++* char-code-limit:: ++* char-name:: ++* name-char:: ++ ++Conses ++ ++* Cons Concepts:: ++* Conses Dictionary:: ++ ++Cons Concepts ++ ++* Conses as Trees:: ++* Conses as Lists:: ++ ++Conses as Trees ++ ++* General Restrictions on Parameters that must be Trees:: ++ ++Conses as Lists ++ ++* Lists as Association Lists:: ++* Lists as Sets:: ++* General Restrictions on Parameters that must be Lists:: ++ ++Conses Dictionary ++ ++* list (System Class):: ++* null (System Class):: ++* cons (System Class):: ++* atom (Type):: ++* cons:: ++* consp:: ++* atom:: ++* rplaca:: ++* car:: ++* copy-tree:: ++* sublis:: ++* subst:: ++* tree-equal:: ++* copy-list:: ++* list (Function):: ++* list-length:: ++* listp:: ++* make-list:: ++* push:: ++* pop:: ++* first:: ++* nth:: ++* endp:: ++* null:: ++* nconc:: ++* append:: ++* revappend:: ++* butlast:: ++* last:: ++* ldiff:: ++* nthcdr:: ++* rest:: ++* member (Function):: ++* mapc:: ++* acons:: ++* assoc:: ++* copy-alist:: ++* pairlis:: ++* rassoc:: ++* get-properties:: ++* getf:: ++* remf:: ++* intersection:: ++* adjoin:: ++* pushnew:: ++* set-difference:: ++* set-exclusive-or:: ++* subsetp:: ++* union:: ++ ++Arrays ++ ++* Array Concepts:: ++* Arrays Dictionary:: ++ ++Array Concepts ++ ++* Array Elements:: ++* Specialized Arrays:: ++ ++Array Elements ++ ++* Array Indices:: ++* Array Dimensions:: ++* Implementation Limits on Individual Array Dimensions:: ++* Array Rank:: ++* Vectors:: ++* Fill Pointers:: ++* Multidimensional Arrays:: ++* Storage Layout for Multidimensional Arrays:: ++* Implementation Limits on Array Rank:: ++ ++Specialized Arrays ++ ++* Array Upgrading:: ++* Required Kinds of Specialized Arrays:: ++ ++Arrays Dictionary ++ ++* array:: ++* simple-array:: ++* vector (System Class):: ++* simple-vector:: ++* bit-vector:: ++* simple-bit-vector:: ++* make-array:: ++* adjust-array:: ++* adjustable-array-p:: ++* aref:: ++* array-dimension:: ++* array-dimensions:: ++* array-element-type:: ++* array-has-fill-pointer-p:: ++* array-displacement:: ++* array-in-bounds-p:: ++* array-rank:: ++* array-row-major-index:: ++* array-total-size:: ++* arrayp:: ++* fill-pointer:: ++* row-major-aref:: ++* upgraded-array-element-type:: ++* array-dimension-limit:: ++* array-rank-limit:: ++* array-total-size-limit:: ++* simple-vector-p:: ++* svref:: ++* vector:: ++* vector-pop:: ++* vector-push:: ++* vectorp:: ++* bit (Array):: ++* bit-and:: ++* bit-vector-p:: ++* simple-bit-vector-p:: ++ ++Strings ++ ++* String Concepts:: ++* Strings Dictionary:: ++ ++String Concepts ++ ++* Implications of Strings Being Arrays:: ++* Subtypes of STRING:: ++ ++Strings Dictionary ++ ++* string (System Class):: ++* base-string:: ++* simple-string:: ++* simple-base-string:: ++* simple-string-p:: ++* char:: ++* string:: ++* string-upcase:: ++* string-trim:: ++* string=:: ++* stringp:: ++* make-string:: ++ ++Sequences ++ ++* Sequence Concepts:: ++* Rules about Test Functions:: ++* Sequences Dictionary:: ++ ++Sequence Concepts ++ ++* General Restrictions on Parameters that must be Sequences:: ++ ++Rules about Test Functions ++ ++* Satisfying a Two-Argument Test:: ++* Satisfying a One-Argument Test:: ++ ++Satisfying a Two-Argument Test ++ ++* Examples of Satisfying a Two-Argument Test:: ++ ++Satisfying a One-Argument Test ++ ++* Examples of Satisfying a One-Argument Test:: ++ ++Sequences Dictionary ++ ++* sequence:: ++* copy-seq:: ++* elt:: ++* fill:: ++* make-sequence:: ++* subseq:: ++* map:: ++* map-into:: ++* reduce:: ++* count:: ++* length:: ++* reverse:: ++* sort:: ++* find:: ++* position:: ++* search:: ++* mismatch:: ++* replace:: ++* substitute:: ++* concatenate:: ++* merge:: ++* remove:: ++* remove-duplicates:: ++ ++Hash Tables ++ ++* Hash Table Concepts:: ++* Hash Tables Dictionary:: ++ ++Hash Table Concepts ++ ++* Hash-Table Operations:: ++* Modifying Hash Table Keys:: ++ ++Modifying Hash Table Keys ++ ++* Visible Modification of Objects with respect to EQ and EQL:: ++* Visible Modification of Objects with respect to EQUAL:: ++* Visible Modification of Conses with respect to EQUAL:: ++* Visible Modification of Bit Vectors and Strings with respect to EQUAL:: ++* Visible Modification of Objects with respect to EQUALP:: ++* Visible Modification of Structures with respect to EQUALP:: ++* Visible Modification of Arrays with respect to EQUALP:: ++* Visible Modification of Hash Tables with respect to EQUALP:: ++* Visible Modifications by Language Extensions:: ++ ++Hash Tables Dictionary ++ ++* hash-table:: ++* make-hash-table:: ++* hash-table-p:: ++* hash-table-count:: ++* hash-table-rehash-size:: ++* hash-table-rehash-threshold:: ++* hash-table-size:: ++* hash-table-test:: ++* gethash:: ++* remhash:: ++* maphash:: ++* with-hash-table-iterator:: ++* clrhash:: ++* sxhash:: ++ ++Filenames ++ ++* Overview of Filenames:: ++* Pathnames:: ++* Logical Pathnames:: ++* Filenames Dictionary:: ++ ++Overview of Filenames ++ ++* Namestrings as Filenames:: ++* Pathnames as Filenames:: ++* Parsing Namestrings Into Pathnames:: ++ ++Pathnames ++ ++* Pathname Components:: ++* Interpreting Pathname Component Values:: ++* Merging Pathnames:: ++ ++Pathname Components ++ ++* The Pathname Host Component:: ++* The Pathname Device Component:: ++* The Pathname Directory Component:: ++* The Pathname Name Component:: ++* The Pathname Type Component:: ++* The Pathname Version Component:: ++ ++Interpreting Pathname Component Values ++ ++* Strings in Component Values:: ++* Special Characters in Pathname Components:: ++* Case in Pathname Components:: ++* Local Case in Pathname Components:: ++* Common Case in Pathname Components:: ++* Special Pathname Component Values:: ++* NIL as a Component Value:: ++* ->WILD as a Component Value:: ++* ->UNSPECIFIC as a Component Value:: ++* Relation between component values NIL and ->UNSPECIFIC:: ++* Restrictions on Wildcard Pathnames:: ++* Restrictions on Examining Pathname Components:: ++* Restrictions on Examining a Pathname Host Component:: ++* Restrictions on Examining a Pathname Device Component:: ++* Restrictions on Examining a Pathname Directory Component:: ++* Directory Components in Non-Hierarchical File Systems:: ++* Restrictions on Examining a Pathname Name Component:: ++* Restrictions on Examining a Pathname Type Component:: ++* Restrictions on Examining a Pathname Version Component:: ++* Notes about the Pathname Version Component:: ++* Restrictions on Constructing Pathnames:: ++ ++Merging Pathnames ++ ++* Examples of Merging Pathnames:: ++ ++Logical Pathnames ++ ++* Syntax of Logical Pathname Namestrings:: ++* Logical Pathname Components:: ++ ++Syntax of Logical Pathname Namestrings ++ ++* Additional Information about Parsing Logical Pathname Namestrings:: ++* The Host part of a Logical Pathname Namestring:: ++* The Device part of a Logical Pathname Namestring:: ++* The Directory part of a Logical Pathname Namestring:: ++* The Type part of a Logical Pathname Namestring:: ++* The Version part of a Logical Pathname Namestring:: ++* Wildcard Words in a Logical Pathname Namestring:: ++* Lowercase Letters in a Logical Pathname Namestring:: ++* Other Syntax in a Logical Pathname Namestring:: ++ ++Logical Pathname Components ++ ++* Unspecific Components of a Logical Pathname:: ++* Null Strings as Components of a Logical Pathname:: ++ ++Filenames Dictionary ++ ++* pathname (System Class):: ++* logical-pathname (System Class):: ++* pathname:: ++* make-pathname:: ++* pathnamep:: ++* pathname-host:: ++* load-logical-pathname-translations:: ++* logical-pathname-translations:: ++* logical-pathname:: ++* *default-pathname-defaults*:: ++* namestring:: ++* parse-namestring:: ++* wild-pathname-p:: ++* pathname-match-p:: ++* translate-logical-pathname:: ++* translate-pathname:: ++* merge-pathnames:: ++ ++Files ++ ++* File System Concepts:: ++* Files Dictionary:: ++ ++File System Concepts ++ ++* Coercion of Streams to Pathnames:: ++* File Operations on Open and Closed Streams:: ++* Truenames:: ++ ++Truenames ++ ++* Examples of Truenames:: ++ ++Files Dictionary ++ ++* directory:: ++* probe-file:: ++* ensure-directories-exist:: ++* truename:: ++* file-author:: ++* file-write-date:: ++* rename-file:: ++* delete-file:: ++* file-error:: ++* file-error-pathname:: ++ ++Streams ++ ++* Stream Concepts:: ++* Streams Dictionary:: ++ ++Stream Concepts ++ ++* Introduction to Streams:: ++* Stream Variables:: ++* Stream Arguments to Standardized Functions:: ++* Restrictions on Composite Streams:: ++ ++Introduction to Streams ++ ++* Abstract Classifications of Streams (Introduction to Streams):: ++* Input:: ++* Open and Closed Streams:: ++* Interactive Streams:: ++* Abstract Classifications of Streams:: ++* File Streams:: ++* Other Subclasses of Stream:: ++ ++Streams Dictionary ++ ++* stream:: ++* broadcast-stream:: ++* concatenated-stream:: ++* echo-stream:: ++* file-stream:: ++* string-stream:: ++* synonym-stream:: ++* two-way-stream:: ++* input-stream-p:: ++* interactive-stream-p:: ++* open-stream-p:: ++* stream-element-type:: ++* streamp:: ++* read-byte:: ++* write-byte:: ++* peek-char:: ++* read-char:: ++* read-char-no-hang:: ++* terpri:: ++* unread-char:: ++* write-char:: ++* read-line:: ++* write-string:: ++* read-sequence:: ++* write-sequence:: ++* file-length:: ++* file-position:: ++* file-string-length:: ++* open:: ++* stream-external-format:: ++* with-open-file:: ++* close:: ++* with-open-stream:: ++* listen:: ++* clear-input:: ++* finish-output:: ++* y-or-n-p:: ++* make-synonym-stream:: ++* synonym-stream-symbol:: ++* broadcast-stream-streams:: ++* make-broadcast-stream:: ++* make-two-way-stream:: ++* two-way-stream-input-stream:: ++* echo-stream-input-stream:: ++* make-echo-stream:: ++* concatenated-stream-streams:: ++* make-concatenated-stream:: ++* get-output-stream-string:: ++* make-string-input-stream:: ++* make-string-output-stream:: ++* with-input-from-string:: ++* with-output-to-string:: ++* *debug-io*:: ++* *terminal-io*:: ++* stream-error:: ++* stream-error-stream:: ++* end-of-file:: ++ ++Printer ++ ++* The Lisp Printer:: ++* The Lisp Pretty Printer:: ++* Formatted Output:: ++* Printer Dictionary:: ++ ++The Lisp Printer ++ ++* Overview of The Lisp Printer:: ++* Printer Dispatching:: ++* Default Print-Object Methods:: ++* Examples of Printer Behavior:: ++ ++Overview of The Lisp Printer ++ ++* Multiple Possible Textual Representations:: ++* Printer Escaping:: ++ ++Default Print-Object Methods ++ ++* Printing Numbers:: ++* Printing Integers:: ++* Printing Ratios:: ++* Printing Floats:: ++* Printing Complexes:: ++* Note about Printing Numbers:: ++* Printing Characters:: ++* Printing Symbols:: ++* Package Prefixes for Symbols:: ++* Effect of Readtable Case on the Lisp Printer:: ++* Examples of Effect of Readtable Case on the Lisp Printer:: ++* Printing Strings:: ++* Printing Lists and Conses:: ++* Printing Bit Vectors:: ++* Printing Other Vectors:: ++* Printing Other Arrays:: ++* Examples of Printing Arrays:: ++* Printing Random States:: ++* Printing Pathnames:: ++* Printing Structures:: ++* Printing Other Objects:: ++ ++The Lisp Pretty Printer ++ ++* Pretty Printer Concepts:: ++* Examples of using the Pretty Printer:: ++* Notes about the Pretty Printer`s Background:: ++ ++Pretty Printer Concepts ++ ++* Dynamic Control of the Arrangement of Output:: ++* Format Directive Interface:: ++* Compiling Format Strings:: ++* Pretty Print Dispatch Tables:: ++* Pretty Printer Margins:: ++ ++Formatted Output ++ ++* FORMAT Basic Output:: ++* FORMAT Radix Control:: ++* FORMAT Floating-Point Printers:: ++* FORMAT Printer Operations:: ++* FORMAT Pretty Printer Operations:: ++* FORMAT Layout Control:: ++* FORMAT Control-Flow Operations:: ++* FORMAT Miscellaneous Operations:: ++* FORMAT Miscellaneous Pseudo-Operations:: ++* Additional Information about FORMAT Operations:: ++* Examples of FORMAT:: ++* Notes about FORMAT:: ++ ++FORMAT Basic Output ++ ++* Tilde C-> Character:: ++* Tilde Percent-> Newline:: ++* Tilde Ampersand-> Fresh-Line:: ++* Tilde Vertical-Bar-> Page:: ++* Tilde Tilde-> Tilde:: ++ ++FORMAT Radix Control ++ ++* Tilde R-> Radix:: ++* Tilde D-> Decimal:: ++* Tilde B-> Binary:: ++* Tilde O-> Octal:: ++* Tilde X-> Hexadecimal:: ++ ++FORMAT Floating-Point Printers ++ ++* Tilde F-> Fixed-Format Floating-Point:: ++* Tilde E-> Exponential Floating-Point:: ++* Tilde G-> General Floating-Point:: ++* Tilde Dollarsign-> Monetary Floating-Point:: ++ ++FORMAT Printer Operations ++ ++* Tilde A-> Aesthetic:: ++* Tilde S-> Standard:: ++* Tilde W-> Write:: ++ ++FORMAT Pretty Printer Operations ++ ++* Tilde Underscore-> Conditional Newline:: ++* Tilde Less-Than-Sign-> Logical Block:: ++* Tilde I-> Indent:: ++* Tilde Slash-> Call Function:: ++ ++FORMAT Layout Control ++ ++* Tilde T-> Tabulate:: ++* Tilde Less-Than-Sign-> Justification:: ++* Tilde Greater-Than-Sign-> End of Justification:: ++ ++FORMAT Control-Flow Operations ++ ++* Tilde Asterisk-> Go-To:: ++* Tilde Left-Bracket-> Conditional Expression:: ++* Tilde Right-Bracket-> End of Conditional Expression:: ++* Tilde Left-Brace-> Iteration:: ++* Tilde Right-Brace-> End of Iteration:: ++* Tilde Question-Mark-> Recursive Processing:: ++ ++FORMAT Miscellaneous Operations ++ ++* Tilde Left-Paren-> Case Conversion:: ++* Tilde Right-Paren-> End of Case Conversion:: ++* Tilde P-> Plural:: ++ ++FORMAT Miscellaneous Pseudo-Operations ++ ++* Tilde Semicolon-> Clause Separator:: ++* Tilde Circumflex-> Escape Upward:: ++* Tilde Newline-> Ignored Newline:: ++ ++Additional Information about FORMAT Operations ++ ++* Nesting of FORMAT Operations:: ++* Missing and Additional FORMAT Arguments:: ++* Additional FORMAT Parameters:: ++* Undefined FORMAT Modifier Combinations:: ++ ++Printer Dictionary ++ ++* copy-pprint-dispatch:: ++* formatter:: ++* pprint-dispatch:: ++* pprint-exit-if-list-exhausted:: ++* pprint-fill:: ++* pprint-indent:: ++* pprint-logical-block:: ++* pprint-newline:: ++* pprint-pop:: ++* pprint-tab:: ++* print-object:: ++* print-unreadable-object:: ++* set-pprint-dispatch:: ++* write:: ++* write-to-string:: ++* *print-array*:: ++* *print-base*:: ++* *print-case*:: ++* *print-circle*:: ++* *print-escape*:: ++* *print-gensym*:: ++* *print-level*:: ++* *print-lines*:: ++* *print-miser-width*:: ++* *print-pprint-dispatch*:: ++* *print-pretty*:: ++* *print-readably*:: ++* *print-right-margin*:: ++* print-not-readable:: ++* print-not-readable-object:: ++* format:: ++ ++Reader ++ ++* Reader Concepts:: ++* Reader Dictionary:: ++ ++Reader Concepts ++ ++* Dynamic Control of the Lisp Reader:: ++* Effect of Readtable Case on the Lisp Reader:: ++* Argument Conventions of Some Reader Functions:: ++ ++Effect of Readtable Case on the Lisp Reader ++ ++* Examples of Effect of Readtable Case on the Lisp Reader:: ++ ++Argument Conventions of Some Reader Functions ++ ++* The EOF-ERROR-P argument:: ++* The RECURSIVE-P argument:: ++ ++Reader Dictionary ++ ++* readtable:: ++* copy-readtable:: ++* make-dispatch-macro-character:: ++* read:: ++* read-delimited-list:: ++* read-from-string:: ++* readtable-case:: ++* readtablep:: ++* set-dispatch-macro-character:: ++* set-macro-character:: ++* set-syntax-from-char:: ++* with-standard-io-syntax:: ++* *read-base*:: ++* *read-default-float-format*:: ++* *read-eval*:: ++* *read-suppress*:: ++* *readtable*:: ++* reader-error:: ++ ++System Construction ++ ++* System Construction Concepts:: ++* System Construction Dictionary:: ++ ++System Construction Concepts ++ ++* Loading:: ++* Features:: ++ ++Features ++ ++* Feature Expressions:: ++* Examples of Feature Expressions:: ++ ++System Construction Dictionary ++ ++* compile-file:: ++* compile-file-pathname:: ++* load:: ++* with-compilation-unit:: ++* *features*:: ++* *compile-file-pathname*:: ++* *load-pathname*:: ++* *compile-print*:: ++* *load-print*:: ++* *modules*:: ++* provide:: ++ ++Environment ++ ++* The External Environment:: ++* Environment Dictionary:: ++ ++The External Environment ++ ++* Top level loop:: ++* Debugging Utilities:: ++* Environment Inquiry:: ++* Time:: ++ ++Time ++ ++* Decoded Time:: ++* Universal Time:: ++* Internal Time:: ++* Seconds:: ++ ++Environment Dictionary ++ ++* decode-universal-time:: ++* encode-universal-time:: ++* get-universal-time:: ++* sleep:: ++* apropos:: ++* describe:: ++* describe-object:: ++* trace:: ++* step:: ++* time:: ++* internal-time-units-per-second:: ++* get-internal-real-time:: ++* get-internal-run-time:: ++* disassemble:: ++* documentation:: ++* room:: ++* ed:: ++* inspect:: ++* dribble:: ++* -:: ++* +:: ++* *:: ++* /:: ++* lisp-implementation-type:: ++* short-site-name:: ++* machine-instance:: ++* machine-type:: ++* machine-version:: ++* software-type:: ++* user-homedir-pathname:: ++ ++Glossary ++ ++* Glossary:: ++ ++Appendix ++ ++* Removed Language Features:: ++ ++Removed Language Features ++ ++* Requirements for removed and deprecated features:: ++* Removed Types:: ++* Removed Operators:: ++* Removed Argument Conventions:: ++* Removed Variables:: ++* Removed Reader Syntax:: ++* Packages No Longer Required:: ++@end menu ++ ++@c includes ++@include chap-1.texi ++ ++@include chap-2.texi ++ ++@include chap-3.texi ++ ++@include chap-4.texi ++ ++@include chap-5.texi ++ ++@include chap-6.texi ++ ++@include chap-7.texi ++ ++@include chap-8.texi ++ ++@include chap-9.texi ++ ++@include chap-10.texi ++ ++@include chap-11.texi ++ ++@include chap-12.texi ++ ++@include chap-13.texi ++ ++@include chap-14.texi ++ ++@include chap-15.texi ++ ++@include chap-16.texi ++ ++@include chap-17.texi ++ ++@include chap-18.texi ++ ++@include chap-19.texi ++ ++@include chap-20.texi ++ ++@include chap-21.texi ++ ++@include chap-22.texi ++ ++@include chap-23.texi ++ ++@include chap-24.texi ++ ++@include chap-25.texi ++ ++@include chap-26.texi ++ ++@include chap-a.texi ++ ++@bye +--- /dev/null ++++ gcl-2.6.12/info/gcl/1_002b.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++1+ (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.28 1+, 1- [Function]

++ ++

1 +number ++ successor ++1 -number ++ predecessor ++

++

Arguments and Values::

++ ++

number—a number. ++

++

successor, predecessor—a number. ++

++

Description::

++ ++

1+ returns a number that is one more than its argument number. ++1- returns a number that is one less than its argument number. ++

++

Examples::

++ ++
++
 (1+ 99) ⇒  100 
++ (1- 100) ⇒  99 
++ (1+ (complex 0.0)) ⇒  #C(1.0 0.0) 
++ (1- 5/3) ⇒  2/3 
++
++ ++

Exceptional Situations::

++ ++

Might signal type-error if its argument is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

incf ++, decf ++

++

Notes::

++ ++
++
 (1+ number) ≡ (+ number 1)
++ (1- number) ≡ (- number 1)
++
++ ++

Implementors are encouraged to make the performance of both the previous ++expressions be the same. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/A-specifier-for-a-rest-parameter.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++A specifier for a rest parameter (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.3 A specifier for a rest parameter

++ ++ ++ ++

&rest, if present, must be followed by a single rest parameter ++specifier, which in turn must be followed by another ++lambda list keyword or the end of the lambda list. After all ++optional parameter specifiers have been processed, then there may or ++may not be a rest parameter. If there is a rest parameter, it is ++bound to a list of all as-yet-unprocessed arguments. If ++no unprocessed arguments remain, the rest parameter is bound to the ++empty list. If there is no rest parameter and there are no ++keyword parameters, then an error ++should be signaled if ++any unprocessed arguments remain; see Error Checking in Function Calls. ++The value of a rest parameter ++is permitted, but not required, to share structure with the ++last argument to apply. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/APPLY-Forms-as-Places.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++APPLY Forms as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.5 APPLY Forms as Places

++ ++

The following situations involving setf of apply must be supported: ++

++
++
*
++

(setf (apply #'aref array ++ {subscript}* ++ more-subscripts) ++ new-element) ++

++
*
++

(setf (apply #'bit array ++ {subscript}* ++ more-subscripts) ++ new-element) ++

++
*
++

(setf (apply #'sbit array ++ {subscript}* ++ more-subscripts) ++ new-element) ++

++
++ ++

In all three cases, the element of array designated ++by the concatenation of subscripts and more-subscripts ++(i.e., the same element which would be read by the call to ++ apply if it were not part of a setf form) ++is changed to have the value given by new-element. ++

++

For these usages, the function name (aref, bit, or sbit) ++must refer to the global function definition, rather than a locally defined ++function. ++

++

No other standardized function is required to be supported, ++but an implementation may define such support. ++An implementation may also define support ++for implementation-defined operators. ++

++

If a user-defined function is used in this context, ++the following equivalence is true, except that care is taken ++to preserve proper left-to-right evaluation of argument subforms: ++

++
++
 (setf (apply #'name {arg}*) val)
++ ≡ (apply #'(setf name) val {arg}*)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Abstract-Classifications-of-Streams-_0028Introduction-to-Streams_0029.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Abstract Classifications of Streams (Introduction to Streams) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Introduction to Streams  

++
++
++

21.1.1.1 Abstract Classifications of Streams

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Abstract-Classifications-of-Streams.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Abstract Classifications of Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Introduction to Streams  

++
++
++

21.1.1.5 Abstract Classifications of Streams

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Accessibility-of-Symbols-in-a-Package.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++Accessibility of Symbols in a Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.5 Accessibility of Symbols in a Package

++ ++

A symbol becomes accessible ++ ++ in a package ++ if that is its home package when it is created, ++ or if it is imported into that package, ++ or by inheritance via use-package. ++

++

If a symbol is accessible in a package, ++it can be referred to when using the Lisp reader ++without a package prefix when that package is the current package, ++regardless of whether it is present or inherited. ++

++

Symbols from one package can be made accessible ++in another package in two ways. ++

++
++
++

Any individual symbol can be added to a package by use ++of import. After the call to import the ++symbol is present in the importing package. ++The status of the symbol in the package ++it came from (if any) is unchanged, and the home package for ++this symbol is unchanged. ++Once imported, a symbol is present in the ++importing package ++and can be removed only by calling unintern. ++

++

A symbol is shadowed_3 by another symbol ++in some package if the first symbol would be accessible ++by inheritance if not for the presence of the second symbol. ++See shadowing-import. ++

++
++
++

The second mechanism for making symbols from one package ++accessible in another is provided by use-package. ++All of the external symbols of the used package are inherited ++by the using package. ++The function unuse-package undoes the effects of a previous use-package. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Accessing-Slots.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++Accessing Slots (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.5.2 Accessing Slots

++ ++

Slots can be accessed in two ways: by use of the primitive function ++slot-value and by use of generic functions generated by ++the defclass form. ++

++

The function slot-value can be used with any of the slot ++names specified in the defclass form to access a specific ++slot accessible in an instance of the given class. ++

++

The macro defclass provides syntax for generating methods to ++read and write slots. If a reader method is requested, ++a method is automatically generated for reading the value of the ++slot, but no method for storing a value into it is generated. ++If a writer method is requested, a method is automatically ++generated for storing a value into the slot, but no method ++for reading its value is generated. If an accessor method is ++requested, a method for reading the value of the slot and a ++method for storing a value into the slot are automatically ++generated. Reader and writer methods are implemented using ++slot-value. ++

++

When a reader or writer method is specified for a slot, the ++name of the generic function to which the generated method ++belongs is directly specified. If the name specified for the writer ++method is the symbol name, the name of the ++generic function for writing the slot is the symbol ++name, and the generic function takes two arguments: the new ++value and the instance, in that order. If the name specified ++for the accessor method is the symbol name, the name of ++the generic function for reading the slot is the symbol ++name, and the name of the generic function for writing ++the slot is the list (setf name). ++

++

A generic function created or modified by supplying :reader, ++:writer, or :accessor slot options can be treated exactly ++as an ordinary generic function. ++

++

Note that slot-value can be used to read or write the value of a ++slot whether or not reader or writer methods exist for that ++slot. When slot-value is used, no reader or writer ++methods are invoked. ++

++

The macro with-slots can be used to establish a ++lexical environment in which specified slots are lexically ++available as if they were variables. The macro with-slots ++invokes the function slot-value to access the specified slots. ++

++

The macro with-accessors can be used to establish a lexical ++environment in which specified slots are lexically available through ++their accessors as if they were variables. The macro with-accessors ++invokes the appropriate accessors to access the specified slots. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Additional-Constraints-on-Externalizable-Objects.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++Additional Constraints on Externalizable Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4.6 Additional Constraints on Externalizable Objects

++ ++

If two literal objects appearing in the source code for a single file ++processed with ++the file compiler ++are the identical, ++the corresponding objects in the compiled code ++must also be the identical. ++

++

With the exception of symbols and packages, any two ++literal objects ++in code being processed by ++the file compiler ++may be coalesced ++if and only if they are similar; ++if they are either both symbols or both packages, ++they may only be coalesced if and only if they are identical. ++

++

Objects containing circular references can ++be externalizable objects. ++The file compiler is required to preserve eqlness of ++substructures within a file. ++Preserving eqlness means that subobjects that are ++the same ++in the source code must ++be ++the same ++in the corresponding compiled code. ++

++

In addition, the following are constraints on the handling of ++literal objects by the file compiler: ++

++
++
++

array: If an array in the source code is a ++simple array, then the corresponding array ++in the compiled code will also be a simple array. If ++an array in the source code is displaced, has a ++fill pointer, or is actually adjustable, the corresponding ++array in the compiled code might lack any or all of these ++qualities. If an array in the source code has a fill ++pointer, then the corresponding array in the compiled ++code might be only the size implied by the fill pointer. ++

++
++
++

packages: The loader is required to find the ++corresponding package object as if by calling ++find-package with the package name as an argument. ++An error of type package-error is signaled if no ++package of that name exists at load time. ++

++
++
++

random-state: A constant random state ++object cannot be used as the state argument ++to the function random because random modifies this data structure. ++

++
++
++

structure, standard-object: ++Objects of type structure-object and standard-object ++may appear in compiled constants if there is an ++appropriate make-load-form method defined for that ++type. ++

++

The file compiler calls make-load-form on any object ++that is referenced as a literal object if the object is a ++generalized instance of standard-object, ++structure-object, condition, or any of a ++(possibly empty) implementation-dependent set of other classes. ++The file compiler only calls make-load-form once for ++any given object within a single file. ++

++
++
++

symbol: In order to guarantee that compiled files can be loaded ++ correctly, users must ensure that the packages referenced in those files ++ are defined consistently at compile time and load time. Conforming programs ++ must satisfy the following requirements: ++

++
++
1.
++

The current package when a top level form in the file ++ is processed by compile-file must be the same as the current package ++ when the code corresponding to that top level form in the ++ compiled file is executed by load. In particular: ++

++
++
a.
++

Any top level form in a file that alters ++ the current package must change it to a package ++ of the same name both at compile time and at load time. ++

++
++
b.
++

If the first non-atomic top level form in the file ++ is not an in-package form, then the current package ++ at the time load is called must be a package with the ++ same name as the package that was the current package ++ at the time compile-file was called. ++

++
++ ++
++
2.
++

For all symbols ++ appearing lexically within a top level form that ++ were accessible in the package that was the current package ++ during processing of that top level form at compile time, but ++ whose home package was another package, at load time there must ++ be a symbol with the same name that is accessible in both the ++ load-time current package and in the package ++ with the same name as the ++ compile-time home package. ++

++
++
3.
++

For all symbols represented in the compiled file ++ that were external symbols in ++ their home package at compile time, there must be a symbol with the ++ same name that is an external symbol in the package ++ with the same name at load time. ++

++
++ ++

If any of these conditions do not hold, the package in which the loader looks ++ for the affected symbols is unspecified. Implementations are permitted ++ to signal an error or to define this behavior. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Additional-FORMAT-Parameters.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Additional FORMAT Parameters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.10.3 Additional FORMAT Parameters

++ ++

The consequences are undefined if a format directive is given more parameters ++than it is described here as accepting. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Additional-Information-about-FORMAT-Operations.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Additional Information about FORMAT Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.10 Additional Information about FORMAT Operations

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Additional-Information-about-Parsing-Logical-Pathname-Namestrings.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Additional Information about Parsing Logical Pathname Namestrings (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.1 Additional Information about Parsing Logical Pathname Namestrings

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Additional-Uses-for-Indirect-Definitions-in-Modified-BNF-Syntax.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Additional Uses for Indirect Definitions in Modified BNF Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.5 Additional Uses for Indirect Definitions in Modified BNF Syntax

++ ++

In some cases, an auxiliary definition in the BNF might appear to be unused ++within the BNF, but might still be useful elsewhere. For example, consider the ++following definitions: ++

++

case keyform {!normal-clause}* [!otherwise-clause]{result}* ++

++

ccase keyplace {!normal-clause}*{result}* ++

++

ecase keyform {!normal-clause}*{result}* ++

++

normal-clause ::=(keys {form}*) ++

++

otherwise-clause ::=({otherwise | t} {form}*) ++

++

clause ::=normal-clause | otherwise-clause ++

++

Here the term “clause” might appear to be “dead” in that it ++is not used in the BNF. However, the purpose of the BNF is not just to guide parsing, ++but also to define useful terms for reference in the descriptive text which follows. ++As such, the term “clause” might appear in text that follows, ++as shorthand for “normal-clause or otherwise-clause.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Agreement-on-Parameter-Specializers-and-Qualifiers.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++Agreement on Parameter Specializers and Qualifiers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.3 Agreement on Parameter Specializers and Qualifiers

++ ++

Two methods are said to agree with each other on parameter specializers ++and qualifiers if the following conditions hold: ++

++
++
1.
++

Both methods have the same number of required parameters. ++Suppose the parameter specializers of the two methods are ++P_{1,1}... P_{1,n} and P_{2,1}... P_{2,n}. ++

++
++
2.
++

For each 1<= i<= n, P_{1,i} agrees with P_{2,i}. ++The parameter specializer P_{1,i} agrees with P_{2,i} if ++P_{1,i} and P_{2,i} are the same class or if ++P_{1,i}=(eql object_1), ++P_{2,i}=(eql object_2), and ++(eql object_1 object_2). ++Otherwise P_{1,i} and P_{2,i} do not agree. ++

++
++
3.
++

The two lists of qualifiers are the same ++under equal. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Alphabetic-Characters.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Alphabetic Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.2 Alphabetic Characters

++ ++

The alphabetic_1 characters are ++a subset of the graphic characters. ++Of the standard characters, only these are the alphabetic_1 characters: ++

++

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ++

++

a b c d e f g h i j k l m n o p q r s t u v w x y z ++

++

Any implementation-defined character that has case ++must be alphabetic_1. ++For each implementation-defined graphic character ++that has no case, ++it is implementation-defined whether ++that character is alphabetic_1. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Alphanumeric-Characters.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Alphanumeric Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.9 Alphanumeric Characters

++ ++

The set of alphanumeric characters is the union of ++ the set of alphabetic_1 characters ++and the set of numeric characters. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Appendix.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Appendix (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Top  

++
++
++

27 Appendix

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Applying-method-combination-to-the-sorted-list-of-applicable-methods.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++Applying method combination to the sorted list of applicable methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.4 Applying method combination to the sorted list of applicable methods

++ ++

In the simple case—if standard method combination is used and all ++applicable methods are primary methods—the ++effective method is the most specific method. ++That method can call the next most specific ++method by using the function call-next-method. The method that ++call-next-method will call is referred to as the ++next method ++ ++. The predicate next-method-p tests whether a next ++method exists. If call-next-method is called and there is no ++next most specific method, the generic function no-next-method ++is invoked. ++

++

In general, the effective method is some combination of the applicable ++methods. It is described by a form that contains calls to some or ++all of the applicable methods, returns the value or values that will ++be returned as the value or values of the generic function, and ++optionally makes some of the methods accessible by means of ++call-next-method. ++

++

The role of each method in the effective method is determined by its ++qualifiers and the specificity of the method. A qualifier ++serves to mark a method, and the meaning of a qualifier is ++determined by the way that these marks are used by this step ++of the procedure. If an applicable method has an unrecognized ++qualifier, this step signals an error and does not include that method ++in the effective method. ++

++

When standard method combination is used together with qualified methods, ++the effective method is produced as described in Standard Method Combination. ++

++

Another type of method combination can be specified by using the ++:method-combination option of defgeneric or ++of any of the other operators that specify generic function options. In ++this way this step of the procedure can be customized. ++

++

New types of method combination can be defined by using ++the define-method-combination macro. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Argument-Conventions-of-Some-Reader-Functions.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Argument Conventions of Some Reader Functions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.1.3 Argument Conventions of Some Reader Functions

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Argument-Mismatch-Detection.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Argument Mismatch Detection (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1 Argument Mismatch Detection

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Array-Concepts.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Array Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays  

++
++
++

15.1 Array Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Array-Dimensions.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Array Dimensions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.1.1.2 Array Dimensions

++ ++

An axis of an array is called a dimension ++ ++. ++

++

Each dimension is a non-negative ++

++

fixnum; ++

++

if any dimension of an array is zero, the array has no elements. ++It is permissible for a dimension to be zero, ++in which case the array has no elements, ++and any attempt to access an element ++is an error. However, other properties of the array, ++such as the dimensions themselves, may be used. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Array-Elements.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Array Elements (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Array Concepts  

++
++
++

15.1.1 Array Elements

++ ++

An array contains a set of objects called elements ++that can be referenced individually according to a rectilinear coordinate system. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Array-Indices.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Array Indices (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Array Elements  

++
++
++

15.1.1.1 Array Indices

++ ++

An array element is referred to by a (possibly empty) series of indices. ++The length of the series must equal the rank of the array. ++

++

Each index must be a non-negative fixnum ++

++

less than the corresponding array dimension. ++Array indexing is zero-origin. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Array-Rank.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Array Rank (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.1.1.4 Array Rank

++ ++

An array can have any number of dimensions (including zero). ++The number of dimensions is called the rank ++ ++. ++

++

If the rank of an array is zero then the array is said to have ++no dimensions, and the product of the dimensions (see array-total-size) ++is then 1; a zero-rank array therefore has a single element. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Array-Upgrading.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Array Upgrading (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.1.2.1 Array Upgrading

++ ++

The upgraded array element type ++ ++ of a type T_1 ++is a type T_2 that is a supertype of T_1 ++and that is used instead of T_1 whenever T_1 ++is used as an array element type ++for object creation or type discrimination. ++

++

During creation of an array, ++the element type that was requested ++is called the expressed array element type ++ ++. ++The upgraded array element type of the expressed array element type ++becomes the actual array element type ++ ++ of the array that is created. ++

++

Type upgrading implies a movement upwards in the type hierarchy lattice. ++A type is always a subtype of its upgraded array element type. ++Also, if a type T_x is a subtype of another type T_y, ++then ++the upgraded array element type of T_x ++must be a subtype of ++the upgraded array element type of T_y. ++Two disjoint types can be upgraded to the same type. ++

++

The upgraded array element type T_2 of a type T_1 ++is a function only of T_1 itself; ++that is, it is independent of any other property of the array ++for which T_2 will be used, ++such as rank, adjustability, fill pointers, or displacement. ++The function upgraded-array-element-type ++can be used by conforming programs to predict how the implementation ++will upgrade a given type. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Arrays-Dictionary.html +@@ -0,0 +1,132 @@ ++ ++ ++ ++ ++ ++Arrays Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Arrays  

++
++
++

15.2 Arrays Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Arrays  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Arrays.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

15 Arrays

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Assertions.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Assertions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.5 Assertions

++ ++

Conditional signaling of conditions ++based on such things as key match, form evaluation, ++and type are handled by assertion operators. ++Figure 9–7 shows operators relating to assertions. ++

++
++
  assert  check-type  ecase      
++  ccase   ctypecase   etypecase  
++
++  Figure 9–7: Operators relating to assertions.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Associating-a-Restart-with-a-Condition.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Associating a Restart with a Condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.4.7 Associating a Restart with a Condition

++ ++

A restart can be “associated with” a condition explicitly ++by with-condition-restarts, or implicitly by restart-case. ++Such an assocation has dynamic extent. ++

++

A single restart may be associated with several conditions ++at the same time. ++A single condition may have several associated restarts ++at the same time. ++

++

Active restarts associated with a particular condition can be detected ++by calling a function such as find-restart, supplying ++that condition as the condition argument. ++Active restarts can also be detected without regard to any associated ++condition by calling such a function without a condition argument, ++or by supplying a value of nil for such an argument. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Associativity-and-Commutativity-in-Numeric-Operations.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Associativity and Commutativity in Numeric Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1.1 Associativity and Commutativity in Numeric Operations

++ ++

For functions that are mathematically associative (and possibly commutative), ++a conforming implementation may process the arguments in any manner ++consistent with associative (and possibly commutative) rearrangement. This does not ++affect the order in which the argument forms are evaluated; ++for a discussion of evaluation order, see Function Forms. ++What is unspecified is only the order in which the parameter values ++are processed. This implies that implementations may differ in which ++automatic coercions are applied; see Contagion in Numeric Operations. ++

++

A conforming program can control the order of processing explicitly by ++separating the operations into separate (possibly nested) function forms, ++or by writing explicit calls to functions that perform coercions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Backquote.html +@@ -0,0 +1,207 @@ ++ ++ ++ ++ ++ ++Backquote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++
++

2.4.6 Backquote

++ ++

The backquote introduces a template of a data structure to be built. ++For example, writing ++

++
++
 `(cond ((numberp ,x) ,@y) (t (print ,x) ,@y))
++
++ ++

is roughly equivalent to writing ++

++
++
 (list 'cond 
++       (cons (list 'numberp x) y) 
++       (list* 't (list 'print x) y))
++
++ ++

Where a comma ++occurs in the template, ++the expression ++following the comma is to be evaluated to produce an object to ++be inserted at that point. Assume b has the value 3, for example, then ++evaluating the form denoted by `(a b ,b ,(+ b 1) b) produces ++the result (a b 3 4 b). ++

++

If a comma is immediately followed by an at-sign, ++then the form following the at-sign ++is evaluated to produce a list of objects. ++These objects are then “spliced” into place in the template. For ++example, if x has the value (a b c), then ++

++
++
 `(x ,x ,@x foo ,(cadr x) bar ,(cdr x) baz ,@(cdr x))
++⇒  (x (a b c) a b c foo b bar (b c) baz b c)
++
++ ++

The backquote syntax can be summarized formally as follows. ++

++
++
*
++

`basic is the same as 'basic, ++that is, (quote basic), for any expression ++basic that is not a list or a general vector. ++

++
++
*
++

`,form is the same as form, for any form, provided ++that the representation of form does not begin with at-sign ++or dot. (A similar caveat holds for all occurrences of a form after a comma.) ++

++
++
*
++

`,@form has undefined consequences. ++

++
++
*
++

`(x1 x2 x3 ... xn . atom) ++may be interpreted to mean ++

++
++
 (append [ x1 ] [ x2 ] [ x3 ] ... [ xn ] (quote atom))
++
++ ++

where the brackets are used to indicate ++a transformation of an xj as follows: ++

++
++
++

[form] is interpreted as (list `form), ++which contains a backquoted form that must then be further interpreted. ++

++
++
++

[,form] is interpreted as (list form). ++

++
++
++

[,@form] is interpreted as form. ++

++
++ ++
++
*
++

`(x1 x2 x3 ... xn) may be interpreted to mean ++the same as the backquoted form ++`(x1 x2 x3 ... xn . nil), ++thereby reducing it to the previous case. ++

++
++
*
++

`(x1 x2 x3 ... xn . ,form) may be interpreted to mean ++

++
++
 (append [ x1 ] [ x2 ] [ x3 ] ... [ xn ] form)
++
++ ++

where the brackets indicate a transformation of an xj as described above. ++

++
++
*
++

`(x1 x2 x3 ... xn . ,@form) has undefined consequences. ++

++
++
*
++

`#(x1 x2 x3 ... xn) may be interpreted to mean ++(apply #'vector `(x1 x2 x3 ... xn)). ++

++
++ ++

Anywhere “,@” may be used, the syntax “,.” may be used instead ++to indicate that it is permissible to operate destructively on ++the list structure produced by the form following the “,.” ++(in effect, to use nconc instead of append). ++

++

If the backquote syntax is nested, the innermost backquoted form ++should be expanded first. This means that if several commas occur ++in a row, the leftmost one belongs to the innermost backquote. ++

++

An implementation is free to interpret a backquoted form F_1 ++as any form F_2 that, when evaluated, will produce a result that is ++the same under equal as the result implied by the above definition, ++provided that the side-effect behavior of the substitute form F_2 ++is also consistent with the description given above. ++The constructed ++copy of the template might or might not share list structure with the ++template itself. As an example, the above definition implies that ++

++
++
 `((,a b) ,c ,@d)
++
++ ++

will be interpreted as if it were ++

++
++
 (append (list (append (list a) (list 'b) 'nil)) (list c) d 'nil)
++
++ ++

but it could also be legitimately interpreted to mean any of the following: ++

++
++
 (append (list (append (list a) (list 'b))) (list c) d)
++ (append (list (append (list a) '(b))) (list c) d)
++ (list* (cons a '(b)) c d)
++ (list* (cons a (list 'b)) c d)
++ (append (list (cons a '(b))) (list c) d)
++ (list* (cons a '(b)) c (copy-list d))
++
++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Boa-Lambda-Lists.html +@@ -0,0 +1,163 @@ ++ ++ ++ ++ ++ ++Boa Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.6 Boa Lambda Lists

++ ++

A boa lambda list ++ ++ is a lambda list that is syntactically ++like an ordinary lambda list, but that is processed in ++“by order of argument” style. ++

++

A boa lambda list is used only in a defstruct form, ++when explicitly specifying the lambda list ++of a constructor function (sometimes called a “boa constructor”). ++

++

The &optional, &rest, &aux, ++

++

&key, and &allow-other-keys ++

++

lambda list keywords are recognized in a boa lambda list. ++The way these lambda list keywords differ from their ++use in an ordinary lambda list follows. ++

++

Consider this example, which describes how destruct processes ++its :constructor option. ++

++
++
 (:constructor create-foo
++         (a &optional b (c 'sea) &rest d &aux e (f 'eff)))
++
++ ++

This defines create-foo to be a constructor of one or more arguments. ++The first argument is used to initialize the a slot. The second ++argument is used to initialize the b slot. If there isn’t any ++second argument, then the default value given in the body of the ++defstruct (if given) is used instead. ++The third argument is used to ++initialize the c slot. If there isn’t any third argument, then the ++symbol sea is used instead. Any arguments following the third ++argument are collected into a list ++and used to initialize the d ++slot. If there are three or fewer arguments, then nil is placed in ++the d slot. The e slot is not initialized; ++its initial value is implementation-defined. ++Finally, the f slot is initialized to contain the symbol eff. ++

++

&key and &allow-other-keys arguments default ++in a manner similar to that of &optional arguments: if no default ++is supplied in the lambda list then the default value ++given in the body of the defstruct (if given) is used instead. ++For example: ++

++
++
 (defstruct (foo (:constructor CREATE-FOO (a &optional b (c 'sea)
++                                             &key (d 2)
++                                             &aux e (f 'eff))))
++   (a 1) (b 2) (c 3) (d 4) (e 5) (f 6))
++
++ (create-foo 10) ⇒  #S(FOO A 10 B 2 C SEA D 2 E implemention-dependent F EFF)
++ (create-foo 10 'bee 'see :d 'dee) 
++⇒  #S(FOO A 10 B BEE C SEE D DEE E implemention-dependent F EFF)
++
++ ++

If keyword arguments of the form ++((key var) [default [svar]]) ++are specified, the slot name is matched with var ++(not key). ++

++

The actions taken in the b and e cases were carefully ++chosen to allow the user to specify all possible behaviors. ++The &aux variables can be used to completely override the default ++initializations given in the body. ++

++

If no default value is supplied for an aux variable variable, ++the consequences are undefined if an attempt is later made to read ++the corresponding slot’s value before a value is explicitly assigned. ++If such a slot has a :type option specified, ++this suppressed initialization does not imply a type mismatch situation; ++the declared type is only required to apply when the slot is finally assigned. ++

++

With this definition, the following can be written: ++

++
++
 (create-foo 1 2)
++
++ ++

instead of ++

++
++
 (make-foo :a 1 :b 2)
++
++ ++

and create-foo provides defaulting different ++from that of make-foo. ++

++

Additional arguments that do not correspond to slot names but ++are merely present to supply values used in subsequent initialization ++computations are allowed. ++For example, in the definition ++

++
++
 (defstruct (frob (:constructor create-frob
++                  (a &key (b 3 have-b) (c-token 'c) 
++                          (c (list c-token (if have-b 7 2))))))
++         a b c)
++
++ ++

the c-token argument is used merely to supply a value used in the ++initialization of the c slot. The supplied-p parameters ++associated with optional parameters and keyword parameters ++might also be used this way. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Built_002din-Method-Combination-Types.html +@@ -0,0 +1,190 @@ ++ ++ ++ ++ ++ ++Built-in Method Combination Types (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.7 Built-in Method Combination Types

++ ++

The object system provides a set of built-in method combination types. To ++specify that a generic function is to use one of these method ++combination types, the name of the method combination type is given as ++the argument to the :method-combination option to ++defgeneric or to the :method-combination option to any of the ++other operators that specify generic function options. ++

++

The names of the built-in method combination types are listed in Figure 7–3. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
  +    append  max  nconc  progn     
++  and  list    min  or     standard  
++
++  Figure 7–3: Built-in Method Combination Types
++
++
++ ++

The semantics of the standard built-in method combination type is ++described in Standard Method Combination. The other ++built-in method combination types are called simple built-in method ++combination types. ++

++

The simple built-in method combination types act as though they were ++defined by the short form of define-method-combination. ++They recognize two roles for methods: ++

++
++
*
++

An around method has the keyword symbol ++:around as its sole qualifier. The meaning of ++:around methods is the same as in standard method combination. ++Use of the functions call-next-method and next-method-p ++is supported in around methods. ++

++
++
*
++

A primary method has the name of the method combination ++type as its sole qualifier. For example, the built-in method ++combination type and recognizes methods whose sole qualifier is ++and; these are primary methods. Use of the functions ++call-next-method and next-method-p is not supported ++in primary methods. ++

++
++
++ ++

The semantics of the simple built-in method combination types is as ++follows: ++

++
++
*
++

If there are any around methods, the most specific around method ++is called. It supplies the value or values of the generic function. ++

++
++
*
++

Inside the body of an around method, the function ++call-next-method can be used to call the next method. ++The generic function no-next-method is invoked if ++call-next-method is used and there is no applicable method to call. ++The function next-method-p may be used to determine whether a ++next method exists. When the next method returns, ++the around method can execute more code, ++perhaps based on the returned value or values. ++

++
++
*
++

If an around method invokes call-next-method, ++the next most specific around method is ++called, if one is applicable. If there are no around methods ++or if call-next-method is called by the least specific ++around method, a Lisp form derived from the name of the built-in ++method combination type and from the list of applicable primary ++methods is evaluated to produce the value of the generic function. ++Suppose the name of the method combination type is operator ++and the call to the generic function is of the form ++

++
(generic-function a_1... a_n) ++
++
++
++

Let M_1,...,M_k be the applicable primary methods ++in order; then the derived Lisp form is ++

++
(operator < M_1 ++

a_1... a_n>...< ++M_k a_1... a_n>) ++

++
++
++

If the expression < M_i a_1... a_n> is ++evaluated, the method M_i will be applied to the arguments ++a_1... a_n. ++For example, ++if operator is or, ++the expression < M_i a_1... a_n> is ++evaluated only if < M_j a_1... a_n>, ++1<= j<i, returned nil. ++

++
++
++

The default order for the primary methods is ++:most-specific-first. However, the order can be reversed by supplying ++:most-specific-last as the second argument to the :method-combination option. ++

++
++ ++

The simple built-in method combination types require exactly one ++qualifier per method. An error is signaled if there are applicable ++methods with no qualifiers or with qualifiers that are not supported ++by the method combination type. An error is signaled if there are ++applicable around methods and no applicable primary ++methods. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Byte-Operations-on-Integers.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Byte Operations on Integers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1.6 Byte Operations on Integers

++ ++

The byte-manipulation functions use objects ++called byte specifiers to designate the size and position ++of a specific byte within an integer. ++The representation of a byte specifier is implementation-dependent; ++it might or might not be a number. ++The function byte will construct a byte specifier, ++which various other byte-manipulation functions will accept. ++

++

Figure 12–6 shows defined names relating to ++manipulating bytes of numbers. ++

++
++
  byte           deposit-field  ldb-test    
++  byte-position  dpb            mask-field  
++  byte-size      ldb                        
++
++  Figure 12–6: Defined names relating to byte manipulation.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Capitalization-and-Punctuation-in-Condition-Reports.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Capitalization and Punctuation in Condition Reports (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3.2 Capitalization and Punctuation in Condition Reports

++ ++

It is recommended that a report message be a complete sentences, in the ++proper case and correctly punctuated. In English, for example, this ++means the first letter should be uppercase, and there should be a ++trailing period. ++

++
++
 (error "This is a message")  ; Not recommended
++ (error "this is a message.") ; Not recommended
++
++ (error "This is a message.") ; Recommended instead
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Case-in-Pathname-Components.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Case in Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.3 Case in Pathname Components

++ ++

Namestrings always use local file system case conventions, ++but Common Lisp functions that manipulate pathname components ++allow the caller to select either of two conventions for representing ++case in component values by supplying a value for the ++:case keyword argument. ++Figure 19–2 lists the functions ++relating to pathnames that permit a :case argument: ++

++
++
  make-pathname    pathname-directory  pathname-name  
++  pathname-device  pathname-host       pathname-type  
++
++  Figure 19–2: Pathname functions using a :CASE argument
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Case-in-Symbols.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Case in Symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.8 Case in Symbols

++ ++ ++ ++

While case is significant in the process of interning a symbol, ++the Lisp reader, by default, attempts to canonicalize the case of a ++symbol prior to interning; see Effect of Readtable Case on the Lisp Reader. ++As such, case in symbols is not, by default, significant. ++Throughout this document, except as explicitly noted otherwise, ++the case in which a symbol appears is not significant; ++that is, HELLO, Hello, hElLo, and hello are ++all equivalent ways to denote a symbol whose name is "HELLO". ++

++

The characters backslash and vertical-bar are used to explicitly ++quote the case and other parsing-related ++aspects ++of characters. As such, ++the notations |hello| and \h\e\l\l\o are equivalent ways ++to refer to a symbol whose name is "hello", and which is distinct from ++any symbol whose name is "HELLO". ++

++

The symbols that correspond to Common Lisp defined names ++have uppercase names even though their names generally appear ++in lowercase in this document. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Case-of-Implementation_002dDefined-Characters.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Case of Implementation-Defined Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.7 Case of Implementation-Defined Characters

++ ++

An implementation may define that other implementation-defined ++graphic characters have case. Such definitions must always ++be done in pairs—one uppercase character in one-to-one ++correspondence with one lowercase character. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Changing-the-Class-of-an-Instance.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++Changing the Class of an Instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.2 Changing the Class of an Instance

++ ++ ++

The function change-class can be used to change the class ++of an instance from its current class, C_{from}, ++to a different class, C_{to}; it changes the ++structure of the instance to conform to the definition of the class ++C_{to}. ++

++

Note that changing the class of an instance may cause ++slots to be added or deleted. Changing the class of an ++instance does not change its identity as defined by the ++eq function. ++

++

When change-class is invoked on an instance, a two-step ++updating process takes place. The first step modifies the structure of ++the instance by adding new local slots and discarding ++local slots that are not specified in the new version of the instance. ++The second step initializes the newly added local slots and performs ++any other user-defined actions. These two steps are further described in the ++two following sections. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Attributes.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Character Attributes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.3 Character Attributes

++ ++

Characters have only one standardized attribute: ++a code. A character’s code is a non-negative integer. ++This code is composed from a character script and a character label ++in an implementation-dependent way. See the functions char-code and code-char. ++

++

Additional, implementation-defined attributes of characters ++are also permitted ++so that, for example, ++two characters with the same code may differ ++in some other, implementation-defined way. ++

++

For any implementation-defined attribute ++there is a distinguished value ++called the null ++ ++ value for that attribute. ++A character for which each implementation-defined attribute ++has the null value for that attribute is called a simple character. ++If the implementation has no implementation-defined attributes, ++then all characters are simple characters. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Categories.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++Character Categories (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4 Character Categories

++ ++

There are several (overlapping) categories of characters that have no formally ++associated type but that are nevertheless useful to name. ++They include ++ graphic characters, ++ alphabetic_1 characters, ++ characters with case ++ (uppercase and lowercase characters), ++ numeric characters, ++ alphanumeric characters, ++ and digits (in a given radix). ++

++

For each implementation-defined attribute of a character, ++the documentation for that implementation must specify whether ++characters that differ only in that attribute are permitted to differ ++in whether are not they are members of one of the aforementioned categories. ++

++

Note that these terms are defined independently of any special syntax ++which might have been enabled in the current readtable. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Concepts.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Character Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters  

++
++
++

13.1 Character Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Encodings.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Character Encodings (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.9 Character Encodings

++ ++

A character is sometimes represented merely by its code, and sometimes ++by another integer value which is composed from the code and all ++implementation-defined attributes ++(in an implementation-defined way ++that might vary between Lisp images even in the same implementation). ++This integer, returned by the function char-int, is called the ++character’s “encoding.” ++There is no corresponding function ++from a character’s encoding back to the character, ++since its primary intended uses include things like hashing where an inverse operation ++is not really called for. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Names.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++Character Names (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.7 Character Names

++ ++

The following character names must be present in all ++conforming implementations: ++

++
++
Newline
++

The character that represents the division between lines. ++An implementation must translate between #\Newline, ++a single-character representation, and whatever external representation(s) ++may be used. ++

++
++
Space
++

The space or blank character. ++

++
++ ++

The following names are semi-standard; ++if an implementation supports them, ++they should be used for the described characters and no others. ++

++
++
Rubout
++

The rubout or delete character. ++

++
++
Page
++

The form-feed or page-separator character. ++

++
++
Tab
++

The tabulate character. ++

++
++
Backspace
++

The backspace character. ++

++
++
Return
++

The carriage return character. ++

++
++
Linefeed
++

The line-feed character. ++

++
++ ++

In some implementations, ++one or more of these character names ++might denote a standard character; ++for example, ++#\Linefeed and #\Newline might be the same character ++in some implementations. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Repertoires.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Character Repertoires (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.2.2 Character Repertoires

++ ++

A repertoire ++ ++ is a type specifier for a subtype of type character. ++

++

This term is generally used when describing a collection of characters ++independent of their coding. ++Characters in repertoires are only identified ++ by name, ++ by glyph, or ++ by character description. ++

++

A repertoire can contain characters from several ++scripts, and a character can appear in more than ++one repertoire. ++

++

For some examples of repertoires, see the coded character standards ++ISO 8859/1, ISO 8859/2, and ISO 6937/2. ++Note, however, that although ++the term “repertoire” is chosen for ++definitional ++compatibility with ISO terminology, no conforming implementation ++is required to use repertoires standardized by ISO or any other ++standards organization. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Scripts.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Character Scripts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.2.1 Character Scripts

++ ++

A script is one of possibly several sets that form an exhaustive partition ++of the type character. ++

++

The number of such sets and boundaries between them is implementation-defined. ++Common Lisp does not require these sets to be types, but an implementation ++is permitted to define such types as an extension. Since no character ++from one script can ever be a member of another script, it is generally ++more useful to speak about character repertoires. ++

++

Although ++the term “script” is chosen for ++definitional ++compatibility with ISO terminology, no conforming implementation ++is required to use any particular scripts standardized by ISO ++or by any other standards organization. ++

++

Whether and how the script or scripts used by any given ++implementation are named is implementation-dependent. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Syntax-Types.html +@@ -0,0 +1,161 @@ ++ ++ ++ ++ ++ ++Character Syntax Types (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Character Syntax  

++
++
++

2.1.4 Character Syntax Types

++ ++

The Lisp reader constructs an object ++from the input text by interpreting each character ++according to its syntax type. ++The Lisp reader cannot accept as input ++everything that the Lisp printer produces, ++and the Lisp reader has features that are not used by the Lisp printer. ++The Lisp reader can be used as a lexical analyzer ++for a more general user-written parser. ++

++

When the Lisp reader is invoked, it reads a single character from ++the input stream and dispatches according to the ++syntax type ++ ++ of that character. ++Every character that can appear in the input stream ++is of one of the syntax types shown in Figure~2–6. ++

++
++
  constituent  macro character  single escape  
++  invalid      multiple escape  whitespace_2   
++
++  Figure 2–6: Possible Character Syntax Types 
++
++
++ ++

The syntax type of a character in a readtable ++determines how that character is interpreted by the Lisp reader ++while that readtable is the current readtable. ++At any given time, every character has exactly one syntax type. ++

++

Figure~2–7 ++lists the syntax type of each character in standard syntax. ++

++ ++ ++
++
  character  syntax type                 character  syntax type             
++  Backspace  constituent                 0–9       constituent             
++  Tab        whitespace_2                :          constituent             
++  Newline    whitespace_2                ;          terminating macro char  
++  Linefeed   whitespace_2                <          constituent             
++  Page       whitespace_2                =          constituent             
++  Return     whitespace_2                >          constituent             
++  Space      whitespace_2                ?          constituent*            
++  !          constituent*                @          constituent             
++  "          terminating macro char      A–Z       constituent             
++  #          non-terminating macro char  [          constituent*            
++  $         constituent                 \          single escape           
++  %          constituent                 ]          constituent*            
++  &          constituent                 ^          constituent             
++  ’          terminating macro char      _          constituent             
++  (          terminating macro charterminating macro char  
++  )          terminating macro char      a–z       constituent             
++  *          constituent                 {          constituent*            
++  +          constituent                 |          multiple escape         
++  ,          terminating macro char      }          constituent*            
++  -          constituent                 ~          constituent             
++  .          constituent                 Rubout     constituent             
++  /          constituent                 
++
++            Figure 2–7: Character Syntax Types in Standard Syntax          
++
++
++ ++ ++

The characters marked with an asterisk (*) are initially constituents, ++but they are not used in any standard Common Lisp notations. ++These characters are explicitly reserved to the programmer. ++~ is not used in Common Lisp, and reserved to implementors. ++$ and % are alphabetic_2 characters, ++but are not used in the names of any standard Common Lisp defined names. ++

++

Whitespace_2 characters serve as separators but are otherwise ++ignored. Constituent and escape characters are accumulated ++to make a token, which is then interpreted as a number or symbol. ++Macro characters trigger the invocation of functions (possibly ++user-supplied) that can perform arbitrary parsing actions. ++Macro characters are divided into two kinds, ++terminating and non-terminating, ++depending on whether or not they terminate a token. ++The following are descriptions of each kind of syntax type. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Character Syntax  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Character-Syntax.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++Character Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Syntax  

++
++
++

2.1 Character Syntax

++ ++ ++

The Lisp reader takes characters from a stream, ++interprets them as a printed representation of an object, ++constructs that object, and returns it. ++

++

The syntax described by this chapter is called the standard syntax ++ ++. ++Operations are provided by Common Lisp so that ++various aspects of the syntax information represented by a readtable ++can be modified under program control; see Reader. ++Except as explicitly stated otherwise, ++the syntax used throughout this document is standard syntax. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Characters-Dictionary.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++Characters Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Characters  

++
++
++

13.2 Characters Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Characters-With-Case.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Characters With Case (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.3 Characters With Case

++ ++

The characters with case are ++a subset of the alphabetic_1 characters. ++A character with case has the property of being either ++uppercase or lowercase. ++Every character with case is in one-to-one correspondence ++with some other character with the opposite case. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Characters.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

13 Characters

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Classes.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes  

++
++
++

4.3 Classes

++ ++ ++

While the object system is general enough to describe all standardized classes ++(including, for example, number, hash-table, and ++symbol), Figure 4–7 contains a list of classes that are ++especially relevant to understanding the object system. ++

++
++
  built-in-class    method-combination         standard-object   
++  class             standard-class             structure-class   
++  generic-function  standard-generic-function  structure-object  
++  method            standard-method                              
++
++                Figure 4–7: Object System Classes               
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Closures-and-Lexical-Binding.html +@@ -0,0 +1,171 @@ ++ ++ ++ ++ ++ ++Closures and Lexical Binding (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation  

++
++
++

3.1.4 Closures and Lexical Binding

++ ++

A lexical closure is a function that can refer to and alter ++the values of lexical bindings established by binding forms ++that textually include the function definition. ++

++

Consider this code, where x is not declared special: ++

++
++
 (defun two-funs (x)
++   (list (function (lambda () x))
++         (function (lambda (y) (setq x y)))))
++ (setq funs (two-funs 6))
++ (funcall (car funs)) ⇒  6
++ (funcall (cadr funs) 43) ⇒  43
++ (funcall (car funs)) ⇒  43
++
++ ++

The function special form coerces a ++lambda expression into a closure in which the ++lexical environment in effect when the special form is ++evaluated is captured along with the lambda expression. ++

++

The function two-funs returns a list of two ++functions, each of which refers to the binding of the ++variable x created on entry to the function two-funs when it ++was called. ++This variable has the value 6 ++initially, but setq can alter this binding. ++The lexical closure created for the first ++lambda expression does not “snapshot” the value 6 for x ++when the closure is created; rather it captures the binding of x. ++The second function can be used to alter the value in the same (captured) ++binding (to 43, in the example), and ++this altered variable binding then affects the value returned by the first function. ++

++

In situations where a closure of a ++lambda expression over the same set of bindings may be ++produced more than once, the various resulting closures may ++or may not be identical, at the discretion of the implementation. ++That is, two functions that are behaviorally ++indistinguishable might or might not be identical. ++Two functions that are behaviorally distinguishable are distinct. ++For example: ++

++
++
 (let ((x 5) (funs '()))
++   (dotimes (j 10)                          
++     (push #'(lambda (z)                        
++               (if (null z) (setq x 0) (+ x z)))
++           funs))
++   funs)
++
++ ++

The result of the above form is a list of ten closures. ++Each requires only the binding of x. ++It is the same binding in each case, ++but the ten closure objects might or might not be identical. ++On the other hand, the result of the form ++

++
++
 (let ((funs '()))     
++   (dotimes (j 10)
++     (let ((x 5))
++       (push (function (lambda (z)
++                        (if (null z) (setq x 0) (+ x z))))
++             funs)))
++  funs)
++
++ ++

is also a list of ten closures. ++However, in this case no two of the closure objects can ++be identical because each closure is closed over a distinct ++binding of x, and these bindings can be behaviorally ++distinguished because of the use of setq. ++

++

The result of the form ++

++
++
 (let ((funs '()))
++   (dotimes (j 10)
++     (let ((x 5))
++       (push (function (lambda (z) (+ x z)))
++            funs)))
++   funs)
++
++ ++

is a list of ten closure objects that ++might or might not be identical. ++A different binding of x is involved for ++each closure, but the bindings cannot be distinguished ++because their values are the same and immutable (there being no occurrence ++of setq on x). A compiler could internally ++transform the form to ++

++
++
 (let ((funs '()))
++   (dotimes (j 10)
++     (push (function (lambda (z) (+ 5 z)))
++           funs))
++  funs)
++
++ ++

where the closures may be identical. ++

++

It is possible that a closure does not ++close over any variable bindings. ++In the code fragment ++

++
++
 (mapcar (function (lambda (x) (+ x 2))) y)
++
++ ++

the function (lambda (x) (+ x 2)) contains no references to any outside ++object. In this case, the same closure might be returned ++for all evaluations of the function form. ++

++
++
++

++Next: , Previous: , Up: Evaluation  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Coercion-of-Streams-to-Pathnames.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Coercion of Streams to Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

20.1.1 Coercion of Streams to Pathnames

++ ++

A stream associated with a file ++ ++ is either a file stream ++or a synonym stream whose target is a stream associated with a file ++ ++. ++Such streams can be used as pathname designators. ++

++

Normally, when a stream associated with a file is used as a ++pathname designator, it denotes the pathname used to ++open the file; this may be, but is not required to be, the ++actual name of the file. ++

++

Some functions, such as truename and delete-file, ++coerce streams to pathnames in a different way that ++involves referring to the actual file that is open, which might ++or might not be the file whose name was opened originally. Such special ++situations are always notated specifically and are not the default. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Comma.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Comma (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++
++

2.4.7 Comma

++ ++

The comma is part of the backquote syntax; see Backquote. ++Comma is invalid if used other than inside the body of a ++backquote expression as described above. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Common-Case-in-Pathname-Components.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Common Case in Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.5 Common Case in Pathname Components

++ ++

For the functions in Figure~19–2, ++a value of :common ++ for the :case argument ++that these functions should receive ++and yield strings in component values according to the following conventions: ++

++
++
*
++

All uppercase means to use a file system’s customary case. ++

++
*
++

All lowercase means to use the opposite of the customary case. ++

++
*
++

Mixed case represents itself. ++

++
++ ++

Note that these conventions have been chosen in such a way that translation ++from :local to :common and back to :local is information-preserving. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Compilation-Semantics.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Compilation Semantics (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Compilation  

++
++
++

3.2.2 Compilation Semantics

++ ++

Conceptually, compilation is a process that traverses code, performs ++certain kinds of syntactic and semantic analyses using information ++(such as proclamations and macro definitions) present in the ++compilation environment, and produces equivalent, possibly ++more efficient code. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Compilation.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Compilation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation  

++
++
++

3.2 Compilation

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Compiler-Macros.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Compiler Macros (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.2.1 Compiler Macros

++ ++

A compiler macro can be defined for a name ++that also names a function or macro. ++That is, it is possible for a ++function name to name both a function and a compiler macro. ++

++

A function name names a compiler macro if compiler-macro-function ++is true of the function name in the lexical environment in which ++it appears. Creating a lexical binding for the function name ++not only creates a new local function or ++macro definition, but also shadows_2 the compiler macro. ++

++

The function returned by compiler-macro-function ++is a function of two arguments, called the ++expansion function. To expand a compiler macro, ++the expansion function is invoked by calling the macroexpand hook with ++ the expansion function as its first argument, ++ the entire compiler macro form as its second argument, ++ and the current compilation environment ++ (or with the current lexical environment, ++ if the form is being processed by something ++ other than compile-file) ++ as its third argument. ++The macroexpand hook, in turn, calls the expansion function with the ++form as its first argument and the environment as its second argument. ++The return value from the expansion function, which is passed through ++by the macroexpand hook, might either be the same form, ++or else a form that can, at the discretion of the code doing the expansion, ++be used in place of the original form. ++

++
++
  *macroexpand-hook*  compiler-macro-function  define-compiler-macro  
++
++        Figure 3–6: Defined names applicable to compiler macros      
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Compiler-Terminology.html +@@ -0,0 +1,201 @@ ++ ++ ++ ++ ++ ++Compiler Terminology (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Compilation  

++
++
++

3.2.1 Compiler Terminology

++ ++

The following terminology is used in this section. ++

++

The compiler ++ ++ is a utility that translates code into an ++implementation-dependent form that might be represented or ++executed efficiently. ++The term compiler ++ ++ refers to both of the functions ++compile and compile-file. ++

++

The term compiled code ++ ++ refers to ++objects representing compiled programs, such as objects constructed ++by compile or by load when loading a compiled file. ++

++

The term implicit compilation ++ ++ refers to compilation ++performed during evaluation. ++

++

The term literal object ++ ++ refers to ++ a quoted object ++ or a self-evaluating object ++ or an object that is a substructure of such an object. ++A constant variable is not itself a literal object. ++

++

The term coalesce ++ ++ is defined as follows. ++Suppose A and B are two literal constants in the source code, ++and that A' and B' are the corresponding objects in the compiled code. ++If A' and B' are eql but ++A and B are not eql, then it is said ++that A and B have been coalesced by the compiler. ++

++

The term minimal compilation ++ ++ refers to actions the compiler ++must take at compile time. These actions are specified in ++Compilation Semantics. ++

++

The verb process ++ ++ refers to performing minimal compilation, ++determining the time of evaluation for a form, ++and possibly evaluating that form (if required). ++

++

The term further compilation ++ ++ refers to ++implementation-dependent compilation beyond minimal compilation. ++That is, processing does not imply complete compilation. ++Block compilation and generation of machine-specific instructions are ++examples of further compilation. ++Further compilation is permitted to take place at run time. ++

++

Four different environments relevant to compilation are ++distinguished: ++ the startup environment, ++ the compilation environment, ++ the evaluation environment, and ++ the run-time environment. ++

++

The startup environment ++ ++ is ++the environment of the Lisp image ++from which the compiler was invoked. ++

++

The compilation environment ++ ++ is maintained by the compiler ++and is used to hold definitions and declarations to be used internally ++by the compiler. Only those parts of a definition needed for correct ++compilation are saved. The compilation environment is used ++as the environment argument to macro expanders called by ++the compiler. It is unspecified whether a definition available in the ++compilation environment can be used in an evaluation ++initiated in the startup environment or evaluation environment. ++

++

The evaluation environment ++ ++ is a run-time environment ++in which macro expanders and code specified by eval-when ++to be evaluated are evaluated. All evaluations initiated by the ++compiler take place in the evaluation environment. ++

++

The run-time environment ++ ++ is the ++environment in which the program being compiled will be executed. ++

++

The compilation environment inherits from ++the evaluation environment, ++and the compilation environment and evaluation environment ++might be identical. ++The evaluation environment inherits from ++the startup environment, ++and the startup environment and evaluation environment ++might be identical. ++

++

The term compile time ++ ++ refers to the duration of time that ++the compiler is processing source code. ++At compile time, ++only the compilation environment ++and the evaluation environment ++are available. ++

++

The term compile-time definition ++ ++ refers to a definition in ++the compilation environment. ++For example, when compiling a file, ++the definition of a function might be retained in the compilation environment ++if it is declared inline. ++This definition might not be available in the evaluation environment. ++

++

The term run time ++ ++ refers to the duration of time that the ++loader is loading compiled code or compiled code is being executed. ++At run time, only the run-time environment is available. ++

++

The term run-time definition ++ ++ refers to a definition in the ++run-time environment. ++

++

The term run-time compiler ++ ++ refers to the function compile ++or implicit compilation, for which the compilation and run-time ++environments are maintained in the same Lisp image. ++Note that when the run-time compiler is used, ++the run-time environment ++and startup environment ++are the same. ++

++
++
++

++Next: , Previous: , Up: Compilation  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Compiling-Format-Strings.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Compiling Format Strings (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.1.3 Compiling Format Strings

++ ++

A format string is essentially a program in a special-purpose language ++that performs printing, and that is interpreted by the function format. ++The formatter macro provides the efficiency of using a compiled function ++to do that same printing but without losing the textual compactness of format strings. ++

++

A format control ++ ++ is either a format string or a function ++that was returned by the the formatter macro. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Complex-Computations.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Complex Computations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.5 Complex Computations

++ ++

The following rules apply to complex computations: ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Condition-Designators.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Condition Designators (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Creating Conditions  

++
++
++

9.1.2.1 Condition Designators

++ ++

A number of the functions in the condition system take arguments which ++are identified as condition designators ++ ++. ++By convention, those arguments are notated as ++

++

datum &rest arguments ++

++

Taken together, the datum and the arguments are ++“designators for a condition of default type default-type.” ++How the denoted condition is computed depends on the type of the datum: ++

++
++
* If the datum is a symbol
++

naming a condition type ... ++The denoted condition is the result of ++

++
++
 (apply #'make-condition datum arguments)
++
++ ++
++
* If the datum is a format control ...
++
++

The denoted condition is the result of ++

++
++
 (make-condition defaulted-type 
++                 :format-control datum
++                 :format-arguments arguments)
++
++ ++

where the defaulted-type is a subtype of default-type. ++

++
++
* If the datum is a condition ...
++

The denoted condition is the datum itself. ++In this case, unless otherwise specified by the description of the ++operator in question, the arguments must be null; ++that is, the consequences are undefined if any arguments were supplied. ++

++
++
++ ++

Note that the default-type gets used only in the case where ++the datum string is supplied. In the other situations, ++the resulting condition is not necessarily of type default-type. ++

++

Here are some illustrations of how different condition designators ++can denote equivalent condition objects: ++

++
++
(let ((c (make-condition 'arithmetic-error :operator '/ :operands '(7 0))))
++  (error c))
++≡ (error 'arithmetic-error :operator '/ :operands '(7 0))
++
++(error "Bad luck.")
++≡ (error 'simple-error :format-control "Bad luck." :format-arguments '())
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Condition-System-Concepts.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++Condition System Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions  

++
++
++

9.1 Condition System Concepts

++ ++ ++

Common Lisp constructs are described not only in terms of their ++behavior in situations during which they are intended to be used (see ++the “Description” part of each operator specification), ++but in all other situations (see the “Exceptional Situations” ++part of each operator specification). ++

++

A situation is the evaluation of an expression in a specific context. ++A condition is an object that ++represents a specific situation that has been detected. ++Conditions are generalized instances of the class condition. ++A hierarchy of condition classes is defined in Common Lisp. ++A condition has slots that contain data ++relevant to the situation that the condition represents. ++

++

An error is a situation in which normal program execution cannot ++continue correctly without some form of intervention (either ++interactively by the user or under program control). Not all errors ++are detected. When an error goes undetected, the effects can be ++implementation-dependent, implementation-defined, unspecified, or ++undefined. See Definitions. All detected errors can ++be represented by conditions, but not all ++conditions represent errors. ++

++

Signaling is the process by which a condition can alter ++the flow of control in a program by raising the ++condition which can then be handled. The functions ++error, cerror, signal, and ++warn are used to signal conditions. ++

++

The process of signaling involves the selection and invocation of a ++handler from a set of active handlers. ++A handler is a function of one argument (the ++condition) that is invoked to handle a condition. ++Each handler is associated with a condition type, ++and a handler will be invoked only on a condition of the ++handler’s associated type. ++

++

Active handlers are established dynamically ++(see handler-bind or handler-case). ++Handlers are invoked in a dynamic environment ++equivalent to that of the signaler, ++except that the set of active handlers ++is bound in such a way as to include only those that were active ++at the time the handler being invoked was established. ++Signaling a condition has no side-effect on the condition, ++and there is no dynamic state contained in a condition. ++

++

If a handler is invoked, it can address the situation ++in one of three ways: ++

++
++
Decline
++

It can decline to handle the condition. It does this by ++simply returning rather than transferring control. ++When this happens, any values returned by the handler are ++ignored and the next most recently established handler is invoked. ++If there is no such handler and the signaling function is error ++or cerror, the debugger is entered in the ++dynamic environment of the signaler. If there is no such ++handler and the signaling function is either signal or ++warn, the signaling function simply returns~nil. ++

++
++
Handle
++

It can handle the condition by performing a non-local ++transfer of control. This can be done either primitively by using ++go, return, throw or more ++abstractly by using a function such as abort or ++invoke-restart. ++

++
++
Defer
++

It can put off a decision about whether to handle or decline, ++by any of a number of actions, but most commonly by ++ signaling another condition, ++ resignaling the same condition, ++ or forcing entry into the debugger. ++

++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Conditions  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Condition-Types.html +@@ -0,0 +1,119 @@ ++ ++ ++ ++ ++ ++Condition Types (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.1 Condition Types

++ ++

Figure 9–1 lists the standardized condition types. ++Additional condition types can be defined by using define-condition. ++

++
++
 arithmetic-error                 floating-point-overflow  simple-type-error  
++ cell-error                       floating-point-underflow simple-warning     
++ condition                        package-error            storage-condition  
++ control-error                    parse-error              stream-error       
++ division-by-zero                 print-not-readable       style-warning      
++ end-of-file                      program-error            type-error         
++ error                            reader-error             unbound-slot       
++ file-error                       serious-condition        unbound-variable   
++ floating-point-inexact           simple-condition         undefined-function 
++ floating-point-invalid-operation simple-error             warning            
++
++                    Figure 9–1: Standardized Condition Types                  
++
++
++ ++

All condition types are subtypes of type condition. That is, ++

++
++
 (typep c 'condition) ⇒  true
++
++ ++

if and only if c is a condition. ++

++

Implementations must define all specified subtype relationships. ++Except where noted, all subtype relationships indicated in ++this document are not mutually exclusive. ++A condition inherits the structure of its supertypes. ++

++

The metaclass of the class condition is not specified. ++Names of condition types may be used to specify ++supertype relationships in define-condition, ++but the consequences are not specified if an attempt is made to use ++a condition type as a superclass in a defclass form. ++

++

Figure 9–2 shows operators that ++define condition types and creating conditions. ++

++
++
  define-condition  make-condition    
++
++  Figure 9–2: Operators that define and create conditions.
++
++
++ ++

Figure 9–3 shows operators that read ++the value of condition slots. ++

++
++
  arithmetic-error-operands   simple-condition-format-arguments  
++  arithmetic-error-operation  simple-condition-format-control    
++  cell-error-name             stream-error-stream                
++  file-error-pathname         type-error-datum                   
++  package-error-package       type-error-expected-type           
++  print-not-readable-object   unbound-slot-instance              
++
++         Figure 9–3: Operators that read condition slots.       
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conditional-Execution-Clauses.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++Conditional Execution Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.6 Conditional Execution Clauses

++ ++

The if, when, and unless constructs ++establish conditional control in a loop. If the test ++passes, the succeeding loop clause is executed. If the test does ++not pass, the succeeding clause is skipped, and program control ++moves to the clause that follows the loop keyword ++else. If the test does not pass and no else ++clause is supplied, control is transferred to the clause or ++construct following the entire conditional clause. ++

++

If conditional clauses are nested, each else is paired ++with the closest preceding conditional clause that has no ++associated else or end. ++

++

In the if and when clauses, which are ++synonymous, the test passes if the value of form is ++true. ++

++

In the unless clause, ++the test passes if the value of form is false. ++

++

Clauses that follow the test expression can be grouped by using ++the loop keyword and to produce a conditional block consisting of ++a compound clause. ++

++

The loop keyword it can be used to refer to the result ++of the test expression in a clause. ++Use the loop keyword it in place of the form in a ++return clause or an accumulation clause that is ++inside a conditional execution clause. ++If multiple clauses are connected with and, the it ++construct must be in the first clause in the block. ++

++

The optional loop keyword end marks the end of the clause. If this ++keyword is not supplied, the next loop keyword marks the end. The construct ++end can be used to distinguish the scoping of compound clauses. ++

++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conditions-Dictionary.html +@@ -0,0 +1,152 @@ ++ ++ ++ ++ ++ ++Conditions Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conditions  

++
++
++

9.2 Conditions Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Conditions  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conditions.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Conditions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

9 Conditions

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conformance-Statement.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++Conformance Statement (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.7 Conformance Statement

++ ++

A conforming implementation shall produce a conformance statement ++as a consequence of using the implementation, or that statement ++shall be included in the accompanying documentation. If the implementation ++conforms in all respects with this standard, the conformance statement ++shall be ++

++
++
++

“<<Implementation>> conforms with the requirements ++ of ANSI <<standard number>>” ++

++
++ ++

If the implementation conforms with some but not all of the requirements of this ++standard, then the conformance statement shall be ++

++
++
++

“<<Implementation>> conforms with the requirements of ++ ANSI <<standard number>> with the following exceptions: ++ <<reference to or complete list of the requirements of ++ the standard with which the implementation does not conform>>.” ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conformance.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Conformance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5 Conformance

++ ++ ++

This standard presents the syntax and semantics to be implemented by a ++conforming implementation (and its accompanying documentation). ++In addition, it imposes requirements on conforming programs. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conforming-Implementations.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Conforming Implementations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conformance  

++
++
++

1.5.1 Conforming Implementations

++ ++

A conforming implementation ++ ++ shall adhere to the requirements outlined ++in this section. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conforming-Programs.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++Conforming Programs (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conformance  

++
++
++

1.5.2 Conforming Programs

++ ++ ++ ++ ++ ++

Code conforming with the requirements of this standard shall adhere to the ++following: ++

++
++
1.
++

Conforming code shall use only those features of the ++ language syntax and semantics that are ++ either specified in this standard ++ or defined using the extension mechanisms ++ specified in the standard. ++

++
++
2.
++

Conforming code shall not rely on any particular ++ interpretation of implementation-dependent features. ++

++
++
3.
++

Conforming code shall not depend on the consequences ++ of undefined or unspecified situations. ++

++
++
4.
++

Conforming code does not use any constructions ++ that are prohibited by the standard. ++

++
++
5.
++

Conforming code does not depend on extensions ++ included in an implementation. ++

++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Congruent-Lambda_002dlists-for-all-Methods-of-a-Generic-Function.html +@@ -0,0 +1,109 @@ ++ ++ ++ ++ ++ ++Congruent Lambda-lists for all Methods of a Generic Function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.4 Congruent Lambda-lists for all Methods of a Generic Function

++ ++

These rules define the congruence of a set of lambda lists, including the ++lambda list of each method for a given generic function and the ++lambda list specified for the generic function itself, if given. ++

++
++
1.
++

Each lambda list must have the same number of required ++parameters. ++

++
++
2.
++

Each lambda list must have the same number of optional ++parameters. Each method can supply its own default for an optional ++parameter. ++

++
++
3.
++

If any lambda list mentions &rest or &key, each ++lambda list must mention one or both of them. ++

++
++
4.
++

If the generic function lambda list ++mentions &key, each ++method must accept all of the keyword names mentioned after &key, ++either by accepting them explicitly, by specifying &allow-other-keys, ++or by specifying &rest but not &key. ++Each method can accept additional keyword arguments of its own. The ++checking of the validity of keyword names is done in the generic ++function, not in each method. ++A method is invoked as if the keyword ++argument pair whose name is :allow-other-keys and whose value ++is true were supplied, though no such argument pair will be passed. ++

++
++
5.
++

The use of &allow-other-keys need not be consistent ++across lambda lists. If &allow-other-keys is mentioned in ++the lambda list of any applicable method or of the generic function, ++any keyword arguments may be mentioned in the call to the generic function. ++

++
++
6.
++

The use of &aux need not be consistent across methods. ++

++

If a method-defining operator that cannot specify generic function options ++creates a generic function, and if the lambda list for the method ++mentions keyword arguments, the lambda list of the generic function ++will mention &key (but no keyword arguments). ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Cons-Concepts.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++Cons Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses  

++
++
++

14.1 Cons Concepts

++ ++ ++

A cons ++ ++ is a compound data object ++having two components called the car and the cdr. ++

++
++
  car  cons    rplacd  
++  cdr  rplaca          
++
++  Figure 14–1: Some defined names relating to conses.
++
++
++ ++

Depending on context, a group of connected conses can be viewed ++in a variety of different ways. A variety of operations is provided to ++support each of these various views. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conses-Dictionary.html +@@ -0,0 +1,158 @@ ++ ++ ++ ++ ++ ++Conses Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conses  

++
++
++

14.2 Conses Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Conses  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conses-as-Forms.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Conses as Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.7 Conses as Forms

++ ++

A cons that is used as a form is called a compound form. ++

++

If the car of that compound form is a symbol, ++that symbol is the name of an operator, ++and the form is either a special form, a macro form, ++or a function form, depending on the function binding ++of the operator in the current lexical environment. ++If the operator is neither a special operator ++nor a macro name, it is assumed to be a function name ++(even if there is no definition for such a function). ++

++

If the car of the compound form is not a symbol, ++then that car must be a lambda expression, ++in which case the compound form is a lambda form. ++

++

How a compound form is processed depends on whether it is ++classified as a special form, a macro form, ++a function form, or a lambda form. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conses-as-Lists.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++Conses as Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Cons Concepts  

++
++
++

14.1.2 Conses as Lists

++ ++

A list ++ ++ is a chain of conses in which the car of each ++cons is an element of the list, ++and the cdr of each cons is either the next ++link in the chain or a terminating atom. ++

++

A proper list ++ ++ is a list terminated by the empty list. ++The empty list is a proper list, but is not a cons. ++

++

An improper list ++ ++ is a list that is not a proper list; ++that is, it is a circular list or a dotted list. ++

++

A dotted list ++ ++ is a list that has a terminating atom ++that is not the empty list. A non-nil atom by itself ++is not considered to be a list of any kind—not even a dotted list. ++

++

A circular list ++ ++ is a chain of conses that has no termination ++because some cons in the chain is the cdr of a later cons. ++

++
++
  append      last           nbutlast  rest       
++  butlast     ldiff          nconc     revappend  
++  copy-alist  list           ninth     second     
++  copy-list   list*          nreconc   seventh    
++  eighth      list-length    nth       sixth      
++  endp        make-list      nthcdr    tailp      
++  fifth       member         pop       tenth      
++  first       member-if      push      third      
++  fourth      member-if-not  pushnew              
++
++  Figure 14–3: Some defined names relating to lists.
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conses-as-Trees.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++Conses as Trees (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Cons Concepts  

++
++
++

14.1.1 Conses as Trees

++ ++

A tree ++ ++ is a binary recursive data structure made up of ++conses and atoms: ++the conses are themselves also trees ++(sometimes called “subtrees” or “branches”), and the atoms ++are terminal nodes (sometimes called leaves ++ ++). ++Typically, the leaves represent data while the branches ++establish some relationship among that data. ++

++
++
  caaaar  caddar  cdar       nsubst         
++  caaadr  cadddr  cddaar     nsubst-if      
++  caaar   caddr   cddadr     nsubst-if-not  
++  caadar  cadr    cddar      nthcdr         
++  caaddr  cdaaar  cdddar     sublis         
++  caadr   cdaadr  cddddr     subst          
++  caar    cdaar   cdddr      subst-if       
++  cadaar  cdadar  cddr       subst-if-not   
++  cadadr  cdaddr  copy-tree  tree-equal     
++  cadar   cdadr   nsublis                   
++
++  Figure 14–2: Some defined names relating to trees.
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Conses.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Conses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

14 Conses

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constant-Variables.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Constant Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.5 Constant Variables

++ ++

Certain variables, called constant variables, are reserved as “named constants.” ++The consequences are undefined if an attempt is made to ++ assign a value to, ++ or create ++a binding for a constant variable, ++except that a ‘compatible’ redefinition of a constant variable ++using defconstant is permitted; see the macro defconstant. ++

++

Keywords, ++symbols defined by Common Lisp or the implementation ++ as constant (such as nil, t, and pi), ++and symbols declared as constant using defconstant ++are constant variables. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constituent-Characters.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Constituent Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.1 Constituent Characters

++ ++

Constituent characters are used in tokens. ++A token ++ ++ is a representation of a number or a symbol. ++Examples of constituent characters are letters and digits. ++

++

Letters in symbol names are sometimes converted to ++letters in the opposite case when the name is read; ++see Effect of Readtable Case on the Lisp Reader. ++Case conversion can be suppressed by the use ++of single escape or multiple escape characters. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constituent-Traits.html +@@ -0,0 +1,134 @@ ++ ++ ++ ++ ++ ++Constituent Traits (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.2 Constituent Traits

++ ++

Every character has one or more constituent traits ++that define how the character is to be interpreted by the Lisp reader ++when the character is a constituent character. ++These constituent traits are ++ alphabetic_2, ++ digit, ++ package marker, ++ plus sign, ++ minus sign, ++ dot, ++ decimal point, ++ ratio marker, ++ exponent marker, ++ and invalid. ++Figure~2–8 shows the constituent traits ++of the standard characters ++and of certain semi-standard characters; ++no mechanism is provided for changing the constituent trait of a character. ++Any character with the alphadigit constituent trait ++in that figure is a digit if the current input base is greater ++than that character’s digit value, ++otherwise the character is alphabetic_2. ++Any character quoted by a single escape ++is treated as an alphabetic_2 constituent, regardless of its normal syntax. ++

++
++
 constituent traits         constituent traits                                   
++ character                  character   
++ ________________________________________________________________________________
++ Backspace   invalid        {           alphabetic_2                             
++ Tab         invalid*       }           alphabetic_2                             
++ Newline     invalid*       +           alphabetic_2, plus sign                  
++ Linefeed    invalid*       -           alphabetic_2, minus sign                 
++ Page        invalid*       .           alphabetic_2, dot, decimal point         
++ Return      invalid*       /           alphabetic_2, ratio marker               
++ Space       invalid*       A, a        alphadigit                               
++ !           alphabetic_2   B, b        alphadigit                               
++ "           alphabetic_2*  C, c        alphadigit                               
++ #           alphabetic_2*  D, d        alphadigit, double-float exponent marker 
++ $          alphabetic_2   E, e        alphadigit, float exponent marker        
++ %           alphabetic_2   F, f        alphadigit, single-float exponent marker 
++ &           alphabetic_2   G, g        alphadigit                               
++ ’           alphabetic_2*  H, h        alphadigit                               
++ (           alphabetic_2*  I, i        alphadigit                               
++ )           alphabetic_2*  J, j        alphadigit                               
++ *           alphabetic_2   K, k        alphadigit                               
++ ,           alphabetic_2*  L, l        alphadigit, long-float exponent marker   
++ 0-9         alphadigit     M, m        alphadigit                               
++ :           package marker N, n        alphadigit                               
++ ;           alphabetic_2*  O, o        alphadigit                               
++ <           alphabetic_2   P, p        alphadigit                               
++ =           alphabetic_2   Q, q        alphadigit                               
++ >           alphabetic_2   R, r        alphadigit                               
++ ?           alphabetic_2   S, s        alphadigit, short-float exponent marker  
++ @           alphabetic_2   T, t        alphadigit                               
++ [           alphabetic_2   U, u        alphadigit                               
++ \           alphabetic_2*  V, v        alphadigit                               
++ ]           alphabetic_2   W, w        alphadigit                               
++ ^           alphabetic_2   X, x        alphadigit                               
++ _           alphabetic_2   Y, y        alphadigit                               
++ ‘           alphabetic_2*  Z, z        alphadigit                               
++ |           alphabetic_2*  Rubout      invalid                                  
++ ~           alphabetic_2   
++
++ ++

  Figure 2–8: Constituent Traits of Standard Characters and Semi-Standard Characters ++

++

The interpretations in this table apply only to characters ++whose syntax type is constituent. ++Entries marked with an asterisk (*) are normally shadowed_2 ++because the indicated characters are of syntax type ++whitespace_2, ++macro character, ++single escape, ++or multiple escape; ++these constituent traits apply to them only if their syntax types ++are changed to constituent. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constraints-on-Macros-and-Compiler-Macros.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Constraints on Macros and Compiler Macros (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.3.3 Constraints on Macros and Compiler Macros

++ ++

Except where explicitly stated otherwise, no macro defined in ++the Common Lisp standard produces an expansion that could cause any of the ++subforms of the macro form to be treated as ++top level forms. If an implementation also provides a ++special operator definition of a Common Lisp macro, ++the special operator definition must be semantically equivalent ++in this respect. ++

++

Compiler macro expansions must also have the same ++top level evaluation semantics as the form which they replace. ++This is of concern both to conforming implementations and to ++conforming programs. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constraints-on-the-COMMON_002dLISP-Package-for-Conforming-Implementations.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Constraints on the COMMON-LISP Package for Conforming Implementations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.2 Constraints on the COMMON-LISP Package for Conforming Implementations

++ ++

In a conforming implementation, ++an external symbol of the COMMON-LISP package can have ++ a function, macro, or special operator definition, ++ a global variable definition ++ (or other status as a dynamic variable ++ due to a special proclamation), ++or a type definition ++only if explicitly permitted in this standard. ++For example, ++ fboundp yields false ++ for any external symbol of the COMMON-LISP package ++ that is not the name of a standardized ++ function, macro or special operator, ++and ++ boundp returns false ++ for any external symbol of the COMMON-LISP package ++ that is not the name of a standardized global variable. ++It also follows that ++ conforming programs can use external symbols of the COMMON-LISP package ++ as the names of local lexical variables ++ with confidence that those names have not been proclaimed special ++ by the implementation ++ unless those symbols are ++ names of standardized global variables. ++

++

A conforming implementation must not place any property on ++an external symbol of the COMMON-LISP package using a property indicator ++that is either an external symbol of any standardized package ++or a symbol that is otherwise accessible in the COMMON-LISP-USER package. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constraints-on-the-COMMON_002dLISP-Package-for-Conforming-Programs.html +@@ -0,0 +1,178 @@ ++ ++ ++ ++ ++ ++Constraints on the COMMON-LISP Package for Conforming Programs (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.3 Constraints on the COMMON-LISP Package for Conforming Programs

++ ++ ++ ++

Except where explicitly allowed, the consequences are undefined if any ++of the following actions are performed on an external symbol ++of the COMMON-LISP package: ++

++
++
1.
++

Binding or altering its value (lexically or dynamically). ++ (Some exceptions are noted below.) ++

++
++
2.
++

Defining, ++

++

undefining, ++

++

or binding it as a function. ++ (Some exceptions are noted below.) ++

++
++
3.
++

Defining, ++

++

undefining, ++

++

or binding it as a macro ++

++

or compiler macro. ++

++

(Some exceptions are noted below.) ++

++
++
4.
++

Defining it as a type specifier ++ (via defstruct, ++ defclass, ++ deftype, ++ define-condition). ++

++
++
5.
++

Defining it as a structure (via defstruct). ++

++
++
6.
++

Defining it as a declaration ++ with a declaration proclamation. ++

++
++
7.
++

Defining it as a symbol macro. ++

++
++
8.
++

Altering its home package. ++

++
++
9.
++

Tracing it (via trace). ++

++
++
10.
++

Declaring or proclaiming it ++ special ++ (via declare, ++

++

declaim, ++

++

or proclaim). ++

++
++
11.
++

Declaring or proclaiming its type or ftype ++ (via declare, ++

++

declaim, ++

++

or proclaim). ++ (Some exceptions are noted below.) ++

++
++
12.
++

Removing it from the COMMON-LISP package. ++

++
++
13.
++

Defining a setf expander for it ++ (via defsetf or define-setf-method). ++

++
++
14.
++

Defining, undefining, or binding its setf function name. ++

++
++
15.
++

Defining it as a method combination type ++ (via define-method-combination). ++

++
++
16.
++

Using it as the class-name argument ++ to setf of find-class. ++

++
++
17.
++

Binding it as a catch tag. ++

++
++
18.
++

Binding it as a restart name. ++

++
++
19.
++

Defining a method ++ for a standardized generic function ++ which is applicable when all of the arguments ++ are direct instances of standardized classes. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Constructing-Numbers-from-Tokens.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Constructing Numbers from Tokens (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.2 Constructing Numbers from Tokens

++ ++

A real is constructed directly from a corresponding numeric token; ++see Figure~2–9. ++

++

A complex is notated as a #C (or #c) followed by a list ++of two reals; see Sharpsign C. ++

++

The reader macros #B, #O, #X, and #R may also be useful ++in controlling the input radix in which rationals are parsed; ++ see Sharpsign B, ++ Sharpsign O, ++ Sharpsign X, ++ and Sharpsign R. ++

++

This section summarizes the full syntax for numbers. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Contagion-in-Numeric-Operations.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Contagion in Numeric Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1.3 Contagion in Numeric Operations

++ ++

For information about the contagion rules for implicit coercions of arguments ++in numeric operations, see ++ Rule of Float Precision Contagion, ++ Rule of Float and Rational Contagion, ++ and Rule of Complex Contagion. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Control-Transfer-Clauses.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Control Transfer Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.7.1 Control Transfer Clauses

++ ++

The named construct ++establishes a name for an implicit block surrounding the ++

++

entire ++

++

loop so that the return-from special operator can be used to return ++values from or to exit loop. ++Only one name per loop form can be assigned. ++If used, the named construct must be the first clause in the loop expression. ++

++

The return construct takes one form. ++ Any values returned by the form ++ are immediately returned by the loop form. ++

++

This construct is similar to the return-from special operator and the return macro. ++The return construct ++

++

does not execute any finally clause that ++

++

the loop form ++

++

is given. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Corresponding-Characters-in-the-Other-Case.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Corresponding Characters in the Other Case (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.6 Corresponding Characters in the Other Case

++ ++

The uppercase standard characters A through Z mentioned above ++respectively correspond to ++the lowercase standard characters a through z mentioned above. ++For example, the uppercase character E ++corresponds to the lowercase character e, and vice versa. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Creating-Conditions.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Creating Conditions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.2 Creating Conditions

++ ++

The function make-condition can be used to construct ++a condition object explicitly. Functions such as error, ++cerror, signal, and warn operate on ++conditions and might create condition objects ++implicitly. Macros such as ccase, ctypecase, ++ecase, etypecase, check-type, and ++assert might also implicitly create (and signal) ++conditions. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Creating-Instances-of-Classes.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Creating Instances of Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Classes  

++
++
++

4.3.3 Creating Instances of Classes

++ ++

The generic function make-instance creates and returns a new ++instance of a class. ++The object system provides several mechanisms for ++specifying how a new instance is to be initialized. For example, it ++is possible to specify the initial values for slots in newly created ++instances ++either by giving arguments to make-instance or by ++providing default initial values. Further initialization activities ++can be performed by methods written for generic functions ++that are ++part of the initialization protocol. The complete initialization ++protocol is described in Object Creation and Initialization. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Customizing-Class-Redefinition.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++Customizing Class Redefinition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.6.3 Customizing Class Redefinition

++ ++

[Reviewer Note by Barmar: This description is hard to follow.] ++

++

Methods for update-instance-for-redefined-class may be ++defined to specify actions to be taken when an instance is updated. ++If only after methods for update-instance-for-redefined-class are ++defined, they will be run after the system-supplied primary method for ++initialization and therefore will not interfere with the default ++behavior of update-instance-for-redefined-class. Because no ++initialization arguments are passed to update-instance-for-redefined-class ++when it is called by the system, the ++initialization forms for slots ++that are filled by before methods for update-instance-for-redefined-class ++will not be evaluated by shared-initialize. ++

++

Methods for shared-initialize may be defined to customize ++class redefinition. For more information, see Shared-Initialize. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Customizing-Reinitialization.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Customizing Reinitialization (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.3.1 Customizing Reinitialization

++ ++

Methods for reinitialize-instance may be defined to specify ++actions to be taken when an instance is updated. If only ++after methods for reinitialize-instance are defined, ++they will be run after the system-supplied primary method for ++initialization and therefore will not interfere with the default behavior of ++reinitialize-instance. ++

++

Methods for shared-initialize may be defined to customize ++class redefinition. For more information, see Shared-Initialize. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Customizing-the-Change-of-Class-of-an-Instance.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Customizing the Change of Class of an Instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.2.3 Customizing the Change of Class of an Instance

++ ++

Methods for update-instance-for-different-class may be defined ++to specify actions to be taken when an instance is updated. If only ++after methods for update-instance-for-different-class are ++defined, they will be run after the system-supplied primary method for ++initialization and will not interfere with the default behavior of ++update-instance-for-different-class. ++

++

Methods ++for shared-initialize may be defined to customize class ++redefinition. For more information, see Shared-Initialize. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Data-Type-Definition.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Data Type Definition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types  

++
++
++

4.2.1 Data Type Definition

++ ++

Information about type usage is located in ++the sections specified in Figure~4–1. ++Figure~4–7 lists some classes ++that are particularly relevant to the object system. ++Figure~9–1 lists the defined condition types. ++

++
++
  Section                                Data Type                         
++  _________________________________________________________________________
++  Classes                        Object System types               
++  Slots                          Object System types               
++  Objects                        Object System types               
++  Generic Functions and Methods  Object System types               
++  Condition System Concepts      Condition System types            
++  Types and Classes              Miscellaneous types               
++  Syntax                         All types—read and print syntax  
++  The Lisp Printer               All types—print syntax           
++  Compilation                    All types—compilation issues     
++
++           Figure 4–1: Cross-References to Data Type Information          
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Data-and-Control-Flow-Dictionary.html +@@ -0,0 +1,198 @@ ++ ++ ++ ++ ++ ++Data and Control Flow Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3 Data and Control Flow Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Data-and-Control-Flow.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Data and Control Flow (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

5 Data and Control Flow

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Data_002ddirected-Destructuring-by-Lambda-Lists.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Data-directed Destructuring by Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.4.2 Data-directed Destructuring by Lambda Lists

++ ++

In data-directed destructuring, ++the pattern is a sample object of the type to be decomposed. ++Wherever a component is to be extracted, ++a symbol appears in the pattern; ++this symbol is the name of the variable whose value will be that component. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Debugging-Utilities.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Debugging Utilities (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.1.2 Debugging Utilities

++ ++

Figure 25–2 shows defined names relating to ++debugging. ++

++
++
  *debugger-hook*  documentation    step     
++  apropos          dribble          time     
++  apropos-list     ed               trace    
++  break            inspect          untrace  
++  describe         invoke-debugger           
++
++  Figure 25–2: Defined names relating to debugging
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Declaration-Identifiers.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Declaration Identifiers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Declarations  

++
++
++

3.3.3 Declaration Identifiers

++ ++

Figure 3–9 shows a list of all ++declaration identifiers ++ ++

++

defined by this standard. ++

++
++
  declaration     ignore     special  
++  dynamic-extent  inline     type     
++  ftype           notinline           
++  ignorable       optimize            
++
++  Figure 3–9: Common Lisp Declaration Identifiers
++
++
++ ++

An implementation is free to support other (implementation-defined) ++declaration identifiers as well. ++A warning might be issued ++if a declaration identifier ++is not among those defined above, ++is not defined by the implementation, ++is not a type name, ++and has not been declared in a declaration proclamation. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Declaration-Scope.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++Declaration Scope (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Declarations  

++
++
++

3.3.4 Declaration Scope

++ ++

Declarations can be divided into two kinds: those that apply to the ++bindings of variables or functions; and those that ++do not apply to bindings. ++

++

A declaration that appears at the head of a binding form ++and applies to a variable or function binding ++made by that form is called a bound declaration ++ ++; ++such a declaration affects both the binding and ++any references within the scope of the declaration. ++

++

Declarations that are not bound declarations are called ++free declarations ++ ++. ++

++

A free declaration in a form F1 that applies to a binding ++for a name N established by some form F2 ++of which F1 is a subform ++affects only references to N within F1; it does not to apply to ++other references to N outside of F1, nor does it affect the manner ++in which the binding of N by F2 is established. ++

++

Declarations that do not apply to bindings can only appear ++as free declarations. ++

++

The scope of a bound declaration is the same as the ++lexical scope ++of the binding to which it applies; ++for special variables, ++this means the scope that the binding ++would have had had it been a lexical binding. ++

++

Unless explicitly stated otherwise, the scope of a ++free declaration includes only the body subforms of ++the form at whose head it appears, and no other subforms. ++The scope of free declarations specifically does not ++include initialization forms for bindings established ++by the form containing the declarations. ++

++

Some iteration forms include step, end-test, or result ++subforms that are also included in the scope ++of declarations that appear in the iteration form. ++Specifically, the iteration forms and subforms involved ++are: ++

++
++
*
++

do, do*: ++ step-forms, end-test-form, and result-forms. ++

++
*
++

dolist, dotimes: ++ result-form ++

++
*
++

do-all-symbols, do-external-symbols, do-symbols: ++ result-form ++

++
++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Declarations  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Declaration-Specifiers.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Declaration Specifiers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.3.2 Declaration Specifiers

++ ++

A declaration specifier ++ ++ is an expression that can appear at ++top level of a declare expression or a declaim form, or as ++the argument to proclaim. ++It is a list whose car is a declaration identifier, ++and whose cdr is data interpreted according to rules specific to ++the declaration identifier. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Declarations.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Declarations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation  

++
++
++

3.3 Declarations

++ ++ ++

Declarations ++ ++ provide a way of specifying information for use by ++program processors, such as the evaluator or the compiler. ++

++

Local declarations ++ ++

++

can be embedded in executable code using declare. ++Global declarations ++ ++, ++or proclamations ++ ++, ++are established by proclaim or declaim. ++

++

The the special form provides a shorthand notation for ++making a local declaration about the type of the ++value of a given form. ++

++

The consequences are undefined if a program violates a declaration ++or a proclamation. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Declarative-Method-Combination.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Declarative Method Combination (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.6 Declarative Method Combination

++ ++

The macro define-method-combination defines new forms of method ++combination. It provides a mechanism for customizing the production ++of the effective method. The default procedure for producing an ++effective method is described in Determining the Effective Method. ++There are two forms of ++define-method-combination. The short form is a simple facility while ++the long form is more powerful and more verbose. The long form ++resembles defmacro in that the body is an expression that ++computes a Lisp form; it provides mechanisms for implementing ++arbitrary control structures within method combination and for ++arbitrary processing of method qualifiers. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Declaring-the-Validity-of-Initialization-Arguments.html +@@ -0,0 +1,140 @@ ++ ++ ++ ++ ++ ++Declaring the Validity of Initialization Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.2 Declaring the Validity of Initialization Arguments

++ ++

Initialization arguments are checked for validity in each of the four ++situations that use them. An initialization argument may be valid in ++one situation and not another. For example, the system-supplied ++primary method for make-instance defined for ++the class standard-class checks the validity of its initialization arguments ++and signals an error if an initialization argument is supplied that is ++not declared as valid in that situation. ++

++

There are two means for declaring initialization arguments valid. ++

++
++
*
++

Initialization arguments that fill slots are declared as valid ++by the :initarg slot option to defclass. The ++:initarg slot option is inherited from superclasses. Thus ++the set of valid initialization arguments that fill slots for a ++class is the union of the initialization arguments that fill ++slots declared as valid by that class and its ++superclasses. Initialization arguments that fill slots ++are valid in all four contexts. ++

++
++
*
++

Initialization arguments that supply arguments to methods are ++declared as valid by defining those methods. The keyword name of ++each keyword parameter specified in the method’s ++lambda list becomes an initialization argument for all classes ++for which the method is applicable. ++

++

The presence of &allow-other-keys in the ++lambda list of an applicable method disables validity checking of ++initialization arguments. ++

++

Thus method inheritance ++controls the set of valid initialization arguments that supply arguments ++to methods. The generic functions for which method ++definitions serve to declare initialization arguments valid are as ++follows: ++

++
++

Making an instance of a class: ++allocate-instance, initialize-instance, and ++shared-initialize. Initialization arguments declared as valid ++by these methods are valid when making ++an instance of a class. ++

++
++
++

Re-initializing an instance: ++reinitialize-instance and shared-initialize. ++Initialization arguments declared as valid by these methods are ++valid when re-initializing an instance. ++

++
++
++

Updating an instance to conform to a redefined class: ++update-instance-for-redefined-class and shared-initialize. ++Initialization arguments declared as valid by these methods are ++valid when updating an instance to conform to a redefined class. ++

++
++
++

Updating an instance to conform to the definition of a ++different class: ++update-instance-for-different-class and shared-initialize. ++Initialization arguments declared as valid by these methods are ++valid when updating an instance to conform to the definition ++of a different class. ++

++
++
++ ++
++
++ ++

The set of valid initialization arguments for a class is the set of ++valid initialization arguments that either fill slots or supply ++arguments to methods, along with the predefined initialization ++argument :allow-other-keys. The default value for ++:allow-other-keys is nil. ++

++

Validity checking of initialization arguments is disabled if the value of ++the initialization argument :allow-other-keys is true. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Decoded-Time.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++Decoded Time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Time  

++
++
++

25.1.4.1 Decoded Time

++ ++

A decoded time ++ ++ is an ordered series of nine values that, taken together, ++represent a point in calendar time (ignoring leap seconds): ++

++
++
Second
++

An integer between 0 and~59, inclusive. ++

++
++
Minute
++

An integer between 0 and~59, inclusive. ++

++
++
Hour
++

An integer between 0 and~23, inclusive. ++

++
++
Date
++

An integer between 1 and~31, inclusive (the upper limit actually ++depends on the month and year, of course). ++

++
++
Month
++

An integer between 1 and 12, inclusive; ++1~means January, 2~means February, and so on; 12~means December. ++

++
++
Year
++

An integer indicating the year A.D. However, if this ++integer ++is between 0 and 99, the “obvious” year is used; more precisely, ++that year is assumed that is equal to the ++integer modulo 100 and ++within fifty years of the current year (inclusive backwards ++and exclusive forwards). ++Thus, in the year 1978, year 28 is 1928 ++but year 27 is 2027. (Functions that return time in this format always return ++a full year number.) ++

++
++
Day of week
++

An integer between~0 and~6, inclusive; ++0~means Monday, 1~means Tuesday, and so on; 6~means Sunday. ++

++
++
Daylight saving time flag
++

A generalized boolean that, ++if true, indicates that daylight saving time is in effect. ++

++
++
Time zone
++

A time zone. ++

++
++
++ ++

Figure 25–5 shows defined names relating to decoded time. ++

++
++
  decode-universal-time  get-decoded-time  
++
++  Figure 25–5: Defined names involving time in Decoded Time.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Default-Print_002dObject-Methods.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++Default Print-Object Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3 Default Print-Object Methods

++ ++

This section describes the default behavior of ++print-object methods for the standardized types. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Defaulting-of-Initialization-Arguments.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++Defaulting of Initialization Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.3 Defaulting of Initialization Arguments

++ ++

A default value form can be supplied for an initialization ++argument by using the :default-initargs class option. If an ++initialization argument is declared valid by some particular class, ++its default value form might be specified by a different class. ++In this case :default-initargs is used to supply a default value ++for an inherited initialization argument. ++

++

The :default-initargs option is used only to provide default ++values for initialization arguments; it does not declare a symbol ++as a valid initialization argument name. Furthermore, ++the :default-initargs option is used only to provide default values for ++initialization arguments when making an instance. ++

++

The argument to the :default-initargs class ++option is a list of ++alternating initialization argument names and forms. ++Each form is the ++default value form for the corresponding initialization ++argument. The default value form of an initialization ++argument is used and evaluated only if that initialization argument ++does not appear in the arguments to make-instance and is not ++defaulted by a more specific class. The default value form is ++evaluated in the lexical environment of the defclass form that ++supplied it; the resulting value is used as the initialization ++argument’s value. ++

++

The initialization arguments supplied to make-instance are combined ++with defaulted initialization arguments to produce a ++defaulted initialization argument list. A ++defaulted initialization argument list ++is a list of alternating initialization argument names and ++values in which unsupplied initialization arguments are defaulted and in ++which the explicitly supplied initialization arguments appear earlier in ++the list than the defaulted initialization arguments. Defaulted ++initialization arguments are ordered according to the order in the ++class precedence list of the classes that supplied the default values. ++

++

There is a distinction between the purposes of the ++:default-initargs and the :initform options with respect to the ++initialization of slots. The :default-initargs ++class option ++provides a mechanism for the user to give a default value form ++for an initialization argument without knowing whether the ++initialization argument initializes a slot ++or is passed to a method. ++If that initialization argument is not explicitly supplied in a call ++to make-instance, the default value form is used, just ++as if it had been supplied in the call. In contrast, the ++:initform slot option provides a mechanism for the user to give a ++default initial value form for a slot. An :initform form is ++used to initialize a slot only if no initialization argument ++associated with that slot is given as an argument to ++make-instance or is defaulted by :default-initargs. ++

++ ++ ++ ++ ++

The order of evaluation of default value forms for initialization ++arguments and the order of evaluation of :initform forms are ++undefined. If the order of evaluation is important, ++initialize-instance or shared-initialize methods ++should be used ++instead. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Define_002dmethod_002dcombination-Arguments-Lambda-Lists.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Define-method-combination Arguments Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.10 Define-method-combination Arguments Lambda Lists

++ ++

A define-method-combination arguments lambda list ++ ++ is used by ++the :arguments option to define-method-combination. ++

++

A define-method-combination arguments lambda list can contain the ++lambda list keywords shown in Figure 3–21. ++

++
++
  &allow-other-keys  &key       &rest   
++  &aux               &optional  &whole  
++
++  Figure 3–21: Lambda List Keywords used by Define-method-combination arguments Lambda Lists
++
++
++ ++

Define-method-combination arguments lambda lists are similar to ++ordinary lambda lists, but also permit the use of &whole. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Define_002dmodify_002dmacro-Lambda-Lists.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Define-modify-macro Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.9 Define-modify-macro Lambda Lists

++ ++

A define-modify-macro lambda list ++ ++ is used by ++define-modify-macro. ++

++

A define-modify-macro lambda list can contain the ++lambda list keywords shown in Figure 3–20. ++

++
++
  &optional  &rest  
++
++  Figure 3–20: Lambda List Keywords used by Define-modify-macro Lambda Lists
++
++
++ ++

Define-modify-macro lambda lists are similar to ++ordinary lambda lists, but do not support keyword arguments. ++define-modify-macro has no need match keyword arguments, and ++a rest parameter is sufficient. Aux variables are also ++not supported, since define-modify-macro has no body forms ++which could refer to such bindings. See the macro define-modify-macro. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Defining-Classes.html +@@ -0,0 +1,131 @@ ++ ++ ++ ++ ++ ++Defining Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.2 Defining Classes

++ ++

The macro defclass is used to define a new named class. ++

++

The definition of a class includes: ++

++
++
*
++

The name of the new class. ++ For newly-defined classes this name is a proper name. ++

++
++
*
++

The list of the direct superclasses of the new class. ++

++
++
*
++

A set of slot specifiers ++ ++. ++ Each slot specifier includes the name of the slot ++ and zero or more slot options. A slot option pertains ++ only to a single slot. If a class definition contains ++ two slot specifiers with the same name, an error is signaled. ++

++
++
*
++

A set of class options. ++ Each class option pertains to the class as a whole. ++

++
++
++ ++

The slot options and class options of ++the defclass form provide mechanisms for the following: ++

++
++
*
++

Supplying a default initial value form ++for a given slot. ++

++
++
*
++

Requesting that methods for generic functions ++be automatically generated for reading or writing slots. ++

++
++
*
++

Controlling whether a given slot is shared by ++all instances ++of the class or whether each ++instance of the class has its own slot. ++

++
++
*
++

Supplying a set of initialization arguments and initialization ++argument defaults to be used in instance creation. ++

++
++
*
++

Indicating that the metaclass is to be other ++than the default. The :metaclass option is reserved for future use; ++an implementation can be extended to make use of the :metaclass ++option. ++

++
++
*
++

Indicating the expected type for the value stored ++in the slot. ++

++
++
*
++

Indicating the documentation string for the slot. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Definition-of-Similarity.html +@@ -0,0 +1,204 @@ ++ ++ ++ ++ ++ ++Definition of Similarity (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4.4 Definition of Similarity

++ ++

Two objects S (in source code) and C (in compiled code) ++ are defined to be similar if and only if ++ they are both of one of the types listed here ++ (or defined by the implementation) ++ and they both satisfy all additional requirements of similarity ++ indicated for that type. ++

++
++
number
++

Two numbers S and C are similar if they are of the same type ++and represent the same mathematical value. ++

++
++
character
++

Two simple characters S and C are similar ++if they have similar code attributes. ++

++

Implementations providing additional, implementation-defined ++attributes must define whether and how non-simple characters ++can be regarded as similar. ++

++
++
symbol
++

Two apparently uninterned symbols S and C are similar ++if their ++names ++are similar. ++

++

Two interned symbols S and C are similar ++if their names are similar, ++and if either S is accessible in the current package at compile time ++ and C is accessible in the current package at load time, ++ or C is accessible in the package that is similar to ++ the home package of S. ++

++

(Note that similarity of ++symbols is dependent ++on neither the current readtable nor how the function read would ++parse the characters in the name of the symbol.) ++

++
++
package
++

Two packages S and C are similar if their names are similar. ++

++

Note that although a package object is an externalizable object, ++the programmer is responsible for ensuring that the corresponding package is ++already in existence when code referencing it as a literal object ++is loaded. The loader finds the corresponding package object ++as if by calling find-package with that name as an argument. ++An error is signaled by the loader if no package exists at load time. ++

++
++
random-state
++

Two random states S and C are similar if S ++would always produce the same sequence of pseudo-random numbers ++as a copy_5 of C ++when given as the random-state argument to the function random, ++assuming equivalent limit arguments in each case. ++

++

(Note that since C has been processed by the file compiler, ++it cannot be used directly as an argument to random ++because random would perform a side effect.) ++

++
++
cons
++

Two conses, S and C, are similar if ++ the car_2 of S is similar to the car_2 of C, ++and the cdr_2 of S is similar to the cdr_2 of C. ++

++
++
array
++

Two one-dimensional arrays, S and C, are similar if ++ the length of S is similar to the length of C, ++ the actual array element type of S is similar to ++ the actual array element type of C, ++ and each active element of S is similar to ++ the corresponding element of C. ++

++

Two arrays of rank other than one, S and C, are similar if ++ the rank of S is similar to the rank of C, ++ each dimension_1 of S is similar to ++ the corresponding dimension_1 of C, ++ the actual array element type of S is similar to ++ the actual array element type of C, ++ and each element of S is similar to ++ the corresponding element of C. ++

++

In addition, ++if S is a simple array, then C must also be a simple array. ++If S is a displaced array, ++ has a fill pointer, ++ or is actually adjustable, ++C is permitted to lack any or all of these qualities. ++

++
++
hash-table
++

Two hash tables S and C are similar if they meet the following ++three requirements: ++

++
++
1.
++

They both have the same test ++ (e.g., they are both eql hash tables). ++

++
++
2.
++

There is a unique one-to-one correspondence between the keys of ++ the two hash tables, such that the corresponding keys are ++ similar. ++

++
++
3.
++

For all keys, the values associated with two corresponding keys ++ are similar. ++

++
++ ++

If there is more than one possible one-to-one correspondence between ++the keys of S and C, the consequences are unspecified. ++A conforming program cannot use a table such as S as an ++externalizable constant. ++

++
++
pathname
++

Two pathnames S and C are similar if all corresponding ++pathname components are similar. ++

++
++
function
++
++

Functions are not externalizable objects. ++

++
++
structure-object and standard-object
++
++

A general-purpose concept of similarity does not exist for structures ++and standard objects. ++However, a conforming program is permitted to define a make-load-form ++method for any class K defined by that program that is ++a subclass of either structure-object or standard-object. ++The effect of such a method is to define that an object S of type K ++in source code is similar to an object C of type K ++in compiled code if C was constructed from code produced by ++calling make-load-form on S. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Definitions-of-Make_002dInstance-and-Initialize_002dInstance.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++Definitions of Make-Instance and Initialize-Instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.7 Definitions of Make-Instance and Initialize-Instance

++ ++

The generic function make-instance behaves as if it were defined as ++follows, except that certain optimizations are permitted: ++

++
++
 (defmethod make-instance ((class standard-class) &rest initargs)
++   ...
++   (let ((instance (apply #'allocate-instance class initargs)))
++     (apply #'initialize-instance instance initargs)
++     instance))
++
++ (defmethod make-instance ((class-name symbol) &rest initargs)
++   (apply #'make-instance (find-class class-name) initargs))
++
++ ++

The elided code in the definition of make-instance ++augments the initargs with any defaulted initialization arguments and ++checks the ++resulting ++initialization arguments to determine whether an initialization ++argument was supplied that neither filled a slot nor supplied an argument ++to an applicable method. ++

++

The generic function initialize-instance behaves as if it were ++defined as follows, except that certain optimizations are permitted: ++

++
++
 (defmethod initialize-instance ((instance standard-object) &rest initargs)
++   (apply #'shared-initialize instance t initargs)))
++
++ ++

These procedures can be customized. ++

++

Customizing at the Programmer Interface level includes using the ++:initform, :initarg, and :default-initargs options to ++defclass, as well as defining methods ++for make-instance, ++allocate-instance, ++and initialize-instance. It is also possible to define ++methods for shared-initialize, which would be invoked by the ++generic functions reinitialize-instance, ++update-instance-for-redefined-class, ++update-instance-for-different-class, and ++initialize-instance. ++The meta-object level supports additional ++customization. ++

++

Implementations are permitted to make certain optimizations to ++initialize-instance and shared-initialize. ++The description of shared-initialize in Chapter~7 mentions the ++possible optimizations. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Definitions.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Definitions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4 Definitions

++ ++ ++

This section contains notational conventions and definitions of terms ++used in this manual. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Defsetf-Lambda-Lists.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Defsetf Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Lambda Lists  

++
++
++

3.4.7 Defsetf Lambda Lists

++ ++

A defsetf lambda list ++ ++ is used by defsetf. ++

++

A defsetf lambda list has the following syntax: ++

++

lambda-list ::=({var}* ++                [&optional {var |         (var [init-form [supplied-p-parameter]])}*] ++                [&rest var] ++                [&key {var |              ({var |          (keyword-name var)}    [init-form [supplied-p-parameter]])}* pt [&allow-other-keys]] ++                [&environment var] ++

++

A defsetf lambda list can contain the lambda list keywords shown ++in Figure 3–19. ++

++
++
  &allow-other-keys  &key       &rest  
++  &environment       &optional         
++
++  Figure 3–19: Lambda List Keywords used by Defsetf Lambda Lists
++
++
++ ++

A defsetf lambda list differs from an ordinary lambda list ++only in that it does not permit the use of &aux, ++and that it permits use of &environment, ++ which introduces an environment parameter. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Deftype-Lambda-Lists.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Deftype Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.8 Deftype Lambda Lists

++ ++

A deftype lambda list ++ ++ is used by deftype. ++

++

A deftype lambda list has the same syntax as a macro lambda list, ++and can therefore contain the lambda list keywords as a macro lambda list. ++

++

A deftype lambda list differs from a macro lambda list ++only in that if no init-form is supplied for an optional parameter ++or keyword parameter in the lambda-list, the default value ++for that parameter is the symbol * (rather than nil). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Deprecated-Argument-Conventions.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Deprecated Argument Conventions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.8.2 Deprecated Argument Conventions

++ ++

The ability to pass a numeric argument to gensym has been deprecated. ++

++

The :test-not argument to the functions in Figure 1–3 are deprecated. ++

++
++
  adjoin             nset-difference    search            
++  assoc              nset-exclusive-or  set-difference    
++  count              nsublis            set-exclusive-or  
++  delete             nsubst             sublis            
++  delete-duplicates  nsubstitute        subsetp           
++  find               nunion             subst             
++  intersection       position           substitute        
++  member             rassoc             tree-equal        
++  mismatch           remove             union             
++  nintersection      remove-duplicates                    
++
++  Figure 1–3: Functions with Deprecated :TEST-NOT Arguments
++
++
++ ++

The use of the situation names compile, load, and eval ++in eval-when is deprecated. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Deprecated-Functions.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Deprecated Functions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.8.1 Deprecated Functions

++ ++

The functions in Figure 1–2 are deprecated. ++

++
  assoc-if-not   nsubst-if-not       require            
++  count-if-not   nsubstitute-if-not  set                
++  delete-if-not  position-if-not     subst-if-not       
++  find-if-not    provide             substitute-if-not  
++  gentemp        rassoc-if-not                          
++  member-if-not  remove-if-not                          
++
++            Figure 1–2: Deprecated Functions           
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Deprecated-Language-Features.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Deprecated Language Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.8 Deprecated Language Features

++ ++ ++

Deprecated language features are not expected to appear in future Common Lisp ++standards, but are required to be implemented for conformance with this ++standard; see Required Language Features. ++

++

Conforming programs can use deprecated features; ++however, it is considered good programming style to avoid them. ++It is permissible for the compiler to produce style warnings ++about the use of such features at compile time, ++but there should be no such warnings at program execution time. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Deprecated-Reader-Syntax.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Deprecated Reader Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.8.4 Deprecated Reader Syntax

++ ++

The #S reader macro forces keyword names into the KEYWORD package; ++see Sharpsign S. ++This feature is deprecated; ++in the future, keyword names will be taken in the package they are read in, ++so symbols that are actually in the KEYWORD package ++should be used if that is what is desired. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Deprecated-Variables.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Deprecated Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.8.3 Deprecated Variables

++ ++

The variable *modules* is deprecated. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Designators.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++Designators (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Notational Conventions  

++
++
++

1.4.1.12 Designators

++ ++

A designator ++ ++ is an object that denotes another object. ++

++

Where a parameter of an operator is described as a designator, ++the description of the operator is written in a way that assumes that ++the value of the parameter is the denoted object; ++that is, that the parameter is already of the denoted type. ++(The specific nature of the object denoted by ++ a “<<type>> designator” ++or a “designator for a <<type>>” ++can be found in the Glossary entry for “<<type>> designator.”) ++

++

For example, “nil” and “the value of *standard-output*” are operationally ++indistinguishable as stream designators. Similarly, ++the symbol foo and the string "FOO" ++are operationally indistinguishable as string designators. ++

++

Except as otherwise noted, in a situation where the denoted object ++might be used multiple times, it is implementation-dependent ++whether the object is coerced only once or whether the coercion occurs ++each time the object must be used. ++

++

For example, mapcar receives a function designator as an argument, ++and its description is written as if this were simply a function. In fact, it ++is implementation-dependent whether the function designator is ++coerced right away or whether it is carried around internally in the form that ++it was given as an argument and re-coerced each time it is needed. In most ++cases, conforming programs cannot detect the distinction, but there are some ++pathological situations (particularly those involving self-redefining or ++mutually-redefining functions) which do conform and which can detect this difference. ++The following program is a conforming program, but might or might not have ++portably correct results, depending on whether its correctness depends on one or ++the other of the results: ++

++
++
 (defun add-some (x) 
++   (defun add-some (x) (+ x 2))
++   (+ x 1)) ⇒  ADD-SOME
++ (mapcar 'add-some '(1 2 3 4))
++⇒  (2 3 4 5)
++OR⇒ (2 4 5 6)
++
++ ++

In a few rare situations, there may be a need in a dictionary entry ++to refer to the object that was the original designator ++for a parameter. ++Since naming the parameter would refer to the denoted object, ++the phrase “the <<parameter-name>> designator” ++can be used to refer to the designator which was the argument ++from which the value of <<parameter-name>> was computed. ++

++
++
++

++Next: , Previous: , Up: Notational Conventions  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Destructive-Operations.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Destructive Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.7 Destructive Operations

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Destructuring-Lambda-Lists.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Destructuring Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Lambda Lists  

++
++
++

3.4.5 Destructuring Lambda Lists

++ ++

A destructuring lambda list ++ ++ is used by destructuring-bind. ++

++

Destructuring lambda lists are closely related to ++macro lambda lists; see Macro Lambda Lists. ++A destructuring lambda list can contain all of the ++lambda list keywords listed for macro lambda lists ++except for &environment, and supports destructuring in the ++same way. Inner lambda lists nested within a macro lambda list ++have the syntax of destructuring lambda lists. ++

++

A destructuring lambda list has the following syntax: ++

++ ++

reqvars ::={var | !lambda-list}* ++

++

optvars ::=[&optional {var |         ({var | !lambda-list[init-form [supplied-p-parameter]])}*] ++

++

restvar ::=[{&rest | &body} {var | !lambda-list}] ++

++

keyvars ::=[&key {var |              ({var |          (keyword-name {var | !lambda-list})}    [init-form [supplied-p-parameter]])}* ++            [&allow-other-keys]] ++

++ ++

auxvars ::=[&aux {var | (var [init-form])}*] ++

++

envvar ::=[&environment var] ++

++

wholevar ::=[&whole var] ++

++

lambda-list ::=(!wholevar !reqvars !optvars !restvar !keyvars !auxvars) | ++                (!wholevar !reqvars !optvars . var) ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Destructuring-Mismatch.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Destructuring Mismatch (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.8 Destructuring Mismatch

++ ++

When matching a destructuring lambda list against a form, ++the pattern and the form must have compatible tree structure, ++as described in Macro Lambda Lists. ++

++

Otherwise, in a safe call, ++an error of type program-error must be signaled; ++and in an unsafe call the situation has undefined consequences. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Destructuring-by-Lambda-Lists.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Destructuring by Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.4.1 Destructuring by Lambda Lists

++ ++

Anywhere in a macro lambda list where a parameter ++name can appear, and where ordinary lambda list syntax ++(as described in Ordinary Lambda Lists) does not ++otherwise allow a list, a destructuring lambda list ++can appear in place ++of the parameter name. When this is done, then the argument ++that would match the parameter is treated as a (possibly dotted) list, ++to be used as an argument list for satisfying the ++parameters in the embedded lambda list. ++This is known as destructuring. ++

++

Destructuring is the process of decomposing a compound object into ++its component parts, using an abbreviated, declarative syntax, rather ++than writing it out by hand using the primitive component-accessing ++functions. Each component part is bound to a variable. ++

++

A destructuring operation requires an object to be decomposed, ++a pattern that specifies what components are to be extracted, and the names ++of the variables whose values are to be the components. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Destructuring.html +@@ -0,0 +1,185 @@ ++ ++ ++ ++ ++ ++Destructuring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.15 Destructuring

++ ++

The d-type-spec argument is used for destructuring. ++If the ++d-type-spec argument consists solely of the type fixnum, ++float, t, or nil, the of-type keyword is optional. ++The of-type construct is optional in these cases to provide backwards ++compatibility; thus, the following two expressions are the same: ++

++
++
;;; This expression uses the old syntax for type specifiers.
++ (loop for i fixnum upfrom 3 ...)
++
++;;; This expression uses the new syntax for type specifiers.
++ (loop for i of-type fixnum upfrom 3 ...)
++
++;; Declare X and Y to be of type VECTOR and FIXNUM respectively.
++ (loop for (x y) of-type (vector fixnum) 
++       in l do ...)
++
++ ++

A type specifier for a destructuring pattern is a tree of ++type specifiers with the same shape as the tree of ++variable names, with the following exceptions: ++

++
++
*
++

When aligning the trees, an atom in the ++tree of type specifiers that matches a cons ++in the variable tree declares the same type for each variable ++in the subtree rooted at the cons. ++

++
++
*
++

A cons in the tree of type specifiers that ++matches an atom in the tree of variable names ++is a compound type specifer. ++

++
++
++ ++

Destructuring allows binding of a set of variables to a corresponding ++set of values anywhere that a value can normally be bound to a single ++variable. During loop expansion, ++each variable in the variable list ++is matched with the values in the values list. If there are more variables ++in the variable list than there are values in the values list, the ++remaining variables are given a value of nil. If there are more ++values than variables listed, the extra values are discarded. ++

++

To assign values from a list to the variables a, ++b, and c, the for clause could be used to ++bind the variable numlist to the ++car of the supplied form, ++and then another for clause could be used to bind the variables ++a, b, and c sequentially. ++

++
++
;; Collect values by using FOR constructs.
++ (loop for numlist in '((1 2 4.0) (5 6 8.3) (8 9 10.4))
++       for a of-type integer = (first numlist)
++       and b of-type integer = (second numlist)
++       and c of-type float = (third numlist)
++       collect (list c b a))
++⇒  ((4.0 2 1) (8.3 6 5) (10.4 9 8))
++
++ ++

Destructuring makes this process easier by allowing the variables to ++be bound in each loop iteration. ++Types can be declared by using a ++list of type-spec arguments. If ++all the types ++are the same, a shorthand destructuring syntax can be used, as the second ++example illustrates. ++

++
++
;; Destructuring simplifies the process.
++ (loop for (a b c) of-type (integer integer float) in
++       '((1 2 4.0) (5 6 8.3) (8 9 10.4))
++       collect (list c b a))
++⇒  ((4.0 2 1) (8.3 6 5) (10.4 9 8))
++
++;; If all the types are the same, this way is even simpler.
++ (loop for (a b c) of-type float in
++       '((1.0 2.0 4.0) (5.0 6.0 8.3) (8.0 9.0 10.4))
++       collect (list c b a))
++⇒  ((4.0 2.0 1.0) (8.3 6.0 5.0) (10.4 9.0 8.0))
++
++ ++

If destructuring is used to declare or initialize a number of groups ++of variables into types, the loop keyword and can be used ++to simplify the process further. ++

++
++
;; Initialize and declare variables in parallel by using the AND construct.\kern-7pt
++ (loop with (a b) of-type float = '(1.0 2.0)
++       and (c d) of-type integer = '(3 4)
++       and (e f)
++       return (list a b c d e f))
++⇒  (1.0 2.0 3 4 NIL NIL)
++
++ ++

If nil is used in a destructuring list, no variable is provided for ++its place. ++

++
++
 (loop for (a nil b) = '(1 2 3)
++       do (return (list a b)))
++⇒  (1 3)
++
++ ++

Note that ++dotted lists ++can specify destructuring. ++

++
++
 (loop for (x . y) = '(1 . 2)
++       do (return y))
++⇒  2
++ (loop for ((a . b) (c . d)) of-type ((float . float) (integer . integer)) in
++       '(((1.2 . 2.4) (3 . 4)) ((3.4 . 4.6) (5 . 6)))
++       collect (list a b c d))
++⇒  ((1.2 2.4 3 4) (3.4 4.6 5 6))
++
++ ++

An error of type program-error is signaled (at macro expansion time) ++if the same variable is bound twice in any variable-binding ++clause of a single loop expression. Such variables include ++local variables, iteration control variables, and variables found by ++destructuring. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Determining-the-Class-Precedence-List.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Determining the Class Precedence List (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Classes  

++
++
++

4.3.5 Determining the Class Precedence List

++ ++

The defclass form for a class provides a total ordering ++on that class and its direct superclasses. This ordering is ++called the local precedence order ++ ++. It is an ordered list of the ++class and its direct superclasses. The ++class precedence list ++ ++ for a class C is a total ordering on ++C and its superclasses that is consistent with the ++local precedence orders for each of C and its superclasses. ++

++

A class precedes its direct superclasses, ++and a direct superclass precedes all other ++direct superclasses specified to its right ++in the superclasses list of the defclass form. ++For every class C, define ++

R_C={(C,C_1),(C_1,C_2),...,(C_{n-1},C_n)} ++

where C_1,...,C_n are ++the direct superclasses of C in the order in which ++they are mentioned in the defclass form. These ordered pairs ++generate the total ordering on the class C and its direct ++superclasses. ++

++

Let S_C be the set of C and its superclasses. Let R be ++

++
R=\bigcup_{c\in S_C }R_c ++

. ++

++

[Reviewer Note by Barmar: “Consistent” needs to be defined, or maybe we should say ++“logically consistent”?] ++

++

The set R might or might not generate a partial ordering, depending on ++whether the R_c, c\in S_C, are ++consistent; it is assumed ++that they are consistent and that R generates a partial ordering. ++When the R_c are not consistent, it is said that R is inconsistent. ++

++

To compute the class precedence list for~C, ++topologically sort the elements of S_C with respect to the ++partial ordering generated by R. When the topological ++sort must select a class from a set of two or more ++classes, none of ++which are preceded by other classes with respect to~R, ++the class selected is chosen deterministically, as described below. ++

++

If R is inconsistent, an error is signaled. ++

++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Classes  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Determining-the-Effective-Method.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Determining the Effective Method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.1 Determining the Effective Method

++ ++

The effective method is determined by the following three-step procedure: ++

++
++
1.
++

Select the applicable methods. ++

++
++
2.
++

Sort the applicable methods by precedence order, putting ++the most specific method first. ++

++
++
3.
++

Apply method combination to the sorted list of ++applicable methods, producing the effective method. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Dictionary-Entries-for-Type-Specifiers.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Dictionary Entries for Type Specifiers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.6 Dictionary Entries for Type Specifiers

++ ++

The atomic type specifiers are those defined names ++listed in Figure~4–2. ++Such dictionary entries are of kind ++“Class,” “Condition Type,” “System Class,” or “Type.” ++A description of how to interpret ++a symbol naming one of these types or classes ++as an atomic type specifier ++is found in The "Description" Section of such dictionary entries. ++

++

The compound type specifiers are those defined names ++listed in Figure~4–3. ++Such dictionary entries are of kind “Class,” “System Class,” ++“Type,” or “Type Specifier.” ++A description of how to interpret as a compound type specifier ++a list whose car is such a symbol ++is found in the ++ “Compound Type Specifier Kind,” ++ “Compound Type Specifier Syntax,” ++ “Compound Type Specifier Arguments,” ++ and “Compound Type Specifier Description” ++sections of such dictionary entries. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Digits-in-a-Radix.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Digits in a Radix (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.10 Digits in a Radix

++ ++

What qualifies as a digit depends on the radix ++(an integer between 2 and 36, inclusive). ++The potential digits are: ++

++

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ++

++

Their respective weights are 0, 1, 2, ... 35. ++In any given radix n, only the first n potential digits ++are considered to be digits. ++For example, ++the digits in radix 2 are 0 and 1, ++the digits in radix 10 are 0 through 9, and ++the digits in radix 16 are 0 through F. ++

++

Case is not significant in digits; ++for example, in radix 16, both F and f ++are digits with weight 15. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Directory-Components-in-Non_002dHierarchical-File-Systems.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Directory Components in Non-Hierarchical File Systems (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.16 Directory Components in Non-Hierarchical File Systems

++ ++

In non-hierarchical file systems, ++the only valid list values for the directory component of a pathname ++are (:absolute string) and (:absolute :wild). ++:relative directories and the keywords ++:wild-inferiors, :up, and :back are not used ++in non-hierarchical file systems. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Documentation-of-Extensions.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Documentation of Extensions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.3 Documentation of Extensions

++ ++

A conforming implementation shall be accompanied by a ++document that separately describes any features accepted by the ++implementation that are not specified in this standard, but that do not ++cause any ambiguity or contradiction when added to the language ++standard. Such extensions shall be described as being “extensions to ++Common Lisp as specified by ANSI <<standard number>>.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Documentation-of-Implementation_002dDefined-Scripts.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++Documentation of Implementation-Defined Scripts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Character Concepts  

++
++
++

13.1.10 Documentation of Implementation-Defined Scripts

++ ++

An implementation must document the character scripts ++ it supports. For each character script supported, ++ the documentation must describe at least the following: ++

++
*
++

Character labels, glyphs, and descriptions. ++ Character labels must be uniquely named using only Latin capital letters A–Z, ++ hyphen (-), and digits 0–9. ++

++
*
++

Reader canonicalization. ++ Any mechanisms by which read treats ++ different characters as equivalent must be documented. ++

++
*
++

The impact on char-upcase, ++ char-downcase, ++ and the case-sensitive format directives. ++ In particular, for each character with case, ++ whether it is uppercase or lowercase, ++ and which character is its equivalent in the opposite case. ++

++
*
++

The behavior of the case-insensitive functions ++ char-equal, char-not-equal, ++ char-lessp, char-greaterp, ++ char-not-greaterp, and char-not-lessp. ++

++
*
++

The behavior of any character predicates; ++ in particular, the effects of ++ alpha-char-p, ++ lower-case-p, ++ upper-case-p, ++ both-case-p, ++ graphic-char-p, ++ and ++ alphanumericp. ++

++
*
++

The interaction with file I/O, in particular, ++ the supported coded character sets (for example, ISO8859/1-1987) ++ and external encoding schemes supported are documented. ++

++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Documentation-of-Implementation_002dDependent-Features.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Documentation of Implementation-Dependent Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.2 Documentation of Implementation-Dependent Features

++ ++

A conforming implementation shall be accompanied by a document ++that provides a definition of all implementation-defined ++aspects of the language defined by this specification. ++

++

In addition, a conforming implementation is encouraged (but not required) ++to document items in this standard that are identified as ++implementation-dependent, although in some cases ++such documentation might simply identify the item as “undefined.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Double_002dQuote.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Double-Quote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++
++

2.4.5 Double-Quote

++ ++

Syntax: "<<text>>" ++

++

The double-quote is used to begin and end a string. ++When a double-quote is encountered, ++characters are read from the input stream ++and accumulated until another double-quote is encountered. ++If a single escape character is seen, ++the single escape character is discarded, ++the next character is accumulated, and accumulation continues. ++The accumulated characters ++up to but not including the matching double-quote ++are made into a simple string and returned. ++

++

It is implementation-dependent ++which attributes of the accumulated characters are removed in this process. ++

++

Examples of the use of the double-quote character are in Figure 2–18. ++

++
++
  "Foo"                      ;A string with three characters in it  
++  ""                         ;An empty string                       
++  "\"APL\\360?\" he cried."  ;A string with twenty characters       
++  "|x| = |-x|"               ;A ten-character string                
++
++          Figure 2–18: Examples of the use of double-quote         
++
++
++ ++

Note that to place a single escape character or a double-quote into a string, ++such a character must be preceded by a single escape character. ++Note, too, that a multiple escape character need not be quoted by a ++single escape character within a string. ++

++

For information on how the Lisp printer prints strings, ++see Printing Strings. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Dynamic-Control-of-the-Arrangement-of-Output.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++Dynamic Control of the Arrangement of Output (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.1.1 Dynamic Control of the Arrangement of Output

++ ++

The actions of the pretty printer when a piece of output is too ++large to fit in the space available can be precisely controlled. ++Three concepts underlie ++the way these operations work—logical blocks ++ ++, ++ conditional newlines ++ ++, ++ and sections ++ ++. ++Before proceeding further, it is important to define these terms. ++

++

The first line of Figure 22–3 shows a schematic piece of output. Each of ++the characters in the output is represented by “-”. The positions of ++conditional newlines are indicated by digits. The beginnings and ends of ++logical blocks are indicated by “<” and “>” respectively. ++

++

The output as a whole is a logical block and the outermost section. This ++section is indicated by the 0’s on the second line of Figure 1. Logical ++blocks nested within the output are specified by the macro ++pprint-logical-block. Conditional newline positions are specified ++by calls to pprint-newline. Each conditional newline defines ++two sections (one before it and one after it) and is associated with a ++third (the section immediately containing it). ++

++

The section after a conditional newline consists of: all the output up to, ++but not including, (a) the next conditional newline immediately contained ++in the same logical block; or if (a) is not applicable, (b) the next ++newline that is at a lesser level of nesting in logical blocks; or if (b) ++is not applicable, (c) the end of the output. ++

++

The section before a conditional newline consists of: all the output back ++to, but not including, (a) the previous conditional newline that is ++immediately contained in the same logical block; or if (a) is not ++applicable, (b) the beginning of the immediately containing logical block. ++The last four lines in Figure 1 indicate the sections before and after the ++four conditional newlines. ++

++

The section immediately containing a conditional newline is the shortest ++section that contains the conditional newline in question. In Figure 22–3, ++the first conditional newline is immediately contained in the section ++marked with 0’s, the second and third conditional newlines are immediately ++contained in the section before the fourth conditional newline, and the ++fourth conditional newline is immediately contained in the section after ++the first conditional newline. ++

++
++
 <-1---<--<--2---3->--4-->->
++ 000000000000000000000000000
++ 11 111111111111111111111111
++           22 222
++              333 3333
++        44444444444444 44444
++
++ ++

  Figure 22–2: Example of Logical Blocks, Conditional Newlines, and Sections ++

++

Whenever possible, the pretty printer displays the entire contents of a ++section on a single line. However, if the section is too long to fit in ++the space available, line breaks are inserted at conditional newline ++positions within the section. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Dynamic-Control-of-the-Lisp-Reader.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Dynamic Control of the Lisp Reader (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.1.1 Dynamic Control of the Lisp Reader

++ ++

Various aspects of the Lisp reader can be controlled dynamically. ++See Readtables and Variables that affect the Lisp Reader. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Dynamic-Environments.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Dynamic Environments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.1.2 Dynamic Environments

++ ++

A dynamic environment ++ ++ for evaluation is that part of an ++environment that contains bindings whose duration ++is bounded by points of establishment and disestablishment ++within the execution of the form that ++established the binding. ++A dynamic environment contains, among other things, the following: ++

++
++
*
++

bindings for dynamic variables. ++

++
*
++

information about active catch tags. ++

++
*
++

information about exit points established by unwind-protect. ++

++
*
++

information about active handlers and restarts. ++

++
++ ++

The dynamic environment that is active at any given point ++in the execution of a program is referred to by ++definite reference as “the current dynamic environment,” ++or sometimes as just “the dynamic environment.” ++

++

Within a given namespace, ++a name is said to be bound ++in a dynamic environment if there is a binding ++associated with its name in the dynamic environment ++or, if not, there is a binding ++associated with its name in the global environment. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Dynamic-Variables.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++Dynamic Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.4 Dynamic Variables

++ ++

A variable is a dynamic variable if one of the following ++conditions hold: ++

++
++
*
++

It is locally declared or globally proclaimed special. ++

++
++
*
++

It occurs textually within a form that ++creates a dynamic binding for a variable of the same name, ++and the binding is not shadowed_2 by a form ++that creates a lexical binding of the same variable name. ++

++
++
++ ++

A dynamic variable can be referenced at any time in any program; ++there is no textual limitation on references to dynamic variables. ++At any given time, all dynamic variables with a given name refer to ++exactly one binding, either in the dynamic environment ++or in the global environment. ++

++

The value part of the binding for a dynamic variable might ++be empty; in this case, the dynamic variable is said to have no value, ++or to be unbound. A dynamic variable can be made unbound ++by using makunbound. ++

++

The effect of binding a dynamic variable is to create ++a new binding to which all references to that dynamic variable ++in any program refer for the duration of the evaluation of the form ++that creates the dynamic binding. ++

++

A dynamic variable can be referenced outside the dynamic extent of ++a form that binds it. Such a variable is sometimes called ++a “global variable” but is still in all respects just a dynamic variable ++whose binding happens to exist in the global environment rather than in some ++dynamic environment. ++

++

A dynamic variable is unbound ++unless and until explicitly assigned a value, except for ++those variables whose initial value is ++defined in this specification or by an implementation. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Effect-of-Readtable-Case-on-the-Lisp-Printer.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++Effect of Readtable Case on the Lisp Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.10 Effect of Readtable Case on the Lisp Printer

++ ++

When ++printer escaping is disabled, ++or the characters under consideration are not already ++quoted specifically by single escape or multiple escape ++syntax, ++

++

the readtable case of the current readtable ++affects the way the Lisp printer writes symbols ++in the following ways: ++

++
++
:upcase
++

When the readtable case is :upcase, ++ uppercase characters ++ are printed in the case specified by *print-case*, and ++ lowercase characters are printed in their own case. ++

++
++
:downcase
++

When the readtable case is :downcase, ++ uppercase characters are printed in their own case, and ++ lowercase characters ++ are printed in the case specified by *print-case*. ++

++
++
:preserve
++

When the readtable case is :preserve, ++ all alphabetic characters are printed in their own case. ++

++
++
:invert
++

When the readtable case is :invert, ++ the case of all alphabetic characters ++ in single case symbol names is inverted. ++ Mixed-case symbol names are printed as is. ++

++
++ ++

The rules for escaping alphabetic characters in symbol names are affected by ++the readtable-case ++

++

if printer escaping is enabled. ++

++

Alphabetic characters are escaped as follows: ++

++
:upcase
++

When the readtable case is :upcase, ++all lowercase characters must be escaped. ++

++
++
:downcase
++

When the readtable case is :downcase, ++all uppercase characters must be escaped. ++

++
++
:preserve
++

When the readtable case is :preserve, ++no alphabetic characters need be escaped. ++

++
++
:invert
++

When the readtable case is :invert, ++no alphabetic characters need be escaped. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Effect-of-Readtable-Case-on-the-Lisp-Reader.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++Effect of Readtable Case on the Lisp Reader (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.1.2 Effect of Readtable Case on the Lisp Reader

++ ++

The readtable case of the current readtable affects the Lisp reader ++in the following ways: ++

++
++
:upcase
++

When the readtable case is :upcase, ++ unescaped constituent characters are converted to uppercase, ++ as specified in Reader Algorithm. ++

++
++
:downcase
++

When the readtable case is :downcase, ++ unescaped constituent characters are converted to lowercase. ++

++
++
:preserve
++

When the readtable case is :preserve, ++ the case of all characters remains unchanged. ++

++
++
:invert
++

When the readtable case is :invert, ++ then if all of the unescaped letters in the extended token are of the same case, ++ those (unescaped) letters are converted to the opposite case. ++

++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Embedded-Newlines-in-Condition-Reports.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Embedded Newlines in Condition Reports (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3.4 Embedded Newlines in Condition Reports

++ ++

Especially if it is long, it is permissible and appropriate for ++a report message to contain one or more embedded newlines. ++

++

If the calling routine conventionally inserts some additional prefix ++(such as “Error: ” or “;; Error: ”) on the first line of ++the message, it must also assure that an appropriate prefix will be ++added to each subsequent line of the output, so that the left edge of ++the message output by the condition reporter will still be properly ++aligned. ++

++
++
 (defun test ()
++   (error "This is an error message.~%It has two lines."))
++
++ ;; Implementation A
++ (test)
++ This is an error message.
++ It has two lines.
++
++ ;; Implementation B
++ (test)
++ ;; Error: This is an error message.
++ ;;        It has two lines.
++
++ ;; Implementation C
++ (test)
++ >> Error: This is an error message. 
++           It has two lines.
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Environment-Dictionary.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++Environment Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Environment  

++
++
++

25.2 Environment Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Environment-Inquiry.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Environment Inquiry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The External Environment  

++
++
++

25.1.3 Environment Inquiry

++ ++

Environment inquiry defined names provide information about ++the hardware and software configuration on which a Common Lisp program is ++being executed. ++

++

Figure 25–3 shows defined names relating to environment inquiry. ++

++
++
  *features*                   machine-instance  short-site-name   
++  lisp-implementation-type     machine-type      software-type     
++  lisp-implementation-version  machine-version   software-version  
++  long-site-name               room                                
++
++    Figure 25–3: Defined names relating to environment inquiry.   
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Environment-Objects.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Environment Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.1.5 Environment Objects

++ ++

Some operators make use of an object, ++called an environment object ++ ++, ++that represents the set of lexical bindings needed to perform ++semantic analysis on a form in a given lexical environment. ++The set of bindings in an environment object ++may be a subset of the bindings that would be needed to actually ++perform an evaluation; for example, values associated with ++variable names and function names in the corresponding ++lexical environment might not be available in an environment object. ++

++

The type and nature of an environment object is implementation-dependent. ++The values of environment parameters to macro functions ++are examples of environment objects. ++

++

The object nil when used as an environment object ++denotes the null lexical environment; ++see The Null Lexical Environment. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Environment.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Environment (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

25 Environment

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Error-Checking-in-Function-Calls.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Error Checking in Function Calls (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5 Error Checking in Function Calls

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Error-Detection-Time-in-Safe-Calls.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Error Detection Time in Safe Calls (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.2 Error Detection Time in Safe Calls

++ ++

If an error is signaled in a safe call, ++the exact point of the signal is implementation-dependent. ++In particular, it might be signaled at compile time or at run time, ++and if signaled at run time, ++it might be prior to, during, or after executing the call. ++However, it is always prior to the execution of the body of the function ++being called. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Error-Terminology.html +@@ -0,0 +1,280 @@ ++ ++ ++ ++ ++ ++Error Terminology (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.2 Error Terminology

++ ++ ++ ++

Situations in which errors might, should, or must be signaled are described ++in the standard. The wording used to describe such situations is intended ++to have precise meaning. The following list is a glossary of those meanings. ++

++
++
Safe code
++
++ ++ ++

This is code processed with the safety optimization ++at its highest setting (3). safety is a lexical property ++of code. The phrase “the function F should signal an error” ++means that if F is invoked from code processed with the highest ++safety optimization, an error is signaled. ++It is implementation-dependent whether F or the calling ++code signals the error. ++

++
++
Unsafe code
++
++ ++ ++

This is code processed with lower safety levels. ++

++

Unsafe code might do error checking. Implementations are permitted to ++treat all code as safe code all the time. ++

++
++
An error is signaled
++
++ ++ ++ ++ ++ ++ ++

This means that an error is signaled in both safe and unsafe code. ++Conforming code may rely on the fact that the error is signaled ++in both safe and unsafe code. Every implementation is required to ++detect the error in both safe and unsafe code. For example, “an error ++is signaled if unexport is given a symbol ++not accessible in the current package.” ++

++

If an explicit error type is not specified, the default is error. ++

++
++
An error should be signaled
++
++ ++ ++ ++ ++

This means that an error is signaled in safe code, and an error ++might be signaled in unsafe code. Conforming code may rely on the ++fact that the error is signaled in safe code. Every ++implementation is required to detect the error at least in safe code. ++When the error is not signaled, the “consequences are undefined” ++(see below). For example, “+ should signal an error of type type-error ++if any argument is not of type number.” ++

++
++
Should be prepared to signal an error
++
++ ++ ++ ++ ++

This is similar to “should be signaled” except that it does not ++imply that ‘extra effort’ has to be taken on the part of an operator ++to discover an erroneous situation if the normal action of that operator ++can be performed successfully with only ‘lazy’ checking. ++An implementation is always permitted to signal an error, ++but even in safe code, it is only required to signal the error ++when failing to signal it might lead to incorrect results. ++In unsafe code, the consequences are undefined. ++

++

For example, defining that ++ “find should be prepared to signal an error of type type-error ++ if its second argument is not a proper list” ++does not imply that an error is always signaled. The form ++

++
++
 (find 'a '(a b . c))
++
++ ++

must either signal an error of type type-error in safe code, ++else return A. ++In unsafe code, the consequences are undefined. ++By contrast, ++

++
++
 (find 'd '(a b . c))
++
++ ++

must signal an error of type type-error in safe code. ++In unsafe code, the consequences are undefined. ++Also, ++

++
++
 (find 'd '#1=(a b . #1#))
++
++ ++

in safe code ++ might return nil (as an implementation-defined extension), ++ might never return, ++or might signal an error of type type-error. ++In unsafe code, the consequences are undefined. ++

++

Typically, the “should be prepared to signal” terminology is used in ++type checking situations where there are efficiency considerations that ++make it impractical to detect errors that are not relevant to the ++correct operation of the operator. ++

++
++
The consequences are unspecified
++
++ ++ ++ ++ ++

This means that the consequences are unpredictable but harmless. ++Implementations are permitted to specify the consequences of this ++situation. No conforming code may depend on the results or effects of ++this situation, and all conforming code is required to treat the ++results and effects of this situation as unpredictable but harmless. ++For example, “if the second argument to shared-initialize ++specifies a name that does not correspond to any slots ++accessible in the object, the results are unspecified.” ++

++
++
The consequences are undefined
++
++ ++ ++ ++ ++

This means that the consequences are unpredictable. The consequences ++may range from harmless to fatal. No conforming code may depend on ++the results or effects. Conforming code must treat the consequences as ++unpredictable. In places where the words “must,” “must not,” or ++“may not” are used, then “the consequences are undefined” if the ++stated requirement is not met and no specific consequence is ++explicitly stated. An implementation is permitted to signal an error ++in this case. ++

++

For example: “Once a name has been declared by defconstant ++to be constant, any further assignment or binding of that ++variable has undefined consequences.” ++

++
++
An error might be signaled
++
++ ++ ++ ++ ++

This means that the situation has undefined consequences; ++however, if an error is signaled, it is of the specified type. ++For example, “open might signal an error of type file-error.” ++

++
++
The return values are unspecified
++
++ ++ ++

This means that only the number and nature of the return values of a ++form are not specified. However, the issue of whether or not ++any side-effects or transfer of control occurs is still well-specified. ++

++

A program can be well-specified even if it uses a function whose ++returns values are unspecified. For example, even if the return ++values of some function F are unspecified, an expression such as ++(length (list (F))) is still well-specified because it does not ++rely on any particular aspect of the value or values returned by F. ++

++
++
Implementations may be extended to cover this situation
++
++ ++ ++

This means that the situation has undefined consequences; ++however, a conforming implementation is free to treat ++the situation in a more specific way. ++For example, an implementation might define ++ that an error is signaled, ++ or that an error should be signaled, ++ or even that a certain well-defined non-error behavior occurs. ++

++

No conforming code may depend on the consequences of such a situation; ++all conforming code must treat the consequences of the situation ++as undefined. Implementations are required to document how the ++situation is treated. ++

++

For example, “implementations may be extended to define other type ++specifiers to have a corresponding class.” ++

++
++
Implementations are free to extend the syntax
++
++ ++ ++

This means that in this situation implementations are permitted to ++define unambiguous extensions to the syntax of the form being ++described. No conforming code may depend on this extension. ++Implementations are required to document each such extension. All ++conforming code is required to treat the syntax as meaningless. The ++standard might disallow certain extensions while allowing others. For ++example, “no implementation is free to extend the syntax of ++defclass.” ++

++
++
A warning might be issued
++
++ ++ ++

This means that implementations are encouraged to issue a warning ++if the context is appropriate (e.g., when compiling). However, a ++conforming implementation is not required to issue a warning. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Errors-When-Calling-a-Next-Method.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Errors When Calling a Next Method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.9 Errors When Calling a Next Method

++ ++

If call-next-method is called with arguments, the ordered ++set of applicable methods for the changed set of arguments ++for call-next-method must be the same as the ordered set of ++applicable methods for the original arguments to the ++generic function, or else an error should be signaled. ++

++

The comparison between the set of methods applicable to the ++new arguments and the set applicable to the original arguments is ++insensitive to order differences among methods with the same ++specializers. ++

++

If call-next-method is called with arguments that specify ++a different ordered set of applicable methods and there is no ++next method available, the test for different methods and the ++associated error signaling (when present) takes precedence over calling ++no-next-method. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Escape-Characters-and-Potential-Numbers.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Escape Characters and Potential Numbers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.1.2 Escape Characters and Potential Numbers

++ ++

A potential number cannot contain any escape ++characters. An escape character robs the following ++character of all syntactic qualities, forcing it to be strictly ++alphabetic_2 and therefore unsuitable for use in a ++potential number. For example, all of the following ++representations are interpreted as symbols, not numbers: ++

++
++
 \256   25\64   1.0\E6   |100|   3\.14159   |3/4|   3\/4   5||
++
++ ++

In each case, removing the escape character (or characters) ++would ++cause the token to be a potential number. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Evaluation-and-Compilation-Dictionary.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++Evaluation and Compilation Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8 Evaluation and Compilation Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Evaluation-and-Compilation.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Evaluation and Compilation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

3 Evaluation and Compilation

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Evaluation-of-Subforms-to-Places.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++Evaluation of Subforms to Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.1.1 Evaluation of Subforms to Places

++ ++

The following rules apply to the evaluation of subforms in a ++place: ++

++
++
1.
++

The evaluation ordering of subforms within a place ++is determined by the order specified by the second value returned by ++

++

get-setf-expansion. ++

++

For all places defined by this specification ++(e.g., getf, ldb, ...), ++this order of evaluation is left-to-right. ++

++ ++ ++ ++ ++

When a place is derived from a macro expansion, ++this rule is applied after the macro is expanded to find the appropriate place. ++

++

Places defined by using defmacro or ++

++

define-setf-expander ++

++

use the evaluation order defined by those definitions. ++For example, consider the following: ++

++
++
 (defmacro wrong-order (x y) `(getf ,y ,x))
++
++ ++

This following form evaluates place2 first and ++then place1 because that is the order they are evaluated in ++the macro expansion: ++

++
++
 (push value (wrong-order place1 place2))
++
++ ++
++
2.
++
++

For the macros that manipulate places ++ (push, ++ pushnew, ++ remf, ++ incf, ++ decf, ++ shiftf, ++ rotatef, ++ psetf, ++ setf, ++ pop, and those defined by define-modify-macro) ++the subforms of the macro call are evaluated exactly once ++in left-to-right order, with the subforms of the places ++evaluated in the order specified in (1). ++

++

push, pushnew, remf, ++incf, decf, shiftf, rotatef, ++psetf, pop evaluate all subforms before modifying ++any of the place locations. ++setf (in the case when setf has more than two arguments) ++performs its operation on each pair in sequence. For example, in ++

++
++
 (setf place1 value1 place2 value2 ...)
++
++ ++

the subforms of place1 and value1 are evaluated, the location ++specified by ++place1 is modified to contain the value returned by ++value1, and ++then the rest of the setf form is processed in a like manner. ++

++
++
3.
++

For check-type, ctypecase, and ccase, ++subforms of the place are evaluated once as in (1), ++but might be evaluated again if the ++type check fails in the case of check-type ++or none of the cases hold in ++ctypecase and ccase. ++

++
++
4.
++

For assert, the order of evaluation of the generalized ++references is not specified. ++ ++

++ ++ ++
++
++ ++

Rules 2, 3 and 4 cover all standardized macros that manipulate places. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Evaluation.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++Evaluation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1 Evaluation

++ ++ ++

Execution of code can be accomplished by a variety of means ranging ++from direct interpretation of a form representing a program ++to invocation of compiled code produced by a compiler. ++

++

Evaluation ++ ++ is the process by which a program is executed in Common Lisp. ++The mechanism of evaluation is manifested ++ both implicitly through the effect of the Lisp read-eval-print loop, ++ and explicitly through the presence of the functions ++ eval, ++ compile, ++ compile-file, ++ and load. ++Any of these facilities might share the same execution strategy, ++or each might use a different one. ++

++

The behavior of a conforming program processed by eval ++and by compile-file might differ; see Semantic Constraints. ++

++

Evaluation can be understood in terms of a model in which an ++interpreter recursively traverses a form performing each ++step of the computation as it goes. ++This model, which describes the semantics of Common Lisp programs, ++is described in The Evaluation Model. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-ALWAYS.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++Examples of ALWAYS (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.4.2 Examples of ALWAYS, NEVER, and THEREIS clauses

++ ++
++
;; Make sure I is always less than 11 (two ways).
++;; The FOR construct terminates these loops.
++ (loop for i from 0 to 10
++       always (< i 11))
++⇒  T
++ (loop for i from 0 to 10
++       never (> i 11))
++⇒  T
++
++;; If I exceeds 10 return I; otherwise, return NIL.
++;; The THEREIS construct terminates this loop.
++ (loop for i from 0
++       thereis (when (> i 10) i) )
++⇒  11
++
++;;; The FINALLY clause is not evaluated in these examples.
++ (loop for i from 0 to 10
++       always (< i 9)
++       finally (print "you won't see this"))
++⇒  NIL
++ (loop never t
++       finally (print "you won't see this"))
++⇒  NIL
++ (loop thereis "Here is my value"
++       finally (print "you won't see this"))
++⇒  "Here is my value"
++
++;; The FOR construct terminates this loop, so the FINALLY clause 
++;; is evaluated.
++ (loop for i from 1 to 10
++       thereis (> i 11)
++       finally (prin1 'got-here))
++ |>  GOT-HERE
++⇒  NIL
++
++;; If this code could be used to find a counterexample to Fermat's
++;; last theorem, it would still not return the value of the
++;; counterexample because all of the THEREIS clauses in this example
++;; only return T.  But if Fermat is right, that won't matter
++;; because this won't terminate.
++
++ (loop for z upfrom 2
++       thereis
++         (loop for n upfrom 3 below (log z 2)
++               thereis
++                 (loop for x below z
++                       thereis
++                         (loop for y below z
++                               thereis (= (+ (expt x n) (expt y n))
++                                          (expt z n))))))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-APPEND-and-NCONC-clauses.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Examples of APPEND and NCONC clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.3.2 Examples of APPEND and NCONC clauses

++ ++
++
;; Use APPEND to concatenate some sublists.
++  (loop for x in '((a) (b) ((c)))
++        append x)
++⇒  (A B (C))
++
++;; NCONC some sublists together.  Note that only lists made by the
++;; call to LIST are modified.
++  (loop for i upfrom 0 
++        as x in '(a b (c))
++        nconc (if (evenp i) (list x) nil))
++⇒  (A (C))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Associativity-and-Commutativity-in-Numeric-Operations.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Examples of Associativity and Commutativity in Numeric Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1.2 Examples of Associativity and Commutativity in Numeric Operations

++ ++

Consider the following expression, in which we assume that 1.0 and ++1.0e-15 both denote single floats: ++

++
++
 (+ 1/3 2/3 1.0d0 1.0 1.0e-15)
++
++ ++

One conforming implementation might ++process the arguments from left to right, ++first adding 1/3 and 2/3 to get 1, ++then converting that to a double float ++for combination with 1.0d0, ++then successively converting and adding 1.0 and 1.0e-15. ++

++

Another conforming implementation might process the arguments from ++right to left, first performing a single float addition of 1.0 and ++1.0e-15 (perhaps losing accuracy in the process), then converting the sum to ++a double float and adding 1.0d0, then converting 2/3 to a ++double float and adding it, and then converting 1/3 and adding that. ++

++

A third conforming implementation might first scan all the arguments, ++process all the rationals first to keep that part of the computation exact, ++then find an argument of the largest floating-point format among all the ++arguments and add that, and then add in all other arguments, converting ++each in turn (all in a perhaps misguided attempt to make the computation as accurate ++as possible). ++

++

In any case, all three strategies are legitimate. ++

++

A conforming program could control the order by writing, for example, ++

++
++
 (+ (+ 1/3 2/3) (+ 1.0d0 1.0e-15) 1.0)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-COLLECT-clause.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Examples of COLLECT clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.3.1 Examples of COLLECT clause

++ ++
++
;; Collect all the symbols in a list.
++ (loop for i in '(bird 3 4 turtle (1 . 4) horse cat)
++       when (symbolp i) collect i)
++⇒  (BIRD TURTLE HORSE CAT)
++
++;; Collect and return odd numbers.
++ (loop for i from 1 to 10
++       if (oddp i) collect i)
++⇒  (1 3 5 7 9)
++
++;; Collect items into local variable, but don't return them.
++ (loop for i in '(a b c d) by #'cddr
++       collect i into my-list
++       finally (print my-list))
++ |>  (A C) 
++⇒  NIL
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-COUNT-clause.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Examples of COUNT clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.3.3 Examples of COUNT clause

++ ++
++
 (loop for i in '(a b nil c nil d e)
++       count i)
++⇒  5
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Class-Precedence-List-Determination.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++Examples of Class Precedence List Determination (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.5.2 Examples of Class Precedence List Determination

++ ++

This example determines a class precedence list for the ++class pie. The following classes are defined: ++

++
++
 (defclass pie (apple cinnamon) ())
++
++ (defclass apple (fruit) ())
++
++ (defclass cinnamon (spice) ())
++
++ (defclass fruit (food) ())
++
++ (defclass spice (food) ())
++
++ (defclass food () ())
++
++ ++

The set S_{pie}~= {pie, apple, cinnamon, fruit, spice, food, ++standard-object, t }. The set R~= { (pie, apple), ++(apple, cinnamon), (apple, fruit), (cinnamon, spice), \break ++(fruit, food), (spice, food), (food, standard-object), (standard-object, ++t) }. ++

++

The class pie is not preceded by anything, so it comes first; ++the result so far is (pie). Remove pie from S and pairs ++mentioning pie from R to get S~= {apple, cinnamon, ++fruit, spice, food, standard-object, t } and R~=~{(apple, cinnamon), (apple, fruit), (cinnamon, spice),\break (fruit, ++food), (spice, food), (food, standard-object), ++(standard-object, t) }. ++

++

The class apple is not preceded by anything, so it is next; the ++result is (pie apple). Removing apple and the relevant ++pairs results in S~= { cinnamon, fruit, spice, food, ++standard-object, t } and R~= { (cinnamon, spice), ++(fruit, food), (spice, food), (food, standard-object),\break ++(standard-object, t) }. ++

++

The classes cinnamon and fruit are not preceded by ++anything, so the one with a direct subclass rightmost in the ++class precedence list computed so far goes next. The class apple is a ++direct subclass of fruit, and the class pie is a direct ++subclass of cinnamon. Because apple appears to the right ++of pie in the class precedence list, ++fruit goes next, and the ++result so far is (pie apple fruit). S~= { cinnamon, ++spice, food, standard-object, t }; R~= {(cinnamon, ++spice), (spice, food),\break (food, standard-object), ++(standard-object, t) }. ++

++

The class cinnamon is next, giving the result so far as (pie apple fruit cinnamon). At this point S~= { spice, ++food, standard-object, t }; R~= { (spice, food), (food, ++standard-object), (standard-object, t) }. ++

++

The classes spice, food, standard-object, and ++t are added in that order, and the class precedence list ++is (pie apple fruit cinnamon spice food standard-object t). ++

++

It is possible to write a set of class definitions that cannot be ++ordered. For example: ++

++
++
 (defclass new-class (fruit apple) ())
++
++ (defclass apple (fruit) ())
++
++ ++

The class fruit must precede apple ++because the local ordering of superclasses must be preserved. ++The class apple must precede fruit ++because a class always precedes its own superclasses. ++When this situation occurs, an error is signaled, as happens here ++when the system tries to compute the class precedence list ++of new-class. ++

++

The following might appear to be a conflicting set of definitions: ++

++
++
 (defclass pie (apple cinnamon) ())
++
++ (defclass pastry (cinnamon apple) ())
++
++ (defclass apple () ())
++
++ (defclass cinnamon () ())
++
++ ++

The class precedence list for pie is ++(pie apple cinnamon standard-object t). ++

++

The class precedence list for pastry is ++(pastry cinnamon apple standard-object t). ++

++

It is not a problem for apple to precede cinnamon in the ++ordering of the superclasses of pie but not in the ordering for ++pastry. However, it is not possible to build a new class that ++has both pie and pastry as superclasses. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Data_002ddirected-Destructuring-by-Lambda-Lists.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Examples of Data-directed Destructuring by Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.4.3 Examples of Data-directed Destructuring by Lambda Lists

++ ++

An example pattern is ++

++

(a b c) ++

++

which destructures a list of three elements. The variable a is assigned ++to the first element, b to the second, etc. A more complex example ++is ++

++

((first . rest) . more) ++

++

The important features of data-directed destructuring are its syntactic ++simplicity and the ability to extend it to lambda-list-directed destructuring. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Declaration-Scope.html +@@ -0,0 +1,139 @@ ++ ++ ++ ++ ++ ++Examples of Declaration Scope (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Declaration Scope  

++
++
++

3.3.4.1 Examples of Declaration Scope

++ ++

Here is an example illustrating the scope of bound declarations. ++

++
++
 (let ((x 1))                ;[1] 1st occurrence of x
++   (declare (special x))     ;[2] 2nd occurrence of x
++   (let ((x 2))              ;[3] 3rd occurrence of x
++     (let ((old-x x)         ;[4] 4th occurrence of x
++           (x 3))            ;[5] 5th occurrence of x
++       (declare (special x)) ;[6] 6th occurrence of x
++       (list old-x x))))     ;[7] 7th occurrence of x
++⇒  (2 3)
++
++ ++

The first occurrence of x establishes a dynamic binding ++of x because of the special declaration for x ++in the second line. The third occurrence of x establishes a ++lexical binding of x (because there is no special ++declaration in the corresponding let form). ++The fourth occurrence of x x is a reference to the ++lexical binding of x established in the third line. ++The fifth occurrence of x establishes a dynamic binding ++of x for the body of the let form that begins on ++that line because of the special declaration for x ++in the sixth line. The reference to x in the fourth line is not ++affected by the special declaration in the sixth line ++because that reference is not within the “would-be lexical scope” ++of the variable x in the fifth line. The reference to x ++in the seventh line is a reference to the dynamic binding of x ++established in the fifth line. ++

++

Here is another example, to illustrate the scope of a ++free declaration. In the following: ++

++
++
 (lambda (&optional (x (foo 1))) ;[1]
++   (declare (notinline foo))     ;[2]
++   (foo x))                      ;[3]
++
++ ++

the call to foo in the first line might be ++compiled inline even though the call to foo in ++the third line must not be. This is because ++the notinline declaration ++for foo in the second line applies only to the body on the ++third line. In order to suppress inlining for both calls, ++one might write: ++

++
++
 (locally (declare (notinline foo)) ;[1]
++   (lambda (&optional (x (foo 1)))  ;[2]
++     (foo x)))                      ;[3]
++
++ ++

or, alternatively: ++

++
++
 (lambda (&optional                               ;[1]
++            (x (locally (declare (notinline foo)) ;[2]
++                 (foo 1))))                       ;[3]
++   (declare (notinline foo))                      ;[4]
++   (foo x))                                       ;[5]
++
++ ++

Finally, here is an example that shows the scope of ++declarations in an iteration form. ++

++
++
 (let ((x  1))                     ;[1]
++   (declare (special x))           ;[2]
++     (let ((x 2))                  ;[3]
++       (dotimes (i x x)            ;[4]
++         (declare (special x)))))  ;[5]
++⇒  1
++
++ ++

In this example, the first reference to x on the fourth line is to ++the lexical binding of x established on the third line. ++However, the second occurrence of x on the fourth line lies within ++the scope of the free declaration on the fifth line ++(because this is the result-form of the dotimes) ++and therefore refers to the dynamic binding of x. ++

++ ++
++
++

++Previous: , Up: Declaration Scope  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Effect-of-Readtable-Case-on-the-Lisp-Printer.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++Examples of Effect of Readtable Case on the Lisp Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.11 Examples of Effect of Readtable Case on the Lisp Printer

++ ++
++
 (defun test-readtable-case-printing ()
++   (let ((*readtable* (copy-readtable nil))
++         (*print-case* *print-case*))
++     (format t "READTABLE-CASE *PRINT-CASE*  Symbol-name  Output~
++              ~
++              ~
++     (dolist (readtable-case '(:upcase :downcase :preserve :invert))
++       (setf (readtable-case *readtable*) readtable-case)
++       (dolist (print-case '(:upcase :downcase :capitalize))
++         (dolist (symbol '(|ZEBRA| |Zebra| |zebra|))
++           (setq *print-case* print-case)
++           (format t "~&:~A~15T:~A~29T~A~42T~A"
++                   (string-upcase readtable-case)
++                   (string-upcase print-case)
++                   (symbol-name symbol)
++                   (prin1-to-string symbol)))))))
++
++ ++

The output from (test-readtable-case-printing) should be as follows: ++

++
++
    READTABLE-CASE *PRINT-CASE*  Symbol-name  Output
++    --------------------------------------------------
++    :UPCASE        :UPCASE       ZEBRA        ZEBRA
++    :UPCASE        :UPCASE       Zebra        |Zebra|
++    :UPCASE        :UPCASE       zebra        |zebra|
++    :UPCASE        :DOWNCASE     ZEBRA        zebra
++    :UPCASE        :DOWNCASE     Zebra        |Zebra|
++    :UPCASE        :DOWNCASE     zebra        |zebra|
++    :UPCASE        :CAPITALIZE   ZEBRA        Zebra
++    :UPCASE        :CAPITALIZE   Zebra        |Zebra|
++    :UPCASE        :CAPITALIZE   zebra        |zebra|
++    :DOWNCASE      :UPCASE       ZEBRA        |ZEBRA|
++    :DOWNCASE      :UPCASE       Zebra        |Zebra|
++    :DOWNCASE      :UPCASE       zebra        ZEBRA
++    :DOWNCASE      :DOWNCASE     ZEBRA        |ZEBRA|
++    :DOWNCASE      :DOWNCASE     Zebra        |Zebra|
++    :DOWNCASE      :DOWNCASE     zebra        zebra
++    :DOWNCASE      :CAPITALIZE   ZEBRA        |ZEBRA|
++    :DOWNCASE      :CAPITALIZE   Zebra        |Zebra|
++    :DOWNCASE      :CAPITALIZE   zebra        Zebra
++    :PRESERVE      :UPCASE       ZEBRA        ZEBRA
++    :PRESERVE      :UPCASE       Zebra        Zebra
++    :PRESERVE      :UPCASE       zebra        zebra
++    :PRESERVE      :DOWNCASE     ZEBRA        ZEBRA
++    :PRESERVE      :DOWNCASE     Zebra        Zebra
++    :PRESERVE      :DOWNCASE     zebra        zebra
++    :PRESERVE      :CAPITALIZE   ZEBRA        ZEBRA
++    :PRESERVE      :CAPITALIZE   Zebra        Zebra
++    :PRESERVE      :CAPITALIZE   zebra        zebra
++    :INVERT        :UPCASE       ZEBRA        zebra
++    :INVERT        :UPCASE       Zebra        Zebra
++    :INVERT        :UPCASE       zebra        ZEBRA
++    :INVERT        :DOWNCASE     ZEBRA        zebra
++    :INVERT        :DOWNCASE     Zebra        Zebra
++    :INVERT        :DOWNCASE     zebra        ZEBRA
++    :INVERT        :CAPITALIZE   ZEBRA        zebra
++    :INVERT        :CAPITALIZE   Zebra        Zebra
++    :INVERT        :CAPITALIZE   zebra        ZEBRA
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Effect-of-Readtable-Case-on-the-Lisp-Reader.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++Examples of Effect of Readtable Case on the Lisp Reader (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.1.2.1 Examples of Effect of Readtable Case on the Lisp Reader

++ ++
++
 (defun test-readtable-case-reading ()
++   (let ((*readtable* (copy-readtable nil)))
++     (format t "READTABLE-CASE  Input   Symbol-name~
++              ~
++              ~
++     (dolist (readtable-case '(:upcase :downcase :preserve :invert))
++       (setf (readtable-case *readtable*) readtable-case)
++       (dolist (input '("ZEBRA" "Zebra" "zebra"))
++         (format t "~&:~A~16T~A~24T~A"
++                 (string-upcase readtable-case)
++                 input
++                 (symbol-name (read-from-string input)))))))
++
++ ++

The output from (test-readtable-case-reading) should be as follows: ++

++
++
 READTABLE-CASE     Input Symbol-name
++ -------------------------------------
++    :UPCASE         ZEBRA   ZEBRA
++    :UPCASE         Zebra   ZEBRA
++    :UPCASE         zebra   ZEBRA
++    :DOWNCASE       ZEBRA   zebra
++    :DOWNCASE       Zebra   zebra
++    :DOWNCASE       zebra   zebra
++    :PRESERVE       ZEBRA   ZEBRA
++    :PRESERVE       Zebra   Zebra
++    :PRESERVE       zebra   zebra
++    :INVERT         ZEBRA   zebra
++    :INVERT         Zebra   Zebra
++    :INVERT         zebra   ZEBRA
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Evaluation-of-Subforms-to-Places.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Examples of Evaluation of Subforms to Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.1.2 Examples of Evaluation of Subforms to Places

++ ++
++
 (let ((ref2 (list '())))
++   (push (progn (princ "1") 'ref-1)
++         (car (progn (princ "2") ref2)))) 
++ |>  12
++⇒  (REF1)
++
++ (let (x)
++    (push (setq x (list 'a))
++          (car (setq x (list 'b))))
++     x)
++⇒  (((A) . B))
++
++ ++

push first evaluates (setq x (list 'a)) ⇒ (a), ++ then evaluates (setq x (list 'b)) ⇒ (b), ++ then modifies the car of this latest value to be ((a) . b). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-FORMAT.html +@@ -0,0 +1,159 @@ ++ ++ ++ ++ ++ ++Examples of FORMAT (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.11 Examples of FORMAT

++ ++
++
 (format nil "foo") ⇒  "foo"
++ (setq x 5) ⇒  5
++ (format nil "The answer is ~D." x) ⇒  "The answer is 5."
++ (format nil "The answer is ~3D." x) ⇒  "The answer is   5."
++ (format nil "The answer is ~3,'0D." x) ⇒  "The answer is 005."
++ (format nil "The answer is ~:D." (expt 47 x))
++⇒  "The answer is 229,345,007."
++ (setq y "elephant") ⇒  "elephant"
++ (format nil "Look at the ~A!" y) ⇒  "Look at the elephant!"
++ (setq n 3) ⇒  3
++ (format nil "~D item~:P found." n) ⇒  "3 items found."
++ (format nil "~R dog~:[s are~; is~] here." n (= n 1))
++⇒  "three dogs are here."
++ (format nil "~R dog~:*~[s are~; is~:;s are~] here." n)
++⇒  "three dogs are here."
++ (format nil "Here ~[are~;is~:;are~] ~:*~R pupp~:@P." n)
++⇒  "Here are three puppies."
++
++ ++
++
 (defun foo (x)
++   (format nil "~6,2F|~6,2,1,'*F|~6,2,,'?F|~6F|~,2F|~F"
++           x x x x x x)) ⇒  FOO
++ (foo 3.14159)  ⇒  "  3.14| 31.42|  3.14|3.1416|3.14|3.14159"
++ (foo -3.14159) ⇒  " -3.14|-31.42| -3.14|-3.142|-3.14|-3.14159"
++ (foo 100.0)    ⇒  "100.00|******|100.00| 100.0|100.00|100.0"
++ (foo 1234.0)   ⇒  "1234.00|******|??????|1234.0|1234.00|1234.0"
++ (foo 0.006)    ⇒  "  0.01|  0.06|  0.01| 0.006|0.01|0.006"
++
++ ++
++
 (defun foo (x)  
++    (format nil
++           "~9,2,1,,'*E|~10,3,2,2,'?,,'$E|~
++            ~9,3,2,-2,'
++           x x x x))
++ (foo 3.14159)  ⇒  "  3.14E+0| 31.42$-01|+.003E+03|  3.14E+0"
++ (foo -3.14159) ⇒  " -3.14E+0|-31.42$-01|-.003E+03| -3.14E+0"
++ (foo 1100.0)   ⇒  "  1.10E+3| 11.00$+02|+.001E+06|  1.10E+3"
++ (foo 1100.0L0) ⇒  "  1.10L+3| 11.00$+02|+.001L+06|  1.10L+3"
++ (foo 1.1E13)   ⇒  "*********| 11.00$+12|+.001E+16| 1.10E+13"
++ (foo 1.1L120)  ⇒  "*********|??????????|
++ (foo 1.1L1200) ⇒  "*********|??????????|
++
++ ++

As an example of the effects of varying the scale factor, the code ++

++
++
 (dotimes (k 13)
++   (format t "~
++           (- k 5) (- k 5) 3.14159))
++
++ ++

produces the following output: ++

++
++
Scale factor -5: | 0.000003E+06|
++Scale factor -4: | 0.000031E+05|
++Scale factor -3: | 0.000314E+04|
++Scale factor -2: | 0.003142E+03|
++Scale factor -1: | 0.031416E+02|
++Scale factor  0: | 0.314159E+01|
++Scale factor  1: | 3.141590E+00|
++Scale factor  2: | 31.41590E-01|
++Scale factor  3: | 314.1590E-02|
++Scale factor  4: | 3141.590E-03|
++Scale factor  5: | 31415.90E-04|
++Scale factor  6: | 314159.0E-05|
++Scale factor  7: | 3141590.E-06|
++
++ ++
++
 (defun foo (x)
++   (format nil "~9,2,1,,'*G|~9,3,2,3,'?,,'$G|~9,3,2,0,'
++          x x x x))                                     
++ (foo 0.0314159) ⇒  "  3.14E-2|314.2$-04|0.314E-01|  3.14E-2"
++ (foo 0.314159)  ⇒  "  0.31   |0.314    |0.314    | 0.31    "
++ (foo 3.14159)   ⇒  "   3.1   | 3.14    | 3.14    |  3.1    "
++ (foo 31.4159)   ⇒  "   31.   | 31.4    | 31.4    |  31.    "
++ (foo 314.159)   ⇒  "  3.14E+2| 314.    | 314.    |  3.14E+2"
++ (foo 3141.59)   ⇒  "  3.14E+3|314.2$+01|0.314E+04|  3.14E+3"
++ (foo 3141.59L0) ⇒  "  3.14L+3|314.2$+01|0.314L+04|  3.14L+3"
++ (foo 3.14E12)   ⇒  "*********|314.0$+10|0.314E+13| 3.14E+12"
++ (foo 3.14L120)  ⇒  "*********|?????????|
++ (foo 3.14L1200) ⇒  "*********|?????????|
++
++ ++
++
 (format nil "~10<foo~;bar~>")   ⇒  "foo    bar"
++ (format nil "~10:<foo~;bar~>")  ⇒  "  foo  bar"
++ (format nil "~10<foobar~>")     ⇒  "    foobar"
++ (format nil "~10:<foobar~>")    ⇒  "    foobar"
++ (format nil "~10:@<foo~;bar~>") ⇒  "  foo bar "
++ (format nil "~10@<foobar~>")    ⇒  "foobar    "
++ (format nil "~10:@<foobar~>")   ⇒  "  foobar  "
++
++ ++
++
  (FORMAT NIL "Written to ~A." #P"foo.bin")
++  ⇒  "Written to foo.bin."
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Feature-Expressions.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++Examples of Feature Expressions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Features  

++
++
++

24.1.2.2 Examples of Feature Expressions

++ ++

For example, suppose that ++ in implementation A, the features spice and perq are present, ++ but the feature lispm is not present; ++ in implementation B, the feature lispm is present, ++ but the features spice and perq are ++ not present; ++ and ++ in implementation C, none of the features spice, lispm, or perq are ++ present. ++Figure 24–1 shows some sample expressions, and how they would be ++read_2 in these implementations. ++

++
++
  (cons #+spice "Spice" #-spice "Lispm" x) 
++  in implementation A ...    (CONS "Spice" X)             
++    in implementation B ...  (CONS "Lispm" X)             
++    in implementation C ...  (CONS "Lispm" X)             
++  (cons #+spice "Spice" #+LispM "Lispm" x) 
++  in implementation A ...    (CONS "Spice" X)             
++    in implementation B ...  (CONS "Lispm" X)             
++    in implementation C ...  (CONS X)                     
++  (setq a '(1 2 #+perq 43 #+(not perq) 27)) 
++  in implementation A ...    (SETQ A '(1 2 43))           
++    in implementation B ...  (SETQ A '(1 2 27))           
++    in implementation C ...  (SETQ A '(1 2 27))           
++  (let ((a 3) #+(or spice lispm) (b 3)) (foo a)) 
++  in implementation A ...    (LET ((A 3) (B 3)) (FOO A))  
++    in implementation B ...  (LET ((A 3) (B 3)) (FOO A))  
++    in implementation C ...  (LET ((A 3)) (FOO A))        
++  (cons #+Lispm "#+Spice" #+Spice "foo" #-(or Lispm Spice) 7 x) 
++  in implementation A ...    (CONS "foo" X)               
++    in implementation B ...  (CONS "#+Spice" X)           
++    in implementation C ...  (CONS 7 X)                   
++
++              Figure 24–1: Features examples             
++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Inheritance.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Examples of Inheritance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Inheritance  

++
++
++

4.3.4.1 Examples of Inheritance

++ ++
++
 (defclass C1 () 
++     ((S1 :initform 5.4 :type number) 
++      (S2 :allocation :class)))
++
++ (defclass C2 (C1) 
++     ((S1 :initform 5 :type integer)
++      (S2 :allocation :instance)
++      (S3 :accessor C2-S3)))
++
++ ++

Instances of the class C1 have a local slot named S1, ++whose default initial value is 5.4 and ++whose value should always be a number. ++The class C1 also has a shared slot named S2. ++

++

There is a local slot named S1 in instances of C2. ++The default initial value of S1 is 5. ++The value of S1 should always be of type (and integer number). ++There are also local slots named S2 and S3 in instances of C2. ++The class C2 has a method for C2-S3 for reading the value of slot S3; ++there is also a method for (setf C2-S3) that writes the value of S3. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Keyword-Arguments-in-Generic-Functions-and-Methods.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Examples of Keyword Arguments in Generic Functions and Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.5.1 Examples of Keyword Arguments in Generic Functions and Methods

++ ++

For example, suppose there are two methods defined for width ++as follows: ++

++
++
 (defmethod width ((c character-class) &key font) ...)
++
++ (defmethod width ((p picture-class) &key pixel-size) ...)
++
++ ++

Assume that there are no other methods and no generic ++function definition for width. The evaluation of the ++following form should signal an error because ++the keyword argument :pixel-size is not accepted by the applicable method. ++

++
++
 (width (make-instance `character-class :char #\Q) 
++        :font 'baskerville :pixel-size 10)
++
++ ++

The evaluation of the following form should signal an error. ++

++
++
 (width (make-instance `picture-class :glyph (glyph #\Q)) 
++        :font 'baskerville :pixel-size 10)
++
++ ++

The evaluation of the following form will not signal an error ++if the class named character-picture-class is a subclass of ++both picture-class and character-class. ++

++
++
 (width (make-instance `character-picture-class :char #\Q)
++        :font 'baskerville :pixel-size 10)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-MAXIMIZE-and-MINIMIZE-clauses.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Examples of MAXIMIZE and MINIMIZE clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.3.4 Examples of MAXIMIZE and MINIMIZE clauses

++ ++
++
 (loop for i in '(2 1 5 3 4)
++       maximize i)
++⇒  5
++ (loop for i in '(2 1 5 3 4)
++       minimize i)
++⇒  1
++
++;; In this example, FIXNUM applies to the internal variable that holds
++;; the maximum value.
++ (setq series '(1.2 4.3 5.7))
++⇒  (1.2 4.3 5.7)
++ (loop for v in series 
++       maximize (round v) of-type fixnum)
++⇒  6
++
++;; In this example, FIXNUM applies to the variable RESULT.
++ (loop for v of-type float in series
++       minimize (round v) into result of-type fixnum
++       finally (return result))
++⇒  1
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Merging-Pathnames.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Examples of Merging Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Merging Pathnames  

++
++
++

19.2.3.1 Examples of Merging Pathnames

++ ++

Although the following examples are possible to execute only in ++implementations which permit :unspecific in the indicated ++position andwhich permit four-letter type components, they serve to illustrate ++the basic concept of pathname merging. ++

++
++
 (pathname-type 
++   (merge-pathnames (make-pathname :type "LISP")
++                    (make-pathname :type "TEXT")))
++⇒  "LISP"
++
++ (pathname-type 
++   (merge-pathnames (make-pathname :type nil)
++                    (make-pathname :type "LISP")))
++⇒  "LISP"
++
++ (pathname-type 
++   (merge-pathnames (make-pathname :type :unspecific)
++                    (make-pathname :type "LISP")))
++⇒  :UNSPECIFIC
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Miscellaneous-Loop-Features.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Examples of Miscellaneous Loop Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The LOOP Facility  

++
++
++

6.1.8 Examples of Miscellaneous Loop Features

++ ++
++
 (let ((i 0))                     ; no loop keywords are used
++    (loop (incf i) (if (= i 3) (return i)))) ⇒  3
++ (let ((i 0)(j 0))
++    (tagbody
++      (loop (incf j 3) (incf i) (if (= i 3) (go exit)))
++      exit)
++    j) ⇒  9
++
++ ++

In the following example, the variable x is stepped ++before y is stepped; thus, the value of y ++reflects the updated value of x: ++

++
++
 (loop for x from 1 to 10 
++       for y = nil then x 
++       collect (list x y))
++⇒  ((1 NIL) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10))
++
++ ++

In this example, x and y are stepped in parallel: ++

++
++
 (loop for x from 1 to 10 
++       and y = nil then x 
++       collect (list x y))
++⇒  ((1 NIL) (2 1) (3 2) (4 3) (5 4) (6 5) (7 6) (8 7) (9 8) (10 9))
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Multiple-Escape-Characters.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Examples of Multiple Escape Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.6 Examples of Multiple Escape Characters

++ ++
++
 ;; The following examples assume the readtable case of *readtable* 
++ ;; and *print-case* are both :upcase.
++ (eq 'abc 'ABC) ⇒  true
++ (eq 'abc '|ABC|) ⇒  true
++ (eq 'abc 'a|B|c) ⇒  true
++ (eq 'abc '|abc|) ⇒  false
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-NAMED-clause.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Examples of NAMED clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.7.2 Examples of NAMED clause

++ ++
++
;; Just name and return.
++ (loop named max
++       for i from 1 to 10
++       do (print i)
++       do (return-from max 'done))
++ |>  1 
++⇒  DONE
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Ordinary-Lambda-Lists.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++Examples of Ordinary Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.8 Examples of Ordinary Lambda Lists

++ ++

Here are some examples involving optional parameters and rest parameters: ++

++
++
 ((lambda (a b) (+ a (* b 3))) 4 5) ⇒  19
++ ((lambda (a &optional (b 2)) (+ a (* b 3))) 4 5) ⇒  19
++ ((lambda (a &optional (b 2)) (+ a (* b 3))) 4) ⇒  10
++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)))
++⇒  (2 NIL 3 NIL NIL)
++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6)
++⇒  (6 T 3 NIL NIL)
++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3)
++⇒  (6 T 3 T NIL)
++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x)) 6 3 8)
++⇒  (6 T 3 T (8))
++ ((lambda (&optional (a 2 b) (c 3 d) &rest x) (list a b c d x))
++  6 3 8 9 10 11)
++⇒  (6 t 3 t (8 9 10 11))
++
++ ++

Here are some examples involving keyword parameters: ++

++
++
 ((lambda (a b &key c d) (list a b c d)) 1 2) ⇒  (1 2 NIL NIL)
++ ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6) ⇒  (1 2 6 NIL)
++ ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8) ⇒  (1 2 NIL 8)
++ ((lambda (a b &key c d) (list a b c d)) 1 2 :c 6 :d 8) ⇒  (1 2 6 8)
++ ((lambda (a b &key c d) (list a b c d)) 1 2 :d 8 :c 6) ⇒  (1 2 6 8)
++ ((lambda (a b &key c d) (list a b c d)) :a 1 :d 8 :c 6) ⇒  (:a 1 6 8)
++ ((lambda (a b &key c d) (list a b c d)) :a :b :c :d) ⇒  (:a :b :d NIL)
++ ((lambda (a b &key ((:sea c)) d) (list a b c d)) 1 2 :sea 6) ⇒  (1 2 6 NIL)
++ ((lambda (a b &key ((c c)) d) (list a b c d)) 1 2 'c 6) ⇒  (1 2 6 NIL)
++
++ ++

Here are some examples involving optional parameters, rest parameters, ++and keyword parameters together: ++

++
++
 ((lambda (a &optional (b 3) &rest x &key c (d a))
++    (list a b c d x)) 1)   
++⇒  (1 3 NIL 1 ()) 
++ ((lambda (a &optional (b 3) &rest x &key c (d a))
++    (list a b c d x)) 1 2)
++⇒  (1 2 NIL 1 ())
++ ((lambda (a &optional (b 3) &rest x &key c (d a))
++    (list a b c d x)) :c 7)
++⇒  (:c 7 NIL :c ())
++ ((lambda (a &optional (b 3) &rest x &key c (d a))
++    (list a b c d x)) 1 6 :c 7)
++⇒  (1 6 7 1 (:c 7))
++ ((lambda (a &optional (b 3) &rest x &key c (d a))
++    (list a b c d x)) 1 6 :d 8)
++⇒  (1 6 NIL 8 (:d 8))
++ ((lambda (a &optional (b 3) &rest x &key c (d a))
++    (list a b c d x)) 1 6 :d 8 :c 9 :d 10)
++⇒  (1 6 9 8 (:d 8 :c 9 :d 10))
++
++ ++

As an example of the use of &allow-other-keys and ++:allow-other-keys, consider a function that takes two named ++arguments of its own and also accepts additional named arguments to be ++passed to make-array: ++

++
++
 (defun array-of-strings (str dims &rest named-pairs
++                          &key (start 0) end &allow-other-keys)
++   (apply #'make-array dims
++          :initial-element (subseq str start end)
++          :allow-other-keys t
++          named-pairs))
++
++ ++

This function takes a string and dimensioning ++information and returns an array of the specified ++dimensions, each of whose elements is the specified ++string. However, :start and :end named ++arguments may be used to specify that a substring of the given ++string should be used. In addition, the presence of ++&allow-other-keys in the lambda list indicates that the ++caller may supply additional named arguments; the rest parameter ++provides access to them. These additional named arguments are passed ++to make-array. The function make-array ++normally does not allow the named arguments :start ++and :end to be used, and an error should be ++signaled if such named arguments are supplied to make-array. ++However, the presence in the call to make-array ++of the named argument :allow-other-keys with ++a true value causes any extraneous named arguments, including ++:start and :end, to be acceptable and ignored. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Potential-Numbers.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Examples of Potential Numbers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.1.3 Examples of Potential Numbers

++ ++

As examples, the tokens in Figure 2–10 are potential numbers, ++but they are not actually numbers, and so are reserved tokens; ++a conforming implementation is permitted, but not required, ++to define their meaning. ++

++
++
  1b5000                       777777q                1.7J  -3/4+6.7J  12/25/83  
++  27^19                      3^4/5                6//7  3.1.2.6    ^-43^   
++  3.141_592_653_589_793_238_4  -3.7+2.6i-6.17j+19.6k  
++
++                     Figure 2–10: Examples of reserved tokens                   
++
++
++ ++

The tokens in Figure 2–11 are not potential numbers; ++they are always treated as symbols: ++

++
++
  /     /5     +  1+  1-     
++  foo+  ab.cd  _  ^   ^/-  
++
++  Figure 2–11: Examples of symbols
++
++
++ ++

The tokens in Figure 2–12 are potential numbers ++if the current input base is 16, ++but they are always treated as symbols if the current input base is 10. ++

++
++
  bad-face  25-dec-83  a/b  fad_cafe  f^ 
++
++  Figure 2–12: Examples of symbols or potential numbers
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Printer-Behavior.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++Examples of Printer Behavior (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.4 Examples of Printer Behavior

++ ++
++
 (let ((*print-escape* t)) (fresh-line) (write #\a))
++ |>  #\a
++⇒  #\a
++ (let ((*print-escape* nil) (*print-readably* nil))
++   (fresh-line)
++   (write #\a))
++ |>  a
++⇒  #\a
++ (progn (fresh-line) (prin1 #\a))
++ |>  #\a
++⇒  #\a
++ (progn (fresh-line) (print #\a))
++ |>  
++ |>  #\a
++⇒  #\a
++ (progn (fresh-line) (princ #\a))
++ |>  a
++⇒  #\a
++
++ (dolist (val '(t nil))
++   (let ((*print-escape* val) (*print-readably* val))
++     (print '#\a) 
++     (prin1 #\a) (write-char #\Space)
++     (princ #\a) (write-char #\Space)
++     (write #\a)))
++ |>  #\a #\a a #\a
++ |>  #\a #\a a a
++⇒  NIL
++
++ (progn (fresh-line) (write '(let ((a 1) (b 2)) (+ a b))))
++ |>  (LET ((A 1) (B 2)) (+ A B))
++⇒  (LET ((A 1) (B 2)) (+ A B))
++
++ (progn (fresh-line) (pprint '(let ((a 1) (b 2)) (+ a b))))
++ |>  (LET ((A 1)
++ |>        (B 2))               
++ |>    (+ A B))
++⇒  (LET ((A 1) (B 2)) (+ A B))
++
++ (progn (fresh-line) 
++        (write '(let ((a 1) (b 2)) (+ a b)) :pretty t))
++ |>  (LET ((A 1)
++ |>        (B 2))
++ |>    (+ A B))                 
++⇒  (LET ((A 1) (B 2)) (+ A B))
++
++ (with-output-to-string (s)  
++    (write 'write :stream s)
++    (prin1 'prin1 s))
++⇒  "WRITEPRIN1"
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Printing-Arrays.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Examples of Printing Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.17 Examples of Printing Arrays

++ ++
++
 (let ((a (make-array '(3 3)))
++       (*print-pretty* t)
++       (*print-array* t))
++   (dotimes (i 3) (dotimes (j 3) (setf (aref a i j) (format nil "<~D,~D>" i j))))
++   (print a)
++   (print (make-array 9 :displaced-to a)))
++ |>  #2A(("<0,0>" "<0,1>" "<0,2>") 
++ |>      ("<1,0>" "<1,1>" "<1,2>") 
++ |>      ("<2,0>" "<2,1>" "<2,2>")) 
++ |>  #("<0,0>" "<0,1>" "<0,2>" "<1,0>" "<1,1>" "<1,2>" "<2,0>" "<2,1>" "<2,2>") 
++⇒  #<ARRAY 9 indirect 36363476>
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-REPEAT-clause.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Examples of REPEAT clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.4.1 Examples of REPEAT clause

++ ++
++
 (loop repeat 3
++       do (format t "~&What I say three times is true.~
++ |>  What I say three times is true.
++ |>  What I say three times is true.
++ |>  What I say three times is true.
++⇒  NIL
++ (loop repeat -15
++   do (format t "What you see is what you expect~
++⇒  NIL
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Resolution-of-Apparent-Conflict-in-Exceptional-Situations.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Examples of Resolution of Apparent Conflict in Exceptional Situations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.6 Examples of Resolution of Apparent Conflict in Exceptional Situations

++ ++

Suppose that function foo is a member of a set S of functions that ++operate on numbers. Suppose that one passage states that an error must be ++signaled if any function in S is ever given an argument of 17. ++Suppose that an apparently conflicting passage states that the consequences ++are undefined if foo receives an argument of 17. Then the second passage ++(the one specifically about foo) would dominate because the description of ++the situational context is the most specific, and it would not be required that ++foo signal an error on an argument of 17 even though other functions in ++the set S would be required to do so. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Rule-of-Canonical-Representation-for-Complex-Rationals.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Examples of Rule of Canonical Representation for Complex Rationals (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.5.4 Examples of Rule of Canonical Representation for Complex Rationals

++ ++
++
 #c(1.0 1.0) ⇒  #C(1.0 1.0)
++ #c(0.0 0.0) ⇒  #C(0.0 0.0)
++ #c(1.0 1) ⇒  #C(1.0 1.0)
++ #c(0.0 0) ⇒  #C(0.0 0.0)
++ #c(1 1) ⇒  #C(1 1)
++ #c(0 0) ⇒  0
++ (typep #c(1 1) '(complex (eql 1))) ⇒  true
++ (typep #c(0 0) '(complex (eql 0))) ⇒  false
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Rule-of-Float-and-Rational-Contagion.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Examples of Rule of Float and Rational Contagion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.4.2 Examples of Rule of Float and Rational Contagion

++ ++
++
 ;;;; Combining rationals with floats.
++ ;;; This example assumes an implementation in which 
++ ;;; (float-radix 0.5) is 2 (as in IEEE) or 16 (as in IBM/360),
++ ;;; or else some other implementation in which 1/2 has an exact 
++ ;;;  representation in floating point.
++ (+ 1/2 0.5) ⇒  1.0
++ (- 1/2 0.5d0) ⇒  0.0d0
++ (+ 0.5 -0.5 1/2) ⇒  0.5
++
++ ;;;; Comparing rationals with floats.
++ ;;; This example assumes an implementation in which the default float 
++ ;;; format is IEEE single-float, IEEE double-float, or some other format
++ ;;; in which 5/7 is rounded upwards by FLOAT.
++ (< 5/7 (float 5/7)) ⇒  true
++ (< 5/7 (rational (float 5/7))) ⇒  true
++ (< (float 5/7) (float 5/7)) ⇒  false
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-SUM-clause.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Examples of SUM clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.3.5 Examples of SUM clause

++ ++
++
 (loop for i of-type fixnum in '(1 2 3 4 5)
++       sum i)
++⇒  15
++ (setq series '(1.2 4.3 5.7))
++⇒  (1.2 4.3 5.7)
++ (loop for v in series 
++       sum (* 2.0 v))
++⇒  22.4
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Satisfying-a-One_002dArgument-Test.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Examples of Satisfying a One-Argument Test (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

17.2.2.1 Examples of Satisfying a One-Argument Test

++ ++
++
 (count-if #'zerop '(1 #C(0.0 0.0) 0 0.0d0 0.0s0 3)) ⇒  4
++
++ (remove-if-not #'symbolp '(0 1 2 3 4 5 6 7 8 9 A B C D E F))
++⇒  (A B C D E F)
++ (remove-if (complement #'symbolp) '(0 1 2 3 4 5 6 7 8 9 A B C D E F))
++⇒  (A B C D E F)
++
++ (count-if #'zerop '("foo" "" "bar" "" "" "baz" "quux") :key #'length)
++⇒  3
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Satisfying-a-Two_002dArgument-Test.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Examples of Satisfying a Two-Argument Test (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

17.2.1.1 Examples of Satisfying a Two-Argument Test

++ ++
++
 (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'equal)
++⇒  (foo bar "BAR" "foo" "bar")
++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'equalp)
++⇒  (foo bar "BAR" "bar")
++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'string-equal)
++⇒  (bar "BAR" "bar")
++ (remove "FOO" '(foo bar "FOO" "BAR" "foo" "bar") :test #'string=)
++⇒  (BAR "BAR" "foo" "bar")
++
++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'eql)
++⇒  (1)
++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test-not #'=)
++⇒  (1 1.0 #C(1.0 0.0))
++ (remove 1 '(1 1.0 #C(1.0 0.0) 2 2.0 #C(2.0 0.0)) :test (complement #'=))
++⇒  (1 1.0 #C(1.0 0.0))
++
++ (count 1 '((one 1) (uno 1) (two 2) (dos 2)) :key #'cadr) ⇒  2
++
++ (count 2.0 '(1 2 3) :test #'eql :key #'float) ⇒  1
++
++ (count "FOO" (list (make-pathname :name "FOO" :type "X")  
++                    (make-pathname :name "FOO" :type "Y"))
++        :key #'pathname-name
++        :test #'equal)
++⇒  2
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Self_002dEvaluating-Objects.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Examples of Self-Evaluating Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.13 Examples of Self-Evaluating Objects

++ ++

Numbers, pathnames, and arrays are examples of ++self-evaluating objects. ++

++
++
 3 ⇒  3
++ #c(2/3 5/8) ⇒  #C(2/3 5/8)
++ #p"S:[BILL]OTHELLO.TXT" ⇒  #P"S:[BILL]OTHELLO.TXT"
++ #(a b c) ⇒  #(A B C)
++ "fred smith" ⇒  "fred smith"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Semicolon.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Examples of Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Semicolon  

++
++
++

2.4.4.1 Examples of Semicolon

++ ++
++
 (+ 3 ; three
++    4)
++⇒  7    
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Setf-Expansions.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Examples of Setf Expansions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.1.4 Examples of Setf Expansions

++ ++

Examples of the contents of the constituents of setf expansions ++follow. ++

++

For a variable x: ++

++
++
  ()              ;list of temporary variables  
++  ()              ;list of value forms          
++  (g0001)         ;list of store variables      
++  (setq x g0001)  ;storing form                 
++  x               ;accessing form               
++
++  Figure 5–3: Sample Setf Expansion of a Variable
++
++
++ ++

For (car exp): ++

++
++
  (g0002)                             ;list of temporary variables  
++  (exp)                               ;list of value forms          
++  (g0003)                             ;list of store variables      
++  (progn (rplaca g0002 g0003) g0003)  ;storing form                 
++  (car g0002)                         ;accessing form               
++
++           Figure 5–4: Sample Setf Expansion of a CAR Form         
++
++
++ ++

For (subseq seq s e): ++

++
++
  (g0004 g0005 g0006)         ;list of temporary variables  
++  (seq s e)                   ;list of value forms          
++  (g0007)                     ;list of store variables      
++  (progn (replace g0004 g0007 :start1 g0005 :end1 g0006) g0007) 
++                              ;storing form                 
++  (subseq g0004 g0005 g0006)  ; accessing form              
++
++     Figure 5–5: Sample Setf Expansion of a SUBSEQ Form    
++
++
++ ++

In some cases, if a subform of a place is itself ++a place, it is necessary to expand the subform ++in order to compute some of the values in the expansion of the outer ++place. For (ldb bs (car exp)): ++

++
++
  (g0001 g0002)            ;list of temporary variables  
++  (bs exp)                 ;list of value forms          
++  (g0003)                  ;list of store variables      
++  (progn (rplaca g0002 (dpb g0003 g0001 (car g0002))) g0003) 
++                           ;storing form                 
++  (ldb g0001 (car g0002))  ; accessing form              
++
++     Figure 5–6: Sample Setf Expansion of a LDB Form    
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Sharpsign-Asterisk.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++Examples of Sharpsign Asterisk (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.5 Examples of Sharpsign Asterisk

++ ++

For example, ++

++
  #*101111
++ #6*101111
++ #6*101
++ #6*1011
++
++ ++

all mean the same thing: a vector of length 6 ++with elements 1, 0, 1, 1, 1, and 1. ++

++

For example: ++

++
++
 #*         ;An empty bit-vector
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Sharpsign-Vertical_002dBar.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++Examples of Sharpsign Vertical-Bar (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8.21 Examples of Sharpsign Vertical-Bar

++ ++

The following are some examples that exploit the #|...|# notation: ++

++
++
;;; In this example, some debugging code is commented out with #|...|#
++;;; Note that this kind of comment can occur in the middle of a line
++;;; (because a delimiter marks where the end of the comment occurs)
++;;; where a semicolon comment can only occur at the end of a line 
++;;; (because it comments out the rest of the line).
++ (defun add3 (n) #|(format t "~&Adding 3 to ~D." n)|# (+ n 3))
++
++;;; The examples that follow show issues related to #| ... |# nesting.
++
++;;; In this first example, #| and |# always occur properly paired,
++;;; so nesting works naturally.
++ (defun mention-fun-fact-1a ()
++   (format t "CL uses ; and #|...|# in comments."))
++⇒  MENTION-FUN-FACT-1A
++ (mention-fun-fact-1a)
++ |>  CL uses ; and #|...|# in comments.
++⇒  NIL
++ #| (defun mention-fun-fact-1b ()
++      (format t "CL uses ; and #|...|# in comments.")) |#
++ (fboundp 'mention-fun-fact-1b) ⇒  NIL
++
++;;; In this example, vertical-bar followed by sharpsign needed to appear
++;;; in a string without any matching sharpsign followed by vertical-bar
++;;; having preceded this.  To compensate, the programmer has included a
++;;; slash separating the two characters.  In case 2a, the slash is 
++;;; unnecessary but harmless, but in case 2b, the slash is critical to
++;;; allowing the outer #| ... |# pair match.  If the slash were not present,
++;;; the outer comment would terminate prematurely.
++ (defun mention-fun-fact-2a ()
++   (format t "Don't use |\# unmatched or you'll get in trouble!"))
++⇒  MENTION-FUN-FACT-2A
++ (mention-fun-fact-2a)
++ |>  Don't use |# unmatched or you'll get in trouble!
++⇒  NIL
++ #| (defun mention-fun-fact-2b ()
++      (format t "Don't use |\# unmatched or you'll get in trouble!") |#
++ (fboundp 'mention-fun-fact-2b) ⇒  NIL
++
++;;; In this example, the programmer attacks the mismatch problem in a
++;;; different way.  The sharpsign vertical bar in the comment is not needed
++;;; for the correct parsing of the program normally (as in case 3a), but 
++;;; becomes important to avoid premature termination of a comment when such 
++;;; a program is commented out (as in case 3b).
++ (defun mention-fun-fact-3a () ; #|
++   (format t "Don't use |# unmatched or you'll get in trouble!"))
++⇒  MENTION-FUN-FACT-3A
++ (mention-fun-fact-3a)
++ |>  Don't use |# unmatched or you'll get in trouble!
++⇒  NIL
++ #|
++ (defun mention-fun-fact-3b () ; #|
++   (format t "Don't use |# unmatched or you'll get in trouble!"))
++ |#
++ (fboundp 'mention-fun-fact-3b) ⇒  NIL
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Single-Escape-Characters.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Examples of Single Escape Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.8 Examples of Single Escape Characters

++ ++
++
 ;; The following examples assume the readtable case of *readtable* 
++ ;; and *print-case* are both :upcase.
++ (eq 'abc '\A\B\C) ⇒  true
++ (eq 'abc 'a\Bc) ⇒  true
++ (eq 'abc '\ABC) ⇒  true
++ (eq 'abc '\abc) ⇒  false
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Single_002dQuote.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Examples of Single-Quote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Single-Quote  

++
++
++

2.4.3.1 Examples of Single-Quote

++ ++
++
 'foo ⇒  FOO
++ ''foo ⇒  (QUOTE FOO)
++ (car ''foo) ⇒  QUOTE
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Style-for-Semicolon.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Examples of Style for Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Semicolon  

++
++
++

2.4.4.7 Examples of Style for Semicolon

++ ++
++
;;;; Math Utilities
++
++;;; FIB computes the the Fibonacci function in the traditional
++;;; recursive way.
++
++(defun fib (n)
++  (check-type n integer)
++  ;; At this point we're sure we have an integer argument.
++  ;; Now we can get down to some serious computation.
++  (cond ((< n 0)
++         ;; Hey, this is just supposed to be a simple example.
++         ;; Did you really expect me to handle the general case?
++         (error "FIB got ~D as an argument." n))
++        ((< n 2) n)             ;fib[0]=0 and fib[1]=1
++        ;; The cheap cases didn't work.
++        ;; Nothing more to do but recurse.
++        (t (+ (fib (- n 1))     ;The traditional formula
++              (fib (- n 2)))))) ; is fib[n-1]+fib[n-2].
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Suppressing-Keyword-Argument-Checking.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Examples of Suppressing Keyword Argument Checking (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.6 Examples of Suppressing Keyword Argument Checking

++ ++
++
;;; The caller can supply :ALLOW-OTHER-KEYS T to suppress checking.
++ ((lambda (&key x) x) :x 1 :y 2 :allow-other-keys t) ⇒  1
++;;; The callee can use &ALLOW-OTHER-KEYS to suppress checking.
++ ((lambda (&key x &allow-other-keys) x) :x 1 :y 2) ⇒  1
++;;; :ALLOW-OTHER-KEYS NIL is always permitted.
++ ((lambda (&key) t) :allow-other-keys nil) ⇒  T
++;;; As with other keyword arguments, only the left-most pair
++;;; named :ALLOW-OTHER-KEYS has any effect.
++ ((lambda (&key x) x) 
++  :x 1 :y 2 :allow-other-keys t :allow-other-keys nil)
++⇒  1
++;;; Only the left-most pair named :ALLOW-OTHER-KEYS has any effect,
++;;; so in safe code this signals a PROGRAM-ERROR (and might enter the
++;;; debugger).  In unsafe code, the consequences are undefined.
++ ((lambda (&key x) x)                   ;This call is not valid
++  :x 1 :y 2 :allow-other-keys nil :allow-other-keys t)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Transfer-of-Control-during-a-Destructive-Operation.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Examples of Transfer of Control during a Destructive Operation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.7.2.1 Examples of Transfer of Control during a Destructive Operation

++ ++

The following examples illustrate some of the many ways in which the ++implementation-dependent nature of the modification can manifest ++itself. ++

++
++
 (let ((a (list 2 1 4 3 7 6 'five)))
++   (ignore-errors (sort a #'<))
++   a)
++⇒  (1 2 3 4 6 7 FIVE)
++OR⇒ (2 1 4 3 7 6 FIVE)
++OR⇒ (2)
++
++ (prog foo ((a (list 1 2 3 4 5 6 7 8 9 10)))
++   (sort a #'(lambda (x y) (if (zerop (random 5)) (return-from foo a) (> x y)))))
++⇒  (1 2 3 4 5 6 7 8 9 10)
++OR⇒ (3 4 5 6 2 7 8 9 10 1)
++OR⇒ (1 2 4 3)
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Truenames.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Examples of Truenames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Truenames  

++
++
++

20.1.3.1 Examples of Truenames

++ ++

For example, a DEC TOPS-20 system with files PS:<JOE>FOO.TXT.1 ++and PS:<JOE>FOO.TXT.2 might permit the second file to be referred ++to as PS:<JOE>FOO.TXT.0, since the “.0” notation denotes “newest” ++version of several files. ++In the same file system, a “logical device” “JOE:” might be ++taken to refer to PS:<JOE>” and so the names JOE:FOO.TXT.2 or ++JOE:FOO.TXT.0 might refer to PS:<JOE>FOO.TXT.2. ++In all of these cases, the truename of the file would probably be ++PS:<JOE>FOO.TXT.2. ++

++

If a file is a symbolic link to another file (in a file system ++permitting such a thing), it is conventional for the truename to be ++the canonical name of the file after any symbolic links have been followed; ++that is, it is the canonical name of the file whose contents would ++become available if an input stream to that file were ++opened. ++

++

In the case of a file still being created (that is, of an output ++stream open to such a file), the exact truename of the file ++might not be known until the stream is closed. In this case, ++the function truename might return different values for such a stream ++before and after it was closed. In fact, before it is closed, the name returned ++might not even be a valid name in the file system—for example, while a ++file is being written, it might have version :newest and might only take on ++a specific numeric value later when the file is closed even in a file system ++where all files have numeric versions. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-WHEN-clause.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++Examples of WHEN clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.6.1 Examples of WHEN clause

++ ++
++
;; Signal an exceptional condition.
++ (loop for item in '(1 2 3 a 4 5)
++       when (not (numberp item))
++        return (cerror "enter new value" "non-numeric value: ~s" item))
++Error: non-numeric value: A
++
++;; The previous example is equivalent to the following one.
++ (loop for item in '(1 2 3 a 4 5)
++       when (not (numberp item))
++        do (return 
++            (cerror "Enter new value" "non-numeric value: ~s" item)))
++Error: non-numeric value: A
++
++ ++
++
;; This example parses a simple printed string representation from 
++;; BUFFER (which is itself a string) and returns the index of the
++;; closing double-quote character.
++ (let ((buffer "\"a\" \"b\""))
++   (loop initially (unless (char= (char buffer 0) #\")
++                     (loop-finish))
++         for i of-type fixnum from 1 below (length (the string buffer))
++         when (char= (char buffer i) #\")
++          return i))
++⇒  2
++
++;; The collected value is returned.
++ (loop for i from 1 to 10
++       when (> i 5)
++         collect i
++       finally (prin1 'got-here))
++ |>  GOT-HERE
++⇒  (6 7 8 9 10) 
++
++;; Return both the count of collected numbers and the numbers.
++ (loop for i from 1 to 10
++       when (> i 5)
++         collect i into number-list
++         and count i into number-count
++       finally (return (values number-count number-list)))
++⇒  5, (6 7 8 9 10)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-WHILE-and-UNTIL-clauses.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Examples of WHILE and UNTIL clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Termination Test Clauses  

++
++
++

6.1.4.3 Examples of WHILE and UNTIL clauses

++ ++
++
 (loop while (hungry-p) do (eat))
++
++;; UNTIL NOT is equivalent to WHILE.
++ (loop until (not (hungry-p)) do (eat))
++
++;; Collect the length and the items of STACK.
++ (let ((stack '(a b c d e f)))
++   (loop for item = (length stack) then (pop stack)
++         collect item
++         while stack))
++⇒  (6 A B C D E F)
++
++;; Use WHILE to terminate a loop that otherwise wouldn't terminate.
++;; Note that WHILE occurs after the WHEN.
++ (loop for i fixnum from 3
++       when (oddp i) collect i
++       while (< i 5))
++⇒  (3 5)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-WITH-clause.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Examples of WITH clause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.16 Examples of WITH clause

++ ++
++
;; These bindings occur in sequence.
++ (loop with a = 1 
++       with b = (+ a 2) 
++       with c = (+ b 3)
++       return (list a b c))
++⇒  (1 3 6)
++
++;; These bindings occur in parallel.
++ (setq a 5 b 10)
++⇒  10
++ (loop with a = 1
++       and b = (+ a 2)
++       and c = (+ b 3)
++       return (list a b c))
++⇒  (1 7 13)
++
++;; This example shows a shorthand way to declare local variables 
++;; that are of different types.
++ (loop with (a b c) of-type (float integer float)
++       return (format nil "~A ~A ~A" a b c))
++⇒  "0.0 0 0.0"
++
++;; This example shows a shorthand way to declare local variables 
++;; that are the same type.
++ (loop with (a b c) of-type float 
++       return (format nil "~A ~A ~A" a b c))
++⇒  "0.0 0.0 0.0"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-Whitespace-Characters.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Examples of Whitespace Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.10 Examples of Whitespace Characters

++ ++
++
 (length '(this-that)) ⇒  1
++ (length '(this - that)) ⇒  3
++ (length '(a
++           b)) ⇒  2
++ (+ 34) ⇒  34
++ (+ 3 4) ⇒  7
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-clause-grouping.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++Examples of clause grouping (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.8.1 Examples of clause grouping

++ ++
++
;; Group conditional clauses.
++ (loop for i in '(1 324 2345 323 2 4 235 252)
++       when (oddp i)
++         do (print i)
++         and collect i into odd-numbers
++         and do (terpri)
++       else                              ; I is even.
++         collect i into even-numbers
++       finally
++         (return (values odd-numbers even-numbers)))
++ |>  1 
++ |>  
++ |>  2345 
++ |>  
++ |>  323 
++ |>  
++ |>  235 
++⇒  (1 2345 323 235), (324 2 4 252)
++
++;; Collect numbers larger than 3.
++ (loop for i in '(1 2 3 4 5 6)
++       when (and (> i 3) i)
++       collect it)                      ; IT refers to (and (> i 3) i).
++⇒  (4 5 6)
++
++;; Find a number in a list.
++ (loop for i in '(1 2 3 4 5 6)
++       when (and (> i 3) i)
++       return it)
++⇒  4
++
++;; The above example is similar to the following one.
++ (loop for i in '(1 2 3 4 5 6)
++       thereis (and (> i 3) i))
++⇒  4
++
++;; Nest conditional clauses.
++ (let ((list '(0 3.0 apple 4 5 9.8 orange banana)))
++   (loop for i in list
++         when (numberp i)
++           when (floatp i)
++             collect i into float-numbers
++           else                                  ; Not (floatp i)
++             collect i into other-numbers
++         else                                    ; Not (numberp i)
++           when (symbolp i) 
++             collect i into symbol-list
++           else                                  ; Not (symbolp i)
++             do (error "found a funny value in list ~S, value ~S~
++         finally (return (values float-numbers other-numbers symbol-list))))
++⇒  (3.0 9.8), (0 4 5), (APPLE ORANGE BANANA)
++
++;; Without the END preposition, the last AND would apply to the
++;; inner IF rather than the outer one.
++ (loop for x from 0 to 3 
++       do (print x)
++       if (zerop (mod x 2))
++         do (princ " a")
++          and if (zerop (floor x 2))
++                do (princ " b")
++                end
++          and do (princ " c"))
++ |>  0  a b c
++ |>  1 
++ |>  2  a c
++ |>  3 
++⇒  NIL
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-for_002das_002dacross-subclause.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Examples of for-as-across subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.11 Examples of for-as-across subclause

++ ++
++
 (loop for char across (the simple-string (find-message channel))
++       do (write-char char stream))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-for_002das_002darithmetic-subclause.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++Examples of for-as-arithmetic subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.3 Examples of for-as-arithmetic subclause

++ ++
++
;; Print some numbers.
++ (loop for i from 1 to 3
++       do (print i))
++ |>  1
++ |>  2
++ |>  3
++⇒  NIL
++
++;; Print every third number.
++ (loop for i from 10 downto 1 by 3
++       do (print i))
++ |>  10 
++ |>  7 
++ |>  4 
++ |>  1 
++⇒  NIL
++
++;; Step incrementally from the default starting value.
++ (loop for i below 3
++       do (print i))
++ |>  0
++ |>  1
++ |>  2
++⇒  NIL
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-for_002das_002dequals_002dthen-subclause.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Examples of for-as-equals-then subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.9 Examples of for-as-equals-then subclause

++ ++
++
;; Collect some numbers.
++ (loop for item = 1 then (+ item 10)
++       for iteration from 1 to 5
++       collect item)
++⇒  (1 11 21 31 41)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-for_002das_002din_002dlist-subclause.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Examples of for-as-in-list subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.5 Examples of for-as-in-list subclause

++ ++
++
;; Print every item in a list.
++ (loop for item in '(1 2 3) do (print item))
++ |>  1
++ |>  2
++ |>  3
++⇒  NIL
++
++;; Print every other item in a list.
++ (loop for item in '(1 2 3 4 5) by #'cddr
++       do (print item))
++ |>  1
++ |>  3
++ |>  5
++⇒  NIL
++
++;; Destructure a list, and sum the x values using fixnum arithmetic.
++ (loop for (item . x) of-type (t . fixnum) in '((A . 1) (B . 2) (C . 3))
++       unless (eq item 'B) sum x)
++⇒  4
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-for_002das_002don_002dlist-subclause.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Examples of for-as-on-list subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.7 Examples of for-as-on-list subclause

++ ++
++
;; Collect successive tails of a list.
++ (loop for sublist on '(a b c d)
++       collect sublist)
++⇒  ((A B C D) (B C D) (C D) (D))
++
++;; Print a list by using destructuring with the loop keyword ON.
++ (loop for (item) on '(1 2 3)
++       do (print item))
++ |>  1 
++ |>  2 
++ |>  3 
++⇒  NIL
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-for_002das_002dpackage-subclause.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Examples of for-as-package subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.14 Examples of for-as-package subclause

++ ++
++
 (let ((*package* (make-package "TEST-PACKAGE-1")))
++   ;; For effect, intern some symbols
++   (read-from-string "(THIS IS A TEST)")
++   (export (intern "THIS"))
++   (loop for x being each present-symbol of *package*
++          do (print x)))
++ |>  A 
++ |>  TEST 
++ |>  THIS
++ |>  IS 
++⇒  NIL
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-unconditional-execution.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Examples of unconditional execution (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.5.1 Examples of unconditional execution

++ ++
++
;; Print numbers and their squares.
++;; The DO construct applies to multiple forms.
++ (loop for i from 1 to 3
++       do (print i)
++          (print (* i i)))
++ |>  1 
++ |>  1 
++ |>  2 
++ |>  4 
++ |>  3 
++ |>  9 
++⇒  NIL
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Examples-of-using-the-Pretty-Printer.html +@@ -0,0 +1,385 @@ ++ ++ ++ ++ ++ ++Examples of using the Pretty Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.2 Examples of using the Pretty Printer

++ ++

As an example of the interaction of logical blocks, conditional newlines, ++and indentation, consider the function simple-pprint-defun below. This ++function prints out lists whose cars are defun in the ++standard way assuming that the list has exactly length 4. ++

++
++
(defun simple-pprint-defun (*standard-output* list)
++  (pprint-logical-block (*standard-output* list :prefix "(" :suffix ")")
++    (write (first list))
++    (write-char #\Space)
++    (pprint-newline :miser)
++    (pprint-indent :current 0)
++    (write (second list))
++    (write-char #\Space)
++    (pprint-newline :fill)
++    (write (third list))
++    (pprint-indent :block 1)
++    (write-char #\Space)
++    (pprint-newline :linear)
++    (write (fourth list))))
++
++ ++

Suppose that one evaluates the following: ++

++
++
(simple-pprint-defun *standard-output* '(defun prod (x y) (* x y)))
++
++ ++

If the line width available is greater than or equal to 26, then all of the ++output appears on one line. If the line width available is reduced to 25, ++a line break is inserted at the ++linear-style conditional newline ++ ++

++

before the ++expression (* x y), producing the output shown. The ++(pprint-indent :block 1) causes (* x y) to be printed at a relative ++indentation of 1 in the logical block. ++

++
++
 (DEFUN PROD (X Y) 
++   (* X Y))
++
++ ++

If the line width available is 15, a line break is also inserted at the ++fill style conditional newline before the argument list. The call on ++(pprint-indent :current 0) causes the argument list to line up under the ++function name. ++

++
++
(DEFUN PROD
++       (X Y)
++  (* X Y))
++
++ ++

If *print-miser-width* were greater than or equal to 14, the example ++output above would have been as follows, because all indentation changes ++are ignored in miser mode and line breaks are inserted at ++miser-style conditional newlines. ++ ++

++
++
 (DEFUN
++  PROD
++  (X Y)
++  (* X Y))
++
++ ++

As an example of a per-line prefix, consider that evaluating the following ++produces the output shown with a line width of 20 and ++*print-miser-width* of nil. ++

++
++
 (pprint-logical-block (*standard-output* nil :per-line-prefix ";;; ")
++   (simple-pprint-defun *standard-output* '(defun prod (x y) (* x y))))
++
++ ;;; (DEFUN PROD
++ ;;;        (X Y)
++ ;;;   (* X Y))
++
++ ++

As a more complex (and realistic) example, consider the function pprint-let ++below. This specifies how to print a let form in the traditional ++style. It is more complex than the example above, because it has to deal with ++nested structure. Also, unlike the example above it contains complete code to ++readably print any possible list that begins with the symbol let. ++The outermost pprint-logical-block form handles the printing of ++the input list as a whole and specifies that parentheses should be printed in the ++output. The second pprint-logical-block form handles the list ++of binding pairs. Each pair in the list is itself printed by the innermost ++pprint-logical-block. (A loop form is used instead of ++merely decomposing the pair into two objects so that readable output will ++be produced no matter whether the list corresponding to the pair has one element, ++two elements, or (being malformed) has more than two elements.) ++A space and a ++fill-style conditional newline ++ ++

++

are placed after ++each pair except the last. The loop at the end of the topmost ++pprint-logical-block form prints out the forms in the body ++of the let form separated by spaces and ++linear-style conditional newlines. ++

++
++
 (defun pprint-let (*standard-output* list)
++   (pprint-logical-block (nil list :prefix "(" :suffix ")")
++     (write (pprint-pop))
++     (pprint-exit-if-list-exhausted)
++     (write-char #\Space)
++     (pprint-logical-block (nil (pprint-pop) :prefix "(" :suffix ")")
++       (pprint-exit-if-list-exhausted)
++       (loop (pprint-logical-block (nil (pprint-pop) :prefix "(" :suffix ")")
++               (pprint-exit-if-list-exhausted)
++               (loop (write (pprint-pop))
++                     (pprint-exit-if-list-exhausted)
++                     (write-char #\Space)
++                     (pprint-newline :linear)))
++             (pprint-exit-if-list-exhausted)
++             (write-char #\Space)
++             (pprint-newline :fill)))
++     (pprint-indent :block 1)
++     (loop (pprint-exit-if-list-exhausted)
++           (write-char #\Space)
++           (pprint-newline :linear)
++           (write (pprint-pop)))))
++
++ ++

Suppose that one evaluates the following with *print-level* being 4, ++and *print-circle* being true. ++

++
++
 (pprint-let *standard-output*
++             '#1=(let (x (*print-length* (f (g 3))) 
++                       (z . 2) (k (car y)))
++                   (setq x (sqrt z)) #1#))
++
++ ++

If the line length is greater than or equal to 77, the output produced ++appears on one line. However, if the line length is 76, line breaks are ++inserted at the linear-style conditional newlines separating the forms in ++the body and the output below is produced. Note that, the degenerate ++binding pair x is printed readably even though it fails to be a list; a ++depth abbreviation marker is printed in place of (g 3); the binding pair ++(z . 2) is printed readably even though it is not a proper list; and ++appropriate circularity markers are printed. ++

++
++
 #1=(LET (X (*PRINT-LENGTH* (F #)) (Z . 2) (K (CAR Y))) 
++      (SETQ X (SQRT Z))
++      #1#)
++
++ ++

If the line length is reduced to 35, a line break is inserted at one of the ++fill-style conditional newlines separating the binding pairs. ++

++
++
 #1=(LET (X (*PRINT-PRETTY* (F #))
++          (Z . 2) (K (CAR Y)))
++      (SETQ X (SQRT Z))
++      #1#)
++
++ ++

Suppose that the line length is further reduced to 22 and *print-length* is ++set to 3. In this situation, line breaks are inserted after both the first ++and second binding pairs. In addition, the second binding pair is itself ++broken across two lines. Clause (b) of the description of fill-style ++conditional newlines (see the function pprint-newline) ++prevents the binding pair (z . 2) from being printed ++at the end of the third line. Note that the length abbreviation hides the ++circularity from view and therefore the printing of circularity markers ++disappears. ++

++
++
 (LET (X
++       (*PRINT-LENGTH*
++        (F #))
++       (Z . 2) ...)
++   (SETQ X (SQRT Z))
++   ...)
++
++ ++

The next function prints a vector using “#(...)” notation. ++

++
++
(defun pprint-vector (*standard-output* v)
++  (pprint-logical-block (nil nil :prefix "#(" :suffix ")")
++    (let ((end (length v)) (i 0))
++      (when (plusp end)
++        (loop (pprint-pop)
++              (write (aref v i))
++              (if (= (incf i) end) (return nil))
++              (write-char #\Space)
++              (pprint-newline :fill))))))
++
++ ++

Evaluating the following with a line length of 15 produces the output shown. ++

++
++
 (pprint-vector *standard-output* '#(12 34 567 8 9012 34 567 89 0 1 23))
++
++ #(12 34 567 8 
++   9012 34 567 
++   89 0 1 23)
++
++ ++

As examples of the convenience of specifying pretty printing with ++format strings, consider that the functions simple-pprint-defun ++and pprint-let used as examples above can be compactly defined as follows. ++(The function pprint-vector cannot be defined using format ++because the data structure it traverses is not a list.) ++

++
++
(defun simple-pprint-defun (*standard-output* list)
++  (format T "~:<~W ~@_~:I~W ~:_~W~1I ~_~W~:>" list))
++
++(defun pprint-let (*standard-output* list)
++  (format T "~:<~W~^~:<~@{~:<~@{~W~^~_~}~:>~^~:_~}~:>~1I~@{~^~_~W~}~:>" list)) 
++
++ ++

In the following example, the first form restores ++*print-pprint-dispatch* to the equivalent of its initial value. ++The next two forms then set up a special way to pretty print ratios. ++Note that the more specific type specifier has to be associated ++with a higher priority. ++

++
++
 (setq *print-pprint-dispatch* (copy-pprint-dispatch nil))
++
++ (set-pprint-dispatch 'ratio
++   #'(lambda (s obj)
++       (format s "#.(/ ~W ~W)" 
++                 (numerator obj) (denominator obj))))
++
++ (set-pprint-dispatch '(and ratio (satisfies minusp))
++   #'(lambda (s obj)
++       (format s "#.(- (/ ~W ~W))" 
++               (- (numerator obj)) (denominator obj)))
++   5)
++
++ (pprint '(1/3 -2/3))
++ (#.(/ 1 3) #.(- (/ 2 3)))
++
++ ++

The following two forms illustrate the definition of ++pretty printing functions for types of code. The first ++form illustrates how to specify the traditional method ++for printing quoted objects using single-quote. Note ++the care taken to ensure that data lists that happen to begin ++with quote will be printed readably. The second form ++specifies that lists beginning with the symbol my-let ++should print the same way that lists beginning with let ++print when the initial pprint dispatch table is in effect. ++

++
++
 (set-pprint-dispatch '(cons (member quote)) () 
++   #'(lambda (s list)
++       (if (and (consp (cdr list)) (null (cddr list)))
++          (funcall (formatter "'~W") s (cadr list))
++          (pprint-fill s list))))
++
++ (set-pprint-dispatch '(cons (member my-let)) 
++                      (pprint-dispatch '(let) nil))
++
++ ++

The next example specifies a default method for printing lists that do not ++correspond to function calls. Note that the functions pprint-linear, ++pprint-fill, and pprint-tabular are all defined with ++optional colon-p and at-sign-p arguments so that they can ++be used as pprint dispatch functions as well as ~/.../ ++functions. ++

++
++
 (set-pprint-dispatch '(cons (not (and symbol (satisfies fboundp))))
++                      #'pprint-fill -5)
++
++ ;; Assume a line length of 9
++ (pprint '(0 b c d e f g h i j k))
++ (0 b c d
++  e f g h
++  i j k)
++
++ ++

This final example shows how to define a pretty printing function for a ++user defined data structure. ++

++
++
 (defstruct family mom kids)
++
++ (set-pprint-dispatch 'family
++   #'(lambda (s f)
++       (funcall (formatter "~@<#<~;~W and ~2I~_~/pprint-fill/~;>~:>")
++               s (family-mom f) (family-kids f))))
++
++ ++

The pretty printing function for the structure family specifies how to ++adjust the layout of the output so that it can fit aesthetically into ++a variety of line widths. In addition, it obeys ++the printer control variables *print-level*, ++*print-length*, *print-lines*, ++*print-circle* ++and *print-escape*, ++and can tolerate several different kinds of malformity in the data structure. ++The output below shows what is printed out with a right margin of 25, ++*print-pretty* being true, *print-escape* being false, ++and a malformed kids list. ++

++
++
 (write (list 'principal-family
++              (make-family :mom "Lucy"
++                           :kids '("Mark" "Bob" . "Dan")))
++        :right-margin 25 :pretty T :escape nil :miser-width nil)
++ (PRINCIPAL-FAMILY
++  #<Lucy and
++      Mark Bob . Dan>)
++
++ ++

Note that a pretty printing function for a structure is different from ++the structure’s print-object method. ++While ++print-object methods ++are permanently associated with a structure, ++pretty printing functions are stored in ++pprint dispatch tables and can be rapidly changed to reflect ++different printing needs. If there is no pretty printing function for ++a structure in the current pprint dispatch table, ++its print-object method ++is used instead. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Exceptional-Situations-in-the-Compiler.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++Exceptional Situations in the Compiler (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.5 Exceptional Situations in the Compiler

++ ++

compile and compile-file are permitted to ++signal errors and warnings, including errors due to compile-time ++processing of (eval-when (:compile-toplevel) ...) forms, ++macro expansion, and conditions signaled by the compiler itself. ++

++

Conditions of type error might be signaled by the compiler ++in situations where the compilation cannot proceed without intervention. ++

++

In addition to situations for which the standard specifies that ++conditions of type warning must or might be signaled, ++warnings might be signaled in situations where the compiler can ++determine that the consequences are undefined or that a run-time ++error will be signaled. Examples of this situation are as follows: ++ violating type declarations, ++ altering or assigning the value of a constant defined with defconstant, ++ calling built-in Lisp functions with a wrong number of arguments or malformed keyword ++ argument lists, ++and using unrecognized declaration specifiers. ++

++

The compiler is permitted to issue warnings about matters of ++programming style as conditions of type style-warning. ++Examples of this situation are as follows: ++ redefining a function using a different argument list, ++ calling a function with a wrong number of arguments, ++ not declaring ignore of a local variable that is not referenced, ++ and referencing a variable declared ignore. ++

++

Both compile and compile-file are permitted ++(but not required) to establish a handler ++for conditions of type error. For example, they ++might signal a warning, and restart compilation from some ++implementation-dependent point in order to let the ++compilation proceed without manual intervention. ++

++

Both compile and compile-file return three ++values, the second two indicating whether the source code being compiled ++contained errors and whether style warnings were issued. ++

++

Some warnings might be deferred until the end of compilation. ++See with-compilation-unit. ++

++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Expanding-Loop-Forms.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++Expanding Loop Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.6 Expanding Loop Forms

++ ++

A loop macro form expands into a form containing ++one or more binding forms (that establish bindings of loop variables) ++and a block and a tagbody (that express a looping control ++structure). The variables established in loop are bound as ++if by let or lambda. ++

++

Implementations can interleave the setting of initial values with the bindings. ++However, the assignment of the initial values is always calculated in the order ++specified by the user. A variable is thus sometimes bound to a meaningless value ++of the correct type, and then later in the prologue it is set to the true ++initial value by using setq. ++

++

One implication of this interleaving is that it is implementation-dependent ++whether the lexical environment in which the initial value forms ++(variously called the form1, form2, form3, step-fun, ++ vector, hash-table, and package) in any for-as-subclause, ++except for-as-equals-then, ++are evaluated includes only the loop variables preceding that form ++or includes more or all of the loop variables; ++the form1 and form2 in a for-as-equals-then form ++includes the lexical environment of all the loop variables. ++

++

After the form is expanded, it consists of three basic parts in the ++tagbody: ++ the loop prologue, ++ the loop body, ++ and the loop epilogue. ++

++
++
Loop prologue
++

The loop prologue contains forms ++that are executed before iteration begins, such as ++any automatic variable initializations prescribed ++by the variable clauses, along with any initially clauses ++in the order they appear in the source. ++

++
++
Loop body
++

The loop body contains those forms that are executed during iteration, ++including application-specific calculations, termination tests, ++and variable stepping_1. ++

++
++
Loop epilogue
++

The loop epilogue contains forms that are executed after iteration ++terminates, such as finally clauses, if any, along ++with any implicit return value from an accumulation clause or ++an termination-test clause. ++

++
++
++ ++

Some clauses from the source form ++contribute code only to the loop prologue; these clauses must ++ come before other clauses that are in the main body of the loop form. ++ Others contribute code only to the loop epilogue. ++ All other clauses contribute to the final ++translated form in the same ++ order given in the original source form of the loop. ++

++

Expansion of the loop macro produces an implicit block named nil ++

++

unless named is supplied. ++

++

Thus, return-from (and sometimes return) ++can be used to return values from loop or to exit loop. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Extended-Loop.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Extended Loop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Overview of the Loop Facility  

++
++
++

6.1.1.3 Extended Loop

++ ++

An extended loop form is one that has a body containing ++atomic expressions. When the loop macro processes such a ++form, it invokes a facility that is commonly called “the Loop Facility.” ++

++

The Loop Facility provides standardized access to mechanisms commonly used ++in iterations through Loop schemas, which are introduced by loop keywords. ++

++

The body of an extended loop form is divided into loop clauses, ++each which is in turn made up of loop keywords and forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Extensions-to-Similarity-Rules.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Extensions to Similarity Rules (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4.5 Extensions to Similarity Rules

++ ++

Some objects, such as streams, readtables, and methods ++are not externalizable objects under the definition of similarity given above. ++That is, such objects may not portably appear as literal objects ++in code to be processed by the file compiler. ++

++

An implementation is permitted to extend the rules of similarity, ++so that other kinds of objects are externalizable objects ++for that implementation. ++

++

If for some kind of object, similarity is ++neither defined by this specification ++ nor by the implementation, ++then the file compiler must signal an error upon encountering such ++an object as a literal constant. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Extent.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++Extent (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation  

++
++
++

3.1.6 Extent

++ ++

Contorted-example works only because the ++function named by f is invoked during the extent of the ++exit point. ++Once the flow of execution has left the block, ++the exit point is disestablished. For example: ++

++
++
 (defun invalid-example ()
++   (let ((y (block here #'(lambda (z) (return-from here z)))))
++     (if (numberp y) y (funcall y 5))))
++
++ ++

One might expect the call (invalid-example) to produce 5 ++by the following incorrect reasoning: ++let binds y to the ++value of block; this value is a function resulting ++from the lambda expression. Because y is not a number, it is ++invoked on the value 5. The return-from should then ++return this value from the ++exit point named here, thereby ++exiting from the block again and giving y the value 5 ++which, being a number, is then returned as the value of the call ++to invalid-example. ++

++

The argument fails only because exit points have ++dynamic extent. The argument is correct up to the execution of ++return-from. The execution of return-from ++should signal an error of type control-error, however, not ++because it cannot refer to the exit point, but because it ++does correctly refer to an exit point and that ++exit point has been disestablished. ++

++

A reference by name to a dynamic exit point binding such as ++a catch tag refers to the most recently ++established binding of that name that has not been ++disestablished. For example: ++

++
++
 (defun fun1 (x)
++   (catch 'trap (+ 3 (fun2 x))))
++ (defun fun2 (y)
++   (catch 'trap (* 5 (fun3 y))))
++ (defun fun3 (z)
++   (throw 'trap z))
++
++ ++

Consider the call (fun1 7). The result is 10. At the time ++the throw is executed, there are two outstanding catchers with the ++name trap: one established within procedure fun1, and the other ++within procedure fun2. The latter is the more recent, and so the ++value 7 is returned from catch in fun2. ++Viewed from within fun3, the catch ++in fun2 shadows the one in fun1. ++Had fun2 been defined as ++

++
++
 (defun fun2 (y)
++   (catch 'snare (* 5 (fun3 y))))
++
++ ++

then the two exit points ++would have different names, and therefore the one ++in fun1 would not be shadowed. The result would then have been 7. ++

++
++
++

++Next: , Previous: , Up: Evaluation  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Externalizable-Objects.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Externalizable Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4.1 Externalizable Objects

++ ++

The fact that the file compiler represents literal objects ++externally in a compiled file and must later reconstruct suitable ++equivalents of those objects when that file is loaded ++imposes a need for constraints on the nature of the objects that can be ++used as literal objects in code to be processed ++by the file compiler. ++

++

An object that can be used as a literal object ++in code to be processed by the file compiler is called an ++externalizable object ++ ++. ++

++

We define that two objects are similar ++ ++ if they satisfy ++a two-place conceptual equivalence predicate (defined below), which is ++independent of the Lisp image so that the two objects in ++different Lisp images can be understood to be equivalent under ++this predicate. Further, by inspecting the definition of this conceptual ++predicate, the programmer can anticipate what aspects of an object ++are reliably preserved by file compilation. ++

++

The file compiler must cooperate with the loader in order to ++assure that in each case where an externalizable object is processed ++as a literal object, the loader will construct a similar ++object. ++

++

The set of objects that are externalizable objects ++ ++ are those ++for which the new conceptual term “similar” is defined, such that ++when a compiled file is loaded, an object can be constructed ++which can be shown to be similar to the original object which ++existed at the time the file compiler was operating. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Basic-Output.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++FORMAT Basic Output (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Formatted Output  

++
++
++

22.3.1 FORMAT Basic Output

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Control_002dFlow-Operations.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++FORMAT Control-Flow Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7 FORMAT Control-Flow Operations

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Floating_002dPoint-Printers.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++FORMAT Floating-Point Printers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.3 FORMAT Floating-Point Printers

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Layout-Control.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++FORMAT Layout Control (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.6 FORMAT Layout Control

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Miscellaneous-Operations.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++FORMAT Miscellaneous Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.8 FORMAT Miscellaneous Operations

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Miscellaneous-Pseudo_002dOperations.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++FORMAT Miscellaneous Pseudo-Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.9 FORMAT Miscellaneous Pseudo-Operations

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Pretty-Printer-Operations.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++FORMAT Pretty Printer Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.5 FORMAT Pretty Printer Operations

++ ++

The following constructs provide access to the pretty printer: ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Printer-Operations.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++FORMAT Printer Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.4 FORMAT Printer Operations

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/FORMAT-Radix-Control.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++FORMAT Radix Control (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.2 FORMAT Radix Control

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Feature-Expressions.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Feature Expressions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Features  

++
++
++

24.1.2.1 Feature Expressions

++ ++

Boolean combinations of features, called feature expressions ++ ++, ++are used by the #+ and #- reader macros in order to ++direct conditional reading of expressions by the Lisp reader. ++

++

The rules for interpreting a feature expression are as follows: ++

++
++
feature
++

If a symbol naming a feature is used as a feature expression, ++the feature expression succeeds if that feature is present; ++otherwise it fails. ++

++
++
(not feature-conditional)
++

A not feature expression succeeds ++if its argument feature-conditional fails; ++otherwise, it succeeds. ++

++
++
(and {feature-conditional}*)
++

An and feature expression succeeds ++if all of its argument feature-conditionals succeed; ++otherwise, it fails. ++

++
++
(or {feature-conditional}*)
++

An or feature expression succeeds ++if any of its argument feature-conditionals succeed; ++otherwise, it fails. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Features.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: System Construction Concepts  

++
++
++

24.1.2 Features

++ ++

A feature ++ ++ is an aspect or attribute ++ of Common Lisp, ++ of the implementation, ++ or of the environment. ++A feature is identified by a symbol. ++

++

A feature is said to be present ++ ++ in a Lisp image ++if and only if the symbol naming it is an element of the ++list held by the variable *features*, ++which is called the features list ++ ++. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/File-Compilation.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++File Compilation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.3 File Compilation

++ ++

The function compile-file performs compilation of ++forms in a file following the rules specified in Compilation Semantics, ++and produces an output file that can be loaded by using load. ++

++

Normally, the top level forms appearing in a file compiled with ++compile-file are evaluated only when the resulting ++compiled file is loaded, and not when the file is compiled. However, ++it is typically the case that some forms in the file need to be evaluated ++at compile time so the ++remainder of the file can be read and compiled correctly. ++

++

The eval-when special form can be used to control ++whether a top level form is evaluated at compile time, load ++time, or both. It is possible to specify any of three situations with ++eval-when, denoted by the symbols :compile-toplevel, ++:load-toplevel, and :execute. For top level ++eval-when forms, :compile-toplevel specifies that the ++compiler must evaluate the body at compile time, and :load-toplevel specifies that the compiler must arrange to evaluate ++the body at load time. For non-top level eval-when forms, ++:execute specifies that the body must be executed in the run-time ++environment. ++

++

The behavior of this form can be more precisely understood in ++terms of a model of how compile-file processes forms in ++a file to be compiled. There are two processing modes, called ++“not-compile-time” and “compile-time-too”. ++

++

Successive forms are read from the file by compile-file ++and processed in not-compile-time mode; in this mode, ++compile-file arranges for forms to be evaluated only at load time ++and not at compile time. When compile-file is in ++compile-time-too mode, forms are evaluated both at compile time and ++load time. ++

++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/File-Operations-on-Open-and-Closed-Streams.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++File Operations on Open and Closed Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

20.1.2 File Operations on Open and Closed Streams

++ ++

Many functions that perform file operations accept either ++open or closed streams as arguments; ++see Stream Arguments to Standardized Functions. ++

++

Of these, the functions in Figure 20–2 treat open and ++closed streams differently. ++

++
++
  delete-file  file-author      probe-file  
++  directory    file-write-date  truename    
++
++  Figure 20–2: File Functions that Treat Open and Closed Streams Differently
++
++
++ ++

Since treatment of open streams by the file system ++may vary considerably between implementations, however, ++a closed stream might be the most reliable kind of ++argument for some of these functions—in particular, those in ++Figure 20–3. For example, in some file systems, ++open files are written under temporary names ++and not renamed until closed ++and/or are held invisible until closed. ++In general, any code that is intended to be portable should ++use such functions carefully. ++

++
++
  directory  probe-file  truename  
++
++  Figure 20–3: File Functions where Closed Streams Might Work Best
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/File-Streams.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++File Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.1.1.6 File Streams

++ ++

Some streams, called file streams ++ ++, provide access to files. ++An object of class file-stream is used to represent a file stream. ++

++

The basic operation for opening a file is open, ++which typically returns a file stream ++(see its dictionary entry for details). ++The basic operation for closing a stream is close. ++The macro with-open-file is useful ++to express the common idiom of opening a file ++for the duration of a given body of code, ++and assuring that the resulting stream is closed upon exit from that body. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/File-System-Concepts.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++File System Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files  

++
++
++

20.1 File System Concepts

++ ++ ++

This section describes the Common Lisp interface to file systems. ++The model used by this interface assumes ++ that files ++ ++ are named by filenames ++ ++, ++ that a filename can be represented by a pathname object, ++ and that given a pathname a stream ++ ++ can be constructed ++ that connects to a file whose filename it represents. ++

++

For information about opening and closing files, ++and manipulating their contents, see Streams. ++

++

Figure 20–1 lists some operators ++that are applicable to files and directories. ++

++
++
  compile-file  file-length      open            
++  delete-file   file-position    probe-file      
++  directory     file-write-date  rename-file     
++  file-author   load             with-open-file  
++
++    Figure 20–1: File and Directory Operations  
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Filenames-Dictionary.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Filenames Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Filenames  

++
++
++

19.4 Filenames Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Filenames.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Filenames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

19 Filenames

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Files-Dictionary.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Files Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Files  

++
++
++

20.2 Files Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Files.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Files (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

20 Files

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Fill-Pointers.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Fill Pointers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Array Elements  

++
++
++

15.1.1.6 Fill Pointers

++ ++

A fill pointer ++ ++ is a non-negative integer no ++larger than the total number of elements in a vector. ++Not all vectors have fill pointers. ++See the functions make-array and adjust-array. ++

++

An element of a vector is said to be active ++ ++ if it has ++an index that is greater than or equal to zero, ++but less than the fill pointer (if any). ++For an array that has no fill pointer, ++all elements are considered active. ++

++

Only vectors may have fill pointers; ++multidimensional arrays may not. ++A multidimensional array that is displaced to a vector ++that has a fill pointer can be created. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Floating_002dpoint-Computations.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Floating-point Computations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.4 Floating-point Computations

++ ++

The following rules apply to floating point computations. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Font-Key.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++Font Key (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.1 Font Key

++ ++ ++ ++

Fonts are used in this document to convey information. ++

++
++
name
++

Denotes a formal term whose meaning is defined in the Glossary. ++When this font is used, the Glossary definition takes precedence ++over normal English usage. ++

++

Sometimes a glossary term appears subscripted, ++as in “whitespace_2.” ++Such a notation selects one particular Glossary definition out of several, ++in this case the second. ++The subscript notation for Glossary terms is generally used where the ++context might be insufficient to disambiguate among the available definitions. ++

++
++
name
++
++ ++

Denotes the introduction of a formal term locally to the current text. ++There is still a corresponding glossary entry, and is formally equivalent ++to a use of “name,” but the hope is that making such uses ++conspicuous will save the reader a trip to the glossary in some cases. ++

++
++
name
++

Denotes a symbol in the COMMON-LISP package. ++For information about case conventions, ++see Case in Symbols. ++

++
++
name
++

Denotes a sample name or piece of code that a programmer ++might write in Common Lisp. ++

++

This font is also used for certain standardized names that are not ++names of external symbols of the COMMON-LISP package, ++such as keywords_1, ++ package names, ++ and loop keywords. ++

++
++
name
++

Denotes the name of a parameter or value. ++

++

In some situations the notation “<<name>>” (i.e., the same font, ++but with surrounding “angle brackets”) is used instead in order to ++provide better visual separation from surrounding characters. These ++“angle brackets” are metasyntactic, and never actually appear in program ++input or output. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Form-Evaluation.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Form Evaluation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.1 Form Evaluation

++ ++

Forms fall into three categories: ++symbols, conses, and self-evaluating objects. ++The following sections explain these categories. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Format-Directive-Interface.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++Format Directive Interface (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.1.2 Format Directive Interface

++ ++

The primary interface to operations for dynamically determining the ++arrangement of output is provided through the functions and macros of the ++pretty printer. Figure 22–3 shows the defined names related to pretty printing. ++

++
++
  *print-lines*            pprint-dispatch                pprint-pop           
++  *print-miser-width*      pprint-exit-if-list-exhausted  pprint-tab           
++  *print-pprint-dispatch*  pprint-fill                    pprint-tabular       
++  *print-right-margin*     pprint-indent                  set-pprint-dispatch  
++  copy-pprint-dispatch     pprint-linear                  write                
++  format                   pprint-logical-block                                
++  formatter                pprint-newline                                      
++
++             Figure 22–3: Defined names related to pretty printing.           
++
++
++ ++

Figure 22–4 identifies a set of format directives which serve ++as an alternate interface to the same pretty printing operations in a ++more textually compact form. ++

++
++
  ~I   ~W      ~<...~:>  
++  ~:T  ~/.../  ~_        
++
++  Figure 22–4: Format directives related to Pretty Printing
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Formatted-Output.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++Formatted Output (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer  

++
++
++

22.3 Formatted Output

++ ++ ++

[Editorial Note by KMP: This is transplanted from FORMAT and will need a bit of work before ++ it looks good standing alone. Bear with me.] ++

++

format is useful for producing nicely formatted text, producing ++good-looking messages, and so on. format can generate and return ++a string or output to destination. ++

++

The control-string argument to format is actually a format control. ++That is, it can be either a format string or a function, ++for example a function returned ++by the formatter macro. ++

++

If it is a function, the function is called with the appropriate ++output stream as its first argument and the data arguments to format ++as its remaining arguments. The function should perform whatever output is ++necessary and return the unused tail of the arguments (if any). ++

++

The compilation process performed by formatter produces a function ++that would do with its arguments as the format interpreter ++would do with those arguments. ++

++

The remainder of this section describes what happens if the control-string ++is a format string. ++

++

Control-string is composed of simple text (characters) ++and embedded directives. ++

++

format writes the simple text as is; ++each embedded directive specifies further text output ++that is to appear at the corresponding point within the simple text. ++Most directives use one or more elements of args to ++create their output. ++

++

A directive consists of a tilde, ++optional prefix parameters ++separated by commas, optional colon and at-sign modifiers, ++and a single character indicating what kind of directive this is. ++

++

There is no required ordering between the at-sign and colon modifier. ++

++

The case of the directive character is ignored. ++Prefix parameters are notated as signed (sign is optional) decimal numbers, ++or as a single-quote followed by a character. ++For example, ~5,'0d can be used ++to print an integer ++in decimal radix in five columns with leading zeros, ++or ~5,'*d to get leading asterisks. ++

++

In place of a prefix parameter to a directive, V (or v) can be used. ++In this case, format takes an argument from args as a parameter to ++the directive. The argument should be an integer or character. ++If the arg used by a V parameter is nil, ++the effect is as if the parameter had been omitted. ++# can be used in place of a prefix parameter; it ++represents the number of args remaining to be processed. ++When used within a recursive format, in the context of ~? or ~{, ++the # prefix parameter represents the number of format arguments ++remaining within the recursive call. ++

++

Examples of format strings: ++

++
++
  "~S"        ;This is an S directive with no parameters or modifiers.  
++  "~3,-4:@s"  ;This is an S directive with two parameters, 3 and -4,    
++              ; and both the colon and at-sign flags.                   
++  "~,+4S"     ;Here the first prefix parameter is omitted and takes     
++              ; on its default value, while the second parameter is 4.  
++
++             Figure 22–5: Examples of format control strings           
++
++
++ ++

format sends the output to destination. ++If destination is nil, ++format creates and returns a string ++containing the output from control-string. ++If destination is non-nil, ++it must be a string with a fill pointer, ++a stream, or the symbol t. ++If destination is a string with a fill pointer, ++the output is added to the end of the string. ++If destination is a stream, ++the output is sent to that stream. ++If destination is t, ++the output is sent to standard output. ++

++

In the description of the directives that follows, ++the term arg in general ++refers to the next item of the set of args to be processed. ++The word or phrase at the beginning of each description is a mnemonic ++for the directive. ++

++

format directives do not bind any of the printer control ++variables (*print-...*) except as specified in the following ++descriptions. ++ Implementations may specify the binding of new, implementation-specific ++printer control variables for each format directive, but they ++ may neither bind any standard printer control variables not ++ specified in description of a format ++directive nor fail to bind ++ any standard printer control variables as specified in the ++ description. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Printer  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Function-Call-Forms-as-Places.html +@@ -0,0 +1,282 @@ ++ ++ ++ ++ ++ ++Function Call Forms as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.2 Function Call Forms as Places

++ ++

A function form can be used as a place if it falls ++into one of the following categories: ++

++
++
*
++

A function call form whose first element is the name of ++any one of the functions in Figure 5–7. ++

++

[Editorial Note by KMP: Note that what are in some places still called ‘condition accessors’ ++ are deliberately omitted from this table, and are not labeled as ++ accessors in their entries. I have not yet had time to do a full ++ search for these items and eliminate stray references to them as ‘accessors’, ++ which they are not, but I will do that at some point.] ++

++
++
  aref    cdadr                    get                            
++  bit     cdar                     gethash                        
++  caaaar  cddaar                   logical-pathname-translations  
++  caaadr  cddadr                   macro-function                 
++  caaar   cddar                    ninth                          
++  caadar  cdddar                   nth                            
++  caaddr  cddddr                   readtable-case                 
++  caadr   cdddr                    rest                           
++  caar    cddr                     row-major-aref                 
++  cadaar  cdr                      sbit                           
++  cadadr  char                     schar                          
++  cadar   class-name               second                         
++  caddar  compiler-macro-function  seventh                        
++  cadddr  documentation            sixth                          
++  caddr   eighth                   slot-value                     
++  cadr    elt                      subseq                         
++  car     fdefinition              svref                          
++  cdaaar  fifth                    symbol-function                
++  cdaadr  fill-pointer             symbol-plist                   
++  cdaar   find-class               symbol-value                   
++  cdadar  first                    tenth                          
++  cdaddr  fourth                   third                          
++
++       Figure 5–7: Functions that setf can be used with—1      
++
++
++ ++

In the case of subseq, the replacement value must be a sequence ++whose elements might be contained by the sequence argument to subseq, ++but does not have to be a sequence of the same type ++as the sequence of which the subsequence is specified. ++If the length of the replacement value does not equal the length of ++the subsequence to be replaced, then the shorter length determines ++the number of elements to be stored, as for replace. ++

++
++
*
++

A function call form whose first element is the name of ++a selector function constructed by defstruct. ++

++

The function name must refer to the global function definition, ++rather than a locally defined function. ++

++
++
*
++

A function call form whose first element is the name of ++any one of the functions in Figure 5–8, ++provided that the supplied argument ++to that function is in turn a place form; ++in this case the new place has stored back into it the ++result of applying the supplied “update” function. ++

++
++
  Function name  Argument that is a place  Update function used      
++  ldb            second                    dpb                       
++  mask-field     second                    deposit-field             
++  getf           first                     implementation-dependent  
++
++         Figure 5–8: Functions that setf can be used with—2       
++
++
++ ++

During the setf expansion of these forms, it is necessary to call ++

++

get-setf-expansion ++

++

in order to figure out how the inner, nested generalized variable must be treated. ++

++

The information from ++

++

get-setf-expansion ++

++

is used as follows. ++

++
ldb
++

In a form such as: ++

++

(setf (ldb byte-spec place-form) value-form) ++

++

the place referred to by the place-form must always be both read ++and written; note that the update is to the generalized variable ++specified by place-form, not to any object of type integer. ++

++

Thus this setf should generate code to do the following: ++

++
++
1.
++

Evaluate byte-spec (and bind it into a temporary variable). ++

++
2.
++

Bind the temporary variables for place-form. ++

++
3.
++

Evaluate value-form (and bind ++

++

its value or values into the store variable). ++

++
++
4.
++

Do the read from place-form. ++

++
5.
++

Do the write into place-form with ++the given bits of the integer ++ fetched in step 4 replaced with the value from step 3. ++

++
++ ++

If the evaluation of value-form ++in step 3 alters what is found in place-form, ++such as setting different bits of integer, ++ then the change of the bits denoted by ++byte-spec is to that ++ altered integer, ++because step 4 is done after the value-form ++ evaluation. Nevertheless, the ++ evaluations required for binding ++the temporary variables are done in steps 1 and ++ 2, and thus the expected left-to-right evaluation order is seen. ++For example: ++

++
++
 (setq integer #x69) ⇒  #x69
++ (rotatef (ldb (byte 4 4) integer) 
++          (ldb (byte 4 0) integer))
++ integer ⇒  #x96
++;;; This example is trying to swap two independent bit fields 
++;;; in an integer.  Note that the generalized variable of 
++;;; interest here is just the (possibly local) program variable
++;;; integer.
++
++ ++
++
mask-field
++

This case is the same as ldb in all essential aspects. ++

++
++
getf
++

In a form such as: ++

++

(setf (getf place-form ind-form) value-form) ++

++

the place referred to by place-form must always be both read ++ and written; note that the update is to the generalized variable ++ specified by place-form, not necessarily to the particular ++list ++that is the property list in question. ++

++

Thus this setf should generate code to do the following: ++

++
1.
++

Bind the temporary variables for place-form. ++

++
2.
++

Evaluate ind-form (and bind it into a temporary variable). ++

++
3.
++

Evaluate value-form (and bind ++

++

its value or values into the store variable). ++

++
++
4.
++

Do the read from place-form. ++

++
5.
++

Do the write into place-form with a possibly-new property list ++ obtained by combining the values from steps 2, 3, and 4. ++(Note that the phrase “possibly-new property list” can mean that ++ the former property list is somehow destructively re-used, or it can ++ mean partial or full copying of it. ++Since either copying or destructive re-use can occur, ++the treatment of the resultant value for the ++ possibly-new property list must proceed as if it were a different copy ++ needing to be stored back into the generalized variable.) ++

++
++ ++

If the evaluation of value-form ++in step 3 alters what is found in ++place-form, such as setting a different named property in the list, ++ then the change of the property denoted by ind-form ++is to that ++ altered list, because step 4 is done after the ++value-form ++ evaluation. Nevertheless, the ++ evaluations required for binding ++the temporary variables are done in steps 1 and ++ 2, and thus the expected left-to-right evaluation order is seen. ++

++

For example: ++

++
++
 (setq s (setq r (list (list 'a 1 'b 2 'c 3)))) ⇒  ((a 1 b 2 c 3))
++ (setf (getf (car r) 'b) 
++       (progn (setq r nil) 6)) ⇒  6
++ r ⇒  NIL
++ s ⇒  ((A 1 B 6 C 3))
++;;; Note that the (setq r nil) does not affect the actions of 
++;;; the SETF because the value of R had already been saved in 
++;;; a temporary variable as part of the step 1. Only the CAR
++;;; of this value will be retrieved, and subsequently modified 
++;;; after the value computation.
++
++ ++
++
++ ++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Function-Forms.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++Function Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++
++

3.1.2.10 Function Forms

++ ++

If the operator is a symbol naming a function, ++the form represents a function form, ++and the cdr of the list contains the forms ++which when evaluated will supply the arguments passed to the function. ++

++

When a function name is not defined, ++an error of type undefined-function should be signaled at run time; ++see Semantic Constraints. ++

++

A function form is evaluated as follows: ++

++

The subforms in the cdr of the original form ++are evaluated in left-to-right order in the current lexical and ++dynamic environments. The primary value of each ++such evaluation becomes an argument to the named function; ++any additional values returned by the subforms are discarded. ++

++

The functional value of the operator ++is retrieved from the lexical environment, ++and that function is invoked with the indicated arguments. ++

++

Although the order of evaluation of ++the argument subforms themselves is ++strictly left-to-right, it is not specified whether ++the definition of the operator in a function form is looked up ++before the evaluation of the argument subforms, ++after the evaluation of the argument subforms, ++or between the evaluation of any two argument subforms ++if there is more than one such argument subform. ++For example, the following might return 23 or~24. ++

++
++
 (defun foo (x) (+ x 3))
++ (defun bar () (setf (symbol-function 'foo) #'(lambda (x) (+ x 4))))
++ (foo (progn (bar) 20))
++
++ ++

A binding for a function name can be established in ++one of several ways. A binding for a function name in ++the global environment can be established by ++ defun, ++ setf of fdefinition, ++ setf of symbol-function, ++ ensure-generic-function, ++ defmethod (implicitly, due to ensure-generic-function), ++or ++ defgeneric. ++A binding for a function name in the lexical environment ++can be established by ++ flet ++or labels. ++

++

Figure 3–4 lists some defined names that are applicable to functions. ++

++
++
  apply                 fdefinition  mapcan               
++  call-arguments-limit  flet         mapcar               
++  complement            fmakunbound  mapcon               
++  constantly            funcall      mapl                 
++  defgeneric            function     maplist              
++  defmethod             functionp    multiple-value-call  
++  defun                 labels       reduce               
++  fboundp               map          symbol-function      
++
++      Figure 3–4: Some function-related defined names    
++
++
++ ++
++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/General-Restrictions-on-Parameters-that-must-be-Lists.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++General Restrictions on Parameters that must be Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conses as Lists  

++
++
++

14.1.2.3 General Restrictions on Parameters that must be Lists

++ ++

Except as explicitly specified otherwise, ++any standardized function that takes a parameter ++that is required to be a list should be prepared to signal ++an error of type type-error if the value received is a dotted list. ++

++

Except as explicitly specified otherwise, ++for any standardized function that takes a parameter ++that is required to be a list, ++the consequences are undefined ++if that list is circular. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/General-Restrictions-on-Parameters-that-must-be-Sequences.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++General Restrictions on Parameters that must be Sequences (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Sequence Concepts  

++
++
++

17.1.1 General Restrictions on Parameters that must be Sequences

++ ++

In general, lists (including association lists and property lists) ++that are treated as sequences must be proper lists. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/General-Restrictions-on-Parameters-that-must-be-Trees.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++General Restrictions on Parameters that must be Trees (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conses as Trees  

++
++
++

14.1.1.1 General Restrictions on Parameters that must be Trees

++ ++

Except as explicitly stated otherwise, ++for any standardized function that takes a parameter ++that is required to be a tree, ++the consequences are undefined ++if that tree is circular. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Generalized-Reference.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Generalized Reference (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1 Generalized Reference

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Generic-Function-Lambda-Lists.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++Generic Function Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.2 Generic Function Lambda Lists

++ ++

A generic function lambda list ++ ++ is used to describe the overall shape of ++the argument list to be accepted by a generic function. ++Individual method signatures might contribute additional ++keyword parameters to the lambda list of the effective method. ++

++

A generic function lambda list is used by defgeneric. ++

++

A generic function lambda list has the following syntax: ++

++

lambda-list ::=({var}* ++                 [&optional {var | (var)}*] ++                 [&rest var] ++                 [&key {var | ({var |          (keyword-name var)})}* pt [&allow-other-keys]]) ++                ++

++

A generic function lambda list can contain the lambda list keywords shown ++in Figure 3–14. ++

++
++
  &allow-other-keys  &optional    
++  &key               &rest        
++
++  Figure 3–14: Lambda List Keywords used by Generic Function Lambda Lists
++
++
++ ++

A generic function lambda list differs from an ordinary lambda list ++in the following ways: ++

++
++
Required arguments
++

Zero or more required parameters must be specified. ++

++
++
Optional and keyword arguments
++

Optional parameters and keyword parameters may not have ++default initial value forms nor use supplied-p parameters. ++

++
++
Use of &aux
++

The use of &aux is not allowed. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Generic-Functions-and-Methods.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Generic Functions and Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects  

++
++
++

7.6 Generic Functions and Methods

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Glossary-_0028Glossary_0029.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Glossary (Glossary) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

26 Glossary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Glossary.html +@@ -0,0 +1,6801 @@ ++ ++ ++ ++ ++ ++Glossary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Glossary (Glossary)  

++
++
++

26.1 Glossary

++ ++ ++

Each entry in this glossary has the following parts: ++

++
++
*
++

the term being defined, set in boldface. ++

++
++
*
++

optional pronunciation, enclosed in square brackets and ++set in boldface, as in the following example: ++pronounced ’a ,list . The pronunciation key follows ++Webster’s Third New International Dictionary ++ the English Language, Unabridged, ++ except that “e” is used to notate the schwa (upside-down “e”) character. ++

++
++
*
++

the part or parts of speech, set in italics. If a term ++can be used as several parts of speech, there is a separate definition ++for each part of speech. ++

++
++
*
++

one or more definitions, organized as follows: ++

++
++
++

an optional number, present if there are several ++definitions. Lowercase letters might also be used in cases where subdefinitions of ++a numbered definition are necessary. ++

++
++
++

an optional part of speech, set in italics, present if the ++term is one of several parts of speech. ++

++
++
++

an optional discipline, set in italics, present if the term ++has a standard definition being repeated. For example, “Math.” ++

++
++
++

an optional context, present if this definition is ++meaningful only in that context. For example, “(of a symbol)”. ++

++
++
++

the definition. ++

++
++
++

an optional example sentence. For example, ++ “This is an example of an example.” ++

++
++
++

optional cross references. ++

++
++
++ ++
++
++ ++

In addition, some terms have idiomatic usage in the Common Lisp ++community which is not shared by other communities, or which is not ++technically correct. Definitions labeled “Idiom.” represent ++such idiomatic usage; these definitions are sometimes followed by an ++explanatory note. ++

++

Words in this font are words with entries in the glossary. ++Words in example sentences do not follow this convention. ++

++

When an ambiguity arises, the longest matching substring has precedence. ++For example, “complex float” refers to a single glossary entry ++for “complex float” rather than the combined meaning of the ++glossary terms “complex” and “float.” ++

++

Subscript notation, as in “something_n” means that ++the nth definition of “something” is intended. This ++notation is used only in situations where the context might be insufficient ++to disambiguate. ++

++

The following are abbreviations used in the glossary: ++

++

Abbreviation Meaning ++

++
adj.
++

adjective ++

++
adv.
++

adverb ++

++
ANSI
++

compatible with one or more ANSI standards ++

++
Comp.
++

computers ++

++
Idiom.
++

idiomatic ++

++
IEEE
++

compatible with one or more IEEE standards ++

++
ISO
++

compatible with one or more ISO standards ++

++
Math.
++

mathematics ++

++
Trad.
++

traditional ++

++
n.
++

noun ++

++
v.
++

verb ++

++
v.t.
++

transitive verb ++

++
++ ++ ++

Non-alphabetic

++
++
++ ++
++
()
++

pronounced ’nil , n. ++ an alternative notation for writing the symbol~nil, used to emphasize ++ the use of nil as an empty list. ++

++
++
++

A

++
++
++ ++
++
absolute
++

adj. ++ 1. (of a time) ++ representing a specific point in time. ++ 2. (of a pathname) ++ representing a specific position in a directory hierarchy. ++ See relative. ++

++ ++
++
access
++

n., v.t. ++ 1. v.t. (a place, or array) ++ to read_1 or write_1 the value of ++ the place ++ or an element of the array. ++ 2. n. (of a place) ++ an attempt to access_1 the value of the place. ++

++ ++
++
accessibility
++

n. ++ the state of being accessible. ++

++ ++
++
accessible
++

adj. ++ 1. (of an object) capable of being referenced. ++ 2. (of shared slots or local slots in an instance of ++ a class) having been defined by the class ++ of the instance or inherited from a ++ superclass of that class. ++ 3. (of a symbol in a package) ++ capable of being referenced without a package prefix ++ when that package is current, regardless of whether the ++ symbol is present in that package or is inherited. ++

++ ++
++
accessor
++

n. ++ an operator that performs an access. ++ See reader and writer. ++

++ ++
++
active
++

adj. ++ 1. (of a handler, a restart, or a catch tag) ++ having been established but not yet disestablished. ++ 2. (of an element of an array) ++ having an index that is greater than or equal to zero, ++ but less than the fill pointer (if any). ++ For an array that has no fill pointer, ++ all elements are considered active. ++

++ ++
++
actual adjustability
++

n. (of an array) ++ a generalized boolean that is associated with the array, ++ representing whether the array is actually adjustable. ++ See also expressed adjustability and adjustable-array-p. ++

++ ++
++
actual argument
++

n. Trad. ++ an argument. ++

++ ++
++
actual array element type
++

n. (of an array) ++ the type for which the array is actually specialized, ++ which is the upgraded array element type of ++ the expressed array element type of the array. ++ See the function array-element-type. ++

++ ++
++
actual complex part type
++

n. (of a complex) ++ the type in which the real and imaginary parts of the complex ++ are actually represented, which is the upgraded complex part type of the ++ expressed complex part type of the complex. ++

++ ++
++
actual parameter
++

n. Trad. ++ an argument. ++

++ ++
++
actually adjustable
++

adj. (of an array) ++ such that adjust-array can adjust its characteristics ++ by direct modification. ++ A conforming program may depend on ++ an array being actually adjustable ++ only if either that array is known to have been expressly adjustable ++ or if that array has been explicitly tested by adjustable-array-p. ++

++ ++
++
adjustability
++

n. (of an array) ++ 1. expressed adjustability. ++ 2. actual adjustability. ++

++ ++
++
adjustable
++

adj. (of an array) ++ 1. expressly adjustable. ++ 2. actually adjustable. ++

++ ++
++
after method
++

n. ++ a method having the qualifier :after. ++

++ ++
++
alist
++

pronounced ’\=a ,list , n. ++ an association list. ++

++ ++
++
alphabetic
++

n., adj. ++ 1. adj. (of a character) ++ being one of the standard characters A through Z ++ or a through z, ++ or being any implementation-defined character that has case, ++ or being some other graphic character ++ defined by the implementation to be alphabetic_1. ++ 2. a. n. ++ one of several possible constituent traits of a character. ++ For details, see Constituent Characters and Reader Algorithm. ++ b. adj. (of a character) ++ being a character ++ that has syntax type constituent in the current readtable ++ and that has the constituent trait alphabetic_{2a}. ++ See Figure~2–8. ++

++ ++
++
alphanumeric
++

adj. (of a character) ++ being either an alphabetic_1 character ++ or a numeric character. ++

++ ++
++
ampersand
++

n. ++ the standard character that is called “ampersand” (&). ++ See Figure~2–5. ++

++ ++
++
anonymous
++

adj. ++ 1. (of a class or function) having no name ++ 2. (of a restart) having a name of nil. ++

++ ++
++
apparently uninterned
++

adj. ++ having a home package of nil. (An apparently uninterned symbol ++ might or might not be an uninterned symbol. Uninterned symbols ++ have a home package of nil, but symbols which have been uninterned ++ from their home package also have a home package of nil, ++ even though they might still be interned in some other package.) ++

++ ++
++
applicable
++

adj. ++ 1. (of a handler) being an applicable handler. ++ 2. (of a method) being an applicable method. ++ 3. (of a restart) being an applicable restart. ++

++ ++
++
applicable handler
++

n. (for a condition being signaled) ++ an active handler for which the associated type contains the ++ condition. ++

++ ++
++
applicable method
++

n. (of a generic function ++ called with arguments) ++ a method of the generic function for which the ++ arguments satisfy the parameter specializers ++ of that method. ++ See Selecting the Applicable Methods. ++

++ ++
++
applicable restart
++

n. ++ 1. (for a condition) ++ an active handler for which the associated test returns ++ true when given the condition as an argument. ++ 2. (for no particular condition) ++ an active handler for which the associated test returns ++ true when given nil as an argument. ++

++ ++
++
apply
++

v.t. (a function to a list) ++ to call the function with arguments that are the elements ++ of the list. ++ “Applying the function + to a list of integers returns ++ the sum of the elements of that list.” ++

++ ++
++
argument
++

n. ++ 1. (of a function) an object which is offered as data ++ to the function when it is called. ++

++

2. (of a format control) a format argument. ++

++ ++
++
argument evaluation order
++

n. ++ the order in which arguments are evaluated in a function call. ++ “The argument evaluation order for Common Lisp is left to right.” ++ See Evaluation. ++

++ ++
++
argument precedence order
++

n. ++ the order in which the arguments to a generic function are ++ considered when sorting the applicable methods into precedence order. ++

++ ++
++
around method
++

n. ++ a method having the qualifier :around. ++

++ ++
++
array
++

n. ++ an object of type array, which serves as a container for other ++ objects arranged in a Cartesian coordinate system. ++

++ ++
++
array element type
++

n. (of an array) ++ 1. a type associated with the array, ++ and of which all elements of the array are ++ constrained to be members. ++ 2. the actual array element type of the array. ++ 3. the expressed array element type of the array. ++

++ ++
++
array total size
++

n. ++ the total number of elements in an array, computed by taking ++ the product of the dimensions of the array. ++ (The size of a zero-dimensional array is therefore one.) ++

++ ++
++
assign
++

v.t. (a variable) ++ to change the value of the variable in a binding ++ that has already been established. ++ See the special operator setq. ++

++ ++
++
association list
++

n. ++ a list of conses representing an association ++ of keys with values, where the car of each ++ cons is the key and the cdr is the ++ value associated with that key. ++

++ ++
++
asterisk
++

n. ++ the standard character that is variously called ++ “asterisk” ++ or “star” (*). ++ See Figure~2–5. ++

++ ++
++
at-sign
++

n. ++ the standard character that is variously called ++ “commercial at” ++ or “at sign” (@). ++ See Figure~2–5. ++

++ ++
++
atom
++

n. ++ any object that is not a cons. ++ “A vector is an atom.” ++

++ ++
++
atomic
++

adj. ++ being an atom. ++ “The number 3, the symbol foo, and nil are atomic.” ++

++ ++
++
atomic type specifier
++

n. ++ a type specifier that is atomic. ++ For every atomic type specifier, x, there is an equivalent ++ compound type specifier with no arguments supplied, (x). ++

++ ++
++
attribute
++

n. (of a character) ++ a program-visible aspect of the character. ++ The only standardized attribute of a character ++ is its code_2, but implementations are permitted to have ++ additional implementation-defined attributes. ++ See Character Attributes. ++ “An implementation that support fonts ++ might make font information an attribute of a character, ++ while others might represent font information separately from characters.” ++

++ ++
++
aux variable
++

n. ++ a variable that occurs in the part of a lambda list ++ that was introduced by &aux. Unlike all other variables ++ introduced by a lambda-list, aux variables are not ++ parameters. ++

++ ++
++
auxiliary method
++

n. ++ a member of one of two sets of methods ++ (the set of primary methods is the other) ++ that form an exhaustive partition of the set of methods ++ on the method’s generic function. ++ How these sets are determined is dependent on the method combination type; ++ see Introduction to Methods. ++

++
++
++

B

++
++
++ ++
++
backquote
++

n. ++ the standard character that is variously called ++ “grave accent” ++ or “backquote” (`). ++ See Figure~2–5. ++

++ ++
++
backslash
++

n. ++ the standard character that is variously called ++ “reverse solidus” ++ or “backslash” (\). ++ See Figure~2–5. ++

++ ++
++
base character
++

n. ++ a character ++

++

of type base-char. ++

++ ++
++
base string
++

n. ++ a string of type base-string. ++

++ ++
++
before method
++

n. ++ a method having the qualifier :before. ++

++ ++
++
bidirectional
++

adj. (of a stream) ++ being both an input stream and an output stream. ++

++ ++
++
binary
++

adj. ++ 1. (of a stream) ++ being a stream that has an element type that is a subtype of type integer. ++ The most fundamental operation on a binary input stream ++ is read-byte and on a binary output stream ++ is write-byte. ++ See character. ++ 2. (of a file) ++ having been created by opening a binary stream. ++ (It is implementation-dependent whether this is an detectable aspect ++ of the file, or whether any given character file can be ++ treated as a binary file.) ++

++ ++
++
bind
++

v.t. (a variable) ++ to establish a binding for the variable. ++

++ ++
++
binding
++

n. ++ an association between a name and that which the name ++ denotes. ++ “A lexical binding is a lexical association between a ++ name and its value.” ++

++ ++
++
bit
++

n. ++ an object of type bit; ++ that is, the integer 0 or the integer 1. ++

++ ++
++
bit array
++

n. ++ a specialized array that is of type (array bit), ++ and whose elements are of type bit. ++

++ ++
++
bit vector
++

n. ++ a specialized vector that is of type bit-vector, ++ and whose elements are of type bit. ++

++ ++
++
bit-wise logical operation specifier
++

n. ++ an object which names one of the sixteen possible bit-wise logical ++ operations that can be performed by the boole function, ++ and which is the value of exactly one of the ++ constant variables ++ boole-clr, boole-set, ++ boole-1, boole-2, ++ boole-c1, boole-c2, ++ boole-and, boole-ior, ++ boole-xor, boole-eqv, ++ boole-nand, boole-nor, ++ boole-andc1, boole-andc2, ++ boole-orc1, or boole-orc2. ++

++ ++
++
block
++

n. ++ a named lexical exit point, ++ established explicitly by block ++ or implicitly by operators ++ such as loop, do and prog, ++ to which control and values may be transfered by ++ using a return-from form with the name of the block. ++

++ ++
++
block tag
++

n. ++ the symbol that, within the lexical scope ++ of a block form, names the block ++ established by that block form. ++ See return or return-from. ++

++ ++
++
boa lambda list
++

n. ++ a lambda list that is syntactically like an ordinary lambda list, ++ but that is processed in “by order of argument” style. ++ See Boa Lambda Lists. ++

++ ++
++
body parameter
++

n. ++ a parameter available in certain lambda lists ++ which from the point of view of conforming programs ++ is like a rest parameter in every way except that it is introduced ++ by &body instead of &rest. (Implementations are ++ permitted to provide extensions which distinguish body parameters ++ and rest parameterse.g., the forms for operators ++ which were defined using a body parameter might be pretty printed ++ slightly differently than forms for operators which were ++ defined using rest parameters.) ++

++ ++
++
boolean
++

n. ++ an object of type boolean; ++ that is, one of the following objects: ++ the symbol~t (representing true), ++ or the symbol~nil (representing false). ++ See generalized boolean. ++

++ ++
++
boolean equivalent
++

n. (of an object O_1) ++ any object O_2 that has the same truth value as O_1 ++ when both O_1 and O_2 are viewed as generalized booleans. ++

++ ++
++
bound
++

adj., v.t. ++ 1. adj. having an associated denotation in a binding. ++ “The variables named by a let are bound within ++ its body.” ++ See unbound. ++ 2. adj. having a local binding which ++ shadows_2 another. ++ “The variable *print-escape* is bound while in ++ the princ function.” ++ 3. v.t. the past tense of bind. ++

++ ++
++
bound declaration
++

n. ++ a declaration that refers to or is associated with a variable ++ or function and that appears within the special form ++ that establishes the variable or function, ++ but before the body of that special form ++ (specifically, at the head of that form’s body). ++ (If a bound declaration refers to a function binding or ++ a lexical variable binding, the scope of ++ the declaration is exactly the scope of that ++ binding. If the declaration refers to a ++ dynamic variable binding, the scope of ++ the declaration is what the scope of the ++ binding would have been if it were lexical rather than dynamic.) ++

++ ++
++
bounded
++

adj. (of a sequence S, ++ by an ordered pair ++ of bounding indices i_{start} and i_{end}) ++ restricted to a subrange of the elements of S that includes each element ++ beginning with (and including) the one indexed by i_{start} and ++ continuing up to (but not including) the one indexed by i_{end}. ++

++ ++
++
bounding index
++

n. (of a sequence with length n) ++ either of a conceptual pair of integers, i_{start} and i_{end}, ++ respectively called the “lower bounding index” and “upper bounding index”, ++ such that 0 <= i_{start} <= i_{end} <= n, and which therefore delimit ++ a subrange of the sequence bounded by i_{start} and i_{end}. ++

++ ++
++
bounding index designator
++

(for a sequence) ++ one of two objects that, taken together as an ordered pair, ++ behave as a designator for bounding indices of the sequence; ++ that is, they denote bounding indices of the sequence, ++ and are either: ++ an integer (denoting itself) and nil ++ (denoting the length of the sequence), ++ or two integers (each denoting themselves). ++

++ ++
++
break loop
++

n. ++ A variant of the normal Lisp read-eval-print loop that is recursively ++ entered, usually because the ongoing evaluation of some other form ++ has been suspended for the purpose of debugging. Often, a break loop ++ provides the ability to exit in such a way as to continue the suspended computation. ++ See the function break. ++

++ ++
++
broadcast stream
++

n. ++ an output stream of type broadcast-stream. ++

++ ++
++
built-in class
++

n. ++ a class that is a generalized instance of class built-in-class. ++

++ ++
++
built-in type
++

n. ++ one of the types in Figure~4–2. ++

++ ++
++
byte
++

n. ++ 1. adjacent bits within an integer. ++ (The specific number of bits can vary from point to point in the program; ++ see the function byte.) ++ 2. an integer in a specified range. ++ (The specific range can vary from point to point in the program; ++ see the functions open and write-byte.) ++

++ ++
++
byte specifier
++

n. ++ An object of implementation-dependent nature ++ that is returned by the function byte and ++ that specifies the range of bits in an integer to be used ++ as a byte by functions such as ldb. ++

++
++
++

C

++
++
++ ++
++
cadr
++

pronounced ’ka ,de r , n. (of an object) ++ the car of the cdr of that object. ++

++ ++
++
call
++

v.t., n. ++ 1. v.t. (a function with arguments) ++ to cause the code represented by that function to be ++ executed in an environment where bindings for ++ the values of its parameters have been established ++ based on the arguments. ++ “Calling the function + with the arguments ++ 5 and 1 yields a value of 6.” ++ 2. n. a situation in which a function is called. ++

++ ++
++
captured initialization form
++

n. ++ an initialization form along with the lexical environment ++ in which the form that defined the initialization form ++ was evaluated. ++ “Each newly added shared slot is set to the result of evaluating ++ the captured initialization form for the slot that was specified ++ in the defclass form for the new class.” ++

++ ++
++
car
++

n. ++ 1. a. (of a cons) ++ the component of a cons corresponding to the first ++ argument to cons; the other component is the ++ cdr. ++ “The function rplaca modifies the car of a cons.” ++ b. (of a list) ++ the first element of the list, or nil if the ++ list is the empty list. ++ 2. the object that is held in the car_1. ++ “The function car returns the car of a cons.” ++

++ ++
++
case
++

n. (of a character) ++ the property of being either uppercase or lowercase. ++ Not all characters have case. ++ “The characters #\A and #\a have case, ++ but the character #\$ has no case.” ++ See Characters With Case and the function both-case-p. ++

++ ++
++
case sensitivity mode
++

n. ++ one of the symbols ++ :upcase, :downcase, :preserve, or :invert. ++

++ ++
++
catch
++

n. ++ an exit point which is established by a catch ++ form within the dynamic scope of its body, ++ which is named by a catch tag, ++ and to which control and values may be thrown. ++

++ ++
++
catch tag
++

n. ++ an object which names an active catch. ++ (If more than one catch is active with the same catch tag, ++ it is only possible to throw to the innermost such catch ++ because the outer one is shadowed_2.) ++

++ ++
++
cddr
++

pronounced ’kud e ,de r or ++ pronounced ’ke ,dude r , n. ++ (of an object) ++ the cdr of the cdr of that object. ++

++ ++
++
cdr
++

pronounced ’ku ,de r , n. ++ 1. a. (of a cons) ++ the component of a cons corresponding to the second argument ++ to cons; the other component is the car. ++ “The function rplacd modifies the cdr of a cons.” ++ b. (of a list L_1) ++ either the list L_2 that contains ++ the elements of L_1 that follow after the first, ++ or else nil if L_1 is the empty list. ++ 2. the object that is held in the cdr_1. ++ “The function cdr returns the cdr of a cons.” ++

++ ++
++
cell
++

n. Trad. (of an object) ++ a conceptual slot of that object. ++ The dynamic variable and global function bindings ++ of a symbol are sometimes referred to as its value cell ++ and function cell, respectively. ++

++ ++
++
character
++

n., adj. ++ 1. n. an object of type character; that is, ++ an object that represents a unitary token in an aggregate quantity of text; ++ see Character Concepts. ++ 2. adj. ++ a. (of a stream) ++ having an element type that is a subtype of type character. ++ The most fundamental operation on a character input stream ++ is read-char and on a character output stream ++ is write-char. See binary. ++ b. (of a file) ++ having been created by opening a character stream. ++ (It is implementation-dependent whether this is an inspectable aspect ++ of the file, or whether any given binary file can be ++ treated as a character file.) ++

++ ++
++
character code
++

n. ++ 1. one of possibly several attributes of a character. ++ 2. a non-negative integer less than the value of char-code-limit ++ that is suitable for use as a character code_1. ++

++ ++
++
character designator
++

n. ++ a designator for a character; that is, ++ an object that denotes a character ++ and that is one of: ++ a designator for a string of length one ++ (denoting the character that is its only element), ++

++

or a character (denoting itself). ++

++ ++
++
circular
++

adj. ++ 1. (of a list) a circular list. ++ 2. (of an arbitrary object) ++ having a component, element, constituent_2, ++ or subexpression (as appropriate to the context) ++ that is the object itself. ++

++ ++
++
circular list
++

n. ++ a chain of conses that has no termination because some ++ cons in the chain is the cdr of a later cons. ++

++ ++
++
class
++

n. ++ 1. an object that uniquely determines the structure and behavior of ++ a set of other objects called its direct instances, ++ that contributes structure and behavior to a set of ++ other objects called its indirect instances, ++ and that acts as a type specifier for a set of objects ++ called its generalized instances. ++ “The class integer is a subclass of the class number.” ++ (Note that the phrase “the class foo” is often substituted for ++ the more precise phrase “the class named foo”—in both ++ cases, a class object (not a symbol) is denoted.) ++ 2. (of an object) ++ the uniquely determined class of which the object is ++ a direct instance. ++ See the function class-of. ++ “The class of the object returned by gensym ++ is symbol.” ++ (Note that with this usage a phrase such as “its class is foo” ++ is often substituted for the more precise phrase ++ “its class is the class named foo”—in both ++ cases, a class object (not a symbol) is denoted.) ++

++ ++
++
class designator
++

n. ++ a designator for a class; that is, ++ an object that denotes a class ++ and that is one of: ++ a symbol (denoting the class named by that symbol; ++ see the function find-class) ++ or a class (denoting itself). ++

++ ++
++
class precedence list
++

n. ++ a unique total ordering on a class ++ and its superclasses that is consistent with the ++ local precedence orders for the class and its ++ superclasses. ++ For detailed information, see Determining the Class Precedence List. ++

++ ++
++
close
++

v.t. (a stream) ++ to terminate usage of the stream as a source or sink of data, ++ permitting the implementation to reclaim its internal data structures, ++ and to free any external resources which might have been locked by the ++ stream when it was opened. ++

++ ++
++
closed
++

adj. (of a stream) ++ having been closed (see close). ++ Some (but not all) operations that are valid on open streams ++ are not valid on closed streams. ++ See File Operations on Open and Closed Streams. ++

++ ++
++
closure
++

n. ++ a lexical closure. ++

++ ++
++
coalesce
++

v.t. (literal objects that are similar) ++ to consolidate the identity of those objects, ++ such that they become the same ++ object. ++ See Compiler Terminology. ++

++ ++
++
code
++

n. ++ 1. Trad. ++ any representation of actions to be performed, whether conceptual ++ or as an actual object, such as ++ forms, ++ lambda expressions, ++ objects of type function, ++ text in a source file, ++ or instruction sequences in a compiled file. ++ This is a generic term; ++ the specific nature of the representation depends on its context. ++ 2. (of a character) ++ a character code. ++

++ ++
++
coerce
++

v.t. (an object to a type) ++ to produce an object from the given object, ++ without modifying that object, ++ by following some set of coercion rules that must be specifically ++ stated for any context in which this term is used. ++ The resulting object is necessarily of the indicated type, ++ except when that type is a subtype of type complex; in that case, ++ if a complex rational with an imaginary part of zero would result, ++ the result is a rational ++ rather than a complex—see Rule of Canonical Representation for Complex Rationals. ++

++ ++
++
colon
++

n. ++ the standard character that is called “colon” (:). ++ See Figure~2–5. ++

++ ++
++
comma
++

n. ++ the standard character that is called “comma” (,). ++ See Figure~2–5. ++

++ ++
++
compilation
++

n. ++ the process of compiling code by the compiler. ++

++ ++
++
compilation environment
++

n. ++ 1. An environment that represents information known by the ++ compiler about a form that is being compiled. ++ See Compiler Terminology. ++ 2. An object that represents the ++ compilation environment_1 ++ and that is used as a second argument to a macro function ++ (which supplies a value for any &environment parameter ++ in the macro function’s definition). ++

++ ++
++
compilation unit
++

n. ++ an interval during which a single unit of compilation is occurring. ++ See the macro with-compilation-unit. ++

++ ++
++
compile
++

v.t. ++ 1. (code) ++ to perform semantic preprocessing of the code, usually optimizing ++ one or more qualities of the code, such as run-time speed of execution ++ or run-time storage usage. The minimum semantic requirements of compilation are ++ that it must remove all macro calls and arrange for all load time values ++ to be resolved prior to run time. ++ 2. (a function) ++ to produce a new object of type compiled-function ++ which represents the result of compiling the code ++ represented by the function. See the function compile. ++ 3. (a source file) ++ to produce a compiled file from a source file. ++ See the function compile-file. ++

++ ++
++
compile time
++

n. ++ the duration of time that the compiler is processing source code. ++

++ ++
++
compile-time definition
++

n. ++ a definition in the compilation environment. ++

++ ++
++
compiled code
++

n. ++ 1. compiled functions. ++ 2. code that represents compiled functions, ++ such as the contents of a compiled file. ++

++ ++
++
compiled file
++

n. ++ a file which represents the results of compiling the ++ forms which appeared in a corresponding source file, ++ and which can be loaded. See the function compile-file. ++

++ ++
++
compiled function
++

n. ++ an object of type compiled-function, which is a function ++ that has been compiled, which contains no references to macros that ++ must be expanded at run time, and which contains no unresolved references ++ to load time values. ++

++ ++
++
compiler
++

n. ++ a facility that is part of Lisp and that translates code ++ into an implementation-dependent form ++ that might be represented or executed efficiently. ++ The functions compile and compile-file ++ permit programs to invoke the compiler. ++

++ ++
++
compiler macro
++

n. ++ an auxiliary macro definition for a globally defined function ++ or macro which might or might not be called by any given ++ conforming implementation and which must preserve the semantics ++ of the globally defined function or macro but which might ++ perform some additional optimizations. (Unlike a macro, ++ a compiler macro does not extend the syntax of Common Lisp; rather, it ++ provides an alternate implementation strategy for some existing syntax ++ or functionality.) ++

++ ++
++
compiler macro expansion
++

n. ++ 1. the process of translating a form into another form ++ by a compiler macro. ++ 2. the form resulting from this process. ++

++ ++
++
compiler macro form
++

n. ++ a function form or macro form whose operator ++ has a definition as a compiler macro, ++ or a funcall form whose first argument is a ++ function form whose argument is the name ++ of a function that has a definition as a compiler macro. ++

++ ++
++
compiler macro function
++

n. ++ a function of two arguments, a form and an ++ environment, that implements compiler macro expansion by ++ producing either a form to be used in place of the original ++ argument form or else nil, indicating that the original form ++ should not be replaced. See Compiler Macros. ++

++ ++
++
complex
++

n. ++ an object of type complex. ++

++ ++
++
complex float
++

n. ++ an object of type complex which has a complex part type ++ that is a subtype of float. ++ A complex float is a complex, ++ but it is not a float. ++

++ ++
++
complex part type
++

n. (of a complex) ++ 1. the type which is used to represent both the real part ++ and the imaginary part of the complex. ++ 2. the actual complex part type of the complex. ++ 3. the expressed complex part type of the complex. ++

++ ++
++
complex rational
++

n. ++ an object of type complex which has a complex part type ++ that is a subtype of rational. ++ A complex rational is a complex, but it is not a rational. ++ No complex rational has an imaginary part of zero because such a ++ number is always represented by Common Lisp as an object of type rational; ++ see Rule of Canonical Representation for Complex Rationals. ++

++ ++
++
complex single float
++

n. ++ an object of type complex which has a complex part type ++ that is a subtype of single-float. ++ A complex single float is a complex, ++ but it is not a single float. ++

++ ++
++
composite stream
++

n. ++ a stream that is composed of one or more other streams. ++ “make-synonym-stream creates a composite stream.” ++

++ ++
++
compound form
++

n. ++ a non-empty list which is a form: ++ a special form, ++ a lambda form, ++ a macro form, ++ or a function form. ++

++ ++
++
compound type specifier
++

n. ++ a type specifier that is a cons; ++ i.e., a type specifier that is not an atomic type specifier. ++ “(vector single-float) is a compound type specifier.” ++

++ ++
++
concatenated stream
++

n. ++ an input stream of type concatenated-stream. ++

++ ++
++
condition
++

n. ++ 1. an object which represents a situation—usually, ++ but not necessarily, during signaling. ++ 2. an object of type condition. ++

++ ++
++
condition designator
++

n. ++ one or more objects that, taken together, ++ denote either an existing condition object ++ or a condition object to be implicitly created. ++ For details, see Condition Designators. ++

++ ++
++
condition handler
++

n. ++ a function that might be invoked by the act of signaling, ++ that receives the condition being signaled as its only argument, ++ and that is permitted to handle the condition ++ or to decline. See Signaling. ++

++ ++
++
condition reporter
++

n. ++ a function that describes how a condition is to be printed ++ when the Lisp printer is invoked while *print-escape* ++ is false. See Printing Conditions. ++

++ ++
++
conditional newline
++

n. ++ a point in output where a newline might be inserted at the ++ discretion of the pretty printer. ++ There are four kinds of conditional newlines, ++ called “linear-style,” ++ “fill-style,” ++ “miser-style,” ++ and “mandatory-style.” ++ See the function pprint-newline and Dynamic Control of the Arrangement of Output. ++

++ ++
++
conformance
++

n. ++ a state achieved by proper and complete adherence to the requirements ++ of this specification. See Conformance. ++

++ ++
++
conforming code
++

n. ++ code that is all of part of a conforming program. ++

++ ++
++
conforming implementation
++

n. ++ an implementation, used to emphasize complete and correct ++ adherance to all conformance criteria. ++ A conforming implementation is capable of ++ accepting a conforming program as input, ++ preparing that program for execution, ++ and executing the prepared program in accordance with this specification. ++ An implementation which ++ has been extended may still be a conforming implementation ++ provided that no extension interferes with the correct function of any ++ conforming program. ++

++ ++
++
conforming processor
++

n. ANSI ++ a conforming implementation. ++

++ ++
++
conforming program
++

n. ++ a program, used to emphasize the fact that the program ++ depends for its correctness only upon documented aspects of Common Lisp, and ++ can therefore be expected to run correctly in any conforming implementation. ++

++ ++
++
congruent
++

n. ++ conforming to the rules of lambda list congruency, as detailed in ++ Congruent Lambda-lists for all Methods of a Generic Function. ++

++ ++
++
cons
++

n.v. ++ 1. n. a compound data object having two components called the ++ car and the cdr. ++ 2. v. to create such an object. ++ 3. v. Idiom. to create any object, or to allocate storage. ++

++ ++
++
constant
++

n. ++ 1. a constant form. ++ 2. a constant variable. ++ 3. a constant object. ++ 4. a self-evaluating object. ++

++ ++
++
constant form
++

n. ++ any form ++ for which evaluation always yields the same value, ++ that neither affects nor is affected by the environment ++ in which it is evaluated (except that it is permitted to ++ refer to the names of constant variables ++ defined in the environment), ++ and ++ that neither affects nor is affected by the state of any object ++ except those objects that are otherwise inaccessible parts ++ of objects created by the form itself. ++ “A car form in which the argument is a ++ quote form is a constant form.” ++

++ ++
++
constant object
++

n. ++ an object that is constrained (e.g., by its context in a program ++ or by the source from which it was obtained) to be immutable. ++ “A literal object that has been processed by compile-file ++ is a constant object.” ++

++ ++
++
constant variable
++

n. ++ a variable, the value of which can never change; ++ that is, a keyword_1 or a named constant. ++ “The symbols t, nil, :direction, and ++ most-positive-fixnum are constant variables.” ++

++ ++
++
constituent
++

n., adj. ++ 1. a. n. the syntax type of a character that is part of a token. ++ For details, see Constituent Characters. ++ b. adj. (of a character) ++ having the constituent_{1a} syntax type_2. ++ c. n. a constituent_{1b} character. ++ 2. n. (of a composite stream) ++ one of possibly several objects that collectively comprise ++ the source or sink of that stream. ++

++ ++
++
constituent trait
++

n. (of a character) ++ one of several classifications of a constituent character ++ in a readtable. See Constituent Characters. ++

++ ++
++
constructed stream
++

n. ++ a stream whose source or sink is a Lisp object. ++ Note that since a stream is another Lisp object, ++ composite streams are considered constructed streams. ++ “A string stream is a constructed stream.” ++

++ ++
++
contagion
++

n. ++ a process whereby operations on objects of differing types ++ (e.g., arithmetic on mixed types of numbers) produce a result ++ whose type is controlled by the dominance of one argument’s ++ type over the types of the other arguments. ++ See Contagion in Numeric Operations. ++

++ ++
++
continuable
++

n. (of an error) ++ an error that is correctable by the continue restart. ++

++ ++
++
control form
++

n. ++ 1. a form that establishes one or more places to which control ++ can be transferred. ++ 2. a form that transfers control. ++

++ ++
++
copy
++

n. ++ 1. (of a cons C) ++ a fresh cons with the same car and cdr as C. ++ 2. (of a list L) ++ a fresh list with the same elements as L. ++ (Only the list structure is fresh; ++ the elements are the same.) ++ See the function copy-list. ++ 3. (of an association list A with elements A_i) ++ a fresh list B with elements B_i, each of which is ++ nil if A_i is nil, or else a copy of the cons A_i. ++ See the function copy-alist. ++ 4. (of a tree T) ++ a fresh tree with the same leaves as T. ++ See the function copy-tree. ++ 5. (of a random state R) ++ a fresh random state that, if used as an argument to ++ to the function random would produce the same series of “random” ++ values as R would produce. ++

++

6. (of a structure S) ++ a fresh structure that has the same type as S, ++ and that has slot values, each of which is the same as the ++ corresponding slot value of S. ++

++

(Note that since the difference between a cons, a list, ++ and a tree is a matter of “view” or “intention,” there can ++ be no general-purpose function which, based solely on the type ++ of an object, can determine which of these distinct meanings is ++ intended. The distinction rests solely on the basis of the text description ++ within this document. For example, phrases like “a copy of the ++ given list” or “copy of the list x” imply the ++ second definition.) ++

++ ++
++
correctable
++

adj. (of an error) ++ 1. (by a restart other than abort ++ that has been associated with the error) ++ capable of being corrected by invoking that restart. ++ “The function cerror signals an error ++ that is correctable by the continue restart.” ++

++

(Note that correctability is not a property of an ++ error object, but rather a property of the ++ dynamic environment that is in effect when the ++ error is signaled. ++ Specifically, the restart is “associated with” ++ the error condition object. ++ See Associating a Restart with a Condition.) ++

++

2. (when no specific restart is mentioned) ++ correctable_1 by at least one restart. ++ “import signals a correctable error of type package-error ++ if any of the imported symbols has the same name as ++ some distinct symbol already accessible in the package.” ++

++ ++
++
current input base
++

n. (in a dynamic environment) ++ the radix that is the value of *read-base* in that environment, ++ and that is the default radix employed by the Lisp reader ++ and its related functions. ++

++ ++
++
current logical block
++

n. ++ the context of the innermost lexically enclosing use of pprint-logical-block. ++

++ ++
++
current output base
++

n. (in a dynamic environment) ++ the radix that is the value of *print-base* in that environment, ++ and that is the default radix employed by the Lisp printer ++ and its related functions. ++

++ ++
++
current package
++

n. (in a dynamic environment) ++ the package that is the value of *package* in that environment, ++ and that is the default package employed by the Lisp reader ++ and Lisp printer, and their related functions. ++

++ ++
++
current pprint dispatch table
++

n. (in a dynamic environment) ++ the pprint dispatch table that is the value of *print-pprint-dispatch* ++ in that environment, and that is the default pprint dispatch table ++ employed by the pretty printer. ++

++ ++
++
current random state
++

n. (in a dynamic environment) ++ the random state that is the value of *random-state* in that environment, ++ and that is the default random state employed by random. ++

++ ++
++
current readtable
++

n. (in a dynamic environment) ++ the readtable that is the value of *readtable* in that environment, ++ and that affects the way in which expressions_2 are parsed ++ into objects by the Lisp reader. ++

++
++
++

D

++
++
++ ++
++
data type
++

n. Trad. ++ a type. ++

++ ++
++
debug I/O
++

n. ++ the bidirectional stream ++ that is the value of the variable *debug-io*. ++

++ ++
++
debugger
++

n. ++ a facility that allows the user to handle a condition interactively. ++ For example, the debugger might permit interactive ++ selection of a restart from among the active restarts, ++ and it might perform additional implementation-defined services ++ for the purposes of debugging. ++

++ ++
++
declaration
++

n. ++ a global declaration or local declaration. ++

++ ++
++
declaration identifier
++

n. ++ one of the symbols ++ declaration, ++ dynamic-extent, ++ ftype, ++ function, ++ ignore, ++ inline, ++ notinline, ++ optimize, ++ special, ++ or type; ++ or a symbol which is the name of a type; ++ or a symbol which has been declared ++ to be a declaration identifier by using a declaration ++ declaration. ++

++ ++
++
declaration specifier
++

n. ++ an expression that can appear at top level of a declare ++ expression or a declaim form, or as the argument to proclaim, ++ and which has a car which is a declaration identifier, ++ and which has a cdr that is data interpreted according to rules ++ specific to the declaration identifier. ++

++ ++
++
declare
++

v. ++ to establish a declaration. ++ See declare, declaim, or proclaim. ++

++ ++
++
decline
++

v. (of a handler) ++ to return normally without having handled the condition ++ being signaled, permitting the signaling process to continue ++ as if the handler had not been present. ++

++ ++
++
decoded time
++

n. ++ absolute time, represented as an ordered series of ++ nine objects which, taken together, form a description of ++ a point in calendar time, accurate to the nearest second (except ++ that leap seconds are ignored). ++ See Decoded Time. ++

++ ++
++
default method
++

n. ++ a method having no parameter specializers other than ++ the class t. Such a method is always an applicable method ++ but might be shadowed_2 by a more specific method. ++

++ ++
++
defaulted initialization argument list
++

n. ++ a list of alternating initialization argument names and ++ values in which unsupplied initialization arguments are ++ defaulted, used in the protocol for initializing and reinitializing ++ instances of classes. ++

++ ++
++
define-method-combination arguments lambda list
++

n. ++ a lambda list used by the :arguments option ++ to define-method-combination. ++ See Define-method-combination Arguments Lambda Lists. ++

++ ++
++
define-modify-macro lambda list
++

n. ++ a lambda list used by define-modify-macro. ++ See Define-modify-macro Lambda Lists. ++

++ ++
++
defined name
++

n. ++ a symbol the meaning of which is defined by Common Lisp. ++

++ ++
++
defining form
++

n. ++ a form that has the side-effect of establishing a definition. ++ “defun and defparameter are defining forms.” ++

++ ++
++
defsetf lambda list
++

n. ++ a lambda list that is like an ordinary lambda list ++ except that it does not permit &aux ++ and that it permits use of &environment. ++ See Defsetf Lambda Lists. ++

++ ++
++
deftype lambda list
++

n. ++ a lambda list that is like a macro lambda list ++ except that the default value for unsupplied optional parameters ++ and keyword parameters is the symbol * (rather than nil). ++ See Deftype Lambda Lists. ++

++ ++
++
denormalized
++

adj., ANSI, IEEE (of a float) ++ conforming to the description of “denormalized” as described by ++ IEEE Standard for Binary Floating-Point Arithmetic. ++ For example, in an implementation where the minimum possible exponent ++ was -7 but where 0.001 was a valid mantissa, the number 1.0e-10 ++ might be representable as 0.001e-7 internally even if the normalized ++ representation would call for it to be represented instead as 1.0e-10 ++ or 0.1e-9. By their nature, denormalized floats generally ++ have less precision than normalized floats. ++

++ ++
++
derived type
++

n. ++ a type specifier which is defined in terms of an expansion into another ++ type specifier. deftype defines derived types, ++ and there may be other implementation-defined operators ++ which do so as well. ++

++ ++
++
derived type specifier
++

n. ++ a type specifier for a derived type. ++

++ ++
++
designator
++

n. ++ an object that denotes another object. ++ In the dictionary entry for an operator ++ if a parameter is described as a designator for a type, ++ the description of the operator is written in a way ++ that assumes that appropriate coercion to that type has already occurred; ++ that is, that the parameter is already of the denoted type. ++ For more detailed information, see Designators. ++

++ ++
++
destructive
++

adj. (of an operator) ++ capable of modifying some program-visible aspect of one or more ++ objects that are either explicit arguments to the ++ operator or that can be obtained directly or indirectly ++ from the global environment by the operator. ++

++ ++
++
destructuring lambda list
++

n. ++ an extended lambda list used in destructuring-bind and ++ nested within macro lambda lists. ++ See Destructuring Lambda Lists. ++

++ ++
++
different
++

adj. ++ not the same ++ “The strings "FOO" and "foo" are different under ++ equal but not under equalp.” ++

++ ++
++
digit
++

n. (in a radix) ++ a character that is among the possible digits (0 to 9, ++ A to Z, and a to z) and that is defined to have an ++ associated numeric weight as a digit in that radix. ++ See Digits in a Radix. ++

++ ++
++
dimension
++

n. ++ 1. a non-negative integer indicating the number of ++ objects an array can hold along one axis. ++ If the array is a vector with a fill pointer, ++ the fill pointer is ignored. ++ “The second dimension of that array is 7.” ++ 2. an axis of an array. ++ “This array has six dimensions.” ++

++ ++
++
direct instance
++

n. (of a class C) ++ an object whose class is C itself, ++ rather than some subclass of C. ++ “The function make-instance always returns a ++ direct instance of the class which is (or is named by) ++ its first argument.” ++

++ ++
++
direct subclass
++

n. (of a class C_1) ++ a class C_2, ++ such that C_1 is a direct superclass of C_2. ++

++ ++
++
direct superclass
++

n. (of a class C_1) ++ a class C_2 which was explicitly designated as ++ a superclass of C_1 in the definition of C_1. ++

++ ++
++
disestablish
++

v.t. ++ to withdraw the establishment of ++ an object, ++ a binding, ++ an exit point, ++ a tag, ++ a handler, ++ a restart, ++ or an environment. ++

++ ++
++
disjoint
++

n. (of types) ++ having no elements in common. ++

++ ++
++
dispatching macro character
++

n. ++ a macro character that has an associated table that specifies ++ the function to be called for each character that is ++ seen following the dispatching macro character. ++ See the function make-dispatch-macro-character. ++

++ ++
++
displaced array
++

n. ++ an array which has no storage of its own, but which is instead ++ indirected to the storage of another array, called its ++ target, at a specified offset, in such a way that any attempt ++ to access the displaced array implicitly references the ++ target array. ++

++ ++
++
distinct
++

adj. ++ not identical. ++

++ ++
++
documentation string
++

n. (in a defining form) ++ A literal string which because of the context in which ++ it appears (rather than because of some intrinsically observable ++ aspect of the string) is taken as documentation. ++ In some cases, the documentation string is saved in such a ++ way that it can later be obtained by supplying either an object, ++ or by supplying a name and a “kind” to the function documentation. ++ “The body of code in a defmacro form can be preceded ++ by a documentation string of kind function.” ++

++ ++
++
dot
++

n. ++ the standard character that is variously called ++ “full stop,” ++ “period,” ++ or “dot” (.). ++ See Figure~2–5. ++

++ ++
++
dotted list
++

n. ++ a list which has a terminating atom that is not nil. ++ (An atom by itself is not a dotted list, however.) ++

++ ++
++
dotted pair
++

n. ++ 1. a cons whose cdr is a non-list. ++ 2. any cons, used to emphasize the use of the cons ++ as a symmetric data pair. ++

++ ++
++
double float
++

n. ++ an object of type double-float. ++

++ ++
++
double-quote
++

n. ++ the standard character that is variously called ++ “quotation mark” ++ or “double quote” ("). ++ See Figure~2–5. ++

++ ++
++
dynamic binding
++

n. ++ a binding in a dynamic environment. ++

++ ++
++
dynamic environment
++

n. ++ that part of an environment that contains bindings ++ with dynamic extent. A dynamic environment contains, ++ among other things: ++ exit points established by unwind-protect, ++ and ++ bindings of ++ dynamic variables, ++ exit points established by catch, ++ condition handlers, ++ and ++ restarts. ++

++ ++
++
dynamic extent
++

n. ++ an extent whose duration is bounded by points of ++ establishment and disestablishment within the execution ++ of a particular form. See indefinite extent. ++ “Dynamic variable bindings have dynamic extent.” ++

++ ++
++
dynamic scope
++

n. ++ indefinite scope along with dynamic extent. ++

++ ++
++
dynamic variable
++

n. ++ a variable the binding for which is in the dynamic environment. ++ See special. ++

++
++
++

E

++
++
++ ++
++
echo stream
++

n. ++ a stream of type echo-stream. ++

++ ++
++
effective method
++

n. ++ the combination of applicable methods that are executed ++ when a generic function is invoked with a particular sequence ++ of arguments. ++

++ ++
++
element
++

n. ++ 1. (of a list) ++ an object that is the car of one of the conses ++ that comprise the list. ++ 2. (of an array) ++ an object that is stored in the array. ++ 3. (of a sequence) ++ an object that is an element of the list or array ++ that is the sequence. ++ 4. (of a type) ++ an object that is a member of the set of objects ++ designated by the type. ++ 5. (of an input stream) ++ a character or number (as appropriate to the ++ element type of the stream) ++ that is among the ordered series of objects that can be ++ read from the stream (using read-char or read-byte, ++ as appropriate to the stream). ++ 6. (of an output stream) ++ a character or number (as appropriate to the ++ element type of the stream) ++ that is among the ordered series of objects that has been ++ or will be written to the stream (using write-char ++ or write-byte, as appropriate to the stream). ++ 7. (of a class) a generalized instance of the class. ++

++ ++
++
element type
++

n. ++ 1. (of an array) the array element type of the array. ++ 2. (of a stream) the stream element type of the stream. ++

++ ++
++
em
++

n. Trad. ++ a context-dependent unit of measure commonly used in typesetting, ++ equal to the displayed width of of a letter “M” in the current font. ++ (The letter “M” is traditionally chosen because it is typically ++ represented by the widest glyph in the font, and other characters’ ++ widths are typically fractions of an em. In implementations providing ++ non-Roman characters with wider characters than “M,” it is permissible ++ for another character to be the implementation-defined reference character ++ for this measure, and for “M” to be only a fraction of an em ++ wide.) ++ In a fixed width font, a line with n characters is n ++ ems wide; in a variable width font, n ems is the ++ expected upper bound on the width of such a line. ++

++ ++
++
empty list
++

n. ++ the list containing no elements. See (). ++

++ ++
++
empty type
++

n. ++ the type that contains no elements, and that is ++ a subtype of all types (including itself). ++ See nil. ++

++ ++
++
end of file
++

n. ++ 1. the point in an input stream beyond which there is ++ no further data. ++ Whether or not there is such a point on an interactive stream ++ is implementation-defined. ++ 2. a situation that occurs upon an attempt to obtain data from an ++ input stream that is at the end of file_1. ++

++ ++
++
environment
++

n. ++ 1. a set of bindings. See Introduction to Environments. ++ 2. an environment object. ++ “macroexpand takes an optional environment argument.” ++

++ ++
++
environment object
++

n. ++ an object representing a set of lexical bindings, ++ used in the processing of a form to provide meanings for ++ names within that form. ++ “macroexpand takes an optional environment argument.” ++ (The object nil when used as an environment object ++ denotes the null lexical environment; ++ the values of environment parameters ++ to macro functions are objects ++ of implementation-dependent nature which represent the ++ environment_1 in which the corresponding macro form ++ is to be expanded.) ++ See Environment Objects. ++

++ ++
++
environment parameter
++

n. ++ A parameter in a defining form f for which there is no corresponding ++ argument; instead, this parameter receives as its value an ++ environment object which corresponds to the ++ lexical environment in which the defining form f appeared. ++

++ ++
++
error
++

n. ++ 1. (only in the phrase “is an error”) ++ a situation in which the semantics of a program are not specified, ++ and in which the consequences are undefined. ++ 2. a condition which represents an error situation. ++ See Error Terminology. ++ 3. an object of type error. ++

++ ++
++
error output
++

n. ++ the output stream which is the value of the dynamic variable ++ *error-output*. ++

++ ++
++
escape
++

n., adj. ++ 1. n. a single escape or a multiple escape. ++ 2. adj. single escape or multiple escape. ++

++ ++
++
establish
++

v.t. ++ to build or bring into being ++ a binding, ++ a declaration, ++ an exit point, ++ a tag, ++ a handler, ++ a restart, ++ or an environment. ++ “let establishes lexical bindings.” ++

++ ++
++
evaluate
++

v.t. (a form or an implicit progn) ++ to execute the code represented by the form ++ (or the series of forms making up the implicit progn) ++ by applying the rules of evaluation, ++ returning zero or more values. ++

++ ++
++
evaluation
++

n. ++ a model whereby forms are executed, returning zero or more values. ++ Such execution might be implemented directly in one step by an interpreter ++ or in two steps by first compiling the form and then ++ executing the compiled code; this choice is ++ dependent both on context and the nature of the implementation, ++ but in any case is not in general detectable by any program. The evaluation ++ model is designed in such a way that a conforming implementation ++ might legitimately have only a compiler and no interpreter, or vice versa. ++ See The Evaluation Model. ++

++ ++
++
evaluation environment
++

n. ++ a run-time environment in which macro expanders ++ and code specified by eval-when to be evaluated ++ are evaluated. All evaluations initiated by the compiler ++ take place in the evaluation environment. ++

++ ++
++
execute
++

v.t. Trad. (code) ++ to perform the imperative actions represented by the code. ++

++ ++
++
execution time
++

n. ++ the duration of time that compiled code is being executed. ++

++ ++
++
exhaustive partition
++

n. (of a type) ++ a set of pairwise disjoint types that form an ++ exhaustive union. ++

++ ++
++
exhaustive union
++

n. (of a type) ++ a set of subtypes of the type, ++ whose union contains all elements of that type. ++

++ ++
++
exit point
++

n. ++ a point in a control form ++ from which (e.g., block), ++ through which (e.g., unwind-protect), ++ or to which (e.g., tagbody) ++ control and possibly values can be transferred both actively by using ++ another control form and passively through the normal control and ++ data flow of evaluation. ++ “catch and block establish bindings for ++ exit points to which throw and return-from, ++ respectively, can transfer control and values; ++ tagbody establishes a binding for an exit point ++ with lexical extent to which go can transfer control; ++ and unwind-protect establishes an exit point ++ through which control might be transferred by ++ operators such as throw, return-from, ++ and go.” ++

++ ++
++
explicit return
++

n. ++ the act of transferring control (and possibly values) ++ to a block by using return-from (or return). ++

++ ++
++
explicit use
++

n. (of a variable V in a form F) ++ a reference to V that is directly apparent in the normal semantics of F; ++ i.e., that does not expose any undocumented details of the ++ macro expansion of the form itself. ++ References to V exposed by expanding subforms of F are, however, ++ considered to be explicit uses of V. ++

++ ++
++
exponent marker
++

n. ++ a character that is used in the textual notation for a float ++ to separate the mantissa from the exponent. ++ The characters defined as exponent markers in the standard readtable ++ are shown in Figure 26–1. ++ For more information, see Character Syntax. ++ “The exponent marker ‘d’ in ‘3.0d7’ indicates ++ that this number is to be represented as a double float.” ++

++
++
  Marker  Meaning                                  
++  D or d  double-float                             
++  E or e  float (see *read-default-float-format*)  
++  F or f  single-float                             
++  L or l  long-float                               
++  S or s  short-float                              
++
++           Figure 26–1: Exponent Markers          
++
++
++ ++ ++
++
export
++

v.t. (a symbol in a package) ++ to add the symbol to the list of external symbols of the ++ package. ++

++ ++
++
exported
++

adj. (of a symbol in a package) ++ being an external symbol of the package. ++

++ ++
++
expressed adjustability
++

n. (of an array) ++ a generalized boolean that is conceptually (but not necessarily actually) ++ associated with the array, representing whether the array ++ is expressly adjustable. ++ See also actual adjustability. ++

++ ++
++
expressed array element type
++

n. (of an array) ++ the type which is the array element type ++ implied by a type declaration for the array, ++ or which is the requested array element type at its time ++ of creation, prior to any selection of an upgraded array element type. ++ (Common Lisp does not provide a way of detecting this type ++ directly at run time, but an implementation is permitted ++ to make assumptions about the array’s contents and ++ the operations which may be performed on the array when ++ this type is noted during code analysis, even if those ++ assumptions would not be valid in general for the ++ upgraded array element type of the ++ expressed array element type.) ++

++ ++
++
expressed complex part type
++

n. (of a complex) ++ the type which is implied as the complex part type ++ by a type declaration for the complex, ++ or which is the requested complex part type at its time of ++ creation, prior to any selection of an upgraded complex part type. ++ (Common Lisp does not provide a way of detecting this type ++ directly at run time, but an implementation is permitted ++ to make assumptions about the operations which may be performed on ++ the complex when this type is noted during code ++ analysis, even if those assumptions would not be valid in general for ++ the upgraded complex part type of the ++ expressed complex part type.) ++

++ ++
++
expression
++

n. ++ 1. an object, often used to emphasize the use ++ of the object to encode or represent information in a specialized ++ format, such as program text. ++ “The second expression in a let form is a list ++ of bindings.” ++ 2. the textual notation used to notate an object in a source file. ++ “The expression 'sample is equivalent to (quote sample).” ++

++ ++
++
expressly adjustable
++

adj. (of an array) ++ being actually adjustable by virtue of an explicit request for this ++ characteristic having been made at the time of its creation. ++ All arrays that are expressly adjustable ++ are actually adjustable, ++ but not necessarily vice versa. ++

++ ++
++
extended character
++

n. ++ a character ++

++

of type extended-char: ++

++

a character that is not a base character. ++

++ ++
++
extended function designator
++

n. ++ a designator for a function; that is, ++ an object that denotes a function ++ and that is one of: ++ a function name (denoting the function it names ++ in the global environment), ++ or a function (denoting itself). ++ The consequences are undefined if ++ a function name is used as an ++ extended function designator but ++ it does not have a global definition as a function, ++ or if it is a symbol ++ that has a global definition as a macro or a special form. ++ See also function designator. ++

++ ++
++
extended lambda list
++

n. ++ a list resembling an ordinary lambda list in form and purpose, but ++ offering additional syntax or functionality not available in an ++ ordinary lambda list. ++ “defmacro uses extended lambda lists.” ++

++ ++
++
extension
++

n. ++ a facility in an implementation of Common Lisp ++ that is not specified by this standard. ++

++ ++
++
extent
++

n. ++ the interval of time during which a reference to ++ an object, ++ a binding, ++ an exit point, ++ a tag, ++ a handler, ++ a restart, ++ or an environment is defined. ++

++ ++
++
external file format
++

n. ++ an object of implementation-dependent nature which determines ++ one of possibly several implementation-dependent ways in which ++ characters are encoded externally in a character file. ++

++ ++
++
external file format designator
++

n. ++ a designator for an external file format; that is, ++ an object that denotes an external file format ++ and that is one of: ++ the symbol :default ++ (denoting an implementation-dependent default ++ external file format that can accomodate at least ++ the base characters), ++ some other object defined by the implementation to be ++ an external file format designator ++ (denoting an implementation-defined external file format), ++ or some other object defined by the implementation to be ++ an external file format ++ (denoting itself). ++

++ ++
++
external symbol
++

n. (of a package) ++ a symbol that is part of the ‘external interface’ to the package ++ and that are inherited_3 by any other package ++ that uses the package. ++ When using the Lisp reader, ++ if a package prefix is used, ++ the name of an external symbol is separated ++ from the package name by a single package marker ++ while ++ the name of an internal symbol is separated ++ from the package name by a double package marker; ++ see Symbols as Tokens. ++

++ ++
++
externalizable object
++

n. ++ an object that can be used as a literal object ++ in code to be processed by the file compiler. ++

++
++
++

F

++
++
++ ++
++
false
++

n. ++ the symbol nil, ++ used to represent the failure of a predicate test. ++

++ ++
++
fbound
++

pronounced ’ef ,baund adj. ++ (of a function name) ++ bound in the function namespace. ++ (The names of macros and special operators are fbound, ++ but the nature and type of the object which is their value ++ is implementation-dependent. ++

++

Further, defining a setf expander F does not cause the setf function ++ (setf F) to become defined; as such, if there is a such a definition ++ of a setf expander F, the function (setf F) ++ can be fbound if and only if, by design or coincidence, a ++ function binding for (setf F) has been independently established.) ++

++

See the functions fboundp and symbol-function. ++

++ ++
++
feature
++

n. ++ 1. an aspect or attribute ++ of Common Lisp, ++ of the implementation, ++ or of the environment. ++ 2. a symbol that names a feature_1. ++ See Features. ++ “The :ansi-cl feature is present in all conforming implementations.” ++

++ ++
++
feature expression
++

n. ++ A boolean combination of features used by the #+ and #- ++ reader macros in order to direct conditional reading of ++ expressions by the Lisp reader. ++ See Feature Expressions. ++

++ ++
++
features list
++

n. ++ the list that is the value of *features*. ++

++ ++
++
file
++

n. ++ a named entry in a file system, ++ having an implementation-defined nature. ++

++ ++
++
file compiler
++

n. ++ any compiler which compiles source code contained in a file, ++ producing a compiled file as output. The compile-file ++ function is the only interface to such a compiler provided by Common Lisp, ++ but there might be other, implementation-defined mechanisms for ++ invoking the file compiler. ++

++ ++
++
file position
++

n. (in a stream) ++ a non-negative integer that represents a position in the stream. ++ Not all streams are able to represent the notion of file position; ++ in the description of any operator which manipulates file positions, ++ the behavior for streams that don’t have this notion must be explicitly stated. ++ For binary streams, the file position represents the number ++ of preceding bytes in the stream. ++ For character streams, the constraint is more relaxed: ++ file positions must increase monotonically, the amount of the increase ++ between file positions corresponding to any two successive characters ++ in the stream is implementation-dependent. ++

++ ++
++
file position designator
++

n. (in a stream) ++ a designator for a file position in that stream; that is, ++ the symbol :start ++ (denoting 0, the first file position in that stream), ++ the symbol :end ++ (denoting the last file position in that stream; ++ i.e., the position following the last element of the stream), ++ or a file position (denoting itself). ++

++ ++
++
file stream
++

n. ++ an object of type file-stream. ++

++ ++
++
file system
++

n. ++ a facility which permits aggregations of data to be stored in named ++ files on some medium that is external to the Lisp image ++ and that therefore persists from session to session. ++

++ ++
++
filename
++

n. ++ a handle, not necessarily ever directly represented as an object, ++ that can be used to refer to a file in a file system. ++ Pathnames and namestrings are two kinds of objects ++ that substitute for filenames in Common Lisp. ++

++ ++
++
fill pointer
++

n. (of a vector) ++ an integer associated with a vector that represents the ++ index above which no elements are active. ++ (A fill pointer is a non-negative integer no ++ larger than the total number of elements in the vector. ++ Not all vectors have fill pointers.) ++

++ ++
++
finite
++

adj. (of a type) ++ having a finite number of elements. ++ “The type specifier (integer 0 5) denotes a finite type, ++ but the type specifiers integer and (integer 0) do not.” ++

++ ++
++
fixnum
++

n. ++ an integer of type fixnum. ++

++ ++
++
float
++

n. ++ an object of type float. ++

++ ++
++
for-value
++

adj. (of a reference to a binding) ++ being a reference that reads_1 ++ the value of the binding. ++

++ ++
++
form
++

n. ++ 1. any object meant to be evaluated. ++ 2. a symbol, ++ a compound form, ++ or a self-evaluating object. ++ 3. (for an operator, as in “<<operator>> form”) ++ a compound form having that operator as its first element. ++ “A quote form is a constant form.” ++

++ ++
++
formal argument
++

n. Trad. ++ a parameter. ++

++ ++
++
formal parameter
++

n. Trad. ++ a parameter. ++

++ ++
++
format
++

v.t. (a format control and format arguments) ++ to perform output as if by format, ++ using the format string and format arguments. ++

++ ++
++
format argument
++

n. ++ an object which is used as data by functions such as format ++ which interpret format controls. ++

++ ++
++
format control
++

n. ++ a format string, ++ or a function that obeys the argument conventions ++ for a function returned by the formatter macro. ++ See Compiling Format Strings. ++

++ ++
++
format directive
++

n. ++ 1. a sequence of characters in a format string ++ which is introduced by a tilde, and which is specially ++ interpreted by code which processes format strings ++ to mean that some special operation should be performed, possibly ++ involving data supplied by the format arguments that ++ accompanied the format string. See the function format. ++ “In "~D base 10 = ~8R", the character ++ sequences ‘~D’ and ‘~8R’ are format directives.” ++ 2. the conceptual category of all format directives_1 ++ which use the same dispatch character. ++ “Both "~3d" and "~3,'0D" are valid uses of the ++ ‘~D’ format directive.” ++

++ ++
++
format string
++

n. ++ a string which can contain both ordinary text and format directives, ++ and which is used in conjunction with format arguments to describe how ++ text output should be formatted by certain functions, such as format. ++

++ ++
++
free declaration
++

n. ++ a declaration that is not a bound declaration. ++ See declare. ++

++ ++
++
fresh
++

adj. ++ 1. (of an object yielded by a function) ++ having been newly-allocated by that function. ++ (The caller of a function that returns a fresh object ++ may freely modify the object without fear that such modification will ++ compromise the future correct behavior of that function.) ++ 2. (of a binding for a name) ++ newly-allocated; not shared with other bindings for that name. ++

++ ++
++
freshline
++

n. ++ a conceptual operation on a stream, implemented by the function fresh-line ++ and by the format directive ~&, which advances the display position ++ to the beginning of the next line (as if a newline had been typed, or ++ the function terpri had been called) ++ unless the stream is already known to be positioned at the beginning of a line. ++ Unlike newline, freshline is not a character. ++

++ ++
++
funbound
++

pronounced ’ef unbaund n. (of a function name) ++ not fbound. ++

++ ++
++
function
++

n. ++

++

1. an object representing code, ++ which can be called with zero or more arguments, ++ and which produces zero or more values. ++ 2. an object of type function. ++

++ ++
++
function block name
++

n. (of a function name) ++ The symbol that would be used as the name of an implicit block ++ which surrounds the body of a function having that function name. ++ If the function name is a symbol, its function block name is ++ the function name itself. ++ If the function name is a list whose car is setf ++ and whose cadr is a symbol, its function block name is ++ the symbol that is the cadr of the function name. ++ An implementation which supports additional kinds of function names ++ must specify for each how the corresponding function block name is computed. ++

++ ++
++
function cell
++

n. Trad. (of a symbol) ++ The place which holds the definition of the ++ global function binding, if any, named by that symbol, ++ and which is accessed by symbol-function. ++ See cell. ++

++ ++
++
function designator
++

n. ++ a designator for a function; that is, ++ an object that denotes a function ++ and that is one of: ++ a symbol (denoting the function named by that symbol ++ in the global environment), ++ or a function (denoting itself). ++ The consequences are undefined if ++ a symbol is used as a function designator but ++ it does not have a global definition as a function, ++ or it has a global definition as a macro or a special form. ++ See also extended function designator. ++

++ ++
++
function form
++

n. ++ a form that is a list and that has a first element ++ which is the name of a function to be called on ++ arguments which are the result of evaluating subsequent ++ elements of the function form. ++

++ ++
++
function name
++

n. (in an environment) ++ A symbol or a list (setf symbol) ++ that is the name of a function in that environment. ++

++ ++
++
functional evaluation
++

n. ++ the process of extracting a functional value from a function name ++ or a lambda expression. ++ The evaluator performs functional evaluation ++ implicitly when it encounters a function name ++ or a lambda expression ++ in the car of a compound form, ++ or explicitly when it encounters a function special form. ++ Neither a use of a symbol as a function designator nor a ++ use of the function symbol-function to extract the functional value ++ of a symbol is considered a functional evaluation. ++

++ ++
++
functional value
++

n. ++ 1. (of a function name N in an environment E) ++ The value of the binding named N ++ in the function namespace for environment E; ++ that is, the contents of the function cell named N in ++ environment E. ++ 2. (of an fbound symbol S) ++ the contents of the symbol’s function cell; that is, ++ the value of the binding named S ++ in the function namespace of the global environment. ++ (A name that is a macro name in the global environment ++ or is a special operator might or might not be fbound. ++ But if S is such a name and is fbound, the specific ++ nature of its functional value is implementation-dependent; ++ in particular, it might or might not be a function.) ++

++ ++
++
further compilation
++

n. ++ implementation-dependent compilation beyond minimal compilation. ++ Further compilation is permitted to take place at run time. ++ “Block compilation and generation of machine-specific instructions ++ are examples of further compilation.” ++

++
++
++

G

++
++
++ ++
++
general
++

adj. (of an array) ++ having element type t, ++ and consequently able to have any object as an element. ++

++ ++
++
generalized boolean
++

n. ++ an object used as a truth value, where the symbol~nil ++ represents false and all other objects represent true. ++ See boolean. ++

++ ++
++
generalized instance
++

n. (of a class) ++ an object the class of which is either that class itself, ++ or some subclass of that class. (Because of the correspondence between ++ types and classes, the term “generalized instance of X” ++ implies “object of type X” and in cases where X is a class ++ (or class name) the reverse is also true. ++ The former terminology emphasizes the view of X as a class ++ while the latter emphasizes the view of X as a type specifier.) ++

++ ++
++
generalized reference
++

n. ++ a reference to a location storing an object as if to a variable. ++ (Such a reference can be either to read or write the location.) ++ See Generalized Reference. See also place. ++

++ ++
++
generalized synonym stream
++

n. (with a synonym stream symbol) ++ 1. (to a stream) ++ a synonym stream to the stream, ++ or a composite stream which has as a target ++ a generalized synonym stream to the stream. ++ 2. (to a symbol) ++ a synonym stream to the symbol, ++ or a composite stream which has as a target ++ a generalized synonym stream to the symbol. ++

++ ++
++
generic function
++

n. ++ a function whose behavior depends on the classes or ++ identities of the arguments supplied to it and whose parts include, among ++ other things, a set of methods, a lambda list, and a ++ method combination type. ++

++ ++
++
generic function lambda list
++

n. ++ A lambda list that is used to describe data flow into a generic function. ++ See Generic Function Lambda Lists. ++

++ ++
++
gensym
++

n. Trad. ++ an uninterned symbol. ++ See the function gensym. ++

++ ++
++
global declaration
++

n. ++ a form that makes certain kinds of information about ++ code globally available; that is, a proclaim form ++ or a declaim form. ++

++ ++
++
global environment
++

n. ++ that part of an environment that contains bindings ++ with indefinite scope and indefinite extent. ++

++ ++
++
global variable
++

n. ++ a dynamic variable or a constant variable. ++

++ ++
++
glyph
++

n. ++ a visual representation. ++ “Graphic characters have associated glyphs.” ++

++ ++
++
go
++

v. ++ to transfer control to a go point. ++ See the special operator go. ++

++ ++
++
go point
++
++

one of possibly several exit points that are established ++ by tagbody (or other abstractions, such as prog, ++ which are built from tagbody). ++

++ ++
++
go tag
++

n. ++ the symbol or integer that, within the lexical scope ++ of a tagbody form, names an exit point ++ established by that tagbody form. ++

++ ++
++
graphic
++

adj. (of a character) ++ being a “printing” or “displayable” character ++ that has a standard visual representation ++ as a single glyph, such as A or * or =. ++ Space is defined to be graphic. ++ Of the standard characters, all but newline are graphic. ++ See non-graphic. ++

++
++
++

H

++
++
++ ++
++
handle
++

v. (of a condition being signaled) ++ to perform a non-local transfer of control, terminating the ongoing ++ signaling of the condition. ++

++ ++
++
handler
++

n. ++

++

a condition handler. ++

++ ++
++
hash table
++

n. ++ an object of type hash-table, ++ which provides a mapping from keys to values. ++

++ ++
++
home package
++

n. (of a symbol) ++ the package, if any, which is contents of the package cell ++ of the symbol, and which dictates how the Lisp printer ++ prints the symbol when it is not accessible in the ++ current package. (Symbols which have nil in their ++ package cell are said to have no home package, and also ++ to be apparently uninterned.) ++

++
++
++

I

++
++
++ ++
++
I/O customization variable
++

n. ++ one of the stream variables in Figure 26–2, ++ or some other (implementation-defined) stream variable ++ that is defined by the implementation ++ to be an I/O customization variable. ++

++
++
  *debug-io*        *error-io*         query-io*       
++  *standard-input*  *standard-output*  *trace-output*  
++
++  Figure 26–2: Standardized I/O Customization Variables
++
++
++ ++ ++
++
identical
++

adj. ++ the same under eq. ++

++ ++
++
identifier
++

n. ++ 1. a symbol used to identify or to distinguish names. ++ 2. a string used the same way. ++

++ ++
++
immutable
++

adj. ++ not subject to change, either because no operator is provided which is ++ capable of effecting such change or because some constraint exists which ++ prohibits the use of an operator that might otherwise be capable of ++ effecting such a change. Except as explicitly indicated otherwise, ++ implementations are not required to detect attempts to modify ++ immutable objects or cells; the consequences of attempting ++ to make such modification are undefined. ++ “Numbers are immutable.” ++

++ ++
++
implementation
++

n. ++ a system, mechanism, or body of code that implements the semantics of Common Lisp. ++

++ ++
++
implementation limit
++

n. ++ a restriction imposed by an implementation. ++

++ ++
++
implementation-defined
++

adj. ++ implementation-dependent, but required by this specification to be ++ defined by each conforming implementation and to be documented by ++ the corresponding implementor. ++

++ ++
++
implementation-dependent
++

adj. ++ describing a behavior or aspect of Common Lisp which has been deliberately left ++ unspecified, that might be defined in some conforming implementations ++ but not in others, and whose details may differ between implementations. ++ A conforming implementation is encouraged (but not required) to ++ document its treatment of each item in this specification which is ++ marked implementation-dependent, although in some cases ++ such documentation might simply identify the item as “undefined.” ++

++ ++
++
implementation-independent
++

adj. ++ used to identify or emphasize a behavior or aspect of Common Lisp which does ++ not vary between conforming implementations. ++

++ ++
++
implicit block
++

n. ++ a block introduced by a macro form ++ rather than by an explicit block form. ++

++ ++
++
implicit compilation
++

n. ++ compilation performed during evaluation. ++

++ ++
++
implicit progn
++

n. ++ an ordered set of adjacent forms appearing in another ++ form, and defined by their context in that form ++ to be executed as if within a progn. ++

++ ++
++
implicit tagbody
++

n. ++ an ordered set of adjacent forms and/or tags ++ appearing in another form, and defined by their context ++ in that form to be executed as if within a tagbody. ++

++ ++
++
import
++

v.t. (a symbol into a package) ++ to make the symbol be present in the package. ++

++ ++
++
improper list
++

n. ++ a list which is not a proper list: ++ a circular list or a dotted list. ++

++ ++
++
inaccessible
++

adj. ++ not accessible. ++

++ ++
++
indefinite extent
++

n. ++ an extent whose duration is unlimited. ++ “Most Common Lisp objects have indefinite extent.” ++

++ ++
++
indefinite scope
++

n. ++ scope that is unlimited. ++

++ ++
++
indicator
++

n. ++ a property indicator. ++

++ ++
++
indirect instance
++

n. (of a class C_1) ++ an object of class C_2, ++ where C_2 is a subclass of C_1. ++ “An integer is an indirect instance of the class number.” ++

++ ++
++
inherit
++

v.t. ++ 1. to receive or acquire a quality, trait, or characteristic; ++ to gain access to a feature defined elsewhere. ++ 2. (a class) to acquire the structure and behavior defined ++ by a superclass. ++ 3. (a package) to make symbols exported by another ++ package accessible by using use-package. ++

++ ++
++
initial pprint dispatch table
++

n. ++ the value of *print-pprint-dispatch* at the time the Lisp image is started. ++

++ ++
++
initial readtable
++

n. ++ the value of *readtable* at the time the Lisp image is started. ++

++ ++
++
initialization argument list
++

n. ++ a property list of initialization argument names and values ++ used in the protocol for initializing and reinitializing instances of classes. ++ See Object Creation and Initialization. ++

++ ++
++
initialization form
++

n. ++ a form used to supply the initial value for a slot ++ or variable. ++ “The initialization form for a slot in a defclass form ++ is introduced by the keyword :initform.” ++

++ ++
++
input
++

adj. (of a stream) ++ supporting input operations (i.e., being a “data source”). ++ An input stream might also be an output stream, ++ in which case it is sometimes called a bidirectional stream. ++ See the function input-stream-p. ++

++ ++
++
instance
++

n. ++ 1. a direct instance. ++ 2. a generalized instance. ++ 3. an indirect instance. ++

++ ++
++
integer
++

n. ++ an object of type integer, which represents a mathematical integer. ++

++ ++
++
interactive stream
++

n. ++ a stream on which it makes sense to perform interactive querying. ++ See Interactive Streams. ++

++ ++
++
intern
++

v.t. ++ 1. (a string in a package) ++ to look up the string in the package, ++ returning either a symbol with that name ++ which was already accessible in the package ++ or a newly created internal symbol of the package ++ with that name. ++ 2. Idiom. generally, to observe a protocol whereby objects which ++ are equivalent or have equivalent names under some predicate defined ++ by the protocol are mapped to a single canonical object. ++

++ ++
++
internal symbol
++

n. (of a package) ++ a symbol which is accessible in the package, ++ but which is not an external symbol of the package. ++

++ ++
++
internal time
++

n. ++ time, represented as an integer number of internal time units. ++ Absolute internal time is measured as an offset ++ from an arbitrarily chosen, implementation-dependent base. ++ See Internal Time. ++

++ ++
++
internal time unit
++

n. ++ a unit of time equal to 1/n of a second, ++ for some implementation-defined integer value of n. ++ See the variable internal-time-units-per-second. ++

++ ++
++
interned
++

adj. Trad. ++ 1. (of a symbol) accessible_3 in ++ any package. ++ 2. (of a symbol in a specific package) ++ present in that package. ++

++ ++
++
interpreted function
++

n. ++ a function that is not a compiled function. ++ (It is possible for there to be a conforming implementation which ++ has no interpreted functions, but a conforming program ++ must not assume that all functions are compiled functions.) ++

++ ++
++
interpreted implementation
++

n. ++ an implementation that uses an execution strategy for ++ interpreted functions that does not involve a one-time semantic ++ analysis pre-pass, and instead uses “lazy” (and sometimes repetitious) ++ semantic analysis of forms as they are encountered during execution. ++

++ ++
++
interval designator
++

n. (of type T) ++ an ordered pair of objects that describe a subtype of T ++ by delimiting an interval on the real number line. ++ See Interval Designators. ++

++ ++
++
invalid
++

n., adj. ++ 1. n. ++ a possible constituent trait of a character ++ which if present signifies that the character ++ cannot ever appear in a token ++ except under the control of a single escape character. ++ For details, see Constituent Characters. ++ 2. adj. (of a character) ++ being a character that has syntax type constituent ++ in the current readtable and that has the ++ constituent trait invalid_1. ++ See Figure~2–8. ++

++ ++
++
iteration form
++

n. ++ a compound form whose operator is named in Figure 26–3, ++ or a compound form that has an implementation-defined operator ++ and that is defined by the implementation to be an iteration form. ++

++
++
  do              do-external-symbols  dotimes  
++  do*             do-symbols           loop     
++  do-all-symbols  dolist                        
++
++    Figure 26–3: Standardized Iteration Forms  
++
++
++ ++ ++
++
iteration variable
++

n. ++ a variable V, the binding for which was created by an ++ explicit use of V in an iteration form. ++

++
++
++

K

++
++
++ ++
++
key
++

n. ++ an object used for selection during retrieval. ++ See association list, property list, and hash table. ++ Also, see Sequence Concepts. ++

++ ++
++
keyword
++

n. ++ 1. a symbol the home package of which is the KEYWORD package. ++ 2. any symbol, usually but not necessarily in the KEYWORD package, ++ that is used as an identifying marker in keyword-style argument passing. ++ See lambda. ++ 3. Idiom. a lambda list keyword. ++

++ ++
++
keyword parameter
++

n. ++ A parameter for which a corresponding keyword argument ++ is optional. (There is no such thing as a required keyword argument.) ++ If the argument is not supplied, a default value is used. ++ See also supplied-p parameter. ++

++ ++
++
keyword/value pair
++

n. ++ two successive elements (a keyword and a value, ++ respectively) of a property list. ++

++
++
++

L

++
++
++ ++
++
lambda combination
++

n. Trad. ++ a lambda form. ++

++ ++
++
lambda expression
++

n. ++ a list which can be used in place of a function name in ++ certain contexts to denote a function by directly describing its ++ behavior rather than indirectly by referring to the name of an ++ established function; its name derives from the fact that its ++ first element is the symbol lambda. ++ See lambda. ++

++ ++
++
lambda form
++

n. ++ a form that is a list and that has a first element ++ which is a lambda expression representing a function ++ to be called on arguments which are the result of evaluating ++ subsequent elements of the lambda form. ++

++ ++
++
lambda list
++

n. ++ a list that specifies a set of parameters ++ (sometimes called lambda variables) ++ and a protocol for receiving values for those parameters; ++ that is, ++ an ordinary lambda list, ++ an extended lambda list, ++ or a modified lambda list. ++

++ ++
++
lambda list keyword
++

n. ++ a symbol whose name begins with ampersand ++ and that is specially recognized in a lambda list. ++ Note that no standardized lambda list keyword ++ is in the KEYWORD package. ++

++ ++
++
lambda variable
++

n. ++ a formal parameter, used to emphasize the variable’s ++ relation to the lambda list that established it. ++

++ ++
++
leaf
++

n. ++ 1. an atom in a tree_1. ++ 2. a terminal node of a tree_2. ++

++ ++
++
leap seconds
++

n. ++ additional one-second intervals of time that are occasionally inserted ++ into the true calendar by official timekeepers as a correction similar ++ to “leap years.” All Common Lisp time representations ignore ++ leap seconds; every day is assumed to be exactly 86400 seconds ++ long. ++

++ ++
++
left-parenthesis
++

n. ++ the standard character(”, ++ that is variously called ++ “left parenthesis” ++ or “open parenthesis” ++ See Figure~2–5. ++

++ ++
++
length
++

n. (of a sequence) ++ the number of elements in the sequence. ++ (Note that if the sequence is a vector with a ++ fill pointer, its length is the same as the ++ fill pointer even though the total allocated size of ++ the vector might be larger.) ++

++ ++
++
lexical binding
++

n. ++ a binding in a lexical environment. ++

++ ++
++
lexical closure
++

n. ++ a function that, when invoked on arguments, executes ++ the body of a lambda expression in the lexical environment ++ that was captured at the time of the creation of the lexical closure, ++ augmented by bindings of the function’s parameters ++ to the corresponding arguments. ++

++ ++
++
lexical environment
++

n. ++ that part of the environment that contains bindings ++ whose names have lexical scope. A lexical environment ++ contains, among other things: ++ ordinary bindings of variable names to values, ++ lexically established bindings of function names ++ to functions, ++ macros, ++ symbol macros, ++ blocks, ++ tags, ++ and ++ local declarations (see declare). ++

++ ++
++
lexical scope
++

n. ++ scope that is limited to a spatial or textual region within the ++ establishing form. ++ “The names of parameters to a function normally are lexically scoped.” ++

++ ++
++
lexical variable
++

n. ++ a variable the binding for which is in the ++ lexical environment. ++

++ ++
++
Lisp image
++

n. ++ a running instantiation of a Common Lisp implementation. ++ A Lisp image is characterized by a single address space in which any ++ object can directly refer to any another in conformance with this specification, ++ and by a single, common, global environment. ++ (External operating systems sometimes call this a ++ “core image,” ++ “fork,” ++ “incarnation,” ++ “job,” ++ or “process.” Note however, that the issue of a “process” in such ++ an operating system is technically orthogonal to the issue of a Lisp image ++ being defined here. Depending on the operating system, a single “process” ++ might have multiple Lisp images, and multiple “processes” might reside ++ in a single Lisp image. Hence, it is the idea of a fully shared address ++ space for direct reference among all objects which is the defining ++ characteristic. Note, too, that two “processes” which have a communication ++ area that permits the sharing of some but not all objects are considered ++ to be distinct Lisp images.) ++

++ ++
++
Lisp printer
++

n. Trad. ++ the procedure that prints the character representation of an ++ object onto a stream. (This procedure is implemented ++ by the function write.) ++

++ ++
++
Lisp read-eval-print loop
++

n. Trad. ++ an endless loop that reads_2 a form, ++ evaluates it, ++ and prints (i.e., writes_2) the results. ++ In many implementations, ++ the default mode of interaction with Common Lisp during program development ++ is through such a loop. ++

++ ++
++
Lisp reader
++

n. Trad. ++ the procedure that parses character representations of objects ++ from a stream, producing objects. ++ (This procedure is implemented by the function read.) ++

++ ++
++
list
++

n. ++ 1. a chain of conses in which the car of each ++ cons is an element of the list, ++ and the cdr of each cons is either the next ++ link in the chain or a terminating atom. ++ See also proper list, ++ dotted list, ++ or circular list. ++ 2. the type that is the union of null and cons. ++

++ ++
++
list designator
++

n. ++ a designator for a list of objects; that is, ++ an object that denotes a list ++ and that is one of: ++ a non-nil atom ++ (denoting a singleton list ++ whose element is that non-nil atom) ++ or a proper list (denoting itself). ++

++ ++
++
list structure
++

n. (of a list) ++ the set of conses that make up the list. ++ Note that while the car_{1b} component of each such cons ++ is part of the list structure, ++ the objects that are elements of the list ++ (i.e., the objects that are the cars_2 of each cons ++ in the list) ++ are not themselves part of its list structure, ++ even if they are conses, ++ except in the (circular_2) ++ case where the list ++ actually contains one of its tails as an element. ++ (The list structure of a list is sometimes redundantly ++ referred to as its “top-level list structure” in order to emphasize ++ that any conses that are elements of the list ++ are not involved.) ++

++ ++
++
literal
++

adj. (of an object) ++ referenced directly in a program rather than being computed by the program; ++ that is, ++ appearing as data in a quote form, ++ or, if the object is a self-evaluating object, ++ appearing as unquoted data. ++ “In the form (cons "one" '("two")), ++ the expressions "one", ("two"), and "two" ++ are literal objects.” ++

++ ++
++
load
++

v.t. (a file) ++ to cause the code contained in the file to be executed. ++ See the function load. ++

++ ++
++
load time
++

n. ++ the duration of time that the loader is loading compiled code. ++

++ ++
++
load time value
++

n. ++ an object referred to in code by a load-time-value ++ form. The value of such a form is some specific ++ object which can only be computed in the run-time environment. ++ In the case of file compilation, the value is ++ computed once as part of the process of loading the compiled file, ++ and not again. See the special operator load-time-value. ++

++ ++
++
loader
++

n. ++ a facility that is part of Lisp and that loads a file. ++ See the function load. ++

++ ++
++
local declaration
++

n. ++ an expression which may appear only in specially designated ++ positions of certain forms, and which provides information about ++ the code contained within the containing form; ++ that is, a declare expression. ++

++ ++
++
local precedence order
++

n. (of a class) ++ a list consisting of the class followed by its ++ direct superclasses in the order mentioned in the defining ++ form for the class. ++

++ ++
++
local slot
++

n. (of a class) ++ a slot accessible in only one instance, ++ namely the instance in which the slot is allocated. ++

++ ++
++
logical block
++

n. ++ a conceptual grouping of related output used by the pretty printer. ++ See the macro pprint-logical-block and Dynamic Control of the Arrangement of Output. ++

++ ++
++
logical host
++

n. ++ an object of implementation-dependent nature ++ that is used as the representation of a “host” in a logical pathname, ++ and that has an associated set of translation rules for converting ++ logical pathnames belonging to that host into physical pathnames. ++ See Logical Pathnames. ++

++ ++
++
logical host designator
++

n. ++ a designator for a logical host; that is, ++ an object that denotes a logical host ++ and that is one of: ++ a string (denoting the logical host that it names), ++ or a logical host (denoting itself). ++ (Note that because the representation of a logical host ++ is implementation-dependent, ++ it is possible that an implementation might represent ++ a logical host as the string that names it.) ++

++ ++
++
logical pathname
++

n. ++ an object of type logical-pathname. ++

++ ++
++
long float
++

n. ++ an object of type long-float. ++

++ ++
++
loop keyword
++

n. Trad. ++ a symbol that is a specially recognized part of the syntax of ++ an extended loop form. Such symbols are recognized by their ++ name (using string=), not by their identity; as such, they ++ may be in any package. A loop keyword is not a keyword. ++

++ ++
++
lowercase
++

adj. (of a character) ++ being among standard characters corresponding to ++ the small letters a through z, ++ or being some other implementation-defined character ++ that is defined by the implementation to be lowercase. ++ See Characters With Case. ++

++
++
++

M

++
++
++ ++
++
macro
++

n. ++ 1. a macro form ++ 2. a macro function. ++ 3. a macro name. ++

++ ++
++
macro character
++

n. ++ a character which, when encountered by the Lisp reader ++ in its main dispatch loop, introduces a reader macro_1. ++ (Macro characters have nothing to do with macros.) ++

++ ++
++
macro expansion
++

n. ++ 1. the process of translating a macro form into another ++ form. ++ 2. the form resulting from this process. ++

++ ++
++
macro form
++

n. ++ a form that stands for another form ++ (e.g., for the purposes of abstraction, information hiding, ++ or syntactic convenience); ++ that is, ++ either a compound form whose first element is a macro name, ++ or a form that is a symbol that names a ++ symbol macro. ++

++ ++
++
macro function
++

n. ++ a function of two arguments, a form and an ++ environment, that implements macro expansion by ++ producing a form to be evaluated in place of the original ++ argument form. ++

++ ++
++
macro lambda list
++

n. ++ an extended lambda list used in forms that establish ++ macro definitions, such as defmacro and macrolet. ++ See Macro Lambda Lists. ++

++ ++
++
macro name
++

n. ++ a name for which macro-function returns true ++ and which when used as the first element of a compound form ++ identifies that form as a macro form. ++

++ ++
++
macroexpand hook
++

n. ++ the function that is the value of *macroexpand-hook*. ++

++ ++
++
mapping
++

n. ++ 1. a type of iteration in which a function is successively ++ applied to objects taken from corresponding entries in ++ collections such as sequences or hash tables. ++ 2. Math. a relation between two sets in which each element of the ++ first set (the “domain”) is assigned one element of the second ++ set (the “range”). ++

++ ++
++
metaclass
++

n. ++ 1. a class whose instances are classes. ++ 2. (of an object) the class of the class of the object. ++

++ ++
++
Metaobject Protocol
++

n. ++ one of many possible descriptions of how a conforming implementation ++ might implement various aspects of the object system. This description is beyond ++ the scope of this document, and no conforming implementation is ++ required to adhere to it except as noted explicitly in this specification. ++ Nevertheless, its existence helps to establish normative practice, ++ and implementors with no reason to diverge from it are encouraged to ++ consider making their implementation adhere to it where possible. ++ It is described in detail in The Art of the Metaobject Protocol. ++

++ ++
++
method
++

n. ++ an object that is part of a generic function and which ++ provides information about how that generic function should ++ behave when its arguments are objects of certain ++ classes or with certain identities. ++

++ ++
++
method combination
++

n. ++ 1. generally, the composition of a set of methods to produce an ++ effective method for a generic function. ++ 2. an object of type method-combination, which represents the details ++ of how the method combination_1 for one or more ++ specific generic functions is to be performed. ++

++ ++
++
method-defining form
++

n. ++ a form that defines a method for a generic function, ++ whether explicitly or implicitly. ++ See Introduction to Generic Functions. ++

++ ++
++
method-defining operator
++

n. ++ an operator corresponding to a method-defining form. ++ See Figure~7–1. ++

++ ++
++
minimal compilation
++

n. ++ actions the compiler must take at compile time. ++ See Compilation Semantics. ++

++ ++
++
modified lambda list
++

n. ++ a list resembling an ordinary lambda list in form and purpose, ++ but which deviates in syntax or functionality from the definition of an ++ ordinary lambda list. ++ See ordinary lambda list. ++ “deftype uses a modified lambda list.” ++

++ ++
++
most recent
++

adj. ++ innermost; ++ that is, having been established (and not yet disestablished) ++ more recently than any other of its kind. ++

++ ++
++
multiple escape
++

n., adj. ++ 1. n. the syntax type of a character ++ that is used in pairs to indicate that the enclosed characters ++ are to be treated as alphabetic_2 characters ++ with their case preserved. ++ For details, see Multiple Escape Characters. ++ 2. adj. (of a character) ++ having the multiple escape syntax type. ++ 3. n. a multiple escape_2 character. ++ (In the standard readtable, ++ vertical-bar is a multiple escape character.) ++

++ ++
++
multiple values
++

n. ++ 1. more than one value. ++ “The function truncate returns multiple values.” ++ 2. a variable number of values, possibly including zero or one. ++ “The function values returns multiple values.” ++ 3. a fixed number of values other than one. ++ “The macro multiple-value-bind is among the few ++ operators in Common Lisp which can detect and manipulate ++ multiple values.” ++

++
++
++

N

++
++
++ ++
++
name
++

n., v.t. ++ 1. n. an identifier by which an object, ++ a binding, or an exit point ++ is referred to by association using a binding. ++ 2. v.t. to give a name to. ++ 3. n. (of an object having a name component) ++ the object which is that component. ++ “The string which is a symbol’s name is returned ++ by symbol-name.” ++ 4. n. (of a pathname) ++ a. the name component, returned by pathname-name. ++ b. the entire namestring, returned by namestring. ++ 5. n. (of a character) ++ a string that names the character ++ and that has length greater than one. ++ (All non-graphic characters are required to have names ++ unless they have some implementation-defined attribute ++ which is not null. Whether or not other characters ++ have names is implementation-dependent.) ++

++ ++
++
named constant
++

n. ++ a variable that is defined by Common Lisp, ++ by the implementation, ++ or by user code (see the macro defconstant) ++ to always yield the same value when evaluated. ++ “The value of a named constant may not be changed ++ by assignment or by binding.” ++

++ ++
++
namespace
++

n. ++ 1. bindings whose denotations are restricted to a particular kind. ++ “The bindings of names to tags is the tag namespace.” ++ 2. any mapping whose domain is a set of names. ++ “A package defines a namespace.” ++

++ ++
++
namestring
++

n. ++ a string that represents a filename ++ using either the standardized notation for naming logical pathnames ++ described in Syntax of Logical Pathname Namestrings, ++ or some implementation-defined notation for naming a physical pathname. ++

++ ++
++
newline
++

n. ++ the standard character <Newline>, ++ notated for the Lisp reader as #\Newline. ++

++ ++
++
next method
++

n. ++ the next method to be invoked with respect to a given ++ method for a particular set of arguments or argument ++ classes. ++ See Applying method combination to the sorted list of applicable methods. ++

++ ++
++
nickname
++

n. (of a package) ++ one of possibly several names that can be used to refer to ++ the package but that is not the primary name ++ of the package. ++

++ ++
++
nil
++

n. ++ the object that is at once ++ the symbol named "NIL" in the COMMON-LISP package, ++ the empty list, ++ the boolean (or generalized boolean) representing false, ++ and the name of the empty type. ++

++ ++
++
non-atomic
++

adj. ++ being other than an atom; i.e., being a cons. ++

++ ++
++
non-constant variable
++

n. ++ a variable that is not a constant variable. ++

++ ++
++
non-correctable
++

adj. (of an error) ++ not intentionally correctable. ++ (Because of the dynamic nature of restarts, ++ it is neither possible nor generally useful to completely prohibit ++ an error from being correctable. ++ This term is used in order to express an intent that no special effort ++ should be made by code signaling an error to make ++ that error correctable; ++ however, there is no actual requirement on conforming programs ++ or conforming implementations imposed by this term.) ++

++ ++
++
non-empty
++

adj. ++ having at least one element. ++

++ ++
++
non-generic function
++

n. ++ a function that is not a generic function. ++

++ ++
++
non-graphic
++

adj. (of a character) ++ not graphic. ++ See Graphic Characters. ++

++ ++
++
non-list
++

n., adj. ++ other than a list; i.e., a non-nil atom. ++

++ ++
++
non-local exit
++

n. ++ a transfer of control (and sometimes values) to ++ an exit point for reasons other than a normal return. ++ “The operators go, throw, ++ and return-from cause a non-local exit.” ++

++ ++
++
non-nil
++

n., adj. ++ not nil. Technically, any object which is not nil can be ++ referred to as true, but that would tend to imply a unique view ++ of the object as a generalized boolean. ++ Referring to such an object as non-nil avoids this implication. ++

++ ++
++
non-null lexical environment
++

n. ++ a lexical environment that has additional information not present in ++ the global environment, such as one or more bindings. ++

++ ++
++
non-simple
++

adj. ++ not simple. ++

++ ++
++
non-terminating
++

adj. (of a macro character) ++ being such that it is treated as a constituent character ++ when it appears in the middle of an extended token. ++ See Reader Algorithm. ++

++ ++
++
non-top-level form
++

n. ++ a form that, by virtue of its position as a subform ++ of another form, is not a top level form. ++ See Processing of Top Level Forms. ++

++ ++
++
normal return
++

n. ++ the natural transfer of control and values which occurs after ++ the complete execution of a form. ++

++ ++
++
normalized
++

adj., ANSI, IEEE (of a float) ++ conforming to the description of “normalized” as described by IEEE Standard for Binary Floating-Point Arithmetic. ++ See denormalized. ++

++ ++
++
null
++

adj., n. ++ 1. adj. ++ a. (of a list) having no elements: empty. See empty list. ++ b. (of a string) having a length of zero. ++ (It is common, both within this document and in observed spoken behavior, ++ to refer to an empty string by an apparent definite reference, ++ as in “the null string” even though no attempt is made to ++ intern_2 null strings. The phrase ++ “a null string” is technically more correct, ++ but is generally considered awkward by most Lisp programmers. ++ As such, the phrase “the null string” ++ should be treated as an indefinite reference in all cases ++ except for anaphoric references.) ++ c. (of an implementation-defined attribute of a character) ++ An object to which the value of that attribute defaults ++ if no specific value was requested. ++ 2. n. an object of type null (the only such object being nil). ++

++ ++
++
null lexical environment
++

n. ++ the lexical environment which has no bindings. ++

++ ++
++
number
++

n. ++ an object of type number. ++

++ ++
++
numeric
++

adj. (of a character) ++ being one of the standard characters 0 through 9, ++ or being some other graphic character ++ defined by the implementation to be numeric. ++

++
++
++

O

++
++
++ ++
++
object
++

n. ++ 1. any Lisp datum. ++ “The function cons creates an object which refers ++ to two other objects.” ++ 2. (immediately following the name of a type) ++ an object which is of that type, used to emphasize that the ++ object is not just a name for an object of that type ++ but really an element of the type in cases where objects ++ of that type (such as function or class) are commonly ++ referred to by name. ++ “The function symbol-function takes a function name ++ and returns a function object.” ++

++ ++
++
object-traversing
++

adj. ++ operating in succession on components of an object. ++ “The operators mapcar, maphash, ++ with-package-iterator and count ++ perform object-traversing operations.” ++

++ ++
++
open
++

adj., v.t. (a file) ++ 1. v.t. to create and return a stream to the file. ++ 2. adj. (of a stream) ++ having been opened_1, but not yet closed. ++

++ ++
++
operator
++

n. ++ 1. a function, macro, or special operator. ++ 2. a symbol that names ++ such a function, macro, or special operator. ++ 3. (in a function special form) ++ the cadr of the function special form, which ++ might be either an operator_2 or a lambda expression. ++ 4. (of a compound form) ++ the car of the compound form, which might be ++ either an operator_2 ++ or a lambda expression, and which is never (setf symbol). ++

++ ++
++
optimize quality
++

n. ++ one of several aspects of a program that might be optimizable by ++ certain compilers. Since optimizing one such quality ++ might conflict with optimizing another, relative priorities for ++ qualities can be established in an optimize declaration. ++ The standardized optimize qualities are ++ compilation-speed (speed of the compilation process), ++

++

debug (ease of debugging), ++

++

safety (run-time error checking), ++ space (both code size and run-time space), ++ and ++ speed (of the object code). ++ Implementations may define additional optimize qualities. ++

++ ++
++
optional parameter
++

n. ++ A parameter for which a corresponding positional argument ++ is optional. If the argument is not supplied, a default value ++ is used. See also supplied-p parameter. ++

++ ++
++
ordinary function
++

n. ++ a function that is not a generic function. ++

++ ++
++
ordinary lambda list
++

n. ++ the kind of lambda list used by lambda. ++ See modified lambda list and extended lambda list. ++ “defun uses an ordinary lambda list.” ++

++ ++
++
otherwise inaccessible part
++

n. (of an object, O_1) ++ an object, O_2, which would be made inaccessible if ++ O_1 were made inaccessible. (Every object is an ++ otherwise inaccessible part of itself.) ++

++ ++
++
output
++

adj. (of a stream) ++ supporting output operations (i.e., being a “data sink”). ++ An output stream might also be an input stream, ++ in which case it is sometimes called a bidirectional stream. ++ See the function output-stream-p. ++

++
++
++

P

++
++
++ ++
++
package
++

n. ++ an object of type package. ++

++ ++
++
package cell
++

n. Trad. (of a symbol) ++ The place in a symbol that holds one of ++ possibly several packages in which the symbol is ++ interned, called the home package, or which holds ++ nil if no such package exists or is known. ++ See the function symbol-package. ++

++ ++
++
package designator
++

n. ++ a designator for a package; that is, ++ an object that denotes a package ++ and that is one of: ++ a string designator ++ (denoting the package that has the string ++ that it designates as its name ++ or as one of its nicknames), ++ or a package (denoting itself). ++

++ ++
++
package marker
++

n. ++ a character which is used in the textual notation for a symbol ++ to separate the package name from the symbol name, and which ++ is colon in the standard readtable. ++ See Character Syntax. ++

++ ++
++
package prefix
++

n. ++ a notation preceding the name of a symbol in text that is ++ processed by the Lisp reader, which uses a package name ++ followed by one or more package markers, and which indicates that ++ the symbol is looked up in the indicated package. ++

++ ++
++
package registry
++

n. ++ A mapping of names to package objects. ++ It is possible for there to be a package object which is not ++ in this mapping; such a package is called an unregistered package. ++ Operators such as find-package consult this mapping in order ++ to find a package from its name. ++ Operators such as do-all-symbols, find-all-symbols, ++ and list-all-packages operate only on packages that exist ++ in the package registry. ++

++ ++
++
pairwise
++

adv. (of an adjective on a set) ++ applying individually to all possible pairings of elements of the set. ++ “The types A, B, and C are pairwise disjoint if ++ A and B are disjoint, ++ B and C are disjoint, and ++ A and C are disjoint.” ++

++ ++
++
parallel
++

adj. Trad. (of binding or assignment) ++ done in the style of psetq, let, or do; ++ that is, first evaluating all of the forms that produce values, ++ and only then assigning or binding the variables (or places). ++ Note that this does not imply traditional computational “parallelism” ++ since the forms that produce values are evaluated sequentially. ++ See sequential. ++

++ ++
++
parameter
++

n. ++ 1. (of a function) ++ a variable in the definition of a function ++ which takes on the value of a corresponding argument ++ (or of a list of corresponding arguments) ++ to that function when it is called, ++ or ++ which in some cases is given a default value because there ++ is no corresponding argument. ++ 2. (of a format directive) ++ an object received as data flow by a format directive ++ due to a prefix notation within the format string at the ++ format directive’s point of use. ++ See Formatted Output. ++ “In "~3,'0D", the number 3 and the character ++ #\0 are parameters to the ~D format directive.” ++

++ ++
++
parameter specializer
++

n. ++ 1. (of a method) an expression which constrains the ++ method to be applicable only to argument sequences ++ in which the corresponding argument matches the ++ parameter specializer. ++ 2. a class, ++ or a list (eql object). ++

++ ++
++
parameter specializer name
++

n. ++ 1. (of a method definition) an expression used in code to ++ name a parameter specializer. ++ See Introduction to Methods. ++ 2. a class, ++

++

a symbol naming a class, ++

++

or a list (eql form). ++

++ ++
++
pathname
++

n. ++ an object of type pathname, which is a structured representation ++ of the name of a file. A pathname has six components: ++ a “host,” ++ a “device,” ++ a “directory,” ++ a “name,” ++ a “type,” and ++ a “version.” ++

++ ++
++
pathname designator
++

n. ++ a designator for a pathname; that is, ++ an object that denotes a pathname ++ and that is one of: ++

++

a pathname namestring ++

++

(denoting the corresponding pathname), ++

++

a stream associated with a file ++ (denoting the pathname used to open the file; ++ this may be, but is not required to be, the actual name of the file), ++ or a pathname (denoting itself). ++ See File Operations on Open and Closed Streams. ++

++ ++
++
physical pathname
++

n. ++ a pathname that is not a logical pathname. ++

++

[Editorial Note by KMP: Still need to reconcile some confusion in the uses of “generalized ++ reference” and “place.” I think one was supposed to refer to the ++ abstract concept, and the other to an object (a form), but the usages ++ have become blurred.] ++

++ ++
++
place
++

n. ++ 1. a form which is suitable for use as a generalized reference. ++ 2. the conceptual location referred to by such a place_1. ++

++ ++
++
plist
++

pronounced ’p\=e ,list n. ++ a property list. ++

++ ++
++
portable
++

adj. (of code) ++ required to produce equivalent results and observable side effects ++ in all conforming implementations. ++

++ ++
++
potential copy
++

n. (of an object O_1 subject to constriants) ++ an object O_2 that if the specified constraints are satisfied ++ by O_1 without any modification might or might not be identical ++ to O_1, or else that must be a fresh object that ++ resembles a copy of O_1 except that it has been modified as ++ necessary to satisfy the constraints. ++

++ ++
++
potential number
++

n. ++ A textual notation that might be parsed by the Lisp reader ++ in some conforming implementation as a number ++ but is not required to be parsed as a number. ++ No object is a potential number—either an object is ++ a number or it is not. ++ See Potential Numbers as Tokens. ++

++ ++
++
pprint dispatch table
++

n. ++ an object that can be the value of *print-pprint-dispatch* ++ and hence can control how objects are printed when ++ *print-pretty* is true. ++ See Pretty Print Dispatch Tables. ++

++ ++
++
predicate
++

n. ++ a function that returns a generalized boolean ++ as its first value. ++

++ ++
++
present
++

n. ++ 1. (of a feature in a Lisp image) ++ a state of being that is in effect if and only if the symbol ++ naming the feature is an element of the features list. ++ 2. (of a symbol in a package) ++ being accessible in that package directly, ++ rather than being inherited from another package. ++

++ ++
++
pretty print
++

v.t. (an object) ++ to invoke the pretty printer on the object. ++

++ ++
++
pretty printer
++

n. ++ the procedure that prints the character representation of an ++ object onto a stream when the value of ++ *print-pretty* is true, ++ and that uses layout techniques (e.g., indentation) that ++ tend to highlight the structure of the object in a way that ++ makes it easier for human readers to parse visually. ++ See the variable *print-pprint-dispatch* and The Lisp Pretty Printer. ++

++ ++
++
pretty printing stream
++

n. ++ a stream that does pretty printing. Such streams are created by ++ the function pprint-logical-block as a link between the output stream ++ and the logical block. ++

++ ++
++
primary method
++

n. ++ a member of one of two sets of methods ++ (the set of auxiliary methods is the other) ++ that form an exhaustive partition of the set of methods ++ on the method’s generic function. ++ How these sets are determined is dependent on the method combination type; ++ see Introduction to Methods. ++

++ ++
++
primary value
++

n. (of values resulting from the ++ evaluation of a form) ++ the first value, if any, or else nil if there are no values. ++ “The primary value returned by truncate is an ++ integer quotient, truncated toward zero.” ++

++ ++
++
principal
++

adj. (of a value returned by a Common Lisp function that ++ implements a mathematically irrational or transcendental ++ function defined in the complex domain) ++ of possibly many (sometimes an infinite number of) correct values for the ++ mathematical function, being the particular value which the corresponding ++ Common Lisp function has been defined to return. ++

++ ++
++
print name
++

n. Trad. (usually of a symbol) ++ a name_3. ++

++ ++
++
printer control variable
++

n. ++ a variable whose specific purpose is to control some action ++ of the Lisp printer; that is, one of the variables ++ in Figure~22–1, ++ or else some implementation-defined variable which is ++ defined by the implementation to be a printer control variable. ++

++ ++
++
printer escaping
++

n. ++ The combined state of the printer control variables ++ *print-escape* and *print-readably*. ++ If the value of either *print-readably* or *print-escape* is true, ++ then printer escaping ++ ++ is “enabled”; ++ otherwise (if the values of both *print-readably* and *print-escape* ++ are false), ++ then printer escaping is “disabled”. ++

++ ++
++
printing
++

adj. (of a character) ++ being a graphic character other than space. ++

++ ++
++
process
++

v.t. (a form by the compiler) ++ to perform minimal compilation, determining the time of ++ evaluation for a form, and possibly evaluating that ++ form (if required). ++

++ ++
++
processor
++

n., ANSI ++ an implementation. ++

++ ++
++
proclaim
++

v.t. (a proclamation) ++ to establish that proclamation. ++

++ ++
++
proclamation
++

n. ++ a global declaration. ++

++ ++
++
prog tag
++

n. Trad. ++ a go tag. ++

++ ++
++
program
++

n. Trad. ++ Common Lisp code. ++

++ ++
++
programmer
++

n. ++ an active entity, typically a human, that writes a program, ++ and that might or might not also be a user of the program. ++

++ ++
++
programmer code
++

n. ++ code that is supplied by the programmer; ++ that is, code that is not system code. ++

++ ++
++
proper list
++

n. ++ A list terminated by the empty list. ++ (The empty list is a proper list.) ++ See improper list. ++

++ ++
++
proper name
++

n. (of a class) ++ a symbol that names the class whose name ++ is that symbol. ++ See the functions class-name and find-class. ++

++ ++
++
proper sequence
++

n. ++ a sequence which is not an improper list; ++ that is, a vector or a proper list. ++

++ ++
++
proper subtype
++

n. (of a type) ++ a subtype of the type which is not the same type ++ as the type (i.e., its elements are a “proper subset” of the ++ type). ++

++ ++
++
property
++

n. (of a property list) ++ 1. a conceptual pairing of a property indicator and its ++ associated property value on a property list. ++ 2. a property value. ++

++ ++
++
property indicator
++

n. (of a property list) ++ the name part of a property, used as a key ++ when looking up a property value on a property list. ++

++ ++
++
property list
++

n. ++

++

1. a list containing an even number of elements that are ++ alternating names (sometimes called indicators ++ or keys) and values (sometimes called properties). ++ When there is more than one name and value pair with ++ the identical name in a property list, ++ the first such pair determines the property. ++

++

2. (of a symbol) ++ the component of the symbol containing a property list. ++

++ ++
++
property value
++

n. (of a property indicator on ++ a property list) ++ the object associated with the property indicator ++ on the property list. ++

++ ++
++
purports to conform
++

v. ++ makes a good-faith claim of conformance. ++ This term expresses intention to conform, regardless of whether the ++ goal of that intention is realized in practice. ++ For example, language implementations have been known to have bugs, ++ and while an implementation of this specification with bugs ++ might not be a conforming implementation, it can still ++ purport to conform. This is an important distinction in ++ certain specific cases; e.g., see the variable *features*. ++

++
++
++

Q

++
++
++ ++
++
qualified method
++

n. ++ a method that has one or more qualifiers. ++

++ ++
++
qualifier
++

n. (of a method for a generic function) ++ one of possibly several objects used to annotate the method ++ in a way that identifies its role in the method combination. ++ The method combination type determines ++ how many qualifiers are permitted for each method, ++ which qualifiers are permitted, ++ and ++ the semantics of those qualifiers. ++

++ ++
++
query I/O
++

n. ++ the bidirectional stream ++ that is the value of the variable *query-io*. ++

++ ++
++
quoted object
++

n. ++ an object which is the second element of a ++ quote form. ++

++
++
++

R

++
++
++ ++
++
radix
++

n. ++ an integer between 2 and 36, inclusive, which can be used ++ to designate a base with respect to which certain kinds of numeric ++ input or output are performed. ++ (There are n valid digit characters for any given radix n, ++ and those digits are the first n digits in the sequence ++ 0, 1, ..., 9, A, B, ..., Z, ++ which have the weights ++ 0, 1, ..., 9, 10, 11, ..., 35, ++ respectively. ++ Case is not significant in parsing numbers of radix greater ++ than 10, so “9b8a” and “9B8A” denote the same radix ++ 16 number.) ++

++ ++
++
random state
++

n. ++ an object of type random-state. ++

++ ++
++
rank
++

n. ++ a non-negative integer indicating the number of ++ dimensions of an array. ++

++ ++
++
ratio
++

n. ++ an object of type ratio. ++

++ ++
++
ratio marker
++

n. ++ a character which is used in the textual notation for a ratio ++ to separate the numerator from the denominator, and which ++ is slash in the standard readtable. ++ See Character Syntax. ++

++ ++
++
rational
++

n. ++ an object of type rational. ++

++ ++
++
read
++

v.t. ++

++

1. (a binding or slot or component) ++ to obtain the value of the binding or slot. ++

++

2. (an object from a stream) ++ to parse an object from its representation on the stream. ++

++ ++
++
readably
++

adv. (of a manner of printing an object O_1) ++ in such a way as to permit the Lisp Reader to later parse ++ the printed output into an object O_2 that is similar to O_1. ++

++ ++
++
reader
++

n. ++ 1. a function that reads_1 a variable or slot. ++ 2. the Lisp reader. ++

++ ++
++
reader macro
++

n. ++ 1. a textual notation introduced by dispatch on one or two characters ++ that defines special-purpose syntax for use by the Lisp reader, ++ and that is implemented by a reader macro function. ++ See Reader Algorithm. ++ 2. the character or characters that introduce ++ a reader macro_1; that is, ++ a macro character ++ or the conceptual pairing of a dispatching macro character and the ++ character that follows it. ++ (A reader macro is not a kind of macro.) ++

++ ++
++
reader macro function
++

n. ++ a function designator that denotes a function ++ that implements a reader macro_2. ++ See the functions set-macro-character and set-dispatch-macro-character. ++

++ ++
++
readtable
++

n. ++ an object of type readtable. ++

++ ++
++
readtable case
++

n. ++ an attribute of a readtable ++ whose value is a case sensitivity mode, ++ and that selects the manner in which characters ++ in a symbol’s name are to be treated by ++ the Lisp reader ++ and the Lisp printer. ++ See Effect of Readtable Case on the Lisp Reader and Effect of Readtable Case on the Lisp Printer. ++

++ ++
++
readtable designator
++

n. ++ a designator for a readtable; that is, ++ an object that denotes a readtable ++ and that is one of: ++ nil (denoting the standard readtable), ++ or a readtable (denoting itself). ++

++ ++
++
recognizable subtype
++

n. (of a type) ++ a subtype of the type which can be reliably detected ++ to be such by the implementation. ++ See the function subtypep. ++

++ ++
++
reference
++

n., v.t. ++ 1. n. an act or occurrence of referring to an object, ++ a binding, an exit point, a tag, ++ or an environment. ++ 2. v.t. to refer to an object, a binding, an ++ exit point, a tag, or an environment, ++ usually by name. ++

++ ++
++
registered package
++

n. ++ a package object that is installed in the package registry. ++ (Every registered package has a name that is a string, ++ as well as zero or more string nicknames. ++ All packages that are initially specified by Common Lisp ++ or created by make-package or defpackage ++ are registered packages. Registered packages can be turned into ++ unregistered packages by delete-package.) ++

++ ++
++
relative
++

adj. ++ 1. (of a time) ++ representing an offset from an absolute time ++ in the units appropriate to that time. ++ For example, ++ a relative internal time is the difference between ++ two absolute internal times, and is measured in ++ internal time units. ++ 2. (of a pathname) ++ representing a position in a directory hierarchy by motion ++ from a position other than the root, which might therefore vary. ++ “The notation #P"../foo.text" denotes a relative ++ pathname if the host file system is Unix.” ++ See absolute. ++

++ ++
++
repertoire
++

n., ISO ++ a subtype of character. See Character Repertoires. ++

++ ++
++
report
++

n. (of a condition) ++ to call the function print-object on the condition ++ in an environment where the value of *print-escape* is false. ++

++ ++
++
report message
++

n. ++ the text that is output by a condition reporter. ++

++ ++
++
required parameter
++

n. ++ A parameter for which a corresponding positional argument ++ must be supplied when calling the function. ++

++ ++
++
rest list
++

n. (of a function having a rest parameter) ++ The list to which the rest parameter is bound on some ++ particular call to the function. ++

++ ++
++
rest parameter
++

n. ++ A parameter which was introduced by &rest. ++

++ ++
++
restart
++

n. ++ an object of type restart. ++

++ ++
++
restart designator
++

n. ++ a designator for a restart; that is, ++ an object that denotes a restart ++ and that is one of: ++ a non-nil symbol ++ (denoting the most recently established active ++ restart whose name is that symbol), ++ or a restart (denoting itself). ++

++ ++
++
restart function
++

n. ++ a function that invokes a restart, as if by invoke-restart. ++ The primary purpose of a restart function is to provide an alternate ++ interface. By convention, a restart function usually has the same name ++ as the restart which it invokes. Figure 26–4 shows a list of the ++ standardized restart functions. ++

++
++
  abort     muffle-warning  use-value  
++  continue  store-value                
++
++  Figure 26–4: Standardized Restart Functions
++
++
++ ++ ++
++
return
++

v.t. (of values) ++ 1. (from a block) to transfer control and values from the block; ++ that is, to cause the block to yield the values immediately ++ without doing any further evaluation of the forms in its body. ++ 2. (from a form) to yield the values. ++

++ ++
++
return value
++

n. Trad. ++ a value_1 ++

++ ++
++
right-parenthesis
++

n. ++ the standard character)”, ++ that is variously called ++ “right parenthesis” ++ or “close parenthesis” ++ See Figure~2–5. ++

++ ++
++
run time
++

n. ++ 1. load time ++ 2. execution time ++

++ ++
++
run-time compiler
++

n. ++ refers to the compile function or to implicit compilation, ++ for which the compilation and run-time environments are maintained ++ in the same Lisp image. ++

++ ++
++
run-time definition
++

n. ++ a definition in the run-time environment. ++

++ ++
++
run-time environment
++

n. ++ the environment in which a program is executed. ++

++
++
++

S

++
++
++ ++
++
safe
++

adj. ++ 1. (of code) ++ processed in a lexical environment where the the highest ++ safety level (3) was in effect. ++ See optimize. ++ 2. (of a call) a safe call. ++

++ ++
++
safe call
++

n. ++ a call in which ++ the call, ++ the function being called, ++ and the point of functional evaluation ++ are all safe_1 code. ++ For more detailed information, see Safe and Unsafe Calls. ++

++ ++
++
same
++

adj. ++ 1. (of objects under a specified predicate) ++ indistinguishable by that predicate. ++ “The symbol car, the string "car", and the string "CAR" ++ are the same under string-equal”. ++ 2. (of objects if no predicate is implied by context) ++ indistinguishable by eql. ++ Note that eq might be capable of distinguishing some ++ numbers and characters which eql cannot ++ distinguish, but the nature of such, if any, ++ is implementation-dependent. ++ Since eq is used only rarely in this specification, ++ eql is the default predicate when none is mentioned explicitly. ++ “The conses returned by two successive calls to cons ++ are never the same.” ++ 3. (of types) having the same set of elements; ++ that is, each type is a subtype of the others. ++ “The types specified by (integer 0 1), ++ (unsigned-byte 1), ++ and bit are the same.” ++

++ ++
++
satisfy the test
++

v. ++ (of an object being considered by a sequence function) ++ 1. (for a one argument test) ++ to be in a state such that the function which is the ++ predicate argument to the sequence function ++ returns true when given a single argument that is the ++ result of calling the sequence function’s key argument ++ on the object being considered. ++ See Satisfying a One-Argument Test. ++ 2. (for a two argument test) ++ to be in a state such that the two-place predicate ++ which is the sequence function’s ++ test argument ++ returns true when given a first argument that ++ is ++ the object being considered, ++ and when given a second argument ++ that is the result of calling the sequence function’s ++ key argument on an element of the ++ sequence function’s sequence argument ++ which is being tested for equality; ++ or to be in a state such that the test-not function ++ returns false given the same arguments. ++ See Satisfying a Two-Argument Test. ++

++ ++
++
scope
++

n. ++ the structural or textual region of code in which references ++ to an object, a binding, an exit point, ++ a tag, or an environment (usually by name) ++ can occur. ++

++ ++
++
script
++

n. ISO ++ one of possibly several sets that form an exhaustive partition ++ of the type character. See Character Scripts. ++

++ ++
++
secondary value
++

n. (of values resulting from the ++ evaluation of a form) ++ the second value, if any, ++ or else nil if there are fewer than two values. ++ “The secondary value returned by truncate is a remainder.” ++

++ ++
++
section
++

n. ++ a partitioning of output by a conditional newline on a pretty printing stream. ++ See Dynamic Control of the Arrangement of Output. ++

++ ++
++
self-evaluating object
++

n. ++ an object that is neither a symbol nor a ++ cons. ++ If a self-evaluating object is evaluated, ++ it yields itself as its only value. ++ “Strings are self-evaluating objects.” ++

++ ++
++
semi-standard
++

adj. (of a language feature) ++ not required to be implemented by any conforming implementation, ++ but nevertheless recommended as the canonical approach in situations where ++ an implementation does plan to support such a feature. ++ The presence of semi-standard aspects in the language is intended ++ to lessen portability problems and reduce the risk of gratuitous divergence ++ among implementations that might stand in the way of future ++ standardization. ++

++ ++
++
semicolon
++

n. ++ the standard character that is called “semicolon” (;). ++ See Figure~2–5. ++

++ ++
++
sequence
++

n. ++ 1. an ordered collection of elements ++ 2. a vector or a list. ++

++ ++
++
sequence function
++

n. ++ one of the functions in Figure~17–1, ++ or an implementation-defined function ++ that operates on one or more sequences. ++ and that is defined by the implementation to be a sequence function. ++

++ ++
++
sequential
++

adj. Trad. (of binding or assignment) ++ done in the style of setq, let*, or do*; ++ that is, interleaving the evaluation of the forms that produce values ++ with the assignments or bindings of the variables (or places). ++ See parallel. ++

++ ++
++
sequentially
++

adv. ++ in a sequential way. ++

++ ++
++
serious condition
++

n. ++ a condition of type serious-condition, ++ which represents a situation that is generally sufficiently ++ severe that entry into the debugger should be expected if ++ the condition is signaled but not handled. ++

++ ++
++
session
++

n. ++ the conceptual aggregation of events in a Lisp image from the time ++ it is started to the time it is terminated. ++

++ ++
++
set
++

v.t. Trad. (any variable ++ or a symbol that ++ is the name of a dynamic variable) ++ to assign the variable. ++

++ ++
++
setf expander
++

n. ++ a function used by setf to compute the setf expansion ++ of a place. ++

++ ++
++
setf expansion
++

n. ++ a set of five expressions_1 that, taken together, describe ++ how to store into a place ++ and which subforms of the macro call associated with the ++ place are evaluated. ++ See Setf Expansions. ++

++ ++
++
setf function
++

n. ++ a function whose name is (setf symbol). ++

++ ++
++
setf function name
++

n. (of a symbol S) ++ the list (setf S). ++

++ ++
++
shadow
++

v.t. ++ 1. to override the meaning of. ++ “That binding of X shadows an outer one.” ++ 2. to hide the presence of. ++ “That macrolet of F shadows the ++ outer flet of F.” ++ 3. to replace. ++ “That package shadows the symbol cl:car with ++ its own symbol car.” ++

++ ++
++
shadowing symbol
++

n. (in a package) ++ an element of the package’s shadowing symbols list. ++

++ ++
++
shadowing symbols list
++

n. (of a package) ++ a list, associated with the package, ++ of symbols that are to be exempted from ‘symbol conflict errors’ ++ detected when packages are used. ++ See the function package-shadowing-symbols. ++

++ ++
++
shared slot
++

n. (of a class) ++ a slot accessible in more than one instance ++ of a class; specifically, such a slot is accessible ++ in all direct instances of the class and in those ++ indirect instances whose class does not ++ shadow_1 the slot. ++

++ ++
++
sharpsign
++

n. ++ the standard character that is variously called “number sign,” “sharp,” ++ or “sharp sign” (#). ++ See Figure~2–5. ++

++ ++
++
short float
++

n. ++ an object of type short-float. ++

++ ++
++
sign
++

n. ++ one of the standard characters+” or “-”. ++

++ ++
++
signal
++

v. ++ to announce, using a standard protocol, that a particular situation, ++ represented by a condition, has been detected. ++ See Condition System Concepts. ++

++ ++
++
signature
++

n. (of a method) ++ a description of the parameters and ++ parameter specializers for the method which ++ determines the method’s applicability for a given set of ++ required arguments, and which also describes the ++ argument conventions for its other, non-required ++ arguments. ++

++ ++
++
similar
++

adj. (of two objects) ++ defined to be equivalent under the similarity relationship. ++

++ ++
++
similarity
++

n. ++ a two-place conceptual equivalence predicate, ++ which is independent of the Lisp image ++ so that two objects in different Lisp images ++ can be understood to be equivalent under this predicate. ++ See Literal Objects in Compiled Files. ++

++ ++
++
simple
++

adj. ++ 1. (of an array) being of type simple-array. ++ 2. (of a character) ++ having no implementation-defined attributes, ++ or else having implementation-defined attributes ++ each of which has the null value for that attribute. ++

++ ++
++
simple array
++

n. ++ an array of type simple-array. ++

++ ++
++
simple bit array
++

n. ++ a bit array that is a simple array; ++ that is, an object of type (simple-array bit). ++

++ ++
++
simple bit vector
++

n. ++ a bit vector of type simple-bit-vector. ++

++ ++
++
simple condition
++

n. ++ a condition of type simple-condition. ++

++ ++
++
simple general vector
++

n. ++ a simple vector. ++

++ ++
++
simple string
++

n. ++ a string of type simple-string. ++

++ ++
++
simple vector
++

n. ++ a vector of type simple-vector, ++ sometimes called a “simple general vector.” ++ Not all vectors that are simple are simple vectors—only ++ those that have element type t. ++

++ ++
++
single escape
++

n., adj. ++ 1. n. the syntax type of a character ++ that indicates that the next character is ++ to be treated as an alphabetic_2 character ++ with its case preserved. ++ For details, see Single Escape Character. ++ 2. adj. (of a character) ++ having the single escape syntax type. ++ 3. n. a single escape_2 character. ++ (In the standard readtable, ++ slash is the only single escape.) ++

++ ++
++
single float
++

n. ++ an object of type single-float. ++

++ ++
++
single-quote
++

n. ++ the standard character that is variously called ++ “apostrophe,” ++ “acute accent,” ++ “quote,” ++ or “single quote” ('). ++ See Figure~2–5. ++

++ ++
++
singleton
++

adj. (of a sequence) ++ having only one element. ++ “(list 'hello) returns a singleton list.” ++

++ ++
++
situation
++

n. ++ the evaluation of a form in a specific environment. ++

++ ++
++
slash
++

n. ++ the standard character that is variously called ++ “solidus” ++ or “slash” (/). ++ See Figure~2–5. ++

++ ++
++
slot
++

n. ++ a component of an object that can store a value. ++

++ ++
++
slot specifier
++

n. ++ a representation of a slot ++ that includes the name of the slot and zero or more slot options. ++ A slot option pertains only to a single slot. ++

++ ++
++
source code
++

n. ++ code representing objects suitable for evaluation ++ (e.g., objects created by read, ++ by macro expansion, ++

++

or by compiler macro expansion). ++

++ ++
++
source file
++

n. ++ a file which contains a textual representation of source code, ++ that can be edited, loaded, or compiled. ++

++ ++
++
space
++

n. ++ the standard character <Space>, ++ notated for the Lisp reader as #\Space. ++

++ ++
++
special form
++

n. ++ a list, other than a macro form, which is a ++ form with special syntax or special evaluation ++ rules or both, possibly manipulating the evaluation ++ environment or control flow or both. The first element of ++ a special form is a special operator. ++

++ ++
++
special operator
++

n. ++ one of a fixed set of symbols, ++ enumerated in Figure~3–2, ++ that may appear in the car of ++ a form in order to identify the form as a special form. ++

++ ++
++
special variable
++

n. Trad. ++ a dynamic variable. ++

++ ++
++
specialize
++

v.t. (a generic function) ++ to define a method for the generic function, or in other words, ++ to refine the behavior of the generic function by giving it a specific ++ meaning for a particular set of classes or arguments. ++

++ ++
++
specialized
++

adj. ++ 1. (of a generic function) ++ having methods which specialize the generic function. ++ 2. (of an array) ++ having an actual array element type ++ that is a proper subtype of the type t; ++ see Array Elements. ++ “(make-array 5 :element-type 'bit) makes an array of length ++ five that is specialized for bits.” ++

++ ++
++
specialized lambda list
++

n. ++ an extended lambda list used in forms that establish ++ method definitions, such as defmethod. ++ See Specialized Lambda Lists. ++

++ ++
++
spreadable argument list designator
++

n. ++ a designator for a list of objects; that is, ++ an object that denotes a list ++ and that is a non-null list L1 of length n, ++ whose last element is a list L2 of length m ++ (denoting a list L3 of length m+n-1 whose elements are ++ L1_i for i < n-1 followed by L2_j for j < m). ++ “The list (1 2 (3 4 5)) is a spreadable argument list designator for ++ the list (1 2 3 4 5).” ++

++ ++
++
stack allocate
++

v.t. Trad. ++ to allocate in a non-permanent way, such as on a stack. Stack-allocation ++ is an optimization technique used in some implementations for ++ allocating certain kinds of objects that have dynamic extent. ++ Such objects are allocated on the stack rather than in the heap ++ so that their storage can be freed as part of unwinding the stack rather ++ than taking up space in the heap until the next garbage collection. ++ What types (if any) can have dynamic extent can vary ++ from implementation to implementation. No ++ implementation is ever required to perform stack-allocation. ++

++ ++
++
stack-allocated
++

adj. Trad. ++ having been stack allocated. ++

++ ++
++
standard character
++

n. ++ a character of type standard-char, which is one of a fixed set of 96 ++ such characters required to be present in all conforming implementations. ++ See Standard Characters. ++

++ ++
++
standard class
++

n. ++ a class that is a generalized instance of class standard-class. ++

++ ++
++
standard generic function
++
++

a function of type standard-generic-function. ++

++ ++
++
standard input
++

n. ++ the input stream which is the value of the dynamic variable ++ *standard-input*. ++

++ ++
++
standard method combination
++

n. ++ the method combination named standard. ++

++ ++
++
standard object
++

n. ++ an object that is ++ a generalized instance ++ of class standard-object. ++

++ ++
++
standard output
++

n. ++ the output stream which is the value of the dynamic variable ++ *standard-output*. ++

++ ++
++
standard pprint dispatch table
++

n. ++ A pprint dispatch table that is different from ++ the initial pprint dispatch table, ++ that implements pretty printing as described in this specification, ++ and that, unlike other pprint dispatch tables, ++ must never be modified by any program. ++ (Although the definite reference “the standard pprint dispatch table” ++ is generally used ++ within this document, it is actually implementation-dependent whether a ++ single object fills the role of the standard pprint dispatch table, ++ or whether there might be multiple such objects, any one of which could be used on any ++ given occasion where “the standard pprint dispatch table” is called for. ++ As such, this phrase should be seen as an indefinite reference ++ in all cases except for anaphoric references.) ++

++ ++
++
standard readtable
++

n. ++ A readtable that is different from the initial readtable, ++ that implements the expression syntax defined in this specification, ++ and that, unlike other readtables, must never be modified by any program. ++ (Although the definite reference “the standard readtable” is generally used ++ within this document, it is actually implementation-dependent whether a ++ single object fills the role of the standard readtable, ++ or whether there might be multiple such objects, any one of which could be used on any ++ given occasion where “the standard readtable” is called for. ++ As such, this phrase should be seen as an indefinite reference ++ in all cases except for anaphoric references.) ++

++ ++
++
standard syntax
++

n. ++ the syntax represented by the standard readtable ++ and used as a reference syntax throughout this document. ++ See Character Syntax. ++

++ ++
++
standardized
++

adj. (of a name, object, or definition) ++ having been defined by Common Lisp. ++ “All standardized variables that are required to ++ hold bidirectional streams have “-io*” in their name.” ++

++ ++
++
startup environment
++

n. ++ the global environment of the running Lisp image ++ from which the compiler was invoked. ++

++ ++
++
step
++

v.t., n. ++ 1. v.t. (an iteration variable) to assign the variable ++ a new value at the end of an iteration, in preparation for a new iteration. ++ 2. n. the code that identifies how the next value in an iteration ++ is to be computed. ++ 3. v.t. (code) to specially execute the code, pausing at ++ intervals to allow user confirmation or intervention, usually for debugging. ++

++ ++
++
stream
++

n. ++ an object that can be used with an input or output function to ++ identify an appropriate source or sink of characters or ++ bytes for that operation. ++

++ ++
++
stream associated with a file
++

n. ++ a file stream, or a synonym stream the target ++ of which is a stream associated with a file. ++ Such a stream cannot be created with ++ make-two-way-stream, ++ make-echo-stream, ++ make-broadcast-stream, ++ make-concatenated-stream, ++ make-string-input-stream, ++ or make-string-output-stream. ++

++ ++
++
stream designator
++

n. ++ a designator for a stream; that is, ++ an object that denotes a stream ++ and that is one of: ++ t (denoting the value of *terminal-io*), ++ nil (denoting the value of *standard-input* ++ for input stream designators ++ or denoting the value of *standard-output* ++ for output stream designators), ++ or a stream (denoting itself). ++

++ ++
++
stream element type
++

n. (of a stream) ++ the type of data for which the stream is specialized. ++

++ ++
++
stream variable
++

n. ++ a variable whose value must be a stream. ++

++ ++
++
stream variable designator
++

n. ++ a designator for a stream variable; that is, ++ a symbol that denotes a stream variable ++ and that is one of: ++ t (denoting *terminal-io*), ++ nil (denoting *standard-input* ++ for input stream variable designators ++ or denoting *standard-output* ++ for output stream variable designators), ++ or some other symbol (denoting itself). ++

++ ++
++
string
++

n. ++ a specialized vector that is of type string, ++ and whose elements are of type character or a subtype of type character. ++

++ ++
++
string designator
++

n. ++ a designator for a string; that is, ++ an object that denotes a string ++ and that is one of: ++ a character (denoting a singleton string ++ that has the character as its only element), ++ a symbol (denoting the string that is its name), ++ or a string (denoting itself). ++

++

The intent is that this term be consistent with the behavior of string; ++ implementations that extend string must extend the meaning of ++ this term in a compatible way. ++

++ ++
++
string equal
++

adj. ++ the same under string-equal. ++

++ ++
++
string stream
++

n. ++ a stream of type string-stream. ++

++ ++
++
structure
++

n. ++ an object of type structure-object. ++

++ ++
++
structure class
++

n. ++ a class that is a generalized instance of class structure-class. ++

++ ++
++
structure name
++

n. ++ a name defined with defstruct. ++ Usually, such a type is also a structure class, ++ but there may be implementation-dependent situations ++ in which this is not so, if the :type option to defstruct is used. ++

++ ++
++
style warning
++

n. ++ a condition of type style-warning. ++

++ ++
++
subclass
++

n. ++ a class that inherits from another class, ++ called a superclass. ++ (No class is a subclass of itself.) ++

++ ++
++
subexpression
++

n. (of an expression) ++ an expression that is contained within the expression. ++ (In fact, the state of being a subexpression is not an attribute ++ of the subexpression, but really an attribute of the containing ++ expression since the same object can at once be ++ a subexpression in one context, and not in another.) ++

++ ++
++
subform
++

n. (of a form) ++ an expression that is a subexpression of the form, ++ and which by virtue of its position in that form is also a ++ form. ++ “(f x) and x, but not exit, are subforms of ++ (return-from exit (f x)).” ++

++ ++
++
subrepertoire
++

n. ++ a subset of a repertoire. ++

++ ++
++
subtype
++

n. ++ a type whose membership is the same as or a proper subset of the ++ membership of another type, called a supertype. ++ (Every type is a subtype of itself.) ++

++ ++
++
superclass
++

n. ++ a class from which another class ++ (called a subclass) inherits. ++ (No class is a superclass of itself.) ++ See subclass. ++

++ ++
++
supertype
++

n. ++ a type whose membership is the same as or a proper superset ++ of the membership of another type, called a subtype. ++ (Every type is a supertype of itself.) ++ See subtype. ++

++ ++
++
supplied-p parameter
++

n. ++ a parameter which recieves its generalized boolean value ++ implicitly due to the presence or absence of an argument ++ corresponding to another parameter ++ (such as an optional parameter or a rest parameter). ++ See Ordinary Lambda Lists. ++

++ ++
++
symbol
++

n. ++ an object of type symbol. ++

++ ++
++
symbol macro
++

n. ++ a symbol that stands for another form. ++ See the macro symbol-macrolet. ++

++ ++
++
synonym stream
++

n. ++ 1. a stream of type synonym-stream, ++ which is consequently a stream that is an alias for another stream, ++ which is the value of a dynamic variable ++ whose name is the synonym stream symbol of the synonym stream. ++ See the function make-synonym-stream. ++ 2. (to a stream) ++ a synonym stream which has the stream as the value ++ of its synonym stream symbol. ++ 3. (to a symbol) ++ a synonym stream which has the symbol as its ++ synonym stream symbol. ++

++ ++
++
synonym stream symbol
++

n. (of a synonym stream) ++ the symbol which names the dynamic variable which has as its ++ value another stream for which the synonym stream ++ is an alias. ++

++ ++
++
syntax type
++

n. (of a character) ++ one of several classifications, enumerated in Figure~2–6, ++ that are used for dispatch during parsing by the Lisp reader. ++ See Character Syntax Types. ++

++ ++
++
system class
++

n. ++ a class that may be of type built-in-class in a conforming implementation ++ and hence cannot be inherited by classes defined by conforming programs. ++

++ ++
++
system code
++

n. ++ code supplied by the implementation to implement this specification ++ (e.g., the definition of mapcar) ++ or generated automatically in support of this specification ++ (e.g., during method combination); ++ that is, code that is not programmer code. ++

++
++
++

T

++
++
++ ++
++
t
++

n. ++ 1. a. the boolean representing true. ++ b. the canonical generalized boolean representing true. ++ (Although any object other than nil is considered true ++ as a generalized boolean, ++ t is generally used when there is no special reason to prefer one ++ such object over another.) ++ 2. the name of the type to which all objects belong—the ++ supertype of all types (including itself). ++ 3. the name of the superclass of all classes except itself. ++

++ ++
++
tag
++

n. ++ 1. a catch tag. ++ 2. a go tag. ++

++ ++
++
tail
++

n. (of a list) ++ an object that is the same as either some cons ++ which makes up that list or the atom (if any) which terminates ++ the list. ++ “The empty list is a tail of every proper list.” ++

++ ++
++
target
++

n. ++ 1. (of a constructed stream) ++ a constituent of the constructed stream. ++ “The target of a synonym stream is ++ the value of its synonym stream symbol.” ++ 2. (of a displaced array) ++ the array to which the displaced array is displaced. ++ (In the case of a chain of constructed streams or displaced arrays, ++ the unqualified term “target” always refers to the immediate ++ target of the first item in the chain, not the immediate target ++ of the last item.) ++

++ ++
++
terminal I/O
++

n. ++ the bidirectional stream ++ that is the value of the variable *terminal-io*. ++

++ ++
++
terminating
++

n. (of a macro character) ++ being such that, if it appears while parsing a token, it terminates that token. ++ See Reader Algorithm. ++

++ ++
++
tertiary value
++

n. (of values resulting from the ++ evaluation of a form) ++ the third value, if any, ++ or else nil if there are fewer than three values. ++

++ ++
++
throw
++

v. ++ to transfer control and values to a catch. ++ See the special operator throw. ++

++ ++
++
tilde
++

n. ++ the standard character that is called “tilde” (~). ++ See Figure~2–5. ++

++ ++
++
time
++
++

a representation of a point (absolute time) ++ or an interval (relative time) ++ on a time line. ++ See decoded time, internal time, and universal time. ++

++ ++
++
time zone
++

n. ++ a rational multiple of 1/3600 between -24 (inclusive) ++ and 24 (inclusive) that represents a time zone as a number of hours ++ offset from Greenwich Mean Time. Time zone values increase with motion to the west, ++ so Massachusetts, U.S.A. is in time zone 5, ++ California, U.S.A. is time zone 8, ++ and Moscow, Russia is time zone -3. ++ (When “daylight savings time” is separately represented ++ as an argument or return value, the time zone ++ that accompanies it does not depend on whether daylight savings time ++ is in effect.) ++

++ ++
++
token
++

n. ++ a textual representation for a number or a symbol. ++ See Interpretation of Tokens. ++

++ ++
++
top level form
++

n. ++ a form which is processed specially by compile-file for ++ the purposes of enabling compile time evaluation of that ++ form. ++ Top level forms include those forms which ++ are not subforms of any other form, ++ and certain other cases. See Processing of Top Level Forms. ++

++ ++
++
trace output
++

n. ++ the output stream which is the value of the dynamic variable ++ *trace-output*. ++

++ ++
++
tree
++

n. ++ 1. a binary recursive data structure made up of conses and ++ atoms: the conses are themselves also trees ++ (sometimes called “subtrees” or “branches”), and the atoms ++ are terminal nodes (sometimes called leaves). Typically, ++ the leaves represent data while the branches establish some ++ relationship among that data. ++ 2. in general, any recursive data structure that has some notion of ++ “branches” and leaves. ++

++ ++
++
tree structure
++

n. (of a tree_1) ++ the set of conses that make up the tree. ++ Note that while the car_{1b} component of each such cons ++ is part of the tree structure, ++ the objects that are the cars_2 of each cons ++ in the tree ++ are not themselves part of its tree structure ++ unless they are also conses. ++

++ ++
++
true
++

n. ++ any object ++ that is not false ++ and that is used to represent the success of a predicate test. ++ See t_1. ++

++ ++
++
truename
++

n. ++ 1. the canonical filename of a file in the file system. ++ See Truenames. ++ 2. a pathname representing a truename_1. ++

++ ++
++
two-way stream
++

n. ++ a stream of type two-way-stream, ++ which is a bidirectional composite stream that ++ receives its input from an associated input stream ++ and sends its output to an associated output stream. ++

++ ++
++
type
++

n. ++ 1. a set of objects, usually with common structure, behavior, or purpose. ++ (Note that the expression “X is of type S_a” ++ naturally implies that “X is of type S_b” if ++ S_a is a subtype of S_b.) ++ 2. (immediately following the name of a type) ++ a subtype of that type. ++ “The type vector is an array type.” ++

++ ++
++
type declaration
++

n. ++ a declaration that asserts that every reference to a ++ specified binding within the scope of the declaration ++ results in some object of the specified type. ++

++ ++
++
type equivalent
++

adj. (of two types X and Y) ++ having the same elements; ++ that is, X is a subtype of Y ++ and Y is a subtype of X. ++

++ ++
++
type expand
++

n. ++ to fully expand a type specifier, removing any references to ++ derived types. (Common Lisp provides no program interface to cause ++ this to occur, but the semantics of Common Lisp are such that every ++ implementation must be able to do this internally, and some ++ situations involving type specifiers are most easily described ++ in terms of a fully expanded type specifier.) ++

++ ++
++
type specifier
++

n. ++ an expression that denotes a type. ++ “The symbol random-state, the list (integer 3 5), ++ the list (and list (not null)), and the class named ++ standard-class are type specifiers.” ++

++
++
++

U

++
++
++ ++
++
unbound
++

adj. ++ not having an associated denotation in a binding. ++ See bound. ++

++ ++
++
unbound variable
++

n. ++ a name that is syntactically plausible as the name of a ++ variable but which is not bound ++ in the variable namespace. ++

++ ++
++
undefined function
++

n. ++ a name that is syntactically plausible as the name of a ++ function but which is not bound ++ in the function namespace. ++

++ ++
++
unintern
++

v.t. (a symbol in a package) ++ to make the symbol not be present in that package. ++ (The symbol might continue to be accessible by inheritance.) ++

++ ++
++
uninterned
++

adj. (of a symbol) ++ not accessible in any package; i.e., not interned_1. ++

++ ++
++
universal time
++

n. ++ time, represented as a non-negative integer number of seconds. ++ Absolute universal time is measured as an offset ++ from the beginning of the year 1900 (ignoring leap seconds). ++ See Universal Time. ++

++ ++
++
unqualified method
++

n. ++ a method with no qualifiers. ++

++ ++
++
unregistered package
++

n. ++ a package object that is not present in the package registry. ++ An unregistered package has no name; i.e., its name is nil. ++ See the function delete-package. ++

++ ++
++
unsafe
++

adj. (of code) ++ not safe. (Note that, unless explicitly specified otherwise, ++ if a particular kind of error checking is ++ guaranteed only in a safe context, the same checking might or might not occur ++ in that context if it were unsafe; describing a context as unsafe ++ means that certain kinds of error checking are not reliably enabled ++ but does not guarantee that error checking is definitely disabled.) ++

++ ++
++
unsafe call
++

n. ++ a call that is not a safe call. ++ For more detailed information, see Safe and Unsafe Calls. ++

++ ++
++
upgrade
++

v.t. (a declared type to an actual type) ++ 1. (when creating an array) ++ to substitute an actual array element type ++ for an expressed array element type ++ when choosing an appropriately specialized array representation. ++ See the function upgraded-array-element-type. ++ 2. (when creating a complex) ++ to substitute an actual complex part type ++ for an expressed complex part type ++ when choosing an appropriately specialized complex representation. ++ See the function upgraded-complex-part-type. ++

++ ++
++
upgraded array element type
++

n. (of a type) ++ a type that is a supertype of the type ++ and that is used instead of the type whenever the ++ type is used as an array element type ++ for object creation or type discrimination. ++ See Array Upgrading. ++

++ ++
++
upgraded complex part type
++

n. (of a type) ++ a type that is a supertype of the type ++ and that is used instead of the type whenever the ++ type is used as a complex part type ++ for object creation or type discrimination. ++ See the function upgraded-complex-part-type. ++

++ ++
++
uppercase
++

adj. (of a character) ++ being among standard characters corresponding to ++ the capital letters A through Z, ++ or being some other implementation-defined character ++ that is defined by the implementation to be uppercase. ++ See Characters With Case. ++

++ ++
++
use
++

v.t. (a package P_1) ++ to inherit the external symbols of P_1. ++ (If a package P_2 uses P_1, ++ the external symbols of P_1 ++ become internal symbols of P_2 ++ unless they are explicitly exported.) ++ “The package CL-USER uses the package CL.” ++

++ ++
++
use list
++

n. (of a package) ++ a (possibly empty) list associated with each package ++ which determines what other packages are currently being ++ used by that package. ++

++ ++
++
user
++

n. ++ an active entity, typically a human, that invokes or interacts with a ++ program at run time, but that is not necessarily a programmer. ++

++
++
++

V

++
++
++ ++
++
valid array dimension
++

n. ++ a fixnum suitable for use as an array dimension. ++ Such a fixnum must be greater than or equal to zero, ++ and less than the value of array-dimension-limit. ++ When multiple array dimensions are to be used together to specify a ++ multi-dimensional array, there is also an implied constraint ++ that the product of all of the dimensions be less than the value of ++ array-total-size-limit. ++

++ ++
++
valid array index
++

n. (of an array) ++ a fixnum suitable for use as one of possibly several indices needed ++ to name an element of the array according to a multi-dimensional ++ Cartesian coordinate system. Such a fixnum must ++ be greater than or equal to zero, ++ and must be less than the corresponding dimension_1 ++ of the array. ++ (Unless otherwise explicitly specified, ++ the phrase “a list of valid array indices” further implies ++ that the length of the list must be the same as the ++ rank of the array.) ++ “For a 2 by~3 array, ++ valid array indices for the first dimension are 0 and~1, and ++ valid array indices for the second dimension are 0, 1 and~2.” ++

++ ++
++
valid array row-major index
++

n. (of an array, ++ which might have any number ++ of dimensions_2) ++ a single fixnum suitable for use in naming any element ++ of the array, by viewing the array’s storage as a linear ++ series of elements in row-major order. ++ Such a fixnum must be greater than or equal to zero, ++ and less than the array total size of the array. ++

++ ++
++
valid fill pointer
++

n. (of an array) ++ a fixnum suitable for use as a fill pointer for the array. ++ Such a fixnum must be greater than or equal to zero, ++ and less than or equal to the array total size of the array. ++

++

[Editorial Note by KMP: The “valid pathname xxx” definitions were taken from ++ text found in make-pathname, but look wrong to me. ++ I’ll fix them later.] ++

++ ++
++
valid logical pathname host
++

n. ++ a string that has been defined as the name of a logical host. ++ See the function load-logical-pathname-translations. ++

++ ++
++
valid pathname device
++

n. ++ a string, ++ nil, ++ :unspecific, ++ or some other object defined by the implementation ++ to be a valid pathname device. ++

++ ++
++
valid pathname directory
++

n. ++ a string, ++ a list of strings, ++ nil, ++

++

:wild, ++

++

:unspecific, ++ or some other object defined by the implementation ++ to be a valid directory component. ++

++ ++
++
valid pathname host
++

n. ++ a valid physical pathname host ++ or a valid logical pathname host. ++

++ ++
++
valid pathname name
++

n. ++ a string, ++ nil, ++ :wild, ++ :unspecific, ++ or some other object defined by the implementation ++ to be a valid pathname name. ++

++ ++
++
valid pathname type
++

n. ++ a string, ++ nil, ++ :wild, ++ :unspecific. ++

++ ++
++
valid pathname version
++

n. ++ a non-negative integer, ++ or one of :wild, ++ :newest, ++ :unspecific, ++ or nil. ++ The symbols :oldest, :previous, and :installed are ++ semi-standard special version symbols. ++

++ ++
++
valid physical pathname host
++

n. ++ any of ++ a string, ++ a list of strings, ++ or the symbol :unspecific, ++ that is recognized by the implementation as the name of a host. ++

++ ++
++
valid sequence index
++

n. (of a sequence) ++ an integer suitable for use to name an element ++ of the sequence. Such an integer must ++ be greater than or equal to zero, ++ and must be less than the length of the sequence. ++

++

(If the sequence is an array, ++ the valid sequence index is further constrained to be a fixnum.) ++

++ ++
++
value
++

n. ++ 1. a. one of possibly several objects that are the result of ++ an evaluation. ++ b. (in a situation where exactly one value is expected from the ++ evaluation of a form) ++ the primary value returned by the form. ++ c. (of forms in an implicit progn) one of possibly ++ several objects that result from the evaluation ++ of the last form, or nil if there are no forms. ++ 2. an object associated with a name in a binding. ++ 3. (of a symbol) the value of the dynamic variable ++ named by that symbol. ++ 4. an object associated with a key ++ in an association list, ++ a property list, ++ or a hash table. ++

++ ++
++
value cell
++

n. Trad. (of a symbol) ++ The place which holds the value, if any, of the ++ dynamic variable named by that symbol, ++ and which is accessed by symbol-value. ++ See cell. ++

++ ++
++
variable
++

n. ++ a binding in which a symbol is the name ++ used to refer to an object. ++

++ ++
++
vector
++

n. ++ a one-dimensional array. ++

++ ++
++
vertical-bar
++

n. ++ the standard character that is called “vertical bar” (|). ++ See Figure~2–5. ++

++
++
++

W

++
++
++ ++
++
whitespace
++

n. ++ 1. one or more characters that are ++ either the graphic character #\Space ++ or else non-graphic characters such as #\Newline ++ that only move the print position. ++ 2. a. n. the syntax type of a character ++ that is a token separator. ++ For details, see Whitespace Characters. ++ b. adj. (of a character) ++ having the whitespace_{2a} syntax type_2. ++ c. n. a whitespace_{2b} character. ++

++ ++
++
wild
++

adj. ++ 1. (of a namestring) using an implementation-defined ++ syntax for naming files, which might “match” any of possibly several ++ possible filenames, and which can therefore be used to refer to ++ the aggregate of the files named by those filenames. ++ 2. (of a pathname) a structured representation of a name which ++ might “match” any of possibly several pathnames, and which can ++ therefore be used to refer to the aggregate of the files named by those ++ pathnames. The set of wild pathnames includes, but ++ is not restricted to, pathnames which have a component which is ++ :wild, or which have a directory component which contains :wild ++ or :wild-inferors. ++ See the function wild-pathname-p. ++

++ ++
++
write
++

v.t. ++

++

1. (a binding or slot or component) ++ to change the value of the binding or slot. ++

++

2. (an object to a stream) ++ to output a representation of the object to the stream. ++

++ ++
++
writer
++

n. ++ a function that writes_1 a variable or slot. ++

++
++
++

Y

++
++
++ ++
++
yield
++

v.t. (values) ++ to produce the values as the result of evaluation. ++ “The form (+ 2 3) yields 5.” ++

++
++
++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Glossary (Glossary)  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Graphic-Characters.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++Graphic Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.1 Graphic Characters

++ ++

Characters that are classified as graphic ++ ++, or displayable, are each ++associated with a glyph, a visual representation of the character. ++

++

A graphic character is one that has a standard textual ++representation as a single glyph, such as A or * or =. ++Space, which effectively has a blank glyph, is defined ++to be a graphic. ++

++

Of the standard characters, ++ newline is non-graphic ++ and all others are graphic; see Standard Characters. ++

++

Characters that are not graphic are called non-graphic ++ ++. ++

++

Non-graphic characters are sometimes informally called ++ “formatting characters” ++ or “control characters.” ++

++

#\Backspace, ++#\Tab, ++#\Rubout, ++#\Linefeed, ++#\Return, and ++#\Page, ++if they are supported by the implementation, ++are non-graphic. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Hash-Table-Concepts.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Hash Table Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables  

++
++
++

18.1 Hash Table Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Hash-Tables-Dictionary.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Hash Tables Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Hash Tables  

++
++
++

18.2 Hash Tables Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Hash-Tables.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Hash Tables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

18 Hash Tables

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Hash_002dTable-Operations.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++Hash-Table Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.1 Hash-Table Operations

++ ++

Figure 18–1 lists some defined names that are applicable ++to hash tables. The following rules apply to hash tables. ++

++
++
++

A hash table can only associate one value with a given ++key. If an attempt is made to add a second value for a given key, ++the second value will replace the first. ++Thus, adding a value to a hash table is a destructive operation; ++the hash table is modified. ++

++
++
++

There are four kinds of hash tables: ++ those whose keys are compared with eq, ++ those whose keys are compared with eql, ++ those whose keys are compared with equal, and ++

++

those whose keys are compared with equalp. ++

++
++
++

Hash tables are created by make-hash-table. ++gethash is used to look up a key and find the associated value. ++New entries are added to hash tables using setf with gethash. ++remhash is used to remove an entry. ++For example: ++

++
++
 (setq a (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32536573>
++ (setf (gethash 'color a) 'brown) ⇒  BROWN
++ (setf (gethash 'name a) 'fred) ⇒  FRED
++ (gethash 'color a) ⇒  BROWN, true
++ (gethash 'name a) ⇒  FRED, true
++ (gethash 'pointy a) ⇒  NIL, false
++
++ ++

In this example, the symbols color and name are being used as ++keys, and the symbols brown and fred are being used as the ++associated values. The hash table ++has two items in it, one of which ++associates from color to brown, and the other of which ++associates from name to fred. ++

++
++
++

A key or a value may be any object. ++

++
++
++

The existence of an entry in the hash table can be determined ++from the secondary value returned by gethash. ++

++
++ ++
++
  clrhash           hash-table-p     remhash  
++  gethash           make-hash-table  sxhash   
++  hash-table-count  maphash                   
++
++     Figure 18–1: Hash-table defined names   
++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/History.html +@@ -0,0 +1,231 @@ ++ ++ ++ ++ ++ ++History (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Scope  

++
++
++

1.1.2 History

++ ++

Lisp is a family of languages with a long history. Early key ideas in ++Lisp were developed by John McCarthy during the 1956 Dartmouth Summer ++Research Project on Artificial Intelligence. McCarthy’s motivation ++was to develop an algebraic list processing language for artificial ++intelligence work. ++Implementation efforts for early dialects of Lisp were undertaken on ++the IBM~704, the IBM~7090, the Digital Equipment Corporation (DEC) PDP-1, ++the DEC~PDP-6, and the PDP-10. The primary dialect of Lisp between ++1960 and 1965 was Lisp~1.5. By the early 1970’s there were two ++predominant dialects of Lisp, both arising from these early efforts: ++MacLisp and Interlisp. ++For further information about very early Lisp dialects, ++see The Anatomy of Lisp or Lisp 1.5 Programmer’s Manual. ++

++

MacLisp improved on the Lisp~1.5 notion of special variables and error ++handling. MacLisp also introduced the concept of functions that could take ++a variable number of arguments, macros, arrays, non-local dynamic ++exits, fast arithmetic, the first good Lisp compiler, and an emphasis ++on execution speed. ++By the end of the 1970’s, MacLisp was in use at over 50 sites. ++For further information about Maclisp, ++see Maclisp Reference Manual, Revision~0 or The Revised Maclisp Manual. ++

++

Interlisp introduced many ideas into Lisp programming environments and ++methodology. One of the Interlisp ideas that influenced Common Lisp was an iteration ++construct implemented by Warren Teitelman that inspired the loop ++macro used both on the Lisp Machines and in MacLisp, and now in Common Lisp. ++For further information about Interlisp, ++see Interlisp Reference Manual. ++

++

Although the first implementations of Lisp were on the IBM~704 and the ++IBM~7090, later work focussed on the DEC ++PDP-6 and, later, PDP-10 computers, the latter being the mainstay of ++Lisp and artificial intelligence work at such places as ++Massachusetts Institute of Technology (MIT), Stanford University, ++and ++Carnegie Mellon University (CMU) from the mid-1960’s through much of the 1970’s. ++The PDP-10 computer and its predecessor the PDP-6 computer were, by ++design, especially well-suited to Lisp because they had 36-bit words ++and 18-bit addresses. This architecture allowed a cons cell to be ++stored in one word; single instructions could extract the ++car and cdr ++parts. The PDP-6 and PDP-10 had fast, powerful stack instructions ++that enabled fast function calling. ++But the limitations of the PDP-10 were evident by 1973: it supported a ++small number of researchers using Lisp, and the small, 18-bit address ++space (2^18 = 262,144 words) limited the size of a single ++program. ++One response to the address space problem was the Lisp Machine, a ++special-purpose computer designed to run Lisp programs. The other ++response was to use general-purpose computers with address spaces ++larger than 18~bits, such as the DEC VAX and ++the S-1~Mark~IIA. ++For further information about S-1 Common Lisp, see S-1 Common Lisp Implementation. ++

++

The Lisp machine concept was developed in the late 1960’s. In the ++early 1970’s, Peter Deutsch, working with ++Daniel Bobrow, implemented a Lisp on the ++Alto, a single-user minicomputer, using microcode to interpret a ++byte-code implementation language. Shortly thereafter, Richard ++Greenblatt began work on a different hardware and instruction set ++design at MIT. ++Although the Alto was not a total success as a Lisp machine, a dialect ++of Interlisp known as Interlisp-D became available on the D-series ++machines manufactured by Xerox—the Dorado, Dandelion, ++Dandetiger, and Dove (or Daybreak). ++An upward-compatible extension of MacLisp called Lisp ++Machine Lisp became available on the early MIT Lisp Machines. ++Commercial Lisp machines from Xerox, Lisp Machines (LMI), and ++Symbolics were on the market by 1981. ++For further information about Lisp Machine Lisp, see Lisp Machine Manual. ++

++

During the late 1970’s, Lisp Machine Lisp began to expand towards a ++much fuller language. Sophisticated lambda lists, ++setf, multiple values, and structures ++like those in Common Lisp are the results of early ++experimentation with programming styles by the Lisp Machine group. ++Jonl White and others migrated these features to MacLisp. ++Around 1980, Scott Fahlman and others at CMU began work on a Lisp to ++run on the Scientific Personal Integrated Computing ++Environment (SPICE) workstation. One of the goals of the project was to ++design a simpler dialect than Lisp Machine Lisp. ++

++

The Macsyma group at MIT began a project during the late 1970’s called ++the New Implementation of Lisp (NIL) for the VAX, which was headed by ++White. One of the stated goals of the NIL project was to fix many of ++the historic, but annoying, problems with Lisp while retaining significant ++compatibility with MacLisp. At about the same time, a research group at ++Stanford University and Lawrence Livermore National Laboratory headed ++by Richard P. Gabriel began the design of a Lisp to run on the ++S-1~Mark~IIA supercomputer. S-1~Lisp, never completely ++functional, was the test bed for adapting advanced compiler techniques ++to Lisp implementation. Eventually the S-1 and NIL groups ++collaborated. ++For further information about the NIL project, ++see NIL—A Perspective. ++

++

The first effort towards Lisp standardization was made in 1969, ++when Anthony Hearn and Martin Griss at the University of Utah ++defined Standard Lisp—a subset of Lisp~1.5 and other dialects—to ++transport REDUCE, a symbolic algebra system. ++During the 1970’s, the Utah group implemented first a retargetable ++optimizing compiler for Standard Lisp, ++and then an extended implementation known as Portable Standard Lisp (PSL). ++By the mid 1980’s, PSL ran on about a dozen kinds of computers. ++For further information about Standard Lisp, see Standard LISP Report. ++

++

PSL and Franz Lisp—a MacLisp-like dialect for Unix machines—were ++the first examples of widely available Lisp dialects on multiple ++hardware platforms. ++

++

One of the most important developments in Lisp occurred during the ++second half of the 1970’s: Scheme. Scheme, designed by Gerald J. ++Sussman and Guy L. Steele Jr., is a simple dialect of Lisp whose ++design brought to Lisp some of the ideas from programming language ++semantics developed in the 1960’s. Sussman was one of the prime ++innovators behind many other advances in Lisp technology from the late ++1960’s through the 1970’s. ++The major contributions of Scheme were lexical scoping, lexical ++closures, first-class continuations, and simplified syntax (no ++separation of value cells and function cells). Some of these contributions made ++a large impact on the design of Common Lisp. ++For further information about Scheme, see IEEE Standard for the Scheme Programming Language ++or Revised^3 Report on the Algorithmic Language Scheme. ++

++

In the late 1970’s object-oriented programming concepts started to ++make a strong impact on Lisp. ++At MIT, certain ideas from Smalltalk made their way into several ++widely used programming systems. ++Flavors, an object-oriented programming system with multiple inheritance, ++was developed at MIT for the Lisp machine community by Howard Cannon and others. ++At Xerox, the experience with Smalltalk and ++Knowledge Representation Language (KRL) led to the development of ++Lisp Object Oriented Programming System (LOOPS) and later Common LOOPS. ++For further information on Smalltalk, see Smalltalk-80: The Language and its Implementation. ++For further information on Flavors, see Flavors: A Non-Hierarchical Approach to Object-Oriented Programming. ++

++

These systems influenced the design of the Common Lisp Object System (CLOS). ++CLOS was developed specifically for this standardization effort, ++and was separately written up in Common Lisp Object System Specification. ++However, minor details ++of its design have changed slightly since that publication, and that paper ++should not be taken as an authoritative reference to the semantics of the ++object system as described in this document. ++

++

In 1980 Symbolics and LMI were developing Lisp Machine Lisp; stock-hardware ++implementation groups were developing NIL, Franz Lisp, and PSL; Xerox ++was developing Interlisp; and the SPICE project at CMU was developing ++a MacLisp-like dialect of Lisp called SpiceLisp. ++

++

In April 1981, after a DARPA-sponsored meeting concerning the ++splintered Lisp community, Symbolics, the SPICE project, the NIL ++project, and the S-1~Lisp project joined together to define ++Common Lisp. Initially spearheaded by White and Gabriel, the ++driving force behind this grassroots effort was provided by Fahlman, ++Daniel Weinreb, David Moon, Steele, and Gabriel. ++Common Lisp was designed as a description of a family of languages. The ++primary influences on Common Lisp were Lisp Machine Lisp, MacLisp, NIL, ++S-1~Lisp, Spice Lisp, and Scheme. ++Common Lisp: The Language is a description of that design. Its ++semantics were intentionally underspecified in places where it was ++felt that a tight specification would overly constrain Common Lisp ++research and use. ++

++

In 1986 X3J13 was formed as a technical working group to ++produce a draft for an ANSI Common Lisp standard. Because of the ++acceptance of Common Lisp, the goals of this group differed from those of ++the original designers. These new goals included stricter ++standardization for portability, an object-oriented programming ++system, a condition system, iteration facilities, and a way to handle ++large character sets. To accommodate those ++goals, a new language specification, this ++document, was developed. ++

++ ++
++
++

++Previous: , Up: Scope  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Identity-of-Characters.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Identity of Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.5 Identity of Characters

++ ++

Two characters that are eql, char=, or char-equal ++are not necessarily eq. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Implementation-Limits-on-Array-Rank.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Implementation Limits on Array Rank (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.1.1.9 Implementation Limits on Array Rank

++ ++

An implementation may impose a limit on the rank of an array, ++but there is a minimum requirement on that limit. See the variable array-rank-limit. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Implementation-Limits-on-Individual-Array-Dimensions.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Implementation Limits on Individual Array Dimensions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Array Elements  

++
++
++

15.1.1.3 Implementation Limits on Individual Array Dimensions

++ ++

An implementation may impose a limit on dimensions of an array, ++but there is a minimum requirement on that limit. See the variable array-dimension-limit. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Implementation_002dDefined-Packages.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Implementation-Defined Packages (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.9 Implementation-Defined Packages

++ ++

Other, implementation-defined packages might be present ++in the initial Common Lisp environment. ++

++

It is recommended, but not required, that the documentation for a ++conforming implementation contain a full list of all package names ++initially present in that implementation but not specified in this specification. ++(See also the function list-all-packages.) ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Implementation_002dDependent-Numeric-Constants.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Implementation-Dependent Numeric Constants (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Number Concepts  

++
++
++

12.1.2 Implementation-Dependent Numeric Constants

++ ++

Figure 12–7 shows defined names relating to ++implementation-dependent details about numbers. ++

++
++
  double-float-epsilon           most-negative-fixnum           
++  double-float-negative-epsilon  most-negative-long-float       
++  least-negative-double-float    most-negative-short-float      
++  least-negative-long-float      most-negative-single-float     
++  least-negative-short-float     most-positive-double-float     
++  least-negative-single-float    most-positive-fixnum           
++  least-positive-double-float    most-positive-long-float       
++  least-positive-long-float      most-positive-short-float      
++  least-positive-short-float     most-positive-single-float     
++  least-positive-single-float    short-float-epsilon            
++  long-float-epsilon             short-float-negative-epsilon   
++  long-float-negative-epsilon    single-float-epsilon           
++  most-negative-double-float     single-float-negative-epsilon  
++
++  Figure 12–7: Defined names relating to implementation-dependent details about numbers.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Implications-of-Strings-Being-Arrays.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Implications of Strings Being Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: String Concepts  

++
++
++

16.1.1 Implications of Strings Being Arrays

++ ++

Since all strings are arrays, all rules which apply ++generally to arrays also apply to strings. ++See Array Concepts. ++

++

For example, ++ strings can have fill pointers, ++ and strings are also subject to the rules of element type upgrading ++ that apply to arrays. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Indirection-in-Modified-BNF-Syntax.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Indirection in Modified BNF Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.4 Indirection in Modified BNF Syntax

++ ++

An indirection extension is introduced in order to make this ++new syntax more readable: ++

++
!O ++
++

If O is a non-terminal symbol, the right-hand side ++of its definition is substituted for the entire expression ++!O. For example, the following BNF is equivalent to ++the BNF in the previous example: ++

++

(x [[!O]] y) ++

++

O ::=A | B* | C ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Inheritance-of-Class-Options.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Inheritance of Class Options (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Inheritance  

++
++
++

4.3.4.2 Inheritance of Class Options

++ ++

The :default-initargs class option is inherited. The set of ++defaulted initialization arguments for a class is the union of the ++sets of initialization arguments supplied in ++the :default-initargs class options of the class and its superclasses. ++When more than one default initial value form is supplied for a given ++initialization argument, the default initial value form that is used ++is the one supplied by the class that is most specific according to ++the class precedence list. ++

++

If a given :default-initargs class option specifies an ++initialization argument of the same name more than once, an ++error of type program-error is signaled. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Inheritance-of-Methods.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Inheritance of Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.7 Inheritance of Methods

++ ++

A subclass inherits methods in the sense that any method applicable to ++all instances of a class is also applicable to all instances of any ++subclass of that class. ++

++

The inheritance of methods acts the same way regardless of ++which of the method-defining operators created the methods. ++

++

The inheritance of methods is described in detail in ++Method Selection and Combination. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Inheritance-of-Slots-and-Slot-Options.html +@@ -0,0 +1,179 @@ ++ ++ ++ ++ ++ ++Inheritance of Slots and Slot Options (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Slots  

++
++
++

7.5.3 Inheritance of Slots and Slot Options

++ ++

The set of the names of all slots accessible ++in an instance of a class C is the union of ++the sets of names of slots defined by C and its ++superclasses. The structure of an instance is ++the set of names of local slots in that instance. ++

++

In the simplest case, only one class among C and its superclasses ++defines a slot with a given slot name. ++If a slot is defined by a superclass of C, ++the slot is said to be inherited. The characteristics ++of the slot are determined by the slot specifier ++of the defining class. ++Consider the defining class for ++a slot S. If the value of the :allocation ++slot ++option is :instance, then S is a local slot and each ++instance ++of C has its own slot named S that stores its own value. If the ++value of the :allocation slot ++option is :class, then S ++is a shared slot, the class ++that defined S stores the value, and all ++instances of C can access that single slot. ++If the :allocation slot option is omitted, :instance is used. ++

++

In general, more than one class among C and its ++superclasses can ++define a slot with a given name. ++In such cases, only one slot with ++the given name is accessible in an instance ++of C, and ++the characteristics of that slot are ++a combination of the several slot ++specifiers, computed as follows: ++

++
++
*
++

All the slot specifiers for a given slot name ++are ordered from most specific to least specific, according to the order in C’s ++class precedence list of the classes that define them. All references ++to the specificity of slot specifiers immediately below refers to this ++ordering. ++

++
++
*
++

The allocation of a slot is controlled by the most ++specific slot specifier. If the most specific slot specifier ++does not contain an :allocation slot option, :instance is used. ++Less specific slot specifiers do not affect the allocation. ++

++
++
*
++

The default initial value form for a slot ++is the value of the :initform slot option in the most specific ++slot specifier that contains one. If no slot specifier ++contains an :initform slot option, the slot ++has no default initial value form. ++

++
++
*
++

The contents of a slot will always be of type ++(and T_1 ... T_n) where T_1 ... T_n are ++the values of the :type slot options contained in all of the ++slot specifiers. If no slot specifier contains the ++:type slot option, the contents of the slot will always be ++of type t. The consequences of attempting to store in a slot ++a value that does not satisfy the type of the slot are undefined. ++

++
++
*
++

The set of initialization arguments that initialize a ++given slot is the union of the initialization arguments declared in ++the :initarg slot options in all the slot specifiers. ++

++
++
*
++

The documentation string for a slot is the value of ++the :documentation slot option in the most specific slot ++specifier that contains one. If no slot specifier contains a ++:documentation slot option, the slot has no documentation string. ++

++
++
++ ++

A consequence of the allocation rule is that a shared slot can be ++shadowed. For example, if a class C_1 defines ++a slot named S ++whose value for the :allocation slot option is :class, ++that slot is accessible ++in instances of C_1 and all of its ++subclasses. However, if C_2 is a subclass ++of C_1 and also ++defines a slot named S, C_1’s ++slot is not shared ++by instances of C_2 and its subclasses. When a class ++C_1 defines a shared slot, any subclass C_2 of C_1 will share this single slot ++unless the defclass form for ++C_2 specifies a slot of the same ++name or there is a superclass ++of C_2 that precedes C_1 in the class precedence list of ++C_2 that defines a slot of the same name. ++

++

A consequence of the type rule is that the value of a slot ++satisfies the type constraint of each slot specifier that ++contributes to that slot. Because the result of attempting to ++store in a slot a value that does not satisfy the type ++constraint for the slot is undefined, the value in a slot ++might fail to satisfy its type constraint. ++

++

The :reader, :writer, and :accessor slot options ++create methods rather than define the characteristics of a slot. ++Reader and writer methods are inherited in the sense described in ++Inheritance of Methods. ++

++

Methods that access slots use only the name of the ++slot and the type of the slot’s value. Suppose ++a superclass provides a method that expects to access a ++shared slot of a given name, and a subclass defines ++a local slot with the same name. If the method provided ++by the superclass is used on an instance of the subclass, ++the method accesses the local slot. ++

++ ++
++
++

++Previous: , Up: Slots  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Inheritance.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Inheritance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.4 Inheritance

++ ++

A class can inherit methods, slots, ++and some defclass options from its superclasses. ++Other sections describe the inheritance of methods, ++the inheritance of slots and slot options, ++and the inheritance of class options. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Initial-and-Final-Execution.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++Initial and Final Execution (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.7.3 Initial and Final Execution

++ ++

The initially and finally constructs ++evaluate forms that occur before and after the loop body. ++

++

The initially construct causes the supplied ++compound-forms ++to be evaluated ++in the loop prologue, which precedes all loop code except for ++initial settings supplied by constructs with, for, or ++as. ++ The code for any initially clauses is ++executed ++in the order in which the clauses appeared in ++ the loop. ++

++

The finally construct causes the supplied ++compound-forms ++to be evaluated ++in the loop epilogue after normal iteration terminates. ++ The code for any finally clauses is ++executed ++ in the order in which the clauses appeared in ++ the loop. The collected code is executed once in the loop epilogue ++ before any implicit values are returned from the accumulation clauses. ++An explicit transfer of control (e.g., by return, go, or throw) ++from the loop body, however, will exit the ++ loop without executing the epilogue code. ++

++

Clauses such as return, always, never, and ++thereis ++can bypass the finally clause. ++

++

return (or return-from, if the named option was supplied) ++

++

can be used after finally to return values from a loop. ++

++

Such an explicit return ++

++

inside the ++finally clause takes precedence over returning the accumulation ++from clauses supplied by such keywords as collect, nconc, ++append, sum, count, maximize, and ++minimize; ++the accumulation values for these preempted clauses are not returned by ++loop if return or return-from is used. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Initialization-Arguments.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++Initialization Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.1 Initialization Arguments

++ ++

An initialization argument controls object creation and ++initialization. It is often convenient to use keyword symbols ++to name initialization arguments, but the name of an ++initialization argument can be any symbol, including nil. An ++initialization argument can be used in two ways: to fill a slot ++with a value or to provide an argument for an initialization ++method. A single initialization argument can be used for both ++purposes. ++

++

An initialization argument list is a ++property list of ++initialization argument names and values. ++Its structure is identical ++to a property list and also ++to the portion of an argument list ++processed for &key parameters. ++As in those lists, ++if an initialization ++argument name appears more than once in an initialization argument list, ++the leftmost occurrence supplies the value and the remaining occurrences ++are ignored. The arguments to make-instance (after the first ++argument) form an initialization argument list. ++

++

An initialization argument can be associated with a slot. If ++the initialization argument has a value in the initialization ++argument list, the value is stored into the slot of the newly ++created object, overriding any :initform form associated ++with the slot. A single initialization argument can initialize ++more than one slot. An initialization argument that initializes ++a shared slot stores its value into the shared slot, ++replacing any previous value. ++

++

An initialization argument can be associated with a method. When ++an object is created and a particular initialization argument is ++supplied, the generic functions initialize-instance, ++shared-initialize, and allocate-instance are called ++with that initialization argument’s name and value as a keyword argument ++pair. If a value for the initialization argument is not supplied in the ++initialization argument list, the method’s ++lambda list supplies a default value. ++

++

Initialization arguments are used in four situations: when making an ++instance, when re-initializing an instance, when updating ++an instance to conform to a redefined class, and when ++updating an instance to conform to the definition of a different ++class. ++

++

Because initialization arguments are used to control the creation and ++initialization of an instance of some particular class, ++we say that an initialization argument is ++“an initialization argument for” that class. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Initialize_002dInstance.html +@@ -0,0 +1,119 @@ ++ ++ ++ ++ ++ ++Initialize-Instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.6 Initialize-Instance

++ ++

The generic function initialize-instance is called by ++make-instance to initialize a newly created instance. ++It uses standard method combination. Methods for ++initialize-instance can be defined in order to perform any ++initialization that cannot be achieved ++simply by supplying initial values for slots. ++

++

During initialization, initialize-instance is invoked ++after the following actions have been taken: ++

++
++
*
++

The defaulted initialization argument list ++has been computed by combining the supplied initialization argument list ++with any default initialization arguments for the class. ++

++
++
*
++

The validity of the defaulted initialization argument list ++has been checked. If any of the initialization arguments has not ++been declared as valid, an error is signaled. ++

++
++
*
++

A new instance whose slots ++are unbound has been created. ++

++
++
++ ++

The generic function initialize-instance is called with the ++new instance and the defaulted initialization arguments. There is ++a system-supplied primary method for initialize-instance ++whose parameter specializer is the class standard-object. This ++method calls the generic function ++shared-initialize to fill in ++the slots according to the initialization arguments and the ++:initform forms for the slots; the generic function ++shared-initialize is called with the following arguments: the instance, ++t, and the defaulted initialization arguments. ++

++

Note that initialize-instance provides the ++defaulted initialization argument list in its call to shared-initialize, ++so the first step performed by the system-supplied primary method for ++shared-initialize takes into account both the initialization ++arguments provided in the call to make-instance and the ++defaulted initialization argument list. ++

++

Methods for initialize-instance can be defined to specify ++actions to be taken when an instance is initialized. ++If only after methods for initialize-instance are defined, they will be ++run after the system-supplied primary method for initialization and ++therefore will not interfere with the default behavior of ++initialize-instance. ++

++

The object system provides two functions that are useful in the bodies of ++initialize-instance methods. The function slot-boundp ++returns a generic boolean value that indicates whether a specified slot has a ++value; this provides a mechanism for writing after methods for ++initialize-instance that initialize slots only if they have ++not already been initialized. The function slot-makunbound ++causes the slot to have no value. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Initializing-Newly-Added-Local-Slots-_0028Changing-the-Class-of-an-Instance_0029.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Initializing Newly Added Local Slots (Changing the Class of an Instance) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.2.2 Initializing Newly Added Local Slots

++ ++

The second step of the update initializes the newly added slots and ++performs any other user-defined actions. This step is implemented by ++the generic function update-instance-for-different-class. The ++generic function update-instance-for-different-class is invoked ++by change-class after the first step of the update has been ++completed. ++

++

The generic function update-instance-for-different-class is ++invoked on arguments computed by change-class. ++The first argument passed is a copy of the instance being updated ++and is an instance of the class C_{from}; ++this copy has dynamic extent within the generic function change-class. ++The second argument is the instance as updated so far by change-class ++and is an instance of the class C_{to}. ++The remaining arguments are an initialization argument list. ++

++

There is a system-supplied primary method for ++update-instance-for-different-class that has two parameter ++specializers, each of which is the class standard-object. First ++this method checks the validity of initialization arguments and ++signals an error if an initialization argument is supplied that is not ++declared as valid. (For more information, see Declaring the Validity of Initialization Arguments.) ++Then it calls the ++generic function shared-initialize with the following arguments: ++the ++new ++instance, a list of names of the newly added ++slots, and the ++initialization arguments it received. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Initializing-Newly-Added-Local-Slots-_0028Redefining-Classes_0029.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Initializing Newly Added Local Slots (Redefining Classes) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.6.2 Initializing Newly Added Local Slots

++ ++

The second step initializes the newly added local slots and performs ++any other user-defined actions. This step is implemented by the generic ++function update-instance-for-redefined-class, which is called after ++completion of the first step of modifying the structure of the ++instance. ++

++

The generic function update-instance-for-redefined-class takes ++four required arguments: the instance being updated after it has ++undergone the first step, a list of the names of local slots that were ++added, a list of the names of local slots that were discarded, and a ++property list containing the slot names and values of ++slots that were ++discarded and had values. Included among the discarded slots are ++slots that were local in the old class and that are shared in the new ++class. ++

++

The generic function update-instance-for-redefined-class also ++takes any number of initialization arguments. When it is called by ++the system to update an instance whose class ++has been redefined, no ++initialization arguments are provided. ++

++

There is a system-supplied primary method for ++update-instance-for-redefined-class whose parameter specializer ++for its instance argument is the class standard-object. ++First this method checks the validity of initialization arguments and signals an ++error if an initialization argument is supplied that is not declared ++as valid. (For more information, see Declaring the Validity of Initialization Arguments.) ++Then it calls the generic function ++shared-initialize with the following arguments: the ++instance, ++the list of names of ++the newly added slots, and the initialization ++arguments it received. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Input.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++Input (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.1.1.2 Input, Output, and Bidirectional Streams

++ ++

A stream, whether a character stream or a binary stream, ++can be an input ++ ++ stream ++ ++ (source of data), ++ an output ++ ++ stream ++ ++ (sink for data), ++ both, ++ or (e.g., when “:direction :probe” is given to open) neither. ++

++

Figure 21–2 shows operators relating to ++input streams. ++

++
++
  clear-input  read-byte            read-from-string            
++  listen       read-char            read-line                   
++  peek-char    read-char-no-hang    read-preserving-whitespace  
++  read         read-delimited-list  unread-char                 
++
++        Figure 21–2: Operators relating to Input Streams.      
++
++
++ ++

Figure 21–3 shows operators relating to ++output streams. ++

++
++
  clear-output   prin1            write            
++  finish-output  prin1-to-string  write-byte       
++  force-output   princ            write-char       
++  format         princ-to-string  write-line       
++  fresh-line     print            write-string     
++  pprint         terpri           write-to-string  
++
++  Figure 21–3: Operators relating to Output Streams.
++
++
++ ++

A stream that is both an input stream and an output stream ++is called a bidirectional ++ ++ stream ++ ++. ++See the functions input-stream-p and output-stream-p. ++

++

Any of the operators listed in Figure~21–2 or Figure~21–3 ++can be used with bidirectional streams. In addition, Figure 21–4 ++shows a list of operators that relate specificaly to ++bidirectional streams. ++

++
++
  y-or-n-p  yes-or-no-p    
++
++  Figure 21–4: Operators relating to Bidirectional Streams.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Integrating-Types-and-Classes.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++Integrating Types and Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Classes  

++
++
++

4.3.7 Integrating Types and Classes

++ ++

The object system maps the space of classes into the space of types. ++Every class that has a proper name has a corresponding type ++with the same name. ++

++

The proper name of every class is a valid type specifier. In ++addition, every class object is a valid type specifier. ++Thus the expression (typep object class) evaluates to ++true if the class of object is class itself or ++a subclass of class. The evaluation of the expression ++(subtypep class1 class2) returns the values ++true and true if class1 is a subclass of class2 or if they are the ++same class; otherwise it returns the values ++false and true. ++If I is an instance of some class C named S ++and C is an instance of standard-class, ++the evaluation of the expression (type-of I\/) returns S ++if S is the proper name of C; ++otherwise, it returns C. ++

++

Because the names of classes ++and class objects are type specifiers, they may ++be used in the special form the and in type declarations. ++

++

Many but not all of the predefined type specifiers have a ++corresponding class with ++the same proper name as the type. These type ++specifiers are listed in Figure~4–8. ++For example, the type array has ++a corresponding class named array. ++No type specifier that is a ++list, such as (vector double-float 100), has a corresponding class. ++The operator deftype does not create any classes. ++

++

Each class that corresponds to a predefined type specifier can ++be implemented in one of three ways, at the discretion of each implementation. ++It can be a standard class, ++a structure class, ++

++

or a system class. ++

++

A built-in class is one whose generalized instances have restricted capabilities ++or special representations. Attempting to use defclass to define ++subclasses of a built-in-class signals an error. ++Calling make-instance to create a generalized instance of a ++built-in class signals an error. Calling slot-value on a ++generalized instance of a built-in class signals an error. ++Redefining a built-in class or using change-class to change ++the class of an object to or from a built-in class signals an error. ++However, built-in classes can be used as parameter specializers ++in methods. ++

++

It is possible to determine whether a class is a built-in class ++by checking the metaclass. ++A standard class is an instance of the class standard-class, ++a built-in class is an instance of the class built-in-class, and ++a structure class is an instance of the class structure-class. ++

++

Each structure type created by defstruct without ++using the :type option has a corresponding class. ++This class is a generalized instance of the class structure-class. ++The :include option of defstruct creates a direct ++subclass of the class ++that corresponds to the included structure ++type. ++

++

It is implementation-dependent whether slots are involved in the ++operation of functions defined in this specification ++on instances of classes defined in this specification, ++except when slots are explicitly defined by this specification. ++

++

If in a particular implementation a class defined in this specification ++has slots that are not defined by this specfication, the names of these slots ++must not be external symbols of packages defined in this specification nor ++otherwise accessible in the CL-USER package. ++

++

The purpose of specifying that many of the standard type specifiers have a ++corresponding class is to enable users to write methods that ++discriminate on these types. Method selection requires that a ++class precedence list can be determined for each class. ++

++

The hierarchical relationships among the type specifiers are mirrored by ++relationships among the classes corresponding to those types. ++

++

Figure~4–8 lists the set of classes ++that correspond to predefined type specifiers. ++

++
++
 arithmetic-error                 generic-function   simple-error              
++ array                            hash-table         simple-type-error         
++ bit-vector                       integer            simple-warning            
++ broadcast-stream                 list               standard-class            
++ built-in-class                   logical-pathname   standard-generic-function 
++ cell-error                       method             standard-method           
++ character                        method-combination standard-object           
++ class                            null               storage-condition         
++ complex                          number             stream                    
++ concatenated-stream              package            stream-error              
++ condition                        package-error      string                    
++ cons                             parse-error        string-stream             
++ control-error                    pathname           structure-class           
++ division-by-zero                 print-not-readable structure-object          
++ echo-stream                      program-error      style-warning             
++ end-of-file                      random-state       symbol                    
++ error                            ratio              synonym-stream            
++ file-error                       rational           t                         
++ file-stream                      reader-error       two-way-stream            
++ float                            readtable          type-error                
++ floating-point-inexact           real               unbound-slot              
++ floating-point-invalid-operation restart            unbound-variable          
++ floating-point-overflow          sequence           undefined-function        
++ floating-point-underflow         serious-condition  vector                    
++ function                         simple-condition   warning                   
++
++       Figure 4–8: Classes that correspond to pre-defined type specifiers      
++
++
++ ++

The class precedence list information specified in the entries for ++each of these classes are those that are required by the object system. ++

++

Individual implementations may be extended to define other type ++specifiers to have a corresponding class. Individual implementations ++may be extended to add other subclass relationships and to add other ++elements to the class precedence lists as long as ++they do not violate the type relationships and disjointness ++requirements specified by this standard. ++A standard class defined with no direct superclasses is guaranteed to ++be disjoint from all of the classes in the table, except for the ++class named t. ++

++ ++
++
++

++Previous: , Up: Classes  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interactive-Streams.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Interactive Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.1.1.4 Interactive Streams

++ ++

An interactive stream ++ ++ is one on which it makes sense to perform ++interactive querying. ++

++

The precise meaning of an interactive stream is ++implementation-defined, and may depend on the underlying ++operating system. Some examples of the things that an ++implementation might choose to use as identifying characteristics ++of an interactive stream include: ++

++
++
*
++

The stream is connected to a person (or equivalent) in such a way ++ that the program can prompt for information and expect to receive different ++ input depending on the prompt. ++

++
++
*
++

The program is expected to prompt for input and support “normal input editing”. ++

++
++
*
++

read-char might wait for the user to type something before returning ++ instead of immediately returning a character or end-of-file. ++

++
++
++ ++

The general intent of having some streams be classified as ++interactive streams is to allow them to be distinguished from ++streams containing batch (or background or command-file) input. ++Output to batch streams is typically discarded or saved for later viewing, ++so interactive queries to such streams might not have the expected effect. ++

++

Terminal I/O might or might not be an interactive stream. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interactive-Use-of-Restarts.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++Interactive Use of Restarts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.4.4 Interactive Use of Restarts

++ ++

For interactive handling, two pieces of information are needed ++from a restart: a report function and an interactive function. ++

++

The report function ++is used by a program such as the debugger to ++present a description of the action the restart will take. ++The report function is specified and established by the ++:report-function keyword to ++restart-bind or the ++:report keyword to restart-case. ++

++

The interactive function, which can be specified using the ++:interactive-function keyword to ++restart-bind or :interactive keyword ++to restart-case, is used when the restart ++is invoked ++interactively, such as from the debugger, to produce a suitable ++list of arguments. ++

++

invoke-restart invokes the most recently established ++restart whose ++name is the same as the first argument to invoke-restart. ++If a restart is invoked interactively by the debugger and does ++not transfer control but rather returns values, the precise ++action of the debugger on those values is implementation-defined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interfaces-to-Restarts.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Interfaces to Restarts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.4.5 Interfaces to Restarts

++ ++

Some restarts have functional interfaces, ++such as abort, continue, ++muffle-warning, store-value, and ++use-value. ++They are ordinary functions that use ++ find-restart and invoke-restart internally, ++that have the same name as the restarts they manipulate, ++and that are provided simply for notational convenience. ++

++

Figure 9–6 shows defined names relating to ++restarts. ++

++
++
  abort             invoke-restart-interactively  store-value          
++  compute-restarts  muffle-warning                use-value            
++  continue          restart-bind                  with-simple-restart  
++  find-restart      restart-case                                       
++  invoke-restart    restart-name                                       
++
++            Figure 9–6: Defined names relating to restarts.           
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Internal-Time.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++Internal Time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Time  

++
++
++

25.1.4.3 Internal Time

++ ++

Internal time ++ ++ represents time as a single integer, ++in terms of an implementation-dependent unit called an internal time unit. ++Relative time is measured as a number of these units. ++Absolute time is relative to an arbitrary time base. ++

++

Figure 25–7 shows defined names related to internal time. ++

++
++
  get-internal-real-time  internal-time-units-per-second  
++  get-internal-run-time                                   
++
++  Figure 25–7: Defined names involving time in Internal Time.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Internal-and-External-Symbols.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Internal and External Symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.3 Internal and External Symbols

++ ++

The mappings in a package are divided into two classes, external and internal. ++The symbols targeted by these different mappings ++are called external symbols and internal symbols ++ ++ of the ++package. Within a package, a name refers to one ++symbol or to none; if it does refer ++to a symbol, then it is either external or internal in that ++package, but not both. ++External symbols ++ ++

++

are part of the package’s public interface to other packages. ++Symbols become external symbols of a given ++package if they have been exported from that package. ++

++

A symbol has the same name no matter what package ++it is present in, but it might be an external symbol of some packages ++and an internal symbol of others. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interning-a-Symbol-in-the-KEYWORD-Package.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Interning a Symbol in the KEYWORD Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.7 Interning a Symbol in the KEYWORD Package

++ ++

The KEYWORD package is treated differently than other packages ++in that special actions are taken when a symbol is interned in it. ++In particular, when a symbol is interned in the KEYWORD package, ++ it is automatically made to be an external symbol ++and is automatically made to be a constant variable with itself as a value. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interpretation-of-Tokens.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Interpretation of Tokens (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Syntax  

++
++
++

2.3 Interpretation of Tokens

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interpreting-Dictionary-Entries.html +@@ -0,0 +1,132 @@ ++ ++ ++ ++ ++ ++Interpreting Dictionary Entries (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4 Interpreting Dictionary Entries

++ ++

The dictionary entry for each defined name is partitioned into ++sections. Except as explicitly indicated otherwise below, each section ++is introduced by a label identifying that section. The omission of a ++section implies that the section is either not applicable, or would ++provide no interesting information. ++

++

This section defines the significance of each potential section in a ++dictionary entry. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interpreting-Pathname-Component-Values.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Interpreting Pathname Component Values (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Pathnames  

++
++
++

19.2.2 Interpreting Pathname Component Values

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Pathnames  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Interval-Designators.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++Interval Designators (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.6 Interval Designators

++ ++

The compound type specifier form of the numeric type specifiers ++in Figure 12–10 permit the user to specify an interval on the real number line ++which describe a subtype of the type which would be described by the ++corresponding atomic type specifier. A subtype of some type ++T is specified using an ordered pair of objects called ++interval designators for type T. ++

++

The first of the two interval designators for type T can be ++any of the following: ++

++
++
a number N of type T
++

This denotes a lower inclusive bound of N. That is, elements ++of the subtype of T will be greater than or equal to N. ++

++
++
a singleton list whose element is
++

a number M of type T ++This denotes a lower exclusive bound of M. That is, elements ++of the subtype of T will be greater than M. ++

++
++
the symbol *
++

This denotes the absence of a lower bound on the interval. ++

++
++
++ ++

The second of the two interval designators for type T can be ++any of the following: ++

++
++
a number N of type T
++

This denotes an upper inclusive bound of N. That is, elements ++of the subtype of T will be less than or equal to N. ++

++
++
a singleton list whose element is
++

a number M of type T ++This denotes an upper exclusive bound of M. That is, elements ++of the subtype of T will be less than M. ++

++
++
the symbol *
++

This denotes the absence of an upper bound on the interval. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-_0028Introduction_0029.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Introduction (Introduction) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

1 Introduction

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-_0028Types-and-Classes_0029.html +@@ -0,0 +1,109 @@ ++ ++ ++ ++ ++ ++Introduction (Types and Classes) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes  

++
++
++

4.1 Introduction

++ ++ ++

A type is a (possibly infinite) set of objects. ++An object can belong to more than one type. ++Types are never explicitly represented as objects by Common Lisp. ++Instead, they are referred to indirectly by the use of type specifiers, ++which are objects that denote types. ++

++

New types can be defined using deftype, defstruct, ++defclass, and define-condition. ++

++

The function typep, a set membership test, is used to determine ++whether a given object is of a given type. The function ++subtypep, a subset test, is used to determine whether a ++given type is a subtype of another given type. The ++function type-of returns a particular type to ++which a given object belongs, even though that object ++must belong to one or more other types as well. ++(For example, every object is of type t, ++ but type-of always returns a type specifier ++ for a type more specific than t.) ++

++

Objects, not variables, have types. ++Normally, any variable can have any object as its value. ++It is possible to declare that a variable takes on only ++values of a given type by making an explicit type declaration. ++Types are arranged in a directed acyclic graph, except ++for the presence of equivalences. ++

++

Declarations can be made about types using declare, ++proclaim, declaim, or the. ++For more information about declarations, ++see Declarations. ++

++

Among the fundamental objects of the object system are classes. ++A class determines the structure and behavior of a set of ++other objects, which are called its instances. ++Every object is a direct instance of a class. ++The class of an object determines the set of ++operations that can be performed on the object. ++For more information, see Classes. ++

++

It is possible to write functions that have behavior specialized ++to the class of the objects which are their arguments. ++For more information, see Generic Functions and Methods. ++

++

The class of the class of an object ++is called its metaclass ++ ++. ++For more information about metaclasses, ++see Meta-Objects. ++

++ ++
++
++

++Next: , Previous: , Up: Types and Classes  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Characters.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++Introduction to Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.1 Introduction to Characters

++ ++

A character ++ ++ is an object that represents a unitary token ++(e.g., a letter, a special symbol, or a “control character”) ++in an aggregate quantity of text ++(e.g., a string or a text stream). ++

++

Common Lisp allows an implementation to provide support ++for international language characters as well ++as characters used in specialized arenas (e.g., mathematics). ++

++

The following figures contain lists of defined names applicable to ++characters. ++

++

Figure 13–1 lists some defined names relating to ++character attributes and character predicates. ++

++
++
  alpha-char-p     char-not-equal     char>            
++  alphanumericp    char-not-greaterp  char>=           
++  both-case-p      char-not-lessp     digit-char-p     
++  char-code-limit  char/=             graphic-char-p   
++  char-equal       char<              lower-case-p     
++  char-greaterp    char<=             standard-char-p  
++  char-lessp       char=              upper-case-p     
++
++       Figure 13–1: Character defined names – 1      
++
++
++ ++

Figure 13–2 lists some character construction and conversion defined names. ++

++
++
  char-code      char-name    code-char   
++  char-downcase  char-upcase  digit-char  
++  char-int       character    name-char   
++
++  Figure 13–2: Character defined names – 2
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Classes.html +@@ -0,0 +1,178 @@ ++ ++ ++ ++ ++ ++Introduction to Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Classes  

++
++
++

4.3.1 Introduction to Classes

++ ++

A class ++ ++ is an object that determines the structure and behavior ++of a set of other objects, which are called its instances ++ ++. ++

++

A class can inherit structure and behavior from other classes. ++A class whose definition refers to other classes for the purpose ++of inheriting from them is said to be a subclass of each of ++those classes. The classes that are designated for purposes of ++inheritance are said to be superclasses of the inheriting class. ++

++

A class can have a name. The function class-name ++takes a class object and returns its name. ++The name of an anonymous class is nil. A symbol ++can name a class. The function find-class takes a ++symbol and returns the class that the symbol names. ++A class has a proper name if the name is a symbol ++and if the name of the class names that class. ++That is, a class~C has the proper name~S if S= ++(class-name C) and C= (find-class S). ++Notice that it is possible for ++(find-class S_1) = (find-class S_2) ++and S_1!= S_2. ++If C= (find-class S), we say that C is the class named S. ++

++

A class C_1 is ++a direct superclass ++ ++ of a class C_2 ++if C_2 explicitly designates C_1 ++as a superclass in its definition. ++In this case C_2 is a direct subclass ++ ++ of C_1. ++A class C_n is a superclass ++ ++ of ++a class C_1 if there exists a series of ++classes C_2,...,C_{n-1} such that ++C_{i+1} is a direct superclass of C_i for 1 <= i<n. ++In this case, C_1 is a subclass ++ ++ of C_n. ++A class is considered neither a superclass nor a subclass of itself. ++That is, if C_1 is a superclass of C_2, ++then C_1 != C_2. ++The set of classes consisting of some given class C ++along with all of its superclasses is called “C and its superclasses.” ++

++

Each class has a class precedence list ++ ++, ++which is a total ordering on the set of the given class and its superclasses. ++The total ordering is expressed as a list ordered from most specific to least specific. ++The class precedence list is used in several ways. In general, more ++specific classes can shadow ++ ++_1 features that would ++otherwise be inherited from less specific classes. ++The method selection and combination process uses ++the class precedence list to order methods ++from most specific to least specific. ++

++

When a class is defined, the order in which its direct superclasses ++are mentioned in the defining form is important. Each class has a ++local precedence order ++ ++, which is a list consisting of the ++class followed by its direct superclasses in the order mentioned ++in the defining form. ++

++

A class precedence list is always consistent with the ++local precedence order of each class in the list. ++The classes in each local precedence order appear ++within the class precedence list in the same order. ++If the local precedence orders are inconsistent with each other, ++no class precedence list can be constructed, and an error is signaled. ++The class precedence list and its computation is discussed ++in Determining the Class Precedence List. ++

++

classes are organized into a directed acyclic graph. ++There are two distinguished classes, named t and standard-object. ++The class named t has no superclasses. ++It is a superclass of every class except itself. ++The class named standard-object is an instance of ++the class standard-class and is a superclass of ++every class that is an instance of the class standard-class except itself. ++

++

[Reviewer Note by Barmar: This or something like it needs to be said in the introduction.] ++There is a mapping from the object system class space into ++the type space. Many of the standard types specified ++in this document have a corresponding class that has the same ++name as the type. Some types do not have a ++corresponding class. The integration of the type and class ++systems is discussed in Integrating Types and Classes. ++

++

Classes are represented by objects that are themselves ++instances of classes. ++The class of the class of an object is termed ++the metaclass ++ ++ of that object. When no misinterpretation is ++possible, the term metaclass is used to refer to a class ++that has instances that are themselves classes. The metaclass ++determines the form of inheritance used by the classes that are its ++instances and the representation of the instances of those classes. ++The object system provides a default metaclass, standard-class, that is ++appropriate for most programs. ++

++

Except where otherwise specified, all classes mentioned in this ++standard are instances of the class standard-class, ++all generic functions are instances ++of the class standard-generic-function, ++and all methods are instances of the class standard-method. ++

++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Classes  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Environments.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Introduction to Environments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation  

++
++
++

3.1.1 Introduction to Environments

++ ++

A binding ++ ++ is an association between a name and ++that which the name denotes. Bindings are established ++in a lexical environment or a dynamic environment ++by particular special operators. ++

++

An environment ++ ++ is a set of bindings and other information ++used during evaluation (e.g., to associate meanings with names). ++

++

Bindings in an environment are partitioned into namespaces ++ ++. ++A single name can simultaneously have more than one ++associated binding per environment, ++but can have only one associated binding per namespace. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Generic-Functions.html +@@ -0,0 +1,157 @@ ++ ++ ++ ++ ++ ++Introduction to Generic Functions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.1 Introduction to Generic Functions

++ ++

A generic function ++ ++ is a function whose behavior depends on ++the classes or identities of the arguments supplied to it. ++A generic function object ++is associated with ++ a set of methods, ++ a lambda list, ++ a method combination_2, ++ and other information. ++

++

Like an ordinary function, a generic function takes arguments, ++performs a series of operations, and perhaps returns useful values. ++An ordinary function has a single body of code that is always executed ++when the function is called. A generic function has a set of bodies ++of code of which a subset is selected for execution. The selected ++bodies of code and the manner of their combination are determined by ++the classes or identities of one or more of the arguments to the ++generic function and by its method combination. ++

++

Ordinary functions and generic functions are called with identical syntax. ++

++

Generic functions are true functions that can be passed as arguments ++and used as the first argument to funcall and apply. ++

++

A binding of a function name to a generic function ++can be established in one of several ways. It can be ++established in the global environment by ++ ensure-generic-function, ++ defmethod (implicitly, due to ensure-generic-function) ++or ++ defgeneric (also implicitly, due to ensure-generic-function). ++

++

No standardized mechanism is provided for establishing a ++binding of a function name to a generic function ++in the lexical environment. ++

++

When a defgeneric form is evaluated, one of three actions ++is taken (due to ensure-generic-function): ++

++
++
*
++

If a generic function of the given name already exists, ++the existing generic function object is modified. Methods specified ++by the current defgeneric form are added, and any methods in the ++existing generic function that were defined by a previous defgeneric ++form are removed. Methods added by the current defgeneric ++form might replace methods defined by defmethod, ++defclass, define-condition, or defstruct. ++No other methods in the generic function are affected ++or replaced. ++

++
++
*
++

If the given name names ++ an ordinary function, ++ a macro, ++ or a special operator, ++an error is signaled. ++

++
++
*
++

Otherwise a generic function is created with the ++methods specified by the method definitions in the defgeneric ++form. ++

++
++
++ ++

Some operators permit specification of the options of a ++generic function, such as ++the type of method combination it uses ++or its argument precedence order. ++These operators will be referred to as ++“operators that specify generic function options.” ++

++

The only standardized operator in this category is defgeneric. ++

++

Some operators define methods for a generic function. ++These operators will be referred to as ++method-defining operators ++ ++; ++their associated forms are called method-defining forms. ++The standardized method-defining operators are listed in Figure 7–2. ++

++
++
  defgeneric        defmethod  defclass  
++  define-condition  defstruct            
++
++  Figure 7–2: Standardized Method-Defining Operators
++
++
++ ++

Note that of the standardized method-defining operators ++only defgeneric ++can specify generic function options. ++defgeneric and any implementation-defined operators ++that can specify generic function options ++are also referred to as “operators that specify generic function options.” ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Methods.html +@@ -0,0 +1,201 @@ ++ ++ ++ ++ ++ ++Introduction to Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.2 Introduction to Methods

++ ++

Methods define the class-specific or identity-specific behavior ++and operations of a generic function. ++

++

A method object ++is associated with ++ code that implements the method’s behavior, ++ a sequence of parameter specializers ++ that specify when the given method is applicable, ++ a lambda list, ++ and a sequence of qualifiers that are used by the method combination ++ facility to distinguish among methods. ++

++

A method object is not a function and cannot be invoked as a function. ++Various mechanisms in the object system take a method object and invoke its method ++function, as is the case when a generic function is invoked. When this ++occurs it is said that the method is invoked or called. ++

++

A method-defining form contains the code that is to be run when the ++arguments to the generic function cause the method that it defines to ++be invoked. When a method-defining form is evaluated, a method object ++is created and one of four actions is taken: ++

++
++
*
++

If a generic function of the given name already exists ++and if a method object already exists that agrees with the new one on ++parameter specializers and qualifiers, the new method object replaces ++the old one. For a definition of one method agreeing with another on ++parameter specializers and qualifiers, ++see Agreement on Parameter Specializers and Qualifiers. ++

++
++
*
++

If a generic function of the given name already exists ++and if there is no method object that agrees with the new one on ++parameter specializers and qualifiers, the existing generic function ++object is modified to contain the new method object. ++

++
++
*
++

If the given name names an ordinary function, a macro, ++or a special operator, an error is signaled. ++

++
++
*
++

Otherwise a generic function is created with the method ++specified by the method-defining form. ++

++
++
++ ++

If the lambda list of a new method is not ++congruent with the lambda list of the generic function, ++an error is signaled. If a method-defining operator that cannot specify ++generic function options creates a new generic function, ++a lambda list for that generic function is derived from the ++lambda list of the method in the method-defining form in such a way ++as to be congruent with it. For a discussion of congruence ++ ++, ++see Congruent Lambda-lists for all Methods of a Generic Function. ++

++

Each method has a specialized lambda list, which determines ++when that method can be applied. A specialized lambda list is like ++an ordinary lambda list except that a specialized parameter ++may occur instead of the name of a required parameter. A specialized parameter ++is a list (variable-name parameter-specializer-name), ++where parameter-specializer-name is one of the following: ++

++
++
a symbol
++

denotes a parameter specializer which is the class ++named by that symbol. ++

++
++
a class
++

denotes a parameter specializer which is the class itself. ++

++
++
(eql form)
++

denotes a parameter specializer which satisfies the type specifier ++(eql object), where object is the ++result of evaluating form. The form form is evaluated in ++the lexical environment in which the method-defining form is evaluated. ++Note that form is evaluated only once, at the time the method is ++defined, not each time the generic function is called. ++

++
++ ++

Parameter specializer names are used in macros intended as the ++user-level interface (defmethod), while parameter specializers ++are used in the functional interface. ++

++

Only required parameters may be specialized, and there must be a ++parameter specializer for each required parameter. For notational ++simplicity, if some required parameter in a specialized lambda list in ++a method-defining form is simply a variable name, its ++parameter specializer defaults to the class t. ++

++

Given a generic function and a set of arguments, an applicable ++method is a method for that generic function whose parameter ++specializers are satisfied by their corresponding arguments. The ++following definition specifies what it means for a method to be ++applicable and for an argument to satisfy a parameter specializer. ++

++

Let < A_1, ..., A_n> be the required ++arguments to a generic function in order. Let < P_1, ++..., P_n> be the parameter specializers corresponding to ++the required parameters of the method M in order. The method M is ++applicable when each A_i is of the type specified by ++the type specifier P_i. ++Because every valid parameter specializer is ++also a valid type specifier, the function typep can be used during method ++selection to determine whether an argument satisfies a parameter specializer. ++

++

A method all of whose parameter specializers are ++the class t is called a default method ++ ++; it is always applicable but ++may be shadowed by a more specific method. ++

++

Methods can have qualifiers, which give the method combination ++procedure a way to distinguish among methods. A method that has one ++or more qualifiers is called a qualified method. ++A method with no qualifiers is called an unqualified method. ++A qualifier is any non-list. ++The qualifiers defined by the standardized method combination types ++are symbols. ++

++

In this specification, the terms “primary method” and ++“auxiliary method” are used to partition methods ++within a method combination type according to their intended use. ++In standard method combination, primary methods are ++unqualified methods ++and auxiliary methods are methods with a single qualifier ++that is one of :around, :before, or :after. ++Methods with these qualifiers are called around methods, ++before methods, and after methods, respectively. ++When a method combination type is defined using the short form of ++define-method-combination, primary methods are ++methods qualified with the name of the type of method combination, ++and auxiliary methods have the qualifier :around. ++Thus the terms “primary method” and “auxiliary method” ++have only a relative definition within a given method combination type. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Packages.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Introduction to Packages (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Package Concepts  

++
++
++

11.1.1 Introduction to Packages

++ ++

A package ++ ++ establishes a mapping from names to symbols. ++At any given time, one package is current. ++The current package ++ ++ is the one that is the value of *package*. ++When using the Lisp reader, ++it is possible to refer to symbols in packages ++other than the current one through the use of package prefixes in the ++printed representation of the symbol. ++

++

Figure 11–1 lists some defined names that are applicable ++to packages. ++Where an operator ++takes an argument that is either a symbol or a list ++of symbols, ++an argument of nil is treated as an empty list of symbols. ++Any package argument may be either a string, a symbol, or ++a package. If a symbol is supplied, its name will be used ++as the package name. ++

++
++
  *modules*            import                     provide           
++  *package*            in-package                 rename-package    
++  defpackage           intern                     require           
++  do-all-symbols       list-all-packages          shadow            
++  do-external-symbols  make-package               shadowing-import  
++  do-symbols           package-name               unexport          
++  export               package-nicknames          unintern          
++  find-all-symbols     package-shadowing-symbols  unuse-package     
++  find-package         package-use-list           use-package       
++  find-symbol          package-used-by-list                         
++
++         Figure 11–1: Some Defined Names related to Packages       
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Package Concepts  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Scripts-and-Repertoires.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Introduction to Scripts and Repertoires (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.2 Introduction to Scripts and Repertoires

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Slots.html +@@ -0,0 +1,119 @@ ++ ++ ++ ++ ++ ++Introduction to Slots (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Slots  

++
++
++

7.5.1 Introduction to Slots

++ ++

An object of metaclass standard-class has zero or more named ++slots. The slots of an object are determined ++by the class of the object. Each slot can hold ++one value. ++

++

[Reviewer Note by Barmar: All symbols are valid variable names. Perhaps this means ++ to preclude the use of named constants? We have a terminology ++ problem to solve.] ++The name of a slot is a symbol that is syntactically ++valid for use as a variable name. ++

++

When a slot does not have a value, the slot is said to be ++unbound. When an unbound slot is read, ++

++

[Reviewer Note by Barmar: from an object whose metaclass is standard-class?] ++the generic function slot-unbound is invoked. The ++system-supplied primary method ++for slot-unbound ++on class t signals an error. ++

++

If slot-unbound returns, its primary value ++is used that time as the value of the slot. ++

++

The default initial value form for a slot is defined by ++the :initform slot option. When the :initform form is used to ++supply a value, it is evaluated in the lexical environment in which ++the defclass form was evaluated. The :initform along with ++the lexical environment in which the defclass form was evaluated ++is called a captured initialization form. ++For more details, see Object Creation and Initialization. ++

++

A local slot is defined to be a slot that is ++accessible ++to exactly one instance, ++namely the one in which the slot is allocated. ++A shared slot is defined to be a slot that is visible to more than one ++instance of a given class and its subclasses. ++

++

A class is said to define a slot with a given name when ++the defclass form for that class contains a slot specifier with ++that name. Defining a local slot does not immediately create ++a slot; it causes a slot to be created each time ++an instance of the class is created. ++Defining a shared slot immediately creates a slot. ++

++

The :allocation slot option to defclass controls the kind ++of slot that is defined. If the value of the :allocation slot ++option is :instance, a local slot is created. If the value of ++:allocation is :class, a shared slot is created. ++

++

A slot is said to be accessible in an instance ++of a class if ++the slot is defined by the class ++of the instance or is inherited from ++a superclass of that class. ++At most one slot of a given name can be ++accessible in an instance. ++A shared slot defined by a class is ++accessible in all instances ++of that class. ++A detailed explanation of the inheritance of slots is given in ++Inheritance of Slots and Slot Options. ++

++
++
++

++Next: , Previous: , Up: Slots  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Introduction-to-Streams.html +@@ -0,0 +1,102 @@ ++ ++ ++ ++ ++ ++Introduction to Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Stream Concepts  

++
++
++

21.1.1 Introduction to Streams

++ ++

A stream ++ ++ is an object that can be used with an input or output ++function to identify an appropriate source or sink of characters or ++bytes for that operation. ++A character ++ ++ stream ++ ++ is a source or sink of characters. ++A binary ++ ++ stream ++ ++ is a source or sink of bytes. ++

++

Some operations may be performed on any kind of stream; ++Figure 21–1 provides a list of standardized operations ++that are potentially useful with any kind of stream. ++

++
++
  close                 stream-element-type  
++  input-stream-p        streamp              
++  interactive-stream-p  with-open-stream     
++  output-stream-p                            
++
++  Figure 21–1: Some General-Purpose Stream Operations
++
++
++ ++

Other operations are only meaningful on certain stream types. ++For example, read-char is only defined for character streams ++and read-byte is only defined for binary streams. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Invalid-Characters.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Invalid Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.3 Invalid Characters

++ ++

Characters with the constituent trait invalid ++cannot ever appear in a token ++except under the control of a single escape character. ++If an invalid character is encountered while an object is ++being read, an error of type reader-error is signaled. ++If an invalid character is preceded by a single escape character, ++it is treated as an alphabetic_2 constituent instead. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Invalid-Keyword-Arguments.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Invalid Keyword Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.6 Invalid Keyword Arguments

++ ++

It is not permitted to supply a keyword argument to a function ++using a name that is not a symbol. ++

++

If this situation occurs in a safe call, ++

++

an error of type program-error must be signaled ++unless keyword argument checking is suppressed as described ++in Suppressing Keyword Argument Checking; ++and in an unsafe call the situation has undefined consequences. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Iteration-Control.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++Iteration Control (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.1 Iteration Control

++ ++

Iteration control clauses allow direction of loop iteration. ++The loop keywords for and as ++designate iteration control clauses. ++Iteration control clauses differ with respect to the specification of ++termination tests and to the initialization and stepping_1 ++of loop variables. Iteration clauses by themselves ++do not cause the Loop Facility to return values, but they ++can be used in conjunction with value-accumulation clauses to ++return values. ++

++

All variables are initialized in the loop prologue. ++A variable binding has lexical scope ++unless it is proclaimed special; ++thus, by default, the variable can be accessed only by forms ++that lie textually within the loop. ++Stepping assignments are made in the loop body before any other forms ++are evaluated in the body. ++

++

The variable argument in iteration control clauses can be a ++destructuring list. A destructuring list ++is a tree whose non-nil atoms are variable names. ++See Destructuring. ++

++

The iteration control clauses for, as, and repeat ++must precede any other loop clauses, except ++ initially, with, and named, ++since they establish variable bindings. ++When iteration control clauses are ++used in a loop, ++the corresponding ++termination tests in the loop body are evaluated ++before any other loop body code is executed. ++

++

If multiple iteration clauses are used to control iteration, variable ++initialization and stepping_1 occur sequentially by default. ++The and construct can be used to connect two or more ++iteration clauses when sequential binding and ++stepping_1 are not necessary. ++The iteration behavior of clauses joined by and ++is analogous to the behavior of the macro do with ++respect to do*. ++

++

The for and as clauses iterate by using one or more local ++loop variables that are initialized to some value and that ++can be modified or stepped_1 after each iteration. ++For these clauses, iteration terminates when a local ++variable reaches some supplied value or when some other loop clause ++terminates iteration. ++At each iteration, variables can be ++ stepped_1 by an increment or a decrement ++or can be assigned a new value by the evaluation of a form). ++Destructuring can be used to assign ++values to variables during iteration. ++

++

The for and as keywords are synonyms; they can be used ++interchangeably. There are seven syntactic formats for these constructs. ++In each syntactic format, the type of ++var can be supplied by the optional type-spec ++argument. If var is a destructuring list, the type ++supplied by the type-spec argument must appropriately match ++the elements of the list. ++By convention, for introduces new iterations and as ++introduces iterations that depend on a previous iteration specification. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Iteration-Dictionary.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Iteration Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Iteration  

++
++
++

6.2 Iteration Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Iteration.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Iteration (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

6 Iteration

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Keyword-Arguments-in-Generic-Functions-and-Methods.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++Keyword Arguments in Generic Functions and Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.5 Keyword Arguments in Generic Functions and Methods

++ ++

When a generic function or any of its methods mentions ++&key in a lambda list, the specific set of keyword ++arguments accepted by the generic function varies according to the ++applicable methods. The set of keyword arguments accepted by the ++generic function for a particular call is the union of the keyword ++arguments accepted by all applicable methods and the keyword arguments ++mentioned after &key in the generic function definition, ++if any. A method that has &rest but not &key does not affect the ++set of acceptable keyword arguments. If ++the lambda list of any applicable method or of the generic ++function definition contains &allow-other-keys, all ++keyword arguments are accepted by the generic function. ++

++

The lambda list congruence rules require that each method ++accept all of the keyword arguments mentioned after &key in the ++generic function definition, by accepting them explicitly, by ++specifying &allow-other-keys, or by specifying &rest but ++not &key. Each method can accept additional keyword arguments ++of its own, in addition to the keyword arguments mentioned in the ++generic function definition. ++

++

If a generic function is passed a keyword argument that no applicable ++method accepts, an error should be signaled; see Error Checking in Function Calls. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Kinds-of-Places.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++Kinds of Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2 Kinds of Places

++ ++

Several kinds of places are defined by Common Lisp; ++this section enumerates them. ++This set can be extended by implementations and by programmer code. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lambda-Expressions.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Lambda Expressions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.3 Lambda Expressions

++ ++

In a lambda expression, ++the body is evaluated in a lexical environment that is formed by ++adding the binding of ++each parameter in the lambda list ++with the corresponding value from the arguments ++to the current lexical environment. ++

++

For further discussion of how bindings are established ++based on the lambda list, see Lambda Lists. ++

++

The body of a lambda expression is an implicit progn; ++the values it returns are returned by the lambda expression. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lambda-Forms.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Lambda Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.11 Lambda Forms

++ ++

A lambda form is similar to a function form, except that ++the function name is replaced by a lambda expression. ++

++

A lambda form is equivalent to using funcall of a ++lexical closure of the lambda expression on the given arguments. ++(In practice, some compilers are more likely to produce inline code ++for a lambda form than for an arbitrary named function ++that has been declared inline; however, such a difference ++is not semantic.) ++

++

For further information, see Lambda Expressions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lambda-Lists.html +@@ -0,0 +1,127 @@ ++ ++ ++ ++ ++ ++Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4 Lambda Lists

++ ++ ++

A lambda list ++ ++ is a list that ++specifies a set of parameters (sometimes called lambda variables) ++and a protocol for receiving values for those parameters. ++

++

There are several kinds of lambda lists. ++

++
++
 Context                                     Kind of Lambda List                             
++ defun form                                  ordinary lambda list                            
++ defmacro form                               macro lambda list                               
++ lambda expression                           ordinary lambda list                            
++ flet local function definition              ordinary lambda list                            
++ labels local function definition            ordinary lambda list                            
++ handler-case clause specification           ordinary lambda list                            
++ restart-case clause specification           ordinary lambda list                            
++ macrolet local macro definition             macro lambda list                               
++ define-method-combination                   ordinary lambda list                            
++ define-method-combination :arguments option define-method-combination arguments lambda list 
++ defstruct :constructor option               boa lambda list                                 
++ defgeneric form                             generic function lambda list                    
++ defgeneric method clause                    specialized lambda list                         
++ defmethod form                              specialized lambda list                         
++ defsetf form                                defsetf lambda list                             
++ define-setf-expander form                   macro lambda list                               
++ deftype form                                deftype lambda list                             
++ destructuring-bind form                     destructuring lambda list                       
++ define-compiler-macro form                  macro lambda list                               
++ define-modify-macro form                    define-modify-macro lambda list                 
++
++                         Figure 3–10: What Kind of Lambda Lists to Use                       
++
++
++ ++

Figure 3–11 lists some defined names that are applicable ++to lambda lists. ++

++
++
  lambda-list-keywords  lambda-parameters-limit    
++
++  Figure 3–11: Defined names applicable to lambda lists
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lambda_002dlist_002ddirected-Destructuring-by-Lambda-Lists.html +@@ -0,0 +1,142 @@ ++ ++ ++ ++ ++ ++Lambda-list-directed Destructuring by Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.4.4 Lambda-list-directed Destructuring by Lambda Lists

++ ++

An extension of data-directed destructuring of trees is ++lambda-list-directed destructuring. This derives from the analogy ++between the three-element destructuring pattern ++

++

(first second third) ++

++

and the three-argument lambda list ++

++

(first second third) ++

++

Lambda-list-directed destructuring is identical to data-directed destructuring ++if no lambda list keywords appear in the pattern. ++Any list in the pattern (whether a sub-list or the whole pattern itself) ++that contains a lambda list keyword is interpreted specially. ++Elements of the list to the left of the first ++lambda list keyword are treated as destructuring patterns, as usual, but the ++remaining elements of the list are treated like a function’s ++lambda list ++except that where a variable would normally be required, an arbitrary ++destructuring pattern is allowed. Note that in case of ambiguity, ++lambda list syntax is preferred over destructuring syntax. Thus, after ++&optional a list of elements is a list of a destructuring pattern ++and a default value form. ++

++

The detailed behavior of each lambda list keyword in a ++lambda-list-directed destructuring ++pattern is as follows: ++

++
++
&optional
++

Each following element is a variable or a list of a destructuring ++pattern, a default value form, and a supplied-p variable. The default value and ++the supplied-p variable can be omitted. ++If the list being destructured ends ++early, so that it does not have an element to match against this destructuring ++(sub)-pattern, the default form is evaluated and destructured instead. The ++supplied-p variable receives the value ++nil if the default form is used, t otherwise. ++

++
++
&rest, &body
++

The next element is a destructuring pattern that matches the ++rest of the list. &body is identical to &rest but declares that what ++is being matched is a list of forms that constitutes the body of form. ++This next element must be the last unless a lambda list keyword follows it. ++

++
++
&aux
++

The remaining elements are not destructuring patterns at all, but are ++auxiliary variable bindings. ++

++
++
&whole
++

The next element is a destructuring pattern that matches the entire ++form in a macro, or the entire subexpression at inner levels. ++

++
++
&key
++

Each following element is one of ++

++
++

a variable, ++

++
++
or
++

a list of a variable, ++ an optional initialization form, ++ and an optional supplied-p variable. ++

++
++
or
++

a list of a list of a keyword and a destructuring pattern, ++ an optional initialization form, ++ and an optional supplied-p variable. ++

++
++ ++

The rest of the list being destructured ++is taken to be alternating keywords and values and is taken apart appropriately. ++

++
++
&allow-other-keys
++

Stands by itself. ++

++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Language-Extensions.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++Language Extensions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Introduction (Introduction)  

++
++
++

1.6 Language Extensions

++ ++ ++

A language extension is any documented implementation-defined behavior ++of a defined name in this standard that varies from the ++behavior described in this standard, or a documented consequence of a ++situation that the standard specifies as undefined, unspecified, or ++extendable by the implementation. For example, if this standard says ++that “the results are unspecified,” an extension would be to specify ++the results. ++

++

[Reviewer Note by Barmar: This contradicts previous definitions of conforming code.] ++If the correct behavior of a program depends on the results provided ++by an extension, only implementations with the same extension will ++execute the program correctly. Note that such a program might be ++non-conforming. Also, if this standard says that “an implementation ++may be extended,” a conforming, but possibly non-portable, program ++can be written using an extension. ++

++

An implementation can have extensions, provided they do not alter the ++behavior of conforming code and provided they are not explicitly ++prohibited by this standard. ++

++

The term “extension” refers only to extensions available upon ++startup. An implementation is free to allow or prohibit redefinition ++of an extension. ++

++

The following list contains specific guidance to implementations ++concerning certain types of extensions. ++

++
Extra return values
++
++

An implementation must return exactly ++the number of return values specified by this standard unless the ++standard specifically indicates otherwise. ++

++
++
Unsolicited messages
++
++

No output can be produced by a function other than that specified in ++the standard or due to the signaling of conditions ++detected by the function. ++

++

Unsolicited output, such as garbage collection notifications and ++autoload heralds, should not go directly to the stream ++that is the value of a stream variable defined in this ++standard, but can go indirectly to terminal I/O by using a ++synonym stream to *terminal-io*. ++

++

Progress reports from such functions as load and ++compile are considered solicited, and are not covered by ++this prohibition. ++

++
++
Implementation of macros and special forms
++
++

Macros and special operators defined in this standard ++must not be functions. ++

++
++
++ ++ ++
++
++

++Next: , Previous: , Up: Introduction (Introduction)  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Language-Subsets.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Language Subsets (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.7 Language Subsets

++ ++ ++

The language described in this standard contains no subsets, ++though subsets are not forbidden. ++

++

For a language to be considered a subset, ++it must have the property that any valid program in that language ++has equivalent semantics and will run directly ++(with no extralingual pre-processing, and no special compatibility packages) ++in any conforming implementation of the full language. ++

++

A language that conforms to this requirement shall be described ++as being a “subset of Common Lisp as specified by ANSI <<standard number>>.” ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Leading-and-Trailing-Newlines-in-Condition-Reports.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Leading and Trailing Newlines in Condition Reports (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3.3 Leading and Trailing Newlines in Condition Reports

++ ++

It is recommended that a report message not begin with any ++introductory text, such as “Error: ” or “Warning: ” ++or even just freshline or newline. ++Such text is added, if appropriate to the context, ++by the routine invoking the condition reporter. ++

++

It is recommended that a report message not be followed ++by a trailing freshline or newline. ++Such text is added, if appropriate to the context, ++by the routine invoking the condition reporter. ++

++
++
 (error "This is a message.~
++ (error "~&This is a message.")   ; Not recommended
++ (error "~&This is a message.~
++
++ (error "This is a message.")     ; Recommended instead
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Left_002dParenthesis.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++Left-Parenthesis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.1 Left-Parenthesis

++ ++

The left-parenthesis initiates reading of a list. ++read is called recursively to read successive objects ++until a right parenthesis is found in the input stream. ++A list of the objects read is returned. Thus ++

++
++
 (a b c)
++
++ ++

is read as a list of three objects ++(the symbols a, b, and c). ++The right parenthesis need not immediately follow the printed representation of ++the last object; whitespace_2 ++characters and comments may precede it. ++

++

If no objects precede the right parenthesis, ++it reads as a list of zero objects ++(the empty list). ++

++

If a token that is just a dot ++not immediately preceded by an escape character ++is read after some object ++then exactly one more object must follow the dot, ++possibly preceded or followed by whitespace_2 or a comment, ++followed by the right parenthesis: ++

++
++
 (a b c . d)
++
++ ++

This means that the cdr of the last cons in the ++list is not nil, ++but rather the object whose representation followed the dot. ++The above example might have been the result of evaluating ++

++
++
 (cons 'a (cons 'b (cons 'c 'd)))
++
++ ++

Similarly, ++

++
++
 (cons 'this-one 'that-one) ⇒  (this-one . that-one)
++
++ ++

It is permissible for the object ++following the dot to be a list: ++

++
++
 (a b c d . (e f . (g))) ≡ (a b c d e f g)
++
++ ++

For information on how the Lisp printer prints lists and conses, ++see Printing Lists and Conses. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lexical-Environments.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++Lexical Environments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.1.3 Lexical Environments

++ ++

A lexical environment ++ ++ for evaluation at some position in a program ++is that part of the environment that contains information having ++lexical scope within the forms containing that position. ++A lexical environment contains, among other things, the following: ++

++
++
*
++

bindings of lexical variables and symbol macros. ++

++
*
++

bindings of functions and macros. ++ (Implicit in this is information about those compiler macros ++ that are locally disabled.) ++

++
*
++

bindings of block tags. ++

++
*
++

bindings of go tags. ++

++
*
++

information about declarations. ++

++
++ ++

The lexical environment that is active at any given position ++in a program being semantically processed is referred to by ++definite reference as “the current lexical environment,” ++or sometimes as just “the lexical environment.” ++

++

Within a given namespace, ++a name is said to be bound in a lexical environment ++if there is a binding ++associated with its name ++in the lexical environment or, if not, there is a binding ++associated with its name in the global environment. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lexical-Variables.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Lexical Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++
++

3.1.2.3 Lexical Variables

++ ++

A lexical variable is a variable that can be referenced only within ++the lexical scope of the form that establishes that variable; ++lexical variables have lexical scope. ++Each time a form creates a lexical binding of a variable, ++a fresh binding is established. ++

++

Within the scope of a binding for a lexical variable name, ++uses of that name as a variable are considered to be references ++to that binding except where the variable is shadowed_2 ++by a form that establishes a fresh binding for that ++variable name, ++or by a form that locally declares the name special. ++

++

A lexical variable always has a value. ++There is no operator that introduces a binding for a ++lexical variable without giving it an initial value, nor ++is there any operator that can make a lexical variable be unbound. ++

++

Bindings of lexical variables are found in the lexical environment. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lists-as-Association-Lists.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Lists as Association Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses as Lists  

++
++
++

14.1.2.1 Lists as Association Lists

++ ++

An association list ++ ++ is a list of conses ++representing an association of keys with values, ++where the car of each cons is the key ++and the cdr is the value associated with that key. ++

++
++
  acons  assoc-if      pairlis  rassoc-if      
++  assoc  assoc-if-not  rassoc   rassoc-if-not  
++
++  Figure 14–4: Some defined names related to assocation lists.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lists-as-Sets.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Lists as Sets (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

14.1.2.2 Lists as Sets

++ ++

Lists are sometimes viewed as sets by considering their elements ++unordered and by assuming there is no duplication of elements. ++

++
++
  adjoin         nset-difference    set-difference    union  
++  intersection   nset-exclusive-or  set-exclusive-or         
++  nintersection  nunion             subsetp                  
++
++       Figure 14–5: Some defined names related to sets.     
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Literal-Objects-in-Compiled-Files.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Literal Objects in Compiled Files (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4 Literal Objects in Compiled Files

++ ++

The functions eval and compile are ++required to ensure that literal objects referenced within the resulting ++interpreted or compiled code objects are the same as the ++corresponding objects in the source code. ++compile-file, on the other hand, ++must produce a compiled file that, when loaded with ++load, constructs the objects defined by the ++source code and produces references to them. ++

++

In the case of compile-file, objects ++constructed by load of the compiled file cannot be spoken ++of as being the same as the objects constructed at ++compile time, because the compiled file may be loaded into a different ++Lisp image than the one in which it was compiled. This section ++defines the concept of similarity which relates ++objects in the evaluation environment to the ++corresponding objects in the run-time environment. ++

++

The constraints on literal objects described in this section ++apply only to compile-file; ++eval and compile do not copy or coalesce constants. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Loading.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Loading (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.1.1 Loading

++ ++

To load a file is to treat its contents as code ++and execute that code. ++The file may contain source code ++ ++ or compiled code ++ ++. ++

++

A file containing source code is called a source file ++ ++. ++Loading a source file is accomplished essentially ++by sequentially reading_2 the forms in the file, ++evaluating each immediately after it is read. ++

++

A file containing compiled code is called a compiled file ++ ++. ++Loading a compiled file is similar to loading a source file, ++except that the file does not contain text but rather an ++implementation-dependent representation of pre-digested expressions ++created by the compiler. Often, a compiled file can be loaded ++more quickly than a source file. ++See Compilation. ++

++

The way in which a source file is distinguished from a compiled file ++is implementation-dependent. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Local-Case-in-Pathname-Components.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Local Case in Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.4 Local Case in Pathname Components

++ ++

For the functions in Figure~19–2, ++a value of :local ++ for the :case argument ++(the default for these functions) ++indicates that the functions should receive and yield strings in component values ++as if they were already represented according to the host file system’s ++convention for case. ++

++

If the file system supports both cases, strings given or received ++as pathname component values under this protocol are to be used exactly ++as written. If the file system only supports one case, ++the strings will be translated to that case. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Local-Variable-Initializations.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++Local Variable Initializations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.15 Local Variable Initializations

++ ++

When a loop form is executed, the local variables are bound and are ++initialized to some value. These local variables exist until loop ++iteration terminates, at which point they cease to exist. ++Implicit variables are also established by iteration control clauses and the ++into preposition of accumulation clauses. ++

++

The with construct initializes variables that are local to ++a loop. The variables are initialized one time only. ++If the optional type-spec argument is supplied for the variable ++var, but there is no related expression to be evaluated, var ++is initialized to an appropriate default value for its type. ++For example, for the types t, number, ++and float, ++the default values are nil, 0, and 0.0 respectively. ++The consequences are undefined if a ++type-spec argument is supplied for var if ++the related expression returns a value that is not of the supplied ++type. ++By default, the with construct initializes variables ++sequentially; that is, one variable is assigned a value before the ++next expression is evaluated. However, by using the loop keyword and ++to join several with clauses, ++initializations can be forced to occur in parallel; that ++is, all of the supplied ++forms are evaluated, and the results are bound to the respective ++variables simultaneously. ++

++

Sequential binding is used when it is desireable for the initialization of ++some variables to depend on the values of previously bound variables. ++For example, suppose the variables a, b, and c are to be bound in sequence: ++

++
++
 (loop with a = 1 
++       with b = (+ a 2) 
++       with c = (+ b 3)
++       return (list a b c))
++⇒  (1 3 6)
++
++ ++

The execution of the above loop is equivalent to the execution of ++the following code: ++

++
++
 (block nil
++   (let* ((a 1)
++          (b (+ a 2))
++          (c (+ b 3)))
++     (tagbody
++         (next-loop (return (list a b c))
++                    (go next-loop)
++                    end-loop))))
++
++ ++

If the values of previously bound variables are not needed ++for the initialization of other local variables, an ++and clause can be used to ++specify that the bindings are to occur in parallel: ++

++
++
 (loop with a = 1 
++       and b = 2 
++       and c = 3
++       return (list a b c))
++⇒  (1 2 3)
++
++ ++

The execution of the above loop is equivalent to the execution of ++the following code: ++

++
++
 (block nil
++   (let ((a 1)
++         (b 2)
++         (c 3))
++     (tagbody
++         (next-loop (return (list a b c))
++                    (go next-loop)
++                    end-loop))))
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Locating-a-Symbol-in-a-Package.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Locating a Symbol in a Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.6 Locating a Symbol in a Package

++ ++

When a symbol is to be located in a given package ++the following occurs: ++

++
++

The external symbols and internal symbols of the ++package are searched for the symbol. ++

++
++

The external symbols of the used packages are ++searched ++in some unspecified order. The ++order does not matter; see the rules for handling name ++conflicts listed below. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Logical-Operations-on-Integers.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++Logical Operations on Integers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1.5 Logical Operations on Integers

++ ++

Logical operations require integers as arguments; ++an error of type type-error should be signaled ++if an argument is supplied that is not an integer. ++Integer arguments to logical operations are treated as if ++they were represented in two’s-complement notation. ++

++

Figure 12–5 shows defined names relating to ++logical operations on numbers. ++

++
++
  ash          boole-ior       logbitp   
++  boole        boole-nand      logcount  
++  boole-1      boole-nor       logeqv    
++  boole-2      boole-orc1      logior    
++  boole-and    boole-orc2      lognand   
++  boole-andc1  boole-set       lognor    
++  boole-andc2  boole-xor       lognot    
++  boole-c1     integer-length  logorc1   
++  boole-c2     logand          logorc2   
++  boole-clr    logandc1        logtest   
++  boole-eqv    logandc2        logxor    
++
++  Figure 12–5: Defined names relating to logical operations on numbers.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Logical-Pathname-Components.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Logical Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.2 Logical Pathname Components

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Logical-Pathnames.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Logical Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames  

++
++
++

19.3 Logical Pathnames

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Loop-Keywords.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Loop Keywords (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.4 Loop Keywords

++ ++

Loop keywords are not true keywords_1; ++they are special symbols, recognized by name rather than object identity, ++that are meaningful only to the loop facility. ++A loop keyword is a symbol but is recognized by its name ++(not its identity), regardless of the packages in which it is accessible. ++

++

In general, loop keywords are not external symbols of the COMMON-LISP package, ++except in the coincidental situation that a symbol with the same name as a ++loop keyword was needed for some other purpose in Common Lisp. For example, ++there is a symbol in the COMMON-LISP package whose name is "UNLESS" but ++not one whose name is "UNTIL". ++

++

If no loop keywords are supplied in a loop form, ++the Loop Facility executes the loop body repeatedly; see Simple Loop. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lowercase-Characters.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Lowercase Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.5 Lowercase Characters

++ ++

A lowercase character is one that has a corresponding ++uppercase character that is different ++(and can be obtained using char-upcase). ++

++

Of the standard characters, only these are lowercase characters: ++

++

a b c d e f g h i j k l m n o p q r s t u v w x y z ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Lowercase-Letters-in-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Lowercase Letters in a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.8 Lowercase Letters in a Logical Pathname Namestring

++ ++

When parsing words and wildcard-words, ++lowercase letters are translated to uppercase. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Macro-Characters.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++Macro Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.4 Macro Characters

++ ++

When the Lisp reader encounters a macro character ++on an input stream, ++special parsing of subsequent characters ++on the input stream ++is performed. ++

++

A macro character has an associated function ++called a reader macro function ++ ++ that implements its specialized parsing behavior. ++An association of this kind can be established or modified under control of ++a conforming program by using ++the functions set-macro-character and set-dispatch-macro-character. ++

++

Upon encountering a macro character, the Lisp reader calls its ++reader macro function, which parses one specially formatted object ++from the input stream. ++The function either returns the parsed object, ++or else it returns no values ++ to indicate that the characters scanned by the function ++ are being ignored (e.g., in the case of a comment). ++Examples of macro characters ++are backquote, single-quote, left-parenthesis, and ++right-parenthesis. ++

++

A macro character is either terminating or non-terminating. ++The difference between terminating and non-terminating macro characters ++lies in what happens when such characters occur in the middle of a token. ++If a non-terminating ++ ++ macro character occurs in the middle of a token, ++the function associated ++with the non-terminating macro character is not called, ++and the ++non-terminating macro character does not terminate the token’s name; it ++becomes part of the name as if the macro character were really a constituent ++character. A terminating ++ ++ macro character terminates any token, ++and its associated reader macro function ++is called no matter where the character appears. ++The only non-terminating macro character in standard syntax ++is sharpsign. ++

++

If a character is a dispatching macro character C_1, ++its reader macro function is a function supplied by the implementation. ++This function reads decimal digit characters until a non-digit ++C_2 is read. ++If any digits were read, ++they are converted into a corresponding integer infix parameter P; ++otherwise, the infix parameter P is nil. ++The terminating non-digit C_2 is a character ++(sometimes called a “sub-character” to emphasize its subordinate role in the dispatching) ++that is looked up in the dispatch table associated with ++the dispatching macro character C_1. ++The reader macro function associated with the sub-character C_2 ++is invoked with three arguments: ++ the stream, ++ the sub-character C_2, ++ and the infix parameter P. ++For more information about dispatch characters, ++see the function set-dispatch-macro-character. ++

++

For information about the macro characters ++that are available in standard syntax, ++see Standard Macro Characters. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Macro-Forms-as-Places.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Macro Forms as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.7 Macro Forms as Places

++ ++

A macro form can be used as a place, ++in which case Common Lisp expands the macro form ++

++

as if by macroexpand-1 ++

++

and then uses the macro expansion in place of the original place. ++

++

Such macro expansion is attempted only after exhausting all other possibilities ++other than expanding into a call to a function named (setf reader). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Macro-Forms.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Macro Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++
++

3.1.2.9 Macro Forms

++ ++

If the operator names a macro, ++its associated macro function is applied ++to the entire form and the result of that application is ++used in place of the original form. ++

++

Specifically, a symbol names a macro in a given lexical environment if ++macro-function is true of the ++symbol and that environment. ++The function returned by macro-function ++is a function of two arguments, called the ++expansion function. ++The expansion function is invoked by calling the macroexpand hook with ++ the expansion function as its first argument, ++ the entire macro form as its second argument, ++ and an environment object (corresponding to the current lexical environment) ++ as its third argument. ++The macroexpand hook, in turn, calls the expansion function with the ++form as its first argument and the environment as its second argument. ++The value of the expansion function, which is passed through ++by the macroexpand hook, is a form. ++The returned form is evaluated in place of the original form. ++

++

The consequences are undefined if a macro function destructively modifies ++any part of its form argument. ++

++

A macro name is not a function designator, ++and cannot be used as the function argument to functions ++such as apply, funcall, or map. ++

++

An implementation is free to implement a Common Lisp special operator ++as a macro. An implementation is free to implement any ++macro operator as a special operator, but only ++if an equivalent definition of the macro is also provided. ++

++

Figure 3–3 lists some defined names that are applicable ++to macros. ++

++
++
  *macroexpand-hook*  macro-function  macroexpand-1  
++  defmacro            macroexpand     macrolet       
++
++    Figure 3–3: Defined names applicable to macros  
++
++
++ ++
++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Macro-Lambda-Lists.html +@@ -0,0 +1,229 @@ ++ ++ ++ ++ ++ ++Macro Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.4 Macro Lambda Lists

++ ++

A macro lambda list ++ ++ is used in describing macros ++defined by the operators in Figure 3–17. ++

++
++
  define-compiler-macro  defmacro  macrolet  
++  define-setf-expander                       
++
++  Figure 3–17: Operators that use Macro Lambda Lists
++
++
++ ++

With the additional restriction that ++an environment parameter may appear only once ++(at any of the positions indicated), ++a macro lambda list has the following syntax: ++

++ ++

reqvars ::={var | !pattern}* ++

++

optvars ::=[&optional {var |         ({var | !pattern} [init-form [supplied-p-parameter]])}*] ++

++

restvar ::=[{&rest | &body{var | !pattern}] ++

++

keyvars ::=[&key {var |              ({var |          (keyword-name {var | !pattern})}    [init-form [supplied-p-parameter]])}* ++            [&allow-other-keys]] ++

++ ++

auxvars ::=[&aux {var | (var [init-form])}*] ++

++

envvar ::=[&environment var] ++

++

wholevar ::=[&whole var] ++

++

lambda-list ::=(!wholevar !envvar !reqvars !envvar !optvars !envvar ++                !restvar !envvar !keyvars !envvar !auxvars !envvar) | ++                (!wholevar !envvar !reqvars !envvar !optvars !envvar . var) ++

++

pattern ::=(!wholevar !reqvars !optvars !restvar !keyvars !auxvars) | ++            (!wholevar !reqvars !optvars . var) ++

++ ++ ++

A macro lambda list can contain ++the lambda list keywords shown in Figure 3–18. ++

++
++
  &allow-other-keys  &environment  &rest   
++  &aux               &key          &whole  
++  &body              &optional             
++
++  Figure 3–18: Lambda List Keywords used by Macro Lambda Lists
++
++
++ ++

Optional parameters (introduced by &optional) and ++keyword parameters (introduced by &key) ++can be supplied in a macro lambda list, ++just as in an ordinary lambda list. ++Both may contain default initialization forms and supplied-p parameters. ++

++

&body ++ ++

++

is identical in function to &rest, ++but it can be used to inform certain output-formatting ++and editing functions that the remainder of the form is ++treated as a body, and should be indented accordingly. ++Only one of &body or &rest can be used at any particular level; ++see Destructuring by Lambda Lists. ++

++

&body can appear at any level of a ++macro lambda list; ++for details, see Destructuring by Lambda Lists. ++

++

&whole ++ ++

++

is followed by a single variable that is bound to the ++entire macro-call form; this is the value that the macro function ++receives as its first argument. ++

++

If &whole and a following variable appear, ++they must appear first in lambda-list, ++

++

before any other parameter or lambda list keyword. ++

++

&whole can appear at any level of a macro lambda list. ++At inner levels, the &whole variable is bound to ++ the corresponding part of the argument, ++as with &rest, but unlike &rest, other arguments are also allowed. ++The use of &whole does not affect the pattern of arguments ++ specified. ++

++

&environment ++ ++

++

is followed by a single variable that is bound ++to an environment representing the lexical environment in which the ++macro call is to be interpreted. ++This environment ++should be used with ++

++

macro-function, ++

++

get-setf-expansion, ++

++

compiler-macro-function, ++

++

and ++macroexpand ++(for example) in computing the expansion of the macro, to ensure that any ++lexical bindings or definitions established in the ++compilation environment are taken into account. ++

++

&environment can only appear at the top level of a ++ macro lambda list, and can only ++appear once, but can appear anywhere in that list; ++

++

the &environment parameter is bound along with &whole ++before any other variables in the lambda list, regardless of where ++&environment appears in the lambda list. ++

++

The object that is bound to the ++environment parameter has dynamic extent. ++

++

Destructuring allows a macro lambda list to express ++the structure of a macro call syntax. ++If no lambda list keywords appear, ++then the macro lambda list is a tree ++containing parameter names at the leaves. ++The pattern and the macro form must have compatible tree structure; ++that is, their tree structure must be equivalent, ++or it must differ only in that some leaves of the pattern ++match non-atomic objects of the macro form. ++

++

For information about error detection in this situation, ++see Destructuring Mismatch. ++

++

A destructuring lambda list ++(whether at top level or embedded) ++can ++be dotted, ending ++in a parameter name. This situation is treated exactly as if the ++parameter name that ends the list had appeared preceded by &rest. ++

++

It is permissible for a macro form (or a subexpression of a ++macro form) ++to be a dotted list ++only when (... &rest var) or (... . var) is used to match ++ it. It is the responsibility of the macro to recognize and deal ++ with such situations. ++

++

[Editorial Note by KMP: Apparently the dotted-macro-forms cleanup doesn’t allow for ++ the macro to ‘manually’ notice dotted forms and fix them as well. ++ It shouldn’t be required that this be done only by &REST or ++ a dotted pattern; it should only matter that ultimately the ++ non-macro result of a full-macro expansion not contain dots. ++ Anyway, I plan to address this editorially unless someone ++ raises an objection.] ++

++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Mentioning-Containing-Function-in-Condition-Reports.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Mentioning Containing Function in Condition Reports (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3.6 Mentioning Containing Function in Condition Reports

++ ++

The name of the containing function should generally not be mentioned in ++report messages. It is assumed that the debugger will make this ++information accessible in situations where it is necessary and appropriate. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Merging-Pathnames.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Merging Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.3 Merging Pathnames

++ ++

Merging takes a pathname with unfilled components ++and supplies values for those components from a source of defaults. ++

++

If a component’s value is nil, that component is considered to be unfilled. ++If a component’s value is any non-nil object, ++including :unspecific, that component is considered to be filled. ++

++

Except as explicitly specified otherwise, ++for functions that manipulate or inquire about files in the file system, ++the pathname argument to such a function ++is merged with *default-pathname-defaults* before accessing the file system ++(as if by merge-pathnames). ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Meta_002dObjects.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Meta-Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects  

++
++
++

7.4 Meta-Objects

++ ++ ++

The implementation of the object system manipulates classes, methods, ++and generic functions. The object system contains a set of ++generic functions defined by methods on classes; ++the behavior of those generic functions defines the behavior of ++the object system. The instances of the classes on which those ++methods are defined are called meta-objects. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Method-Selection-and-Combination.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Method Selection and Combination (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6 Method Selection and Combination

++ ++

When a generic function is called with particular arguments, it must ++determine the code to execute. This code is called the ++effective method ++ ++ for those arguments. ++The effective method is a ++combination of the applicable methods in the generic function ++that calls some or all of the methods. ++

++

If a generic function is called and no methods are ++applicable, the generic function no-applicable-method ++is invoked, with the results from that call being used as the ++results of the call to the original generic function. Calling ++no-applicable-method takes precedence over checking for acceptable ++keyword arguments; see Keyword Arguments in Generic Functions and Methods. ++

++

When the effective method has been determined, ++it is invoked with the same arguments as were passed to the generic function. ++Whatever values it returns are returned as the values ++of the generic function. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Minimal-Compilation.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++Minimal Compilation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.2.6 Minimal Compilation

++ ++

Minimal compilation is defined as follows: ++

++
++
*
++

All compiler macro ++ ++ calls appearing in the ++source code being compiled are expanded, if at all, at compile time; ++they will not be expanded at run time. ++

++
++
*
++

All macro ++ ++ and ++symbol macro ++ ++ calls ++appearing in the source code being compiled are expanded at compile time ++in such a way that they will not be expanded again at run time. ++macrolet ++ ++

++

and ++symbol-macrolet ++ ++

++

are effectively replaced by ++forms corresponding to their bodies in which calls to ++macros are replaced by their expansions. ++

++
++
*
++

The first argument in a load-time-value ++ ++

++

form ++in source code processed by compile ++ ++

++

is evaluated at compile time; ++in source code processed by compile-file ++ ++, ++the compiler arranges for it to be evaluated at load time. ++In either case, the result of the evaluation ++is remembered and used later as the value of the ++load-time-value form at execution time. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Minimal-Declaration-Processing-Requirements.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++Minimal Declaration Processing Requirements (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Declarations  

++
++
++

3.3.1 Minimal Declaration Processing Requirements

++ ++

In general, an implementation is free to ignore ++declaration specifiers except for the ++ declaration ++ ++, ++ notinline ++ ++, ++ safety ++ ++, ++ and special ++ ++ declaration specifiers. ++

++

A declaration declaration must suppress warnings ++about unrecognized declarations of the kind that it declares. ++If an implementation does not produce warnings about ++unrecognized declarations, it may safely ignore this declaration. ++

++

A notinline declaration must be recognized by any implementation ++that supports inline functions or compiler macros in order to disable those facilities. ++An implementation that does not use inline functions or compiler macros ++may safely ignore this declaration. ++

++

A safety declaration that increases the current safety level ++must always be recognized. An implementation that always processes ++code as if safety were high may safely ignore this declaration. ++

++

A special declaration must be processed by all implementations. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Miscellaneous-Clauses.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Miscellaneous Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.7 Miscellaneous Clauses

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Missing-and-Additional-FORMAT-Arguments.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Missing and Additional FORMAT Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.10.2 Missing and Additional FORMAT Arguments

++ ++

The consequences are undefined if no arg remains for a directive ++requiring an argument. However, it is permissible for one or more args ++to remain unprocessed by a directive; such args are ignored. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Modification-of-Literal-Objects.html +@@ -0,0 +1,142 @@ ++ ++ ++ ++ ++ ++Modification of Literal Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.7.1 Modification of Literal Objects

++ ++

The consequences are undefined if literal objects ++are destructively modified. For this purpose, the following operations ++are considered destructive: ++

++
++
random-state
++

Using it as an argument to the function random. ++

++
++
cons
++

Changing the car_1 or cdr_1 of the cons, ++or performing a destructive operation on an object which is either ++the car_2 or the cdr_2 of the cons. ++

++
++
array
++

Storing a new value into some element of the array, ++or performing a destructive operation ++on an object that is already such an element. ++

++

Changing the fill pointer, dimensions, or displacement of ++the array (regardless of whether the array is actually adjustable). ++

++

Performing a destructive operation on another array ++that is displaced to the array or that otherwise shares its contents ++with the array. ++

++
++
hash-table
++

Performing a destructive operation on any key. ++

++

Storing a new value_4 for any key, ++or performing a destructive operation ++on any object that is such a value. ++

++

Adding or removing entries from the hash table. ++

++
++
structure-object
++

Storing a new value into any slot, ++or performing a destructive operation on an object ++that is the value of some slot. ++

++
++
standard-object
++

Storing a new value into any slot, ++or performing a destructive operation on an object ++that is the value of some slot. ++

++

Changing the class of the object (e.g., using the function change-class). ++

++
++
readtable
++

Altering the readtable case. ++

++

Altering the syntax type of any character in this readtable. ++

++

Altering the reader macro function associated with any character ++in the readtable, or altering the reader macro functions ++associated with characters defined as dispatching macro characters ++in the readtable. ++

++
++
stream
++

Performing I/O operations on the stream, ++or closing the stream. ++

++
++
All other standardized types
++

[This category includes, for example, character, ++ condition, ++ function, ++ method-combination, ++ method, ++ number, ++ package, ++ pathname, ++ restart, ++ and symbol.] ++

++

There are no standardized destructive operations ++defined on objects of these types. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Modified-BNF-Syntax.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Modified BNF Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.2 Modified BNF Syntax

++ ++ ++ ++

This specification uses an extended Backus Normal Form (BNF) to ++describe the syntax of Common Lisp macro forms and special forms. ++This section discusses the syntax of BNF expressions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Modifying-Hash-Table-Keys.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Modifying Hash Table Keys (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Hash Table Concepts  

++
++
++

18.1.2 Modifying Hash Table Keys

++ ++

The function supplied as the :test argument to make-hash-table ++specifies the ‘equivalence test’ for the hash table it creates. ++

++

An object is ‘visibly modified’ with regard to an equivalence test ++if there exists some set of objects (or potential objects) ++which are equivalent to the object before the modification but are ++no longer equivalent afterwards. ++

++

If an object O_1 is used as a key in a hash table H ++and is then visibly modified with regard to the equivalence test of H, ++then the consequences are unspecified if O_1, or any object ++O_2 equivalent to O_1 under the equivalence test (either before ++or after the modification), is used as a key in further operations on H. ++The consequences of using O_1 as a key are unspecified ++even if O_1 is visibly modified ++and then later modified again in such a way as ++to undo the visible modification. ++

++

Following are specifications of the modifications which are visible to the ++equivalence tests which must be supported by hash tables. The modifications ++are described in terms of modification of components, and are defined ++recursively. Visible modifications of components of the object are ++visible modifications of the object. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Hash Table Concepts  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Modifying-the-Structure-of-Instances.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Modifying the Structure of Instances (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.6.1 Modifying the Structure of Instances

++ ++

[Reviewer Note by Barmar: What about shared slots that are deleted?] ++

++

The first step modifies the structure of instances of the redefined ++class to conform to its new class definition. ++Local slots specified ++by the new class definition that are not specified as either local or ++shared by the old class are added, and slots ++not specified as either ++local or shared by the new class definition that are specified as ++local by the old class are discarded. ++The names of these added and discarded ++slots are passed as arguments ++to update-instance-for-redefined-class ++as described in the next section. ++

++

The values of local slots specified by both the new and old ++classes are retained. If such a local slot was unbound, ++it remains unbound. ++

++

The value of a slot that is specified as shared in the old ++class and as local in the new class is retained. If such ++a shared slot was unbound, the local slot is unbound. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Modifying-the-Structure-of-the-Instance.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Modifying the Structure of the Instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.2.1 Modifying the Structure of the Instance

++ ++

In order to make the instance conform to the class C_{to}, local slots specified by the class C_{to} that are not specified by the class C_{from} are added, and local slots not specified by ++the class C_{to} that are specified by the ++class C_{from} are discarded. ++

++

The values of local slots specified by both the class C_{to} and the class C_{from} are retained. If such a local slot was unbound, it remains ++unbound. ++

++

The values of slots specified as shared in the class C_{from} and as local in the class C_{to} are retained. ++

++

This first step of the update does not affect the values of any ++shared slots. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Multidimensional-Arrays.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Multidimensional Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.1.1.7 Multidimensional Arrays

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Multiple-Escape-Characters.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Multiple Escape Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.5 Multiple Escape Characters

++ ++

A pair of multiple escape ++ ++ characters ++is used to indicate that an enclosed sequence of characters, ++including possible macro characters and whitespace_2 characters, ++are to be treated as alphabetic_2 characters ++with case preserved. ++Any single escape and multiple escape characters ++that are to appear in the sequence must be preceded by a single escape ++character. ++

++

Vertical-bar is a multiple escape character ++in standard syntax. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Multiple-Possible-Textual-Representations.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++Multiple Possible Textual Representations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.1.1 Multiple Possible Textual Representations

++ ++

Most objects have more than one possible textual representation. ++For example, the positive integer with a magnitude of twenty-seven ++can be textually expressed in any of these ways: ++

++
++
 27    27.    #o33    #x1B    #b11011    #.(* 3 3 3)    81/3
++
++ ++

A list containing the two symbols A and B can also be textually ++expressed in a variety of ways: ++

++
++
 (A B)    (a b)    (  a  b )    (\A |B|) 
++(|\A|
++  B
++)
++
++ ++

In general, ++

++

from the point of view of the Lisp reader, ++

++

wherever whitespace is permissible in a textual representation, ++any number of spaces and newlines can appear in standard syntax. ++

++

When a function such as print produces a printed representation, ++it must choose ++from among many possible textual representations. ++In most cases, it chooses a ++program readable representation, ++but in certain cases it might use a more compact notation that is not ++program-readable. ++

++

A number of option variables, called ++printer control variables ++ ++, ++are provided to permit control of individual aspects of the ++printed representation of objects. ++Figure 22–1 shows the standardized printer control variables; ++there might also be implementation-defined printer control variables. ++

++
++
  *print-array*   *print-gensym*       *print-pprint-dispatch*  
++  *print-base*    *print-length*       *print-pretty*           
++  *print-case*    *print-level*        *print-radix*            
++  *print-circle*  *print-lines*        *print-readably*         
++  *print-escape*  *print-miser-width*  *print-right-margin*     
++
++       Figure 22–1: Standardized Printer Control Variables     
++
++
++ ++

In addition to the printer control variables, ++the following additional defined names ++relate to or affect the behavior of the Lisp printer: ++

++
++
  *package*                    *read-eval*  readtable-case  
++  *read-default-float-format*  *readtable*                  
++
++   Figure 22–2: Additional Influences on the Lisp printer. 
++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/NIL-as-a-Component-Value.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++NIL as a Component Value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.7 NIL as a Component Value

++ ++

As a pathname component value, ++nil represents that the component is “unfilled”; ++see Merging Pathnames. ++

++

The value of any pathname component can be nil. ++

++

When constructing a pathname, ++nil in the host component might mean a default host ++rather than an actual nil in some implementations. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/NIL.html +@@ -0,0 +1,110 @@ ++ ++ ++ ++ ++ ++NIL (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.11 NIL

++ ++ ++ ++ ++ ++ ++ ++

nil has a variety of meanings. ++It is a symbol in the COMMON-LISP package with the name "NIL", ++it is boolean (and generalized boolean) false, ++it is the empty list, ++and it is the name of the empty type (a subtype of all types). ++

++

Within Common Lisp, nil can be notated interchangeably as either NIL or (). ++By convention, the choice of notation offers a hint as to which of its many ++roles it is playing. ++

++
++
  For Evaluation?  Notation  Typically Implied Role       
++  ________________________________________________________
++  Yes              nil       use as a boolean.            
++  Yes              'nil      use as a symbol.             
++  Yes              '()       use as an empty list         
++  No               nil       use as a symbol or boolean.  
++  No               ()        use as an empty list.        
++
++               Figure 1–1: Notations for NIL             
++
++
++ ++

Within this document only, nil is also sometimes notated as false to ++emphasize its role as a boolean. ++

++

For example: ++

++
++
 (print ())                          ;avoided
++ (defun three nil 3)                 ;avoided 
++ '(nil nil)                          ;list of two symbols
++ '(() ())                            ;list of empty lists
++ (defun three () 3)                  ;Emphasize empty parameter list.
++ (append '() '()) ⇒  ()              ;Emphasize use of empty lists
++ (not nil) ⇒  true                   ;Emphasize use as Boolean false
++ (get 'nil 'color)                   ;Emphasize use as a symbol
++
++ ++

A function is sometimes said to “be false” or “be true” ++in some circumstance. ++Since no function object can be the same as nil ++and all function objects represent true when viewed as booleans, ++it would be meaningless to say that the function was literally false ++and uninteresting to say that it was literally true. ++Instead, these phrases are just traditional alternative ways of saying that the ++function “returns false” or “returns true,” respectively. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Namestrings-as-Filenames.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Namestrings as Filenames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.1.1 Namestrings as Filenames

++ ++

A namestring ++ ++ is a string that represents a filename. ++

++

In general, the syntax of namestrings involves the use of ++implementation-defined conventions, ++usually those customary for the file system in which the named file resides. ++The only exception is the syntax of a logical pathname namestring, ++which is defined in this specification; see Syntax of Logical Pathname Namestrings. ++

++

A conforming program must never unconditionally use a ++literal namestring other than a logical pathname namestring ++because Common Lisp does not define any namestring syntax ++other than that for logical pathnames ++that would be guaranteed to be portable. ++However, a conforming program can, if it is careful, ++successfully manipulate user-supplied data ++which contains or refers to non-portable namestrings. ++

++

A namestring can be coerced to a pathname by the functions pathname ++or parse-namestring. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Naming-Conventions-for-Rest-Parameters.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Naming Conventions for Rest Parameters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.26 Naming Conventions for Rest Parameters

++ ++

Within this specification, ++if the name of a rest parameter is chosen to be a plural noun, ++use of that name in parameter font refers ++to the list to which the rest parameter is bound. ++Use of the singular form of that name in parameter font refers ++to an element of that list. ++

++

For example, given a syntax description such as: ++

++

F &rest arguments ++

++

it is appropriate to refer either to the rest parameter named ++arguments by name, or to one of its elements by speaking of “an argument,” ++“some argument,” “each argumentetc. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Naming-of-Compiler-Macros.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Naming of Compiler Macros (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.2.3 Naming of Compiler Macros

++ ++

Compiler macros may be defined for function names that name ++macros as well as functions. ++

++

Compiler macro definitions are strictly global. There is no provision ++for defining local compiler macros in the way that macrolet ++defines local macros. Lexical bindings of a function name shadow any ++compiler macro definition associated with the name as well as its ++global function or macro definition. ++

++

Note that the presence of a compiler macro definition does not affect ++the values returned by ++

++

functions that access function definitions (e.g., fboundp) ++or macro definitions (e.g., macroexpand). ++Compiler macros are global, and the function ++compiler-macro-function is sufficient to resolve their interaction ++with other lexical and global definitions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Nesting-of-FORMAT-Operations.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Nesting of FORMAT Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.10.1 Nesting of FORMAT Operations

++ ++

The case-conversion, conditional, iteration, and justification ++constructs can contain other formatting constructs by bracketing them. ++These constructs must nest properly with respect to each other. ++For example, it is not legitimate to put the start of a case-conversion ++construct in each arm of a conditional and the ++end of the case-conversion construct outside the conditional: ++

++
++
 (format nil "~:[abc~:@(def~;ghi~
++:@(jkl~]mno~)" x) ;Invalid!
++
++ ++

This notation is invalid because the ~[...~;...~] ++and ~(...~) constructs are not properly nested. ++

++

The processing indirection caused by the ~? directive ++is also a kind of nesting for the purposes of this rule of proper nesting. ++It is not permitted to ++start a bracketing construct within a string processed ++under control of a ~? ++directive and end the construct at some point after the ~? construct ++in the string containing that construct, or vice versa. ++For example, this situation is invalid: ++

++
++
 (format nil "~@?ghi~)" "abc~@(def") ;Invalid!
++
++ ++

This notation ++is invalid because the ~? ++and ~(...~) constructs are not properly nested. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/No-Arguments-or-Values-in-The-_0022Syntax_0022-Section.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++No Arguments or Values in The "Syntax" Section (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.29 No Arguments or Values in The "Syntax" Section

++ ++

If no arguments are permitted, or no values are returned, ++a special notation is used to make this more visually apparent. For example, ++

++

F <no arguments><no values> ++

++

indicates that F is an operator that accepts no arguments and returns ++no values. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Nonsense-Words.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Nonsense Words (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Notational Conventions  

++
++
++

1.4.1.13 Nonsense Words

++ ++ ++ ++ ++ ++ ++ ++ ++ ++

When a word having no pre-attached semantics is required (e.g., in an ++example), it is common in the Lisp community to use one of the words ++“foo,” “bar,” “baz,” and “quux.” For example, in ++

++
++
 (defun foo (x) (+ x 1))
++
++ ++

the use of the name foo is just a shorthand way of saying ++“please substitute your favorite name here.” ++

++

These nonsense words have gained such prevalance of usage, that it is ++commonplace for newcomers to the community to begin to wonder if there ++is an attached semantics which they are overlooking—there is not. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notational-Conventions.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++Notational Conventions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Definitions  

++
++
++

1.4.1 Notational Conventions

++ ++ ++ ++

The following notational conventions are used throughout this document. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Note-about-Printing-Numbers.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Note about Printing Numbers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.6 Note about Printing Numbers

++ ++

The printed representation of a number must not contain escape characters; ++see Escape Characters and Potential Numbers. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Note-about-Tabs-in-Condition-Reports.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Note about Tabs in Condition Reports (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3.5 Note about Tabs in Condition Reports

++ ++

Because the indentation of a report message might be shifted to the right or ++left by an arbitrary amount, special care should be taken with the ++semi-standard character <Tab> ++(in those implementations that support such a character). ++Unless the implementation specifically defines its behavior ++in this context, its use should be avoided. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-Backquote.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++Notes about Backquote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Backquote  

++
++
++

2.4.6.1 Notes about Backquote

++ ++

Since the exact manner in which the Lisp reader will parse ++an expression involving the backquote reader macro ++is not specified, an implementation is free to choose any ++representation that preserves the semantics described. ++

++

Often an implementation will choose a representation that facilitates ++pretty printing of the expression, so that (pprint `(a ,b)) will display ++`(a ,b) and not, for example, (list 'a b). However, this is not a ++requirement. ++

++

Implementors who have no particular reason to make one choice or another ++might wish to refer to IEEE Standard for the Scheme Programming Language, which identifies a popular choice of ++representation for such expressions that might provide useful to be useful ++compatibility for some user communities. There is no requirement, however, ++that any conforming implementation use this particular representation. ++This information is provided merely for cross-reference purposes. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-FORMAT.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Notes about FORMAT (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Formatted Output  

++
++
++

22.3.12 Notes about FORMAT

++ ++

Formatted output is performed not only by format, ++but by certain other functions that accept a format control ++the way format does. For example, error-signaling functions ++such as cerror accept format controls. ++

++

Note that the meaning of nil and t as destinations to format ++are different than those of nil and t as stream designators. ++

++

The ~^ should appear only at the beginning of a ~< clause, ++because it aborts the entire clause in which it appears (as well as ++all following clauses). ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-Loop.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Notes about Loop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.9 Notes about Loop

++ ++

Types can be supplied for loop variables. ++It is not necessary to supply a type for any variable, ++but supplying the type ++can ensure that the variable has a correctly typed initial value, ++and it can also enable compiler optimizations ++(depending on the implementation). ++

++

The clause repeat n ... is roughly equivalent to a clause such as ++

++
++
 (loop for internal-variable downfrom (- n 1) to 0 ...)
++
++ ++

but in some implementations, ++the repeat construct might be more efficient. ++

++

Within the executable parts of the loop clauses and around the entire ++loop form, variables can be bound by using let. ++

++

Use caution when using a variable named IT (in any package) ++in connection with loop, since it is a loop keyword ++that can be used in place of a form in certain contexts. ++

++

There is ++

++

no ++

++

standardized ++mechanism for users to add ++extensions to loop. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-Style-for-Semicolon.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Notes about Style for Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Semicolon  

++
++
++

2.4.4.2 Notes about Style for Semicolon

++ ++

Some text editors make assumptions about desired indentation based on ++the number of semicolons that begin a comment. The following style ++conventions are common, although not by any means universal. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-Style-for-Sharpsign-Vertical_002dBar.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Notes about Style for Sharpsign Vertical-Bar (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8.22 Notes about Style for Sharpsign Vertical-Bar

++ ++

Some text editors that purport to understand Lisp syntax treat any |...| ++as balanced pairs that cannot nest (as if they were just balanced pairs of ++the multiple escapes used in notating certain symbols). To compensate for ++this deficiency, some programmers use the notation #||...#||...||#...||# ++instead of #|...#|...|#...|#. Note that this alternate usage is not ++a different reader macro; it merely exploits the fact that the additional ++vertical-bars occur within the comment in a way that tricks certain text editor ++into better supporting nested comments. As such, one might sometimes see code ++like: ++

++
++
 #|| (+ #|| 3 ||# 4 5) ||# 
++
++ ++

Such code is equivalent to: ++

++
++
 #| (+ #| 3 |# 4 5) |#
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-The-KEYWORD-Package.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Notes about The KEYWORD Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.8 Notes about The KEYWORD Package

++ ++

It is generally best to confine the use of keywords to situations in which ++there are a finitely enumerable set of names to be selected between. For example, ++if there were two states of a light switch, they might be called :on and :off. ++

++

In situations where the set of names is not finitely enumerable ++(i.e., where name conflicts might arise) ++it is frequently best to use symbols in some package ++other than KEYWORD so that conflicts will be naturally avoided. ++For example, it is generally not wise for a program to use a keyword_1 ++as a property indicator, since if there were ever another program ++that did the same thing, each would clobber the other’s data. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-the-Condition-System_0060s-Background.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Notes about the Condition System`s Background (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Condition System Concepts  

++
++
++

9.1.6 Notes about the Condition System‘s Background

++ ++

For a background reference to the abstract concepts detailed in this ++section, see Exceptional Situations in Lisp. The details of that paper are not binding on ++this document, but may be helpful in establishing a conceptual basis for ++understanding this material. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-the-Implementation-of-Compiler-Macros.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++Notes about the Implementation of Compiler Macros (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.2.5 Notes about the Implementation of Compiler Macros

++ ++

Although it is technically permissible, as described above, ++for eval to treat compiler macros in the same situations ++as compiler might, this is not necessarily a good idea in ++interpreted implementations. ++

++

Compiler macros exist for the purpose of trading compile-time speed ++for run-time speed. Programmers who write compiler macros tend to ++assume that the compiler macros can take more time than normal functions ++and macros in order to produce code which is especially optimal for use ++at run time. Since eval in an interpreted implementation ++might perform semantic analysis of the same form multiple times, it might be ++inefficient in general for the implementation to choose to call ++compiler macros on every such evaluation. ++

++

Nevertheless, the decision about what to do in these situations is left to ++each implementation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-the-Pathname-Version-Component.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Notes about the Pathname Version Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.20 Notes about the Pathname Version Component

++ ++

It is suggested, but not required, that implementations do the following: ++

++
++
*
++

Use positive integers starting at 1 as version numbers. ++

++
++
*
++

Recognize the symbol :oldest ++ to designate the smallest existing version number. ++

++
++
*
++

Use keywords for other special versions. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Notes-about-the-Pretty-Printer_0060s-Background.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Notes about the Pretty Printer`s Background (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.3 Notes about the Pretty Printer‘s Background

++ ++

For a background reference to the abstract concepts detailed in this ++section, see XP: A Common Lisp Pretty Printing System. The details of that paper are not binding on ++this document, but may be helpful in establishing a conceptual basis for ++understanding this material. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Null-Strings-as-Components-of-a-Logical-Pathname.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Null Strings as Components of a Logical Pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.2.2 Null Strings as Components of a Logical Pathname

++ ++

The null string, "", is not a valid value for any component of a logical pathname. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Number-Concepts.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Number Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers (Numbers)  

++
++
++

12.1 Number Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Numbers-Dictionary.html +@@ -0,0 +1,228 @@ ++ ++ ++ ++ ++ ++Numbers Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Numbers (Numbers)  

++
++
++

12.2 Numbers Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Numbers (Numbers)  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Numbers-_0028Numbers_0029.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Numbers (Numbers) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

12 Numbers

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Numbers-_0028Objects-with-Multiple-Notations_0029.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Numbers (Objects with Multiple Notations) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.9 Numbers

++ ++

Although Common Lisp provides a variety of ways for programs to manipulate the ++input and output radix for rational numbers, all numbers in this document ++are in decimal notation unless explicitly noted otherwise. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Numbers-as-Tokens.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++Numbers as Tokens (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.1 Numbers as Tokens

++ ++

When a token is read, ++it is interpreted as a number or symbol. ++The token is interpreted as a number if it satisfies ++the syntax for numbers specified in Figure 2–9. ++

++
++
 numeric-token ::= !integer | !ratio | !float                                              
++ integer       ::= [sign] {decimal-digit}^+ decimal-point | [sign] {digit}^+               
++ ratio         ::= [sign] {digit}^+ slash {digit}^+                                        
++ float         ::= [sign] {decimal-digit}* decimal-point {decimal-digit}^+ [!exponent]   
++                   | [sign] {decimal-digit}^+ [decimal-point {decimal-digit}*] !exponent 
++ exponent      ::= exponent-marker [sign] {digit}^+                                        
++ sign—a sign.
++ slash—a slash
++ decimal-point—a dot.
++ exponent-marker—an exponent marker.
++ decimal-digit—a digit in radix 10.
++ digit—a digit in the current input radix.
++
++ ++

  Figure 2–9: Syntax for Numeric Tokens ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Numeric-Characters.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Numeric Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.8 Numeric Characters

++ ++

The numeric characters are ++a subset of the graphic characters. ++Of the standard characters, only these are numeric characters: ++

++

0 1 2 3 4 5 6 7 8 9 ++

++

For each implementation-defined graphic character ++that has no case, the implementation must define whether ++or not it is a numeric character. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Numeric-Operations.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++Numeric Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1 Numeric Operations

++ ++

Common Lisp provides a large variety of operations related to numbers. ++This section provides an overview of those operations by grouping them ++into categories that emphasize some of the relationships among them. ++

++

Figure 12–1 shows operators relating to ++arithmetic operations. ++

++
++
  *  1+         gcd   
++  +  1-         incf  
++  -  conjugate  lcm   
++  /  decf             
++
++  Figure 12–1: Operators relating to Arithmetic.
++
++
++ ++

Figure 12–2 shows defined names relating to ++exponential, logarithmic, and trigonometric operations. ++

++
++
  abs    cos    signum  
++  acos   cosh   sin     
++  acosh  exp    sinh    
++  asin   expt   sqrt    
++  asinh  isqrt  tan     
++  atan   log    tanh    
++  atanh  phase          
++  cis    pi             
++
++  Figure 12–2: Defined names relating to Exponentials, Logarithms, and Trigonometry.
++
++
++ ++

Figure 12–3 shows operators relating to ++numeric comparison and predication. ++

++
++
  /=  >=      oddp   
++  <   evenp   plusp  
++  <=  max     zerop  
++  =   min            
++  >   minusp         
++
++  Figure 12–3: Operators for numeric comparison and predication.
++
++
++ ++

Figure 12–4 shows defined names relating to ++numeric type manipulation and coercion. ++

++
++
  ceiling          float-radix           rational     
++  complex          float-sign            rationalize  
++  decode-float     floor                 realpart     
++  denominator      fround                rem          
++  fceiling         ftruncate             round        
++  ffloor           imagpart              scale-float  
++  float            integer-decode-float  truncate     
++  float-digits     mod                                
++  float-precision  numerator                          
++
++  Figure 12–4: Defined names relating to numeric type manipulation and coercion.
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Object-Creation-and-Initialization.html +@@ -0,0 +1,149 @@ ++ ++ ++ ++ ++ ++Object Creation and Initialization (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects  

++
++
++

7.1 Object Creation and Initialization

++ ++ ++

The generic function make-instance creates and returns a new ++instance of a class. The first argument is a class or ++the name of a class, and the remaining arguments form an ++initialization argument list ++ ++. ++

++

The initialization of a new instance consists of several distinct ++steps, including the following: combining the explicitly supplied initialization ++arguments with default values for the unsupplied initialization arguments, ++checking the validity of the initialization arguments, allocating storage ++for the instance, filling slots with ++values, and executing user-supplied methods that perform additional ++initialization. Each step of make-instance is implemented by a ++generic function to provide a mechanism for customizing that step. ++In addition, make-instance is itself a generic function ++and thus also can be customized. ++

++

The object system specifies system-supplied primary methods for each step ++and thus specifies a well-defined standard behavior for the entire ++initialization process. The standard behavior provides four simple ++mechanisms for controlling initialization: ++

++
++
*
++

Declaring a symbol to be an initialization argument ++for a slot. An initialization argument is declared by using the ++:initarg slot option to defclass. This provides a mechanism ++for supplying a value for a slot in a call to make-instance. ++

++
++
*
++

Supplying a default value form for an initialization argument. ++Default value forms for initialization arguments are defined by using the ++:default-initargs class option to defclass. If an ++initialization argument is not explicitly provided ++as an argument to make-instance, the default value form is ++evaluated in the lexical environment of the defclass form that ++defined it, and the resulting value is used as the value of the ++initialization argument. ++

++
++
*
++

Supplying a default initial value form for a slot. ++A default initial value form for a slot is defined by using the ++:initform slot option to defclass. If no initialization ++argument associated with that slot is given as an argument to ++make-instance or is defaulted by :default-initargs, this ++default initial value form is evaluated in the lexical environment of ++the defclass form that defined it, and the resulting value is ++stored in the slot. The :initform form for a ++local slot may be used when creating an instance, when ++updating an instance to conform to a redefined class, ++or when updating an instance to conform to the definition of a ++different class. The :initform form for a ++shared slot may be used when defining or re-defining the class. ++

++
++
*
++

Defining methods for initialize-instance and ++shared-initialize. The slot-filling behavior described above is ++implemented by a system-supplied primary method for ++initialize-instance which invokes shared-initialize. The ++generic function shared-initialize implements the parts of ++initialization shared by these four situations: when making an instance, ++when re-initializing an instance, when updating an instance ++to conform to a redefined class, and when updating an instance ++to conform to the definition of a different class. The system-supplied ++primary method for shared-initialize directly implements the ++slot-filling behavior described above, and initialize-instance ++simply invokes shared-initialize. ++

++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Objects  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Objects-Dictionary.html +@@ -0,0 +1,142 @@ ++ ++ ++ ++ ++ ++Objects Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Objects  

++
++
++

7.7 Objects Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Objects  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Objects-with-Multiple-Notations.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Objects with Multiple Notations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Notational Conventions  

++
++
++

1.4.1.7 Objects with Multiple Notations

++ ++

Some objects in Common Lisp can be notated in more than one way. ++In such situations, the choice of which notation to use is technically arbitrary, ++but conventions may exist which convey a “point of view” or “sense of intent.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Objects.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

7 Objects

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Odd-Number-of-Keyword-Arguments.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Odd Number of Keyword Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.7 Odd Number of Keyword Arguments

++ ++

An odd number of arguments must not be supplied for the keyword parameters. ++

++

If this situation occurs in a safe call, ++

++

an error of type program-error must be signaled ++unless keyword argument checking is suppressed as described ++in Suppressing Keyword Argument Checking; ++and in an unsafe call the situation has undefined consequences. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Open-and-Closed-Streams.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Open and Closed Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Introduction to Streams  

++
++
++

21.1.1.3 Open and Closed Streams

++ ++

Streams are either open ++ ++ or closed ++ ++. ++

++

Except as explicitly specified otherwise, ++operations that create and return streams return open streams. ++

++

The action of closing a stream marks the end of its use as a source ++or sink of data, permitting the implementation to reclaim its internal data ++structures, and to free any external resources which might have been locked by the ++stream when it was opened. ++

++

Except as explicitly specified otherwise, ++the consequences are undefined when a closed stream ++is used where a stream is called for. ++

++

Coercion of streams to pathnames ++is permissible for closed streams; ++in some situations, such as for a truename computation, ++the result might be different for an open stream ++and for that same stream once it has been closed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Order-of-Execution.html +@@ -0,0 +1,122 @@ ++ ++ ++ ++ ++ ++Order of Execution (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.14 Order of Execution

++ ++ ++ ++ ++ ++

With the exceptions listed below, clauses are executed in the loop body ++ in the order in which they appear in the source. Execution is repeated ++ until a clause ++ terminates the loop or until a return, go, ++ or throw form is encountered ++which transfers control to a point outside of the loop. ++ The following actions are ++ exceptions to the linear order of execution: ++

++
++
*
++

All variables are initialized first, ++ regardless of where the establishing clauses appear in the ++ source. The order of initialization follows the order of these clauses. ++

++
++
*
++

The code for any initially clauses is collected ++ into one progn in the order in which the clauses appear in ++ the source. The collected code is executed once in the loop prologue ++ after any implicit variable initializations. ++

++
++
*
++

The code for any finally clauses is collected ++ into one progn in the order in which the clauses appear in ++ the source. The collected code is executed once in the loop epilogue ++ before any implicit values from the accumulation clauses are returned. ++ Explicit returns anywhere in the source, however, will exit the ++ loop without executing the epilogue code. ++

++
++
*
++

A with clause introduces a variable binding ++ and an optional initial value. The initial values are calculated ++ in the order in which the with clauses occur. ++

++
++
*
++

Iteration control clauses implicitly perform the following actions: ++

++
++
++

initialize variables; ++

++
++
++

step variables, generally ++between each execution of the loop body; ++

++
++
++

perform termination tests, ++generally just before the execution of the ++ loop body. ++

++
++
++ ++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Ordering-of-Characters.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++Ordering of Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.6 Ordering of Characters

++ ++

The total ordering on characters is guaranteed to have ++the following properties: ++

++
++
*
++

If two characters have the same implementation-defined attributes, ++then their ordering by char< is consistent with the numerical ++ordering by the predicate < on their code attributes. ++

++
++
*
++

If two characters differ in any attribute, then they ++are not char=. ++

++

[Reviewer Note by Barmar: I wonder if we should say that the ordering may be dependent on the ++ implementation-defined attributes.] ++

++
++
*
++

The total ordering is not necessarily the same as the total ordering ++ on the integers produced by applying char-int to the ++ characters. ++

++
++
*
++

While alphabetic_1 standard characters of a given case ++ must ++ obey a partial ordering, ++ they need not be contiguous; it is permissible for ++ uppercase and lowercase characters to be interleaved. ++ Thus (char<= #\a x #\z) ++ is not a valid way of determining whether or not x is a ++ lowercase character. ++

++
++
++ ++

Of the standard characters, ++those which are alphanumeric obey the following partial ordering: ++

++
++
 A<B<C<D<E<F<G<H<I<J<K<L<M<N<O<P<Q<R<S<T<U<V<W<X<Y<Z
++ a<b<c<d<e<f<g<h<i<j<k<l<m<n<o<p<q<r<s<t<u<v<w<x<y<z
++ 0<1<2<3<4<5<6<7<8<9
++ either 9<A or Z<0
++ either 9<a or z<0                                                      
++
++ ++

This implies that, for standard characters, alphabetic_1 ++ordering holds within each case (uppercase and lowercase), ++and that the numeric characters as a group are not interleaved ++with alphabetic characters. ++However, the ordering or possible interleaving of uppercase characters ++and lowercase characters is implementation-defined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Ordinary-Lambda-Lists.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++Ordinary Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Lambda Lists  

++
++
++

3.4.1 Ordinary Lambda Lists

++ ++

An ordinary lambda list ++ ++ is used to describe how a set of ++arguments is received by an ordinary function. ++The defined names in Figure 3–12 are those which use ++ordinary lambda lists: ++

++
++
  define-method-combination  handler-case  restart-case  
++  defun                      labels                      
++  flet                       lambda                      
++
++  Figure 3–12: Standardized Operators that use Ordinary Lambda Lists
++
++
++ ++

An ordinary lambda list can contain the lambda list keywords shown ++in Figure 3–13. ++

++
++
  &allow-other-keys  &key       &rest  
++  &aux               &optional         
++
++  Figure 3–13: Lambda List Keywords used by Ordinary Lambda Lists
++
++
++ ++

Each element of a lambda list is either a parameter specifier ++or a lambda list keyword. ++Implementations are free to provide additional lambda list keywords. ++For a list of all lambda list keywords ++used by the implementation, see lambda-list-keywords. ++

++

The syntax for ordinary lambda lists is as follows: ++

++

lambda-list ::=({var}* ++                 [&optional {var |         (var [init-form [supplied-p-parameter ]])}*] ++                 [&rest var] ++                 [&key {var |              ({var |          (keyword-name var)}    [init-form [supplied-p-parameter]])}* pt [&allow-other-keys]] ++                 [&aux {var | (var [init-form])}*]) ++                ++

++

A var or supplied-p-parameter must be a symbol ++that is not the name of a constant variable. ++

++

An init-form can be any form. ++Whenever any init-form is evaluated for any parameter ++specifier, that form may refer to any parameter variable to ++the left of the specifier in which the init-form appears, ++including any supplied-p-parameter variables, and may rely ++on the fact that no other parameter variable has yet been bound ++(including its own parameter variable). ++

++

A keyword-name can be any symbol, ++but by convention is normally a keyword_1; ++all standardized functions follow that convention. ++

++

An ordinary lambda list has five parts, any or all of which may be empty. ++For information about the treatment of argument mismatches, ++see Error Checking in Function Calls. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Lambda Lists  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Organization-of-the-Document.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++Organization of the Document (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.2 Organization of the Document

++ ++ ++

This is a reference document, not a tutorial document. Where possible ++and convenient, the order of presentation has been chosen so that the ++more primitive topics precede those that build upon them; however, ++linear readability has not been a priority. ++

++

This document is divided into chapters by topic. ++Any given chapter might contain conceptual material, dictionary entries, or both. ++

++

Defined names within the dictionary portion of a chapter are ++grouped in a way that brings related topics into physical proximity. ++Many such groupings were possible, ++and no deep significance should be inferred from the particular grouping that was chosen. ++To see defined names grouped alphabetically, consult the index. ++For a complete list of defined names, see Symbols in the COMMON-LISP Package. ++

++

In order to compensate for the sometimes-unordered portions of this document, ++a glossary has been provided; see Glossary. ++The glossary provides connectivity by providing easy access to ++definitions of terms, and in some cases by providing examples or ++cross references to additional conceptual material. ++

++

For information about notational conventions used in this document, ++see Definitions. ++

++

For information about conformance, see Conformance. ++

++

For information about extensions and subsets, see Language Extensions ++and Language Subsets. ++

++

For information about how programs in the language are parsed by the ++Lisp reader, see Syntax. ++

++

For information about how programs in the language are compiled ++and executed, see Evaluation and Compilation. ++

++

For information about data types, see Types and Classes. ++Not all types and classes are defined in this chapter; ++many are defined in chapter corresponding to their topic–for example, ++the numeric types are defined in Numbers (Numbers). ++For a complete list of standardized types, ++see Figure~4–2. ++

++

For information about general purpose control and data flow, ++see Data and Control Flow or Iteration. ++

++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Other-Compound-Forms-as-Places.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++Other Compound Forms as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Kinds of Places  

++
++
++

5.1.2.9 Other Compound Forms as Places

++ ++

For any other compound form for which the operator is a ++symbol f, ++the setf form expands into a call ++to the function named (setf f). ++The first argument in the newly constructed function form ++is newvalue and the ++ remaining arguments are the remaining elements of ++ place. ++This expansion occurs regardless of whether f or (setf f) ++is defined as a function locally, globally, or not at all. ++For example, ++

++

(setf (f arg1 arg2 ...) new-value) ++

++

expands into a form with the same effect and value as ++

++
++
 (let ((#:temp-1 arg1)          ;force correct order of evaluation
++       (#:temp-2 arg2)
++       ...
++       (#:temp-0 new-value))
++   (funcall (function (setf f)) #:temp-0 #:temp-1 #:temp-2...))
++
++ ++

A function named (setf f) must return its first argument ++as its only value in order to preserve the semantics of setf. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Other-Subclasses-of-Stream.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Other Subclasses of Stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Introduction to Streams  

++
++
++

21.1.1.7 Other Subclasses of Stream

++ ++

The class stream has a number of subclasses defined ++by this specification. Figure 21–5 shows some information ++about these subclasses. ++

++
++
  Class                Related Operators             
++  broadcast-stream     make-broadcast-stream         
++                       broadcast-stream-streams      
++  concatenated-stream  make-concatenated-stream      
++                       concatenated-stream-streams   
++  echo-stream          make-echo-stream              
++                       echo-stream-input-stream      
++                       echo-stream-output-stream     
++  string-stream        make-string-input-stream      
++                       with-input-from-string        
++                       make-string-output-stream     
++                       with-output-to-string         
++                       get-output-stream-string      
++  synonym-stream       make-synonym-stream           
++                       synonym-stream-symbol         
++  two-way-stream       make-two-way-stream           
++                       two-way-stream-input-stream   
++                       two-way-stream-output-stream  
++
++  Figure 21–5: Defined Names related to Specialized Streams
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Other-Syntax-in-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Other Syntax in a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.9 Other Syntax in a Logical Pathname Namestring

++ ++

The consequences of using characters other than those specified here ++in a logical pathname namestring are unspecified. ++

++

The consequences of using any value not specified here as a ++logical pathname component are unspecified. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Overview-of-Filenames.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Overview of Filenames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames  

++
++
++

19.1 Overview of Filenames

++ ++ ++

There are many kinds of file systems, ++varying widely both in their superficial syntactic details, ++ and in their underlying power and structure. ++The facilities provided by Common Lisp for referring to and manipulating files ++has been chosen to be compatible with many kinds of file systems, ++while at the same time minimizing the program-visible differences ++between kinds of file systems. ++

++

Since file systems vary in their conventions for naming files, ++there are two distinct ways to represent filenames: ++as namestrings and as pathnames. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Overview-of-Places-and-Generalized-Reference.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++Overview of Places and Generalized Reference (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.1 Overview of Places and Generalized Reference

++ ++

A generalized reference ++ ++ is the use of a form, ++sometimes called a place ++ ++, ++as if it were a variable that could be read and written. ++The value of a place is ++the object to which the place form evaluates. ++The value of a place can be changed by using setf. ++The concept of binding a place is not defined in Common Lisp, ++but an implementation is permitted to extend the language by defining this concept. ++

++

Figure 5–1 contains examples of the use of setf. ++Note that the values returned by evaluating the forms in column two ++are not necessarily the same as those obtained by evaluating the ++forms in column three. ++In general, the exact macro expansion of a setf form is not guaranteed ++and can even be implementation-dependent; ++all that is guaranteed is ++ that the expansion is an update form that works ++ for that particular implementation, ++ that the left-to-right evaluation of subforms is preserved, ++and ++ that the ultimate result of evaluating setf is the value ++ or values being stored. ++

++
++
  Access function   Update Function   Update using setf              
++  x                 (setq x datum)    (setf x datum)                 
++  (car x)           (rplaca x datum)  (setf (car x) datum)           
++  (symbol-value x)  (set x datum)     (setf (symbol-value x) datum)  
++
++                     Figure 5–1: Examples of setf                   
++
++
++ ++

Figure 5–2 shows operators relating to ++places and generalized reference. ++

++
++
  assert                defsetf             push     
++  ccase                 get-setf-expansion  remf     
++  ctypecase             getf                rotatef  
++  decf                  incf                setf     
++  define-modify-macro   pop                 shiftf   
++  define-setf-expander  psetf                        
++
++  Figure 5–2: Operators relating to places and generalized reference.
++
++
++ ++

Some of the operators above manipulate places ++and some manipulate setf expanders. ++A setf expansion can be derived from any place. ++

++

New setf expanders can be defined by using defsetf ++and define-setf-expander. ++

++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Overview-of-The-Lisp-Printer.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Overview of The Lisp Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Lisp Printer  

++
++
++

22.1.1 Overview of The Lisp Printer

++ ++

Common Lisp provides a representation of most objects in the form ++of printed text called the printed representation. ++Functions such as print take an object ++and send the characters of its printed representation to a stream. ++The collection of routines that does this is known as the (Common Lisp) printer. ++

++

Reading a printed representation ++typically ++produces an object that is equal to the ++originally printed object. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Overview-of-the-Loop-Facility.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Overview of the Loop Facility (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1 Overview of the Loop Facility

++ ++

The loop macro performs iteration. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Package-Concepts.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Package Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages  

++
++
++

11.1 Package Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Package-Inheritance.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Package Inheritance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.4 Package Inheritance

++ ++

Packages can be built up in layers. From one point of view, ++a package is a single collection ++of mappings from strings into internal symbols and ++external symbols. ++However, some of these mappings might be established within the package ++itself, while other mappings are inherited from other packages ++via use-package. ++A symbol is said to be present ++ ++ in a package ++if the mapping is in the package itself and is ++not inherited from somewhere else. ++

++

There is no way to inherit the internal symbols of another package; ++to refer to an internal symbol using the Lisp reader, ++ a package containing the symbol ++ must be made to be the current package, ++ a package prefix must be used, ++ or the symbol must be imported into the current package. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Package-Names-and-Nicknames.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Package Names and Nicknames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.1 Package Names and Nicknames

++ ++

Each package has a name (a string) and perhaps some nicknames ++(also strings). ++These are assigned when the package is created and can be changed later. ++

++

There is a single namespace for packages. ++The function find-package translates a package ++name or nickname into the associated package. ++The function package-name returns the name of a package. ++The function package-nicknames returns ++a list of all nicknames for a package. ++rename-package removes a package’s ++current name and nicknames and replaces them with new ones ++specified by the caller. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Package-Prefixes-for-Symbols.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++Package Prefixes for Symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.9 Package Prefixes for Symbols

++ ++

Package prefixes are printed if necessary. ++The rules for package prefixes are as follows. ++When the symbol is printed, if it is in the KEYWORD package, ++then it is printed with a preceding colon; otherwise, if ++it is accessible in the current package, it is printed without any ++package prefix; otherwise, it is printed with a package prefix. ++

++

A symbol that is apparently uninterned is printed ++preceded by “#:” ++

++

if *print-gensym* is true and printer escaping is enabled; ++if *print-gensym* is false or printer escaping is disabled, ++

++

then the symbol is printed without a prefix, ++as if it were in the current package. ++

++

Because the #: syntax does not intern the ++following symbol, it is necessary to use circular-list syntax ++if *print-circle* is true and ++the same uninterned symbol appears several times in an expression ++to be printed. For example, the result of ++

++
++
 (let ((x (make-symbol "FOO"))) (list x x))
++
++ ++

would be printed as (#:foo #:foo) if *print-circle* ++were false, but as (#1=#:foo #1#) if *print-circle* ++were true. ++

++

A summary of the preceding package prefix rules follows: ++

++
++
foo:bar
++

foo:bar is printed when symbol bar ++is external in its home package foo ++and is not accessible in the current package. ++

++
++
foo::bar
++

foo::bar is printed when bar is internal in its home package ++foo and is not accessible in the current package. ++

++
++
:bar
++

:bar is printed when the home package of bar is the KEYWORD package. ++

++
++
#:bar
++

#:bar is printed when bar is apparently uninterned, ++even in the pathological case that bar ++has no home package but is nevertheless somehow accessible ++in the current package. ++

++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Package-System-Consistency-Rules.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Package System Consistency Rules (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.6 Package System Consistency Rules

++ ++

The following rules apply to the package system as long as ++the value of *package* is not changed: ++

++
++
Read-read consistency
++

Reading the same symbol name ++always results in the same symbol. ++

++
++
Print-read consistency
++

An interned symbol always prints as a sequence of characters that, ++when read back in, yields the same symbol. ++

++

For information about how the Lisp printer treats symbols, ++see Printing Symbols. ++

++
++
Print-print consistency
++

If two interned symbols are not the same, ++then their printed representations will be different sequences of characters. ++

++
++ ++

These rules are true regardless of any implicit interning. ++As long as the current package is not changed, ++results are reproducible regardless of the order of loading files ++or the exact history of what symbols were typed in when. ++If the value of *package* is changed and then changed back to the previous value, ++consistency is maintained. ++The rules can be violated by ++ changing the value of *package*, ++ forcing a change to symbols ++ or to packages ++ or to both ++ by continuing from an error, ++or calling one of the following functions: ++ unintern, ++ unexport, ++ shadow, ++ shadowing-import, ++ or unuse-package. ++

++

An inconsistency only applies if one of the restrictions is violated ++between two of the named symbols. ++shadow, unexport, unintern, ++and shadowing-import can only affect the consistency of ++symbols with the same names (under string=) ++as the ones supplied as arguments. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Packages-Dictionary.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++Packages Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Packages  

++
++
++

11.2 Packages Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Packages-No-Longer-Required.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Packages No Longer Required (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.7 Packages No Longer Required

++ ++

The packages ++ LISP ++ ++, ++ USER ++ ++, ++ and SYSTEM ++ ++

++

are no longer required. It is valid for packages with one or more of these ++names to be provided by a conforming implementation as extensions. ++

++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Packages.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Packages (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

11 Packages

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Parsing-Loop-Clauses.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Parsing Loop Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.5 Parsing Loop Clauses

++ ++

The syntactic parts of an extended loop form are called clauses; ++the rules for parsing are determined by ++that clause’s keyword. ++The following example shows a loop form with six clauses: ++

++
++
 (loop for i from 1 to (compute-top-value)       ; first clause
++       while (not (unacceptable i))              ; second clause
++       collect (square i)                        ; third clause
++       do (format t "Working on ~D now" i)       ; fourth clause
++       when (evenp i)                            ; fifth clause
++         do (format t "~D is a non-odd number" i)
++       finally (format t "About to exit!"))      ; sixth clause
++
++ ++

Each loop keyword introduces ++either a compound loop clause or a simple loop clause ++that can consist of a loop keyword followed by a single form. ++The number of forms in a clause is determined by the loop keyword ++that begins the clause and by the auxiliary keywords in the clause. ++The keywords do, ++

++

doing, ++

++

initially, and finally ++are the only loop keywords that can take any number of forms and ++group them as an implicit progn. ++

++

Loop clauses can contain auxiliary keywords, which are sometimes ++called prepositions. For example, the first clause in the code ++above includes the prepositions from and to, ++which mark the value from which stepping begins and the value at which stepping ++ends. ++

++

For detailed information about loop syntax, ++see the macro loop. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Parsing-Namestrings-Into-Pathnames.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Parsing Namestrings Into Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.1.3 Parsing Namestrings Into Pathnames

++ ++

Parsing is the operation used to convert a namestring into a pathname. ++

++

Except in the case of parsing logical pathname namestrings, ++

++

this operation is implementation-dependent, ++because the format of namestrings is implementation-dependent. ++

++

A conforming implementation is free to accommodate other file system ++features in its pathname representation and provides a parser that can process ++such specifications in namestrings. ++Conforming programs must not depend on any such features, ++since those features will not be portable. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Pathname-Components.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1 Pathname Components

++ ++

A pathname has six components: ++ a host, ++ a device, ++ a directory, ++ a name, ++ a type, ++ and a version. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Pathnames-as-Filenames.html +@@ -0,0 +1,133 @@ ++ ++ ++ ++ ++ ++Pathnames as Filenames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.1.2 Pathnames as Filenames

++ ++

Pathnames ++ ++ are structured objects that can represent, ++in an implementation-independent way, ++the filenames that are used natively by an underlying file system. ++

++

In addition, pathnames can also represent certain partially composed ++filenames for which an underlying file system ++might not have a specific namestring representation. ++

++

A pathname need not correspond to any file that actually exists, ++and more than one pathname can refer to the same file. ++For example, the pathname with a version of :newest ++might refer to the same file as a pathname ++with the same components except a certain number as the version. ++Indeed, a pathname with version :newest might refer to ++different files as time passes, because the meaning of such a pathname ++depends on the state of the file system. ++

++

Some file systems naturally use a structural model for their ++filenames, while others do not. Within the Common Lisp pathname model, ++all filenames are seen as having a particular structure, ++even if that structure is not reflected in the underlying file system. ++The nature of the mapping between structure imposed by pathnames ++and the structure, if any, that is used by the underlying file system ++is implementation-defined. ++

++

Every pathname has six components: ++ a host, ++ a device, ++ a directory, ++ a name, ++ a type, ++ and a version. ++By naming files with pathnames, ++Common Lisp programs can work in essentially the same way even in file systems ++that seem superficially quite different. ++For a detailed description of these components, see Pathname Components. ++

++

The mapping of the pathname components into the concepts peculiar to ++each file system is implementation-defined. ++There exist conceivable pathnames ++for which there is no mapping to a syntactically valid filename ++in a particular implementation. ++An implementation may use various strategies in an attempt to find a mapping; ++for example, ++an implementation may quietly truncate filenames ++that exceed length limitations imposed by the underlying file system, ++or ignore certain pathname components ++for which the file system provides no support. ++If such a mapping cannot be found, ++an error of type file-error is signaled. ++

++

The time at which this mapping and associated error signaling ++occurs is implementation-dependent. ++Specifically, it may occur ++ at the time the pathname is constructed, ++ when coercing a pathname to a namestring, ++ or when an attempt is made to open or otherwise access the file ++ designated by the pathname. ++

++

Figure 19–1 lists some defined names that are applicable to pathnames. ++

++
++
  *default-pathname-defaults*  namestring          pathname-name          
++  directory-namestring         open                pathname-type          
++  enough-namestring            parse-namestring    pathname-version       
++  file-namestring              pathname            pathnamep              
++  file-string-length           pathname-device     translate-pathname     
++  host-namestring              pathname-directory  truename               
++  make-pathname                pathname-host       user-homedir-pathname  
++  merge-pathnames              pathname-match-p    wild-pathname-p        
++
++                     Figure 19–1: Pathname Operations                    
++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Pathnames.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames  

++
++
++

19.2 Pathnames

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Potential-Numbers-as-Tokens.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++Potential Numbers as Tokens (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.1.1 Potential Numbers as Tokens

++ ++

To allow implementors and future Common Lisp standards ++to extend the syntax of numbers, a ++syntax for potential numbers is defined that is ++more general than the syntax for numbers. ++A token is a potential number if it satisfies all of the following ++requirements: ++

++
++
1.
++

The token consists entirely of ++ digits, ++ signs, ++ ratio markers, ++ decimal points (.), ++ extension characters (^ or _), ++ and number markers. ++A number marker is a letter. ++Whether a letter may be treated as a number marker depends on context, ++but no letter that is adjacent to another letter may ever be treated as a number marker. ++Exponent markers are number markers. ++

++
++
2.
++

The token contains at least one digit. Letters may be considered to be ++digits, depending on the current input base, but only ++in tokens containing no decimal points. ++

++
++
3.
++

The token begins with a digit, sign, decimal point, or extension character, ++

++

[Reviewer Note by Barmar: This section is unnecessary because the first bullet already ++ omits discussion of a colon (package marker).] ++but not a ++package marker. ++The syntax involving a leading ++package marker followed by a potential number is ++not well-defined. The consequences of the use ++of notation such as :1, :1/2, and :2^3 in a ++position where an expression appropriate for read ++is expected are unspecified. ++

++
++
4.
++

The token does not end with a sign. ++

++
++ ++

If a potential number has number syntax, ++a number of the appropriate type is constructed and returned, ++if the number is representable in an implementation. ++A number will not be representable in an implementation ++if it is outside the boundaries set by the implementation-dependent ++constants for numbers. ++For example, specifying too large or too small an exponent for a float ++may make the number impossible to represent in the implementation. ++A ratio with denominator zero (such as -35/000) ++is not represented in any implementation. ++When a token with the syntax of a number cannot be converted to an internal ++number, an error of type reader-error is signaled. An error ++must not be signaled for specifying too many significant digits ++for a float; a truncated or rounded value should be produced. ++

++

If there is an ambiguity as to whether ++a letter should be treated as a digit or as a number marker, ++the letter is treated as a digit. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Pretty-Print-Dispatch-Tables.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Pretty Print Dispatch Tables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.1.4 Pretty Print Dispatch Tables

++ ++

A pprint dispatch table ++ ++ is a mapping from keys to pairs of values. ++Each key is a type specifier. ++The values associated with a key are ++ a “function” (specifically, a function designator or nil) ++ and a “numerical priority” (specifically, a real). ++Basic insertion and retrieval is done based on the keys with the equality ++of keys being tested by equal. ++

++

When *print-pretty* is true, ++the current pprint dispatch table ++ ++ (in *print-pprint-dispatch*) ++controls how objects are printed. ++The information in this table takes precedence over ++all other mechanisms for specifying how to print objects. ++In particular, it ++has priority over ++user-defined print-object methods ++

++

because the current pprint dispatch table is consulted first. ++

++

The function is chosen from the current pprint dispatch table ++by finding the highest priority function ++that is associated with a type specifier that matches the object; ++if there is more than one such function, ++it is implementation-dependent which is used. ++

++

However, if there is no ++information in the table ++about how to pretty print a particular kind of object, ++a function is invoked which uses print-object to print the object. ++The value of *print-pretty* is still true ++when this function is called, ++and individual methods for print-object might still elect to ++produce output in a special format conditional on the value of *print-pretty*. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Pretty-Printer-Concepts.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++Pretty Printer Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.1 Pretty Printer Concepts

++ ++

The facilities provided by the pretty printer ++ ++ permit ++programs to redefine the way in which code is displayed, ++and allow the full power of pretty printing to be applied ++to complex combinations of data structures. ++

++

Whether any given style of output is in fact “pretty” is inherently a ++somewhat subjective issue. However, since the effect of the ++pretty printer can be customized by conforming programs, ++the necessary flexibility is provided for individual programs ++to achieve an arbitrary degree of aesthetic control. ++

++

By providing direct access to the mechanisms within the pretty printer ++that make dynamic decisions about layout, the macros and functions ++pprint-logical-block, pprint-newline, and ++pprint-indent make it possible to specify pretty printing ++layout rules as a part of any function that produces output. They also ++make it very easy for the detection of circularity and sharing, and ++abbreviation based on length and nesting depth to be supported by the ++function. ++

++

The pretty printer is driven entirely by dispatch based on ++the value of *print-pprint-dispatch*. ++The function set-pprint-dispatch makes it possible ++for conforming programs to associate new pretty printing ++functions with a type. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Pretty-Printer-Margins.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Pretty Printer Margins (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.2.1.5 Pretty Printer Margins

++ ++

A primary goal of pretty printing is to keep the output between a pair of ++margins. ++The column where the output begins is taken as the left margin. ++If the current column cannot be determined at the time output begins, ++the left margin is assumed to be zero. ++The right margin is controlled by *print-right-margin*. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Prevention-of-Name-Conflicts-in-Packages.html +@@ -0,0 +1,160 @@ ++ ++ ++ ++ ++ ++Prevention of Name Conflicts in Packages (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.7 Prevention of Name Conflicts in Packages

++ ++

Within one package, any particular name can refer to at most one ++symbol. A name conflict is said to occur when there would be more than ++one candidate symbol. Any time a name conflict is about to occur, ++a correctable error is signaled. ++

++

The following rules apply to name conflicts: ++

++
++

Name conflicts are detected when they become possible, that is, when the ++package structure is altered. Name ++conflicts are not checked during every name lookup. ++

++
++
++

If the same symbol is accessible to a package ++through more than one path, there is no name conflict. ++A symbol cannot conflict with itself. ++Name conflicts occur only between distinct symbols with ++the same name (under string=). ++

++
++
++

Every package has a list of shadowing symbols. ++A shadowing symbol takes precedence over any other symbol of ++the same name that would otherwise be accessible in the package. ++A name conflict involving a shadowing symbol is always resolved in favor of ++the shadowing symbol, without signaling an error (except for one ++exception involving import). ++See shadow and shadowing-import. ++

++
++
++

The functions use-package, import, and ++export check for name conflicts. ++

++
++
++

shadow and shadowing-import ++never signal a name-conflict error. ++

++
++
++

unuse-package and unexport ++do not need to do any name-conflict checking. ++unintern does name-conflict checking only when a symbol ++being uninterned is a shadowing symbol ++ ++. ++

++
++
++

Giving a shadowing symbol to unintern ++can uncover a name conflict that had ++previously been resolved by the shadowing. ++

++
++
++

Package functions signal name-conflict errors of type package-error before making any ++ change to the package structure. When multiple changes are to be made, ++ it is ++ permissible for the implementation to process each change separately. ++ For example, when export is given a ++list of ++symbols, ++ aborting from a name ++ conflict caused by the second symbol ++ in the list might still export the ++ first symbol in the list. ++ However, a name-conflict error caused by export ++ of a single symbol will be signaled before ++ that symbol’s accessibility in any package is changed. ++

++
++
++

Continuing from a name-conflict error must offer the user a chance to ++resolve the name conflict in favor of either of the candidates. The ++package ++structure should be altered to reflect the resolution of the ++name conflict, via shadowing-import, ++unintern, ++or unexport. ++

++
++
++

A name conflict in use-package between a symbol ++present in the using package and an external symbol of the used ++package is resolved in favor of the first symbol by making it a ++shadowing symbol, or in favor of the second symbol by uninterning ++the first symbol from the using package. ++

++
++
++

A name conflict in export or unintern ++due to a package’s inheriting two distinct symbols ++with the same name (under string=) ++from two other packages can be resolved in ++favor of either symbol by importing it into the using ++package and making it a shadowing symbol ++ ++, ++just as with use-package. ++

++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Principal-Values-and-Branch-Cuts.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++Principal Values and Branch Cuts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.5.5 Principal Values and Branch Cuts

++ ++

Many of the irrational and transcendental functions are multiply defined ++in the complex domain; for example, there are in general an infinite ++number of complex values for the logarithm function. In each such ++case, a principal value must be chosen for the function to return. ++In general, such values cannot be chosen so as to make the range ++continuous; lines in the domain ++called branch cuts must be defined, which in turn ++define the discontinuities in the range. ++Common Lisp defines the branch cuts, principal values, and boundary ++conditions for the complex functions following “Principal Values and Branch Cuts in Complex APL.” The branch ++cut rules that apply to each function are located with the description of ++that function. ++

++

Figure 12–9 lists ++the identities that are obeyed ++throughout the applicable portion of the complex domain, even on ++the branch cuts: ++

++
++
  sin i z = i sinh z  sinh i z = i sin z        arctan i z = i arctanh z  
++  cos i z = cosh z    cosh i z = cos z          arcsinh i z = i arcsin z  
++  tan i z = i tanh z  arcsin i z = i arcsinh z  arctanh i z = i arctan z  
++
++         Figure 12–9: Trigonometric Identities for Complex Domain        
++
++
++ ++

The quadrant numbers referred to in the discussions of branch cuts are as illustrated ++in Figure 12–10. ++

++
++
                           Imaginary Axis
++	                         |
++	        		 |
++	        	II       |        I
++	        	         |
++	        	         |
++	        	         |
++	       ______________________________________ Real Axis
++	        	         |
++	        	         |
++	        	         |
++	               III       |     	   IV
++	        		 |
++	        		 |
++	        		 |
++	        		 |
++
++
++ ++

  Figure 12–9: Quadrant Numbering for Branch Cuts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printer-Dictionary.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++Printer Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Printer  

++
++
++

22.4 Printer Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printer-Dispatching.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Printer Dispatching (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.2 Printer Dispatching

++ ++

The Lisp printer makes its determination of how to print an ++object as follows: ++

++

If the value of *print-pretty* is true, ++printing is controlled by the current pprint dispatch table; ++see Pretty Print Dispatch Tables. ++

++

Otherwise (if the value of *print-pretty* is false), ++the object’s print-object method is used; ++see Default Print-Object Methods. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printer-Escaping.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Printer Escaping (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.1.2 Printer Escaping

++ ++

The variable *print-escape* controls whether the Lisp printer ++tries to produce notations such as escape characters and package prefixes. ++

++

The variable *print-readably* can be used to override ++many of the individual aspects controlled by the other ++printer control variables when program-readable output ++is especially important. ++

++

One of the many effects of making the value of *print-readably* be true ++is that the Lisp printer behaves as if *print-escape* were also true. ++For notational convenience, we say that ++if the value of either *print-readably* or *print-escape* is true, ++then printer escaping ++ ++ is “enabled”; ++and we say that ++if the values of both *print-readably* and *print-escape* are false, ++then printer escaping is “disabled”. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printer.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

22 Printer

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Bit-Vectors.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Printing Bit Vectors (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.14 Printing Bit Vectors

++ ++

A bit vector is printed as #* followed by the bits of the bit vector ++in order. If *print-array* is false, then the bit vector is ++printed in a format (using #<) that is concise but not readable. ++Only the active elements of the bit vector are printed. ++

++

[Reviewer Note by Barrett: Need to provide for #5*0 as an alternate ++ notation for #*00000.] ++

++

For information on Lisp reader parsing of bit vectors, ++see Sharpsign Asterisk. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Characters.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Printing Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.7 Printing Characters

++ ++

When printer escaping is disabled, ++

++

a character prints as itself; ++it is sent directly to the output stream. ++

++

When printer escaping is enabled, ++

++

then #\ syntax is used. ++

++

When the printer types out the name of a character, ++it uses the same table as the #\ reader macro would use; ++therefore any character name that is typed out ++is acceptable as input (in that implementation). ++If a non-graphic character has a standardized name_5, ++that name is preferred over non-standard names ++for printing in #\ notation. ++For the graphic standard characters, ++the character itself is always used ++for printing in #\ notation—even if ++the character also has a name_5. ++

++

For details about the #\ reader macro, see Sharpsign Backslash. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Complexes.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Printing Complexes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.5 Printing Complexes

++ ++ ++ ++

A complex is printed as #C, an open parenthesis, ++the printed representation of its real part, a space, ++the printed representation of its imaginary part, and finally ++a close parenthesis. ++

++

For related information about the syntax of a complex, ++see Syntax of a Complex and Sharpsign C. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Conditions.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Printing Conditions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3 Printing Conditions

++ ++

If the :report argument to define-condition is used, ++a print function is defined that is called whenever ++the defined condition is printed while the value of *print-escape* is false. ++This function is called the condition reporter ++ ++; ++the text which it outputs is called a report message ++ ++. ++

++

When a condition is printed and *print-escape* ++is false, the condition reporter for the condition is invoked. ++Conditions are printed automatically by functions such as ++invoke-debugger, break, and warn. ++

++

When *print-escape* is true, the object should print in an ++abbreviated fashion according to the style of the implementation ++(e.g., by print-unreadable-object). It is not required that a ++condition can be recreated by reading its printed representation. ++

++

No function is provided for directly accessing ++or invoking condition reporters. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Floats.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Printing Floats (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.4 Printing Floats

++ ++ ++ ++

If the magnitude of the float is either zero or between 10^-3 (inclusive) ++and 10^7 (exclusive), it is printed as the integer part of the number, ++then a decimal point, ++followed by the fractional part of the number; ++there is always at least one ++digit on each side of the decimal point. ++If the sign of the number ++(as determined by float-sign) ++is negative, then a minus sign is printed before the number. ++If the format of the number ++does not match that specified by ++*read-default-float-format*, then the exponent marker for ++that format and the digit 0 are also printed. ++For example, the base of the natural logarithms as a short float ++might be printed as 2.71828S0. ++

++

For non-zero magnitudes outside of the range 10^-3 to 10^7, ++a float is printed in computerized scientific notation. ++The representation of the number is scaled to be between ++1 (inclusive) and 10 (exclusive) and then printed, with one digit ++before the decimal point and at least one digit after the decimal point. ++Next the exponent marker for the format is printed, ++except that ++if the format of the number matches that specified by ++*read-default-float-format*, then the exponent marker E ++is used. ++Finally, the power of ten by which the fraction must be multiplied ++to equal the original number is printed as a decimal integer. ++For example, Avogadro’s number as a short float ++is printed as 6.02S23. ++

++

For related information about the syntax of a float, ++see Syntax of a Float. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Integers.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Printing Integers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.2 Printing Integers

++ ++

Integers are printed in the radix specified by the current output base ++in positional notation, most significant digit first. ++If appropriate, a radix specifier can be printed; see *print-radix*. ++If an integer is negative, a minus sign is printed and then the ++absolute value of the integer is printed. ++The integer zero is represented ++by the single digit 0 and never has a sign. ++A decimal point might be printed, ++depending on the value of *print-radix*. ++

++

For related information about the syntax of an integer, ++see Syntax of an Integer. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Lists-and-Conses.html +@@ -0,0 +1,143 @@ ++ ++ ++ ++ ++ ++Printing Lists and Conses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.13 Printing Lists and Conses

++ ++

Wherever possible, list notation is preferred over dot notation. ++Therefore the following algorithm is used to print a cons x: ++

++
++
1.
++

A left-parenthesis is printed. ++

++
++
2.
++

The car of x is printed. ++

++
++
3.
++

If the cdr of x is itself a cons, ++ it is made to be the current cons ++ (i.e., x becomes that cons), ++

++

a space ++

++

is printed, ++ and step 2 is re-entered. ++

++
++
4.
++

If the cdr of x is not null, ++

++

a space, ++

++

a dot, ++

++

a space, ++

++

and the cdr of x are printed. ++

++
++
5.
++

A right-parenthesis is printed. ++

++
++ ++

Actually, the above algorithm is only used when *print-pretty* ++is false. When *print-pretty* is true (or ++when pprint is used), ++additional whitespace_1 ++may replace the use of a single space, ++and a more elaborate algorithm with similar goals but more presentational ++flexibility is used; see Printer Dispatching. ++

++

Although the two expressions below are equivalent, ++and the reader accepts ++either one and ++produces ++the same cons, the printer ++always prints such a cons in the second form. ++

++
++
 (a . (b . ((c . (d . nil)) . (e . nil))))
++ (a b (c d) e)
++
++ ++

The printing of conses is affected by *print-level*, ++*print-length*, and *print-circle*. ++

++

Following are examples of printed representations of lists: ++

++
++
 (a . b)     ;A dotted pair of a and b
++ (a.b)       ;A list of one element, the symbol named a.b
++ (a. b)      ;A list of two elements a. and b
++ (a .b)      ;A list of two elements a and .b
++ (a b . c)   ;A dotted list of a and b with c at the end; two conses
++ .iot        ;The symbol whose name is .iot
++ (. b)       ;Invalid -- an error is signaled if an attempt is made to read 
++             ;this syntax.
++ (a .)       ;Invalid -- an error is signaled.
++ (a .. b)    ;Invalid -- an error is signaled.
++ (a . . b)   ;Invalid -- an error is signaled.
++ (a b c ...) ;Invalid -- an error is signaled.
++ (a \. b)    ;A list of three elements a, ., and b
++ (a |.| b)   ;A list of three elements a, ., and b
++ (a \... b)  ;A list of three elements a, ..., and b
++ (a |...| b) ;A list of three elements a, ..., and b
++
++ ++

For information on how the Lisp reader parses lists and conses, ++see Left-Parenthesis. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Numbers.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Printing Numbers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.1 Printing Numbers

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Other-Arrays.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++Printing Other Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.16 Printing Other Arrays

++ ++

If *print-array* is true ++and *print-readably* is false, ++any ++

++

array other than a vector is printed ++using #nA format. ++Let n be the rank of the array. ++Then # is printed, then n as a decimal integer, ++then A, then n open parentheses. ++Next the elements are scanned in row-major order, ++using write on each element, ++and separating elements from each other with whitespace_1. ++The array’s dimensions are numbered 0 to n-1 from left to right, ++and are enumerated with the rightmost index changing fastest. ++Every time the index for dimension j is incremented, ++the following actions are taken: ++

++
++
*
++

If j < n-1, then a close parenthesis is printed. ++

++
++
*
++

If incrementing the index for dimension j caused it to equal ++dimension j, that index is reset to zero and the ++index for dimension j-1 is incremented (thereby performing these three steps recursively), ++unless j=0, in which case the entire algorithm is terminated. ++If incrementing the index for dimension j did not cause it to ++equal dimension j, then a space is printed. ++

++
++
*
++

If j < n-1, then an open parenthesis is printed. ++

++
++ ++

This causes the contents to be printed in a format suitable for ++:initial-contents to make-array. ++The lists effectively printed by this procedure are subject to ++truncation by *print-level* and *print-length*. ++

++

If the array ++is of a specialized type, containing bits or characters, ++then the innermost lists generated by the algorithm given above can instead ++be printed using bit-vector or string syntax, provided that these innermost ++lists would not be subject to truncation by *print-length*. ++

++

If both *print-array* and *print-readably* are false, ++

++

then the array is printed ++in a format (using #<) that is concise but not readable. ++

++

If *print-readably* is true, ++the array prints in an implementation-defined manner; ++see the variable *print-readably*. ++

++

In particular, ++this may be important for arrays having some dimension 0. ++

++

For information on how the Lisp reader parses these “other arrays,” ++see Sharpsign A. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Other-Objects.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Printing Other Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.21 Printing Other Objects

++ ++

Other objects are printed in an implementation-dependent manner. ++It is not required that an implementation print those objects ++readably. ++

++

For example, hash tables, ++ readtables, ++ packages, ++ streams, ++ and functions ++might not print readably. ++

++

A common notation to use in this circumstance is #<...>. ++Since #< is not readable by the Lisp reader, ++the precise format of the text which follows is not important, ++but a common format to use is that provided by the print-unreadable-object macro. ++

++

For information on how the Lisp reader treats this notation, ++see Sharpsign Less-Than-Sign. ++For information on how to notate objects that cannot be printed readably, ++see Sharpsign Dot. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Other-Vectors.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Printing Other Vectors (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.15 Printing Other Vectors

++ ++

If *print-array* is true ++and *print-readably* is false, ++any ++

++

vector ++other than a string or bit vector is printed using ++general-vector syntax; this means that information ++about specialized vector representations does not appear. ++The printed representation of a zero-length vector is #(). ++The printed representation of a non-zero-length vector begins with #(. ++Following that, the first element of the vector is printed. ++

++

If there are any other elements, they are printed in turn, with ++each such additional element preceded by ++a space if *print-pretty* is false, ++or whitespace_1 if *print-pretty* is true. ++

++

A right-parenthesis after the last element ++terminates the printed representation of the vector. ++The printing of vectors ++is affected by *print-level* and *print-length*. ++If the vector has a fill pointer, ++then only those elements below ++the fill pointer are printed. ++

++

If both *print-array* and *print-readably* are false, ++

++

the vector is not printed as described above, ++but in a format (using #<) that is concise but not readable. ++

++

If *print-readably* is true, ++the vector prints in an implementation-defined manner; ++see the variable *print-readably*. ++

++

For information on how the Lisp reader parses these “other vectors,” ++see Sharpsign Left-Parenthesis. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Pathnames.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Printing Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.19 Printing Pathnames

++ ++

When printer escaping is enabled, ++

++

the syntax #P"..." is how a ++pathname is printed by write and the other functions herein described. ++The "..." is the namestring representation of the pathname. ++

++

When printer escaping is disabled, ++

++

write writes a pathname P ++by writing (namestring P) instead. ++

++

For information on how the Lisp reader parses pathnames, ++see Sharpsign P. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Random-States.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Printing Random States (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.18 Printing Random States

++ ++

A specific syntax for printing objects of type random-state is ++not specified. However, every implementation ++must arrange to print a random state object in such a way that, ++within the same implementation, read ++can construct from the printed representation a copy of the ++random state ++object as if the copy had been made by make-random-state. ++

++

If the type random state is effectively implemented ++by using the machinery for defstruct, ++the usual structure syntax can then be used for printing ++random state ++objects; one might look something like ++

++
++
 #S(RANDOM-STATE :DATA #(14 49 98436589 786345 8734658324 ... ))
++
++ ++

where the components are implementation-dependent. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Ratios.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Printing Ratios (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.3 Printing Ratios

++ ++ ++ ++

Ratios are printed as follows: ++the absolute value of the numerator is printed, as for an integer; ++then a /; then the denominator. The numerator and denominator are ++both printed in the radix specified by the current output base; ++they are obtained as if by ++numerator and denominator, and so ratios ++are printed in reduced form (lowest terms). ++If appropriate, a radix specifier can be printed; see ++*print-radix*. ++If the ratio is negative, a minus sign is printed before the numerator. ++

++

For related information about the syntax of a ratio, ++see Syntax of a Ratio. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Strings.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Printing Strings (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.12 Printing Strings

++ ++

The characters of the string are output in order. ++

++

If printer escaping is enabled, ++

++

a double-quote is output before and after, and all ++double-quotes and single escapes are preceded by backslash. ++The printing of strings is not affected by *print-array*. ++Only the active elements of the string are printed. ++

++

For information on how the Lisp reader parses strings, ++see Double-Quote. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Structures.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Printing Structures (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.20 Printing Structures

++ ++

By default, a structure of type S is printed using #S syntax. ++This behavior can be customized by specifying a :print-function ++or :print-object option to the defstruct form that defines S, ++or by writing a print-object method ++that is specialized for objects of type S. ++

++

Different structures might print out in different ways; ++the default notation for structures is: ++

++
++
 #S(structure-name {slot-key slot-value}*)
++
++ ++

where #S indicates structure syntax, ++structure-name is a structure name, ++each slot-key is an initialization argument name ++for a slot in the structure, ++and each corresponding slot-value is a representation ++of the object in that slot. ++

++

For information on how the Lisp reader parses structures, ++see Sharpsign S. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Printing-Symbols.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Printing Symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.1.3.8 Printing Symbols

++ ++

When printer escaping is disabled, ++

++

only the characters of the symbol’s name are output ++

++

(but the case in which to print characters in the name is ++controlled by *print-case*; ++see Effect of Readtable Case on the Lisp Printer). ++

++

The remainder of this section applies only ++

++

when printer escaping is enabled. ++

++

When printing a symbol, the printer inserts enough ++single escape and/or multiple escape ++characters (backslashes and/or vertical-bars) so that if ++read were called with the same *readtable* and ++with *read-base* bound to the current output base, it ++would return the same symbol (if it is not ++apparently uninterned) or an uninterned symbol ++with the same print name (otherwise). ++

++

For example, if the value of *print-base* were 16 ++when printing the symbol face, it would have to be printed as ++\FACE or \Face or |FACE|, ++because the token face would be read as a hexadecimal ++number (decimal value 64206) if the value of *read-base* were 16. ++

++

For additional restrictions concerning characters with nonstandard ++syntax types in the current readtable, see the variable *print-readably* ++

++

For information about how the Lisp reader parses symbols, ++see Symbols as Tokens and Sharpsign Colon. ++

++

nil might be printed as () ++

++

when *print-pretty* is true ++and printer escaping is enabled. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Processing-of-Defining-Macros.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Processing of Defining Macros (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.3.2 Processing of Defining Macros

++ ++

Defining macros (such as defmacro or defvar) ++appearing within a file being processed by compile-file ++normally have compile-time side effects which affect how subsequent forms ++in the same file are compiled. A convenient model for explaining how these ++side effects happen is that the defining macro expands into one or ++more eval-when forms, and that the calls which cause the compile-time ++side effects to happen appear ++in the body of an (eval-when (:compile-toplevel) ...) form. ++

++

The compile-time side effects may cause information about the definition to ++be stored differently than if the defining macro had been processed in the ++‘normal’ way (either interpretively or by loading the compiled file). ++

++

In particular, the information stored by the defining macros at compile time ++might or might not be available to the interpreter (either during or after compilation), ++or during subsequent calls to the compiler. For example, ++the following code is nonportable because it assumes that the compiler ++stores the macro definition of foo where it is available to the interpreter: ++

++
++
 (defmacro foo (x) `(car ,x))
++ (eval-when (:execute :compile-toplevel :load-toplevel)
++   (print (foo '(a b c))))
++
++ ++

A portable way to do the same thing would be to include the macro ++definition inside the eval-when form, as in: ++

++
++
 (eval-when (:execute :compile-toplevel :load-toplevel)
++   (defmacro foo (x) `(car ,x))
++   (print (foo '(a b c))))
++
++ ++

Figure 3–8 lists macros that make definitions ++available both in the compilation and run-time environments. ++It is not specified whether definitions made available in the ++compilation environment are available in the evaluation ++environment, nor is it specified whether they are available ++in subsequent compilation units or subsequent invocations of the ++compiler. As with eval-when, these compile-time side ++effects happen only when the defining macros appear at ++top level. ++

++
++
  declaim                define-modify-macro   defsetf    
++  defclass               define-setf-expander  defstruct  
++  defconstant            defmacro              deftype    
++  define-compiler-macro  defpackage            defvar     
++  define-condition       defparameter                     
++
++  Figure 3–8: Defining Macros That Affect the Compile-Time Environment
++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Processing-of-Top-Level-Forms.html +@@ -0,0 +1,174 @@ ++ ++ ++ ++ ++ ++Processing of Top Level Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.3.1 Processing of Top Level Forms

++ ++

Processing of top level forms in the file compiler is defined ++as follows: ++

++
++
1.
++

If the form is a compiler macro form ++(not disabled by a notinline declaration), ++the implementation might or might not choose to compute ++the compiler macro expansion of the form and, ++having performed the expansion, might or might not choose to process the result ++as a top level form in the same processing mode ++(compile-time-too or not-compile-time). ++If it declines to obtain or use the expansion, it must process the original form. ++

++
++
2.
++

If the form is a macro form, ++its macro expansion is computed and processed as a ++top level form in ++the same processing mode (compile-time-too or not-compile-time). ++

++
++
3.
++

If the form is a progn form, each of its ++body forms is sequentially processed as a ++top level form in the same processing mode. ++

++
++
4.
++

If the form is a locally, ++macrolet, or symbol-macrolet, ++compile-file establishes the appropriate bindings and processes the ++body forms as top level forms with those bindings in effect ++in the same processing mode. (Note that this implies that the lexical ++environment in which top level forms are processed ++is not necessarily the null lexical environment.) ++

++
++
5.
++

If the form is an eval-when ++ ++ form, it is ++handled according to Figure 3–7. ++

++

plus .5 fil ++\offinterlineskip ++

++
  CT   LT   E    Mode  Action    New Mode          
++  _________________________________________________
++  Yes  Yes  —  —   Process   compile-time-too  
++  No   Yes  Yes   CTT  Process   compile-time-too  
++  No   Yes  Yes   NCT  Process   not-compile-time  
++  No   Yes  No   —   Process   not-compile-time  
++  Yes  No   —  —   Evaluate  —               
++  No   No   Yes   CTT  Evaluate  —               
++  No   No   Yes   NCT  Discard   —               
++  No   No   No   —   Discard   —               
++
++ ++

  Figure 3–7: EVAL-WHEN processing ++

++

Column CT indicates whether :compile-toplevel is specified. ++Column LT indicates whether :load-toplevel is specified. ++Column E indicates whether :execute is specified. ++Column Mode indicates the processing mode; ++ a dash (—) indicates that the processing mode is not relevant. ++

++

The Action column specifies one of three actions: ++

++
++
++

Process: process the body as top level forms in the ++specified mode. ++

++
++
++

Evaluate: evaluate the body in the dynamic execution ++context of the compiler, using the evaluation environment as ++the global environment and the lexical environment in which ++the eval-when appears. ++

++
++
++

Discard: ignore the form. ++

++
++ ++

The New Mode column indicates the new processing mode. ++A dash (—) indicates the compiler remains in its current mode. ++

++
++
6.
++

Otherwise, the form is a top level form that ++is not one of the special cases. In compile-time-too mode, the ++compiler first evaluates the form in the evaluation ++environment and then minimally compiles it. In not-compile-time ++mode, the form is simply minimally compiled. All subforms ++are treated as non-top-level forms. ++

++

Note that top level forms are processed in the order in ++which they textually appear in the file and that each ++top level form read by the compiler is processed before the next is ++read. However, the order of processing (including macro expansion) of ++subforms that are not top level forms and the order of ++further compilation is unspecified as long as Common Lisp semantics ++are preserved. ++

++
++
++ ++

eval-when forms cause compile-time evaluation only at ++top level. Both :compile-toplevel and :load-toplevel situation specifications ++are ignored for non-top-level forms. For non-top-level forms, ++an eval-when ++specifying the :execute situation is treated as an implicit progn ++including the forms in the body of the eval-when form; ++otherwise, the forms in the body are ignored. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Purpose-of-Compiler-Macros.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Purpose of Compiler Macros (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.2.2 Purpose of Compiler Macros

++ ++

The purpose of the compiler macro facility is to permit ++selective source code transformations as optimization advice ++to the compiler. When a compound form is being ++processed (as by the compiler), if the operator names a ++compiler macro then the compiler macro function may be ++invoked on the form, and the resulting expansion recursively processed ++in preference to performing the usual processing on the original form ++according to its normal interpretation as a function form or ++macro form. ++

++

A compiler macro function, like a macro function, ++is a function of two arguments: the entire call form ++and the environment. Unlike an ordinary macro function, a ++compiler macro function can decline to provide an expansion merely by ++returning a value that is the same as the original form. ++The consequences are undefined if a compiler macro function ++destructively modifies any part of its form argument. ++

++

The form passed to the compiler macro function can either be a list ++whose car is the function name, or a list whose car is ++funcall and whose cadr is a list (function name); ++note that this affects destructuring of the form argument by the ++compiler macro function. ++define-compiler-macro arranges for destructuring of arguments to be ++performed correctly for both possible formats. ++

++

When compile-file chooses to expand a top level form that is ++a compiler macro form, the expansion is also treated as a top level form ++for the purposes of eval-when processing; see Processing of Top Level Forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Random_002dState-Operations.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Random-State Operations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Number Concepts  

++
++
++

12.1.7 Random-State Operations

++ ++

Figure 12–10 lists some defined names that are applicable to random states. ++

++
++
  *random-state*     random            
++  make-random-state  random-state-p    
++
++  Figure 12–10: Random-state defined names
++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rational-Computations.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Rational Computations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.3 Rational Computations

++ ++

The rules in this section apply to rational computations. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Re_002dReading-Abbreviated-Expressions.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Re-Reading Abbreviated Expressions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Standard Macro Characters  

++
++
++

2.4.9 Re-Reading Abbreviated Expressions

++ ++

Note that the Lisp reader will ++generally ++signal an error of type reader-error ++when reading an expression_2 that has been ++abbreviated because of length or level limits ++(see *print-level*, ++ *print-length*, ++ and *print-lines*) ++due to restrictions on “..”, “...”, “#” followed by whitespace_1, ++and “#)”. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Reader-Algorithm.html +@@ -0,0 +1,253 @@ ++ ++ ++ ++ ++ ++Reader Algorithm (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Syntax  

++
++
++

2.2 Reader Algorithm

++ ++ ++

This section describes the algorithm used by the Lisp reader ++to parse objects from an input character stream, ++including how the Lisp reader processes macro characters. ++

++

When dealing with tokens, the reader’s basic function is to distinguish ++representations of symbols from those of numbers. ++When a token is accumulated, it is assumed to represent a number if it ++satisfies the syntax for numbers listed in Figure~2–9. ++If it does not represent a number, ++it is then assumed to be a potential number ++if it satisfies the rules governing the syntax for a potential number. ++If a valid token is neither a representation of a number ++ nor a potential number, ++it represents a symbol. ++

++

The algorithm performed by the Lisp reader is as follows: ++

++
++
1.
++

If at end of file, end-of-file processing is performed as specified ++in read. ++Otherwise, ++one character, x, is read from the input stream, and ++dispatched according to the syntax type of x to one ++of steps 2 to 7. ++

++
++
2.
++

If x is an invalid character, ++an error of type reader-error is signaled. ++

++
++
3.
++

If x is a whitespace_2 character, ++then it is discarded and step 1 is re-entered. ++

++
++
4.
++

If x is a terminating or non-terminating macro character ++then its associated reader macro function is called with two arguments, ++the input stream and x. ++

++

The reader macro function may read characters ++from the input stream; ++if it does, it will see those characters following the macro character. ++The Lisp reader may be invoked recursively from the reader macro function. ++

++

The reader macro function must not have any side effects other than on the ++input stream; ++because of backtracking and restarting of the read operation, ++front ends to the Lisp reader (e.g., “editors” and “rubout handlers”) ++may cause the reader macro function to be called repeatedly during the ++reading of a single expression in which x only appears once. ++

++

The reader macro function may return zero values or one value. ++If one value is returned, ++then that value is returned as the result of the read operation; ++the algorithm is done. ++If zero values are returned, then step 1 is re-entered. ++

++
++
5.
++

If x is a single escape character ++then the next character, y, is read, or an error of type end-of-file ++is signaled if at the end of file. ++y is treated as if it is a constituent ++whose only constituent trait is alphabetic_2. ++y is used to begin a token, and step 8 is entered. ++

++
++
6.
++

If x is a multiple escape character ++then a token (initially ++containing no characters) is begun and step 9 is entered. ++

++
++
7.
++

If x is a constituent character, then it begins a token. ++After the token is read in, it will be interpreted ++either as a Lisp object or as being of invalid syntax. ++If the token represents an object, ++that object is returned as the result of the read operation. ++If the token is of invalid syntax, an error is signaled. ++If x is a character with case, ++it might be replaced with the corresponding character of the opposite case, ++depending on the readtable case of the current readtable, ++as outlined in Effect of Readtable Case on the Lisp Reader. ++X is used to begin a token, and step 8 is entered. ++

++
++
8.
++

At this point a token is being accumulated, and an even number ++of multiple escape characters have been encountered. ++If at end of file, step 10 is entered. ++Otherwise, a character, y, is read, and ++one of the following actions is performed according to its syntax type: ++

++
++
*
++

If y is a constituent or non-terminating macro character: ++

++
++

If y is a character with case, ++it might be replaced with the corresponding character of the opposite case, ++depending on the readtable case of the current readtable, ++as outlined in Effect of Readtable Case on the Lisp Reader. ++

++
++

Y is appended to the token being built. ++

++
++

Step 8 is repeated. ++

++
++ ++
++
*
++

If y is a single escape character, then the next character, ++z, is read, or an error of type end-of-file is signaled if at end of file. ++Z is treated as if it is a constituent ++whose only constituent trait is alphabetic_2. ++Z is appended to the token being built, ++and step 8 is repeated. ++

++
++
*
++

If y is a multiple escape character, ++then step 9 is entered. ++

++
++
*
++

If y is an invalid character, ++an error of type reader-error is signaled. ++

++
++
*
++

If y is a terminating macro character, ++then it terminates the token. ++First the character y is unread (see unread-char), ++and then step 10 is entered. ++

++
++
*
++

If y is a whitespace_2 character, then it terminates ++the token. First the character y is unread ++if appropriate (see read-preserving-whitespace), ++and then step 10 is entered. ++

++
++ ++
++
9.
++

At this point a token is being accumulated, and an odd number ++of multiple escape characters have been encountered. ++If at end of file, an error of type end-of-file is signaled. ++Otherwise, a character, y, is read, and ++one of the following actions is performed according to its syntax type: ++

++
++
*
++

If y is a constituent, macro, or whitespace_2 character, ++y is treated as a constituent ++whose only constituent trait is alphabetic_2. ++Y is appended to the token being built, and step 9 is repeated. ++

++
++
*
++

If y is a single escape character, then the next character, ++z, is read, or an error of type end-of-file is signaled if at end of file. ++Z is treated as a constituent ++whose only constituent trait is alphabetic_2. ++Z is appended to the token being built, ++and step 9 is repeated. ++

++
++
*
++

If y is a multiple escape character, ++then step 8 is entered. ++

++
++
*
++

If y is an invalid character, ++an error of type reader-error is signaled. ++

++
++ ++
++
10.
++

An entire token has been accumulated. ++The object represented by the token is returned ++as the result of the read operation, ++or an error of type reader-error is signaled if the token is not of valid syntax. ++

++
++ ++ ++
++
++

++Next: , Previous: , Up: Syntax  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Reader-Concepts.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Reader Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader  

++
++
++

23.1 Reader Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Reader-Dictionary.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++Reader Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Reader  

++
++
++

23.2 Reader Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Reader.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Reader (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

23 Reader

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Readtables.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Readtables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.1 Readtables

++ ++

Syntax information for use by the Lisp reader is embodied in an ++object called a readtable ++ ++. Among other things, ++the readtable contains the association between characters ++and syntax types. ++

++

Figure 2–1 lists some defined names that are applicable to ++readtables. ++

++
++
  *readtable*                    readtable-case                
++  copy-readtable                 readtablep                    
++  get-dispatch-macro-character   set-dispatch-macro-character  
++  get-macro-character            set-macro-character           
++  make-dispatch-macro-character  set-syntax-from-char          
++
++              Figure 2–1: Readtable defined names             
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Recommended-Style-in-Condition-Reporting.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Recommended Style in Condition Reporting (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.3.1 Recommended Style in Condition Reporting

++ ++

In order to ensure a properly aesthetic result when presenting ++report messages to the user, certain stylistic conventions are ++recommended. ++

++

There are stylistic recommendations for the content of the messages ++output by condition reporters, but there are no formal requirements ++on those programs. ++If a program violates the recommendations for some message, the ++display of that message might be less aesthetic than if the guideline ++had been observed, but the program is still considered a ++conforming program. ++

++

The requirements on a program or implementation which ++invokes a condition reporter are somewhat stronger. A conforming ++program must be permitted to assume that if these style guidelines are ++followed, proper aesthetics will be maintained. Where appropriate, any ++specific requirements on such routines are explicitly mentioned below. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Redefining-Classes.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++Redefining Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.6 Redefining Classes

++ ++

A class that is a direct instance of standard-class can ++be redefined if the new class is also ++a direct instance of standard-class. ++Redefining a class modifies the existing ++class object to reflect the new class definition; it does not ++create a new class object for the class. ++Any method object created by a :reader, :writer, ++or :accessor option specified by the old defclass form is ++removed from the corresponding generic function. ++Methods specified by the new defclass form are added. ++

++

When the class C is redefined, changes are propagated to its instances ++and to instances of any of its subclasses. Updating such an ++instance occurs at an implementation-dependent time, but no later than ++the next time a slot ++of that instance is read or written. Updating an ++instance ++does not change its identity as defined by the function eq. ++The updating process may change the slots of that ++particular instance, ++but it does not create a new instance. Whether ++updating an instance consumes storage is implementation-dependent. ++

++

Note that redefining a class may cause slots to be added or ++deleted. If a class is redefined in a way that changes the set of ++local slots accessible in instances, the instances ++are updated. It is implementation-dependent whether instances ++are updated if a class is redefined in a way that does not change ++the set of local slots accessible in instances. ++

++

The value of a slot ++that is specified as shared both in the old class ++and in the new class is retained. ++If such a shared slot was unbound ++in the old class, it is unbound in the new class. ++Slots that ++were local in the old class and that are shared in the new ++class are ++initialized. Newly added shared slots are initialized. ++

++

Each newly added shared slot is set to the result of evaluating the ++captured initialization form for the slot that was specified ++in the defclass form for the new class. ++If there was no initialization form, the slot is unbound. ++

++

If a class is redefined in such a way that the set of ++local slots accessible in an instance of the class ++is changed, a two-step process of updating the instances of the ++class takes place. The process may be explicitly started by ++invoking the generic function make-instances-obsolete. This ++two-step process can happen in other circumstances in some implementations. ++For example, in some implementations this two-step process is ++triggered if the order of slots in storage is changed. ++

++

The first step modifies the structure of the instance by adding new ++local slots and discarding local slots that are not ++defined in the new version of the class. The second step ++initializes the newly-added local slots and performs any other ++user-defined actions. These two steps are further specified ++in the next two sections. ++

++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Referenced-Publications.html +@@ -0,0 +1,211 @@ ++ ++ ++ ++ ++ ++Referenced Publications (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.3 Referenced Publications

++ ++ ++
++
*
++

The Anatomy of Lisp, ++ John Allen, McGraw-Hill, Inc., 1978. ++

++
++
*
++

The Art of Computer Programming, Volume 3, ++ Donald E. Knuth, Addison-Wesley Company (Reading, MA), 1973. ++

++
++
*
++

The Art of the Metaobject Protocol, ++ Kiczales et al., MIT Press (Cambridge, MA), 1991. ++

++
++
*
++

Common Lisp Object System Specification, ++ D. Bobrow, L. DiMichiel, R.P. Gabriel, S. Keene, G. Kiczales, D. Moon, ++ SIGPLAN Notices V23, September, 1988. ++

++
++
*
++

Common Lisp: The Language, ++ Guy L. Steele Jr., Digital Press (Burlington, MA), 1984. ++

++
++
*
++

Common Lisp: The Language, Second Edition, ++ Guy L. Steele Jr., Digital Press (Bedford, MA), 1990. ++

++
++
*
++

Exceptional Situations in Lisp, ++ Kent M. Pitman, ++ Proceedings of the First European Conference ++ on the Practical Application of LISP\/ ++ (EUROPAL ’90), ++ Churchill College, Cambridge, England, ++ March 27-29, 1990. ++

++
++
*
++

Flavors: A Non-Hierarchical Approach to Object-Oriented Programming, ++ Howard I. Cannon, 1982. ++

++
++
*
++

IEEE Standard for Binary Floating-Point Arithmetic, ++ ANSI/IEEE Std 754-1985, ++ Institute of Electrical and Electronics Engineers, Inc. (New York), 1985. ++

++
++
*
++

IEEE Standard for the Scheme Programming Language, ++ IEEE Std 1178-1990, ++ Institute of Electrical and Electronic Engineers, Inc. (New York), 1991. ++

++
++
*
++

Interlisp Reference Manual, Third Revision, ++ Teitelman, Warren, et al, ++ Xerox Palo Alto Research Center (Palo Alto, CA), 1978. ++

++
++
*
++

ISO 6937/2, ++ Information processing—Coded character sets ++ for text communication—Part 2: Latin alphabetic and non-alphabetic ++ graphic characters, ++ ISO, 1983. ++

++
++
*
++

Lisp 1.5 Programmer’s Manual, ++ John McCarthy, MIT Press (Cambridge, MA), August, 1962. ++

++
++
*
++

Lisp Machine Manual, ++ D.L. Weinreb and D.A. Moon, ++ Artificial Intelligence Laboratory, MIT (Cambridge, MA), July, 1981. ++

++
++
*
++

Maclisp Reference Manual, Revision~0, ++ David A. Moon, Project MAC (Laboratory for Computer Science), ++ MIT (Cambridge, MA), March, 1974. ++

++
++
*
++

NIL—A Perspective, ++ JonL White, Macsyma User’s Conference, 1979. ++

++
++
*
++

Performance and Evaluation of Lisp Programs, ++ Richard P. Gabriel, MIT Press (Cambridge, MA), 1985. ++

++
++
*
++

Principal Values and Branch Cuts in Complex APL, ++ Paul Penfield Jr., APL 81 Conference Proceedings, ++ ACM SIGAPL (San Francisco, September 1981), 248-256. ++ Proceedings published as APL Quote Quad 12, 1 (September 1981). ++

++
++
*
++

The Revised Maclisp Manual, ++ Kent M. Pitman, ++ Technical Report 295, ++ Laboratory for Computer Science, MIT (Cambridge, MA), May 1983. ++

++
++
*
++

Revised^3 Report on the Algorithmic Language Scheme, ++ Jonathan Rees and William Clinger (editors), ++ SIGPLAN Notices V21, #12, December, 1986. ++

++
++
*
++

S-1 Common Lisp Implementation, ++ R.A. Brooks, R.P. Gabriel, and G.L. Steele, ++ Conference Record of the 1982 ACM Symposium on Lisp and Functional Programming, ++ 108-113, 1982. ++

++
++
*
++

Smalltalk-80: The Language and its Implementation, ++ A. Goldberg and D. Robson, Addison-Wesley, 1983. ++

++
++
*
++

Standard LISP Report, ++ J.B. Marti, A.C. Hearn, M.L. Griss, and C. Griss, ++ SIGPLAN Notices V14, #10, October, 1979. ++

++
++
*
++

Webster’s Third New International Dictionary ++ the English Language, Unabridged, ++ Merriam Webster (Springfield, MA), 1986. ++

++
++
*
++

XP: A Common Lisp Pretty Printing System, ++ R.C. Waters, ++ Memo 1102a, ++ Artificial Intelligence Laboratory, MIT (Cambridge, MA), September 1989. ++

++
++
++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Reinitializing-an-Instance.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++Reinitializing an Instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects  

++
++
++

7.3 Reinitializing an Instance

++ ++ ++

The generic function reinitialize-instance may be used to change ++the values of slots according to initialization arguments. ++

++

The process of reinitialization changes the values of some slots and ++performs any user-defined actions. It does not modify the structure ++of an instance to add or delete slots, ++and it does not use any :initform forms to initialize slots. ++

++

The generic function reinitialize-instance may be called ++directly. It takes one required argument, the instance. It also ++takes any number of initialization arguments to be used by methods for ++reinitialize-instance or for shared-initialize. The ++arguments after the required instance must form an ++initialization argument list. ++

++

There is a system-supplied primary method for ++reinitialize-instance whose parameter specializer is ++the class standard-object. First this method checks the validity of ++initialization arguments and signals an error if an initialization ++argument is supplied that is not declared as valid. ++(For more information, see Declaring the Validity of Initialization Arguments.) ++Then it calls the generic function ++shared-initialize with the following arguments: the instance, ++nil, and the initialization arguments it received. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Relation-between-component-values-NIL-and-_002d_003eUNSPECIFIC.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Relation between component values NIL and ->UNSPECIFIC (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.10 Relation between component values NIL and :UNSPECIFIC

++ ++

If a pathname is converted to a namestring, ++the symbols nil and :unspecific ++cause the field to be treated as if it were empty. ++That is, ++both nil and :unspecific ++cause the component not to appear in the namestring. ++

++

However, when merging a pathname with a set of defaults, ++only a nil value for a component ++will be replaced with the default for that component, ++while a value of :unspecific ++will be left alone as if the field were “filled”; ++see the function merge-pathnames and Merging Pathnames. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Removed-Argument-Conventions.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Removed Argument Conventions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.4 Removed Argument Conventions

++ ++

The font argument to digit-char ++ ++ was removed. ++The bits and font arguments to code-char ++ ++

++

were removed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Removed-Language-Features.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Removed Language Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Appendix  

++
++
++

27.1 Removed Language Features

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Removed-Operators.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Removed Operators (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.3 Removed Operators

++ ++

The functions ++

++

int-char ++ ++, ++char-bits ++ ++, ++char-font ++ ++, ++make-char ++ ++, ++char-bit ++ ++, ++set-char-bit ++ ++, ++string-char-p ++ ++, ++

++

and ++commonp ++ ++

++

were removed. ++

++

The special operator compiler-let was removed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Removed-Reader-Syntax.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Removed Reader Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.6 Removed Reader Syntax

++ ++

The “#,reader macro in standard syntax was removed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Removed-Types.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Removed Types (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.2 Removed Types

++ ++

The type string-char ++ ++ was removed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Removed-Variables.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++Removed Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.5 Removed Variables

++ ++

The variables ++

++

char-font-limit ++ ++, ++char-bits-limit ++ ++, ++char-control-bit ++ ++, ++char-meta-bit ++ ++, ++char-super-bit ++ ++, ++char-hyper-bit ++ ++, ++

++

and *break-on-warnings* ++ ++

++

were removed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Required-Kinds-of-Specialized-Arrays.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Required Kinds of Specialized Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Specialized Arrays  

++
++
++

15.1.2.2 Required Kinds of Specialized Arrays

++ ++

Vectors whose elements are restricted to type ++

++

character or a subtype of character ++

++

are called strings ++ ++. ++Strings are of type string. ++Figure 15–2 lists some defined names related to strings. ++

++

Strings are specialized arrays ++and might logically have been included in this chapter. ++However, for purposes of readability ++most information about strings does not appear in this chapter; ++see instead Strings. ++

++
++
  char                string-equal         string-upcase  
++  make-string         string-greaterp      string/=       
++  nstring-capitalize  string-left-trim     string<        
++  nstring-downcase    string-lessp         string<=       
++  nstring-upcase      string-not-equal     string=        
++  schar               string-not-greaterp  string>        
++  string              string-not-lessp     string>=       
++  string-capitalize   string-right-trim                   
++  string-downcase     string-trim                         
++
++      Figure 15–2: Operators that Manipulate Strings     
++
++
++ ++

Vectors whose elements are restricted to type ++bit are called bit vectors ++ ++. ++Bit vectors are of type bit-vector. ++Figure 15–3 lists some defined names for operations on bit arrays. ++

++
++
  bit        bit-ior   bit-orc2  
++  bit-and    bit-nand  bit-xor   
++  bit-andc1  bit-nor   sbit      
++  bit-andc2  bit-not             
++  bit-eqv    bit-orc1            
++
++  Figure 15–3: Operators that Manipulate Bit Arrays
++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Required-Language-Features.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Required Language Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.1 Required Language Features

++ ++

A conforming implementation shall accept all features ++(including deprecated features) ++of the language specified in this standard, ++with the meanings defined in this standard. ++

++

A conforming implementation shall not require the inclusion of substitute ++or additional language elements in code in order to accomplish a feature of ++the language that is specified in this standard. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Requirements-for-removed-and-deprecated-features.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Requirements for removed and deprecated features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

27.1.1 Requirements for removed and deprecated features

++ ++

For this standard, ++ some features from the language described in Common Lisp: The Language have been removed, ++and others have been deprecated (and will most likely not appear ++in future Common Lisp standards). ++Which features were removed and which were deprecated ++was decided on a case-by-case basis by the X3J13 committee. ++

++

Conforming implementations that wish to retain any removed ++features for compatibility must assure that such compatibility ++does not interfere with the correct function of conforming programs. ++For example, symbols corresponding to the names of removed functions ++may not appear in the the COMMON-LISP package. ++(Note, however, that this specification has been devised in such a way ++that there can be a package named LISP which can contain such symbols.) ++

++

Conforming implementations must implement all deprecated features. ++For a list of deprecated features, see Deprecated Language Features. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Requiring-Non_002dNull-Rest-Parameters-in-The-_0022Syntax_0022-Section.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Requiring Non-Null Rest Parameters in The "Syntax" Section (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.27 Requiring Non-Null Rest Parameters in The "Syntax" Section

++ ++

In some cases it is useful to refer to all arguments equally as a single ++aggregation using a rest parameter while at the same time ++requiring at least one argument. A variety of imperative and ++declarative means are available in code for expressing such a ++restriction, however they generally do not manifest themselves in a ++lambda list. For descriptive purposes within this specification, ++

++

F &rest arguments^+ ++

++

means the same as ++

++

F &rest arguments ++

++

but introduces the additional requirement that there be ++at least one argument. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Resignaling-a-Condition.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Resignaling a Condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Signaling and Handling Conditions  

++
++
++

9.1.4.2 Resignaling a Condition

++ ++

During the dynamic extent of the signaling process for ++a particular condition object, ++signaling the same condition object again ++is permitted if and only if the situation represented in both ++cases are the same. ++

++

For example, a handler might legitimately signal ++the condition object that is its argument ++in order to allow outer handlers first opportunity to handle ++the condition. (Such a handlers is sometimes called a “default handler.”) ++This action is permitted because the situation which the second ++signaling process is addressing is really the same situation. ++

++

On the other hand, in an implementation that implemented asynchronous ++keyboard events by interrupting the user process with a call to signal, ++it would not be permissible for two distinct asynchronous keyboard events ++to signal identical condition objects ++at the same time for different ++situations. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Resolution-of-Apparent-Conflicts-in-Exceptional-Situations.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Resolution of Apparent Conflicts in Exceptional Situations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.5 Resolution of Apparent Conflicts in Exceptional Situations

++ ++

If more than one passage in this specification appears to apply to the ++same situation but in conflicting ways, the passage that appears ++to describe the situation in the most specific way (not necessarily the ++passage that provides the most constrained kind of error detection) ++takes precedence. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restart-Tests.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Restart Tests (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.4.6 Restart Tests

++ ++

Each restart has an associated test, which is a function of one ++argument (a condition or nil) which returns true if the restart ++should be visible in the current situation. This test is created by ++the :test-function option to restart-bind or ++the :test option to restart-case. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restarts.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++Restarts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.4.3 Restarts

++ ++

The interactive condition handler returns only through ++non-local transfer of control to specially defined restarts ++that can be set up either by the system or by user code. Transferring ++control to a restart is called “invoking” the restart. Like ++handlers, active restarts are established ++dynamically, and ++only active restarts ++can be invoked. An active ++restart can be invoked by the user from ++the debugger or by a program by using invoke-restart. ++

++

A restart contains a ++function to be called when the restart is ++invoked, an optional name that can be used to find or invoke the ++restart, and ++an optional set of interaction information for the debugger to use to ++enable the user to manually invoke a restart. ++

++

The name of a restart is ++used by invoke-restart. Restarts that can be invoked ++only within the debugger do not need names. ++

++

Restarts can be established by using restart-bind, ++restart-case, and with-simple-restart. ++A restart function can itself invoke any other restart ++that was active at the time of establishment of the restart ++of which the function is part. ++

++

The restarts established by ++ a restart-bind form, ++ a restart-case form, ++ or a with-simple-restart form ++have dynamic extent ++which extends for the duration of that form’s execution. ++

++

Restarts of the same name can be ordered from least recent to ++most recent according to the following two rules: ++

++
++
1.
++

Each restart in a set of active restarts ++R_1 is more recent than every restart in a ++set R_2 if the restarts ++in R_2 were active when the restarts in R_1 were ++established. ++

++
++
2.
++

Let r_1 and r_2 be two active restarts with ++the same name established by the same form. Then r_1 is ++more recent than r_2 if r_1 was defined to the ++left of r_2 in the form that established them. ++

++
++
++ ++

If a restart is invoked but does not transfer control, ++the values resulting from the restart function are ++returned by the function that invoked the restart, either ++invoke-restart or invoke-restart-interactively. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Composite-Streams.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Restrictions on Composite Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.1.4 Restrictions on Composite Streams

++ ++

The consequences are undefined if any component of a composite stream ++is closed before the composite stream is closed. ++

++

The consequences are undefined if the synonym stream symbol is not bound ++to an open stream from the time of the synonym stream’s creation ++until the time it is closed. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Constructing-Pathnames.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++Restrictions on Constructing Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.21 Restrictions on Constructing Pathnames

++ ++

When constructing a pathname from components, conforming programs ++ must follow these rules: ++

++
++
*
++

Any component can be nil. ++ nil in the host might mean a default host ++ rather than an actual nil in some implementations. ++

++
++
*
++

The host, device, directory, name, and type can be strings. There ++ are implementation-dependent limits on the number and type of ++ characters in these strings. ++

++
++
*
++

The directory can be a list of strings and symbols. ++ There are implementation-dependent limits on the list’s ++ length and contents. ++

++
++
*
++

The version can be :newest. ++

++
++
*
++

Any component can be taken ++ from the corresponding component of another pathname. ++ When the two pathnames are for different file systems ++ (in implementations that support multiple file systems), ++ an appropriate translation occurs. ++ If no meaningful translation is possible, ++ an error is signaled. ++ The definitions of “appropriate” and “meaningful” ++ are implementation-dependent. ++

++
++
*
++

An implementation might support other values for some components, ++ but a portable program cannot use those values. ++ A conforming program can use implementation-dependent values ++ but this can make it non-portable; ++ for example, it might work only with Unix file systems. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-Pathname-Components.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.12 Restrictions on Examining Pathname Components

++ ++

The space of possible objects that a conforming program ++must be prepared to read_1 ++as the value of a pathname component ++is substantially larger than the space of possible objects ++that a conforming program is permitted to write_1 ++into such a component. ++

++

While the values discussed ++ in the subsections of this section, ++ in Special Pathname Component Values, ++and in Restrictions on Wildcard Pathnames ++apply to values that might be seen when ++reading the component values, ++substantially more restrictive rules apply to constructing pathnames; ++see Restrictions on Constructing Pathnames. ++

++

When examining pathname components, ++conforming programs should be aware of the following restrictions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-a-Pathname-Device-Component.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining a Pathname Device Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.14 Restrictions on Examining a Pathname Device Component

++ ++

The device might be a string, ++:wild, :unspecific, or nil. ++

++

Note that :wild might result from an attempt to read_1 ++the pathname component, even though portable programs are restricted ++from writing_1 such a component value; ++see Restrictions on Wildcard Pathnames and Restrictions on Constructing Pathnames. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-a-Pathname-Directory-Component.html +@@ -0,0 +1,161 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining a Pathname Directory Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.15 Restrictions on Examining a Pathname Directory Component

++ ++

The directory might be a string, ++:wild, :unspecific, or nil. ++

++

The directory can be a list of strings and symbols. ++

++

The car of the list is one of the symbols :absolute ++ or ++:relative ++, meaning: ++

++
++
:absolute
++

A list whose car is the symbol :absolute represents ++ a directory path starting from the root directory. The list ++ (:absolute) represents the root directory. The list ++ (:absolute "foo" "bar" "baz") represents the directory called ++ "/foo/bar/baz" in Unix (except possibly for case). ++

++
++
:relative
++

A list whose car is the symbol :relative represents ++ a directory path starting from a default directory. ++ The list (:relative) has the same meaning as nil and hence is not used. ++ The list (:relative "foo" "bar") represents the directory named "bar" ++ in the directory named "foo" in the default directory. ++

++
++
++ ++

Each remaining element of the list is a string or a symbol. ++

++

Each string names a single level of directory structure. ++The strings should contain only the directory names ++themselves—no punctuation characters. ++

++

In place of a string, at any point in the list, symbols ++can occur to indicate special file notations. ++Figure 19–3 lists the symbols that have standard meanings. ++Implementations are permitted to add additional objects ++of any type that is disjoint from string ++if necessary to represent features of their file systems that cannot be ++represented with the standard strings and symbols. ++

++

Supplying any non-string, including any of the symbols listed below, ++to a file system for which it does not make sense ++signals an error of type file-error. ++For example, Unix does not support :wild-inferiors in most implementations. ++

++ ++ ++ ++ ++
++
  Symbol           Meaning                                             
++  :wild            Wildcard match of one level of directory structure  
++  :wild-inferiors  Wildcard match of any number of directory levels    
++  :up              Go upward in directory structure (semantic)         
++  :back            Go upward in directory structure (syntactic)        
++
++          Figure 19–3: Special Markers In Directory Component         
++
++
++ ++

The following notes apply to the previous figure: ++

++
++
Invalid Combinations
++

Using :absolute or :wild-inferiors ++immediately followed by :up or :back ++signals an error of type file-error. ++

++
++
Syntactic vs Semantic
++

“Syntactic” means that the action of :back ++depends only on the pathname ++and not on the contents of the file system. ++

++

“Semantic” means that the action of :up ++depends on the contents of the file system; ++to resolve a pathname containing ++:up to a pathname whose directory component ++contains only :absolute and ++strings requires probing the file system. ++

++

:up differs from ++:back only in file systems that support multiple ++ names for directories, perhaps via symbolic links. For example, ++ suppose that there is a directory ++(:absolute "X" "Y" "Z") ++ linked to ++(:absolute "A" "B" "C") ++ and there also exist directories ++(:absolute "A" "B" "Q") and ++(:absolute "X" "Y" "Q"). ++Then ++(:absolute "X" "Y" "Z" :up "Q") ++ designates ++(:absolute "A" "B" "Q") ++ while ++(:absolute "X" "Y" "Z" :back "Q") ++ designates ++(:absolute "X" "Y" "Q") ++

++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-a-Pathname-Host-Component.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining a Pathname Host Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.13 Restrictions on Examining a Pathname Host Component

++ ++

It is implementation-dependent what object is used to represent the host. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-a-Pathname-Name-Component.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining a Pathname Name Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.17 Restrictions on Examining a Pathname Name Component

++ ++

The name might be a string, ++:wild, :unspecific, or nil. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-a-Pathname-Type-Component.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining a Pathname Type Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.18 Restrictions on Examining a Pathname Type Component

++ ++

The type might be a string, ++:wild, :unspecific, or nil. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Examining-a-Pathname-Version-Component.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Restrictions on Examining a Pathname Version Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.19 Restrictions on Examining a Pathname Version Component

++ ++

The version can be any symbol or any integer. ++

++

The symbol :newest refers to the largest version number ++that already exists in the file system ++when reading, overwriting, appending, superseding, or directory listing ++an existing file. ++The symbol :newest refers to the smallest version number ++greater than any existing version number when creating a new file. ++

++

The symbols nil, :unspecific, and :wild have special meanings and ++restrictions; see Special Pathname Component Values and Restrictions on Constructing Pathnames. ++

++

Other symbols and integers ++have implementation-defined meaning. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Side_002dEffects.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Restrictions on Side-Effects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Overview of the Loop Facility  

++
++
++

6.1.1.16 Restrictions on Side-Effects

++ ++

See Traversal Rules and Side Effects. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Restrictions-on-Wildcard-Pathnames.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Restrictions on Wildcard Pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.11 Restrictions on Wildcard Pathnames

++ ++

Wildcard pathnames can be used with directory but not with ++ open, ++ and return true from wild-pathname-p. When examining ++ wildcard components of a wildcard pathname, conforming programs ++ must be prepared to encounter any of the following additional values ++ in any component or any element of a list that is the directory component: ++

++
++
*
++

The symbol :wild, which matches anything. ++

++
++
*
++

A string containing implementation-dependent ++ special wildcard characters. ++

++
++
*
++

Any object, ++ representing an implementation-dependent wildcard pattern. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Return-Values.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Return Values (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Evaluation  

++
++
++

3.1.7 Return Values

++ ++

Ordinarily the result of calling a function is a single object. ++Sometimes, however, it is convenient for a function to compute several ++objects and return them. ++

++

In order to receive other than exactly one value from a form, ++one of several special forms or macros must be used to request those ++values. If a form produces multiple values which were not ++requested in this way, then the first value is given to the caller and ++all others are discarded; if the form produces zero values, ++then the caller receives nil as a value. ++

++

Figure 3–5 lists ++some operators for receiving multiple values_2. ++These operators can be used to specify ++ one or more forms to evaluate ++and where to put the values returned by those forms. ++

++
++
  multiple-value-bind  multiple-value-prog1  return-from  
++  multiple-value-call  multiple-value-setq   throw        
++  multiple-value-list  return                             
++
++  Figure 3–5: Some operators applicable to receiving multiple values
++
++
++ ++

The function values can produce multiple values_2. ++(values) returns zero values; ++(values form) returns the primary value returned by form; ++(values form1 form2) returns two values, ++ the primary value of form1 ++and the primary value of form2; ++and so on. ++

++

See multiple-values-limit and values-list. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Return-values-in-The-_0022Syntax_0022-Section.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Return values in The "Syntax" Section (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.28 Return values in The "Syntax" Section

++ ++

An evaluation arrow “⇒” precedes a list of values to be returned. ++For example: ++

++

F a b cx ++

++

indicates that F is an operator that has three required parameters ++(i.e., a, b, and c) and that returns one value (i.e., x). ++If more than one value is returned by an operator, the names of the ++values are separated by commas, as in: ++

++

F a b cx, y, z ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Right_002dParenthesis.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Right-Parenthesis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++
++

2.4.2 Right-Parenthesis

++ ++

The right-parenthesis is invalid ++except when used in conjunction with the left parenthesis character. ++For more information, see Reader Algorithm. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Canonical-Representation-for-Complex-Rationals.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Rule of Canonical Representation for Complex Rationals (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.5.3 Rule of Canonical Representation for Complex Rationals

++ ++

If the result of any computation would be a complex ++number whose real part is of type rational and whose imaginary ++part is zero, the result is converted to the rational ++which is the real part. ++This rule does not apply to complex numbers whose parts ++are floats. ++For example, #C(5 0) and 5 are not different objects in Common Lisp ++(they are always the same under eql); ++#C(5.0 0.0) and 5.0 are always different objects in Common Lisp ++(they are never the same under eql, ++although they are the same under equalp and =). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Canonical-Representation-for-Rationals.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++Rule of Canonical Representation for Rationals (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.3.2 Rule of Canonical Representation for Rationals

++ ++

If any computation produces a result that is a mathematical ratio of two integers ++such that the denominator evenly divides the numerator, then the result is converted ++to the equivalent integer. ++

++

If the denominator does not evenly divide the numerator, ++the canonical representation of a rational number is as the ratio ++that numerator and that denominator, where the greatest common divisor of ++the numerator and denominator is one, and where the denominator is positive ++and greater than one. ++

++

When used as input (in the default syntax), ++the notation -0 always denotes the integer 0. ++A conforming implementation must not have a ++representation of “minus zero” for integers ++that is distinct from its representation of zero for integers. ++However, such a distinction is possible for floats; ++see the type float. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Complex-Contagion.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Rule of Complex Contagion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.5.2 Rule of Complex Contagion

++ ++

When a ++

++

real ++

++

and ++a complex are both part of a computation, ++the ++

++

real ++

++

is first converted to a complex by providing an imaginary part of 0. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Complex-Substitutability.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Rule of Complex Substitutability (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.5.1 Rule of Complex Substitutability

++ ++

Except during the execution of irrational and transcendental functions, ++no numerical function ever yields a complex unless ++one or more of its arguments is a complex. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Float-Approximation.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Rule of Float Approximation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.4.3 Rule of Float Approximation

++ ++

Computations with floats are only approximate, ++although they are described as if the results ++were mathematically accurate. ++Two mathematically identical ++expressions may be computationally different because of errors ++inherent in the floating-point approximation process. ++The precision of a float is not necessarily ++correlated with the accuracy of that number. ++For instance, 3.142857142857142857 is a more precise approximation ++to \pi than 3.14159, but the latter is more accurate. ++The precision refers to the number of bits retained in the representation. ++When an operation combines a short float with a ++long float, ++the result will be a long float. ++Common Lisp functions assume that the accuracy of ++arguments to them does not exceed their precision. Therefore ++when two small floats ++are combined, the result is a small float. ++Common Lisp functions ++never convert automatically from a larger size to a smaller one. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Float-Precision-Contagion.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Rule of Float Precision Contagion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.4.5 Rule of Float Precision Contagion

++ ++

The result of a numerical function is a float of the ++largest format among all the floating-point arguments to the function. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Float-Substitutability.html +@@ -0,0 +1,116 @@ ++ ++ ++ ++ ++ ++Rule of Float Substitutability (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.3.3 Rule of Float Substitutability

++ ++

When the arguments to an irrational mathematical function ++

++

[Reviewer Note by Barmar: There should be a table of these functions.] ++are all rational and the true mathematical result ++is also (mathematically) rational, then unless otherwise noted ++an implementation is free to return either an accurate ++rational result ++or a single float approximation. ++If the arguments are all rational ++but the result cannot be expressed ++as a rational number, then a single float ++approximation is always returned. ++

++

If the arguments to a mathematical function are all of type ++ (or rational (complex rational)) ++and the true mathematical result is ++ (mathematically) a complex number with rational real and imaginary ++ parts, then unless otherwise noted an implementation is free to return ++ either an accurate result of type (or rational (complex rational)) ++or ++ a single float ++ (permissible only if the imaginary part of the true mathematical ++ result is zero) or (complex single-float). If the arguments are ++ all of type (or rational (complex rational)) ++but the result cannot be ++ expressed as a rational or complex rational, ++then the returned ++ value will be of type single-float ++(permissible only if the imaginary ++ part of the true mathematical result is zero) or (complex single-float). ++

++
++
  Function  Sample Results                                   
++  abs       (abs #c(3 4)) ⇒  5 or 5.0                       
++  acos      (acos 1) ⇒  0 or 0.0                            
++  acosh     (acosh 1) ⇒  0 or 0.0                           
++  asin      (asin 0) ⇒  0 or 0.0                            
++  asinh     (asinh 0) ⇒  0 or 0.0                           
++  atan      (atan 0) ⇒  0 or 0.0                            
++  atanh     (atanh 0) ⇒  0 or 0.0                           
++  cis       (cis 0) ⇒  #c(1 0) or #c(1.0 0.0)               
++  cos       (cos 0) ⇒  1 or 1.0                             
++  cosh      (cosh 0) ⇒  1 or 1.0                            
++  exp       (exp 0) ⇒  1 or 1.0                             
++  expt      (expt 8 1/3) ⇒  2 or 2.0                        
++  log       (log 1) ⇒  0 or 0.0                             
++            (log 8 2) ⇒  3 or 3.0                           
++  phase     (phase 7) ⇒  0 or 0.0                           
++  signum    (signum #c(3 4)) ⇒  #c(3/5 4/5) or #c(0.6 0.8)  
++  sin       (sin 0) ⇒  0 or 0.0                             
++  sinh      (sinh 0) ⇒  0 or 0.0                            
++  sqrt      (sqrt 4) ⇒  2 or 2.0                            
++            (sqrt 9/16) ⇒  3/4 or 0.75                      
++  tan       (tan 0) ⇒  0 or 0.0                             
++  tanh      (tanh 0) ⇒  0 or 0.0                            
++
++  Figure 12–8: Functions Affected by Rule of Float Substitutability
++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Float-Underflow-and-Overflow.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Rule of Float Underflow and Overflow (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.4.4 Rule of Float Underflow and Overflow

++ ++

An error of type floating-point-overflow ++or floating-point-underflow should be signaled if a ++floating-point computation causes exponent overflow or underflow, respectively. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Float-and-Rational-Contagion.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Rule of Float and Rational Contagion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.4.1 Rule of Float and Rational Contagion

++ ++

When rationals and floats are combined by a numerical function, ++the rational is first converted to a float of the same format. ++For functions such as + that take more than two arguments, ++it is permitted that part of the operation be carried out exactly using ++rationals and the rest be done using floating-point arithmetic. ++

++

When rationals and floats are compared by a numerical function, ++the function rational is effectively called to convert the float ++to a rational and then an exact ++comparison is performed. In the case of complex numbers, ++the real and imaginary parts are effectively handled individually. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rule-of-Unbounded-Rational-Precision.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Rule of Unbounded Rational Precision (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.3.1 Rule of Unbounded Rational Precision

++ ++

Rational computations cannot overflow in the usual sense ++(though there may not be enough storage to represent a result), ++since integers and ratios may in principle be of any magnitude. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rules-about-Test-Functions.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Rules about Test Functions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences  

++
++
++

17.2 Rules about Test Functions

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Rules-for-Initialization-Arguments.html +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++Rules for Initialization Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.4 Rules for Initialization Arguments

++ ++

The :initarg slot option may be specified more than ++once for a given slot. ++

++

The following rules specify when initialization arguments may be ++multiply defined: ++

++
++
*
++

A given initialization argument can be used to ++initialize more than one slot if the same initialization argument name ++appears in more than one :initarg slot option. ++

++
++
*
++

A given initialization argument name can appear ++in the lambda list of more than one initialization method. ++

++
++
*
++

A given initialization argument name can ++appear both in an :initarg slot option and ++in the lambda list ++of an initialization method. ++

++
++
++ ++

[Reviewer Note by The next three paragraphs could be replaced by “If two or more ++initialization arguments that initialize the same slot appear in the ++defaulted initialization argument list, the leftmost of these supplies ++the value, even if they have different names.” And the rest would follow ++from the rules above.] ++

++

If two or more initialization arguments that initialize the same ++slot are given in the arguments to make-instance, the ++leftmost of these initialization arguments in the initialization ++argument list supplies the value, even if the initialization arguments ++have different names. ++

++

If two or more different initialization arguments that initialize the ++same slot have default values and none is given explicitly in the ++arguments to make-instance, the initialization argument that ++appears in a :default-initargs class option in the most specific ++of the classes supplies the value. If a single ++:default-initargs class option specifies two or more initialization ++arguments that initialize the same slot and none is given ++explicitly in the arguments to make-instance, the leftmost in ++the :default-initargs class option supplies the value, and the ++values of the remaining default value forms are ignored. ++

++

Initialization arguments given explicitly in the arguments to ++make-instance appear to the left of defaulted initialization ++arguments. Suppose that the classes C_1 and C_2 supply the ++values of defaulted initialization arguments for different slots, ++and suppose that C_1 is more specific than C_2; then the ++defaulted initialization argument whose value is supplied by C_1 ++is to the left of the defaulted initialization argument whose value is ++supplied by C_2 in the defaulted initialization argument ++list. If a single :default-initargs class option supplies the ++values of initialization arguments for two different slots, the ++initialization argument whose value is specified farther to the left in ++the :default-initargs class option appears farther to the left in ++the defaulted initialization argument list. ++

++

[Reviewer Note by Barmar: End of claim made three paragraphs back.] ++

++

If a slot has both an :initform form and an ++:initarg slot option, and the initialization argument is defaulted ++using :default-initargs or is supplied to make-instance, ++the captured :initform form is neither used nor evaluated. ++

++

The following is an example of the above rules: ++

++
++
 (defclass q () ((x :initarg a)))
++ (defclass r (q) ((x :initarg b))
++   (:default-initargs a 1 b 2))
++
++ ++
++
++
                            Defaulted                                     
++ Form                         Initialization Argument List Contents of Slot X 
++ _____________________________________________________________________________
++ (make-instance 'r)           (a 1 b 2)                    1                  
++ (make-instance 'r 'a 3)      (a 3 b 2)                    3                  
++ (make-instance 'r 'b 4)      (b 4 a 1)                    4                  
++ (make-instance 'r 'a 1 'a 2) (a 1 a 2 b 2)                1                  
++
++
++
++
++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Safe-and-Unsafe-Calls.html +@@ -0,0 +1,164 @@ ++ ++ ++ ++ ++ ++Safe and Unsafe Calls (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.1 Safe and Unsafe Calls

++ ++

A call is a safe call ++ ++ if each of the following is ++either safe code or system code (other than ++system code that results from macro expansion of ++programmer code): ++

++
*
++

the call. ++

++
*
++

the definition of the function being called. ++

++
*
++

the point of functional evaluation ++

++
++ ++

The following special cases require some elaboration: ++

++
++
*
++

If the function being called is a generic function, ++it is considered safe if all of the following are ++

++

safe code or system code: ++

++
++
++

its definition (if it was defined explicitly). ++

++
++

the method definitions for all applicable methods. ++

++
++

the definition of its method combination. ++

++
++ ++
++
*
++

For the form (coerce x 'function), ++where x is a lambda expression, ++the value of the optimize quality safety ++in the global environment at the time the coerce ++is executed applies to the resulting function. ++

++
++
*
++

For a call to the function ensure-generic-function, the value of the ++optimize quality safety in the environment ++object passed as the :environment argument applies ++to the resulting generic function. ++

++
++
*
++

For a call to compile with a lambda expression as the ++argument, the value of the optimize quality safety ++in the global environment at the time compile is called ++applies to the resulting compiled function. ++

++
++
*
++

For a call to compile with only one argument, if the original definition ++of the function was safe, then the resulting compiled function ++must also be safe. ++

++
++
*
++

A call to a method by call-next-method must be ++considered safe if each of the following is ++

++

safe code or system code: ++

++
++
++

the definition of the generic function (if it was defined explicitly). ++

++
++

the method definitions for all applicable methods. ++

++
++

the definition of the method combination. ++

++
++

the point of entry into the body of the method defining form, ++ where the binding of call-next-method is established. ++

++
++

the point of functional evaluation of the name call-next-method. ++

++
++ ++
++
++ ++

An unsafe call ++ ++ is a call that is not a safe call. ++

++

The informal intent is that the programmer can rely on a call ++to be safe, even when system code is involved, if all reasonable ++steps have been taken to ensure that the call is safe. ++For example, if a programmer calls mapcar from safe ++code and supplies a function that was compiled ++as safe, the implementation is required to ensure that ++mapcar makes a safe call as well. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Satisfying-a-One_002dArgument-Test.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++Satisfying a One-Argument Test (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

17.2.2 Satisfying a One-Argument Test

++ ++

When using one of the functions in Figure 17–3, ++the elements E of a sequence S are filtered ++not on the basis of the presence or absence of an object O ++under a two argument predicate, ++as with the functions described in Satisfying a Two-Argument Test, ++but rather on the basis of a one argument predicate. ++

++
++
  assoc-if       member-if           rassoc-if          
++  assoc-if-not   member-if-not       rassoc-if-not      
++  count-if       nsubst-if           remove-if          
++  count-if-not   nsubst-if-not       remove-if-not      
++  delete-if      nsubstitute-if      subst-if           
++  delete-if-not  nsubstitute-if-not  subst-if-not       
++  find-if        position-if         substitute-if      
++  find-if-not    position-if-not     substitute-if-not  
++
++  Figure 17–3: Operators that have One-Argument Tests to be Satisfied
++
++
++ ++

The element E_i might not be considered directly. ++If a :key argument is provided, ++it is a designator for a function of one argument ++to be called with each E_i as an argument, ++and yielding an object Z_i to be used for comparison. ++(If there is no :key argument, Z_i is E_i.) ++

++

Functions defined in this specification and having a name that ++ends in “-if” accept a first argument that is a designator for a ++function of one argument, Z_i. ++An E_i is said to satisfy the test ++ ++ if this :test function ++returns a generalized boolean representing true. ++

++

Functions defined in this specification and having a name that ++ends in “-if-not” accept a first argument that is a designator for a ++function of one argument, Z_i. ++An E_i is said to satisfy the test ++ ++ if this :test function ++returns a generalized boolean representing false. ++

++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Satisfying-a-Two_002dArgument-Test.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++Satisfying a Two-Argument Test (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

17.2.1 Satisfying a Two-Argument Test

++ ++

When an object O is being considered iteratively ++against each element E_i ++of a sequence S ++by an operator F listed in Figure 17–2, ++it is sometimes useful to control the way in which the presence of O ++is tested in S is tested by F. ++This control is offered on the basis of a function designated with ++either a :test or :test-not argument. ++

++
++
  adjoin           nset-exclusive-or  search            
++  assoc            nsublis            set-difference    
++  count            nsubst             set-exclusive-or  
++  delete           nsubstitute        sublis            
++  find             nunion             subsetp           
++  intersection     position           subst             
++  member           pushnew            substitute        
++  mismatch         rassoc             tree-equal        
++  nintersection    remove             union             
++  nset-difference  remove-duplicates                    
++
++  Figure 17–2: Operators that have Two-Argument Tests to be Satisfied
++
++
++ ++

The object O might not be compared directly to E_i. ++If a :key argument is provided, ++it is a designator for a function of one argument ++to be called with each E_i as an argument, ++and yielding an object Z_i to be used for comparison. ++(If there is no :key argument, Z_i is E_i.) ++

++

The function designated by the :key argument is never called on O itself. ++However, if the function operates on multiple sequences ++(e.g., as happens in set-difference), O ++will be the result of calling the :key function on an ++element of the other sequence. ++

++

A :test argument, if supplied to F, ++is a designator for a function ++of two arguments, O and Z_i. ++An E_i is said (or, sometimes, an O and an E_i are said) ++to satisfy the test ++ ++

++

if this :test function returns a generalized boolean representing ++true. ++

++

A :test-not argument, if supplied to F, ++is designator for a function ++of two arguments, O and Z_i. ++An E_i is said (or, sometimes, an O and an E_i are said) ++to satisfy the test ++ ++

++

if this :test-not function ++returns a generalized boolean representing false. ++

++

If neither a :test nor a :test-not argument is supplied, ++it is as if a :test argument of #'eql was supplied. ++

++

The consequences are unspecified if both a :test and a :test-not argument ++are supplied in the same call to F. ++

++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Scope-and-Purpose.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Scope and Purpose (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Scope  

++
++
++

1.1.1 Scope and Purpose

++ ++

The specification set forth in this document is designed to promote ++the portability of Common Lisp programs among a variety of data processing ++systems. It is a language specification aimed at an audience of ++implementors and knowledgeable programmers. It is neither a tutorial nor ++an implementation guide. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Scope.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Scope (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.1 Scope, Purpose, and History

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Seconds.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Seconds (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Time  

++
++
++

25.1.4.4 Seconds

++ ++

One function, sleep, takes its argument as a non-negative real number ++of seconds. Informally, it may be useful to think of this as ++a relative universal time, but it differs in one important way: ++universal times are always non-negative integers, whereas the argument to ++sleep can be any kind of non-negative real, in order to allow for ++the possibility of fractional seconds. ++

++
++
  sleep    
++
++  Figure 25–8: Defined names involving time in Seconds.
++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sections-Not-Formally-Part-Of-This-Standard.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Sections Not Formally Part Of This Standard (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.3 Sections Not Formally Part Of This Standard

++ ++

Front matter and back matter, such as the “Table of Contents,” ++“Index,” “Figures,” “Credits,” and “Appendix” are not considered formally ++part of this standard, so that we retain the flexibility needed to update ++these sections even at the last minute without fear of needing a formal ++vote to change those parts of the document. These items are quite short ++and very useful, however, and it is not recommended that they be removed ++even in an abridged version of this document. ++

++

Within the concept sections, subsections whose names begin with ++the words “Note” or “Notes” or “Example” or “Examples” ++are provided for illustration purposes only, and are not considered ++part of the standard. ++

++

An attempt has been made to place these sections last in their parent section, ++so that they could be removed without disturbing the contiguous numbering of the ++surrounding sections in order to produce a document of smaller size. ++

++

Likewise, the “Examples” and “Notes” sections in a dictionary entry ++are not considered part of the standard and could be removed if necessary. ++

++

Nevertheless, the examples provide important clarifications and consistency ++checks for the rest of the material, and such abridging is not recommended ++unless absolutely unavoidable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Selecting-the-Applicable-Methods.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Selecting the Applicable Methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.2 Selecting the Applicable Methods

++ ++

This step is described in Introduction to Methods. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Self_002dEvaluating-Objects.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++Self-Evaluating Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2.12 Self-Evaluating Objects

++ ++

A form that is neither a symbol nor a cons is ++defined to be a self-evaluating object. Evaluating ++such an object yields the same object ++as a result. ++

++

Certain specific symbols and conses might also happen ++to be “self-evaluating” but only as a special case of a more ++general set of rules for the evaluation of symbols and ++conses; such objects are not considered to be ++self-evaluating objects. ++

++

The consequences are undefined if literal objects (including ++self-evaluating objects) are destructively modified. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Semantic-Constraints.html +@@ -0,0 +1,171 @@ ++ ++ ++ ++ ++ ++Semantic Constraints (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Compilation Semantics  

++
++
++

3.2.2.7 Semantic Constraints

++ ++

All conforming programs must obey the following constraints, ++which are designed to minimize the observable differences ++between compiled and interpreted programs: ++

++
++
*
++

Definitions of any referenced macros ++must be present in the compilation environment. ++Any form that is a list ++beginning with a symbol that does not name a ++special operator or a macro defined in the ++compilation environment is treated by the compiler as a ++function call. ++

++
++
*
++

Special proclamations for dynamic variables ++must be made in the compilation environment. Any binding ++for which there is no special declaration or proclamation in ++the compilation environment is treated by the compiler as ++a lexical binding. ++

++
++
*
++

The definition of a function that is defined and ++declared inline in the compilation environment must be ++the same at run time. ++

++
++
*
++

Within a function named F, the compiler may ++(but is not required to) ++assume that an apparent recursive call to a function named F ++refers to the same definition of F, ++unless that function has been declared notinline. ++The consequences of redefining such a recursively defined function F ++while it is executing are undefined. ++

++
++
*
++

A call within a file to a named function that is ++defined in the same file refers to that function, unless that function ++has been declared notinline. The consequences are unspecified ++if functions are redefined individually at run time or multiply ++defined in the same file. ++

++
++
*
++

The argument syntax and number of return values for ++all functions whose ftype is declared at compile time must ++remain the same at run time. ++

++
++
*
++

Constant variables defined in ++the compilation environment must have a similar value at ++run time. A reference to ++a constant variable ++in source code is equivalent to a reference to ++a literal object that is the value of the constant variable. ++

++
++
*
++

Type definitions made with deftype or ++defstruct in the compilation environment must ++retain the same definition at run time. Classes defined by defclass ++in the compilation environment must be defined ++at run time to have the same superclasses and same ++metaclass. ++

++

This implies that subtype/supertype relationships of ++type specifiers must not change between compile time and run time. ++

++
++
*
++

Type declarations present in the compilation ++environment must accurately describe the corresponding values at run time; ++otherwise, the consequences are undefined. It is permissible ++for an unknown type to appear in a declaration at ++compile time, though a warning might be signaled in such a case. ++

++
++
*
++

Except in the situations explicitly listed above, a ++function defined in the evaluation environment ++is permitted to have a different definition or a different signature ++at run time, and the run-time definition prevails. ++

++
++
++ ++

Conforming programs should not be written using any additional ++assumptions about consistency between the run-time ++environment and the startup, evaluation, and compilation ++environments. ++

++

Except where noted, when a compile-time and a run-time definition are ++different, one of the following occurs at run time: ++

++
++
*
++

an error of type error is signaled ++

++
*
++

the compile-time definition prevails ++

++
*
++

the run-time definition prevails ++

++
++
++ ++

If the compiler processes a function form whose operator ++is not defined at compile time, no error is signaled at compile time. ++

++
++
++

++Previous: , Up: Compilation Semantics  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Semicolon.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++
++

2.4.4 Semicolon

++ ++

Syntax: ;<<text>> ++

++

A semicolon introduces characters that are to be ignored, ++such as comments. The semicolon and all characters up to ++and including the next newline or end of file are ignored. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sequence-Concepts.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++Sequence Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences  

++
++
++

17.1 Sequence Concepts

++ ++ ++

A sequence ++ ++ is an ordered collection of elements, ++implemented as either a vector or a list. ++

++

Sequences can be created by the function make-sequence, ++as well as other functions that create objects ++of types that are subtypes of sequence ++(e.g., list, make-list, mapcar, and vector). ++

++

A sequence function ++ ++ is a function ++ defined by this specification ++or added as an extension by the implementation ++that operates on one or more sequences. ++Whenever a sequence function must construct and return ++a new vector, it always returns a simple vector. ++Similarly, any strings constructed will be simple strings. ++

++
++
  concatenate        length              remove             
++  copy-seq           map                 remove-duplicates  
++  count              map-into            remove-if          
++  count-if           merge               remove-if-not      
++  count-if-not       mismatch            replace            
++  delete             notany              reverse            
++  delete-duplicates  notevery            search             
++  delete-if          nreverse            some               
++  delete-if-not      nsubstitute         sort               
++  elt                nsubstitute-if      stable-sort        
++  every              nsubstitute-if-not  subseq             
++  fill               position            substitute         
++  find               position-if         substitute-if      
++  find-if            position-if-not     substitute-if-not  
++  find-if-not        reduce                                 
++
++        Figure 17–1: Standardized Sequence Functions       
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sequences-Dictionary.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Sequences Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Sequences  

++
++
++

17.3 Sequences Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sequences.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Sequences (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

17 Sequences

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Serious-Conditions.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Serious Conditions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Condition Types  

++
++
++

9.1.1.1 Serious Conditions

++ ++

A serious condition is a condition serious ++enough to require interactive intervention if not handled. ++Serious conditions are typically signaled with error or cerror; ++non-serious conditions are typically signaled with signal or warn. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Setf-Expansions-and-Places.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Setf Expansions and Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.6 Setf Expansions and Places

++ ++

Any compound form for which the operator has a ++

++

setf expander ++

++

defined can be used as a place. ++

++

The ++operator ++must refer to the global function definition, ++rather than a locally defined function or macro. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Setf-Expansions.html +@@ -0,0 +1,119 @@ ++ ++ ++ ++ ++ ++Setf Expansions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.1.3 Setf Expansions

++ ++

Sometimes it is possible to avoid evaluating subforms of a ++place multiple times or in the wrong order. A ++

++

setf expansion ++

++

for a given access form can be expressed as an ordered collection of five objects: ++

++
++
List of temporary variables
++

a list of symbols naming temporary variables to be bound ++sequentially, as if by let*, to values ++resulting from value forms. ++

++
++
List of value forms
++

a list of forms (typically, subforms of the ++place) which when evaluated ++yield the values to which the corresponding temporary ++variables should be bound. ++

++
++
List of store variables
++

a list of symbols naming temporary store variables which are ++to hold the new values that will be assigned to the ++place. ++

++
++
Storing form
++

a form which can reference both the temporary and the store variables, ++and which changes the value of the place ++and guarantees to return as its values the values of the store variables, ++which are the correct values for setf to return. ++

++
++
Accessing form
++

a form which can reference the temporary variables, ++and which returns the value of the place. ++

++
++ ++

The value returned by the accessing form is ++affected by execution of the storing form, but either of these ++forms might be evaluated any number of times. ++

++

It is possible ++to do more than one setf in parallel via ++psetf, shiftf, and rotatef. ++Because of this, the ++

++

setf expander ++

++

must produce new temporary ++and store variable names every time. For examples of how to do this, ++see gensym. ++

++

For each standardized accessor function F, ++unless it is explicitly documented otherwise, ++it is implementation-dependent whether the ability to ++use an F form as a setf place ++is implemented by a setf expander or a setf function. ++Also, it follows from this that it is implementation-dependent ++whether the name (setf F) is fbound. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Shadowing.html +@@ -0,0 +1,144 @@ ++ ++ ++ ++ ++ ++Shadowing (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation  

++
++
++

3.1.5 Shadowing

++ ++

If two forms that establish lexical bindings with ++the same name N are textually nested, then references to N ++within the inner form refer to the binding established by ++the inner form; the inner binding for N ++shadows ++ ++ the outer binding for N. Outside the inner ++form but inside the outer one, references to N refer to the ++binding established by the outer form. For example: ++

++
++
 (defun test (x z)
++   (let ((z (* x 2)))
++     (print z))
++   z)
++
++ ++

The binding of the variable z by ++let shadows ++the parameter binding for the function test. The reference to the ++variable z in the print form refers to the let binding. ++The reference to z at the end of the function test ++refers to the parameter named z. ++

++

Constructs that are lexically scoped act as if new names were ++generated for each object on each execution. Therefore, ++dynamic shadowing cannot occur. For example: ++

++
++
 (defun contorted-example (f g x)
++   (if (= x 0)
++       (funcall f)
++       (block here
++          (+ 5 (contorted-example g
++                                  #'(lambda () (return-from here 4))
++                                  (- x 1))))))
++
++ ++

Consider the call (contorted-example nil nil 2). This produces ++4. During the course of execution, there are three ++calls to contorted-example, interleaved with two ++blocks: ++

++
++
 (contorted-example nil nil 2)
++   (block here_1 ...)
++     (contorted-example nil #'(lambda () (return-from here_1 4)) 1)
++       (block here_2 ...)
++         (contorted-example #'(lambda () (return-from here_1 4))
++                            #'(lambda () (return-from here_2 4))
++                            0)
++             (funcall f)
++                    where f ⇒  #'(lambda () (return-from here_1 4))
++                 (return-from here_1 4)
++
++ ++

At the time the funcall is executed ++there are two block exit points outstanding, each apparently ++named here. ++The return-from form executed as a result of the funcall ++operation ++refers to the outer outstanding exit point ++(here_1), not the ++inner one (here_2). ++It ++refers to that exit point textually visible at the point of ++execution of function ++(here abbreviated by the #' syntax) that resulted ++in creation of the function object actually invoked by ++funcall. ++

++

If, in this example, one were to change the (funcall f) to ++(funcall g), then the value of the call (contorted-example nil nil 2) ++would be 9. The value would change because ++funcall would cause the ++execution of (return-from here_2 4), thereby causing ++a return from the inner exit point (here_2). ++When that occurs, the value 4 is returned from the ++middle invocation of contorted-example, 5 is added to that ++to get 9, and that value is returned from the outer block ++and the outermost call to contorted-example. The point ++is that the choice of exit point ++returned from has nothing to do with its ++being innermost or outermost; rather, ++it depends on the lexical environment ++that is packaged up with a lambda expression when ++function is executed. ++

++
++
++

++Next: , Previous: , Up: Evaluation  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Shared_002dInitialize.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++Shared-Initialize (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.1.5 Shared-Initialize

++ ++

The generic function shared-initialize is used to fill the ++slots ++of an instance ++using initialization arguments and :initform ++forms when an instance is created, when an ++instance is re-initialized, ++when an instance ++is updated to conform to a redefined class, and when ++an instance is updated to conform to a different class. ++It uses ++standard method combination. It takes the following arguments: the ++instance to be initialized, a ++specification of a set of names of slots ++accessible in that instance, and any number of initialization ++arguments. The arguments after the first two must form an ++initialization argument list. ++

++

The second argument to shared-initialize may be one of the following: ++

++
++
*
++

It can be a (possibly empty) list of slot names, ++which specifies the set of those slot names. ++

++
++
*
++

It can be the symbol t, which specifies the set of all of the slots. ++

++
++
++ ++

There is a system-supplied primary method for shared-initialize ++whose first parameter specializer is the class standard-object. ++This method behaves as follows on each slot, ++whether shared or local: ++

++
++
*
++

If an initialization argument in the ++initialization argument list specifies a value for that slot, ++that value is stored ++into the slot, even if a value has already been stored in the slot ++before the method is run. ++The affected slots are independent of which ++slots are indicated by the second argument to shared-initialize. ++

++
++
*
++

Any slots ++indicated by the second argument that are still ++unbound at this point are initialized according to their ++:initform forms. For any such slot ++that has an :initform form, ++that form is evaluated in the ++lexical environment of its defining ++defclass form and the result is stored into the slot. ++For example, ++if a before method stores a value in the ++slot, the :initform form will not be used to supply a value ++for the slot. If ++the second argument specifies a name that does not correspond to any ++slots accessible ++in the instance, the results are unspecified. ++

++
++
*
++

The rules mentioned in Rules for Initialization Arguments are obeyed. ++

++
++
++ ++

The generic function shared-initialize is called by the ++system-supplied primary methods ++for reinitialize-instance, ++update-instance-for-different-class, ++update-instance-for-redefined-class, and ++initialize-instance. Thus, methods can be written for ++shared-initialize to specify actions that should be taken in all of ++these contexts. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-A.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++Sharpsign A (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.13 Sharpsign A

++ ++

#nA ++

++

#nAobject constructs an n-dimensional array, ++using object as the value of the :initial-contents argument ++to make-array. ++

++

For example, #2A((0 1 5) (foo 2 (hot dog))) represents a 2-by-3 matrix: ++

++
++
 0       1       5
++ foo     2       (hot dog)
++
++ ++

In contrast, #1A((0 1 5) (foo 2 (hot dog))) ++represents a vector of length 2 ++whose elements are lists: ++

++
++
 (0 1 5) (foo 2 (hot dog))
++
++ ++

#0A((0 1 5) (foo 2 (hot dog))) represents a zero-dimensional ++array whose sole element is a list: ++

++
++
 ((0 1 5) (foo 2 (hot dog)))
++
++ ++

#0A foo represents ++a zero-dimensional array whose sole element is the ++symbol foo. ++The notation #1A foo is not valid because foo is ++not a sequence. ++

++

If some dimension of the array ++whose representation is being parsed is found to be 0, ++all dimensions to the right ++(i.e., the higher numbered dimensions) ++are also considered to be 0. ++

++

For information on how the Lisp printer prints arrays, ++see Printing Strings, ++ Printing Bit Vectors, ++ Printing Other Vectors, ++ or Printing Other Arrays. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Asterisk.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++Sharpsign Asterisk (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8.4 Sharpsign Asterisk

++ ++

Syntax: #*<<bits>> ++

++

A simple bit vector is constructed containing the indicated bits ++(0’s and 1’s), where the leftmost bit has index zero ++and the subsequent bits have increasing indices. ++

++

Syntax: #<<n>>*<<bits>> ++

++

With an argument n, ++the vector to be created is of length n. ++If the number of bits is less than n but greater than zero, ++the last bit is used to fill all remaining bits of the bit vector. ++

++

The notations #* and #0* each denote an empty bit vector. ++

++

Regardless of whether the optional numeric argument n is provided, ++the token that follows the asterisk is delimited by ++a normal token delimiter. ++However, (unless the value of *read-suppress* is true) ++an error of type reader-error is signaled ++ if that token is not composed entirely of 0’s and 1’s, ++ or if n was supplied ++ and the token is composed of more than n bits, ++ or if n is greater than one, but no bits were specified. ++Neither a single escape nor a multiple escape is permitted in this token. ++

++

For information on how the Lisp printer prints bit vectors, ++see Printing Bit Vectors. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-B.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Sharpsign B (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.8 Sharpsign B

++ ++

#Brational reads rational in binary (radix 2). ++For example, ++

++
++
 #B1101 ≡ 13 ;1101_2
++ #b101/11 ≡ 5/3
++
++ ++

The consequences are undefined if the token immediately following ++the #B does not have the syntax of a binary (i.e., radix 2) rational. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Backslash.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++Sharpsign Backslash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.1 Sharpsign Backslash

++ ++

Syntax: #\<<x>> ++

++

When the token x is a single character long, ++this parses as the literal character char. ++Uppercase and lowercase letters are distinguished after #\; ++#\A and #\a denote different character objects. ++Any single character works after #\, ++even those that are normally special to read, ++such as left-parenthesis and right-parenthesis. ++

++

In the single character case, ++the x must be followed by a non-constituent character. ++After #\ is read, ++the reader backs up over the slash and then reads a token, ++treating the initial slash as a single escape character ++(whether it really is or not in the current readtable). ++

++

When the token x is more than one character long, ++the x must have the syntax of a symbol ++with no embedded package markers. ++In this case, the sharpsign backslash notation ++parses as the character whose name is (string-upcase x); ++see Character Names. ++

++

For information about how the Lisp printer prints character objects, ++see Printing Characters. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-C.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Sharpsign C (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.12 Sharpsign C

++ ++

#C reads a following object, which must be a list of ++length two whose elements are both reals. ++These reals denote, respectively, ++the real and imaginary parts of a complex number. ++

++

If the two parts as notated are not of the same data type, ++then they are converted ++according to the rules of floating-point contagion ++described in Contagion in Numeric Operations. ++

++

#C(real imag) is equivalent to ++#.(complex (quote real) (quote imag)), ++except that #C is not affected by *read-eval*. ++See the function complex. ++

++

Figure 2–21 contains examples of the use of #C. ++

++
++
  #C(3.0s1 2.0s-1)  ;A complex with small float parts.                
++  #C(5 -3)          ;A “Gaussian integer”                             
++  #C(5/3 7.0)       ;Will be converted internally to #C(1.66666 7.0)  
++  #C(0 1)           ;The imaginary unit; that is, i.                  
++
++                  Figure 2–21: Complex Number Example                
++
++
++ ++

For further information, ++see Printing Complexes and Syntax of a Complex. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Colon.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Sharpsign Colon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.6 Sharpsign Colon

++ ++

Syntax: #:<<symbol-name>> ++

++

#: introduces an uninterned symbol whose name ++is symbol-name. Every time this syntax is encountered, ++a distinct uninterned symbol is created. ++The symbol-name must have the syntax of a symbol ++with no package prefix. ++

++

For information on how the Lisp reader ++prints uninterned symbols, ++see Printing Symbols. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Dot.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++Sharpsign Dot (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.7 Sharpsign Dot

++ ++

#.foo is read as the object resulting from the evaluation ++of the object represented by foo. ++The evaluation is done during the read process, ++when the #. notation is encountered. ++The #. syntax therefore performs a read-time evaluation of foo. ++

++

The normal effect of #. is inhibited when the value of *read-eval* is false. ++

++

In that situation, an error of type reader-error is signaled. ++

++

For an object ++that does not have a convenient printed ++representation, a form that computes the object can be given using ++the #. notation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Equal_002dSign.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Sharpsign Equal-Sign (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.16 Sharpsign Equal-Sign

++ ++

#n= ++

++

#n=object reads as whatever object ++has object as its printed representation. However, that object ++is labeled by n, a required unsigned decimal integer, for ++possible reference by the syntax #n#. ++The scope of the label is the expression being read by the outermost ++call to read; within this expression, ++the same label may not appear twice. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Left_002dParenthesis.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++Sharpsign Left-Parenthesis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.3 Sharpsign Left-Parenthesis

++ ++

#( and ) are used to notate a simple vector. ++

++

If an unsigned decimal integer ++appears between the # and (, ++it specifies explicitly the length of the vector. ++The consequences are undefined if the number of objects ++specified before the closing ) ++exceeds the unsigned decimal integer. ++If the number of objects supplied before the closing ) ++is less than the unsigned decimal integer but greater than zero, ++the last object ++is used to fill all ++remaining elements of the vector. ++

++

[Editorial Note by Barmar: This should say "signals...".] ++The consequences are undefined if the unsigned decimal integer is non-zero and ++number of objects supplied before the closing ) ++is zero. ++For example, ++

++
++
 #(a b c c c c)
++ #6(a b c c c c)
++ #6(a b c)
++ #6(a b c c)
++
++ ++

all mean the same thing: a vector of length 6 ++with elements a, b, and four occurrences of c. ++Other examples follow: ++

++
++
 #(a b c)               ;A vector of length 3
++ #(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47)
++                        ;A vector containing the primes below 50
++ #()                    ;An empty vector
++
++ ++

The notation #() denotes an empty vector, as does #0(). ++

++

For information on how the Lisp printer prints vectors, ++see Printing Strings, ++ Printing Bit Vectors, ++ or Printing Other Vectors. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Less_002dThan_002dSign.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Sharpsign Less-Than-Sign (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8.23 Sharpsign Less-Than-Sign

++ ++

#< is not valid reader syntax. ++The Lisp reader will signal an error ++

++

of type reader-error ++

++

on encountering #<. ++This syntax is typically used in the printed representation ++of objects that cannot be read back in. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Minus.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Sharpsign Minus (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.19 Sharpsign Minus

++ ++

#- is like #+ ++except that it skips the expression if the test succeeds; ++that is, ++

++
++
#-test expression ≡ #+(not test) expression
++
++ ++

For examples, see Examples of Feature Expressions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-O.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Sharpsign O (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.9 Sharpsign O

++ ++

#Orational reads rational in octal (radix 8). ++For example, ++

++
++
 #o37/15 ≡ 31/13
++ #o777 ≡ 511
++ #o105 ≡ 69 ;105_8
++
++ ++

The consequences are undefined if the token immediately following ++the #O does not have the syntax of an octal (i.e., radix 8) rational. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-P.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Sharpsign P (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.15 Sharpsign P

++ ++

#P reads a following object, which must be a string. ++

++

#P<<expression>> is equivalent to ++#.(parse-namestring '<<expression>>), ++except that #P is not affected by *read-eval*. ++

++

For information on how the Lisp printer prints pathnames, ++see Printing Pathnames. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Plus.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Sharpsign Plus (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.18 Sharpsign Plus

++ ++

#+ provides a read-time conditionalization facility; ++the syntax is #+test expression. ++If the feature expression test succeeds, ++then this textual notation represents an object ++ whose printed representation is expression. ++If the feature expression test fails, ++then this textual notation is treated as whitespace_2; ++ that is, it is as if the “#+ test expression” ++ did not appear and only a space appeared in its place. ++

++

For a detailed description of success and failure in feature expressions, ++see Feature Expressions. ++

++

#+ operates by first reading the feature expression ++and then skipping over the form if the feature expression fails. ++

++

While reading the test, the current package is the KEYWORD package. ++

++

Skipping over the form is accomplished by binding ++*read-suppress* to true and then calling read. ++

++

For examples, see Examples of Feature Expressions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-R.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++Sharpsign R (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.11 Sharpsign R

++ ++

#nR ++

++

#radixRrational reads rational in radix radix. ++radix must consist of only digits ++that are interpreted as an integer ++in decimal radix; its value must be between 2 and 36 (inclusive). ++Only valid digits ++for the specified radix may be used. ++

++

For example, #3r102 is another way of writing 11 (decimal), ++and #11R32 ++is another way of writing 35 (decimal). ++For radices larger than 10, letters of ++the alphabet are used in order for the digits after 9. ++No alternate # notation exists for the decimal radix since a ++decimal point suffices. ++

++

Figure 2–20 contains examples of the use of #B, ++#O, #X, and #R. ++

++
++
  #2r11010101  ;Another way of writing 213 decimal  
++  #b11010101   ;Ditto                               
++  #b+11010101  ;Ditto                               
++  #o325        ;Ditto, in octal radix               
++  #xD5         ;Ditto, in hexadecimal radix         
++  #16r+D5      ;Ditto                               
++  #o-300       ;Decimal -192, written in base 8     
++  #3r-21010    ;Same thing in base 3                
++  #25R-7H      ;Same thing in base 25               
++  #xACCEDED    ;181202413, in hexadecimal radix     
++
++        Figure 2–20: Radix Indicator Example       
++
++
++ ++

The consequences are undefined if the token immediately following ++the #nR does not have the syntax of a rational in radix n. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Right_002dParenthesis.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Sharpsign Right-Parenthesis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Sharpsign  

++
++
++

2.4.8.25 Sharpsign Right-Parenthesis

++ ++

This is not valid reader syntax. ++

++

The Lisp reader will signal an error ++

++

of type reader-error ++

++

upon encountering #). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-S.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++Sharpsign S (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.14 Sharpsign S

++ ++

#s(name slot1 value1 slot2 value2 ...) ++denotes a structure. This is valid only if name is the name ++of a structure type already defined by defstruct ++and if the structure type has a standard constructor function. ++Let cm stand for the name of this constructor function; ++then this syntax is equivalent to ++

++
++
 #.(cm keyword1 'value1 keyword2 'value2 ...)
++
++ ++

where each keywordj is the result of computing ++

++
++
 (intern (string slotj) (find-package 'keyword))
++
++ ++

The net effect is that the constructor function is called with the specified ++slots having the specified values. ++

++

(This coercion feature is deprecated; in the future, keyword names will ++ be taken in the package they are read in, so symbols that are ++ actually in the KEYWORD package should be used if that is what is desired.) ++

++

Whatever object the constructor function returns ++is returned by the #S syntax. ++

++

For information on how the Lisp printer prints structures, ++see Printing Structures. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Sharpsign.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Sharpsign Sharpsign (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.17 Sharpsign Sharpsign

++ ++

#n# ++

++

#n#, where n is a required unsigned decimal ++integer, ++provides a reference to some object labeled by #n=; ++that is, #n# represents a pointer to the same ++(eq) object labeled by #n=. ++For example, a structure created in the variable y by this code: ++

++
++
 (setq x (list 'p 'q))
++ (setq y (list (list 'a 'b) x 'foo x))
++ (rplacd (last y) (cdr y))
++
++ ++

could be represented in this way: ++

++
++
 ((a b) . #1=(#2=(p q) foo #2# . #1#))
++
++ ++

Without this notation, but with *print-length* set to 10 ++and *print-circle* set to nil, ++the structure would print in this way: ++

++
++
 ((a b) (p q) foo (p q) (p q) foo (p q) (p q) foo (p q) ...)
++
++ ++

A reference #n# may only occur after a label #n=; ++forward references are not permitted. The reference ++may not appear as the labeled object itself (that is, ++#n=#n#) may not be written ++because the object ++labeled by #n= is not well defined in this case. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Single_002dQuote.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Sharpsign Single-Quote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.2 Sharpsign Single-Quote

++ ++

Any expression preceded by #' ++(sharpsign followed by single-quote), ++as in #'expression, ++is treated by the Lisp reader as an abbreviation for and parsed identically ++to the expression (function expression). ++See function. For example, ++

++
++
(apply #'+ l) ≡ (apply (function +) l)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Vertical_002dBar.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Sharpsign Vertical-Bar (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8.20 Sharpsign Vertical-Bar

++ ++

#|...|# is treated as a comment by the reader. ++It must be balanced with respect to other occurrences of #| and |#, ++but otherwise may contain any characters whatsoever. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-Whitespace.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Sharpsign Whitespace (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8.24 Sharpsign Whitespace

++ ++

# followed immediately by whitespace_1 is not valid reader syntax. ++The Lisp reader will signal an error of type reader-error if it ++encounters the reader macro notation #<Newline> or #<Space>. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign-X.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Sharpsign X (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sharpsign  

++
++
++

2.4.8.10 Sharpsign X

++ ++

#Xrational reads rational in hexadecimal (radix 16). ++The digits above 9 are the letters A through F (the lowercase ++letters a through f are also acceptable). For example, ++

++
++
 #xF00 ≡ 3840             
++ #x105 ≡ 261 ;105_16
++
++ ++

The consequences are undefined if the token immediately following ++the #X does not have the syntax of a hexadecimal (i.e., radix 16) rational. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sharpsign.html +@@ -0,0 +1,185 @@ ++ ++ ++ ++ ++ ++Sharpsign (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.8 Sharpsign

++ ++

Sharpsign is a non-terminating dispatching macro character. ++It reads an optional ++sequence of digits and then one more character, ++and uses that character to select a function to run as a ++reader macro function. ++

++

The standard syntax includes constructs introduced by the # character. ++The syntax of these constructs is as follows: ++a character that identifies the type of construct is ++followed by arguments in some form. ++If the character is a letter, its case is not important; ++#O and #o are considered to be equivalent, for example. ++

++

Certain # constructs allow an unsigned decimal number to appear ++between the # and the character. ++

++

The reader macros associated with the dispatching macro character # ++are described later in this section and summarized in Figure 2–19. ++

++ ++ ++
++
  dispatch char  purpose                  dispatch char  purpose                
++  Backspace      signals error            {              undefined*             
++  Tab            signals error            }              undefined*             
++  Newline        signals error            +              read-time conditional  
++  Linefeed       signals error            -              read-time conditional  
++  Page           signals error            .              read-time evaluation   
++  Return         signals error            /              undefined              
++  Space          signals error            A, a           array                  
++  !              undefined*               B, b           binary rational        
++  "              undefined                C, c           complex number         
++  #              reference to = label     D, d           undefined              
++  $             undefined                E, e           undefined              
++  %              undefined                F, f           undefined              
++  &              undefined                G, g           undefined              
++  ’              function abbreviation    H, h           undefined              
++  (              simple vector            I, i           undefined              
++  )              signals error            J, j           undefined              
++  *              bit vector               K, k           undefined              
++  ,              undefined                L, l           undefined              
++  :              uninterned symbol        M, m           undefined              
++  ;              undefined                N, n           undefined              
++  <              signals error            O, o           octal rational         
++  =              labels following object  P, p           pathname               
++  >              undefined                Q, q           undefined              
++  ?              undefined*               R, r           radix-n rational       
++  @              undefined                S, s           structure              
++  [              undefined*               T, t           undefined              
++  \              character object         U, u           undefined              
++  ]              undefined*               V, v           undefined              
++  ^            undefined                W, w           undefined              
++  _              undefined                X, x           hexadecimal rational   
++  ‘              undefined                Y, y           undefined              
++  |              balanced comment         Z, z           undefined              
++  ~              undefined                Rubout         undefined              
++
++           Figure 2–19: Standard # Dispatching Macro Character Syntax         
++
++
++ ++ ++

The combinations marked by an asterisk (*) are explicitly reserved to the ++user. No conforming implementation defines them. ++

++

Note also that digits do not appear in the preceding table. This is ++because the notations #0, #1, ..., #9 are ++reserved for another purpose which occupies the same syntactic space. ++When a digit follows a sharpsign, ++it is not treated as a dispatch character. ++Instead, an unsigned integer argument is accumulated ++and passed as an argument to the reader macro ++for the character that follows the digits. ++For example, ++#2A((1 2) (3 4)) is a use of #A with an argument of 2. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Shorthand-notation-for-Type-Declarations.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Shorthand notation for Type Declarations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.3.3.1 Shorthand notation for Type Declarations

++ ++

A type specifier can be used as a declaration identifier. ++(type-specifier {var}*) is taken as shorthand for ++(type type-specifier {var}*). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Signaling-and-Handling-Conditions.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++Signaling and Handling Conditions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Condition System Concepts  

++
++
++

9.1.4 Signaling and Handling Conditions

++ ++

The operation of the condition system depends on the ordering of ++active applicable handlers from most recent to least recent. ++

++

Each handler is associated with a type specifier ++that must designate a subtype of type condition. A handler ++is said to be applicable to a condition if that ++condition is of the type designated by the associated ++type specifier. ++

++

Active handlers are established by using ++handler-bind (or an abstraction based on handler-bind, ++such as handler-case or ignore-errors). ++

++

Active handlers can be established within the ++dynamic scope of other active handlers. ++At any point during program execution, there is a set of active handlers. ++When a condition is signaled, the most recent active applicable handler ++for that condition is selected from this set. ++Given a condition, the order of recentness of ++active applicable handlers is defined by the following two rules: ++

++
++
1.
++

Each handler in a set of active handlers H_1 is ++more recent than every handler in a set H_2 if the ++handlers in H_2 were active when the handlers in H_1 were ++established. ++

++
++
2.
++

Let h_1 and h_2 be two applicable active ++handlers established by the same form. Then h_1 is ++more recent than h_2 if h_1 was defined to the left of ++h_2 in the form that established them. ++

++
++
++ ++

Once a handler in a handler binding form (such as ++handler-bind or handler-case) has been selected, all ++handlers in that form become inactive for ++the remainder of the signaling process. ++While the selected handler runs, no other handler established ++by that form is active. That is, if the handler declines, ++no other handler established by that form will be considered for possible invocation. ++

++

Figure 9–4 shows operators relating to ++the handling of conditions. ++

++
++
  handler-bind  handler-case  ignore-errors  
++
++  Figure 9–4: Operators relating to handling conditions.
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: Condition System Concepts  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Signaling.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Signaling (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.1.4.1 Signaling

++ ++

When a condition is signaled, the most recent ++applicable active handler is invoked. ++Sometimes a handler will decline by simply returning ++without a transfer of control. ++In such cases, the next most recent applicable active handler is ++invoked. ++

++

If there are no applicable handlers for a condition that ++has been signaled, or if all applicable handlers decline, the ++condition is unhandled. ++

++

The functions cerror and error invoke the ++interactive condition handler (the debugger) rather than ++return if the condition being signaled, regardless of ++its type, is unhandled. In contrast, signal ++returns nil if the condition being signaled, ++regardless of its type, is unhandled. ++

++

The variable *break-on-signals* can be used to cause the ++debugger to be entered before the signaling process begins. ++

++

Figure 9–5 shows defined names relating to ++the signaling of conditions. ++

++
++
  *break-on-signals*  error   warn  
++  cerror              signal        
++
++  Figure 9–5: Defined names relating to signaling conditions.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Similarity-of-Aggregate-Objects.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Similarity of Aggregate Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4.3 Similarity of Aggregate Objects

++ ++

Of the types over which similarity is defined, ++some are treated as aggregate objects. For these types, ++similarity is defined recursively. ++We say that an object of these types has certain “basic qualities” ++and to satisfy the similarity relationship, the values of the ++corresponding qualities of the two objects must also be similar. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Similarity-of-Literal-Objects.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Similarity of Literal Objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.4.2 Similarity of Literal Objects

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Simple-Loop.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Simple Loop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.2 Simple Loop

++ ++

A simple loop form is one that has a body containing ++only compound forms. ++Each form is evaluated in turn from left to right. ++When the last form has been evaluated, ++then the first form is evaluated again, and so on, in a never-ending cycle. ++A simple loop form establishes an implicit block named nil. ++The execution of a simple loop can be terminated by explicitly ++transfering control to the implicit block (using return or ++return-from) or to some exit point outside of the block ++(e.g., using throw, go, or return-from). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Simple-vs-Extended-Loop.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Simple vs Extended Loop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.1 Simple vs Extended Loop

++ ++

loop forms are partitioned into two categories: ++ simple loop forms ++ and extended loop forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Single-Escape-Character.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Single Escape Character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.7 Single Escape Character

++ ++

A single escape ++ ++ is used to indicate that ++the next character is to be treated as ++an alphabetic_2 character ++with its case preserved, ++no matter what the character is ++or which constituent traits it has. ++

++

Slash is a single escape character ++in standard syntax. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Single_002dQuote.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Single-Quote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Standard Macro Characters  

++
++
++

2.4.3 Single-Quote

++ ++

Syntax: '<<exp>> ++

++

A single-quote introduces an expression to be “quoted.” ++Single-quote followed by an expression exp ++is treated by the Lisp reader as an abbreviation for ++and is parsed identically to the expression (quote exp). ++See the special operator quote. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Slots.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Slots (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects  

++
++
++

7.5 Slots

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Some-Exceptions-to-Constraints-on-the-COMMON_002dLISP-Package-for-Conforming-Programs.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.4 Some Exceptions to Constraints on the COMMON-LISP Package for Conforming Programs

++ ++

If an external symbol of the COMMON-LISP package ++is not globally defined as a standardized dynamic variable ++ or constant variable, ++it is allowed to lexically bind it ++ and to declare the type of that binding, ++and ++it is allowed to locally establish it as a symbol macro ++(e.g., with symbol-macrolet). ++

++

Unless explicitly specified otherwise, ++if an external symbol of the COMMON-LISP package ++is globally defined as a standardized dynamic variable, ++it is permitted to bind or assign that dynamic variable ++provided that the “Value Type” constraints on the dynamic variable ++are maintained, and that the new value of the variable ++is consistent with the stated purpose of the variable. ++

++

If an external symbol of the COMMON-LISP package is not defined ++as a standardized function, macro, or special operator, ++it is allowed to lexically bind it as a function (e.g., with flet), ++ to declare the ftype of that binding, ++ and ++ (in implementations which provide the ability to do so) ++ to trace that binding. ++

++

If an external symbol of the COMMON-LISP package is not defined ++as a standardized function, macro, or special operator, ++it is allowed to lexically bind it as a macro (e.g., with macrolet). ++

++

If an external symbol of the COMMON-LISP package is not defined ++as a standardized function, macro, or special operator, ++it is allowed to lexically bind its setf function name ++as a function, ++and to declare the ftype of that binding. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Sorting-the-Applicable-Methods-by-Precedence-Order.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Sorting the Applicable Methods by Precedence Order (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.3 Sorting the Applicable Methods by Precedence Order

++ ++

To compare the precedence of two methods, their parameter specializers ++are examined in order. The default examination order is from left to ++right, but an alternative order may be specified by the ++:argument-precedence-order option to defgeneric or to any of ++the other operators that specify generic function options. ++

++

The corresponding parameter specializers from each method are ++compared. When a pair of parameter specializers agree, the next ++pair are compared for agreement. If all corresponding parameter ++specializers agree, the two methods must have different ++qualifiers; in this case, either method can be selected to precede the ++other. For information about agreement, see Agreement on Parameter Specializers and Qualifiers. ++

++

If some corresponding parameter specializers do not agree, the first ++pair of parameter specializers that do not agree determines the ++precedence. If both parameter specializers are classes, the more ++specific of the two methods is the method whose parameter specializer ++appears earlier in the class precedence list of the corresponding ++argument. Because of the way in which the set of applicable methods ++is chosen, the parameter specializers are guaranteed to be present in ++the class precedence list of the class of the argument. ++

++

If just one of a pair of corresponding parameter specializers is (eql object), ++the method with that parameter specializer precedes the ++other method. If both parameter specializers are eql ++expressions, the ++specializers must agree (otherwise the two methods would ++not both have been applicable to this argument). ++

++

The resulting list of applicable methods has the most specific ++method first and the least specific method last. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Special-Characters-in-Pathname-Components.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Special Characters in Pathname Components (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.2 Special Characters in Pathname Components

++ ++

Strings in pathname component values ++never contain special characters that represent ++separation between pathname fields, ++such as slash in Unix filenames. ++Whether separator characters are permitted as ++part of a string in a pathname component ++is implementation-defined; ++however, if the implementation does permit it, ++it must arrange to properly “quote” the character for the ++file system when constructing a namestring. ++For example, ++

++
++
 ;; In a TOPS-20 implementation, which uses ^V to quote 
++ (NAMESTRING (MAKE-PATHNAME :HOST "OZ" :NAME "<TEST>"))
++⇒  #P"OZ:PS:^V<TEST^V>"
++NOT⇒ #P"OZ:PS:<TEST>"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Special-Forms.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Special Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++
++

3.1.2.8 Special Forms

++ ++

A special form is a form with special syntax, ++special evaluation rules, or both, possibly manipulating the ++evaluation environment, control flow, or both. ++A special operator has access to ++ the current lexical environment ++and the current dynamic environment. ++Each special operator defines the manner in which its subexpressions ++are treated—which are forms, which are special syntax, etc. ++

++

Some special operators create new ++lexical or dynamic environments for use during the ++evaluation of subforms ++of the special form. For example, block creates a ++new lexical environment that is the same as the one in force ++at the point of evaluation of the block form ++with the addition of a binding of the block name ++to an exit point from the block. ++

++

The set of special operator names is fixed in Common Lisp; ++no way is provided for the user to define a special operator. ++Figure 3–2 lists all of the Common Lisp symbols ++that have definitions as special operators. ++

++
++
  block      let*                  return-from      
++  catch      load-time-value       setq             
++  eval-when  locally               symbol-macrolet  
++  flet       macrolet              tagbody          
++  function   multiple-value-call   the              
++  go         multiple-value-prog1  throw            
++  if         progn                 unwind-protect   
++  labels     progv                                  
++  let        quote                                  
++
++      Figure 3–2: Common Lisp Special Operators    
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Special-Pathname-Component-Values.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Special Pathname Component Values (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.6 Special Pathname Component Values

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Special-Symbols.html +@@ -0,0 +1,202 @@ ++ ++ ++ ++ ++ ++Special Symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.6 Special Symbols

++ ++

The special symbols described here are used as a notational convenience ++within this document, and are part of neither the Common Lisp language nor ++its environment. ++

++
++
++

This indicates evaluation. ++For example: ++

++
++
 (+ 4 5) ⇒  9 
++
++ ++

This means that the result of ++evaluating the form (+ 4 5) is 9. ++

++

If a form returns multiple values, those values might ++be shown separated by spaces, line breaks, or commas. ++For example: ++

++
++
 (truncate 7 5)
++⇒  1 2
++ (truncate 7 5) 
++⇒  1
++   2
++ (truncate 7 5)
++⇒  1, 2
++
++ ++

Each of the above three examples is equivalent, and specifies ++that (truncate 7 5) returns two values, which are 1 and 2. ++

++

Some conforming implementations actually type an arrow (or some ++other indicator) before showing return values, while others do not. ++

++
++
OR
++

The notation “OR⇒” is used to denote one of several possible ++alternate results. The example ++

++
++
 (char-name #\a)
++⇒  NIL
++OR⇒ "LOWERCASE-a"
++OR⇒ "Small-A"
++OR⇒ "LA01"
++
++ ++

indicates that nil, "LOWERCASE-a", "Small-A", "LA01" are ++among the possible results of (char-name #\a)—each with equal preference. ++Unless explicitly specified otherwise, it should not be assumed that the set of possible ++results shown is exhaustive. ++Formally, the above example is equivalent to ++

++
++
 (char-name #\a) ⇒  implementation-dependent
++
++ ++

but it is intended to provide additional information to illustrate some ++of the ways in which it is permitted for implementations to diverge. ++

++
++
NOT
++

The notation “NOT⇒” is used to denote a result which is not possible. ++This might be used, for example, in order to emphasize a situation where ++some anticipated misconception might lead the reader to falsely believe ++that the result might be possible. For example, ++

++
++
 (function-lambda-expression 
++    (funcall #'(lambda (x) #'(lambda () x)) nil))
++⇒  NIL, true, NIL
++OR⇒ (LAMBDA () X), true, NIL
++NOT⇒ NIL, false, NIL
++NOT⇒ (LAMBDA () X), false, NIL
++
++ ++
++
++

This indicates code equivalence. For example: ++

++
++
 (gcd x (gcd y z)) ≡ (gcd (gcd x y) z)
++
++ ++

This means that the results and observable side-effects of evaluating ++the form ++(gcd x (gcd y z)) are always the same as the results ++and observable side-effects of ++(gcd (gcd x y) z) for any ++x, y, and z. ++

++
++
|>
++

Common Lisp specifies input and output with respect to a non-interactive stream model. ++The specific details of how interactive input and output are mapped onto that ++non-interactive model are implementation-defined. ++

++

For example, conforming implementations are permitted to differ in issues ++of how interactive input is terminated. For example, the function read ++terminates when the final delimiter is typed on a non-interactive stream. ++In some implementations, an interactive call to read returns ++as soon as the final delimiter is typed, even if that delimiter is not a newline. ++In other implementations, a final newline is always required. ++In still other implementations, there might be a command which “activates” ++a buffer full of input without the command itself being visible on the program’s ++input stream. ++

++

In the examples in this document, the notation “ |> ” precedes ++lines where interactive input and output occurs. Within such a scenario, ++“|>>this notation<<|” notates user input. ++

++

For example, the notation ++

++
++
 (+ 1 (print (+ (sqrt (read)) (sqrt (read)))))
++ |>  |>>9 16 <<|
++ |>  7
++⇒  8
++
++ ++

shows an interaction in which ++ “(+ 1 (print (+ (sqrt (read)) (sqrt (read)))))” ++ is a form to be evaluated, ++ “9 16 ” is interactive input, ++ “7” is interactive output, and ++ “8” is the value yielded from the evaluation. ++

++

The use of this notation is intended to disguise small differences ++in interactive input and output behavior between implementations. ++

++

Sometimes, the non-interactive stream model calls for a newline. ++How that newline character is interactively entered is an ++implementation-defined detail of the user interface, but in that ++case, either the notation “<Newline>” or “[<–~]” might be used. ++

++
++
 (progn (format t "~&Who? ") (read-line))
++ |>  Who? |>>Fred, Mary, and Sally [<–~]<<|
++⇒  "Fred, Mary, and Sally", false
++
++ ++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Special-_0022Syntax_0022-Notations-for-Overloaded-Operators.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Special "Syntax" Notations for Overloaded Operators (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.25 Special "Syntax" Notations for Overloaded Operators

++ ++

If two descriptions exist for the same operation but with different numbers of ++arguments, then the extra arguments are to be treated as optional. For example, ++this pair of lines: ++

++

file-position streamposition ++

++

file-position stream position-specsuccess-p ++

++

is operationally equivalent to this line: ++

++

file-position stream &optional position-specresult ++

++

and differs only in that it provides on opportunity to introduce different ++names for parameter and values for each case. ++The separated (multi-line) notation is used when an operator is overloaded in ++such a way that the parameters are used in different ways ++depending on how many arguments are supplied (e.g., for the function /) ++or the return values are different in the two cases (e.g., for the function file-position). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Specialized-Arrays.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Specialized Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Array Concepts  

++
++
++

15.1.2 Specialized Arrays

++ ++

An array can be a general array, ++ meaning each element may be any object, ++or it may be a specialized array, ++ meaning that each element must be of a restricted type. ++

++

The phrasing “an array specialized to type <<type>>” ++is sometimes used to emphasize the element type of an array. ++This phrasing is tolerated even when the <<type>> is t, ++even though an array specialized to type t ++is a general array, not a specialized array. ++

++

Figure 15–1 lists some defined names that are applicable to array ++creation, access, and information operations. ++

++
++
 adjust-array             array-in-bounds-p      svref                       
++ adjustable-array-p       array-rank             upgraded-array-element-type 
++ aref                     array-rank-limit       upgraded-complex-part-type  
++ array-dimension          array-row-major-index  vector                      
++ array-dimension-limit    array-total-size       vector-pop                  
++ array-dimensions         array-total-size-limit vector-push                 
++ array-element-type       fill-pointer           vector-push-extend          
++ array-has-fill-pointer-p make-array                                         
++
++           Figure 15–1: General Purpose Array-Related Defined Names          
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Specialized-Lambda-Lists.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Specialized Lambda Lists (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.3 Specialized Lambda Lists

++ ++

A specialized lambda list ++ ++ is used to specialize a method ++for a particular signature and to describe how arguments matching ++that signature are received by the method. ++The defined names in Figure 3–15 use specialized lambda lists ++in some way; see the dictionary entry for each for information about how. ++

++
++
  defmethod  defgeneric    
++
++  Figure 3–15: Standardized Operators that use Specialized Lambda Lists
++
++
++ ++

A specialized lambda list can contain the lambda list keywords shown ++in Figure 3–16. ++

++
++
  &allow-other-keys  &key       &rest  
++  &aux               &optional         
++
++  Figure 3–16: Lambda List Keywords used by Specialized Lambda Lists
++
++
++ ++

A specialized lambda list is syntactically the same as an ordinary lambda list ++except that each required parameter may optionally be associated with a class ++or object for which that parameter is specialized. ++

++

lambda-list ::=({var | (var [specializer])}* ++                [&optional {var |         (var [init-form [supplied-p-parameter]])}*] ++                [&rest var] ++                [&key {var |              ({var |          (keyword-name var)}    [init-form [supplied-p-parameter]])}* [&allow-other-keys]] ++                [&aux {var | (var [init-form])}*]) ++                ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Specifiers-for-_0026aux-variables.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++Specifiers for &aux variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.7 Specifiers for &aux variables

++ ++ ++ ++

These are not really parameters. If the lambda list keyword ++&aux is present, all specifiers after it are auxiliary variable ++specifiers. After all parameter specifiers have been processed, the ++auxiliary variable specifiers (those following &aux) are processed ++from left to right. For each one, init-form is evaluated and ++var is bound to that value (or to nil if no init-form ++was specified). &aux variable processing is analogous to ++let* processing. ++

++
++
 (lambda (x y &aux (a (car x)) (b 2) c) (list x y a b c))
++    ≡ (lambda (x y) (let* ((a (car x)) (b 2) c) (list x y a b c)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Specifiers-for-keyword-parameters.html +@@ -0,0 +1,140 @@ ++ ++ ++ ++ ++ ++Specifiers for keyword parameters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.4 Specifiers for keyword parameters

++ ++

If &key ++is present, all specifiers up to the next lambda list keyword ++or the end of the list are keyword parameter specifiers. ++When keyword parameters are processed, ++the same arguments are processed that ++would be made into a list for a rest parameter. ++It is permitted to specify both &rest and &key. ++In this case the remaining arguments are used for both purposes; ++that is, all remaining arguments are made into a list for the ++rest parameter, and are also processed for the &key parameters. ++

++

If &key is specified, there must remain ++an even number of arguments; see Odd Number of Keyword Arguments. ++

++

These arguments are considered as pairs, ++the first argument in each pair being interpreted as a name ++and the second as the corresponding value. ++The first object of each pair must be a symbol; ++see Invalid Keyword Arguments. ++The keyword parameter specifiers may optionally be followed by the ++lambda list keyword &allow-other-keys. ++

++

In each keyword parameter specifier must be a name var for ++the parameter variable. ++

++

If the var appears alone or in a (var init-form) ++combination, the keyword name used when matching arguments to parameters ++is a symbol in the KEYWORD package whose name is the ++same (under string=) as var’s. ++If the notation ((keyword-name var) init-form) is used, ++then the keyword name used to match arguments to parameters is ++keyword-name, which may be a symbol in any package. ++(Of course, if it is not a symbol in the KEYWORD package, ++it does not necessarily self-evaluate, so care must be taken when calling the function ++to make sure that normal evaluation still yields the keyword name.) ++

++

Thus ++

++
++
 (defun foo (&key radix (type 'integer)) ...)
++
++ ++

means exactly the same as ++

++
++
 (defun foo (&key ((:radix radix)) ((:type type) 'integer)) ...)
++
++ ++

The keyword parameter specifiers are, like all parameter specifiers, ++effectively processed from left to right. For each keyword parameter ++specifier, if there is an argument pair whose name matches that ++specifier’s name (that is, the names are eq), then the ++parameter variable for that specifier is bound to the second item (the ++value) of that argument pair. If more than one such argument pair ++matches, the leftmost argument pair is used. If no such argument pair ++exists, then the init-form for that specifier is evaluated and ++the parameter variable is bound to that value (or to nil if no ++init-form was specified). supplied-p-parameter is ++treated as for &optional parameters: it is bound to true if there ++was a matching argument pair, and to false otherwise. ++

++

Unless keyword argument checking is suppressed, ++an argument pair must a name matched by a parameter specifier; ++see Unrecognized Keyword Arguments. ++

++

If keyword argument checking is suppressed, ++then it is permitted for an argument pair ++to match no parameter specifier, and the argument pair is ignored, but ++such an argument pair is accessible through the rest parameter if ++one was supplied. The purpose of these mechanisms is to allow sharing ++of argument lists among several lambda expressions and to ++allow either the caller or the called lambda expression to ++specify that such sharing may be taking place. ++

++

Note that if &key is present, a keyword argument of :allow-other-keys ++is always permitted—regardless of whether the associated value is true ++or false. However, if the value is false, other non-matching ++keywords are not tolerated (unless &allow-other-keys was used). ++

++

Furthermore, if the receiving argument list specifies a regular argument which ++would be flagged by :allow-other-keys, then :allow-other-keys has both ++its special-cased meaning (identifying whether additional keywords are permitted) ++and its normal meaning (data flow into the function in question). ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Specifiers-for-optional-parameters.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Specifiers for optional parameters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.2 Specifiers for optional parameters

++ ++ ++ ++

If &optional is present, ++the optional parameter specifiers are those following ++&optional ++up to the next lambda list keyword or the end of the list. ++If optional parameters are specified, then each one is processed as ++follows. If any unprocessed arguments remain, then the parameter variable ++var is bound to the next remaining argument, just as for a required ++parameter. If no arguments remain, however, then init-form ++is evaluated, and the parameter variable ++is bound to the resulting value ++(or to nil if no init-form appears ++in the parameter specifier). ++If another variable name supplied-p-parameter ++appears in the specifier, it is bound ++to true if an argument had been available, and to false if no ++argument remained (and therefore init-form had to be evaluated). ++Supplied-p-parameter ++is bound not to an argument but to a value indicating whether or not ++an argument had been supplied for the corresponding var. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Specifiers-for-the-required-parameters.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Specifiers for the required parameters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.1 Specifiers for the required parameters

++ ++

These are all the parameter specifiers up to ++the first lambda list keyword; ++if there are no lambda list keywords, ++then all the specifiers are for required parameters. ++Each required parameter is specified by a parameter variable var. ++var is bound as a lexical variable unless it is declared special. ++

++

If there are n required parameters (n may be zero), ++there must be at least n passed arguments, and the ++required parameters are bound to the first n passed arguments; ++see Error Checking in Function Calls. ++The other parameters are then processed using any remaining arguments. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Splicing-in-Modified-BNF-Syntax.html +@@ -0,0 +1,156 @@ ++ ++ ++ ++ ++ ++Splicing in Modified BNF Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.3 Splicing in Modified BNF Syntax

++ ++

The primary extension used is the following: ++

++
[[O]] ++
++

An expression of this form appears whenever a list of elements is ++to be spliced into a larger structure and the elements can appear in ++any order. The symbol O represents a description of the syntax of ++some number of syntactic elements to be spliced; that description must ++be of the form ++

++
O_1 | ... | O_l ++
++

where each O_i can be of the form S or of ++the form S* or of the form S^1. ++

++

The expression [[O]] means that a list of the form ++

++
(O_{i_1}... O_{i_j}) 1<= j ++
++

is spliced into the enclosing expression, ++such that if n != m and 1<= n,m<= j, ++then either O_{i_n}!= O_{i_m} ++ or O_{i_n} = O_{i_m} = Q_k, ++where for some 1<= k <= n, O_k is of the form Q_k*. ++

++

Furthermore, for each O_{i_n} that is of the form Q_k^1, ++that element is required to appear somewhere in the list to be spliced. ++

++

For example, the expression ++

++

(x [[A | B* | C]] y) ++

++

means that at most one A, any number of B’s, and ++at most one C can occur in any order. ++It is a description of any of these: ++

++
++
 (x y)
++ (x B A C y)
++ (x A B B B B B C y)
++ (x C B A B B B y)
++
++ ++

but not any of these: ++

++
++
 (x B B A A C C y)
++ (x C B C y)
++
++ ++

In the first case, both A and C appear too often, ++and in the second case C appears too often. ++

++

The notation [[O_1 | O_2 | ...]]^+ ++adds the additional restriction that at least one item from among the possible ++choices must be used. For example: ++

++

(x [[A | B* | C]]^+ y) ++

++

means that at most one A, any number of B’s, and ++at most one C can occur in any order, but that in any case at least ++one of these options must be selected. ++It is a description of any of these: ++

++
++
 (x B y)
++ (x B A C y)
++ (x A B B B B B C y)
++ (x C B A B B B y)
++
++ ++

but not any of these: ++

++
++
 (x y)
++ (x B B A A C C y)
++ (x C B C y)
++
++ ++

In the first case, no item was used; ++in the second case, both A and C appear too often; ++and in the third case C appears too often. ++

++

Also, the expression: ++

++

(x [[A^1 | B^1 | C]] y) ++

++

can generate exactly these and no others: ++

++
++
 (x A B C y)
++ (x A C B y)
++ (x A B y)
++ (x B A C y)
++ (x B C A y)
++ (x B A y)
++ (x C A B y)
++ (x C B A y)
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Standard-Characters.html +@@ -0,0 +1,158 @@ ++ ++ ++ ++ ++ ++Standard Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.3 Standard Characters

++ ++

All implementations must support a character repertoire ++called standard-char; characters that are members of that ++repertoire are called standard characters ++ ++. ++

++

The standard-char repertoire consists of ++the non-graphic character newline, ++the graphic character space, ++and the following additional ++ninety-four graphic characters or their equivalents: ++

++
++
  Graphic ID  Glyph  Description  Graphic ID  Glyph  Description  
++  LA01        a      small a      LN01        n      small n      
++  LA02        A      capital A    LN02        N      capital N    
++  LB01        b      small b      LO01        o      small o      
++  LB02        B      capital B    LO02        O      capital O    
++  LC01        c      small c      LP01        p      small p      
++  LC02        C      capital C    LP02        P      capital P    
++  LD01        d      small d      LQ01        q      small q      
++  LD02        D      capital D    LQ02        Q      capital Q    
++  LE01        e      small e      LR01        r      small r      
++  LE02        E      capital E    LR02        R      capital R    
++  LF01        f      small f      LS01        s      small s      
++  LF02        F      capital F    LS02        S      capital S    
++  LG01        g      small g      LT01        t      small t      
++  LG02        G      capital G    LT02        T      capital T    
++  LH01        h      small h      LU01        u      small u      
++  LH02        H      capital H    LU02        U      capital U    
++  LI01        i      small i      LV01        v      small v      
++  LI02        I      capital I    LV02        V      capital V    
++  LJ01        j      small j      LW01        w      small w      
++  LJ02        J      capital J    LW02        W      capital W    
++  LK01        k      small k      LX01        x      small x      
++  LK02        K      capital K    LX02        X      capital X    
++  LL01        l      small l      LY01        y      small y      
++  LL02        L      capital L    LY02        Y      capital Y    
++  LM01        m      small m      LZ01        z      small z      
++  LM02        M      capital M    LZ02        Z      capital Z    
++
++  Figure 2–3: Standard Character Subrepertoire (Part 1 of 3: Latin Characters)
++
++
++ ++
++
  Graphic ID  Glyph  Description  Graphic ID  Glyph  Description  
++  ND01        1      digit 1      ND06        6      digit 6      
++  ND02        2      digit 2      ND07        7      digit 7      
++  ND03        3      digit 3      ND08        8      digit 8      
++  ND04        4      digit 4      ND09        9      digit 9      
++  ND05        5      digit 5      ND10        0      digit 0      
++
++  Figure 2–4: Standard Character Subrepertoire (Part 2 of 3: Numeric Characters)
++
++
++ ++
++
  Graphic ID  Glyph  Description                              
++  SP02        !      exclamation mark                         
++  SC03        $     dollar sign                              
++  SP04        "      quotation mark, or double quote          
++  SP05        '      apostrophe, or [single] quote            
++  SP06        (      left parenthesis, or open parenthesis    
++  SP07        )      right parenthesis, or close parenthesis  
++  SP08        ,      comma                                    
++  SP09        _      low line, or underscore                  
++  SP10        -      hyphen, or minus [sign]                  
++  SP11        .      full stop, period, or dot                
++  SP12        /      solidus, or slash                        
++  SP13        :      colon                                    
++  SP14        ;      semicolon                                
++  SP15        ?      question mark                            
++  SA01        +      plus [sign]                              
++  SA03        <      less-than [sign]                         
++  SA04        =      equals [sign]                            
++  SA05        >      greater-than [sign]                      
++  SM01        #      number sign, or sharp[sign]              
++  SM02        %      percent [sign]                           
++  SM03        &      ampersand                                
++  SM04        *      asterisk, or star                        
++  SM05        @      commercial at, or at-sign                
++  SM06        [      left [square] bracket                    
++  SM07        \      reverse solidus, or backslash            
++  SM08        ]      right [square] bracket                   
++  SM11        {      left curly bracket, or left brace        
++  SM13        |      vertical bar                             
++  SM14        }      right curly bracket, or right brace      
++  SD13        `      grave accent, or backquote               
++  SD15        ^      circumflex accent                        
++  SD19        ~      tilde                                    
++
++  Figure 2–5: Standard Character Subrepertoire (Part 3 of 3: Special Characters)
++
++
++ ++

The graphic IDs are not used within Common Lisp, ++but are provided for cross reference purposes with ISO 6937/2. ++Note that the first letter of the graphic ID ++categorizes the character as follows: ++L—Latin, N—Numeric, S—Special. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Standard-Macro-Characters.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++Standard Macro Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Syntax  

++
++
++

2.4 Standard Macro Characters

++ ++ ++

If the reader encounters a macro character, ++then its associated reader macro function ++is invoked and may produce an object to be returned. ++This function may read the characters ++following the macro character in the stream ++in any syntax and return the object represented by that syntax. ++

++

Any character can be made to be a macro character. ++The macro characters defined initially in a conforming implementation ++include ++the following: ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Standard-Meta_002dobjects.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++Standard Meta-objects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Meta-Objects  

++
++
++

7.4.1 Standard Meta-objects

++ ++

The object system supplies a set of meta-objects, called standard meta-objects. ++These include the class standard-object and ++instances of the classes standard-method, ++standard-generic-function, and method-combination. ++

++
++
++

[Editorial Note by KMP: This is said redundantly in the definition of STANDARD-METHOD.] ++

++
*
++

The class standard-method is the default class of ++methods defined by the ++ defmethod and ++ defgeneric forms. ++

++
++
*
++

The class standard-generic-function is the default class of ++generic functions defined by the forms ++ defmethod, ++ defgeneric, ++

++

and ++ defclass. ++

++
++
*
++

The class named standard-object ++is an instance of the class standard-class ++and is a superclass of every class that is an ++instance of standard-class except itself and ++structure-class. ++

++
++
*
++

Every method combination object is ++an instance of a subclass of class method-combination. ++

++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Standard-Metaclasses.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++Standard Metaclasses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.1.1 Standard Metaclasses

++ ++

The object system provides a number of predefined metaclasses. ++These include the classes standard-class, ++built-in-class, and structure-class: ++

++
++
*
++

The class standard-class is the default class of ++classes defined by defclass. ++

++
++
*
++

The class built-in-class is the class whose ++instances are classes that have special implementations with ++restricted capabilities. Any class that corresponds to a standard ++type might be an instance of built-in-class. ++The predefined type specifiers that are required to have ++corresponding classes are listed in Figure~4–8. ++It is implementation-dependent whether each of these classes ++is implemented as a built-in class. ++

++
++
*
++

All classes defined by means of defstruct are ++instances of the class structure-class. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Standard-Method-Combination.html +@@ -0,0 +1,185 @@ ++ ++ ++ ++ ++ ++Standard Method Combination (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.6.6.5 Standard Method Combination

++ ++ ++ ++

Standard method combination is supported by the class standard-generic-function. ++It is used if no other type of method ++combination is specified or if the built-in method combination type ++standard is specified. ++

++

Primary methods define the main action of the effective method, ++while auxiliary methods modify that action in one of three ways. ++A primary method has no method qualifiers. ++

++

An auxiliary method is a method whose ++qualifier is :before, :after, or :around. ++Standard method combination ++allows no more than one qualifier per method; if a method definition ++specifies more than one qualifier per method, an error is signaled. ++

++
++
*
++

A before method has the keyword :before as its only qualifier. ++A before method specifies code that is to be run before any ++primary methods. ++

++
++
*
++

An after method has the keyword :after as its only qualifier. ++An after method specifies code that is to be run after ++primary methods. ++

++
++
*
++

An around method has the keyword :around as its only qualifier. ++An around method specifies code that is to be run instead of other ++applicable methods, ++but which might contain explicit code ++which calls some of those shadowed methods ++(via call-next-method). ++

++
++
++ ++

The semantics of standard method combination is as follows: ++

++
++
*
++

If there are any around methods, the most specific ++around method is called. It supplies the value or values of the ++generic function. ++

++
++
*
++

Inside the body of an around method, ++call-next-method can be used to call the next method. When the next ++method returns, the around method can execute more code, ++perhaps based on the returned value or values. ++The generic function no-next-method is invoked if call-next-method is used and ++there is no applicable method to call. The function next-method-p ++may be used to determine whether a next method exists. ++

++
++
*
++

If an around method invokes call-next-method, ++the next most specific around method ++is called, if one is applicable. If there are no around methods ++or if call-next-method is called by the least ++specific around method, the other methods are called as ++follows: ++

++
++

All the before methods are called, in ++most-specific-first order. Their values are ignored. ++An error is signaled if call-next-method is used in a ++before method. ++

++
++
++

The most specific primary method is called. Inside the ++body of a primary method, call-next-method may be used to call ++the next most specific primary method. When that method returns, the ++previous primary method can execute more code, perhaps based on the ++returned value or values. The generic function no-next-method ++is invoked if call-next-method is used and there are no more ++applicable primary methods. The function next-method-p may be ++used to determine whether a next method exists. If call-next-method ++is not used, only the most specific primary method is called. ++

++
++
++

All the after methods are called in ++most-specific-last order. Their values are ignored. ++An error is signaled if call-next-method is used in an ++after method. ++

++
++ ++
++
*
++

If no around methods were invoked, the most ++specific primary method supplies the value or values returned by the ++generic function. The value or values returned by the invocation of ++call-next-method in the least specific around method are ++those returned by the most specific primary method. ++

++
++
++ ++

In standard method combination, if there is an applicable method ++but no applicable primary method, an error is signaled. ++

++

The before methods are run in most-specific-first order while ++the after methods are run in least-specific-first order. The ++design rationale for this difference can be illustrated with an ++example. Suppose class C_1 modifies the behavior of its ++superclass, C_2, by adding before methods and after methods. ++Whether the behavior of the class C_2 is defined ++directly by methods on C_2 or is inherited from its superclasses ++does not affect the relative order of invocation of methods on ++instances of the class C_1. Class C_1’s ++before method runs before all of class C_2’s methods. ++Class C_1’s after method runs after all of class C_2’s methods. ++

++

By contrast, all around methods run before any other methods ++run. Thus a less specific around method runs before a more ++specific primary method. ++

++

If only primary methods are used and if call-next-method is not ++used, only the most specific method is invoked; that is, more specific ++methods shadow more general ones. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Standardized-Packages.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Standardized Packages (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Package Concepts  

++
++
++

11.1.2 Standardized Packages

++ ++

This section describes the packages that are available ++in every conforming implementation. A summary of the ++names and nicknames of those standardized packages ++is given in Figure 11–2. ++

++
++
  Name              Nicknames  
++  COMMON-LISP       CL         
++  COMMON-LISP-USER  CL-USER    
++  KEYWORD           none       
++
++  Figure 11–2: Standardized Package Names
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Storage-Layout-for-Multidimensional-Arrays.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Storage Layout for Multidimensional Arrays (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.1.1.8 Storage Layout for Multidimensional Arrays

++ ++

Multidimensional arrays store their components in row-major order; ++that is, internally a multidimensional array is stored as a ++one-dimensional array, with the multidimensional index sets ++ordered lexicographically, last index varying fastest. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Stream-Arguments-to-Standardized-Functions.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++Stream Arguments to Standardized Functions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.1.3 Stream Arguments to Standardized Functions

++ ++

The operators in Figure 21–7 accept stream arguments that ++might be either open or closed streams. ++

++
++
  broadcast-stream-streams     file-author       pathnamep                     
++  close                        file-namestring   probe-file                    
++  compile-file                 file-write-date   rename-file                   
++  compile-file-pathname        host-namestring   streamp                       
++  concatenated-stream-streams  load              synonym-stream-symbol         
++  delete-file                  logical-pathname  translate-logical-pathname    
++  directory                    merge-pathnames   translate-pathname            
++  directory-namestring         namestring        truename                      
++  dribble                      open              two-way-stream-input-stream   
++  echo-stream-input-stream     open-stream-p     two-way-stream-output-stream  
++  echo-stream-ouput-stream     parse-namestring  wild-pathname-p               
++  ed                           pathname          with-open-file                
++  enough-namestring            pathname-match-p                                
++
++        Figure 21–7: Operators that accept either Open or Closed Streams      
++
++
++ ++

The operators in Figure 21–8 accept stream arguments that ++must be open streams. ++

++
++
 clear-input              output-stream-p         read-char-no-hang          
++ clear-output             peek-char               read-delimited-list        
++ file-length              pprint                  read-line                  
++ file-position            pprint-fill             read-preserving-whitespace 
++ file-string-length       pprint-indent           stream-element-type        
++ finish-output            pprint-linear           stream-external-format     
++ force-output             pprint-logical-block    terpri                     
++ format                   pprint-newline          unread-char                
++ fresh-line               pprint-tab              with-open-stream           
++ get-output-stream-string pprint-tabular          write                      
++ input-stream-p           prin1                   write-byte                 
++ interactive-stream-p     princ                   write-char                 
++ listen                   print                   write-line                 
++ make-broadcast-stream    print-object            write-string               
++ make-concatenated-stream print-unreadable-object y-or-n-p                   
++ make-echo-stream         read                    yes-or-no-p                
++ make-synonym-stream      read-byte                                          
++ make-two-way-stream      read-char                                          
++
++             Figure 21–8: Operators that accept Open Streams only            
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Stream-Concepts.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Stream Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams  

++
++
++

21.1 Stream Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Stream-Variables.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Stream Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.1.2 Stream Variables

++ ++

Variables whose values must be streams are sometimes called ++stream variables ++ ++. ++

++

Certain stream variables are defined by this specification ++to be the proper source of input or output in various situations ++where no specific stream has been specified instead. ++A complete list of such standardized stream variables ++appears in Figure 21–6. ++The consequences are undefined if at any time ++the value of any of these variables is not an open stream. ++

++
++
  Glossary Term    Variable Name      
++  debug I/O        *debug-io*         
++  error output     *error-output*     
++  query I/O        *query-io*         
++  standard input   *standard-input*   
++  standard output  *standard-output*  
++  terminal I/O     *terminal-io*      
++  trace output     *trace-output*     
++
++  Figure 21–6: Standardized Stream Variables
++
++
++ ++

Note that, by convention, standardized stream variables have names ++ ending in “-input*” if they must be input streams, ++ ending in “-output*” if they must be output streams, ++ or ending in “-io*” if they must be bidirectional streams. ++

++

User programs may assign or bind any standardized stream variable ++except *terminal-io*. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Streams-Dictionary.html +@@ -0,0 +1,174 @@ ++ ++ ++ ++ ++ ++Streams Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Streams  

++
++
++

21.2 Streams Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Streams  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Streams.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

21 Streams

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/String-Concepts.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++String Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings  

++
++
++

16.1 String Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Strings-Dictionary.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Strings Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Strings  

++
++
++

16.2 Strings Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Strings-in-Component-Values.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Strings in Component Values (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.1 Strings in Component Values

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Strings.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Strings (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

16 Strings

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Structures-Dictionary.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Structures Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Structures  

++
++
++

8.1 Structures Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Structures.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Structures (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

8 Structures

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Subtypes-of-STRING.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Subtypes of STRING (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

16.1.2 Subtypes of STRING

++ ++

All functions that operate on strings ++will operate on subtypes of string as well. ++

++

However, ++the consequences are undefined if a character is inserted into a string ++for which the element type of the string does not include that character. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Conditional-Execution-Clauses.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Summary of Conditional Execution Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.12 Summary of Conditional Execution Clauses

++ ++

The if and when constructs take one form as a test ++and a clause that is executed when the test yields true. ++The clause can be a value accumulation, unconditional, or ++another conditional clause; it can also be any combination ++of such clauses connected by the loop and keyword. ++

++

The loop unless construct is similar to the loop when construct ++except that it complements the test result. ++

++

The loop else construct provides an optional component of if, ++when, and unless clauses that is executed ++ when an if or when test yields false ++ or when an unless test yields true. ++The component is one of the clauses described under if. ++

++

The loop end construct provides an optional component to mark the ++end of a conditional clause. ++

++

For more information, see Conditional Execution Clauses. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Loop-Clauses.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Summary of Loop Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.7 Summary of Loop Clauses

++ ++

Loop clauses fall into one of the following categories: ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Miscellaneous-Clauses.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Summary of Miscellaneous Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.13 Summary of Miscellaneous Clauses

++ ++

The loop named construct gives a name for the block of the loop. ++

++

The loop initially construct causes its forms to be ++evaluated in the loop prologue, which precedes all loop code ++except for initial settings supplied by the constructs with, ++for, or as. ++

++

The loop finally construct causes its forms to ++be evaluated in the loop epilogue after normal iteration terminates. ++

++

For more information, see Miscellaneous Clauses. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Termination-Test-Clauses.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++Summary of Termination Test Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.10 Summary of Termination Test Clauses

++ ++

The for and as constructs provide a termination test ++that is determined by the iteration control clause. ++

++

The repeat construct causes termination after a specified ++number of iterations. ++(It uses an internal variable to keep track of the number of iterations.) ++

++

The while construct takes one form, a test, ++and terminates the iteration if the test evaluates to false. ++A while clause is equivalent to the expression ++(if (not test) (loop-finish)). ++

++

The until construct is the inverse of while; ++it terminates the iteration if the test evaluates to ++any non-nil value. ++An until clause is equivalent to the expression ++(if test (loop-finish)). ++

++

The always construct takes one form and ++terminates the loop if the form ever evaluates to false; ++in this case, the loop form returns nil. ++Otherwise, it provides a default return value of t. ++

++

The never construct takes one form and ++terminates the loop if the form ever evaluates to true; ++in this case, the loop form returns nil. ++Otherwise, it provides a default return value of t. ++

++

The thereis construct takes one form and ++terminates the loop if the form ever evaluates to ++a non-nil object; ++in this case, the loop form returns that object. ++

++

Otherwise, it provides a default return value of nil. ++

++

If multiple termination test clauses are specified, ++the loop form terminates if any are satisfied. ++

++

For more information, see Termination Test Clauses. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Unconditional-Execution-Clauses.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Summary of Unconditional Execution Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.11 Summary of Unconditional Execution Clauses

++ ++

The do (or doing) construct evaluates all forms in its clause. ++

++

The return construct takes one ++

++

form. Any values returned by the form are ++ immediately returned by the loop form. ++ It is equivalent to the clause ++ do (return-from block-name value), ++ where block-name is the name specified in a named ++ clause, or nil if there is no named clause. ++

++

For more information, see Unconditional Execution Clauses. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Value-Accumulation-Clauses.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++Summary of Value Accumulation Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.9 Summary of Value Accumulation Clauses

++ ++

The collect (or collecting) construct ++takes one form in its clause ++and adds the value of that form to the end of a list ++of values. By default, the list of values is returned ++when the loop finishes. ++

++

The append (or appending) construct ++takes one form in its clause ++and appends the value of that form to the end of a list ++of values. By default, the list of values is returned when the ++loop finishes. ++

++

The nconc (or nconcing) construct ++is similar to the append construct, ++but its list values are concatenated as if by the function ++nconc. By default, the list of values is returned when ++the loop finishes. ++

++

The sum (or summing) construct ++takes one form in its clause ++that must evaluate to a number and accumulates the sum of all these ++numbers. By default, the cumulative sum is returned when the ++loop finishes. ++

++

The count (or counting) construct ++takes one form in its clause ++and counts the number of times that the form evaluates to true. ++By default, the count is returned when the loop finishes. ++

++

The minimize (or minimizing) construct ++takes one form in its clause ++and determines the minimum value obtained by evaluating that form. ++By default, the minimum value is returned when the loop finishes. ++

++

The maximize (or maximizing) construct ++takes one form in its clause ++and determines the maximum value obtained by evaluating that form. ++By default, the maximum value is returned when the loop finishes. ++

++

For more information, see Value Accumulation Clauses. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Summary-of-Variable-Initialization-and-Stepping-Clauses.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Summary of Variable Initialization and Stepping Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.1.8 Summary of Variable Initialization and Stepping Clauses

++ ++

The for and as constructs provide iteration control clauses ++that establish a variable to be initialized. ++for and as clauses can be combined with the loop ++keyword and to get parallel initialization and stepping_1. ++Otherwise, the initialization and stepping_1 are sequential. ++

++

The with construct is similar to a single let clause. ++with clauses can be combined using the loop keyword and ++to get parallel initialization. ++

++

For more information, see Variable Initialization and Stepping Clauses. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Suppressing-Keyword-Argument-Checking.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Suppressing Keyword Argument Checking (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.1.5 Suppressing Keyword Argument Checking

++ ++

If &allow-other-keys was specified in the lambda list of a function, ++keyword_2 argument checking is suppressed in calls ++to that function. ++

++

If the :allow-other-keys argument is true in a call to a function, ++keyword_2 argument checking is suppressed ++in that call. ++

++

The :allow-other-keys argument is permissible in all situations involving ++keyword_2 arguments, even when its associated value ++is false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbol-Concepts.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Symbol Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols  

++
++
++

10.1 Symbol Concepts

++ ++ ++

Figure 10–1 lists some ++defined names that are applicable to the property lists of symbols. ++

++
++
  get  remprop  symbol-plist  
++
++  Figure 10–1: Property list defined names
++
++
++ ++

Figure 10–2 lists some defined names that are applicable ++to the creation of and inquiry about symbols. ++

++
++
  copy-symbol  keywordp     symbol-package  
++  gensym       make-symbol  symbol-value    
++  gentemp      symbol-name                  
++
++  Figure 10–2: Symbol creation and inquiry defined names
++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbol-Macros-as-Places.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Symbol Macros as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.8 Symbol Macros as Places

++ ++

A reference to a symbol that has been established as a symbol macro ++can be used as a place. In this case, ++setf expands the reference and then analyzes the resulting form. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols-Dictionary.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++Symbols Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Symbols  

++
++
++

10.2 Symbols Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols-Naming-Both-Lexical-and-Dynamic-Variables.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++Symbols Naming Both Lexical and Dynamic Variables (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++
++

3.1.2.6 Symbols Naming Both Lexical and Dynamic Variables

++ ++

The same symbol can name both ++ a lexical variable ++and a dynamic variable, ++but never in the same lexical environment. ++

++

In the following example, the symbol x is used, ++at different times, ++ as the name of a lexical variable ++and as the name of a dynamic variable. ++

++
++
 (let ((x 1))            ;Binds a special variable X
++   (declare (special x))
++   (let ((x 2))          ;Binds a lexical variable X
++     (+ x                ;Reads a lexical variable X
++        (locally (declare (special x))
++                 x))))   ;Reads a special variable X
++⇒  3
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols-as-Forms.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++Symbols as Forms (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++
++

3.1.2.2 Symbols as Forms

++ ++

If a form is a symbol, ++then it is either a symbol macro or a variable. ++

++

The symbol names a symbol macro ++if there is a binding of the symbol as a symbol macro ++in the current lexical environment ++

++

(see define-symbol-macro and symbol-macrolet). ++

++

If the symbol is a symbol macro, ++its expansion function is obtained. ++The expansion function is a function of two arguments, and is invoked ++by calling the macroexpand hook with ++ the expansion function as its first argument, ++ the symbol as its second argument, ++ and an environment object (corresponding to the current lexical environment) ++ as its third argument. ++The macroexpand hook, in turn, calls the expansion function with the ++form as its first argument and the environment as its second argument. ++The value of the expansion function, which is passed through ++by the macroexpand hook, is a form. ++This resulting form is processed in place of the original symbol. ++

++

If a form is a symbol that is not a symbol macro, ++then it is the name of a variable, and the value of that ++variable is returned. There are three kinds of variables: ++ lexical variables, ++ dynamic variables, ++and ++ constant variables. ++A variable can store one object. ++The main operations on a variable are ++ to read_1 and ++ to write_1 ++its value. ++

++

An error of type unbound-variable should be signaled if ++an unbound variable is referenced. ++

++

Non-constant variables can be assigned by using setq ++or bound_3 by using let. ++Figure 3–1 lists some defined names that ++are applicable to assigning, binding, and defining variables. ++

++
++
  boundp        let                  progv         
++  defconstant   let*                 psetq         
++  defparameter  makunbound           set           
++  defvar        multiple-value-bind  setq          
++  lambda        multiple-value-setq  symbol-value  
++
++  Figure 3–1: Some Defined Names Applicable to Variables
++
++
++ ++

The following is a description of each kind of variable. ++

++
++
++

++Next: , Previous: , Up: The Evaluation Model  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols-as-Tokens.html +@@ -0,0 +1,135 @@ ++ ++ ++ ++ ++ ++Symbols as Tokens (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.4 Symbols as Tokens

++ ++

Any token that is not a potential number, ++does not contain a package marker, ++and does not consist entirely of dots ++will always be interpreted as a symbol. ++Any token that is a potential number but does not fit the ++number syntax is a reserved token and ++has an implementation-dependent interpretation. ++In all other cases, the token is construed to be the name of a symbol. ++

++

Examples of the printed representation of symbols are in Figure 2–15. ++For presentational simplicity, ++these examples assume that ++the readtable case of the current readtable is :upcase. ++

++
++
  FROBBOZ         The symbol whose name is FROBBOZ.                
++  frobboz         Another way to notate the same symbol.           
++  fRObBoz         Yet another way to notate it.                    
++  unwind-protect  A symbol with a hyphen in its name.              
++  +$             The symbol named +$.                            
++  1+              The symbol named 1+.                             
++  +1              This is the integer 1, not a symbol.             
++  pascal_style    This symbol has an underscore in its name.       
++  file.rel.43     This symbol has periods in its name.             
++  \(              The symbol whose name is (.                      
++  \+1             The symbol whose name is +1.                     
++  +\1             Also the symbol whose name is +1.                
++  \frobboz        The symbol whose name is fROBBOZ.                
++  3.14159265\s0   The symbol whose name is 3.14159265s0.           
++  3.14159265\S0   A different symbol, whose name is 3.14159265S0.  
++  3.14159265s0    A possible short float approximation to \pi.     
++
++  Figure 2–15: Examples of the printed representation of symbols (Part 1 of 2)
++
++
++ ++
++
  APL\\360               The symbol whose name is APL\360.       
++  apl\\360               Also the symbol whose name is APL\360.  
++  \(b^2\)\ -\ 4*a*c    The name is (B^2) - 4*A*C.            
++                         Parentheses and two spaces in it.       
++  \(\b^2\)\ -\4*\a*\c  The name is (b^2) - 4*a*c.            
++                         Letters explicitly lowercase.           
++  |"|                    The same as writing \".                 
++  |(b^2) - 4*a*c|      The name is (b^2) - 4*a*c.            
++  |frobboz|              The name is frobboz, not FROBBOZ.       
++  |APL\360|              The name is APL360.                     
++  |APL\\360|             The name is APL\360.                    
++  |apl\\360|             The name is apl\360.                    
++  |\|\||                 Same as \|\| —the name is ||.          
++  |(B^2) - 4*A*C|      The name is (B^2) - 4*A*C.            
++                         Parentheses and two spaces in it.       
++  |(b^2) - 4*a*c|      The name is (b^2) - 4*a*c.            
++
++  Figure 2–16: Examples of the printed representation of symbols (Part 2 of 2)
++
++
++ ++

In the process of parsing a symbol, ++it is implementation-dependent which ++implementation-defined attributes are removed ++from the characters forming a token that represents a symbol. ++

++

When parsing the syntax for a symbol, ++the Lisp reader looks up the name of that symbol ++in the current package. ++This lookup may involve looking in other ++packages whose external symbols ++are inherited by the current package. If the name is found, ++the corresponding symbol is returned. If the name is not found ++(that is, there is no symbol ++of that name accessible in the current package), ++a new symbol is created and is placed in the current package ++as an internal symbol. The current package becomes the owner ++(home package) of the symbol, ++and the symbol becomes interned in the current package. ++If the name is later read again while this same package is ++current, the same symbol will be found and returned. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols-in-a-Package.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Symbols in a Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.1.2 Symbols in a Package

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols-in-the-COMMON_002dLISP-Package.html +@@ -0,0 +1,600 @@ ++ ++ ++ ++ ++ ++Symbols in the COMMON-LISP Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.9 Symbols in the COMMON-LISP Package

++ ++ ++

The figures on the next twelve pages contain a complete enumeration ++of the 978 external symbols in the COMMON-LISP package. ++ ++

++
++
  &allow-other-keys            *print-miser-width*          
++  &aux                         *print-pprint-dispatch*      
++  &body                        *print-pretty*               
++  &environment                 *print-radix*                
++  &key                         *print-readably*             
++  &optional                    *print-right-margin*         
++  &rest                        *query-io*                   
++  &whole                       *random-state*               
++  *                            *read-base*                  
++  **                           *read-default-float-format*  
++  ***                          *read-eval*                  
++  *break-on-signals*           *read-suppress*              
++  *compile-file-pathname*      *readtable*                  
++  *compile-file-truename*      *standard-input*             
++  *compile-print*              *standard-output*            
++  *compile-verbose*            *terminal-io*                
++  *debug-io*                   *trace-output*               
++  *debugger-hook*              +                            
++  *default-pathname-defaults*  ++                           
++  *error-output*               +++                          
++  *features*                   -                            
++  *gensym-counter*             /                            
++  *load-pathname*              //                           
++  *load-print*                 ///                          
++  *load-truename*              /=                           
++  *load-verbose*               1+                           
++  *macroexpand-hook*           1-                           
++  *modules*                    <                            
++  *package*                    <=                           
++  *print-array*                =                            
++  *print-base*                 >                            
++  *print-case*                 >=                           
++  *print-circle*               abort                        
++  *print-escape*               abs                          
++  *print-gensym*               acons                        
++  *print-length*               acos                         
++  *print-level*                acosh                        
++  *print-lines*                add-method                   
++
++  Figure 1–4: Symbols in the COMMON-LISP package (part one of twelve).
++
++
++ ++ ++
++
  adjoin                      atom          boundp                    
++  adjust-array                base-char     break                     
++  adjustable-array-p          base-string   broadcast-stream          
++  allocate-instance           bignum        broadcast-stream-streams  
++  alpha-char-p                bit           built-in-class            
++  alphanumericp               bit-and       butlast                   
++  and                         bit-andc1     byte                      
++  append                      bit-andc2     byte-position             
++  apply                       bit-eqv       byte-size                 
++  apropos                     bit-ior       caaaar                    
++  apropos-list                bit-nand      caaadr                    
++  aref                        bit-nor       caaar                     
++  arithmetic-error            bit-not       caadar                    
++  arithmetic-error-operands   bit-orc1      caaddr                    
++  arithmetic-error-operation  bit-orc2      caadr                     
++  array                       bit-vector    caar                      
++  array-dimension             bit-vector-p  cadaar                    
++  array-dimension-limit       bit-xor       cadadr                    
++  array-dimensions            block         cadar                     
++  array-displacement          boole         caddar                    
++  array-element-type          boole-1       cadddr                    
++  array-has-fill-pointer-p    boole-2       caddr                     
++  array-in-bounds-p           boole-and     cadr                      
++  array-rank                  boole-andc1   call-arguments-limit      
++  array-rank-limit            boole-andc2   call-method               
++  array-row-major-index       boole-c1      call-next-method          
++  array-total-size            boole-c2      car                       
++  array-total-size-limit      boole-clr     case                      
++  arrayp                      boole-eqv     catch                     
++  ash                         boole-ior     ccase                     
++  asin                        boole-nand    cdaaar                    
++  asinh                       boole-nor     cdaadr                    
++  assert                      boole-orc1    cdaar                     
++  assoc                       boole-orc2    cdadar                    
++  assoc-if                    boole-set     cdaddr                    
++  assoc-if-not                boole-xor     cdadr                     
++  atan                        boolean       cdar                      
++  atanh                       both-case-p   cddaar                    
++
++  Figure 1–5: Symbols in the COMMON-LISP package (part two of twelve).
++
++
++ ++ ++
++
  cddadr             clear-input                  copy-tree                  
++  cddar              clear-output                 cos                        
++  cdddar             close                        cosh                       
++  cddddr             clrhash                      count                      
++  cdddr              code-char                    count-if                   
++  cddr               coerce                       count-if-not               
++  cdr                compilation-speed            ctypecase                  
++  ceiling            compile                      debug                      
++  cell-error         compile-file                 decf                       
++  cell-error-name    compile-file-pathname        declaim                    
++  cerror             compiled-function            declaration                
++  change-class       compiled-function-p          declare                    
++  char               compiler-macro               decode-float               
++  char-code          compiler-macro-function      decode-universal-time      
++  char-code-limit    complement                   defclass                   
++  char-downcase      complex                      defconstant                
++  char-equal         complexp                     defgeneric                 
++  char-greaterp      compute-applicable-methods   define-compiler-macro      
++  char-int           compute-restarts             define-condition           
++  char-lessp         concatenate                  define-method-combination  
++  char-name          concatenated-stream          define-modify-macro        
++  char-not-equal     concatenated-stream-streams  define-setf-expander       
++  char-not-greaterp  cond                         define-symbol-macro        
++  char-not-lessp     condition                    defmacro                   
++  char-upcase        conjugate                    defmethod                  
++  char/=             cons                         defpackage                 
++  char<              consp                        defparameter               
++  char<=             constantly                   defsetf                    
++  char=              constantp                    defstruct                  
++  char>              continue                     deftype                    
++  char>=             control-error                defun                      
++  character          copy-alist                   defvar                     
++  characterp         copy-list                    delete                     
++  check-type         copy-pprint-dispatch         delete-duplicates          
++  cis                copy-readtable               delete-file                
++  class              copy-seq                     delete-if                  
++  class-name         copy-structure               delete-if-not              
++  class-of           copy-symbol                  delete-package             
++
++    Figure 1–6: Symbols in the COMMON-LISP package (part three of twelve).  
++
++
++ ++ ++
++
  denominator                    eq                   
++  deposit-field                  eql                  
++  describe                       equal                
++  describe-object                equalp               
++  destructuring-bind             error                
++  digit-char                     etypecase            
++  digit-char-p                   eval                 
++  directory                      eval-when            
++  directory-namestring           evenp                
++  disassemble                    every                
++  division-by-zero               exp                  
++  do                             export               
++  do*                            expt                 
++  do-all-symbols                 extended-char        
++  do-external-symbols            fboundp              
++  do-symbols                     fceiling             
++  documentation                  fdefinition          
++  dolist                         ffloor               
++  dotimes                        fifth                
++  double-float                   file-author          
++  double-float-epsilon           file-error           
++  double-float-negative-epsilon  file-error-pathname  
++  dpb                            file-length          
++  dribble                        file-namestring      
++  dynamic-extent                 file-position        
++  ecase                          file-stream          
++  echo-stream                    file-string-length   
++  echo-stream-input-stream       file-write-date      
++  echo-stream-output-stream      fill                 
++  ed                             fill-pointer         
++  eighth                         find                 
++  elt                            find-all-symbols     
++  encode-universal-time          find-class           
++  end-of-file                    find-if              
++  endp                           find-if-not          
++  enough-namestring              find-method          
++  ensure-directories-exist       find-package         
++  ensure-generic-function        find-restart         
++
++  Figure 1–7: Symbols in the COMMON-LISP package (part four of twelve).
++
++
++ ++ ++
++
  find-symbol                       get-internal-run-time        
++  finish-output                     get-macro-character          
++  first                             get-output-stream-string     
++  fixnum                            get-properties               
++  flet                              get-setf-expansion           
++  float                             get-universal-time           
++  float-digits                      getf                         
++  float-precision                   gethash                      
++  float-radix                       go                           
++  float-sign                        graphic-char-p               
++  floating-point-inexact            handler-bind                 
++  floating-point-invalid-operation  handler-case                 
++  floating-point-overflow           hash-table                   
++  floating-point-underflow          hash-table-count             
++  floatp                            hash-table-p                 
++  floor                             hash-table-rehash-size       
++  fmakunbound                       hash-table-rehash-threshold  
++  force-output                      hash-table-size              
++  format                            hash-table-test              
++  formatter                         host-namestring              
++  fourth                            identity                     
++  fresh-line                        if                           
++  fround                            ignorable                    
++  ftruncate                         ignore                       
++  ftype                             ignore-errors                
++  funcall                           imagpart                     
++  function                          import                       
++  function-keywords                 in-package                   
++  function-lambda-expression        incf                         
++  functionp                         initialize-instance          
++  gcd                               inline                       
++  generic-function                  input-stream-p               
++  gensym                            inspect                      
++  gentemp                           integer                      
++  get                               integer-decode-float         
++  get-decoded-time                  integer-length               
++  get-dispatch-macro-character      integerp                     
++  get-internal-real-time            interactive-stream-p         
++
++  Figure 1–8: Symbols in the COMMON-LISP package (part five of twelve).
++
++
++ ++ ++
++
  intern                                  lisp-implementation-type            
++  internal-time-units-per-second          lisp-implementation-version         
++  intersection                            list                                
++  invalid-method-error                    list*                               
++  invoke-debugger                         list-all-packages                   
++  invoke-restart                          list-length                         
++  invoke-restart-interactively            listen                              
++  isqrt                                   listp                               
++  keyword                                 load                                
++  keywordp                                load-logical-pathname-translations  
++  labels                                  load-time-value                     
++  lambda                                  locally                             
++  lambda-list-keywords                    log                                 
++  lambda-parameters-limit                 logand                              
++  last                                    logandc1                            
++  lcm                                     logandc2                            
++  ldb                                     logbitp                             
++  ldb-test                                logcount                            
++  ldiff                                   logeqv                              
++  least-negative-double-float             logical-pathname                    
++  least-negative-long-float               logical-pathname-translations       
++  least-negative-normalized-double-float  logior                              
++  least-negative-normalized-long-float    lognand                             
++  least-negative-normalized-short-float   lognor                              
++  least-negative-normalized-single-float  lognot                              
++  least-negative-short-float              logorc1                             
++  least-negative-single-float             logorc2                             
++  least-positive-double-float             logtest                             
++  least-positive-long-float               logxor                              
++  least-positive-normalized-double-float  long-float                          
++  least-positive-normalized-long-float    long-float-epsilon                  
++  least-positive-normalized-short-float   long-float-negative-epsilon         
++  least-positive-normalized-single-float  long-site-name                      
++  least-positive-short-float              loop                                
++  least-positive-single-float             loop-finish                         
++  length                                  lower-case-p                        
++  let                                     machine-instance                    
++  let*                                    machine-type                        
++
++     Figure 1–9: Symbols in the COMMON-LISP package (part six of twelve).    
++
++
++ ++ ++
++
  machine-version                mask-field                  
++  macro-function                 max                         
++  macroexpand                    member                      
++  macroexpand-1                  member-if                   
++  macrolet                       member-if-not               
++  make-array                     merge                       
++  make-broadcast-stream          merge-pathnames             
++  make-concatenated-stream       method                      
++  make-condition                 method-combination          
++  make-dispatch-macro-character  method-combination-error    
++  make-echo-stream               method-qualifiers           
++  make-hash-table                min                         
++  make-instance                  minusp                      
++  make-instances-obsolete        mismatch                    
++  make-list                      mod                         
++  make-load-form                 most-negative-double-float  
++  make-load-form-saving-slots    most-negative-fixnum        
++  make-method                    most-negative-long-float    
++  make-package                   most-negative-short-float   
++  make-pathname                  most-negative-single-float  
++  make-random-state              most-positive-double-float  
++  make-sequence                  most-positive-fixnum        
++  make-string                    most-positive-long-float    
++  make-string-input-stream       most-positive-short-float   
++  make-string-output-stream      most-positive-single-float  
++  make-symbol                    muffle-warning              
++  make-synonym-stream            multiple-value-bind         
++  make-two-way-stream            multiple-value-call         
++  makunbound                     multiple-value-list         
++  map                            multiple-value-prog1        
++  map-into                       multiple-value-setq         
++  mapc                           multiple-values-limit       
++  mapcan                         name-char                   
++  mapcar                         namestring                  
++  mapcon                         nbutlast                    
++  maphash                        nconc                       
++  mapl                           next-method-p               
++  maplist                        nil                         
++
++  Figure 1–10: Symbols in the COMMON-LISP package (part seven of twelve).
++
++
++ ++ ++
++
  nintersection         package-error                  
++  ninth                 package-error-package          
++  no-applicable-method  package-name                   
++  no-next-method        package-nicknames              
++  not                   package-shadowing-symbols      
++  notany                package-use-list               
++  notevery              package-used-by-list           
++  notinline             packagep                       
++  nreconc               pairlis                        
++  nreverse              parse-error                    
++  nset-difference       parse-integer                  
++  nset-exclusive-or     parse-namestring               
++  nstring-capitalize    pathname                       
++  nstring-downcase      pathname-device                
++  nstring-upcase        pathname-directory             
++  nsublis               pathname-host                  
++  nsubst                pathname-match-p               
++  nsubst-if             pathname-name                  
++  nsubst-if-not         pathname-type                  
++  nsubstitute           pathname-version               
++  nsubstitute-if        pathnamep                      
++  nsubstitute-if-not    peek-char                      
++  nth                   phase                          
++  nth-value             pi                             
++  nthcdr                plusp                          
++  null                  pop                            
++  number                position                       
++  numberp               position-if                    
++  numerator             position-if-not                
++  nunion                pprint                         
++  oddp                  pprint-dispatch                
++  open                  pprint-exit-if-list-exhausted  
++  open-stream-p         pprint-fill                    
++  optimize              pprint-indent                  
++  or                    pprint-linear                  
++  otherwise             pprint-logical-block           
++  output-stream-p       pprint-newline                 
++  package               pprint-pop                     
++
++  Figure 1–11: Symbols in the COMMON-LISP package (part eight of twelve).
++
++
++ ++ ++
++
  pprint-tab                 read-char                   
++  pprint-tabular             read-char-no-hang           
++  prin1                      read-delimited-list         
++  prin1-to-string            read-from-string            
++  princ                      read-line                   
++  princ-to-string            read-preserving-whitespace  
++  print                      read-sequence               
++  print-not-readable         reader-error                
++  print-not-readable-object  readtable                   
++  print-object               readtable-case              
++  print-unreadable-object    readtablep                  
++  probe-file                 real                        
++  proclaim                   realp                       
++  prog                       realpart                    
++  prog*                      reduce                      
++  prog1                      reinitialize-instance       
++  prog2                      rem                         
++  progn                      remf                        
++  program-error              remhash                     
++  progv                      remove                      
++  provide                    remove-duplicates           
++  psetf                      remove-if                   
++  psetq                      remove-if-not               
++  push                       remove-method               
++  pushnew                    remprop                     
++  quote                      rename-file                 
++  random                     rename-package              
++  random-state               replace                     
++  random-state-p             require                     
++  rassoc                     rest                        
++  rassoc-if                  restart                     
++  rassoc-if-not              restart-bind                
++  ratio                      restart-case                
++  rational                   restart-name                
++  rationalize                return                      
++  rationalp                  return-from                 
++  read                       revappend                   
++  read-byte                  reverse                     
++
++  Figure 1–12: Symbols in the COMMON-LISP package (part nine of twelve).
++
++
++ ++ ++
++
  room                          simple-bit-vector                  
++  rotatef                       simple-bit-vector-p                
++  round                         simple-condition                   
++  row-major-aref                simple-condition-format-arguments  
++  rplaca                        simple-condition-format-control    
++  rplacd                        simple-error                       
++  safety                        simple-string                      
++  satisfies                     simple-string-p                    
++  sbit                          simple-type-error                  
++  scale-float                   simple-vector                      
++  schar                         simple-vector-p                    
++  search                        simple-warning                     
++  second                        sin                                
++  sequence                      single-float                       
++  serious-condition             single-float-epsilon               
++  set                           single-float-negative-epsilon      
++  set-difference                sinh                               
++  set-dispatch-macro-character  sixth                              
++  set-exclusive-or              sleep                              
++  set-macro-character           slot-boundp                        
++  set-pprint-dispatch           slot-exists-p                      
++  set-syntax-from-char          slot-makunbound                    
++  setf                          slot-missing                       
++  setq                          slot-unbound                       
++  seventh                       slot-value                         
++  shadow                        software-type                      
++  shadowing-import              software-version                   
++  shared-initialize             some                               
++  shiftf                        sort                               
++  short-float                   space                              
++  short-float-epsilon           special                            
++  short-float-negative-epsilon  special-operator-p                 
++  short-site-name               speed                              
++  signal                        sqrt                               
++  signed-byte                   stable-sort                        
++  signum                        standard                           
++  simple-array                  standard-char                      
++  simple-base-string            standard-char-p                    
++
++  Figure 1–13: Symbols in the COMMON-LISP package (part ten of twelve).
++
++
++ ++ ++
++
  standard-class             sublis                      
++  standard-generic-function  subseq                      
++  standard-method            subsetp                     
++  standard-object            subst                       
++  step                       subst-if                    
++  storage-condition          subst-if-not                
++  store-value                substitute                  
++  stream                     substitute-if               
++  stream-element-type        substitute-if-not           
++  stream-error               subtypep                    
++  stream-error-stream        svref                       
++  stream-external-format     sxhash                      
++  streamp                    symbol                      
++  string                     symbol-function             
++  string-capitalize          symbol-macrolet             
++  string-downcase            symbol-name                 
++  string-equal               symbol-package              
++  string-greaterp            symbol-plist                
++  string-left-trim           symbol-value                
++  string-lessp               symbolp                     
++  string-not-equal           synonym-stream              
++  string-not-greaterp        synonym-stream-symbol       
++  string-not-lessp           t                           
++  string-right-trim          tagbody                     
++  string-stream              tailp                       
++  string-trim                tan                         
++  string-upcase              tanh                        
++  string/=                   tenth                       
++  string<                    terpri                      
++  string<=                   the                         
++  string=                    third                       
++  string>                    throw                       
++  string>=                   time                        
++  stringp                    trace                       
++  structure                  translate-logical-pathname  
++  structure-class            translate-pathname          
++  structure-object           tree-equal                  
++  style-warning              truename                    
++
++  Figure 1–14: Symbols in the COMMON-LISP package (part eleven of twelve).
++
++
++ ++ ++
++
  truncate                             values-list               
++  two-way-stream                       variable                  
++  two-way-stream-input-stream          vector                    
++  two-way-stream-output-stream         vector-pop                
++  type                                 vector-push               
++  type-error                           vector-push-extend        
++  type-error-datum                     vectorp                   
++  type-error-expected-type             warn                      
++  type-of                              warning                   
++  typecase                             when                      
++  typep                                wild-pathname-p           
++  unbound-slot                         with-accessors            
++  unbound-slot-instance                with-compilation-unit     
++  unbound-variable                     with-condition-restarts   
++  undefined-function                   with-hash-table-iterator  
++  unexport                             with-input-from-string    
++  unintern                             with-open-file            
++  union                                with-open-stream          
++  unless                               with-output-to-string     
++  unread-char                          with-package-iterator     
++  unsigned-byte                        with-simple-restart       
++  untrace                              with-slots                
++  unuse-package                        with-standard-io-syntax   
++  unwind-protect                       write                     
++  update-instance-for-different-class  write-byte                
++  update-instance-for-redefined-class  write-char                
++  upgraded-array-element-type          write-line                
++  upgraded-complex-part-type           write-sequence            
++  upper-case-p                         write-string              
++  use-package                          write-to-string           
++  use-value                            y-or-n-p                  
++  user-homedir-pathname                yes-or-no-p               
++  values                               zerop                     
++
++  Figure 1–15: Symbols in the COMMON-LISP package (part twelve of twelve).
++
++
++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Symbols.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

10 Symbols

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntactic-Interaction-of-Documentation-Strings-and-Declarations.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++Syntactic Interaction of Documentation Strings and Declarations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.4.11 Syntactic Interaction of Documentation Strings and Declarations

++ ++

In a number of situations, a documentation string can appear amidst a ++series of declare expressions prior to a series of forms. ++

++

In that case, if a string S appears where a documentation string is ++permissible and is not followed by ++ either a declare expression ++ or a form ++then S is taken to be a form; ++otherwise, S is taken as a documentation string. ++The consequences are unspecified if more than one such documentation string ++is present. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax-of-Logical-Pathname-Namestrings.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++Syntax of Logical Pathname Namestrings (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1 Syntax of Logical Pathname Namestrings

++ ++

The syntax of a logical pathname namestring is as follows. ++(Note that unlike many notational descriptions in this document, ++ this is a syntactic description of character sequences, ++ not a structural description of objects.) ++

++

logical-pathname ::=[!host host-marker]  ++                     [!relative-directory-marker] {!directory directory-marker}*  ++                     [!name] [type-marker !type [version-marker !version]] ++

++

host ::=!word ++

++

directory ::=!word | !wildcard-word | !wild-inferiors-word ++

++

name ::=!word | !wildcard-word ++

++

type ::=!word | !wildcard-word ++

++

version ::=!pos-int | newest-word | wildcard-version ++

++

host-marker—a colon. ++

++

relative-directory-marker—a semicolon. ++

++

directory-marker—a semicolon. ++

++

type-marker—a dot. ++

++

version-marker—a dot. ++

++

wild-inferiors-word—The two character sequence “**” (two asterisks). ++

++

newest-word—The six character sequence “newest” ++ or the six character sequence “NEWEST”. ++

++

wildcard-version—an asterisk. ++

++

wildcard-word—one or more asterisks, uppercase letters, ++ digits, and hyphens, including at least one asterisk, ++ with no two asterisks adjacent. ++

++

word—one or more uppercase letters, digits, and hyphens. ++

++

pos-int—a positive integer. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax-of-a-Complex.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Syntax of a Complex (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.2.5 Syntax of a Complex

++ ++

A complex has a Cartesian structure, ++with a real part and an imaginary part each of which is a ++

++

real. ++

++

The parts of a complex are not necessarily floats ++but both parts must be of the same type: ++

++

[Editorial Note by KMP: This is not the same as saying they must be the same type. ++ Maybe we mean they are of the same ‘precision’ or ‘format’? ++ GLS had suggestions which are not yet merged.] ++either both are rationals, or both are of the same float subtype. ++When constructing a complex, if the specified parts are not the ++same type, the parts are converted to be the same type ++internally (i.e., the rational part is converted to a float). ++An object of type (complex rational) is converted internally ++and represented thereafter as a rational if its imaginary part is an ++integer whose value is 0. ++

++

For further information, see Sharpsign C and Printing Complexes. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax-of-a-Float.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Syntax of a Float (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.2.4 Syntax of a Float

++ ++

Floats can be written in either decimal fraction or computerized ++scientific notation: an optional sign, then a non-empty sequence of digits ++with an embedded decimal point, ++then an optional decimal exponent specification. ++If there is no exponent specifier, then ++the decimal point is required, and there must be digits ++after it. ++The exponent specifier consists of an exponent marker, ++an optional sign, and a non-empty sequence of digits. ++If no exponent specifier is present, or if the exponent marker e ++(or E) is used, then ++the format specified ++by *read-default-float-format* is used. ++See Figure~2–9. ++

++

An implementation may provide one or more kinds of float ++that collectively make up the type float. ++The letters s, f, d, and l (or their ++respective uppercase equivalents) explicitly specify the ++use of the types short-float, single-float, ++double-float, and long-float, respectively. ++

++

The internal format used for an external representation depends only ++on the exponent marker, and not on the number of decimal digits ++in the external representation. ++

++

Figure 2–14 contains examples of notations for floats: ++

++
++
  0.0       ;Floating-point zero in default format                          
++  0E0       ;As input, this is also floating-point zero in default format.  
++            ;As output, this would appear as 0.0.                           
++  0e0       ;As input, this is also floating-point zero in default format.  
++            ;As output, this would appear as 0.0.                           
++  -.0       ;As input, this might be a zero or a minus zero,                
++            ; depending on whether the implementation supports              
++            ; a distinct minus zero.                                        
++            ;As output, 0.0 is zero and -0.0 is minus zero.                 
++  0.        ;On input, the integer zero—not a floating-point number!      
++            ;Whether this appears as 0 or 0. on output depends              
++            ;on the value of *print-radix*.                                 
++  0.0s0     ;A floating-point zero in short format                          
++  0s0       ;As input, this is a floating-point zero in short format.       
++            ;As output, such a zero would appear as 0.0s0                   
++            ; (or as 0.0 if short-float was the default format).            
++  6.02E+23  ;Avogadro’s number, in default format                           
++  602E+21   ;Also Avogadro’s number, in default format                      
++
++               Figure 2–14: Examples of Floating-point numbers             
++
++
++ ++

For information on how floats are printed, ++see Printing Floats. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax-of-a-Ratio.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++Syntax of a Ratio (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.2.3 Syntax of a Ratio

++ ++

Ratios can be written as an optional sign followed by two ++non-empty sequences of digits separated by a slash; ++see Figure~2–9. ++The second sequence may not consist ++entirely of zeros. ++Examples of ratios are in Figure 2–13. ++

++
++
  2/3                 ;This is in canonical form                  
++  4/6                 ;A non-canonical form for 2/3               
++  -17/23              ;A ratio preceded by a sign                 
++  -30517578125/32768  ;This is (-5/2)^15                        
++  10/5                ;The canonical form for this is 2           
++  #o-101/75           ;Octal notation for -65/61                  
++  #3r120/21           ;Ternary notation for 15/7                  
++  #Xbc/ad             ;Hexadecimal notation for 188/173           
++  #xFADED/FACADE      ;Hexadecimal notation for 1027565/16435934  
++
++                  Figure 2–13: Examples of Ratios                
++
++
++ ++

[Reviewer Note by Barmar: #o, #3r, #X, and #x mentioned above ++ are not in the syntax rules defined just above that.] ++

++

For information on how ratios are printed, ++see Printing Ratios. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax-of-a-Rational.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Syntax of a Rational (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.2.1 Syntax of a Rational

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax-of-an-Integer.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Syntax of an Integer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.2.2 Syntax of an Integer

++ ++

Integers can be written as a sequence of digits, ++optionally preceded by a sign and optionally followed by a decimal point; ++see Figure~2–9. ++When a decimal point is used, ++the digits are taken to be in radix 10; ++when no decimal point is used, ++the digits are taken to be in radix given by the current input base. ++

++

For information on how integers are printed, see Printing Integers. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Syntax.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2 Syntax

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/System-Construction-Concepts.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++System Construction Concepts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.1 System Construction Concepts

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/System-Construction-Dictionary.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++System Construction Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2 System Construction Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/System-Construction.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++System Construction (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

24 System Construction

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/THE-Forms-as-Places.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++THE Forms as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.4 THE Forms as Places

++ ++

A the form can be used as a place, ++in which case the declaration is transferred to the newvalue form, ++and the resulting setf is analyzed. For example, ++

++
++
 (setf (the integer (cadr x)) (+ y 3))
++
++ ++

is processed as if it were ++

++
++
 (setf (cadr x) (the integer (+ y 3)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Termination-Test-Clauses.html +@@ -0,0 +1,191 @@ ++ ++ ++ ++ ++ ++Termination Test Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.4 Termination Test Clauses

++ ++

The repeat construct causes iteration to terminate after a ++specified number of times. ++ The loop body executes n times, where n is the value ++of the expression form. The form argument is evaluated one time ++in the loop prologue. If the expression evaluates to 0 or ++to a negative number, the loop body is not evaluated. ++

++

The constructs always, ++never, ++thereis, ++while, ++until, ++and the macro loop-finish ++allow conditional termination of iteration within ++a loop. ++

++

The constructs always, never, and thereis provide ++specific values to be returned when a loop terminates. ++Using always, never, or thereis in a loop with ++value accumulation clauses that are not into causes ++an error of type program-error to be signaled (at macro expansion time). ++Since always, never, and thereis ++use ++

++

the return-from special operator ++

++

to terminate iteration, ++any finally clause that is supplied is not evaluated ++when exit occurs due to any of these constructs. ++In all other respects these ++constructs behave like the while and until constructs. ++

++

The always construct takes one form and terminates the ++loop ++ if the form ever evaluates to nil; in this case, it returns ++ nil. Otherwise, it provides a default return value of t. ++If the value of the supplied form is never nil, some other construct ++can terminate the iteration. ++

++

The never construct terminates iteration the first time that ++the value of the supplied form is non-nil; the loop returns ++nil. ++If the value of the supplied form is always nil, some other ++construct can terminate the iteration. ++Unless some other clause contributes ++a return value, the default value returned is t. ++

++

The thereis construct terminates iteration the first time that the ++value of the supplied form is non-nil; the loop returns the ++value of the supplied form. ++If the value of the supplied form ++is always nil, some other ++construct can terminate the iteration. Unless some other clause contributes a ++return value, the default value returned is nil. ++

++

There are two differences between the thereis and until ++constructs: ++

++
++
*
++

The until construct does not return a value or ++nil based on the value of the supplied form. ++

++
++
*
++

The until construct executes ++any finally clause. ++Since thereis uses ++

++

the return-from special operator ++

++

to terminate iteration, ++any finally clause that is supplied is not evaluated ++when exit occurs due to thereis. ++

++
++
++ ++

The while construct allows iteration to continue until the ++supplied form ++evaluates to false. The supplied form ++is reevaluated at the location of the while clause. ++

++

The until construct is equivalent to ++while (not form)\dots. If the value of the ++supplied form is non-nil, iteration terminates. ++

++

Termination-test control constructs can be used anywhere within the loop body. ++The termination tests are used in the order in which they appear. ++If an until or while clause causes ++termination, any clauses that precede it in the source ++are still evaluated. ++If the until and while constructs cause termination, ++control is passed to the loop epilogue, where any finally ++clauses will be executed. ++

++

There are two differences between the never and until ++constructs: ++

++
++
*
++

The until construct does not return ++t or nil based on the value of the supplied form. ++

++
++
*
++

The until construct ++does not bypass any finally clauses. ++Since never uses ++

++

the return-from special operator ++

++

to terminate iteration, ++any finally clause that is supplied is not evaluated ++when exit occurs due to never. ++

++
++ ++

In most cases it is not necessary to use loop-finish ++because other loop control clauses terminate the loop. ++The macro loop-finish is used to provide a normal exit ++from a nested conditional inside a loop. ++Since loop-finish transfers control to the loop epilogue, ++using loop-finish within a finally expression can cause ++infinite looping. ++

++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-COMMON_002dLISP-Package.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++The COMMON-LISP Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.1 The COMMON-LISP Package

++ ++ ++ ++ ++ ++

The COMMON-LISP package contains the primitives of the Common Lisp system as ++defined by this specification. Its external symbols include ++all of the defined names (except for defined names in ++the KEYWORD package) that are present in the Common Lisp system, ++such as car, cdr, *package*, etc. ++The COMMON-LISP package has the nickname CL. ++

++

The COMMON-LISP package has as external symbols those ++symbols enumerated in the figures in Symbols in the COMMON-LISP Package, and no others. ++These external symbols are present in the COMMON-LISP package ++but their home package need not be the COMMON-LISP package. ++

++

For example, the symbol HELP cannot be an external symbol of ++the COMMON-LISP package because it is not mentioned in Symbols in the COMMON-LISP Package. ++In contrast, the symbol variable ++must be an external symbol of the COMMON-LISP package ++even though it has no definition ++because it is listed in that section ++(to support its use as a valid second argument to the function documentation). ++

++

The COMMON-LISP package can have additional internal symbols. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-COMMON_002dLISP_002dUSER-Package.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++The COMMON-LISP-USER Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.5 The COMMON-LISP-USER Package

++ ++ ++ ++ ++ ++

The COMMON-LISP-USER package is the current package when ++a Common Lisp system starts up. This package uses the COMMON-LISP package. ++The COMMON-LISP-USER package has the nickname CL-USER. ++

++

The COMMON-LISP-USER package can have additional symbols interned within it; ++it can use other implementation-defined packages. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Consing-Dot.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++The Consing Dot (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.3 The Consing Dot

++ ++

If a token consists solely of dots (with no escape characters), ++then an error of type reader-error is signaled, ++except in one circumstance: ++if the token is a single dot ++and appears in a situation where dotted pair notation permits a dot, ++then it is accepted as part of such syntax and no error is signaled. ++See Left-Parenthesis. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Current-Readtable.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++The Current Readtable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Readtables  

++
++
++

2.1.1.1 The Current Readtable

++ ++

Several readtables describing different syntaxes can exist, ++but at any given time only one, called the current readtable ++ ++, ++affects the way in which expressions_2 are parsed ++into objects by the Lisp reader. ++The current readtable in a given dynamic environment ++is the value of *readtable* in that environment. ++To make a different readtable become the current readtable, ++*readtable* can be assigned or bound. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Device-part-of-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The Device part of a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.3 The Device part of a Logical Pathname Namestring

++ ++

There is no syntax for a logical pathname device since ++the device component of a logical pathname is always :unspecific; ++see Unspecific Components of a Logical Pathname. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Directory-part-of-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++The Directory part of a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.4 The Directory part of a Logical Pathname Namestring

++ ++

If a relative-directory-marker precedes the directories, ++the directory component parsed is as relative; ++otherwise, the directory component is parsed as absolute. ++

++

If a wild-inferiors-marker is specified, ++it parses into :wild-inferiors. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-EOF_002dERROR_002dP-argument.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++The EOF-ERROR-P argument (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.1.3.1 The EOF-ERROR-P argument

++ ++

Eof-error-p in input function calls ++controls what happens if input is from a file (or any other ++input source that has a definite end) and the end of the file is reached. ++If eof-error-p is true (the default), ++an error of type end-of-file is signaled ++at end of file. If it is false, then no error is signaled, and instead ++the function returns eof-value. ++

++

Functions such as read that read the representation ++of an object rather than a single ++character always signals an error, regardless of eof-error-p, if ++the file ends in the middle of an object representation. ++For example, if a file does ++not contain enough right parentheses to balance the left parentheses in ++it, read signals an error. If a file ends in a ++symbol or a number ++immediately followed by end-of-file, read reads the ++symbol or ++number ++successfully and when called again will ++act according to eof-error-p. ++Similarly, the function read-line ++successfully reads the last line of a file even if that line ++is terminated by end-of-file rather than the newline character. ++Ignorable text, such as lines containing only whitespace_2 or comments, ++are not considered to begin an object; ++if read begins to read an expression but sees only such ++ignorable text, it does not consider the file to end in the middle of an object. ++Thus an eof-error-p argument controls what happens ++when the file ends between objects. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Evaluation-Model.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++The Evaluation Model (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.2 The Evaluation Model

++ ++

A Common Lisp system evaluates forms with respect to lexical, ++dynamic, and global environments. The following sections ++describe the components of the Common Lisp evaluation model. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-External-Environment.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++The External Environment (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment  

++
++
++

25.1 The External Environment

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Global-Environment.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++The Global Environment (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.1.1 The Global Environment

++ ++

The global environment ++ ++ is that part of an environment ++that contains bindings with both indefinite scope ++and indefinite extent. ++The global environment contains, among other things, the following: ++

++
++
*
++

bindings of dynamic variables and constant variables. ++

++
*
++

bindings of functions, macros, and special operators. ++

++
*
++
++

bindings of compiler macros. ++

++
++
*
++

bindings of type and class names ++

++
*
++

information about proclamations. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Host-part-of-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++The Host part of a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.2 The Host part of a Logical Pathname Namestring

++ ++

The host must have been defined as a logical pathname host; ++this can be done by using setf of logical-pathname-translations. ++

++

The logical pathname host name "SYS" is reserved for the implementation. ++The existence and meaning of SYS: logical pathnames ++is implementation-defined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Initial-Readtable.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++The Initial Readtable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Readtables  

++
++
++

2.1.1.3 The Initial Readtable

++ ++

The initial readtable ++ ++ is ++the readtable that is the current readtable ++at the time when the Lisp image starts. ++At that time, it conforms to standard syntax. ++The initial readtable is distinct ++from the standard readtable. ++It is permissible for a conforming program ++to modify the initial readtable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-KEYWORD-Package.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++The KEYWORD Package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.1.2.6 The KEYWORD Package

++ ++ ++ ++

The KEYWORD package contains symbols, called keywords_1, ++that are typically used as special markers in programs ++and their associated data expressions_1. ++

++

Symbol tokens that start with a package marker ++are parsed by the Lisp reader as symbols ++in the KEYWORD package; see Symbols as Tokens. ++This makes it notationally convenient to use keywords ++when communicating between programs in different packages. ++For example, the mechanism for passing keyword parameters in a call uses ++keywords_1 to name the corresponding arguments; ++see Ordinary Lambda Lists. ++

++

Symbols in the KEYWORD package are, by definition, of type keyword. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-LOOP-Facility.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++The LOOP Facility (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Iteration  

++
++
++

6.1 The LOOP Facility

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Lisp-Pretty-Printer.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++The Lisp Pretty Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer  

++
++
++

22.2 The Lisp Pretty Printer

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Lisp-Printer.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++The Lisp Printer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer  

++
++
++

22.1 The Lisp Printer

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Null-Lexical-Environment.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++The Null Lexical Environment (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.1.1.4 The Null Lexical Environment

++ ++

The null lexical environment ++ ++ is equivalent to the global environment. ++

++

Although in general the representation of an environment object ++is implementation-dependent, nil can be used in any situation where an ++environment object is called for in order to denote ++the null lexical environment. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Pathname-Device-Component.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The Pathname Device Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1.2 The Pathname Device Component

++ ++

Corresponds to the “device” or “file structure” concept in many ++host file systems: the name of a logical or physical device containing files. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Pathname-Directory-Component.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The Pathname Directory Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1.3 The Pathname Directory Component

++ ++

Corresponds to the “directory” concept in many host file systems: ++the name of a group of related files. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Pathname-Host-Component.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The Pathname Host Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1.1 The Pathname Host Component

++ ++

The name of the file system on which the file resides, ++or the name of a logical host. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Pathname-Name-Component.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The Pathname Name Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1.4 The Pathname Name Component

++ ++

The “name” part of a group of files that can be thought of ++as conceptually related. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Pathname-Type-Component.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The Pathname Type Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1.5 The Pathname Type Component

++ ++

Corresponds to the “filetype” or “extension” concept in many host ++file systems. This says what kind of file this is. ++This component is always a string, nil, :wild, or :unspecific. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Pathname-Version-Component.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++The Pathname Version Component (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.1.6 The Pathname Version Component

++ ++

Corresponds to the “version number” concept in many host file systems. ++

++

The version is either a positive integer ++or a symbol from the following list: ++nil, :wild, :unspecific, or :newest ++(refers to the largest version number that already exists in ++the file system when reading a file, or to ++a version number ++greater than any already existing in the file system ++when writing a new file). Implementations ++can define other special version symbols. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-RECURSIVE_002dP-argument.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++The RECURSIVE-P argument (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.1.3.2 The RECURSIVE-P argument

++ ++

If recursive-p is supplied and not nil, it specifies that ++this function call is not an outermost call to read but an ++embedded call, typically from a reader macro function. ++It is important to distinguish such recursive calls for three reasons. ++

++
++
1.
++

An outermost call establishes the context within which the ++#n= and #n# syntax is scoped. Consider, for example, ++the expression ++

++
++
 (cons '#3=(p q r) '(x y . #3#))
++
++ ++

If the single-quote reader macro were defined in this way: ++

++
++
 (set-macro-character #\'       ;incorrect
++    #'(lambda (stream char)
++         (declare (ignore char))
++         (list 'quote (read stream))))
++
++ ++

then each call to the single-quote reader macro function would establish ++independent contexts for the scope of read information, including the scope of ++identifications between markers like “#3=” and “#3#”. However, for ++this expression, the scope was clearly intended to be determined by the outer set ++of parentheses, so such a definition would be incorrect. ++The correct way to define the single-quote ++reader macro uses recursive-p: ++

++
++
 (set-macro-character #\'       ;correct
++    #'(lambda (stream char)
++         (declare (ignore char))
++         (list 'quote (read stream t nil t))))
++
++ ++
++
2.
++

A recursive call does not alter whether the reading process ++is to preserve whitespace_2 or not (as determined by whether the ++outermost call was to read or read-preserving-whitespace). ++Suppose again that single-quote ++were to be defined as shown above in the incorrect definition. ++Then a call to read-preserving-whitespace ++that read the expression 'foo<Space> would fail to preserve the space ++character following the symbol foo because the single-quote ++reader macro function calls read, ++not read-preserving-whitespace, ++to read the following expression (in this case foo). ++The correct definition, which passes the value true for recursive-p ++to read, allows the outermost call to determine ++whether whitespace_2 is preserved. ++

++
++
3.
++

When end-of-file is encountered and the eof-error-p argument ++is not nil, the kind of error that is signaled may depend on the value ++of recursive-p. If recursive-p ++is true, then the end-of-file ++is deemed to have occurred within the middle of a printed representation; ++if recursive-p is false, then the end-of-file may be deemed to have ++occurred between objects rather than within the middle of one. ++

++
++
++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Standard-Readtable.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++The Standard Readtable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Readtables  

++
++
++

2.1.1.2 The Standard Readtable

++ ++

The standard readtable ++ ++ conforms to standard syntax. ++The consequences are undefined if an attempt is made ++to modify the standard readtable. ++To achieve the effect of altering or extending standard syntax, ++a copy of the standard readtable can be created; see the function copy-readtable. ++

++

The readtable case of the standard readtable is :upcase. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Type-part-of-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The Type part of a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.5 The Type part of a Logical Pathname Namestring

++ ++

The type of a logical pathname for a source file ++is "LISP". This should be translated into whatever type is ++appropriate in a physical pathname. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-Version-part-of-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++The Version part of a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.6 The Version part of a Logical Pathname Namestring

++ ++

Some file systems do not have versions. ++Logical pathname translation to such a file system ++ignores the version. ++This implies that a program cannot rely on being able to store ++more than one version of a file named by a logical pathname. ++

++

If a wildcard-version is specified, ++it parses into :wild. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Affected-By_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++The "Affected By" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.1 The "Affected By" Section of a Dictionary Entry

++ ++

For an operator, anything that can affect the side effects of ++or values returned by the operator. ++

++

For a variable, anything that can affect the value of the variable ++including functions that bind or assign it. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Argument-Precedence-Order_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Argument Precedence Order" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.16 The "Argument Precedence Order" Section of a Dictionary Entry

++ ++

This information describes the argument precedence order. ++If it is omitted, the argument precedence order is the default (left to right). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Arguments-and-Values_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++The "Arguments and Values" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.3 The "Arguments and Values" Section of a Dictionary Entry

++ ++

An English language description of what arguments the operator accepts ++and what values it returns, including information about defaults for parameters ++corresponding to omittable arguments ++(such as optional parameters and keyword parameters). ++For special operators and macros, ++their arguments are not evaluated unless it is explicitly stated in their ++descriptions that they are evaluated. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Arguments_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The "Arguments" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.2 The "Arguments" Section of a Dictionary Entry

++ ++

This information describes the syntax information of entries such as those for ++declarations and special expressions which are never evaluated ++as forms, and so do not return values. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Binding-Types-Affected_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++The "Binding Types Affected" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.4 The "Binding Types Affected" Section of a Dictionary Entry

++ ++

This information alerts the reader to the kinds of bindings that might ++potentially be affected by a declaration. Whether in fact any particular such ++binding is actually affected is dependent on additional factors as well. ++See The "Description" Section of the declaration in question for details. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Class-Precedence-List_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++The "Class Precedence List" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.5 The "Class Precedence List" Section of a Dictionary Entry

++ ++

This appears in the dictionary entry for a class, ++and contains an ordered list of the classes defined ++by Common Lisp that must be in the class precedence list of this class. ++

++

It is permissible for other (implementation-defined) classes ++to appear in the implementation’s class precedence list for the class. ++

++

It is permissible for ++ either standard-object ++ or structure-object ++to appear in the implementation’s class precedence list; ++for details, see Type Relationships. ++

++

Except as explicitly indicated otherwise somewhere in this specification, ++no additional standardized classes may appear in ++the implementation’s class precedence list. ++

++

By definition of the relationship between classes and types, ++the classes listed in this section are also supertypes of ++the type denoted by the class. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Compound-Type-Specifier-Arguments_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Compound Type Specifier Arguments" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.9 The "Compound Type Specifier Arguments" Section of a Dictionary Entry

++ ++

This information describes type information for the structures defined in ++The "Compound Type Specifier Syntax" Section. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Compound-Type-Specifier-Description_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Compound Type Specifier Description" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.10 The "Compound Type Specifier Description" Section of a Dictionary Entry

++ ++

This information describes the meaning of the structures defined in ++The "Compound Type Specifier Syntax" Section. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Compound-Type-Specifier-Kind_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++The "Compound Type Specifier Kind" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.7 The "Compound Type Specifier Kind" Section of a Dictionary Entry

++ ++

An “abbreviating” type specifier is one that describes a subtype ++for which it is in principle possible to enumerate the elements, ++but for which in practice it is impractical to do so. ++

++

A “specializing” type specifier is one that describes a subtype ++by restricting the type of one or more components of the type, ++such as element type or complex part type. ++

++

A “predicating” type specifier is one that describes a subtype ++containing only those objects that satisfy a given predicate. ++

++

A “combining” type specifier is one that describes a subtype ++in a compositional way, using combining operations (such as “and,” “or,” and ++“not”) on other types. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Compound-Type-Specifier-Syntax_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++The "Compound Type Specifier Syntax" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.8 The "Compound Type Specifier Syntax" Section of a Dictionary Entry

++ ++

This information about a type describes the syntax of a ++compound type specifier for that type. ++

++

Whether or not the type is acceptable as an atomic type specifier ++is not represented here; see Dictionary Entries for Type Specifiers. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Constant-Value_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Constant Value" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.11 The "Constant Value" Section of a Dictionary Entry

++ ++

This information describes the unchanging type and value of ++a constant variable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Description_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The "Description" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.12 The "Description" Section of a Dictionary Entry

++ ++

A summary of the operator and all intended aspects of the operator, ++but does not necessarily include all the fields referenced below it ++(“Side Effects,” “Exceptional Situations,” etc.) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Examples_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The "Examples" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.13 The "Examples" Section of a Dictionary Entry

++ ++

Examples of use of the operator. ++These examples are not considered part of the standard; ++see Sections Not Formally Part Of This Standard. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Exceptional-Situations_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++The "Exceptional Situations" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.14 The "Exceptional Situations" Section of a Dictionary Entry

++ ++

Three kinds of information may appear here: ++

++
*
++

Situations that are detected by the function and formally signaled. ++

++
*
++

Situations that are handled by the function. ++

++
*
++

Situations that may be detected by the function. ++

++
++ ++

This field does not include conditions that could ++be signaled by functions passed to and called by this operator ++as arguments or through dynamic variables, nor by executing subforms of this ++operator if it is a macro or special operator. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Initial-Value_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Initial Value" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.15 The "Initial Value" Section of a Dictionary Entry

++ ++

This information describes the initial value of a dynamic variable. ++Since this variable might change, see type restrictions in The "Value Type" Section. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Method-Signature_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++The "Method Signature" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.17 The "Method Signature" Section of a Dictionary Entry

++ ++

The description of a generic function includes descriptions of the ++methods that are defined on that generic function by the standard. ++A method signature is used to describe the parameters and ++parameter specializers for each method. ++Methods defined for the generic function must be of the form described ++by the method signature. ++

++

F (x class) ++ (y t) ++ &optional z &key k ++

++

This signature indicates that this method on the generic function ++F has two required parameters: ++ x, which must be a generalized instance of the class class; ++ and y, which can be any object ++ (i.e., a generalized instance of the class t). ++In addition, there is an optional parameter z and a ++keyword parameter k. This signature also indicates that this ++method on F is a primary method and has no qualifiers. ++

++

For each parameter, the argument supplied must be in the ++intersection of the type specified in the description of the ++corresponding generic function and the type given in ++the signature of some method (including not only those ++methods defined in this specification, but also ++implementation-defined or user-defined methods in situations ++where the definition of such methods is permitted). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Name_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++The "Name" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.18 The "Name" Section of a Dictionary Entry

++ ++

This section introduces the dictionary entry. It is not explicitly labeled. ++It appears preceded and followed by a horizontal bar. ++

++

In large print at left, the defined name appears; if more than one ++defined name is to be described by the entry, all such names ++are shown separated by commas. ++

++

In somewhat smaller italic print at right is an indication of what kind ++of dictionary entry this is. Possible values are: ++

++
++
Accessor
++

This is an accessor function. ++

++
++
Class
++

This is a class. ++

++
++
Condition Type
++

This is a subtype of type condition. ++

++
++
Constant Variable
++

This is a constant variable. ++

++
++
Declaration
++

This is a declaration identifier. ++

++
++
Function
++

This is a function. ++

++
++
Local Function
++

This is a function that is defined only lexically within the scope of some ++other macro form. ++

++
++
Local Macro
++

This is a macro that is defined only lexically within the scope of some ++other macro form. ++

++
++
Macro
++

This is a macro. ++

++
++
Restart
++

This is a restart. ++

++
++
Special Operator
++

This is a special operator. ++

++
++
Standard Generic Function
++

This is a standard generic function. ++

++
++
Symbol
++

This is a symbol that is specially recognized in some particular situation, ++such as the syntax of a macro. ++

++
++
System Class
++

This is like class, but it identifies a class that is potentially ++a built-in class. (No class is actually required to be a ++built-in class.) ++

++
++
Type
++

This is an atomic type specifier, ++and depending on information for each particular entry, ++may subject to form other type specifiers. ++

++
++
Type Specifier
++

This is a defined name that is not an atomic type specifier, ++but that can be used in constructing valid type specifiers. ++

++
++
Variable
++

This is a dynamic variable. ++

++
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Notes_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++The "Notes" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.19 The "Notes" Section of a Dictionary Entry

++ ++

Information not found elsewhere in this description ++which pertains to this operator. ++Among other things, this might include ++ cross reference information, ++ code equivalences, ++ stylistic hints, ++ implementation hints, ++ typical uses. ++This information is not considered part of the standard; ++any conforming implementation or conforming program ++is permitted to ignore the presence of this information. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Pronunciation_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++The "Pronunciation" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.20 The "Pronunciation" Section of a Dictionary Entry

++ ++

This offers a suggested pronunciation for defined names ++so that people not in verbal communication with the original designers ++can figure out how to pronounce words that are not in normal English usage. ++This information is advisory only, and is not considered part of the standard. ++For brevity, it is only provided for entries with names that are specific to ++Common Lisp and would not be found in Webster’s Third New International Dictionary ++ the English Language, Unabridged. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022See-Also_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++The "See Also" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.21 The "See Also" Section of a Dictionary Entry

++ ++

List of references to other parts of this standard ++that offer information relevant to this operator. ++This list is not part of the standard. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Side-Effects_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Side Effects" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.22 The "Side Effects" Section of a Dictionary Entry

++ ++

Anything that is changed as a result of the ++evaluation of the form containing this operator. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Supertypes_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++The "Supertypes" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.23 The "Supertypes" Section of a Dictionary Entry

++ ++

This appears in the dictionary entry for a type, ++and contains a list of the standardized types ++that must be supertypes of this type. ++

++

In implementations where there is a corresponding class, ++the order of the classes in the class precedence list ++is consistent with the order presented in this section. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Syntax_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++The "Syntax" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.24 The "Syntax" Section of a Dictionary Entry

++ ++

This section describes how to use the defined name in code. ++The "Syntax” description for a generic function ++describes the lambda list of the generic function itself, ++while The "Method Signatures” describe the lambda lists ++of the defined methods. ++The "Syntax” description for ++ an ordinary function, ++ a macro, ++ or a special operator ++describes its parameters. ++

++

For example, an operator description might say: ++

++

F x y &optional z &key k ++

++

This description indicates that the function F ++has two required parameters, x and y. In addition, ++there is an optional parameter z and a keyword parameter k. ++

++

For macros and special operators, syntax is given ++in modified BNF notation; see Modified BNF Syntax. ++For functions a lambda list is given. ++In both cases, however, the outermost parentheses are omitted, ++and default value information is omitted. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Valid-Context_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++The "Valid Context" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.31 The "Valid Context" Section of a Dictionary Entry

++ ++

This information is used by dictionary entries such as “Declarations” ++in order to restrict the context in which the declaration may appear. ++

++

A given “Declaration” might appear in ++ a declaration (i.e., a declare expression), ++ a proclamation (i.e., a declaim or proclaim form), ++ or both. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-_0022Value-Type_0022-Section-of-a-Dictionary-Entry.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++The "Value Type" Section of a Dictionary Entry (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.32 The "Value Type" Section of a Dictionary Entry

++ ++

This information describes any type restrictions on a dynamic variable. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002dacross-subclause.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++The for-as-across subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.10 The for-as-across subclause

++ ++

In the for-as-across subclause the for ++ or as construct binds the variable var to the value of ++ each element in the array vector. ++ The loop keyword across marks the array vector; across ++ is used as a preposition in this syntax. ++ Iteration stops when there are no more elements in the supplied ++ array that can be referenced. ++ Some implementations might recognize a the special form ++ in the vector form to produce more efficient code. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002darithmetic-subclause.html +@@ -0,0 +1,167 @@ ++ ++ ++ ++ ++ ++The for-as-arithmetic subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.2 The for-as-arithmetic subclause

++ ++

In the for-as-arithmetic subclause, the for ++or as construct iterates from the value supplied by ++form1 to the value supplied by form2 in increments or ++decrements denoted by form3. Each ++expression is evaluated only once and must evaluate to a number. ++The variable var is bound to the value of ++form1 in the first iteration and is stepped_1 ++by the value of form3 in each succeeding iteration, ++or by 1 if form3 is not provided. ++The following loop keywords serve as valid prepositions within this ++syntax. ++At least one of the ++prepositions must be used; ++and at most one from each line may be used in a single subclause. ++

++
++
from | downfrom | upfrom
++
to | downto | upto | below | above
++
by
++
++ ++

The prepositional phrases in each subclause may appear in any order. ++For example, either “from x by y” or “by y from x” is permitted. ++However, because left-to-right order of evaluation is preserved, ++the effects will be different in the case of side effects. ++

++ ++ ++ ++ ++

Consider: ++

++
++
(let ((x 1)) (loop for i from x by (incf x) to 10 collect i))
++⇒  (1 3 5 7 9)
++(let ((x 1)) (loop for i by (incf x) from x to 10 collect i))
++⇒  (2 4 6 8 10)
++
++ ++

The descriptions of the prepositions follow: ++

++
++
from
++

The loop keyword from specifies the value from which ++stepping_1 begins, as supplied by form1. ++Stepping_1 is incremental by default. If ++decremental stepping_1 is desired, ++the preposition downto ++or above must be used with form2. For incremental ++stepping_1, the default from value is 0. ++

++
++
downfrom, upfrom
++

The loop keyword downfrom ++indicates that the variable var is decreased in decrements ++supplied by form3; the loop keyword upfrom indicates that ++var is increased in increments supplied by form3. ++

++
++
to
++

The loop keyword to marks the end value ++for stepping_1 supplied in form2. ++Stepping_1 is incremental by default. ++If decremental stepping_1 is desired, ++the preposition downfrom must be used with form1, ++or else the preposition downto or above should be used instead ++ of to with form2. ++

++
++
downto, upto
++

The loop keyword downto specifies decremental stepping; ++the loop keyword upto specifies incremental stepping. ++In both cases, the amount of change on each step is specified by form3, ++and the loop terminates when the variable var passes ++the value of form2. ++Since there is no default for form1 in decremental stepping_1, ++a form1 value must be supplied (using from or downfrom) ++when downto is supplied. ++

++
++
below, above
++

The loop keywords below and above are analogous to ++upto and downto respectively. These keywords stop ++iteration just before the value of the variable var reaches the value ++supplied by form2; the end value of form2 is not included. ++Since there is no default for form1 in decremental stepping_1, ++a form1 value must be supplied (using from or downfrom) ++when above is supplied. ++

++
++
by
++

The loop keyword by marks the increment or decrement supplied by ++form3. The value of form3 can be any ++positive ++number. ++The default value is 1. ++

++
++
++ ++

In an iteration control clause, the for or as construct ++causes termination when the supplied limit is reached. That is, ++iteration continues until the value var is stepped to the ++exclusive or inclusive limit supplied by form2. The range is ++exclusive if form3 increases or decreases var ++to the value of form2 without reaching that value; the loop ++keywords below and above provide exclusive limits. An ++inclusive limit allows var to attain the value of ++form2; to, downto, and upto provide inclusive ++limits. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002dequals_002dthen-subclause.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++The for-as-equals-then subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.8 The for-as-equals-then subclause

++ ++

In the for-as-equals-then subclause ++the for ++or as construct ++initializes the variable var by setting it to the ++ result of evaluating form1 on the first iteration, then setting ++ it to the result of evaluating form2 on the second and ++ subsequent iterations. If form2 is omitted, the construct ++ uses form1 on the second and ++ subsequent iterations. ++The loop keywords = and then serve as valid prepositions ++in this syntax. ++This construct does not provide any termination tests. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002dhash-subclause.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++The for-as-hash subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.12 The for-as-hash subclause

++ ++

In the for-as-hash subclause ++ the for ++ or as construct ++ iterates over the elements, keys, and values of a hash-table. ++ In this syntax, a compound preposition is used to designate access to a ++ hash table. ++ The variable var takes on the value of each hash key ++ or hash value in the supplied hash-table. ++ The following loop keywords serve as valid prepositions within this syntax: ++

++
++
being
++

The keyword being introduces either the Loop schema ++hash-key or hash-value. ++

++
++
each, the
++

The loop keyword each ++follows the loop keyword being when hash-key or ++hash-value is used. The loop keyword the is used with ++hash-keys and hash-values only for ease of reading. ++This agreement isn’t required. ++

++
++
hash-key, hash-keys
++

These loop keywords access each key entry of the hash table. If ++the name hash-value is supplied in a using construct with one ++of these Loop schemas, the iteration can optionally access the keyed ++value. The order in which the keys are accessed is undefined; empty ++slots in the hash table are ignored. ++

++
++
hash-value, hash-values
++

These loop keywords access each value entry of a ++hash table. If ++the name hash-key is supplied in a using construct with one of ++these Loop schemas, the iteration can optionally access the key that ++corresponds to the value. The order in which the keys are accessed is ++undefined; empty slots in the hash table are ignored. ++

++
++
using
++

The loop keyword using introduces ++the optional key or the keyed value to ++be accessed. It allows access to the hash key if iteration is over ++the hash values, and the hash value if ++iteration is over the hash keys. ++

++
++
in, of
++

These loop prepositions introduce hash-table. ++

++
++
++ ++

In effect ++

++

being ++{each | the} ++{hash-value | ++ hash-values | ++ hash-key | ++ hash-keys} ++{in | of} ++

++

is a compound preposition. ++

++

Iteration stops when there are no more hash keys or hash values to be ++referenced in the supplied hash-table. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002din_002dlist-subclause.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++The for-as-in-list subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.4 The for-as-in-list subclause

++ ++

In the for-as-in-list subclause, ++the for ++or as construct iterates over the contents of a ++list. It checks for ++the end of the list as if by using endp. ++The variable var is bound to the successive elements of ++the list in form1 before each ++iteration. At the end of each iteration, the function step-fun ++is applied to the list; the default value for step-fun is ++cdr. ++The loop keywords in and by serve as valid prepositions in ++this syntax. ++The for or as construct causes termination when the ++end of the list is reached. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002don_002dlist-subclause.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++The for-as-on-list subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.6 The for-as-on-list subclause

++ ++

In the for-as-on-list subclause, the for or as ++construct iterates over ++a list. It checks for the ++end of the list as if by using atom. ++

++

The variable var is bound to the successive tails of the ++list in ++form1. At the end of each iteration, the function step-fun ++ is applied to the list; the default value for step-fun is cdr. ++ The loop keywords on and by serve as valid ++prepositions in this syntax. ++The for or as construct causes termination when the ++end of the list is reached. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/The-for_002das_002dpackage-subclause.html +@@ -0,0 +1,138 @@ ++ ++ ++ ++ ++ ++The for-as-package subclause (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2.13 The for-as-package subclause

++ ++

In the for-as-package subclause ++the for ++or as construct ++iterates over the symbols in a package. ++In this syntax, a compound preposition is used to designate access to a ++package. ++The variable var takes on the value of each symbol ++in the supplied package. ++ The following loop keywords serve as valid prepositions within this syntax: ++

++
++
being
++

The keyword being introduces either the Loop schema ++symbol, present-symbol, or external-symbol. ++

++
++
each, the
++

The loop keyword each ++follows the loop keyword being when symbol, ++present-symbol, or external-symbol is used. ++The loop keyword the is used with symbols, ++present-symbols, and external-symbols only for ease of reading. ++This agreement isn’t required. ++

++
++
present-symbol, present-symbols
++

These Loop schemas iterate over the symbols ++

++

that are present in a package. ++

++

The package to be iterated over is supplied in the same way ++that package arguments to find-package are supplied. ++If the package for the iteration is not supplied, ++the current package is used. ++If a package that does not exist is supplied, ++an error of type package-error is signaled. ++

++
++
symbol, symbols
++

These Loop schemas iterate over symbols that are ++accessible in a given package. ++The package to be iterated over is supplied in the same way ++that package arguments to find-package are supplied. ++If the package for the iteration is not supplied, ++the current package is used. ++If a package that does not exist is supplied, ++an error of type package-error is signaled. ++

++
++
external-symbol, external-symbols
++

These Loop schemas iterate over the external symbols of a package. ++The package to be iterated over is supplied in the same way ++that package arguments to find-package are supplied. ++If the package for the iteration is not supplied, ++the current package is used. ++If a package that does not exist is supplied, ++an error of type package-error is signaled. ++

++
++
in, of
++

These loop prepositions introduce package. ++

++
++
++ ++

In effect ++

++

being ++{each | the} ++{symbol | ++ symbols | ++ present-symbol | ++ present-symbols | ++ external-symbol | ++ external-symbols} ++{in | of} ++

++

is a compound preposition. ++

++

Iteration stops when there are no more symbols to be referenced ++in the supplied package. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-A_002d_003e-Aesthetic.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++Tilde A-> Aesthetic (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.4.1 Tilde A: Aesthetic

++ ++

An arg, any object, ++is printed without escape characters ++(as by princ). If arg is a string, ++its characters ++will be output verbatim. ++If arg is nil it will be printed as nil; ++the colon modifier (~:A) will cause an arg of nil to be printed as (), ++but if arg is a composite structure, such as a list or vector, ++any contained occurrences of nil will still be printed as nil. ++

++

~mincolA inserts spaces on the right, if necessary, to make the ++width at least mincol columns. The @ ++modifier causes the spaces ++to be inserted on the left rather than the right. ++

++

~mincol,colinc,minpad,padcharA ++is the full form of ~A, ++which allows control of the padding. ++The string is padded on the right (or on the left if the ++@ modifier is used) with at least minpad copies ++of padchar; padding characters are then inserted colinc characters ++at a time until the total width is at least mincol. ++The defaults are 0 for mincol and minpad, 1 for colinc, ++and the space character for padchar. ++

++

~A binds *print-escape* to false, ++

++

and *print-readably* to false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Ampersand_002d_003e-Fresh_002dLine.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Tilde Ampersand-> Fresh-Line (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.1.3 Tilde Ampersand: Fresh-Line

++ ++

Unless it can be determined that the output stream ++is already at the beginning of a line, ++this outputs a newline. ++~n& calls fresh-line ++and then outputs n- 1 newlines. ++~0& does nothing. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Asterisk_002d_003e-Go_002dTo.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++Tilde Asterisk-> Go-To (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7.1 Tilde Asterisk: Go-To

++ ++

The next arg is ignored. ++~n* ignores the next n arguments. ++

++

~:* backs up in the list of ++arguments so that the argument last processed will be processed again. ++~n:* backs up n arguments. ++

++

When within a ~{ construct ++(see below), the ignoring (in either direction) is relative to the list ++of arguments being processed by the iteration. ++

++

~n@* ++goes to the nth arg, where 0 means the first one; ++n defaults to 0, so ~@* goes back to the first arg. ++Directives after a ~n@* ++will take arguments in sequence beginning with the one gone to. ++When within a ~{ construct, the “goto” ++is relative to the list of arguments being processed by the iteration. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-B_002d_003e-Binary.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Tilde B-> Binary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: FORMAT Radix Control  

++
++
++

22.3.2.3 Tilde B: Binary

++ ++

This is just like ~D but prints in binary radix (radix 2) ++instead of decimal. The full form is therefore ++~mincol,padchar,commachar,comma-intervalB. ++

++

~B binds ++ *print-escape* to false, ++ *print-radix* to false, ++ *print-base* to 2, ++

++

and *print-readably* to false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-C_002d_003e-Character.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++Tilde C-> Character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.1.1 Tilde C: Character

++ ++

The next arg should be a character; ++it is printed ++according to the modifier flags. ++

++

~C prints the character ++as if by using write-char if it is a simple character. ++Characters that are not simple ++are not necessarily printed as if by write-char, ++but are displayed in an implementation-defined, abbreviated format. ++For example, ++

++
++
 (format nil "~C" #\A) ⇒  "A"
++ (format nil "~C" #\Space) ⇒  " "
++
++ ++

~:C is the same as ~C for printing characters, ++but other characters are “spelled out.” The intent is that this ++is a “pretty” format for printing characters. ++For simple characters that are not printing, ++what is spelled out is the name of the character (see char-name). ++For characters that are not simple and not printing, ++what is spelled out is implementation-defined. ++For example, ++

++
++
 (format nil "~:C" #\A) ⇒  "A"
++ (format nil "~:C" #\Space) ⇒  "Space"
++;; This next example assumes an implementation-defined "Control" attribute.
++ (format nil "~:C" #\Control-Space)
++⇒  "Control-Space"
++OR⇒ "c-Space"
++
++ ++

~:@C prints what ~:C would, and then ++if the character requires unusual shift keys on the keyboard to type it, ++this fact is mentioned. For example, ++

++
++
 (format nil "~:@C" #\Control-Partial) ⇒  "Control-\partial (Top-F)"  
++
++ ++

This is the format used for telling the user about a key he is expected to type, ++in prompts, for instance. The precise output may depend not only ++on the implementation, but on the particular I/O devices in use. ++

++

~@C ++prints the character in a way that the Lisp reader can understand, ++using #\ syntax. ++

++

~@C binds *print-escape* to t. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Circumflex_002d_003e-Escape-Upward.html +@@ -0,0 +1,151 @@ ++ ++ ++ ++ ++ ++Tilde Circumflex-> Escape Upward (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.9.2 Tilde Circumflex: Escape Upward

++ ++

~^ ++

++

This is an escape construct. If there are no more arguments remaining to ++be processed, then the immediately ++enclosing ~{ or ~< construct ++is terminated. If there is no such enclosing construct, then the entire ++formatting operation is terminated. ++In the ~< case, the formatting ++is performed, but no more segments are processed before doing the ++justification. ++~^ may appear anywhere in a ~{ ++construct. ++

++
++
 (setq donestr "Done.~^ ~D warning~:P.~^ ~D error~:P.")
++⇒  "Done.~^ ~D warning~:P.~^ ~D error~:P."
++ (format nil donestr) ⇒  "Done."
++ (format nil donestr 3) ⇒  "Done. 3 warnings."
++ (format nil donestr 1 5) ⇒  "Done. 1 warning. 5 errors."
++
++ ++

If a prefix parameter is given, then termination occurs if the parameter ++is zero. (Hence ~^ is equivalent to ++~#^.) If two ++parameters are given, termination occurs if they are equal. ++

++

[Reviewer Note by Barmar: Which equality predicate?] If three ++parameters are given, termination occurs if the first is less than or ++equal to the second and the second is less than or equal to the third. ++Of course, this is useless if all the prefix parameters are constants; at ++least one of them should be a # or a V parameter. ++

++

If ~^ is used within a ~:{ ++construct, then it terminates ++the current iteration step because in the standard case it tests for ++remaining arguments of the current step only; the next iteration step ++commences immediately. ~:^ is used to terminate ++the iteration process. ++

++

~:^ ++may be used only if the command it would terminate is ++~:{ or ~:@{ . ++The entire iteration process is terminated if and only if the sublist that is ++supplying the arguments for the current iteration step is the last sublist in ++the case of ~:{ , ++or the last format ++argument in the case of ~:@{ . ++~:^ is not ++equivalent to ~#:^; ++the latter terminates the entire iteration if and only if no ++arguments remain for the current iteration step. ++For example: ++

++
++
 (format nil "~:{ ~@?~:^ ...~} " '(("a") ("b"))) ⇒  "a...b"
++
++ ++

If ~^ appears within a control string being processed ++under the control of a ~? directive, but not within ++any ~{ or ~< construct within that string, ++then the string being ++processed will be terminated, thereby ending processing ++of the ~? directive. Processing then ++continues within the string ++containing the ~? directive at the point following that directive. ++

++

If ~^ ++appears within a ~[ or ~( construct, ++then all the commands up to the ~^ are properly selected ++or case-converted, ++the ~[ or ~( processing is terminated, ++and the outward search continues ++for a ~{ or ~< construct ++to be terminated. For example: ++

++
++
 (setq tellstr "~@(~@[~R~]~^ ~A!~)")
++⇒  "~@(~@[~R~]~^ ~A!~)"
++ (format nil tellstr 23) ⇒  "Twenty-three!"
++ (format nil tellstr nil "losers") ⇒  " Losers!"
++ (format nil tellstr 23 "losers") ⇒  "Twenty-three losers!"
++
++ ++

Following are examples of the use of ~^ ++within a ~< construct. ++

++
++
 (format nil "~15<~S~;~^~S~;~^~S~>" 'foo)
++⇒   "            FOO"
++ (format nil "~15<~S~;~^~S~;~^~S~>" 'foo 'bar)
++⇒   "FOO         BAR"
++ (format nil "~15<~S~;~^~S~;~^~S~>" 'foo 'bar 'baz)
++⇒   "FOO   BAR   BAZ"
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-D_002d_003e-Decimal.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++Tilde D-> Decimal (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: FORMAT Radix Control  

++
++
++

22.3.2.2 Tilde D: Decimal

++ ++

An arg, which should be an integer, ++is printed in decimal radix. ++~D will never put a decimal point after the number. ++

++

~mincolD uses ++a column width of mincol; spaces are inserted on ++the left if the number requires fewer than mincol columns for its digits ++and sign. If the number doesn’t fit in mincol columns, additional columns ++are used as needed. ++

++

~mincol,padcharD uses padchar as the pad character ++instead of space. ++

++

If arg is not an integer, it is printed in ~A format and decimal base. ++

++

The @ modifier causes the number’s sign to be printed always; the default ++is to print it only if the number is negative. ++

++

The : modifier causes commas to be printed between groups of digits; ++commachar may be used to change the character used as the comma. ++comma-interval ++must be an integer and defaults to 3. When the : ++modifier is given to any of ++these directives, the commachar ++is printed between groups of comma-interval ++digits. ++

++

Thus the most general form of ~D is ++~mincol,padchar,commachar,comma-intervalD. ++

++

~D binds ++ *print-escape* to false, ++ *print-radix* to false, ++ *print-base* to 10, ++

++

and *print-readably* to false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Dollarsign_002d_003e-Monetary-Floating_002dPoint.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++Tilde Dollarsign-> Monetary Floating-Point (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.3.4 Tilde Dollarsign: Monetary Floating-Point

++ ++

The next arg is printed as a float in fixed-format notation. ++

++

The full form is ~d,n,w,padchar$. ++The parameter d is the number ++of digits to print after the decimal point (default value 2); ++n is the minimum number of digits to print before the decimal ++point (default value 1); ++w is the minimum total width of the field to be printed (default ++value 0). ++

++

First padding and the sign are output. ++If the arg is negative, then a minus sign is printed; ++if the arg is not negative, then a plus sign is printed ++if and only if the @ modifier was supplied. ++If the : modifier is used, the sign appears before any padding, ++and otherwise after the padding. ++If w is supplied and the number of other characters to be output ++is less than w, then copies of padchar (which defaults ++to a space) are output to ++make the total field width equal w. ++Then n digits are printed for the integer part of arg, ++with leading zeros if necessary; then a decimal point; ++then d digits of fraction, properly rounded. ++

++

If the magnitude of arg is so large that more than m digits would ++have to be printed, where m is the larger of w and 100, then an ++implementation is free, at its discretion, to print the number using ++exponential notation instead, as if by the directive ++~w,q,,,,padcharE, where w and padchar are ++present or omitted according to whether they were present or omitted in ++the ~$ directive, and where q=d+n- 1, ++where d and n are the (possibly default) values given to the ++~$ directive. ++

++

If arg is a rational ++number, then it is coerced to be a single float ++and then printed. Alternatively, an implementation is permitted to ++process a rational number by any ++other method that has essentially the ++same behavior but avoids loss of precision or overflow ++because of the coercion. ++

++

If arg is a complex number or some non-numeric ++object, ++then it is printed using the format directive ~wD, ++thereby printing it in decimal radix and a minimum field width of w. ++

++

~$ binds *print-escape* to false ++

++

and *print-readably* to false. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-E_002d_003e-Exponential-Floating_002dPoint.html +@@ -0,0 +1,169 @@ ++ ++ ++ ++ ++ ++Tilde E-> Exponential Floating-Point (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.3.2 Tilde E: Exponential Floating-Point

++ ++

The next arg is printed as a float in exponential notation. ++

++

The full form is ++~w,d,e,k,overflowchar,padchar,exponentcharE. ++The parameter w ++is the width of the field to be printed; d is the number ++of digits to print after the decimal point; e is the number ++of digits to use when printing the exponent; ++k is a scale factor that defaults to one (not zero). ++

++

Exactly w characters will ++be output. First, leading copies of the character padchar ++(which defaults to a space) are printed, if necessary, to pad the ++field on the left. ++If the arg is negative, then a minus sign is printed; ++if the arg is not negative, then a plus sign is printed ++if and only if the @ ++modifier was supplied. Then a sequence ++of digits containing a single embedded decimal point is printed. ++The form of this sequence of digits depends on the scale factor k. ++If k is zero, then d digits are printed after the decimal ++point, and a single zero digit appears before the decimal point if ++the total field width will permit it. If k is positive, ++then it must be strictly less than d+2; k significant digits ++are printed before the decimal point, and d- k+1 ++digits are printed after the decimal point. If k is negative, ++then it must be strictly greater than - d; ++a single zero digit appears before the decimal point if ++the total field width will permit it, and after the decimal point ++are printed first ++- k zeros and then d+k significant digits. ++The printed fraction must be properly rounded. ++When rounding up and rounding down would produce printed values ++equidistant from the scaled value of arg, then the implementation ++is free to use either one. For example, printing the argument ++637.5 using the format ~8,2E may correctly produce ++either 6.37E+2 or 6.38E+2. ++

++

Following the digit sequence, the exponent is printed. ++First the character parameter exponentchar is printed; if this ++parameter is omitted, then the exponent marker that ++prin1 would use is printed, as determined from the ++type of the float and the current value of ++*read-default-float-format*. ++Next, either a plus sign or a minus sign ++is printed, followed by e digits representing the power of ++ten by which the printed fraction must be multiplied ++to properly represent the rounded value of arg. ++

++

If it is impossible to print the value in the required format in a field ++of width w, possibly because k is too large or too small ++or because the exponent cannot be printed in e character positions, ++then one of two actions is taken. If the ++parameter overflowchar is supplied, then w copies of that ++parameter are printed instead of the scaled value of arg. ++If the overflowchar parameter is omitted, then the scaled value ++is printed using more than w characters, as many more as may be ++needed; if the problem is that d is too small for the supplied k ++or that e is too small, then a larger value is used for d or e ++as may be needed. ++

++

If the w parameter is omitted, then the field is of variable width. ++In effect a value is chosen ++for w in such a way that no leading pad characters need to be printed. ++

++

If the parameter d is omitted, then there is no constraint ++on the number of digits to appear. ++A value is chosen for d in such a way that as many digits ++as possible may be printed subject to the width constraint ++imposed by the parameter w, the constraint of the scale factor k, ++and the constraint that no trailing ++zero digits may appear in the fraction, except that if the ++fraction to be printed is zero then a single zero digit should ++appear after the decimal point. ++

++

If the parameter e is omitted, then the exponent is printed ++using the smallest number of digits necessary to represent its value. ++

++

If all of w, d, and e are omitted, then the effect is to print ++the value using ordinary free-format exponential-notation output; ++prin1 uses ++

++

a similar ++

++

format for any non-zero number whose magnitude ++is less than 10^-3 or greater than or equal to 10^7. ++

++

The only difference is that the ~E ++directive always prints a plus or minus sign in front of the ++ exponent, while prin1 omits the plus sign if the exponent is ++ non-negative. ++

++

If arg is a rational ++number, then it is coerced to be a single float ++and then printed. Alternatively, an implementation is permitted to ++process a rational ++number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow ++because of the coercion. If w and d are ++unsupplied and the number has no exact decimal representation, ++for example 1/3, some precision cutoff must be chosen ++by the implementation since only a finite number of digits may be printed. ++

++

If arg is a complex number or some non-numeric ++object, ++then it is printed using the format directive ~wD, ++thereby printing it in decimal radix and a minimum field width of w. ++

++

~E binds ++ *print-escape* to false ++

++

and *print-readably* to false. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-F_002d_003e-Fixed_002dFormat-Floating_002dPoint.html +@@ -0,0 +1,143 @@ ++ ++ ++ ++ ++ ++Tilde F-> Fixed-Format Floating-Point (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.3.1 Tilde F: Fixed-Format Floating-Point

++ ++

The next arg is printed as a float. ++

++

The full form is ~w,d,k,overflowchar,padcharF. ++The parameter w ++is the width of the field to be printed; d is the number ++of digits to print after the decimal point; k is a scale factor ++that defaults to zero. ++

++

Exactly w characters will ++be output. First, leading copies of the character padchar ++(which defaults to a space) are printed, if necessary, to pad the ++field on the left. ++If the arg is negative, then a minus sign is printed; ++if the arg is not negative, then a plus sign is printed ++if and only if the @ ++modifier was supplied. Then a sequence ++of digits, containing a single embedded decimal point, is printed; ++this represents the magnitude of the value of arg times 10^k, ++rounded to d fractional digits. ++When rounding up and rounding down would produce printed values ++equidistant from the scaled value of arg, then the implementation ++is free to use either one. For example, printing the argument ++6.375 using the format ~4,2F may correctly produce ++either 6.37 or 6.38. ++Leading zeros are not permitted, except that a single ++zero digit is output before the decimal point if the printed value ++is less than one, and this single zero digit is not output ++at all if w=d+1. ++

++

If it is impossible to print the value in the required format in a field ++of width w, then one of two actions is taken. If the ++parameter overflowchar is supplied, then w copies of that ++parameter are printed instead of the scaled value of arg. ++If the overflowchar parameter is omitted, then the scaled value ++is printed using more than w characters, as many more as may be ++needed. ++

++

If the w parameter is omitted, then the field is of variable width. ++In effect, a value is chosen ++for w in such a way that no leading pad characters need to be printed ++and exactly d characters will follow the decimal point. ++For example, the directive ~,2F will print exactly ++two digits after the decimal point and as many as necessary before the ++decimal point. ++

++

If the parameter d is omitted, then there is no constraint ++on the number of digits to appear after the decimal point. ++A value is chosen for d in such a way that as many digits ++as possible may be printed subject to the width constraint ++imposed by the parameter w and the constraint that no trailing ++zero digits may appear in the fraction, except that if the ++fraction to be printed is zero, then a single zero digit should ++appear after the decimal point if permitted by the width constraint. ++

++

If both w and d are omitted, then the effect is to print ++the value using ordinary free-format output; prin1 uses this format ++for any number whose magnitude is either zero or between ++10^-3 (inclusive) and 10^7 (exclusive). ++

++

If w is omitted, then if the magnitude of arg is so large (or, if ++d is also omitted, so small) that more than 100 digits would have to ++be printed, then an implementation is free, at its discretion, to print ++the number using exponential notation instead, as if by the directive ++~E (with all parameters to ~E defaulted, not ++taking their values from the ~F directive). ++

++

If arg is a rational ++number, then it is coerced to be a single float ++and then printed. Alternatively, an implementation is permitted to ++process a rational ++number by any other method that has essentially the ++same behavior but avoids loss of precision or overflow ++because of the coercion. If w and d are ++not supplied and the number has no exact decimal representation, ++for example 1/3, some precision cutoff must be chosen ++by the implementation since only a finite number of digits may be printed. ++

++

If arg is a complex number or some non-numeric ++object, ++then it is printed using the format directive ~wD, ++thereby printing it in decimal radix and a minimum field width of w. ++

++

~F binds ++ *print-escape* to false ++

++

and *print-readably* to false. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-G_002d_003e-General-Floating_002dPoint.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Tilde G-> General Floating-Point (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.3.3 Tilde G: General Floating-Point

++ ++

The next arg is printed as a float ++in either fixed-format or exponential notation as appropriate. ++

++

The full form is ~w,d,e,k,overflowchar,padchar,exponentcharG. ++The format in which to print arg depends on the magnitude (absolute ++value) of the arg. Let n be an integer such that ++10^n-1 \le |arg| < 10^n. ++Let ee equal e+2, or 4 if e is omitted. ++Let ww equal w- ee, ++or nil if w is omitted. If d is omitted, first let q ++be the number of digits needed to print arg with no loss ++of information and without leading or trailing zeros; ++then let d equal (max q (min n 7)). ++Let dd equal d- n. ++

++

If 0 \le dd \le d, then arg is printed ++as if by the format directives ++

++

~ww,dd,,overflowchar,padcharF~ee@T ++

++

Note that the scale factor k is not passed to the ~F ++directive. For all other values of dd, arg is printed as if ++by the format directive ++

++

~w,d,e,k,overflowchar,padchar,exponentcharE ++

++

In either case, an @ ++modifier is supplied to the ~F ++or ~E directive if and only if one was supplied to the ++~G directive. ++

++

~G binds ++ *print-escape* to false ++

++

and *print-readably* to false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Greater_002dThan_002dSign_002d_003e-End-of-Justification.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Tilde Greater-Than-Sign-> End of Justification (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.6.3 Tilde Greater-Than-Sign: End of Justification

++ ++

~> terminates a ~<. ++The consequences of using it elsewhere are undefined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-I_002d_003e-Indent.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Tilde I-> Indent (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.5.3 Tilde I: Indent

++ ++

~nI is the same as (pprint-indent :block n). ++

++

~n:I is the same as (pprint-indent :current n). ++In both cases, n defaults to zero, if it is omitted. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Left_002dBrace_002d_003e-Iteration.html +@@ -0,0 +1,155 @@ ++ ++ ++ ++ ++ ++Tilde Left-Brace-> Iteration (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7.4 Tilde Left-Brace: Iteration

++ ++

~{str~} ++

++

This is an iteration construct. The argument should be a list, ++which is used as a set of arguments ++as if for a recursive call to format. ++The string str is used repeatedly as the control string. ++Each iteration can absorb as many elements of the list as it likes ++as arguments; ++if str uses up two arguments by itself, then two elements of the ++list will get used up each time around the loop. ++If before any iteration step the list ++is empty, then the iteration is terminated. ++Also, if a prefix parameter n is given, then there will be at most n ++repetitions of processing of str. ++Finally, the ~^ directive can be ++used to terminate the iteration prematurely. ++

++

For example: ++

++
++
 (format nil "The winners are:~{ ~S~}." 
++         '(fred harry jill)) 
++⇒  "The winners are: FRED HARRY JILL."                           
++ (format nil "Pairs:~{ <~S,~S>~}." 
++         '(a 1 b 2 c 3))
++⇒  "Pairs: <A,1> <B,2> <C,3>."
++
++ ++

~:{ str~} is similar, ++but the argument should be a list of sublists. ++At each repetition step, one sublist ++is used as the set of arguments for ++processing str; on the next repetition, a new sublist ++is used, whether ++or not all of the last sublist had been processed. ++For example: ++

++
++
 (format nil "Pairs:~:{ <~S,~S>~} ." 
++                 '((a 1) (b 2) (c 3)))
++⇒  "Pairs: <A,1> <B,2> <C,3>."
++
++ ++

~@{ str~} ++is similar to ~{ str~} , but instead of ++using one argument that is a list, all the remaining arguments ++are used as the list of arguments for the iteration. ++Example: ++

++
++
 (format nil "Pairs:~@{ <~S,~S>~} ." 'a 1 'b 2 'c 3)
++⇒  "Pairs: <A,1> <B,2> <C,3>."
++
++ ++

If the iteration is terminated before all the remaining arguments are ++consumed, then any arguments not processed by the iteration remain to be ++processed by any directives following the iteration construct. ++

++

~:@{ str~} ++combines the features ++of ~:{ str~} ++and ~@{ str~} . ++All the remaining arguments ++are used, and each one must be a list. ++On each iteration, the next argument is ++used as a list of arguments to str. ++Example: ++

++
++
 (format nil "Pairs:~:@{ <~S,~S>~} ." 
++              '(a 1) '(b 2) '(c 3)) 
++⇒  "Pairs: <A,1> <B,2> <C,3>."
++
++ ++

Terminating the repetition construct with ~:} ++instead of ~} ++forces str to be processed at least once, even if the initial ++list of arguments is null. However, this will not override an explicit ++prefix parameter of zero. ++

++

If str is empty, then an argument is used as str. ++It must be a format control ++and precede any arguments processed by the iteration. As an example, ++the following are equivalent: ++

++
++
    (apply #'format stream string arguments)
++ ≡ (format stream "~1{~:}" string arguments)
++
++ ++

This will use string as a formatting string. ++The ~1{ says it will ++be processed at most once, and the ~:} ++says it will be processed at least once. ++Therefore it is processed exactly once, using arguments as the arguments. ++This case may be handled more clearly by the ~? directive, ++but this general feature of ~{ ++is more powerful than ~?. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Left_002dBracket_002d_003e-Conditional-Expression.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++Tilde Left-Bracket-> Conditional Expression (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7.2 Tilde Left-Bracket: Conditional Expression

++ ++

~[str0~;str1~;...~;strn~] ++

++

This is a set of control strings, called clauses, one of which is ++chosen and used. The clauses are separated by ~; ++and the construct is terminated by ~]. For example, ++

++

"~[Siamese~;Manx~;Persian~] Cat" ++

++

The argth ++clause is selected, where the first clause is number 0. ++If a prefix parameter is given (as ~n[), ++then the parameter is used instead of an argument. ++If arg is out of range then no clause is selected ++and no error is signaled. ++After the selected alternative has been processed, the control string ++continues after the ~]. ++

++

~[str0~;str1~;...~;strn~:;default~] ++has a default case. ++If the last ~; used to separate clauses ++is ~:; instead, then the last clause is an else clause ++that is performed if no other clause is selected. ++For example: ++

++

"~[Siamese~;Manx~;Persian~:;Alley~] Cat" ++

++

~:[alternative~;consequent~] ++selects the alternative control string if arg is false, ++and selects the consequent control string otherwise. ++

++

~@[consequent~] ++tests the argument. If it is true, ++then the argument is not used up by the ~[ command ++but remains as the next one to be processed, ++and the one clause consequent is processed. ++If the arg is false, then the argument is used up, ++and the clause is not processed. ++The clause therefore should normally use exactly one argument, ++and may expect it to be non-nil. ++For example: ++

++
++
 (setq *print-level* nil *print-length* 5)
++ (format nil
++        "~@[ print level = ~D~]~@[ print length = ~D~]"
++        *print-level* *print-length*)
++⇒   " print length = 5"
++
++ ++

Note also that ++

++
++
 (format stream "...~@[str~]..." ...)
++≡ (format stream "...~:[~;~:*str~]..." ...)
++
++ ++

The combination of ~[ and # is useful, for ++example, for dealing with English conventions for printing lists: ++

++
++
 (setq foo "Items:~#[ none~; ~S~; ~S and ~S~
++           ~:;~@{~#[~; and~] ~S~^ ,~}~].")
++ (format nil foo) ⇒   "Items: none."
++ (format nil foo 'foo) ⇒   "Items: FOO."
++ (format nil foo 'foo 'bar) ⇒   "Items: FOO and BAR."
++ (format nil foo 'foo 'bar 'baz) ⇒   "Items: FOO, BAR, and BAZ."
++ (format nil foo 'foo 'bar 'baz 'quux) ⇒   "Items: FOO, BAR, BAZ, and QUUX."
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Left_002dParen_002d_003e-Case-Conversion.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++Tilde Left-Paren-> Case Conversion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.8.1 Tilde Left-Paren: Case Conversion

++ ++

~(str~) ++

++

The contained control string str is processed, and what it produces ++is subject to case conversion. ++

++

With no flags, every uppercase character ++is converted to the corresponding lowercase character. ++

++

~:( capitalizes all words, as if by string-capitalize. ++

++

~@( ++capitalizes just the first word and forces the rest to lower ++case. ++

++

~:@( converts every lowercase character ++to the corresponding uppercase character. ++

++

In this example ~@( is used to cause the first word ++produced by ~@R to be capitalized: ++

++
++
 (format nil "~@R ~(~@R~)" 14 14) 
++⇒  "XIV xiv"
++ (defun f (n) (format nil "~@(~R~) error~:P detected." n)) ⇒  F
++ (f 0) ⇒  "Zero errors detected."
++ (f 1) ⇒  "One error detected."
++ (f 23) ⇒  "Twenty-three errors detected."
++
++ ++

When case conversions appear nested, the outer conversion dominates, ++as illustrated in the following example: ++

++
++
 (format nil "~@(how is ~:(BOB SMITH~)?~)")
++ ⇒  "How is bob smith?"
++ NOT⇒ "How is Bob Smith?"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Less_002dThan_002dSign_002d_003e-Justification.html +@@ -0,0 +1,130 @@ ++ ++ ++ ++ ++ ++Tilde Less-Than-Sign-> Justification (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.6.2 Tilde Less-Than-Sign: Justification

++ ++

~mincol,colinc,minpad,padchar<str~> ++

++

This justifies the text produced by processing str ++within a field at least mincol columns wide. str ++may be divided up into segments with ~;, in which case the ++spacing is evenly divided between the text segments. ++

++

With no modifiers, the leftmost text segment is left justified in the ++field, and the rightmost text segment is right justified. If there is ++only one text element, as a special case, it is right justified. ++The : modifier causes ++spacing to be introduced before the first text segment; the ++@ modifier causes spacing to be added after the last. ++The minpad parameter (default 0) is the minimum number of ++padding characters to be output between each segment. ++The padding character is supplied by padchar, ++which defaults to the space character. ++If the total width needed to satisfy these constraints is greater ++than mincol, then the width used is mincol+k*colinc ++for the smallest possible non-negative integer value k. ++colinc defaults to 1, and mincol defaults to 0. ++

++

Note that str may include format directives. ++All the clauses in str are processed in order; ++it is the resulting pieces of text that are justified. ++

++

The ~^ directive may be used to terminate processing of the ++clauses prematurely, in which case only the completely processed clauses ++are justified. ++

++

If the first clause of a ~< ++is terminated with ~:; instead of ++~;, then it is used in a special way. All of the clauses are ++processed (subject to ~^ , of course), but the ++first one is not used ++in performing the spacing and padding. When the padded result has been ++determined, then if it will fit on the current line of output, it is ++output, and the text for the first clause is discarded. If, however, the ++padded text will not fit on the current line, then the text segment for ++the first clause is output before the padded text. The first clause ++ought to contain a newline (such as a ~% directive). The first ++clause is always processed, and so any arguments it refers to will be ++used; the decision is whether to use the resulting segment of text, not ++whether to process the first clause. If the ~:; has a prefix ++parameter n, then the padded text must fit on the current line with ++n character positions to spare to avoid outputting the first clause’s ++text. For example, the control string ++

++
++
 "~
++
++ ++

can be used to print a list of items separated by commas without ++breaking items over line boundaries, beginning each line with ++;; . The prefix parameter ++1 in ~1:; accounts for the width of the ++comma that will follow the justified item if it is not the last ++element in the list, or the period ++if it is. If ~:; has a second ++prefix parameter, then it is used as the width of the line, ++thus overriding the natural line width of the output stream. To make ++the preceding example use a line width of 50, one would write ++

++
++
 "~
++
++ ++

If the second argument is not supplied, then format uses the ++line width of the destination output stream. ++If this cannot be determined (for example, when producing a ++string result), then format uses 72 as the line length. ++

++

See also Tilde Less-Than-Sign-> Logical Block. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Less_002dThan_002dSign_002d_003e-Logical-Block.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++Tilde Less-Than-Sign-> Logical Block (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.5.2 Tilde Less-Than-Sign: Logical Block

++ ++

~<...~:> ++

++

If ~:> is used to terminate a ~<...~>, ++the directive is equivalent to a call to pprint-logical-block. ++The argument corresponding to the ~<...~:> directive is treated in ++the same way as the list argument to pprint-logical-block, ++thereby providing automatic support for non-list arguments and ++the detection of circularity, sharing, and depth abbreviation. ++The portion of the control-string nested within the ~<...~:> ++specifies the :prefix (or :per-line-prefix), :suffix, ++and body of the pprint-logical-block. ++

++

The control-string portion enclosed by ~<...~:> can be divided ++into segments ~<prefix~;body~;suffix~:> ++by ~; directives. If the first section is terminated by ~@;, ++it specifies a per-line prefix rather than a simple prefix. ++The prefix and suffix cannot contain format directives. ++An error is signaled if either the prefix or suffix fails to be a ++constant string or if the enclosed portion is divided into more than three segments. ++

++

If the enclosed portion is divided into only two segments, the suffix ++defaults to the null string. If the enclosed portion consists of only ++a single segment, both the prefix and the suffix default to ++the null string. If the colon modifier is used (i.e., ~:<...~:>), ++the prefix and suffix default to "(" and ")" ++(respectively) instead of the null string. ++

++

The body segment can be any arbitrary format string. ++This format string is applied to the elements of the list ++corresponding to the ~<...~:> directive as a whole. ++Elements are extracted from this list using pprint-pop, ++thereby providing automatic support for malformed lists, and the detection ++of circularity, sharing, and length abbreviation. ++Within the body segment, ~^ acts like pprint-exit-if-list-exhausted. ++

++

~<...~:> supports a feature not supported by pprint-logical-block. ++If ~:@> is used to terminate the directive (i.e., ~<...~:@>), ++then a fill-style conditional newline is automatically inserted after each ++group of blanks immediately contained in the body (except for blanks ++after a ~<Newline> directive). This makes it easy to achieve the ++equivalent of paragraph filling. ++

++

If the at-sign modifier is used with ~<...~:>, the entire remaining argument ++list is passed to the directive as its argument. All of the remaining ++arguments are always consumed by ~@<...~:>, even if they are not all used ++by the format string nested in the directive. Other than the difference in ++its argument, ~@<...~:> is exactly the same as ~<...~:> except that ++circularity detection is not applied if ~@<...~:> is encountered at top ++level in a format string. This ensures that circularity detection is ++applied only to data lists, not to format argument lists. ++

++

" . #n#" is printed if circularity or sharing has to be indicated ++for its argument as a whole. ++

++

To a considerable extent, the basic form of the directive ~<...~> is ++incompatible with the dynamic control of the arrangement of output by ++~W, ~_, ~<...~:>, ~I, and ~:T. As a result, an error ++is signaled if any of these directives is nested within ~<...~>. ++Beyond this, an error is also signaled if the ~<...~:;...~> form of ++~<...~> is used in the same format string with ++~W, ~_, ~<...~:>, ~I, or ~:T. ++

++

See also Tilde Less-Than-Sign-> Justification. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Newline_002d_003e-Ignored-Newline.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Tilde Newline-> Ignored Newline (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.9.3 Tilde Newline: Ignored Newline

++ ++

Tilde immediately followed by a newline ignores the newline ++and any following non-newline whitespace_1 characters. ++With a :, ++ the newline is ignored, ++ but any following whitespace_1 is left in place. ++With an @, ++ the newline is left in place, ++ but any following whitespace_1 is ignored. ++For example: ++

++
++
 (defun type-clash-error (fn nargs argnum right-type wrong-type)
++   (format *error-output*
++           "~&~S requires its ~:[~:R~;~*~]~ 
++           argument to be of type ~S,~
++           with an argument of type ~S.~
++           fn (eql nargs 1) argnum right-type wrong-type))
++ (type-clash-error 'aref nil 2 'integer 'vector)  prints:
++AREF requires its second argument to be of type INTEGER,
++but it was called with an argument of type VECTOR.
++NIL
++ (type-clash-error 'car 1 1 'list 'short-float)  prints:
++CAR requires its argument to be of type LIST,
++but it was called with an argument of type SHORT-FLOAT.
++NIL
++
++ ++

Note that in this example newlines appear in the output only as specified ++by the ~& and ~% directives; the ++actual newline characters ++in the control string are suppressed because each is preceded by a tilde. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-O_002d_003e-Octal.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Tilde O-> Octal (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.2.4 Tilde O: Octal

++ ++

This is just like ~D but prints in octal radix (radix 8) ++instead of decimal. The full form is therefore ++~mincol,padchar,commachar,comma-intervalO. ++

++

~O binds ++ *print-escape* to false, ++ *print-radix* to false, ++ *print-base* to 8, ++

++

and *print-readably* to false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-P_002d_003e-Plural.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++Tilde P-> Plural (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.8.3 Tilde P: Plural

++ ++

If arg is not eql ++to the integer 1, a lowercase s is ++printed; if arg is eql to 1, nothing is printed. ++If arg is a floating-point 1.0, the s is ++printed. ++

++

~:P does the same thing, ++after doing a ~:* to back up one argument; ++that is, it prints a lowercase s if the previous argument was not ++1. ++

++

~@P ++prints y if the argument is 1, or ies if it is ++not. ~:@P does the same thing, but backs up first. ++

++
++
 (format nil "~D tr~:@P/~D win~:P" 7 1) ⇒  "7 tries/1 win"
++ (format nil "~D tr~:@P/~D win~:P" 1 0) ⇒  "1 try/0 wins"
++ (format nil "~D tr~:@P/~D win~:P" 1 3) ⇒  "1 try/3 wins"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Percent_002d_003e-Newline.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Tilde Percent-> Newline (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.1.2 Tilde Percent: Newline

++ ++

This outputs a #\Newline character, thereby terminating the current ++output line and beginning a new one. ++~n% outputs n newlines. ++No arg is used. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Question_002dMark_002d_003e-Recursive-Processing.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++Tilde Question-Mark-> Recursive Processing (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7.6 Tilde Question-Mark: Recursive Processing

++ ++

The next arg must be a format control, and the one after it a list; ++both are consumed by the ~? directive. ++The two are processed as a control-string, with the elements of the list ++as the arguments. Once the recursive processing ++has been finished, the processing of the control ++string containing the ~? directive is resumed. ++Example: ++

++
++
 (format nil "~? ~D" "<~A ~D>" '("Foo" 5) 7) ⇒  "<Foo 5> 7"
++ (format nil "~? ~D" "<~A ~D>" '("Foo" 5 14) 7) ⇒  "<Foo 5> 7"
++
++ ++

Note that in the second example three arguments are supplied ++to the format string "<~A ~D>", but only two are processed ++and the third is therefore ignored. ++

++

With the @ ++modifier, only one arg is directly consumed. ++The arg must be a string; ++it is processed as part of the control ++string as if it had appeared in place of the ~@? construct, ++and any directives in the recursively processed control string may ++consume arguments of the control string containing the ~@? ++directive. ++Example: ++

++
++
 (format nil "~@? ~D" "<~A ~D>" "Foo" 5 7) ⇒  "<Foo 5> 7"
++ (format nil "~@? ~D" "<~A ~D>" "Foo" 5 14 7) ⇒  "<Foo 5> 14"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-R_002d_003e-Radix.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++Tilde R-> Radix (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.2.1 Tilde R: Radix

++ ++

~nR prints arg in radix n. ++The modifier flags and any remaining parameters are used as for ++the ~D directive. ++~D is the same as ~10R. ++The full form is ++~radix,mincol,padchar,commachar,comma-intervalR. ++

++

If no prefix parameters are given to ~R, then a different ++interpretation is given. The argument should be an integer. ++For example, if arg is 4: ++

++
++
*
++

~R prints arg as a cardinal English number: four. ++

++
++
*
++

~:R prints arg as an ordinal English number: fourth. ++

++
++
*
++

~@R prints arg as a Roman numeral: IV. ++

++
++
*
++

~:@R prints arg as an old Roman numeral: IIII. ++

++
++ ++

For example: ++

++
++
 (format nil "~,,' ,4:B" 13) ⇒  "1101"
++ (format nil "~,,' ,4:B" 17) ⇒  "1 0001"
++ (format nil "~19,0,' ,4:B" 3333) ⇒  "0000 1101 0000 0101"
++ (format nil "~3,,,' ,2:R" 17) ⇒  "1 22"
++ (format nil "~,,'|,2:D" #xFFFF) ⇒   "6|55|35"
++
++ ++

If and only if the first parameter, n, is supplied, ++~R binds ++ *print-escape* to false, ++ *print-radix* to false, ++ *print-base* to n, ++

++

and *print-readably* to false. ++

++

If and only if no parameters are supplied, ++~R binds *print-base* to 10. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Right_002dBrace_002d_003e-End-of-Iteration.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Tilde Right-Brace-> End of Iteration (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7.5 Tilde Right-Brace: End of Iteration

++ ++

~} terminates a ~{. ++The consequences of using it elsewhere are undefined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Right_002dBracket_002d_003e-End-of-Conditional-Expression.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Tilde Right-Bracket-> End of Conditional Expression (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.7.3 Tilde Right-Bracket: End of Conditional Expression

++ ++

~] terminates a ~[. ++The consequences of using it elsewhere are undefined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Right_002dParen_002d_003e-End-of-Case-Conversion.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Tilde Right-Paren-> End of Case Conversion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.8.2 Tilde Right-Paren: End of Case Conversion

++ ++

~) terminates a ~(. ++The consequences of using it elsewhere are undefined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-S_002d_003e-Standard.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Tilde S-> Standard (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.4.2 Tilde S: Standard

++ ++

This is just like ~A, but arg is printed with escape ++characters (as by prin1 rather than princ). The output is ++therefore suitable for input to read. ~S accepts ++all the arguments and modifiers that ~A does. ++

++

~S binds *print-escape* to t. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Semicolon_002d_003e-Clause-Separator.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Tilde Semicolon-> Clause Separator (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.9.1 Tilde Semicolon: Clause Separator

++ ++

This separates clauses in ~[ and ~< constructs. ++The consequences of using it elsewhere are undefined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Slash_002d_003e-Call-Function.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++Tilde Slash-> Call Function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.5.4 Tilde Slash: Call Function

++ ++

~/name/ ++

++

User defined functions can be called from within a format ++string by using the directive ~/name/. ++The colon modifier, the at-sign modifier, and arbitrarily many parameters ++can be specified with the ~/name/ directive. ++name can be any arbitrary string that does not contain a "/". ++All of the characters in name are treated as if they were upper case. ++If name contains a single colon (:) or double colon (::), ++then everything up to but not including the first ":" or "::" ++is taken to be a string that names a package. ++Everything after the first ":" or "::" (if any) is taken to be a ++string that names a symbol. The function corresponding to a ++~/name/ directive is obtained by looking up the symbol ++that has the indicated name in the indicated package. ++If name does not contain a ":" or "::", ++then the whole name string is looked up in the COMMON-LISP-USER package. ++

++

When a ~/name/ directive is encountered, ++the indicated function is called with four or more arguments. ++The first four arguments are: ++ the output stream, ++ the format argument corresponding to the directive, ++ a generalized boolean that is true if the colon modifier was used, ++ and a generalized boolean that is true if the at-sign modifier was used. ++The remaining arguments consist of any parameters specified with the directive. ++The function should print the argument appropriately. ++Any values returned by the function are ignored. ++

++

The three functions ++ pprint-linear, ++ pprint-fill, ++ and pprint-tabular ++are specifically designed so that they can be called by ~/.../ ++(i.e., ~/pprint-linear/, ~/pprint-fill/, and ~/pprint-tabular/). ++In particular they take colon and at-sign arguments. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-T_002d_003e-Tabulate.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++Tilde T-> Tabulate (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.6.1 Tilde T: Tabulate

++ ++

This spaces over to a given column. ++~colnum,colincT will output ++sufficient spaces to move the cursor to column colnum. If the cursor ++is already at or beyond column colnum, it will output spaces to move it to ++column colnum+k*colinc for the smallest positive integer ++k possible, unless colinc is zero, in which case no spaces ++are output if the cursor is already at or beyond column colnum. ++colnum and colinc default to 1. ++

++

If for some reason the current absolute column position cannot be determined ++by direct inquiry, ++format ++may be able to deduce the current column position by noting ++that certain directives (such as ~%, or ~&, ++or ~A ++with the argument being a string containing a newline) cause ++the column position to be reset to zero, and counting the number of characters ++emitted since that point. If that fails, format ++may attempt a ++similar deduction on the riskier assumption that the destination was ++at column zero when format ++was invoked. If even this heuristic fails ++or is implementationally inconvenient, at worst ++the ~T operation will simply output two spaces. ++

++

~@T performs relative tabulation. ++~colrel,colinc@T outputs colrel spaces ++and then outputs the smallest non-negative ++number of additional spaces necessary to move the cursor ++to a column that is a multiple ++of colinc. For example, the directive ++~3,8@T outputs ++three spaces and then moves the cursor to a “standard multiple-of-eight ++tab stop” if not at one already. ++If the current output column cannot be determined, however, ++then colinc is ignored, and exactly colrel spaces are output. ++

++

If the colon modifier is used with the ~T directive, ++the tabbing computation is done relative to the horizontal position where the ++section immediately containing the directive begins, rather than with ++respect to a horizontal position of zero. The numerical parameters are ++both interpreted as being in units of ems and both default to 1. ++~n,m:T is the same as ++ (pprint-tab :section n m). ++~n,m:@T is the same as ++ (pprint-tab :section-relative n m). ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Tilde_002d_003e-Tilde.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++Tilde Tilde-> Tilde (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.1.5 Tilde Tilde: Tilde

++ ++

This outputs a tilde. ~n~ outputs n tildes. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Underscore_002d_003e-Conditional-Newline.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Tilde Underscore-> Conditional Newline (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.5.1 Tilde Underscore: Conditional Newline

++ ++

Without any modifiers, ~_ is the same as (pprint-newline :linear). ++~@_ is the same as (pprint-newline :miser). ++~:_ is the same as (pprint-newline :fill). ++~:@_ is the same as (pprint-newline :mandatory). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-Vertical_002dBar_002d_003e-Page.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Tilde Vertical-Bar-> Page (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.1.4 Tilde Vertical-Bar: Page

++ ++

This outputs a page separator character, if possible. ++~n| does this n times. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-W_002d_003e-Write.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Tilde W-> Write (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.4.3 Tilde W: Write

++ ++

An argument, any object, is printed obeying every printer control ++variable (as by write). In addition, ~W interacts correctly with depth ++abbreviation, by not resetting the depth counter to zero. ~W does not ++accept parameters. If given the colon modifier, ~W binds *print-pretty* ++to true. If given the at-sign modifier, ~W binds *print-level* ++and *print-length* to nil. ++

++

~W provides automatic support for the detection of circularity and ++sharing. If the value of *print-circle* is not nil and ~W is applied ++to an argument that is a circular (or shared) reference, an appropriate ++#n# marker is inserted in the output instead of printing the argument. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Tilde-X_002d_003e-Hexadecimal.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Tilde X-> Hexadecimal (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: FORMAT Radix Control  

++
++
++

22.3.2.5 Tilde X: Hexadecimal

++ ++

This is just like ~D but prints in hexadecimal radix ++(radix 16) instead of decimal. The full form is therefore ++~mincol,padchar,commachar,comma-intervalX. ++

++

~X binds ++ *print-escape* to false, ++ *print-radix* to false, ++ *print-base* to 16, ++

++

and *print-readably* to false. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Time.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++Time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.1.4 Time

++ ++

Time is represented in four different ways in Common Lisp: ++ decoded time, ++ universal time, ++ internal time, ++and seconds. ++Decoded time and universal time are used primarily to represent calendar time, ++and are precise only to one second. ++Internal time is used primarily to represent measurements of computer ++time (such as run time) and is precise to some implementation-dependent ++fraction of a second called an internal time unit, ++as specified by internal-time-units-per-second. ++An internal time can be used ++ for either absolute and relative time measurements. ++Both a universal time and a decoded time can be used ++ only for absolute time measurements. ++In the case of one function, sleep, ++time intervals are represented as a non-negative real number of seconds. ++

++

Figure 25–4 shows defined names relating to time. ++

++
++
  decode-universal-time   get-internal-run-time           
++  encode-universal-time   get-universal-time              
++  get-decoded-time        internal-time-units-per-second  
++  get-internal-real-time  sleep                           
++
++        Figure 25–4: Defined names involving Time.       
++
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Too-Few-Arguments.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Too Few Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.3 Too Few Arguments

++ ++

It is not permitted to supply too few arguments to a function. ++Too few arguments means fewer arguments than the number of required parameters ++for the function. ++

++

If this situation occurs in a safe call, ++

++

an error of type program-error must be signaled; ++and in an unsafe call the situation has undefined consequences. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Too-Many-Arguments.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Too Many Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.4 Too Many Arguments

++ ++

It is not permitted to supply too many arguments to a function. ++Too many arguments means more arguments than the number of required parameters ++plus the number of optional parameters; however, if the function ++uses &rest or &key, it is not possible for it to receive too many arguments. ++

++

If this situation occurs in a safe call, ++

++

an error of type program-error must be signaled; ++and in an unsafe call the situation has undefined consequences. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Top-level-loop.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Top level loop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.1.1 Top level loop

++ ++

The top level loop is the Common Lisp mechanism by which the user normally ++interacts with the Common Lisp system. This loop is sometimes referred to ++as the Lisp read-eval-print loop ++because it typically consists of an endless loop that reads an expression, ++evaluates it and prints the results. ++

++

The top level loop is not completely specified; thus the user ++interface is implementation-defined. ++The top level loop ++prints all values resulting from the evaluation of a ++form. ++Figure 25–1 lists variables that are maintained by the Lisp read-eval-print loop. ++

++
++
  *    +    /    -  
++  **   ++   //      
++  ***  +++  ///     
++
++  Figure 25–1: Variables maintained by the Read-Eval-Print Loop
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Topological-Sorting.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++Topological Sorting (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.3.5.1 Topological Sorting

++ ++

Topological sorting proceeds by finding a class C in~S_C such ++that no other class precedes that element according to the elements ++in~R. The class C is placed first in the result. ++Remove C from S_C, and remove all pairs of the form (C,D), ++D\in S_C, from R. Repeat the process, adding ++classes with no predecessors to the end of the result. Stop when no ++element can be found that has no predecessor. ++

++

If S_C is not empty and the process has stopped, the set R is ++inconsistent. If every class in the finite set of ++classes is preceded ++by another, then R contains a loop. That is, there is a chain of ++classes C_1,...,C_n such that C_i precedes ++C_{i+1}, 1<= i<n, and C_n precedes C_1. ++

++

Sometimes there are several classes from S_C with no ++predecessors. In this case select the one that has a direct ++subclass rightmost in the class precedence list computed so far. ++(If there is no such candidate class, R does not generate ++a partial ordering—the R_c, c\in S_C, are inconsistent.) ++

++

In more precise terms, let {N_1,...,N_m}, m>= 2, be ++the classes from S_C with no predecessors. Let (C_1... C_n), n>= 1, be the class precedence list ++constructed so far. C_1 is the most specific class, and C_n is the least specific. Let 1<= j<= n be the largest number ++such that there exists an i where 1<= i<= m and N_i ++is a direct superclass of C_j; N_i is placed next. ++

++

The effect of this rule for selecting from a set of classes with no ++predecessors is that the classes in a simple superclass chain are ++adjacent in the class precedence list and that classes in each ++relatively separated subgraph are adjacent in the class precedence list. ++For example, let T_1 and T_2 be subgraphs whose only ++element in common is the class J. ++Suppose that no superclass of J appears in either T_1 or T_2, ++and that J is in the superclass chain of every class in both T_1 and T_2. ++ Let C_1 be the bottom of T_1; ++and let C_2 be the bottom of T_2. ++Suppose C is a class whose direct superclasses ++are C_1 and C_2 in that order, then the class precedence list ++for C starts with C and is followed by ++all classes in T_1 except J. ++All the classes of T_2 are next. ++The class J and its superclasses appear last. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Transfer-of-Control-during-a-Destructive-Operation.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Transfer of Control during a Destructive Operation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.7.2 Transfer of Control during a Destructive Operation

++ ++

Should a transfer of control out of a destructive operation occur ++(e.g., due to an error) the state of the object being modified is ++implementation-dependent. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Transfer-of-Control-to-an-Exit-Point.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++Transfer of Control to an Exit Point (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.2 Transfer of Control to an Exit Point

++ ++ ++

When a transfer of control is initiated by go, ++return-from, or throw ++the following events occur in order to accomplish the transfer of control. ++Note that for go, ++the exit point is the form within the tagbody ++that is being executed at the time the go is performed; ++for return-from, ++the exit point is the corresponding ++block form; ++and for throw, ++the exit point is the corresponding ++catch form. ++

++
++
1.
++

Intervening exit points are “abandoned” ++ (i.e., their extent ends ++ and it is no longer valid to attempt to transfer control through them). ++

++
++
2.
++

The cleanup clauses of any intervening unwind-protect clauses ++ are evaluated. ++

++
++
3.
++

Intervening dynamic bindings of special variables, ++ catch tags, condition handlers, and restarts ++ are undone. ++

++
++
4.
++

The extent of the exit point being invoked ends, ++ and control is passed to the target. ++

++
++ ++

The extent of an exit being “abandoned” because it is being passed over ++ends as soon as the transfer of control is initiated. That is, ++event 1 occurs at the beginning of the initiation of the transfer of ++control. ++The consequences are undefined if an attempt is made to transfer control ++to an exit point whose dynamic extent has ended. ++

++

Events 2 and 3 are actually performed interleaved, in the order ++corresponding to the reverse order in which they were established. ++The effect of this is that the cleanup clauses of an unwind-protect ++see the same dynamic bindings ++of variables and catch tags as were ++visible when the unwind-protect was entered. ++

++

Event 4 occurs at the end of the transfer of control. ++

++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Traversal-Rules-and-Side-Effects.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++Traversal Rules and Side Effects (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.6 Traversal Rules and Side Effects

++ ++ ++

The consequences are undefined ++when code executed during an object-traversing operation ++destructively modifies the object in a way that might affect the ++ongoing traversal operation. ++In particular, the following rules apply. ++

++
List traversal
++

For list traversal operations, the cdr chain of the ++ list is not allowed to be destructively modified. ++

++
++
Array traversal
++

For array traversal operations, the array is not allowed ++ to be adjusted and its fill pointer, if any, is not allowed to ++ be changed. ++

++
++
Hash-table traversal
++

For hash table traversal operations, new elements may not be added ++ or deleted except that the element corresponding to the current hash key ++ may be changed or removed. ++

++
++
Package traversal
++

For package traversal operations (e.g., do-symbols), ++ new symbols may not be interned in or uninterned ++ from the package being traversed ++ or any package that it uses except that the ++ current symbol may be uninterned from the package ++ being traversed. ++

++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Treatment-of-Exceptional-Situations.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Treatment of Exceptional Situations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.1.4 Treatment of Exceptional Situations

++ ++

A conforming implementation shall treat exceptional situations ++in a manner consistent with this specification. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Treatment-of-Newline-during-Input-and-Output.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Treatment of Newline during Input and Output (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Character Concepts  

++
++
++

13.1.8 Treatment of Newline during Input and Output

++ ++

When the character #\Newline is written to an output file, ++the implementation must take the appropriate action ++to produce a line division. This might involve writing out a ++record or translating #\Newline to a CR/LF sequence. ++When reading, a corresponding reverse transformation must take place. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Treatment-of-Other-Macros-Based-on-SETF.html +@@ -0,0 +1,102 @@ ++ ++ ++ ++ ++ ++Treatment of Other Macros Based on SETF (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Generalized Reference  

++
++
++

5.1.3 Treatment of Other Macros Based on SETF

++ ++

For each of the “read-modify-write” operators in Figure 5–9, ++and for any additional macros ++defined by the programmer using define-modify-macro, ++an exception is made to the normal rule of left-to-right evaluation of arguments. ++Evaluation of argument forms occurs in left-to-right order, ++with the exception that for the place argument, the actual ++read of the “old value” from that place happens ++after all of the argument form evaluations, ++and just before a “new value” is computed and written back into the place. ++

++

Specifically, each of these operators can be viewed as involving a ++form with the following general syntax: ++

++
++
 (operator {preceding-form}* place {following-form}*)
++
++ ++

The evaluation of each such form proceeds like this: ++

++
++
1.
++

Evaluate each of the preceding-forms, in left-to-right order. ++

++
2.
++

Evaluate the subforms of the place, ++ in the order specified by the second value of the setf expansion ++ for that place. ++

++
3.
++

Evaluate each of the following-forms, in left-to-right order. ++

++
4.
++

Read the old value from place. ++

++
5.
++

Compute the new value. ++

++
6.
++

Store the new value into place. ++

++
++ ++
++
  decf  pop   pushnew  
++  incf  push  remf     
++
++  Figure 5–9: Read-Modify-Write Macros
++
++
++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Truenames.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++Truenames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

20.1.3 Truenames

++ ++

Many file systems permit more than one filename to designate ++a particular file. ++

++

Even where multiple names are possible, most file systems have a convention ++for generating a canonical filename in such situations. Such a canonical ++filename (or the pathname representing such a filename) is ++called a truename ++ ++. ++

++

The truename of a file may differ from other filenames ++for the file because of ++ symbolic links, ++ version numbers, ++ logical device translations in the file system, ++ logical pathname translations within Common Lisp, ++ or other artifacts of the file system. ++

++

The truename for a file is often, but not necessarily, unique for ++each file. For instance, a Unix file with multiple hard links ++could have several truenames. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Type-Relationships.html +@@ -0,0 +1,110 @@ ++ ++ ++ ++ ++ ++Type Relationships (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types  

++
++
++

4.2.2 Type Relationships

++ ++
++
*
++

The types cons, symbol, array, number, ++character, hash-table, ++

++

function, ++

++

readtable, package, pathname, stream, ++random-state, condition, restart, ++and any single other type created by defstruct, ++

++

define-condition, ++

++

or defclass are pairwise disjoint, ++except for type relations explicitly established by specifying ++superclasses in defclass ++

++

or define-condition ++

++

or the :include option of destruct. ++

++
++
*
++

Any two types created by defstruct are ++disjoint unless ++one is a supertype of the other by virtue of ++the defstruct :include option. ++

++

[Editorial Note by KMP: The comments in the source say gray suggested some change ++from “common superclass” to “common subclass” in the following, but the ++result looks suspicious to me.] ++

++
++
*
++

Any two distinct classes created by defclass ++or define-condition ++are disjoint unless they have a common subclass or ++one class is a subclass of the other. ++

++
++
*
++

An implementation may be extended to add other subtype ++relationships between the specified types, as long as they do ++not violate the type relationships and disjointness requirements ++specified here. An implementation may define additional types ++that are subtypes or supertypes of any ++specified types, as long as each additional type is ++a subtype of type t and a supertype of type nil and the disjointness requirements ++are not violated. ++

++

At the discretion of the implementation, either standard-object ++or structure-object might appear in any class precedence list ++for a system class that does not already specify either ++standard-object or structure-object. If it does, ++it must precede the class t and follow all other standardized classes. ++

++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Type-Specifiers.html +@@ -0,0 +1,267 @@ ++ ++ ++ ++ ++ ++Type Specifiers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Types  

++
++
++

4.2.3 Type Specifiers

++ ++

Type specifiers can be symbols, classes, or lists. ++Figure~4–2 lists symbols that are ++ standardized atomic type specifiers, and ++Figure~4–3 lists ++ standardized compound type specifier names. ++For syntax information, see the dictionary entry for the corresponding type specifier. ++It is possible to define new type specifiers using ++ defclass, ++ define-condition, ++ defstruct, ++or ++ deftype. ++

++
++
 arithmetic-error                 function           simple-condition          
++ array                            generic-function   simple-error              
++ atom                             hash-table         simple-string             
++ base-char                        integer            simple-type-error         
++ base-string                      keyword            simple-vector             
++ bignum                           list               simple-warning            
++ bit                              logical-pathname   single-float              
++ bit-vector                       long-float         standard-char             
++ broadcast-stream                 method             standard-class            
++ built-in-class                   method-combination standard-generic-function 
++ cell-error                       nil                standard-method           
++ character                        null               standard-object           
++ class                            number             storage-condition         
++ compiled-function                package            stream                    
++ complex                          package-error      stream-error              
++ concatenated-stream              parse-error        string                    
++ condition                        pathname           string-stream             
++ cons                             print-not-readable structure-class           
++ control-error                    program-error      structure-object          
++ division-by-zero                 random-state       style-warning             
++ double-float                     ratio              symbol                    
++ echo-stream                      rational           synonym-stream            
++ end-of-file                      reader-error       t                         
++ error                            readtable          two-way-stream            
++ extended-char                    real               type-error                
++ file-error                       restart            unbound-slot              
++ file-stream                      sequence           unbound-variable          
++ fixnum                           serious-condition  undefined-function        
++ float                            short-float        unsigned-byte             
++ floating-point-inexact           signed-byte        vector                    
++ floating-point-invalid-operation simple-array       warning                   
++ floating-point-overflow          simple-base-string                           
++ floating-point-underflow         simple-bit-vector                            
++
++                 Figure 4–2: Standardized Atomic Type Specifiers               
++
++
++ ++

\indent ++If a type specifier is a list, the car of the list ++is a symbol, and the rest of the list is subsidiary ++type information. Such a type specifier is called ++a compound type specifier ++ ++. ++Except as explicitly stated otherwise, ++the subsidiary items can be unspecified. ++The unspecified subsidiary items are indicated ++by writing *. For example, to completely specify ++a vector, the type of the elements ++and the length of the vector must be present. ++

++
++
 (vector double-float 100)
++
++ ++

The following leaves the length unspecified: ++

++
++
 (vector double-float *)
++
++ ++

The following leaves the element type unspecified: ++

++
++
 (vector * 100)                                      
++
++ ++

Suppose that two type specifiers are the same except that the first ++has a * where the second has a more explicit specification. ++Then the second denotes a subtype ++of the type denoted by the first. ++

++

If a list has one or more unspecified items at the end, ++those items can be dropped. ++If dropping all occurrences of * results in a singleton list, ++then the parentheses can be dropped as well (the list can be replaced ++by the symbol in its car). ++For example, ++(vector double-float *) ++can be abbreviated to (vector double-float), ++and (vector * *) can be abbreviated to (vector) ++and then to ++vector. ++

++
++
  and           long-float    simple-base-string  
++  array         member        simple-bit-vector   
++  base-string   mod           simple-string       
++  bit-vector    not           simple-vector       
++  complex       or            single-float        
++  cons          rational      string              
++  double-float  real          unsigned-byte       
++  eql           satisfies     values              
++  float         short-float   vector              
++  function      signed-byte                       
++  integer       simple-array                      
++
++  Figure 4–3: Standardized Compound Type Specifier Names
++
++
++ ++

Figure 4–4 show the defined names that can be used as ++compound type specifier names ++but that cannot be used as atomic type specifiers. ++

++
++
  and     mod  satisfies  
++  eql     not  values     
++  member  or              
++
++  Figure 4–4: Standardized Compound-Only Type Specifier Names
++
++
++ ++

New type specifiers can come into existence in two ways. ++

++
*
++

Defining a structure by using defstruct without using ++ the :type specifier or defining a class by using ++ defclass ++ or define-condition ++ automatically causes the name of the structure ++ or class to be a new type specifier symbol. ++

++
*
++

deftype can be used to define derived type specifiers ++ ++, ++ which act as ‘abbreviations’ for other type specifiers. ++

++
++ ++

A class object can be used as a type specifier. ++When used this way, it denotes the set of all members of that class. ++

++

Figure 4–5 shows some defined names relating to ++types and declarations. ++

++
++
  coerce            defstruct  subtypep  
++  declaim           deftype    the       
++  declare           ftype      type      
++  defclass          locally    type-of   
++  define-condition  proclaim   typep     
++
++  Figure 4–5: Defined names relating to types and declarations.
++
++
++ ++

Figure 4–6 shows all defined names that are type specifier names, ++whether for atomic type specifiers or compound type specifiers; ++this list is the union of the lists in Figure~4–2 ++and Figure~4–3. ++

++
++
 and                              function           simple-array              
++ arithmetic-error                 generic-function   simple-base-string        
++ array                            hash-table         simple-bit-vector         
++ atom                             integer            simple-condition          
++ base-char                        keyword            simple-error              
++ base-string                      list               simple-string             
++ bignum                           logical-pathname   simple-type-error         
++ bit                              long-float         simple-vector             
++ bit-vector                       member             simple-warning            
++ broadcast-stream                 method             single-float              
++ built-in-class                   method-combination standard-char             
++ cell-error                       mod                standard-class            
++ character                        nil                standard-generic-function 
++ class                            not                standard-method           
++ compiled-function                null               standard-object           
++ complex                          number             storage-condition         
++ concatenated-stream              or                 stream                    
++ condition                        package            stream-error              
++ cons                             package-error      string                    
++ control-error                    parse-error        string-stream             
++ division-by-zero                 pathname           structure-class           
++ double-float                     print-not-readable structure-object          
++ echo-stream                      program-error      style-warning             
++ end-of-file                      random-state       symbol                    
++ eql                              ratio              synonym-stream            
++ error                            rational           t                         
++ extended-char                    reader-error       two-way-stream            
++ file-error                       readtable          type-error                
++ file-stream                      real               unbound-slot              
++ fixnum                           restart            unbound-variable          
++ float                            satisfies          undefined-function        
++ floating-point-inexact           sequence           unsigned-byte             
++ floating-point-invalid-operation serious-condition  values                    
++ floating-point-overflow          short-float        vector                    
++ floating-point-underflow         signed-byte        warning                   
++
++                  Figure 4–6: Standardized Type Specifier Names                
++
++
++ ++ ++
++
++

++Previous: , Up: Types  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Types-and-Classes-Dictionary.html +@@ -0,0 +1,122 @@ ++ ++ ++ ++ ++ ++Types and Classes Dictionary (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Types and Classes  

++
++
++

4.4 Types and Classes Dictionary

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Types and Classes  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Types-and-Classes.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Types and Classes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Top  

++
++
++

4 Types and Classes

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Types.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Types (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.2 Types

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Unconditional-Execution-Clauses.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Unconditional Execution Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.5 Unconditional Execution Clauses

++ ++

The do and doing constructs ++evaluate the ++supplied forms ++wherever they occur in the expanded form of loop. ++ The form argument can be any compound form. ++Each form is evaluated in every iteration. ++Because every loop clause must begin with a loop keyword, ++the keyword do is used when no control action other than execution is ++required. ++

++

The return construct takes one form. ++ Any values returned by the form ++ are immediately returned by the loop form. ++ It is equivalent to the clause ++ do (return-from block-name value), ++ where block-name is the name specified in a named ++ clause, or nil if there is no named clause. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Unconditional-Transfer-of-Control-in-The-_0022Syntax_0022-Section.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Unconditional Transfer of Control in The "Syntax" Section (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.4.30 Unconditional Transfer of Control in The "Syntax" Section

++ ++

Some operators perform an unconditional transfer of control, and ++so never have any return values. Such operators are notated using ++a notation such as the following: ++

++

F a b c ++ ⇒ #<NoValue> ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Undefined-FORMAT-Modifier-Combinations.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Undefined FORMAT Modifier Combinations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.3.10.4 Undefined FORMAT Modifier Combinations

++ ++

The consequences are undefined if colon or at-sign modifiers ++are given to a directive in a combination not specifically described ++here as being meaningful. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Universal-Time.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++Universal Time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Time  

++
++
++

25.1.4.2 Universal Time

++ ++

Universal time ++ ++ is an absolute time represented as a ++single non-negative integer—the number of seconds since ++midnight, January 1, 1900 GMT (ignoring leap seconds). ++Thus the time 1 is 00:00:01 (that is, 12:00:01 a.m.) on January 1, 1900 GMT. ++Similarly, the time 2398291201 corresponds to time 00:00:01 on January 1, ++1976 GMT. ++Recall that the year 1900 was not a leap year; for the purposes of ++Common Lisp, a year is a leap year if and only if its number is divisible by 4, ++except that years divisible by 100 are not leap years, except that years ++divisible by 400 are leap years. Therefore the year 2000 will ++be a leap year. ++Because universal time must be a non-negative integer, ++times before the base time of midnight, January 1, 1900 GMT cannot be processed by Common Lisp. ++

++
++
  decode-universal-time  get-universal-time  
++  encode-universal-time                      
++
++  Figure 25–6: Defined names involving time in Universal Time.
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Unrecognized-Keyword-Arguments.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++Unrecognized Keyword Arguments (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.5.1.5 Unrecognized Keyword Arguments

++ ++

It is not permitted to supply a keyword argument to a function ++using a name that is not recognized by that function ++unless keyword argument checking is suppressed as described ++in Suppressing Keyword Argument Checking. ++

++

If this situation occurs in a safe call, ++

++

an error of type program-error must be signaled; ++and in an unsafe call the situation has undefined consequences. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Unspecific-Components-of-a-Logical-Pathname.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Unspecific Components of a Logical Pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.2.1 Unspecific Components of a Logical Pathname

++ ++

The device component of a logical pathname is always :unspecific; ++no other component of a logical pathname can be :unspecific. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Uppercase-Characters.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Uppercase Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.1.4.4 Uppercase Characters

++ ++

An uppercase character is one that has a corresponding ++lowercase character that is different ++(and can be obtained using char-downcase). ++

++

Of the standard characters, only these are uppercase characters: ++

++

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-Double-Semicolon.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++Use of Double Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.4.4 Use of Double Semicolon

++ ++

Comments that begin with a double semicolon are all aligned to ++the same level of indentation as a form would be at that same ++position in the code. ++The text of such a comment usually describes ++ the state of the program at the point where the comment occurs, ++ the code which follows the comment, ++ or both. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-Implementation_002dDefined-Language-Features.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++Use of Implementation-Defined Language Features (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.2.1 Use of Implementation-Defined Language Features

++ ++

Note that conforming code may rely on particular ++implementation-defined values or features. Also note that the ++requirements for conforming code and conforming implementations do not ++require that the results produced by conforming code always be the ++same when processed by a conforming implementation. The results may be the ++same, or they may differ. ++

++

Portable code is written using only standard characters. ++

++

Conforming code may run in all conforming implementations, but might ++have allowable implementation-defined behavior that makes it ++non-portable code. ++For example, the following are examples of forms that are conforming, but ++that might return different values in different implementations: ++

++
++
 (evenp most-positive-fixnum) ⇒  implementation-dependent
++ (random) ⇒  implementation-dependent
++ (> lambda-parameters-limit 93) ⇒  implementation-dependent
++ (char-name #\A) ⇒  implementation-dependent
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-Quadruple-Semicolon.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Use of Quadruple Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.4.6 Use of Quadruple Semicolon

++ ++

Comments that begin with a quadruple semicolon are all aligned to ++the left margin, and generally contain only a short piece of text that ++serve as a title for the code which follows, and might be used in the ++header or footer of a program that prepares code for presentation as ++a hardcopy document. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-Read_002dTime-Conditionals.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++Use of Read-Time Conditionals (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.5.2.2 Use of Read-Time Conditionals

++ ++

Use of #+ and #- does not automatically disqualify a program ++from being conforming. A program which uses #+ and #- is ++considered conforming if there is no set of features in which the ++program would not be conforming. Of course, conforming programs are ++not necessarily working programs. The following program is conforming: ++

++
++
(defun foo ()
++  #+ACME (acme:initialize-something)
++  (print 'hello-there))
++
++ ++

However, this program might or might not work, depending on whether the ++presence of the feature ACME really implies that a function named ++acme:initialize-something is present in the environment. In effect, ++using #+ or #- in a conforming program means that the variable ++*features* ++ ++

++

becomes just one more piece of input data to that ++program. Like any other data coming into a program, the programmer ++is responsible for assuring that the program does not make unwarranted ++assumptions on the basis of input data. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-Single-Semicolon.html +@@ -0,0 +1,58 @@ ++ ++ ++ ++ ++ ++Use of Single Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.4.3 Use of Single Semicolon

++ ++

Comments that begin with a single semicolon are all aligned to ++the same column at the right (sometimes called the “comment column”). ++The text of such a comment generally applies only to the line on which it appears. ++Occasionally two or three contain a single sentence together; ++this is sometimes indicated by indenting all but the first with an additional ++space (after the semicolon). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-Triple-Semicolon.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Use of Triple Semicolon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.4.4.5 Use of Triple Semicolon

++ ++

Comments that begin with a triple semicolon are all aligned to ++the left margin. Usually they are used prior to a definition or set ++of definitions, rather than within a definition. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Use-of-the-Dot-Character.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++Use of the Dot Character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

1.4.1.10 Use of the Dot Character

++ ++

The dot appearing by itself in an expression such as ++

++

(item1 item2 . tail) ++

++

means that tail represents a list of objects ++at the end of a list. For example, ++

++

(A B C . (D E F)) ++

++

is notationally equivalent to: ++

++

(A B C D E F) ++

++

Although dot is a valid constituent character in a symbol, no ++standardized symbols contain the character dot, ++so a period that follows a reference to a symbol at the end of ++a sentence in this document should always be interpreted as a period ++and never as part of the symbol’s name. ++For example, within this document, a sentence such as ++ “This sample sentence refers to the symbol car.” ++refers to a symbol whose name is "CAR" (with three letters), ++and never to a four-letter symbol "CAR." ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/VALUES-Forms-as-Places.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++VALUES Forms as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.3 VALUES Forms as Places

++ ++

A values form can be used as a place, ++provided that each of its subforms is also a place form. ++

++

A form such as ++

++

(setf (values place-1 \dots place-n) values-form) ++

++

does the following: ++

++
++
1.
++

The subforms of each nested place are evaluated ++in left-to-right order. ++

++
2.
++

The values-form is evaluated, and the first store ++variable from each place is bound to its return values as if by ++multiple-value-bind. ++

++
3.
++

If the setf expansion for any place ++involves more than one store variable, then the additional ++store variables are bound to nil. ++

++
4.
++

The storing forms for each place are evaluated in ++left-to-right order. ++

++
++ ++

The storing form in the setf expansion of values ++returns as multiple values_2 the values of the store ++variables in step 2. That is, the number of values returned is the ++same as the number of place forms. This may be more or fewer ++values than are produced by the values-form. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Valid-Patterns-for-Tokens.html +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++Valid Patterns for Tokens (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.3.5 Valid Patterns for Tokens

++ ++

The valid patterns for tokens are summarized in Figure 2–17. ++

++
++
  nnnnn              a number                                           
++  xxxxx              a symbol in the current package                    
++  :xxxxx             a symbol in the the KEYWORD package                
++  ppppp:xxxxx        an external symbol in the ppppp package            
++  ppppp::xxxxx       a (possibly internal) symbol in the ppppp package  
++  :nnnnn             undefined                                          
++  ppppp:nnnnn        undefined                                          
++  ppppp::nnnnn       undefined                                          
++  ::aaaaa            undefined                                          
++  aaaaa:             undefined                                          
++  aaaaa:aaaaa:aaaaa  undefined                                          
++
++                 Figure 2–17: Valid patterns for tokens                
++
++
++ ++

Note that nnnnn has number syntax, ++ neither xxxxx nor ppppp has number syntax, ++ and aaaaa has any syntax. ++

++

A summary of rules concerning package markers follows. ++In each case, examples are offered to illustrate the case; ++for presentational simplicity, the examples assume that ++the readtable case of the current readtable is :upcase. ++

++
++
1.
++

If there is a single package marker, and it occurs at the beginning of the ++token, then the token is interpreted as a symbol in the KEYWORD package. ++It also sets the symbol-value of the newly-created symbol to that ++same symbol so that the symbol will self-evaluate. ++

++

For example, ++:bar, when read, interns BAR as an external symbol in the KEYWORD package. ++

++
++
2.
++

If there is a single package marker not at the beginning or end of the ++token, then it divides the token into two parts. The first part ++specifies a package; ++the second part is the name of an external symbol ++available in that package. ++

++

For example, ++foo:bar, when read, looks up BAR among the external symbols of ++the package named FOO. ++

++
++
3.
++

If there are two adjacent package markers not at the beginning or end of the ++token, then they divide the token into two parts. The first part ++specifies a package; ++the second part is the name of a symbol within ++that package (possibly an internal symbol). ++

++

For example, ++foo::bar, when read, interns BAR in the package named FOO. ++

++
++
4.
++

If the token contains no package markers, ++and does not have potential number syntax, ++then the entire token is the name of the symbol. ++The symbol is looked up in the current package. ++

++

For example, ++bar, when read, interns BAR in the current package. ++

++
++
5.
++

The consequences are unspecified if any other pattern of package markers ++in a token is used. ++All other uses of package markers within names of symbols ++are not defined by this standard ++but are reserved for implementation-dependent use. ++

++
++ ++

For example, ++assuming the readtable case of the current readtable is :upcase, ++editor:buffer refers to the external symbol ++named BUFFER present in the package named editor, ++regardless of whether there is a symbol named BUFFER in ++the current package. If there is no package named ++editor, or if no symbol named BUFFER ++is present in editor, or if BUFFER is not exported by ++editor, the reader signals ++a correctable error. ++If editor::buffer is seen, the effect is exactly the same as ++reading buffer with the EDITOR package being the current package. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Value-Accumulation-Clauses.html +@@ -0,0 +1,246 @@ ++ ++ ++ ++ ++ ++Value Accumulation Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.3 Value Accumulation Clauses

++ ++

The constructs collect, collecting, ++append, appending, ++nconc, nconcing, ++count, counting, ++maximize, maximizing, ++minimize, minimizing, ++sum, and summing, ++allow values to be accumulated in a loop. ++

++

The constructs collect, ++collecting, append, appending, ++nconc, and nconcing, ++designate clauses that ++accumulate values in lists and return them. ++The constructs count, counting, ++maximize, maximizing, minimize, minimizing, ++sum, and summing designate clauses that accumulate and ++return numerical values. ++

++

During each iteration, the constructs ++collect and collecting ++collect the value of the supplied ++form into a list. ++When iteration terminates, the list is returned. ++The argument var is ++set to the list ++of collected values; if var is supplied, the loop ++does not return the final list automatically. If ++var is not ++supplied, it is equivalent to supplying an internal name for ++var and returning its value in a finally clause. ++The var argument ++is bound as if by the construct with. ++No mechanism is provided for declaring the type of var; ++it must be of type list. ++

++

The constructs append, appending, ++nconc, and nconcing ++are similar to collect except that the ++values of the supplied form must be lists. ++

++
++
*
++

The append keyword causes its list values to be concatenated ++into a single list, as if ++they were arguments to the function append. ++

++
++
*
++

The nconc keyword causes its list values to be concatenated ++into a single list, ++as if they were arguments to the function nconc. ++

++
++ ++

The argument var is ++set to the list of ++concatenated values; if var is supplied, ++loop ++does not return the final list automatically. ++The var argument ++is bound as if by the construct with. ++ A type cannot be supplied for var; ++it must be of type list. ++ The construct nconc ++destructively modifies its argument lists. ++

++

The count construct counts the number of times ++that the supplied form returns true. ++The argument var accumulates the number of occurrences; ++if var is supplied, ++loop does not return the final count automatically. ++The var argument is bound as if by the construct with ++to a zero of the appropriate type. ++Subsequent values (including any necessary coercions) ++are computed as if by the function 1+. ++If into var is used, ++a type can be supplied for var with the type-spec argument; ++the consequences are unspecified if a nonnumeric type is supplied. ++If there is no into variable, ++the optional type-spec argument ++applies to the internal variable that is keeping the count. ++The default type is implementation-dependent; ++but it must be ++a supertype of type fixnum. ++

++

The maximize and ++minimize ++constructs compare ++the value of the supplied form obtained during the first ++iteration with values obtained in successive iterations. ++The maximum (for maximize) or minimum (for minimize) ++value encountered is determined ++(as if by the function max for maximize and ++ as if by the function min for minimize) ++and returned. ++If the maximize or minimize clause ++is never executed, the accumulated value is unspecified. ++The argument var accumulates the maximum or minimum value; ++if var is supplied, ++loop does not return the maximum or minimum automatically. ++The var argument is bound as if by the construct with. ++If into var is used, ++a type can be supplied for var with the type-spec argument; ++the consequences are unspecified if a nonnumeric type is supplied. ++If there is no into variable, ++the optional type-spec argument applies to the internal variable ++that is keeping the maximum or minimum value. ++The default type ++is implementation-dependent; but it ++must be a supertype of type real. ++

++

The sum construct forms a cumulative sum ++of the successive primary values of the supplied form ++at each iteration. ++The argument var is used to accumulate the sum; ++if var is supplied, ++loop does not return the final sum automatically. ++The var argument is bound as if by the construct with ++to a zero of the appropriate type. ++Subsequent values (including any necessary coercions) are computed as if by the function +. ++If into var is used, ++a type can be supplied for var with the type-spec argument; ++the consequences are unspecified if a nonnumeric type is supplied. ++If there is no into variable, ++the optional type-spec argument applies to the internal variable ++that is keeping the sum. ++The default type ++is implementation-dependent; but it ++must be a supertype of type number. ++

++

If into is used, ++the construct does not provide a default return value; ++however, the variable is available ++for use in any finally clause. ++

++

Certain kinds of accumulation clauses can be combined in a loop ++if their destination is the same ++(the result of loop or an into var) ++because they are considered to accumulate conceptually compatible quantities. ++In particular, ++any elements of following sets of accumulation clauses can be mixed ++with other elements of the same set for the same destination ++in a loop form: ++

++
++
*
++

collect, append, nconc ++

++
++
*
++

sum, count ++

++
++
*
++

maximize, minimize ++

++
++ ++
++
;; Collect every name and the kids in one list by using 
++;; COLLECT and APPEND.
++ (loop for name in '(fred sue alice joe june)
++       for kids in '((bob ken) () () (kris sunshine) ())
++       collect name
++       append kids)
++⇒  (FRED BOB KEN SUE ALICE JOE KRIS SUNSHINE JUNE)
++
++ ++

Any two ++clauses that do not accumulate the same type of ++object ++can coexist in a loop only ++if each clause accumulates its values into ++a different ++variable. ++

++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Variable-Initialization-and-Stepping-Clauses.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++Variable Initialization and Stepping Clauses (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

6.1.2 Variable Initialization and Stepping Clauses

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Variable-Names-as-Places.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Variable Names as Places (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.1.2.1 Variable Names as Places

++ ++

The name of a lexical variable or dynamic variable ++can be used as a place. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Variables-that-affect-the-Lisp-Reader.html +@@ -0,0 +1,63 @@ ++ ++ ++ ++ ++ ++Variables that affect the Lisp Reader (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Character Syntax  

++
++
++

2.1.2 Variables that affect the Lisp Reader

++ ++

The Lisp reader is influenced not only by the current readtable, ++but also by various dynamic variables. Figure 2–2 lists ++the variables that influence the behavior of the Lisp reader. ++

++
++
  *package*    *read-default-float-format*  *readtable*  
++  *read-base*  *read-suppress*                           
++
++  Figure 2–2: Variables that influence the Lisp reader. 
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Vectors.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Vectors (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Array Elements  

++
++
++

15.1.1.5 Vectors

++ ++

An array of rank one (i.e., a one-dimensional array) ++is called a vector ++ ++. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Viewing-Integers-as-Bits-and-Bytes.html +@@ -0,0 +1,51 @@ ++ ++ ++ ++ ++ ++Viewing Integers as Bits and Bytes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.1.1.4 Viewing Integers as Bits and Bytes

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Arrays-with-respect-to-EQUALP.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Visible Modification of Arrays with respect to EQUALP (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.7 Visible Modification of Arrays with respect to EQUALP

++ ++

In an array, any visible change ++ to an active element, ++ to the fill pointer (if the array can and does have one), ++ or to the dimensions (if the array is actually adjustable) ++is considered a visible modification with regard to equalp. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Bit-Vectors-and-Strings-with-respect-to-EQUAL.html +@@ -0,0 +1,57 @@ ++ ++ ++ ++ ++ ++Visible Modification of Bit Vectors and Strings with respect to EQUAL (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.4 Visible Modification of Bit Vectors and Strings with respect to EQUAL

++ ++

For a vector of type bit-vector or of type string, any visible change ++ to an active element of the vector, ++ or to the length of the vector (if it is actually adjustable ++ or has a fill pointer) ++is considered a visible modification with regard to equal. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Conses-with-respect-to-EQUAL.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Visible Modification of Conses with respect to EQUAL (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.3 Visible Modification of Conses with respect to EQUAL

++ ++

Any visible change to the car or the cdr of a cons ++is considered a visible modification with regard to equal. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Hash-Tables-with-respect-to-EQUALP.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++Visible Modification of Hash Tables with respect to EQUALP (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.8 Visible Modification of Hash Tables with respect to EQUALP

++ ++

In a hash table, any visible change ++ to the count of entries in the hash table, ++ to the keys, ++ or to the values associated with the keys ++is considered a visible modification with regard to equalp. ++

++

Note that the visibility of modifications to the keys depends on the equivalence test ++of the hash table, not on the specification of equalp. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Objects-with-respect-to-EQ-and-EQL.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Visible Modification of Objects with respect to EQ and EQL (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.1 Visible Modification of Objects with respect to EQ and EQL

++ ++

No standardized function is provided that is capable of visibly ++modifying an object with regard to eq or eql. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Objects-with-respect-to-EQUAL.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Visible Modification of Objects with respect to EQUAL (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.2 Visible Modification of Objects with respect to EQUAL

++ ++

As a consequence of the behavior for equal, ++the rules for visible modification of objects not explicitly mentioned in this ++section are inherited from those in Visible Modification of Objects with respect to EQ and EQL. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Objects-with-respect-to-EQUALP.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Visible Modification of Objects with respect to EQUALP (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.5 Visible Modification of Objects with respect to EQUALP

++ ++

As a consequence of the behavior for equalp, ++the rules for visible modification of objects not explicitly mentioned in this ++section are inherited from those in Visible Modification of Objects with respect to EQUAL. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modification-of-Structures-with-respect-to-EQUALP.html +@@ -0,0 +1,54 @@ ++ ++ ++ ++ ++ ++Visible Modification of Structures with respect to EQUALP (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.6 Visible Modification of Structures with respect to EQUALP

++ ++

Any visible change to a slot of a structure ++is considered a visible modification with regard to equalp. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Visible-Modifications-by-Language-Extensions.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++Visible Modifications by Language Extensions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.1.2.9 Visible Modifications by Language Extensions

++ ++

Implementations that extend the language by providing additional mutator ++functions (or additional behavior for existing mutator functions) must ++document how the use of these extensions interacts with equivalence tests and ++hash table searches. ++

++

Implementations that extend the language by defining additional acceptable ++equivalence tests for hash tables (allowing additional values for the :test ++argument to make-hash-table) must document the visible components of these ++tests. ++

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/When-Compiler-Macros-Are-Used.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++When Compiler Macros Are Used (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.2.2.4 When Compiler Macros Are Used

++ ++

The presence of a compiler macro definition for a function or macro ++indicates that it is desirable for the compiler to use the expansion ++of the compiler macro instead of the original function form or ++macro form. However, no language processor ++(compiler, evaluator, or other code walker) is ever required to actually ++invoke compiler macro functions, or to ++make use of the resulting expansion if it does invoke ++a compiler macro function. ++

++

When the compiler encounters a form during processing that represents ++a call to a compiler macro name (that is not declared notinline), ++the compiler might expand the compiler macro, ++and might use the expansion in place of the original form. ++

++

When eval encounters a form during processing that represents ++a call to a compiler macro name (that is not declared notinline), ++eval might expand the compiler macro, ++and might use the expansion in place of the original form. ++

++

There are two situations in which a compiler macro definition must not be ++applied by any language processor: ++

++
++
*
++

The global function name binding associated with the compiler ++ macro is shadowed by a lexical binding of the function name. ++

++
++
*
++

The function name has been declared or proclaimed notinline and ++ the call form appears within the scope of the declaration. ++

++
++ ++

It is unspecified whether compiler macros are expanded or used in any other ++situations. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Whitespace-Characters.html +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++ ++Whitespace Characters (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

2.1.4.9 Whitespace Characters

++ ++

Whitespace_2 characters are used to separate tokens. ++

++

Space and newline are whitespace_2 characters ++in standard syntax. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/Wildcard-Words-in-a-Logical-Pathname-Namestring.html +@@ -0,0 +1,55 @@ ++ ++ ++ ++ ++ ++Wildcard Words in a Logical Pathname Namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.3.1.7 Wildcard Words in a Logical Pathname Namestring

++ ++

Each asterisk in a wildcard-word matches a sequence of ++zero or more characters. The wildcard-word*” ++parses into :wild; other wildcard-words parse into strings. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002a-_0028Variable_0029.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++* (Variable) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.22 *, **, *** [Variable]

++ ++

Value Type::

++ ++

an object. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The variables *, **, and *** are ++maintained by the Lisp read-eval-print loop to save the ++values of results that are printed each time through the loop. ++

++

The value of * is the most recent primary value that was printed, ++the value of ** is the previous value of *, and ++the value of *** is the previous value of **. ++

++

If several values are produced, * contains the first value only; ++* contains nil if zero values are produced. ++

++

The values of *, **, and *** are updated immediately ++prior to printing the return value of a top-level form by the ++Lisp read-eval-print loop. If the evaluation of such a form ++is aborted prior to its normal return, the values of *, **, and *** ++are not updated. ++

++

Examples::

++
++
(values 'a1 'a2) ⇒  A1, A2
++'b ⇒  B
++(values 'c1 'c2 'c3) ⇒  C1, C2, C3
++(list * ** ***) ⇒  (C1 B A1)
++
++(defun cube-root (x) (expt x 1/3)) ⇒  CUBE-ROOT
++(compile *) ⇒  CUBE-ROOT
++(setq a (cube-root 27.0)) ⇒  3.0
++(* * 9.0) ⇒  27.0
++
++ ++

Affected By::

++ ++

Lisp read-eval-print loop. ++

++

See Also::

++ ++

- ++ (variable), +++ (variable), ++/ ++ (variable), ++Top level loop ++

++

Notes::

++ ++
++
 *   ≡ (car /)
++ **  ≡ (car //)
++ *** ≡ (car ///)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002a.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.24 * [Function]

++ ++

* &rest numbersproduct ++

++

Arguments and Values::

++ ++

number—a number. ++

++

product—a number. ++

++

Description::

++ ++

Returns the product of numbers, ++performing any necessary type conversions in the process. ++If no numbers are supplied, 1 is returned. ++

++

Examples::

++ ++
++
 (*) ⇒  1
++ (* 3 5) ⇒  15
++ (* 1.0 #c(22 33) 55/98) ⇒  #C(12.346938775510203 18.520408163265305)
++
++ ++

Exceptional Situations::

++ ++

Might signal type-error if some argument is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

Numeric Operations, ++Rational Computations, ++Floating-point Computations, ++Complex Computations ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002abreak_002don_002dsignals_002a.html +@@ -0,0 +1,138 @@ ++ ++ ++ ++ ++ ++*break-on-signals* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.25 *break-on-signals* [Variable]

++ ++

Value Type::

++ ++

a type specifier. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

When (typep condition *break-on-signals*) returns true, ++calls to signal, and to other operators such as error ++that implicitly call signal, enter the debugger prior to ++signaling the condition. ++

++

The continue restart can be used to continue with the normal ++signaling process when a break occurs process due to ++*break-on-signals*. ++

++

Examples::

++ ++
++
 *break-on-signals* ⇒  NIL
++ (ignore-errors (error 'simple-error :format-control "Fooey!"))
++⇒  NIL, #<SIMPLE-ERROR 32207172>
++
++ (let ((*break-on-signals* 'error))
++   (ignore-errors (error 'simple-error :format-control "Fooey!")))
++ |>  Break: Fooey!
++ |>  BREAK entered because of *BREAK-ON-SIGNALS*.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Continue to signal.
++ |>   2: Top level.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Continue to signal.
++⇒  NIL, #<SIMPLE-ERROR 32212257>
++
++ (let ((*break-on-signals* 'error))
++   (error 'simple-error :format-control "Fooey!"))
++ |>  Break: Fooey!
++ |>  BREAK entered because of *BREAK-ON-SIGNALS*.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Continue to signal.
++ |>   2: Top level.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Continue to signal.
++ |>  Error: Fooey!
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Top level.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Top level.
++
++ ++

See Also::

++ ++

break ++, ++signal ++, ++warn ++, ++error ++, ++typep ++, ++Condition System Concepts ++

++

Notes::

++ ++

*break-on-signals* is intended primarily for use in debugging code that ++does signaling. When setting *break-on-signals*, the user is ++encouraged to choose the most restrictive specification that suffices. ++Setting *break-on-signals* effectively violates the modular handling of ++condition signaling. In practice, the complete effect of setting ++*break-on-signals* might be unpredictable in some cases since the user ++might not be aware of the variety or number of calls to signal ++that are used in code called only incidentally. ++

++

*break-on-signals* enables an early entry to the debugger but such an ++entry does not preclude an additional entry to the debugger in the case of ++operations such as error and cerror. ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002acompile_002dfile_002dpathname_002a.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++*compile-file-pathname* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2.6 *compile-file-pathname*, *compile-file-truename* [Variable]

++ ++

Value Type::

++ ++

The value of *compile-file-pathname* must always be a pathname or nil. ++The value of *compile-file-truename* must always be a physical pathname or nil. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

During a call to compile-file, ++ *compile-file-pathname* is bound to ++ the pathname denoted by the first argument to compile-file, ++ merged against the defaults; ++ that is, it is bound to (pathname (merge-pathnames input-file)). ++During the same time interval, ++ *compile-file-truename* is bound to ++ the truename of the file being compiled. ++

++

At other times, the value of these variables is nil. ++

++

If a break loop is entered while compile-file is ongoing, ++it is implementation-dependent whether these variables retain ++the values they had just prior to entering the break loop ++or whether they are bound to nil. ++

++

The consequences are unspecified if ++an attempt is made to assign or bind either of these variables. ++

++

Affected By::

++ ++

The file system. ++

++

See Also::

++ ++

compile-file ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002acompile_002dprint_002a.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++*compile-print* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2.8 *compile-print*, *compile-verbose* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The value of *compile-print* is the default value of the :print argument ++to compile-file. ++The value of *compile-verbose* is the default value of the :verbose argument ++to compile-file. ++

++

See Also::

++ ++

compile-file ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002adebug_002dio_002a.html +@@ -0,0 +1,196 @@ ++ ++ ++ ++ ++ ++*debug-io* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.53 *debug-io*, *error-output*, *query-io*,

++

*standard-input*, *standard-output*,

++

*trace-output*

++

[Variable] ++

++

Value Type::

++ ++

For *standard-input*: ++ an input stream ++

++

For *error-output*, *standard-output*, and *trace-output*: ++ an output stream. ++

++

For *debug-io*, *query-io*: ++ a bidirectional stream. ++

++

Initial Value::

++ ++

implementation-dependent, but ++it must be an open stream ++that is not a generalized synonym stream ++to an I/O customization variables ++but that might be a generalized synonym stream to ++the value of some I/O customization variable. ++The initial value might also be a generalized synonym stream ++to either the symbol *terminal-io* or to the stream ++that is its value. ++

++

Description::

++ ++

These variables are collectively called the ++standardized I/O customization variables. ++They can be bound or assigned in order to ++change the default destinations for input and/or output ++used by various standardized operators and facilities. ++

++

The value of *debug-io*, called debug I/O, ++is a stream to be used for interactive debugging purposes. ++

++

The value of *error-output*, called error output, ++is a stream to which warnings and non-interactive error messages should be sent. ++

++

The value of *query-io*, called query I/O, ++is a bidirectional stream ++to be used when asking questions of the user. The question should be output ++to this stream, and the answer read from it. ++

++

The value of *standard-input*, called standard input, ++is a stream that is used by many operators ++as a default source of input when no specific input stream ++is explicitly supplied. ++

++

The value of *standard-output*, called standard output, ++is a stream that is used by many operators ++as a default destination for output when no specific output stream ++is explicitly supplied. ++

++

The value of *trace-output*, called trace output, ++is the stream on which traced functions (see trace) ++and the time macro print their output. ++

++

Examples::

++ ++
++
 (with-output-to-string (*error-output*)
++   (warn "this string is sent to *error-output*"))
++ ⇒  "Warning: this string is sent to *error-output*
++" ;The exact format of this string is implementation-dependent.
++
++ (with-input-from-string (*standard-input* "1001")
++    (+ 990 (read))) ⇒  1991                       
++
++ (progn (setq out (with-output-to-string (*standard-output*)
++                     (print "print and format t send things to")
++                     (format t "*standard-output* now going to a string")))
++        :done)
++⇒  :DONE
++ out
++⇒  "
++\"print and format t send things to\" *standard-output* now going to a string"
++
++ (defun fact (n) (if (< n 2) 1 (* n (fact (- n 1)))))
++⇒  FACT
++ (trace fact)
++⇒  (FACT)
++;; Of course, the format of traced output is implementation-dependent.
++ (with-output-to-string (*trace-output*)
++   (fact 3)) 
++⇒  "
++1 Enter FACT 3
++| 2 Enter FACT 2
++|   3 Enter FACT 1
++|   3 Exit FACT 1
++| 2 Exit FACT 2
++1 Exit FACT 6"
++
++ ++

See Also::

++ ++

*terminal-io*, ++synonym-stream, ++Time ++, ++trace ++, ++Conditions, ++Reader, ++Printer ++

++

Notes::

++ ++

The intent of the constraints on the initial value ++of the I/O customization variables is to ensure that it ++is always safe to bind or assign such a variable to ++the value of another I/O customization variable, without ++unduly restricting implementation flexibility. ++

++

It is common for an implementation to make ++the initial values of *debug-io* and *query-io* ++be the same stream, ++and to make ++the initial values of *error-output* and *standard-output* ++be the same stream. ++

++

The functions y-or-n-p and yes-or-no-p use query I/O ++for their input and output. ++

++

In the normal Lisp read-eval-print loop, ++input is read from standard input. ++Many input functions, including read and read-char, ++take a stream argument that defaults to standard input. ++

++

In the normal Lisp read-eval-print loop, output is sent to standard output. ++Many output functions, including print and write-char, ++take a stream argument that defaults to standard output. ++

++

A program that wants, for example, to divert output to a file should do so by ++binding *standard-output*; that way error messages sent to ++*error-output* can still get to the user by going through ++*terminal-io* (if *error-output* is bound to *terminal-io*), ++which is usually what is desired. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002adebugger_002dhook_002a.html +@@ -0,0 +1,127 @@ ++ ++ ++ ++ ++ ++*debugger-hook* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.24 *debugger-hook* [Variable]

++ ++

Value Type::

++ ++

a designator for a function of two arguments ++ (a condition and the value of *debugger-hook* at the time ++ the debugger was entered), ++or nil. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

When the value of *debugger-hook* is non-nil, it is called prior to ++normal entry into the debugger, either due to a call to invoke-debugger ++or due to automatic entry into the debugger from a call to error ++or cerror with a condition that is not handled. ++The function may either handle the condition ++(transfer control) or return normally (allowing the standard debugger to run). ++To minimize recursive errors while debugging, ++*debugger-hook* is bound to nil by invoke-debugger ++prior to calling the function. ++

++

Examples::

++ ++
++
 (defun one-of (choices &optional (prompt "Choice"))
++   (let ((n (length choices)) (i))
++     (do ((c choices (cdr c)) (i 1 (+ i 1)))
++         ((null c))
++       (format t "~&[~D] ~A~
++     (do () ((typep i `(integer 1 ,n)))
++       (format t "~&~A: " prompt)
++       (setq i (read))
++       (fresh-line))
++     (nth (- i 1) choices)))
++
++ (defun my-debugger (condition me-or-my-encapsulation)
++   (format t "~&Fooey: ~A" condition)
++   (let ((restart (one-of (compute-restarts))))
++     (if (not restart) (error "My debugger got an error."))
++     (let ((*debugger-hook* me-or-my-encapsulation))
++       (invoke-restart-interactively restart))))
++
++ (let ((*debugger-hook* #'my-debugger))
++   (+ 3 'a))
++ |>  Fooey: The argument to +, A, is not a number.
++ |>   [1] Supply a replacement for A.
++ |>   [2] Return to Cloe Toplevel.
++ |>  Choice: 1
++ |>   Form to evaluate and use: (+ 5 'b)
++ |>   Fooey: The argument to +, B, is not a number.
++ |>   [1] Supply a replacement for B.
++ |>   [2] Supply a replacement for A.
++ |>   [3] Return to Cloe Toplevel.
++ |>  Choice: 1
++ |>   Form to evaluate and use: 1
++⇒  9
++
++ ++

Affected By::

++ ++

invoke-debugger ++

++

Notes::

++ ++

When evaluating code typed in by the user interactively, it is sometimes ++useful to have the hook function bind *debugger-hook* to the ++function that was its second argument so that recursive errors ++can be handled using the same interactive facility. ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002adefault_002dpathname_002ddefaults_002a.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++*default-pathname-defaults* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.10 *default-pathname-defaults* [Variable]

++ ++

Value Type::

++ ++

a pathname object. ++

++

Initial Value::

++ ++

An implementation-dependent pathname, ++typically in the working directory that was current when Common Lisp was started up. ++

++

Description::

++ ++

a pathname, used as the default whenever a function ++needs a default pathname and one is not supplied. ++

++

Examples::

++
++
 ;; This example illustrates a possible usage for a hypothetical Lisp running on a
++ ;; DEC TOPS-20 file system.  Since pathname conventions vary between Lisp 
++ ;; implementations and host file system types, it is not possible to provide a
++ ;; general-purpose, conforming example.
++ *default-pathname-defaults* ⇒  #P"PS:<FRED>"
++ (merge-pathnames (make-pathname :name "CALENDAR"))
++⇒  #P"PS:<FRED>CALENDAR"
++ (let ((*default-pathname-defaults* (pathname "<MARY>")))
++   (merge-pathnames (make-pathname :name "CALENDAR")))
++⇒  #P"<MARY>CALENDAR"
++
++ ++

Affected By::

++ ++

The implementation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002afeatures_002a.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++*features* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2.5 *features* [Variable]

++ ++

Value Type::

++ ++

a proper list. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The value of *features* is called the features list. ++It is a list of symbols, called features, ++that correspond to some aspect of the implementation or environment. ++

++

Most features have implementation-dependent meanings; ++The following meanings have been assigned to feature names: ++

++
++
:cltl1
++

If present, indicates that the LISP package purports to conform ++to the 1984 specification Common Lisp: The Language. ++It is possible, but not required, for a conforming implementation ++to have this feature because this specification specifies that ++its symbols are to be in the COMMON-LISP package, ++not the LISP package. ++

++
++
:cltl2
++

If present, indicates that the implementation purports to conform ++to Common Lisp: The Language, Second Edition. ++This feature must not be present in any conforming implementation, ++since conformance to that document is not compatible with conformance ++to this specification. ++The name, however, is reserved by this specification in order to help ++programs distinguish implementations which conform to that document ++from implementations which conform to this specification. ++

++
++
:ieee-floating-point
++

If present, indicates that the implementation purports to conform ++to the requirements of IEEE Standard for Binary Floating-Point Arithmetic. ++

++
++
:x3j13
++

If present, indicates that the implementation conforms to some ++particular working draft of this specification, ++or to some subset of features that approximates a belief about ++what this specification might turn out to contain. ++A conforming implementation might or might not contain ++such a feature. ++(This feature is intended primarily as a stopgap in order to ++provide implementors something to use prior to the availability ++of a draft standard, in order to discourage them from introducing ++the :draft-ansi-cl and :ansi-cl features prematurely.) ++

++
++
:draft-ansi-cl
++

If present, indicates that the implementation ++purports to conform to the first full draft of this specification, ++which went to public review in 1992. ++A conforming implementation ++which has the :draft-ansi-cl-2 or :ansi-cl feature ++is not permitted to retain the :draft-ansi-cl feature ++since incompatible changes were made subsequent to the first draft. ++

++
++
:draft-ansi-cl-2
++

If present, indicates that a second full draft of this specification ++has gone to public review, and that the implementation ++purports to conform to that specification. ++(If additional public review drafts are produced, this keyword ++ will continue to refer to the second draft, and additional keywords ++ will be added to identify conformance with such later drafts. ++ As such, the meaning of this keyword can be relied upon not to ++ change over time.) ++A conforming implementation which has the :ansi-cl ++feature is only permitted to retain the :draft-ansi-cl ++feature if the finally approved standard is not incompatible ++with the draft standard. ++

++
++
:ansi-cl
++

If present, indicates that this specification has been adopted by ANSI ++as an official standard, and that the implementation ++purports to conform. ++

++
++
:common-lisp
++

This feature must appear in *features* for any implementation that ++has one or more of the features :x3j13, :draft-ansi-cl, ++or :ansi-cl. It is intended that it should also appear in ++implementations which have the features :cltl1 or :cltl2, ++but this specification cannot force such behavior. The intent is ++that this feature should identify the language family named “Common Lisp,” ++rather than some specific dialect within that family. ++

++
++
++ ++

See Also::

++ ++

Use of Read-Time Conditionals, ++Standard Macro Characters ++

++

Notes::

++ ++

The value of *features* is used by the #+ and #- reader syntax. ++

++

Symbols in the features list may be in any package, ++but in practice they are generally in the KEYWORD package. ++This is because KEYWORD is the package used by default ++when reading_2 feature expressions ++in the #+ and #- reader macros. ++Code that needs to name a feature_2 in a ++package P (other than KEYWORD) can do so ++by making explicit use of a package prefix for P, ++but note that such code must also assure that the package P ++exists in order for the feature expression to be read_2—even ++in cases where the feature expression is expected to fail. ++

++

It is generally considered wise for an implementation to include ++one or more features identifying the specific implementation, ++so that conditional expressions can be written which distinguish ++idiosyncrasies of one implementation from those of another. ++Since features are normally symbols in the KEYWORD package ++where name collisions might easily result, and since no uniquely defined mechanism ++is designated for deciding who has the right to use which symbol for ++what reason, a conservative strategy is to prefer names derived from ++one’s own company or product name, since those names are often trademarked ++and are hence less likely to be used unwittingly by another implementation. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002agensym_002dcounter_002a.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++*gensym-counter* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.8 *gensym-counter* [Variable]

++ ++

Value Type::

++ ++

a non-negative integer. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

A number which will be used in constructing the name of ++the next symbol generated by the function gensym. ++

++

*gensym-counter* can be either assigned or bound ++at any time, but its value must always be a non-negative integer. ++

++

Affected By::

++ ++

gensym. ++

++

See Also::

++ ++

gensym ++

++

Notes::

++ ++

The ability to pass a numeric argument to gensym has been deprecated; ++explicitly binding *gensym-counter* is now stylistically preferred. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aload_002dpathname_002a.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++*load-pathname* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2.7 *load-pathname*, *load-truename* [Variable]

++ ++

Value Type::

++ ++

The value of *load-pathname* must always be a pathname or nil. ++The value of *load-truename* must always be a physical pathname or nil. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

During a call to load, ++ *load-pathname* is bound to ++ the pathname denoted by the the first argument to load, ++ merged against the defaults; ++ that is, it is bound to (pathname (merge-pathnames filespec)). ++During the same time interval, ++ *load-truename* is bound to ++ the truename of the file being loaded. ++

++

At other times, the value of these variables is nil. ++

++

If a break loop is entered while load is ongoing, ++it is implementation-dependent whether these variables retain ++the values they had just prior to entering the break loop ++or whether they are bound to nil. ++

++

The consequences are unspecified if ++an attempt is made to assign or bind either of these variables. ++

++

Affected By::

++ ++

The file system. ++

++

See Also::

++ ++

load ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aload_002dprint_002a.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++*load-print* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: System Construction Dictionary  

++
++
++

24.2.9 *load-print*, *load-verbose* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

The initial value of *load-print* is false. ++The initial value of *load-verbose* is implementation-dependent. ++

++

Description::

++ ++

The value of *load-print* is the default value of the :print argument to load. ++The value of *load-verbose* is the default value of the :verbose argument to load. ++

++

See Also::

++ ++

load ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002amacroexpand_002dhook_002a.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++*macroexpand-hook* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.15 *macroexpand-hook* [Variable]

++ ++

Value Type::

++ ++

a designator for a function of three arguments: ++ a macro function, ++ a macro form, ++ and an environment object. ++

++

Initial Value::

++ ++

a designator for a function that is equivalent to the function funcall, ++but that might have additional implementation-dependent side-effects. ++

++

Description::

++ ++

Used as the expansion interface hook by macroexpand-1 to ++control the macro expansion process. ++When a macro form is to be expanded, ++this function is called with three arguments: ++ the macro function, ++ the macro form, ++ and the environment in which the macro form is to be expanded. ++

++

The environment object has dynamic extent; ++the consequences are undefined if the environment object is ++referred to outside the dynamic extent of the macro expansion function. ++

++

Examples::

++ ++
++
 (defun hook (expander form env)
++    (format t "Now expanding: ~S~
++    (funcall expander form env)) ⇒  HOOK 
++ (defmacro machook (x y) `(/ (+ ,x ,y) 2)) ⇒  MACHOOK 
++ (macroexpand '(machook 1 2)) ⇒  (/ (+ 1 2) 2), true 
++ (let ((*macroexpand-hook* #'hook)) (macroexpand '(machook 1 2)))
++ |>  Now expanding (MACHOOK 1 2) 
++⇒  (/ (+ 1 2) 2), true
++
++ ++

See Also::

++ ++

macroexpand ++, macroexpand-1, ++funcall ++, Evaluation ++

++

Notes::

++ ++

The net effect of the chosen initial value is to just invoke the ++macro function, giving it the macro form and ++environment as its two arguments. ++

++

Users or user programs can assign this variable to ++customize or trace the macro expansion mechanism. Note, however, ++that this variable is a global resource, potentially shared by ++multiple programs; as such, if any two programs depend for ++their correctness on the setting of this variable, those ++programs may not be able to run in the same Lisp image. ++For this reason, it is frequently best to confine its uses to debugging ++situations. ++

++

Users who put their own function into *macroexpand-hook* ++should consider saving the previous value of the hook, and calling that ++value from their own. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002amodules_002a.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++*modules* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: System Construction Dictionary  

++
++
++

24.2.10 *modules* [Variable]

++ ++

Value Type::

++ ++

a list of strings. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The value of *modules* is a list of names of the modules ++that have been loaded into the current Lisp image. ++

++

Affected By::

++ ++

provide ++

++

See Also::

++ ++

provide ++, ++require ++

++

Notes::

++ ++

The variable *modules* is deprecated. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002apackage_002a.html +@@ -0,0 +1,102 @@ ++ ++ ++ ++ ++ ++*package* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.28 *package* [Variable]

++ ++

Value Type::

++ ++

a package object. ++

++

Initial Value::

++ ++

the COMMON-LISP-USER package. ++

++

Description::

++ ++

Whatever package object is currently ++the value of *package* is referred to as the current package. ++

++

Examples::

++ ++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ *package* ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (make-package "SAMPLE-PACKAGE" :use '("COMMON-LISP"))
++⇒  #<PACKAGE "SAMPLE-PACKAGE">
++ (list 
++   (symbol-package
++     (let ((*package* (find-package 'sample-package)))
++       (setq *some-symbol* (read-from-string "just-testing"))))
++   *package*)
++⇒  (#<PACKAGE "SAMPLE-PACKAGE"> #<PACKAGE "COMMON-LISP-USER">)
++ (list (symbol-package (read-from-string "just-testing"))
++       *package*)
++⇒  (#<PACKAGE "COMMON-LISP-USER"> #<PACKAGE "COMMON-LISP-USER">)
++ (eq 'foo (intern "FOO")) ⇒  true
++ (eq 'foo (let ((*package* (find-package 'sample-package)))
++            (intern "FOO")))
++⇒  false
++
++ ++

Affected By::

++ ++

load, ++compile-file, ++in-package ++

++

See Also::

++ ++

compile-file ++, ++in-package ++, ++load ++, ++package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002darray_002a.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++*print-array* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.16 *print-array* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

Controls the format in which arrays are printed. ++If it is false, the contents of arrays other than strings ++are never printed. Instead, arrays are printed in a concise form using ++#< that gives enough information for the user to be able to identify the ++array, but does not include the entire array contents. ++If it is true, non-string arrays are printed using ++#(...), #*, or #nA syntax. ++

++

Affected By::

++ ++

The implementation. ++

++

See Also::

++ ++

Sharpsign Left-Parenthesis, ++Sharpsign Less-Than-Sign ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dbase_002a.html +@@ -0,0 +1,130 @@ ++ ++ ++ ++ ++ ++*print-base* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.17 *print-base*, *print-radix* [Variable]

++ ++

Value Type::

++ ++

*print-base*—a radix. ++*print-radix*—a generalized boolean. ++

++

Initial Value::

++ ++

The initial value of *print-base* is 10. ++The initial value of *print-radix* is false. ++

++

Description::

++ ++

*print-base* and *print-radix* control the printing ++of rationals. ++The value of *print-base* is called the current output base ++ ++. ++

++

The value of *print-base* is the radix in which the printer ++will print rationals. For radices above 10, letters of ++the alphabet are used to represent digits above 9. ++

++

If the value of *print-radix* is true, ++the printer will print a radix specifier to indicate the radix ++in which it is printing a rational number. The radix specifier ++is always printed using lowercase letters. If *print-base* ++is 2, 8, or 16, then the radix specifier used is #b, ++#o, or #x, respectively. For integers, base ten is ++indicated by a trailing decimal point instead of a leading radix ++specifier; for ratios, #10r is used. ++

++

Examples::

++ ++
++
 (let ((*print-base* 24.) (*print-radix* t)) 
++   (print 23.))
++ |>  #24rN
++⇒  23
++ (setq *print-base* 10) ⇒  10
++ (setq *print-radix* nil) ⇒  NIL                                          
++ (dotimes (i 35)
++    (let ((*print-base* (+ i 2)))           ;print the decimal number 40 
++      (write 40)                            ;in each base from 2 to 36
++      (if (zerop (mod i 10)) (terpri) (format t " "))))
++ |>  101000
++ |>  1111 220 130 104 55 50 44 40 37 34
++ |>  31 2C 2A 28 26 24 22 20 1J 1I
++ |>  1H 1G 1F 1E 1D 1C 1B 1A 19 18
++ |>  17 16 15 14 
++⇒  NIL
++ (dolist (pb '(2 3 8 10 16))               
++    (let ((*print-radix* t)                 ;print the integer 10 and 
++          (*print-base* pb))                ;the ratio 1/10 in bases 2, 
++     (format t "~&~S  ~S~
++ |>  #b1010  #b1/1010
++ |>  #3r101  #3r1/101
++ |>  #o12  #o1/12
++ |>  10.  #10r1/10
++ |>  #xA  #x1/A
++⇒  NIL
++
++ ++

Affected By::

++ ++

Might be bound by format, and write, write-to-string. ++

++

See Also::

++ ++

format ++, ++write ++, ++write-to-string ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dcase_002a.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++*print-case* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.18 *print-case* [Variable]

++ ++

Value Type::

++ ++

One of the symbols :upcase, :downcase, or :capitalize. ++

++

Initial Value::

++ ++

The symbol :upcase. ++

++

Description::

++ ++

The value of *print-case* controls the case (upper, lower, or mixed) in ++which to print any uppercase characters in the names of symbols ++when vertical-bar syntax is not used. ++

++

*print-case* has an effect at all times when the value of *print-escape* ++is false. *print-case* also has an effect when ++the value of *print-escape* is true unless inside an escape context ++(i.e., unless between vertical-bars or after a slash). ++

++

Examples::

++ ++
++
 (defun test-print-case ()
++   (dolist (*print-case* '(:upcase :downcase :capitalize))
++     (format t "~&~S ~S~
++⇒  TEST-PC
++;; Although the choice of which characters to escape is specified by
++;; *PRINT-CASE*, the choice of how to escape those characters 
++;; (i.e., whether single escapes or multiple escapes are used)
++;; is implementation-dependent.  The examples here show two of the
++;; many valid ways in which escaping might appear.
++ (test-print-case) ;Implementation A
++ |>  THIS-AND-THAT |And-something-elSE|
++ |>  this-and-that a\n\d-\s\o\m\e\t\h\i\n\g-\e\lse
++ |>  This-And-That A\n\d-\s\o\m\e\t\h\i\n\g-\e\lse
++⇒  NIL
++ (test-print-case) ;Implementation B
++ |>  THIS-AND-THAT |And-something-elSE|
++ |>  this-and-that a|nd-something-el|se
++ |>  This-And-That A|nd-something-el|se
++⇒  NIL
++
++ ++

See Also::

++ ++

write ++

++

Notes::

++ ++

read normally converts lowercase characters appearing ++in symbols to corresponding uppercase characters, ++so that internally print names normally contain only uppercase characters. ++

++

If *print-escape* is true, ++lowercase characters in the name of a symbol ++are always printed in lowercase, and ++are preceded by a single escape character ++or enclosed by multiple escape characters; ++uppercase characters in the name of a symbol ++are printed in upper case, in lower case, or in mixed case ++so as to capitalize words, according to the value of ++*print-case*. The convention for what constitutes ++a “word” is the same as for string-capitalize. ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dcircle_002a.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++*print-circle* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.19 *print-circle* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

false. ++

++

Description::

++ ++

Controls the attempt to detect circularity and sharing in an object ++being printed. ++

++

If false, ++the printing process merely proceeds by recursive descent without attempting ++to detect circularity and sharing. ++

++

If true, ++the printer will endeavor to detect cycles and sharing ++in the structure to be printed, ++and to use #n= and #n# ++syntax to indicate the circularities or shared components. ++

++

If true, a user-defined ++

++

print-object method ++

++

can print ++objects to the supplied stream using write, prin1, ++princ, or format and expect circularities and sharing ++to be detected and printed using the #n# syntax. ++

++

If a user-defined ++

++

print-object method ++

++

prints to a stream other than the one ++that was supplied, then circularity detection starts over for that stream. ++

++

Note that implementations should not use #n# notation ++when the Lisp reader would automatically assure sharing without it ++(e.g., as happens with interned symbols). ++

++

Examples::

++ ++
++
 (let ((a (list 1 2 3)))
++   (setf (cdddr a) a)
++   (let ((*print-circle* t))
++     (write a)
++     :done))
++ |>  #1=(1 2 3 . #1#)
++⇒  :DONE
++
++ ++

See Also::

++ ++

write ++

++

Notes::

++ ++

An attempt to print a circular structure with *print-circle* ++set to nil may lead to looping behavior and failure to terminate. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002descape_002a.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++*print-escape* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.20 *print-escape* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

true. ++

++

Description::

++ ++

If false, ++escape characters and package prefixes are not output ++when an expression is printed. ++

++

If true, an attempt is made to print an expression ++in such a way that it can be read again to produce an equal expression. ++(This is only a guideline; not a requirement. See *print-readably*.) ++

++

For more specific details of how the value of *print-escape* ++affects the printing of certain types, ++see Default Print-Object Methods. ++

++

Examples::

++
++
 (let ((*print-escape* t)) (write #\a))
++ |>  #\a
++⇒  #\a
++ (let ((*print-escape* nil)) (write #\a))
++ |>  a
++⇒  #\a
++
++ ++

Affected By::

++ ++

princ, prin1, format ++

++

See Also::

++ ++

write ++, ++readtable-case ++

++

Notes::

++ ++

princ effectively binds *print-escape* to false. ++prin1 effectively binds *print-escape* to true. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dgensym_002a.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++*print-gensym* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.21 *print-gensym* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

true. ++

++

Description::

++ ++

Controls whether the prefix “#:” is printed before ++apparently uninterned symbols. ++The prefix is printed before such symbols ++if and only if the value of *print-gensym* is true. ++

++

Examples::

++ ++
++
 (let ((*print-gensym* nil))
++   (print (gensym)))
++ |>  G6040 
++⇒  #:G6040
++
++ ++

See Also::

++ ++

write ++, *print-escape* ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dlevel_002a.html +@@ -0,0 +1,143 @@ ++ ++ ++ ++ ++ ++*print-level* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.22 *print-level*, *print-length* [Variable]

++ ++

Value Type::

++ ++

a non-negative integer, or nil. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

*print-level* controls how many levels deep a nested object will print. ++If it is false, then no control is exercised. ++Otherwise, it is an integer indicating the maximum level to be printed. ++An object to be printed is at level 0; ++its components (as of a list or vector) are at level 1; ++and so on. ++If an object to be recursively printed has components ++and is at a level equal to or greater than the value of *print-level*, ++then the object is printed as “#”. ++

++

*print-length* controls how many elements at a given level are printed. ++If it is false, there is no limit to the number of components printed. ++Otherwise, it is an integer indicating the maximum number of elements ++of an object to be printed. If exceeded, the printer will print ++“...” in place of the other elements. In the case of a dotted list, ++if the list contains exactly as many elements as the value of *print-length*, ++the terminating atom is printed rather than printing “...” ++

++

*print-level* and *print-length* affect the printing ++of an any object printed with a list-like syntax. They do not affect ++the printing of symbols, strings, and bit vectors. ++

++

Examples::

++ ++
++
 (setq a '(1 (2 (3 (4 (5 (6))))))) ⇒  (1 (2 (3 (4 (5 (6))))))
++ (dotimes (i 8) 
++   (let ((*print-level* i)) 
++     (format t "~&~D -- ~S~
++ |>  0 -- #
++ |>  1 -- (1 #)
++ |>  2 -- (1 (2 #))
++ |>  3 -- (1 (2 (3 #)))
++ |>  4 -- (1 (2 (3 (4 #))))
++ |>  5 -- (1 (2 (3 (4 (5 #)))))
++ |>  6 -- (1 (2 (3 (4 (5 (6))))))
++ |>  7 -- (1 (2 (3 (4 (5 (6))))))
++⇒  NIL
++
++ (setq a '(1 2 3 4 5 6)) ⇒  (1 2 3 4 5 6)
++ (dotimes (i 7) 
++   (let ((*print-length* i)) 
++     (format t "~&~D -- ~S~
++ |>  0 -- (...)
++ |>  1 -- (1 ...)
++ |>  2 -- (1 2 ...)
++ |>  3 -- (1 2 3 ...)
++ |>  4 -- (1 2 3 4 ...)
++ |>  5 -- (1 2 3 4 5 6)
++ |>  6 -- (1 2 3 4 5 6)
++⇒  NIL
++
++(dolist (level-length '((0 1) (1 1) (1 2) (1 3) (1 4) 
++                        (2 1) (2 2) (2 3) (3 2) (3 3) (3 4)))
++ (let ((*print-level*  (first  level-length))
++       (*print-length* (second level-length)))
++   (format t "~&~D ~D -- ~S~
++           *print-level* *print-length* 
++           '(if (member x y) (+ (car x) 3) '(foo . #(a b c d "Baz"))))))
++ |>  0 1 -- #
++ |>  1 1 -- (IF ...)
++ |>  1 2 -- (IF # ...)
++ |>  1 3 -- (IF # # ...)
++ |>  1 4 -- (IF # # #)
++ |>  2 1 -- (IF ...)
++ |>  2 2 -- (IF (MEMBER X ...) ...)
++ |>  2 3 -- (IF (MEMBER X Y) (+ # 3) ...)
++ |>  3 2 -- (IF (MEMBER X ...) ...)
++ |>  3 3 -- (IF (MEMBER X Y) (+ (CAR X) 3) ...)
++ |>  3 4 -- (IF (MEMBER X Y) (+ (CAR X) 3) '(FOO . #(A B C D ...)))
++⇒  NIL
++
++ ++

See Also::

++ ++

write ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dlines_002a.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++*print-lines* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.23 *print-lines* [Variable]

++ ++

Value Type::

++ ++

a non-negative integer, or nil. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

When the value of *print-lines* is other than nil, ++it is a limit on the number of output lines produced when something is pretty ++printed. If an attempt is made to go beyond that many lines, ++“..” is printed at the end of the last line followed by all of the ++suffixes (closing delimiters) that are pending to be printed. ++

++

Examples::

++ ++
++
 (let ((*print-right-margin* 25) (*print-lines* 3))
++   (pprint '(progn (setq a 1 b 2 c 3 d 4))))
++ |>  (PROGN (SETQ A 1
++ |>               B 2
++ |>               C 3 ..))
++⇒  <no values>
++
++ ++

Notes::

++ ++

The “..” notation is intentionally different than ++the “...” notation used for level abbreviation, so that the two ++different situations can be visually distinguished. ++

++

This notation is used to increase the likelihood that the Lisp reader ++will signal an error if an attempt is later made to read the abbreviated output. ++Note however that if the truncation occurs in a string, ++as in "This string has been trunc..", the problem situation cannot be ++detected later and no such error will be signaled. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dmiser_002dwidth_002a.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++*print-miser-width* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.24 *print-miser-width* [Variable]

++ ++

Value Type::

++ ++

a non-negative integer, or nil. ++

++

Initial Value::

++ ++

implementation-dependent ++

++

Description::

++ ++

If it is not nil, the pretty printer switches to a compact ++style of output (called miser style) whenever the width available for ++printing a substructure is less than or equal to this many ems. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dpprint_002ddispatch_002a.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++*print-pprint-dispatch* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.25 *print-pprint-dispatch* [Variable]

++ ++

Value Type::

++ ++

a pprint dispatch table. ++

++

Initial Value::

++ ++

implementation-dependent, but the initial entries all use a ++special class of priorities that have the property that they are less ++than every priority that can be specified using set-pprint-dispatch, ++so that the initial contents of any entry can be overridden. ++

++

Description::

++ ++

The pprint dispatch table which currently controls the pretty printer. ++

++

See Also::

++ ++

*print-pretty*, ++Pretty Print Dispatch Tables ++

++

Notes::

++ ++

The intent is that the initial value of this variable should ++cause ‘traditional’ pretty printing of code. ++In general, however, you can put a value in *print-pprint-dispatch* ++that makes pretty-printed output look exactly like non-pretty-printed output. ++

++

Setting *print-pretty* to true ++just causes the functions contained in the current pprint dispatch table ++to have priority over normal print-object methods; ++it has no magic way of enforcing that those functions actually produce pretty ++output. For details, see Pretty Print Dispatch Tables. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dpretty_002a.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++*print-pretty* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.4.26 *print-pretty* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

Controls whether the Lisp printer calls the pretty printer. ++

++

If it is false, ++the pretty printer is not used and ++

++

a minimum ++

++

of whitespace_1 ++is output when printing an expression. ++

++

If it is true, ++the pretty printer is used, and the Lisp printer will endeavor ++to insert extra whitespace_1 where appropriate to make expressions ++more readable. ++

++

*print-pretty* has an effect even when the value of *print-escape* ++is false. ++

++

Examples::

++ ++
++
 (setq *print-pretty* 'nil) ⇒  NIL
++ (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil)
++ |>  (LET ((A 1) (B 2) (C 3)) (+ A B C))
++⇒  NIL
++ (let ((*print-pretty* t))
++   (progn (write '(let ((a 1) (b 2) (c 3)) (+ a b c))) nil))
++ |>  (LET ((A 1)
++ |>        (B 2)
++ |>        (C 3))
++ |>    (+ A B C))
++⇒  NIL
++;; Note that the first two expressions printed by this next form
++;; differ from the second two only in whether escape characters are printed.
++;; In all four cases, extra whitespace is inserted by the pretty printer.
++ (flet ((test (x)
++          (let ((*print-pretty* t))
++            (print x)
++            (format t "~
++            (terpri) (princ x) (princ " ")
++            (format t "~
++  (test '#'(lambda () (list "a" #’c #'d))))
++ |>  #'(LAMBDA ()
++ |>      (LIST "a" #’C #'D))
++ |>  #'(LAMBDA ()
++ |>      (LIST "a" #’C #'D))
++ |>  #'(LAMBDA ()
++ |>      (LIST a b 'C #'D)) 
++ |>  #'(LAMBDA ()
++ |>      (LIST a b 'C #'D))
++⇒  NIL
++
++ ++

See Also::

++ ++

write ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dreadably_002a.html +@@ -0,0 +1,166 @@ ++ ++ ++ ++ ++ ++*print-readably* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.27 *print-readably* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

false. ++

++

Description::

++ ++

If *print-readably* is true, ++some special rules for printing objects go into effect. ++Specifically, printing any object O_1 produces a printed ++representation that, when seen by the Lisp reader ++while the standard readtable is in effect, ++will produce ++an object O_2 that is similar to O_1. ++The printed representation produced might or might not be the same as ++the printed representation produced when *print-readably* is false. ++If printing an object readably is not possible, ++an error of type print-not-readable is signaled rather than ++using a syntax (e.g., the “#<” syntax) that would not be readable by ++the same implementation. ++If the value of some other printer control variable is such ++that these requirements would be violated, the value of that other ++variable is ignored. ++

++

Specifically, if *print-readably* is true, ++printing proceeds as if ++ *print-escape*, ++ *print-array*, ++ and *print-gensym* were also true, ++and as if ++ *print-length*, ++ *print-level*, ++ and *print-lines* were false. ++

++

If *print-readably* is false, ++the normal rules for printing and the normal interpretations ++of other printer control variables are in effect. ++

++

Individual methods for print-object, including user-defined ++methods, are responsible for implementing these requirements. ++

++

If *read-eval* is false and *print-readably* is true, ++any such method that would output a reference to the “#.reader macro ++will either output something else or will signal an error (as described above). ++

++

Examples::

++ ++
++
 (let ((x (list "a" '\a (gensym) '((a (b (c))) d e f g)))
++       (*print-escape* nil)
++       (*print-gensym* nil)
++       (*print-level* 3)
++       (*print-length* 3))
++   (write x)
++   (let ((*print-readably* t))
++     (terpri)
++     (write x)
++     :done))
++ |>  (a a G4581 ((A #) D E ...))
++ |>  ("a" |a| #:G4581 ((A (B (C))) D E F G))
++⇒  :DONE
++
++;; This is setup code is shared between the examples
++;; of three hypothetical implementations which follow.
++ (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32005763> 
++ (setf (gethash table 1) 'one) ⇒  ONE
++ (setf (gethash table 2) 'two) ⇒  TWO
++
++;; Implementation A
++ (let ((*print-readably* t)) (print table))
++ Error: Can't print #<HASH-TABLE EQL 0/120 32005763> readably.
++
++;; Implementation B
++;; No standardized #S notation for hash tables is defined, 
++;; but there might be an implementation-defined notation.
++ (let ((*print-readably* t)) (print table))
++ |>  #S(HASH-TABLE :TEST EQL :SIZE 120 :CONTENTS (1 ONE 2 TWO))
++⇒  #<HASH-TABLE EQL 0/120 32005763>
++
++;; Implementation C
++;; Note that #. notation can only be used if *READ-EVAL* is true.
++;; If *READ-EVAL* were false, this same implementation might have to
++;; signal an error unless it had yet another printing strategy to fall
++;; back on.
++ (let ((*print-readably* t)) (print table))
++ |>  #.(LET ((HASH-TABLE (MAKE-HASH-TABLE)))
++ |>      (SETF (GETHASH 1 HASH-TABLE) ONE)
++ |>      (SETF (GETHASH 2 HASH-TABLE) TWO)
++ |>      HASH-TABLE)
++⇒  #<HASH-TABLE EQL 0/120 32005763>
++
++ ++

See Also::

++ ++

write ++, ++print-unreadable-object ++

++

Notes::

++ ++

The rules for “similarity” imply that ++#A or #( ++syntax cannot be used for arrays of element type ++other than t. ++An implementation will have to use another syntax ++or signal an error of type print-not-readable. ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aprint_002dright_002dmargin_002a.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++*print-right-margin* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.28 *print-right-margin* [Variable]

++ ++

Value Type::

++ ++

a non-negative integer, or nil. ++

++

Initial Value::

++ ++

nil. ++

++

Description::

++ ++

If it is non-nil, it specifies the right margin (as integer ++number of ems) to use when the pretty printer is making ++layout decisions. ++

++

If it is nil, the right margin is taken to be the maximum line length ++such that output can be displayed without wraparound or truncation. ++If this cannot be determined, an implementation-dependent value is used. ++

++

Notes::

++ ++

This measure is in units of ems in order to be compatible with ++implementation-defined variable-width fonts while still not ++requiring the language to provide support for fonts. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002arandom_002dstate_002a.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++*random-state* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.43 *random-state* [Variable]

++ ++

Value Type::

++ ++

a random state. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The current random state, which is used, for example, ++by the function random when a random state is not explicitly supplied. ++

++

Examples::

++ ++
++
 (random-state-p *random-state*) ⇒  true
++ (setq snap-shot (make-random-state))
++ ;; The series from any given point is random,
++ ;; but if you backtrack to that point, you get the same series.
++ (list (loop for i from 1 to 10 collect (random))
++       (let ((*random-state* snap-shot))
++         (loop for i from 1 to 10 collect (random)))
++       (loop for i from 1 to 10 collect (random))
++       (let ((*random-state* snap-shot))
++         (loop for i from 1 to 10 collect (random))))
++⇒  ((19 16 44 19 96 15 76 96 13 61)
++    (19 16 44 19 96 15 76 96 13 61)
++    (16 67 0 43 70 79 58 5 63 50)
++    (16 67 0 43 70 79 58 5 63 50))
++
++ ++

Affected By::

++ ++

The implementation. ++

++

random. ++

++

See Also::

++ ++

make-random-state ++, ++random ++, ++random-state ++

++

Notes::

++ ++

Binding *random-state* to a different ++random state object correctly saves and ++restores the old random state object. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aread_002dbase_002a.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++*read-base* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.13 *read-base* [Variable]

++ ++

Value Type::

++ ++

a radix. ++

++

Initial Value::

++ ++

10. ++

++

Description::

++ ++

Controls the interpretation of tokens by read as being ++integers or ratios. ++

++

The value of *read-base*, called the current input base ++ ++, ++is the radix in which integers and ++ratios are to be read by the Lisp reader. ++The parsing of other numeric types (e.g., floats) is ++not affected by this option. ++

++

The effect of *read-base* on the reading of any particular ++rational number can be locally overridden by explicit use of the ++#O, #X, #B, or #nR syntax ++or by a trailing decimal point. ++

++

Examples::

++ ++
++
 (dotimes (i 6)
++   (let ((*read-base* (+ 10. i)))
++     (let ((object (read-from-string "(\\DAD DAD |BEE| BEE 123. 123)")))
++       (print (list *read-base* object)))))
++ |>  (10 (DAD DAD BEE BEE 123 123))
++ |>  (11 (DAD DAD BEE BEE 123 146))
++ |>  (12 (DAD DAD BEE BEE 123 171))
++ |>  (13 (DAD DAD BEE BEE 123 198))
++ |>  (14 (DAD 2701 BEE BEE 123 227))
++ |>  (15 (DAD 3088 BEE 2699 123 258))
++⇒  NIL
++
++ ++

Notes::

++ ++

Altering the input radix can be useful when reading data files in special formats. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aread_002ddefault_002dfloat_002dformat_002a.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++*read-default-float-format* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.14 *read-default-float-format* [Variable]

++ ++

Value Type::

++ ++

one of the atomic type specifiers ++ short-float, ++ single-float, ++ double-float, ++ or long-float, ++ or else some other type specifier defined ++ by the implementation to be acceptable. ++

++

Initial Value::

++ ++

The symbol single-float. ++

++

Description::

++ ++

Controls the floating-point format that is to be used when reading a ++floating-point number that has no exponent marker or that has ++e or E for an exponent marker. Other exponent markers ++explicitly prescribe the floating-point format to be used. ++

++

The printer uses *read-default-float-format* to guide the ++choice of exponent markers when printing floating-point numbers. ++

++

Examples::

++ ++
++
 (let ((*read-default-float-format* 'double-float))
++   (read-from-string "(1.0 1.0e0 1.0s0 1.0f0 1.0d0 1.0L0)"))
++⇒  (1.0   1.0   1.0   1.0 1.0   1.0)   ;Implementation has float format F.
++⇒  (1.0   1.0   1.0s0 1.0 1.0   1.0)   ;Implementation has float formats S and F.
++⇒  (1.0d0 1.0d0 1.0   1.0 1.0d0 1.0d0) ;Implementation has float formats F and D.
++⇒  (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0d0) ;Implementation has float formats S, F, D.
++⇒  (1.0d0 1.0d0 1.0   1.0 1.0d0 1.0L0) ;Implementation has float formats F, D, L.
++⇒  (1.0d0 1.0d0 1.0s0 1.0 1.0d0 1.0L0) ;Implementation has formats S, F, D, L.
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aread_002deval_002a.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++*read-eval* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.15 *read-eval* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

true. ++

++

Description::

++ ++

If it is true, the #. reader macro has its normal effect. ++Otherwise, that reader macro signals an error of type reader-error. ++

++

See Also::

++ ++

*print-readably* ++

++

Notes::

++ ++

If *read-eval* is false and *print-readably* is true, ++any method for print-object that would output a reference ++to the #. reader macro either outputs something different ++or signals an error of type print-not-readable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aread_002dsuppress_002a.html +@@ -0,0 +1,163 @@ ++ ++ ++ ++ ++ ++*read-suppress* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.16 *read-suppress* [Variable]

++ ++

Value Type::

++ ++

a generalized boolean. ++

++

Initial Value::

++ ++

false. ++

++

Description::

++ ++

This variable is intended primarily to support the operation of the ++read-time conditional notations #+ and #-. It is important for the ++reader macros which implement these notations ++to be able to skip over the printed representation of an ++expression despite the possibility that the syntax of the skipped ++expression may not be entirely valid for the current implementation, ++since #+ and #- exist in order to allow the same program to be ++shared among several Lisp implementations (including dialects other than Common Lisp) ++despite small incompatibilities of syntax. ++

++

If it is false, the Lisp reader operates normally. ++

++

If the value of *read-suppress* is true, ++ read, ++ read-preserving-whitespace, ++ read-delimited-list, ++ and read-from-string ++all return a primary value of nil when they complete successfully; ++however, they continue to parse the representation of an object ++in the normal way, in order to skip over the object, ++and continue to indicate end of file in the normal way. ++Except as noted below, ++any standardized reader macro_2 ++that is defined to read_2 ++a following object or token ++will do so, ++but not signal an error if the object ++read is not of an appropriate type or syntax. ++The standard syntax and its associated reader macros ++will not construct any new objects ++ (e.g., when reading the representation of a symbol, ++ no symbol will be constructed or interned). ++

++
++
Extended tokens
++

All extended tokens are completely uninterpreted. ++Errors such as those that might otherwise be signaled due to ++ detection of invalid potential numbers, ++ invalid patterns of package markers, ++ and invalid uses of the dot character are suppressed. ++

++
++
Dispatching macro characters (including sharpsign)
++

Dispatching macro characters continue to parse an infix numerical ++argument, and invoke the dispatch function. The standardized ++sharpsign reader macros do not enforce any constraints ++on either the presence of or the value of the numerical argument. ++

++
++
#=
++

The #= notation is totally ignored. It does not read ++a following object. It produces no object, ++but is treated as whitespace_2. ++

++
++
##
++

The ## notation always produces nil. ++

++
++ ++

No matter what the value of *read-suppress*, ++parentheses still continue to delimit and construct lists; ++the #( notation continues to delimit vectors; ++and comments, strings, ++and the single-quote and backquote notations continue to be ++interpreted properly. Such situations as ++'), #<, ++#), and #<Space> continue to signal errors. ++

++

Examples::

++ ++
++
 (let ((*read-suppress* t))
++   (mapcar #'read-from-string
++           '("#(foo bar baz)" "#P(:type :lisp)" "#c1.2"
++             "#.(PRINT 'FOO)" "#3AHELLO" "#S(INTEGER)"
++             "#*ABC" "#\GARBAGE" "#RALPHA" "#3R444")))
++⇒  (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
++
++ ++

See Also::

++ ++

read ++, ++Syntax ++

++

Notes::

++ ++

Programmers and implementations that define additional ++macro characters are strongly encouraged to make them respect ++*read-suppress* just as standardized macro characters do. ++That is, when the value of *read-suppress* is true, ++they should ignore type errors when reading a following object ++and the functions that implement dispatching macro characters ++should tolerate nil as their infix parameter value even if a numeric ++value would ordinarily be required. ++

++
++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002areadtable_002a.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++*readtable* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.17 *readtable* [Variable]

++ ++

Value Type::

++ ++

a readtable. ++

++

Initial Value::

++ ++

A readtable that conforms to the description of Common Lisp syntax in Syntax. ++

++

Description::

++ ++

The value of *readtable* is called the current readtable. ++It controls the parsing behavior of the Lisp reader, ++and can also influence the Lisp printer (e.g., see the function readtable-case). ++

++

Examples::

++ ++
++
 (readtablep *readtable*) ⇒  true
++ (setq zvar 123) ⇒  123
++ (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) ⇒  T
++ zvar ⇒  123
++ (setq *readtable* table2) ⇒  #<READTABLE>
++ zvar ⇒  VAR
++ (setq *readtable* (copy-readtable nil)) ⇒  #<READTABLE>
++ zvar ⇒  123
++
++ ++

Affected By::

++ ++

compile-file, ++load ++

++

See Also::

++ ++

compile-file ++, ++load ++, ++readtable ++, ++The Current Readtable ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002aterminal_002dio_002a.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++*terminal-io* (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.54 *terminal-io* [Variable]

++ ++

Value Type::

++ ++

a bidirectional stream. ++

++

Initial Value::

++ ++

implementation-dependent, but ++it must be an open stream ++that is not a generalized synonym stream ++to an I/O customization variables ++but that might be a generalized synonym stream to ++the value of some I/O customization variable. ++

++

Description::

++ ++

The value of *terminal-io*, called terminal I/O, is ordinarily ++a bidirectional stream that connects to the user’s console. ++Typically, writing to this stream ++would cause the output to appear ++on a display screen, for example, and reading from the stream would ++accept input from a keyboard. It is intended ++that standard input functions such as read and read-char, ++when used with this stream, cause echoing of the input ++into the output side of the stream. The means by which this is ++accomplished are implementation-dependent. ++

++

The effect of changing the value of *terminal-io*, ++either by binding or assignment, ++is implementation-defined. ++

++

Examples::

++ ++
++
 (progn (prin1 'foo) (prin1 'bar *terminal-io*))
++ |>  FOOBAR
++⇒  BAR
++ (with-output-to-string (*standard-output*)
++   (prin1 'foo) 
++   (prin1 'bar *terminal-io*))
++ |>  BAR
++⇒  "FOO"
++
++ ++

See Also::

++ ++

*debug-io*, ++*error-output*, ++*query-io*, ++*standard-input*, ++*standard-output*, ++*trace-output* ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002b-_0028Variable_0029.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ +++ (Variable) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.21 +, ++, +++ [Variable]

++ ++

Value Type::

++ ++

an object. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The variables +, ++, and +++ are maintained by the ++Lisp read-eval-print loop to save forms that were ++recently evaluated. ++

++

The value of + is the last form that was evaluated, ++the value of ++ is the previous value of +, and ++the value of +++ is the previous value of ++. ++

++

Examples::

++
++
(+ 0 1) ⇒  1
++(- 4 2) ⇒  2
++(/ 9 3) ⇒  3
++(list + ++ +++) ⇒  ((/ 9 3) (- 4 2) (+ 0 1))
++(setq a 1 b 2 c 3 d (list a b c)) ⇒  (1 2 3)
++(setq a 4 b 5 c 6 d (list a b c)) ⇒  (4 5 6)
++(list a b c) ⇒  (4 5 6)
++(eval +++) ⇒  (1 2 3)
++#.`(,@++ d) ⇒  (1 2 3 (1 2 3))
++
++ ++

Affected By::

++ ++

Lisp read-eval-print loop. ++

++

See Also::

++ ++

- ++ (variable), ++* (variable), ++/ ++ (variable), ++Top level loop ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002b.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ +++ (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.25 + [Function]

++ ++

+ &rest numberssum ++

++

Arguments and Values::

++ ++

number—a number. ++

++

sum—a number. ++

++

Description::

++ ++

Returns the sum of numbers, ++performing any necessary type conversions in the process. ++If no numbers are supplied, 0 is returned. ++

++

Examples::

++
++
 (+) ⇒  0
++ (+ 1) ⇒  1
++ (+ 31/100 69/100) ⇒  1
++ (+ 1/5 0.8) ⇒  1.0
++
++ ++

Exceptional Situations::

++ ++

Might signal type-error if some argument is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

Numeric Operations, ++Rational Computations, ++Floating-point Computations, ++Complex Computations ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002d-_0028Variable_0029.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++- (Variable) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.20 - [Variable]

++ ++

Value Type::

++ ++

a form. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The value of - is the form that is currently being evaluated by ++the Lisp read-eval-print loop. ++

++

Examples::

++ ++
++
(format t "~&Evaluating ~S~
++ |>  Evaluating (FORMAT T "~&Evaluating ~S~
++⇒  NIL
++
++ ++

Affected By::

++ ++

Lisp read-eval-print loop. ++

++

See Also::

++ ++

+ (variable), ++* (variable), ++/ ++ (variable), ++Top level loop ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002d.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++- (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.26 - [Function]

++ ++

- numbernegation ++

++

- minuend &rest subtrahends^+difference ++

++

Arguments and Values::

++ ++

number, minuend, subtrahend—a number. ++

++

negation, difference—a number. ++

++

Description::

++ ++

The function - performs arithmetic subtraction and negation. ++

++

If only one number is supplied, ++the negation of that number is returned. ++

++

If more than one argument is given, ++it subtracts all of the subtrahends from the minuend ++and returns the result. ++

++

The function - performs necessary type conversions. ++

++

Examples::

++ ++
++
 (- 55.55) ⇒  -55.55
++ (- #c(3 -5)) ⇒  #C(-3 5)
++ (- 0) ⇒  0
++ (eql (- 0.0) -0.0) ⇒  true
++ (- #c(100 45) #c(0 45)) ⇒  100
++ (- 10 1 2 3 4) ⇒  0
++
++ ++

Exceptional Situations::

++ ++

Might signal type-error if some argument is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

Numeric Operations, ++Rational Computations, ++Floating-point Computations, ++Complex Computations ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002d_003eUNSPECIFIC-as-a-Component-Value.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++->UNSPECIFIC as a Component Value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.9 :UNSPECIFIC as a Component Value

++ ++

If :unspecific ++ is the value of a pathname component, ++the component is considered to be “absent” ++or to “have no meaning” ++in the filename being represented by the pathname. ++

++

Whether a value of :unspecific is permitted for any component ++on any given file system accessible to the implementation ++is implementation-defined. ++A conforming program must never unconditionally use a ++:unspecific as the value of a pathname component because ++such a value is not guaranteed to be permissible in all implementations. ++However, a conforming program can, if it is careful, ++successfully manipulate user-supplied data ++which contains or refers to non-portable pathname components. ++And certainly a conforming program should be prepared for the ++possibility that any components of a pathname could be :unspecific. ++

++

When reading_1 the value of any pathname component, ++conforming programs should be prepared for the value to be :unspecific. ++

++

When writing_1 the value of any pathname component, ++the consequences are undefined if :unspecific is given ++for a pathname in a file system for which it does not make sense. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002d_003eWILD-as-a-Component-Value.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++->WILD as a Component Value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.2.2.8 :WILD as a Component Value

++ ++

If :wild ++ is the value of a pathname component, ++that component is considered to be a wildcard, which matches anything. ++

++

A conforming program must be prepared to encounter a value of :wild ++as the value of any pathname component, ++or as an element of a list that is the value of the directory component. ++

++

When constructing a pathname, ++a conforming program may use :wild as the value of any or all of ++the directory, name, type, ++or version component, but must not use :wild as the value of the host, ++or device component. ++

++

If :wild is used as the value of the directory component in the construction ++of a pathname, the effect is equivalent to specifying the list ++(:absolute :wild-inferiors), ++or the same as (:absolute :wild) in a file system that does not support ++:wild-inferiors. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002f-_0028Variable_0029.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++/ (Variable) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.23 /, //, /// [Variable]

++ ++

Value Type::

++ ++

a proper list. ++

++

Initial Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The variables /, //, and /// are maintained by ++the Lisp read-eval-print loop to save the values of results that ++were printed at the end of the loop. ++

++

The value of / is a list of the most recent values that were printed, ++the value of // is the previous value of /, and ++the value of /// is the previous value of //. ++

++

The values of /, //, and /// are updated immediately ++prior to printing the return value of a top-level form by the ++Lisp read-eval-print loop. If the evaluation of such a form ++is aborted prior to its normal return, the values of /, //, and /// ++are not updated. ++

++

Examples::

++
++
 (floor 22 7) ⇒  3, 1
++ (+ (* (car /) 7) (cadr /)) ⇒  22
++
++ ++

Affected By::

++ ++

Lisp read-eval-print loop. ++

++

See Also::

++ ++

- ++ (variable), +++ (variable), ++* (variable), ++Top level loop ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_002f.html +@@ -0,0 +1,109 @@ ++ ++ ++ ++ ++ ++/ (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.27 / [Function]

++ ++

/ numberreciprocal ++

++

/ numerator &rest denominators^+quotient ++

++

Arguments and Values::

++ ++

number, denominator—a non-zero number. ++

++

numerator, quotient, reciprocal—a number. ++

++

Description::

++ ++

The function / performs division or reciprocation. ++

++

If no denominators are supplied, ++the function / returns the reciprocal of number. ++

++

If at least one denominator is supplied, ++the function / divides the numerator by all of the denominators ++and returns the resulting quotient. ++

++

If each argument is either an integer or a ratio, ++and the result is not an integer, then it is a ratio. ++

++

The function / performs necessary type conversions. ++

++

If any argument is a float then ++the rules of floating-point contagion apply; ++see Floating-point Computations. ++

++

Examples::

++ ++
++
 (/ 12 4) ⇒  3
++ (/ 13 4) ⇒  13/4
++ (/ -8) ⇒  -1/8
++ (/ 3 4 5) ⇒  3/20
++ (/ 0.5) ⇒  2.0
++ (/ 20 5) ⇒  4
++ (/ 5 20) ⇒  1/4
++ (/ 60 -2 3 5.0) ⇒  -2.0
++ (/ 2 #c(2 2)) ⇒  #C(1/2 -1/2)
++
++ ++

Exceptional Situations::

++ ++

The consequences are unspecified if any argument other than the first is zero. ++If there is only one argument, the consequences are unspecified if it is zero. ++

++

Might signal type-error if some argument is not a number. ++Might signal division-by-zero if division by zero is attempted. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

floor ++, ceiling, truncate, round ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/_003d.html +@@ -0,0 +1,165 @@ ++ ++ ++ ++ ++ ++= (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.15 =, /=, <, >, <=, >= [Function]

++ ++

= &rest numbers^+generalized-boolean ++

++

/= &rest numbers^+generalized-boolean ++

++

< &rest numbers^+generalized-boolean ++

++

> &rest numbers^+generalized-boolean ++

++

<= &rest numbers^+generalized-boolean ++

++

>= &rest numbers^+generalized-boolean ++

++

Arguments and Values::

++ ++

number—for <, >, <=, >=: a real; ++ for =, /=: a number. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

=, /=, <, >, <=, and >= ++perform arithmetic comparisons on their arguments as follows: ++

++
++
=
++

The value of = is true if all numbers are the same in value; ++otherwise it is false. ++Two complexes are considered equal by = ++if their real and imaginary parts are equal according to =. ++

++
++
/=
++

The value of /= is true if no two numbers are the same in value; ++otherwise it is false. ++

++
++
<
++

The value of < is true if the numbers are in monotonically increasing order; ++otherwise it is false. ++

++
++
>
++

The value of > is true if the numbers are in monotonically decreasing order; ++otherwise it is false. ++

++
++
<=
++

The value of <= is true if the numbers are in monotonically ++ nondecreasing order; ++otherwise it is false. ++

++
++
>=
++

The value of >= is true if the numbers are in monotonically ++ nonincreasing order; ++otherwise it is false. ++

++
++ ++

=, /=, <, >, <=, and >= ++perform necessary type conversions. ++

++

Examples::

++ ++

The uses of these functions are illustrated in Figure 12–12. ++

++
++
  (= 3 3) is true.              (/= 3 3) is false.             
++  (= 3 5) is false.             (/= 3 5) is true.              
++  (= 3 3 3 3) is true.          (/= 3 3 3 3) is false.         
++  (= 3 3 5 3) is false.         (/= 3 3 5 3) is false.         
++  (= 3 6 5 2) is false.         (/= 3 6 5 2) is true.          
++  (= 3 2 3) is false.           (/= 3 2 3) is false.           
++  (< 3 5) is true.              (<= 3 5) is true.              
++  (< 3 -5) is false.            (<= 3 -5) is false.            
++  (< 3 3) is false.             (<= 3 3) is true.              
++  (< 0 3 4 6 7) is true.        (<= 0 3 4 6 7) is true.        
++  (< 0 3 4 4 6) is false.       (<= 0 3 4 4 6) is true.        
++  (> 4 3) is true.              (>= 4 3) is true.              
++  (> 4 3 2 1 0) is true.        (>= 4 3 2 1 0) is true.        
++  (> 4 3 3 2 0) is false.       (>= 4 3 3 2 0) is true.        
++  (> 4 3 1 2 0) is false.       (>= 4 3 1 2 0) is false.       
++  (= 3) is true.                (/= 3) is true.                
++  (< 3) is true.                (<= 3) is true.                
++  (= 3.0 #c(3.0 0.0)) is true.  (/= 3.0 #c(3.0 1.0)) is true.  
++  (= 3 3.0) is true.            (= 3.0s0 3.0d0) is true.       
++  (= 0.0 -0.0) is true.         (= 5/2 2.5) is true.           
++  (> 0.0 -0.0) is false.        (= 0 -0.0) is true.            
++  (<= 0 x 9) is true if x is between 0 and 9, inclusive
++  (< 0.0 x 1.0) is true if x is between 0.0 and 1.0, exclusive
++  (< -1 j (length v)) is true if j is a valid array index for a vector v
++
++         Figure 12–12: Uses of /=, =, <, >, <=, and >=        
++
++
++ ++

Exceptional Situations::

++ ++

Might signal type-error if some argument is not a real. ++Might signal arithmetic-error if otherwise unable to fulfill its contract. ++

++

Notes::

++ ++

= differs from eql in that ++(= 0.0 -0.0) is always true, ++because = compares the mathematical values of its operands, ++whereas eql compares the representational values, so to speak. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/abort-_0028Function_0029.html +@@ -0,0 +1,280 @@ ++ ++ ++ ++ ++ ++abort (Function) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conditions Dictionary  

++
++
++

9.2.46 abort, continue, muffle-warning, store-value, use-value [Function]

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

abort &optional condition ++ ⇒ #<NoValue> ++

++

continue &optional conditionnil ++

++

muffle-warning &optional condition ++ ⇒ #<NoValue> ++

++

store-value value &optional conditionnil ++

++

use-value value &optional conditionnil ++

++

Arguments and Values::

++ ++

value—an object. ++

++

condition—a condition object, or nil. ++

++

Description::

++ ++

Transfers control to the most recently established applicable restart ++having the same name as the function. That is, ++ the function abort searches for an applicable abort restart, ++ the function continue searches for an applicable continue restart, ++and so on. ++

++

If no such restart exists, ++the functions ++ continue, ++ store-value, ++ and use-value ++return nil, and ++the functions ++ abort ++ and muffle-warning ++signal an error of type control-error. ++

++

When condition is non-nil, ++only those restarts are considered that are ++ either explicitly associated with that condition, ++ or not associated with any condition; ++that is, the excluded restarts are ++those that are associated with a non-empty set of conditions ++of which the given condition is not an element. ++If condition is nil, all restarts are considered. ++

++

Examples::

++ ++
++
;;; Example of the ABORT retart
++
++ (defmacro abort-on-error (&body forms)
++   `(handler-bind ((error #'abort))
++      ,@forms)) ⇒  ABORT-ON-ERROR
++ (abort-on-error (+ 3 5)) ⇒  8
++ (abort-on-error (error "You lose."))
++ |>  Returned to Lisp Top Level.
++
++;;; Example of the CONTINUE restart
++
++ (defun real-sqrt (n)
++   (when (minusp n)
++     (setq n (- n))
++     (cerror "Return sqrt(~D) instead." "Tried to take sqrt(-~D)." n))
++   (sqrt n))
++
++ (real-sqrt 4) ⇒  2
++ (real-sqrt -9)
++ |>  Error: Tried to take sqrt(-9).
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Return sqrt(9) instead.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>(continue)<<|
++ |>  Return sqrt(9) instead.
++⇒  3
++
++ (handler-bind ((error #'(lambda (c) (continue))))
++   (real-sqrt -9)) ⇒  3
++
++;;; Example of the MUFFLE-WARNING restart
++
++ (defun count-down (x)
++   (do ((counter x (1- counter)))
++       ((= counter 0) 'done)
++     (when (= counter 1)
++       (warn "Almost done"))
++     (format t "~&~D~
++⇒  COUNT-DOWN
++ (count-down 3)
++ |>  3
++ |>  2
++ |>  Warning: Almost done
++ |>  1
++⇒  DONE
++ (defun ignore-warnings-while-counting (x)
++   (handler-bind ((warning #'ignore-warning))
++     (count-down x)))
++⇒  IGNORE-WARNINGS-WHILE-COUNTING
++ (defun ignore-warning (condition)
++   (declare (ignore condition))
++   (muffle-warning))
++⇒  IGNORE-WARNING
++ (ignore-warnings-while-counting 3)
++ |>  3
++ |>  2
++ |>  1
++⇒  DONE
++
++;;; Example of the STORE-VALUE and USE-VALUE restarts
++
++ (defun careful-symbol-value (symbol)
++   (check-type symbol symbol)
++   (restart-case (if (boundp symbol)
++                     (return-from careful-symbol-value 
++                                  (symbol-value symbol))
++                     (error 'unbound-variable
++                            :name symbol))
++     (use-value (value)
++       :report "Specify a value to use this time."
++       value)
++     (store-value (value)
++       :report "Specify a value to store and use in the future."
++       (setf (symbol-value symbol) value))))
++ (setq a 1234) ⇒  1234
++ (careful-symbol-value 'a) ⇒  1234
++ (makunbound 'a) ⇒  A
++ (careful-symbol-value 'a)
++ |>  Error: A is not bound.
++ |>  To continue, type :CONTINUE followed by an option number.
++ |>   1: Specify a value to use this time.
++ |>   2: Specify a value to store and use in the future.
++ |>   3: Return to Lisp Toplevel.
++ |>  Debug> |>>(use-value 12)<<|
++⇒  12
++ (careful-symbol-value 'a)
++ |>  Error: A is not bound.
++ |>  To continue, type :CONTINUE followed by an option number.
++ |>    1: Specify a value to use this time.
++ |>    2: Specify a value to store and use in the future.
++ |>    3: Return to Lisp Toplevel.
++ |>  Debug> |>>(store-value 24)<<|
++⇒  24
++ (careful-symbol-value 'a)
++⇒  24
++
++;;; Example of the USE-VALUE restart
++
++ (defun add-symbols-with-default (default &rest symbols)
++   (handler-bind ((sys:unbound-symbol
++                    #'(lambda (c)
++                        (declare (ignore c)) 
++                        (use-value default))))
++     (apply #'+ (mapcar #'careful-symbol-value symbols))))
++⇒  ADD-SYMBOLS-WITH-DEFAULT
++ (setq x 1 y 2) ⇒  2
++ (add-symbols-with-default 3 'x 'y 'z) ⇒  6
++
++
++ ++

Side Effects::

++ ++

A transfer of control may occur if an appropriate restart is available, ++or (in the case of the function abort or the function muffle-warning) ++execution may be stopped. ++

++

Affected By::

++ ++

Each of these functions can be affected by ++the presence of a restart having the same name. ++

++

Exceptional Situations::

++ ++

If an appropriate abort restart ++ is not available for the function abort, ++or an appropriate muffle-warning restart ++ is not available for the function muffle-warning, ++an error of type control-error is signaled. ++

++

See Also::

++ ++

invoke-restart ++, ++Restarts, ++Interfaces to Restarts, ++assert ++, ++ccase, ++cerror ++, ++check-type ++, ++ctypecase, ++use-value ++, ++warn ++

++

Notes::

++ ++
++
 (abort condition) ≡ (invoke-restart 'abort)
++ (muffle-warning)  ≡ (invoke-restart 'muffle-warning)
++ (continue)        ≡ (let ((r (find-restart 'continue))) (if r (invoke-restart r)))
++ (use-value x) ≡ (let ((r (find-restart 'use-value))) (if r (invoke-restart r x)))
++ (store-value x) ≡ (let ((r (find-restart 'store-value))) (if r (invoke-restart r x)))
++
++ ++

No functions defined in this specification are required to provide ++a use-value restart. ++

++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/abort-_0028Restart_0029.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++abort (Restart) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.41 abort [Restart]

++ ++

Data Arguments Required::

++ ++

None. ++

++

Description::

++ ++

The intent of the abort restart is to allow return to the ++innermost “command level.” Implementors are encouraged to make ++sure that there is always a restart named abort ++around any user code so that user code can call abort ++at any time and expect something reasonable to happen; ++exactly what the reasonable thing is may vary somewhat. Typically, ++in an interactive listener, the invocation of abort ++returns to the Lisp reader phase of the Lisp read-eval-print loop, ++though in some batch or multi-processing ++situations there may be situations in which having it kill the running ++process is more appropriate. ++

++

See Also::

++ ++

Restarts, ++Interfaces to Restarts, ++invoke-restart ++, ++abort (Function) ++ (function) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/abs.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++abs (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.29 abs [Function]

++ ++

abs numberabsolute-value ++

++

Arguments and Values::

++ ++

number—a number. ++

++

absolute-value—a non-negative real. ++

++

Description::

++ ++

abs returns the absolute value of number. ++

++

If number is ++

++

a real, ++

++

the result is of the same type as number. ++

++

If number is a complex, ++the result is a positive ++

++

real ++

++

with ++the same magnitude as number. ++The result can be a float ++

++

[Reviewer Note by Barmar: Single-float.] ++even if number’s components are rationals ++and an exact rational result ++would have been possible. ++Thus the result of (abs #c(3 4)) can be either 5 or 5.0, ++depending on the implementation. ++

++

Examples::

++ ++
++
 (abs 0) ⇒  0
++ (abs 12/13) ⇒  12/13
++ (abs -1.09) ⇒  1.09
++ (abs #c(5.0 -5.0)) ⇒  7.071068
++ (abs #c(5 5)) ⇒  7.071068
++ (abs #c(3/5 4/5)) ⇒  1 or approximately 1.0
++ (eql (abs -0.0) -0.0) ⇒  true
++
++ ++

See Also::

++ ++

Rule of Float Substitutability ++

++

Notes::

++ ++

If number is a complex, ++the result is equivalent to the following: ++

++

(sqrt (+ (expt (realpart number) 2) (expt (imagpart number) 2))) ++

++

An implementation should not use this formula directly ++for all complexes ++but should handle very large or very small components specially ++to avoid intermediate overflow or underflow. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/acons.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++acons (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.35 acons [Function]

++ ++

acons key datum alistnew-alist ++

++

Arguments and Values::

++ ++

key—an object. ++

++

datum—an object. ++

++

alist—an association list. ++

++

new-alist—an association list. ++

++

Description::

++ ++

Creates a fresh cons, ++the cdr of which is alist and ++the car of which is another fresh cons, ++ the car of which is key and ++ the cdr of which is datum. ++

++

Examples::

++ ++
++
 (setq alist '()) ⇒  NIL
++ (acons 1 "one" alist) ⇒  ((1 . "one"))
++ alist ⇒  NIL
++ (setq alist (acons 1 "one" (acons 2 "two" alist))) ⇒  ((1 . "one") (2 . "two"))
++ (assoc 1 alist) ⇒  (1 . "one")
++ (setq alist (acons 1 "uno" alist)) ⇒  ((1 . "uno") (1 . "one") (2 . "two"))
++ (assoc 1 alist) ⇒  (1 . "uno")
++
++ ++

See Also::

++ ++

assoc ++, ++pairlis ++

++

Notes::

++ ++
++
(acons key datum alist) ≡ (cons (cons key datum) alist)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/add_002dmethod.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++add-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.35 add-method [Standard Generic Function]

++ ++

Syntax::

++ ++

add-method generic-function methodgeneric-function ++

++

Method Signatures::

++ ++

add-method (generic-function standard-generic-function) ++ (method method) ++

++

Arguments and Values::

++ ++

generic-function—a generic function object. ++

++

method—a method object. ++

++

Description::

++ ++

The generic function add-method adds a method ++to a generic function. ++

++

If method agrees with an existing method of generic-function ++on parameter specializers and qualifiers, ++the existing method is replaced. ++

++

Exceptional Situations::

++ ++

The lambda list of the method function of method must be ++congruent with the lambda list of generic-function, ++or an error of type error is signaled. ++

++

If method is a method object of ++another generic function, an error of type error is signaled. ++

++

See Also::

++ ++

defmethod ++, ++defgeneric ++, ++find-method ++, ++remove-method ++, ++Agreement on Parameter Specializers and Qualifiers ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/adjoin.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++adjoin (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.44 adjoin [Function]

++ ++

adjoin item list &key key test test-notnew-list ++

++

Arguments and Values::

++ ++

item—an object. ++

++

list—a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

new-list—a list. ++

++

Description::

++ ++

Tests whether item is the same as an existing element of list. ++If the item is not an existing element, ++adjoin adds it to list (as if by cons) ++and returns the resulting list; ++otherwise, nothing is added and the original list is returned. ++

++

The test, test-not, and key ++affect how it is determined whether item is the same as an element of list. ++For details, see Satisfying a Two-Argument Test.\ifvmode\else\endgraf ++\ifdim \prevdepth>-1000pt ++\NIS\parskip \normalparskip\relax\fi ++

++

Examples::

++ ++
++
 (setq slist '()) ⇒  NIL 
++ (adjoin 'a slist) ⇒  (A) 
++ slist ⇒  NIL 
++ (setq slist (adjoin '(test-item 1) slist)) ⇒  ((TEST-ITEM 1)) 
++ (adjoin '(test-item 1) slist) ⇒  ((TEST-ITEM 1) (TEST-ITEM 1)) 
++ (adjoin '(test-item 1) slist :test 'equal) ⇒  ((TEST-ITEM 1)) 
++ (adjoin '(new-test-item 1) slist :key #'cadr) ⇒  ((TEST-ITEM 1)) 
++ (adjoin '(new-test-item 1) slist) ⇒  ((NEW-TEST-ITEM 1) (TEST-ITEM 1)) 
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list is not a proper list. ++

++

See Also::

++ ++

pushnew ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++
++
 (adjoin item list :key fn)
++   ≡ (if (member (fn item) list :key fn) list (cons item list))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/adjust_002darray.html +@@ -0,0 +1,312 @@ ++ ++ ++ ++ ++ ++adjust-array (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.8 adjust-array [Function]

++ ++

adjust-array array new-dimensions &key element-type ++ initial-element ++ initial-contents ++ fill-pointer ++ displaced-to ++ displaced-index-offset
++ ⇒ adjusted-array ++

++

Arguments and Values::

++ ++

array—an array. ++

++

new-dimensions—a valid array dimension ++ or a list of valid array dimensions. ++

++

element-type—a type specifier. ++

++

initial-element—an object. ++ Initial-element must not be supplied if either ++ initial-contents or displaced-to is supplied. ++

++

initial-contents—an object. ++ If array has rank greater than zero, then initial-contents ++ is composed of nested sequences, the depth of which must equal ++ the rank of array. Otherwise, array is zero-dimensional and ++ initial-contents supplies the single element. ++ initial-contents must not be supplied if either ++ initial-element or displaced-to is given. ++

++

fill-pointer—a valid fill pointer for the ++ array to be created, or t, or nil. ++ The default is nil. ++

++

displaced-to—an array or nil. ++ initial-elements and initial-contents must not be supplied ++ if displaced-to is supplied. ++

++

displaced-index-offset—an object of type (fixnum 0 n) ++ where n is (array-total-size displaced-to). ++ displaced-index-offset may be supplied only if displaced-to is supplied. ++

++

adjusted-array—an array. ++

++

Description::

++ ++

adjust-array changes the dimensions or elements of array. ++The result is an array of the same type and rank as array, ++that is either the modified array, ++or a newly created array to which ++array can be displaced, and that has ++the given new-dimensions. ++

++

New-dimensions specify the size of each dimension of array. ++

++

Element-type specifies the type of the elements ++of the resulting array. If element-type is supplied, ++the consequences are unspecified if ++the upgraded array element type of element-type ++is not the same as the actual array element type of array. ++

++

If initial-contents is supplied, it is treated as for ++make-array. In this case none of the original contents of ++array appears in the resulting array. ++

++

If fill-pointer is an integer, ++it becomes the fill pointer for the resulting array. ++If fill-pointer is the symbol t, ++it indicates that the size of the resulting array ++should be used as the fill pointer. ++If fill-pointer is nil, ++it indicates that the fill pointer should be left as it is. ++

++

If displaced-to ++non-nil, a displaced array ++is created. The resulting array shares its contents with the array given by ++displaced-to. ++The resulting array cannot contain more elements than the array ++it is displaced to. ++If displaced-to is not supplied or nil, ++the resulting array is not a displaced array. ++If array A is created displaced to array B and subsequently ++array B is given to adjust-array, array A will still be ++displaced to array B. ++Although array might be a displaced array, ++the resulting array is not a displaced array unless ++displaced-to is supplied and not nil. ++

++

The interaction between adjust-array and ++displaced arrays ++is as follows given three arrays, A, B, and~C: ++

++
++
A is not displaced before or after the call
++
++
 (adjust-array A ...)
++
++ ++

The dimensions of A are altered, and the ++contents rearranged as appropriate. ++Additional elements of A are taken from ++initial-element. ++The use of initial-contents causes all old contents to be ++discarded. ++

++
++
A is not displaced before, but is displaced to
++

C after the call ++

++
 (adjust-array A ... :displaced-to C)
++
++ ++

None of the original contents of A appears in ++A afterwards; A now contains ++the contents of C, without any rearrangement of C. ++

++
++
A is displaced to B
++

before the call, and is displaced to C after ++the call ++

++
 (adjust-array A ... :displaced-to B)
++ (adjust-array A ... :displaced-to C)
++
++ ++

B and C might be the same. The contents of B do not appear in ++A afterward unless such contents also happen to be in C If ++displaced-index-offset ++is not supplied in the adjust-array call, it defaults ++to zero; the old offset into B is not retained. ++

++
++
A is displaced to B before the call, but not displaced
++

afterward. ++

++
 (adjust-array A ... :displaced-to B)
++ (adjust-array A ... :displaced-to nil)
++
++ ++

A gets a ++new “data region,” and contents of B are copied into it as appropriate to ++maintain the existing old contents; additional elements of A ++are taken from ++initial-element if supplied. However, ++the use of initial-contents causes all old contents ++to be discarded. ++

++
++ ++

If displaced-index-offset is supplied, ++it specifies the offset ++of the resulting array from the beginning of ++the array that it is displaced to. ++If displaced-index-offset is not supplied, the offset is~0. ++The size of the resulting array plus the ++offset value cannot exceed the size of ++the array that it is displaced to. ++

++

If only new-dimensions ++and an initial-element argument are supplied, ++those elements of array that ++are still in bounds appear in the resulting array. The elements of ++the resulting array that are not in the bounds of ++array are initialized ++to initial-element; if initial-element is not provided, ++

++

the consequences of later reading any such new element of new-array ++before it has been initialized ++are undefined. ++

++

If initial-contents or displaced-to is supplied, ++then none of the original contents of array appears in the new array. ++

++

The consequences are unspecified if array is adjusted ++to a size smaller than its fill pointer without supplying ++the fill-pointer argument so that its fill-pointer ++is properly adjusted in the process. ++

++

If A is displaced to B, the consequences are unspecified ++if B is adjusted in such a way that it no longer has enough elements ++to satisfy A. ++

++

If adjust-array is applied to an array that is actually adjustable, ++the array returned is identical to array. ++If the array returned by adjust-array ++is distinct from array, then the argument array is unchanged. ++

++

Note that if an array A is displaced to another array B, ++and B is displaced to another array C, and B is altered by ++adjust-array, A must now refer to the adjust contents of B. ++This means that an implementation cannot collapse the chain to make A ++refer to C directly and forget that the chain of reference passes through ++B. However, caching techniques are permitted as long as they preserve the ++semantics specified here. ++

++

Examples::

++ ++
++
 (adjustable-array-p
++  (setq ada (adjust-array
++              (make-array '(2 3)
++                          :adjustable t
++                          :initial-contents '((a b c) (1 2 3)))
++              '(4 6)))) ⇒  T 
++ (array-dimensions ada) ⇒  (4 6) 
++ (aref ada 1 1) ⇒  2 
++ (setq beta (make-array '(2 3) :adjustable t))
++⇒  #2A((NIL NIL NIL) (NIL NIL NIL)) 
++ (adjust-array beta '(4 6) :displaced-to ada)
++⇒  #2A((A B C NIL NIL NIL)
++       (1 2 3 NIL NIL NIL)
++       (NIL NIL NIL NIL NIL NIL) 
++       (NIL NIL NIL NIL NIL NIL))
++ (array-dimensions beta) ⇒  (4 6)
++ (aref beta 1 1) ⇒  2 
++
++ ++

Suppose that the 4-by-4 array in m looks like this: ++

++
++
#2A(( alpha     beta      gamma     delta )
++    ( epsilon   zeta      eta       theta )
++    ( iota      kappa     lambda    mu    )
++    ( nu        xi        omicron   pi    ))
++
++ ++

Then the result of ++

++
++
 (adjust-array m '(3 5) :initial-element 'baz)
++
++ ++

is a 3-by-5 array with contents ++

++
++
#2A(( alpha     beta      gamma     delta     baz )
++    ( epsilon   zeta      eta       theta     baz )
++    ( iota      kappa     lambda    mu        baz ))
++
++ ++

Exceptional Situations::

++ ++

An error of type error is signaled if fill-pointer is supplied ++and non-nil but array has no fill pointer. ++

++

See Also::

++ ++

adjustable-array-p ++, ++make-array ++, ++array-dimension-limit ++, ++array-total-size-limit ++, ++array ++

++
++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/adjustable_002darray_002dp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++adjustable-array-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.9 adjustable-array-p [Function]

++ ++

adjustable-array-p arraygeneralized-boolean ++

++

Arguments and Values::

++ ++

array—an array. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if and only if adjust-array could return a value ++which is identical to array when given that array as its ++first argument. ++

++

Examples::

++ ++
++
 (adjustable-array-p 
++   (make-array 5
++               :element-type 'character 
++               :adjustable t 
++               :fill-pointer 3)) ⇒  true
++ (adjustable-array-p (make-array 4)) ⇒  implementation-dependent
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its argument is not an array. ++

++

See Also::

++ ++

adjust-array ++, ++make-array ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/allocate_002dinstance.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++allocate-instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.3 allocate-instance [Standard Generic Function]

++ ++

Syntax::

++ ++

allocate-instance class &rest initargs &key &allow-other-keysnew-instance ++

++

Method Signatures::

++ ++

allocate-instance (class standard-class) &rest initargs ++

++

allocate-instance (class structure-class) &rest initargs ++

++

Arguments and Values::

++ ++

class—a class. ++

++

initargs—a list of keyword/value pairs ++ (initialization argument names and values). ++

++

new-instance—an object whose class is class. ++

++

Description::

++ ++

The generic function allocate-instance creates and returns ++a new instance of the class, without initializing it. ++When the class is a standard class, this means that ++the slots are unbound; when the class is a ++structure class, this means the slotsvalues ++are unspecified. ++

++

The caller of allocate-instance is expected to have ++already checked the initialization arguments. ++

++

The generic function allocate-instance is called by ++make-instance, as described in ++Object Creation and Initialization. ++

++

See Also::

++ ++

defclass ++, ++make-instance ++, ++class-of ++, ++Object Creation and Initialization ++

++

Notes::

++ ++

The consequences of adding methods to allocate-instance is unspecified. ++This capability might be added by the Metaobject Protocol. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/alpha_002dchar_002dp.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++alpha-char-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.8 alpha-char-p [Function]

++ ++

alpha-char-p charactergeneralized-boolean ++

++

Arguments and Values::

++ ++

character—a character. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if character is an alphabetic_1 character; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (alpha-char-p #\a) ⇒  true
++ (alpha-char-p #\5) ⇒  false
++ (alpha-char-p #\Newline) ⇒  false
++ ;; This next example presupposes an implementation
++ ;; in which #\\alpha is a defined character.
++ (alpha-char-p #\\alpha) ⇒  implementation-dependent
++
++ ++

Affected By::

++ ++

None. ++(In particular, the results of this predicate are independent ++of any special syntax which might have been enabled in the current readtable.) ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

alphanumericp ++, ++Documentation of Implementation-Defined Scripts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/alphanumericp.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++alphanumericp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.9 alphanumericp [Function]

++ ++

alphanumericp charactergeneralized-boolean ++

++

Arguments and Values::

++ ++

character—a character. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if character is an alphabetic_1 character ++ or a numeric character; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (alphanumericp #\Z) ⇒  true
++ (alphanumericp #\9) ⇒  true
++ (alphanumericp #\Newline) ⇒  false
++ (alphanumericp #\#) ⇒  false
++
++ ++

Affected By::

++ ++

None. ++(In particular, the results of this predicate are independent ++of any special syntax which might have been enabled in the current readtable.) ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

alpha-char-p ++, ++graphic-char-p ++, ++digit-char-p ++

++

Notes::

++ ++

Alphanumeric characters are graphic ++as defined by graphic-char-p. ++The alphanumeric characters are a subset of the graphic characters. ++The standard characters A through Z, ++ a through z, ++ and 0 through 9 are alphanumeric characters. ++

++
++
 (alphanumericp x)
++   ≡ (or (alpha-char-p x) (not (null (digit-char-p x))))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/and-_0028Type-Specifier_0029.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++and (Type Specifier) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.20 and [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Combining. ++

++

Compound Type Specifier Syntax::

++ ++

(and{{typespec}*}) ++

++

Compound Type Specifier Arguments::

++ ++

typespec—a type specifier. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of all objects of the type ++determined by the intersection of the typespecs. ++

++

* is not permitted as an argument. ++

++

The type specifiers (and) and t are equivalent. ++The symbol and is not valid as a type specifier, ++and, specifically, it is not an abbreviation for (and). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/and.html +@@ -0,0 +1,122 @@ ++ ++ ++ ++ ++ ++and (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.41 and [Macro]

++ ++

and {form}*{result}* ++

++

Arguments and Values::

++ ++

form—a form. ++

++

results—the values resulting from the evaluation of ++ the last form, or the symbols nil or t. ++

++

Description::

++ ++

The macro and evaluates each form one at a time from left to right. ++As soon as any form evaluates to nil, and returns ++nil without evaluating the remaining forms. If all forms ++but the last evaluate to true values, and returns the results ++produced by evaluating the last form. ++

++

If no forms are supplied, (and) returns t. ++

++

and passes back multiple values from the last subform ++but not from subforms other than the last. ++

++

Examples::

++ ++
++
 (if (and (>= n 0)
++          (< n (length a-simple-vector))
++          (eq (elt a-simple-vector n) 'foo))
++     (princ "Foo!"))
++
++ ++

The above expression prints Foo! if element n of a-simple-vector ++is the symbol foo, provided also that n is indeed a valid index ++for a-simple-vector. Because and guarantees ++left-to-right testing ++of its parts, elt is not called if n is out of range. ++

++
++
 (setq temp1 1 temp2 1 temp3 1) ⇒  1 
++ (and (incf temp1) (incf temp2) (incf temp3)) ⇒  2 
++ (and (eql 2 temp1) (eql 2 temp2) (eql 2 temp3)) ⇒  true
++ (decf temp3) ⇒  1 
++ (and (decf temp1) (decf temp2) (eq temp3 'nil) (decf temp3)) ⇒  NIL 
++ (and (eql temp1 temp2) (eql temp2 temp3)) ⇒  true
++ (and) ⇒  T 
++
++ ++

See Also::

++ ++

cond ++, ++every ++, ++if ++, ++or ++, ++when ++

++

Notes::

++ ++
++
 (and form) ≡ (let () form)
++ (and form1 form2 ...) ≡ (when form1 (and form2 ...))
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/append.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++append (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.26 append [Function]

++ ++

append &rest listsresult ++

++

Arguments and Values::

++ ++

list—each must be a proper list except the last, ++ which may be any object. ++

++

result—an object. This will be a list ++ unless the last list was not a list ++ and all preceding lists were null. ++

++

Description::

++ ++

append returns a new list that is the concatenation of ++the copies. lists are left unchanged; the list structure ++of each of lists except the last is copied. ++The last argument is not copied; it becomes the cdr of the ++final dotted pair of the concatenation of the preceding lists, ++or is returned directly if there are no preceding ++non-empty ++lists. ++

++

Examples::

++ ++
++
 (append '(a b c) '(d e f) '() '(g)) ⇒  (A B C D E F G)
++ (append '(a b c) 'd) ⇒  (A B C . D)
++ (setq lst '(a b c)) ⇒  (A B C)
++ (append lst '(d)) ⇒  (A B C D)
++ lst ⇒  (A B C)
++ (append) ⇒  NIL
++ (append 'a) ⇒  A
++
++ ++

See Also::

++ ++

nconc ++, ++concatenate ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/apply.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++apply (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.1 apply [Function]

++ ++

apply function &rest args^+{result}* ++

++

Arguments and Values::

++ ++

function—a function designator. ++

++

args—a spreadable argument list designator. ++

++

results—the values returned by function. ++

++

Description::

++ ++

Applies the function to the args. ++

++

When the function receives its arguments via &rest, it is ++permissible (but not required) for the implementation to bind ++the rest parameter ++to an object that shares structure with the last argument to apply. ++Because a function can neither detect whether it was called via apply ++nor whether (if so) the last argument to apply was a constant, ++conforming programs must neither rely on the list structure ++of a rest list to be freshly consed, nor modify that list structure. ++

++

setf can be used with apply in certain circumstances; ++see APPLY Forms as Places. ++

++

Examples::

++ ++
++
 (setq f '+) ⇒  +
++ (apply f '(1 2)) ⇒  3
++ (setq f #'-) ⇒  #<FUNCTION ->
++ (apply f '(1 2)) ⇒  -1
++ (apply #'max 3 5 '(2 7 3)) ⇒  7
++ (apply 'cons '((+ 2 3) 4)) ⇒  ((+ 2 3) . 4)
++ (apply #'+ '()) ⇒  0
++
++ (defparameter *some-list* '(a b c))
++ (defun strange-test (&rest x) (eq x *some-list*))
++ (apply #'strange-test *some-list*) ⇒  implementation-dependent
++
++ (defun bad-boy (&rest x) (rplacd x 'y))
++ (bad-boy 'a 'b 'c) has undefined consequences.
++ (apply #'bad-boy *some-list*) has undefined consequences.
++
++ ++
++
 (defun foo (size &rest keys &key double &allow-other-keys)
++   (let ((v (apply #'make-array size :allow-other-keys t keys)))
++     (if double (concatenate (type-of v) v v) v)))
++ (foo 4 :initial-contents '(a b c d) :double t)
++    ⇒  #(A B C D A B C D)
++
++ ++

See Also::

++ ++

funcall ++, ++fdefinition ++, ++function, ++Evaluation, ++APPLY Forms as Places ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/apropos.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++apropos (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.5 apropos, apropos-list [Function]

++ ++

apropos string &optional package<no values> ++

++

apropos-list string &optional packagesymbols ++

++

Arguments and Values::

++ ++

string—a string designator. ++

++

package—a package designator or nil. ++ The default is nil. ++

++

symbols—a list of symbols. ++

++

Description::

++ ++

These functions search for interned symbols ++whose names contain the substring string. ++

++

For apropos, as each such symbol is found, ++its name is printed on standard output. ++In addition, ++if such a symbol is defined as a function or dynamic variable, ++information about those definitions might also be printed. ++

++

For apropos-list, ++no output occurs as the search proceeds; ++instead a list of the matching symbols is returned when the search is complete. ++

++

If package is non-nil, ++only the symbols accessible in that package are searched; ++otherwise all symbols accessible in any package are searched. ++

++

Because a symbol might be available ++by way of more than one inheritance path, ++apropos might print information about the same symbol more than once, ++or apropos-list might return a list containing duplicate symbols. ++

++

Whether or not the search is case-sensitive is implementation-defined. ++

++

Affected By::

++ ++

The set of symbols which are currently interned ++in any packages being searched. ++

++

apropos is also affected by *standard-output*. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/aref.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++aref (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.10 aref [Accessor]

++ ++

aref array &rest subscriptselement ++

++

(setf ( aref array &rest subscripts) new-element)
++

++

Arguments and Values::

++ ++

array—an array. ++

++

subscripts—a list of valid array indices for the array. ++

++

element, new-element—an object. ++

++

Description::

++ ++

Accesses the array element specified by the subscripts. ++If no subscripts are supplied and array is zero rank, ++aref accesses the sole element of array. ++

++

aref ignores fill pointers. ++It is permissible to use aref ++to access any array element, ++whether active or not. ++

++

Examples::

++ ++

If the variable foo names a 3-by-5 array, ++then the first index could be 0, 1, or 2, and then second index ++could be 0, 1, 2, 3, or 4. The array elements can be referred to by using ++the function aref; for example, (aref foo 2 1) ++refers to element (2, 1) of the array. ++

++
++
 (aref (setq alpha (make-array 4)) 3) ⇒  implementation-dependent
++ (setf (aref alpha 3) 'sirens) ⇒  SIRENS
++ (aref alpha 3) ⇒  SIRENS
++ (aref (setq beta (make-array '(2 4) 
++                    :element-type '(unsigned-byte 2)
++                    :initial-contents '((0 1 2 3) (3 2 1 0))))
++        1 2) ⇒  1
++ (setq gamma '(0 2))
++ (apply #'aref beta gamma) ⇒  2
++ (setf (apply #'aref beta gamma) 3) ⇒  3
++ (apply #'aref beta gamma) ⇒  3
++ (aref beta 0 2) ⇒  3
++
++ ++

See Also::

++ ++

bit (Array) ++, ++char ++, ++elt ++, ++row-major-aref ++, ++svref ++, ++

++

Compiler Terminology ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/arithmetic_002derror.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++arithmetic-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.78 arithmetic-error [Condition Type]

++ ++

Class Precedence List::

++

arithmetic-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type arithmetic-error consists of error conditions ++that occur during arithmetic operations. ++The operation and operands are initialized with ++the initialization arguments named :operation and :operands to make-condition, ++and are accessed by ++the functions arithmetic-error-operation and ++arithmetic-error-operands. ++

++

See Also::

++ ++

arithmetic-error-operation, ++arithmetic-error-operands ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/arithmetic_002derror_002doperands.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++arithmetic-error-operands (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.79 arithmetic-error-operands, arithmetic-error-operation [Function]

++ ++

arithmetic-error-operands conditionoperands ++

++

arithmetic-error-operation conditionoperation ++

++

Arguments and Values::

++ ++

condition—a condition of type arithmetic-error. ++

++

operands—a list. ++

++

operation—a function designator. ++

++

Description::

++ ++

arithmetic-error-operands returns a list of the operands ++which were used in the offending call to the operation that signaled ++the condition. ++

++

arithmetic-error-operation returns a list of ++the offending operation in the offending call that signaled the condition. ++

++

See Also::

++ ++

arithmetic-error, ++Conditions ++

++

Notes::

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array.html +@@ -0,0 +1,157 @@ ++ ++ ++ ++ ++ ++array (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.1 array [System Class]

++ ++

Class Precedence List::

++

array, ++t ++

++

Description::

++ ++

An array contains objects arranged according to a ++Cartesian coordinate system. ++An array provides mappings from a set of ++

++

fixnums ++

++

\left{i_0,i_1,\dots,i_{r-1}\right} to corresponding elements ++of the array, ++where 0 \le i_j < d_j, ++r is the rank of the array, and d_j is the size of dimension j of ++the array. ++

++

When an array is created, the program requesting its creation may ++declare that all elements are of a particular type, ++called the expressed array element type. ++The implementation is permitted to upgrade this type in order to ++produce the actual array element type, ++which is the element type for the array is actually specialized. ++See the function upgraded-array-element-type. ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(array{[{element-type | *} [dimension-spec]]}) ++

++

dimension-spec ::=rank | * | ({dimension | *}*) ++

++

Compound Type Specifier Arguments::

++ ++

dimension—a valid array dimension. ++

++

element-type—a type specifier. ++

++

rank—a non-negative fixnum. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of arrays whose ++ element type, rank, and dimensions ++match any given ++ element-type, rank, and dimensions. ++Specifically: ++

++

If element-type is the symbol *, ++arrays are not excluded on the basis of their element type. ++Otherwise, only those arrays are included whose actual array element type ++

++

is the result of upgrading element-type; ++see Array Upgrading. ++

++

If the dimension-spec is a rank, ++the set includes only those arrays having that rank. ++If the dimension-spec is a list of dimensions, ++the set includes only those arrays having a rank ++given by the length of the dimensions, ++and having the indicated dimensions; ++in this case, * matches any value for the corresponding dimension. ++If the dimension-spec is the symbol *, ++the set is not restricted on the basis of rank or dimension. ++

++

See Also::

++ ++

*print-array*, ++aref ++, ++make-array ++, ++vector, ++Sharpsign A, ++Printing Other Arrays ++

++

Notes::

++ ++

Note that the type (array t) ++is a proper subtype of the type (array *). ++The reason is that the type (array t) is the set of arrays ++that can ++hold any object (the elements are of type t, which includes ++all objects). ++On the other hand, the type (array *) ++is the set of all arrays whatsoever, including for example ++arrays that can hold only characters. ++The type (array character) ++is not a subtype of the type (array t); ++the two sets ++are disjoint because the type (array character) is not the ++set of all arrays that can hold ++characters, but rather the set of ++arrays ++that are specialized to hold precisely characters and no ++other objects. ++

++
++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002ddimension.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++array-dimension (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.11 array-dimension [Function]

++ ++

array-dimension array axis-numberdimension ++

++

Arguments and Values::

++ ++

array—an array. ++

++

axis-number—an integer greater than or equal to zero ++ and less than the rank of the array. ++

++

dimension—a non-negative integer. ++

++

Description::

++ ++

array-dimension returns the axis-number ++dimension_1 of array. ++(Any fill pointer is ignored.) ++

++

Examples::

++ ++
++
 (array-dimension (make-array 4) 0) ⇒  4
++ (array-dimension (make-array '(2 3)) 1) ⇒  3
++
++ ++

Affected By::

++

None. ++

++

See Also::

++ ++

array-dimensions ++, ++length ++

++

Notes::

++
++
 (array-dimension array n) ≡ (nth n (array-dimensions array))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002ddimension_002dlimit.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++array-dimension-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.2.24 array-dimension-limit [Constant Variable]

++ ++

Constant Value::

++ ++

A positive ++

++

fixnum, ++

++

the exact magnitude of which is implementation-dependent, ++but which is not less than 1024. ++

++

Description::

++ ++

The upper exclusive bound on each individual dimension of an array. ++

++

See Also::

++ ++

make-array ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002ddimensions.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++array-dimensions (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.12 array-dimensions [Function]

++ ++

array-dimensions arraydimensions ++

++

Arguments and Values::

++ ++

array—an array. ++

++

dimensions—a list of integers. ++

++

Description::

++ ++

Returns a list of the dimensions of array. ++(If array is a vector with a fill pointer, ++ that fill pointer is ignored.) ++

++

Examples::

++ ++
++
 (array-dimensions (make-array 4)) ⇒  (4)
++ (array-dimensions (make-array '(2 3))) ⇒  (2 3)
++ (array-dimensions (make-array 4 :fill-pointer 2)) ⇒  (4)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its argument is not an array. ++

++

See Also::

++ ++

array-dimension ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002ddisplacement.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++array-displacement (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.2.15 array-displacement [Function]

++ ++

array-displacement arraydisplaced-to, displaced-index-offset ++

++

Arguments and Values::

++ ++

array—an array. ++

++

displaced-to—an array or nil. ++

++

displaced-index-offset—a non-negative fixnum. ++

++

Description::

++ ++

If the array is a displaced array, ++returns the values of the :displaced-to and :displaced-index-offset ++options ++for the array (see the functions make-array and adjust-array). ++If the array is not a displaced array, ++nil and 0 are returned. ++

++

If array-displacement is called on an array ++for which a non-nil object was provided as the ++:displaced-to argument to make-array ++or adjust-array, it must return that object ++as its first value. It is implementation-dependent ++whether array-displacement returns a non-nil ++primary value for any other array. ++

++

Examples::

++ ++
++
 (setq a1 (make-array 5)) ⇒  #<ARRAY 5 simple 46115576>
++ (setq a2 (make-array 4 :displaced-to a1
++                        :displaced-index-offset 1))
++⇒  #<ARRAY 4 indirect 46117134>
++ (array-displacement a2)
++⇒  #<ARRAY 5 simple 46115576>, 1
++ (setq a3 (make-array 2 :displaced-to a2
++                        :displaced-index-offset 2))
++⇒  #<ARRAY 2 indirect 46122527>
++ (array-displacement a3)
++⇒  #<ARRAY 4 indirect 46117134>, 2
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if array is not an array. ++

++

See Also::

++ ++

make-array ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002delement_002dtype.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++array-element-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.2.13 array-element-type [Function]

++ ++

array-element-type arraytypespec ++

++

Arguments and Values::

++ ++

array—an array. ++

++

typespec—a type specifier. ++

++

Description::

++ ++

Returns a type specifier which represents the actual array element type ++of the array, which is the set of objects that such an array can hold. ++(Because of array upgrading, this type specifier can in ++some cases denote a supertype of the expressed array element type ++of the array.) ++

++

Examples::

++ ++
++
 (array-element-type (make-array 4)) ⇒  T
++ (array-element-type (make-array 12 :element-type '(unsigned-byte 8))) 
++⇒  implementation-dependent
++ (array-element-type (make-array 12 :element-type '(unsigned-byte 5)))
++⇒  implementation-dependent
++
++ ++
++
 (array-element-type (make-array 5 :element-type '(mod 5)))
++
++ ++

could be (mod 5), (mod 8), fixnum, t, or any other ++type of which (mod 5) is a subtype. ++

++

Affected By::

++ ++

The implementation. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its argument is not an array. ++

++

See Also::

++ ++

array, ++make-array ++, ++subtypep ++, ++upgraded-array-element-type ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002dhas_002dfill_002dpointer_002dp.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++array-has-fill-pointer-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.14 array-has-fill-pointer-p [Function]

++ ++

array-has-fill-pointer-p arraygeneralized-boolean ++

++

Arguments and Values::

++ ++

array—an array. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if array has a fill pointer; ++otherwise returns false. ++

++

Examples::

++ ++
++
 (array-has-fill-pointer-p (make-array 4)) ⇒  implementation-dependent
++ (array-has-fill-pointer-p (make-array '(2 3))) ⇒  false
++ (array-has-fill-pointer-p
++   (make-array 8 
++               :fill-pointer 2 
++               :initial-element 'filler)) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its argument is not an array. ++

++

See Also::

++ ++

make-array ++, ++fill-pointer ++

++

Notes::

++ ++

Since arrays of rank other than one cannot have a fill pointer, ++array-has-fill-pointer-p always returns nil when its argument ++is such an array. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002din_002dbounds_002dp.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++array-in-bounds-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.16 array-in-bounds-p [Function]

++ ++

array-in-bounds-p array &rest subscriptsgeneralized-boolean ++

++

Arguments and Values::

++ ++

array—an array. ++

++

subscripts—a list of integers ++ of length equal to the rank of the array. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if the subscripts are all in bounds for array; ++otherwise returns false. ++(If array is a vector with a fill pointer, ++ that fill pointer is ignored.) ++

++

Examples::

++
++
 (setq a (make-array '(7 11) :element-type 'string-char))
++ (array-in-bounds-p a 0  0) ⇒  true
++ (array-in-bounds-p a 6 10) ⇒  true
++ (array-in-bounds-p a 0 -1) ⇒  false
++ (array-in-bounds-p a 0 11) ⇒  false
++ (array-in-bounds-p a 7  0) ⇒  false
++
++ ++

See Also::

++ ++

array-dimensions ++

++

Notes::

++
++
 (array-in-bounds-p array subscripts)   
++ ≡ (and (not (some #'minusp (list subscripts)))
++         (every #'< (list subscripts) (array-dimensions array)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002drank.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++array-rank (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.2.17 array-rank [Function]

++ ++

array-rank arrayrank ++

++

Arguments and Values::

++ ++

array—an array. ++

++

rank—a non-negative integer. ++

++

Description::

++ ++

Returns the number of dimensions of array. ++

++

Examples::

++ ++
++
 (array-rank (make-array '())) ⇒  0
++ (array-rank (make-array 4)) ⇒  1
++ (array-rank (make-array '(4))) ⇒  1
++ (array-rank (make-array '(2 3))) ⇒  2
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its argument is not an array. ++

++

See Also::

++ ++

array-rank-limit ++, ++make-array ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002drank_002dlimit.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++array-rank-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.2.25 array-rank-limit [Constant Variable]

++ ++

Constant Value::

++ ++

A positive ++

++

fixnum, ++

++

the exact magnitude of which is implementation-dependent, ++but which is not less than 8. ++

++

Description::

++ ++

The upper exclusive bound on the rank of an array. ++

++

See Also::

++ ++

make-array ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002drow_002dmajor_002dindex.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++array-row-major-index (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.18 array-row-major-index [Function]

++ ++

array-row-major-index array &rest subscriptsindex ++

++

Arguments and Values::

++ ++

array—an array. ++

++

subscripts—a list of valid array indices for the array. ++

++

index—a valid array row-major index for the array. ++

++

Description::

++ ++

Computes the position according to the row-major ordering of array ++for the element that is specified by subscripts, and returns the ++offset of the element in the computed position from the beginning of array. ++

++

For a one-dimensional array, ++the result of array-row-major-index ++equals subscript. ++

++

array-row-major-index ignores fill pointers. ++

++

Examples::

++ ++
++
 (setq a (make-array '(4 7) :element-type '(unsigned-byte 8)))
++ (array-row-major-index a 1 2) ⇒  9
++ (array-row-major-index 
++    (make-array '(2 3 4) 
++                :element-type '(unsigned-byte 8)
++                :displaced-to a
++                :displaced-index-offset 4)
++    0 2 1) ⇒  9
++
++ ++

Notes::

++ ++

A possible definition of array-row-major-index, ++with no error-checking, is ++

++
++
 (defun array-row-major-index (a &rest subscripts)
++   (apply #'+ (maplist #'(lambda (x y)
++                            (* (car x) (apply #'* (cdr y))))
++                       subscripts
++                       (array-dimensions a))))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002dtotal_002dsize.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++array-total-size (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.19 array-total-size [Function]

++ ++

array-total-size arraysize ++

++

Arguments and Values::

++ ++

array—an array. ++

++

size—a non-negative integer. ++

++

Description::

++ ++

Returns the array total size of the array. ++

++

Examples::

++ ++
++
 (array-total-size (make-array 4)) ⇒  4
++ (array-total-size (make-array 4 :fill-pointer 2)) ⇒  4
++ (array-total-size (make-array 0)) ⇒  0
++ (array-total-size (make-array '(4 2))) ⇒  8
++ (array-total-size (make-array '(4 0))) ⇒  0
++ (array-total-size (make-array '())) ⇒  1
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its argument is not an array. ++

++

See Also::

++ ++

make-array ++, ++array-dimensions ++

++

Notes::

++ ++

If the array is a vector with a fill pointer, ++the fill pointer is ignored when calculating the array total size. ++

++

Since the product of no arguments is one, the array total size of a ++zero-dimensional array is one. ++

++
++
 (array-total-size x)
++    ≡ (apply #'* (array-dimensions x))
++    ≡ (reduce #'* (array-dimensions x))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/array_002dtotal_002dsize_002dlimit.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++array-total-size-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.26 array-total-size-limit [Constant Variable]

++ ++

Constant Value::

++ ++

A positive ++

++

fixnum, ++

++

the exact magnitude of which is implementation-dependent, ++but which is not less than 1024. ++

++

Description::

++ ++

The upper exclusive bound on the array total size of an array. ++

++

The actual limit on the array total size ++imposed by the implementation ++might vary according the element type of the array; ++in this case, the value of array-total-size-limit ++will be the smallest of these possible limits. ++

++

See Also::

++ ++

make-array ++, ++array-element-type ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/arrayp.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++arrayp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.20 arrayp [Function]

++ ++

arrayp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type array; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (arrayp (make-array '(2 3 4) :adjustable t)) ⇒  true
++ (arrayp (make-array 6)) ⇒  true
++ (arrayp #*1011) ⇒  true
++ (arrayp "hi") ⇒  true
++ (arrayp 'hi) ⇒  false
++ (arrayp 12) ⇒  false
++
++ ++

See Also::

++ ++

typep ++

++

Notes::

++ ++
++
 (arrayp object) ≡ (typep object 'array)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ash.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++ash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.56 ash [Function]

++ ++

ash integer countshifted-integer ++

++

Arguments and Values::

++ ++

integer—an integer. ++

++

count—an integer. ++

++

shifted-integer—an integer. ++

++

Description::

++ ++

ash performs the arithmetic shift operation on the binary ++representation of integer, which is treated as if it were binary. ++

++

ash shifts integer arithmetically left by count bit ++positions if count is positive, ++or right count bit positions if count is negative. ++The shifted value of the same sign ++as integer is returned. ++

++

Mathematically speaking, ash performs the computation ++floor(integer\cdot 2^count). ++Logically, ash ++moves all of the bits in integer to the left, ++adding zero-bits at the right, or moves them to the right, ++discarding bits. ++

++

ash is defined to behave as if integer were ++represented in two’s complement form, regardless of ++how integers are represented internally. ++

Examples::

++
++
 (ash 16 1) ⇒  32
++ (ash 16 0) ⇒  16
++ (ash 16 -1) ⇒  8
++ (ash -100000000000000000000000000000000 -100) ⇒  -79
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if integer is not an integer. ++Should signal an error of type type-error ++ if count is not an integer. ++Might signal arithmetic-error. ++

++

Notes::

++ ++
++
 (logbitp j (ash n k))
++ ≡ (and (>= j k) (logbitp (- j k) n))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/asin.html +@@ -0,0 +1,247 @@ ++ ++ ++ ++ ++ ++asin (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.21 asin, acos, atan [Function]

++ ++

asin numberradians ++

++

acos numberradians ++

++

atan number1 &optional number2radians ++

++

Arguments and Values::

++ ++

number—a number. ++

++

number1—a number if number2 is not supplied, ++ or a real if number2 is supplied. ++

++

number2—a real. ++

++

radians—a number (of radians). ++

++

Description::

++ ++

asin, acos, and atan ++compute the arc sine, arc cosine, and arc tangent respectively. ++

++

The arc sine, arc cosine, and arc tangent (with only number1 supplied) ++functions can be defined mathematically for ++number or number1 specified as x as in Figure 12–13. ++

++
++
  Function     Definition                            
++  Arc sine      -i log  (ix+ \sqrt1-x^2 )          
++  Arc cosine    (\pi/2) - arcsin  x                  
++  Arc tangent   -i log  ((1+ix) \sqrt1/(1+x^2) )   
++
++  Figure 12–13: Mathematical definition of arc sine, arc cosine, and arc tangent
++
++
++ ++

These formulae are mathematically correct, assuming ++completely accurate computation. They are not necessarily ++the simplest ones for real-valued computations. ++

++

If both number1 and number2 are supplied ++for atan, the result is the arc tangent ++of number1/number2. ++The value of atan is always between ++-\pi (exclusive) and~\pi (inclusive) ++

++

when minus zero is not supported. ++The range of the two-argument arc tangent when minus zero is supported ++includes -\pi. ++

++

For a ++

++

real ++

++

number1, ++the result is ++

++

a real ++

++

and lies between ++-\pi/2 and~\pi/2 (both exclusive). ++number1 can be a complex if number2 ++is not supplied. If both are supplied, number2 can be zero provided ++number1 is not zero. ++

++

[Reviewer Note by Barmar: Should add “However, if the implementation distinguishes ++ positive and negative zero, both may be signed zeros, ++ and limits are used to define the result.”] ++

++

The following definition for arc sine determines the range and ++branch cuts: ++

++
arcsin z = -i log (iz+\sqrt1-z^2\Bigr) ++
++

The branch cut for the arc sine function is in two pieces: ++one along the negative real axis to the left of~-1 ++(inclusive), continuous with quadrant II, and one along the positive real ++axis to the right of~1 (inclusive), continuous with quadrant IV. The ++range is that strip of the complex plane containing numbers whose real ++part is between -\pi/2 and~\pi/2. A number with real ++part equal to -\pi/2 is in the range if and only if its imaginary ++part is non-negative; a number with real part equal to \pi/2 is in ++the range if and only if its imaginary part is non-positive. ++

++

The following definition for arc cosine determines the range and ++branch cuts: ++

++
arccos z = \pi\over2 - arcsin z ++
++

or, which are equivalent, ++

++
arccos z = -i log (z+i \sqrt1-z^2\Bigr) ++
++
arccos z = 2 log (\sqrt(1+z)/2 + i \sqrt(1-z)/2)\overi ++
++

The branch cut for the arc cosine function is in two pieces: ++one along the negative real axis to the left of~-1 ++(inclusive), continuous with quadrant II, and one along the positive real ++axis to the right of~1 (inclusive), continuous with quadrant IV. ++This is the same branch cut as for arc sine. ++The range is that strip of the complex plane containing numbers whose real ++part is between 0 and~\pi. A number with real ++part equal to 0 is in the range if and only if its imaginary ++part is non-negative; a number with real part equal to \pi is in ++the range if and only if its imaginary part is non-positive. ++

++

The following definition for (one-argument) arc tangent determines the ++range and branch cuts: ++

++
arctan z = log (1+iz) - log (1-iz)\over2i ++
++

Beware of simplifying this formula; “obvious” simplifications are likely ++to alter the branch cuts or the values on the branch cuts incorrectly. ++The branch cut for the arc tangent function is in two pieces: ++one along the positive imaginary axis above i ++(exclusive), continuous with quadrant II, and one along the negative imaginary ++axis below -i (exclusive), continuous with quadrant IV. ++The points i and~-i are excluded from the domain. ++The range is that strip of the complex plane containing numbers whose real ++part is between -\pi/2 and~\pi/2. A number with real ++part equal to -\pi/2 is in the range if and only if its imaginary ++part is strictly positive; a number with real part equal to \pi/2 is in ++the range if and only if its imaginary part is strictly negative. Thus the range of ++arc tangent is identical to that of arc sine with the points ++-\pi/2 and~\pi/2 excluded. ++

++

For atan, ++the signs of number1 (indicated as x) ++and number2 (indicated as y) are used to derive quadrant ++information. Figure 12–14 details various special cases. ++

++

The asterisk (*) indicates that the entry in the figure applies to ++implementations that support minus zero. ++

++
++
   to 1pcy Condition  x Condition  Cartesian locus  Range of result          
++   to 1pc y = 0        x > 0       Positive x-axis   0                       
++   to 1pc* y = +0      x > 0       Positive x-axis  +0                       
++   to 1pc* y = -0      x > 0       Positive x-axis  -0                       
++   to 1pc y > 0        x > 0       Quadrant I       0 < result < \pi/2      
++   to 1pc y > 0        x = 0       Positive y-axis  \pi/2                    
++   to 1pc y > 0        x < 0       Quadrant II      \pi/2 < result < \pi    
++   to 1pc y = 0        x < 0       Negative x-axis   \pi                     
++   to 1pc* y = +0      x < 0       Negative x-axis  +\pi                     
++   to 1pc* y = -0      x < 0       Negative x-axis  -\pi                     
++   to 1pc y < 0        x < 0       Quadrant III     -\pi < result < -\pi/2  
++   to 1pc y < 0        x = 0       Negative y-axis  -\pi/2                   
++   to 1pc y < 0        x > 0       Quadrant IV      -\pi/2 < result < 0     
++   to 1pc y = 0        x = 0       Origin           undefined consequences   
++   to 1pc* y = +0      x = +0      Origin           +0                       
++   to 1pc* y = -0      x = +0      Origin           -0                       
++   to 1pc* y = +0      x = -0      Origin           +\pi                     
++   to 1pc* y = -0      x = -0      Origin           -\pi                     
++
++               Figure 12–14: Quadrant information for arc tangent             
++
++
++ ++

Examples::

++ ++
++
 (asin 0) ⇒  0.0 
++ (acos #c(0 1))  ⇒  #C(1.5707963267948966 -0.8813735870195432)
++ (/ (atan 1 (sqrt 3)) 6)  ⇒  0.087266 
++ (atan #c(0 2)) ⇒  #C(-1.5707964 0.54930615)
++
++ ++

Exceptional Situations::

++ ++

acos and asin should signal an error of type type-error ++ if number is not a number. ++atan should signal type-error if ++ one argument is supplied and that argument is not a number, ++ or if two arguments are supplied and both of those arguments are not reals. ++

++

acos, asin, and atan might signal arithmetic-error. ++

++

See Also::

++ ++

log ++, ++sqrt ++, ++Rule of Float Substitutability ++

++

Notes::

++ ++

The result of either asin or acos can be a complex ++even if number is not a complex; this occurs when the ++absolute value of number is greater than one. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/assert.html +@@ -0,0 +1,173 @@ ++ ++ ++ ++ ++ ++assert (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.10 assert [Macro]

++ ++

assert test-form [({place}*) ++ [datum-form ++ {argument-form}*]]
++ ⇒ nil ++

++

Arguments and Values::

++ ++

test-form—a form; always evaluated. ++

++

place—a place; evaluated if an error is signaled. ++

++

datum-form—a form that evaluates to a datum. ++ Evaluated each time an error is to be signaled, ++ or not at all if no error is to be signaled. ++

++

argument-form—a form that evaluates to an argument. ++ Evaluated each time an error is to be signaled, ++ or not at all if no error is to be signaled. ++

++

datum, argumentsdesignators for a condition ++ of default type error. (These designators are the ++ result of evaluating datum-form and each of the argument-forms.) ++

++

Description::

++ ++

assert assures that test-form evaluates to true. ++If test-form evaluates to false, assert signals a ++correctable error (denoted by datum and arguments). ++Continuing from this error using the continue restart makes it possible ++for the user to alter the values of the places before ++assert evaluates test-form again. ++If the value of test-form is non-nil, ++assert returns nil. ++

++

The places are generalized references to data ++upon which test-form depends, ++whose values can be changed by the user in attempting to correct the error. ++Subforms of each place are only evaluated if an error is signaled, ++and might be re-evaluated if the error is re-signaled (after continuing without ++actually fixing the problem). ++

++

The order of evaluation of the places is not specified; ++see Evaluation of Subforms to Places. ++ ++

++ ++ ++

If a place form is supplied that produces more values than there ++are store variables, the extra values are ignored. If the supplied ++form produces fewer values than there are store variables, ++the missing values are set to nil. ++

++

Examples::

++
++
 (setq x (make-array '(3 5) :initial-element 3))
++⇒  #2A((3 3 3 3 3) (3 3 3 3 3) (3 3 3 3 3))
++ (setq y (make-array '(3 5) :initial-element 7))
++⇒  #2A((7 7 7 7 7) (7 7 7 7 7) (7 7 7 7 7))
++ (defun matrix-multiply (a b)
++   (let ((*print-array* nil))
++     (assert (and (= (array-rank a) (array-rank b) 2)
++                  (= (array-dimension a 1) (array-dimension b 0)))
++             (a b)
++             "Cannot multiply ~S by ~S." a b)
++            (really-matrix-multiply a b))) ⇒  MATRIX-MULTIPLY
++ (matrix-multiply x y)
++ |>  Correctable error in MATRIX-MULTIPLY: 
++ |>  Cannot multiply #<ARRAY ...> by #<ARRAY ...>.
++ |>  Restart options:
++ |>   1: You will be prompted for one or more new values.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Value for A: |>>x<<|
++ |>  Value for B: |>>(make-array '(5 3) :initial-element 6)<<|
++⇒  #2A((54 54 54 54 54)
++       (54 54 54 54 54)
++       (54 54 54 54 54)
++       (54 54 54 54 54)
++       (54 54 54 54 54))
++
++ ++
++
 (defun double-safely (x) (assert (numberp x) (x)) (+ x x))
++ (double-safely 4) 
++⇒  8
++
++ (double-safely t)
++ |>  Correctable error in DOUBLE-SAFELY: The value of (NUMBERP X) must be non-NIL.
++ |>  Restart options:
++ |>   1: You will be prompted for one or more new values.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Value for X: |>>7<<|
++⇒  14
++
++ ++

Affected By::

++ ++

*break-on-signals* ++

++

The set of active condition handlers. ++

++

See Also::

++ ++

check-type ++, ++error ++, Generalized Reference ++

++

Notes::

++ ++

The debugger need not include the test-form in the error message, ++and the places should not be included in the message, but they ++should be made available for the user’s perusal. If the user gives the ++“continue” command, the values of any of the references can be altered. ++The details of this depend on the implementation’s style of user interface. ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/assoc.html +@@ -0,0 +1,168 @@ ++ ++ ++ ++ ++ ++assoc (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.36 assoc, assoc-if, assoc-if-not [Function]

++ ++

assoc item alist &key key test test-notentry ++

++

assoc-if predicate alist &key keyentry ++

++

assoc-if-not predicate alist &key keyentry ++

++

Arguments and Values::

++ ++

item—an object. ++

++

alist—an association list. ++

++

predicate—a designator for ++ a function of one argument ++ that returns a generalized boolean. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

entry—a cons that is an element of alist, ++ or nil. ++

++

Description::

++ ++

assoc, assoc-if, and assoc-if-not ++return the first cons in alist whose car satisfies the test, ++or nil if no such cons is found. ++

++

For assoc, assoc-if, and assoc-if-not, if nil appears ++in alist in place of a pair, it is ignored. ++

++

Examples::

++ ++
++
 (setq values '((x . 100) (y . 200) (z . 50))) ⇒  ((X . 100) (Y . 200) (Z . 50))
++ (assoc 'y values) ⇒  (Y . 200)
++ (rplacd (assoc 'y values) 201) ⇒  (Y . 201)
++ (assoc 'y values) ⇒  (Y . 201)
++ (setq alist '((1 . "one")(2 . "two")(3 . "three"))) 
++⇒  ((1 . "one") (2 . "two") (3 . "three"))
++ (assoc 2 alist) ⇒  (2 . "two")
++ (assoc-if #'evenp alist) ⇒  (2 . "two")
++ (assoc-if-not #'(lambda(x) (< x 3)) alist) ⇒  (3 . "three")
++ (setq alist '(("one" . 1)("two" . 2))) ⇒  (("one" . 1) ("two" . 2))
++ (assoc "one" alist) ⇒  NIL
++ (assoc "one" alist :test #'equalp) ⇒  ("one" . 1)
++ (assoc "two" alist :key #'(lambda(x) (char x 2))) ⇒  NIL 
++ (assoc #\o alist :key #'(lambda(x) (char x 2))) ⇒  ("two" . 2)
++ (assoc 'r '((a . b) (c . d) (r . x) (s . y) (r . z))) ⇒   (R . X)
++ (assoc 'goo '((foo . bar) (zoo . goo))) ⇒  NIL
++ (assoc '2 '((1 a b c) (2 b c d) (-7 x y z))) ⇒  (2 B C D)
++ (setq alist '(("one" . 1) ("2" . 2) ("three" . 3)))
++⇒  (("one" . 1) ("2" . 2) ("three" . 3))
++ (assoc-if-not #'alpha-char-p alist
++               :key #'(lambda (x) (char x 0))) ⇒  ("2" . 2)
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if alist is not an association list. ++

++

See Also::

++ ++

rassoc ++, ++find ++, ++member (Function) ++, ++position ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

The function assoc-if-not is deprecated. ++

++

It is possible to rplacd the result of assoc, provided ++that it is not nil, ++in order to “update” alist. ++

++

The two expressions ++

++
++
 (assoc item list :test fn)
++
++ ++

and ++

++
++
 (find item list :test fn :key #'car)
++
++ ++

are equivalent in meaning with one exception: ++if nil appears in alist in place of a pair, ++and item is nil, ++find will compute the car of the nil in alist, ++find that it is equal to item, and return nil, ++whereas assoc will ignore the nil in alist and continue ++to search for an actual cons whose car is nil. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/atom-_0028Type_0029.html +@@ -0,0 +1,60 @@ ++ ++ ++ ++ ++ ++atom (Type) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.4 atom [Type]

++ ++

Supertypes::

++ ++

atom, ++t ++

++

Description::

++ ++

It is equivalent to (not cons). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/atom.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++atom (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.7 atom [Function]

++ ++

atom objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type atom; ++otherwise, returns false. ++

++

Examples::

++
++
 (atom 'sss) ⇒  true
++ (atom (cons 1 2)) ⇒  false
++ (atom nil) ⇒  true
++ (atom '()) ⇒  true
++ (atom 3) ⇒  true
++
++ ++

Notes::

++ ++
++
 (atom object) ≡ (typep object 'atom) ≡ (not (consp object))
++ ≡ (not (typep object 'cons)) ≡ (typep object '(not cons))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/base_002dchar.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++base-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

13.2.2 base-char [Type]

++ ++

Supertypes::

++ ++

base-char, ++character, ++t ++

++

Description::

++ ++

The type base-char is defined as the upgraded array element type ++of standard-char. ++An implementation can support additional subtypes of type character ++(besides the ones listed in this standard) ++that might or might not be supertypes of type base-char. ++In addition, an implementation can define base-char ++to be the same type as character. ++

++

Base characters are distinguished in the following respects: ++

++
1.
++

The type standard-char is a subrepertoire of the type base-char. ++

++
2.
++

The selection of base characters that are not standard characters ++ is implementation defined. ++

++
3.
++

Only objects of the type base-char can be ++ elements of a base string. ++

++
4.
++

No upper bound is specified for the number of characters in the ++base-char repertoire; the size of that repertoire ++is ++implementation-defined. ++The lower bound is~96, the number of standard characters. ++

++
++ ++

Whether a character is a base character depends on the way ++that an implementation represents strings, ++and not any other properties of the implementation or the host operating system. ++For example, one implementation might encode all strings ++as characters having 16-bit encodings, and another might have ++two kinds of strings: those with characters having 8-bit ++encodings and those with characters having 16-bit encodings. In the ++first implementation, the type base-char is equivalent to ++the type character: there is only one kind of string. ++In the second implementation, the base characters might be ++those characters that could be stored in a string of characters ++having 8-bit encodings. In such an implementation, ++the type base-char is a proper subtype of the type character. ++

++

The type standard-char is a ++

++

subtype of type base-char. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/base_002dstring.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++base-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.2 base-string [Type]

++ ++

Supertypes::

++ ++

base-string, ++string, ++vector, ++array, ++sequence, ++t ++

++

Description::

++ ++

The type base-string is equivalent to ++

++

(vector base-char). ++

++

The base string representation is the most efficient string representation ++that can hold an arbitrary sequence of standard characters. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(base-string{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This is equivalent to the type (vector base-char size); ++that is, the set of base strings of size size. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/bignum.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++bignum (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.14 bignum [Type]

++ ++

Supertypes::

++ ++

bignum, ++integer, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

The type bignum is defined to be exactly (and integer (not fixnum)). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/bit-_0028Array_0029.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++bit (Array) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.33 bit, sbit [Accessor]

++ ++

bit bit-array &rest subscriptsbit ++

++

sbit bit-array &rest subscriptsbit ++

++

(setf (bit bit-array &rest subscripts) new-bit)
(setf (sbit bit-array &rest subscripts) new-bit)
++

++

Arguments and Values::

++ ++

bit-array—for bit, a bit array; ++ for sbit, a simple bit array. ++

++

subscripts—a list of valid array indices ++ for the bit-array. ++

++

bit—a bit. ++

++

Description::

++ ++

bit and sbit access the bit-array ++element specified by subscripts. ++

++

These functions ignore the fill pointer when accessing elements. ++

++

Examples::

++ ++
++
 (bit (setq ba (make-array 8 
++                            :element-type 'bit 
++                            :initial-element 1))
++       3) ⇒  1
++ (setf (bit ba 3) 0) ⇒  0
++ (bit ba 3) ⇒  0
++ (sbit ba 5) ⇒  1
++ (setf (sbit ba 5) 1) ⇒  1
++ (sbit ba 5) ⇒  1
++
++ ++

See Also::

++ ++

aref ++, ++

++

Compiler Terminology ++

++

Notes::

++ ++

bit and sbit are like aref ++except that they require arrays to be ++a bit array and a simple bit array, respectively. ++

++

bit and sbit, unlike char and schar, ++allow the first argument to be an array of any rank. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/bit-_0028System-Class_0029.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++bit (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.12 bit [Type]

++ ++

Supertypes::

++ ++

bit, ++unsigned-byte, ++signed-byte, ++integer, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

The type bit is equivalent to the type (integer 0 1) ++and (unsigned-byte 1). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/bit_002dand.html +@@ -0,0 +1,157 @@ ++ ++ ++ ++ ++ ++bit-and (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.34 bit-and, bit-andc1, bit-andc2, bit-eqv,

++

bit-ior, bit-nand, bit-nor, bit-not, bit-orc1, bit-orc2, bit-xor

++

[Function] ++

++

bit-and bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-andc1 bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-andc2 bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-eqv bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-ior bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-nand bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-nor bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-orc1 bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-orc2 bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-xor bit-array1 bit-array2 &optional opt-argresulting-bit-array ++

++

bit-not bit-array &optional opt-argresulting-bit-array ++

++

Arguments and Values::

++ ++

bit-array, bit-array1, bit-array2—a bit array. ++

++

Opt-arg—a bit array, or t, or nil. ++ The default is nil. ++

++

Bit-array, bit-array1, bit-array2, and opt-arg ++(if an array) must all be of the same rank and dimensions. ++

++

resulting-bit-array—a bit array. ++

++

Description::

++ ++

These functions perform ++bit-wise logical operations on bit-array1 and bit-array2 ++and return an array ++of matching rank and dimensions, ++such that any given bit of the result ++is produced by operating on corresponding bits from each of the arguments. ++

++

In the case of bit-not, an array ++of rank and dimensions matching bit-array ++is returned that contains a copy of bit-array ++with all the bits inverted. ++

++

If opt-arg is of type (array bit) the contents of the ++result are destructively placed into opt-arg. ++If opt-arg is the symbol t, ++bit-array or bit-array1 is replaced with the result; ++if opt-arg is nil or omitted, a new array is created ++to contain the result. ++

++

Figure 15–4 indicates the logical operation ++performed by each of the functions. ++

++

2 ++

++
Function                                                   Operation                                   
++_______________________________________________________________________________________________________
++                                                           
++bit-and                                                    and                                         
++bit-eqv                                                    equivalence (exclusive nor)                 
++bit-not                                                    complement                                  
++bit-ior                                                    inclusive or                                
++bit-xor                                                    exclusive or                                
++bit-nand                                                   complement of bit-array1 and bit-array2     
++bit-nor                                                    complement of bit-array1 or bit-array2      
++bit-andc1                                                  and complement of bit-array1 with bit-array2
++bit-andc2                                                  and bit-array1 with complement of bit-array2
++bit-orc1                                                   or complement of bit-array1 with bit-array2 
++bit-orc2                                                   or bit-array1 with complement of bit-array2 
++  Figure 15–3: Bit-wise Logical Operations on Bit Arrays
++
++
++ ++

Examples::

++
++
 (bit-and (setq ba #*11101010) #*01101011) ⇒  #*01101010
++ (bit-and #*1100 #*1010) ⇒  #*1000      
++ (bit-andc1 #*1100 #*1010) ⇒  #*0010
++ (setq rba (bit-andc2 ba #*00110011 t)) ⇒  #*11001000
++ (eq rba ba) ⇒  true
++ (bit-not (setq ba #*11101010)) ⇒  #*00010101
++ (setq rba (bit-not ba 
++                     (setq tba (make-array 8 
++                                           :element-type 'bit))))
++⇒  #*00010101
++ (equal rba tba) ⇒  true
++ (bit-xor #*1100 #*1010) ⇒  #*0110
++
++ ++

See Also::

++ ++

lognot, ++logand ++

++
++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/bit_002dvector.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++bit-vector (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.5 bit-vector [System Class]

++ ++

Class Precedence List::

++

bit-vector, ++vector, ++array, ++sequence, ++t ++

++

Description::

++ ++

A bit vector is a vector the element type of which is bit. ++

++

The type bit-vector is a subtype of type vector, ++for bit-vector means (vector bit). ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(bit-vector{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the same type as the type (array bit (size)); ++that is, the set of bit vectors of size size. ++

++

See Also::

++ ++

Sharpsign Asterisk, ++Printing Bit Vectors, ++Required Kinds of Specialized Arrays ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/bit_002dvector_002dp.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++bit-vector-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.35 bit-vector-p [Function]

++ ++

bit-vector-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type bit-vector; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (bit-vector-p (make-array 6 
++                           :element-type 'bit 
++                           :fill-pointer t)) ⇒  true
++ (bit-vector-p #*) ⇒  true
++ (bit-vector-p (make-array 6)) ⇒  false
++
++ ++

See Also::

++ ++

typep ++

++

Notes::

++ ++
++
 (bit-vector-p object) ≡ (typep object 'bit-vector)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/block.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++block (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.22 block [Special Operator]

++ ++

block name form*{result}* ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

form—a form. ++

++

results—the values of the forms if a normal return occurs, ++ or else, if an explicit return occurs, the values that were transferred. ++

++

Description::

++ ++

block establishes a block named name ++and then evaluates forms as an implicit progn. ++

++

The special operators block and return-from work together to ++provide a structured, lexical, non-local exit facility. At any point lexically ++contained within forms, return-from can be used with the ++given name to return control and values from the block ++form, except when an intervening block with the same name ++has been established, in which case the outer block is ++shadowed by the inner one. ++

++

The block named name has ++lexical scope and dynamic extent. ++

++

Once established, a block may only be exited once, ++whether by normal return or explicit return. ++

++

Examples::

++ ++
++
 (block empty) ⇒  NIL
++ (block whocares (values 1 2) (values 3 4)) ⇒  3, 4
++ (let ((x 1)) 
++   (block stop (setq x 2) (return-from stop) (setq x 3))
++   x) ⇒  2
++ (block early (return-from early (values 1 2)) (values 3 4)) ⇒  1, 2
++ (block outer (block inner (return-from outer 1)) 2) ⇒  1
++ (block twin (block twin (return-from twin 1)) 2) ⇒  2
++ ;; Contrast behavior of this example with corresponding example of CATCH.
++ (block b
++   (flet ((b1 () (return-from b 1)))
++     (block b (b1) (print 'unreachable))
++     2)) ⇒  1
++
++ ++

See Also::

++ ++

return ++, ++return-from ++, Evaluation ++

++

Notes::

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/boole.html +@@ -0,0 +1,190 @@ ++ ++ ++ ++ ++ ++boole (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.60 boole [Function]

++ ++

boole op integer-1 integer-2result-integer ++

++

Arguments and Values::

++ ++

Op—a bit-wise logical operation specifier. ++

++

integer-1—an integer. ++

++

integer-2—an integer. ++

++

result-integer—an integer. ++

++

Description::

++ ++

boole performs bit-wise logical operations on ++integer-1 and integer-2, which are treated as if ++they were binary and in two’s complement representation. ++

++

The operation to be performed and the return value are determined by ++op. ++

++

boole returns the values ++specified for any op in Figure 12–16. ++

++ ++ ++
++
  Op           Result                                      
++  boole-1      integer-1                                   
++  boole-2      integer-2                                   
++  boole-andc1  and complement of integer-1 with integer-2  
++  boole-andc2  and integer-1 with complement of integer-2  
++  boole-and    and                                         
++  boole-c1     complement of integer-1                     
++  boole-c2     complement of integer-2                     
++  boole-clr    always 0 (all zero bits)                    
++  boole-eqv    equivalence (exclusive nor)                 
++  boole-ior    inclusive or                                
++  boole-nand   not-and                                     
++  boole-nor    not-or                                      
++  boole-orc1   or complement of integer-1 with integer-2   
++  boole-orc2   or integer-1 with complement of integer-2   
++  boole-set    always -1 (all one bits)                    
++  boole-xor    exclusive or                                
++
++         Figure 12–16: Bit-Wise Logical Operations        
++
++
++ ++ ++ ++

Examples::

++ ++
++
 (boole boole-ior 1 16) ⇒  17
++ (boole boole-and -2 5) ⇒  4
++ (boole boole-eqv 17 15) ⇒  -31
++
++;;; These examples illustrate the result of applying BOOLE and each
++;;; of the possible values of OP to each possible combination of bits.
++ (progn
++   (format t "~&Results of (BOOLE <op> #b0011 #b0101) ...~
++           ~
++   (dolist (symbol '(boole-1     boole-2    boole-and  boole-andc1
++                     boole-andc2 boole-c1   boole-c2   boole-clr
++                     boole-eqv   boole-ior  boole-nand boole-nor
++                     boole-orc1  boole-orc2 boole-set  boole-xor))
++     (let ((result (boole (symbol-value symbol) #b0011 #b0101)))
++       (format t "~& ~A~13T~3,' D~23T~:*~5,' B~31T ...~4,'0B~
++               symbol result (logand result #b1111)))))
++ |>  Results of (BOOLE <op> #b0011 #b0101) ...
++ |>  ---Op-------Decimal-----Binary----Bits---
++ |>   BOOLE-1       3          11    ...0011
++ |>   BOOLE-2       5         101    ...0101
++ |>   BOOLE-AND     1           1    ...0001
++ |>   BOOLE-ANDC1   4         100    ...0100
++ |>   BOOLE-ANDC2   2          10    ...0010
++ |>   BOOLE-C1     -4        -100    ...1100
++ |>   BOOLE-C2     -6        -110    ...1010
++ |>   BOOLE-CLR     0           0    ...0000
++ |>   BOOLE-EQV    -7        -111    ...1001
++ |>   BOOLE-IOR     7         111    ...0111
++ |>   BOOLE-NAND   -2         -10    ...1110
++ |>   BOOLE-NOR    -8       -1000    ...1000
++ |>   BOOLE-ORC1   -3         -11    ...1101
++ |>   BOOLE-ORC2   -5        -101    ...1011
++ |>   BOOLE-SET    -1          -1    ...1111
++ |>   BOOLE-XOR     6         110    ...0110
++⇒  NIL
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its first argument is not a ++bit-wise logical operation specifier or if any subsequent argument is not ++an integer. ++

++

See Also::

++ ++

logand ++

++

Notes::

++ ++

In general, ++

++
++
 (boole boole-and x y) ≡ (logand x y)
++
++ ++

Programmers who would prefer to use numeric indices rather than ++bit-wise logical operation specifiers can get an equivalent effect ++by a technique such as the following: ++

++
++
;; The order of the values in this `table' are such that
++;; (logand (boole (elt boole-n-vector n) #b0101 #b0011) #b1111) => n
++ (defconstant boole-n-vector
++    (vector boole-clr   boole-and  boole-andc1 boole-2
++            boole-andc2 boole-1    boole-xor   boole-ior
++            boole-nor   boole-eqv  boole-c1    boole-orc1
++            boole-c2    boole-orc2 boole-nand  boole-set))
++⇒  BOOLE-N-VECTOR
++ (proclaim '(inline boole-n))
++⇒  implementation-dependent
++ (defun boole-n (n integer &rest more-integers)
++   (apply #'boole (elt boole-n-vector n) integer more-integers))
++⇒  BOOLE-N
++ (boole-n #b0111 5 3) ⇒  7
++ (boole-n #b0001 5 3) ⇒  1
++ (boole-n #b1101 5 3) ⇒  -3
++ (loop for n from #b0000 to #b1111 collect (boole-n n 5 3))
++⇒  (0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1)
++
++ ++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/boole_002d1.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++boole-1 (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.61 boole-1, boole-2, boole-and, boole-andc1, boole-andc2,

++

boole-c1, boole-c2, boole-clr, boole-eqv, boole-ior,

++

boole-nand, boole-nor, boole-orc1, boole-orc2, boole-set,

++

boole-xor

++

[Constant Variable] ++

++

Constant Value::

++ ++

The identity and nature of the values of each of these variables ++is implementation-dependent, ++except that it must be distinct from each of the values of the others, ++and it must be a valid first argument to the function boole. ++

++

Description::

++ ++

Each of these constants has a value which is one of the ++sixteen possible bit-wise logical operation specifiers. ++

++

Examples::

++
++
 (boole boole-ior 1 16) ⇒  17
++ (boole boole-and -2 5) ⇒  4
++ (boole boole-eqv 17 15) ⇒  -31
++
++ ++

See Also::

++ ++

boole ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/boolean.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++boolean (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.2 boolean [Type]

++ ++

Supertypes::

++ ++

boolean, ++symbol, ++t ++

++

Description::

++ ++

The type boolean contains the symbols t and nil, ++which represent true and false, respectively. ++

++

See Also::

++ ++

t (constant variable), ++nil (constant variable), ++if ++, ++not ++, ++complement ++

++

Notes::

++ ++

Conditional operations, such as if, ++permit the use of generalized booleans, ++not just booleans; ++any non-nil value, ++not just t, ++counts as true for a generalized boolean. ++However, as a matter of convention, ++the symbol t is considered the canonical value to use ++even for a generalized boolean when no better choice presents itself. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/boundp.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++boundp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.17 boundp [Function]

++ ++

boundp symbolgeneralized-boolean ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if symbol is bound; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (setq x 1) ⇒  1
++ (boundp 'x) ⇒  true
++ (makunbound 'x) ⇒  X
++ (boundp 'x) ⇒  false
++ (let ((x 2)) (boundp 'x)) ⇒  false
++ (let ((x 2)) (declare (special x)) (boundp 'x)) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

set ++, ++setq ++, ++symbol-value ++, ++makunbound ++

++

Notes::

++ ++

The function bound determines only whether a symbol has a ++value in the global environment; any lexical bindings ++are ignored. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/break.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++break (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.23 break [Function]

++ ++

break &optional format-control &rest format-argumentsnil ++

++

Arguments and Values::

++ ++

format-control—a format control. ++

++

The default is implementation-dependent. ++

++

format-argumentsformat arguments for the format-control. ++

++

Description::

++ ++

break formats format-control and format-arguments ++and then goes directly into the debugger without allowing any possibility of ++interception by programmed error-handling facilities. ++

++

If the continue restart is used while in the debugger, ++break immediately returns nil without taking any unusual recovery action. ++

++

break binds *debugger-hook* to nil ++before attempting to enter the debugger. ++

++

Examples::

++ ++
++
 (break "You got here with arguments: ~:S." '(FOO 37 A))
++ |>  BREAK: You got here with these arguments: FOO, 37, A.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Return from BREAK.
++ |>   2: Top level.
++ |>  Debug> :CONTINUE 1
++ |>  Return from BREAK.
++⇒  NIL
++
++
++ ++

Side Effects::

++ ++

The debugger is entered. ++

++

Affected By::

++ ++

*debug-io*. ++

++

See Also::

++ ++

error ++, ++invoke-debugger ++. ++

++

Notes::

++ ++

break is used as a way of inserting temporary debugging ++“breakpoints” in a program, not as a way of signaling errors. ++For this reason, break does not take the continue-format-control ++argument that cerror takes. ++This and the lack of any possibility of interception by ++condition handling are the only program-visible ++differences between break and cerror. ++

++

The user interface aspects of break and cerror are ++permitted to vary more widely, in order to accomodate the interface ++needs of the implementation. For example, it is permissible for a ++Lisp read-eval-print loop to be entered by break rather ++than the conventional debugger. ++

++

break could be defined by: ++

++
++
 (defun break (&optional (format-control "Break") &rest format-arguments)
++   (with-simple-restart (continue "Return from BREAK.")
++     (let ((*debugger-hook* nil))
++       (invoke-debugger
++           (make-condition 'simple-condition
++                           :format-control format-control
++                           :format-arguments format-arguments))))
++   nil)
++
++ ++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/broadcast_002dstream.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++broadcast-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.2 broadcast-stream [System Class]

++ ++

Class Precedence List::

++ ++

broadcast-stream, ++stream, ++t ++

++

Description::

++ ++

A broadcast stream is an output stream which ++has associated with it a set of zero or more output streams ++such that any output sent to the broadcast stream gets passed on ++as output to each of the associated output streams. ++(If a broadcast stream has no component streams, ++then all output to the broadcast stream is discarded.) ++

++

The set of operations that may be performed on a broadcast stream ++is the intersection of those for its associated output streams. ++

++

Some output operations (e.g., fresh-line) return values based on the ++state of the stream at the time of the operation. ++

++

Since these values might differ for each of the component streams, ++it is necessary to describe their return value specifically: ++

++
++
*
++

stream-element-type returns ++ the value from the last component stream, ++ or t if there are no component streams. ++

++
++
*
++

fresh-line returns ++ the value from the last component stream, ++ or nil if there are no component streams. ++

++
++
*
++

The functions ++ file-length, ++ file-position, ++ file-string-length, ++ and stream-external-format ++ return the value from the last component stream; ++ if there are no component streams, ++ file-length and file-position return 0, ++ file-string-length returns 1, ++ and stream-external-format returns :default. ++

++
++
*
++

The functions streamp and output-stream-p ++ always return true for broadcast streams. ++

++
++
*
++

The functions open-stream-p tests whether the broadcast stream ++ is open_2, not whether its component streams are open. ++

++
++
*
++

The functions input-stream-p and interactive-stream-p ++ return an implementation-defined, generalized boolean value. ++

++
++
*
++

For the input operations ++ clear-input ++ listen, ++ peek-char, ++ read-byte, ++ read-char-no-hang, ++ read-char, ++ read-line, ++ and unread-char, ++ the consequences are undefined if the indicated operation is performed. ++ However, an implementation is permitted ++ to define such a behavior as an implementation-dependent extension. ++

++
++ ++

For any output operations not having their return values explicitly specified above ++or elsewhere in this document, it is defined that ++the values returned by such an operation are ++the values resulting from performing the operation ++on the last of its component streams; ++the values resulting from performing the operation ++on all preceding streams are discarded. ++If there are no component streams, ++the value is implementation-dependent. ++

++

See Also::

++ ++

broadcast-stream-streams ++, ++make-broadcast-stream ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/broadcast_002dstream_002dstreams.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++broadcast-stream-streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.40 broadcast-stream-streams [Function]

++ ++

broadcast-stream-streams broadcast-streamstreams ++

++

Arguments and Values::

++ ++

broadcast-stream—a broadcast stream. ++

++

streams—a list of streams. ++

++

Description::

++ ++

Returns a list of output streams that constitute ++all the streams to which the broadcast-stream is broadcasting. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/built_002din_002dclass.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++built-in-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.8 built-in-class [System Class]

++ ++

Class Precedence List::

++

built-in-class, ++class, ++

++

standard-object, ++

++

t ++

++

Description::

++ ++

A built-in class is a class whose instances have ++restricted capabilities or special representations. ++Attempting to use ++defclass to define subclasses of a built-in class ++signals an error of type error. ++Calling make-instance to create an instance ++of a built-in class signals an error of type error. ++Calling slot-value on an instance of a built-in class ++signals an error of type error. Redefining a built-in class ++or using change-class to change the class of an instance ++to or from a built-in class signals an error of type error. ++However, built-in classes can be used as parameter specializers ++in methods. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/butlast.html +@@ -0,0 +1,128 @@ ++ ++ ++ ++ ++ ++butlast (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.28 butlast, nbutlast [Function]

++ ++

butlast list &optional nresult-list ++

++

nbutlast list &optional nresult-list ++

++

Arguments and Values::

++ ++

list—a list, ++

++

which might be a dotted list but must not be a circular list. ++

++

n—a non-negative integer. ++

++

result-list—a list. ++

++

Description::

++ ++

butlast returns a copy of list from which the last ++n ++

++

conses ++

++

have been omitted. ++If n is not supplied, its value is 1. ++If there are fewer than n ++

++

conses ++

++

in list, ++nil is returned and, in the case of nbutlast, ++list is not modified. ++

++

nbutlast is like butlast, but nbutlast ++may modify list. ++It changes the cdr of ++the cons n+1 from the end of the list to nil. ++

++

Examples::

++
++
 (setq lst '(1 2 3 4 5 6 7 8 9)) ⇒  (1 2 3 4 5 6 7 8 9)
++ (butlast lst) ⇒  (1 2 3 4 5 6 7 8)
++ (butlast lst 5) ⇒  (1 2 3 4)
++ (butlast lst (+ 5 5)) ⇒  NIL
++ lst ⇒  (1 2 3 4 5 6 7 8 9)
++ (nbutlast lst 3) ⇒  (1 2 3 4 5 6)
++ lst ⇒  (1 2 3 4 5 6)
++ (nbutlast lst 99) ⇒  NIL
++ lst ⇒  (1 2 3 4 5 6)
++ (butlast '(a b c d)) ⇒  (A B C)
++ (butlast '((a b) (c d))) ⇒  ((A B))
++ (butlast '(a)) ⇒  NIL
++ (butlast nil) ⇒  NIL
++ (setq foo (list 'a 'b 'c 'd)) ⇒  (A B C D)
++ (nbutlast foo) ⇒  (A B C)
++ foo ⇒  (A B C)
++ (nbutlast (list 'a)) ⇒  NIL
++ (nbutlast '()) ⇒  NIL
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if list is not a proper list or a dotted list. ++

++

Should signal an error of type type-error ++ if n is not a non-negative integer. ++

++

Notes::

++ ++
++
 (butlast list n) ≡ (ldiff list (last list n))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/byte.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++byte (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.66 byte, byte-size, byte-position [Function]

++ ++

byte size positionbytespec ++

++

byte-size bytespecsize ++

++

byte-position bytespecposition ++

++

Arguments and Values::

++ ++

size, position—a non-negative integer. ++

++

bytespec—a byte specifier. ++

++

Description::

++ ++

byte returns a byte specifier that indicates ++a byte of width size and whose bits have weights ++2^position + size - 1\/ through 2^position, ++and whose representation is ++implementation-dependent. ++

++

byte-size returns the number of bits specified by bytespec. ++

++

byte-position returns the position specified by bytespec. ++

++

Examples::

++ ++
++
 (setq b (byte 100 200)) ⇒  #<BYTE-SPECIFIER size 100 position 200>
++ (byte-size b) ⇒  100
++ (byte-position b) ⇒  200
++
++ ++

See Also::

++ ++

ldb ++, ++dpb ++

++

Notes::

++ ++
++
 (byte-size (byte j k)) ≡ j
++ (byte-position (byte j k)) ≡ k
++
++ ++

A byte of size of 0 is permissible; ++it refers to a byte of width zero. For example, ++

++
++
 (ldb (byte 0 3) #o7777) ⇒  0
++ (dpb #o7777 (byte 0 3) 0) ⇒  0
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/call_002darguments_002dlimit.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++call-arguments-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.12 call-arguments-limit [Constant Variable]

++ ++

Constant Value::

++ ++

An integer not smaller than 50 and at least as great as ++the value of lambda-parameters-limit, ++the exact magnitude of which is implementation-dependent. ++

++

Description::

++ ++

The upper exclusive bound on the number of arguments that ++may be passed to a function. ++

++

See Also::

++ ++

lambda-parameters-limit ++, ++multiple-values-limit ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/call_002dmethod.html +@@ -0,0 +1,141 @@ ++ ++ ++ ++ ++ ++call-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.30 call-method, make-method [Local Macro]

++ ++

Syntax::

++ ++

call-method method &optional next-method-list{result}* ++

++

make-method formmethod-object ++

++

Arguments and Values::

++ ++

method—a method object, ++ or a list (see below); not evaluated. ++

++

method-object—a method object. ++

++

next-method-list—a list of method objects; not evaluated. ++

++

results—the values returned by the method invocation. ++

++

Description::

++ ++

The macro call-method is used in method combination. It hides ++the implementation-dependent details of how ++methods are called. The ++macro call-method has lexical scope and ++can only be used within ++an effective method form. ++

++

[Editorial Note by KMP: This next paragraph still needs some work.] ++

++

Whether or not call-method is fbound in the ++global environment is implementation-dependent; ++however, the restrictions on redefinition and shadowing of ++call-method are the same as for symbols in the COMMON-LISP package ++which are fbound in the global environment. ++The consequences of attempting to use call-method outside ++of an effective method form are undefined. ++

++

The macro call-method invokes the specified method, ++supplying it with arguments and with definitions for ++call-next-method and for next-method-p. ++If the invocation of call-method is lexically inside ++of a make-method, the arguments are those that ++were supplied to that method. Otherwise the arguments are ++those that were supplied to the generic function. ++The definitions ++of call-next-method and next-method-p rely on ++the specified next-method-list. ++

++

If method is a list, the first element of the list ++must be the symbol make-method and the second element must be ++a form. Such a list specifies a method object ++whose method function has a body that is the given form. ++

++

Next-method-list can contain method objects or lists, ++the first element of which must be the symbol make-method and the ++second element of which must be a form. ++

++

Those are the only two places where make-method can be used. ++The form used with make-method is evaluated in ++the null lexical environment augmented with a local macro definition ++for call-method and with bindings named by ++symbols not accessible from the COMMON-LISP-USER package. ++

++

The call-next-method function available to method ++will call the first method in next-method-list. ++The call-next-method function ++available in that method, in turn, will call the second ++method in next-method-list, and so on, until ++the list of next methods is exhausted. ++

++

If next-method-list is not supplied, the ++call-next-method function available to ++method signals an error of type control-error ++and the next-method-p function ++available to method returns nil. ++

++

Examples::

++ ++

See Also::

++ ++

call-next-method ++, ++define-method-combination ++, ++next-method-p ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/call_002dnext_002dmethod.html +@@ -0,0 +1,146 @@ ++ ++ ++ ++ ++ ++call-next-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.31 call-next-method [Local Function]

++ ++

Syntax::

++ ++

call-next-method &rest args{result}* ++

++

Arguments and Values::

++ ++

arg—an object. ++

++

results—the values returned by the method it calls. ++

++

Description::

++ ++

The function call-next-method can be used ++

++

within the body forms (but not the lambda list) ++

++

of a method defined by a method-defining form to call the ++next method. ++

++

If there is no next method, the generic function ++no-next-method is called. ++

++

The type of method combination used determines which methods ++can invoke call-next-method. The standard ++method combination type allows call-next-method ++to be used within primary methods and around methods. ++For generic functions using a type of method combination defined by ++the short form of define-method-combination, ++call-next-method can be used in around methods only. ++

++

When call-next-method is called with no arguments, it passes the ++current method’s original arguments to the next method. Neither ++argument defaulting, nor using setq, nor rebinding variables ++with the same names as parameters of the method affects the values ++call-next-method passes to the method it calls. ++

++

When call-next-method is called with arguments, the ++next method is called with those arguments. ++

++

If call-next-method is called with arguments but omits ++optional arguments, the next method called defaults those arguments. ++

++

The function call-next-method returns any values that are ++returned by the next method. ++

++

The function call-next-method has lexical scope and ++indefinite extent and can only be used within the body of a ++method defined by a method-defining form. ++

++

Whether or not call-next-method is fbound in the ++global environment is implementation-dependent; ++however, the restrictions on redefinition and shadowing of ++call-next-method are the same as for symbols in the COMMON-LISP package ++which are fbound in the global environment. ++The consequences of attempting to use call-next-method outside ++of a method-defining form are undefined. ++

++

Affected By::

++ ++

defmethod, call-method, define-method-combination. ++

++

Exceptional Situations::

++ ++

When providing arguments to call-next-method, ++the following rule must be satisfied or an error of type error ++should be ++signaled: ++the ordered set of applicable methods for a changed set of arguments ++for call-next-method must be the same as the ordered set of ++applicable methods for the original arguments to the ++generic function. ++Optimizations of the error checking are possible, but they must not change ++the semantics of call-next-method. ++

++

See Also::

++ ++

define-method-combination ++, ++defmethod ++, ++next-method-p ++, ++no-next-method ++, ++call-method ++, ++Method Selection and Combination, ++Standard Method Combination, ++Built-in Method Combination Types ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/car.html +@@ -0,0 +1,286 @@ ++ ++ ++ ++ ++ ++car (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.9 car, cdr,

++

caar, cadr, cdar, cddr,

++

caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr,

++

caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr,

++

cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr

++

[Accessor] ++

++

car xobject ++(setf (car x) new-object)
++

++

cdr xobject ++(setf (cdr x) new-object)
++

++

\vksip 5pt xobject ++(setf (\vksip 5pt x) new-object)
++

++

caar xobject ++(setf (caar x) new-object)
++

++

cadr xobject ++(setf (cadr x) new-object)
++

++

cdar xobject ++(setf (cdar x) new-object)
++

++

cddr xobject ++(setf (cddr x) new-object)
++

++

\vksip 5pt xobject ++(setf (\vksip 5pt x) new-object)
++

++

caaar xobject ++(setf (caaar x) new-object)
++

++

caadr xobject ++(setf (caadr x) new-object)
++

++

cadar xobject ++(setf (cadar x) new-object)
++

++

caddr xobject ++(setf (caddr x) new-object)
++

++

cdaar xobject ++(setf (cdaar x) new-object)
++

++

cdadr xobject ++(setf (cdadr x) new-object)
++

++

cddar xobject ++(setf (cddar x) new-object)
++

++

cdddr xobject ++(setf (cdddr x) new-object)
++

++

\vksip 5pt xobject ++(setf (\vksip 5pt x) new-object)
++

++

caaaar xobject ++(setf (caaaar x) new-object)
++

++

caaadr xobject ++(setf (caaadr x) new-object)
++

++

caadar xobject ++(setf (caadar x) new-object)
++

++

caaddr xobject ++(setf (caaddr x) new-object)
++

++

cadaar xobject ++(setf (cadaar x) new-object)
++

++

cadadr xobject ++(setf (cadadr x) new-object)
++

++

caddar xobject ++(setf (caddar x) new-object)
++

++

cadddr xobject ++(setf (cadddr x) new-object)
++

++

cdaaar xobject ++(setf (cdaaar x) new-object)
++

++

cdaadr xobject ++(setf (cdaadr x) new-object)
++

++

cdadar xobject ++(setf (cdadar x) new-object)
++

++

cdaddr xobject ++(setf (cdaddr x) new-object)
++

++

cddaar xobject ++(setf (cddaar x) new-object)
++

++

cddadr xobject ++(setf (cddadr x) new-object)
++

++

cdddar xobject ++(setf (cdddar x) new-object)
++

++

cddddr xobject ++(setf (cddddr x) new-object)
++

++

Pronunciation::

++ ++

cadr: pronounced ’ka ,de r ++

++

caddr: pronounced ’kad e ,de r ++ or pronounced ’ka ,dude r ++

++

cdr: pronounced ’ku ,de r ++

++

cddr: pronounced ’kud e ,de r ++ or pronounced ’ke ,dude r ++

++

Arguments and Values::

++ ++

x—a list. ++

++

object—an object. ++

++

new-object—an object. ++

++

Description::

++ ++

If x is a cons, car returns the car ++of that cons. If x is nil, car returns nil. ++

++

If x is a cons, cdr returns the cdr ++of that cons. If x is nil, cdr returns nil. ++

++

Functions are provided which perform compositions of up to four ++car and cdr operations. Their names consist of ++a C, followed by two, three, or four occurrences of A or D, ++and finally an R. The series of A’s and D’s in each ++function’s name is chosen to identify the series of ++car and cdr operations that is performed by the function. ++The order in which the A’s and D’s appear is the inverse of the ++order in which the corresponding operations are performed. Figure 14–6 ++defines the relationships precisely. ++

++
++
  This place ...  Is equivalent to this place ...  
++  (caar x)        (car (car x))                    
++  (cadr x)        (car (cdr x))                    
++  (cdar x)        (cdr (car x))                    
++  (cddr x)        (cdr (cdr x))                    
++  (caaar x)       (car (car (car x)))              
++  (caadr x)       (car (car (cdr x)))              
++  (cadar x)       (car (cdr (car x)))              
++  (caddr x)       (car (cdr (cdr x)))              
++  (cdaar x)       (cdr (car (car x)))              
++  (cdadr x)       (cdr (car (cdr x)))              
++  (cddar x)       (cdr (cdr (car x)))              
++  (cdddr x)       (cdr (cdr (cdr x)))              
++  (caaaar x)      (car (car (car (car x))))        
++  (caaadr x)      (car (car (car (cdr x))))        
++  (caadar x)      (car (car (cdr (car x))))        
++  (caaddr x)      (car (car (cdr (cdr x))))        
++  (cadaar x)      (car (cdr (car (car x))))        
++  (cadadr x)      (car (cdr (car (cdr x))))        
++  (caddar x)      (car (cdr (cdr (car x))))        
++  (cadddr x)      (car (cdr (cdr (cdr x))))        
++  (cdaaar x)      (cdr (car (car (car x))))        
++  (cdaadr x)      (cdr (car (car (cdr x))))        
++  (cdadar x)      (cdr (car (cdr (car x))))        
++  (cdaddr x)      (cdr (car (cdr (cdr x))))        
++  (cddaar x)      (cdr (cdr (car (car x))))        
++  (cddadr x)      (cdr (cdr (car (cdr x))))        
++  (cdddar x)      (cdr (cdr (cdr (car x))))        
++  (cddddr x)      (cdr (cdr (cdr (cdr x))))        
++
++         Figure 14–6: CAR and CDR variants        
++
++
++ ++

setf can also be used with any of these functions to change an ++existing component of x, but setf will not make new ++components. So, for example, the car of a cons ++can be assigned with setf of car, ++but the car of nil cannot be assigned with setf of car. ++Similarly, the car of the car of a cons whose car ++is a cons can be assigned with setf of caar, ++but neither nil nor a cons whose car is nil can be assigned ++with setf of caar. ++

++

The argument x is permitted to be a dotted list ++or a circular list. ++

++

Examples::

++ ++
++
 (car nil) ⇒  NIL  
++ (cdr '(1 . 2)) ⇒  2
++ (cdr '(1 2)) ⇒  (2)
++ (cadr '(1 2)) ⇒  2 
++ (car '(a b c)) ⇒  A
++ (cdr '(a b c)) ⇒  (B C)
++
++ ++

Exceptional Situations::

++ ++

The functions car and cdr ++should signal type-error if they receive an argument which is not a ++list. The other functions (caar, cadr, ++... cddddr) should behave for the purpose of ++error checking as if defined by appropriate calls to car and ++cdr. ++

++

See Also::

++ ++

rplaca ++, ++first ++, ++rest ++

++

Notes::

++ ++

The car of a cons can also be altered by using rplaca, ++and the cdr of a cons can be altered by using rplacd. ++

++
++
(car x)    ≡ (first x)
++(cadr x)   ≡ (second x) ≡ (car (cdr x))
++(caddr x)  ≡ (third x)  ≡ (car (cdr (cdr x)))
++(cadddr x) ≡ (fourth x) ≡ (car (cdr (cdr (cdr x))))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/case.html +@@ -0,0 +1,228 @@ ++ ++ ++ ++ ++ ++case (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.46 case, ccase, ecase [Macro]

++ ++

case keyform {!normal-clause}* [!otherwise-clause]{result}* ++

++

ccase keyplace {!normal-clause}*{result}* ++

++

ecase keyform {!normal-clause}*{result}* ++

++

normal-clause ::=(keys {form}*) ++

++

otherwise-clause ::=({otherwise | t} {form}*) ++

++

clause ::=normal-clause | otherwise-clause ++

++ ++ ++ ++ ++

Arguments and Values::

++ ++

keyform—a form; evaluated to produce a test-key. ++

++

keyplace—a form; evaluated initially to produce a test-key. ++ Possibly also used later as a place if no keys match. ++

++

test-key—an object produced by evaluating keyform or keyplace. ++

++

keys—a designator for a list of objects. ++ In the case of case, the symbols t and otherwise may ++ not be used as the keys designator. To refer to these symbols ++ by themselves as keys, the designators (t) and (otherwise), respectively, ++ must be used instead. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms ++ in the matching clause. ++

++

Description::

++ ++

These macros allow the conditional execution of a body of forms ++in a clause that is selected by matching the test-key on the ++basis of its identity. ++

++

The keyform or keyplace is evaluated to produce the ++test-key. ++

++

Each of the normal-clauses is then considered in turn. ++If the test-key is the same as any key for ++that clause, the forms in that clause are ++evaluated as an implicit progn, and the values ++it returns are returned as the value of the case, ++ccase, or ecase form. ++

++

These macros differ only in their behavior when ++no normal-clause matches; specifically: ++

++
++
case
++

If no normal-clause matches, and there is an otherwise-clause, ++then that otherwise-clause automatically matches; the forms in ++that clause are evaluated as an implicit progn, ++and the values it returns are returned as the value of the case. ++

++

If there is no otherwise-clause, case returns nil. ++

++
++
ccase
++

If no normal-clause matches, ++a correctable error of type type-error is signaled. ++The offending datum is the test-key and ++the expected type is type equivalent to (member key1 key2 ...). ++The store-value restart can be used to correct the error. ++

++

If the store-value restart is invoked, its argument becomes the ++new test-key, and is stored in keyplace as if by ++(setf keyplace test-key). ++Then ccase starts over, considering each clause anew. ++

++

[Reviewer Note by Barmar: Will it prompt for multiple values if keyplace is a VALUES general ref?] ++

++

The subforms of keyplace might be evaluated again if ++none of the cases holds. ++

++
++
ecase
++

If no normal-clause matches, ++a non-correctable error of type type-error is signaled. ++The offending datum is the test-key and ++the expected type is type equivalent to (member key1 key2 ...). ++

++

Note that in contrast with ccase, ++the caller of ecase may rely on the fact that ecase ++does not return if a normal-clause does not match. ++

++
++
++ ++

Examples::

++ ++
++
 (dolist (k '(1 2 3 :four #\v () t 'other))
++    (format t "~S "
++       (case k ((1 2) 'clause1)
++               (3 'clause2)
++               (nil 'no-keys-so-never-seen)
++               ((nil) 'nilslot)
++               ((:four #\v) 'clause4)
++               ((t) 'tslot)
++               (otherwise 'others)))) 
++ |>  CLAUSE1 CLAUSE1 CLAUSE2 CLAUSE4 CLAUSE4 NILSLOT TSLOT OTHERS 
++⇒  NIL
++ (defun add-em (x) (apply #'+ (mapcar #'decode x)))
++⇒  ADD-EM
++ (defun decode (x)
++   (ccase x
++     ((i uno) 1)
++     ((ii dos) 2)
++     ((iii tres) 3)
++     ((iv cuatro) 4)))
++⇒  DECODE
++ (add-em '(uno iii)) ⇒  4
++ (add-em '(uno iiii))
++ |>  Error: The value of X, IIII, is not I, UNO, II, DOS, III,
++ |>         TRES, IV, or CUATRO.
++ |>   1: Supply a value to use instead.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Value to evaluate and use for X: |>>'IV<<|
++⇒  5
++
++ ++

Side Effects::

++ ++

The debugger might be entered. ++If the store-value restart is invoked, ++the value of keyplace might be changed. ++

++

Affected By::

++ ++

ccase and ecase, since they might signal an error, ++are potentially affected by existing handlers and *debug-io*. ++

++

Exceptional Situations::

++ ++

ccase and ecase signal an error of type type-error ++if no normal-clause matches. ++

++

See Also::

++ ++

cond ++, ++typecase ++, ++setf ++, ++Generalized Reference ++

++

Notes::

++ ++
++
(case test-key
++  {(({key}*) {form}*)}*)
++≡
++(let ((#1=#:g0001 test-key))
++  (cond {((member #1# '({key}*)) {form}*)}*))
++
++ ++

The specific error message used by ecase and ccase can vary ++between implementations. In situations where control of the specific wording ++of the error message is important, it is better to use case with an ++otherwise-clause that explicitly signals an error with an appropriate ++message. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/catch.html +@@ -0,0 +1,162 @@ ++ ++ ++ ++ ++ ++catch (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.23 catch [Special Operator]

++ ++

catch tag {form}*{result}* ++

++

Arguments and Values::

++ ++

tag—a catch tag; evaluated. ++

++

forms—an implicit progn. ++

++

results—if the forms exit normally, ++ the values returned by the forms; ++ if a throw occurs to the tag, ++ the values that are thrown. ++

++

Description::

++ ++

catch is used as the destination of a non-local ++control transfer by throw. ++Tags are used to find the catch ++to which a throw is transferring control. ++(catch 'foo form) catches a ++(throw 'foo form) but not a ++(throw 'bar form). ++

++

The order of execution of catch follows: ++ ++

++ ++ ++
++
1.
++

Tag is evaluated. ++It serves as the name of the ++catch. ++

++
++
2.
++

Forms are then evaluated as an implicit progn, ++and the results of the last form are returned unless a ++throw occurs. ++

++
++
3.
++

If a throw occurs ++during the execution of one of the forms, control ++is transferred to the catch form whose tag ++is eq to ++the tag argument of the throw ++and which is the most recently established catch with that ++tag. ++No further evaluation of forms occurs. ++

++
++
4.
++

The tag established ++by catch is disestablished ++just before the results are returned. ++

++
++
++ ++

If during the execution of one of the forms, a throw ++is executed whose tag is eq to the catch tag, ++then the values specified by the throw are ++returned as the result of the dynamically most recently established ++catch form with that tag. ++

++

The mechanism for catch and throw works even ++if throw is not within the lexical scope of catch. ++throw must occur within the dynamic extent ++of the evaluation of the body of a catch with a corresponding tag. ++

++

Examples::

++
++
 (catch 'dummy-tag 1 2 (throw 'dummy-tag 3) 4) ⇒  3
++ (catch 'dummy-tag 1 2 3 4) ⇒  4
++ (defun throw-back (tag) (throw tag t)) ⇒  THROW-BACK
++ (catch 'dummy-tag (throw-back 'dummy-tag) 2) ⇒  T
++
++ ;; Contrast behavior of this example with corresponding example of BLOCK.
++ (catch 'c
++   (flet ((c1 () (throw 'c 1)))
++     (catch 'c (c1) (print 'unreachable))
++     2)) ⇒  2
++
++ ++

Exceptional Situations::

++

An error of type control-error is signaled ++if throw is done ++when there is no suitable catch tag. ++

See Also::

++ ++

throw ++, Evaluation ++

++

Notes::

++ ++

It is customary for symbols to be used ++as tags, but any object is permitted. ++However, numbers should not be ++used because the comparison is done using eq. ++

++

catch differs from block in that ++catch ++tags have dynamic scope while ++block names have lexical scope. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cell_002derror.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++cell-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.6 cell-error [Condition Type]

++ ++

Class Precedence List::

++

cell-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type cell-error consists of error conditions that occur during ++a location access. The name of the offending cell is initialized by ++the :name initialization argument to make-condition, ++and is accessed by the function cell-error-name. ++

++

See Also::

++ ++

cell-error-name ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cell_002derror_002dname.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++cell-error-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.7 cell-error-name [Function]

++ ++

cell-error-name conditionname ++

++

Arguments and Values::

++ ++

condition—a condition of type cell-error. ++

++

name—an object. ++

++

Description::

++ ++

Returns the name of the offending cell involved in the situation ++represented by condition. ++

++

The nature of the result depends on the specific type of condition. ++For example, ++ if the condition is of type unbound-variable, the result is ++ the name of the unbound variable which was being accessed, ++ if the condition is of type undefined-function, this is ++ the name of the undefined function which was being accessed, ++and if the condition is of type unbound-slot, this is ++ the name of the slot which was being accessed. ++

++

See Also::

++ ++

cell-error, ++unbound-slot, ++unbound-variable, ++undefined-function, ++Condition System Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cerror.html +@@ -0,0 +1,218 @@ ++ ++ ++ ++ ++ ++cerror (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.12 cerror [Function]

++ ++

cerror continue-format-control datum &rest argumentsnil ++

++

Arguments and Values::

++ ++

Continue-format-control—a format control. ++

++

[Reviewer Note by Barmar: What is continue-format-control used for??] ++

++

datum, argumentsdesignators for a condition ++ of default type simple-error. ++

++

Description::

++ ++

cerror effectively invokes error on the ++condition named by datum. As with any function that ++implicitly calls error, if the condition is not handled, ++(invoke-debugger condition) is executed. While signaling is going on, ++and while in the debugger if it is reached, it is possible to continue ++code execution (i.e., to return from cerror) using the continue restart. ++

++

If datum is a condition, arguments can be supplied, ++but are used only in conjunction with the continue-format-control. ++

++

Examples::

++ ++
++
 (defun real-sqrt (n)
++   (when (minusp n)
++     (setq n (- n))
++     (cerror "Return sqrt(~D) instead." "Tried to take sqrt(-~D)." n))
++   (sqrt n))
++
++ (real-sqrt 4)
++⇒  2.0
++
++ (real-sqrt -9)
++ |>  Correctable error in REAL-SQRT: Tried to take sqrt(-9).
++ |>  Restart options:
++ |>   1: Return sqrt(9) instead.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++⇒  3.0
++
++ (define-condition not-a-number (error)
++   ((argument :reader not-a-number-argument :initarg :argument))
++   (:report (lambda (condition stream)
++              (format stream "~S is not a number." 
++                      (not-a-number-argument condition)))))
++
++ (defun assure-number (n)
++   (loop (when (numberp n) (return n))
++         (cerror "Enter a number."
++                 'not-a-number :argument n)
++         (format t "~&Type a number: ")
++         (setq n (read))
++         (fresh-line)))
++
++ (assure-number 'a)
++ |>  Correctable error in ASSURE-NUMBER: A is not a number.
++ |>  Restart options:
++ |>   1: Enter a number.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Type a number: |>>1/2<<|
++⇒  1/2
++
++ (defun assure-large-number (n)
++   (loop (when (and (numberp n) (> n 73)) (return n))
++         (cerror "Enter a number~:[~; a bit larger than ~D~]."
++                 "~*~A is not a large number." 
++                 (numberp n) n)
++         (format t "~&Type a large number: ")
++         (setq n (read))
++         (fresh-line)))
++
++ (assure-large-number 10000)
++⇒  10000
++
++ (assure-large-number 'a)
++ |>  Correctable error in ASSURE-LARGE-NUMBER: A is not a large number.
++ |>  Restart options:
++ |>   1: Enter a number.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Type a large number: |>>88<<|
++⇒  88
++
++ (assure-large-number 37)
++ |>  Correctable error in ASSURE-LARGE-NUMBER: 37 is not a large number.
++ |>  Restart options:
++ |>   1: Enter a number a bit larger than 37.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Type a large number: |>>259<<|
++⇒  259
++
++ (define-condition not-a-large-number (error)
++   ((argument :reader not-a-large-number-argument :initarg :argument))
++   (:report (lambda (condition stream)
++              (format stream "~S is not a large number." 
++                      (not-a-large-number-argument condition)))))
++
++ (defun assure-large-number (n)
++   (loop (when (and (numberp n) (> n 73)) (return n))
++         (cerror "Enter a number~3*~:[~; a bit larger than ~*~D~]."
++                 'not-a-large-number
++                 :argument n 
++                 :ignore (numberp n)
++                 :ignore n
++                 :allow-other-keys t)
++         (format t "~&Type a large number: ")
++         (setq n (read))
++         (fresh-line)))
++
++ (assure-large-number 'a)
++ |>  Correctable error in ASSURE-LARGE-NUMBER: A is not a large number.
++ |>  Restart options:
++ |>   1: Enter a number.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Type a large number: |>>88<<|
++⇒  88
++
++ (assure-large-number 37)
++ |>  Correctable error in ASSURE-LARGE-NUMBER: A is not a large number.
++ |>  Restart options:
++ |>   1: Enter a number a bit larger than 37.
++ |>   2: Top level.
++ |>  Debug> |>>:continue 1<<|
++ |>  Type a large number: |>>259<<|
++⇒  259
++
++ ++

Affected By::

++ ++

*break-on-signals*. ++

++

Existing handler bindings. ++

++

See Also::

++ ++

error ++, ++format ++, ++handler-bind ++, ++*break-on-signals*, simple-type-error ++

++

Notes::

++ ++

If datum is a condition type rather than a ++string, the format directive ~* may be especially ++useful in the continue-format-control in order to ignore the ++keywords in the initialization argument list. For example: ++

++
++
(cerror "enter a new value to replace ~*~s" 
++        'not-a-number
++        :argument a)
++
++ ++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/change_002dclass.html +@@ -0,0 +1,169 @@ ++ ++ ++ ++ ++ ++change-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.8 change-class [Standard Generic Function]

++ ++

Syntax::

++ ++

change-class instance new-class &key &allow-other-keysinstance ++

++

Method Signatures::

++ ++

change-class (instance standard-object) ++ (new-class standard-class) ++ &rest initargs ++

++

change-class (instance t) ++ (new-class symbol) ++ &rest initargs ++

++

Arguments and Values::

++ ++

instance—an object. ++

++

new-class—a class designator. ++

++

initargs—an initialization argument list. ++

++

Description::

++ ++

The generic function change-class changes the ++class of an instance to new-class. ++It destructively modifies and returns the instance. ++

++

If in the old class there is any slot of the ++same name as a local slot in the new-class, ++the value of that slot is retained. This means that if ++the slot has a value, the value returned by slot-value ++after change-class is invoked is eql to the ++value returned by slot-value before change-class is ++invoked. Similarly, if the slot was unbound, it remains ++unbound. The other slots are initialized as described in ++Changing the Class of an Instance. ++

++

After completing all other actions, change-class invokes ++update-instance-for-different-class. The ++generic function update-instance-for-different-class can be used ++to assign values to slots in the transformed instance. ++

++

See Initializing Newly Added Local Slots (Changing the Class of an Instance). ++

++

If the second of the above methods is selected, ++that method invokes change-class ++on instance, (find-class new-class), ++and the initargs. ++

++

Examples::

++ ++
++
++
++ (defclass position () ())
++
++ (defclass x-y-position (position)
++     ((x :initform 0 :initarg :x)
++      (y :initform 0 :initarg :y)))
++
++ (defclass rho-theta-position (position)
++     ((rho :initform 0)
++      (theta :initform 0)))
++
++ (defmethod update-instance-for-different-class :before ((old x-y-position) 
++                                                         (new rho-theta-position)
++                                                         &key)
++   ;; Copy the position information from old to new to make new
++   ;; be a rho-theta-position at the same position as old.
++   (let ((x (slot-value old 'x))
++         (y (slot-value old 'y)))
++     (setf (slot-value new 'rho) (sqrt (+ (* x x) (* y y)))
++           (slot-value new 'theta) (atan y x))))
++
++;;; At this point an instance of the class x-y-position can be
++;;; changed to be an instance of the class rho-theta-position using
++;;; change-class:
++
++ (setq p1 (make-instance 'x-y-position :x 2 :y 0))
++
++ (change-class p1 'rho-theta-position)
++
++;;; The result is that the instance bound to p1 is now an instance of
++;;; the class rho-theta-position.   The update-instance-for-different-class
++;;; method performed the initialization of the rho and theta slots based
++;;; on the value of the x and y slots, which were maintained by
++;;; the old instance.
++
++
++ ++

See Also::

++ ++

update-instance-for-different-class ++, ++Changing the Class of an Instance ++

++

Notes::

++ ++

The generic function change-class has several semantic ++difficulties. First, it performs a destructive operation that can be ++invoked within a method on an instance that was used to select that ++method. ++When multiple methods are involved because methods are being ++combined, the methods currently executing or about to be executed may ++no longer be applicable. Second, some implementations might use ++compiler optimizations of slot access, and when the class of an ++instance is changed the assumptions the compiler made might be ++violated. This implies that a programmer must not use ++change-class inside a method if any ++methods for that generic function ++access any slots, or the results are undefined. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.6 char, schar [Accessor]

++ ++

char string indexcharacter ++

++

schar string indexcharacter ++

++

(setf (char string index) new-character)
(setf (schar string index) new-character)
++

++

Arguments and Values::

++ ++

string—for char, a string; ++ for schar, a simple string. ++

++

index—a valid array index for the string. ++

++

character, new-character—a character. ++

++

Description::

++ ++

char and schar access the element of string ++specified by index. ++

++

char ignores fill pointers when accessing elements. ++

++

Examples::

++ ++
++
 (setq my-simple-string (make-string 6 :initial-element #\A)) ⇒  "AAAAAA"
++ (schar my-simple-string 4) ⇒  #\A
++ (setf (schar my-simple-string 4) #\B) ⇒  #\B
++ my-simple-string ⇒  "AAAABA"
++ (setq my-filled-string
++       (make-array 6 :element-type 'character
++                     :fill-pointer 5
++                     :initial-contents my-simple-string))
++⇒  "AAAAB"
++ (char my-filled-string 4) ⇒  #\B
++ (char my-filled-string 5) ⇒  #\A
++ (setf (char my-filled-string 3) #\C) ⇒  #\C
++ (setf (char my-filled-string 5) #\D) ⇒  #\D
++ (setf (fill-pointer my-filled-string) 6) ⇒  6
++ my-filled-string ⇒  "AAACBD"
++
++ ++

See Also::

++ ++

aref ++, ++elt ++, ++

++

Compiler Terminology ++

++

Notes::

++ ++
++
 (char s j) ≡ (aref (the string s) j)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char_002dcode.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++char-code (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.16 char-code [Function]

++ ++

char-code charactercode ++

++

Arguments and Values::

++ ++

character—a character. ++

++

code—a character code. ++

++

Description::

++ ++

char-code returns the code attribute of character. ++

++

Examples::

++ ++
++
;; An implementation using ASCII character encoding 
++;; might return these values:
++(char-code #\$) ⇒  36
++(char-code #\a) ⇒  97
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

char-code-limit ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char_002dcode_002dlimit.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++char-code-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.19 char-code-limit [Constant Variable]

++ ++

Constant Value::

++ ++

A non-negative integer, the exact magnitude of which ++is implementation-dependent, but which is not less ++than 96 (the number of standard characters). ++

++

Description::

++ ++

The upper exclusive bound on the value returned by ++the function char-code. ++

++

See Also::

++ ++

char-code ++

++

Notes::

++ ++

The value of char-code-limit might be larger than the actual ++number of characters supported by the implementation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char_002dint.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++char-int (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.17 char-int [Function]

++ ++

char-int characterinteger ++

++

Arguments and Values::

++ ++

character—a character. ++

++

integer—a non-negative integer. ++

++

Description::

++ ++

Returns a non-negative integer encoding the character object. ++The manner in which the integer is computed is implementation-dependent. ++In contrast to sxhash, the result is not guaranteed to be independent ++of the particular Lisp image. ++

++

If character has no implementation-defined attributes, ++the results of char-int and char-code are the same. ++

++
++
 (char= c1 c2) ≡ (= (char-int c1) (char-int c2))
++
++ ++

for characters c1 and c2. ++

++

Examples::

++ ++
++
 (char-int #\A) ⇒  65       ; implementation A
++ (char-int #\A) ⇒  577      ; implementation B
++ (char-int #\A) ⇒  262145   ; implementation C
++
++ ++

See Also::

++ ++

char-code ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char_002dname.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++char-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.20 char-name [Function]

++ ++

char-name charactername ++

++

Arguments and Values::

++ ++

character—a character. ++

++

name—a string or nil. ++

++

Description::

++ ++

Returns a string that is the name of the character, ++or nil if the character has no name. ++

++

All non-graphic characters are required to have names ++unless they have some implementation-defined attribute ++which is not null. Whether or not other characters ++have names is implementation-dependent. ++

++

The standard characters ++<Newline> and <Space> have the respective names "Newline" and "Space". ++The semi-standard characters ++<Tab>, <Page>, <Rubout>, <Linefeed>, <Return>, and <Backspace> ++(if they are supported by the implementation) ++have the respective names ++"Tab", "Page", "Rubout", "Linefeed", "Return", and "Backspace" ++(in the indicated case, even though name lookup by “#\” ++and by the function name-char is not case sensitive). ++

++

Examples::

++ ++
++
 (char-name #\ ) ⇒  "Space"
++ (char-name #\Space) ⇒  "Space"
++ (char-name #\Page) ⇒  "Page"
++
++ (char-name #\a)
++⇒  NIL
++OR⇒ "LOWERCASE-a"
++OR⇒ "Small-A"
++OR⇒ "LA01"
++
++ (char-name #\A)
++⇒  NIL
++OR⇒ "UPPERCASE-A"
++OR⇒ "Capital-A"
++OR⇒ "LA02"
++
++ ;; Even though its CHAR-NAME can vary, #\A prints as #\A
++ (prin1-to-string (read-from-string (format nil "#\\~A" (or (char-name #\A) "A"))))
++⇒  "#\\A"
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

name-char ++, ++Printing Characters ++

++

Notes::

++ ++

Non-graphic ++characters having names are written by the Lisp printer ++as “#\” followed by the their name; see Printing Characters. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char_002dupcase.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++char-upcase (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.14 char-upcase, char-downcase [Function]

++ ++

char-upcase charactercorresponding-character ++

++

char-downcase charactercorresponding-character ++

++

Arguments and Values::

++ ++

character, corresponding-character—a character. ++

++

Description::

++ ++

If character is a lowercase character, ++char-upcase returns the corresponding uppercase character. ++Otherwise, char-upcase just returns the given character. ++

++

If character is an uppercase character, ++char-downcase returns the corresponding lowercase character. ++Otherwise, char-downcase just returns the given character. ++

++

The result only ever differs from character ++in its code attribute; ++all implementation-defined attributes are preserved. ++

++

Examples::

++ ++
++
 (char-upcase #\a) ⇒  #\A
++ (char-upcase #\A) ⇒  #\A
++ (char-downcase #\a) ⇒  #\a
++ (char-downcase #\A) ⇒  #\a
++ (char-upcase #\9) ⇒  #\9
++ (char-downcase #\9) ⇒  #\9
++ (char-upcase #\@) ⇒  #\@
++ (char-downcase #\@) ⇒  #\@
++ ;; Note that this next example might run for a very long time in 
++ ;; some implementations if CHAR-CODE-LIMIT happens to be very large
++ ;; for that implementation.
++ (dotimes (code char-code-limit)
++   (let ((char (code-char code)))
++     (when char
++       (unless (cond ((upper-case-p char) (char= (char-upcase (char-downcase char)) char))
++                     ((lower-case-p char) (char= (char-downcase (char-upcase char)) char))
++                     (t (and (char= (char-upcase (char-downcase char)) char)
++                             (char= (char-downcase (char-upcase char)) char))))
++         (return char)))))
++⇒  NIL
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

upper-case-p ++, ++alpha-char-p ++, ++Characters With Case, ++Documentation of Implementation-Defined Scripts ++

++

Notes::

++ ++

If the corresponding-char is different than character, ++then both the character and the corresponding-char have case. ++

++

Since char-equal ignores the case of the characters it compares, ++the corresponding-character is always the same as character ++under char-equal. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/char_003d.html +@@ -0,0 +1,248 @@ ++ ++ ++ ++ ++ ++char= (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.5 char=, char/=, char<, char>, char<=, char>=,

++

char-equal, char-not-equal, char-lessp, char-greaterp, char-not-greaterp,

++

char-not-lessp

++

[Function] ++

++

char= &rest characters^+generalized-boolean ++

++

char/= &rest characters^+generalized-boolean ++

++

char< &rest characters^+generalized-boolean ++

++

char> &rest characters^+generalized-boolean ++

++

char<= &rest characters^+generalized-boolean ++

++

char>= &rest characters^+generalized-boolean ++

++

char-equal &rest characters^+generalized-boolean ++

++

char-not-equal &rest characters^+generalized-boolean ++

++

char-lessp &rest characters^+generalized-boolean ++

++

char-greaterp &rest characters^+generalized-boolean ++

++

char-not-greaterp &rest characters^+generalized-boolean ++

++

char-not-lessp &rest characters^+generalized-boolean ++

++

Arguments and Values::

++ ++

character—a character. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

These predicates compare characters. ++

++

char= returns true if all characters are the same; ++otherwise, it returns false. ++

++

If two characters differ ++in any implementation-defined attributes, ++then they are not char=. ++

++

char/= returns true if all characters are different; ++otherwise, it returns false. ++

++

char< returns true if the characters are monotonically increasing; ++otherwise, it returns false. ++

++

If two characters ++have identical implementation-defined attributes, ++then their ordering by char< is ++consistent with the numerical ordering by the predicate < on their codes. ++

++

char> returns true if the characters are monotonically decreasing; ++otherwise, it returns false. ++

++

If two characters have ++identical implementation-defined attributes, ++then their ordering by char> is ++consistent with the numerical ordering by the predicate > on their codes. ++

++

char<= returns true ++if the characters are monotonically nondecreasing; ++otherwise, it returns false. ++

++

If two characters have ++identical implementation-defined attributes, ++then their ordering by char<= is ++consistent with the numerical ordering by the predicate <= on their codes. ++

++

char>= returns true ++if the characters are monotonically nonincreasing; ++otherwise, it returns false. ++

++

If two characters have ++identical implementation-defined attributes, ++then their ordering by char>= is ++consistent with the numerical ordering by the predicate >= on their codes. ++

++

char-equal, ++ char-not-equal, ++ char-lessp, ++ char-greaterp, ++ char-not-greaterp, ++and char-not-lessp ++are similar to ++ char=, ++ char/=, ++ char<, ++ char>, ++ char<=, ++ char>=, ++respectively, ++except that they ignore differences in case and ++

++

might have an implementation-defined behavior ++for non-simple characters. ++For example, an implementation might define that ++char-equal, etc. ignore certain ++implementation-defined attributes. ++The effect, if any, ++of each implementation-defined attribute ++upon these functions must be specified as part of the definition of that attribute. ++

++

Examples::

++ ++
++
 (char= #\d #\d) ⇒  true
++ (char= #\A #\a) ⇒  false
++ (char= #\d #\x) ⇒  false
++ (char= #\d #\D) ⇒  false
++ (char/= #\d #\d) ⇒  false
++ (char/= #\d #\x) ⇒  true
++ (char/= #\d #\D) ⇒  true
++ (char= #\d #\d #\d #\d) ⇒  true
++ (char/= #\d #\d #\d #\d) ⇒  false
++ (char= #\d #\d #\x #\d) ⇒  false
++ (char/= #\d #\d #\x #\d) ⇒  false
++ (char= #\d #\y #\x #\c) ⇒  false
++ (char/= #\d #\y #\x #\c) ⇒  true
++ (char= #\d #\c #\d) ⇒  false
++ (char/= #\d #\c #\d) ⇒  false
++ (char< #\d #\x) ⇒  true
++ (char<= #\d #\x) ⇒  true
++ (char< #\d #\d) ⇒  false
++ (char<= #\d #\d) ⇒  true
++ (char< #\a #\e #\y #\z) ⇒  true
++ (char<= #\a #\e #\y #\z) ⇒  true
++ (char< #\a #\e #\e #\y) ⇒  false
++ (char<= #\a #\e #\e #\y) ⇒  true
++ (char> #\e #\d) ⇒  true
++ (char>= #\e #\d) ⇒  true
++ (char> #\d #\c #\b #\a) ⇒  true
++ (char>= #\d #\c #\b #\a) ⇒  true
++ (char> #\d #\d #\c #\a) ⇒  false
++ (char>= #\d #\d #\c #\a) ⇒  true
++ (char> #\e #\d #\b #\c #\a) ⇒  false
++ (char>= #\e #\d #\b #\c #\a) ⇒  false
++ (char> #\z #\A) ⇒  implementation-dependent
++ (char> #\Z #\a) ⇒  implementation-dependent
++ (char-equal #\A #\a) ⇒  true
++ (stable-sort (list #\b #\A #\B #\a #\c #\C) #'char-lessp)
++⇒  (#\A #\a #\b #\B #\c #\C)
++ (stable-sort (list #\b #\A #\B #\a #\c #\C) #'char<)
++⇒  (#\A #\B #\C #\a #\b #\c) ;Implementation A
++⇒  (#\a #\b #\c #\A #\B #\C) ;Implementation B
++⇒  (#\a #\A #\b #\B #\c #\C) ;Implementation C
++⇒  (#\A #\a #\B #\b #\C #\c) ;Implementation D
++⇒  (#\A #\B #\a #\b #\C #\c) ;Implementation E
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type program-error ++ if at least one character is not supplied. ++

++

See Also::

++ ++

Character Syntax, ++Documentation of Implementation-Defined Scripts ++

++

Notes::

++ ++

If characters differ in their code attribute ++or any implementation-defined attribute, ++they are considered to be different by char=. ++

++

There is no requirement that (eq c1 c2) be true merely because ++(char= c1 c2) is true. While eq can distinguish two ++characters ++that char= does not, it is distinguishing them not ++as characters, but in some sense on the basis of a lower level ++implementation characteristic. ++If (eq c1 c2) is true, ++then (char= c1 c2) is also true. ++eql and equal ++compare characters in the same ++way that char= does. ++

++

The manner in which case is used by ++ char-equal, ++ char-not-equal, ++ char-lessp, ++ char-greaterp, ++ char-not-greaterp, ++ and char-not-lessp ++implies an ordering for standard characters such that ++A=a, B=b, and so on, up to Z=z, and furthermore either ++9<A or Z<0. ++

++
++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/character-_0028System-Class_0029.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++character (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.1 character [System Class]

++ ++

Class Precedence List::

++

character, ++t ++

++

Description::

++ ++

A character is an object that ++represents a unitary token in an aggregate quantity of text; ++see Character Concepts. ++

++

The types base-char and extended-char ++form an exhaustive partition of the type character. ++

++

See Also::

++ ++

Character Concepts, ++Sharpsign Backslash, ++Printing Characters ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/character.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.6 character [Function]

++ ++

character characterdenoted-character ++

++

Arguments and Values::

++ ++

character—a character designator. ++

++

denoted-character—a character. ++

++

Description::

++ ++

Returns the character denoted by the character designator. ++

++

Examples::

++ ++
++
 (character #\a) ⇒  #\a
++ (character "a") ⇒  #\a
++ (character 'a) ⇒  #\A
++ (character '\a) ⇒  #\a
++ (character 65.) is an error.
++ (character 'apple) is an error.
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if object is not a character designator. ++

++

See Also::

++ ++

coerce ++

++

Notes::

++ ++
++
 (character object) ≡ (coerce object 'character)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/characterp.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++characterp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.7 characterp [Function]

++ ++

characterp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type character; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (characterp #\a) ⇒  true
++ (characterp 'a) ⇒  false
++ (characterp "a") ⇒  false
++ (characterp 65.) ⇒  false
++ (characterp #\Newline) ⇒  true
++ ;; This next example presupposes an implementation 
++ ;; in which #\Rubout is an implementation-defined character.
++ (characterp #\Rubout) ⇒  true
++
++ ++

See Also::

++ ++

character ++ (type and function), ++typep ++

++

Notes::

++ ++
++
 (characterp object) ≡ (typep object 'character)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/check_002dtype.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++check-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.13 check-type [Macro]

++ ++

check-type place typespec [string]nil ++

++

Arguments and Values::

++ ++

place—a place. ++

++

typespec—a type specifier. ++

++

string—a string; evaluated. ++

++

Description::

++ ++

check-type signals a correctable error ++of type type-error if the contents of place are not ++of the type typespec. ++

++

check-type can return only if the store-value restart is invoked, ++either explicitly from a handler ++ or implicitly as one of the options offered by the debugger. ++If the store-value restart is invoked, ++check-type stores the new value ++that is the argument to the restart invocation ++(or that is prompted for interactively by the debugger) ++in place and starts over, ++checking the type of the new value ++and signaling another error if it is still not of the desired type. ++

++

The first time place is evaluated, ++it is evaluated by normal evaluation rules. ++It is later evaluated as a place ++if the type check fails and the store-value restart is used; ++see Evaluation of Subforms to Places. ++

++

string should be an English description of the type, ++starting with an indefinite article (“a” or “an”). ++If string is not supplied, ++it is computed automatically from typespec. ++The automatically generated message mentions ++ place, ++ its contents, ++ and the desired type. ++An implementation may choose to generate ++a somewhat differently worded error message ++if it recognizes that place is of a particular form, ++such as one of the arguments to the function that called check-type. ++string is allowed because some applications of check-type ++may require a more specific description of what is wanted ++than can be generated automatically from typespec. ++

++

Examples::

++ ++
++
 (setq aardvarks '(sam harry fred))
++⇒  (SAM HARRY FRED)
++ (check-type aardvarks (array * (3)))
++ |>  Error: The value of AARDVARKS, (SAM HARRY FRED),
++ |>         is not a 3-long array.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use instead.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Use Value: |>>#(SAM FRED HARRY)<<|
++⇒  NIL
++ aardvarks
++⇒  #<ARRAY-T-3 13571>
++ (map 'list #'identity aardvarks)
++⇒  (SAM FRED HARRY)
++ (setq aardvark-count 'foo)
++⇒  FOO
++ (check-type aardvark-count (integer 0 *) "A positive integer")
++ |>  Error: The value of AARDVARK-COUNT, FOO, is not a positive integer.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use instead.
++ |>   2: Top level.
++ |>  Debug> |>>:CONTINUE 2<<|
++
++ ++
++
 (defmacro define-adder (name amount)
++   (check-type name (and symbol (not null)) "a name for an adder function")
++   (check-type amount integer)
++   `(defun ,name (x) (+ x ,amount)))
++
++ (macroexpand '(define-adder add3 3))
++⇒  (defun add3 (x) (+ x 3))
++
++ (macroexpand '(define-adder 7 7))
++ |>  Error: The value of NAME, 7, is not a name for an adder function.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use instead.
++ |>   2: Top level.
++ |>  Debug> |>>:Continue 1<<|
++ |>  Specify a value to use instead.
++ |>  Type a form to be evaluated and used instead: |>>'ADD7<<|
++⇒  (defun add7 (x) (+ x 7))
++
++ (macroexpand '(define-adder add5 something))
++ |>  Error: The value of AMOUNT, SOMETHING, is not an integer.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use instead.
++ |>   2: Top level.
++ |>  Debug> |>>:Continue 1<<|
++ |>  Type a form to be evaluated and used instead: |>>5<<|
++⇒  (defun add5 (x) (+ x 5))
++
++
++ ++

Control is transferred to a handler. ++

++

Side Effects::

++ ++

The debugger might be entered. ++

++

Affected By::

++ ++

*break-on-signals* ++

++

The implementation. ++

++

See Also::

++ ++

Condition System Concepts ++

++

Notes::

++ ++
++
 (check-type place typespec)
++ ≡ (assert (typep place 'typespec) (place)
++            'type-error :datum place :expected-type 'typespec)
++
++ ++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cis.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++cis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.45 cis [Function]

++ ++

cis radiansnumber ++

++

Arguments and Values::

++ ++

radians—a real. ++

++

number—a complex. ++

++

Description::

++ ++

cis returns the value of~e^i\cdot radians, ++which is a complex in which the ++real part is equal to the cosine of radians, and the ++imaginary part is equal to the sine of radians. ++

++

Examples::

++
++
 (cis 0) ⇒  #C(1.0 0.0)
++
++ ++

See Also::

++ ++

Rule of Float Substitutability ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/class.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.7 class [System Class]

++ ++

Class Precedence List::

++

class, ++

++

standard-object, ++

++

t ++

++

Description::

++ ++

The type class represents objects that determine the structure ++and behavior of their instances. Associated with an object ++of type class is information describing its place in the ++directed acyclic graph of classes, its slots, and its options. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/class_002dname.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++class-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.37 class-name [Standard Generic Function]

++ ++

Syntax::

++ ++

class-name classname ++

++

Method Signatures::

++ ++

class-name (class class) ++

++

Arguments and Values::

++ ++

class—a class object. ++

++

name—a symbol. ++

++

Description::

++ ++

Returns the name of the given class. ++

++

See Also::

++ ++

find-class ++, ++Classes ++

++

Notes::

++ ++

If S is a symbol such that S =(class-name C) ++and C =(find-class S), then S is the proper name of C. ++For further discussion, see Classes. ++

++

The name of an anonymous class is nil. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/class_002dof.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++class-of (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.39 class-of [Function]

++ ++

class-of objectclass ++

++

Arguments and Values::

++ ++

object—an object. ++

++

class—a class object. ++

++

Description::

++ ++

Returns the class of which the object is ++a direct instance. ++

++

Examples::

++ ++
++
 (class-of 'fred) ⇒  #<BUILT-IN-CLASS SYMBOL 610327300>
++ (class-of 2/3) ⇒  #<BUILT-IN-CLASS RATIO 610326642>
++
++ (defclass book () ()) ⇒  #<STANDARD-CLASS BOOK 33424745>
++ (class-of (make-instance 'book)) ⇒  #<STANDARD-CLASS BOOK 33424745>
++
++ (defclass novel (book) ()) ⇒  #<STANDARD-CLASS NOVEL 33424764>
++ (class-of (make-instance 'novel)) ⇒  #<STANDARD-CLASS NOVEL 33424764>
++
++ (defstruct kons kar kdr) ⇒  KONS
++ (class-of (make-kons :kar 3 :kdr 4)) ⇒  #<STRUCTURE-CLASS KONS 250020317>
++
++ ++

See Also::

++ ++

make-instance ++, ++type-of ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/clear_002dinput.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++clear-input (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.35 clear-input [Function]

++ ++

clear-input &optional input-streamnil ++

++

Arguments and Values::

++ ++

input-stream—an input stream designator. ++ The default is standard input. ++

++

Description::

++ ++

Clears any available input from input-stream. ++

++

If clear-input does not make sense for input-stream, ++then clear-input does nothing. ++

++

Examples::

++
++
;; The exact I/O behavior of this example might vary from implementation
++;; to implementation depending on the kind of interactive buffering that
++;; occurs.  (The call to SLEEP here is intended to help even out the 
++;; differences in implementations which do not do line-at-a-time buffering.)
++
++(defun read-sleepily (&optional (clear-p nil) (zzz 0))
++  (list (progn (print '>) (read))
++        ;; Note that input typed within the first ZZZ seconds 
++        ;; will be discarded.
++        (progn (print '>) 
++               (if zzz (sleep zzz))
++               (print '>>)
++               (if clear-p (clear-input))
++               (read))))
++
++(read-sleepily)
++ |>  > |>>10<<|
++ |>  >
++ |>  >> |>>20<<|
++⇒  (10 20)
++
++(read-sleepily t)
++ |>  > |>>10<<|
++ |>  >
++ |>  >> |>>20<<|
++⇒  (10 20)
++
++(read-sleepily t 10)
++ |>  > |>>10<<|
++ |>  > |>>20<<|  ; Some implementations won't echo typeahead here.
++ |>  >> |>>30<<|
++⇒  (10 30)
++
++ ++

Side Effects::

++ ++

The input-stream is modified. ++

++

Affected By::

++ ++

*standard-input* ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if input-stream is not a stream designator. ++

++

See Also::

++ ++

clear-output ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/close.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++close (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.32 close [Function]

++ ++

close stream &key abortresult ++

++

Arguments and Values::

++ ++

stream—a stream (either open or closed). ++

++

abort—a generalized boolean. ++ The default is false. ++

++

resultt if the stream was open at the time it was ++ received as an argument, ++ or implementation-dependent otherwise. ++

++

Description::

++ ++

close closes stream. ++Closing a stream means ++that it may no longer be used in input or output operations. ++The act of closing a file stream ++ends the association between the stream and its associated file; ++the transaction with the file system is terminated, ++and input/output may no longer be performed on the stream. ++

++

If abort is true, an attempt is made to clean up any side ++effects of having created stream. ++If stream performs output to a file ++that was created when the stream was created, the ++file is deleted and any previously existing file is not superseded. ++

++

It is permissible to close an already closed stream, ++but in that case the result is implementation-dependent. ++

++

After stream is closed, it is still possible to perform ++the following query operations upon it: ++

++

streamp, pathname, truename, ++merge-pathnames, pathname-host, pathname-device, ++pathname-directory,pathname-name, ++pathname-type, pathname-version, namestring, ++file-namestring, directory-namestring, ++host-namestring, enough-namestring, open, ++probe-file, and directory. ++

++

The effect of close on a constructed stream is ++ to close the argument stream only. ++There is no effect on the constituents of composite streams. ++

++

For a stream created with make-string-output-stream, ++the result of get-output-stream-string is unspecified after close. ++

++

Examples::

++ ++
++
 (setq s (make-broadcast-stream)) ⇒  #<BROADCAST-STREAM>
++ (close s) ⇒  T
++ (output-stream-p s) ⇒  true
++
++ ++

Side Effects::

++ ++

The stream is closed (if necessary). ++If abort is true and the stream is ++an output file stream, its associated file ++might be deleted. ++

++

See Also::

++ ++

open ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/clrhash.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++clrhash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.13 clrhash [Function]

++ ++

clrhash hash-tablehash-table ++

++

Arguments and Values::

++ ++

hash-table—a hash table. ++

++

Description::

++ ++

Removes all entries from hash-table, ++and then returns that empty hash table. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32004073>
++ (dotimes (i 100) (setf (gethash i table) (format nil "~R" i))) ⇒  NIL
++ (hash-table-count table) ⇒  100
++ (gethash 57 table) ⇒  "fifty-seven", true
++ (clrhash table) ⇒  #<HASH-TABLE EQL 0/120 32004073>
++ (hash-table-count table) ⇒  0
++ (gethash 57 table) ⇒  NIL, false
++
++ ++

Side Effects::

++ ++

The hash-table is modified. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/code_002dchar.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++code-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.18 code-char [Function]

++ ++

code-char codechar-p ++

++

Arguments and Values::

++ ++

code—a character code. ++

++

char-p—a character or nil. ++

++

Description::

++ ++

Returns a character with the code attribute given by code. ++If no such character exists and one cannot be created, nil is returned. ++

++

Examples::

++ ++
++
(code-char 65.) ⇒  #\A  ;in an implementation using ASCII codes
++(code-char (char-code #\Space)) ⇒  #\Space  ;in any implementation
++
++ ++

Affected By::

++ ++

The implementation’s character encoding. ++

++

See Also::

++ ++

char-code ++

++

Notes::

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/coerce.html +@@ -0,0 +1,220 @@ ++ ++ ++ ++ ++ ++coerce (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.24 coerce [Function]

++ ++

coerce object result-typeresult ++

++

Arguments and Values::

++ ++

object—an object. ++

++

result-type—a type specifier. ++

++

result—an object, of type result-type ++ except in situations described in Rule of Canonical Representation for Complex Rationals. ++

++

Description::

++ ++

Coerces the object to type result-type. ++

++

If object is already of type result-type, ++the object itself is returned, regardless of whether it ++would have been possible in general to coerce an object of ++some other type to result-type. ++

++

Otherwise, the object is coerced to type result-type ++according to the following rules: ++

++
++
sequence
++
++

If the result-type is a recognizable subtype of list, ++and the object is a sequence, ++then the result is a list ++that has the same elements as object. ++

++

If the result-type is a recognizable subtype of vector, ++and the object is a sequence, ++then the result is a vector ++that has the same elements as object. ++If result-type is a specialized type, ++the result has an actual array element type that is the result of ++upgrading the element type part of that specialized type. ++If no element type is specified, the element type defaults to t. ++If the implementation cannot determine the element type, an error is signaled. ++

++
++
character
++

If the result-type is character ++and the object is a character designator, ++the result is the character it denotes. ++

++
++
complex
++

If the result-type is complex ++and the object is a number, ++then the result is obtained by constructing a complex ++whose real part is the object and ++whose imaginary part is the result of coercing an integer zero ++to the type of the object (using coerce). ++(If the real part is a rational, however, ++then the result must be represented as a rational rather ++than a complex; see Rule of Canonical Representation for Complex Rationals. ++So, for example, (coerce 3 'complex) is permissible, ++but will return 3, which is not a complex.) ++

++
++
float
++

If the result-type is any of float, ++ short-float, ++ single-float, ++ double-float, ++ long-float, ++and the object is a ++

++

real, ++

++

then the result is a float of type result-type ++which is equal in sign and magnitude to the object to whatever degree of ++representational precision is permitted by that float representation. ++(If the result-type is float ++and object is not already a float, ++then the result is a single float.) ++

++
++
function
++

If the result-type is function, ++and object is any ++

++

function name ++

++

that is fbound ++but that is globally defined neither as a macro name nor as a special operator, ++then the result is the functional value of object. ++

++

If the result-type is function, ++and object is a lambda expression, ++then the result is a closure of object ++in the null lexical environment. ++

++
++
t
++

Any object can be coerced to an object of type t. ++In this case, the object is simply returned. ++

++
++
++ ++

Examples::

++ ++
++
 (coerce '(a b c) 'vector) ⇒  #(A B C)
++ (coerce 'a 'character) ⇒  #\A
++ (coerce 4.56 'complex) ⇒  #C(4.56 0.0)
++ (coerce 4.5s0 'complex) ⇒  #C(4.5s0 0.0s0)
++ (coerce 7/2 'complex) ⇒  7/2
++ (coerce 0 'short-float) ⇒  0.0s0
++ (coerce 3.5L0 'float) ⇒  3.5L0
++ (coerce 7/2 'float) ⇒  3.5
++ (coerce (cons 1 2) t) ⇒  (1 . 2)
++
++ ++

All the following forms should signal an error: ++

++
++
 (coerce '(a b c) '(vector * 4))
++ (coerce #(a b c) '(vector * 4))
++ (coerce '(a b c) '(vector * 2))
++ (coerce #(a b c) '(vector * 2))
++ (coerce "foo" '(string 2))
++ (coerce #(#\a #\b #\c) '(string 2))
++ (coerce '(0 1) '(simple-bit-vector 3))
++
++ ++

Exceptional Situations::

++ ++

If a coercion is not possible, an error of type type-error is signaled. ++

++

(coerce x 'nil) always signals an error of type type-error. ++

++

An error ++of type error is signaled ++if the result-type is function but ++object is a symbol that is not fbound or ++if the symbol names a macro or a special operator. ++

++

An error of type type-error should be signaled if result-type ++specifies the number of elements and object is of a different length. ++

++

See Also::

++ ++

rational (Function) ++, ++floor ++, ++char-code ++, ++char-int ++

++

Notes::

++ ++

Coercions from floats to rationals ++and from ratios to integers ++are not provided because of rounding problems. ++

++
++
 (coerce x 't) ≡ (identity x) ≡ x
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compile.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++compile (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.3 compile [Function]

++ ++

compile name &optional definitionfunction, warnings-p, failure-p ++

++

Arguments and Values::

++ ++

name—a function name, or nil. ++

++

definition—a lambda expression or a function. ++ The default is the function definition of name if it names a function, ++ or the macro function of name if it names a macro. ++ The consequences are undefined if no definition is supplied ++ when the name is nil. ++

++

function—the function-name, ++

++

or a compiled function. ++

++

warnings-p—a generalized boolean. ++

++

failure-p—a generalized boolean. ++

++

Description::

++ ++

Compiles an interpreted function. ++

++

compile produces a compiled function from definition. ++If the definition is a lambda expression, ++it is coerced to a function. ++

++

If the definition is already a compiled function, ++compile either produces that function itself (i.e., is an identity operation) ++or an equivalent function. ++

++

[Editorial Note by KMP: There are a number of ambiguities here that still need resolution.] ++If the name is nil, ++the resulting compiled function is returned directly as the primary value. ++If a non-nil name is given, ++then the resulting compiled function replaces ++the existing function definition of name ++and the name is returned as the primary value; ++if name is a symbol that names a macro, ++its macro function is updated ++and the name is returned as the primary value. ++

++

Literal objects appearing in code processed by ++the compile function are neither copied nor coalesced. ++The code resulting from the execution of compile ++references objects that are eql to the corresponding ++objects in the source code. ++

++

compile is permitted, but not required, to establish ++a handler for conditions of type error. ++For example, the handler might issue a warning and ++restart compilation from some implementation-dependent point ++in order to let the compilation proceed without manual intervention. ++

++

The secondary value, warnings-p, is false ++if no conditions of type error or warning ++were detected by the compiler, and true otherwise. ++

++

The tertiary value, failure-p, is false ++if no conditions of type error or warning ++(other than style-warning) ++were detected by the compiler, and true otherwise. ++

++

Examples::

++ ++
++
 (defun foo () "bar") ⇒  FOO
++ (compiled-function-p #'foo) ⇒  implementation-dependent
++ (compile 'foo) ⇒  FOO 
++ (compiled-function-p #'foo) ⇒  true
++ (setf (symbol-function 'foo)
++       (compile nil '(lambda () "replaced"))) ⇒  #<Compiled-Function>
++ (foo) ⇒  "replaced"
++
++ ++

Affected By::

++ ++

*error-output*, ++

++

*macroexpand-hook*. ++

++

The presence of macro definitions and proclamations. ++

++

Exceptional Situations::

++ ++

The consequences are undefined if the lexical environment surrounding the ++function to be compiled contains any bindings other than those for ++macros, symbol macros, or declarations. ++

++

For information about errors detected during the compilation process, ++see Exceptional Situations in the Compiler. ++

++

See Also::

++ ++

compile-file ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compile_002dfile.html +@@ -0,0 +1,197 @@ ++ ++ ++ ++ ++ ++compile-file (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2.1 compile-file [Function]

++ ++

compile-file input-file &key output-file verbose ++ print external-format
++ ⇒ output-truename, warnings-p, failure-p ++

++

Arguments and Values::

++ ++

input-file—a pathname designator. ++ (Default fillers for unspecified components are taken from ++ *default-pathname-defaults*.) ++

++

output-file—a pathname designator. ++ The default is implementation-defined. ++

++

verbose—a generalized boolean. ++ The default is the value of *compile-verbose*. ++

++

print—a generalized boolean. ++ The default is the value of *compile-print*. ++

++

external-format—an external file format designator. ++ The default is :default. ++

++

output-truename—a pathname (the truename of the output file), ++ or nil. ++

++

warnings-p—a generalized boolean. ++

++

failure-p—a generalized boolean. ++

++

Description::

++ ++

compile-file transforms the contents of the file specified ++by input-file into implementation-dependent binary data ++which are placed in the file specified by output-file. ++

++

The file to which input-file refers should be a source file. ++output-file can be used to specify an output pathname; ++

++

the actual pathname of the compiled file ++to which compiled code will be output ++is computed as if by calling compile-file-pathname. ++

++

If input-file or output-file is a logical pathname, ++it is translated into a physical pathname as if by calling ++translate-logical-pathname. ++

++

If verbose is true, ++compile-file prints a message in the form of a comment ++(i.e., with a leading semicolon) ++to standard output indicating what file is being compiled ++and other useful information. ++If verbose is false, ++compile-file does not print ++this information. ++

++

If print is true, ++information about top level forms in the file being ++compiled is printed to standard output. ++Exactly what is printed is implementation-dependent, ++but nevertheless some information is printed. ++If print is nil, no information is printed. ++

++

The external-format specifies the external file format ++to be used when opening the file; see the function open. ++compile-file and load must cooperate in such a way that ++the resulting compiled file can be loaded ++without specifying an external file format anew; see the function load. ++

++

compile-file binds *readtable* and *package* ++to the values they held before processing the file. ++

++

*compile-file-truename* is bound by compile-file ++to hold the truename of the pathname of the file being compiled. ++

++

*compile-file-pathname* is bound by compile-file ++to hold a pathname denoted by the first argument to compile-file, ++merged against the defaults; ++that is, (pathname (merge-pathnames input-file)). ++

++

The compiled functions contained in the compiled file become available ++for use when the compiled file is loaded into Lisp. ++

++

Any function definition that is processed by the ++compiler, including #'(lambda ...) forms and local function ++definitions made by flet, labels and defun forms, ++result in an object of type compiled-function. ++

++

The primary value returned by compile-file, output-truename, ++is the truename of the output file, or nil if the file could not be created. ++

++

The secondary value, warnings-p, is false ++if no conditions of type error or warning ++were detected by the compiler, and true otherwise. ++

++

The tertiary value, failure-p, is false ++if no conditions of type error or warning ++(other than style-warning) ++were detected by the compiler, and true otherwise. ++

++

For general information about how files are processed by the file compiler, ++see File Compilation. ++

++

Programs to be compiled by the file compiler must only contain ++externalizable objects; for details on such objects, ++see Literal Objects in Compiled Files. ++For information on how to extend the set of externalizable objects, ++see the function make-load-form and Additional Constraints on Externalizable Objects. ++

++

Affected By::

++ ++

*error-output*, ++

++

*standard-output*, *compile-verbose*, *compile-print* ++

++

The computer’s file system. ++

Exceptional Situations::

++ ++

For information about errors detected during the compilation process, ++see Exceptional Situations in the Compiler. ++

++

An error of type file-error might be signaled if ++(wild-pathname-p input-file)\/ returns true. ++

++

If either the attempt to open the source file for input ++ or the attempt to open the compiled file for output ++fails, ++an error of type file-error is signaled. ++

++

See Also::

++ ++

compile ++, ++declare, ++eval-when ++, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compile_002dfile_002dpathname.html +@@ -0,0 +1,116 @@ ++ ++ ++ ++ ++ ++compile-file-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: System Construction Dictionary  

++
++
++

24.2.2 compile-file-pathname [Function]

++ ++

compile-file-pathname input-file &key output-file &allow-other-keyspathname ++

++

Arguments and Values::

++ ++

input-file—a pathname designator. ++ (Default fillers for unspecified components are taken from ++ *default-pathname-defaults*.) ++

++

output-file—a pathname designator. ++ The default is implementation-defined. ++

++

pathname—a pathname. ++

++

Description::

++ ++

Returns the pathname that compile-file would write into, ++if given the same arguments. ++

++

The defaults for the output-file ++are taken from the pathname ++that results from merging the input-file ++with the value of *default-pathname-defaults*, ++except that the type component ++should default to the appropriate ++implementation-defined default type for compiled files. ++

++

If input-file is a logical pathname and output-file ++is unsupplied, the result is a logical pathname. ++

++

If input-file is a logical pathname, ++it is translated into a physical pathname as if by calling ++translate-logical-pathname. ++

++

If input-file is a stream, ++the stream can be either open or closed. ++compile-file-pathname returns the same pathname after a ++file is closed as it did when the file was open. ++

++

It is an error if input-file is a stream that is ++created with make-two-way-stream, make-echo-stream, ++make-broadcast-stream, make-concatenated-stream, ++make-string-input-stream, make-string-output-stream. ++

++

If an implementation supports additional keyword arguments to compile-file, ++compile-file-pathname must accept the same arguments. ++

++

Examples::

++ ++

See logical-pathname-translations. ++

++

Exceptional Situations::

++ ++

An error of type file-error might be signaled if either input-file or ++output-file is wild. ++

++

See Also::

++ ++

compile-file ++, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compiled_002dfunction.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++compiled-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.4 compiled-function [Type]

++ ++

Supertypes::

++ ++

compiled-function, ++function, ++t ++

++

Description::

++ ++

Any function may be considered by an implementation to be a ++a compiled function if it contains no references to macros that ++must be expanded at run time, and it contains no unresolved references ++to load time values. See Compilation Semantics. ++

++

Functions whose definitions appear lexically within a ++file that has been compiled with compile-file and then ++loaded with load are of type compiled-function. ++

++

Functions produced by the compile function ++are of type compiled-function. ++

++

Other functions might also be of type compiled-function. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compiled_002dfunction_002dp.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++compiled-function-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.11 compiled-function-p [Function]

++ ++

compiled-function-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type compiled-function; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (defun f (x) x) ⇒  F
++ (compiled-function-p #'f)
++⇒  false
++ORtrue
++ (compiled-function-p 'f) ⇒  false
++ (compile 'f) ⇒  F
++ (compiled-function-p #'f) ⇒  true
++ (compiled-function-p 'f) ⇒  false
++ (compiled-function-p (compile nil '(lambda (x) x)))
++⇒  true
++ (compiled-function-p #'(lambda (x) x))
++⇒  false
++ORtrue
++ (compiled-function-p '(lambda (x) x)) ⇒  false
++
++ ++

See Also::

++ ++

compile ++, ++compile-file ++, ++compiled-function ++

++

Notes::

++ ++
++
 (compiled-function-p object) ≡ (typep object 'compiled-function)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compiler_002dmacro_002dfunction.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++compiler-macro-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.8 compiler-macro-function [Accessor]

++ ++

compiler-macro-function name &optional environmentfunction ++

++

(setf ( compiler-macro-function name &optional environment) new-function)
++

++

Arguments and Values::

++ ++

name—a function name. ++

++

environment—an environment object. ++

++

function, new-function—a compiler macro function, or nil. ++

++

Description::

++ ++

Accesses the compiler macro function named name, if any, ++in the environment. ++

++

A value of nil denotes the absence of a compiler macro function named name. ++

++

Exceptional Situations::

++ ++

The consequences are undefined if environment is non-nil ++in a use of setf of compiler-macro-function. ++

++

See Also::

++ ++

define-compiler-macro ++, Compiler Macros ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/complement.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++complement (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.38 complement [Function]

++ ++

complement functioncomplement-function ++

++

Arguments and Values::

++ ++

function—a function. ++

++

complement-function—a function. ++

++

Description::

++ ++

Returns a function that ++ takes the same arguments as function, ++ and has the same side-effect behavior as function, ++ but returns only a single value: ++ a generalized boolean with the opposite truth value of that ++ which would be returned as the primary value of function. ++ That is, when the function would have returned ++ true as its primary value ++ the complement-function returns false, ++ and when the function would have returned ++ false as its primary value ++ the complement-function returns true. ++

++

Examples::

++ ++
++
 (funcall (complement #'zerop) 1) ⇒  true
++ (funcall (complement #'characterp) #\A) ⇒  false
++ (funcall (complement #'member) 'a '(a b c)) ⇒  false
++ (funcall (complement #'member) 'd '(a b c)) ⇒  true
++
++ ++

See Also::

++ ++

not ++

++

Notes::

++ ++
++
 (complement x) ≡ #'(lambda (&rest arguments) (not (apply x arguments)))
++
++ ++

In Common Lisp, functions with names like “xxx-if-not” ++are related to functions with names like “xxx-if” ++in that ++

++
++
(xxx-if-not f . arguments) ≡ (xxx-if (complement f) . arguments)
++
++ ++

For example, ++

++
++
 (find-if-not #'zerop '(0 0 3)) ≡
++ (find-if (complement #'zerop) '(0 0 3)) ⇒  3
++
++ ++

Note that since the “xxx-if-notfunctions ++and the :test-not arguments have been deprecated, ++uses of “xxx-iffunctions or ++:test arguments with complement are preferred. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/complex-_0028System-Class_0029.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++complex (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.2 complex [System Class]

++ ++

Class Precedence List::

++

complex, ++number, ++t ++

++

Description::

++ ++

The type complex includes all mathematical complex numbers ++other than those included in the type rational. ++Complexes are ++expressed ++in Cartesian form with a ++real part and an imaginary part, each of which is a real. ++The real part and imaginary part are either both ++rational or both of the same float type. ++The imaginary part can be a float zero, but can never ++be a rational zero, for such a number is always represented ++by Common Lisp as a rational rather than a complex. ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(complex{[typespec | *]}) ++

++

Compound Type Specifier Arguments::

++ ++

typespec—a type specifier that denotes a subtype of type real. ++

++

Compound Type Specifier Description::

++ ++

[Editorial Note by KMP: If you ask me, this definition is a complete mess. Looking at ++issue ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS:UNIFY-UPGRADING does not help me figure ++it out, either. Anyone got any suggestions?] ++

++

Every element of this type is a complex whose ++real part and imaginary part are each of type ++

++

(upgraded-complex-part-type typespec). ++

++

This type encompasses those complexes ++that can result by giving numbers of type typespec ++to complex. ++

++

(complex type-specifier) ++refers to all complexes that can result from giving ++numbers of type type-specifier to the function complex, ++plus all other complexes of the same specialized representation. ++

++

See Also::

++ ++

Rule of Canonical Representation for Complex Rationals, ++Constructing Numbers from Tokens, ++Printing Complexes ++

++

Notes::

++ ++

The input syntax for a complex with real part r and ++imaginary part i is #C(r i). ++For further details, see Standard Macro Characters. ++

++

For every float, n, there is a complex ++which represents the same mathematical number ++and which can be obtained by (COERCE n 'COMPLEX). ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/complex.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++complex (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.46 complex [Function]

++ ++

complex realpart &optional imagpartcomplex ++

++

Arguments and Values::

++ ++

realpart—a real. ++

++

imagpart—a real. ++

++

complex—a rational or a complex. ++

++

Description::

++ ++

complex returns a number ++ whose real part is realpart ++and whose imaginary part is imagpart. ++

++

If realpart is a rational ++and imagpart is the rational number zero, ++the result of complex is realpart, a rational. ++Otherwise, the result is a complex. ++

++

If either realpart or imagpart is a float, ++the non-float is converted to a float ++before the complex is created. ++If imagpart is not supplied, the imaginary part is a ++zero of the same type as realpart; i.e., (coerce 0 (type-of realpart)) is ++effectively used. ++

++

Type upgrading implies a movement upwards in the type ++hierarchy lattice. ++In the case of complexes, the type-specifier ++

++

[Reviewer Note by Barmar: What type specifier?] ++must be a subtype of ++(upgraded-complex-part-type type-specifier). ++If type-specifier1 is a subtype of type-specifier2, then ++(upgraded-complex-element-type 'type-specifier1) ++must also be a subtype of ++(upgraded-complex-element-type 'type-specifier2). ++Two disjoint types can be upgraded into ++the same thing. ++

++

Examples::

++
++
 (complex 0) ⇒  0
++ (complex 0.0) ⇒  #C(0.0 0.0)
++ (complex 1 1/2) ⇒  #C(1 1/2)
++ (complex 1 .99) ⇒  #C(1.0 0.99)
++ (complex 3/2 0.0) ⇒  #C(1.5 0.0)
++
++ ++

See Also::

++ ++

realpart ++, imagpart ++

++

Notes::

++ ++
++
 #c(a b) ≡ #.(complex a b)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/complexp.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++complexp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.47 complexp [Function]

++ ++

complexp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type complex; ++otherwise, returns false. ++

++

Examples::

++
++
 (complexp 1.2d2) ⇒  false
++ (complexp #c(5/3 7.2)) ⇒  true
++
++
++ ++

See Also::

++ ++

complex ++ (function and type), ++typep ++

++

Notes::

++ ++
++
 (complexp object) ≡ (typep object 'complex)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compute_002dapplicable_002dmethods.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++compute-applicable-methods (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.32 compute-applicable-methods [Standard Generic Function]

++ ++

Syntax::

++ ++

compute-applicable-methods generic-function function-argumentsmethods ++

++

Method Signatures::

++ ++

compute-applicable-methods (generic-function standard-generic-function) ++

++

Arguments and Values::

++ ++

generic-function—a generic function. ++

++

function-arguments—a list of arguments for the generic-function. ++

++

methods—a list of method objects. ++

++

Description::

++ ++

Given a generic-function and a set of ++function-arguments, the function ++compute-applicable-methods returns the set of methods ++that are applicable for those arguments ++sorted according to precedence order. ++See Method Selection and Combination. ++

++

Affected By::

++ ++

defmethod ++

++

See Also::

++ ++

Method Selection and Combination ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/compute_002drestarts.html +@@ -0,0 +1,141 @@ ++ ++ ++ ++ ++ ++compute-restarts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.32 compute-restarts [Function]

++ ++

compute-restarts &optional conditionrestarts ++

++

Arguments and Values::

++ ++

condition—a condition object, or nil. ++

++

restarts—a list of restarts. ++

++

Description::

++ ++

compute-restarts uses the dynamic state of the program to compute ++a list of the restarts which are currently active. ++

++

The resulting list is ordered so that the innermost ++(more-recently established) restarts are nearer the head of the list. ++

++

When condition is non-nil, only those restarts ++are considered that are either explicitly associated with that condition, ++or not associated with any condition; that is, the excluded restarts ++are those that are associated with a non-empty set of conditions of ++which the given condition is not an element. ++If condition is nil, all restarts are considered. ++

++

compute-restarts returns all ++applicable restarts, ++including anonymous ones, even if some of them have the same name as ++others and would therefore not be found by find-restart ++when given a symbol argument. ++

++

Implementations are permitted, but not required, to return distinct ++lists from repeated calls to compute-restarts while in ++the same dynamic environment. ++The consequences are undefined if the list returned by ++compute-restarts is every modified. ++

++

Examples::

++ ++
++
 ;; One possible way in which an interactive debugger might present
++ ;; restarts to the user.
++ (defun invoke-a-restart ()
++   (let ((restarts (compute-restarts)))
++     (do ((i 0 (+ i 1)) (r restarts (cdr r))) ((null r))
++       (format t "~&~D: ~A~
++     (let ((n nil) (k (length restarts)))
++       (loop (when (and (typep n 'integer) (>= n 0) (< n k))
++               (return t))
++             (format t "~&Option: ")
++             (setq n (read))
++             (fresh-line))
++       (invoke-restart-interactively (nth n restarts)))))
++
++ (restart-case (invoke-a-restart)
++   (one () 1)
++   (two () 2)
++   (nil () :report "Who knows?" 'anonymous)
++   (one () 'I)
++   (two () 'II))
++ |>  0: ONE
++ |>  1: TWO
++ |>  2: Who knows?
++ |>  3: ONE
++ |>  4: TWO
++ |>  5: Return to Lisp Toplevel.
++ |>  Option: |>>4<<|
++⇒  II
++
++ ;; Note that in addition to user-defined restart points, COMPUTE-RESTARTS
++ ;; also returns information about any system-supplied restarts, such as
++ ;; the "Return to Lisp Toplevel" restart offered above.
++
++
++ ++

Affected By::

++ ++

Existing restarts. ++

++

See Also::

++ ++

find-restart ++, ++invoke-restart ++, ++restart-bind ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/concatenate.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++concatenate (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.20 concatenate [Function]

++ ++

concatenate result-type &rest sequencesresult-sequence ++

++

Arguments and Values::

++ ++

result-type—a sequence type specifier. ++

++

sequences—a sequence. ++

++

result-sequence—a proper sequence of type result-type. ++

++

Description::

++ ++

concatenate returns a sequence that contains ++all the individual elements of all the sequences in the order ++that they are supplied. ++The sequence is of type result-type, ++which must be a subtype of type sequence. ++

++

All of the sequences are copied from; the result ++does not share any structure with any of the sequences. ++Therefore, if only one sequence is provided ++and it is of type result-type, ++concatenate is required to copy sequence rather than simply ++returning it. ++

++

It is an error if any element of the sequences cannot be an ++element of the sequence result. ++

++

[Reviewer Note by Barmar: Should signal?] ++

++

If the result-type is a subtype of list, ++the result will be a list. ++

++

If the result-type is a subtype of vector, ++then if the implementation can determine the element type specified ++for the result-type, the element type of the resulting array ++is the result of upgrading that element type; or, if the ++implementation can determine that the element type is unspecified (or *), ++the element type of the resulting array is t; ++otherwise, an error is signaled. ++

++

Examples::

++ ++
++
(concatenate 'string "all" " " "together" " " "now") ⇒  "all together now"
++(concatenate 'list "ABC" '(d e f) #(1 2 3) #*1011)
++⇒  (#\A #\B #\C D E F 1 2 3 1 0 1 1)
++(concatenate 'list) ⇒  NIL
++
++ ++
++
  (concatenate '(vector * 2) "a" "bc") should signal an error
++
++ ++

Exceptional Situations::

++ ++

An error is signaled if the result-type is neither ++ a recognizable subtype of list, ++ nor a recognizable subtype of vector. ++

++

An error of type type-error should be signaled if result-type ++specifies the number of elements and the sum of sequences ++is different from that number. ++

++

See Also::

++ ++

append ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/concatenated_002dstream.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++concatenated-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.3 concatenated-stream [System Class]

++ ++

Class Precedence List::

++ ++

concatenated-stream, ++stream, ++t ++

++

Description::

++ ++

A concatenated stream is an input stream which ++is a composite stream of zero or more other input streams, ++such that the sequence of data which can be read from the ++concatenated stream is the same as the concatenation of the ++sequences of data which could be read from each of the ++constituent streams. ++

++

Input from a concatenated stream is taken from the first ++of the associated input streams until it reaches end of file_1; ++then that stream is discarded, and subsequent input is taken ++from the next input stream, and so on. ++An end of file on the associated input streams is always managed ++invisibly by the concatenated stream—the only time a client of ++a concatenated stream sees an end of file is when an attempt is ++made to obtain data from the concatenated stream but it has no ++remaining input streams from which to obtain such data. ++

++

See Also::

++ ++

concatenated-stream-streams ++, ++make-concatenated-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/concatenated_002dstream_002dstreams.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++concatenated-stream-streams (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.46 concatenated-stream-streams [Function]

++ ++

concatenated-stream-streams concatenated-streamstreams ++

++

Arguments and Values::

++ ++

concatenated-stream – a concatenated stream. ++

++

streams—a list of input streams. ++

++

Description::

++ ++

Returns a list of input streams that constitute the ++ordered set of streams the concatenated-stream still ++has to read from, starting with the current one it is reading from. ++The list may be empty if no more streams remain to be read. ++

++

The consequences are undefined if the list structure of the streams ++is ever modified. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cond.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++cond (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.42 cond [Macro]

++ ++

cond {!clause}*{result}* ++

++

clause ::=(test-form {form}*) ++

++

Arguments and Values::

++ ++

test-form—a form. ++

++

forms—an implicit progn. ++

++

results—the values of the forms ++ in the first clause whose test-form yields true, ++ or the primary value of the test-form ++ if there are no forms in that clause, ++ or else nil if no test-form yields true. ++

++

Description::

++ ++

cond allows the execution of forms to be dependent ++on test-form. ++

++

Test-forms are evaluated one at a time in the order in which ++they are given in the argument list until a test-form is found that ++evaluates to true. ++

++

If there are no forms in that clause, the primary value ++of the test-form is returned by the cond form. ++Otherwise, the forms associated with this test-form are ++evaluated in order, left to right, as an implicit progn, and the ++values returned by the last form ++are returned by the cond form. ++

++

Once one test-form has yielded true, ++no additional test-forms are evaluated. ++If no test-form yields true, nil is returned. ++

++

Examples::

++ ++
++
 (defun select-options ()
++   (cond ((= a 1) (setq a 2))
++         ((= a 2) (setq a 3))
++         ((and (= a 3) (floor a 2)))
++         (t (floor a 3)))) ⇒  SELECT-OPTIONS
++ (setq a 1) ⇒  1
++ (select-options) ⇒  2
++ a ⇒  2
++ (select-options) ⇒  3
++ a ⇒  3
++ (select-options) ⇒  1
++ (setq a 5) ⇒  5
++ (select-options) ⇒  1, 2
++
++ ++

See Also::

++ ++

if ++, ++case ++. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/condition.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.1 condition [Condition Type]

++ ++

[Reviewer Note by Barrett: I think CONDITION-RESTARTS is not fully integrated.] ++

++

Class Precedence List::

++

condition, ++t ++

++

Description::

++ ++

All types of conditions, whether error or ++non-error, must inherit from this type. ++

++

No additional subtype relationships among the specified subtypes of type condition ++are allowed, except when explicitly mentioned in the text; however ++implementations are permitted to introduce additional types ++and one of these types can be a subtype of any ++number of the subtypes of type condition. ++

++

Whether a user-defined condition type has slots ++that are accessible by with-slots is implementation-dependent. ++Furthermore, even in an implementation ++in which user-defined condition types would have slots, ++it is implementation-dependent whether any condition ++types defined in this document have such slots or, ++if they do, what their names might be; ++only the reader functions documented by this specification may be relied ++upon by portable code. ++

++

Conforming code must observe the following restrictions related to ++conditions: ++

++
++
*
++

define-condition, not defclass, must be used ++ to define new condition types. ++

++
++
*
++

make-condition, not make-instance, must be used to ++ create condition objects explicitly. ++

++
++
*
++

The :report option of define-condition, not defmethod ++ for print-object, must be used to define a condition reporter. ++

++
++
*
++

slot-value, slot-boundp, slot-makunbound, ++ and with-slots must not be used on condition objects. ++ Instead, the appropriate accessor functions (defined by define-condition) ++ should be used. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/conjugate.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++conjugate (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.48 conjugate [Function]

++ ++

conjugate numberconjugate ++

++

Arguments and Values::

++ ++

number—a number. ++

++

conjugate—a number. ++

++

Description::

++ ++

Returns the complex conjugate of number. ++The conjugate of a ++

++

real ++

++

number is itself. ++

++

Examples::

++ ++
++
 (conjugate #c(0 -1)) ⇒  #C(0 1)
++ (conjugate #c(1 1)) ⇒  #C(1 -1)
++ (conjugate 1.5) ⇒  1.5
++ (conjugate #C(3/5 4/5)) ⇒  #C(3/5 -4/5)
++ (conjugate #C(0.0D0 -1.0D0)) ⇒  #C(0.0D0 1.0D0)
++ (conjugate 3.7) ⇒  3.7
++
++ ++

Notes::

++ ++

For a complex number z, ++

++
++
 (conjugate z) ≡ (complex (realpart z) (- (imagpart z)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cons-_0028System-Class_0029.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++cons (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.3 cons [System Class]

++ ++

Class Precedence List::

++

cons, ++list, ++sequence, ++t ++

++

Description::

++ ++

A cons is a compound object having two components, ++called the car and cdr. These form a dotted pair. ++Each component can be any object. ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(cons{[car-typespec [cdr-typespec]]}) ++

++

Compound Type Specifier Arguments::

++ ++

car-typespec—a type specifier, ++ or the symbol *. ++ The default is the symbol *. ++

++

cdr-typespec—a type specifier, ++ or the symbol *. ++ The default is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of conses ++whose car is constrained to be of type car-typespec and ++whose cdr is constrained to be of type cdr-typespec. ++(If either car-typespec or cdr-typespec is *, ++ it is as if the type t had been denoted.) ++

++

See Also::

++ ++

Left-Parenthesis, ++Printing Lists and Conses ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/cons.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++cons (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.5 cons [Function]

++ ++

cons object-1 object-2cons ++

++

Arguments and Values::

++ ++

object-1—an object. ++

++

object-2—an object. ++

++

cons—a cons. ++

++

Description::

++ ++

Creates a fresh cons, the car of which is object-1 ++and the cdr of which is object-2. ++

++

Examples::

++ ++
++
 (cons 1 2) ⇒  (1 . 2)
++ (cons 1 nil) ⇒  (1)
++ (cons nil 2) ⇒  (NIL . 2)
++ (cons nil nil) ⇒  (NIL)
++ (cons 1 (cons 2 (cons 3 (cons 4 nil)))) ⇒  (1 2 3 4)
++ (cons 'a 'b) ⇒  (A . B)
++ (cons 'a (cons 'b (cons 'c '()))) ⇒  (A B C)
++ (cons 'a '(b c d)) ⇒  (A B C D)
++
++ ++

See Also::

++ ++

list (Function) ++

++

Notes::

++

If object-2 is a list, cons can be thought of as ++producing a new list which is like it but has object-1 prepended. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/consp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++consp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.6 consp [Function]

++ ++

consp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type cons; ++otherwise, returns false. ++

++

Examples::

++
++
 (consp nil) ⇒  false
++ (consp (cons 1 2)) ⇒  true
++
++ ++

The empty list is not a cons, so ++

++
++
 (consp '()) ≡ (consp 'nil) ⇒  false
++
++ ++

See Also::

++ ++

listp ++

++

Notes::

++ ++
++
 (consp object) ≡ (typep object 'cons) ≡ (not (typep object 'atom)) ≡ (typep object '(not atom))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/constantly.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++constantly (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.39 constantly [Function]

++ ++

constantly valuefunction ++

++

Arguments and Values::

++ ++

value—an object. ++

++

function—a function. ++

++

Description::

++ ++

constantly returns a function that accepts any number of ++arguments, that has no side-effects, and that always returns value. ++

++

Examples::

++ ++
++
 (mapcar (constantly 3) '(a b c d)) ⇒  (3 3 3 3)
++ (defmacro with-vars (vars &body forms)
++   `((lambda ,vars ,@forms) ,@(mapcar (constantly nil) vars)))
++⇒  WITH-VARS
++ (macroexpand '(with-vars (a b) (setq a 3 b (* a a)) (list a b)))
++⇒  ((LAMBDA (A B) (SETQ A 3 B (* A A)) (LIST A B)) NIL NIL), true
++
++ ++

See Also::

++ ++

not ++

++

Notes::

++ ++

constantly could be defined by: ++

++
++
 (defun constantly (object)
++   #'(lambda (&rest arguments) object))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/constantp.html +@@ -0,0 +1,155 @@ ++ ++ ++ ++ ++ ++constantp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.30 constantp [Function]

++ ++

constantp form &optional environmentgeneralized-boolean ++

++

Arguments and Values::

++ ++

form—a form. ++

++

environment—an environment object. ++ The default is nil. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if form can be determined ++by the implementation to be a constant form ++in the indicated environment; ++otherwise, it returns false indicating either ++ that the form is not a constant form ++ or that it cannot be determined whether or not form is a constant form. ++

++

The following kinds of forms are considered constant forms: ++

++
*
++

Self-evaluating objects ++ (such as numbers, ++ characters, ++ and the various kinds of arrays) ++ are always considered constant forms ++ and must be recognized as such by constantp. ++

++
++
*
++

Constant variables, such as keywords, ++ symbols defined by Common Lisp as constant (such as nil, t, and pi), ++ and symbols declared as constant by the user in the indicated environment ++ using defconstant ++ are always considered constant forms ++ and must be recognized as such by constantp. ++

++
++
*
++

quote forms are always considered constant forms ++ and must be recognized as such by constantp. ++

++
++
*
++

An implementation is permitted, but not required, to detect ++ additional constant forms. If it does, it is also permitted, ++ but not required, to make use of information in the environment. ++ Examples of constant forms for which constantp might ++ or might not return true are: ++ (sqrt pi), ++ (+ 3 2), ++ (length '(a b c)), ++ and ++ (let ((x 7)) (zerop x)). ++

++
++ ++

If an implementation chooses to make use of the environment ++information, such actions as expanding macros or performing function ++inlining are permitted to be used, but not required; ++however, expanding compiler macros is not permitted. ++

++

Examples::

++ ++
++
 (constantp 1) ⇒  true
++ (constantp 'temp) ⇒  false
++ (constantp ''temp)) ⇒  true
++ (defconstant this-is-a-constant 'never-changing) ⇒  THIS-IS-A-CONSTANT 
++ (constantp 'this-is-a-constant) ⇒  true
++ (constantp "temp") ⇒  true
++ (setq a 6) ⇒  6 
++ (constantp a) ⇒  true
++ (constantp '(sin pi)) ⇒  implementation-dependent
++ (constantp '(car '(x))) ⇒  implementation-dependent
++ (constantp '(eql x x)) ⇒  implementation-dependent
++ (constantp '(typep x 'nil)) ⇒  implementation-dependent
++ (constantp '(typep x 't)) ⇒  implementation-dependent
++ (constantp '(values this-is-a-constant)) ⇒  implementation-dependent
++ (constantp '(values 'x 'y)) ⇒  implementation-dependent
++ (constantp '(let ((a '(a b c))) (+ (length a) 6))) ⇒  implementation-dependent
++
++ ++

Affected By::

++ ++

The state of the global environment (e.g., which symbols have been ++declared to be the names of constant variables). ++

++

See Also::

++ ++

defconstant ++

++ ++ ++ ++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/continue.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++continue (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.42 continue [Restart]

++ ++

Data Arguments Required::

++ ++

None. ++

++

Description::

++ ++

The continue restart is generally part of protocols where there is ++ a single “obvious” way to continue, such as in ++break and cerror. Some ++ user-defined protocols may also wish to incorporate it for similar reasons. ++ In general, however, it is more reliable to design a special purpose restart ++ with a name that more directly suits the particular application. ++

++

Examples::

++ ++
++
 (let ((x 3))
++   (handler-bind ((error #'(lambda (c)
++                             (let ((r (find-restart 'continue c)))
++                               (when r (invoke-restart r))))))
++     (cond ((not (floatp x))
++            (cerror "Try floating it." "~D is not a float." x)
++            (float x))
++           (t x)))) ⇒  3.0
++
++ ++

See Also::

++ ++

Restarts, ++Interfaces to Restarts, ++invoke-restart ++, ++continue ++ (function), ++assert ++, ++cerror ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/control_002derror.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++control-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.67 control-error [Condition Type]

++ ++

Class Precedence List::

++

control-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type control-error consists of error conditions that result from ++invalid dynamic transfers of control in a program. The errors that ++result from giving throw a tag that is not active or from ++giving go or return-from a tag that is no longer ++dynamically available are of type control-error. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dalist.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++copy-alist (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.37 copy-alist [Function]

++ ++

copy-alist alistnew-alist ++

++

Arguments and Values::

++ ++

alist—an association list. ++

++

new-alist—an association list. ++

++

Description::

++ ++

copy-alist returns a copy of alist. ++

++

The list structure of alist is copied, ++and the elements of alist which are conses are ++also copied (as conses only). ++Any other objects which are referred to, ++whether directly or indirectly, ++by the alist continue to be shared. ++

++

Examples::

++ ++
++
(defparameter *alist* (acons 1 "one" (acons 2 "two" '())))
++*alist* ⇒  ((1 . "one") (2 . "two"))
++(defparameter *list-copy* (copy-list *alist*))
++*list-copy* ⇒  ((1 . "one") (2 . "two"))
++(defparameter *alist-copy* (copy-alist *alist*))
++*alist-copy* ⇒  ((1 . "one") (2 . "two"))
++(setf (cdr (assoc 2 *alist-copy*)) "deux") ⇒  "deux"
++*alist-copy* ⇒  ((1 . "one") (2 . "deux"))
++*alist* ⇒  ((1 . "one") (2 . "two"))
++(setf (cdr (assoc 1 *list-copy*)) "uno") ⇒  "uno"
++*list-copy* ⇒  ((1 . "uno") (2 . "two"))
++*alist* ⇒  ((1 . "uno") (2 . "two"))
++
++ ++

See Also::

++ ++

copy-list ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dlist.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++copy-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.14 copy-list [Function]

++ ++

copy-list listcopy ++

++

Arguments and Values::

++ ++

list—a proper list or a dotted list. ++

++

copy—a list. ++

++

Description::

++ ++

Returns a copy of list. ++If list is a dotted list, ++the resulting list will also be a dotted list. ++

++

Only the list structure of list is copied; ++the elements of the resulting list are ++the same as the corresponding elements of the given list. ++

++

Examples::

++ ++
++
 (setq lst (list 1 (list 2 3))) ⇒  (1 (2 3))
++ (setq slst lst) ⇒  (1 (2 3))
++ (setq clst (copy-list lst)) ⇒  (1 (2 3))
++ (eq slst lst) ⇒  true
++ (eq clst lst) ⇒  false
++ (equal clst lst) ⇒  true
++ (rplaca lst "one") ⇒  ("one" (2 3))
++ slst ⇒  ("one" (2 3))
++ clst ⇒  (1 (2 3))
++ (setf (caadr lst) "two") ⇒  "two"
++ lst ⇒  ("one" ("two" 3))
++ slst ⇒  ("one" ("two" 3))
++ clst ⇒  (1 ("two" 3))
++
++ ++

Exceptional Situations::

++ ++

The consequences are undefined if list is a circular list. ++

++

See Also::

++ ++

copy-alist ++, ++copy-seq ++, ++copy-tree ++

++

Notes::

++ ++

The copy created is equal to list, but not eq. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dpprint_002ddispatch.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++copy-pprint-dispatch (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.1 copy-pprint-dispatch [Function]

++ ++

copy-pprint-dispatch &optional tablenew-table ++

++

Arguments and Values::

++ ++

table—a pprint dispatch table, or nil. ++

++

new-table—a fresh pprint dispatch table. ++

++

Description::

++ ++

Creates and returns a copy of the specified table, ++or of the value of *print-pprint-dispatch* if no table is specified, ++or of the initial value of *print-pprint-dispatch* if nil is specified. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error if table ++is not a pprint dispatch table. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dreadtable.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++copy-readtable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.2 copy-readtable [Function]

++ ++

copy-readtable &optional from-readtable to-readtablereadtable ++

++

Arguments and Values::

++ ++

from-readtable—a readtable designator. ++ The default is the current readtable. ++

++

to-readtable—a readtable or nil. ++ The default is nil. ++

++

readtable—the to-readtable if it is non-nil, ++ or else a fresh readtable. ++

++

Description::

++ ++

copy-readtable copies from-readtable. ++

++

If to-readtable is nil, a new readtable is created and returned. ++Otherwise the readtable specified by to-readtable is modified and returned. ++

++

copy-readtable copies the setting of readtable-case. ++

++

Examples::

++ ++
++
 (setq zvar 123) ⇒  123
++ (set-syntax-from-char #\z #\' (setq table2 (copy-readtable))) ⇒  T
++ zvar ⇒  123
++ (copy-readtable table2 *readtable*) ⇒  #<READTABLE 614000277>
++ zvar ⇒  VAR
++ (setq *readtable* (copy-readtable)) ⇒  #<READTABLE 46210223>
++ zvar ⇒  VAR
++ (setq *readtable* (copy-readtable nil)) ⇒  #<READTABLE 46302670>
++ zvar ⇒  123
++
++ ++

See Also::

++ ++

readtable, ++readtable ++

++

Notes::

++ ++
++
(setq *readtable* (copy-readtable nil))
++
++ ++

restores the input syntax to standard Common Lisp syntax, even if ++the initial readtable has been clobbered ++(assuming it is not so badly clobbered that you cannot type in the above expression). ++

++

On the other hand, ++

++
++
(setq *readtable* (copy-readtable))
++
++ ++

replaces the current readtable with a copy of itself. ++This is useful if you want to save a copy of a readtable for later use, ++protected from alteration in the meantime. It is also useful if you want to ++locally bind the readtable to a copy of itself, as in: ++

++
++
(let ((*readtable* (copy-readtable))) ...)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dseq.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++copy-seq (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.2 copy-seq [Function]

++ ++

copy-seq sequencecopied-sequence ++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

copied-sequence—a proper sequence. ++

++

Description::

++ ++

Creates a copy of sequence. The elements of the new ++sequence are the same as the corresponding elements of ++the given sequence. ++

++

If sequence is a vector, ++the result is a fresh simple array ++of rank one ++that has the same actual array element type as sequence. ++If sequence is a list, ++the result is a fresh list. ++

++

Examples::

++
++
 (setq str "a string") ⇒  "a string"
++ (equalp str (copy-seq str)) ⇒  true
++ (eql str (copy-seq str)) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

copy-list ++

++

Notes::

++ ++

From a functional standpoint, ++

++
 (copy-seq x) ≡ (subseq x 0)
++
++ ++

However, the programmer intent is typically very different in these two cases. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dstructure.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++copy-structure (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Structures Dictionary  

++
++
++

8.1.2 copy-structure [Function]

++ ++

copy-structure structurecopy ++

++

Arguments and Values::

++ ++

structure—a structure. ++

++

copy—a copy of the structure. ++

++

Description::

++ ++

Returns a copy_6 of the structure. ++

++

Only the structure itself is copied; not the values of the slots. ++

++

See Also::

++ ++

the :copier option to ++defstruct ++

++

Notes::

++ ++

The copy is the same as the given structure ++under equalp, but not under equal. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dsymbol.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++copy-symbol (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.6 copy-symbol [Function]

++ ++

copy-symbol symbol &optional copy-propertiesnew-symbol ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

copy-properties—a generalized boolean. ++ The default is false. ++

++

new-symbol—a fresh, uninterned symbol. ++

++

Description::

++ ++

copy-symbol returns a fresh, uninterned symbol, ++the name of which is string= to and possibly the same as ++the name of the given symbol. ++

++

If copy-properties is false, ++the new-symbol is neither bound nor fbound ++and has a null property list. ++If copy-properties is true, then ++the initial value of new-symbol is ++ the value of symbol, ++the initial function definition of new-symbol is ++ the functional value of symbol, ++and the property list of new-symbol is ++

++

a copy_2 of the property list of symbol. ++

++

Examples::

++ ++
++
 (setq fred 'fred-smith) ⇒  FRED-SMITH
++ (setf (symbol-value fred) 3) ⇒  3
++ (setq fred-clone-1a (copy-symbol fred nil)) ⇒  #:FRED-SMITH
++ (setq fred-clone-1b (copy-symbol fred nil)) ⇒  #:FRED-SMITH
++ (setq fred-clone-2a (copy-symbol fred t))   ⇒  #:FRED-SMITH
++ (setq fred-clone-2b (copy-symbol fred t))   ⇒  #:FRED-SMITH
++ (eq fred fred-clone-1a) ⇒  false
++ (eq fred-clone-1a fred-clone-1b) ⇒  false
++ (eq fred-clone-2a fred-clone-2b) ⇒  false
++ (eq fred-clone-1a fred-clone-2a) ⇒  false
++ (symbol-value fred) ⇒  3
++ (boundp fred-clone-1a) ⇒  false
++ (symbol-value fred-clone-2a) ⇒  3
++ (setf (symbol-value fred-clone-2a) 4) ⇒  4
++ (symbol-value fred) ⇒  3
++ (symbol-value fred-clone-2a) ⇒  4
++ (symbol-value fred-clone-2b) ⇒  3
++ (boundp fred-clone-1a) ⇒  false
++ (setf (symbol-function fred) #'(lambda (x) x)) ⇒  #<FUNCTION anonymous>
++ (fboundp fred) ⇒  true
++ (fboundp fred-clone-1a) ⇒  false
++ (fboundp fred-clone-2a) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

make-symbol ++

++

Notes::

++ ++

Implementors are encouraged not to copy the string ++which is the symbol’s name unnecessarily. ++Unless there is a good reason to do so, the normal implementation ++strategy is for the new-symbol’s name to ++be identical to the given symbol’s name. ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/copy_002dtree.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++copy-tree (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.10 copy-tree [Function]

++ ++

copy-tree treenew-tree ++

++

Arguments and Values::

++ ++

tree—a tree. ++

++

new-tree—a tree. ++

++

Description::

++ ++

Creates a copy of a tree of conses. ++

++

If tree is not a cons, it is returned; ++otherwise, the result is a new cons of the results of calling copy-tree ++on the car and cdr of tree. ++In other words, all conses in the tree represented by tree ++are copied recursively, stopping only when non-conses are encountered. ++

++

copy-tree does not preserve circularities and the sharing of substructure. ++

++

Examples::

++ ++
++
 (setq object (list (cons 1 "one")
++                    (cons 2 (list 'a 'b 'c))))
++⇒  ((1 . "one") (2 A B C))
++ (setq object-too object) ⇒  ((1 . "one") (2 A B C))
++ (setq copy-as-list (copy-list object))
++ (setq copy-as-alist (copy-alist object))
++ (setq copy-as-tree (copy-tree object))
++ (eq object object-too) ⇒  true
++ (eq copy-as-tree object) ⇒  false
++ (eql copy-as-tree object) ⇒  false
++ (equal copy-as-tree object) ⇒  true
++ (setf (first (cdr (second object))) "a"
++       (car (second object)) "two"
++       (car object) '(one . 1)) ⇒  (ONE . 1)
++ object ⇒  ((ONE . 1) ("two" "a" B C))
++ object-too ⇒  ((ONE . 1) ("two" "a" B C))
++ copy-as-list ⇒  ((1 . "one") ("two" "a" B C))
++ copy-as-alist ⇒  ((1 . "one") (2 "a" B C))
++ copy-as-tree ⇒  ((1 . "one") (2 A B C)) 
++
++ ++

See Also::

++ ++

tree-equal ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/count.html +@@ -0,0 +1,130 @@ ++ ++ ++ ++ ++ ++count (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.10 count, count-if, count-if-not [Function]

++ ++

count item sequence &key from-end start end key test test-notn ++

++

count-if predicate sequence &key from-end start end keyn ++

++

count-if-not predicate sequence &key from-end start end keyn ++

++

Arguments and Values::

++ ++

item—an object. ++

++

sequence—a proper sequence. ++

++

predicate—a designator for a function of one argument ++ that returns a generalized boolean. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

n—a non-negative integer ++ less than or equal to the length of sequence. ++

++

Description::

++ ++

count, count-if, and count-if-not ++count and return the number of elements in ++the sequence bounded by start and end ++that satisfy the test. ++

++

The from-end has no direct effect on the result. ++However, if from-end is true, ++the elements of sequence will be supplied as arguments to ++ the test, ++ test-not, ++ and key in reverse order, ++which may change the side-effects, if any, of those functions. ++

++

Examples::

++ ++
++
 (count #\a "how many A's are there in here?") ⇒  2
++ (count-if-not #'oddp '((1) (2) (3) (4)) :key #'car) ⇒  2
++ (count-if #'upper-case-p "The Crying of Lot 49" :start 4) ⇒  2 
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

Rules about Test Functions, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++

The function count-if-not is deprecated. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/declaim.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++declaim (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.17 declaim [Macro]

++ ++

declaim {declaration-specifier}*implementation-dependent ++

++

Arguments and Values::

++ ++

declaration-specifier—a declaration specifier; not evaluated. ++

++

Description::

++ ++

Establishes the declarations specified by the declaration-specifiers. ++

++

If a use of this macro appears as a top level form in a file ++being processed by the file compiler, the proclamations are also made ++at compile-time. As with other defining macros, it is unspecified whether or ++not the compile-time side-effects of a declaim persist after the ++file has been compiled. ++

++

Examples::

++ ++

See Also::

++ ++

declare, ++proclaim ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/declaration.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++declaration (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.24 declaration [Declaration]

++ ++

Syntax::

++ ++

(declaration {name}*) ++

++

Arguments::

++ ++

name—a symbol. ++

++

Valid Context::

++ ++

proclamation only ++

++

Description::

++ ++

Advises the compiler that each name is a valid but potentially ++non-standard declaration name. The purpose of this is to tell one ++compiler not to issue warnings for declarations meant for another ++compiler or other program processor. ++

++

Examples::

++ ++
++
 (declaim (declaration author target-language target-machine))
++ (declaim (target-language ada))
++ (declaim (target-machine IBM-650))
++ (defun strangep (x)
++   (declare (author "Harry Tweeker"))
++   (member x '(strange weird odd peculiar)))
++
++ ++

See Also::

++ ++

declaim ++, ++proclaim ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/declare.html +@@ -0,0 +1,175 @@ ++ ++ ++ ++ ++ ++declare (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.18 declare [Symbol]

++ ++

Syntax::

++ ++

declare {declaration-specifier}* ++

Arguments::

++ ++

declaration-specifier—a declaration specifier; not evaluated. ++

++

Description::

++ ++

A declare expression, sometimes called a declaration, ++can occur only at the beginning of the bodies of certain forms; ++that is, it may be preceded only by other declare expressions, ++or by a documentation string if the context permits. ++

++

A declare expression can occur in a lambda expression ++or in any of the forms listed in Figure 3–23. ++

++
++
  defgeneric                 do-external-symbols   prog                      
++  define-compiler-macro      do-symbols            prog*                     
++  define-method-combination  dolist                restart-case              
++  define-setf-expander       dotimes               symbol-macrolet           
++  defmacro                   flet                  with-accessors            
++  defmethod                  handler-case          with-hash-table-iterator  
++  defsetf                    labels                with-input-from-string    
++  deftype                    let                   with-open-file            
++  defun                      let*                  with-open-stream          
++  destructuring-bind         locally               with-output-to-string     
++  do                         macrolet              with-package-iterator     
++  do*                        multiple-value-bind   with-slots                
++  do-all-symbols             pprint-logical-block                            
++
++       Figure 3–23: Standardized Forms In Which Declarations Can Occur      
++
++
++ ++

A declare expression can only occur ++where specified by the syntax of these forms. ++The consequences of attempting to evaluate a declare expression ++are undefined. In situations where such expressions can appear, ++explicit checks are made for their presence and they are never actually evaluated; ++it is for this reason that they ++are called “declare expressions” ++rather than “declare forms.” ++

++

Macro forms cannot expand into declarations; ++declare expressions must appear as actual subexpressions of ++the form to which they refer. ++

++

Figure 3–24 shows a list of declaration identifiers ++that can be used with declare. ++

++
++
  dynamic-extent  ignore     optimize  
++  ftype           inline     special   
++  ignorable       notinline  type      
++
++  Figure 3–24: Local Declaration Specifiers
++
++
++ ++

An implementation is free to support other (implementation-defined) ++declaration identifiers as well. ++

++

Examples::

++ ++
++
 (defun nonsense (k x z)
++   (foo z x)                     ;First call to foo
++   (let ((j (foo k x))           ;Second call to foo
++         (x (* k k)))
++     (declare (inline foo) (special x z))
++     (foo x j z)))               ;Third call to foo
++
++ ++

In this example, ++the inline declaration applies ++only to the third call to foo, but not to the first or second ones. ++The special declaration of x causes let ++to make a dynamic binding for x, and causes the reference to ++x ++in the body of let to be a dynamic reference. ++The reference to x in the second call to foo is a local reference ++to the second parameter of nonsense. ++The reference to x in the first call to foo is a local ++reference, not a special one. The special declaration of z ++causes the reference to z in the ++third ++call ++to foo to be a dynamic reference; it does not ++refer to the parameter to nonsense named z, because that ++parameter binding has not been declared to be special. ++(The special declaration of z does not appear in the body ++of defun, but in an inner form, and therefore does not ++affect the binding of the parameter.) ++

++

Exceptional Situations::

++ ++

The consequences of trying to use a declare expression as ++a form to be evaluated are undefined. ++

++

[Editorial Note by KMP: Probably we need to say something here about ill-formed ++declare expressions.] ++

++

See Also::

++ ++

proclaim ++, ++Type Specifiers, ++declaration, ++dynamic-extent, ++ftype, ++ignorable, ++ignore, ++inline, ++notinline, ++optimize, ++type ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/decode_002dfloat.html +@@ -0,0 +1,240 @@ ++ ++ ++ ++ ++ ++decode-float (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.73 decode-float, scale-float, float-radix, float-sign,

++

float-digits, float-precision, integer-decode-float

++

[Function] ++

++

decode-float floatsignificand, exponent, sign ++

++

scale-float float integerscaled-float ++

++

float-radix floatfloat-radix ++

++

float-sign float-1 &optional float-2signed-float ++

++

float-digits floatdigits1 ++

++

float-precision floatdigits2 ++

++

integer-decode-float floatsignificand, exponent, integer-sign ++

++

Arguments and Values::

++ ++

digits1—a non-negative integer. ++

++

digits2—a non-negative integer. ++

++

exponent—an integer. ++

++

float—a float. ++

++

float-1—a float. ++

++

float-2—a float. ++

++

float-radix—an integer. ++

++

integer—a non-negative integer. ++

++

integer-sign—the integer -1, ++ or the integer 1. ++

++

scaled-float—a float. ++

++

sign—A float of the same type as float ++ but numerically equal to 1.0 or -1.0. ++

++

signed-float—a float. ++

++

significand—a float. ++

++

Description::

++ ++

decode-float computes three values that characterize ++float. ++The first value is of the same type ++as float and ++represents the significand. ++The second value represents the exponent ++to which the radix (notated in this description by b) must ++be raised to obtain the value that, when multiplied with the first ++result, produces the absolute value of float. ++If float is zero, any integer value may be returned, ++provided that the identity shown for scale-float holds. ++The third value ++is of the same type as float ++and is 1.0 if float is greater ++than or equal to zero or -1.0 otherwise. ++

++

decode-float ++divides float by an integral power of b ++so as to bring its value between 1/b (inclusive) and~1 (exclusive), ++and returns the quotient as the first value. ++If float is zero, however, the result ++equals the absolute value of float (that is, if there is a negative ++zero, its significand is considered to be a positive zero). ++

++

scale-float returns ++(* float (expt (float b float) ++integer))\/, where b is the radix of the floating-point ++representation. float is not necessarily between 1/b and~1. ++

++

float-radix returns ++the radix of float. ++

++

float-sign returns a number z such ++that z and float-1 have the same sign and also such that ++z and float-2 have the same absolute value. ++If float-2 is not supplied, its value is (float 1 float-1). ++If an implementation ++has distinct representations for negative zero and positive zero, ++then (float-sign -0.0)-1.0. ++

++

float-digits returns ++the number of radix b digits ++used in the representation of float (including any implicit ++digits, such as a “hidden bit”). ++

++

float-precision ++returns ++the number of significant radix b digits present in float; ++if float is a float ++zero, then the result is an integer zero. ++

++

For normalized floats, ++the results of float-digits and float-precision are the same, ++but the precision is less than the number of representation digits ++for a denormalized or zero number. ++

++

integer-decode-float computes three values that characterize ++float - ++the significand scaled so as to be an integer, ++and the same last two ++values that are returned by decode-float. ++If float is zero, integer-decode-float returns ++zero as the first value. ++The second value bears the same relationship to the first value ++as for decode-float: ++

++
++
 (multiple-value-bind (signif expon sign)
++                      (integer-decode-float f)
++   (scale-float (float signif f) expon)) ≡ (abs f)
++
++ ++

Examples::

++ ++
++
 ;; Note that since the purpose of this functionality is to expose
++ ;; details of the implementation, all of these examples are necessarily
++ ;; very implementation-dependent.  Results may vary widely.
++ ;; Values shown here are chosen consistently from one particular implementation.
++ (decode-float .5) ⇒  0.5, 0, 1.0
++ (decode-float 1.0) ⇒  0.5, 1, 1.0
++ (scale-float 1.0 1) ⇒  2.0
++ (scale-float 10.01 -2) ⇒  2.5025
++ (scale-float 23.0 0) ⇒  23.0
++ (float-radix 1.0) ⇒  2
++ (float-sign 5.0) ⇒  1.0
++ (float-sign -5.0) ⇒  -1.0
++ (float-sign 0.0) ⇒  1.0
++ (float-sign 1.0 0.0) ⇒  0.0
++ (float-sign 1.0 -10.0) ⇒  10.0
++ (float-sign -1.0 10.0) ⇒  -10.0
++ (float-digits 1.0) ⇒  24
++ (float-precision 1.0) ⇒  24
++ (float-precision least-positive-single-float) ⇒  1
++ (integer-decode-float 1.0) ⇒  8388608, -23, 1
++
++ ++

Affected By::

++ ++

The implementation’s representation for floats. ++

++

Exceptional Situations::

++ ++

The functions decode-float, float-radix, float-digits, ++float-precision, and integer-decode-float should signal an error ++if their only argument is not a float. ++

++

The function scale-float should signal an error if its first argument ++is not a float or if its second argument is not an integer. ++

++

The function float-sign should signal an error if its first argument ++is not a float or if its second argument is supplied but is ++not a float. ++

++

Notes::

++ ++

The product of the first result of decode-float or integer-decode-float, ++of the radix raised to the power of the second result, and of the third result ++is exactly equal to the value of float. ++

++
++
 (multiple-value-bind (signif expon sign)
++                      (decode-float f)
++   (scale-float signif expon))
++≡ (abs f)
++
++ ++

and ++

++
++
 (multiple-value-bind (signif expon sign)
++                      (decode-float f)
++   (* (scale-float signif expon) sign))
++≡ f
++
++ ++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/decode_002duniversal_002dtime.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++decode-universal-time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.1 decode-universal-time [Function]

++ ++

decode-universal-time universal-time &optional time-zone
++ ⇒ second, minute, hour, date, month, year, day, daylight-p, zone ++

++

Arguments and Values::

++ ++

universal-time—a universal time. ++

++

time-zone—a time zone. ++

++

second, minute, hour, date, month, ++year, day, daylight-p, zone—a decoded time. ++

++

Description::

++ ++

Returns the decoded time represented by the given universal time. ++

++

If time-zone is not supplied, ++it defaults to the current time zone adjusted for daylight saving time. ++

++

If time-zone is supplied, daylight saving time information is ignored. ++The daylight saving time flag is nil if time-zone is supplied. ++

++

Examples::

++ ++
++
 (decode-universal-time 0 0) ⇒  0, 0, 0, 1, 1, 1900, 0, false, 0
++
++;; The next two examples assume Eastern Daylight Time.
++ (decode-universal-time 2414296800 5) ⇒  0, 0, 1, 4, 7, 1976, 6, false, 5
++ (decode-universal-time 2414293200) ⇒  0, 0, 1, 4, 7, 1976, 6, true, 5
++
++;; This example assumes that the time zone is Eastern Daylight Time
++;; (and that the time zone is constant throughout the example).
++ (let* ((here (nth 8 (multiple-value-list (get-decoded-time)))) ;Time zone
++        (recently (get-universal-time))
++        (a (nthcdr 7 (multiple-value-list (decode-universal-time recently))))
++        (b (nthcdr 7 (multiple-value-list (decode-universal-time recently here)))))
++   (list a b (equal a b))) ⇒  ((T 5) (NIL 5) NIL)
++
++ ++

Affected By::

++ ++

Implementation-dependent mechanisms for calculating when or if daylight ++savings time is in effect for any given session. ++

++

See Also::

++ ++

encode-universal-time ++, ++get-universal-time ++, ++Time ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defclass.html +@@ -0,0 +1,403 @@ ++ ++ ++ ++ ++ ++defclass (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.25 defclass [Macro]

++ ++

defclass class-name ({superclass-name}*) ++({slot-specifier}*) ++ [[!class-option]]
++ ⇒ new-class ++

++

 slot-specifier::=slot-name | (slot-name [[!slot-option]])
++

++

 slot-name::= symbol
++

++

 slot-option::={:reader reader-function-name}* |
++                         {:writer writer-function-name}* |
++                         {:accessor reader-function-name}* |
++                         {:allocation allocation-type} |
++                         {:initarg initarg-name}* |
++                         {:initform form} |
++                         {:type type-specifier} |
++                         {:documentation string}
++

++

 function-name::= {symbol | (setf symbol)}
++

++

 class-option::=(:default-initargs . initarg-list) |
++                          (:documentation string) |
++                          (:metaclass class-name)
++

++

Arguments and Values::

++ ++

Class-name—a non-nil symbol. ++

++

Superclass-name–a non-nil symbol. ++

++

Slot-name–a symbol. ++ The slot-name argument is ++ a symbol that is syntactically valid for use as a variable name. ++

++

Reader-function-name—a non-nil symbol. ++ :reader can be supplied more than once for a given slot. ++

++

Writer-function-name—a generic function name. ++ :writer can be supplied more than once for a given slot. ++

++

Reader-function-name—a non-nil symbol. ++ :accessor can be supplied more than once for a given slot. ++

++

Allocation-type—(member :instance :class). ++ :allocation can be supplied once at most for a given slot. ++

++

Initarg-name—a symbol. ++ :initarg can be supplied more than once for a given slot. ++

++

Form—a form. ++ :init-form can be supplied once at most for a given slot. ++

++

Type-specifier—a type specifier. ++ :type can be supplied once at most for a given slot. ++

++

Class-option— refers to the class as a whole or to all class slots. ++

++

Initarg-list—a list of alternating initialization argument ++ names and default initial value forms. ++ :default-initargs can be supplied at most once. ++

++

Class-name—a non-nil symbol. ++ :metaclass can be supplied once at most. ++

++

new-class—the new class object. ++

++

Description::

++ ++

The macro defclass defines a new named class. It returns ++the new class object as its result. ++

++

The syntax of defclass provides options for specifying ++initialization arguments for slots, for specifying default ++initialization values for slots, and for requesting that ++methods on specified generic functions be automatically ++generated for reading and writing the values of slots. ++No reader or writer functions are defined by default; ++their generation must be explicitly requested. However, ++slots can always be accessed using slot-value. ++

++

Defining a new class also causes a type of the same name to be ++defined. The predicate (typep object class-name) returns ++true if the class of the given object is ++the class named by class-name itself or ++a subclass of the class class-name. A class object ++can be used as a type specifier. ++Thus (typep object class) returns true ++if the class of the object is ++class itself or a subclass of class. ++

++

The class-name argument specifies the proper name ++of the new class. ++If a class with the same proper name already exists ++ and that class is an instance of standard-class, ++ and if the defclass form for the definition of the new class ++ specifies a class of class standard-class, ++the existing class is redefined, ++and instances of it (and its subclasses) are updated ++ to the new definition at the time that they are next accessed. ++For details, see Redefining Classes. ++

++

Each superclass-name argument ++specifies a direct superclass of the new class. ++If the superclass list is empty, then the superclass ++defaults depending on the metaclass, ++with standard-object being the ++default for standard-class. ++

++

The new class will ++inherit slots and methods ++from each of its direct superclasses, from ++their direct superclasses, and so on. ++For a discussion of how slots and methods are inherited, ++see Inheritance. ++

++

The following slot options are available: ++

++
++
*
++

The :reader slot option specifies that an unqualified method is ++to be defined on the generic function named reader-function-name ++to read the value of the given slot. ++

++
++
*
++

The :writer slot option specifies that an unqualified method is ++to be defined on the generic function named writer-function-name ++to write the value of the slot. ++

++
++
*
++

The :accessor slot option specifies that an unqualified method ++is to be defined on the generic function named reader-function-name ++to read the value of the given slot ++and that an unqualified method is to be defined on the ++generic function named (setf reader-function-name) to be ++used with setf to modify the value of the slot. ++

++
++
*
++

The :allocation slot option is used to specify where storage is ++to be allocated for the given slot. Storage for a ++slot can be located ++in each instance or in the class object itself. ++The value of the allocation-type argument can be ++either the keyword :instance ++or the keyword :class. If the :allocation ++slot option is not specified, the effect is the same as specifying ++:allocation :instance. ++

++
++

If allocation-type is :instance, a local slot of ++the name slot-name is allocated in each instance of the ++class. ++

++
++
++

If allocation-type is :class, a shared ++slot of the given ++name is allocated in the class object created by this defclass ++form. The value of the slot is shared by all ++instances of the class. ++If a class C_1 defines such a shared slot, any ++subclass C_2 of ++C_1 will share this single slot unless the defclass form ++for C_2 specifies a slot of the same name or there is a ++superclass of C_2 that precedes C_1 in the class precedence ++list of C_2 and that defines a slot of the same name. ++

++
++ ++
++
*
++

The :initform slot option is used to provide a default ++initial value form to be used in the initialization of the slot. This ++form is evaluated every time it is used to initialize the ++slot. The ++lexical environment in which this form is evaluated is the lexical ++environment in which the defclass form was evaluated. ++Note that the lexical environment refers both to variables and to ++functions. For local slots, the dynamic environment is the dynamic ++environment in which make-instance is called; for shared ++slots, the dynamic environment is the dynamic environment in which the ++defclass form was evaluated. ++See Object Creation and Initialization. ++

++

No implementation is permitted to extend the syntax of defclass ++to allow (slot-name form) as an abbreviation for ++(slot-name :initform form). ++

++

[Reviewer Note by Barmar: Can you extend this to mean something else?] ++

++
++
*
++

The :initarg slot option declares an initialization ++argument named initarg-name and specifies that this ++initialization argument initializes the given slot. If the ++initialization argument has a value in the call to ++initialize-instance, the value will be stored into the given slot, ++and the slot’s :initform slot option, if any, is not ++evaluated. If none of the initialization arguments specified for a ++given slot has a value, the slot is initialized according to the ++:initform slot option, if specified. ++

++
++
*
++

The :type slot option specifies that the contents of the ++slot will always be of the specified data type. It effectively ++declares the result type of the reader generic function when applied ++to an object of this class. The consequences of attempting to store in a ++slot a value that does not satisfy the type of the slot are undefined. ++The :type slot option is further discussed in ++Inheritance of Slots and Slot Options. ++

++
++
*
++

The :documentation slot option provides a documentation string ++for the slot. :documentation can be supplied once at most ++for a given slot. ++[Reviewer Note by Barmar: How is this retrieved?] ++

++
++ ++

Each class option is an option that refers to the class as a whole. ++The following class options are available: ++

++
++
*
++

The :default-initargs class option is followed by a list of ++alternating initialization argument names and default initial value ++forms. If any of these initialization arguments does not appear in ++the initialization argument list supplied to make-instance, the ++corresponding default initial value form is evaluated, and the ++initialization argument name and the form’s value are added to the end ++of the initialization argument list before the instance is created; ++see Object Creation and Initialization. ++The default initial value form is evaluated each time it is used. The lexical ++environment in which this form is evaluated is the lexical environment ++in which the defclass form was evaluated. The dynamic ++environment is the dynamic environment in which make-instance ++was called. If an initialization argument name appears more than once ++in a :default-initargs class option, an error is signaled. ++

++
++
*
++
++

The :documentation class option causes a documentation string ++to be attached with the class object, ++and attached with kind type to the class-name. ++:documentation can be supplied once at most. ++

++
++
*
++

The :metaclass class option is used to specify that ++instances of the class being defined are to have a different metaclass ++than the default provided by the system (the class standard-class). ++

++
++
++ ++

Note the following rules of defclass for standard classes: ++

++
++
*
++

It is not required that the superclasses of a class be defined before ++the defclass form for that class is evaluated. ++

++
++
*
++

All the superclasses of a class must be defined before ++an instance of the class can be made. ++

++
++
*
++

A class must be defined before it can be used as a parameter ++specializer in a defmethod form. ++

++
++
++ ++

The object system can be extended to cover situations where these rules are not ++obeyed. ++

++

Some slot options are inherited by a class from its ++superclasses, and ++some can be shadowed or altered by providing a local slot description. ++No class options except :default-initargs are inherited. For a ++detailed description of how slots and slot options are inherited, ++see Inheritance of Slots and Slot Options. ++

++

The options to defclass can be extended. It is required that ++all implementations signal an error if they observe a class option or ++a slot option that is not implemented locally. ++

++

It is valid to specify more than one reader, writer, accessor, or ++initialization argument for a slot. No other slot option can ++appear ++more than once in a single slot description, or an error is ++signaled. ++

++

If no reader, writer, or accessor is specified for a slot, ++the slot can only be accessed by the function slot-value. ++

++

If a defclass form appears as a top level form, ++the compiler must make the class name be recognized as a ++valid type name in subsequent declarations (as for deftype) ++and be recognized as a valid class name for defmethod ++parameter specializers and for use as the :metaclass option of a ++subsequent defclass. The compiler must make ++the class definition ++available to be returned by find-class when its environment ++argument is a value received as the environment parameter of a macro. ++

++

Exceptional Situations::

++ ++

If there are any duplicate slot names, ++an error of type program-error is signaled. ++

++

If an initialization argument name appears more than once in ++:default-initargs class option, ++an error of type program-error is signaled. ++

++

If any of the following slot options appears more than once in a ++single slot description, an error of type program-error ++is signaled: :allocation, ++:initform, :type, :documentation. ++

++

It is required that all implementations signal ++an error of type program-error if they observe a class option ++or a slot option that is not implemented locally. ++

++

See Also::

++ ++

documentation ++, ++Initialize-Instance ++, ++make-instance ++, ++slot-value ++, ++Classes, ++Inheritance, ++Redefining Classes, ++Determining the Class Precedence List, ++Object Creation and Initialization ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defconstant.html +@@ -0,0 +1,147 @@ ++ ++ ++ ++ ++ ++defconstant (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.15 defconstant [Macro]

++ ++

defconstant name initial-value [documentation]name ++

++

Arguments and Values::

++ ++

name—a symbol; not evaluated. ++

++

initial-value—a form; evaluated. ++

++

documentation—a string; not evaluated. ++

++

Description::

++ ++

defconstant ++causes the global variable named by name to be ++given a value that is the result of evaluating initial-value. ++

++

A constant defined by defconstant can be redefined ++with defconstant. ++However, the consequences are undefined if an attempt is made to assign ++a value to the symbol using another operator, or to ++assign it to a different ++value using a subsequent ++defconstant. ++

++

If documentation is supplied, it is attached to name as a ++documentation string of kind variable. ++

++

defconstant ++normally appears as a top level form, but it is meaningful ++for it to appear as a non-top-level form. ++However, the compile-time side ++effects described below ++only take place when defconstant appears as a ++top level form. ++

++

The consequences are undefined if there are any ++bindings ++of the variable named by name at the time defconstant ++is executed or if the value is not eql to the value of ++initial-value. ++

++

The consequences are undefined when constant symbols are rebound ++as either lexical or dynamic variables. In other words, a reference to a ++symbol declared with defconstant always refers to its global value. ++

++

The side effects of the execution of defconstant must ++be equivalent to at least the side effects of the execution of the following ++code: ++

++
++
 (setf (symbol-value 'name) initial-value)
++ (setf (documentation 'name 'variable) 'documentation)
++
++ ++

If a defconstant form appears as a top level form, ++the compiler must recognize that name names ++a constant variable. An implementation may choose to ++evaluate the value-form at compile time, load time, or both. ++Therefore, users must ensure that the initial-value ++can be evaluated at compile time ++(regardless of whether or not references to name ++appear in the file) and that it always evaluates ++to the same value. ++

++

[Editorial Note by KMP: Does “same value” here mean eql or similar?] ++

++

[Reviewer Note by Moon: Probably depends on whether load time is compared to compile time, ++ or two compiles.] ++

++

Examples::

++
++
 (defconstant this-is-a-constant 'never-changing "for a test") ⇒  THIS-IS-A-CONSTANT
++this-is-a-constant ⇒  NEVER-CHANGING
++ (documentation 'this-is-a-constant 'variable) ⇒  "for a test"
++ (constantp 'this-is-a-constant) ⇒  true
++
++ ++

See Also::

++ ++

declaim ++, ++defparameter ++, ++defvar, ++documentation ++, ++proclaim ++, ++Constant Variables, ++Compilation ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defgeneric.html +@@ -0,0 +1,330 @@ ++ ++ ++ ++ ++ ++defgeneric (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.26 defgeneric [Macro]

++ ++

defgeneric function-name gf-lambda-list ++ [[!option | {!method-description}*]]
++ ⇒ new-generic ++

++

option ::=(:argument-precedence-order {parameter-name}^+) | ++           (declare {gf-declaration}^+) | ++           (:documentation gf-documentation) | ++           (:method-combination method-combination {method-combination-argument}*) | ++           (:generic-function-class generic-function-class) | ++           (:method-class method-class) ++

++

method-description ::=(:method {method-qualifier}* specialized-lambda-list [[{declaration}* | documentation]] {form}*) ++

++

Arguments and Values::

++ ++

function-name—a function name. ++

++

generic-function-class—a non-nil symbol naming a class. ++

++

gf-declaration—an optimize declaration specifier; ++ other declaration specifiers are not permitted. ++

++

gf-documentation—a string; not evaluated. ++

++

gf-lambda-list—a generic function lambda list. ++

++

method-class—a non-nil symbol naming a class. ++

++

method-combination-argument—an object. ++

++

method-combination-name—a symbol ++ naming a method combination type. ++

++

method-qualifiers, ++specialized-lambda-list, ++declarations, ++documentation, ++forms—as per defmethod. ++

++

new-generic—the generic function object. ++

++

parameter-name—a symbol that names a required parameter ++ in the lambda-list. ++ (If the :argument-precedence-order option is specified, ++ each required parameter in the lambda-list ++ must be used exactly once as a parameter-name.) ++

++

Description::

++ ++

The macro defgeneric is used to define a generic function ++or to specify options and declarations that pertain ++to a generic function as a whole. ++

++

If function-name is a ++list it must be of the form (setf symbol). ++If (fboundp function-name) is false, a new ++generic function is created. ++

++

If (fdefinition function-name) is a generic function, that ++

++

generic function ++is modified. If function-name names ++an ordinary function, ++a macro, or a special operator, ++an error is signaled. ++

++

The effect of the defgeneric macro is as if the following three ++steps were performed: first, ++methods defined by previous defgeneric forms are removed; ++

++

[Reviewer Note by Barmar: Shouldn’t this (second) be first?] ++second, ensure-generic-function ++is called; and finally, methods specified by the current ++defgeneric form are added to the generic function. ++

++

Each method-description defines a method on the generic function. ++The lambda list of each method must be congruent with the ++lambda list ++specified by the gf-lambda-list option. ++If no method descriptions are specified and a generic function of the same ++name does not already exist, a generic function with no ++methods is created. ++

++

The gf-lambda-list argument of defgeneric specifies the shape of ++lambda lists for the methods on this generic function. ++All methods on the resulting ++generic function must have ++lambda lists that are congruent with this shape. If a defgeneric ++form is evaluated and some ++methods for that generic function ++have lambda lists that are not congruent with that given in ++the defgeneric form, an error is signaled. For further details ++on method congruence, see Congruent Lambda-lists for all Methods of a Generic Function. ++

++

The generic function passes to the ++method all the argument values passed to ++it, and only those; default values are not supported. ++Note that optional and keyword arguments in method definitions, however, ++can have default initial value forms and can use supplied-p parameters. ++

++

The following options are provided. ++

++

Except as otherwise noted, ++

++

a given option may occur only once. ++

++
++
*
++

The :argument-precedence-order option is used to specify the ++order in which the required arguments in a call to the generic function ++are tested for specificity when selecting a particular ++method. Each required argument, as specified in the gf-lambda-list ++argument, must be included exactly once as a parameter-name ++so that the full and unambiguous precedence order is ++supplied. If this condition is not met, an error is signaled. ++

++

[Reviewer Note by Barmar: What is the default order?] ++

++
++
*
++

The declare option is used to specify declarations that pertain ++to the generic function. ++

++

An optimize declaration specifier is allowed. ++It specifies whether method selection should be optimized for ++speed or space, but it has no effect on methods. ++To control how a method is optimized, an optimize ++declaration must be placed directly in the defmethod form ++or method description. The optimization qualities speed and ++space are the only qualities this standard requires, but an ++implementation can extend the object system to recognize other qualities. ++A simple implementation that has only one method selection technique ++and ignores optimize declaration specifiers is valid. ++

++

The special, ftype, function, inline, ++notinline, and declaration declarations are not permitted. ++Individual implementations can extend the declare option to ++support additional declarations. ++

++

[Editorial Note by KMP: Does “additional” mean including special, ftype, etc.? ++Or only other things that are not mentioned here?] ++If an implementation notices a declaration specifier that it does ++not support and that has not been proclaimed as a non-standard ++declaration identifier name in a declaration proclamation, ++it should issue a warning. ++[Editorial Note by KMP: The wording of this previous sentence, ++particularly the word “and” suggests to me that you can ‘proclaim declaration’ ++of an unsupported declaration (e.g., ftype) in order to suppress the warning. ++That seems wrong. Perhaps it instead means to say “does not support or ++is both undefined and not proclaimed declaration.”] ++

++

The declare option may be specified more than once. ++The effect is the same as if the lists of declaration specifiers ++had been appended together into a single list and specified as a ++single declare option. ++

++
++
*
++

The :documentation argument is a documentation string ++to be attached to the generic function object, ++and to be attached with kind function to the function-name. ++

++
++
*
++

The :generic-function-class option may be used to specify that ++the generic function is to have a different class than ++the default provided by the system (the class standard-generic-function). ++The class-name argument is the name of a class that can be the ++class of a generic function. If function-name specifies ++an existing generic function that has a different value for the ++:generic-function-class argument and the new generic function ++class is compatible with the old, change-class is called ++to change the class of the generic function; ++otherwise an error is signaled. ++

++
++
*
++

The :method-class option is used to specify that all methods on ++this generic function are to have a different class from the ++default provided by the system (the class standard-method). ++The class-name argument is the name of a class that is capable ++of being the class of a method. ++

++

[Reviewer Note by Barmar: Is change-class called on existing methods?] ++

++
++
*
++

The :method-combination option is followed by a symbol that ++names a type of method combination. The arguments (if any) that ++follow that symbol depend on the type of method combination. Note ++that the standard method combination type does not support any ++arguments. However, all types of method combination defined by the ++short form of define-method-combination accept an optional ++argument named order, defaulting to :most-specific-first, ++where a value of :most-specific-last reverses ++the order of the primary methods without affecting the order of the ++auxiliary methods. ++

++
++
++ ++

The method-description arguments define methods that will ++be associated with the generic function. The method-qualifier ++and specialized-lambda-list arguments in a method description ++are the same as for defmethod. ++

++

The form arguments specify the method body. The body of the ++method is enclosed in an implicit block. ++If function-name is a symbol, this block bears the same name as ++the generic function. If function-name is a ++list of the ++form (setf symbol), the name of the block is symbol. ++

++

Implementations can extend defgeneric to include other options. ++It is required that an implementation signal an error if ++it observes an option that is not implemented locally. ++

++

defgeneric is not required to perform any compile-time side effects. ++In particular, the methods are not installed for invocation during ++compilation. An implementation may choose to store information about ++the generic function for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls, or noting that a definition ++ for the function name has been seen). ++

++

Examples::

++ ++

Exceptional Situations::

++ ++

If function-name names an ordinary function, a macro, ++or a special operator, an error of type program-error is signaled. ++

++

Each required argument, as specified in the gf-lambda-list ++argument, must be included exactly once as a parameter-name, ++or an error of type program-error is signaled. ++

++

The lambda list of each method specified by a ++method-description must be congruent with the lambda list specified ++by the gf-lambda-list option, or ++an error of type error is signaled. ++

++

If a defgeneric form is evaluated and some methods for ++that generic function have lambda lists that are not congruent with ++that given in the defgeneric form, ++an error of type error is signaled. ++

++

A given option may occur only once, ++or an error of type program-error is signaled. ++

++

[Reviewer Note by Barmar: This says that an error is signaled if you specify the same generic ++ function class as it already has!] ++If function-name specifies an existing generic function ++that has a different value for the :generic-function-class ++argument and the new generic function class is compatible with the ++old, change-class is called to change the class of ++the generic function; otherwise an error of type error is signaled. ++

++

Implementations can extend defgeneric to include other options. ++It is required that an implementation ++signal an error of type program-error if ++it observes an option that is not implemented locally. ++

++

See Also::

++ ++

defmethod ++, ++documentation ++, ++ensure-generic-function ++, ++

++

generic-function, ++

++

Congruent Lambda-lists for all Methods of a Generic Function ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/define_002dcompiler_002dmacro.html +@@ -0,0 +1,239 @@ ++ ++ ++ ++ ++ ++define-compiler-macro (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.9 define-compiler-macro [Macro]

++ ++

define-compiler-macro name lambda-list [[{declaration}* | documentation]] {form}*
++ ⇒ name ++

++

Arguments and Values::

++ ++

name—a function name. ++

++

lambda-list—a macro lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

form—a form. ++

++

Description::

++ ++

[Editorial Note by KMP: This definition probably needs to be fully expanded to not ++ refer through the definition of defmacro, but should suffice for now.] ++

++

This is the normal mechanism for defining a compiler macro function. ++Its manner of definition is the same as for defmacro; the only ++differences are: ++

++
++
*
++

The name can be a function name naming ++ any function or macro. ++

++
++
*
++

The expander function is installed as a compiler macro function ++ for the name, rather than as a macro function. ++

++
++
*
++

The &whole argument is bound to the form argument that ++ is passed to the compiler macro function. The remaining lambda-list ++ parameters are specified as if this form contained the function name in the ++ car and the actual arguments in the cdr, but if the car ++ of the actual form is the symbol funcall, then the destructuring of ++ the arguments is actually performed using its cddr instead. ++

++
++
*
++
++

Documentation is attached as a documentation string ++ to name (as kind compiler-macro) ++and to the compiler macro function. ++

++
++
*
++

Unlike an ordinary macro, a compiler macro ++ can decline to provide an expansion merely by returning a form that is ++ the same as the original (which can be obtained by using ++ &whole). ++

++
++ ++

Examples::

++ ++
++
 (defun square (x) (expt x 2)) ⇒  SQUARE
++ (define-compiler-macro square (&whole form arg)
++   (if (atom arg)
++       `(expt ,arg 2)
++       (case (car arg)
++         (square (if (= (length arg) 2)
++                     `(expt ,(nth 1 arg) 4)
++                     form))
++         (expt   (if (= (length arg) 3)
++                     (if (numberp (nth 2 arg))
++                         `(expt ,(nth 1 arg) ,(* 2 (nth 2 arg)))
++                         `(expt ,(nth 1 arg) (* 2 ,(nth 2 arg))))
++                     form))
++         (otherwise `(expt ,arg 2))))) ⇒  SQUARE
++ (square (square 3)) ⇒  81
++ (macroexpand '(square x)) ⇒  (SQUARE X), false
++ (funcall (compiler-macro-function 'square) '(square x) nil)
++⇒  (EXPT X 2)
++ (funcall (compiler-macro-function 'square) '(square (square x)) nil)
++⇒  (EXPT X 4)
++ (funcall (compiler-macro-function 'square) '(funcall #'square x) nil)
++⇒  (EXPT X 2)
++
++ (defun distance-positional (x1 y1 x2 y2)
++   (sqrt (+ (expt (- x2 x1) 2) (expt (- y2 y1) 2))))
++⇒  DISTANCE-POSITIONAL
++ (defun distance (&key (x1 0) (y1 0) (x2 x1) (y2 y1))
++   (distance-positional x1 y1 x2 y2))
++⇒  DISTANCE
++ (define-compiler-macro distance (&whole form
++                                  &rest key-value-pairs
++                                  &key (x1 0  x1-p)
++                                       (y1 0  y1-p)
++                                       (x2 x1 x2-p)
++                                       (y2 y1 y2-p)
++                                  &allow-other-keys
++                                  &environment env)
++   (flet ((key (n) (nth (* n 2) key-value-pairs))
++          (arg (n) (nth (1+ (* n 2)) key-value-pairs))
++          (simplep (x)
++            (let ((expanded-x (macroexpand x env)))
++              (or (constantp expanded-x env)
++                  (symbolp expanded-x)))))
++     (let ((n (/ (length key-value-pairs) 2)))
++       (multiple-value-bind (x1s y1s x2s y2s others)
++           (loop for (key) on key-value-pairs by #'cddr
++                 count (eq key ':x1) into x1s
++                 count (eq key ':y1) into y1s
++                 count (eq key ':x2) into x2s
++                 count (eq key ':y1) into y2s
++                 count (not (member key '(:x1 :x2 :y1 :y2)))
++                   into others
++                 finally (return (values x1s y1s x2s y2s others)))
++         (cond ((and (= n 4)
++                     (eq (key 0) :x1)
++                     (eq (key 1) :y1)
++                     (eq (key 2) :x2)
++                     (eq (key 3) :y2))
++                `(distance-positional ,x1 ,y1 ,x2 ,y2))
++               ((and (if x1-p (and (= x1s 1) (simplep x1)) t)
++                     (if y1-p (and (= y1s 1) (simplep y1)) t)
++                     (if x2-p (and (= x2s 1) (simplep x2)) t)
++                     (if y2-p (and (= y2s 1) (simplep y2)) t)
++                     (zerop others))
++                `(distance-positional ,x1 ,y1 ,x2 ,y2))
++               ((and (< x1s 2) (< y1s 2) (< x2s 2) (< y2s 2)
++                     (zerop others))
++                (let ((temps (loop repeat n collect (gensym))))
++                  `(let ,(loop for i below n
++                               collect (list (nth i temps) (arg i)))
++                     (distance
++                       ,@(loop for i below n
++                               append (list (key i) (nth i temps)))))))
++               (t form))))))
++⇒  DISTANCE
++ (dolist (form
++           '((distance :x1 (setq x 7) :x2 (decf x) :y1 (decf x) :y2 (decf x))
++             (distance :x1 (setq x 7) :y1 (decf x) :x2 (decf x) :y2 (decf x))
++             (distance :x1 (setq x 7) :y1 (incf x))
++             (distance :x1 (setq x 7) :y1 (incf x) :x1 (incf x))
++             (distance :x1 a1 :y1 b1 :x2 a2 :y2 b2)
++             (distance :x1 a1 :x2 a2 :y1 b1 :y2 b2)
++             (distance :x1 a1 :y1 b1 :z1 c1 :x2 a2 :y2 b2 :z2 c2)))
++   (print (funcall (compiler-macro-function 'distance) form nil)))
++ |>  (LET ((#:G6558 (SETQ X 7))
++ |>        (#:G6559 (DECF X))
++ |>        (#:G6560 (DECF X))
++ |>        (#:G6561 (DECF X)))
++ |>    (DISTANCE :X1 #:G6558 :X2 #:G6559 :Y1 #:G6560 :Y2 #:G6561)) 
++ |>  (DISTANCE-POSITIONAL (SETQ X 7) (DECF X) (DECF X) (DECF X)) 
++ |>  (LET ((#:G6567 (SETQ X 7))
++ |>        (#:G6568 (INCF X)))
++ |>    (DISTANCE :X1 #:G6567 :Y1 #:G6568)) 
++ |>  (DISTANCE :X1 (SETQ X 7) :Y1 (INCF X) :X1 (INCF X)) 
++ |>  (DISTANCE-POSITIONAL A1 B1 A2 B2) 
++ |>  (DISTANCE-POSITIONAL A1 B1 A2 B2) 
++ |>  (DISTANCE :X1 A1 :Y1 B1 :Z1 C1 :X2 A2 :Y2 B2 :Z2 C2) 
++⇒  NIL
++
++ ++

See Also::

++ ++

compiler-macro-function ++, ++defmacro ++, ++documentation ++, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++ ++

The consequences of writing a compiler macro definition for a function ++in the COMMON-LISP package are undefined; it is quite possible that in some ++implementations such an attempt would override an equivalent or equally ++important definition. In general, it is recommended that a programmer only ++write compiler macro definitions for functions he or she personally ++maintains–writing a compiler macro definition for a function maintained ++elsewhere is normally considered a violation of traditional rules of modularity ++and data abstraction. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/define_002dcondition.html +@@ -0,0 +1,405 @@ ++ ++ ++ ++ ++ ++define-condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.29 define-condition [Macro]

++ ++

[Editorial Note by KMP: This syntax stuff is still very confused and needs lots of work.] ++

++

define-condition name ({parent-type}*) ++ ({!slot-spec}*) ++ {option}*
++ ⇒ name ++

++

slot-spec ::=slot-name | (slot-name !slot-option) ++

++

slot-option ::=[[ {:reader symbol}* |  ++                {:writer !function-name}* |  ++                {:accessor symbol}* |  ++                {:allocation !allocation-type} |  ++                {:initarg symbol}* |  ++                {:initform form} |  ++                {:type type-specifier} ]] ++

++

option ::=[[ (:default-initargs . initarg-list) |  ++           (:documentation string) |  ++           (:report report-name) ]] ++

++

function-name ::={symbol | (setf symbol)} ++

++

allocation-type ::=:instance | :class ++

++

report-name ::=string | symbol | lambda expression ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

parent-type—a symbol naming a condition type. ++ If no parent-types are supplied, ++ the parent-types default to (condition). ++

++

default-initargs—a list of keyword/value pairs. ++

++

[Editorial Note by KMP: This is all mixed up as to which is a slot option and which is ++ a main option. I’ll sort that out. Also, some of this is implied ++ by the bnf and needn’t be stated explicitly.] ++

++

Slot-spec – the name of a slot or a list ++consisting of the slot-name followed by zero or more slot-options. ++

++

Slot-name – a slot name (a symbol), ++the list of a slot name, or the ++list of slot name/slot form pairs. ++

++

Option – Any of the following: ++

++
++
:reader
++

:reader can be supplied more than once for a given slot ++and cannot be nil. ++

++
++
:writer
++

:writer can be supplied more than once for a given slot ++and must name a generic function. ++

++
++
:accessor
++

:accessor can be supplied more than once for a given slot ++and cannot be nil. ++

++
++
:allocation
++

:allocation can be supplied once at most for a given slot. ++The default if :allocation is not supplied is :instance. ++

++
++
:initarg
++

:initarg can be supplied more than once for a given slot. ++

++
++
:initform
++

:initform can be supplied once at most for a given slot. ++

++
++
:type
++

:type can be supplied once at most for a given slot. ++

++
++
:documentation
++

:documentation can be supplied once at most for a given slot. ++

++
++
:report
++

:report can be supplied once at most. ++

++
++
++ ++

Description::

++ ++

define-condition defines a new condition type called name, ++which is a subtype of ++

++

the type or types named by ++ parent-type. ++Each parent-type argument specifies a direct supertype ++of the new condition. The new condition ++inherits slots and methods from each of its direct ++supertypes, and so on. ++

++

If a slot name/slot form pair is supplied, ++the slot form is a form that ++can be evaluated by make-condition to ++ produce a default value when an explicit value is not provided. If no ++slot form ++is supplied, the contents of the slot ++is initialized in an ++ implementation-dependent way. ++

++

If the type being defined and some other ++type from which it inherits ++ have a slot by the same name, only one slot is allocated in the ++ condition, ++but the supplied slot form overrides any slot form ++ that might otherwise have been inherited from a parent-type. If no ++slot form is supplied, the inherited slot form (if any) is still visible. ++

++

Accessors are created according to the same rules as used by ++defclass. ++

++

A description of slot-options follows: ++

++
++
:reader
++

The :reader slot option specifies that an unqualified method is ++to be defined on the generic function named by the argument ++to :reader to read the value of the given slot. ++

++
++
*
++

The :initform slot option is used to provide a default ++initial value form to be used in the initialization of the slot. This ++form is evaluated every time it is used to initialize the ++slot. The ++lexical environment ++in which this form is evaluated is the lexical ++environment in which the define-condition ++form was evaluated. ++Note that the lexical environment refers both to variables and to ++functions. ++For local slots, the dynamic environment is the dynamic ++environment ++in which make-condition was called; for ++shared slots, the dynamic environment ++is the dynamic environment in which the ++define-condition form was evaluated. ++

++

[Reviewer Note by Barmar: Issue CLOS-CONDITIONS doesn’t say this.] ++No implementation is permitted to extend the syntax of define-condition ++to allow (slot-name form) as an abbreviation for ++(slot-name :initform form). ++

++
++
:initarg
++

The :initarg slot option declares an initialization ++argument named by its symbol argument ++and specifies that this ++initialization argument initializes the given slot. If the ++initialization argument has a value in the call to ++initialize-instance, the value is stored into the given slot, ++and the slot’s :initform slot option, if any, is not ++evaluated. If none of the initialization arguments specified for a ++given slot has a value, the slot is initialized according to the ++:initform slot option, if specified. ++

++
++
:type
++

The :type slot option specifies that the contents of the ++slot is always of the specified type. It effectively ++declares the result type of the reader generic function when applied ++to an object of this condition type. ++The consequences of attempting to store in a ++slot a value that ++does not satisfy the type of the slot is undefined. ++

++
++
:default-initargs
++
++

[Editorial Note by KMP: This is an option, not a slot option.] ++

++

This option is treated the same as it would be defclass. ++

++
++
:documentation
++
++

[Editorial Note by KMP: This is both an option and a slot option.] ++

++

The :documentation slot option provides a documentation string ++for the slot. ++

++
++
:report
++
++

[Editorial Note by KMP: This is an option, not a slot option.] ++

++

Condition reporting is mediated through the print-object ++method for the condition type in question, with *print-escape* ++always being nil. Specifying (:report report-name) ++in the definition of a condition type C is equivalent to: ++

++
++
 (defmethod print-object ((x c) stream)
++   (if *print-escape* (call-next-method) (report-name x stream)))
++
++ ++

If the value supplied by the argument to :report (report-name) ++is a symbol or a lambda expression, ++it must be acceptable to ++ function. (function report-name) ++is evaluated ++ in the current lexical environment. ++It should return a function ++of two ++ arguments, a condition and a stream, ++that prints on the stream a ++ description of the condition. ++ This function is called whenever the ++ condition is printed while *print-escape* is nil. ++

++

If report-name is a string, it is a shorthand for ++

++
++
 (lambda (condition stream)
++   (declare (ignore condition))
++   (write-string report-name stream))
++
++ ++

This option is processed after the new condition type has been defined, ++so use of the slot accessors within the :report function is permitted. ++If this option is not supplied, information about how to report this ++type of condition is inherited from the parent-type. ++

++
++
++ ++

The consequences are unspecifed if an attempt is made to read a ++slot that has not been explicitly initialized and that has not ++been given a default value. ++

++

The consequences are unspecified if an attempt is made to assign the ++slots by using setf. ++

++

If a define-condition form appears as a top level form, ++the compiler must make name recognizable as a valid type name, ++and it must be possible to reference the condition type as the ++parent-type of another condition type in a subsequent ++define-condition form in the file being compiled. ++

++

Examples::

++ ++

The following form defines a condition of type ++peg/hole-mismatch which inherits from a condition type ++called blocks-world-error: ++

++
++
(define-condition peg/hole-mismatch 
++                  (blocks-world-error)
++                  ((peg-shape  :initarg :peg-shape
++                               :reader peg/hole-mismatch-peg-shape)
++                   (hole-shape :initarg :hole-shape
++                               :reader peg/hole-mismatch-hole-shape))
++  (:report (lambda (condition stream)
++             (format stream "A ~A peg cannot go in a ~A hole."
++                     (peg/hole-mismatch-peg-shape  condition)
++                     (peg/hole-mismatch-hole-shape condition)))))
++
++ ++

The new type has slots peg-shape and hole-shape, ++so make-condition accepts :peg-shape and :hole-shape keywords. ++The readers peg/hole-mismatch-peg-shape and peg/hole-mismatch-hole-shape ++apply to objects of this type, as illustrated in the :report information. ++

++

The following form defines a condition type named machine-error ++which inherits from error: ++

++
++
(define-condition machine-error 
++                  (error)
++                  ((machine-name :initarg :machine-name
++                                 :reader machine-error-machine-name))
++  (:report (lambda (condition stream)
++             (format stream "There is a problem with ~A."
++                     (machine-error-machine-name condition)))))
++
++ ++

Building on this definition, a new error condition can be defined which ++is a subtype of machine-error for use when machines are not available: ++

++
++
(define-condition machine-not-available-error (machine-error) ()
++  (:report (lambda (condition stream)
++             (format stream "The machine ~A is not available."
++                     (machine-error-machine-name condition)))))
++
++ ++

This defines a still more specific condition, built upon ++machine-not-available-error, which provides a slot initialization form ++for machine-name but which does not provide any new slots or report ++information. It just gives the machine-name slot a default initialization: ++

++
++
(define-condition my-favorite-machine-not-available-error
++                  (machine-not-available-error)
++  ((machine-name :initform "mc.lcs.mit.edu")))
++
++ ++

Note that since no :report clause was given, the information ++inherited from machine-not-available-error is used to ++report this type of condition. ++

++
++
 (define-condition ate-too-much (error) 
++     ((person :initarg :person :reader ate-too-much-person)
++      (weight :initarg :weight :reader ate-too-much-weight)
++      (kind-of-food :initarg :kind-of-food
++                    :reader :ate-too-much-kind-of-food)))
++⇒  ATE-TOO-MUCH
++ (define-condition ate-too-much-ice-cream (ate-too-much)
++   ((kind-of-food :initform 'ice-cream)
++    (flavor       :initarg :flavor
++                  :reader ate-too-much-ice-cream-flavor
++                  :initform 'vanilla ))
++   (:report (lambda (condition stream)
++              (format stream "~A ate too much ~A ice-cream"
++                      (ate-too-much-person condition)
++                      (ate-too-much-ice-cream-flavor condition)))))
++⇒  ATE-TOO-MUCH-ICE-CREAM
++ (make-condition 'ate-too-much-ice-cream
++                 :person 'fred
++                 :weight 300
++                 :flavor 'chocolate)
++⇒  #<ATE-TOO-MUCH-ICE-CREAM 32236101>
++ (format t "~A" *)
++ |>  FRED ate too much CHOCOLATE ice-cream
++⇒  NIL
++
++ ++

See Also::

++ ++

make-condition ++, ++defclass ++, Condition System Concepts ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/define_002dmethod_002dcombination.html +@@ -0,0 +1,628 @@ ++ ++ ++ ++ ++ ++define-method-combination (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.33 define-method-combination [Macro]

++ ++

define-method-combination name [[!short-form-option]]
++ ⇒ name ++

++

define-method-combination name lambda-list ++ ({method-group-specifier}*) ++ [(:arguments . args-lambda-list)] ++ [(:generic-function ++ generic-function-symbol)] ++ [[{declaration}* | documentation]] ++ {form}*
++ ⇒ name ++

++

short-form-option ::=:documentation documentation |  ++                      :identity-with-one-argument identity-with-one-argument | ++                      :operator operator ++

++

method-group-specifier ::=(name {{qualifier-pattern}^+ | predicate} [[!long-form-option]]) ++

++

long-form-option ::=:description description | ++                     :order order | ++                     :required required-p ++

++

Arguments and Values::

++ ++

args-lambda-list— ++a define-method-combination arguments lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

description—a format control. ++

++

documentation—a string; not evaluated. ++

++

forms—an implicit progn ++ that must compute and return the form that specifies how ++ the methods are combined, that is, the effective method. ++

++

generic-function-symbol—a symbol. ++

++

identity-with-one-argument—a generalized boolean. ++

++

lambda-listordinary lambda list. ++

++

name—a symbol. ++ Non-keyword, non-nil symbols are usually used. ++

++

operator—an operator. ++ Name and operator are often the same symbol. ++ This is the default, but it is not required. ++

++

order:most-specific-first or :most-specific-last; evaluated. ++

++

predicate—a symbol that names a function of one argument ++ that returns a generalized boolean. ++

++

qualifier-pattern—a list, ++ or the symbol *. ++

++

required-p—a generalized boolean. ++

++

Description::

++ ++

The macro define-method-combination is used to define new types ++of method combination. ++

++

There are two forms of define-method-combination. The short ++form is a simple facility for the cases that are expected ++to be most commonly needed. The long form is more powerful but more ++verbose. It resembles defmacro in that the body is an ++expression, usually using backquote, that computes a form. Thus ++arbitrary control structures can be implemented. The long form also ++allows arbitrary processing of method qualifiers. ++

++
++
Short Form
++

The short form syntax of define-method-combination is recognized ++when the second subform is a non-nil symbol or is not present. ++When the short form is used, name is defined as a type of ++method combination that produces a Lisp form ++(operator method-call method-call ...). ++The operator is a symbol that can be the name of a ++function, macro, or special operator. ++The operator can be supplied by a keyword option; ++it defaults to name. ++

++

Keyword options for the short form are the following: ++

++
++
*
++

The :documentation option is used to document the method-combination type; ++see description of long form below. ++

++
++
*
++

The :identity-with-one-argument option enables an optimization ++when its value is true (the default is false). If there is ++exactly one applicable method and it is a primary method, that method ++serves as the effective method and operator is not called. ++This optimization avoids the need to create a new effective method and ++avoids the overhead of a function call. This option is designed to be ++used with operators such as progn, and, +, and ++max. ++

++
++
*
++

The :operator option specifies the name of the operator. The ++operator argument is a symbol that can be the ++name of a function, ++macro, or ++special form. ++

++
++
++ ++

These types of method combination require exactly one qualifier per ++method. An error is signaled if there are applicable methods with no ++qualifiers or with qualifiers that are not supported by ++the method combination type. ++

++

A method combination procedure defined in this way recognizes two ++roles for methods. A method whose one qualifier is the symbol naming ++this type of method combination is defined to be a primary method. At ++least one primary method must be applicable or an error is signaled. ++A method with :around as its one qualifier is an auxiliary ++method that behaves the same as an around method in standard ++method combination. The function call-next-method can only be ++used in around methods; it cannot be used in primary methods ++defined by the short form of the define-method-combination macro. ++

++

A method combination procedure defined in this way accepts an optional ++argument named order, which defaults to ++:most-specific-first. A value of :most-specific-last reverses ++the order of the primary methods without affecting the order of the ++auxiliary methods. ++

++

The short form automatically includes error checking and support for ++around methods. ++

++

For a discussion of built-in method combination types, ++see Built-in Method Combination Types. ++

++
++
Long Form
++

The long form syntax of define-method-combination is recognized ++when the second subform is a list. ++

++

The lambda-list ++receives any arguments provided after the name of the method ++combination type in the :method-combination option to ++defgeneric. ++

++

A list of method group specifiers follows. Each specifier selects a subset ++of the applicable methods to play a particular role, either by matching ++their qualifiers against some patterns or by testing their qualifiers with ++a predicate. ++These method group specifiers define all method qualifiers ++that can be used with this type of method combination. ++

++

The car of each method-group-specifier is a symbol ++which names a variable. ++During the execution of ++the forms in the body of define-method-combination, this ++variable is bound to a list of the methods in the method group. The ++methods in this list occur in the order specified by the ++:order option. ++

++

If qualifier-pattern is a symbol it must be *. ++A method matches ++a qualifier-pattern if the method’s ++list of qualifiers is equal ++to the qualifier-pattern (except that the symbol * in a ++qualifier-pattern matches anything). Thus ++a qualifier-pattern can be one of the ++following: ++ the empty list, which matches unqualified methods; ++ the symbol *, which matches all methods; ++ a true list, which matches methods with the same number of qualifiers ++ as the length of the list when each qualifier matches ++ the corresponding list element; or ++ a dotted list that ends in the symbol * ++ (the * matches any number of additional qualifiers). ++

++

Each applicable method is tested against the qualifier-patterns and ++predicates in left-to-right order. ++As soon as a qualifier-pattern matches ++or a predicate returns true, the method becomes a member of the ++corresponding method group and no further tests are made. Thus if a method ++could be a member of more than one method group, it joins only the first ++such group. If a method group has more than one ++qualifier-pattern, a ++method need only satisfy one of the qualifier-patterns to be a member of ++the group. ++

++

The name of a predicate function can appear instead of ++qualifier-patterns in a method group specifier. ++The predicate is called for ++each method that has not been assigned to an earlier method group; it ++is called with one argument, the method’s qualifier list. ++The predicate should return true if the method is to be a member of the ++method group. A predicate can be distinguished from a ++qualifier-pattern ++because it is a symbol other than nil or *. ++

++

If there is an applicable method that does not fall into any method group, ++the function invalid-method-error is called. ++

++

Method group specifiers can have keyword options following the ++qualifier patterns or predicate. Keyword options can be distinguished from ++additional qualifier patterns because they are neither lists nor the symbol ++*. The keyword options are as follows: ++

++
++
*
++

The :description option is used to provide a description of the ++role of methods in the method group. Programming environment tools ++use ++ (apply #'format stream format-control (method-qualifiers method)) ++to print this description, which ++is expected to be concise. This keyword ++option allows the description of a method qualifier to be defined in ++the same module that defines the meaning of the ++method qualifier. In most cases, format-control will not contain any ++format directives, but they are available for generality. ++If :description is not supplied, a default description is generated ++based on the variable name and the qualifier patterns and on whether ++this method group includes the unqualified methods. ++

++
++
*
++

The :order option specifies the order of methods. The order ++argument is a form that evaluates to ++:most-specific-first or :most-specific-last. If it evaluates ++to any other value, an error is signaled. ++If :order is not supplied, it defaults to ++:most-specific-first. ++

++
++
*
++

The :required option specifies whether at least one method in ++this method group is required. ++If its value is true and the method group is empty ++(that is, no applicable methods match the qualifier patterns ++or satisfy the predicate), ++an error is signaled. ++If :required is not supplied, ++it defaults to nil. ++

++
++
++ ++

The use of method group specifiers provides a convenient syntax to ++select methods, to divide them among the possible roles, and to perform the ++necessary error checking. It is possible to perform further filtering ++of methods in the body forms by using normal list-processing operations ++and the functions method-qualifiers and ++invalid-method-error. It is permissible to use setq on the ++variables named in the method group specifiers and to bind additional ++variables. It is also possible to bypass the method group specifier ++mechanism and do everything in the body forms. This is accomplished ++by writing a single method group with * as its only ++qualifier-pattern; ++the variable is then bound to a list of all of the ++applicable methods, in most-specific-first order. ++

++

The body forms compute and return the form that specifies ++how the methods are combined, that is, the effective method. ++The effective method is evaluated in ++the null lexical environment augmented with a local macro definition ++for call-method and with bindings named by ++symbols not accessible from the COMMON-LISP-USER package. ++Given a method object in one of the ++lists produced by the method group ++specifiers and a list of next methods, ++call-method ++will invoke the method such that call-next-method has available ++the next methods. ++

++

When an effective method has no effect other than to call a single ++method, some implementations employ an optimization that uses the ++single method directly as the effective method, thus avoiding the need ++to create a new effective method. This optimization is active when ++the effective method form consists entirely of an invocation of ++the call-method macro whose first subform is a method object and ++whose second subform is nil or unsupplied. Each ++define-method-combination body is responsible for stripping off ++redundant invocations of progn, and, ++multiple-value-prog1, and the like, if this optimization is desired. ++

++

The list (:arguments . lambda-list) can appear before ++any declarations or documentation string. This form is useful when ++the method combination type performs some specific behavior as part of ++the combined method and that behavior needs access to the arguments to ++the generic function. Each parameter variable defined by ++lambda-list is bound to a form that can be inserted into the ++effective method. When this form is evaluated during execution of the ++effective method, its value is the corresponding argument to the ++generic function; the consequences of using such a form as ++the place in a setf form are undefined. ++

++

Argument correspondence is computed by dividing the :arguments lambda-list ++and the generic function lambda-list into three sections: ++ the required parameters, ++ the optional parameters, ++ and the keyword and rest parameters. ++The arguments supplied to the generic function for a particular call ++are also divided into three sections; ++ the required arguments section contains as many arguments ++ as the generic function has required parameters, ++ the optional arguments section contains as many arguments ++ as the generic function has optional parameters, ++ and the keyword/rest arguments section contains the remaining arguments. ++Each parameter in the required and optional sections of the ++:arguments lambda-list accesses the argument at the same position ++in the corresponding section of the arguments. ++If the section of the :arguments lambda-list is shorter, ++ extra arguments are ignored. ++If the section of the :arguments lambda-list is longer, ++ excess required parameters are bound to forms that evaluate to nil ++ and excess optional parameters are bound to their initforms. ++The keyword parameters and rest parameters in the :arguments ++lambda-list access the keyword/rest section of the arguments. ++If the :arguments lambda-list contains &key, it behaves as ++if it also contained &allow-other-keys. ++

++

In addition, &whole var can be placed first in the :arguments ++lambda-list. It causes var to be bound to a form ++that evaluates to a list of all of the arguments supplied ++to the generic function. This is different from &rest because it ++accesses all of the arguments, not just the keyword/rest arguments. ++

++

Erroneous conditions detected by the body should be reported with ++method-combination-error or invalid-method-error; these ++functions ++add any necessary contextual information to the error message and will ++signal the appropriate error. ++

++

The body forms are evaluated inside of the bindings created by ++the ++lambda list and method group specifiers. ++

++

[Reviewer Note by Barmar: Are they inside or outside the :ARGUMENTS bindings?] ++Declarations at the head of ++the body are positioned directly inside of bindings created by the ++lambda list and outside of the bindings of the method group variables. ++Thus method group variables cannot be declared in this way. locally may be used ++around the body, however. ++

++

Within the body forms, generic-function-symbol ++is bound to the generic function object. ++

++

Documentation is attached as a documentation string ++ to name (as kind method-combination) ++and to the method combination object. ++

++

Note that two methods with identical specializers, but with different ++qualifiers, are not ordered by the algorithm described in Step 2 of ++the method selection and combination process described in ++Method Selection and Combination. Normally the two methods play ++different roles in the effective method because they have different ++qualifiers, and no matter how they are ordered in the result of Step ++2, the effective method is the same. If the two methods play the same ++role and their order matters, ++

++

[Reviewer Note by Barmar: How does the system know when the order matters?] ++an error is signaled. This happens as ++part of the qualifier pattern matching in ++define-method-combination. ++

++
++
++ ++

If a define-method-combination form appears as a ++top level form, the compiler must make the ++method combination name be recognized as a valid ++method combination name in subsequent defgeneric ++forms. However, the method combination is executed ++no earlier than when the define-method-combination form ++is executed, and possibly as late as the time that generic functions ++that use the method combination are executed. ++

++

Examples::

++ ++

Most examples of the long form of define-method-combination also ++illustrate the use of the related functions that are provided as part ++of the declarative method combination facility. ++

++
++
;;; Examples of the short form of define-method-combination
++
++ (define-method-combination and :identity-with-one-argument t) 
++
++ (defmethod func and ((x class1) y) ...)
++
++;;; The equivalent of this example in the long form is:
++
++ (define-method-combination and 
++         (&optional (order :most-specific-first))
++         ((around (:around))
++          (primary (and) :order order :required t))
++   (let ((form (if (rest primary)
++                   `(and ,@(mapcar #'(lambda (method)
++                                       `(call-method ,method))
++                                   primary))
++                   `(call-method ,(first primary)))))
++     (if around
++         `(call-method ,(first around)
++                       (,@(rest around)
++                        (make-method ,form)))
++         form)))
++
++;;; Examples of the long form of define-method-combination
++
++;The default method-combination technique
++ (define-method-combination standard ()
++         ((around (:around))
++          (before (:before))
++          (primary () :required t)
++          (after (:after)))
++   (flet ((call-methods (methods)
++            (mapcar #'(lambda (method)
++                        `(call-method ,method))
++                    methods)))
++     (let ((form (if (or before after (rest primary))
++                     `(multiple-value-prog1
++                        (progn ,@(call-methods before)
++                               (call-method ,(first primary)
++                                            ,(rest primary)))
++                        ,@(call-methods (reverse after)))
++                     `(call-method ,(first primary)))))
++       (if around
++           `(call-method ,(first around)
++                         (,@(rest around)
++                          (make-method ,form)))
++           form))))
++
++;A simple way to try several methods until one returns non-nil
++ (define-method-combination or ()
++         ((methods (or)))
++   `(or ,@(mapcar #'(lambda (method)
++                      `(call-method ,method))
++                  methods)))
++
++;A more complete version of the preceding
++ (define-method-combination or 
++         (&optional (order ':most-specific-first))
++         ((around (:around))
++          (primary (or)))
++   ;; Process the order argument
++   (case order
++     (:most-specific-first)
++     (:most-specific-last (setq primary (reverse primary)))
++     (otherwise (method-combination-error "~S is an invalid order.~@
++     :most-specific-first and :most-specific-last are the possible values."
++                                          order)))
++   ;; Must have a primary method
++   (unless primary
++     (method-combination-error "A primary method is required."))
++   ;; Construct the form that calls the primary methods
++   (let ((form (if (rest primary)
++                   `(or ,@(mapcar #'(lambda (method)
++                                      `(call-method ,method))
++                                  primary))
++                   `(call-method ,(first primary)))))
++     ;; Wrap the around methods around that form
++     (if around
++         `(call-method ,(first around)
++                       (,@(rest around)
++                        (make-method ,form)))
++         form)))
++
++;The same thing, using the :order and :required keyword options
++ (define-method-combination or 
++         (&optional (order ':most-specific-first))
++         ((around (:around))
++          (primary (or) :order order :required t))
++   (let ((form (if (rest primary)
++                   `(or ,@(mapcar #'(lambda (method)
++                                      `(call-method ,method))
++                                  primary))
++                   `(call-method ,(first primary)))))
++     (if around
++         `(call-method ,(first around)
++                       (,@(rest around)
++                        (make-method ,form)))
++         form)))
++
++;This short-form call is behaviorally identical to the preceding
++ (define-method-combination or :identity-with-one-argument t)
++
++;Order methods by positive integer qualifiers
++;:around methods are disallowed to keep the example small
++ (define-method-combination example-method-combination ()
++         ((methods positive-integer-qualifier-p))
++   `(progn ,@(mapcar #'(lambda (method)
++                         `(call-method ,method))
++                     (stable-sort methods #'<
++                       :key #'(lambda (method)
++                                (first (method-qualifiers method)))))))
++
++ (defun positive-integer-qualifier-p (method-qualifiers)
++   (and (= (length method-qualifiers) 1)
++        (typep (first method-qualifiers) '(integer 0 *))))
++
++;;; Example of the use of :arguments
++ (define-method-combination progn-with-lock ()
++         ((methods ()))
++   (:arguments object)
++   `(unwind-protect
++        (progn (lock (object-lock ,object))
++               ,@(mapcar #'(lambda (method)
++                             `(call-method ,method))
++                         methods))
++      (unlock (object-lock ,object))))
++
++
++ ++

Side Effects::

++ ++

The compiler is not required to perform any compile-time side-effects. ++

++

Exceptional Situations::

++ ++

Method combination types defined with the short form require exactly ++one qualifier per method. ++An error of type error is signaled if there are ++applicable methods with no qualifiers or with qualifiers that are not ++supported by the method combination type. ++At least one primary method must be applicable or ++an error of type error is signaled. ++

++

If an applicable method does not fall into any method group, the ++system signals an error of type error ++indicating that the method is invalid for the kind of ++method combination in use. ++

++

If the value of the :required option is true ++and the method group is empty (that is, no applicable ++methods match the qualifier patterns or satisfy the predicate), ++an error of type error is signaled. ++

++

If the :order option evaluates to a value other than ++:most-specific-first or :most-specific-last, ++an error of type error is signaled. ++

++

See Also::

++ ++

call-method ++, ++call-next-method ++, ++documentation ++, ++method-qualifiers ++, ++method-combination-error ++, ++invalid-method-error ++, ++defgeneric ++, ++Method Selection and Combination, ++Built-in Method Combination Types, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++ ++

The :method-combination option of defgeneric is used to ++specify that a generic function should use a particular method ++combination type. The first argument to the :method-combination ++option is the name of a method combination type and the remaining ++arguments are options for that type. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/define_002dmodify_002dmacro.html +@@ -0,0 +1,140 @@ ++ ++ ++ ++ ++ ++define-modify-macro (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.60 define-modify-macro [Macro]

++ ++

define-modify-macro name lambda-list function [documentation]name ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

lambda-list—a define-modify-macro lambda list ++

++

function—a symbol. ++

++

documentation—a string; not evaluated. ++

++

Description::

++ ++

define-modify-macro defines a macro named ++name to read and write a place. ++

++

The arguments to the new macro are a place, ++followed ++by the arguments that are supplied in lambda-list. ++

++

Macros defined with define-modify-macro ++correctly pass the environment parameter to ++

++

get-setf-expansion. ++

++

When the macro is invoked, function ++is applied to the old contents of the place ++and the lambda-list arguments to obtain the new value, ++and the place is updated to contain the result. ++

++

Except for the issue of avoiding multiple evaluation (see below), the expansion ++of a define-modify-macro is equivalent to the following: ++

++
++
 (defmacro name (reference . lambda-list)
++   documentation
++   `(setf ,reference
++          (function ,reference ,arg1 ,arg2 ...)))
++
++ ++

where arg1, arg2, ..., ++are the parameters appearing in lambda-list; ++appropriate provision is made for a rest parameter. ++

++

The subforms of the macro calls defined by define-modify-macro ++are evaluated as specified in Evaluation of Subforms to Places. ++

++

Documentation is attached as a documentation string ++ to name (as kind function) ++and to the macro function. ++

++

If a define-modify-macro form appears as a top level form, ++the compiler must store the macro definition at compile time, ++so that occurrences of the macro later on in the file can be expanded correctly. ++

++

Examples::

++
++
 (define-modify-macro appendf (&rest args) 
++    append "Append onto list") ⇒  APPENDF
++ (setq x '(a b c) y x) ⇒  (A B C)
++ (appendf x '(d e f) '(1 2 3)) ⇒  (A B C D E F 1 2 3)
++ x ⇒  (A B C D E F 1 2 3)
++ y ⇒  (A B C)
++ (define-modify-macro new-incf (&optional (delta 1)) +)
++ (define-modify-macro unionf (other-set &rest keywords) union)
++
++ ++

Side Effects::

++ ++

A macro definition is assigned to name. ++

++

See Also::

++ ++

defsetf ++, ++

++

define-setf-expander ++, ++

++

documentation ++, ++Syntactic Interaction of Documentation Strings and Declarations ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/define_002dsetf_002dexpander.html +@@ -0,0 +1,190 @@ ++ ++ ++ ++ ++ ++define-setf-expander (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.62 define-setf-expander [Macro]

++ ++

define-setf-expander access-fn lambda-list ++ [[{declaration}* | documentation]] {form}*
++ ⇒ access-fn ++

++

Arguments and Values::

++ ++

access-fn—a symbol that names a function or macro. ++

++

lambda-listmacro lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

forms—an implicit progn. ++

++

Description::

++ ++

define-setf-expander specifies the means by which setf ++updates a place that is referenced by access-fn. ++

++

When setf is given a place that is ++specified in terms of access-fn and a new value for the ++place, it is expanded into a form that performs ++the appropriate update. ++

++

The lambda-list supports destructuring. ++See Macro Lambda Lists. ++

++

Documentation is attached to access-fn as a documentation string ++of kind setf. ++

++

Forms constitute the body of the ++

++

setf expander ++

++

definition and must compute the setf expansion for a call on setf ++that references the place by means of the given ++access-fn. ++

++

The setf expander function is defined in the same lexical environment ++in which the define-setf-expander form appears. ++

++

While forms are being executed, ++the variables in lambda-list are bound to parts of the place form. ++

++

The body forms (but not the lambda-list) ++

++

in a define-setf-expander form are implicitly enclosed in a ++block whose name is ++access-fn. ++

++

The evaluation of forms must result in the five values ++described in Setf Expansions. ++

++

If a define-setf-expander form appears as a top level form, ++the compiler must make the setf expander available so that ++it may be used to expand calls to setf later on in the file. ++Programmers must ensure that the forms can be evaluated ++at compile time if the access-fn is used in a place ++later in the same file. ++The compiler must make these setf expanders available to ++compile-time calls to get-setf-expansion when its environment ++argument is a value received as the environment parameter of a macro. ++

++

Examples::

++
++
 (defun lastguy (x) (car (last x))) ⇒  LASTGUY
++ (define-setf-expander lastguy (x &environment env)
++   "Set the last element in a list to the given value."
++   (multiple-value-bind (dummies vals newval setter getter)
++       (get-setf-expansion x env)
++     (let ((store (gensym)))
++       (values dummies
++               vals
++               `(,store)
++               `(progn (rplaca (last ,getter) ,store) ,store)
++               `(lastguy ,getter))))) ⇒  LASTGUY
++ (setq a (list 'a 'b 'c 'd)
++       b (list 'x)
++       c (list 1 2 3 (list 4 5 6))) ⇒  (1 2 3 (4 5 6))
++ (setf (lastguy a) 3) ⇒  3
++ (setf (lastguy b) 7) ⇒  7
++ (setf (lastguy (lastguy c)) 'lastguy-symbol) ⇒  LASTGUY-SYMBOL
++ a ⇒  (A B C 3)
++ b ⇒  (7)
++ c ⇒  (1 2 3 (4 5 LASTGUY-SYMBOL))
++
++ ++
++
;;; Setf expander for the form (LDB bytespec int).
++;;; Recall that the int form must itself be suitable for SETF.
++ (define-setf-expander ldb (bytespec int &environment env)
++   (multiple-value-bind (temps vals stores
++                          store-form access-form)
++       (get-setf-expansion int env);Get setf expansion for int.
++     (let ((btemp (gensym))     ;Temp var for byte specifier.
++           (store (gensym))     ;Temp var for byte to store.
++           (stemp (first stores))) ;Temp var for int to store.
++       (if (cdr stores) (error "Can't expand this."))
++;;; Return the setf expansion for LDB as five values.
++       (values (cons btemp temps)       ;Temporary variables.
++               (cons bytespec vals)     ;Value forms.
++               (list store)             ;Store variables.
++               `(let ((,stemp (dpb ,store ,btemp ,access-form)))
++                  ,store-form
++                  ,store)               ;Storing form.
++               `(ldb ,btemp ,access-form) ;Accessing form.
++              ))))
++
++ ++

See Also::

++ ++

setf ++, ++defsetf ++, ++documentation ++, ++get-setf-expansion ++, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++ ++

define-setf-expander differs from the long form of defsetf ++in that while the body is being executed the variables ++in lambda-list are bound to parts of the place form, ++not to temporary variables that will be bound to the values of such parts. ++In addition, define-setf-expander does not have defsetf’s ++restriction that access-fn must be a function ++or a function-like macro; an arbitrary defmacro destructuring ++pattern is permitted in lambda-list. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/define_002dsymbol_002dmacro.html +@@ -0,0 +1,133 @@ ++ ++ ++ ++ ++ ++define-symbol-macro (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.13 define-symbol-macro [Macro]

++ ++

define-symbol-macro symbol expansion
++ ⇒ symbol ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

expansion—a form. ++

++

Description::

++ ++

Provides a mechanism for globally affecting the macro expansion ++of the indicated symbol. ++

++

Globally establishes an expansion function for the symbol macro ++named by symbol. ++The only guaranteed property of an expansion function for a symbol macro ++is that when it is applied to the form and the environment it returns ++the correct expansion. (In particular, it is implementation-dependent ++whether the expansion is conceptually stored in the expansion function, ++the environment, or both.) ++

++

Each global reference to symbol (i.e., not shadowed_2 by a ++binding for a variable or symbol macro named by ++the same symbol) is expanded by the normal macro expansion process; ++see Symbols as Forms. ++The expansion of a symbol macro is subject to further macro expansion ++in the same lexical environment as the symbol macro reference, ++exactly analogous to normal macros. ++

++

The consequences are unspecified if a special declaration is made for ++symbol while in the scope of this definition (i.e., when it is not ++shadowed_2 by a binding for a variable ++or symbol macro named by the same symbol). ++

++

Any use of setq to set the value of ++the symbol ++ while in the scope of this definition ++ is treated as if it were a setf. ++psetq of symbol ++ is treated as if it were a psetf, and ++multiple-value-setq ++ is treated as if it were a setf of values. ++

++

A binding for a symbol macro can be shadowed_2 ++by let or symbol-macrolet. ++

++

Examples::

++ ++
++
(defvar *things* (list 'alpha 'beta 'gamma)) ⇒  *THINGS*
++
++(define-symbol-macro thing1 (first *things*)) ⇒  THING1
++(define-symbol-macro thing2 (second *things*)) ⇒  THING2
++(define-symbol-macro thing3 (third *things*)) ⇒  THING3
++
++thing1 ⇒  ALPHA
++(setq thing1 'ONE) ⇒  ONE
++*things* ⇒  (ONE BETA GAMMA)
++(multiple-value-setq (thing2 thing3) (values 'two 'three)) ⇒  TWO
++thing3 ⇒  THREE
++*things* ⇒  (ONE TWO THREE)
++
++(list thing2 (let ((thing2 2)) thing2)) ⇒  (TWO 2)
++
++ ++

Exceptional Situations::

++ ++

If symbol is already defined as a global variable, ++an error of type program-error is signaled. ++

++

See Also::

++ ++

symbol-macrolet ++, ++macroexpand ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defmacro.html +@@ -0,0 +1,242 @@ ++ ++ ++ ++ ++ ++defmacro (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.10 defmacro [Macro]

++ ++

defmacro name lambda-list [[{declaration}* | documentation]] {form}*
++ ⇒ name ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

lambda-list—a macro lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

form—a form. ++

++

Description::

++ ++

Defines name as a macro ++by associating a macro function with that name ++in the global environment. ++

++

The macro function is defined in the same lexical environment ++in which the defmacro form appears. ++

++

The parameter variables in lambda-list are bound to ++destructured portions of the macro call. ++

++

The expansion function ++accepts two arguments, a form and an ++environment. The expansion function returns a form. ++The body of the expansion function is specified by forms. ++Forms are executed in order. The value of the ++last form executed is returned as the expansion of the ++macro. ++

++

The body forms of the expansion function (but not the lambda-list) ++

++

are implicitly enclosed in a block whose name is name. ++

++

The lambda-list conforms to the requirements described in Macro Lambda Lists. ++

++

Documentation is attached as a documentation string ++ to name (as kind function) ++and to the macro function. ++

++

defmacro can be used to redefine a macro or to replace ++a function definition with a macro definition. ++

++

Recursive expansion of the form returned must terminate, ++including the expansion of other macros which are subforms ++of other forms returned. ++

++

The consequences are undefined if the result of fully macroexpanding ++a form ++contains any circular list structure except in literal objects. ++

++

If a defmacro form appears as a top level form, ++the compiler must store the macro definition at compile time, ++so that occurrences of the macro later on in the file can be expanded correctly. ++Users must ensure that the body of the macro can be evaluated at ++compile time if it is referenced within the file being compiled. ++

++

Examples::

++ ++
++
 (defmacro mac1 (a b) "Mac1 multiplies and adds" 
++            `(+ ,a (* ,b 3))) ⇒  MAC1 
++ (mac1 4 5) ⇒  19 
++ (documentation 'mac1 'function) ⇒  "Mac1 multiplies and adds" 
++ (defmacro mac2 (&optional (a 2 b) (c 3 d) &rest x) `'(,a ,b ,c ,d ,x)) ⇒  MAC2 
++ (mac2 6) ⇒  (6 T 3 NIL NIL) 
++ (mac2 6 3 8) ⇒  (6 T 3 T (8)) 
++ (defmacro mac3 (&whole r a &optional (b 3) &rest x &key c (d a))
++    `'(,r ,a ,b ,c ,d ,x)) ⇒  MAC3 
++ (mac3 1 6 :d 8 :c 9 :d 10) ⇒  ((MAC3 1 6 :D 8 :C 9 :D 10) 1 6 9 8 (:D 8 :C 9 :D 10)) 
++
++ ++

The stipulation that ++an embedded destructuring lambda list is permitted only ++where ordinary lambda list syntax would permit a parameter name ++but not a list is made to prevent ambiguity. For example, ++the following is not valid: ++

++
++
 (defmacro loser (x &optional (a b &rest c) &rest z)
++   ...)
++
++ ++

because ordinary lambda list syntax does permit a ++list following &optional; ++the list (a b &rest c) would be interpreted as describing an ++optional parameter named a whose default value is that of the ++form b, with a supplied-p parameter named &rest (not valid), ++and an extraneous symbol c in the list (also not valid). An almost ++correct way to express this is ++

++
++
 (defmacro loser (x &optional ((a b &rest c)) &rest z)
++   ...)
++
++ ++

The extra set of parentheses removes the ambiguity. However, the ++definition is now incorrect because a macro call such as (loser (car pool)) ++would not provide any argument form for the lambda list (a b &rest c), ++and so the default value against which to match the lambda list would be ++nil because no explicit default value was specified. ++The consequences of this are unspecified ++since the empty list, nil, does not have forms to satisfy the ++parameters a and b. The fully correct definition would be either ++

++
++
 (defmacro loser (x &optional ((a b &rest c) '(nil nil)) &rest z)
++   ...)
++
++ ++

or ++

++
++
 (defmacro loser (x &optional ((&optional a b &rest c)) &rest z)
++   ...)
++
++ ++

These differ slightly: the first requires that if the macro call ++specifies a explicitly then it must also specify b explicitly, ++whereas the second does not have this requirement. For example, ++

++
++
 (loser (car pool) ((+ x 1)))
++
++ ++

would be a valid call for the second definition but not for the first. ++

++
++
 (defmacro dm1a (&whole x) `',x)
++ (macroexpand '(dm1a))  ⇒  (QUOTE (DM1A))
++ (macroexpand '(dm1a a)) is an error.
++
++ (defmacro dm1b (&whole x a &optional b) `'(,x ,a ,b))
++ (macroexpand '(dm1b))  is an error.
++ (macroexpand '(dm1b q))  ⇒  (QUOTE ((DM1B Q) Q NIL))
++ (macroexpand '(dm1b q r)) ⇒  (QUOTE ((DM1B Q R) Q R))
++ (macroexpand '(dm1b q r s)) is an error.
++
++ ++
++
 (defmacro dm2a (&whole form a b) `'(form ,form a ,a b ,b))
++ (macroexpand '(dm2a x y)) ⇒  (QUOTE (FORM (DM2A X Y) A X B Y))
++ (dm2a x y) ⇒  (FORM (DM2A X Y) A X B Y)
++
++ (defmacro dm2b (&whole form a (&whole b (c . d) &optional (e 5)) 
++                 &body f &environment env)
++   ``(,',form ,,a ,',b ,',(macroexpand c env) ,',d ,',e ,',f))
++ ;Note that because backquote is involved, implementations may differ
++ ;slightly in the nature (though not the functionality) of the expansion.
++ (macroexpand '(dm2b x1 (((incf x2) x3 x4)) x5 x6))
++ ⇒  (LIST* '(DM2B X1 (((INCF X2) X3 X4))
++                   X5 X6)
++            X1
++            '((((INCF X2) X3 X4)) (SETQ X2 (+ X2 1)) (X3 X4) 5 (X5 X6))),
++     T
++ (let ((x1 5))
++   (macrolet ((segundo (x) `(cadr ,x)))
++     (dm2b x1 (((segundo x2) x3 x4)) x5 x6)))
++ ⇒  ((DM2B X1 (((SEGUNDO X2) X3 X4)) X5 X6)
++      5 (((SEGUNDO X2) X3 X4)) (CADR X2) (X3 X4) 5 (X5 X6))
++
++ ++

See Also::

++ ++

define-compiler-macro ++, ++

++

destructuring-bind ++, ++documentation ++, ++macroexpand ++, ++*macroexpand-hook*, ++macrolet, ++macro-function ++, ++Evaluation, ++Compilation, ++Syntactic Interaction of Documentation Strings and Declarations ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defmethod.html +@@ -0,0 +1,238 @@ ++ ++ ++ ++ ++ ++defmethod (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.27 defmethod [Macro]

++ ++

defmethod function-name ++ {method-qualifier}* ++ specialized-lambda-list ++ [[{declaration}* | documentation]] {form}*
++ ⇒ new-method ++

++

function-name::= {symbol ++| (setf symbol)} ++

++

method-qualifier::= non-list ++

++

 specialized-lambda-list::= ({var | (var parameter-specializer-name)}*
++                             [&optional {var | (var [initform [supplied-p-parameter] ])}*]
++                             [&rest var]
++                             [&key{var | ({var | (keywordvar)[initform [supplied-p-parameter] ])}*
++                                          [&allow-other-keys] ]
++                             [&aux {var | (var [initform] )}*] )
++

++

 parameter-specializer-name::= symbol | (eql eql-specializer-form)
++

++

Arguments and Values::

++ ++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

var—a variable name. ++

++

eql-specializer-form—a form. ++

++

Form—a form. ++

++

Initform—a form. ++

++

Supplied-p-parameter—variable name. ++

++

new-method—the new method object. ++

++

Description::

++ ++

The macro defmethod defines a method on a ++generic function. ++

++

If (fboundp function-name) is nil, a ++generic function is created with default values for ++the argument precedence order ++(each argument is more specific than the arguments to its right ++in the argument list), ++for the generic function class (the class standard-generic-function), ++for the method class (the class standard-method), ++and for the method combination type (the standard method combination type). ++The lambda list of the generic function is ++congruent with the lambda list of the ++method being defined; if the ++defmethod form mentions keyword arguments, the lambda list of ++the generic function ++will mention &key (but no keyword ++arguments). If function-name names ++an ordinary function, ++a macro, or a special operator, ++an error is signaled. ++

++

If a generic function is currently named by function-name, ++the lambda list of the ++method must be congruent with the lambda list of the ++generic function. ++If this condition does not hold, an error is signaled. ++For a definition of congruence in this context, see Congruent Lambda-lists for all Methods of a Generic Function. ++

++

Each method-qualifier argument is an object that is used by ++method combination to identify the given method. ++The method combination type might further ++restrict what a method qualifier can be. ++The standard method combination type allows for unqualified methods and ++methods whose sole ++qualifier is one of the keywords :before, :after, or :around. ++

++

The specialized-lambda-list argument is like an ordinary ++lambda list except that the names of required parameters can ++be replaced by specialized parameters. A specialized parameter is a ++list of the form ++(var parameter-specializer-name). ++Only required parameters can be ++specialized. If parameter-specializer-name is a symbol it names a ++class; if it is a list, ++it is of the form (eql eql-specializer-form). The parameter ++specializer name (eql eql-specializer-form) indicates ++that the corresponding argument must be eql to the object that ++is the value of eql-specializer-form for the method to be applicable. ++The eql-specializer-form is evaluated at the time ++that the expansion of the defmethod macro is evaluated. ++If no parameter specializer name is specified for a given ++required parameter, the parameter specializer defaults to ++the class t. ++For further discussion, see Introduction to Methods. ++

++

The form arguments specify the method body. ++The body of the method is enclosed in an implicit block. If ++function-name is a symbol, ++this block bears the same name as the generic function. ++If function-name is a list of the form ++(setf symbol), the name of the block is symbol. ++

++

The class of the method object that is created is that given by the ++method class option of the generic function ++on which the method is defined. ++

++

If the generic function already has a method that agrees with the ++method being defined on parameter specializers and qualifiers, ++defmethod replaces the existing method with the one now being ++defined. ++For a definition of agreement in this context. ++see Agreement on Parameter Specializers and Qualifiers. ++

++

The parameter specializers are derived from ++the parameter specializer names as described in ++Introduction to Methods. ++

++

The expansion of the defmethod macro “refers to” each ++specialized parameter (see the description of ignore ++within the description of declare). ++This includes parameters that ++have an explicit parameter specializer name of t. This means ++that a compiler warning does not occur if the body of the method does ++not refer to a specialized parameter, while a warning might occur ++if the body of the method does not refer to an unspecialized parameter. ++For this reason, a parameter that specializes on t is not quite synonymous ++with an unspecialized parameter in this context. ++

++

Declarations at the head of the method body that apply to the ++method’s lambda variables are treated as bound declarations ++whose scope is the same as the corresponding bindings. ++

++

Declarations at the head of the method body that apply to the ++functional bindings of call-next-method or next-method-p ++apply to references to those functions within the method body forms. ++Any outer bindings of the function names call-next-method and ++next-method-p, and declarations associated with such bindings ++are shadowed_2 within the method body forms. ++

++

The scope of free declarations at the head of the method body ++is the entire method body, ++which includes any implicit local function definitions ++ but excludes initialization forms for the lambda variables. ++

++

defmethod is not required to perform any compile-time side effects. ++In particular, the methods are not installed for invocation during ++compilation. An implementation may choose to store information about ++the generic function for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls, or noting that a definition ++ for the function name has been seen). ++

++

Documentation is attached as a documentation string ++to the method object. ++

++

Affected By::

++ ++

The definition of the referenced generic function. ++

++

Exceptional Situations::

++ ++

If function-name names an ordinary function, ++a macro, or a special operator, ++an error of type error is signaled. ++

++

If a generic function is currently named by function-name, ++the lambda list of the ++method must be congruent with the lambda list of the ++generic function, or ++an error of type error is signaled. ++

++

See Also::

++ ++

defgeneric ++, ++documentation ++, ++Introduction to Methods, ++Congruent Lambda-lists for all Methods of a Generic Function, ++Agreement on Parameter Specializers and Qualifiers, ++Syntactic Interaction of Documentation Strings and Declarations ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defpackage.html +@@ -0,0 +1,323 @@ ++ ++ ++ ++ ++ ++defpackage (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.19 defpackage [Macro]

++ ++

defpackage defined-package-name [[!option]]package ++

++

option ::={(:nicknames {nickname}*)}* |  ++           (:documentation string) |  ++           {(:use {package-name}*)}* |  ++           {(:shadow {!symbol-name}*)}* |  ++           {(:shadowing-import-from package-name {!symbol-name}*)}* |  ++           {(:import-from package-name {!symbol-name}*)}* |  ++           {(:export {!symbol-name}*)}* |  ++           {(:intern {!symbol-name}*)}* |  ++           (:size integer) ++

++

symbol-name ::=(symbol | string) ++

++

Arguments and Values::

++ ++

defined-package-name—a string designator. ++

++

package-name—a package designator. ++

++

nickname—a string designator. ++

++

symbol-name—a string designator. ++

++

package—the package named package-name. ++

++

Description::

++ ++

defpackage creates a package as specified and returns ++the package. ++

++

If defined-package-name already refers to an existing ++package, the name-to-package mapping for that name is not changed. ++If the new definition is at variance with the current state of that ++package, the consequences are undefined; an implementation ++might choose to modify the existing package to reflect the ++new definition. If defined-package-name is a symbol, ++its name is used. ++

++

The standard options are described below. ++

++
++
:nicknames
++

The arguments to :nicknames set the package’s nicknames to the ++supplied names. ++

++
++
:documentation
++

The argument to :documentation specifies a documentation string; ++it is attached as a documentation string to the package. ++At most one :documentation option ++can appear in a single defpackage form. ++

++
++
:use
++

The arguments to :use set the packages that the package ++named by package-name ++will inherit from. If :use is not supplied, ++

++

it defaults to the same implementation-dependent value as the :use argument to ++make-package. ++

++
++
:shadow
++

The arguments to :shadow, symbol-names, name symbols ++that are to be created in the package being defined. ++These symbols are added to the list of shadowing ++symbols effectively as if by shadow. ++

++
++
:shadowing-import-from
++

The symbols named by the argument symbol-names ++are found (involving a lookup as if by find-symbol) ++in the specified package-name. The resulting symbols ++are imported into the package being defined, and ++placed on the shadowing symbols list as if by shadowing-import. ++In no case are symbols created in any package ++other than the one being defined. ++

++
++
:import-from
++

The symbols named by the argument symbol-names ++are found in the package named by package-name and ++they are imported into the package being defined. ++In no case are symbols created in any package ++other than the one being defined. ++

++
++
:export
++

The symbols named by ++the argument symbol-names are found ++or created in the package being defined ++and exported. ++The :export option interacts ++with the :use option, since inherited symbols ++ can be used rather than new ones created. ++The :export option interacts ++ with the ++:import-from and :shadowing-import-from options, since ++ imported ++symbols can be used rather than new ones created. ++If an argument to the :export option is accessible as ++an (inherited) internal symbol via use-package, that the ++symbol named by symbol-name ++is first imported into the package being ++defined, and is then exported from that package. ++

++
++
:intern
++

The symbols named by the argument symbol-names ++are found or created in the package being defined. ++The :intern option interacts with the ++:use option, since inherited symbols ++can be used rather than new ones created. ++

++
++
:size
++

The argument to the :size option ++declares the approximate number of symbols expected in the ++package. ++ This is an efficiency hint only and might be ignored by an ++implementation. ++

++
++ ++

The order in which the options appear in a ++defpackage form is irrelevant. ++The order in which they are executed is as follows: ++

++
1.
++

:shadow and :shadowing-import-from. ++

++
2.
++

:use. ++

++
3.
++

:import-from and :intern. ++

++
4.
++

:export. ++

++
++ ++

Shadows are established first, since they might be necessary to block ++spurious name conflicts when the :use ++option is processed. The :use option is executed ++next so that :intern and :export options can refer to normally ++inherited symbols. ++The :export option is executed last so that it can refer to ++symbols created by any of the other options; in ++particular, shadowing symbols and ++imported symbols can be made external. ++

++

If a defpackage form appears as a top level form, ++all of the actions normally performed by this macro ++at load time must also be performed at compile time. ++

++

Examples::

++ ++
++
 (defpackage "MY-PACKAGE"
++   (:nicknames "MYPKG" "MY-PKG")
++   (:use "COMMON-LISP")
++   (:shadow "CAR" "CDR")
++   (:shadowing-import-from "VENDOR-COMMON-LISP"  "CONS")
++   (:import-from "VENDOR-COMMON-LISP"  "GC")
++   (:export "EQ" "CONS" "FROBOLA")
++   )
++
++ (defpackage my-package
++   (:nicknames mypkg :MY-PKG)  ; remember Common Lisp conventions for case
++   (:use common-lisp)          ; conversion on symbols
++   (:shadow CAR :cdr #:cons)                              
++   (:export "CONS")            ; this is the shadowed one.
++   )
++
++ ++

Affected By::

++ ++

Existing packages. ++

++

Exceptional Situations::

++ ++

If one of the supplied :nicknames already ++refers to an existing package, ++an error of type package-error is signaled. ++

++

An error of type program-error should be signaled if :size or :documentation ++appears more than once. ++

++

Since implementations might allow extended options ++an error of type program-error should be signaled ++if an option is present that is not ++actually supported in the host implementation. ++

++

The collection of symbol-name arguments given to the options ++ :shadow, :intern, ++:import-from, and :shadowing-import-from must ++ all be disjoint; additionally, the symbol-name arguments given to ++ :export and :intern ++must be disjoint. ++Disjoint in this context is defined as no two of the symbol-names ++being string= with each other. If either condition is ++ violated, an error of type program-error should be signaled. ++

++

For the :shadowing-import-from and :import-from options, ++a correctable error of type package-error ++ is signaled if no symbol is ++accessible in the package named by ++ package-name for one of the argument symbol-names. ++

++

Name conflict errors are handled by the underlying calls to ++make-package, use-package, import, and ++export. See Package Concepts. ++

++

See Also::

++ ++

documentation ++, ++Package Concepts, ++Compilation ++

++

Notes::

++ ++

The :intern option is useful if an :import-from or a ++:shadowing-import-from option in a subsequent call to defpackage ++(for some other package) expects to find ++these symbols accessible but not necessarily external. ++

++

It is recommended that the entire package definition is put ++in a single place, and that all the package definitions of a ++program are in a single file. This file can be loaded before ++loading or compiling anything else that depends on those ++packages. Such a file can be read in the COMMON-LISP-USER package, ++avoiding any initial state issues. ++

++

defpackage cannot be used to create two “mutually ++recursive” packages, such as: ++

++
++
 (defpackage my-package
++   (:use common-lisp your-package)    ;requires your-package to exist first
++   (:export "MY-FUN"))                
++ (defpackage your-package
++   (:use common-lisp)
++   (:import-from my-package "MY-FUN") ;requires my-package to exist first
++   (:export "MY-FUN"))
++
++ ++

However, nothing prevents the user from using the ++package-affecting functions ++such as use-package, ++import, and export to establish such links ++after a more standard use of defpackage. ++

++

The macroexpansion of defpackage ++could usefully canonicalize the names ++into strings, ++so that even if a source file has random symbols in the ++defpackage form, the compiled file would only contain ++strings. ++

++

Frequently additional implementation-dependent options take the ++form of a keyword standing by itself as an abbreviation for a list ++(keyword T); this syntax should be properly reported as an unrecognized ++option in implementations that do not support it. ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defparameter.html +@@ -0,0 +1,233 @@ ++ ++ ++ ++ ++ ++defparameter (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.16 defparameter, defvar [Macro]

++ ++

defparameter name initial-value [documentation] name ++

++

defvar name [initial-value [documentation]]name ++

++

Arguments and Values::

++ ++

name—a symbol; not evaluated. ++

++

initial-value—a form; ++ for defparameter, it is always evaluated, ++ but for defvar it is evaluated ++ only if name is not already bound. ++

++

documentation—a string; not evaluated. ++

++

Description::

++ ++

defparameter and defvar establish name ++as a dynamic variable. ++

++

defparameter unconditionally ++assigns the initial-value to the dynamic variable named name. ++defvar, by contrast, assigns initial-value (if supplied) ++to the dynamic variable named name ++only if name is not already bound. ++

++

If no initial-value is supplied, ++defvar leaves the value cell of ++the dynamic variable named name undisturbed; ++ if name was previously bound, its old value persists, ++and if it was previously unbound, it remains unbound. ++

++

If documentation is supplied, it is attached to name as a ++documentation string of kind variable. ++

++

defparameter and defvar normally appear as a top level form, ++but it is meaningful for them to appear as non-top-level forms. However, ++the compile-time side effects described below only take place when ++they appear as top level forms. ++

++

Examples::

++ ++
++
 (defparameter *p* 1) ⇒  *P*
++ *p* ⇒  1
++ (constantp '*p*) ⇒  false
++ (setq *p* 2) ⇒  2
++ (defparameter *p* 3) ⇒  *P*
++ *p* ⇒  3
++
++ (defvar *v* 1) ⇒  *V*
++ *v* ⇒  1
++ (constantp '*v*) ⇒  false
++ (setq *v* 2) ⇒  2
++ (defvar *v* 3) ⇒  *V*
++ *v* ⇒  2
++
++ (defun foo ()
++   (let ((*p* 'p) (*v* 'v))
++     (bar))) ⇒  FOO
++ (defun bar () (list *p* *v*)) ⇒  BAR
++ (foo) ⇒  (P V)
++
++ ++

The principal operational distinction between defparameter and defvar ++is that defparameter makes an unconditional assignment to name, ++while defvar makes a conditional one. In practice, this means that ++defparameter is useful in situations where loading or reloading the definition ++would want to pick up a new value of the variable, while defvar is used in ++situations where the old value would want to be retained if the file were loaded or reloaded. ++For example, one might create a file which contained: ++

++
++
 (defvar *the-interesting-numbers* '())
++ (defmacro define-interesting-number (name n)
++   `(progn (defvar ,name ,n)
++           (pushnew ,name *the-interesting-numbers*)
++           ',name))
++ (define-interesting-number *my-height* 168) ;cm
++ (define-interesting-number *my-weight* 13)  ;stones
++
++ ++

Here the initial value, (), for the variable *the-interesting-numbers* ++is just a seed that we are never likely to want to reset to something else ++once something has been grown from it. As such, we have used defvar ++to avoid having the *interesting-numbers* information reset if the file is ++loaded a second time. It is true that the two calls to ++define-interesting-number here would be reprocessed, but ++if there were additional calls in another file, they would not be and that ++information would be lost. On the other hand, consider the following code: ++

++
++
 (defparameter *default-beep-count* 3)
++ (defun beep (&optional (n *default-beep-count*))
++   (dotimes (i n) (si:
++
++ ++

Here we could easily imagine editing the code to change the initial value of ++*default-beep-count*, and then reloading the file to pick up the new value. ++In order to make value updating easy, we have used defparameter. ++

++

On the other hand, there is potential value to using defvar in this ++situation. For example, suppose that someone had predefined an alternate ++value for *default-beep-count*, or had loaded the file and then manually ++changed the value. In both cases, if we had used defvar instead of ++defparameter, those user preferences would not be overridden by ++(re)loading the file. ++

++

The choice of whether to use defparameter or defvar has ++visible consequences to programs, but is nevertheless often made for subjective ++reasons. ++

++

Side Effects::

++ ++

If a defvar or defparameter form appears as a top level form, ++the compiler must recognize that the name has been ++proclaimed special. However, it must neither evaluate ++the initial-value form nor assign the ++dynamic variable named name at compile time. ++

++

There may be additional (implementation-defined) compile-time or ++run-time side effects, as long as such effects do not interfere with the ++correct operation of conforming programs. ++

++

Affected By::

++ ++

defvar is affected by whether name is already bound. ++

++

See Also::

++ ++

declaim ++, ++defconstant ++, ++documentation ++, ++Compilation ++

++

Notes::

++ ++

It is customary to name dynamic variables with an asterisk ++at the beginning and end of the name. e.g., *foo* is a good name for ++a dynamic variable, but not for a lexical variable; ++foo is a good name for a lexical variable, ++but not for a dynamic variable. ++This naming convention is observed for all defined names in Common Lisp; ++however, neither conforming programs nor conforming implementations ++are obliged to adhere to this convention. ++

++

The intent of the permission for additional side effects is to allow ++implementations to do normal “bookkeeping” that accompanies ++definitions. For example, the macro expansion of a defvar ++or defparameter form might include code that arranges to ++record the name of the source file in which the definition occurs. ++

++

defparameter and defvar might be defined as follows: ++

++
++
 (defmacro defparameter (name initial-value 
++                         &optional (documentation nil documentation-p))
++   `(progn (declaim (special ,name))
++           (setf (symbol-value ',name) ,initial-value)
++           ,(when documentation-p
++              `(setf (documentation ',name 'variable) ',documentation))
++           ',name))
++ (defmacro defvar (name &optional
++                        (initial-value nil initial-value-p)
++                        (documentation nil documentation-p))
++   `(progn (declaim (special ,name))
++           ,(when initial-value-p
++              `(unless (boundp ',name)
++                 (setf (symbol-value ',name) ,initial-value)))
++           ,(when documentation-p
++              `(setf (documentation ',name 'variable) ',documentation))
++           ',name))
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defsetf.html +@@ -0,0 +1,268 @@ ++ ++ ++ ++ ++ ++defsetf (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.61 defsetf [Macro]

++ ++

The “short form”: ++

++

defsetf access-fn update-fn [documentation]
++ ⇒ access-fn ++

++

The “long form”: ++

++

defsetf access-fn lambda-list ({store-variable}*) ++ [[{declaration}* | documentation]] {form}*
++ ⇒ access-fn ++

++

Arguments and Values::

++ ++

access-fn—a symbol which names a function or a macro. ++

++

update-fn—a symbol naming a function or macro. ++

++

lambda-list—a defsetf lambda list. ++

++

store-variable—a symbol (a variable name). ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

form—a form. ++

++

Description::

++ ++

defsetf defines how to ++setf a place ++of the form (access-fn ...) for relatively simple cases. ++(See define-setf-expander for more general access to this facility.) ++

++

It must be the case that the function or macro named by access-fn ++evaluates all of its arguments. ++

++

defsetf may take one of two forms, called the “short form” and the “long form,” ++which are distinguished by the type of the second argument. ++

++

When the short form is used, ++update-fn must name ++a function (or macro) that takes one more argument ++than access-fn takes. When setf is given a place ++that is a call on access-fn, it expands into ++a call on update-fn that is given all the arguments to ++access-fn and also, as its last argument, the new value ++(which must be returned by update-fn as its value). ++

++

The long form defsetf ++resembles defmacro. ++The lambda-list describes the arguments of access-fn. ++The store-variables describe the ++value ++

++

or values ++

++

to be stored into the place. ++The body must ++compute the expansion of a setf of a call on access-fn. ++

++

The expansion function is defined in the same lexical environment ++in which the defsetf form appears. ++

++

During the evaluation of the ++forms, the variables in the lambda-list and the ++store-variables ++are bound to names of temporary variables, ++generated as if by gensym ++or gentemp, ++that will be bound by the ++expansion of setf ++to the values of those subforms. This binding ++permits the ++forms to be written without regard for order-of-evaluation ++issues. defsetf arranges for the temporary variables to be ++optimized out of the final result in cases where that is possible. ++

++

The body code in defsetf is implicitly enclosed in a ++block whose name is ++access-fn ++

++

defsetf ++ensures that subforms ++of the place are evaluated exactly once. ++

++

Documentation is attached to access-fn as a documentation string ++of kind setf. ++

++

If a defsetf form appears as a top level form, ++the compiler must make the setf expander available so that ++it may be used to expand calls to setf later on in the file. ++Users must ensure that the forms, if any, can be evaluated ++at compile time if the access-fn is used in a place ++later in the same file. ++The compiler must make these setf expanders available to ++compile-time calls to get-setf-expansion when its environment ++argument is a value received as the environment parameter of a macro. ++

++

Examples::

++

The effect of ++

++
++
 (defsetf symbol-value set)
++
++ ++

is built into the Common Lisp system. ++This causes the form (setf (symbol-value foo) fu) ++to expand into (set foo fu). ++

++

Note that ++

++
++
 (defsetf car rplaca)
++
++ ++

would be incorrect because rplaca does not return its last argument. ++

++
++
 (defun middleguy (x) (nth (truncate (1- (list-length x)) 2) x)) ⇒  MIDDLEGUY
++ (defun set-middleguy (x v)
++    (unless (null x)
++      (rplaca (nthcdr (truncate (1- (list-length x)) 2) x) v))
++    v) ⇒  SET-MIDDLEGUY
++ (defsetf middleguy set-middleguy) ⇒  MIDDLEGUY
++ (setq a (list 'a 'b 'c 'd)
++       b (list 'x)
++       c (list 1 2 3 (list 4 5 6) 7 8 9)) ⇒  (1 2 3 (4 5 6) 7 8 9)
++ (setf (middleguy a) 3) ⇒  3
++ (setf (middleguy b) 7) ⇒  7
++ (setf (middleguy (middleguy c)) 'middleguy-symbol) ⇒  MIDDLEGUY-SYMBOL
++ a ⇒  (A 3 C D)
++ b ⇒  (7)
++ c ⇒  (1 2 3 (4 MIDDLEGUY-SYMBOL 6) 7 8 9)
++
++ ++

An example of the use of the long form of defsetf: ++

++
++
 (defsetf subseq (sequence start &optional end) (new-sequence)
++   `(progn (replace ,sequence ,new-sequence
++                    :start1 ,start :end1 ,end)
++           ,new-sequence)) ⇒  SUBSEQ
++
++ ++
++
 (defvar *xy* (make-array '(10 10)))
++ (defun xy (&key ((x x) 0) ((y y) 0)) (aref *xy* x y)) ⇒  XY
++ (defun set-xy (new-value &key ((x x) 0) ((y y) 0))
++   (setf (aref *xy* x y) new-value)) ⇒  SET-XY
++ (defsetf xy (&key ((x x) 0) ((y y) 0)) (store)
++   `(set-xy ,store 'x ,x 'y ,y)) ⇒  XY
++ (get-setf-expansion '(xy a b))
++⇒  (#:t0 #:t1),
++   (a b),
++   (#:store),
++   ((lambda (&key ((x #:x)) ((y #:y))) 
++      (set-xy #:store 'x #:x 'y #:y))
++    #:t0 #:t1),
++   (xy #:t0 #:t1)
++ (xy 'x 1) ⇒  NIL
++ (setf (xy 'x 1) 1) ⇒  1
++ (xy 'x 1) ⇒  1
++ (let ((a 'x) (b 'y))
++   (setf (xy a 1 b 2) 3)
++   (setf (xy b 5 a 9) 14))
++⇒  14
++ (xy 'y 0 'x 1) ⇒  1
++ (xy 'x 1 'y 2) ⇒  3
++
++ ++

See Also::

++ ++

documentation ++, ++setf ++, ++

++

define-setf-expander ++, ++get-setf-expansion ++, ++

++

Generalized Reference, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++ ++

forms must include provision ++for returning the correct value (the value ++

++

or values ++

++

of store-variable). ++This is ++handled by forms rather than by defsetf because ++in many cases this value can be returned at no extra cost, by calling a ++function that simultaneously stores into the place and ++returns the correct value. ++

++

A setf of a call on access-fn also evaluates ++all of access-fn’s arguments; it cannot treat any of them specially. ++This means that defsetf ++cannot be used to describe how to store into ++a generalized reference to a byte, such as (ldb field reference). ++

++

define-setf-expander ++

++

is used to handle situations that ++do not fit the restrictions imposed by defsetf ++and gives the user additional control. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defstruct.html +@@ -0,0 +1,1193 @@ ++ ++ ++ ++ ++ ++defstruct (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

8.1.1 defstruct [Macro]

++ ++

defstruct name-and-options [documentation] {!slot-description}*
++ ⇒ structure-name ++

++

name-and-options ::=structure-name | (structure-name [[!options]]) ++

++

options ::=!conc-name-option | ++            {!constructor-option}* | ++            !copier-option | ++            !include-option | ++            !initial-offset-option | ++            !named-option | ++            !predicate-option | ++            !printer-option | ++            !type-option ++

++

conc-name-option ::=:conc-name | (:conc-name) | (:conc-name conc-name) ++

++

constructor-option ::=:constructor | ++                       (:constructor) | ++                       (:constructor constructor-name) | ++                       (:constructor constructor-name constructor-arglist) ++

++

copier-option ::=:copier | (:copier) | (:copier copier-name) ++

++

predicate-option ::=:predicate | (:predicate) | (:predicate predicate-name) ++

++

include-option ::=(:include included-structure-name {!slot-description}*) ++

++

printer-option ::=!print-object-option | !print-function-option ++

++

print-object-option ::=(:print-object printer-name) | (:print-object) ++

++

print-function-option ::=(:print-function printer-name) | (:print-function) ++

++

type-option ::=(:type type) ++

++

named-option ::=:named ++

++

initial-offset-option ::=(:initial-offset initial-offset) ++

++

slot-description ::=slot-name |  ++                     (slot-name [slot-initform [[!slot-option]]]) ++

++

slot-option ::=:type slot-type |  ++                :read-only slot-read-only-p ++

++

Arguments and Values::

++ ++

conc-name—a string designator. ++

++

constructor-arglist—a boa lambda list. ++

++

constructor-name—a symbol. ++

++

copier-name—a symbol. ++

++

included-structure-name—an already-defined structure name. ++

++

Note that a derived type is not permissible, ++even if it would expand into a structure name. ++

++

initial-offset—a non-negative integer. ++

++

predicate-name—a symbol. ++

++

printer-name—a function name or a lambda expression. ++

++

slot-name—a symbol. ++

++

slot-initform—a form. ++

++

slot-read-only-p—a generalized boolean. ++

++

structure-name—a symbol. ++

++

type—one of the type specifiers ++ list, ++ vector, ++ or (vector size), ++ or some other type specifier defined ++ by the implementation to be appropriate. ++

++

documentation—a string; not evaluated. ++

++

Description::

++ ++

defstruct defines a structured type, named structure-type, ++with named slots as specified by the slot-options. ++

++

defstruct defines readers for the slots and ++arranges for setf to work properly on such ++reader functions. ++Also, unless overridden, it ++ defines a predicate named name-p, ++ defines a constructor function named make-constructor-name, ++ and defines a copier function named copy-constructor-name. ++All names of automatically created functions might automatically ++be declared inline (at the discretion of the implementation). ++

++

If documentation is supplied, it is attached to structure-name ++as a documentation string of kind structure, ++

++

and unless :type is used, the documentation is also attached ++to structure-name as a documentation string of kind ++type and as a documentation string to the class object ++for the class named structure-name. ++

++

defstruct defines a constructor function that is used to ++create instances of the structure created by defstruct. ++The default name is make-structure-name. ++A different name can be supplied ++by giving the name as the argument to the constructor option. ++nil indicates that no constructor function will be created. ++

++

After a new structure type has been defined, instances of that type ++normally can be created by using the constructor function for the ++type. ++A call to a constructor function is of the following form: ++

++

 (constructor-function-name
++  slot-keyword-1 form-1
++  slot-keyword-2 form-2
++  ...)
++

++

The arguments to the constructor function are all keyword arguments. Each ++slot keyword argument must be ++a keyword whose name corresponds to the name of a structure slot. ++All the keywords and forms ++are evaluated. ++If a slot is not initialized in this way, ++it is initialized by evaluating slot-initform in the slot description ++

++

at the time the constructor function is called. ++

++

If no slot-initform is supplied, ++the consequences are undefined if an attempt is later made to read the slot’s value ++before a value is explicitly assigned. ++

++

Each slot-initform supplied for a defstruct component, ++when used by the constructor function for an otherwise unsupplied ++component, is re-evaluated on every call to the ++constructor function. ++

++

The slot-initform is not evaluated ++ unless it is needed in the creation of a particular structure ++ instance. If it is never needed, there can be no type-mismatch ++ error, even if the type ++of the slot is specified; no warning ++ should be issued in this case. ++

++

For example, in the following sequence, only the last call is an error. ++

++
++
 (defstruct person (name 007 :type string)) 
++ (make-person :name "James")
++ (make-person)
++
++ ++

It is as if the slot-initforms were ++used as initialization forms for the keyword parameters ++of the constructor function. ++

++

The symbols which name the slots must not be used by the ++implementation as the names for the lambda variables ++in the constructor function, since one or more of those symbols ++might have been proclaimed special or might be defined as ++the name of a constant variable. ++The slot default init forms are evaluated ++in the lexical environment in which the defstruct form itself appears and ++in the dynamic environment in which the call to the constructor function appears. ++

++

For example, if the form (gensym) were used as an initialization form, ++either in the constructor-function call or as the default initialization form ++in defstruct, then every call to the constructor function would call ++gensym once to generate a new symbol. ++

++

Each slot-description in defstruct can specify zero or more ++slot-options. ++

++

A slot-option consists of a pair of a keyword and a value ++(which is not a form to be evaluated, but the value itself). For example: ++

++
++
 (defstruct ship
++   (x-position 0.0 :type short-float)
++   (y-position 0.0 :type short-float)
++   (x-velocity 0.0 :type short-float)
++   (y-velocity 0.0 :type short-float)
++   (mass *default-ship-mass* :type short-float :read-only t))
++
++ ++

This specifies that each slot always contains a short float, ++and that the last slot cannot be altered once a ship is constructed. ++

++

The available slot-options are: ++

++
:type type
++

This specifies that the contents of the ++slot is always of type type. This is entirely ++analogous to the declaration of a variable or function; it ++effectively declares the result type of the reader function. ++It is implementation-dependent whether the type is checked ++ when initializing a slot ++ or when assigning to it. ++Type is not evaluated; it must be a valid type specifier. ++

++
++
:read-only x
++

When x is true, ++this specifies that this slot cannot be ++altered; it will always contain the value supplied at construction time. ++setf will not accept the reader function for this slot. ++If x is false, this slot-option has no effect. ++X is not evaluated. ++

++

When this option is false or unsupplied, ++it is implementation-dependent whether the ability to write ++the slot is implemented by a setf function or a setf expander. ++

++
++
++ ++

The following keyword options are available for use with defstruct. ++A defstruct option can be either a keyword or a list ++of a keyword and arguments for that keyword; ++specifying the keyword by itself is equivalent to specifying a list consisting of ++the keyword and no arguments. ++The syntax for defstruct options differs from the pair syntax ++used for slot-options. No part of any of these options is evaluated. ++

++
:conc-name
++

This provides for automatic prefixing of names of reader (or access) functions. ++The default behavior is to begin the names of all the reader functions of ++a structure with the name of the structure followed by a hyphen. ++

++

:conc-name supplies an alternate ++prefix to be used. If a hyphen is to be used as a separator, ++it must be supplied as part of the prefix. ++If :conc-name is nil or no argument is supplied, ++then no prefix is used; ++then the names of the reader functions ++are the same as the slot names. ++If a non-nil prefix is given, ++the name of the reader function for each slot is constructed by ++concatenating that prefix and the name of the slot, and interning the resulting ++symbol in the package that is current at the time the ++defstruct form is expanded. ++

++

Note that no matter what is supplied for :conc-name, ++slot keywords that match the slot names with no prefix attached are used ++with a constructor function. ++The reader function name is used ++in conjunction with setf. Here is an example: ++

++
++
 (defstruct (door (:conc-name dr-)) knob-color width material) ⇒  DOOR
++ (setq my-door (make-door :knob-color 'red :width 5.0)) 
++⇒  #S(DOOR :KNOB-COLOR RED :WIDTH 5.0 :MATERIAL NIL)
++ (dr-width my-door) ⇒  5.0
++ (setf (dr-width my-door) 43.7) ⇒  43.7
++ (dr-width my-door) ⇒  43.7
++
++ ++

Whether or not the :conc-name option is explicitly supplied, ++the following rule governs name conflicts of generated reader ++(or accessor) names: ++For any structure type S_1 ++having a reader function named R for a slot named X_1 ++that is inherited by another structure type S_2 ++that would have a reader function with the same name R for a slot named X_2, ++no definition for R is generated by the definition of S_2; ++instead, the definition of R is inherited from the definition of S_1. ++(In such a case, if X_1 and X_2 are different slots, ++the implementation might signal a style warning.) ++

++
++
:constructor
++

This option takes zero, one, or two arguments. ++If at least one argument is supplied and the first argument is not nil, then ++that argument is a symbol which specifies the name of the ++constructor function. If the argument is not supplied (or if the option itself is not ++supplied), the name of the constructor is produced by concatenating the ++string "MAKE-" and the name of the structure, interning the name ++in whatever package is current at the time defstruct ++is expanded. If the argument is provided and is nil, ++no constructor function is defined. ++

++

If :constructor is given as ++(:constructor name arglist), ++then instead of making a keyword ++driven constructor function, defstruct ++defines a “positional” constructor function, ++taking arguments whose meaning is determined by the argument’s position ++and possibly by keywords. ++Arglist is used to describe what the arguments to the ++constructor will be. In the simplest case something like ++(:constructor make-foo (a b c)) defines make-foo to be ++a three-argument ++constructor function whose arguments are used to initialize the ++slots named a, b, and c. ++

++

Because a constructor of this type operates “By Order of Arguments,” ++it is sometimes known as a “boa constructor.” ++

++

For information on how the arglist for a “boa constructor” is ++processed, see Boa Lambda Lists. ++

++

It is permissible to use the ++:constructor option more than once, so that you can define several ++different constructor functions, each taking different parameters. ++

++

[Reviewer Note by Barmar: What about (:constructor) and (:constructor nil). ++ Should we worry about it?] ++

++

defstruct creates the default-named keyword constructor function ++only if no explicit :constructor options are specified, or if the ++:constructor option is specified without a name argument. ++

++

(:constructor nil) is meaningful only when there are no other ++:constructor options specified. It prevents defstruct ++from generating any constructors at all. ++

++

Otherwise, defstruct creates a constructor function corresponding ++to each supplied :constructor option. It is permissible to specify ++multiple keyword constructor functions as well as multiple ++“boa constructors”. ++

++
++
:copier
++

This option takes one argument, a symbol, ++which specifies the name of the copier ++function. If the argument is not provided or if the option itself is not ++provided, the name of the copier is produced by concatenating the ++string "COPY-" and the name of the structure, interning the name ++in whatever package is current at the time defstruct ++is expanded. ++If the argument is provided and is nil, no copier function is defined. ++

++

The automatically defined copier function is a function of ++one argument, ++

++

which must be of the structure type being defined. ++

++

The copier function creates a fresh ++structure that has the same type as its argument, ++and that has the same component values as the original ++structure; that is, the component values are not copied recursively. ++

++

If the defstruct :type option was not used, ++the following equivalence applies: ++

++
++
 (copier-name x) = (copy-structure (the structure-name x))
++
++ ++
++
:include
++

This option is used for building a new structure definition as ++an extension of another structure definition. For example: ++

++
++
 (defstruct person name age sex)
++
++ ++

To make a new structure to represent an astronaut ++that has the ++attributes of name, age, and sex, and functions ++that operate on person structures, astronaut is defined ++with :include as follows: ++

++
++
 (defstruct (astronaut (:include person)
++                       (:conc-name astro-))
++    helmet-size
++    (favorite-beverage 'tang))
++
++ ++

:include causes the structure being defined ++to have the same slots as the included structure. ++This is done in such a way ++that the reader functions for the included ++structure also work on the structure being defined. ++In this example, an ++astronaut therefore has five slots: the three defined in ++person and the two defined in astronaut ++itself. The reader functions defined by the person structure ++can be applied to instances of the astronaut structure, and they ++work correctly. ++Moreover, astronaut has its own reader functions for ++components defined by the person structure. ++The following examples illustrate the ++use of astronaut structures: ++

++
++
 (setq x (make-astronaut :name 'buzz
++                         :age 45.
++                         :sex t
++                         :helmet-size 17.5))
++ (person-name x) ⇒  BUZZ
++ (astro-name x) ⇒  BUZZ
++ (astro-favorite-beverage x) ⇒  TANG
++
++ ++
++
 (reduce #'+ astros :key #'person-age) ; obtains the total of the ages 
++                                       ; of the possibly empty
++                                       ; sequence of astros
++
++ ++

The difference between the reader functions person-name and astro-name ++is that person-name can be correctly applied to any person, ++including an astronaut, while astro-name can be correctly ++applied only to an astronaut. An implementation might ++check for incorrect use of reader functions. ++

++

At most one :include can be supplied in a single defstruct. ++The argument to :include is required and must be the ++name of some previously defined structure. If the structure being ++defined has no :type option, then the included structure must ++also have had no :type option supplied for it. ++If the structure being defined has a :type option, ++then the included structure must have been declared with a :type ++option specifying the same representation type. ++

++

If no :type option is involved, then ++the structure name of the including structure definition ++becomes the name of a data type, and therefore ++a valid type specifier recognizable by typep; it becomes ++a subtype of the included structure. ++In the above example, ++astronaut is a subtype of person; hence ++

++
++
 (typep (make-astronaut) 'person) ⇒  true
++
++ ++

indicating that all operations on persons also ++work on astronauts. ++

++

The structure using :include can specify default values or ++slot-options for the included slots different from those the included ++structure specifies, by giving the :include option as: ++

++
++
 (:include included-structure-name {slot-description}*)
++
++ ++

Each slot-description must have a slot-name ++that is the same ++as that of some slot in the included structure. ++If a slot-description has no slot-initform, ++then in the new structure the slot has no initial value. ++Otherwise its initial value form is replaced by ++the slot-initform in the slot-description. ++A normally writable slot can be made read-only. ++If a slot is read-only in the included structure, then it ++must also be so in the including structure. ++If a type is supplied for a slot, it must be ++a subtype of ++the ++type specified in the included structure. ++

++

For example, if the ++default age for an astronaut is 45, then ++

++
++
 (defstruct (astronaut (:include person (age 45)))
++    helmet-size
++    (favorite-beverage 'tang))
++
++ ++

If :include is used with the :type ++option, then the effect is first to skip over as many representation ++elements as needed to represent the included structure, then to ++skip over any additional elements supplied by the :initial-offset ++option, and then to begin allocation of elements from that point. ++For example: ++

++
++
 (defstruct (binop (:type list) :named (:initial-offset 2))
++   (operator '? :type symbol)   
++   operand-1
++   operand-2) ⇒  BINOP
++ (defstruct (annotated-binop (:type list)
++                             (:initial-offset 3)
++                             (:include binop))
++  commutative associative identity) ⇒  ANNOTATED-BINOP
++ (make-annotated-binop :operator '*
++                       :operand-1 'x
++                       :operand-2 5
++                       :commutative t
++                       :associative t
++                       :identity 1)
++   ⇒  (NIL NIL BINOP * X 5 NIL NIL NIL T T 1)
++
++ ++

The first two nil elements stem from the :initial-offset of 2 ++in the definition of binop. The next four elements contain the ++structure name and three slots for binop. The next three nil elements ++stem from the :initial-offset of 3 in the definition of ++annotated-binop. The last three list elements contain the additional ++slots for an annotated-binop. ++

++
++
:initial-offset
++

:initial-offset instructs defstruct to skip over a certain ++number of slots before it starts allocating the slots described in the ++body. This option’s argument is the number of slots defstruct ++should skip. :initial-offset can be used only if :type is also supplied. ++

++

[Reviewer Note by Barmar: What are initial values of the skipped slots?] ++

++

:initial-offset allows ++slots to be allocated beginning at a representational ++element other than the first. For example, the form ++

++
++
 (defstruct (binop (:type list) (:initial-offset 2))
++   (operator '? :type symbol)
++   operand-1
++   operand-2) ⇒  BINOP
++
++ ++

would result in the following behavior for make-binop: ++

++
++
 (make-binop :operator '+ :operand-1 'x :operand-2 5)
++⇒  (NIL NIL + X 5)
++ (make-binop :operand-2 4 :operator '*)
++⇒  (NIL NIL * NIL 4)
++
++ ++

The selector functions ++binop-operator, binop-operand-1, ++and binop-operand-2 would be essentially equivalent to third, ++fourth, and fifth, respectively. ++Similarly, the form ++

++
++
 (defstruct (binop (:type list) :named (:initial-offset 2))
++   (operator '? :type symbol)
++   operand-1
++   operand-2) ⇒  BINOP
++
++ ++

would result in the following behavior for make-binop: ++

++
++
 (make-binop :operator '+ :operand-1 'x :operand-2 5) ⇒  (NIL NIL BINOP + X 5)
++ (make-binop :operand-2 4 :operator '*) ⇒  (NIL NIL BINOP * NIL 4)
++
++ ++

The first two nil elements stem from the :initial-offset of 2 ++in the definition of binop. The next four elements contain the ++structure name and three slots for binop. ++

++
++
:named
++

:named specifies that the structure is named. ++If no :type is supplied, ++then the structure is always named. ++

++

For example: ++

++
++
 (defstruct (binop (:type list))
++   (operator '? :type symbol)
++   operand-1
++   operand-2) ⇒  BINOP
++
++ ++

This defines a constructor function make-binop and three ++selector functions, namely binop-operator, binop-operand-1, ++and binop-operand-2. (It does not, however, define a predicate ++binop-p, for reasons explained below.) ++

++

The effect of make-binop is simply to construct a list of length three: ++

++
++
 (make-binop :operator '+ :operand-1 'x :operand-2 5) ⇒  (+ X 5)  
++ (make-binop :operand-2 4 :operator '*) ⇒  (* NIL 4)
++
++ ++

It is just like the function list except that it takes ++keyword arguments and performs slot defaulting appropriate to the binop ++conceptual data type. Similarly, the selector functions ++binop-operator, binop-operand-1, ++and binop-operand-2 are essentially equivalent to car, ++cadr, and caddr, respectively. They might not be ++completely equivalent because, ++for example, an implementation would be justified in adding error-checking ++code to ensure that the argument to each selector function is a length-3 ++list. ++

++

binop is a conceptual data type in that it is not made a part of ++the Common Lisp type system. typep does not recognize binop as ++a type specifier, and type-of returns list when ++given a binop structure. There is no way to distinguish a data ++structure constructed by make-binop from any other list that ++happens to have the correct structure. ++

++

There is not any way to recover the structure name binop from ++a structure created by make-binop. This can only be done ++if the structure is named. ++A named structure has the property that, given an instance of the ++structure, the structure name (that names the type) can be reliably ++recovered. For structures defined ++with no :type option, the structure name actually becomes part ++of the Common Lisp data-type system. type-of, ++when applied to such a structure, returns the structure name ++as the type of the object; ++typep recognizes ++the structure name as a valid type specifier. ++

++

For structures defined with a :type option, type-of ++returns a type specifier such as list or (vector t), ++depending on the type supplied to the :type option. ++The structure name does not become a valid type specifier. ++However, ++if the :named option is also supplied, then the first component ++of the structure (as created by a defstruct constructor function) ++always contains the structure name. This allows the structure name ++to be recovered from an instance of the structure and allows a reasonable ++predicate for the conceptual type to be defined: ++the automatically defined ++name-p predicate for the structure operates by first ++checking that its argument is of the proper type (list, ++(vector t), ++or whatever) and then checking whether the first component contains ++the appropriate type name. ++

++

Consider the binop example shown above, modified only to ++include the :named option: ++

++
++
 (defstruct (binop (:type list) :named)
++   (operator '? :type symbol)
++   operand-1
++   operand-2) ⇒  BINOP
++
++ ++

As before, this defines a constructor function make-binop and three ++selector functions binop-operator, binop-operand-1, ++and binop-operand-2. It also defines a predicate binop-p. ++The effect of make-binop is now to construct a list of length four: ++

++
++
 (make-binop :operator '+ :operand-1 'x :operand-2 5) ⇒  (BINOP + X 5)
++ (make-binop :operand-2 4 :operator '*) ⇒  (BINOP * NIL 4)
++
++ ++

The structure has the same layout as before except that the structure name ++binop is included as the first list element. ++The selector functions ++binop-operator, binop-operand-1, ++and binop-operand-2 are essentially equivalent to cadr, ++caddr, and cadddr, respectively. ++The predicate binop-p is more or less equivalent to this ++definition: ++

++
++
 (defun binop-p (x)
++   (and (consp x) (eq (car x) 'binop))) ⇒  BINOP-P
++
++ ++

The name binop is still not a valid type specifier recognizable ++to typep, but at least there is a way of distinguishing binop ++structures from other similarly defined structures. ++

++
++
:predicate
++

This option takes one argument, which specifies the name of the type predicate. ++If the argument is not supplied or if the option itself is not ++supplied, the name of the predicate is made by concatenating the ++name of the structure to the string "-P", interning the name ++in whatever package is current at the time defstruct ++is expanded. ++If the argument is provided and is nil, no predicate is defined. ++A predicate can be defined only if the structure is named; ++if :type is supplied and :named is not supplied, ++then :predicate must either be unsupplied or have the value nil. ++

++
++
:print-function, :print-object
++

The :print-function and :print-object ++options ++specify that a print-object ++method for structures of type structure-name should be generated. ++These options are not synonyms, but do perform a similar service; ++the choice of which option (:print-function or :print-object) is used ++affects how the function named printer-name is called. ++Only one of these options may be used, and ++these options may be used only if :type is not supplied. ++

++

If the :print-function option is used, ++then when a structure of type structure-name is to be printed, ++the designated printer function is called on three arguments: ++

++
++
++

the structure to be printed ++ (a generalized instance of structure-name). ++

++
++
++

a stream to print to. ++

++
++
++

an integer indicating the current depth. ++ The magnitude of this integer may vary between implementations; ++ however, it can reliably be compared against *print-level* ++ to determine whether depth abbreviation is appropriate. ++

++
++
++ ++

Specifying (:print-function printer-name) ++is approximately equivalent to specifying: ++

++
++
 (defmethod print-object ((object structure-name) stream)
++   (funcall (function printer-name) object stream <<current-print-depth>>))
++
++ ++

where the <<current-print-depth>> represents the printer’s belief of ++how deep it is currently printing. It is implementation-dependent ++whether <<current-print-depth>> is always 0 and *print-level*, ++if non-nil, is re-bound to successively smaller values as printing ++descends recursively, or whether current-print-depth varies in ++value as printing descends recursively and *print-level* remains ++constant during the same traversal. ++

++

If the :print-object option is used, then ++when a structure of type structure-name is to be printed, ++the designated printer function is called on two arguments: ++

++
++
++

the structure to be printed. ++

++
++
++

the stream to print to. ++

++
++
++ ++

Specifying (:print-object printer-name) is equivalent to specifying: ++

++
++
 (defmethod print-object ((object structure-name) stream)
++   (funcall (function printer-name) object stream))
++
++ ++

If no :type option is supplied, ++and if either a :print-function or a :print-object option is supplied, ++and if no printer-name is supplied, ++then a print-object method specialized for structure-name ++is generated that calls a function that implements the default printing behavior for ++structures using #S notation; see Printing Structures. ++

++

If neither a :print-function ++ nor a :print-object option ++is supplied, ++then defstruct does not generate a print-object method ++specialized for structure-name and some default behavior is inherited ++either from a structure named in an :include option ++ or from the default behavior for printing structures; ++see the function print-object and Printing Structures. ++

++

When *print-circle* is true, ++a user-defined print function can print objects ++to the supplied stream using ++ write, ++ prin1, ++ princ, ++ or format ++and expect circularities to be detected and printed using the #n# syntax. ++This applies to methods on print-object in addition to ++:print-function options. ++If a user-defined print function prints to a stream other than the one ++that was supplied, then circularity detection starts over for that stream. ++See the variable *print-circle*. ++

++
++
:type
++

:type explicitly specifies the representation to be used for ++the structure. Its argument must be one of these types: ++

++
++
vector
++

This produces the same result as specifying (vector t). ++The structure is represented ++as a general vector, storing components as vector elements. ++The first component is vector ++element 1 if the structure is :named, and element 0 otherwise. ++

++

[Reviewer Note by Barmar: Do any implementations create non-simple vectors?] ++

++
++
(vector element-type)
++

The structure is represented as a (possibly specialized) vector, storing ++components as vector elements. Every component must be of a type ++that can be stored in a vector of the type specified. ++The first component is vector ++element 1 if the structure is :named, and element 0 otherwise. ++The structure can be :named only if the type symbol ++is a subtype of the supplied element-type. ++

++
++
list
++

The structure is represented as a list. ++The first component is the cadr if the structure is :named, ++and the car if it is not :named. ++

++
++ ++

Specifying this option has the effect of forcing ++a specific representation and of forcing the components to be ++stored in the order specified in defstruct ++in corresponding successive elements of the specified representation. ++It also prevents the structure name from becoming a valid ++type specifier recognizable by typep. ++

++

For example: ++

++
++
 (defstruct (quux (:type list) :named) x y)
++
++ ++

should make a constructor that builds a list exactly like the one ++that list produces, ++with quux as its car. ++

++

If this type is defined: ++

++
++
 (deftype quux () '(satisfies quux-p))
++
++ ++

then this form ++

++
++
 (typep (make-quux) 'quux)
++
++ ++

should return precisely what this one does ++

++
++
 (typep (list 'quux nil nil) 'quux)
++
++ ++

If :type is not supplied, ++the structure is represented as an object of type structure-object. ++

++

defstruct without a :type option defines a class with ++the structure name as its name. The metaclass of structure ++instances is structure-class. ++

++
++
++ ++

The consequences of redefining a defstruct structure are undefined. ++

++

In the case where no defstruct options have been supplied, ++the following functions are automatically defined to operate ++on instances of the new structure: ++

++
++
Predicate
++

A predicate with the name structure-name-p is defined to ++test membership in the structure type. The predicate ++(structure-name-p object) is true if an object ++is of this type; otherwise it is false. typep can also ++be used with the name of the new type to test whether an ++object ++belongs to the type. ++Such a function call has the form ++(typep object 'structure-name). ++

++
++
Component reader functions
++

Reader functions are defined to read the components of the ++structure. For each slot name, there is a corresponding ++reader function with the name structure-name-slot-name. ++This function reads the contents of that slot. ++Each reader function takes one argument, which is ++an instance of the structure type. ++setf can be used with any of these reader functions ++to alter the slot contents. ++

++
++
Constructor function
++

A constructor function with the name make-structure-name ++is defined. This function creates and returns new ++instances of the structure type. ++

++
++
Copier function
++

A copier function with the name copy-structure-name is defined. ++The copier function takes an object of the structure type and creates a ++new object of the same type that is a copy of the first. The copier ++function creates a new structure with the same component entries ++as the original. Corresponding components of the two structure instances ++are eql. ++

++
++ ++

If a defstruct form appears as a top level form, ++the compiler must make the structure type name recognized ++as a valid type name in subsequent declarations (as for deftype) ++and make the structure slot readers known to setf. In addition, the ++compiler must save enough information about the structure type ++so that further defstruct definitions can use :include in a subsequent ++deftype in the same file to refer to the structure type name. ++The functions which defstruct generates are not defined ++in the compile time environment, although the compiler may save enough ++information about the functions to code subsequent calls inline. ++The #S reader macro might or might not recognize the newly defined ++structure type name at compile time. ++

++

Examples::

++

An example of a structure definition follows: ++

++
++
 (defstruct ship
++   x-position
++   y-position
++   x-velocity
++   y-velocity
++   mass)
++
++ ++

This declares that every ship is an object ++with five named components. ++The evaluation of this form does the following: ++

++
++
1.
++

It defines ship-x-position to be a function ++of one argument, a ship, that returns the x-position ++of the ship; ship-y-position ++and the other components are given similar function definitions. ++These functions are called the access functions, as they ++are used to access elements of the structure. ++

++
++
2.
++

ship becomes the name of a type of which instances ++of ships are elements. ship becomes acceptable to typep, ++for example; (typep x 'ship) is true if x is a ship ++and false if x is any object other than a ship. ++

++
++
3.
++

A function named ship-p of ++one argument is defined; it is a predicate ++that is true if its argument is a ship and is false otherwise. ++

++
++
4.
++

A function called make-ship is defined that, when invoked, ++creates a data structure with five components, suitable for use with ++the access functions. Thus executing ++

++
++
 (setq ship2 (make-ship))
++
++ ++

sets ship2 to a newly created ship object. ++One can supply the initial values of any desired component in the call ++to make-ship by using keyword arguments in this way: ++

++
++
 (setq ship2 (make-ship :mass *default-ship-mass*
++                        :x-position 0
++                        :y-position 0))
++
++ ++

This constructs a new ship and initializes three of its components. ++This function is called the “constructor function” ++because it constructs a new structure. ++

++
++
5.
++

A function called copy-ship of one argument ++is defined that, when given a ship object, ++creates a new ship object that is a copy of the given one. ++This function is called the “copier function.” ++

++
++ ++

setf can be used to alter the components of a ship: ++

++
++
 (setf (ship-x-position ship2) 100)
++
++ ++

This alters the x-position of ship2 to be 100. ++This works because defstruct behaves as if ++it generates an appropriate defsetf ++for each access function. ++

++
++
;;;
++;;; Example 1
++;;; define town structure type
++;;; area, watertowers, firetrucks, population, elevation are its components
++;;;
++ (defstruct town
++             area
++             watertowers
++             (firetrucks 1 :type fixnum)    ;an initialized slot
++             population 
++             (elevation 5128 :read-only t)) ;a slot that can't be changed
++⇒  TOWN
++;create a town instance
++ (setq town1 (make-town :area 0 :watertowers 0)) ⇒  #S(TOWN...)
++;town's predicate recognizes the new instance
++ (town-p town1) ⇒  true
++;new town's area is as specified by make-town
++ (town-area town1) ⇒  0
++;new town's elevation has initial value
++ (town-elevation town1) ⇒  5128
++;setf recognizes reader function
++ (setf (town-population town1) 99) ⇒  99
++ (town-population town1) ⇒  99
++;copier function makes a copy of town1
++ (setq town2 (copy-town town1)) ⇒  #S(TOWN...)
++ (= (town-population town1) (town-population town2))  ⇒  true
++;since elevation is a read-only slot, its value can be set only
++;when the structure is created
++ (setq town3 (make-town :area 0 :watertowers 3 :elevation 1200))
++⇒  #S(TOWN...)
++;;;
++;;; Example 2
++;;; define clown structure type
++;;; this structure uses a nonstandard prefix
++;;;
++ (defstruct (clown (:conc-name bozo-))
++             (nose-color 'red)         
++             frizzy-hair-p polkadots) ⇒  CLOWN
++ (setq funny-clown (make-clown)) ⇒  #S(CLOWN)
++;use non-default reader name
++ (bozo-nose-color funny-clown) ⇒  RED        
++ (defstruct (klown (:constructor make-up-klown) ;similar def using other
++             (:copier clone-klown)              ;customizing keywords
++             (:predicate is-a-bozo-p))
++             nose-color frizzy-hair-p polkadots) ⇒  klown
++;custom constructor now exists
++ (fboundp 'make-up-klown) ⇒  true
++;;;
++;;; Example 3
++;;; define a vehicle structure type
++;;; then define a truck structure type that includes 
++;;; the vehicle structure
++;;;
++ (defstruct vehicle name year (diesel t :read-only t)) ⇒  VEHICLE
++ (defstruct (truck (:include vehicle (year 79)))
++             load-limit                          
++             (axles 6)) ⇒  TRUCK
++ (setq x (make-truck :name 'mac :diesel t :load-limit 17))
++⇒  #S(TRUCK...)
++;vehicle readers work on trucks
++ (vehicle-name x)
++⇒  MAC
++;default taken from :include clause 
++ (vehicle-year x)
++⇒  79 
++ (defstruct (pickup (:include truck))     ;pickup type includes truck
++             camper long-bed four-wheel-drive) ⇒  PICKUP
++ (setq x (make-pickup :name 'king :long-bed t)) ⇒  #S(PICKUP...)
++;:include default inherited
++ (pickup-year x) ⇒  79
++;;;
++;;; Example 4
++;;; use of BOA constructors
++;;;
++ (defstruct (dfs-boa                      ;BOA constructors
++               (:constructor make-dfs-boa (a b c)) 
++               (:constructor create-dfs-boa
++                 (a &optional b (c 'cc) &rest d &aux e (f 'ff))))
++             a b c d e f) ⇒  DFS-BOA
++;a, b, and c set by position, and the rest are uninitialized
++ (setq x (make-dfs-boa 1 2 3)) ⇒  #(DFS-BOA...)
++ (dfs-boa-a x) ⇒  1
++;a and b set, c and f defaulted
++ (setq x (create-dfs-boa 1 2)) ⇒  #(DFS-BOA...)
++ (dfs-boa-b x) ⇒  2
++ (eq (dfs-boa-c x) 'cc) ⇒  true
++;a, b, and c set, and the rest are collected into d
++ (setq x (create-dfs-boa 1 2 3 4 5 6)) ⇒  #(DFS-BOA...)
++ (dfs-boa-d x) ⇒  (4 5 6)
++
++ ++

Exceptional Situations::

++ ++

If any two slot names (whether present directly or inherited by the :include option) ++are the same under string=, ++defstruct should signal an error of type program-error. ++

++

The consequences are undefined if the included-structure-name ++does not name a structure type. ++

++

See Also::

++ ++

documentation ++, ++print-object ++, ++setf ++, ++subtypep ++, ++type-of ++, ++typep ++, ++Compilation ++

++

Notes::

++ ++

The printer-name should observe the values of ++such printer-control variables as *print-escape*. ++

++

The restriction against issuing a warning for type mismatches between ++a slot-initform and the corresponding slot’s :type option is ++necessary because a slot-initform must be specified in order to ++specify slot options; in some cases, no suitable default may exist. ++

++

The mechanism by which defstruct arranges for slot accessors to ++be usable with setf is implementation-dependent; ++for example, it may use setf functions, setf expanders, or ++some other implementation-dependent mechanism known to that ++implementation’s code for setf. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/deftype.html +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++deftype (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.25 deftype [Macro]

++ ++

deftype name lambda-list [[{declaration}* | documentation]] {form}*name ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

lambda-list—a deftype lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

form—a form. ++

++

Description::

++ ++

deftype defines a derived type specifier named name. ++

++

The meaning of the new type specifier is given in terms of ++a function which expands the type specifier into another ++type specifier, which itself will be expanded if it contains ++references to another derived type specifier. ++

++

The newly defined type specifier may be referenced as a list of ++the form (name arg_1 arg_2 ...)\/. ++The number of arguments must be appropriate to the lambda-list. ++If the new type specifier takes no arguments, ++or if all of its arguments are optional, ++the type specifier may be used as an atomic type specifier. ++

++

The argument expressions to the type specifier, ++arg_1 ... arg_n, are not evaluated. ++Instead, these literal objects become the objects to which ++corresponding parameters become bound. ++

++

The body of the deftype form ++

++

(but not the lambda-list) ++

++

is ++

++

implicitly enclosed in a block named name, ++

++

and is evaluated as an implicit progn, ++returning a new type specifier. ++

++

The lexical environment of the body is the one which was current ++at the time the deftype form was evaluated, augmented by the ++variables in the lambda-list. ++

++

Recursive expansion of the type specifier returned as the expansion ++must terminate, including the expansion of type specifiers which ++are nested within the expansion. ++

++

The consequences are undefined if the result of fully expanding a ++type specifier contains any circular structure, except within ++the objects referred to by member and eql ++type specifiers. ++

++

Documentation is attached to name as a documentation string ++of kind type. ++

++

If a deftype form appears as a top level form, ++the compiler must ensure that the name is recognized ++in subsequent type declarations. ++The programmer must ensure that the body of a deftype form ++can be evaluated at compile time if the name is ++referenced in subsequent type declarations. ++If the expansion of a type specifier is not defined fully at compile time ++(perhaps because it expands into an unknown type specifier or a ++satisfies of a named function that isn’t defined in the ++compile-time environment), an implementation may ignore any references to ++this type in declarations and/or signal a warning. ++

++

Examples::

++
++
 (defun equidimensional (a)
++   (or (< (array-rank a) 2)
++       (apply #'= (array-dimensions a)))) ⇒  EQUIDIMENSIONAL
++ (deftype square-matrix (&optional type size)
++   `(and (array ,type (,size ,size))
++         (satisfies equidimensional))) ⇒  SQUARE-MATRIX
++
++ ++

See Also::

++ ++

declare, ++defmacro ++, ++documentation ++, ++Type Specifiers, ++Syntactic Interaction of Documentation Strings and Declarations ++

++
++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/defun.html +@@ -0,0 +1,173 @@ ++ ++ ++ ++ ++ ++defun (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.2 defun [Macro]

++ ++

defun function-name lambda-list [[{declaration}* | documentation]] {form}*
++ ⇒ function-name ++

++

Arguments and Values::

++ ++

function-name—a function name. ++

++

lambda-list—an ordinary lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

forms—an implicit progn. ++

++

block-name—the function block name of the function-name. ++

++

Description::

++ ++

Defines a new function named function-name in the global environment. ++The body of the function defined by defun consists ++of forms; they are executed as an implicit progn ++when the function is called. ++defun can be used ++ to define a new function, ++ to install a corrected version of an incorrect definition, ++ to redefine an already-defined function, ++ or to redefine a macro as a function. ++

++

defun implicitly puts a block named block-name ++around the body forms ++

++

(but not the forms in the lambda-list) ++

++

of the function defined. ++

++

Documentation is attached as a documentation string ++ to name (as kind function) ++and to the function object. ++

++

Evaluating defun causes function-name to be a global name ++for the function specified by the lambda expression ++

++
++
 (lambda lambda-list
++   [[{declaration}* | documentation]]
++   (block block-name {form}*))
++
++ ++

processed in the lexical environment in which defun was executed. ++

++

(None of the arguments are evaluated at macro expansion time.) ++

++

defun is not required to perform any compile-time side effects. ++In particular, defun does not make the function definition available ++at compile time. An implementation may choose to store information ++about the function for the purposes of compile-time error-checking ++(such as checking the number of arguments on calls), ++or to enable the function to be expanded inline. ++

++

Examples::

++ ++
++
 (defun recur (x)
++  (when (> x 0)
++    (recur (1- x)))) ⇒  RECUR 
++ (defun ex (a b &optional c (d 66) &rest keys &key test (start 0))
++    (list a b c d keys test start)) ⇒  EX 
++ (ex 1 2) ⇒  (1 2 NIL 66 NIL NIL 0)
++ (ex 1 2 3 4 :test 'equal :start 50) 
++⇒  (1 2 3 4 (:TEST EQUAL :START 50) EQUAL 50)
++ (ex :test 1 :start 2) ⇒  (:TEST 1 :START 2 NIL NIL 0)
++
++ ;; This function assumes its callers have checked the types of the
++ ;; arguments, and authorizes the compiler to build in that assumption.
++ (defun discriminant (a b c)
++   (declare (number a b c))
++   "Compute the discriminant for a quadratic equation."
++   (- (* b b) (* 4 a c))) ⇒  DISCRIMINANT
++ (discriminant 1 2/3 -2) ⇒  76/9
++
++ ;; This function assumes its callers have not checked the types of the
++ ;; arguments, and performs explicit type checks before making any assumptions. 
++ (defun careful-discriminant (a b c)
++   "Compute the discriminant for a quadratic equation."
++   (check-type a number)
++   (check-type b number)
++   (check-type c number)
++   (locally (declare (number a b c))
++     (- (* b b) (* 4 a c)))) ⇒  CAREFUL-DISCRIMINANT
++ (careful-discriminant 1 2/3 -2) ⇒  76/9
++
++ ++

See Also::

++ ++

flet ++, ++labels, ++block ++, ++return-from ++, ++declare, ++documentation ++, ++Evaluation, ++Ordinary Lambda Lists, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++

return-from can be used to return ++prematurely from a function defined by defun. ++

++

Additional side effects might take place when additional information ++(typically debugging information) ++about the function definition is recorded. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/delete_002dfile.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++delete-file (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.8 delete-file [Function]

++ ++

delete-file filespect ++

++

Arguments and Values::

++ ++

filespec—a pathname designator. ++

++

Description::

++ ++

Deletes the file specified by filespec. ++

++

If the filespec designator is an open stream, ++then filespec and the file associated with it are affected ++(if the file system permits), ++in which case filespec might be closed immediately, ++and the deletion might be immediate or delayed until filespec is explicitly closed, ++depending on the requirements of the file system. ++

++

It is implementation-dependent whether an attempt ++to delete a nonexistent file is considered to be successful. ++

++

delete-file returns true if it succeeds, ++or signals an error of type file-error if it does not. ++

++

The consequences are undefined ++ if filespec has a wild component, ++ or if filespec has a nil component ++ and the file system does not permit a nil component. ++

++

Examples::

++ ++
++
 (with-open-file (s "delete-me.text" :direction :output :if-exists :error))
++⇒  NIL
++ (setq p (probe-file "delete-me.text")) ⇒  #P"R:>fred>delete-me.text.1"
++ (delete-file p) ⇒  T
++ (probe-file "delete-me.text") ⇒  false
++ (with-open-file (s "delete-me.text" :direction :output :if-exists :error)
++   (delete-file s))
++⇒  T
++ (probe-file "delete-me.text") ⇒  false
++
++ ++

Exceptional Situations::

++ ++

If the deletion operation is not successful, an error of type file-error is signaled. ++

++

An error of type file-error might be signaled if filespec is wild. ++

++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/delete_002dpackage.html +@@ -0,0 +1,196 @@ ++ ++ ++ ++ ++ ++delete-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.11 delete-package [Function]

++ ++

delete-package packagegeneralized-boolean ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

delete-package deletes package from all package system ++data structures. ++If the operation is successful, delete-package returns ++true, otherwise nil. ++The effect of delete-package is that the name and nicknames ++of package cease to be recognized package names. ++The package object is still a package ++(i.e., packagep is true of it) ++but package-name returns nil. ++The consequences of deleting the COMMON-LISP package or the KEYWORD package are undefined. ++The consequences of invoking any other package operation on package ++once it has been deleted are unspecified. ++In particular, the consequences of invoking find-symbol, ++intern and other functions that look for a symbol name in ++a package are unspecified if they are called with *package* ++bound to the deleted package or with the deleted package ++as an argument. ++

++

If package is a package object that has already ++been deleted, delete-package immediately returns nil. ++

++

After this operation completes, the ++home package ++of any symbol whose home package ++had previously been ++package ++is ++implementation-dependent. ++Except for this, symbols accessible ++in package are not modified in any other way; ++symbols whose home package is not package remain unchanged. ++

++

Examples::

++ ++
++
 (setq *foo-package* (make-package "FOO" :use nil))
++ (setq *foo-symbol*  (intern "FOO" *foo-package*))
++ (export *foo-symbol* *foo-package*)
++
++ (setq *bar-package* (make-package "BAR" :use '("FOO")))
++ (setq *bar-symbol*  (intern "BAR" *bar-package*))
++ (export *foo-symbol* *bar-package*)
++ (export *bar-symbol* *bar-package*)
++
++ (setq *baz-package* (make-package "BAZ" :use '("BAR")))
++
++ (symbol-package *foo-symbol*) ⇒  #<PACKAGE "FOO">
++ (symbol-package *bar-symbol*) ⇒  #<PACKAGE "BAR">
++
++ (prin1-to-string *foo-symbol*) ⇒  "FOO:FOO"
++ (prin1-to-string *bar-symbol*) ⇒  "BAR:BAR"
++
++ (find-symbol "FOO" *bar-package*) ⇒  FOO:FOO, :EXTERNAL
++
++ (find-symbol "FOO" *baz-package*) ⇒  FOO:FOO, :INHERITED
++ (find-symbol "BAR" *baz-package*) ⇒  BAR:BAR, :INHERITED
++
++ (packagep *foo-package*) ⇒  true
++ (packagep *bar-package*) ⇒  true
++ (packagep *baz-package*) ⇒  true
++
++ (package-name *foo-package*) ⇒  "FOO"
++ (package-name *bar-package*) ⇒  "BAR"
++ (package-name *baz-package*) ⇒  "BAZ"
++
++ (package-use-list *foo-package*) ⇒  ()
++ (package-use-list *bar-package*) ⇒  (#<PACKAGE "FOO">)
++ (package-use-list *baz-package*) ⇒  (#<PACKAGE "BAR">)
++
++ (package-used-by-list *foo-package*) ⇒  (#<PACKAGE "BAR">)
++ (package-used-by-list *bar-package*) ⇒  (#<PACKAGE "BAZ">)
++ (package-used-by-list *baz-package*) ⇒  ()
++
++ (delete-package *bar-package*)
++ |>  Error: Package BAZ uses package BAR.
++ |>  If continued, BAZ will be made to unuse-package BAR,
++ |>  and then BAR will be deleted.
++ |>  Type :CONTINUE to continue.
++ |>  Debug> |>>:CONTINUE<<|
++⇒  T
++
++ (symbol-package *foo-symbol*) ⇒  #<PACKAGE "FOO">
++ (symbol-package *bar-symbol*) is unspecified
++
++ (prin1-to-string *foo-symbol*) ⇒  "FOO:FOO"
++ (prin1-to-string *bar-symbol*) is unspecified
++
++ (find-symbol "FOO" *bar-package*) is unspecified
++
++ (find-symbol "FOO" *baz-package*) ⇒  NIL, NIL
++ (find-symbol "BAR" *baz-package*) ⇒  NIL, NIL
++
++ (packagep *foo-package*) ⇒  T
++ (packagep *bar-package*) ⇒  T
++ (packagep *baz-package*) ⇒  T
++
++ (package-name *foo-package*) ⇒  "FOO"
++ (package-name *bar-package*) ⇒  NIL
++ (package-name *baz-package*) ⇒  "BAZ"
++
++ (package-use-list *foo-package*) ⇒  ()
++ (package-use-list *bar-package*) is unspecified
++ (package-use-list *baz-package*) ⇒  ()
++
++ (package-used-by-list *foo-package*) ⇒  ()
++ (package-used-by-list *bar-package*) is unspecified
++ (package-used-by-list *baz-package*) ⇒  ()
++
++ ++

Exceptional Situations::

++ ++

If the package designator is a name that does not ++currently name a package, ++a correctable error of type package-error is signaled. ++If correction is attempted, no deletion action is attempted; ++instead, delete-package immediately returns nil. ++

++

If package is used by other packages, ++a correctable error of type package-error is signaled. ++If correction is attempted, ++unuse-package is effectively called to remove any dependencies, ++causing package’s external symbols to cease being accessible to those ++packages that use package. ++delete-package then deletes package just as it would have had ++there been no packages that used it. ++

++

See Also::

++ ++

unuse-package ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/deposit_002dfield.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++deposit-field (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.67 deposit-field [Function]

++ ++

deposit-field newbyte bytespec integerresult-integer ++

++

Arguments and Values::

++ ++

newbyte—an integer. ++

++

bytespec—a byte specifier. ++

++

integer—an integer. ++

++

result-integer—an integer. ++

++

Description::

++ ++

Replaces a field of bits within integer; specifically, ++returns an integer that contains the bits of newbyte ++within the byte specified by bytespec, ++and elsewhere contains the bits of integer. ++

++

Examples::

++ ++
++
 (deposit-field 7 (byte 2 1) 0) ⇒  6
++ (deposit-field -1 (byte 4 0) 0) ⇒  15
++ (deposit-field 0 (byte 2 1) -3) ⇒  -7
++
++ ++

See Also::

++ ++

byte ++, ++dpb ++

++

Notes::

++ ++
++
 (logbitp j (deposit-field m (byte s p) n))
++ ≡ (if (and (>= j p) (< j (+ p s)))
++        (logbitp j m)
++        (logbitp j n))
++
++ ++

deposit-field is to mask-field ++as dpb is to ldb. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/describe.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++describe (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.6 describe [Function]

++ ++

describe object &optional stream<no values> ++

++

Arguments and Values::

++ ++

object—an object. ++

++

stream—an output stream designator. ++ The default is standard output. ++

++

Description::

++ ++

describe displays information about object ++

++

to stream. ++

++

For example, describe of a symbol might show the ++symbol’s value, its definition, and each of its properties. ++describe of a float might show the number’s ++internal representation in a way that is useful for tracking ++down round-off errors. In all cases, however, the nature and format of the ++output of describe is implementation-dependent. ++

++

describe can describe something that it finds inside the object; ++in such cases, a notational device such as increased indentation or positioning in a ++table is typically used in order to visually distinguish such recursive descriptions ++from descriptions of the argument object. ++

++

The actual act of describing the object is implemented by describe-object. ++describe exists as an interface primarily to manage argument defaulting (including ++conversion of arguments t and nil into stream objects) and to inhibit ++any return values from describe-object. ++

++

describe is not intended to be an interactive function. In a ++conforming implementation, describe must not, by default, ++prompt for user input. User-defined methods for describe-object ++are likewise restricted. ++

++

Side Effects::

++ ++

Output to standard output or terminal I/O. ++

++

Affected By::

++ ++

*standard-output* and *terminal-io*, ++methods on describe-object and print-object ++for objects having user-defined classes. ++

++

See Also::

++ ++

inspect ++, ++describe-object ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/describe_002dobject.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++describe-object (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.7 describe-object [Standard Generic Function]

++ ++

Syntax::

++ ++

describe-object object streamimplementation-dependent ++

++

Method Signatures::

++ ++

describe-object (object standard-object) stream ++

++

Arguments and Values::

++ ++

object—an object. ++

++

stream—a stream. ++

++

Description::

++ ++

The generic function describe-object prints a description of ++object to a stream. describe-object is called ++by describe; it must not be called by the user. ++

++

Each implementation is required to provide a method on ++the class standard-object and methods on enough other ++classes so as to ensure that there is always an applicable method. ++Implementations are free to add methods for other classes. ++Users can write methods for describe-object for their ++own classes if they do not wish to inherit an implementation-supplied ++method. ++

++

Methods on describe-object can recursively call ++describe. Indentation, depth limits, and circularity detection ++are all taken care of automatically, provided that each method ++handles exactly one level of structure and calls describe ++recursively if there are more structural levels. The consequences are ++undefined if this rule is not obeyed. ++

++

In some implementations the stream argument passed to a ++describe-object method is not the original stream, but is ++an intermediate stream that implements parts of describe. ++Methods should therefore not depend on the identity of this ++stream. ++

++

Examples::

++ ++
++
 (defclass spaceship ()
++   ((captain :initarg :captain :accessor spaceship-captain)
++    (serial# :initarg :serial-number :accessor spaceship-serial-number)))
++
++ (defclass federation-starship (spaceship) ())
++
++ (defmethod describe-object ((s spaceship) stream)
++   (with-slots (captain serial#) s
++     (format stream "~&~S is a spaceship of type ~S,~
++                     ~
++                       and with serial number ~D.~
++             s (type-of s) captain serial#)))
++
++ (make-instance 'federation-starship
++                :captain "Rachel Garrett"
++                :serial-number "NCC-1701-C")
++⇒  #<FEDERATION-STARSHIP 26312465>
++
++ (describe *)
++ |>  #<FEDERATION-STARSHIP 26312465> is a spaceship of type FEDERATION-STARSHIP,
++ |>  with Rachel Garrett at the helm and with serial number NCC-1701-C.
++⇒  <no values>
++
++ ++

See Also::

++ ++

describe ++

++

Notes::

++ ++

The same implementation techniques that are applicable to print-object are ++applicable to describe-object. ++

++

The reason for making the return values for describe-object ++unspecified is to avoid forcing users to include explicit (values) ++in all of their methods. describe takes care of that. ++

++
++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/destructuring_002dbind.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++destructuring-bind (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.17 destructuring-bind [Macro]

++ ++

destructuring-bind lambda-list expression {declaration}* {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

lambda-list—a destructuring lambda list. ++

++

expression—a form. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

destructuring-bind binds the variables specified in lambda-list ++to the corresponding values in the tree structure resulting from the evaluation ++of expression; then destructuring-bind evaluates forms. ++

++

The lambda-list supports destructuring as described in ++Destructuring Lambda Lists. ++

++

Examples::

++
++
 (defun iota (n) (loop for i from 1 to n collect i))       ;helper
++ (destructuring-bind ((a &optional (b 'bee)) one two three)
++     `((alpha) ,@(iota 3))
++   (list a b three two one)) ⇒  (ALPHA BEE 3 2 1)
++
++ ++

Exceptional Situations::

++ ++

If the result of evaluating the expression does not match the ++destructuring pattern, an error of type error should be signaled. ++

++

See Also::

++ ++

macrolet, ++defmacro ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/digit_002dchar.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++digit-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.10 digit-char [Function]

++ ++

digit-char weight &optional radixchar ++

++

Arguments and Values::

++ ++

weight—a non-negative integer. ++

++

radix—a radix. ++ The default is 10. ++

++

char—a character or false. ++

++

Description::

++ ++

If weight is less than radix, ++digit-char returns a character which has that weight ++when considered as a digit in the specified radix. ++If the resulting character is to be an alphabetic_1 character, ++it will be an uppercase character. ++

++

If weight is greater than or equal to radix, ++digit-char returns false. ++

++

Examples::

++ ++
++
 (digit-char 0) ⇒  #\0
++ (digit-char 10 11) ⇒  #\A
++ (digit-char 10 10) ⇒  false
++ (digit-char 7) ⇒  #\7
++ (digit-char 12) ⇒  false
++ (digit-char 12 16) ⇒  #\C  ;not #\c
++ (digit-char 6 2) ⇒  false
++ (digit-char 1 2) ⇒  #\1
++
++ ++

See Also::

++ ++

digit-char-p ++, ++graphic-char-p ++, ++Character Syntax ++

++

Notes::

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/digit_002dchar_002dp.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++digit-char-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.11 digit-char-p [Function]

++ ++

digit-char-p char &optional radixweight ++

++

Arguments and Values::

++ ++

char—a character. ++

++

radix—a radix. ++ The default is 10. ++

++

weight—either a non-negative integer less than radix, ++ or false. ++

++

Description::

++ ++

Tests whether char is a digit in the specified radix ++(i.e., with a weight less than radix). ++If it is a digit in that radix, ++its weight is returned as an integer; ++otherwise nil is returned. ++

++

Examples::

++ ++
++
 (digit-char-p #\5)    ⇒  5
++ (digit-char-p #\5 2)  ⇒  false
++ (digit-char-p #\A)    ⇒  false
++ (digit-char-p #\a)    ⇒  false
++ (digit-char-p #\A 11) ⇒  10
++ (digit-char-p #\a 11) ⇒  10
++ (mapcar #'(lambda (radix) 
++             (map 'list #'(lambda (x) (digit-char-p x radix)) 
++                  "059AaFGZ"))
++         '(2 8 10 16 36))
++ ⇒  ((0 NIL NIL NIL NIL NIL NIL NIL)
++     (0 5 NIL NIL NIL NIL NIL NIL)
++     (0 5 9 NIL NIL NIL NIL NIL)
++     (0 5 9 10 10 15 NIL NIL)
++     (0 5 9 10 10 15 16 35))
++
++ ++

Affected By::

++ ++

None. ++(In particular, the results of this predicate are independent ++of any special syntax which might have been enabled in the current readtable.) ++

++

See Also::

++ ++

alphanumericp ++

++

Notes::

++ ++

Digits are graphic characters. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/directory.html +@@ -0,0 +1,110 @@ ++ ++ ++ ++ ++ ++directory (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.1 directory [Function]

++ ++

directory pathspec &keypathnames ++

++

Arguments and Values::

++ ++

pathspec—a pathname designator, ++ which may contain wild components. ++

++

pathnames—a list of ++

++

physical pathnames. ++

++

Description::

++ ++

Determines which, if any, files that are present ++in the file system have names matching pathspec, ++and returns a ++

++

fresh ++

++

list of pathnames corresponding to the truenames of ++those files. ++

++

An implementation may be extended to accept ++implementation-defined keyword arguments to directory. ++

++

Affected By::

++ ++

The host computer’s file system. ++

++

Exceptional Situations::

++ ++

If the attempt to obtain a directory listing is not successful, ++an error of type file-error is signaled. ++

++

See Also::

++ ++

pathname, ++

++

logical-pathname, ++

++

ensure-directories-exist ++, ++File System Concepts, ++File Operations on Open and Closed Streams, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

If the pathspec is not wild, ++the resulting list will contain either zero or one elements. ++

++

Common Lisp specifies “&key” in the argument list to directory ++even though no standardized keyword arguments to directory are defined. ++“:allow-other-keys t” ++may be used in conforming programs in order to quietly ignore any ++additional keywords which are passed by the program but not supported ++by the implementation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/disassemble.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++disassemble (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.14 disassemble [Function]

++ ++

disassemble fnnil ++

++

Arguments and Values::

++ ++

fn—an extended function designator ++ or a lambda expression. ++

++

Description::

++ ++

The function disassemble is a debugging aid that composes symbolic ++instructions or expressions in some implementation-dependent ++language which represent the code used to produce the function ++which is or is named by the argument fn. The result is displayed ++to standard output in an implementation-dependent format. ++

++

If fn is a lambda expression or interpreted function, ++it is compiled first and the result is disassembled. ++

++

If the fn designator is a function name, ++the function that it names is disassembled. ++

++

(If that function is an interpreted function, ++it is first compiled but the result of this implicit compilation is not installed.) ++

++

Examples::

++ ++
++
 (defun f (a) (1+ a)) ⇒  F
++ (eq (symbol-function 'f)
++     (progn (disassemble 'f)
++            (symbol-function 'f))) ⇒  true
++
++ ++

Affected By::

++ ++

*standard-output*. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if fn is not an extended function designator ++ or a lambda expression. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/division_002dby_002dzero.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++division-by-zero (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.80 division-by-zero [Condition Type]

++ ++

Class Precedence List::

++

division-by-zero, ++arithmetic-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type division-by-zero consists of error conditions that ++occur because of division by zero. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/do.html +@@ -0,0 +1,330 @@ ++ ++ ++ ++ ++ ++do (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++
++

6.2.1 do, do* [Macro]

++ ++

do ({var | (var [init-form [step-form]])}*) ++ (end-test-form {result-form}*) ++ {declaration}* {tag | statement}*
++ ⇒ {result}* ++

++

do* ({var | (var [init-form [step-form]])}*) ++ (end-test-form {result-form}*) ++ {declaration}* {tag | statement}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a symbol. ++

++

init-form—a form. ++

++

step-form—a form. ++

++

end-test-form—a form. ++

++

result-forms—an implicit progn. ++

++

declaration—a declare expression; not evaluated. ++

++

tag—a go tag; not evaluated. ++

++

statement—a compound form; evaluated as described below. ++

++

results—if a return or return-from form is executed, ++ the values passed from that form; ++ otherwise, the values returned by the result-forms. ++

++

Description::

++ ++

do iterates over a group of statements ++while a test condition holds. ++do accepts an arbitrary number of iteration vars ++which are bound within the iteration and stepped in parallel. ++An initial value may be supplied for each iteration variable by use of ++an init-form. ++Step-forms may be used to specify how the ++vars should be updated on succeeding iterations through the loop. ++Step-forms may be used both to generate successive ++values or to accumulate results. ++If the end-test-form condition ++is met prior to an execution of the body, the iteration terminates. ++Tags label statements. ++

++

do* is exactly like do ++except that the bindings and steppings ++of the vars are performed sequentially rather than in parallel. ++

++

Before the first iteration, all the init-forms are evaluated, and ++each var is bound to the value of its respective init-form, ++if supplied. ++This is a binding, not an assignment; when the loop terminates, ++the old values of those variables will be restored. ++For do, all ++of the init-forms are evaluated before any var ++is bound. The ++init-forms can refer to the bindings of the vars ++visible before beginning execution of ++do. ++For do*, the first init-form is evaluated, then the first ++var is bound to that value, then the second init-form ++is evaluated, then the second var is bound, and so on; ++in general, the kth init-form can refer to the new binding ++of the jth var if j < k, and otherwise to the ++old binding of the jth var. ++

++

At the beginning of each iteration, after processing the variables, ++the end-test-form is evaluated. If the result is ++false, execution proceeds with the body of the do ++(or do*) form. ++If the result is true, the result-forms are evaluated in order ++as an implicit progn, ++and then do or do* returns. ++

++

At the beginning of each iteration other than the first, ++vars are updated as follows. All the step-forms, if supplied, ++are evaluated, from left to right, and the resulting values are ++assigned to the respective vars. ++Any var that has no associated step-form is not assigned to. ++For do, all the step-forms are evaluated before any var ++is updated; the assignment of values to vars is done in parallel, ++as if by psetq. ++Because all of the step-forms are evaluated before any ++of the vars are altered, a step-form when evaluated always has ++access to the old values of all the vars, even if other step-forms ++precede it. ++For do*, the first step-form is evaluated, then the ++value is assigned to the first var, then the second step-form ++is evaluated, then the value is assigned to the second var, and so on; ++the assignment of values to variables is done sequentially, ++as if by setq. ++For either do or do*, ++after the vars have been updated, ++the end-test-form ++is evaluated as described above, and the iteration continues. ++

++

The remainder of the do (or do*) form constitutes ++an implicit tagbody. ++Tags may appear within the body of a do loop ++for use by go statements appearing in the body (but such go ++statements may not appear in the variable specifiers, the end-test-form, ++or the result-forms). ++When the end of a do body is reached, the next iteration cycle ++(beginning with the evaluation of step-forms) occurs. ++

++

An implicit block named nil surrounds the entire do ++(or do*) form. ++A return statement may be used at any point to exit the loop ++immediately. ++

++

Init-form is an ++initial value for the var with which it is associated. ++If init-form is omitted, the initial value of var is nil. ++If a declaration is supplied for a var, init-form ++must be consistent with the declaration. ++

++

Declarations can appear at the beginning of a do ++(or do*) body. ++They apply to code in the do (or do*) body, ++to the bindings of the do (or do*) ++vars, ++to the step-forms, ++to the end-test-form, and to the result-forms. ++

++

Examples::

++
++
 (do ((temp-one 1 (1+ temp-one))
++       (temp-two 0 (1- temp-two)))
++      ((> (- temp-one temp-two) 5) temp-one)) ⇒  4
++
++ (do ((temp-one 1 (1+ temp-one))
++       (temp-two 0 (1+ temp-one)))     
++      ((= 3 temp-two) temp-one)) ⇒  3
++
++ (do* ((temp-one 1 (1+ temp-one))
++        (temp-two 0 (1+ temp-one)))
++       ((= 3 temp-two) temp-one)) ⇒  2                     
++
++ (do ((j 0 (+ j 1)))
++     (nil)                       ;Do forever.
++   (format t "~
++   (let ((item (read)))
++     (if (null item) (return)   ;Process items until NIL seen.
++         (format t "~&Output ~D: ~S" j item))))
++ |>  Input 0: |>>banana<<|
++ |>  Output 0: BANANA
++ |>  Input 1: |>>(57 boxes)<<|
++ |>  Output 1: (57 BOXES)
++ |>  Input 2: |>>NIL<<|
++⇒  NIL
++
++ (setq a-vector (vector 1 nil 3 nil))
++ (do ((i 0 (+ i 1))     ;Sets every null element of a-vector to zero.
++      (n (array-dimension a-vector 0)))
++     ((= i n))
++   (when (null (aref a-vector i))
++     (setf (aref a-vector i) 0))) ⇒  NIL
++a-vector ⇒  #(1 0 3 0)
++
++ ++
++
 (do ((x e (cdr x))
++      (oldx x x))
++     ((null x))
++   body)
++
++ ++

is an example of parallel assignment to index variables. On the first ++iteration, the value of oldx is whatever value x had before ++the do was entered. On succeeding iterations, oldx contains ++the value that x had on the previous iteration. ++

++
++
 (do ((x foo (cdr x))
++      (y bar (cdr y))
++      (z '() (cons (f (car x) (car y)) z)))
++     ((or (null x) (null y))
++      (nreverse z)))
++
++ ++

does the same thing as (mapcar #'f foo bar). The step ++computation for z is an example of the fact that variables ++are stepped in parallel. ++Also, the body of the loop is empty. ++

++
++
 (defun list-reverse (list)
++        (do ((x list (cdr x))
++             (y '() (cons (car x) y)))
++            ((endp x) y)))
++
++ ++

As an example of nested iterations, consider a data structure that is a ++list of conses. The car of each cons is a ++list of symbols, ++and the cdr of each cons is a ++list of equal length containing ++corresponding values. Such a data structure is similar to an association ++list, ++but is divided into “frames”; the overall structure resembles a rib-cage. ++A lookup function on such a data structure might be: ++

++
++
 (defun ribcage-lookup (sym ribcage)           
++        (do ((r ribcage (cdr r)))
++            ((null r) nil)
++          (do ((s (caar r) (cdr s))
++               (v (cdar r) (cdr v))) 
++              ((null s))
++            (when (eq (car s) sym)
++              (return-from ribcage-lookup (car v)))))) ⇒  RIBCAGE-LOOKUP
++
++ ++

See Also::

++ ++

other iteration functions ++ ( ++dolist ++, ++dotimes ++, and ++loop ++) ++and more primitive functionality ++ ( ++tagbody ++, ++go ++, ++block ++, ++return ++, ++

++

let ++, and ++setq ++) ++

++

Notes::

++

If end-test-form is nil, the test will never succeed. ++This provides an idiom for “do forever”: ++the body of the do or do* ++is executed repeatedly. ++The infinite loop can be terminated by the use of return, ++return-from, go to an outer level, or throw. ++

++

A do form may be explained in terms of the more primitive forms ++block, return, ++let, loop, tagbody, ++and psetq as follows: ++

++
++
 (block nil        
++   (let ((var1 init1)
++         (var2 init2)
++         ...
++         (varn initn))
++     declarations
++     (loop (when end-test (return (progn . result)))
++           (tagbody . tagbody)
++           (psetq var1 step1
++                  var2 step2
++                  ...
++                  varn stepn))))
++
++ ++

do* is similar, except that let* and setq replace ++the let and psetq, respectively. ++

++
++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/do_002dsymbols.html +@@ -0,0 +1,174 @@ ++ ++ ++ ++ ++ ++do-symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.20 do-symbols, do-external-symbols, do-all-symbols [Macro]

++ ++

do-symbols (var [package [result-form]]) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

do-external-symbols (var [package [result-form]]) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

do-all-symbols (var [result-form]) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a variable name; not evaluated. ++

++

package—a package designator; evaluated. ++

++

The default in do-symbols and do-external-symbols is the current package. ++

++

result-form—a form; evaluated as described below. ++ The default is nil. ++

++

declaration—a declare expression; not evaluated. ++

++

tag—a go tag; not evaluated. ++

++

statement—a compound form; evaluated as described below. ++

++

results—the values returned by the result-form ++ if a normal return occurs, ++ or else, if an explicit return occurs, the values that were transferred. ++

++

Description::

++ ++

do-symbols, ++do-external-symbols, and ++do-all-symbols iterate over the symbols ++of packages. ++For each symbol in the set of packages chosen, ++the var is bound to the symbol, ++and the statements in the body are executed. ++When all the symbols have been processed, ++result-form is evaluated and returned as the value of the macro. ++

++

do-symbols iterates ++over the symbols accessible in ++package. ++

++

Statements may execute more than once for symbols ++that are inherited from multiple packages. ++

++

do-all-symbols iterates on every registered package. ++do-all-symbols will not process every symbol ++whatsoever, because a symbol not accessible in any ++registered package will not be processed. ++do-all-symbols may cause a symbol that is present in ++several packages to be processed more than once. ++

++

do-external-symbols iterates on the external symbols of package. ++

++

When result-form is evaluated, var is bound and has the value nil. ++

++

An implicit block named nil surrounds the entire do-symbols, ++do-external-symbols, or do-all-symbols form. ++

++

return or return-from may be used to terminate the ++iteration prematurely. ++

++

If execution of the body affects which symbols ++are contained in the set of packages over which iteration ++is occurring, other than to ++remove the symbol ++currently the value of var by using unintern, ++the consequences are undefined. ++

++

For each of these macros, the ++scope of the name binding does not include any ++initial value form, but the optional result forms are included. ++

++

Any tag in the body is treated as with tagbody. ++

++

Examples::

++ ++
++
 (make-package 'temp :use nil) ⇒  #<PACKAGE "TEMP">
++ (intern "SHY" 'temp) ⇒  TEMP::SHY, NIL ;SHY will be an internal symbol
++                                         ;in the package TEMP
++ (export (intern "BOLD" 'temp) 'temp)  ⇒  T  ;BOLD will be external  
++ (let ((lst ()))
++   (do-symbols (s (find-package 'temp)) (push s lst))
++   lst)
++⇒  (TEMP::SHY TEMP:BOLD)
++OR⇒ (TEMP:BOLD TEMP::SHY)
++ (let ((lst ()))
++   (do-external-symbols (s (find-package 'temp) lst) (push s lst))
++   lst) 
++⇒  (TEMP:BOLD)
++ (let ((lst ()))                                                     
++   (do-all-symbols (s lst)
++     (when (eq (find-package 'temp) (symbol-package s)) (push s lst)))
++   lst)
++⇒  (TEMP::SHY TEMP:BOLD)
++OR⇒ (TEMP:BOLD TEMP::SHY)
++
++ ++

See Also::

++ ++

intern ++, ++export ++, ++

++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/documentation.html +@@ -0,0 +1,247 @@ ++ ++ ++ ++ ++ ++documentation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.15 documentation, (setf documentation) [Standard Generic Function]

++ ++

Syntax::

++ ++

documentation x doc-typedocumentation ++

++

(setf documentation) new-value x doc-typenew-value ++

++

Argument Precedence Order::

++ ++

doc-type, object ++

++

Method Signatures::

++ ++

Functions, Macros, and Special Forms

++ ++

documentation (x function) (doc-type (eql ’t))
++(setf documentation) new-value(x function) (doc-type (eql ’t)) ++

++

documentation (x function) (doc-type (eql ’function))
++(setf documentation) new-value(x function) (doc-type (eql ’function)) ++

++

documentation (x list) (doc-type (eql ’function))
++(setf documentation) new-value(x list) (doc-type (eql ’function)) ++

++

documentation (x list) (doc-type (eql ’compiler-macro))
++(setf documentation) new-value(x list) (doc-type (eql ’compiler-macro)) ++

++

documentation (x symbol) (doc-type (eql ’function))
++(setf documentation) new-value(x symbol) (doc-type (eql ’function)) ++

++

documentation (x symbol) (doc-type (eql ’compiler-macro))
++(setf documentation) new-value(x symbol) (doc-type (eql ’compiler-macro)) ++

++

documentation (x symbol) (doc-type (eql ’setf))
++(setf documentation) new-value(x symbol) (doc-type (eql ’setf)) ++

++

Method Combinations

++ ++

documentation (x method-combination) (doc-type (eql ’t))
++(setf documentation) new-value(x method-combination) (doc-type (eql ’t)) ++

++

documentation (x method-combination) (doc-type (eql ’method-combination))
++(setf documentation) new-value(x method-combination) (doc-type (eql ’method-combination)) ++

++

documentation (x symbol) (doc-type (eql ’method-combination))
++(setf documentation) new-value(x symbol) (doc-type (eql ’method-combination)) ++

++

Methods

++ ++

documentation (x standard-method) (doc-type (eql ’t))
++(setf documentation) new-value(x standard-method) (doc-type (eql ’t)) ++

++

Packages

++ ++

documentation (x package) (doc-type (eql ’t))
++(setf documentation) new-value(x package) (doc-type (eql ’t)) ++

++

Types, Classes, and Structure Names

++ ++

documentation (x standard-class) (doc-type (eql ’t))
++(setf documentation) new-value(x standard-class) (doc-type (eql ’t)) ++

++

documentation (x standard-class) (doc-type (eql ’type))
++(setf documentation) new-value(x standard-class) (doc-type (eql ’type)) ++

++

documentation (x structure-class) (doc-type (eql ’t))
++(setf documentation) new-value(x structure-class) (doc-type (eql ’t)) ++

++

documentation (x structure-class) (doc-type (eql ’type))
++(setf documentation) new-value(x structure-class) (doc-type (eql ’type)) ++

++

documentation (x symbol) (doc-type (eql ’type))
++(setf documentation) new-value(x symbol) (doc-type (eql ’type)) ++

++

documentation (x symbol) (doc-type (eql ’structure))
++(setf documentation) new-value(x symbol) (doc-type (eql ’structure)) ++

++

Variables

++ ++

documentation (x symbol) (doc-type (eql ’variable))
++(setf documentation) new-value(x symbol) (doc-type (eql ’variable)) ++

++

Arguments and Values::

++ ++

x—an object. ++

++

doc-type—a symbol. ++

++

documentation—a string, or nil. ++

++

new-value—a string. ++

++

Description::

++ ++

The generic function documentation returns the documentation string ++associated with the given object if it is available; ++otherwise it returns nil. ++

++

The generic function (setf documentation) updates the ++documentation string associated with x to new-value. ++If x is a list, ++it must be of the form (setf symbol). ++

++

Documentation strings are made available for debugging purposes. ++Conforming programs are permitted to use documentation strings ++when they are present, but should not depend for their correct behavior on ++the presence of those documentation strings. ++An implementation is permitted to discard documentation strings ++at any time for implementation-defined reasons. ++

++

The nature of the documentation string returned depends on the ++doc-type, as follows: ++

++
++
compiler-macro
++

Returns the documentation string of the compiler macro ++whose name is the function name x. ++

++
++
function
++

If x is a function name, ++returns the documentation string of ++the function, macro, or special operator ++whose name is x. ++

++

If x is a function, ++returns the documentation string associated with x. ++

++
++
method-combination
++

If x is a symbol, ++returns the documentation string of ++the method combination ++whose name is x. ++

++

If x is a method combination, ++returns the documentation string associated with x. ++

++
++
setf
++

Returns the documentation string of ++

++

the setf expander ++

++

whose name is the symbol x. ++

++
++
structure
++

Returns the documentation string ++associated with the structure name x. ++

++
++
t
++

Returns a documentation string specialized on the class of ++the argument x itself. ++For example, if x is a function, ++the documentation string associated with the function x is returned. ++

++
++
type
++

If x is a symbol, ++returns the documentation string of the class ++whose name is the symbol x, ++if there is such a class. ++Otherwise, it returns the documentation string of the type ++which is the type specifier symbol x. ++

++

If x is a structure class or standard class, ++returns the documentation string associated with ++the class x. ++

++
++
variable
++

Returns the documentation string of ++the dynamic variable or constant variable ++whose name is the symbol x. ++

++
++
++ ++

A conforming implementation or a conforming program ++may extend the set of symbols that are acceptable as the doc-type. ++

++

Notes::

++ ++

This standard prescribes no means to retrieve the documentation strings ++for individual slots specified in a defclass form, but ++implementations might still provide debugging tools and/or ++programming language extensions which manipulate this information. ++Implementors wishing to provide such support are encouraged to consult the ++Metaobject Protocol for suggestions about how this might be done. ++

++
++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/dolist.html +@@ -0,0 +1,144 @@ ++ ++ ++ ++ ++ ++dolist (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++
++

6.2.3 dolist [Macro]

++ ++

dolist (var list-form [result-form]) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a symbol. ++

++

list-form—a form. ++

++

result-form—a form. ++

++

declaration—a declare expression; not evaluated. ++

++

tag—a go tag; not evaluated. ++

++

statement—a compound form; evaluated as described below. ++

++

results—if a return or return-from form is executed, ++ the values passed from that form; ++ otherwise, the values returned by the result-form ++ or nil if there is no result-form. ++

++

Description::

++ ++

dolist iterates over the elements of a list. ++The body of dolist is like a tagbody. ++It consists of a series of tags and statements. ++

++

dolist ++evaluates list-form, ++which should produce a list. It then executes the body ++once for each element in the list, in the order in which the ++tags and statements occur, with ++var bound to the element. ++Then result-form ++is evaluated. ++tags label ++statements. ++

++

At the time result-form is processed, ++var is bound to nil. ++

++

An implicit block ++named nil surrounds dolist. ++return may be used to terminate the loop immediately without ++performing any further iterations, returning zero or more values. ++

++

The scope of the binding of var ++does not include the list-form, ++but the result-form is included. ++

++

It is implementation-dependent whether dolist ++establishes a new binding of var on each iteration ++or whether it establishes a binding for var once at the ++beginning and then assigns it on any subsequent iterations. ++

++

Examples::

++
++
 (setq temp-two '()) ⇒  NIL
++ (dolist (temp-one '(1 2 3 4) temp-two) (push temp-one temp-two)) ⇒  (4 3 2 1)
++
++ (setq temp-two 0) ⇒  0
++ (dolist (temp-one '(1 2 3 4)) (incf temp-two)) ⇒  NIL
++ temp-two ⇒  4
++
++ (dolist (x '(a b c d)) (prin1 x) (princ " ")) 
++ |>  A B C D 
++⇒  NIL
++
++ ++

See Also::

++ ++

do ++, ++dotimes ++, ++tagbody ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

go may be used within the body of dolist ++to transfer control to a statement labeled by a tag. ++

++
++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/dotimes.html +@@ -0,0 +1,172 @@ ++ ++ ++ ++ ++ ++dotimes (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++
++

6.2.2 dotimes [Macro]

++ ++

dotimes (var count-form [result-form]) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a symbol. ++

++

count-form—a form. ++

++

result-form—a form. ++

++

declaration—a declare expression; not evaluated. ++

++

tag—a go tag; not evaluated. ++

++

statement—a compound form; evaluated as described below. ++

++

results—if a return or return-from form is executed, ++ the values passed from that form; ++ otherwise, the values returned by the result-form ++ or nil if there is no result-form. ++

++

Description::

++ ++

dotimes iterates over a series of integers. ++

++

dotimes evaluates count-form, ++which should produce an integer. ++If count-form is zero or negative, ++the body is not executed. ++dotimes then executes the body once for each integer from 0 up to ++but not including ++the value of count-form, ++in the order in which the ++tags and statements occur, with ++var bound to each integer. ++Then result-form ++is evaluated. ++At the time result-form is processed, var is bound to ++the number of times the body was executed. ++Tags label ++statements. ++

++

An implicit block ++named nil surrounds dotimes. ++return may be used to terminate the loop immediately without ++performing any further iterations, returning zero or more values. ++

++

The body of the loop is an implicit tagbody; ++it may contain tags to serve as the targets of go statements. ++Declarations may appear before the body of the loop. ++

++

The scope of the binding of var ++does not include the count-form, ++but the result-form is included. ++

++

It is implementation-dependent whether dotimes ++establishes a new binding of var on each iteration ++or whether it establishes a binding for var once at the ++beginning and then assigns it on any subsequent iterations. ++

++

Examples::

++ ++
++
 (dotimes (temp-one 10 temp-one)) ⇒  10
++ (setq temp-two 0) ⇒  0
++ (dotimes (temp-one 10 t) (incf temp-two)) ⇒  T
++ temp-two ⇒  10
++
++ ++

Here is an example of the use of dotimes in processing strings: ++

++
++
;;; True if the specified subsequence of the string is a
++;;; palindrome (reads the same forwards and backwards).
++ (defun palindromep (string &optional
++                           (start 0)
++                           (end (length string)))
++   (dotimes (k (floor (- end start) 2) t)
++    (unless (char-equal (char string (+ start k))
++                        (char string (- end k 1)))
++      (return nil))))
++ (palindromep "Able was I ere I saw Elba") ⇒  T
++ (palindromep "A man, a plan, a canal--Panama!") ⇒  NIL
++ (remove-if-not #'alpha-char-p          ;Remove punctuation.
++               "A man, a plan, a canal--Panama!")
++⇒  "AmanaplanacanalPanama"
++ (palindromep
++  (remove-if-not #'alpha-char-p
++                "A man, a plan, a canal--Panama!")) ⇒  T
++ (palindromep
++  (remove-if-not
++   #'alpha-char-p
++   "Unremarkable was I ere I saw Elba Kramer, nu?")) ⇒  T
++ (palindromep
++  (remove-if-not
++   #'alpha-char-p
++   "A man, a plan, a cat, a ham, a yak,
++                  a yam, a hat, a canal--Panama!")) ⇒  T
++
++ ++

See Also::

++ ++

do ++, ++dolist ++, ++tagbody ++

++

Notes::

++ ++

go may be used within the body of ++dotimes to transfer control to a statement labeled by a tag. ++

++
++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/dpb.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++dpb (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.68 dpb [Function]

++ ++

dpb newbyte bytespec integerresult-integer ++

++

Pronunciation::

++ ++

pronounced ,de ’pib ++ or pronounced ,de ’pe b ++ or pronounced ’d\=e ’p\=e ’b\=e ++

++

Arguments and Values::

++ ++

newbyte—an integer. ++

++

bytespec—a byte specifier. ++

++

integer—an integer. ++

++

result-integer—an integer. ++

++

Description::

++ ++

dpb (deposit byte) is used to ++replace a field of bits within integer. ++dpb returns an integer that is ++the same as integer except in the bits specified by bytespec. ++

++

Let s be the size specified ++by bytespec; then the low s bits of newbyte appear in ++the result in the byte specified by bytespec. ++Newbyte is interpreted as ++being right-justified, as if it were the result of ldb. ++

++

Examples::

++ ++
++
 (dpb 1 (byte 1 10) 0) ⇒  1024
++ (dpb -2 (byte 2 10) 0) ⇒  2048
++ (dpb 1 (byte 2 10) 2048) ⇒  1024
++
++ ++

See Also::

++ ++

byte ++, ++deposit-field ++, ++ldb ++

++

Notes::

++ ++
++
 (logbitp j (dpb m (byte s p) n))
++ ≡ (if (and (>= j p) (< j (+ p s)))
++        (logbitp (- j p) m)
++        (logbitp j n))
++
++ ++

In general, ++

++
++
 (dpb x (byte 0 y) z) ⇒  z
++
++ ++

for all valid values of x, y, and z. ++

++

Historically, the name “dpb” comes from a DEC PDP-10 assembly language ++instruction meaning “deposit byte.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/dribble.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++dribble (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.19 dribble [Function]

++ ++

dribble &optional pathnameimplementation-dependent ++

++

Arguments and Values::

++ ++

pathname—a pathname designator. ++

++

Description::

++ ++

Either binds *standard-input* and *standard-output* ++or takes other appropriate action, ++so as to send a record of the input/output interaction to a file ++named by pathname. dribble is intended to create ++a readable record of an interactive session. ++

++

If pathname is a logical pathname, it is translated ++into a physical pathname as if by calling translate-logical-pathname. ++

++

(dribble) terminates the recording of input and output ++and closes the dribble file. ++

++

If dribble is called while a stream to a “dribble file” ++is still open from a previous call to dribble, ++the effect is implementation-defined. For example, ++ the already-open stream might be closed, ++ or dribbling might occur both to the old stream and to a new one, ++ or the old stream might stay open but not receive any further output, ++ or the new request might be ignored, ++ or some other action might be taken. ++

++

Affected By::

++ ++

The implementation. ++

++

Exceptional Situations::

++ ++

If a failure occurs when performing some operation on the file system ++while creating the dribble file, ++an error of type file-error is signaled. ++

++

An error of type file-error might be signaled if pathname ++is a designator for a wild pathname. ++

++

See Also::

++ ++

Pathnames as Filenames ++

++

Notes::

++ ++

dribble can return before subsequent ++forms are executed. It also ++can enter a recursive interaction loop, ++returning only when (dribble) is done. ++

++

dribble is intended primarily for interactive debugging; ++its effect cannot be relied upon when used in a program. ++

++
++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/dynamic_002dextent.html +@@ -0,0 +1,267 @@ ++ ++ ++ ++ ++ ++dynamic-extent (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.20 dynamic-extent [Declaration]

++ ++

Syntax::

++ ++

(dynamic-extent [[{var}* | ++ (function fn)*]]) ++

++

Arguments::

++ ++

var—a variable name. ++

++

fn—a function name. ++

++

Valid Context::

++ ++

declaration ++

++

Binding Types Affected::

++ ++

variable, function ++

++

Description::

++ ++

In some containing form, F, this declaration ++asserts for each var_i (which need not be bound by F), ++and for each value v_{ij} that var_i takes on, ++and for each object x_{ijk} that ++is ++an otherwise inaccessible part of v_{ij} at any time when ++v_{ij} ++becomes the value of var_i, ++that just after the execution of F terminates, ++x_{ijk} is either inaccessible ++(if F established a binding for var_i) ++or still an otherwise inaccessible part of the current value of ++var_i (if F did not establish a binding ++for var_i). ++

++

The same relation holds for each fn_i, ++except that the bindings are in the function namespace. ++

++

The compiler is permitted to use ++this information in any way that is appropriate to the implementation ++and that does not conflict with the semantics of Common Lisp. ++

++

dynamic-extent declarations can be free declarations ++or bound declarations. ++

++

The vars and fns named in a dynamic-extent ++declaration must not refer to symbol macro or macro bindings. ++

++

Examples::

++ ++

Since stack allocation of the initial value entails knowing at the ++object’s creation time that the object can be ++stack-allocated, it is not generally useful to make a ++dynamic-extent declaration for variables ++which have no lexically apparent initial value. ++For example, it is probably useful to write: ++

++
++
 (defun f ()
++   (let ((x (list 1 2 3)))
++     (declare (dynamic-extent x))
++         ...))
++
++ ++

This would permit those compilers that wish to do so to stack allocate ++the list held by the local variable x. It is permissible, ++but in practice probably not as useful, to write: ++

++
++
 (defun g (x) (declare (dynamic-extent x)) ...)
++ (defun f () (g (list 1 2 3)))
++
++ ++

Most compilers would probably not stack allocate the argument ++to g in f because it would be a modularity violation for the compiler ++to assume facts about g from within f. Only an implementation that ++was willing to be responsible for recompiling f if the definition of g ++changed incompatibly could legitimately stack allocate the list ++argument to g in f. ++

++

Here is another example: ++

++
++
 (declaim (inline g))
++ (defun g (x) (declare (dynamic-extent x)) ...)
++ (defun f () (g (list 1 2 3)))
++
++ (defun f ()
++   (flet ((g (x) (declare (dynamic-extent x)) ...))
++     (g (list 1 2 3))))
++
++
++ ++

In the previous example, some compilers might determine that optimization was ++possible and others might not. ++

++

A variant of this is the so-called “stack allocated rest list” ++that can be achieved (in implementations supporting the optimization) by: ++

++
++
 (defun f (&rest x)
++   (declare (dynamic-extent x))
++   ...)
++
++ ++

Note that although the initial value of x is not explicit, the f ++function is responsible for assembling the list x from the passed arguments, ++so the f function can be optimized by the compiler to construct a ++stack-allocated list instead of a heap-allocated list in implementations ++that support such. ++

++

In the following example, ++

++
++
 (let ((x (list 'a1 'b1 'c1))
++       (y (cons 'a2 (cons 'b2 (cons 'c2 nil)))))
++   (declare (dynamic-extent x y))
++   ...)
++
++ ++

The otherwise inaccessible parts of x are three ++conses, and the otherwise inaccessible parts ++of y are three other conses. ++None of the symbols a1, b1, c1, a2, ++b2, c2, or nil is an ++otherwise inaccessible part of x or y because each ++is interned and hence accessible by the package ++(or packages) in which it is interned. ++However, if a freshly allocated uninterned symbol had ++been used, it would have been an otherwise inaccessible part of ++the list which contained it. ++

++
++
;; In this example, the implementation is permitted to stack allocate
++;; the list that is bound to X.
++ (let ((x (list 1 2 3)))
++   (declare (dynamic-extent x))
++   (print x)
++   :done)
++ |>  (1 2 3)
++⇒  :DONE
++
++;; In this example, the list to be bound to L can be stack-allocated.
++ (defun zap (x y z)
++   (do ((l (list x y z) (cdr l)))
++       ((null l))
++     (declare (dynamic-extent l))
++     (prin1 (car l)))) ⇒  ZAP
++ (zap 1 2 3)
++ |>  123
++⇒  NIL
++
++;; Some implementations might open-code LIST-ALL-PACKAGES in a way
++;; that permits using stack allocation of the list to be bound to L.
++ (do ((l (list-all-packages) (cdr l)))
++     ((null l))
++   (declare (dynamic-extent l))
++   (let ((name (package-name (car l))))
++     (when (string-search "COMMON-LISP" name) (print name))))
++ |>  "COMMON-LISP"
++ |>  "COMMON-LISP-USER"
++⇒  NIL
++
++;; Some implementations might have the ability to stack allocate 
++;; rest lists.  A declaration such as the following should be a cue
++;; to such implementations that stack-allocation of the rest list
++;; would be desirable.
++ (defun add (&rest x)
++   (declare (dynamic-extent x))
++   (apply #'+ x)) ⇒  ADD
++ (add 1 2 3) ⇒  6
++
++ (defun zap (n m)
++   ;; Computes (RANDOM (+ M 1)) at relative speed of roughly O(N).
++   ;; It may be slow, but with a good compiler at least it
++   ;; doesn't waste much heap storage.  :-}
++   (let ((a (make-array n)))
++     (declare (dynamic-extent a))
++     (dotimes (i n) 
++       (declare (dynamic-extent i))
++       (setf (aref a i) (random (+ i 1))))
++     (aref a m))) ⇒  ZAP
++ (< (zap 5 3) 3) ⇒  true
++
++ ++

The following are in error, since the value of x is used outside of its ++extent: ++

++
++
 (length (list (let ((x (list 1 2 3)))  ; Invalid
++                (declare (dynamic-extent x))
++                x)))
++
++ (progn (let ((x (list 1 2 3)))  ; Invalid
++          (declare (dynamic-extent x))
++          x)
++        nil)
++
++ ++

See Also::

++ ++

declare ++

++

Notes::

++ ++

The most common optimization is to stack allocate the ++initial value of the objects named by the vars. ++

++

It is permissible for an implementation to simply ignore this declaration. ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/echo_002dstream.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++echo-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.4 echo-stream [System Class]

++ ++

Class Precedence List::

++ ++

echo-stream, ++stream, ++t ++

++

Description::

++ ++

An echo stream is a bidirectional stream ++that gets its input from an associated input stream ++and sends its output to an associated output stream. ++

++

All input taken from the input stream ++is echoed to the output stream. ++Whether the input is echoed immediately after it is encountered, ++or after it has been read from the input stream ++is implementation-dependent. ++

++

See Also::

++ ++

echo-stream-input-stream ++, ++echo-stream-output-stream, ++make-echo-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/echo_002dstream_002dinput_002dstream.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++echo-stream-input-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.44 echo-stream-input-stream, echo-stream-output-stream [Function]

++ ++

echo-stream-input-stream echo-streaminput-stream ++

++

echo-stream-output-stream echo-streamoutput-stream ++

++

Arguments and Values::

++ ++

echo-stream—an echo stream. ++

++

input-stream—an input stream. ++

++

output-stream—an output stream. ++

++

Description::

++ ++

echo-stream-input-stream returns the input stream ++from which echo-stream receives input. ++

++

echo-stream-output-stream returns the output stream ++to which echo-stream sends output. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ed.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++ed (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.17 ed [Function]

++ ++

ed &optional ximplementation-dependent ++

++

Arguments and Values::

++ ++

xnil, a pathname, a string, or a function name. ++

++

The default is nil. ++

++

Description::

++ ++

ed invokes the editor if the implementation provides a resident editor. ++

++

If x is nil, the editor is entered. ++If the editor had been previously entered, its prior state is resumed, if possible. ++

++

If x is a pathname or string, ++it is taken as the pathname designator for a file to be edited. ++

++

If x is a function name, the text of its definition is edited. ++The means by which the function text is obtained is implementation-defined. ++

++

Exceptional Situations::

++ ++

The consequences are undefined if the implementation does not provide a resident editor. ++

++

Might signal type-error if its argument is supplied but is not ++a symbol, a pathname, or nil. ++

++

If a failure occurs when performing some operation on the file system ++while attempting to edit a file, ++an error of type file-error is signaled. ++

++

An error of type file-error might be signaled if x ++is a designator for a wild pathname. ++

++

Implementation-dependent additional conditions might be signaled as well. ++

++

See Also::

++ ++

pathname, ++

++

logical-pathname, ++

++

compile-file ++, ++load ++, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/elt.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++elt (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.3 elt [Accessor]

++ ++

elt sequence indexobject ++

++

(setf ( elt sequence index) new-object)
++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

index—a valid sequence index for sequence. ++

++

object—an object. ++

++

new-object—an object. ++

++

Description::

++ ++

Accesses the element of sequence specified by index. ++

++

Examples::

++ ++
++
 (setq str (copy-seq "0123456789")) ⇒  "0123456789"
++ (elt str 6) ⇒  #\6
++ (setf (elt str 0) #\#) ⇒  #\#
++ str ⇒  "#123456789"
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++Should signal an error of type type-error ++ if index is not a valid sequence index for sequence. ++

++

See Also::

++ ++

aref ++, ++nth ++, ++

++

Compiler Terminology ++

++

Notes::

++ ++

aref may be used to access vector ++elements that are beyond the vector’s fill pointer. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/encode_002duniversal_002dtime.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++encode-universal-time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.2 encode-universal-time [function]

++ ++

Syntax::

++ ++

encode-universal-time second minute hour date month year ++ &optional time-zone
++ ⇒ universal-time ++

++

Arguments and Values::

++ ++

second, minute, hour, ++date, month, year, ++time-zone—the corresponding parts of a decoded time. ++ (Note that some of the nine values in a full decoded time are redundant, ++ and so are not used as inputs to this function.) ++

++

universal-time—a universal time. ++

++

Description::

++ ++

encode-universal-time converts a time from Decoded Time format ++to a universal time. ++

++

If time-zone is supplied, no adjustment for daylight savings time is performed. ++

++

Examples::

++ ++
++
 (encode-universal-time 0 0 0 1 1 1900 0) ⇒  0
++ (encode-universal-time 0 0 1 4 7 1976 5) ⇒  2414296800
++;; The next example assumes Eastern Daylight Time.
++ (encode-universal-time 0 0 1 4 7 1976) ⇒  2414293200
++
++ ++

See Also::

++ ++

decode-universal-time ++, get-decoded-time ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/end_002dof_002dfile.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++end-of-file (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Streams Dictionary  

++
++
++

21.2.57 end-of-file [Condition Type]

++ ++

Class Precedence List::

++

end-of-file, ++stream-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type end-of-file consists of ++error conditions related to read operations that are done on ++streams that have no more data. ++

++

See Also::

++ ++

stream-error-stream ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/endp.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++endp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.23 endp [Function]

++ ++

endp listgeneralized-boolean ++

++

Arguments and Values::

++ ++

list—a list, ++

++

which might be a dotted list or a circular list. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if list is the empty list. ++Returns false if list is a cons. ++

++

Examples::

++ ++
++
 (endp nil) ⇒  true
++ (endp '(1 2)) ⇒  false
++ (endp (cddr '(1 2))) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if list is not a list. ++

++

Notes::

++ ++

The purpose of endp is to test for the end of proper list. ++Since endp does not descend into a cons, ++it is well-defined to pass it a dotted list. ++However, if shorter “lists” are iteratively produced ++by calling cdr on such a dotted list ++and those “lists” are tested with endp, ++a situation that has undefined consequences will eventually result ++when the non-nil atom (which is not in fact a list) ++finally becomes the argument to endp. ++Since this is the usual way in which endp is used, ++it is conservative programming style ++and consistent with the intent of endp ++to treat endp as simply a function on proper lists ++which happens not to enforce an argument type of proper list except ++when the argument is atomic. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ensure_002ddirectories_002dexist.html +@@ -0,0 +1,102 @@ ++ ++ ++ ++ ++ ++ensure-directories-exist (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.3 ensure-directories-exist [Function]

++ ++

ensure-directories-exist pathspec &key verbosepathspec, created ++

++

Arguments and Values::

++ ++

pathspec—a pathname designator. ++

++

verbose—a generalized boolean. ++

++

created—a generalized boolean. ++

++

Description::

++ ++

Tests whether the directories containing the specified file actually exist, ++and attempts to create them if they do not. ++

++

If the containing directories do not exist and if verbose is true, ++then the implementation is permitted (but not required) ++to perform output to standard output saying what directories were created. ++If the containing directories exist, or if verbose is false, ++this function performs no output. ++

++

The primary value is the given pathspec so that this operation can ++be straightforwardly composed with other file manipulation expressions. ++The secondary value, created, is true if any directories were ++created. ++

++

Affected By::

++ ++

The host computer’s file system. ++

++

Exceptional Situations::

++ ++

An error of type file-error is signaled if the host, device, or directory ++part of pathspec is wild. ++

++

If the directory creation attempt is not successful, ++an error of type file-error is signaled; ++if this occurs, ++it might be the case that none, some, or all ++of the requested creations have actually occurred ++within the file system. ++

++

See Also::

++ ++

probe-file ++, ++open ++, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ensure_002dgeneric_002dfunction.html +@@ -0,0 +1,158 @@ ++ ++ ++ ++ ++ ++ensure-generic-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.2 ensure-generic-function [Function]

++ ++

ensure-generic-function function-name &key ++ argument-precedence-order declare ++ documentation environment ++ generic-function-class lambda-list ++ method-class method-combination
++ ⇒ generic-function ++

++

Arguments and Values::

++ ++

function-name—a function name. ++

++

The keyword arguments correspond to the option arguments of ++defgeneric, except that the :method-class and ++:generic-function-class arguments can be class objects ++as well as names. ++

++

Method-combination – method combination object. ++

++

Environment – the same as the &environment argument ++to macro expansion functions and is used to distinguish between compile-time ++and run-time environments. ++

++

[Editorial Note by KMP: What about documentation. Missing from this arguments enumeration, ++ and confusing in description below.] ++

++

generic-function—a generic function object. ++

++

Description::

++ ++

The function ensure-generic-function is used to define ++a globally named generic function with no methods ++or to specify or modify options and declarations that pertain to ++a globally named generic function as a whole. ++

++

If function-name is not fbound in the global environment, ++a new ++generic function is created. ++If ++

++

(fdefinition function-name) ++

++

is an ordinary function, ++a macro, ++or a special operator, ++an error is signaled. ++

++

If function-name ++is a list, it must be of the ++form (setf symbol). ++If function-name specifies a generic function that has a ++different value for any of the following arguments, ++the generic function is modified to have the new value: ++:argument-precedence-order, :declare, :documentation, ++:method-combination. ++

++

If function-name specifies a generic function that has a ++different value for the :lambda-list argument, and the new value ++is congruent with the lambda lists of all existing ++methods or there ++are no methods, the value is changed; otherwise an error is signaled. ++

++

If function-name specifies a generic function that has a ++different value for the :generic-function-class argument and if ++the new generic function class is compatible with the old, ++change-class is called to change the class of the ++generic function; ++otherwise an error is signaled. ++

++

If function-name specifies a generic function that has a ++different value for the :method-class argument, the value is ++changed, but any existing methods are not changed. ++

++

Affected By::

++ ++

Existing function binding of function-name. ++

++

Exceptional Situations::

++ ++

If ++

++

(fdefinition function-name) ++

++

is an ordinary function, a macro, or a special operator, ++an error of type error is signaled. ++

++

If function-name specifies a ++generic function that has a ++different value for the :lambda-list argument, and the new value ++is not congruent with the lambda list of any existing ++method, ++an error of type error is signaled. ++

++

If function-name specifies a ++generic function that has a ++different value for the :generic-function-class argument and if ++the new generic function class not is compatible with the old, ++an error of type error is signaled. ++

++

See Also::

++ ++

defgeneric ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/eq.html +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++eq (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.33 eq [Function]

++ ++

eq x ygeneralized-boolean ++

++

Arguments and Values::

++ ++

x—an object. ++

++

y—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if its arguments are the same, identical object; ++otherwise, returns false. ++

++

Examples::

++
++
 (eq 'a 'b) ⇒  false
++ (eq 'a 'a) ⇒  true
++ (eq 3 3)
++⇒  true
++ORfalse
++ (eq 3 3.0) ⇒  false
++ (eq 3.0 3.0)
++⇒  true
++ORfalse
++ (eq #c(3 -4) #c(3 -4))
++⇒  true
++ORfalse
++ (eq #c(3 -4.0) #c(3 -4)) ⇒  false
++ (eq (cons 'a 'b) (cons 'a 'c)) ⇒  false
++ (eq (cons 'a 'b) (cons 'a 'b)) ⇒  false
++ (eq '(a . b) '(a . b))
++⇒  true
++ORfalse
++ (progn (setq x (cons 'a 'b)) (eq x x)) ⇒  true
++ (progn (setq x '(a . b)) (eq x x)) ⇒  true
++ (eq #\A #\A)
++⇒  true
++ORfalse
++ (let ((x "Foo")) (eq x x)) ⇒  true
++ (eq "Foo" "Foo")
++⇒  true
++ORfalse
++ (eq "Foo" (copy-seq "Foo")) ⇒  false
++ (eq "FOO" "foo") ⇒  false
++ (eq "string-seq" (copy-seq "string-seq")) ⇒  false
++ (let ((x 5)) (eq x x))
++⇒  true
++ORfalse
++
++ ++

See Also::

++ ++

eql ++, ++equal ++, ++equalp ++, ++= ++, ++Compilation ++

++

Notes::

++

Objects that appear the same when printed are not necessarily ++eq to each other. Symbols that print the same ++usually are eq to each other because of the use of the ++intern function. However, numbers with the ++same value need not be eq, and two similar ++lists are usually not identical. ++

++

An implementation is permitted to make “copies” of ++characters and numbers at any time. ++The effect is that Common Lisp makes no guarantee that eq ++is true even when both its arguments are “the same thing” if ++that thing is a character or number. ++

++

Most Common Lisp operators use eql rather than ++eq to compare objects, or else they default to eql ++and only use eq if specifically requested to do so. ++However, the following operators are defined to use eq ++rather than eql in a way that cannot be overridden by the ++code which employs them: ++

++
++
  catch           getf     throw  
++  get             remf            
++  get-properties  remprop  
++
++  Figure 5–11: Operators that always prefer EQ over EQL
++
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/eql-_0028Type-Specifier_0029.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++eql (Type Specifier) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.23 eql [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Combining. ++

++

Compound Type Specifier Syntax::

++ ++

(eql{object}) ++

++

Compound Type Specifier Arguments::

++ ++

object—an object. ++

++

Compound Type Specifier Description::

++ ++

Represents the type whose only element is object. ++

++

The argument object is required. The object can be *, ++but if so it denotes itself (the symbol *) ++and does not represent an unspecified value. ++The symbol eql is not valid as an atomic type specifier. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/eql.html +@@ -0,0 +1,167 @@ ++ ++ ++ ++ ++ ++eql (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.34 eql [Function]

++ ++

eql x ygeneralized-boolean ++

++

Arguments and Values::

++ ++

x—an object. ++

++

y—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

The value of eql is true of two objects, x and ++y, in the folowing cases: ++

++
1.
++

If x and y are eq. ++

++
2.
++

If x and y are both numbers ++of the same type and the same value. ++

++
3.
++

If they are both characters that represent the ++same character. ++

++
++ ++

Otherwise the value of eql is false. ++

++

If an implementation supports positive and negative zeros as distinct values, ++then (eql 0.0 -0.0) returns false. ++Otherwise, when the syntax -0.0 is read it is interpreted as the value 0.0, ++and so (eql 0.0 -0.0) returns true. ++

++

Examples::

++ ++
++
 (eql 'a 'b) ⇒  false
++ (eql 'a 'a) ⇒  true
++ (eql 3 3) ⇒  true
++ (eql 3 3.0) ⇒  false
++ (eql 3.0 3.0) ⇒  true
++ (eql #c(3 -4) #c(3 -4)) ⇒  true
++ (eql #c(3 -4.0) #c(3 -4)) ⇒  false
++ (eql (cons 'a 'b) (cons 'a 'c)) ⇒  false
++ (eql (cons 'a 'b) (cons 'a 'b)) ⇒  false
++ (eql '(a . b) '(a . b))
++⇒  true
++ORfalse
++ (progn (setq x (cons 'a 'b)) (eql x x)) ⇒  true
++ (progn (setq x '(a . b)) (eql x x)) ⇒  true
++ (eql #\A #\A) ⇒  true
++ (eql "Foo" "Foo")
++⇒  true
++ORfalse
++ (eql "Foo" (copy-seq "Foo")) ⇒  false
++ (eql "FOO" "foo") ⇒  false
++
++ ++

Normally (eql 1.0s0 1.0d0) is false, under the assumption ++that 1.0s0 and 1.0d0 are of distinct data types. ++However, implementations that do not provide four distinct floating-point ++formats are permitted to “collapse” the four formats into some ++smaller number of them; in such an implementation (eql 1.0s0 1.0d0) ++might be true. ++

++

See Also::

++ ++

eq ++, ++equal ++, ++equalp ++, ++= ++, ++char= ++

++

Notes::

++ ++

eql is the same as eq, except that if the ++arguments are characters or numbers ++of the same type then their ++values are compared. Thus eql tells whether two objects ++are conceptually the same, whereas eq tells whether two ++objects are implementationally identical. It is for this reason ++that eql, not eq, is the default comparison predicate ++for operators that take sequences ++as arguments. ++

++

eql may not be true of two floats ++even when they represent the same ++value. = is used to compare ++mathematical values. ++

++

Two complex numbers are considered to be eql ++if their real parts are eql ++and their imaginary parts are eql. ++For example, (eql #C(4 5) #C(4 5)) is true and ++(eql #C(4 5) #C(4.0 5.0)) is false. ++Note that while (eql #C(5.0 0.0) 5.0) is false, ++(eql #C(5 0) 5) is true. ++In the case of (eql #C(5.0 0.0) 5.0) the ++two arguments are of different types, ++and so cannot satisfy eql. ++In the case of (eql #C(5 0) 5), ++#C(5 0) is not a complex number, but ++is automatically reduced ++to the integer 5. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/equal.html +@@ -0,0 +1,193 @@ ++ ++ ++ ++ ++ ++equal (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.35 equal [Function]

++ ++

equal x ygeneralized-boolean ++

++

Arguments and Values::

++ ++

x—an object. ++

++

y—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if x and y are structurally similar ++(isomorphic) objects. Objects are treated as follows by ++equal. ++

++
++
Symbols, Numbers, and Characters
++

equal is true of two objects ++if they are symbols that are eq, ++if they are numbers that are eql, or ++if they are characters that are eql. ++

++
++
Conses
++

For conses, equal is defined recursively as ++the two cars being equal ++and the two cdrs being equal. ++

++
++
Arrays
++

Two arrays are equal only if they are eq, ++with one exception: ++strings and bit vectors are compared element-by-element (using eql). ++If either x or y has a fill pointer, the ++fill pointer limits ++the number of elements examined by equal. ++Uppercase and lowercase letters in strings are considered by ++equal to be different. ++

++
++
Pathnames
++

Two pathnames are equal if and only if ++all the corresponding components ++(host, device, and so on) are ++equivalent. Whether or not ++uppercase and lowercase letters are considered equivalent ++in strings appearing in components is implementation-dependent. ++pathnames ++that are equal should be functionally equivalent. ++

++
++
Other (Structures, hash-tables, instances, ...)
++

Two other objects are equal only if they are eq. ++

++
++
++ ++

equal does not descend any objects other than the ++ones explicitly specified above. ++Figure 5–12 summarizes the information given in the previous list. ++In addition, the figure specifies the priority of the behavior of equal, ++with upper ++ entries taking priority over lower ones. ++

++
++
  Type          Behavior                   
++  number        uses eql                   
++  character     uses eql                   
++  cons          descends                   
++  bit vector    descends                   
++  string        descends                   
++  pathname      “functionally equivalent”  
++  structure     uses eq                    
++  Other array   uses eq                    
++  hash table    uses eq                    
++  Other object  uses eq                    
++
++  Figure 5–12: Summary and priorities of behavior of equal
++
++
++ ++

Any two objects that are eql are also equal. ++

++

equal may fail to terminate if x or y is circular. ++

++

Examples::

++ ++
++
 (equal 'a 'b) ⇒  false
++ (equal 'a 'a) ⇒  true
++ (equal 3 3) ⇒  true
++ (equal 3 3.0) ⇒  false
++ (equal 3.0 3.0) ⇒  true
++ (equal #c(3 -4) #c(3 -4)) ⇒  true
++ (equal #c(3 -4.0) #c(3 -4)) ⇒  false
++ (equal (cons 'a 'b) (cons 'a 'c)) ⇒  false
++ (equal (cons 'a 'b) (cons 'a 'b)) ⇒  true
++ (equal #\A #\A) ⇒  true
++ (equal #\A #\a) ⇒  false
++ (equal "Foo" "Foo") ⇒  true
++ (equal "Foo" (copy-seq "Foo")) ⇒  true
++ (equal "FOO" "foo") ⇒  false
++ (equal "This-string" "This-string") ⇒  true
++ (equal "This-string" "this-string") ⇒  false
++
++ ++

See Also::

++ ++

eq ++, ++eql ++, ++equalp ++, ++= ++, ++string= ++, string-equal, ++char= ++, ++char-equal, ++tree-equal ++

++

Notes::

++ ++

Object equality is not a concept for which there is a uniquely ++ determined correct algorithm. The appropriateness of an equality ++ predicate can be judged only in the context of the needs of some ++ particular program. Although these functions take any type of ++ argument and their names sound very generic, ++equal and equalp are ++ not appropriate for every application. ++

++

A rough rule of thumb is that two objects are equal ++if and only if their printed representations are the same. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/equalp.html +@@ -0,0 +1,197 @@ ++ ++ ++ ++ ++ ++equalp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.36 equalp [Function]

++ ++

equalp x ygeneralized-boolean ++

++

Arguments and Values::

++ ++

x—an object. ++

++

y—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if x and y are equal, ++or if they have components that are of the same type as each other ++ and if those components are equalp; ++specifically, equalp returns true in the following cases: ++

++
Characters
++

If two characters are char-equal. ++

++
++
Numbers
++

If two numbers are the same under =. ++

++
++
Conses
++

If the two cars in the conses are equalp ++and the two cdrs in the conses are equalp. ++

++
++
Arrays
++

If two arrays have the same ++number of dimensions, the dimensions match, ++and the corresponding ++active elements ++are equalp. ++The types for which the arrays are specialized need not match; ++for example, a string and a general array that happens to contain the same ++characters are equalp. ++Because equalp performs element-by-element comparisons ++of strings and ignores the case of characters, ++case distinctions are ignored when equalp compares strings. ++

++
++
Structures
++

If two structures S_1 and S_2 have the same class ++and the value of each slot in S_1 is the same under equalp ++as the value of the corresponding slot in S_2. ++

++
++
Hash Tables
++

equalp descends hash-tables by first comparing the count of entries ++ and the :test function; if those are the same, it compares the ++ keys of the tables using the :test function and then the values ++ of the matching keys using equalp recursively. ++

++
++
++ ++

equalp does not descend any objects ++ other than the ones explicitly specified above. ++Figure 5–13 summarizes the information given in the previous list. ++In addition, the figure specifies the priority of the behavior of equalp, ++with upper ++ entries taking priority over lower ones. ++

++
++
  Type          Behavior                      
++  number        uses =                        
++  character     uses char-equal               
++  cons          descends                      
++  bit vector    descends                      
++  string        descends                      
++  pathname      same as equal                 
++  structure     descends, as described above  
++  Other array   descends                      
++  hash table    descends, as described above  
++  Other object  uses eq                       
++
++  Figure 5–13: Summary and priorities of behavior of equalp
++
++
++ ++

Examples::

++ ++
++
 (equalp 'a 'b) ⇒  false
++ (equalp 'a 'a) ⇒  true
++ (equalp 3 3) ⇒  true
++ (equalp 3 3.0) ⇒  true
++ (equalp 3.0 3.0) ⇒  true
++ (equalp #c(3 -4) #c(3 -4)) ⇒  true
++ (equalp #c(3 -4.0) #c(3 -4)) ⇒  true
++ (equalp (cons 'a 'b) (cons 'a 'c)) ⇒  false
++ (equalp (cons 'a 'b) (cons 'a 'b)) ⇒  true
++ (equalp #\A #\A) ⇒  true
++ (equalp #\A #\a) ⇒  true
++ (equalp "Foo" "Foo") ⇒  true
++ (equalp "Foo" (copy-seq "Foo")) ⇒  true
++ (equalp "FOO" "foo") ⇒  true
++
++ ++
++
 (setq array1 (make-array 6 :element-type 'integer
++                            :initial-contents '(1 1 1 3 5 7))) 
++⇒  #(1 1 1 3 5 7)
++ (setq array2 (make-array 8 :element-type 'integer
++                            :initial-contents '(1 1 1 3 5 7 2 6)
++                            :fill-pointer 6))
++⇒  #(1 1 1 3 5 7)
++ (equalp array1 array2) ⇒  true
++ (setq vector1 (vector 1 1 1 3 5 7)) ⇒  #(1 1 1 3 5 7)
++ (equalp array1 vector1) ⇒  true 
++
++ ++

See Also::

++ ++

eq ++, ++eql ++, ++equal ++, ++= ++, ++string= ++, string-equal, ++char= ++, ++char-equal ++

++

Notes::

++ ++

Object equality is not a concept for which there is a uniquely ++ determined correct algorithm. The appropriateness of an equality ++ predicate can be judged only in the context of the needs of some ++ particular program. Although these functions take any type of ++ argument and their names sound very generic, ++equal and equalp are ++ not appropriate for every application. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/error-_0028Condition-Type_0029.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++error (Condition Type) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.5 error [Condition Type]

++ ++

Class Precedence List::

++

error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type error consists of all conditions that represent errors. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/error.html +@@ -0,0 +1,171 @@ ++ ++ ++ ++ ++ ++error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.11 error [Function]

++ ++

error datum &rest arguments ++ ⇒ #<NoValue> ++

++

Arguments and Values::

++ ++

datum, argumentsdesignators for a condition ++ of default type simple-error. ++

++

Description::

++ ++

error effectively invokes signal on the denoted condition. ++

++

If the condition is not handled, (invoke-debugger condition) is done. ++As a consequence of calling invoke-debugger, error ++cannot directly return; the only exit from error ++can come by non-local transfer of control in a handler or by use of ++an interactive debugging command. ++

++

Examples::

++ ++
++
 (defun factorial (x)
++   (cond ((or (not (typep x 'integer)) (minusp x))
++          (error "~S is not a valid argument to FACTORIAL." x))
++         ((zerop x) 1)
++         (t (* x (factorial (- x 1))))))
++⇒  FACTORIAL
++(factorial 20)
++⇒  2432902008176640000
++(factorial -1)
++ |>  Error: -1 is not a valid argument to FACTORIAL.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Return to Lisp Toplevel.
++ |>  Debug> 
++
++ ++
++
 (setq a 'fred)
++⇒  FRED
++ (if (numberp a) (1+ a) (error "~S is not a number." A))
++ |>  Error: FRED is not a number.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Return to Lisp Toplevel.
++ |>  Debug> |>>:Continue 1<<|
++ |>  Return to Lisp Toplevel.
++
++ (define-condition not-a-number (error) 
++                   ((argument :reader not-a-number-argument :initarg :argument))
++   (:report (lambda (condition stream)
++              (format stream "~S is not a number."
++                      (not-a-number-argument condition)))))
++⇒  NOT-A-NUMBER
++
++ (if (numberp a) (1+ a) (error 'not-a-number :argument a))
++ |>  Error: FRED is not a number.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Return to Lisp Toplevel.
++ |>  Debug> |>>:Continue 1<<|
++ |>  Return to Lisp Toplevel.
++
++ ++

Side Effects::

++ ++

Handlers for the specified condition, if any, are invoked ++and might have side effects. ++Program execution might stop, and the debugger might be entered. ++

++

Affected By::

++ ++

Existing handler bindings. ++

++

*break-on-signals* ++

++

Signals an error of type type-error if datum and arguments are not designators for a condition. ++

++

See Also::

++ ++

cerror ++, ++signal ++, ++format ++, ++ignore-errors ++, *break-on-signals*, ++handler-bind ++, Condition System Concepts ++

++

Notes::

++ ++

Some implementations may provide debugger ++commands for interactively returning from individual stack frames. ++However, it should be possible for the programmer to feel confident ++about writing code like: ++

++
++
 (defun wargames:no-win-scenario ()
++   (if (error "pushing the button would be stupid."))
++   (push-the-button))
++
++ ++

In this scenario, there should be no chance that ++error will return ++and the button will get pushed. ++

++

While the meaning of this program is clear and it might be proven ‘safe’ ++by a formal theorem prover, such a proof is no guarantee that the ++program is safe to execute. Compilers have been known to have bugs, ++computers to have signal glitches, and human beings to manually ++intervene in ways that are not always possible to predict. Those kinds ++of errors, while beyond the scope of the condition system to formally ++model, are not beyond the scope of things that should seriously be ++considered when writing code that could have the kinds of sweeping ++effects hinted at by this example. ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/eval.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++eval (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.4 eval [Function]

++ ++

eval form{result}* ++

++

Arguments and Values::

++ ++

form—a form. ++

++

results—the values yielded by the evaluation of form. ++

++

Description::

++ ++

Evaluates form in the current dynamic environment ++and the null lexical environment. ++

++

eval is a user interface to the evaluator. ++

++

The evaluator expands macro calls as if through the use of macroexpand-1. ++

++

Constants appearing in code ++processed by eval are ++not copied nor coalesced. The code resulting from the execution of ++eval ++references objects ++that are eql to the corresponding objects in ++the source code. ++

++

Examples::

++ ++
++
 (setq form '(1+ a) a 999) ⇒  999
++ (eval form) ⇒  1000
++ (eval 'form) ⇒  (1+ A)
++ (let ((a '(this would break if eval used local value))) (eval form))
++⇒  1000
++
++ ++

See Also::

++ ++

macroexpand-1, ++The Evaluation Model ++

++

Notes::

++ ++

To obtain the current dynamic value of a symbol, ++use of symbol-value is equivalent (and usually preferable) ++to use of eval. ++

++

Note that an eval form involves two levels of evaluation ++for its argument. First, form is evaluated by the ++normal argument evaluation mechanism as would occur with any call. ++The object that results from this normal argument evaluation ++becomes the value of the form parameter, and is then ++evaluated as part of the eval form. ++For example: ++

++
++
 (eval (list 'cdr (car '((quote (a . b)) c)))) ⇒  b
++
++ ++

The argument form (list 'cdr (car '((quote (a . b)) c))) is evaluated ++in the usual way to produce the argument (cdr (quote (a . b))); ++eval then evaluates its argument, (cdr (quote (a . b))), to produce b. ++Since a single evaluation already occurs for any argument form ++in any function form, ++eval is sometimes said to perform “an extra level of evaluation.” ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/eval_002dwhen.html +@@ -0,0 +1,262 @@ ++ ++ ++ ++ ++ ++eval-when (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.5 eval-when [Special Operator]

++ ++

eval-when ({situation}*) {form}*{result}* ++

++

Arguments and Values::

++ ++

situation—One of the symbols ++ :compile-toplevel ++, ++ :load-toplevel ++, ++ :execute ++, ++ compile ++ ++, ++ load ++ ++, or ++ eval ++ ++. ++

++

The use of eval, compile, and load is deprecated. ++

++

forms—an implicit progn. ++

++

results—the values of the forms if they are executed, ++ or nil if they are not. ++

++

Description::

++ ++

The body of an eval-when form is processed as an implicit progn, ++but only in the situations listed. ++

++

The use of the situations :compile-toplevel (or compile) and ++:load-toplevel (or load) controls whether and when evaluation ++occurs when eval-when appears as a top level form in ++code processed by compile-file. See File Compilation. ++

++

The use of the situation :execute (or eval) controls whether ++evaluation occurs for other eval-when forms; that is, ++those that are not top level forms, or those in code processed by ++eval or compile. If the :execute situation is ++specified in such a form, then the body forms are processed as ++an implicit progn; otherwise, the eval-when form ++returns nil. ++

++

eval-when ++normally appears as a top level form, but it is meaningful ++for it to appear as a non-top-level form. ++However, the compile-time side ++effects described in Compilation ++only take place when eval-when appears as a ++top level form. ++

++

Examples::

++ ++

One example of the use of eval-when is that for the ++compiler to be able to read a file properly when it uses user-defined ++reader macros, it is necessary to write ++

++
++
 (eval-when (:compile-toplevel :load-toplevel :execute)
++   (set-macro-character #\$ #'(lambda (stream char)
++                                (declare (ignore char))
++                                (list 'dollar (read stream))))) ⇒  T
++
++ ++

This causes the call to set-macro-character to be executed ++in the compiler’s execution environment, thereby modifying its ++reader syntax table. ++

++
++
;;;     The EVAL-WHEN in this case is not at toplevel, so only the :EXECUTE
++;;;     keyword is considered. At compile time, this has no effect.
++;;;     At load time (if the LET is at toplevel), or at execution time
++;;;     (if the LET is embedded in some other form which does not execute
++;;;     until later) this sets (SYMBOL-FUNCTION 'FOO1) to a function which
++;;;     returns 1.
++ (let ((x 1))
++   (eval-when (:execute :load-toplevel :compile-toplevel)
++     (setf (symbol-function 'foo1) #'(lambda () x))))
++
++;;;     If this expression occurs at the toplevel of a file to be compiled,
++;;;     it has BOTH a compile time AND a load-time effect of setting
++;;;     (SYMBOL-FUNCTION 'FOO2) to a function which returns 2.
++ (eval-when (:execute :load-toplevel :compile-toplevel)
++   (let ((x 2))
++     (eval-when (:execute :load-toplevel :compile-toplevel)
++       (setf (symbol-function 'foo2) #'(lambda () x)))))
++
++;;;     If this expression occurs at the toplevel of a file to be compiled,
++;;;     it has BOTH a compile time AND a load-time effect of setting the
++;;;     function cell of FOO3 to a function which returns 3.
++ (eval-when (:execute :load-toplevel :compile-toplevel)
++   (setf (symbol-function 'foo3) #'(lambda () 3)))
++
++;;; #4: This always does nothing. It simply returns NIL.
++ (eval-when (:compile-toplevel)
++   (eval-when (:compile-toplevel) 
++     (print 'foo4)))
++
++;;;     If this form occurs at toplevel of a file to be compiled, FOO5 is
++;;;     printed at compile time. If this form occurs in a non-top-level
++;;;     position, nothing is printed at compile time. Regardless of context,
++;;;     nothing is ever printed at load time or execution time.
++ (eval-when (:compile-toplevel) 
++   (eval-when (:execute)
++     (print 'foo5)))
++
++;;;     If this form occurs at toplevel of a file to be compiled, FOO6 is
++;;;     printed at compile time.  If this form occurs in a non-top-level
++;;;     position, nothing is printed at compile time. Regardless of context,
++;;;     nothing is ever printed at load time or execution time.
++ (eval-when (:execute :load-toplevel)
++   (eval-when (:compile-toplevel)
++     (print 'foo6)))
++
++ ++

See Also::

++ ++

compile-file ++, Compilation ++

++

Notes::

++ ++

The following effects are logical consequences of the definition of ++eval-when: ++

++
++
*
++

Execution of a single eval-when ++expression executes the body code at most once. ++

++
++
*
++

Macros intended for use in top level forms ++should be written so that side-effects are done by the forms ++in the macro expansion. The macro-expander itself should not do ++the side-effects. ++

++

For example: ++

++

Wrong: ++

++
++
 (defmacro foo ()
++   (really-foo)
++   `(really-foo))
++
++ ++

Right: ++

++
++
 (defmacro foo ()
++   `(eval-when (:compile-toplevel :execute :load-toplevel) (really-foo)))
++
++ ++

Adherence to this convention means that such macros behave ++intuitively when appearing as non-top-level forms. ++

++
++
*
++

Placing a variable binding around an eval-when reliably ++captures the binding because the compile-time-too mode cannot occur ++ (i.e., introducing a variable binding means that the eval-when ++ is not a top level form). ++For example, ++

++
++
 (let ((x 3))
++   (eval-when (:execute :load-toplevel :compile-toplevel) (print x)))
++
++ ++

prints 3 ++at execution (i.e., load) time, and does not print anything at ++compile time. This is important so that expansions of ++defun and ++defmacro ++can be done in terms of eval-when and can correctly capture ++the lexical environment. ++

++
++
 (defun bar (x) (defun foo () (+ x 3)))
++
++ ++

might expand into ++

++
++
 (defun bar (x) 
++   (progn (eval-when (:compile-toplevel) 
++            (compiler::notice-function-definition 'foo '(x)))
++          (eval-when (:execute :load-toplevel)
++            (setf (symbol-function 'foo) #'(lambda () (+ x 3))))))
++
++ ++

which would be treated by the above rules the same as ++

++
++
 (defun bar (x) 
++   (setf (symbol-function 'foo) #'(lambda () (+ x 3))))
++
++ ++

when the definition of bar is not a top level form. ++

++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/evenp.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++evenp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.30 evenp, oddp [Function]

++ ++

evenp integergeneralized-boolean ++

++

oddp integergeneralized-boolean ++

++

Arguments and Values::

++ ++

integer—an integer. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

evenp returns true if integer is even (divisible by two); ++otherwise, returns false. ++

++

oddp returns true if integer is odd (not divisible by two); ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (evenp 0) ⇒  true
++ (oddp 10000000000000000000000) ⇒  false
++ (oddp -1) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if integer is not an integer. ++

++

Notes::

++ ++
++
 (evenp integer) ≡ (not (oddp integer))
++ (oddp integer)  ≡ (not (evenp integer))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/every.html +@@ -0,0 +1,149 @@ ++ ++ ++ ++ ++ ++every (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.40 every, some, notevery, notany [Function]

++ ++

every predicate &rest sequences^+generalized-boolean ++

++

some predicate &rest sequences^+result ++

++

notevery predicate &rest sequences^+generalized-boolean ++

++

notany predicate &rest sequences^+generalized-boolean ++

++

Arguments and Values::

++ ++

predicate—a designator for a function of ++ as many arguments as there are sequences. ++

++

sequence—a sequence. ++

++

result—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

every, some, notevery, and notany ++test elements of sequences for satisfaction of a given predicate. ++The first argument to predicate is an element of the first sequence; ++each succeeding argument is an element of a succeeding sequence. ++

++

Predicate is first applied to the elements ++with index 0 in each of the sequences, and possibly then to ++the elements with index 1, and so on, until a termination ++criterion is met or the end of the shortest of the sequences is reached. ++

++

every returns false as soon ++as any invocation of predicate returns false. ++If the end of a sequence is reached, ++every returns true. ++Thus, every returns true if and only if ++every invocation of predicate returns true. ++

++

some returns the first non-nil value ++which is returned by an invocation of predicate. ++If the end of a sequence is reached without any invocation of the ++predicate returning true, some returns false. ++Thus, some returns true if and only if ++some invocation of predicate returns true. ++

++

notany returns false ++as soon as any invocation of predicate returns true. ++If the end of a sequence is reached, ++notany returns true. ++Thus, notany returns true if and only if ++it is not the case that any invocation of predicate returns true. ++

++

notevery returns true as soon as any invocation of ++predicate returns false. ++If the end of a sequence is reached, ++notevery returns false. ++Thus, notevery returns true if and only if ++it is not the case that every invocation of predicate returns true. ++

++

Examples::

++ ++
++
 (every #'characterp "abc") ⇒  true
++ (some #'= '(1 2 3 4 5) '(5 4 3 2 1)) ⇒  true
++ (notevery #'< '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) ⇒  false
++ (notany #'> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12)) ⇒  true 
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its first argument is neither a ++symbol nor a function or if any subsequent ++argument is not a proper sequence. ++

++

Other exceptional situations are possible, depending on the nature ++of the predicate. ++

++

See Also::

++ ++

and ++, ++or ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++
++
 (notany predicate {sequence}*) ≡ (not (some predicate {sequence}*))
++ (notevery predicate {sequence}*) ≡ (not (every predicate {sequence}*))
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/exp.html +@@ -0,0 +1,165 @@ ++ ++ ++ ++ ++ ++exp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.31 exp, expt [Function]

++ ++

exp numberresult ++

++

expt base-number power-numberresult ++

++

Arguments and Values::

++ ++

number—a number. ++

++

base-number—a number. ++

++

power-number—a number. ++

++

result—a number. ++

++

Description::

++ ++

exp and expt perform exponentiation. ++

++

exp returns e raised to the power number, ++where e is the base of the natural logarithms. ++exp has no branch cut. ++

++

expt returns base-number ++raised to the power power-number. ++If the base-number is a rational ++and power-number is ++an integer, ++the calculation is exact and the result will be of type rational; ++otherwise a floating-point approximation might result. ++

++

For expt of a complex rational to an integer power, ++the calculation must be exact and the result is ++of type (or rational (complex rational)). ++

++

The result of expt can be a complex, ++even when neither argument is a complex, ++if base-number is negative and power-number ++is not an integer. ++The result is always the principal complex value. ++For example, (expt -8 1/3) is not permitted to return -2, ++even though -2 is one of the cube roots of -8. ++The principal cube root is a complex ++approximately equal to #C(1.0 1.73205), not -2. ++

++

expt is defined ++as b^x = e^x log b\/. ++This defines the principal values precisely. The range of ++expt is the entire complex plane. Regarded ++as a function of x, with b fixed, there is no branch cut. ++Regarded as a function of b, with x fixed, there is in general ++a branch cut along the negative real axis, continuous with quadrant II. ++The domain excludes the origin. ++By definition, 0^0=1. If b=0 and the real part of x is strictly ++positive, then ++b^x=0. For all other values of x, 0^x ++is an error. ++

++

When power-number is an integer 0, ++then the result is always the value one in the type ++of base-number, ++even if the base-number is zero (of any type). That is: ++

++
++
 (expt x 0) ≡ (coerce 1 (type-of x))
++
++ ++

If power-number is a zero of any other type, ++then the result is also the value one, in the type of the arguments ++after the application of the contagion rules in Contagion in Numeric Operations, ++with one exception: ++the consequences are undefined if base-number is zero when power-number ++is zero and not of type integer. ++

++

Examples::

++ ++
++
 (exp 0) ⇒  1.0
++ (exp 1) ⇒  2.718282
++ (exp (log 5)) ⇒  5.0 
++ (expt 2 8) ⇒  256
++ (expt 4 .5) ⇒  2.0
++ (expt #c(0 1) 2) ⇒  -1
++ (expt #c(2 2) 3) ⇒  #C(-16 16)
++ (expt #c(2 2) 4) ⇒  -64 
++
++ ++

See Also::

++ ++

log ++, ++Rule of Float Substitutability ++

++

Notes::

++ ++

Implementations of expt are permitted to use different algorithms ++for the cases of a power-number of type rational ++ and a power-number of type float. ++

++

Note that by the following logic, ++(sqrt (expt x 3)) is not equivalent to ++(expt x 3/2). ++

++
++
 (setq x (exp (/ (* 2 pi #c(0 1)) 3)))         ;exp(2.pi.i/3)
++ (expt x 3) ⇒  1 ;except for round-off error
++ (sqrt (expt x 3)) ⇒  1 ;except for round-off error
++ (expt x 3/2) ⇒  -1 ;except for round-off error
++
++ ++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/export.html +@@ -0,0 +1,158 @@ ++ ++ ++ ++ ++ ++export (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.2 export [Function]

++ ++

export symbols &optional packaget ++

++

Arguments and Values::

++ ++

symbols—a designator for a list of symbols. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

Description::

++ ++

export makes one or more symbols that are accessible ++in package (whether directly or by inheritance) be external symbols ++of that package. ++

++

If any of the symbols is already accessible as ++an external symbol of package, ++export has no effect on that symbol. ++If the symbol is ++present in package ++as an internal symbol, it is simply changed to external status. ++If it is accessible as an internal symbol via use-package, ++it ++is first imported into package, ++then exported. ++(The symbol is then present in the package ++whether or not package continues to use the package through ++which the symbol was originally inherited.) ++

++

export makes ++each symbol ++accessible to all the packages that use package. ++All of these packages are checked for name conflicts: ++(export s p) does ++(find-symbol (symbol-name s) q) for each package q ++in (package-used-by-list p). Note that in the usual case of ++an export during the initial definition of a package, ++the ++result of package-used-by-list ++is nil and the name-conflict checking ++takes negligible time. ++When multiple changes are to be made, ++for example when export ++is given a list of symbols, it is ++permissible for the implementation to process each change separately, ++so that aborting from a name ++conflict caused by any but the first symbol in the ++list does not unexport the ++first symbol in the list. ++However, aborting from a name-conflict error ++caused by export ++of one of symbols does not leave that symbol ++accessible ++to some packages ++and inaccessible to others; with respect to ++each of symbols processed, export ++behaves as if it were as an atomic operation. ++

++

A name conflict in export between one of ++symbols being exported and a ++symbol already present in a package ++that would inherit the ++newly-exported symbol ++may be resolved in favor of the exported symbol ++by uninterning the other one, or in favor of the already-present ++symbol by making it a shadowing symbol. ++

++

Examples::

++ ++
++
 (make-package 'temp :use nil) ⇒  #<PACKAGE "TEMP">
++ (use-package 'temp) ⇒  T
++ (intern "TEMP-SYM" 'temp) ⇒  TEMP::TEMP-SYM, NIL
++ (find-symbol "TEMP-SYM") ⇒  NIL, NIL
++ (export (find-symbol "TEMP-SYM" 'temp) 'temp) ⇒  T
++ (find-symbol "TEMP-SYM") ⇒  TEMP-SYM, :INHERITED
++
++ ++

Side Effects::

++ ++

The package system is modified. ++

++

Affected By::

++ ++

Accessible symbols. ++

++

Exceptional Situations::

++ ++

If any of the symbols is not accessible at all in package, ++an error of type package-error is signaled that is correctable ++by permitting the user ++to interactively specify whether that symbol should be imported. ++

++

See Also::

++ ++

import ++, ++unexport ++, ++Package Concepts ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/extended_002dchar.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++extended-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.4 extended-char [Type]

++ ++

Supertypes::

++ ++

extended-char, ++character, ++t ++

++

Description::

++ ++

The type extended-char is equivalent to the type (and character (not base-char)). ++

++

Notes::

++ ++

The type extended-char might ++have no elements_4 ++in implementations in which all characters are of type base-char. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/fboundp.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++fboundp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.4 fboundp [Function]

++ ++

fboundp namegeneralized-boolean ++

++

Pronunciation::

++ ++

pronounced ,ef ’baund p\=e ++

++

Arguments and Values::

++ ++

name—a function name. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if name is fbound; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (fboundp 'car) ⇒  true
++ (fboundp 'nth-value) ⇒  false
++ (fboundp 'with-open-file) ⇒  true
++ (fboundp 'unwind-protect) ⇒  true
++ (defun my-function (x) x) ⇒  MY-FUNCTION
++ (fboundp 'my-function) ⇒  true
++ (let ((saved-definition (symbol-function 'my-function)))
++   (unwind-protect (progn (fmakunbound 'my-function)
++                          (fboundp 'my-function))
++     (setf (symbol-function 'my-function) saved-definition)))
++⇒  false
++ (fboundp 'my-function) ⇒  true
++ (defmacro my-macro (x) `',x) ⇒  MY-MACRO
++ (fboundp 'my-macro) ⇒  true
++ (fmakunbound 'my-function) ⇒  MY-FUNCTION
++ (fboundp 'my-function) ⇒  false
++ (flet ((my-function (x) x))
++   (fboundp 'my-function)) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if name is not a function name. ++

++

See Also::

++ ++

symbol-function ++, ++fmakunbound ++, ++fdefinition ++

++

Notes::

++ ++

It is permissible to call symbol-function on any symbol ++that is fbound. ++

++

fboundp is sometimes used to “guard” ++an access to the function cell, as in: ++

++
(if (fboundp x) (symbol-function x))
++
++ ++

Defining a setf expander F does not cause the setf function ++(setf F) to become defined. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/fdefinition.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++fdefinition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.3 fdefinition [Accessor]

++ ++

fdefinition function-namedefinition ++

++

(setf ( fdefinition function-name) new-definition)
++

++

Arguments and Values::

++ ++

function-name—a function name. ++

++

In the non-setf case, ++the name must be fbound in the global environment. ++

++

definition—Current global function definition named by function-name. ++

++

new-definition—a function. ++

++

Description::

++ ++

fdefinition accesses the current global function definition ++named by function-name. The definition may be a ++function or may be an object representing a ++special form or macro. ++

++

The value returned by fdefinition when fboundp returns true ++but the function-name denotes a macro or ++special form is not well-defined, but fdefinition does not signal an error. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if function-name is not a function name. ++

++

An error of type undefined-function is signaled ++in the non-setf case if function-name is not fbound. ++

++

See Also::

++ ++

fboundp ++, ++fmakunbound ++, ++macro-function ++, ++

++

special-operator-p ++, ++

++

symbol-function ++

++

Notes::

++ ++

fdefinition cannot access the value of a lexical function name ++produced by flet or labels; it can access only ++the global function value. ++

++

setf can be used with ++fdefinition to replace a global function ++definition when the function-name’s function definition ++does not represent a special form. ++

++

setf of fdefinition ++requires a function as the new value. ++It is an error to set the fdefinition of a function-name ++to a symbol, a list, or the value returned ++by fdefinition on the name of a macro ++or special form. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002dauthor.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++file-author (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.5 file-author [Function]

++ ++

file-author pathspecauthor ++

++

Arguments and Values::

++ ++

pathspec—a pathname designator. ++

++

author—a string or nil. ++

++

Description::

++ ++

Returns a string naming the author of the file specified by pathspec, ++or nil if the author’s name cannot be determined. ++

++

Examples::

++ ++
++
 (with-open-file (stream ">relativity>general.text")
++   (file-author s))
++⇒  "albert"
++
++ ++

Affected By::

++

The host computer’s file system. ++

++

Other users of the file named by pathspec. ++

Exceptional Situations::

++ ++

An error of type file-error is signaled if pathspec is wild. ++

++

An error of type file-error is signaled ++if the file system cannot perform the requested operation. ++

++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002derror.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++file-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.9 file-error [Condition Type]

++ ++

Class Precedence List::

++

file-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type file-error consists of error conditions that occur during ++an attempt to open or close a file, or during some low-level transactions ++with a file system. The “offending pathname” is initialized by ++the :pathname initialization argument to make-condition, and is accessed ++by the function file-error-pathname. ++

++

See Also::

++ ++

file-error-pathname, ++open ++, ++probe-file ++, ++directory ++, ++ensure-directories-exist ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002derror_002dpathname.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++file-error-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Files Dictionary  

++
++
++

20.2.10 file-error-pathname [Function]

++ ++

file-error-pathname conditionpathspec ++

++

Arguments and Values::

++ ++

condition—a condition of type file-error. ++

++

pathspec—a pathname designator. ++

++

Description::

++ ++

Returns the “offending pathname” of a condition of type file-error. ++

++

Exceptional Situations::

++ ++

See Also::

++ ++

file-error, ++Conditions ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002dlength.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++file-length (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.26 file-length [Function]

++ ++

file-length streamlength ++

++

Arguments and Values::

++ ++

stream—a stream associated with a file. ++

++

length—a non-negative integer or nil. ++

++

Description::

++ ++

file-length returns the length of stream, ++or nil if the length cannot be determined. ++

++

For a binary file, the length is measured in units of ++the element type of the stream. ++

++

Examples::

++ ++
++
 (with-open-file (s "decimal-digits.text" 
++                    :direction :output :if-exists :error)
++   (princ "0123456789" s)
++   (truename s))
++⇒  #P"A:>Joe>decimal-digits.text.1"
++ (with-open-file (s "decimal-digits.text")
++   (file-length s))
++⇒  10
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream associated with a file. ++

++

See Also::

++ ++

open ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002dposition.html +@@ -0,0 +1,169 @@ ++ ++ ++ ++ ++ ++file-position (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.27 file-position [Function]

++ ++

file-position streamposition ++

++

file-position stream position-specsuccess-p ++

++

Arguments and Values::

++ ++

stream—a stream. ++

++

position-spec—a file position designator. ++

++

position—a file position or nil. ++

++

success-p—a generalized boolean. ++

++

Description::

++ ++

Returns or changes the current position within a stream. ++

++

When position-spec is not supplied, ++file-position returns the current file position in the stream, ++or nil if this cannot be determined. ++

++

When position-spec is supplied, ++the file position in stream is set to that file position (if possible). ++file-position returns true ++if the repositioning is performed successfully, ++or false if it is not. ++

++

An integer returned by file-position of one argument ++should be acceptable as position-spec for use with the same file. ++

++

For a character file, ++performing a single read-char or write-char operation ++may cause the file position to be increased by more than 1 because of ++character-set translations (such as translating between the Common Lisp ++#\Newline character and an external ASCII ++carriage-return/line-feed sequence) and other aspects of the ++implementation. For a binary file, every read-byte ++or write-byte ++operation increases the file position by 1. ++

++

Examples::

++ ++
++
 (defun tester ()
++   (let ((noticed '()) file-written)
++     (flet ((notice (x) (push x noticed) x))
++       (with-open-file (s "test.bin" 
++                          :element-type '(unsigned-byte 8)
++                          :direction :output
++                          :if-exists :error)
++          (notice (file-position s)) ;1
++          (write-byte 5 s) 
++          (write-byte 6 s)
++          (let ((p (file-position s)))
++            (notice p) ;2
++            (notice (when p (file-position s (1- p))))) ;3
++          (write-byte 7 s)
++          (notice (file-position s)) ;4
++          (setq file-written (truename s)))
++        (with-open-file (s file-written
++                           :element-type '(unsigned-byte 8)
++                           :direction :input)
++          (notice (file-position s)) ;5
++          (let ((length (file-length s)))
++            (notice length) ;6
++            (when length
++              (dotimes (i length)
++                (notice (read-byte s)))))) ;7,...
++        (nreverse noticed))))
++⇒  tester
++ (tester)
++⇒  (0 2 T 2 0 2 5 7)
++OR⇒ (0 2 NIL 3 0 3 5 6 7)
++OR⇒ (NIL NIL NIL NIL NIL NIL)
++
++ ++

Side Effects::

++ ++

When the position-spec argument is supplied, ++the file position in the stream might be moved. ++

++

Affected By::

++ ++

The value returned by file-position increases monotonically ++as input or output operations are performed. ++

++

Exceptional Situations::

++ ++

If position-spec is supplied, but is too large or otherwise inappropriate, ++an error is signaled. ++

++

See Also::

++ ++

file-length ++, ++file-string-length ++, ++open ++

++

Notes::

++ ++

Implementations that have character files represented ++as a sequence of records of bounded size might choose to encode the ++file position as, for example, ++<<record-number>>*<<max-record-size>>+<<character-within-record>>. ++This is a valid encoding because it increases monotonically as ++each character is read or written, though not necessarily by 1 at ++each step. An integer might then be considered “inappropriate” ++as position-spec to file-position if, when decoded into ++record number and character number, it turned out that the ++supplied record was too short for the specified character number. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002dstream.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++file-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.5 file-stream [System Class]

++ ++

Class Precedence List::

++ ++

file-stream, ++stream, ++t ++

++

Description::

++ ++

An object of type file-stream is a stream the direct ++source or sink of which is a file. Such a stream is ++created explicitly by open and with-open-file, and ++implicitly by functions such as load that process files. ++

++

See Also::

++ ++

load ++, ++open ++, ++with-open-file ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002dstring_002dlength.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++file-string-length (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.28 file-string-length [Function]

++ ++

file-string-length stream objectlength ++

++

Arguments and Values::

++ ++

stream—an output character file stream. ++

++

object—a string or a character. ++

++

length—a non-negative integer, or nil. ++

++

Description::

++ ++

file-string-length returns the difference between what ++(file-position stream) would be after writing ++object and its current value, or nil if this cannot be determined. ++

++

The returned value corresponds to the current state of stream ++at the time of the call and might not be ++the same if it is called again ++when the state of the stream has changed. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/file_002dwrite_002ddate.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++file-write-date (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.6 file-write-date [Function]

++ ++

file-write-date pathspecdate ++

++

Arguments and Values::

++ ++

pathspec—a pathname designator. ++

++

date—a universal time or nil. ++

++

Description::

++ ++

Returns a universal time representing the time at which the file ++specified by pathspec was last written (or created), ++or returns nil if such a time cannot be determined. ++

++

Examples::

++ ++
++
 (with-open-file (s "noel.text" 
++                    :direction :output :if-exists :error)
++   (format s "~&Dear Santa,~2
++                Please leave lots of toys.~2
++             ~2
++   (truename s))
++⇒  #P"CUPID:/susan/noel.text"
++ (with-open-file (s "noel.text")
++   (file-write-date s))
++⇒  2902600800
++
++ ++

Affected By::

++ ++

The host computer’s file system. ++

++

Exceptional Situations::

++ ++

An error of type file-error is signaled if pathspec is wild. ++

++

An error of type file-error is signaled ++if the file system cannot perform the requested operation. ++

++

See Also::

++ ++

Universal Time, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/fill.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++fill (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.4 fill [Function]

++ ++

fill sequence item &key start endsequence ++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

item—a sequence. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

Description::

++ ++

Replaces the elements of sequence ++bounded by start and end ++with item. ++

++

Examples::

++ ++
++
 (fill (list 0 1 2 3 4 5) '(444)) ⇒  ((444) (444) (444) (444) (444) (444))
++ (fill (copy-seq "01234") #\e :start 3) ⇒  "012ee"
++ (setq x (vector 'a 'b 'c 'd 'e)) ⇒  #(A B C D E)
++ (fill x 'z :start 1 :end 3) ⇒  #(A Z Z D E)
++ x ⇒  #(A Z Z D E)
++ (fill x 'p) ⇒  #(P P P P P)
++ x ⇒  #(P P P P P)
++
++ ++

Side Effects::

++ ++

Sequence is destructively modified. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++Should signal an error of type type-error ++ if start is not a non-negative integer. ++Should signal an error of type type-error ++ if end is not a non-negative integer or nil. ++

++

See Also::

++ ++

replace ++, nsubstitute ++

++

Notes::

++ ++

(fill sequence item) ≡ ++ (nsubstitute-if item (constantly t) sequence) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/fill_002dpointer.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++fill-pointer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.21 fill-pointer [Accessor]

++ ++

fill-pointer vectorfill-pointer ++

++

(setf ( fill-pointer vector) new-fill-pointer)
++

++

Arguments and Values::

++ ++

vector—a vector with a fill pointer. ++

++

fill-pointer, new-fill-pointer—a valid fill pointer ++ for the vector. ++

++

Description::

++ ++

Accesses the fill pointer of vector. ++

++

Examples::

++ ++
++
 (setq a (make-array 8 :fill-pointer 4)) ⇒  #(NIL NIL NIL NIL)
++ (fill-pointer a) ⇒  4
++ (dotimes (i (length a)) (setf (aref a i) (* i i))) ⇒  NIL
++ a ⇒  #(0 1 4 9)
++ (setf (fill-pointer a) 3) ⇒  3
++ (fill-pointer a) ⇒  3
++ a ⇒  #(0 1 4)
++ (setf (fill-pointer a) 8) ⇒  8
++ a ⇒  #(0 1 4 9 NIL NIL NIL NIL)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if vector is not a vector with a fill pointer. ++

++

See Also::

++ ++

make-array ++, ++length ++

++

Notes::

++ ++

There is no operator that will remove a vector’s fill pointer. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++find (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.14 find, find-if, find-if-not [Function]

++ ++

find item sequence &key from-end test test-not start end keyelement ++

++

find-if predicate sequence &key from-end start end keyelement ++

++

find-if-not predicate sequence &key from-end start end keyelement ++

++

Arguments and Values::

++ ++

item—an object. ++

++

sequence—a proper sequence. ++

++

predicate—a designator for a function of one argument ++ that returns a generalized boolean. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

element—an element of the sequence, or nil. ++

++

Description::

++ ++

find, find-if, and find-if-not ++each search for an element of the sequence ++bounded by start and end ++ that satisfies the predicate predicate ++or that satisfies the test test or test-not, ++as appropriate. ++

++

If from-end is true, ++then the result is the rightmost element that satisfies the test. ++

++

If the sequence contains an element that satisfies the test, ++then the leftmost or rightmost sequence element, ++depending on from-end, ++is returned; ++otherwise nil is returned. ++

++

Examples::

++ ++
++
 (find #\d "here are some letters that can be looked at" :test #'char>)
++⇒  #\Space 
++ (find-if #'oddp '(1 2 3 4 5) :end 3 :from-end t) ⇒  3
++ (find-if-not #'complexp                                    
++             '#(3.5 2 #C(1.0 0.0) #C(0.0 1.0))
++             :start 2) ⇒  NIL 
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

position ++, ++Rules about Test Functions, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++

The function find-if-not is deprecated. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find_002dall_002dsymbols.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++find-all-symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.5 find-all-symbols [Function]

++ ++

find-all-symbols stringsymbols ++

++

Arguments and Values::

++ ++

string—a string designator. ++

++

symbols—a list of symbols. ++

++

Description::

++ ++

find-all-symbols searches ++ every registered package ++ for symbols that have a ++name that is the same (under string=) as ++string. A list of all such symbols is returned. ++Whether or how the list is ordered is ++implementation-dependent. ++

++

Examples::

++ ++
++
 (find-all-symbols 'car)
++⇒  (CAR)
++OR⇒ (CAR VEHICLES:CAR)
++OR⇒ (VEHICLES:CAR CAR)
++ (intern "CAR" (make-package 'temp :use nil)) ⇒  TEMP::CAR, NIL
++ (find-all-symbols 'car)
++⇒  (TEMP::CAR CAR)
++OR⇒ (CAR TEMP::CAR)
++OR⇒ (TEMP::CAR CAR VEHICLES:CAR)
++OR⇒ (CAR TEMP::CAR VEHICLES:CAR)
++
++ ++

See Also::

++ ++

find-symbol ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find_002dclass.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++find-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.28 find-class [Accessor]

++ ++

find-class symbol &optional errorp environmentclass ++

++

(setf ( find-class symbol &optional errorp environment) new-class)
++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

errorp—a generalized boolean. ++ The default is true. ++

++

environment – same as the &environment argument to ++ macro expansion functions and is used to distinguish between ++ compile-time and run-time environments. ++

++

The &environment argument has ++ dynamic extent; the consequences are undefined if ++ the &environment argument is ++ referred to outside the dynamic extent ++ of the macro expansion function. ++

++

class—a class object, or nil. ++

++

Description::

++ ++

Returns the class object named by the symbol ++in the environment. If there is no such class, ++nil is returned if errorp is false; otherwise, ++if errorp is true, an error is signaled. ++

++

The class associated with a particular symbol can be changed by using ++setf with find-class; ++

++

or, if the new class given to setf is nil, ++the class association is removed ++(but the class object itself is not affected). ++

++

The results are undefined if the user attempts to change ++

++

or remove ++

++

the class associated with a ++symbol that is defined as a type specifier in this standard. ++See Integrating Types and Classes. ++

++

When using setf of find-class, any errorp argument is evaluated ++for effect, but any values it returns are ignored; the errorp ++parameter is permitted primarily so that the environment parameter ++can be used. ++

++

The environment might be used to distinguish between a compile-time and a ++run-time environment. ++

++

Exceptional Situations::

++ ++

If there is no such class and errorp is true, ++find-class signals an error of type error. ++

++

See Also::

++ ++

defmacro ++, ++Integrating Types and Classes ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find_002dmethod.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++find-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.34 find-method [Standard Generic Function]

++ ++

Syntax::

++ ++

find-method generic-function method-qualifiers specializers &optional errorp
++ ⇒ method ++

++

Method Signatures::

++ ++

find-method (generic-function standard-generic-function) ++ method-qualifiers specializers &optional errorp ++

++

Arguments and Values::

++ ++

generic-function—a generic function. ++

++

method-qualifiers—a list. ++

++

specializers—a list. ++

++

errorp—a generalized boolean. ++ The default is true. ++

++

method—a method object, or nil. ++

++

Description::

++ ++

The generic function find-method takes a generic function ++and returns the method object that agrees on qualifiers ++and parameter specializers with the method-qualifiers and ++specializers arguments of find-method. ++Method-qualifiers contains the ++method qualifiers for the method. ++The order of the method qualifiers ++is significant. ++For a definition of agreement in this context, ++see Agreement on Parameter Specializers and Qualifiers. ++

++

The specializers argument contains the parameter ++specializers for the method. It must correspond in length to ++the number of required arguments of the generic function, or ++an error is signaled. This means that to obtain the ++default method on a given generic-function, ++a list whose elements are the class t must be given. ++

++

If there is no such method and errorp is true, ++find-method signals an error. ++If there is no such method and errorp is false, ++find-method returns nil. ++

++

Examples::

++ ++
++
 (defmethod some-operation ((a integer) (b float)) (list a b))
++⇒  #<STANDARD-METHOD SOME-OPERATION (INTEGER FLOAT) 26723357>
++ (find-method #'some-operation '() (mapcar #'find-class '(integer float)))
++⇒  #<STANDARD-METHOD SOME-OPERATION (INTEGER FLOAT) 26723357>
++ (find-method #'some-operation '() (mapcar #'find-class '(integer integer)))
++ |>  Error: No matching method
++ (find-method #'some-operation '() (mapcar #'find-class '(integer integer)) nil)
++⇒  NIL
++
++ ++

Affected By::

++ ++

add-method, ++defclass, ++defgeneric, ++defmethod ++

++

Exceptional Situations::

++ ++

If the specializers argument does not correspond in length to ++the number of required arguments of the generic-function, an ++an error of type error is signaled. ++

++

If there is no such method and errorp is true, ++find-method signals an error of type error. ++

++

See Also::

++ ++

Agreement on Parameter Specializers and Qualifiers ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find_002dpackage.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++find-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.4 find-package [Function]

++ ++

find-package namepackage ++

++

Arguments and Values::

++ ++

name—a string designator or a package object. ++

++

package—a package object or nil. ++

++

Description::

++ ++

If name is a string designator, ++find-package locates and returns the ++package whose name or nickname is name. ++This ++search is case sensitive. ++If there is no such package, ++find-package returns nil. ++

++

If name is a package object, ++that package object is returned. ++

++

Examples::

++ ++
++
 (find-package 'common-lisp) ⇒  #<PACKAGE "COMMON-LISP">
++ (find-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (find-package 'not-there) ⇒  NIL
++
++ ++

Affected By::

++ ++

The set of packages created by the implementation. ++

++

defpackage, ++delete-package, ++make-package, ++rename-package ++

++

See Also::

++ ++

make-package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find_002drestart.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++find-restart (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.33 find-restart [Function]

++ ++

find-restart identifier &optional condition ++ restart ++

++

Arguments and Values::

++ ++

identifier—a non-nil symbol, or a restart. ++

++

condition—a condition object, or nil. ++

++

restart—a restart or nil. ++

++

Description::

++ ++

find-restart searches for a particular restart in the ++current dynamic environment. ++

++

When condition is non-nil, only those restarts ++are considered that are either explicitly associated with that condition, ++or not associated with any condition; that is, the excluded restarts ++are those that are associated with a non-empty set of conditions of ++which the given condition is not an element. ++If condition is nil, all restarts are considered. ++

++

If identifier is a symbol, then the innermost ++(most recently established) applicable restart with that name is returned. ++nil is returned if no such restart is found. ++

++

If identifier is a currently active restart, then it is returned. ++Otherwise, nil is returned. ++

++

Examples::

++ ++
++
 (restart-case
++     (let ((r (find-restart 'my-restart)))
++       (format t "~S is named ~S" r (restart-name r)))
++   (my-restart () nil))
++ |>  #<RESTART 32307325> is named MY-RESTART
++⇒  NIL
++ (find-restart 'my-restart)
++⇒  NIL
++
++ ++

Affected By::

++ ++

Existing restarts. ++

++

restart-case, restart-bind, with-condition-restarts. ++

++

See Also::

++ ++

compute-restarts ++

++

Notes::

++ ++
++
 (find-restart identifier)
++ ≡ (find identifier (compute-restarts) :key :restart-name)
++
++ ++

Although anonymous restarts have a name of nil, ++the consequences are unspecified if nil is given as an identifier. ++Occasionally, programmers lament that nil is not permissible as an ++identifier argument. In most such cases, compute-restarts ++can probably be used to simulate the desired effect. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/find_002dsymbol.html +@@ -0,0 +1,147 @@ ++ ++ ++ ++ ++ ++find-symbol (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.3 find-symbol [Function]

++ ++

find-symbol string &optional packagesymbol, status ++

++

Arguments and Values::

++ ++

string—a string. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

symbol—a symbol accessible in the package, ++ or nil. ++

++

status—one of :inherited, :external, :internal, or nil. ++

++

Description::

++ ++

find-symbol locates a symbol whose name is ++string in a package. ++If a symbol named string is found in package, ++directly or by inheritance, the symbol ++found is returned as the first ++value; the second value is as follows: ++

++
++
:internal
++

If the symbol is present in package ++as an internal symbol. ++

++
++
:external
++

If the symbol is present in package ++as an external symbol. ++

++
++
:inherited
++

If the symbol is inherited by package ++through use-package, ++but is not present in package. ++

++
++
++ ++

If no such symbol is accessible in package, ++both values are nil. ++

++

Examples::

++ ++
++
 (find-symbol "NEVER-BEFORE-USED") ⇒  NIL, NIL
++ (find-symbol "NEVER-BEFORE-USED") ⇒  NIL, NIL
++ (intern "NEVER-BEFORE-USED") ⇒  NEVER-BEFORE-USED, NIL
++ (intern "NEVER-BEFORE-USED") ⇒  NEVER-BEFORE-USED, :INTERNAL
++ (find-symbol "NEVER-BEFORE-USED") ⇒  NEVER-BEFORE-USED, :INTERNAL
++ (find-symbol "never-before-used") ⇒  NIL, NIL
++ (find-symbol "CAR" 'common-lisp-user) ⇒  CAR, :INHERITED
++ (find-symbol "CAR" 'common-lisp) ⇒  CAR, :EXTERNAL
++ (find-symbol "NIL" 'common-lisp-user) ⇒  NIL, :INHERITED
++ (find-symbol "NIL" 'common-lisp) ⇒  NIL, :EXTERNAL
++ (find-symbol "NIL" (prog1 (make-package "JUST-TESTING" :use '())
++                           (intern "NIL" "JUST-TESTING")))
++⇒  JUST-TESTING::NIL, :INTERNAL
++ (export 'just-testing::nil 'just-testing)
++ (find-symbol "NIL" 'just-testing) ⇒  JUST-TESTING:NIL, :EXTERNAL
++ (find-symbol "NIL" "KEYWORD")
++⇒  NIL, NIL
++OR⇒ :NIL, :EXTERNAL
++ (find-symbol (symbol-name :nil) "KEYWORD") ⇒  :NIL, :EXTERNAL
++
++ ++

Affected By::

++ ++

intern, ++import, ++export, ++use-package, ++unintern, ++unexport, ++unuse-package ++

++

See Also::

++ ++

intern ++, ++find-all-symbols ++

++

Notes::

++ ++

find-symbol is operationally equivalent to intern, ++except that it never creates a new symbol. ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/finish_002doutput.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++finish-output (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.36 finish-output, force-output, clear-output [Function]

++ ++

finish-output &optional output-streamnil ++

++

force-output &optional output-streamnil ++

++

clear-output &optional output-streamnil ++

++

Arguments and Values::

++ ++

output-stream—an output stream designator. ++ The default is standard output. ++

++

Description::

++ ++

finish-output, force-output, and clear-output ++exercise control over the internal handling of buffered stream output. ++

++

finish-output attempts to ensure that any buffered output ++sent to output-stream has reached its destination, and then returns. ++

++

force-output initiates the emptying of any ++internal buffers but does not wait for completion ++or acknowledgment to return. ++

++

clear-output attempts to abort any ++outstanding output operation in progress in order ++to allow as little output as possible ++to continue to the destination. ++

++

If any of these operations does not make sense for output-stream, ++then it does nothing. ++The precise actions of these functions are implementation-dependent. ++

++

Examples::

++
++
;; Implementation A
++ (progn (princ "am i seen?") (clear-output))
++⇒  NIL
++
++;; Implementation B
++ (progn (princ "am i seen?") (clear-output))
++ |>  am i seen?
++⇒  NIL
++
++ ++

Affected By::

++ ++

*standard-output* ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if output-stream is not a stream designator. ++

++

See Also::

++ ++

clear-input ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/first.html +@@ -0,0 +1,168 @@ ++ ++ ++ ++ ++ ++first (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.21 first, second, third, fourth, fifth,

++

sixth, seventh, eighth, ninth, tenth

++

[Accessor] ++

++

first listobject ++(setf (first list) new-object)
++

++

second listobject ++(setf (second list) new-object)
++

++

third listobject ++(setf (third list) new-object)
++

++

fourth listobject ++(setf (fourth list) new-object)
++

++

fifth listobject ++(setf (fifth list) new-object)
++

++

sixth listobject ++(setf (sixth list) new-object)
++

++

seventh listobject ++(setf (seventh list) new-object)
++

++

eighth listobject ++(setf (eighth list) new-object)
++

++

ninth listobject ++(setf (ninth list) new-object)
++

++

tenth listobject ++(setf (tenth list) new-object)
++

++

Arguments and Values::

++ ++

list—a list, ++

++

which might be a dotted list or a circular list. ++

++

object, new-object—an object. ++

++

Description::

++ ++

The functions ++first, ++second, ++third, ++fourth, ++fifth, ++sixth, ++seventh, ++eighth, ++ninth, ++and ++tenth ++access the first, second, third, fourth, fifth, sixth, seventh, eighth, ++ninth, and tenth elements of list, respectively. ++Specifically, ++

++
++
 (first list)    ≡  (car list)
++ (second list)   ≡  (car (cdr list))
++ (third list)    ≡  (car (cddr list))
++ (fourth list)   ≡  (car (cdddr list))
++ (fifth list)    ≡  (car (cddddr list))
++ (sixth list)    ≡  (car (cdr (cddddr list)))
++ (seventh list)  ≡  (car (cddr (cddddr list)))
++ (eighth list)   ≡  (car (cdddr (cddddr list)))
++ (ninth list)    ≡  (car (cddddr (cddddr list)))
++ (tenth list)    ≡  (car (cdr (cddddr (cddddr list))))
++
++ ++

setf can also be used with any of these functions to change an ++existing component. The same equivalences apply. For example: ++

++
++
 (setf (fifth list) new-object) ≡ (setf (car (cddddr list)) new-object)
++
++ ++

Examples::

++ ++
++
 (setq lst '(1 2 3 (4 5 6) ((V)) vi 7 8 9 10)) 
++⇒  (1 2 3 (4 5 6) ((V)) VI 7 8 9 10)
++ (first lst) ⇒  1
++ (tenth lst) ⇒  10
++ (fifth lst) ⇒  ((V))
++ (second (fourth lst)) ⇒  5
++ (sixth '(1 2 3)) ⇒  NIL
++ (setf (fourth lst) "four") ⇒  "four"
++ lst ⇒  (1 2 3 "four" ((V)) VI 7 8 9 10)
++
++ ++

See Also::

++ ++

car ++, ++nth ++

++

Notes::

++ ++

first is functionally equivalent to car, ++second is functionally equivalent to cadr, ++third is functionally equivalent to caddr, and ++fourth is functionally equivalent to cadddr. ++

++

The ordinal numbering used here is one-origin, ++as opposed to the zero-origin numbering used by nth: ++

++
++
 (fifth x) ≡ (nth 4 x)
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/fixnum.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++fixnum (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.13 fixnum [Type]

++ ++

Supertypes::

++ ++

fixnum, ++integer, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

A fixnum is an integer whose value is between ++most-negative-fixnum and most-positive-fixnum inclusive. ++Exactly which integers are fixnums is ++implementation-defined. ++

++

The type fixnum is required to be a supertype of ++(signed-byte 16). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/flet.html +@@ -0,0 +1,317 @@ ++ ++ ++ ++ ++ ++flet (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.6 flet, labels, macrolet [Special Operator]

++ ++

flet ({(function-name ++ lambda-list ++ [[{local-declaration}* ++ | local-documentation]] ++ {local-form}*)}*) ++ {declaration}* {form}*
++ ⇒ {result}* ++

++

labels ({(function-name ++ lambda-list ++ [[{local-declaration}* ++ | local-documentation]] ++ {local-form}*)}*) ++ {declaration}* {form}*
++ ⇒ {result}* ++

++

macrolet ({(name ++ lambda-list ++ [[{local-declaration}* ++ | local-documentation]] ++ {local-form}*)}*) ++ {declaration}* {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

function-name—a function name. ++

++

name—a symbol. ++

++

lambda-list—a lambda list; ++ for flet and labels, ++ it is an ordinary lambda list; ++ for macrolet, ++ it is a macro lambda list. ++

++

local-declaration—a declare expression; not evaluated. ++

++

declaration—a declare expression; not evaluated. ++

++

local-documentation—a string; not evaluated. ++

++

local-forms, forms—an implicit progn. ++

++

results—the values of the forms. ++

++

Description::

++ ++

flet, labels, and macrolet ++define local functions and macros, and execute ++forms using the local definitions. ++Forms are executed in order of occurrence. ++

++

The body forms (but not the lambda list) ++

++

of each function created by flet and labels ++and each macro created by macrolet ++are enclosed in an implicit block whose name ++is the function block name of the function-name or name, ++as appropriate. ++

++

The scope of the declarations ++between ++the list of local function/macro definitions and the body forms ++in flet and labels ++does not include the bodies of the ++locally defined functions, except that for labels, ++any inline, notinline, or ftype declarations ++that refer to the locally defined functions do apply to the local function ++bodies. That is, their scope ++is the same as the function name that they ++affect. ++

++

The scope of these declarations ++does not include the bodies of the macro expander ++functions defined by macrolet. ++

++
++
flet
++

flet defines locally named functions and executes a series of ++forms with these definition bindings. Any number of ++such local functions can be defined. ++

++

The scope of the name binding encompasses only the body. ++Within the ++body of flet, ++function-names matching those defined ++by flet ++refer to the locally defined functions ++rather than to ++the global function definitions of the same name. ++

++

Also, within the scope of flet, ++global setf expander definitions of the function-name ++defined by flet do not apply. ++Note that this applies to ++(defsetf f ...), not ++(defmethod (setf f) ...). ++

++

The names of functions defined by flet ++are in the lexical environment; they retain ++their local definitions only within the body of flet. ++The function definition bindings are visible only in ++the body of flet, not the definitions themselves. Within the ++function definitions, local function names ++that match those being ++defined refer to functions or ++macros defined outside the flet. ++flet can locally shadow a global function name, ++and the new definition can refer to the global definition. ++

++

Any local-documentation is attached to the corresponding local function ++(if one is actually created) as a documentation string. ++

++
++
labels
++

labels is equivalent to flet except that ++the scope of the defined function names for labels ++encompasses the function definitions themselves as well as the body. ++

++
++
macrolet
++

macrolet ++establishes local macro definitions, ++using the same format used by defmacro. ++

++

Within the body of macrolet, ++global setf expander definitions of the names defined by the ++macrolet do not apply; rather, setf expands the ++macro form and recursively process the resulting form. ++

++

The macro-expansion functions defined by macrolet ++are defined in the ++

++

lexical environment in which the macrolet form appears. ++Declarations and macrolet and ++symbol-macrolet definitions ++affect the local macro definitions in a macrolet, but the ++consequences are undefined if the local macro definitions reference ++any local variable or function bindings that are visible in that ++lexical environment. ++

++

Any local-documentation is attached to the corresponding local macro function ++as a documentation string. ++

++
++
++ ++

Examples::

++ ++
++
 (defun foo (x flag)
++   (macrolet ((fudge (z)
++                 ;The parameters x and flag are not accessible
++                 ; at this point; a reference to flag would be to
++                 ; the global variable of that name.
++                 ` (if flag (* ,z ,z) ,z)))
++    ;The parameters x and flag are accessible here.
++     (+ x
++        (fudge x)
++        (fudge (+ x 1)))))
++ ≡
++ (defun foo (x flag)
++   (+ x
++      (if flag (* x x) x)
++      (if flag (* (+ x 1) (+ x 1)) (+ x 1))))
++
++ ++

after macro expansion. The occurrences of x and flag legitimately ++refer to the parameters of the function foo because those parameters are ++visible at the site of the macro call which produced the expansion. ++

++
++
 (flet ((flet1 (n) (+ n n)))
++    (flet ((flet1 (n) (+ 2 (flet1 n))))
++      (flet1 2))) ⇒  6
++
++ (defun dummy-function () 'top-level) ⇒  DUMMY-FUNCTION 
++ (funcall #'dummy-function) ⇒  TOP-LEVEL 
++ (flet ((dummy-function () 'shadow)) 
++      (funcall #'dummy-function)) ⇒  SHADOW 
++ (eq (funcall #'dummy-function) (funcall 'dummy-function))
++⇒  true 
++ (flet ((dummy-function () 'shadow))
++   (eq (funcall #'dummy-function)
++       (funcall 'dummy-function)))
++⇒  false 
++
++ (defun recursive-times (k n)
++   (labels ((temp (n) 
++              (if (zerop n) 0 (+ k (temp (1- n))))))
++     (temp n))) ⇒  RECURSIVE-TIMES
++ (recursive-times 2 3) ⇒  6
++
++ (defmacro mlets (x &environment env) 
++    (let ((form `(babbit ,x)))
++      (macroexpand form env))) ⇒  MLETS
++ (macrolet ((babbit (z) `(+ ,z ,z))) (mlets 5)) ⇒  10
++
++ ++
++
 (flet ((safesqrt (x) (sqrt (abs x))))
++  ;; The safesqrt function is used in two places.
++   (safesqrt (apply #'+ (map 'list #'safesqrt '(1 2 3 4 5 6)))))
++⇒  3.291173
++
++ ++
++
 (defun integer-power (n k)     
++   (declare (integer n))         
++   (declare (type (integer 0 *) k))
++   (labels ((expt0 (x k a)
++              (declare (integer x a) (type (integer 0 *) k))
++              (cond ((zerop k) a)
++                    ((evenp k) (expt1 (* x x) (floor k 2) a))
++                    (t (expt0 (* x x) (floor k 2) (* x a)))))
++            (expt1 (x k a)
++              (declare (integer x a) (type (integer 0 *) k))
++              (cond ((evenp k) (expt1 (* x x) (floor k 2) a))
++                    (t (expt0 (* x x) (floor k 2) (* x a))))))
++    (expt0 n k 1))) ⇒  INTEGER-POWER
++
++ ++
++
 (defun example (y l)
++   (flet ((attach (x)
++            (setq l (append l (list x)))))
++     (declare (inline attach))
++     (dolist (x y)
++       (unless (null (cdr x))
++         (attach x)))
++     l))
++
++ (example '((a apple apricot) (b banana) (c cherry) (d) (e))
++          '((1) (2) (3) (4 2) (5) (6 3 2)))
++⇒  ((1) (2) (3) (4 2) (5) (6 3 2) (A APPLE APRICOT) (B BANANA) (C CHERRY))
++
++ ++

See Also::

++ ++

declare, ++defmacro ++, ++defun ++, ++documentation ++, ++let ++, ++Evaluation, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++ ++

It is not possible to define recursive functions with flet. ++labels can be used to define mutually recursive functions. ++

++

If a macrolet form is a top level form, ++the body forms are also processed as top level forms. ++See File Compilation. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/float-_0028System-Class_0029.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++float (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.4 float [System Class]

++ ++

Class Precedence List::

++

float, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

A float ++is a mathematical rational (but not a Common Lisp rational) ++of the form ++s\cdot f\cdot b^e-p, ++where s is +1 or -1, the sign; ++b is an integer ++greater than~1, the base or radix of the representation; ++p is a positive integer, ++the precision (in base-b digits) of the float; ++f is a positive integer ++between b^p-1 and ++b^p-1 (inclusive), the significand; ++and e is an integer, the exponent. ++The value of p and the range of~e ++depends on the implementation and on the type of float ++within that implementation. In addition, there is a floating-point zero; ++depending on the implementation, there can also be a “minus zero”. If there ++is no minus zero, then 0.0 and~-0.0 are both interpreted as simply a ++floating-point zero. ++(= 0.0 -0.0) is always true. ++If there is a minus zero, (eql -0.0 0.0) is false, ++otherwise it is true. ++

++

[Reviewer Note by Barmar: What about IEEE NaNs and infinities?] ++

++

[Reviewer Note by RWK: In the following, what is the “ordering”? precision? range? ++ Can there be additional subtypes of float or does “others” in the ++ list of four?] ++

++

The types short-float, single-float, double-float, ++and long-float are subtypes of type float. Any two of them must be ++either disjoint types or the same type; ++if the same type, then any other types between them in the ++above ordering must also be the same type. For example, ++if the type single-float and the type long-float are the same type, ++then the type double-float must be the same type also. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(float{[lower-limit [upper-limit]]}) ++

++

Compound Type Specifier Arguments::

++ ++

lower-limit, upper-limitinterval designators ++ for type float. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the floats on the interval described by ++lower-limit and upper-limit. ++

++

See Also::

++ ++

Figure~2–9, ++Constructing Numbers from Tokens, ++Printing Floats ++

++

Notes::

++ ++

Note that all mathematical integers are representable not only as ++Common Lisp reals, but also as complex floats. For example, ++possible representations of the mathematical number 1 ++include the integer 1, ++ the float 1.0, ++ or the complex #C(1.0 0.0). ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/float.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++float (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.74 float [Function]

++ ++

float number &optional prototypefloat ++

++

Arguments and Values::

++ ++

number—a real. ++

++

prototype—a float. ++

++

float—a float. ++

++

Description::

++ ++

float converts a ++

++

real ++

++

number to a float. ++

++

If a prototype is supplied, ++a float is returned that is mathematically equal to number ++but has the same format as prototype. ++

++

If prototype is not supplied, ++then if the number is already a float, it is returned; ++otherwise, a float is returned that is mathematically equal to number ++but is a single float. ++

++

Examples::

++ ++
++
 (float 0) ⇒  0.0
++ (float 1 .5) ⇒  1.0
++ (float 1.0) ⇒  1.0
++ (float 1/2) ⇒  0.5
++⇒  1.0d0
++OR⇒ 1.0
++ (eql (float 1.0 1.0d0) 1.0d0) ⇒  true
++
++ ++

See Also::

++ ++

coerce ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/floating_002dpoint_002dinexact.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++floating-point-inexact (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.82 floating-point-inexact [Condition Type]

++ ++

Class Precedence List::

++

floating-point-inexact, ++arithmetic-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type floating-point-inexact consists of ++error conditions that occur because of certain ++floating point traps. ++

++

It is implementation-dependent whether floating point traps ++occur, and whether or how they may be enabled or disabled. Therefore, ++conforming code may establish handlers for this condition, but must not ++depend on its being signaled. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/floating_002dpoint_002dinvalid_002doperation.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++floating-point-invalid-operation (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.81 floating-point-invalid-operation [Condition Type]

++ ++

Class Precedence List::

++

floating-point-invalid-operation, ++arithmetic-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type floating-point-invalid-operation consists of ++error conditions that occur because of certain ++floating point traps. ++

++

It is implementation-dependent whether floating point traps ++occur, and whether or how they may be enabled or disabled. Therefore, ++conforming code may establish handlers for this condition, but must not ++depend on its being signaled. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/floating_002dpoint_002doverflow.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++floating-point-overflow (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.83 floating-point-overflow [Condition Type]

++ ++

Class Precedence List::

++

floating-point-overflow, ++arithmetic-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type floating-point-overflow consists of error ++conditions that occur because of floating-point overflow. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/floating_002dpoint_002dunderflow.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++floating-point-underflow (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Numbers Dictionary  

++
++
++

12.2.84 floating-point-underflow [Condition Type]

++ ++

Class Precedence List::

++

floating-point-underflow, ++arithmetic-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type floating-point-underflow consists of ++error conditions that occur because of floating-point underflow. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/floatp.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++floatp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.75 floatp [Function]

++ ++

floatp object ++ generalized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type float; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (floatp 1.2d2) ⇒  true
++ (floatp 1.212) ⇒  true
++ (floatp 1.2s2) ⇒  true
++ (floatp (expt 2 130)) ⇒  false
++
++ ++

Notes::

++ ++
++
 (floatp object) ≡ (typep object 'float)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/floor.html +@@ -0,0 +1,205 @@ ++ ++ ++ ++ ++ ++floor (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.19 floor, ffloor, ceiling, fceiling,

++

truncate, ftruncate, round, fround

++

[Function] ++

++

floor number &optional divisorquotient, remainder ++

++

ffloor number &optional divisorquotient, remainder ++

++

ceiling number &optional divisorquotient, remainder ++

++

fceiling number &optional divisorquotient, remainder ++

++

truncate number &optional divisorquotient, remainder ++

++

ftruncate number &optional divisorquotient, remainder ++

++

round number &optional divisorquotient, remainder ++

++

fround number &optional divisorquotient, remainder ++

++

Arguments and Values::

++ ++

number—a real. ++

++

divisor—a non-zero real. ++ The default is the integer 1. ++

++

quotient—for floor, ceiling, ++ truncate, and round: an integer; ++ for ffloor, fceiling, ++ ftruncate, and fround: a float. ++

++

remainder—a real. ++

++

Description::

++ ++

These functions divide number by divisor, ++returning a quotient and remainder, such that ++

++

quotient\cdot divisor+remainder=number ++

++

The quotient always represents a mathematical integer. ++When more than one mathematical integer might be possible ++ (i.e., when the remainder is not zero), ++the kind of rounding or truncation depends on the operator: ++

++
++
floor, ffloor
++

floor and ffloor produce a quotient ++that has been truncated toward negative infinity; ++that is, the quotient represents the largest mathematical integer ++that is not larger than the mathematical quotient. ++

++
++
ceiling, fceiling
++

ceiling and fceiling produce a quotient ++that has been truncated toward positive infinity; ++that is, the quotient represents the smallest mathematical integer ++that is not smaller than the mathematical result. ++

++
++
truncate, ftruncate
++

truncate and ftruncate produce a quotient ++that has been truncated towards zero; ++that is, the quotient represents the mathematical integer ++of the same sign as the mathematical quotient, and ++that has the greatest integral magnitude not greater than that of the mathematical quotient. ++

++
++
round, fround
++

round and fround produce a quotient ++that has been rounded to the nearest mathematical integer; ++if the mathematical quotient is exactly halfway between two integers, ++(that is, it has the form integer+1\over2), ++then the quotient has been rounded to the even (divisible by two) integer. ++

++
++
++ ++

All of these functions perform type conversion operations on numbers. ++

++

The remainder ++is an integer if both x and y are integers, ++is a rational if both x and y are rationals, and ++is a float if either x or y is a float. ++

++

ffloor, fceiling, ftruncate, and fround ++handle arguments of different types in the following way: ++If number is a float, ++and divisor is not a float of longer format, ++then the first result is a float of the same type as number. ++Otherwise, the first result is of the type determined by contagion rules; ++see Contagion in Numeric Operations. ++

++

Examples::

++ ++
++
 (floor 3/2) ⇒  1, 1/2
++ (ceiling 3 2) ⇒  2, -1
++ (ffloor 3 2) ⇒  1.0, 1
++ (ffloor -4.7) ⇒  -5.0, 0.3
++ (ffloor 3.5d0) ⇒  3.0d0, 0.5d0
++ (fceiling 3/2) ⇒  2.0, -1/2
++ (truncate 1) ⇒  1, 0
++ (truncate .5) ⇒  0, 0.5
++ (round .5) ⇒  0, 0.5
++ (ftruncate -7 2) ⇒  -3.0, -1
++ (fround -7 2) ⇒  -4.0, 1
++ (dolist (n '(2.6 2.5 2.4 0.7 0.3 -0.3 -0.7 -2.4 -2.5 -2.6))
++   (format t "~&~4,1@F ~2,' D ~2,' D ~2,' D ~2,' D"
++           n (floor n) (ceiling n) (truncate n) (round n)))
++ |>  +2.6  2  3  2  3
++ |>  +2.5  2  3  2  2
++ |>  +2.4  2  3  2  2
++ |>  +0.7  0  1  0  1
++ |>  +0.3  0  1  0  0
++ |>  -0.3 -1  0  0  0
++ |>  -0.7 -1  0  0 -1
++ |>  -2.4 -3 -2 -2 -2
++ |>  -2.5 -3 -2 -2 -2
++ |>  -2.6 -3 -2 -2 -3
++⇒  NIL
++
++ ++

Notes::

++ ++

When only number is given, the two results are exact; ++the mathematical sum of the two results is always equal to the ++mathematical value of number. ++

++

(function number divisor) ++and (function (/ number divisor)) ++(where function is any of one ++of floor, ceiling, ffloor, ++fceiling, truncate, ++round, ftruncate, and fround) ++return the same first value, but ++they return different remainders as the second value. For example: ++

++
++
 (floor 5 2) ⇒  2, 1
++ (floor (/ 5 2)) ⇒  2, 1/2
++
++ ++

If an effect is desired that is similar to round, ++but that always rounds up or down (rather than toward the nearest even integer) ++if the mathematical quotient is exactly halfway between two integers, ++the programmer should consider a construction such as ++ (floor (+ x 1/2)) ++ or (ceiling (- x 1/2)). ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/fmakunbound.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++fmakunbound (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.5 fmakunbound [Function]

++ ++

fmakunbound namename ++

++

Pronunciation::

++ ++

pronounced ,ef ’mak e n,baund ++ or pronounced ,ef ’m\=a k e n,baund ++

++

Arguments and Values::

++ ++

name—a function name. ++

++

Description::

++ ++

Removes the function or macro definition, if any, of name ++in the global environment. ++

++

Examples::

++ ++
++
(defun add-some (x) (+ x 19)) ⇒  ADD-SOME
++ (fboundp 'add-some) ⇒  true
++ (flet ((add-some (x) (+ x 37)))
++    (fmakunbound 'add-some)
++    (add-some 1)) ⇒  38
++ (fboundp 'add-some) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if name is not a function name. ++

++

The consequences are undefined if name is a special operator. ++

++

See Also::

++ ++

fboundp ++, ++makunbound ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/format.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++format (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.4.31 format [Function]

++ ++

format destination control-string &rest argsresult ++

++

Arguments and Values::

++ ++

destinationnil, ++ t, ++ a stream, ++ or a string with a fill pointer. ++

++

control-string—a format control. ++

++

argsformat arguments for control-string. ++

++

result—if destination is non-nil, then nil; ++ otherwise, a string. ++

++

Description::

++ ++

format produces formatted output by outputting the characters ++of control-string and observing that a tilde ++introduces a directive. The character after the tilde, possibly preceded ++by prefix parameters and modifiers, specifies what kind of formatting ++is desired. Most directives use one or more elements of args to ++create their output. ++

++

If destination is a string, a stream, or t, ++then the result is nil. Otherwise, the result is ++a string containing the ‘output.’ ++

++

format is useful for producing nicely formatted text, producing ++good-looking messages, and so on. format can generate and return ++a string or output to destination. ++

++

For details on how the control-string is interpreted, ++see Formatted Output. ++

++

Affected By::

++ ++

*standard-output*, ++*print-escape*, ++*print-radix*, ++*print-base*, ++*print-circle*, ++*print-pretty*, ++*print-level*, ++*print-length*, ++*print-case*, ++*print-gensym*, ++*print-array*. ++

++

Exceptional Situations::

++ ++

If destination is a string with a fill pointer, ++the consequences are undefined if destructive modifications are performed ++directly on the string during the dynamic extent of the call. ++

++

See Also::

++ ++

write ++, ++Documentation of Implementation-Defined Scripts ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/formatter.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++formatter (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.2 formatter [Macro]

++ ++

formatter control-stringfunction ++

++

Arguments and Values::

++ ++

control-string—a format string; not evaluated. ++

++

function—a function. ++

++

Description::

++ ++

Returns a function which has behavior equivalent to: ++

++
++
  #'(lambda (*standard-output* &rest arguments)
++      (apply #'format t control-string arguments)
++      arguments-tail)
++
++ ++

where arguments-tail is either the tail of arguments ++which has as its car the argument that would be processed next ++if there were more format directives in the control-string, ++or else nil if no more arguments follow the most recently ++processed argument. ++

++

Examples::

++ ++
++
(funcall (formatter "~&~A~A") *standard-output* 'a 'b 'c)
++ |>  AB
++⇒  (C)
++
++(format t (formatter "~&~A~A") 'a 'b 'c)
++ |>  AB
++⇒  NIL
++
++ ++

Exceptional Situations::

++ ++

Might signal an error (at macro expansion time or at run time) if the argument ++is not a valid format string. ++

++

See Also::

++ ++

format ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ftype.html +@@ -0,0 +1,109 @@ ++ ++ ++ ++ ++ ++ftype (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.23 ftype [Declaration]

++ ++

Syntax::

++ ++

(ftype type {function-name}*) ++

++

Arguments::

++ ++

function-name—a function name. ++

++

type—a type specifier. ++

++

Valid Context::

++ ++

declaration or proclamation ++

++

Binding Types Affected::

++ ++

function ++

++

Description::

++ ++

Specifies that the functions named by function-names are of ++the functional type type. ++For example: ++

++
++
 (declare (ftype (function (integer list) t) ith)
++          (ftype (function (number) float) sine cosine))
++
++ ++

If one of the functions mentioned has a lexically apparent local definition ++(as made by flet or labels), then the declaration ++applies to that local definition and not to the global function definition. ++ftype declarations never apply to variable bindings (see type). ++

++

The lexically apparent bindings of function-names must not be ++macro definitions. (This is because ftype declares the ++functional definition of each function name to be of a particular ++subtype of function, and macros do not denote ++functions.) ++

++

ftype ++

++

declarations ++can be free declarations or bound declarations. ++ftype declarations of functions that appear before the body of a ++ flet ++or labels ++

++

form that defines that function are bound declarations. ++Such declarations in other contexts are free declarations. ++

++

See Also::

++ ++

declare, ++declaim ++, ++proclaim ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/funcall.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++funcall (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.7 funcall [Function]

++ ++

funcall function &rest args{result}* ++

++

Arguments and Values::

++ ++

function—a function designator. ++

++

argsarguments to the function. ++

++

results—the values returned by the function. ++

++

Description::

++ ++

funcall applies function to args. ++

++

If function is a symbol, ++it is coerced to a function as if by ++finding its functional value in the global environment. ++

++

Examples::

++ ++
++
 (funcall #'+ 1 2 3) ⇒  6
++ (funcall 'car '(1 2 3)) ⇒  1
++ (funcall 'position 1 '(1 2 3 2 1) :start 1) ⇒  4
++ (cons 1 2) ⇒  (1 . 2)
++ (flet ((cons (x y) `(kons ,x ,y)))
++   (let ((cons (symbol-function '+)))
++     (funcall #'cons
++              (funcall 'cons 1 2)
++              (funcall cons 1 2))))
++⇒  (KONS (1 . 2) 3)
++
++ ++

Exceptional Situations::

++ ++

An error of type undefined-function should be signaled if function ++is a symbol that does not have a global definition as a function ++or that has a global definition as a macro or a special operator. ++

++

See Also::

++ ++

apply ++, function, Evaluation ++

++

Notes::

++ ++
++
 (funcall function arg1 arg2 ...)
++ ≡ (apply function arg1 arg2 ... nil)
++ ≡ (apply function (list arg1 arg2 ...))
++
++ ++

The difference between funcall and an ordinary function call is that ++in the former case the function is obtained by ordinary evaluation ++of a form, and in the latter case it is obtained by the special ++interpretation of the function position that normally occurs. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/function-_0028Special-Operator_0029.html +@@ -0,0 +1,128 @@ ++ ++ ++ ++ ++ ++function (Special Operator) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.8 function [Special Operator]

++ ++

function namefunction ++

++

Arguments and Values::

++ ++

name—a function name or lambda expression. ++

++

function—a function object. ++

++

Description::

++ ++

The value of function is the functional value of name ++in the current lexical environment. ++

++

If name is a function name, the functional definition of that name ++is that ++established by the innermost lexically enclosing ++flet, labels, or macrolet form, ++if there is one. Otherwise the global functional definition of the ++function name ++is returned. ++

++

If name is a lambda expression, then a lexical closure ++is returned. In situations where a closure over the same set of ++bindings might be produced more than once, the various resulting ++closures might or might not be eq. ++

++

It is an error to use function on a function name ++that does not denote a function in the lexical environment in ++which the function form appears. ++Specifically, it is an error to use function on a symbol ++that denotes a macro or special form. ++An implementation may choose not to signal this error for ++performance reasons, but implementations are forbidden from ++defining the failure to signal an error as a useful behavior. ++

++

Examples::

++ ++
++
 (defun adder (x) (function (lambda (y) (+ x y))))
++
++ ++

The result of (adder 3) is a function that adds 3 to its argument: ++

++
++
 (setq add3 (adder 3))
++ (funcall add3 5) ⇒  8
++
++ ++

This works because function creates a closure of ++the lambda expression that is able to refer to the value 3 ++of the variable x even after control has returned from the function adder. ++

++

See Also::

++ ++

defun ++, ++fdefinition ++, ++flet ++, ++labels, ++symbol-function ++, ++Symbols as Forms, ++Sharpsign Single-Quote, ++Printing Other Objects ++

++

Notes::

++ ++

The notation #'name may be used as an abbreviation ++for (function name). ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/function-_0028System-Class_0029.html +@@ -0,0 +1,217 @@ ++ ++ ++ ++ ++ ++function (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.3 function [System Class]

++ ++

Class Precedence List::

++

function, ++t ++

++

Description::

++ ++

A function is an object that represents code ++to be executed when an appropriate number of arguments is supplied. ++A function is produced by ++ the function special form, ++ the function coerce, ++

++

or ++ the function compile. ++A function can be directly invoked by using it as the first argument to ++funcall, apply, or multiple-value-call. ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(function{[arg-typespec [value-typespec]]}) ++

++

arg-typespec ::=({typespec}*  ++                  [&optional {typespec}*]  ++                  [&rest typespec]  ++                  [&key {(keyword typespec )}*]) ++

++

Compound Type Specifier Arguments::

++ ++

typespec—a type specifier. ++

++

value-typespec—a type specifier. ++

++

Compound Type Specifier Description::

++ ++

[Editorial Note by KMP: Isn’t there some context info about ftype declarations to be merged here?] ++

++

[Editorial Note by KMP: This could still use some cleaning up.] ++

++

[Editorial Note by Sandra: Still need clarification about what happens if the ++number of arguments doesn’t match the FUNCTION type declaration.] ++

++

The list form of the function type-specifier ++can be used only for declaration and not for discrimination. ++Every element of this type is ++a function that accepts arguments of the ++types ++specified by the argj-types and returns values that are ++members of the types specified by value-type. The ++&optional, &rest, &key, ++

++

and &allow-other-keys ++

++

markers can appear in the list of argument types. ++

++

The type specifier provided ++with &rest is the type ++of each actual argument, not the type of the ++corresponding variable. ++

++

The &key parameters ++should be supplied as lists of the form (keyword type). ++The keyword must be a valid keyword-name symbol ++as must be supplied in the actual arguments of a ++call. ++

++

This is usually a symbol in the KEYWORD package but can be any symbol. ++

++

When &key is given in a ++function type specifier lambda list, ++the keyword parameters given ++are exhaustive unless &allow-other-keys is also present. ++&allow-other-keys is an indication ++that other keyword arguments might actually be ++supplied and, if supplied, can be used. ++For example, ++the type of the function make-list could be declared as follows: ++

++
++
 (function ((integer 0) &key (:initial-element t)) list)
++
++ ++

The value-type can be a values ++type specifier in order to indicate the ++types of multiple values. ++

++

Consider a declaration of the following form: ++

++
++
 (ftype (function (arg0-type arg1-type ...) val-type) f))
++
++ ++

Any form ++(f arg0 arg1 ...) ++within the scope of ++that declaration is equivalent to the following: ++

++
++
 (the val-type (f (the arg0-type arg0) (the arg1-type arg1) ...))
++
++ ++

That is, the consequences are undefined if any of the arguments are ++not of the specified types or the result is not of the ++specified type. In particular, if any argument is not of the ++correct type, the result is not guaranteed to be of the ++specified type. ++

++

Thus, an ftype declaration for a function ++describes calls to the function, not the actual definition ++of the function. ++

++

Consider a declaration of the following form: ++

++
++
 (type (function (arg0-type arg1-type ...) val-type) fn-valued-variable)
++
++ ++

This declaration has the interpretation that, within the scope of the ++declaration, the consequences are unspecified if the value of fn-valued-variable is called with arguments not of the specified ++types; the value resulting from a valid call will be of type ++val-type. ++

++

As with variable type declarations, nested declarations ++imply intersections of types, as follows: ++

++
*
++

Consider the following two ++declarations of ftype: ++

++
++
 (ftype (function (arg0-type1 arg1-type1 ...) val-type1) f))
++
++ ++

and ++

++
++
 (ftype (function (arg0-type2 arg1-type2 ...) val-type2) f))
++
++ ++

If both these declarations are in effect, ++then within the shared scope of the declarations, calls to f can be ++treated as if f were declared as follows: ++

++
++
 (ftype (function ((and arg0-type1 arg0-type2) (and arg1-type1 arg1-type2 ...) ...)
++                  (and val-type1 val-type2)) 
++        f))
++
++ ++

It is permitted to ignore one or all of the ftype declarations in force. ++

++
++
*
++

If two (or more) type declarations are in effect for a variable, and ++they are both function declarations, the declarations combine similarly. ++

++
++ ++
++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/function_002dkeywords.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++function-keywords (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.1 function-keywords [Standard Generic Function]

++ ++

Syntax::

++ ++

function-keywords methodkeys, allow-other-keys-p ++

++

Method Signatures::

++ ++

function-keywords (method standard-method) ++

++

Arguments and Values::

++ ++

method—a method. ++

++

keys—a list. ++

++

allow-other-keys-p—a generalized boolean. ++

++

Description::

++ ++

Returns the keyword parameter specifiers for a method. ++

++

Two values are returned: ++ a list of the explicitly named keywords ++ and a generalized boolean that states whether &allow-other-keys ++ had been specified in the method definition. ++

++

Examples::

++ ++
++
 (defmethod gf1 ((a integer) &optional (b 2)
++                 &key (c 3) ((:dee d) 4) e ((eff f)))
++   (list a b c d e f))
++⇒  #<STANDARD-METHOD GF1 (INTEGER) 36324653>
++ (find-method #'gf1 '() (list (find-class 'integer))) 
++⇒  #<STANDARD-METHOD GF1 (INTEGER) 36324653>
++ (function-keywords *)
++⇒  (:C :DEE :E EFF), false
++ (defmethod gf2 ((a integer))
++   (list a b c d e f))
++⇒  #<STANDARD-METHOD GF2 (INTEGER) 42701775>
++ (function-keywords (find-method #'gf1 '() (list (find-class 'integer))))
++⇒  (), false
++ (defmethod gf3 ((a integer) &key b c d &allow-other-keys)
++   (list a b c d e f))
++ (function-keywords *)
++⇒  (:B :C :D), true
++
++ ++

Affected By::

++ ++

defmethod ++

++

See Also::

++ ++

defmethod ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/function_002dlambda_002dexpression.html +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++function-lambda-expression (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.9 function-lambda-expression [Function]

++ ++

function-lambda-expression function
++ ⇒ lambda-expression, closure-p, name ++

++

Arguments and Values::

++ ++

function—a function. ++

++

lambda-expression—a lambda expression or nil. ++

++

closure-p—a generalized boolean. ++

++

name—an object. ++

++

Description::

++ ++

Returns information about function as follows: ++

++

The primary value, lambda-expression, ++is function’s defining lambda expression, ++or nil if the information is not available. The lambda expression ++may have been pre-processed in some ways, but it should remain a suitable ++argument to compile or function. ++Any implementation may legitimately return nil ++as the lambda-expression of any function. ++

++

The secondary value, closure-p, ++is nil if function’s definition was enclosed ++in the null lexical environment or something non-nil if ++function’s definition might have been enclosed in some ++non-null lexical environment. ++Any implementation may legitimately return true ++as the closure-p of any function. ++

++

The tertiary value, name, ++is the “name” of function. ++The name is intended for debugging only and is not necessarily one that would ++be valid for use as a name in defun or function, for example. ++By convention, nil is used to mean that function has no name. ++Any implementation may legitimately return nil ++as the name of any function. ++

++

Examples::

++ ++

The following examples illustrate some possible return values, but ++are not intended to be exhaustive: ++

++
++
 (function-lambda-expression #'(lambda (x) x))
++⇒  NIL, false, NIL
++OR⇒ NIL, true, NIL
++OR⇒ (LAMBDA (X) X), true, NIL
++OR⇒ (LAMBDA (X) X), false, NIL
++
++ (function-lambda-expression
++    (funcall #'(lambda () #'(lambda (x) x))))
++⇒  NIL, false, NIL
++OR⇒ NIL, true, NIL
++OR⇒ (LAMBDA (X) X), true, NIL
++OR⇒ (LAMBDA (X) X), false, NIL
++
++ (function-lambda-expression 
++    (funcall #'(lambda (x) #'(lambda () x)) nil))
++⇒  NIL, true, NIL
++OR⇒ (LAMBDA () X), true, NIL
++NOT⇒ NIL, false, NIL
++NOT⇒ (LAMBDA () X), false, NIL
++
++ (flet ((foo (x) x))
++   (setf (symbol-function 'bar) #'foo)
++   (function-lambda-expression #'bar))
++⇒  NIL, false, NIL
++OR⇒ NIL, true, NIL
++OR⇒ (LAMBDA (X) (BLOCK FOO X)), true, NIL
++OR⇒ (LAMBDA (X) (BLOCK FOO X)), false, FOO
++OR⇒ (SI::BLOCK-LAMBDA FOO (X) X), false, FOO
++
++ (defun foo ()
++   (flet ((bar (x) x))
++     #'bar))
++ (function-lambda-expression (foo))
++⇒  NIL, false, NIL
++OR⇒ NIL, true, NIL
++OR⇒ (LAMBDA (X) (BLOCK BAR X)), true, NIL
++OR⇒ (LAMBDA (X) (BLOCK BAR X)), true, (:INTERNAL FOO 0 BAR)
++OR⇒ (LAMBDA (X) (BLOCK BAR X)), false, "BAR in FOO"
++
++ ++

Notes::

++ ++

Although implementations are free to return “nil, true, nil” in all cases, ++they are encouraged to return a lambda expression as the primary value ++in the case where the argument was created by a call to compile ++or eval (as opposed to being created by loading a compiled file). ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/functionp.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++functionp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.10 functionp [Function]

++ ++

functionp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type function; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (functionp 'append) ⇒  false
++ (functionp #'append) ⇒  true
++ (functionp (symbol-function 'append)) ⇒  true
++ (flet ((f () 1)) (functionp #'f)) ⇒  true
++ (functionp (compile nil '(lambda () 259))) ⇒  true
++ (functionp nil) ⇒  false
++ (functionp 12) ⇒  false
++ (functionp '(lambda (x) (* x x))) ⇒  false
++ (functionp #'(lambda (x) (* x x))) ⇒  true
++
++ ++

Notes::

++ ++
++
 (functionp object) ≡ (typep object 'function)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/gcd.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++gcd (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.32 gcd [Function]

++ ++

gcd &rest integersgreatest-common-denominator ++

++

Arguments and Values::

++ ++

integer—an integer. ++

++

greatest-common-denominator—a non-negative integer. ++

++

Description::

++ ++

Returns the greatest common divisor of integers. ++If only one integer is supplied, its absolute value is returned. ++If no integers are given, gcd returns 0, ++which is an identity for this operation. ++

++

Examples::

++ ++
++
 (gcd) ⇒  0
++ (gcd 60 42) ⇒  6
++ (gcd 3333 -33 101) ⇒  1
++ (gcd 3333 -33 1002001) ⇒  11
++ (gcd 91 -49) ⇒  7
++ (gcd 63 -42 35) ⇒  7
++ (gcd 5) ⇒  5
++ (gcd -4) ⇒  4
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if any integer is not an integer. ++

++

See Also::

++ ++

lcm ++

++

Notes::

++

For three or more arguments, ++

++
++
 (gcd b c ... z) ≡ (gcd (gcd a b) c ... z)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/generic_002dfunction.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++generic-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.5 generic-function [System Class]

++ ++

Class Precedence List::

++ ++

generic-function, ++function, ++t ++

++

Description::

++ ++

A generic function ++ ++ is a function whose behavior ++depends on the classes or identities of the arguments ++supplied to it. A generic function object contains a set of ++methods, a lambda list, a method combination type, ++and other information. The methods ++define the class-specific behavior and operations of the generic function; ++a method is said to specialize a generic function. ++When invoked, a generic function executes a subset of its ++methods based on the classes or identities of its arguments. ++

++

A generic function can be used in the same ways that an ++ordinary function can be used; specifically, a generic function can ++be used as an argument to funcall and apply, ++and can be given a global or a local name. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/gensym.html +@@ -0,0 +1,130 @@ ++ ++ ++ ++ ++ ++gensym (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.7 gensym [Function]

++ ++

gensym &optional xnew-symbol ++

++

Arguments and Values::

++ ++

x—a string or a non-negative integer. ++ Complicated defaulting behavior; see below. ++

++

new-symbol—a fresh, uninterned symbol. ++

++

Description::

++ ++

Creates and returns a fresh, uninterned symbol, ++as if by calling make-symbol. (The only difference between ++gensym and make-symbol is in how the new-symbol’s ++name is determined.) ++

++

The name of the new-symbol is the concatenation ++of a prefix, which defaults to "G", and ++

++

a suffix, which is the decimal representation of a number that ++defaults to the value of *gensym-counter*. ++

++

If x is supplied, and is a string, then that string ++is used as a prefix instead of "G" for this call to gensym only. ++

++

If x is supplied, and is an integer, then that integer, ++instead of the value of *gensym-counter*, is used as the suffix ++for this call to gensym only. ++

++

If and only if no explicit suffix is supplied, ++*gensym-counter* is incremented after it is used. ++

++

Examples::

++ ++
++
 (setq sym1 (gensym)) ⇒  #:G3142
++ (symbol-package sym1) ⇒  NIL
++ (setq sym2 (gensym 100)) ⇒  #:G100
++ (setq sym3 (gensym 100)) ⇒  #:G100
++ (eq sym2 sym3) ⇒  false
++ (find-symbol "G100") ⇒  NIL, NIL
++ (gensym "T") ⇒  #:T3143
++ (gensym) ⇒  #:G3144
++
++ ++

Side Effects::

++ ++

Might increment *gensym-counter*. ++

++

Affected By::

++ ++

*gensym-counter* ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if x is not a string or a non-negative integer. ++

++

See Also::

++ ++

gentemp ++, ++*gensym-counter* ++

++

Notes::

++ ++

The ability to pass a numeric argument to gensym has been deprecated; ++explicitly binding *gensym-counter* is now stylistically preferred. ++(The somewhat baroque conventions for the optional argument are historical ++in nature, and supported primarily for compatibility with older dialects ++of Lisp. In modern code, it is recommended that the only kind of argument ++used be a string prefix. In general, though, to obtain more flexible control ++of the new-symbol’s name, consider using make-symbol instead.) ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/gentemp.html +@@ -0,0 +1,142 @@ ++ ++ ++ ++ ++ ++gentemp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.9 gentemp [Function]

++ ++

gentemp &optional prefix packagenew-symbol ++

++

Arguments and Values::

++ ++

prefix—a string. ++ The default is "T". ++

++

package—a package designator. ++ The default is the current package. ++

++

new-symbol—a fresh, interned symbol. ++

++

Description::

++ ++

gentemp creates and returns a fresh symbol, ++interned in the indicated package. ++The symbol is guaranteed to be one that was not previously ++accessible in package. ++It is neither bound nor fbound, and has a null ++property list. ++

++

The name of the new-symbol is the concatenation ++of the prefix and a suffix, which is taken from an internal ++counter used only by gentemp. (If a symbol by that name ++is already accessible in package, the counter is incremented as ++many times as is necessary to produce a name that is not already the ++name of a symbol accessible in package.) ++

++

Examples::

++ ++
++
 (gentemp) ⇒  T1298
++ (gentemp "FOO") ⇒  FOO1299
++ (find-symbol "FOO1300") ⇒  NIL, NIL
++ (gentemp "FOO") ⇒  FOO1300
++ (find-symbol "FOO1300") ⇒  FOO1300, :INTERNAL
++ (intern "FOO1301") ⇒  FOO1301, :INTERNAL
++ (gentemp "FOO") ⇒  FOO1302
++ (gentemp) ⇒  T1303
++
++ ++

Side Effects::

++ ++

Its internal counter is incremented one or more times. ++

++

Interns the new-symbol in package. ++

++

Affected By::

++ ++

The current state of its internal counter, and ++the current state of the package. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if prefix is not a string. ++Should signal an error of type type-error ++ if package is not a package designator. ++

++

See Also::

++ ++

gensym ++

++

Notes::

++ ++

The function gentemp is deprecated. ++

++

If package is the KEYWORD package, ++the result is an external symbol of package. ++Otherwise, the result is an internal symbol of package. ++

++

The gentemp internal counter is independent of ++*gensym-counter*, the counter used by gensym. ++There is no provision for accessing the gentemp internal counter. ++

++

Just because gentemp creates a symbol which did not ++previously exist does not mean that such a symbol might not be ++seen in the future (e.g., in a data file—perhaps even created by the ++same program in another session). As such, this symbol is not truly ++unique in the same sense as a gensym would be. In particular, ++programs which do automatic code generation should be careful not to ++attach global attributes to such generated symbols (e.g., special declarations) and then write them into a file ++because such global attributes might, in a different session, end up ++applying to other symbols that were automatically generated on ++another day for some other purpose. ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get.html +@@ -0,0 +1,161 @@ ++ ++ ++ ++ ++ ++get (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.15 get [Accessor]

++ ++

get symbol indicator &optional defaultvalue ++

++

(setf ( get symbol indicator &optional default) new-value)
++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

indicator—an object. ++

++

default—an object. ++ The default is nil. ++

++

value—if the indicated property exists, ++ the object that is its value; ++ otherwise, the specified default. ++

++

new-value—an object. ++

++

Description::

++ ++

get finds a property ++on the property list_2 of symbol ++whose property indicator is identical to indicator, ++and returns its corresponding property value. ++

++

If there are multiple properties_1 with that property indicator, ++get uses the first such property. ++

++

If there is no property with that property indicator, ++default is returned. ++

++

setf of get may be used to associate a new object ++with an existing indicator already on the symbol’s property list, ++or to create a new assocation if none exists. ++

++

If there are multiple properties_1 with that property indicator, ++setf of get associates the new-value ++with the first such property. ++

++

When a get form is used as a setf place, ++any default which is supplied is evaluated according to normal ++left-to-right evaluation rules, but its value is ignored. ++

++

Examples::

++ ++
++
 (defun make-person (first-name last-name)
++   (let ((person (gensym "PERSON")))
++     (setf (get person 'first-name) first-name)
++     (setf (get person 'last-name) last-name)
++     person)) ⇒  MAKE-PERSON
++ (defvar *john* (make-person "John" "Dow")) ⇒  *JOHN*
++ *john* ⇒  #:PERSON4603
++ (defvar *sally* (make-person "Sally" "Jones")) ⇒  *SALLY*
++ (get *john* 'first-name) ⇒  "John"
++ (get *sally* 'last-name) ⇒  "Jones"
++ (defun marry (man woman married-name)
++   (setf (get man 'wife) woman)
++   (setf (get woman 'husband) man)
++   (setf (get man 'last-name) married-name)
++   (setf (get woman 'last-name) married-name)
++   married-name) ⇒  MARRY
++ (marry *john* *sally* "Dow-Jones") ⇒  "Dow-Jones"
++ (get *john* 'last-name) ⇒  "Dow-Jones"
++ (get (get *john* 'wife) 'first-name) ⇒  "Sally"
++ (symbol-plist *john*)
++⇒  (WIFE #:PERSON4604 LAST-NAME "Dow-Jones" FIRST-NAME "John")
++ (defmacro age (person &optional (default ''thirty-something)) 
++   `(get ,person 'age ,default)) ⇒  AGE
++ (age *john*) ⇒  THIRTY-SOMETHING
++ (age *john* 20) ⇒  20
++ (setf (age *john*) 25) ⇒  25
++ (age *john*) ⇒  25
++ (age *john* 20) ⇒  25
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

getf ++, ++symbol-plist ++, ++remprop ++

++

Notes::

++ ++
++
 (get x y) ≡ (getf (symbol-plist x) y)
++
++ ++

Numbers and characters are not recommended for use ++as indicators in portable code since get tests ++with eq rather than eql, and consequently ++the effect of using such indicators is ++implementation-dependent. ++

++

There is no way using get to distinguish an absent property from ++one whose value is default. However, see get-properties. ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get_002dinternal_002dreal_002dtime.html +@@ -0,0 +1,73 @@ ++ ++ ++ ++ ++ ++get-internal-real-time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.12 get-internal-real-time [Function]

++ ++

get-internal-real-time <no arguments>internal-time ++

++

Arguments and Values::

++ ++

internal-time—a non-negative integer. ++

++

Description::

++ ++

get-internal-real-time returns as an integer the ++current time in internal time units, relative to an arbitrary ++time base. The difference between the values of two calls to this ++function is the amount of elapsed real time (i.e., clock time) between the two calls. ++

++

Affected By::

++ ++

Time of day (i.e., the passage of time). ++The time base affects the result magnitude. ++

++

See Also::

++ ++

internal-time-units-per-second ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get_002dinternal_002drun_002dtime.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++get-internal-run-time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.13 get-internal-run-time [Function]

++ ++

get-internal-run-time <no arguments>internal-time ++

++

Arguments and Values::

++ ++

internal-time—a non-negative integer. ++

++

Description::

++ ++

Returns as an integer the current ++run time in internal time units. The precise meaning of this quantity is ++implementation-defined; it may measure real time, run time, CPU cycles, or some ++other quantity. The intent is that the difference between the values of two calls ++to this function be the amount of time between the two calls during which ++computational effort was expended on behalf of the executing program. ++

++

Affected By::

++ ++

The implementation, ++the time of day (i.e., the passage of time). ++

++

See Also::

++ ++

internal-time-units-per-second ++

++

Notes::

++ ++

Depending on the implementation, paging time and garbage ++collection time might be included in this measurement. Also, in a ++multitasking environment, it might not be possible to show the time for ++just the running process, so in some implementations, time taken ++by other processes during the same time interval might be included in ++this measurement as well. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get_002doutput_002dstream_002dstring.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++get-output-stream-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.48 get-output-stream-string [Function]

++ ++

get-output-stream-string string-output-streamstring ++

++

Arguments and Values::

++ ++

string-output-stream—a stream. ++

++

string—a string. ++

++

Description::

++ ++

Returns a string containing, in order, all the characters ++that have been output to string-output-stream. ++This operation clears any characters on string-output-stream, ++so the string contains only those characters which have been output ++ since the last call to get-output-stream-string ++or since the creation of the string-output-stream, ++whichever occurred most recently. ++

++

Examples::

++
++
 (setq a-stream (make-string-output-stream)
++        a-string "abcdefghijklm") ⇒  "abcdefghijklm"
++ (write-string a-string a-stream) ⇒  "abcdefghijklm"
++ (get-output-stream-string a-stream) ⇒  "abcdefghijklm"
++ (get-output-stream-string a-stream) ⇒  ""
++
++ ++

Side Effects::

++ ++

The string-output-stream is cleared. ++

++

Exceptional Situations::

++ ++

The consequences are undefined if stream-output-string is closed. ++

++

The consequences are undefined if string-output-stream is a stream that ++was not produced by make-string-output-stream. ++

++

The consequences are undefined if string-output-stream was ++created implicitly by with-output-to-string or format. ++

++

See Also::

++ ++

make-string-output-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get_002dproperties.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++get-properties (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.40 get-properties [Function]

++ ++

get-properties plist indicator-listindicator, value, tail ++

++

Arguments and Values::

++ ++

plist—a property list. ++

++

indicator-list—a proper list (of indicators). ++

++

indicator—an object that is an element of indicator-list. ++

++

value—an object. ++

++

tail—a list. ++

++

Description::

++ ++

get-properties is used to look up any of several ++property list entries all at once. ++

++

It searches the plist for the first entry whose indicator ++is identical to one of the objects in indicator-list. ++If such an entry is found, the indicator and value returned ++are the property indicator and its associated property value, ++and the tail returned is the tail of the plist ++that begins with the found entry (i.e., whose car is the indicator). ++If no such entry is found, the indicator, value, and tail ++are all nil. ++

++

Examples::

++ ++
++
 (setq x '()) ⇒  NIL
++ (setq *indicator-list* '(prop1 prop2)) ⇒  (PROP1 PROP2)
++ (getf x 'prop1) ⇒  NIL
++ (setf (getf x 'prop1) 'val1) ⇒  VAL1
++ (eq (getf x 'prop1) 'val1) ⇒  true
++ (get-properties x *indicator-list*) ⇒  PROP1, VAL1, (PROP1 VAL1)
++ x ⇒  (PROP1 VAL1)
++
++ ++

See Also::

++ ++

get ++, ++getf ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get_002dsetf_002dexpansion.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++get-setf-expansion (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.63 get-setf-expansion [Function]

++ ++

get-setf-expansion place &optional environment
++ ⇒ vars, vals, store-vars, writer-form, reader-form ++

++

Arguments and Values::

++ ++

place—a place. ++

++

environment—an environment object. ++

++

vars, vals, store-vars, writer-form, reader-form—a setf expansion. ++

++

Description::

++ ++

Determines ++five values constituting the setf expansion for place ++in environment; see Setf Expansions. ++

++

If environment is not supplied or nil, ++the environment is the null lexical environment. ++

++

Examples::

++ ++
++
 (get-setf-expansion 'x)
++⇒  NIL, NIL, (#:G0001), (SETQ X #:G0001), X 
++
++ ++
++
;;; This macro is like POP 
++
++ (defmacro xpop (place &environment env)
++   (multiple-value-bind (dummies vals new setter getter)
++                        (get-setf-expansion place env)
++      `(let* (,@(mapcar #'list dummies vals) (,(car new) ,getter))
++         (if (cdr new) (error "Can't expand this."))
++         (prog1 (car ,(car new))
++                (setq ,(car new) (cdr ,(car new)))
++                ,setter))))
++
++ (defsetf frob (x) (value) 
++     `(setf (car ,x) ,value)) ⇒  FROB
++;;; The following is an error; an error might be signaled at macro expansion time
++ (flet ((frob (x) (cdr x)))  ;Invalid
++   (xpop (frob z)))
++
++
++ ++

See Also::

++ ++

defsetf ++, ++define-setf-expander ++, ++setf ++

++

Notes::

++ ++

Any compound form is a valid place, ++since any compound form whose operator f has no setf expander ++are expanded into a call to (setf f). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/get_002duniversal_002dtime.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++get-universal-time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.3 get-universal-time, get-decoded-time [Function]

++ ++

get-universal-time <no arguments>universal-time ++

++

get-decoded-time <no arguments>
++ ⇒ second, minute, hour, date, month, year, day, daylight-p, zone ++

++

Arguments and Values::

++ ++

universal-time—a universal time. ++

++

second, minute, hour, ++date, month, year, ++day, daylight-p, zone—a decoded time. ++

++

Description::

++ ++

get-universal-time returns the current time, represented as a universal time. ++

++

get-decoded-time returns the current time, represented as a decoded time. ++

++

Examples::

++ ++
++
;; At noon on July 4, 1976 in Eastern Daylight Time.
++ (get-decoded-time) ⇒  0, 0, 12, 4, 7, 1976, 6, true, 5
++;; At exactly the same instant.
++ (get-universal-time) ⇒  2414332800
++;; Exactly five minutes later.
++ (get-universal-time) ⇒  2414333100
++;; The difference is 300 seconds (five minutes)
++ (- * **) ⇒  300
++
++ ++

Affected By::

++ ++

The time of day (i.e., the passage of time), ++the system clock’s ability to keep accurate time, ++and the accuracy of the system clock’s initial setting. ++

++

Exceptional Situations::

++ ++

An error of type error might be signaled if the current time cannot be determined. ++

++

See Also::

++ ++

decode-universal-time ++, ++encode-universal-time ++, ++Time ++

++

Notes::

++ ++
++
 (get-decoded-time) ≡ (decode-universal-time (get-universal-time))
++
++ ++

No implementation is required to have a way to verify that the ++time returned is correct. However, if an implementation provides ++a validity check (e.g., the failure to have properly initialized the system ++clock can be reliably detected) and that validity check fails, ++the implementation is strongly encouraged (but not required) ++to signal an error of type error (rather than, for example, returning a ++known-to-be-wrong value) that is correctable by allowing the user ++to interactively set the correct time. ++

++
++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/getf.html +@@ -0,0 +1,159 @@ ++ ++ ++ ++ ++ ++getf (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.41 getf [Accessor]

++ ++

getf plist indicator &optional defaultvalue ++

++

(setf ( getf place indicator &optional default) new-value)
++

++

Arguments and Values::

++ ++

plist—a property list. ++

++

place—a place, the value of which is a property list. ++

++

indicator—an object. ++

++

default—an object. ++ The default is nil. ++

++

value—an object. ++

++

new-value—an object. ++

++

Description::

++ ++

getf finds a property on the plist ++whose property indicator is identical to indicator, ++and returns its corresponding property value. ++

++

If there are multiple properties_1 with that property indicator, ++getf uses the first such property. ++

++

If there is no property with that property indicator, ++default is returned. ++

++

setf of getf may be used to associate a new object ++with an existing indicator in the property list held by place, ++or to create a new assocation if none exists. ++

++

If there are multiple properties_1 with that property indicator, ++setf of getf associates the new-value ++with the first such property. ++

++

When a getf form is used as a setf place, ++any default which is supplied is evaluated according to normal ++left-to-right evaluation rules, but its value is ignored. ++

++

setf of getf is permitted to either ++ write the value of place itself, ++ or modify of any part, car or cdr, ++ of the list structure held by place. ++

++

Examples::

++ ++
++
 (setq x '()) ⇒  NIL
++ (getf x 'prop1) ⇒  NIL
++ (getf x 'prop1 7) ⇒  7
++ (getf x 'prop1) ⇒  NIL
++ (setf (getf x 'prop1) 'val1) ⇒  VAL1
++ (eq (getf x 'prop1) 'val1) ⇒  true
++ (getf x 'prop1) ⇒  VAL1
++ (getf x 'prop1 7) ⇒  VAL1
++ x ⇒  (PROP1 VAL1)
++
++;; Examples of implementation variation permitted.
++ (setq foo (list 'a 'b 'c 'd 'e 'f)) ⇒  (A B C D E F)
++ (setq bar (cddr foo)) ⇒  (C D E F)
++ (remf foo 'c) ⇒  true
++ foo ⇒  (A B E F)
++ bar
++⇒  (C D E F)
++OR⇒ (C)
++OR⇒ (NIL)
++OR⇒ (C NIL)
++OR⇒ (C D)
++
++ ++

See Also::

++ ++

get ++, ++get-properties ++, ++setf ++, ++Function Call Forms as Places ++

++

Notes::

++ ++

There is no way (using getf) to distinguish an absent property ++from one whose value is default; but see get-properties. ++

++

Note that while supplying a default argument to getf ++in a setf situation is sometimes not very interesting, ++it is still important because some macros, such as push and ++incf, require a place argument which data is both read ++from and written to. In such a context, if a default ++argument is to be supplied for the read situation, it must be ++syntactically valid for the write situation as well. For example, ++

++
++
 (let ((plist '()))
++   (incf (getf plist 'count 0))
++   plist) ⇒  (COUNT 1)
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/gethash.html +@@ -0,0 +1,122 @@ ++ ++ ++ ++ ++ ++gethash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.9 gethash [Accessor]

++ ++

gethash key hash-table &optional defaultvalue, present-p ++

++

(setf ( gethash key hash-table &optional default) new-value)
++

++

Arguments and Values::

++ ++

key—an object. ++

++

hash-table—a hash table. ++

++

default—an object. ++ The default is nil. ++

++

value—an object. ++

++

present-p—a generalized boolean. ++

++

Description::

++ ++

Value is the object in hash-table whose key ++is the same as key under the hash-table’s equivalence test. ++If there is no such entry, value is the default. ++

++

Present-p is true if an entry is found; otherwise, it is false. ++

++

setf may be used with gethash to modify the value ++associated with a given key, or to add a new entry. ++

++

When a gethash form is used as a setf place, ++any default which is supplied is evaluated according to normal ++left-to-right evaluation rules, but its value is ignored. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32206334>
++ (gethash 1 table) ⇒  NIL, false
++ (gethash 1 table 2) ⇒  2, false
++ (setf (gethash 1 table) "one") ⇒  "one"
++ (setf (gethash 2 table "two") "two") ⇒  "two"
++ (gethash 1 table) ⇒  "one", true
++ (gethash 2 table) ⇒  "two", true
++ (gethash nil table) ⇒  NIL, false
++ (setf (gethash nil table) nil) ⇒  NIL 
++ (gethash nil table) ⇒  NIL, true
++ (defvar *counters* (make-hash-table)) ⇒  *COUNTERS*
++ (gethash 'foo *counters*) ⇒  NIL, false
++ (gethash 'foo *counters* 0) ⇒  0, false
++ (defmacro how-many (obj) `(values (gethash ,obj *counters* 0))) ⇒  HOW-MANY
++ (defun count-it (obj) (incf (how-many obj))) ⇒  COUNT-IT
++ (dolist (x '(bar foo foo bar bar baz)) (count-it x))
++ (how-many 'foo) ⇒  2
++ (how-many 'bar) ⇒  3
++ (how-many 'quux) ⇒  0
++
++ ++

See Also::

++ ++

remhash ++

++

Notes::

++ ++

The secondary value, present-p, ++can be used to distinguish the absence of an entry ++from the presence of an entry that has a value of default. ++

++
++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/go.html +@@ -0,0 +1,109 @@ ++ ++ ++ ++ ++ ++go (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.24 go [Special Operator]

++ ++

go tag ++ ⇒ #<NoValue> ++

Arguments and Values::

++ ++

tag—a go tag. ++

++

Description::

++ ++

go transfers control to the point in the body ++of an enclosing tagbody form labeled by a ++tag eql to tag. ++If there is no such tag in the body, the ++bodies of lexically containing tagbody forms ++(if any) are examined as well. ++If several tags are eql ++to tag, control is transferred to ++whichever matching tag ++is contained in the innermost tagbody form that ++contains the go. ++The consequences are undefined ++if there is no matching tag lexically visible ++to the point of the go. ++

++

The transfer of control initiated by go is performed ++as described in Transfer of Control to an Exit Point. ++

++

Examples::

++
++
 (tagbody
++   (setq val 2)
++   (go lp)
++   (incf val 3)
++   lp (incf val 4)) ⇒  NIL
++ val ⇒  6 
++
++ ++

The following is in error because there is a normal exit ++of the tagbody before the ++go is executed. ++

++
++
 (let ((a nil)) 
++   (tagbody t (setq a #'(lambda () (go t))))
++   (funcall a))
++
++ ++

The following is in error because the tagbody is passed over ++before the go form is executed. ++

++
++
 (funcall (block nil
++            (tagbody a (return #'(lambda () (go a))))))
++
++ ++

See Also::

++ ++

tagbody ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/graphic_002dchar_002dp.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++graphic-char-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.12 graphic-char-p [Function]

++ ++

graphic-char-p chargeneralized-boolean ++

++

Arguments and Values::

++ ++

char—a character. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if character is a graphic character; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (graphic-char-p #\G) ⇒  true
++ (graphic-char-p #\#) ⇒  true
++ (graphic-char-p #\Space) ⇒  true
++ (graphic-char-p #\Newline) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

read ++, ++Character Syntax, ++Documentation of Implementation-Defined Scripts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/handler_002dbind.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++handler-bind (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.26 handler-bind [Macro]

++ ++

handler-bind ({!binding}*) ++ {form}*{result}* ++

++

binding ::=(type handler) ++

++

Arguments and Values::

++ ++

type—a type specifier. ++

++

handler—a form; evaluated to produce a handler-function. ++

++

handler-function—a designator for a function of one argument. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

Executes forms in a dynamic environment where the indicated ++handler bindings are in effect. ++

++

Each handler should evaluate to a handler-function, ++which is used to handle conditions of the given type ++during execution of the forms. This function should ++take a single argument, the condition being signaled. ++

++

If more than one handler binding is supplied, ++the handler bindings are searched sequentially from ++top to bottom in search of a match (by visual analogy with typecase). ++If an appropriate type is found, ++the associated handler is run in a dynamic environment where none of these ++handler bindings are visible (to avoid recursive errors). ++If the handler declines, the search continues for another handler. ++

++

If no appropriate handler is found, other handlers are sought ++from dynamically enclosing contours. If no handler is found outside, ++then signal returns or error enters the debugger. ++

++

Examples::

++ ++

In the following code, if an unbound variable error is ++signaled in the body (and not handled by an intervening handler), ++the first function is called. ++

++
++
 (handler-bind ((unbound-variable #'(lambda ...))
++                (error #'(lambda ...)))
++   ...)
++
++ ++

If any other kind of error is signaled, the second function is called. ++In either case, neither handler is active while executing the code ++in the associated function. ++

++
++
 (defun trap-error-handler (condition)
++   (format *error-output* "~&~A~&" condition)
++   (throw 'trap-errors nil))
++
++ (defmacro trap-errors (&rest forms)
++   `(catch 'trap-errors
++      (handler-bind ((error #'trap-error-handler))
++        ,@forms)))
++
++ (list (trap-errors (signal "Foo.") 1)
++       (trap-errors (error  "Bar.") 2)
++       (+ 1 2))
++ |>  Bar.
++⇒  (1 NIL 3)
++
++ ++

Note that “Foo.” is not printed because the condition made ++by signal is a simple condition, which is not of type error, ++so it doesn’t trigger the handler for error set up by trap-errors. ++

++

See Also::

++ ++

handler-case ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/handler_002dcase.html +@@ -0,0 +1,220 @@ ++ ++ ++ ++ ++ ++handler-case (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.27 handler-case [Macro]

++ ++

handler-case expression ++ [[{!error-clause}* | !no-error-clause]]{result}* ++

++

clause ::=!error-clause | !no-error-clause ++

++

error-clause ::=(typespec ([var]) {declaration}* {form}*) ++

++

no-error-clause ::=(:no-error lambda-list {declaration}* {form}*) ++

++

Arguments and Values::

++ ++

expression—a form. ++

++

typespec—a type specifier. ++

++

var—a variable name. ++

++

lambda-list—an ordinary lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

form—a form. ++

++

results—In the normal situation, the values returned are those that result from ++ the evaluation of expression; ++ in the exceptional situation when control is transferred to a clause, ++ the value of the last form in that clause is returned. ++

++

Description::

++ ++

handler-case executes expression in a dynamic environment where ++various handlers are active. Each error-clause specifies how to ++handle a condition matching the indicated typespec. ++A no-error-clause allows the specification of a particular action ++if control returns normally. ++

++

If a condition is signaled for which there is an appropriate ++error-clause during the execution of expression ++(i.e., one for which (typep condition 'typespec) ++returns true) and if there is no intervening handler for a ++condition of that type, then control is transferred to ++the body of the relevant error-clause. In this case, the ++dynamic state is unwound appropriately (so that the handlers established ++around the expression are no longer active), and var is bound to ++the condition that had been signaled. ++If more than one case is provided, those cases are made accessible ++in parallel. That is, in ++

++
++
  (handler-case form
++    (typespec1 (var1) form1)
++    (typespec2 (var2) form2))
++
++ ++

if the first clause (containing form1) has been selected, ++the handler for the second is no longer visible (or vice versa). ++

++

The clauses ++are searched sequentially from top to bottom. If there is type ++ overlap between typespecs, ++the earlier of the clauses is selected. ++

++

If var ++is not needed, it can be omitted. That is, a clause such as: ++

++
++
  (typespec (var) (declare (ignore var)) form)
++
++ ++

can be written ++ (typespec () form). ++

++

If there are no forms in a selected clause, the case, and therefore ++ handler-case, returns nil. ++ If execution of expression ++returns normally and no no-error-clause ++ exists, the values returned by ++expression are returned by handler-case. ++ If execution of ++expression returns normally and a no-error-clause ++ does exist, the values returned are used as arguments to the function ++ described by constructing ++ (lambda lambda-list {form}*) ++ from the no-error-clause, and the values of that function call are ++ returned by handler-case. ++The handlers which were established around the expression are no longer active at the time of this call. ++

++

Examples::

++ ++
++
 (defun assess-condition (condition)
++   (handler-case (signal condition)
++     (warning () "Lots of smoke, but no fire.")
++     ((or arithmetic-error control-error cell-error stream-error)
++        (condition)
++       (format nil "~S looks especially bad." condition))
++     (serious-condition (condition)
++       (format nil "~S looks serious." condition))
++     (condition () "Hardly worth mentioning.")))
++⇒  ASSESS-CONDITION
++ (assess-condition (make-condition 'stream-error :stream *terminal-io*))
++⇒  "#<STREAM-ERROR 12352256> looks especially bad."
++ (define-condition random-condition (condition) () 
++   (:report (lambda (condition stream)
++              (declare (ignore condition))
++              (princ "Yow" stream))))
++⇒  RANDOM-CONDITION
++ (assess-condition (make-condition 'random-condition))
++⇒  "Hardly worth mentioning."
++
++ ++

See Also::

++ ++

handler-bind ++, ++ignore-errors ++, ++Condition System Concepts ++

++

Notes::

++ ++
++
 (handler-case form
++   (type1 (var1) . body1)
++   (type2 (var2) . body2) ...)
++
++ ++

is approximately equivalent to: ++

++
++
 (block #1=#:g0001
++   (let ((#2=#:g0002 nil))
++     (tagbody
++       (handler-bind ((type1 #'(lambda (temp)
++                                       (setq #1# temp)
++                                       (go #3=#:g0003)))
++                      (type2 #'(lambda (temp)
++                                       (setq #2# temp)
++                                       (go #4=#:g0004))) ...)
++       (return-from #1# form))
++         #3# (return-from #1# (let ((var1 #2#)) . body1))
++         #4# (return-from #1# (let ((var2 #2#)) . body2)) ...)))
++
++ ++
++
 (handler-case form
++   (type1 (var1) . body1)
++   ...
++   (:no-error (varN-1 varN-2 ...) . bodyN))
++
++ ++

is approximately equivalent to: ++

++
++
++
++ (block #1=#:error-return
++  (multiple-value-call #'(lambda (varN-1 varN-2 ...) . bodyN)
++     (block #2=#:normal-return
++       (return-from #1#
++         (handler-case (return-from #2# form)
++           (type1 (var1) . body1) ...)))))
++
++ ++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++hash-table (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.2.1 hash-table [System Class]

++ ++

Class Precedence List::

++

hash-table, ++t ++

++

Description::

++ ++

Hash tables provide a way of mapping any object (a key) ++to an associated object (a value). ++

++

See Also::

++ ++

Hash Table Concepts, ++Printing Other Objects ++

++

Notes::

++ ++

The intent is that this mapping be implemented by a hashing mechanism, ++such as that described in Section 6.4 “Hashing” of The Art of Computer Programming, Volume 3 ++(pp506-549). In spite of this intent, no conforming implementation ++is required to use any particular technique to implement the mapping. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable_002dcount.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++hash-table-count (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.2.4 hash-table-count [Function]

++ ++

hash-table-count hash-tablecount ++

++

Arguments and Values::

++ ++

hash-table—a hash table. ++

++

count—a non-negative integer. ++

++

Description::

++ ++

Returns the number of entries in the hash-table. ++If hash-table has just been created ++or newly cleared (see clrhash) ++the entry count is 0. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32115135>
++ (hash-table-count table) ⇒  0
++ (setf (gethash 57 table) "fifty-seven") ⇒  "fifty-seven"
++ (hash-table-count table) ⇒  1
++ (dotimes (i 100) (setf (gethash i table) i)) ⇒  NIL
++ (hash-table-count table) ⇒  100
++
++ ++

Affected By::

++ ++

clrhash, ++remhash, ++setf of gethash ++

++

See Also::

++ ++

hash-table-size ++

++

Notes::

++ ++

The following relationships are functionally correct, although in practice ++using hash-table-count is probably much faster: ++

++
++
 (hash-table-count table) ≡
++ (loop for value being the hash-values of table count t) ≡
++ (let ((total 0))
++   (maphash #'(lambda (key value)
++                (declare (ignore key value))
++                (incf total))
++            table)
++   total)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable_002dp.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++hash-table-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.3 hash-table-p [Function]

++ ++

hash-table-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type hash-table; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32511220>
++ (hash-table-p table) ⇒  true
++ (hash-table-p 37) ⇒  false
++ (hash-table-p '((a . 1) (b . 2))) ⇒  false
++
++ ++

Notes::

++ ++
++
 (hash-table-p object) ≡ (typep object 'hash-table)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable_002drehash_002dsize.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++hash-table-rehash-size (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.2.5 hash-table-rehash-size [Function]

++ ++

hash-table-rehash-size hash-tablerehash-size ++

++

Arguments and Values::

++ ++

hash-table—a hash table. ++

++

rehash-size—a real of type (or (integer 1 *) (float (1.0) *)). ++

++

Description::

++ ++

Returns the current rehash size of hash-table, ++suitable for use in a call to make-hash-table ++in order to produce a hash table ++with state corresponding to the current state of the hash-table. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table :size 100 :rehash-size 1.4))
++⇒  #<HASH-TABLE EQL 0/100 2556371>
++ (hash-table-rehash-size table) ⇒  1.4
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if hash-table is not a hash table. ++

++

See Also::

++ ++

make-hash-table ++, ++hash-table-rehash-threshold ++

++

Notes::

++ ++

If the hash table was created with an integer rehash size, ++the result is an integer, ++indicating that the rate of growth of the hash-table when rehashed ++is intended to be additive; ++otherwise, ++the result is a float, ++indicating that the rate of growth of the hash-table when rehashed ++is intended to be multiplicative. ++However, this value is only advice to the implementation; ++the actual amount by which the hash-table will grow upon rehash is ++implementation-dependent. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable_002drehash_002dthreshold.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++hash-table-rehash-threshold (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.2.6 hash-table-rehash-threshold [Function]

++ ++

hash-table-rehash-threshold hash-tablerehash-threshold ++

++

Arguments and Values::

++ ++

hash-table—a hash table. ++

++

rehash-threshold—a real of type (real 0 1). ++

++

Description::

++ ++

Returns the current rehash threshold of hash-table, which is ++suitable for use in a call to make-hash-table in order to ++produce a hash table with state corresponding to the current ++state of the hash-table. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table :size 100 :rehash-threshold 0.5))
++⇒  #<HASH-TABLE EQL 0/100 2562446>
++ (hash-table-rehash-threshold table) ⇒  0.5
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if hash-table is not a hash table. ++

++

See Also::

++ ++

make-hash-table ++, ++hash-table-rehash-size ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable_002dsize.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++hash-table-size (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

18.2.7 hash-table-size [Function]

++ ++

hash-table-size hash-tablesize ++

++

Arguments and Values::

++ ++

hash-table—a hash table. ++

++

size—a non-negative integer. ++

++

Description::

++ ++

Returns the current size of hash-table, which is suitable for use in ++a call to make-hash-table in order to produce a hash table ++with state corresponding to the current state of the hash-table. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if hash-table is not a hash table. ++

++

See Also::

++ ++

hash-table-count ++, ++make-hash-table ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/hash_002dtable_002dtest.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++hash-table-test (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.8 hash-table-test [Function]

++ ++

hash-table-test hash-tabletest ++

++

Arguments and Values::

++ ++

hash-table—a hash table. ++

++

test—a function designator. ++ For the four standardized hash table test functions ++ (see make-hash-table), the test value returned ++ is always a symbol. If an implementation permits additional ++ tests, it is implementation-dependent whether such tests are ++ returned as function objects or function names. ++

++

Description::

++ ++

Returns the test used for comparing keys in hash-table. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if hash-table is not a hash table. ++

++

See Also::

++ ++

make-hash-table ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/identity.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++identity (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.37 identity [Function]

++ ++

identity objectobject ++

++

Arguments and Values::

++ ++

object—an object. ++

++

Description::

++ ++

Returns its argument object. ++

++

Examples::

++ ++
++
 (identity 101) ⇒  101
++ (mapcan #'identity (list (list 1 2 3) '(4 5 6))) ⇒  (1 2 3 4 5 6)
++
++ ++

Notes::

++ ++

identity is intended for use with functions that require ++a function as an argument. ++

++

(eql x (identity x)) returns true for all possible values of x, ++but (eq x (identity x)) might return false when x is a number ++or character. ++

++

identity could be defined by ++

++
++
(defun identity (x) x)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/if.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++if (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.43 if [Special Operator]

++ ++

if test-form then-form [else-form]{result}* ++

++

Arguments and Values::

++ ++

Test-form—a form. ++

++

Then-form—a form. ++

++

Else-form—a form. ++ The default is nil. ++

++

results—if the test-form yielded true, ++ the values returned by the then-form; otherwise, ++ the values returned by the else-form. ++

++

Description::

++ ++

if allows the execution of a form to be dependent ++on a single test-form. ++

++

First test-form is evaluated. ++If the result is true, then then-form is selected; ++otherwise else-form is selected. ++Whichever form is selected is then evaluated. ++

++

Examples::

++ ++
++
 (if t 1) ⇒  1
++ (if nil 1 2) ⇒  2 
++ (defun test ()
++   (dolist (truth-value '(t nil 1 (a b c)))
++     (if truth-value (print 'true) (print 'false))
++     (prin1 truth-value))) ⇒  TEST
++ (test)
++ |>  TRUE T
++ |>  FALSE NIL
++ |>  TRUE 1
++ |>  TRUE (A B C)
++⇒  NIL
++
++ ++

See Also::

++ ++

cond ++, ++unless, ++when ++

++

Notes::

++ ++
++
 (if test-form then-form else-form)
++ ≡ (cond (test-form then-form) (t else-form))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ignore.html +@@ -0,0 +1,132 @@ ++ ++ ++ ++ ++ ++ignore (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.19 ignore, ignorable [Declaration]

++ ++

Syntax::

++ ++

(ignore {var | (function fn)}*) ++

++

(ignorable {var | (function fn)}*) ++

++

Arguments::

++ ++

var—a variable name. ++

++

fn—a function name. ++

++

Valid Context::

++ ++

declaration ++

++

Binding Types Affected::

++ ++

variable, function ++

++

Description::

++ ++

The ignore and ignorable declarations ++refer to for-value references ++ to variable bindings for the vars ++and to function bindings for the fns. ++

++

An ignore declaration specifies that ++for-value references to the indicated bindings ++will not ++occur within the scope of the declaration. ++Within the scope of such a declaration, ++it is desirable ++for a compiler to issue a warning about ++the presence of ++either a for-value reference to any var or fn, ++ or a special declaration for any var. ++

++

An ignorable declaration specifies that ++for-value references to the indicated bindings ++might or might not ++occur within the scope of the declaration. ++Within the scope of such a declaration, ++it is not desirable ++for a compiler to issue a warning about ++the presence or absence of ++either a for-value reference to any var or fn, ++ or a special declaration for any var. ++

++

When not within the scope ++of a ignore or ignorable declaration, ++it is desirable ++for a compiler to issue a warning about ++any var for which there is ++neither a for-value reference ++ nor a special declaration, ++or about ++any fn for which there is ++ no for-value reference. ++

++

Any warning about a “used” or “unused” binding must be of type style-warning, ++and may not affect program semantics. ++

++

The stream variables established by ++ with-open-file, ++ with-open-stream, ++ with-input-from-string, ++ and with-output-to-string, ++and all iteration variables are, by definition, always “used”. ++Using (declare (ignore v)), ++for such a variable v has unspecified consequences. ++

++

See Also::

++ ++

declare ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ignore_002derrors.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++ignore-errors (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.28 ignore-errors [Macro]

++ ++

ignore-errors {form}*{result}* ++

++

Arguments and Values::

++ ++

forms—an implicit progn. ++

++

results—In the normal situation, ++ the values of the forms are returned; ++ in the exceptional situation, ++ two values are returned: nil and the condition. ++

++

Description::

++ ++

ignore-errors is used to prevent conditions of type error ++from causing entry into the debugger. ++

++

Specifically, ignore-errors executes forms ++in a dynamic environment where a handler for ++conditions of type error has been established; ++if invoked, it handles such conditions by ++returning two values, nil and the condition that was signaled, ++from the ignore-errors form. ++

++

If a normal return from the forms occurs, ++any values returned are returned by ignore-errors. ++

++

Examples::

++ ++
++
 (defun load-init-file (program)
++   (let ((win nil))
++     (ignore-errors ;if this fails, don't enter debugger
++       (load (merge-pathnames (make-pathname :name program :type :lisp)
++                              (user-homedir-pathname)))
++       (setq win t))
++     (unless win (format t "~&Init file failed to load.~
++     win))
++
++ (load-init-file "no-such-program")
++ |>  Init file failed to load.
++NIL
++
++ ++

See Also::

++ ++

handler-case ++, Condition System Concepts ++

++

Notes::

++ ++
++
 (ignore-errors . forms)
++
++ ++

is equivalent to: ++

++
++
 (handler-case (progn . forms)
++   (error (condition) (values nil condition)))
++
++ ++

Because the second return value is a condition ++in the exceptional case, it is common (but not required) to arrange ++for the second return value in the normal case to be missing or nil so ++that the two situations can be distinguished. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/import.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++import (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.6 import [Function]

++ ++

import symbols &optional packaget ++

++

Arguments and Values::

++ ++

symbols—a designator for a list of symbols. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

Description::

++ ++

import adds symbol or ++symbols to the internals of package, checking for name ++conflicts with existing symbols either present in package ++or accessible to it. Once the symbols have been ++imported, they may be referenced in the importing ++package without the use of a package prefix when using the Lisp reader. ++

++

A name conflict in import between the ++symbol being imported and a symbol inherited from some other package can ++be resolved in favor of the ++symbol being imported ++by making it a shadowing symbol, or in favor ++of the symbol already accessible by ++not doing the import. A ++name conflict in import with a symbol ++already present in the ++package ++may be resolved by uninterning that symbol, or by not ++doing the import. ++

++

The imported symbol is ++not automatically exported from the current package, but if it is ++already present and external, then the fact that it ++is external is not changed. ++

++

If any symbol to be imported has no home ++package (i.e., (symbol-package symbol) ⇒ nil), ++import sets the home package ++of the symbol to package. ++

++

If the symbol is already present in the importing package, ++import has no effect. ++

++

Examples::

++ ++
++
 (import 'common-lisp::car (make-package 'temp :use nil)) ⇒  T
++ (find-symbol "CAR" 'temp) ⇒  CAR, :INTERNAL
++ (find-symbol "CDR" 'temp) ⇒  NIL, NIL 
++
++ ++

The form (import 'editor:buffer) takes the external symbol named ++buffer in the EDITOR package (this symbol was located when the form ++was read by the Lisp reader) and adds it to the current package ++as an internal symbol. The symbol buffer is then present in ++the current package. ++

++

Side Effects::

++ ++

The package system is modified. ++

++

Affected By::

++ ++

Current state of the package system. ++

++

Exceptional Situations::

++ ++

import signals a correctable error of type package-error ++if any of the symbols to be imported has the same name ++(under string=) as some distinct symbol (under eql) ++already accessible in the package, even if the conflict is ++with a shadowing symbol of the package. ++

++

See Also::

++ ++

shadow ++, ++export ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/in_002dpackage.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++in-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.16 in-package [Macro]

++ ++

in-package namepackage ++

++

Arguments and Values::

++ ++

name—a string designator; not evaluated. ++

++

package—the package named by name. ++

++

Description::

++ ++

Causes the the package named by name ++to become the current package—that is, the value of *package*. ++If no such package already exists, an error of type package-error is signaled. ++

++

Everything in-package does is also performed at compile time ++if the call appears as a top level form. ++

++

Side Effects::

++ ++

The variable *package* is assigned. ++If the in-package form is a top level form, ++this assignment also occurs at compile time. ++

++

Exceptional Situations::

++ ++

An error of type package-error is signaled if the specified package does not exist. ++

++

See Also::

++ ++

package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/incf.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++incf (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.33 incf, decf [Macro]

++ ++

incf place [delta-form]new-value ++

++

decf place [delta-form]new-value ++

++

Arguments and Values::

++ ++

place—a place. ++

++

delta-form—a form; evaluated to produce a delta. ++ The default is 1. ++

++

delta—a number. ++

++

new-value—a number. ++

++

Description::

++ ++

incf and decf are used for incrementing and ++decrementing the value of place, respectively. ++

++

The delta is ++ added to (in the case of incf) ++ or subtracted from (in the case of decf) ++the number in place and the result is stored in place. ++

++

Any necessary type conversions are performed automatically. ++

++

For information about the evaluation of subforms of places, ++see Evaluation of Subforms to Places. ++

++

Examples::

++
++
 (setq n 0)
++ (incf n) ⇒  1      
++ n ⇒  1
++ (decf n 3) ⇒  -2   
++ n ⇒  -2
++ (decf n -5) ⇒  3      
++ (decf n) ⇒  2      
++ (incf n 0.5) ⇒  2.5
++ (decf n) ⇒  1.5
++ n ⇒  1.5
++
++ ++

Side Effects::

++ ++

Place is modified. ++

++

See Also::

++ ++

+, ++- ++, 1+, 1-, ++setf ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/index.html +@@ -0,0 +1,3651 @@ ++ ++ ++ ++ ++ ++Top (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

ANSI and GNU Common Lisp Document

++ ++ ++ ++ ++
++

++Next: , Previous: , Up: (dir)  

++
++
++

Top

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++
++

++Next: , Previous: , Up: (dir)  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/initialize_002dinstance.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++initialize-instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.36 initialize-instance [Standard Generic Function]

++ ++

Syntax::

++ ++

initialize-instance instance &rest initargs &key &allow-other-keysinstance ++

++

Method Signatures::

++ ++

initialize-instance (instance standard-object) &rest initargs ++

++

Arguments and Values::

++ ++

instance—an object. ++

++

initargs—a defaulted initialization argument list. ++

++

Description::

++ ++

Called by make-instance to initialize a newly created instance. ++The generic function is called with the new instance ++and the defaulted initialization argument list. ++

++

The system-supplied primary method on initialize-instance ++initializes the slots of the instance with values according ++to the initargs and the :initform forms of the slots. ++It does this by calling the generic function shared-initialize ++with the following arguments: the instance, t (this indicates ++that all slots for which no initialization arguments are provided ++should be initialized according to their :initform forms), and ++the initargs. ++

++

Programmers can define methods for initialize-instance to ++specify actions to be taken when an instance is initialized. If only ++after methods are defined, they will be run after the ++system-supplied primary method for initialization and therefore will ++not interfere with the default behavior of initialize-instance. ++

++

See Also::

++ ++

Shared-Initialize ++, ++make-instance ++, ++slot-boundp ++, ++slot-makunbound ++, ++Object Creation and Initialization, ++Rules for Initialization Arguments, ++Declaring the Validity of Initialization Arguments ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/inline.html +@@ -0,0 +1,172 @@ ++ ++ ++ ++ ++ ++inline (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.22 inline, notinline [Declaration]

++ ++

Syntax::

++ ++

(inline {function-name}*) ++

++

(notinline {function-name}*) ++

++

Arguments::

++ ++

function-name—a function name. ++

++

Valid Context::

++ ++

declaration or proclamation ++

++

Binding Types Affected::

++ ++

function ++

++

Description::

++ ++

inline specifies that ++it is desirable for the compiler to produce inline calls ++to the functions named by function-names; ++that is, the code for a specified function-name ++

++

should be integrated into the calling routine, appearing “in line” ++in place of a procedure call. ++A compiler is free to ignore this declaration. ++inline declarations never apply to variable bindings. ++

++

If one of the functions mentioned has a lexically apparent local definition ++(as made by flet or labels), then the declaration ++applies to that local definition and not to the global function definition. ++

++

While no conforming implementation is required to perform inline expansion ++of user-defined functions, those implementations that do attempt ++to recognize the following paradigm: ++

++

To define a function f that is not inline by default ++but for which (declare (inline f)) will make f be locally inlined, ++the proper definition sequence is: ++

++
++
 (declaim (inline f))
++ (defun f ...)
++ (declaim (notinline f))
++
++ ++

The inline proclamation preceding the defun form ++ensures that the compiler has the opportunity save the information ++necessary for inline expansion, and the notinline proclamation ++following the defun form prevents f from being expanded ++inline everywhere. ++

++

notinline specifies that it is ++

++

undesirable to compile the functions ++named by function-names in-line. ++A compiler is not free to ignore this declaration; ++calls to the specified functions must be implemented as out-of-line subroutine calls. ++

++

If one of the functions ++mentioned has a lexically apparent local definition ++(as made by flet or labels), then the declaration ++applies to that local definition and not to the global function definition. ++

++

In the presence of a compiler macro definition for ++function-name, a notinline declaration prevents that ++

++

compiler macro from being used. ++

++

An inline declaration may be used to encourage use of ++compiler macro definitions. inline and notinline ++declarations otherwise have no effect when the lexically visible definition ++of function-name is a macro definition. ++

++

inline and notinline declarations can be free declarations or ++bound declarations. ++inline and notinline declarations of functions that ++appear before the body of a ++ flet ++ or labels ++

++

form that defines that function are bound declarations. ++Such declarations in other contexts are free declarations. ++

++

Examples::

++ ++
++
 ;; The globally defined function DISPATCH should be open-coded,
++ ;; if the implementation supports inlining, unless a NOTINLINE 
++ ;; declaration overrides this effect.
++ (declaim (inline dispatch))
++ (defun dispatch (x) (funcall (get (car x) 'dispatch) x))
++ ;; Here is an example where inlining would be encouraged.
++ (defun top-level-1 () (dispatch (read-command)))
++ ;; Here is an example where inlining would be prohibited.
++ (defun top-level-2 ()
++   (declare (notinline dispatch))
++   (dispatch (read-command)))
++ ;; Here is an example where inlining would be prohibited.
++ (declaim (notinline dispatch))
++ (defun top-level-3 () (dispatch (read-command)))
++ ;; Here is an example where inlining would be encouraged.
++ (defun top-level-4 () 
++   (declare (inline dispatch))
++   (dispatch (read-command)))
++
++ ++

See Also::

++ ++

declare, ++declaim ++, ++proclaim ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/input_002dstream_002dp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++input-stream-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.9 input-stream-p, output-stream-p [Function]

++ ++

input-stream-p streamgeneralized-boolean ++

++

output-stream-p streamgeneralized-boolean ++

++

Arguments and Values::

++ ++

stream—a stream. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

input-stream-p returns true if stream is an input stream; ++otherwise, returns false. ++

++

output-stream-p returns true if stream is an output stream; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (input-stream-p *standard-input*) ⇒  true
++ (input-stream-p *terminal-io*) ⇒  true
++ (input-stream-p (make-string-output-stream)) ⇒  false
++
++ (output-stream-p *standard-output*) ⇒  true
++ (output-stream-p *terminal-io*) ⇒  true
++ (output-stream-p (make-string-input-stream "jr")) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/inspect.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++inspect (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.18 inspect [Function]

++ ++

inspect objectimplementation-dependent ++

++

Arguments and Values::

++ ++

object—an object. ++

++

Description::

++ ++

inspect is an interactive version of describe. ++The nature of the interaction is implementation-dependent, ++but the purpose of inspect is to make it easy to wander ++through a data structure, examining and modifying parts of it. ++

++

Side Effects::

++ ++

implementation-dependent. ++

++

Affected By::

++ ++

implementation-dependent. ++

++

Exceptional Situations::

++ ++

implementation-dependent. ++

++

See Also::

++ ++

describe ++

++

Notes::

++ ++

Implementations are encouraged to respond to the typing ++of ? or a “help key” by providing help, including a list ++of commands. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/integer.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++integer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.8 integer [System Class]

++ ++

Class Precedence List::

++

integer, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

An integer is a mathematical integer. There is no limit on the ++magnitude of an integer. ++

++

The types fixnum and bignum ++form an exhaustive partition of type integer. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(integer{[lower-limit [upper-limit]]}) ++

++

Compound Type Specifier Arguments::

++ ++

lower-limit, upper-limitinterval designators ++ for type integer. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the integers on the interval described by ++lower-limit and upper-limit. ++

++

See Also::

++ ++

Figure~2–9, ++Constructing Numbers from Tokens, ++Printing Integers ++

++

Notes::

++ ++

The type (integer lower upper), ++where lower and upper ++are most-negative-fixnum and most-positive-fixnum, respectively, ++is also called fixnum. ++

++

The type (integer 0 1) is also called bit. ++The type (integer 0 *) is also called unsigned-byte. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/integer_002dlength.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++integer-length (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.57 integer-length [Function]

++ ++

integer-length integernumber-of-bits ++

++

Arguments and Values::

++ ++

integer—an integer. ++

++

number-of-bits—a non-negative integer. ++

++

Description::

++ ++

Returns the number of bits needed to represent integer ++in binary two’s-complement format. ++

++

Examples::

++ ++
++
 (integer-length 0) ⇒  0
++ (integer-length 1) ⇒  1
++ (integer-length 3) ⇒  2
++ (integer-length 4) ⇒  3
++ (integer-length 7) ⇒  3
++ (integer-length -1) ⇒  0
++ (integer-length -4) ⇒  2
++ (integer-length -7) ⇒  3
++ (integer-length -8) ⇒  3
++ (integer-length (expt 2 9)) ⇒  10
++ (integer-length (1- (expt 2 9))) ⇒  9
++ (integer-length (- (expt 2 9))) ⇒  9
++ (integer-length (- (1+ (expt 2 9)))) ⇒  10
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if integer is not an integer. ++

++

Notes::

++ ++

This function could have been defined by: ++

++
++
(defun integer-length (integer)
++  (ceiling (log (if (minusp integer)
++                    (- integer)
++                    (1+ integer))
++                2)))
++
++ ++

If integer is non-negative, then its value can be represented ++in unsigned binary form in a field whose width in bits is ++no smaller than (integer-length integer). ++Regardless of the sign of integer, its value can be ++represented in signed binary two’s-complement form in a field ++whose width in bits is no smaller than (+ (integer-length integer) 1). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/integerp.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++integerp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.58 integerp [Function]

++ ++

integerp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type integer; ++otherwise, returns false. ++

++

Examples::

++
++
 (integerp 1) ⇒  true
++ (integerp (expt 2 130)) ⇒  true
++ (integerp 6/5) ⇒  false
++ (integerp nil) ⇒  false
++
++
++ ++

Notes::

++ ++
++
 (integerp object) ≡ (typep object 'integer)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/interactive_002dstream_002dp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++interactive-stream-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.10 interactive-stream-p [Function]

++ ++

interactive-stream-p streamgeneralized-boolean ++

++

Arguments and Values::

++ ++

stream—a stream. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if stream is an interactive stream; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (when (> measured limit)
++   (let ((error (round (* (- measured limit) 100)
++                       limit)))
++     (unless (if (interactive-stream-p *query-io*)
++                 (yes-or-no-p "The frammis is out of tolerance by ~D
++                               Is it safe to proceed? " error)
++                 (< error 15))  ;15
++       (error "The frammis is out of tolerance by ~D
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream. ++

++

See Also::

++ ++

Stream Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/intern.html +@@ -0,0 +1,146 @@ ++ ++ ++ ++ ++ ++intern (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.21 intern [Function]

++ ++

intern string &optional packagesymbol, status ++

++

Arguments and Values::

++ ++

string—a string. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

symbol—a symbol. ++

++

status—one of :inherited, :external, :internal, or nil. ++

++

Description::

++ ++

intern enters a symbol named string into package. ++If a symbol whose name is the same as string ++is already accessible in package, it is returned. ++If no such symbol is accessible in package, ++a new symbol with the given name is created ++and entered into package as an internal symbol, ++or as an external symbol if the package is the KEYWORD package; ++package becomes the home package of the created symbol. ++

++

The first value returned by intern, symbol, ++is the symbol that was found or ++created. ++The meaning of the secondary value, status, is as follows: ++

++
:internal
++

The symbol was found ++and is ++present in package as an internal symbol. ++

++
++
:external
++

The symbol was found ++and is ++present as an external symbol. ++

++
++
:inherited
++

The symbol was found ++and is inherited via use-package ++(which implies that the symbol is internal). ++

++
++
nil
++

No pre-existing symbol was found, ++so one was created. ++

++

It is implementation-dependent whether the string ++that becomes the new symbol’s name is the given ++string or a copy of it. Once a string ++has been given as the string argument to ++intern in this situation where a new symbol is created, ++the consequences are undefined if a ++subsequent attempt is made to alter that string. ++

++
++
++ ++

Examples::

++ ++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (intern "Never-Before") ⇒  |Never-Before|, NIL
++ (intern "Never-Before") ⇒  |Never-Before|, :INTERNAL 
++ (intern "NEVER-BEFORE" "KEYWORD") ⇒  :NEVER-BEFORE, NIL
++ (intern "NEVER-BEFORE" "KEYWORD") ⇒  :NEVER-BEFORE, :EXTERNAL
++
++ ++

See Also::

++ ++

find-symbol ++, ++read ++, ++symbol, ++unintern ++, ++Symbols as Tokens ++

++

Notes::

++ ++

intern does not need to do any name conflict checking ++because it never creates a new symbol ++if there is already an accessible symbol with the name given. ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/internal_002dtime_002dunits_002dper_002dsecond.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++internal-time-units-per-second (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.11 internal-time-units-per-second [Constant Variable]

++ ++

Constant Value::

++ ++

A positive integer, the magnitude of which is implementation-dependent. ++

++

Description::

++ ++

The number of internal time units in one second. ++

++

See Also::

++ ++

get-internal-run-time ++, ++get-internal-real-time ++

++

Notes::

++ ++

These units form the basis of the Internal Time format representation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/intersection.html +@@ -0,0 +1,174 @@ ++ ++ ++ ++ ++ ++intersection (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.43 intersection, nintersection [Function]

++ ++

intersection list-1 list-2 &key key test test-notresult-list ++

++

nintersection list-1 list-2 &key key test test-notresult-list ++

++

Arguments and Values::

++ ++

list-1—a proper list. ++

++

list-2—a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-list—a list. ++

++

Description::

++ ++

intersection and nintersection return a list ++that contains every element that occurs in both list-1 and list-2. ++

++

nintersection is the destructive version of intersection. ++It performs the same operation, ++but may destroy list-1 using its cells to construct the result. ++

++

list-2 is not destroyed. ++

++

The intersection operation is described as follows. ++For all possible ordered pairs consisting of ++ one element from list-1 ++and one element from list-2, ++:test or :test-not are used ++to determine whether they satisfy the test. ++The first argument to the :test or :test-not ++function is an element of list-1; the second argument is an ++element of list-2. ++If :test or :test-not is not supplied, eql ++is used. ++It is an error if :test and :test-not are supplied in ++the same function call. ++

++

If :key is supplied (and not nil), it is used to ++extract the part to be tested from the list element. ++The argument to the :key function ++is an element of either list-1 or list-2; ++the :key function typically returns part of the supplied element. ++If :key is not supplied or nil, the list-1 and ++list-2 elements are used. ++

++

For every pair that satifies the test, ++exactly one of the two elements of the pair will be put in the result. ++No element from either list appears in the result that does not ++satisfy the test for ++an element from the other list. ++If one of the lists contains duplicate ++elements, there may be duplication in the result. ++

++

There is no guarantee that the order of elements in the result will ++reflect the ordering of the arguments in any particular way. ++The result list may share cells with, ++or be eq to, either list-1 or list-2 ++if appropriate. ++

++

Examples::

++ ++
++
 (setq list1 (list 1 1 2 3 4 a b c "A" "B" "C" "d")
++       list2 (list 1 4 5 b c d "a" "B" "c" "D")) 
++  ⇒  (1 4 5 B C D "a" "B" "c" "D")
++ (intersection list1 list2) ⇒  (C B 4 1 1)
++ (intersection list1 list2 :test 'equal) ⇒  ("B" C B 4 1 1)
++ (intersection list1 list2 :test #'equalp) ⇒  ("d" "C" "B" "A" C B 4 1 1) 
++ (nintersection list1 list2) ⇒  (1 1 4 B C)
++ list1 ⇒  implementation-dependent ;e.g., (1 1 4 B C)
++ list2 ⇒  implementation-dependent ;e.g., (1 4 5 B C D "a" "B" "c" "D")
++ (setq list1 (copy-list '((1 . 2) (2 . 3) (3 . 4) (4 . 5))))
++⇒  ((1 . 2) (2 . 3) (3 . 4) (4 . 5)) 
++ (setq list2 (copy-list '((1 . 3) (2 . 4) (3 . 6) (4 . 8))))
++⇒  ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) 
++ (nintersection list1 list2 :key #'cdr) ⇒  ((2 . 3) (3 . 4)) 
++ list1 ⇒  implementation-dependent ;e.g., ((1 . 2) (2 . 3) (3 . 4)) 
++ list2 ⇒  implementation-dependent ;e.g., ((1 . 3) (2 . 4) (3 . 6) (4 . 8)) 
++
++ ++

Side Effects::

++ ++

nintersection can modify list-1, ++

++

but not list-2. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list-1 and list-2 are not proper lists. ++

++

See Also::

++ ++

union ++, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

Since the nintersection side effect is not required, ++it should not be used in for-effect-only ++ positions in portable code. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/invalid_002dmethod_002derror.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++invalid-method-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.15 invalid-method-error [Function]

++ ++

invalid-method-error method format-control &rest argsimplementation-dependent ++

++

Arguments and Values::

++ ++

method—a method. ++

++

format-control—a format control. ++

++

argsformat arguments for the format-control. ++

++

Description::

++ ++

The function invalid-method-error is used to signal an error of type error ++when there is an applicable method whose qualifiers are not valid for ++the method combination type. The error message is constructed by ++using the format-control suitable for format ++and any args to it. Because an ++implementation may need to add additional contextual information to ++the error message, invalid-method-error should be called only ++within the dynamic extent of a method combination function. ++

++

The function invalid-method-error is called automatically when a ++method fails to satisfy every qualifier pattern and predicate in a ++define-method-combination form. A method combination function ++that imposes additional restrictions should call ++invalid-method-error explicitly if it encounters a method ++it cannot accept. ++

++

Whether invalid-method-error returns to its caller or exits via ++throw is implementation-dependent. ++

++

Side Effects::

++ ++

The debugger might be entered. ++

++

Affected By::

++ ++

*break-on-signals* ++

++

See Also::

++ ++

define-method-combination ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/invoke_002ddebugger.html +@@ -0,0 +1,102 @@ ++ ++ ++ ++ ++ ++invoke-debugger (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.22 invoke-debugger [Function]

++ ++

invoke-debugger condition ++ ⇒ #<NoValue> ++

++

Arguments and Values::

++ ++

condition—a condition object. ++

++

Description::

++ ++

invoke-debugger attempts to enter the debugger with condition. ++

++

If *debugger-hook* is not nil, it should be a function ++(or the name of a function) to be called prior to entry to ++the standard debugger. The function is called with ++*debugger-hook* bound to nil, and the function ++must accept two arguments: the condition ++and the value of *debugger-hook* prior to binding it to nil. ++If the function returns normally, ++the standard debugger is entered. ++

++

The standard debugger never directly returns. Return can occur only by a ++non-local transfer of control, such as the use of a restart function. ++

++

Examples::

++ ++
++
 (ignore-errors ;Normally, this would suppress debugger entry
++   (handler-bind ((error #'invoke-debugger)) ;But this forces debugger entry
++     (error "Foo.")))
++Debug: Foo.
++To continue, type :CONTINUE followed by an option number:
++ 1: Return to Lisp Toplevel.
++Debug>
++
++ ++

Side Effects::

++ ++

*debugger-hook* is bound to nil, ++program execution is discontinued, ++and the debugger is entered. ++

++

Affected By::

++ ++

*debug-io* and *debugger-hook*. ++

++

See Also::

++ ++

error ++, ++break ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/invoke_002drestart.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++invoke-restart (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.34 invoke-restart [Function]

++ ++

invoke-restart restart &rest arguments{result}* ++

++

Arguments and Values::

++ ++

restart—a restart designator. ++

++

argument—an object. ++

++

results—the values returned by the function ++ associated with restart, if that function returns. ++

++

Description::

++ ++

Calls the function associated with restart, ++passing arguments to it. ++Restart must be valid in the current dynamic environment. ++

++

Examples::

++
++
 (defun add3 (x) (check-type x number) (+ x 3))
++
++ (foo 'seven)
++ |>  Error: The value SEVEN was not of type NUMBER.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a different value to use.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>(invoke-restart 'store-value 7)<<|
++⇒  10
++
++ ++

Side Effects::

++ ++

A non-local transfer of control might be done by the restart. ++

++

Affected By::

++ ++

Existing restarts. ++

++

Exceptional Situations::

++ ++

If restart is not valid, an error of type control-error is signaled. ++

++

See Also::

++ ++

find-restart ++, ++restart-bind ++, ++restart-case ++, ++invoke-restart-interactively ++

++

Notes::

++ ++

The most common use for invoke-restart is in a handler. ++It might be used explicitly, or implicitly through invoke-restart-interactively ++or a restart function. ++

++

Restart functions call invoke-restart, not vice versa. That is, ++invoke-restart provides primitive functionality, and restart functions ++are non-essential “syntactic sugar.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/invoke_002drestart_002dinteractively.html +@@ -0,0 +1,138 @@ ++ ++ ++ ++ ++ ++invoke-restart-interactively (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.35 invoke-restart-interactively [Function]

++ ++

invoke-restart-interactively restart{result}* ++

++

Arguments and Values::

++ ++

restart—a restart designator. ++

++

results—the values returned by the function ++ associated with restart, if that function returns. ++

++

Description::

++ ++

invoke-restart-interactively calls the function associated ++with restart, prompting for any necessary arguments. ++If restart is a name, it must be valid in the current dynamic environment. ++

++

invoke-restart-interactively ++prompts for arguments by executing ++ the code provided in the :interactive keyword to ++restart-case or ++ :interactive-function keyword to restart-bind. ++

++

If no such options have been supplied in the corresponding ++restart-bind or restart-case, ++then the consequences are undefined if the restart takes ++ required arguments. If the arguments are optional, an argument list of ++ nil is used. ++

++

Once the arguments have been determined, ++invoke-restart-interactively ++ executes the following: ++

++
++
 (apply #'invoke-restart restart arguments)
++
++ ++

Examples::

++ ++
++
 (defun add3 (x) (check-type x number) (+ x 3))
++
++ (add3 'seven)
++ |>  Error: The value SEVEN was not of type NUMBER.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a different value to use.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>(invoke-restart-interactively 'store-value)<<|
++ |>  Type a form to evaluate and use: |>>7<<|
++⇒  10
++
++ ++

Side Effects::

++ ++

If prompting for arguments is necesary, ++some typeout may occur (on query I/O). ++

++

A non-local transfer of control might be done by the restart. ++

++

Affected By::

++ ++

*query-io*, active restarts ++

++

Exceptional Situations::

++ ++

If restart is not valid, an error of type control-error ++is signaled. ++

++

See Also::

++ ++

find-restart ++, ++invoke-restart ++, ++restart-case ++, ++restart-bind ++

++

Notes::

++ ++

invoke-restart-interactively is used internally by the debugger ++and may also be useful in implementing other portable, interactive debugging ++tools. ++

++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/keyword.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++keyword (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.2 keyword [Type]

++ ++

Supertypes::

++ ++

keyword, ++symbol, ++t ++

++

Description::

++ ++

The type keyword includes all symbols interned the KEYWORD package. ++

++

Interning a symbol in the KEYWORD package has three automatic effects: ++

++
++
1.
++

It causes the symbol to become bound to itself. ++

++
2.
++

It causes the symbol to become an external symbol ++ of the KEYWORD package. ++

++
3.
++

It causes the symbol to become a constant variable. ++

++
++ ++

See Also::

++ ++

keywordp ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/keywordp.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++keywordp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.4 keywordp [Function]

++ ++

keywordp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is a keyword_1; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (keywordp 'elephant) ⇒  false
++ (keywordp 12) ⇒  false
++ (keywordp :test) ⇒  true
++ (keywordp ':test) ⇒  true
++ (keywordp nil) ⇒  false
++ (keywordp :nil) ⇒  true
++ (keywordp '(:test)) ⇒  false
++ (keywordp "hello") ⇒  false
++ (keywordp ":hello") ⇒  false
++ (keywordp '&optional) ⇒  false
++
++ ++

See Also::

++ ++

constantp ++, ++keyword ++, ++symbolp ++, ++symbol-package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/lambda-_0028Symbol_0029.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++lambda (Symbol) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.1 lambda [Symbol]

++ ++

Syntax::

++ ++

lambda lambda-list [[{declaration}* | documentation]] {form}* ++

Arguments::

++ ++

lambda-list—an ordinary lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

form—a form. ++

++

Description::

++ ++

A lambda expression is a list that can be used in place of a ++function name in certain contexts to denote a function by ++directly describing its behavior rather than indirectly by referring to the ++name of an established function. ++

++

Documentation is attached to the denoted function (if any ++is actually created) as a documentation string. ++

++

See Also::

++ ++

function, ++documentation ++, ++Lambda Expressions, ++Lambda Forms, ++Syntactic Interaction of Documentation Strings and Declarations ++

++

Notes::

++ ++

The lambda form ++

++
++
 ((lambda lambda-list . body) . arguments)
++
++ ++

is semantically equivalent to the function form ++

++
++
 (funcall #'(lambda lambda-list . body) . arguments)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/lambda.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++lambda (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.2 lambda [Macro]

++ ++

lambda lambda-list [[{declaration}* | documentation]] {form}*function ++

++

Arguments and Values::

++ ++

lambda-list—an ordinary lambda list. ++

++

declaration—a declare expression; not evaluated. ++

++

documentation—a string; not evaluated. ++

++

form—a form. ++

++

function—a function. ++

++

Description::

++ ++

Provides a shorthand notation for a function special form ++involving a lambda expression such that: ++

++
++
    (lambda lambda-list [[{declaration}* | documentation]] {form}*)
++ ≡ (function (lambda lambda-list [[{declaration}* | documentation]] {form}*))
++ ≡ #'(lambda lambda-list [[{declaration}* | documentation]] {form}*)
++
++ ++

Examples::

++ ++
++
 (funcall (lambda (x) (+ x 3)) 4) ⇒  7
++
++ ++

See Also::

++ ++

lambda (symbol) ++

++

Notes::

++ ++

This macro could be implemented by: ++

++
++
(defmacro lambda (&whole form &rest bvl-decls-and-body)
++  (declare (ignore bvl-decls-and-body))
++  `#',form)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/lambda_002dlist_002dkeywords.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++lambda-list-keywords (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.13 lambda-list-keywords [Constant Variable]

++ ++

Constant Value::

++ ++

a list, the elements of which are implementation-dependent, ++but which must contain at least the symbols ++ &allow-other-keys, ++ &aux, ++ &body, ++ &environment, ++ &key, ++ &optional, ++ &rest, ++and ++ &whole. ++

++

Description::

++ ++

A list of all the lambda list keywords used ++in the implementation, including the additional ones ++used only by macro definition forms. ++

++

See Also::

++ ++

defun ++, ++flet ++, ++defmacro ++, ++macrolet, ++The Evaluation Model ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/lambda_002dparameters_002dlimit.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++lambda-parameters-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.14 lambda-parameters-limit [Constant Variable]

++ ++

Constant Value::

++ ++

implementation-dependent, but not smaller than 50. ++

++

Description::

++ ++

A positive integer that is the upper exclusive bound on ++the number of parameter names that can appear ++in a single lambda list. ++

++

See Also::

++ ++

call-arguments-limit ++

++

Notes::

++ ++

Implementors are encouraged to make the value of ++lambda-parameters-limit as large as possible. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/last.html +@@ -0,0 +1,131 @@ ++ ++ ++ ++ ++ ++last (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.29 last [Function]

++ ++

last list &optional ntail ++

++

Arguments and Values::

++ ++

list—a list, ++

++

which might be a dotted list but must not be a circular list. ++

++

n—a non-negative integer. ++ The default is 1. ++

++

tail—an object. ++

++

Description::

++ ++

last returns the last n conses ++ (not the last n elements) of list). ++If list is (), last returns (). ++

++

If n is zero, ++ the atom that terminates list is returned. ++If n is greater than or equal to the number of cons cells in list, ++ the result is list. ++

++

Examples::

++ ++
++
 (last nil) ⇒  NIL
++ (last '(1 2 3)) ⇒  (3)
++ (last '(1 2 . 3)) ⇒  (2 . 3)
++ (setq x (list 'a 'b 'c 'd)) ⇒  (A B C D)
++ (last x) ⇒  (D)
++ (rplacd (last x) (list 'e 'f)) x ⇒  (A B C D E F)
++ (last x) ⇒  (F)
++
++ (last '(a b c))   ⇒  (C)
++
++ (last '(a b c) 0) ⇒  ()
++ (last '(a b c) 1) ⇒  (C)
++ (last '(a b c) 2) ⇒  (B C)
++ (last '(a b c) 3) ⇒  (A B C)
++ (last '(a b c) 4) ⇒  (A B C)
++
++ (last '(a . b) 0) ⇒  B
++ (last '(a . b) 1) ⇒  (A . B)
++ (last '(a . b) 2) ⇒  (A . B)
++
++ ++

Exceptional Situations::

++ ++

The consequences are undefined if list is a circular list. ++

++

Should signal an error of type type-error ++ if n is not a non-negative integer. ++

++

See Also::

++ ++

butlast ++, ++nth ++

++

Notes::

++ ++

The following code could be used to define last. ++

++
++
 (defun last (list &optional (n 1))
++   (check-type n (integer 0))
++   (do ((l list (cdr l))
++        (r list)
++        (i 0 (+ i 1)))
++       ((atom l) r)
++     (if (>= i n) (pop r))))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/lcm.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++lcm (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.34 lcm [Function]

++ ++

lcm &rest integersleast-common-multiple ++

++

Arguments and Values::

++ ++

integer—an integer. ++

++

least-common-multiple—a non-negative integer. ++

++

Description::

++ ++

lcm returns the least common multiple of the integers. ++

++

If no integer is supplied, the integer 1 is returned. ++

++

If only one integer is supplied, ++the absolute value of that integer is returned. ++

++

For two arguments that are not both zero, ++

++
++
 (lcm a b) ≡ (/ (abs (* a b)) (gcd a b))
++
++ ++

If one or both arguments are zero, ++

++
++
 (lcm a 0) ≡ (lcm 0 a) ≡ 0
++
++ ++

For three or more arguments, ++

++
++
 (lcm a b c ... z) ≡ (lcm (lcm a b) c ... z)
++
++ ++

Examples::

++
++
 (lcm 10) ⇒  10
++ (lcm 25 30) ⇒  150
++ (lcm -24 18 10) ⇒  360
++ (lcm 14 35) ⇒  70
++ (lcm 0 5) ⇒  0
++ (lcm 1 2 3 4 5 6) ⇒  60
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if any argument is not an integer. ++

++

See Also::

++ ++

gcd ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ldb.html +@@ -0,0 +1,130 @@ ++ ++ ++ ++ ++ ++ldb (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.69 ldb [Accessor]

++ ++

ldb bytespec integerbyte ++

++

(setf ( ldb bytespec place) new-byte)
++

++

Pronunciation::

++ ++

pronounced ’lid ib ++ or pronounced ’lid e b ++ or pronounced ’el ’d\=e ’b\=e ++

++

Arguments and Values::

++ ++

bytespec—a byte specifier. ++

++

integer—an integer. ++

++

byte, new-byte—a non-negative integer. ++

++

Description::

++ ++

ldb extracts and returns the byte of integer ++specified by bytespec. ++

++

ldb returns an integer in which the bits with weights ++2^(s-1) through 2^0 are the same as those in ++integer with weights 2^(p+s-1) ++through 2^p, and all other bits zero; s is ++(byte-size bytespec) ++and p is (byte-position bytespec). ++

++

setf may be used with ldb to modify ++a byte within the integer that is stored ++in a given place. ++

++

The order of evaluation, when an ldb form is supplied ++to setf, is exactly left-to-right. ++

++ ++ ++ ++ ++

The effect is to perform a dpb operation ++and then store the result back into the place. ++

++

Examples::

++ ++
++
 (ldb (byte 2 1) 10) ⇒  1
++ (setq a (list 8)) ⇒  (8)
++ (setf (ldb (byte 2 1) (car a)) 1) ⇒  1
++ a ⇒  (10)
++
++ ++

See Also::

++ ++

byte ++, ++byte-position, ++byte-size, ++dpb ++

++

Notes::

++ ++
++
 (logbitp j (ldb (byte s p) n))
++    ≡ (and (< j s) (logbitp (+ j p) n))
++
++ ++

In general, ++

++
++
 (ldb (byte 0 x) y) ⇒  0
++
++ ++

for all valid values of x and y. ++

++

Historically, the name “ldb” comes from a DEC PDP-10 assembly language ++instruction meaning “load byte.” ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ldb_002dtest.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++ldb-test (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.70 ldb-test [Function]

++ ++

ldb-test bytespec integergeneralized-boolean ++

++

Arguments and Values::

++ ++

bytespec—a byte specifier. ++

++

integer—an integer. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if any of the bits of the byte in integer ++specified by bytespec is non-zero; otherwise returns false. ++

++

Examples::

++ ++
++
 (ldb-test (byte 4 1) 16) ⇒  true
++ (ldb-test (byte 3 1) 16) ⇒  false
++ (ldb-test (byte 3 2) 16) ⇒  true
++
++ ++

See Also::

++ ++

byte ++, ++ldb ++, ++zerop ++

++

Notes::

++
++
 (ldb-test bytespec n) ≡
++ (not (zerop (ldb bytespec n))) ≡
++ (logtest (ldb bytespec -1) n)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ldiff.html +@@ -0,0 +1,164 @@ ++ ++ ++ ++ ++ ++ldiff (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.30 ldiff, tailp [Function]

++ ++

ldiff list objectresult-list ++

++

tailp object listgeneralized-boolean ++

++

Arguments and Values::

++ ++

list—a list, ++

++

which might be a dotted list. ++

++

object—an object. ++

++

result-list—a list. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

If object is the same as some tail of list, ++tailp returns true; ++otherwise, it returns false. ++

++

If object is the same as some tail of list, ++ldiff returns a fresh list ++of the elements of list ++that precede object in the list structure of list; ++otherwise, it returns a copy_2 of list. ++

++

Examples::

++ ++
++
 (let ((lists '#((a b c) (a b c . d))))
++   (dotimes (i (length lists)) ()
++     (let ((list (aref lists i)))
++       (format t "~2&list=~S ~21T(tailp object list)~
++                  ~44T(ldiff list object)~
++         (let ((objects (vector list (cddr list) (copy-list (cddr list))
++                                '(f g h) '() 'd 'x)))
++           (dotimes (j (length objects)) ()
++             (let ((object (aref objects j)))
++               (format t "~& object=~S ~21T~S ~44T~S"
++                       object (tailp object list) (ldiff list object))))))))
++ |>  
++ |>  list=(A B C)         (tailp object list)    (ldiff list object)
++ |>   object=(A B C)      T                      NIL
++ |>   object=(C)          T                      (A B)
++ |>   object=(C)          NIL                    (A B C)
++ |>   object=(F G H)      NIL                    (A B C)
++ |>   object=NIL          T                      (A B C)
++ |>   object=D            NIL                    (A B C)
++ |>   object=X            NIL                    (A B C)
++ |>  
++ |>  list=(A B C . D)     (tailp object list)    (ldiff list object)
++ |>   object=(A B C . D)  T                      NIL
++ |>   object=(C . D)      T                      (A B)
++ |>   object=(C . D)      NIL                    (A B C . D)
++ |>   object=(F G H)      NIL                    (A B C . D)
++ |>   object=NIL          NIL                    (A B C . D)
++ |>   object=D            T                      (A B C)
++ |>   object=X            NIL                    (A B C . D)
++⇒  NIL
++
++ ++

Side Effects::

++ ++

Neither ldiff nor tailp modifies either of its arguments. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list is not a proper list or a dotted list. ++

++

See Also::

++ ++

set-difference ++

++

Notes::

++ ++

If the list is a circular list, ++tailp will reliably yield a value ++only if the given object is in fact a tail of list. ++Otherwise, the consequences are unspecified: ++a given implementation which detects the circularity must return false, ++but since an implementation is not obliged to detect such a situation, ++tailp might just loop indefinitely without returning in that case. ++

++

tailp could be defined as follows: ++

++
++
 (defun tailp (object list)
++   (do ((list list (cdr list)))
++       ((atom list) (eql list object))
++      (if (eql object list)
++          (return t))))
++
++ ++

and ldiff could be defined by: ++

++
++
(defun ldiff (list object)
++  (do ((list list (cdr list))
++       (r '() (cons (car list) r)))
++      ((atom list)
++       (if (eql list object) (nreverse r) (nreconc r list)))
++    (when (eql object list)
++      (return (nreverse r)))))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/length.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++length (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.11 length [Function]

++ ++

length sequencen ++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

n—a non-negative integer. ++

++

Description::

++ ++

Returns the number of elements in sequence. ++

++

If sequence is a vector with a fill pointer, ++the active length as specified by the fill pointer is returned. ++

++

Examples::

++ ++
++
 (length "abc") ⇒  3
++ (setq str (make-array '(3) :element-type 'character 
++                            :initial-contents "abc"
++                            :fill-pointer t)) ⇒  "abc"
++ (length str) ⇒  3
++ (setf (fill-pointer str) 2) ⇒  2
++ (length str) ⇒  2
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

list-length ++, ++sequence ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/let.html +@@ -0,0 +1,183 @@ ++ ++ ++ ++ ++ ++let (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.18 let, let* [Special Operator]

++ ++

let ({var | (var [init-form])}*) {declaration}* {form}*{result}* ++

++

let* ({var | (var [init-form])}*) {declaration}* {form}*{result}* ++

++

Arguments and Values::

++ ++

var—a symbol. ++

++

init-form—a form. ++

++

declaration—a declare expression; not evaluated. ++

++

form—a form. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

let and let* ++create new variable bindings and ++execute a series of forms that use these bindings. ++let performs the bindings in parallel and ++let* does them sequentially. ++

++

The form ++

++
++
 (let ((var1 init-form-1)
++       (var2 init-form-2)
++       ...
++       (varm init-form-m))
++   declaration1
++   declaration2
++   ...
++   declarationp
++   form1
++   form2
++   ...
++   formn)
++
++ ++

first evaluates the expressions init-form-1, init-form-2, and so on, ++

++

in that order, saving the resulting values. ++Then all of the variables varj are bound to the corresponding ++values; each binding is lexical unless ++there is a special declaration to the contrary. ++The expressions formk are then evaluated ++in order; the values of all but the last are discarded ++(that is, the body of a let ++is an implicit progn). ++

++

let* ++is similar to let, but the bindings of variables ++are performed sequentially rather than in parallel. ++The expression for the init-form of a ++var can refer to vars ++previously bound in the let*. ++

++

The form ++

++
++
 (let* ((var1 init-form-1)
++        (var2 init-form-2)
++        ...
++        (varm init-form-m))
++   declaration1
++   declaration2
++   ...
++   declarationp
++   form1
++   form2
++   ...
++   formn)
++
++ ++

first evaluates the expression init-form-1, then binds the variable ++var1 to that value; then it evaluates init-form-2 and binds ++

++

var2, and so on. ++The expressions formj are then evaluated ++in order; the values of all but the last are discarded ++(that is, the body of let* is an implicit progn). ++

++

For both let and let*, ++if there is not an init-form associated with a var, ++var is initialized to nil. ++

++

The special form let ++has the property that the scope ++of the name binding does not include any ++initial value form. ++For let*, a variable’s scope also includes the ++ remaining initial value forms for subsequent variable bindings. ++

++

Examples::

++ ++
++
 (setq a 'top) ⇒  TOP
++ (defun dummy-function () a) ⇒  DUMMY-FUNCTION
++ (let ((a 'inside) (b a))
++    (format nil "~S ~S ~S" a b (dummy-function))) ⇒  "INSIDE TOP TOP" 
++ (let* ((a 'inside) (b a))
++    (format nil "~S ~S ~S" a b (dummy-function))) ⇒  "INSIDE INSIDE TOP" 
++ (let ((a 'inside) (b a))
++    (declare (special a))
++    (format nil "~S ~S ~S" a b (dummy-function))) ⇒  "INSIDE TOP INSIDE"
++
++ ++

The code ++

++
++
 (let (x)
++   (declare (integer x))
++   (setq x (gcd y z))
++   ...)
++
++ ++

is incorrect; although x is indeed set before it is used, ++and is set to a value of the declared type integer, nevertheless ++x initially takes on the value nil in violation of the type ++declaration. ++

++

See Also::

++ ++

progv ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/lisp_002dimplementation_002dtype.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++lisp-implementation-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.24 lisp-implementation-type,

++

lisp-implementation-version

++

[Function] ++

++

lisp-implementation-type <no arguments>description ++

++

lisp-implementation-version <no arguments>description ++

++

Arguments and Values::

++ ++

description—a string or nil. ++

++

Description::

++ ++

lisp-implementation-type and lisp-implementation-version ++identify the current implementation of Common Lisp. ++

++

lisp-implementation-type returns a string ++that identifies the generic name of ++the particular Common Lisp implementation. ++

++

lisp-implementation-version ++returns a string that identifies the version of ++the particular Common Lisp implementation. ++

++

If no appropriate ++and relevant result can be produced, nil is returned instead ++of a string. ++

++

Examples::

++ ++
++
 (lisp-implementation-type)
++⇒  "ACME Lisp"
++OR⇒ "Joe's Common Lisp"
++ (lisp-implementation-version)
++⇒  "1.3a"
++⇒  "V2"
++OR⇒ "Release 17.3, ECO #6"
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/list-_0028Function_0029.html +@@ -0,0 +1,116 @@ ++ ++ ++ ++ ++ ++list (Function) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.15 list, list* [Function]

++ ++

list &rest objectslist ++

++

list* &rest objects^+result ++

++

Arguments and Values::

++ ++

object—an object. ++

++

list—a list. ++

++

result—an object. ++

++

Description::

++ ++

list returns a list containing the supplied objects. ++

++

list* is like list except that ++the last argument to list becomes ++the car of the last cons constructed, while ++the last argument to list* becomes ++the cdr of the last cons constructed. ++Hence, any given call to list* always produces one fewer conses ++than a call to list with the same number of arguments. ++

++

If the last argument to list* is a list, ++the effect is to construct a new list which is similar, but ++which has additional elements added to the front corresponding to ++the preceding arguments of list*. ++

++

If list* receives only one object, ++that object is returned, regardless of whether or not it is a list. ++

++

Examples::

++ ++
++
 (list 1) ⇒  (1)
++ (list* 1) ⇒  1
++ (setq a 1) ⇒  1
++ (list a 2) ⇒  (1 2)
++ '(a 2) ⇒  (A 2)
++ (list 'a 2) ⇒  (A 2)
++ (list* a 2) ⇒  (1 . 2)
++ (list) ⇒  NIL ;i.e., ()
++ (setq a '(1 2)) ⇒  (1 2)
++ (eq a (list* a)) ⇒  true
++ (list 3 4 'a (car '(b . c)) (+ 6 -2)) ⇒  (3 4 A B 4)
++ (list* 'a 'b 'c 'd) ≡ (cons 'a (cons 'b (cons 'c 'd))) ⇒  (A B C . D)
++ (list* 'a 'b 'c '(d e f)) ⇒  (A B C D E F)
++
++ ++

See Also::

++ ++

cons ++

++

Notes::

++ ++
++
 (list* x) ≡ x
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/list-_0028System-Class_0029.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++list (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.1 list [System Class]

++ ++

Class Precedence List::

++ ++

list, ++sequence, ++t ++

++

Description::

++ ++

A list ++ ++ is a chain of conses in which the car of each ++cons is an element of the list, and the cdr of ++each cons is either the next link in the chain or a terminating ++atom. ++

++

A proper list ++ ++ is a chain of conses terminated by ++the empty list ++ ++, (), which is itself a proper list. ++A dotted list ++ ++ is a list which has a terminating atom ++that is not the empty list. ++A circular list ++ ++ is a chain of conses that has no termination ++because some cons in the chain is the cdr of a later cons. ++

++

Dotted lists and circular lists are also lists, but usually ++the unqualified term “list” within this specification means proper list. ++Nevertheless, the type list unambiguously includes dotted lists ++and circular lists. ++

++

For each element of a list there is a cons. ++The empty list has no elements and is not a cons. ++

++

The types cons and null form an exhaustive partition ++of the type list. ++

++

See Also::

++ ++

Left-Parenthesis, ++Printing Lists and Conses ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/list_002dall_002dpackages.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++list-all-packages (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.7 list-all-packages [Function]

++ ++

list-all-packages <no arguments>packages ++

++

Arguments and Values::

++ ++

packages—a list of package objects. ++

++

Description::

++ ++

list-all-packages returns a ++

++

fresh ++

++

list of ++

++

all registered packages. ++

++

Examples::

++ ++
++
 (let ((before (list-all-packages)))
++    (make-package 'temp)
++    (set-difference (list-all-packages) before)) ⇒  (#<PACKAGE "TEMP">)
++
++ ++

Affected By::

++ ++

defpackage, ++delete-package, ++make-package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/list_002dlength.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++list-length (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.16 list-length [Function]

++ ++

list-length listlength ++

++

Arguments and Values::

++ ++

list—a proper list or a circular list. ++

++

length—a non-negative integer, or nil. ++

++

Description::

++ ++

Returns the length of list if list is a proper list. ++Returns nil if list is a circular list. ++

++

Examples::

++ ++
++
 (list-length '(a b c d)) ⇒  4
++ (list-length '(a (b c) d)) ⇒  3
++ (list-length '()) ⇒  0
++ (list-length nil) ⇒  0
++ (defun circular-list (&rest elements)
++   (let ((cycle (copy-list elements))) 
++     (nconc cycle cycle)))
++ (list-length (circular-list 'a 'b)) ⇒  NIL
++ (list-length (circular-list 'a)) ⇒  NIL
++ (list-length (circular-list)) ⇒  0
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if list is not a proper list or a circular list. ++

++

See Also::

++ ++

length ++

++

Notes::

++ ++

list-length could be implemented as follows: ++

++
++
 (defun list-length (x)  
++   (do ((n 0 (+ n 2))           ;Counter.
++        (fast x (cddr fast))    ;Fast pointer: leaps by 2.
++        (slow x (cdr slow)))    ;Slow pointer: leaps by 1.
++       (nil)
++     ;; If fast pointer hits the end, return the count.
++     (when (endp fast) (return n))
++     (when (endp (cdr fast)) (return (+ n 1)))
++     ;; If fast pointer eventually equals slow pointer,
++     ;;  then we must be stuck in a circular list.
++     ;; (A deeper property is the converse: if we are
++     ;;  stuck in a circular list, then eventually the
++     ;;  fast pointer will equal the slow pointer.
++     ;;  That fact justifies this implementation.)
++     (when (and (eq fast slow) (> n 0)) (return nil))))
++
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/listen.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++listen (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.34 listen [Function]

++ ++

listen &optional input-streamgeneralized-boolean ++

++

Arguments and Values::

++ ++

input-stream—an input stream designator. ++ The default is standard input. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if ++there is a character immediately available from input-stream; ++otherwise, returns false. ++On a non-interactive input-stream, ++listen returns true except when at end of file_1. ++If an end of file is encountered, listen returns false. ++listen is intended to be used ++when input-stream obtains characters ++from an interactive device such as a keyboard. ++

++

Examples::

++ ++
++
 (progn (unread-char (read-char)) (list (listen) (read-char)))
++ |>  |>>1<<|
++⇒  (T #\1)
++ (progn (clear-input) (listen))
++⇒  NIL ;Unless you're a very fast typist!
++
++ ++

Affected By::

++ ++

*standard-input* ++

++

See Also::

++ ++

interactive-stream-p ++, ++read-char-no-hang ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/listp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++listp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.17 listp [Function]

++ ++

listp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type list; ++otherwise, returns false. ++

++

Examples::

++
++
 (listp nil) ⇒  true
++ (listp (cons 1 2)) ⇒  true
++ (listp (make-array 6)) ⇒  false
++ (listp t) ⇒  false
++
++ ++

See Also::

++ ++

consp ++

++

Notes::

++ ++

If object is a cons, ++listp does not check whether object is a proper list; ++it returns true for any kind of list. ++

++
++
 (listp object) ≡ (typep object 'list) ≡ (typep object '(or cons null))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/load.html +@@ -0,0 +1,231 @@ ++ ++ ++ ++ ++ ++load (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

24.2.3 load [Function]

++ ++

load filespec &key verbose print ++ if-does-not-exist external-format
++ ⇒ generalized-boolean ++

++

Arguments and Values::

++ ++

filespec—a stream, or a pathname designator. ++ The default is taken from *default-pathname-defaults*. ++

++

verbose—a generalized boolean. ++ The default is the value of *load-verbose*. ++

++

print—a generalized boolean. ++ The default is the value of *load-print*. ++

++

if-does-not-exist—a generalized boolean. ++ The default is true. ++

++

external-format—an external file format designator. ++ The default is :default. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

load loads the file named by filespec ++into the Lisp environment. ++

++

The manner in which a source file ++is distinguished from a compiled file is implementation-dependent. ++If the file specification is not complete and both a source file and a ++compiled file exist which might match, ++then which of those files load selects is implementation-dependent. ++

++

If filespec is a stream, ++load determines what kind of stream it is ++and loads directly from the stream. ++

++

If filespec is a logical pathname, ++it is translated into a physical pathname ++as if by calling translate-logical-pathname. ++

++

load sequentially executes each form it encounters ++in the file named by filespec. ++If the file is a source file ++and the implementation chooses to perform implicit compilation, ++load must recognize top level forms ++as described in Processing of Top Level Forms ++and arrange for each top level form to be executed ++before beginning implicit compilation of the next. ++(Note, however, that processing of eval-when forms ++by load is controlled by the :execute situation.) ++

++

If verbose is true, ++load prints a message in the form of a comment ++(i.e., with a leading semicolon) ++to standard output indicating what file is being loaded ++and other useful information. ++

++

If verbose is false, ++load does not print this information. ++

++

If print is true, ++load incrementally prints information to standard output ++showing the progress of the loading process. ++For a source file, ++this information might mean printing the values ++yielded by each form in the file ++as soon as those values are returned. ++For a compiled file, ++what is printed might not reflect precisely the contents of the source file, ++but some information is generally printed. ++If print is false, ++load does not print this information. ++

++

If the file named by filespec is successfully loaded, ++load returns true. ++

++

[Reviewer Note by Loosemore: What happens if the file cannot be loaded for some reason other ++than that it doesn’t exist?] ++[Editorial Note by KMP: i.e., can it return NIL? must it?] ++

++

If the file does not exist, ++the specific action taken depends on if-does-not-exist: ++if it is nil, load returns nil; ++otherwise, load signals an error. ++

++

The external-format specifies the external file format ++to be used when opening the file (see the function open), ++except that when the file named by filespec is a compiled file, ++the external-format is ignored. ++compile-file and load cooperate ++in an implementation-dependent way to assure ++the preservation of the similarity of characters ++referred to in the source file ++at the time the source file was processed by the file compiler ++under a given external file format, ++regardless of the value of external-format ++at the time the compiled file is loaded. ++

++

load binds *readtable* and *package* ++to the values they held before loading the file. ++

++

*load-truename* is bound by load to hold ++the truename of the pathname of the file being loaded. ++

++

*load-pathname* is bound by load to hold ++a pathname that represents filespec merged against the defaults. ++That is, (pathname (merge-pathnames filespec)). ++

++

Examples::

++ ++
++
;Establish a data file...
++ (with-open-file (str "data.in" :direction :output :if-exists :error)
++   (print 1 str) (print '(setq a 888) str) t)
++⇒  T
++ (load "data.in") ⇒  true
++ a ⇒  888
++ (load (setq p (merge-pathnames "data.in")) :verbose t)
++; Loading contents of file /fred/data.in
++; Finished loading /fred/data.in
++⇒  true
++ (load p :print t) 
++; Loading contents of file /fred/data.in
++;  1
++;  888
++; Finished loading /fred/data.in
++⇒  true
++
++ ++
++
 ;----[Begin file SETUP]----
++ (in-package "MY-STUFF")
++ (defmacro compile-truename () `',*compile-file-truename*)
++ (defvar *my-compile-truename* (compile-truename) "Just for debugging.")
++ (defvar *my-load-pathname* *load-pathname*)
++ (defun load-my-system ()
++   (dolist (module-name '("FOO" "BAR" "BAZ"))
++     (load (merge-pathnames module-name *my-load-pathname*))))
++ ;----[End of file SETUP]----
++
++ (load "SETUP")
++ (load-my-system)
++
++ ++

Affected By::

++ ++

The implementation, and the host computer’s file system. ++

++

Exceptional Situations::

++ ++

If :if-does-not-exist is supplied and is true, or is not supplied, ++load signals an error of type file-error if the file named by ++filespec does not exist, ++

++

or if the file system cannot perform the requested operation. ++

++

An error of type file-error might be signaled if ++(wild-pathname-p filespec) returns true. ++

++

See Also::

++ ++

error ++, ++merge-pathnames ++, ++*load-verbose*, ++*default-pathname-defaults*, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/load_002dlogical_002dpathname_002dtranslations.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++load-logical-pathname-translations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.7 load-logical-pathname-translations [Function]

++ ++

load-logical-pathname-translations hostjust-loaded ++

++

Arguments and Values::

++ ++

host—a string. ++

++

just-loaded—a generalized boolean. ++

++

Description::

++ ++

Searches for and loads the definition of a logical host named host, ++if it is not already defined. ++The specific nature of the search is implementation-defined. ++

++

If the host is already defined, ++no attempt to find or load a definition is attempted, ++and false is returned. ++If the host is not already defined, ++but a definition is successfully found and loaded, ++true is returned. ++Otherwise, an error is signaled. ++

++

Examples::

++ ++
++
 (translate-logical-pathname "hacks:weather;barometer.lisp.newest")
++ |>  Error: The logical host HACKS is not defined.
++ (load-logical-pathname-translations "HACKS")
++ |>  ;; Loading SYS:SITE;HACKS.TRANSLATIONS
++ |>  ;; Loading done.
++⇒  true
++ (translate-logical-pathname "hacks:weather;barometer.lisp.newest")
++⇒  #P"HELIUM:[SHARED.HACKS.WEATHER]BAROMETER.LSP;0"
++ (load-logical-pathname-translations "HACKS")
++⇒  false
++
++ ++

Exceptional Situations::

++ ++

If no definition is found, an error of type error is signaled. ++

++

See Also::

++ ++

logical-pathname ++

++

Notes::

++ ++

Logical pathname definitions will be created not just by ++implementors but also by programmers. As such, ++it is important that the search strategy be documented. ++For example, an implementation might define that the ++definition of a host is to be found in a file called ++“host.translations” in some specifically named directory. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/load_002dtime_002dvalue.html +@@ -0,0 +1,197 @@ ++ ++ ++ ++ ++ ++load-time-value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.6 load-time-value [Special Operator]

++ ++

load-time-value form &optional read-only-pobject ++

++

Arguments and Values::

++ ++

form—a form; evaluated as described below. ++

++

read-only-p—a boolean; not evaluated. ++

++

object—the primary value resulting from evaluating form. ++

++

Description::

++ ++

load-time-value provides a mechanism for delaying evaluation of form ++until the expression is in the run-time environment; see Compilation. ++

++

Read-only-p designates whether the result can be considered a ++constant object. ++If t, ++ the result is a read-only quantity that can, ++ if appropriate to the implementation, ++ be copied into read-only space and/or coalesced with similar ++ constant objects from other programs. ++If nil (the default), ++ the result must be neither copied nor coalesced; ++ it must be considered to be potentially modifiable data. ++

++

If a load-time-value expression is processed by compile-file, ++the compiler performs its normal semantic processing (such as macro expansion ++and translation into machine code) on form, but arranges for the ++execution of form to occur at load time in a null lexical environment, ++with the result of this evaluation then being treated as ++a literal object ++at run time. It is guaranteed that the evaluation of form ++will take place only once when the file is loaded, but ++the order of evaluation with respect to the evaluation of ++top level forms in the file is implementation-dependent. ++

++ ++ ++ ++ ++

If a load-time-value expression appears within a function compiled ++with compile, the form is evaluated at compile time in a ++null lexical environment. The result of this compile-time evaluation ++is treated as ++a literal object ++in the compiled code. ++

++

If a load-time-value expression is processed by eval, ++form is evaluated in a null lexical environment, ++and one value is returned. Implementations that implicitly compile ++(or partially compile) expressions processed by eval ++might evaluate form only once, at the time this compilation is performed. ++

++

If the same list (load-time-value form) is ++evaluated or compiled more than once, it is implementation-dependent ++whether form is evaluated only once or is evaluated more than once. ++This can happen both when an expression being evaluated or compiled shares ++substructure, and when the same form is processed by eval or ++compile multiple times. ++Since a load-time-value expression can be ++ referenced in more than one place and can be evaluated multiple times ++ by eval, it is ++implementation-dependent whether each execution returns ++ a fresh object ++or returns the same object as some other execution. ++ Users must use caution when destructively modifying the resulting ++ object. ++

++

If two lists (load-time-value form) ++that are the same under equal but are not identical ++are evaluated or compiled, ++their values always come from distinct evaluations of form. ++Their values may not be coalesced ++unless read-only-p is t. ++

++

Examples::

++ ++
++
;;; The function INCR1 always returns the same value, even in different images.
++;;; The function INCR2 always returns the same value in a given image, 
++;;; but the value it returns might vary from image to image.
++(defun incr1 (x) (+ x #.(random 17)))
++(defun incr2 (x) (+ x (load-time-value (random 17))))
++
++;;; The function FOO1-REF references the nth element of the first of 
++;;; the *FOO-ARRAYS* that is available at load time.  It is permissible for
++;;; that array to be modified (e.g., by SET-FOO1-REF); FOO1-REF will see the
++;;; updated values.
++(defvar *foo-arrays* (list (make-array 7) (make-array 8)))
++(defun foo1-ref (n) (aref (load-time-value (first *my-arrays*) nil) n))
++(defun set-foo1-ref (n val) 
++  (setf (aref (load-time-value (first *my-arrays*) nil) n) val))
++
++;;; The function BAR1-REF references the nth element of the first of 
++;;; the *BAR-ARRAYS* that is available at load time.  The programmer has
++;;; promised that the array will be treated as read-only, so the system 
++;;; can copy or coalesce the array.
++(defvar *bar-arrays* (list (make-array 7) (make-array 8)))
++(defun bar1-ref (n) (aref (load-time-value (first *my-arrays*) t) n))
++
++;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced
++;;; even though NIL was specified, because the object was already read-only
++;;; when it was written as a literal vector rather than created by a constructor.
++;;; User programs must treat the vector v as read-only.
++(defun baz-ref (n)
++  (let ((v (load-time-value #(A B C) nil)))
++    (values (svref v n) v)))
++
++;;; This use of LOAD-TIME-VALUE permits the indicated vector to be coalesced
++;;; even though NIL was specified in the outer situation because T was specified
++;;; in the inner situation.  User programs must treat the vector v as read-only.
++(defun baz-ref (n)
++  (let ((v (load-time-value (load-time-value (vector 1 2 3) t) nil)))
++    (values (svref v n) v)))
++
++ ++

See Also::

++ ++

compile-file ++, ++compile ++, ++eval ++, ++Minimal Compilation, ++Compilation ++

++

Notes::

++ ++

load-time-value must appear outside of quoted structure in a ++“for evaluation” position. In situations which would appear to call ++for use of load-time-value within a quoted structure, ++the backquote reader macro is probably called for; ++see Backquote. ++

++

Specifying nil for read-only-p is not a way to force an object ++to become modifiable if it has already been made read-only. It is only a way ++to say that, for an object that is modifiable, this operation is not intended ++to make that object read-only. ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/locally.html +@@ -0,0 +1,120 @@ ++ ++ ++ ++ ++ ++locally (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.27 locally [Special Operator]

++ ++

locally {declaration}* {form}*{result}* ++

++

Arguments and Values::

++ ++

Declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values of the forms. ++

++

Description::

++ ++

Sequentially evaluates a body of forms ++in a lexical environment where the given declarations have effect. ++

++

Examples::

++ ++
++
 (defun sample-function (y)  ;this y is regarded as special
++   (declare (special y))                                
++   (let ((y t))              ;this y is regarded as lexical
++     (list y
++           (locally (declare (special y))
++             ;; this next y is regarded as special
++             y))))
++⇒  SAMPLE-FUNCTION
++ (sample-function nil) ⇒  (T NIL) 
++ (setq x '(1 2 3) y '(4 . 5)) ⇒  (4 . 5)
++
++;;; The following declarations are not notably useful in specific.
++;;; They just offer a sample of valid declaration syntax using LOCALLY.
++ (locally (declare (inline floor) (notinline car cdr))
++          (declare (optimize space))
++    (floor (car x) (cdr y))) ⇒  0, 1
++
++ ++
++
;;; This example shows a definition of a function that has a particular set
++;;; of OPTIMIZE settings made locally to that definition.
++ (locally (declare (optimize (safety 3) (space 3) (speed 0)))
++   (defun frob (w x y &optional (z (foo x y)))
++     (mumble x y z w)))
++⇒  FROB
++
++;;; This is like the previous example, except that the optimize settings
++;;; remain in effect for subsequent definitions in the same compilation unit.
++ (declaim (optimize (safety 3) (space 3) (speed 0)))
++ (defun frob (w x y &optional (z (foo x y)))
++   (mumble x y z w))
++⇒  FROB
++
++ ++

See Also::

++ ++

declare ++

++

Notes::

++ ++

The special declaration may be used with locally ++to affect references to, rather than bindings of, variables. ++

++

If a locally form is a top level form, the body forms ++are also processed as top level forms. See File Compilation. ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/log.html +@@ -0,0 +1,146 @@ ++ ++ ++ ++ ++ ++log (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.35 log [Function]

++ ++

log number &optional baselogarithm ++

++

Arguments and Values::

++ ++

number—a non-zero number. ++

++

base—a number. ++

++

logarithm—a number. ++

++

Description::

++ ++

log returns the logarithm of number in base base. ++If base is not supplied its value is e, ++the base of the natural logarithms. ++

++

log may return a complex when given a ++

++

real ++

++

negative number. ++

++
++
 (log -1.0) ≡ (complex 0.0 (float pi 0.0))
++
++ ++

If base is zero, ++log returns zero. ++

++

The result of (log 8 2) may be either 3 or 3.0, depending on the ++implementation. An implementation can use floating-point calculations ++even if an exact integer result is possible. ++

++

The branch cut for the logarithm function of one argument (natural ++logarithm) lies along the negative real axis, continuous with quadrant II. ++The domain excludes the origin. ++

++

The mathematical definition of a complex logarithm ++is as follows, whether or not minus zero is supported by the ++implementation: ++

++
++
(log x) ≡ (complex (log (abs x)) (phase x))
++
++ ++

Therefore the range of the one-argument logarithm function is that strip ++of the complex plane containing numbers with imaginary parts between ++

++

-\pi (exclusive) and~\pi (inclusive) if minus zero is not supported, ++or -\pi (inclusive) and~\pi (inclusive) if minus zero is supported. ++

++

The two-argument logarithm function is defined as ++

++
++
 (log base number)
++ ≡ (/ (log number) (log base))
++
++ ++

This defines the principal values precisely. ++The range of the two-argument logarithm function is the entire complex plane. ++

++

Examples::

++ ++
++
 (log 100 10)
++⇒  2.0
++⇒  2
++ (log 100.0 10) ⇒  2.0
++ (log #c(0 1) #c(0 -1))
++⇒  #C(-1.0 0.0)
++OR⇒ #C(-1 0)
++ (log 8.0 2) ⇒  3.0
++
++ ++
++
 (log #c(-16 16) #c(2 2)) ⇒  3 or approximately #c(3.0 0.0)
++                               or approximately 3.0 (unlikely)
++
++ ++

Affected By::

++ ++

The implementation. ++

++

See Also::

++ ++

exp ++, ++expt, ++Rule of Float Substitutability ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logand.html +@@ -0,0 +1,197 @@ ++ ++ ++ ++ ++ ++logand (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.62 logand, logandc1, logandc2, logeqv, logior,

++

lognand, lognor, lognot, logorc1, logorc2,

++

logxor

++

[Function] ++

++

logand &rest integersresult-integer ++

++

logandc 1integer-1 integer-2 ++ result-integer ++logandc 2integer-1 integer-2 ++ result-integer ++logeqv &rest integersresult-integer ++

++

logior &rest integersresult-integer ++

++

lognand integer-1 integer-2result-integer ++

++

lognor integer-1 integer-2result-integer ++

++

lognot integerresult-integer ++

++

logorc 1integer-1 integer-2 ++ result-integer ++logorc 2integer-1 integer-2 ++ result-integer ++logxor &rest integersresult-integer ++

++

Arguments and Values::

++ ++

integersintegers. ++

++

integer—an integer. ++

++

integer-1—an integer. ++

++

integer-2—an integer. ++

++

result-integer—an integer. ++

++

Description::

++ ++

The functions ++ logandc1, ++ logandc2, ++ logand, ++ logeqv, ++ logior, ++ lognand, ++ lognor, ++ lognot, ++ logorc1, ++ logorc2, ++ and logxor ++perform bit-wise logical operations on their arguments, ++that are treated as if they were binary. ++

++

Figure 12–17 lists the meaning of each of the functions. ++Where an ‘identity’ is shown, it indicates the value yielded ++by the function when no arguments are supplied. ++

++
++
  Function  Identity  Operation performed                         
++  logandc1  —       and complement of integer-1 with integer-2  
++  logandc2  —       and integer-1 with complement of integer-2  
++  logand    -1        and                                         
++  logeqv    -1        equivalence (exclusive nor)                 
++  logior    0         inclusive or                                
++  lognand   —       complement of integer-1 and integer-2       
++  lognor    —       complement of integer-1 or integer-2        
++  lognot    —       complement                                  
++  logorc1   —       or complement of integer-1 with integer-2   
++  logorc2   —       or integer-1 with complement of integer-2   
++  logxor    0         exclusive or                                
++
++       Figure 12–17: Bit-wise Logical Operations on Integers     
++
++
++ ++

Negative integers are treated as if they were in two’s-complement notation. ++

++

Examples::

++ ++
++
 (logior 1 2 4 8) ⇒  15
++ (logxor 1 3 7 15) ⇒  10
++ (logeqv) ⇒  -1
++ (logand 16 31) ⇒  16
++ (lognot 0) ⇒  -1
++ (lognot 1) ⇒  -2
++ (lognot -1) ⇒  0
++ (lognot (1+ (lognot 1000))) ⇒  999
++
++;;; In the following example, m is a mask.  For each bit in
++;;; the mask that is a 1, the corresponding bits in x and y are
++;;; exchanged.  For each bit in the mask that is a 0, the 
++;;; corresponding bits of x and y are left unchanged.
++ (flet ((show (m x y)
++          (format t "~
++                  m x y)))
++   (let ((m #o007750)
++         (x #o452576)
++         (y #o317407))
++     (show m x y)
++     (let ((z (logand (logxor x y) m)))
++       (setq x (logxor z x))
++       (setq y (logxor z y))
++       (show m x y))))
++ |>  m = #o007750
++ |>  x = #o452576
++ |>  y = #o317407
++ |>  
++ |>  m = #o007750
++ |>  x = #o457426
++ |>  y = #o312557
++⇒  NIL
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if any argument is not an integer. ++

++

See Also::

++ ++

boole ++

++

Notes::

++ ++

(logbitp k -1) returns true for all values of k. ++

++

Because the following functions are not associative, ++they take exactly two arguments rather than any number ++of arguments. ++

++
++
 (lognand n1 n2) ≡ (lognot (logand n1 n2))
++ (lognor n1 n2) ≡ (lognot (logior n1 n2))
++ (logandc1 n1 n2) ≡ (logand (lognot n1) n2)
++ (logandc2 n1 n2) ≡ (logand n1 (lognot n2))
++ (logiorc1 n1 n2) ≡ (logior (lognot n1) n2)
++ (logiorc2 n1 n2) ≡ (logior n1 (lognot n2))
++ (logbitp j (lognot x)) ≡ (not (logbitp j x))
++
++ ++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logbitp.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++logbitp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.63 logbitp [Function]

++ ++

logbitp index integergeneralized-boolean ++

++

Arguments and Values::

++ ++

index—a non-negative integer. ++

++

integer—an integer. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

logbitp is used to test the value of a particular bit ++in integer, that is treated as if it were binary. ++The value of logbitp is true if the bit in integer ++whose index is index (that is, its weight is 2^index) ++is a one-bit; otherwise it is false. ++

++

Negative integers are treated as if they were in ++two’s-complement notation. ++

++

Examples::

++
++
 (logbitp 1 1) ⇒  false
++ (logbitp 0 1) ⇒  true
++ (logbitp 3 10) ⇒  true
++ (logbitp 1000000 -1) ⇒  true
++ (logbitp 2 6) ⇒  true
++ (logbitp 0 6) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if index is not a non-negative integer. ++Should signal an error of type type-error ++ if integer is not an integer. ++

++

Notes::

++ ++
++
 (logbitp k n) ≡ (ldb-test (byte 1 k) n)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logcount.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++logcount (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.64 logcount [Function]

++ ++

logcount integernumber-of-on-bits ++

++

Arguments and Values::

++ ++

integer—an integer. ++

++

number-of-on-bits—a non-negative integer. ++

++

Description::

++ ++

Computes and returns the number of bits ++in the two’s-complement binary representation of integer ++that are ‘on’ or ‘set’. ++If integer is negative, the 0 bits are counted; ++otherwise, the 1 bits are counted. ++

++

Examples::

++ ++
++
 (logcount 0) ⇒  0
++ (logcount -1) ⇒  0
++ (logcount 7) ⇒  3
++ (logcount  13) ⇒  3 ;Two's-complement binary: ...0001101
++ (logcount -13) ⇒  2 ;Two's-complement binary: ...1110011
++ (logcount  30) ⇒  4 ;Two's-complement binary: ...0011110
++ (logcount -30) ⇒  4 ;Two's-complement binary: ...1100010
++ (logcount (expt 2 100)) ⇒  1
++ (logcount (- (expt 2 100))) ⇒  100
++ (logcount (- (1+ (expt 2 100)))) ⇒  1
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its argument is not an integer. ++

++

Notes::

++ ++

Even if the implementation does not represent integers internally ++in two’s complement binary, logcount behaves as if it did. ++

++

The following identity always holds: ++

++
++
    (logcount x)
++ ≡ (logcount (- (+ x 1)))
++ ≡ (logcount (lognot x))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logical_002dpathname-_0028System-Class_0029.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++logical-pathname (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.2 logical-pathname [System Class]

++ ++

Class Precedence List::

++ ++

logical-pathname, ++pathname, ++t ++

++

Description::

++ ++

A pathname that uses a namestring syntax that is ++implementation-independent, ++and that has component values that are implementation-independent. ++Logical pathnames do not refer directly to filenames ++

++

See Also::

++ ++

File System Concepts, ++Sharpsign P, ++Printing Pathnames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logical_002dpathname.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++logical-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.9 logical-pathname [Function]

++ ++

logical-pathname pathspeclogical-pathname ++

++

Arguments and Values::

++ ++

pathspec—a logical pathname, ++ a logical pathname namestring, ++ or a stream. ++

++

logical-pathname—a logical pathname. ++

++

Description::

++ ++

logical-pathname converts pathspec to a ++logical pathname and returns the new logical pathname. ++If pathspec is a logical pathname namestring, ++it should contain a host component and its following colon. ++If pathspec is a stream, it should be one ++for which pathname returns a logical pathname. ++

++

If pathspec is a stream, the stream can be either open or closed. ++logical-pathname returns the same logical pathname after a ++file is closed as it did when the file was open. ++

++

It is an error if pathspec is a stream that is ++created with ++ make-two-way-stream, ++ make-echo-stream, ++ make-broadcast-stream, ++ make-concatenated-stream, ++ make-string-input-stream, ++or ++ make-string-output-stream. ++

++

Exceptional Situations::

++ ++

Signals an error of type type-error if pathspec isn’t supplied correctly. ++

++

See Also::

++ ++

logical-pathname, ++translate-logical-pathname ++, ++Logical Pathnames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logical_002dpathname_002dtranslations.html +@@ -0,0 +1,242 @@ ++ ++ ++ ++ ++ ++logical-pathname-translations (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.8 logical-pathname-translations [Accessor]

++ ++

logical-pathname-translations hosttranslations ++

++

(setf ( logical-pathname-translations host) new-translations)
++

++

Arguments and Values::

++ ++

host–a logical host designator. ++

++

translations, new-translations—a list. ++

++

Description::

++ ++

Returns the host’s list of translations. ++Each translation is a list of at least two elements: ++from-wildcard and to-wildcard. Any ++ additional elements are implementation-defined. ++From-wildcard is a ++ logical pathname whose host is host. ++To-wildcard is a pathname. ++

++

[Reviewer Note by Laddaga: Can this be a logical pathname?] ++

++

(setf (logical-pathname-translations host) translations) sets a ++logical pathname host’s ++list of translations. If host ++is a string that has ++ not been previously used as ++a logical pathname host, a new ++logical pathname host is defined; ++otherwise an existing host’s translations are ++ replaced. logical pathname host names are compared with string-equal. ++

++

When setting the translations list, each from-wildcard ++can be a logical pathname whose ++host is host or a logical pathname namestring ++ parseable by (parse-namestring string host), ++where host ++ represents the appropriate object as defined ++by parse-namestring. Each ++ to-wildcard can be anything coercible to a ++pathname by ++ (pathname to-wildcard). ++If to-wildcard coerces to a logical pathname, ++translate-logical-pathname ++will perform repeated translation steps when ++ it uses it. ++

++

host is either the host component of a ++logical pathname or a ++ string that has been defined ++as a logical pathname host name by setf of ++logical-pathname-translations. ++

++

Examples::

++ ++

[Reviewer Note by Laddaga: Shouldn’t there be some *.*’s in the list ++ of translations for PROG below?] ++

++
++
 ;;;A very simple example of setting up a logical pathname host.  No
++ ;;;translations are necessary to get around file system restrictions, so
++ ;;;all that is necessary is to specify the root of the physical directory
++ ;;;tree that contains the logical file system.
++ ;;;The namestring syntax on the right-hand side is implementation-dependent.
++ (setf (logical-pathname-translations "foo")
++       '(("**;*.*.*"              "MY-LISPM:>library>foo>**>")))
++
++ ;;;Sample use of that logical pathname.  The return value
++ ;;;is implementation-dependent.          
++ (translate-logical-pathname "foo:bar;baz;mum.quux.3")
++⇒  #P"MY-LISPM:>library>foo>bar>baz>mum.quux.3"
++
++ ;;;A more complex example, dividing the files among two file servers
++ ;;;and several different directories.  This Unix doesn't support
++ ;;;:WILD-INFERIORS in the directory, so each directory level must
++ ;;;be translated individually.  No file name or type translations
++ ;;;are required except for .MAIL to .MBX.
++ ;;;The namestring syntax on the right-hand side is implementation-dependent.
++ (setf (logical-pathname-translations "prog")
++       '(("RELEASED;*.*.*"        "MY-UNIX:/sys/bin/my-prog/")
++         ("RELEASED;*;*.*.*"      "MY-UNIX:/sys/bin/my-prog/*/")
++         ("EXPERIMENTAL;*.*.*"    "MY-UNIX:/usr/Joe/development/prog/")
++         ("EXPERIMENTAL;DOCUMENTATION;*.*.*"
++                                  "MY-VAX:SYS$DISK:[JOE.DOC]")
++         ("EXPERIMENTAL;*;*.*.*"  "MY-UNIX:/usr/Joe/development/prog/*/")
++         ("MAIL;**;*.MAIL"        "MY-VAX:SYS$DISK:[JOE.MAIL.PROG...]*.MBX")))
++
++ ;;;Sample use of that logical pathname.  The return value
++ ;;;is implementation-dependent.          
++ (translate-logical-pathname "prog:mail;save;ideas.mail.3")
++⇒  #P"MY-VAX:SYS$DISK:[JOE.MAIL.PROG.SAVE]IDEAS.MBX.3"
++
++ ;;;Example translations for a program that uses three files main.lisp,
++ ;;;auxiliary.lisp, and documentation.lisp.  These translations might be
++ ;;;supplied by a software supplier as examples.
++
++ ;;;For Unix with long file names
++ (setf (logical-pathname-translations "prog")
++       '(("CODE;*.*.*"             "/lib/prog/")))
++
++ ;;;Sample use of that logical pathname.  The return value
++ ;;;is implementation-dependent.          
++ (translate-logical-pathname "prog:code;documentation.lisp")
++⇒  #P"/lib/prog/documentation.lisp"
++
++ ;;;For Unix with 14-character file names, using .lisp as the type
++ (setf (logical-pathname-translations "prog")
++       '(("CODE;DOCUMENTATION.*.*" "/lib/prog/docum.*")
++         ("CODE;*.*.*"             "/lib/prog/")))
++
++ ;;;Sample use of that logical pathname.  The return value
++ ;;;is implementation-dependent.          
++ (translate-logical-pathname "prog:code;documentation.lisp")
++⇒  #P"/lib/prog/docum.lisp"
++
++ ;;;For Unix with 14-character file names, using .l as the type
++ ;;;The second translation shortens the compiled file type to .b
++ (setf (logical-pathname-translations "prog")
++       `(("**;*.LISP.*"            ,(logical-pathname "PROG:**;*.L.*"))
++         (,(compile-file-pathname (logical-pathname "PROG:**;*.LISP.*"))
++                                   ,(logical-pathname "PROG:**;*.B.*"))
++         ("CODE;DOCUMENTATION.*.*" "/lib/prog/documentatio.*")
++         ("CODE;*.*.*"             "/lib/prog/")))
++
++ ;;;Sample use of that logical pathname.  The return value
++ ;;;is implementation-dependent.          
++ (translate-logical-pathname "prog:code;documentation.lisp")
++⇒  #P"/lib/prog/documentatio.l"
++
++ ;;;For a Cray with 6 character names and no directories, types, or versions.
++ (setf (logical-pathname-translations "prog")
++       (let ((l '(("MAIN" "PGMN")
++                  ("AUXILIARY" "PGAUX")
++                  ("DOCUMENTATION" "PGDOC")))
++             (logpath (logical-pathname "prog:code;"))
++             (phypath (pathname "XXX")))
++         (append
++           ;; Translations for source files
++           (mapcar #'(lambda (x)
++                       (let ((log (first x))
++                             (phy (second x)))
++                         (list (make-pathname :name log
++                                              :type "LISP"
++                                              :version :wild
++                                              :defaults logpath)
++                               (make-pathname :name phy
++                                              :defaults phypath))))
++                   l)
++           ;; Translations for compiled files
++           (mapcar #'(lambda (x)
++                       (let* ((log (first x))
++                              (phy (second x))
++                              (com (compile-file-pathname
++                                     (make-pathname :name log
++                                                    :type "LISP"
++                                                    :version :wild
++                                                    :defaults logpath))))
++                         (setq phy (concatenate 'string phy "B"))
++                         (list com
++                               (make-pathname :name phy
++                                              :defaults phypath))))
++                   l))))
++
++ ;;;Sample use of that logical pathname.  The return value
++ ;;;is implementation-dependent.          
++ (translate-logical-pathname "prog:code;documentation.lisp")
++⇒  #P"PGDOC"
++
++ ++

Exceptional Situations::

++ ++

If host is incorrectly supplied, ++an error of type type-error is signaled. ++

++

See Also::

++ ++

logical-pathname, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

Implementations can define additional functions ++that operate on logical pathname hosts, ++for example to specify additional translation rules or options. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/logtest.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++logtest (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.65 logtest [Function]

++ ++

logtest integer-1 integer-2generalized-boolean ++

++

Arguments and Values::

++ ++

integer-1—an integer. ++

++

integer-2—an integer. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if any of the bits designated by the 1’s ++in integer-1 is 1 in integer-2; ++otherwise it is false. ++integer-1 and integer-2 are treated as if they were binary. ++

++

Negative integer-1 and integer-2 are treated as if ++they were represented in two’s-complement binary. ++

++

Examples::

++ ++
++
 (logtest 1 7) ⇒  true
++ (logtest 1 2) ⇒  false
++ (logtest -2 -1) ⇒  true
++ (logtest 0 -1) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if integer-1 is not an integer. ++Should signal an error of type type-error ++ if integer-2 is not an integer. ++

++

Notes::

++ ++
++
 (logtest x y) ≡ (not (zerop (logand x y)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/loop.html +@@ -0,0 +1,242 @@ ++ ++ ++ ++ ++ ++loop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++
++

6.2.4 loop [Macro]

++ ++

The “simple” loop form: ++

++

loop {compound-form}*{result}* ++

++

The “extended” loop form: ++

++

loop [!name-clause] ++ {!variable-clause}* ++ {!main-clause}*{result}* ++

++

name-clause ::=named name ++

++

variable-clause ::=!with-clause | !initial-final | !for-as-clause ++

++

with-clause ::=with var1 [type-spec] [form1] {and var2 [type-spec] [form2]}* ++

++

main-clause ::=!unconditional | !accumulation | !conditional | !termination-test | !initial-final ++

++

initial-final ::=initially {compound-form}^+ | finally {compound-form}^+ ++

++

unconditional ::={do | doing} {compound-form}^+ | return {form | it} ++

++

accumulation ::=!list-accumulation | !numeric-accumulation ++

++

list-accumulation ::={collect | collecting | append | appending | nconc | nconcing} {form | it ++                      [into simple-var] ++

++

numeric-accumulation ::={count | counting | sum | summing | }                          maximize | maximizing | minimize | minimizing {form | it ++                         [into simple-var] [type-spec] ++

++

conditional ::={if | when | unlessform !selectable-clause {and !selectable-clause}*  ++                [else !selectable-clause {and !selectable-clause}*]  ++                [end] ++

++

selectable-clause ::=!unconditional | !accumulation | !conditional ++

++

termination-test ::=while form | until form | repeat form | always form | never form | thereis form ++

++

for-as-clause ::={for | as} !for-as-subclause {and !for-as-subclause}* ++

++

for-as-subclause ::=!for-as-arithmetic | !for-as-in-list | !for-as-on-list | !for-as-equals-then | ++                     !for-as-across | !for-as-hash | !for-as-package ++

++

for-as-arithmetic ::=var [type-spec] !for-as-arithmetic-subclause ++

++

for-as-arithmetic-subclause ::=!arithmetic-up | !arithmetic-downto | !arithmetic-downfrom ++

++

arithmetic-up ::=[[{from | upfromform1 | {to | upto | belowform2 | by form3]]^+ ++

++

arithmetic-downto ::=[[{from form1}^1 | {{downto | aboveform2}^1 | by form3]] ++

++

arithmetic-downfrom ::=[[{downfrom form1}^1 | {to | downto | aboveform2 | by form3]] ++

++

for-as-in-list ::=var [type-spec] in form1 [by step-fun] ++

++

for-as-on-list ::=var [type-spec] on form1 [by step-fun] ++

++

for-as-equals-then ::=var [type-spec] = form1 [then form2] ++

++

for-as-across ::=var [type-spec] across vector ++

++

for-as-hash ::=var [type-spec] being {each | the ++                {{hash-key | hash-keys} {in | ofhash-table  ++                [using (hash-value other-var)] |  ++                {hash-value | hash-values} {in | ofhash-table  ++                [using (hash-key other-var)]} ++

++

for-as-package ::=var [type-spec] being {each | the ++                   {symbol | symbols | ++                   present-symbol | present-symbols | ++                   external-symbol | external-symbols ++                   [{in | ofpackage] ++

++

type-spec ::=!simple-type-spec | !destructured-type-spec ++

++

simple-type-spec ::=fixnum | float | t | nil ++

++

destructured-type-spec ::=of-type d-type-spec ++

++

d-type-spec ::=type-specifier | (d-type-spec . d-type-spec) ++

++

var ::=!d-var-spec ++

++

var1 ::=!d-var-spec ++

++

var2 ::=!d-var-spec ++

++

other-var ::=!d-var-spec ++

++

d-var-spec ::=simple-var | nil | (!d-var-spec . !d-var-spec) ++

++

Arguments and Values::

++ ++

compound-form—a compound form. ++

++

name—a symbol. ++

++

simple-var—a symbol (a variable name). ++

++

form, form1, form2, form3—a form. ++

++

step-fun—a form that evaluates to a function of one argument. ++

++

vector—a form that evaluates to a vector. ++

++

hash-table—a form that evaluates to a hash table. ++

++

package—a form that evaluates to a package designator. ++

++

type-specifier—a type specifier. ++ This might be either an atomic type specifier or a compound type specifier, ++ which introduces some additional complications to proper parsing in the face of ++ destructuring; for further information, see Destructuring. ++

++

result—an object. ++

++

Description::

++ ++

For details, see The LOOP Facility. ++

++

Examples::

++ ++
++
;; An example of the simple form of LOOP.
++ (defun sqrt-advisor ()
++   (loop (format t "~&Number: ")
++         (let ((n (parse-integer (read-line) :junk-allowed t)))
++           (when (not n) (return))
++           (format t "~&The square root of ~D is ~D.~%" n (sqrt n)))))
++⇒  SQRT-ADVISOR
++ (sqrt-advisor)
++ |>  Number: |>>5 [<–~]<<|
++ |>  The square root of 5 is 2.236068.
++ |>  Number: |>>4 [<–~]<<|
++ |>  The square root of 4 is 2.
++ |>  Number: |>>done [<–~]<<|
++⇒  NIL
++
++;; An example of the extended form of LOOP.
++ (defun square-advisor ()
++   (loop as n = (progn (format t "~&Number: ")
++                       (parse-integer (read-line) :junk-allowed t))
++         while n
++         do (format t "~&The square of ~D is ~D.~
++⇒  SQUARE-ADVISOR
++ (square-advisor)
++ |>  Number: |>>4 [<–~]<<|
++ |>  The square of 4 is 16.
++ |>  Number: |>>23 [<–~]<<|
++ |>  The square of 23 is 529.
++ |>  Number: |>>done [<–~]<<|
++⇒  NIL
++
++;; Another example of the extended form of LOOP.
++ (loop for n from 1 to 10
++       when (oddp n)
++         collect n)
++⇒  (1 3 5 7 9)
++
++ ++

See Also::

++ ++

do ++, ++dolist ++, ++dotimes ++, ++return ++, ++go ++, ++throw ++, ++Destructuring ++

++

Notes::

++ ++

Except that loop-finish cannot be used within a simple loop form, ++a simple loop form is related to an extended loop form ++in the following way: ++

++
++
 (loop {compound-form}*) ≡ (loop do {compound-form}*)
++
++ ++
++
++

++Next: , Previous: , Up: Iteration Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/loop_002dfinish.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++loop-finish (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Iteration Dictionary  

++
++
++

6.2.5 loop-finish [Local Macro]

++ ++

Syntax::

++ ++

loop-finish <no arguments> ⇒ #<NoValue> ++

++

Description::

++ ++

The loop-finish macro can be used lexically within ++an extended ++loop form ++to terminate that form “normally.” ++That is, it transfers control to the loop epilogue ++of the lexically innermost extended loop form. ++This permits execution of any finally clause (for effect) ++and ++the return of ++any accumulated result. ++

++

Examples::

++ ++
++
;; Terminate the loop, but return the accumulated count.
++ (loop for i in '(1 2 3 stop-here 4 5 6)
++       when (symbolp i) do (loop-finish)
++       count i)
++⇒  3
++
++;; The preceding loop is equivalent to:
++ (loop for i in '(1 2 3 stop-here 4 5 6)
++       until (symbolp i)
++       count i)
++⇒  3
++
++;; While LOOP-FINISH can be used can be used in a variety of 
++;; situations it is really most needed in a situation where a need
++;; to exit is detected at other than the loop's `top level'
++;; (where UNTIL or WHEN often work just as well), or where some 
++;; computation must occur between the point where a need to exit is
++;; detected and the point where the exit actually occurs.  For example:
++ (defun tokenize-sentence (string)
++   (macrolet ((add-word (wvar svar)
++                `(when ,wvar
++                   (push (coerce (nreverse ,wvar) 'string) ,svar)
++                   (setq ,wvar nil))))
++     (loop with word = '() and sentence = '() and endpos = nil
++           for i below (length string)
++           do (let ((char (aref string i)))
++                (case char
++                  (#\Space (add-word word sentence))
++                  (#\. (setq endpos (1+ i)) (loop-finish))
++                  (otherwise (push char word))))
++           finally (add-word word sentence)
++                   (return (values (nreverse sentence) endpos)))))
++⇒  TOKENIZE-SENTENCE
++
++ (tokenize-sentence "this is a sentence. this is another sentence.")
++⇒  ("this" "is" "a" "sentence"), 19
++
++ (tokenize-sentence "this is a sentence")
++⇒  ("this" "is" "a" "sentence"), NIL
++
++
++ ++

Side Effects::

++ ++

Transfers control. ++

++

Exceptional Situations::

++ ++

Whether or not loop-finish is fbound in the ++global environment is implementation-dependent; ++however, the restrictions on redefinition and shadowing of ++loop-finish are the same as for symbols in the COMMON-LISP package ++which are fbound in the global environment. ++The consequences of attempting to use loop-finish outside ++of loop are undefined. ++

++

See Also::

++ ++

loop ++, ++The LOOP Facility ++

++

Notes::

++ ++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Iteration Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/machine_002dinstance.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++machine-instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.26 machine-instance [Function]

++ ++

machine-instance <no arguments>description ++

++

Arguments and Values::

++ ++

description—a string or nil. ++

++

Description::

++ ++

Returns a string that identifies the particular instance of ++the computer hardware on which Common Lisp is running, ++or nil if no such string can be computed. ++

++

Examples::

++ ++
++
 (machine-instance)
++⇒  "ACME.COM"
++OR⇒ "S/N 123231"
++OR⇒ "18.26.0.179"
++OR⇒ "AA-00-04-00-A7-A4"
++
++ ++

Affected By::

++ ++

The machine instance, ++and the implementation. ++

++

See Also::

++ ++

machine-type ++, ++machine-version ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/machine_002dtype.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++machine-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.27 machine-type [Function]

++ ++

machine-type <no arguments>description ++

++

Arguments and Values::

++ ++

description—a string or nil. ++

++

Description::

++ ++

Returns a string that identifies the generic name of ++the computer hardware on which Common Lisp is running. ++

++

Examples::

++ ++
++
 (machine-type)
++⇒  "DEC PDP-10"
++OR⇒ "Symbolics LM-2"
++
++ ++

Affected By::

++ ++

The machine type. ++The implementation. ++

++

See Also::

++ ++

machine-version ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/machine_002dversion.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++machine-version (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.28 machine-version [Function]

++ ++

machine-version <no arguments>description ++

++

Arguments and Values::

++ ++

description—a string or nil. ++

++

Description::

++ ++

Returns a string that identifies the version of the computer hardware ++on which Common Lisp is running, or nil if no such value can be computed. ++

++

Examples::

++ ++
++
 (machine-version) ⇒  "KL-10, microcode 9"
++
++ ++

Affected By::

++ ++

The machine version, ++and the implementation. ++

++

See Also::

++ ++

machine-type ++, ++machine-instance ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/macro_002dfunction.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++macro-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.11 macro-function [Accessor]

++ ++

macro-function symbol &optional environmentfunction ++

++

(setf ( macro-function symbol &optional environment) new-function)
++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

environment—an environment object. ++

++

function—a macro function or nil. ++

++

new-function—a macro function. ++

++

Description::

++ ++

Determines whether symbol has a function definition ++as a macro in the specified environment. ++

++

If so, the macro expansion function, a function of two arguments, ++is returned. If symbol has no function definition ++in the lexical environment environment, or its definition ++is not a macro, macro-function returns nil. ++

++

It is possible for both macro-function and ++

++

special-operator-p ++

++

to return true of symbol. The macro definition must ++be available for use by programs that understand only the standard ++Common Lisp special forms. ++

++

Examples::

++
++
 (defmacro macfun (x) '(macro-function 'macfun)) ⇒  MACFUN 
++ (not (macro-function 'macfun)) ⇒  false 
++
++ ++
++
 (macrolet ((foo (&environment env)
++               (if (macro-function 'bar env)
++                  ''yes
++                  ''no)))
++    (list (foo)
++          (macrolet ((bar () :beep))
++             (foo))))
++
++⇒  (NO YES)
++
++ ++

Affected By::

++

(setf macro-function), defmacro, and macrolet. ++

++

Exceptional Situations::

++ ++

The consequences are undefined if environment is non-nil ++in a use of setf of macro-function. ++

++

See Also::

++ ++

defmacro ++, Evaluation ++

++

Notes::

++ ++

setf can be used with macro-function to install ++a macro as a symbol’s global function definition: ++

++
++
 (setf (macro-function symbol) fn)
++
++ ++

The value installed must be a function that accepts two arguments, ++the entire macro call and an environment, ++and computes the expansion for that call. ++Performing this operation causes symbol to have only that ++macro definition as its global function definition; any previous ++definition, whether as a macro or as a ++function, is lost. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/macroexpand.html +@@ -0,0 +1,211 @@ ++ ++ ++ ++ ++ ++macroexpand (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.12 macroexpand, macroexpand-1 [Function]

++ ++

macroexpand form &optional envexpansion, expanded-p ++

++

macroexpand- 1form &optional env ++ expansion, expanded-p ++

++

Arguments and Values::

++ ++

form—a form. ++

++

env—an environment object. ++ The default is nil. ++

++

expansion—a form. ++

++

expanded-p—a generalized boolean. ++

++

Description::

++ ++

macroexpand and macroexpand-1 expand macros. ++

++

If form is a macro form, ++then macroexpand-1 expands the macro form call once. ++

++

macroexpand ++repeatedly expands form until it is no longer a macro form. ++In effect, macroexpand calls macroexpand-1 repeatedly ++until the secondary value it returns is nil. ++

++

If form is a macro form, ++then the expansion is a macro expansion ++ and expanded-p is true. ++Otherwise, ++ the expansion is the given form ++ and expanded-p is false. ++

++

Macro expansion is carried out as follows. ++Once macroexpand-1 has ++determined that the form is a macro form, ++it obtains an appropriate expansion function for the ++macro or symbol macro. ++The value of ++*macroexpand-hook* is ++

++

coerced to a function and ++

++

then called as a function of three arguments: ++ the expansion function, ++ the form, ++ and the env. ++The value returned from this call is taken to be the expansion ++of the form. ++

++

In addition to macro definitions in the global environment, ++any local macro definitions established within env by macrolet ++or symbol-macrolet are considered. ++If only form is supplied as an argument, ++then the environment is effectively null, and only global macro definitions ++as established by defmacro are considered. ++Macro definitions are shadowed by local function definitions. ++

++

Examples::

++ ++
++
 (defmacro alpha (x y) `(beta ,x ,y)) ⇒  ALPHA
++ (defmacro beta (x y) `(gamma ,x ,y)) ⇒  BETA
++ (defmacro delta (x y) `(gamma ,x ,y)) ⇒  EPSILON
++ (defmacro expand (form &environment env)
++   (multiple-value-bind (expansion expanded-p)
++       (macroexpand form env)
++     `(values ',expansion ',expanded-p))) ⇒  EXPAND
++ (defmacro expand-1 (form &environment env)
++   (multiple-value-bind (expansion expanded-p)
++       (macroexpand-1 form env)
++     `(values ',expansion ',expanded-p))) ⇒  EXPAND-1
++
++;; Simple examples involving just the global environment
++ (macroexpand-1 '(alpha a b)) ⇒  (BETA A B), true
++ (expand-1 (alpha a b)) ⇒  (BETA A B), true
++ (macroexpand '(alpha a b)) ⇒  (GAMMA A B), true
++ (expand (alpha a b)) ⇒  (GAMMA A B), true
++ (macroexpand-1 'not-a-macro) ⇒  NOT-A-MACRO, false
++ (expand-1 not-a-macro) ⇒  NOT-A-MACRO, false
++ (macroexpand '(not-a-macro a b)) ⇒  (NOT-A-MACRO A B), false
++ (expand (not-a-macro a b)) ⇒  (NOT-A-MACRO A B), false
++
++;; Examples involving lexical environments
++ (macrolet ((alpha (x y) `(delta ,x ,y)))
++   (macroexpand-1 '(alpha a b))) ⇒  (BETA A B), true
++ (macrolet ((alpha (x y) `(delta ,x ,y)))
++   (expand-1 (alpha a b))) ⇒  (DELTA A B), true
++ (macrolet ((alpha (x y) `(delta ,x ,y)))
++   (macroexpand '(alpha a b))) ⇒  (GAMMA A B), true
++ (macrolet ((alpha (x y) `(delta ,x ,y)))
++   (expand (alpha a b))) ⇒  (GAMMA A B), true
++ (macrolet ((beta (x y) `(epsilon ,x ,y)))
++   (expand (alpha a b))) ⇒  (EPSILON A B), true
++ (let ((x (list 1 2 3)))
++   (symbol-macrolet ((a (first x)))
++     (expand a))) ⇒  (FIRST X), true
++ (let ((x (list 1 2 3)))
++   (symbol-macrolet ((a (first x)))
++     (macroexpand 'a))) ⇒  A, false
++ (symbol-macrolet ((b (alpha x y)))
++   (expand-1 b)) ⇒  (ALPHA X Y), true
++ (symbol-macrolet ((b (alpha x y)))
++   (expand b)) ⇒  (GAMMA X Y), true
++ (symbol-macrolet ((b (alpha x y))
++                   (a b))
++   (expand-1 a)) ⇒  B, true
++ (symbol-macrolet ((b (alpha x y))
++                   (a b))
++   (expand a)) ⇒  (GAMMA X Y), true
++
++;; Examples of shadowing behavior
++ (flet ((beta (x y) (+ x y)))
++   (expand (alpha a b))) ⇒  (BETA A B), true
++ (macrolet ((alpha (x y) `(delta ,x ,y)))
++   (flet ((alpha (x y) (+ x y)))
++     (expand (alpha a b)))) ⇒  (ALPHA A B), false
++ (let ((x (list 1 2 3)))
++   (symbol-macrolet ((a (first x)))
++     (let ((a x))
++       (expand a)))) ⇒  A, false
++
++ ++

Affected By::

++ ++

defmacro, ++setf of macro-function, ++macrolet, ++symbol-macrolet ++

++

See Also::

++ ++

*macroexpand-hook*, ++defmacro ++, ++setf ++ of ++macro-function ++, ++macrolet, ++symbol-macrolet ++, ++Evaluation ++

++

Notes::

++ ++

Neither macroexpand nor macroexpand-1 ++makes any explicit attempt to expand macro forms that are ++either subforms of the form ++ or subforms of the expansion. ++Such expansion might occur implicitly, however, ++due to the semantics or implementation of the macro function. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002darray.html +@@ -0,0 +1,316 @@ ++ ++ ++ ++ ++ ++make-array (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.7 make-array [Function]

++ ++

make-array dimensions &key element-type ++ initial-element ++ initial-contents ++ adjustable ++ fill-pointer ++ displaced-to ++ displaced-index-offset
++ ⇒ new-array ++

++

Arguments and Values::

++ ++

dimensions—a designator for a list of valid array dimensions. ++

++

element-type—a type specifier. ++ The default is t. ++

++

initial-element—an object. ++

++

initial-contents—an object. ++

++

adjustable—a generalized boolean. ++ The default is nil. ++

++

fill-pointer—a valid fill pointer for the array to be created, ++ or t or nil. ++ The default is nil. ++

++

displaced-to—an array or nil. ++ The default is nil. ++ This option must not be supplied if either initial-element ++ or initial-contents is supplied. ++

++

displaced-index-offset—a valid array row-major index ++ for displaced-to. The default is 0. ++ This option must not be supplied unless a non-nil displaced-to is supplied. ++

++

new-array—an array. ++

++

Description::

++ ++

Creates and returns an array constructed of the most specialized ++type that can accommodate elements of type given by element-type. ++If dimensions is nil then a zero-dimensional array is created. ++

++

Dimensions represents the dimensionality of the new array. ++

++

element-type indicates the type of the elements intended to be stored ++in the new-array. The new-array can actually store any objects ++of the type which results from upgrading element-type; ++see Array Upgrading. ++

++

If initial-element is supplied, ++it is used to initialize each element of new-array. ++If initial-element is supplied, ++it must be of the type given by element-type. ++initial-element cannot be supplied if either the :initial-contents option ++is supplied or displaced-to is non-nil. ++If initial-element is not supplied, ++

++

the consequences of later reading an uninitialized element of new-array ++are undefined ++

++

unless either initial-contents is supplied ++or displaced-to is non-nil. ++

++

initial-contents is used to initialize the contents of array. ++For example: ++

++
++
 (make-array '(4 2 3) :initial-contents
++             '(((a b c) (1 2 3))
++              ((d e f) (3 1 2))
++              ((g h i) (2 3 1))
++              ((j k l) (0 0 0))))
++
++ ++

initial-contents is composed of a nested structure of sequences. ++The numbers of levels in the structure must equal the rank of array. ++Each leaf of the nested structure must be of the type given by element-type. ++If array is zero-dimensional, then initial-contents specifies the single ++element. Otherwise, initial-contents must be a sequence ++whose length is equal to the first dimension; each element must be a nested ++structure for an array whose dimensions are the remaining dimensions, ++and so on. ++Initial-contents cannot be supplied if either ++initial-element is supplied ++or displaced-to is non-nil. ++If initial-contents is not supplied, ++

++

the consequences of later reading an uninitialized element of new-array ++are undefined ++

++

unless either initial-element is supplied ++or displaced-to is non-nil. ++

++

If adjustable is non-nil, ++the array is expressly adjustable ++ (and so actually adjustable); ++otherwise, the array is not expressly adjustable ++ (and it is implementation-dependent whether ++ the array is actually adjustable). ++

++

If fill-pointer is non-nil, ++the array must be one-dimensional; ++that is, the array must be a vector. ++If fill-pointer is t, ++the length of the vector is used to initialize the fill pointer. ++If fill-pointer is an integer, ++it becomes the initial fill pointer for the vector. ++

++

If displaced-to is non-nil, ++make-array will create a displaced array ++and displaced-to is the target of that displaced array. ++In that case, the consequences are undefined if the actual array element type of ++displaced-to is not type equivalent to the actual array element type ++of the array being created. ++If displaced-to is nil, the array is not a displaced array. ++

++

The displaced-index-offset is made to be the index offset of the array. ++When an array A is given as ++the :displaced-to argument to make-array ++when creating array B, ++then array B is said to be displaced to array A. The ++total number of elements in an array, ++called the total size of the array, ++is calculated as the product of all the dimensions. ++It is required that the total size of A be no smaller than the sum ++of the total size of B plus the offset n supplied by ++the displaced-index-offset. ++The effect of displacing is that array B does not have any ++elements of its own, but instead maps accesses to itself into ++accesses to array A. The mapping treats both arrays as if they ++were one-dimensional by taking the elements in row-major order, ++and then maps an access to element k of array B to an access to element ++k+n of array A. ++

++

If make-array is called with adjustable, fill-pointer, ++and displaced-to each nil, ++then the result is a simple array. ++

++

If make-array is called with one or more of adjustable, ++fill-pointer, or displaced-to being true, whether the ++resulting array is a simple array is implementation-dependent. ++

++

When an array A is given as the :displaced-to argument to ++ make-array when creating array B, then array B is said to ++ be displaced to array A. The total number of elements in an array, ++ called the total size of the array, is calculated as the product ++ of all the dimensions. ++The consequences are unspecified if ++the total size of A is smaller than the sum ++of the total size of B plus the offset n supplied by ++the displaced-index-offset. ++The effect of displacing is that array B does not have any ++elements of its own, but instead maps accesses to itself into ++accesses to array A. The mapping treats both arrays as if they ++were one-dimensional by taking the elements in row-major order, ++and then maps an access to element k of array B to an access ++to element k+n of array A. ++

++

Examples::

++
++
++
++ (make-array 5) ;; Creates a one-dimensional array of five elements.
++ (make-array '(3 4) :element-type '(mod 16)) ;; Creates a 
++                ;;two-dimensional array, 3 by 4, with four-bit elements.
++ (make-array 5 :element-type 'single-float) ;; Creates an array of single-floats.
++
++ ++
++
 (make-array nil :initial-element nil) ⇒  #0ANIL
++ (make-array 4 :initial-element nil) ⇒  #(NIL NIL NIL NIL)
++ (make-array '(2 4) 
++              :element-type '(unsigned-byte 2) 
++              :initial-contents '((0 1 2 3) (3 2 1 0)))
++⇒  #2A((0 1 2 3) (3 2 1 0))
++ (make-array 6
++              :element-type 'character 
++              :initial-element #\a 
++              :fill-pointer 3) ⇒  "aaa"
++
++ ++

The following is an example of making a displaced array. ++

++
++
 (setq a (make-array '(4 3))) 
++⇒  #<ARRAY 4x3 simple 32546632>
++ (dotimes (i 4)
++   (dotimes (j 3)
++     (setf (aref a i j) (list i 'x j '= (* i j)))))
++⇒  NIL
++ (setq b (make-array 8 :displaced-to a
++                       :displaced-index-offset 2))
++⇒  #<ARRAY 8 indirect 32550757>
++ (dotimes (i 8)
++   (print (list i (aref b i))))
++ |>  (0 (0 X 2 = 0)) 
++ |>  (1 (1 X 0 = 0)) 
++ |>  (2 (1 X 1 = 1)) 
++ |>  (3 (1 X 2 = 2)) 
++ |>  (4 (2 X 0 = 0)) 
++ |>  (5 (2 X 1 = 2)) 
++ |>  (6 (2 X 2 = 4)) 
++ |>  (7 (3 X 0 = 0)) 
++⇒  NIL
++
++ ++

The last example depends on the fact that arrays are, in effect, ++stored in row-major order. ++

++
++
 (setq a1 (make-array 50))
++⇒  #<ARRAY 50 simple 32562043>
++ (setq b1 (make-array 20 :displaced-to a1 :displaced-index-offset 10))
++⇒  #<ARRAY 20 indirect 32563346>
++ (length b1) ⇒  20
++
++ (setq a2 (make-array 50 :fill-pointer 10))
++⇒  #<ARRAY 50 fill-pointer 10 46100216>
++ (setq b2 (make-array 20 :displaced-to a2 :displaced-index-offset 10))
++⇒  #<ARRAY 20 indirect 46104010>
++ (length a2) ⇒  10
++ (length b2) ⇒  20
++
++ (setq a3 (make-array 50 :fill-pointer 10))
++⇒  #<ARRAY 50 fill-pointer 10 46105663>
++ (setq b3 (make-array 20 :displaced-to a3 :displaced-index-offset 10
++                         :fill-pointer 5))
++⇒  #<ARRAY 20 indirect, fill-pointer 5 46107432>
++ (length a3) ⇒  10
++ (length b3) ⇒  5
++
++ ++

See Also::

++ ++

adjustable-array-p ++, ++aref ++, ++arrayp ++, ++array-element-type ++, ++array-rank-limit ++, ++array-dimension-limit ++, ++fill-pointer ++, ++upgraded-array-element-type ++

++

Notes::

++ ++

There is no specified way to create an array ++for which adjustable-array-p definitely ++returns false. ++There is no specified way to create an array ++that is not a simple array. ++

++
++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dbroadcast_002dstream.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++make-broadcast-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.41 make-broadcast-stream [Function]

++ ++

make-broadcast-stream &rest streamsbroadcast-stream ++

++

Arguments and Values::

++ ++

stream—an output stream. ++

++

broadcast-stream—a broadcast stream. ++

++

Description::

++ ++

Returns a broadcast stream. ++

++

Examples::

++ ++
++
 (setq a-stream (make-string-output-stream)
++        b-stream (make-string-output-stream)) ⇒  #<String Output Stream>
++ (format (make-broadcast-stream a-stream b-stream)
++          "this will go to both streams") ⇒  NIL
++ (get-output-stream-string a-stream) ⇒  "this will go to both streams"
++ (get-output-stream-string b-stream) ⇒  "this will go to both streams"
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if any stream is not an output stream. ++

++

See Also::

++ ++

broadcast-stream-streams ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dconcatenated_002dstream.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++make-concatenated-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.47 make-concatenated-stream [Function]

++ ++

make-concatenated-stream &rest input-streamsconcatenated-stream ++

++

Arguments and Values::

++ ++

input-stream—an input stream. ++

++

concatenated-stream—a concatenated stream. ++

++

Description::

++ ++

Returns a concatenated stream that has the indicated input-streams ++initially associated with it. ++

++

Examples::

++
++
 (read (make-concatenated-stream
++         (make-string-input-stream "1")
++         (make-string-input-stream "2"))) ⇒  12
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if any argument is not an input stream. ++

++

See Also::

++ ++

concatenated-stream-streams ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dcondition.html +@@ -0,0 +1,97 @@ ++ ++ ++ ++ ++ ++make-condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.30 make-condition [Function]

++ ++

make-condition type &rest slot-initializationscondition ++

++

Arguments and Values::

++ ++

type—a type specifier (for a subtype of condition). ++

++

slot-initializations—an initialization argument list. ++

++

condition—a condition. ++

++

Description::

++ ++

Constructs and returns a condition of type type ++using slot-initializations for the initial values of the slots. ++The newly created condition is returned. ++

++

Examples::

++ ++
++
 (defvar *oops-count* 0)
++
++ (setq a (make-condition 'simple-error
++                         :format-control "This is your ~:R error."
++                         :format-arguments (list (incf *oops-count*))))
++⇒  #<SIMPLE-ERROR 32245104>
++
++ (format t "~&~A~
++ |>  This is your first error.
++⇒  NIL
++
++ (error a)
++ |>  Error: This is your first error.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Return to Lisp Toplevel.
++ |>  Debug> 
++
++ ++

Affected By::

++ ++

The set of defined condition types. ++

++

See Also::

++ ++

define-condition ++, Condition System Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002ddispatch_002dmacro_002dcharacter.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++make-dispatch-macro-character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.3 make-dispatch-macro-character [Function]

++ ++

make-dispatch-macro-character char &optional non-terminating-p readtablet ++

++

Arguments and Values::

++ ++

char—a character. ++

++

non-terminating-p—a generalized boolean. ++ The default is false. ++

++

readtable—a readtable. ++ The default is the current readtable. ++

++

Description::

++ ++

make-dispatch-macro-character makes char ++be a dispatching macro character in readtable. ++

++

Initially, every character in the dispatch table ++associated with the char has an associated function ++that signals an error of type reader-error. ++

++

If non-terminating-p is true, ++the dispatching macro character ++is made a non-terminating macro character; ++if non-terminating-p is false, ++the dispatching macro character ++is made a terminating macro character. ++

++

Examples::

++ ++
++
 (get-macro-character #\{) ⇒  NIL, false
++ (make-dispatch-macro-character #\{) ⇒  T
++ (not (get-macro-character #\{)) ⇒  false
++
++ ++

The readtable is altered. ++

++

See Also::

++ ++

readtable ++, ++set-dispatch-macro-character ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002decho_002dstream.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++make-echo-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.45 make-echo-stream [Function]

++ ++

make-echo-stream input-stream output-streamecho-stream ++

++

Arguments and Values::

++ ++

input-stream—an input stream. ++

++

output-stream—an output stream. ++

++

echo-stream—an echo stream. ++

++

Description::

++ ++

Creates and returns an echo stream ++that takes input from input-stream ++and sends output to output-stream. ++

++

Examples::

++
++
 (let ((out (make-string-output-stream)))
++    (with-open-stream 
++        (s (make-echo-stream
++            (make-string-input-stream "this-is-read-and-echoed")
++            out))
++      (read s)
++      (format s " * this-is-direct-output")
++      (get-output-stream-string out)))
++⇒  "this-is-read-and-echoed * this-is-direct-output"
++
++ ++

See Also::

++ ++

echo-stream-input-stream ++, ++echo-stream-output-stream, ++make-two-way-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dhash_002dtable.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++make-hash-table (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.2 make-hash-table [Function]

++ ++

make-hash-table &key test size rehash-size rehash-thresholdhash-table ++

++

Arguments and Values::

++ ++

test—a designator for one of the functions ++ eq, ++ eql, ++ equal, or ++

++

equalp. ++

++

The default is eql. ++

++

size—a non-negative integer. ++

++

The default is implementation-dependent. ++

++

rehash-size—a real of type (or (integer 1 *) (float (1.0) *)). ++ The default is implementation-dependent. ++

++

rehash-threshold—a real of type (real 0 1). ++ The default is implementation-dependent. ++

++

hash-table—a hash table. ++

++

Description::

++ ++

Creates and returns a new hash table. ++

++

test determines how keys are compared. ++An object is said to be present in the hash-table ++if that object is the same under the test ++as the key for some entry in the hash-table. ++

++

size is a hint to the implementation about how much initial space ++to allocate in the hash-table. ++

++

This information, taken together with the rehash-threshold, controls ++the approximate number of entries which it should be possible ++to insert before the table has to grow. ++

++

The actual size might be rounded up from size to the next ‘good’ size; ++for example, some implementations might round to the next prime number. ++

++

rehash-size specifies a minimum amount to increase the size of the ++hash-table when it becomes full ++enough to require rehashing; ++see rehash-theshold below. ++

++

If rehash-size is an integer, ++the expected growth rate for the table is additive and ++the integer is the number of entries to add; ++if it is a float, ++the expected growth rate for the table is multiplicative and ++the float is the ratio of the new size to the old size. ++

++

As with size, the actual size of the increase might be rounded up. ++

++

rehash-threshold specifies how full the hash-table can get ++before it must grow. ++

++

It specifies the maximum desired hash-table occupancy level. ++

++

The values of rehash-size and rehash-threshold do not constrain the ++implementation to use any particular method for computing when and by how much ++the size of hash-table should be enlarged. Such decisions are ++implementation-dependent, and these values only hints ++from the programmer to the implementation, and the implementation ++is permitted to ignore them. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 46142754>
++ (setf (gethash "one" table) 1) ⇒  1
++ (gethash "one" table) ⇒  NIL, false
++ (setq table (make-hash-table :test 'equal)) ⇒  #<HASH-TABLE EQUAL 0/139 46145547>
++ (setf (gethash "one" table) 1) ⇒  1
++ (gethash "one" table) ⇒  1, T
++ (make-hash-table :rehash-size 1.5 :rehash-threshold 0.7) 
++⇒  #<HASH-TABLE EQL 0/120 46156620>
++
++ ++

See Also::

++ ++

gethash ++, ++hash-table ++

++
++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dinstance.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++make-instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.19 make-instance [Standard Generic Function]

++ ++

Syntax::

++ ++

make-instance class &rest initargs &key &allow-other-keysinstance ++

++

Method Signatures::

++ ++

make-instance (class standard-class) &rest initargs ++

++

make-instance (class symbol) &rest initargs ++

++

Arguments and Values::

++ ++

class—a class, ++ or a symbol that names a class. ++

++

initargs—an initialization argument list. ++

++

instance—a fresh instance of class class. ++

++

Description::

++ ++

The generic function make-instance ++creates and returns a new instance of the given class. ++

++

If the second of the above methods is selected, ++that method invokes make-instance on the arguments ++(find-class class) and initargs. ++

++

The initialization arguments are checked within make-instance. ++

++

The generic function make-instance ++may be used as described in Object Creation and Initialization. ++

++

Exceptional Situations::

++ ++

If any of the initialization arguments has not ++been declared as valid, an error of type error is signaled. ++

++

See Also::

++ ++

defclass ++, ++class-of ++, ++allocate-instance ++, ++Initialize-Instance ++, ++Object Creation and Initialization ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dinstances_002dobsolete.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++make-instances-obsolete (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.20 make-instances-obsolete [Standard Generic Function]

++ ++

Syntax::

++ ++

make-instances-obsolete classclass ++

++

Method Signatures::

++ ++

make-instances-obsolete (class standard-class) ++

++

make-instances-obsolete (class symbol) ++

++

Arguments and Values::

++ ++

class—a class designator. ++

++

Description::

++ ++

The function make-instances-obsolete has the effect of ++initiating the process of updating the instances of the ++class. During updating, the generic function ++update-instance-for-redefined-class will be invoked. ++

++

The generic function make-instances-obsolete is invoked ++automatically by the system when defclass has been used to ++redefine an existing standard class and the set of local ++slots accessible in an ++instance is changed or the order of slots in storage is changed. It ++can also be explicitly invoked by the user. ++

++

If the second of the above methods is selected, that ++method invokes ++make-instances-obsolete on (find-class class). ++

++

Examples::

++ ++

See Also::

++ ++

update-instance-for-redefined-class ++, ++Redefining Classes ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dlist.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++make-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.18 make-list [Function]

++ ++

make-list size &key initial-elementlist ++

++

Arguments and Values::

++ ++

size—a non-negative integer. ++

++

initial-element—an object. ++ The default is nil. ++

++

list—a list. ++

++

Description::

++ ++

Returns a list of length given by size, ++each of the elements of which is initial-element. ++

++

Examples::

++
++
 (make-list 5) ⇒  (NIL NIL NIL NIL NIL)
++ (make-list 3 :initial-element 'rah) ⇒  (RAH RAH RAH)
++ (make-list 2 :initial-element '(1 2 3)) ⇒  ((1 2 3) (1 2 3))
++ (make-list 0) ⇒  NIL ;i.e., ()
++ (make-list 0 :initial-element 'new-element) ⇒  NIL 
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if size is not a non-negative integer. ++

++

See Also::

++ ++

cons ++, ++list (Function) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dload_002dform.html +@@ -0,0 +1,339 @@ ++ ++ ++ ++ ++ ++make-load-form (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.21 make-load-form [Standard Generic Function]

++ ++

Syntax::

++ ++

make-load-form object &optional environmentcreation-form [, initialization-form ] ++

++

Method Signatures::

++ ++

make-load-form (object standard-object) &optional environment ++

++

make-load-form (object structure-object) &optional environment ++

++

make-load-form (object condition) &optional environment ++

++

make-load-form (object class) &optional environment ++

++

Arguments and Values::

++ ++

object—an object. ++

++

environment—an environment object. ++

++

creation-form—a form. ++

++

initialization-form—a form. ++

++

Description::

++ ++

The generic function make-load-form creates and returns ++one or two forms, ++ a creation-form ++ and an initialization-form, ++that enable load to construct an object ++equivalent to object. ++Environment is an environment object ++corresponding to the lexical environment ++in which the forms will be processed. ++

++

The file compiler calls make-load-form to process certain ++classes of literal objects; see Additional Constraints on Externalizable Objects. ++

++

Conforming programs may call make-load-form directly, ++providing object is a generalized instance of ++standard-object, structure-object, ++or condition. ++

++

The creation form is a form that, when evaluated at ++load time, should return an object that ++is equivalent to object. The exact meaning of ++equivalent depends on the type of object ++and is up to the programmer who defines a method for ++make-load-form; ++see Literal Objects in Compiled Files. ++

++

The initialization form is a form that, when evaluated at load time, ++should perform further initialization of the object. ++The value returned by the initialization form is ignored. ++If make-load-form ++returns only one value, ++the initialization form is nil, which has no effect. ++If object appears as a constant in the initialization form, ++at load time it will be replaced by the equivalent object ++constructed by the creation form; ++this is how the further initialization gains access to the object. ++

++

Both the creation-form and the initialization-form may contain references ++to any externalizable object. ++However, there must not be any circular dependencies in creation forms. ++An example of a circular dependency is when the creation form for the ++object X contains a reference to the object Y, ++and the creation form for the object Y contains a reference to the object X. ++Initialization forms are not subject to any restriction against circular dependencies, ++which is the reason that initialization forms exist; ++see the example of circular data structures below. ++

++

The creation form for an object is always evaluated before the ++initialization form for that object. When either the creation form or ++the initialization form references other objects that have not been ++referenced earlier in the file being compiled, the compiler ensures ++that all of the referenced objects have been created before evaluating ++the referencing form. When the referenced object is of a type which ++the file compiler processes using make-load-form, ++this involves evaluating ++the creation form returned for it. (This is the reason for the ++prohibition against circular references among creation forms). ++

++

Each initialization form is evaluated as soon as possible after its ++associated creation form, as determined by data flow. If the ++initialization form for an object does not reference any other objects ++not referenced earlier in the file and processed by ++the file compiler ++using ++make-load-form, the initialization form is evaluated immediately after ++the creation form. If a creation or initialization form F does contain ++references to such objects, the creation forms for those other objects ++are evaluated before F, and the initialization forms for those other ++objects are also evaluated before F whenever they do not depend on the ++object created or initialized by F. Where these rules do not uniquely ++determine an order of evaluation between two creation/initialization ++forms, the order of evaluation is unspecified. ++

++

While these creation and initialization forms are being evaluated, the ++ objects are possibly in an uninitialized state, ++analogous to the state ++ of an object ++between the time it has been created by allocate-instance ++ and it has been processed fully by ++initialize-instance. Programmers ++ writing methods for ++make-load-form must take care in manipulating ++ objects not to depend on ++slots that have not yet been initialized. ++

++

It is implementation-dependent ++whether load calls eval on the ++forms or does some ++ other operation that has an equivalent effect. For example, the ++ forms might be translated into different but equivalent ++forms and ++ then evaluated, they might be compiled and the resulting functions ++ called by load, ++or they might be interpreted by a special-purpose ++function different from eval. ++All that is required is that the ++ effect be equivalent to evaluating the forms. ++

++

The method specialized on class returns a creation ++form using the name of the class if the class has ++a proper name in environment, signaling an error of type error ++if it does not have a proper name. Evaluation of the creation ++form uses the name to find the class with that ++name, as if by calling find-class. If a class ++with that name has not been defined, then a class may be ++computed in an implementation-defined manner. If a class ++cannot be returned as the result of evaluating the creation ++form, then an error of type error is signaled. ++

++

Both conforming implementations and conforming programs may ++further specialize make-load-form. ++

++

Examples::

++ ++
++
 (defclass obj ()
++    ((x :initarg :x :reader obj-x)
++     (y :initarg :y :reader obj-y)
++     (dist :accessor obj-dist)))
++⇒  #<STANDARD-CLASS OBJ 250020030>
++ (defmethod shared-initialize :after ((self obj) slot-names &rest keys)
++   (declare (ignore slot-names keys))
++   (unless (slot-boundp self 'dist)
++     (setf (obj-dist self)
++           (sqrt (+ (expt (obj-x self) 2) (expt (obj-y self) 2))))))
++⇒  #<STANDARD-METHOD SHARED-INITIALIZE (:AFTER) (OBJ T) 26266714>
++ (defmethod make-load-form ((self obj) &optional environment)
++   (declare (ignore environment))
++   ;; Note that this definition only works because X and Y do not
++   ;; contain information which refers back to the object itself.
++   ;; For a more general solution to this problem, see revised example below.
++   `(make-instance ',(class-of self)
++                   :x ',(obj-x self) :y ',(obj-y self)))
++⇒  #<STANDARD-METHOD MAKE-LOAD-FORM (OBJ) 26267532>
++ (setq obj1 (make-instance 'obj :x 3.0 :y 4.0)) ⇒  #<OBJ 26274136>
++ (obj-dist obj1) ⇒  5.0
++ (make-load-form obj1) ⇒  (MAKE-INSTANCE 'OBJ :X '3.0 :Y '4.0)
++
++ ++

In the above example, an equivalent instance of obj is ++reconstructed by using the values of two of its slots. ++The value of the third slot is derived from those two values. ++

++

Another way to write the make-load-form method ++in that example is to use make-load-form-saving-slots. ++The code it generates might yield a slightly different result ++from the make-load-form method shown above, ++but the operational effect will be the same. For example: ++

++
++
 ;; Redefine method defined above.
++ (defmethod make-load-form ((self obj) &optional environment)
++    (make-load-form-saving-slots self
++                                 :slot-names '(x y)
++                                 :environment environment))
++⇒  #<STANDARD-METHOD MAKE-LOAD-FORM (OBJ) 42755655>
++ ;; Try MAKE-LOAD-FORM on object created above.
++ (make-load-form obj1)
++⇒  (ALLOCATE-INSTANCE '#<STANDARD-CLASS OBJ 250020030>),
++    (PROGN
++      (SETF (SLOT-VALUE '#<OBJ 26274136> 'X) '3.0)
++      (SETF (SLOT-VALUE '#<OBJ 26274136> 'Y) '4.0)
++      (INITIALIZE-INSTANCE '#<OBJ 26274136>))
++
++ ++

In the following example, instances of my-frob are “interned” ++in some way. An equivalent instance is reconstructed by using the ++value of the name slot as a key for searching existing objects. ++In this case the programmer has chosen to create a new object ++if no existing object is found; alternatively an error could ++have been signaled in that case. ++

++
++
 (defclass my-frob ()
++    ((name :initarg :name :reader my-name)))
++ (defmethod make-load-form ((self my-frob) &optional environment)
++   (declare (ignore environment))
++   `(find-my-frob ',(my-name self) :if-does-not-exist :create))
++
++ ++

In the following example, the data structure to be dumped is circular, ++because each parent has a list of its children and each child has a reference ++back to its parent. If make-load-form is called on one ++object in such a structure, the creation form creates an equivalent ++object and fills in the children slot, which forces creation of equivalent ++objects for all of its children, grandchildren, etc. At this point ++none of the parent slots have been filled in. ++The initialization form fills in the parent slot, which forces creation ++of an equivalent object for the parent if it was not already created. ++Thus the entire tree is recreated at load time. ++At compile time, make-load-form is called once for each object ++in the tree. ++All of the creation forms are evaluated, ++in implementation-dependent order, ++and then all of the initialization forms are evaluated, ++also in implementation-dependent order. ++

++
++
 (defclass tree-with-parent () ((parent :accessor tree-parent)
++                                (children :initarg :children)))
++ (defmethod make-load-form ((x tree-with-parent) &optional environment)
++   (declare (ignore environment))
++   (values
++     ;; creation form
++     `(make-instance ',(class-of x) :children ',(slot-value x 'children))
++     ;; initialization form
++     `(setf (tree-parent ',x) ',(slot-value x 'parent))))
++
++ ++

In the following example, the data structure to be dumped has no special ++properties and an equivalent structure can be reconstructed ++simply by reconstructing the slots’ contents. ++

++
++
 (defstruct my-struct a b c)
++ (defmethod make-load-form ((s my-struct) &optional environment)
++    (make-load-form-saving-slots s :environment environment))
++
++ ++

Exceptional Situations::

++ ++

The methods specialized on ++ standard-object, ++ structure-object, ++ and condition ++all signal an error of type error. ++

++

It is implementation-dependent whether calling ++make-load-form on a generalized instance of a ++system class signals an error or returns creation and ++initialization forms. ++

++

See Also::

++ ++

compile-file ++, ++make-load-form-saving-slots ++, ++Additional Constraints on Externalizable Objects ++Evaluation, ++Compilation ++

++

Notes::

++ ++

The file compiler ++calls make-load-form in specific circumstances ++detailed in Additional Constraints on Externalizable Objects. ++

++

Some implementations may provide facilities for defining new ++subclasses of classes which are specified as ++system classes. (Some likely candidates include ++generic-function, method, and stream). Such ++implementations should document how the file compiler processes ++instances of such classes when encountered as ++literal objects, and should document any relevant methods ++for make-load-form. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dload_002dform_002dsaving_002dslots.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++make-load-form-saving-slots (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.22 make-load-form-saving-slots [Function]

++ ++

make-load-form-saving-slots object &key slot-names environment
++ ⇒ creation-form, initialization-form ++

++

Arguments and Values::

++ ++

object—an object. ++

++

slot-names—a list. ++

++

environment—an environment object. ++

++

creation-form—a form. ++

++

initialization-form—a form. ++

++

Description::

++ ++

Returns forms that, when evaluated, will construct an ++object equivalent to object, without executing ++initialization forms. The slots in the new object ++that correspond to initialized slots in object are ++initialized using the values from object. Uninitialized slots ++in object are not initialized in the new object. ++make-load-form-saving-slots works for any instance of ++standard-object or structure-object. ++

++

Slot-names is a list of the names of the ++slots to preserve. If slot-names is not ++supplied, its value is all of the local slots. ++

++

make-load-form-saving-slots returns two values, ++thus it can deal with circular structures. ++Whether the result is useful in an application depends on ++whether the object’s type and slot contents ++fully capture the application’s idea of the object’s state. ++

++

Environment is the environment in which the forms will be processed. ++

++

See Also::

++ ++

make-load-form ++, ++make-instance ++, ++setf ++, ++slot-value ++, ++slot-makunbound ++

++

Notes::

++ ++

make-load-form-saving-slots can be useful in user-written ++make-load-form methods. ++

++

When the object is an instance of standard-object, ++make-load-form-saving-slots could return a creation form that ++calls allocate-instance and an initialization form that ++contains calls to setf of slot-value and ++slot-makunbound, though other functions of similar effect ++might actually be used. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dpackage.html +@@ -0,0 +1,122 @@ ++ ++ ++ ++ ++ ++make-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.12 make-package [Function]

++ ++

make-package package-name &key nicknames usepackage ++

++

Arguments and Values::

++ ++

package-name—a string designator. ++

++

nicknames—a list of string designators. ++ The default is the empty list. ++

++

use— ++a list of package designators. ++

++

The default is implementation-defined. ++

++

package—a package. ++

++

Description::

++ ++

Creates a new package with the name package-name. ++

++

Nicknames are additional names which may be used ++to refer to the new package. ++

++

use specifies zero or more packages ++the external symbols of which are to be inherited by ++the new package. See the function use-package. ++

++

Examples::

++ ++
++
 (make-package 'temporary :nicknames '("TEMP" "temp")) ⇒  #<PACKAGE "TEMPORARY">
++ (make-package "OWNER" :use '("temp")) ⇒  #<PACKAGE "OWNER">
++ (package-used-by-list 'temp) ⇒  (#<PACKAGE "OWNER">)
++ (package-use-list 'owner) ⇒  (#<PACKAGE "TEMPORARY">)
++
++ ++

Affected By::

++ ++

The existence of other packages in the system. ++

++

Exceptional Situations::

++ ++

The consequences are unspecified if packages denoted by use ++do not exist. ++

++

A correctable error is signaled if the package-name ++or any of the nicknames is already ++the name or nickname of an existing package. ++

++

See Also::

++ ++

defpackage ++, ++use-package ++

++

Notes::

++ ++

In situations where the packages to be used contain symbols which would conflict, ++it is necessary to first create the package with :use '(), ++then to use shadow or shadowing-import to address the conflicts, ++and then after that to use use-package once the conflicts have been addressed. ++

++

When packages are being created as part of the static definition of a program ++rather than dynamically by the program, it is generally considered more stylistically ++appropriate to use defpackage rather than make-package. ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dpathname.html +@@ -0,0 +1,190 @@ ++ ++ ++ ++ ++ ++make-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.4 make-pathname [Function]

++ ++

make-pathname &key host device directory name type version defaults case
++ ⇒ pathname ++

++

Arguments and Values::

++ ++

host—a valid physical pathname host. ++ Complicated defaulting behavior; see below. ++

++

device—a valid pathname device. ++ Complicated defaulting behavior; see below. ++

++

directory—a valid pathname directory. ++ Complicated defaulting behavior; see below. ++

++

name—a valid pathname name. ++ Complicated defaulting behavior; see below. ++

++

type—a valid pathname type. ++ Complicated defaulting behavior; see below. ++

++

version—a valid pathname version. ++ Complicated defaulting behavior; see below. ++

++

defaults—a pathname designator. ++ The default is a pathname whose host component is the same as the ++ host component of the value of *default-pathname-defaults*, ++ and whose other components are all nil. ++

++

case—one of :common or :local. ++ The default is :local. ++

++

pathname—a pathname. ++

++

Description::

++ ++

Constructs and returns a pathname from the supplied keyword arguments. ++

++

After the components supplied explicitly by ++ host, ++ device, ++ directory, ++ name, ++ type, ++ and version ++are filled in, ++the merging rules used by merge-pathnames ++are used to fill in any ++unsupplied ++components ++from the defaults supplied by defaults. ++

++

Whenever a pathname is constructed the components may be ++canonicalized if appropriate. ++For the explanation of the arguments that can be supplied for each component, ++see Pathname Components. ++

++

If case is supplied, ++it is treated as described in Case in Pathname Components. ++

++

The resulting pathname is a logical pathname ++if and only its host component ++is ++a logical host ++or a string that names a defined logical host. ++

++

If the directory is a string, ++it should be the name of a top level directory, ++and should not contain any punctuation characters; that is, ++specifying a string, str, is ++equivalent to specifying the list (:absolute str). ++Specifying the symbol :wild is equivalent to specifying the list ++(:absolute :wild-inferiors), or (:absolute :wild) ++in a file system that does not support :wild-inferiors. ++

++

Examples::

++ ++
++
 ;; Implementation A -- an implementation with access to a single
++ ;;  Unix file system.  This implementation happens to never display
++ ;;  the `host' information in a namestring, since there is only one host. 
++ (make-pathname :directory '(:absolute "public" "games")
++                :name "chess" :type "db")
++⇒  #P"/public/games/chess.db" 
++
++ ;; Implementation B -- an implementation with access to one or more
++ ;;  VMS file systems.  This implementation displays `host' information
++ ;;  in the namestring only when the host is not the local host.
++ ;;  It uses a double colon to separate a host name from the host's local
++ ;;  file name.
++ (make-pathname :directory '(:absolute "PUBLIC" "GAMES")
++                :name "CHESS" :type "DB")
++⇒  #P"SYS$DISK:[PUBLIC.GAMES]CHESS.DB" 
++ (make-pathname :host "BOBBY"
++                :directory '(:absolute "PUBLIC" "GAMES")
++                :name "CHESS" :type "DB")
++⇒  #P"BOBBY::SYS$DISK:[PUBLIC.GAMES]CHESS.DB" 
++
++ ;; Implementation C -- an implementation with simultaneous access to
++ ;;  multiple file systems from the same Lisp image.  In this 
++ ;;  implementation, there is a convention that any text preceding the
++ ;;  first colon in a pathname namestring is a host name.
++ (dolist (case '(:common :local))
++   (dolist (host '("MY-LISPM" "MY-VAX" "MY-UNIX"))
++     (print (make-pathname :host host :case case
++                           :directory '(:absolute "PUBLIC" "GAMES")
++                           :name "CHESS" :type "DB"))))
++ |>  #P"MY-LISPM:>public>games>chess.db"
++ |>  #P"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB"
++ |>  #P"MY-UNIX:/public/games/chess.db"
++ |>  #P"MY-LISPM:>public>games>chess.db" 
++ |>  #P"MY-VAX:SYS$DISK:[PUBLIC.GAMES]CHESS.DB" 
++ |>  #P"MY-UNIX:/PUBLIC/GAMES/CHESS.DB" 
++⇒  NIL
++
++ ++

Affected By::

++ ++

The file system. ++

++

See Also::

++ ++

merge-pathnames ++, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

Portable programs should not supply :unspecific for any component. ++See ->UNSPECIFIC as a Component Value. ++

++
++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002drandom_002dstate.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++make-random-state (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.40 make-random-state [Function]

++ ++

make-random-state &optional statenew-state ++

++

Arguments and Values::

++ ++

state—a random state, or nil, or t. ++ The default is nil. ++

++

new-state—a random state object. ++

++

Description::

++ ++

Creates a fresh object of type random-state suitable ++for use as the value of *random-state*. ++

++

If state is a random state object, ++the new-state is a copy_5 of that object. ++If state is nil, ++the new-state is a copy_5 of the current random state. ++If state is t, ++the new-state is a fresh random state object ++that has been randomly initialized by some means. ++

++

Examples::

++ ++
++
 (let* ((rs1 (make-random-state nil))
++        (rs2 (make-random-state t))
++        (rs3 (make-random-state rs2))
++        (rs4 nil))
++   (list (loop for i from 1 to 10 
++               collect (random 100)
++               when (= i 5)
++                do (setq rs4 (make-random-state)))
++         (loop for i from 1 to 10 collect (random 100 rs1))
++         (loop for i from 1 to 10 collect (random 100 rs2))
++         (loop for i from 1 to 10 collect (random 100 rs3))
++         (loop for i from 1 to 10 collect (random 100 rs4))))
++⇒  ((29 25 72 57 55 68 24 35 54 65)
++    (29 25 72 57 55 68 24 35 54 65)
++    (93 85 53 99 58 62 2 23 23 59)
++    (93 85 53 99 58 62 2 23 23 59)
++    (68 24 35 54 65 54 55 50 59 49))
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if state is not a random state, or nil, or t. ++

++

See Also::

++ ++

random ++, ++random-state ++

++

Notes::

++ ++

One important use of make-random-state is to allow the same ++series of pseudo-random numbers to be generated many times within a ++single program. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dsequence.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++make-sequence (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.5 make-sequence [Function]

++ ++

make-sequence result-type size &key initial-elementsequence ++

++

Arguments and Values::

++ ++

result-type—a sequence type specifier. ++

++

size—a non-negative integer. ++

++

initial-element—an object. ++ The default is implementation-dependent. ++

++

sequence—a proper sequence. ++

++

Description::

++ ++

Returns a sequence of the type result-type and of length size, ++each of the elements of which has been initialized to initial-element. ++

++

If the result-type is a subtype of list, ++the result will be a list. ++

++

If the result-type is a subtype of vector, ++then if the implementation can determine the element type specified ++for the result-type, the element type of the resulting array ++is the result of upgrading that element type; or, if the ++implementation can determine that the element type is unspecified (or *), ++the element type of the resulting array is t; ++otherwise, an error is signaled. ++

++

Examples::

++ ++
++
 (make-sequence 'list 0) ⇒  ()
++ (make-sequence 'string 26 :initial-element #\.) 
++⇒  ".........................."
++ (make-sequence '(vector double-float) 2
++                :initial-element 1d0)
++⇒  #(1.0d0 1.0d0)
++
++ ++
++
 (make-sequence '(vector * 2) 3) should signal an error
++ (make-sequence '(vector * 4) 3) should signal an error
++
++ ++

Affected By::

++ ++

The implementation. ++

++

Exceptional Situations::

++ ++

The consequences are unspecified if initial-element ++is not an object which can be stored in the resulting sequence. ++

++

An error of type type-error must be signaled if the result-type is neither ++ a recognizable subtype of list, ++ nor a recognizable subtype of vector. ++

++

An error of type type-error should be signaled if result-type specifies ++the number of elements and size is different from that number. ++

++

See Also::

++ ++

make-array ++, ++make-list ++

++

Notes::

++ ++
++
 (make-sequence 'string 5) ≡ (make-string 5)               
++
++ ++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dstring.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++make-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Strings Dictionary  

++
++
++

16.2.12 make-string [Function]

++ ++

make-string size &key initial-element element-typestring ++

++

Arguments and Values::

++ ++

size—a valid array dimension. ++

++

initial-element—a character. ++

++

The default is implementation-dependent. ++

++

element-type—a type specifier. ++ The default is character. ++

++

string—a simple string. ++

++

Description::

++ ++

make-string returns a simple string of length size ++whose elements have been initialized to initial-element. ++

++

The element-type names the type of the elements of the string; ++a string is constructed of the most specialized ++type that can accommodate elements of the given type. ++

++

Examples::

++ ++
++
 (make-string 10 :initial-element #\5) ⇒  "5555555555"
++ (length (make-string 10)) ⇒  10
++
++ ++

Affected By::

++ ++

The implementation. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dstring_002dinput_002dstream.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++make-string-input-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.49 make-string-input-stream [Function]

++ ++

make-string-input-stream string &optional start endstring-stream ++

++

Arguments and Values::

++ ++

string—a string. ++

++

start, endbounding index designators of string. ++ The defaults for start and end are 0 and nil, respectively. ++

++

string-stream—an input string stream. ++

++

Description::

++ ++

Returns an input string stream. ++This stream will supply, in order, the characters in the substring ++of string bounded by start and end. ++After the last character has been supplied, ++the string stream will then be at end of file. ++

++

Examples::

++ ++
++
 (let ((string-stream (make-string-input-stream "1 one ")))
++   (list (read string-stream nil nil)
++         (read string-stream nil nil)
++         (read string-stream nil nil)))
++⇒  (1 ONE NIL)
++
++ (read (make-string-input-stream "prefixtargetsuffix" 6 12)) ⇒  TARGET
++
++ ++

See Also::

++ ++

with-input-from-string ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dstring_002doutput_002dstream.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++make-string-output-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.50 make-string-output-stream [Function]

++ ++

make-string-output-stream &key element-typestring-stream ++

++

Arguments and Values::

++ ++

element-type—a type specifier. ++ The default is character. ++

++

string-stream—an output string stream. ++

++

Description::

++ ++

Returns ++

++

an output string stream that accepts characters ++and makes available (via get-output-stream-string) ++a string that contains the characters that were actually output. ++

++

The element-type names the type of the elements ++of the string; a string is constructed of the most specialized ++type that can accommodate elements of that element-type. ++

++

Examples::

++ ++
++
 (let ((s (make-string-output-stream)))
++   (write-string "testing... " s)
++   (prin1 1234 s)
++   (get-output-stream-string s))
++⇒  "testing... 1234"
++
++ ++

None.. ++

++

See Also::

++ ++

get-output-stream-string ++, ++with-output-to-string ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dsymbol.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++make-symbol (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.5 make-symbol [Function]

++ ++

make-symbol namenew-symbol ++

++

Arguments and Values::

++ ++

name—a string. ++

++

new-symbol—a fresh, uninterned symbol. ++

++

Description::

++ ++

make-symbol creates and returns a fresh, uninterned ++symbol whose name is the given name. ++The new-symbol is neither bound nor fbound ++and has a null property list. ++

++

It is implementation-dependent whether the string ++that becomes the new-symbol’s name is the given ++name or a copy of it. Once a string ++has been given as the name argument to ++make-symbol, the consequences are undefined if a ++subsequent attempt is made to alter that string. ++

++

Examples::

++ ++
++
 (setq temp-string "temp") ⇒  "temp"
++ (setq temp-symbol (make-symbol temp-string)) ⇒  #:|temp|
++ (symbol-name temp-symbol) ⇒  "temp"
++ (eq (symbol-name temp-symbol) temp-string) ⇒  implementation-dependent
++ (find-symbol "temp") ⇒  NIL, NIL
++ (eq (make-symbol temp-string) (make-symbol temp-string)) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if name is not a string. ++

++

See Also::

++ ++

copy-symbol ++

++

Notes::

++ ++

No attempt is made by make-symbol to convert the case ++of the name to uppercase. The only case conversion which ever ++occurs for symbols is done by the Lisp reader. ++The program interface to symbol creation retains case, ++and the program interface to interning symbols is case-sensitive. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dsynonym_002dstream.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++make-synonym-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.38 make-synonym-stream [Function]

++ ++

make-synonym-stream symbolsynonym-stream ++

++

Arguments and Values::

++ ++

symbol—a symbol that names a dynamic variable. ++

++

synonym-stream—a synonym stream. ++

++

Description::

++ ++

Returns a synonym stream whose synonym stream symbol is symbol. ++

++

Examples::

++ ++
++
 (setq a-stream (make-string-input-stream "a-stream")
++        b-stream (make-string-input-stream "b-stream"))
++⇒  #<String Input Stream> 
++ (setq s-stream (make-synonym-stream 'c-stream))
++⇒  #<SYNONYM-STREAM for C-STREAM> 
++ (setq c-stream a-stream)
++⇒  #<String Input Stream> 
++ (read s-stream) ⇒  A-STREAM
++ (setq c-stream b-stream)
++⇒  #<String Input Stream> 
++ (read s-stream) ⇒  B-STREAM
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its argument is not a symbol. ++

++

See Also::

++ ++

Stream Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/make_002dtwo_002dway_002dstream.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++make-two-way-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.42 make-two-way-stream [Function]

++ ++

make-two-way-stream input-stream output-streamtwo-way-stream ++

++

Arguments and Values::

++ ++

input-stream—a stream. ++

++

output-stream—a stream. ++

++

two-way-stream—a two-way stream. ++

++

Description::

++ ++

Returns a two-way stream ++that gets its input from input-stream ++and sends its output to output-stream. ++

++

Examples::

++ ++
++
 (with-output-to-string (out)
++    (with-input-from-string (in "input...")
++      (let ((two (make-two-way-stream in out)))
++        (format two "output...")
++        (setq what-is-read (read two))))) ⇒  "output..."
++ what-is-read ⇒  INPUT... 
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if input-stream is not an input stream. ++Should signal an error of type type-error ++ if output-stream is not an output stream. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/makunbound.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++makunbound (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.18 makunbound [Function]

++ ++

makunbound symbolsymbol ++

++

Arguments and Values::

++ ++

symbol—a symbol ++

++

Description::

++ ++

Makes the symbol be unbound, ++regardless of whether it was previously bound. ++

++

Examples::

++ ++
++
 (setf (symbol-value 'a) 1)
++ (boundp 'a) ⇒  true
++ a ⇒  1
++ (makunbound 'a) ⇒  A
++ (boundp 'a) ⇒  false
++
++ ++

Side Effects::

++ ++

The value cell of symbol is modified. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

boundp ++, ++fmakunbound ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/map.html +@@ -0,0 +1,141 @@ ++ ++ ++ ++ ++ ++map (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.7 map [Function]

++ ++

map result-type function &rest sequences^+result ++

++

Arguments and Values::

++ ++

result-type – a sequence type specifier, or nil. ++

++

function—a function designator. ++ function must take as many arguments as ++ there are sequences. ++

++

sequence—a proper sequence. ++

++

result—if result-type is a type specifier other than nil, ++ then a sequence of the type it denotes; ++ otherwise (if the result-type is nil), nil. ++

++

Description::

++ ++

Applies function to successive sets of arguments in which ++one argument is obtained from each sequence. ++The function is called first on all the elements with index 0, ++then on all those with index 1, and so on. ++The result-type specifies the type of the resulting sequence. ++

++

map returns nil if result-type is nil. ++Otherwise, map returns ++a sequence such that element j is the result ++of applying function to element j of each of the ++sequences. The result sequence ++is as long as the shortest of the ++sequences. ++The consequences are undefined if the result of applying function ++to the successive elements of the sequences cannot ++be contained in a sequence of the type given by result-type. ++

++

If the result-type is a subtype of list, ++the result will be a list. ++

++

If the result-type is a subtype of vector, ++then if the implementation can determine the element type specified ++for the result-type, the element type of the resulting array ++is the result of upgrading that element type; or, if the ++implementation can determine that the element type is unspecified (or *), ++the element type of the resulting array is t; ++otherwise, an error is signaled. ++

++

Examples::

++ ++
++
 (map 'string #'(lambda (x y)
++                  (char "01234567890ABCDEF" (mod (+ x y) 16)))
++       '(1 2 3 4)
++       '(10 9 8 7)) ⇒  "AAAA"
++ (setq seq '("lower" "UPPER" "" "123")) ⇒  ("lower" "UPPER" "" "123")
++ (map nil #'nstring-upcase seq) ⇒  NIL
++ seq ⇒  ("LOWER" "UPPER" "" "123")
++ (map 'list #'- '(1 2 3 4)) ⇒  (-1 -2 -3 -4)
++ (map 'string
++      #'(lambda (x) (if (oddp x) #\1 #\0))
++      '(1 2 3 4)) ⇒  "1010"
++
++ ++
++
 (map '(vector * 4) #'cons "abc" "de") should signal an error
++
++ ++

Exceptional Situations::

++ ++

An error of type type-error must be signaled if the result-type is ++ not a recognizable subtype of list, ++ not a recognizable subtype of vector, ++ and not nil. ++

++

Should be prepared to signal an error of type type-error ++ if any sequence is not a proper sequence. ++

++

An error of type type-error should be signaled ++if result-type specifies the ++number of elements and the minimum length of the sequences ++is different from that number. ++

++

See Also::

++ ++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/map_002dinto.html +@@ -0,0 +1,133 @@ ++ ++ ++ ++ ++ ++map-into (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.8 map-into [Function]

++ ++

map-into result-sequence function &rest sequencesresult-sequence ++

++

Arguments and Values::

++ ++

result-sequence—a proper sequence. ++

++

function—a designator for a function ++ of as many arguments as there are sequences. ++

++

sequence—a proper sequence. ++

++

Description::

++ ++

Destructively modifies result-sequence to contain the results of ++applying function to each element in the argument sequences ++in turn. ++

++

result-sequence and each element of sequences can each be ++either a list or a vector. ++If result-sequence and each element of sequences are not all ++the same length, the iteration terminates when the shortest sequence ++(of any of the sequences or the result-sequence) ++is exhausted. ++If result-sequence is a vector with a ++fill pointer, the fill pointer is ignored when deciding how ++many iterations to perform, and afterwards the fill pointer is set to ++the number of times function was applied. ++If result-sequence is longer than the shortest element of sequences, ++extra elements at the end of result-sequence are left unchanged. ++If result-sequence is nil, map-into immediately returns ++nil, since nil is a sequence of length zero. ++

++

If function has side effects, it can count on being called ++first on all of the elements with index 0, then on all of those ++numbered 1, and so on. ++

++

Examples::

++ ++
++
 (setq a (list 1 2 3 4) b (list 10 10 10 10)) ⇒  (10 10 10 10)
++ (map-into a #'+ a b) ⇒  (11 12 13 14)
++ a ⇒  (11 12 13 14)
++ b ⇒  (10 10 10 10)
++ (setq k '(one two three)) ⇒  (ONE TWO THREE)
++ (map-into a #'cons k a) ⇒  ((ONE . 11) (TWO . 12) (THREE . 13) 14)
++ (map-into a #'gensym) ⇒  (#:G9090 #:G9091 #:G9092 #:G9093)
++ a ⇒  (#:G9090 #:G9091 #:G9092 #:G9093)
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if result-sequence is not a proper sequence. ++Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

Notes::

++ ++

map-into differs from map in that it modifies an ++existing sequence rather than creating a new one. ++In addition, map-into can be called with only two ++arguments, while map requires at least three arguments. ++

++

map-into could be defined by: ++

++
++
 (defun map-into (result-sequence function &rest sequences)
++   (loop for index below (apply #'min 
++                                (length result-sequence)
++                                (mapcar #'length sequences))
++         do (setf (elt result-sequence index)
++                  (apply function
++                         (mapcar #'(lambda (seq) (elt seq index))
++                                 sequences))))
++   result-sequence)
++
++ ++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/mapc.html +@@ -0,0 +1,196 @@ ++ ++ ++ ++ ++ ++mapc (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.34 mapc, mapcar, mapcan, mapl, maplist, mapcon [Function]

++ ++

mapc function &rest lists^+list-1 ++

++

mapcar function &rest lists^+result-list ++

++

mapcan function &rest lists^+concatenated-results ++

++

mapl function &rest lists^+list-1 ++

++

maplist function &rest lists^+result-list ++

++

mapcon function &rest lists^+concatenated-results ++

++

Arguments and Values::

++ ++

function—a designator for a function ++ that must take as many arguments as there are lists. ++

++

list—a proper list. ++

++

list-1—the first list (which must be a proper list). ++

++

result-list—a list. ++

++

concatenated-results—a list. ++

++

Description::

++ ++

The mapping operation involves applying function to ++successive sets of arguments in which ++one argument is obtained from each sequence. ++Except for mapc and mapl, ++the result contains the results returned by function. ++In the cases of mapc and mapl, ++the resulting sequence is list. ++

++

function is called ++first on all the elements with index 0, then on all those ++with index 1, and so on. ++result-type specifies the type of ++the ++resulting sequence. ++

++

If function is a symbol, it is coerced ++to a function as if by symbol-function. ++

++

mapcar operates on successive elements of the lists. ++function is applied to the first element of each list, ++then to the second element of each list, and so on. ++The iteration terminates when the shortest list runs out, ++and excess elements in other lists are ignored. ++The value returned by mapcar is a list ++of the results of successive calls to function. ++

++

mapc is like mapcar except that the results of ++applying function are not accumulated. ++The list argument is returned. ++

++

maplist is like mapcar except that ++function is applied to successive sublists of the lists. ++function ++is first applied to the lists themselves, ++and then to the cdr of each ++list, and then to the cdr of the cdr ++of each list, and so on. ++

++

mapl is like maplist except that the results of ++applying function are not accumulated; ++list-1 is returned. ++

++

mapcan and mapcon are like mapcar and ++maplist respectively, except that the results of ++applying function are combined ++into a list by the use of nconc ++rather than list. ++That is, ++

++
++
 (mapcon f x1 ... xn)
++   ≡ (apply #'nconc (maplist f x1 ... xn))
++
++ ++

and similarly for the relationship between mapcan ++and mapcar. ++

++

Examples::

++ ++
++
 (mapcar #'car '((1 a) (2 b) (3 c))) ⇒  (1 2 3) 
++ (mapcar #'abs '(3 -4 2 -5 -6)) ⇒  (3 4 2 5 6)
++ (mapcar #'cons '(a b c) '(1 2 3)) ⇒  ((A . 1) (B . 2) (C . 3))
++
++ (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3)) 
++⇒  ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3)) 
++ (maplist #'(lambda (x) (cons 'foo x)) '(a b c d))
++⇒  ((FOO A B C D) (FOO B C D) (FOO C D) (FOO D))
++ (maplist #'(lambda (x) (if (member (car x) (cdr x)) 0 1)) '(a b a c d b c))
++⇒  (0 0 1 0 1 1 1)
++;An entry is 1 if the corresponding element of the input
++;  list was the last instance of that element in the input list.
++
++ (setq dummy nil) ⇒  NIL 
++ (mapc #'(lambda (&rest x) (setq dummy (append dummy x)))
++        '(1 2 3 4)
++        '(a b c d e)
++        '(x y z)) ⇒  (1 2 3 4) 
++ dummy ⇒  (1 A X 2 B Y 3 C Z)                   
++
++ (setq dummy nil) ⇒  NIL 
++ (mapl #'(lambda (x) (push x dummy)) '(1 2 3 4)) ⇒  (1 2 3 4) 
++ dummy ⇒  ((4) (3 4) (2 3 4) (1 2 3 4)) 
++
++ (mapcan #'(lambda (x y) (if (null x) nil (list x y)))
++          '(nil nil nil d e)
++          '(1 2 3 4 5 6)) ⇒  (D 4 E 5) 
++ (mapcan #'(lambda (x) (and (numberp x) (list x)))
++          '(a 1 b c 3 4 d 5))
++⇒  (1 3 4 5)
++
++ ++

In this case the function serves as a filter; ++this is a standard Lisp idiom using mapcan. ++

++
++
 (mapcon #'list '(1 2 3 4)) ⇒  ((1 2 3 4) (2 3 4) (3 4) (4)) 
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if any list is not a proper list. ++

++

See Also::

++ ++

dolist ++, ++map ++, ++

++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/maphash.html +@@ -0,0 +1,112 @@ ++ ++ ++ ++ ++ ++maphash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.11 maphash [Function]

++ ++

maphash function hash-tablenil ++

++

Arguments and Values::

++ ++

function—a designator for a function of two arguments, ++ the key and the value. ++

++

hash-table—a hash table. ++

++

Description::

++ ++

Iterates over all entries in the hash-table. For each entry, ++the function is called with two arguments–the key ++and the value of that entry. ++

++

The consequences are unspecified if any attempt is made to add or remove ++an entry from the hash-table while a maphash is in progress, ++with two exceptions: ++ the function can use can use setf of gethash ++ to change the value part of the entry currently being processed, ++or it can use remhash to remove that entry. ++

++

Examples::

++ ++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32304110>
++ (dotimes (i 10) (setf (gethash i table) i)) ⇒  NIL
++ (let ((sum-of-squares 0))
++    (maphash #'(lambda (key val) 
++                 (let ((square (* val val)))
++                   (incf sum-of-squares square)
++                   (setf (gethash key table) square)))
++             table)
++    sum-of-squares) ⇒  285
++ (hash-table-count table) ⇒  10
++ (maphash #'(lambda (key val)
++               (when (oddp val) (remhash key table)))
++           table) ⇒  NIL
++ (hash-table-count table) ⇒  5
++ (maphash #'(lambda (k v) (print (list k v))) table)
++(0 0) 
++(8 64) 
++(2 4) 
++(6 36) 
++(4 16) 
++⇒  NIL
++
++ ++

Side Effects::

++ ++

None, other than any which might be done by the function. ++

++

See Also::

++ ++

loop ++, ++with-hash-table-iterator ++, ++

++

Traversal Rules and Side Effects ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/mask_002dfield.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++mask-field (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.71 mask-field [Accessor]

++ ++

mask-field bytespec integermasked-integer ++

++

(setf ( mask-field bytespec place) new-masked-integer)
++

++

Arguments and Values::

++ ++

bytespec—a byte specifier. ++

++

integer—an integer. ++

++

masked-integer, new-masked-integer—a non-negative integer. ++

++

Description::

++ ++

mask-field performs a “mask” operation on integer. ++It returns an integer that has the same bits as integer in ++the byte specified by bytespec, but that has zero-bits everywhere else. ++

++

setf may be used with mask-field ++to modify a byte within the integer that is stored ++in a given place. ++The effect is to perform a deposit-field operation ++and then store the result back into the place. ++

++

Examples::

++ ++
++
 (mask-field (byte 1 5) -1) ⇒  32
++ (setq a 15) ⇒  15
++ (mask-field (byte 2 0) a) ⇒  3
++ a ⇒  15
++ (setf (mask-field (byte 2 0) a) 1) ⇒  1
++ a ⇒  13
++
++ ++

See Also::

++ ++

byte ++, ++ldb ++

++

Notes::

++ ++
++
 (ldb bs (mask-field bs n)) ≡ (ldb bs n)
++ (logbitp j (mask-field (byte s p) n))
++   ≡ (and (>= j p) (< j s) (logbitp j n))
++ (mask-field bs n) ≡ (logand n (dpb -1 bs 0))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/max.html +@@ -0,0 +1,131 @@ ++ ++ ++ ++ ++ ++max (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.16 max, min [Function]

++ ++

max &rest reals^+max-real ++

++

min &rest reals^+min-real ++

++

Arguments and Values::

++ ++

real—a real. ++

++

max-real, min-real—a real. ++

++

Description::

++ ++

max returns the real that is greatest (closest to positive infinity). ++min returns the real that is least (closest to negative infinity). ++

++

For max, ++the implementation has the choice of returning the largest ++argument as is or applying the rules of floating-point contagion, ++taking all the arguments into consideration for contagion purposes. ++Also, if one or more of the arguments are =, then any one ++of them may be chosen as the value to return. ++For example, if the reals are a mixture of rationals and floats, ++and the largest argument is a rational, ++then the implementation is free to ++produce either that rational ++or its float approximation; ++if the largest argument is a ++float of a smaller format ++than the largest format of any float argument, ++then the implementation is free to ++return the argument in its given format or expanded to the larger format. ++Similar remarks apply to min ++(replacing “largest argument” by “smallest argument”). ++

++

Examples::

++ ++
++
 (max 3) ⇒  3 
++ (min 3) ⇒  3
++ (max 6 12) ⇒  12 
++ (min 6 12) ⇒  6
++ (max -6 -12) ⇒  -6 
++ (min -6 -12) ⇒  -12
++ (max 1 3 2 -7) ⇒  3 
++ (min 1 3 2 -7) ⇒  -7
++ (max -2 3 0 7) ⇒  7 
++ (min -2 3 0 7) ⇒  -2
++ (max 5.0 2) ⇒  5.0 
++ (min 5.0 2)
++⇒  2
++OR⇒ 2.0
++ (max 3.0 7 1)
++⇒  7
++OR⇒ 7.0 
++ (min 3.0 7 1)
++⇒  1
++OR⇒ 1.0
++ (max 1.0s0 7.0d0) ⇒  7.0d0
++ (min 1.0s0 7.0d0)
++⇒  1.0s0
++OR⇒ 1.0d0
++ (max 3 1 1.0s0 1.0d0)
++⇒  3
++OR⇒ 3.0d0
++ (min 3 1 1.0s0 1.0d0)
++⇒  1
++OR⇒ 1.0s0 
++OR⇒ 1.0d0
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if any number is not a real. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/member-_0028Function_0029.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++member (Function) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.33 member, member-if, member-if-not [Function]

++ ++

member item list &key key test test-nottail ++

++

member-if predicate list &key keytail ++

++

member-if-not predicate list &key keytail ++

++

Arguments and Values::

++ ++

item—an object. ++

++

list—a proper list. ++

++

predicate—a designator for ++ a function of one argument ++ that returns a generalized boolean. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

tail—a list. ++

++

Description::

++ ++

member, member-if, and member-if-not each ++search list for item or for a top-level element that ++satisfies the test. The argument to the predicate function ++is an element of list. ++

++

If some element satisfies the test, ++the tail of list beginning ++with this element is returned; otherwise nil is returned. ++

++

list is searched on the top level only. ++

++

Examples::

++ ++
++
 (member 2 '(1 2 3)) ⇒  (2 3)                                 
++ (member 2 '((1 . 2) (3 . 4)) :test-not #'= :key #'cdr) ⇒  ((3 . 4))
++ (member 'e '(a b c d)) ⇒  NIL
++
++ ++
++
 (member-if #'listp '(a b nil c d)) ⇒  (NIL C D)
++ (member-if #'numberp '(a #\Space 5/3 foo)) ⇒  (5/3 FOO)
++ (member-if-not #'zerop 
++                 '(3 6 9 11 . 12)
++                 :key #'(lambda (x) (mod x 3))) ⇒  (11 . 12)
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list is not a proper list. ++

++

See Also::

++ ++

find ++, ++position ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

The function member-if-not is deprecated. ++

++

In the following ++

++
++
 (member 'a '(g (a y) c a d e a f)) ⇒  (A D E A F)
++
++ ++

the value returned by member is identical to the portion ++of the list beginning with a. Thus rplaca on the ++result of member can be used to alter the part of the list ++where a was found (assuming a check has been made that member ++did not return nil). ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/member-_0028Type-Specifier_0029.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++member (Type Specifier) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.18 member [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Combining. ++

++

Compound Type Specifier Syntax::

++ ++

(member{{object}*}) ++

++

Compound Type Specifier Arguments::

++ ++

object—an object. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set containing the named objects. An ++object is of this type if and only if it is eql ++to one of the specified objects. ++

++

The type specifiers (member) and nil are equivalent. ++* can be among the objects, ++but if so it denotes itself (the symbol *) ++and does not represent an unspecified value. ++The symbol member is not valid as a type specifier; ++and, specifically, it is not an abbreviation for either (member) or (member *). ++

++

See Also::

++ ++

the type eql ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/merge.html +@@ -0,0 +1,172 @@ ++ ++ ++ ++ ++ ++merge (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.21 merge [Function]

++ ++

merge result-type sequence-1 sequence-2 predicate &key keyresult-sequence ++

++

Arguments and Values::

++ ++

result-type—a sequence type specifier. ++

++

sequence-1—a sequence. ++

++

sequence-2—a sequence. ++

++

predicate—a designator for ++ a function of two arguments that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-sequence—a proper sequence of type result-type. ++

++

Description::

++ ++

Destructively merges sequence-1 with sequence-2 according ++to an order determined by the predicate. merge determines ++the relationship between two elements by giving keys extracted from the ++sequence elements to the predicate. ++

++

The first argument to the predicate function is an element of ++sequence-1 as returned by the key (if supplied); ++the second argument is an element of sequence-2 as returned by ++the key (if supplied). ++Predicate should return true if and only if its first ++argument is strictly less than the second (in some appropriate sense). ++If the first argument is greater than or equal to the second ++(in the appropriate sense), then predicate should return false. ++merge ++considers two elements x and y to be equal if ++(funcall predicate x y) and ++(funcall predicate y x) both yield false. ++

++

The argument to the key is the sequence element. ++Typically, the return value of the key ++becomes the argument to predicate. ++If key is not supplied or nil, the sequence element itself is used. ++The key may be executed more than once for each sequence element, ++and its side effects may occur in any order. ++

++

If key and predicate return, then the merging operation ++will terminate. The result of merging two sequences x and y ++is a new sequence of type result-type z, ++such that the length of z is the sum of the lengths of x ++and y, and z contains all the elements of x and y. ++If x1 and x2 are two elements of x, and x1 precedes ++x2 in x, then x1 precedes x2 in z, and similarly for ++elements of y. In short, z is an interleaving of x and y. ++

++

If x and y were correctly sorted according to the ++predicate, then z will also be correctly sorted. ++If x or y is not so sorted, then z will not be sorted, ++but will nevertheless be an interleaving of x and y. ++

++

The merging operation is guaranteed stable; ++if two or more elements are considered equal by the predicate, ++then the elements from sequence-1 will ++precede those from sequence-2 in the result. ++

++

sequence-1 and/or sequence-2 may be destroyed. ++

++

If the result-type is a subtype of list, ++the result will be a list. ++

++

If the result-type is a subtype of vector, ++then if the implementation can determine the element type specified ++for the result-type, the element type of the resulting array ++is the result of upgrading that element type; or, if the ++implementation can determine that the element type is unspecified (or *), ++the element type of the resulting array is t; ++otherwise, an error is signaled. ++

++

Examples::

++
++
 (setq test1 (list 1 3 4 6 7))
++ (setq test2 (list 2 5 8))
++ (merge 'list test1 test2 #'<) ⇒  (1 2 3 4 5 6 7 8)
++ (setq test1 (copy-seq "BOY"))
++ (setq test2 (copy-seq :nosy"))
++ (merge 'string test1 test2 #'char-lessp) ⇒  "BnOosYy"
++ (setq test1 (vector ((red . 1) (blue . 4))))
++ (setq test2 (vector ((yellow . 2) (green . 7))))
++ (merge 'vector test1 test2 #'< :key #'cdr) 
++⇒  #((RED . 1) (YELLOW . 2) (BLUE . 4) (GREEN . 7)) 
++
++ ++
++
 (merge '(vector * 4) '(1 5) '(2 4 6) #'<) should signal an error
++
++ ++

Exceptional Situations::

++ ++

An error must be signaled if the result-type is neither ++ a recognizable subtype of list, ++ nor a recognizable subtype of vector. ++

++

An error of type type-error should be signaled ++if result-type specifies the number of elements ++and the sum of the lengths of sequence-1 and sequence-2 ++is different from that number. ++

++

See Also::

++ ++

sort ++, ++stable-sort, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/merge_002dpathnames.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++merge-pathnames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Filenames Dictionary  

++
++
++

19.4.17 merge-pathnames [Function]

++ ++

merge-pathnames pathname &optional default-pathname default-version
++ ⇒ merged-pathname ++

++

Arguments and Values::

++ ++

pathname—a pathname designator. ++

++

default-pathname—a pathname designator. ++

++

The default is the value of *default-pathname-defaults*. ++

++

default-version—a valid pathname version. ++

++

The default is :newest. ++

++

merged-pathname—a pathname. ++

++

Description::

++ ++

Constructs a pathname from pathname ++by filling in any unsupplied components with the corresponding values ++from default-pathname and default-version. ++

++

Defaulting of pathname components ++is done by filling in components taken from another pathname. ++

++

This is especially useful for cases such as ++a program that has an input file and an output file. ++Unspecified components of the output pathname will come from the input pathname, ++except that the type should not default ++to the type of the input pathname ++but rather to the appropriate default type for output from the program; ++for example, see the function compile-file-pathname. ++

++

If no version is supplied, default-version is used. ++If default-version is nil, the version component will remain unchanged. ++

++

If pathname explicitly specifies a host and not a device, and ++if the host component of default-pathname matches the host component ++of pathname, then the device is taken from the default-pathname; ++otherwise the device will be the default file device for that host. If ++pathname does not specify a host, device, directory, name, ++or type, each such component is copied from default-pathname. ++If pathname does not specify a name, then the version, if not provided, will ++come from default-pathname, just like the other components. If ++pathname does specify a name, then the version is not affected ++by default-pathname. If this process leaves the ++version missing, the default-version is used. ++If the host’s file name syntax provides a way ++to input a version without a name or type, the user can let the name ++and type default but supply a version different from the one in default-pathname. ++

++

If pathname is a stream, pathname effectively ++becomes (pathname pathname). merge-pathnames ++can be used on either an open or a closed stream. ++

++

If pathname is a pathname ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++

++

merge-pathnames recognizes a logical pathname namestring ++ when default-pathname is a logical pathname, ++

++

or when the namestring begins with ++ the name of a defined logical host followed by a colon. ++In the first of these two cases, ++

++

the host portion of the logical pathname namestring ++and its following colon are optional. ++

++

merge-pathnames returns a ++logical pathname if and only if ++ its first argument is a logical pathname, ++

++

or its first argument is a logical pathname namestring with an explicit host, ++or its first argument does not specify a host ++ and the default-pathname is a logical pathname. ++

++

Pathname merging treats a relative directory specially. ++If (pathname-directory pathname) is a list whose ++car is :relative, and ++(pathname-directory default-pathname) is a list, then ++the merged directory is the value of ++

++
++
 (append (pathname-directory default-pathname)
++         (cdr  ;remove :relative from the front
++           (pathname-directory pathname)))
++
++ ++

except that if the resulting list contains a string or :wild ++immediately followed by :back, both of them are removed. This removal of ++redundant :back keywords is repeated as many times as possible. ++If (pathname-directory default-pathname) is not a list or ++(pathname-directory pathname) is not a list ++whose car is :relative, the merged directory is ++(or (pathname-directory pathname) (pathname-directory default-pathname)) ++

++

merge-pathnames maps customary case in pathname ++into customary case in the output pathname. ++

++

Examples::

++
++
 (merge-pathnames "CMUC::FORMAT"
++                  "CMUC::PS:<LISPIO>.FASL")
++⇒  #P"CMUC::PS:<LISPIO>FORMAT.FASL.0"
++
++ ++

See Also::

++ ++

*default-pathname-defaults*, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

The net effect ++is that if just a name is supplied, ++the host, device, directory, and type will come from default-pathname, ++but the version will come from default-version. ++If nothing or just a directory is supplied, ++the name, type, and version will come from default-pathname together. ++

++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Filenames Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/method.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.11 method [System Class]

++ ++

Class Precedence List::

++

method, ++t ++

++

Description::

++ ++

A method is an object that represents a modular part of the behavior ++of a generic function. ++

++

A method contains code to implement the method’s ++behavior, a sequence of parameter specializers that specify when the ++given method is applicable, and a sequence of qualifiers ++that is used by the method combination facility to distinguish among ++methods. Each required parameter of each ++method has an associated parameter specializer, and the ++method will be invoked only on arguments that satisfy its ++parameter specializers. ++

++

The method combination facility controls the selection of ++methods, the order in which they are run, and the values that are ++returned by the generic function. The object system offers a default method ++combination type and provides a facility for declaring new types of ++method combination. ++

++

See Also::

++ ++

Generic Functions and Methods ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/method_002dcombination.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++method-combination (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.15 method-combination [System Class]

++ ++

Class Precedence List::

++

method-combination, ++t ++

++

Description::

++ ++

Every method combination object is an ++indirect instance of the class method-combination. ++A method combination object represents the information about ++the method combination being used by a generic function. ++A method combination object contains information about ++both the type of method combination and the arguments being used ++with that type. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/method_002dcombination_002derror.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++method-combination-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.16 method-combination-error [Function]

++ ++

method-combination-error format-control &rest argsimplementation-dependent ++

++

Arguments and Values::

++ ++

format-control—a format control. ++

++

argsformat arguments for format-control. ++

++

Description::

++ ++

The function method-combination-error is used to signal an error ++in method combination. ++

++

The error message is constructed by using a format-control suitable ++for format and any args to it. Because an implementation may ++need to add additional contextual information to the error message, ++method-combination-error should be called only within the ++dynamic extent of a method combination function. ++

++

Whether method-combination-error returns to its caller or exits ++via throw is implementation-dependent. ++

++

Side Effects::

++ ++

The debugger might be entered. ++

++

Affected By::

++ ++

*break-on-signals* ++

++

See Also::

++ ++

define-method-combination ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/method_002dqualifiers.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++method-qualifiers (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.15 method-qualifiers [Standard Generic Function]

++ ++

Syntax::

++ ++

method-qualifiers methodqualifiers ++

++

Method Signatures::

++ ++

method-qualifiers (method standard-method) ++

++

Arguments and Values::

++ ++

method—a method. ++

++

qualifiers—a proper list. ++

++

Description::

++ ++

Returns a list of the qualifiers of the method. ++

++

Examples::

++ ++
++
 (defmethod some-gf :before ((a integer)) a)
++⇒  #<STANDARD-METHOD SOME-GF (:BEFORE) (INTEGER) 42736540>
++ (method-qualifiers *) ⇒  (:BEFORE)
++
++ ++

See Also::

++ ++

define-method-combination ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/minusp.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++minusp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.17 minusp, plusp [Function]

++ ++

minusp realgeneralized-boolean ++

++

plusp realgeneralized-boolean ++

++

Arguments and Values::

++ ++

real—a real. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

minusp returns true if real is less than zero; ++otherwise, returns false. ++

++

plusp returns true if real is greater than zero; ++otherwise, returns false. ++

++

Regardless of whether an implementation provides distinct ++representations for positive and negative float zeros, ++(minusp -0.0) always returns false. ++

++

Examples::

++
++
 (minusp -1) ⇒  true
++ (plusp 0) ⇒  false
++ (plusp least-positive-single-float) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if real is not a real. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/mismatch.html +@@ -0,0 +1,130 @@ ++ ++ ++ ++ ++ ++mismatch (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.17 mismatch [Function]

++ ++

mismatch sequence-1 sequence-2 ++ &key from-end test test-not key start1 start2 end1 end2
++ ⇒ position ++

++

Arguments and Values::

++ ++

Sequence-1—a sequence. ++

++

Sequence-2—a sequence. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start1, end1bounding index designators of sequence-1. ++ The defaults for start1 and end1 are 0 and nil, respectively. ++

++

start2, end2bounding index designators of sequence-2. ++ The defaults for start2 and end2 are 0 and nil, respectively. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

position—a bounding index of sequence-1, ++ or nil. ++

++

Description::

++ ++

The specified subsequences of ++sequence-1 and sequence-2 are compared element-wise. ++

++

The key argument is used for both the sequence-1 and the sequence-2. ++

++

If sequence-1 and sequence-2 ++are of equal length and match in every element, the result is ++false. Otherwise, the result is a non-negative integer, ++the index within ++sequence-1 of the leftmost or rightmost position, depending ++on from-end, at which the two ++subsequences fail to match. ++If one subsequence ++is shorter than and a matching prefix of the other, ++the result is the index ++relative to sequence-1 beyond the last position tested. ++

++

If from-end is true, then one plus the index of the rightmost ++position in which the sequences ++differ is returned. In effect, the subsequences ++are aligned at their right-hand ends; then, the last elements are compared, ++the penultimate elements, and so on. The index returned is ++an index relative to sequence-1. ++

++

Examples::

++
++
 (mismatch "abcd" "ABCDE" :test #'char-equal) ⇒  4
++ (mismatch '(3 2 1 1 2 3) '(1 2 3) :from-end t) ⇒  3
++ (mismatch '(1 2 3) '(2 3 4) :test-not #'eq :key #'oddp) ⇒  NIL
++ (mismatch '(1 2 3 4 5 6) '(3 4 5 6 7) :start1 2 :end2 4) ⇒  NIL 
++
++ ++

See Also::

++ ++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/mod-_0028Function_0029.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++mod (Function) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.36 mod, rem [Function]

++ ++

mod number divisormodulus ++

++

rem number divisorremainder ++

++

Arguments and Values::

++ ++

number—a real. ++

++

divisor—a real. ++

++

modulus, remainder—a real. ++

++

Description::

++ ++

mod and rem are generalizations of the modulus ++and remainder functions respectively. ++

++

mod performs the operation floor ++on number and divisor ++and returns the remainder of the floor operation. ++

++

rem performs the operation truncate ++on number and divisor ++and returns the remainder of the truncate operation. ++

++

mod and rem are ++the modulus and remainder functions ++when number and divisor are integers. ++

++

Examples::

++
++
 (rem -1 5) ⇒  -1
++ (mod -1 5) ⇒  4
++ (mod 13 4) ⇒  1
++ (rem 13 4) ⇒  1
++ (mod -13 4) ⇒  3
++ (rem -13 4) ⇒  -1
++ (mod 13 -4) ⇒  -3
++ (rem 13 -4) ⇒  1
++ (mod -13 -4) ⇒  -1
++ (rem -13 -4) ⇒  -1
++ (mod 13.4 1) ⇒  0.4
++ (rem 13.4 1) ⇒  0.4
++ (mod -13.4 1) ⇒  0.6
++ (rem -13.4 1) ⇒  -0.4
++
++ ++

See Also::

++ ++

floor ++, truncate ++

++

Notes::

++ ++

The result of mod is either zero or a ++

++

real ++

++

with the same sign as divisor. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/mod-_0028System-Class_0029.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++mod (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.11 mod [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(mod{n}) ++

++

Compound Type Specifier Arguments::

++ ++

n—a positive integer. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of non-negative integers less than n. ++This is equivalent to ++ (integer 0 (n)) ++or to ++ (integer 0 m), ++where m=n-1. ++

++

The argument is required, and cannot be *. ++

++

The symbol mod is not valid as a type specifier. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/most_002dpositive_002dfixnum.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++most-positive-fixnum (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.72 most-positive-fixnum, most-negative-fixnum [Constant Variable]

++ ++

Constant Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

most-positive-fixnum is that fixnum closest in value ++to positive infinity provided by the implementation, ++

++

and greater than or equal to both 2^15 - 1 and ++array-dimension-limit. ++

++

most-negative-fixnum is that fixnum closest in value ++to negative infinity provided by the implementation, ++

++

and less than or equal to -2^15. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/most_002dpositive_002dshort_002dfloat.html +@@ -0,0 +1,159 @@ ++ ++ ++ ++ ++ ++most-positive-short-float (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.76 most-positive-short-float, least-positive-short-float,

++

least-positive-normalized-short-float,

++

most-positive-double-float, least-positive-double-float,

++

least-positive-normalized-double-float,

++

most-positive-long-float, least-positive-long-float,

++

least-positive-normalized-long-float,

++

most-positive-single-float, least-positive-single-float,

++

least-positive-normalized-single-float,

++

most-negative-short-float, least-negative-short-float,

++

least-negative-normalized-short-float,

++

most-negative-single-float, least-negative-single-float,

++

least-negative-normalized-single-float,

++

most-negative-double-float, least-negative-double-float,

++

least-negative-normalized-double-float,

++

most-negative-long-float, least-negative-long-float,

++

least-negative-normalized-long-float

++

[Constant Variable] ++

++

Constant Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

These constant variables provide a way for programs to examine ++the implementation-defined limits for the various float formats. ++

++

Of these variables, ++ each which has “-normalized” in its name ++ must have a value which is a normalized float, and ++ each which does not have “-normalized” in its name ++ may have a value which is either a normalized float ++ or a denormalized float, as appropriate. ++

++

Of these variables, ++ each which has “short-float” in its name ++ must have a value which is a short float, ++ each which has “single-float” in its name ++ must have a value which is a single float, ++ each which has “double-float” in its name ++ must have a value which is a double float, and ++ each which has “long-float” in its name ++ must have a value which is a long float. ++

++
++
*
++

most-positive-short-float, ++ most-positive-single-float, ++ most-positive-double-float, ++ most-positive-long-float ++

++

Each of these constant variables has as its value ++ the positive float of the largest magnitude ++ (closest in value to, but not equal to, positive infinity) ++ for the float format implied by its name. ++

++
++
*
++

least-positive-short-float, ++ least-positive-normalized-short-float, ++ least-positive-single-float, ++ least-positive-normalized-single-float, ++ least-positive-double-float, ++ least-positive-normalized-double-float, ++ least-positive-long-float, ++ least-positive-normalized-long-float ++

++

Each of these constant variables has as its value ++ the smallest positive (nonzero) float ++ for the float format implied by its name. ++

++
++
*
++

least-negative-short-float, ++ least-negative-normalized-short-float, ++ least-negative-single-float, ++ least-negative-normalized-single-float, ++ least-negative-double-float, ++ least-negative-normalized-double-float, ++ least-negative-long-float, ++ least-negative-normalized-long-float ++

++

Each of these constant variables has as its value ++ the negative (nonzero) float of the smallest magnitude ++ for the float format implied by its name. ++ (If an implementation supports minus zero as a different ++ object from positive zero, this value must not be minus zero.) ++

++
++
*
++

most-negative-short-float, ++ most-negative-single-float, ++ most-negative-double-float, ++ most-negative-long-float ++

++

Each of these constant variables has as its value ++ the negative float of the largest magnitude ++ (closest in value to, but not equal to, negative infinity) ++ for the float format implied by its name. ++

++
++
++ ++

Notes::

++ ++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/muffle_002dwarning.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++muffle-warning (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.43 muffle-warning [Restart]

++ ++

Data Arguments Required::

++ ++

None. ++

++

Description::

++ ++

This restart is established by warn so that handlers ++of warning conditions have a way to tell warn ++that a warning has already been dealt with and that no further action is warranted. ++

++

Examples::

++ ++
++
 (defvar *all-quiet* nil) ⇒  *ALL-QUIET*
++ (defvar *saved-warnings* '()) ⇒  *SAVED-WARNINGS*
++ (defun quiet-warning-handler (c)
++   (when *all-quiet*
++     (let ((r (find-restart 'muffle-warning c)))
++       (when r 
++         (push c *saved-warnings*)
++         (invoke-restart r)))))
++⇒  CUSTOM-WARNING-HANDLER
++ (defmacro with-quiet-warnings (&body forms)
++   `(let ((*all-quiet* t)
++          (*saved-warnings* '()))
++      (handler-bind ((warning #'quiet-warning-handler))
++        ,@forms
++        *saved-warnings*)))
++⇒  WITH-QUIET-WARNINGS
++ (setq saved
++   (with-quiet-warnings
++     (warn "Situation #1.")
++     (let ((*all-quiet* nil))
++       (warn "Situation #2."))
++     (warn "Situation #3.")))
++ |>  Warning: Situation #2.
++⇒  (#<SIMPLE-WARNING 42744421> #<SIMPLE-WARNING 42744365>)
++ (dolist (s saved) (format t "~&~A~
++ |>  Situation #3.
++ |>  Situation #1.
++⇒  NIL
++
++ ++

See Also::

++ ++

Restarts, ++Interfaces to Restarts, ++invoke-restart ++, ++muffle-warning ++ (function), ++warn ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/multiple_002dvalue_002dbind.html +@@ -0,0 +1,116 @@ ++ ++ ++ ++ ++ ++multiple-value-bind (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.48 multiple-value-bind [Macro]

++ ++

multiple-value-bind ({var}*) ++ values-form ++ {declaration}* ++ {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a symbol naming a variable; not evaluated. ++

++

values-form—a form; evaluated. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

Creates new variable bindings for the vars and ++executes a series of forms that use these bindings. ++

++

The variable bindings created are lexical unless ++special declarations are specified. ++

++

Values-form is evaluated, and each of the vars is ++bound to the respective value returned by that form. If there are more ++vars than values returned, extra values of nil are given to the ++remaining vars. If there are more values than ++vars, the excess ++values are discarded. The vars are bound to the values over ++the execution of the forms, which make up an implicit progn. ++The consequences are unspecified if a type declaration is specified ++for a var, but the value to which ++that var is bound is not consistent with ++the type declaration. ++

++

The scopes of the name binding and declarations ++do not include the values-form. ++

++

Examples::

++ ++
++
 (multiple-value-bind (f r) 
++     (floor 130 11)
++   (list f r)) ⇒  (11 9)
++
++ ++

See Also::

++ ++

let ++, ++multiple-value-call ++

++

Notes::

++ ++
++
 (multiple-value-bind ({var}*) values-form {form}*)
++ ≡ (multiple-value-call #'(lambda (&optional {var}* &rest #1=#:ignore)
++                             (declare (ignore #1#))
++                             {form}*)
++                         values-form)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/multiple_002dvalue_002dcall.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++multiple-value-call (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.49 multiple-value-call [Special Operator]

++ ++

multiple-value-call function-form form*{result}* ++

++

Arguments and Values::

++ ++

function-form—a form; evaluated to produce function. ++

++

function—a function designator ++ resulting from the evaluation of function-form. ++

++

form—a form. ++

++

results—the values returned by the function. ++

++

Description::

++ ++

Applies function to a list of the objects collected from groups of ++multiple values_2. ++

++

multiple-value-call first evaluates the function-form ++to obtain function, and then evaluates each form. ++All the values ++of each form are gathered together (not just one value from each) ++and given as arguments to the function. ++

++

Examples::

++
++
 (multiple-value-call #'list 1 '/ (values 2 3) '/ (values) '/ (floor 2.5))
++⇒  (1 / 2 3 / / 2 0.5)
++ (+ (floor 5 3) (floor 19 4)) ≡ (+ 1 4)
++⇒  5
++ (multiple-value-call #'+ (floor 5 3) (floor 19 4)) ≡ (+ 1 2 4 3)
++⇒  10
++
++ ++

See Also::

++ ++

multiple-value-list ++, ++multiple-value-bind ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/multiple_002dvalue_002dlist.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++multiple-value-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.50 multiple-value-list [Macro]

++ ++

multiple-value-list formlist ++

++

Arguments and Values::

++ ++

form—a form; evaluated as described below. ++

++

list—a list of the values returned by form. ++

++

Description::

++ ++

multiple-value-list evaluates form ++and creates a list of the multiple values_2 it returns. ++

++

Examples::

++ ++
++
 (multiple-value-list (floor -3 4)) ⇒  (-1 1)
++
++ ++

See Also::

++ ++

values-list ++, ++multiple-value-call ++

++

Notes::

++ ++

multiple-value-list and values-list are inverses ++of each other. ++

++
++
 (multiple-value-list form) ≡ (multiple-value-call #'list form)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/multiple_002dvalue_002dprog1.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++multiple-value-prog1 (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.51 multiple-value-prog1 [Special Operator]

++ ++

multiple-value-prog 1first-form {form}* ++

++

first-form-results ++

++

Arguments and Values::

++ ++

first-form—a form; evaluated as described below. ++

++

form—a form; evaluated as described below. ++

++

first-form-results—the values resulting from ++ the evaluation of first-form. ++

++

Description::

++ ++

multiple-value-prog1 evaluates first-form and saves ++all the values produced by that form. It then evaluates each ++form from left to right, discarding their values. ++

++

Examples::

++ ++
++
 (setq temp '(1 2 3)) ⇒  (1 2 3)
++ (multiple-value-prog1
++    (values-list temp)
++    (setq temp nil)
++    (values-list temp)) ⇒  1, 2, 3
++
++ ++

See Also::

++ ++

prog1 ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/multiple_002dvalue_002dsetq.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++multiple-value-setq (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.52 multiple-value-setq [Macro]

++ ++

multiple-value-setq vars formresult ++

++

Arguments and Values::

++ ++

vars—a list of symbols ++ that are either variable names ++ or names of symbol macros. ++

++

form—a form. ++

++

result—The primary value returned by the form. ++

++

Description::

++ ++

multiple-value-setq assigns values to vars. ++

++

The form is evaluated, ++and each var is assigned ++to the corresponding value returned by that form. ++If there are more vars than values returned, ++nil is assigned to the extra vars. ++If there are more values than vars, ++the extra values are discarded. ++

++

If any var is the name of a symbol macro, ++then it is assigned as if by setf. Specifically, ++

++
++
 (multiple-value-setq (symbol_1 ... symbol_n) value-producing-form)
++
++ ++

is defined to always behave in the same way as ++

++
++
 (values (setf (values symbol_1 ... symbol_n) value-producing-form))
++
++ ++

in order that the rules for order of evaluation and side-effects be consistent ++with those used by setf. ++ ++

++ ++ ++

See VALUES Forms as Places. ++

++

Examples::

++ ++
++
 (multiple-value-setq (quotient remainder) (truncate 3.2 2)) ⇒  1
++ quotient ⇒  1
++ remainder ⇒  1.2
++ (multiple-value-setq (a b c) (values 1 2)) ⇒  1
++ a ⇒  1
++ b ⇒  2
++ c ⇒  NIL
++ (multiple-value-setq (a b) (values 4 5 6)) ⇒  4
++ a ⇒  4
++ b ⇒  5
++
++ ++

See Also::

++ ++

setq ++, ++symbol-macrolet ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/multiple_002dvalues_002dlimit.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++multiple-values-limit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.55 multiple-values-limit [Constant Variable]

++ ++

Constant Value::

++ ++

An integer not smaller than 20, ++the exact magnitude of which is implementation-dependent. ++

++

Description::

++ ++

The upper exclusive bound on the number of values that may be ++ returned from a function, ++

++

bound or assigned by multiple-value-bind or multiple-value-setq, ++ or passed as a first argument to nth-value. ++(If these individual limits might differ, the minimum value is used.) ++

++

See Also::

++ ++

lambda-parameters-limit ++, ++call-arguments-limit ++

++

Notes::

++ ++

Implementors are encouraged to make this limit as large as possible. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/name_002dchar.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++name-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Characters Dictionary  

++
++
++

13.2.21 name-char [Function]

++ ++

name-char namechar-p ++

++

Arguments and Values::

++ ++

name—a string designator. ++

++

char-p—a character or nil. ++

++

Description::

++ ++

Returns the character object whose name is ++name (as determined by string-equali.e., lookup is not case sensitive). ++If such a character does not exist, nil is returned. ++

++

Examples::

++ ++
++
(name-char 'space) ⇒  #\Space
++(name-char "space") ⇒  #\Space
++(name-char "Space") ⇒  #\Space
++(let ((x (char-name #\a)))
++  (or (not x) (eql (name-char x) #\a))) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if name is not a string designator. ++

++

See Also::

++ ++

char-name ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/namestring.html +@@ -0,0 +1,168 @@ ++ ++ ++ ++ ++ ++namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.11 namestring, file-namestring, directory-namestring,

++

host-namestring, enough-namestring

++

[Function] ++

++

namestring pathnamenamestring ++

++

file-namestring pathnamenamestring ++

++

directory-namestring pathnamenamestring ++

++

host-namestring pathnamenamestring ++

++

enough-namestring pathname &optional defaultsnamestring ++

++

Arguments and Values::

++ ++

pathname—a pathname designator. ++

++

defaults—a pathname designator. ++

++

The default is the value of *default-pathname-defaults*. ++

++

namestring—a string or nil. ++

++

[Editorial Note by KMP: Under what circumstances can NIL be returned??] ++

++

Description::

++ ++

These functions convert pathname into a namestring. ++The name represented by pathname is returned as a namestring ++in an implementation-dependent canonical form. ++

++

namestring returns the full form of pathname. ++

++

file-namestring returns just the name, type, and version ++ components of pathname. ++

++

directory-namestring returns the directory name portion. ++

++

host-namestring returns the host name. ++

++

enough-namestring returns an abbreviated namestring ++ that is just sufficient to identify the file named by pathname ++ when considered relative to the defaults. ++ It is required that ++

++
++
 (merge-pathnames (enough-namestring pathname defaults) defaults)
++≡ (merge-pathnames (parse-namestring pathname nil defaults) defaults)
++
++ ++

in all cases, and the result of enough-namestring is ++the shortest reasonable string that will satisfy this criterion. ++

++

It is not necessarily possible to construct a valid namestring ++by concatenating some of the three shorter namestrings in some order. ++

++

Examples::

++ ++
++
 (namestring "getty")            
++⇒  "getty"
++ (setq q (make-pathname :host "kathy" 
++                         :directory 
++                           (pathname-directory *default-pathname-defaults*)
++                         :name "getty")) 
++⇒  #S(PATHNAME :HOST "kathy" :DEVICE NIL :DIRECTORY directory-name 
++       :NAME "getty" :TYPE NIL :VERSION NIL)
++ (file-namestring q) ⇒  "getty"
++ (directory-namestring q) ⇒  directory-name
++ (host-namestring q) ⇒  "kathy" 
++
++ ++
++
 ;;;Using Unix syntax and the wildcard conventions used by the
++ ;;;particular version of Unix on which this example was created:
++ (namestring
++   (translate-pathname "/usr/dmr/hacks/frob.l"
++                       "/usr/d*/hacks/*.l"
++                       "/usr/d*/backup/hacks/backup-*.*"))
++⇒  "/usr/dmr/backup/hacks/backup-frob.l"
++ (namestring
++   (translate-pathname "/usr/dmr/hacks/frob.l"
++                       "/usr/d*/hacks/fr*.l"
++                       "/usr/d*/backup/hacks/backup-*.*"))
++⇒  "/usr/dmr/backup/hacks/backup-ob.l"
++
++ ;;;This is similar to the above example but uses two different hosts,
++ ;;;U: which is a Unix and V: which is a VMS.  Note the translation
++ ;;;of file type and alphabetic case conventions.
++ (namestring
++   (translate-pathname "U:/usr/dmr/hacks/frob.l"
++                       "U:/usr/d*/hacks/*.l"
++                       "V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*"))
++⇒  "V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-FROB.LSP"
++ (namestring
++   (translate-pathname "U:/usr/dmr/hacks/frob.l"
++                       "U:/usr/d*/hacks/fr*.l"
++                       "V:SYS$DISK:[D*.BACKUP.HACKS]BACKUP-*.*"))
++⇒  "V:SYS$DISK:[DMR.BACKUP.HACKS]BACKUP-OB.LSP"
++
++ ++

See Also::

++ ++

truename ++, ++merge-pathnames ++, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/nconc.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++nconc (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.25 nconc [Function]

++ ++

nconc &rest listsconcatenated-list ++

++

Arguments and Values::

++ ++

list—each but the last must be a list ++ (which might be a dotted list but must not be a circular list); ++ the last list may be any object. ++

++

concatenated-list—a list. ++

++

Description::

++ ++

Returns a list that is the concatenation of lists. ++If no lists are supplied, (nconc) returns nil. ++

++

nconc is defined using the following recursive relationship: ++

++
++
 (nconc) ⇒  ()
++ (nconc nil . lists) ≡ (nconc . lists)
++ (nconc list) ⇒  list
++ (nconc list-1 list-2) ≡ (progn (rplacd (last list-1) list-2) list-1)
++ (nconc list-1 list-2 . lists) ≡ (nconc (nconc list-1 list-2) . lists)
++
++ ++

Examples::

++ ++
++
 (nconc) ⇒  NIL
++ (setq x '(a b c)) ⇒  (A B C)
++ (setq y '(d e f)) ⇒  (D E F)
++ (nconc x y) ⇒  (A B C D E F)
++ x ⇒  (A B C D E F)
++
++ ++

Note, in the example, that the value of x is now different, ++since its last cons ++has been rplacd’d to the value of y. ++If (nconc x y) were evaluated again, ++it would yield a piece of a circular list, ++whose printed representation would be ++(A B C D E F D E F D E F ...), repeating forever; ++if the *print-circle* switch were non-nil, ++it would be printed as (A B C . #1=(D E F . #1#)). ++

++
++
 (setq foo (list 'a 'b 'c 'd 'e)
++       bar (list 'f 'g 'h 'i 'j)
++       baz (list 'k 'l 'm)) ⇒  (K L M)
++ (setq foo (nconc foo bar baz)) ⇒  (A B C D E F G H I J K L M)
++ foo ⇒  (A B C D E F G H I J K L M)
++ bar ⇒  (F G H I J K L M)
++ baz ⇒  (K L M)
++
++ (setq foo (list 'a 'b 'c 'd 'e)
++       bar (list 'f 'g 'h 'i 'j)
++       baz (list 'k 'l 'm)) ⇒  (K L M)
++ (setq foo (nconc nil foo bar nil baz)) ⇒  (A B C D E F G H I J K L M) 
++ foo ⇒  (A B C D E F G H I J K L M)
++ bar ⇒  (F G H I J K L M)
++ baz ⇒  (K L M)
++
++ ++

Side Effects::

++ ++

The lists are modified rather than copied. ++

++

See Also::

++ ++

append ++, ++concatenate ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/next_002dmethod_002dp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++next-method-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.29 next-method-p [Local Function]

++ ++

Syntax::

++ ++

next-method-p <no arguments>generalized-boolean ++

++

Arguments and Values::

++ ++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

The locally defined function next-method-p can be used ++

++

within the body forms (but not the lambda list) ++

++

defined by a method-defining form to determine ++whether a next method exists. ++

++

The function next-method-p has lexical scope and indefinite extent. ++

++

Whether or not next-method-p is fbound in the ++global environment is implementation-dependent; ++however, the restrictions on redefinition and shadowing of ++next-method-p are the same as for symbols in the COMMON-LISP package ++which are fbound in the global environment. ++The consequences of attempting to use next-method-p outside ++of a method-defining form are undefined. ++

++

See Also::

++ ++

call-next-method ++, ++defmethod ++, ++call-method ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/nil-_0028Type_0029.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++nil (Type) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.1 nil [Type]

++ ++

Supertypes::

++

all types ++

++

Description::

++ ++

The type nil contains no objects and so is also ++called the empty type. ++The type nil is a subtype of every type. ++No object is of type nil. ++

++

Notes::

++ ++

The type containing the object nil is the type null, ++not the type nil. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/nil.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++nil (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.30 nil [Constant Variable]

++ ++

Constant Value::

++ ++

nil. ++

++

Description::

++ ++

nil represents both boolean (and generalized boolean) false ++and the empty list. ++

++

Examples::

++
++
 nil ⇒  NIL 
++
++ ++

See Also::

++ ++

t ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/no_002dapplicable_002dmethod.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++no-applicable-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.16 no-applicable-method [Standard Generic Function]

++ ++

Syntax::

++ ++

no-applicable-method generic-function &rest function-arguments{result}* ++

++

Method Signatures::

++ ++

no-applicable-method (generic-function t) ++ &rest function-arguments ++

++

Arguments and Values::

++ ++

generic-function—a generic function ++ on which no applicable method was found. ++

++

function-argumentsarguments to the generic-function. ++

++

result—an object. ++

++

Description::

++ ++

The generic function no-applicable-method is called when a ++generic function ++is invoked ++and no method on that generic function is applicable. ++The default method signals an error. ++

++

The generic function no-applicable-method is not intended ++to be called by programmers. Programmers may write methods for it. ++

++

Exceptional Situations::

++ ++

The default method signals an error of type error. ++

++

See Also::

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/no_002dnext_002dmethod.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++no-next-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.17 no-next-method [Standard Generic Function]

++ ++

Syntax::

++ ++

no-next-method generic-function method &rest args{result}* ++

++

Method Signatures::

++ ++

no-next-method (generic-function standard-generic-function) ++ (method standard-method) ++ &rest args ++

++

Arguments and Values::

++ ++

generic-functiongeneric function to which method belongs. ++

++

methodmethod that contained the call to ++ call-next-method for which there is no next method. ++

++

args – arguments to call-next-method. ++

++

result—an object. ++

++

Description::

++ ++

The generic function no-next-method is called by call-next-method ++when there is no next method. ++

++

The generic function no-next-method is not intended to be called by programmers. ++Programmers may write methods for it. ++

++

Exceptional Situations::

++ ++

The system-supplied method on no-next-method ++signals an error of type error. ++[Editorial Note by KMP: perhaps control-error??] ++

++

See Also::

++ ++

call-next-method ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/not-_0028Type-Specifier_0029.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++not (Type Specifier) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.19 not [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Combining. ++

++

Compound Type Specifier Syntax::

++ ++

(not{typespec}) ++

++

Compound Type Specifier Arguments::

++ ++

typespec—a type specifier. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of all objects that are not of the type typespec. ++

++

The argument is required, and cannot be *. ++

++

The symbol not is not valid as a type specifier. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/not.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++not (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.31 not [Function]

++ ++

not xboolean ++

++

Arguments and Values::

++ ++

x—a generalized boolean (i.e., any object). ++

++

boolean—a boolean. ++

++

Description::

++ ++

Returns t if x is false; ++otherwise, returns nil. ++

++

Examples::

++ ++
++
 (not nil) ⇒  T
++ (not '()) ⇒  T
++ (not (integerp 'sss)) ⇒  T
++ (not (integerp 1)) ⇒  NIL
++ (not 3.7) ⇒  NIL
++ (not 'apple) ⇒  NIL
++
++ ++

See Also::

++ ++

null ++

++

Notes::

++ ++

not is intended to be used to invert the ‘truth value’ of a boolean ++(or generalized boolean) ++whereas null is intended to be used to test for the empty list. ++Operationally, not and null compute the same result; ++which to use is a matter of style. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/nth.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++nth (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.22 nth [Accessor]

++ ++

nth n listobject ++

++

(setf ( nth n list) new-object)
++

++

Arguments and Values::

++ ++

n—a non-negative integer. ++

++

list—a list, ++

++

which might be a dotted list or a circular list. ++

++

object—an object. ++

++

new-object—an object. ++

++

Description::

++ ++

nth locates the nth element of list, ++where the car of the list is the “zeroth” element. ++

++

Specifically, ++

++
++
 (nth n list) ≡ (car (nthcdr n list))
++
++ ++

nth may be used to specify a place to setf. ++

++

Specifically, ++

++
++
 (setf (nth n list) new-object) ≡ (setf (car (nthcdr n list)) new-object)
++
++ ++

Examples::

++ ++
++
 (nth 0 '(foo bar baz)) ⇒  FOO
++ (nth 1 '(foo bar baz)) ⇒  BAR
++ (nth 3 '(foo bar baz)) ⇒  NIL
++ (setq 0-to-3 (list 0 1 2 3)) ⇒  (0 1 2 3)
++ (setf (nth 2 0-to-3) "two") ⇒  "two"
++ 0-to-3 ⇒  (0 1 "two" 3)
++
++ ++

See Also::

++ ++

elt ++, ++first ++, ++nthcdr ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/nth_002dvalue.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++nth-value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.56 nth-value [Macro]

++ ++

nth-value n formobject ++

++

Arguments and Values::

++ ++

n—a non-negative integer; evaluated. ++

++

form—a form; evaluated as described below. ++

++

object—an object. ++

++

Description::

++ ++

Evaluates n and then form, ++returning as its only value the nth value yielded by form, ++or nil if n is greater than or equal to the number of values ++returned by form. (The first returned value is numbered 0.) ++

++

Examples::

++ ++
++
 (nth-value 0 (values 'a 'b)) ⇒  A
++ (nth-value 1 (values 'a 'b)) ⇒  B
++ (nth-value 2 (values 'a 'b)) ⇒  NIL
++ (let* ((x 83927472397238947423879243432432432)
++        (y 32423489732)
++        (a (nth-value 1 (floor x y)))
++        (b (mod x y)))
++   (values a b (= a b)))
++⇒  3332987528, 3332987528, true
++
++ ++

See Also::

++ ++

multiple-value-list ++, ++nth ++

++

Notes::

++ ++

Operationally, the following relationship is true, although nth-value ++might be more efficient in some implementations ++because, for example, some consing might be avoided. ++

++
++
 (nth-value n form) ≡ (nth n (multiple-value-list form))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/nthcdr.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++nthcdr (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.31 nthcdr [Function]

++ ++

nthcdr n listtail ++

++

Arguments and Values::

++ ++

n—a non-negative integer. ++

++

list—a list, ++

++

which might be a dotted list or a circular list. ++

++

tail—an object. ++

++

Description::

++ ++

Returns the tail of list that would be obtained by calling cdr ++n times in succession. ++

++

Examples::

++ ++
++
 (nthcdr 0 '()) ⇒  NIL
++ (nthcdr 3 '()) ⇒  NIL
++ (nthcdr 0 '(a b c)) ⇒  (A B C)
++ (nthcdr 2 '(a b c)) ⇒  (C)
++ (nthcdr 4 '(a b c)) ⇒  ()
++ (nthcdr 1 '(0 . 1)) ⇒  1
++
++ (locally (declare (optimize (safety 3)))
++   (nthcdr 3 '(0 . 1)))
++ Error: Attempted to take CDR of 1.
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if n is not a non-negative integer. ++

++

For n being an integer greater than 1, ++the error checking done by (nthcdr n list) ++is the same as for (nthcdr (- n 1) (cdr list)); ++see the function cdr. ++

++

See Also::

++ ++

cdr, ++nth ++, ++rest ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/null-_0028System-Class_0029.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++null (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

14.2.2 null [System Class]

++ ++

Class Precedence List::

++

null, ++symbol, ++list, ++sequence, ++t ++

++

Description::

++ ++

The only object of type null is nil, ++which represents the empty list and can also be notated (). ++

++

See Also::

++ ++

Symbols as Tokens, ++Left-Parenthesis, ++Printing Symbols ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/null.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++null (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.24 null [Function]

++ ++

null objectboolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

boolean—a boolean. ++

++

Description::

++ ++

Returns t if object is the empty list; ++otherwise, returns nil. ++

++

Examples::

++ ++
++
 (null '()) ⇒  T
++ (null nil) ⇒  T
++ (null t) ⇒  NIL
++ (null 1) ⇒  NIL
++
++ ++

See Also::

++ ++

not ++

++

Notes::

++ ++

null is intended to be used to test for the empty list ++whereas not is intended to be used to invert a boolean ++(or generalized boolean). ++Operationally, null and not compute the same result; ++which to use is a matter of style. ++

++
++
 (null object) ≡ (typep object 'null) ≡ (eq object '())
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/number.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++number (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.1 number [System Class]

++ ++

Class Precedence List::

++

number, ++t ++

++

Description::

++ ++

The type number contains objects which represent ++mathematical numbers. ++

++

The types real and complex are disjoint ++subtypes of number. ++

++

The function = tests for numerical equality. ++The function eql, when its arguments are both numbers, ++tests that they have both the same type and numerical value. ++Two numbers that are the same under eql or = ++are not necessarily the same under eq. ++

++

Notes::

++ ++

Common Lisp differs from mathematics on some naming issues. In mathematics, ++the set of real numbers is traditionally described as a subset of the ++complex numbers, but in Common Lisp, the type real and the type complex are ++disjoint. The Common Lisp type which includes all mathematical complex ++numbers is called number. The reasons for these differences ++include historical precedent, compatibility with most other popular ++computer languages, and various issues of time and space efficiency. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/numberp.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++numberp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.44 numberp [Function]

++ ++

numberp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type number; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (numberp 12) ⇒  true
++ (numberp (expt 2 130)) ⇒  true
++ (numberp #c(5/3 7.2)) ⇒  true
++ (numberp nil) ⇒  false
++ (numberp (cons 1 2)) ⇒  false
++
++ ++

Notes::

++ ++
++
 (numberp object) ≡ (typep object 'number)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/numerator.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++numerator (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.53 numerator, denominator [Function]

++ ++

numerator rationalnumerator ++

++

denominator rationaldenominator ++

++

Arguments and Values::

++ ++

rational—a rational. ++

++

numerator—an integer. ++

++

denominator—a positive integer. ++

++

Description::

++ ++

numerator and denominator reduce rational ++to canonical form and compute the numerator or denominator of that number. ++

++

numerator and denominator return the numerator ++or denominator of the canonical form of rational. ++

++

If rational is an integer, ++numerator returns rational ++and denominator returns 1. ++

++

Examples::

++
++
 (numerator 1/2) ⇒  1
++ (denominator 12/36) ⇒  3
++ (numerator -1) ⇒  -1
++ (denominator (/ -33)) ⇒  33
++ (numerator (/ 8 -6)) ⇒  -4
++ (denominator (/ 8 -6)) ⇒  3
++
++ ++

See Also::

++ ++

/ ++

++

Notes::

++
++
 (gcd (numerator x) (denominator x)) ⇒  1
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/open.html +@@ -0,0 +1,356 @@ ++ ++ ++ ++ ++ ++open (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.29 open [Function]

++ ++

open filespec &key direction element-type ++ if-exists if-does-not-exist ++ external-format
++ ⇒ stream ++

++

Arguments and Values::

++ ++

filespec—a pathname designator. ++

++

direction—one of :input, :output, :io, or :probe. ++ The default is :input. ++

++

element-type—a type specifier ++ for recognizable subtype of character; ++ or a type specifier ++ for a finite recognizable subtype of integer; ++ or one of the symbols ++ signed-byte, ++ unsigned-byte, ++ or :default. ++ The default is character. ++

++

if-exists—one of :error, :new-version, :rename, ++ :rename-and-delete, :overwrite, :append, ++ :supersede, or nil. ++ The default is :new-version if the version component of filespec is :newest, ++ or :error otherwise. ++

++

if-does-not-exist—one of :error, :create, or nil. ++ The default is :error if direction is :input ++ or if-exists is :overwrite or :append; ++ :create if direction is :output or :io, ++ and if-exists is neither :overwrite nor :append; ++ or nil when direction is :probe. ++

++

external-format—an external file format designator. ++ The default is :default. ++

++

stream—a file stream or nil. ++

++

Description::

++ ++

open creates, opens, and returns a file stream ++that is connected to the file specified by filespec. ++Filespec is the name of the file to be opened. ++If the filespec designator is a stream, ++that stream is not closed first or otherwise affected. ++

++

The keyword arguments to open specify the characteristics ++of the file stream that is returned, and how to handle errors. ++

++

If direction is :input ++or :probe, ++or if if-exists is not :new-version ++and the version component of the filespec is :newest, ++then the file opened is that file already existing in the file system ++that has a version greater than that of any other file in the file system ++whose other pathname components are the same as those of filespec. ++

++

An implementation is required to recognize all of ++the open keyword options ++and to do something reasonable in the context of the host operating ++system. ++For example, if a file system does not support distinct file ++versions and does not distinguish the notions of deletion and expunging, ++:new-version might be treated the same as ++:rename or :supersede, and :rename-and-delete might ++be treated the same as :supersede. ++

++
++
:direction
++

These are the possible values for direction, ++and how they affect the nature of the stream that is created: ++

++
++
:input
++

Causes the creation of an input file stream. ++

++
++
:output
++

Causes the creation of an output file stream. ++

++
++
:io
++

Causes the creation of a bidirectional file stream. ++

++
++
:probe
++

Causes the creation of a “no-directional” file stream; ++in effect, the file stream is created ++and then closed prior to being returned by open. ++

++
++
++ ++
++
:element-type
++

The element-type specifies the unit of transaction for the file stream. ++If it is :default, ++the unit is determined by file system, ++possibly based on the file. ++

++
++
:if-exists
++

if-exists specifies the action to be taken if direction is ++:output or :io and a file of the name filespec ++already exists. ++If direction is :input, not supplied, or :probe, ++if-exists is ignored. ++These are the results of open as modified by if-exists: ++

++
++
:error
++

An error of type file-error is signaled. ++

++
++
:new-version
++

A new file is created with a larger version number. ++

++
++
:rename
++

The existing file is renamed to some other name and then a new file is created. ++

++
++
:rename-and-delete
++

The existing file is renamed to some other name, ++then it is deleted but not expunged, and then a new file is created. ++

++
++
:overwrite
++

Output operations on the stream destructively modify the existing file. ++If direction is :io the file is opened in a bidirectional mode ++that allows both reading and writing. The file pointer is initially ++positioned at the beginning of the file; however, the file is not truncated ++back to length zero when it is opened. ++

++
++
:append
++

Output operations on the stream destructively modify the existing file. ++The file pointer is initially positioned at the end of the file. ++

++

If direction is :io, ++the file is opened in a bidirectional mode that allows both reading and writing. ++

++
++
:supersede
++

The existing file is superseded; ++that is, a new file with the same name as the old one is created. ++If possible, the implementation should not destroy the old file until the new ++stream is closed. ++

++
++
nil
++

No file or stream is created; ++instead, nil is returned to indicate failure. ++

++
++
++ ++
++
:if-does-not-exist
++

if-does-not-exist ++specifies the action to be taken if ++a file of name filespec does not already exist. ++These are the results of open as modified by if-does-not-exist: ++

++
++
:error
++

An error of type file-error is signaled. ++

++
++
:create
++

An empty file is created. ++Processing continues as if the file ++had already existed but no processing as ++directed by if-exists is performed. ++

++
++
nil
++

No file or stream is created; ++instead, nil is returned to indicate failure. ++

++
++
++ ++
++
:external-format
++

This option selects an external file format for the file: ++The only standardized value for this option is :default, ++although implementations are permitted to define additional ++external file formats and implementation-dependent values ++returned by stream-external-format can also be used by conforming programs. ++

++

The external-format is meaningful for ++any kind of file stream whose element type ++is a subtype of character. ++This option is ignored for streams for which it is not meaningful; ++however, implementations may define other element types ++for which it is meaningful. ++The consequences are unspecified if a character is written ++that cannot be represented by the given external file format. ++

++
++
++ ++

When a file is opened, a file stream is constructed to serve ++as the file system’s ambassador to the Lisp environment; ++operations on the file stream are reflected by operations on the file ++in the file system. ++

++

A file can be deleted, renamed, or destructively modified by open. ++

++

For information about opening relative pathnames, ++see Merging Pathnames. ++

++

Examples::

++ ++
++
 (open filespec :direction :probe)  ⇒  #<Closed Probe File Stream...>
++ (setq q (merge-pathnames (user-homedir-pathname) "test"))
++⇒  #<PATHNAME :HOST NIL :DEVICE device-name :DIRECTORY directory-name
++    :NAME "test" :TYPE NIL :VERSION :NEWEST>
++ (open filespec :if-does-not-exist :create) ⇒  #<Input File Stream...>
++ (setq s (open filespec :direction :probe)) ⇒  #<Closed Probe File Stream...>
++ (truename s) ⇒  #<PATHNAME :HOST NIL :DEVICE device-name :DIRECTORY
++    directory-name :NAME filespec :TYPE extension :VERSION 1>
++ (open s :direction :output :if-exists nil) ⇒  NIL 
++
++ ++

Affected By::

++ ++

The nature and state of the host computer’s file system. ++

++

Exceptional Situations::

++ ++

If if-exists is :error, (subject to the ++constraints on the meaning of if-exists listed above), ++an error of type file-error is signaled. ++

++

If if-does-not-exist is :error (subject to the ++constraints on the meaning of if-does-not-exist listed above), ++an error of type file-error is signaled. ++

++

If it is impossible for an implementation to handle some option ++in a manner close to what is specified here, ++an error of type error might be signaled. ++

++

An error of type file-error is signaled if ++(wild-pathname-p filespec) returns true. ++

++

An error of type error is signaled if the external-format ++is not understood by the implementation. ++

++

The various file systems in existence today have widely differing capabilities, ++and some aspects of the file system are beyond the scope of this specification ++to define. A given implementation might not be able to support all of these options ++in exactly the manner stated. An implementation is required to recognize all of ++these option keywords and to try to do something “reasonable” in the context of the ++host file system. Where necessary to accomodate the file system, ++an implementation deviate slightly from the semantics specified here without ++being disqualified for consideration as a conforming implementation. ++If it is utterly impossible for an implementation to handle some option ++in a manner similar to what is specified here, it may simply signal an error. ++

++

With regard to the :element-type option, if a type is ++requested that is not supported by the file system, a substitution of types ++such as that which goes on in upgrading is permissible. As a minimum ++requirement, it should be the case that opening an output stream ++to a file in a given element type and later opening ++an input stream to the same file in the same element type ++should work compatibly. ++

++

See Also::

++ ++

with-open-file ++, ++close ++, ++pathname, ++logical-pathname, ++

++

Merging Pathnames, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

open does not automatically close the file when an abnormal ++exit occurs. ++

++

When element-type is a subtype of character, ++read-char and/or write-char can be ++used on the resulting file stream. ++

++

When element-type is a subtype of integer, ++read-byte and/or write-byte can be used on the resulting file stream. ++

++

When element-type is :default, ++the type can be determined by using stream-element-type. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/open_002dstream_002dp.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++open-stream-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.11 open-stream-p [Function]

++ ++

open-stream-p streamgeneralized-boolean ++

++

Arguments and Values::

++ ++

stream—a stream. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if stream is an open stream; ++otherwise, returns false. ++

++

Streams are open until they have been explicitly closed with close, ++or until they are implicitly closed due to exit from a ++ with-output-to-string, ++ with-open-file, ++ with-input-from-string, or ++ with-open-stream form. ++

++

Examples::

++ ++
++
 (open-stream-p *standard-input*) ⇒  true
++
++ ++

Affected By::

++ ++

close. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/optimize.html +@@ -0,0 +1,146 @@ ++ ++ ++ ++ ++ ++optimize (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.25 optimize [Declaration]

++ ++

Syntax::

++ ++

(optimize {quality | (quality value)}*) ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

Arguments::

++ ++

quality—an optimize quality. ++

++

value—one of the integers 0, 1, 2, or 3. ++

++

Valid Context::

++ ++

declaration or proclamation ++

++

Description::

++ ++

Advises the compiler that each quality should be given attention ++according to the specified corresponding value. ++Each quality must be a symbol naming an optimize quality; ++the names and meanings of the standard optimize qualities are shown in ++Figure 3–25. ++

++
++
  Name               Meaning                            
++  compilation-speed  speed of the compilation process   
++  debug              ease of debugging                  
++  safety             run-time error checking            
++  space              both code size and run-time space  
++  speed              speed of the object code           
++
++             Figure 3–25: Optimize qualities           
++
++
++ ++

There may be other, implementation-defined optimize qualities. ++

++

A value 0 means that the corresponding quality is totally ++unimportant, and 3 that the quality is extremely important; ++1 and 2 are intermediate values, with 1 the ++neutral value. ++(quality 3) can be abbreviated to quality. ++

++

Note that code which has the optimization (safety 3), ++or just safety, ++is called safe code. ++

++

The consequences are unspecified if a quality appears more than once ++with different values. ++

++

Examples::

++ ++
++
 (defun often-used-subroutine (x y)
++   (declare (optimize (safety 2)))
++   (error-check x y)
++   (hairy-setup x)
++   (do ((i 0 (+ i 1))
++        (z x (cdr z)))
++       ((null z))
++     ;; This inner loop really needs to burn.
++     (declare (optimize speed))
++     (declare (fixnum i))
++     ))
++
++ ++

See Also::

++ ++

declare, ++declaim ++, ++proclaim ++, ++Declaration Scope ++

++

Notes::

++ ++

An optimize declaration never applies to either a variable or ++a function binding. An optimize declaration can only ++be a free declaration. For more information, see Declaration Scope. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/or-_0028Type-Specifier_0029.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++or (Type Specifier) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.21 or [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Combining. ++

++

Compound Type Specifier Syntax::

++ ++

(or{{typespec}*}) ++

++

Compound Type Specifier Arguments::

++ ++

typespec—a type specifier. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of all objects of the ++type determined by the union of the typespecs. ++For example, the type list by definition is the same as (or null cons). ++Also, the value returned by position is an object of type (or null (integer 0 *)); ++i.e., either nil or a non-negative integer. ++

++

* is not permitted as an argument. ++

++

The type specifiers (or) and nil are equivalent. ++The symbol or is not valid as a type specifier; ++and, specifically, it is not an abbreviation for (or). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/or.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++or (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.44 or [Macro]

++ ++

or {form}*{results}* ++

++

Arguments and Values::

++ ++

form—a form. ++

++

results—the values or primary value (see below) ++ resulting from the evaluation of ++ the last form executed or nil. ++

++

Description::

++ ++

or evaluates each form, one at a time, from left to right. ++The evaluation of all forms terminates when a form evaluates ++to true (i.e., something other than nil). ++

++

If the evaluation of any form other than the last returns a ++primary value that is true, or immediately returns ++that value (but no additional values) without evaluating the ++remaining forms. ++If every form but the last returns false as its primary value, ++or returns all values returned by the last form. ++If no forms are supplied, or returns nil. ++

++

Examples::

++ ++
++
 (or) ⇒  NIL 
++ (setq temp0 nil temp1 10 temp2 20 temp3 30) ⇒  30
++ (or temp0 temp1 (setq temp2 37)) ⇒  10
++ temp2 ⇒  20
++ (or (incf temp1) (incf temp2) (incf temp3)) ⇒  11
++ temp1 ⇒  11
++ temp2 ⇒  20
++ temp3 ⇒  30
++ (or (values) temp1) ⇒  11
++ (or (values temp1 temp2) temp3) ⇒  11
++ (or temp0 (values temp1 temp2)) ⇒  11, 20
++ (or (values temp0 temp1) (values temp2 temp3)) ⇒  20, 30
++
++ ++

See Also::

++ ++

and ++, ++some, ++unless ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.1 package [System Class]

++ ++

Class Precedence List::

++

package, ++t ++

++

Description::

++ ++

A package is a namespace that maps symbol names ++to symbols; see Package Concepts. ++

++

See Also::

++ ++

Package Concepts, ++Printing Other Objects, ++Symbols as Tokens ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002derror.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++package-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.29 package-error [Condition Type]

++ ++

Class Precedence List::

++

package-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type package-error consists of error conditions ++related to operations on packages. ++The offending package (or package name) ++is initialized by the :package initialization argument to make-condition, ++and is accessed by the function package-error-package. ++

++

See Also::

++ ++

package-error-package ++, ++Conditions ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002derror_002dpackage.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++package-error-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Packages Dictionary  

++
++
++

11.2.30 package-error-package [Function]

++ ++

package-error-package conditionpackage ++

++

Arguments and Values::

++ ++

condition—a condition of type package-error. ++

++

package—a package designator. ++

++

Description::

++ ++

Returns a designator for the offending package ++in the situation represented by the condition. ++

++

Examples::

++ ++
++
 (package-error-package 
++   (make-condition 'package-error
++     :package (find-package "COMMON-LISP")))
++⇒  #<Package "COMMON-LISP">
++
++ ++

See Also::

++ ++

package-error ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002dname.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++package-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.22 package-name [Function]

++ ++

package-name packagename ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

name—a string ++

++

or nil. ++

++

Description::

++ ++

package-name returns the string that names package, ++

++

or nil if the package designator ++is a package object that has no name (see the function delete-package). ++

++

Examples::

++ ++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (package-name *package*) ⇒  "COMMON-LISP-USER"
++ (package-name (symbol-package :test)) ⇒  "KEYWORD"
++ (package-name (find-package 'common-lisp)) ⇒  "COMMON-LISP"
++
++ ++
++
 (defvar *foo-package* (make-package "FOO"))
++ (rename-package "FOO" "FOO0")
++ (package-name *foo-package*) ⇒  "FOO0"
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if package is not a package designator. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002dnicknames.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++package-nicknames (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.2.23 package-nicknames [Function]

++ ++

package-nicknames packagenicknames ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

nicknames—a list of strings. ++

++

Description::

++ ++

Returns the list of nickname strings ++for package, not including the name of package. ++

++

Examples::

++ ++
++
 (package-nicknames (make-package 'temporary
++                                   :nicknames '("TEMP" "temp")))
++⇒  ("temp" "TEMP") 
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if package is not a package designator. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002dshadowing_002dsymbols.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++package-shadowing-symbols (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.24 package-shadowing-symbols [Function]

++ ++

package-shadowing-symbols packagesymbols ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

symbols—a list of symbols. ++

++

Description::

++ ++

Returns a list of symbols that have been declared ++as shadowing symbols in package by shadow ++or shadowing-import (or the equivalent defpackage options). ++All symbols on this list are present in package. ++

++

Examples::

++ ++
++
 (package-shadowing-symbols (make-package 'temp)) ⇒  ()
++ (shadow 'cdr 'temp) ⇒  T
++ (package-shadowing-symbols 'temp) ⇒  (TEMP::CDR)
++ (intern "PILL" 'temp) ⇒  TEMP::PILL, NIL
++ (shadowing-import 'pill 'temp) ⇒  T
++ (package-shadowing-symbols 'temp) ⇒  (PILL TEMP::CDR)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if package is not a package designator. ++

++

See Also::

++ ++

shadow ++, ++shadowing-import ++

++

Notes::

++ ++

Whether the list of symbols is fresh is implementation-dependent. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002duse_002dlist.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++package-use-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

11.2.25 package-use-list [Function]

++ ++

package-use-list packageuse-list ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

use-list—a list of package objects. ++

++

Description::

++ ++

Returns a list of other packages used by package. ++

++

Examples::

++ ++
++
 (package-use-list (make-package 'temp)) ⇒  (#<PACKAGE "COMMON-LISP">)
++ (use-package 'common-lisp-user 'temp) ⇒  T
++ (package-use-list 'temp) ⇒  (#<PACKAGE "COMMON-LISP"> #<PACKAGE "COMMON-LISP-USER">)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if package is not a package designator. ++

++

See Also::

++ ++

use-package ++, ++unuse-package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/package_002dused_002dby_002dlist.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++package-used-by-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.26 package-used-by-list [Function]

++ ++

package-used-by-list packageused-by-list ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

used-by-list—a list of package objects. ++

++

Description::

++ ++

package-used-by-list returns a list ++of other packages that use package. ++

++

Examples::

++ ++
++
 (package-used-by-list (make-package 'temp)) ⇒  ()
++ (make-package 'trash :use '(temp)) ⇒  #<PACKAGE "TRASH">
++ (package-used-by-list 'temp) ⇒  (#<PACKAGE "TRASH">)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if package is not a package. ++

++

See Also::

++ ++

use-package ++, ++unuse-package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/packagep.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++packagep (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.27 packagep [Function]

++ ++

packagep objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type package; ++otherwise, returns false. ++

++

Examples::

++
++
 (packagep *package*) ⇒  true 
++ (packagep 'common-lisp) ⇒  false 
++ (packagep (find-package 'common-lisp)) ⇒  true 
++
++ ++

Notes::

++ ++
++
 (packagep object) ≡ (typep object 'package)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pairlis.html +@@ -0,0 +1,114 @@ ++ ++ ++ ++ ++ ++pairlis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.38 pairlis [Function]

++ ++

pairlis keys data &optional alistnew-alist ++

++

Arguments and Values::

++ ++

keys—a proper list. ++

++

data—a proper list. ++

++

alist—an association list. ++ The default is the empty list. ++

++

new-alist—an association list. ++

++

Description::

++ ++

Returns an association list that associates ++elements of keys to corresponding elements of data. ++The consequences are undefined if keys and data are ++not of the same length. ++

++

If alist is supplied, pairlis returns ++a modified alist with the ++new pairs prepended to it. ++The new pairs may appear in the resulting association list in ++either forward or backward order. ++The result of ++

++
++
 (pairlis '(one two) '(1 2) '((three . 3) (four . 19)))
++
++ ++

might be ++

++
++
 ((one . 1) (two . 2) (three . 3) (four . 19))
++
++ ++

or ++

++
++
 ((two . 2) (one . 1) (three . 3) (four . 19))
++
++ ++

Examples::

++
++
 (setq keys '(1 2 3)
++        data '("one" "two" "three")
++        alist '((4 . "four"))) ⇒  ((4 . "four"))
++ (pairlis keys data) ⇒  ((3 . "three") (2 . "two") (1 . "one"))
++ (pairlis keys data alist)
++⇒  ((3 . "three") (2 . "two") (1 . "one") (4 . "four"))
++ alist ⇒  ((4 . "four"))
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if keys and data are not proper lists. ++

++

See Also::

++ ++

acons ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/parse_002derror.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++parse-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.8 parse-error [Condition Type]

++ ++

Class Precedence List::

++ ++

parse-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type parse-error consists of ++error conditions that are related to parsing. ++

++

See Also::

++ ++

parse-namestring ++, ++reader-error ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/parse_002dinteger.html +@@ -0,0 +1,119 @@ ++ ++ ++ ++ ++ ++parse-integer (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.59 parse-integer [Function]

++ ++

parse-integer string &key start end radix junk-allowedinteger, pos ++

++

Arguments and Values::

++ ++

string—a string. ++

++

start, endbounding index designators of string. ++ The defaults for start and end are 0 and nil, respectively. ++

++

radix—a radix. ++ The default is 10. ++

++

junk-allowed—a generalized boolean. ++ The default is false. ++

++

integer—an integer or false. ++

++

pos—a bounding index of string. ++

++

Description::

++ ++

parse-integer parses an integer in the specified radix ++from the substring of string delimited by start and end. ++

++

parse-integer expects an optional sign (+ or -) followed by ++a a non-empty sequence of digits to be interpreted in the specified radix. ++Optional leading and trailing whitespace_1 is ignored. ++

++

parse-integer does not recognize the syntactic radix-specifier ++prefixes #O, #B, #X, and #nR, ++nor does it recognize a trailing decimal point. ++

++

If junk-allowed is false, an error of type parse-error is ++signaled if substring does not consist entirely of the representation of a ++signed integer, possibly surrounded on either side by whitespace_1 ++characters. ++

++

The first value returned is either ++ the integer that was parsed, ++ or else nil if no syntactically correct integer ++ was seen but junk-allowed was true. ++

++

The second value is either ++ the index into the string of the delimiter that terminated the parse, ++ or the upper bounding index of the substring if the parse terminated at ++ the end of the substring (as is always the case if junk-allowed ++ is false). ++

++

Examples::

++
++
 (parse-integer "123") ⇒  123, 3
++ (parse-integer "123" :start 1 :radix 5) ⇒  13, 3
++ (parse-integer "no-integer" :junk-allowed t) ⇒  NIL, 0
++
++ ++

Exceptional Situations::

++ ++

If junk-allowed is false, ++an error is signaled if substring does not consist entirely of ++the representation of an integer, ++possibly surrounded on either side by ++whitespace_1 characters. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/parse_002dnamestring.html +@@ -0,0 +1,210 @@ ++ ++ ++ ++ ++ ++parse-namestring (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.12 parse-namestring [Function]

++ ++

parse-namestring thing &optional host default-pathname &key start end junk-allowed
++ ⇒ pathname, position ++

++

Arguments and Values::

++ ++

thing—a string, ++ a pathname, ++ or a stream associated with a file. ++

++

host—a valid pathname host, a logical host, or nil. ++

++

default-pathname—a pathname designator. ++ The default is the value of *default-pathname-defaults*. ++

++

start, endbounding index designators of thing. ++ The defaults for start and end are 0 and nil, respectively. ++

++

junk-allowed—a generalized boolean. ++ The default is false. ++

++

pathname—a pathname, or nil. ++

++

position—a bounding index designator for thing. ++

++

Description::

++ ++

Converts thing into a pathname. ++

++

The host supplies a host name with respect to which the parsing occurs. ++

++

If thing is a stream associated with a file, ++processing proceeds as if the pathname used to open that file ++had been supplied instead. ++

++

If thing is a pathname, ++the host and the host component of thing are compared. ++If they match, ++two values are immediately returned: thing and start; ++otherwise (if they do not match), an error is signaled. ++

++

Otherwise (if thing is a string), ++parse-namestring parses the name of a file within ++the substring of thing bounded by start and end. ++

++

If thing is a string then ++the substring of thing bounded by start and end ++is parsed into a pathname ++as follows: ++

++
++
*
++

If host is a logical host then thing is parsed ++ as a logical pathname namestring ++ on the host. ++

++
++
*
++

If host is nil and thing is a syntactically valid ++ logical pathname namestring containing an explicit host, ++ then it is parsed as a logical pathname namestring. ++

++
++
*
++

If host is nil, ++ default-pathname is a logical pathname, ++ and thing is a syntactically valid logical pathname namestring ++ without an explicit host, ++ then it is parsed as a logical pathname namestring ++ on the host that is the host component of default-pathname. ++

++
++
*
++

Otherwise, the parsing of thing is implementation-defined. ++

++
++
++ ++

In the first ++of these ++cases, ++the host portion of the logical pathname namestring ++and its following colon are optional. ++

++

If the host portion of the namestring and host ++are both present and do not match, ++an error is signaled. ++

++

If junk-allowed is true, ++then the primary value is the pathname parsed ++or, if no syntactically correct pathname was seen, nil. ++If junk-allowed is false, ++then the entire substring is scanned, ++and the primary value is the pathname parsed. ++

++

In either case, the secondary value ++is the index into thing of the delimiter that terminated the parse, ++or the index beyond the substring if the parse terminated at the end of the substring ++ (as will always be the case if junk-allowed is false). ++

++

Parsing a null string always succeeds, ++producing a pathname with all components (except the host) equal to nil. ++

++

If thing contains an explicit host name and no explicit device name, ++then it is implementation-defined whether parse-namestring ++will supply the standard default device for that host as the device component ++of the resulting pathname. ++

++

Examples::

++ ++
++
 (setq q (parse-namestring "test"))  
++⇒  #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" 
++       :TYPE NIL :VERSION NIL)
++ (pathnamep q) ⇒  true
++ (parse-namestring "test") 
++⇒  #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test"
++       :TYPE NIL :VERSION NIL), 4
++ (setq s (open xxx)) ⇒  #<Input File Stream...>
++ (parse-namestring s) 
++⇒  #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME xxx 
++       :TYPE NIL :VERSION NIL), 0
++ (parse-namestring "test" nil nil :start 2 :end 4 )
++ ⇒  #S(PATHNAME ...), 15
++ (parse-namestring "foo.lisp")
++⇒  #P"foo.lisp"
++
++ ++

Exceptional Situations::

++ ++

If junk-allowed is false, ++an error of type parse-error is signaled if thing ++does not consist entirely of the representation of a pathname, ++possibly surrounded on either side by whitespace_1 characters if that is ++appropriate to the cultural conventions of the implementation. ++

++

If host is supplied and not nil, ++and thing contains a manifest host name, ++an error of type error is signaled if the hosts do not match. ++

++

If thing is a logical pathname namestring ++and if the host portion of the namestring and host ++are both present and do not match, ++an error of type error is signaled. ++

++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

->UNSPECIFIC as a Component Value, ++

++

Pathnames as Filenames ++

++
++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pathname-_0028System-Class_0029.html +@@ -0,0 +1,62 @@ ++ ++ ++ ++ ++ ++pathname (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.1 pathname [System Class]

++ ++

Class Precedence List::

++

pathname, ++t ++

++

Description::

++ ++

A pathname is a structured object which represents a filename. ++

++

There are two kinds of pathnamesphysical pathnames and ++logical pathnames. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pathname.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.3 pathname [Function]

++ ++

pathname pathspecpathname ++

++

Arguments and Values::

++ ++

pathspec—a pathname designator. ++

++

pathname—a pathname. ++

++

Description::

++ ++

Returns the pathname denoted by pathspec. ++

++

If the pathspec designator is a stream, ++the stream can be either open or closed; ++in both cases, the pathname returned ++corresponds to the filename used to open the file. ++pathname returns the same pathname for a file stream ++after it is closed as it did when it was open. ++

++

If the pathspec designator is ++a file stream created by opening a logical pathname, ++a logical pathname is returned. ++

++

Examples::

++ ++
++
 ;; There is a great degree of variability permitted here.  The next
++ ;; several examples are intended to illustrate just a few of the many
++ ;; possibilities.  Whether the name is canonicalized to a particular
++ ;; case (either upper or lower) depends on both the file system and the
++ ;; implementation since two different implementations using the same
++ ;; file system might differ on many issues.  How information is stored
++ ;; internally (and possibly presented in #S notation) might vary,
++ ;; possibly requiring `accessors' such as PATHNAME-NAME to perform case
++ ;; conversion upon access.  The format of a namestring is dependent both
++ ;; on the file system and the implementation since, for example, one
++ ;; implementation might include the host name in a namestring, and
++ ;; another might not.  #S notation would generally only be used in a
++ ;; situation where no appropriate namestring could be constructed for use
++ ;; with #P.
++ (setq p1 (pathname "test"))
++⇒  #P"CHOCOLATE:TEST" ; with case canonicalization (e.g., VMS)
++OR⇒ #P"VANILLA:test"   ; without case canonicalization (e.g., Unix)
++OR⇒ #P"test"
++OR⇒ #S(PATHNAME :HOST "STRAWBERRY" :NAME "TEST")
++OR⇒ #S(PATHNAME :HOST "BELGIAN-CHOCOLATE" :NAME "test")
++ (setq p2 (pathname "test"))
++⇒  #P"CHOCOLATE:TEST"
++OR⇒ #P"VANILLA:test"
++OR⇒ #P"test"
++OR⇒ #S(PATHNAME :HOST "STRAWBERRY" :NAME "TEST")
++OR⇒ #S(PATHNAME :HOST "BELGIAN-CHOCOLATE" :NAME "test")
++ (pathnamep p1) ⇒  true
++ (eq p1 (pathname p1)) ⇒  true
++ (eq p1 p2)
++⇒  true
++ORfalse
++ (with-open-file (stream "test" :direction :output)
++   (pathname stream))
++⇒  #P"ORANGE-CHOCOLATE:>Gus>test.lisp.newest"
++
++ ++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pathname_002dhost.html +@@ -0,0 +1,181 @@ ++ ++ ++ ++ ++ ++pathname-host (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.6 pathname-host, pathname-device, pathname-directory,

++

pathname-name, pathname-type, pathname-version

++

[Function] ++

++

pathname-host pathname &key casehost ++

++

pathname-device pathname &key casedevice ++

++

pathname-directory pathname &key casedirectory ++

++

pathname-name pathname &key casename ++

++

pathname-type pathname &key casetype ++

++

pathname-version pathnameversion ++

++

Arguments and Values::

++ ++

pathname—a pathname designator. ++

++

case—one of :local or :common. ++ The default is :local. ++

++

host—a valid pathname host. ++

++

device—a valid pathname device. ++

++

directory—a valid pathname directory. ++

++

name—a valid pathname name. ++

++

type—a valid pathname type. ++

++

version—a valid pathname version. ++

++

Description::

++ ++

These functions return the components of pathname. ++

++

If the pathname designator is a pathname, ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++

++

If case is supplied, ++it is treated as described in Case in Pathname Components. ++

++

Examples::

++ ++
++
 (setq q (make-pathname :host "KATHY"
++                        :directory "CHAPMAN" 
++                        :name "LOGIN" :type "COM"))
++⇒  #P"KATHY::[CHAPMAN]LOGIN.COM"
++ (pathname-host q) ⇒  "KATHY"
++ (pathname-name q) ⇒  "LOGIN"
++ (pathname-type q) ⇒  "COM"
++
++ ;; Because namestrings are used, the results shown in the remaining
++ ;; examples are not necessarily the only possible results.  Mappings
++ ;; from namestring representation to pathname representation are 
++ ;; dependent both on the file system involved and on the implementation
++ ;; (since there may be several implementations which can manipulate the
++ ;; the same file system, and those implementations are not constrained
++ ;; to agree on all details). Consult the documentation for each
++ ;; implementation for specific information on how namestrings are treated
++ ;; that implementation.
++
++ ;; VMS
++ (pathname-directory (parse-namestring "[FOO.*.BAR]BAZ.LSP"))
++⇒  (:ABSOLUTE "FOO" "BAR")
++ (pathname-directory (parse-namestring "[FOO.*.BAR]BAZ.LSP") :case :common)
++⇒  (:ABSOLUTE "FOO" "BAR")
++
++ ;; Unix
++ (pathname-directory "foo.l") ⇒  NIL
++ (pathname-device "foo.l") ⇒  :UNSPECIFIC
++ (pathname-name "foo.l") ⇒  "foo"
++ (pathname-name "foo.l" :case :local) ⇒  "foo"
++ (pathname-name "foo.l" :case :common) ⇒  "FOO"
++ (pathname-type "foo.l") ⇒  "l"
++ (pathname-type "foo.l" :case :local) ⇒  "l"
++ (pathname-type "foo.l" :case :common) ⇒  "L"
++ (pathname-type "foo") ⇒  :UNSPECIFIC
++ (pathname-type "foo" :case :common) ⇒  :UNSPECIFIC
++ (pathname-type "foo.") ⇒  ""
++ (pathname-type "foo." :case :common) ⇒  ""
++ (pathname-directory (parse-namestring "/foo/bar/baz.lisp") :case :local)
++⇒  (:ABSOLUTE "foo" "bar")
++ (pathname-directory (parse-namestring "/foo/bar/baz.lisp") :case :local)
++⇒  (:ABSOLUTE "FOO" "BAR")
++ (pathname-directory (parse-namestring "../baz.lisp"))
++⇒  (:RELATIVE :UP)
++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/BAR/../Mum/baz"))
++⇒  (:ABSOLUTE "foo" "BAR" :UP "Mum")
++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/BAR/../Mum/baz") :case :common)
++⇒  (:ABSOLUTE "FOO" "bar" :UP "Mum")
++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/*/bar/baz.l"))
++⇒  (:ABSOLUTE "foo" :WILD "bar")
++ (PATHNAME-DIRECTORY (PARSE-NAMESTRING "/foo/*/bar/baz.l") :case :common)
++⇒  (:ABSOLUTE "FOO" :WILD "BAR")
++
++ ;; Symbolics LMFS
++ (pathname-directory (parse-namestring ">foo>**>bar>baz.lisp"))
++⇒  (:ABSOLUTE "foo" :WILD-INFERIORS "bar")
++ (pathname-directory (parse-namestring ">foo>*>bar>baz.lisp"))
++⇒  (:ABSOLUTE "foo" :WILD "bar")
++ (pathname-directory (parse-namestring ">foo>*>bar>baz.lisp") :case :common)
++⇒  (:ABSOLUTE "FOO" :WILD "BAR")
++ (pathname-device (parse-namestring ">foo>baz.lisp")) ⇒  :UNSPECIFIC
++
++ ++

Affected By::

++ ++

The implementation and the host file system. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error if its first argument is not a pathname. ++

++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pathname_002dmatch_002dp.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++pathname-match-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.14 pathname-match-p [Function]

++ ++

pathname-match-p pathname wildcardgeneralized-boolean ++

++

Arguments and Values::

++ ++

pathname—a pathname designator. ++

++

wildcard—a designator for a wild pathname. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

pathname-match-p returns true if ++pathname matches wildcard, otherwise nil. The ++matching rules are implementation-defined but should be consistent with ++directory. Missing components of wildcard default to :wild. ++

++

It is valid for pathname to be a wild pathname; ++a wildcard field in pathname only matches a ++wildcard field in wildcard (i.e., pathname-match-p is not commutative). ++It is valid for wildcard to be a non-wild pathname. ++

++

Exceptional Situations::

++ ++

If pathname or wildcard is not a pathname, string, ++or stream associated with a file an error of type type-error is signaled. ++

++

See Also::

++ ++

directory ++, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pathnamep.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++pathnamep (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.5 pathnamep [Function]

++ ++

pathnamep objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type pathname; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (setq q "test")  ⇒  "test"
++ (pathnamep q) ⇒  false
++ (setq q (pathname "test"))
++⇒  #S(PATHNAME :HOST NIL :DEVICE NIL :DIRECTORY NIL :NAME "test" :TYPE NIL
++       :VERSION NIL)
++ (pathnamep q) ⇒  true 
++ (setq q (logical-pathname "SYS:SITE;FOO.SYSTEM"))
++⇒  #P"SYS:SITE;FOO.SYSTEM"
++ (pathnamep q) ⇒  true
++
++ ++

Notes::

++ ++
++
 (pathnamep object) ≡ (typep object 'pathname)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/peek_002dchar.html +@@ -0,0 +1,150 @@ ++ ++ ++ ++ ++ ++peek-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.16 peek-char [Function]

++ ++

peek-char &optional peek-type input-stream eof-error-p ++ eof-value recursive-pchar ++

++

Arguments and Values::

++ ++

peek-type—a character or t or nil. ++

++

input-streaminput stream designator. ++ The default is standard input. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++ The default is nil. ++

++

recursive-p—a generalized boolean. ++ The default is false. ++

++

char—a character or the eof-value. ++

++

Description::

++ ++

peek-char obtains the next character in input-stream ++without actually reading it, thus leaving the character ++to be read at a later time. It can ++also be used to skip over and discard intervening ++characters in the input-stream ++until a particular character is found. ++

++

If peek-type is not supplied or nil, ++peek-char returns the next character to be read from ++input-stream, without actually removing it from ++input-stream. ++The next time input is done from input-stream, the character will still ++be there. ++If peek-type is t, ++then peek-char skips over whitespace_2 characters, ++but not comments, ++and then performs the peeking operation on the next ++character. ++The last character examined, the one that starts an object, ++is not removed from input-stream. ++If peek-type is a character, ++then peek-char skips ++over input characters until a character that ++is char= to that character is found; ++that character is left in input-stream. ++

++

If an end of file_2 occurs and eof-error-p is false, ++eof-value is returned. ++

++

If recursive-p is true, ++this call is expected to be embedded in a higher-level call to read ++or a similar function used by the Lisp reader. ++

++

When input-stream is an echo stream, ++characters that are only peeked at are not echoed. In the ++case that peek-type is not nil, ++the characters that are passed by peek-char ++are treated as if by read-char, ++and so are echoed unless they have been marked otherwise by unread-char. ++

++

Examples::

++
++
 (with-input-from-string (input-stream "    1 2 3 4 5")
++    (format t "~S ~S ~S" 
++            (peek-char t input-stream)
++            (peek-char #\4 input-stream)
++            (peek-char nil input-stream)))
++ |>  #\1 #\4 #\4
++⇒  NIL
++
++ ++

Affected By::

++ ++

*readtable*, ++*standard-input*, ++*terminal-io*. ++

++

Exceptional Situations::

++ ++

If eof-error-p is true and an end of file_2 occurs ++an error of type end-of-file is signaled. ++

++

If peek-type is a character, ++ an end of file_2 occurs, ++ and eof-error-p is true, ++an error of type end-of-file is signaled. ++

++

If recursive-p is true ++and an end of file_2 occurs, ++an error of type end-of-file is signaled. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/phase.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++phase (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.49 phase [Function]

++ ++

phase numberphase ++

++

Arguments and Values::

++ ++

number—a number. ++

++

phase—a number. ++

++

Description::

++ ++

phase ++returns the phase ++of number (the angle part of its polar representation) ++in radians, in the range ++

++

-\pi (exclusive) if minus zero is not supported, or ++-\pi (inclusive) if minus zero is supported, ++

++

to \pi (inclusive). The phase of a positive ++

++

real ++

++

number ++is zero; that of a negative ++

++

real ++

++

number is \pi. ++The phase of zero is defined to be zero. ++

++

If number is a complex float, ++the result is a float of the same type ++as the components of number. ++If number is a float, the result is a ++float of the same type. ++If number is a rational or a complex rational, ++the result is a single float. ++

++

The branch cut for phase lies along the negative real ++axis, continuous with quadrant II. The range consists of that portion of ++the real axis between -\pi (exclusive) and~\pi (inclusive). ++

++

The mathematical definition of phase is as follows: ++

++

(phase x) = (atan (imagpart x) (realpart x)) ++

++

Examples::

++ ++
++
 (phase 1) ⇒  0.0s0
++ (phase 0) ⇒  0.0s0
++ (phase (cis 30)) ⇒  -1.4159266
++ (phase #c(0 1)) ⇒  1.5707964
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its argument is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

Rule of Float Substitutability ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pi.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++pi (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.22 pi [Constant Variable]

++ ++

Value::

++ ++

an implementation-dependent long float. ++

++

Description::

++ ++

The best long float approximation to the mathematical constant \pi. ++

++

Examples::

++ ++
++
 ;; In each of the following computations, the precision depends 
++ ;; on the implementation.  Also, if `long float' is treated by 
++ ;; the implementation as equivalent to some other float format 
++ ;; (e.g., `double float') the exponent marker might be the marker
++ ;; for that equivalent (e.g., `D' instead of `L').
++ pi ⇒  3.141592653589793L0
++ (cos pi) ⇒  -1.0L0
++
++ (defun sin-of-degrees (degrees)
++   (let ((x (if (floatp degrees) degrees (float degrees pi))))
++     (sin (* x (/ (float pi x) 180)))))
++
++ ++

Notes::

++ ++

An approximation to \pi in some other precision can be obtained ++by writing (float pi x), where x is a float of the ++desired precision, or by writing (coerce pi type), ++where type is the desired type, such as short-float. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pop.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++pop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.20 pop [Macro]

++ ++

pop placeelement ++

++

Arguments and Values::

++ ++

place—a place, the value of which is a list ++ (possibly, but necessarily, a dotted list or circular list). ++

++

element—an object (the car of the contents of place). ++

++

Description::

++ ++

pop reads the value of place, ++remembers the car of the list which was retrieved, ++writes the cdr of the list back into the place, ++and finally yields the car of the originally retrieved list. ++

++

For information about the evaluation of subforms of place, ++see Evaluation of Subforms to Places. ++

++

Examples::

++ ++
++
 (setq stack '(a b c)) ⇒  (A B C)
++ (pop stack) ⇒  A  
++ stack ⇒  (B C)
++ (setq llst '((1 2 3 4))) ⇒  ((1 2 3 4))
++ (pop (car llst)) ⇒  1
++ llst ⇒  ((2 3 4))
++
++ ++

Side Effects::

++ ++

The contents of place are modified. ++

++

See Also::

++ ++

push ++, ++pushnew ++, ++Generalized Reference ++

++

Notes::

++ ++

The effect of (pop place) is roughly equivalent to ++

++
++
 (prog1 (car place) (setf place (cdr place)))
++
++ ++

except that the latter would evaluate any subforms of place ++three times, while pop evaluates them only once. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/position.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++position (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.15 position, position-if, position-if-not [Function]

++ ++

position item sequence &key from-end test test-not start end keyposition ++

++

position-if predicate sequence &key from-end start end keyposition ++

++

position-if-not predicate sequence &key from-end start end keyposition ++

++

Arguments and Values::

++ ++

item—an object. ++

++

sequence—a proper sequence. ++

++

predicate—a designator for a function of one argument ++ that returns a generalized boolean. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

position—a bounding index of sequence, or nil. ++

++

Description::

++ ++

position, position-if, and position-if-not ++each search sequence for an element that satisfies the test. ++

++

The position returned is the index within sequence ++ of the leftmost (if from-end is true) ++ or of the rightmost (if from-end is false) ++element that satisfies the test; ++otherwise nil is returned. ++The index returned is relative to the left-hand end of the entire sequence, ++regardless of the value of start, end, or from-end. ++

++

Examples::

++ ++
++
 (position #\a "baobab" :from-end t) ⇒  4
++ (position-if #'oddp '((1) (2) (3) (4)) :start 1 :key #'car) ⇒  2
++ (position 595 '()) ⇒  NIL
++ (position-if-not #'integerp '(1 2 3 4 5.0)) ⇒  4 
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

find ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++

The function position-if-not is deprecated. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002ddispatch.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++pprint-dispatch (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.4.3 pprint-dispatch [Function]

++ ++

pprint-dispatch object &optional tablefunction, found-p ++

++

Arguments and Values::

++ ++

object—an object. ++

++

table—a pprint dispatch table, or nil. ++ The default is the value of *print-pprint-dispatch*. ++

++

function—a function designator. ++

++

found-p—a generalized boolean. ++

++

Description::

++ ++

Retrieves the highest priority function in table that is ++associated with a type specifier that matches object. ++The function is chosen by finding all of the type specifiers in table ++that match the object and ++selecting the highest priority function associated with any of these ++type specifiers. If there is more than one highest priority function, ++an arbitrary choice is made. If no type specifiers match the ++object, a function is returned that prints object ++

++

using print-object. ++

++

The secondary value, found-p, is true if a matching ++type specifier was found in table, or false otherwise. ++

++

If table is nil, ++retrieval is done in the ++initial pprint dispatch table. ++

++

Affected By::

++ ++

The state of the table. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error if table is neither a ++pprint-dispatch-table nor nil. ++

++

Notes::

++ ++
++
(let ((*print-pretty* t))
++  (write object :stream s))
++≡ (funcall (pprint-dispatch object) s object)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dexit_002dif_002dlist_002dexhausted.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++pprint-exit-if-list-exhausted (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.4 pprint-exit-if-list-exhausted [Local Macro]

++ ++

Syntax::

++ ++

pprint-exit-if-list-exhausted <no arguments>nil ++

++

Description::

++ ++

Tests whether or not the list passed to ++the lexically current logical block ++has been exhausted; see Dynamic Control of the Arrangement of Output. ++If this list has been ++reduced to nil, pprint-exit-if-list-exhausted terminates the execution ++of the lexically current logical block except for the printing ++of the suffix. Otherwise pprint-exit-if-list-exhausted returns nil. ++

++

Whether or not pprint-exit-if-list-exhausted is fbound in the ++global environment is implementation-dependent; ++however, the restrictions on redefinition and shadowing of ++pprint-exit-if-list-exhausted are the same as for symbols in the COMMON-LISP package ++which are fbound in the global environment. ++The consequences of attempting to use pprint-exit-if-list-exhausted outside ++of pprint-logical-block are undefined. ++

++

Exceptional Situations::

++ ++

An error is signaled (at macro expansion time or at run time) if ++pprint-exit-if-list-exhausted is used anywhere other than ++lexically within a call on pprint-logical-block. ++Also, the consequences of executing pprint-if-list-exhausted outside ++of the dynamic extent of the pprint-logical-block which lexically ++contains it are undefined. ++

++

See Also::

++ ++

pprint-logical-block ++, ++pprint-pop ++. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dfill.html +@@ -0,0 +1,161 @@ ++ ++ ++ ++ ++ ++pprint-fill (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.4.5 pprint-fill, pprint-linear, pprint-tabular [Function]

++ ++

pprint-fill stream object &optional colon-p at-sign-pnil ++

++

pprint-linear stream object &optional colon-p at-sign-pnil ++

++

pprint-tabular stream object &optional colon-p at-sign-p tabsizenil ++

++

Arguments and Values::

++ ++

stream—an output stream designator. ++

++

object—an object. ++

++

colon-p—a generalized boolean. ++ The default is true. ++

++

at-sign-p—a generalized boolean. ++ The default is implementation-dependent. ++

++

tabsize—a non-negative integer. ++ The default is 16. ++

++

Description::

++ ++

The functions pprint-fill, pprint-linear, and ++pprint-tabular specify particular ways of pretty printing ++a list to stream. ++Each function prints parentheses around the output if and only ++if colon-p is true. ++Each function ignores its at-sign-p argument. ++(Both arguments are included even though only one is needed ++so that these functions can be used via ~/.../ ++and as set-pprint-dispatch functions, as well as directly.) ++Each function handles abbreviation and the detection of circularity ++and sharing correctly, and uses write to print object ++when it is a non-list. ++

++

If object is a list and ++if the value of *print-pretty* is false, ++each of these functions prints object ++using a minimum of whitespace, ++as described in Printing Lists and Conses. ++Otherwise (if object is a list and ++ if the value of *print-pretty* is true): ++

++
++
*
++

The function pprint-linear prints a list either all on one line, ++or with each element on a separate line. ++

++
++
*
++

The function pprint-fill prints a list with as many elements ++as possible on each line. ++

++
++
*
++

The function pprint-tabular is the same as pprint-fill ++except that it prints the elements so that they line up in columns. ++The tabsize specifies the column spacing in ems, ++which is the total spacing from the leading edge of one column to ++the leading edge of the next. ++

++
++ ++

Examples::

++ ++

Evaluating the following with a line length of 25 produces the output shown. ++

++
++
(progn (princ "Roads ") 
++       (pprint-tabular *standard-output* '(elm main maple center) nil nil 8))
++Roads ELM     MAIN
++      MAPLE   CENTER
++
++ ++

Side Effects::

++ ++

Performs output to the indicated stream. ++

++

Affected By::

++ ++

The cursor position on the indicated stream, if it can be determined. ++

++

Notes::

++ ++

The function pprint-tabular could be defined as follows: ++

++
++
(defun pprint-tabular (s list &optional (colon-p t) at-sign-p (tabsize nil))
++  (declare (ignore at-sign-p))
++  (when (null tabsize) (setq tabsize 16))
++  (pprint-logical-block (s list :prefix (if colon-p "(" "")
++                                :suffix (if colon-p ")" ""))
++    (pprint-exit-if-list-exhausted)
++    (loop (write (pprint-pop) :stream s)
++          (pprint-exit-if-list-exhausted)
++          (write-char #\Space s)
++          (pprint-tab :section-relative 0 tabsize s)
++          (pprint-newline :fill s))))
++
++ ++

Note that it would have been inconvenient to specify this function ++using format, because of the need to pass its tabsize argument ++through to a ~:T format directive nested within an iteration over a list. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dindent.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++pprint-indent (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.6 pprint-indent [Function]

++ ++

pprint-indent relative-to n &optional streamnil ++

++

Arguments and Values::

++ ++

relative-to—either :block or :current. ++

++

n—a real. ++

++

stream—an output stream designator. ++ The default is standard output. ++

++

Description::

++ ++

pprint-indent specifies the indentation to use in a logical block on stream. ++

++

If stream is a pretty printing stream ++ and the value of *print-pretty* is true, ++pprint-indent sets the indentation in the innermost ++dynamically enclosing logical block; ++otherwise, pprint-indent has no effect. ++

++

N specifies the indentation in ++ems. If relative-to is :block, the indentation is set ++to the horizontal position of the first character in the dynamically current logical block plus n ++ems. If relative-to is :current, the indentation is set ++to the current output position plus n ems. (For robustness ++in the face of variable-width fonts, it is advisable to use :current ++with an n of zero whenever possible.) ++

++

N can be negative; ++however, the total indentation cannot be moved ++left of the beginning of the line ++or left of the end of the rightmost per-line prefix—an attempt to move beyond ++one of these limits is treated ++the same as an attempt to move to that limit. ++Changes in indentation caused by pprint-indent ++do not take effect until after the next line break. In addition, in ++miser mode all calls to pprint-indent are ignored, forcing the lines ++corresponding to the logical block to line up under the first character in ++the block. ++

++

Exceptional Situations::

++ ++

An error is signaled if relative-to is any object other ++than :block or :current. ++

++

See Also::

++ ++

Tilde I-> Indent ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dlogical_002dblock.html +@@ -0,0 +1,196 @@ ++ ++ ++ ++ ++ ++pprint-logical-block (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.7 pprint-logical-block [Macro]

++ ++

pprint-logical-block (stream-symbol object ++ &key prefix per-line-prefix suffix) ++ {declaration}* {form}*
++ ⇒ nil ++

++

Arguments and Values::

++ ++

stream-symbol—a stream variable designator. ++

++

object—an object; evaluated. ++

++

:prefix—a string; evaluated. ++ Complicated defaulting behavior; see below. ++

++

:per-line-prefix—a string; evaluated. ++ Complicated defaulting behavior; see below. ++

++

:suffix—a string; evaluated. ++ The default is the null string. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

Description::

++ ++

Causes printing to be grouped into a logical block. ++

++

The logical block is printed to the stream that is the value ++of the variable denoted by stream-symbol. ++During the execution of the forms, ++that variable is bound to a pretty printing stream ++that supports decisions about the arrangement of output ++and then forwards the output to the destination stream. ++

++

All the standard printing functions ++ (e.g., write, ++ princ, ++ and terpri) ++can be used to print output to the pretty printing stream. ++All and only the output sent to this pretty printing stream ++is treated as being in the logical block. ++

++

The prefix specifies a prefix to be printed before the beginning of ++the logical block. ++The per-line-prefix specifies a prefix that is printed before the block ++and at the beginning of each new line in the block. ++The :prefix and :pre-line-prefix arguments are mutually exclusive. ++If neither :prefix nor :per-line-prefix is specified, ++a prefix of the null string is assumed. ++

++

The suffix specifies a suffix that is printed just after the logical block. ++

++

The object is ++normally ++a list that the body forms are responsible for printing. ++If object is not a list, ++it is printed using write. ++(This makes it easier to write printing functions that are robust ++ in the face of malformed arguments.) ++If *print-circle* ++is non-nil and object is a circular (or shared) reference to a cons, ++then an appropriate “#n#” marker is printed. (This ++makes it easy to write printing functions that provide full support ++for circularity and sharing abbreviation.) If *print-level* is not ++nil and the logical block is at a dynamic nesting depth of greater ++than *print-level* in logical blocks, “#” is printed. ++(This makes easy to write printing functions that provide full support for depth ++abbreviation.) ++

++

If either of the three conditions above occurs, the indicated output is ++printed on stream-symbol and the body forms are skipped ++along with the printing of the :prefix and :suffix. ++(If the body forms are not to be responsible for printing a list, ++then the first two tests above can be turned off by supplying nil for ++the object argument.) ++

++

In addition to the object argument of pprint-logical-block, ++the arguments of the standard printing functions (such as write, ++print, prin1, and pprint, as well as the arguments ++of the standard format directives such as ~A, ~S, ++(and ~W) are all checked (when necessary) for circularity and sharing. ++However, such checking is not applied to the arguments of the ++functions write-line, write-string, and write-char ++or to the literal text output by format. A consequence of this is ++that you must use one of the latter functions if you want to print some ++literal text in the output that is not supposed to be checked for circularity ++or sharing. ++

++

The body forms of a pprint-logical-block form ++must not perform any side-effects on the surrounding environment; for ++example, no variables must be assigned which have not been ++bound within its scope. ++

++

The pprint-logical-block macro may be used regardless of the value of *print-pretty*. ++

++

Affected By::

++ ++

*print-circle*, *print-level*. ++

++

Exceptional Situations::

++ ++

An error of type type-error is signaled if any of the :suffix, ++:prefix, or :per-line-prefix is supplied but does not evaluate ++to a string. ++

++

An error is signaled if :prefix and :pre-line-prefix are both used. ++

++

pprint-logical-block and the pretty printing stream it creates ++have dynamic extent. The consequences are undefined if, outside ++of this extent, output is attempted to the pretty printing stream it creates. ++

++

It is also unspecified what happens if, within this extent, any output is ++sent directly to the underlying destination stream. ++

++

See Also::

++ ++

pprint-pop ++, ++pprint-exit-if-list-exhausted ++, ++Tilde Less-Than-Sign-> Logical Block ++

++

Notes::

++ ++

One reason for using the pprint-logical-block macro when the value of *print-pretty* ++is nil would be to allow it to perform checking for dotted lists, ++as well as (in conjunction with pprint-pop) ++checking for *print-level* or *print-length* being exceeded. ++

++

Detection of circularity and sharing is supported by the pretty printer ++by in essence performing requested output twice. On the first pass, ++circularities and sharing are detected and the actual outputting of characters ++is suppressed. On the second pass, the appropriate “#n=” ++and “#n#” markers are inserted and characters are output. ++This is why the restriction on side-effects is necessary. ++Obeying this restriction is facilitated by using pprint-pop, ++instead of an ordinary pop when traversing a list being printed by ++the body forms of the pprint-logical-block form.) ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dnewline.html +@@ -0,0 +1,184 @@ ++ ++ ++ ++ ++ ++pprint-newline (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.8 pprint-newline [Function]

++ ++

pprint-newline kind &optional streamnil ++

++

Arguments and Values::

++ ++

kind—one of :linear, :fill, :miser, or :mandatory. ++

++

stream—a stream designator. ++ The default is standard output. ++

++

Description::

++ ++

If stream is a pretty printing stream ++ and the value of *print-pretty* is true, ++a line break is inserted in the output ++when the appropriate condition below is satisfied; ++otherwise, pprint-newline has no effect. ++

++

Kind specifies the style of conditional newline. ++This parameter is treated as follows: ++

++
++
:linear
++

This specifies a ++“linear-style” conditional newline. ++ ++

++

A line break is inserted ++if and only if the immediately containing section ++cannot be printed on one line. ++The effect of this is that line breaks are ++either inserted at every linear-style conditional newline in a logical block ++or at none of them. ++

++
++
:miser
++

This specifies a ++“miser-style” conditional newline. ++ ++

++

A line break is inserted ++if and only if the immediately containing section ++cannot be printed on one line ++and miser style is in effect in the immediately containing logical block. ++The effect of this is that miser-style conditional newlines ++act like linear-style conditional newlines, ++but only when miser style is in effect. ++Miser style is in effect for a logical block if and only if ++the starting position of the logical block ++is less than or equal to ++*print-miser-width* ems from the right margin. ++

++
++
:fill
++

This specifies a ++“fill-style” conditional newline. ++ ++

++

A line break is inserted if and only if ++either (a) the following section cannot be printed ++ on the end of the current line, ++ (b) the preceding section was not printed on a single line, ++ or (c) the immediately containing section cannot ++ be printed on one line and miser style is in effect ++ in the immediately containing logical block. ++If a logical block is broken up into a number of subsections ++by fill-style conditional newlines, ++the basic effect is that the logical block ++is printed with as many subsections as possible on each line. ++However, if miser style is in effect, ++fill-style conditional newlines act like linear-style conditional newlines. ++

++
++
:mandatory
++

This specifies a ++“mandatory-style” conditional newline. ++ ++

++

A line break is always inserted. ++This implies that none of the containing sections ++can be printed on a single line and ++will therefore trigger the insertion of line breaks ++at linear-style conditional newlines in these sections. ++

++
++
++ ++

When a line break is inserted by any type of conditional newline, ++any blanks that immediately precede the conditional newline are omitted ++from the output and indentation is introduced at the beginning of the next line. ++By default, the indentation causes the following line to begin ++in the same horizontal position ++as the first character in the immediately containing logical block. ++(The indentation can be changed via pprint-indent.) ++

++

There are a variety of ways unconditional newlines can be introduced into ++the output (i.e., via terpri or by printing a string containing a newline ++character). As with mandatory conditional newlines, this prevents any of ++the containing sections from being printed on one line. In general, when ++an unconditional newline is encountered, it is printed out without ++suppression of the preceding blanks and without any indentation following ++it. However, if a per-line prefix has been specified (see ++pprint-logical-block), this prefix will always be printed no matter ++how a newline originates. ++

++

Examples::

++ ++

See Examples of using the Pretty Printer. ++

++

Side Effects::

++ ++

Output to stream. ++

++

Affected By::

++ ++

*print-pretty*, *print-miser*. ++The presence of containing logical blocks. ++The placement of newlines and conditional newlines. ++

++

Exceptional Situations::

++ ++

An error of type type-error is signaled if kind ++is not one of :linear, :fill, :miser, or :mandatory. ++

++

See Also::

++ ++

Tilde Underscore-> Conditional Newline, ++Examples of using the Pretty Printer ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dpop.html +@@ -0,0 +1,152 @@ ++ ++ ++ ++ ++ ++pprint-pop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.9 pprint-pop [Local Macro]

++ ++

Syntax::

++ ++

pprint-pop <no arguments>object ++

++

Arguments and Values::

++ ++

object—an element of the list ++ being printed in the lexically current logical block, ++ or nil. ++

++

Description::

++ ++

Pops one element from the list being printed ++in the lexically current logical block, obeying *print-length* ++and *print-circle* as described below. ++

++

Each time pprint-pop is called, it pops the next value off the ++list passed to the lexically current logical block and returns it. ++However, before doing this, it performs three tests: ++

++
++
*
++

If the remaining ‘list’ is not a list, ++ “. ” is printed followed by the remaining ‘list.’ ++ (This makes it easier to write printing functions that ++ are robust in the face of malformed arguments.) ++

++
++
*
++

If *print-length* is non-nil, ++ and pprint-pop has already been called *print-length* times ++ within the immediately containing logical block, ++ “...” is printed. ++ (This makes it easy to write printing functions that properly handle ++ *print-length*.) ++

++
++
*
++

If *print-circle* is ++ non-nil, and the remaining list is a circular (or shared) reference, ++ then “. ” is printed followed by an appropriate ++ “#n#” marker. ++ (This catches instances of cdr circularity and sharing in lists.) ++

++
++ ++

If either of the three conditions above occurs, the indicated output is ++printed on the pretty printing stream created by the immediately containing ++pprint-logical-block and the execution of the immediately containing ++pprint-logical-block is terminated except for the printing of the suffix. ++

++

If pprint-logical-block is given a ‘list’ argument of nil—because ++it is not processing a list—pprint-pop can still be used to obtain ++support for *print-length*. ++In this situation, the first and third tests above are disabled and ++pprint-pop always returns nil. ++See Examples of using the Pretty Printer—specifically, the pprint-vector example. ++

++

Whether or not pprint-pop is fbound in the ++global environment is implementation-dependent; ++however, the restrictions on redefinition and shadowing of ++pprint-pop are the same as for symbols in the COMMON-LISP package ++which are fbound in the global environment. ++The consequences of attempting to use pprint-pop outside ++of pprint-logical-block are undefined. ++

++

Side Effects::

++ ++

Might cause output ++to the pretty printing stream associated with the lexically current logical block. ++

++

Affected By::

++ ++

*print-length*, *print-circle*. ++

++

Exceptional Situations::

++ ++

An error is signaled (either at macro expansion time or at run time) ++if a usage of pprint-pop occurs where there is no lexically ++containing pprint-logical-block form. ++

++

The consequences are undefined if pprint-pop is executed outside ++of the dynamic extent of this pprint-logical-block. ++

++

See Also::

++ ++

pprint-exit-if-list-exhausted ++, ++pprint-logical-block ++. ++

++

Notes::

++ ++

It is frequently a good idea to call pprint-exit-if-list-exhausted ++before calling pprint-pop. ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pprint_002dtab.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++pprint-tab (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.10 pprint-tab [Function]

++ ++

pprint-tab kind colnum colinc &optional streamnil ++

++

Arguments and Values::

++ ++

kind—one of :line, :section, :line-relative, ++ or :section-relative. ++

++

colnum—a non-negative integer. ++

++

colinc—a non-negative integer. ++

++

stream—an output stream designator. ++

++

Description::

++ ++

Specifies tabbing to stream as performed by the standard ~T format directive. ++

++

If stream is a pretty printing stream and ++ the value of *print-pretty* is true, ++

++

tabbing is performed; ++otherwise, pprint-tab has no effect. ++

++

The arguments colnum and colinc correspond to the two ++parameters to ~T and are in terms of ems. ++The kind argument specifies the style of tabbing. It must be one of ++ :line (tab as by ~T), ++ :section (tab as by ~:T, ++ but measuring horizontal positions relative to ++ the start of the dynamically enclosing section), ++ :line-relative (tab as by ~@T), or ++ :section-relative (tab as by ~:@T, ++ but measuring horizontal positions relative to ++ the start of the dynamically enclosing section). ++

++

Exceptional Situations::

++ ++

An error is signaled if kind is not one of :line, ++:section, :line-relative, or :section-relative. ++

++

See Also::

++ ++

pprint-logical-block ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/print_002dnot_002dreadable.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++print-not-readable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

22.4.29 print-not-readable [Condition Type]

++ ++

Class Precedence List::

++

print-not-readable, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type print-not-readable consists of error conditions that occur during ++output while *print-readably* is true, as a result of attempting ++to write a printed representation with the Lisp printer ++that would not be correctly read back with the Lisp reader. ++The object which could not be printed is initialized by ++the :object initialization argument to make-condition, and is accessed by ++the function print-not-readable-object. ++

++

See Also::

++ ++

print-not-readable-object ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/print_002dnot_002dreadable_002dobject.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++print-not-readable-object (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.30 print-not-readable-object [Function]

++ ++

print-not-readable-object conditionobject ++

++

Arguments and Values::

++ ++

condition—a condition of type print-not-readable. ++

++

object—an object. ++

++

Description::

++ ++

Returns the object that could not be printed readably ++in the situation represented by condition. ++

++

See Also::

++ ++

print-not-readable, ++Conditions ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/print_002dobject.html +@@ -0,0 +1,210 @@ ++ ++ ++ ++ ++ ++print-object (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.11 print-object [Standard Generic Function]

++ ++

Syntax::

++ ++

print-object object streamobject ++

++

Method Signatures::

++ ++

print-object (object standard-object) stream ++

++

print-object (object structure-object) stream ++

++

Arguments and Values::

++ ++

object—an object. ++

++

stream—a stream. ++

++

Description::

++ ++

The generic function print-object writes the printed representation of object ++to stream. ++The function print-object is called by the Lisp printer; ++it should not be called by the user. ++

++

Each implementation is required to provide a method on ++the class standard-object and on the class structure-object. ++In addition, each implementation must provide ++methods on enough other classes ++so as to ensure that there is always an applicable method. ++Implementations are free to add methods for other classes. ++Users may write methods for print-object for their own ++classes if they do not wish to inherit an ++implementation-dependent method. ++

++

The method on the class structure-object prints the object in the ++default #S notation; see Printing Structures. ++

++

Methods on print-object are responsible for implementing ++their part of the semantics of the printer control variables, as follows: ++

++
++
*print-readably*
++

All methods for print-object must obey *print-readably*. ++This includes both user-defined methods and implementation-defined methods. ++Readable printing of structures and standard objects ++is controlled by their print-object method, ++not by their make-load-form method. ++Similarity for these objects is application dependent ++and hence is defined to be whatever these methods do; ++see Similarity of Literal Objects. ++

++
++
*print-escape*
++

Each method must implement *print-escape*. ++

++
++
*print-pretty*
++
++

The method may wish to perform specialized line breaking ++or other output conditional on the value of *print-pretty*. ++For further information, ++see (for example) the macro pprint-fill. ++See also Pretty Print Dispatch Tables and Examples of using the Pretty Printer. ++

++
++
*print-length*
++

Methods that produce output of indefinite length must obey ++*print-length*. ++

++

For further information, ++see (for example) the macros pprint-logical-block ++and pprint-pop. ++See also Pretty Print Dispatch Tables and Examples of using the Pretty Printer. ++

++
++
*print-level*
++

The printer takes care of *print-level* automatically, ++provided that each method handles exactly one level of structure and ++calls write (or an equivalent function) recursively if ++there are more structural levels. The printer’s decision of whether an ++object has components (and therefore should not be printed when the ++printing depth is not less than *print-level*) is ++implementation-dependent. In some implementations its ++print-object method is not called; ++in others the method is called, ++and the determination that the object has components is based on what ++it tries to write to the stream. ++

++
++
*print-circle*
++
++

When the value of *print-circle* is true, ++a user-defined ++

++

print-object method ++

++

can print objects to the supplied stream ++using write, ++ prin1, ++ princ, ++ or format ++and expect circularities to be detected ++and printed using the #n# syntax. ++If a user-defined ++

++

print-object method ++

++

prints to a stream other than the one ++that was supplied, then circularity detection starts over for that ++stream. See *print-circle*. ++

++
++
*print-base*,
++

*print-radix*, ++ *print-case*, ++ *print-gensym*, ++ and *print-array* ++These printer control variables apply to specific types of objects ++and are handled by the methods for those objects. ++

++
++
++ ++

If these rules are not obeyed, the results are undefined. ++

++

In general, the printer and the print-object methods should not ++rebind the print control variables as they operate recursively through the ++structure, but this is implementation-dependent. ++

++

In some implementations the stream argument passed to a ++print-object method is not the original stream, ++but is an intermediate stream that implements part of the printer. ++methods should therefore not depend on the identity of this stream. ++

++

See Also::

++ ++

pprint-fill ++, ++pprint-logical-block ++, ++pprint-pop ++, ++write ++, ++*print-readably*, ++*print-escape*, ++*print-pretty*, ++*print-length*, ++Default Print-Object Methods, ++

++

Printing Structures, ++

++

Pretty Print Dispatch Tables, ++Examples of using the Pretty Printer ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/print_002dunreadable_002dobject.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++print-unreadable-object (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.12 print-unreadable-object [Macro]

++ ++

print-unreadable-object (object stream &key type identity) {form}*nil ++

++

Arguments and Values::

++ ++

object—an object; evaluated. ++

++

stream— ++a stream designator; evaluated. ++

++

type—a generalized boolean; evaluated. ++

++

identity—a generalized boolean; evaluated. ++

++

forms—an implicit progn. ++

++

Description::

++ ++

Outputs a printed representation of object on stream, ++beginning with “#<” and ending with “>”. ++Everything output to stream by the body forms ++is enclosed in the the angle brackets. ++If type is true, the output from forms ++is preceded by a brief description of the object’s ++type and a space character. ++If identity is true, ++the output from forms is followed by a space character ++and a representation of the object’s identity, ++typically a storage address. ++

++

If either type or identity is not supplied, ++its value is false. It is valid to omit the body forms. ++If type and identity are both true and there are no ++body forms, only one space character separates the type ++and the identity. ++

++

Examples::

++ ++

;; Note that in this example, the precise form of the output ++;; is implementation-dependent. ++

++
++
 (defmethod print-object ((obj airplane) stream)
++   (print-unreadable-object (obj stream :type t :identity t)
++     (princ (tail-number obj) stream)))
++
++ (prin1-to-string my-airplane)
++⇒  "#<Airplane NW0773 36000123135>"
++OR⇒ "#<FAA:AIRPLANE NW0773 17>"
++
++ ++

Exceptional Situations::

++ ++

If *print-readably* is true, print-unreadable-object ++signals an error of type print-not-readable without printing anything. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/probe_002dfile.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++probe-file (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.2 probe-file [Function]

++ ++

probe-file pathspectruename ++

++

Arguments and Values::

++ ++

pathspec—a pathname designator. ++

++

truename—a physical pathname or nil. ++

++

Description::

++ ++

probe-file tests whether a file exists. ++

++

probe-file returns false if there is no file named pathspec, ++and otherwise returns the truename of pathspec. ++

++

If the pathspec designator is an open stream, ++then probe-file produces the truename of its associated file. ++

++

If pathspec is a stream, whether open or closed, ++it is coerced to a pathname as if by the function pathname. ++

++

Affected By::

++ ++

The host computer’s file system. ++

++

Exceptional Situations::

++ ++

An error of type file-error is signaled if pathspec is wild. ++

++

An error of type file-error is signaled ++if the file system cannot perform the requested operation. ++

++

See Also::

++ ++

truename ++, ++open ++, ++ensure-directories-exist ++, ++pathname, ++

++

logical-pathname, ++

++

File System Concepts, ++File Operations on Open and Closed Streams, ++

++

Pathnames as Filenames ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/proclaim.html +@@ -0,0 +1,134 @@ ++ ++ ++ ++ ++ ++proclaim (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.16 proclaim [Function]

++ ++

proclaim declaration-specifierimplementation-dependent ++

++

Arguments and Values::

++ ++

declaration-specifier—a declaration specifier. ++

++

Description::

++ ++

Establishes the declaration specified by declaration-specifier ++in the global environment. ++

++

Such a declaration, sometimes called a global declaration ++or a proclamation, is always in force unless locally shadowed. ++

++

Names of variables and functions within ++declaration-specifier refer to dynamic variables ++and global function definitions, respectively. ++

++

Figure 3–22 shows a list of declaration identifiers ++that can be used with proclaim. ++

++
++
  declaration  inline     optimize  type  
++  ftype        notinline  special         
++
++  Figure 3–22: Global Declaration Specifiers
++
++
++ ++

An implementation is free to support other (implementation-defined) ++declaration identifiers as well. ++

++

Examples::

++ ++
++
 (defun declare-variable-types-globally (type vars)
++   (proclaim `(type ,type ,@vars))
++   type)
++
++ ;; Once this form is executed, the dynamic variable *TOLERANCE*
++ ;; must always contain a float.
++ (declare-variable-types-globally 'float '(*tolerance*))
++⇒  FLOAT
++
++ ++

See Also::

++ ++

declaim ++, ++declare, ++Compilation ++

++

Notes::

++ ++

Although the execution of a proclaim form ++has effects that might affect compilation, the compiler does not make ++any attempt to recognize and specially process proclaim forms. ++A proclamation such as the following, even if a top level form, ++does not have any effect until it is executed: ++

++
++
(proclaim '(special *x*))
++
++ ++

If compile time side effects are desired, eval-when may be useful. ++For example: ++

++
++
 (eval-when (:execute :compile-toplevel :load-toplevel)
++   (proclaim '(special *x*)))
++
++ ++

In most such cases, however, it is preferrable to use declaim for ++this purpose. ++

++

Since proclaim forms are ordinary function forms, ++macro forms can expand into them. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/prog.html +@@ -0,0 +1,202 @@ ++ ++ ++ ++ ++ ++prog (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.57 prog, prog* [Macro]

++ ++

prog ({var | ++ (var [init-form])}*) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

prog* ({var | ++ (var [init-form])}*) ++ {declaration}* ++ {tag | statement}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—variable name. ++

++

init-form—a form. ++

++

declaration—a declare expression; not evaluated. ++

++

tag—a go tag; not evaluated. ++

++

statement—a compound form; evaluated as described below. ++

++

resultsnil if a normal return occurs, ++ or else, if an explicit return occurs, the values that were transferred. ++

++

Description::

++ ++

Three distinct operations are performed by prog and ++prog*: ++they bind local variables, ++they permit use of the return ++statement, and they permit use of the go ++statement. ++A typical prog looks like this: ++

++
++
 (prog (var1 var2 (var3 init-form-3) var4 (var5 init-form-5))
++       {declaration}*
++       statement1
++  tag1
++       statement2
++       statement3
++       statement4
++  tag2
++       statement5
++       ...
++       )
++
++ ++

For prog, ++init-forms are evaluated first, in the order in which they are ++supplied. The vars are then bound to the corresponding values in ++parallel. If no init-form ++is supplied for a given var, ++that var is bound to nil. ++

++

The body of prog is executed as if it were a tagbody form; ++the go statement can be used to transfer control ++to a tag. ++Tags label statements. ++

++

prog implicitly establishes a block named nil around ++the entire prog form, so that return can be used ++at any time to exit from the prog form. ++

++

The difference between prog* and prog is that ++in prog* the binding and initialization of the vars ++is done sequentially, so that the init-form for each ++one can use the values of previous ones. ++

++

Examples::

++
++
(prog* ((y z) (x (car y)))
++       (return x))
++
++ ++

returns the car of the value of z. ++

++
++
 (setq a 1) ⇒  1
++ (prog ((a 2) (b a)) (return (if (= a b) '= '/=))) ⇒  /=
++ (prog* ((a 2) (b a)) (return (if (= a b) '= '/=))) ⇒  =
++ (prog () 'no-return-value) ⇒  NIL
++
++ ++
++
 (defun king-of-confusion (w)
++   "Take a cons of two lists and make a list of conses.
++    Think of this function as being like a zipper."
++   (prog (x y z)          ;Initialize x, y, z to NIL
++        (setq y (car w) z (cdr w))
++    loop
++        (cond ((null y) (return x))
++              ((null z) (go err)))
++    rejoin
++        (setq x (cons (cons (car y) (car z)) x))
++        (setq y (cdr y) z (cdr z))
++        (go loop)
++    err
++        (cerror "Will self-pair extraneous items"
++                "Mismatch - gleep!  ~S" y)
++        (setq z y)
++        (go rejoin))) ⇒  KING-OF-CONFUSION 
++
++ ++

This can be accomplished more perspicuously as follows: ++

++
++
 (defun prince-of-clarity (w)
++   "Take a cons of two lists and make a list of conses.
++    Think of this function as being like a zipper."
++   (do ((y (car w) (cdr y))
++        (z (cdr w) (cdr z))
++        (x '() (cons (cons (car y) (car z)) x)))
++       ((null y) x)
++     (when (null z)
++       (cerror "Will self-pair extraneous items"
++              "Mismatch - gleep!  ~S" y)
++       (setq z y)))) ⇒  PRINCE-OF-CLARITY 
++
++ ++

See Also::

++ ++

block ++, ++let ++, ++tagbody ++, ++go ++, ++return ++, Evaluation ++

++

Notes::

++

prog can be explained in terms of ++block, let, and tagbody as ++follows: ++

++
++
 (prog variable-list declaration . body)
++    ≡ (block nil (let variable-list declaration (tagbody . body)))
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/prog1.html +@@ -0,0 +1,134 @@ ++ ++ ++ ++ ++ ++prog1 (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.58 prog1, prog2 [Macro]

++ ++

prog 1first-form {form}* ++ result-1 ++prog 2first-form second-form {form}* ++ result-2 ++

++

Arguments and Values::

++ ++

first-form—a form; evaluated as described below. ++

++

second-form—a form; evaluated as described below. ++

++

forms—an implicit progn; evaluated as described below. ++

++

result-1—the primary value resulting from ++ the evaluation of first-form. ++

++

result-2—the primary value resulting from ++ the evaluation of second-form. ++

++

Description::

++ ++

prog1 evaluates first-form ++ and then forms, ++yielding as its only value ++the primary value yielded by first-form. ++

++

prog2 evaluates first-form, ++ then second-form, ++ and then forms, ++yielding as its only value ++the primary value yielded by first-form. ++

++

Examples::

++ ++
++
 (setq temp 1) ⇒  1
++ (prog1 temp (print temp) (incf temp) (print temp))
++ |>  1
++ |>  2
++⇒  1
++ (prog1 temp (setq temp nil)) ⇒  2
++ temp ⇒  NIL
++ (prog1 (values 1 2 3) 4) ⇒  1 
++ (setq temp (list 'a 'b 'c))
++ (prog1 (car temp) (setf (car temp) 'alpha)) ⇒  A
++ temp ⇒  (ALPHA B C)
++ (flet ((swap-symbol-values (x y)
++          (setf (symbol-value x) 
++                (prog1 (symbol-value y)
++                       (setf (symbol-value y) (symbol-value x))))))
++   (let ((*foo* 1) (*bar* 2))
++     (declare (special *foo* *bar*))
++     (swap-symbol-values '*foo* '*bar*)
++     (values *foo* *bar*)))
++⇒  2, 1
++ (setq temp 1) ⇒  1
++ (prog2 (incf temp) (incf temp) (incf temp)) ⇒  3
++ temp ⇒  4
++ (prog2 1 (values 2 3 4) 5) ⇒  2
++
++ ++

See Also::

++ ++

multiple-value-prog1 ++, ++progn ++

++

Notes::

++ ++

prog1 and prog2 are typically used to evaluate ++one or more forms with side effects and return a value that ++must be computed before some or all of the side effects happen. ++

++
++
 (prog1 {form}*) ≡ (values (multiple-value-prog1 {form}*))
++ (prog2 form1 {form}*) ≡ (let () form1 (prog1 {form}*))
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/progn.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++progn (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.59 progn [Special Operator]

++ ++

progn {form}*{result}* ++

++

Arguments and Values::

++ ++

forms—an implicit progn. ++

++

results—the values of the forms. ++

++

Description::

++ ++

progn evaluates forms, ++in the order in which they are given. ++

++

The values of each form but the last are discarded. ++

++

If progn appears as a top level form, then all forms ++within that progn are considered by the compiler to be ++top level forms. ++

++

Examples::

++
++
 (progn) ⇒  NIL
++ (progn 1 2 3) ⇒  3
++ (progn (values 1 2 3)) ⇒  1, 2, 3
++ (setq a 1) ⇒  1
++ (if a
++      (progn (setq a nil) 'here)
++      (progn (setq a t) 'there)) ⇒  HERE
++ a ⇒  NIL
++
++ ++

See Also::

++ ++

prog1 ++, prog2, Evaluation ++

++

Notes::

++ ++

Many places in Common Lisp involve syntax that uses implicit progns. ++That is, part of their syntax allows many forms to be written ++that are to be evaluated sequentially, discarding the results ++of all forms but the last and returning the results of the last form. ++Such places include, but are not limited to, the following: ++ the body of a lambda expression; ++ the bodies of various control and conditional forms ++ (e.g., case, catch, progn, and when). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/program_002derror.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++program-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.68 program-error [Condition Type]

++ ++

Class Precedence List::

++

program-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type program-error ++consists of error conditions related to incorrect program syntax. The ++errors that result from naming a go tag or a block tag ++that is not lexically apparent are of type program-error. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/progv.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++progv (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.19 progv [Special Operator]

++ ++

progv symbols values {form}*{result}* ++

++

Arguments and Values::

++ ++

symbols—a list of symbols; evaluated. ++

++

values—a list of objects; evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

progv creates new dynamic variable bindings and ++executes each form using those bindings. ++Each form is evaluated in order. ++

++

progv allows binding one or more dynamic ++variables whose names may be determined at run time. ++Each form is evaluated in order ++with the dynamic variables whose names are in ++symbols bound to corresponding values. ++If too few values ++are supplied, the remaining symbols are bound and then ++made to have no value. If too many values are ++supplied, the excess values are ignored. ++The bindings of the dynamic variables are undone on ++exit from progv. ++

++

Examples::

++
++
 (setq *x* 1) ⇒  1
++ (progv '(*x*) '(2) *x*) ⇒  2
++ *x* ⇒  1
++
++Assuming *x* is not globally special,
++
++ (let ((*x* 3)) 
++    (progv '(*x*) '(4) 
++      (list *x* (symbol-value '*x*)))) ⇒  (3 4)
++
++ ++

See Also::

++ ++

let ++, Evaluation ++

++

Notes::

++ ++

Among other things, progv is useful when writing ++interpreters for languages embedded in Lisp; it provides a handle ++on the mechanism for binding dynamic variables. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/provide.html +@@ -0,0 +1,152 @@ ++ ++ ++ ++ ++ ++provide (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: System Construction Dictionary  

++
++
++

24.2.11 provide, require [Function]

++ ++

provide module-nameimplementation-dependent ++

++

require module-name &optional pathname-listimplementation-dependent ++

++

Arguments and Values::

++ ++

module-name—a string designator. ++

++

pathname-listnil, or ++ a designator ++ for a non-empty list of pathname designators. ++ The default is nil. ++

++

Description::

++ ++

provide adds the module-name to the list held by ++*modules*, if such a name is not already present. ++

++

require tests for the presence of the module-name in the ++list held by *modules*. ++If it is present, require immediately returns. ++

++

Otherwise, an attempt is made to load an appropriate set of files as follows: ++The pathname-list argument, if non-nil, ++ specifies a list of pathnames to be loaded in order, from left to right. ++If the pathname-list is nil, ++an implementation-dependent mechanism will be invoked in an attempt ++to load the module named module-name; ++if no such module can be loaded, an error of type error is signaled. ++

++

Both functions use string= to test for the presence of a module-name. ++

++

Examples::

++ ++
++
;;; This illustrates a nonportable use of REQUIRE, because it
++;;; depends on the implementation-dependent file-loading mechanism.
++
++(require "CALCULUS")
++
++;;; This use of REQUIRE is nonportable because of the literal 
++;;; physical pathname.  
++
++(require "CALCULUS" "/usr/lib/lisp/calculus")
++
++;;; One form of portable usage involves supplying a logical pathname,
++;;; with appropriate translations defined elsewhere.
++
++(require "CALCULUS" "lib:calculus")
++
++;;; Another form of portable usage involves using a variable or
++;;; table lookup function to determine the pathname, which again
++;;; must be initialized elsewhere.
++
++(require "CALCULUS" *calculus-module-pathname*)
++
++ ++

Side Effects::

++ ++

provide modifies *modules*. ++

++

Affected By::

++ ++

The specific action taken by require is affected by calls to provide ++(or, in general, any changes to the value of *modules*). ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if module-name is not a string designator. ++

++

If require fails to perform the requested operation ++due to a problem while interacting with the file system, ++an error of type file-error is signaled. ++

++

An error of type file-error might be signaled if any pathname ++in pathname-list is a designator for a wild pathname. ++

++

See Also::

++ ++

*modules*, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

The functions provide and require are deprecated. ++

++

If a module consists of a single package, ++it is customary for the package and module names to be the same. ++

++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: System Construction Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/psetq.html +@@ -0,0 +1,128 @@ ++ ++ ++ ++ ++ ++psetq (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.21 psetq [Macro]

++ ++

psetq {!pair}*nil ++

++

pair ::=var form ++

++

Pronunciation::

++ ++

psetq: pronounced ++

++

Arguments and Values::

++ ++

var—a symbol naming a variable other than a constant variable. ++

++

form—a form. ++

++

Description::

++ ++

Assigns values to variables. ++

++

This is just like setq, except that the assignments ++happen “in parallel.” That is, first all of the forms are ++evaluated, and only then are the variables set to the resulting values. ++In this way, the assignment to one variable does not affect the value ++computation of another in the way that would occur with setq’s ++sequential assignment. ++

++

If any var refers to a binding ++made by symbol-macrolet, ++then that var is treated as if psetf (not psetq) ++had been used. ++

++

Examples::

++ ++
++
 ;; A simple use of PSETQ to establish values for variables.
++ ;; As a matter of style, many programmers would prefer SETQ 
++ ;; in a simple situation like this where parallel assignment
++ ;; is not needed, but the two have equivalent effect.
++ (psetq a 1 b 2 c 3) ⇒  NIL
++ a ⇒  1
++ b ⇒  2
++ c ⇒  3
++
++ ;; Use of PSETQ to update values by parallel assignment.
++ ;; The effect here is very different than if SETQ had been used.
++ (psetq a (1+ b) b (1+ a) c (+ a b)) ⇒  NIL
++ a ⇒  3
++ b ⇒  2
++ c ⇒  3
++
++ ;; Use of PSETQ on a symbol macro.
++ (let ((x (list 10 20 30)))
++   (symbol-macrolet ((y (car x)) (z (cadr x)))
++     (psetq y (1+ z) z (1+ y))
++     (list x y z)))
++⇒  ((21 11 30) 21 11)
++
++ ;; Use of parallel assignment to swap values of A and B.
++ (let ((a 1) (b 2))
++   (psetq a b  b a)
++   (values a b))
++⇒  2, 1
++
++ ++

Side Effects::

++ ++

The values of forms are assigned to vars. ++

++

See Also::

++ ++

psetf, ++setq ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/push.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++push (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.19 push [Macro]

++ ++

push item placenew-place-value ++

++

Arguments and Values::

++ ++

item—an object. ++

++

place—a place, the value of which may be any object. ++

++

new-place-value—a list (the new value of place). ++

++

Description::

++ ++

push prepends item to the list that is stored ++in place, stores the resulting list in place, ++and returns the list. ++

++

For information about the evaluation of subforms of place, ++see Evaluation of Subforms to Places. ++

++

Examples::

++
++
 (setq llst '(nil)) ⇒  (NIL)
++ (push 1 (car llst)) ⇒  (1)
++ llst ⇒  ((1))
++ (push 1 (car llst)) ⇒  (1 1)
++ llst ⇒  ((1 1))
++ (setq x '(a (b c) d)) ⇒  (A (B C) D)
++ (push 5 (cadr x)) ⇒  (5 B C)  
++ x ⇒  (A (5 B C) D)
++
++ ++

Side Effects::

++ ++

The contents of place are modified. ++

++

See Also::

++ ++

pop ++, ++pushnew ++, ++Generalized Reference ++

++

Notes::

++

The effect of (push item place) ++is equivalent to ++

++
++
 (setf place (cons item place))
++
++ ++

except that the subforms of place ++are evaluated only once, and item is evaluated ++before place. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/pushnew.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++pushnew (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.45 pushnew [Macro]

++ ++

pushnew item place &key key test test-not
++ ⇒ new-place-value ++

++

Arguments and Values::

++ ++

item—an object. ++

++

place—a place, the value of which is a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

new-place-value—a list (the new value of place). ++

++

Description::

++ ++

pushnew tests whether item is the same as any existing ++element of the list stored in place. If item is not, ++it is prepended to the list, and the new list is stored in ++place. ++

++

pushnew returns the new list that is stored in place. ++

++

Whether or not item is already a member of the list that is ++in place is determined by comparisons using :test or :test-not. ++The first argument to the :test or :test-not ++function is item; the second argument is ++an element of the list in place as returned by ++the :key function (if supplied). ++

++

If :key is supplied, it is used to extract the part to be tested from ++both item and the list element, ++as for adjoin. ++

++

The argument to the :key function ++is an element of the list stored in ++place. The :key function typically returns part ++part of the element of the list. ++If :key is not supplied or nil, the list ++element is used. ++

++

For information about the evaluation of subforms of place, ++see Evaluation of Subforms to Places. ++

++

It is implementation-dependent whether or not pushnew ++actually executes the storing form for its place in the ++situation where the item is already a member of the list ++held by place. ++

++

Examples::

++
++
 (setq x '(a (b c) d)) ⇒  (A (B C) D)
++ (pushnew 5 (cadr x)) ⇒  (5 B C)   
++ x ⇒  (A (5 B C) D)
++ (pushnew 'b (cadr x)) ⇒  (5 B C)  
++ x ⇒  (A (5 B C) D)
++ (setq lst '((1) (1 2) (1 2 3))) ⇒  ((1) (1 2) (1 2 3))
++ (pushnew '(2) lst) ⇒  ((2) (1) (1 2) (1 2 3))
++ (pushnew '(1) lst) ⇒  ((1) (2) (1) (1 2) (1 2 3))
++ (pushnew '(1) lst :test 'equal) ⇒  ((1) (2) (1) (1 2) (1 2 3))
++ (pushnew '(1) lst :key #'car) ⇒  ((1) (2) (1) (1 2) (1 2 3)) 
++
++ ++

Side Effects::

++ ++

The contents of place may be modified. ++

++

See Also::

++ ++

push ++, ++adjoin ++, ++Generalized Reference ++

++

Notes::

++ ++

The effect of ++

++
 (pushnew item place :test p)
++
++ ++

is roughly equivalent to ++

++
 (setf place (adjoin item place :test p))
++
++ ++

except that the subforms of place are evaluated only once, ++and item is evaluated before place. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/quote.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++quote (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.7 quote [Special Operator]

++ ++

quote objectobject ++

++

Arguments and Values::

++ ++

object—an object; not evaluated. ++

++

Description::

++ ++

The quote special operator just returns object. ++

++

The consequences are undefined if literal objects (including ++quoted objects) are destructively modified. ++

++

Examples::

++ ++
++
 (setq a 1) ⇒  1
++ (quote (setq a 3)) ⇒  (SETQ A 3)
++ a ⇒  1
++ 'a ⇒  A
++ ''a ⇒  (QUOTE A) 
++ '''a ⇒  (QUOTE (QUOTE A))
++ (setq a 43) ⇒  43
++ (list a (cons a 3)) ⇒  (43 (43 . 3))
++ (list (quote a) (quote (cons a 3))) ⇒  (A (CONS A 3)) 
++ 1 ⇒  1
++ '1 ⇒  1
++ "foo" ⇒  "foo"
++ '"foo" ⇒  "foo"
++ (car '(a b)) ⇒  A
++ '(car '(a b)) ⇒  (CAR (QUOTE (A B)))
++ #(car '(a b)) ⇒  #(CAR (QUOTE (A B)))
++ '#(car '(a b)) ⇒  #(CAR (QUOTE (A B)))
++
++ ++

See Also::

++ ++

Evaluation, ++Single-Quote, ++

++

Compiler Terminology ++

++

Notes::

++ ++

The textual notation 'object is equivalent to (quote object); ++see Compiler Terminology. ++

++

Some objects, called self-evaluating objects, ++do not require quotation by quote. ++However, symbols and lists are used to represent parts of programs, ++and so would not be useable as constant data in a program without quote. ++Since quote suppresses the evaluation of these objects, ++they become data rather than program. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/random.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++random (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.41 random [Function]

++ ++

random limit &optional random-staterandom-number ++

++

Arguments and Values::

++ ++

limit—a positive integer, ++ or a positive float. ++

++

random-state—a random state. ++ The default is the current random state. ++

++

random-number—a non-negative number ++ less than limit ++ and of the same type as limit. ++

++

Description::

++ ++

Returns a pseudo-random number that is a non-negative number ++less than limit and of the same type as limit. ++

++

The random-state, which is modified by this function, ++encodes the internal state maintained by the random number generator. ++

++

An approximately uniform choice distribution is used. If limit ++is an integer, each of the possible results occurs with ++(approximate) probability 1/limit. ++

++

Examples::

++ ++
++
 (<= 0 (random 1000) 1000) ⇒  true
++ (let ((state1 (make-random-state))
++       (state2 (make-random-state)))
++   (= (random 1000 state1) (random 1000 state2))) ⇒  true
++
++ ++

Side Effects::

++ ++

The random-state is modified. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if limit is not a positive integer or a positive real. ++

++

See Also::

++ ++

make-random-state ++, ++random-state ++

++

Notes::

++ ++

See Common Lisp: The Language for information about generating random numbers. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/random_002dstate.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++random-state (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.39 random-state [System Class]

++ ++

Class Precedence List::

++

random-state, ++t ++

++

Description::

++ ++

A random state object contains state ++information used by the pseudo-random number generator. ++The nature of a random state object is implementation-dependent. ++It can be printed out and successfully read back in by the same implementation, ++but might not function correctly as a random state in another implementation. ++

++

Implementations are required to provide a read syntax for ++objects of type random-state, but the specific nature of that syntax ++is implementation-dependent. ++

++

See Also::

++ ++

random-state ++, ++random ++, ++Printing Random States ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/random_002dstate_002dp.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++random-state-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.42 random-state-p [Function]

++ ++

random-state-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type random-state; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (random-state-p *random-state*) ⇒  true
++ (random-state-p (make-random-state)) ⇒  true
++ (random-state-p 'test-function) ⇒  false
++
++ ++

See Also::

++ ++

make-random-state ++, ++random-state ++

++

Notes::

++ ++
++
 (random-state-p object) ≡ (typep object 'random-state)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rassoc.html +@@ -0,0 +1,141 @@ ++ ++ ++ ++ ++ ++rassoc (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.39 rassoc, rassoc-if, rassoc-if-not [Function]

++ ++

rassoc item alist &key key test test-notentry ++

++

rassoc-if predicate alist &key keyentry ++

++

rassoc-if-not predicate alist &key keyentry ++

++

Arguments and Values::

++ ++

item—an object. ++

++

alist—an association list. ++

++

predicate—a designator for ++ a function of one argument ++ that returns a generalized boolean. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

entry—a cons that is an element of the alist, ++ or nil. ++

++

Description::

++ ++

rassoc, rassoc-if, and rassoc-if-not ++return the first cons whose cdr ++satisfies the test. ++If no such cons is found, nil ++is returned. ++

++

If nil appears in alist in place of a pair, it is ignored. ++

++

Examples::

++ ++
++
 (setq alist '((1 . "one") (2 . "two") (3 . 3))) 
++⇒  ((1 . "one") (2 . "two") (3 . 3))
++ (rassoc 3 alist) ⇒  (3 . 3)
++ (rassoc "two" alist) ⇒  NIL
++ (rassoc "two" alist :test 'equal) ⇒  (2 . "two")
++ (rassoc 1 alist :key #'(lambda (x) (if (numberp x) (/ x 3)))) ⇒  (3 . 3)
++ (rassoc 'a '((a . b) (b . c) (c . a) (z . a))) ⇒  (C . A)
++ (rassoc-if #'stringp alist) ⇒  (1 . "one")
++ (rassoc-if-not #'vectorp alist) ⇒  (3 . 3)
++
++ ++

See Also::

++ ++

assoc ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

The function rassoc-if-not is deprecated. ++

++

It is possible to rplaca the result of rassoc, ++provided that it is not nil, in order to “update” alist. ++

++

The expressions ++

++
++
 (rassoc item list :test fn)
++
++ ++

and ++

++
++
 (find item list :test fn :key #'cdr)
++
++ ++

are equivalent in meaning, except when the item is nil ++and nil appears in place of a pair in the alist. ++See the function assoc. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/ratio.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++ratio (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.7 ratio [System Class]

++ ++

Class Precedence List::

++

ratio, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

A ratio is a number ++representing the mathematical ratio of two non-zero integers, ++the numerator and denominator, ++whose greatest common divisor is one, ++and of which the denominator is positive and greater than one. ++

++

See Also::

++ ++

Figure~2–9, ++Constructing Numbers from Tokens, ++Printing Ratios ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rational-_0028Function_0029.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++rational (Function) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.54 rational, rationalize [Function]

++ ++

rational numberrational ++

++

rationalize numberrational ++

++

Arguments and Values::

++ ++

number—a real. ++

++

rational—a rational. ++

++

Description::

++ ++

rational and rationalize convert ++

++

reals ++

++

to rationals. ++

++

If number is already rational, it is returned. ++

++

If number is a float, ++rational returns a rational ++that is mathematically equal in value to the float. ++rationalize returns a rational that ++approximates the float to the accuracy of ++the underlying floating-point representation. ++

++

rational assumes that the float is completely accurate. ++

++

rationalize assumes that the ++float is accurate only to the precision of the ++floating-point representation. ++

++

Examples::

++
++
 (rational 0) ⇒  0
++ (rationalize -11/100) ⇒  -11/100
++ (rational .1) ⇒  13421773/134217728 ;implementation-dependent
++ (rationalize .1) ⇒  1/10
++
++ ++

Affected By::

++ ++

The implementation. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if number is not a real. ++Might signal arithmetic-error. ++

++

Notes::

++ ++

It is always the case that ++

++
++
 (float (rational x) x) ≡ x
++
++ ++

and ++

++
++
 (float (rationalize x) x) ≡ x
++
++ ++

That is, rationalizing a float by either method ++and then converting it back ++to a float ++of the same format produces the original number. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rational-_0028System-Class_0029.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++rational (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.6 rational [System Class]

++ ++

Class Precedence List::

++

rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

The canonical representation of a rational ++is as an integer if its value is integral, ++and otherwise as a ratio. ++

++

The types integer and ratio ++are disjoint subtypes of type rational. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(rational{[lower-limit [upper-limit]]}) ++

++

Compound Type Specifier Arguments::

++ ++

lower-limit, upper-limitinterval designators ++ for type rational. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the rationals on the interval described by ++lower-limit and upper-limit. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rationalp.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++rationalp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.55 rationalp [Function]

++ ++

rationalp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type rational; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (rationalp 12) ⇒  true
++ (rationalp 6/5) ⇒  true
++ (rationalp 1.212) ⇒  false
++
++ ++

See Also::

++ ++

rational (Function) ++

++

Notes::

++
++
 (rationalp object) ≡ (typep object 'rational)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read.html +@@ -0,0 +1,223 @@ ++ ++ ++ ++ ++ ++read (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.4 read, read-preserving-whitespace [Function]

++ ++

read &optional input-stream eof-error-p eof-value recursive-pobject ++

++

read-preserving-whitespace &optional input-stream eof-error-p ++ eof-value recursive-p
++ ⇒ object ++

++

Arguments and Values::

++ ++

input-stream—an input stream designator. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++

++

The default is nil. ++

++

recursive-p—a generalized boolean. ++ The default is false. ++

++

object—an object (parsed by the Lisp reader) ++ or the eof-value. ++

++

Description::

++ ++

read parses the printed representation of an object ++from input-stream and builds such an object. ++

++

read-preserving-whitespace is like read but preserves ++any whitespace_2 character ++that delimits the printed representation of the object. ++read-preserving-whitespace is exactly like read ++when the recursive-p argument to read-preserving-whitespace ++is true. ++

++

When *read-suppress* is false, ++read throws away the delimiting character required by ++certain printed representations if it is a ++whitespace_2 character; ++but read preserves the character ++(using unread-char) if it is ++syntactically meaningful, because it could be the start of the next expression. ++

++

If a file ends in a symbol or a number ++immediately followed by an end of file_1, ++read reads the symbol or number successfully; ++when called again, it sees the end of file_1 and ++only then acts according to eof-error-p. ++If a file contains ignorable text at the end, such ++as blank lines and comments, read ++does not consider it to end in the ++middle of an object. ++

++

If recursive-p is true, the call to read is ++expected to be made ++from within some function that itself ++has been called from read or from a similar input function, rather ++than from the top level. ++

++

Both functions return the object read from input-stream. ++Eof-value is returned if eof-error-p is false and end of file ++is reached before the beginning of an object. ++

++

Examples::

++ ++
++
 (read)
++ |>  |>>'a<<|
++⇒  (QUOTE A)
++ (with-input-from-string (is " ") (read is nil 'the-end)) ⇒  THE-END
++ (defun skip-then-read-char (s c n)
++    (if (char= c #\{) (read s t nil t) (read-preserving-whitespace s))
++    (read-char-no-hang s)) ⇒  SKIP-THEN-READ-CHAR
++ (let ((*readtable* (copy-readtable nil)))
++    (set-dispatch-macro-character #\# #\{ #'skip-then-read-char)
++    (set-dispatch-macro-character #\# #\} #'skip-then-read-char)
++    (with-input-from-string (is "#{123 x #}123 y")
++      (format t "~S ~S" (read is) (read is)))) ⇒  #\x, #\Space, NIL
++
++ ++

As an example, consider this reader macro definition: ++

++
++
 (defun slash-reader (stream char)
++   (declare (ignore char))
++   `(path . ,(loop for dir = (read-preserving-whitespace stream t nil t)
++                   then (progn (read-char stream t nil t)
++                               (read-preserving-whitespace stream t nil t))
++                   collect dir
++                   while (eql (peek-char nil stream nil nil t) #\/))))
++ (set-macro-character #\/ #'slash-reader)
++
++ ++

Consider now calling read on this expression: ++

++
++
 (zyedh /usr/games/zork /usr/games/boggle)
++
++ ++

The / macro reads objects separated by more / characters; ++thus /usr/games/zork is intended to read as (path usr games zork). ++The entire example expression should therefore be read as ++

++
++
 (zyedh (path usr games zork) (path usr games boggle))
++
++ ++

However, if read had been used instead of ++read-preserving-whitespace, then after the reading of the symbol ++zork, the following space would be discarded; the next call ++to peek-char would see the following /, and the loop would ++continue, producing this interpretation: ++

++
++
 (zyedh (path usr games zork usr games boggle))
++
++ ++

There are times when whitespace_2 should be discarded. ++If a command interpreter takes single-character commands, ++but occasionally reads an object then if the whitespace_2 ++after a symbol ++is not discarded it might be interpreted as a command ++some time later after the symbol had been read. ++

++

Affected By::

++ ++

*standard-input*, ++*terminal-io*, ++*readtable*, ++*read-default-float-format*, ++*read-base*, ++*read-suppress*, ++*package*, ++*read-eval*. ++

++

Exceptional Situations::

++ ++

read signals an error of type end-of-file, ++regardless of eof-error-p, if ++the file ends in the middle of an object representation. ++For example, if a file does ++not contain enough right parentheses to balance the left parentheses in ++it, read signals an error. ++This is detected when read or read-preserving-whitespace ++is called with recursive-p and eof-error-p non-nil, ++and end-of-file is reached before the beginning of an object. ++

++

If eof-error-p is true, an error of type end-of-file ++is signaled at the end of file. ++

++

See Also::

++ ++

peek-char ++, ++read-char ++, ++unread-char ++, ++read-from-string ++, ++read-delimited-list ++, ++parse-integer ++, ++Syntax, ++Reader Concepts ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002dbyte.html +@@ -0,0 +1,110 @@ ++ ++ ++ ++ ++ ++read-byte (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.14 read-byte [Function]

++ ++

read-byte stream &optional eof-error-p eof-valuebyte ++

++

Arguments and Values::

++ ++

stream—a binary input stream. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++ The default is nil. ++

++

byte—an integer, ++ or the eof-value. ++

++

Description::

++ ++

read-byte reads and returns one byte from stream. ++

++

If an end of file_2 occurs and eof-error-p is false, ++the eof-value is returned. ++

++

Examples::

++
++
 (with-open-file (s "temp-bytes" 
++                     :direction :output
++                     :element-type 'unsigned-byte)
++    (write-byte 101 s)) ⇒  101
++ (with-open-file (s "temp-bytes" :element-type 'unsigned-byte)
++    (format t "~S ~S" (read-byte s) (read-byte s nil 'eof)))
++ |>  101 EOF
++⇒  NIL
++
++ ++

Side Effects::

++ ++

Modifies stream. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream. ++

++

Should signal an error of type error ++if stream is not a binary input stream. ++

++

If there are no bytes remaining in the stream ++and eof-error-p is true, an error of type end-of-file is signaled. ++

++

See Also::

++ ++

read-char ++, ++

++

read-sequence ++, ++

++

write-byte ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002dchar.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++read-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.17 read-char [Function]

++ ++

read-char &optional input-stream eof-error-p eof-value recursive-pchar ++

++

Arguments and Values::

++ ++

input-stream—an input stream designator. ++ The default is standard input. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++ The default is nil. ++

++

recursive-p—a generalized boolean. ++ The default is false. ++

++

char—a character or the eof-value. ++

++

Description::

++ ++

read-char returns the next character from input-stream. ++

++

When input-stream is an echo stream, ++the character is echoed on input-stream the first time the character is ++seen. ++ Characters that are not echoed by read-char ++are those that were ++ put there by unread-char ++and hence are assumed to have been echoed ++ already by a previous call to read-char. ++

++

If recursive-p is true, ++this call is expected to be embedded in a higher-level call to read ++or a similar function used by the Lisp reader. ++

++

If an end of file_2 occurs and eof-error-p is false, ++eof-value is returned. ++

++

Examples::

++
++
 (with-input-from-string (is "0123")
++    (do ((c (read-char is) (read-char is nil 'the-end)))
++        ((not (characterp c)))
++     (format t "~S " c)))
++ |>  #\0 #\1 #\2 #\3
++⇒  NIL
++
++ ++

Affected By::

++ ++

*standard-input*, ++*terminal-io*. ++

++

Exceptional Situations::

++ ++

If an end of file_2 occurs before a character can be read, and ++eof-error-p is true, ++an error of type end-of-file is signaled. ++

++

See Also::

++ ++

read-byte ++, ++

++

read-sequence ++, ++

++

write-char ++, ++read ++

++

Notes::

++

The corresponding output function is write-char. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002dchar_002dno_002dhang.html +@@ -0,0 +1,133 @@ ++ ++ ++ ++ ++ ++read-char-no-hang (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.18 read-char-no-hang [Function]

++ ++

read-char-no-hang &optional input-stream eof-error-p ++ eof-value recursive-pchar ++

++

Arguments and Values::

++ ++

input-stream – an input stream designator. ++ The default is standard input. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++ The default is nil. ++

++

recursive-p—a generalized boolean. ++ The default is false. ++

++

char—a character or nil or the eof-value. ++

++

Description::

++ ++

read-char-no-hang returns a character ++from input-stream if such a character is available. If no character ++is available, read-char-no-hang returns nil. ++

++

If recursive-p is true, ++this call is expected to be embedded in a higher-level call to read ++or a similar function used by the Lisp reader. ++

++

If an end of file_2 occurs and eof-error-p is false, ++eof-value is returned. ++

++

Examples::

++ ++
++
;; This code assumes an implementation in which a newline is not
++;; required to terminate input from the console.
++ (defun test-it ()
++   (unread-char (read-char))
++   (list (read-char-no-hang) 
++         (read-char-no-hang) 
++         (read-char-no-hang)))
++⇒  TEST-IT
++;; Implementation A, where a Newline is not required to terminate
++;; interactive input on the console.
++ (test-it)
++ |>  |>>a<<|
++⇒  (#\a NIL NIL)
++;; Implementation B, where a Newline is required to terminate
++;; interactive input on the console, and where that Newline remains
++;; on the input stream.
++ (test-it)
++ |>  |>>a[<–~]<<|
++⇒  (#\a #\Newline NIL)
++
++ ++

Affected By::

++ ++

*standard-input*, ++*terminal-io*. ++

++

Exceptional Situations::

++ ++

If an end of file_2 occurs ++when eof-error-p is true, ++an error of type end-of-file is signaled . ++

++

See Also::

++ ++

listen ++

++

Notes::

++ ++

read-char-no-hang is exactly like read-char, except ++that if it would be necessary to wait in order to get a character (as ++from a keyboard), nil is immediately returned without waiting. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002ddelimited_002dlist.html +@@ -0,0 +1,184 @@ ++ ++ ++ ++ ++ ++read-delimited-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.5 read-delimited-list [Function]

++ ++

read-delimited-list char &optional input-stream recursive-plist ++

++

Arguments and Values::

++ ++

char—a character. ++

++

input-stream—an input stream designator. ++ The default is standard input. ++

++

recursive-p—a generalized boolean. ++ The default is false. ++

++

list—a list of the objects read. ++

++

Description::

++ ++

read-delimited-list reads objects from input-stream ++until the next character after an object’s ++representation (ignoring whitespace_2 characters and comments) is char. ++

++

read-delimited-list looks ahead at each step ++for the next non-whitespace_2 character ++and peeks at it as if with peek-char. ++If it is char, ++then the character is consumed and the list of objects is returned. ++If it is a constituent or escape character, ++then read is used to read an object, ++which is added to the end of the list. ++If it is a macro character, ++its reader macro function is called; ++if the function returns a value, ++that value is added to the list. ++The peek-ahead process is then repeated. ++

++

If recursive-p is true, ++this call is expected to be embedded in a higher-level call to read ++or a similar function. ++

++

It is an error to reach end-of-file during the operation of ++read-delimited-list. ++

++

The consequences are undefined ++if char has a syntax type of whitespace_2 ++in the current readtable. ++

++

Examples::

++
++
 (read-delimited-list #\]) 1 2 3 4 5 6 ]
++⇒  (1 2 3 4 5 6)
++
++ ++

Suppose you wanted #{a b c ... z} ++to read as a list of all pairs of the elements a, b, c, ++..., z, for example. ++

++
++
 #{p q z a}  reads as  ((p q) (p z) (p a) (q z) (q a) (z a))
++
++ ++

This can be done by specifying a macro-character definition for #{ ++that does two things: reads in all the items up to the }, ++and constructs the pairs. read-delimited-list performs ++the first task. ++

++
++
 (defun |#{-reader| (stream char arg)
++   (declare (ignore char arg))
++   (mapcon #'(lambda (x)
++              (mapcar #'(lambda (y) (list (car x) y)) (cdr x)))
++          (read-delimited-list #\} stream t))) ⇒  |#{-reader|
++
++ (set-dispatch-macro-character #\# #\{ #'|#{-reader|) ⇒  T 
++ (set-macro-character #\} (get-macro-character #\) nil))
++
++ ++

Note that true is supplied for the recursive-p argument. ++

++

It is necessary here to give a definition to the character } as ++well to prevent it from being a constituent. ++If the line ++

++
++
 (set-macro-character #\} (get-macro-character #\) nil))
++
++ ++

shown above were not included, then the } in ++

++
++
 #{ p q z a}
++
++ ++

would be considered a constituent character, part of the symbol named ++a}. This could be corrected by putting a space before ++the }, but it is better to call ++set-macro-character. ++

++

Giving } the same ++definition as the standard definition of the character ) has the ++twin benefit of making it terminate tokens for use with ++read-delimited-list and also making it invalid for use in any ++other context. Attempting to read a stray } will signal an error. ++

++

Affected By::

++ ++

*standard-input*, ++*readtable*, ++*terminal-io*. ++

++

See Also::

++ ++

read ++, ++peek-char ++, ++read-char ++, ++unread-char ++. ++

++

Notes::

++ ++

read-delimited-list is intended for use in implementing reader macros. ++Usually it is desirable for char to be a terminating macro character ++so that it can be used to delimit tokens; however, read-delimited-list ++makes no attempt to alter the syntax specified for char by the current ++readtable. The caller must make any necessary changes to the readtable syntax ++explicitly. ++

++
++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002dfrom_002dstring.html +@@ -0,0 +1,137 @@ ++ ++ ++ ++ ++ ++read-from-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.6 read-from-string [Function]

++ ++

read-from-string string &optional eof-error-p eof-value ++ &key start end preserve-whitespace
++ ⇒ object, position ++

++

Arguments and Values::

++ ++

string—a string. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++

++

The default is nil. ++

++

start, endbounding index designators of string. ++ The defaults for start and end are 0 and nil, respectively. ++

++

preserve-whitespace—a generalized boolean. ++ The default is false. ++

++

object—an object (parsed by the Lisp reader) ++ or the eof-value. ++

++

position—an integer greater than or equal to zero, ++ and less than or equal to ++ one more than the length of the string. ++

++

Description::

++ ++

Parses the printed representation of an object ++from the subsequence of string bounded by start and end, ++as if read had been called on an input stream ++containing those same characters. ++

++

If preserve-whitespace is true, ++the operation will preserve whitespace_2 ++as read-preserving-whitespace would do. ++

++

If an object is successfully parsed, the primary value, object, ++is the object that was parsed. ++If eof-error-p is false and if the end of the substring is reached, ++eof-value is returned. ++

++

The secondary value, position, is the index of the first character ++in the bounded string that was not read. ++The position may depend upon the value of preserve-whitespace. ++If the entire string was read, ++the position returned is either the length of the string ++or one greater than the length of the string. ++

++

Examples::

++ ++
++
 (read-from-string " 1 3 5" t nil :start 2) ⇒  3, 5
++ (read-from-string "(a b c)") ⇒  (A B C), 7
++
++ ++

Exceptional Situations::

++ ++

If the end of the supplied substring ++occurs before an object can be read, an ++error is signaled if eof-error-p is true. ++An error is signaled if the end of the substring occurs ++in the middle of an incomplete object. ++

++

See Also::

++ ++

read ++, ++read-preserving-whitespace ++

++

Notes::

++ ++

The reason that position is allowed to be beyond the ++length of the string is to permit (but not require) ++the implementation to work by simulating the effect of a ++trailing delimiter at the end of the bounded string. ++When preserve-whitespace is true, ++the position might count the simulated delimiter. ++

++
++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002dline.html +@@ -0,0 +1,133 @@ ++ ++ ++ ++ ++ ++read-line (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.22 read-line [Function]

++ ++

read-line &optional input-stream eof-error-p eof-value recursive-p
++ ⇒ line, missing-newline-p ++

++

Arguments and Values::

++ ++

input-stream—an input stream designator. ++ The default is standard input. ++

++

eof-error-p—a generalized boolean. ++ The default is true. ++

++

eof-value—an object. ++ The default is nil. ++

++

recursive-p—a generalized boolean. ++ The default is false. ++

++

line—a string or the eof-value. ++

++

missing-newline-p—a generalized boolean. ++

++

Description::

++ ++

Reads from input-stream a line of text ++that is terminated by a newline or end of file. ++

++

If recursive-p is true, ++this call is expected to be embedded in a higher-level call to read ++or a similar function used by the Lisp reader. ++

++

The primary value, line, is the line that is read, ++represented as a string (without the trailing newline, if any). ++If eof-error-p is false ++and the end of file for input-stream is reached ++ before any characters are read, ++eof-value is returned as the line. ++

++

The secondary value, missing-newline-p, ++is a generalized boolean that is ++ false if the line was terminated by a newline, ++ or true if the line was terminated by ++ the end of file for input-stream ++ (or if the line is the eof-value). ++

++

Examples::

++ ++
++
 (setq a "line 1
++ line2")
++⇒  "line 1
++ line2"
++ (read-line (setq input-stream (make-string-input-stream a)))
++⇒  "line 1", false
++ (read-line input-stream)
++⇒  "line2", true
++ (read-line input-stream nil nil)
++⇒  NIL, true
++
++ ++

Affected By::

++ ++

*standard-input*, ++*terminal-io*. ++

++

Exceptional Situations::

++ ++

If an end of file_2 occurs before any characters are read in the line, ++an error is signaled if eof-error-p is true. ++

++

See Also::

++ ++

read ++

++

Notes::

++ ++

The corresponding output function is write-line. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/read_002dsequence.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++read-sequence (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.24 read-sequence [Function]

++ ++

read-sequence sequence stream &key start endposition ++

++

sequence—a sequence. ++

++

stream—an input stream. ++

++

start, endbounding index designators of ++ sequence. The defaults for start and end are 0 and nil, respectively. ++

++

position—an integer greater than or equal to zero, and ++ less than or equal to the length of the sequence. ++

++

Description::

++ ++

Destructively modifies sequence by replacing the elements ++of sequence bounded by start and end with ++elements read from stream. ++

++

Sequence is destructively modified by copying successive ++elements into it from stream. If the end of file for ++stream is reached before copying all elements of the ++subsequence, then the extra elements near the end of sequence ++are not updated. ++

++

Position is the index of the first element of sequence ++that was not updated, which might be less than end because the ++end of file was reached. ++

++

Examples::

++ ++
++
 (defvar *data* (make-array 15 :initial-element nil))
++ (values (read-sequence *data* (make-string-input-stream "test string")) *data*)
++ ⇒  11, #(#\t #\e #\s #\t #\Space #\s #\t #\r #\i #\n #\g NIL NIL NIL NIL)
++
++ ++

Side Effects::

++ ++

Modifies stream and sequence. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++Should signal an error of type type-error ++ if start is not a non-negative integer. ++Should signal an error of type type-error ++ if end is not a non-negative integer or nil. ++

++

Might signal an error of type type-error if an element read from ++the stream is not a member of the element type of the ++sequence. ++

++

See Also::

++ ++

Compiler Terminology, ++write-sequence ++, ++read-line ++

++

Notes::

++ ++

read-sequence is identical in effect to iterating over the indicated ++subsequence and reading one element at a time from stream and ++storing it into sequence, but may be more efficient than the ++equivalent loop. An efficient implementation is more likely to exist ++for the case where the sequence is a vector with the same ++element type as the stream. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/reader_002derror.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++reader-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Reader Dictionary  

++
++
++

23.2.18 reader-error [Condition Type]

++ ++

Class Precedence List::

++

reader-error, ++parse-error, ++stream-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type reader-error consists of ++error conditions that are related to tokenization and parsing ++done by the Lisp reader. ++

++

See Also::

++ ++

read ++, ++stream-error-stream ++, ++Reader Concepts ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/readtable.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++readtable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.1 readtable [System Class]

++ ++

Class Precedence List::

++

readtable, ++t ++

++

Description::

++ ++

A readtable maps characters into syntax types for ++the Lisp reader; see Syntax. ++A readtable also ++ contains associations between macro characters ++ and their reader macro functions, ++ and records information about the case conversion rules ++ to be used by the Lisp reader when parsing symbols. ++

++

Each simple character must be representable in the readtable. ++It is implementation-defined whether non-simple characters ++can have syntax descriptions in the readtable. ++

++

See Also::

++ ++

Readtables, ++Printing Other Objects ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/readtable_002dcase.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++readtable-case (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.7 readtable-case [Accessor]

++ ++

readtable-case readtablemode ++

++

(setf ( readtable-case readtable) mode)
++

++

Arguments and Values::

++ ++

readtable—a readtable. ++

++

mode—a case sensitivity mode. ++

++

Description::

++ ++

Accesses the readtable case of readtable, ++which affects the way in which the Lisp Reader reads symbols ++ and the way in which the Lisp Printer writes symbols. ++

++

Examples::

++ ++

See Examples of Effect of Readtable Case on the Lisp Reader and Examples of Effect of Readtable Case on the Lisp Printer. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if readtable is not a readtable. ++Should signal an error of type type-error ++ if mode is not a case sensitivity mode. ++

++

See Also::

++ ++

readtable ++, ++*print-escape*, ++Reader Algorithm, ++Effect of Readtable Case on the Lisp Reader, ++Effect of Readtable Case on the Lisp Printer ++

++

Notes::

++ ++

copy-readtable copies the readtable case of the readtable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/readtablep.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++readtablep (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.8 readtablep [Function]

++ ++

readtablep objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type readtable; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (readtablep *readtable*) ⇒  true
++ (readtablep (copy-readtable)) ⇒  true
++ (readtablep '*readtable*) ⇒  false
++
++ ++

Notes::

++ ++
++
 (readtablep object) ≡ (typep object 'readtable) 
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/real.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++real (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.3 real [System Class]

++ ++

Class Precedence List::

++

real, ++number, ++t ++

++

Description::

++ ++

The type real includes all numbers that ++represent mathematical real numbers, though there are mathematical real ++numbers (e.g., irrational numbers) that do not have an exact representation ++in Common Lisp. Only reals can be ordered using the ++<, >, <=, and >= functions. ++

++

The types rational and float are disjoint ++subtypes of type real. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(real{[lower-limit [upper-limit]]}) ++

++

Compound Type Specifier Arguments::

++ ++

lower-limit, upper-limitinterval designators ++ for type real. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the reals on the interval described by ++lower-limit and upper-limit. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/realp.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++realp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.52 realp [Function]

++ ++

realp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type real; ++otherwise, returns false. ++

++

Examples::

++
++
 (realp 12) ⇒  true
++ (realp #c(5/3 7.2)) ⇒  false
++ (realp nil) ⇒  false
++ (realp (cons 1 2)) ⇒  false
++
++ ++

Notes::

++ ++
++
 (realp object) ≡ (typep object 'real)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/realpart.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++realpart (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.50 realpart, imagpart [Function]

++ ++

realpart numberreal ++

++

imagpart numberreal ++

++

Arguments and Values::

++ ++

number—a number. ++

++

real—a real. ++

++

Description::

++ ++

realpart and imagpart return the real and ++imaginary parts of number respectively. ++If number is ++

++

real, ++

++

then realpart returns number and imagpart ++returns (* 0 number), which has the effect that the ++imaginary part of a rational is 0 and that of ++a float is a floating-point zero of the same format. ++

++

Examples::

++ ++
++
 (realpart #c(23 41)) ⇒  23
++ (imagpart #c(23 41.0)) ⇒  41.0
++ (realpart #c(23 41.0)) ⇒  23.0
++ (imagpart 23.0) ⇒  0.0
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if number is not a number. ++

++

See Also::

++ ++

complex ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/reduce.html +@@ -0,0 +1,146 @@ ++ ++ ++ ++ ++ ++reduce (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.9 reduce [Function]

++ ++

reduce function sequence &key key from-end start end initial-valueresult ++

++

Arguments and Values::

++ ++

function—a designator for a function ++ that might be called with either zero or two arguments. ++

++

sequence—a proper sequence. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

initial-value—an object. ++

++

result—an object. ++

++

Description::

++ ++

reduce uses a binary operation, function, ++to combine the elements of sequence ++bounded by start and end. ++

++

The function must accept as arguments two elements ++of sequence or the results from combining those elements. ++The function must also be able to accept no arguments. ++

++

If key is supplied, it is used is used to extract the values to reduce. ++The key function is applied exactly once to each element of sequence ++in the order implied by the reduction order but not to the value of ++initial-value, if supplied. ++

++

The key function typically returns part of the element of sequence. ++If key is not supplied or is nil, the sequence element itself is used. ++

++

The reduction is left-associative, ++unless from-end is true in which case it is right-associative. ++

++

If initial-value is supplied, ++it is logically placed before the subsequence ++(or after it if from-end is true) ++and included in the reduction operation. ++

++

In the normal case, the result of reduce is the combined ++result of function’s being applied to successive pairs of elements ++of sequence. ++If the subsequence contains exactly one element ++and no initial-value is given, ++then that element is returned and function is not called. ++If the subsequence is empty and an initial-value is given, ++then the initial-value is returned and function is not called. ++If the subsequence is empty and no initial-value is given, ++then the function is called with zero arguments, ++and reduce returns whatever function does. ++This is the only case where the ++function is called with other than two arguments. ++

++

Examples::

++
++
 (reduce #'* '(1 2 3 4 5)) ⇒  120
++ (reduce #'append '((1) (2)) :initial-value '(i n i t)) ⇒  (I N I T 1 2)
++ (reduce #'append '((1) (2)) :from-end t                  
++                             :initial-value '(i n i t)) ⇒  (1 2 I N I T) 
++ (reduce #'- '(1 2 3 4)) ≡ (- (- (- 1 2) 3) 4) ⇒  -8
++ (reduce #'- '(1 2 3 4) :from-end t)    ;Alternating sum.
++≡ (- 1 (- 2 (- 3 4))) ⇒  -2
++ (reduce #'+ '()) ⇒  0
++ (reduce #'+ '(3)) ⇒  3
++ (reduce #'+ '(foo)) ⇒  FOO
++ (reduce #'list '(1 2 3 4)) ⇒  (((1 2) 3) 4)
++ (reduce #'list '(1 2 3 4) :from-end t) ⇒  (1 (2 (3 4)))
++ (reduce #'list '(1 2 3 4) :initial-value 'foo) ⇒  ((((foo 1) 2) 3) 4)
++ (reduce #'list '(1 2 3 4)
++        :from-end t :initial-value 'foo) ⇒  (1 (2 (3 (4 foo))))
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/reinitialize_002dinstance.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++reinitialize-instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.4 reinitialize-instance [Standard Generic Function]

++ ++

Syntax::

++ ++

reinitialize-instance instance &rest initargs &key &allow-other-keysinstance ++

++

Method Signatures::

++ ++

reinitialize-instance (instance standard-object) &rest initargs ++

++

Arguments and Values::

++ ++

instance—an object. ++

++

initargs—an initialization argument list. ++

++

Description::

++ ++

The generic function reinitialize-instance can be used to change ++the values of local slots of an instance according to ++initargs. ++This generic function can be called by users. ++

++

The system-supplied primary method for reinitialize-instance ++checks the validity of initargs and signals an error if ++an initarg is supplied that is not declared as valid. ++The method then calls the generic function shared-initialize ++with the following arguments: the instance, ++nil (which means no slots ++should be initialized according to their initforms), and the ++initargs it received. ++

++

Side Effects::

++ ++

The generic function reinitialize-instance changes the values of local slots. ++

++

Exceptional Situations::

++ ++

The system-supplied primary method for reinitialize-instance ++signals an error if an initarg is supplied that is not declared as valid. ++

++

See Also::

++ ++

Initialize-Instance ++, ++Shared-Initialize ++, ++update-instance-for-redefined-class ++, ++update-instance-for-different-class ++, ++slot-boundp ++, ++slot-makunbound ++, ++Reinitializing an Instance, ++Rules for Initialization Arguments, ++Declaring the Validity of Initialization Arguments ++

++

Notes::

++ ++

Initargs are declared as valid by using the ++:initarg option to defclass, or by defining ++methods for reinitialize-instance ++or shared-initialize. The keyword name ++of each keyword parameter specifier in the lambda list of any ++method ++defined on reinitialize-instance or shared-initialize is ++declared as a valid initialization argument name for all ++classes for ++which that method is applicable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/remf.html +@@ -0,0 +1,104 @@ ++ ++ ++ ++ ++ ++remf (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.42 remf [Macro]

++ ++

remf place indicatorgeneralized-boolean ++

++

Arguments and Values::

++ ++

place—a place. ++

++

indicator—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

remf removes from the property list stored in place ++a property_1 with a property indicator ++identical to indicator. ++

++

If there are multiple properties_1 with the identical key, ++remf only removes the first such property. ++

++

remf returns false if no such property was found, ++or true if a property was found. ++

++

The property indicator ++and the corresponding property value ++are removed in an undefined order ++by destructively splicing the property list. ++

++

remf is permitted to either setf place or to ++setf any part, car or cdr, ++of the list structure held by that place. ++

++

For information about the evaluation of subforms of place, ++see Evaluation of Subforms to Places. ++

++

Examples::

++ ++
++
 (setq x (cons () ())) ⇒  (NIL)
++ (setf (getf (car x) 'prop1) 'val1) ⇒  VAL1
++ (remf (car x) 'prop1) ⇒  true
++ (remf (car x) 'prop1) ⇒  false
++
++ ++

Side Effects::

++ ++

The property list stored in place is modified. ++

++

See Also::

++ ++

remprop ++, ++getf ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/remhash.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++remhash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.10 remhash [Function]

++ ++

remhash key hash-tablegeneralized-boolean ++

++

Arguments and Values::

++ ++

key—an object. ++

++

hash-table—a hash table. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Removes the entry for key in hash-table, if any. ++Returns true if there was such an entry, or false otherwise. ++

++

Examples::

++
++
 (setq table (make-hash-table)) ⇒  #<HASH-TABLE EQL 0/120 32115666>
++ (setf (gethash 100 table) "C") ⇒  "C"
++ (gethash 100 table) ⇒  "C", true
++ (remhash 100 table) ⇒  true
++ (gethash 100 table) ⇒  NIL, false
++ (remhash 100 table) ⇒  false
++
++ ++

Side Effects::

++ ++

The hash-table is modified. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/remove.html +@@ -0,0 +1,244 @@ ++ ++ ++ ++ ++ ++remove (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.22 remove, remove-if, remove-if-not,

++

delete, delete-if, delete-if-not

++

[Function] ++

++

remove item sequence &key from-end test test-not start end count keyresult-sequence ++

++

remove-if test sequence &key from-end start end count keyresult-sequence ++

++

remove-if-not test sequence &key from-end start end count keyresult-sequence ++

++

delete item sequence &key from-end test test-not start end count keyresult-sequence ++

++

delete-if test sequence &key from-end start end count keyresult-sequence ++

++

delete-if-not test sequence &key from-end start end count keyresult-sequence ++

++

Arguments and Values::

++ ++

item—an object. ++

++

sequence—a proper sequence. ++

++

test—a designator for a function ++ of one argument that returns a generalized boolean. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

count—an integer or nil. ++

++

The default is nil. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-sequence—a sequence. ++

++

Description::

++ ++

remove, remove-if, and remove-if-not ++return a sequence from which ++the elements that satisfy the test ++have been removed. ++

++

delete, delete-if, and delete-if-not ++are like remove, remove-if, and ++remove-if-not respectively, ++but they may modify sequence. ++

++

If sequence is a vector, the result is a ++vector that has the same ++actual array element type as sequence. ++The result might or might not be simple, and ++might or might not be identical ++to sequence. ++If sequence is a list, the result is a list. ++

++

Supplying a from-end of true matters only when the ++count is provided; in that case only the rightmost count elements ++satisfying the test are deleted. ++

++

Count, if supplied, limits the number of elements ++removed or deleted; if more than count elements satisfy the test, ++then of these elements only the leftmost or rightmost, depending on ++from-end, ++are deleted or removed, ++as many as specified by count. ++

++

If count is supplied and negative, ++the behavior is as if zero had been supplied instead. ++

++

If count is nil, all matching items are affected. ++

++

For all these functions, ++elements ++not removed or deleted occur in the same order in the result ++as they did in sequence. ++

++

remove, remove-if, remove-if-not return ++a sequence ++of the same type as sequence ++that has the same elements except that those in the subsequence ++bounded by start and end and satisfying the test ++have been removed. ++This is a non-destructive operation. If any ++elements need to be removed, the result will be a copy. ++The result of remove may share ++with sequence; ++the result may be identical to the input sequence ++if no elements need to be removed. ++

++

delete, delete-if, and delete-if-not ++return a sequence ++of the same type as sequence ++that has the same elements except that those in the subsequence ++bounded by start and end and satisfying the test ++have been deleted. ++Sequence may be destroyed and used to construct ++the result; however, the result might or might not be identical ++to sequence. ++

++

delete, when sequence is a list, is permitted to ++setf any part, car or cdr, of the ++top-level list structure in that sequence. ++When sequence is a vector, delete is ++permitted to change the dimensions of the vector ++and to slide its elements into new positions without ++permuting them to produce the resulting vector. ++

++

delete-if is constrained to behave exactly as follows: ++

++
++
 (delete nil sequence
++             :test #'(lambda (ignore item) (funcall test item))
++             ...)
++
++ ++

Examples::

++
++
 (remove 4 '(1 3 4 5 9)) ⇒  (1 3 5 9)
++ (remove 4 '(1 2 4 1 3 4 5)) ⇒  (1 2 1 3 5)
++ (remove 4 '(1 2 4 1 3 4 5) :count 1) ⇒  (1 2 1 3 4 5)
++ (remove 4 '(1 2 4 1 3 4 5) :count 1 :from-end t) ⇒  (1 2 4 1 3 5)
++ (remove 3 '(1 2 4 1 3 4 5) :test #'>) ⇒  (4 3 4 5)
++ (setq lst '(list of four elements)) ⇒  (LIST OF FOUR ELEMENTS)
++ (setq lst2 (copy-seq lst)) ⇒  (LIST OF FOUR ELEMENTS)
++ (setq lst3 (delete 'four lst)) ⇒  (LIST OF ELEMENTS)
++ (equal lst lst2) ⇒  false
++ (remove-if #'oddp '(1 2 4 1 3 4 5)) ⇒  (2 4 4)
++ (remove-if #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t) 
++⇒  (1 2 4 1 3 5)
++ (remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9) :count 2 :from-end t)
++⇒  (1 2 3 4 5 6 8)
++ (setq tester (list 1 2 4 1 3 4 5)) ⇒  (1 2 4 1 3 4 5)
++ (delete 4 tester) ⇒  (1 2 1 3 5)
++ (setq tester (list 1 2 4 1 3 4 5)) ⇒  (1 2 4 1 3 4 5)
++ (delete 4 tester :count 1) ⇒  (1 2 1 3 4 5)
++ (setq tester (list 1 2 4 1 3 4 5)) ⇒  (1 2 4 1 3 4 5)
++ (delete 4 tester :count 1 :from-end t) ⇒  (1 2 4 1 3 5)
++ (setq tester (list 1 2 4 1 3 4 5)) ⇒  (1 2 4 1 3 4 5)
++ (delete 3 tester :test #'>) ⇒  (4 3 4 5)
++ (setq tester (list 1 2 4 1 3 4 5)) ⇒  (1 2 4 1 3 4 5)
++ (delete-if #'oddp tester) ⇒  (2 4 4)
++ (setq tester (list 1 2 4 1 3 4 5)) ⇒  (1 2 4 1 3 4 5)
++ (delete-if #'evenp tester :count 1 :from-end t) ⇒  (1 2 4 1 3 5)    
++ (setq tester (list 1 2 3 4 5 6)) ⇒  (1 2 3 4 5 6) 
++ (delete-if #'evenp tester) ⇒  (1 3 5) 
++ tester ⇒  implementation-dependent
++
++ ++
++
 (setq foo (list 'a 'b 'c)) ⇒  (A B C)
++ (setq bar (cdr foo)) ⇒  (B C)
++ (setq foo (delete 'b foo)) ⇒  (A C)
++ bar ⇒  ((C)) or ...
++ (eq (cdr foo) (car bar)) ⇒  T or ...
++
++ ++

Side Effects::

++ ++

For delete, delete-if, and delete-if-not, ++sequence may be destroyed and used to construct the result. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++

The functions delete-if-not and remove-if-not are deprecated. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/remove_002dduplicates.html +@@ -0,0 +1,170 @@ ++ ++ ++ ++ ++ ++remove-duplicates (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Sequences Dictionary  

++
++
++

17.3.23 remove-duplicates, delete-duplicates [Function]

++ ++

remove-duplicates sequence &key ++ from-end test test-not ++ start end key
++ ⇒ result-sequence ++

++

delete-duplicates sequence &key ++ from-end test test-not ++ start end key
++ ⇒ result-sequence ++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-sequence—a sequence. ++

++

Description::

++ ++

remove-duplicates returns a modified copy of sequence ++from which any element that matches another element occurring in ++sequence has been removed. ++

++

If sequence is a vector, the result is a ++vector that has the same ++actual array element type as sequence. ++The result might or might not be simple, and ++might or might not be identical ++to sequence. ++If sequence is a list, the result is a list. ++

++

delete-duplicates is like remove-duplicates, ++but delete-duplicates may modify sequence. ++

++

The elements of sequence are compared pairwise, and if any two match, ++then the one occurring earlier in sequence ++is discarded, unless from-end is true, in which case the one ++later in sequence is discarded. ++

++

remove-duplicates and delete-duplicates ++return a sequence of the same type as ++sequence with enough elements removed so that no two of the remaining ++elements match. The order of the elements remaining in the result ++is the same as the order in which they appear in sequence. ++

++

remove-duplicates returns a sequence ++that may share ++with sequence or may be identical to sequence ++if no elements need to be removed. ++

++

delete-duplicates, when sequence is a list, ++is permitted to setf any part, car or cdr, ++of the top-level list structure in that sequence. ++When sequence is a vector, delete-duplicates ++is permitted to change the dimensions of the vector ++and to slide its elements into new positions without ++permuting them to produce the resulting vector. ++

++

Examples::

++ ++
++
 (remove-duplicates "aBcDAbCd" :test #'char-equal :from-end t) ⇒  "aBcD"
++ (remove-duplicates '(a b c b d d e)) ⇒  (A C B D E)
++ (remove-duplicates '(a b c b d d e) :from-end t) ⇒  (A B C D E)
++ (remove-duplicates '((foo #\a) (bar #\%) (baz #\A))
++     :test #'char-equal :key #'cadr) ⇒  ((BAR #\%) (BAZ #\A))
++ (remove-duplicates '((foo #\a) (bar #\%) (baz #\A)) 
++     :test #'char-equal :key #'cadr :from-end t) ⇒  ((FOO #\a) (BAR #\%))
++ (setq tester (list 0 1 2 3 4 5 6))
++ (delete-duplicates tester :key #'oddp :start 1 :end 6) ⇒  (0 4 5 6)
++
++ ++

Side Effects::

++ ++

delete-duplicates might destructively modify sequence. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++

These functions are useful for converting sequence into a canonical ++form suitable for representing a set. ++

++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/remove_002dmethod.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++remove-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.18 remove-method [Standard Generic Function]

++ ++

Syntax::

++ ++

remove-method generic-function methodgeneric-function ++

++

Method Signatures::

++ ++

remove-method (generic-function standard-generic-function) ++ method ++

++

Arguments and Values::

++ ++

generic-function—a generic function. ++

++

method—a method. ++

++

Description::

++ ++

The generic function remove-method removes a method from generic-function ++by modifying the generic-function (if necessary). ++

++

remove-method must not signal an error if the method ++is not one of the methods on the generic-function. ++

++

See Also::

++ ++

find-method ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/remprop.html +@@ -0,0 +1,143 @@ ++ ++ ++ ++ ++ ++remprop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.16 remprop [Function]

++ ++

remprop symbol indicatorgeneralized-boolean ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

indicator—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

remprop removes from the property list_2 of symbol ++a property_1 with a property indicator ++identical to indicator. ++

++

If there are multiple properties_1 with the identical key, ++remprop only removes the first such property. ++

++

remprop returns false if no such property was found, ++or true if a property was found. ++

++

The property indicator ++and the corresponding property value ++are removed in an undefined order ++by destructively splicing the property list. ++

++

The permissible side-effects correspond to those permitted for remf, ++such that: ++

++
++
 (remprop x y) ≡ (remf (symbol-plist x) y)
++
++ ++

Examples::

++ ++
++
 (setq test (make-symbol "PSEUDO-PI")) ⇒  #:PSEUDO-PI
++ (symbol-plist test) ⇒  ()
++ (setf (get test 'constant) t) ⇒  T
++ (setf (get test 'approximation) 3.14) ⇒  3.14
++ (setf (get test 'error-range) 'noticeable) ⇒  NOTICEABLE
++ (symbol-plist test) 
++⇒  (ERROR-RANGE NOTICEABLE APPROXIMATION 3.14 CONSTANT T)
++ (setf (get test 'approximation) nil) ⇒  NIL
++ (symbol-plist test) 
++⇒  (ERROR-RANGE NOTICEABLE APPROXIMATION NIL CONSTANT T)
++ (get test 'approximation) ⇒  NIL
++ (remprop test 'approximation) ⇒  true
++ (get test 'approximation) ⇒  NIL
++ (symbol-plist test)
++⇒  (ERROR-RANGE NOTICEABLE CONSTANT T)
++ (remprop test 'approximation) ⇒  NIL
++ (symbol-plist test)
++⇒  (ERROR-RANGE NOTICEABLE CONSTANT T)
++ (remprop test 'error-range) ⇒  true
++ (setf (get test 'approximation) 3) ⇒  3
++ (symbol-plist test)
++⇒  (APPROXIMATION 3 CONSTANT T)
++
++ ++

Side Effects::

++ ++

The property list of symbol is modified. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

remf ++, ++symbol-plist ++

++

Notes::

++ ++

Numbers and characters are not recommended for use as ++indicators in portable code since remprop tests with ++eq rather than eql, and consequently the effect of ++using such indicators is implementation-dependent. ++Of course, if you’ve gotten as far as needing to remove such a ++property, you don’t have much choice—the time to have been ++thinking about this was when you used setf of get to ++establish the property. ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rename_002dfile.html +@@ -0,0 +1,131 @@ ++ ++ ++ ++ ++ ++rename-file (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.7 rename-file [Function]

++ ++

rename-file filespec new-namedefaulted-new-name, old-truename, new-truename ++

++

Arguments and Values::

++ ++

filespec—a pathname designator. ++

++

new-name—a pathname designator ++other than a stream. ++

++

defaulted-new-name—a pathname ++

++

old-truename—a physical pathname. ++

++

new-truename—a physical pathname. ++

++

Description::

++ ++

rename-file modifies the file system in such a way ++that the file indicated by filespec is renamed to ++defaulted-new-name. ++

++

It is an error to specify a filename containing a wild component, ++for filespec to contain a nil component where the file system does ++not permit a nil component, or for the result of defaulting missing ++components of new-name from filespec to contain a nil component ++where the file system does not permit a nil component. ++

++

If new-name is a logical pathname, ++rename-file returns a logical pathname as its primary value. ++

++

rename-file ++returns three values if successful. The primary value, defaulted-new-name, ++is the resulting name which is composed of ++new-name with any missing components filled in by performing ++a merge-pathnames operation using filespec as the defaults. ++The secondary value, old-truename, ++is the truename of the file before it was renamed. ++The tertiary value, new-truename, ++is the truename of the file after it was renamed. ++

++

If the filespec designator is an open stream, ++then the stream itself and the file associated with it are ++affected (if the file system permits). ++

++

Examples::

++ ++
++
;; An example involving logical pathnames.
++ (with-open-file (stream "sys:chemistry;lead.text"
++                         :direction :output :if-exists :error)
++   (princ "eureka" stream)
++   (values (pathname stream) (truename stream)))
++⇒  #P"SYS:CHEMISTRY;LEAD.TEXT.NEWEST", #P"Q:>sys>chem>lead.text.1"
++ (rename-file "sys:chemistry;lead.text" "gold.text")
++⇒  #P"SYS:CHEMISTRY;GOLD.TEXT.NEWEST",
++   #P"Q:>sys>chem>lead.text.1",
++   #P"Q:>sys>chem>gold.text.1"
++
++ ++

Exceptional Situations::

++ ++

If the renaming operation is not successful, an error of type file-error is signaled. ++

++

An error of type file-error might be signaled if filespec is wild. ++

++

See Also::

++ ++

truename ++, ++pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++
++

++Next: , Previous: , Up: Files Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rename_002dpackage.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++rename-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.8 rename-package [Function]

++ ++

rename-package package new-name &optional new-nicknamespackage-object ++

++

Arguments and Values::

++ ++

package—a package designator. ++

++

new-name—a package designator. ++

++

new-nicknames—a list of string designators. ++ The default is the empty list. ++

++

package-object—the renamed package object. ++

++

Description::

++ ++

Replaces the name and nicknames of package. ++The old name and all of the old nicknames of package are eliminated ++and are replaced by new-name and new-nicknames. ++

++

The consequences are undefined if new-name or any new-nickname ++conflicts with any existing package names. ++

++

Examples::

++ ++
++
 (make-package 'temporary :nicknames '("TEMP")) ⇒  #<PACKAGE "TEMPORARY">
++ (rename-package 'temp 'ephemeral) ⇒  #<PACKAGE "EPHEMERAL">
++ (package-nicknames (find-package 'ephemeral)) ⇒  ()
++ (find-package 'temporary) ⇒  NIL
++ (rename-package 'ephemeral 'temporary '(temp fleeting))
++⇒  #<PACKAGE "TEMPORARY">
++ (package-nicknames (find-package 'temp)) ⇒  ("TEMP" "FLEETING")
++
++ ++

See Also::

++ ++

make-package ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/replace.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++replace (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.18 replace [Function]

++ ++

replace sequence-1 sequence-2 &key start1 end1 start2 end2sequence-1 ++

++

Arguments and Values::

++ ++

sequence-1—a sequence. ++

++

sequence-2—a sequence. ++

++

start1, end1bounding index designators of sequence-1. ++ The defaults for start1 and end1 are 0 and nil, respectively. ++

++

start2, end2bounding index designators of sequence-2. ++ The defaults for start2 and end2 are 0 and nil, respectively. ++

++

Description::

++ ++

Destructively modifies sequence-1 ++by replacing the elements of subsequence-1 ++ bounded by start1 and end1 ++with the elements of subsequence-2 ++ bounded by start2 and end2. ++

++

Sequence-1 is destructively modified by copying successive ++elements into it from sequence-2. ++Elements of the subsequence of sequence-2 ++bounded by start2 and end2 ++are copied into the subsequence of sequence-1 ++bounded by start1 and end1. ++If these subsequences are not of the same length, ++then the shorter length determines how many elements are copied; ++the extra elements near the end of the longer subsequence ++are not involved in the operation. ++The number of elements copied can be expressed as: ++

++
++
 (min (- end1 start1) (- end2 start2))
++
++ ++

If sequence-1 and sequence-2 are the same object ++and the region being modified overlaps the region being copied ++from, then it is as if the entire source region were copied to another ++place and only then copied back into the target region. ++However, if sequence-1 and sequence-2 are not the same, ++but the region being modified overlaps the region being copied from ++(perhaps because of shared list structure or displaced arrays), ++then after the replace operation ++the subsequence of sequence-1 being modified will have ++unpredictable contents. ++It is an error if the elements of sequence-2 are not of a ++type that can be stored into sequence-1. ++

++

Examples::

++
++
 (replace "abcdefghij" "0123456789" :start1 4 :end1 7 :start2 4) 
++⇒  "abcd456hij"
++ (setq lst "012345678") ⇒  "012345678"
++ (replace lst lst :start1 2 :start2 0) ⇒  "010123456"
++ lst ⇒  "010123456"
++
++ ++

Side Effects::

++ ++

The sequence-1 is modified. ++

++

See Also::

++ ++

fill ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rest.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++rest (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.32 rest [Accessor]

++ ++

rest listtail ++

++

(setf ( rest list) new-tail)
++

++

Arguments and Values::

++ ++

list—a list, ++

++

which might be a dotted list or a circular list. ++

++

tail—an object. ++

++

Description::

++ ++

rest performs the same operation as cdr, ++but mnemonically complements first. ++Specifically, ++

++
++
 (rest list) ≡ (cdr list)
++ (setf (rest list) new-tail) ≡ (setf (cdr list) new-tail)
++
++ ++

Examples::

++ ++
++
 (rest '(1 2)) ⇒  (2)
++ (rest '(1 . 2)) ⇒  2
++ (rest '(1)) ⇒  NIL
++ (setq *cons* '(1 . 2)) ⇒  (1 . 2)
++ (setf (rest *cons*) "two") ⇒  "two"
++ *cons* ⇒  (1 . "two")
++
++ ++

See Also::

++ ++

cdr, ++nthcdr ++

++

Notes::

++ ++

rest is often preferred stylistically over cdr ++when the argument is to being subjectively viewed as a list ++rather than as a cons. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/restart.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++restart (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.31 restart [System Class]

++ ++

Class Precedence List::

++

restart, ++t ++

++

Description::

++ ++

An object of type restart represents a function that can be ++called to perform some form of recovery action, usually a transfer of control ++to an outer point in the running program. ++

++

An implementation is free to implement a restart in whatever ++manner is most convenient; a restart has only dynamic extent ++relative to the scope of the binding form which establishes it. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/restart_002dbind.html +@@ -0,0 +1,171 @@ ++ ++ ++ ++ ++ ++restart-bind (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.36 restart-bind [Macro]

++ ++

restart-bind ({(name function ++ {!key-val-pair}*)}) ++ {form}*
++ ⇒ {result}* ++

++

key-val-pair ::=:interactive-function interactive-function |  ++                 :report-function report-function |  ++                 :test-function test-function ++

++

Arguments and Values::

++ ++

name—a symbol; not evaluated. ++

++

function—a form; evaluated. ++

++

forms—an implicit progn. ++

++

interactive-function—a form; evaluated. ++

++

report-function—a form; evaluated. ++

++

test-function—a form; evaluated. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

restart-bind executes the body of forms ++in a dynamic environment where restarts with the given names are in effect. ++

++

If a name is nil, it indicates an anonymous restart; ++if a name is a non-nil symbol, it indicates a named restart. ++

++

The function, interactive-function, and report-function ++are unconditionally evaluated in the current lexical and dynamic environment ++prior to evaluation of the body. Each of these forms must evaluate to ++a function. ++

++

If invoke-restart is done on that restart, ++the function which resulted from evaluating function ++is called, in the dynamic environment of the invoke-restart, ++with the arguments given to invoke-restart. ++The function may either perform a non-local transfer of control or may return normally. ++

++

If the restart is invoked interactively from the debugger ++(using invoke-restart-interactively), ++the arguments are defaulted by calling the function ++which resulted from evaluating interactive-function. ++That function may optionally prompt interactively on query I/O, ++and should return a list of arguments to be used by ++invoke-restart-interactively when invoking the restart. ++

++

If a restart is invoked interactively but no interactive-function is used, ++then an argument list of nil is used. In that case, the function ++must be compatible with an empty argument list. ++

++

If the restart is presented interactively (e.g., by the debugger), ++the presentation is done by calling the function which resulted ++from evaluating report-function. ++This function must be a function of one argument, a stream. ++It is expected to print a description of the action that the restart takes ++to that stream. ++This function is called any time the restart is printed ++while *print-escape* is nil. ++

++

In the case of interactive invocation, ++the result is dependent on the value of :interactive-function ++as follows. ++

++
++
:interactive-function
++

Value is evaluated in the current lexical environment and ++ should return a function of no arguments which constructs a ++ list of arguments to be used by invoke-restart-interactively ++ when invoking this restart. The function may prompt interactively ++ using query I/O if necessary. ++

++
++
:report-function
++

Value is evaluated in the current lexical environment and ++ should return a function of one argument, a stream, which ++ prints on the stream a summary of the action that this restart ++ takes. This function is called whenever the restart is ++ reported (printed while *print-escape* is nil). ++ If no :report-function option is provided, the manner in which the ++ restart is reported is implementation-dependent. ++

++
++
:test-function
++

Value is evaluated in the current lexical environment and ++ should return a function of one argument, a condition, which ++ returns true if the restart is to be considered visible. ++

++
++
++ ++

Affected By::

++ ++

*query-io*. ++

++

See Also::

++ ++

restart-case ++, ++with-simple-restart ++

++

Notes::

++ ++

restart-bind is primarily intended to be used to implement ++restart-case and might be useful in implementing other ++macros. Programmers who are uncertain about whether to use restart-case ++or restart-bind should prefer restart-case for the cases where ++it is powerful enough, using restart-bind only in cases where its full ++generality is really needed. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/restart_002dcase.html +@@ -0,0 +1,332 @@ ++ ++ ++ ++ ++ ++restart-case (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.37 restart-case [Macro]

++ ++

restart-case restartable-form {!clause}{result}* ++

++

clause ::=( case-name lambda-list  ++            [[:interactive interactive-expression | :report report-expression | :test test-expression]]  ++            {declaration}* {form}*) ++

++

Arguments and Values::

++ ++

restartable-form—a form. ++

++

case-name—a symbol or nil. ++

++

lambda-list—an ordinary lambda list. ++

++

interactive-expression—a symbol or a lambda expression. ++

++

report-expression—a string, ++ a symbol, ++ or a lambda expression. ++

++

test-expression—a symbol or a lambda expression. ++

++

declaration—a declare expression; not evaluated. ++

++

form—a form. ++

++

results—the values resulting from the evaluation ++ of restartable-form, ++ or the values returned by the last form ++ executed in a chosen clause, ++ or nil. ++

++

Description::

++ ++

restart-case evaluates restartable-form in a dynamic environment ++where the clauses have special meanings as points to which control may be transferred. ++If restartable-form finishes executing and returns any values, ++all values returned are returned by restart-case and ++processing has completed. While restartable-form is executing, any code may ++ transfer control to one of the clauses (see invoke-restart). ++If a transfer ++ occurs, the forms in the body of that clause is evaluated and any values ++ returned by the last such form are returned by ++restart-case. ++In this case, the ++dynamic state is unwound appropriately (so that the restarts established ++around the restartable-form are no longer active) prior to execution of the ++clause. ++

++

If there are no forms ++in a selected clause, restart-case returns nil. ++

++

If case-name is a symbol, it names this restart. ++

++

It is possible to have more than one clause use the same case-name. ++In this case, the first clause with that name is found by find-restart. ++The other clauses are accessible using compute-restarts. ++

++

Each arglist is an ordinary lambda list to be bound during the ++execution of its corresponding forms. These parameters are used ++by the restart-case clause to receive any necessary data from a call ++to invoke-restart. ++

++

By default, invoke-restart-interactively passes no arguments and ++all arguments must be optional in order to accomodate interactive ++restarting. However, the arguments need not be optional if the ++:interactive ++keyword has been used to inform invoke-restart-interactively ++ about how to compute a proper argument list. ++

++

Keyword options have the following meaning. ++

++
:interactive
++

The value supplied by :interactive value ++must be a suitable argument to function. ++(function value) is evaluated in the current lexical ++ environment. It should return a function of no arguments which ++ returns arguments to be used by ++invoke-restart-interactively when it is invoked. ++invoke-restart-interactively ++is called in the dynamic ++ environment available prior to any restart attempt, and uses ++query I/O for user interaction. ++

++

If a restart is invoked interactively but no :interactive option ++ was supplied, the argument list used in the invocation is the empty ++ list. ++

++
++
:report
++

If the value supplied by :report value ++is a lambda expression or a symbol, it ++must be acceptable to function. ++(function value) is evaluated in the current lexical ++environment. It should return a function of one ++argument, a stream, which prints on the stream a ++description of the restart. This function is called ++whenever the restart is printed while *print-escape* is nil. ++

++

If value is a string, it is a shorthand for ++

++
++
 (lambda (stream) (write-string value stream))
++
++ ++

If a named restart is asked to report but no report information has been ++ supplied, the name of the restart is used in generating default report text. ++

++

When *print-escape* is nil, the ++printer uses the report information for ++ a restart. For example, a debugger might announce the action of typing ++ a “continue” command by: ++

++
++
 (format t "~&~S -- ~A~
++
++ ++

which might then display as something like: ++

++
++
 :CONTINUE -- Return to command level
++
++ ++

The consequences are unspecified if an unnamed restart is specified ++but no :report option is provided. ++

++
++
:test
++

The value supplied by :test value ++must be a suitable argument to function. ++(function value) is evaluated in the current lexical ++ environment. It should return a function of one argument, the ++condition, that ++returns true if the restart is to be considered visible. ++

++

The default for this option is equivalent to (lambda (c) (declare (ignore c)) t). ++

++
++
++ ++

If the restartable-form is a list whose car is any of ++the symbols signal, error, cerror, ++or warn (or is a macro form which macroexpands into such a ++list), then with-condition-restarts is used implicitly ++to associate the indicated restarts with the condition to be ++signaled. ++

++

Examples::

++ ++
++
 (restart-case
++     (handler-bind ((error #'(lambda (c)
++                             (declare (ignore condition))
++                             (invoke-restart 'my-restart 7))))
++       (error "Foo."))
++   (my-restart (&optional v) v))
++⇒  7
++
++ (define-condition food-error (error) ())
++⇒  FOOD-ERROR
++ (define-condition bad-tasting-sundae (food-error) 
++   ((ice-cream :initarg :ice-cream :reader bad-tasting-sundae-ice-cream)
++    (sauce :initarg :sauce :reader bad-tasting-sundae-sauce)
++    (topping :initarg :topping :reader bad-tasting-sundae-topping))
++   (:report (lambda (condition stream)
++              (format stream "Bad tasting sundae with ~S, ~S, and ~S"
++                      (bad-tasting-sundae-ice-cream condition)
++                      (bad-tasting-sundae-sauce condition)
++                      (bad-tasting-sundae-topping condition)))))
++⇒  BAD-TASTING-SUNDAE
++ (defun all-start-with-same-letter (symbol1 symbol2 symbol3)
++   (let ((first-letter (char (symbol-name symbol1) 0)))
++     (and (eql first-letter (char (symbol-name symbol2) 0))
++          (eql first-letter (char (symbol-name symbol3) 0)))))
++⇒  ALL-START-WITH-SAME-LETTER
++ (defun read-new-value ()
++   (format t "Enter a new value: ")
++   (multiple-value-list (eval (read))))
++⇒  READ-NEW-VALUE
++
 (defun verify-or-fix-perfect-sundae (ice-cream sauce topping)
++   (do ()
++      ((all-start-with-same-letter ice-cream sauce topping))
++     (restart-case
++       (error 'bad-tasting-sundae
++              :ice-cream ice-cream
++              :sauce sauce
++              :topping topping)
++       (use-new-ice-cream (new-ice-cream)
++         :report "Use a new ice cream."
++         :interactive read-new-value  
++         (setq ice-cream new-ice-cream))
++       (use-new-sauce (new-sauce)
++         :report "Use a new sauce."
++         :interactive read-new-value
++         (setq sauce new-sauce))
++       (use-new-topping (new-topping)
++         :report "Use a new topping."
++         :interactive read-new-value
++         (setq topping new-topping))))
++   (values ice-cream sauce topping))
++⇒  VERIFY-OR-FIX-PERFECT-SUNDAE
++ (verify-or-fix-perfect-sundae 'vanilla 'caramel 'cherry)
++ |>  Error: Bad tasting sundae with VANILLA, CARAMEL, and CHERRY.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Use a new ice cream.
++ |>   2: Use a new sauce.
++ |>   3: Use a new topping.
++ |>   4: Return to Lisp Toplevel.
++ |>  Debug> |>>:continue 1<<|
++ |>  Use a new ice cream.
++ |>  Enter a new ice cream: |>>'chocolate<<|
++⇒  CHOCOLATE, CARAMEL, CHERRY
++
++ ++

See Also::

++ ++

restart-bind ++, ++with-simple-restart ++. ++

++

Notes::

++ ++
++
 (restart-case expression
++    (name1 arglist1 ...options1... . body1)
++    (name2 arglist2 ...options2... . body2))
++
++ ++

is essentially equivalent to ++

++
++
 (block #1=#:g0001
++   (let ((#2=#:g0002 nil))
++        (tagbody
++        (restart-bind ((name1 #'(lambda (&rest temp)
++                                (setq #2# temp)
++                                (go #3=#:g0003))
++                          ...slightly-transformed-options1...)
++                       (name2 #'(lambda (&rest temp)
++                                (setq #2# temp)
++                                (go #4=#:g0004))
++                          ...slightly-transformed-options2...))
++        (return-from #1# expression))
++          #3# (return-from #1#
++                  (apply #'(lambda arglist1 . body1) #2#))
++          #4# (return-from #1#
++                  (apply #'(lambda arglist2 . body2) #2#)))))
++
++ ++

Unnamed restarts are generally only useful interactively ++ and an interactive option which has no description is of little value. ++ Implementations are encouraged to warn if ++an unnamed restart is used and no report information ++ is provided ++at compilation time. ++At runtime, this error might be noticed when entering ++ the debugger. Since signaling an error would probably cause recursive ++ entry into the debugger (causing yet another recursive error, etc.) it is ++ suggested that the debugger print some indication of such problems when ++ they occur but not actually signal errors. ++

++
++
 (restart-case (signal fred)
++   (a ...)
++   (b ...))
++ ≡
++ (restart-case
++     (with-condition-restarts fred 
++                              (list (find-restart 'a) 
++                                    (find-restart 'b))
++       (signal fred))
++   (a ...)
++   (b ...))
++
++ ++
++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/restart_002dname.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++restart-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.38 restart-name [Function]

++ ++

restart-name restartname ++

++

Arguments and Values::

++ ++

restart—a restart. ++

++

name—a symbol. ++

++

Description::

++ ++

Returns the name of the restart, ++or nil if the restart is not named. ++

++

Examples::

++ ++
++
 (restart-case 
++     (loop for restart in (compute-restarts)
++               collect (restart-name restart))
++   (case1 () :report "Return 1." 1)
++   (nil   () :report "Return 2." 2)
++   (case3 () :report "Return 3." 3)
++   (case1 () :report "Return 4." 4))
++⇒  (CASE1 NIL CASE3 CASE1 ABORT)
++ ;; In the example above the restart named ABORT was not created
++ ;; explicitly, but was implicitly supplied by the system.
++
++ ++

See Also::

++ ++

compute-restarts ++

++

find-restart ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/return.html +@@ -0,0 +1,92 @@ ++ ++ ++ ++ ++ ++return (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.26 return [Macro]

++ ++

return [result] ⇒ #<NoValue> ++

++

Arguments and Values::

++ ++

result—a form; evaluated. ++ The default is nil. ++

++

Description::

++ ++

Returns, as if by return-from, from the block named nil. ++

++

Examples::

++ ++
++
 (block nil (return) 1) ⇒  NIL
++ (block nil (return 1) 2) ⇒  1
++ (block nil (return (values 1 2)) 3) ⇒  1, 2
++ (block nil (block alpha (return 1) 2)) ⇒  1
++ (block alpha (block nil (return 1)) 2) ⇒  2
++ (block nil (block nil (return 1) 2)) ⇒  1
++
++ ++

See Also::

++ ++

block ++, ++return-from ++, ++Evaluation ++

++

Notes::

++ ++
++
 (return) ≡ (return-from nil)
++ (return form) ≡ (return-from nil form)
++
++ ++

The implicit blocks established by macros such as do ++are often named nil, so that return can be used to exit from ++such forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/return_002dfrom.html +@@ -0,0 +1,141 @@ ++ ++ ++ ++ ++ ++return-from (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.25 return-from [Special Operator]

++ ++

return-from name [result] ++ ⇒ #<NoValue> ++

Arguments and Values::

++ ++

name—a block tag; not evaluated. ++

++

result—a form; evaluated. ++ The default is nil. ++

++

Description::

++ ++

Returns control and multiple values_2 from a lexically enclosing block. ++

++

A block form named name must lexically enclose ++the occurrence of return-from; any values yielded ++by the evaluation of result are immediately returned from ++the innermost such lexically enclosing block. ++

++

The transfer of control initiated by return-from is performed ++as described in Transfer of Control to an Exit Point. ++

++

Examples::

++ ++
++
 (block alpha (return-from alpha) 1) ⇒  NIL
++ (block alpha (return-from alpha 1) 2) ⇒  1
++ (block alpha (return-from alpha (values 1 2)) 3) ⇒  1, 2
++ (let ((a 0))
++    (dotimes (i 10) (incf a) (when (oddp i) (return)))
++    a) ⇒  2
++ (defun temp (x)
++    (if x (return-from temp 'dummy))
++    44) ⇒  TEMP
++ (temp nil) ⇒  44
++ (temp t) ⇒  DUMMY
++ (block out
++   (flet ((exit (n) (return-from out n)))
++     (block out (exit 1)))
++   2) ⇒  1
++ (block nil   
++   (unwind-protect (return-from nil 1)
++     (return-from nil 2)))
++⇒  2
++ (dolist (flag '(nil t))
++   (block nil
++     (let ((x 5))
++       (declare (special x))
++       (unwind-protect (return-from nil)
++         (print x))))
++   (print 'here))
++ |>  5
++ |>  HERE
++ |>  5
++ |>  HERE
++⇒  NIL
++ (dolist (flag '(nil t))
++   (block nil
++     (let ((x 5))
++       (declare (special x))
++       (unwind-protect
++           (if flag (return-from nil))
++         (print x))))
++   (print 'here))
++ |>  5
++ |>  HERE
++ |>  5
++ |>  HERE
++⇒  NIL
++
++ ++

The following has undefined consequences because the block form ++exits normally before the return-from form is attempted. ++

++
++
 (funcall (block nil #'(lambda () (return-from nil)))) is an error.
++
++ ++

See Also::

++ ++

block ++, ++return ++, ++Evaluation ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/revappend.html +@@ -0,0 +1,141 @@ ++ ++ ++ ++ ++ ++revappend (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.27 revappend, nreconc [Function]

++ ++

revappend list tailresult-list ++

++

nreconc list tailresult-list ++

++

Arguments and Values::

++ ++

list—a proper list. ++

++

tail—an object. ++

++

result-list—an object. ++

++

Description::

++ ++

revappend constructs a copy_2 of list, ++but with the elements in reverse order. It then appends (as if ++by nconc) the tail to that reversed list and returns the result. ++

++

nreconc reverses the order of elements in list ++(as if by nreverse). It then appends (as if by nconc) ++the tail to that reversed list and returns the result. ++

++

The resulting list shares list structure with tail. ++

++

Examples::

++ ++
++
 (let ((list-1 (list 1 2 3))
++       (list-2 (list 'a 'b 'c)))
++   (print (revappend list-1 list-2))
++   (print (equal list-1 '(1 2 3)))
++   (print (equal list-2 '(a b c))))
++ |>  (3 2 1 A B C) 
++ |>  T
++ |>  T
++⇒  T
++
++ (revappend '(1 2 3) '()) ⇒  (3 2 1)
++ (revappend '(1 2 3) '(a . b)) ⇒  (3 2 1 A . B)
++ (revappend '() '(a b c)) ⇒  (A B C)
++ (revappend '(1 2 3) 'a) ⇒  (3 2 1 . A)
++ (revappend '() 'a) ⇒  A   ;degenerate case
++
++ (let ((list-1 '(1 2 3))
++       (list-2 '(a b c)))
++   (print (nreconc list-1 list-2))
++   (print (equal list-1 '(1 2 3)))
++   (print (equal list-2 '(a b c))))
++ |>  (3 2 1 A B C) 
++ |>  NIL
++ |>  T
++⇒  T
++
++
++ ++

Side Effects::

++ ++

revappend does not modify either of its arguments. ++nreconc is permitted to modify list but not tail. ++

++

Although it might be implemented differently, ++nreconc is constrained to have side-effect behavior equivalent to: ++

++
++
 (nconc (nreverse list) tail)
++
++ ++

See Also::

++ ++

reverse ++, ++nreverse, ++nconc ++

++

Notes::

++ ++

The following functional equivalences are true, ++although good implementations will typically use a faster algorithm for ++achieving the same effect: ++

++
++
 (revappend list tail) ≡ (nconc (reverse list) tail)
++ (nreconc list tail) ≡ (nconc (nreverse list) tail)
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/reverse.html +@@ -0,0 +1,122 @@ ++ ++ ++ ++ ++ ++reverse (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.12 reverse, nreverse [Function]

++ ++

reverse sequencereversed-sequence ++

++

nreverse sequencereversed-sequence ++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

reversed-sequence—a sequence. ++

++

Description::

++ ++

reverse and nreverse return a new sequence ++of the same kind as sequence, containing the same elements, ++but in reverse order. ++

++

reverse and nreverse differ in that reverse ++always creates and returns a new sequence, whereas nreverse ++might modify and return the given sequence. reverse never ++modifies the given sequence. ++

++

For reverse, if sequence is a vector, ++the result is a fresh simple array of rank one ++that has the same actual array element type as sequence. ++If sequence is a list, the result is a fresh list. ++

++

For nreverse, if sequence is a vector, ++the result is a vector ++that has the same actual array element type as sequence. ++If sequence is a list, the result is a list. ++

++

For nreverse, ++sequence might be destroyed and re-used to produce the result. ++The result might or might not be identical to sequence. ++

++

Specifically, when sequence is a list, ++nreverse is permitted to setf any part, car or cdr, ++of any cons that is part of the list structure of sequence. ++When sequence is a vector, ++nreverse is permitted to re-order the elements of sequence ++in order to produce the resulting vector. ++

++

Examples::

++
++
 (setq str "abc") ⇒  "abc"
++ (reverse str) ⇒  "cba"
++ str ⇒  "abc"
++ (setq str (copy-seq str)) ⇒  "abc"
++ (nreverse str) ⇒  "cba"
++ str ⇒  implementation-dependent
++ (setq l (list 1 2 3)) ⇒  (1 2 3)
++ (nreverse l) ⇒  (3 2 1)
++ l ⇒  implementation-dependent
++
++ ++

Side Effects::

++ ++

nreverse might either create a new sequence, ++modify the argument sequence, or both. ++(reverse does not modify sequence.) ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/room.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++room (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.16 room [Function]

++ ++

room &optional ximplementation-dependent ++

++

Arguments and Values::

++ ++

x—one of t, nil, or :default. ++

++

Description::

++ ++

room prints, to standard output, ++information about the state of internal storage and its management. ++This might include descriptions of the amount of memory in use and ++the degree of memory compaction, possibly broken down by internal data type if that ++is appropriate. The nature and format of the printed information is ++implementation-dependent. ++The intent is to provide information that a programmer ++might use to tune a program for a particular implementation. ++

++

(room nil) prints out a minimal amount of information. ++(room t) prints out a maximal amount of information. ++

++

(room) or (room :default) prints out an intermediate amount ++of information that is likely to be useful. ++

++

Side Effects::

++ ++

Output to standard output. ++

++

Affected By::

++ ++

*standard-output*. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rotatef.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++rotatef (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.66 rotatef [Macro]

++ ++

rotatef {place}*nil ++

++

Arguments and Values::

++ ++

place—a place. ++

++

Description::

++ ++

rotatef modifies the values of each place by ++rotating values from one place into another. ++

++

If a place produces more values than there ++are store variables, the extra values are ignored. If a place ++produces fewer values than there are store variables, the missing values ++are set to nil. ++

++

In the form (rotatef place1 place2 ... placen), ++the values in place1 through placen are read and written. ++Values 2 through n ++and value 1 are then stored into place1 through placen. ++It is as if all the places form an end-around shift register ++that is rotated one place to the left, with the value of place1 ++being shifted around the end to placen. ++

++

For information about the evaluation of subforms of places, ++see Evaluation of Subforms to Places. ++

++

Examples::

++
++
 (let ((n 0)
++        (x (list 'a 'b 'c 'd 'e 'f 'g)))
++    (rotatef (nth (incf n) x)
++             (nth (incf n) x)
++             (nth (incf n) x))
++    x) ⇒  (A C D B E F G)
++
++ ++

See Also::

++ ++

define-setf-expander ++, ++defsetf ++, ++setf ++, ++shiftf ++, ++*macroexpand-hook*, ++Generalized Reference ++

++

Notes::

++ ++

The effect of ++ (rotatef place1 place2 ... placen) ++is roughly equivalent to ++

++
++
 (psetf place1 place2
++        place2 place3
++        ...
++        placen place1)
++
++ ++

except that the latter would evaluate any subforms ++of each place twice, whereas rotatef evaluates them once. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/row_002dmajor_002daref.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++row-major-aref (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

15.2.22 row-major-aref [Accessor]

++ ++

row-major-aref array indexelement ++

++

(setf ( row-major-aref array index) new-element)
++

++

Arguments and Values::

++ ++

array—an array. ++

++

index—a valid array row-major index for the array. ++

++

element, new-element—an object. ++

++

Description::

++ ++

Considers array as a vector by viewing its elements ++in row-major order, and returns the element of that vector ++which is referred to by the given index. ++

++

row-major-aref is valid for use with setf. ++

++

See Also::

++ ++

aref ++, ++array-row-major-index ++

++

Notes::

++ ++
++
 (row-major-aref array index) ≡
++   (aref (make-array (array-total-size array)
++                     :displaced-to array
++                     :element-type (array-element-type array))
++         index)
++
++ (aref array i1 i2 ...) ≡
++     (row-major-aref array (array-row-major-index array i1 i2))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/rplaca.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++rplaca (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.8 rplaca, rplacd [Function]

++ ++

rplaca cons objectcons ++

++

rplacd cons objectcons ++

++

Pronunciation::

++ ++

rplaca: pronounced ,r\=e ’plak e ++ or pronounced ,re ’plak e ++

++

rplacd: pronounced ,r\=e ’plak de ++ or pronounced ,re ’plak de ++ or pronounced ,r\=e ’plak d\=e ++ or pronounced ,re ’plak d\=e ++

++

Arguments and Values::

++ ++

cons—a cons. ++

++

object—an object. ++

++

Description::

++ ++

rplaca replaces the car of the cons with object. ++

++

rplacd replaces the cdr of the cons with object. ++

++

Examples::

++
++
 (defparameter *some-list* (list* 'one 'two 'three 'four)) ⇒  *some-list*
++ *some-list* ⇒  (ONE TWO THREE . FOUR)
++ (rplaca *some-list* 'uno) ⇒  (UNO TWO THREE . FOUR)
++ *some-list* ⇒  (UNO TWO THREE . FOUR)
++ (rplacd (last *some-list*) (list 'IV)) ⇒  (THREE IV)
++ *some-list* ⇒  (UNO TWO THREE IV)
++
++ ++

Side Effects::

++ ++

The cons is modified. ++

++

Should signal an error of type type-error ++ if cons is not a cons. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/satisfies.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++satisfies (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.17 satisfies [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Predicating. ++

++

Compound Type Specifier Syntax::

++ ++

(satisfies{predicate-name}) ++

++

Compound Type Specifier Arguments::

++ ++

predicate-name—a symbol. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of all objects that satisfy the ++predicate predicate-name, which must be a symbol ++whose global function definition is a one-argument ++predicate. A name is required for predicate-name; ++lambda expressions are not allowed. ++For example, the type specifier (and integer (satisfies evenp)) ++denotes the set of all even integers. ++The form (typep x '(satisfies p)) is equivalent to ++(if (p x) t nil). ++

++

The argument is required. ++The symbol * can be the argument, but it ++denotes itself (the symbol *), ++and does not represent an unspecified value. ++

++

The symbol satisfies is not valid as a type specifier. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/search.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++search (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.16 search [Function]

++ ++

search sequence-1 sequence-2 ++ &key from-end test test-not ++ key start1 start2 ++ end1 end2
++ ⇒ position ++

++

Arguments and Values::

++ ++

Sequence-1—a sequence. ++

++

Sequence-2—a sequence. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

start1, end1bounding index designators of sequence-1. ++ The defaults for start1 and end1 are 0 and nil, respectively. ++

++

start2, end2bounding index designators of sequence-2. ++ The defaults for start2 and end2 are 0 and nil, respectively. ++

++

position—a bounding index of sequence-2, ++ or nil. ++

++

Description::

++ ++

Searches sequence-2 for a subsequence that matches sequence-1. ++

++

The implementation may choose to search sequence-2 in any order; ++there is no guarantee on the number of times the test is made. ++For example, ++when start-end is true, ++the sequence might actually be searched from left to right ++instead of from right to left (but in either case would return ++the rightmost matching subsequence). ++If the search succeeds, ++search returns the offset into sequence-2 ++of the first element of the leftmost or rightmost matching subsequence, ++depending on from-end; ++otherwise search returns nil. ++

++

If from-end is true, the index of the leftmost ++element of the rightmost matching subsequence is returned. ++

++

Examples::

++
++
 (search "dog" "it's a dog's life") ⇒  7
++ (search '(0 1) '(2 4 6 1 3 5) :key #'oddp) ⇒  2
++
++ ++

See Also::

++ ++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sequence.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++sequence (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.1 sequence [System Class]

++ ++

Class Precedence List::

++

sequence, ++t ++

++

Description::

++ ++

Sequences are ordered collections of objects, ++called the elements of the sequence. ++

++

The types vector and the type list are disjoint subtypes of type sequence, ++but are not necessarily an exhaustive partition of sequence. ++

++

When viewing a vector as a sequence, ++only the active elements of that vector ++are considered elements of the sequence; ++that is, ++sequence operations respect the fill pointer ++when given sequences represented as vectors. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/serious_002dcondition.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++serious-condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.4 serious-condition [Condition Type]

++ ++

Class Precedence List::

++

serious-condition, ++condition, ++t ++

++

Description::

++ ++

All conditions serious enough to require interactive intervention ++if not handled should inherit from the type serious-condition. ++This condition type is provided ++primarily so that it may be included as ++a superclass of other condition types; ++it is not intended to be signaled directly. ++

++

Notes::

++ ++

Signaling a serious condition does not itself force entry into ++the debugger. However, except in the unusual situation where the ++programmer can assure that no harm will come from failing to ++handle a serious condition, such a condition is ++usually signaled with error rather than signal in ++order to assure that the program does not continue without ++handling the condition. (And conversely, it is ++conventional to use signal rather than error to signal ++conditions which are not serious conditions, since normally the ++failure to handle a non-serious condition is not reason enough for the ++debugger to be entered.) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++set (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.19 set [Function]

++ ++

set symbol valuevalue ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

value—an object. ++

++

Description::

++ ++

set changes the contents of the value cell of symbol ++to the given value. ++

++
++
(set symbol value) ≡ (setf (symbol-value symbol) value)
++
++ ++

Examples::

++ ++
++
 (setf (symbol-value 'n) 1) ⇒  1
++ (set 'n 2) ⇒  2
++ (symbol-value 'n) ⇒  2
++ (let ((n 3))
++   (declare (special n))
++   (setq n (+ n 1))
++   (setf (symbol-value 'n) (* n 10))
++   (set 'n (+ (symbol-value 'n) n))
++   n) ⇒  80
++ n ⇒  2
++ (let ((n 3))
++   (setq n (+ n 1))
++   (setf (symbol-value 'n) (* n 10))
++   (set 'n (+ (symbol-value 'n) n))
++   n) ⇒  4
++ n ⇒  44
++ (defvar *n* 2)
++ (let ((*n* 3))
++   (setq *n* (+ *n* 1))
++   (setf (symbol-value '*n*) (* *n* 10))
++   (set '*n* (+ (symbol-value '*n*) *n*))
++   *n*) ⇒  80
++  *n* ⇒  2
++ (defvar *even-count* 0) ⇒  *EVEN-COUNT*
++ (defvar *odd-count* 0) ⇒  *ODD-COUNT*
++ (defun tally-list (list)
++   (dolist (element list)
++     (set (if (evenp element) '*even-count* '*odd-count*)
++          (+ element (if (evenp element) *even-count* *odd-count*)))))
++ (tally-list '(1 9 4 3 2 7)) ⇒  NIL
++ *even-count* ⇒  6
++ *odd-count* ⇒  20
++
++ ++

Side Effects::

++ ++

The value of symbol is changed. ++

++

See Also::

++ ++

setq ++, ++progv ++, ++symbol-value ++

++

Notes::

++ ++

The function set is deprecated. ++

++

set cannot change the value of a lexical variable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set_002ddifference.html +@@ -0,0 +1,162 @@ ++ ++ ++ ++ ++ ++set-difference (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.46 set-difference, nset-difference [Function]

++ ++

set-difference list-1 list-2 &key key test test-notresult-list ++

++

nset-difference list-1 list-2 &key key test test-notresult-list ++

++

Arguments and Values::

++ ++

list-1—a proper list. ++

++

list-2—a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-list—a list. ++

++

Description::

++

set-difference returns a list ++of elements of list-1 ++that do not appear in list-2. ++

++

nset-difference is the destructive ++version of set-difference. ++It may destroy list-1. ++

++

For all possible ordered pairs consisting of ++one element from list-1 and one element from list-2, the ++:test or :test-not function is ++used to determine whether they satisfy the test. ++The first argument to the :test or :test-not function ++is the part of an element of list-1 that is returned by ++the :key function (if supplied); the second argument is the part of ++an element of list-2 that is ++returned by the :key function (if supplied). ++

++

If :key is supplied, its argument is a list-1 or ++list-2 element. The :key function ++typically returns part of ++the supplied element. ++If :key is not supplied, the list-1 or list-2 ++element is used. ++

++

An element of list-1 ++appears in the result if and only if it does not match any element ++of list-2. ++

++

There is no guarantee that the order of elements in the result will ++reflect the ordering of the arguments in any particular way. ++The result list ++may share cells with, or be eq to, either of list-1 ++or list-2, ++if appropriate. ++

++

Examples::

++ ++
++
 (setq lst1 (list "A" "b" "C" "d")
++       lst2 (list "a" "B" "C" "d")) ⇒  ("a" "B" "C" "d")
++ (set-difference lst1 lst2) ⇒  ("d" "C" "b" "A")
++ (set-difference lst1 lst2 :test 'equal) ⇒  ("b" "A")
++ (set-difference lst1 lst2 :test #'equalp) ⇒  NIL 
++ (nset-difference lst1 lst2 :test #'string=) ⇒  ("A" "b")
++ (setq lst1 '(("a" . "b") ("c" . "d") ("e" . "f")))
++⇒  (("a" . "b") ("c" . "d") ("e" . "f")) 
++ (setq lst2 '(("c" . "a") ("e" . "b") ("d" . "a")))
++⇒  (("c" . "a") ("e" . "b") ("d" . "a")) 
++ (nset-difference lst1 lst2 :test #'string= :key #'cdr)
++⇒  (("c" . "d") ("e" . "f")) 
++ lst1 ⇒  (("a" . "b") ("c" . "d") ("e" . "f")) 
++ lst2 ⇒  (("c" . "a") ("e" . "b") ("d" . "a")) 
++
++ ++
++
;; Remove all flavor names that contain "c" or "w".
++ (set-difference '("strawberry" "chocolate" "banana"
++                  "lemon" "pistachio" "rhubarb")
++          '(#\c #\w)
++          :test #'(lambda (s c) (find c s)))
++⇒  ("banana" "rhubarb" "lemon")    ;One possible ordering.
++
++ ++

Side Effects::

++ ++

nset-difference may destroy list-1. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list-1 and list-2 are not proper lists. ++

++

See Also::

++ ++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set_002ddispatch_002dmacro_002dcharacter.html +@@ -0,0 +1,154 @@ ++ ++ ++ ++ ++ ++set-dispatch-macro-character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.9 set-dispatch-macro-character, get-dispatch-macro-character

++

[Function] ++

++

get-dispatch-macro-character disp-char sub-char &optional readtablefunction ++

++

set-dispatch-macro-character disp-char sub-char new-function &optional readtablet ++

++

Arguments and Values::

++ ++

disp-char—a character. ++

++

sub-char—a character. ++

++

readtable—a readtable designator. ++

++

The default is the current readtable. ++

++

function—a function designator or nil. ++

++

new-function—a function designator. ++

++

Description::

++ ++

set-dispatch-macro-character causes new-function to be called ++when disp-char followed by sub-char is read. ++If sub-char is a lowercase letter, ++it is converted to its uppercase equivalent. ++It is an error if sub-char is one of the ten decimal digits. ++

++

set-dispatch-macro-character installs a new-function to be called ++when a particular dispatching macro character pair is read. ++New-function is installed as the dispatch function to be ++called when readtable is in use and when disp-char is followed by ++sub-char. ++

++

For more information about how the new-function is invoked, ++see Macro Characters. ++

++

get-dispatch-macro-character retrieves ++the dispatch function associated with disp-char and sub-char ++in readtable. ++

++

get-dispatch-macro-character returns the macro-character function ++for sub-char under disp-char, or nil if there is no ++function associated with sub-char. ++If sub-char is a decimal digit, get-dispatch-macro-character ++returns nil. ++

++

Examples::

++ ++
++
 (get-dispatch-macro-character #\# #\{) ⇒  NIL
++ (set-dispatch-macro-character #\# #\{        ;dispatch on #{
++    #'(lambda(s c n)
++        (let ((list (read s nil (values) t)))  ;list is object after #n{
++          (when (consp list)                   ;return nth element of list
++            (unless (and n (< 0 n (length list))) (setq n 0))
++            (setq list (nth n list)))
++         list))) ⇒  T
++ #{(1 2 3 4) ⇒  1
++ #3{(0 1 2 3) ⇒  3
++ #{123 ⇒  123
++
++ ++

If it is desired that #$foo : ++as if it were (dollars foo). ++

++
++
(defun |#$-reader| (stream subchar arg)
++   (declare (ignore subchar arg))
++   (list 'dollars (read stream t nil t))) ⇒  |#$-reader|
++ (set-dispatch-macro-character #\# #\$ #'|#$-reader|) ⇒  T
++
++ ++

See Also::

++ ++

Macro Characters ++

++

Side Effects::

++ ++

The readtable is modified. ++

++

Affected By::

++ ++

*readtable*. ++

++

Exceptional Situations::

++ ++

For either function, an error is signaled if disp-char is not ++a dispatching macro character in readtable. ++

++

See Also::

++ ++

readtable ++

++

Notes::

++

It is necessary ++to use make-dispatch-macro-character to set up the ++dispatch character before specifying its sub-characters. ++

++
++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set_002dexclusive_002dor.html +@@ -0,0 +1,149 @@ ++ ++ ++ ++ ++ ++set-exclusive-or (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.47 set-exclusive-or, nset-exclusive-or [Function]

++ ++

set-exclusive-or list-1 list-2 &key key test test-notresult-list ++

++

nset-exclusive-or list-1 list-2 &key key test test-notresult-list ++

++

Arguments and Values::

++ ++

list-1—a proper list. ++

++

list-2—a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-list—a list. ++

++

Description::

++

set-exclusive-or returns a list of elements that appear ++in exactly one of list-1 and list-2. ++

++

nset-exclusive-or ++is the destructive version of set-exclusive-or. ++

++

For all possible ordered pairs consisting of ++one element from list-1 and one element from list-2, the ++:test or :test-not function is ++used to determine whether they satisfy the test. ++

++

If :key is supplied, it is used to ++extract the part to be tested from the list-1 or list-2 element. ++The first argument to the :test or :test-not function ++is the part of an element of list-1 extracted by the :key ++function (if supplied); the second argument is the part of an ++element of list-2 extracted by the :key function (if supplied). ++If :key is not supplied or nil, the list-1 or ++list-2 element is used. ++

++

The result contains precisely ++those elements of list-1 and list-2 ++that appear in no matching pair. ++

++

The result list of set-exclusive-or ++might share storage with one of list-1 or list-2. ++

++

Examples::

++ ++
++
 (setq lst1 (list 1 "a" "b")
++       lst2 (list 1 "A" "b")) ⇒  (1 "A" "b")
++ (set-exclusive-or lst1 lst2) ⇒  ("b" "A" "b" "a")
++ (set-exclusive-or lst1 lst2 :test #'equal) ⇒  ("A" "a")
++ (set-exclusive-or lst1 lst2 :test 'equalp) ⇒  NIL 
++ (nset-exclusive-or lst1 lst2) ⇒  ("a" "b" "A" "b") 
++ (setq lst1 (list (("a" . "b") ("c" . "d") ("e" . "f"))))
++⇒  (("a" . "b") ("c" . "d") ("e" . "f"))
++ (setq lst2 (list (("c" . "a") ("e" . "b") ("d" . "a"))))
++⇒  (("c" . "a") ("e" . "b") ("d" . "a")) 
++ (nset-exclusive-or lst1 lst2 :test #'string= :key #'cdr)
++⇒  (("c" . "d") ("e" . "f") ("c" . "a") ("d" . "a")) 
++ lst1 ⇒  (("a" . "b") ("c" . "d") ("e" . "f"))
++ lst2 ⇒  (("c" . "a") ("d" . "a")) 
++
++ ++

Side Effects::

++ ++

nset-exclusive-or is permitted to modify any part, ++car or cdr, of the list structure of list-1 or list-2. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list-1 and list-2 are not proper lists. ++

++

See Also::

++ ++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

Since the nset-exclusive-or side effect is not required, ++it should not be used in for-effect-only ++ positions in portable code. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set_002dmacro_002dcharacter.html +@@ -0,0 +1,135 @@ ++ ++ ++ ++ ++ ++set-macro-character (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.10 set-macro-character, get-macro-character [Function]

++ ++

get-macro-character char &optional readtablefunction, non-terminating-p ++

++

set-macro-character char new-function &optional non-terminating-p readtablet ++

++

Arguments and Values::

++ ++

char—a character. ++

++

non-terminating-p—a generalized boolean. ++ The default is false. ++

++

readtable—a readtable designator. ++

++

The default is the current readtable. ++

++

functionnil, ++ or a designator for a function of two arguments. ++

++

new-function—a function designator. ++

++

Description::

++ ++

get-macro-character returns as its primary value, function, ++the reader macro function associated with char in readtable (if any), ++or else nil if char is not a macro character in readtable. ++The secondary value, non-terminating-p, is true ++if char is a non-terminating macro character; ++otherwise, it is false. ++

++

set-macro-character causes char to be a macro character ++associated with the reader macro function new-function ++(or the designator for new-function) in readtable. ++If non-terminating-p is true, ++char becomes a non-terminating macro character; ++otherwise it becomes a terminating macro character. ++

++

Examples::

++ ++
++
 (get-macro-character #\{) ⇒  NIL, false
++ (not (get-macro-character #\;)) ⇒  false
++
++ ++

The following is a possible definition for the single-quote reader macro ++in standard syntax: ++

++
++
 (defun single-quote-reader (stream char)
++   (declare (ignore char))
++   (list 'quote (read stream t nil t))) ⇒  SINGLE-QUOTE-READER
++ (set-macro-character #\' #'single-quote-reader) ⇒  T
++
++ ++

Here single-quote-reader reads an object following the single-quote ++and returns a list of quote and that object. ++The char argument is ignored. ++

++

The following is a possible definition for the semicolon reader macro ++in standard syntax: ++

++
++
 (defun semicolon-reader (stream char)
++   (declare (ignore char))
++   ;; First swallow the rest of the current input line.
++   ;; End-of-file is acceptable for terminating the comment.
++   (do () ((char= (read-char stream nil #\Newline t) #\Newline)))
++   ;; Return zero values.
++   (values)) ⇒  SEMICOLON-READER
++ (set-macro-character #\; #'semicolon-reader) ⇒  T
++
++ ++

Side Effects::

++ ++

The readtable is modified. ++

++

See Also::

++ ++

readtable ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set_002dpprint_002ddispatch.html +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ ++set-pprint-dispatch (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.13 set-pprint-dispatch [Function]

++ ++

set-pprint-dispatch type-specifier function &optional priority tablenil ++

++

Arguments and Values::

++ ++

type-specifier—a type specifier. ++

++

function—a function, a function name, or nil. ++

++

priority—a real. ++ The default is 0. ++

++

table—a pprint dispatch table. ++ The default is the value of *print-pprint-dispatch*. ++

++

Description::

++ ++

Installs an entry into the pprint dispatch table which is table. ++

++

Type-specifier ++is the key ++of the entry. The first action of set-pprint-dispatch is to remove any ++pre-existing entry associated with type-specifier. This guarantees that ++there will never be two entries associated with the same type specifier ++in a given pprint dispatch table. Equality of type specifiers is ++tested by equal. ++

++

Two values are associated with each type specifier in a ++pprint dispatch table: a function and a priority. ++The function must accept two arguments: the stream to which output ++is sent and the object to be printed. The function should ++pretty print the object to the stream. The function ++can assume that object satisfies the type given by type-specifier. ++The function must obey *print-readably*. ++Any values returned by the function are ignored. ++

++

Priority is a priority to resolve conflicts ++when an object matches more than one entry. ++

++

It is permissible for function to be nil. In this situation, ++there will be no type-specifier entry in table after ++set-pprint-dispatch returns. ++

++

Exceptional Situations::

++ ++

An error is signaled if priority is not a real. ++

++

Notes::

++ ++

Since pprint dispatch tables are often used to control the pretty ++printing of Lisp code, it is common for the type-specifier to be ++an expression of the form ++

++
++
 (cons car-type cdr-type)
++
++ ++

This signifies that the corresponding object must be a cons cell ++whose car matches the type specifier car-type ++and whose cdr matches the type specifier cdr-type. ++The cdr-type can be omitted in which case it defaults to t. ++

++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/set_002dsyntax_002dfrom_002dchar.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++set-syntax-from-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

23.2.11 set-syntax-from-char [Function]

++ ++

set-syntax-from-char to-char from-char &optional to-readtable from-readtablet ++

++

Arguments and Values::

++ ++

to-char—a character. ++

++

from-char—a character. ++

++

to-readtable—a readtable. ++ The default is the current readtable. ++

++

from-readtable—a readtable designator. ++ The default is the standard readtable. ++

++

Description::

++ ++

set-syntax-from-char makes ++the syntax of to-char in to-readtable be the same as ++the syntax of from-char in from-readtable. ++

++

set-syntax-from-char copies the syntax types of from-char. ++If from-char is a macro character, ++its reader macro function is copied also. ++If the character is a dispatching macro character, ++its entire dispatch table of reader macro functions is copied. ++The constituent traits of from-char are not copied. ++

++

A macro definition from a character such as ++" can be copied to another character; the standard definition for " ++looks for another character that is the same as the character that ++invoked it. The definition of ( can not be meaningfully copied ++to {, on the other hand. ++The result is that lists are of the form ++{a b c), not {a b c}, ++because the definition ++always looks for a closing parenthesis, not a closing brace. ++

++

Examples::

++
++
 (set-syntax-from-char #\7 #\;) ⇒  T
++ 123579 ⇒  1235
++
++ ++

Side Effects::

++ ++

The to-readtable is modified. ++

++

Affected By::

++ ++

The existing values in the from-readtable. ++

++

See Also::

++ ++

set-macro-character ++, ++make-dispatch-macro-character ++, ++Character Syntax Types ++

++

Notes::

++ ++

The constituent traits of a character are “hard wired” ++into the parser for extended tokens. For example, if the definition ++of S is copied to *, then * will become a constituent ++that is alphabetic_2 but that cannot be used as a ++short float exponent marker. ++For further information, see Constituent Traits. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/setf-class_002dname.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++setf class-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.38 setf class-name [Standard Generic Function]

++ ++

Syntax::

++ ++

setf class-name new-value classnew-value ++

++

Method Signatures::

++ ++

setf class-name new-value (class class) ++

++

Arguments and Values::

++ ++

new-value—a symbol. ++

++

class—a class. ++

++

Description::

++ ++

The generic function setf class-name sets the name of ++a class object. ++

++

See Also::

++ ++

find-class ++, ++proper name, ++Classes ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/setf.html +@@ -0,0 +1,155 @@ ++ ++ ++ ++ ++ ++setf (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.64 setf, psetf [Macro]

++ ++

setf {!pair}*{result}* ++

++

psetf {!pair}*nil ++

++

pair ::=place newvalue ++

++

Arguments and Values::

++ ++

place—a place. ++

++

newvalue—a form. ++

++

results—the multiple values_2 ++ returned by the storing form for the last place, ++ or nil if there are no pairs. ++

++

Description::

++ ++

setf changes the value of place to be newvalue. ++

++

(setf place newvalue) ++expands into an update form that stores the ++result ++of evaluating ++newvalue into the location referred to by place. ++ Some place forms ++involve uses of accessors that take optional arguments. ++ Whether those optional arguments are permitted by ++setf, or what their use ++ is, is up to the ++setf expander function and is not under the control ++ of setf. ++The documentation for any function ++that accepts &optional, &rest, ++ or &key arguments and that ++claims to be usable with setf must specify ++ how those arguments are treated. ++

++

If more than one pair is supplied, ++the pairs are processed sequentially; that is, ++

++
++
 (setf place-1 newvalue-1
++       place-2 newvalue-2
++       ...
++       place-N newvalue-N)
++
++ ++

is precisely equivalent to ++

++
++
 (progn (setf place-1 newvalue-1)
++        (setf place-2 newvalue-2)
++        ...
++        (setf place-N newvalue-N))
++
++ ++

For psetf, ++if more than one pair is supplied then the assignments of new values to places are ++done in parallel. More precisely, all subforms (in both the place ++and newvalue forms) that are to be evaluated ++are evaluated from left to right; after all evaluations have been performed, ++all of the assignments are performed in an unpredictable order. ++

++

For detailed treatment of the expansion of setf and psetf, ++see Kinds of Places. ++

++

Examples::

++ ++
++
 (setq x (cons 'a 'b) y (list 1 2 3)) ⇒  (1 2 3) 
++ (setf (car x) 'x (cadr y) (car x) (cdr x) y) ⇒  (1 X 3) 
++ x ⇒  (X 1 X 3) 
++ y ⇒  (1 X 3) 
++ (setq x (cons 'a 'b) y (list 1 2 3)) ⇒  (1 2 3) 
++ (psetf (car x) 'x (cadr y) (car x) (cdr x) y) ⇒  NIL 
++ x ⇒  (X 1 A 3) 
++ y ⇒  (1 A 3) 
++
++ ++

Affected By::

++ ++

define-setf-expander, ++defsetf, ++*macroexpand-hook* ++

++

See Also::

++ ++

define-setf-expander ++, ++defsetf ++, ++macroexpand-1, ++rotatef ++, ++shiftf ++, ++Generalized Reference ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/setq.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++setq (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.20 setq [Special Form]

++ ++

setq {!pair}*result ++

++

pair ::=var form ++

++

Pronunciation::

++ ++

pronounced ’set ,ky\"u ++

++

Arguments and Values::

++ ++

var—a symbol naming a variable other than a constant variable. ++

++

form—a form. ++

++

result—the primary value of the last form, ++ or nil if no pairs were supplied. ++

++

Description::

++ ++

Assigns values to variables. ++

++

(setq var1 form1 var2 form2 ...) ++is the simple variable assignment statement of Lisp. ++First form1 is evaluated ++and the result is stored in the variable var1, then form2 ++is evaluated and the result stored in var2, and so forth. ++setq may be used for assignment of both lexical ++and dynamic variables. ++

++

If any var refers to a binding ++made by symbol-macrolet, ++then that var is treated as if setf ++(not setq) had been used. ++

++

Examples::

++ ++
++
 ;; A simple use of SETQ to establish values for variables.
++ (setq a 1 b 2 c 3) ⇒  3
++ a ⇒  1
++ b ⇒  2
++ c ⇒  3
++
++ ;; Use of SETQ to update values by sequential assignment.
++ (setq a (1+ b) b (1+ a) c (+ a b)) ⇒  7
++ a ⇒  3
++ b ⇒  4
++ c ⇒  7
++
++ ;; This illustrates the use of SETQ on a symbol macro.
++ (let ((x (list 10 20 30)))
++   (symbol-macrolet ((y (car x)) (z (cadr x)))
++     (setq y (1+ z) z (1+ y))
++     (list x y z)))
++⇒  ((21 22 30) 21 22)
++
++ ++

Side Effects::

++ ++

The primary value of each form is assigned to the corresponding var. ++

++

See Also::

++ ++

psetq ++, ++set ++, ++setf ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/shadow.html +@@ -0,0 +1,131 @@ ++ ++ ++ ++ ++ ++shadow (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.9 shadow [Function]

++ ++

shadow symbol-names &optional packaget ++

++

Arguments and Values::

++ ++

symbol-names—a designator for ++ a list of string designators. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

Description::

++ ++

shadow assures that symbols with names given ++by symbol-names are present ++in ++the package. ++

++

Specifically, package is searched for symbols ++with the names supplied by symbol-names. ++

++

For each such name, if a corresponding symbol ++is not present in package (directly, not by inheritance), ++then a corresponding symbol is created with that name, ++and inserted into package as an internal symbol. ++The corresponding symbol, whether pre-existing or newly created, ++is then added, if not already present, to the shadowing symbols list ++of package. ++

++

Examples::

++ ++
++
 (package-shadowing-symbols (make-package 'temp)) ⇒  NIL
++ (find-symbol 'car 'temp) ⇒  CAR, :INHERITED
++ (shadow 'car 'temp) ⇒  T
++ (find-symbol 'car 'temp) ⇒  TEMP::CAR, :INTERNAL
++ (package-shadowing-symbols 'temp) ⇒  (TEMP::CAR)
++
++ ++
++
 (make-package 'test-1) ⇒  #<PACKAGE "TEST-1">
++ (intern "TEST" (find-package 'test-1)) ⇒  TEST-1::TEST, NIL
++ (shadow 'test-1::test (find-package 'test-1)) ⇒  T
++ (shadow 'TEST (find-package 'test-1)) ⇒  T
++ (assert (not (null (member 'test-1::test (package-shadowing-symbols
++                                            (find-package 'test-1))))))
++
++ (make-package 'test-2) ⇒  #<PACKAGE "TEST-2">
++ (intern "TEST" (find-package 'test-2)) ⇒  TEST-2::TEST, NIL
++ (export 'test-2::test (find-package 'test-2)) ⇒  T
++ (use-package 'test-2 (find-package 'test-1))    ;should not error
++
++
++ ++

Side Effects::

++ ++

shadow changes the state of the package system in such a ++way that the package consistency rules do not hold across the change. ++

++

Affected By::

++ ++

Current state of the package system. ++

++

See Also::

++ ++

package-shadowing-symbols ++, ++Package Concepts ++

++

Notes::

++ ++

If a symbol with a name in symbol-names already exists ++in package, but by inheritance, the inherited symbol becomes ++shadowed_3 by a newly created internal symbol. ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/shadowing_002dimport.html +@@ -0,0 +1,113 @@ ++ ++ ++ ++ ++ ++shadowing-import (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.10 shadowing-import [Function]

++ ++

shadowing-import symbols &optional packaget ++

++

Arguments and Values::

++ ++

symbols—a designator for a list of symbols. ++

++

package —a package designator. ++

++

The default is the current package. ++

++

Description::

++ ++

shadowing-import is like import, ++but it does not signal an error even if the importation of a symbol ++would shadow some symbol already accessible in package. ++

++

shadowing-import inserts each of symbols ++into package as an internal symbol, regardless ++of whether another symbol of the same name is shadowed by this ++action. ++If a different symbol of the same name is already present ++in package, ++that symbol is first uninterned from package. ++The new symbol is added to package’s shadowing-symbols list. ++

++

shadowing-import does name-conflict ++checking to the extent that it checks whether a distinct existing ++symbol with the same name is accessible; if so, it is shadowed by ++the new symbol, which implies that it must be uninterned ++if it was ++present in package. ++

++

Examples::

++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (setq sym (intern "CONFLICT")) ⇒  CONFLICT
++ (intern "CONFLICT" (make-package 'temp)) ⇒  TEMP::CONFLICT, NIL
++ (package-shadowing-symbols 'temp) ⇒  NIL
++ (shadowing-import sym 'temp) ⇒  T 
++ (package-shadowing-symbols 'temp) ⇒  (CONFLICT)
++
++ ++

Side Effects::

++ ++

shadowing-import ++changes the state of the package system in such a way that ++the consistency rules do not hold across the change. ++

++

package’s shadowing-symbols list is modified. ++

++

Affected By::

++ ++

Current state of the package system. ++

++

See Also::

++ ++

import ++, ++unintern ++, ++package-shadowing-symbols ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/shared_002dinitialize.html +@@ -0,0 +1,178 @@ ++ ++ ++ ++ ++ ++shared-initialize (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.5 shared-initialize [Standard Generic Function]

++ ++

Syntax::

++ ++

shared-initialize instance slot-names &rest initargs &key &allow-other-keysinstance ++

++

Method Signatures::

++ ++

shared-initialize (instance standard-object) slot-names &rest initargs ++

++

Arguments and Values::

++ ++

instance—an object. ++

++

slot-names—a list or t. ++

++

initargs—a list of keyword/value pairs ++ (of initialization argument names and values). ++

++

Description::

++ ++

The generic function shared-initialize is used to fill the ++slots ++of an instance ++using initargs and :initform ++forms. It is called when an instance is created, when an instance is ++re-initialized, when an instance is updated to conform to a redefined ++class, and when an instance is updated to conform to a different ++class. The generic function shared-initialize is called by the ++system-supplied primary method for initialize-instance, ++reinitialize-instance, update-instance-for-redefined-class, and ++update-instance-for-different-class. ++

++

The generic function shared-initialize takes the following ++arguments: the instance to be initialized, a specification of a set of ++slot-names accessible in that instance, ++and any number of initargs. ++The arguments after the first two must form an ++initialization argument list. The system-supplied primary method on ++shared-initialize initializes the slots with values according to the ++initargs and supplied :initform forms. Slot-names ++indicates which slots should be initialized according ++to their :initform forms if no initargs are ++provided for those slots. ++

++

The system-supplied primary method behaves as follows, ++regardless of whether the slots are local or shared: ++

++
++
*
++

If an initarg in the initialization argument list ++ specifies a value for that slot, that ++ value is stored into the slot, even if a value has ++ already been stored in the slot before the method is run. ++

++
++
*
++

Any slots indicated by slot-names that are still unbound ++ at this point are initialized according to their :initform forms. ++ For any such slot that has an :initform form, ++ that form is evaluated in the lexical environment of its defining ++ defclass form and the result is stored into the slot. ++ For example, if a before method stores a value in the slot, ++ the :initform form will not be used to supply a value for the slot. ++

++
++
*
++

The rules mentioned in Rules for Initialization Arguments are obeyed. ++

++
++
++ ++

The slots-names argument specifies the slots that are to be ++initialized according to their :initform forms if no ++initialization arguments apply. It can be a list of slot names, ++which specifies the set of those slot names; or it can be the symbol t, ++which specifies the set of all of the slots. ++

++

See Also::

++ ++

Initialize-Instance ++, ++reinitialize-instance ++, ++update-instance-for-redefined-class ++, ++update-instance-for-different-class ++, ++slot-boundp ++, ++slot-makunbound ++, ++Object Creation and Initialization, ++Rules for Initialization Arguments, ++Declaring the Validity of Initialization Arguments ++

++

Notes::

++ ++

Initargs are declared as valid by using the :initarg ++option to defclass, or by defining ++methods for shared-initialize. ++The keyword name of each keyword parameter ++specifier in the lambda list of any method defined on ++shared-initialize is declared as a valid initarg ++name for all classes for which that method is applicable. ++

++

Implementations are permitted to optimize :initform forms that ++neither produce nor depend on side effects, by evaluating these forms ++and storing them into slots before running any ++initialize-instance methods, rather than by handling them in the ++primary initialize-instance method. (This optimization might ++be implemented by having the allocate-instance method copy a ++prototype instance.) ++

++

Implementations are permitted to optimize default initial value forms ++for initargs associated with slots by not actually ++creating the complete initialization argument ++list when the only method ++that would receive the complete list is the ++method on standard-object. ++In this case default initial value forms can be ++treated like :initform forms. This optimization has no visible ++effects other than a performance improvement. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/shiftf.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++shiftf (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.65 shiftf [Macro]

++ ++

shiftf {place}^+ newvalueold-value-1 ++

++

Arguments and Values::

++ ++

place—a place. ++

++

newvalue—a form; evaluated. ++

++

old-value-1—an object (the old value of the first place). ++

++

Description::

++ ++

shiftf modifies the values of each ++place by storing newvalue ++into the last place, and shifting the ++values of the second through the last place ++into the remaining places. ++

++

If newvalue produces more values than there ++are store variables, the extra values are ignored. If newvalue ++produces fewer values than there are store variables, the missing values ++are set to nil. ++

++

In the form (shiftf place1 place2 ... placen newvalue), ++the values in place1 through placen are read and saved, ++and newvalue is evaluated, for a total of n+1 values in all. ++Values 2 through n+1 are then stored into place1 through placen, respectively. ++It is as if all the places form a shift register; the newvalue ++is shifted in from the right, all values shift over to the left one place, ++and the value shifted out of place1 is returned. ++

++

For information about the evaluation of subforms of places, ++see Evaluation of Subforms to Places. ++

++

Examples::

++ ++
++
 (setq x (list 1 2 3) y 'trash) ⇒  TRASH
++ (shiftf y x (cdr x) '(hi there)) ⇒  TRASH
++ x ⇒  (2 3)
++ y ⇒  (1 HI THERE)
++
++ (setq x (list 'a 'b 'c)) ⇒  (A B C)
++ (shiftf (cadr x) 'z) ⇒  B
++ x ⇒  (A Z C)
++ (shiftf (cadr x) (cddr x) 'q) ⇒  Z
++ x ⇒  (A (C) . Q)
++ (setq n 0) ⇒  0
++ (setq x (list 'a 'b 'c 'd)) ⇒  (A B C D)
++ (shiftf (nth (setq n (+ n 1)) x) 'z) ⇒  B
++ x ⇒  (A Z C D)
++
++ ++

Affected By::

++ ++

define-setf-expander, ++defsetf, ++*macroexpand-hook* ++

++

See Also::

++ ++

setf ++, ++rotatef ++, Generalized Reference ++

++

Notes::

++ ++

The effect of ++ (shiftf place1 place2 ... placen newvalue) ++is roughly equivalent to ++

++
++
 (let ((var1 place1)
++       (var2 place2)
++       ...
++       (varn placen)
++       (var0 newvalue))
++   (setf place1 var2)
++   (setf place2 var3)
++   ...
++   (setf placen var0)
++   var1)
++
++ ++

except that the latter would evaluate any subforms ++of each place twice, whereas shiftf evaluates them once. ++For example, ++

++
++
 (setq n 0) ⇒  0
++ (setq x (list 'a 'b 'c 'd)) ⇒  (A B C D)
++ (prog1 (nth (setq n (+ n 1)) x)
++        (setf (nth (setq n (+ n 1)) x) 'z)) ⇒  B
++ x ⇒  (A B Z D)
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/short_002dfloat.html +@@ -0,0 +1,204 @@ ++ ++ ++ ++ ++ ++short-float (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.5 short-float, single-float, double-float, long-float [Type]

++ ++

Supertypes::

++ ++

short-float: ++ short-float, ++ float, ++

++

real, ++

++

number, ++ t ++

++

single-float: ++ single-float, ++ float, ++

++

real, ++

++

number, ++ t ++

++

double-float: ++ double-float, ++ float, ++

++

real, ++

++

number, ++ t ++

++

long-float: ++ long-float, ++ float, ++

++

real, ++

++

number, ++ t ++

++

Description::

++ ++

For the four defined subtypes of type float, it is true that ++intermediate between the type short-float and the type long-float are ++the type single-float and the type double-float. ++The precise definition of these categories is ++implementation-defined. ++The precision (measured in “bits”, computed as p\log_2b) ++and the exponent size (also measured in “bits,” computed as ++\log_2(n+1), where n is the maximum exponent value) is recommended ++to be at least as great ++as the values in Figure 12–11. ++Each of the defined subtypes of type float might or might not have a minus zero. ++

++
++
  Format  Minimum Precision  Minimum Exponent Size  
++  __________________________________________________
++  Short   13 bits            5 bits                 
++  Single  24 bits            8 bits                 
++  Double  50 bits            8 bits                 
++  Long    50 bits            8 bits                 
++
++  Figure 12–11: Recommended Minimum Floating-Point Precision and Exponent Size
++
++
++ ++

There can be fewer than four internal ++representations for floats. ++If there are fewer distinct representations, the following rules apply: ++

++
++

If there is only one, it is ++the type single-float. ++In this representation, an object is simultaneously of types ++single-float, double-float, short-float, ++and long-float. ++

++
++

Two internal representations can be arranged in either of the ++following ways: ++

++
*
++

Two types are provided: single-float and ++short-float. An object is simultaneously ++of types single-float, double-float, and long-float. ++

++
*
++

Two types are provided: single-float and ++double-float. An object is simultaneously of types ++single-float and short-float, or ++double-float and long-float. ++

++
++ ++
++
++

Three internal representations can be arranged in either ++of the following ways: ++

++
*
++

Three types are provided: short-float, ++single-float, and double-float. ++An object can simultaneously be of type double-float ++and long-float. ++

++
*
++

Three types are provided: ++single-float, double-float, ++and long-float. An object can simultaneously ++be of types single-float and short-float. ++

++
++ ++
++
++ ++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(short-float{[short-lower-limit [short-upper-limit]]}) ++(single-float{[single-lower-limit [single-upper-limit]]}) ++(double-float{[double-lower-limit [double-upper-limit]]}) ++(long-float{[long-lower-limit [long-upper-limit]]}) ++

++

Compound Type Specifier Arguments::

++ ++

short-lower-limit, short-upper-limitinterval designators ++ for type short-float. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

single-lower-limit, single-upper-limitinterval designators ++ for type single-float. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

double-lower-limit, double-upper-limitinterval designators ++ for type double-float. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

long-lower-limit, long-upper-limitinterval designators ++ for type long-float. ++ The defaults for each of lower-limit and upper-limit is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

Each of these denotes the set of floats of the indicated type ++that are on the interval specified by the interval designators. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/short_002dfloat_002depsilon.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++short-float-epsilon (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

12.2.77 short-float-epsilon, short-float-negative-epsilon,

++

single-float-epsilon, single-float-negative-epsilon,

++

double-float-epsilon, double-float-negative-epsilon,

++

long-float-epsilon, long-float-negative-epsilon

++

[Constant Variable] ++

++

Constant Value::

++ ++

implementation-dependent. ++

++

Description::

++ ++

The value of each of the constants short-float-epsilon, ++single-float-epsilon, ++double-float-epsilon, and long-float-epsilon is ++the smallest positive float \epsilon of the given format, ++such that the following expression is true when evaluated: ++

++

(not (= (float 1 \epsilon) (+ (float 1 \epsilon) \epsilon)))\/ ++

++

The value of each of the constants short-float-negative-epsilon, ++single-float-negative-epsilon, ++double-float-negative-epsilon, and ++long-float-negative-epsilon is the smallest positive ++float \epsilon of the given format, such that the following ++expression is true when evaluated: ++

++

(not (= (float 1 \epsilon) (- (float 1 \epsilon) \epsilon)))\/ ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/short_002dsite_002dname.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++short-site-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.25 short-site-name, long-site-name [Function]

++ ++

short-site-name <no arguments>description ++

++

long-site-name <no arguments>description ++

++

Arguments and Values::

++ ++

description—a string or nil. ++

++

Description::

++ ++

short-site-name and long-site-name return ++a string that identifies the physical location ++of the computer hardware, ++or nil if no appropriate description can be produced. ++

++

Examples::

++ ++
++
 (short-site-name)
++⇒  "MIT AI Lab"
++OR⇒ "CMU-CSD"
++ (long-site-name)
++⇒  "MIT Artificial Intelligence Laboratory"
++OR⇒ "CMU Computer Science Department"
++
++ ++

Affected By::

++ ++

The implementation, ++the location of the computer hardware, ++and the installation/configuration process. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/signal.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++signal (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.17 signal [Function]

++ ++

signal datum &rest argumentsnil ++

++

Arguments and Values::

++ ++

datum, argumentsdesignators for a condition ++ of default type simple-condition. ++

++

Description::

++ ++

Signals the condition denoted by the given datum and arguments. ++If the condition is not handled, signal returns nil. ++

++

Examples::

++ ++
++
 (defun handle-division-conditions (condition)
++   (format t "Considering condition for division condition handling~
++   (when (and (typep condition 'arithmetic-error)
++              (eq '/ (arithmetic-error-operation condition)))
++     (invoke-debugger condition)))
++HANDLE-DIVISION-CONDITIONS
++ (defun handle-other-arithmetic-errors (condition)
++   (format t "Considering condition for arithmetic condition handling~
++   (when (typep condition 'arithmetic-error)
++     (abort)))
++HANDLE-OTHER-ARITHMETIC-ERRORS
++ (define-condition a-condition-with-no-handler (condition) ())
++A-CONDITION-WITH-NO-HANDLER
++ (signal 'a-condition-with-no-handler)
++NIL
++ (handler-bind ((condition #'handle-division-conditions)
++                  (condition #'handle-other-arithmetic-errors))
++   (signal 'a-condition-with-no-handler))
++Considering condition for division condition handling
++Considering condition for arithmetic condition handling
++NIL
++ (handler-bind ((arithmetic-error #'handle-division-conditions)
++                  (arithmetic-error #'handle-other-arithmetic-errors))
++   (signal 'arithmetic-error :operation '* :operands '(1.2 b)))
++Considering condition for division condition handling
++Considering condition for arithmetic condition handling
++Back to Lisp Toplevel
++
++ ++

Side Effects::

++ ++

The debugger might be entered due to *break-on-signals*. ++

++

Handlers for the condition being signaled might transfer control. ++

++

Affected By::

++ ++

Existing handler bindings. ++

++

*break-on-signals* ++

++

See Also::

++ ++

*break-on-signals*, ++error ++, ++simple-condition, ++Signaling and Handling Conditions ++

++

Notes::

++ ++

If (typep datum *break-on-signals*) yields true, ++the debugger is entered prior to beginning the signaling process. ++The continue restart can be used to continue with the signaling process. ++This is also true for all other functions and macros that ++should, might, or must signal conditions. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/signed_002dbyte.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++signed-byte (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.9 signed-byte [Type]

++ ++

Supertypes::

++ ++

signed-byte, ++integer, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

The atomic type specifier signed-byte denotes the same ++type as is denoted by the type specifier integer; ++however, the list forms of these two type specifiers have different semantics. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(signed-byte{[s | *]}) ++

++

Compound Type Specifier Arguments::

++ ++

s—a positive integer. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of integers that can be represented ++in two’s-complement form in a byte of s bits. This is ++equivalent to (integer -2^s-1 2^s-1-1). The type ++signed-byte or the type (signed-byte *) is the same ++as the type integer. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/signum.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++signum (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.37 signum [Function]

++ ++

signum numbersigned-prototype ++

++

Arguments and Values::

++ ++

number—a number. ++

++

signed-prototype—a number. ++

++

Description::

++ ++

signum determines a numerical value that indicates whether ++number is negative, zero, or positive. ++

++

For a rational, ++signum returns one of -1, 0, or 1 ++according to whether number is negative, zero, or positive. ++For a float, ++the result is a float of the same format ++whose value is minus one, zero, or one. ++For a complex number z, ++(signum z) is a complex number of the same phase but with unit magnitude, ++unless z is a complex zero, in which case the result is z. ++

++

For rational arguments, signum is a rational function, ++but it may be irrational for complex arguments. ++

++

If number is a float, the result is a float. ++If number is a rational, the result is a rational. ++If number is a complex float, the result is a complex float. ++If number is a complex rational, the result is a complex, ++but it is implementation-dependent whether that result is a ++complex rational or a complex float. ++

++

Examples::

++ ++
++
 (signum 0) ⇒  0
++ (signum 99) ⇒  1
++ (signum 4/5) ⇒  1
++ (signum -99/100) ⇒  -1
++ (signum 0.0) ⇒  0.0
++ (signum #c(0 33)) ⇒  #C(0.0 1.0)
++ (signum #c(7.5 10.0)) ⇒  #C(0.6 0.8)
++ (signum #c(0.0 -14.7)) ⇒  #C(0.0 -1.0)
++ (eql (signum -0.0) -0.0) ⇒  true
++
++ ++

See Also::

++ ++

Rule of Float Substitutability ++

++

Notes::

++
++
 (signum x) ≡ (if (zerop x) x (/ x (abs x)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002darray.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++simple-array (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.2 simple-array [Type]

++ ++

Supertypes::

++ ++

simple-array, ++array, ++t ++

++

Description::

++ ++

The type of an array that is not displaced ++to another array, has no fill pointer, and is ++not ++expressly adjustable is a subtype of type simple-array. ++The concept of a simple array ++exists to allow the implementation to use a specialized representation ++and to allow the user to declare that certain values will always be ++simple arrays. ++

++

The types simple-vector, ++ simple-string, ++ and simple-bit-vector ++are disjoint subtypes of type simple-array, ++for they respectively mean (simple-array t (*)), ++ the union of all (simple-array c (*)) ++ for any c being a subtype of type character, ++ and (simple-array bit (*)). ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(simple-array{[{element-type | *} [dimension-spec]]}) ++

++

dimension-spec ::=rank | * | ({dimension | *}*) ++

++

Compound Type Specifier Arguments::

++ ++

dimension—a valid array dimension. ++

++

element-type—a type specifier. ++

++

rank—a non-negative fixnum. ++

++

Compound Type Specifier Description::

++ ++

This compound type specifier is treated exactly as the corresponding ++compound type specifier for type array would be treated, ++except that the set is further constrained to include only simple arrays. ++

++

Notes::

++ ++

It is implementation-dependent ++whether displaced arrays, ++ vectors with fill pointers, ++ or arrays that are actually adjustable ++ are simple arrays. ++

++

(simple-array *) refers to all simple arrays ++regardless of element type, (simple-array type-specifier) ++refers only to those simple arrays ++that can result from giving type-specifier as the ++:element-type argument to make-array. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dbase_002dstring.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++simple-base-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.4 simple-base-string [Type]

++ ++

Supertypes::

++ ++

simple-base-string, ++base-string, ++simple-string, ++string, ++vector, ++simple-array, ++array, ++sequence, ++t ++

++

Description::

++ ++

The type simple-base-string is equivalent to ++

++

(simple-array base-char (*)). ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(simple-base-string{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This is equivalent to the type (simple-array base-char (size)); ++that is, the set of simple base strings of size size. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dbit_002dvector.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++simple-bit-vector (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.6 simple-bit-vector [Type]

++ ++

Supertypes::

++ ++

simple-bit-vector, ++bit-vector, ++vector, ++simple-array, ++array, ++sequence, ++t ++

++

Description::

++ ++

The type of a bit vector that is not displaced ++to another array, has no fill pointer, and is ++not ++expressly adjustable ++is a ++subtype of type simple-bit-vector. ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(simple-bit-vector{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++ The default is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the same type as the type ++(simple-array bit (size)); ++that is, the set of simple bit vectors of size size. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dbit_002dvector_002dp.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++simple-bit-vector-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Arrays Dictionary  

++
++
++

15.2.36 simple-bit-vector-p [Function]

++ ++

simple-bit-vector-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type simple-bit-vector; ++otherwise, returns false. ++

++

Examples::

++
++
 (simple-bit-vector-p (make-array 6)) ⇒  false
++ (simple-bit-vector-p #*) ⇒  true
++
++ ++

See Also::

++ ++

simple-vector-p ++

++

Notes::

++
++
 (simple-bit-vector-p object) ≡ (typep object 'simple-bit-vector)
++
++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dcondition.html +@@ -0,0 +1,81 @@ ++ ++ ++ ++ ++ ++simple-condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.18 simple-condition [Condition Type]

++ ++

Class Precedence List::

++

simple-condition, ++condition, ++t ++

++

Description::

++ ++

The type simple-condition represents conditions that are ++signaled by signal whenever a format-control is ++supplied as the function’s first argument. ++

++

The format control and format arguments are initialized with ++the initialization arguments named :format-control ++

++

and :format-arguments to make-condition, and are ++accessed by the functions ++

++

simple-condition-format-control ++

++

and simple-condition-format-arguments. ++If format arguments are not supplied to make-condition, ++nil is used as a default. ++

++

See Also::

++ ++

simple-condition-format-control ++, ++

++

simple-condition-format-arguments ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dcondition_002dformat_002dcontrol.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++simple-condition-format-control (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.19 simple-condition-format-control, simple-condition-format-arguments

++

[Function] ++

++

simple-condition-format-control conditionformat-control ++

++

simple-condition-format-arguments conditionformat-arguments ++

++

Arguments and Values::

++ ++

condition—a condition of type simple-condition. ++

++

format-control—a format control. ++

++

format-arguments—a list. ++

++

Description::

++ ++

simple-condition-format-control returns the format control needed to ++process the condition’s format arguments. ++

++

simple-condition-format-arguments returns a list of format arguments ++needed to process the condition’s format control. ++

++

Examples::

++ ++
++
 (setq foo (make-condition 'simple-condition
++                          :format-control "Hi ~S"
++                          :format-arguments '(ho)))
++⇒  #<SIMPLE-CONDITION 26223553>
++ (apply #'format nil (simple-condition-format-control foo)
++                     (simple-condition-format-arguments foo))
++⇒  "Hi HO"
++
++ ++

See Also::

++ ++

simple-condition ++, ++Condition System Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002derror.html +@@ -0,0 +1,69 @@ ++ ++ ++ ++ ++ ++simple-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.14 simple-error [Condition Type]

++ ++

Class Precedence List::

++ ++

simple-error, ++simple-condition, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type simple-error consists of conditions that ++are signaled by error or cerror when a ++

++

format control ++

++

is supplied as the function’s first argument. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dstring.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++simple-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.3 simple-string [Type]

++ ++

Supertypes::

++ ++

simple-string, ++string, ++vector, ++simple-array, ++array, ++sequence, ++t ++

++

Description::

++ ++

A simple string is a specialized one-dimensional ++simple array whose elements are of type character or a subtype of type character. ++When used as a type specifier for object creation, ++simple-string means (simple-array character (size)). ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(simple-string{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the union of all types ++(simple-array c (size)) for all subtypes c of ++character; that is, the set of simple strings of size size. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dstring_002dp.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++simple-string-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.5 simple-string-p [Function]

++ ++

simple-string-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type simple-string; ++otherwise, returns false. ++

++

Examples::

++
++
 (simple-string-p "aaaaaa") ⇒  true
++ (simple-string-p (make-array 6 
++                              :element-type 'character 
++                              :fill-pointer t)) ⇒  false
++
++ ++

Notes::

++
++
 (simple-string-p object) ≡ (typep object 'simple-string)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dtype_002derror.html +@@ -0,0 +1,86 @@ ++ ++ ++ ++ ++ ++simple-type-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.31 simple-type-error [Condition Type]

++ ++

Class Precedence List::

++ ++

simple-type-error, ++simple-condition, ++type-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

Conditions of type simple-type-error ++are like conditions of type type-error, ++except that they provide an alternate mechanism for specifying ++how the condition is to be reported; ++see the type simple-condition. ++

++

See Also::

++ ++

simple-condition, ++

++

simple-condition-format-control ++, ++

++

simple-condition-format-arguments, ++type-error-datum ++, ++type-error-expected-type ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dvector.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++simple-vector (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.4 simple-vector [Type]

++ ++

Supertypes::

++ ++

simple-vector, ++vector, ++simple-array, ++array, ++sequence, ++t ++

++

Description::

++ ++

The type of a vector that is not displaced to another ++array, has no fill pointer, is not ++expressly adjustable ++and is able to hold ++elements of any type is a subtype of type simple-vector. ++

++

The type simple-vector is a subtype of type vector, ++and is a subtype of type (vector t). ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(simple-vector{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++ The default is the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This is the same as (simple-array t (size)). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dvector_002dp.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++simple-vector-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.27 simple-vector-p [Function]

++ ++

simple-vector-p objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type simple-vector; ++otherwise, returns false.. ++

++

Examples::

++ ++
++
 (simple-vector-p (make-array 6)) ⇒  true
++ (simple-vector-p "aaaaaa") ⇒  false
++ (simple-vector-p (make-array 6 :fill-pointer t)) ⇒  false
++
++ ++

See Also::

++ ++

simple-vector ++

++

Notes::

++ ++
++
 (simple-vector-p object) ≡ (typep object 'simple-vector)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/simple_002dwarning.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++simple-warning (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.21 simple-warning [Condition Type]

++ ++

Class Precedence List::

++ ++

simple-warning, ++simple-condition, ++warning, ++condition, ++t ++

++

Description::

++ ++

The type simple-warning represents conditions that ++are signaled by warn whenever a ++

++

format control ++

++

is supplied as the function’s first argument. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sin.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++sin (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.20 sin, cos, tan [Function]

++ ++

sin radiansnumber ++

++

cos radiansnumber ++

++

tan radiansnumber ++

++

Arguments and Values::

++ ++

radians—a number given in radians. ++

++

number—a number. ++

++

Description::

++ ++

sin, cos, and tan ++return the sine, cosine, and tangent, respectively, of radians. ++

++

Examples::

++ ++
++
 (sin 0) ⇒  0.0
++ (cos 0.7853982) ⇒  0.707107
++ (tan #c(0 1)) ⇒  #C(0.0 0.761594)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if radians is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

asin ++, ++acos, ++atan, ++Rule of Float Substitutability ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sinh.html +@@ -0,0 +1,185 @@ ++ ++ ++ ++ ++ ++sinh (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.23 sinh, cosh, tanh, asinh, acosh, atanh [Function]

++ ++

sinh numberresult ++

++

cosh numberresult ++

++

tanh numberresult ++

++

asinh numberresult ++

++

acosh numberresult ++

++

atanh numberresult ++

++

Arguments and Values::

++ ++

number—a number. ++

++

result—a number. ++

++

Description::

++ ++

These functions compute the hyperbolic sine, cosine, tangent, ++arc sine, arc cosine, and arc tangent functions, ++which are mathematically defined for an argument x ++as given in Figure 12–15. ++

++
++
  Function                Definition                                  
++  Hyperbolic sine          (e^x-e^-x)/2                             
++  Hyperbolic cosine        (e^x+e^-x)/2                             
++  Hyperbolic tangent       (e^x-e^-x)/(e^x+e^-x)                  
++  Hyperbolic arc sine      log  (x+\sqrt1+x^2)                      
++  Hyperbolic arc cosine    2 log  (\sqrt(x+1)/2 + \sqrt(x-1)/2)   
++  Hyperbolic arc tangent   (log  (1+x) - log (1-x))/2                 
++
++    Figure 12–15: Mathematical definitions for hyperbolic functions  
++
++
++ ++

The following definition for the inverse hyperbolic cosine ++determines the range and branch cuts: ++

++
arccosh z = 2 log (\sqrt(z+1)/2 + \sqrt(z-1)/2\Bigr). ++
++

The branch cut for the inverse hyperbolic cosine function ++lies along the real axis to the left of~1 (inclusive), extending ++indefinitely along the negative real axis, continuous with quadrant II ++and (between 0 and~1) with quadrant I. ++The range is that half-strip of the complex plane containing numbers whose ++real part is non-negative and whose imaginary ++part is between -\pi (exclusive) and~\pi (inclusive). ++A number with real part zero is in the range ++if its imaginary part is between zero (inclusive) and~\pi (inclusive). ++

++

The following definition for the inverse hyperbolic sine determines ++the range and branch cuts: ++

++
arcsinh z = log (z+\sqrt1+z^2\Bigr). ++
++

The branch cut for the inverse hyperbolic sine function is in two pieces: ++one along the positive imaginary axis above i ++(inclusive), continuous with quadrant I, and one along the negative imaginary ++axis below -i (inclusive), continuous with quadrant III. ++The range is that strip of the complex plane containing numbers whose imaginary ++part is between -\pi/2 and~\pi/2. A number with imaginary ++part equal to -\pi/2 is in the range if and only if its real ++part is non-positive; a number with imaginary part equal to \pi/2 is in ++the range if and only if its imaginary part is non-negative. ++

++

The following definition for the inverse hyperbolic tangent ++determines the range and branch cuts: ++

++
arctanh z = log (1+z) - log (1-z)\over2. ++
++

Note that: ++

++
i arctan z = arctanh iz. ++
++

The branch cut for the inverse hyperbolic tangent function ++is in two pieces: one along the negative real axis to the left of ++-1 (inclusive), continuous with quadrant III, and one along ++the positive real axis to the right of~1 (inclusive), continuous with ++quadrant I. The points -1 and~1 are excluded from the ++domain. ++The range is that strip of the complex plane containing ++numbers whose imaginary part is between -\pi/2 and ++\pi/2. A number with imaginary part equal to -\pi/2 ++is in the range if and only if its real part is strictly negative; a number with ++imaginary part equal to \pi/2 is in the range if and only if its imaginary ++part is strictly positive. ++Thus the range of the inverse hyperbolic tangent function is identical to ++that of the inverse hyperbolic sine function with the points ++-\pi i/2 and~\pi i/2 excluded. ++

++

Examples::

++ ++
++
 (sinh 0) ⇒  0.0 
++ (cosh (complex 0 -1)) ⇒  #C(0.540302 -0.0)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if number is not a number. ++Might signal arithmetic-error. ++

++

See Also::

++ ++

log ++, ++sqrt ++, ++Rule of Float Substitutability ++

++

Notes::

++ ++

The result of acosh may be a complex even if number ++is not a complex; this occurs when number is less than one. ++Also, the result of atanh may be a complex even if number ++is not a complex; this occurs when the absolute value of number ++is greater than one. ++

++

The branch cut formulae are mathematically correct, assuming ++completely accurate computation. ++Implementors should consult a good text on ++numerical analysis. The formulae given above are not necessarily ++the simplest ones for real-valued computations; they are chosen ++to define the branch cuts in desirable ways for the complex case. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sleep.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++sleep (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.4 sleep [Function]

++ ++

sleep secondsnil ++

++

Arguments and Values::

++ ++

seconds—a non-negative real. ++

++

Description::

++ ++

Causes execution to cease and become dormant for approximately the ++seconds of real time indicated by seconds, ++whereupon execution is resumed. ++

++

Examples::

++ ++
++
 (sleep 1) ⇒  NIL 
++
++;; Actually, since SLEEP is permitted to use approximate timing, 
++;; this might not always yield true, but it will often enough that
++;; we felt it to be a productive example of the intent.
++ (let ((then (get-universal-time))
++       (now  (progn (sleep 10) (get-universal-time))))
++   (>= (- now then) 10))
++⇒  true
++
++ ++

Side Effects::

++ ++

Causes processing to pause. ++

++

Affected By::

++ ++

The granularity of the scheduler. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if seconds is not a non-negative real. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/slot_002dboundp.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++slot-boundp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.9 slot-boundp [Function]

++ ++

slot-boundp instance slot-namegeneralized-boolean ++

++

Arguments and Values::

++ ++

instance—an object. ++

++

slot-name—a symbol naming a slot of instance. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if the slot named slot-name in instance is bound; ++otherwise, returns false. ++

++

Exceptional Situations::

++ ++

If no slot of the name slot-name exists in the ++instance, slot-missing is called as follows: ++

++
++
 (slot-missing (class-of instance)
++               instance
++               slot-name
++               'slot-boundp)
++
++ ++

(If slot-missing is invoked and returns a value, ++a boolean equivalent to its primary value ++is returned by slot-boundp.) ++

++

The specific behavior depends on instance’s metaclass. ++An error is never signaled if instance has metaclass standard-class. ++An error is always signaled if instance has metaclass built-in-class. ++The consequences are undefined if instance has any other metaclass–an error ++might or might not be signaled in this situation. Note in particular that the behavior ++for conditions and structures is not specified. ++

++

See Also::

++ ++

slot-makunbound ++, ++slot-missing ++

++

Notes::

++ ++

The function slot-boundp allows for writing ++after methods on initialize-instance in order to initialize only ++those slots that have not already been bound. ++

++

Although no implementation is required to do so, ++ implementors are strongly encouraged to implement the function slot-boundp using ++ the function slot-boundp-using-class described in the Metaobject Protocol. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/slot_002dexists_002dp.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++slot-exists-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.10 slot-exists-p [Function]

++ ++

slot-exists-p object slot-namegeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

slot-name—a symbol. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if the object has ++a slot named slot-name. ++

++

Affected By::

++ ++

defclass, ++defstruct ++

++

See Also::

++ ++

defclass ++, ++slot-missing ++

++

Notes::

++ ++

Although no implementation is required to do so, ++ implementors are strongly encouraged to implement the function slot-exists-p using ++ the function slot-exists-p-using-class described in the Metaobject Protocol. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/slot_002dmakunbound.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++slot-makunbound (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.11 slot-makunbound [Function]

++ ++

slot-makunbound instance slot-nameinstance ++

++

Arguments and Values::

++ ++

instance – instance. ++

++

Slot-name—a symbol. ++

++

Description::

++ ++

The function slot-makunbound restores a slot ++of the name slot-name in an instance to ++the unbound state. ++

++

Exceptional Situations::

++ ++

If no slot of the name slot-name exists in the ++instance, slot-missing is called as follows: ++

++
++
(slot-missing (class-of instance)
++              instance
++              slot-name
++              'slot-makunbound)
++
++ ++

(Any values returned by slot-missing in this case are ++ignored by slot-makunbound.) ++

++

The specific behavior depends on instance’s metaclass. ++An error is never signaled if instance has metaclass standard-class. ++An error is always signaled if instance has metaclass built-in-class. ++The consequences are undefined if instance has any other metaclass–an error ++might or might not be signaled in this situation. Note in particular that the behavior ++for conditions and structures is not specified. ++

++

See Also::

++ ++

slot-boundp ++, ++slot-missing ++

++

Notes::

++ ++

Although no implementation is required to do so, ++ implementors are strongly encouraged to implement the function slot-makunbound using ++ the function slot-makunbound-using-class described in the Metaobject Protocol. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/slot_002dmissing.html +@@ -0,0 +1,148 @@ ++ ++ ++ ++ ++ ++slot-missing (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.12 slot-missing [Standard Generic Function]

++ ++

Syntax::

++ ++

slot-missing class object slot-name operation &optional new-value{result}* ++

++

Method Signatures::

++ ++

slot-missing (class t) ++ object slot-name ++ operation &optional new-value ++

++

Arguments and Values::

++ ++

class—the class of object. ++

++

object—an object. ++

++

slot-name—a symbol (the name of a would-be slot). ++

++

operation—one of the symbols ++ setf, ++ slot-boundp, ++ slot-makunbound, ++ or slot-value. ++

++

new-value—an object. ++

++

result—an object. ++

++

Description::

++ ++

The generic function slot-missing is invoked when an attempt is ++made to access a slot in an object whose ++metaclass is standard-class ++and the slot of the name slot-name ++is not a name of a ++slot in that class. ++The default method signals an error. ++

++

The generic function slot-missing is not intended to be called by ++programmers. Programmers may write methods for it. ++

++

The generic function slot-missing may be called during ++evaluation of slot-value, (setf slot-value), ++slot-boundp, and slot-makunbound. For each ++of these operations the corresponding symbol ++for the operation ++argument is slot-value, setf, slot-boundp, ++and slot-makunbound respectively. ++

++

The optional new-value argument to slot-missing is used ++when the operation is attempting to set the value of the slot. ++

++

If slot-missing returns, its values will be treated as follows: ++

++
++
*
++

If the operation is setf or slot-makunbound, ++any values will be ignored by the caller. ++

++
++
*
++

If the operation is slot-value, ++only the primary value will be used by the caller, ++and all other values will be ignored. ++

++
++
*
++

If the operation is slot-boundp, ++any boolean equivalent of the primary value ++of the method might be is used, ++and all other values will be ignored. ++

++
++ ++

Exceptional Situations::

++ ++

The default method on slot-missing ++signals an error of type error. ++

++

See Also::

++ ++

defclass ++, ++slot-exists-p ++, ++slot-value ++

++

Notes::

++ ++

The set of arguments (including the class of the instance) facilitates ++defining methods on the metaclass for slot-missing. ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/slot_002dunbound.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++slot-unbound (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.13 slot-unbound [Standard Generic Function]

++ ++

Syntax::

++ ++

slot-unbound class instance slot-name{result}* ++

++

Method Signatures::

++ ++

slot-unbound (class t) ++ instance slot-name ++

++

Arguments and Values::

++ ++

class—the class of the instance. ++

++

instance—the instance in which an attempt ++ was made to read the unbound slot. ++

++

slot-name—the name of the unbound slot. ++

++

result—an object. ++

++

Description::

++ ++

The generic function slot-unbound is called when an ++unbound slot is read in ++an instance whose metaclass is standard-class. ++The default method signals an error ++

++

of type unbound-slot. ++The name slot of the ++unbound-slot condition is initialized ++ to the name of the offending variable, and the instance slot ++ of the unbound-slot condition is initialized to the offending instance. ++

++

The generic function slot-unbound is not intended to be called ++by programmers. Programmers may write methods for it. ++The function slot-unbound is called only ++indirectly by slot-value. ++

++

If slot-unbound returns, ++only the primary value will be used by the caller, ++and all other values will be ignored. ++

++

Exceptional Situations::

++ ++

The default method on slot-unbound ++signals an error of type unbound-slot. ++

++

See Also::

++ ++

slot-makunbound ++

++

Notes::

++ ++

An unbound slot may occur if no :initform form was ++specified for the slot and the slot value has not been set, ++or if slot-makunbound has been called on the slot. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/slot_002dvalue.html +@@ -0,0 +1,152 @@ ++ ++ ++ ++ ++ ++slot-value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.14 slot-value [Function]

++ ++

slot-value object slot-namevalue ++

++

Arguments and Values::

++ ++

object—an object. ++

++

name—a symbol. ++

++

value—an object. ++

++

Description::

++ ++

The function slot-value returns the value of the slot ++named slot-name in the object. ++If there is no slot named slot-name, slot-missing is called. ++If the slot is unbound, slot-unbound is called. ++

++

The macro setf can be used with slot-value ++to change the value of a slot. ++

++

Examples::

++ ++
++
 (defclass foo () 
++   ((a :accessor foo-a :initarg :a :initform 1)
++    (b :accessor foo-b :initarg :b)
++    (c :accessor foo-c :initform 3)))
++⇒  #<STANDARD-CLASS FOO 244020371>
++ (setq foo1 (make-instance 'foo :a 'one :b 'two))
++⇒  #<FOO 36325624>
++ (slot-value foo1 'a) ⇒  ONE
++ (slot-value foo1 'b) ⇒  TWO
++ (slot-value foo1 'c) ⇒  3
++ (setf (slot-value foo1 'a) 'uno) ⇒  UNO
++ (slot-value foo1 'a) ⇒  UNO
++ (defmethod foo-method ((x foo))
++   (slot-value x 'a))
++⇒  #<STANDARD-METHOD FOO-METHOD (FOO) 42720573>
++ (foo-method foo1) ⇒  UNO
++
++ ++

Exceptional Situations::

++ ++

If an attempt is made to read a slot and no slot of ++the name slot-name exists in the object, ++slot-missing is called as follows: ++

++
++
 (slot-missing (class-of instance)
++               instance
++               slot-name
++               'slot-value)
++
++ ++

(If slot-missing is invoked, its primary value ++ is returned by slot-value.) ++

++

If an attempt is made to write a slot and no slot of ++the name slot-name exists in the object, ++slot-missing is called as follows: ++

++
++
 (slot-missing (class-of instance)
++               instance
++               slot-name
++               'setf
++               new-value)
++
++ ++

(If slot-missing returns in this case, any values are ignored.) ++

++

The specific behavior depends on object’s metaclass. ++An error is never signaled if object has metaclass standard-class. ++An error is always signaled if object has metaclass built-in-class. ++The consequences are ++unspecified ++if object has any other metaclass–an error ++might or might not be signaled in this situation. Note in particular that the behavior ++for conditions and structures is not specified. ++

++

See Also::

++ ++

slot-missing ++, ++slot-unbound ++, ++with-slots ++

++

Notes::

++ ++

Although no implementation is required to do so, ++ implementors are strongly encouraged to implement the function slot-value using ++ the function slot-value-using-class described in the Metaobject Protocol. ++

++

Implementations may optimize slot-value by compiling it inline. ++

++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/software_002dtype.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++software-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.29 software-type, software-version [Function]

++ ++

software-type <no arguments>description ++

++

software-version <no arguments>description ++

++

Arguments and Values::

++ ++

description—a string or nil. ++

++

Description::

++ ++

software-type returns a string that identifies the ++generic name of any relevant supporting software, or nil if no ++appropriate or relevant result can be produced. ++

++

software-version returns a string that identifies ++the version of any relevant supporting software, or nil if no ++appropriate or relevant result can be produced. ++

++

Examples::

++ ++
++
 (software-type) ⇒  "Multics"
++ (software-version) ⇒  "1.3x"
++
++ ++

Affected By::

++ ++

Operating system environment. ++

++

Notes::

++ ++

This information should be of use to maintainers of the implementation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sort.html +@@ -0,0 +1,193 @@ ++ ++ ++ ++ ++ ++sort (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.13 sort, stable-sort [Function]

++ ++

sort sequence predicate &key keysorted-sequence ++

++

stable-sort sequence predicate &key keysorted-sequence ++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

predicate—a designator for ++ a function of two arguments that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

sorted-sequence—a sequence. ++

++

Description::

++ ++

sort and stable-sort destructively sort sequences ++according to the order determined by the predicate function. ++

++

If sequence is a vector, ++the result is a vector ++that has the same actual array element type as sequence. ++The result might or might not be simple, ++and might or might not be identical to sequence. ++If sequence is a list, ++the result is a list. ++

++

sort determines the relationship between two elements ++by giving keys extracted from the elements to the predicate. ++The first argument to the predicate function is the part of one element ++of sequence extracted by the key function ++(if supplied); the second ++argument is the part of another element ++of sequence extracted by the key function ++(if supplied). ++Predicate should return true if and only if the first argument is ++strictly less than the second (in some appropriate sense). ++If the first argument is greater than or equal to the second ++(in the appropriate sense), then the predicate should return false. ++

++

The argument to the key function is the sequence element. ++The return value of the key function ++becomes an argument to predicate. ++If key is not supplied or nil, the sequence element itself is used. ++There is no guarantee on the number of times the key will be called. ++

++

If the key and predicate always return, ++then the sorting operation will always terminate, ++producing a sequence containing the same elements as sequence ++(that is, the result is a permutation of sequence). ++This is guaranteed even if the predicate ++does not really consistently represent a total order ++(in which case the elements will be scrambled in some unpredictable way, ++but no element will be lost). ++If the key consistently returns meaningful keys, ++and the predicate does reflect some total ordering criterion on those keys, ++then the elements of the sorted-sequence ++will be properly sorted according to that ordering. ++

++

The sorting operation performed by sort is not guaranteed stable. ++Elements considered equal by the predicate might or might not ++stay in their original order. The predicate is assumed to ++consider two elements x and y to be equal if ++(funcall predicate x y) and ++(funcall predicate y x) are both false. ++stable-sort guarantees stability. ++

++

The sorting operation can be destructive in all cases. In the case of a ++vector ++argument, this is accomplished by permuting the elements in place. ++In the case of a list, the list is ++destructively reordered in the same manner as for ++nreverse. ++

++

Examples::

++ ++
++
 (setq tester (copy-seq "lkjashd")) ⇒  "lkjashd"
++ (sort tester #'char-lessp) ⇒  "adhjkls"
++ (setq tester (list '(1 2 3) '(4 5 6) '(7 8 9))) ⇒  ((1 2 3) (4 5 6) (7 8 9))
++ (sort tester #'> :key #'car)  ⇒  ((7 8 9) (4 5 6) (1 2 3)) 
++ (setq tester (list 1 2 3 4 5 6 7 8 9 0)) ⇒  (1 2 3 4 5 6 7 8 9 0)
++ (stable-sort tester #'(lambda (x y) (and (oddp x) (evenp y))))
++⇒  (1 3 5 7 9 2 4 6 8 0)
++ (sort (setq committee-data
++             (vector (list (list "JonL" "White") "Iteration")
++                     (list (list "Dick" "Waters") "Iteration")
++                     (list (list "Dick" "Gabriel") "Objects")
++                     (list (list "Kent" "Pitman") "Conditions")
++                     (list (list "Gregor" "Kiczales") "Objects")
++                     (list (list "David" "Moon") "Objects")
++                     (list (list "Kathy" "Chapman") "Editorial")
++                     (list (list "Larry" "Masinter") "Cleanup")
++                     (list (list "Sandra" "Loosemore") "Compiler")))
++       #'string-lessp :key #'cadar)
++⇒  #((("Kathy" "Chapman") "Editorial")
++     (("Dick" "Gabriel") "Objects")
++     (("Gregor" "Kiczales") "Objects")
++     (("Sandra" "Loosemore") "Compiler")
++     (("Larry" "Masinter") "Cleanup")
++     (("David" "Moon") "Objects")
++     (("Kent" "Pitman") "Conditions")
++     (("Dick" "Waters") "Iteration")
++     (("JonL" "White") "Iteration"))
++ ;; Note that individual alphabetical order within `committees'
++ ;; is preserved.
++ (setq committee-data 
++       (stable-sort committee-data #'string-lessp :key #'cadr))
++⇒  #((("Larry" "Masinter") "Cleanup")
++     (("Sandra" "Loosemore") "Compiler")
++     (("Kent" "Pitman") "Conditions")
++     (("Kathy" "Chapman") "Editorial")
++     (("Dick" "Waters") "Iteration")
++     (("JonL" "White") "Iteration")
++     (("Dick" "Gabriel") "Objects")
++     (("Gregor" "Kiczales") "Objects")
++     (("David" "Moon") "Objects"))
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

merge ++, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects, ++

++

Destructive Operations ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/special.html +@@ -0,0 +1,209 @@ ++ ++ ++ ++ ++ ++special (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.26 special [Declaration]

++ ++

Syntax::

++ ++

(special {var}*) ++

++

Arguments::

++ ++

var—a symbol. ++

++

Valid Context::

++ ++

declaration or proclamation ++

++

Binding Types Affected::

++ ++

variable ++

++

Description::

++ ++

Specifies that all of ++the vars named are dynamic. ++This specifier affects variable bindings and ++affects references. ++All variable bindings affected are made to be dynamic bindings, ++and affected variable references refer to the current dynamic ++binding. ++For example: ++

++
++
 (defun hack (thing *mod*)    ;The binding of the parameter
++   (declare (special *mod*))  ; *mod* is visible to hack1,
++   (hack1 (car thing)))       ; but not that of thing.
++ (defun hack1 (arg)
++   (declare (special *mod*))  ;Declare references to *mod*
++                              ;within hack1 to be special.
++   (if (atom arg) *mod*
++       (cons (hack1 (car arg)) (hack1 (cdr arg)))))
++
++ ++

A special declaration does not affect inner bindings ++of a var; the inner bindings implicitly shadow ++a special declaration and must be explicitly re-declared to ++be special. ++special declarations never apply to function bindings. ++

++

special declarations can be either bound declarations, ++affecting both a binding and references, or free declarations, ++affecting only references, depending on whether the declaration is ++attached to a variable binding. ++

++

When used in a proclamation, a special ++declaration specifier ++applies to all bindings as well as to all references of the ++mentioned variables. For example, after ++

++
++
 (declaim (special x))
++
++ ++

then in a function definition such as ++

++
++
 (defun example (x) ...)
++
++ ++

the parameter x is bound as a dynamic variable ++rather than as a lexical variable. ++

++

Examples::

++ ++
++
(defun declare-eg (y)                 ;this y is special
++ (declare (special y))
++ (let ((y t))                         ;this y is lexical
++      (list y
++            (locally (declare (special y)) y)))) ;this y refers to the
++                                                 ;special binding of y
++⇒  DECLARE-EG 
++ (declare-eg nil) ⇒  (T NIL) 
++
++ ++
++
(setf (symbol-value 'x) 6)
++(defun foo (x)                         ;a lexical binding of x
++  (print x)
++  (let ((x (1+ x)))                    ;a special binding of x
++    (declare (special x))              ;and a lexical reference
++    (bar))
++  (1+ x))
++(defun bar () 
++  (print (locally (declare (special x))
++           x)))
++(foo 10) 
++ |>  10
++ |>  11
++⇒  11
++
++ ++
++
(setf (symbol-value 'x) 6)
++(defun bar (x y)            ;[1] 1st occurrence of x
++  (let ((old-x x)           ;[2] 2nd occurrence of x -- same as 1st occurrence
++        (x y))              ;[3] 3rd occurrence of x
++    (declare (special x))
++    (list old-x x)))
++(bar 'first 'second) ⇒  (FIRST SECOND)
++
++ ++
++
 (defun few (x &optional (y *foo*))
++   (declare (special *foo*))
++   ...)
++
++ ++

The reference to *foo* ++in the first line of this example is not special ++even though there is a special declaration in the second line. ++

++
++
 (declaim (special prosp)) ⇒  implementation-dependent
++ (setq prosp 1 reg 1) ⇒  1
++ (let ((prosp 2) (reg 2))         ;the binding of prosp is special
++    (set 'prosp 3) (set 'reg 3)   ;due to the preceding proclamation,
++    (list prosp reg))             ;whereas the variable reg is lexical
++⇒  (3 2)
++ (list prosp reg) ⇒  (1 3)
++
++ (declaim (special x))          ;x is always special.
++ (defun example (x y)                                 
++   (declare (special y))
++   (let ((y 3) (x (* x 2)))
++     (print (+ y (locally (declare (special y)) y)))
++     (let ((y 4)) (declare (special y)) (foo x)))) ⇒  EXAMPLE
++
++ ++

In the contorted code above, the outermost and innermost bindings of ++y are dynamic, ++but the middle ++binding is lexical. The two arguments to + are different, ++one being the value, which is 3, of the lexical variable ++y, and the other being the value of the dynamic variable named y ++(a binding ++of which happens, coincidentally, to lexically surround it at ++an outer level). All the bindings ++of x and references to x ++are dynamic, however, because of the proclamation that x is ++always special. ++

++

See Also::

++ ++

defparameter ++, ++defvar ++

++
++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/special_002doperator_002dp.html +@@ -0,0 +1,82 @@ ++ ++ ++ ++ ++ ++special-operator-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Evaluation and Compilation Dictionary  

++
++
++

3.8.29 special-operator-p [Function]

++ ++

special-operator-p symbolgeneralized-boolean ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if symbol is a special operator; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (special-operator-p 'if) ⇒  true
++ (special-operator-p 'car) ⇒  false
++ (special-operator-p 'one) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its argument is not a symbol. ++

++

Notes::

++ ++

Historically, this function was called special-form-p. The name was ++finally declared a misnomer and changed, since it returned true for ++special operators, not special forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sqrt.html +@@ -0,0 +1,138 @@ ++ ++ ++ ++ ++ ++sqrt (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.38 sqrt, isqrt [Function]

++ ++

sqrt numberroot ++

++

isqrt naturalnatural-root ++

++

Arguments and Values::

++ ++

number, root—a number. ++

++

natural, natural-root—a non-negative integer. ++

++

Description::

++ ++

sqrt and isqrt compute square roots. ++

++

sqrt returns the principal square root of number. ++If the number is not a complex but is negative, ++then the result is a complex. ++

++

isqrt returns the greatest integer ++less than or equal to the exact positive square root of natural. ++

++

If number is a positive rational, ++it is implementation-dependent ++whether root is a rational or a float. ++If number is a negative rational, ++it is implementation-dependent ++whether root is a complex rational or a complex float. ++

++

The mathematical definition of complex square root (whether or not ++minus zero is supported) follows: ++

++

(sqrt x) = (exp (/ (log x) 2)) ++

++

The branch cut for square root lies along the negative real axis, ++continuous with quadrant II. ++The range consists of the right half-plane, including the non-negative ++imaginary axis and excluding the negative imaginary axis. ++

++

Examples::

++ ++
++
 (sqrt 9.0) ⇒  3.0
++ (sqrt -9.0) ⇒  #C(0.0 3.0)
++ (isqrt 9) ⇒  3
++ (sqrt 12) ⇒  3.4641016
++ (isqrt 12) ⇒  3
++ (isqrt 300) ⇒  17
++ (isqrt 325) ⇒  18
++ (sqrt 25)
++⇒  5
++OR⇒ 5.0
++ (isqrt 25) ⇒  5
++ (sqrt -1) ⇒  #C(0.0 1.0)
++ (sqrt #c(0 2)) ⇒  #C(1.0 1.0)
++
++ ++

Exceptional Situations::

++ ++

The function sqrt should signal type-error if its argument ++is not a number. ++

++

The function isqrt should signal type-error if its argument ++is not a non-negative integer. ++

++

The functions sqrt and isqrt might signal arithmetic-error. ++

++

See Also::

++ ++

exp ++, ++log ++, ++Rule of Float Substitutability ++

++

Notes::

++ ++
++
 (isqrt x) ≡ (values (floor (sqrt x))) 
++
++ ++

but it is potentially more efficient. ++

++
++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/standard_002dchar.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++standard-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.3 standard-char [Type]

++ ++

Supertypes::

++ ++

standard-char, ++

++

base-char, ++

++

character, ++t ++

++

Description::

++ ++

A fixed set of 96 characters required to be present in all ++conforming implementations. Standard characters are ++defined in Standard Characters. ++

++

Any character that is not simple is not a standard character. ++

++

See Also::

++ ++

Standard Characters ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/standard_002dchar_002dp.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++standard-char-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.13 standard-char-p [Function]

++ ++

standard-char-p charactergeneralized-boolean ++

++

Arguments and Values::

++ ++

character—a character. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if character is of type standard-char; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (standard-char-p #\Space) ⇒  true
++ (standard-char-p #\~) ⇒  true
++ ;; This next example presupposes an implementation
++ ;; in which #\Bell is a defined character.
++ (standard-char-p #\Bell) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/standard_002dclass.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++standard-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.10 standard-class [System Class]

++ ++

Class Precedence List::

++

standard-class, ++class, ++

++

standard-object, ++

++

t ++

++

Description::

++ ++

The class standard-class is the default class of classes ++defined by defclass. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/standard_002dgeneric_002dfunction.html +@@ -0,0 +1,68 @@ ++ ++ ++ ++ ++ ++standard-generic-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.6 standard-generic-function [System Class]

++ ++

Class Precedence List::

++

standard-generic-function, ++generic-function, ++function, ++t ++

++

Description::

++ ++

The class standard-generic-function is the default class of ++generic functions established by ++defmethod, ++ensure-generic-function, ++defgeneric, ++

++

and ++defclass forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/standard_002dmethod.html +@@ -0,0 +1,66 @@ ++ ++ ++ ++ ++ ++standard-method (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.12 standard-method [System Class]

++ ++

Class Precedence List::

++

standard-method, ++method, ++

++

standard-object, ++

++

t ++

++

Description::

++ ++

The class standard-method is the default class of ++methods defined by the ++ defmethod and ++ defgeneric forms. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/standard_002dobject.html +@@ -0,0 +1,61 @@ ++ ++ ++ ++ ++ ++standard-object (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.14 standard-object [Class]

++ ++

Class Precedence List::

++

standard-object, ++t ++

++

Description::

++ ++

The class standard-object is an instance of standard-class ++and is a superclass of every class that is an instance of ++standard-class except itself. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/step.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++step (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.9 step [Macro]

++ ++

step form{result}* ++

++

Arguments and Values::

++ ++

form—a form; evaluated as described below. ++

++

results—the values returned by the form. ++

++

Description::

++ ++

step implements a debugging paradigm wherein the programmer ++is allowed to step through the evaluation of a form. ++The specific nature of the interaction, ++

++

including which I/O streams are used and ++whether the stepping has lexical or dynamic scope, ++

++

is implementation-defined. ++

++

step evaluates form in the current environment. ++A call to step can be compiled, but it is acceptable for an ++implementation to interactively step through only those parts of the computation ++that are interpreted. ++

++

It is technically permissible for a conforming implementation ++to take no action at all other than normal execution of the form. ++In such a situation, ++(step form) ++is equivalent to, for example, ++(let () form). ++In implementations where this is the case, the associated documentation ++should mention that fact. ++

++

See Also::

++ ++

trace ++

++

Notes::

++ ++

Implementations are encouraged to respond to the typing of ? ++or the pressing of a “help key” by providing help including a list of ++commands. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/storage_002dcondition.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++storage-condition (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.9 storage-condition [Condition Type]

++ ++

Class Precedence List::

++

storage-condition, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type storage-condition consists of serious conditions that ++relate to problems with memory management that are potentially due to ++implementation-dependent limits rather than semantic errors ++in conforming programs, and that typically warrant entry to the ++debugger if not handled. Depending on the details of the implementation, ++these might include such problems as ++ stack overflow, ++ memory region overflow, ++and ++ storage exhausted. ++

++

Notes::

++ ++

While some Common Lisp operations might signal storage-condition ++because they are defined to create objects, ++it is unspecified whether operations that are not defined to create ++objects create them anyway ++and so might also signal storage-condition. ++Likewise, the evaluator itself might create objects ++and so might signal storage-condition. ++(The natural assumption might be that such ++object creation is naturally inefficient, ++but even that is implementation-dependent.) ++In general, the entire question of how storage allocation is done is ++implementation-dependent, ++and so any operation might signal storage-condition at any time. ++Because such a condition is indicative of a limitation ++ of the implementation ++or of the image ++rather than an error in a program, ++objects of type storage-condition are not of type error. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/store_002dvalue.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++store-value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.44 store-value [Restart]

++ ++

Data Arguments Required::

++ ++

a value to use instead (on an ongoing basis). ++

++

Description::

++ ++

The store-value restart is generally used by handlers ++trying to recover from errors of types such as cell-error ++or type-error, which may wish to supply a replacement datum to ++be stored permanently. ++

++

Examples::

++ ++
++
 (defun type-error-auto-coerce (c)
++   (when (typep c 'type-error)
++     (let ((r (find-restart 'store-value c)))
++       (handler-case (let ((v (coerce (type-error-datum c)
++                                      (type-error-expected-type c))))
++                       (invoke-restart r v))
++         (error ()))))) ⇒  TYPE-ERROR-AUTO-COERCE
++ (let ((x 3))
++   (handler-bind ((type-error #'type-error-auto-coerce))
++     (check-type x float)
++     x)) ⇒  3.0
++
++ ++

See Also::

++ ++

Restarts, ++Interfaces to Restarts, ++invoke-restart ++, ++store-value ++ (function), ++ccase, ++check-type ++, ++ctypecase, ++use-value ++ (function and restart) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/stream.html +@@ -0,0 +1,70 @@ ++ ++ ++ ++ ++ ++stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.1 stream [System Class]

++ ++

Class Precedence List::

++

stream, ++t ++

++

Description::

++ ++

A stream is an object that can be used with an input or output ++function to identify an appropriate source or sink of characters or ++bytes for that operation. ++

++

For more complete information, see Stream Concepts. ++

++

See Also::

++ ++

Stream Concepts, ++Printing Other Objects, ++Printer, ++Reader ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/stream_002delement_002dtype.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++stream-element-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.12 stream-element-type [Function]

++ ++

stream-element-type streamtypespec ++

++

Arguments and Values::

++ ++

stream—a stream. ++

++

typespec—a type specifier. ++

++

Description::

++ ++

stream-element-type returns a type specifier that ++indicates the types of objects that may be read from ++or written to stream. ++

++

Streams created by open have an element type ++restricted to integer or a subtype of type character. ++

++

Examples::

++ ++
++
;; Note that the stream must accomodate at least the specified type,
++;; but might accomodate other types.  Further note that even if it does
++;; accomodate exactly the specified type, the type might be specified in
++;; any of several ways.
++ (with-open-file (s "test" :element-type '(integer 0 1)
++                           :if-exists :error
++                           :direction :output)
++   (stream-element-type s))
++⇒  INTEGER
++OR⇒ (UNSIGNED-BYTE 16)
++OR⇒ (UNSIGNED-BYTE 8)
++OR⇒ BIT
++OR⇒ (UNSIGNED-BYTE 1)
++OR⇒ (INTEGER 0 1)
++OR⇒ (INTEGER 0 (2))
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/stream_002derror.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++stream-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.55 stream-error [Condition Type]

++ ++

Class Precedence List::

++

stream-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type stream-error ++consists of error conditions that are related to receiving input from ++or sending output to a stream. ++The “offending stream” is initialized by ++the :stream initialization argument to make-condition, ++and is accessed by the function stream-error-stream. ++

++

See Also::

++ ++

stream-error-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/stream_002derror_002dstream.html +@@ -0,0 +1,77 @@ ++ ++ ++ ++ ++ ++stream-error-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.56 stream-error-stream [Function]

++ ++

stream-error-stream conditionstream ++

++

Arguments and Values::

++ ++

condition—a condition of type stream-error. ++

++

stream—a stream. ++

++

Description::

++ ++

Returns the offending stream of a condition of type stream-error. ++

++

Examples::

++
++
 (with-input-from-string (s "(FOO")
++   (handler-case (read s)
++     (end-of-file (c)
++       (format nil "~&End of file on ~S." (stream-error-stream c)))))
++"End of file on #<String Stream>."
++
++ ++

See Also::

++ ++

stream-error, ++Conditions ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/stream_002dexternal_002dformat.html +@@ -0,0 +1,89 @@ ++ ++ ++ ++ ++ ++stream-external-format (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.30 stream-external-format [Function]

++ ++

stream-external-format streamformat ++

++

Arguments and Values::

++ ++

stream—a file stream. ++

++

format—an external file format. ++

++

Description::

++ ++

Returns an external file format designator for the stream. ++

++

Examples::

++ ++
++
 (with-open-file (stream "test" :direction :output)
++   (stream-external-format stream))
++⇒  :DEFAULT
++OR⇒ :ISO8859/1-1987
++OR⇒ (:ASCII :SAIL)
++OR⇒ ACME::PROPRIETARY-FILE-FORMAT-17
++OR⇒ #<FILE-FORMAT :ISO646-1983 2343673>
++
++ ++

See Also::

++ ++

the :external-format argument to the function ++open ++ and ++the ++with-open-file ++ macro. ++

++

Notes::

++ ++

The format returned is not necessarily meaningful ++to other implementations. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/streamp.html +@@ -0,0 +1,80 @@ ++ ++ ++ ++ ++ ++streamp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.13 streamp [Function]

++ ++

streamp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type stream; ++otherwise, returns false. ++

++

streamp is unaffected by whether object, ++if it is a stream, is open or closed. ++

++

Examples::

++ ++
++
 (streamp *terminal-io*) ⇒  true
++ (streamp 1) ⇒  false
++
++ ++

Notes::

++ ++
++
 (streamp object) ≡ (typep object 'stream)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/string-_0028System-Class_0029.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++string (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.1 string [System Class]

++ ++

Class Precedence List::

++

string, ++vector, ++array, ++sequence, ++t ++

++

Description::

++ ++

A string is a specialized vector ++whose elements are of type character or a subtype of type character. ++When used as a type specifier for object creation, ++string means (vector character). ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(string{[size]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum, ++ or the symbol *. ++

++

Compound Type Specifier Description::

++ ++

This denotes the union of all types ++(array c (size)) ++for all subtypes c of character; ++that is, the set of strings of size size. ++

++

See Also::

++ ++

String Concepts, ++Double-Quote, ++Printing Strings ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/string.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.7 string [Function]

++ ++

string xstring ++

++

Arguments and Values::

++ ++

x—a string, a symbol, or a character. ++

++

string—a string. ++

++

Description::

++ ++

Returns a string described by x; specifically: ++

++
++
*
++

If x is a string, it is returned. ++

++
*
++

If x is a symbol, its name is returned. ++

++
*
++
++

If x is a character, ++

++

then a string containing that one character is returned. ++

++
*
++
++

string might perform additional, implementation-defined conversions. ++

++
++
++ ++

Examples::

++ ++
++
 (string "already a string") ⇒  "already a string"
++ (string 'elm) ⇒  "ELM"
++ (string #\c) ⇒  "c"
++
++ ++

Exceptional Situations::

++ ++

In the case where a conversion is defined neither by this specification nor ++by the implementation, an error of type type-error is signaled. ++

++

See Also::

++ ++

coerce ++, ++string (type). ++

++

Notes::

++ ++

coerce can be used to convert a sequence of characters ++to a string. ++

++

prin1-to-string, princ-to-string, write-to-string, ++or format (with a first argument of nil) can be used to get a ++string representation of a number or any other object. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/string_002dstream.html +@@ -0,0 +1,75 @@ ++ ++ ++ ++ ++ ++string-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.6 string-stream [System Class]

++ ++

Class Precedence List::

++ ++

string-stream, ++stream, ++t ++

++

Description::

++ ++

A string stream is a stream ++which reads input from or writes output to an associated string. ++

++

The stream element type of a string stream is always ++a subtype of type character. ++

++

See Also::

++ ++

make-string-input-stream ++, ++make-string-output-stream ++, ++with-input-from-string ++, ++with-output-to-string ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/string_002dtrim.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++string-trim (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.9 string-trim, string-left-trim, string-right-trim [Function]

++ ++

string-trim character-bag stringtrimmed-string ++

++

string-left-trim character-bag stringtrimmed-string ++

++

string-right-trim character-bag stringtrimmed-string ++

++

Arguments and Values::

++ ++

character-bag—a sequence containing characters. ++

++

string—a string designator. ++

++

trimmed-string—a string. ++

++

Description::

++ ++

string-trim returns a substring of string, ++with all characters in character-bag stripped off the beginning and end. ++string-left-trim is similar but strips characters off only the beginning; ++string-right-trim strips off only the end. ++

++

If no characters need to be trimmed from the string, ++then either string itself or a copy of it may be returned, ++at the discretion of the implementation. ++

++

All of these functions observe the fill pointer. ++

++

Examples::

++
++
 (string-trim "abc" "abcaakaaakabcaaa") ⇒  "kaaak"
++ (string-trim '(#\Space #\Tab #\Newline) " garbanzo beans
++        ") ⇒  "garbanzo beans"
++ (string-trim " (*)" " ( *three (silly) words* ) ")
++⇒  "three (silly) words"
++
++ (string-left-trim "abc" "labcabcabc") ⇒  "labcabcabc"
++ (string-left-trim " (*)" " ( *three (silly) words* ) ")
++⇒  "three (silly) words* ) "
++
++ (string-right-trim " (*)" " ( *three (silly) words* ) ") 
++⇒  " ( *three (silly) words"
++
++ ++

Affected By::

++ ++

The implementation. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/string_002dupcase.html +@@ -0,0 +1,170 @@ ++ ++ ++ ++ ++ ++string-upcase (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.8 string-upcase, string-downcase, string-capitalize,

++

nstring-upcase, nstring-downcase, nstring-capitalize

++

[Function] ++

++

string-upcase string &key start endcased-string ++

++

string-downcase string &key start endcased-string ++

++

string-capitalize string &key start endcased-string ++

++

nstring-upcase string &key start endstring ++

++

nstring-downcase string &key start endstring ++

++

nstring-capitalize string &key start endstring ++

++

Arguments and Values::

++ ++

string—a string designator. ++ For nstring-upcase, ++ nstring-downcase, ++ and nstring-capitalize, ++ the string designator must be a string. ++

++

start, endbounding index designators of string. ++ The defaults for start and end are 0 and nil, respectively. ++

++

cased-string—a string. ++

++

Description::

++ ++

string-upcase, string-downcase, string-capitalize, ++nstring-upcase, nstring-downcase, nstring-capitalize ++change the case of the subsequence of string ++bounded by start and end ++as follows: ++

++
++
string-upcase
++

string-upcase returns a string just like string ++with all lowercase characters replaced by the corresponding uppercase ++characters. More precisely, each character of the result string ++is produced by applying the function char-upcase to the corresponding ++character of string. ++

++
++
string-downcase
++

string-downcase is like string-upcase ++except that all uppercase characters are replaced by the corresponding ++lowercase characters (using char-downcase). ++

++
++
string-capitalize
++

string-capitalize produces a copy of string such that, ++for every word in the copy, the first character of the “word,” ++if it has case, is uppercase and ++any other characters with case in the word are lowercase. ++For the purposes of string-capitalize, ++a “word” is defined to be a ++consecutive subsequence consisting of alphanumeric characters, ++delimited at each end either by a non-alphanumeric character ++or by an end of the string. ++

++
++
nstring-upcase, nstring-downcase, nstring-capitalize
++

nstring-upcase, nstring-downcase, ++and nstring-capitalize are identical to string-upcase, ++string-downcase, and string-capitalize ++respectively except that they modify string. ++

++
++ ++

For string-upcase, string-downcase, and string-capitalize, ++string is not modified. However, if no characters in string ++require conversion, the result may be either string or a copy of it, ++at the implementation’s discretion. ++

++

Examples::

++
++
 (string-upcase "abcde") ⇒  "ABCDE"
++ (string-upcase "Dr. Livingston, I presume?")
++⇒  "DR. LIVINGSTON, I PRESUME?"
++ (string-upcase "Dr. Livingston, I presume?" :start 6 :end 10)
++⇒  "Dr. LiVINGston, I presume?"
++ (string-downcase "Dr. Livingston, I presume?")
++⇒  "dr. livingston, i presume?"
++
++ (string-capitalize "elm 13c arthur;fig don't") ⇒  "Elm 13c Arthur;Fig Don'T"
++ (string-capitalize " hello ") ⇒  " Hello "
++ (string-capitalize "occlUDeD cASEmenTs FOreSTAll iNADVertent DEFenestraTION")
++⇒   "Occluded Casements Forestall Inadvertent Defenestration"
++ (string-capitalize 'kludgy-hash-search) ⇒  "Kludgy-Hash-Search"
++ (string-capitalize "DON'T!") ⇒  "Don'T!"    ;not "Don't!"
++ (string-capitalize "pipe 13a, foo16c") ⇒  "Pipe 13a, Foo16c"
++
++ (setq str (copy-seq "0123ABCD890a")) ⇒  "0123ABCD890a"
++ (nstring-downcase str :start 5 :end 7) ⇒  "0123AbcD890a"
++ str ⇒  "0123AbcD890a"
++
++ ++

Side Effects::

++ ++

nstring-upcase, ++ nstring-downcase, ++and nstring-capitalize modify string as appropriate ++rather than constructing a new string. ++

++

See Also::

++ ++

char-upcase ++, char-downcase ++

++

Notes::

++

The result is always of the same length ++as string. ++

++
++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/string_003d.html +@@ -0,0 +1,212 @@ ++ ++ ++ ++ ++ ++string= (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.10 string=, string/=, string<, string>, string<=, string>=,

++

string-equal, string-not-equal, string-lessp,

++

string-greaterp, string-not-greaterp, string-not-lessp

++

[Function] ++

++

string= string1 string2 &key start1 end1 start2 end2generalized-boolean ++

++

string/= string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string< string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string> string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string<= string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string>= string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string-equal string1 string2 &key start1 end1 start2 end2generalized-boolean ++

++

string-not-equal string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string-lessp string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string-greaterp string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string-not-greaterp string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

string-not-lessp string1 string2 &key start1 end1 start2 end2mismatch-index ++

++

Arguments and Values::

++ ++

string1—a string designator. ++

++

string2—a string designator. ++

++

start1, end1bounding index designators of string1. ++ The defaults for start and end are 0 and nil, respectively. ++

++

start2, end2bounding index designators of string2. ++ The defaults for start and end are 0 and nil, respectively. ++

++

generalized-boolean—a generalized boolean. ++

++

mismatch-index—a bounding index of string1, or nil. ++

++

Description::

++ ++

These functions perform lexicographic comparisons on string1 and string2. ++string= and string-equal are called equality functions; ++the others are called inequality functions. ++The comparison operations these functions perform are restricted ++ to the subsequence of string1 bounded by start1 and end1 ++ and to the subsequence of string2 bounded by start2 and end2. ++

++

A string a is equal to a string b if it contains the same number ++of characters, and the corresponding characters are the same ++under char= or char-equal, as appropriate. ++

++

A string a is less than a string b if in the first position in ++which they differ the character of a is less than the corresponding ++character of b according to char< or char-lessp ++as appropriate, or if string a is a proper prefix of string b ++(of shorter length and matching in all the characters of a). ++

++

The equality functions return a generalized boolean ++that is true if the strings are equal, ++or false otherwise. ++

++

The inequality functions return a mismatch-index ++that is true if the strings are not equal, ++or false otherwise. ++When the mismatch-index is true, ++it is an integer representing the first character position at which the ++two substrings differ, as an offset from the beginning of string1. ++

++

The comparison has one of the following results: ++

++
++
string=
++

string= is true if the supplied substrings are of ++the same length and contain the same characters in corresponding ++positions; otherwise it is false. ++

++
++
string/=
++

string/= is true if the supplied substrings are ++different; otherwise it is false. ++

++
++
string-equal
++

string-equal is just like string= ++except that differences in case are ignored; ++two characters are considered to be the same if char-equal is true of them. ++

++
++
string<
++

string< is true if substring1 is less than substring2; ++otherwise it is false. ++

++
++
string>
++

string> is true if substring1 is greater than substring2; ++otherwise it is false. ++

++
++
string-lessp, string-greaterp
++

string-lessp and string-greaterp ++are exactly like string< and string>, respectively, ++except that distinctions between uppercase and lowercase letters are ignored. ++It is as if char-lessp were used instead of char< ++for comparing characters. ++

++
++
string<=
++

string<= is true if substring1 is less than or equal to substring2; ++otherwise it is false. ++

++
++
string>=
++

string>= is true if substring1 is greater than or equal to substring2; ++otherwise it is false. ++

++
++
string-not-greaterp, string-not-lessp
++

string-not-greaterp and string-not-lessp ++are exactly like string<= and string>=, respectively, ++except that distinctions between uppercase and lowercase letters are ignored. ++It is as if char-lessp were used instead of char< ++for comparing characters. ++

++
++
++ ++

Examples::

++ ++
++
 (string= "foo" "foo") ⇒  true
++ (string= "foo" "Foo") ⇒  false
++ (string= "foo" "bar") ⇒  false
++ (string= "together" "frog" :start1 1 :end1 3 :start2 2) ⇒  true
++ (string-equal "foo" "Foo") ⇒  true
++ (string= "abcd" "01234abcd9012" :start2 5 :end2 9) ⇒  true
++ (string< "aaaa" "aaab") ⇒  3
++ (string>= "aaaaa" "aaaa") ⇒  4
++ (string-not-greaterp "Abcde" "abcdE") ⇒  5
++ (string-lessp "012AAAA789" "01aaab6" :start1 3 :end1 7
++                                      :start2 2 :end2 6) ⇒  6
++ (string-not-equal "AAAA" "aaaA") ⇒  false
++
++ ++

See Also::

++ ++

char= ++

++

Notes::

++ ++

equal calls string= if applied to two strings. ++

++
++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/stringp.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++stringp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Strings Dictionary  

++
++
++

16.2.11 stringp [Function]

++ ++

stringp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type string; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (stringp "aaaaaa") ⇒  true
++ (stringp #\a) ⇒  false
++
++ ++

See Also::

++ ++

typep ++, ++string (type) ++

++

Notes::

++ ++
++
 (stringp object) ≡ (typep object 'string)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/structure_002dclass.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ ++ ++structure-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.9 structure-class [System Class]

++ ++

Class Precedence List::

++ ++

structure-class, ++class, ++

++

standard-object, ++

++

t ++

++

Description::

++ ++

All classes defined by means of defstruct ++are instances of the class structure-class. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/structure_002dobject.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++structure-object (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.13 structure-object [Class]

++ ++

Class Precedence List::

++ ++

structure-object, ++t ++

++

Description::

++ ++

The class structure-object is an instance of structure-class ++and is a superclass of every class ++that is an instance of structure-class ++except itself, and is a superclass of every class ++that is defined by defstruct. ++

++

See Also::

++ ++

defstruct ++, ++Sharpsign S, ++Printing Structures ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/style_002dwarning.html +@@ -0,0 +1,85 @@ ++ ++ ++ ++ ++ ++style-warning (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.3 style-warning [Condition Type]

++ ++

Class Precedence List::

++

style-warning, ++warning, ++condition, ++t ++

++

Description::

++ ++

The type style-warning includes those conditions ++that represent situations involving code ++that is conforming code but that is nevertheless ++considered to be faulty or substandard. ++

++

See Also::

++ ++

muffle-warning ++

++

Notes::

++ ++

An implementation might signal such a condition ++if it encounters code ++ that uses deprecated features ++ or that appears unaesthetic or inefficient. ++

++

An ‘unused variable’ warning must be of type style-warning. ++

++

In general, the question of whether code is faulty or substandard ++is a subjective decision to be made by the facility processing that code. ++The intent is that whenever such a facility wishes to complain about ++code on such subjective grounds, it should use this ++condition type so that any clients who wish to redirect or ++muffle superfluous warnings can do so without risking that they will be ++redirecting or muffling other, more serious warnings. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sublis.html +@@ -0,0 +1,168 @@ ++ ++ ++ ++ ++ ++sublis (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.11 sublis, nsublis [Function]

++ ++

sublis alist tree &key key test test-notnew-tree ++

++

nsublis alist tree &key key test test-notnew-tree ++

++

Arguments and Values::

++ ++

alist—an association list. ++

++

tree—a tree. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

new-tree—a tree. ++

++

Description::

++ ++

sublis makes substitutions for objects in tree ++(a structure of conses). ++nsublis is like sublis ++but destructively modifies the relevant ++parts of the tree. ++

++

sublis looks at all subtrees and leaves of tree; ++if a subtree or leaf appears as a key in alist ++(that is, the key and the subtree or leaf satisfy the test), ++it is replaced by the object with which that key is associated. ++This operation is non-destructive. In effect, sublis can ++perform several subst operations simultaneously. ++

++

If sublis succeeds, a new copy of tree is returned in ++which each occurrence of such a subtree or leaf is replaced by the ++object with which it is associated. If no changes are made, the ++original tree is returned. The original tree is left unchanged, ++but the result tree may share cells with it. ++

++

nsublis is permitted to modify tree ++but otherwise returns the same values as sublis. ++

++

Examples::

++ ++
++
 (sublis '((x . 100) (z . zprime))
++         '(plus x (minus g z x p) 4 . x))
++⇒  (PLUS 100 (MINUS G ZPRIME 100 P) 4 . 100)
++ (sublis '(((+ x y) . (- x y)) ((- x y) . (+ x y)))
++         '(* (/ (+ x y) (+ x p)) (- x y))
++         :test #'equal)
++⇒  (* (/ (- X Y) (+ X P)) (+ X Y))
++ (setq tree1 '(1 (1 2) ((1 2 3)) (((1 2 3 4)))))
++⇒  (1 (1 2) ((1 2 3)) (((1 2 3 4))))
++ (sublis '((3 . "three")) tree1) 
++⇒  (1 (1 2) ((1 2 "three")) (((1 2 "three" 4))))
++ (sublis '((t . "string"))
++          (sublis '((1 . "") (4 . 44)) tree1)
++          :key #'stringp)
++⇒  ("string" ("string" 2) (("string" 2 3)) ((("string" 2 3 44))))
++ tree1 ⇒  (1 (1 2) ((1 2 3)) (((1 2 3 4))))
++ (setq tree2 '("one" ("one" "two") (("one" "Two" "three"))))
++⇒  ("one" ("one" "two") (("one" "Two" "three"))) 
++ (sublis '(("two" . 2)) tree2) 
++⇒  ("one" ("one" "two") (("one" "Two" "three"))) 
++ tree2 ⇒  ("one" ("one" "two") (("one" "Two" "three"))) 
++ (sublis '(("two" . 2)) tree2 :test 'equal) 
++⇒  ("one" ("one" 2) (("one" "Two" "three"))) 
++
++ (nsublis '((t . 'temp))
++           tree1
++           :key #'(lambda (x) (or (atom x) (< (list-length x) 3))))
++⇒  ((QUOTE TEMP) (QUOTE TEMP) QUOTE TEMP) 
++
++ ++

Side Effects::

++ ++

nsublis modifies tree. ++

++

See Also::

++ ++

subst ++, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

Because the side-effecting variants (e.g., nsublis) potentially ++change the path that is being traversed, their effects in the presence ++of shared or circular structure structure may vary in surprising ways ++when compared to their non-side-effecting alternatives. To see this, ++consider the following side-effect behavior, which might be exhibited by ++some implementations: ++

++
++
 (defun test-it (fn)
++   (let* ((shared-piece (list 'a 'b))
++          (data (list shared-piece shared-piece)))
++     (funcall fn '((a . b) (b . a)) data)))
++ (test-it #'sublis) ⇒  ((B A) (B A))
++ (test-it #'nsublis) ⇒  ((A B) (A B))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/subseq.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++subseq (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.6 subseq [Accessor]

++ ++

subseq sequence start &optional endsubsequence ++

++

(setf ( subseq sequence start &optional end) new-subsequence)
++

++

Arguments and Values::

++ ++

sequence—a proper sequence. ++

++

start, endbounding index designators of sequence. ++ The default for end is nil. ++

++

subsequence—a proper sequence. ++

++

new-subsequence—a proper sequence. ++

++

Description::

++ ++

subseq creates a sequence ++that is a copy of the subsequence of sequence ++bounded by start and end. ++

++

Start specifies an offset into the original sequence and ++marks the beginning position of the subsequence. ++end marks the position following the last element of the subsequence. ++

++

subseq always allocates a new sequence for a result; ++it never shares storage with an old sequence. ++The result subsequence is always of the same type as sequence. ++

++

If sequence is a vector, ++the result is a fresh simple array ++of rank one ++that has the same actual array element type as sequence. ++If sequence is a list, ++the result is a fresh list. ++

++

setf may be used with subseq to destructively replace ++elements of a subsequence with elements ++taken from a sequence of new values. ++If the subsequence and the new sequence are not of equal length, ++the shorter length determines the number of elements that are ++replaced. The remaining elements at the end of the longer sequence ++are not modified in the operation. ++

++

Examples::

++ ++
++
 (setq str "012345") ⇒  "012345"
++ (subseq str 2) ⇒  "2345"
++ (subseq str 3 5) ⇒  "34"
++ (setf (subseq str 4) "abc") ⇒  "abc"
++ str ⇒  "0123ab"
++ (setf (subseq str 0 2) "A") ⇒  "A"
++ str ⇒  "A123ab"
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++Should be prepared to signal an error of type type-error ++ if new-subsequence is not a proper sequence. ++

++

See Also::

++ ++

replace ++

++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/subsetp.html +@@ -0,0 +1,125 @@ ++ ++ ++ ++ ++ ++subsetp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.48 subsetp [Function]

++ ++

subsetp list-1 list-2 &key key test test-notgeneralized-boolean ++

++

Arguments and Values::

++ ++

list-1—a proper list. ++

++

list-2—a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

subsetp returns true if every element of list-1 ++matches some element of list-2, ++and false otherwise. ++

++

Whether a list element is the same as another list element is ++determined by the functions specified by the keyword arguments. ++The first argument to the :test or :test-not ++function is ++typically ++part of an element of list-1 extracted by ++the :key function; the second argument is typically part of ++an element of list-2 extracted by ++the :key function. ++

++

The argument to the :key function is an element of either ++list-1 or list-2; the return value is part of the element ++of the supplied list element. ++If :key is not supplied or nil, ++the list-1 or list-2 ++element itself is supplied to the :test or :test-not ++function. ++

++

Examples::

++ ++
++
 (setq cosmos '(1 "a" (1 2))) ⇒  (1 "a" (1 2))
++ (subsetp '(1) cosmos) ⇒  true
++ (subsetp '((1 2)) cosmos) ⇒  false
++ (subsetp '((1 2)) cosmos :test 'equal) ⇒  true
++ (subsetp '(1 "A") cosmos :test #'equalp) ⇒  true
++ (subsetp '((1) (2)) '((1) (2))) ⇒  false
++ (subsetp '((1) (2)) '((1) (2)) :key #'car) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list-1 and list-2 are not proper lists. ++

++

See Also::

++ ++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/subst.html +@@ -0,0 +1,196 @@ ++ ++ ++ ++ ++ ++subst (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.12 subst, subst-if, subst-if-not, nsubst, nsubst-if, nsubst-if-not

++

[Function] ++

++

subst new old tree &key key test test-notnew-tree ++

++

subst-if new predicate tree &key keynew-tree ++

++

subst-if-not new predicate tree &key keynew-tree ++

++

nsubst new old tree &key key test test-notnew-tree ++

++

nsubst-if new predicate tree &key keynew-tree ++

++

nsubst-if-not new predicate tree &key keynew-tree ++

++

Arguments and Values::

++ ++

new—an object. ++

++

old—an object. ++

++

predicate—a symbol that names a function, ++ or a function of one argument ++ that returns a generalized boolean value. ++

++

tree—a tree. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

new-tree—a tree. ++

++

Description::

++ ++

subst, subst-if, and subst-if-not perform ++substitution operations on tree. ++Each function searches tree for occurrences of a ++particular old item of an element or subexpression that ++satisfies the test. ++

++

nsubst, nsubst-if, and nsubst-if-not are ++like subst, ++subst-if, and subst-if-not respectively, except that the ++original tree is modified. ++

++

subst makes a copy of tree, ++substituting new for every subtree or leaf of tree ++(whether the subtree or leaf is a car or a cdr of its parent) ++such that old and the subtree or leaf satisfy the test. ++

++

nsubst is a destructive version of subst. ++The list structure of ++tree is altered by destructively replacing with new ++each leaf of the tree such that old and the leaf ++satisfy the test. ++

++

For subst, subst-if, ++and subst-if-not, ++if the functions succeed, a new ++copy of the tree is returned in which each occurrence of such an ++element is replaced by the ++new element or subexpression. If no changes are made, the original ++tree may be returned. ++The original tree is left unchanged, but the result tree ++may share storage with it. ++

++

For nsubst, nsubst-if, ++and nsubst-if-not ++the original tree is modified and returned as the function result, ++but the result may not be eq to tree. ++

++

Examples::

++ ++
++
 (setq tree1 '(1 (1 2) (1 2 3) (1 2 3 4))) ⇒  (1 (1 2) (1 2 3) (1 2 3 4))
++ (subst "two" 2 tree1) ⇒  (1 (1 "two") (1 "two" 3) (1 "two" 3 4))
++ (subst "five" 5 tree1) ⇒  (1 (1 2) (1 2 3) (1 2 3 4))
++ (eq tree1 (subst "five" 5 tree1)) ⇒  implementation-dependent
++ (subst 'tempest 'hurricane
++        '(shakespeare wrote (the hurricane)))
++⇒  (SHAKESPEARE WROTE (THE TEMPEST))
++ (subst 'foo 'nil '(shakespeare wrote (twelfth night)))
++⇒  (SHAKESPEARE WROTE (TWELFTH NIGHT . FOO) . FOO)
++ (subst '(a . cons) '(old . pair)
++        '((old . spice) ((old . shoes) old . pair) (old . pair))
++        :test #'equal)
++⇒  ((OLD . SPICE) ((OLD . SHOES) A . CONS) (A . CONS))
++
++ (subst-if 5 #'listp tree1) ⇒  5
++ (subst-if-not '(x) #'consp tree1) 
++⇒  (1 X)
++
++ tree1 ⇒  (1 (1 2) (1 2 3) (1 2 3 4))
++ (nsubst 'x 3 tree1 :key #'(lambda (y) (and (listp y) (third y)))) 
++⇒  (1 (1 2) X X)
++ tree1 ⇒  (1 (1 2) X X)
++
++ ++

Side Effects::

++ ++

nsubst, nsubst-if, and nsubst-if-not ++might alter the tree structure of tree. ++

++

See Also::

++ ++

substitute ++, ++nsubstitute, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

The functions subst-if-not and nsubst-if-not are deprecated. ++

++

One possible definition of subst: ++

++
++
 (defun subst (old new tree &rest x &key test test-not key)
++   (cond ((satisfies-the-test old tree :test test
++                                 :test-not test-not :key key)
++         new)
++        ((atom tree) tree)
++        (t (let ((a (apply #'subst old new (car tree) x))
++                 (d (apply #'subst old new (cdr tree) x)))
++             (if (and (eql a (car tree))
++                      (eql d (cdr tree)))
++                 tree
++                 (cons a d))))))
++
++ ++
++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/substitute.html +@@ -0,0 +1,244 @@ ++ ++ ++ ++ ++ ++substitute (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++
++

17.3.19 substitute, substitute-if, substitute-if-not,

++

nsubstitute, nsubstitute-if, nsubstitute-if-not

++

[Function] ++

++

substitute newitem olditem sequence ++ &key from-end test ++ test-not start ++ end count key
++ ⇒ result-sequence ++

++

substitute-if newitem predicate sequence &key from-end start end count key
++ ⇒ result-sequence ++

++

substitute-if-not newitem predicate sequence &key from-end start end count key
++ ⇒ result-sequence ++

++

nsubstitute newitem olditem sequence ++ &key from-end test test-not start end count key
++ ⇒ sequence ++

++

nsubstitute-if newitem predicate sequence &key from-end start end count key
++ ⇒ sequence ++

++

nsubstitute-if-not newitem predicate sequence &key from-end start end count key
++ ⇒ sequence ++

++

Arguments and Values::

++ ++

newitem—an object. ++

++

olditem—an object. ++

++

sequence—a proper sequence. ++

++

predicate—a designator for a function of one argument ++ that returns a generalized boolean. ++

++

from-end—a generalized boolean. ++ The default is false. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

start, endbounding index designators of sequence. ++ The defaults for start and end are 0 and nil, respectively. ++

++

count—an integer or nil. ++

++

The default is nil. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-sequence—a sequence. ++

++

Description::

++ ++

substitute, substitute-if, and substitute-if-not ++return a ++copy of sequence in which each element ++that satisfies the test has been replaced with newitem. ++

++

nsubstitute, nsubstitute-if, and nsubstitute-if-not ++are like substitute, substitute-if, and ++substitute-if-not respectively, but they may modify ++sequence. ++

++

If ++sequence is a vector, the result is a ++vector that has the same ++actual array element type as sequence. ++The result might or might not be simple, and ++might or might not be identical ++to sequence. ++If sequence is a list, the result is a ++list. ++

++

Count, if supplied, limits the number of elements ++altered; if more than count elements satisfy the test, ++then of these elements only the leftmost or rightmost, depending ++on from-end, are replaced, ++as many as specified by count. ++

++

If count is supplied and negative, ++the behavior is as if zero had been supplied instead. ++

++

If count is nil, all matching items are affected. ++

++

Supplying a from-end of true matters only when the ++count is provided (and non-nil); ++in that case, ++only the rightmost count elements satisfying the test are removed ++(instead of the leftmost). ++

++

predicate, test, and test-not ++might be called more than once for each sequence element, ++and their side effects can happen in any order. ++

++

The result of all these functions is a sequence ++of the same type as sequence ++that has the same elements except that those in the subsequence ++bounded by start and end and satisfying the test ++have been replaced by newitem. ++

++

substitute, substitute-if, and substitute-if-not ++return a sequence which can share with sequence ++or may be identical to the input sequence ++if no elements need to be changed. ++

++

nsubstitute and nsubstitute-if are required to ++setf any car (if sequence is a list) ++or aref (if sequence is a vector) ++of sequence that is required to be replaced with newitem. ++If sequence is a list, ++none of the cdrs of the top-level list can be modified. ++

++

Examples::

++ ++
++
 (substitute #\. #\SPACE "0 2 4 6") ⇒  "0.2.4.6"
++ (substitute 9 4 '(1 2 4 1 3 4 5)) ⇒  (1 2 9 1 3 9 5)
++ (substitute 9 4 '(1 2 4 1 3 4 5) :count 1) ⇒  (1 2 9 1 3 4 5)
++ (substitute 9 4 '(1 2 4 1 3 4 5) :count 1 :from-end t)
++⇒  (1 2 4 1 3 9 5)
++ (substitute 9 3 '(1 2 4 1 3 4 5) :test #'>) ⇒  (9 9 4 9 3 4 5)
++
++ (substitute-if 0 #'evenp '((1) (2) (3) (4)) :start 2 :key #'car)
++⇒  ((1) (2) (3) 0)
++ (substitute-if 9 #'oddp '(1 2 4 1 3 4 5)) ⇒  (9 2 4 9 9 4 9)
++ (substitute-if 9 #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t)
++⇒  (1 2 4 1 3 9 5)
++
++ (setq some-things (list 'a 'car 'b 'cdr 'c)) ⇒  (A CAR B CDR C)
++ (nsubstitute-if "function was here" #'fboundp some-things
++                 :count 1 :from-end t) ⇒  (A CAR B "function was here" C)
++ some-things ⇒  (A CAR B "function was here" C)
++ (setq alpha-tester (copy-seq "ab ")) ⇒  "ab "
++ (nsubstitute-if-not #\z #'alpha-char-p alpha-tester) ⇒  "abz"
++ alpha-tester ⇒  "abz"
++
++ ++

Side Effects::

++ ++

nsubstitute, nsubstitute-if, and nsubstitute-if-not ++modify sequence. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++

++

See Also::

++ ++

subst ++, ++nsubst, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not argument is deprecated. ++

++

The functions substitute-if-not and nsubstitute-if-not are deprecated. ++

++

nsubstitute and nsubstitute-if can be used ++in for-effect-only positions in code. ++

++

Because the side-effecting variants (e.g., nsubstitute) ++potentially change the path that is being traversed, their effects in ++the presence of shared or circular structure may vary in surprising ways when ++compared to their non-side-effecting alternatives. To see this, ++consider the following side-effect behavior, which might be exhibited by ++some implementations: ++

++
++
 (defun test-it (fn)
++   (let ((x (cons 'b nil)))
++     (rplacd x x)
++     (funcall fn 'a 'b x :count 1)))
++ (test-it #'substitute) ⇒  (A . #1=(B . #1#))
++ (test-it #'nsubstitute) ⇒  (A . #1#)
++
++ ++
++
++

++Next: , Previous: , Up: Sequences Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/subtypep.html +@@ -0,0 +1,284 @@ ++ ++ ++ ++ ++ ++subtypep (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.26 subtypep [Function]

++ ++

subtypep type-1 type-2 &optional environmentsubtype-p, valid-p ++

++

Arguments and Values::

++ ++

type-1—a type specifier. ++

++

type-2—a type specifier. ++

++

environment—an environment object. ++ The default is nil, denoting the null lexical environment ++ and the current global environment. ++

++

subtype-p—a generalized boolean. ++

++

valid-p—a generalized boolean. ++

++

Description::

++ ++

If type-1 is a recognizable subtype of type-2, ++the first value is true. ++Otherwise, the first value is false, ++indicating that either ++ type-1 is not a subtype of type-2, or else ++ type-1 is a subtype of type-2 ++ but is not a recognizable subtype. ++

++

A second value is also returned indicating the ‘certainty’ of ++the first value. If this value is true, then the first ++value is an accurate indication of the subtype relationship. ++(The second value is always true when the first value ++ is true.) ++

++

Figure 4–9 summarizes the possible combinations of values ++that might result. ++

++
++
  Value 1  Value 2  Meaning                                               
++  true     true     type-1 is definitely a subtype of type-2.             
++  false    true     type-1 is definitely not a subtype of type-2.         
++  false    false    subtypep could not determine the relationship,        
++                    so type-1 might or might not be a subtype of type-2.  
++
++               Figure 4–9: Result possibilities for subtypep             
++
++
++ ++

subtypep is permitted to return the ++values false and false only when at least ++one argument involves one of these type specifiers: ++ and, ++ eql, ++ the list form of function, ++ member, ++ not, ++ or, ++ satisfies, ++or ++ values. ++(A type specifier ‘involves’ such a symbol if, ++ after being type expanded, ++ it contains that symbol in a position that would call for ++ its meaning as a type specifier to be used.) ++One consequence of this is that if neither type-1 nor type-2 ++involves any of these type specifiers, then subtypep is obliged ++to determine the relationship accurately. In particular, subtypep ++returns the values true and true ++if the arguments are equal and do not involve ++any of these type specifiers. ++

++

subtypep never returns a second value of nil when both ++type-1 and type-2 involve only ++ the names in Figure~4–2, or ++ names of types defined by defstruct, ++define-condition, ++ or defclass, or ++ derived types that expand into only those names. ++While type specifiers listed in Figure~4–2 and ++names of defclass and defstruct can in some cases be ++implemented as derived types, subtypep regards them as primitive. ++

++

The relationships between types reflected by subtypep ++are those specific to the particular implementation. For example, if ++an implementation supports only a single type of floating-point numbers, ++in that implementation (subtypep 'float 'long-float) ++returns the values true and true ++(since the two types are identical). ++

++

For all T1 and T2 other than *, ++(array T1) and (array T2) ++are two different type specifiers that always refer to the same sets of ++things if and only if they refer to arrays ++of exactly the same specialized representation, i.e., if (upgraded-array-element-type 'T1) and ++ (upgraded-array-element-type 'T2) ++return two different type specifiers that always refer to the same sets of ++objects. ++This is another way of saying that ++`(array type-specifier) ++and ++`(array ,(upgraded-array-element-type 'type-specifier)) ++refer to the same ++set of specialized array representations. ++For all T1 and T2 other than *, ++the intersection of ++ (array T1) ++and (array T2) is the empty set ++if and only if they refer to arrays of different, ++distinct specialized representations. ++

++

Therefore, ++

++
++
 (subtypep '(array T1) '(array T2)) ⇒  true
++
++ ++

if and only if ++

++
++
 (upgraded-array-element-type 'T1)  and
++ (upgraded-array-element-type 'T2)  
++
++ ++

return two different type specifiers that always refer to the same sets of ++objects. ++

++

For all type-specifiers T1 and T2 other than *, ++

++
++
 (subtypep '(complex T1) '(complex T2)) ⇒  true, true
++
++ ++

if: ++

++
1.
++

T1 is a subtype of T2, or ++

++
2.
++

(upgraded-complex-part-type 'T1) and ++ (upgraded-complex-part-type 'T2) ++ return two different type specifiers that always refer to the ++ same sets of objects; in this case, ++ (complex T1) and ++ (complex T2) both refer to the ++ same specialized representation. ++

++
++ ++

The values are false and true otherwise. ++

++

The form ++

++
++
 (subtypep '(complex single-float) '(complex float))
++
++ ++

must return true in all implementations, but ++

++
++
 (subtypep '(array single-float) '(array float))
++
++ ++

returns true only in implementations that do not have a specialized array ++representation for single floats distinct from that for other floats. ++

++

Examples::

++ ++
++
 (subtypep 'compiled-function 'function) ⇒  true, true
++ (subtypep 'null 'list) ⇒  true, true
++ (subtypep 'null 'symbol) ⇒  true, true
++ (subtypep 'integer 'string) ⇒  false, true
++ (subtypep '(satisfies dummy) nil) ⇒  false, implementation-dependent
++ (subtypep '(integer 1 3) '(integer 1 4)) ⇒  true, true
++ (subtypep '(integer (0) (0)) 'nil) ⇒  true, true
++ (subtypep 'nil '(integer (0) (0))) ⇒  true, true
++ (subtypep '(integer (0) (0)) '(member)) ⇒  true, true ;or false, false
++ (subtypep '(member) 'nil) ⇒  true, true ;or false, false
++ (subtypep 'nil '(member)) ⇒  true, true ;or false, false
++
++ ++

Let <aet-x> and <aet-y> be two distinct type specifiers that ++do not always refer to the same sets of ++objects ++in a given implementation, but for which ++make-array, will return an ++object of the same array type. ++

++

Thus, in each case, ++

++
++
  (subtypep (array-element-type (make-array 0 :element-type '<aet-x>))
++            (array-element-type (make-array 0 :element-type '<aet-y>)))
++⇒  true, true
++
++  (subtypep (array-element-type (make-array 0 :element-type '<aet-y>))
++            (array-element-type (make-array 0 :element-type '<aet-x>)))
++⇒  true, true
++
++ ++

If (array <aet-x>) ++and (array <aet-y>) are different names for ++exactly the same set of objects, ++these names should always refer to the same sets of ++objects. ++ That implies that the following set of tests are also true: ++

++
++
 (subtypep '(array <aet-x>) '(array <aet-y>)) ⇒  true, true
++ (subtypep '(array <aet-y>) '(array <aet-x>)) ⇒  true, true
++
++ ++

See Also::

++ ++

Types ++

++

Notes::

++ ++

The small differences between the subtypep specification for ++the array and complex types are necessary because there ++is no creation function for complexes which allows ++the specification of the resultant part type independently of ++the actual types of the parts. Thus in the case of the type complex, ++the actual type of the parts is referred to, although a number ++can be a member of more than one type. ++For example, 17 is of type (mod 18) ++as well as type (mod 256) and type integer; ++and 2.3f5 is of type single-float ++as well as type float. ++

++
++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/svref.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++svref (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.28 svref [Accessor]

++ ++

svref simple-vector indexelement ++

++

(setf ( svref simple-vector index) new-element)
++

++

Arguments and Values::

++ ++

simple-vector—a simple vector. ++

++

index—a valid array index for the simple-vector. ++

++

element, new-element—an object ++ (whose type is a subtype ++ of the array element type of the simple-vector). ++

++

Description::

++ ++

Accesses the element of simple-vector specified by index. ++

++

Examples::

++ ++
++
 (simple-vector-p (setq v (vector 1 2 'sirens))) ⇒  true
++ (svref v 0) ⇒  1
++ (svref v 2) ⇒  SIRENS
++ (setf (svref v 1) 'newcomer) ⇒  NEWCOMER               
++ v ⇒  #(1 NEWCOMER SIRENS)
++
++ ++

See Also::

++ ++

aref ++, ++sbit, ++schar, ++vector ++, ++

++

Compiler Terminology ++

++

Notes::

++ ++

svref is identical to aref ++except that it requires its first argument to be a simple vector. ++

++
++
 (svref v i) ≡ (aref (the simple-vector v) i)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/sxhash.html +@@ -0,0 +1,159 @@ ++ ++ ++ ++ ++ ++sxhash (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.14 sxhash [Function]

++ ++

sxhash objecthash-code ++

++

Arguments and Values::

++ ++

object—an object. ++

++

hash-code—a non-negative fixnum. ++

++

Description::

++ ++

sxhash returns a hash code for object. ++

++

The manner in which the hash code is computed is implementation-dependent, ++but subject to certain constraints: ++

++
++
1.
++

(equal x y) implies (= (sxhash x) (sxhash y)). ++

++
++
2.
++

For any two objects, x and y, ++ both of which are ++ bit vectors, ++ characters, ++ conses, ++ numbers, ++ pathnames, ++ strings, ++ or symbols, ++ and which are similar, ++ (sxhash x) and (sxhash y) ++ yield the same mathematical value ++ even if x and y exist in different Lisp images of ++ the same implementation. ++ See Literal Objects in Compiled Files. ++

++
++
3.
++

The hash-code for an object is always the same ++ within a single session provided that the object is not ++ visibly modified with regard to the equivalence test equal. ++ See Modifying Hash Table Keys. ++

++
++
4.
++

The hash-code is intended for hashing. This places no verifiable ++ constraint on a conforming implementation, but the intent is that ++ an implementation should make a good-faith effort to produce ++ hash-codes that are well distributed within the range of ++ non-negative fixnums. ++

++
++
5.
++

Computation of the hash-code must terminate, ++ even if the object contains circularities. ++

++
++ ++

Examples::

++ ++
++
 (= (sxhash (list 'list "ab")) (sxhash (list 'list "ab"))) ⇒  true
++ (= (sxhash "a") (sxhash (make-string 1 :initial-element #\a))) ⇒  true
++ (let ((r (make-random-state)))
++   (= (sxhash r) (sxhash (make-random-state r))))
++⇒  implementation-dependent
++
++ ++

Affected By::

++ ++

The implementation. ++

++

Notes::

++ ++

Many common hashing needs are satisfied by make-hash-table and the ++related functions on hash tables. sxhash is intended for use ++where the pre-defined abstractions are insufficient. Its main intent is to ++allow the user a convenient means of implementing more complicated hashing ++paradigms than are provided through hash tables. ++

++

The hash codes returned by sxhash are not necessarily related to ++any hashing strategy used by any other function in Common Lisp. ++

++

For objects of types that equal compares ++with eq, item 3 requires that the hash-code be ++based on some immutable quality of the identity of the object. ++Another legitimate implementation technique would be to have ++sxhash assign (and cache) a random hash code for these ++objects, since there is no requirement that similar but ++non-eq objects have the same hash code. ++

++

Although similarity is defined for symbols in terms ++of both the symbol’s name and the packages in which ++the symbol is accessible, item 3 disallows using package ++information to compute the hash code, since changes to the package status ++of a symbol are not visible to equal. ++

++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Hash Tables Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol.html +@@ -0,0 +1,185 @@ ++ ++ ++ ++ ++ ++symbol (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.1 symbol [System Class]

++ ++

Class Precedence List::

++

symbol, ++t ++

++

Description::

++ ++

Symbols are used for their object identity to name various entities ++in Common Lisp, including (but not limited to) linguistic entities such as ++variables and functions. ++

++

Symbols can be collected together into packages. ++A symbol is said to be interned in a package ++if it is accessible in that package; ++the same symbol can be interned in more than one package. ++If a symbol is not interned in any package, ++it is called uninterned. ++

++

An interned symbol is uniquely identifiable by its name from ++any package in which it is accessible. ++

++

Symbols have the following attributes. For historically reasons, ++these are sometimes referred to as cells, although the actual ++internal representation of symbols and their attributes is ++implementation-dependent. ++

++
++
Name
++

The name of a symbol is a string used to identify the symbol. ++Every symbol has a name, ++

++

and the consequences are undefined if that name is altered. ++

++

The name is used as part of the external, printed representation of ++the symbol; see Character Syntax. ++The function symbol-name returns the name of a given symbol. ++

++

A symbol may have any character in its name. ++

++
++
Package
++

The object in this cell is called the home package ++of the symbol. If the home package is nil, the symbol ++is sometimes said to have no home package. ++

++

When a symbol is first created, it has no home package. ++When it is first interned, the package in which it is ++initially interned becomes its home package. ++The home package of a symbol can be accessed ++by using the function symbol-package. ++

++

If a symbol is uninterned from the package ++which is its home package, its home package is set to nil. ++Depending on whether there is another package in which the symbol ++is interned, the symbol might or might not really be an uninterned symbol. ++A symbol with no home package is therefore called ++apparently uninterned. ++

++

The consequences are undefined if an attempt is made to alter the home package ++of a symbol ++external ++in the COMMON-LISP package or the KEYWORD package. ++

++
++
Property list
++

The property list of a symbol provides a mechanism for ++associating named attributes with that symbol. ++The operations for adding and removing entries are destructive ++to the property list. Common Lisp provides operators both for ++direct manipulation of property list objects ++ (e.g., see getf, remf, and symbol-plist) ++and for implicit manipulation of a symbol’s property list ++by reference to the symbol ++ (e.g., see get and remprop). ++The property list associated with a fresh symbol is ++initially null. ++

++
++
Value
++

If a symbol has a value attribute, it is said to be bound, ++and that fact can be detected by the function boundp. ++The object contained in the value cell of a bound symbol ++is the value of the global variable named by that symbol, ++and can be accessed by the function symbol-value. ++A symbol can be made to be unbound by the function makunbound. ++

++

The consequences are undefined if an attempt is made to change the value ++of a symbol that names a constant variable, or to make such a ++symbol be unbound. ++

++
++
Function
++

If a symbol has a function attribute, it is said to be fbound, ++and that fact can be detected by the function fboundp. ++If the symbol is the name of a function in the global environment, ++the function cell contains the function, ++and can be accessed by the function symbol-function. ++If the symbol is the name of either ++ a macro in the global environment (see macro-function) ++or a special operator (see special-operator-p), ++the symbol is fbound, ++and can be accessed by the function symbol-function, ++but the object which the function cell ++contains is of implementation-dependent type and purpose. ++A symbol can be made to be funbound by the function fmakunbound. ++

++

The consequences are undefined if an attempt is made to change the functional value ++of a symbol that names a special form. ++

++
++
++ ++

Operations on a symbol’s value cell and function cell are ++sometimes described in terms of their effect on the symbol itself, but ++the user should keep in mind that there is an intimate relationship between the ++contents of those cells and the global variable or ++global function definition, respectively. ++

++

Symbols are used as identifiers for lexical variables and ++lexical function definitions, but in that role, only their object ++identity is significant. Common Lisp provides no operation on a symbol that ++can have any effect on a lexical variable or ++on a lexical function definition. ++

++

See Also::

++ ++

Symbols as Tokens, ++Potential Numbers as Tokens, ++Printing Symbols ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol_002dfunction.html +@@ -0,0 +1,157 @@ ++ ++ ++ ++ ++ ++symbol-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.10 symbol-function [Accessor]

++ ++

symbol-function symbolcontents ++

++

(setf ( symbol-function symbol) new-contents)
++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

contents— ++

++

If the symbol is globally defined as a macro or a special operator, ++an object of implementation-dependent nature and identity is returned. ++If the symbol is not globally defined as ++ either a macro or a special operator, ++and ++ if the symbol is fbound, ++a function object is returned. ++

++

new-contents—a function. ++

++

Description::

++ ++

Accesses the symbol’s function cell. ++

++

Examples::

++ ++
++
 (symbol-function 'car) ⇒  #<FUNCTION CAR>
++ (symbol-function 'twice) is an error   ;because TWICE isn't defined.
++ (defun twice (n) (* n 2)) ⇒  TWICE
++ (symbol-function 'twice) ⇒  #<FUNCTION TWICE>
++ (list (twice 3)
++       (funcall (function twice) 3)
++       (funcall (symbol-function 'twice) 3))
++⇒  (6 6 6)
++ (flet ((twice (x) (list x x)))
++   (list (twice 3)
++         (funcall (function twice) 3)
++         (funcall (symbol-function 'twice) 3)))
++⇒  ((3 3) (3 3) 6)   
++ (setf (symbol-function 'twice) #'(lambda (x) (list x x)))
++⇒  #<FUNCTION anonymous>
++ (list (twice 3)
++       (funcall (function twice) 3)
++       (funcall (symbol-function 'twice) 3))
++⇒  ((3 3) (3 3) (3 3))
++ (fboundp 'defun) ⇒  true
++ (symbol-function 'defun)
++⇒  implementation-dependent
++ (functionp (symbol-function 'defun))
++⇒  implementation-dependent
++ (defun symbol-function-or-nil (symbol)
++   (if (and (fboundp symbol) 
++            (not (macro-function symbol))
++            (not (special-operator-p symbol)))
++       (symbol-function symbol)
++       nil)) ⇒  SYMBOL-FUNCTION-OR-NIL
++ (symbol-function-or-nil 'car) ⇒  #<FUNCTION CAR>
++ (symbol-function-or-nil 'defun) ⇒  NIL
++
++ ++

Affected By::

++ ++

defun ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

Should signal undefined-function if symbol is not fbound ++and an attempt is made to read its definition. (No such error is signaled ++on an attempt to write its definition.) ++

++

See Also::

++ ++

fboundp ++, ++fmakunbound ++, ++macro-function ++, ++

++

special-operator-p ++

++

Notes::

++

symbol-function cannot access the value of a lexical function name ++produced by flet or labels; it can access only ++the global function value. ++

++

setf may be used with ++symbol-function to replace a global function ++definition when the symbol’s function definition ++does not represent a special operator. ++

++
++
(symbol-function symbol) ≡ (fdefinition symbol)
++
++ ++

However, fdefinition accepts arguments other than just symbols. ++

++
++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol_002dmacrolet.html +@@ -0,0 +1,153 @@ ++ ++ ++ ++ ++ ++symbol-macrolet (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.14 symbol-macrolet [Special Operator]

++ ++

symbol-macrolet ({(symbol expansion )}*) ++ {declaration}* ++ {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

expansion—a form. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

symbol-macrolet provides a mechanism for ++affecting the macro expansion environment for symbols. ++

++

symbol-macrolet lexically establishes expansion functions ++for each of the symbol macros named by symbols. ++

++

The only guaranteed property of an expansion function for a symbol macro ++is that when it is applied to the form and the environment it returns ++the correct expansion. (In particular, it is implementation-dependent ++whether the expansion is conceptually stored in the expansion function, ++the environment, or both.) ++

++

Each reference to symbol as a variable within the lexical scope ++of symbol-macrolet is expanded by the normal macro expansion process; ++see Symbols as Forms. ++The expansion of a symbol macro is subject to further macro expansion ++in the same lexical environment as the symbol macro invocation, exactly ++analogous to normal macros. ++

++

Exactly the same declarations are allowed as for let ++with one exception: symbol-macrolet signals an error ++if a special declaration names one of the symbols ++being defined by symbol-macrolet. ++

++

When the forms of the symbol-macrolet form are expanded, ++any use of setq to set the value of one of the specified variables ++ is treated as if it were a setf. ++psetq of a symbol defined as a symbol macro ++ is treated as if it were a psetf, and ++multiple-value-setq ++ is treated as if it were a setf of values. ++

++

The use of symbol-macrolet can be shadowed by let. ++In other words, symbol-macrolet only substitutes for occurrences ++of symbol that would be in the scope of a lexical binding of ++symbol surrounding the forms. ++

++

Examples::

++ ++
++
;;; The following is equivalent to
++;;;   (list 'foo (let ((x 'bar)) x)),
++;;; not
++;;;   (list 'foo (let (('foo 'bar)) 'foo))
++ (symbol-macrolet ((x 'foo))
++   (list x (let ((x 'bar)) x))) 
++⇒  (foo bar)
++NOT⇒ (foo foo) 
++
++ (symbol-macrolet ((x '(foo x)))
++   (list x))
++⇒  ((FOO X))
++
++ ++

Exceptional Situations::

++ ++

If an attempt is made to bind a symbol that is defined as a global variable, ++an error of type program-error is signaled. ++

++

If declaration contains a special declaration ++that names one of the symbols being bound by symbol-macrolet, ++an error of type program-error is signaled. ++

++

See Also::

++ ++

with-slots ++, ++macroexpand ++

++

Notes::

++ ++

The special form symbol-macrolet is the basic mechanism that is used to ++implement with-slots. ++

++

If a symbol-macrolet form is a top level form, ++the forms are also processed as top level forms. ++See File Compilation. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol_002dname.html +@@ -0,0 +1,78 @@ ++ ++ ++ ++ ++ ++symbol-name (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.11 symbol-name [Function]

++ ++

symbol-name symbolname ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

name—a string. ++

++

Description::

++ ++

symbol-name returns the name of symbol. ++

++

The consequences are undefined if name is ever modified. ++

++

Examples::

++ ++
++
 (symbol-name 'temp) ⇒  "TEMP" 
++ (symbol-name :start) ⇒  "START"
++ (symbol-name (gensym)) ⇒  "G1234" ;for example
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol_002dpackage.html +@@ -0,0 +1,106 @@ ++ ++ ++ ++ ++ ++symbol-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.12 symbol-package [Function]

++ ++

symbol-package symbolcontents ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

contents—a package object or nil. ++

++

Description::

++ ++

Returns the home package of symbol. ++

++

Examples::

++ ++
++
 (in-package "CL-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (symbol-package 'car) ⇒  #<PACKAGE "COMMON-LISP">
++ (symbol-package 'bus) ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (symbol-package :optional) ⇒  #<PACKAGE "KEYWORD">
++ ;; Gensyms are uninterned, so have no home package.
++ (symbol-package (gensym)) ⇒  NIL
++ (make-package 'pk1) ⇒  #<PACKAGE "PK1">
++ (intern "SAMPLE1" "PK1") ⇒  PK1::SAMPLE1, NIL
++ (export (find-symbol "SAMPLE1" "PK1") "PK1") ⇒  T
++ (make-package 'pk2 :use '(pk1)) ⇒  #<PACKAGE "PK2">
++ (find-symbol "SAMPLE1" "PK2") ⇒  PK1:SAMPLE1, :INHERITED
++ (symbol-package 'pk1::sample1) ⇒  #<PACKAGE "PK1">
++ (symbol-package 'pk2::sample1) ⇒  #<PACKAGE "PK1">
++ (symbol-package 'pk1::sample2) ⇒  #<PACKAGE "PK1">
++ (symbol-package 'pk2::sample2) ⇒  #<PACKAGE "PK2">
++ ;; The next several forms create a scenario in which a symbol
++ ;; is not really uninterned, but is "apparently uninterned",
++ ;; and so SYMBOL-PACKAGE still returns NIL.
++ (setq s3 'pk1::sample3) ⇒  PK1::SAMPLE3
++ (import s3 'pk2) ⇒  T
++ (unintern s3 'pk1) ⇒  T
++ (symbol-package s3) ⇒  NIL
++ (eq s3 'pk2::sample3) ⇒  T
++
++ ++

Affected By::

++ ++

import, ++intern, ++unintern ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

intern ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol_002dplist.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++symbol-plist (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.13 symbol-plist [Accessor]

++ ++

symbol-plist symbolplist ++

++

(setf ( symbol-plist symbol) new-plist)
++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

plist, new-plist—a property list. ++

++

Description::

++ ++

Accesses the property list of symbol. ++

++

Examples::

++ ++
++
 (setq sym (gensym)) ⇒  #:G9723
++ (symbol-plist sym) ⇒  ()
++ (setf (get sym 'prop1) 'val1) ⇒  VAL1
++ (symbol-plist sym) ⇒  (PROP1 VAL1)
++ (setf (get sym 'prop2) 'val2) ⇒  VAL2
++ (symbol-plist sym) ⇒  (PROP2 VAL2 PROP1 VAL1)
++ (setf (symbol-plist sym) (list 'prop3 'val3)) ⇒  (PROP3 VAL3)
++ (symbol-plist sym) ⇒  (PROP3 VAL3)
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

See Also::

++ ++

get ++, ++remprop ++

++

Notes::

++ ++

The use of setf should be avoided, since a symbol’s ++property list is a global resource that can contain information ++established and depended upon by unrelated programs in the same Lisp image. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbol_002dvalue.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++symbol-value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.14 symbol-value [Accessor]

++ ++

symbol-value symbolvalue ++

++

(setf ( symbol-value symbol) new-value)
++

++

Arguments and Values::

++ ++

symbol—a symbol that must have a value. ++

++

value, new-value—an object. ++

++

Description::

++ ++

Accesses the symbol’s value cell. ++

++

Examples::

++ ++
++
 (setf (symbol-value 'a) 1) ⇒  1
++ (symbol-value 'a) ⇒  1
++ ;; SYMBOL-VALUE cannot see lexical variables.
++ (let ((a 2)) (symbol-value 'a)) ⇒  1
++ (let ((a 2)) (setq a 3) (symbol-value 'a)) ⇒  1
++ ;; SYMBOL-VALUE can see dynamic variables.
++ (let ((a 2)) 
++   (declare (special a)) 
++   (symbol-value 'a)) ⇒  2
++ (let ((a 2)) 
++   (declare (special a)) 
++   (setq a 3)
++   (symbol-value 'a)) ⇒  3
++ (let ((a 2))
++   (setf (symbol-value 'a) 3)
++   a) ⇒  2
++ a ⇒  3
++ (symbol-value 'a) ⇒  3
++ (let ((a 4))
++   (declare (special a))
++   (let ((b (symbol-value 'a)))
++     (setf (symbol-value 'a) 5)
++     (values a b))) ⇒  5, 4
++ a ⇒  3
++ (symbol-value :any-keyword) ⇒  :ANY-KEYWORD
++ (symbol-value 'nil) ⇒  NIL
++ (symbol-value '()) ⇒  NIL
++ ;; The precision of this next one is implementation-dependent.
++ (symbol-value 'pi) ⇒  3.141592653589793d0  
++
++ ++

Affected By::

++ ++

makunbound, ++set, ++setq ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if symbol is not a symbol. ++

++

Should signal unbound-variable if symbol is unbound ++and an attempt is made to read its value. (No such error is signaled ++on an attempt to write its value.) ++

++

See Also::

++ ++

boundp ++, ++makunbound ++, ++set ++, ++setq ++

++

Notes::

++ ++

symbol-value can be used to get the value of a constant variable. ++symbol-value cannot access the value of a lexical variable. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/symbolp.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++symbolp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Symbols Dictionary  

++
++
++

10.2.3 symbolp [Function]

++ ++

symbolp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type symbol; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (symbolp 'elephant) ⇒  true
++ (symbolp 12) ⇒  false
++ (symbolp nil) ⇒  true
++ (symbolp '()) ⇒  true
++ (symbolp :test) ⇒  true
++ (symbolp "hello") ⇒  false
++
++ ++

See Also::

++ ++

keywordp ++, ++symbol, ++typep ++

++

Notes::

++ ++
++
 (symbolp object) ≡ (typep object 'symbol)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/synonym_002dstream.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++synonym-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.7 synonym-stream [System Class]

++ ++

Class Precedence List::

++ ++

synonym-stream, ++stream, ++t ++

++

Description::

++ ++

A stream that is an alias for another stream, ++which is the value of a dynamic variable ++whose name is the synonym stream symbol of the synonym stream. ++

++

Any operations on a synonym stream will be performed ++on the stream that is then the value of the ++dynamic variable named by the synonym stream symbol. ++If the value of the variable should change, ++or if the variable should be bound, ++then the stream will operate on the new value of the variable. ++

++

See Also::

++ ++

make-synonym-stream ++, ++synonym-stream-symbol ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/synonym_002dstream_002dsymbol.html +@@ -0,0 +1,67 @@ ++ ++ ++ ++ ++ ++synonym-stream-symbol (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.39 synonym-stream-symbol [Function]

++ ++

synonym-stream-symbol synonym-streamsymbol ++

++

Arguments and Values::

++ ++

synonym-stream—a synonym stream. ++

++

symbol—a symbol. ++

++

Description::

++ ++

Returns the symbol whose symbol-value the synonym-stream is using. ++

++

See Also::

++ ++

make-synonym-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/t-_0028System-Class_0029.html +@@ -0,0 +1,59 @@ ++ ++ ++ ++ ++ ++t (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.16 t [System Class]

++ ++

Class Precedence List::

++

t ++

++

Description::

++

The set of all objects. ++The type t is a supertype of every type, ++including itself. Every object is of type t. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/t.html +@@ -0,0 +1,88 @@ ++ ++ ++ ++ ++ ++t (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.32 t [Constant Variable]

++ ++

Constant Value::

++ ++

t. ++

++

Description::

++ ++

The boolean representing true, ++and the canonical generalized boolean representing true. ++Although any object ++other than nil is considered true, ++t is generally used when there is no special reason ++to prefer one such object over another. ++

++

The symbol t is also sometimes used for other purposes as well. ++For example, ++ as the name of a class, ++ as a designator (e.g., a stream designator) ++ or as a special symbol for some syntactic reason ++ (e.g., in case and typecase to label the otherwise-clause). ++

++

Examples::

++ ++
++
 t ⇒  T 
++ (eq t 't) ⇒  true
++ (find-class 't) ⇒  #<CLASS T 610703333>
++ (case 'a (a 1) (t 2)) ⇒  1
++ (case 'b (a 1) (t 2)) ⇒  2
++ (prin1 'hello t)
++ |>  HELLO
++⇒  HELLO
++
++ ++

See Also::

++ ++

NIL ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/tagbody.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++tagbody (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.27 tagbody [Special Operator]

++ ++

tagbody {tag | statement}*nil ++

++

Arguments and Values::

++ ++

tag—a go tag; not evaluated. ++

++

statement—a compound form; evaluated as described below. ++

++

Description::

++ ++

Executes zero or more statements in a ++lexical environment ++that provides for control transfers to labels indicated by the tags. ++

++

The statements in a tagbody are evaluated in order ++from left to right, and their values are discarded. If at any time ++there are no remaining statements, tagbody returns nil. ++However, if (go tag) is evaluated, control jumps to the ++part of the body labeled with the tag. (Tags are compared with eql.) ++

++

A tag established by tagbody has lexical scope ++and has dynamic extent. Once tagbody has been exited, ++it is no longer valid to go to a tag in its body. ++It is permissible for go to jump to a tagbody that is ++not the innermost tagbody containing that go; ++the tags established by a tagbody only shadow ++other tags of like name. ++

++

The determination of which elements of the body are tags ++and which are statements is made prior to any macro expansion ++of that element. If a statement is a macro form and ++its macro expansion is an atom, that atom is treated ++as a statement, not a tag. ++

++

Examples::

++ ++
++
 (let (val)
++    (tagbody
++      (setq val 1)
++      (go point-a)
++      (incf val 16)
++     point-c
++      (incf val 04)
++      (go point-b)
++      (incf val 32)
++     point-a
++      (incf val 02)
++      (go point-c)
++      (incf val 64)
++     point-b
++      (incf val 08))
++    val)
++⇒  15
++ (defun f1 (flag)
++   (let ((n 1))
++     (tagbody 
++       (setq n (f2 flag #'(lambda () (go out))))
++      out
++       (prin1 n))))
++⇒  F1
++ (defun f2 (flag escape)
++   (if flag (funcall escape) 2))
++⇒  F2
++ (f1 nil)
++ |>  2
++⇒  NIL
++ (f1 t)
++ |>  1
++⇒  NIL
++
++ ++

See Also::

++ ++

go ++

++

Notes::

++ ++

The macros in Figure 5–10 have implicit tagbodies. ++

++
++
  do              do-external-symbols  dotimes  
++  do*             do-symbols           prog     
++  do-all-symbols  dolist               prog*    
++
++  Figure 5–10: Macros that have implicit tagbodies.
++
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/terpri.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++terpri (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.19 terpri, fresh-line [Function]

++ ++

terpri &optional output-streamnil ++

++

fresh-line &optional output-streamgeneralized-boolean ++

++

Arguments and Values::

++ ++

output-stream – an output stream designator. ++ The default is standard output. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

terpri outputs a newline to output-stream. ++

++

fresh-line is similar to terpri but outputs a newline ++only if the output-stream is not already at the start of a line. ++If for some reason this cannot be determined, then a newline is output anyway. ++fresh-line returns true if it outputs a newline; ++otherwise it returns false. ++

++

Examples::

++ ++
++
 (with-output-to-string (s)
++    (write-string "some text" s)
++    (terpri s)
++    (terpri s)
++    (write-string "more text" s))
++⇒  "some text
++
++more text"
++ (with-output-to-string (s)
++    (write-string "some text" s)
++    (fresh-line s)
++    (fresh-line s)
++    (write-string "more text" s))
++⇒  "some text
++more text"
++
++ ++

Side Effects::

++ ++

The output-stream is modified. ++

++

Affected By::

++ ++

*standard-output*, ++*terminal-io*. ++

++

Exceptional Situations::

++ ++

None. ++

++

[Reviewer Note by Barmar: What if stream is closed?] ++

++

Notes::

++ ++

terpri is identical in effect to ++

++
++
 (write-char #\Newline output-stream)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/the.html +@@ -0,0 +1,131 @@ ++ ++ ++ ++ ++ ++the (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.28 the [Special Operator]

++ ++

the value-type form{result}* ++

++

Arguments and Values::

++ ++

value-type—a type specifier; not evaluated. ++

++

form—a form; evaluated. ++

++

results—the values resulting from the evaluation of form. ++ These values must conform to the type supplied by value-type; ++ see below. ++

++

Description::

++ ++

the specifies that the values_{1a} returned by form ++are of the types specified by value-type. ++The consequences are undefined if any result ++is not of the declared type. ++

++

It is permissible for form to yield a different number of values ++than are specified by value-type, provided that the values ++for which types are declared are indeed of those types. ++Missing values are treated as nil for the purposes of checking their types. ++

++

Regardless of number of values declared by value-type, ++the number of values returned by the the special form is the same as ++the number of values returned by form. ++

++

Examples::

++ ++
++
 (the symbol (car (list (gensym)))) ⇒  #:G9876
++ (the fixnum (+ 5 7)) ⇒  12
++ (the (values) (truncate 3.2 2)) ⇒  1, 1.2
++ (the integer (truncate 3.2 2)) ⇒  1, 1.2
++ (the (values integer) (truncate 3.2 2)) ⇒  1, 1.2
++ (the (values integer float) (truncate 3.2 2))   ⇒  1, 1.2
++ (the (values integer float symbol) (truncate 3.2 2)) ⇒  1, 1.2
++ (the (values integer float symbol t null list) 
++      (truncate 3.2 2)) ⇒  1, 1.2
++ (let ((i 100))
++    (declare (fixnum i))
++    (the fixnum (1+ i))) ⇒  101
++ (let* ((x (list 'a 'b 'c))
++        (y 5))
++    (setf (the fixnum (car x)) y)
++    x) ⇒  (5 B C)
++
++ ++

Exceptional Situations::

++ ++

The consequences are undefined if ++the values yielded by the form ++are not of the type specified by value-type. ++

++

See Also::

++ ++

values ++

++

Notes::

++ ++

The values type specifier can be used to indicate the types ++of multiple values: ++

++
++
 (the (values integer integer) (floor x y))
++ (the (values string t)
++      (gethash the-key the-string-table))
++
++ ++

setf can be used with the type declarations. ++In this case the declaration is transferred to the form that ++specifies the new value. The resulting setf form ++is then analyzed. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/throw.html +@@ -0,0 +1,154 @@ ++ ++ ++ ++ ++ ++throw (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.28 throw [Special Operator]

++ ++

throw tag result-form ++ ⇒ #<NoValue> ++

Arguments and Values::

++ ++

tag—a catch tag; evaluated. ++

++

result-form—a form; evaluated as described below. ++

++

Description::

++ ++

throw causes a non-local control transfer ++to a catch whose tag is eq to tag. ++

++

Tag is evaluated first to produce an object ++called the throw tag; then result-form is evaluated, ++and its results are saved. If the result-form produces ++multiple values, then all the values are saved. ++The most recent outstanding catch ++whose tag is eq to the throw tag ++is exited; the saved results are returned as the value or ++values of catch. ++

++

The transfer of control initiated by throw is performed ++as described in Transfer of Control to an Exit Point. ++

++

Examples::

++ ++
++
 (catch 'result
++    (setq i 0 j 0)
++    (loop (incf j 3) (incf i)
++          (if (= i 3) (throw 'result (values i j))))) ⇒  3, 9
++
++
++ ++
++
 (catch nil 
++   (unwind-protect (throw nil 1)
++     (throw nil 2))) ⇒  2
++
++ ++

The consequences of the following are undefined ++because the catch of b ++is passed over by the first throw, ++hence portable programs must assume that ++its dynamic extent is terminated. ++The binding of the catch tag is not yet disestablished ++and therefore it is the target of the second throw. ++

++
++
 (catch 'a
++   (catch 'b
++     (unwind-protect (throw 'a 1)
++       (throw 'b 2))))
++
++ ++

The following prints “The inner catch returns :SECOND-THROW” ++and then returns :outer-catch. ++

++
++
 (catch 'foo
++         (format t "The inner catch returns ~s.~
++                 (catch 'foo
++                     (unwind-protect (throw 'foo :first-throw)
++                         (throw 'foo :second-throw))))
++         :outer-catch)
++ |>  The inner catch returns :SECOND-THROW
++⇒  :OUTER-CATCH
++
++ ++

Exceptional Situations::

++ ++

If there is no outstanding catch tag that matches the throw tag, ++no unwinding of the stack is performed, ++and an error of type control-error is signaled. ++When the error is signaled, ++the dynamic environment is that which was ++in force at the point of the throw. ++

++

See Also::

++ ++

block ++, ++catch ++, ++return-from ++, ++unwind-protect ++, ++Evaluation ++

++

Notes::

++ ++

catch and throw are normally used when the exit point ++must have dynamic scope (e.g., the throw is not lexically enclosed ++by the catch), while block and return are used ++when lexical scope is sufficient. ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/time.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++time (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

25.2.10 time [Macro]

++ ++

time form{result}* ++

++

Arguments and Values::

++ ++

form—a form; evaluated as described below. ++

++

results—the values returned by the form. ++

++

Description::

++ ++

time evaluates form in the current environment (lexical and dynamic). ++A call to time can be compiled. ++

++

time prints various timing data and other information to trace output. ++The nature and format of the printed information is implementation-defined. ++Implementations are encouraged to provide such information as ++ elapsed real time, ++ machine run time, ++ and storage management statistics. ++

++

Affected By::

++ ++

The accuracy of the results depends, among other things, on the accuracy ++of the corresponding functions provided by the underlying operating system. ++

++

The magnitude of the results may depend on ++ the hardware, ++ the operating system, ++ the lisp implementation, ++ and the state of the global environment. ++Some specific issues which frequently affect the outcome are ++ hardware speed, ++ nature of the scheduler (if any), ++ number of competing processes (if any), ++ system paging, ++ whether the call is interpreted or compiled, ++ whether functions called are compiled, ++ the kind of garbage collector involved and whether it runs, ++ whether internal data structures (e.g., hash tables) are implicitly reorganized, ++ etc. ++

++

See Also::

++ ++

get-internal-real-time ++, ++get-internal-run-time ++

++

Notes::

++ ++

In general, these timings are not guaranteed to be reliable enough for ++marketing comparisons. Their value is primarily heuristic, for tuning ++purposes. ++

++

For useful background information on the complicated issues involved in ++interpreting timing results, see Performance and Evaluation of Lisp Programs. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/trace.html +@@ -0,0 +1,148 @@ ++ ++ ++ ++ ++ ++trace (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++
++

25.2.8 trace, untrace [Macro]

++ ++

trace {function-name}*trace-result ++

++

untrace {function-name}*untrace-result ++

++

Arguments and Values::

++ ++

function-name—a function name. ++

++

trace-resultimplementation-dependent, ++ unless no function-names are supplied, ++ in which case trace-result is a list of function names. ++

++

untrace-resultimplementation-dependent. ++

++

Description::

++ ++

trace and untrace control the invocation of the trace facility. ++

++

Invoking trace with one or more function-names causes ++the denoted functions to be “traced.” ++Whenever a traced function is invoked, information ++ about the call, ++ about the arguments passed, ++ and about any eventually returned values ++is printed to trace output. ++If trace is used with no function-names, ++no tracing action is performed; ++instead, a list of the functions currently being traced is returned. ++

++

Invoking untrace with one or more function names causes those ++functions to be “untraced” (i.e., no longer traced). ++If untrace is used with no function-names, ++all functions currently being traced are untraced. ++

++

If a function to be traced has been open-coded ++(e.g., because it was declared inline), ++a call to that function might not produce trace output. ++

++

Examples::

++ ++
++
 (defun fact (n) (if (zerop n) 1 (* n (fact (- n 1)))))
++⇒  FACT
++ (trace fact)
++⇒  (FACT)
++;; Of course, the format of traced output is implementation-dependent.
++ (fact 3)
++ |>  1 Enter FACT 3
++ |>  | 2 Enter FACT 2
++ |>  |   3 Enter FACT 1
++ |>  |   | 4 Enter FACT 0
++ |>  |   | 4 Exit FACT 1
++ |>  |   3 Exit FACT 1
++ |>  | 2 Exit FACT 2
++ |>  1 Exit FACT 6
++⇒  6
++
++ ++

Side Effects::

++ ++

Might change the definitions of the functions named by function-names. ++

++

Affected By::

++ ++

Whether the functions named are defined or already being traced. ++

++

Exceptional Situations::

++ ++

Tracing an already traced function, ++or untracing a function not currently being traced, ++should produce no harmful effects, but might signal a warning. ++

++

See Also::

++ ++

*trace-output*, ++step ++

++

Notes::

++ ++

trace and untrace may also accept additional ++implementation-dependent argument formats. The format of the trace ++output is implementation-dependent. ++

++

Although trace can be extended to permit non-standard options, ++implementations are nevertheless encouraged (but not required) ++to warn about the use of syntax or options ++that are neither specified by this standard ++nor added as an extension by the implementation, ++since they could be symptomatic of typographical errors ++or of reliance on features supported in implementations ++other than the current implementation. ++

++
++
++

++Next: , Previous: , Up: Environment Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/translate_002dlogical_002dpathname.html +@@ -0,0 +1,134 @@ ++ ++ ++ ++ ++ ++translate-logical-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.15 translate-logical-pathname [Function]

++ ++

translate-logical-pathname pathname &keyphysical-pathname ++

++

Arguments and Values::

++ ++

pathname—a pathname designator, ++ or a logical pathname namestring. ++

++

physical-pathname—a physical pathname. ++

++

Description::

++ ++

Translates pathname to a physical pathname, which it returns. ++

++

If pathname is a stream, the ++stream can be either open or closed. ++translate-logical-pathname returns the same ++physical pathname after a ++ file is closed as it did when the file was open. ++

++

It is an error if pathname is a stream that is ++created with make-two-way-stream, ++make-echo-stream, ++make-broadcast-stream, ++make-concatenated-stream, make-string-input-stream, ++make-string-output-stream. ++

++

If pathname is a logical pathname namestring, ++the host portion of the ++logical pathname namestring and its following colon are required. ++

++

Pathname is first coerced to a pathname. ++If the coerced pathname is a physical pathname, it is returned. ++If the coerced pathname is a logical pathname, ++the first matching translation (according to pathname-match-p) ++of the logical pathname host is applied, as if by calling ++translate-pathname. If the result is ++ a logical pathname, this process is repeated. ++When the result is ++ finally a physical pathname, it is returned. ++ If no translation matches, an error ++is signaled. ++

++

translate-logical-pathname might perform additional translations, ++ typically to provide translation of file types to local naming ++ conventions, to accomodate physical file systems with limited length ++ names, or to deal with special character requirements such as ++ translating hyphens to underscores or uppercase letters to lowercase. ++ Any such additional translations are implementation-defined. Some ++ implementations do no additional translations. ++

++

There are no specified keyword arguments for ++translate-logical-pathname, ++but implementations are permitted to extend ++ it by adding keyword arguments. ++

++

Examples::

++ ++

See logical-pathname-translations. ++

++

Exceptional Situations::

++ ++

If pathname is incorrectly supplied, an error of type type-error is signaled. ++

++

If no translation matches, an error of type file-error is signaled. ++

++

[Editorial Note by KMP: Is file-error really right, or should it be pathname-error?] ++

++

See Also::

++ ++

logical-pathname ++, ++logical-pathname-translations ++, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++
++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/translate_002dpathname.html +@@ -0,0 +1,221 @@ ++ ++ ++ ++ ++ ++translate-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

19.4.16 translate-pathname [Function]

++ ++

translate-pathname source from-wildcard to-wildcard &key
++ ⇒ translated-pathname ++

++

Arguments and Values::

++ ++

source—a pathname designator. ++

++

from-wildcard—a pathname designator. ++

++

to-wildcard—a pathname designator. ++

++

translated-pathname—a pathname. ++

++

Description::

++ ++

translate-pathname translates source ++(that matches from-wildcard) into a corresponding pathname ++that matches to-wildcard, and returns the corresponding pathname. ++

++

The resulting pathname is to-wildcard with each wildcard or missing ++field replaced by a portion of source. A “wildcard field” is a ++pathname component with a value of :wild, a :wild element of a ++list-valued directory component, or an implementation-defined portion ++of a component, such as the "*" in the complex wildcard string ++"foo*bar" that some implementations support. An implementation that ++adds other wildcard features, such as regular expressions, must define ++how translate-pathname extends to those features. ++A “missing field” is a pathname component with a value of nil. ++

++

The portion of source ++that is copied into the resulting pathname is ++implementation-defined. Typically ++it is determined by the user interface conventions ++ of the file systems involved. Usually it is the portion of source ++ that matches a wildcard field of ++from-wildcard that is in the same ++ position as the wildcard or missing field of ++to-wildcard. If there ++ is no wildcard field in ++from-wildcard at that position, then usually ++ it is the entire corresponding ++pathname component of source, or in ++ the case of a ++list-valued directory component, the entire corresponding ++ list element. ++

++

During the copying of a portion of source into ++the resulting pathname, additional ++ implementation-defined translations of case or file naming ++ conventions might occur, especially when ++from-wildcard and ++ to-wildcard are for different hosts. ++

++

It is valid for ++ source to be a wild ++pathname; in general this will produce a wild ++ result. It ++is valid for from-wildcard and/or to-wildcard to be ++ non-wild pathnames. ++

++

There are no specified keyword arguments for ++translate-pathname, but ++ implementations are permitted to extend it by adding keyword arguments. ++

++

translate-pathname maps customary case in ++source into customary case in the output pathname. ++

++

Examples::

++ ++
++
 ;; The results of the following five forms are all implementation-dependent.
++ ;; The second item in particular is shown with multiple results just to 
++ ;; emphasize one of many particular variations which commonly occurs.
++ (pathname-name (translate-pathname "foobar" "foo*" "*baz")) ⇒  "barbaz"
++ (pathname-name (translate-pathname "foobar" "foo*" "*"))
++⇒  "foobar"
++OR⇒ "bar"
++ (pathname-name (translate-pathname "foobar" "*"    "foo*")) ⇒  "foofoobar"
++ (pathname-name (translate-pathname "bar"    "*"    "foo*")) ⇒  "foobar"
++ (pathname-name (translate-pathname "foobar" "foo*" "baz*")) ⇒  "bazbar"
++
++ (defun translate-logical-pathname-1 (pathname rules)
++   (let ((rule (assoc pathname rules :test #'pathname-match-p)))
++     (unless rule (error "No translation rule for ~A" pathname))
++     (translate-pathname pathname (first rule) (second rule))))
++ (translate-logical-pathname-1 "FOO:CODE;BASIC.LISP"
++                       '(("FOO:DOCUMENTATION;" "MY-UNIX:/doc/foo/")
++                         ("FOO:CODE;"          "MY-UNIX:/lib/foo/")
++                         ("FOO:PATCHES;*;"     "MY-UNIX:/lib/foo/patch/*/")))
++⇒  #P"MY-UNIX:/lib/foo/basic.l"
++
++;;;This example assumes one particular set of wildcard conventions
++;;;Not all file systems will run this example exactly as written
++ (defun rename-files (from to)
++   (dolist (file (directory from))
++     (rename-file file (translate-pathname file from to))))
++ (rename-files "/usr/me/*.lisp" "/dev/her/*.l")
++   ;Renames /usr/me/init.lisp to /dev/her/init.l
++ (rename-files "/usr/me/pcl*/*" "/sys/pcl/*/")
++   ;Renames /usr/me/pcl-5-may/low.lisp to /sys/pcl/pcl-5-may/low.lisp
++   ;In some file systems the result might be /sys/pcl/5-may/low.lisp
++ (rename-files "/usr/me/pcl*/*" "/sys/library/*/")
++   ;Renames /usr/me/pcl-5-may/low.lisp to /sys/library/pcl-5-may/low.lisp
++   ;In some file systems the result might be /sys/library/5-may/low.lisp
++ (rename-files "/usr/me/foo.bar" "/usr/me2/")
++   ;Renames /usr/me/foo.bar to /usr/me2/foo.bar
++ (rename-files "/usr/joe/*-recipes.text" "/usr/jim/cookbook/joe's-*-rec.text")
++   ;Renames /usr/joe/lamb-recipes.text to /usr/jim/cookbook/joe's-lamb-rec.text
++   ;Renames /usr/joe/pork-recipes.text to /usr/jim/cookbook/joe's-pork-rec.text
++   ;Renames /usr/joe/veg-recipes.text to /usr/jim/cookbook/joe's-veg-rec.text
++
++ ++

Exceptional Situations::

++ ++

If any of source, from-wildcard, or to-wildcard ++is not a pathname, a string, or a stream associated with a file ++an error of type type-error is signaled. ++

++

(pathname-match-p source from-wildcard) must ++be true or an error of type error is signaled. ++

++

See Also::

++ ++

namestring ++, ++pathname-host ++, ++

++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

The exact behavior of translate-pathname cannot be dictated ++by the Common Lisp language and must be allowed to vary, depending on the ++user interface conventions of the file systems involved. ++

++

The following is an implementation guideline. ++One file system performs this operation by ++ examining each piece of the three ++pathnames in turn, where a piece is a ++ pathname component or a ++list element of a structured component such as ++ a hierarchical directory. Hierarchical directory elements in ++ from-wildcard and ++to-wildcard are matched by whether they are ++ wildcards, not by depth in the directory hierarchy. If the piece in ++to-wildcard is present and not wild, it is copied into the result. ++ If the piece in to-wildcard is ++:wild or nil, the piece in source is ++ copied into the result. Otherwise, the piece in ++to-wildcard might be ++ a complex wildcard such as "foo*bar" and the piece in ++from-wildcard ++ should be wild; the portion of the piece in ++source that matches the ++ wildcard portion of the piece in ++from-wildcard replaces the wildcard ++ portion of the piece in ++to-wildcard and the value produced is used in ++ the result. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/tree_002dequal.html +@@ -0,0 +1,118 @@ ++ ++ ++ ++ ++ ++tree-equal (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conses Dictionary  

++
++
++

14.2.13 tree-equal [Function]

++ ++

tree-equal tree-1 tree-2 &key test test-notgeneralized-boolean ++

++

Arguments and Values::

++ ++

tree-1—a tree. ++

++

tree-2—a tree. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

tree-equal tests whether two trees are of the same shape ++and have the same leaves. ++tree-equal returns true if tree-1 and tree-2 are ++both atoms and satisfy the test, ++or if they are both conses and ++the car of tree-1 is tree-equal to ++the car of tree-2 and ++the cdr of tree-1 is tree-equal to ++the cdr of tree-2. ++Otherwise, tree-equal returns false. ++

++

tree-equal recursively compares conses but not any ++other objects that have components. ++

++

The first argument to the :test or :test-not ++function is tree-1 or a car or cdr of tree-1; ++the second argument is tree-2 or a car ++or cdr of tree-2. ++

++

Examples::

++ ++
++
 (setq tree1 '(1 (1 2))
++       tree2 '(1 (1 2))) ⇒  (1 (1 2))
++ (tree-equal tree1 tree2) ⇒  true
++ (eql tree1 tree2) ⇒  false
++ (setq tree1 '('a ('b 'c))
++       tree2 '('a ('b 'c))) ⇒  ('a ('b 'c)) 
++⇒  ((QUOTE A) ((QUOTE B) (QUOTE C)))
++ (tree-equal tree1 tree2 :test 'eq) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

The consequences are undefined ++if both tree-1 and tree-2 are circular. ++

++

See Also::

++ ++

equal ++, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/truename.html +@@ -0,0 +1,132 @@ ++ ++ ++ ++ ++ ++truename (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Files Dictionary  

++
++
++

20.2.4 truename [Function]

++ ++

truename filespectruename ++

++

Arguments and Values::

++ ++

filespec—a pathname designator. ++

++

truename—a physical pathname. ++

++

Description::

++ ++

truename tries to find the file indicated by ++filespec and returns its truename. ++If the filespec designator is an open stream, ++its associated file is used. ++

++

If filespec is a stream, ++truename can be used whether the stream ++is open or closed. It is permissible for truename ++to return more specific information after the stream ++is closed than when the stream was open. ++

++

If filespec is a pathname ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++

++

Examples::

++ ++
++
;; An example involving version numbers.  Note that the precise nature of
++;; the truename is implementation-dependent while the file is still open.
++ (with-open-file (stream ">vistor>test.text.newest")
++   (values (pathname stream)
++           (truename stream)))
++⇒  #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.1"
++OR⇒ #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.newest"
++OR⇒ #P"S:>vistor>test.text.newest", #P"S:>vistor>_temp_._temp_.1"
++
++;; In this case, the file is closed when the truename is tried, so the
++;; truename information is reliable.
++ (with-open-file (stream ">vistor>test.text.newest")
++   (close stream)
++   (values (pathname stream)
++           (truename stream)))
++⇒  #P"S:>vistor>test.text.newest", #P"S:>vistor>test.text.1"
++
++;; An example involving TOP-20's implementation-dependent concept 
++;; of logical devices -- in this case, "DOC:" is shorthand for
++;; "PS:<DOCUMENTATION>" ...
++ (with-open-file (stream "CMUC::DOC:DUMPER.HLP")
++   (values (pathname stream)
++           (truename stream)))
++⇒  #P"CMUC::DOC:DUMPER.HLP", #P"CMUC::PS:<DOCUMENTATION>DUMPER.HLP.13"
++
++ ++

Exceptional Situations::

++ ++

An error of type file-error is signaled if an appropriate file ++cannot be located within the file system for the given filespec, ++

++

or if the file system cannot perform the requested operation. ++

++

An error of type file-error is signaled if pathname is wild. ++

++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

truename may be used to account for any filename translations ++performed by the file system. ++

++
++
++

++Next: , Previous: , Up: Files Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/two_002dway_002dstream.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++two-way-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.8 two-way-stream [System Class]

++ ++

Class Precedence List::

++ ++

two-way-stream, ++stream, ++t ++

++

Description::

++ ++

A bidirectional composite stream that ++ receives its input from an associated input stream ++ and sends its output to an associated output stream. ++

++

See Also::

++ ++

make-two-way-stream ++, ++two-way-stream-input-stream ++, ++two-way-stream-output-stream ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/two_002dway_002dstream_002dinput_002dstream.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++two-way-stream-input-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.43 two-way-stream-input-stream, two-way-stream-output-stream

++

[Function] ++

++

two-way-stream-input-stream two-way-streaminput-stream ++

++

two-way-stream-output-stream two-way-streamoutput-stream ++

++

Arguments and Values::

++ ++

two-way-stream—a two-way stream. ++

++

input-stream—an input stream. ++

++

output-stream—an output stream. ++

++

Description::

++ ++

two-way-stream-input-stream returns the stream ++from which two-way-stream receives input. ++

++

two-way-stream-output-stream returns the stream ++to which two-way-stream sends output. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/type.html +@@ -0,0 +1,283 @@ ++ ++ ++ ++ ++ ++type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

3.8.21 type [Declaration]

++ ++

Syntax::

++ ++

(type typespec {var}*) ++

++

(typespec {var}*) ++

++

Arguments::

++ ++

typespec—a type specifier. ++

++

var—a variable name. ++

++

Valid Context::

++ ++

declaration or proclamation ++

++

Binding Types Affected::

++ ++

variable ++

++

Description::

++ ++

Affects ++only variable bindings and specifies that the ++vars take on ++values only of the specified typespec. ++In particular, values assigned to the variables by setq, ++as well as the initial values of the vars must be of ++the specified typespec. ++type declarations never apply to function bindings (see ftype). ++

++

A type declaration of a symbol ++defined by symbol-macrolet is equivalent ++to wrapping a the ++expression around the expansion of that symbol, ++

++

although the symbol’s macro expansion is not actually affected. ++

++

The meaning of a type declaration ++ is equivalent to changing each reference to ++a variable (var) within the scope of the ++ declaration to (the typespec var), ++changing each expression assigned to the ++ variable (new-value) within the scope of the declaration to ++(the typespec new-value), ++ and executing ++(the typespec var) at the moment the scope of the declaration ++ is entered. ++

++

A type declaration is valid in all declarations. The interpretation ++ of a type declaration is as follows: ++

++
1.
++

During the execution of any reference to the ++ declared variable within the scope of the declaration, the consequences ++are ++undefined ++if ++ the value of the declared variable is not of the declared type. ++

++
++
2.
++

During the execution of any ++setq of the declared variable within the scope ++ of the declaration, the consequences are ++undefined ++if the newly assigned value of the ++ declared variable is not of the declared type. ++

++
++
3.
++

At the moment the ++ scope of the declaration is entered, the consequences are ++undefined ++if the value of the ++ declared variable is not of the declared type. ++

++
++ ++

A type declaration affects only variable references within ++its scope. ++

++

If nested type declarations refer to the same variable, ++ then the value of the variable must be a member of the intersection of ++ the declared types. ++

++

If there is a local type declaration for a dynamic ++ variable, and there is also a global type proclamation for that same ++ variable, then the value of the variable within the scope of the local ++ declaration must be a member of the intersection of the two declared ++ types. ++

++

type declarations can be free declarations ++or bound declarations. ++

++

A symbol cannot be both the name of a type and the name of a ++declaration. Defining a symbol as the name of a class, ++structure, condition, or type, when the symbol ++has been declared as a declaration name, or vice versa, signals an error. ++

++

Within the lexical scope of an array type declaration, ++all references to array elements are assumed to satisfy the ++expressed array element type (as opposed to the upgraded array element type). ++A compiler can treat ++the code within the scope of the array type declaration as if each ++access of an array element were surrounded by an appropriate ++the form. ++

++

Examples::

++ ++
++
 (defun f (x y)
++   (declare (type fixnum x y))
++   (let ((z (+ x y)))
++     (declare (type fixnum z))
++     z)) ⇒  F
++ (f 1 2) ⇒  3
++ ;; The previous definition of F is equivalent to
++ (defun f (x y)
++   ;; This declaration is a shorthand form of the TYPE declaration
++   (declare (fixnum x y))
++   ;; To declare the type of a return value, it's not necessary to
++   ;; create a named variable.  A THE special form can be used instead.
++   (the fixnum (+ x y))) ⇒  F
++ (f 1 2) ⇒  3
++
++ ++
++
 (defvar *one-array* (make-array 10 :element-type '(signed-byte 5)))
++ (defvar *another-array* (make-array 10 :element-type '(signed-byte 8)))
++
++ (defun frob (an-array)
++   (declare (type (array (signed-byte 5) 1) an-array))
++   (setf (aref an-array 1) 31)
++   (setf (aref an-array 2) 127)
++   (setf (aref an-array 3) (* 2 (aref an-array 3)))
++   (let ((foo 0))
++     (declare (type (signed-byte 5) foo))
++     (setf foo (aref an-array 0))))
++
++ (frob *one-array*)
++ (frob *another-array*)
++
++ ++

The above definition of frob is equivalent to: ++

++
++
 (defun frob (an-array)
++   (setf (the (signed-byte 5) (aref an-array 1)) 31)
++   (setf (the (signed-byte 5) (aref an-array 2)) 127)
++   (setf (the (signed-byte 5) (aref an-array 3))
++         (* 2 (the (signed-byte 5) (aref an-array 3))))
++   (let ((foo 0))
++     (declare (type (signed-byte 5) foo))
++     (setf foo (the (signed-byte 5) (aref an-array 0)))))
++
++ ++

Given an implementation in which ++fixnums are 29 bits but fixnum arrays ++are upgraded to signed 32-bit arrays, ++the following ++could be compiled with all fixnum arithmetic: ++

++
++
 (defun bump-counters (counters)
++   (declare (type (array fixnum *) bump-counters))
++   (dotimes (i (length counters))
++     (incf (aref counters i))))
++
++ ++

See Also::

++ ++

declare, ++declaim ++, ++proclaim ++

++

Notes::

++ ++

(typespec {var}*) ++is an abbreviation for (type typespec {var}*). ++

++

A type declaration for the arguments to a function does not ++necessarily imply anything about the type of the result. The following ++function is not permitted to be compiled using implementation-dependent ++fixnum-only arithmetic: ++

++
++
 (defun f (x y) (declare (fixnum x y)) (+ x y))
++
++ ++

To see why, consider (f most-positive-fixnum 1). ++Common Lisp defines that F must return a bignum here, rather ++than signal an error or produce a mathematically incorrect result. ++If you have special knowledge such “fixnum overflow” cases will ++not come up, you can declare the result value to be in the fixnum ++range, enabling some compilers to use more efficient arithmetic: ++

++
++
 (defun f (x y)
++   (declare (fixnum x y))
++   (the fixnum (+ x y)))
++
++ ++

Note, however, that in the three-argument case, because of the possibility ++of an implicit intermediate value growing too large, the following will not ++cause implementation-dependent fixnum-only arithmetic to be used: ++

++
++
 (defun f (x y)
++   (declare (fixnum x y z))
++   (the fixnum (+ x y z)))
++
++ ++

To see why, consider (f most-positive-fixnum 1 -1). ++Although the arguments and the result are all fixnums, an intermediate ++value is not a fixnum. If it is important that ++implementation-dependent fixnum-only arithmetic be selected ++in implementations that provide it, ++consider writing something like this instead: ++

++
++
 (defun f (x y)
++   (declare (fixnum x y z))
++   (the fixnum (+ (the fixnum (+ x y)) z)))
++
++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/type_002derror.html +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++ ++type-error (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.29 type-error [Condition Type]

++ ++

Class Precedence List::

++

type-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type type-error represents a situation in which an object is not ++of the expected type. The “offending datum” and “expected type” are initialized ++by the initialization arguments named :datum and :expected-type to make-condition, ++and are accessed by the functions ++type-error-datum and type-error-expected-type. ++

++

See Also::

++ ++

type-error-datum ++, type-error-expected-type ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/type_002derror_002ddatum.html +@@ -0,0 +1,96 @@ ++ ++ ++ ++ ++ ++type-error-datum (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.30 type-error-datum, type-error-expected-type [Function]

++ ++

type-error-datum conditiondatum ++

++

type-error-expected-type conditionexpected-type ++

++

Arguments and Values::

++ ++

condition—a condition of type type-error. ++

++

datum—an object. ++

++

expected-type—a type specifier. ++

++

Description::

++ ++

type-error-datum returns the offending datum in the situation ++represented by the condition. ++

++

type-error-expected-type returns the expected type of the ++offending datum in the situation represented by the condition. ++

++

Examples::

++ ++
++
 (defun fix-digits (condition)
++   (check-type condition type-error)
++   (let* ((digits '(zero one two three four
++                   five six seven eight nine))
++         (val (position (type-error-datum condition) digits)))
++     (if (and val (subtypep 'fixnum (type-error-expected-type condition)))
++         (store-value 7))))
++
++ (defun foo (x)
++   (handler-bind ((type-error #'fix-digits))
++     (check-type x number)
++     (+ x 3)))
++
++ (foo 'seven)
++⇒  10
++
++ ++

See Also::

++ ++

type-error, ++Conditions ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/type_002dof.html +@@ -0,0 +1,187 @@ ++ ++ ++ ++ ++ ++type-of (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.27 type-of [Function]

++ ++

type-of objecttypespec ++

++

Arguments and Values::

++ ++

object—an object. ++

++

typespec—a type specifier. ++

++

Description::

++ ++

Returns a type specifier, typespec, for a type ++that has the object as an element. ++The typespec satisfies the following: ++

++
++
1.
++

For any object that is an element of some built-in type: ++

++
++
a.
++

the type returned is a recognizable subtype of that built-in type. ++

++
++
b.
++

the type returned does not involve ++ and, ++ eql, ++ member, ++ not, ++ or, ++ satisfies, ++ or values. ++

++
++ ++
++
2.
++

For all objects, (typep object (type-of object)) ++returns true. ++Implicit in this is that type specifiers which are ++not valid for use with typep, such as the list form of the ++function type specifier, are never returned by type-of. ++

++
++
3.
++

The type returned by type-of is always a recognizable subtype ++of the class returned by class-of. That is, ++

++
++
 (subtypep (type-of object) (class-of object)) ⇒  true, true
++
++ ++
++
4.
++

For objects of metaclass structure-class or standard-class, ++

++

and for conditions, ++

++

type-of returns the proper name of the class returned ++by class-of if it has a proper name, ++and otherwise returns the class itself. ++In particular, for objects created by the constructor function ++of a structure defined with defstruct without a :type option, ++type-of returns the structure name; and for objects created ++by make-condition, the typespec is the name of the ++condition type. ++

++
++
5.
++

For each of the types ++ short-float, ++ single-float, ++ double-float, ++ or long-float ++of which the object is an element, ++the typespec is a recognizable subtype of that type. ++

++
++
++ ++

Examples::

++ ++ ++
++
 (type-of 'a) ⇒  SYMBOL          
++ (type-of '(1 . 2))
++⇒  CONS
++OR⇒ (CONS FIXNUM FIXNUM)
++ (type-of #c(0 1))
++⇒  COMPLEX
++OR⇒ (COMPLEX INTEGER)
++ (defstruct temp-struct x y z) ⇒  TEMP-STRUCT
++ (type-of (make-temp-struct)) ⇒  TEMP-STRUCT
++ (type-of "abc")
++⇒  STRING
++OR⇒ (STRING 3)
++ (subtypep (type-of "abc") 'string) ⇒  true, true
++ (type-of (expt 2 40))
++⇒  BIGNUM
++OR⇒ INTEGER
++OR⇒ (INTEGER 1099511627776 1099511627776)
++OR⇒ SYSTEM::TWO-WORD-BIGNUM
++OR⇒ FIXNUM
++ (subtypep (type-of 112312) 'integer) ⇒  true, true
++ (defvar *foo* (make-array 5 :element-type t)) ⇒  *FOO*
++ (class-name (class-of *foo*)) ⇒  VECTOR
++ (type-of *foo*)
++⇒  VECTOR
++OR⇒ (VECTOR T 5)
++
++ ++

See Also::

++ ++

array-element-type ++, ++class-of ++, ++defstruct ++, ++typecase ++, ++typep ++, ++Types ++

++

Notes::

++ ++

Implementors are encouraged to arrange for type-of to return ++

++

a portable value. ++

++
++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/typecase.html +@@ -0,0 +1,235 @@ ++ ++ ++ ++ ++ ++typecase (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.47 typecase, ctypecase, etypecase [Macro]

++ ++

typecase keyform {!normal-clause}* [!otherwise-clause]{result}* ++

++

ctypecase keyplace {!normal-clause}*{result}* ++

++

etypecase keyform {!normal-clause}*{result}* ++

++

normal-clause ::=(type {form}*) ++

++

otherwise-clause ::=({otherwise | t} {form}*) ++

++

clause ::=normal-clause | otherwise-clause ++

++ ++ ++ ++ ++

Arguments and Values::

++ ++

keyform—a form; evaluated to produce a test-key. ++

++

keyplace—a form; evaluated initially to produce a test-key. ++ Possibly also used later as a place if no types match. ++

++

test-key—an object produced by evaluating keyform or keyplace. ++

++

type—a type specifier. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms ++ in the matching clause. ++

++

Description::

++ ++

These macros allow the conditional execution of a body of forms ++in a clause that is selected by matching the test-key on the basis ++of its type. ++

++

The keyform or keyplace is evaluated to produce the ++test-key. ++

++

Each of the normal-clauses is then considered in turn. ++If the test-key is of the type ++given by the clauses’s type, ++the forms in that clause are ++evaluated as an implicit progn, and the values ++it returns are returned as the value of the typecase, ++ctypecase, or etypecase form. ++

++

These macros differ only in their behavior when ++no normal-clause matches; specifically: ++

++
++
typecase
++

If no normal-clause matches, and there is an otherwise-clause, ++then that otherwise-clause automatically matches; the forms in ++that clause are evaluated as an implicit progn, ++and the values it returns are returned as the value of the typecase. ++

++

If there is no otherwise-clause, typecase returns nil. ++

++
++
ctypecase
++

If no normal-clause matches, ++a correctable error of type type-error is signaled. ++The offending datum is the test-key and ++the expected type is type equivalent to (or type1 type2 ...). ++The store-value restart can be used to correct the error. ++

++

If the store-value restart is invoked, its argument becomes the ++new test-key, and is stored in keyplace as if by ++(setf keyplace test-key). ++Then ctypecase starts over, considering each clause anew. ++

++

If the store-value restart is invoked interactively, ++the user is prompted for a new test-key to use. ++

++

The subforms of keyplace might be evaluated again if ++none of the cases holds. ++

++
++
etypecase
++

If no normal-clause matches, ++a non-correctable error of type type-error is signaled. ++The offending datum is the test-key and ++the expected type is type equivalent to (or type1 type2 ...). ++

++

Note that in contrast with ctypecase, ++the caller of etypecase may rely on the fact that etypecase ++does not return if a normal-clause does not match. ++

++
++
++ ++

In all three cases, is permissible for more than one clause to specify a ++matching type, particularly if one is a subtype of another; ++the earliest applicable clause is chosen. ++

++

Examples::

++ ++
++
;;; (Note that the parts of this example which use TYPE-OF 
++;;;  are implementation-dependent.)
++ (defun what-is-it (x)
++   (format t "~&~S is ~A.~
++           x (typecase x
++               (float "a float")
++               (null "a symbol, boolean false, or the empty list")
++               (list "a list")
++               (t (format nil "a(n) ~(~A~)" (type-of x))))))
++⇒  WHAT-IS-IT
++ (map 'nil #'what-is-it '(nil (a b) 7.0 7 box))
++ |>  NIL is a symbol, boolean false, or the empty list.
++ |>  (A B) is a list.
++ |>  7.0 is a float.
++ |>  7 is a(n) integer.
++ |>  BOX is a(n) symbol.
++⇒  NIL
++ (setq x 1/3)
++⇒  1/3
++ (ctypecase x
++     (integer (* x 4))
++     (symbol  (symbol-value x)))
++ |>  Error: The value of X, 1/3, is neither an integer nor a symbol.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use instead.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Use value: |>>3.7<<|
++ |>  Error: The value of X, 3.7, is neither an integer nor a symbol.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use instead.
++ |>   2: Return to Lisp Toplevel.
++ |>  Debug> |>>:CONTINUE 1<<|
++ |>  Use value: |>>12<<|
++⇒  48
++ x ⇒  12
++
++ ++

Affected By::

++ ++

ctypecase and etypecase, since they might signal an error, ++are potentially affected by existing handlers and *debug-io*. ++

++

Exceptional Situations::

++ ++

ctypecase and etypecase signal an error of type type-error ++if no normal-clause matches. ++

++

The compiler may choose to issue a warning of type style-warning ++if a clause will never be selected because it is completely ++shadowed by earlier clauses. ++

++

See Also::

++ ++

case ++, ++cond ++, ++setf ++, ++Generalized Reference ++

++

Notes::

++ ++
++
(typecase test-key
++  {(type {form}*)}*)
++≡
++(let ((#1=#:g0001 test-key))
++  (cond {((typep #1# 'type) {form}*)}*))
++
++ ++

The specific error message used by etypecase and ctypecase can vary ++between implementations. In situations where control of the specific wording ++of the error message is important, it is better to use typecase with an ++otherwise-clause that explicitly signals an error with an appropriate ++message. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/typep.html +@@ -0,0 +1,178 @@ ++ ++ ++ ++ ++ ++typep (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++
++

4.4.28 typep [Function]

++ ++

typep object type-specifier &optional environmentgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

type-specifier—any type specifier except ++

++

values, or a type specifier list ++whose first element is either function or values. ++

++

environment—an environment object. ++ The default is nil, denoting the null lexical environment ++ and the and current global environment. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of the type specified by type-specifier; ++otherwise, returns false. ++

++

A type-specifier of the form (satisfies fn) ++is handled by applying the function fn to object. ++

++

(typep object '(array type-specifier)), ++where type-specifier is not *, ++returns true if and only if object is an array ++that could be the result ++of supplying type-specifier ++as the :element-type argument to make-array. ++(array *) refers to all arrays ++regardless of element type, while (array type-specifier) ++refers only to those arrays ++that can result from giving type-specifier as the ++:element-type argument to make-array. ++A similar interpretation applies to (simple-array type-specifier) ++and (vector type-specifier). ++See Array Upgrading. ++

++

(typep object '(complex type-specifier)) ++returns true for all complex numbers that can result from ++giving numbers of type type-specifier ++to the function complex, plus all other complex numbers ++of the same specialized representation. ++Both the real and the imaginary parts of any such ++complex number must satisfy: ++

++
++
 (typep realpart 'type-specifier)
++ (typep imagpart 'type-specifier)
++
++ ++

See the function upgraded-complex-part-type. ++

++

Examples::

++ ++
++
 (typep 12 'integer) ⇒  true
++ (typep (1+ most-positive-fixnum) 'fixnum) ⇒  false
++ (typep nil t) ⇒  true
++ (typep nil nil) ⇒  false
++ (typep 1 '(mod 2)) ⇒  true
++ (typep #c(1 1) '(complex (eql 1))) ⇒  true
++;; To understand this next example, you might need to refer to
++;; Rule of Canonical Representation for Complex Rationals.
++ (typep #c(0 0) '(complex (eql 0))) ⇒  false
++
++ ++

Let A_x and A_y be two type specifiers that ++denote different types, but for which ++

++
++
 (upgraded-array-element-type 'A_x)
++
++ ++

and ++

++
++
 (upgraded-array-element-type 'A_y)
++
++ ++

denote the same type. Notice that ++

++
++
 (typep (make-array 0 :element-type 'A_x) '(array A_x)) ⇒  true
++ (typep (make-array 0 :element-type 'A_y) '(array A_y)) ⇒  true
++ (typep (make-array 0 :element-type 'A_x) '(array A_y)) ⇒  true
++ (typep (make-array 0 :element-type 'A_y) '(array A_x)) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

An error of type error is signaled if type-specifier is values, ++or a type specifier list whose first element is either ++function or values. ++

++

The consequences are undefined if ++the type-specifier is not a type specifier. ++

++

See Also::

++ ++

type-of ++, ++upgraded-array-element-type ++, ++upgraded-complex-part-type ++, ++Type Specifiers ++

++

Notes::

++ ++

Implementations are encouraged to recognize and optimize the case of ++(typep x (the class y)), ++since it does not involve any need for expansion ++of deftype information at runtime. ++

++
++
++
++
++ ++
++
++

++Next: , Previous: , Up: Types and Classes Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unbound_002dslot.html +@@ -0,0 +1,74 @@ ++ ++ ++ ++ ++ ++unbound-slot (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.40 unbound-slot [Condition Type]

++ ++

Class Precedence List::

++

unbound-slot, ++cell-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The object having the unbound slot is initialized by ++the :instance initialization argument to make-condition, ++and is accessed by the function unbound-slot-instance. ++

++

The name of the cell (see cell-error) is the name of the slot. ++

++

See Also::

++ ++

cell-error-name ++, ++unbound-slot-object, ++Condition System Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unbound_002dslot_002dinstance.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++unbound-slot-instance (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Objects Dictionary  

++
++
++

7.7.41 unbound-slot-instance [Function]

++ ++

unbound-slot-instance conditioninstance ++

++

Arguments and Values::

++ ++

condition—a condition of type unbound-slot. ++

++

instance—an object. ++

++

Description::

++ ++

Returns the instance which had the unbound slot in the situation ++represented by the condition. ++

++

See Also::

++ ++

cell-error-name ++, ++unbound-slot, ++Condition System Concepts ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unbound_002dvariable.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++unbound-variable (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Symbols Dictionary  

++
++
++

10.2.20 unbound-variable [Condition Type]

++ ++

Class Precedence List::

++

unbound-variable, ++cell-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type unbound-variable consists of error conditions ++that represent attempts to read the value of an unbound variable. ++

++

The name of the cell (see cell-error) is the name of the ++variable that was unbound. ++

++

See Also::

++ ++

cell-error-name ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/undefined_002dfunction.html +@@ -0,0 +1,76 @@ ++ ++ ++ ++ ++ ++undefined-function (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.69 undefined-function [Condition Type]

++ ++

Class Precedence List::

++

undefined-function, ++cell-error, ++error, ++serious-condition, ++condition, ++t ++

++

Description::

++ ++

The type undefined-function consists of error conditions ++that represent attempts to read the definition of an undefined function. ++

++

The name of the cell (see cell-error) is the function name ++which was funbound. ++

++

See Also::

++ ++

cell-error-name ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unexport.html +@@ -0,0 +1,107 @@ ++ ++ ++ ++ ++ ++unexport (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.14 unexport [Function]

++ ++

unexport symbols &optional packaget ++

++

Arguments and Values::

++ ++

symbols—a designator for a list of symbols. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

Description::

++ ++

unexport reverts external symbols in package to ++internal status; it undoes the effect of export. ++

++

unexport works only on symbols ++present ++in package, switching them back to internal status. ++If unexport is given a symbol that is ++already accessible as an internal symbol in package, ++it does nothing. ++

++

Examples::

++ ++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (export (intern "CONTRABAND" (make-package 'temp)) 'temp) ⇒  T
++ (find-symbol "CONTRABAND") ⇒  NIL, NIL 
++ (use-package 'temp) ⇒  T 
++ (find-symbol "CONTRABAND") ⇒  CONTRABAND, :INHERITED
++ (unexport 'contraband 'temp) ⇒  T
++ (find-symbol "CONTRABAND") ⇒  NIL, NIL
++
++ ++

Side Effects::

++ ++

Package system is modified. ++

++

Affected By::

++ ++

Current state of the package system. ++

++

Exceptional Situations::

++ ++

If unexport is given a symbol ++not accessible in package at all, ++an error of type package-error is signaled. ++

++

The consequences are undefined if package is the KEYWORD package ++or the COMMON-LISP package. ++

++

See Also::

++ ++

export ++, Package Concepts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unintern.html +@@ -0,0 +1,121 @@ ++ ++ ++ ++ ++ ++unintern (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.15 unintern [Function]

++ ++

unintern symbol &optional packagegeneralized-boolean ++

++

Arguments and Values::

++ ++

symbol—a symbol. ++

++

package—a package designator. ++

++

The default is the current package. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++

unintern removes symbol from package. ++If symbol is present in package, it is ++removed from package and also from package’s ++shadowing symbols list if it is present there. If package is the ++home package for symbol, symbol is made to have no ++home package. ++Symbol may continue to be accessible ++in package by inheritance. ++

++

Use of unintern can result in a symbol ++that has no ++recorded home package, ++but that in fact is accessible in some package. ++Common Lisp does not check for this pathological case, ++and such symbols ++are always printed preceded by #:. ++

++

unintern returns true if it removes symbol, and nil otherwise. ++

++

Examples::

++ ++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (setq temps-unpack (intern "UNPACK" (make-package 'temp))) ⇒  TEMP::UNPACK 
++ (unintern temps-unpack 'temp) ⇒  T
++ (find-symbol "UNPACK" 'temp) ⇒  NIL, NIL 
++ temps-unpack ⇒  #:UNPACK 
++
++ ++

Side Effects::

++ ++

unintern changes the state of the ++package system in such a way that the consistency rules do not hold ++across the change. ++

++

Affected By::

++

Current state of the package system. ++

++

Exceptional Situations::

++

Giving a shadowing symbol to unintern ++can uncover a name conflict that had ++previously been resolved by the shadowing. If package A uses packages ++B and C, A contains a shadowing symbol x, and B and C each contain external ++symbols named x, then removing the shadowing symbol x ++from A will reveal a name ++conflict between b:x and c:x if those two symbols are distinct. ++In this case unintern will signal an error. ++

++

See Also::

++ ++

Package Concepts ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/union.html +@@ -0,0 +1,170 @@ ++ ++ ++ ++ ++ ++union (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Conses Dictionary  

++
++
++

14.2.49 union, nunion [Function]

++ ++

union list-1 list-2 &key key test test-notresult-list ++

++

nunion list-1 list-2 &key key test test-notresult-list ++

++

Arguments and Values::

++ ++

list-1—a proper list. ++

++

list-2—a proper list. ++

++

test—a designator for a function of two arguments ++ that returns a generalized boolean. ++

++

test-not—a designator for ++ a function of two arguments ++ that returns a generalized boolean. ++

++

key—a designator for a function of one argument, ++ or nil. ++

++

result-list—a list. ++

++

Description::

++ ++

union and nunion return a list ++that contains every element that occurs in either list-1 ++or list-2. ++

++

For all possible ordered pairs consisting of one ++element from list-1 ++and one element from list-2, :test or :test-not is used ++to determine whether they satisfy the test. ++The first argument to the :test or :test-not ++function is the part of the element of list-1 extracted by the ++:key function (if supplied); the second argument ++is the part of the element of list-2 extracted by the ++:key function (if supplied). ++

++

The argument to the :key function is an element of ++list-1 or list-2; the return value is part of the supplied ++element. ++If :key is not supplied or nil, ++the element of list-1 or list-2 ++itself is supplied to the :test or :test-not function. ++

++

For every matching pair, ++one of the two elements of the pair will be in the result. Any ++element from either list-1 or list-2 ++that matches no element of the other will appear ++in the result. ++

++

If there is a duplication between list-1 ++and list-2, ++only one of the duplicate instances will be in the result. ++If either list-1 ++or list-2 has duplicate entries within it, ++the redundant entries ++might or might not appear in the result. ++

++

The order of elements in the result do not have to ++reflect the ordering of list-1 or list-2 in any way. ++The result list may be eq to either ++list-1 or list-2 if appropriate. ++

++

Examples::

++ ++
++
 (union '(a b c) '(f a d))
++⇒  (A B C F D)
++OR⇒ (B C F A D)
++OR⇒ (D F A B C)
++ (union '((x 5) (y 6)) '((z 2) (x 4)) :key #'car)
++⇒  ((X 5) (Y 6) (Z 2))
++OR⇒ ((X 4) (Y 6) (Z 2))
++
++ (setq lst1 (list 1 2 '(1 2) "a" "b")
++       lst2 (list 2 3 '(2 3) "B" "C"))
++⇒  (2 3 (2 3) "B" "C")
++ (nunion lst1 lst2)
++⇒  (1 (1 2) "a" "b" 2 3 (2 3) "B" "C") 
++OR⇒ (1 2 (1 2) "a" "b" "C" "B" (2 3) 3)
++
++ ++

Side Effects::

++ ++

nunion is permitted to modify any part, car or cdr, ++of the list structure of list-1 or list-2. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if list-1 and list-2 are not proper lists. ++

++

See Also::

++ ++

intersection ++, ++

++

Compiler Terminology, ++

++

Traversal Rules and Side Effects ++

++

Notes::

++ ++

The :test-not parameter is deprecated. ++

++

Since the nunion side effect is not required, ++it should not be used in for-effect-only positions in portable code. ++

++ ++ ++ ++ ++ ++
++
++

++Previous: , Up: Conses Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unread_002dchar.html +@@ -0,0 +1,126 @@ ++ ++ ++ ++ ++ ++unread-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.20 unread-char [Function]

++ ++

unread-char character &optional input-streamnil ++

++

Arguments and Values::

++ ++

character—a character; ++ must be the last character that was read from input-stream. ++

++

input-stream—an input stream designator. ++ The default is standard input. ++

++

Description::

++ ++

unread-char places character back onto the front of ++input-stream so that it will again be the next character ++in input-stream. ++

++

When input-stream is an echo stream, ++no attempt is made to undo any echoing of the character that might already ++have been done on input-stream. However, characters placed on ++input-stream by unread-char are marked in such a way ++as to inhibit later re-echo by read-char. ++

++

It is an error to invoke unread-char ++twice consecutively on the same stream ++without an intervening call to read-char ++(or some other input operation which implicitly reads characters) ++on that stream. ++

++

Invoking peek-char or read-char commits all previous characters. ++The consequences of invoking unread-char ++on any character preceding that which is returned by ++peek-char (including those passed over by ++peek-char that has a non-nil peek-type) ++are unspecified. ++In particular, the consequences of ++invoking unread-char after peek-char ++are unspecified. ++

++

Examples::

++ ++
++
 (with-input-from-string (is "0123")
++    (dotimes (i 6)
++      (let ((c (read-char is)))
++        (if (evenp i) (format t "~&~S ~S~
++ |>  0 #\0
++ |>  2 #\1
++ |>  4 #\2
++⇒  NIL
++
++ ++

Affected By::

++ ++

*standard-input*, ++*terminal-io*. ++

++

See Also::

++ ++

peek-char ++, ++read-char ++, ++Stream Concepts ++

++

Notes::

++ ++

unread-char is intended to be an efficient mechanism for allowing ++the Lisp reader and other parsers to perform one-character lookahead ++in input-stream. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unsigned_002dbyte.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++unsigned-byte (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.10 unsigned-byte [Type]

++ ++

Supertypes::

++ ++

unsigned-byte, ++signed-byte, ++integer, ++rational, ++

++

real, ++

++

number, ++t ++

++

Description::

++ ++

The atomic type specifier unsigned-byte denotes the same ++type as is denoted by the type specifier (integer 0 *). ++

++

Compound Type Specifier Kind::

++ ++

Abbreviating. ++

++

Compound Type Specifier Syntax::

++ ++

(unsigned-byte{[s | *]}) ++

++

Compound Type Specifier Arguments::

++ ++

s—a positive integer. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of non-negative integers that can be ++represented in a byte of size s (bits). ++This is equivalent ++to (mod m) for m=2^s, or ++to (integer 0 n) for n=2^s-1. ++The type unsigned-byte or ++the type (unsigned-byte *) is the same as ++the type (integer 0 *), the set of non-negative integers. ++

++

Notes::

++ ++

The type (unsigned-byte 1) is also called bit. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unuse_002dpackage.html +@@ -0,0 +1,99 @@ ++ ++ ++ ++ ++ ++unuse-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.17 unuse-package [Function]

++ ++

unuse-package packages-to-unuse &optional packaget ++

++

Arguments and Values::

++ ++

packages-to-unuse—a designator for ++ a list of package designators. ++

++

package—a package designator. ++ The default is the current package. ++

++

Description::

++ ++

unuse-package causes package to cease inheriting ++all the external symbols of ++packages-to-unuse; unuse-package undoes ++the effects of use-package. The ++packages-to-unuse ++are removed from the use list of package. ++

++

Any symbols that have been ++imported into package continue to be present in package. ++

++

Examples::

++ ++
++
 (in-package "COMMON-LISP-USER") ⇒  #<PACKAGE "COMMON-LISP-USER">
++ (export (intern "SHOES" (make-package 'temp)) 'temp) ⇒  T
++ (find-symbol "SHOES") ⇒  NIL, NIL
++ (use-package 'temp) ⇒  T
++ (find-symbol "SHOES") ⇒  SHOES, :INHERITED
++ (find (find-package 'temp) (package-use-list 'common-lisp-user)) ⇒  #<PACKAGE "TEMP">
++ (unuse-package 'temp) ⇒  T
++ (find-symbol "SHOES") ⇒  NIL, NIL
++
++ ++

Side Effects::

++ ++

The use list of package is modified. ++

++

Affected By::

++

Current state of the package system. ++

++

See Also::

++ ++

use-package ++, ++package-use-list ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/unwind_002dprotect.html +@@ -0,0 +1,237 @@ ++ ++ ++ ++ ++ ++unwind-protect (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.29 unwind-protect [Special Operator]

++ ++

unwind-protect protected-form {cleanup-form}*{result}* ++

++

Arguments and Values::

++ ++

protected-form—a form. ++

++

cleanup-form—a form. ++

++

results—the values of the protected-form. ++

++

Description::

++

unwind-protect evaluates protected-form ++and guarantees that cleanup-forms are executed ++before unwind-protect exits, ++whether it terminates ++normally or is aborted by a control transfer of some kind. ++unwind-protect is intended to be used ++to make sure that ++certain side effects take place after the evaluation of ++protected-form. ++

++

If a non-local exit occurs during execution of cleanup-forms, ++no special action is taken. The cleanup-forms of ++unwind-protect ++are not protected by that unwind-protect. ++

++

unwind-protect protects against all attempts to exit ++from protected-form, including ++ go, ++ handler-case, ++ ignore-errors, ++ restart-case, ++ return-from, ++ throw, ++ and with-simple-restart. ++

++

Undoing of handler and restart bindings during an exit ++happens in parallel with the undoing of the bindings of dynamic variables ++and catch tags, in the reverse order in which they were established. ++The effect of this is that cleanup-form sees the same handler ++and restart bindings, as well as dynamic variable bindings ++and catch tags, as were visible when the unwind-protect was entered. ++

++

Examples::

++
++
 (tagbody
++   (let ((x 3))
++     (unwind-protect
++       (if (numberp x) (go out))
++       (print x)))
++  out
++   ...)
++
++ ++

When go is executed, the call to print is executed first, ++and then the transfer of control to the tag out is completed. ++

++
++
 (defun dummy-function (x)
++    (setq state 'running)
++    (unless (numberp x) (throw 'abort 'not-a-number))
++    (setq state (1+ x))) ⇒  DUMMY-FUNCTION
++ (catch 'abort (dummy-function 1)) ⇒  2
++ state ⇒  2
++ (catch 'abort (dummy-function 'trash)) ⇒  NOT-A-NUMBER
++ state ⇒  RUNNING
++ (catch 'abort (unwind-protect (dummy-function 'trash) 
++                  (setq state 'aborted))) ⇒  NOT-A-NUMBER
++ state ⇒  ABORTED
++
++ ++

The following code ++is not correct: ++

++
++
 (unwind-protect
++   (progn (incf *access-count*)
++          (perform-access))
++   (decf *access-count*))
++
++ ++

If an exit occurs before completion of incf, ++the decf form is executed anyway, resulting in an ++incorrect value for *access-count*. ++The correct way to code this is as follows: ++

++
++
 (let ((old-count *access-count*))
++   (unwind-protect
++     (progn (incf *access-count*)
++            (perform-access))
++     (setq *access-count* old-count)))
++
++ ++
++
;;; The following returns 2.
++ (block nil   
++   (unwind-protect (return 1)
++     (return 2)))
++
++;;; The following has undefined consequences.
++ (block a    
++   (block b
++     (unwind-protect (return-from a 1)
++       (return-from b 2))))
++
++;;; The following returns 2.
++ (catch nil 
++   (unwind-protect (throw nil 1)
++     (throw nil 2)))
++
++;;; The following has undefined consequences because the catch of B is 
++;;; passed over by the first THROW, hence portable programs must assume 
++;;; its dynamic extent is terminated.  The binding of the catch tag is not
++;;; yet disestablished and therefore it is the target of the second throw.
++ (catch 'a
++   (catch 'b
++     (unwind-protect (throw 'a 1)
++       (throw 'b 2))))
++
++;;; The following prints "The inner catch returns :SECOND-THROW"
++;;; and then returns :OUTER-CATCH.
++ (catch 'foo
++         (format t "The inner catch returns ~s.~
++                 (catch 'foo
++                     (unwind-protect (throw 'foo :first-throw)
++                         (throw 'foo :second-throw))))
++         :outer-catch)
++
++;;; The following returns 10. The inner CATCH of A is passed over, but 
++;;; because that CATCH is disestablished before the THROW to A is executed,
++;;; it isn't seen.
++ (catch 'a
++   (catch 'b
++     (unwind-protect (1+ (catch 'a (throw 'b 1)))
++       (throw 'a 10))))
++
++;;; The following has undefined consequences because the extent of
++;;; the (CATCH 'BAR ...) exit ends when the (THROW 'FOO ...)
++;;; commences.
++ (catch 'foo
++   (catch 'bar
++       (unwind-protect (throw 'foo 3)
++         (throw 'bar 4)
++         (print 'xxx))))
++
++;;; The following returns 4; XXX is not printed.
++;;; The (THROW 'FOO ...) has no effect on the scope of the BAR
++;;; catch tag or the extent of the (CATCH 'BAR ...) exit.
++ (catch 'bar
++   (catch 'foo
++       (unwind-protect (throw 'foo 3)
++         (throw 'bar 4)
++         (print 'xxx))))
++
++;;; The following prints 5.
++ (block nil
++   (let ((x 5))
++     (declare (special x))
++     (unwind-protect (return)
++       (print x))))          
++
++ ++

See Also::

++ ++

catch ++, ++go ++, ++handler-case ++, ++restart-case ++, ++return ++, ++return-from ++, ++throw ++, ++Evaluation ++

++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/update_002dinstance_002dfor_002ddifferent_002dclass.html +@@ -0,0 +1,157 @@ ++ ++ ++ ++ ++ ++update-instance-for-different-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.6 update-instance-for-different-class [Standard Generic Function]

++ ++

Syntax::

++ ++

update-instance-for-different-class previous current ++ &rest initargs ++ &key &allow-other-keysimplementation-dependent ++

++

Method Signatures::

++ ++

update-instance-for-different-class (previous standard-object) ++ (current standard-object) ++ &rest initargs ++

++

Arguments and Values::

++ ++

previous—a copy of the original instance. ++

++

current—the original instance (altered). ++

++

initargs—an initialization argument list. ++

++

Description::

++ ++

The generic function update-instance-for-different-class is not ++intended to be called by programmers. Programmers may write ++methods for it. The function update-instance-for-different-class ++is called only by the function change-class. ++

++

The system-supplied primary method on ++update-instance-for-different-class checks the validity of ++initargs and signals an error if an initarg ++is supplied that is not declared as valid. This method then ++initializes slots with values according to the initargs, ++and initializes the newly added slots with values according ++to their :initform forms. It does this by calling the generic ++function shared-initialize with the following arguments: the ++instance (current), ++a list of names of the newly added slots, and the initargs ++it received. Newly added slots are those local slots for which ++no slot of the same name exists in the previous class. ++

++

Methods for update-instance-for-different-class can be defined to ++specify actions to be taken when an instance is updated. If only ++after methods for update-instance-for-different-class are ++defined, they will be run after the system-supplied primary method for ++initialization and therefore will not interfere with the default ++behavior of update-instance-for-different-class. ++

++

Methods on update-instance-for-different-class can be defined to ++initialize slots differently from change-class. The default ++behavior of change-class is described in ++Changing the Class of an Instance. ++

++

The arguments to update-instance-for-different-class are ++computed by change-class. When change-class is invoked on ++an instance, a copy of that instance is made; change-class then ++destructively alters the original instance. The first argument to ++update-instance-for-different-class, previous, is that ++copy; it holds the old slot values temporarily. This argument has ++dynamic extent within change-class; if it is referenced in any ++way once update-instance-for-different-class returns, the ++results are undefined. The second argument to ++update-instance-for-different-class, current, is the altered ++original instance. ++The intended use of previous is to extract old slot values by using ++slot-value or with-slots or by invoking ++a reader generic function, or to run other methods that were applicable to ++instances of ++the original class. ++

++

Examples::

++ ++

See the example for the function change-class. ++

++

Exceptional Situations::

++

The system-supplied primary method on ++update-instance-for-different-class signals an error if an ++initialization argument is supplied that is not declared as valid. ++

++

See Also::

++ ++

change-class ++, ++Shared-Initialize ++, ++Changing the Class of an Instance, ++Rules for Initialization Arguments, ++Declaring the Validity of Initialization Arguments ++

++

Notes::

++ ++

Initargs are declared as valid by using the :initarg ++option to defclass, or by defining methods ++for update-instance-for-different-class or shared-initialize. ++The keyword name of each keyword parameter specifier in the lambda list of ++any method defined on update-instance-for-different-class ++or shared-initialize is declared as a valid initarg name ++for all classes for which that method is applicable. ++

++

The value returned by update-instance-for-different-class is ++ignored by change-class. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/update_002dinstance_002dfor_002dredefined_002dclass.html +@@ -0,0 +1,205 @@ ++ ++ ++ ++ ++ ++update-instance-for-redefined-class (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.7 update-instance-for-redefined-class [Standard Generic Function]

++ ++

Syntax::

++ ++

update-instance-for-redefined-class instance ++ added-slots discarded-slots ++ property-list ++ &rest initargs &key &allow-other-keys
++ ⇒ {result}* ++

++

Method Signatures::

++ ++

update-instance-for-redefined-class (instance standard-object) ++ added-slots discarded-slots ++ property-list ++ &rest initargs ++

++

Arguments and Values::

++ ++

instance—an object. ++

++

added-slots—a list. ++

++

discarded-slots—a list. ++

++

property-list—a list. ++

++

initargs—an initialization argument list. ++

++

result—an object. ++

++

Description::

++ ++

The generic function update-instance-for-redefined-class ++is not intended to be called by programmers. Programmers may write ++methods for it. The generic function ++update-instance-for-redefined-class is called by the mechanism ++activated by make-instances-obsolete. ++

++

The system-supplied primary method on ++update-instance-for-redefined-class checks the validity of ++initargs and signals an error if an initarg ++is supplied that is not declared as valid. This method then ++initializes slots with values according to the initargs, ++and initializes the newly added-slots with values according ++to their :initform forms. It does this by calling the generic ++function shared-initialize with the following arguments: ++the instance, ++a list of names of the newly added-slots to instance, ++and the initargs ++it received. Newly added-slots are those local slots for which ++no slot of the same name exists in the old version of the class. ++

++

When make-instances-obsolete is invoked or when a class has been ++redefined and an instance is being updated, a property-list is created ++that captures the slot names and values of all the discarded-slots with ++values in the original instance. The structure of the ++instance is ++transformed so that it conforms to the current class definition. The ++arguments to update-instance-for-redefined-class are this ++transformed instance, a list of added-slots to the ++instance, a list discarded-slots from the ++instance, and the property-list ++containing the slot names and values for ++slots that were discarded and had values. Included in this list of ++discarded slots are slots that were local in the old class and are ++shared in the new class. ++

++

The value returned by update-instance-for-redefined-class is ignored. ++

++

Examples::

++ ++
++
++
++ (defclass position () ())
++
++ (defclass x-y-position (position)
++     ((x :initform 0 :accessor position-x)
++      (y :initform 0 :accessor position-y)))
++
++;;; It turns out polar coordinates are used more than Cartesian 
++;;; coordinates, so the representation is altered and some new
++;;; accessor methods are added.
++
++ (defmethod update-instance-for-redefined-class :before
++    ((pos x-y-position) added deleted plist &key)
++   ;; Transform the x-y coordinates to polar coordinates
++   ;; and store into the new slots.
++   (let ((x (getf plist 'x))
++         (y (getf plist 'y)))
++     (setf (position-rho pos) (sqrt (+ (* x x) (* y y)))
++           (position-theta pos) (atan y x))))
++
++ (defclass x-y-position (position)
++     ((rho :initform 0 :accessor position-rho)
++      (theta :initform 0 :accessor position-theta)))
++
++;;; All instances of the old x-y-position class will be updated
++;;; automatically.
++
++;;; The new representation is given the look and feel of the old one.
++
++ (defmethod position-x ((pos x-y-position))  
++    (with-slots (rho theta) pos (* rho (cos theta))))
++
++ (defmethod (setf position-x) (new-x (pos x-y-position))
++    (with-slots (rho theta) pos
++      (let ((y (position-y pos)))
++        (setq rho (sqrt (+ (* new-x new-x) (* y y)))
++              theta (atan y new-x))
++        new-x)))
++
++ (defmethod position-y ((pos x-y-position))
++    (with-slots (rho theta) pos (* rho (sin theta))))
++
++ (defmethod (setf position-y) (new-y (pos x-y-position))
++    (with-slots (rho theta) pos
++      (let ((x (position-x pos)))
++        (setq rho (sqrt (+ (* x x) (* new-y new-y)))
++              theta (atan new-y x))
++        new-y)))
++
++
++ ++

Exceptional Situations::

++

The system-supplied primary method on ++update-instance-for-redefined-class signals an error if an ++initarg is supplied that is not declared as valid. ++

++

See Also::

++ ++

make-instances-obsolete ++, ++Shared-Initialize ++, ++Redefining Classes, ++Rules for Initialization Arguments, ++Declaring the Validity of Initialization Arguments ++

++

Notes::

++ ++

Initargs are declared as valid by using the :initarg ++option to defclass, or by defining methods for ++update-instance-for-redefined-class or shared-initialize. ++The keyword name of each keyword parameter specifier in the lambda list of ++any method defined on ++update-instance-for-redefined-class or ++shared-initialize is declared as a valid initarg name ++for all classes for which that method is applicable. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/upgraded_002darray_002delement_002dtype.html +@@ -0,0 +1,105 @@ ++ ++ ++ ++ ++ ++upgraded-array-element-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.23 upgraded-array-element-type [Function]

++ ++

upgraded-array-element-type typespec &optional environmentupgraded-typespec ++

++

Arguments and Values::

++ ++

typespec—a type specifier. ++

++

environment—an environment object. ++ The default is nil, denoting the null lexical environment ++ and the current global environment. ++

++

upgraded-typespec—a type specifier. ++

++

Description::

++ ++

Returns the element type of ++the most specialized array representation capable of ++holding items of the type denoted by typespec. ++

++

The typespec is a subtype of ++(and possibly type equivalent to) ++the upgraded-typespec. ++

++

If typespec is bit, ++ the result is type equivalent to bit. ++

++

If typespec is base-char, ++ the result is type equivalent to base-char. ++

++

If typespec is character, ++ the result is type equivalent to character. ++

++

The purpose of upgraded-array-element-type is to reveal how ++an implementation does its upgrading. ++

++

The environment is used to expand any derived type specifiers ++that are mentioned in the typespec. ++

++

See Also::

++ ++

array-element-type ++, ++make-array ++

++

Notes::

++ ++

Except for storage allocation consequences and dealing correctly with the ++optional environment argument, ++upgraded-array-element-type could be defined as: ++

++
++
 (defun upgraded-array-element-type (type &optional environment)
++   (array-element-type (make-array 0 :element-type type)))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/upgraded_002dcomplex_002dpart_002dtype.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++upgraded-complex-part-type (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.51 upgraded-complex-part-type [Function]

++ ++

upgraded-complex-part-type typespec &optional environmentupgraded-typespec ++

++

Arguments and Values::

++ ++

typespec—a type specifier. ++

++

environment—an environment object. ++ The default is nil, denoting the null lexical environment ++ and the and current global environment. ++

++

upgraded-typespec—a type specifier. ++

++

Description::

++ ++

upgraded-complex-part-type returns the part type of the ++most specialized complex number representation that can ++hold parts of type typespec. ++

++

The typespec is a subtype of ++(and possibly type equivalent to) ++the upgraded-typespec. ++

++

The purpose of upgraded-complex-part-type ++is to reveal how an implementation does its upgrading. ++

++

See Also::

++ ++

complex ++ (function and type) ++

++

Notes::

++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/upper_002dcase_002dp.html +@@ -0,0 +1,103 @@ ++ ++ ++ ++ ++ ++upper-case-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Characters Dictionary  

++
++
++

13.2.15 upper-case-p, lower-case-p, both-case-p [Function]

++ ++

upper-case-p charactergeneralized-boolean ++

++

lower-case-p charactergeneralized-boolean ++

++

both-case-p charactergeneralized-boolean ++

++

Arguments and Values::

++ ++

character—a character. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

These functions test the case of a given character. ++

++

upper-case-p returns true if character is an uppercase character; ++otherwise, returns false. ++

++

lower-case-p returns true if character is a lowercase character; ++otherwise, returns false. ++

++

both-case-p returns true if character is a character with case; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (upper-case-p #\A) ⇒  true
++ (upper-case-p #\a) ⇒  false
++ (both-case-p #\a) ⇒  true
++ (both-case-p #\5) ⇒  false
++ (lower-case-p #\5) ⇒  false
++ (upper-case-p #\5) ⇒  false
++ ;; This next example presupposes an implementation 
++ ;; in which #\Bell is an implementation-defined character.
++ (lower-case-p #\Bell) ⇒  false
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if character is not a character. ++

++

See Also::

++ ++

char-upcase ++, ++char-downcase, ++Characters With Case, ++Documentation of Implementation-Defined Scripts ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/use_002dpackage.html +@@ -0,0 +1,123 @@ ++ ++ ++ ++ ++ ++use-package (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.18 use-package [Function]

++ ++

use-package packages-to-use &optional packaget ++

++

Arguments and Values::

++ ++

packages-to-use—a designator for ++ a list of package designators. ++ The KEYWORD package may not be supplied. ++

++

package—a package designator. ++ The KEYWORD package cannot be supplied. ++ The default is the current package. ++

++

Description::

++ ++

use-package causes package to inherit all the ++external symbols of packages-to-use. ++The inherited symbols become accessible as ++internal symbols of package. ++

++

Packages-to-use are added to the use list of package ++if they are not there already. All external symbols in ++packages-to-use become accessible in package ++as internal symbols. ++use-package does not cause any new symbols to be present ++in package but only makes them accessible by inheritance. ++

++

use-package checks for ++name conflicts between the newly imported symbols and those already ++accessible in package. ++A name conflict in use-package ++between two external symbols inherited ++by package from packages-to-use may be resolved in favor of ++either symbol ++by importing one of them into package and making it a ++shadowing symbol. ++

++

Examples::

++ ++
++
 (export (intern "LAND-FILL" (make-package 'trash)) 'trash) ⇒  T
++ (find-symbol "LAND-FILL" (make-package 'temp)) ⇒  NIL, NIL
++ (package-use-list 'temp) ⇒  (#<PACKAGE "TEMP">)
++ (use-package 'trash 'temp) ⇒  T
++ (package-use-list 'temp) ⇒  (#<PACKAGE "TEMP"> #<PACKAGE "TRASH">)
++ (find-symbol "LAND-FILL" 'temp) ⇒  TRASH:LAND-FILL, :INHERITED
++
++ ++

Side Effects::

++ ++

The use list of package may be modified. ++

++

See Also::

++ ++

unuse-package ++, ++package-use-list ++, ++Package Concepts ++

++

Notes::

++ ++

It is permissible for a package P_1 ++to use a package P_2 ++even if P_2 already uses P_1. ++The using of packages is not transitive, ++so no problem results from the apparent circularity. ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/use_002dvalue.html +@@ -0,0 +1,72 @@ ++ ++ ++ ++ ++ ++use-value (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.45 use-value [Restart]

++ ++

Data Arguments Required::

++ ++

a value to use instead (once). ++

++

Description::

++ ++

The use-value restart is generally used by handlers trying ++to recover from errors of types such as cell-error, ++where the handler may wish to supply a replacement datum for one-time use. ++

++

See Also::

++ ++

Restarts, ++Interfaces to Restarts, ++invoke-restart ++, ++use-value ++ (function), ++store-value ++ (function and restart) ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/user_002dhomedir_002dpathname.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++user-homedir-pathname (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Previous: , Up: Environment Dictionary  

++
++
++

25.2.30 user-homedir-pathname [Function]

++ ++

user-homedir-pathname &optional hostpathname ++

++

Arguments and Values::

++ ++

host—a string, a list of strings, or :unspecific. ++

++

pathname—a pathname, or nil. ++

++

Description::

++ ++

user-homedir-pathname determines the pathname that corresponds ++to the user’s home directory on host. ++If host is not supplied, its value is implementation-dependent. ++

++

For a description of :unspecific, see Pathname Components. ++

++

The definition of home directory is implementation-dependent, ++but defined in Common Lisp to mean the directory where the user ++keeps personal files such as initialization files and mail. ++

++

user-homedir-pathname returns a pathname without any name, ++type, or version component (those components are all nil) ++for the user’s home directory on host. ++

++

If it is impossible to determine the user’s home directory on host, ++then nil is returned. ++user-homedir-pathname never returns nil if host is not supplied. ++

++

Examples::

++ ++
++
 (pathnamep (user-homedir-pathname)) ⇒  true
++
++ ++

Affected By::

++ ++

The host computer’s file system, ++and the implementation. ++

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/values-_0028Type-Specifier_0029.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++values (Type Specifier) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

4.4.22 values [Type Specifier]

++ ++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(values{!value-typespec}) ++

++

[Reviewer Note by Barmar: Missing &key] ++

++

value-typespec ::={typespec}* [&optional {typespec}*] [&rest typespec ] [&allow-other-keys] ++

++

Compound Type Specifier Arguments::

++ ++

typespec—a type specifier. ++

++

Compound Type Specifier Description::

++ ++

This type specifier can be used only as the value-type in a ++function type specifier or a the ++special form. It is used to specify individual types ++when multiple values are involved. ++The &optional and &rest markers can appear in the value-type list; ++they indicate the parameter list of a function that, ++when given to multiple-value-call along with the values, ++would correctly receive those values. ++

++

The symbol * may not be among the value-types. ++

++

The symbol values is not valid as a type specifier; ++and, specifically, it is not an abbreviation for (values). ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/values.html +@@ -0,0 +1,133 @@ ++ ++ ++ ++ ++ ++values (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.53 values [Accessor]

++ ++

values &rest object{object}* ++

++

(setf ( values &rest place) new-values)
++

++

Arguments and Values::

++ ++

object—an object. ++

++

place—a place. ++

++

new-value—an object. ++

++

Description::

++ ++

values ++returns the objects as multiple values_2. ++

++

setf of values is used to store the ++multiple values_2 new-values into the places. ++See VALUES Forms as Places. ++

++

Examples::

++ ++
++
 (values) ⇒  <no values>
++ (values 1) ⇒  1
++ (values 1 2) ⇒  1, 2
++ (values 1 2 3) ⇒  1, 2, 3
++ (values (values 1 2 3) 4 5) ⇒  1, 4, 5
++ (defun polar (x y)
++   (values (sqrt (+ (* x x) (* y y))) (atan y x))) ⇒  POLAR
++ (multiple-value-bind (r theta) (polar 3.0 4.0)
++   (vector r theta))
++⇒  #(5.0 0.927295)
++
++ ++

Sometimes it is desirable to indicate explicitly that a function returns ++exactly one value. For example, the function ++

++
++
 (defun foo (x y)
++   (floor (+ x y) y)) ⇒  FOO
++
++ ++

returns two values because floor returns ++two values. It may be that the second value makes no sense, ++or that for efficiency reasons it is desired not to compute the ++second value. values is the standard idiom ++for indicating that only one value is to be returned: ++

++
++
 (defun foo (x y)
++   (values (floor (+ x y) y))) ⇒  FOO
++
++ ++

This works because values ++returns exactly one value for each of ++args; as for any function call, ++if any of args produces more than one value, all but the ++first are discarded. ++

++

See Also::

++ ++

values-list ++, ++multiple-value-bind ++, ++multiple-values-limit ++, ++Evaluation ++

++

Notes::

++ ++

Since values is a function, not a macro or special form, ++it receives as arguments only the primary values of ++its argument forms. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/values_002dlist.html +@@ -0,0 +1,95 @@ ++ ++ ++ ++ ++ ++values-list (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

5.3.54 values-list [Function]

++ ++

values-list list{element}* ++

++

Arguments and Values::

++ ++

list—a list. ++

++

elements—the elements of the list. ++

++

Description::

++ ++

Returns the elements of the list as multiple values_2. ++

++

Examples::

++ ++
++
 (values-list nil) ⇒  <no values>
++ (values-list '(1)) ⇒  1
++ (values-list '(1 2)) ⇒  1, 2
++ (values-list '(1 2 3)) ⇒  1, 2, 3
++
++ ++

Exceptional Situations::

++ ++

Should signal type-error if its argument is not a proper list. ++

++

See Also::

++ ++

multiple-value-bind ++, ++multiple-value-list ++, ++multiple-values-limit ++, ++values ++

++

Notes::

++ ++
++
 (values-list list) ≡ (apply #'values list)
++
++ ++

(equal x (multiple-value-list (values-list x))) ++returns true for all lists x. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/vector-_0028System-Class_0029.html +@@ -0,0 +1,129 @@ ++ ++ ++ ++ ++ ++vector (System Class) (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.3 vector [System Class]

++ ++

Class Precedence List::

++

vector, ++array, ++sequence, ++t ++

++

Description::

++ ++

Any one-dimensional array is a vector. ++

++

The type vector is a subtype of type array; ++for all types x, (vector x) is the same as (array x (*)). ++

++

The type (vector t), the type string, and the type bit-vector ++are disjoint subtypes of type vector. ++

++

Compound Type Specifier Kind::

++ ++

Specializing. ++

++

Compound Type Specifier Syntax::

++ ++

(vector{[{element-type | *} [{size | *}]]}) ++

++

Compound Type Specifier Arguments::

++ ++

size—a non-negative fixnum. ++

++

element-type—a type specifier. ++

++

Compound Type Specifier Description::

++ ++

This denotes the set of specialized vectors ++whose element type and dimension match the specified values. ++Specifically: ++

++

If element-type is the symbol *, ++vectors are not excluded on the basis of their element type. ++Otherwise, only those vectors are included whose actual array element type ++

++

is the result of upgrading element-type; ++see Array Upgrading. ++

++

If a size is specified, ++the set includes only those vectors whose only dimension ++is size. ++If the symbol * is specified instead of a size, ++the set is not restricted on the basis of dimension. ++

++

See Also::

++ ++

Required Kinds of Specialized Arrays, ++Sharpsign Left-Parenthesis, ++Printing Other Vectors, ++Sharpsign A ++

++

Notes::

++ ++

The type (vector e s) ++is equivalent to the type (array e (s)). ++

++

The type (vector bit) has the name bit-vector. ++

++

The union of all types (vector C), ++where C is any subtype of character, ++has the name string. ++

++

(vector *) refers to all vectors ++regardless of element type, (vector type-specifier) ++refers only to those vectors ++that can result from giving type-specifier as the ++:element-type argument to make-array. ++

++
++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/vector.html +@@ -0,0 +1,90 @@ ++ ++ ++ ++ ++ ++vector (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.29 vector [Function]

++ ++

vector &rest objectsvector ++

++

Arguments and Values::

++ ++

object—an object. ++

++

vector—a vector of type (vector t *). ++

++

Description::

++ ++

Creates a fresh simple general vector whose size ++corresponds to the number of objects. ++

++

The vector is initialized to contain the objects. ++

++

Examples::

++ ++
++
 (arrayp (setq v (vector 1 2 'sirens))) ⇒  true
++ (vectorp v) ⇒  true
++ (simple-vector-p v) ⇒  true         
++ (length v) ⇒  3
++
++ ++

See Also::

++ ++

make-array ++

++

Notes::

++ ++

vector is analogous to list. ++

++
++
 (vector a_1 a_2 ... a_n)
++  ≡ (make-array (list n) :element-type t
++                          :initial-contents 
++                            (list a_1 a_2 ... a_n))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/vector_002dpop.html +@@ -0,0 +1,98 @@ ++ ++ ++ ++ ++ ++vector-pop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.30 vector-pop [Function]

++ ++

vector-pop vectorelement ++

++

Arguments and Values::

++ ++

vector—a vector with a fill pointer. ++

++

element—an object. ++

++

Description::

++ ++

Decreases the fill pointer of vector by one, ++and retrieves the element of vector that is ++designated by the new fill pointer. ++

++

Examples::

++ ++
++
 (vector-push (setq fable (list 'fable))
++              (setq fa (make-array 8
++                                   :fill-pointer 2
++                                   :initial-element 'sisyphus))) ⇒  2 
++ (fill-pointer fa) ⇒  3 
++ (eq (vector-pop fa) fable) ⇒  true
++ (vector-pop fa) ⇒  SISYPHUS 
++ (fill-pointer fa) ⇒  1 
++
++ ++

Side Effects::

++ ++

The fill pointer is decreased by one. ++

++

Affected By::

++ ++

The value of the fill pointer. ++

++

Exceptional Situations::

++ ++

An error of type type-error is signaled if vector does not have a fill pointer. ++

++

If the fill pointer is zero, vector-pop signals an error of type error. ++

++

See Also::

++ ++

vector-push ++, vector-push-extend, ++fill-pointer ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/vector_002dpush.html +@@ -0,0 +1,143 @@ ++ ++ ++ ++ ++ ++vector-push (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.31 vector-push, vector-push-extend [Function]

++ ++

vector-push new-element vectornew-index-p ++

++

vector-push-extend new-element vector &optional extensionnew-index ++

++

Arguments and Values::

++ ++

new-element—an object. ++

++

vector—a vector with a fill pointer. ++

++

extension—a positive integer. ++ The default is implementation-dependent. ++

++

new-index-p—a valid array index for vector, or nil. ++

++

new-index—a valid array index for vector. ++

++

Description::

++ ++

vector-push and vector-push-extend store ++new-element in vector. ++vector-push attempts to store ++new-element ++in the element of vector designated by the fill pointer, ++and to increase the fill pointer by one. If the ++(>= (fill-pointer vector) (array-dimension vector 0)), ++neither vector nor its fill pointer are affected. ++Otherwise, the store and increment take ++place and vector-push ++returns the former value of the fill pointer ++which is one less than the one it leaves in vector. ++

++

vector-push-extend is just like vector-push except ++that if the fill pointer gets too large, vector is extended using ++adjust-array so that it can contain more elements. ++Extension ++is the minimum number of elements to be added to vector if it ++must be extended. ++

++

vector-push and ++vector-push-extend return the index of new-element in vector. ++If (>= (fill-pointer vector) (array-dimension vector 0)), ++vector-push returns nil. ++

++

Examples::

++ ++
++
 (vector-push (setq fable (list 'fable))
++              (setq fa (make-array 8 
++                                   :fill-pointer 2
++                                   :initial-element 'first-one))) ⇒  2 
++ (fill-pointer fa) ⇒  3 
++ (eq (aref fa 2) fable) ⇒  true
++ (vector-push-extend #\X
++                    (setq aa 
++                          (make-array 5
++                                      :element-type 'character
++                                      :adjustable t
++                                      :fill-pointer 3))) ⇒  3 
++ (fill-pointer aa) ⇒  4 
++ (vector-push-extend #\Y aa 4) ⇒  4 
++ (array-total-size aa) ⇒  at least 5 
++ (vector-push-extend #\Z aa 4) ⇒  5 
++ (array-total-size aa) ⇒  9 ;(or more)
++
++ ++

Affected By::

++

The value of the fill pointer. ++

++

How vector was created. ++

++

Exceptional Situations::

++ ++

An error of type error is signaled by vector-push-extend ++if it tries to extend vector and vector is not actually adjustable. ++

++

An error of type error is signaled if vector does not ++have a fill pointer. ++

++

See Also::

++ ++

adjustable-array-p ++, ++fill-pointer ++, ++vector-pop ++

++
++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/vectorp.html +@@ -0,0 +1,79 @@ ++ ++ ++ ++ ++ ++vectorp (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Arrays Dictionary  

++
++
++

15.2.32 vectorp [Function]

++ ++

vectorp objectgeneralized-boolean ++

++

Arguments and Values::

++ ++

object—an object. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if object is of type vector; ++otherwise, returns false. ++

++

Examples::

++ ++
++
 (vectorp "aaaaaa") ⇒  true
++ (vectorp (make-array 6 :fill-pointer t)) ⇒  true
++ (vectorp (make-array '(2 3 4))) ⇒  false
++ (vectorp #*11) ⇒  true
++ (vectorp #b11) ⇒  false
++
++ ++

Notes::

++
++
 (vectorp object) ≡ (typep object 'vector)
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/warn.html +@@ -0,0 +1,149 @@ ++ ++ ++ ++ ++ ++warn (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.20 warn [Function]

++ ++

warn datum &rest argumentsnil ++

++

Arguments and Values::

++ ++

datum, argumentsdesignators for a condition ++ of default type simple-warning. ++

++

Description::

++ ++

Signals a condition of type warning. ++If the condition is not handled, ++reports the condition to error output. ++

++

The precise mechanism for warning is as follows: ++

++
++
The warning condition is signaled
++

While the warning condition is being signaled, ++the muffle-warning restart is established for use by a handler. ++If invoked, this restart bypasses further action by warn, ++which in turn causes warn to immediately return nil. ++

++
++
If no handler for the warning condition is found
++

If no handlers for the warning condition are found, ++or if all such handlers decline, ++then the condition is reported to error output ++by warn in an implementation-dependent format. ++

++
++
nil is returned
++

The value returned by warn if it returns is nil. ++

++
++ ++

Examples::

++ ++
++
  (defun foo (x)
++    (let ((result (* x 2)))
++      (if (not (typep result 'fixnum))
++          (warn "You're using very big numbers."))
++      result))
++⇒  FOO
++
++  (foo 3)
++⇒  6
++
++  (foo most-positive-fixnum)
++ |>  Warning: You're using very big numbers.
++⇒  4294967294
++
++  (setq *break-on-signals* t)
++⇒  T
++
++  (foo most-positive-fixnum)
++ |>  Break: Caveat emptor.
++ |>  To continue, type :CONTINUE followed by an option number.
++ |>   1: Return from Break.
++ |>   2: Abort to Lisp Toplevel.
++ |>  Debug> :continue 1
++ |>  Warning: You're using very big numbers.
++⇒  4294967294
++
++ ++

Side Effects::

++ ++

A warning is issued. The debugger might be entered. ++

++

Affected By::

++ ++

Existing handler bindings. ++

++

*break-on-signals*, ++*error-output*. ++

++

Exceptional Situations::

++ ++

If datum is a condition ++and if the condition is not of type warning, ++or arguments is non-nil, an error of type type-error is signaled. ++

++

If datum is a condition type, ++the result of (apply #'make-condition datum arguments) ++must be of type warning or an error of type type-error is signaled. ++

++

See Also::

++ ++

*break-on-signals*, ++muffle-warning ++, ++signal ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/warning.html +@@ -0,0 +1,64 @@ ++ ++ ++ ++ ++ ++warning (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.2 warning [Condition Type]

++ ++

Class Precedence List::

++

warning, ++condition, ++t ++

++

Description::

++ ++

The type warning consists of all types of warnings. ++

++

See Also::

++ ++

style-warning ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/when.html +@@ -0,0 +1,145 @@ ++ ++ ++ ++ ++ ++when (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++
++

5.3.45 when, unless [Macro]

++ ++

when test-form {form}*{result}* ++

++

unless test-form {form}*{result}* ++

++

Arguments and Values::

++ ++

test-form—a form. ++

++

forms—an implicit progn. ++

++

results—the values of the forms ++ in a when form if the test-form yields true ++ or in an unless form if the test-form yields false; ++ otherwise nil. ++

++

Description::

++ ++

when and unless allow the execution of forms ++to be dependent on a single test-form. ++

++

In a when form, ++if the test-form yields true, ++the forms are evaluated in order from left to right ++and the values returned by the forms ++are returned from the when form. ++Otherwise, if the test-form yields false, ++the forms are not evaluated, ++and the when form returns nil. ++

++

In an unless form, ++if the test-form yields false, ++the forms are evaluated in order from left to right ++and the values returned by the forms ++are returned from the unless form. ++Otherwise, if the test-form yields false, ++the forms are not evaluated, ++and the unless form returns nil. ++

++

Examples::

++ ++
++
 (when t 'hello) ⇒  HELLO
++ (unless t 'hello) ⇒  NIL
++ (when nil 'hello) ⇒  NIL
++ (unless nil 'hello) ⇒  HELLO
++ (when t) ⇒  NIL
++ (unless nil) ⇒  NIL
++ (when t (prin1 1) (prin1 2) (prin1 3))
++ |>  123
++⇒  3
++ (unless t (prin1 1) (prin1 2) (prin1 3)) ⇒  NIL
++ (when nil (prin1 1) (prin1 2) (prin1 3)) ⇒  NIL
++ (unless nil (prin1 1) (prin1 2) (prin1 3))
++ |>  123
++⇒  3
++ (let ((x 3))
++   (list (when (oddp x) (incf x) (list x))
++         (when (oddp x) (incf x) (list x))
++         (unless (oddp x) (incf x) (list x))
++         (unless (oddp x) (incf x) (list x))
++         (if (oddp x) (incf x) (list x)) 
++         (if (oddp x) (incf x) (list x)) 
++         (if (not (oddp x)) (incf x) (list x)) 
++         (if (not (oddp x)) (incf x) (list x))))
++⇒  ((4) NIL (5) NIL 6 (6) 7 (7))
++
++ ++

See Also::

++ ++

and ++, ++cond ++, ++if ++, ++or ++

++

Notes::

++ ++
++
 (when test {form}^+) ≡ (and test (progn {form}^+))
++ (when test {form}^+) ≡ (cond (test {form}^+))
++ (when test {form}^+) ≡ (if test (progn {form}^+) nil)
++ (when test {form}^+) ≡ (unless (not test) {form}^+)
++ (unless test {form}^+) ≡ (cond ((not test) {form}^+))
++ (unless test {form}^+) ≡ (if test nil (progn {form}^+))
++ (unless test {form}^+) ≡ (when (not test) {form}^+)
++
++ ++
++
++

++Next: , Previous: , Up: Data and Control Flow Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/wild_002dpathname_002dp.html +@@ -0,0 +1,114 @@ ++ ++ ++ ++ ++ ++wild-pathname-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Filenames Dictionary  

++
++
++

19.4.13 wild-pathname-p [Function]

++ ++

wild-pathname-p pathname &optional field-keygeneralized-boolean ++

++

Arguments and Values::

++ ++

pathname—a pathname designator. ++

++

Field-key—one of :host, ++ :device ++ :directory, ++ :name, ++ :type, ++ :version, ++ or nil. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

wild-pathname-p tests pathname for the presence of wildcard components. ++

++

If pathname is a pathname (as returned by pathname) ++it represents the name used to open the file. This may be, but is ++not required to be, the actual name of the file. ++

++

If field-key is not supplied or nil, wild-pathname-p ++returns true if pathname has any wildcard components, nil ++if pathname has none. ++If field-key is non-nil, wild-pathname-p ++returns true if the indicated component of pathname is a wildcard, ++nil if the component is not a wildcard. ++

++

Examples::

++
++
 ;;;The following examples are not portable.  They are written to run
++ ;;;with particular file systems and particular wildcard conventions.
++ ;;;Other implementations will behave differently.  These examples are
++ ;;;intended to be illustrative, not to be prescriptive.
++
++ (wild-pathname-p (make-pathname :name :wild)) ⇒  true
++ (wild-pathname-p (make-pathname :name :wild) :name) ⇒  true
++ (wild-pathname-p (make-pathname :name :wild) :type) ⇒  false
++ (wild-pathname-p (pathname "s:>foo>**>")) ⇒  true ;Lispm
++ (wild-pathname-p (pathname :name "F*O")) ⇒  true ;Most places
++
++ ++

Exceptional Situations::

++ ++

If pathname is not a pathname, a string, ++or a stream associated with a file an error of type type-error is signaled. ++

++

See Also::

++ ++

pathname, ++logical-pathname, ++File System Concepts, ++

++

Pathnames as Filenames ++

++

Notes::

++ ++

Not all implementations support wildcards in all fields. ++See ->WILD as a Component Value and Restrictions on Wildcard Pathnames. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002daccessors.html +@@ -0,0 +1,165 @@ ++ ++ ++ ++ ++ ++with-accessors (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

7.7.23 with-accessors [Macro]

++ ++

with-accessors ({slot-entry}*) ++ instance-form ++ {declaration}* {form}*
++ ⇒ {result}* ++

++

slot-entry ::=(variable-name accessor-name ) ++

++

Arguments and Values::

++ ++

variable-name—a variable name; not evaluated. ++

++

accessor-name—a function name; not evaluated. ++

++

instance-form—a form; evaluated. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

Creates a lexical environment in which ++the slots specified by ++slot-entry are lexically available through their accessors as if ++they were variables. The macro with-accessors invokes the ++appropriate accessors to access the slots specified ++by slot-entry. Both setf ++and setq can be used to set the value of the slot. ++

++

Examples::

++ ++
++
 (defclass thing ()
++           ((x :initarg :x :accessor thing-x)
++            (y :initarg :y :accessor thing-y)))
++⇒  #<STANDARD-CLASS THING 250020173>
++ (defmethod (setf thing-x) :before (new-x (thing thing))
++   (format t "~&Changing X from ~D to ~D in ~S.~
++           (thing-x thing) new-x thing))
++ (setq thing1 (make-instance 'thing :x 1 :y 2)) ⇒  #<THING 43135676>
++ (setq thing2 (make-instance 'thing :x 7 :y 8)) ⇒  #<THING 43147374>
++ (with-accessors ((x1 thing-x) (y1 thing-y))
++                 thing1
++   (with-accessors ((x2 thing-x) (y2 thing-y))
++                   thing2
++     (list (list x1 (thing-x thing1) y1 (thing-y thing1)
++                 x2 (thing-x thing2) y2 (thing-y thing2))
++           (setq x1 (+ y1 x2))
++           (list x1 (thing-x thing1) y1 (thing-y thing1)
++                 x2 (thing-x thing2) y2 (thing-y thing2))
++           (setf (thing-x thing2) (list x1))
++           (list x1 (thing-x thing1) y1 (thing-y thing1)
++                 x2 (thing-x thing2) y2 (thing-y thing2)))))
++ |>  Changing X from 1 to 9 in #<THING 43135676>.
++ |>  Changing X from 7 to (9) in #<THING 43147374>.
++⇒  ((1 1 2 2 7 7 8 8)
++     9
++     (9 9 2 2 7 7 8 8) 
++     (9)
++     (9 9 2 2 (9) (9) 8 8))
++
++ ++

Affected By::

++ ++

defclass ++

++

Exceptional Situations::

++ ++

The consequences are undefined if any accessor-name is not the name ++of an accessor for the instance. ++

++

See Also::

++ ++

with-slots ++, ++symbol-macrolet ++

++

Notes::

++ ++

A with-accessors expression of the form: ++

++
++
++
++(with-accessors (slot-entry_1 ...slot-entry_n) instance-form form_1 ...form_k)
++
++
++ ++

expands into the equivalent of ++

++
++
++
++(let ((in instance-form))
++
++ (symbol-macrolet (Q_1... Q_n) form_1 ...form_k))
++
++
++ ++

where Q_i is ++

++
++
(variable-name_i () 
++(accessor-name_i in))
++
++ ++ ++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dcompilation_002dunit.html +@@ -0,0 +1,124 @@ ++ ++ ++ ++ ++ ++with-compilation-unit (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: System Construction Dictionary  

++
++
++

24.2.4 with-compilation-unit [Macro]

++ ++

with-compilation-unit ([[!option]]) ++ {form}*{result}* ++

++

option ::=:override override ++

++

Arguments and Values::

++ ++

override—a generalized boolean; evaluated. ++ The default is nil. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

Executes forms from left to right. ++Within the dynamic environment of with-compilation-unit, ++actions deferred by the compiler until the end of compilation will be ++deferred until the end of the outermost call to with-compilation-unit. ++

++

The set of options permitted may be extended by the implementation, ++but the only standardized keyword is :override. ++

++

If nested dynamically only the outer call to ++with-compilation-unit has any effect unless the value ++associated with :override is true, in which case warnings are ++deferred only to the end of the innermost call for which override is true. ++

++

The function compile-file ++provides the effect of ++

++
++
 (with-compilation-unit (:override nil) ...)
++
++ ++

around its code. ++

++

Any implementation-dependent extensions can only be provided as the ++result of an explicit programmer request by use of an ++implementation-dependent keyword. Implementations are forbidden ++from attaching additional meaning to a use of this macro which involves either ++no keywords or just the keyword :override. ++

++

Examples::

++ ++

If an implementation would normally defer certain kinds of warnings, ++such as warnings about undefined functions, to the end of a compilation ++unit (such as a file), the following example shows how to cause those ++warnings to be deferred to the end of the compilation of several files. ++

++
++
 (defun compile-files (&rest files)
++   (with-compilation-unit ()
++     (mapcar #'(lambda (file) (compile-file file)) files)))
++
++ (compile-files "A" "B" "C")
++
++ ++

Note however that if the implementation does not normally defer any warnings, ++use of with-compilation-unit might not have any effect. ++

++

See Also::

++ ++

compile ++, ++compile-file ++

++
++
++

++Next: , Previous: , Up: System Construction Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dcondition_002drestarts.html +@@ -0,0 +1,91 @@ ++ ++ ++ ++ ++ ++with-condition-restarts (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Conditions Dictionary  

++
++
++

9.2.39 with-condition-restarts [Macro]

++ ++

with-condition-restarts condition-form restarts-form {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

condition-form—a form; evaluated to produce a condition. ++

++

condition—a condition object resulting from the ++ evaluation of condition-form. ++

++

restart-form—a form; evaluated to produce a restart-list. ++

++

restart-list—a list of restart objects resulting ++ from the evaluation of restart-form. ++

++

forms—an implicit progn; evaluated. ++

++

results—the values returned by forms. ++

++

Description::

++ ++

First, the condition-form and restarts-form are evaluated ++in normal left-to-right order; the primary values yielded by these ++evaluations are respectively called the condition ++and the restart-list. ++

++

Next, the forms are evaluated in a dynamic environment ++in which each restart in restart-list is associated with ++the condition. See Associating a Restart with a Condition. ++

++

See Also::

++ ++

restart-case ++

++

Notes::

++ ++

Usually this macro is not used explicitly in code, ++since restart-case handles most of the common cases ++in a way that is syntactically more concise. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dhash_002dtable_002diterator.html +@@ -0,0 +1,155 @@ ++ ++ ++ ++ ++ ++with-hash-table-iterator (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++
++

18.2.12 with-hash-table-iterator [Macro]

++ ++

with-hash-table-iterator (name hash-table) ++ {declaration}* {form}*{result}* ++

++

Arguments and Values::

++ ++

name—a name suitable for the first argument to macrolet. ++

++

hash-table—a form, evaluated once, that should produce a hash table. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by forms. ++

++

Description::

++ ++

Within the lexical scope of the body, name is defined via macrolet ++such that successive invocations of (name) return the items, ++one by one, from the hash table that is obtained by evaluating ++hash-table only once. ++

++

An invocation (name) returns three values as follows: ++

++
++
1.
++

A generalized boolean that is true if an entry is returned. ++

++
2.
++

The key from the hash-table entry. ++

++
3.
++

The value from the hash-table entry. ++

++
++ ++

After all entries have been returned by successive invocations of ++(name), then only one value is returned, namely nil. ++

++

It is unspecified what happens if any of the implicit interior state ++of an iteration is returned outside the dynamic extent of the ++with-hash-table-iterator form ++such as by returning some closure over the invocation form. ++

++

Any number of invocations of with-hash-table-iterator ++can be nested, and the body of the innermost one can invoke all of the ++locally established macros, provided all of those macros ++have distinct names. ++

++

Examples::

++ ++

The following function should return t on any ++hash table, and signal ++an error if the usage of with-hash-table-iterator does not agree ++with the corresponding usage of maphash. ++

++
++
 (defun test-hash-table-iterator (hash-table)
++   (let ((all-entries '())
++         (generated-entries '())
++         (unique (list nil)))
++     (maphash #'(lambda (key value) (push (list key value) all-entries))
++              hash-table)
++     (with-hash-table-iterator (generator-fn hash-table)
++       (loop     
++         (multiple-value-bind (more? key value) (generator-fn)
++           (unless more? (return))
++           (unless (eql value (gethash key hash-table unique))
++             (error "Key ~S not found for value ~S" key value))
++           (push (list key value) generated-entries))))
++     (unless (= (length all-entries)
++                (length generated-entries)
++                (length (union all-entries generated-entries
++                               :key #'car :test (hash-table-test hash-table))))
++       (error "Generated entries and Maphash entries don't correspond"))
++     t))
++
++ ++

The following could be an acceptable definition of ++maphash, implemented by with-hash-table-iterator. ++

++
++
 (defun maphash (function hash-table)
++   (with-hash-table-iterator (next-entry hash-table)
++     (loop (multiple-value-bind (more key value) (next-entry)
++             (unless more (return nil))
++             (funcall function key value)))))
++
++ ++

Exceptional Situations::

++ ++

The consequences are undefined if the local function named name ++established by with-hash-table-iterator is called after it has ++returned false as its primary value. ++

++

See Also::

++ ++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Hash Tables Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dinput_002dfrom_002dstring.html +@@ -0,0 +1,142 @@ ++ ++ ++ ++ ++ ++with-input-from-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

21.2.51 with-input-from-string [Macro]

++ ++

with-input-from-string (var string &key index start end) ++ {declaration}* ++ {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a variable name. ++

++

string—a form; evaluated to produce a string. ++

++

index—a place. ++

++

start, endbounding index designators of string. ++ The defaults for start and end are 0 and nil, respectively. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

result—the values returned by the forms. ++

++

Description::

++ ++

Creates an ++

++

input string stream, ++

++

provides an opportunity to perform operations on the stream ++ (returning zero or more values), ++and then closes the string stream. ++

++

String is evaluated first, and var is bound to ++a character input string stream that supplies ++characters from the subsequence of the resulting string bounded by ++start and end. ++The body is executed as an implicit progn. ++

++

The input string stream is automatically closed on exit from ++with-input-from-string, no matter whether the exit is normal or abnormal. ++

++

The input string stream to which the variable var ++is bound has dynamic extent; ++its extent ends when the form is exited. ++

++

The index is a pointer within the string to be advanced. ++If with-input-from-string ++is exited normally, then index will have ++as its value ++the index into the string indicating the first character not read ++which is (length string) if all characters were used. ++The place specified by index ++is not updated as reading progresses, but only at the ++end of the operation. ++

++

start and index may both specify the same variable, ++which is a pointer within the string to be advanced, ++perhaps repeatedly by some containing loop. ++

++

The consequences are undefined if an attempt is made to assign ++the variable var. ++

++

Examples::

++
++
 (with-input-from-string (s "XXX1 2 3 4xxx"
++                             :index ind
++                             :start 3 :end 10)
++    (+ (read s) (read s) (read s))) ⇒  6
++ ind ⇒  9
++ (with-input-from-string (s "Animal Crackers" :index j :start 6)
++   (read s)) ⇒  CRACKERS
++
++ ++

The variable j is set to 15. ++

++

Side Effects::

++ ++

The value of the place named by index, if any, is modified. ++

++

See Also::

++ ++

make-string-input-stream ++, ++

++

Traversal Rules and Side Effects ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dopen_002dfile.html +@@ -0,0 +1,170 @@ ++ ++ ++ ++ ++ ++with-open-file (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.31 with-open-file [macro]

++ ++

Syntax::

++ ++

with-open-file (stream filespec {options}*) ++ {declaration}* ++ {form}*
++ ⇒ results ++

++

Arguments and Values::

++ ++

stream – a variable. ++

++

filespec—a pathname designator. ++

++

optionsforms; evaluated. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

with-open-file uses open to create a file stream ++

++

to file named by filespec. ++Filespec is the name of the file to be opened. ++Options are used as keyword arguments to open. ++

++

The stream object to which the stream variable ++is bound has dynamic extent; ++its extent ends when the form is exited. ++

++

with-open-file evaluates the forms as an implicit progn ++with stream bound to ++

++

the value returned by open. ++

++

When control leaves the body, either normally or abnormally (such as by ++use of throw), the file is automatically closed. If a new ++output file is being written, and control leaves abnormally, the file is ++aborted and the file system is left, so far as possible, as if the file ++had never been opened. ++

++

It is possible by the use of :if-exists nil ++or :if-does-not-exist nil for ++stream to be bound to nil. ++

++

Users of :if-does-not-exist nil should check for a valid stream. ++

++

The consequences are undefined if an attempt is made to assign the ++stream variable. The compiler may choose to issue a ++warning if such an attempt is detected. ++

++

Examples::

++ ++
++
 (setq p (merge-pathnames "test"))
++⇒  #<PATHNAME :HOST NIL :DEVICE device-name :DIRECTORY directory-name
++    :NAME "test" :TYPE NIL :VERSION :NEWEST>
++ (with-open-file (s p :direction :output :if-exists :supersede)
++    (format s "Here are a couple~
++ (with-open-file (s p)
++    (do ((l (read-line s) (read-line s nil 'eof)))
++        ((eq l 'eof) "Reached end of file.")
++     (format t "~&*** ~A~
++ |>  *** Here are a couple
++ |>  *** of test data lines
++⇒  "Reached end of file."
++
++ ++
++
;; Normally one would not do this intentionally because it is
++;; not perspicuous, but beware when using :IF-DOES-NOT-EXIST NIL
++;; that this doesn't happen to you accidentally...
++ (with-open-file (foo "no-such-file" :if-does-not-exist nil)
++   (read foo))
++ |>  |>>hello?<<|
++⇒  HELLO? ;This value was read from the terminal, not a file!
++
++;; Here's another bug to avoid...
++ (with-open-file (foo "no-such-file" :direction :output :if-does-not-exist nil)
++   (format foo "Hello"))
++⇒  "Hello" ;FORMAT got an argument of NIL!
++
++ ++

Side Effects::

++ ++

Creates a stream to the file named by filename (upon entry), ++and closes the stream (upon exit). ++In some implementations, ++the file might be locked in some way while it is open. ++If the stream is an output stream, ++a file might be created. ++

++

Affected By::

++ ++

The host computer’s file system. ++

++

Exceptional Situations::

++ ++

See the function open. ++

++

See Also::

++ ++

open ++, ++close ++, ++pathname, ++logical-pathname, ++

++

Pathnames as Filenames ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dopen_002dstream.html +@@ -0,0 +1,101 @@ ++ ++ ++ ++ ++ ++with-open-stream (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.33 with-open-stream [Macro]

++ ++

with-open-stream (var stream) ++ {declaration}* ++ {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a variable name. ++

++

stream—a form; evaluated to produce a stream. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

with-open-stream performs a series of operations on ++stream, returns a value, and then closes the stream. ++

++

Var is bound to the value of stream, ++and then forms are executed ++as an implicit progn. ++stream ++is automatically closed on exit from with-open-stream, ++no matter whether the exit is normal or abnormal. ++

++

The stream has dynamic extent; ++its extent ends when the form is exited. ++

++

The consequences are undefined if an attempt is made to assign the ++the variable var with the forms. ++

++

Examples::

++ ++
++
 (with-open-stream (s (make-string-input-stream "1 2 3 4"))
++    (+ (read s) (read s) (read s))) ⇒  6
++
++ ++

Side Effects::

++ ++

The stream is closed (upon exit). ++

++

See Also::

++ ++

close ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002doutput_002dto_002dstring.html +@@ -0,0 +1,147 @@ ++ ++ ++ ++ ++ ++with-output-to-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.52 with-output-to-string [Macro]

++ ++

with-output-to-string (var &optional string-form &key element-type) ++ {declaration}* ++ {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

var—a variable name. ++

++

string-form—a form or nil; ++ if non-nil, evaluated to produce string. ++

++

string—a string that has a fill pointer. ++

++

element-type—a type specifier; evaluated. ++

++

The default is character. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—If a string-form is not supplied or nil, ++ a string; otherwise, ++ the values returned by the forms. ++

++

Description::

++ ++

with-output-to-string creates a ++

++

character output stream, performs a series of operations ++that may send results to this stream, and then closes the stream. ++

++

The element-type names the type of the elements ++of the stream; a stream is constructed of the most specialized ++type that can accommodate elements of the given type. ++

++

The body is executed as an implicit progn with var ++bound to an output string stream. ++All output to that string stream is saved in a string. ++

++

If string is supplied, element-type is ignored, ++and the output is incrementally appended to string as ++if by use of vector-push-extend. ++

++

The output stream ++is automatically closed on exit from with-output-from-string, ++no matter whether the exit is normal or abnormal. ++

++

The output string stream to which the variable var ++is bound has dynamic extent; ++its extent ends when the form is exited. ++

++

If no string is provided, then with-output-from-string ++

++

produces a stream that accepts characters and returns a string ++of the indicated element-type. ++

++

If string is provided, ++with-output-to-string returns the results of evaluating the last form. ++

++

The consequences are undefined if an attempt is made to assign ++the variable var. ++

++

Examples::

++
++
 (setq fstr (make-array '(0) :element-type 'base-char
++                             :fill-pointer 0 :adjustable t)) ⇒  ""
++ (with-output-to-string (s fstr)
++    (format s "here's some output")
++    (input-stream-p s)) ⇒  false
++ fstr ⇒  "here's some output"
++
++ ++

Side Effects::

++ ++

The string is modified. ++

++

Exceptional Situations::

++ ++

The consequences are undefined if destructive modifications are performed ++directly on the string during the dynamic extent of the call. ++

++

See Also::

++ ++

make-string-output-stream ++, ++vector-push-extend, ++

++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dpackage_002diterator.html +@@ -0,0 +1,234 @@ ++ ++ ++ ++ ++ ++with-package-iterator (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++
++

11.2.13 with-package-iterator [Macro]

++ ++

with-package-iterator (name package-list-form &rest symbol-types) ++ {declaration}* {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

package-list-form—a form; evaluated once to produce a package-list. ++

++

package-list—a designator for a list of package designators. ++

++

symbol-type—one of the symbols ++ :internal, :external, or :inherited. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values of the forms. ++

++

Description::

++ ++

Within the lexical scope of the body forms, ++the name is defined via macrolet ++such that successive invocations of (name) ++will return the symbols, one by one, ++from the packages in package-list. ++

++

It is unspecified whether symbols inherited from ++multiple packages are returned more than once. ++The order of symbols returned does not necessarily reflect the order ++of packages in package-list. When package-list has ++more than one element, it is unspecified whether duplicate symbols are ++returned once or more than once. ++

++

Symbol-types controls which symbols that are accessible ++in a package are returned as follows: ++

++
++
:internal
++

The symbols that are present in the package, ++ but that are not exported. ++

++
++
:external
++

The symbols that are present in the package ++ and are exported. ++

++
++
:inherited
++

The symbols that are exported by used packages ++ and that are not shadowed. ++

++
++ ++

When more than one argument is supplied for symbol-types, ++a symbol is returned if its accessibility matches ++any one of the symbol-types supplied. ++Implementations may extend this syntax by recognizing additional ++symbol accessibility types. ++

++

An invocation of (name) returns four values as follows: ++

++
++
1.
++

A flag that indicates whether a symbol is returned ++ (true means that a symbol is returned). ++

++
2.
++

A symbol that is accessible in one the ++ indicated packages. ++

++
3.
++

The accessibility type for that symbol; ++ i.e., one of the symbols :internal, :external, or :inherited. ++

++
4.
++

The package from which the symbol was obtained. ++ The package is one of the packages present ++ or named in package-list. ++

++
++ ++

After all symbols have been returned by successive invocations of ++(name), then only one value is returned, namely nil. ++

++

The meaning of the second, third, and fourth values is that the returned ++symbol is accessible in the returned package ++in the way indicated by the second return value as follows: ++

++
++
:internal
++

Means present and not exported. ++

++
++
:external
++

Means present and exported. ++

++
++
:inherited
++

Means not present (thus not shadowed) but inherited ++from some used package. ++

++
++ ++

It is unspecified what happens if any of the implicit interior state ++of an iteration is returned outside the dynamic extent of the ++with-package-iterator ++form such as by returning some closure over the invocation form. ++

++

Any number of invocations of with-package-iterator ++can be nested, and the body of the innermost one can invoke all of the ++locally established macros, provided all those macros ++have distinct names. ++

++

Examples::

++ ++

The following function should return t on any package, and signal ++an error if the usage of with-package-iterator does not agree ++with the corresponding usage of do-symbols. ++

++
++
 (defun test-package-iterator (package)
++   (unless (packagep package)
++     (setq package (find-package package)))
++   (let ((all-entries '())
++         (generated-entries '()))
++     (do-symbols (x package) 
++       (multiple-value-bind (symbol accessibility) 
++           (find-symbol (symbol-name x) package)
++         (push (list symbol accessibility) all-entries)))
++     (with-package-iterator (generator-fn package 
++                             :internal :external :inherited)
++       (loop     
++         (multiple-value-bind (more? symbol accessibility pkg)
++             (generator-fn)
++           (unless more? (return))
++           (let ((l (multiple-value-list (find-symbol (symbol-name symbol) 
++                                                      package))))
++             (unless (equal l (list symbol accessibility))
++               (error "Symbol ~S not found as ~S in package ~A [~S]"
++                      symbol accessibility (package-name package) l))
++             (push l generated-entries)))))
++     (unless (and (subsetp all-entries generated-entries :test #'equal)
++                  (subsetp generated-entries all-entries :test #'equal))
++      (error "Generated entries and Do-Symbols entries don't correspond"))
++     t))
++
++ ++

The following function prints out every present symbol ++(possibly more than once): ++

++
++
 (defun print-all-symbols () 
++   (with-package-iterator (next-symbol (list-all-packages)
++                           :internal :external)
++     (loop
++       (multiple-value-bind (more? symbol) (next-symbol)
++         (if more? 
++            (print symbol)
++            (return))))))
++
++ ++

Exceptional Situations::

++ ++

with-package-iterator signals an error of type program-error if ++no symbol-types are supplied or if a symbol-type is not ++recognized by the implementation is supplied. ++

++

The consequences are undefined if the local function named name ++established by with-package-iterator is called after it ++has returned false as its primary value. ++

++

See Also::

++ ++

Traversal Rules and Side Effects ++

++
++
++

++Next: , Previous: , Up: Packages Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dsimple_002drestart.html +@@ -0,0 +1,161 @@ ++ ++ ++ ++ ++ ++with-simple-restart (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

9.2.40 with-simple-restart [Macro]

++ ++

with-simple-restart (name format-control {format-argument}*) ++ {form}*
++ ⇒ {result}* ++

++

Arguments and Values::

++ ++

name—a symbol. ++

++

format-control—a format control. ++

++

format-argument—an object (i.e., a format argument). ++

++

forms—an implicit progn. ++

++

results—in the normal situation, ++ the values returned by the forms; ++ in the exceptional situation where the restart named name is invoked, ++ two values—nil and t. ++

++

Description::

++ ++

with-simple-restart establishes a restart. ++

++

If the restart designated by name is not invoked while executing forms, ++all values returned by the last of forms are returned. ++If the restart designated by name is invoked, ++control is transferred to with-simple-restart, ++which returns two values, nil and t. ++

++

If name is nil, an anonymous restart is established. ++

++

The format-control and format-arguments are used ++report the restart. ++

++

Examples::

++ ++
++
 (defun read-eval-print-loop (level)
++   (with-simple-restart (abort "Exit command level ~D." level)
++     (loop
++       (with-simple-restart (abort "Return to command level ~D." level)
++         (let ((form (prog2 (fresh-line) (read) (fresh-line))))
++           (prin1 (eval form)))))))
++⇒  READ-EVAL-PRINT-LOOP
++ (read-eval-print-loop 1)
++ (+ 'a 3)
++ |>  Error: The argument, A, to the function + was of the wrong type.
++ |>         The function expected a number.
++ |>  To continue, type :CONTINUE followed by an option number:
++ |>   1: Specify a value to use this time.
++ |>   2: Return to command level 1.
++ |>   3: Exit command level 1.
++ |>   4: Return to Lisp Toplevel.
++
++ ++
++
 (defun compute-fixnum-power-of-2 (x)
++   (with-simple-restart (nil "Give up on computing 2^~D." x)
++     (let ((result 1))
++       (dotimes (i x result)
++         (setq result (* 2 result))
++         (unless (fixnump result)
++           (error "Power of 2 is too large."))))))
++COMPUTE-FIXNUM-POWER-OF-2
++ (defun compute-power-of-2 (x)
++   (or (compute-fixnum-power-of-2 x) 'something big))
++COMPUTE-POWER-OF-2
++ (compute-power-of-2 10)
++1024
++ (compute-power-of-2 10000)
++ |>  Error: Power of 2 is too large.
++ |>  To continue, type :CONTINUE followed by an option number.
++ |>   1: Give up on computing 2^10000.
++ |>   2: Return to Lisp Toplevel
++ |>  Debug> |>>:continue 1<<|
++⇒  SOMETHING-BIG
++
++ ++

See Also::

++ ++

restart-case ++

++

Notes::

++ ++

with-simple-restart is shorthand for one of the most ++common uses of restart-case. ++

++

with-simple-restart could be defined by: ++

++
++
 (defmacro with-simple-restart ((restart-name format-control
++                                              &rest format-arguments)
++                                &body forms)
++   `(restart-case (progn ,@forms)
++      (,restart-name ()
++          :report (lambda (stream)
++                    (format stream ,format-control ,@format-arguments))
++         (values nil t))))
++
++ ++

Because the second return value is t in the exceptional case, ++it is common (but not required) to arrange for the second return value ++in the normal case to be missing or nil so that the two situations ++can be distinguished. ++

++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dslots.html +@@ -0,0 +1,191 @@ ++ ++ ++ ++ ++ ++with-slots (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++
++

7.7.24 with-slots [Macro]

++ ++

with-slots ({slot-entry}*) ++ instance-form ++ {declaration}* {form}*
++ ⇒ {result}* ++

++

slot-entry ::=slot-name | (variable-name slot-name) ++

++

Arguments and Values::

++ ++

slot-name—a slot name; not evaluated. ++

++

variable-name—a variable name; not evaluated. ++

++

instance-form—a form; evaluted to produce instance. ++

++

instance—an object. ++

++

declaration—a declare expression; not evaluated. ++

++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

The macro with-slots establishes a ++lexical environment ++for referring to the slots in the instance ++named by the given slot-names ++as though they were variables. Within such a context ++the value of the slot can be specified by using its slot name, as if ++it were a lexically bound variable. Both setf and setq ++can be used to set the value of the slot. ++

++

The macro with-slots translates an appearance of the slot ++name as a variable into a call to slot-value. ++

++

Examples::

++ ++
++
 (defclass thing ()
++           ((x :initarg :x :accessor thing-x)
++            (y :initarg :y :accessor thing-y)))
++⇒  #<STANDARD-CLASS THING 250020173>
++ (defmethod (setf thing-x) :before (new-x (thing thing))
++   (format t "~&Changing X from ~D to ~D in ~S.~
++           (thing-x thing) new-x thing))
++ (setq thing (make-instance 'thing :x 0 :y 1)) ⇒  #<THING 62310540>
++ (with-slots (x y) thing (incf x) (incf y)) ⇒  2
++ (values (thing-x thing) (thing-y thing)) ⇒  1, 2
++ (setq thing1 (make-instance 'thing :x 1 :y 2)) ⇒  #<THING 43135676>
++ (setq thing2 (make-instance 'thing :x 7 :y 8)) ⇒  #<THING 43147374>
++ (with-slots ((x1 x) (y1 y))
++             thing1
++   (with-slots ((x2 x) (y2 y))
++               thing2
++     (list (list x1 (thing-x thing1) y1 (thing-y thing1)
++                 x2 (thing-x thing2) y2 (thing-y thing2))
++           (setq x1 (+ y1 x2))
++           (list x1 (thing-x thing1) y1 (thing-y thing1)
++                 x2 (thing-x thing2) y2 (thing-y thing2))
++           (setf (thing-x thing2) (list x1))
++           (list x1 (thing-x thing1) y1 (thing-y thing1)
++                 x2 (thing-x thing2) y2 (thing-y thing2)))))
++ |>  Changing X from 7 to (9) in #<THING 43147374>.
++⇒  ((1 1 2 2 7 7 8 8)
++     9
++     (9 9 2 2 7 7 8 8) 
++     (9)
++     (9 9 2 2 (9) (9) 8 8))
++
++ ++

Affected By::

++ ++

defclass ++

++

Exceptional Situations::

++ ++

The consequences are undefined if any slot-name is not the name ++of a slot in the instance. ++

++

See Also::

++ ++

with-accessors ++, ++slot-value ++, ++symbol-macrolet ++

++

Notes::

++ ++

A with-slots expression of the form: ++

++
++
++
++(with-slots (slot-entry_1 ...slot-entry_n) instance-form form_1 ...form_k)
++
++
++ ++

expands into the equivalent of ++

++
++
++
++(let ((in instance-form))
++
++ (symbol-macrolet (Q_1... Q_n) form_1 ...form_k))
++
++
++ ++

where Q_i is ++

++
++
(slot-entry_i () 
++(slot-value in 'slot-entry_i))
++
++ ++

if slot-entry_i is a symbol ++and is ++

++
++
(variable-name_i () 
++(slot-value in 'slot-name_i))
++
++ ++ ++

if slot-entry_i ++is of the form ++

++
++
(variable-name_i 
++slot-name_i)
++
++ ++
++
++

++Next: , Previous: , Up: Objects Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/with_002dstandard_002dio_002dsyntax.html +@@ -0,0 +1,111 @@ ++ ++ ++ ++ ++ ++with-standard-io-syntax (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Reader Dictionary  

++
++
++

23.2.12 with-standard-io-syntax [Macro]

++ ++

with-standard-io-syntax {form}*{result}* ++

++

Arguments and Values::

++ ++

forms—an implicit progn. ++

++

results—the values returned by the forms. ++

++

Description::

++ ++

Within the dynamic extent of the body of forms, all reader/printer control ++variables, including any implementation-defined ones not specified by ++this standard, are bound to values that produce standard read/print ++behavior. The values for the variables specified by this standard are listed in ++Figure 23–1. ++

++

[Reviewer Note by Barrett: *print-pprint-dispatch* should probably be mentioned here, too.] ++

++
++
  Variable                     Value                               
++  *package*                    The CL-USER package                 
++  *print-array*                t                                   
++  *print-base*                 10                                  
++  *print-case*                 :upcase                             
++  *print-circle*               nil                                 
++  *print-escape*               t                                   
++  *print-gensym*               t                                   
++  *print-length*               nil                                 
++  *print-level*                nil                                 
++  *print-lines*                nil                                 
++  *print-miser-width*          nil                                 
++  *print-pprint-dispatch*      The standard pprint dispatch table  
++  *print-pretty*               nil                                 
++  *print-radix*                nil                                 
++  *print-readably*             t                                   
++  *print-right-margin*         nil                                 
++  *read-base*                  10                                  
++  *read-default-float-format*  single-float                        
++  *read-eval*                  t                                   
++  *read-suppress*              nil                                 
++  *readtable*                  The standard readtable              
++
++         Figure 23–1: Values of standard control variables        
++
++
++ ++

Examples::

++ ++
++
 (with-open-file (file pathname :direction :output)
++   (with-standard-io-syntax
++     (print data file)))
++
++;;; ... Later, in another Lisp:
++
++ (with-open-file (file pathname :direction :input)
++   (with-standard-io-syntax
++     (setq data (read file))))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/write.html +@@ -0,0 +1,207 @@ ++ ++ ++ ++ ++ ++write (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.14 write, prin1, print, pprint, princ [Function]

++ ++

write object &key \writekeysstream
++ ⇒ object ++

++

prin 1object &optional output-stream ++ object ++princ object &optional output-streamobject ++

++

print object &optional output-streamobject ++

++

pprint object &optional output-stream<no values> ++

++

Arguments and Values::

++ ++

object—an object. ++

++

output-stream—an output stream designator. ++ The default is standard output. ++

++

\writekeydescriptionsstream—an output stream designator. ++The default is standard output. ++

++

Description::

++ ++

write, prin1, princ, print, and pprint ++write the printed representation of object to output-stream. ++

++

write is the general entry point to the Lisp printer. ++For each explicitly supplied keyword parameter named in Figure 22–6, ++the corresponding printer control variable is dynamically bound to its value ++while printing goes on; ++for each keyword parameter in Figure 22–6 that is not explicitly supplied, ++the value of the corresponding printer control variable is the same as it was ++at the time write was invoked. ++Once the appropriate bindings are established, ++the object is output by the Lisp printer. ++

++
++
  Parameter        Corresponding Dynamic Variable  
++  array            *print-array*                   
++  base             *print-base*                    
++  case             *print-case*                    
++  circle           *print-circle*                  
++  escape           *print-escape*                  
++  gensym           *print-gensym*                  
++  length           *print-length*                  
++  level            *print-level*                   
++  lines            *print-lines*                   
++  miser-width      *print-miser-width*             
++  pprint-dispatch  *print-pprint-dispatch*         
++  pretty           *print-pretty*                  
++  radix            *print-radix*                   
++  readably         *print-readably*                
++  right-margin     *print-right-margin*            
++
++  Figure 22–6: Argument correspondences for the WRITE function.
++
++
++ ++

prin1, princ, print, and pprint implicitly ++bind certain print parameters to particular values. The remaining parameter ++values are taken from ++ *print-array*, ++ *print-base*, ++ *print-case*, ++ *print-circle*, ++ *print-escape*, ++ *print-gensym*, ++ *print-length*, ++ *print-level*, ++ *print-lines*, ++ *print-miser-width*, ++ *print-pprint-dispatch*, ++ *print-pretty*, ++ *print-radix*, ++ and *print-right-margin*. ++

++

prin1 produces output suitable for input to read. ++It binds *print-escape* to true. ++

++

princ is just like prin1 except that the ++output has no escape characters. ++It binds *print-escape* to false ++

++

and *print-readably* to false. ++

++

The general rule is that output from princ is intended to look ++good to people, while output from prin1 is intended to ++be acceptable to read. ++

++

print is just like prin1 ++except that the printed representation ++of object is preceded by a newline ++and followed by a space. ++

++

pprint is just like print except that the trailing ++space is omitted and ++object is printed with the *print-pretty* flag non-nil ++to produce pretty output. ++

++

Output-stream specifies the stream to which ++output is to be sent. ++

++

Affected By::

++ ++

*standard-output*, ++*terminal-io*, ++*print-escape*, ++*print-radix*, ++*print-base*, ++*print-circle*, ++*print-pretty*, ++*print-level*, ++*print-length*, ++*print-case*, ++*print-gensym*, ++*print-array*, ++*read-default-float-format*. ++

++

See Also::

++ ++

readtable-case ++, ++FORMAT Printer Operations ++

++

Notes::

++ ++

The functions prin1 and print do not bind *print-readably*. ++

++
++
 (prin1 object output-stream)
++≡ (write object :stream output-stream :escape t)
++
++ ++
++
 (princ object output-stream)
++≡ (write object stream output-stream :escape nil :readably nil)
++
++ ++
++
 (print object output-stream)
++≡ (progn (terpri output-stream)
++           (write object :stream output-stream
++                         :escape t)
++           (write-char #\space output-stream))
++
++ ++
++
 (pprint object output-stream)
++≡ (write object :stream output-stream :escape t :pretty t)
++
++ ++
++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/write_002dbyte.html +@@ -0,0 +1,100 @@ ++ ++ ++ ++ ++ ++write-byte (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.15 write-byte [Function]

++ ++

write-byte byte streambyte ++

++

Arguments and Values::

++ ++

byte—an integer of the stream element type ++ of stream. ++

++

stream—a binary output stream. ++

++

Description::

++ ++

write-byte writes one byte, byte, to stream. ++

++

Examples::

++ ++
++
 (with-open-file (s "temp-bytes" 
++                    :direction :output
++                    :element-type 'unsigned-byte)
++    (write-byte 101 s)) ⇒  101
++
++ ++

Side Effects::

++ ++

stream is modified. ++

++

Affected By::

++ ++

The element type of the stream. ++

++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if stream is not a stream. ++Should signal an error of type error ++if stream is not a binary output stream. ++

++

Might signal an error of type type-error if byte is not ++an integer of the stream element type of stream. ++

++

See Also::

++ ++

read-byte ++, ++write-char ++, ++

++

write-sequence ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/write_002dchar.html +@@ -0,0 +1,94 @@ ++ ++ ++ ++ ++ ++write-char (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.21 write-char [Function]

++ ++

write-char character &optional output-streamcharacter ++

++

Arguments and Values::

++ ++

character—a character. ++

++

output-stream – an output stream designator. ++ The default is standard output. ++

++

Description::

++ ++

write-char outputs character to output-stream. ++

++

Examples::

++
++
 (write-char #\a)
++ |>  a
++⇒  #\a
++ (with-output-to-string (s) 
++   (write-char #\a s)
++   (write-char #\Space s)
++   (write-char #\b s))
++⇒  "a b"
++
++ ++

Side Effects::

++ ++

The output-stream is modified. ++

++

Affected By::

++ ++

*standard-output*, ++*terminal-io*. ++

++

See Also::

++ ++

read-char ++, ++write-byte ++, ++

++

write-sequence ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/write_002dsequence.html +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ ++write-sequence (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.25 write-sequence [Function]

++ ++

write-sequence sequence stream &key start endsequence ++

++

sequence—a sequence. ++

++

stream—an output stream. ++

++

start, endbounding index designators of ++ sequence. The defaults for start and end are 0 and nil, respectively. ++

++

Description::

++ ++

write-sequence writes the elements of the subsequence ++of sequence bounded by start and end to ++stream. ++

++

Examples::

++ ++
++
 (write-sequence "bookworms" *standard-output* :end 4)
++  |>  book
++ ⇒  "bookworms"
++
++ ++

Side Effects::

++ ++

Modifies stream. ++

++

Exceptional Situations::

++ ++

Should be prepared to signal an error of type type-error ++ if sequence is not a proper sequence. ++Should signal an error of type type-error ++ if start is not a non-negative integer. ++Should signal an error of type type-error ++ if end is not a non-negative integer or nil. ++

++

Might signal an error of type type-error if an element of the ++bounded sequence is not a member of the ++stream element type of the stream. ++

++

See Also::

++ ++

Compiler Terminology, ++read-sequence ++, ++write-string ++, ++write-line ++

++

Notes::

++ ++

write-sequence is identical in effect to iterating over the indicated ++subsequence and writing one element at a time to stream, but ++may be more efficient than the equivalent loop. An efficient implementation ++is more likely to exist for the case where the sequence is a ++vector with the same element type as the stream. ++

++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/write_002dstring.html +@@ -0,0 +1,115 @@ ++ ++ ++ ++ ++ ++write-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.23 write-string, write-line [Function]

++ ++

write-string string &optional output-stream &key start endstring ++

++

write-line string &optional output-stream &key start endstring ++

++

Arguments and Values::

++ ++

string—a string. ++

++

output-stream – an output stream designator. ++ The default is standard output. ++

++

start, endbounding index designators of string. ++ The defaults for start and end are 0 and nil, respectively. ++

++

Description::

++ ++

write-string writes the characters of ++the subsequence of string bounded by start and end ++to output-stream. ++write-line does the same thing, ++but then outputs a newline afterwards. ++

++

Examples::

++ ++
++
 (prog1 (write-string "books" nil :end 4) (write-string "worms"))
++ |>  bookworms
++⇒  "books"
++ (progn (write-char #\*)
++        (write-line "test12" *standard-output* :end 5) 
++        (write-line "*test2")
++        (write-char #\*)
++        nil)
++ |>  *test1
++ |>  *test2
++ |>  *
++⇒  NIL
++
++ ++

Affected By::

++ ++

*standard-output*, ++*terminal-io*. ++

++

See Also::

++ ++

read-line ++, ++write-char ++

++

Notes::

++ ++

write-line and write-string return string, ++not the substring bounded by start and end. ++

++
++
 (write-string string)
++≡ (dotimes (i (length string)
++      (write-char (char string i)))
++
++ (write-line string)
++≡ (prog1 (write-string string) (terpri))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/write_002dto_002dstring.html +@@ -0,0 +1,138 @@ ++ ++ ++ ++ ++ ++write-to-string (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Printer Dictionary  

++
++
++

22.4.15 write-to-string, prin1-to-string, princ-to-string [Function]

++ ++

write-to-string object &key \writekeys
++ ⇒ string ++

++

prin 1-to-string ++ object string ++

++

princ-to-string objectstring ++

++

Arguments and Values::

++ ++

object—an object. ++

++

\writekeydescriptions ++

++

string—a string. ++

++

Description::

++ ++

write-to-string, prin1-to-string, and princ-to-string ++are used to create a string consisting of the printed representation ++of object. ++Object is effectively printed as if by write, ++prin1, or princ, respectively, ++and the characters that would be output are made ++into a string. ++

++

write-to-string is the general output function. ++It has the ability to specify all the parameters applicable ++to the printing of object. ++

++

prin1-to-string acts like write-to-string with ++:escape t, that is, escape characters are written where appropriate. ++

++

princ-to-string acts like write-to-string with ++

++

:escape nil :readably nil. ++

++

Thus no escape characters are written. ++

++

All other keywords that would be specified to write-to-string ++are default values when prin1-to-string ++or princ-to-string is invoked. ++

++

The meanings and defaults for the keyword arguments to write-to-string ++are the same as those for write. ++

++

Examples::

++ ++
++
 (prin1-to-string "abc") ⇒  "\"abc\""
++ (princ-to-string "abc") ⇒  "abc"
++
++ ++

Affected By::

++ ++

*print-escape*, ++*print-radix*, ++*print-base*, ++*print-circle*, ++*print-pretty*, ++*print-level*, ++*print-length*, ++*print-case*, ++*print-gensym*, ++*print-array*, ++*read-default-float-format*. ++

++

See Also::

++ ++

write ++

++

Notes::

++ ++
++
 (write-to-string object {key argument}*)
++≡ (with-output-to-string (#1=#:string-stream) 
++     (write object :stream #1# {key argument}*))
++
++ (princ-to-string object)
++≡ (with-output-to-string (string-stream)
++     (princ object string-stream))
++
++ (prin1-to-string object)
++≡ (with-output-to-string (string-stream)
++     (prin1 object string-stream))
++
++ ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/y_002dor_002dn_002dp.html +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++y-or-n-p (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++
++

21.2.37 y-or-n-p, yes-or-no-p [Function]

++ ++

y-or-n-p &optional control &rest argumentsgeneralized-boolean ++

++

yes-or-no-p &optional control &rest argumentsgeneralized-boolean ++

++

Arguments and Values::

++ ++

control—a format control. ++

++

argumentsformat arguments for control. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

These functions ask a question and parse a response from the user. ++They return true if the answer is affirmative, ++or false if the answer is negative. ++

++

y-or-n-p is for asking the user a question whose answer is either ++“yes” or “no.” ++It is intended that the reply require ++the user to answer a yes-or-no question with a single ++character. ++yes-or-no-p is also for asking the user a question ++whose answer is either “Yes” or “No.” ++It is intended that the reply require ++the user to take more action than just a single keystroke, such as typing ++the full word yes or no followed by a newline. ++

++

y-or-n-p types out a message (if supplied), reads an answer ++in some implementation-dependent manner (intended to be short and simple, ++such as reading a single character such as Y or N). ++yes-or-no-p types out a message (if supplied), ++attracts the user’s attention (for example, by ringing ++the terminal’s bell), ++and reads an answer ++in some implementation-dependent manner (intended to be multiple characters, ++such as YES or NO). ++

++

If format-control is supplied and not nil, ++then a fresh-line operation is performed; then ++a message is printed as if format-control and arguments ++were given to format. ++In any case, yes-or-no-p and y-or-n-p will provide ++a prompt such as “(Y or N)” or “(Yes or No)” if appropriate. ++

++

All input and output are performed using query I/O. ++

++

Examples::

++
++
 (y-or-n-p "(t or nil) given by")
++ |>  (t or nil) given by (Y or N) |>>Y<<|
++⇒  true
++ (yes-or-no-p "a ~S message" 'frightening) 
++ |>  a FRIGHTENING message (Yes or No) |>>no<<|
++⇒  false
++ (y-or-n-p "Produce listing file?") 
++ |>  Produce listing file?
++ |>  Please respond with Y or N. |>>n<<|
++⇒  false
++
++ ++

Side Effects::

++ ++

Output to and input from query I/O will occur. ++

++

Affected By::

++ ++

*query-io*. ++

++

See Also::

++ ++

format ++

++

Notes::

++ ++

yes-or-no-p and yes-or-no-p do not add question marks ++to the end of the prompt string, so any desired question mark or other ++punctuation should be explicitly included in the text query. ++

++
++
++

++Next: , Previous: , Up: Streams Dictionary  

++
++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/info/gcl/zerop.html +@@ -0,0 +1,93 @@ ++ ++ ++ ++ ++ ++zerop (ANSI and GNU Common Lisp Document) ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++

++Next: , Previous: , Up: Numbers Dictionary  

++
++
++

12.2.18 zerop [Function]

++ ++

zerop numbergeneralized-boolean ++

++

Pronunciation::

++ ++

pronounced ’z\=e (, )r\=o(, )p\=e ++

++

Arguments and Values::

++ ++

number—a number. ++

++

generalized-boolean—a generalized boolean. ++

++

Description::

++ ++

Returns true if number is zero (integer, float, or complex); ++otherwise, returns false. ++

++

Regardless of whether an implementation provides distinct representations ++for positive and negative floating-point zeros, (zerop -0.0) ++always returns true. ++

++

Examples::

++ ++
++
 (zerop 0) ⇒  true
++ (zerop 1) ⇒  false
++ (zerop -0.0) ⇒  true
++ (zerop 0/100) ⇒  true
++ (zerop #c(0 0.0)) ⇒  true
++
++ ++

Exceptional Situations::

++ ++

Should signal an error of type type-error ++ if number is not a number. ++

++

Notes::

++ ++
++
 (zerop number) ≡ (= number 0)
++
++ ++ ++ ++ ++ ++ +--- gcl-2.6.12.orig/info/makefile ++++ gcl-2.6.12/info/makefile +@@ -3,16 +3,17 @@ + + INFO_DIR=/usr/local/lib/info + +-GCL_PDF=gcl-tk.pdf gcl-si.pdf #gcl.pdf ++GCL_PDF=gcl-tk.pdf gcl-si.pdf gcl.pdf + #GCL_DVI=gcl-tk.dvi gcl-si.dvi #gcl.dvi + #GCL_HTML=gcl-si_toc.html gcl-tk_toc.html gcl_toc.html +-GCL_HTML=gcl-si/index.html gcl-tk/index.html #gcl/index.html +-#HTML_CMD=texi2html -split_chapter +-HTML_CMD=makeinfo --html ++GCL_HTML=gcl-si/index.html gcl-tk/index.html gcl/index.html + + -include ../makedefs + +-all: gcl-tk.info gcl-si.info $(GCL_PDF) $(GCL_HTML) #gcl.info ++#HTML_CMD=texi2html -split_chapter ++HTML_CMD=$(MAKEINFO) --html ++ ++all: gcl-tk.info gcl-si.info $(GCL_PDF) $(GCL_HTML) gcl.info + + .texi.info: + rm -f $*.*gz +@@ -32,24 +33,24 @@ GCL_MAN= chap-1.texi chap-2.texi chap-3. + chap-24.texi chap-25.texi chap-26.texi chap-a.texi + + %.pdf: %.dvi +- dvipdfm $< ++ -dvipdfm $< + + gcl-si.dvi: ${GCL_SI} gcl-si.texi +- TEXINPUTS=.:$$TEXINPUTS tex --interaction nonstopmode gcl-si.texi || true ++ -TEXINPUTS=.:$$TEXINPUTS tex --interaction nonstopmode gcl-si.texi || true + rm -f *.cp *.ky *.vr *.tp *.pg *.toc *.aux *.log *.fn + + gcl-si.info: ${GCL_SI} gcl-si.texi + -$(MAKEINFO) gcl-si.texi + + gcl-tk.dvi: ${GCL_TK} gcl-tk.texi +- TEXINPUTS=.:$$TEXINPUTS tex --interaction nonstopmode gcl-tk.texi || true ++ -TEXINPUTS=.:$$TEXINPUTS tex --interaction nonstopmode gcl-tk.texi || true + rm -f *.cp *.ky *.vr *.tp *.pg *.toc *.aux *.log *.fn + + gcl-tk.info: ${GCL_TK} gcl-tk.texi + -$(MAKEINFO) gcl-tk.texi + + gcl.dvi: ${GCL_MAN} gcl.texi +- TEXINPUTS=.:$$TEXINPUTS tex --interaction nonstopmode gcl.texi || true ++ -TEXINPUTS=.:$$TEXINPUTS tex --interaction nonstopmode gcl.texi || true + rm -f *.cp *.ky *.vr *.tp *.pg *.toc *.aux *.log *.fn + + gcl.info: ${GCL_MAN} gcl.texi +@@ -100,7 +101,7 @@ install: #$(GCL_PDF) $(GCL_HTML) + # -cp gcl-tk/* $(DESTDIR)$(INFO_DIR)../doc/gcl-doc/gcl-tk.html + -mkdir -p $(DESTDIR)$(INFO_DIR)../doc + # -cp -r gcl-si gcl gcl-tk $(DESTDIR)$(INFO_DIR)../doc +- -cp -r gcl-si gcl-tk $(DESTDIR)$(INFO_DIR)../doc ++ -cp -r gcl gcl-si gcl-tk $(DESTDIR)$(INFO_DIR)../doc + -cp *pdf $(DESTDIR)$(INFO_DIR)../doc + + FILE=gcl-si.texi +@@ -109,15 +110,17 @@ srcs: + awk '{ i++; printf("%s ",$$2); if ((i%5) == 0) printf("\\\n")}' + + tex: +- TEXINPUTS=.:$$TEXINPUTS tex gcl-si.texi +- TEXINPUTS=.:$$TEXINPUTS tex gcl-tk.texi +- TEXINPUTS=.:$$TEXINPUTS tex gcl.texi ++ -TEXINPUTS=.:$$TEXINPUTS tex gcl-si.texi ++ -TEXINPUTS=.:$$TEXINPUTS tex gcl-tk.texi ++ -TEXINPUTS=.:$$TEXINPUTS tex gcl.texi + @echo must do twice to get indices correct... + @echo so do '$(MAKE) tex' again + +-clean: ++dist-clean: clean + rm -f *.info* *.html *.pdf +- rm -rf gcl.IC gcl.IE gcl.IG gcl.IP gcl.IR gcl.IT gcl.fu gcl gcl-si gcl-tk + rm -rf gcl gcl-si gcl-tk + ++clean: ++ rm -rf gcl.IC gcl.IE gcl.IG gcl.IP gcl.IR gcl.IT gcl.fu ++ + .INTERMEDIATE: gcl-tk.dvi gcl-si.dvi gcl.dvi +--- gcl-2.6.12.orig/lsp/gcl_info.lsp ++++ gcl-2.6.12/lsp/gcl_info.lsp +@@ -172,41 +172,40 @@ + + (defvar *old-lib-directory* nil) + (defun setup-info (name &aux tem file) +- (or (eq *old-lib-directory* si::*lib-directory*) +- (progn +- (setq *old-lib-directory* si::*lib-directory*) +- (push (si::string-concatenate +- si::*lib-directory* "info/") *info-paths*) +- (setq *info-paths* (si::fix-load-path *info-paths*)))) +- (cond ((or (equal name "DIR")) +- (setq name "dir"))) +-;; compressed info reading -- search for gzipped files, and open with base filename ++ ++ (unless (eq *old-lib-directory* *lib-directory*) ++ (setq *old-lib-directory* *lib-directory*) ++ (push (string-concatenate *lib-directory* "info/") *info-paths*) ++ (setq *info-paths* (fix-load-path *info-paths*))) ++ ++ (when (equal name "DIR") ++ (setq name "dir")) ++ ++ ;; compressed info reading -- search for gzipped files, and open with base filename + ;; relying on si::*allow-gzipped-files* to uncompress +- (setq file (si::file-search name *info-paths* '("" ".info" ".gz") nil)) ++ (setq file (file-search name *info-paths* '("" ".info" ".gz") nil)) + (let ((ext (search ".gz" file))) + (when ext + (setq file (subseq file 0 ext)))) +- (cond ((and (null file) +- (not (equal name "dir"))) +- (let* ( +- (tem (show-info "(dir)Top" nil nil)) +- *case-fold-search*) +- (cond ((f >= (string-match +- (si::string-concatenate +- "\\(([^(]*" +- (re-quote-string name) +- "(.info)?)\\)") +- tem ) 0) +- (setq file (get-match tem 1))))))) +- (cond (file +- (let* ((na (namestring (truename file)))) +- (cond ((setq tem (assoc na *info-data* :test 'equal)) +- (setq *current-info-data* tem)) +- (t (setq *current-info-data* +- (list na (info-get-tags na) nil)) +- (setq *info-data* (cons *current-info-data* *info-data*) +- ))))) +- (t (format t "(not found ~s)" name))) ++ ++ (unless file ++ (unless (equal name "dir") ++ (let* ((tem (show-info "(dir)Top" nil nil)) ++ *case-fold-search*) ++ (cond ((<= 0 (string-match ++ (string-concatenate "\\(([^(]*" (re-quote-string name) "(.info)?)\\)") ++ tem)) ++ (setq file (get-match tem 1))))))) ++ ++ (IF file ++ (let* ((na (namestring file )));(truename file) ++ (cond ((setq tem (assoc na *info-data* :test 'equal)) ++ (setq *current-info-data* tem)) ++ (t (setq *current-info-data* ++ (list na (info-get-tags na) nil)) ++ (setq *info-data* (cons *current-info-data* *info-data*) ++ )))) ++ (format t "(not found ~s)" name)) + nil) + + (defun get-info-choices (pat type) +--- gcl-2.6.12.orig/makefile ++++ gcl-2.6.12/makefile +@@ -34,7 +34,7 @@ TESTDIR = ansi-tests + + VERSION=`cat majvers`.`cat minvers` + +-all: $(BUILD_BFD) system command cmpnew/gcl_collectfn.o lsp/gcl_info.o do-gcl-tk release # do-info ++all: $(BUILD_BFD) system command cmpnew/gcl_collectfn.o lsp/gcl_info.o do-gcl-tk release do-info + + ASRC:=$(shell ls -1 o/*.c lsp/*.lsp cmpnew/*.lsp pcl/*sp clcs/*sp xgcl-2/*p) #o/*.d o/*.h h/*.h + TAGS: $(ASRC) +@@ -234,7 +234,7 @@ gclclean: + cd $(PCLDIR) && $(MAKE) clean + cd xgcl-2 && $(MAKE) clean + (cd $(TESTDIR); $(MAKE) clean) +-# (cd info ; $(MAKE) clean) ++ (cd info ; $(MAKE) clean) + # find binutils -name "*.o" -exec rm {} \; + rm -rf binutils + rm -f foo.tcl config.log makedefs makedefsafter config.cache config.status makedefc +--- gcl-2.6.12.orig/o/gmp_wrappers.c ++++ /dev/null +@@ -1,4 +0,0 @@ +-int jmp_gmp=0; +-#define GMP_EXTERN +-#define GMP_EXTERN_INLINE +-#include "include.h" +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -318,7 +318,7 @@ update_real_maxpage(void) { + } + massert(!mbrk(cur)); + #endif +- ++ + phys_pages=ufmin(get_phys_pages1(0)+page(beg),real_maxpage)-page(beg); + + get_gc_environ(); +@@ -452,13 +452,13 @@ static char *stack_to_be_allocated; + void + get_stack_to_be_allocated(unsigned long size) { + stack_to_be_allocated=alloca(size); ++ memset(stack_to_be_allocated,0,size); + } + + DEFUN_NEW("EQUAL-TAIL-RECURSION-CHECK",object,fSequal_tail_recursion_check,SI,1,1,NONE,II,OO,OO,OO,(fixnum s),"") { + object x0=make_list(s/sizeof(object)),x1=make_list(s/sizeof(object)); + char *w; + get_stack_to_be_allocated(s); +- memset(stack_to_be_allocated,0,s); + fLequal(x0,x1); + for (w=stack_to_be_allocated;w LISP::GO +- LISP::NSUBST-IF-NOT LISP::FOURTH LISP::DEFINE-SETF-METHOD +- LISP::DO LISP::STORAGE-CONDITION LISP::BIT-ORC2 +- LISP::STRING-TRIM LISP::MAPC LISP::PACKAGE LISP::NUMERATOR +- LISP::MACROLET LISP::HASH-TABLE-SIZE LISP::LDB-TEST +- LISP::READER-ERROR LISP::ROW-MAJOR-AREF +- LISP::CHAR-NOT-GREATERP LISP::REM LISP::ARRAYP LISP::CDADR +- LISP::FFLOOR LISP::SUBST-IF LISP::FIND-IF LISP::MAKE-SYMBOL +- LISP::MAKE-PACKAGE LISP::STRING= LISP::MAPLIST LISP::WRITE +- LISP::ATOM LISP::BIT-VECTOR LISP::DECF LISP::LOGXOR +- LISP::MULTIPLE-VALUES-LIMIT LISP::OPTIMIZE LISP::REST +- LISP::FIND-IF-NOT LISP::COUNT LISP::FMAKUNBOUND LISP::LIST +- LISP::BOOLE-NOR LISP::ZEROP LISP::// LISP::RASSOC LISP::1+ +- LISP::RASSOC-IF LISP::NOTANY LISP::LAST LISP::*PRINT-PRETTY* +- LISP::MAPCAN LISP::DEFMACRO LISP::SHADOW LISP::NRECONC +- LISP::++ LISP::LIST* LISP::STRING< LISP::SOFTWARE-VERSION +- LISP::*GENSYM-COUNTER* LISP::REMOVE-DUPLICATES +- LISP::PARSE-NAMESTRING LISP::UPPER-CASE-P +- LISP::MAKE-CONCATENATED-STREAM LISP::DO-EXTERNAL-SYMBOLS +- LISP::CONCATENATE LISP::CHAR-CONTROL-BIT LISP::WARN +- LISP::BIGNUM LISP::SIMPLE-VECTOR-P LISP::DELETE-DUPLICATES +- LISP::NAMESTRING LISP::BIT-ORC1 LISP::SAFETY LISP::MEMBER-IF +- LISP::COPY-SEQ LISP::ECHO-STREAM LISP::Y-OR-N-P LISP::COMPLEX +- LISP::COUNT-IF-NOT LISP::REDUCE LISP::ASSOC-IF +- LISP::MACRO-FUNCTION LISP::MAKE-SYNONYM-STREAM LISP::NUMBERP +- LISP::SXHASH LISP::CAR LISP::LOGORC2 LISP::UNSIGNED-CHAR +- LISP::BYTE-POSITION LISP::UNIX LISP::DEFLA +- LISP::ENCODE-UNIVERSAL-TIME LISP::LOWER-CASE-P LISP::EVAL-WHEN +- LISP::ARRAY-TOTAL-SIZE LISP::DO* LISP::TRUENAME +- LISP::RANDOM-STATE LISP::WARNING LISP::FTYPE +- LISP::FLOATING-POINT-INVALID-OPERATION LISP::PARSE-ERROR +- LISP::INT-CHAR LISP::LAMBDA-PARAMETERS-LIMIT +- LISP::GET-INTERNAL-RUN-TIME LISP::GET-INTERNAL-REAL-TIME +- LISP::SIGNED-BYTE LISP::VECTOR LISP::PACKAGE-ERROR +- LISP::DESCRIBE LISP::UNREAD-CHAR LISP::WRITE-STRING +- LISP::OTHERWISE LISP::SPECIFIC-CORRECTABLE-ERROR +- LISP::ARRAY-HAS-FILL-POINTER-P LISP::LOGORC1 LISP::PROVIDE +- LISP::THROW LISP::TYPE-ERROR LISP::FORMAT LISP::DEFPARAMETER +- LISP::REMF LISP::DEFINE-MODIFY-MACRO +- LISP::MOST-NEGATIVE-LONG-FLOAT +- LISP::MOST-NEGATIVE-DOUBLE-FLOAT +- LISP::MOST-NEGATIVE-SINGLE-FLOAT +- LISP::MOST-NEGATIVE-SHORT-FLOAT LISP::MULTIPLE-VALUE-CALL +- LISP::TYPE-OF LISP::TAG LISP::&AUX LISP::TAGBODY +- LISP::SIMPLE-STRING-P LISP::READTABLEP LISP::READTABLE +- LISP::ARRAY-DIMENSION LISP::FILE-ERROR LISP::SLEEP +- LISP::SYNONYM-STREAM LISP::MINUSP LISP::DELETE-FILE +- LISP::CELL-ERROR LISP::COPY-READTABLE LISP::NUMBER +- LISP::WRITE-CHAR LISP::RENAME-FILE LISP::UNSIGNED-SHORT +- LISP::STRUCTURE-OBJECT LISP::QUOTE LISP::CADR LISP::BOOLE-IOR +- LISP::LISTP LISP::CHARACTERP LISP::CHARACTER +- LISP::LISP-IMPLEMENTATION-TYPE LISP::LOGICAL-PATHNAME +- LISP::CDADDR LISP::TAILP LISP::CAADDR LISP::PATHNAME-TYPE +- LISP::PLUSP LISP::CASE LISP::MACHINE-TYPE LISP::LOAD +- LISP::ENDP LISP::FRESH-LINE LISP::DEFCONSTANT LISP::SYMBOL +- LISP::VALUES LISP::SET-DIFFERENCE LISP::*PRINT-ARRAY* +- LISP::SET-EXCLUSIVE-OR LISP::PROG2 LISP::DIVISION-BY-ZERO +- LISP::PHASE LISP::CAAAR LISP::ETYPECASE LISP::CTYPECASE +- LISP::NOT LISP::BOOLE-C2 LISP::NTH LISP::SPECIAL-OPERATOR-P +- LISP::STREAM-ELEMENT-TYPE LISP::IDENTITY LISP::*PRINT-RADIX* +- LISP::MEMBER LISP::SHORT-FLOAT LISP::NIL LISP::ACONS LISP::MOD +- LISP::EQL LISP::CADDR LISP::/// LISP::KEYWORDP LISP::COERCE +- LISP::BSD LISP::CHAR-FONT LISP::*PRINT-LEVEL* LISP::PROBE-FILE +- LISP::PATHNAME-DIRECTORY LISP::PROG1 LISP::STABLE-SORT +- LISP::SIMPLE-WARNING LISP::CONDITION LISP::SQRT LISP::REQUIRE +- LISP::GCD LISP::GETHASH LISP::ISQRT LISP::DEFVAR +- LISP::LAMBDA-CLOSURE LISP::STREAM LISP::REMOVE-IF +- LISP::DECLARATION LISP::APROPOS LISP::READ-LINE +- LISP::LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-LONG-FLOAT +- LISP::LEAST-NEGATIVE-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-SHORT-FLOAT LISP::LONG-SITE-NAME +- LISP::NSTRING-UPCASE LISP::LONG-FLOAT-NEGATIVE-EPSILON +- LISP::LONG-FLOAT-EPSILON LISP::*BREAK-ENABLE* LISP::BIT-NAND +- LISP::ALPHANUMERICP LISP::FROUND LISP::LAMBDA-LIST-KEYWORDS +- LISP::CDADAR LISP::LENGTH LISP::OR LISP::TWO-WAY-STREAM +- LISP::COSH LISP::CAADAR LISP::WRITE-BYTE LISP::RATIONALP +- LISP::FIND LISP::SUBSTITUTE-IF-NOT LISP::DEPOSIT-FIELD +- LISP::FLOATING-POINT-UNDERFLOW LISP::FLOATING-POINT-OVERFLOW +- LISP::WITH-OPEN-FILE LISP::BOOLE-ANDC2 LISP::IF LISP::RATIONAL +- LISP::PARSE-INTEGER LISP::SFUN LISP::MOST-POSITIVE-LONG-FLOAT +- LISP::MOST-POSITIVE-DOUBLE-FLOAT +- LISP::MOST-POSITIVE-SINGLE-FLOAT +- LISP::MOST-POSITIVE-SHORT-FLOAT LISP::PSETQ LISP::COMPILE +- LISP::VALUES-LIST LISP::GRAPHIC-CHAR-P LISP::LOCALLY +- LISP::SIGNED-CHAR LISP::BOOLE-C1 LISP::FLOATP +- LISP::DOUBLE-FLOAT LISP::DEFTYPE LISP::UNEXPORT LISP::SYSTEM +- LISP::GFUN LISP::MAKE-ARRAY LISP::ROOM LISP::APROPOS-LIST +- LISP::ASIN LISP::SETQ LISP::CFUN LISP::CHAR>= LISP::SYMBOLP +- LISP::PATHNAMEP LISP::TIME LISP::VECTOR-POP LISP::LABELS +- LISP::TENTH LISP::SET-SYNTAX-FROM-CHAR LISP::TYPECASE +- LISP::NINTH LISP::WITH-PACKAGE-ITERATOR LISP::SYMBOL-PACKAGE +- LISP::FLOAT-RADIX LISP::*LINK-ARRAY* LISP::VECTORP +- LISP::REMOVE LISP::EVAL LISP::** LISP::CHAR-CODE +- LISP::YES-OR-NO-P LISP::INTEGER-DECODE-FLOAT LISP::APPEND +- LISP::DRIBBLE LISP::USER-HOMEDIR-PATHNAME LISP::RETURN-FROM +- LISP::CHAR-UPCASE LISP::STREAMP LISP::DOTIMES LISP::CHAR<= +- LISP::POSITIVE-FIXNUM LISP::UNBOUND-VARIABLE +- LISP::SIGNED-SHORT LISP::CONSTANTP LISP::COMPILER-LET +- LISP::FLOAT-PRECISION LISP::IMPORT LISP::*TRACE-OUTPUT* +- LISP::TERPRI LISP::&ALLOW-OTHER-KEYS LISP::PATHNAME-DEVICE +- LISP::CHAR-INT LISP::STRING-STREAM LISP::STRING LISP::DPB +- LISP::LDB LISP::CDR LISP::DOLIST LISP::DEFCFUN +- LISP::BOOLE-ANDC1 LISP::STYLE-WARNING LISP::BREAK +- LISP::CHAR-NOT-EQUAL LISP::PROGV LISP::*STANDARD-OUTPUT* +- LISP::FIXNUM LISP::NUNION LISP::*PRINT-READABLY* +- LISP::MULTIPLE-VALUE-SETQ LISP::PRIN1 +- LISP::PACKAGE-USED-BY-LIST LISP::PACKAGE-USE-LIST LISP::SUBLIS +- LISP::SCHAR LISP::MAKE-ECHO-STREAM LISP::INLINE LISP::DECLAIM +- LISP::SCALE-FLOAT LISP::*PRINT-LENGTH* LISP::PROG +- LISP::SHORT-FLOAT-NEGATIVE-EPSILON LISP::SHORT-FLOAT-EPSILON +- LISP::&WHOLE LISP::INPUT-STREAM-P LISP::SIMPLE-BASE-STRING +- LISP::PROG* LISP::DECODE-UNIVERSAL-TIME +- LISP::WITH-OUTPUT-TO-STRING LISP::COMMONP LISP::EVENP +- LISP::DELETE LISP::SUBST LISP::FUNCALL LISP::CHAR-NOT-LESSP +- LISP::SGC LISP::COS LISP::PATHNAME LISP::NTHCDR +- LISP::COMPILATION-SPEED LISP::*BREAK-ON-WARNINGS* +- LISP::CLRHASH LISP::*PRINT-GENSYM* LISP::SIXTH +- LISP::MAKE-RANDOM-STATE LISP::FIRST LISP::LOGNOT LISP::ROUND +- LISP::AREF LISP::DIGIT-CHAR LISP::*** LISP::LOGNAND LISP::CDDR +- LISP::SEVENTH LISP::DOUBLE-FLOAT-NEGATIVE-EPSILON +- LISP::DOUBLE-FLOAT-EPSILON LISP::VARIABLE +- LISP::LISP-IMPLEMENTATION-VERSION LISP::BIT-XOR LISP::RPLACD +- LISP::LEAST-POSITIVE-NORMALIZED-LONG-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-POSITIVE-LONG-FLOAT +- LISP::LEAST-POSITIVE-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-SHORT-FLOAT LISP::FINISH-OUTPUT +- LISP::PROCLAIM LISP::MAKE-STRING LISP::BASE-STRING +- LISP::BSD386 LISP::MACHINE-VERSION LISP::*APPLYHOOK* +- LISP::LOGCOUNT LISP::REMOVE-IF-NOT LISP::LOGBITP LISP::SPEED +- LISP::BOOLE-AND LISP::STANDARD-METHOD LISP::STRINGP +- LISP::GET-SETF-METHOD LISP::SVREF LISP::DELETE-IF-NOT +- LISP::LISTEN LISP::FUNCTION LISP::CHAR-HYPER-BIT +- LISP::MEMBER-IF-NOT LISP::CHAR-SUPER-BIT LISP::SPACE +- LISP::CDAAR LISP::STANDARD-CHAR-P LISP::MERGE LISP::CHAR-NAME +- LISP::EXPORT LISP::CEILING LISP::SINGLE-FLOAT LISP::INT +- LISP::CHAR-META-BIT LISP::ACOS LISP::DESTRUCTURING-BIND +- LISP::CDDDR LISP::GMP LISP::ECASE LISP::MAP LISP::CCASE +- LISP::LAMBDA LISP::ALPHA-CHAR-P LISP::ASH LISP::BIT-AND +- LISP::SOFTWARE-TYPE LISP::AND LISP::FIND-ALL-SYMBOLS +- LISP::SECOND LISP::LOGEQV LISP::CHAR-BITS-LIMIT +- LISP::SHADOWING-IMPORT LISP::DOUBLE LISP::STEP LISP::FCEILING +- LISP::NULL LISP::REVERSE LISP::MACRO +- LISP::MOST-NEGATIVE-FIXNUM LISP::PACKAGEP LISP::NBUTLAST +- LISP::REVAPPEND LISP::STANDARD-CLASS LISP::FILL +- LISP::NSUBST-IF LISP::PI LISP::BY LISP::INTEGER +- LISP::NSTRING-CAPITALIZE LISP::EQ LISP::CHAR-BIT +- LISP::STRING-EQUAL LISP::REMPROP LISP::LAMBDA-BLOCK +- LISP::LDIFF LISP::&KEY LISP::RATIONALIZE LISP::FLOAT-SIGN +- LISP::READ-PRESERVING-WHITESPACE LISP::PUSHNEW +- LISP::GET-PROPERTIES LISP::CHAR> LISP::READ-FROM-STRING +- LISP::STRING-GREATERP LISP::DIRECTORY-NAMESTRING LISP::PSETF +- LISP::PPRINT LISP::DISASSEMBLE LISP::>= LISP::NSUBSTITUTE +- LISP::IN-PACKAGE LISP::BYE LISP::LCM LISP::<= LISP::DEFUN +- LISP::LONG-FLOAT LISP::ATAN LISP::MACROEXPAND-1 +- LISP::DIRECTORY LISP::ARRAY-RANK LISP::SYMBOL-PLIST +- LISP::HASH-TABLE-P LISP::UNION LISP::MC68020 LISP::PRINT +- LISP::PROGN LISP::PATHNAME-HOST LISP::/= LISP::CHAR= +- LISP::*READ-BASE* LISP::FLOATING-POINT-INEXACT +- LISP::MAKE-SEQUENCE LISP::SIGNUM LISP::STREAM-ERROR +- LISP::LOGNOR LISP::1- LISP::RASSOC-IF-NOT LISP::SIMPLE-ARRAY +- LISP::NTH-VALUE LISP::RATIO LISP::STRING-LESSP +- LISP::CONCATENATED-STREAM LISP::REAL LISP::SUBSTITUTE +- LISP::DIGIT-CHAR-P LISP::CHAR< LISP::INTEGER-LENGTH +- LISP::EQUAL LISP::COPY-SYMBOL LISP::CHAR-DOWNCASE +- LISP::DECODE-FLOAT LISP::NCONC LISP::ROTATEF +- LISP::ARRAY-ROW-MAJOR-INDEX LISP::WITH-HASH-TABLE-ITERATOR +- LISP::CLOSE LISP::RANDOM LISP::ARRAY LISP::CATCH +- LISP::MERGE-PATHNAMES LISP::GET-OUTPUT-STREAM-STRING +- LISP::OBJECT LISP::PROGRAM-ERROR LISP::NINTERSECTION +- LISP::ASINH LISP::IGNORE LISP::BOOLE-CLR LISP::SET-CHAR-BIT +- LISP::BIT-NOT LISP::SINGLE-FLOAT-NEGATIVE-EPSILON +- LISP::SINGLE-FLOAT-EPSILON LISP::MULTIPLE-VALUE-LIST +- LISP::POSITION-IF-NOT LISP::SAVE LISP::BIT-VECTOR-P +- LISP::BIT-EQV LISP::FLOAT-DIGITS LISP::ARRAY-DISPLACEMENT +- LISP::FILE-POSITION LISP::BOTH-CASE-P LISP::RETURN +- LISP::MAPHASH LISP::MOST-POSITIVE-FIXNUM LISP::READ-BYTE +- LISP::COPY-TREE LISP::CHAR-GREATERP LISP::CHECK-TYPE +- LISP::MACHINE-INSTANCE LISP::CONSTANTLY LISP::FUNCTIONP +- LISP::EVERY LISP::STRING/= LISP::STRING>= LISP::STRING<= +- LISP::MAKE-HASH-TABLE LISP::*DEFAULT-PATHNAME-DEFAULTS* +- LISP::SIMPLE-CONDITION LISP::&REST LISP::SYMBOL-FUNCTION +- LISP::RPLACA LISP::*TERMINAL-IO* LISP::CHAR/= +- LISP::PRINT-NOT-READABLE LISP::CONS LISP::*EVAL-WHEN-COMPILE* +- LISP::CADAR LISP::SIMPLE-BIT-VECTOR LISP::READ-CHAR-NO-HANG +- LISP::CDDADR LISP::BIT-ANDC2 LISP::NSTRING-DOWNCASE +- LISP::CADADR LISP::BOOLE-NAND LISP::LOG LISP::STANDARD-CHAR +- LISP::DOCUMENTATION LISP::GET-UNIVERSAL-TIME LISP::BIT-NOR +- LISP::APPLYHOOK LISP::ARRAY-RANK-LIMIT +- LISP::ABS LISP::GBC LISP::&ENVIRONMENT LISP::PATHNAME-NAME +- LISP::BOOLEAN LISP::*READ-SUPPRESS* LISP::VOID +- LISP::PACKAGE-NAME LISP::COMPILE-FILE-PATHNAME LISP::SINH +- LISP::SYMBOL-VALUE LISP::STRING-RIGHT-TRIM LISP::SBIT +- LISP::REALP LISP::TANH LISP::MAKE-PATHNAME LISP::ASSOC +- LISP::DEFSETF LISP::ODDP LISP::UNWIND-PROTECT LISP::READ +- LISP::*READ-DEFAULT-FLOAT-FORMAT* LISP::COUNT-IF +- LISP::OUTPUT-STREAM-P LISP::BLOCK LISP::AKCL LISP::COPY-LIST +- LISP::ARRAY-IN-BOUNDS-P LISP::UNBOUND-SLOT LISP::SET +- LISP::HASH-TABLE-TEST LISP::PACKAGE-SHADOWING-SYMBOLS +- LISP::ADJUST-ARRAY LISP::EXP LISP::TYPE LISP::FILE-WRITE-DATE +- LISP::MAKE-LIST LISP::LET LISP::FORCE-OUTPUT LISP::CDDAAR +- LISP::BIT-ANDC1 LISP::GET LISP::ARITHMETIC-ERROR LISP::CADAAR +- LISP::BIT LISP::KCL LISP::&OPTIONAL LISP::GCL +- LISP::FILE-AUTHOR LISP::NSUBLIS LISP::*PRINT-CIRCLE* +- LISP::*MODULES* LISP::BUILT-IN-CLASS LISP::*READTABLE* +- LISP::SORT LISP::MAPCON LISP::*MACROEXPAND-HOOK* LISP::PUSH +- LISP::POSITION-IF LISP::SUBSETP LISP::CAAR LISP::BOOLE-SET +- LISP::STRING-CHAR-P LISP::*LOAD-VERBOSE* LISP::STRING-DOWNCASE +- LISP::STRING-UPCASE LISP::DELETE-IF LISP::HOST-NAMESTRING +- LISP::STRING-LEFT-TRIM LISP::CALL-ARGUMENTS-LIMIT +- LISP::DEFENTRY LISP::CLEAR-INPUT LISP::DO-SYMBOLS +- LISP::STRUCTURE-CLASS LISP::MISMATCH LISP::MAPL +- LISP::MULTIPLE-VALUE-PROG1 LISP::REALPART LISP::NSUBSTITUTE-IF +- LISP::COND LISP::PACKAGE-NICKNAMES LISP::COMPILED-FUNCTION-P +- LISP::CONSP LISP::SATISFIES LISP::&BODY LISP::MAP-INTO +- LISP::FLOAT LISP::SIMPLE-TYPE-ERROR LISP::ED LISP::ERROR +- LISP::ACOSH LISP::WHEN LISP::OPEN LISP::THE LISP::BIT-IOR +- LISP::MAPCAR LISP::PATHNAME-VERSION LISP::*RANDOM-STATE* +- LISP::SEQUENCE LISP::CAADR LISP::SUBTYPEP LISP::MASK-FIELD +- LISP::FIND-SYMBOL LISP::INCF LISP::SOME +- LISP::SIMPLE-BIT-VECTOR-P LISP::FIND-PACKAGE LISP::*DEBUG-IO* +- LISP::POSITION LISP::GET-DECODED-TIME LISP::ARRAY-ELEMENT-TYPE +- LISP::LET* LISP::TRUNCATE_USE_C LISP::COMPLEMENT +- LISP::EVALHOOK LISP::COMPILED-FUNCTION LISP::ARRAY-DIMENSIONS +- LISP::BOOLE-EQV LISP::*ERROR-OUTPUT* LISP::EXTENDED-CHAR +- LISP::STRUCTURE LISP::NREVERSE LISP::ADJOIN +- LISP::NSET-EXCLUSIVE-OR LISP::METHOD LISP::T LISP::COMMON +- LISP::BOOLE-ORC2 LISP::BOOLE-ORC1 LISP::ARRAY-TOTAL-SIZE-LIMIT +- LISP::LOGIOR LISP::CERROR LISP::FIFTH LISP::ASSERT +- LISP::CLEAR-OUTPUT LISP::HASH-TABLE LISP::CLINES LISP::BOOLE +- LISP::BOOLE-XOR LISP::ARRAY-DIMENSION-LIMIT +- LISP::DO-ALL-SYMBOLS LISP::COMPILE-FILE LISP::*FEATURES* +- LISP::LOGAND LISP::REPLACE LISP::> LISP::= LISP::< +- LISP::LOGANDC2 LISP::MAKE-TWO-WAY-STREAM LISP::PROCLAMATION +- LISP::TYPEP LISP::SIN LISP::BUTLAST LISP::MACROEXPAND +- LISP::SETF LISP::FLOOR LISP::STRING-NOT-EQUAL LISP::TAN +- LISP::SPECIAL LISP::MIN LISP::CODE-CHAR LISP::/ LISP::- +- LISP::ATANH LISP::+ LISP::* LISP::MAKUNBOUND LISP::*PACKAGE* +- LISP::GETF LISP::PEEK-CHAR LISP::READ-CHAR +- LISP::STRING-NOT-GREATERP LISP::ENOUGH-NAMESTRING LISP::SUBSEQ +- LISP::NAME-CHAR LISP::MAKE-CHAR LISP::BASE-CHAR +- LISP::FTRUNCATE LISP::UNUSE-PACKAGE LISP::THIRD LISP::PAIRLIS +- LISP::EXPT LISP::GENTEMP LISP::LAMBDA-BLOCK-CLOSURE +- LISP::UPGRADED-ARRAY-ELEMENT-TYPE LISP::LOOP LISP::KEYWORD +- LISP::GET-SETF-METHOD-MULTIPLE-VALUE LISP::NSUBSTITUTE-IF-NOT +- LISP::*PRINT-CASE* LISP::*PRINT-BASE* LISP::*PRINT-ESCAPE* +- LISP::BYTE-SIZE LISP::EIGHTH LISP::CHAR-LESSP +- LISP::CLX-LITTLE-ENDIAN LISP::HASH-TABLE-COUNT +- LISP::INTERNAL-TIME-UNITS-PER-SECOND LISP::TREE-EQUAL +- LISP::WRITE-TO-STRING LISP::STANDARD-GENERIC-FUNCTION +- LISP::FILL-POINTER LISP::STRING-NOT-LESSP LISP::CLASS +- LISP::PRINC-TO-STRING LISP::PRIN1-TO-STRING)) +- +-;;; Definitions for package ITERATE of type SHADOW +-(LISP::IN-PACKAGE "ITERATE") +-(LISP::SHADOW 'LISP::NIL) +-(LISP::SHADOWING-IMPORT 'LISP::NIL) +-(LISP::IMPORT +- '(LISP::CDDAR LISP::SHIFTF LISP::REMHASH LISP::CHAR-EQUAL +- LISP::NOTEVERY LISP::TRUNCATE LISP::SEARCH +- LISP::SPECIAL-FORM-P LISP::MAKE-BROADCAST-STREAM LISP::CDDDDR +- LISP::UNLESS LISP::INTERN LISP::CADDDR LISP::LOGANDC1 +- LISP::READ-DELIMITED-LIST LISP::END-OF-FILE +- WALKER::VARIABLE-LEXICAL-P LISP::APPLY LISP::SUBST-IF-NOT +- LISP::CIS LISP::ADJUSTABLE-ARRAY-P LISP::SUBSTITUTE-IF +- LISP::FILE-STREAM LISP::QUIT +- LISP::MAKE-DISPATCH-MACRO-CHARACTER LISP::CONTROL-ERROR +- LISP::MAKE-STRING-OUTPUT-STREAM LISP::MAKE-STRING-INPUT-STREAM +- LISP::*STANDARD-INPUT* LISP::STANDARD-OBJECT LISP::GENSYM +- LISP::EQUALP LISP::DELETE-PACKAGE LISP::COMPLEXP +- SYSTEM::ALLOCATE LISP::MULTIPLE-VALUE-BIND LISP::CDAADR +- LISP::VECTOR-PUSH-EXTEND LISP::RENAME-PACKAGE LISP::CAAADR +- LISP::*EVALHOOK* LISP::UNTRACE LISP::STRING-CHAR LISP::KYOTO +- LISP::INTEGERP LISP::DENOMINATOR LISP::FLET LISP::HELP +- LISP::WITH-INPUT-FROM-STRING LISP::SHORT-SITE-NAME +- LISP::FILE-NAMESTRING LISP::WRITE-LINE LISP::UNINTERN +- LISP::PRINC LISP::SIMPLE-VECTOR LISP::NSUBST LISP::FBOUNDP +- LISP::SIMPLE-STRING LISP::SPICE LISP::TRACE +- LISP::METHOD-COMBINATION LISP::BOUNDP LISP::SYMBOL-NAME +- LISP::WITH-OPEN-STREAM LISP::UNSIGNED-BYTE LISP::HELP* +- LISP::NOTINLINE LISP::GET-MACRO-CHARACTER +- LISP::SET-MACRO-CHARACTER LISP::POP LISP::LIST-ALL-PACKAGES +- WALKER::VARIABLE-DECLARATION LISP::UNDEFINED-FUNCTION +- LISP::IEEE-FLOATING-POINT LISP::INTERSECTION LISP::CCLOSURE +- LISP::BOOLE-2 LISP::LOGTEST LISP::*QUERY-IO* LISP::MAX +- LISP::DEFSTRUCT LISP::CDDDAR LISP::ELT LISP::INSPECT +- LISP::CADDAR LISP::LIST-LENGTH LISP::NSET-DIFFERENCE +- LISP::STRING-CAPITALIZE LISP::ASSOC-IF-NOT LISP::+++ +- LISP::BYTE LISP::CHAR LISP::CONJUGATE LISP::CHAR-FONT-LIMIT +- LISP::CHAR-CODE-LIMIT LISP::SERIOUS-CONDITION LISP::CDAR +- LISP::COPY-ALIST LISP::FILE-LENGTH LISP::DECLARE LISP::BOOLE-1 +- LISP::RANDOM-STATE-P LISP::VECTOR-PUSH LISP::USE-PACKAGE +- LISP::CHAR-BITS LISP::GENERIC-FUNCTION LISP::IMAGPART +- LISP::BROADCAST-STREAM LISP::CDAAAR LISP::CAAAAR +- LISP::GET-DISPATCH-MACRO-CHARACTER +- LISP::SET-DISPATCH-MACRO-CHARACTER LISP::STRING> LISP::GO +- LISP::NSUBST-IF-NOT LISP::FOURTH LISP::DEFINE-SETF-METHOD +- LISP::DO LISP::STORAGE-CONDITION LISP::BIT-ORC2 +- LISP::STRING-TRIM LISP::MAPC LISP::PACKAGE LISP::NUMERATOR +- LISP::MACROLET LISP::HASH-TABLE-SIZE LISP::LDB-TEST +- LISP::READER-ERROR LISP::ROW-MAJOR-AREF +- LISP::CHAR-NOT-GREATERP LISP::REM LISP::ARRAYP LISP::CDADR +- LISP::FFLOOR LISP::SUBST-IF LISP::FIND-IF LISP::MAKE-SYMBOL +- LISP::MAKE-PACKAGE LISP::STRING= LISP::MAPLIST LISP::WRITE +- LISP::ATOM LISP::BIT-VECTOR LISP::DECF LISP::LOGXOR +- LISP::MULTIPLE-VALUES-LIMIT LISP::OPTIMIZE LISP::REST +- LISP::FIND-IF-NOT LISP::COUNT LISP::FMAKUNBOUND LISP::LIST +- LISP::BOOLE-NOR LISP::ZEROP LISP::// LISP::RASSOC LISP::1+ +- LISP::RASSOC-IF LISP::NOTANY LISP::LAST LISP::*PRINT-PRETTY* +- LISP::MAPCAN LISP::DEFMACRO LISP::SHADOW LISP::NRECONC +- LISP::++ LISP::LIST* LISP::STRING< LISP::SOFTWARE-VERSION +- LISP::*GENSYM-COUNTER* LISP::REMOVE-DUPLICATES +- LISP::PARSE-NAMESTRING LISP::UPPER-CASE-P +- LISP::MAKE-CONCATENATED-STREAM LISP::DO-EXTERNAL-SYMBOLS +- LISP::CONCATENATE LISP::CHAR-CONTROL-BIT LISP::WARN +- LISP::BIGNUM LISP::SIMPLE-VECTOR-P LISP::DELETE-DUPLICATES +- LISP::NAMESTRING LISP::BIT-ORC1 LISP::SAFETY LISP::MEMBER-IF +- LISP::COPY-SEQ LISP::ECHO-STREAM LISP::Y-OR-N-P LISP::COMPLEX +- LISP::COUNT-IF-NOT LISP::REDUCE LISP::ASSOC-IF +- LISP::MACRO-FUNCTION LISP::MAKE-SYNONYM-STREAM LISP::NUMBERP +- LISP::SXHASH LISP::CAR LISP::LOGORC2 LISP::UNSIGNED-CHAR +- LISP::BYTE-POSITION LISP::UNIX LISP::DEFLA +- LISP::ENCODE-UNIVERSAL-TIME LISP::LOWER-CASE-P LISP::EVAL-WHEN +- LISP::ARRAY-TOTAL-SIZE LISP::DO* LISP::TRUENAME +- LISP::RANDOM-STATE LISP::WARNING LISP::FTYPE +- LISP::FLOATING-POINT-INVALID-OPERATION LISP::PARSE-ERROR +- LISP::INT-CHAR LISP::LAMBDA-PARAMETERS-LIMIT +- LISP::GET-INTERNAL-RUN-TIME LISP::GET-INTERNAL-REAL-TIME +- LISP::SIGNED-BYTE LISP::VECTOR LISP::PACKAGE-ERROR +- LISP::DESCRIBE LISP::UNREAD-CHAR LISP::WRITE-STRING +- LISP::OTHERWISE LISP::SPECIFIC-CORRECTABLE-ERROR +- LISP::ARRAY-HAS-FILL-POINTER-P LISP::LOGORC1 LISP::PROVIDE +- LISP::THROW LISP::TYPE-ERROR LISP::FORMAT LISP::DEFPARAMETER +- LISP::REMF LISP::DEFINE-MODIFY-MACRO +- LISP::MOST-NEGATIVE-LONG-FLOAT +- LISP::MOST-NEGATIVE-DOUBLE-FLOAT +- LISP::MOST-NEGATIVE-SINGLE-FLOAT +- LISP::MOST-NEGATIVE-SHORT-FLOAT LISP::MULTIPLE-VALUE-CALL +- LISP::TYPE-OF LISP::TAG LISP::&AUX LISP::TAGBODY +- LISP::SIMPLE-STRING-P LISP::READTABLEP LISP::READTABLE +- LISP::ARRAY-DIMENSION LISP::FILE-ERROR LISP::SLEEP +- LISP::SYNONYM-STREAM LISP::MINUSP LISP::DELETE-FILE +- LISP::CELL-ERROR LISP::COPY-READTABLE LISP::NUMBER +- LISP::WRITE-CHAR LISP::RENAME-FILE LISP::UNSIGNED-SHORT +- LISP::STRUCTURE-OBJECT LISP::QUOTE LISP::CADR LISP::BOOLE-IOR +- LISP::LISTP LISP::CHARACTERP LISP::CHARACTER +- LISP::LISP-IMPLEMENTATION-TYPE LISP::LOGICAL-PATHNAME +- LISP::CDADDR LISP::TAILP LISP::CAADDR LISP::PATHNAME-TYPE +- LISP::PLUSP LISP::CASE LISP::MACHINE-TYPE LISP::LOAD +- LISP::ENDP LISP::FRESH-LINE LISP::DEFCONSTANT LISP::SYMBOL +- LISP::VALUES LISP::SET-DIFFERENCE LISP::*PRINT-ARRAY* +- LISP::SET-EXCLUSIVE-OR LISP::PROG2 LISP::DIVISION-BY-ZERO +- LISP::PHASE LISP::CAAAR LISP::ETYPECASE LISP::CTYPECASE +- LISP::NOT LISP::BOOLE-C2 LISP::NTH LISP::SPECIAL-OPERATOR-P +- LISP::STREAM-ELEMENT-TYPE LISP::IDENTITY LISP::*PRINT-RADIX* +- LISP::MEMBER LISP::SHORT-FLOAT LISP::NIL LISP::ACONS LISP::MOD +- LISP::EQL LISP::CADDR LISP::/// LISP::KEYWORDP LISP::COERCE +- LISP::BSD LISP::CHAR-FONT LISP::*PRINT-LEVEL* LISP::PROBE-FILE +- LISP::PATHNAME-DIRECTORY LISP::PROG1 LISP::STABLE-SORT +- LISP::SIMPLE-WARNING LISP::CONDITION LISP::SQRT LISP::REQUIRE +- LISP::GCD LISP::GETHASH LISP::ISQRT LISP::DEFVAR +- LISP::LAMBDA-CLOSURE LISP::STREAM LISP::REMOVE-IF +- LISP::DECLARATION LISP::APROPOS LISP::READ-LINE +- LISP::LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-LONG-FLOAT +- LISP::LEAST-NEGATIVE-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-SHORT-FLOAT LISP::LONG-SITE-NAME +- LISP::NSTRING-UPCASE LISP::LONG-FLOAT-NEGATIVE-EPSILON +- LISP::LONG-FLOAT-EPSILON LISP::*BREAK-ENABLE* LISP::BIT-NAND +- LISP::ALPHANUMERICP LISP::FROUND LISP::LAMBDA-LIST-KEYWORDS +- LISP::CDADAR LISP::LENGTH LISP::OR +- WALKER::VARIABLE-GLOBALLY-SPECIAL-P LISP::TWO-WAY-STREAM +- LISP::COSH LISP::CAADAR LISP::WRITE-BYTE LISP::RATIONALP +- LISP::FIND LISP::SUBSTITUTE-IF-NOT LISP::DEPOSIT-FIELD +- LISP::FLOATING-POINT-UNDERFLOW LISP::FLOATING-POINT-OVERFLOW +- LISP::WITH-OPEN-FILE LISP::BOOLE-ANDC2 LISP::IF LISP::RATIONAL +- LISP::PARSE-INTEGER LISP::SFUN LISP::MOST-POSITIVE-LONG-FLOAT +- LISP::MOST-POSITIVE-DOUBLE-FLOAT +- LISP::MOST-POSITIVE-SINGLE-FLOAT +- LISP::MOST-POSITIVE-SHORT-FLOAT LISP::PSETQ LISP::COMPILE +- LISP::VALUES-LIST LISP::GRAPHIC-CHAR-P LISP::LOCALLY +- LISP::SIGNED-CHAR LISP::BOOLE-C1 LISP::FLOATP +- LISP::DOUBLE-FLOAT LISP::DEFTYPE LISP::UNEXPORT LISP::SYSTEM +- LISP::GFUN LISP::MAKE-ARRAY LISP::ROOM LISP::APROPOS-LIST +- LISP::ASIN LISP::SETQ LISP::CFUN LISP::CHAR>= LISP::SYMBOLP +- LISP::PATHNAMEP LISP::TIME LISP::VECTOR-POP LISP::LABELS +- LISP::TENTH LISP::SET-SYNTAX-FROM-CHAR LISP::TYPECASE +- LISP::NINTH LISP::WITH-PACKAGE-ITERATOR LISP::SYMBOL-PACKAGE +- LISP::FLOAT-RADIX LISP::*LINK-ARRAY* LISP::VECTORP +- LISP::REMOVE LISP::EVAL LISP::** +- WALKER::*VARIABLE-DECLARATIONS* LISP::CHAR-CODE +- LISP::YES-OR-NO-P LISP::INTEGER-DECODE-FLOAT LISP::APPEND +- LISP::DRIBBLE LISP::USER-HOMEDIR-PATHNAME LISP::RETURN-FROM +- LISP::CHAR-UPCASE LISP::STREAMP LISP::DOTIMES LISP::CHAR<= +- LISP::POSITIVE-FIXNUM LISP::UNBOUND-VARIABLE +- LISP::SIGNED-SHORT LISP::CONSTANTP LISP::COMPILER-LET +- LISP::FLOAT-PRECISION LISP::IMPORT LISP::*TRACE-OUTPUT* +- LISP::TERPRI LISP::&ALLOW-OTHER-KEYS LISP::PATHNAME-DEVICE +- LISP::CHAR-INT LISP::STRING-STREAM WALKER::WALK-FORM +- LISP::STRING LISP::DPB LISP::LDB LISP::CDR LISP::DOLIST +- LISP::DEFCFUN LISP::BOOLE-ANDC1 LISP::STYLE-WARNING +- LISP::BREAK LISP::CHAR-NOT-EQUAL LISP::PROGV +- LISP::*STANDARD-OUTPUT* LISP::FIXNUM LISP::NUNION +- LISP::*PRINT-READABLY* LISP::MULTIPLE-VALUE-SETQ LISP::PRIN1 +- LISP::PACKAGE-USED-BY-LIST LISP::PACKAGE-USE-LIST LISP::SUBLIS +- LISP::SCHAR LISP::MAKE-ECHO-STREAM LISP::INLINE LISP::DECLAIM +- LISP::SCALE-FLOAT LISP::*PRINT-LENGTH* LISP::PROG +- LISP::SHORT-FLOAT-NEGATIVE-EPSILON LISP::SHORT-FLOAT-EPSILON +- LISP::&WHOLE LISP::INPUT-STREAM-P LISP::SIMPLE-BASE-STRING +- LISP::PROG* LISP::DECODE-UNIVERSAL-TIME +- LISP::WITH-OUTPUT-TO-STRING LISP::COMMONP LISP::EVENP +- LISP::DELETE LISP::SUBST LISP::FUNCALL LISP::CHAR-NOT-LESSP +- LISP::SGC LISP::COS LISP::PATHNAME LISP::NTHCDR +- LISP::COMPILATION-SPEED LISP::*BREAK-ON-WARNINGS* +- LISP::CLRHASH LISP::*PRINT-GENSYM* LISP::SIXTH +- LISP::MAKE-RANDOM-STATE LISP::FIRST LISP::LOGNOT LISP::ROUND +- LISP::AREF LISP::DIGIT-CHAR LISP::*** LISP::LOGNAND LISP::CDDR +- LISP::SEVENTH LISP::DOUBLE-FLOAT-NEGATIVE-EPSILON +- LISP::DOUBLE-FLOAT-EPSILON LISP::VARIABLE +- LISP::LISP-IMPLEMENTATION-VERSION LISP::BIT-XOR LISP::RPLACD +- LISP::LEAST-POSITIVE-NORMALIZED-LONG-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-POSITIVE-LONG-FLOAT +- LISP::LEAST-POSITIVE-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-SHORT-FLOAT LISP::FINISH-OUTPUT +- LISP::PROCLAIM LISP::MAKE-STRING LISP::BASE-STRING +- LISP::BSD386 LISP::MACHINE-VERSION LISP::*APPLYHOOK* +- LISP::LOGCOUNT LISP::REMOVE-IF-NOT LISP::LOGBITP LISP::SPEED +- LISP::BOOLE-AND LISP::STANDARD-METHOD LISP::STRINGP +- LISP::GET-SETF-METHOD LISP::SVREF LISP::DELETE-IF-NOT +- LISP::LISTEN LISP::FUNCTION LISP::CHAR-HYPER-BIT +- LISP::MEMBER-IF-NOT LISP::CHAR-SUPER-BIT LISP::SPACE +- LISP::CDAAR LISP::STANDARD-CHAR-P LISP::MERGE LISP::CHAR-NAME +- LISP::EXPORT LISP::CEILING LISP::SINGLE-FLOAT LISP::INT +- LISP::CHAR-META-BIT LISP::ACOS LISP::DESTRUCTURING-BIND +- LISP::CDDDR LISP::GMP LISP::ECASE LISP::MAP LISP::CCASE +- LISP::LAMBDA LISP::ALPHA-CHAR-P LISP::ASH LISP::BIT-AND +- WALKER::NESTED-WALK-FORM LISP::SOFTWARE-TYPE LISP::AND +- LISP::FIND-ALL-SYMBOLS LISP::SECOND LISP::LOGEQV +- LISP::CHAR-BITS-LIMIT LISP::SHADOWING-IMPORT LISP::DOUBLE +- LISP::STEP LISP::FCEILING LISP::NULL LISP::REVERSE LISP::MACRO +- LISP::MOST-NEGATIVE-FIXNUM LISP::PACKAGEP LISP::NBUTLAST +- LISP::REVAPPEND LISP::STANDARD-CLASS LISP::FILL +- LISP::NSUBST-IF LISP::PI LISP::BY LISP::INTEGER +- LISP::NSTRING-CAPITALIZE LISP::EQ LISP::CHAR-BIT +- LISP::STRING-EQUAL LISP::REMPROP LISP::LAMBDA-BLOCK +- LISP::LDIFF LISP::&KEY LISP::RATIONALIZE LISP::FLOAT-SIGN +- LISP::READ-PRESERVING-WHITESPACE LISP::PUSHNEW +- LISP::GET-PROPERTIES LISP::CHAR> LISP::READ-FROM-STRING +- LISP::STRING-GREATERP LISP::DIRECTORY-NAMESTRING LISP::PSETF +- LISP::PPRINT LISP::DISASSEMBLE LISP::>= LISP::NSUBSTITUTE +- LISP::IN-PACKAGE LISP::BYE LISP::LCM LISP::<= LISP::DEFUN +- LISP::LONG-FLOAT LISP::ATAN LISP::MACROEXPAND-1 +- LISP::DIRECTORY LISP::ARRAY-RANK LISP::SYMBOL-PLIST +- LISP::HASH-TABLE-P LISP::UNION LISP::MC68020 LISP::PRINT +- LISP::PROGN LISP::PATHNAME-HOST LISP::/= LISP::CHAR= +- LISP::*READ-BASE* LISP::FLOATING-POINT-INEXACT +- LISP::MAKE-SEQUENCE LISP::SIGNUM LISP::STREAM-ERROR +- LISP::LOGNOR LISP::1- LISP::RASSOC-IF-NOT LISP::SIMPLE-ARRAY +- LISP::NTH-VALUE LISP::RATIO LISP::STRING-LESSP +- LISP::CONCATENATED-STREAM LISP::REAL LISP::SUBSTITUTE +- LISP::DIGIT-CHAR-P LISP::CHAR< LISP::INTEGER-LENGTH +- LISP::EQUAL LISP::COPY-SYMBOL LISP::CHAR-DOWNCASE +- LISP::DECODE-FLOAT LISP::NCONC LISP::ROTATEF +- LISP::ARRAY-ROW-MAJOR-INDEX LISP::WITH-HASH-TABLE-ITERATOR +- LISP::CLOSE LISP::RANDOM LISP::ARRAY LISP::CATCH +- LISP::MERGE-PATHNAMES LISP::GET-OUTPUT-STREAM-STRING +- LISP::OBJECT LISP::PROGRAM-ERROR LISP::NINTERSECTION +- LISP::ASINH LISP::IGNORE LISP::BOOLE-CLR LISP::SET-CHAR-BIT +- LISP::BIT-NOT WALKER::MACROEXPAND-ALL +- LISP::SINGLE-FLOAT-NEGATIVE-EPSILON LISP::SINGLE-FLOAT-EPSILON +- LISP::MULTIPLE-VALUE-LIST LISP::POSITION-IF-NOT LISP::SAVE +- LISP::BIT-VECTOR-P LISP::BIT-EQV LISP::FLOAT-DIGITS +- LISP::ARRAY-DISPLACEMENT LISP::FILE-POSITION LISP::BOTH-CASE-P +- LISP::RETURN LISP::MAPHASH LISP::MOST-POSITIVE-FIXNUM +- LISP::READ-BYTE LISP::COPY-TREE LISP::CHAR-GREATERP +- LISP::CHECK-TYPE LISP::MACHINE-INSTANCE LISP::CONSTANTLY +- LISP::FUNCTIONP LISP::EVERY LISP::STRING/= LISP::STRING>= +- LISP::STRING<= LISP::MAKE-HASH-TABLE +- LISP::*DEFAULT-PATHNAME-DEFAULTS* LISP::SIMPLE-CONDITION +- LISP::&REST LISP::SYMBOL-FUNCTION LISP::RPLACA +- LISP::*TERMINAL-IO* LISP::CHAR/= LISP::PRINT-NOT-READABLE +- LISP::CONS LISP::*EVAL-WHEN-COMPILE* LISP::CADAR +- LISP::SIMPLE-BIT-VECTOR LISP::READ-CHAR-NO-HANG LISP::CDDADR +- LISP::BIT-ANDC2 LISP::NSTRING-DOWNCASE LISP::CADADR +- LISP::BOOLE-NAND LISP::LOG LISP::STANDARD-CHAR +- LISP::DOCUMENTATION LISP::GET-UNIVERSAL-TIME LISP::BIT-NOR +- LISP::APPLYHOOK LISP::ARRAY-RANK-LIMIT +- LISP::ABS LISP::GBC LISP::&ENVIRONMENT LISP::PATHNAME-NAME +- LISP::BOOLEAN LISP::*READ-SUPPRESS* LISP::VOID +- LISP::PACKAGE-NAME LISP::COMPILE-FILE-PATHNAME LISP::SINH +- LISP::SYMBOL-VALUE LISP::STRING-RIGHT-TRIM LISP::SBIT +- LISP::REALP LISP::TANH LISP::MAKE-PATHNAME LISP::ASSOC +- LISP::DEFSETF LISP::ODDP LISP::UNWIND-PROTECT LISP::READ +- LISP::*READ-DEFAULT-FLOAT-FORMAT* LISP::COUNT-IF +- LISP::OUTPUT-STREAM-P LISP::BLOCK LISP::AKCL LISP::COPY-LIST +- LISP::ARRAY-IN-BOUNDS-P LISP::UNBOUND-SLOT LISP::SET +- LISP::HASH-TABLE-TEST LISP::PACKAGE-SHADOWING-SYMBOLS +- LISP::ADJUST-ARRAY LISP::EXP LISP::TYPE LISP::FILE-WRITE-DATE +- LISP::MAKE-LIST LISP::LET LISP::FORCE-OUTPUT LISP::CDDAAR +- LISP::BIT-ANDC1 LISP::GET LISP::ARITHMETIC-ERROR LISP::CADAAR +- LISP::BIT LISP::KCL LISP::&OPTIONAL LISP::GCL +- LISP::FILE-AUTHOR LISP::NSUBLIS LISP::*PRINT-CIRCLE* +- LISP::*MODULES* LISP::BUILT-IN-CLASS LISP::*READTABLE* +- LISP::SORT LISP::MAPCON LISP::*MACROEXPAND-HOOK* LISP::PUSH +- LISP::POSITION-IF LISP::SUBSETP LISP::CAAR LISP::BOOLE-SET +- LISP::STRING-CHAR-P LISP::*LOAD-VERBOSE* LISP::STRING-DOWNCASE +- LISP::STRING-UPCASE LISP::DELETE-IF LISP::HOST-NAMESTRING +- LISP::STRING-LEFT-TRIM LISP::CALL-ARGUMENTS-LIMIT +- LISP::DEFENTRY LISP::CLEAR-INPUT LISP::DO-SYMBOLS +- LISP::STRUCTURE-CLASS LISP::MISMATCH LISP::MAPL +- LISP::MULTIPLE-VALUE-PROG1 LISP::REALPART LISP::NSUBSTITUTE-IF +- LISP::COND LISP::PACKAGE-NICKNAMES LISP::COMPILED-FUNCTION-P +- LISP::CONSP WALKER::WALK-FORM-EXPAND-MACROS-P LISP::SATISFIES +- LISP::&BODY LISP::MAP-INTO LISP::FLOAT LISP::SIMPLE-TYPE-ERROR +- LISP::ED LISP::ERROR LISP::ACOSH +- WALKER::DEFINE-WALKER-TEMPLATE LISP::WHEN LISP::OPEN LISP::THE +- LISP::BIT-IOR LISP::MAPCAR LISP::PATHNAME-VERSION +- LISP::*RANDOM-STATE* LISP::SEQUENCE LISP::CAADR LISP::SUBTYPEP +- LISP::MASK-FIELD LISP::FIND-SYMBOL LISP::INCF LISP::SOME +- LISP::SIMPLE-BIT-VECTOR-P LISP::FIND-PACKAGE LISP::*DEBUG-IO* +- LISP::POSITION LISP::GET-DECODED-TIME LISP::ARRAY-ELEMENT-TYPE +- LISP::LET* LISP::TRUNCATE_USE_C LISP::COMPLEMENT +- LISP::EVALHOOK LISP::COMPILED-FUNCTION LISP::ARRAY-DIMENSIONS +- LISP::BOOLE-EQV LISP::*ERROR-OUTPUT* LISP::EXTENDED-CHAR +- LISP::STRUCTURE LISP::NREVERSE LISP::ADJOIN +- LISP::NSET-EXCLUSIVE-OR LISP::METHOD LISP::T LISP::COMMON +- LISP::BOOLE-ORC2 LISP::BOOLE-ORC1 LISP::ARRAY-TOTAL-SIZE-LIMIT +- LISP::LOGIOR LISP::CERROR LISP::FIFTH LISP::ASSERT +- LISP::CLEAR-OUTPUT LISP::HASH-TABLE LISP::CLINES LISP::BOOLE +- LISP::BOOLE-XOR LISP::ARRAY-DIMENSION-LIMIT +- LISP::DO-ALL-SYMBOLS LISP::COMPILE-FILE LISP::*FEATURES* +- LISP::LOGAND LISP::REPLACE LISP::> LISP::= LISP::< +- LISP::LOGANDC2 LISP::MAKE-TWO-WAY-STREAM LISP::PROCLAMATION +- LISP::TYPEP LISP::SIN LISP::BUTLAST LISP::MACROEXPAND +- LISP::SETF LISP::FLOOR LISP::STRING-NOT-EQUAL LISP::TAN +- LISP::SPECIAL LISP::MIN LISP::CODE-CHAR LISP::/ LISP::- +- LISP::ATANH LISP::+ LISP::* LISP::MAKUNBOUND LISP::*PACKAGE* +- LISP::GETF LISP::PEEK-CHAR LISP::READ-CHAR +- LISP::STRING-NOT-GREATERP LISP::ENOUGH-NAMESTRING LISP::SUBSEQ +- LISP::NAME-CHAR LISP::MAKE-CHAR LISP::BASE-CHAR +- LISP::FTRUNCATE LISP::UNUSE-PACKAGE LISP::THIRD LISP::PAIRLIS +- LISP::EXPT LISP::GENTEMP LISP::LAMBDA-BLOCK-CLOSURE +- LISP::UPGRADED-ARRAY-ELEMENT-TYPE LISP::LOOP LISP::KEYWORD +- LISP::GET-SETF-METHOD-MULTIPLE-VALUE LISP::NSUBSTITUTE-IF-NOT +- LISP::*PRINT-CASE* LISP::*PRINT-BASE* LISP::*PRINT-ESCAPE* +- LISP::BYTE-SIZE LISP::EIGHTH LISP::CHAR-LESSP +- WALKER::VARIABLE-SPECIAL-P LISP::CLX-LITTLE-ENDIAN +- LISP::HASH-TABLE-COUNT LISP::INTERNAL-TIME-UNITS-PER-SECOND +- LISP::TREE-EQUAL LISP::WRITE-TO-STRING +- LISP::STANDARD-GENERIC-FUNCTION LISP::FILL-POINTER +- LISP::STRING-NOT-LESSP LISP::CLASS LISP::PRINC-TO-STRING +- LISP::PRIN1-TO-STRING)) +- +-;;; Definitions for package PCL of type SHADOW +-(LISP::IN-PACKAGE "PCL") +-(LISP::SHADOW '( PCL::DOTIMES PCL::DOCUMENTATION PCL::DOCUMENTATION)) +-(LISP::SHADOWING-IMPORT +- '( LISP::DOTIMES LISP::DOTIMES)) +-(LISP::IMPORT +- '(LISP::STANDARD-CLASS LISP::STRUCTURE-CLASS LISP::STANDARD-METHOD +- LISP::GENERIC-FUNCTION LISP::STANDARD-GENERIC-FUNCTION +- LISP::STANDARD-OBJECT LISP::BUILT-IN-CLASS +- LISP::METHOD-COMBINATION LISP::METHOD LISP::OTHERWISE +- LISP::SIMPLE-CONDITION LISP::FLOOR LISP::NSUBLIS +- LISP::YES-OR-NO-P LISP::CLOSE LISP::WITH-INPUT-FROM-STRING +- LISP::EQL LISP::*APPLYHOOK* LISP::MASK-FIELD LISP::*DEBUG-IO* +- LISP::VOID LISP::RANDOM-STATE-P LISP::DELETE-FILE +- LISP::WITH-HASH-TABLE-ITERATOR LISP::FLOAT LISP::RENAME-FILE +- LISP::LAMBDA-BLOCK LISP::RANDOM-STATE LISP::UPPER-CASE-P +- LISP::GO LISP::GRAPHIC-CHAR-P LISP::DO LISP::PATHNAME-TYPE +- LISP::STANDARD-CHAR LISP::PROCLAIM LISP::BLOCK +- LISP::LOWER-CASE-P LISP::// LISP::UNIX LISP::*PRINT-READABLY* +- LISP::CEILING LISP::SIMPLE-BASE-STRING LISP::NOT +- LISP::PATHNAME-NAME LISP::MULTIPLE-VALUE-BIND +- LISP::*TRACE-OUTPUT* LISP::USE-PACKAGE LISP::PATHNAME-DEVICE +- LISP::SUBSEQ LISP::SET-EXCLUSIVE-OR LISP::GENSYM +- LISP::REALPART LISP::CODE-CHAR LISP::FLOAT-RADIX +- LISP::READ-CHAR LISP::PEEK-CHAR LISP::BASE-CHAR +- LISP::MAKE-CHAR LISP::NAME-CHAR LISP::GBC LISP::COS +- LISP::SET-MACRO-CHARACTER LISP::GET-MACRO-CHARACTER +- LISP::*BREAK-ON-WARNINGS* LISP::INPUT-STREAM-P +- LISP::*PRINT-PRETTY* LISP::*QUERY-IO* LISP::*PRINT-ARRAY* +- LISP::DEFCFUN LISP::*LOAD-VERBOSE* LISP::FIND-IF +- LISP::POSITION LISP::MAKE-SEQUENCE LISP::TAG LISP::BOOLE-C2 +- LISP::SET-DISPATCH-MACRO-CHARACTER +- LISP::GET-DISPATCH-MACRO-CHARACTER LISP::COMPLEMENT +- LISP::PAIRLIS LISP::STANDARD-CHAR-P LISP::*PRINT-LEVEL* +- LISP::ALPHA-CHAR-P LISP::SIXTH LISP::*PRINT-RADIX* +- LISP::ARRAY-IN-BOUNDS-P LISP::DEPOSIT-FIELD +- LISP::*READ-DEFAULT-FLOAT-FORMAT* LISP::RATIONAL LISP::NOTANY +- LISP::POP LISP::PPRINT LISP::CONDITION LISP::READTABLE +- LISP::READTABLEP LISP::TWO-WAY-STREAM +- LISP::BIT-VECTOR-P WALKER::VARIABLE-DECLARATION LISP::DECLARE +- LISP::SPECIAL LISP::DIGIT-CHAR-P LISP::GET-UNIVERSAL-TIME +- LISP::SHADOWING-IMPORT LISP::INT +- LISP::SPECIFIC-CORRECTABLE-ERROR LISP::CLEAR-INPUT +- LISP::SOFTWARE-VERSION LISP::LOAD LISP::ENDP LISP::DOUBLE +- LISP::LAMBDA LISP::MAKE-SYNONYM-STREAM LISP::LISTP +- LISP::TERPRI LISP::SATISFIES LISP::BOOLE-ORC1 LISP::BOOLE-ORC2 +- LISP::GET-SETF-METHOD-MULTIPLE-VALUE LISP::NUNION LISP::SLEEP +- LISP::NSUBSTITUTE LISP::FIRST LISP::COMPLEX LISP::UNTRACE +- LISP::FMAKUNBOUND LISP::RPLACA LISP::INSPECT +- LISP::MULTIPLE-VALUE-PROG1 LISP::LOGICAL-PATHNAME LISP::CLASS +- LISP::INCF LISP::*ERROR-OUTPUT* LISP::DO-SYMBOLS LISP::>= +- LISP::<= LISP::BOTH-CASE-P LISP::/= LISP::1- LISP::KEYWORDP +- LISP::ROTATEF LISP::KYOTO LISP::REMPROP LISP::LONG-SITE-NAME +- LISP::LIST* LISP::PACKAGEP LISP::UNBOUND-VARIABLE LISP::LOGIOR +- LISP::INTERNAL-TIME-UNITS-PER-SECOND +- LISP::CALL-ARGUMENTS-LIMIT LISP::APROPOS LISP::TYPEP LISP::DPB +- LISP::CHECK-TYPE LISP::LOG LISP::*READ-SUPPRESS* +- LISP::*DEFAULT-PATHNAME-DEFAULTS* LISP::NINTH LISP::THROW +- LISP::DEFPARAMETER LISP::&OPTIONAL LISP::WRITE-CHAR +- LISP::FLOAT-PRECISION LISP::DOLIST LISP::*PACKAGE* LISP::GMP +- LISP::STRUCTURE-OBJECT WALKER::*VARIABLE-DECLARATIONS* +- LISP::*BREAK-ENABLE* LISP::SET-CHAR-BIT LISP::FLET +- LISP::WITH-PACKAGE-ITERATOR ITERATE::GATHER LISP::MOD +- LISP::ELT LISP::MACHINE-INSTANCE LISP::REMOVE LISP::FLOAT-SIGN +- LISP::*EVAL-WHEN-COMPILE* LISP::LOGANDC1 LISP::COERCE +- LISP::PACKAGE-NICKNAMES LISP::CHAR-CONTROL-BIT +- LISP::FIND-PACKAGE LISP::LIST LISP::UNEXPORT LISP::LOGXOR +- LISP::BIT-ANDC1 LISP::CCLOSURE LISP::ARRAY-RANK-LIMIT +- LISP::POSITION-IF-NOT LISP::STYLE-WARNING LISP::UNUSE-PACKAGE +- LISP::PRINT-NOT-READABLE LISP::VECTOR-POP +- LISP::MERGE-PATHNAMES LISP::BYTE LISP::HASH-TABLE-SIZE +- LISP::KEYWORD LISP::DIGIT-CHAR LISP::LENGTH LISP::CHAR>= +- LISP::DO-EXTERNAL-SYMBOLS LISP::CHAR<= LISP::&KEY +- LISP::*READ-BASE* LISP::CHAR-CODE-LIMIT LISP::CHAR-FONT-LIMIT +- LISP::1+ LISP::++ LISP::*GENSYM-COUNTER* LISP::BYTE-SIZE +- LISP::FIFTH LISP::&ENVIRONMENT LISP::AND LISP::STABLE-SORT +- LISP::CHAR-NOT-LESSP LISP::BIT-EQV LISP::CHAR/= +- LISP::POSITIVE-FIXNUM LISP::CHAR-UPCASE LISP::BIT-NOT +- LISP::IGNORE ITERATE::INTERVAL LISP::BIT-XOR +- LISP::MAKE-PACKAGE LISP::EIGHTH LISP::MAKE-HASH-TABLE +- LISP::IN-PACKAGE LISP::TYPE LISP::WITH-OUTPUT-TO-STRING +- LISP::RETURN LISP::SHIFTF LISP::SIGNUM LISP::FIXNUM +- LISP::BIT-NOR LISP::THIRD LISP::BIT-IOR LISP::AKCL LISP::SINH +- LISP::STRING-LESSP LISP::CHAR-NOT-EQUAL ITERATE::WHILE +- LISP::COMPILED-FUNCTION LISP::LISP-IMPLEMENTATION-VERSION +- LISP::FIND LISP::EXPT LISP::FILL LISP::TIME LISP::STRING-CHAR +- LISP::NSUBST-IF-NOT LISP::** WALKER::WALK-FORM-EXPAND-MACROS-P +- LISP::UNSIGNED-SHORT LISP::READ-CHAR-NO-HANG LISP::MACROEXPAND +- LISP::SHORT-FLOAT LISP::NOTINLINE LISP::IDENTITY +- LISP::SYMBOL-VALUE LISP::TRUNCATE LISP::BIT-ORC1 +- LISP::IMAGPART LISP::CHAR-DOWNCASE LISP::STRING-EQUAL +- SYSTEM::ALLOCATE LISP::SYMBOL-PACKAGE LISP::SVREF +- LISP::FBOUNDP LISP::BUTLAST LISP::MOST-NEGATIVE-FIXNUM +- LISP::MOST-NEGATIVE-SHORT-FLOAT +- LISP::MOST-NEGATIVE-SINGLE-FLOAT +- LISP::MOST-NEGATIVE-DOUBLE-FLOAT +- LISP::MOST-NEGATIVE-LONG-FLOAT LISP::INTERSECTION +- LISP::SEVENTH LISP::CHAR-LESSP LISP::DENOMINATOR +- LISP::OUTPUT-STREAM-P LISP::INTERN LISP::MINUSP +- LISP::MAKE-TWO-WAY-STREAM LISP::CONCATENATED-STREAM +- LISP::LAMBDA-LIST-KEYWORDS LISP::INTEGERP LISP::STRING-CHAR-P +- LISP::MAPLIST LISP::FILE-AUTHOR LISP::SCALE-FLOAT LISP::FTYPE +- LISP::READ-DELIMITED-LIST LISP::COPY-TREE LISP::UNREAD-CHAR +- LISP::ZEROP LISP::STRING-UPCASE LISP::STRING-DOWNCASE +- LISP::UPGRADED-ARRAY-ELEMENT-TYPE LISP::FTRUNCATE +- LISP::ARRAY-ELEMENT-TYPE LISP::ALPHANUMERICP LISP::PI +- LISP::MAP-INTO LISP::ARITHMETIC-ERROR LISP::PROVIDE LISP::BY +- LISP::SIMPLE-VECTOR LISP::OBJECT LISP::MACRO-FUNCTION +- LISP::PHASE LISP::NBUTLAST LISP::BIT LISP::SFUN +- LISP::READ-LINE LISP::HASH-TABLE-COUNT LISP::CHAR-NAME +- LISP::GFUN LISP::TYPE-ERROR LISP::*MODULES* +- LISP::&ALLOW-OTHER-KEYS LISP::CONCATENATE LISP::CFUN +- LISP::TREE-EQUAL LISP::CHAR-EQUAL LISP::FILE-ERROR +- LISP::SUBSTITUTE WALKER::WALK-FORM LISP::LOGEQV +- LISP::CELL-ERROR LISP::ARRAY-ROW-MAJOR-INDEX +- LISP::DEFINE-MODIFY-MACRO LISP::CIS LISP::SIGNED-CHAR +- LISP::MERGE LISP::CHAR> LISP::CHAR= LISP::NSTRING-CAPITALIZE +- LISP::CHAR< LISP::IEEE-FLOATING-POINT +- LISP::MULTIPLE-VALUE-SETQ LISP::QUOTE LISP::READ-BYTE +- LISP::COMPILE-FILE LISP::REQUIRE LISP::MEMBER-IF +- LISP::UNSIGNED-BYTE LISP::ASSERT LISP::VECTOR LISP::CLINES +- LISP::TENTH LISP::LISTEN LISP::MULTIPLE-VALUES-LIMIT +- LISP::CHAR-BITS LISP::BIGNUM LISP::LIST-LENGTH +- LISP::WRITE-TO-STRING LISP::FROUND LISP::PRIN1-TO-STRING +- LISP::PRINC-TO-STRING LISP::FILE-LENGTH LISP::APROPOS-LIST +- LISP::REMOVE-IF-NOT LISP::PARSE-ERROR ITERATE::LIST-ELEMENTS +- LISP::DOUBLE-FLOAT-EPSILON LISP::DOUBLE-FLOAT-NEGATIVE-EPSILON +- LISP::STRING-NOT-LESSP LISP::PACKAGE-ERROR LISP::DELETE-IF-NOT +- LISP::MEMBER-IF-NOT LISP::LONG-FLOAT LISP::SIMPLE-VECTOR-P +- LISP::ARRAY-RANK LISP::LAMBDA-PARAMETERS-LIMIT LISP::DEFVAR +- LISP::DEFSTRUCT LISP::BOOLEAN LISP::SUBTYPEP LISP::EVERY +- LISP::MAKE-ARRAY LISP::REMOVE-DUPLICATES LISP::SUBLIS +- LISP::DELETE-DUPLICATES LISP::FUNCTIONP LISP::FUNCTION +- LISP::REMOVE-IF LISP::WHEN LISP::ADJUSTABLE-ARRAY-P LISP::/// +- LISP::APPEND LISP::SIN LISP::RASSOC-IF-NOT LISP::FRESH-LINE +- LISP::MIN LISP::SET-SYNTAX-FROM-CHAR LISP::SETQ +- LISP::NAMESTRING ITERATE::COLLECTING LISP::VECTORP +- LISP::BROADCAST-STREAM LISP::*EVALHOOK* LISP::EVENP LISP::REST +- LISP::STRING-NOT-EQUAL LISP::MULTIPLE-VALUE-CALL +- LISP::SINGLE-FLOAT-EPSILON LISP::SINGLE-FLOAT-NEGATIVE-EPSILON +- ITERATE::ELEMENTS LISP::LIST-ALL-PACKAGES LISP::MAPCON +- LISP::FILE-STREAM LISP::CONSTANTP LISP::NIL LISP::SETF +- LISP::WRITE-STRING LISP::MAKE-STRING-INPUT-STREAM +- LISP::MAKE-STRING-OUTPUT-STREAM LISP::COPY-ALIST LISP::GETF +- LISP::CONSTANTLY LISP::MACROEXPAND-1 LISP::NSUBST LISP::PUSH +- LISP::STORAGE-CONDITION LISP::*TERMINAL-IO* LISP::MAPCAR +- LISP::ISQRT LISP::CHAR LISP::HELP* LISP::DELETE-PACKAGE +- LISP::LOGORC2 LISP::RENAME-PACKAGE LISP::EXP LISP::MAPCAN +- LISP::MACHINE-TYPE LISP::LAMBDA-CLOSURE LISP::DEFUN +- LISP::LOGORC1 LISP::ASSOC LISP::PATHNAME-VERSION LISP::DO* +- LISP::NSUBSTITUTE-IF-NOT LISP::SYMBOL LISP::NINTERSECTION +- LISP::REPLACE LISP::TAGBODY LISP::CHAR-CODE LISP::DEFCONSTANT +- LISP::DEFMACRO LISP::PACKAGE-NAME LISP::LOGCOUNT LISP::FUNCALL +- LISP::DECLAIM LISP::NSUBST-IF LISP::DEFTYPE LISP::ECHO-STREAM +- LISP::NTHCDR LISP::SYMBOLP LISP::ACONS +- LISP::LONG-FLOAT-EPSILON LISP::LONG-FLOAT-NEGATIVE-EPSILON +- LISP::ACOSH LISP::DESTRUCTURING-BIND LISP::SUBSETP +- LISP::NUMBERP LISP::SUBST LISP::DEFLA LISP::DOTIMES +- LISP::BOOLE-C1 LISP::LET* LISP::GET-SETF-METHOD +- LISP::READ-FROM-STRING LISP::STRING LISP::SUBST-IF-NOT +- LISP::*PRINT-GENSYM* LISP::CLX-LITTLE-ENDIAN LISP::NCONC +- LISP::COMPILATION-SPEED LISP::EVALHOOK LISP::MAKE-ECHO-STREAM +- LISP::NUMBER LISP::ERROR LISP::HELP LISP::BASE-STRING +- LISP::MAKE-STRING LISP::WRITE-BYTE LISP::IF LISP::FOURTH +- LISP::*RANDOM-STATE* WALKER::VARIABLE-SPECIAL-P LISP::NULL +- LISP::CHAR-GREATERP LISP::REMF LISP::BYE LISP::ASSOC-IF-NOT +- LISP::MEMBER LISP::LOGBITP LISP::MAKE-DISPATCH-MACRO-CHARACTER +- LISP::*PRINT-LENGTH* LISP::INTEGER-LENGTH LISP::STRINGP +- LISP::LDIFF LISP::REALP LISP::CDDDDR LISP::CADDDR +- LISP::DELETE-IF LISP::PUSHNEW LISP::SOFTWARE-TYPE LISP::ARRAY +- LISP::*PRINT-CIRCLE* LISP::CDDDAR LISP::SHORT-SITE-NAME +- LISP::CADDAR LISP::QUIT LISP::*PRINT-ESCAPE* +- LISP::*PRINT-BASE* LISP::*PRINT-CASE* LISP::OPTIMIZE +- WALKER::VARIABLE-GLOBALLY-SPECIAL-P LISP::BOOLE-XOR +- LISP::&WHOLE LISP::LOCALLY LISP::GET-DECODED-TIME LISP::ATOM +- LISP::CDADDR LISP::LAMBDA-BLOCK-CLOSURE LISP::CAADDR +- LISP::SUBST-IF LISP::COUNT-IF-NOT LISP::CDADAR LISP::DEFSETF +- LISP::CAADAR LISP::SXHASH LISP::BOOLE-EQV LISP::PROGV +- LISP::NSET-EXCLUSIVE-OR LISP::CERROR LISP::STRING<= +- LISP::STRING>= LISP::STRING/= LISP::SIMPLE-BIT-VECTOR +- LISP::BOOLE-NOR LISP::COMPILE-FILE-PATHNAME LISP::SEARCH +- LISP::COPY-SYMBOL LISP::BOOLE-IOR LISP::RATIO LISP::PROGN +- LISP::LEAST-POSITIVE-SHORT-FLOAT +- LISP::LEAST-POSITIVE-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-LONG-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-LONG-FLOAT LISP::RPLACD +- LISP::&BODY LISP::DIVISION-BY-ZERO LISP::CHAR-NOT-GREATERP +- LISP::NRECONC LISP::ASINH LISP::ROW-MAJOR-AREF LISP::CDDDR +- LISP::MC68020 LISP::MACROLET LISP::GET-INTERNAL-REAL-TIME +- LISP::GET-INTERNAL-RUN-TIME LISP::EQUAL LISP::NUMERATOR +- LISP::THE WALKER::VARIABLE-LEXICAL-P LISP::CDDAR +- LISP::MOST-POSITIVE-FIXNUM LISP::CHAR-BITS-LIMIT +- LISP::MOST-POSITIVE-SHORT-FLOAT +- LISP::MOST-POSITIVE-SINGLE-FLOAT +- LISP::MOST-POSITIVE-DOUBLE-FLOAT +- LISP::MOST-POSITIVE-LONG-FLOAT LISP::EVAL +- LISP::HOST-NAMESTRING LISP::NSUBSTITUTE-IF LISP::PSETQ +- LISP::EQUALP LISP::SET LISP::BOOLE-CLR LISP::CATCH LISP::LET +- LISP::BYTE-POSITION LISP::FILE-WRITE-DATE LISP::SCHAR +- LISP::GET LISP::ACOS LISP::GET-OUTPUT-STREAM-STRING +- LISP::BOOLE-AND LISP::NSET-DIFFERENCE LISP::WRITE-LINE +- LISP::PACKAGE LISP::APPLYHOOK LISP::ATANH LISP::PSETF +- LISP::SIMPLE-BIT-VECTOR-P LISP::FLOATP LISP::BOOLE-SET +- LISP::PATHNAME LISP::PROG2 LISP::PROG1 LISP::PROBE-FILE +- LISP::CDADR LISP::MAKE-BROADCAST-STREAM LISP::FIND-SYMBOL +- LISP::PRINT LISP::CHAR-HYPER-BIT LISP::HASH-TABLE-TEST +- LISP::PACKAGE-USE-LIST LISP::PACKAGE-USED-BY-LIST +- LISP::READ-PRESERVING-WHITESPACE LISP::DRIBBLE LISP::CDAAR +- LISP::ARRAYP LISP::PROG* LISP::*STANDARD-OUTPUT* LISP::WRITE +- LISP::INLINE LISP::DECLARATION LISP::FORCE-OUTPUT LISP::LOGAND +- ITERATE::ITERATE LISP::REVAPPEND LISP::BOOLE-2 LISP::VARIABLE +- ITERATE::WITH-GATHERING LISP::PRINC LISP::FILE-NAMESTRING +- LISP::SPECIAL-OPERATOR-P LISP::MAKE-RANDOM-STATE LISP::DECF +- LISP::ED LISP::BOOLE-1 LISP::BOOLE-NAND LISP::BSD386 +- LISP::REAL LISP::&AUX LISP::GETHASH LISP::CLEAR-OUTPUT +- LISP::COMPLEXP LISP::STEP LISP::*STANDARD-INPUT* LISP::APPLY +- LISP::WITH-OPEN-STREAM LISP::ECASE LISP::&REST LISP::CCASE +- LISP::FCEILING LISP::CLRHASH LISP::PARSE-INTEGER +- LISP::LOGANDC2 LISP::COUNT LISP::DIRECTORY-NAMESTRING +- LISP::PRIN1 LISP::READ LISP::CDDR LISP::SGC LISP::SAVE +- LISP::PACKAGE-SHADOWING-SYMBOLS LISP::ODDP LISP::STRING> +- LISP::USER-HOMEDIR-PATHNAME LISP::LAST LISP::BIT-ANDC2 +- ITERATE::ITERATE* LISP::REM LISP::MAPHASH LISP::MAKE-SYMBOL +- LISP::STRING= LISP::ASIN LISP::SQRT LISP::CDR LISP::PROG +- LISP::ROUND LISP::STRING< LISP::STRING-LEFT-TRIM LISP::TAILP +- LISP::CHARACTER LISP::CHARACTERP LISP::SYMBOL-PLIST +- LISP::Y-OR-N-P LISP::SERIOUS-CONDITION +- LISP::ENCODE-UNIVERSAL-TIME LISP::REMHASH LISP::WARN +- ITERATE::EACHTIME ITERATE::*ITERATE-WARNINGS* LISP::IMPORT +- LISP::CDAR LISP::RATIONALIZE LISP::HASH-TABLE-P +- LISP::FLOATING-POINT-OVERFLOW LISP::FLOATING-POINT-UNDERFLOW +- LISP::NSTRING-UPCASE LISP::BREAK LISP::CASE +- LISP::MAKE-CONCATENATED-STREAM LISP::COMPILE LISP::+++ +- LISP::ATAN LISP::STRING-RIGHT-TRIM LISP::SHORT-FLOAT-EPSILON +- LISP::SHORT-FLOAT-NEGATIVE-EPSILON LISP::FILL-POINTER +- LISP::COUNT-IF LISP::RATIONALP LISP::NOTEVERY LISP::CDDADR +- LISP::FLOATING-POINT-INEXACT LISP::FILE-POSITION +- LISP::MAKE-PATHNAME LISP::CADADR LISP::SYMBOL-FUNCTION +- LISP::CDDAAR LISP::ARRAY-HAS-FILL-POINTER-P LISP::MAPL +- LISP::CADAAR LISP::SBIT LISP::SECOND LISP::COPY-SEQ +- LISP::WITH-OPEN-FILE LISP::EXPORT LISP::POSITION-IF +- LISP::BOOLE-ANDC2 LISP::CDAADR LISP::CAAADR LISP::STREAM-ERROR +- LISP::BOOLE-ANDC1 LISP::FLOATING-POINT-INVALID-OPERATION +- LISP::CDAAAR LISP::CONSP LISP::GET-PROPERTIES LISP::CAAAAR +- LISP::INTEGER-DECODE-FLOAT LISP::STRING-GREATERP +- LISP::EXTENDED-CHAR LISP::MAPC LISP::SYNONYM-STREAM +- LISP::MACRO LISP::PROGRAM-ERROR LISP::TRACE LISP::TANH +- LISP::UNLESS LISP::FFLOOR ITERATE::UNTIL +- LISP::ARRAY-TOTAL-SIZE-LIMIT LISP::SIMPLE-TYPE-ERROR +- LISP::BOOLE LISP::DECODE-UNIVERSAL-TIME LISP::CADDR +- LISP::INTEGER LISP::OR LISP::UNINTERN LISP::ASSOC-IF +- LISP::STREAM LISP::*LINK-ARRAY* WALKER::NESTED-WALK-FORM +- LISP::VALUES LISP::*READTABLE* LISP::CADAR +- LISP::LEAST-NEGATIVE-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-LONG-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT LISP::STRING-TRIM +- LISP::PROCLAMATION WALKER::MACROEXPAND-ALL LISP::*** +- LISP::SYMBOL-NAME LISP::TRUENAME LISP::SPICE +- LISP::FIND-ALL-SYMBOLS LISP::BIT-ORC2 LISP::STRING-STREAM +- LISP::UNWIND-PROTECT LISP::FIND-IF-NOT LISP::WARNING +- LISP::STREAMP LISP::UNDEFINED-FUNCTION LISP::DOUBLE-FLOAT +- LISP::ARRAY-DIMENSIONS LISP::DO-ALL-SYMBOLS +- LISP::ARRAY-DIMENSION-LIMIT LISP::ARRAY-DISPLACEMENT +- LISP::CHAR-INT LISP::ABS LISP::NTH LISP::LOGNOT LISP::BIT-NAND +- LISP::MAX ITERATE::PLIST-ELEMENTS ITERATE::GATHERING +- LISP::LOGNOR LISP::COPY-LIST LISP::CAADR LISP::COMMONP +- LISP::BIT-VECTOR LISP::FINISH-OUTPUT LISP::SIMPLE-ARRAY +- LISP::LCM LISP::SAFETY LISP::EVAL-WHEN LISP::MAKE-LIST +- LISP::MAKUNBOUND LISP::SORT LISP::AREF LISP::CHAR-BIT +- LISP::CAAAR LISP::COMPILED-FUNCTION-P +- WALKER::DEFINE-WALKER-TEMPLATE LISP::ARRAY-TOTAL-SIZE +- LISP::KCL LISP::BOUNDP LISP::GCL +- LISP::LISP-IMPLEMENTATION-TYPE LISP::SYSTEM LISP::SIGNED-SHORT +- LISP::COMPILER-LET ITERATE::LIST-TAILS LISP::NTH-VALUE +- LISP::STREAM-ELEMENT-TYPE LISP::UNSIGNED-CHAR LISP::ADJOIN +- LISP::COSH LISP::REVERSE LISP::SPEED LISP::EQ +- LISP::UNBOUND-SLOT LISP::ENOUGH-NAMESTRING LISP::INT-CHAR +- LISP::CONTROL-ERROR LISP::ARRAY-DIMENSION LISP::ADJUST-ARRAY +- LISP::SINGLE-FLOAT ITERATE::JOINING LISP::NSTRING-DOWNCASE +- LISP::PLUSP LISP::RANDOM LISP::MISMATCH LISP::LOOP +- LISP::SEQUENCE LISP::STRING-CAPITALIZE LISP::DIRECTORY +- LISP::CADR LISP::DEFENTRY LISP::READER-ERROR +- LISP::MULTIPLE-VALUE-LIST LISP::ROOM SYSTEM::STRUCTURE-DEF +- SYSTEM::STRUCTURE-REF LISP::CONS LISP::CONJUGATE +- LISP::HASH-TABLE LISP::RASSOC-IF LISP::*FEATURES* LISP::ASH +- LISP::FLOAT-DIGITS LISP::FORMAT ITERATE::MINIMIZING +- LISP::STRUCTURE SYSTEM::STRUCTUREP ITERATE::MAXIMIZING +- LISP::CHAR-SUPER-BIT LISP::CHAR-META-BIT LISP::REDUCE +- LISP::LDB LISP::CHAR-FONT LISP::DECODE-FLOAT +- LISP::STRING-NOT-GREATERP LISP::PATHNAME-DIRECTORY LISP::UNION +- LISP::CAR LISP::COPY-READTABLE LISP::VALUES-LIST LISP::GENTEMP +- LISP::NREVERSE LISP::LOGTEST LISP::DEFINE-SETF-METHOD +- LISP::BIT-AND LISP::TRUNCATE_USE_C ITERATE::SUMMING +- LISP::PATHNAME-HOST LISP::SPACE LISP::LDB-TEST +- LISP::SUBSTITUTE-IF LISP::END-OF-FILE LISP::VECTOR-PUSH-EXTEND +- LISP::LOGNAND LISP::TYPECASE LISP::SIMPLE-STRING-P +- LISP::SIMPLE-STRING LISP::SUBSTITUTE-IF-NOT LISP::CAAR +- LISP::RASSOC LISP::PARSE-NAMESTRING LISP::*MACROEXPAND-HOOK* +- LISP::MAP LISP::COND LISP::SIMPLE-WARNING LISP::T +- LISP::SPECIAL-FORM-P LISP::DESCRIBE LISP::RETURN-FROM +- LISP::CTYPECASE LISP::ETYPECASE LISP::SOME LISP::LABELS +- LISP::> LISP::= LISP::< LISP::COMMON LISP::SHADOW LISP::/ +- LISP::- LISP::+ LISP::* LISP::DELETE LISP::PATHNAMEP +- LISP::SET-DIFFERENCE LISP::TYPE-OF LISP::VECTOR-PUSH +- LISP::MACHINE-VERSION LISP::GCD LISP::BSD LISP::SIGNED-BYTE +- LISP::OPEN LISP::DISASSEMBLE LISP::TAN)) +- +-;;; Definitions for package SLOT-ACCESSOR-NAME of type SHADOW +-(LISP::IN-PACKAGE "SLOT-ACCESSOR-NAME") +-(LISP::SHADOW 'LISP::NIL) +-(LISP::SHADOWING-IMPORT 'LISP::NIL) +-(LISP::IMPORT 'LISP::NIL) +- +-;;; Definitions for package TK of type SHADOW +-(LISP::IN-PACKAGE "TK") +-(LISP::SHADOW 'LISP::NIL) +-(LISP::SHADOWING-IMPORT 'LISP::NIL) +-(LISP::IMPORT +- '(LISP::EXP LISP::DEFVAR LISP::DISASSEMBLE LISP::DELETE-IF +- LISP::UNSIGNED-SHORT LISP::GFUN LISP::NSUBST-IF-NOT LISP::CIS +- LISP::LOGAND LISP::BIT-EQV LISP::UNIX LISP::RANDOM +- LISP::COPY-LIST SYSTEM::*DEFAULT-INFO-FILES* LISP::KEYWORDP +- LISP::CADAR LISP::MERGE-PATHNAMES LISP::BOOLE-C2 LISP::BIT-NOT +- LISP::CFUN LISP::STANDARD-OBJECT LISP::STRINGP +- LISP::METHOD-COMBINATION LISP::NSET-EXCLUSIVE-OR LISP::CLOSE +- LISP::INTEGER-DECODE-FLOAT LISP::CHAR-NOT-EQUAL LISP::COSH +- LISP::NTHCDR LISP::GET-UNIVERSAL-TIME LISP::YES-OR-NO-P +- LISP::READ-LINE LISP::LET* LISP::PATHNAME-TYPE +- LISP::FLOAT-PRECISION LISP::PROG* SYSTEM::HEADER +- LISP::SYMBOL-NAME LISP::LOG LISP::OR +- LISP::PACKAGE-SHADOWING-SYMBOLS LISP::BREAK +- LISP::STRUCTURE-OBJECT LISP::ROTATEF LISP::SQRT LISP::CONS +- LISP::NSUBST-IF LISP::UNWIND-PROTECT LISP::CONSP +- SLOOP::DEF-LOOP-MACRO LISP::FLOAT-SIGN LISP::*EVALHOOK* +- LISP::CHAR-BIT LISP::SOME LISP::MAPC SYSTEM::*TK-CONNECTION* +- LISP::SETF LISP::CEILING LISP::&BODY LISP::CDAR +- LISP::MAKE-LIST LISP::MAKE-HASH-TABLE LISP::STRING-UPCASE +- LISP::STRING-DOWNCASE LISP::STYLE-WARNING LISP::ASINH +- LISP::NRECONC LISP::NSTRING-DOWNCASE LISP::SECOND +- LISP::RATIONALP LISP::SET-DISPATCH-MACRO-CHARACTER +- LISP::GET-DISPATCH-MACRO-CHARACTER LISP::CHECK-TYPE +- LISP::MAKE-STRING-INPUT-STREAM LISP::MAKE-STRING-OUTPUT-STREAM +- LISP::*BREAK-ON-WARNINGS* LISP::BYE LISP::SAFETY +- LISP::*READ-DEFAULT-FLOAT-FORMAT* LISP::*LOAD-VERBOSE* +- LISP::OTHERWISE LISP::NBUTLAST LISP::SORT LISP::WARNING +- LISP::DEFLA LISP::PROGN LISP::PUSHNEW LISP::SYSTEM +- SYSTEM::INFO-AUX LISP::CHAR= LISP::SIGNED-SHORT +- LISP::MAKE-ECHO-STREAM LISP::BIT-AND LISP::EXPORT LISP::EQ +- LISP::SOFTWARE-TYPE LISP::LOGTEST LISP::LIST-ALL-PACKAGES +- LISP::DEFTYPE LISP::GETF LISP::ROW-MAJOR-AREF LISP::TYPECASE +- LISP::CHAR-CONTROL-BIT SYSTEM::STRING-MATCH +- LISP::HASH-TABLE-TEST LISP::USER-HOMEDIR-PATHNAME +- LISP::SYMBOL-PACKAGE LISP::BOOLEAN LISP::HOST-NAMESTRING +- LISP::IN-PACKAGE LISP::CAAR SYSTEM::SHOW-INFO LISP::INTERN +- LISP::CONDITION LISP::IEEE-FLOATING-POINT LISP::LOGNOT +- LISP::SUBST-IF-NOT LISP::COPY-READTABLE LISP::REVAPPEND +- LISP::SYMBOL LISP::BIT-VECTOR LISP::SEARCH +- LISP::STREAM-ELEMENT-TYPE LISP::POP LISP::GO LISP::LIST +- LISP::SET-MACRO-CHARACTER LISP::GET-MACRO-CHARACTER +- LISP::PARSE-ERROR LISP::VALUES LISP::DESTRUCTURING-BIND +- LISP::RANDOM-STATE LISP::LISTP LISP::CHAR/= LISP::REMPROP +- LISP::DO LISP::HELP* LISP::ABS LISP::&KEY +- LISP::VECTOR-PUSH-EXTEND LISP::PACKAGE-NICKNAMES +- LISP::MULTIPLE-VALUE-PROG1 SLOOP::LOOP-RETURN +- LISP::END-OF-FILE LISP::*DEFAULT-PATHNAME-DEFAULTS* +- SYSTEM::OFFER-CHOICES LISP::EXPT SYSTEM::PRINT-NODE +- LISP::READER-ERROR LISP::REMHASH LISP::BLOCK +- LISP::PACKAGE-ERROR LISP::LAMBDA-CLOSURE LISP::PARSE-INTEGER +- LISP::TIME LISP::COERCE LISP::FIND-IF LISP::UNREAD-CHAR +- LISP::DOUBLE-FLOAT-EPSILON LISP::DOUBLE-FLOAT-NEGATIVE-EPSILON +- LISP::BOOLE-IOR LISP::ASSERT LISP::ADJUSTABLE-ARRAY-P +- LISP::COPY-TREE LISP::CLEAR-OUTPUT LISP::CODE-CHAR +- LISP::STRING-CAPITALIZE LISP::/// LISP::WITH-OPEN-STREAM +- SYSTEM::*INFO-WINDOW* LISP::REST LISP::ACOS LISP::MACHINE-TYPE +- LISP::DENOMINATOR LISP::TRACE LISP::FLOATING-POINT-INEXACT +- LISP::*READ-BASE* LISP::CDR SYSTEM::BEGIN LISP::STRING-EQUAL +- LISP::GMP LISP::DELETE-FILE LISP::FIRST +- LISP::ALPHANUMERICP LISP::WITH-HASH-TABLE-ITERATOR +- LISP::SCALE-FLOAT LISP::CONCATENATED-STREAM +- LISP::CONTROL-ERROR LISP::FINISH-OUTPUT +- LISP::LAMBDA-PARAMETERS-LIMIT LISP::PRINC LISP::ADJOIN +- LISP::PI LISP::DOUBLE-FLOAT LISP::READTABLE LISP::READTABLEP +- LISP::ARRAY-RANK-LIMIT SYSTEM::INFO-SUBFILE LISP::RENAME-FILE +- LISP::READ-CHAR LISP::PEEK-CHAR LISP::REMOVE-DUPLICATES +- LISP::BYTE LISP::*MODULES* LISP::GET-OUTPUT-STREAM-STRING +- LISP::MULTIPLE-VALUE-BIND LISP::VECTORP LISP::RASSOC-IF-NOT +- LISP::UNINTERN SLOOP::LOOP-FINISH +- LISP::SPECIFIC-CORRECTABLE-ERROR LISP::CDADAR LISP::FUNCTION +- LISP::LOGORC2 LISP::*PACKAGE* LISP::STRING-NOT-GREATERP +- LISP::INTERSECTION LISP::SPACE LISP::SEVENTH LISP::BASE-CHAR +- LISP::MAKE-CHAR LISP::NAME-CHAR LISP::SBIT LISP::CAADAR +- LISP::TAILP LISP::*TERMINAL-IO* LISP::STREAM-ERROR +- LISP::BOOLE-ANDC1 LISP::DO-ALL-SYMBOLS LISP::MAKUNBOUND +- LISP::PROVIDE LISP::THROW LISP::LENGTH LISP::CDAAR LISP::&AUX +- LISP::ARRAY-DISPLACEMENT LISP::PAIRLIS LISP::*PRINT-GENSYM* +- LISP::COMPILE-FILE-PATHNAME LISP::CAR LISP::FTRUNCATE +- LISP::DELETE-DUPLICATES LISP::NREVERSE LISP::APROPOS +- LISP::STRING-RIGHT-TRIM LISP::STEP LISP::BIT-NOR +- LISP::ARRAY-TOTAL-SIZE LISP::ECHO-STREAM SYSTEM::*TK-LIBRARY* +- LISP::DEFINE-SETF-METHOD LISP::FMAKUNBOUND LISP::SUBST-IF +- LISP::GET-DECODED-TIME LISP::LONG-FLOAT LISP::SIMPLE-WARNING +- LISP::CHAR-HYPER-BIT LISP::TAG LISP::RATIO LISP::EVENP +- LISP::QUOTE SYSTEM::AUTOLOAD LISP::SIMPLE-STRING +- LISP::NSUBSTITUTE LISP::LAST LISP::NSET-DIFFERENCE LISP::COUNT +- LISP::CDAAAR LISP::SET-DIFFERENCE SLOOP::DEF-LOOP-FOR +- LISP::PPRINT LISP::SHORT-FLOAT-EPSILON +- LISP::SHORT-FLOAT-NEGATIVE-EPSILON LISP::SET-CHAR-BIT +- LISP::ACOSH LISP::LISTEN LISP::GENTEMP LISP::ERROR LISP::BSD +- LISP::ADJUST-ARRAY LISP::CLINES LISP::IF LISP::CAAAAR +- LISP::SET-SYNTAX-FROM-CHAR LISP::STRING-TRIM LISP::DIGIT-CHAR +- LISP::BOOLE-AND LISP::STRING> LISP::CAAAR LISP::GETHASH +- LISP::FILL-POINTER SLOOP::DEF-LOOP-MAP LISP::CDADDR +- LISP::DIRECTORY-NAMESTRING LISP::DEFUN LISP::TRUNCATE +- SYSTEM::FILE LISP::DEFENTRY LISP::ALPHA-CHAR-P +- LISP::SYMBOL-FUNCTION LISP::SUBSTITUTE-IF-NOT LISP::LDB-TEST +- LISP::FLOAT-DIGITS LISP::BIT-VECTOR-P LISP::CAADDR +- LISP::VARIABLE LISP::NUMERATOR LISP::NOTINLINE +- LISP::CHAR-LESSP LISP::WARN LISP::CHAR-NOT-LESSP +- LISP::ARRAY-DIMENSION-LIMIT LISP::MOD LISP::SXHASH +- LISP::PACKAGE-USE-LIST LISP::PACKAGE-USED-BY-LIST +- LISP::MACHINE-INSTANCE LISP::ARRAYP LISP::*GENSYM-COUNTER* +- LISP::UPPER-CASE-P LISP::*PRINT-CIRCLE* LISP::FTYPE LISP::THE +- SLOOP::LOCAL-FINISH SYSTEM::NAME LISP::COMPILER-LET +- LISP::WRITE-TO-STRING LISP::ARRAY-TOTAL-SIZE-LIMIT +- LISP::SEQUENCE LISP::FILE-AUTHOR LISP::MULTIPLE-VALUE-CALL +- LISP::*MACROEXPAND-HOOK* LISP::PLUSP +- LISP::INTERNAL-TIME-UNITS-PER-SECOND LISP::LIST* +- LISP::*PRINT-ARRAY* LISP::FILE-WRITE-DATE LISP::LAMBDA +- LISP::ED LISP::OPEN LISP::AREF LISP::RASSOC-IF LISP::LOGORC1 +- LISP::PROCLAIM LISP::CHAR-SUPER-BIT LISP::APPEND +- LISP::CONCATENATE LISP::WRITE-STRING LISP::MISMATCH +- LISP::SIMPLE-STRING-P LISP::PRINT LISP::MULTIPLE-VALUES-LIMIT +- LISP::PRIN1-TO-STRING LISP::PRINC-TO-STRING +- LISP::SIMPLE-CONDITION LISP::TERPRI LISP::CDAADR +- LISP::FLOATING-POINT-OVERFLOW LISP::FLOATING-POINT-UNDERFLOW +- LISP::CALL-ARGUMENTS-LIMIT LISP::COPY-SEQ LISP::FUNCALL +- SYSTEM::END LISP::CLRHASH LISP::SHORT-SITE-NAME +- LISP::LONG-FLOAT-EPSILON LISP::LONG-FLOAT-NEGATIVE-EPSILON +- LISP::ASSOC-IF-NOT LISP::CAAADR LISP::STRING-CHAR +- LISP::LOGANDC1 LISP::WITH-PACKAGE-ITERATOR LISP::NUMBERP +- LISP::COMPLEX LISP::AND LISP::EVAL-WHEN LISP::LOOP +- LISP::READ-FROM-STRING LISP::*STANDARD-OUTPUT* LISP::CHAR-NAME +- LISP::COMPILE-FILE LISP::FLOAT LISP::*ERROR-OUTPUT* +- LISP::TYPE-ERROR LISP::COMPILATION-SPEED LISP::LOGXOR +- LISP::LIST-LENGTH LISP::DRIBBLE LISP::EXTENDED-CHAR LISP::MAP +- SYSTEM::IDESCRIBE LISP::ARRAY-ELEMENT-TYPE LISP::ROUND +- LISP::STRING-LEFT-TRIM LISP::DECLAIM LISP::SAVE LISP::SIN +- LISP::*PRINT-LENGTH* LISP::DECLARATION LISP::DECODE-FLOAT +- LISP::PATHNAME-NAME LISP::STRING= LISP::PHASE LISP::SPICE +- LISP::RASSOC LISP::LISP-IMPLEMENTATION-TYPE LISP::UNTRACE +- LISP::PRINT-NOT-READABLE LISP::ARRAY-ROW-MAJOR-INDEX +- LISP::SUBSTITUTE-IF LISP::BOOLE LISP::TRUENAME +- LISP::DEFCONSTANT LISP::VALUES-LIST LISP::*LINK-ARRAY* +- LISP::&REST SYSTEM::TKCONNECT LISP::MAKE-RANDOM-STATE +- LISP::CHAR> SYSTEM::INFO-ERROR LISP::BYTE-SIZE LISP::MIN +- LISP::CDDDR LISP::BIT-IOR LISP::VECTOR LISP::UNSIGNED-BYTE +- LISP::SERIOUS-CONDITION LISP::SYMBOL-PLIST LISP::*READTABLE* +- LISP::SIMPLE-BIT-VECTOR-P LISP::LEAST-POSITIVE-SHORT-FLOAT +- LISP::LEAST-POSITIVE-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-LONG-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-LONG-FLOAT LISP::LOWER-CASE-P +- SYSTEM::ALLOCATE LISP::EQUALP LISP::SUBSTITUTE LISP::SUBSEQ +- LISP::MINUSP LISP::MOST-NEGATIVE-SHORT-FLOAT +- LISP::MOST-NEGATIVE-SINGLE-FLOAT +- LISP::MOST-NEGATIVE-DOUBLE-FLOAT +- LISP::MOST-NEGATIVE-LONG-FLOAT LISP::FILE-LENGTH +- LISP::FILE-ERROR LISP::HASH-TABLE LISP::SPEED LISP::COMMON +- LISP::*PRINT-RADIX* LISP::POSITIVE-FIXNUM +- LISP::UNBOUND-VARIABLE LISP::RATIONAL +- LISP::UPGRADED-ARRAY-ELEMENT-TYPE LISP::FRESH-LINE LISP::WHEN +- LISP::COMPILE LISP::FLET LISP::SPECIAL LISP::CLASS +- LISP::CELL-ERROR LISP::RPLACD LISP::TYPE-OF +- LISP::SPECIAL-OPERATOR-P LISP::DESCRIBE LISP::POSITION +- LISP::STABLE-SORT LISP::BOTH-CASE-P SYSTEM::*CASE-FOLD-SEARCH* +- LISP::SYMBOLP LISP::*PRINT-READABLY* LISP::SHADOW LISP::STREAM +- LISP::CHAR-BITS LISP::MAKE-ARRAY LISP::FUNCTIONP LISP::&WHOLE +- LISP::SUBST LISP::SCHAR LISP::ARRAY-DIMENSION LISP::COND +- LISP::DO-EXTERNAL-SYMBOLS LISP::CHAR-CODE-LIMIT +- LISP::CHAR-FONT-LIMIT LISP::SATISFIES LISP::MASK-FIELD +- LISP::ARITHMETIC-ERROR LISP::CADDR LISP::LAMBDA-LIST-KEYWORDS +- LISP::MACRO LISP::STRING-NOT-EQUAL LISP::STRING-LESSP +- LISP::USE-PACKAGE LISP::MULTIPLE-VALUE-SETQ LISP::>= +- LISP::LOGEQV LISP::*EVAL-WHEN-COMPILE* LISP::HASH-TABLE-P +- LISP::GRAPHIC-CHAR-P LISP::EQL LISP::MAPHASH +- SYSTEM::SETUP-INFO LISP::NINTERSECTION LISP::<= +- LISP::NAMESTRING LISP::MAKE-CONCATENATED-STREAM +- LISP::SHORT-FLOAT LISP::FILE-STREAM LISP::WRITE-LINE +- LISP::VECTOR-PUSH LISP::ENDP LISP::DIRECTORY LISP::TYPE +- LISP::ASSOC-IF LISP::DPB LISP::TYPEP LISP::FIFTH LISP::LOGNAND +- LISP::SIGNED-BYTE LISP::EVERY LISP::SUBLIS LISP::NULL +- LISP::FLOATP LISP::STRING< LISP::*TRACE-OUTPUT* +- LISP::WRITE-CHAR LISP::SGC LISP::STANDARD-GENERIC-FUNCTION +- LISP::MAPL LISP::PROG1 LISP::COMPLEXP LISP::PROCLAMATION +- LISP::INSPECT LISP::MACROEXPAND-1 LISP::BIT-ANDC1 LISP::SETQ +- LISP::CHAR>= LISP::REALPART LISP::LDIFF LISP::SINH +- LISP::BROADCAST-STREAM LISP::BASE-STRING LISP::MAKE-STRING +- SYSTEM::GET-MATCH LISP::CDDDAR LISP::INTEGER-LENGTH +- LISP::OUTPUT-STREAM-P LISP::NUNION LISP::/= LISP::PACKAGE-NAME +- LISP::ECASE LISP::PATHNAME LISP::APPLY LISP::CHAR-INT +- LISP::TAN LISP::MOST-NEGATIVE-FIXNUM LISP::MAKE-SYNONYM-STREAM +- LISP::MACROEXPAND LISP::CADDAR LISP::ISQRT LISP::CCASE +- LISP::GCD LISP::KEYWORD LISP::UNLESS LISP::MAP-INTO +- LISP::SYNONYM-STREAM LISP::SUBSETP LISP::POSITION-IF +- LISP::INCF LISP::SHIFTF LISP::BOOLE-XOR LISP::REM LISP::LOGNOR +- LISP::FIND LISP::MAX LISP::SIMPLE-VECTOR-P LISP::IMPORT +- LISP::MACHINE-VERSION LISP::SHADOWING-IMPORT LISP::BOOLE-EQV +- LISP::CONJUGATE LISP::READ-CHAR-NO-HANG LISP::WRITE-BYTE +- LISP::STRING LISP::WITH-OUTPUT-TO-STRING LISP::BYTE-POSITION +- LISP::STANDARD-CHAR LISP::MEMBER-IF LISP::CHAR-BITS-LIMIT +- LISP::NSTRING-UPCASE LISP::DEFMACRO LISP::BUTLAST LISP::CDDAAR +- LISP::IMAGPART LISP::LOGANDC2 LISP::HASH-TABLE-SIZE +- LISP::FFLOOR LISP::*PRINT-LEVEL* LISP::DEFSTRUCT +- LISP::DELETE-PACKAGE LISP::BOOLE-CLR LISP::DO-SYMBOLS +- LISP::INTEGERP LISP::NUMBER LISP::CADAAR LISP::NIL LISP::T +- LISP::DELETE LISP::DEFCFUN LISP::DEFINE-MODIFY-MACRO +- LISP::COMPILED-FUNCTION LISP::NOTEVERY LISP::BOOLE-2 +- LISP::STRUCTURE LISP::UNBOUND-SLOT LISP::RENAME-PACKAGE +- LISP::SIGNUM LISP::CDDDDR LISP::GET-SETF-METHOD-MULTIPLE-VALUE +- LISP::FILE-POSITION LISP::LOGBITP LISP::LAMBDA-BLOCK +- LISP::STANDARD-METHOD LISP::UNSIGNED-CHAR LISP::PSETQ +- LISP::EVAL LISP::CERROR LISP::CHAR-GREATERP +- LISP::GET-SETF-METHOD LISP::SYMBOL-VALUE LISP::+++ LISP::LCM +- LISP::BOOLE-NAND LISP::SIMPLE-ARRAY LISP::CADDDR +- LISP::SIMPLE-BIT-VECTOR LISP::CHAR-META-BIT LISP::PRIN1 +- LISP::BIT-ORC1 LISP::PSETF LISP::RETURN LISP::MAKE-PATHNAME +- LISP::DOTIMES LISP::DEPOSIT-FIELD LISP::*QUERY-IO* +- LISP::&ENVIRONMENT LISP::ARRAY-DIMENSIONS LISP::BSD386 +- LISP::MAKE-BROADCAST-STREAM LISP::BOOLE-ANDC2 +- LISP::MAKE-TWO-WAY-STREAM LISP::INPUT-STREAM-P +- LISP::DIGIT-CHAR-P LISP::*STANDARD-INPUT* LISP::BOUNDP +- LISP::ODDP LISP::READ-DELIMITED-LIST LISP::SIXTH +- LISP::SUBTYPEP LISP::NSTRING-CAPITALIZE LISP::DECLARE +- LISP::AKCL LISP::FLOOR LISP::GBC LISP::GENSYM +- LISP::ARRAY-HAS-FILL-POINTER-P LISP::LOGIOR LISP::Y-OR-N-P +- LISP::CHAR-FONT LISP::PARSE-NAMESTRING LISP::ARRAY-RANK +- LISP::NINTH LISP::EVALHOOK LISP::WITH-INPUT-FROM-STRING +- LISP::INTEGER LISP::MAKE-SEQUENCE SYSTEM::*MATCH-DATA* +- LISP::SET-EXCLUSIVE-OR LISP::CHAR< LISP::INLINE LISP::CDDADR +- LISP::REMOVE-IF-NOT LISP::TANH SYSTEM::END-WAITING LISP::ATAN +- LISP::NOT LISP::STRING-CHAR-P LISP::LONG-SITE-NAME +- LISP::PATHNAME-VERSION LISP::MAPCAN LISP::REQUIRE LISP::RPLACA +- LISP::TAGBODY LISP::COPY-ALIST LISP::CADADR LISP::MAPCAR +- LISP::> LISP::FIND-PACKAGE LISP::FBOUNDP +- LISP::CLX-LITTLE-ENDIAN LISP::= LISP::DEFSETF LISP::ZEROP +- LISP::MC68020 LISP::UNUSE-PACKAGE +- LISP::MOST-POSITIVE-SHORT-FLOAT +- LISP::MOST-POSITIVE-SINGLE-FLOAT +- LISP::MOST-POSITIVE-DOUBLE-FLOAT +- LISP::MOST-POSITIVE-LONG-FLOAT LISP::LOGICAL-PATHNAME +- LISP::APPLYHOOK LISP::< LISP::LOGCOUNT LISP::ENOUGH-NAMESTRING +- LISP::MULTIPLE-VALUE-LIST SYSTEM::MATCH-END +- LISP::TWO-WAY-STREAM LISP::CDDR LISP::ASSOC LISP::REMF +- LISP::LDB LISP::MACROLET LISP::CDADR +- SYSTEM::*CURRENT-INFO-DATA* LISP::UNION LISP::FIND-ALL-SYMBOLS +- LISP::MAKE-PACKAGE LISP::&OPTIONAL LISP::THIRD LISP::LABELS +- LISP::BOOLE-C1 LISP::FIND-IF-NOT LISP::LOAD +- LISP::DELETE-IF-NOT LISP::ACONS LISP::UNDEFINED-FUNCTION +- LISP::SIGNED-CHAR LISP::INT LISP::PACKAGEP +- LISP::ENCODE-UNIVERSAL-TIME LISP::FORMAT LISP::TENTH +- LISP::STRUCTURE-CLASS LISP::MEMBER-IF-NOT +- LISP::LEAST-NEGATIVE-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-LONG-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT LISP::KCL +- LISP::BOOLE-1 LISP::REDUCE LISP::SVREF LISP::NTH-VALUE +- LISP::FORCE-OUTPUT LISP::NSUBSTITUTE-IF-NOT LISP::CATCH +- LISP::STORAGE-CONDITION LISP::MERGE LISP::CASE +- LISP::CLEAR-INPUT LISP::REPLACE LISP::*** +- LISP::GENERIC-FUNCTION LISP::GCL LISP::/ LISP::BOOLE-SET +- LISP::SOFTWARE-VERSION LISP::APROPOS-LIST +- LISP::POSITION-IF-NOT LISP::READ-BYTE LISP::FLOAT-RADIX +- SYSTEM::INFO-DATA LISP::DECF LISP::PROG LISP::- LISP::MAPCON +- LISP::CADR LISP::EQUAL LISP::CAADR LISP::+ +- LISP::PATHNAME-DEVICE LISP::MACRO-FUNCTION LISP::MAPLIST +- LISP::REVERSE LISP::FIND-SYMBOL LISP::* LISP::LOCALLY +- LISP::BIT-ANDC2 LISP::COMMONP LISP::*FEATURES* +- LISP::DIVISION-BY-ZERO LISP::ARRAY SYSTEM::INFO LISP::DOUBLE +- LISP::DEFPARAMETER LISP::PATHNAME-DIRECTORY +- LISP::STRING-NOT-LESSP LISP::ELT LISP::NTH LISP::RETURN-FROM +- LISP::BIGNUM LISP::MAKE-SYMBOL LISP::FILL LISP::CHAR-CODE +- LISP::*PRINT-ESCAPE* LISP::*PRINT-BASE* LISP::*PRINT-CASE* +- LISP::FLOATING-POINT-INVALID-OPERATION LISP::NSUBST +- LISP::SIMPLE-VECTOR LISP::ARRAY-IN-BOUNDS-P +- LISP::READ-PRESERVING-WHITESPACE LISP::ATANH LISP::ATOM +- LISP::BIT-NAND LISP::VECTOR-POP LISP::MEMBER LISP::REMOVE +- LISP::CHAR<= LISP::PUSH LISP::PROGRAM-ERROR LISP::KYOTO +- LISP::CHAR-UPCASE LISP::*PRINT-PRETTY* +- LISP::MOST-POSITIVE-FIXNUM LISP::PATHNAME-HOST +- LISP::DOCUMENTATION LISP::// LISP::UNEXPORT LISP::PROBE-FILE +- LISP::STANDARD-CLASS LISP::GET-INTERNAL-REAL-TIME +- LISP::GET-INTERNAL-RUN-TIME LISP::NOTANY LISP::QUIT LISP::ROOM +- LISP::*APPLYHOOK* LISP::COS LISP::CHAR-DOWNCASE +- LISP::CONSTANTLY LISP::RATIONALIZE +- LISP::LISP-IMPLEMENTATION-VERSION LISP::CONSTANTP +- LISP::HASH-TABLE-COUNT LISP::STREAMP SYSTEM::*INFO-PATHS* +- LISP::*BREAK-ENABLE* LISP::1- LISP::BIT-XOR +- LISP::STRING-STREAM LISP::GET-PROPERTIES LISP::COUNT-IF-NOT +- LISP::BIT LISP::ASH LISP::NSUBLIS LISP::FOURTH LISP::STRING<= +- LISP::STRING>= LISP::STRING/= LISP::SLEEP +- LISP::LAMBDA-BLOCK-CLOSURE LISP::HELP LISP::TREE-EQUAL +- LISP::SET LISP::INT-CHAR LISP::STRING-GREATERP +- LISP::SINGLE-FLOAT-EPSILON LISP::SINGLE-FLOAT-NEGATIVE-EPSILON +- LISP::SPECIAL-FORM-P LISP::COMPLEMENT LISP::WRITE LISP::NCONC +- LISP::DECODE-UNIVERSAL-TIME LISP::BUILT-IN-CLASS +- LISP::*RANDOM-STATE* LISP::BOOLE-ORC1 LISP::BOOLE-ORC2 +- LISP::FILE-NAMESTRING LISP::VOID LISP::BIT-ORC2 LISP::1+ +- LISP::PROG2 SLOOP::SLOOP SYSTEM::MATCH-BEGINNING +- LISP::*READ-SUPPRESS* LISP::DOLIST LISP::SIMPLE-BASE-STRING +- LISP::LET LISP::CHAR-NOT-GREATERP LISP::PATHNAMEP LISP::READ +- LISP::RANDOM-STATE-P SYSTEM::TAGS LISP::CDDAR LISP::BY +- LISP::SFUN LISP::REMOVE-IF LISP::&ALLOW-OTHER-KEYS +- LISP::FROUND LISP::CHAR-EQUAL +- LISP::MAKE-DISPATCH-MACRO-CHARACTER LISP::EIGHTH +- LISP::OPTIMIZE LISP::++ LISP::DO* LISP::SIMPLE-TYPE-ERROR +- LISP::ASIN LISP::SINGLE-FLOAT LISP::CCLOSURE LISP::REAL +- LISP::CHARACTER LISP::CHARACTERP LISP::GET SYSTEM::NODE +- LISP::OBJECT LISP::REALP LISP::FCEILING LISP::COPY-SYMBOL +- LISP::CHAR LISP::STANDARD-CHAR-P LISP::*DEBUG-IO* LISP::FIXNUM +- LISP::COMPILED-FUNCTION-P LISP::COUNT-IF LISP::** LISP::METHOD +- LISP::WITH-OPEN-FILE LISP::PACKAGE LISP::TRUNCATE_USE_C +- LISP::IGNORE LISP::IDENTITY LISP::CTYPECASE LISP::ETYPECASE +- LISP::PROGV LISP::NSUBSTITUTE-IF LISP::BOOLE-NOR +- SLOOP::DEF-LOOP-COLLECT)) +- +-;;; Definitions for package DEFPACKAGE of type SHADOW +-(LISP::IN-PACKAGE "DEFPACKAGE") +-(LISP::SHADOW 'LISP::NIL) +-(LISP::SHADOWING-IMPORT 'LISP::NIL) +-(LISP::IMPORT +- '(LISP::EXP LISP::DEFVAR LISP::DISASSEMBLE LISP::DELETE-IF +- LISP::UNSIGNED-SHORT LISP::GFUN LISP::NSUBST-IF-NOT LISP::CIS +- LISP::LOGAND LISP::BIT-EQV LISP::UNIX LISP::RANDOM +- LISP::COPY-LIST LISP::KEYWORDP LISP::CADAR +- LISP::MERGE-PATHNAMES LISP::BOOLE-C2 LISP::BIT-NOT LISP::CFUN +- LISP::STANDARD-OBJECT LISP::STRINGP LISP::METHOD-COMBINATION +- LISP::NSET-EXCLUSIVE-OR LISP::CLOSE LISP::INTEGER-DECODE-FLOAT +- LISP::CHAR-NOT-EQUAL LISP::COSH LISP::NTHCDR +- LISP::GET-UNIVERSAL-TIME LISP::YES-OR-NO-P LISP::READ-LINE +- LISP::LET* LISP::PATHNAME-TYPE LISP::FLOAT-PRECISION +- LISP::PROG* LISP::SYMBOL-NAME LISP::LOG LISP::OR +- LISP::PACKAGE-SHADOWING-SYMBOLS LISP::BREAK +- LISP::STRUCTURE-OBJECT LISP::ROTATEF LISP::SQRT LISP::CONS +- LISP::NSUBST-IF LISP::UNWIND-PROTECT LISP::CONSP +- SLOOP::DEF-LOOP-MACRO LISP::FLOAT-SIGN LISP::*EVALHOOK* +- LISP::CHAR-BIT LISP::SOME LISP::MAPC LISP::SETF LISP::CEILING +- LISP::&BODY LISP::CDAR LISP::MAKE-LIST LISP::MAKE-HASH-TABLE +- LISP::STRING-UPCASE LISP::STRING-DOWNCASE LISP::STYLE-WARNING +- LISP::ASINH LISP::NRECONC LISP::NSTRING-DOWNCASE LISP::SECOND +- LISP::RATIONALP LISP::SET-DISPATCH-MACRO-CHARACTER +- LISP::GET-DISPATCH-MACRO-CHARACTER LISP::CHECK-TYPE +- LISP::MAKE-STRING-INPUT-STREAM LISP::MAKE-STRING-OUTPUT-STREAM +- LISP::*BREAK-ON-WARNINGS* LISP::BYE LISP::SAFETY +- LISP::*READ-DEFAULT-FLOAT-FORMAT* LISP::*LOAD-VERBOSE* +- LISP::OTHERWISE LISP::NBUTLAST LISP::SORT LISP::WARNING +- LISP::DEFLA LISP::PROGN LISP::PUSHNEW LISP::SYSTEM LISP::CHAR= +- LISP::SIGNED-SHORT LISP::MAKE-ECHO-STREAM LISP::BIT-AND +- LISP::EXPORT LISP::EQ LISP::SOFTWARE-TYPE LISP::LOGTEST +- LISP::LIST-ALL-PACKAGES LISP::DEFTYPE LISP::GETF +- LISP::ROW-MAJOR-AREF LISP::TYPECASE LISP::CHAR-CONTROL-BIT +- LISP::HASH-TABLE-TEST LISP::USER-HOMEDIR-PATHNAME +- LISP::SYMBOL-PACKAGE LISP::BOOLEAN LISP::HOST-NAMESTRING +- LISP::IN-PACKAGE LISP::CAAR LISP::INTERN LISP::CONDITION +- LISP::IEEE-FLOATING-POINT LISP::LOGNOT LISP::SUBST-IF-NOT +- LISP::COPY-READTABLE LISP::REVAPPEND LISP::SYMBOL +- LISP::BIT-VECTOR LISP::SEARCH LISP::STREAM-ELEMENT-TYPE +- LISP::POP LISP::GO LISP::LIST LISP::SET-MACRO-CHARACTER +- LISP::GET-MACRO-CHARACTER LISP::PARSE-ERROR LISP::VALUES +- LISP::DESTRUCTURING-BIND LISP::RANDOM-STATE LISP::LISTP +- LISP::CHAR/= LISP::REMPROP LISP::DO LISP::HELP* LISP::ABS +- LISP::&KEY LISP::VECTOR-PUSH-EXTEND LISP::PACKAGE-NICKNAMES +- LISP::MULTIPLE-VALUE-PROG1 SLOOP::LOOP-RETURN +- LISP::END-OF-FILE LISP::*DEFAULT-PATHNAME-DEFAULTS* LISP::EXPT +- LISP::READER-ERROR LISP::REMHASH LISP::BLOCK +- LISP::PACKAGE-ERROR LISP::LAMBDA-CLOSURE LISP::PARSE-INTEGER +- LISP::TIME LISP::COERCE LISP::FIND-IF LISP::UNREAD-CHAR +- LISP::DOUBLE-FLOAT-EPSILON LISP::DOUBLE-FLOAT-NEGATIVE-EPSILON +- LISP::BOOLE-IOR LISP::ASSERT LISP::ADJUSTABLE-ARRAY-P +- LISP::COPY-TREE LISP::CLEAR-OUTPUT LISP::CODE-CHAR +- LISP::STRING-CAPITALIZE LISP::/// LISP::WITH-OPEN-STREAM +- LISP::REST LISP::ACOS LISP::MACHINE-TYPE LISP::DENOMINATOR +- LISP::TRACE LISP::FLOATING-POINT-INEXACT LISP::*READ-BASE* +- LISP::CDR LISP::STRING-EQUAL LISP::GMP LISP::DELETE-FILE +- LISP::FIRST LISP::ALPHANUMERICP +- LISP::WITH-HASH-TABLE-ITERATOR LISP::SCALE-FLOAT +- LISP::CONCATENATED-STREAM LISP::CONTROL-ERROR +- LISP::FINISH-OUTPUT LISP::LAMBDA-PARAMETERS-LIMIT LISP::PRINC +- LISP::ADJOIN LISP::PI LISP::DOUBLE-FLOAT LISP::READTABLE +- LISP::READTABLEP LISP::ARRAY-RANK-LIMIT LISP::RENAME-FILE +- LISP::READ-CHAR LISP::PEEK-CHAR LISP::REMOVE-DUPLICATES +- LISP::BYTE LISP::*MODULES* LISP::GET-OUTPUT-STREAM-STRING +- LISP::MULTIPLE-VALUE-BIND LISP::VECTORP LISP::RASSOC-IF-NOT +- LISP::UNINTERN SLOOP::LOOP-FINISH +- LISP::SPECIFIC-CORRECTABLE-ERROR LISP::CDADAR LISP::FUNCTION +- LISP::LOGORC2 LISP::*PACKAGE* LISP::STRING-NOT-GREATERP +- LISP::INTERSECTION LISP::SPACE LISP::SEVENTH LISP::BASE-CHAR +- LISP::MAKE-CHAR LISP::NAME-CHAR LISP::SBIT LISP::CAADAR +- LISP::TAILP LISP::*TERMINAL-IO* LISP::STREAM-ERROR +- LISP::BOOLE-ANDC1 LISP::DO-ALL-SYMBOLS LISP::MAKUNBOUND +- LISP::PROVIDE LISP::THROW LISP::LENGTH LISP::CDAAR LISP::&AUX +- LISP::ARRAY-DISPLACEMENT LISP::PAIRLIS LISP::*PRINT-GENSYM* +- LISP::COMPILE-FILE-PATHNAME LISP::CAR LISP::FTRUNCATE +- LISP::DELETE-DUPLICATES LISP::NREVERSE LISP::APROPOS +- LISP::STRING-RIGHT-TRIM LISP::STEP LISP::BIT-NOR +- LISP::ARRAY-TOTAL-SIZE LISP::ECHO-STREAM +- LISP::DEFINE-SETF-METHOD LISP::FMAKUNBOUND LISP::SUBST-IF +- LISP::GET-DECODED-TIME LISP::LONG-FLOAT LISP::SIMPLE-WARNING +- LISP::CHAR-HYPER-BIT LISP::TAG LISP::RATIO LISP::EVENP +- LISP::QUOTE LISP::SIMPLE-STRING LISP::NSUBSTITUTE LISP::LAST +- LISP::NSET-DIFFERENCE LISP::COUNT LISP::CDAAAR +- LISP::SET-DIFFERENCE SLOOP::DEF-LOOP-FOR LISP::PPRINT +- LISP::SHORT-FLOAT-EPSILON LISP::SHORT-FLOAT-NEGATIVE-EPSILON +- LISP::SET-CHAR-BIT LISP::ACOSH LISP::LISTEN LISP::GENTEMP +- LISP::ERROR LISP::BSD LISP::ADJUST-ARRAY LISP::CLINES LISP::IF +- LISP::CAAAAR LISP::SET-SYNTAX-FROM-CHAR LISP::STRING-TRIM +- LISP::DIGIT-CHAR LISP::BOOLE-AND LISP::STRING> LISP::CAAAR +- LISP::GETHASH LISP::FILL-POINTER SLOOP::DEF-LOOP-MAP +- LISP::CDADDR LISP::DIRECTORY-NAMESTRING LISP::DEFUN +- LISP::TRUNCATE LISP::DEFENTRY LISP::ALPHA-CHAR-P +- LISP::SYMBOL-FUNCTION LISP::SUBSTITUTE-IF-NOT LISP::LDB-TEST +- LISP::FLOAT-DIGITS LISP::BIT-VECTOR-P LISP::CAADDR +- LISP::VARIABLE LISP::NUMERATOR LISP::NOTINLINE +- LISP::CHAR-LESSP LISP::WARN LISP::CHAR-NOT-LESSP +- LISP::ARRAY-DIMENSION-LIMIT LISP::MOD LISP::SXHASH +- LISP::PACKAGE-USE-LIST LISP::PACKAGE-USED-BY-LIST +- LISP::MACHINE-INSTANCE LISP::ARRAYP LISP::*GENSYM-COUNTER* +- LISP::UPPER-CASE-P LISP::*PRINT-CIRCLE* LISP::FTYPE LISP::THE +- SLOOP::LOCAL-FINISH LISP::COMPILER-LET LISP::WRITE-TO-STRING +- LISP::ARRAY-TOTAL-SIZE-LIMIT LISP::SEQUENCE LISP::FILE-AUTHOR +- LISP::MULTIPLE-VALUE-CALL LISP::*MACROEXPAND-HOOK* LISP::PLUSP +- LISP::INTERNAL-TIME-UNITS-PER-SECOND LISP::LIST* +- LISP::*PRINT-ARRAY* LISP::FILE-WRITE-DATE LISP::LAMBDA +- LISP::ED LISP::OPEN LISP::AREF LISP::RASSOC-IF LISP::LOGORC1 +- LISP::PROCLAIM LISP::CHAR-SUPER-BIT LISP::APPEND +- LISP::CONCATENATE LISP::WRITE-STRING LISP::MISMATCH +- LISP::SIMPLE-STRING-P LISP::PRINT LISP::MULTIPLE-VALUES-LIMIT +- LISP::PRIN1-TO-STRING LISP::PRINC-TO-STRING +- LISP::SIMPLE-CONDITION LISP::TERPRI LISP::CDAADR +- LISP::FLOATING-POINT-OVERFLOW LISP::FLOATING-POINT-UNDERFLOW +- LISP::CALL-ARGUMENTS-LIMIT LISP::COPY-SEQ LISP::FUNCALL +- LISP::CLRHASH LISP::SHORT-SITE-NAME LISP::LONG-FLOAT-EPSILON +- LISP::LONG-FLOAT-NEGATIVE-EPSILON LISP::ASSOC-IF-NOT +- LISP::CAAADR LISP::STRING-CHAR LISP::LOGANDC1 +- LISP::WITH-PACKAGE-ITERATOR LISP::NUMBERP LISP::COMPLEX +- LISP::AND LISP::EVAL-WHEN LISP::LOOP LISP::READ-FROM-STRING +- LISP::*STANDARD-OUTPUT* LISP::CHAR-NAME LISP::COMPILE-FILE +- LISP::FLOAT LISP::*ERROR-OUTPUT* LISP::TYPE-ERROR +- LISP::COMPILATION-SPEED LISP::LOGXOR LISP::LIST-LENGTH +- LISP::DRIBBLE LISP::EXTENDED-CHAR LISP::MAP +- LISP::ARRAY-ELEMENT-TYPE LISP::ROUND LISP::STRING-LEFT-TRIM +- LISP::DECLAIM LISP::SAVE LISP::SIN LISP::*PRINT-LENGTH* +- LISP::DECLARATION LISP::DECODE-FLOAT LISP::PATHNAME-NAME +- LISP::STRING= LISP::PHASE LISP::SPICE LISP::RASSOC +- LISP::LISP-IMPLEMENTATION-TYPE LISP::UNTRACE +- LISP::PRINT-NOT-READABLE LISP::ARRAY-ROW-MAJOR-INDEX +- LISP::SUBSTITUTE-IF LISP::BOOLE LISP::TRUENAME +- LISP::DEFCONSTANT LISP::VALUES-LIST LISP::*LINK-ARRAY* +- LISP::&REST LISP::MAKE-RANDOM-STATE LISP::CHAR> +- LISP::BYTE-SIZE LISP::MIN LISP::CDDDR LISP::BIT-IOR +- LISP::VECTOR LISP::UNSIGNED-BYTE LISP::SERIOUS-CONDITION +- LISP::SYMBOL-PLIST LISP::*READTABLE* LISP::SIMPLE-BIT-VECTOR-P +- LISP::LEAST-POSITIVE-SHORT-FLOAT +- LISP::LEAST-POSITIVE-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-LONG-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-LONG-FLOAT LISP::LOWER-CASE-P +- SYSTEM::ALLOCATE LISP::EQUALP LISP::SUBSTITUTE LISP::SUBSEQ +- LISP::MINUSP LISP::MOST-NEGATIVE-SHORT-FLOAT +- LISP::MOST-NEGATIVE-SINGLE-FLOAT +- LISP::MOST-NEGATIVE-DOUBLE-FLOAT +- LISP::MOST-NEGATIVE-LONG-FLOAT LISP::FILE-LENGTH +- LISP::FILE-ERROR LISP::HASH-TABLE LISP::SPEED LISP::COMMON +- LISP::*PRINT-RADIX* LISP::POSITIVE-FIXNUM +- LISP::UNBOUND-VARIABLE LISP::RATIONAL +- LISP::UPGRADED-ARRAY-ELEMENT-TYPE LISP::FRESH-LINE LISP::WHEN +- LISP::COMPILE LISP::FLET LISP::SPECIAL LISP::CLASS +- LISP::CELL-ERROR LISP::RPLACD LISP::TYPE-OF +- LISP::SPECIAL-OPERATOR-P LISP::DESCRIBE LISP::POSITION +- LISP::STABLE-SORT LISP::BOTH-CASE-P LISP::SYMBOLP +- LISP::*PRINT-READABLY* LISP::SHADOW LISP::STREAM +- LISP::CHAR-BITS LISP::MAKE-ARRAY LISP::FUNCTIONP LISP::&WHOLE +- LISP::SUBST LISP::SCHAR LISP::ARRAY-DIMENSION LISP::COND +- LISP::DO-EXTERNAL-SYMBOLS LISP::CHAR-CODE-LIMIT +- LISP::CHAR-FONT-LIMIT LISP::SATISFIES LISP::MASK-FIELD +- LISP::ARITHMETIC-ERROR LISP::CADDR LISP::LAMBDA-LIST-KEYWORDS +- LISP::MACRO LISP::STRING-NOT-EQUAL LISP::STRING-LESSP +- LISP::USE-PACKAGE LISP::MULTIPLE-VALUE-SETQ LISP::>= +- LISP::LOGEQV LISP::*EVAL-WHEN-COMPILE* LISP::HASH-TABLE-P +- LISP::GRAPHIC-CHAR-P LISP::EQL LISP::MAPHASH +- LISP::NINTERSECTION LISP::<= LISP::NAMESTRING +- LISP::MAKE-CONCATENATED-STREAM LISP::SHORT-FLOAT +- LISP::FILE-STREAM LISP::WRITE-LINE LISP::VECTOR-PUSH +- LISP::ENDP LISP::DIRECTORY LISP::TYPE LISP::ASSOC-IF LISP::DPB +- LISP::TYPEP LISP::FIFTH LISP::LOGNAND LISP::SIGNED-BYTE +- LISP::EVERY LISP::SUBLIS LISP::NULL LISP::FLOATP LISP::STRING< +- LISP::*TRACE-OUTPUT* LISP::WRITE-CHAR LISP::SGC +- LISP::STANDARD-GENERIC-FUNCTION LISP::MAPL LISP::PROG1 +- LISP::COMPLEXP LISP::PROCLAMATION LISP::INSPECT +- LISP::MACROEXPAND-1 LISP::BIT-ANDC1 LISP::SETQ LISP::CHAR>= +- LISP::REALPART LISP::LDIFF LISP::SINH LISP::BROADCAST-STREAM +- LISP::BASE-STRING LISP::MAKE-STRING LISP::CDDDAR +- LISP::INTEGER-LENGTH LISP::OUTPUT-STREAM-P LISP::NUNION +- LISP::/= LISP::PACKAGE-NAME LISP::ECASE LISP::PATHNAME +- LISP::APPLY LISP::CHAR-INT LISP::TAN +- LISP::MOST-NEGATIVE-FIXNUM LISP::MAKE-SYNONYM-STREAM +- LISP::MACROEXPAND LISP::CADDAR LISP::ISQRT LISP::CCASE +- LISP::GCD LISP::KEYWORD LISP::UNLESS LISP::MAP-INTO +- LISP::SYNONYM-STREAM LISP::SUBSETP LISP::POSITION-IF +- LISP::INCF LISP::SHIFTF LISP::BOOLE-XOR LISP::REM LISP::LOGNOR +- LISP::FIND LISP::MAX LISP::SIMPLE-VECTOR-P LISP::IMPORT +- LISP::MACHINE-VERSION LISP::SHADOWING-IMPORT LISP::BOOLE-EQV +- LISP::CONJUGATE LISP::READ-CHAR-NO-HANG LISP::WRITE-BYTE +- LISP::WITH-OUTPUT-TO-STRING LISP::BYTE-POSITION +- LISP::STANDARD-CHAR LISP::STRING LISP::MEMBER-IF +- LISP::CHAR-BITS-LIMIT LISP::NSTRING-UPCASE LISP::DEFMACRO +- LISP::BUTLAST LISP::CDDAAR LISP::IMAGPART LISP::LOGANDC2 +- LISP::HASH-TABLE-SIZE LISP::FFLOOR LISP::*PRINT-LEVEL* +- LISP::DEFSTRUCT LISP::DELETE-PACKAGE LISP::BOOLE-CLR +- LISP::DO-SYMBOLS LISP::INTEGERP LISP::NUMBER LISP::CADAAR +- LISP::NIL LISP::T LISP::DELETE LISP::DEFCFUN +- LISP::DEFINE-MODIFY-MACRO LISP::COMPILED-FUNCTION +- LISP::NOTEVERY LISP::BOOLE-2 LISP::STRUCTURE +- LISP::UNBOUND-SLOT LISP::RENAME-PACKAGE LISP::SIGNUM +- LISP::CDDDDR LISP::GET-SETF-METHOD-MULTIPLE-VALUE +- LISP::FILE-POSITION LISP::LOGBITP LISP::LAMBDA-BLOCK +- LISP::STANDARD-METHOD LISP::UNSIGNED-CHAR LISP::PSETQ +- LISP::EVAL LISP::CERROR LISP::CHAR-GREATERP +- LISP::GET-SETF-METHOD LISP::SYMBOL-VALUE LISP::+++ LISP::LCM +- LISP::BOOLE-NAND LISP::SIMPLE-ARRAY LISP::CADDDR +- LISP::SIMPLE-BIT-VECTOR LISP::CHAR-META-BIT LISP::PRIN1 +- LISP::BIT-ORC1 LISP::PSETF LISP::RETURN LISP::MAKE-PATHNAME +- LISP::DOTIMES LISP::DEPOSIT-FIELD LISP::*QUERY-IO* +- LISP::&ENVIRONMENT LISP::ARRAY-DIMENSIONS LISP::BSD386 +- LISP::MAKE-BROADCAST-STREAM LISP::BOOLE-ANDC2 +- LISP::MAKE-TWO-WAY-STREAM LISP::INPUT-STREAM-P +- LISP::DIGIT-CHAR-P LISP::*STANDARD-INPUT* LISP::BOUNDP +- LISP::ODDP LISP::READ-DELIMITED-LIST LISP::SIXTH +- LISP::SUBTYPEP LISP::NSTRING-CAPITALIZE LISP::DECLARE +- LISP::AKCL LISP::FLOOR LISP::GBC LISP::GENSYM +- LISP::ARRAY-HAS-FILL-POINTER-P LISP::LOGIOR LISP::Y-OR-N-P +- LISP::CHAR-FONT LISP::PARSE-NAMESTRING LISP::ARRAY-RANK +- LISP::NINTH LISP::EVALHOOK LISP::WITH-INPUT-FROM-STRING +- LISP::INTEGER LISP::MAKE-SEQUENCE LISP::SET-EXCLUSIVE-OR +- LISP::CHAR< LISP::INLINE LISP::CDDADR LISP::REMOVE-IF-NOT +- LISP::TANH LISP::ATAN LISP::NOT LISP::STRING-CHAR-P +- LISP::LONG-SITE-NAME LISP::PATHNAME-VERSION LISP::MAPCAN +- LISP::REQUIRE LISP::RPLACA LISP::TAGBODY LISP::COPY-ALIST +- LISP::CADADR LISP::MAPCAR LISP::> LISP::FIND-PACKAGE +- LISP::FBOUNDP LISP::CLX-LITTLE-ENDIAN LISP::= LISP::DEFSETF +- LISP::ZEROP LISP::MC68020 LISP::UNUSE-PACKAGE +- LISP::MOST-POSITIVE-SHORT-FLOAT +- LISP::MOST-POSITIVE-SINGLE-FLOAT +- LISP::MOST-POSITIVE-DOUBLE-FLOAT +- LISP::MOST-POSITIVE-LONG-FLOAT LISP::LOGICAL-PATHNAME +- LISP::APPLYHOOK LISP::< LISP::LOGCOUNT LISP::ENOUGH-NAMESTRING +- LISP::MULTIPLE-VALUE-LIST LISP::TWO-WAY-STREAM LISP::CDDR +- LISP::ASSOC LISP::REMF LISP::LDB LISP::MACROLET LISP::CDADR +- LISP::UNION LISP::FIND-ALL-SYMBOLS LISP::MAKE-PACKAGE +- LISP::&OPTIONAL LISP::THIRD LISP::LABELS LISP::BOOLE-C1 +- LISP::FIND-IF-NOT LISP::LOAD LISP::DELETE-IF-NOT LISP::ACONS +- LISP::UNDEFINED-FUNCTION LISP::SIGNED-CHAR LISP::INT +- LISP::PACKAGEP LISP::ENCODE-UNIVERSAL-TIME LISP::FORMAT +- LISP::TENTH LISP::STRUCTURE-CLASS LISP::MEMBER-IF-NOT +- LISP::LEAST-NEGATIVE-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-LONG-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT LISP::KCL +- LISP::BOOLE-1 LISP::REDUCE LISP::SVREF LISP::NTH-VALUE +- LISP::FORCE-OUTPUT LISP::NSUBSTITUTE-IF-NOT LISP::CATCH +- LISP::STORAGE-CONDITION LISP::MERGE LISP::CASE +- LISP::CLEAR-INPUT LISP::REPLACE LISP::*** +- LISP::GENERIC-FUNCTION LISP::GCL LISP::/ LISP::BOOLE-SET +- LISP::SOFTWARE-VERSION LISP::APROPOS-LIST +- LISP::POSITION-IF-NOT LISP::READ-BYTE LISP::FLOAT-RADIX +- LISP::DECF LISP::PROG LISP::- LISP::MAPCON LISP::CADR +- LISP::EQUAL LISP::CAADR LISP::+ LISP::PATHNAME-DEVICE +- LISP::MACRO-FUNCTION LISP::MAPLIST LISP::REVERSE +- LISP::FIND-SYMBOL LISP::* LISP::LOCALLY LISP::BIT-ANDC2 +- LISP::COMMONP LISP::*FEATURES* LISP::DIVISION-BY-ZERO +- LISP::ARRAY LISP::DOUBLE LISP::DEFPARAMETER +- LISP::PATHNAME-DIRECTORY LISP::STRING-NOT-LESSP LISP::ELT +- LISP::NTH LISP::RETURN-FROM LISP::BIGNUM LISP::MAKE-SYMBOL +- LISP::FILL LISP::CHAR-CODE LISP::*PRINT-ESCAPE* +- LISP::*PRINT-BASE* LISP::*PRINT-CASE* +- LISP::FLOATING-POINT-INVALID-OPERATION LISP::NSUBST +- LISP::SIMPLE-VECTOR LISP::ARRAY-IN-BOUNDS-P +- LISP::READ-PRESERVING-WHITESPACE LISP::ATANH LISP::ATOM +- LISP::BIT-NAND LISP::VECTOR-POP LISP::MEMBER LISP::REMOVE +- LISP::CHAR<= LISP::PUSH LISP::PROGRAM-ERROR LISP::KYOTO +- LISP::CHAR-UPCASE LISP::*PRINT-PRETTY* +- LISP::MOST-POSITIVE-FIXNUM LISP::PATHNAME-HOST +- LISP::DOCUMENTATION LISP::// LISP::UNEXPORT LISP::PROBE-FILE +- LISP::STANDARD-CLASS LISP::GET-INTERNAL-REAL-TIME +- LISP::GET-INTERNAL-RUN-TIME LISP::NOTANY LISP::QUIT LISP::ROOM +- LISP::*APPLYHOOK* LISP::COS LISP::CHAR-DOWNCASE +- LISP::CONSTANTLY LISP::RATIONALIZE +- LISP::LISP-IMPLEMENTATION-VERSION LISP::CONSTANTP +- LISP::HASH-TABLE-COUNT LISP::STREAMP LISP::*BREAK-ENABLE* +- LISP::1- LISP::BIT-XOR LISP::STRING-STREAM +- LISP::GET-PROPERTIES LISP::COUNT-IF-NOT LISP::BIT LISP::ASH +- LISP::NSUBLIS LISP::FOURTH LISP::STRING<= LISP::STRING>= +- LISP::STRING/= LISP::SLEEP LISP::LAMBDA-BLOCK-CLOSURE +- LISP::HELP LISP::TREE-EQUAL LISP::SET LISP::INT-CHAR +- LISP::STRING-GREATERP LISP::SINGLE-FLOAT-EPSILON +- LISP::SINGLE-FLOAT-NEGATIVE-EPSILON LISP::SPECIAL-FORM-P +- LISP::COMPLEMENT LISP::WRITE LISP::NCONC +- LISP::DECODE-UNIVERSAL-TIME LISP::BUILT-IN-CLASS +- LISP::*RANDOM-STATE* LISP::BOOLE-ORC1 LISP::BOOLE-ORC2 +- LISP::FILE-NAMESTRING LISP::VOID LISP::BIT-ORC2 LISP::1+ +- LISP::PROG2 SLOOP::SLOOP LISP::*READ-SUPPRESS* LISP::DOLIST +- LISP::SIMPLE-BASE-STRING LISP::LET LISP::CHAR-NOT-GREATERP +- LISP::PATHNAMEP LISP::READ LISP::RANDOM-STATE-P LISP::CDDAR +- LISP::BY LISP::SFUN LISP::REMOVE-IF LISP::&ALLOW-OTHER-KEYS +- LISP::FROUND LISP::CHAR-EQUAL +- LISP::MAKE-DISPATCH-MACRO-CHARACTER LISP::EIGHTH +- LISP::OPTIMIZE LISP::++ LISP::DO* LISP::SIMPLE-TYPE-ERROR +- LISP::ASIN LISP::SINGLE-FLOAT LISP::CCLOSURE LISP::REAL +- LISP::CHARACTER LISP::CHARACTERP LISP::GET LISP::OBJECT +- LISP::REALP LISP::FCEILING LISP::COPY-SYMBOL LISP::CHAR +- LISP::STANDARD-CHAR-P LISP::*DEBUG-IO* LISP::FIXNUM +- LISP::COMPILED-FUNCTION-P LISP::COUNT-IF LISP::** LISP::METHOD +- LISP::WITH-OPEN-FILE LISP::PACKAGE LISP::TRUNCATE_USE_C +- LISP::IGNORE LISP::IDENTITY LISP::CTYPECASE LISP::ETYPECASE +- LISP::PROGV LISP::NSUBSTITUTE-IF LISP::BOOLE-NOR +- SLOOP::DEF-LOOP-COLLECT)) +- +-;;; Definitions for package ANSI-LOOP of type SHADOW +-(LISP::IN-PACKAGE "ANSI-LOOP") +-(LISP::SHADOW 'LISP::NIL) +-(LISP::SHADOWING-IMPORT 'LISP::NIL) +-(LISP::IMPORT +- '(LISP::LOOP +- LISP::EXP +- LISP::DEFVAR +- LISP::DISASSEMBLE +- LISP::DELETE-IF +- LISP::UNSIGNED-SHORT +- LISP::GFUN +- LISP::NSUBST-IF-NOT +- LISP::CIS +- LISP::LOGAND +- LISP::BIT-EQV +- LISP::UNIX +- LISP::RANDOM +- LISP::COPY-LIST +- LISP::KEYWORDP +- LISP::CADAR +- LISP::MERGE-PATHNAMES +- LISP::BOOLE-C2 +- LISP::BIT-NOT +- LISP::CFUN +- LISP::STANDARD-OBJECT +- LISP::STRINGP +- LISP::METHOD-COMBINATION +- LISP::NSET-EXCLUSIVE-OR +- LISP::CLOSE +- LISP::INTEGER-DECODE-FLOAT +- LISP::CHAR-NOT-EQUAL +- LISP::COSH +- LISP::NTHCDR +- LISP::GET-UNIVERSAL-TIME +- LISP::YES-OR-NO-P +- LISP::READ-LINE +- LISP::LET* +- LISP::PATHNAME-TYPE +- LISP::FLOAT-PRECISION +- LISP::PROG* +- LISP::SYMBOL-NAME +- LISP::LOG +- LISP::OR +- LISP::PACKAGE-SHADOWING-SYMBOLS +- LISP::BREAK +- LISP::STRUCTURE-OBJECT +- LISP::ROTATEF +- LISP::SQRT +- LISP::CONS +- LISP::NSUBST-IF +- LISP::UNWIND-PROTECT +- LISP::CONSP +- LISP::FLOAT-SIGN +- LISP::*EVALHOOK* +- LISP::CHAR-BIT +- LISP::SOME +- LISP::MAPC +- LISP::SETF +- LISP::CEILING +- LISP::&BODY +- LISP::CDAR +- LISP::MAKE-LIST +- LISP::MAKE-HASH-TABLE +- LISP::STRING-UPCASE +- LISP::STRING-DOWNCASE +- LISP::STYLE-WARNING +- LISP::ASINH +- LISP::NRECONC +- LISP::NSTRING-DOWNCASE +- LISP::SECOND +- LISP::RATIONALP +- LISP::SET-DISPATCH-MACRO-CHARACTER +- LISP::GET-DISPATCH-MACRO-CHARACTER +- LISP::CHECK-TYPE +- LISP::MAKE-STRING-INPUT-STREAM +- LISP::MAKE-STRING-OUTPUT-STREAM +- LISP::*BREAK-ON-WARNINGS* +- LISP::BYE +- LISP::SAFETY +- LISP::*READ-DEFAULT-FLOAT-FORMAT* +- LISP::*LOAD-VERBOSE* +- LISP::OTHERWISE +- LISP::NBUTLAST +- LISP::SORT +- LISP::WARNING +- LISP::DEFLA +- LISP::PROGN +- LISP::PUSHNEW +- LISP::SYSTEM +- LISP::CHAR= +- LISP::SIGNED-SHORT +- LISP::MAKE-ECHO-STREAM +- LISP::BIT-AND +- LISP::EXPORT +- LISP::EQ +- LISP::SOFTWARE-TYPE +- LISP::LOGTEST +- LISP::LIST-ALL-PACKAGES +- LISP::DEFTYPE +- LISP::GETF +- LISP::ROW-MAJOR-AREF +- LISP::TYPECASE +- LISP::CHAR-CONTROL-BIT +- LISP::HASH-TABLE-TEST +- LISP::USER-HOMEDIR-PATHNAME +- LISP::SYMBOL-PACKAGE +- LISP::BOOLEAN +- LISP::HOST-NAMESTRING +- LISP::IN-PACKAGE +- LISP::CAAR +- LISP::INTERN +- LISP::CONDITION +- LISP::IEEE-FLOATING-POINT +- LISP::LOGNOT +- LISP::SUBST-IF-NOT +- LISP::COPY-READTABLE +- LISP::REVAPPEND +- LISP::SYMBOL +- LISP::BIT-VECTOR +- LISP::SEARCH +- LISP::STREAM-ELEMENT-TYPE +- LISP::POP +- LISP::GO +- LISP::LIST +- LISP::SET-MACRO-CHARACTER +- LISP::GET-MACRO-CHARACTER +- LISP::PARSE-ERROR +- LISP::VALUES +- LISP::DESTRUCTURING-BIND +- LISP::RANDOM-STATE +- LISP::LISTP +- LISP::CHAR/= +- LISP::REMPROP +- LISP::DO +- LISP::HELP* +- LISP::ABS +- LISP::&KEY +- LISP::VECTOR-PUSH-EXTEND +- LISP::PACKAGE-NICKNAMES +- LISP::MULTIPLE-VALUE-PROG1 +- LISP::END-OF-FILE +- LISP::*DEFAULT-PATHNAME-DEFAULTS* +- LISP::EXPT +- LISP::READER-ERROR +- LISP::REMHASH +- LISP::BLOCK +- LISP::PACKAGE-ERROR +- LISP::LAMBDA-CLOSURE +- LISP::PARSE-INTEGER +- LISP::TIME +- LISP::COERCE +- LISP::FIND-IF +- LISP::UNREAD-CHAR +- LISP::DOUBLE-FLOAT-EPSILON +- LISP::DOUBLE-FLOAT-NEGATIVE-EPSILON +- LISP::BOOLE-IOR +- LISP::ASSERT +- LISP::ADJUSTABLE-ARRAY-P +- LISP::COPY-TREE +- LISP::CLEAR-OUTPUT +- LISP::CODE-CHAR +- LISP::STRING-CAPITALIZE +- LISP::/// +- LISP::WITH-OPEN-STREAM +- LISP::REST +- LISP::ACOS +- LISP::MACHINE-TYPE +- LISP::DENOMINATOR +- LISP::TRACE +- LISP::FLOATING-POINT-INEXACT +- LISP::*READ-BASE* +- LISP::CDR +- LISP::STRING-EQUAL +- LISP::GMP +- LISP::DELETE-FILE +- LISP::FIRST +- LISP::ALPHANUMERICP +- LISP::WITH-HASH-TABLE-ITERATOR +- LISP::SCALE-FLOAT +- LISP::CONCATENATED-STREAM +- LISP::CONTROL-ERROR +- LISP::FINISH-OUTPUT +- LISP::LAMBDA-PARAMETERS-LIMIT +- LISP::PRINC +- LISP::ADJOIN +- LISP::PI +- LISP::DOUBLE-FLOAT +- LISP::READTABLE +- LISP::READTABLEP +- LISP::ARRAY-RANK-LIMIT +- LISP::RENAME-FILE +- LISP::READ-CHAR +- LISP::PEEK-CHAR +- LISP::REMOVE-DUPLICATES +- LISP::BYTE +- LISP::*MODULES* +- LISP::GET-OUTPUT-STREAM-STRING +- LISP::MULTIPLE-VALUE-BIND +- LISP::VECTORP +- LISP::RASSOC-IF-NOT +- LISP::UNINTERN +- LISP::SPECIFIC-CORRECTABLE-ERROR +- LISP::CDADAR +- LISP::FUNCTION +- LISP::LOGORC2 +- LISP::*PACKAGE* +- LISP::STRING-NOT-GREATERP +- LISP::INTERSECTION +- LISP::SPACE +- LISP::SEVENTH +- LISP::BASE-CHAR +- LISP::MAKE-CHAR +- LISP::NAME-CHAR +- LISP::SBIT +- LISP::CAADAR +- LISP::TAILP +- LISP::*TERMINAL-IO* +- LISP::STREAM-ERROR +- LISP::BOOLE-ANDC1 +- LISP::DO-ALL-SYMBOLS +- LISP::MAKUNBOUND +- LISP::PROVIDE +- LISP::THROW +- LISP::LENGTH +- LISP::CDAAR +- LISP::&AUX +- LISP::ARRAY-DISPLACEMENT +- LISP::PAIRLIS +- LISP::*PRINT-GENSYM* +- LISP::COMPILE-FILE-PATHNAME +- LISP::CAR +- LISP::FTRUNCATE +- LISP::DELETE-DUPLICATES +- LISP::NREVERSE +- LISP::APROPOS +- LISP::STRING-RIGHT-TRIM +- LISP::STEP +- LISP::BIT-NOR +- LISP::ARRAY-TOTAL-SIZE +- LISP::ECHO-STREAM +- LISP::DEFINE-SETF-METHOD +- LISP::FMAKUNBOUND +- LISP::SUBST-IF +- LISP::GET-DECODED-TIME +- LISP::LONG-FLOAT +- LISP::SIMPLE-WARNING +- LISP::CHAR-HYPER-BIT +- LISP::TAG +- LISP::RATIO +- LISP::EVENP +- LISP::QUOTE +- LISP::SIMPLE-STRING +- LISP::NSUBSTITUTE +- LISP::LAST +- LISP::NSET-DIFFERENCE +- LISP::COUNT +- LISP::CDAAAR +- LISP::SET-DIFFERENCE +- LISP::PPRINT +- LISP::SHORT-FLOAT-EPSILON +- LISP::SHORT-FLOAT-NEGATIVE-EPSILON +- LISP::SET-CHAR-BIT +- LISP::ACOSH +- LISP::LISTEN +- LISP::GENTEMP +- LISP::ERROR +- LISP::BSD +- LISP::ADJUST-ARRAY +- LISP::CLINES +- LISP::IF +- LISP::CAAAAR +- LISP::SET-SYNTAX-FROM-CHAR +- LISP::STRING-TRIM +- LISP::DIGIT-CHAR +- LISP::BOOLE-AND +- LISP::STRING> +- LISP::CAAAR +- LISP::GETHASH +- LISP::FILL-POINTER +- LISP::CDADDR +- LISP::DIRECTORY-NAMESTRING +- LISP::DEFUN +- LISP::TRUNCATE +- LISP::DEFENTRY +- LISP::ALPHA-CHAR-P +- LISP::SYMBOL-FUNCTION +- LISP::SUBSTITUTE-IF-NOT +- LISP::LDB-TEST +- LISP::FLOAT-DIGITS +- LISP::BIT-VECTOR-P +- LISP::CAADDR +- LISP::VARIABLE +- LISP::NUMERATOR +- LISP::NOTINLINE +- LISP::CHAR-LESSP +- LISP::WARN +- LISP::CHAR-NOT-LESSP +- LISP::ARRAY-DIMENSION-LIMIT +- LISP::MOD +- LISP::SXHASH +- LISP::PACKAGE-USE-LIST +- LISP::PACKAGE-USED-BY-LIST +- LISP::MACHINE-INSTANCE +- LISP::ARRAYP +- LISP::*GENSYM-COUNTER* +- LISP::UPPER-CASE-P +- LISP::*PRINT-CIRCLE* +- LISP::FTYPE +- LISP::THE +- LISP::COMPILER-LET +- LISP::WRITE-TO-STRING +- LISP::ARRAY-TOTAL-SIZE-LIMIT +- LISP::SEQUENCE +- LISP::FILE-AUTHOR +- LISP::MULTIPLE-VALUE-CALL +- LISP::*MACROEXPAND-HOOK* +- LISP::PLUSP +- LISP::INTERNAL-TIME-UNITS-PER-SECOND +- LISP::LIST* +- LISP::*PRINT-ARRAY* +- LISP::FILE-WRITE-DATE +- LISP::LAMBDA +- LISP::ED +- LISP::OPEN +- LISP::AREF +- LISP::RASSOC-IF +- LISP::LOGORC1 +- LISP::PROCLAIM +- LISP::CHAR-SUPER-BIT +- LISP::APPEND +- LISP::CONCATENATE +- LISP::WRITE-STRING +- LISP::MISMATCH +- LISP::SIMPLE-STRING-P +- LISP::PRINT +- LISP::MULTIPLE-VALUES-LIMIT +- LISP::PRIN1-TO-STRING +- LISP::PRINC-TO-STRING +- LISP::SIMPLE-CONDITION +- LISP::TERPRI +- LISP::CDAADR +- LISP::FLOATING-POINT-OVERFLOW +- LISP::FLOATING-POINT-UNDERFLOW +- LISP::CALL-ARGUMENTS-LIMIT +- LISP::COPY-SEQ +- LISP::FUNCALL +- LISP::CLRHASH +- LISP::SHORT-SITE-NAME +- LISP::LONG-FLOAT-EPSILON +- LISP::LONG-FLOAT-NEGATIVE-EPSILON +- LISP::ASSOC-IF-NOT +- LISP::CAAADR +- LISP::STRING-CHAR +- LISP::LOGANDC1 +- LISP::WITH-PACKAGE-ITERATOR +- LISP::NUMBERP +- LISP::COMPLEX +- LISP::AND +- LISP::EVAL-WHEN +- LISP::READ-FROM-STRING +- LISP::*STANDARD-OUTPUT* +- LISP::CHAR-NAME +- LISP::COMPILE-FILE +- LISP::FLOAT +- LISP::*ERROR-OUTPUT* +- LISP::TYPE-ERROR +- LISP::COMPILATION-SPEED +- LISP::LOGXOR +- LISP::LIST-LENGTH +- LISP::DRIBBLE +- LISP::EXTENDED-CHAR +- LISP::MAP +- LISP::ARRAY-ELEMENT-TYPE +- LISP::ROUND +- LISP::STRING-LEFT-TRIM +- LISP::DECLAIM +- LISP::SAVE +- LISP::SIN +- LISP::*PRINT-LENGTH* +- LISP::DECLARATION +- LISP::DECODE-FLOAT +- LISP::PATHNAME-NAME +- LISP::STRING= +- LISP::PHASE +- LISP::SPICE +- LISP::RASSOC +- LISP::LISP-IMPLEMENTATION-TYPE +- LISP::UNTRACE +- LISP::PRINT-NOT-READABLE +- LISP::ARRAY-ROW-MAJOR-INDEX +- LISP::SUBSTITUTE-IF +- LISP::BOOLE +- LISP::TRUENAME +- LISP::DEFCONSTANT +- LISP::VALUES-LIST +- LISP::*LINK-ARRAY* +- LISP::&REST +- LISP::MAKE-RANDOM-STATE +- LISP::CHAR> +- LISP::BYTE-SIZE +- LISP::MIN +- LISP::CDDDR +- LISP::BIT-IOR +- LISP::VECTOR +- LISP::UNSIGNED-BYTE +- LISP::SERIOUS-CONDITION +- LISP::SYMBOL-PLIST +- LISP::*READTABLE* +- LISP::SIMPLE-BIT-VECTOR-P +- LISP::LEAST-POSITIVE-SHORT-FLOAT +- LISP::LEAST-POSITIVE-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-LONG-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-POSITIVE-NORMALIZED-LONG-FLOAT +- LISP::LOWER-CASE-P +- SYSTEM::ALLOCATE +- LISP::EQUALP +- LISP::SUBSTITUTE +- LISP::SUBSEQ +- LISP::MINUSP +- LISP::MOST-NEGATIVE-SHORT-FLOAT +- LISP::MOST-NEGATIVE-SINGLE-FLOAT +- LISP::MOST-NEGATIVE-DOUBLE-FLOAT +- LISP::MOST-NEGATIVE-LONG-FLOAT +- LISP::FILE-LENGTH +- LISP::FILE-ERROR +- LISP::HASH-TABLE +- LISP::SPEED +- LISP::COMMON +- LISP::*PRINT-RADIX* +- LISP::POSITIVE-FIXNUM +- LISP::UNBOUND-VARIABLE +- LISP::RATIONAL +- LISP::UPGRADED-ARRAY-ELEMENT-TYPE +- LISP::FRESH-LINE +- LISP::WHEN +- LISP::COMPILE +- LISP::FLET +- LISP::SPECIAL +- LISP::CLASS +- LISP::CELL-ERROR +- LISP::RPLACD +- LISP::TYPE-OF +- LISP::SPECIAL-OPERATOR-P +- LISP::DESCRIBE +- LISP::POSITION +- LISP::STABLE-SORT +- LISP::BOTH-CASE-P +- LISP::SYMBOLP +- LISP::*PRINT-READABLY* +- LISP::SHADOW +- LISP::STREAM +- LISP::CHAR-BITS +- LISP::MAKE-ARRAY +- LISP::FUNCTIONP +- LISP::&WHOLE +- LISP::SUBST +- LISP::SCHAR +- LISP::ARRAY-DIMENSION +- LISP::COND +- LISP::DO-EXTERNAL-SYMBOLS +- LISP::CHAR-CODE-LIMIT +- LISP::CHAR-FONT-LIMIT +- LISP::SATISFIES +- LISP::MASK-FIELD +- LISP::ARITHMETIC-ERROR +- LISP::CADDR +- LISP::LAMBDA-LIST-KEYWORDS +- LISP::MACRO +- LISP::STRING-NOT-EQUAL +- LISP::STRING-LESSP +- LISP::USE-PACKAGE +- LISP::MULTIPLE-VALUE-SETQ +- LISP::>= +- LISP::LOGEQV +- LISP::*EVAL-WHEN-COMPILE* +- LISP::HASH-TABLE-P +- LISP::GRAPHIC-CHAR-P +- LISP::EQL +- LISP::MAPHASH +- LISP::NINTERSECTION +- LISP::<= +- LISP::NAMESTRING +- LISP::MAKE-CONCATENATED-STREAM +- LISP::SHORT-FLOAT +- LISP::FILE-STREAM +- LISP::WRITE-LINE +- LISP::VECTOR-PUSH +- LISP::ENDP +- LISP::DIRECTORY +- LISP::TYPE +- LISP::ASSOC-IF +- LISP::DPB +- LISP::TYPEP +- LISP::FIFTH +- LISP::LOGNAND +- LISP::SIGNED-BYTE +- LISP::EVERY +- LISP::SUBLIS +- LISP::NULL +- LISP::FLOATP +- LISP::STRING< +- LISP::*TRACE-OUTPUT* +- LISP::WRITE-CHAR +- LISP::SGC +- LISP::STANDARD-GENERIC-FUNCTION +- LISP::MAPL +- LISP::PROG1 +- LISP::COMPLEXP +- LISP::PROCLAMATION +- LISP::INSPECT +- LISP::MACROEXPAND-1 +- LISP::BIT-ANDC1 +- LISP::SETQ +- LISP::CHAR>= +- LISP::REALPART +- LISP::LDIFF +- LISP::SINH +- LISP::BROADCAST-STREAM +- LISP::BASE-STRING +- LISP::MAKE-STRING +- LISP::CDDDAR +- LISP::INTEGER-LENGTH +- LISP::OUTPUT-STREAM-P +- LISP::NUNION +- LISP::/= +- LISP::PACKAGE-NAME +- LISP::ECASE +- LISP::PATHNAME +- LISP::APPLY +- LISP::CHAR-INT +- LISP::TAN +- LISP::MOST-NEGATIVE-FIXNUM +- LISP::MAKE-SYNONYM-STREAM +- LISP::MACROEXPAND +- LISP::CADDAR +- LISP::ISQRT +- LISP::CCASE +- LISP::GCD +- LISP::KEYWORD +- LISP::UNLESS +- LISP::MAP-INTO +- LISP::SYNONYM-STREAM +- LISP::SUBSETP +- LISP::POSITION-IF +- LISP::INCF +- LISP::SHIFTF +- LISP::BOOLE-XOR +- LISP::REM +- LISP::LOGNOR +- LISP::FIND +- LISP::MAX +- LISP::SIMPLE-VECTOR-P +- LISP::IMPORT +- LISP::MACHINE-VERSION +- LISP::SHADOWING-IMPORT +- LISP::BOOLE-EQV +- LISP::CONJUGATE +- LISP::READ-CHAR-NO-HANG +- LISP::WRITE-BYTE +- LISP::WITH-OUTPUT-TO-STRING +- LISP::BYTE-POSITION +- LISP::STANDARD-CHAR +- LISP::STRING +- LISP::MEMBER-IF +- LISP::CHAR-BITS-LIMIT +- LISP::NSTRING-UPCASE +- LISP::DEFMACRO +- LISP::BUTLAST +- LISP::CDDAAR +- LISP::IMAGPART +- LISP::LOGANDC2 +- LISP::HASH-TABLE-SIZE +- LISP::FFLOOR +- LISP::*PRINT-LEVEL* +- LISP::DEFSTRUCT +- LISP::DELETE-PACKAGE +- LISP::BOOLE-CLR +- LISP::DO-SYMBOLS +- LISP::INTEGERP +- LISP::NUMBER +- LISP::CADAAR +- LISP::NIL +- LISP::T +- LISP::DELETE +- LISP::DEFCFUN +- LISP::DEFINE-MODIFY-MACRO +- LISP::COMPILED-FUNCTION +- LISP::NOTEVERY +- LISP::BOOLE-2 +- LISP::STRUCTURE +- LISP::UNBOUND-SLOT +- LISP::RENAME-PACKAGE +- LISP::SIGNUM +- LISP::CDDDDR +- LISP::GET-SETF-METHOD-MULTIPLE-VALUE +- LISP::FILE-POSITION +- LISP::LOGBITP +- LISP::LAMBDA-BLOCK +- LISP::STANDARD-METHOD +- LISP::UNSIGNED-CHAR +- LISP::PSETQ +- LISP::EVAL +- LISP::CERROR +- LISP::CHAR-GREATERP +- LISP::GET-SETF-METHOD +- LISP::SYMBOL-VALUE +- LISP::+++ +- LISP::LCM +- LISP::BOOLE-NAND +- LISP::SIMPLE-ARRAY +- LISP::CADDDR +- LISP::SIMPLE-BIT-VECTOR +- LISP::CHAR-META-BIT +- LISP::PRIN1 +- LISP::BIT-ORC1 +- LISP::PSETF +- LISP::RETURN +- LISP::MAKE-PATHNAME +- LISP::DOTIMES +- LISP::DEPOSIT-FIELD +- LISP::*QUERY-IO* +- LISP::&ENVIRONMENT +- LISP::ARRAY-DIMENSIONS +- LISP::BSD386 +- LISP::MAKE-BROADCAST-STREAM +- LISP::BOOLE-ANDC2 +- LISP::MAKE-TWO-WAY-STREAM +- LISP::INPUT-STREAM-P +- LISP::DIGIT-CHAR-P +- LISP::*STANDARD-INPUT* +- LISP::BOUNDP +- LISP::ODDP +- LISP::READ-DELIMITED-LIST +- LISP::SIXTH +- LISP::SUBTYPEP +- LISP::NSTRING-CAPITALIZE +- LISP::DECLARE +- LISP::AKCL +- LISP::FLOOR +- LISP::GBC +- LISP::GENSYM +- LISP::ARRAY-HAS-FILL-POINTER-P +- LISP::LOGIOR +- LISP::Y-OR-N-P +- LISP::CHAR-FONT +- LISP::PARSE-NAMESTRING +- LISP::ARRAY-RANK +- LISP::NINTH +- LISP::EVALHOOK +- LISP::WITH-INPUT-FROM-STRING +- LISP::INTEGER +- LISP::MAKE-SEQUENCE +- LISP::SET-EXCLUSIVE-OR +- LISP::CHAR< +- LISP::INLINE +- LISP::CDDADR +- LISP::REMOVE-IF-NOT +- LISP::TANH +- LISP::ATAN +- LISP::NOT +- LISP::STRING-CHAR-P +- LISP::LONG-SITE-NAME +- LISP::PATHNAME-VERSION +- LISP::MAPCAN +- LISP::REQUIRE +- LISP::RPLACA +- LISP::TAGBODY +- LISP::COPY-ALIST +- LISP::CADADR +- LISP::MAPCAR +- LISP::> +- LISP::FIND-PACKAGE +- LISP::FBOUNDP +- LISP::CLX-LITTLE-ENDIAN +- LISP::= +- LISP::DEFSETF +- LISP::ZEROP +- LISP::MC68020 +- LISP::UNUSE-PACKAGE +- LISP::MOST-POSITIVE-SHORT-FLOAT +- LISP::MOST-POSITIVE-SINGLE-FLOAT +- LISP::MOST-POSITIVE-DOUBLE-FLOAT +- LISP::MOST-POSITIVE-LONG-FLOAT +- LISP::LOGICAL-PATHNAME +- LISP::APPLYHOOK +- LISP::< +- LISP::LOGCOUNT +- LISP::ENOUGH-NAMESTRING +- LISP::MULTIPLE-VALUE-LIST +- LISP::TWO-WAY-STREAM +- LISP::CDDR +- LISP::ASSOC +- LISP::REMF +- LISP::LDB +- LISP::MACROLET +- LISP::CDADR +- LISP::UNION +- LISP::FIND-ALL-SYMBOLS +- LISP::MAKE-PACKAGE +- LISP::&OPTIONAL +- LISP::THIRD +- LISP::LABELS +- LISP::BOOLE-C1 +- LISP::FIND-IF-NOT +- LISP::LOAD +- LISP::DELETE-IF-NOT +- LISP::ACONS +- LISP::UNDEFINED-FUNCTION +- LISP::SIGNED-CHAR +- LISP::INT +- LISP::PACKAGEP +- LISP::ENCODE-UNIVERSAL-TIME +- LISP::FORMAT +- LISP::TENTH +- LISP::STRUCTURE-CLASS +- LISP::MEMBER-IF-NOT +- LISP::LEAST-NEGATIVE-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-LONG-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT +- LISP::LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT +- LISP::KCL +- LISP::BOOLE-1 +- LISP::REDUCE +- LISP::SVREF +- LISP::NTH-VALUE +- LISP::FORCE-OUTPUT +- LISP::NSUBSTITUTE-IF-NOT +- LISP::CATCH +- LISP::STORAGE-CONDITION +- LISP::MERGE +- LISP::CASE +- LISP::CLEAR-INPUT +- LISP::REPLACE +- LISP::*** +- LISP::GENERIC-FUNCTION +- LISP::GCL +- LISP::/ +- LISP::BOOLE-SET +- LISP::SOFTWARE-VERSION +- LISP::APROPOS-LIST +- LISP::POSITION-IF-NOT +- LISP::READ-BYTE +- LISP::FLOAT-RADIX +- LISP::DECF +- LISP::PROG +- LISP::- +- LISP::MAPCON +- LISP::CADR +- LISP::EQUAL +- LISP::CAADR +- LISP::+ +- LISP::PATHNAME-DEVICE +- LISP::MACRO-FUNCTION +- LISP::MAPLIST +- LISP::REVERSE +- LISP::FIND-SYMBOL +- LISP::* +- LISP::LOCALLY +- LISP::BIT-ANDC2 +- LISP::COMMONP +- LISP::*FEATURES* +- LISP::DIVISION-BY-ZERO +- LISP::ARRAY +- LISP::DOUBLE +- LISP::DEFPARAMETER +- LISP::PATHNAME-DIRECTORY +- LISP::STRING-NOT-LESSP +- LISP::ELT +- LISP::NTH +- LISP::RETURN-FROM +- LISP::BIGNUM +- LISP::MAKE-SYMBOL +- LISP::FILL +- LISP::CHAR-CODE +- LISP::*PRINT-ESCAPE* +- LISP::*PRINT-BASE* +- LISP::*PRINT-CASE* +- LISP::FLOATING-POINT-INVALID-OPERATION +- LISP::NSUBST +- LISP::SIMPLE-VECTOR +- LISP::ARRAY-IN-BOUNDS-P +- LISP::READ-PRESERVING-WHITESPACE +- LISP::ATANH +- LISP::ATOM +- LISP::BIT-NAND +- LISP::VECTOR-POP +- LISP::MEMBER +- LISP::REMOVE +- LISP::CHAR<= +- LISP::PUSH +- LISP::PROGRAM-ERROR +- LISP::KYOTO +- LISP::CHAR-UPCASE +- LISP::*PRINT-PRETTY* +- LISP::MOST-POSITIVE-FIXNUM +- LISP::PATHNAME-HOST +- LISP::DOCUMENTATION +- LISP::// +- LISP::UNEXPORT +- LISP::PROBE-FILE +- LISP::STANDARD-CLASS +- LISP::GET-INTERNAL-REAL-TIME +- LISP::GET-INTERNAL-RUN-TIME +- LISP::NOTANY +- LISP::QUIT +- LISP::ROOM +- LISP::*APPLYHOOK* +- LISP::COS +- LISP::CHAR-DOWNCASE +- LISP::CONSTANTLY +- LISP::RATIONALIZE +- LISP::LISP-IMPLEMENTATION-VERSION +- LISP::CONSTANTP +- LISP::HASH-TABLE-COUNT +- LISP::STREAMP +- LISP::*BREAK-ENABLE* +- LISP::1- +- LISP::BIT-XOR +- LISP::STRING-STREAM +- LISP::GET-PROPERTIES +- LISP::COUNT-IF-NOT +- LISP::BIT +- LISP::ASH +- LISP::NSUBLIS +- LISP::FOURTH +- LISP::STRING<= +- LISP::STRING>= +- LISP::STRING/= +- LISP::SLEEP +- LISP::LAMBDA-BLOCK-CLOSURE +- LISP::HELP +- LISP::TREE-EQUAL +- LISP::SET +- LISP::INT-CHAR +- LISP::STRING-GREATERP +- LISP::SINGLE-FLOAT-EPSILON +- LISP::SINGLE-FLOAT-NEGATIVE-EPSILON +- LISP::SPECIAL-FORM-P +- LISP::COMPLEMENT +- LISP::WRITE +- LISP::NCONC +- LISP::DECODE-UNIVERSAL-TIME +- LISP::BUILT-IN-CLASS +- LISP::*RANDOM-STATE* +- LISP::BOOLE-ORC1 +- LISP::BOOLE-ORC2 +- LISP::FILE-NAMESTRING +- LISP::VOID +- LISP::BIT-ORC2 +- LISP::1+ +- LISP::PROG2 +- LISP::*READ-SUPPRESS* +- LISP::DOLIST +- LISP::SIMPLE-BASE-STRING +- LISP::LET +- LISP::CHAR-NOT-GREATERP +- LISP::PATHNAMEP +- LISP::READ +- LISP::RANDOM-STATE-P +- LISP::CDDAR +- LISP::BY +- LISP::SFUN +- LISP::REMOVE-IF +- LISP::&ALLOW-OTHER-KEYS +- LISP::FROUND +- LISP::CHAR-EQUAL +- LISP::MAKE-DISPATCH-MACRO-CHARACTER +- LISP::EIGHTH +- LISP::OPTIMIZE +- LISP::++ +- LISP::DO* +- LISP::SIMPLE-TYPE-ERROR +- LISP::ASIN +- LISP::SINGLE-FLOAT +- LISP::CCLOSURE +- LISP::REAL +- LISP::CHARACTER +- LISP::CHARACTERP +- LISP::GET +- LISP::OBJECT +- LISP::REALP +- LISP::FCEILING +- LISP::COPY-SYMBOL +- LISP::CHAR +- LISP::STANDARD-CHAR-P +- LISP::*DEBUG-IO* +- LISP::FIXNUM +- LISP::COMPILED-FUNCTION-P +- LISP::COUNT-IF +- LISP::** +- LISP::METHOD +- LISP::WITH-OPEN-FILE +- LISP::PACKAGE +- LISP::TRUNCATE_USE_C +- LISP::IGNORE +- LISP::IDENTITY +- LISP::CTYPECASE +- LISP::ETYPECASE +- LISP::PROGV +- LISP::NSUBSTITUTE-IF +- LISP::BOOLE-NOR)) +- +-;;; Definitions for package COMMON-LISP of type SHADOW +-(LISP::IN-PACKAGE "COMMON-LISP") +-(LISP::SHADOW 'LISP::NIL) +-(LISP::SHADOWING-IMPORT 'LISP::NIL) +-(LISP::IMPORT '(LISP::NIL LISP::T)) +- +-(lisp::in-package "SI") +-(export '(%structure-name +- %compiled-function-name +- %set-compiled-function-name)) +-(in-package "PCL") +--- gcl-2.6.12.orig/unixport/init_ansi_gcl.lsp.in ++++ /dev/null +@@ -1,266 +0,0 @@ +-(make-package "COMPILER" :use '("LISP")) +-(import '(si::proclaimed-function si::proclaimed-closure si::proclaimed-return-type si::proclaimed-arg-types) :compiler) +-(make-package "SLOOP" :use '("LISP")) +-(make-package "ANSI-LOOP" :use '("LISP")) +-(make-package "DEFPACKAGE" :use '("LISP")) +-(make-package "TK" :use '("LISP" "SLOOP")) +-(make-package "FPE" :use '("LISP")) +- +-@LI-PCL-PACKAGE@ +- +-(in-package :pcl) +-(defvar *the-pcl-package* (find-package :pcl)) +-(defun load-truename (&optional (errorp nil)) +- (flet () si:*load-pathname* nil)) +- +-@LI-CLCS-PACKAGE@ +- +-(rename-package 'user 'common-lisp-user '(cl-user user)) +- +-(in-package "SYSTEM") +-(use-package :fpe) +- +-(defvar *command-args* nil) +- ;; if ANY header or license information is printed by the +- ;; program, then the following License and Enhancement notice +- ;; must be printed (see License). +-(progn +- +- (system:init-system) +- (gbc t) +- +- (in-package "USER") +- +- (or lisp::*link-array* +- (setq lisp::*link-array* +- (make-array (ash 1 11) :element-type 'string-char :fill-pointer 0))) +- (si::use-fast-links t) +- +- (let* ((x (append (pathname-directory si::*system-directory*) (list :parent))) +- (lsp (append x (list "lsp"))) +- (cmpnew (append x (list "cmpnew"))) +- (h (append x (list "h"))) +- (pcl (append x (list "pcl"))) +- (clcs (append x (list "clcs"))) +- (gtk (append x (list "gcl-tk")))) +- (dolist (d (list lsp cmpnew pcl clcs)) +- (load (make-pathname :name "sys-proclaim" :type "lisp" :directory d))) +- (load (make-pathname :name "tk-package" :type "lsp" :directory gtk)) +-; (load (make-pathname :name "gcl_cmpmain" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_lfun_list" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_cmpopt" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_auto_new" :type "lsp" :directory lsp)) +- +- (gbc t) +- +- (setq compiler::*cmpinclude* "\"cmpinclude.h\"") +- +- (when compiler::*cmpinclude-string* +- (with-open-file (st (make-pathname :directory h :name "cmpinclude" :type "h")) +- (let +- ((tem (make-array (file-length st) :element-type 'standard-char +- :static t))) +- (if (si::fread tem 0 (length tem) st) +- (setq compiler::*cmpinclude-string* tem)))))) +- +- (setf (symbol-function 'si:clear-compiler-properties) +- (symbol-function 'compiler::compiler-clear-compiler-properties)) +- +- (defvar si::*lib-directory* (namestring (make-pathname :directory (list :parent)))) +- +- (terpri) +- (setq si:*inhibit-macro-special* t) +- (gbc t) (system:reset-gbc-count) +- +- (defun system:top-level nil (system::gcl-top-level)) +- +- (setq compiler::*default-c-file* nil) +- (setq compiler::*default-h-file* nil) +- (setq compiler::*default-data-file* nil) +- (setq compiler::*default-system-p* nil) +- (setq compiler::*keep-gaz* nil) +- +- +- +- (setq clcs_shadow +- '(CONDITIONS::BREAK +- CONDITIONS::ERROR +- CONDITIONS::CERROR +- CONDITIONS::WARN +- CONDITIONS::CHECK-TYPE +- CONDITIONS::ASSERT +- CONDITIONS::ETYPECASE +- CONDITIONS::CTYPECASE +- CONDITIONS::ECASE +- CONDITIONS::CCASE )) +- +- (setq lisp_unexport +- '(LISP::LAMBDA-BLOCK-CLOSURE +- LISP::BYE +- LISP::QUIT +- LISP::EXIT +- LISP::IEEE-FLOATING-POINT +- LISP::DEFENTRY +- LISP::VOID +- LISP::ALLOCATE-CONTIGUOUS-PAGES +- LISP::UNSIGNED-SHORT +- LISP::DOUBLE +- LISP::BY +- LISP::GBC +- LISP::DEFCFUN +- LISP::SAVE +- LISP::MAXIMUM-CONTIGUOUS-PAGES +- LISP::SPICE +- LISP::DEFLA +- LISP::ALLOCATED-PAGES +- LISP::SUN +- LISP::INT +- LISP::USE-FAST-LINKS +- LISP::CFUN +- LISP::UNSIGNED-CHAR +- LISP::HELP +- LISP::HELP* +- LISP::MACRO +- LISP::*BREAK-ENABLE* +- LISP::CLINES +- LISP::LAMBDA-CLOSURE +- LISP::OBJECT +- LISP::FAT-STRING +- LISP::SIGNED-SHORT +- LISP::MC68020 +- LISP::LAMBDA-BLOCK +- LISP::TAG +- LISP::PROCLAMATION +- LISP::ALLOCATED-CONTIGUOUS-PAGES +- LISP::*EVAL-WHEN-COMPILE* +- LISP::SIGNED-CHAR +- LISP::*IGNORE-MAXIMUM-PAGES* +- LISP::*LINK-ARRAY* +- LISP::KCL +- LISP::BSD +- LISP::ALLOCATE-RELOCATABLE-PAGES +- LISP::ALLOCATE +- LISP::UNIX +- LISP::MAXIMUM-ALLOCATABLE-PAGES +- LISP::ALLOCATED-RELOCATABLE-PAGES +- LISP::SYSTEM +- LISP::KYOTO +- LISP::CCLOSURE)) +- +-;anything in "SYSTEM" which should go in "COMMON-LISP" +-;can be added to shadow-system +- (setf shadow-system '(system::copy-structure)) +- +- (do-external-symbols (s "SYSTEM") +- (when (member s shadow-system) +- (shadowing-import (list s) "COMMON-LISP") +- (shadowing-import (list s) "USER"))) +- +- +- (do-external-symbols (s "LISP") +- (if (not(member s lisp_unexport)) +- (progn +- (import (list s) "COMMON-LISP") +- (import (list s) "USER")) )) +- +- (do-external-symbols (s "PCL") +- (import (list s) "COMMON-LISP") +- (import (list s) "USER")) +- +-;(shadowing-import (list 'pcl::classp) "SYSTEM") +- ;; (setf (symbol-function 'si::classp) (symbol-function 'pcl::classp)) +- ;; (setf (symbol-function 'si::class-of) (symbol-function 'pcl::class-of)) +- ;; (setf (symbol-function 'si::class-precedence-list) +- ;; (symbol-function 'pcl::class-precedence-list)) +- ;; (setf (symbol-function 'si::find-class) +- ;; (symbol-function 'pcl::find-class)) +- +- (do-external-symbols (s "CONDITIONS") +- (if (member s clcs_shadow) +- (progn +- (shadowing-import (list s) "COMMON-LISP") +- (shadowing-import (list s) "USER")) +- (progn +- (import (list s) "COMMON-LISP") +- (import (list s) "USER")))) +- +- t) +- +-(progn +- +- (dolist (s '(*compile-file-pathname* *compile-file-truename* +- *compile-print* *compile-verbose* *load-pathname* *load-print* +- *load-truename* *print-lines* *print-miser-width* +- *print-pprint-dispatch* *print-right-margin* *read-eval* +- lisp::arithmetic-error broadcast-stream-streams cell-error +- cell-error-name compile compile-file compiler-macro +- compiler-macro-function complement concatenated-stream-streams +- condition control-error copy-pprint-dispatch copy-structure count +- debug define-compiler-macro define-setf-expander define-symbol-macro +- defpackage describe describe-object division-by-zero dynamic-extent +- echo-stream-input-stream echo-stream-output-stream +- ensure-directories-exist fdefinition file-string-length formatter +- function-lambda-expression get-setf-expansion hash-table-rehash-size +- hash-table-rehash-threshold ignorable interactive-stream-p +- load-logical-pathname-translations load-time-value +- logical-pathname-translations make-load-form +- make-load-form-saving-slots make-method open-stream-p pathname-match-p +- pprint-dispatch pprint-exit-if-list-exhausted pprint-fill +- pprint-indent pprint-linear pprint-logical-block pprint-newline +- pprint-pop pprint-tab pprint-tabular print-not-readable-object +- print-unreadable-object readtable-case row-major-aref +- set-pprint-dispatch simple-condition-format-control +- stream-external-format synonym-stream-symbol +- translate-logical-pathname translate-pathname +- two-way-stream-input-stream two-way-stream-output-stream +- unbound-slot-instance +- upgraded-complex-part-type wild-pathname-p with-compilation-unit +- with-condition-restarts with-package-iterator with-standard-io-syntax +- )) +- (shadowing-import (list s) "COMMON-LISP")) +- +- (use-package "ANSI-LOOP" "COMMON-LISP") +- (use-package "ANSI-LOOP" "USER") +- +- (do-symbols (s "COMMON-LISP") +- (export (list s) "COMMON-LISP")) +- +- (rename-package 'common-lisp 'common-lisp '(cl)) +- +- (unintern 'system) +- (unintern 'lisp) +- (unintern 'compiler) +- (unintern 'user) +- (fmakunbound 'si::init-cmp-anon) +- +- (makunbound 'clcs_shadow) +- (makunbound 'lisp_unexport) +- (makunbound 'shadow-system) +- (unintern 'clcs_shadow) +- (unintern 'lisp_unexport) +- (unintern 'int) +- (unintern 'shadow-system) +- +- (push :common-lisp *features*) +- (push :ansi-cl *features*) +- +- (if (fboundp 'si::user-init) (si::user-init)) +- (si::set-up-top-level) +- +- (setq si::*gcl-extra-version* @LI-EXTVERS@ +- si::*gcl-minor-version* @LI-MINVERS@ +- si::*gcl-major-version* @LI-MAJVERS@) +- (setq compiler::*cc* @LI-CC@) +- (setq compiler::*ld* @LI-LD@) +- (setq compiler::*ld-libs* @LI-LD-LIBS@) +- (setq compiler::*opt-three* @LI-OPT-THREE@) +- (setq compiler::*opt-two* @LI-OPT-TWO@) +- (setq compiler::*init-lsp* @LI-INIT-LSP@) +- +- (defvar si::*system-banner* (si::default-system-banner)) +- (setq si::*optimize-maximum-pages* t) +- +- (in-package 'user) +- (import 'si::info) +- +- t) +--- gcl-2.6.12.orig/unixport/init_gcl.lsp.in ++++ /dev/null +@@ -1,95 +0,0 @@ +-(make-package "COMPILER" :use '("LISP")) +-(import '(si::proclaimed-function si::proclaimed-closure si::proclaimed-return-type si::proclaimed-arg-types) :compiler) +-(make-package "SLOOP" :use '("LISP")) +-(make-package "ANSI-LOOP" :use '("LISP")) +-(make-package "DEFPACKAGE" :use '("LISP")) +-(make-package "TK" :use '("LISP" "SLOOP")) +-(make-package "FPE" :use '("LISP")) +- +-(in-package "SYSTEM") +-(use-package :fpe) +- +-(defvar *command-args* nil) +- ;; if ANY header or license information is printed by the +- ;; program, then the following License and Enhancement notice +- ;; must be printed (see License). +-(progn +- +- (system:init-system) +- (gbc t) +- +- (in-package "USER") +- +- (or lisp::*link-array* +- (setq lisp::*link-array* +- (make-array (ash 1 11) :element-type 'string-char :fill-pointer 0))) +- (si::use-fast-links t) +- +- (let* ((x (append (pathname-directory si::*system-directory*) (list :parent))) +- (lsp (append x (list "lsp"))) +- (cmpnew (append x (list "cmpnew"))) +- (h (append x (list "h"))) +- (gtk (append x (list "gcl-tk")))) +- (dolist (d (list lsp cmpnew)) +- (load (make-pathname :name "sys-proclaim" :type "lisp" :directory d))) +- (load (make-pathname :name "tk-package" :type "lsp" :directory gtk)) +-; (load (make-pathname :name "gcl_cmpmain" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_lfun_list" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_cmpopt" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_auto_new" :type "lsp" :directory lsp)) +- +- (gbc t) +- +- (setq compiler::*cmpinclude* "\"cmpinclude.h\"") +- +- (when compiler::*cmpinclude-string* +- (with-open-file (st (make-pathname :directory h :name "cmpinclude" :type "h")) +- (let +- ((tem (make-array (file-length st) :element-type 'standard-char +- :static t))) +- (if (si::fread tem 0 (length tem) st) +- (setq compiler::*cmpinclude-string* tem)))))) +- +- (setf (symbol-function 'si:clear-compiler-properties) +- (symbol-function 'compiler::compiler-clear-compiler-properties)) +- +- (defvar si::*lib-directory* (namestring (make-pathname :directory (list :parent)))) +- +- (terpri) +- (setq si:*inhibit-macro-special* t) +- (gbc t) (system:reset-gbc-count) +- +- (defun system:top-level nil (system::gcl-top-level)) +- +- (setq compiler::*default-c-file* nil) +- (setq compiler::*default-h-file* nil) +- (setq compiler::*default-data-file* nil) +- (setq compiler::*default-system-p* nil) +- (setq compiler::*keep-gaz* nil) +- +- (unintern 'system) +- (unintern 'lisp) +- (unintern 'compiler) +- (unintern 'user) +- (fmakunbound 'si::init-cmp-anon) +- +- (if (fboundp 'si::user-init) (si::user-init)) +- (si::set-up-top-level) +- +- (setq si::*gcl-extra-version* @LI-EXTVERS@ +- si::*gcl-minor-version* @LI-MINVERS@ +- si::*gcl-major-version* @LI-MAJVERS@) +- (setq compiler::*cc* @LI-CC@) +- (setq compiler::*ld* @LI-LD@) +- (setq compiler::*ld-libs* @LI-LD-LIBS@) +- (setq compiler::*opt-three* @LI-OPT-THREE@) +- (setq compiler::*opt-two* @LI-OPT-TWO@) +- (setq compiler::*init-lsp* @LI-INIT-LSP@) +- +- (defvar si::*system-banner* (si::default-system-banner)) +- (setq si::*optimize-maximum-pages* t) +- +- (in-package 'user) +- (import 'si::info) +- +- t) +--- gcl-2.6.12.orig/unixport/init_pcl_gcl.lsp.in ++++ /dev/null +@@ -1,107 +0,0 @@ +-(make-package "COMPILER" :use '("LISP")) +-(import '(si::proclaimed-function si::proclaimed-closure si::proclaimed-return-type si::proclaimed-arg-types) :compiler) +-(make-package "SLOOP" :use '("LISP")) +-(make-package "ANSI-LOOP" :use '("LISP")) +-(make-package "DEFPACKAGE" :use '("LISP")) +-(make-package "TK" :use '("LISP" "SLOOP")) +-(make-package "FPE" :use '("LISP")) +- +-@LI-PCL-PACKAGE@ +- +-(in-package :pcl) +-(defvar *the-pcl-package* (find-package :pcl)) +-(defun load-truename (&optional (errorp nil)) +- (flet () si:*load-pathname* nil)) +- +-(in-package "SYSTEM") +-(use-package :fpe) +- +-(defvar *command-args* nil) +- ;; if ANY header or license information is printed by the +- ;; program, then the following License and Enhancement notice +- ;; must be printed (see License). +-(progn +- +- (system:init-system) +- (gbc t) +- +- (in-package "USER") +- +- (or lisp::*link-array* +- (setq lisp::*link-array* +- (make-array (ash 1 11) :element-type 'string-char :fill-pointer 0))) +- (si::use-fast-links t) +- +- (let* ((x (append (pathname-directory si::*system-directory*) (list :parent))) +- (lsp (append x (list "lsp"))) +- (cmpnew (append x (list "cmpnew"))) +- (h (append x (list "h"))) +- (pcl (append x (list "pcl"))) +- (gtk (append x (list "gcl-tk")))) +- (dolist (d (list lsp cmpnew pcl)) +- (load (make-pathname :name "sys-proclaim" :type "lisp" :directory d))) +- (load (make-pathname :name "tk-package" :type "lsp" :directory gtk)) +-; (load (make-pathname :name "gcl_cmpmain" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_lfun_list" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_cmpopt" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_auto_new" :type "lsp" :directory lsp)) +- +- (gbc t) +- +- (setq compiler::*cmpinclude* "\"cmpinclude.h\"") +- +- (when compiler::*cmpinclude-string* +- (with-open-file (st (make-pathname :directory h :name "cmpinclude" :type "h")) +- (let +- ((tem (make-array (file-length st) :element-type 'standard-char +- :static t))) +- (if (si::fread tem 0 (length tem) st) +- (setq compiler::*cmpinclude-string* tem)))))) +- +- (setf (symbol-function 'si:clear-compiler-properties) +- (symbol-function 'compiler::compiler-clear-compiler-properties)) +- +- (defvar si::*lib-directory* (namestring (make-pathname :directory (list :parent)))) +- +- (terpri) +- (setq si:*inhibit-macro-special* t) +- (gbc t) (system:reset-gbc-count) +- +- (defun system:top-level nil (system::gcl-top-level)) +- +- (setq compiler::*default-c-file* nil) +- (setq compiler::*default-h-file* nil) +- (setq compiler::*default-data-file* nil) +- (setq compiler::*default-system-p* nil) +- (setq compiler::*keep-gaz* nil) +- +- t) +- +-(progn +- +- (unintern 'system) +- (unintern 'lisp) +- (unintern 'compiler) +- (unintern 'user) +- (fmakunbound 'si::init-cmp-anon) +- +- (if (fboundp 'si::user-init) (si::user-init)) +- (si::set-up-top-level) +- +- (setq si::*gcl-extra-version* @LI-EXTVERS@ +- si::*gcl-minor-version* @LI-MINVERS@ +- si::*gcl-major-version* @LI-MAJVERS@) +- (setq compiler::*cc* @LI-CC@) +- (setq compiler::*ld* @LI-LD@) +- (setq compiler::*ld-libs* @LI-LD-LIBS@) +- (setq compiler::*opt-three* @LI-OPT-THREE@) +- (setq compiler::*opt-two* @LI-OPT-TWO@) +- (setq compiler::*init-lsp* @LI-INIT-LSP@) +- +- (defvar si::*system-banner* (si::default-system-banner)) +- (setq si::*optimize-maximum-pages* t) +- +- (in-package 'user) +- (import 'si::info) +- +- t) +--- gcl-2.6.12.orig/unixport/init_pre_gcl.lsp.in ++++ /dev/null +@@ -1,96 +0,0 @@ +-(make-package "COMPILER" :use '("LISP")) +-(import '(si::proclaimed-function si::proclaimed-closure si::proclaimed-return-type si::proclaimed-arg-types) :compiler) +-(make-package "SLOOP" :use '("LISP")) +-(make-package "ANSI-LOOP" :use '("LISP")) +-(make-package "DEFPACKAGE" :use '("LISP")) +-(make-package "TK" :use '("LISP" "SLOOP")) +-(make-package "FPE" :use '("LISP")) +- +-(in-package "SYSTEM") +-(use-package :fpe) +- +-(defvar *command-args* nil) +- ;; if ANY header or license information is printed by the +- ;; program, then the following License and Enhancement notice +- ;; must be printed (see License). +- +-(progn +- +- (system:init-system) +- (gbc t) +- +- (in-package "USER") +- +- (or lisp::*link-array* +- (setq lisp::*link-array* +- (make-array (ash 1 11) :element-type 'string-char :fill-pointer 0))) +- (si::use-fast-links t) +- +- (let* ((x (append (pathname-directory si::*system-directory*) (list :parent))) +- (lsp (append x (list "lsp"))) +- (cmpnew (append x (list "cmpnew"))) +- (h (append x (list "h"))) +- (gtk (append x (list "gcl-tk")))) +- (dolist (d (list lsp cmpnew)) +- (load (make-pathname :name "sys-proclaim" :type "lisp" :directory d))) +- (load (make-pathname :name "tk-package" :type "lsp" :directory gtk)) +- (load (make-pathname :name "gcl_cmpmain" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_lfun_list" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_cmpopt" :type "lsp" :directory cmpnew)) +- (load (make-pathname :name "gcl_auto_new" :type "lsp" :directory lsp)) +- +- (gbc t) +- +- (setq compiler::*cmpinclude* "\"cmpinclude.h\"") +- +- (when compiler::*cmpinclude-string* +- (with-open-file (st (make-pathname :directory h :name "cmpinclude" :type "h")) +- (let +- ((tem (make-array (file-length st) :element-type 'standard-char +- :static t))) +- (if (si::fread tem 0 (length tem) st) +- (setq compiler::*cmpinclude-string* tem)))))) +- +- (setf (symbol-function 'si:clear-compiler-properties) +- (symbol-function 'compiler::compiler-clear-compiler-properties)) +- +- (defvar si::*lib-directory* (namestring (make-pathname :directory (list :parent)))) +- +- (terpri) +- (setq si:*inhibit-macro-special* t) +- (gbc t) (system:reset-gbc-count) +- +- (defun system:top-level nil (system::gcl-top-level)) +- +- (setq compiler::*default-c-file* nil) +- (setq compiler::*default-h-file* nil) +- (setq compiler::*default-data-file* nil) +- (setq compiler::*default-system-p* nil) +- (setq compiler::*keep-gaz* nil) +- +- (unintern 'system) +- (unintern 'lisp) +- (unintern 'compiler) +- (unintern 'user) +- (fmakunbound 'si::init-cmp-anon) +- +- (if (fboundp 'si::user-init) (si::user-init)) +- (si::set-up-top-level) +- +- (setq si::*gcl-extra-version* @LI-EXTVERS@ +- si::*gcl-minor-version* @LI-MINVERS@ +- si::*gcl-major-version* @LI-MAJVERS@) +- (setq compiler::*cc* @LI-CC@) +- (setq compiler::*ld* @LI-LD@) +- (setq compiler::*ld-libs* @LI-LD-LIBS@) +- (setq compiler::*opt-three* @LI-OPT-THREE@) +- (setq compiler::*opt-two* @LI-OPT-TWO@) +- (setq compiler::*init-lsp* @LI-INIT-LSP@) +- +- (defvar si::*system-banner* (si::default-system-banner)) +- (setq si::*optimize-maximum-pages* t) +- +- (in-package 'user) +- (import 'si::info) +- +- t) diff --git a/debian/patches/ansi-test-clean-target b/debian/patches/ansi-test-clean-target new file mode 100644 index 0000000..15f42d9 --- /dev/null +++ b/debian/patches/ansi-test-clean-target @@ -0,0 +1,33 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-39) unstable; urgency=medium + . + * pathnames1.1 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-12 + +--- gcl-2.6.12.orig/ansi-tests/makefile ++++ gcl-2.6.12/ansi-tests/makefile +@@ -8,3 +8,5 @@ test: + + clean: + rm -f test.out *.fasl *.o *.so *~ *.fn *.x86f *.fasl *.ufsl ++ rm -f foo.txt temp.dat file-that-was-renamed.txt tmp.dat tmp.dat.BAK tmp2.dat ++ rm -rf scratch tmp.txt foo.lsp 'CLTEST:foo.txt' diff --git a/debian/patches/data_bss_offset-in-unexec-sparc64-fix b/debian/patches/data_bss_offset-in-unexec-sparc64-fix new file mode 100644 index 0000000..08d1543 --- /dev/null +++ b/debian/patches/data_bss_offset-in-unexec-sparc64-fix @@ -0,0 +1,83 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-31) unstable; urgency=medium + . + * Version_2_6_13pre39 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: + +--- gcl-2.6.12.orig/o/unexelf.c ++++ gcl-2.6.12/o/unexelf.c +@@ -428,6 +428,8 @@ extern void fatal (char *, ...); + #include /* for HDRR declaration */ + #endif /* __sgi */ + ++#include "page.h" ++ + #ifndef MAP_ANON + #ifdef MAP_ANONYMOUS + #define MAP_ANON MAP_ANONYMOUS +@@ -655,7 +657,7 @@ unexec (char *new_name, char *old_name, + char *old_section_names; + + ElfW(Addr) old_bss_addr, new_bss_addr,new_data2_addr; +- ElfW(Off) old_bss_size, new_data2_size,old_bss_offset,new_data2_offset,old_file_size,new_file_size; ++ ElfW(Off) old_bss_size, new_data2_size,old_bss_offset,new_data2_offset,old_file_size,new_file_size,data_bss_offset; + + int n, nn; + int old_bss_index, old_sbss_index; +@@ -772,7 +774,9 @@ unexec (char *new_name, char *old_name, + if (new_file < 0) + fatal ("Can't creat (%s): errno %d\n", new_name, errno); + +- new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_size + (new_data2_offset-old_bss_offset); ++ data_bss_offset=CEI(new_data2_offset-old_bss_offset,sizeof(long));/*????, e.g. sparc64*/ ++ ++ new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_size + data_bss_offset; + + if (ftruncate (new_file, new_file_size)) + fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); +@@ -784,7 +788,7 @@ unexec (char *new_name, char *old_name, + new_file_h = (ElfW(Ehdr) *) new_base; + new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff); + new_section_h = (ElfW(Shdr) *) +- ((byte *) new_base + old_file_h->e_shoff + new_data2_size + (new_data2_offset-old_bss_offset)); ++ ((byte *) new_base + old_file_h->e_shoff + new_data2_size + data_bss_offset); + + + /* Make our new file, program and section headers as copies of the +@@ -802,7 +806,7 @@ unexec (char *new_name, char *old_name, + * further away now. + */ + +- new_file_h->e_shoff += new_data2_size + (new_data2_offset-old_bss_offset); ++ new_file_h->e_shoff += new_data2_size + data_bss_offset; + new_file_h->e_shnum += 1; + + #ifdef DEBUG +@@ -958,7 +962,7 @@ unexec (char *new_name, char *old_name, + if (NEW_SECTION_H (nn).sh_offset >= old_bss_offset || + /* solaris has symtab straddling bss offset */ + NEW_SECTION_H (nn).sh_offset+NEW_SECTION_H (nn).sh_size > old_bss_offset) +- NEW_SECTION_H (nn).sh_offset += new_data2_size+(new_data2_offset-old_bss_offset); ++ NEW_SECTION_H (nn).sh_offset += new_data2_size+data_bss_offset; + #endif + /* Any section that was originally placed after the section + header table should now be off by the size of one section diff --git a/debian/patches/defined_real_maxpage b/debian/patches/defined_real_maxpage new file mode 100644 index 0000000..4fe1d27 --- /dev/null +++ b/debian/patches/defined_real_maxpage @@ -0,0 +1,71 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-50) unstable; urgency=medium + . + * list_order.6 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-06-14 + +--- gcl-2.6.12.orig/h/386-gnu.h ++++ gcl-2.6.12/h/386-gnu.h +@@ -59,3 +59,5 @@ + #define RELOC_H "elf32_i386_reloc.h" + + #define NEED_STACK_CHK_GUARD ++ ++#define DEFINED_REAL_MAXPAGE (1UL<<18) /*FIXME brk probe broken*/ +--- gcl-2.6.12.orig/h/m68k-linux.h ++++ gcl-2.6.12/h/m68k-linux.h +@@ -78,3 +78,5 @@ int cacheflush(void *,int,int,int); + #define RELOC_H "elf32_m68k_reloc.h" + + #define NEED_STACK_CHK_GUARD ++ ++#define DEFINED_REAL_MAXPAGE (1UL<<18) /*FIXME brk probe broken*/ +--- gcl-2.6.12.orig/h/sh4-linux.h ++++ gcl-2.6.12/h/sh4-linux.h +@@ -56,3 +56,5 @@ + #define RELOC_H "elf32_sh4_reloc.h" + + #define NEED_STACK_CHK_GUARD ++ ++#define DEFINED_REAL_MAXPAGE (1UL<<18) /*FIXME brk probe broken*/ +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -302,6 +302,9 @@ update_real_maxpage(void) { + } + #endif + ++#ifdef DEFINED_REAL_MAXPAGE ++ real_maxpage=DEFINED_REAL_MAXPAGE; ++#else + massert(cur=sbrk(0)); + beg=data_start ? data_start : cur; + for (i=0,j=(1L<PAGESIZE;j>>=1) +@@ -311,7 +314,8 @@ update_real_maxpage(void) { + i+=j; + } + massert(!mbrk(cur)); +- ++#endif ++ + phys_pages=ufmin(get_phys_pages1(0)+page(beg),real_maxpage)-page(beg); + + get_gc_environ(); diff --git a/debian/patches/disable_gprof_aarch64 b/debian/patches/disable_gprof_aarch64 new file mode 100644 index 0000000..239d89c --- /dev/null +++ b/debian/patches/disable_gprof_aarch64 @@ -0,0 +1,56 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-54) unstable; urgency=medium + . + * list_order.11 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-08-24 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4122,6 +4122,7 @@ $as_echo_n "checking working gprof... " + ia64*) enableval="no";; + hppa*) enableval="no";; + arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++ aarch64*) enableval="no";;#unreproducible buildd bug 20170824 + *gnu) enableval="no";; + esac + if test "$enableval" != "yes" ; then +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -335,6 +335,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + ia64*) enableval="no";; + hppa*) enableval="no";; + arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++ aarch64*) enableval="no";;#unreproducible buildd bug 20170824 + *gnu) enableval="no";; + esac + if test "$enableval" != "yes" ; then +--- gcl-2.6.12.orig/o/regexp.c ++++ gcl-2.6.12/o/regexp.c +@@ -231,7 +231,7 @@ int case_fold_search = 0; + * of the structure of the compiled regexp. + */ + static regexp * +-regcomp(char *exp,int *sz) ++regcomp(char *exp,ufixnum *sz) + { + register regexp *r; + register char *scan; diff --git a/debian/patches/list_order.1 b/debian/patches/list_order.1 new file mode 100644 index 0000000..f04c29e --- /dev/null +++ b/debian/patches/list_order.1 @@ -0,0 +1,8651 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-47) unstable; urgency=high + . + * pathnames1.13 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-05-28 + +--- gcl-2.6.12.orig/clcs/sys-proclaim.lisp ++++ gcl-2.6.12/clcs/sys-proclaim.lisp +@@ -4,7 +4,9 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- CONDITIONS::COERCE-TO-FN CONDITIONS::SLOT-SYM)) ++ COMMON-LISP::DEFINE-CONDITION COMMON-LISP::HANDLER-CASE ++ COMMON-LISP::IGNORE-ERRORS COMMON-LISP::HANDLER-BIND ++ CONDITIONS::SLOT-SYM CONDITIONS::COERCE-TO-FN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +@@ -20,27 +22,27 @@ + CONDITIONS::|(PCL::FAST-METHOD MAKE-LOAD-FORM (CONDITION))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- CONDITIONS::IS-CONDITION CONDITIONS::DEFAULT-REPORT +- CONDITIONS::IS-WARNING CONDITIONS::CONDITIONP)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::*) +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (FILE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| + CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))|)) +\ No newline at end of file ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ CONDITIONS::CONDITIONP CONDITIONS::DEFAULT-REPORT ++ CONDITIONS::IS-CONDITION CONDITIONS::IS-WARNING)) +\ No newline at end of file +--- gcl-2.6.12.orig/cmpnew/gcl_cmpcall.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpcall.lsp +@@ -27,8 +27,7 @@ + (eval-when (compile eval) + (defmacro link-arg-p (x) + `(let ((.u ,x)) +- (not (member .u '(character boolean long-float short-float))))) +-) ++ (not (member .u '(character boolean long-float short-float) :test 'eq))))) + + (defun fast-link-proclaimed-type-p (fname &optional args) + (and +@@ -134,6 +133,7 @@ + (let ((*vs* *vs*) (form (caddr funob))) + (declare (object form)) + (cond ((and (listp args) ++ (< (length args) 12) ;FIXME fcalln1 limitation + *use-sfuncall* + ;;Determine if only one value at most is required: + (or +@@ -167,8 +167,9 @@ + (defun fcalln-inline (&rest args) + (wt-nl "({object _f=" (car args) ";enum type _t=type_of(_f);") + (wt-nl "_f = _t==t_symbol && _f->s.s_gfdef!=OBJNULL ? (_t=type_of(_f->s.s_gfdef),_f->s.s_gfdef) : _f;") +- (wt-nl "_t==t_sfun ? _f->sfn.sfn_self : ") +- (wt-nl "(fcall.argd= " (length (cdr args)) ",_t==t_vfun ? _f->vfn.vfn_self : ") ++ (wt-nl "_t==t_sfun&&(_f->sfn.sfn_argd&0xff)== " (length (cdr args)) " ? _f->sfn.sfn_self : ") ++ (wt-nl "(fcall.argd= " (length (cdr args)) ++ ",_t==t_vfun&&_f->vfn.vfn_minargs<= " (length (cdr args)) "&&" (length (cdr args)) "<=_f->vfn.vfn_maxargs ? _f->vfn.vfn_self : ") + (wt-nl "(fcall.fun=_f,fcalln));})") + (wt-nl "(") + (when (cdr args) (wt (cadr args)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpenv.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpenv.lsp +@@ -376,9 +376,7 @@ + doc form) + (loop + (when (endp body) (return)) +- (setq form (cmp-macroexpand (car body))) +- (when (and (consp form) (eq (car form) 'load-time-value)) +- (setq form (cmp-eval form))) ++ (setq form (car body)) + (cond + ((stringp form) + (when (or (null doc-p) (endp (cdr body)) doc) (return)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpfun.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpfun.lsp +@@ -603,7 +603,9 @@ + (t + `(si::structure-subtype-p + ,x ',type)))) +-; ((and (print (list 'slow 'typep type)) nil)) ++ ((and (symbolp type) (setq tem (get type 'si::deftype-definition))) ++ `(typep ,x ',(funcall tem))) ++ ;; ((and (print (list 'slow 'typep type)) nil)) + (t nil))) + (and new (c1expr `(the boolean , new))))) + +@@ -877,36 +879,6 @@ + (c1expr (cmp-eval (cons f args)))))) + + +-(si::putprop 'do 'co1special-fix-decl 'co1special) +-(si::putprop 'do* 'co1special-fix-decl 'co1special) +-(si::putprop 'prog 'co1special-fix-decl 'co1special) +-(si::putprop 'prog* 'co1special-fix-decl 'co1special) +- +-(defun co1special-fix-decl (f args) +- (flet ((fixup (forms &aux decls ) +- (block nil +- (tagbody +- top +- (or (consp forms) (go end)) +- (let ((tem (car forms))) +- (if (and (consp tem) +- (setq tem (cmp-macroexpand tem)) +- (eq (car tem) 'declare)) +- (progn (push tem decls) (pop forms)) +- (go end))) +- (go top) +- ; all decls made explicit. +- end +- (return (nconc (nreverse decls) forms)))))) +- (c1expr +- (cmp-macroexpand +- (case f +- ((do do*) `(,f ,(car args) +- ,(second args) +- ,@ (fixup (cddr args)))) +- ((prog prog*) +- `(,f ,(car args) +- ,@ (fixup (cdr args))))))))) + (si::putprop 'sublis 'co1sublis 'co1) + (defun co1sublis (f args &aux test) f + (and (case (length args) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpinline.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpinline.lsp +@@ -465,7 +465,7 @@ + (t . INLINE))) + + (defun inline-type (type) +- (or (cdr (assoc type *inline-types*)) 'inline)) ++ (or (cdr (assoc type *inline-types* :test 'eq)) 'inline)) + + (defun get-inline-info (fname args return-type &aux x ii) + (and (fast-link-proclaimed-type-p fname args) +--- gcl-2.6.12.orig/cmpnew/gcl_cmplam.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmplam.lsp +@@ -475,9 +475,9 @@ + (*unwind-exit* *unwind-exit*) + (*ccb-vs* *ccb-vs*)) + (when rest +- (wt-nl "vs_top[0]=Cnil;") +- (wt-nl "{object *p=vs_top, *q=vs_base+" (length optionals) ";") +- (wt-nl " for(;p>q;p--)p[-1]=MMcons(p[-1],p[0]);}")) ++ (wt-nl "{object *q=vs_base+" (length optionals) ",*l;") ++ (wt-nl " for (l=q;qc.c_cdr) *l=MMcons(*q,Cnil);") ++ (wt-nl " *l=Cnil;}")) + (do ((opts optionals (cdr opts))) + ((endp opts)) + (declare (object opts)) +@@ -510,11 +510,11 @@ + + (wt-label label))) + (rest +- (wt-nl "vs_top[0]=Cnil;") +- (wt-nl "{object *p=vs_top;") +- (wt-nl " for(;p>vs_base;p--)p[-1]=" ++ (wt-nl "{object *q=vs_base,*l;") ++ (wt-nl " for (l=q;qc.c_cdr) *l=" + (if *rest-on-stack* "ON_STACK_CONS" "MMcons") +- "(p[-1],p[0]);}") ++ "(*q,Cnil);") ++ (wt-nl " *l=Cnil;}") + (c2bind rest) + (wt-nl) + (reset-top)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmulti.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmulti.lsp +@@ -108,22 +108,11 @@ + (unwind-exit 'fun-val nil (if top-data (car top-data))) + ) + +-(defun c1values (args &aux (info (make-info))) +- (cond ((and args (not (cdr args)) +- (or (not (consp (car args))) +- (and (symbolp (caar args)) +- (let ((tem (get-return-type (caar args)))) +- (and tem +- (or (atom tem) +- (and (consp tem) +- (null (cdr tem)) +- (not (eq '* (car tem)))))))))) +- ;;the compiler put in unnecessary code +- ;;if we just had say (values nil) +- ;; so if we know there's one value only: +- (c1expr (car args))) +- (t (setq args (c1args args info)) +- (list 'values info args)))) ++(defun c1values (args &aux (info (make-info))(s (si::sgen "VALUES"))) ++ (cond ((and args (not (cdr args))) ++ (c1expr `(let ((,s ,(car args))) ,s))) ++ (t (setq args (c1args args info)) ++ (list 'values info args)))) + + (defun c2values (forms &aux (base *vs*) (*vs* *vs*)) + (cond ((and (eq *value-to-go* 'return-object) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpopt.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpopt.lsp +@@ -66,6 +66,10 @@ + (push '((t) boolean #.(flags)"type_of(#0)==t_longfloat") + (get 'long-float-p 'inline-always)) + ++;;COMPLEX-P ++ (push '((t) boolean #.(flags)"type_of(#0)==t_complex") ++ (get 'si::complexp 'inline-always)) ++ + ;;SFEOF + (push '((object) boolean #.(flags set)"(gcl_feof((#0)->sm.sm_fp))") + (get 'sfeof 'inline-unsafe)) +@@ -479,21 +483,56 @@ + (get 'array-total-size 'inline-unsafe)) + + ;;ARRAYP +- (push '((t) boolean #.(flags) +- "@0;type_of(#0)==t_array|| +-type_of(#0)==t_vector|| +-type_of(#0)==t_string|| +-type_of(#0)==t_bitvector") +- (get 'arrayp 'inline-always)) ++;; (push '((t) boolean #.(flags) ++;; "@0;type_of(#0)==t_array|| ++;; type_of(#0)==t_vector|| ++;; type_of(#0)==t_string|| ++;; type_of(#0)==t_bitvector") ++;; (get 'arrayp 'inline-always)) + + ;;ATOM +- (push '((t) boolean #.(flags)"type_of(#0)!=t_cons") ++ (push '((t) boolean #.(flags)"atom(#0)") + (get 'atom 'inline-always)) + + ;;BIT-VECTOR-P + (push '((t) boolean #.(flags)"(type_of(#0)==t_bitvector)") + (get 'bit-vector-p 'inline-always)) + ++;;BIT-VECTOR-P ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_bitvector)") ++ (get 'bit-vector-p 'inline-always)) ++ ++;;HASH-TABLE-P ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_hashtable)") ++ (get 'hash-table-p 'inline-always)) ++ ++;;RANDOM-STATE-P ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_random)") ++ (get 'random-state-p 'inline-always)) ++ ++;;RANDOM-STATE-P ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_random)") ++ (get 'random-state-p 'inline-always)) ++ ++;;PACKAGEP ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_package)") ++ (get 'packagep 'inline-always)) ++ ++;;STREAMP ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_stream)") ++ (get 'streamp 'inline-always)) ++ ++;;READTABLEP ++ (push '((t) boolean #.(flags)"(type_of(#0)==t_readtable)") ++ (get 'readtablep 'inline-always)) ++ ++;;COMPOUND PREDICATES ++(dolist (l '(integerp rationalp floatp realp numberp vectorp arrayp compiled-function-p)) ++ (push ++ `((t) boolean #.(flags) ,(substitute #\_ #\- (concatenate 'string (string-downcase l) "(#0)"))) ++ (get l 'inline-always))) ++ ++ + ;;BOUNDP + (push '((t) boolean #.(flags)"(#0)->s.s_dbind!=OBJNULL") + (get 'boundp 'inline-unsafe)) +@@ -739,7 +778,7 @@ type_of(#0)==t_bitvector") + (get 'cons 'inline-always)) + + ;;CONSP +- (push '((t) boolean #.(flags)"type_of(#0)==t_cons") ++ (push '((t) boolean #.(flags)"consp(#0)") + (get 'consp 'inline-always)) + + ;;COS +@@ -832,9 +871,9 @@ type_of(#0)==t_bitvector") + (get 'float 'inline-always)) + + ;;FLOATP +- (push '((t) boolean #.(flags) +- "@0;type_of(#0)==t_shortfloat||type_of(#0)==t_longfloat") +- (get 'floatp 'inline-always)) ++ ;; (push '((t) boolean #.(flags) ++ ;; "@0;type_of(#0)==t_shortfloat||type_of(#0)==t_longfloat") ++ ;; (get 'floatp 'inline-always)) + + ;;CEILING + (push '((t t) t #.(compiler::flags) "immnum_ceiling(#0,#1)") (get 'ceiling 'compiler::inline-always)) +@@ -861,9 +900,9 @@ type_of(#0)==t_bitvector") + (get 'get 'inline-always)) + + ;;INTEGERP +- (push '((t) boolean #.(flags) +- "@0;type_of(#0)==t_fixnum||type_of(#0)==t_bignum") +- (get 'integerp 'inline-always)) ++ ;; (push '((t) boolean #.(flags) ++ ;; "@0;type_of(#0)==t_fixnum||type_of(#0)==t_bignum") ++ ;; (get 'integerp 'inline-always)) + (push '((fixnum) boolean #.(flags) + "1") + (get 'integerp 'inline-always)) +@@ -940,7 +979,7 @@ type_of(#0)==t_bitvector") + (get 'list* 'inline-always)) + + ;;LISTP +- (push '((t) boolean #.(flags)"@0;type_of(#0)==t_cons||(#0)==Cnil") ++ (push '((t) boolean #.(flags)"listp(#0)") + (get 'listp 'inline-always)) + + ;;si::spice-p +@@ -1082,14 +1121,14 @@ type_of(#0)==t_bitvector") + (get 'null 'inline-always)) + + ;;NUMBERP +- (push '((t) boolean #.(flags) +- "@0;type_of(#0)==t_fixnum|| +-type_of(#0)==t_bignum|| +-type_of(#0)==t_ratio|| +-type_of(#0)==t_shortfloat|| +-type_of(#0)==t_longfloat|| +-type_of(#0)==t_complex") +- (get 'numberp 'inline-always)) ++;; (push '((t) boolean #.(flags) ++;; "@0;type_of(#0)==t_fixnum|| ++;; type_of(#0)==t_bignum|| ++;; type_of(#0)==t_ratio|| ++;; type_of(#0)==t_shortfloat|| ++;; type_of(#0)==t_longfloat|| ++;; type_of(#0)==t_complex") ++;; (get 'numberp 'inline-always)) + + ;;PLUSP + (push '((t) boolean #.(flags) "immnum_plusp(#0)");"number_compare(small_fixnum(0),#0)<0" +@@ -1175,7 +1214,7 @@ type_of(#0)==t_complex") + (get 'si::pathname-designatorp 'inline-always)) + + ;;PATHNAMEP +-(push '((t) boolean #.(flags)"pathnamep(#0)") ++(push '((t) boolean #.(flags)"type_of(#0)==t_pathname") + (get 'pathnamep 'inline-always)) + + ;;STRINGP +@@ -1235,11 +1274,11 @@ type_of(#0)==t_complex") + + + ;;VECTORP +- (push '((t) boolean #.(flags) +- "@0;type_of(#0)==t_vector|| +-type_of(#0)==t_string|| +-type_of(#0)==t_bitvector") +- (get 'vectorp 'inline-always)) ++;; (push '((t) boolean #.(flags) ++;; "@0;type_of(#0)==t_vector|| ++;; type_of(#0)==t_string|| ++;; type_of(#0)==t_bitvector") ++;; (get 'vectorp 'inline-always)) + + ;;WRITE-CHAR + (push '((t) t #.(flags set) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptop.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptop.lsp +@@ -135,7 +135,6 @@ + ;;; Pass 2 initializers. + + (si:putprop 'defun 't2defun 't2) +-(si:putprop 'defmacro 't2defmacro 't2) + (si:putprop 'declare 't2declare 't2) + (si:putprop 'defentry 't2defentry 't2) + (si:putprop 'si:putprop 't2putprop 't2) +@@ -143,7 +142,6 @@ + ;;; Pass 2 C function generators. + + (si:putprop 'defun 't3defun 't3) +-(si:putprop 'defmacro 't3defmacro 't3) + (si:putprop 'ordinary 't3ordinary 't3) + (si:putprop 'sharp-comma 't3sharp-comma 't3) + (si:putprop 'clines 't3clines 't3) +@@ -205,26 +203,20 @@ + (let ((new (copy-seq str))) + (dash-to-underscore-int new 0 (length new)))) + +-(defun init-name (p &optional sp (gp t) (dc t) (nt t)) + +- (cond ((not sp) "code") +- ((not (pathnamep p)) (init-name (pathname p) sp gp dc nt)) +- (gp (init-name (truename (merge-pathnames p #p".lsp")) sp nil dc nt)) +- ((pathname-type p) +- (init-name (make-pathname +- :host (pathname-host p) +- :device (pathname-device p) +- :directory (pathname-directory p) +- :name (pathname-name p) +- :version (pathname-version p)) sp gp dc nt)) +-; #-aosvs(dc (string-downcase (init-name p sp gp nil nt))) +- ((and nt +- (let* ((pn (pathname-name p)) +- (pp (make-pathname :name pn))) +- (and (not (equal pp p)) +- (eql 4 (string<= "gcl_" pn)) +- (init-name pp sp gp dc nil))))) +- ((dash-to-underscore (namestring p))))) ++(defun init-name (p &optional sp) ++ ++ (if sp ++ (let* ((p (truename (merge-pathnames p #p".lsp"))) ++ (pn (pathname-name p)) ++ (g (zerop (si::string-match #v"^gcl_" pn)))) ++ (dash-to-underscore ++ (namestring ++ (make-pathname :host (unless g (pathname-host p)) ++ :device (unless g (pathname-device p)) ++ :directory (unless g (pathname-directory p)) ++ :name pn)))) ++ "code")) + + ;; FIXME consider making this a macro + (defun c-function-name (prefix num fname) +@@ -469,7 +461,7 @@ + (too-few-args 'defun 2 (length args))) + (cmpck (not (symbolp (car args))) + "The function name ~s is not a symbol." (car args)) +- (maybe-eval nil (cons 'defun args)) ++ (unless (macro-function (car args)) (maybe-eval nil (cons 'defun args))) + (tagbody + top + (setq *non-package-operation* t) +@@ -615,8 +607,9 @@ + (setq type (f-type (pop args)))))) + + +-(defun wt-if-proclaimed (fname cfun lambda-expr) +- (cond ((fast-link-proclaimed-type-p fname) ++(defun wt-if-proclaimed (fname cfun lambda-expr macro-p) ++ (cond (macro-p (add-init `(si::MM ',fname ,(add-address (c-function-name "LI" cfun fname))))) ++ ((fast-link-proclaimed-type-p fname) + (cond ((unless (member '* (get fname 'proclaimed-arg-types)) (assoc fname *inline-functions*)) + (add-init `(si::mfsfun ',fname ,(add-address (c-function-name "LI" cfun fname)) + ,(proclaimed-argd (get fname 'proclaimed-arg-types) +@@ -698,11 +691,11 @@ + (defun si::add-debug (fname x) + (si::putprop fname x 'si::debugger)) + +-(defun t3init-fun (fname cfun lambda-expr doc) ++(defun t3init-fun (fname cfun lambda-expr doc macro-p) + + (when doc (add-init `(si::putprop ',fname ,doc 'si::function-documentation))) + +- (cond ((wt-if-proclaimed fname cfun lambda-expr)) ++ (cond ((wt-if-proclaimed fname cfun lambda-expr macro-p)) + ((vararg-p fname) + (let ((keyp (ll-keywords-p (lambda-list lambda-expr)))) + ; (wt-h "static object LI" cfun "();") +@@ -724,6 +717,7 @@ + (add-init `(si::mf ',fname ,(add-address (c-function-name "" cfun fname))))))) + + (defun t3defun (fname cfun lambda-expr doc sp &aux inline-info ++ (macro-p (equal `(mflag ,fname) (cadr (member *current-form* *top-level-forms*)))) + (*current-form* (list 'defun fname)) + (*volatile* (volatile (second lambda-expr))) + *downward-closures*) +@@ -736,9 +730,9 @@ + (return (setq inline-info v)))) + + ;;; Add global entry information. +- (when (not (fast-link-proclaimed-type-p fname)) +- (push (list fname cfun (cadr inline-info) (caddr inline-info)) +- *global-entries*)) ++ (unless (or macro-p (fast-link-proclaimed-type-p fname)) ++ (push (list fname cfun (cadr inline-info) (caddr inline-info)) ++ *global-entries*)) + + ;;; Local entry + (analyze-regs (cadr lambda-expr) 0) +@@ -761,7 +755,7 @@ + + (wt-downward-closure-macro cfun) + +- (t3init-fun fname cfun lambda-expr doc) ++ (t3init-fun fname cfun lambda-expr doc macro-p) + + (add-debug-info fname lambda-expr)) + +@@ -1333,63 +1327,13 @@ + (long-float "double ") + (otherwise "object "))) + +- +-(defun t1defmacro (args) +- (when (or (endp args) (endp (cdr args))) +- (too-few-args 'defmacro 2 (length args))) +- (cmpck (not (symbolp (car args))) +- "The macro name ~s is not a symbol." (car args)) +- (maybe-eval t (cons 'defmacro args)) +- (setq *non-package-operation* t) +- (let ((*vars* nil) (*funs* nil) (*blocks* nil) (*tags* nil) +- (*sharp-commas* nil) (*special-binding* nil) +- macro-lambda (cfun (next-cfun))) +- (setq macro-lambda (c1dm (car args) (cadr args) (cddr args))) +- (add-load-time-sharp-comma) +- (push (list 'defmacro (car args) cfun (cddr macro-lambda) +- (car macro-lambda) ;doc +- (cadr macro-lambda) ; ppn +- *special-binding*) +- *top-level-forms*)) +- ) +- +- +-(defun t2defmacro (fname cfun macro-lambda doc ppn sp) +- +- (declare (ignore macro-lambda doc ppn sp)) +- (wt-h "static void " (c-function-name "L" cfun fname) "();") +- ) +- +-(defun t3defmacro (fname cfun macro-lambda doc ppn sp +- &aux (*volatile* (if (get fname 'contains-setjmp) +- " VOL " ""))) +- (let-pass3 +- ((*exit* 'return)) +- (wt-comment "macro definition for " fname) +- (wt-nl1 "static void " (c-function-name "L" cfun fname) "()") +- (wt-nl1 "{register object *" *volatile* "base=vs_base;") +- (assign-down-vars (nth 4 macro-lambda) cfun ;*dm-info* +- 't3defun) +- (wt-nl "register object *"*volatile* "sup=base+VM" *reservation-cmacro* ";") +- (wt " VC" *reservation-cmacro*) +- (if *safe-compile* +- (wt-nl "vs_reserve(VM" *reservation-cmacro* ");") +- (wt-nl "vs_check;")) +- (when sp (wt-nl "bds_check;")) +- (when *compiler-push-events* (wt-nl "ihs_check;")) +- (c2dm (car macro-lambda) (cadr macro-lambda) (caddr macro-lambda) +- (cadddr macro-lambda)) +- (wt-nl1 "}") +- (push (cons *reservation-cmacro* *max-vs*) *reservations*) +- (wt-h "#define VC" *reservation-cmacro*) +- (wt-cvars) +- +- (when doc (add-init `(si::putprop ',fname ,doc 'si::function-documentation) )) +- (when ppn +- (add-init `(si::putprop ',fname ',ppn 'si::pretty-print-format) )) +- (add-init `(si::MM ',fname ,(add-address (c-function-name "L" cfun fname))) ) +- +- )) ++(defun t1defmacro (args &aux (w args)(n (pop args))(l (symbol-plist n)) ++ (macp (when (listp n) (eq 'macro (car n))))(n (if macp (cdr n) n))) ++ (proclaim `(ftype (function (t t) t) ,n)) ++ (maybe-eval (not (macro-function n)) (cons 'defmacro w));FIXME? ++ (t1expr `(defun ,n ,@(if macp args (cddr (caddr (si::defmacro* n (pop args) args)))))) ++ (setf (symbol-plist n) l) ++ (push `(mflag ,n) *top-level-forms*)) + + (defun t1ordinary (form &aux tem ) + (setq *non-package-operation* t) +--- gcl-2.6.12.orig/cmpnew/gcl_cmputil.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmputil.lsp +@@ -180,33 +180,27 @@ + (or (member-if (lambda (x) (when (consp x) (eq (car x) fname))) *funs*) + (macro-function fname)))) + +-(defun do-macro-expansion (how form &aux env) +- (dolist (v *funs*) ++(defun macro-env (&aux env) ++ (dolist (v *funs* (when env (list nil (nreverse env) nil))) + (when (consp v) +- (push (list (car v) 'macro (cadr v)) env))) +- (when env (setq env (list nil (nreverse env) nil))) +- (let ((x (multiple-value-list (cmp-toplevel-eval `(,@how ',form ',env))))) +- (if (car x) +- (let ((*print-case* :upcase)) +- (incf *error-count*) +- (print-current-form) +- (format t ";;; The macro form ~s was not expanded successfully.~%" form) +- `(error "Macro-expansion of ~s failed at compile time." ',form)) +- (cadr x)))) ++ (push (list (car v) 'macro (cadr v)) env)))) + + (defun cmp-macroexpand (form) + (if (macro-def-p form) +- (do-macro-expansion '(macroexpand) form) ++ (macroexpand form (macro-env)) + form)) + + (defun cmp-macroexpand-1 (form) + (if (macro-def-p form) +- (do-macro-expansion '(macroexpand-1) form) ++ (macroexpand-1 form (macro-env)) + form)) + + (defun cmp-expand-macro (fd fname args &aux (form (cons fname args))) + (if (macro-def-p form) +- (do-macro-expansion `(funcall *macroexpand-hook* ',fd) form) ++ (let ((env (macro-env))) ++ (if (eq *macroexpand-hook* 'funcall) ++ (funcall fd form env) ++ (funcall *macroexpand-hook* fd form env))) + form)) + + (defvar *compiler-break-enable* nil) +--- gcl-2.6.12.orig/cmpnew/sys-proclaim.lisp ++++ gcl-2.6.12/cmpnew/sys-proclaim.lisp +@@ -2,24 +2,116 @@ + (COMMON-LISP::IN-PACKAGE "COMPILER") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- COMPILER::MLIN)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ COMPILER::TAG-REF-CLB COMPILER::SET-TOP ++ COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C1LIST-NTH ++ COMPILER::C1RPLACA-NTHCDR COMPILER::C1DEFINE-STRUCTURE ++ COMPILER::BLK-REF-CLB COMPILER::WT-VV COMPILER::C1LENGTH ++ COMPILER::C1MAPC COMPILER::C1LOCAL-CLOSURE ++ COMPILER::CHECK-VREF COMPILER::WT-VAR-DECL COMPILER::C1TAGBODY ++ COMPILER::BLK-REF-CCB COMPILER::C1LOAD-TIME-VALUE ++ COMPILER::C1ASH COMPILER::FUN-LEVEL COMPILER::COPY-INFO ++ COMPILER::INLINE-POSSIBLE COMPILER::WT-VS-BASE ++ COMPILER::T1DEFENTRY COMPILER::CHARACTER-LOC-P ++ COMPILER::C2RPLACA COMPILER::RESET-INFO-TYPE ++ COMPILER::TYPE-FILTER COMPILER::TAG-SWITCH ++ COMPILER::DECL-BODY-SAFETY COMPILER::C1AND ++ COMPILER::C1FMLA-CONSTANT COMPILER::C2GO-CLB ++ COMPILER::C1FUNCTION COMPILER::C1MAPLIST COMPILER::VAR-TYPE ++ COMPILER::CLINK COMPILER::UNWIND-NO-EXIT COMPILER::VAR-LOC ++ COMPILER::C2RPLACD COMPILER::VERIFY-DATA-VECTOR ++ COMPILER::TAG-REF-CCB COMPILER::C1RETURN-FROM ++ COMPILER::T1DEFINE-STRUCTURE COMPILER::MDELETE-FILE ++ COMPILER::OBJECT-TYPE COMPILER::WT-CAR COMPILER::TAG-P ++ COMPILER::ADD-LOOP-REGISTERS COMPILER::C1MEMQ ++ COMPILER::C2FUNCTION COMPILER::CMP-MACRO-FUNCTION ++ COMPILER::C1BOOLE-CONDITION COMPILER::REP-TYPE COMPILER::C2GET ++ COMPILER::C2VAR COMPILER::C2EXPR* COMPILER::C1ADD-GLOBALS ++ COMPILER::WT1 COMPILER::C1BLOCK COMPILER::C1MAPL ++ COMPILER::C1MAPCAR COMPILER::FSET-FN-NAME COMPILER::C2GO-CCB ++ COMPILER::T1DEFLA COMPILER::C1NTH-CONDITION ++ COMPILER::ADD-OBJECT2 COMPILER::VAR-NAME COMPILER::C1EXPR ++ COMPILER::FUN-REF COMPILER::SCH-LOCAL-FUN ++ COMPILER::FIXNUM-LOC-P COMPILER::BLK-VAR ++ COMPILER::C1UNWIND-PROTECT COMPILER::C2BIND ++ COMPILER::PARSE-CVSPECS COMPILER::C1NTH ++ COMPILER::WT-SWITCH-CASE SYSTEM::UNDEF-COMPILER-MACRO ++ COMPILER::SET-UP-VAR-CVS COMPILER::C1ECASE ++ COMPILER::C1STRUCTURE-REF COMPILER::FUN-INFO ++ COMPILER::C1MEMBER COMPILER::C1GET COMPILER::WT-FUNCTION-LINK ++ COMPILER::C1ASH-CONDITION COMPILER::WT-CCB-VS COMPILER::INFO-P ++ COMPILER::REGISTER COMPILER::TAG-VAR COMPILER::C1VAR ++ COMPILER::C1TERPRI COMPILER::LTVP ++ COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::C1MAPCON ++ COMPILER::PUSH-ARGS-LISPCALL COMPILER::C1SETQ ++ COMPILER::C2DOWNWARD-FUNCTION COMPILER::T3ORDINARY ++ COMPILER::C1VREF COMPILER::WT-VS COMPILER::CONSTANT-FOLD-P ++ COMPILER::C1MULTIPLE-VALUE-PROG1 COMPILER::BLK-EXIT ++ COMPILER::T1DEFUN COMPILER::C1LABELS COMPILER::C1FSET ++ COMPILER::T1MACROLET COMPILER::FUN-NAME COMPILER::C1APPLY ++ COMPILER::FUN-P COMPILER::WT-DATA-PACKAGE-OPERATION ++ COMPILER::C1FUNOB COMPILER::WT-SYMBOL-FUNCTION ++ COMPILER::GET-RETURN-TYPE COMPILER::ADD-CONSTANT ++ COMPILER::SAFE-SYSTEM COMPILER::BLK-VALUE-TO-GO ++ COMPILER::NEED-TO-SET-VS-POINTERS COMPILER::C2TAGBODY-LOCAL ++ COMPILER::C1DECLARE COMPILER::C1OR COMPILER::C1ASSOC ++ COMPILER::ADD-ADDRESS COMPILER::VAR-KIND ++ COMPILER::PROCLAMATION COMPILER::FIX-OPT COMPILER::WT-DATA1 ++ COMPILER::INFO-SP-CHANGE COMPILER::ARGS-CAUSE-SIDE-EFFECT ++ COMPILER::WRITE-BLOCK-OPEN COMPILER::C2TAGBODY-BODY ++ COMPILER::CONS-TO-LISTA COMPILER::SAVE-FUNOB COMPILER::VAR-REF ++ COMPILER::C1LOCAL-FUN COMPILER::VAR-REP-LOC ++ COMPILER::SET-PUSH-CATCH-FRAME COMPILER::CTOP-WRITE ++ COMPILER::C2TAGBODY-CLB COMPILER::T1CLINES ++ COMPILER::ADD-OBJECT COMPILER::GET-LOCAL-RETURN-TYPE ++ COMPILER::DEFAULT-INIT COMPILER::FUNCTION-ARG-TYPES ++ COMPILER::C1STRUCTURE-SET COMPILER::CMP-MACROEXPAND-1 ++ COMPILER::INLINE-TYPE COMPILER::VAR-REGISTER ++ COMPILER::DECLARATION-TYPE COMPILER::C1CATCH COMPILER::C1LET ++ COMPILER::T3CLINES COMPILER::UNDEFINED-VARIABLE COMPILER::C1GO ++ COMPILER::TAG-NAME COMPILER::SCH-GLOBAL COMPILER::C1IF ++ COMPILER::C1FLET COMPILER::INLINE-BOOLE3-STRING ++ COMPILER::INFO-CHANGED-ARRAY COMPILER::C2FUNCALL-AUX ++ COMPILER::FUN-REF-CCB COMPILER::WT-CADR COMPILER::FUN-CFUN ++ COMPILER::WT-VS* COMPILER::WT-DOWN COMPILER::C2GETHASH ++ COMPILER::ADD-REG1 COMPILER::REPLACE-CONSTANT ++ COMPILER::C2DM-RESERVE-V COMPILER::RESULT-TYPE ++ COMPILER::C1FUNCALL COMPILER::C1THE COMPILER::VARARG-P ++ COMPILER::INFO-REFERRED-ARRAY COMPILER::C1PROGV ++ COMPILER::T2DECLARE COMPILER::T1DEFCFUN COMPILER::C2VALUES ++ COMPILER::C1SWITCH COMPILER::C1MAPCAN ++ COMPILER::CMP-MACROEXPAND COMPILER::TAG-LABEL ++ COMPILER::TAG-UNWIND-EXIT COMPILER::C1PRINC COMPILER::C1THROW ++ COMPILER::SAVE-AVMA COMPILER::VOLATILE COMPILER::FLAGS-POS ++ COMPILER::INFO-TYPE COMPILER::C1NTHCDR-CONDITION ++ COMPILER::C1MULTIPLE-VALUE-SETQ COMPILER::WT-FUNCALL-C ++ COMPILER::PUSH-ARGS COMPILER::C1DM-BAD-KEY ++ COMPILER::T1ORDINARY COMPILER::C1PSETQ COMPILER::BLK-REF ++ COMPILER::C2DM-RESERVE-VL COMPILER::C1MACROLET ++ COMPILER::C1SHARP-COMMA COMPILER::C1RPLACA ++ COMMON-LISP::PROCLAIM COMPILER::PUSH-DATA-INCF ++ COMPILER::MACRO-DEF-P COMPILER::BLK-NAME COMPILER::C1VALUES ++ COMPILER::C1DOWNWARD-FUNCTION COMPILER::T1DEFMACRO ++ COMPILER::GET-ARG-TYPES COMPILER::ADD-SYMBOL ++ COMPILER::NAME-SD1 COMPILER::C2GO-LOCAL ++ COMPILER::C2TAGBODY-CCB COMPILER::WT-LIST ++ COMPILER::GET-LOCAL-ARG-TYPES COMPILER::C1BOOLE3 ++ COMPILER::C1STACK-LET COMPILER::WT-CDR COMPILER::C1QUOTE ++ COMPILER::C1EVAL-WHEN COMPILER::VAR-P COMPILER::CHECK-DOWNWARD ++ COMPILER::T1PROGN COMPILER::BLK-P COMPILER::C2LOCATION ++ COMPILER::THE-PARAMETER COMPILER::C2VAR-KIND ++ COMPILER::C1GETHASH COMPILER::LTVP-EVAL COMPILER::C1RPLACD ++ COMPILER::INFO-VOLATILE COMPILER::LONG-FLOAT-LOC-P ++ COMPILER::FUNCTION-RETURN-TYPE COMPILER::SHORT-FLOAT-LOC-P ++ COMPILER::WT-H1 COMPILER::C1MULTIPLE-VALUE-CALL ++ COMPILER::NAME-TO-SD COMPILER::C1PROGN COMPILER::SET-RETURN ++ COMPILER::C1LET* COMPILER::AET-C-TYPE COMPILER::C1COMPILER-LET ++ COMPILER::MAXARGS COMPILER::VAR-REF-CCB COMPILER::VV-STR ++ COMPILER::C1NTHCDR COMPILER::TAG-REF COMPILER::GET-INCLUDED)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- COMPILER::DASH-TO-UNDERSCORE-INT)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ COMPILER::INLINE-BOOLE3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -29,332 +121,93 @@ + COMPILER::TS COMPILER::DASH-TO-UNDERSCORE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- COMPILER::C1NIL COMPILER::WT-DATA-FILE +- COMPILER::CLOSE-INLINE-BLOCKS COMPILER::WT-NEXT-VAR-ARG +- COMPILER::RESET-TOP COMPILER::VS-PUSH COMPILER::BABOON +- COMPILER::GAZONK-NAME COMPILER::PRINT-COMPILER-INFO +- COMPILER::ADD-LOAD-TIME-SHARP-COMMA COMPILER::INIT-ENV +- COMPILER::PRINT-CURRENT-FORM COMPILER::WT-C-PUSH COMPILER::C1T +- COMPILER::WT-FIRST-VAR-ARG COMPILER::CCB-VS-PUSH +- COMPILER::INC-INLINE-BLOCKS COMPILER::WT-CVARS +- COMPILER::WT-FASD-DATA-FILE COMPILER::WFS-ERROR +- COMPILER::WT-DATA-END COMPILER::TAIL-RECURSION-POSSIBLE +- COMPILER::CVS-PUSH COMPILER::WT-DATA-BEGIN)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::ANALYZE-REGS1 COMPILER::ANALYZE-REGS +- COMPILER::PROCLAIMED-ARGD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::CHECK-FNAME-ARGS COMPILER::COERCE-LOC +- COMPILER::TYPE>= COMPILER::C2BIND-LOC +- COMPILER::RESULT-TYPE-FROM-ARGS COMPILER::ADD-DEBUG-INFO +- COMPILER::MAKE-USER-INIT COMPILER::CO1EQL COMPILER::C2ASSOC!2 +- COMPILER::WT-VAR COMPILER::CFAST-WRITE COMPILER::C2STACK-LET +- COMPILER::C2DM-BIND-INIT COMPILER::IS-REP-REFERRED +- COMPILER::CO1CONS COMPILER::SHIFT<< +- COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::C2CALL-LOCAL +- COMPILER::CO1SCHAR COMPILER::C1CONSTANT-VALUE +- COMPILER::WT-CHARACTER-VALUE COMPILER::CONVERT-CASE-TO-SWITCH +- COMPILER::C2MULTIPLE-VALUE-CALL COMPILER::C2EXPR-TOP +- COMPILER::CO1READ-BYTE COMPILER::PRIN1-CMP +- COMPILER::STRUCT-TYPE-OPT COMPILER::C1DECL-BODY +- COMPILER::COERCE-LOC-STRUCTURE-REF +- COMPILER::CO1STRUCTURE-PREDICATE COMPILER::WT-MAKE-DCLOSURE +- COMPILER::ARGS-INFO-CHANGED-VARS +- COMPILER::C2LIST-NTH-IMMEDIATE COMPILER::CO1LDB +- COMPILER::CO1WRITE-BYTE COMPILER::C1PROGN* +- COMPILER::CO1CONSTANT-FOLD COMPILER::SET-JUMP-TRUE +- COMPILER::C1SETQ1 COMPILER::CO1READ-CHAR COMPILER::C2BIND-INIT +- COMPILER::CO1TYPEP COMPILER::WT-FIXNUM-VALUE +- COMPILER::MULTIPLE-VALUE-CHECK COMPILER::SHIFT>> +- COMPILER::CO1SUBLIS COMPILER::DO-MACRO-EXPANSION +- COMPILER::C2UNWIND-PROTECT COMPILER::C2CALL-LAMBDA +- COMPILER::C2MEMBER!2 COMPILER::GET-INLINE-LOC +- COMPILER::C1LAMBDA-FUN COMPILER::JUMPS-TO-P COMPILER::C1EXPR* +- COMPILER::C2SETQ COMPILER::C2APPLY COMPILER::UNWIND-BDS +- COMPILER::SET-BDS-BIND COMPILER::NEED-TO-PROTECT +- COMPILER::C1FMLA COMPILER::TYPE-AND COMPILER::CMPFIX-ARGS +- COMPILER::MAYBE-EVAL COMPILER::C2BLOCK-CLB COMPILER::SET-DBIND +- COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY +- COMPILER::WT-LONG-FLOAT-VALUE COMPILER::C2DM-BIND-VL +- COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::T3SHARP-COMMA +- COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES COMPILER::C2CATCH +- COMPILER::C2EXPR-TOP* COMPILER::SET-JUMP-FALSE +- COMPILER::CO1VECTOR-PUSH COMPILER::WT-V*-MACROS +- COMPILER::ARGS-INFO-REFERRED-VARS COMPILER::SET-VS +- COMPILER::WT-REQUIREDS COMPILER::C2RETURN-CCB +- COMPILER::C2THROW COMPILER::CHECK-END +- COMPILER::PUSH-CHANGED-VARS COMPILER::C2BLOCK-CCB +- SYSTEM::ADD-DEBUG COMPILER::C2PSETQ COMPILER::C1ARGS +- COMPILER::COMPILER-CC COMPILER::INLINE-PROC +- COMPILER::CO1WRITE-CHAR COMPILER::COMPILER-DEF-HOOK +- COMPILER::CAN-BE-REPLACED COMPILER::C2MULTIPLE-VALUE-PROG1 +- COMPILER::C2DM-BIND-LOC COMPILER::ADD-INFO +- COMPILER::CO1SPECIAL-FIX-DECL COMPILER::C2LAMBDA-EXPR-WITH-KEY +- COMPILER::FAST-READ COMPILER::C2RETURN-CLB +- COMPILER::PROCLAIM-VAR)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMPILER::COMPILE-FILE1)) ++ COMPILER::C2CALL-UNKNOWN-GLOBAL COMPILER::WT-IF-PROCLAIMED ++ COMPILER::MY-CALL COMPILER::WT-GLOBAL-ENTRY ++ COMPILER::T3DEFUN-NORMAL COMPILER::C2STRUCTURE-REF ++ COMPILER::C2SWITCH COMPILER::C2CALL-GLOBAL ++ COMPILER::T3DEFUN-VARARG COMPILER::C1MAKE-VAR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::MAKE-INLINE-STRING COMPILER::GET-INLINE-INFO +- COMPILER::C1STRUCTURE-REF1 COMPILER::CJF COMPILER::SET-VAR +- COMPILER::CHECK-FORM-TYPE COMPILER::AND-FORM-TYPE +- COMPILER::SUBLIS1-INLINE COMPILER::T3DEFCFUN +- COMPILER::WT-INLINE-INTEGER COMPILER::C-FUNCTION-NAME +- COMPILER::FIX-DOWN-ARGS COMPILER::ASSIGN-DOWN-VARS +- COMPILER::WT-INLINE-FIXNUM COMPILER::C2GO COMPILER::CJT +- COMPILER::TOO-FEW-ARGS COMPILER::C2PRINC COMPILER::C2CASE +- COMPILER::C2LET* COMPILER::BOOLE3 COMPILER::COMPILER-PASS2 +- COMPILER::C1DM COMPILER::CHECK-VDECL COMPILER::C2LET +- COMPILER::MYSUB COMPILER::CAN-BE-REPLACED* +- COMPILER::ADD-FUNCTION-PROCLAMATION COMPILER::WT-IF-PROCLAIMED +- COMPILER::C1MAP-FUNCTIONS COMPILER::ADD-FAST-LINK +- COMPILER::WT-INLINE-LONG-FLOAT COMPILER::TOO-MANY-ARGS +- COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2PROGV +- COMPILER::WT-INLINE-CHARACTER +- COMPILER::ADD-FUNCTION-DECLARATION COMPILER::CMP-EXPAND-MACRO +- COMPILER::C2MAPCAR COMPILER::INLINE-TYPE-MATCHES +- COMPILER::C2FUNCALL-SFUN COMPILER::WT-MAKE-CCLOSURE +- COMPILER::C2MAPCAN COMPILER::C2TAGBODY +- COMPILER::WT-INLINE-COND COMPILER::C2MAPC +- COMPILER::WT-INLINE-SHORT-FLOAT)) ++ COMPILER::LINK COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL ++ COMPILER::INLINE-ARGS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::T3LOCAL-FUN COMPILER::T3LOCAL-DCFUN)) ++ COMPILER::WT-INLINE-INTEGER COMPILER::ADD-FUNCTION-DECLARATION ++ COMPILER::C1STRUCTURE-REF1 COMPILER::ADD-FAST-LINK ++ COMPILER::AND-FORM-TYPE COMPILER::C2PRINC COMPILER::C2MAPCAN ++ COMPILER::CJT COMPILER::C2CASE COMPILER::WT-INLINE-LONG-FLOAT ++ COMPILER::SUBLIS1-INLINE COMPILER::MYSUB ++ COMPILER::ADD-FUNCTION-PROCLAMATION COMPILER::FIX-DOWN-ARGS ++ COMPILER::TOO-MANY-ARGS COMPILER::CMP-EXPAND-MACRO ++ COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2GO ++ COMPILER::WT-INLINE-FIXNUM COMPILER::WT-INLINE-COND ++ COMPILER::C1MAP-FUNCTIONS COMPILER::C1DM ++ COMPILER::WT-MAKE-CCLOSURE COMPILER::CAN-BE-REPLACED* ++ COMPILER::C-FUNCTION-NAME COMPILER::C2LET* COMPILER::CJF ++ COMPILER::TOO-FEW-ARGS COMPILER::BOOLE3 COMPILER::T3DEFCFUN ++ COMPILER::C2FUNCALL-SFUN COMPILER::C2MAPC ++ COMPILER::CHECK-FORM-TYPE COMPILER::SET-VAR ++ COMPILER::C2TAGBODY COMPILER::CHECK-VDECL ++ COMPILER::GET-INLINE-INFO COMPILER::ASSIGN-DOWN-VARS ++ COMPILER::C2LET COMPILER::INLINE-TYPE-MATCHES ++ COMPILER::COMPILER-PASS2 COMPILER::C2PROGV COMPILER::C2MAPCAR ++ COMPILER::MAKE-INLINE-STRING COMPILER::WT-INLINE-CHARACTER ++ COMPILER::WT-INLINE-SHORT-FLOAT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::T3DEFMACRO COMPILER::T3DEFENTRY COMPILER::T2DEFENTRY +- COMPILER::DEFSYSFUN COMPILER::T2DEFMACRO)) ++ COMPILER::T2DEFENTRY COMPILER::DEFSYSFUN COMPILER::T3DEFENTRY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::T3DEFUN COMPILER::T3DEFUN-LOCAL-ENTRY +- COMPILER::C2STRUCTURE-SET COMPILER::T2DEFUN ++ COMPILER::T3DEFUN-LOCAL-ENTRY COMPILER::T3INIT-FUN ++ COMPILER::T2DEFUN COMPILER::T3DEFUN COMPILER::C2STRUCTURE-SET + COMPILER::C1APPLY-OPTIMIZE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL +- COMPILER::INLINE-ARGS COMPILER::LINK)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- COMPILER::T3INIT-FUN COMPILER::C2STRUCTURE-REF +- COMPILER::WT-GLOBAL-ENTRY COMPILER::T3DEFUN-NORMAL +- COMPILER::T3DEFUN-VARARG COMPILER::C1MAKE-VAR +- COMPILER::C2SWITCH COMPILER::MY-CALL COMPILER::C2CALL-GLOBAL +- COMPILER::C2CALL-UNKNOWN-GLOBAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::*) + COMMON-LISP::T) + COMPILER::GET-OUTPUT-PATHNAME COMPILER::WT-SIMPLE-CALL)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(COMPILER::CMP-ANON COMMON-LISP::COMPILE COMPILER::CMP-TMP-MACRO +- COMMON-LISP::DISASSEMBLE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- COMPILER::MAKE-VAR COMPILER::COMPILER-COMMAND +- COMPILER::LIST*-INLINE COMMON-LISP::COMPILE-FILE +- COMPILER::CS-PUSH COMPILER::MAKE-INFO COMPILER::FCALLN-INLINE +- COMPILER::C2FSET COMPILER::MAKE-TAG COMPILER::WT-CLINK +- COMPILER::LIST-INLINE COMPILER::MAKE-FUN COMPILER::MAKE-BLK)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- COMPILER::T1EVAL-WHEN COMPILER::T1EXPR +- COMPILER::WT-CHARACTER-LOC COMPILER::SET-LOC +- COMPILER::CMP-TOPLEVEL-EVAL COMPILER::C2PROGN +- COMPILER::WT-TO-STRING COMPILER::MEXPAND-DEFTYPE +- COMPILER::WT-SHORT-FLOAT-LOC COMPILER::CMP-EVAL +- COMPILER::WT-LOC COMPILER::C2AND COMPILER::C2EXPR +- COMPILER::WT-LONG-FLOAT-LOC COMPILER::C2OR +- COMPILER::WT-FIXNUM-LOC)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- COMPILER::LTVP-EVAL COMPILER::FSET-FN-NAME COMPILER::C1MAPCON +- COMPILER::FUNCTION-ARG-TYPES COMPILER::C1SHARP-COMMA +- COMPILER::SAVE-AVMA COMPILER::C2TAGBODY-CCB COMPILER::VAR-LOC +- COMPILER::WT-DOWN COMPILER::C1SETQ COMPILER::TAG-REF-CCB +- COMPILER::T1DEFINE-STRUCTURE COMPILER::SAVE-FUNOB +- COMPILER::C1VAR COMPILER::VV-STR COMPILER::C1RPLACA +- COMPILER::INFO-SP-CHANGE COMPILER::BLK-REF-CCB +- COMPILER::T1ORDINARY COMPILER::FIXNUM-LOC-P +- COMPILER::FUN-REF-CCB COMPILER::C2GET COMPILER::FUN-NAME +- COMPILER::FUN-P COMPILER::SCH-GLOBAL COMPILER::C1LET +- COMPILER::C2TAGBODY-CLB COMPILER::C1UNWIND-PROTECT +- COMPILER::SET-RETURN COMPILER::WT-VAR-DECL +- COMPILER::VAR-REGISTER COMPILER::C1DEFINE-STRUCTURE +- COMPILER::LTVP COMPILER::INLINE-POSSIBLE COMPILER::CHECK-VREF +- COMPILER::TAG-NAME COMPILER::C2DM-RESERVE-VL +- COMPILER::VAR-TYPE COMPILER::WT-LIST COMPILER::C1LET* +- COMPILER::VARARG-P COMPILER::C1LOAD-TIME-VALUE +- COMPILER::C2FUNCALL-AUX COMPILER::INFO-TYPE COMPILER::C1GET +- COMPILER::C1NTHCDR-CONDITION COMPILER::C1AND +- COMPILER::C1MULTIPLE-VALUE-CALL COMPILER::C1RPLACA-NTHCDR +- COMPILER::INFO-VOLATILE COMPILER::INLINE-TYPE +- COMPILER::LONG-FLOAT-LOC-P COMPILER::INFO-CHANGED-ARRAY +- SYSTEM::UNDEF-COMPILER-MACRO COMPILER::DECL-BODY-SAFETY +- COMPILER::TAG-VAR COMPILER::CHARACTER-LOC-P COMPILER::C2BIND +- COMPILER::C1DECLARE COMPILER::CONS-TO-LISTA +- COMPILER::C1MULTIPLE-VALUE-SETQ COMPILER::NAME-SD1 +- COMPILER::BLK-NAME COMPILER::PARSE-CVSPECS COMPILER::C1MAPL +- COMPILER::AET-C-TYPE COMPILER::C2VAR COMPILER::COPY-INFO +- COMPILER::C1PSETQ COMPILER::C1VREF COMPILER::FUN-REF +- COMPILER::WT-H1 COMPILER::T1DEFCFUN COMPILER::T1PROGN +- COMPILER::C1EVAL-WHEN COMPILER::FLAGS-POS COMPILER::WT-VS +- COMPILER::C2VAR-KIND COMPILER::C1LENGTH +- COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C2LOCATION +- COMPILER::C2DM-RESERVE-V COMPILER::C2FUNCTION +- COMPILER::WT-SWITCH-CASE COMPILER::C2TAGBODY-LOCAL +- COMPILER::CONSTANT-FOLD-P COMPILER::NEED-TO-SET-VS-POINTERS +- COMPILER::C1MAPCAN COMPILER::WT-FUNCALL-C COMPILER::WT-CCB-VS +- COMPILER::C1RETURN-FROM COMPILER::GET-INCLUDED +- COMPILER::C1BLOCK COMPILER::ADD-CONSTANT COMPILER::WT-VS-BASE +- COMPILER::C1NTH-CONDITION COMPILER::FUN-LEVEL +- COMPILER::UNWIND-NO-EXIT COMMON-LISP::PROCLAIM +- COMPILER::C1PRINC COMPILER::C2EXPR* COMPILER::RESULT-TYPE +- COMPILER::TAG-REF COMPILER::C1FUNCALL COMPILER::C1PROGN +- COMPILER::MAXARGS COMPILER::UNDEFINED-VARIABLE COMPILER::C1THE +- COMPILER::CMP-MACROEXPAND COMPILER::C1MAPCAR +- COMPILER::DEFAULT-INIT COMPILER::C1STRUCTURE-SET +- COMPILER::WT-SYMBOL-FUNCTION COMPILER::T1DEFUN +- COMPILER::WT-DATA1 COMPILER::PUSH-DATA-INCF COMPILER::C1IF +- COMPILER::C1NTHCDR COMPILER::ADD-SYMBOL +- COMPILER::C1MULTIPLE-VALUE-PROG1 COMPILER::BLK-REF +- COMPILER::WT-FUNCTION-LINK COMPILER::INFO-P COMPILER::C1FSET +- COMPILER::C1PROGV COMPILER::C1ASSOC COMPILER::VAR-REF +- COMPILER::ARGS-CAUSE-SIDE-EFFECT COMPILER::MDELETE-FILE +- COMPILER::CMP-MACRO-FUNCTION COMPILER::C2DOWNWARD-FUNCTION +- COMPILER::C2GO-LOCAL COMPILER::T1DEFLA COMPILER::VAR-REF-CCB +- COMPILER::C1FLET COMPILER::C1LIST-NTH +- COMPILER::ADD-LOOP-REGISTERS COMPILER::INFO-REFERRED-ARRAY +- COMPILER::BLK-VALUE-TO-GO COMPILER::WT-VS* +- COMPILER::NAME-TO-SD COMPILER::C1RPLACD +- COMPILER::WT-DATA-PACKAGE-OPERATION COMPILER::C1SWITCH +- COMPILER::C1CATCH COMPILER::WT-CAR COMPILER::C1MACROLET +- COMPILER::OBJECT-TYPE COMPILER::C1MAPC COMPILER::T1CLINES +- COMPILER::C1COMPILER-LET COMPILER::CMP-MACROEXPAND-1 +- COMPILER::C1TAGBODY COMPILER::C1MAPLIST COMPILER::PUSH-ARGS +- COMPILER::T3ORDINARY COMPILER::C1MEMBER COMPILER::T1MACROLET +- COMPILER::WT-CDR COMPILER::C1BOOLE3 COMPILER::PROCLAMATION +- COMPILER::GET-LOCAL-RETURN-TYPE COMPILER::C1LOCAL-FUN +- COMPILER::VAR-KIND COMPILER::WT1 COMPILER::TAG-SWITCH +- COMPILER::C1OR COMPILER::C1STRUCTURE-REF +- COMPILER::THE-PARAMETER COMPILER::VAR-REP-LOC +- COMPILER::DECLARATION-TYPE COMPILER::TAG-P COMPILER::C2GETHASH +- COMPILER::C1EXPR COMPILER::REPLACE-CONSTANT COMPILER::C1ECASE +- COMPILER::FUN-CFUN COMPILER::SET-TOP COMPILER::TAG-LABEL +- COMPILER::C1DM-BAD-KEY COMPILER::C1THROW COMPILER::C2GO-CCB +- COMPILER::REP-TYPE COMPILER::C2VALUES +- COMPILER::SHORT-FLOAT-LOC-P COMPILER::FUNCTION-RETURN-TYPE +- COMPILER::ADD-OBJECT COMPILER::CTOP-WRITE COMPILER::C1MEMQ +- COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::C1TERPRI +- COMPILER::T1DEFMACRO COMPILER::T3CLINES COMPILER::ADD-REG1 +- COMPILER::C1NTH COMPILER::C1ASH COMPILER::C1FMLA-CONSTANT +- COMPILER::C2GO-CLB COMPILER::WT-CADR +- COMPILER::C1BOOLE-CONDITION COMPILER::CLINK COMPILER::VAR-NAME +- COMPILER::PUSH-ARGS-LISPCALL COMPILER::GET-ARG-TYPES +- COMPILER::BLK-VAR COMPILER::C1APPLY COMPILER::CHECK-DOWNWARD +- COMPILER::C1QUOTE COMPILER::TAG-REF-CLB +- COMPILER::GET-LOCAL-ARG-TYPES COMPILER::REGISTER +- COMPILER::BLK-P COMPILER::FUN-INFO COMPILER::C2RPLACD +- COMPILER::ADD-OBJECT2 COMPILER::C2TAGBODY-BODY +- COMPILER::T1DEFENTRY COMPILER::C1FUNCTION +- COMPILER::C1DOWNWARD-FUNCTION COMPILER::SAFE-SYSTEM +- COMPILER::C1GO COMPILER::BLK-EXIT COMPILER::VERIFY-DATA-VECTOR +- COMPILER::C2RPLACA COMPILER::T2DECLARE COMPILER::MACRO-DEF-P +- COMPILER::C1LABELS COMPILER::C1GETHASH COMPILER::FIX-OPT +- COMPILER::SCH-LOCAL-FUN COMPILER::C1FUNOB +- COMPILER::SET-PUSH-CATCH-FRAME COMPILER::GET-RETURN-TYPE +- COMPILER::SET-UP-VAR-CVS COMPILER::TAG-UNWIND-EXIT +- COMPILER::VAR-P COMPILER::C1ADD-GLOBALS COMPILER::TYPE-FILTER +- COMPILER::WT-VV COMPILER::C1ASH-CONDITION COMPILER::VOLATILE +- COMPILER::INLINE-BOOLE3-STRING COMPILER::C1LOCAL-CLOSURE +- COMPILER::WRITE-BLOCK-OPEN COMPILER::ADD-ADDRESS +- COMPILER::RESET-INFO-TYPE COMPILER::C1VALUES +- COMPILER::BLK-REF-CLB COMPILER::C1STACK-LET)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- COMPILER::INLINE-BOOLE3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- COMPILER::MEMOIZED-HASH-EQUAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- COMPILER::WT-INLINE-LOC COMPILER::NCONC-FILES +- COMPILER::COMPILER-BUILD COMPILER::C2BLOCK-LOCAL +- COMPILER::C2DECL-BODY COMPILER::C1SYMBOL-FUN COMPILER::C2BLOCK +- COMPILER::C1BODY COMPILER::C2RETURN-LOCAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::C1LAMBDA-EXPR COMPILER::CMPWARN COMPILER::ADD-INIT +- COMPILER::UNWIND-EXIT COMPILER::CMPNOTE COMPILER::CMPERR +- COMPILER::C1CASE COMPILER::WT-COMMENT COMPILER::INIT-NAME +- COMPILER::FAST-LINK-PROCLAIMED-TYPE-P COMPILER::WT-INTEGER-LOC +- COMPILER::WT-CVAR)) ++ COMPILER::T3LOCAL-DCFUN COMPILER::T3LOCAL-FUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- COMPILER::C2IF COMPILER::WT-INLINE COMPILER::C2COMPILER-LET +- COMPILER::C2FLET COMPILER::C2LABELS)) ++ COMPILER::C2LABELS COMPILER::C2FLET COMPILER::C2IF ++ COMPILER::WT-INLINE COMPILER::C2COMPILER-LET)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::*) +- COMPILER::C2RETURN-FROM COMPILER::C2APPLY-OPTIMIZE +- COMPILER::C2DM COMPILER::C1DM-V COMPILER::C1DM-VL)) ++ COMPILER::C2RETURN-FROM COMPILER::C2DM COMPILER::C1DM-VL ++ COMPILER::C2APPLY-OPTIMIZE COMPILER::C1DM-V)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -363,6 +216,36 @@ + COMPILER::T3DEFUN-AUX)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ COMPILER::C2PROGN COMPILER::WT-LONG-FLOAT-LOC ++ COMPILER::WT-CHARACTER-LOC COMPILER::WT-TO-STRING ++ COMPILER::WT-LOC COMPILER::MEXPAND-DEFTYPE ++ COMPILER::CMP-TOPLEVEL-EVAL COMPILER::T1EVAL-WHEN ++ COMPILER::T1EXPR COMPILER::C2OR COMPILER::WT-FIXNUM-LOC ++ COMPILER::C2EXPR COMPILER::C2AND COMPILER::CMP-EVAL ++ COMPILER::SET-LOC COMPILER::WT-SHORT-FLOAT-LOC)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMPILER::MAKE-INFO COMPILER::FCALLN-INLINE ++ COMPILER::LIST-INLINE COMPILER::LIST*-INLINE ++ COMPILER::COMPILER-COMMAND COMPILER::MAKE-BLK ++ COMPILER::MAKE-FUN COMPILER::WT-CLINK COMPILER::C2FSET ++ COMPILER::MAKE-TAG COMPILER::CS-PUSH COMPILER::MAKE-VAR ++ COMMON-LISP::COMPILE-FILE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ COMPILER::F-TYPE)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(COMMON-LISP::DISASSEMBLE COMPILER::CMP-TMP-MACRO ++ COMPILER::CMP-ANON COMMON-LISP::COMPILE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + ((COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*))) + COMMON-LISP::T) +@@ -374,11 +257,9 @@ + (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) + (COMMON-LISP::INTEGER -9223372036854775808 + 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) + COMMON-LISP::T) + COMMON-LISP::FIXNUM) +- COMPILER::BSEARCHLEQ)) ++ COMPILER::PUSH-ARRAY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -386,10 +267,148 @@ + (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) + (COMMON-LISP::INTEGER -9223372036854775808 + 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) + COMMON-LISP::T) + COMMON-LISP::FIXNUM) +- COMPILER::PUSH-ARRAY)) ++ COMPILER::BSEARCHLEQ)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- COMPILER::F-TYPE)) +\ No newline at end of file ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ COMPILER::DASH-TO-UNDERSCORE-INT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ COMPILER::MLIN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ COMPILER::MEMOIZED-HASH-EQUAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ COMPILER::MACRO-ENV COMPILER::C1T COMPILER::PRINT-CURRENT-FORM ++ COMPILER::CCB-VS-PUSH COMPILER::C1NIL ++ COMPILER::WT-FASD-DATA-FILE COMPILER::INIT-ENV ++ COMPILER::WT-CVARS COMPILER::CVS-PUSH ++ COMPILER::WT-FIRST-VAR-ARG COMPILER::WT-NEXT-VAR-ARG ++ COMPILER::WT-DATA-FILE COMPILER::WT-C-PUSH ++ COMPILER::GAZONK-NAME COMPILER::WT-DATA-END ++ COMPILER::INC-INLINE-BLOCKS COMPILER::TAIL-RECURSION-POSSIBLE ++ COMPILER::RESET-TOP COMPILER::CLOSE-INLINE-BLOCKS ++ COMPILER::PRINT-COMPILER-INFO COMPILER::WFS-ERROR ++ COMPILER::VS-PUSH COMPILER::BABOON COMPILER::WT-DATA-BEGIN ++ COMPILER::ADD-LOAD-TIME-SHARP-COMMA)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS1 ++ COMPILER::ANALYZE-REGS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMPILER::UNWIND-EXIT COMPILER::WT-COMMENT COMPILER::CMPERR ++ COMPILER::WT-CVAR COMPILER::FAST-LINK-PROCLAIMED-TYPE-P ++ COMPILER::C1CASE COMPILER::CMPWARN COMPILER::ADD-INIT ++ COMPILER::INIT-NAME COMPILER::WT-INTEGER-LOC COMPILER::CMPNOTE ++ COMPILER::C1LAMBDA-EXPR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::C2BLOCK COMPILER::C1SYMBOL-FUN ++ COMPILER::C2BLOCK-LOCAL COMPILER::C2DECL-BODY ++ COMPILER::COMPILER-BUILD COMPILER::NCONC-FILES ++ COMPILER::WT-INLINE-LOC COMPILER::C2RETURN-LOCAL ++ COMPILER::C1BODY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMPILER::WT-FIXNUM-VALUE COMPILER::DOLIST** COMPILER::CO1LDB ++ COMPILER::PUSH-REFERRED-WITH-START COMPILER::C2ASSOC!2 ++ COMPILER::ADD-DEBUG-INFO COMPILER::WT-CHARACTER-VALUE ++ COMPILER::MAYBE-WT-C2DM-BIND-VL COMPILER::C2BIND-LOC ++ COMPILER::C2CATCH COMPILER::DO-REFERRED COMPILER::C2BLOCK-CLB ++ COMPILER::CO1CONSTANT-FOLD COMPILER::C2CALL-LOCAL ++ COMPILER::SHIFT<< COMPILER::C2UNWIND-PROTECT ++ COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::C2DM-BIND-VL ++ COMPILER::DOTIMES* COMPILER::REFERRED-LENGTH COMPILER::C1ARGS ++ COMPILER::CK-SPEC COMPILER::C2MULTIPLE-VALUE-CALL ++ COMPILER::C2CALL-LAMBDA COMPILER::CO1READ-BYTE ++ COMPILER::CO1VECTOR-PUSH COMPILER::STACK-LET COMPILER::CMPCK ++ COMPILER::MAYBE-EVAL COMPILER::COERCE-LOC COMPILER::C2PSETQ ++ SYSTEM::DEFINE-INLINE-FUNCTION COMPILER::WT-MAKE-DCLOSURE ++ COMPILER::COMPILER-CC COMPILER::WT-GO COMPILER::C1LAMBDA-FUN ++ COMPILER::C2RETURN-CLB COMPILER::C1DECL-BODY ++ COMPILER::PUSH-CHANGED-VARS COMPILER::GET-INLINE-LOC ++ COMPILER::CO1SUBLIS COMPILER::CHANGED-LENGTH COMPILER::CO1CONS ++ COMPILER::ARGS-INFO-REFERRED-VARS COMPILER::SET-JUMP-FALSE ++ COMPILER::MAKE-USER-INIT COMPILER::NEXT-CVAR ++ COMPILER::CAN-BE-REPLACED COMPILER::WT-V*-MACROS ++ COMPILER::NEXT-CMACRO COMPILER::C2RETURN-CCB ++ COMPILER::CO1SCHAR COMPILER::IS-CHANGED ++ COMMON-LISP::DEFINE-COMPILER-MACRO COMPILER::SET-DBIND ++ COMPILER::WT-H COMPILER::COERCE-LOC-STRUCTURE-REF ++ COMPILER::C1EXPR* COMPILER::IS-REFERRED COMPILER::SHIFT>> ++ COMPILER::WT COMPILER::TYPE-AND COMPILER::PRIN1-CMP ++ COMPILER::C2BIND-INIT COMPILER::RESULT-TYPE-FROM-ARGS ++ COMPILER::EQL-NOT-NIL COMPILER::C2APPLY COMPILER::C2BLOCK-CCB ++ COMPILER::WT-NL1 COMPILER::CO1WRITE-CHAR COMPILER::CFAST-WRITE ++ COMPILER::NEED-TO-PROTECT COMPILER::T3SHARP-COMMA ++ SYSTEM::ADD-DEBUG COMPILER::BIGNUM-EXPANSION-STORAGE ++ COMPILER::C2SETQ COMPILER::FLAG-P ++ COMPILER::PUSH-CHANGED-WITH-START COMPILER::CMPFIX-ARGS ++ COMPILER::CO1STRUCTURE-PREDICATE COMPILER::FAST-READ ++ COMPILER::C1CONSTANT-VALUE COMPILER::BASE-USED ++ COMPILER::PROCLAIM-VAR COMPILER::CO1TYPEP ++ COMPILER::SET-JUMP-TRUE COMPILER::TYPE>= COMPILER::DOTIMES** ++ COMPILER::CONVERT-CASE-TO-SWITCH COMPILER::C2MEMBER!2 ++ COMPILER::DO-CHANGED COMPILER::ADD-INFO COMPILER::SET-VS ++ COMPILER::CHECK-FNAME-ARGS ++ COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES ++ COMPILER::C2MULTIPLE-VALUE-PROG1 COMPILER::NEXT-LABEL* ++ COMPILER::WT-VAR COMPILER::C2THROW COMPILER::INLINE-PROC ++ COMPILER::PUSH-REFERRED COMPILER::C2LIST-NTH-IMMEDIATE ++ COMPILER::C1FMLA COMPILER::PUSH-CHANGED ++ COMPILER::MULTIPLE-VALUE-CHECK COMPILER::MIA ++ COMPILER::WT-LABEL COMPILER::WT-NL ++ COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::SET-BDS-BIND ++ COMPILER::DO-ARRAY COMPILER::WT-REQUIREDS ++ COMPILER::C2EXPR-TOP* COMPILER::C2DM-BIND-LOC ++ COMPILER::DOLIST* SYSTEM::SWITCH-FINISH ++ COMPILER::IS-REP-REFERRED COMPILER::WT-LONG-FLOAT-VALUE ++ COMPILER::C1SETQ1 COMPILER::FLAGS COMPILER::CO1EQL ++ COMPILER::CHECK-END COMPILER::NEXT-LABEL COMPILER::CK-VL ++ COMPILER::ARGS-INFO-CHANGED-VARS COMPILER::C1PROGN* ++ COMPILER::C2DM-BIND-INIT COMPILER::STRUCT-TYPE-OPT ++ COMPILER::UNWIND-BDS COMPILER::SAFE-COMPILE ++ COMPILER::CO1READ-CHAR COMPILER::JUMPS-TO-P SYSTEM::SWITCH ++ COMPILER::NEXT-CFUN COMPILER::CO1WRITE-BYTE ++ COMPILER::DOWNWARD-FUNCTION COMPILER::COMPILER-DEF-HOOK ++ COMPILER::C2STACK-LET COMPILER::C2EXPR-TOP ++ COMPILER::C2LAMBDA-EXPR-WITH-KEY COMPILER::IN-ARRAY ++ COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMPILER::COMPILE-FILE1)) +\ No newline at end of file +--- gcl-2.6.12.orig/config.sub ++++ gcl-2.6.12/config.sub +@@ -1,8 +1,8 @@ + #! /bin/sh + # Configuration validation subroutine script. +-# Copyright 1992-2014 Free Software Foundation, Inc. ++# Copyright 1992-2015 Free Software Foundation, Inc. + +-timestamp='2014-05-01' ++timestamp='2015-08-20' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +@@ -25,7 +25,7 @@ timestamp='2014-05-01' + # of the GNU General Public License, version 3 ("GPLv3"). + + +-# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++# Please send patches to . + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. +@@ -68,7 +68,7 @@ Report bugs and patches to >32)-1; + a&=MASK(32); +- store_val(where,MASK(16),((void *)gote-(void *)got)); + if (s>=ggot && sr_addend=((void *)gote-(void *)got)-s; ++ switch(tp) { ++ case R_MIPS_GOT_HI16: ++ case R_MIPS_CALL_HI16: ++ r->r_info=((ul)R_MIPS_HI16<<56)|(r->r_info&MASK(32)); ++ relocate(sym1,r,((Rela *)r)->r_addend,start,got,gote); ++ break; ++ case R_MIPS_GOT_LO16: ++ case R_MIPS_CALL_LO16: ++ r->r_info=((ul)R_MIPS_LO16<<56)|(r->r_info&MASK(32)); ++ relocate(sym1,r,((Rela *)r)->r_addend,start,got,gote); ++ break; ++ default: ++ store_val(where,MASK(16),((void *)gote-(void *)got)); ++ break; ++ } + break; + case R_MIPS_GOT_OFST: + recurse(s+a); +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -108,6 +108,10 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) + if (ELF_R_TYPE(r->r_info)==R_MIPS_CALL16|| + ELF_R_TYPE(r->r_info)==R_MIPS_GOT_DISP|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_GOT_HI16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_GOT_LO16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_CALL_HI16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_CALL_LO16|| + ELF_R_TYPE(r->r_info)==R_MIPS_GOT_PAGE) { + + sym=sym1+ELF_R_SYM(r->r_info); +--- gcl-2.6.12.orig/h/lu.h ++++ gcl-2.6.12/h/lu.h +@@ -143,7 +143,7 @@ struct hashtable { + int ht_size; + short ht_test; + short ht_static; +- SPAD; ++ struct htent *ht_cache; + + }; + +@@ -290,6 +290,8 @@ struct random { + struct readtable { + FIRSTWORD; + struct rtent *rt_self; ++ object rt_case; ++ SPAD; + }; + + struct pathname { +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -373,3 +373,4 @@ typedef struct {void *a,*b,*c,*d;} gmp_r + EXTER gmp_randfnptr_t Mersenne_Twister_Generator_Noseed; + #endif + ++#define collect(p_,f_) (p_)=&(*(p_)=(f_))->c.c_cdr +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -249,6 +249,9 @@ struct freelist { + #define FL_LINK F_LINK + #define SET_LINK(x,val) F_LINK(x) = (address_int) (val) + #define OBJ_LINK(x) ((object) INT_TO_ADDRESS(F_LINK(x))) ++#define PHANTOM_FREELIST(x) ({struct freelist f;(object)((void *)&x+((void *)&f-(void *)&f.f_link));}) ++#define FREELIST_TAIL(tm_) ({struct typemanager *_tm=tm_;\ ++ _tm->tm_free==OBJNULL ? PHANTOM_FREELIST(_tm->tm_free) : _tm->tm_tail;}) + + #define FREE (-1) /* free object */ + +@@ -261,6 +264,8 @@ struct typemanager { + long tm_nppage; /* number per page */ + object tm_free; /* free list */ + /* Note that it is of type object. */ ++ object tm_tail; /* free list tail */ ++ /* Note that it is of type object. */ + long tm_nfree; /* number of free elements */ + long tm_npage; /* number of pages */ + long tm_maxpage; /* maximum number of pages */ +@@ -562,6 +567,9 @@ EXTER unsigned plong signals_allowed, si + /* #define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (!IMMNIL(_a)&&!IMMNIL(_b)&&equal1(_a,_b));}) */ + /* #define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b || (_a!=Cnil&&_b!=Cnil&&equalp1(_a,_b));}) */ + +-#define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (IMMNIL(_a)||IMMNIL(_b) ? FALSE : eql1(_a,_b));}) ++#define eql_is_eq(a_) (is_imm_fixnum(a_)||valid_cdr(a_)||(a_->d.t>t_complex)) ++ ++#define eql(a_,b_) ({register object _a=(a_);register object _b=(b_);\ ++ _a==_b ? TRUE : (eql_is_eq(_a)||eql_is_eq(_b)||_a->d.t!=_b->d.t ? FALSE : eql1(_a,_b));}) + #define equal(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (IMMNIL(_a)||IMMNIL(_b) ? FALSE : equal1(_a,_b));}) + #define equalp(a_,b_) ({register object _a=(a_);register object _b=(b_);_a==_b ? TRUE : (_a==Cnil||_b==Cnil ? FALSE : equalp1(_a,_b));}) +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1961,3 +1961,6 @@ do_gcl_abort(void); + + int + vsystem(const char *); ++ ++object ++n_cons_from_x(fixnum,object); +--- gcl-2.6.12.orig/h/type.h ++++ gcl-2.6.12/h/type.h +@@ -134,7 +134,7 @@ enum smmode { /* stream mode */ + #define fixnump(a_) SPP(a_,fixnum) + #define readtablep(a_) SPP(a_,readtable) + #define functionp(a_) ({enum type _t=type_of(a_);_t>=t_cfun && _t<=t_closure;}) +-#define compiled_functionp(a_) functionp(a_) ++#define compiled_function_p(a_) functionp(a_) + + #define integerp(a_) ({enum type _tp=type_of(a_); _tp >= t_fixnum && _tp <= t_bignum;}) + #define non_negative_integerp(a_) ({enum type _tp=type_of(a_); (_tp == t_fixnum && fix(a_)>=0) || (_tp==t_bignum && big_sign(a_)>=0);}) +--- gcl-2.6.12.orig/lsp/gcl_arraylib.lsp ++++ gcl-2.6.12/lsp/gcl_arraylib.lsp +@@ -27,14 +27,14 @@ + (proclaim '(optimize (safety 2) (space 3))) + + (defvar *baet-hash* (make-hash-table :test 'equal)) +-(defun best-array-element-type (type) +- (or (gethash type *baet-hash*) +- (setf (gethash type *baet-hash*) +- (if type +- (car (member type '(character bit signed-char unsigned-char signed-short unsigned-short +- fixnum short-float long-float t) +- :test 'subtypep)) t))))) +- ++(defun best-array-element-type (type &aux ++ (tps '(character bit signed-char unsigned-char signed-short unsigned-short ++ fixnum short-float long-float t))) ++ (if type ++ (or (car (member type tps)) ++ (gethash type *baet-hash*) ++ (setf (gethash type *baet-hash*) (car (member type tps :test 'subtypep)))) t)) ++ + (defun upgraded-array-element-type (type &optional environment) + (declare (ignore environment)) + (best-array-element-type type)) +--- gcl-2.6.12.orig/lsp/gcl_autoload.lsp ++++ gcl-2.6.12/lsp/gcl_autoload.lsp +@@ -267,7 +267,7 @@ + (push (list (nth nfree *type-list*) typename) + link-alist)))))) + (terpri) +- (dolist (info (reverse info-list)) ++ (dolist (info (nreverse info-list)) + (apply #'format t "~8D/~D~19T~6,1F%~@[~8D~]~35T~{~A~^ ~}" + (append (cdr info) + (if (assoc (car info) link-alist) +--- gcl-2.6.12.orig/lsp/gcl_debug.lsp ++++ gcl-2.6.12/lsp/gcl_debug.lsp +@@ -167,7 +167,7 @@ + ,@ (do ((v (cdr lis) (cdr v)) + (i 0 (1+ i)) + (res)) +- ((null v)(reverse res)) ++ ((null v)(nreverse res)) + (push `(setf ,(car v) (mv-ref ,i)) res)))) + + (defmacro mv-values (&rest lis) +@@ -175,7 +175,7 @@ + ,@ (do ((v (cdr lis) (cdr v)) + (i 0 (1+ i)) + (res)) +- ((null v)(reverse res)) ++ ((null v)(nreverse res)) + (push `(set-mv ,i ,(car v)) res)))) + + ;;start a lisp debugger loop. Exit it by using :step +--- gcl-2.6.12.orig/lsp/gcl_defmacro.lsp ++++ gcl-2.6.12/lsp/gcl_defmacro.lsp +@@ -103,7 +103,7 @@ + (push `(unless (endp ,(dm-nth-cdr (cdr ac) (car ac))) + (dm-too-many-arguments)) body)) + (unless envp (push `(declare (ignore ,env)) body)) +- (list doc ppn `(lambda-block ,name ,(reverse *dl*) ,@(append decls body))) ++ (list doc ppn `(lambda-block ,name ,(nreverse *dl*) ,@(append decls body))) + ) + + (defun dm-vl (vl whole top) +--- gcl-2.6.12.orig/lsp/gcl_directory.lsp ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -41,7 +41,7 @@ + (l (length yy)) + (y (link-expand (vector-push-string yy s) l)) + (y (if (eq y yy) y (make-frame y)))) +- (when (or (eq (stat z) :directory) (zerop (length z))) ++ (when (or (eq (stat1 z) :directory) (zerop (length z))) + (cond ((eq (car x) :wild-inferiors) (recurse-dir z y f)) + (x (walk-dir z y (lambda (q e l) + (declare (ignore l)) +--- gcl-2.6.12.orig/lsp/gcl_evalmacros.lsp ++++ gcl-2.6.12/lsp/gcl_evalmacros.lsp +@@ -23,178 +23,146 @@ + (in-package :si) + + +-(eval-when (compile) (proclaim '(optimize (safety 2) (space 3)))) ++;(eval-when (compile) (proclaim '(optimize (safety 2) (space 3)))) + ;(eval-when (eval compile) (defun si:clear-compiler-properties (symbol))) +-(eval-when (eval compile) (setq si:*inhibit-macro-special* nil)) +- +-(defmacro sgen (&optional (pref "G")) +- `(load-time-value (gensym ,pref))) ++(eval-when (eval compile) ++ (setq si:*inhibit-macro-special* nil) ++ (defmacro ?cons (f x &aux (s (sgen "?CONS"))) `(let ((,s ,x)) (if (cdr ,s) (cons ,f ,s) (car ,s)))) ++ (defmacro ?list (x &aux (s (sgen "?LIST"))) `(let ((,s ,x)) (when ,s (list ,s)))) ++ (defmacro collect (v r rp np &aux (s (sgen "COLLECT"))) ++ `(let ((,s ,v)) (setf rp (if rp (rplacd rp (list ,s)) (setq r ,s)) rp np))) ++ (defmacro ?let (k kf r) `(let ((r ,r)) (if (eq ,k ,kf) r `(let ((,,k ,,kf)) (declare (ignorable ,,k)) ,r)))) ++ (defmacro ?key (x &aux (s (sgen "?KEY"))) `(if (or (constantp ,x) (symbolp ,x)) ,x ',s))) + ++(defmacro sgen (&optional (pref "G")) `(load-time-value (gensym ,pref))) + + (defmacro defvar (var &optional (form nil form-sp) doc-string) +- `(progn (si:*make-special ',var) +- ,(if doc-string +- `(si:putprop ',var ,doc-string 'variable-documentation)) +- ,(if form-sp +- `(or (boundp ',var) +- (setq ,var ,form))) +- ',var) +- ) ++ (declare (optimize (safety 1))) ++ `(progn (*make-special ',var) ++ ,@(when doc-string `((putprop ',var ,doc-string 'variable-documentation))) ++ ,@(when form-sp `((unless (boundp ',var) (setq ,var ,form)))) ++ ',var)) + + (defmacro defparameter (var form &optional doc-string) +- (if doc-string +- `(progn (si:*make-special ',var) +- (si:putprop ',var ,doc-string 'variable-documentation) +- (setq ,var ,form) +- ',var) +- `(progn (si:*make-special ',var) +- (setq ,var ,form) +- ',var))) ++ (declare (optimize (safety 1))) ++ `(progn (*make-special ',var) ++ ,@(when doc-string `((putprop ',var ,doc-string 'variable-documentation))) ++ (setq ,var ,form) ++ ',var)) + + (defmacro defconstant (var form &optional doc-string) +- (if doc-string +- `(progn (si:*make-constant ',var ,form) +- (si:putprop ',var ,doc-string 'variable-documentation) +- ',var) +- `(progn (si:*make-constant ',var ,form) +- ',var))) ++ (declare (optimize (safety 1))) ++ `(progn (*make-constant ',var ,form) ++ ,@(when doc-string `((putprop ',var ,doc-string 'variable-documentation))) ++ ',var)) + + + ;;; Each of the following macros is also defined as a special form. + ;;; Thus their names need not be exported. + +-(defmacro and (&rest forms) +- (if (endp forms) +- t +- (let ((x (reverse forms))) +- (do ((forms (cdr x) (cdr forms)) +- (form (car x) `(if ,(car forms) ,form))) +- ((endp forms) form)))) +- ) +- +-(defmacro or (&rest forms) +- (if (endp forms) +- nil +- (let ((x (reverse forms))) +- (do ((forms (cdr x) (cdr forms)) +- (form (car x) +- (let ((temp (gensym))) +- `(let ((,temp ,(car forms))) +- (if ,temp ,temp ,form))))) +- ((endp forms) form)))) +- ) +- +-(defun parse-body-header (x &optional doc decl ctps &aux (a (car x))) +- (cond +- ((unless (or doc ctps) (and (stringp a) (cdr x))) (parse-body-header (cdr x) a decl ctps)) +- ((unless ctps (when (consp a) (eq (car a) 'declare))) (parse-body-header (cdr x) doc (cons a decl) ctps)) +- ((when (consp a) (eq (car a) 'check-type)) (parse-body-header (cdr x) doc decl (cons a ctps))) +- (t (values doc (nreverse decl) (nreverse ctps) x)))) ++(defmacro and (&rest forms &aux r rp np) ++ (declare (optimize (safety 1))) ++ (do ((y forms))((endp y) (if forms r t)) ++ (let ((x (pop y))) ++ (if (constantp x) (unless (if (eval x) y) (collect x r rp np) (setq y nil)) ++ (if y (collect `(if ,@(setq np (list x))) r rp np) ++ (collect x r rp np)))))) ++ ++(defmacro or (&rest forms &aux r rp np (s (sgen "OR"))) ++ (declare (optimize (safety 1))) ++ (do ((y forms))((endp y) r) ++ (let ((x (pop y))) ++ (if (constantp x) (when (eval x) (collect x r rp np) (setq y nil)) ++ (if (symbolp x) (collect `(if ,x ,@(setq np (list x))) r rp np) ++ (if y (collect `(let ((,s ,x)) (if ,s ,@(setq np (list s)))) r rp np) ++ (collect x r rp np))))))) ++ ++(defun parse-body-header (x) ++ (let* ((doc x)(x (or (when (stringp (car x)) (cdr x)) x)) ++ (dec x)(x (member-if-not (lambda (x) (when (consp x) (eq (car x) 'declare))) x)) ++ (ctp x)(x (member-if-not (lambda (x) (when (consp x) (eq (car x) 'check-type))) x))) ++ (values (car (ldiff doc dec)) (ldiff dec ctp) (ldiff ctp x) x))) + + (defmacro locally (&rest body) + (multiple-value-bind +- (doc decls ctps body) ++ (doc dec) + (parse-body-header body) ++ (declare (ignore doc)) + `(let (,@(mapcan (lambda (x &aux (z (pop x))(z (if (eq z 'type) (pop x) z))) + (case z + ((ftype inline notinline optimize) nil) + (otherwise (mapcar (lambda (x) (list x x)) x)))) +- (apply 'append (mapcar 'cdr decls)))) +- ,@(when doc (list doc)) +- ,@decls +- ,@ctps ++ (apply 'append (mapcar 'cdr dec)))) + ,@body))) + +-(defmacro loop (&rest body &aux (tag (gensym))) +- `(block nil (tagbody ,tag (progn ,@body) (go ,tag)))) ++(defmacro loop (&rest body &aux (tag (sgen "LOOP"))) ++ `(block nil (tagbody ,tag ,(?cons 'progn body) (go ,tag)))) + +-(import 'while 'user) + (defmacro while (test &rest forms) +- `(loop (unless ,test (return)) ,@forms) ) ++ `(loop (unless ,test (return)) ,@forms)) + + (defmacro defmacro (name vl &rest body) + `(si:define-macro ',name (si:defmacro* ',name ',vl ',body))) + + (defmacro defun (name lambda-list &rest body) +- (multiple-value-bind (doc decl body) +- (find-doc body nil) +- (if doc +- `(progn (setf (get ',name 'si:function-documentation) ,doc) +- (setf (symbol-function ',name) +- #'(lambda ,lambda-list +- ,@decl (block ,name ,@body))) +- ',name) +- `(progn (setf (symbol-function ',name) +- #'(lambda ,lambda-list +- ,@decl (block ,name ,@body))) +- ',name)))) ++ (multiple-value-bind ++ (doc dec ctp body) ++ (parse-body-header body) ++ `(progn ,@(when doc `((setf (get ',name 'function-documentation) ,doc))) ++ (setf (symbol-function ',name) (lambda ,lambda-list ,@dec ,@ctp (block ,name ,@body))) ++ ',name))) + + ; assignment + + (defmacro psetq (&rest args) +- (do ((l args (cddr l)) +- (forms nil) +- (bindings nil)) +- ((endp l) (list* 'let* (nreverse bindings) (nreverse (cons nil forms)))) +- (declare (object l)) +- (let ((sym (gensym))) +- (push (list sym (cadr l)) bindings) +- (push (list 'setq (car l) sym) forms))) +- ) ++ (declare (optimize (safety 1))) ++ (assert (evenp (length args))) ++ (let ((x (let ((i 0)) (mapcon (lambda (x) (when (oddp (incf i)) `((,(cadr x) ,(car x) ,(gensym))))) args)))) ++ (when x ++ `(let* ,(mapcar (lambda (x) `(,(caddr x) ,(car x))) x) ++ (setq ,@(mapcan 'cdr x)) ++ nil)))) + + ; conditionals ++(defmacro cond (&rest clauses &aux r rp np (s (sgen "COND"))) ++ (declare (optimize (safety 1))) ++ (do ((y clauses))((endp y) r) ++ (let* ((x (pop y))(z (pop x))) ++ (if (constantp z) (when (eval z) (collect (if x (?cons 'progn x) z) r rp np) (setq y nil)) ++ (if x (collect `(if ,z ,@(setq np (list (?cons 'progn x)))) r rp np) ++ (if (symbolp z) (collect `(if ,z ,@(setq np (list z))) r rp np) ++ (if y (collect `(let ((,s ,z)) (if ,s ,@(setq np (list s)))) r rp np) ++ (collect `(values ,z) r rp np)))))))) ++ ++(defmacro when (pred &rest body &aux (x (?cons 'progn body))) ++ (declare (optimize (safety 1))) ++ (if (constantp pred) (if (eval pred) x) `(if ,pred ,x))) ++ ++(defmacro unless (pred &rest body &aux (x (?cons 'progn body))) ++ (declare (optimize (safety 1))) ++ (if (constantp pred) (if (not (eval pred)) x) `(if (not ,pred) ,x))) + +-(defmacro cond (&rest clauses &aux (form nil)) +- (let ((x (reverse clauses))) +- (dolist (l x form) +- (cond ((endp (cdr l)) +- (if (or (constantp (car l)) (eq l (car x))) +- (setq form (car l)) +- (let ((sym (gensym))) +- (setq form `(let ((,sym ,(car l))) (if ,sym ,sym ,form)))))) +- ((and (constantp (car l)) (car l)) +- (setq form (if (endp (cddr l)) (cadr l) `(progn ,@(cdr l))))) +- ((setq form (if (endp (cddr l)) +- `(if ,(car l) ,(cadr l) ,form) +- `(if ,(car l) (progn ,@(cdr l)) ,form)))))))) +- +- +-(defmacro when (pred &rest body) +- `(if ,pred (progn ,@body))) ++; program feature + +-(defmacro unless (pred &rest body) +- `(if (not ,pred) (progn ,@body))) ++(defun prog?* (let?* vl body) ++ (multiple-value-bind ++ (doc dec ctp body) ++ (parse-body-header body) ++ (declare (ignore doc)) ++ `(block nil (,let?* ,vl ,@dec (tagbody ,@(append ctp body)))))) + +-; program feature ++(defmacro prog (vl &rest body) ++ (prog?* 'let vl body)) + +-(defmacro prog (vl &rest body &aux (decl nil)) +- (do () +- ((or (endp body) +- (not (consp (car body))) +- (not (eq (caar body) 'declare))) +- `(block nil (let ,vl ,@decl (tagbody ,@body))) +- ) +- (push (car body) decl) +- (pop body)) +- ) +- +-(defmacro prog* (vl &rest body &aux (decl nil)) +- (do () +- ((or (endp body) +- (not (consp (car body))) +- (not (eq (caar body) 'declare))) +- `(block nil (let* ,vl ,@decl (tagbody ,@body))) +- ) +- (push (car body) decl) +- (pop body)) +- ) ++(defmacro prog* (vl &rest body) ++ (prog?* 'let* vl body)) + + ; sequencing + +-(defmacro prog1 (first &rest body &aux (sym (gensym))) ++(defmacro prog1 (first &rest body &aux (sym (sgen "PROG1"))) + `(let ((,sym ,first)) ,@body ,sym)) + +-(defmacro prog2 (first second &rest body &aux (sym (gensym))) ++(defmacro prog2 (first second &rest body &aux (sym (sgen "PROG2"))) + `(progn ,first (let ((,sym ,second)) ,@body ,sym))) + + ; multiple values +@@ -203,115 +171,79 @@ + `(multiple-value-call 'list ,form)) + + (defmacro multiple-value-setq (vars form) +- (do ((vl vars (cdr vl)) +- (sym (gensym)) +- (forms nil) +- (n 0 (1+ n))) +- ((endp vl) `(let ((,sym (multiple-value-list ,form))) ,@forms)) +- (declare (fixnum n) (object vl)) +- (push `(setq ,(car vl) (nth ,n ,sym)) forms)) +- ) +- +-(defmacro multiple-value-bind (vars form &rest body) +- (do ((vl vars (cdr vl)) +- (sym (gensym)) +- (bind nil) +- (n 0 (1+ n))) +- ((endp vl) `(let* ((,sym (multiple-value-list ,form)) ,@(nreverse bind)) +- ,@body)) +- (declare (fixnum n) (object vl)) +- (push `(,(car vl) (nth ,n ,sym)) bind)) +- ) +- +-(defmacro do (control (test . result) &rest body +- &aux (decl nil) (label (gensym)) (vl nil) (step nil)) +- (do () +- ((or (endp body) +- (not (consp (car body))) +- (not (eq (caar body) 'declare)))) +- (push (car body) decl) +- (pop body)) +- (dolist (c control) +- (declare (object c)) +- (if(symbolp c) (setq c (list c))) +- (push (list (car c) (cadr c)) vl) +- (unless (endp (cddr c)) +- (push (car c) step) +- (push (caddr c) step))) +- `(block nil +- (let ,(nreverse vl) +- ,@decl +- (tagbody +- ,label (if ,test (return (progn ,@result))) +- (tagbody ,@body) +- (psetq ,@(nreverse step)) +- (go ,label))))) +- +-(defmacro do* (control (test . result) &rest body +- &aux (decl nil) (label (gensym)) (vl nil) (step nil)) +- (do () +- ((or (endp body) +- (not (consp (car body))) +- (not (eq (caar body) 'declare)))) +- (push (car body) decl) +- (pop body)) +- (dolist (c control) +- (declare (object c)) +- (if(symbolp c) (setq c (list c))) +- (push (list (car c) (cadr c)) vl) +- (unless (endp (cddr c)) +- (push (car c) step) +- (push (caddr c) step))) +- `(block nil +- (let* ,(nreverse vl) +- ,@decl +- (tagbody +- ,label (if ,test (return (progn ,@result))) +- (tagbody ,@body) +- (setq ,@(nreverse step)) +- (go ,label)))) +- ) +- +-(defmacro case (keyform &rest clauses &aux (key (load-time-value (gensym "CASE"))) (c (reverse clauses))) +- (declare (optimize (safety 2))) +- (labels ((sw (x) `(eql ,key ',x))(dfp (x) (or (eq x t) (eq x 'otherwise))) +- (v (x) (if (when (listp x) (not (cdr x))) (car x) x)) +- (m (x c &aux (v (v x))) (if (eq v x) (cons c v) v))) +- `(let ((,key ,keyform)) +- (declare (ignorable ,key)) +- ,(let ((df (when (dfp (caar c)) (m (cdr (pop c)) 'progn)))) +- (reduce (lambda (y c &aux (a (pop c))(v (v a))) +- (when (dfp a) (error "default case must be last")) +- `(if ,(if (when (eq a v) (listp v)) (m (mapcar #'sw v) 'or) (sw v)) ,(m c 'progn) ,y)) +- c :initial-value df))))) +- +-(defmacro ecase (keyform &rest clauses &aux (key (sgen "ECASE"))) +- (declare (optimize (safety 2))) +- `(let ((,key ,keyform)) +- (declare (ignorable ,key)) +- (case ,key ++ (declare (optimize (safety 1))) ++ (let ((syms (mapcar (lambda (x) (declare (ignore x)) (gensym)) (or vars (list nil))))) ++ `(multiple-value-bind ,syms ,form ,@(?list (?cons 'setq (mapcan 'list vars syms))) ,(car syms)))) ++ ++(defmacro multiple-value-bind (vars form &rest body &aux (sym (sgen "MULTIPLE-VALUE-BIND"))) ++ (declare (optimize (safety 1))) ++ `(let* ((,sym (multiple-value-list ,form)) ++ ,@(mapcon (lambda (x) `((,(car x) (car ,sym)) ,@(when (cdr x) `((,sym (cdr ,sym)))))) vars)) ++ (declare (ignorable ,sym)) ++ ,@body)) ++ ++(defun do?* (?* control test result body &aux (label (sgen "DO"))) ++ (multiple-value-bind ++ (doc dec ctp body) ++ (parse-body-header body) ++ (declare (ignore doc)) ++ (labels ((?let (vl dec body) (if (or vl dec) `(,(if ?* 'let* 'let) ,vl ,@dec ,body) body)) ++ (?tagbody (l x y &aux (x (macroexpand x))) (if x `(tagbody ,l ,x ,@(?list (when (eq (car x) 'if) y))) y))) ++ `(block nil ++ ,(?let ++ (mapcar (lambda (x) (if (listp x) (ldiff x (cddr x)) x)) control) ++ dec ++ (?tagbody ++ label ++ `(unless ,test ++ ,@(?list (?cons 'tagbody (append ctp body))) ++ ,@(?list (?cons (if ?* 'setq 'psetq) (mapcan (lambda (x) (when (and (listp x) (cddr x)) (list (car x) (caddr x)))) control))) ++ (go ,label)) ++ `(return ,(?cons 'progn result)))))))) ++ ++(defmacro do (control (test . result) &rest body) ++ (do?* nil control test result body)) ++ ++(defmacro do* (control (test . result) &rest body) ++ (do?* t control test result body)) ++ ++(defmacro case (keyform &rest clauses &aux r rp np (key (?key keyform))) ++ (declare (optimize (safety 1))) ++ (labels ((sw (x) `(eql ,key ,(if (constantp x) x `',x)))) ++ (do ((y clauses))((endp y) (?let key keyform r)) ++ (let* ((x (pop y))(z (pop x))) ++ (if (member z '(t otherwise)) ++ (if y (error "default case must be last") (collect (?cons 'progn x) r rp np)) ++ (when z ++ (if (constantp key) ++ (let ((key (eval key))) (when (if (listp z) (member key z) (eql key z)) (collect (?cons 'progn x) r rp np) (setq y nil))) ++ (collect `(if ,(if (listp z) (?cons 'or (mapcar #'sw z)) (sw z)) ++ ,@(setq np (list (?cons 'progn x)))) r rp np)))))))) ++ ++(defmacro ecase (keyform &rest clauses &aux (key (?key keyform))) ++ (declare (optimize (safety 1))) ++ (?let key keyform ++ `(case ,key + ,@(mapcar (lambda (x) (if (member (car x) '(t otherwise)) (cons (list (car x)) (cdr x)) x)) clauses) + (otherwise + (error 'type-error :datum ,key + :expected-type '(member ,@(apply 'append (mapcar (lambda (x &aux (x (car x))) (if (listp x) x (list x))) clauses)))))))) + ++(defmacro ccase (keyform &rest clauses &aux (key (?key keyform))) ++ (declare (optimize (safety 1))) ++ (?let key keyform ++ `(do nil (nil) ++ (case ,key ++ ,@(mapcar (lambda (x &aux (k (pop x))) ++ `(,(if (member k '(t otherwise)) (list k) k) (return ,(?cons 'progn x)))) clauses) ++ (otherwise ++ (check-type ,key (member ,@(apply 'append (mapcar (lambda (x &aux (x (car x))) (if (listp x) x (list x))) clauses))))))))) + +-(defmacro ccase (keyform &rest clauses &aux (key (sgen "CCASE"))) +- (declare (optimize (safety 2))) +- `(let ((,key ,keyform)) +- (declare (ignorable ,key)) +- (do nil (nil) +- (case ,key +- ,@(mapcar (lambda (x &aux (k (pop x))) +- `(,(if (member k '(t otherwise)) (list k) k) (return ,(if (cdr x) (cons 'progn x) (car x))))) clauses) +- (otherwise +- (check-type ,key (member ,@(apply 'append (mapcar (lambda (x &aux (x (car x))) (if (listp x) x (list x))) clauses))))))))) +- +-(defmacro return (&optional (val nil)) `(return-from nil ,val)) +- +-(defmacro dolist ((var form &optional (val nil)) &rest body +- &aux (temp (gensym))) +- `(do* ((,temp ,form (cdr ,temp)) (,var (car ,temp) (car ,temp))) ++ ++(defmacro return (&optional val) `(return-from nil ,val)) ++ ++(defmacro dolist ((var form &optional (val nil)) &rest body &aux (temp (sgen "DOLIST"))) ++ `(do* ((,temp ,form (cdr ,temp))(,var (car ,temp) (car ,temp))) + ((endp ,temp) ,val) + ,@body)) + +@@ -327,59 +259,19 @@ + ;; appears to treat this as positive or negative depending on the sign + ;; of the other argument in the comparison, apparently to symmetrize + ;; the long integer range. 20040403 CM. +-(defmacro dotimes ((var form &optional (val nil)) &rest body) +- (cond +- ((symbolp form) +- (let ((temp (gensym))) +- `(cond ((< ,form 0) +- (let ((,var 0)) +- (declare (fixnum ,var) (ignorable ,var)) +- ,val)) +- ((<= ,form most-positive-fixnum) +- (let ((,temp ,form)) +- (declare (fixnum ,temp)) +- (do* ((,var 0 (1+ ,var))) ((>= ,var ,temp) ,val) +- (declare (fixnum ,var)) +- ,@body))) +- (t +- (let ((,temp ,form)) +- (do* ((,var 0 (1+ ,var))) ((>= ,var ,temp) ,val) +- ,@body)))))) +- ((constantp form) +- (cond ((< form 0) +- `(let ((,var 0)) +- (declare (fixnum ,var) (ignorable ,var)) +- ,val)) +- ((<= form most-positive-fixnum) +- `(do* ((,var 0 (1+ ,var))) ((>= ,var ,form) ,val) +- (declare (fixnum ,var)) +- ,@body)) +- (t +- `(do* ((,var 0 (1+ ,var))) ((>= ,var ,form) ,val) +- ,@body)))) +- (t +- (let ((temp (gensym))) +- `(let ((,temp ,form)) +- (cond ((< ,temp 0) +- (let ((,var 0)) +- (declare (fixnum ,var) (ignorable ,var)) +- ,val)) +- ((<= ,temp most-positive-fixnum) +- (let ((,temp ,temp)) +- (declare (fixnum ,temp)) +- (do* ((,var 0 (1+ ,var))) ((>= ,var ,temp) ,val) +- (declare (fixnum ,var)) +- ,@body))) +- (t +- (do* ((,var 0 (1+ ,var))) ((>= ,var ,temp) ,val) +- ,@body)))))))) +- ++(defmacro dotimes ((var form &optional val) &rest body &aux (s (sgen "DOTIMES"))(m (sgen "DOTIMES"))) ++ `(let* ((,s (block nil ,form))(,m (min ,s most-positive-fixnum))) ++ (declare (fixnum ,m)) ++ (do ((,var 0 (1+ ,var))) ++ ((>= ,var ,m) (if (eql ,s ,m) ,val (do ((,var ,m (1+ ,var)))((>= ,var ,s) ,val) ,@body))) ++ (declare (fixnum ,var)) ++ ,@body))) + + (defmacro declaim (&rest l) +- `(eval-when (compile eval load) +- ,@(mapcar #'(lambda (x) `(proclaim ',x)) l))) ++ `(eval-when (compile eval load) ++ ,@(mapcar (lambda (x) `(proclaim ',x)) l))) + +-(defmacro lambda ( &rest l) `(function (lambda ,@l))) ++(defmacro lambda (&rest l) `(function (lambda ,@l))) + + (defun compiler-macro-function (name) + (get name 'compiler-macro-prop)) +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -380,7 +380,7 @@ + + (defun get-byte-stream-nchars (s) + (let* ((tp (stream-element-type s))) +- (ceiling (if (consp tp) (cadr tp) char-length) char-length))) ++ (values (ceiling (if (consp tp) (cadr tp) char-length) char-length)))) + + ;; (defun parse-integer (s &key start end (radix 10) junk-allowed) + ;; (declare (optimize (safety 1))) +@@ -488,21 +488,19 @@ + (stream (load-stream p print))) + (when verbose (format t ";; Finished loading ~s~%" p)))) + +-(defun ensure-directories-exist (ps &key verbose &aux created) ++(defun ensure-directories-exist (ps &key verbose) + (declare (optimize (safety 1))) + (check-type ps pathname-designator) + (when (wild-pathname-p ps) + (error 'file-error :pathname ps :format-control "Pathname is wild")) +- (labels ((d (x y &aux (z (ldiff x y)) (n (namestring (make-pathname :directory z)))) +- (when (when z (stringp (car (last z)))) +- (unless (eq :directory (stat n)) +- (mkdir n) +- (setq created t) +- (when verbose (format *standard-output* "Creating directory ~s~%" n)))) +- (when y (d x (cdr y))))) +- (let ((pd (pathname-directory ps))) +- (d pd (cdr pd))) +- (values ps created))) ++ (let ((pd (pathname-directory ps)) ls) ++ (dotimes (i (length pd)) ++ (let ((s (namestring (make-pathname :directory (if (zerop i) pd (ldiff pd (last pd i))))))) ++ (if (eq (stat1 s) :directory) (return) (push s ls)))) ++ (dolist (s ls) ++ (mkdir s) ++ (when verbose (format *standard-output* "Creating directory ~s~%" s))) ++ (values ps (if ls t)))) + + (defun file-length (x) + (declare (optimize (safety 1))) +@@ -511,7 +509,7 @@ + (let ((s (broadcast-stream-streams x))) (if s (file-length (car (last s))) 0)) + (multiple-value-bind (tp sz) (stat x) + (declare (ignore tp)) +- (/ sz (get-byte-stream-nchars x))))) ++ (values (truncate sz (get-byte-stream-nchars x)))))) + + (defun file-position (x &optional (pos :start pos-p)) + (declare (optimize (safety 1))) +--- gcl-2.6.12.orig/lsp/gcl_loop.lsp ++++ gcl-2.6.12/lsp/gcl_loop.lsp +@@ -793,6 +793,8 @@ a LET-like macro, and a SETQ-like macro, + (unless (= (length before-loop) (length after-loop)) + (error "LOOP-BODY called with non-synched before- and after-loop lists.")) + ;;All our work is done from these copies, working backwards from the end: ++ (when (equal before-loop after-loop) ++ (setq main-body (append before-loop main-body) before-loop nil after-loop nil));accelerator + (setq rbefore (reverse before-loop) rafter (reverse after-loop)) + (labels ((psimp (l) + (let ((ans nil)) +--- gcl-2.6.12.orig/lsp/gcl_parse_namestring.lsp ++++ gcl-2.6.12/lsp/gcl_parse_namestring.lsp +@@ -2,15 +2,6 @@ + + (deftype seqind nil `fixnum) + +-(defun match-beginning (i &aux (v *match-data*)) +- (declare ((vector fixnum) v)(seqind i)) +- (the (or (integer -1 -1 ) seqind) (aref v i))) +-(defun match-end (i &aux (v *match-data*)) +- (declare ((vector fixnum) v)(seqind i)) +- (the (or (integer -1 -1 ) seqind) (aref v (+ i (ash (length v) -1))))) +- +-(declaim (inline match-beginning match-end)) +- + (defun dir-conj (x) (if (eq x :relative) :absolute :relative)) + + (defvar *up-key* :up) +--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp ++++ gcl-2.6.12/lsp/gcl_predlib.lsp +@@ -348,8 +348,7 @@ + ;; FIXME this needs to be more robust + (defun known-type-p (type) + (when (consp type) (setq type (car type))) +- (if (or (equal (string type) "ERROR") +- (member type ++ (if (or (member type + '(t nil boolean null symbol keyword atom cons list sequence + signed-char unsigned-char signed-short unsigned-short + number integer bignum rational ratio float method-combination +@@ -370,8 +369,9 @@ + storage-condition stream-error string-stream structure-class + style-warning synonym-stream two-way-stream structure-object + type-error unbound-slot unbound-variable undefined-function +- warning )) +- (get type 's-data)) ++ warning) :test 'eq) ++ (get type 's-data) ++ (equal (string type) "ERROR")) + t + nil)) + +--- gcl-2.6.12.orig/lsp/gcl_rename_file.lsp ++++ gcl-2.6.12/lsp/gcl_rename_file.lsp +@@ -26,7 +26,7 @@ + (defun delete-file (f &aux (pf (truename f))(nf (namestring pf))) + (declare (optimize (safety 1))) + (check-type f pathname-designator) +- (unless (if (eq :directory (stat nf)) (rmdir nf) (unlink nf)) ++ (unless (if (eq :directory (stat1 nf)) (rmdir nf) (unlink nf)) + (error 'file-error :pathname (pathname nf) :format-control "Cannot delete pathname.")) + t) + +--- gcl-2.6.12.orig/lsp/gcl_seqlib.lsp ++++ gcl-2.6.12/lsp/gcl_seqlib.lsp +@@ -25,7 +25,7 @@ + (in-package :si) + + +-(proclaim '(optimize (safety 2) (space 3))) ++;(proclaim '(optimize (safety 2) (space 3))) + + + (proclaim '(function seqtype (t) t)) +@@ -274,40 +274,87 @@ + (list 'quote f))) + + (defmacro eval-body () *body*) ++(defmacro mcf (x) `(when ,x (coerce ,x 'function))) ++(deftype function-designator nil `(or (and symbol (not boolean)) function)) ++(defmacro rcollect (r rp form) ++ `(let ((tmp ,form)) ++ (setq ,rp (last (if ,rp (rplacd ,rp tmp) (setq ,r tmp)))))) ++ ++ (defmacro dcollect (r rp form) ++ `(let ((tmp ,form)) ++ (declare (dynamic-extent tmp)) ++ (setq ,rp (cond (,rp (rplacd ,rp tmp) tmp) ((setq ,r tmp)))))) ++ + ) + ++(defun remove (item sequence &key key test test-not from-end count (start 0) end ++ &aux (kf (mcf key))(tf (mcf test))(tnf (mcf test-not)) r rp q qp xz (from-end (when count from-end)) ++ (l (listp sequence))(ln (if l array-dimension-limit (length sequence))) ++ (e (if end (min ln (max 0 end)) ln)) ++ (c (if count (min ln (max 0 count)) ln))) ++ ++ (declare (optimize (safety 1))(dynamic-extent q)(fixnum c e)) ++ ++ (check-type sequence sequence) ++ (check-type start seqind) ++ (check-type end (or null seqind)) ++ (check-type count (or null integer)) ++ (check-type key (or null function-designator)) ++ (check-type test (or null function-designator)) ++ (check-type test-not (or null function-designator)) ++ ++ (cond ((unless from-end l) ++ (do ((i start (1+ i))(j 0)(s (if (zerop start) sequence (nthcdr start sequence)) (cdr s))) ++ ((or (endp s) (>= i e) (>= j c)) (rcollect r rp sequence) r) ++ (declare (fixnum i j)) ++ (let* ((x (car s))(kx (if kf (funcall kf x) x))) ++ (when (cond (tf (funcall tf item kx))(tnf (not (funcall tnf item kx)))((eql item kx))) ++ (do nil ((eq sequence s) (setq sequence (cdr sequence))) (rcollect r rp (cons (pop sequence) nil))) ++ (incf j))))) ++ (t ++ (do* ((j 0 (1+ j))) ++ ((not (when (< j c) ++ (setq xz (position item sequence ++ :start (if (unless from-end xz) (1+ xz) start) ++ :end (if (when from-end xz) xz end) ++ :key kf :test tf :test-not tnf :from-end from-end))))) ++ (declare (fixnum j)) ++ (if from-end (push xz q) (dcollect q qp (cons xz nil)))) ++; (print q) ++ (cond ((not q) sequence) ++ (l (do* ((lq -1 (car q))(q q (cdr q))(v sequence (cdr v)))((not q) (rcollect r rp v) r) ++ (declare (fixnum lq)) ++ (dotimes (i (the fixnum (- (car q) lq 1))) (declare (fixnum i))(rcollect r rp (cons (pop v) nil))))) ++ ((let ((r (make-array (- (length sequence) (length q)) :element-type (array-element-type sequence)))) ++ (do* ((j 0 (+ j (- (car q) lq 1)))(lq -1 (car q))(q q (cdr q))) ++ ((when (replace r sequence :start1 j :start2 (1+ lq) :end2 (car q)) (not q)) r))))))) ++) + +-(defseq remove () t nil +- (if (not from-end) +- `(if (listp sequence) +- (let ((l sequence) (l1 nil)) +- (do ((i 0 (f+ 1 i))) +- ((>= i start)) +- (declare (fixnum i)) +- (push (car l) l1) +- (pop l)) +- (do ((i start (f+ 1 i)) (j 0)) +- ((or (>= i end) (>= j count) (endp l)) +- (nreconc l1 l)) +- (declare (fixnum i j)) +- (cond ((call-test test test-not item (funcall key (car l))) +- (setf j (f+ 1 j)) +- (pop l)) +- (t +- (push (car l) l1) +- (pop l))))) +- (delete item sequence +- :from-end from-end +- :test test :test-not test-not +- :start start :end end +- :count count +- :key key)) +- `(delete item sequence +- :from-end from-end +- :test test :test-not test-not +- :start start :end end +- :count count +- :key key))) ++(defun remove-if (p s &key key from-end count (start 0) end &aux (kf (mcf key))) ++ ++ (declare (optimize (safety 1))) ++ ++ (check-type p function-designator) ++ (check-type s sequence) ++ (check-type start seqind) ++ (check-type end (or null seqind)) ++ (check-type count (or null integer)) ++ (check-type key (or null function-designator)) ++ ++ (remove p s :key kf :test #'funcall :start start :end end :count count :from-end from-end)) ++ ++(defun remove-if-not (p s &key key from-end count (start 0) end &aux (kf (mcf key))) ++ ++ (declare (optimize (safety 1))) ++ ++ (check-type p function-designator) ++ (check-type s sequence) ++ (check-type start seqind) ++ (check-type end (or null seqind)) ++ (check-type count (or null integer)) ++ (check-type key (or null function-designator)) ++ ++ (remove p s :key kf :test-not #'funcall :start start :end end :count count :from-end from-end)) + + + (defseq delete () t t +--- gcl-2.6.12.orig/lsp/gcl_setf.lsp ++++ gcl-2.6.12/lsp/gcl_setf.lsp +@@ -197,6 +197,7 @@ + (defsetf symbol-plist si:set-symbol-plist) + (defsetf gethash (k h &optional d) (v) `(si:hash-set ,k ,h ,v)) + (defsetf row-major-aref si:aset1) ++(defsetf readtable-case si::set-readtable-case) + (defsetf documentation (s d) (v) + `(case ,d + (variable (si:putprop ,s ,v 'variable-documentation)) +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -582,7 +582,7 @@ First directory is checked for first nam + (defvar *tmp-dir*) + + (defun ensure-dir-string (str) +- (if (eq (stat str) :directory) ++ (if (eq (stat1 str) :directory) + (coerce-slash-terminated str) + str)) + +@@ -590,7 +590,7 @@ First directory is checked for first nam + (dolist (x `(,@(mapcar 'si::getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" "")) + (when x + (let ((x (coerce-slash-terminated x))) +- (when (eq (stat x) :directory) ++ (when (eq (stat1 x) :directory) + (return-from get-temp-dir x)))))) + + +--- gcl-2.6.12.orig/lsp/gcl_translate_pathname.lsp ++++ gcl-2.6.12/lsp/gcl_translate_pathname.lsp +@@ -51,7 +51,7 @@ + + (defun list-toggle-case (x f) + (typecase x +- (string (funcall f x)) ++ (string (values (funcall f x))) + (cons (mapcar (lambda (x) (list-toggle-case x f)) x)) + (otherwise x))) + +--- gcl-2.6.12.orig/lsp/gcl_truename.lsp ++++ gcl-2.6.12/lsp/gcl_truename.lsp +@@ -6,7 +6,7 @@ + (set-fr (fr e &aux (fr (or fr (frame 0 b)))) (setf (fill-pointer fr) e) fr)) + (let* ((i (string-match +dirsep+ str b)) + (fr (set-fr fr (if (eql i -1) n i))) +- (l (when (eq (stat fr) :link) (readlinkat 0 fr)))) ++ (l (when (eq (stat1 fr) :link) (readlinkat 0 fr)))) + (cond (l (let ((b (if (eql #\/ (aref l 0)) 0 b))) + (link-expand (string-concatenate (set-fr fr b) l (frame (if (eql i -1) n i) n)) b))) + ((eql i -1) str) +@@ -25,7 +25,7 @@ + (error 'file-error :pathname pd :format-control "Pathname is wild")) + (let* ((ns (ensure-dir-string (link-expand ns))) + (ppd (if (eq (namestring pd) ns) pd (pathname ns)))) +- (unless (or (zerop (length ns)) (stat ns)) ++ (unless (or (zerop (length ns)) (stat1 ns)) + (error 'file-error :pathname ns :format-control "Pathname does not exist")) + (let* ((d (pathname-directory ppd)) + (d1 (subst :back :up d)) +@@ -38,5 +38,5 @@ + (check-type pd pathname-designator) + (when (wild-pathname-p pn) + (error 'file-error :pathname pn :format-control "Pathname is wild")) +- (when (eq (stat (link-expand (namestring pn))) :file) ++ (when (eq (stat1 (link-expand (namestring pn))) :file) + (truename pn))) +--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp ++++ gcl-2.6.12/lsp/sys-proclaim.lisp +@@ -3,239 +3,282 @@ + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*)) +- COMMON-LISP::T) +- SYSTEM::RESET-SYS-PATHS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VECTOR COMMON-LISP::T)) +- SYSTEM::CONTEXT-VEC)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION + ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) ++ 9223372036854775807) ++ COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::PUSH-CONTEXT SYSTEM::GET-CONTEXT)) ++ SYSTEM::SMALLNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- SLOOP::PARSE-LOOP-DO ANSI-LOOP::LOOP-WHEN-IT-VARIABLE +- SYSTEM::GET-INDEX-NODE SLOOP::LOOP-PEEK +- ANSI-LOOP::LOOP-POP-SOURCE SYSTEM::STEP-READ-LINE +- SYSTEM::SET-UP-TOP-LEVEL SLOOP::LOOP-POP SYSTEM::SET-ENV +- SYSTEM::DBL COMMON-LISP::TYPE-ERROR SYSTEM::INSPECT-INDENT +- SLOOP::PARSE-LOOP-COLLECT SYSTEM::CLEANUP +- SYSTEM::DEFAULT-SYSTEM-BANNER +- SYSTEM::CURRENT-DIRECTORY-PATHNAME ANSI-LOOP::LOOP-DO-WITH +- SYSTEM::INIT-BREAK-POINTS SYSTEM::TEST-ERROR +- SYSTEM::GET-SIG-FN-NAME SLOOP::PARSE-ONE-WHEN-CLAUSE +- ANSI-LOOP::LOOP-DO-DO SYSTEM::READ-EVALUATED-FORM +- SYSTEM::INSPECT-INDENT-1 ANSI-LOOP::LOOP-DO-NAMED +- SLOOP::PARSE-LOOP-FOR SYSTEM::ALL-TRACE-DECLARATIONS +- ANSI-LOOP::LOOP-GET-FORM ANSI-LOOP::LOOP-BIND-BLOCK +- SLOOP::PARSE-LOOP-WHEN SYSTEM::TOP-LEVEL +- SYSTEM::DM-TOO-FEW-ARGUMENTS SYSTEM::KCL-TOP-RESTARTS +- SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::SHOW-RESTARTS +- SYSTEM::DM-TOO-MANY-ARGUMENTS SYSTEM::SETUP-LINEINFO +- SYSTEM::GET-TEMP-DIR ANSI-LOOP::LOOP-ITERATION-DRIVER +- SLOOP::PARSE-LOOP1 SLOOP::LOOP-UN-POP +- ANSI-LOOP::LOOP-DO-FINALLY SYSTEM::INSPECT-READ-LINE +- ANSI-LOOP::LOOP-CONTEXT SYSTEM::SET-CURRENT +- ANSI-LOOP::LOOP-DO-REPEAT SYSTEM::ILLEGAL-BOA +- COMMON-LISP::LISP-IMPLEMENTATION-VERSION +- ANSI-LOOP::LOOP-DO-RETURN ANSI-LOOP::LOOP-DO-INITIALLY +- ANSI-LOOP::LOOP-GET-PROGN)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ SYSTEM::NORMALIZE-TYPE SYSTEM::PNL1 ++ ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS SYSTEM::DM-BAD-KEY ++ SYSTEM::S-DATA-INCLUDES ++ ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS ++ COMMON-LISP::HOST-NAMESTRING ++ COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM COMMON-LISP::LOGNOT ++ SYSTEM::BREAK-FORWARD-SEARCH-STACK ++ SLOOP::SUBSTITUTE-SLOOP-BODY ++ COMMON-LISP::CONCATENATED-STREAM-STREAMS ++ ANSI-LOOP::LOOP-MINIMAX-OPERATIONS SYSTEM::ADD-TO-HOTLIST ++ SYSTEM::RESTART-REPORT-FUNCTION COMMON-LISP::THIRD ++ SYSTEM::DWIM SYSTEM::GET-INSTREAM SYSTEM::TOGGLE-CASE ++ SYSTEM::INSTREAM-P COMMON-LISP::DELETE-FILE ++ SYSTEM::BEST-ARRAY-ELEMENT-TYPE COMMON-LISP::ISQRT ++ SYSTEM::INSERT-BREAK-POINT SYSTEM::WILD-DIR-ELEMENT-P ++ COMMON-LISP::ABS SYSTEM::WHICH COMMON-LISP::ACOS ++ SYSTEM::COERCE-SLASH-TERMINATED ++ COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS ++ ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD ++ COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM SYSTEM::DIR-P ++ SYSTEM::SETUP-INFO SYSTEM::S-DATA-TYPE ++ ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS ++ SYSTEM::PRINT-SYMBOL-APROPOS SYSTEM::S-DATA-FROZEN ++ SYSTEM::REAL-ASINH ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS ++ SLOOP::PARSE-NO-BODY SYSTEM::INSPECT-STRING SYSTEM::PRINT-FRS ++ SYSTEM::LEAP-YEAR-P SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE ++ SYSTEM::RESTART-INTERACTIVE-FUNCTION ++ SYSTEM::S-DATA-SLOT-DESCRIPTIONS SYSTEM::S-DATA-STATICP ++ SYSTEM::INSPECT-STRUCTURE COMMON-LISP::ASINH ++ ANSI-LOOP::LOOP-PATH-USER-DATA SYSTEM::RE-QUOTE-STRING ++ SYSTEM::MLP SYSTEM::GET-STRING-INPUT-STREAM-INDEX ++ SYSTEM::INFO-GET-FILE COMMON-LISP::EIGHTH ++ SYSTEM::SHOW-BREAK-POINT SYSTEM::SIMPLE-ARRAY-P ++ COMMON-LISP::RESTART-NAME SLOOP::POINTER-FOR-COLLECT ++ COMMON-LISP::PHASE SYSTEM::LNP ++ SYSTEM::REWRITE-RESTART-CASE-CLAUSE ++ SLOOP::LOOP-COLLECT-KEYWORD-P SYSTEM::S-DATA-HAS-HOLES ++ SYSTEM::EVAL-FEATURE ANSI-LOOP::DESTRUCTURING-SIZE ++ COMMON-LISP::BROADCAST-STREAM-STREAMS ++ ANSI-LOOP::LOOP-PATH-FUNCTION COMMON-LISP::BYTE-POSITION ++ ANSI-LOOP::LOOP-MINIMAX-TYPE COMMON-LISP::TANH ++ SYSTEM::BKPT-FILE SYSTEM::FRS-KIND ++ SYSTEM::S-DATA-PRINT-FUNCTION SYSTEM::UNIQUE-ID ++ SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::INSPECT-PACKAGE ++ ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA SYSTEM::BKPT-FILE-LINE ++ ANSI-LOOP::LOOP-EMIT-BODY SYSTEM::PATCH-SHARP ++ ANSI-LOOP::LOOP-COLLECTOR-P SYSTEM::DIR-CONJ ++ SYSTEM::CHECK-TRACE-SPEC ANSI-LOOP::LOOP-COLLECTOR-HISTORY ++ ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS SYSTEM::FIX-LOAD-PATH ++ ANSI-LOOP::LOOP-COLLECTOR-NAME SYSTEM::PATH-STREAM-NAME ++ SLOOP::LOOP-LET-BINDINGS ANSI-LOOP::LOOP-TYPED-INIT ++ FPE::ST-LOOKUP SYSTEM::IHS-VISIBLE SYSTEM::INFO-GET-TAGS ++ SYSTEM::EXPAND-HOME-DIR SYSTEM::DM-KEY-NOT-ALLOWED ++ ANSI-LOOP::LOOP-UNIVERSE-P ++ SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY ++ COMMON-LISP::CONSTANTLY SYSTEM::WILD-NAMESTRING-P ++ SYSTEM::INSPECT-NUMBER SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P ++ COMMON-LISP::FOURTH SYSTEM::NODES-FROM-INDEX ++ SYSTEM::LOGICAL-PATHNAME-HOST-P SYSTEM::S-DATA-NAMED ++ COMMON-LISP::INVOKE-DEBUGGER SYSTEM::INSPECT-VECTOR ++ SYSTEM::VERSION-PARSE SYSTEM::WILD-PATH-ELEMENT-P ++ SLOOP::RETURN-SLOOP-MACRO SYSTEM::REGEXP-CONV ++ SYSTEM::NUMBER-OF-DAYS-FROM-1900 ++ COMMON-LISP::ECHO-STREAM-INPUT-STREAM SYSTEM::CHDIR ++ SYSTEM::DBL-RPL-LOOP COMMON-LISP::ASIN COMMON-LISP::RATIONAL ++ ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED ++ COMMON-LISP::NAMESTRING SYSTEM::TRACE-ONE-PREPROCESS ++ SYSTEM::TERMINAL-INTERRUPT SYSTEM::SEQTYPE SYSTEM::S-DATA-RAW ++ SYSTEM::GET-NEXT-VISIBLE-FUN FPE::XMM-LOOKUP ++ SYSTEM::MAKE-KCL-TOP-RESTART ANSI-LOOP::LOOP-MINIMAX-P ++ ANSI-LOOP::LOOP-MAXMIN-COLLECTION ++ COMMON-LISP::COMPILER-MACRO-FUNCTION SYSTEM::BKPT-FUNCTION ++ SYSTEM::DIRECTORY-LIST-CHECK SYSTEM::S-DATA-SLOT-POSITION ++ SYSTEM::SHORT-NAME SYSTEM::DBL-EVAL ++ ANSI-LOOP::LOOP-COLLECTOR-DATA SYSTEM::S-DATA-DOCUMENTATION ++ ANSI-LOOP::LOOP-EMIT-FINAL-VALUE COMMON-LISP::NINTH ++ SYSTEM::CHECK-DECLARATIONS ANSI-LOOP::LOOP-PATH-NAMES ++ COMMON-LISP::LOGICAL-PATHNAME COMMON-LISP::SIGNUM ++ COMMON-LISP::FIND-ALL-SYMBOLS COMMON-LISP::FIFTH ++ SYSTEM::S-DATA-P ANSI-LOOP::LOOP-CONSTANTP SYSTEM::IDESCRIBE ++ SYSTEM::BKPT-FORM ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE ++ SLOOP::SLOOP-SLOOP-MACRO SYSTEM::NEXT-STACK-FRAME ++ SYSTEM::INSPECT-CONS SYSTEM::KNOWN-TYPE-P ++ SYSTEM::RESET-TRACE-DECLARATIONS COMMON-LISP::SINH ++ ANSI-LOOP::LOOP-PATH-P COMMON-LISP::PROVIDE ++ SYSTEM::INSPECT-SYMBOL SYSTEM::FIND-DOCUMENTATION ++ ANSI-LOOP::LOOP-MAKE-DESETQ COMMON-LISP::TENTH ++ SYSTEM::MAKE-DEFPACKAGE-FORM COMMON-LISP::FILE-WRITE-DATE ++ COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM ++ COMMON-LISP::TRUENAME COMMON-LISP::COMPLEMENT ++ COMMON-LISP::FIRST ANSI-LOOP::LOOP-COLLECTOR-CLASS ++ ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS COMMON-LISP::ATANH ++ SYSTEM::LOGICAL-PATHNAMEP COMMON-LISP::DIRECTORY-NAMESTRING ++ SYSTEM::RESTART-P ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE ++ SYSTEM::FIND-KCL-TOP-RESTART COMMON-LISP::FILE-NAMESTRING ++ COMMON-LISP::STREAM-EXTERNAL-FORMAT COMMON-LISP::SECOND ++ COMMON-LISP::FILE-LENGTH SYSTEM::INSTREAM-STREAM ++ ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE COMMON-LISP::PATHNAME ++ SYSTEM::DO-F COMMON-LISP::FILE-AUTHOR ++ SYSTEM::LOAD-PATHNAME-EXISTS SLOOP::AVERAGING-SLOOP-MACRO ++ ANSI-LOOP::LOOP-CONSTRUCT-RETURN ANSI-LOOP::LOOP-UNIVERSE-ANSI ++ ANSI-LOOP::LOOP-PSEUDO-BODY SLOOP::PARSE-LOOP ++ ANSI-LOOP::LOOP-HACK-ITERATION SYSTEM::S-DATA-CONC-NAME ++ SYSTEM::SEARCH-STACK ANSI-LOOP::LOOP-DO-THEREIS ++ COMMON-LISP::BYTE-SIZE ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE ++ COMMON-LISP::ACOSH SYSTEM::GET-PATH ++ COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS ++ SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::ENSURE-DIR-STRING ++ SYSTEM::FREEZE-DEFSTRUCT SYSTEM::PRINT-IHS ++ SYSTEM::INSPECT-CHARACTER COMMON-LISP::ARRAY-DIMENSIONS ++ SLOOP::PARSE-LOOP-INITIALLY SYSTEM::COMPUTING-ARGS-P ++ SYSTEM::INSTREAM-STREAM-NAME SYSTEM::PROCESS-ARGS FPE::GREF ++ SYSTEM::S-DATA-NAME ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS ++ SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::S-DATA-INCLUDED ++ SYSTEM::WALK-THROUGH SYSTEM::RESTART-FUNCTION ++ SLOOP::TRANSLATE-NAME ++ ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED ++ COMMON-LISP::SEVENTH COMMON-LISP::CIS FPE::LOOKUP ++ COMMON-LISP::COSH COMMON-LISP::VECTOR-POP SYSTEM::IHS-FNAME ++ SYSTEM::BREAK-BACKWARD-SEARCH-STACK SLOOP::REPEAT-SLOOP-MACRO ++ COMMON-LISP::PROBE-FILE ANSI-LOOP::LOOP-LIST-COLLECTION ++ SYSTEM::CONTEXT-P COMMON-LISP::SIXTH SYSTEM::NC ++ SYSTEM::MAKE-FRAME COMMON-LISP::COMPILE-FILE-PATHNAME ++ SYSTEM::INFO-NODE-FROM-POSITION SYSTEM::NODE-OFFSET ++ SYSTEM::RESTART-TEST-FUNCTION SYSTEM::ALOAD ++ ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS ++ ANSI-LOOP::LOOP-COLLECTOR-DTYPE SYSTEM::S-DATA-OFFSET ++ SYSTEM::SHOW-ENVIRONMENT COMMON-LISP::SYNONYM-STREAM-SYMBOL ++ SYSTEM::INSPECT-ARRAY ANSI-LOOP::LOOP-MAKE-PSETQ)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- COMMON-LISP::HASH-TABLE) +- SYSTEM::CONTEXT-SPICE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ SYSTEM::BREAK-QUIT SYSTEM::DBL-BACKTRACE ++ SYSTEM::BREAK-PREVIOUS SYSTEM::INFO-ERROR SYSTEM::BREAK-VS ++ SYSTEM::BREAK-LOCAL SYSTEM::IHS-BACKTRACE ++ ANSI-LOOP::LOOP-OPTIONAL-TYPE SYSTEM::BREAK-NEXT ++ COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-BDS ++ COMMON-LISP::CONTINUE SYSTEM::SHOW-BREAK-VARIABLES)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::OR COMMON-LISP::NULL +- COMMON-LISP::HASH-TABLE)) +- SYSTEM::CONTEXT-HASH)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- ANSI-LOOP::DUPLICATABLE-CODE-P SYSTEM::RELATIVE-LINE +- SYSTEM::LENEL SYSTEM::GET-NODE-INDEX SYSTEM::FASLINK +- SYSTEM::THE-END)) ++ (COMMON-LISP::VECTOR COMMON-LISP::T)) ++ SYSTEM::CONTEXT-VEC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) + COMMON-LISP::T) +- SLOOP::IN-PACKAGE-SLOOP-MAP SLOOP::DESETQ1 +- COMMON-LISP::LOGANDC2 ANSI-LOOP::MAKE-LOOP-MINIMAX +- COMMON-LISP::WRITE-BYTE SYSTEM::MATCH-DIMENSIONS +- SLOOP::IN-CAREFULLY-SLOOP-FOR SLOOP::SUM-SLOOP-COLLECT +- SYSTEM::DOT-DIR-P SLOOP::IN-FRINGE-SLOOP-MAP +- SLOOP::COLLATE-SLOOP-COLLECT ANSI-LOOP::LOOP-TMEMBER +- FPE::READ-OPERANDS SYSTEM::IN-INTERVAL-P SYSTEM::SUBSTRINGP +- FPE::PAREN-READER ANSI-LOOP::HIDE-VARIABLE-REFERENCES +- SYSTEM::QUOTATION-READER SYSTEM::ALL-MATCHES SYSTEM::GET-MATCH +- SYSTEM::ADD-FILE ANSI-LOOP::LOOP-DO-ALWAYS SLOOP::THE-TYPE +- SYSTEM::?PUSH SYSTEM::INCREMENT-CURSOR +- SYSTEM::CHECK-SEQ-START-END SLOOP::MAKE-VALUE +- SLOOP::THEREIS-SLOOP-COLLECT ANSI-LOOP::LOOP-DO-WHILE +- COMMON-LISP::COERCE ANSI-LOOP::LOOP-TEQUAL +- ANSI-LOOP::LOOP-DECLARE-VARIABLE COMMON-LISP::LOGNAND +- COMMON-LISP::LOGORC1 SYSTEM::BREAK-STEP-NEXT +- SLOOP::LOGXOR-SLOOP-COLLECT COMMON-LISP::LOGNOR +- COMPILER::COMPILER-DEF-HOOK ANSI-LOOP::LOOP-TASSOC +- SYSTEM::GET-LINE-OF-FORM SLOOP::MAXIMIZE-SLOOP-COLLECT +- ANSI-LOOP::LOOP-DO-IF SYSTEM::SETF-EXPAND SYSTEM::DM-V +- SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::NTHCDR +- SYSTEM::CONDITION-PASS SYSTEM::DISPLAY-COMPILED-ENV +- COMMON-LISP::LDB-TEST ANSI-LOOP::LOOP-MAYBE-BIND-FORM +- SYSTEM::SUPER-GO SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS +- FPE::RF SYSTEM::SUB-INTERVAL-P SYSTEM::LEFT-PARENTHESIS-READER +- COMMON-LISP::FILE-STRING-LENGTH SYSTEM::OBJLT SYSTEM::MSUB +- SYSTEM::COERCE-TO-STRING SYSTEM::SAFE-EVAL +- SYSTEM::SET-PATH-STREAM-NAME SYSTEM::SET-BACK +- ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION COMMON-LISP::LOGTEST +- SYSTEM::*BREAK-POINTS* SLOOP::=-SLOOP-FOR +- SLOOP::MINIMIZE-SLOOP-COLLECT SYSTEM::KEYWORD-SUPPLIED-P +- SLOOP::COUNT-SLOOP-COLLECT FPE::%-READER COMMON-LISP::LOGORC2 +- SYSTEM::SEQUENCE-CURSOR SYSTEM::LOOKUP-KEYWORD +- COMMON-LISP::BYTE SYSTEM::PARSE-SLOT-DESCRIPTION +- COMMON-LISP::LOGANDC1 SYSTEM::DM-NTH-CDR FPE::0-READER +- SLOOP::L-EQUAL SYSTEM::LIST-DELQ SYSTEM::DM-NTH +- COMMON-LISP::LDB SYSTEM::SETF-HELPER +- SLOOP::NEVER-SLOOP-COLLECT SLOOP::PARSE-LOOP-MAP +- COMMON-LISP::NTH SYSTEM::BREAK-STEP-INTO +- SYSTEM::GET-INFO-CHOICES SLOOP::IN-TABLE-SLOOP-MAP +- SYSTEM::GET-NODES COMMON-LISP::VECTOR-PUSH +- COMMON-LISP::PATHNAME-MATCH-P SYSTEM::DBL-UP +- ANSI-LOOP::LOOP-LOOKUP-KEYWORD FPE::READ-INSTRUCTION +- SLOOP::ALWAYS-SLOOP-COLLECT SYSTEM::SET-DIR SYSTEM::INFO-AUX +- SYSTEM::DISPLAY-ENV COMMON-LISP::DOCUMENTATION +- SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS)) ++ SYSTEM::RESET-SYS-PATHS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMMON-LISP::APROPOS ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE +- COMMON-LISP::FFLOOR SYSTEM::PRINT-DOC SYSTEM::INFO +- SYSTEM::PARSE-BODY-HEADER COMMON-LISP::INVOKE-RESTART +- SYSTEM::BREAK-FUNCTION SYSTEM::SHOW-INFO COMMON-LISP::FROUND +- COMMON-LISP::GET-SETF-EXPANSION COMMON-LISP::PARSE-NAMESTRING +- SYSTEM::APROPOS-DOC COMMON-LISP::ENSURE-DIRECTORIES-EXIST +- COMMON-LISP::USE-VALUE COMMON-LISP::READ-FROM-STRING +- COMMON-LISP::FTRUNCATE COMMON-LISP::STORE-VALUE +- SYSTEM::STEPPER SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE +- COMMON-LISP::APROPOS-LIST COMMON-LISP::FCEILING +- COMMON-LISP::WRITE-TO-STRING +- COMMON-LISP::DECODE-UNIVERSAL-TIME)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::MAYBE-BREAK SYSTEM::MME3 SYSTEM::FIND-LINE-IN-FUN ++ SYSTEM::SETF-STRUCTURE-ACCESS SYSTEM::EXPAND-RANGE ++ SYSTEM::MINMAX SYSTEM::COERCE-TO-CONDITION ++ SLOOP::FIRST-SLOOP-FOR SLOOP::FIRST-USE-SLOOP-FOR ++ SYSTEM::DO-BREAK-LEVEL SYSTEM::ELSUB ++ ANSI-LOOP::LOOP-FOR-ARITHMETIC SYSTEM::CALL-TEST ++ SYSTEM::ELEMENT SYSTEM::LOAD-PATHNAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::SETF-EXPAND-1 SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS +- SYSTEM::WARN-VERSION ANSI-LOOP::LOOP-TRANSLATE +- ANSI-LOOP::LOOP-FOR-IN ANSI-LOOP::PRINT-LOOP-UNIVERSE +- ANSI-LOOP::LOOP-STANDARD-EXPANSION +- ANSI-LOOP::LOOP-ANSI-FOR-EQUALS SYSTEM::DM-VL +- SYSTEM::SHARP-A-READER COMMON-LISP::DEPOSIT-FIELD +- SYSTEM::RESTART-CASE-EXPRESSION-CONDITION +- SYSTEM::APPLY-DISPLAY-FUN ANSI-LOOP::HIDE-VARIABLE-REFERENCE +- SYSTEM::FLOATING-POINT-ERROR SYSTEM::GET-SLOT-POS ++ SYSTEM::SHARP-P-READER ANSI-LOOP::HIDE-VARIABLE-REFERENCE ++ SYSTEM::CHECK-TRACE-ARGS SYSTEM::SHARP-U-READER ++ SYSTEM::FLOATING-POINT-ERROR ANSI-LOOP::LOOP-FOR-IN ++ COMMON-LISP::DEPOSIT-FIELD SYSTEM::GET-SLOT-POS ++ SYSTEM::SHARP-A-READER SYSTEM::SHARP-V-READER ++ SYSTEM::PATHNAME-PARSE ++ SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS SYSTEM::SETF-EXPAND-1 ++ COMMON-LISP::DPB SYSTEM::RESTART-CASE-EXPRESSION-CONDITION ++ SYSTEM::CHECK-S-DATA ANSI-LOOP::LOOP-FOR-BEING ++ SYSTEM::TO-REGEXP-OR-NAMESTRING SYSTEM::APPLY-DISPLAY-FUN ++ ANSI-LOOP::LOOP-ANSI-FOR-EQUALS ANSI-LOOP::LOOP-SUM-COLLECTION ++ ANSI-LOOP::LOOP-FOR-ON SYSTEM::MFR ++ ANSI-LOOP::LOOP-STANDARD-EXPANSION SYSTEM::PROG?* + ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE +- SYSTEM::MAKE-BREAK-POINT SYSTEM::SHARP-V-READER +- SYSTEM::TO-REGEXP-OR-NAMESTRING ANSI-LOOP::LOOP-FOR-ON +- SYSTEM::SHARP-U-READER ANSI-LOOP::LOOP-SUM-COLLECTION +- SYSTEM::SHARP-P-READER SYSTEM::MAKE-T-TYPE +- ANSI-LOOP::LOOP-FOR-ACROSS SYSTEM::MFR SYSTEM::RECURSE-DIR +- SYSTEM::PATHNAME-PARSE ANSI-LOOP::LOOP-FOR-BEING +- COMMON-LISP::DPB SYSTEM::SHARP-DQ-READER +- SYSTEM::CHECK-TRACE-ARGS SYSTEM::DEFMACRO* +- SYSTEM::CHECK-S-DATA FPE::REF)) ++ SYSTEM::SHARP-DQ-READER SYSTEM::RECURSE-DIR SYSTEM::DM-VL ++ ANSI-LOOP::LOOP-FOR-ACROSS ANSI-LOOP::PRINT-LOOP-UNIVERSE ++ SYSTEM::WARN-VERSION ANSI-LOOP::LOOP-TRANSLATE ++ SYSTEM::DEFMACRO* SYSTEM::MAKE-BREAK-POINT SYSTEM::MAKE-T-TYPE ++ FPE::REF)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ SYSTEM::MME2 COMMON-LISP::SUBSTITUTE-IF-NOT ++ ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH ++ COMMON-LISP::SUBSTITUTE SYSTEM::WALK-DIR ++ SYSTEM::CHECK-TYPE-SYMBOL COMMON-LISP::TRANSLATE-PATHNAME ++ ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH ++ COMMON-LISP::MAP ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH ++ ANSI-LOOP::ADD-LOOP-PATH SLOOP::LOOP-DECLARE-BINDING ++ SYSTEM::COMPLETE-PROP SYSTEM::MATCH-COMPONENT ++ COMMON-LISP::NSUBSTITUTE COMMON-LISP::NSUBSTITUTE-IF ++ COMMON-LISP::SUBSTITUTE-IF COMMON-LISP::NSUBSTITUTE-IF-NOT ++ SYSTEM::PUSH-LET-BINDING ANSI-LOOP::LOOP-MAKE-VARIABLE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- SYSTEM::FIND-IHS COMMON-LISP::NSET-DIFFERENCE +- COMMON-LISP::BIT-NAND SYSTEM::BREAK-CALL +- COMMON-LISP::COUNT-IF-NOT COMMON-LISP::DELETE +- SYSTEM::INTERNAL-COUNT COMMON-LISP::BIT-ORC1 +- COMMON-LISP::DELETE-IF COMMON-LISP::BIT-ANDC1 +- SYSTEM::VECTOR-PUSH-STRING COMMON-LISP::MISMATCH +- COMMON-LISP::NOTEVERY SYSTEM::PROCESS-ERROR COMMON-LISP::TYPEP +- COMMON-LISP::BIT-IOR COMMON-LISP::BIT-EQV +- COMMON-LISP::COUNT-IF COMMON-LISP::REMOVE-IF +- COMMON-LISP::EVERY COMMON-LISP::POSITION-IF-NOT +- COMMON-LISP::ADJUST-ARRAY COMMON-LISP::VECTOR-PUSH-EXTEND +- SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::COUNT +- COMMON-LISP::DELETE-IF-NOT COMMON-LISP::NINTERSECTION +- COMMON-LISP::FIND-IF-NOT COMMON-LISP::BIT-ORC2 +- COMMON-LISP::SUBSETP COMMON-LISP::SOME SYSTEM::WREADDIR +- COMMON-LISP::SET-DIFFERENCE COMMON-LISP::UNION +- COMMON-LISP::BIT-XOR SLOOP::PARSE-LOOP-MACRO +- COMMON-LISP::REPLACE COMMON-LISP::REMOVE +- SLOOP::LOOP-ADD-BINDING COMMON-LISP::BIT-ANDC2 +- COMMON-LISP::READ-SEQUENCE COMMON-LISP::CERROR +- COMMON-LISP::INTERSECTION COMMON-LISP::POSITION-IF +- ANSI-LOOP::LOOP-CHECK-DATA-TYPE SYSTEM::INTERNAL-COUNT-IF +- COMMON-LISP::NUNION COMMON-LISP::WRITE-SEQUENCE +- COMMON-LISP::MAP-INTO COMMON-LISP::MAKE-SEQUENCE +- COMMON-LISP::SET-EXCLUSIVE-OR SLOOP::IN-ARRAY-SLOOP-FOR +- COMMON-LISP::FIND-IF COMMON-LISP::SEARCH COMMON-LISP::FILL +- COMMON-LISP::FIND COMMON-LISP::NOTANY +- COMMON-LISP::NSET-EXCLUSIVE-OR COMMON-LISP::BIT-NOR +- COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::POSITION +- COMMON-LISP::BIT-AND)) ++ COMMON-LISP::DELETE-IF-NOT COMMON-LISP::FILL ++ COMMON-LISP::SET-EXCLUSIVE-OR ANSI-LOOP::LOOP-CHECK-DATA-TYPE ++ SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::SOME ++ COMMON-LISP::COUNT COMMON-LISP::NOTANY SYSTEM::INTERNAL-COUNT ++ COMMON-LISP::POSITION-IF-NOT COMMON-LISP::SET-DIFFERENCE ++ SLOOP::IN-ARRAY-SLOOP-FOR COMMON-LISP::NUNION ++ COMMON-LISP::BIT-NAND SYSTEM::PROCESS-ERROR ++ COMMON-LISP::BIT-ANDC2 COMMON-LISP::POSITION-IF ++ COMMON-LISP::NSET-DIFFERENCE COMMON-LISP::WRITE-SEQUENCE ++ COMMON-LISP::BIT-XOR COMMON-LISP::READ-SEQUENCE ++ COMMON-LISP::DELETE-IF COMMON-LISP::MAP-INTO ++ COMMON-LISP::SUBSETP COMMON-LISP::REMOVE-IF-NOT ++ COMMON-LISP::FIND-IF COMMON-LISP::INTERSECTION ++ COMMON-LISP::REPLACE COMMON-LISP::VECTOR-PUSH-EXTEND ++ COMMON-LISP::BIT-ORC2 COMMON-LISP::POSITION ++ COMMON-LISP::CERROR COMMON-LISP::FIND COMMON-LISP::BIT-ORC1 ++ SYSTEM::BREAK-CALL SLOOP::PARSE-LOOP-MACRO COMMON-LISP::EVERY ++ COMMON-LISP::COUNT-IF-NOT COMMON-LISP::ADJUST-ARRAY ++ COMMON-LISP::SEARCH COMMON-LISP::REMOVE-IF ++ COMMON-LISP::NOTEVERY COMMON-LISP::TYPEP COMMON-LISP::COUNT-IF ++ SYSTEM::WREADDIR SYSTEM::INTERNAL-COUNT-IF COMMON-LISP::DELETE ++ COMMON-LISP::NSET-EXCLUSIVE-OR COMMON-LISP::UNION ++ COMMON-LISP::BIT-EQV COMMON-LISP::NINTERSECTION ++ COMMON-LISP::MISMATCH SYSTEM::FIND-IHS COMMON-LISP::REMOVE ++ SYSTEM::VECTOR-PUSH-STRING COMMON-LISP::BIT-IOR ++ COMMON-LISP::FIND-IF-NOT COMMON-LISP::MAKE-SEQUENCE ++ COMMON-LISP::BIT-ANDC1 SLOOP::LOOP-ADD-BINDING ++ COMMON-LISP::BIT-NOR COMMON-LISP::BIT-AND)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::FIND-LINE-IN-FUN ANSI-LOOP::LOOP-FOR-ARITHMETIC +- SYSTEM::EXPAND-RANGE SYSTEM::MAYBE-BREAK SYSTEM::MINMAX +- SLOOP::FIRST-USE-SLOOP-FOR SLOOP::FIRST-SLOOP-FOR +- SYSTEM::SETF-STRUCTURE-ACCESS SYSTEM::DO-BREAK-LEVEL +- SYSTEM::CALL-TEST SYSTEM::ELEMENT SYSTEM::LOAD-PATHNAME +- SYSTEM::COERCE-TO-CONDITION SYSTEM::ELSUB)) ++ SYSTEM::DO-ARG-COUNT-ERROR SYSTEM::PUSH-SUB-LIST-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SLOOP::DEF-LOOP-INTERNAL COMMON-LISP::MERGE +- SYSTEM::PRINT-STACK-FRAME)) ++ SYSTEM::MAKE-PREDICATE SYSTEM::DO?* SYSTEM::MAKE-CONSTRUCTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- COMMON-LISP::ENCODE-UNIVERSAL-TIME)) ++ ANSI-LOOP::LOOP-SEQUENCER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH +- SYSTEM::COMPLETE-PROP SYSTEM::CHECK-TYPE-SYMBOL +- COMMON-LISP::NSUBSTITUTE +- ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH COMMON-LISP::SUBSTITUTE +- COMMON-LISP::TRANSLATE-PATHNAME COMMON-LISP::NSUBSTITUTE-IF +- COMMON-LISP::MAP SLOOP::LOOP-DECLARE-BINDING SYSTEM::WALK-DIR +- SYSTEM::MATCH-COMPONENT ANSI-LOOP::LOOP-MAKE-VARIABLE +- ANSI-LOOP::ADD-LOOP-PATH COMMON-LISP::SUBSTITUTE-IF +- COMMON-LISP::NSUBSTITUTE-IF-NOT SYSTEM::MME2 +- ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH +- COMMON-LISP::SUBSTITUTE-IF-NOT SYSTEM::PUSH-LET-BINDING)) ++ SYSTEM::EXPAND-WILD-DIRECTORY SLOOP::DEF-LOOP-INTERNAL ++ COMMON-LISP::MERGE SYSTEM::PRINT-STACK-FRAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -243,88 +286,120 @@ + (COMMON-LISP::INTEGER -9223372036854775808 + 9223372036854775807)) + COMMON-LISP::T) +- SYSTEM::SHARP-SHARP-READER SYSTEM::SHARP-EQ-READER)) ++ SYSTEM::SHARP-EQ-READER SYSTEM::SHARP-SHARP-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) + COMMON-LISP::T) +- SYSTEM::DO-ARG-COUNT-ERROR SYSTEM::PUSH-SUB-LIST-BINDING)) ++ COMMON-LISP::ENCODE-UNIVERSAL-TIME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- SYSTEM::MAKE-CONSTRUCTOR SYSTEM::MAKE-PREDICATE)) ++ SYSTEM::UNIVERSAL-ERROR-HANDLER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::PARSE-DEFMACRO SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::SUBST COMMON-LISP::SUBST-IF-NOT ++ COMMON-LISP::SUBST-IF SYSTEM::MASET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::READ-INSPECT-COMMAND SYSTEM::RESTART-PRINT ++ ANSI-LOOP::LOOP-GET-COLLECTION-INFO SYSTEM::SHARP-+-READER ++ SYSTEM::VERIFY-KEYWORDS SYSTEM::SHARP-S-READER ++ SYSTEM::LIST-MERGE-SORT SYSTEM::SHARP---READER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::PARSE-BODY COMMON-LISP::SORT ++ SLOOP::FIND-IN-ORDERED-LIST COMMON-LISP::REDUCE ++ COMMON-LISP::STABLE-SORT COMMON-LISP::SUBTYPEP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) +- COMMON-LISP::T) +- ANSI-LOOP::LOOP-SEQUENCER)) ++ COMMON-LISP::*) ++ SYSTEM::TRACE-CALL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- SYSTEM::UNIVERSAL-ERROR-HANDLER)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(SYSTEM::SI-FIND-CLASS SYSTEM::WARNINGP SYSTEM::SI-CLASS-OF +- SYSTEM::CONDITION-CLASS-P SYSTEM::UNTRACE-ONE +- SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SIMPLE-CONDITION-CLASS-P +- SYSTEM::CONDITIONP SYSTEM::AUTOLOAD +- SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASSP +- FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS SYSTEM::TRACE-ONE +- SYSTEM::AUTOLOAD-MACRO SYSTEM::DEFINE-STRUCTURE +- SYSTEM::SI-CLASS-NAME)) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::PUSH-OPTIONAL-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- SYSTEM::INSTREAM-NAME ANSI-LOOP::LOOP-LIST-STEP +- COMMON-LISP::PRIN1-TO-STRING ANSI-LOOP::NAMED-VARIABLE +- SYSTEM::WAITING SYSTEM::FIND-DECLARATIONS COMMON-LISP::INSPECT +- SYSTEM::END-WAITING SYSTEM::BREAK-GO SYSTEM::INFO-SUBFILE +- COMMON-LISP::INVOKE-RESTART-INTERACTIVELY +- ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES SYSTEM::INSPECT-OBJECT +- SYSTEM::BREAK-LEVEL-INVOKE-RESTART SYSTEM::EXPAND-RANGES +- SYSTEM::GET-&ENVIRONMENT COMMON-LISP::DESCRIBE +- COMMON-LISP::PRINC-TO-STRING)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ SYSTEM::MAKE-CONTEXT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE ++ ANSI-LOOP::MAKE-LOOP-UNIVERSE SYSTEM::MAKE-S-DATA ++ SYSTEM::NEXT-MATCH COMMON-LISP::USER-HOMEDIR-PATHNAME ++ SYSTEM::STEP-NEXT ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL ++ COMMON-LISP::VECTOR SLOOP::PARSE-LOOP-WITH ++ COMMON-LISP::COMPUTE-RESTARTS COMMON-LISP::BREAK ++ ANSI-LOOP::MAKE-LOOP-PATH ANSI-LOOP::LOOP-GENTEMP ++ COMMON-LISP::ABORT COMMON-LISP::YES-OR-NO-P ++ SYSTEM::MAKE-INSTREAM SYSTEM::DBL-READ ++ SYSTEM::MAYBE-CLEAR-INPUT SYSTEM::MAKE-RESTART ++ ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL COMMON-LISP::Y-OR-N-P ++ SLOOP::PARSE-LOOP-DECLARE ANSI-LOOP::MAKE-LOOP-COLLECTOR ++ SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::STEP-INTO ++ SYSTEM::CURRENT-STEP-FUN COMMON-LISP::DRIBBLE ++ COMMON-LISP::MAKE-PATHNAME SYSTEM::BREAK-LOCALS SYSTEM::LOC ++ SYSTEM::TRANSFORM-KEYWORDS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- COMMON-LISP::ABORT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE +- SYSTEM::MAKE-S-DATA ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL +- ANSI-LOOP::MAKE-LOOP-PATH SYSTEM::CURRENT-STEP-FUN SYSTEM::LOC +- SYSTEM::DBL-READ SYSTEM::MAKE-RESTART +- SYSTEM::TRANSFORM-KEYWORDS COMMON-LISP::Y-OR-N-P +- SYSTEM::NEXT-MATCH COMMON-LISP::COMPUTE-RESTARTS +- SLOOP::PARSE-LOOP-WITH COMMON-LISP::VECTOR SYSTEM::STEP-NEXT +- ANSI-LOOP::MAKE-LOOP-COLLECTOR +- COMMON-LISP::USER-HOMEDIR-PATHNAME SLOOP::PARSE-LOOP-DECLARE +- COMMON-LISP::YES-OR-NO-P SYSTEM::STEP-INTO +- SYSTEM::MAKE-CONTEXT SYSTEM::BREAK-LOCALS +- SYSTEM::DESCRIBE-ENVIRONMENT COMMON-LISP::DRIBBLE +- ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL SYSTEM::MAYBE-CLEAR-INPUT +- COMMON-LISP::BREAK ANSI-LOOP::LOOP-GENTEMP +- ANSI-LOOP::MAKE-LOOP-UNIVERSE SYSTEM::MAKE-INSTREAM +- COMMON-LISP::MAKE-PATHNAME)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES ++ COMMON-LISP::PRIN1-TO-STRING SYSTEM::GET-&ENVIRONMENT ++ COMMON-LISP::INSPECT SYSTEM::BREAK-GO ++ SYSTEM::PARSE-BODY-HEADER COMMON-LISP::PRINC-TO-STRING ++ SYSTEM::EXPAND-RANGES ANSI-LOOP::NAMED-VARIABLE ++ ANSI-LOOP::LOOP-LIST-STEP SYSTEM::INSTREAM-NAME ++ SYSTEM::WAITING SYSTEM::END-WAITING COMMON-LISP::DESCRIBE ++ SYSTEM::INFO-SUBFILE SYSTEM::FIND-DECLARATIONS ++ SYSTEM::INSPECT-OBJECT SYSTEM::BREAK-LEVEL-INVOKE-RESTART ++ COMMON-LISP::INVOKE-RESTART-INTERACTIVELY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::FIXNUM) +- FPE::FE-ENABLE SYSTEM::DBL-WHAT-FRAME)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE ++ SYSTEM::S-DATA-LENGTH SYSTEM::THE-START)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::AUTOLOAD ++ SYSTEM::UNTRACE-ONE SYSTEM::TRACE-ONE SYSTEM::CONDITIONP ++ SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SI-CLASS-NAME ++ SYSTEM::SI-CLASSP SYSTEM::SI-CLASS-OF SYSTEM::SI-FIND-CLASS ++ SYSTEM::CONDITION-CLASS-P SYSTEM::AUTOLOAD-MACRO ++ SYSTEM::WARNINGP SYSTEM::DEFINE-STRUCTURE ++ FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS ++ SYSTEM::SIMPLE-CONDITION-CLASS-P)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -336,155 +411,9 @@ + SYSTEM::ROUND-UP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::FIXNUM) +- SYSTEM::ATOI)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- SYSTEM::REGEXP-CONV SYSTEM::DIR-CONJ SYSTEM::DIR-P +- ANSI-LOOP::LOOP-LIST-COLLECTION COMMON-LISP::COSH +- SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::INSPECT-CONS +- SYSTEM::KNOWN-TYPE-P SYSTEM::LNP COMMON-LISP::SEVENTH +- SYSTEM::BKPT-FUNCTION SYSTEM::WILD-DIR-ELEMENT-P +- COMMON-LISP::COMPILER-MACRO-FUNCTION +- ANSI-LOOP::LOOP-HACK-ITERATION +- COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM +- SYSTEM::DIRECTORY-LIST-CHECK COMMON-LISP::FILE-WRITE-DATE +- SYSTEM::NORMALIZE-TYPE COMMON-LISP::EIGHTH SYSTEM::TOGGLE-CASE +- SYSTEM::SHOW-ENVIRONMENT +- COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM SYSTEM::GET-PATH +- COMMON-LISP::ASINH SYSTEM::FIND-KCL-TOP-RESTART +- SYSTEM::RESTART-P SYSTEM::EVAL-FEATURE SYSTEM::ALOAD +- COMMON-LISP::PHASE SLOOP::SUBSTITUTE-SLOOP-BODY +- COMMON-LISP::ASIN SYSTEM::NODES-FROM-INDEX +- SYSTEM::MAKE-DEFPACKAGE-FORM ANSI-LOOP::LOOP-COLLECTOR-DTYPE +- SYSTEM::LOGICAL-PATHNAMEP SYSTEM::INSPECT-VECTOR +- ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS +- SYSTEM::RESTART-REPORT-FUNCTION SYSTEM::IHS-VISIBLE +- SLOOP::LOOP-COLLECT-KEYWORD-P ANSI-LOOP::LOOP-TYPED-INIT +- COMMON-LISP::VECTOR-POP SYSTEM::UNIQUE-ID +- ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS +- SYSTEM::SIMPLE-ARRAY-P COMMON-LISP::ACOS SYSTEM::DBL-EVAL +- SYSTEM::INSPECT-STRING SYSTEM::MLP +- SYSTEM::INSTREAM-STREAM-NAME SYSTEM::WILD-NAMESTRING-P +- ANSI-LOOP::LOOP-PATH-FUNCTION +- SYSTEM::GET-STRING-INPUT-STREAM-INDEX +- ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE SYSTEM::SEQTYPE +- ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS +- SYSTEM::BEST-ARRAY-ELEMENT-TYPE +- ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA SYSTEM::S-DATA-FROZEN +- SYSTEM::S-DATA-DOCUMENTATION SYSTEM::DWIM COMMON-LISP::SIGNUM +- SYSTEM::FIND-DOCUMENTATION ANSI-LOOP::LOOP-COLLECTOR-HISTORY +- ANSI-LOOP::LOOP-MAKE-PSETQ FPE::GREF SYSTEM::S-DATA-OFFSET +- SYSTEM::WILD-PATH-ELEMENT-P SYSTEM::INSTREAM-P +- COMMON-LISP::DIRECTORY-NAMESTRING SYSTEM::INSPECT-ARRAY +- COMMON-LISP::ARRAY-DIMENSIONS +- ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS ANSI-LOOP::LOOP-MINIMAX-P +- SLOOP::RETURN-SLOOP-MACRO SYSTEM::WALK-THROUGH +- SYSTEM::NEXT-STACK-FRAME SYSTEM::S-DATA-NAME COMMON-LISP::TANH +- SYSTEM::BREAK-BACKWARD-SEARCH-STACK COMMON-LISP::TENTH +- SYSTEM::INFO-NODE-FROM-POSITION FPE::ST-LOOKUP +- COMMON-LISP::RESTART-NAME SYSTEM::S-DATA-TYPE +- SYSTEM::BKPT-FILE-LINE COMMON-LISP::FIND-ALL-SYMBOLS +- COMMON-LISP::FIFTH SLOOP::LOOP-LET-BINDINGS +- COMMON-LISP::ECHO-STREAM-INPUT-STREAM +- ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED +- COMMON-LISP::PROBE-FILE SYSTEM::MAKE-FRAME +- SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::SEARCH-STACK +- COMMON-LISP::COMPILE-FILE-PATHNAME +- SYSTEM::PRINT-SYMBOL-APROPOS COMMON-LISP::LOGNOT +- SYSTEM::INFO-GET-TAGS SYSTEM::SHORT-NAME +- ANSI-LOOP::LOOP-MINIMAX-TYPE COMMON-LISP::SIXTH +- COMMON-LISP::SECOND ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS +- COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM +- SYSTEM::S-DATA-INCLUDES SYSTEM::RESTART-INTERACTIVE-FUNCTION +- SLOOP::TRANSLATE-NAME SYSTEM::PATCH-SHARP COMMON-LISP::ABS +- ANSI-LOOP::LOOP-CONSTANTP SYSTEM::LEAP-YEAR-P +- ANSI-LOOP::LOOP-UNIVERSE-ANSI ANSI-LOOP::LOOP-EMIT-BODY +- COMMON-LISP::HOST-NAMESTRING COMMON-LISP::FIRST +- SYSTEM::INSERT-BREAK-POINT +- COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS +- COMMON-LISP::DELETE-FILE ANSI-LOOP::LOOP-PSEUDO-BODY +- SYSTEM::GET-NEXT-VISIBLE-FUN SYSTEM::S-DATA-HAS-HOLES +- ANSI-LOOP::LOOP-COLLECTOR-NAME COMMON-LISP::FOURTH +- SYSTEM::BKPT-FILE SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY +- SYSTEM::INSTREAM-STREAM SYSTEM::PNL1 SYSTEM::IHS-FNAME +- SYSTEM::S-DATA-SLOT-POSITION SLOOP::PARSE-LOOP +- SYSTEM::CHECK-TRACE-SPEC SYSTEM::S-DATA-CONSTRUCTORS +- SYSTEM::S-DATA-STATICP SYSTEM::CONTEXT-P +- COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS +- SYSTEM::INFO-GET-FILE COMMON-LISP::COMPLEMENT +- SYSTEM::INSPECT-NUMBER SYSTEM::RESET-TRACE-DECLARATIONS +- ANSI-LOOP::LOOP-PATH-P SLOOP::REPEAT-SLOOP-MACRO SYSTEM::DO-F +- SYSTEM::INSPECT-PACKAGE SYSTEM::PATH-STREAM-NAME +- SYSTEM::GET-INSTREAM COMMON-LISP::BYTE-SIZE +- SYSTEM::RESTART-FUNCTION FPE::LOOKUP SYSTEM::S-DATA-CONC-NAME +- COMMON-LISP::PROVIDE SYSTEM::S-DATA-NAMED SYSTEM::PRINT-FRS +- ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE SYSTEM::NODE-OFFSET +- ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::PRINT-IHS +- ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS COMMON-LISP::TRUENAME +- SYSTEM::BREAK-FORWARD-SEARCH-STACK +- COMMON-LISP::CONCATENATED-STREAM-STREAMS SYSTEM::VERSION-PARSE +- SYSTEM::INSPECT-CHARACTER SYSTEM::LOGICAL-PATHNAME-HOST-P +- SYSTEM::DM-BAD-KEY SYSTEM::EXPAND-HOME-DIR +- ANSI-LOOP::LOOP-PATH-USER-DATA +- ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::INSPECT-SYMBOL +- COMMON-LISP::INVOKE-DEBUGGER +- SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P +- COMMON-LISP::BYTE-POSITION COMMON-LISP::ISQRT COMMON-LISP::CIS +- ANSI-LOOP::LOOP-COLLECTOR-CLASS +- COMMON-LISP::SYNONYM-STREAM-SYMBOL ANSI-LOOP::LOOP-PATH-NAMES +- SYSTEM::RE-QUOTE-STRING SYSTEM::INSPECT-STRUCTURE +- COMMON-LISP::RATIONAL FPE::XMM-LOOKUP +- SYSTEM::REWRITE-RESTART-CASE-CLAUSE +- SYSTEM::S-DATA-PRINT-FUNCTION +- SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE SLOOP::SLOOP-SLOOP-MACRO +- COMMON-LISP::NAMESTRING SYSTEM::ENSURE-DIR-STRING +- COMMON-LISP::CONSTANTLY SLOOP::PARSE-LOOP-INITIALLY +- SYSTEM::S-DATA-RAW SYSTEM::ADD-TO-HOTLIST SYSTEM::FRS-KIND +- ANSI-LOOP::LOOP-MAXMIN-COLLECTION +- ANSI-LOOP::LOOP-COLLECTOR-DATA SYSTEM::PROCESS-ARGS +- SYSTEM::COERCE-SLASH-TERMINATED SYSTEM::MAKE-KCL-TOP-RESTART +- COMMON-LISP::ATANH ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD +- COMMON-LISP::SINH ANSI-LOOP::LOOP-UNIVERSE-P +- ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED +- SYSTEM::S-DATA-INCLUDED COMMON-LISP::STREAM-EXTERNAL-FORMAT +- SYSTEM::COMPUTING-ARGS-P SYSTEM::REAL-ASINH +- ANSI-LOOP::LOOP-CONSTRUCT-RETURN +- SYSTEM::S-DATA-SLOT-DESCRIPTIONS SYSTEM::FIX-LOAD-PATH +- SYSTEM::CHECK-DECLARATIONS +- ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS +- SLOOP::POINTER-FOR-COLLECT COMMON-LISP::LOGICAL-PATHNAME +- SYSTEM::CHDIR SYSTEM::IDESCRIBE +- ANSI-LOOP::LOOP-MINIMAX-OPERATIONS COMMON-LISP::ACOSH +- COMMON-LISP::NINTH ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE +- ANSI-LOOP::LOOP-COLLECTOR-P SYSTEM::S-DATA-P SYSTEM::BKPT-FORM +- COMMON-LISP::FILE-NAMESTRING SYSTEM::TERMINAL-INTERRUPT +- SYSTEM::SETUP-INFO SLOOP::PARSE-NO-BODY +- SYSTEM::DM-KEY-NOT-ALLOWED ANSI-LOOP::LOOP-EMIT-FINAL-VALUE +- SYSTEM::FREEZE-DEFSTRUCT SYSTEM::DBL-RPL-LOOP +- SYSTEM::TRACE-ONE-PREPROCESS +- COMMON-LISP::BROADCAST-STREAM-STREAMS COMMON-LISP::THIRD +- SLOOP::AVERAGING-SLOOP-MACRO SYSTEM::SHOW-BREAK-POINT +- COMMON-LISP::PATHNAME ANSI-LOOP::LOOP-DO-THEREIS +- COMMON-LISP::FILE-AUTHOR ANSI-LOOP::LOOP-MAKE-DESETQ +- SYSTEM::NC SYSTEM::NUMBER-OF-DAYS-FROM-1900 +- SYSTEM::RESTART-TEST-FUNCTION SYSTEM::WHICH +- ANSI-LOOP::DESTRUCTURING-SIZE COMMON-LISP::FILE-LENGTH)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- SYSTEM::BREAK-VS ANSI-LOOP::LOOP-OPTIONAL-TYPE +- SYSTEM::BREAK-BDS SYSTEM::IHS-BACKTRACE SYSTEM::INFO-ERROR +- SYSTEM::BREAK-LOCAL SYSTEM::SHOW-BREAK-VARIABLES +- COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-PREVIOUS +- SYSTEM::BREAK-QUIT SYSTEM::DBL-BACKTRACE COMMON-LISP::CONTINUE +- SYSTEM::BREAK-NEXT)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ COMMON-LISP::HASH-TABLE) ++ SYSTEM::CONTEXT-SPICE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +@@ -512,124 +441,227 @@ + SYSTEM::BIGNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMMON-LISP::FIND-RESTART COMMON-LISP::PATHNAME-HOST +- SYSTEM::LINK-EXPAND COMMON-LISP::CONCATENATE COMMON-LISP::WARN +- COMMON-LISP::FILE-POSITION ANSI-LOOP::LOOP-WARN +- COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::SBIT +- COMMON-LISP::BIT ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES +- COMMON-LISP::PATHNAME-TYPE COMMON-LISP::MAKE-ARRAY +- ANSI-LOOP::LOOP-ERROR COMMON-LISP::DIRECTORY SYSTEM::DIR-PARSE +- COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME +- SYSTEM::NTH-STACK-FRAME COMMON-LISP::REQUIRE COMMON-LISP::LOAD +- SYSTEM::MGLIST COMMON-LISP::DELETE-DUPLICATES +- COMMON-LISP::PATHNAME-VERSION COMMON-LISP::ENOUGH-NAMESTRING +- SYSTEM::BAD-SEQ-LIMIT COMMON-LISP::REMOVE-DUPLICATES +- COMMON-LISP::PATHNAME-NAME +- COMMON-LISP::MAKE-STRING-INPUT-STREAM SLOOP::LOOP-ADD-TEMPS +- SYSTEM::NLOAD SYSTEM::LIST-MATCHES +- COMMON-LISP::ARRAY-ROW-MAJOR-INDEX +- COMMON-LISP::ARRAY-IN-BOUNDS-P SYSTEM::BREAK-LEVEL +- SYSTEM::PROCESS-SOME-ARGS SYSTEM::TO-REGEXP +- COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE COMMON-LISP::OPEN +- SYSTEM::FILE-SEARCH COMMON-LISP::READ-BYTE +- SYSTEM::FILE-TO-STRING SLOOP::ADD-FROM-DATA COMMON-LISP::ERROR +- COMMON-LISP::SIGNAL SYSTEM::MGSUB COMMON-LISP::WILD-PATHNAME-P +- COMMON-LISP::PATHNAME-DEVICE SYSTEM::LOGICAL-PATHNAME-PARSE +- COMMON-LISP::MERGE-PATHNAMES SYSTEM::INFO-SEARCH +- COMMON-LISP::BIT-NOT)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- ANSI-LOOP::ESTIMATE-CODE-SIZE-1 SYSTEM::DO-REPL +- SYSTEM::SOURCE-PORTION SYSTEM::RESTART-REPORT +- SYSTEM::NEW-SEMI-COLON-READER SYSTEM::FIND-DOC +- ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEWLINE +- COMMON-LISP::RENAME-FILE SYSTEM::LIST-TOGGLE-CASE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMMON-LISP::REDUCE COMMON-LISP::STABLE-SORT +- SYSTEM::PARSE-BODY SLOOP::FIND-IN-ORDERED-LIST +- COMMON-LISP::SUBTYPEP COMMON-LISP::SORT)) ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ATOI)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::LIST-MERGE-SORT ANSI-LOOP::LOOP-GET-COLLECTION-INFO +- SYSTEM::SHARP---READER SYSTEM::SHARP-S-READER +- SYSTEM::VERIFY-KEYWORDS SYSTEM::RESTART-PRINT +- SYSTEM::SHARP-+-READER SYSTEM::READ-INSPECT-COMMAND)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ ANSI-LOOP::LOOP-DO-INITIALLY SYSTEM::GET-INDEX-NODE ++ SLOOP::PARSE-ONE-WHEN-CLAUSE SYSTEM::STEP-READ-LINE ++ SYSTEM::DM-TOO-MANY-ARGUMENTS SYSTEM::READ-EVALUATED-FORM ++ SYSTEM::DM-TOO-FEW-ARGUMENTS SYSTEM::KCL-TOP-RESTARTS ++ ANSI-LOOP::LOOP-ITERATION-DRIVER ++ SYSTEM::CURRENT-DIRECTORY-PATHNAME SYSTEM::INSPECT-INDENT ++ SYSTEM::CLEANUP ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ++ SLOOP::PARSE-LOOP-WHEN ANSI-LOOP::LOOP-DO-NAMED ++ ANSI-LOOP::LOOP-GET-FORM SYSTEM::GET-TEMP-DIR ++ SYSTEM::ILLEGAL-BOA SYSTEM::SET-UP-TOP-LEVEL ++ SYSTEM::SETUP-LINEINFO ANSI-LOOP::LOOP-CONTEXT ++ SYSTEM::TOP-LEVEL SYSTEM::DBL SLOOP::LOOP-UN-POP ++ SYSTEM::SET-CURRENT ANSI-LOOP::LOOP-GET-PROGN ++ ANSI-LOOP::LOOP-DO-REPEAT SYSTEM::INIT-BREAK-POINTS ++ SLOOP::PARSE-LOOP-FOR SLOOP::LOOP-POP ++ ANSI-LOOP::LOOP-POP-SOURCE ANSI-LOOP::LOOP-DO-WITH ++ ANSI-LOOP::LOOP-DO-DO COMMON-LISP::LISP-IMPLEMENTATION-VERSION ++ ANSI-LOOP::LOOP-DO-RETURN SLOOP::PARSE-LOOP-DO ++ SLOOP::LOOP-PEEK ANSI-LOOP::LOOP-BIND-BLOCK ++ SYSTEM::DEFAULT-SYSTEM-BANNER SLOOP::PARSE-LOOP1 ++ SYSTEM::INSPECT-READ-LINE ANSI-LOOP::LOOP-DO-FINALLY ++ SYSTEM::TEST-ERROR COMMON-LISP::TYPE-ERROR ++ SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::SHOW-RESTARTS ++ SYSTEM::SET-ENV SLOOP::PARSE-LOOP-COLLECT ++ SYSTEM::ALL-TRACE-DECLARATIONS SYSTEM::GET-SIG-FN-NAME ++ SYSTEM::INSPECT-INDENT-1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::PUSH-OPTIONAL-BINDING)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR COMMON-LISP::NULL ++ COMMON-LISP::HASH-TABLE)) ++ SYSTEM::CONTEXT-HASH)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::TRACE-CALL)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::LENEL SYSTEM::GET-NODE-INDEX SYSTEM::FASLINK ++ SYSTEM::THE-END ANSI-LOOP::DUPLICATABLE-CODE-P ++ SYSTEM::RELATIVE-LINE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::MASET)) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::DBL-WHAT-FRAME FPE::FE-ENABLE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::EXPAND-WILD-DIRECTORY)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ SYSTEM::GCL-TOP-LEVEL SYSTEM::BREAK-CURRENT ++ SYSTEM::BREAK-RESUME SYSTEM::BREAK-HELP SYSTEM::BREAK-MESSAGE ++ ANSI-LOOP::LOOP-DO-FOR SYSTEM::SIMPLE-BACKTRACE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::PARSE-DEFMACRO SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ SYSTEM::PROCESS-SOME-ARGS COMMON-LISP::CONCATENATE ++ SYSTEM::TO-REGEXP COMMON-LISP::PATHNAME-DEVICE ++ SYSTEM::LIST-MATCHES ANSI-LOOP::LOOP-WARN ++ COMMON-LISP::REMOVE-DUPLICATES COMMON-LISP::PATHNAME-HOST ++ COMMON-LISP::BIT COMMON-LISP::SBIT ++ COMMON-LISP::ENOUGH-NAMESTRING SYSTEM::DIR-PARSE ++ SYSTEM::FILE-SEARCH SYSTEM::BREAK-LEVEL ANSI-LOOP::LOOP-ERROR ++ SYSTEM::MGLIST COMMON-LISP::PATHNAME-NAME ++ COMMON-LISP::MAKE-STRING-INPUT-STREAM SLOOP::ADD-FROM-DATA ++ COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME COMMON-LISP::DIRECTORY ++ SYSTEM::FILE-TO-STRING COMMON-LISP::ARRAY-ROW-MAJOR-INDEX ++ SYSTEM::NTH-STACK-FRAME SLOOP::LOOP-ADD-TEMPS ++ COMMON-LISP::WARN ++ ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES ++ SYSTEM::LINK-EXPAND COMMON-LISP::PATHNAME-TYPE ++ COMMON-LISP::OPEN COMMON-LISP::BIT-NOT ++ COMMON-LISP::DELETE-DUPLICATES COMMON-LISP::ERROR ++ COMMON-LISP::FILE-POSITION COMMON-LISP::PATHNAME-VERSION ++ COMMON-LISP::ARRAY-IN-BOUNDS-P COMMON-LISP::REQUIRE ++ SYSTEM::MGSUB COMMON-LISP::MERGE-PATHNAMES COMMON-LISP::LOAD ++ COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::SIGNAL ++ COMMON-LISP::WILD-PATHNAME-P COMMON-LISP::FIND-RESTART ++ SYSTEM::INFO-SEARCH SYSTEM::LOGICAL-PATHNAME-PARSE ++ SYSTEM::BAD-SEQ-LIMIT COMMON-LISP::READ-BYTE ++ COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE SYSTEM::NLOAD ++ COMMON-LISP::MAKE-ARRAY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- SYSTEM::MME3)) ++ COMMON-LISP::RENAME-FILE ANSI-LOOP::ESTIMATE-CODE-SIZE-1 ++ SYSTEM::FIND-DOC SYSTEM::SOURCE-PORTION SYSTEM::NEWLINE ++ SYSTEM::DO-REPL SYSTEM::RESTART-REPORT ++ ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEW-SEMI-COLON-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T) ++ 9223372036854775807)) + COMMON-LISP::T) +- SYSTEM::SMALLNTHCDR)) ++ SYSTEM::GET-CONTEXT SYSTEM::PUSH-CONTEXT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- SYSTEM::GCL-TOP-LEVEL SYSTEM::BREAK-MESSAGE +- SYSTEM::BREAK-RESUME SYSTEM::SIMPLE-BACKTRACE +- SYSTEM::BREAK-HELP ANSI-LOOP::LOOP-DO-FOR +- SYSTEM::BREAK-CURRENT)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- SYSTEM::S-DATA-LENGTH SYSTEM::THE-START SYSTEM::INSTREAM-LINE +- SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMMON-LISP::PSETF COMMON-LISP::PROG* SYSTEM::BREAK-STEP-INTO ++ SLOOP::IN-PACKAGE-SLOOP-MAP SLOOP::SLOOP-FINISH ++ SYSTEM::CHECK-SEQ-START-END SLOOP::SLOOP ++ COMMON-LISP::MULTIPLE-VALUE-SETQ COMMON-LISP::ASSERT ++ SLOOP::MINIMIZE-SLOOP-COLLECT COMMON-LISP::ROTATEF ++ SYSTEM::LIST-TOGGLE-CASE SYSTEM::INCREMENT-CURSOR ++ ANSI-LOOP::LOOP-COLLECT-ANSWER COMMON-LISP::PROG2 ++ SLOOP::SLOOP-SWAP COMMON-LISP::DEFTYPE ++ SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS SYSTEM::?PUSH ++ COMMON-LISP::DO-EXTERNAL-SYMBOLS ++ ANSI-LOOP::LOOP-COLLECT-RPLACD COMMON-LISP::TRACE ++ ANSI-LOOP::LOOP-DO-IF ANSI-LOOP::MAKE-LOOP-MINIMAX ++ SYSTEM::SUBSTRINGP COMMON-LISP::LOGORC2 ++ ANSI-LOOP::LOOP-DO-WHILE ANSI-LOOP::LOOP-LOOKUP-KEYWORD ++ SLOOP::DEF-LOOP-COLLECT SYSTEM::SETF-HELPER ++ COMMON-LISP::WITH-CONDITION-RESTARTS SYSTEM::INSPECT-PRINT ++ SLOOP::PARSE-LOOP-MAP SYSTEM::KEYWORD-SUPPLIED-P ++ COMMON-LISP::LOOP-FINISH ANSI-LOOP::LOOP-TASSOC ++ SYSTEM::GET-LINE-OF-FORM ANSI-LOOP::LOOP-STORE-TABLE-DATA ++ SLOOP::L-EQUAL COMMON-LISP::ETYPECASE ++ SLOOP::THEREIS-SLOOP-COLLECT COMMON-LISP::RETURN ++ SYSTEM::SUB-INTERVAL-P COMMON-LISP::ECASE ++ COMMON-LISP::WRITE-BYTE SYSTEM::LOOKUP-KEYWORD ++ COMMON-LISP::DEFSETF ANSI-LOOP::LOOP-DO-ALWAYS ++ SYSTEM::PARSE-SLOT-DESCRIPTION COMMON-LISP::VECTOR-PUSH ++ SYSTEM::GET-INFO-CHOICES SYSTEM::SETF-EXPAND ++ SYSTEM::LEFT-PARENTHESIS-READER SLOOP::DEF-LOOP-FOR ++ COMMON-LISP::PROG SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS ++ SYSTEM::SUPER-GO COMMON-LISP::LDB SYSTEM::NODE ++ SYSTEM::COERCE-TO-PACKAGE COMMON-LISP::DO SYSTEM::TP-ERROR ++ SYSTEM::GET-NODES SLOOP::THE-TYPE ANSI-LOOP::LOOP-TMEMBER ++ ANSI-LOOP::LOOP-TEQUAL COMMON-LISP::DEFPARAMETER ++ COMMON-LISP::WITH-OPEN-STREAM SYSTEM::DEFINE-SETF-METHOD ++ SYSTEM::IF-ERROR ANSI-LOOP::HIDE-VARIABLE-REFERENCES ++ SLOOP::DESETQ1 COMMON-LISP::LOOP COMMON-LISP::CTYPECASE ++ COMMON-LISP::DEFSTRUCT COMMON-LISP::CASE SYSTEM::DOT-DIR-P ++ SYSTEM::INSPECT-RECURSIVELY COMMON-LISP::DOTIMES ++ SYSTEM::BREAK-STEP-NEXT SYSTEM::ALL-MATCHES ++ COMMON-LISP::LOCALLY SLOOP::IN-TABLE-SLOOP-MAP ++ SYSTEM::DISPLAY-ENV COMMON-LISP::MULTIPLE-VALUE-LIST ++ COMMON-LISP::LDB-TEST COMMON-LISP::DECLAIM ++ COMMON-LISP::WITH-STANDARD-IO-SYNTAX SYSTEM::SGEN ++ SLOOP::ALWAYS-SLOOP-COLLECT COMMON-LISP::PUSHNEW ++ COMMON-LISP::MULTIPLE-VALUE-BIND FPE::%-READER ++ COMMON-LISP::CCASE SLOOP::DEF-LOOP-MACRO ++ ANSI-LOOP::LOOP-REALLY-DESETQ SYSTEM::IN-INTERVAL-P ++ SYSTEM::DBL-UP SLOOP::DEF-LOOP-MAP ANSI-LOOP::LOOP-BODY ++ SYSTEM::SEQUENCE-CURSOR COMMON-LISP::COERCE ++ COMMON-LISP::PATHNAME-MATCH-P SYSTEM::OBJLT ++ COMMON-LISP::RESTART-CASE ++ COMMON-LISP::WITH-HASH-TABLE-ITERATOR COMMON-LISP::STEP ++ SYSTEM::QUOTATION-READER SYSTEM::PUT-AUX COMMON-LISP::TYPECASE ++ SYSTEM::*BREAK-POINTS* COMMON-LISP::LOGTEST ++ SYSTEM::CONDITION-PASS COMMON-LISP::DEFVAR ++ COMMON-LISP::WITH-OUTPUT-TO-STRING SYSTEM::SET-BACK ++ COMMON-LISP::NTHCDR COMMON-LISP::DO-ALL-SYMBOLS ++ SYSTEM::INFO-AUX COMMON-LISP::LOGANDC1 COMMON-LISP::PROG1 ++ FPE::READ-OPERANDS SYSTEM::DISPLAY-COMPILED-ENV ++ COMMON-LISP::DEFCONSTANT SYSTEM::DM-V SLOOP::LOOP-RETURN ++ SYSTEM::ADD-FILE SYSTEM::WHILE SYSTEM::WITHOUT-INTERRUPTS ++ COMMON-LISP::NTH-VALUE COMMON-LISP::OR ++ ANSI-LOOP::LOOP-COPYLIST* SLOOP::IN-CAREFULLY-SLOOP-FOR ++ ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::GET-MATCH ++ ANSI-LOOP::WITH-LOOP-LIST-COLLECTION-HEAD ++ ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION SYSTEM::MV-SETQ ++ SLOOP::COLLATE-SLOOP-COLLECT COMMON-LISP::LOGORC1 ++ SYSTEM::DM-NTH-CDR COMPILER::COMPILER-DEF-HOOK ++ SYSTEM::CHECK-TYPE-EVAL COMMON-LISP::DECF ++ COMMON-LISP::WITH-PACKAGE-ITERATOR SYSTEM::COERCE-TO-STRING ++ COMMON-LISP::DEFINE-MODIFY-MACRO FPE::0-READER ++ COMMON-LISP::WITH-COMPILATION-UNIT COMMON-LISP::LOGNAND ++ COMMON-LISP::CHECK-TYPE COMMON-LISP::INCF ++ SLOOP::MAXIMIZE-SLOOP-COLLECT SYSTEM::ITERATE-OVER-BKPTS ++ SLOOP::LOGXOR-SLOOP-COLLECT SLOOP::NEVER-SLOOP-COLLECT ++ SYSTEM::MV-VALUES SYSTEM::MSUB COMMON-LISP::DO* ++ SLOOP::=-SLOOP-FOR COMMON-LISP::UNLESS ++ SYSTEM::MATCH-DIMENSIONS COMMON-LISP::DOLIST ++ ANSI-LOOP::LOOP-MAYBE-BIND-FORM SLOOP::LOCAL-FINISH ++ COMMON-LISP::PSETQ COMMON-LISP::COND ++ COMMON-LISP::WITH-SIMPLE-RESTART COMMON-LISP::DO-SYMBOLS ++ COMMON-LISP::FILE-STRING-LENGTH COMMON-LISP::LAMBDA ++ ANSI-LOOP::LOOP-ACCUMULATE-MINIMAX-VALUE ++ SLOOP::IN-FRINGE-SLOOP-MAP SYSTEM::SET-DIR ++ COMMON-LISP::WITH-INPUT-FROM-STRING SYSTEM::LIST-DELQ ++ COMMON-LISP::BYTE COMMON-LISP::DOCUMENTATION SYSTEM::SAFE-EVAL ++ COMMON-LISP::DEFMACRO SLOOP::DESETQ COMMON-LISP::POP ++ SLOOP::COUNT-SLOOP-COLLECT SLOOP::LCASE ++ COMMON-LISP::DEFPACKAGE COMMON-LISP::DEFUN COMMON-LISP::TIME ++ COMMON-LISP::LOGNOR COMMON-LISP::RESTART-BIND ++ COMMON-LISP::PUSH COMMON-LISP::SHIFTF COMMON-LISP::AND ++ COMMON-LISP::WHEN SYSTEM::DM-NTH COMMON-LISP::WITH-OPEN-FILE ++ SLOOP::MAKE-VALUE COMMON-LISP::UNTRACE FPE::PAREN-READER ++ ANSI-LOOP::WITH-MINIMAX-VALUE COMMON-LISP::NTH ++ FPE::READ-INSTRUCTION SLOOP::SUM-SLOOP-COLLECT ++ COMMON-LISP::REMF COMMON-LISP::DESTRUCTURING-BIND ++ SYSTEM::SET-PATH-STREAM-NAME FPE::RF COMMON-LISP::LOGANDC2)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) +- SYSTEM::MATCH-BEGINNING SYSTEM::MATCH-END)) +\ No newline at end of file ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::FCEILING COMMON-LISP::APROPOS-LIST ++ COMMON-LISP::READ-FROM-STRING ++ COMMON-LISP::ENSURE-DIRECTORIES-EXIST SYSTEM::APROPOS-DOC ++ COMMON-LISP::FTRUNCATE SYSTEM::BREAK-FUNCTION ++ SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE SYSTEM::STEPPER ++ COMMON-LISP::DECODE-UNIVERSAL-TIME ++ ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE ++ COMMON-LISP::STORE-VALUE COMMON-LISP::GET-SETF-EXPANSION ++ SYSTEM::PRINT-DOC SYSTEM::INFO COMMON-LISP::APROPOS ++ COMMON-LISP::WRITE-TO-STRING COMMON-LISP::USE-VALUE ++ COMMON-LISP::FROUND COMMON-LISP::PARSE-NAMESTRING ++ COMMON-LISP::INVOKE-RESTART COMMON-LISP::FFLOOR ++ SYSTEM::SHOW-INFO)) +\ No newline at end of file +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -182,61 +182,61 @@ void + add_page_to_freelist(char *p, struct typemanager *tm) { + + short t,size; +- long i=tm->tm_nppage,fw; +- object x,f; ++ long fw; ++ object x,xe,f; + struct pageinfo *pp; + +- t=tm->tm_type; ++ t=tm->tm_type; + +- size=tm->tm_size; +- f=tm->tm_free; +- pp=pageinfo(p); +- bzero(pp,sizeof(*pp)); +- pp->type=t; +- pp->magic=PAGE_MAGIC; +- +- if (cell_list_head==NULL) +- cell_list_tail=cell_list_head=pp; +- else if (pp > cell_list_tail) { +- cell_list_tail->next=pp; +- cell_list_tail=pp; +- } +- +- x= (object)pagetochar(page(p)); +- /* set_type_of(x,t); */ +- make_free(x); ++ size=tm->tm_size; ++ pp=pageinfo(p); ++ bzero(pp,sizeof(*pp)); ++ pp->type=t; ++ pp->magic=PAGE_MAGIC; ++ ++ if (cell_list_head==NULL) ++ cell_list_tail=cell_list_head=pp; ++ else if (pp > cell_list_tail) { ++ cell_list_tail->next=pp; ++ cell_list_tail=pp; ++ } ++ ++ x= (object)pagetochar(page(p)); ++ /* set_type_of(x,t); */ ++ make_free(x); + + #ifdef SGC + +- if (sgc_enabled && tm->tm_sgc) +- pp->sgc_flags=SGC_PAGE_FLAG; ++ if (sgc_enabled && tm->tm_sgc) ++ pp->sgc_flags=SGC_PAGE_FLAG; + + #ifndef SGC_WHOLE_PAGE +- if (TYPEWORD_TYPE_P(pp->type)) +- x->d.s=(sgc_enabled && tm->tm_sgc) ? SGC_RECENT : SGC_NORMAL; ++ if (TYPEWORD_TYPE_P(pp->type)) ++ x->d.s=(sgc_enabled && tm->tm_sgc) ? SGC_RECENT : SGC_NORMAL; + #endif + +- /* array headers must be always writable, since a write to the +- body does not touch the header. It may be desirable if there +- are many arrays in a system to make the headers not writable, +- but just SGC_TOUCH the header each time you write to it. this +- is what is done with t_structure */ ++ /* array headers must be always writable, since a write to the ++ body does not touch the header. It may be desirable if there ++ are many arrays in a system to make the headers not writable, ++ but just SGC_TOUCH the header each time you write to it. this ++ is what is done with t_structure */ + if (t==(tm_of(t_array)->tm_type)) + pp->sgc_flags|=SGC_PERM_WRITABLE; +- ++ + #endif + +- fw= *(fixnum *)x; +- while (--i >= 0) { +- *(fixnum *)x=fw; +- SET_LINK(x,f); +- f=x; +- x= (object) ((char *)x + size); +- } +- +- tm->tm_free=f; +- tm->tm_nfree += tm->tm_nppage; +- tm->tm_npage++; ++ f=FREELIST_TAIL(tm); ++ fw=x->fw; ++ xe=(object)((void *)x+tm->tm_nppage*size); ++ for (;xfw=fw; ++ SET_LINK(f,x); ++ } ++ ++ SET_LINK(f,OBJNULL); ++ tm->tm_tail=f; ++ tm->tm_nfree+=tm->tm_nppage; ++ tm->tm_npage++; + + } + +@@ -1065,15 +1065,13 @@ make_cons(object a,object d) { + + } + +- +- +-object on_stack_cons(object x, object y) { ++object ++on_stack_cons(object x, object y) { + object p = (object) alloca_val; + load_cons(p,x,y); + return p; + } + +- + DEFUNM_NEW("ALLOCATED",object,fSallocated,SI,1,1,NONE,OO,OO,OO,OO,(object typ),"") + { struct typemanager *tm=(&tm_table[t_from_type(typ)]); + tm = & tm_table[tm->tm_type]; +--- gcl-2.6.12.orig/o/assignment.c ++++ gcl-2.6.12/o/assignment.c +@@ -388,14 +388,7 @@ EVAL: + + OTHERWISE: + vs_base = vs_top; +- vs_push(sLsetf); +- vs_push(place); +- vs_push(form); +- result=vs_top[-1]; +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- stack_cons(); ++ vs_push(list(3,sLsetf,place,result=form)); + /***/ + #define VS_PUSH_ENV \ + if(lex_env[1]){ \ +@@ -428,9 +421,7 @@ FFN(Fpush)(object form) + return; + } + vs_base = vs_top; +- vs_push(sLpush); +- vs_push(form); +- stack_cons(); ++ vs_push(make_cons(sLpush,form)); + /***/ + VS_PUSH_ENV ; + /***/ +@@ -457,9 +448,7 @@ FFN(Fpop)(object form) + return; + } + vs_base = vs_top; +- vs_push(sLpop); +- vs_push(form); +- stack_cons(); ++ vs_push(make_cons(sLpop,form)); + /***/ + VS_PUSH_ENV ; + /***/ +@@ -495,9 +484,7 @@ FFN(Fincf)(object form) + return; + } + vs_base = vs_top; +- vs_push(sLincf); +- vs_push(form); +- stack_cons(); ++ vs_push(make_cons(sLincf,form)); + /***/ + VS_PUSH_ENV ; + /***/ +@@ -533,9 +520,7 @@ FFN(Fdecf)(object form) + return; + } + vs_base = vs_top; +- vs_push(sLdecf); +- vs_push(form); +- stack_cons(); ++ vs_push(make_cons(sLdecf,form)); + /***/ + VS_PUSH_ENV ; + /***/ +--- gcl-2.6.12.orig/o/backq.c ++++ gcl-2.6.12/o/backq.c +@@ -22,7 +22,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include "include.h" + + #define attach(x) (vs_head = make_cons(x, vs_head)) +-#define make_list (vs_push(Cnil), stack_cons(), stack_cons()) ++#define make_list (vs_popp,vs_head=list(2,vs_head,*vs_top)) + + + #define QUOTE 1 +--- gcl-2.6.12.orig/o/bind.c ++++ gcl-2.6.12/o/bind.c +@@ -433,10 +433,11 @@ SEARCH_DECLARE: + optional[i].opt_svar_spp); + } + if (rest_flag) { +- vs_push(Cnil); +- for (i = narg, j = nreq+nopt; --i >= j; ) +- vs_head = make_cons(base[i], vs_head); +- bind_var(rest->rest_var, vs_head, rest->rest_spp); ++ object *l=vs_top++; ++ for (i=nreq+nopt;irest_var, vs_head, rest->rest_spp); + } + if (key_flag) { + int allow_other_keys_found=0; +@@ -824,12 +825,11 @@ parse_key(object *base, bool rest, bool + } + } + if (rest) { +- top = vs_top; +- vs_push(Cnil); +- base++; +- while (base < vs_top) +- stack_cons(); +- vs_top = top; ++ object *a,*l; ++ for (l=a=base;as.s_sfdef != NOT_SPECIAL && sym->s.s_mflag) + sym->s.s_sfdef = NOT_SPECIAL; +- cf = alloc_object(t_cfun); +- cf->cf.cf_self = self; +- cf->cf.cf_name = sym; +- cf->cf.cf_data = data; ++ sfn = alloc_object(t_sfun); ++ sfn->sfn.sfn_self = (void *)self;/*FIXME*/ ++ sfn->sfn.sfn_name = sym; ++ sfn->sfn.sfn_data = data; ++ sfn->sfn.sfn_argd=2; + data->cfd.cfd_start=start; + data->cfd.cfd_size=size; +- sym = clear_compiler_properties(sym,cf); +- sym->s.s_gfdef = cf; ++ sym = clear_compiler_properties(sym,sfn); ++ sym->s.s_gfdef = sfn; + sym->s.s_mflag = TRUE; + return sym; + } +--- gcl-2.6.12.orig/o/eval.c ++++ gcl-2.6.12/o/eval.c +@@ -60,38 +60,41 @@ object sSAbreak_stepA; + /* for t_sfun,t_gfun with args on vs stack */ + + static void +-quick_call_sfun(object fun) +-{ DEBUG_AVMA ++quick_call_sfun(object fun) { ++ ++ DEBUG_AVMA + int i=fun->sfn.sfn_argd,n=SFUN_NARGS(i); + enum ftype restype; +- object *x,res,*base; +- object *temp_ar=alloca(n*sizeof(object)); +-/* i=fun->sfn.sfn_argd; */ +-/* n=SFUN_NARGS(i); */ +- base = vs_base; +- if (n != vs_top - base) +- {check_arg_failed(n);} ++ object *x,*base; ++ ++ if (n!=vs_top-vs_base) ++ check_arg_failed(n); ++ + restype = SFUN_RETURN_TYPE(i); + SFUN_START_ARG_TYPES(i); +- /* for moment just support object and int */ + #define COERCE_ARG(a,type) (type==f_object ? a : (object)(fix(a))) +- if (i==0) +- x=vs_base; +- else +- {int j; +- x=temp_ar; +- for (j=0; jcf.cf_self)();return;} +- if (type_of(fun)==t_sfun){call_sfun_no_check(fun); return;} +- if (type_of(fun)==t_gfun) +- {quick_call_sfun(fun); return;} +- if (type_of(fun)==t_vfun) +- {call_vfun(fun); return;} +- if (type_of(fun) == t_symbol) { +- if (fun->s.s_sfdef != NOT_SPECIAL || fun->s.s_mflag) +- FEinvalid_function(fun); +- if (fun->s.s_gfdef == OBJNULL) +- FEundefined_function(fun); +- fun = fun->s.s_gfdef; +- if (type_of(fun)==t_cfun){(*fun->cf.cf_self)(); +- return;} +- } +- funcall_no_event(fun); ++ ++ switch(type_of(fun)) { ++ case t_cfun: ++ (*fun->cf.cf_self)(); ++ return; ++ case t_sfun: ++ call_sfun_no_check(fun); return; ++ case t_gfun: ++ quick_call_sfun(fun); return; ++ case t_vfun: ++ call_vfun(fun); return; ++ case t_symbol: ++ if (fun->s.s_sfdef != NOT_SPECIAL || fun->s.s_mflag) ++ FEinvalid_function(fun); ++ if (fun->s.s_gfdef == OBJNULL) ++ FEundefined_function(fun); ++ super_funcall_no_event(fun->s.s_gfdef); ++ return; ++ default: ++ funcall_no_event(fun); ++ } ++ + } + + #ifdef USE_BROKEN_IEVAL +@@ -814,13 +823,7 @@ EVAL: + bds_bind(siVevalhook, Cnil); + vs_base = vs_top; + vs_push(form); +- vs_push(lex_env[0]); +- vs_push(lex_env[1]); +- vs_push(lex_env[2]); +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- stack_cons(); ++ vs_push(list(3,lex_env[0],lex_env[1],lex_env[2])); + super_funcall(hookfun); + bds_unwind(old_bds_top); + return; +@@ -970,22 +973,12 @@ static void + call_applyhook(object fun) + { + object ah; +- object *v; + + ah = symbol_value(siVapplyhook); +- v = vs_base + 1; +- vs_push(Cnil); +- while (vs_top > v) +- stack_cons(); ++ Llist(); + vs_push(vs_base[0]); + vs_base[0] = fun; +- vs_push(lex_env[0]); +- vs_push(lex_env[1]); +- vs_push(lex_env[2]); +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- stack_cons(); ++ vs_push(list(3,lex_env[0],lex_env[1],lex_env[2])); + super_funcall(ah); + } + +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -1130,8 +1130,7 @@ read_fasd1(int i, object *loc) + *loc=Cnil;return; + case DP(d_cons:) + read_fasd1(GET_OP(),&tem); +- *loc=make_cons(tem,Cnil); +- loc= &((*loc)->c.c_cdr); ++ collect(loc,make_cons(tem,Cnil)); + i=GET_OP(); + goto BEGIN; + case DP(d_list1:) i=1;goto READ_LIST; +@@ -1162,8 +1161,7 @@ read_fasd1(int i, object *loc) + read_fasd1(j,&tem); + DPRINTF("{Item=",(debug >= 2 ? pp(tem) : 0)); + DPRINTF("}",0); +- *loc=make_cons(tem,Cnil); +- loc= &((*loc)->c.c_cdr);}} ++ collect(loc,make_cons(tem,Cnil));}} + + case DP(d_delimiter:) + case DP(d_dot:) +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -1429,52 +1429,54 @@ LFD(Lmake_synonym_stream)() + vs_base[0] = x; + } + +-LFD(Lmake_broadcast_stream)() +-{ +- object x; +- int narg, i; +- +- narg = vs_top - vs_base; +- for (i = 0; i < narg; i++) +- if (type_of(vs_base[i]) != t_stream || +- !output_stream_p(vs_base[i])) +- cannot_write(vs_base[i]); +- vs_push(Cnil); +- for (i = narg; i > 0; --i) +- stack_cons(); +- x = alloc_object(t_stream); +- x->sm.sm_mode = (short)smm_broadcast; +- x->sm.sm_fp = NULL; +- x->sm.sm_buffer = 0; +- x->sm.sm_object0 = vs_base[0]; +- x->sm.sm_object1 = OBJNULL; +- x->sm.sm_int = 0; +- x->sm.sm_flags=0; +- vs_base[0] = x; ++LFD(Lmake_broadcast_stream)() { ++ ++ object x; ++ int narg, i; ++ ++ narg = vs_top - vs_base; ++ for (i = 0; i < narg; i++) ++ if (type_of(vs_base[i]) != t_stream || ++ !output_stream_p(vs_base[i])) ++ cannot_write(vs_base[i]); ++ ++ Llist(); ++ ++ x = alloc_object(t_stream); ++ x->sm.sm_mode = (short)smm_broadcast; ++ x->sm.sm_fp = NULL; ++ x->sm.sm_buffer = 0; ++ x->sm.sm_object0 = vs_base[0]; ++ x->sm.sm_object1 = OBJNULL; ++ x->sm.sm_int = 0; ++ x->sm.sm_flags=0; ++ vs_base[0] = x; ++ + } + +-LFD(Lmake_concatenated_stream)() +-{ +- object x; +- int narg, i; +- +- narg = vs_top - vs_base; +- for (i = 0; i < narg; i++) +- if (type_of(vs_base[i]) != t_stream || +- !input_stream_p(vs_base[i])) +- cannot_read(vs_base[i]); +- vs_push(Cnil); +- for (i = narg; i > 0; --i) +- stack_cons(); +- x = alloc_object(t_stream); +- x->sm.sm_mode = (short)smm_concatenated; +- x->sm.sm_fp = NULL; +- x->sm.sm_buffer = 0; +- x->sm.sm_object0 = vs_base[0]; +- x->sm.sm_object1 = OBJNULL; +- x->sm.sm_int = 0; +- x->sm.sm_flags=0; +- vs_base[0] = x; ++LFD(Lmake_concatenated_stream)() { ++ ++ object x; ++ int narg, i; ++ ++ narg = vs_top - vs_base; ++ for (i = 0; i < narg; i++) ++ if (type_of(vs_base[i]) != t_stream || ++ !input_stream_p(vs_base[i])) ++ cannot_read(vs_base[i]); ++ ++ Llist(); ++ ++ x = alloc_object(t_stream); ++ x->sm.sm_mode = (short)smm_concatenated; ++ x->sm.sm_fp = NULL; ++ x->sm.sm_buffer = 0; ++ x->sm.sm_object0 = vs_base[0]; ++ x->sm.sm_object1 = OBJNULL; ++ x->sm.sm_int = 0; ++ x->sm.sm_flags=0; ++ vs_base[0] = x; ++ + } + + LFD(Lmake_two_way_stream)() +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -543,7 +543,9 @@ mark_object1(object x) { + mark_object_address(&x->ht.ht_self[i].hte_key,i); + mark_object_address(&x->ht.ht_self[i].hte_value,i+1); + } ++ i=x->ht.ht_cache-x->ht.ht_self; + MARK_LEAF_DATA(x,x->ht.ht_self,x->ht.ht_size*sizeof(*x->ht.ht_self)); ++ if (x->ht.ht_cache) x->ht.ht_cache=x->ht.ht_self+i; + break; + + case t_array: +@@ -662,6 +664,7 @@ mark_object1(object x) { + break; + + case t_readtable: ++ mark_object(x->rt.rt_case); + if (x->rt.rt_self) { + for (i=0;irt.rt_self[i].rte_macro,i); +@@ -968,7 +971,7 @@ sweep_phase(void) { + tm = tm_of((enum type)v->type); + + p = pagetochar(page(v)); +- f = tm->tm_free; ++ f = FREELIST_TAIL(tm); + k = 0; + for (j = tm->tm_nppage; j > 0; --j, p += tm->tm_size) { + x = (object)p; +@@ -979,12 +982,13 @@ sweep_phase(void) { + continue; + } + +- SET_LINK(x,f); ++ SET_LINK(f,x); + make_free(x); + f = x; + k++; + } +- tm->tm_free = f; ++ SET_LINK(f,OBJNULL); ++ tm->tm_tail = f; + tm->tm_nfree += k; + pagetoinfo(page(v))->in_use-=k; + +--- gcl-2.6.12.orig/o/hash.d ++++ gcl-2.6.12/o/hash.d +@@ -196,33 +196,28 @@ DEFUN_NEW("HASH-EQUAL",object,fShash_equ + + + struct htent * +-gethash(object key, object hashtable) { ++gethash(object key, object ht) { + +- enum httest htest; +- long hsize,j,s,q; +- struct htent *e,*first_objnull=NULL; +- object hkey; ++ long s,q; ++ struct htent *e,*ee,*first_open=NULL; + static struct htent dummy={OBJNULL,OBJNULL}; + +- if (!hashtable->ht.ht_size) +- return &dummy; +- +- htest = (enum httest)hashtable->ht.ht_test; +- hsize = hashtable->ht.ht_size; ++ if (ht->ht.ht_cache && ht->ht.ht_cache->hte_key==key) ++ return ht->ht.ht_cache; ++ ht->ht.ht_cache=NULL; + + #define eq(x,y) x==y + #define hash_loop(t_,i_) \ +- for (s=i_%hsize,q=hsize,e=first_objnull;s>=0;q=s,s=s?0:-1) \ +- for (j=s;jht.ht_self[j]; \ +- hkey = e->hte_key; \ ++ for (q=ht->ht.ht_size,s=i_%q;s>=0;q=s,s=s?0:-1) \ ++ for (e=ht->ht.ht_self,ee=e+q,e+=s;ehte_key; \ + if (hkey==OBJNULL) { \ +- if (e->hte_value==OBJNULL) return first_objnull ? first_objnull : e; \ +- if (!first_objnull) first_objnull=e; \ +- } else if (t_(key,hkey)) return e; \ ++ if (e->hte_value==OBJNULL) return first_open ? first_open : e; \ ++ if (!first_open) first_open=e; \ ++ } else if (t_(key,hkey)) return ht->ht.ht_cache=e; \ + } + +- switch (htest) { ++ switch (ht->ht.ht_test) { + case htt_eq: + hash_loop(eq,hash_eq(key)); + break; +@@ -237,7 +232,7 @@ gethash(object key, object hashtable) { + return &dummy; + } + +- return first_objnull ? first_objnull : (FEerror("No free spot in hashtable ~S.", 1, hashtable),&dummy); ++ return first_open ? first_open : (FEerror("No free spot in hashtable ~S.", 1, ht),&dummy); + + } + +@@ -290,7 +285,7 @@ object hashtable; + old = alloc_object(t_hashtable); + old->ht = hashtable->ht; + vs_push(old); +- hashtable->ht.ht_self = NULL; ++ hashtable->ht.ht_cache=hashtable->ht.ht_self = NULL; + hashtable->ht.ht_size = new_size; + if (type_of(hashtable->ht.ht_rhthresh) == t_fixnum) + hashtable->ht.ht_rhthresh = +@@ -365,6 +360,7 @@ DEFVAR("*DEFAULT-HASH-TABLE-REHASH-THRES + h->ht.ht_size = fix(size); + h->ht.ht_rhsize = rehash_size; + h->ht.ht_rhthresh = rehash_threshold; ++ h->ht.ht_cache=NULL; + h->ht.ht_nent = 0; + h->ht.ht_static = static!=Cnil ? 1 : 0; + h->ht.ht_self = NULL; +--- gcl-2.6.12.orig/o/list.d ++++ gcl-2.6.12/o/list.d +@@ -277,93 +277,78 @@ object on_stack_list_vector_new(int n,ob + return ans; + }*/ + +-object list_vector_new(int n,object first,va_list ap) +-{object ans,*p; ++object ++list_vector_new(int n,object first,va_list ap) { ++ ++ object ans,*p; + +- if (n == 0) return Cnil; +- ans = make_cons(first==OBJNULL ? va_arg(ap,object) : first,Cnil); +- p = & (ans->c.c_cdr); +- while (--n > 0) +- { *p = make_cons(va_arg(ap,object),Cnil); +- p = & ((*p)->c.c_cdr); +- } +- return ans;} ++ for (p=&ans;n-->0;first=OBJNULL) ++ collect(p,make_cons(first==OBJNULL ? va_arg(ap,object) : first,Cnil)); ++ *p=Cnil; ++ return ans; + ++} + +-/* clean this up */ +-/* static object on_stack_list(int n, ...) +-{va_list ap; +- object res; +- va_start(ap,n); +- res=on_stack_list_vector(n,ap); +- va_end(ap); +- return res; +-}*/ + #ifdef WIDE_CONS + #define maybe_set_type_of(a,b) set_type_of(a,b) + #else + #define maybe_set_type_of(a,b) + #endif + ++void ++free_check(void) { + ++ int n=tm_table[t_cons].tm_nfree,m; ++ object f=tm_table[t_cons].tm_free; ++ for (m=0;f!=OBJNULL;m++,f=OBJ_LINK(f)); ++ massert(n==m); ++} ++ + #define multi_cons(n_,next_,last_) \ +- ({static struct typemanager *_tm=tm_table+t_cons; \ +- object _lis=OBJNULL; \ +- \ +- if (n<=_tm->tm_nfree) { \ +- \ +- object _tail=_tm->tm_free; \ +- \ +- _lis=_tail; \ +- \ ++ ({_tm->tm_nfree -= n_; \ ++ for(_x=_tm->tm_free,_p=&_x;n_-->0;_p=&(*_p)->c.c_cdr) { \ ++ object _z=*_p; \ ++ pageinfo(_z)->in_use++; \ ++ maybe_set_type_of(_z,t_cons); \ ++ _z->c.c_cdr=OBJ_LINK(_z); \ ++ _z->c.c_car=next_; \ ++ } \ ++ _tm->tm_free=*_p; \ ++ *_p=SAFE_CDR(last_); \ ++ _x;}) ++ ++#define n_cons(n_,next_,last_) \ ++ ({fixnum _n=n_;object _x=Cnil,*_p; \ ++ static struct typemanager *_tm=tm_table+t_cons; \ ++ if (_n>=0) {/*FIXME vs_toptm_nfree -= n_; \ +- while (--n_) { \ +- pageinfo(_tail)->in_use++; \ +- maybe_set_type_of(_tail,t_cons); \ +- _tail->c.c_cdr=OBJ_LINK(_tail); \ +- _tail->c.c_car=next_; \ +- _tail=_tail->c.c_cdr; \ ++ if (_n<=_tm->tm_nfree) \ ++ _x=multi_cons(_n,next_,last_); \ ++ else { \ ++ for (_p=&_x;_n--;) \ ++ collect(_p,make_cons(next_,Cnil)); \ ++ *_p=SAFE_CDR(last_); \ + } \ +- _tm->tm_free=OBJ_LINK(_tail); \ +- pageinfo(_tail)->in_use++; \ +- maybe_set_type_of(_tail,t_cons); \ +- _tail->c.c_car=next_; \ +- _tail->c.c_cdr=SAFE_CDR(last_); \ +- \ + END_NO_INTERRUPT; \ + } \ +- _lis;}) +- +- +- +-object listqA(int a,int n,va_list ap) { +- +- object x,*p; +- +- if (n<=0) return Cnil; ++ _x;}) ++ ++object ++n_cons_from_x(fixnum n,object x) { + +- if ((x=multi_cons(n,va_arg(ap,object),a ? va_arg(ap,object) : Cnil))!=OBJNULL) +- return x; ++ return n_cons(n,({object _z=x->c.c_car;x=x->c.c_cdr;_z;}),Cnil); ++ ++} + +- CHECK_INTERRUPT; + +- p = vs_top; +- +- vs_push(Cnil); +- while(--n>=0) { +- *p=make_cons(va_arg(ap,object),Cnil); +- p= &((*p)->c.c_cdr); +- } +- if (a) +- *p=SAFE_CDR(va_arg(ap,object)); ++object ++listqA(int a,int n,va_list ap) { + +- return(vs_pop); ++ return n_cons(n,va_arg(ap,object),a ? va_arg(ap,object) : Cnil); + + } + +-object list(int n,...) { ++object list(fixnum n,...) { + + va_list ap; + object lis; +@@ -375,7 +360,7 @@ object list(int n,...) { + + } + +-object listA(int n,...) { ++object listA(fixnum n,...) { + + va_list ap; + object lis; +@@ -417,163 +402,63 @@ BEGIN: + object + append(object x, object y) { + +- object z; +- fixnum n; +- +- if (endp(x)) +- return(y); +- +- for (z=x,n=0;!endp(z);z=z->c.c_cdr,n++); +- if ((z=multi_cons(n,({object _t=x->c.c_car;x=x->c.c_cdr;_t;}),y))!=OBJNULL) +- return z; ++ return n_cons(length(x),({object _t=x->c.c_car;x=x->c.c_cdr;_t;}),y); + +- z = make_cons(Cnil, Cnil); +- vs_push(z); +- for (;;) { +- z->c.c_car = x->c.c_car; +- x = x->c.c_cdr; +- if (endp(x)) +- break; +- z->c.c_cdr = make_cons(Cnil, Cnil); +- z = z->c.c_cdr; +- } +- z->c.c_cdr = SAFE_CDR(y); +- return(vs_pop); + } + +- +- +-/* object */ +-/* append(x, y) */ +-/* object x, y; */ +-/* { */ +-/* object z; */ +- +-/* if (endp(x)) */ +-/* return(y); */ +-/* z = make_cons(Cnil, Cnil); */ +-/* vs_push(z); */ +-/* for (;;) { */ +-/* z->c.c_car = x->c.c_car; */ +-/* x = x->c.c_cdr; */ +-/* if (endp(x)) */ +-/* break; */ +-/* z->c.c_cdr = make_cons(Cnil, Cnil); */ +-/* z = z->c.c_cdr; */ +-/* } */ +-/* z->c.c_cdr = SAFE_CDR(y); */ +-/* return(vs_pop); */ +-/* } */ +- + /* + Copy_list(x) copies list x. + */ + object +-copy_list(x) +-object x; +-{ +- object y; +- +- if (type_of(x) != t_cons) +- return(x); +- y = make_cons(x->c.c_car, Cnil); +- vs_push(y); +- for (x = x->c.c_cdr; type_of(x) == t_cons; x = x->c.c_cdr) { +- y->c.c_cdr = make_cons(x->c.c_car, Cnil); +- y = y->c.c_cdr; +- } +- y->c.c_cdr = SAFE_CDR(x); +- return(vs_pop); ++copy_list(object x) { ++ object h,y; ++ ++ if (type_of(x) != t_cons) ++ return(x); ++ h=y=make_cons(x->c.c_car, Cnil); ++ for (x = x->c.c_cdr; type_of(x) == t_cons; x = x->c.c_cdr) { ++ y->c.c_cdr = make_cons(x->c.c_car, Cnil); ++ y=y->c.c_cdr; ++ } ++ y->c.c_cdr=SAFE_CDR(x); ++ return(h); + } + + /* + Copy_alist(x) copies alist x. + */ + static object +-copy_alist(x) +-object x; +-{ +- object y; ++copy_alist(object x) { + +- if (endp(x)) +- return(Cnil); +- y = make_cons(Cnil, Cnil); +- vs_push(y); +- for (;;) { +- y->c.c_car = make_cons(car(x->c.c_car), cdr(x->c.c_car)); +- x = x->c.c_cdr; +- if (endp(x)) +- break; +- y->c.c_cdr = make_cons(Cnil, Cnil); +- y = y->c.c_cdr; +- } +- return(vs_pop); ++ object h,y; ++ ++ if (endp(x)) ++ return(Cnil); ++ h=y=make_cons(Cnil, Cnil); ++ for (;;) { ++ y->c.c_car=make_cons(car(x->c.c_car), cdr(x->c.c_car)); ++ x=x->c.c_cdr; ++ if (endp(x)) ++ break; ++ y->c.c_cdr=make_cons(Cnil, Cnil); ++ y=y->c.c_cdr; ++ } ++ return(h); + } + +-/* +- Copy_tree(x) copies tree x +- and pushes the result onto vs. +-*/ +-static void +-copy_tree(x) +-object x; +-{ +- cs_check(x); +- +- if (type_of(x) == t_cons) { +- copy_tree(x->c.c_car); +- copy_tree(x->c.c_cdr); +- stack_cons(); +- } else +- vs_check_push(x); +-} +- +-/* /\* */ +-/* Subst(new, tree) pushes */ +-/* the result of substituting new in tree */ +-/* onto vs. */ +-/* *\/ */ +-/* static void */ +-/* subst(new, tree) */ +-/* object new, tree; */ +-/* { */ +-/* cs_check(new); */ +- +-/* if (TEST(tree)) */ +-/* vs_check_push(new); */ +-/* else if (type_of(tree) == t_cons) { */ +-/* subst(new, tree->c.c_car); */ +-/* subst(new, tree->c.c_cdr); */ +-/* stack_cons(); */ +-/* } else */ +-/* vs_check_push(tree); */ +-/* } */ +- +-/* static object */ +-/* subst1(object new, object tree) { */ +- +-/* if (TEST(tree)) */ +-/* return new; */ +-/* else if (type_of(tree) == t_cons) { */ +-/* object oa=tree->c.c_car,a=subst1(new,oa),od=tree->c.c_cdr,d=subst1(new,od); */ +-/* return a==oa && d==od ? tree : make_cons(a,d); */ +-/* } else */ +-/* return tree; */ +- +-/* } */ +- +-/* static object */ +-/* subst1qi(object new, object tree) { */ +- +-/* if (item_compared == tree) */ +-/* return new; */ +-/* else if (type_of(tree) == t_cons) { */ +-/* object oa=tree->c.c_car,a=subst1qi(new,oa),od=tree->c.c_cdr,d=subst1qi(new,od); */ +-/* return a==oa && d==od ? tree : make_cons(a,d); */ +-/* } else */ +-/* return tree; */ ++static object ++copy_tree(object x) { + +-/* } */ ++ object y; ++ ++ if (type_of(x) == t_cons) { ++ y=make_cons(Cnil,Cnil); ++ y->c.c_car=copy_tree(x->c.c_car); ++ y->c.c_cdr=copy_tree(x->c.c_cdr); ++ x=y; ++ } ++ return x; ++} + + /* + Nsubst(new, treep) stores +@@ -599,27 +484,22 @@ object new, *treep; + result of substituting tree by alist + onto vs. + */ +-static void +-sublis(alist, tree) +-object alist, tree; +-{ +- object x; +- cs_check(alist); +- ++static object ++sublis(object alist, object tree) { + +- for (x = alist; !endp(x); x = x->c.c_cdr) { +- item_compared = car(x->c.c_car); +- if (TEST(tree)) { +- vs_check_push(cdr(x->c.c_car)); +- return; +- } +- } +- if (type_of(tree) == t_cons) { +- sublis(alist, tree->c.c_car); +- sublis(alist, tree->c.c_cdr); +- stack_cons(); +- } else +- vs_check_push(tree); ++ object x; ++ cs_check(alist); ++ ++ for (x=alist;!endp(x);x=x->c.c_cdr) { ++ item_compared=car(x->c.c_car); ++ if (TEST(tree)) ++ return x->c.c_car->c.c_cdr; ++ } ++ if (type_of(tree) == t_cons) { ++ object a=sublis(alist,tree->c.c_car),d=sublis(alist,tree->c.c_cdr); ++ return (a==tree->c.c_car && d==tree->c.c_cdr) ? tree : make_cons(a,d); ++ } else ++ return tree; + } + + /* +@@ -777,7 +657,7 @@ DEFUN_NEW("TENTH",object,fLtenth,LISP,1, + LFD(Lcons)() { + + check_arg(2); +- stack_cons(); ++ vs_base[0]=make_cons(vs_base[0],vs_pop); + + } + +@@ -907,36 +787,28 @@ LFD(Llast)() { + + } + +-LFD(Llist)() +-{ +- vs_push(Cnil); +- while (vs_top > vs_base + 1) +- stack_cons(); +-} ++LFD(Llist)() { ++ ++ object *a; ++ ++ a=vs_base; ++ vs_base[0]=n_cons(vs_top-vs_base,*a++,Cnil); ++ vs_top=vs_base+1; + +-LFD(LlistA)() +-{ +- if (vs_top == vs_base) +- too_few_arguments(); +- while (vs_top > vs_base + 1) +- stack_cons(); + } +-/* static object copy_off_stack_tree(x) */ +-/* object x; */ +-/* {object *p; */ +-/* p = &x; */ +-/* TOP: */ +-/* if (type_of(*p) ==t_cons) */ +-/* { if(!inheap(*p)) */ +-/* *p=make_cons(copy_off_stack_tree((*p)->c.c_car),(*p)->c.c_cdr); */ +-/* else */ +-/* (*p)->c.c_car = copy_off_stack_tree((*p)->c.c_car); */ +-/* p = &((*p)->c.c_cdr); */ +-/* goto TOP;} */ +-/* return x; */ +-/* } */ + +- ++LFD(LlistA)() { ++ ++ object *a; ++ ++ if (vs_top == vs_base) ++ too_few_arguments(); ++ ++ a=vs_base; ++ vs_base[0]=n_cons(vs_top-vs_base-1,*a++,vs_head); ++ vs_top=vs_base+1; ++ ++} + + object on_stack_make_list(n) + int n; +@@ -957,23 +829,20 @@ int n; + goto TOP; + } + +-object make_list(n) +-int n; +-{object x =Cnil ; +- while (n-- > 0) +- x = make_cons(Cnil, x); +- return x;} ++object ++make_list(int n) { ++ ++ return n_cons(n,Cnil,Cnil); ++ ++} + + @(defun make_list (size &key initial_element &aux x) +- int i; + @ +- check_type_non_negative_integer(&size); +- if (type_of(size) != t_fixnum) +- FEerror("Cannot make a list of the size ~D.", 1, size); +- i = fix(size); +- while (i-- > 0) +- x = make_cons(initial_element, x); +- @(return x) ++ check_type_non_negative_integer(&size); ++ if (type_of(size) != t_fixnum) ++ FEerror("Cannot make a list of the size ~D.", 1, size); ++ x=n_cons(fix(size),initial_element,Cnil); ++ @(return x) + @) + + LFD(Lappend)() +@@ -1006,22 +875,19 @@ LFD(Lcopy_alist)() + LFD(Lcopy_tree)() + { + check_arg(1); +- copy_tree(vs_base[0]); +- vs_base[0] = vs_pop; ++ vs_base[0]=copy_tree(vs_base[0]); + } + + LFD(Lrevappend)() { +- object x, y; + +- check_arg(2); +- y = vs_pop; +- for (x = vs_base[0]; !endp(x); x = x->c.c_cdr) { +- vs_push(x->c.c_car); +- vs_push(y); +- stack_cons(); +- y = vs_pop; +- } +- vs_base[0] = y; ++ object x, y; ++ ++ check_arg(2); ++ y=vs_pop; ++ for (x=vs_base[0];!endp(x);x=x->c.c_cdr) ++ y=make_cons(x->c.c_car,y); ++ vs_base[0] = y; ++ + } + + object +@@ -1078,26 +944,19 @@ LFD(Lreconc)() { + } + + @(defun butlast (lis &optional (nn `make_fixnum(1)`)) +- int i; ++ int i; ++ object *p,x,y,z; + @ +- check_type_non_negative_integer(&nn); +- if (!listp(lis))/*FIXME checktype*/ +- FEwrong_type_argument(sLlist, lis); +- if (type_of(nn) != t_fixnum) +- @(return Cnil) +- for (i = 0; consp(lis); i++, lis = lis->c.c_cdr) +- vs_check_push(lis->c.c_car); +- if (i <= fix((nn))) { +- vs_top -= i; +- @(return Cnil) +- } +- vs_top -= fix((nn)); +- i -= fix((nn)); +- vs_push(Cnil); +- while (i-- > 0) +- stack_cons(); +- lis = vs_pop; +- @(return lis) ++ check_type_non_negative_integer(&nn); ++ if (!listp(lis))/*FIXME checktype*/ ++ FEwrong_type_argument(sLlist, lis); ++ if (type_of(nn) != t_fixnum) ++ @(return Cnil) ++ for (x=y=lis,i=0;ic.c_cdr); ++ for (p=&z;consp(y);x=x->c.c_cdr,y=y->c.c_cdr) ++ collect(p,make_cons(x->c.c_car,Cnil)); ++ *p=i ? Cnil : x; ++ @(return `z`) + @) + + @(defun nbutlast (lis &optional (nn `make_fixnum(1)`)) +@@ -1119,21 +978,20 @@ LFD(Lreconc)() { + @) + + LFD(Lldiff)() { +- fixnum i; +- object x; + +- check_arg(2); +- x = vs_base[0]; +- if (!listp(x))/*FIXME checktype*/ +- FEwrong_type_argument(sLlist, x); +- for (i = 0; consp(x) && x!=vs_base[1] ; i++, x = x->c.c_cdr) +- vs_check_push(x->c.c_car); /*FIXME but a segfault breaker at vs_limit*/ +- x=eql(x,vs_base[1]) ? Cnil : x; +- vs_check_push(x); +- while (i-- > 0) +- stack_cons(); +- vs_base[0] = vs_pop; +- vs_popp; ++ fixnum i; ++ object x,y,*p,z; ++ ++ check_arg(2); ++ x=vs_base[0]; ++ z=vs_pop; ++ if (!listp(x))/*FIXME checktype*/ ++ FEwrong_type_argument(sLlist, x); ++ for (p=&y,i=0;consp(x) && x!=z;i++,x=x->c.c_cdr) ++ collect(p,make_cons(x->c.c_car,Cnil)); ++ *p=eql(x,z) ? Cnil : x; ++ vs_base[0]=y; ++ + } + + LFD(Lrplaca)() +@@ -1187,18 +1045,15 @@ LFD(Lrplacd)() + PREDICATE(Lnsubst,Lnsubst_if,Lnsubst_if_not, 3) + + object +-sublis1(alist,tree,tst) +- object alist,tree; +- bool (*tst)(); +-{object v; +- for (v=alist ; v!=Cnil; v=v->c.c_cdr) +- { if ((*tst)(v->c.c_car->c.c_car ,tree)) +- return(v->c.c_car->c.c_cdr);} +- if (type_of(tree)==t_cons) +- {object ntree=make_cons(sublis1(alist,tree->c.c_car,tst), +- tree->c.c_cdr); +- ntree->c.c_cdr=sublis1(alist,ntree->c.c_cdr,tst); +- return ntree; ++sublis1(object alist,object tree,bool (*tst)()) { ++ ++ object v; ++ for (v=alist;v!=Cnil;v=v->c.c_cdr) { ++ if ((*tst)(v->c.c_car->c.c_car,tree)) ++ return(v->c.c_car->c.c_cdr);} ++ if (type_of(tree)==t_cons){ ++ object a=sublis1(alist,tree->c.c_car,tst),d=sublis1(alist,tree->c.c_cdr,tst); ++ return a==tree->c.c_car && d==tree->c.c_cdr ? tree : make_cons(a,d); + } + return tree; + } +@@ -1226,8 +1081,7 @@ check_alist(alist) + @ + protectTEST; + setupTEST(Cnil, test, test_not, key); +- sublis(alist, tree); +- tree = vs_pop; ++ tree=sublis(alist,tree); + restoreTEST; + @(return tree) + @) +@@ -1321,27 +1175,25 @@ LFD(Lacons)() + } + + @(defun pairlis (keys data &optional a_list) +- object *vp, k, d; ++ object k,d,y,z,*p; + @ +- vp = vs_top + 1; +- k = keys; +- d = data; +- while (!endp(k)) { +- if (endp(d)) +- FEerror( +- "The keys ~S and the data ~S are not of the same length", +- 2, keys, data); +- vs_check_push(make_cons(k->c.c_car, d->c.c_car)); +- k = k->c.c_cdr; +- d = d->c.c_cdr; +- } +- if (!endp(d)) +- FEerror("The keys ~S and the data ~S are not of the same length", +- 2, keys, data); +- vs_push(a_list); +- while (vs_top > vp) +- stack_cons(); +- @(return `vp[-1]`) ++ k=keys; ++ d=data; ++ p=&y; ++ while (!endp(k)) { ++ if (endp(d)) ++ FEerror("The keys ~S and the data ~S are not of the same length",2,keys,data); ++ z=make_cons(Cnil,Cnil); ++ z->c.c_car=make_cons(k->c.c_car,d->c.c_car); ++ collect(p,z); ++ k = k->c.c_cdr; ++ d = d->c.c_cdr; ++ } ++ if (!endp(d)) ++ FEerror("The keys ~S and the data ~S are not of the same length",2,keys,data); ++ *p=a_list; ++ vs_top=vs_base+1; ++ @(return `y`) + @) + + @(static defun assoc_or_rassoc (item a_list &key test test_not key) +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -91,8 +91,8 @@ $(DECL): $(HDIR)/make-decl.h $(INI_FILES + grab_defs: grab_defs.c + ${CC} $(OFLAGS) -o grab_defs grab_defs.c + +-wpool: wpool.c +- $(CC) $(CFLAGS) $(DEFS) -o $@ $< ++wpool: wpool.o ++ $(CC) $(LDFLAGS) -o $@ $< + + $(GCLIB): ${ALIB} + rm -f gcllib.a +--- gcl-2.6.12.orig/o/makefun.c ++++ gcl-2.6.12/o/makefun.c +@@ -6,12 +6,20 @@ + MakeAfun(addr,F_ARGD(min,max,flags,ARGTYPES(a,b,c,d)),0); + MakeAfun(addr,F_ARGD(2,3,NONE,ARGTYPES(OO,OO,OO,OO)),0); + */ ++ ++static int mv; ++ + object MakeAfun(object (*addr)(object,object), unsigned int argd, object data) +-{int type = (F_ARG_FLAGS_P(argd,F_requires_fun_passed) ? t_closure : t_afun); ++{ ++ ufixnum at=F_TYPES(argd)>>F_TYPE_WIDTH; ++ ufixnum ma=F_MIN_ARGS(argd); ++ ufixnum xa=F_MAX_ARGS(argd); ++ ufixnum rt=F_RESULT_TYPE(argd); ++ int type = (F_ARG_FLAGS_P(argd,F_requires_fun_passed) ? t_closure : (!at&&!rt&&ma==xa&&!mv ? t_sfun : t_afun)); + object x = alloc_object(type); + x->sfn.sfn_name = Cnil; + x->sfn.sfn_self = addr; +- x->sfn.sfn_argd = argd; ++ x->sfn.sfn_argd = type==t_sfun ? ma : argd; + if (type == t_closure) + { x->cl.cl_env = 0; + x->cl.cl_envdim=0;} +@@ -107,7 +115,7 @@ DEFUN_NEW("SET-KEY-STRUCT",object,fSset_ + } + + +-#define collect(top_,next_,val_) ({object _x=MMcons(val_,Cnil);\ ++#define mcollect(top_,next_,val_) ({object _x=MMcons(val_,Cnil);\ + if (top_==Cnil) top_=next_=_x; \ + else next_=next_->c.c_cdr=_x;}) + +@@ -125,23 +133,23 @@ put_fn_procls(object sym,fixnum argd,fix + for (i=0;i>=F_TYPE_WIDTH) + switch(maxargs!=minargs ? F_object : atypes & MASK_RANGE(0,F_TYPE_WIDTH)) { + case F_object: +- collect(ta,na,def); ++ mcollect(ta,na,def); + break; + case F_int: +- collect(ta,na,sLfixnum); ++ mcollect(ta,na,sLfixnum); + break; + case F_shortfloat: +- collect(ta,na,sLshort_float); ++ mcollect(ta,na,sLshort_float); + break; + case F_double_ptr: +- collect(ta,na,sLlong_float); ++ mcollect(ta,na,sLlong_float); + break; + default: + FEerror("Bad sfn declaration",0); + break; + } + if (maxargs!=minargs) +- collect(ta,na,sLA); ++ mcollect(ta,na,sLA); + putprop(sym,ta,sSproclaimed_arg_types); + ta=na=Cnil; + if (oneval) +@@ -188,15 +196,19 @@ LISP_makefun(char *strg, void *fn, unsig + void + SI_makefunm(char *strg, void *fn, unsigned int argd) + { object sym = make_si_ordinary(strg); +- fSfset(sym, fSmakefun(sym,fn,argd)); +- put_fn_procls(sym,argd,0,Ct,Ct); ++ mv=1; ++ fSfset(sym, fSmakefun(sym,fn,argd)); ++ mv=0; ++ put_fn_procls(sym,argd,0,Ct,Ct); + } + + void + LISP_makefunm(char *strg, void *fn, unsigned int argd) + { object sym = make_ordinary(strg); +- fSfset(sym, fSmakefun(sym,fn,argd)); +- put_fn_procls(sym,argd,0,Ct,Ct); ++ mv=1; ++ fSfset(sym, fSmakefun(sym,fn,argd)); ++ mv=0; ++ put_fn_procls(sym,argd,0,Ct,Ct); + } + + +--- gcl-2.6.12.orig/o/package.d ++++ gcl-2.6.12/o/package.d +@@ -849,17 +849,19 @@ FFN(Lpackage_shadowing_symbols)() + vs_base[0] = vs_base[0]->p.p_shadowings; + } + +-LFD(Llist_all_packages)() +-{ +- struct package *p; +- int i; ++LFD(Llist_all_packages)() { ++ ++ struct package *p; ++ object x,*l; ++ int i; ++ ++ check_arg(0); ++ ++ for (l=&x,p=pack_pointer,i=0;p!=NULL;p=p->p_link,i++) ++ collect(l,make_cons((object)p,Cnil)); ++ *l=Cnil; ++ vs_push(x); + +- check_arg(0); +- for (p = pack_pointer, i = 0; p != NULL; p = p->p_link, i++) +- vs_push((object)p); +- vs_push(Cnil); +- while (i-- > 0) +- stack_cons(); + } + + @(defun intern (strng &optional (p `current_package()`) &aux sym) +--- gcl-2.6.12.orig/o/predicate.c ++++ gcl-2.6.12/o/predicate.c +@@ -425,7 +425,7 @@ eql1(register object x,register object y + + /*x and y are not == and not Cnil and not immfix*/ + +- if (valid_cdr(x)||valid_cdr(y)||x->d.t!=y->d.t) return FALSE; ++ /* if (valid_cdr(x)||valid_cdr(y)||x->d.t!=y->d.t) return FALSE; */ + + switch (x->d.t) { + +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -41,6 +41,8 @@ int line_length = 72; + isLower((c)&0377) || (c) == ':') + + ++#define READ_TABLE_CASE (Vreadtable->s.s_dbind->rt.rt_case) ++ + #define mod(x) ((x)%Q_SIZE) + + +@@ -619,13 +621,113 @@ object coerce_big_to_string(object,int); + static bool + potential_number_p(object,int); + ++#define CASE_OF(x_) ({int _x=(x_);isUpper(_x) ? 1 : (isLower(_x) ? -1 : 0);}) ++ ++static int ++constant_case(object x) { ++ ++ fixnum i,j,jj; ++ ++ for (i=j=0;is.s_fillp;i++,j=j ? j : jj) ++ if (j*(jj=CASE_OF(x->s.s_self[i]))==-1) ++ return 0; ++ ++ return j; ++ ++} ++ ++static int ++all_dots(object x) { ++ ++ fixnum i; ++ ++ for (i=0;is.s_fillp;i++) ++ if (x->s.s_self[i]!='.') ++ return 0; ++ ++ return 1; ++ ++} ++ ++static int ++needs_escape (object x,int pp) { ++ ++ fixnum i; ++ char ch; ++ ++ if (!PRINTescape) ++ return 0; ++ ++ for (i=0;is.s_fillp;i++) ++ switch((ch=x->s.s_self[i])) { ++ case '(': ++ case ')': ++ case ':': ++ case '`': ++ case '\'': ++ case '"': ++ case ';': ++ case ',': ++ case '\n': ++ return 1; ++ case ' ': ++ if (!i) return 1; ++ default: ++ if ((READ_TABLE_CASE==sKupcase && isLower(ch)) || ++ (READ_TABLE_CASE==sKdowncase && isUpper(ch))) ++ return 1; ++ } ++ ++ if (pp) ++ if (potential_number_p(x, PRINTbase) || all_dots(x)) ++ return 1; ++ ++ return !x->s.s_fillp; ++ ++} ++ ++#define convertible_upper(c) ((READ_TABLE_CASE==sKupcase ||READ_TABLE_CASE==sKinvert)&& isUpper(c)) ++#define convertible_lower(c) ((READ_TABLE_CASE==sKdowncase||READ_TABLE_CASE==sKinvert)&& isLower(c)) ++ ++static void ++print_symbol_name_body(object x,int pp) { ++ ++ int i,j,fc,tc,lw,k,cc; ++ ++ cc=constant_case(x); ++ k=needs_escape(x,pp); ++ ++ if (k) ++ write_ch('|'); ++ ++ for (lw=i=0;is.s_fillp;i++) { ++ j = x->s.s_self[i]; ++ if (PRINTescape && (j == '|' || j == '\\')) ++ write_ch('\\'); ++ fc=convertible_upper(j) ? 1 : ++ (convertible_lower(j) ? -1 : 0); ++ tc=(READ_TABLE_CASE==sKinvert ? -cc : ++ (PRINTcase == sKupcase ? 1 : ++ (PRINTcase == sKdowncase ? -1 : ++ (PRINTcase == sKcapitalize ? (i==lw ? 1 : -1) : 0)))); ++ if (ispunct(j)||isspace(j)) lw=i+1; ++ j+=(tc*fc && !k ? (tc-fc)>>1 : 0)*('A'-'a'); ++ write_ch(j); ++ ++ } ++ ++ if (k) ++ write_ch('|'); ++ ++} ++ + void + write_object(x, level) + object x; + int level; + { + object r, y; +- int i, j, k,lw; ++ int i, j, k; + object *vp; + + cs_check(x); +@@ -797,117 +899,49 @@ int level; + break; + + case t_symbol: +- if (!PRINTescape) { +- for (lw = 0,i = 0; i < x->s.s_fillp; i++) { +- j = x->s.s_self[i]; +- if (isUpper(j)) { +- if (PRINTcase == sKdowncase || +- (PRINTcase == sKcapitalize && i!=lw)) +- j += 'a' - 'A'; +- } else if (!isLower(j)) +- lw = i + 1; +- write_ch(j); ++ { + +- } +- break; +- } +- if (x->s.s_hpack == Cnil) { +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('#'); +- return; +- } else { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('='); +- vp[1] = Ct; +- } +- } ++ if (PRINTescape) { ++ if (x->s.s_hpack == Cnil) { ++ if (PRINTcircle) { ++ for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) ++ if (x == *vp) { ++ if (vp[1] != Cnil) { ++ write_ch('#'); ++ write_decimal((vp-PRINTvs_top)/2+1); ++ write_ch('#'); ++ return; ++ } else { ++ write_ch('#'); ++ write_decimal((vp-PRINTvs_top)/2+1); ++ write_ch('='); ++ vp[1] = Ct; ++ } + } +- if (PRINTgensym) +- write_str("#:"); +- } else if (x->s.s_hpack == keyword_package) +- write_ch(':'); +- else if (PRINTpackage||find_symbol(x,current_package())!=x +- || intern_flag == 0) +- { +- k = 0; +- for (i = 0; +- i < x->s.s_hpack->p.p_name->st.st_fillp; +- i++) { +- j = x->s.s_hpack->p.p_name +- ->st.st_self[i]; +- if (to_be_escaped(j)) +- k++; +- } +- if (k > 0) +- write_ch('|'); +- for (lw = 0, i = 0; +- i < x->s.s_hpack->p.p_name->st.st_fillp; +- i++) { +- j = x->s.s_hpack->p.p_name +- ->st.st_self[i]; +- if (j == '|' || j == '\\') +- write_ch('\\'); +- if (k == 0) { +- if (isUpper(j)) { +- if (PRINTcase == sKdowncase || +- (PRINTcase == sKcapitalize && i!=lw)) +- j += 'a' - 'A'; +- } else if (!isLower(j)) +- lw = i + 1; +- } +- write_ch(j); +- } +- if (k > 0) +- write_ch('|'); +- if (find_symbol(x, x->s.s_hpack) != x) +- error("can't print symbol"); +- if (PRINTpackage || intern_flag == INTERNAL) +- write_str("::"); +- else if (intern_flag == EXTERNAL) +- write_ch(':'); +- else +- FEerror("Pathological symbol --- cannot print.", 0); + } +- k = 0; +- if (potential_number_p(x, PRINTbase)) +- k++; +- for (i = 0; i < x->s.s_fillp; i++) { +- j = x->s.s_self[i]; +- if (to_be_escaped(j)) +- k++; +- } +- for (i = 0; i < x->s.s_fillp; i++) +- if (x->s.s_self[i] != '.') +- goto NOT_DOT; +- k++; +- +- NOT_DOT: +- if (k > 0) +- write_ch('|'); +- for (lw = 0, i = 0; i < x->s.s_fillp; i++) { +- j = x->s.s_self[i]; +- if (j == '|' || j == '\\') +- write_ch('\\'); +- if (k == 0) { +- if (isUpper(j)) { +- if (PRINTcase == sKdowncase || +- (PRINTcase == sKcapitalize && i != lw)) +- j += 'a' - 'A'; +- } else if (!isLower(j)) +- lw = i + 1; +- } +- write_ch(j); +- } +- if (k > 0) +- write_ch('|'); +- break; ++ if (PRINTgensym) ++ write_str("#:"); ++ } else if (x->s.s_hpack == keyword_package) { ++ write_ch(':'); ++ } else if (PRINTpackage||find_symbol(x,current_package())!=x || !intern_flag) { ++ ++ print_symbol_name_body(x->s.s_hpack->p.p_name,0); ++ ++ if (find_symbol(x, x->s.s_hpack) != x) ++ error("can't print symbol"); ++ if (PRINTpackage || intern_flag == INTERNAL) ++ write_str("::"); ++ else if (intern_flag == EXTERNAL) ++ write_ch(':'); ++ else ++ FEerror("Pathological symbol --- cannot print.", 0); ++ ++ } + ++ } ++ print_symbol_name_body(x,1); ++ break; ++ } + case t_array: + { + int subscripts[ARANKLIM]; +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -695,10 +695,29 @@ BEGIN: + goto K; + else + break; +- } +- else if ('a' <= char_code(c) && char_code(c) <= 'z') +- c = code_char(char_code(c) - ('a' - 'A')); +- else if (char_code(c) == ':') { ++ } else { ++ ++ switch(char_code(c)) { ++ case '\b': ++ case '\t': ++ case '\n': ++ case '\r': ++ case '\f': ++ case ' ': ++ case '\177': ++ READER_ERROR(in,"Cannot read character"); ++ default: ++ break; ++ } ++ ++ if ('a' <= char_code(c) && char_code(c) <= 'z') { ++ if ('a' <= char_code(c) && char_code(c) <= 'z' && ++ (READtable->rt.rt_case==sKupcase || READtable->rt.rt_case==sKinvert)) ++ c = code_char(char_code(c) - ('a' - 'A')); ++ else if ('A' <= char_code(c) && char_code(c) <= 'Z' && ++ (READtable->rt.rt_case==sKdowncase || READtable->rt.rt_case==sKinvert)) ++ c = code_char(char_code(c) + ('a' - 'A')); ++ } else if (char_code(c) == ':') { + if (colon_type == 0) { + colon_type = 1; + colon = length; +@@ -707,6 +726,7 @@ BEGIN: + else + colon_type = -1; + /* Colon has appeared twice. */ ++ } + } + } + if (preserving_whitespace_flag || cat(c) != cat_whitespace) +@@ -807,46 +827,49 @@ SYMBOL: + } + + static void +-Lleft_parenthesis_reader() +-{ +- object in, x; +- object *p; ++Lleft_parenthesis_reader() { + +- check_arg(2); +- in = vs_base[0]; +- vs_head = Cnil; +- p = &vs_head; +- for (;;) { +- delimiting_char = code_char(')'); +- in_list_flag = TRUE; +- x = read_object(in); +- if (x == OBJNULL) +- goto ENDUP; +- if (dot_flag) { +- if (p == &vs_head) +- FEerror("A dot appeared after a left parenthesis.", 0); +- delimiting_char = code_char(')'); +- in_list_flag = TRUE; +- *p = SAFE_CDR(read_object(in)); +- if (dot_flag) +- FEerror("Two dots appeared consecutively.", 0); +- if (*p==OBJNULL) +- FEerror("Object missing after dot.", 0); +- delimiting_char = code_char(')'); +- in_list_flag = TRUE; +- if (read_object(in)!=OBJNULL) +- FEerror("Two objects after dot.",0); +- goto ENDUP; +- } +- vs_push(x); +- *p = make_cons(x, Cnil); +- vs_popp; +- p = &((*p)->c.c_cdr); +- } ++ object in, x; ++ object *p; ++ ++ check_arg(2); ++ in = vs_base[0]; ++ vs_top=vs_base+1; ++ p = &vs_head; ++ ++ for (;;) { ++ ++ delimiting_char = code_char(')'); ++ in_list_flag = TRUE; ++ ++ if ((x=read_object(in))==OBJNULL) { ++ *p=Cnil; ++ break; ++ } ++ ++ if (dot_flag) { ++ ++ if (p==&vs_head) READER_ERROR(in,"A dot appeared after a left parenthesis."); ++ ++ delimiting_char = code_char(')'); ++ in_list_flag = TRUE; ++ *p=SAFE_CDR(read_object(in)); ++ ++ if (dot_flag) READER_ERROR(in,"Two dots appeared consecutively."); ++ if (*p==OBJNULL) READER_ERROR(in,"Object missing after dot."); ++ ++ delimiting_char = code_char(')'); ++ in_list_flag = TRUE; ++ if (read_object(in)!=OBJNULL) READER_ERROR(in,"Two objects after dot."); ++ ++ break; ++ ++ } ++ ++ collect(p,make_cons(x,Cnil)); ++ ++ } + +-ENDUP: +- vs_base[0] = vs_pop; +- return; + } + + +@@ -959,13 +982,8 @@ static void + Lsingle_quote_reader() + { + check_arg(2); +- vs_popp; +- vs_push(sLquote); +- vs_push(read_object(vs_base[0])); +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- vs_base[0] = vs_pop; ++ vs_base[0] = list(2,sLquote,read_object(vs_base[0])); ++ vs_top=vs_base+1; + } + + static void +@@ -1111,14 +1129,8 @@ Lsharp_single_quote_reader() + check_arg(3); + if(vs_base[2] != Cnil && !READsuppress) + extra_argument('#'); +- vs_popp; +- vs_popp; +- vs_push(sLfunction); +- vs_push(read_object(vs_base[0])); +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- vs_base[0] = vs_pop; ++ vs_base[0] = list(2,sLfunction,read_object(vs_base[0])); ++ vs_top=vs_base+1; + } + + #define QUOTE 1 +@@ -1163,20 +1175,7 @@ Lsharp_left_parenthesis_reader() + } + goto L; + } +- vs_push(siScomma); +- vs_push(sLapply); +- vs_push(sLquote); +- vs_push(sLvector); +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- vs_push(vs_base[2]); +- vs_push(Cnil); +- stack_cons(); +- stack_cons(); +- stack_cons(); +- stack_cons(); +- vs_base = vs_top - 1; ++ vs_base[0]=list(4,siScomma,sLapply,list(2,sLquote,sLvector),vs_base[2]); + return; + } + vsp = vs_top; +@@ -1633,6 +1632,7 @@ object from, to; + rtab[i].rte_dtab[j] + = from->rt.rt_self[i].rte_dtab[j]; + } ++ to->rt.rt_case=from->rt.rt_case; + vs_reset; + END_NO_INTERRUPT;} + return(to); +@@ -1758,8 +1758,7 @@ READ: + x = read_object_recursive(strm); + if (x == OBJNULL) + break; +- *p = make_cons(x, Cnil); +- p = &((*p)->c.c_cdr); ++ collect(p,make_cons(x,Cnil)); + } + if (recursivep == Cnil) { + if (sSAsharp_eq_contextA->s.s_dbind!=Cnil) +@@ -2181,6 +2180,18 @@ LFD(Lreadtablep)() + @(return Ct) + @) + ++DEFUN_NEW("READTABLE-CASE",object,fLreadtable_case,LISP,1,1,NONE,OO,OO,OO,OO,(object rt),"") { ++ check_type_readtable_no_default(&rt); ++ RETURN1(rt->rt.rt_case); ++} ++ ++DEFUN_NEW("SET-READTABLE-CASE",object,fSset_readtable_case,SI,2,2,NONE,OO,OO,OO,OO,(object rt,object cas),"") { ++ check_type_readtable_no_default(&rt); ++ if (cas!=sKupcase && cas!=sKdowncase && cas!=sKpreserve && cas!=sKinvert) ++ TYPE_ERROR(cas,list(5,sLmember,sKupcase,sKdowncase,sKpreserve,sKinvert)); ++ RETURN1(rt->rt.rt_case=cas); ++} ++ + @(static defun get_dispatch_macro_character (dspchr subchr + &optional (rdtbl `current_readtable()`)) + @ +@@ -2348,6 +2359,13 @@ gcl_init_read() + + gcl_init_backq(); + ++ sKupcase = make_keyword("UPCASE"); ++ sKdowncase = make_keyword("DOWNCASE"); ++ sKpreserve = make_keyword("PRESERVE"); ++ sKinvert = make_keyword("INVERT"); ++ ++ standard_readtable->rt.rt_case=sKupcase; ++ + Vreadtable + = make_special("*READTABLE*", + copy_readtable(standard_readtable, Cnil)); +--- gcl-2.6.12.orig/o/reference.c ++++ gcl-2.6.12/o/reference.c +@@ -73,18 +73,14 @@ LFD(Lsymbol_function)(void) + if (type_of(sym) != t_symbol) + not_a_symbol(sym); + if (sym->s.s_sfdef != NOT_SPECIAL) { +- vs_push(make_fixnum((long)(sym->s.s_sfdef))); +- vs_base[0] = sLspecial; +- stack_cons(); +- return; ++ vs_base[0]=make_cons(sLspecial,make_fixnum((long)(sym->s.s_sfdef))); ++ return; + } + if (sym->s.s_gfdef==OBJNULL) + FEundefined_function(sym); + if (sym->s.s_mflag) { +- vs_push(sym->s.s_gfdef); +- vs_base[0] = sSmacro; +- stack_cons(); +- return; ++ vs_base[0]=make_cons(sSmacro,sym->s.s_gfdef); ++ return; + } + vs_base[0] = sym->s.s_gfdef; + } +--- gcl-2.6.12.orig/o/sequence.d ++++ gcl-2.6.12/o/sequence.d +@@ -205,16 +205,7 @@ E: + } + if (e < 0) + @(return `copy_list(sequence)`) +- for (i = 0; i < e; i++) { +- if (type_of(sequence) != t_cons) +- goto ILLEGAL_START_END; +- vs_check_push(sequence->c.c_car); +- sequence = sequence->c.c_cdr; +- } +- vs_push(Cnil); +- while (e-- > 0) +- stack_cons(); +- x = vs_pop; ++ x=n_cons_from_x(e,sequence); + @(return x) + + case t_vector: +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -165,7 +165,7 @@ sgc_sweep_phase(void) { + tm = tm_of((enum type)v->type); + + p = pagetochar(page(v)); +- f = tm->tm_free; ++ f = FREELIST_TAIL(tm); + k = 0; + size=tm->tm_size; + +@@ -189,7 +189,7 @@ sgc_sweep_phase(void) { + + /* it is ok to free x */ + +- SET_LINK(x,f); ++ SET_LINK(f,x); + make_free(x); + #ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(v->type)) x->d.s = SGC_RECENT; +@@ -198,7 +198,8 @@ sgc_sweep_phase(void) { + k++; + + } +- tm->tm_free = f; ++ SET_LINK(f,OBJNULL); ++ tm->tm_tail = f; + tm->tm_nfree += k; + v->in_use-=k; + +@@ -674,34 +675,38 @@ sgc_start(void) { + contain the others */ + for (i= t_start; i < t_contiguous ; i++) + if (TM_BASE_TYPE_P(i) && (np=(tm=tm_of(i))->tm_sgc)) { +- object f=tm->tm_free ,x,y,next; ++ object f=tm->tm_free,xf,yf; ++ struct freelist x,y;/*the f_link heads have to be separated on the stack*/ + fixnum count=0; +- x=y=OBJNULL; + ++ xf=PHANTOM_FREELIST(x.f_link); ++ yf=PHANTOM_FREELIST(y.f_link); + while (f!=OBJNULL) { +- next=OBJ_LINK(f); + #ifdef SDEBUG + if (!is_free(f)) + printf("Not FREE in freelist f=%d",f); + #endif + if (pageinfo(f)->sgc_flags&SGC_PAGE_FLAG) { +- SET_LINK(f,x); ++ SET_LINK(xf,f); + #ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(pageinfo(f)->type)) f->d.s = SGC_RECENT; + #endif +- x=f; ++ xf=f; + count++; + } else { +- SET_LINK(f,y); ++ SET_LINK(yf,f); + #ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(pageinfo(f)->type)) f->d.s = SGC_NORMAL; + #endif +- y=f; ++ yf=f; + } +- f=next; ++ f=OBJ_LINK(f); + } +- tm->tm_free = x; +- tm->tm_alt_free = y; ++ SET_LINK(xf,OBJNULL); ++ tm->tm_free = OBJ_LINK(&x); ++ tm->tm_tail = xf; ++ SET_LINK(yf,OBJNULL); ++ tm->tm_alt_free = OBJ_LINK(&y); + tm->tm_alt_nfree = tm->tm_nfree - count; + tm->tm_nfree=count; + } +@@ -853,38 +858,21 @@ sgc_quit(void) { + for (i= t_start; i < t_contiguous ; i++) + + if (TM_BASE_TYPE_P(i) && (np=(tm=tm_of(i))->tm_sgc)) { +- +- object f,y; +- +- f=tm->tm_free; +- if (f==OBJNULL) +- tm->tm_free=tm->tm_alt_free; +- else { +- /* tack the alt_free onto the end of free */ +-#ifdef SDEBUG +- fixnum count=0; +- f=tm->tm_free; +- while(y= (object) F_LINK(f)) { +- if(y->d.s != SGC_RECENT) +- printf("[bad %d]",y); +- count++; f=y; ++ ++ object n=tm->tm_free,o=tm->tm_alt_free,f=PHANTOM_FREELIST(tm->tm_free); ++ ++ for (;n!=OBJNULL && o!=OBJNULL;) ++ if (o!=OBJNULL && (n==OBJNULL || otm_alt_free) +- while(y= F_LINK(f)) { +- if(y->d.s != SGC_NORMAL) +- printf("[alt_bad %d]",y); +- count++; f=y; +- } +- +-#endif +- f=tm->tm_free; +- while((y= (object) F_LINK(f))!=OBJNULL) +- f=y; +- F_LINK(f)= (long)(tm->tm_alt_free); +- } +- /* tm->tm_free has all of the free objects */ ++ SET_LINK(f,OBJNULL); ++ tm->tm_tail=f; + tm->tm_nfree += tm->tm_alt_nfree; + tm->tm_alt_nfree = 0; + tm->tm_alt_free = OBJNULL; +--- gcl-2.6.12.orig/o/structure.c ++++ gcl-2.6.12/o/structure.c +@@ -182,22 +182,19 @@ object + structure_to_list(object x) + { + +- object *p, s; +- struct s_data *def=S_DATA(x->str.str_def); +- int i, n; +- +- s = def->slot_descriptions; +- vs_push(def->name); +- vs_push(Cnil); +- p = &vs_head; +- for (i=0, n=def->length; !endp(s)&&ic.c_cdr, i++) { +- *p = make_cons(car(s->c.c_car), Cnil); +- p = &((*p)->c.c_cdr); +- *p = make_cons(structure_ref(x,x->str.str_def,i), Cnil); +- p = &((*p)->c.c_cdr); +- } +- stack_cons(); +- return(vs_pop); ++ object *p,s,v; ++ struct s_data *def=S_DATA(x->str.str_def); ++ int i,n; ++ ++ s=def->slot_descriptions; ++ for (p=&v,i=0,n=def->length;!endp(s)&&ic.c_cdr,i++) { ++ collect(p,make_cons(car(s->c.c_car),Cnil)); ++ collect(p,make_cons(structure_ref(x,x->str.str_def,i),Cnil)); ++ } ++ *p=Cnil; ++ ++ return make_cons(def->name,v); ++ + } + + LFD(siLmake_structure)(void) +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -169,9 +169,8 @@ DEF_ORDINARY("DIRECTORY",sKdirectory,KEY + DEF_ORDINARY("LINK",sKlink,KEYWORD,""); + DEF_ORDINARY("FILE",sKfile,KEYWORD,""); + +-DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +- +- struct stat ss; ++static int ++stat_internal(object x,struct stat *ssp) { + + if (type_of(x)==t_string) { + +@@ -180,19 +179,43 @@ DEFUNM_NEW("STAT",object,fSstat,SI,1,1,N + #ifdef __MINGW32__ + {char *p=FN1+strlen(FN1)-1;for (;p>FN1 && *p=='/';p--) *p=0;} + #endif +- if (lstat(FN1,&ss)) +- RETURN1(Cnil); ++ if (lstat(FN1,ssp)) ++ return 0; + } else if ((x=file_stream(x))!=Cnil&&x->sm.sm_fp) { +- if (fstat(fileno(x->sm.sm_fp),&ss)) +- RETURN1(Cnil); ++ if (fstat(fileno(x->sm.sm_fp),ssp)) ++ return 0; + } else +- RETURN1(Cnil); ++ return 0; ++ return 1; ++} ++ ++static object ++stat_mode_key(struct stat *ssp) { + +- RETURN4(S_ISDIR(ss.st_mode) ? sKdirectory : +- (S_ISLNK(ss.st_mode) ? sKlink : sKfile), +- make_fixnum(ss.st_size), +- make_fixnum(ss.st_mtime), +- make_fixnum(ss.st_uid)); ++ return S_ISDIR(ssp->st_mode) ? sKdirectory : (S_ISLNK(ssp->st_mode) ? sKlink : sKfile); ++ ++} ++ ++DEFUN_NEW("STAT1",object,fSstat1,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ ++ struct stat ss; ++ ++ RETURN1(stat_internal(x,&ss) ? stat_mode_key(&ss) : Cnil); ++ ++} ++ ++ ++DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ ++ struct stat ss; ++ ++ if (stat_internal(x,&ss)) ++ RETURN4(stat_mode_key(&ss), ++ make_fixnum(ss.st_size), ++ make_fixnum(ss.st_mtime), ++ make_fixnum(ss.st_uid)); ++ else ++ RETURN1(Cnil); + + } + +--- gcl-2.6.12.orig/o/wpool.c ++++ gcl-2.6.12/o/wpool.c +@@ -3,7 +3,7 @@ + #define NO_PRELINK_UNEXEC_DIVERSION + char *rb_end=NULL,*rb_start=NULL,*heap_end=NULL; + void *data_start=NULL; +-int use_pool=1; ++int multiprocess_memory_pool=1; + + #include "include.h" + #include "page.h" +@@ -20,9 +20,9 @@ assert_error(const char *a,unsigned l,co + int + main(int argc,char * argv[],char * envp[]) { + +- int s; ++ int s=3; + +- sscanf(argv[1],"%d",&s); ++ if (argc>1) sscanf(argv[1],"%d",&s); + open_pool(); + for (;;) { + lock_pool(); +--- gcl-2.6.12.orig/pcl/sys-proclaim.lisp ++++ gcl-2.6.12/pcl/sys-proclaim.lisp +@@ -2,402 +2,1009 @@ + (COMMON-LISP::IN-PACKAGE "PCL") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ PCL::NON-NEGATIVE-FIXNUM) ++ PCL::CACHE-SIZE PCL::CACHE-MASK PCL::CACHE-NLINES ++ PCL::CACHE-MAX-LOCATION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ PCL::COMPILE-LAMBDA-DEFERRED ++ PCL::EARLY-SLOT-DEFINITION-LOCATION PCL::FGEN-SYSTEM ++ PCL::EARLY-CLASS-PRECEDENCE-LIST PCL::MAKE-CLASS-EQ-PREDICATE ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS PCL::USE-CACHING-DFUN-P ++ WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE ++ PCL::SFUN-P PCL::INTERN-EQL-SPECIALIZER ++ PCL::ACCESSOR-DFUN-INFO-P WALKER::ENV-WALK-FORM ++ PCL::ARG-INFO-NUMBER-OPTIONAL PCL::TWO-CLASS-ACCESSOR-TYPE ++ PCL::FREE-CACHE PCL::SHOW-DFUN-COSTS PCL::CHECKING-CACHE ++ PCL::EARLY-GF-P PCL::EARLY-COLLECT-CPL PCL::NO-METHODS-CACHE ++ PCL::EXTRACT-PARAMETERS PCL::DEFAULT-CONSTANTP ++ PCL::PARSE-SPECIALIZERS ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION ++ PCL::DFUN-INFO-P PCL::CLASS-PRECEDENCE-DESCRIPTION-P ++ PCL::%FBOUNDP PCL::ONE-INDEX-DFUN-INFO-INDEX ++ PCL::ONE-CLASS-CACHE PCL::DEFAULT-STRUCTURE-INSTANCE-P ++ PCL::CONSTANT-VALUE-CACHE PCL::STRUCTURE-SVUC-METHOD ++ PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P ++ PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P ++ PCL::STRUCTURE-SLOTD-WRITER-FUNCTION PCL::CCLOSUREP ++ PCL::COUNT-DFUN PCL::COMPUTE-STD-CPL-PHASE-2 ++ PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME ++ PCL::EARLY-SLOT-DEFINITION-NAME PCL::MAP-SPECIALIZERS ++ PCL::MAKE-CONSTANT-FUNCTION PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P ++ PCL::DEFAULT-TEST-CONVERTER ++ PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES PCL::TWO-CLASS-INDEX ++ PCL::CACHE-P PCL::ARG-INFO-PRECEDENCE ++ PCL::STRUCTURE-SLOTD-INIT-FORM PCL::INITIAL-P ++ PCL::EXTRACT-REQUIRED-PARAMETERS PCL::%STD-INSTANCE-WRAPPER ++ PCL::FUNCTION-PRETTY-ARGLIST PCL::INTERN-FUNCTION-NAME ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST ++ PCL::FLUSH-CACHE-VECTOR-INTERNAL PCL::TWO-CLASS-P ++ PCL::CHECK-CACHE PCL::RESET-INITIALIZE-INFO ++ PCL::ONE-INDEX-DFUN-INFO-P PCL::LEGAL-CLASS-NAME-P ++ PCL::UPDATE-PV-TABLE-CACHE-INFO ++ PCL::RESET-CLASS-INITIALIZE-INFO PCL::DISPATCH-P ++ PCL::%STD-INSTANCE-SLOTS PCL::SETFBOUNDP PCL::LOOKUP-FGEN ++ PCL::MAKE-INITFUNCTION PCL::FORCE-CACHE-FLUSHES ++ PCL::COMPLICATED-INSTANCE-CREATION-METHOD ++ PCL::NET-TEST-CONVERTER WALKER::ENV-DECLARATIONS ++ SYSTEM::%STRUCTURE-NAME PCL::GMAKUNBOUND PCL::TWO-CLASS-CACHE ++ PCL::STRUCTURE-TYPE PCL::CPD-CLASS PCL::CPD-AFTER ++ PCL::FAST-METHOD-CALL-P PCL::FGEN-GENERATOR-LAMBDA ++ PCL::CHECKING-FUNCTION PCL::DEFAULT-CONSTANT-CONVERTER ++ PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 ++ PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL PCL::EARLY-METHOD-CLASS ++ PCL::BUILT-IN-WRAPPER-OF PCL::EXPAND-SHORT-DEFCOMBIN ++ PCL::WRAPPER-OF ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION ++ PCL::PV-TABLEP PCL::EARLY-CLASS-NAME-OF ++ PCL::GET-MAKE-INSTANCE-FUNCTION PCL::ARG-INFO-KEY/REST-P ++ PCL::MAKE-EQL-PREDICATE PCL::STRUCTURE-SLOTD-READER-FUNCTION ++ PCL::CACHING-DFUN-INFO PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE ++ PCL::N-N-ACCESSOR-TYPE PCL::FAST-METHOD-CALL-PV-CELL ++ PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION ++ PCL::EXTRACT-SPECIALIZER-NAMES PCL::MAKE-TYPE-PREDICATE ++ PCL::GET-CACHE-VECTOR PCL::SORT-SLOTS ++ PCL::DEFAULT-STRUCTURE-TYPE SYSTEM::%COMPILED-FUNCTION-NAME ++ PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS WALKER::ENV-LOCK ++ PCL::ONE-INDEX-DFUN-INFO-CACHE PCL::ONE-INDEX-P ++ PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION ++ PCL::STANDARD-SVUC-METHOD PCL::MAKE-FUNCTION-INLINE ++ PCL::ALLOCATE-CACHE-VECTOR PCL::SLOT-BOUNDP-SYMBOL ++ PCL::METHOD-CALL-P PCL::STD-INSTANCE-P ++ PCL::GET-BUILT-IN-WRAPPER-SYMBOL PCL::FUNCALLABLE-INSTANCE-P ++ PCL::ECD-CANONICAL-SLOTS PCL::GET-BUILT-IN-CLASS-SYMBOL ++ PCL::FREE-CACHE-VECTOR PCL::GF-INFO-STATIC-C-A-M-EMF ++ PCL::EARLY-GF-NAME PCL::UPDATE-CLASS-CAN-PRECEDE-P ++ PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P ++ PCL::ACCESSOR-DFUN-INFO-CACHE PCL::ARG-INFO-VALID-P ++ PCL::ONE-CLASS-INDEX WALKER::GET-WALKER-TEMPLATE ++ PCL::GFS-OF-TYPE PCL::N-N-P PCL::METHOD-CALL-CALL-METHOD-ARGS ++ PCL::BOOTSTRAP-CLASS-PREDICATES PCL::MAKE-INITIAL-DFUN ++ PCL::ONE-CLASS-WRAPPER0 PCL::ECD-OTHER-INITARGS ++ PCL::TWO-CLASS-WRAPPER1 PCL::MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::FUNCTION-RETURNING-T PCL::STRUCTURE-SLOTD-TYPE ++ PCL::ARG-INFO-APPLYP PCL::ECD-SUPERCLASS-NAMES ++ PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION ++ PCL::FGEN-GENSYMS PCL::EARLY-METHOD-STANDARD-ACCESSOR-P ++ PCL::DEFAULT-METHOD-ONLY-CACHE WALKER::ENV-LEXICAL-VARIABLES ++ PCL::ECD-CLASS-NAME PCL::GET-MAKE-INSTANCE-FUNCTIONS ++ PCL::EARLY-CLASS-DEFINITION PCL::ECD-METACLASS ++ PCL::UNDEFMETHOD-1 PCL::MAKE-CALL-METHODS ++ PCL::METHOD-LL->GENERIC-FUNCTION-LL PCL::SORT-CALLS ++ ITERATE::VARIABLES-FROM-LET PCL::GF-LAMBDA-LIST ++ PCL::INITIALIZE-INFO-KEY PCL::EARLY-CLASS-DIRECT-SUBCLASSES ++ PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE ++ PCL::MAKE-PERMUTATION-VECTOR PCL::EXTRACT-LAMBDA-LIST ++ PCL::CONSTANT-VALUE-DFUN-INFO PCL::DNET-METHODS-P ++ PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME ++ PCL::UPDATE-GFS-OF-CLASS PCL::SLOT-VECTOR-SYMBOL ++ PCL::COMPUTE-MCASE-PARAMETERS PCL::GBOUNDP ++ PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD PCL::CONSTANT-SYMBOL-P ++ PCL::CPD-SUPERS PCL::DEFAULT-METHOD-ONLY-P ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::CACHE-OWNER PCL::FAST-INSTANCE-BOUNDP-P ++ PCL::INITIALIZE-INFO-WRAPPER ++ PCL::INITIALIZE-INFO-CACHED-VALID-P PCL::EVAL-FORM ++ PCL::DEFAULT-STRUCTUREP PCL::FUNCTION-RETURNING-NIL ++ PCL::ONE-CLASS-P PCL::ARG-INFO-KEYWORDS ++ PCL::EARLY-CLASS-SLOTDS PCL::GET-PV-CELL-FOR-CLASS ++ PCL::ONE-CLASS-ACCESSOR-TYPE PCL::GENERIC-CLOBBERS-FUNCTION ++ PCL::DFUN-INFO-CACHE PCL::MAKE-PV-TABLE-TYPE-DECLARATION ++ PCL::RESET-CLASS-INITIALIZE-INFO-1 PCL::CLASS-FROM-TYPE ++ PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST ++ PCL::EARLY-METHOD-LAMBDA-LIST ++ PCL::EARLY-COLLECT-DEFAULT-INITARGS ++ PCL::COMPILE-LAMBDA-UNCOMPILED ++ PCL::INITIALIZE-INFO-CACHED-RI-VALID-P PCL::STRUCTURE-TYPE-P ++ PCL::%SYMBOL-FUNCTION PCL::MAKE-CALLS-TYPE-DECLARATION ++ PCL::SLOT-READER-SYMBOL PCL::KEYWORD-SPEC-NAME ++ PCL::FIND-CYCLE-REASONS PCL::UPDATE-ALL-C-A-M-GF-INFO ++ PCL::INITIALIZE-INFO-P ++ PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P ++ PCL::INITIAL-DISPATCH-CACHE PCL::CACHING-CACHE ++ PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS ++ PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST ++ PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS PCL::CONSTANT-VALUE-P ++ PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL PCL::EARLY-CLASS-SLOTS ++ PCL::UPDATE-C-A-M-GF-INFO PCL::GDEFINITION ++ PCL::ARG-INFO-LAMBDA-LIST PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL ++ PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION ++ PCL::MAKE-PV-TYPE-DECLARATION ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P PCL::DISPATCH-CACHE ++ PCL::ONE-INDEX-ACCESSOR-TYPE ++ PCL::INITIALIZE-INFO-CACHED-CONSTANTS PCL::NO-METHODS-P ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION ++ PCL::CACHING-DFUN-COST PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE ++ PCL::COMPUTE-CLASS-SLOTS PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE ++ PCL::GF-INFO-FAST-MF-P PCL::GF-INFO-C-A-M-EMF-STD-P ++ PCL::FGEN-TEST PCL::STRUCTURE-SLOTD-NAME PCL::CLASS-PREDICATE ++ PCL::STRUCTURE-SLOT-BOUNDP PCL::EARLY-CLASS-NAME ++ PCL::LIST-LARGE-CACHE PCL::ONE-INDEX-CACHE ++ PCL::SYMBOL-PKG-NAME PCL::INITIAL-CACHE ++ PCL::UNENCAPSULATED-FDEFINITION PCL::STORE-FGEN ++ PCL::FINAL-ACCESSOR-DFUN-TYPE ++ PCL::INITIALIZE-INFO-CACHED-NEW-KEYS PCL::TYPE-CLASS ++ PCL::%CCLOSURE-ENV PCL::INITIALIZE-INFO-BOUND-SLOTS ++ PCL::GF-DFUN-CACHE PCL::EXPAND-LONG-DEFCOMBIN ++ PCL::FGEN-GENERATOR PCL::DFUN-ARG-SYMBOL ++ PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST ++ PCL::EARLY-METHOD-QUALIFIERS ++ WALKER::VARIABLE-GLOBALLY-SPECIAL-P COMMON-LISP::CLASS-OF ++ PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION ++ PCL::GET-SETF-FUNCTION-NAME PCL::ARG-INFO-P ++ WALKER::ENV-WALK-FUNCTION PCL::LIST-DFUN ++ PCL::CHECK-WRAPPER-VALIDITY PCL::ARG-INFO-METATYPES ++ PCL::EXPAND-MAKE-INSTANCE-FORM PCL::STRUCTURE-OBJECT-P ++ PCL::COMPUTE-LINE-SIZE PCL::CANONICAL-SLOT-NAME ++ PCL::INITIAL-DISPATCH-P PCL::NEXT-WRAPPER-FIELD ++ PCL::WRAPPER-FIELD PCL::WRAPPER-FOR-STRUCTURE ++ PCL::METHOD-FUNCTION-PV-TABLE PCL::COPY-CACHE PCL::ECD-SOURCE ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::UNPARSE-SPECIALIZERS PCL::CHECKING-P ++ PCL::FORMAT-CYCLE-REASONS PCL::N-N-CACHE ++ PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION ++ PCL::MAP-ALL-GENERIC-FUNCTIONS PCL::METHOD-FUNCTION-METHOD ++ PCL::UPDATE-GF-INFO PCL::ARG-INFO-NKEYS ++ PCL::TWO-CLASS-WRAPPER0 PCL::GF-DFUN-INFO PCL::ONE-INDEX-INDEX ++ PCL::EARLY-COLLECT-SLOTS PCL::CACHING-P ++ PCL::METHOD-FUNCTION-PLIST PCL::SLOT-WRITER-SYMBOL ++ PCL::FAST-METHOD-CALL-ARG-INFO PCL::INTERNED-SYMBOL-P ++ ITERATE::SEQUENCE-ACCESSOR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ PCL::LIST-LARGE-CACHES ++ PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::UNTRACE-METHOD ++ COMMON-LISP::INVALID-METHOD-ERROR ++ COMMON-LISP::METHOD-COMBINATION-ERROR)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| ++ PCL::|__si::MAKE-TWO-CLASS| PCL::FALSE PCL::MAKE-PV-TABLE ++ PCL::|__si::MAKE-DISPATCH| PCL::MAKE-INITIALIZE-INFO ++ PCL::|__si::MAKE-PV-TABLE| PCL::MAKE-FAST-INSTANCE-BOUNDP ++ PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| ++ WALKER::UNBOUND-LEXICAL-FUNCTION ++ PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| PCL::|__si::MAKE-N-N| ++ PCL::USE-PACKAGE-PCL PCL::|__si::MAKE-CHECKING| ++ PCL::|STRUCTURE-OBJECT class constructor| ++ PCL::|__si::MAKE-CONSTANT-VALUE| ++ PCL::CALLED-FIN-WITHOUT-FUNCTION PCL::|__si::MAKE-INITIAL| ++ PCL::|__si::MAKE-CACHE| PCL::|__si::MAKE-ONE-INDEX| ++ PCL::MAKE-PROGN PCL::TRUE PCL::MAKE-FAST-METHOD-CALL ++ PCL::|__si::MAKE-ARG-INFO| PCL::INTERN-PV-TABLE ++ PCL::|__si::MAKE-DFUN-INFO| PCL::|__si::MAKE-STD-INSTANCE| ++ PCL::|__si::MAKE-CACHING| PCL::|__si::MAKE-ONE-CLASS| ++ PCL::PV-WRAPPERS-FROM-PV-ARGS PCL::ZERO ++ PCL::|__si::MAKE-INITIAL-DISPATCH| ++ PCL::|__si::MAKE-NO-METHODS| PCL::STRING-APPEND ++ PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| PCL::MAKE-METHOD-CALL ++ PCL::FIX-EARLY-GENERIC-FUNCTIONS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ PCL::METHOD-PROTOTYPE-FOR-GF PCL::SPECIALIZER-FROM-TYPE ++ PCL::EMIT-ONE-INDEX-WRITERS PCL::*NORMALIZE-TYPE ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF PCL::ANALYZE-LAMBDA-LIST ++ PCL::PARSE-DEFMETHOD PCL::GET-DISPATCH-FUNCTION ++ PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA ++ PCL::EMIT-CONSTANT-VALUE PCL::FIND-WRAPPER ++ PCL::MAKE-FINAL-DISPATCH-DFUN PCL::EARLY-COLLECT-INHERITANCE ++ PCL::GENERIC-FUNCTION-NAME-P PCL::EMIT-TWO-CLASS-READER ++ PCL::PARSE-METHOD-GROUP-SPECIFIER PCL::EMIT-ONE-CLASS-READER ++ PCL::FIND-STRUCTURE-CLASS PCL::EMIT-TWO-CLASS-WRITER ++ PCL::CONVERT-TO-SYSTEM-TYPE PCL::TYPE-FROM-SPECIALIZER ++ PCL::EMIT-ONE-CLASS-WRITER PCL::EARLY-METHOD-FUNCTION ++ PCL::MAKE-DISPATCH-DFUN PCL::NET-CODE-CONVERTER ++ PCL::GET-GENERIC-FUNCTION-INFO PCL::DEFAULT-CODE-CONVERTER ++ PCL::COMPILE-IIS-FUNCTIONS PCL::EMIT-ONE-INDEX-READERS ++ PCL::STRUCTURE-WRAPPER PCL::CLASS-EQ-TYPE ++ PCL::EMIT-IN-CHECKING-CACHE-P PCL::PCL-DESCRIBE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- PCL::%CCLOSURE-ENV-NTHCDR)) ++ ITERATE::RENAME-AND-CAPTURE-VARIABLES ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ WALKER::WALK-PROG PCL::INVALIDATE-WRAPPER ++ PCL::COMPUTE-PRECEDENCE ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ WALKER::WALK-LAMBDA PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| ++ WALKER::WALK-MULTIPLE-VALUE-BIND ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| ++ PCL::NOTE-PV-TABLE-REFERENCE ++ PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ WALKER::WALK-MULTIPLE-VALUE-SETQ PCL::CONVERT-TABLE ++ WALKER::WALK-LET ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ PCL::|(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| ++ PCL::SKIP-FAST-SLOT-ACCESS-P ++ PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::OPTIMIZE-SLOT-BOUNDP PCL::TRACE-EMF-CALL-INTERNAL ++ ITERATE::SIMPLE-EXPAND-GATHERING-FORM ++ PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ WALKER::WALK-FLET PCL::ONE-CLASS-DFUN-INFO ++ WALKER::WALK-COMPILER-LET ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ PCL::FIRST-FORM-TO-LISP WALKER::WALK-DO* ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| ++ PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| ++ PCL::PRINT-STD-INSTANCE ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ WALKER::WALK-MACROLET PCL::GET-FUNCTION-GENERATOR ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS* ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::COMPUTE-EFFECTIVE-METHOD PCL::EXPAND-DEFGENERIC ++ PCL::OBSOLETE-INSTANCE-TRAP WALKER::WALK-TAGBODY-1 ++ PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL ++ PCL::GET-NEW-FUNCTION-GENERATOR PCL::SORT-METHODS ++ WALKER::WALK-DO PCL::MAKE-DFUN-CALL ++ PCL::OPTIMIZE-GF-CALL-INTERNAL ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ PCL::OPTIMIZE-SET-SLOT-VALUE ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ PCL::ENTRY-IN-CACHE-P ++ PCL::|(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ WALKER::WALK-IF PCL::MAKE-METHOD-SPEC PCL::SET-FUNCTION-NAME-1 ++ WALKER::WALK-SETQ ++ PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ PCL::DECLARE-STRUCTURE PCL::EMIT-BOUNDP-CHECK ++ WALKER::WALK-LOCALLY ++ PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::CAN-OPTIMIZE-ACCESS PCL::|SETF PCL PLIST-VALUE| ++ WALKER::WALK-LABELS PCL::EMIT-1-T-DLAP ++ PCL::|(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ PCL::SORT-APPLICABLE-METHODS ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ WALKER::WALK-NAMED-LAMBDA ITERATE::OPTIMIZE-ITERATE-FORM ++ PCL::MAP-ALL-ORDERS ++ PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ ITERATE::OPTIMIZE-GATHERING-FORM ++ PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ PCL::ONE-INDEX-DFUN-INFO ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| ++ PCL::FLUSH-CACHE-TRAP WALKER::WALK-PROG* ++ ITERATE::VARIABLE-SAME-P PCL::EMIT-SLOT-READ-FORM ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| ++ PCL::EMIT-GREATER-THAN-1-DLAP ++ PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| ++ PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS WALKER::WALK-LET* ++ WALKER::WALK-SYMBOL-MACROLET WALKER::VARIABLE-DECLARATION ++ PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ WALKER::RECONS ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| ++ PCL::OPTIMIZE-SLOT-VALUE WALKER::RELIST-INTERNAL ++ PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ PCL::|SETF PCL METHOD-FUNCTION-GET| WALKER::WALK-TAGBODY ++ WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL ++ PCL::|(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| ++ PCL::PRINT-CACHE PCL::MAKE-TOP-LEVEL-FORM ++ PCL::FIX-SLOT-ACCESSORS WALKER::WALK-UNEXPECTED-DECLARE ++ PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) +- PCL::GET-WRAPPER-CACHE-NUMBER)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::GET-DECLARATION ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE ++ PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION ++ PCL::GET-METHOD-FUNCTION-PV-CELL ++ PCL::NAMED-OBJECT-PRINT-FUNCTION ++ PCL::FIND-CLASS-PREDICATE-FROM-CELL ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION1 PCL::RECORD-DEFINITION ++ PCL::PROBE-CACHE PCL::INITIALIZE-INFO PCL::EMIT-MISS ++ PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION ++ PCL::FIND-CLASS-FROM-CELL PCL::PRECOMPUTE-EFFECTIVE-METHODS ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 ++ PCL::METHOD-FUNCTION-GET PCL::MAP-CACHE ++ WALKER::CONVERT-MACRO-TO-LAMBDA PCL::MAKE-EMF-FROM-METHOD ++ PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS ++ PCL::REAL-ENSURE-GF-USING-CLASS--NULL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- PCL::NON-NEGATIVE-FIXNUM) +- PCL::CACHE-NLINES PCL::CACHE-MASK PCL::CACHE-SIZE +- PCL::CACHE-MAX-LOCATION)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL ++ PCL::BOOTSTRAP-SET-SLOT ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (T T))| ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ WALKER::WALK-TEMPLATE ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ PCL::OPTIMIZE-WRITER ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ PCL::|(FAST-METHOD DOCUMENTATION (T))| ++ PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION1 ++ PCL::|(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ PCL::LOAD-PRECOMPILED-IIS-ENTRY PCL::ADJUST-CACHE ++ WALKER::WALK-PROG/PROG* ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ PCL::OPTIMIZE-READER ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ WALKER::WALK-BINDINGS-2 PCL::MEMF-TEST-CONVERTER ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| ++ PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR ++ PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| ++ PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ PCL::MAKE-DISPATCH-LAMBDA ++ PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ WALKER::WALK-DO/DO* PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE ++ PCL::|(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ PCL::GET-WRAPPERS-FROM-CLASSES ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::EXPAND-CACHE ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| ++ PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ PCL::EXPAND-SYMBOL-MACROLET-INTERNAL ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ WALKER::WALK-LET/LET* ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ PCL::EXPAND-DEFCLASS PCL::INITIALIZE-INSTANCE-SIMPLE ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| ++ PCL::|(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| ++ PCL::MAYBE-EXPAND-ACCESSOR-FORM ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| ++ PCL::FILL-CACHE-P ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRELIMINARY ++ PCL::TWO-CLASS-DFUN-INFO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- COMMON-LISP::SIMPLE-VECTOR) +- PCL::CACHE-VECTOR)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::EXPAND-EMF-CALL-METHOD ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS ++ PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| ++ PCL::MAKE-INSTANCE-FUNCTION-COMPLEX ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| ++ PCL::UPDATE-SLOTS-IN-PV ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| ++ PCL::MAKE-PARAMETER-REFERENCES ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 ++ PCL::OPTIMIZE-INSTANCE-ACCESS PCL::OPTIMIZE-ACCESSOR-CALL ++ PCL::OPTIMIZE-GENERIC-FUNCTION-CALL ++ PCL::REAL-MAKE-METHOD-INITARGS-FORM ++ PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| ++ PCL::COMPUTE-PV-SLOT PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 ++ PCL::LOAD-FUNCTION-GENERATOR ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::GET-MAKE-INSTANCE-FUNCTION-INTERNAL ++ PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T T))| ++ PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ WALKER::WALK-BINDINGS-1 PCL::MAKE-INSTANCE-FUNCTION-SIMPLE ++ PCL::MAKE-FGEN WALKER::WALK-TEMPLATE-HANDLE-REPEAT ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::MAKE-EMF-CACHE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::BOOTSTRAP-INITIALIZE-CLASS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::REAL-LOAD-DEFCLASS PCL::LOAD-DEFCLASS ++ PCL::OPTIMIZE-GF-CALL PCL::MAKE-EARLY-CLASS-DEFINITION ++ WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 PCL::EMIT-SLOT-ACCESS ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::SET-ARG-INFO1)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::FILL-CACHE PCL::REAL-GET-METHOD PCL::MAKE-EMF-CALL ++ PCL::EMIT-FETCH-WRAPPER PCL::CHECK-INITARGS-1 ++ PCL::CAN-OPTIMIZE-ACCESS1 PCL::CHECK-INITARGS-2-PLIST ++ PCL::CHECK-INITARGS-2-LIST WALKER::WALK-ARGLIST ++ PCL::GET-METHOD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION1 PCL::EMIT-DLAP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::FILL-DFUN-CACHE PCL::EARLY-ADD-NAMED-METHOD ++ PCL::REAL-ADD-NAMED-METHOD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- PCL::ACCESSOR-VALUES-INTERNAL ++ PCL::ACCESSOR-VALUES1 PCL::CHECK-METHOD-ARG-INFO ++ PCL::EMIT-READER/WRITER PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P ++ PCL::|(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION ++ PCL::CACHE-MISS-VALUES ++ PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::MAKE-FINAL-CACHING-DFUN + PCL::MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ PCL::MAKE-FINAL-CONSTANT-VALUE-DFUN ++ PCL::|(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| + PCL::|(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN +- PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| +- PCL::CHECK-METHOD-ARG-INFO +- PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| +- PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION +- PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ PCL::ACCESSOR-VALUES-INTERNAL ITERATE::EXPAND-INTO-LET + PCL::MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION +- PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P +- ITERATE::WALK-GATHERING-BODY ++ PCL::CONSTANT-VALUE-MISS ++ PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION ++ WALKER::WALK-LET-IF ITERATE::WALK-GATHERING-BODY + PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER +- PCL::|(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| +- PCL::SLOT-BOUNDP-USING-CLASS-DFUN WALKER::WALK-FORM-INTERNAL +- PCL::LOAD-LONG-DEFCOMBIN PCL::MAKE-FINAL-CACHING-DFUN +- PCL::EMIT-READER/WRITER +- PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION +- PCL::SLOT-VALUE-USING-CLASS-DFUN PCL::CACHING-MISS +- PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| +- PCL::EMIT-READER/WRITER-FUNCTION PCL::ACCESSOR-VALUES1 +- PCL::GENERATING-LISP PCL::GET-CLASS-SLOT-VALUE-1 +- PCL::MAKE-FINAL-CONSTANT-VALUE-DFUN PCL::CACHE-MISS-VALUES +- WALKER::WALK-LET-IF + PCL::|(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| +- PCL::|(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- PCL::CHECKING-MISS ITERATE::EXPAND-INTO-LET ++ PCL::CHECKING-MISS PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN ++ PCL::GENERATING-LISP ITERATE::RENAME-VARIABLES ++ PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ PCL::CONVERT-METHODS PCL::SLOT-VALUE-USING-CLASS-DFUN ++ PCL::EMIT-READER/WRITER-FUNCTION ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ PCL::CACHING-MISS + PCL::MAKE-OPTIMIZED-STD-WRITER-METHOD-FUNCTION +- PCL::CONSTANT-VALUE-MISS ITERATE::RENAME-VARIABLES +- PCL::|(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ PCL::GET-CLASS-SLOT-VALUE-1 WALKER::WALK-FORM-INTERNAL ++ PCL::SLOT-BOUNDP-USING-CLASS-DFUN PCL::LOAD-LONG-DEFCOMBIN ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ PCL::|(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| + PCL::SET-SLOT-VALUE +- PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| + PCL::|(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- PCL::CONVERT-METHODS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| +- PCL::|(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- PCL::MAKE-TWO-CLASS-ACCESSOR-DFUN +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| +- PCL::ADD-METHOD-DECLARATIONS +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| +- PCL::WALK-METHOD-LAMBDA +- PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))|)) ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::*) +- PCL::GET-ACCESSOR-METHOD-FUNCTION +- PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ PCL::ORDER-SPECIALIZERS ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ PCL::EMIT-CHECKING-OR-CACHING ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| + PCL::|(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ PCL::GENERATE-DISCRIMINATION-NET ++ PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| + PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::GET-ACCESSOR-METHOD-FUNCTION + PCL::|(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- PCL::GENERATE-DISCRIMINATION-NET + PCL::|(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- PCL::LOAD-SHORT-DEFCOMBIN +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| +- PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| +- PCL::REAL-MAKE-METHOD-LAMBDA PCL::SET-CLASS-SLOT-VALUE-1 +- PCL::BOOTSTRAP-ACCESSOR-DEFINITION + PCL::MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- PCL::ACCESSOR-MISS PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- PCL::ACCESSOR-VALUES ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION PCL::ACCESSOR-MISS ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ PCL::LOAD-SHORT-DEFCOMBIN PCL::MAKE-FINAL-CHECKING-DFUN ++ PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| ++ PCL::MAKE-SHARED-INITIALIZE-FORM-LIST + PCL::|(FAST-METHOD DESCRIBE-OBJECT (T T))| +- PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| +- PCL::EMIT-CHECKING-OR-CACHING-FUNCTION + PCL::INITIALIZE-INSTANCE-SIMPLE-FUNCTION +- PCL::MAKE-FINAL-CHECKING-DFUN +- PCL::MAKE-SHARED-INITIALIZE-FORM-LIST +- PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- PCL::EMIT-CHECKING-OR-CACHING +- PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| + PCL::|(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| +- PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN ++ PCL::ACCESSOR-VALUES PCL::REAL-MAKE-METHOD-LAMBDA ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITION ++ PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN + PCL::GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION + PCL::|(FAST-METHOD NO-APPLICABLE-METHOD (T))| +- PCL::ORDER-SPECIALIZERS +- PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))|)) ++ PCL::SET-CLASS-SLOT-VALUE-1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- PCL::MAKE-N-N-ACCESSOR-DFUN +- PCL::GET-SIMPLE-INITIALIZATION-FUNCTION +- PCL::MAKE-FINAL-ACCESSOR-DFUN +- PCL::GET-EFFECTIVE-METHOD-FUNCTION PCL::MAKE-ACCESSOR-TABLE +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION PCL::MAKE-CHECKING-DFUN +- PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS +- PCL::MAKE-DEFAULT-INITARGS-FORM-LIST PCL::REAL-ADD-METHOD +- PCL::SLOT-VALUE-OR-DEFAULT PCL::LOAD-DEFGENERIC PCL::CPL-ERROR +- WALKER::NESTED-WALK-FORM PCL::TYPES-FROM-ARGUMENTS +- PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION)) ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::WALK-METHOD-LAMBDA ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ PCL::COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ PCL::|(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ PCL::MAKE-TWO-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| ++ PCL::ADD-METHOD-DECLARATIONS ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) ++ PCL::PV-TABLE-CALL-LIST PCL::CACHE-OVERFLOW ++ PCL::PV-TABLE-SLOT-NAME-LISTS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION +- PCL::GENERATE-DISCRIMINATION-NET-INTERNAL +- PCL::CACHE-MISS-VALUES-INTERNAL +- PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::DO-SHORT-METHOD-COMBINATION PCL::MEMF-CODE-CONVERTER)) ++ PCL::MAKE-DEFAULT-INITARGS-FORM-LIST ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION PCL::LOAD-DEFGENERIC ++ PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION ++ PCL::SLOT-VALUE-OR-DEFAULT PCL::MAKE-CHECKING-DFUN ++ PCL::MAKE-FINAL-ACCESSOR-DFUN WALKER::NESTED-WALK-FORM ++ PCL::MAKE-ACCESSOR-TABLE PCL::REAL-ADD-METHOD ++ PCL::TYPES-FROM-ARGUMENTS ++ PCL::GET-SIMPLE-INITIALIZATION-FUNCTION PCL::CPL-ERROR ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION ++ PCL::MAKE-N-N-ACCESSOR-DFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::*) + COMMON-LISP::*) +- PCL::MAKE-ONE-INDEX-ACCESSOR-DFUN WALKER::WALK-DECLARATIONS +- PCL::GET-SECONDARY-DISPATCH-FUNCTION)) ++ PCL::REAL-MAKE-A-METHOD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| +- PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| +- ITERATE::ITERATE-TRANSFORM-BODY)) ++ COMMON-LISP::T) ++ PCL::LOAD-DEFMETHOD-INTERNAL PCL::EXPAND-DEFMETHOD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- ITERATE::RENAME-LET-BINDINGS +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE1)) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::EARLY-MAKE-A-METHOD PCL::LOAD-DEFMETHOD ++ PCL::MAKE-DEFMETHOD-FORM PCL::MAKE-DEFMETHOD-FORM-INTERNAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- PCL::REAL-MAKE-A-METHOD)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(PCL::REDEFINE-FUNCTION PCL::DO-STANDARD-DEFSETF-1 +- PCL::TRACE-METHOD-INTERNAL PCL::FDEFINE-CAREFULLY)) ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE1 ++ ITERATE::RENAME-LET-BINDINGS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- PCL::ANALYZE-LAMBDA-LIST PCL::GET-DISPATCH-FUNCTION +- PCL::PARSE-DEFMETHOD PCL::MAKE-DISPATCH-DFUN +- PCL::EMIT-IN-CHECKING-CACHE-P PCL::EMIT-ONE-INDEX-READERS +- PCL::METHOD-PROTOTYPE-FOR-GF PCL::EMIT-ONE-CLASS-READER +- PCL::GENERIC-FUNCTION-NAME-P PCL::DEFAULT-CODE-CONVERTER +- PCL::CLASS-EQ-TYPE PCL::CONVERT-TO-SYSTEM-TYPE +- PCL::COMPILE-IIS-FUNCTIONS PCL::EMIT-CONSTANT-VALUE +- PCL::GET-GENERIC-FUNCTION-INFO PCL::EARLY-METHOD-FUNCTION +- PCL::FIND-STRUCTURE-CLASS PCL::PCL-DESCRIBE +- PCL::NET-CODE-CONVERTER PCL::PARSE-METHOD-GROUP-SPECIFIER +- PCL::TYPE-FROM-SPECIALIZER PCL::EMIT-TWO-CLASS-WRITER +- PCL::COMPUTE-APPLICABLE-METHODS-EMF PCL::EMIT-ONE-CLASS-WRITER +- PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA +- PCL::SPECIALIZER-FROM-TYPE PCL::EARLY-COLLECT-INHERITANCE +- PCL::EMIT-TWO-CLASS-READER PCL::FIND-WRAPPER +- PCL::*NORMALIZE-TYPE PCL::EMIT-ONE-INDEX-WRITERS +- PCL::STRUCTURE-WRAPPER PCL::MAKE-FINAL-DISPATCH-DFUN)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::DO-SHORT-METHOD-COMBINATION ++ PCL::GENERATE-DISCRIMINATION-NET-INTERNAL ++ PCL::CACHE-MISS-VALUES-INTERNAL ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::MEMF-CODE-CONVERTER ++ PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- PCL::|__si::MAKE-INITIAL| PCL::|__si::MAKE-ARG-INFO| +- PCL::STRING-APPEND PCL::|__si::MAKE-ONE-INDEX| +- PCL::MAKE-INITIALIZE-INFO PCL::MAKE-FAST-METHOD-CALL +- PCL::|__si::MAKE-STD-INSTANCE| +- PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| +- PCL::|__si::MAKE-CONSTANT-VALUE| PCL::|__si::MAKE-N-N| +- PCL::FIX-EARLY-GENERIC-FUNCTIONS PCL::INTERN-PV-TABLE +- PCL::FALSE PCL::|__si::MAKE-DFUN-INFO| +- PCL::|__si::MAKE-CACHING| PCL::MAKE-PV-TABLE +- PCL::MAKE-METHOD-CALL PCL::TRUE PCL::MAKE-PROGN +- PCL::|__si::MAKE-CACHE| +- PCL::|STRUCTURE-OBJECT class constructor| +- PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| +- PCL::|__si::MAKE-NO-METHODS| PCL::|__si::MAKE-ONE-CLASS| +- PCL::|__si::MAKE-PV-TABLE| PCL::PV-WRAPPERS-FROM-PV-ARGS +- WALKER::UNBOUND-LEXICAL-FUNCTION PCL::|__si::MAKE-TWO-CLASS| +- PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| +- PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| +- PCL::MAKE-FAST-INSTANCE-BOUNDP +- PCL::CALLED-FIN-WITHOUT-FUNCTION PCL::USE-PACKAGE-PCL +- PCL::|__si::MAKE-CHECKING| PCL::|__si::MAKE-INITIAL-DISPATCH| +- PCL::|__si::MAKE-DISPATCH|)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ WALKER::WALK-DECLARATIONS PCL::GET-SECONDARY-DISPATCH-FUNCTION ++ PCL::MAKE-ONE-INDEX-ACCESSOR-DFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) +- PCL::METHOD-CALL-FUNCTION PCL::FAST-METHOD-CALL-FUNCTION +- PCL::CACHE-LIMIT-FN)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION2)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) +- PCL::CACHE-VALUEP)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ ITERATE::ITERATE-TRANSFORM-BODY ++ PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::INTEGER 1 255)) +- PCL::CACHE-NKEYS)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ PCL::COMPUTE-STD-CPL-PHASE-3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::INTEGER 1 256)) +- PCL::CACHE-LINE-SIZE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::FIXNUM) ++ COMMON-LISP::T) ++ PCL::FILL-CACHE-FROM-CACHE-P PCL::GET-CACHE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- PCL::SYMBOL-APPEND)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) ++ PCL::GET-WRAPPER-CACHE-NUMBER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- (COMMON-LISP::*)) +- PCL::SORT-APPLICABLE-METHODS PCL::SORT-METHODS)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) ++ PCL::METHOD-CALL-FUNCTION PCL::FAST-METHOD-CALL-FUNCTION ++ PCL::CACHE-LIMIT-FN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- PCL::COMPUTE-CALLS PCL::SET-STRUCTURE-SVUC-METHOD +- PCL::UPDATE-STD-OR-STR-METHODS PCL::SET-METHODS +- WALKER::NOTE-LEXICAL-BINDING ++ PCL::MEC-ALL-CLASS-LISTS PCL::REMOVE-SLOT-ACCESSORS ++ PCL::PARSE-GSPEC PCL::STANDARD-INSTANCE-ACCESS ++ PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER ++ PCL::UPDATE-STD-OR-STR-METHODS PCL::CLASS-MIGHT-PRECEDE-P ++ PCL::ACCESSOR-SET-SLOT-VALUE PCL::DOPLIST ++ PCL::ADD-SLOT-ACCESSORS PCL::DFUN-MISS ++ PCL::FSC-INSTANCE-WRAPPER PCL::CLASS-EQ-TEST ++ PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION ++ PCL::MAKE-EARLY-ACCESSOR WALKER::ENVIRONMENT-MACRO ++ PCL::WITH-DFUN-WRAPPERS PCL::WRAPPER-STATE ++ PCL::DFUN-INFO-WRAPPER0 ++ WALKER::WITH-NEW-DEFINITION-IN-ENVIRONMENT PCL::IF* ++ PCL::CHECK-WRAPPER-VALIDITY1 ++ PCL::INITIALIZE-INFO-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::BUILT-IN-OR-STRUCTURE-WRAPPER ++ PCL::FIND-CLASS-CELL-PREDICATE PCL::CLASS-CAN-PRECEDE-P ++ COMMON-LISP::CALL-METHOD PCL::NET-CONSTANT-CONVERTER ++ PCL::UPDATE-INITIALIZE-INFO-INTERNAL ++ PCL::GET-CACHE-VECTOR-LOCK-COUNT PCL::UNDEFMETHOD ++ PCL::%SET-SVREF PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS ++ PCL::WRAPPER-NO-OF-INSTANCE-SLOTS PCL::CACHE-VECTOR-LOCK-COUNT ++ WALKER::VARIABLE-LEXICAL-P PCL::FIN-LAMBDA-FN ++ PCL::INITIAL-CLASSES-AND-WRAPPERS PCL::MLOOKUP ++ PCL::RAISE-METATYPE ITERATE::WHILE PCL::EARLY-GF-ARG-INFO ++ PCL::INVALID-WRAPPER-P WALKER::VARIABLE-SPECIAL-P ++ PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRECOMPILED ++ PCL::INSTANCE-WRITE-INTERNAL WALKER::WALK-REPEAT-EVAL ++ WALKER::GET-WALKER-TEMPLATE-INTERNAL ITERATE::PLIST-ELEMENTS ++ PCL::MAKE-FIND-CLASS-CELL COMMON-LISP::WITH-ACCESSORS ++ PCL::MAKE-METHOD-FUNCTION PCL::SIMPLE-LEXICAL-METHOD-FUNCTIONS ++ PCL::CANONICALIZE-DEFCLASS-OPTION PCL::UPDATE-INITS PCL::SCASE ++ PCL::INSTANCE-BOUNDP-INTERNAL PCL::FMC-FUNCALL ++ PCL::SET-METHODS PCL::CACHE-LOCK-COUNT PCL::GET-WRAPPER ++ PCL::INVOKE-METHOD-CALL1 PCL::MAKE-CLASS-PREDICATE ++ PCL::PRINTING-RANDOM-THING PCL::UPDATE-SLOTS ++ PCL::FUNCTION-APPLY PCL::AUGMENT-TYPE ITERATE::WITH-GATHERING ++ PCL::CHECKING-DFUN-INFO PCL::LIST-EQ PCL::CACHE-VECTOR-SIZE ++ PCL::DESCRIBE-PACKAGE PCL::WRAPPER-REF PCL::PLIST-VALUE ++ PCL::%INSTANCE-REF WALKER::NOTE-DECLARATION ++ PCL::MAKE-STD-READER-METHOD-FUNCTION ++ PCL::EMIT-READER/WRITER-MACRO WALKER::ENVIRONMENT-FUNCTION ++ PCL::N-N-DFUN-INFO ++ PCL::FIND-CLASS-CELL-MAKE-INSTANCE-FUNCTION-KEYS ++ PCL::DEFCONSTRUCTOR PCL::INSTANCE-SLOT-INDEX ++ PCL::CLASS-NO-OF-INSTANCE-SLOTS ITERATE::ELEMENTS ++ PCL::NEXT-WRAPPER-CACHE-NUMBER-INDEX ++ PCL::INITIALIZE-INFO-COMBINED-INITARGS-FORM-LIST ++ COMMON-LISP::DEFINE-METHOD-COMBINATION PCL::MDOTIMES ++ PCL::REMOVE-DIRECT-SUBCLASSES PCL::MAKE-WRAPPER-INTERNAL ++ ITERATE::MAXIMIZING PCL::PV-OFFSET ++ PCL::DEAL-WITH-ARGUMENTS-OPTION PCL::INSTANCE-READER ++ PCL::ALLOCATE-STANDARD-INSTANCE--MACRO PCL::DEFINE-INLINES ++ PCL::WRAPPER-CACHE-NUMBER-VECTOR PCL::GATHERING1 ++ PCL::FIND-CLASS-CELL-CLASS PCL::SWAP-WRAPPERS-AND-SLOTS ++ PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION PCL::PV-TABLE-LOOKUP ++ PCL::WRAPPER-INSTANCE-SLOTS-LAYOUT ++ WALKER::WALKER-ENVIRONMENT-BIND PCL::COPY-SLOTS PCL::MCASE ++ PCL::ADD-TO-CVECTOR PCL::ADD-DIRECT-SUBCLASSES ++ PCL::%SET-CCLOSURE-ENV PCL::PRECOMPILE-RANDOM-CODE-SEGMENTS ++ PCL::UPDATE-CLASS PCL::SLOT-SYMBOL PCL::VALUE-FOR-CACHING ++ PCL::EXPANDING-MAKE-INSTANCE-TOP-LEVEL PCL::REMTAIL ++ PCL::MAKE-DISCRIMINATING-FUNCTION-ARGLIST ++ PCL::CLASSES-HAVE-COMMON-SUBCLASS-P ++ PCL::FIRST-WRAPPER-CACHE-NUMBER-INDEX ++ PCL::INITIALIZE-INFO-INITARGS-FORM-LIST ++ PCL::WITH-MAKE-INSTANCE-FUNCTION-VALID-P-CHECK ++ PCL::FUNCALLABLE-INSTANCE-DATA-1 PCL::SAUT-NOT-EQL ++ PCL::EARLY-GF-METHODS ITERATE::EXTRACT-SPECIAL-BINDINGS ++ PCL::MEMQ PCL::DFUN-UPDATE ++ PCL::MAKE-CHECKING-OR-CACHING-FUNCTION-LIST PCL::ONCE-ONLY ++ PCL::GET-INSTANCE-WRAPPER-OR-NIL PCL::SYMBOL-LESSP ++ PCL::|SETF PCL FIND-CLASS| PCL::PARSE-QUALIFIER-PATTERN + ITERATE::SIMPLE-EXPAND-ITERATE-FORM +- PCL::|SETF PCL METHOD-FUNCTION-PLIST| PCL::SAUT-NOT-PROTOTYPE +- PCL::VALUE-FOR-CACHING PCL::PROCLAIM-DEFMETHOD +- PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST +- PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION PCL::METHODS-CONVERTER +- PCL::DEAL-WITH-ARGUMENTS-OPTION +- PCL::UPDATE-ALL-PV-TABLE-CACHES +- PCL::MAP-PV-TABLE-REFERENCES-OF PCL::UPDATE-CLASS +- PCL::FIND-STANDARD-II-METHOD +- PCL::METHOD-FUNCTION-RETURNING-NIL +- PCL::REDIRECT-EARLY-FUNCTION-INTERNAL PCL::UPDATE-CPL +- PCL::QUALIFIER-CHECK-RUNTIME PCL::COMPUTE-STD-CPL +- PCL::COMPUTE-CONSTANTS PCL::ADD-FORMS PCL::AUGMENT-TYPE +- PCL::MEMF-CONSTANT-CONVERTER PCL::SWAP-WRAPPERS-AND-SLOTS +- PCL::SET-WRAPPER PCL::GET-KEY-ARG PCL::MAKE-PLIST +- PCL::MAKE-PV-TABLE-INTERNAL ITERATE::EXTRACT-SPECIAL-BINDINGS +- PCL::SAUT-NOT-EQL WALKER::VARIABLE-SYMBOL-MACRO-P +- PCL::EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- PCL::SET-FUNCTION-PRETTY-ARGLIST +- PCL::GF-MAKE-FUNCTION-FROM-EMF PCL::FIND-SLOT-DEFINITION +- PCL::SET-STANDARD-SVUC-METHOD PCL::ADD-TO-CVECTOR +- PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS COMMON-LISP::REMOVE-METHOD +- PCL::CHECKING-DFUN-INFO PCL::PARSE-QUALIFIER-PATTERN +- PCL::%SET-CCLOSURE-ENV PCL::MAKE-CDXR +- PCL::FUNCALLABLE-STANDARD-INSTANCE-ACCESS +- PCL::NET-CONSTANT-CONVERTER PCL::|SETF PCL FIND-CLASS| ++ PCL::INITIALIZE-INFO-SHARED-INITIALIZE-T-FUNCTION ++ PCL::RESET-INITIALIZE-INFO-INTERNAL ++ PCL::INITIALIZE-INFO-DEFAULT-INITARGS-FUNCTION ++ PCL::DESTRUCTURE-INTERNAL PCL::DFUN-INFO-INDEX ++ PCL::PRECOMPILE-IIS-FUNCTIONS PCL::INSTANCE-WRITE ++ COMMON-LISP::DEFCLASS PCL::UPDATE-ALL-PV-TABLE-CACHES ++ PCL::WRAPPER-CACHE-NUMBER-VECTOR-REF ++ PCL::INITIALIZE-INFO-COMBINED-INITIALIZE-FUNCTION ++ PCL::MODIFY-CACHE PCL::BOOTSTRAP-SLOT-INDEX ++ PCL::SET-FUNCTION-PRETTY-ARGLIST PCL::COMPUTE-LAYOUT ++ PCL::CALL-METHOD-LIST PCL::GET-KEY-ARG ITERATE::LIST-TAILS ++ PCL::INITIALIZE-INFO-MAKE-INSTANCE-FUNCTION ITERATE::EACHTIME ++ PCL::INSTANCE-REF PCL::WITH-EQ-HASH-TABLE ++ PCL::QUALIFIER-CHECK-RUNTIME PCL::CALLSREF ITERATE::MV-SETQ ++ PCL::PRINTING-RANDOM-THING-INTERNAL PCL::CHECK-MEMBER ++ PCL::INSTANCE-WRITER PCL::CANONICALIZE-SLOT-SPECIFICATION ++ PCL::BIND-LEXICAL-METHOD-FUNCTIONS ITERATE::LIST-ELEMENTS ++ PCL::INVOKE-EFFECTIVE-METHOD-FUNCTION-FAST ++ PCL::INVOKE-METHOD-CALL PCL::INITIALIZE-INFO-RI-VALID-P ++ PCL::SET-WRAPPER PCL::STD-INSTANCE-CLASS ++ PCL::EXPANDING-MAKE-INSTANCE PCL::BIND-ARGS ++ PCL::INITIALIZE-INFO-VALID-P PCL::STD-INSTANCE-WRAPPER ++ PCL::FSC-INSTANCE-SLOTS PCL::REAL-ENSURE-GF-INTERNAL PCL::NEQ ++ PCL::PRECOMPILE-DFUN-CONSTRUCTORS PCL::MAKE-DLAP-LAMBDA-LIST ++ PCL::FIND-SLOT-DEFINITION ++ PCL::BIND-SIMPLE-LEXICAL-METHOD-MACROS ++ PCL::ACCESSOR-SLOT-VALUE PCL::METHOD-FUNCTION-RETURNING-NIL ++ PCL::MAKE-DFUN-LAMBDA-LIST WALKER::VARIABLE-SYMBOL-MACRO-P ++ PCL::DFUN-INFO-FUNCTION COMMON-LISP::WITH-SLOTS ++ PCL::FUNCTION-FUNCALL PCL::EQL-TEST ++ PCL::INITIALIZE-INFO-CONSTANTS PCL::POSQ PCL::DOLIST-CAREFULLY ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-MACRO PCL::MAKE-CAXR ++ ITERATE::ITERATE PCL::DEFINE-INITIALIZE-INFO PCL::ALIST-ENTRY ++ PCL::WITH-LOCAL-CACHE-FUNCTIONS PCL::WRAPPER-OF-MACRO ++ PCL::RASSQ PCL::SUPERCLASSES-COMPATIBLE-P + PCL::METHOD-FUNCTION-RETURNING-T PCL::CHANGE-CLASS-INTERNAL +- PCL::MAKE-DFUN-ARG-LIST PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER +- PCL::MAKE-STD-WRITER-METHOD-FUNCTION ITERATE::MV-SETQ +- PCL::MAKE-EARLY-ACCESSOR PCL::GET-KEY-ARG1 +- PCL::ADD-DIRECT-SUBCLASSES PCL::DO-SATISFIES-DEFTYPE +- PCL::N-N-DFUN-INFO PCL::CLASSES-HAVE-COMMON-SUBCLASS-P +- PCL::SAUT-NOT-CLASS PCL::CANONICALIZE-DEFCLASS-OPTION +- PCL::MAKE-DISCRIMINATING-FUNCTION-ARGLIST +- WALKER::VARIABLE-LEXICAL-P WALKER::ENVIRONMENT-FUNCTION +- PCL::PV-TABLE-LOOKUP PCL::DESTRUCTURE-INTERNAL +- PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION +- PCL::REMOVE-SLOT-ACCESSORS ++ PCL::PRECOMPILE-FUNCTION-GENERATORS ++ WALKER::DEFINE-WALKER-TEMPLATE PCL::CACHE-VECTOR-REF ++ PCL::GET-SLOTS PCL::MEC-ALL-CLASSES-INTERNAL ++ COMMON-LISP::SLOT-EXISTS-P PCL::WITHOUT-INTERRUPTS ++ PCL::MAKE-UNORDERED-METHODS-EMF PCL::GET-KEY-ARG1 ++ PCL::MAKE-STD-WRITER-METHOD-FUNCTION PCL::COMPUTE-CONSTANTS ++ PCL::BOOTSTRAP-GET-SLOT PCL::DEFINE-GF-PREDICATE ++ PCL::REDIRECT-EARLY-FUNCTION-INTERNAL ++ PCL::SET-STRUCTURE-SVUC-METHOD PCL::WRAPPER-CLASS ++ ITERATE::UNTIL PCL::PV-BINDING1 PCL::UPDATE-CPL PCL::PV-ENV ++ PCL::PV-BINDING PCL::INSTANCE-READ-INTERNAL ++ COMMON-LISP::DEFGENERIC ITERATE::COLLECTING ++ WALKER::NOTE-LEXICAL-BINDING PCL::ORIGINAL-DEFINITION ++ PCL::COLLECTING-ONCE PCL::GET-SLOTS-OR-NIL PCL::TRACE-EMF-CALL ++ PCL::WITH-HASH-TABLE PCL::FUNCALLABLE-INSTANCE-MARKER ++ PCL::INITIALIZE-INFO-NEW-KEYS PCL::STD-INSTANCE-SLOTS ++ PCL::ACCESSOR-SLOT-BOUNDP PCL::SAUT-NOT-PROTOTYPE ++ PCL::MAP-PV-TABLE-REFERENCES-OF COMMON-LISP::ADD-METHOD ++ PCL::MAKE-CDXR PCL::CALL-INITIALIZE-FUNCTION PCL::ASV-FUNCALL ++ PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION PCL::IIS-BODY ++ COMMON-LISP::DEFMETHOD PCL::SYMBOL-OR-CONS-LESSP ++ PCL::SAUT-NOT-CLASS-EQ PCL::METHODS-CONVERTER PCL::PVREF ++ PCL::EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION ++ PCL::EMIT-CHECKING-OR-CACHING-MACRO ITERATE::SUMMING ++ PCL::|SETF PCL GDEFINITION| PCL::ESETF PCL::COPY-PV ++ PCL::WRAPPER-CLASS* COMMON-LISP::REMOVE-METHOD + PCL::|SETF PCL FIND-CLASS-PREDICATE| +- PCL::|SETF PCL GDEFINITION| PCL::MAKE-DFUN-LAMBDA-LIST +- PCL::CANONICALIZE-SLOT-SPECIFICATION WALKER::WALK-REPEAT-EVAL +- PCL::STANDARD-INSTANCE-ACCESS +- PCL::PRINTING-RANDOM-THING-INTERNAL PCL::REMTAIL +- PCL::ACCESSOR-MISS-FUNCTION PCL::COMPUTE-LAYOUT +- PCL::CLASS-MIGHT-PRECEDE-P +- PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- SYSTEM::%SET-COMPILED-FUNCTION-NAME PCL::PLIST-VALUE +- PCL::MAKE-CAXR PCL::MAKE-DLAP-LAMBDA-LIST +- PCL::MAKE-STD-READER-METHOD-FUNCTION WALKER::ENVIRONMENT-MACRO +- PCL::UPDATE-SLOTS PCL::VARIABLE-CLASS +- PCL::SET-FUNCALLABLE-INSTANCE-FUNCTION PCL::LIST-EQ +- PCL::ADD-SLOT-ACCESSORS PCL::SAUT-NOT-CLASS-EQ PCL::COMPUTE-PV +- PCL::PV-WRAPPERS-FROM-ALL-ARGS PCL::UPDATE-INITS +- PCL::MEC-ALL-CLASS-LISTS PCL::RAISE-METATYPE +- WALKER::NOTE-DECLARATION PCL::EMIT-1-NIL-DLAP +- PCL::BOOTSTRAP-SLOT-INDEX PCL::SUPERCLASSES-COMPATIBLE-P +- PCL::MEC-ALL-CLASSES-INTERNAL COMMON-LISP::SLOT-EXISTS-P +- PCL::DESCRIBE-PACKAGE PCL::NO-SLOT PCL::PROCLAIM-DEFGENERIC +- COMMON-LISP::ADD-METHOD PCL::MAKE-UNORDERED-METHODS-EMF +- PCL::MEC-ALL-CLASSES PCL::SYMBOL-OR-CONS-LESSP +- PCL::UPDATE-INITIALIZE-INFO-INTERNAL PCL::CLASS-CAN-PRECEDE-P +- PCL::SYMBOL-LESSP PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION +- PCL::MAKE-CLASS-PREDICATE WALKER::VARIABLE-SPECIAL-P +- PCL::REMOVE-DIRECT-SUBCLASSES)) ++ PCL::ACCESSOR-MISS-FUNCTION PCL::MEMF-CONSTANT-CONVERTER ++ PCL::DELQ PCL::VECTORIZING PCL::MAKE-DFUN-ARG-LIST ++ PCL::VARIABLE-CLASS PCL::INSTANCE-ACCESSOR-PARAMETER ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-SLOTS ++ PCL::EMIT-DEFAULT-ONLY-MACRO PCL::NO-SLOT ++ PCL::MAYBE-CHECK-CACHE PCL::FUNCALLABLE-INSTANCE-DATA-POSITION ++ PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST ++ PCL::DO-STANDARD-DEFSETF PCL::SAUT-NOT-CLASS ++ PCL::DFUN-INFO-ACCESSOR-TYPE PCL::DEFINE-CACHED-READER ++ PCL::SET-STANDARD-SVUC-METHOD PCL::CLASS-TEST ++ PCL::MAKE-PV-TABLE-INTERNAL PCL::PROCLAIM-DEFGENERIC ++ PCL::GF-MAKE-FUNCTION-FROM-EMF PCL::COMPUTE-PV ++ PCL::EMIT-1-NIL-DLAP PCL::FIND-STANDARD-II-METHOD ++ PCL::BIND-FAST-LEXICAL-METHOD-MACROS PCL::DO-SATISFIES-DEFTYPE ++ PCL::FAST-LEXICAL-METHOD-FUNCTIONS PCL::COMPUTE-CALLS ++ PCL::COPY-INSTANCE-INTERNAL COMMON-LISP::SYMBOL-MACROLET ++ PCL::FSC-INSTANCE-P PCL::MAKE-PLIST PCL::%SVREF ++ PCL::PCL-DESTRUCTURING-BIND ++ SYSTEM::%SET-COMPILED-FUNCTION-NAME ITERATE::JOINING ++ ITERATE::MINIMIZING PCL::METHOD-FUNCTION-CLOSURE-GENERATOR ++ PCL::PV-WRAPPERS-FROM-ALL-ARGS PCL::*LIST-ELEMENTS ++ PCL::ADD-FORMS ++ PCL::INITIALIZE-INFO-SHARED-INITIALIZE-NIL-FUNCTION ++ ITERATE::INTERVAL PCL::INSTANCE-BOUNDP PCL::FSC-INSTANCE-CLASS ++ WALKER::WITH-AUGMENTED-ENVIRONMENT ++ PCL::CACHE-NUMBER-VECTOR-REF ++ PCL::INVOKE-EFFECTIVE-METHOD-FUNCTION PCL::ASSQ ++ PCL::SET-FUNCALLABLE-INSTANCE-FUNCTION ++ PCL::WRAPPER-CLASS-SLOTS PCL::MEC-ALL-CLASSES ++ ITERATE::GATHERING PCL::INSTANCE-READ PCL::COMPUTE-STD-CPL ++ PCL::PROCLAIM-DEFMETHOD ++ PCL::%ALLOCATE-STATIC-SLOT-STORAGE--CLASS PCL::*LIST-TAILS ++ PCL::|SETF PCL METHOD-FUNCTION-PLIST| ++ PCL::FUNCALLABLE-STANDARD-INSTANCE-ACCESS ++ PCL::DFUN-INFO-WRAPPER1 PCL::INVOKE-FAST-METHOD-CALL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) ++ PCL::COMPILE-LAMBDA PCL::COERCE-TO-CLASS + PCL::MAKE-METHOD-FUNCTION-INTERNAL +- PCL::MAKE-FINAL-DFUN-INTERNAL WALKER::MACROEXPAND-ALL +- COMMON-LISP::ENSURE-GENERIC-FUNCTION +- PCL::MAKE-METHOD-LAMBDA-INTERNAL PCL::MAKE-CONSTANT-VALUE-DFUN +- PCL::GET-FUNCTION PCL::EXTRACT-DECLARATIONS +- PCL::COERCE-TO-CLASS PCL::PARSE-METHOD-OR-SPEC +- PCL::DISPATCH-DFUN-COST PCL::PARSE-SPECIALIZED-LAMBDA-LIST +- PCL::MAP-ALL-CLASSES PCL::COMPILE-LAMBDA PCL::ENSURE-CLASS +- PCL::GET-METHOD-FUNCTION WALKER::WALK-FORM +- PCL::ALLOCATE-STRUCTURE-INSTANCE PCL::GET-FUNCTION1 ++ PCL::MAKE-CONSTANT-VALUE-DFUN PCL::GET-FUNCTION + PCL::MAKE-CACHING-DFUN PCL::MAKE-INSTANCE-1 +- PCL::GET-DFUN-CONSTRUCTOR)) ++ PCL::MAKE-FINAL-DFUN-INTERNAL WALKER::MACROEXPAND-ALL ++ COMMON-LISP::ENSURE-GENERIC-FUNCTION PCL::MAP-ALL-CLASSES ++ PCL::GET-METHOD-FUNCTION PCL::MAKE-METHOD-LAMBDA-INTERNAL ++ PCL::PARSE-SPECIALIZED-LAMBDA-LIST PCL::GET-FUNCTION1 ++ WALKER::WALK-FORM PCL::ALLOCATE-STRUCTURE-INSTANCE ++ PCL::ENSURE-CLASS PCL::GET-DFUN-CONSTRUCTOR ++ PCL::EXTRACT-DECLARATIONS PCL::DISPATCH-DFUN-COST ++ PCL::PARSE-METHOD-OR-SPEC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- PCL::MAKE-CLASS-PREDICATE-NAME PCL::MAKE-KEYWORD)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::SDFUN-FOR-CACHING PCL::SAUT-AND PCL::EMIT-CHECKING ++ PCL::SPLIT-DECLARATIONS ++ PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES PCL::COMPUTE-CODE ++ PCL::*SUBTYPEP ITERATE::PARSE-DECLARATIONS ++ PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P ++ PCL::SLOT-NAME-LISTS-FROM-SLOTS COMMON-LISP::SLOT-VALUE ++ PCL::COMPUTE-STD-CPL-PHASE-1 PCL::SAUT-CLASS ++ PCL::FORM-LIST-TO-LISP PCL::INITIAL-DFUN ++ PCL::FIND-SUPERCLASS-CHAIN PCL::EMIT-CACHING PCL::SAUT-NOT ++ PCL::CHECK-INITARGS-VALUES PCL::REAL-REMOVE-METHOD ++ PCL::CPL-INCONSISTENT-ERROR COMMON-LISP::SLOT-BOUNDP ++ PCL::SPECIALIZER-APPLICABLE-USING-TYPE-P ++ PCL::MAKE-INSTANCE-FUNCTION-TRAP PCL::SAUT-CLASS-EQ ++ PCL::SLOT-UNBOUND-INTERNAL PCL::SAUT-PROTOTYPE ++ PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR ++ PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL ++ PCL::EMIT-DEFAULT-ONLY PCL::CLASS-APPLICABLE-USING-CLASS-P ++ PCL::COMPUTE-TEST PCL::MUTATE-SLOTS-AND-CALLS ++ PCL::EMIT-DEFAULT-ONLY-FUNCTION PCL::ENSURE-CLASS-VALUES ++ PCL::INVOKE-EMF COMMON-LISP::SLOT-MAKUNBOUND ++ PCL::MAKE-DIRECT-SLOTD PCL::INSURE-DFUN PCL::SET-FUNCTION-NAME ++ PCL::DESTRUCTURE PCL::SAUT-EQL PCL::UPDATE-SLOT-VALUE-GF-INFO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- (COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*)) +- PCL::CAPITALIZE-WORDS)) ++ COMMON-LISP::T) ++ WALKER::RELIST* PCL::UPDATE-DFUN ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE PCL::MAKE-SPECIALIZABLE ++ PCL::TRACE-METHOD PCL::ALLOCATE-STANDARD-INSTANCE ++ WALKER::RELIST COMMON-LISP::FIND-CLASS PCL::MAKE-WRAPPER ++ PCL::PV-TABLE-LOOKUP-PV-ARGS ITERATE::FUNCTION-LAMBDA-P ++ PCL::SET-DFUN PCL::EARLY-METHOD-SPECIALIZERS ++ WALKER::WALKER-ENVIRONMENT-BIND-1 ++ PCL::INITIALIZE-METHOD-FUNCTION PCL::MAKE-TYPE-PREDICATE-NAME ++ PCL::MAKE-FINAL-DFUN PCL::FIND-CLASS-CELL ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS PCL::MAKE-EARLY-GF ++ PCL::USE-DISPATCH-DFUN-P ITERATE::MAYBE-WARN ++ PCL::USE-CONSTANT-VALUE-DFUN-P PCL::FIND-CLASS-PREDICATE ++ PCL::SET-ARG-INFO PCL::CAPITALIZE-WORDS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 PCL::SHOW-EMF-CALL-TRACE +- PCL::CACHES-TO-ALLOCATE PCL::MAKE-CACHE +- PCL::SHOW-FREE-CACHE-VECTORS PCL::MAKE-ARG-INFO +- PCL::NO-METHODS-DFUN-INFO PCL::STRUCTURE-FUNCTIONS-EXIST-P +- PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST +- PCL::BOOTSTRAP-BUILT-IN-CLASSES +- PCL::%%ALLOCATE-INSTANCE--CLASS PCL::DISPATCH-DFUN-INFO +- PCL::INITIAL-DISPATCH-DFUN-INFO PCL::BOOTSTRAP-META-BRAID +- PCL::UPDATE-DISPATCH-DFUNS PCL::LIST-ALL-DFUNS +- PCL::DEFAULT-METHOD-ONLY-DFUN-INFO PCL::RENEW-SYS-FILES +- PCL::IN-THE-COMPILER-P PCL::GET-EFFECTIVE-METHOD-GENSYM +- PCL::MAKE-CPD PCL::INITIAL-DFUN-INFO +- PCL::SHOW-DFUN-CONSTRUCTORS +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::PRINT-DFUN-INFO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::FIXNUM) +- PCL::ZERO)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ COMMON-LISP::SIMPLE-VECTOR) ++ PCL::CACHE-VECTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::PRINT-DFUN-INFO)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::SYMBOL-APPEND)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) ++ PCL::PV-TABLE-CACHE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -412,70 +1019,11 @@ + PCL::COMPUTE-CACHE-PARAMETERS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- PCL::COUNT-ALL-DFUNS PCL::EMIT-N-N-WRITERS +- PCL::EMIT-N-N-READERS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::MAKE-FINAL-DFUN PCL::SET-ARG-INFO PCL::TRACE-METHOD +- PCL::MAKE-SPECIALIZABLE WALKER::WALKER-ENVIRONMENT-BIND-1 +- ITERATE::FUNCTION-LAMBDA-P COMMON-LISP::FIND-CLASS +- PCL::MAKE-WRAPPER PCL::UPDATE-DFUN +- PCL::MAKE-TYPE-PREDICATE-NAME PCL::PV-TABLE-LOOKUP-PV-ARGS +- PCL::USE-CONSTANT-VALUE-DFUN-P WALKER::RELIST +- PCL::MAKE-EARLY-GF PCL::INITIALIZE-METHOD-FUNCTION +- PCL::FIND-CLASS-CELL PCL::USE-DISPATCH-DFUN-P +- PCL::FIND-CLASS-PREDICATE PCL::ALLOCATE-STANDARD-INSTANCE +- PCL::INITIALIZE-INTERNAL-SLOT-GFS ITERATE::MAYBE-WARN +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE +- PCL::EARLY-METHOD-SPECIALIZERS WALKER::RELIST* PCL::SET-DFUN)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::SLOT-UNBOUND-INTERNAL ITERATE::PARSE-DECLARATIONS +- PCL::EMIT-CACHING PCL::COMPUTE-STD-CPL-PHASE-1 +- PCL::INITIAL-DFUN PCL::INSURE-DFUN PCL::EMIT-CHECKING +- PCL::COMPUTE-TEST PCL::COMPUTE-CODE PCL::MAKE-DIRECT-SLOTD +- PCL::SAUT-CLASS COMMON-LISP::SLOT-MAKUNBOUND +- PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR PCL::INVOKE-EMF +- PCL::*SUBTYPEP PCL::SPECIALIZER-APPLICABLE-USING-TYPE-P +- PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES +- PCL::REAL-REMOVE-METHOD PCL::SAUT-PROTOTYPE +- PCL::MUTATE-SLOTS-AND-CALLS PCL::FIND-SUPERCLASS-CHAIN +- COMMON-LISP::SLOT-BOUNDP PCL::FORM-LIST-TO-LISP +- PCL::CPL-INCONSISTENT-ERROR PCL::EMIT-DEFAULT-ONLY-FUNCTION +- PCL::ENSURE-CLASS-VALUES PCL::CHECK-INITARGS-VALUES +- PCL::SAUT-EQL PCL::SPLIT-DECLARATIONS +- PCL::UPDATE-SLOT-VALUE-GF-INFO PCL::SAUT-AND +- PCL::SLOT-NAME-LISTS-FROM-SLOTS +- PCL::MAKE-INSTANCE-FUNCTION-TRAP PCL::EMIT-DEFAULT-ONLY +- PCL::SAUT-NOT PCL::SAUT-CLASS-EQ COMMON-LISP::SLOT-VALUE +- PCL::DESTRUCTURE PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P +- PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL +- PCL::CLASS-APPLICABLE-USING-CLASS-P PCL::SDFUN-FOR-CACHING +- PCL::SET-FUNCTION-NAME)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- PCL::ARG-INFO-NUMBER-REQUIRED PCL::CACHING-LIMIT-FN +- PCL::PV-CACHE-LIMIT-FN PCL::ONE-INDEX-LIMIT-FN +- PCL::PV-TABLE-PV-SIZE PCL::CACHE-COUNT PCL::DEFAULT-LIMIT-FN +- PCL::CPD-COUNT PCL::CHECKING-LIMIT-FN +- PCL::N-N-ACCESSORS-LIMIT-FN PCL::EARLY-CLASS-SIZE +- PCL::FAST-INSTANCE-BOUNDP-INDEX)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) +- PCL::POWER-OF-TWO-CEILING)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) + COMMON-LISP::T) +- PCL::GET-CACHE-FROM-CACHE)) ++ PCL::GET-CACHE-FROM-CACHE ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -484,544 +1032,81 @@ + PCL::COMPUTE-PRIMARY-CACHE-LOCATION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) +- PCL::CACHE-FIELD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) +- PCL::PV-TABLE-CACHE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::|(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- WALKER::WALK-TEMPLATE PCL::|(FAST-METHOD PRINT-OBJECT (T T))| +- WALKER::WALK-DO/DO* PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR +- PCL::|(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| +- WALKER::WALK-LET/LET* +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE +- PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| +- PCL::INITIALIZE-INSTANCE-SIMPLE +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- PCL::EXPAND-SYMBOL-MACROLET-INTERNAL +- PCL::|(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION1 +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| +- PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| +- PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| +- PCL::MAKE-DISPATCH-LAMBDA +- PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- PCL::EXPAND-DEFCLASS +- PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- PCL::OPTIMIZE-WRITER +- PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD DOCUMENTATION (T))| +- PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- PCL::OPTIMIZE-READER WALKER::WALK-PROG/PROG* +- PCL::BOOTSTRAP-SET-SLOT +- PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRELIMINARY +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- PCL::TWO-CLASS-DFUN-INFO +- PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))| +- PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- PCL::ADJUST-CACHE +- PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| +- PCL::EXPAND-CACHE +- PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| +- PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| +- PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- PCL::GET-WRAPPERS-FROM-CLASSES +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- PCL::MAYBE-EXPAND-ACCESSOR-FORM WALKER::WALK-BINDINGS-2 +- PCL::FILL-CACHE-P PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL +- PCL::|(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| +- PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- PCL::LOAD-PRECOMPILED-IIS-ENTRY PCL::MEMF-TEST-CONVERTER +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))|)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::REAL-ADD-NAMED-METHOD PCL::EARLY-ADD-NAMED-METHOD +- PCL::FILL-DFUN-CACHE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::OBSOLETE-INSTANCE-TRAP +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| +- WALKER::WALK-TAGBODY +- PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- PCL::ENTRY-IN-CACHE-P WALKER::WALK-COMPILER-LET +- PCL::|(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| +- PCL::NOTE-PV-TABLE-REFERENCE PCL::COMPUTE-EFFECTIVE-METHOD +- PCL::MAKE-DFUN-CALL PCL::|SETF PCL PLIST-VALUE| +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| +- PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- WALKER::WALK-UNEXPECTED-DECLARE +- PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL +- PCL::SKIP-FAST-SLOT-ACCESS-P PCL::SET-FUNCTION-NAME-1 +- WALKER::WALK-DO PCL::EMIT-1-T-DLAP PCL::PRINT-STD-INSTANCE +- PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- WALKER::WALK-LAMBDA PCL::MAKE-METHOD-SPEC +- PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| +- PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- PCL::OPTIMIZE-SET-SLOT-VALUE +- PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::EXPAND-DEFGENERIC WALKER::VARIABLE-DECLARATION +- ITERATE::RENAME-AND-CAPTURE-VARIABLES +- PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- PCL::MAP-ALL-ORDERS +- PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- PCL::DECLARE-STRUCTURE WALKER::WALK-PROG +- PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- PCL::OPTIMIZE-SLOT-VALUE WALKER::WALK-MULTIPLE-VALUE-BIND +- PCL::|(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD WALKER::WALK-LOCALLY +- PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- WALKER::WALK-DO* +- PCL::|(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| +- PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::EMIT-BOUNDP-CHECK WALKER::RECONS +- PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| +- WALKER::WALK-LET* WALKER::WALK-TAGBODY-1 PCL::FLUSH-CACHE-TRAP +- WALKER::WALK-FLET +- PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| +- PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- PCL::PRINT-CACHE +- PCL::|(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| +- PCL::INVALIDATE-WRAPPER PCL::GET-NEW-FUNCTION-GENERATOR +- ITERATE::OPTIMIZE-ITERATE-FORM WALKER::RELIST-INTERNAL +- PCL::CAN-OPTIMIZE-ACCESS PCL::MAKE-TOP-LEVEL-FORM +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| +- WALKER::WALK-MULTIPLE-VALUE-SETQ WALKER::WALK-LABELS +- PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- WALKER::WALK-SETQ WALKER::WALK-LET +- PCL::|SETF PCL METHOD-FUNCTION-GET| WALKER::WALK-IF +- PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- ITERATE::SIMPLE-EXPAND-GATHERING-FORM +- PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- WALKER::WALK-NAMED-LAMBDA PCL::FIRST-FORM-TO-LISP +- PCL::ONE-CLASS-DFUN-INFO +- WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL +- PCL::EMIT-GREATER-THAN-1-DLAP PCL::CONVERT-TABLE +- PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- PCL::INITIALIZE-INTERNAL-SLOT-GFS* +- ITERATE::OPTIMIZE-GATHERING-FORM +- PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- PCL::OPTIMIZE-SLOT-BOUNDP +- PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS +- WALKER::WALK-SYMBOL-MACROLET ITERATE::VARIABLE-SAME-P +- PCL::EMIT-SLOT-READ-FORM +- PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P +- PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| +- PCL::GET-FUNCTION-GENERATOR +- PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- PCL::FIX-SLOT-ACCESSORS +- PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| +- PCL::OPTIMIZE-GF-CALL-INTERNAL +- PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- PCL::|(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| +- PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- WALKER::WALK-PROG* PCL::ONE-INDEX-DFUN-INFO +- PCL::COMPUTE-PRECEDENCE PCL::TRACE-EMF-CALL-INTERNAL +- WALKER::WALK-MACROLET)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::MAKE-DEFMETHOD-FORM-INTERNAL PCL::LOAD-DEFMETHOD +- PCL::EARLY-MAKE-A-METHOD PCL::MAKE-DEFMETHOD-FORM)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::GET-EFFECTIVE-METHOD-FUNCTION1 +- PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS +- PCL::MAKE-EMF-FROM-METHOD +- PCL::REAL-ENSURE-GF-USING-CLASS--NULL PCL::PROBE-CACHE +- PCL::MAP-CACHE PCL::GET-DECLARATION +- PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION +- WALKER::CONVERT-MACRO-TO-LAMBDA +- PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION PCL::EMIT-MISS +- PCL::GET-METHOD-FUNCTION-PV-CELL PCL::METHOD-FUNCTION-GET +- PCL::FIND-CLASS-FROM-CELL PCL::RECORD-DEFINITION +- PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 +- PCL::FIND-CLASS-PREDICATE-FROM-CELL +- PCL::NAMED-OBJECT-PRINT-FUNCTION +- PCL::PRECOMPUTE-EFFECTIVE-METHODS PCL::INITIALIZE-INFO +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 +- PCL::GET-MAKE-INSTANCE-FUNCTION-INTERNAL +- PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 PCL::MAKE-EMF-CACHE +- PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- PCL::MAKE-FGEN +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| +- PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS +- PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::OPTIMIZE-ACCESSOR-CALL +- PCL::MAKE-INSTANCE-FUNCTION-COMPLEX PCL::UPDATE-SLOTS-IN-PV +- PCL::COMPUTE-PV-SLOT +- PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- PCL::OPTIMIZE-INSTANCE-ACCESS +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- PCL::MAKE-INSTANCE-FUNCTION-SIMPLE +- PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::OPTIMIZE-GENERIC-FUNCTION-CALL +- PCL::LOAD-FUNCTION-GENERATOR WALKER::WALK-BINDINGS-1 +- PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- PCL::REAL-MAKE-METHOD-INITARGS-FORM +- PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| +- PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| +- WALKER::WALK-TEMPLATE-HANDLE-REPEAT +- PCL::MAKE-PARAMETER-REFERENCES +- PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- PCL::EXPAND-EMF-CALL-METHOD +- PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::GET-METHOD WALKER::WALK-ARGLIST PCL::REAL-GET-METHOD +- PCL::EMIT-FETCH-WRAPPER PCL::CHECK-INITARGS-2-LIST +- PCL::FILL-CACHE PCL::CHECK-INITARGS-2-PLIST PCL::MAKE-EMF-CALL +- PCL::CHECK-INITARGS-1 PCL::CAN-OPTIMIZE-ACCESS1)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::GET-SECONDARY-DISPATCH-FUNCTION2)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ PCL::EMIT-N-N-WRITERS PCL::COUNT-ALL-DFUNS ++ PCL::EMIT-N-N-READERS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::REAL-LOAD-DEFCLASS PCL::LOAD-DEFCLASS PCL::SET-ARG-INFO1 +- PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION PCL::EMIT-SLOT-ACCESS +- WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 PCL::OPTIMIZE-GF-CALL +- PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::MAKE-EARLY-CLASS-DEFINITION)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ PCL::GET-EFFECTIVE-METHOD-GENSYM PCL::RENEW-SYS-FILES ++ PCL::UPDATE-DISPATCH-DFUNS PCL::IN-THE-COMPILER-P ++ PCL::SHOW-FREE-CACHE-VECTORS PCL::BOOTSTRAP-BUILT-IN-CLASSES ++ PCL::MAKE-CACHE PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2 ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 ++ PCL::STRUCTURE-FUNCTIONS-EXIST-P PCL::NO-METHODS-DFUN-INFO ++ PCL::SHOW-EMF-CALL-TRACE PCL::INITIAL-DFUN-INFO ++ PCL::DISPATCH-DFUN-INFO PCL::MAKE-ARG-INFO ++ PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST ++ PCL::%%ALLOCATE-INSTANCE--CLASS ++ PCL::INITIAL-DISPATCH-DFUN-INFO PCL::CACHES-TO-ALLOCATE ++ PCL::MAKE-CPD PCL::LIST-ALL-DFUNS PCL::SHOW-DFUN-CONSTRUCTORS ++ PCL::BOOTSTRAP-META-BRAID PCL::DEFAULT-METHOD-ONLY-DFUN-INFO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::FIXNUM) +- COMMON-LISP::T) +- PCL::GET-CACHE PCL::FILL-CACHE-FROM-CACHE-P)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) ++ PCL::CACHE-VALUEP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) +- COMMON-LISP::FIXNUM) +- PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) ++ PCL::CACHE-FIELD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- PCL::EVAL-FORM PCL::EARLY-CLASS-NAME-OF PCL::DFUN-INFO-CACHE +- PCL::MAKE-CONSTANT-FUNCTION PCL::EXPAND-SHORT-DEFCOMBIN +- PCL::COPY-CACHE PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES +- PCL::MAKE-INITIAL-DFUN PCL::ECD-METACLASS +- PCL::EXTRACT-SPECIALIZER-NAMES PCL::GBOUNDP +- PCL::GET-SETF-FUNCTION-NAME PCL::USE-CACHING-DFUN-P +- PCL::INITIALIZE-INFO-CACHED-CONSTANTS +- PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS COMMON-LISP::CLASS-OF +- PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION +- PCL::ARG-INFO-KEY/REST-P PCL::METHOD-CALL-CALL-METHOD-ARGS +- PCL::FGEN-GENSYMS PCL::EARLY-CLASS-PRECEDENCE-LIST +- PCL::EARLY-SLOT-DEFINITION-LOCATION +- PCL::EXPAND-MAKE-INSTANCE-FORM PCL::INTERN-EQL-SPECIALIZER +- PCL::METHOD-FUNCTION-METHOD PCL::FGEN-GENERATOR-LAMBDA +- PCL::SLOT-READER-SYMBOL PCL::CACHING-P +- PCL::EARLY-METHOD-QUALIFIERS +- PCL::EARLY-COLLECT-DEFAULT-INITARGS PCL::KEYWORD-SPEC-NAME +- PCL::ONE-INDEX-P PCL::COMPLICATED-INSTANCE-CREATION-METHOD +- PCL::DFUN-ARG-SYMBOL PCL::N-N-CACHE +- PCL::ONE-INDEX-DFUN-INFO-INDEX PCL::INITIAL-DISPATCH-CACHE +- PCL::CPD-CLASS PCL::FAST-METHOD-CALL-ARG-INFO +- PCL::MAKE-PV-TYPE-DECLARATION PCL::COMPUTE-STD-CPL-PHASE-2 +- PCL::GET-BUILT-IN-CLASS-SYMBOL +- PCL::INITIALIZE-INFO-CACHED-RI-VALID-P +- PCL::UPDATE-GFS-OF-CLASS PCL::STRUCTURE-SVUC-METHOD +- PCL::SLOT-BOUNDP-SYMBOL PCL::FGEN-SYSTEM +- PCL::FIND-CYCLE-REASONS ITERATE::SEQUENCE-ACCESSOR +- PCL::GF-INFO-C-A-M-EMF-STD-P PCL::STRUCTURE-TYPE-P +- PCL::TWO-CLASS-CACHE PCL::METHOD-LL->GENERIC-FUNCTION-LL +- PCL::ONE-CLASS-ACCESSOR-TYPE PCL::WRAPPER-FOR-STRUCTURE +- PCL::ACCESSOR-DFUN-INFO-CACHE PCL::%SYMBOL-FUNCTION +- PCL::STRUCTURE-TYPE PCL::NET-TEST-CONVERTER +- PCL::CONSTANT-SYMBOL-P PCL::GMAKUNBOUND PCL::INITIAL-P +- PCL::GF-DFUN-CACHE PCL::STRUCTURE-SLOTD-TYPE +- PCL::%STD-INSTANCE-WRAPPER PCL::INITIALIZE-INFO-P +- PCL::CACHING-DFUN-INFO +- PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::FAST-METHOD-CALL-P PCL::GF-DFUN-INFO +- PCL::INITIALIZE-INFO-BOUND-SLOTS PCL::ECD-CLASS-NAME +- PCL::MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION +- PCL::STD-INSTANCE-P PCL::EXTRACT-PARAMETERS +- WALKER::GET-WALKER-TEMPLATE PCL::SYMBOL-PKG-NAME +- PCL::CCLOSUREP PCL::LOOKUP-FGEN PCL::CPD-SUPERS +- PCL::ARG-INFO-KEYWORDS PCL::DISPATCH-P +- PCL::INITIALIZE-INFO-CACHED-NEW-KEYS +- PCL::MAKE-CALLS-TYPE-DECLARATION PCL::INITIALIZE-INFO-WRAPPER +- PCL::%FBOUNDP PCL::DEFAULT-STRUCTURE-INSTANCE-P +- WALKER::ENV-WALK-FORM PCL::EARLY-CLASS-DEFINITION +- PCL::SORT-CALLS PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME +- PCL::DISPATCH-CACHE PCL::INITIALIZE-INFO-KEY +- PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- PCL::ARG-INFO-METATYPES PCL::GF-LAMBDA-LIST +- WALKER::ENV-LEXICAL-VARIABLES PCL::ACCESSOR-DFUN-INFO-P +- PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P PCL::COMPUTE-LINE-SIZE +- PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION +- PCL::FORCE-CACHE-FLUSHES PCL::TWO-CLASS-P PCL::DFUN-INFO-P +- PCL::MAP-SPECIALIZERS PCL::MAKE-PERMUTATION-VECTOR +- WALKER::ENV-LOCK PCL::CPD-AFTER PCL::EARLY-CLASS-SLOTS +- PCL::GET-PV-CELL-FOR-CLASS PCL::ARG-INFO-P +- PCL::EXTRACT-REQUIRED-PARAMETERS +- PCL::STRUCTURE-SLOTD-READER-FUNCTION PCL::COMPUTE-CLASS-SLOTS +- PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS +- PCL::TWO-CLASS-WRAPPER0 +- PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::COMPILE-LAMBDA-UNCOMPILED PCL::EARLY-CLASS-NAME +- PCL::SFUN-P PCL::EXTRACT-LAMBDA-LIST PCL::UNDEFMETHOD-1 +- PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE PCL::WRAPPER-OF +- PCL::ARG-INFO-LAMBDA-LIST PCL::LIST-DFUN +- PCL::NEXT-WRAPPER-FIELD PCL::CHECK-WRAPPER-VALIDITY +- PCL::STRUCTURE-SLOTD-NAME PCL::BUILT-IN-WRAPPER-OF +- PCL::GET-MAKE-INSTANCE-FUNCTIONS +- PCL::GENERIC-CLOBBERS-FUNCTION PCL::NO-METHODS-P +- PCL::CONSTANT-VALUE-P WALKER::ENV-WALK-FUNCTION +- PCL::INITIAL-CACHE PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD +- PCL::MAKE-CLASS-EQ-PREDICATE +- PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS +- PCL::FUNCTION-PRETTY-ARGLIST +- PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST PCL::TYPE-CLASS +- PCL::CHECK-CACHE PCL::STANDARD-SVUC-METHOD +- PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL PCL::GF-INFO-FAST-MF-P +- PCL::STRUCTURE-SLOTD-WRITER-FUNCTION +- PCL::BOOTSTRAP-CLASS-PREDICATES PCL::DEFAULT-METHOD-ONLY-CACHE +- PCL::GET-CACHE-VECTOR PCL::SLOT-WRITER-SYMBOL +- PCL::FGEN-GENERATOR PCL::DNET-METHODS-P +- PCL::DEFAULT-STRUCTURE-TYPE +- PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST +- PCL::N-N-ACCESSOR-TYPE +- PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST +- WALKER::ENV-DECLARATIONS WALKER::VARIABLE-GLOBALLY-SPECIAL-P +- PCL::ONE-INDEX-INDEX PCL::ONE-INDEX-DFUN-INFO-CACHE +- PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME PCL::EARLY-CLASS-SLOTDS +- PCL::CANONICAL-SLOT-NAME PCL::EARLY-COLLECT-CPL +- PCL::RESET-CLASS-INITIALIZE-INFO-1 +- PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 PCL::ONE-INDEX-CACHE +- PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION +- PCL::MAKE-TYPE-PREDICATE PCL::FREE-CACHE +- ITERATE::VARIABLES-FROM-LET +- PCL::EARLY-METHOD-STANDARD-ACCESSOR-P +- PCL::DEFAULT-CONSTANT-CONVERTER PCL::CLASS-PREDICATE +- PCL::CHECKING-CACHE PCL::ARG-INFO-PRECEDENCE +- PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P +- PCL::DEFAULT-METHOD-ONLY-P +- PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P +- PCL::STRUCTURE-SLOT-BOUNDP PCL::ONE-INDEX-ACCESSOR-TYPE +- PCL::TWO-CLASS-ACCESSOR-TYPE +- PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P PCL::METHOD-CALL-P +- PCL::UPDATE-CLASS-CAN-PRECEDE-P PCL::CONSTANT-VALUE-DFUN-INFO +- PCL::COMPILE-LAMBDA-DEFERRED PCL::SETFBOUNDP +- PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P +- PCL::PV-TABLEP PCL::STRUCTURE-OBJECT-P PCL::TWO-CLASS-INDEX +- PCL::METHOD-FUNCTION-PV-TABLE PCL::ECD-OTHER-INITARGS +- WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE +- PCL::EARLY-GF-P PCL::STRUCTURE-SLOTD-INIT-FORM +- PCL::FUNCALLABLE-INSTANCE-P PCL::CHECKING-FUNCTION +- PCL::FUNCTION-RETURNING-NIL PCL::FUNCTION-RETURNING-T +- PCL::UPDATE-C-A-M-GF-INFO PCL::COUNT-DFUN +- PCL::UNPARSE-SPECIALIZERS PCL::CACHE-OWNER +- PCL::EARLY-METHOD-CLASS +- PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION +- PCL::EARLY-SLOT-DEFINITION-NAME +- PCL::GET-MAKE-INSTANCE-FUNCTION +- PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME +- PCL::ECD-SUPERCLASS-NAMES PCL::GFS-OF-TYPE PCL::SORT-SLOTS +- PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS +- PCL::COMPUTE-MCASE-PARAMETERS PCL::METHOD-FUNCTION-PLIST +- PCL::ARG-INFO-NKEYS PCL::FINAL-ACCESSOR-DFUN-TYPE +- PCL::EARLY-COLLECT-SLOTS PCL::EARLY-METHOD-LAMBDA-LIST +- PCL::FAST-INSTANCE-BOUNDP-P PCL::GDEFINITION +- PCL::%CCLOSURE-ENV SYSTEM::%COMPILED-FUNCTION-NAME +- PCL::RESET-INITIALIZE-INFO PCL::ARG-INFO-NUMBER-OPTIONAL +- PCL::RESET-CLASS-INITIALIZE-INFO +- PCL::INITIALIZE-INFO-CACHED-VALID-P PCL::INTERNED-SYMBOL-P +- PCL::EARLY-GF-NAME PCL::FGEN-TEST PCL::MAKE-INITFUNCTION +- PCL::MAP-ALL-GENERIC-FUNCTIONS PCL::SHOW-DFUN-COSTS +- PCL::CLASS-FROM-TYPE PCL::EXPAND-LONG-DEFCOMBIN +- PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION +- PCL::FREE-CACHE-VECTOR PCL::%STD-INSTANCE-SLOTS +- PCL::ALLOCATE-CACHE-VECTOR PCL::ONE-CLASS-P +- PCL::CLASS-PRECEDENCE-DESCRIPTION-P PCL::SLOT-VECTOR-SYMBOL +- PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION +- PCL::ONE-CLASS-WRAPPER0 PCL::N-N-P +- PCL::UPDATE-ALL-C-A-M-GF-INFO PCL::CHECKING-P +- PCL::TWO-CLASS-WRAPPER1 PCL::PARSE-SPECIALIZERS +- PCL::FORMAT-CYCLE-REASONS PCL::FLUSH-CACHE-VECTOR-INTERNAL +- PCL::UNENCAPSULATED-FDEFINITION PCL::ONE-CLASS-INDEX +- PCL::DEFAULT-CONSTANTP PCL::UPDATE-GF-INFO +- PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE +- PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST +- PCL::MAKE-EQL-PREDICATE PCL::ARG-INFO-VALID-P +- PCL::CACHING-CACHE PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION +- PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL +- PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION +- PCL::MAKE-FUNCTION-INLINE PCL::STORE-FGEN +- PCL::LIST-LARGE-CACHE PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P +- PCL::ARG-INFO-APPLYP SYSTEM::%STRUCTURE-NAME +- PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE PCL::ECD-SOURCE +- PCL::EARLY-CLASS-DIRECT-SUBCLASSES +- PCL::UPDATE-PV-TABLE-CACHE-INFO PCL::DEFAULT-TEST-CONVERTER +- PCL::MAKE-CALL-METHODS PCL::GET-BUILT-IN-WRAPPER-SYMBOL +- PCL::GF-INFO-STATIC-C-A-M-EMF PCL::DEFAULT-STRUCTUREP +- PCL::CONSTANT-VALUE-CACHE PCL::INITIAL-DISPATCH-P +- PCL::ECD-CANONICAL-SLOTS PCL::WRAPPER-FIELD +- PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE PCL::ONE-CLASS-CACHE +- PCL::CACHING-DFUN-COST PCL::LEGAL-CLASS-NAME-P +- PCL::INTERN-FUNCTION-NAME PCL::FAST-METHOD-CALL-PV-CELL +- PCL::CACHE-P PCL::ONE-INDEX-DFUN-INFO-P +- PCL::MAKE-PV-TABLE-TYPE-DECLARATION PCL::NO-METHODS-CACHE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ PCL::ONE-INDEX-LIMIT-FN PCL::EARLY-CLASS-SIZE PCL::CACHE-COUNT ++ PCL::PV-TABLE-PV-SIZE PCL::DEFAULT-LIMIT-FN ++ PCL::CHECKING-LIMIT-FN PCL::CACHING-LIMIT-FN ++ PCL::N-N-ACCESSORS-LIMIT-FN PCL::CPD-COUNT ++ PCL::FAST-INSTANCE-BOUNDP-INDEX PCL::ARG-INFO-NUMBER-REQUIRED ++ PCL::PV-CACHE-LIMIT-FN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::UNTRACE-METHOD +- COMMON-LISP::METHOD-COMBINATION-ERROR +- COMMON-LISP::INVALID-METHOD-ERROR PCL::LIST-LARGE-CACHES)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ PCL::POWER-OF-TWO-CEILING)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(PCL::TRACE-METHOD-INTERNAL PCL::FDEFINE-CAREFULLY ++ PCL::REDEFINE-FUNCTION PCL::DO-STANDARD-DEFSETF-1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::EMIT-DLAP PCL::GET-SECONDARY-DISPATCH-FUNCTION1)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::MAKE-CLASS-PREDICATE-NAME PCL::MAKE-KEYWORD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- PCL::COMPUTE-STD-CPL-PHASE-3)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 255)) ++ PCL::CACHE-NKEYS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::EXPAND-DEFMETHOD PCL::LOAD-DEFMETHOD-INTERNAL)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 256)) ++ PCL::CACHE-LINE-SIZE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) + COMMON-LISP::T) +- PCL::BOOTSTRAP-INITIALIZE-CLASS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) +- PCL::PV-TABLE-CALL-LIST PCL::CACHE-OVERFLOW +- PCL::PV-TABLE-SLOT-NAME-LISTS)) ++ PCL::%CCLOSURE-ENV-NTHCDR)) + (IN-PACKAGE "PCL") + +-(DOLIST (V '(|(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-METHODS)| ++(DOLIST (V '(|(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT SLOTS)| + |(FAST-WRITER-METHOD SLOT-CLASS SLOTS)| + |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SLOTS)| + |(FAST-WRITER-METHOD SLOT-CLASS DIRECT-SLOTS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-WRITER-METHOD SLOT-OBJECT METHODS)| + |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT OPTIONS)| +@@ -1063,16 +1148,17 @@ + COMPATIBLE-META-CLASS-CHANGE-P + |(FAST-READER-METHOD SLOT-OBJECT CLASS-EQ-SPECIALIZER)| + |(FAST-READER-METHOD CLASS CLASS-EQ-SPECIALIZER)| +- |(BOUNDP READER-FUNCTION)| |(BOUNDP PREDICATE-NAME)| +- |(BOUNDP READERS)| UPDATE-GF-DFUN +- |(BOUNDP CLASS-PRECEDENCE-LIST)| ++ |(BOUNDP READER-FUNCTION)| TRACE-METHOD-INTERNAL ++ |(BOUNDP PREDICATE-NAME)| |(BOUNDP READERS)| ++ UPDATE-GF-DFUN |(BOUNDP CLASS-PRECEDENCE-LIST)| + |(BOUNDP ACCESSOR-FLAGS)| |(BOUNDP LOCATION)| + |(BOUNDP DOCUMENTATION)| SPECIALIZER-OBJECT + |(BOUNDP INCOMPATIBLE-SUPERCLASS-LIST)| + ACCESSOR-METHOD-SLOT-NAME |(BOUNDP SPECIALIZERS)| + |(BOUNDP IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DEFSTRUCT-ACCESSOR-SYMBOL)| +- SPECIALIZER-CLASS |(BOUNDP PRETTY-ARGLIST)| ++ REDEFINE-FUNCTION SPECIALIZER-CLASS ++ |(BOUNDP PRETTY-ARGLIST)| + |PCL::PCL-CLASS class predicate| + |PCL::STD-CLASS class predicate| + |(BOUNDP DEFSTRUCT-FORM)| +@@ -1110,104 +1196,104 @@ + |(BOUNDP OPTIONS)| |(WRITER METHOD)| + |PCL::DEPENDENT-UPDATE-MIXIN class predicate| + GENERIC-FUNCTION-PRETTY-ARGLIST |(WRITER SOURCE)| +- |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| + |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- |(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| + |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| ++ |(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| + |(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| + |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- |(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| +- |(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| + |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| + MAKE-BOUNDP-METHOD-FUNCTION + |(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| + |(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| + |PCL::METAOBJECT class predicate| +- |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| +- |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| +- |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| ++ |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| + |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| + |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| + |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| + |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| +- |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| + |(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| + |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| ++ |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| ++ |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| + |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| + |(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| + |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| + |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| ++ |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| + |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| ++ |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| + |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| + |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ |(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| + |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| + |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| + |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| +- |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- |(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| + |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| +- |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| + CLASS-PREDICATE-NAME + |PCL::STRUCTURE-SLOT-DEFINITION class predicate| + |PCL::STRUCTURE-DIRECT-SLOT-DEFINITION class predicate| +@@ -1233,8 +1319,8 @@ + |(WRITER PREDICATE-NAME)| |(WRITER READERS)| + |(READER WRITER-FUNCTION)| |(READER INITFUNCTION)| + INITIALIZE-INTERNAL-SLOT-FUNCTIONS +- |SETF PCL SLOT-DEFINITION-TYPE| +- |(WRITER CLASS-PRECEDENCE-LIST)| |(READER WRITERS)| ++ |SETF PCL SLOT-DEFINITION-TYPE| |(READER WRITERS)| ++ |(WRITER CLASS-PRECEDENCE-LIST)| + |(WRITER ACCESSOR-FLAGS)| |(READER INITFORM)| + METHOD-COMBINATION-P |(WRITER LOCATION)| + |(WRITER DOCUMENTATION)| +@@ -1248,11 +1334,11 @@ + |(READER ALLOCATION)| |(WRITER SPECIALIZERS)| + |(CALL REAL-ENSURE-GF-USING-CLASS--NULL)| + |(WRITER IDENTITY-WITH-ONE-ARGUMENT)| +- |(SETF METHOD-GENERIC-FUNCTION)| LEGAL-SPECIALIZERS-P +- |(WRITER PRETTY-ARGLIST)| |SETF PCL OBJECT-PLIST| +- |(WRITER DEFSTRUCT-FORM)| |(READER FUNCTION)| +- |(READER GENERIC-FUNCTION)| |(READER LAMBDA-LIST)| +- |(READER SLOT-DEFINITION)| ++ |(SETF METHOD-GENERIC-FUNCTION)| ++ |(WRITER PRETTY-ARGLIST)| LEGAL-SPECIALIZERS-P ++ |SETF PCL OBJECT-PLIST| |(WRITER DEFSTRUCT-FORM)| ++ |(READER FUNCTION)| |(READER GENERIC-FUNCTION)| ++ |(READER LAMBDA-LIST)| |(READER SLOT-DEFINITION)| + |PCL::CLASS-PROTOTYPE-SPECIALIZER class predicate| + |SETF PCL SLOT-DEFINITION-INITFORM| + |SETF PCL CLASS-DEFSTRUCT-FORM| +@@ -1273,17 +1359,16 @@ + |SETF PCL SLOT-DEFINITION-ALLOCATION| + |SETF PCL SLOT-DEFINITION-INITFUNCTION| + |(WRITER SLOT-NAME)| |(BOUNDP NAME)| +- |(WRITER ALLOCATION)| |(READER FAST-FUNCTION)| ++ |(READER FAST-FUNCTION)| |(WRITER ALLOCATION)| + |(READER METHOD-CLASS)| |(SETF OBJECT-PLIST)| + |(READER INTERNAL-WRITER-FUNCTION)| + |(READER INTERNAL-READER-FUNCTION)| + |(READER METHOD-COMBINATION)| + METHOD-COMBINATION-OPTIONS |(READER DIRECT-SLOTS)| + |(READER DIRECT-METHODS)| +- |SETF PCL SLOT-DEFINITION-READERS| +- |(READER BOUNDP-FUNCTION)| |(WRITER FUNCTION)| +- |(WRITER GENERIC-FUNCTION)| |SETF PCL DOCUMENTATION| +- |(READER DIRECT-SUBCLASSES)| ++ |SETF PCL SLOT-DEFINITION-READERS| |(WRITER FUNCTION)| ++ |(WRITER GENERIC-FUNCTION)| |(READER BOUNDP-FUNCTION)| ++ |SETF PCL DOCUMENTATION| |(READER DIRECT-SUBCLASSES)| + |(READER DIRECT-SUPERCLASSES)| |(WRITER LAMBDA-LIST)| + FUNCALLABLE-STANDARD-CLASS-P + |(FAST-WRITER-METHOD SLOT-OBJECT METHOD)| +@@ -1294,7 +1379,7 @@ + |SETF PCL SLOT-VALUE-USING-CLASS| + |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-ACCESSOR-SYMBOL)| + |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION DEFSTRUCT-ACCESSOR-SYMBOL)| +- |(WRITER PROTOTYPE)| |(BOUNDP OBJECT)| |(BOUNDP TYPE)| ++ |(WRITER PROTOTYPE)| |(BOUNDP TYPE)| |(BOUNDP OBJECT)| + CLASS-CAN-PRECEDE-LIST |SETF PCL CLASS-DIRECT-SLOTS| + |SETF PCL CLASS-SLOTS| SLOT-ACCESSOR-FUNCTION + |(BOUNDP PLIST)| +@@ -1309,11 +1394,11 @@ + |(FAST-WRITER-METHOD SLOT-OBJECT ARG-INFO)| + |PCL::PLIST-MIXIN class predicate| + |(WRITER FAST-FUNCTION)| |(WRITER METHOD-CLASS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT WRAPPER)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT WRAPPER)| GET-METHOD + |(WRITER INTERNAL-WRITER-FUNCTION)| + |(WRITER INTERNAL-READER-FUNCTION)| +- |(WRITER METHOD-COMBINATION)| GET-METHOD +- |(WRITER DIRECT-SLOTS)| |(WRITER DIRECT-METHODS)| ++ |(WRITER METHOD-COMBINATION)| |(WRITER DIRECT-SLOTS)| ++ |(WRITER DIRECT-METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT INITARGS)| + |(FAST-WRITER-METHOD SLOT-DEFINITION INITARGS)| + |(FAST-WRITER-METHOD SLOT-OBJECT OPERATOR)| +@@ -1383,18 +1468,18 @@ + |(FAST-READER-METHOD SLOT-DEFINITION READERS)| + |(FAST-READER-METHOD SLOT-OBJECT SPECIALIZERS)| + |(FAST-READER-METHOD STANDARD-METHOD SPECIALIZERS)| +- |(FAST-READER-METHOD SHORT-METHOD-COMBINATION IDENTITY-WITH-ONE-ARGUMENT)| +- |(FAST-READER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-READER-METHOD SPECIALIZER TYPE)| + |(FAST-READER-METHOD SLOT-OBJECT PROTOTYPE)| + |(FAST-READER-METHOD PCL-CLASS PROTOTYPE)| ++ |(FAST-READER-METHOD SLOT-DEFINITION TYPE)| ++ |(FAST-READER-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION TYPE)| ++ |(FAST-READER-METHOD SHORT-METHOD-COMBINATION IDENTITY-WITH-ONE-ARGUMENT)| ++ |(FAST-READER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-READER-METHOD CLASS-EQ-SPECIALIZER OBJECT)| + |(FAST-READER-METHOD CLASS-PROTOTYPE-SPECIALIZER OBJECT)| + |(FAST-READER-METHOD SLOT-OBJECT OBJECT)| + |(FAST-READER-METHOD EQL-SPECIALIZER OBJECT)| +- |(FAST-READER-METHOD SLOT-DEFINITION TYPE)| +- |(FAST-READER-METHOD SLOT-OBJECT TYPE)| +- |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION TYPE)| + |(FAST-READER-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| + |(FAST-READER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| + |(FAST-READER-METHOD SLOT-OBJECT INITFORM)| +@@ -1416,11 +1501,11 @@ + |(FAST-READER-METHOD SLOT-CLASS SLOTS)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SLOTS)| + |(FAST-READER-METHOD SLOT-CLASS DIRECT-SLOTS)| +- |(FAST-READER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-READER-METHOD SLOT-OBJECT METHODS)| + |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| + |(FAST-READER-METHOD SLOT-OBJECT OPTIONS)| + |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION OPTIONS)| ++ |(FAST-READER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| + |(FAST-READER-METHOD CLASS DIRECT-SUBCLASSES)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| +@@ -1458,8 +1543,8 @@ + |(FAST-BOUNDP-METHOD SLOT-OBJECT READERS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT SPECIALIZERS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT PROTOTYPE)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT OBJECT)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT OBJECT)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT INITFORM)| + |(SETF SLOT-VALUE-USING-CLASS)| +@@ -1485,10 +1570,10 @@ + |(SETF SLOT-DEFINITION-TYPE)| + |(SETF SLOT-DEFINITION-INITFORM)| + |(BOUNDP INITIALIZE-INFO)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-METHODS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOTS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SLOTS)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT METHODS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT OPTIONS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| +@@ -1498,94 +1583,94 @@ + GENERIC-FUNCTION-P + |PCL::SLOT-DEFINITION class predicate| |(READER NAME)| + |(READER CLASS)| +- |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| +- |(FAST-METHOD DESCRIBE-OBJECT (T T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| ++ |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| ++ |(FAST-METHOD SLOT-UNBOUND (T T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ |(FAST-METHOD (SETF DOCUMENTATION) (T T))| + |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| ++ |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| + |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| + |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| + |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| ++ |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| + |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| + |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- |(FAST-METHOD PRINT-OBJECT (CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (T T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| + |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| + |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| +- |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| + |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ |(FAST-METHOD PRINT-OBJECT (T T))| ++ |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| + |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| ++ |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| + |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| + |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| +- |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (T T))| + |(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD SLOT-UNBOUND (T T T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| + |(FAST-METHOD SLOT-MISSING (T T T T))| +- |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| +- |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- LEGAL-SLOT-NAME-P |(READER OBJECT)| |(READER TYPE)| ++ |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| ++ LEGAL-SLOT-NAME-P |(READER TYPE)| |(READER OBJECT)| + CLASS-WRAPPER |(READER PLIST)| + |(FAST-METHOD CLASS-PREDICATE-NAME (T))| + |(FAST-METHOD DOCUMENTATION (T))| + |(FAST-METHOD NO-APPLICABLE-METHOD (T))| + |(READER SLOTS)| |(WRITER NAME)| DEFINITION-SOURCE + |PCL::SLOT-OBJECT class predicate| DEFAULT-INITARGS +- |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER OBJECT)| +- |(WRITER TYPE)| ++ |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER TYPE)| ++ |(WRITER OBJECT)| + |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| + |(WRITER PLIST)| |(WRITER SLOTS)| + |PCL::DOCUMENTATION-MIXIN class predicate| +@@ -1625,10 +1710,10 @@ + |COMMON-LISP::STANDARD-OBJECT class predicate| + |COMMON-LISP::BUILT-IN-CLASS class predicate| + |SETF PCL CLASS-SLOT-VALUE| |(SETF CLASS-SLOTS)| +- |(SETF CLASS-DIRECT-SLOTS)| |(READER OPERATOR)| +- |(CALL REAL-GET-METHOD)| |(CALL REAL-REMOVE-METHOD)| +- |(CALL REAL-ADD-METHOD)| |(READER ARG-INFO)| +- METHOD-COMBINATION-TYPE ++ |(SETF CLASS-DIRECT-SLOTS)| DO-STANDARD-DEFSETF-1 ++ |(READER OPERATOR)| |(CALL REAL-GET-METHOD)| ++ |(CALL REAL-REMOVE-METHOD)| |(CALL REAL-ADD-METHOD)| ++ |(READER ARG-INFO)| METHOD-COMBINATION-TYPE + |(READER DEFSTRUCT-CONSTRUCTOR)| + |(INTERNAL-READER-METHOD STANDARD-GENERIC-FUNCTION ARG-INFO)| + |(READER INITIALIZE-INFO)| |(WRITER WRAPPER)| +@@ -1637,8 +1722,8 @@ + |(WRITER DEFSTRUCT-ACCESSOR-SYMBOL)| + COMPUTE-SLOT-ACCESSOR-INFO |(READER INITARGS)| + |(WRITER CLASS-EQ-SPECIALIZER)| +- STANDARD-BOUNDP-METHOD-P |(SETF DOCUMENTATION)| +- RAW-INSTANCE-ALLOCATOR ++ STANDARD-BOUNDP-METHOD-P FDEFINE-CAREFULLY ++ |(SETF DOCUMENTATION)| RAW-INSTANCE-ALLOCATOR + |SETF PCL SLOT-DEFINITION-DEFSTRUCT-ACCESSOR-SYMBOL| + |SETF PCL CLASS-INITIALIZE-INFO| |(WRITER OPERATOR)| + |(WRITER ARG-INFO)| +@@ -1651,9 +1736,8 @@ + METHOD-COMBINATION-DOCUMENTATION + |SETF PCL SLOT-DEFINITION-INITARGS| + REMOVE-BOUNDP-METHOD ADD-NAMED-METHOD +- |(WRITER INITARGS)| + |SETF PCL CLASS-DEFSTRUCT-CONSTRUCTOR| +- |(BOUNDP METHOD)| ++ |(WRITER INITARGS)| |(BOUNDP METHOD)| + |(FAST-WRITER-METHOD SLOT-OBJECT PREDICATE-NAME)| + |(FAST-WRITER-METHOD CLASS NAME)| + |(FAST-WRITER-METHOD SLOT-DEFINITION NAME)| +@@ -1699,11 +1783,11 @@ + |(FAST-WRITER-METHOD SLOT-OBJECT READERS)| + |(FAST-WRITER-METHOD SLOT-DEFINITION READERS)| + |(FAST-WRITER-METHOD SLOT-OBJECT SPECIALIZERS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-WRITER-METHOD SLOT-OBJECT PROTOTYPE)| +- |(FAST-WRITER-METHOD SLOT-OBJECT OBJECT)| + |(FAST-WRITER-METHOD SLOT-DEFINITION TYPE)| + |(FAST-WRITER-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT OBJECT)| + REMOVE-NAMED-METHOD + |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| + |(FAST-WRITER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| +@@ -1756,5 +1840,6 @@ + ENSURE-CLASS-USING-CLASS NO-APPLICABLE-METHOD + SLOT-DEFINITION-WRITERS + COMPUTE-APPLICABLE-METHODS-USING-CLASSES +- CLASS-PRECEDENCE-LIST DESCRIBE-OBJECT)) ++ CLASS-PRECEDENCE-LIST DISASSEMBLE DESCRIBE-OBJECT ++ COMPILE)) + (SETF (GET V 'COMPILER::PROCLAIMED-CLOSURE) T)) +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -79,7 +79,7 @@ + #+ansi-cl (use-package :pcl :user) + + (import 'si::(clines defentry defcfun object void int double quit bye gbc system +- *lib-directory* *system-directory*) :user) ++ *lib-directory* *system-directory* while) :user) + + (let* ((i 4096)(j (si::equal-tail-recursion-check i))) + (unless (<= (ash i -1) j) diff --git a/debian/patches/list_order.11 b/debian/patches/list_order.11 new file mode 100644 index 0000000..b97390c --- /dev/null +++ b/debian/patches/list_order.11 @@ -0,0 +1,600 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-53) unstable; urgency=medium + . + * list_order.9 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-08-23 + +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -35,12 +35,6 @@ int line_length = 72; + #define WRITEC_NEWLINE(strm) (writec_stream('\n',strm)) + #endif + +-#define to_be_escaped(c) \ +- (standard_readtable->rt.rt_self[(c)&0377].rte_chattrib \ +- != cat_constituent || \ +- isLower((c)&0377) || (c) == ':') +- +- + #define READ_TABLE_CASE (Vreadtable->s.s_dbind->rt.rt_case) + + #define mod(x) ((x)%Q_SIZE) +@@ -637,50 +631,31 @@ constant_case(object x) { + } + + static int +-all_dots(object x) { +- +- fixnum i; +- +- for (i=0;is.s_fillp;i++) +- if (x->s.s_self[i]!='.') +- return 0; ++needs_escape (object x) { + +- return 1; +- +-} +- +-static int +-needs_escape (object x,int pp) { +- +- fixnum i; +- char ch; ++ fixnum i,all_dots=1; ++ int ch; + + if (!PRINTescape) + return 0; + + for (i=0;is.s_fillp;i++) + switch((ch=x->s.s_self[i])) { +- case '(': +- case ')': + case ':': +- case '`': +- case '\'': +- case '"': +- case ';': +- case ',': +- case '\n': + return 1; +- case ' ': +- if (!i) return 1; ++ case '.': ++ break; + default: ++ all_dots=0; ++ if (Vreadtable->s.s_dbind->rt.rt_self[ch].rte_chattrib!=cat_constituent) ++ return 1; + if ((READ_TABLE_CASE==sKupcase && isLower(ch)) || + (READ_TABLE_CASE==sKdowncase && isUpper(ch))) + return 1; + } + +- if (pp) +- if (potential_number_p(x, PRINTbase) || all_dots(x)) +- return 1; ++ if (potential_number_p(x, PRINTbase) || all_dots) ++ return 1; + + return !x->s.s_fillp; + +@@ -690,19 +665,21 @@ needs_escape (object x,int pp) { + #define convertible_lower(c) ((READ_TABLE_CASE==sKdowncase||READ_TABLE_CASE==sKinvert)&& isLower(c)) + + static void +-print_symbol_name_body(object x,int pp) { ++print_symbol_name_body(object x) { + + int i,j,fc,tc,lw,k,cc; + + cc=constant_case(x); +- k=needs_escape(x,pp); ++ k=needs_escape(x); + + if (k) + write_ch('|'); + + for (lw=i=0;is.s_fillp;i++) { + j = x->s.s_self[i]; +- if (PRINTescape && (j == '|' || j == '\\')) ++ if (PRINTescape && ++ (Vreadtable->s.s_dbind->rt.rt_self[j].rte_chattrib==cat_single_escape || ++ Vreadtable->s.s_dbind->rt.rt_self[j].rte_chattrib==cat_multiple_escape)) + write_ch('\\'); + fc=convertible_upper(j) ? 1 : + (convertible_lower(j) ? -1 : 0); +@@ -711,7 +688,7 @@ print_symbol_name_body(object x,int pp) + (PRINTcase == sKdowncase ? -1 : + (PRINTcase == sKcapitalize ? (i==lw ? 1 : -1) : 0)))); + if (ispunct(j)||isspace(j)) lw=i+1; +- j+=(tc*fc && !k ? (tc-fc)>>1 : 0)*('A'-'a'); ++ j+=(tc && fc && !k ? (tc-fc)>>1 : 0)*('A'-'a'); + write_ch(j); + + } +@@ -721,6 +698,42 @@ print_symbol_name_body(object x,int pp) + + } + ++#define DONE 1 ++#define FOUND -1 ++ ++static int ++write_sharp_eq(object *vp,bool dot) { ++ ++ bool defined=vp[1]!=Cnil; ++ ++ if (dot) { ++ write_str(" . "); ++ if (!defined) return FOUND; ++ } ++ ++ vp[1]=Ct; ++ write_ch('#'); ++ write_decimal((vp-PRINTvs_top)/2); ++ write_ch(defined ? '#' : '='); ++ ++ return defined ? DONE : FOUND; ++ ++} ++ ++static int ++write_sharp_eqs(object x,bool dot) { ++ ++ object *vp; ++ ++ for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) ++ if (x == *vp) ++ return write_sharp_eq(vp,dot); ++ ++ return 0; ++ ++} ++ ++ + void + write_object(x, level) + object x; +@@ -728,7 +741,6 @@ int level; + { + object r, y; + int i, j, k; +- object *vp; + + cs_check(x); + +@@ -903,29 +915,15 @@ int level; + + if (PRINTescape) { + if (x->s.s_hpack == Cnil) { +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2+1); +- write_ch('#'); +- return; +- } else { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2+1); +- write_ch('='); +- vp[1] = Ct; +- } +- } +- } ++ if (PRINTcircle) ++ if (write_sharp_eqs(x,FALSE)==DONE) return; + if (PRINTgensym) + write_str("#:"); + } else if (x->s.s_hpack == keyword_package) { + write_ch(':'); + } else if (PRINTpackage||find_symbol(x,current_package())!=x || !intern_flag) { + +- print_symbol_name_body(x->s.s_hpack->p.p_name,0); ++ print_symbol_name_body(x->s.s_hpack->p.p_name); + + if (find_symbol(x, x->s.s_hpack) != x) + error("can't print symbol"); +@@ -939,7 +937,7 @@ int level; + } + + } +- print_symbol_name_body(x,1); ++ print_symbol_name_body(x); + break; + } + case t_array: +@@ -953,23 +951,8 @@ int level; + write_str(">"); + break; + } +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('#'); +- return; +- } else { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('='); +- vp[1] = Ct; +- break; +- } +- } +- } ++ if (PRINTcircle) ++ if (write_sharp_eqs(x,FALSE)==DONE) return; + if (PRINTlevel >= 0 && level >= PRINTlevel) { + write_ch('#'); + break; +@@ -1044,23 +1027,8 @@ int level; + write_str(">"); + break; + } +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('#'); +- return; +- } else { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('='); +- vp[1] = Ct; +- break; +- } +- } +- } ++ if (PRINTcircle) ++ if (write_sharp_eqs(x,FALSE)==DONE) return; + if (PRINTlevel >= 0 && level >= PRINTlevel) { + write_ch('#'); + break; +@@ -1130,23 +1098,8 @@ int level; + write_object(x->c.c_cdr, level); + break; + } +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('#'); +- return; +- } else { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('='); +- vp[1] = Ct; +- break; +- } +- } +- } ++ if (PRINTcircle) ++ if (write_sharp_eqs(x,FALSE)==DONE) return; + if (PRINTpretty) { + if (x->c.c_car == sLquote && + type_of(x->c.c_cdr) == t_cons && +@@ -1192,22 +1145,15 @@ int level; + } + break; + } +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_str(" . #"); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('#'); +- goto RIGHT_PAREN; +- } else { +- write_ch(INDENT); +- write_str(". "); +- write_object(x, level); +- goto RIGHT_PAREN; +- } +- } +- } ++ if (PRINTcircle) ++ switch (write_sharp_eqs(x,TRUE)) { ++ case FOUND: ++ write_object(x, level); ++ case DONE: ++ goto RIGHT_PAREN; ++ default: ++ break; ++ } + if (i == 0 && y != OBJNULL && type_of(y) == t_symbol) + write_ch(INDENT1); + else +@@ -1369,23 +1315,8 @@ int level; + break; + + case t_structure: +- if (PRINTcircle) { +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) { +- if (vp[1] != Cnil) { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('#'); +- return; +- } else { +- write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); +- write_ch('='); +- vp[1] = Ct; +- break; +- } +- } +- } ++ if (PRINTcircle) ++ if (write_sharp_eqs(x,FALSE)==DONE) return; + if (PRINTlevel >= 0 && level >= PRINTlevel) { + write_ch('#'); + break; +@@ -1468,48 +1399,73 @@ static int dgs; + + #include "page.h" + ++#define travel_seen(x) x->d.m ++#define travel_pushed(x) x->d.f ++#define travel_bits(x) x->md.mf ++ + static void +-travel_push_new(object x) { ++travel_push(object x) { + +- object y; + int i; + +- BEGIN: +- if (NULL_OR_ON_C_STACK(x)) return; +- if (is_marked(x)) { +- vs_check_push(x); +- vs_check_push(Cnil); ++ if (NULL_OR_ON_C_STACK(x)) ++ return; ++ ++ if (travel_seen(x)) { ++ ++ if (!travel_pushed(x)) { ++ vs_check_push(x); ++ vs_check_push(Cnil); ++ travel_pushed(x)=1; ++ } ++ + return; ++ + } ++ + switch (type_of(x)) { ++ + case t_symbol: +- if (dgs && x->s.s_hpack==Cnil) {mark(x);} ++ ++ if (dgs && x->s.s_hpack==Cnil) ++ travel_seen(x)=1; + break; ++ + case t_cons: +- y=x->c.c_cdr; +- mark(x); +- travel_push_new(x->c.c_car); +- x=y; +- goto BEGIN; ++ ++ { ++ object y=x->c.c_cdr; ++ travel_seen(x)=1; ++ travel_push(x->c.c_car); ++ travel_push(y); ++ } + break; ++ + case t_array: +- mark(x); ++ ++ travel_seen(x)=1; + if ((enum aelttype)x->a.a_elttype == aet_object) + for (i=0;ia.a_dim;i++) +- travel_push_new(x->a.a_self[i]); ++ travel_push(x->a.a_self[i]); + break; ++ + case t_vector: +- mark(x); ++ ++ travel_seen(x)=1; + if ((enum aelttype)x->v.v_elttype == aet_object) + for (i=0;iv.v_fillp;i++) +- travel_push_new(x->v.v_self[i]); ++ travel_push(x->v.v_self[i]); + break; ++ + case t_structure: +- mark(x); ++ ++ travel_seen(x)=1; + for (i = 0; i < S_DATA(x->str.str_def)->length; i++) +- travel_push_new(structure_ref(x,x->str.str_def,i)); ++ travel_push(structure_ref(x,x->str.str_def,i)); + break; ++ + default: ++ + break; + + } +@@ -1518,34 +1474,45 @@ travel_push_new(object x) { + + + static void +-travel_clear_new(object x) { ++travel_clear(object x) { + + int i; + +- BEGIN: +- if (NULL_OR_ON_C_STACK(x) || !is_marked(x)) return; +- unmark(x); ++ if (NULL_OR_ON_C_STACK(x) || !travel_bits(x)) ++ return; ++ ++ travel_bits(x)=0; ++ + switch (type_of(x)) { ++ + case t_cons: +- travel_clear_new(x->c.c_car); +- x=x->c.c_cdr; +- goto BEGIN; ++ ++ travel_clear(x->c.c_car); ++ travel_clear(x->c.c_cdr); + break; ++ + case t_array: ++ + if ((enum aelttype)x->a.a_elttype == aet_object) + for (i=0;ia.a_dim;i++) +- travel_clear_new(x->a.a_self[i]); ++ travel_clear(x->a.a_self[i]); + break; ++ + case t_vector: ++ + if ((enum aelttype)x->v.v_elttype == aet_object) + for (i=0;iv.v_fillp;i++) +- travel_clear_new(x->v.v_self[i]); ++ travel_clear(x->v.v_self[i]); + break; ++ + case t_structure: ++ + for (i = 0; i < S_DATA(x->str.str_def)->length; i++) +- travel_clear_new(structure_ref(x,x->str.str_def,i)); ++ travel_clear(structure_ref(x,x->str.str_def,i)); + break; ++ + default: ++ + break; + + } +@@ -1558,74 +1525,14 @@ setupPRINTcircle(object x,int dogensyms) + + BEGIN_NO_INTERRUPT; + dgs=dogensyms; +- travel_push_new(x); ++ travel_push(x); + dgs=0; + PRINTvs_limit = vs_top; +- travel_clear_new(x); ++ travel_clear(x); + END_NO_INTERRUPT; + + } + +-/* char travel_push_type[32]; */ +- +-/* static void */ +-/* travel_push_object(x) */ +-/* object x; */ +-/* { */ +-/* enum type t; */ +-/* int i; */ +-/* object *vp; */ +- +-/* cs_check(x); */ +- +-/* BEGIN: */ +-/* t = type_of(x); */ +-/* if(travel_push_type[(int)t]==0) return; */ +-/* if(t==t_symbol && x->s.s_hpack != Cnil) return; */ +- +-/* for (vp = PRINTvs_top; vp < vs_top; vp += 2) */ +-/* if (x == *vp) { */ +-/* if (vp[1] != Cnil) */ +-/* return; */ +-/* vp[1] = Ct; */ +-/* return; */ +-/* } */ +-/* vs_check_push(x); */ +-/* vs_check_push(Cnil); */ +-/* if (t == t_array && (enum aelttype)x->a.a_elttype == aet_object) */ +-/* for (i = 0; i < x->a.a_dim; i++) */ +-/* travel_push_object(x->a.a_self[i]); */ +-/* else if (t == t_vector && (enum aelttype)x->v.v_elttype == aet_object) */ +-/* for (i = 0; i < x->v.v_fillp; i++) */ +-/* travel_push_object(x->v.v_self[i]); */ +-/* else if (t == t_cons) { */ +-/* travel_push_object(x->c.c_car); */ +-/* x = x->c.c_cdr; */ +-/* goto BEGIN; */ +-/* } else if (t == t_structure) { */ +-/* for (i = 0; i < S_DATA(x->str.str_def)->length; i++) */ +-/* travel_push_object(structure_ref(x,x->str.str_def,i)); */ +-/* } */ +-/* } */ +- +-/* static void */ +-/* setupPRINTcircle(x,dogensyms) */ +-/* object x; */ +-/* int dogensyms; */ +-/* { object *vp,*vq; */ +-/* travel_push_type[(int)t_symbol]=dogensyms; */ +-/* travel_push_type[(int)t_array]= */ +-/* (travel_push_type[(int)t_vector]=PRINTarray); */ +-/* travel_push_object(x); */ +-/* for (vp = vq = PRINTvs_top; vp < vs_top; vp += 2) */ +-/* if (vp[1] != Cnil) { */ +-/* vq[0] = vp[0]; */ +-/* vq[1] = Cnil; */ +-/* vq += 2; */ +-/* } */ +-/* PRINTvs_limit = vs_top = vq; */ +-/* } */ +- + void + setupPRINTdefault(x) + object x; +@@ -1640,8 +1547,8 @@ object x; + vs_push(PRINTstream); + FEwrong_type_argument(sLstream, PRINTstream); + } +- PRINTescape = symbol_value(sLAprint_escapeA) != Cnil; + PRINTreadably = symbol_value(sLAprint_readablyA) != Cnil; ++ PRINTescape = PRINTreadably || symbol_value(sLAprint_escapeA) != Cnil; + PRINTpretty = symbol_value(sLAprint_prettyA) != Cnil; + PRINTcircle = symbol_value(sLAprint_circleA) != Cnil; + y = symbol_value(sLAprint_baseA); diff --git a/debian/patches/list_order.12 b/debian/patches/list_order.12 new file mode 100644 index 0000000..e599158 --- /dev/null +++ b/debian/patches/list_order.12 @@ -0,0 +1,50 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-55) unstable; urgency=medium + . + * disable gprof on aarch64 + * Bug fix: "gcl FTBFS on arm64: Unrecoverable error: Segmentation + violation..", thanks to Adrian Bunk (Closes: #873052). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/873052 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-08-24 + +--- gcl-2.6.12.orig/o/regexpr.c ++++ gcl-2.6.12/o/regexpr.c +@@ -66,6 +66,7 @@ DEFUN_NEW("COMPILE-REGEXP",object,fScomp + + char *tmp; + object res; ++ ufixnum i=0; + + if (type_of(p)!= t_string && type_of(p)!=t_symbol) + not_a_string_or_symbol(p); +@@ -82,9 +83,9 @@ DEFUN_NEW("COMPILE-REGEXP",object,fScomp + res->v.v_adjustable=0; + res->v.v_offset=0; + res->v.v_self=NULL; +- if (!(res->v.v_self=(void *)regcomp(tmp,&res->v.v_dim))) ++ if (!(res->v.v_self=(void *)regcomp(tmp,&i))) + FEerror("regcomp failure",0); +- res->v.v_fillp=res->v.v_dim; ++ res->v.v_fillp=res->v.v_dim=i; + + RETURN1(res); + diff --git a/debian/patches/list_order.13 b/debian/patches/list_order.13 new file mode 100644 index 0000000..3a95b63 --- /dev/null +++ b/debian/patches/list_order.13 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-57) unstable; urgency=medium + . + * list_order.13 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-08-29 + +--- gcl-2.6.12.orig/h/elf32_mips_reloc.h ++++ gcl-2.6.12/h/elf32_mips_reloc.h +@@ -35,7 +35,7 @@ + if (a) add_vals(where,MASK(16),(s>>16)+a); + break; + case R_MIPS_LO16: +- if (sym->st_other) s=gpd; ++ if (sym->st_other) s=gpd ? gpd : ({massert(sym->st_other==2);(ul)got;}); + a=*where&MASK(16); + if (a&0x8000) a|=0xffff0000; + a+=s&MASK(16); diff --git a/debian/patches/list_order.16 b/debian/patches/list_order.16 new file mode 100644 index 0000000..d4b6955 --- /dev/null +++ b/debian/patches/list_order.16 @@ -0,0 +1,412 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-58) unstable; urgency=medium + . + * list_order.14 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-01-12 + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1964,3 +1964,9 @@ vsystem(const char *); + + object + n_cons_from_x(fixnum,object); ++ ++int ++seek_to_end_ofile(FILE *); ++ ++void ++travel_find_sharing(object,object); +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -976,100 +976,13 @@ fasd_patch_sharp(object x, int depth) + } + + object sharing_table; +-static enum circ_ind +-is_it_there(object x) +-{ struct htent *e; +- object table=sharing_table; +- switch(type_of(x)){ +- case t_cons: +- case t_symbol: +- case t_structure: +- case t_array: +- case t_vector: +- case t_package: +- e= gethash(x,table); +- if (e->hte_key ==OBJNULL) +- {sethash(x,table,make_fixnum(-1)); +- return FIRST_INDEX; +- } +- else +- {int n=fix(e->hte_value); +- if (n <0) +- e->hte_value=make_fixnum(n-1); +- return LATER_INDEX;} +- break; +- default: +- return NOT_INDEXED;}} + +- +- +-static void +-find_sharing(object x) +-{ +- cs_check(x); +- BEGIN: +- if(is_it_there(x)!=FIRST_INDEX) return; +- +- switch (type_of(x)) { +- +- case DP(t_cons:) +- +- find_sharing(x->c.c_car); +- x=x->c.c_cdr; +- goto BEGIN; +- +- break; +- +- case DP(t_vector:) +- { +- int i; +- +- if ((enum aelttype)x->v.v_elttype != aet_object) +- break; +- +- for (i = 0; i < x->v.v_fillp; i++) +- find_sharing(x->v.v_self[i]); +- break; +- } +- case DP(t_array:) +- { +- int i, j; +- +- if ((enum aelttype)x->a.a_elttype != aet_object) +- break; +- +- for (i = 0, j = 1; i < x->a.a_rank; i++) +- j *= x->a.a_dims[i]; +- for (i = 0; i < j; i++) +- find_sharing(x->a.a_self[i]); +- break; +- } +- case DP(t_structure:) +- {object def = x->str.str_def; +- int i; +- i=S_DATA(def)->length; +- while (i--> 0) +- find_sharing(structure_ref(x,def,i)); +- break; +- } +- default: +- break; +- } +- return; +-} +- +-DEFUN_NEW("FIND-SHARING-TOP",object,fSfind_sharing_top,SI,2,2,NONE,OO,OO,OO,OO,(object x, object table),"") +-/* static object */ +-/* FFN(find_sharing_top)(object x, object table) */ +-{sharing_table=table; +- find_sharing(x); +- return Ct; ++DEFUN_NEW("FIND-SHARING-TOP",object,fSfind_sharing_top,SI,2,2,NONE,OO,OO,OO,OO,(object x, object table),"") { ++ sharing_table=table; ++ travel_find_sharing(x,table); ++ return Ct; + } + +- +- +- +- + /* static object */ + /* read_fasd(int i) */ + /* {object tem; */ +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -490,7 +490,6 @@ int level; + void (*wf)(int) = write_ch_fun; + + object *vt = PRINTvs_top; +- object *vl = PRINTvs_limit; + bool e = PRINTescape; + bool ra = PRINTreadably; + bool r = PRINTradix; +@@ -599,7 +598,6 @@ L: + PRINTradix = r; + PRINTescape = e; + PRINTreadably = ra; +- PRINTvs_limit = vl; + PRINTvs_top = vt; + + write_ch_fun = wf; +@@ -702,18 +700,19 @@ print_symbol_name_body(object x) { + #define FOUND -1 + + static int +-do_write_sharp_eq(object x,bool dot) { ++do_write_sharp_eq(struct htent *e,bool dot) { + +- bool defined=x->c.c_cdr!=Cnil; ++ fixnum val=fix(e->hte_value); ++ bool defined=val&1; + + if (dot) { + write_str(" . "); + if (!defined) return FOUND; + } + +- x->c.c_cdr=Ct; ++ if (!defined) e->hte_value=make_fixnum(val|1); + write_ch('#'); +- write_decimal(fix(x->c.c_car)); ++ write_decimal(val>>1); + write_ch(defined ? '#' : '='); + + return defined ? DONE : FOUND; +@@ -726,7 +725,7 @@ write_sharp_eq(object x,bool dot) { + struct htent *e; + + return PRINTvs_top[0]!=Cnil && (e=gethash(x,PRINTvs_top[0]))->hte_key!=OBJNULL ? +- do_write_sharp_eq(e->hte_value,dot) : 0; ++ do_write_sharp_eq(e,dot) : 0; + + } + +@@ -1392,79 +1391,65 @@ int level; + } + } + +-static int dgs; ++static int dgs,dga; + + #include "page.h" + +-#define travel_seen(x) x->d.m +-#define travel_pushed(x) x->d.f +-#define travel_bits(x) x->md.mf +- + static void + travel_push(object x) { + + int i; + +- if (NULL_OR_ON_C_STACK(x)) ++ if (is_imm_fixnum(x)) + return; + +- if (travel_seen(x)) { ++ if (is_marked(x)) { + +- if (!travel_pushed(x)) { ++ if (imcdr(x) || !x->d.f) + vs_check_push(x); +- travel_pushed(x)=1; +- } +- +- return; ++ if (!imcdr(x)) ++ x->d.f=1; + +- } +- +- switch (type_of(x)) { ++ } else switch (type_of(x)) { + +- case t_symbol: ++ case t_symbol: + +- if (dgs && x->s.s_hpack==Cnil) +- travel_seen(x)=1; +- break; +- +- case t_cons: +- +- { +- object y=x->c.c_cdr; +- travel_seen(x)=1; +- travel_push(x->c.c_car); +- travel_push(y); +- } +- break; ++ if (dgs && x->s.s_hpack==Cnil) { ++ mark(x); ++ } ++ break; + +- case t_array: ++ case t_cons: + +- travel_seen(x)=1; +- if ((enum aelttype)x->a.a_elttype == aet_object) +- for (i=0;ia.a_dim;i++) +- travel_push(x->a.a_self[i]); +- break; ++ { ++ object y=x->c.c_cdr; ++ mark(x); ++ travel_push(x->c.c_car); ++ travel_push(y); ++ } ++ break; + +- case t_vector: ++ case t_vector: ++ case t_array: + +- travel_seen(x)=1; +- if ((enum aelttype)x->v.v_elttype == aet_object) +- for (i=0;iv.v_fillp;i++) +- travel_push(x->v.v_self[i]); +- break; ++ mark(x); ++ if (dga && (enum aelttype)x->a.a_elttype==aet_object) ++ for (i=0;ia.a_dim;i++) ++ travel_push(x->a.a_self[i]); ++ break; + +- case t_structure: ++ case t_structure: + +- travel_seen(x)=1; +- for (i = 0; i < S_DATA(x->str.str_def)->length; i++) +- travel_push(structure_ref(x,x->str.str_def,i)); +- break; ++ mark(x); ++ for (i = 0; i < S_DATA(x->str.str_def)->length; i++) ++ travel_push(structure_ref(x,x->str.str_def,i)); ++ break; + +- default: ++ default: + +- break; ++ break; + +- } ++ } + + } + +@@ -1474,10 +1459,15 @@ travel_clear(object x) { + + int i; + +- if (NULL_OR_ON_C_STACK(x) || !travel_bits(x)) ++ if (is_imm_fixnum(x)) ++ return; ++ ++ if (!is_marked(x)) + return; + +- travel_bits(x)=0; ++ unmark(x); ++ if (!imcdr(x)) ++ x->d.f=0; + + switch (type_of(x)) { + +@@ -1487,20 +1477,14 @@ travel_clear(object x) { + travel_clear(x->c.c_cdr); + break; + ++ case t_vector: + case t_array: + +- if ((enum aelttype)x->a.a_elttype == aet_object) ++ if (dga && (enum aelttype)x->a.a_elttype == aet_object) + for (i=0;ia.a_dim;i++) + travel_clear(x->a.a_self[i]); + break; + +- case t_vector: +- +- if ((enum aelttype)x->v.v_elttype == aet_object) +- for (i=0;iv.v_fillp;i++) +- travel_clear(x->v.v_self[i]); +- break; +- + case t_structure: + + for (i = 0; i < S_DATA(x->str.str_def)->length; i++) +@@ -1515,26 +1499,47 @@ travel_clear(object x) { + + } + +-object sLeq; +- + static void +-setupPRINTcircle(object x,int dogensyms) { +- +- object *xp; ++travel(object x,int mdgs,int mdga) { + + BEGIN_NO_INTERRUPT; +- dgs=dogensyms; ++ dgs=mdgs; ++ dga=mdga; + travel_push(x); +- dgs=0; +- PRINTvs_limit = vs_top; + travel_clear(x); + END_NO_INTERRUPT; + +- vs_check_push(PRINTvs_limit>PRINTvs_top ? funcall_cfun(Lmake_hash_table,2,sKtest,sLeq) : Cnil); +- for (xp=PRINTvs_top;xpvp ? funcall_cfun(Lmake_hash_table,2,sKtest,sLeq) : Cnil; ++ for (j=0;vhte_key==OBJNULL) ++ sethash(*v,h,make_fixnum((j++)<<1)); ++ ++ vs_top=vp; ++ vs_push(h); ++ ++} ++ ++void ++travel_find_sharing(object x,object table) { ++ ++ object *vp=vs_top; ++ ++ travel(x,1,1); ++ ++ for (;vs_top>vp;vs_top--) ++ sethash(vs_head,table,make_fixnum(-2)); + + } + diff --git a/debian/patches/list_order.17 b/debian/patches/list_order.17 new file mode 100644 index 0000000..02a3897 --- /dev/null +++ b/debian/patches/list_order.17 @@ -0,0 +1,1136 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-59) unstable; urgency=medium + . + * list_order.16 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-01-23 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -98,7 +98,9 @@ + (defvar *default-c-file* nil) + (defvar *default-h-file* nil) + (defvar *default-data-file* nil) ++(defvar *default-prof-p* nil) + (defvar *keep-gaz* nil) ++(defvar *prof-p* nil) + + ;; (list section-length split-file-names next-section-start-file-position) + ;; Many c compilers cannot handle the large C files resulting from large lisp files. +@@ -167,10 +169,12 @@ + (data-file *default-data-file*) + (c-debug nil) + (system-p *default-system-p*) ++ (prof-p *default-prof-p*) + (print nil) + (load nil) + &aux (*standard-output* *standard-output*) +- (*error-output* *error-output*) ++ (*prof-p* prof-p) ++ (*error-output* *error-output*) + (*compiler-in-use* *compiler-in-use*) + (*c-debug* c-debug) + (*compile-print* (or print *compile-print*)) +@@ -488,8 +492,9 @@ Cannot compile ~a.~%" + (t (setq dir "."))) + (setq na (namestring + (make-pathname :name name :type (pathname-type(first args))))) +- (format nil "~a -I~a ~a ~a -c ~a -o ~a ~a" ++ (format nil "~a ~a -I~a ~a ~a -c ~a -o ~a ~a" + *cc* ++ (if *prof-p* " -pg " "") + (concatenate 'string si::*system-directory* "../h") + (if (and (boundp '*c-debug*) *c-debug*) " -g " "") + (case *speed* +--- gcl-2.6.12.orig/cmpnew/gcl_cmpwt.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpwt.lsp +@@ -124,6 +124,7 @@ + x)) + + (defun wt-data-file () ++ (when *prof-p* (add-init `(si::mark-memory-as-profiling))) + (verify-data-vector (data-vector)) + (let* ((vec (coerce (nreverse (data-inits)) 'vector))) + (verify-data-vector vec) +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4131,30 +4131,11 @@ $as_echo "disabled" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 + $as_echo "ok" >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text start" >&5 +-$as_echo_n "checking for text start... " >&6; } +- echo 'int main () {return(0);}' >foo.c +- $CC foo.c -o foo +- GCL_GPROF_START=`nm foo | $AWK '/ *[TD] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc +- rm -f foo.c foo +- if test "$GCL_GPROF_START" != "" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCL_GPROF_START" >&5 +-$as_echo "$GCL_GPROF_START" >&6; } +- +-cat >>confdefs.h <<_ACEOF +-#define GCL_GPROF_START $GCL_GPROF_START +-_ACEOF +- +- assert_arg_to_cflags -pg +- case $use in +- s390*) ;; # relocation truncation bug in gcc +- *) TLIBS="$TLIBS -pg";; +- esac +- TFPFLAG="" ++ assert_arg_to_cflags -pg ++ TFPFLAG="" + + $as_echo "#define GCL_GPROF 1" >>confdefs.h + +- fi + fi + fi + fi +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -342,22 +342,25 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + AC_MSG_RESULT([disabled]) + else + AC_MSG_RESULT([ok]) +- AC_MSG_CHECKING([for text start]) +- echo 'int main () {return(0);}' >foo.c +- $CC foo.c -o foo +- GCL_GPROF_START=`nm foo | $AWK '/ *[[TD]] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc +- rm -f foo.c foo +- if test "$GCL_GPROF_START" != "" ; then +- AC_MSG_RESULT($GCL_GPROF_START) +- AC_DEFINE_UNQUOTED(GCL_GPROF_START,$GCL_GPROF_START,[starting address for gprof]) +- assert_arg_to_cflags -pg +- case $use in +- s390*) ;; # relocation truncation bug in gcc +- *) TLIBS="$TLIBS -pg";; +- esac +- TFPFLAG="" +- AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) +- fi ++ assert_arg_to_cflags -pg ++ TFPFLAG="" ++ AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) ++dnl AC_MSG_CHECKING([for text start]) ++dnl echo 'int main () {return(0);}' >foo.c ++dnl $CC foo.c -o foo ++dnl GCL_GPROF_START=`nm foo | $AWK '/ *[[TD]] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc ++dnl rm -f foo.c foo ++dnl if test "$GCL_GPROF_START" != "" ; then ++dnl AC_MSG_RESULT($GCL_GPROF_START) ++dnl AC_DEFINE_UNQUOTED(GCL_GPROF_START,$GCL_GPROF_START,[starting address for gprof]) ++dnl assert_arg_to_cflags -pg ++dnl # case $use in ++dnl # s390*) ;; # relocation truncation bug in gcc ++dnl # *) TLIBS="$TLIBS -pg";; ++dnl # esac ++dnl TFPFLAG="" ++dnl AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) ++dnl fi + fi + fi]) + +--- gcl-2.6.12.orig/h/gclincl.h.in ++++ gcl-2.6.12/h/gclincl.h.in +@@ -53,9 +53,6 @@ + /* use gprof profiling */ + #undef GCL_GPROF + +-/* starting address for gprof */ +-#undef GCL_GPROF_START +- + /* No gettimeofday call -- fixme */ + #undef GETTOD_NOT_DECLARED + +@@ -153,6 +150,9 @@ + /* use libbfd */ + #undef HAVE_LIBBFD + ++/* Define to 1 if you have the `dl' library (-ldl). */ ++#undef HAVE_LIBDL ++ + /* Define to 1 if you have the `opcodes' library (-lopcodes). */ + #undef HAVE_LIBOPCODES + +@@ -255,9 +255,6 @@ + /* using xgcl */ + #undef HAVE_XGCL + +-/* number of pages to use for hole */ +-#undef HOLEPAGE +- + /* Host cpu */ + #undef HOST_CPU + +@@ -267,9 +264,6 @@ + /* Host system */ + #undef HOST_SYSTEM + +-/* time system constant */ +-#undef HZ +- + /* invocation history stack size */ + #undef IHSSIZE + +@@ -321,7 +315,7 @@ + /* can use C extension for object alignment */ + #undef OBJ_ALIGN + +-/* needed object alignment in bytes */ ++/* needed object alignment bytes */ + #undef OBJ_ALIGNMENT + + /* Define to the address where bug reports for this package should be sent. */ +@@ -345,7 +339,7 @@ + /* system pagewidth */ + #undef PAGEWIDTH + +-/* have sigcontext in signal.h */ ++/* have sigcontext of signal.h */ + #undef SIGNAL_H_HAS_SIGCONTEXT + + /* sizeof linked list for contiguous pages */ +--- gcl-2.6.12.orig/h/lu.h ++++ gcl-2.6.12/h/lu.h +@@ -355,7 +355,8 @@ struct cfdata { + FIRSTWORD; + char *cfd_start; + int cfd_size; +- int cfd_fillp; ++ int cfd_fillp:31; ++ int cfd_prof:1; + object *cfd_self; + SPAD; + }; +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1788,10 +1788,8 @@ int sigprocmask ( int how, const sigset_ + void recreate_heap1 ( void ); + #endif + +-#ifdef GCL_GPROF + void + gprof_cleanup(void); +-#endif + + int + msystem(const char *); +@@ -1970,3 +1968,6 @@ seek_to_end_ofile(FILE *); + + void + travel_find_sharing(object,object); ++ ++object ++new_cfdata(void); +--- gcl-2.6.12.orig/h/ptable.h ++++ gcl-2.6.12/h/ptable.h +@@ -38,6 +38,8 @@ typedef struct node TABL[]; + struct string_address_table + { struct node *ptable; + unsigned int length; ++ struct node *local_ptable; ++ unsigned int local_length; + unsigned int alloc_length; + }; + +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -165,3 +165,27 @@ + (push (string-concatenate s l) nl)) + (setq *load-path* nl)) + nil) ++ ++(defun default-symtab nil (concatenate 'string *tmp-dir* "gcl_symtab")) ++ ++(defun gprof-output (symtab gmon) ++ (with-open-file ++ (s (format nil "|gprof -S '~a' '~a' '~a'" symtab (kcl-self) gmon)) ++ (copy-stream s *standard-output*))) ++ ++ ++(defun gprof-start (&optional (start 0 start-p) (end 0 end-p) (symtab (default-symtab))) ++ (unless end-p ++ (multiple-value-bind ++ (s e) ++ (gprof-addresses) ++ (setq start (if start-p start s) end e))) ++ (when (monstartup start end) ++ (write-symtab symtab start end))) ++ ++(defun gprof-quit (&optional (symtab (default-symtab)) &aux (gmon (mcleanup))) ++ (when gmon ++ (gprof-output symtab gmon))) ++ ++ ++ +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -1177,24 +1177,6 @@ init_tm(enum type t, char *name, int els + call is too fragile. 20050115 CM*/ + static int gcl_alloc_initialized; + +- +-#ifdef GCL_GPROF +-static unsigned long textstart,textend,textpage; +-static void init_textpage() { +- +- extern void *GCL_GPROF_START; +- unsigned long s=(unsigned long)GCL_GPROF_START; +- +- textstart=(unsigned long)&GCL_GPROF_START; +- textend=(unsigned long)&etext; +- if (stextend || s>textstart)) +- textstart=s; +- +- textpage=2*(textend-textstart)/PAGESIZE; +- +-} +-#endif +- + object malloc_list=Cnil; + + #include +@@ -1220,10 +1202,6 @@ gcl_init_alloc(void *cs_start) { + init_darwin_zone_compat (); + #endif + +-#ifdef GCL_GPROF +- init_textpage(); +-#endif +- + #if defined(BSD) && defined(RLIMIT_STACK) + { + struct rlimit rl; +@@ -1301,11 +1279,6 @@ gcl_init_alloc(void *cs_start) { + initial_sbrk=data_start=heap_end; + first_data_page=page(data_start); + +-/* #ifdef GCL_GPROF */ +-/* if (new_holepage>PAGEWIDTH)); + } + +- +-#ifdef GCL_GPROF +- +-static unsigned long start,end,gprof_on; +-static void *initial_monstartup_pointer; +- +-void +-gprof_cleanup(void) { +- +- extern void _mcleanup(void); +- +- if (initial_monstartup_pointer) { +- _mcleanup(); +- gprof_on=0; +- } +- +- if (gprof_on) { +- +- char b[PATH_MAX],b1[PATH_MAX]; +- +- if (!getcwd(b,sizeof(b))) +- FEerror("Cannot get working directory", 0); +- if (chdir(P_tmpdir)) +- FEerror("Cannot change directory to tmpdir", 0); +- _mcleanup(); +- if (snprintf(b1,sizeof(b1),"gmon.out.%u",getpid())<=0) +- FEerror("Cannot write temporary gmon filename", 0); +- if (rename("gmon.out",b1)) +- FEerror("Cannot rename gmon.out",0); +- if (chdir(b)) +- FEerror("Cannot restore working directory", 0); +- gprof_on=0; +- +- } +- +-} +- +-static inline int +-my_monstartup(unsigned long start,unsigned long end) { +- +- extern void monstartup(unsigned long,unsigned long); +- +- monstartup(start,end); +- +- return 0; +- +-} +- +-DEFUN_NEW("GPROF-START",object,fSgprof_start,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { +- +- extern void *GCL_GPROF_START; +- static int n; +- +- if (!gprof_on) { +- start=start ? start : textstart; +- end=end ? end : textend; +- writable_malloc_wrap(my_monstartup,int,start,end); +- gprof_on=1; +- if (!n && atexit(gprof_cleanup)) { +- FEerror("Cannot setup gprof_cleanup on exit", 0); +- n=1; +- } +- } +- +- return Cnil; +- +-} +- +-DEFUN_NEW("GPROF-SET",object,fSgprof_set,SI +- ,2,2,NONE,OI,IO,OO,OO,(fixnum dstart,fixnum dend),"") +-{ +- +- start=dstart; +- end=dend; +- +- return Cnil; +- +-} +- +-DEFUN_NEW("GPROF-QUIT",object,fSgprof_quit,SI +- ,0,0,NONE,OO,OO,OO,OO,(void),"") +-{ +- extern void _mcleanup(void); +- char b[PATH_MAX],b1[PATH_MAX]; +- FILE *pp; +- unsigned n; +- +- if (!gprof_on) +- return Cnil; +- +- massert(getcwd(b,sizeof(b))); +- massert(!chdir(P_tmpdir)); +- _mcleanup(); +- massert(snprintf(b1,sizeof(b1),"gprof '%s'",kcl_self)>0); +- massert((pp=popen(b1,"r"))); +- while ((n=fread(b1,1,sizeof(b1),pp))) +- massert(fwrite(b1,1,n,stdout)); +- massert(pclose(pp)>=0); +- massert(!chdir(b)); +- gprof_on=0; +- +- return Cnil; +- +-} +- +-#endif +- + DEFUN_NEW("SET-STARTING-HOLE-DIVISOR",object,fSset_starting_hole_divisor,SI,1,1,NONE,II,OO,OO,OO,(fixnum div),"") { + if (div>0 && div <100) + starting_hole_div=div; +@@ -1808,20 +1670,7 @@ malloc_internal(size_t size) { + void * + malloc(size_t size) { + +- void *v=malloc_internal(size);; +- +- /* FIXME: this is just to handle clean freeing of the +- monstartup memory allocated automatically on raw image +- startup. In saved images, monstartup memory is only +- allocated with gprof-start. 20040804 CM*/ +-#ifdef GCL_GPROF +- if (raw_image && size>(textend-textstart) && !initial_monstartup_pointer) { +- massert(!atexit(gprof_cleanup)); +- initial_monstartup_pointer=v; +- } +-#endif +- +- return v; ++ return malloc_internal(size); + + } + +@@ -1830,7 +1679,6 @@ void + free(void *ptr) { + + object *p,pp; +- static void *initial_monstartup_pointer_echo; + + if (ptr == 0) + return; +@@ -1839,15 +1687,9 @@ free(void *ptr) { + if ((pp)->c.c_car->st.st_self == ptr) { + (pp)->c.c_car->st.st_self = NULL; + *p = pp->c.c_cdr; +-#ifdef GCL_GPROF +- if (initial_monstartup_pointer==ptr) { +- initial_monstartup_pointer_echo=ptr; +- initial_monstartup_pointer=NULL; +- } +-#endif + return; + } +- if (ptr!=initial_monstartup_pointer_echo) { ++ { + static void *old_ptr; + if (old_ptr==ptr) return; + old_ptr=ptr; +@@ -1855,7 +1697,6 @@ free(void *ptr) { + FEerror("free(3) error.",0); + #endif + } +- initial_monstartup_pointer_echo=NULL; + return; + } + +--- gcl-2.6.12.orig/o/cmpaux.c ++++ gcl-2.6.12/o/cmpaux.c +@@ -393,6 +393,15 @@ call_init(int init_address, object memor + + */ + ++DEFUN_NEW("MARK-MEMORY-AS-PROFILING",object,fSmark_memory_as_profiling,SI,0,0, ++ NONE,OO,OO,OO,OO,(void),"") { ++ ++ sSPmemory->s.s_dbind->cfd.cfd_prof=1; ++ ++ return Cnil; ++ ++} ++ + void + do_init(object *statVV) + {object fasl_vec=sSPinit->s.s_dbind; +@@ -467,6 +476,22 @@ char *s; + + #endif + ++object ++new_cfdata(void) { ++ ++ object memory=alloc_object(t_cfdata); ++ ++ memory->cfd.cfd_size=0; ++ memory->cfd.cfd_fillp=0; ++ memory->cfd.cfd_prof=0; ++ memory->cfd.cfd_self=0; ++ memory->cfd.cfd_start=0; ++ ++ return memory; ++ ++} ++ ++ + void + gcl_init_or_load1(void (*fn)(void),const char *file) { + +@@ -476,10 +501,7 @@ gcl_init_or_load1(void (*fn)(void),const + object fasl_data; + file=FIX_PATH_STRING(file); + +- memory=alloc_object(t_cfdata); +- memory->cfd.cfd_self=0; +- memory->cfd.cfd_fillp=0; +- memory->cfd.cfd_size = 0; ++ memory=new_cfdata(); + memory->cfd.cfd_start= (char *)fn; + printf("Initializing %s\n",file); fflush(stdout); + fasl_data = read_fasl_data(file); +--- gcl-2.6.12.orig/o/fasldlsym.c ++++ gcl-2.6.12/o/fasldlsym.c +@@ -101,10 +101,7 @@ fasload(object faslfile) { + SEEK_TO_END_OFILE(faslstream->sm.sm_fp); + + data = read_fasl_vector(faslstream); +- memory = alloc_object(t_cfdata); +- memory->cfd.cfd_self = NULL; +- memory->cfd.cfd_start = NULL; +- memory->cfd.cfd_size = 0; ++ memory=new_cfdata(); + + if(symbol_value(sLAload_verboseA)!=Cnil) + printf(" start address (dynamic) %p ",fptr); +--- /dev/null ++++ gcl-2.6.12/o/gprof.c +@@ -0,0 +1,137 @@ ++#include "include.h" ++#include "page.h" ++#include "ptable.h" ++ ++ ++static unsigned long gprof_on; ++ ++DEFUN_NEW("MCLEANUP",object,fSmcleanup,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { ++ ++ extern void _mcleanup(void); ++ ++ if (!gprof_on) ++ return Cnil; ++ ++ massert(getcwd(FN1,sizeof(FN1))); ++ massert(!chdir(P_tmpdir)); ++ _mcleanup(); ++ massert(!chdir(FN1)); ++ gprof_on=0; ++ massert(snprintf(FN1,sizeof(FN1),"%s/gmon.out",P_tmpdir)>0); ++ return make_simple_string(FN1); ++} ++ ++static inline int ++my_monstartup(unsigned long start,unsigned long end) { ++ ++ extern void monstartup(unsigned long,unsigned long); ++ ++ monstartup(start,end); ++ ++ return 0; ++ ++} ++ ++DEFUN_NEW("MONSTARTUP",object,fSmonstartup,SI,2,2,NONE,OI,IO,OO,OO,(ufixnum start,ufixnum end),"") { ++ ++ if (gprof_on) ++ return Cnil; ++ ++ writable_malloc_wrap(my_monstartup,int,start,end); ++ gprof_on=1; ++ ++ return Ct; ++ ++} ++ ++void ++gprof_cleanup(void) { ++ ++ FFN(fSmcleanup)(); ++ /*rename gmon?*/ ++ ++} ++ ++DEFUNM_NEW("GPROF-ADDRESSES",object,fSgprof_addresses,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { ++ ++ void *min=heap_end,*max=data_start,*c; ++ static void *mintext; ++ struct pageinfo *v; ++ object x; ++ fixnum i; ++ struct typemanager *tm=tm_of(t_cfdata); ++ ++ for (v=cell_list_head;v;v=v->next) ++ if (v->type==tm->tm_type) ++ for (c=pagetochar(page(v)),i=0;itm_nppage;i++,c+=tm->tm_size) ++ if (!is_free((x=c)) && type_of(x)==t_cfdata && x->cfd.cfd_prof) { ++ min=(void *)x->cfd.cfd_startcfd.cfd_start : min; ++ max=(void *)x->cfd.cfd_start+x->cfd.cfd_size>max ? x->cfd.cfd_start+x->cfd.cfd_size : max; ++ } ++ ++ if (maxp_link) ++ for (i=0,b=p->p_internal,be=b+p->p_internal_size;b; ++ b=i ? NULL : p->p_external,be=b+p->p_external_size,i=1) ++ for (;bc.c_cdr) ++ if ((f=(s=l->c.c_car)->s.s_gfdef)!=OBJNULL && s->s.s_hpack==(object)p) ++ switch(type_of(f)) { ++ case t_cfun:case t_sfun:case t_vfun:case t_afun:case t_gfun: ++ if ((ufixnum)f->cf.cf_self>=start && (ufixnum)f->cf.cf_selfcf.cf_self, ++ p->p_name->st.st_fillp,p->p_name->st.st_self, ++ s->st.st_fillp,s->st.st_self); ++ break; ++ } ++ fprintf(pp,"%016lx T GCL_MONEND\n",end); ++ ++ for (i=0;icfd.cfd_self = 0; +- memory->cfd.cfd_start = 0; +- memory->cfd.cfd_size = datasize+textsize+bsssize + extra_bss; +- vs_push(memory); +- the_start=start_address= +- memory->cfd.cfd_start = +- alloc_contblock(memory->cfd.cfd_size); +- sfaslp->s_start_data = start_address + textsize; +- sfaslp->s_start_bss = start_address + textsize + datasize; +- END_NO_INTERRUPT; ++ memory=new_cfdata(); ++ memory->cfd.cfd_size = datasize+textsize+bsssize + extra_bss; ++ vs_push(memory); ++ the_start=start_address= ++ memory->cfd.cfd_start= ++ alloc_contblock(memory->cfd.cfd_size); ++ sfaslp->s_start_data = start_address + textsize; ++ sfaslp->s_start_bss = start_address + textsize + datasize; ++ END_NO_INTERRUPT; + } + #else + the_start = start_address +--- gcl-2.6.12.orig/o/sfaslbfd.c ++++ gcl-2.6.12/o/sfaslbfd.c +@@ -269,9 +269,7 @@ fasload(object faslfile) { + curr_size=(unsigned long)current; + max_align=1<cfd.cfd_self = 0; +- memory->cfd.cfd_start = 0; ++ memory=new_cfdata(); + memory->cfd.cfd_size = curr_size + (max_align > sizeof(char *) ? max_align :0); + + memory->cfd.cfd_start=alloc_contblock(memory->cfd.cfd_size); +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -207,10 +207,8 @@ load_memory(struct scnhdr *sec1,struct s + if (ALLOC_SEC(sec)) + sec->s_paddr=sz; + +- memory = alloc_object(t_cfdata); ++ memory=new_cfdata(); + memory->cfd.cfd_size=sz; +- memory->cfd.cfd_self=0; +- memory->cfd.cfd_start=0; + memory->cfd.cfd_start=alloc_code_space(sz); + + for (sec=sec1;secn_sclass!=2 || sym->n_scnum<1) ++ if (sym->n_sclass<2 || sym->n_sclass>3 || sym->n_scnum<1) + continue; + + ns++; +@@ -270,7 +268,7 @@ load_self_symbols() { + + } + +- c_table.alloc_length=c_table.length=ns; ++ c_table.alloc_length=ns; + assert(c_table.ptable=malloc(sizeof(*c_table.ptable)*c_table.alloc_length)); + assert(st=malloc(sl)); + +@@ -296,9 +294,36 @@ load_self_symbols() { + sym+=sym->n_numaux; + + } +- ++ c_table.length=a-c_table.ptable; + qsort(c_table.ptable,c_table.length,sizeof(*c_table.ptable),node_compare); + ++ for (c_table.local_ptable=a,sym=sy1;symn_sclass!=3 || sym->n_scnum<1) ++ continue; ++ ++ NM(sym,st1,s,strcpy(st,s)); ++ ++ sec=sec1+sym->n_scnum-1; ++ jj=sym->n_value+sec->s_vaddr+h->h_ibase; ++ ++#ifdef FIX_ADDRESS ++ FIX_ADDRESS(jj); ++#endif ++ ++ a->address=jj; ++ a->string=st; ++ ++ a++; ++ st+=strlen(st)+1; ++ sym+=sym->n_numaux; ++ ++ } ++ c_table.local_length=a-c_table.local_ptable; ++ qsort(c_table.local_ptable,c_table.local_length,sizeof(*c_table.local_ptable),node_compare); ++ ++ massert(c_table.alloc_length==c_table.length+c_table.local_length); ++ + massert(!un_mmap(v1,ve)); + massert(!fclose(f)); + +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -55,9 +55,12 @@ License for more details. + #define ulmax(a_,b_) ({ul _a=a_,_b=b_;_a<_b ? _b : _a;}) + #define ALLOC_SEC(sec) (sec->sh_flags&SHF_ALLOC && (sec->sh_type==SHT_PROGBITS || sec->sh_type==SHT_NOBITS)) + #define LOAD_SEC(sec) (sec->sh_flags&SHF_ALLOC && sec->sh_type==SHT_PROGBITS) +-#define LOAD_SYM_BY_BIND(sym) ({ul _b=ELF_ST_BIND(sym->st_info); sym->st_value && (_b==STB_GLOBAL || _b==STB_WEAK);}) +-#define LOAD_SYM_BY_NAME(sym,st1) 0 +-#define LOAD_SYM(sym,st1) (LOAD_SYM_BY_BIND(sym)||LOAD_SYM_BY_NAME(sym,st1)) ++#define EXT_SYM(sym) ({ul _b=ELF_ST_BIND(sym->st_info); \ ++ sym->st_value && (_b==STB_GLOBAL || _b==STB_WEAK);}) ++#define LOCAL_SYM(sym) (sym->st_value && \ ++ ELF_ST_BIND(sym->st_info)==STB_LOCAL) ++ /* && ELF_ST_TYPE(sym->st_info)==STT_FUNC) */ ++#define LOAD_SYM(sym) (EXT_SYM(sym)||LOCAL_SYM(sym)) + + #define MASK(n) (~(~0ULL << (n))) + +@@ -271,10 +274,8 @@ load_memory(Shdr *sec1,Shdr *sece,void * + sz+=gsz; + } + +- memory=alloc_object(t_cfdata); ++ memory=new_cfdata(); + memory->cfd.cfd_size=sz; +- memory->cfd.cfd_self=0; +- memory->cfd.cfd_start=0; + memory->cfd.cfd_start=alloc_code_space(sz); + + a=(ul)memory->cfd.cfd_start; +@@ -411,7 +412,7 @@ calc_space(ul *ns,ul *sl,Sym *sym1,Sym * + + for (sym=sym1;symcfd.cfd_size=sz; +- memory->cfd.cfd_self=0; +- memory->cfd.cfd_start=0; + memory->cfd.cfd_start=alloc_code_space(sz); + + a=(ul)memory->cfd.cfd_start; +@@ -411,23 +409,19 @@ load_self_symbols() { + + if (sym->n_type & N_STAB) + continue; +- if (!(sym->n_type & N_EXT)) +- continue; + + ns++; + sl+=strlen(sym->n_un.n_strx+strtab)+1; + + } + +- c_table.alloc_length=c_table.length=ns; ++ c_table.alloc_length=ns; + assert(c_table.ptable=malloc(sizeof(*c_table.ptable)*c_table.alloc_length)); + assert(s=malloc(sl)); + + for (a=c_table.ptable,sym=sym1;symn_type & N_STAB) +- continue; +- if (!(sym->n_type & N_EXT)) ++ if (sym->n_type & N_STAB || !(sym->n_type & N_EXT)) + continue; + + a->address=sym->n_value; +@@ -438,9 +432,28 @@ load_self_symbols() { + s+=strlen(s)+1; + + } +- ++ c_table.length=a-c_table.ptable; + qsort(c_table.ptable,c_table.length,sizeof(*c_table.ptable),node_compare); + ++ c_table.local_ptable=a; ++ for (a=c_table.ptable,sym=sym1;symn_type & N_STAB || sym->n_type & N_EXT) ++ continue; ++ ++ a->address=sym->n_value; ++ a->string=s; ++ strcpy(s,sym->n_un.n_strx+strtab); ++ ++ a++; ++ s+=strlen(s)+1; ++ ++ } ++ c_table.local_length=a-c_table.local_ptable; ++ qsort(c_table.local_ptable,c_table.local_length,sizeof(*c_table.local_ptable),node_compare); ++ ++ massert(c_table.alloc_length==c_table.length+c_table.local_length); ++ + massert(!un_mmap(addr,addre)); + massert(!fclose(f)); + +--- gcl-2.6.12.orig/o/sfaslmacosx.c ++++ gcl-2.6.12/o/sfaslmacosx.c +@@ -232,10 +232,7 @@ int fasload (object faslfile) + + close_stream (faslstream); + +- memory = alloc_object (t_cfdata); +- memory->cfd.cfd_self = NULL; +- memory->cfd.cfd_start = NULL; +- memory->cfd.cfd_size = 0; ++ memory=new_cfdata(); + + if (symbol_value (sLAload_verboseA) != Cnil) + printf (" start address (dynamic) %p ", fptr); +--- gcl-2.6.12.orig/o/unixfasl.c ++++ gcl-2.6.12/o/unixfasl.c +@@ -146,9 +146,7 @@ object faslfile; + fread(&header, sizeof(header), 1, fp); + #endif + +- memory = alloc_object(t_cfdata); +- memory->cfd.cfd_self = NULL; +- memory->cfd.cfd_start = NULL; ++ memory=new_cfdata(); + memory->cfd.cfd_size = textsize + datasize + bsssize; + vs_push(memory); + /* If the file is smaller than the space asked for, typically the file +@@ -314,12 +312,10 @@ DEFUN_NEW("FASLINK-INT",object,fSfaslink + setbuf(fp, buf); + fread(&header, sizeof(header), 1, fp); + {BEGIN_NO_INTERRUPT; +- memory = alloc_object(t_cfdata); +- memory->cfd.cfd_self=0; +- memory->cfd.cfd_start = NULL; +- memory->cfd.cfd_size = textsize + datasize + bsssize; +- vs_push(memory); +- memory->cfd.cfd_start = ALLOC_ALIGNED(alloc_contblock, ++ memory=new_cfdata(); ++ memory->cfd.cfd_size = textsize + datasize + bsssize; ++ vs_push(memory); ++ memory->cfd.cfd_start = ALLOC_ALIGNED(alloc_contblock, + memory->cfd.cfd_size, + sizeof(double)); + END_NO_INTERRUPT;} +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -69,28 +69,26 @@ $(LSPDIR)/auto_new.lsp: $(LSPDIR)/auto.l + [ "$(RL_OBJS)" = "" ] || \ + echo "(AUTOLOAD 'init-readline '|readline|)" >>$@ + +-sys_init.lsp: sys_init.lsp.in ++saved_%:raw_% $(RSYM) sys_init.lsp.in raw_%_map msys \ ++ $(CMPDIR)/gcl_cmpmain.lsp \ ++ $(CMPDIR)/gcl_lfun_list.lsp \ ++ $(CMPDIR)/gcl_cmpopt.lsp $(HDIR)/cmpinclude.h \ ++ $(LSPDIR)/gcl_auto_new.lsp + +- cat $< | sed \ ++ cat sys_init.lsp.in | sed \ + -e "s#@LI-VERS@#(`cat ../majvers`.`cat ../minvers`) `cat ../release`#1" \ + -e "s#@LI-EXTVERS@#`cat ../minvers | cut -f2 -d.`#1" \ + -e "s#@LI-MINVERS@#`cat ../minvers | cut -f1 -d.`#1" \ + -e "s#@LI-MAJVERS@#`cat ../majvers`#1" \ + -e "s#@LI-RELEASE@#`cat ../release`#1" \ +- -e "s#@LI-CC@#\"$(GCL_CC) -c $(FINAL_CFLAGS)\"#1" \ ++ -e "s#@LI-CC@#\"$(GCL_CC) -c $(filter-out -pg,$(FINAL_CFLAGS))\"#1" \ ++ -e "s#@LI-DFP@#\"$(filter -pg,$(FINAL_CFLAGS))\"#1" \ + -e "s#@LI-LD@#\"$(GCL_CC) $(LD_FLAGS) -o \"#1" \ +- -e "s#@LI-LD-LIBS@#\" $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST)\"#1" \ ++ -e "s#@LI-LD-LIBS@#\" $(LD_LIBS_POST)\"#1" \ + -e "s#@LI-OPT-THREE@#\"$(O3FLAGS)\"#1" \ + -e "s#@LI-OPT-TWO@#\"$(O2FLAGS)\"#1" \ +- -e "s#@LI-INIT-LSP@#\"$@\"#1" >$@ +- +-saved_%:raw_% $(RSYM) sys_init.lsp raw_%_map msys \ +- $(CMPDIR)/gcl_cmpmain.lsp \ +- $(CMPDIR)/gcl_lfun_list.lsp \ +- $(CMPDIR)/gcl_cmpopt.lsp $(HDIR)/cmpinclude.h \ +- $(LSPDIR)/gcl_auto_new.lsp ++ -e "s#@LI-INIT-LSP@#\"$@\"#1" >foo + +- cp sys_init.lsp foo + echo "(unless si::*quit-tags* (in-package \"USER\")(system:save-system \"$@\"))" >>foo + j=$$(ar t lib$*.a |grep ^gcl_);[ "$$j" = "" ] || ar x lib$*.a $$j #accelerator + $(PORTDIR)/raw_$*$(EXE) $(PORTDIR)/ -libdir $(GCLDIR)/ < foo +@@ -160,7 +158,7 @@ map_%: + clean: + rm -rf saved_*$(EXE) raw_*$(EXE) *.o core a.out $(RSYM) \ + $(LSPDIR)/auto_new.lsp foo *maxima* init_*.lsp lib*.a gmp* bfd* *.lsp.tmp \ +- gazonk*.lsp plt*h *_map saved_* lib* raw_* msys out* log* tmp* gcl.script sys_init.lsp ++ gazonk*.lsp plt*h *_map saved_* lib* raw_* msys out* log* tmp* gcl.script + + .INTERMEDIATE: init_ansi_gcl.lsp.tmp init_gcl.lsp.tmp raw_gcl raw_ansi_gcl + .PRECIOUS: init_pre_gcl.lsp init_gcl.lsp init_ansi_gcl.lsp +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -59,8 +59,10 @@ + + (in-package :compiler) + (setq *cc* @LI-CC@ ++ *default-prof-p* (> (length @LI-DFP@) 0) + *ld* @LI-LD@ + *ld-libs* @LI-LD-LIBS@ ++ *ld-libs* (concatenate 'string "-l" #+ansi-cl "ansi_" "gcl " *ld-libs*) + *opt-three* @LI-OPT-THREE@ + *opt-two* @LI-OPT-TWO@ + *init-lsp* @LI-INIT-LSP@) diff --git a/debian/patches/list_order.18 b/debian/patches/list_order.18 new file mode 100644 index 0000000..8528b67 --- /dev/null +++ b/debian/patches/list_order.18 @@ -0,0 +1,60 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-60) unstable; urgency=medium + . + * list_order.17 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-01-23 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -483,6 +483,12 @@ Cannot compile ~a.~%" + + (defvar *use-buggy* nil) + ++(defun remove-flag (flag flags) ++ (let ((i (search flag flags))) ++ (if i ++ (concatenate 'string (subseq flags 0 i) (remove-flag flag (subseq flags (+ i (length flag))))) ++ flags))) ++ + (defun compiler-command (&rest args &aux na ) + (declare (special *c-debug*)) + (let ((dirlist (pathname-directory (first args))) +@@ -493,7 +499,7 @@ Cannot compile ~a.~%" + (setq na (namestring + (make-pathname :name name :type (pathname-type(first args))))) + (format nil "~a ~a -I~a ~a ~a -c ~a -o ~a ~a" +- *cc* ++ (if *prof-p* (remove-flag "-fomit-frame-pointer" *cc*) *cc*) + (if *prof-p* " -pg " "") + (concatenate 'string si::*system-directory* "../h") + (if (and (boundp '*c-debug*) *c-debug*) " -g " "") +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -34,7 +34,7 @@ boot.o: boot.c $(DECL) boot.h + $(CC) -c $(CFLAGS) $(DEFS) -fPIC $*.c $(AUX_INFO) + + gprof.o: gprof.c $(DECL) +- $(CC) -c $(CFLAGS) $(DEFS) -pg $*.c $(AUX_INFO) ++ $(CC) -c $(filter-out -fomit-frame-pointer,$(CFLAGS)) $(DEFS) -pg $*.c $(AUX_INFO) + + prelink.o: prelink.c $(DECL) + $(CC) -c $(filter-out -pg,$(CFLAGS)) -fPIE $(DEFS) $*.c $(AUX_INFO) diff --git a/debian/patches/list_order.19 b/debian/patches/list_order.19 new file mode 100644 index 0000000..2c82b59 --- /dev/null +++ b/debian/patches/list_order.19 @@ -0,0 +1,218 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-60) unstable; urgency=medium + . + * list_order.18 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-01-24 + +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -166,24 +166,45 @@ + (setq *load-path* nl)) + nil) + +-(defun default-symtab nil (concatenate 'string *tmp-dir* "gcl_symtab")) +- + (defun gprof-output (symtab gmon) + (with-open-file + (s (format nil "|gprof -S '~a' '~a' '~a'" symtab (kcl-self) gmon)) + (copy-stream s *standard-output*))) + ++(defun write-symtab (symtab start end &aux (*package* (find-package "KEYWORD"))) ++ ++ (with-open-file ++ (s symtab :direction :output :if-exists :supersede) ++ ++ (format s "~16,'0x T ~a~%" start "GCL_MONSTART") + +-(defun gprof-start (&optional (start 0 start-p) (end 0 end-p) (symtab (default-symtab))) +- (unless end-p +- (multiple-value-bind +- (s e) +- (gprof-addresses) +- (setq start (if start-p start s) end e))) +- (when (monstartup start end) +- (write-symtab symtab start end))) ++ (dolist (p (list-all-packages)) ++ (do-symbols (x p) ++ (when (and (eq (symbol-package x) p) (fboundp x)) ++ (let* ((y (symbol-function x)) ++ (y (if (and (consp y) (eq 'macro (car y))) (cdr y) y)) ++ (y (if (compiled-function-p y) (function-start y) 0))) ++ (when (<= start y end) ++ (format s "~16,'0x T ~s~%" y x)))))) ++ ++ (let ((string-register "")) ++ (dotimes (i (ptable-alloc-length)) ++ (multiple-value-bind ++ (x y) (ptable i string-register) ++ (when (<= start x end) ++ (format s "~16,'0x T ~a~%" x y))))) ++ ++ (format s "~16,'0x T ~a~%" end "GCL_MONEND")) ++ ++ symtab) ++ ++(defun gprof-start (&optional (symtab "gcl_symtab") (adrs (gprof-addresses)) ++ &aux (start (car adrs))(end (cdr adrs))) ++ (let ((symtab (write-symtab symtab start end))) ++ (when (monstartup start end) ++ symtab))) + +-(defun gprof-quit (&optional (symtab (default-symtab)) &aux (gmon (mcleanup))) ++(defun gprof-quit (&optional (symtab "gcl_symtab") &aux (gmon (mcleanup))) + (when gmon + (gprof-output symtab gmon))) + +--- gcl-2.6.12.orig/o/fat_string.c ++++ gcl-2.6.12/o/fat_string.c +@@ -59,17 +59,16 @@ DEFUN_NEW("PROFILE",object,fSprofile,SI + } + + #endif +-DEFUN_NEW("FUNCTION-START",object,fSfunction_start,SI +- ,1,1,NONE,OO,OO,OO,OO,(object funobj),"") +-{/* 1 args */ +- if(type_of(funobj)!=t_cfun +- && type_of(funobj)!=t_sfun +- && type_of(funobj)!=t_vfun +- && type_of(funobj)!=t_afun +- && type_of(funobj)!=t_gfun) +- FEerror("not compiled function",0); +- funobj=make_fixnum((long) (funobj->cf.cf_self)); +- RETURN1(funobj); ++DEFUN_NEW("FUNCTION-START",object,fSfunction_start,SI,1,1,NONE,OO,OO,OO,OO,(object funobj),"") { ++ ++ switch (type_of(funobj)) { ++ case t_cfun:case t_sfun:case t_vfun:case t_afun:case t_gfun:case t_closure:case t_cclosure: ++ return make_fixnum((long) (funobj->cf.cf_self)); ++ default: ++ TYPE_ERROR(funobj,sLcompiled_function); ++ return Cnil; ++ } ++ + } + + /* begin fasl stuff*/ +--- gcl-2.6.12.orig/o/gprof.c ++++ gcl-2.6.12/o/gprof.c +@@ -12,13 +12,11 @@ DEFUN_NEW("MCLEANUP",object,fSmcleanup,S + if (!gprof_on) + return Cnil; + +- massert(getcwd(FN1,sizeof(FN1))); +- massert(!chdir(P_tmpdir)); +- _mcleanup(); +- massert(!chdir(FN1)); ++ massert((_mcleanup(),1)); + gprof_on=0; +- massert(snprintf(FN1,sizeof(FN1),"%s/gmon.out",P_tmpdir)>0); +- return make_simple_string(FN1); ++ ++ return make_simple_string("gmon.out"); ++ + } + + static inline int +@@ -48,11 +46,10 @@ void + gprof_cleanup(void) { + + FFN(fSmcleanup)(); +- /*rename gmon?*/ + + } + +-DEFUNM_NEW("GPROF-ADDRESSES",object,fSgprof_addresses,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { ++DEFUN_NEW("GPROF-ADDRESSES",object,fSgprof_addresses,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { + + void *min=heap_end,*max=data_start,*c; + static void *mintext; +@@ -77,10 +74,8 @@ DEFUNM_NEW("GPROF-ADDRESSES",object,fSgp + mintext=data_start; + + #ifdef GCL_GPROF +- for (i=0;ip_link) +- for (i=0,b=p->p_internal,be=b+p->p_internal_size;b; +- b=i ? NULL : p->p_external,be=b+p->p_external_size,i=1) +- for (;bc.c_cdr) +- if ((f=(s=l->c.c_car)->s.s_gfdef)!=OBJNULL && s->s.s_hpack==(object)p) +- switch(type_of(f)) { +- case t_cfun:case t_sfun:case t_vfun:case t_afun:case t_gfun: +- if ((ufixnum)f->cf.cf_self>=start && (ufixnum)f->cf.cf_selfcf.cf_self, +- p->p_name->st.st_fillp,p->p_name->st.st_self, +- s->st.st_fillp,s->st.st_self); +- break; +- } +- fprintf(pp,"%016lx T GCL_MONEND\n",end); +- +- for (i=0;ist.st_self=(void *)c_table.ptable[i].string; ++ s->st.st_fillp=s->st.st_dim=strlen(s->st.st_self); ++ RETURN2(make_fixnum(c_table.ptable[i].address),s); + } diff --git a/debian/patches/list_order.20 b/debian/patches/list_order.20 new file mode 100644 index 0000000..7e87bf0 --- /dev/null +++ b/debian/patches/list_order.20 @@ -0,0 +1,72 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-60) unstable; urgency=medium + . + * list_order.19 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-01-30 + +--- gcl-2.6.12.orig/h/elf64_ppcle_reloc_special.h ++++ gcl-2.6.12/h/elf64_ppcle_reloc_special.h +@@ -16,7 +16,7 @@ find_special_params(void *v,Shdr *sec1,S + Rela *r; + void *ve; + +- massert((sec=get_section(".rela.plt",sec1,sece,sn))); ++ massert((sec=get_section(".rela.dyn",sec1,sece,sn))); + + v+=sec->sh_offset; + ve=v+sec->sh_size; +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -401,9 +401,9 @@ char *tmp_alloc; + */ + + #define ALLOC_ALIGNED(f, size,align) \ +- (align <= sizeof(plong) ? (char *)((f)(size)) : \ +- (tmp_alloc = (char *)((f)(size+(size ?(align)-1 : 0)))+(align)-1 , \ +- (char *)(align * (((unsigned long)tmp_alloc)/align)))) ++ ({ufixnum _size=size,_align=align;_align <= sizeof(plong) ? (char *)((f)(_size)) : \ ++ (tmp_alloc = (char *)((f)(_size+(_size ?(_align)-1 : 0)))+(_align)-1 , \ ++ (char *)(_align * (((unsigned long)tmp_alloc)/_align)));}) + #define AR_ALLOC(f,n,type) (type *) \ + (ALLOC_ALIGNED(f,(n)*sizeof(type),sizeof(type))) + +--- gcl-2.6.12.orig/o/fat_string.c ++++ gcl-2.6.12/o/fat_string.c +@@ -47,13 +47,17 @@ DEFUN_NEW("PROFILE",object,fSprofile,SI + + object ar=sSAprofile_arrayA->s.s_dbind; + void *x; ++ fixnum a,s; + + if (type_of(ar)!=t_string) + FEerror("si:*Profile-array* not a string",0); + if( type_of(start_address)!=t_fixnum || type_of(scale)!=t_fixnum) + FEerror("Needs start address and scale as args",0); + +- x=!(fix(start_address)*fix(scale)) ? NULL : (void *) (ar->ust.ust_self); ++ massert((a=fix(start_address))>=0); ++ massert((s=fix(scale))>=0); ++ ++ x=a&&s ? (void *) (ar->ust.ust_self) : NULL; + profil(x, (ar->ust.ust_dim),fix(start_address),fix(scale) << 8); + RETURN1(start_address); + } diff --git a/debian/patches/list_order.21 b/debian/patches/list_order.21 new file mode 100644 index 0000000..a8fc153 --- /dev/null +++ b/debian/patches/list_order.21 @@ -0,0 +1,48 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-61) unstable; urgency=medium + . + * list_order.20 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-01-30 + +--- gcl-2.6.12.orig/h/alpha-linux.h ++++ gcl-2.6.12/h/alpha-linux.h +@@ -5,12 +5,14 @@ + + #undef MPROTECT_ACTION_FLAGS + #define MPROTECT_ACTION_FLAGS SA_RESTART|SA_SIGINFO +-#ifdef IN_GBC +-#include +-#define GET_FAULT_ADDR(sig,code,scp,addr) \ +- (char *)((struct ucontext *)scp )->uc_mcontext.sc_traparg_a0 +-#endif +-#define SGC ++/* #ifdef IN_GBC */ ++/* #include */ ++/* #define GET_FAULT_ADDR(sig,code,scp,addr) \ no longer working*/ ++/* (char *)((struct ucontext *)scp )->uc_mcontext.sc_traparg_a0 */ ++/*#define GET_FAULT_ADDR(sig,code,sv,a) ((siginfo_t *)code)->si_addr perhaps try this when get access*/ ++/* #endif */ ++/* #define SGC */ ++#undef SGC + + #define RELOC_H "elf64_alpha_reloc.h" + #define SPECIAL_RELOC_H "elf64_alpha_reloc_special.h" diff --git a/debian/patches/list_order.22 b/debian/patches/list_order.22 new file mode 100644 index 0000000..2648181 --- /dev/null +++ b/debian/patches/list_order.22 @@ -0,0 +1,62 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-61) unstable; urgency=medium + . + * list_order.21 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-02-01 + +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -55,12 +55,10 @@ License for more details. + #define ulmax(a_,b_) ({ul _a=a_,_b=b_;_a<_b ? _b : _a;}) + #define ALLOC_SEC(sec) (sec->sh_flags&SHF_ALLOC && (sec->sh_type==SHT_PROGBITS || sec->sh_type==SHT_NOBITS)) + #define LOAD_SEC(sec) (sec->sh_flags&SHF_ALLOC && sec->sh_type==SHT_PROGBITS) +-#define EXT_SYM(sym) ({ul _b=ELF_ST_BIND(sym->st_info); \ +- sym->st_value && (_b==STB_GLOBAL || _b==STB_WEAK);}) +-#define LOCAL_SYM(sym) (sym->st_value && \ +- ELF_ST_BIND(sym->st_info)==STB_LOCAL) +- /* && ELF_ST_TYPE(sym->st_info)==STT_FUNC) */ +-#define LOAD_SYM(sym) (EXT_SYM(sym)||LOCAL_SYM(sym)) ++#define LOAD_SYM(sym,st1) (sym->st_value && (EXT_SYM(sym,st1)||LOCAL_SYM(sym))) ++#define EXT_SYM(sym,st1) (ELF_ST_BIND(sym->st_info)==STB_GLOBAL||ELF_ST_BIND(sym->st_info)==STB_WEAK||LOAD_SYM_BY_NAME(sym,st1)) ++#define LOCAL_SYM(sym) ELF_ST_BIND(sym->st_info)==STB_LOCAL ++#define LOAD_SYM_BY_NAME(sym,st1) 0 + + #define MASK(n) (~(~0ULL << (n))) + +@@ -412,7 +410,7 @@ calc_space(ul *ns,ul *sl,Sym *sym1,Sym * + + for (sym=sym1;sym + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-62) unstable; urgency=medium + . + * list_order.22 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-02-01 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -658,7 +658,7 @@ Cannot compile ~a.~%" + (defun make-user-init (files outn) + + (let* ((c (pathname outn)) +- (c (merge-pathnames c (make-pathname :directory '(:current)))) ++ (c (merge-pathnames c (make-pathname :directory '(:relative)))) + (o (merge-pathnames (make-pathname :type "o") c)) + (c (merge-pathnames (make-pathname :type "c") c))) + +@@ -769,7 +769,7 @@ Cannot compile ~a.~%" + + (with-open-file (st (namestring map) :direction :output)) + (safe-system +- (let* ((par (namestring (make-pathname :directory '(:back)))) ++ (let* ((par (namestring (make-pathname :directory '(:relative :back)))) + (i (concatenate 'string " " par)) + (j (concatenate 'string " " si::*system-directory* par))) + (format nil "~a ~a ~a ~a -L~a ~a ~a ~a" +--- gcl-2.6.12.orig/gcl-tk/makefile ++++ gcl-2.6.12/gcl-tk/makefile +@@ -38,13 +38,13 @@ clean:: + rm -f ${GUIOS} $(OFILES) gcltkaux gcltksrv *.o */*.o demos/index.lsp *.fn demos/*.fn + + .c.o: +- $(GCLTKCC) -c $(CFLAGS1) ${ODIR_DEBUG} $*.c ++ $(GCLTKCC) -c $(filter-out -pg,$(CFLAGS1)) -fPIE ${ODIR_DEBUG} $*.c + + + # for some reason -lieee is on various linux systems in the list of requireds.. + + gcltkaux: $(GUIOS) +- $(LD_ORDINARY_CC) $(GUIOS) $(LDFLAGS) -o gcltkaux ${TK_LIB_SPEC} ${TCL_LIB_SPEC} ++ $(LD_ORDINARY_CC) $(GUIOS) $(filter-out %gcl.script,$(LDFLAGS)) -pie -o gcltkaux ${TK_LIB_SPEC} ${TCL_LIB_SPEC} + + gcltksrv: makefile + cat gcltksrv.in | sed -e "s!TK_LIBRARY=.*!TK_LIBRARY=${TK_LIBRARY}!g" \ +--- gcl-2.6.12.orig/h/386-gnu.h ++++ gcl-2.6.12/h/386-gnu.h +@@ -60,4 +60,4 @@ + + #define NEED_STACK_CHK_GUARD + +-#define DEFINED_REAL_MAXPAGE (1UL<<18) /*FIXME brk probe broken*/ ++#undef HAVE_D_TYPE /*FIXME defined, but not implemented in readdir*/ +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -307,8 +307,11 @@ DEFUN_NEW("D-TYPE-LIST",object,fSd_type_ + MMcons(make_fixnum(DT_UNKNOWN),make_keyword("UNKNOWN")) + ) + #else ++#undef DT_UNKNOWN + #define DT_UNKNOWN 0 ++#undef DT_REG + #define DT_REG 1 ++#undef DT_DIR + #define DT_DIR 2 + list(3, + MMcons(make_fixnum(DT_REG),make_keyword("FILE")), diff --git a/debian/patches/list_order.24 b/debian/patches/list_order.24 new file mode 100644 index 0000000..0433217 --- /dev/null +++ b/debian/patches/list_order.24 @@ -0,0 +1,44 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-63) unstable; urgency=medium + . + * list_order.23 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-02-04 + +--- gcl-2.6.12.orig/h/gmp_wrappers.h ++++ gcl-2.6.12/h/gmp_wrappers.h +@@ -148,6 +148,8 @@ MEM_GMP_CALL(1,gmp_ulint,mpz_popcount,0, + /*MEM_GMP_CALL(2,void *,mpz_realloc,mpz_t,mp_size_t)*/ + MEM_GMP_CALL(1,size_t,mpz_size,0,mpz_t) + MEM_GMP_CALL(2,size_t,mpz_sizeinbase,0,mpz_t,int) ++MEM_GMP_CALL(1,void,gmp_randinit_default,0,__gmp_randstate_struct *) ++MEM_GMP_CALL(2,void,gmp_randseed_ui,0,__gmp_randstate_struct *,unsigned long int) + + /* FIXME: find a way to have this follow the convention in gmp.h*/ + +@@ -191,5 +193,7 @@ MEM_GMP_CALL(2,size_t,mpz_sizeinbase,0,m + /*#define __gmpz_realloc m__gmpz_realloc*/ + #define __gmpz_size m__gmpz_size + #define __gmpz_sizeinbase m__gmpz_sizeinbase ++#define __gmp_randinit_default m__gmp_randinit_default ++#define __gmp_randseed_ui m__gmp_randseed_ui + + #endif /*GMP_WRAPPERS_H*/ diff --git a/debian/patches/list_order.25 b/debian/patches/list_order.25 new file mode 100644 index 0000000..ee4e2fb --- /dev/null +++ b/debian/patches/list_order.25 @@ -0,0 +1,81 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-64) unstable; urgency=medium + . + * list_order.24 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2018-02-22 + +--- gcl-2.6.12.orig/makefile ++++ gcl-2.6.12/makefile +@@ -149,7 +149,7 @@ command: + merge: + $(CC) -o merge merge.c + +-LISP_LIB=cmpnew/gcl_collectfn.o cmpnew/gcl_collectfn.lsp xgcl-2/sysdef.lisp xgcl-2/gcl_dwtest.lsp xgcl-2/gcl_dwtestcases.lsp lsp/gcl_gprof.lsp lsp/gcl_info.o lsp/gcl_profile.lsp lsp/gcl_export.lsp lsp/gcl_autoload.lsp cmpnew/gcl_cmpmain.lsp cmpnew/gcl_cmpopt.lsp cmpnew/gcl_lfun_list.lsp lsp/gcl_auto_new.lsp h/cmpinclude.h unixport/init_$(SYSTEM).lsp unixport/lib$(SYSTEM).a unixport/libgclp.a gcl-tk/tk-package.lsp $(TK_LISP_LIB) $(RL_LIB) $(FIRST_FILE) $(LAST_FILE) $(addsuffix /sys-proclaim.lisp,lsp cmpnew pcl clcs) unixport/gcl.script ++LISP_LIB=cmpnew/gcl_collectfn.o cmpnew/gcl_collectfn.lsp xgcl-2/sysdef.lisp xgcl-2/gcl_dwtest.lsp xgcl-2/gcl_dwtestcases.lsp lsp/gcl_gprof.lsp lsp/gcl_info.o lsp/gcl_profile.lsp lsp/gcl_export.lsp lsp/gcl_autoload.lsp cmpnew/gcl_cmpmain.lsp cmpnew/gcl_cmpopt.lsp cmpnew/gcl_lfun_list.lsp lsp/gcl_auto_new.lsp h/cmpinclude.h unixport/sys_init.lsp unixport/lib$(SYSTEM).a unixport/libgclp.a gcl-tk/tk-package.lsp $(TK_LISP_LIB) $(RL_LIB) $(FIRST_FILE) $(LAST_FILE) $(addsuffix /sys-proclaim.lisp,lsp cmpnew pcl clcs) unixport/gcl.script + + install-command: + rm -f $(DESTDIR)$(prefix)/bin/gcl +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -69,13 +69,9 @@ $(LSPDIR)/auto_new.lsp: $(LSPDIR)/auto.l + [ "$(RL_OBJS)" = "" ] || \ + echo "(AUTOLOAD 'init-readline '|readline|)" >>$@ + +-saved_%:raw_% $(RSYM) sys_init.lsp.in raw_%_map msys \ +- $(CMPDIR)/gcl_cmpmain.lsp \ +- $(CMPDIR)/gcl_lfun_list.lsp \ +- $(CMPDIR)/gcl_cmpopt.lsp $(HDIR)/cmpinclude.h \ +- $(LSPDIR)/gcl_auto_new.lsp ++sys_init.lsp: sys_init.lsp.in + +- cat sys_init.lsp.in | sed \ ++ cat $< | sed \ + -e "s#@LI-VERS@#(`cat ../majvers`.`cat ../minvers`) `cat ../release`#1" \ + -e "s#@LI-EXTVERS@#`cat ../minvers | cut -f2 -d.`#1" \ + -e "s#@LI-MINVERS@#`cat ../minvers | cut -f1 -d.`#1" \ +@@ -87,8 +83,16 @@ saved_%:raw_% $(RSYM) sys_init.lsp.in ra + -e "s#@LI-LD-LIBS@#\" $(LD_LIBS_POST)\"#1" \ + -e "s#@LI-OPT-THREE@#\"$(O3FLAGS)\"#1" \ + -e "s#@LI-OPT-TWO@#\"$(O2FLAGS)\"#1" \ +- -e "s#@LI-INIT-LSP@#\"$@\"#1" >foo ++ -e "s#@LI-INIT-LSP@#\"$@\"#1" >$@ ++ ++ ++saved_%:raw_% $(RSYM) sys_init.lsp raw_%_map msys \ ++ $(CMPDIR)/gcl_cmpmain.lsp \ ++ $(CMPDIR)/gcl_lfun_list.lsp \ ++ $(CMPDIR)/gcl_cmpopt.lsp $(HDIR)/cmpinclude.h \ ++ $(LSPDIR)/gcl_auto_new.lsp + ++ cp sys_init.lsp foo + echo "(unless si::*quit-tags* (in-package \"USER\")(system:save-system \"$@\"))" >>foo + j=$$(ar t lib$*.a |grep ^gcl_);[ "$$j" = "" ] || ar x lib$*.a $$j #accelerator + $(PORTDIR)/raw_$*$(EXE) $(PORTDIR)/ -libdir $(GCLDIR)/ < foo +@@ -156,7 +160,7 @@ map_%: + # $(CC) $(LD_FLAGS) -c -o $@ plt.c $(CFLAGS) -I$(HDIR) -I$(ODIR) + + clean: +- rm -rf saved_*$(EXE) raw_*$(EXE) *.o core a.out $(RSYM) \ ++ rm -rf saved_*$(EXE) raw_*$(EXE) *.o core a.out $(RSYM) sys_init.lsp \ + $(LSPDIR)/auto_new.lsp foo *maxima* init_*.lsp lib*.a gmp* bfd* *.lsp.tmp \ + gazonk*.lsp plt*h *_map saved_* lib* raw_* msys out* log* tmp* gcl.script + diff --git a/debian/patches/list_order.4 b/debian/patches/list_order.4 new file mode 100644 index 0000000..bebb20d --- /dev/null +++ b/debian/patches/list_order.4 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-57) unstable; urgency=medium + . + * list_order.13 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-09-18 + +--- gcl-2.6.12.orig/lsp/gcl_directory.lsp ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -62,7 +62,7 @@ + (when (pathname-match-p dir v) + (push (merge-pathnames (parse-namestring dir nil *default-pathname-defaults* :start pos) pexp nil) r))) + :file) +- (when (pathname-match-p dir v) (push pexp r)))) ++ (when (pathname-match-p dir v) (push (pathname (copy-seq (namestring pexp))) r)))) + (make-frame "")) + r) + diff --git a/debian/patches/list_order.5 b/debian/patches/list_order.5 new file mode 100644 index 0000000..c3f200f --- /dev/null +++ b/debian/patches/list_order.5 @@ -0,0 +1,205 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-48) unstable; urgency=medium + . + * list_order.1 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-06-08 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4188,6 +4188,7 @@ case $use in + mips*) + case $canonical in + mips64*linux*) ++# assert_arg_to_cflags -mxgot + assert_arg_to_ldflags -Wl,-z,now;; + esac + ;; +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -389,6 +389,7 @@ case $use in + mips*) + case $canonical in + mips64*linux*) ++# assert_arg_to_cflags -mxgot + assert_arg_to_ldflags -Wl,-z,now;; + esac + ;; +--- gcl-2.6.12.orig/h/elf64_mips_reloc.h ++++ gcl-2.6.12/h/elf64_mips_reloc.h +@@ -32,23 +32,14 @@ + if (s>=ggot && sr_addend=((void *)gote-(void *)got)-s; +- switch(tp) { +- case R_MIPS_GOT_HI16: +- case R_MIPS_CALL_HI16: +- r->r_info=((ul)R_MIPS_HI16<<56)|(r->r_info&MASK(32)); +- relocate(sym1,r,((Rela *)r)->r_addend,start,got,gote); +- break; +- case R_MIPS_GOT_LO16: +- case R_MIPS_CALL_LO16: +- r->r_info=((ul)R_MIPS_LO16<<56)|(r->r_info&MASK(32)); +- relocate(sym1,r,((Rela *)r)->r_addend,start,got,gote); +- break; +- default: +- store_val(where,MASK(16),((void *)gote-(void *)got)); +- break; +- } ++ *gote=s+(MIPS_HIGH(a)<<16); ++ a=(void *)gote-(void *)got; ++ if (tp==R_MIPS_GOT_HI16||tp==R_MIPS_CALL_HI16) ++ a=MIPS_HIGH(a); ++ else if (tp==R_MIPS_GOT_LO16||tp==R_MIPS_CALL_LO16) ++ a&=MASK(16); ++ massert(!(a&~MASK(16))); ++ store_val(where,MASK(16),a); + break; + case R_MIPS_GOT_OFST: + recurse(s+a); +@@ -63,8 +54,7 @@ + case R_MIPS_LO16: + recurse(s+a); + s+=a; +- a=*where&MASK(16); +- if (a&0x8000) a|=0xffffffffffff0000; ++ a=(short)*where; + a+=s&MASK(16); + a+=(a&0x8000)<<1; + store_val(where,MASK(16),a); +--- gcl-2.6.12.orig/h/elf64_mips_reloc_special.h ++++ gcl-2.6.12/h/elf64_mips_reloc_special.h +@@ -16,6 +16,7 @@ static ul ggot,ggote,la; static Rela *hr + + #undef ELF_R_TYPE + #define ELF_R_TYPE(a_) ELF_R_TYPE1(a_) ++#define MIPS_HIGH(a_) ({ul _a=(a_);(_a-(short)_a)>>16;}) + + typedef struct { + ul entry,gotoff; +@@ -98,12 +99,12 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + Sym *sym; + Shdr *sec; + void *v,*ve; +- ul q=0,a,b; ++ ul a,b; + + for (sym=sym1;symst_size=0; ++ sym->st_other=sym->st_size=0; + +- for (*gs=0,sec=sec1;secsh_type==SHT_RELA) + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) + if (ELF_R_TYPE(r->r_info)==R_MIPS_CALL16|| +@@ -116,24 +117,37 @@ label_got_symbols(void *v1,Shdr *sec1,Sh + + sym=sym1+ELF_R_SYM(r->r_info); + +- a=r->r_addend>>15; ++ /*unlikely to save got space by recording possible holes in addend range*/ ++ if ((a=MIPS_HIGH(r->r_addend)+1)>sym->st_other) ++ sym->st_other=a; ++ ++ } + +- if (2*a>=sizeof(sym->st_size) || !((sym->st_size>>(a*16))&0xffff)) { ++ for (*gs=0,sec=sec1;secsh_type==SHT_RELA) ++ for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_entsize,r=v) ++ if (ELF_R_TYPE(r->r_info)==R_MIPS_CALL16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_GOT_DISP|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_GOT_HI16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_GOT_LO16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_CALL_HI16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_CALL_LO16|| ++ ELF_R_TYPE(r->r_info)==R_MIPS_GOT_PAGE) { + +- q=++*gs; +- if (2*ast_size)) { +- massert(q<=0xffff); +- sym->st_size|=(q<<(a*16)); +- } +- +- massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); ++ sym=sym1+ELF_R_SYM(r->r_info); + ++ if (sym->st_other) { ++ sym->st_size=++*gs; ++ if (sym->st_other>1) ++ (*gs)+=sym->st_other-1; ++ else ++ massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); ++ sym->st_other=0; + } + + b=sizeof(r->r_addend)*4; + massert(!(r->r_addend>>b)); +- q=2*a>=sizeof(sym->st_size) ? q : (sym->st_size>>(a*16))&0xffff; +- r->r_addend|=(q<<=b); ++ r->r_addend|=((sym->st_size+MIPS_HIGH(r->r_addend))<s=0; + unlock_pool(); + +- f.l_type=F_UNLCK; +- massert(!fcntl(pool,F_SETLK,&f)); +- +- fprintf(stderr,"Initializing pool\n"); +- fflush(stderr); +- + } + + f.l_type=F_RDLCK; +- massert(!fcntl(pool,F_SETLK,&f)); ++ plp=&f; ++ massert(!set_lock()); ++ ++ plp=&pl; + + register_pool(1); + massert(!atexit(close_pool)); diff --git a/debian/patches/list_order.6 b/debian/patches/list_order.6 new file mode 100644 index 0000000..285f16e --- /dev/null +++ b/debian/patches/list_order.6 @@ -0,0 +1,103 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-49) unstable; urgency=medium + . + * list_order.5 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-06-13 + +--- gcl-2.6.12.orig/o/eval.c ++++ gcl-2.6.12/o/eval.c +@@ -96,18 +96,18 @@ quick_call_sfun(object fun) { + + } + +-/* only for sfun not gfun !! Does not check number of args */ +-static void +-call_sfun_no_check(object fun) +-{ DEBUG_AVMA +- int n; +- object *base=vs_base; +- n=vs_top - base; +- base[0]=c_apply_n_fun(fun,n,base); +- vs_top=(vs_base=base)+1; +- CHECK_AVMA; +- return; +-} ++/* /\* only for sfun not gfun !! Does not check number of args *\/ */ ++/* static void */ ++/* call_sfun_no_check(object fun) */ ++/* { DEBUG_AVMA */ ++/* int n; */ ++/* object *base=vs_base; */ ++/* n=vs_top - base; */ ++/* base[0]=c_apply_n_fun(fun,n,base); */ ++/* vs_top=(vs_base=base)+1; */ ++/* CHECK_AVMA; */ ++/* return; */ ++/* } */ + static void + call_vfun(object fun) + { DEBUG_AVMA +@@ -615,10 +615,11 @@ super_funcall_no_event(object fun) { + + switch(type_of(fun)) { + case t_cfun: +- (*fun->cf.cf_self)(); +- return; ++ (*fun->cf.cf_self)(); return; ++ case t_cclosure: ++ (*fun->cc.cc_self)(fun); return; + case t_sfun: +- call_sfun_no_check(fun); return; ++ /* call_sfun_no_check(fun); return; */ + case t_gfun: + quick_call_sfun(fun); return; + case t_vfun: +@@ -631,7 +632,7 @@ super_funcall_no_event(object fun) { + super_funcall_no_event(fun->s.s_gfdef); + return; + default: +- funcall_no_event(fun); ++ funcall(fun); + } + + } +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -1176,6 +1176,7 @@ Lsharp_left_parenthesis_reader() + goto L; + } + vs_base[0]=list(4,siScomma,sLapply,list(2,sLquote,sLvector),vs_base[2]); ++ vs_top=vs_base+1; + return; + } + vsp = vs_top; +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -369,7 +369,7 @@ memprotect_handler_test(int sig, long co + do_gcl_abort(); + } + memprotect_handler_invocations=1; +- if (faddr!=memprotect_test_address) ++ if (page(faddr)!=page(memprotect_test_address)) + memprotect_result=memprotect_bad_fault_address; + else + memprotect_result=memprotect_none; diff --git a/debian/patches/list_order.7 b/debian/patches/list_order.7 new file mode 100644 index 0000000..526b7ee --- /dev/null +++ b/debian/patches/list_order.7 @@ -0,0 +1,47 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-50) unstable; urgency=medium + . + * list_order.6 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-06-14 + +--- gcl-2.6.12.orig/h/m68k-linux.h ++++ gcl-2.6.12/h/m68k-linux.h +@@ -63,7 +63,7 @@ + + + #define M68K +-#define SGC ++/* #define SGC *//*FIXME: Unknown m68k cpu in modern emulators*/ + + #include + int cacheflush(void *,int,int,int); +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -871,7 +871,7 @@ sgc_quit(void) { + f=n; + n=OBJ_LINK(n); + } +- SET_LINK(f,OBJNULL); ++ SET_LINK(f,n!=OBJNULL ? n : o); + tm->tm_tail=f; + tm->tm_nfree += tm->tm_alt_nfree; + tm->tm_alt_nfree = 0; diff --git a/debian/patches/list_order.8 b/debian/patches/list_order.8 new file mode 100644 index 0000000..37103e2 --- /dev/null +++ b/debian/patches/list_order.8 @@ -0,0 +1,78 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-51) unstable; urgency=medium + . + * list_order.7 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-06-15 + +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -966,6 +966,11 @@ sweep_phase(void) { + STATIC object f; + STATIC struct pageinfo *v; + ++ for (j= t_start; j < t_contiguous ; j++) { ++ tm_of(j)->tm_free=OBJNULL; ++ tm_of(j)->tm_nfree=0; ++ } ++ + for (v=cell_list_head;v;v=v->next) { + + tm = tm_of((enum type)v->type); +@@ -975,22 +980,23 @@ sweep_phase(void) { + k = 0; + for (j = tm->tm_nppage; j > 0; --j, p += tm->tm_size) { + x = (object)p; +- if (is_free(x)) +- continue; +- else if (is_marked(x)) { ++ ++ if (is_marked(x)) { + unmark(x); + continue; + } + +- SET_LINK(f,x); + make_free(x); ++ SET_LINK(f,x); + f = x; + k++; ++ + } ++ + SET_LINK(f,OBJNULL); + tm->tm_tail = f; + tm->tm_nfree += k; +- pagetoinfo(page(v))->in_use-=k; ++ pagetoinfo(page(v))->in_use=tm->tm_nppage-k; + + } + +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -873,6 +873,7 @@ sgc_quit(void) { + } + SET_LINK(f,n!=OBJNULL ? n : o); + tm->tm_tail=f; ++ for (;OBJ_LINK(tm->tm_tail)!=OBJNULL;tm->tm_tail=OBJ_LINK(tm->tm_tail)); + tm->tm_nfree += tm->tm_alt_nfree; + tm->tm_alt_nfree = 0; + tm->tm_alt_free = OBJNULL; diff --git a/debian/patches/list_order.9 b/debian/patches/list_order.9 new file mode 100644 index 0000000..4cbf3b4 --- /dev/null +++ b/debian/patches/list_order.9 @@ -0,0 +1,146 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-52) unstable; urgency=medium + . + * list_order.8 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-06-18 + +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -959,7 +959,7 @@ mark_c_stack(jmp_buf env1, int n, void ( + static void + sweep_phase(void) { + +- STATIC long j, k; ++ STATIC long j, k, l; + STATIC object x; + STATIC char *p; + STATIC struct typemanager *tm; +@@ -977,26 +977,28 @@ sweep_phase(void) { + + p = pagetochar(page(v)); + f = FREELIST_TAIL(tm); +- k = 0; ++ l = k = 0; + for (j = tm->tm_nppage; j > 0; --j, p += tm->tm_size) { + x = (object)p; + + if (is_marked(x)) { + unmark(x); ++ l++; + continue; + } + ++ k++; ++ + make_free(x); + SET_LINK(f,x); + f = x; +- k++; + + } + + SET_LINK(f,OBJNULL); + tm->tm_tail = f; + tm->tm_nfree += k; +- pagetoinfo(page(v))->in_use=tm->tm_nppage-k; ++ pagetoinfo(page(v))->in_use=l; + + } + +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -152,7 +152,7 @@ sgc_mark_phase(void) { + + static void + sgc_sweep_phase(void) { +- STATIC long j, k; ++ STATIC long j, k, l; + STATIC object x; + STATIC char *p; + STATIC struct typemanager *tm; +@@ -160,13 +160,18 @@ sgc_sweep_phase(void) { + int size; + STATIC struct pageinfo *v; + ++ for (j= t_start; j < t_contiguous ; j++) { ++ tm_of(j)->tm_free=OBJNULL; ++ tm_of(j)->tm_nfree=0; ++ } ++ + for (v=cell_list_head;v;v=v->next) { + + tm = tm_of((enum type)v->type); + + p = pagetochar(page(v)); + f = FREELIST_TAIL(tm); +- k = 0; ++ l = k = 0; + size=tm->tm_size; + + if (v->sgc_flags&SGC_PAGE_FLAG) { +@@ -175,10 +180,9 @@ sgc_sweep_phase(void) { + + x = (object)p; + +- if (is_free(x)) +- continue; +- else if (is_marked(x)) { ++ if (is_marked(x)) { + unmark(x); ++ l++; + continue; + } + +@@ -187,26 +191,26 @@ sgc_sweep_phase(void) { + continue; + #endif + +- /* it is ok to free x */ +- +- SET_LINK(f,x); ++ k++; + make_free(x); ++ SET_LINK(f,x); ++ f = x; ++ + #ifndef SGC_WHOLE_PAGE + if (TYPEWORD_TYPE_P(v->type)) x->d.s = SGC_RECENT; + #endif +- f = x; +- k++; + + } ++ + SET_LINK(f,OBJNULL); + tm->tm_tail = f; + tm->tm_nfree += k; +- v->in_use-=k; ++ v->in_use=l; + + } else if (WRITABLE_PAGE_P(page(v))) /*non sgc_page */ + for (j = tm->tm_nppage; --j >= 0; p += size) { + x = (object)p; +- if (is_marked(x) && !is_free(x)) { ++ if (is_marked(x)) { + unmark(x); + } + } diff --git a/debian/patches/pathnames1.1 b/debian/patches/pathnames1.1 new file mode 100644 index 0000000..d4b661e --- /dev/null +++ b/debian/patches/pathnames1.1 @@ -0,0 +1,18763 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-38) unstable; urgency=medium + . + * Version_2_6_13pre50 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-11 + +--- gcl-2.6.12.orig/ansi-tests/ansi-aux.lsp ++++ gcl-2.6.12/ansi-tests/ansi-aux.lsp +@@ -80,6 +80,10 @@ Results: ~A~%" expected-number form n re + "Like EQUALP, but guaranteed to return T for true." + (apply #'values (mapcar #'notnot (multiple-value-list (equalp x y))))) + ++(defun equalpt-or-report (x y) ++ "Like EQUALPT, but return either T or a list of the arguments." ++ (or (equalpt x y) (list x y))) ++ + (defun =t (x &rest args) + "Like =, but guaranteed to return T for true." + (apply #'values (mapcar #'notnot (multiple-value-list (apply #'= x args))))) +@@ -223,6 +227,13 @@ Results: ~A~%" expected-number form n re + P x p1 x TYPE p2) + t))))) + ++(defun check-predicate (predicate &optional guard (universe *universe*)) ++ "Return all elements of UNIVERSE for which the guard (if present) is false ++ and for which PREDICATE is false." ++ (remove-if #'(lambda (e) (or (and guard (funcall guard e)) ++ (funcall predicate e))) ++ universe)) ++ + (declaim (special *catch-error-type*)) + + (defun catch-continue-debugger-hook (condition dbh) +@@ -296,7 +307,167 @@ the condition to go uncaught if it canno + (defmacro classify-error (form) + `(classify-error** ',form)) + ++(defun sequencep (x) (typep x 'sequence)) ++ + ;;; ++(defun typef (type) #'(lambda (x) (typep x type))) ++ ++(defmacro signals-error (form error-name &key (safety 3) (name nil name-p) (inline nil)) ++ `(handler-bind ++ ((warning #'(lambda (c) (declare (ignore c)) ++ (muffle-warning)))) ++ (proclaim '(optimize (safety 3))) ++ (handler-case ++ (apply #'values ++ nil ++ (multiple-value-list ++ ,(cond ++ (inline form) ++ (regression-test::*compile-tests* ++ `(funcall (compile nil '(lambda () ++ (declare (optimize (safety ,safety))) ++ ,form)))) ++ (t `(eval ',form))))) ++ (,error-name (c) ++ (cond ++ ,@(case error-name ++ (type-error ++ `(((typep (type-error-datum c) ++ (type-error-expected-type c)) ++ (values ++ nil ++ (list (list 'typep (list 'quote ++ (type-error-datum c)) ++ (list 'quote ++ (type-error-expected-type c))) ++ "==> true"))))) ++ ((undefined-function unbound-variable) ++ (and name-p ++ `(((not (eq (cell-error-name c) ',name)) ++ (values ++ nil ++ (list 'cell-error-name "==>" ++ (cell-error-name c))))))) ++ ((stream-error end-of-file reader-error) ++ `(((not (streamp (stream-error-stream c))) ++ (values ++ nil ++ (list 'stream-error-stream "==>" ++ (stream-error-stream c)))))) ++ (file-error ++ `(((not (pathnamep (pathname (file-error-pathname c)))) ++ (values ++ nil ++ (list 'file-error-pathname "==>" ++ (file-error-pathname c)))))) ++ (t nil)) ++ (t (printable-p c))))))) ++ ++(defmacro signals-error-always (form error-name) ++ `(values ++ (signals-error ,form ,error-name) ++ (signals-error ,form ,error-name :safety 0))) ++ ++(defmacro signals-type-error (var datum-form form &key (safety 3) (inline nil)) ++ (let ((lambda-form ++ `(lambda (,var) ++ (declare (optimize (safety ,safety))) ++ ,form))) ++ `(let ((,var ,datum-form)) ++ (declare (optimize safety)) ++ (handler-bind ++ ((warning #'(lambda (c) (declare (ignore c)) ++ (muffle-warning)))) ++ ; (proclaim '(optimize (safety 3))) ++ (handler-case ++ (apply #'values ++ nil ++ (multiple-value-list ++ (funcall ++ ,(cond ++ (inline `(function ,lambda-form)) ++ (regression-test::*compile-tests* ++ `(compile nil ',lambda-form)) ++ (t `(eval ',lambda-form))) ++ ,var))) ++ (type-error ++ (c) ++ (let ((datum (type-error-datum c)) ++ (expected-type (type-error-expected-type c))) ++ (cond ++ ((not (eql ,var datum)) ++ (list :datum-mismatch ,var datum)) ++ ((typep datum expected-type) ++ (list :is-typep datum expected-type)) ++ (t (printable-p c)))))))))) ++ ++(declaim (special *mini-universe*)) ++ ++(defun check-type-error* (pred-fn guard-fn &optional (universe *mini-universe*)) ++ "Check that for all elements in some set, either guard-fn is true or ++ pred-fn signals a type error." ++ (let (val) ++ (loop for e in universe ++ unless (or (funcall guard-fn e) ++ (equal ++ (setf val (multiple-value-list ++ (signals-type-error x e (funcall pred-fn x) :inline t))) ++ '(t))) ++ collect (list e val)))) ++ ++(defmacro check-type-error (&body args) ++ `(locally (declare (optimize safety)) (check-type-error* ,@args))) ++ ++(defun printable-p (obj) ++ "Returns T iff obj can be printed to a string." ++ (with-standard-io-syntax ++ (let ((*print-readably* nil) ++ (*print-escape* nil)) ++ (declare (optimize safety)) ++ (handler-case (and (stringp (write-to-string obj)) t) ++ (condition (c) (declare (ignore c)) nil))))) ++ ++(defun make-special-string (string &key fill adjust displace base) ++ (let* ((len (length string)) ++ (len2 (if fill (+ len 4) len)) ++ (etype (if base 'base-char 'character))) ++ (if displace ++ (let ((s0 (make-array (+ len2 5) ++ :initial-contents ++ (concatenate 'string ++ (make-string 2 :initial-element #\X) ++ string ++ (make-string (if fill 7 3) ++ :initial-element #\Y)) ++ :element-type etype))) ++ (make-array len2 :element-type etype ++ :adjustable adjust ++ :fill-pointer (if fill len nil) ++ :displaced-to s0 ++ :displaced-index-offset 2)) ++ (make-array len2 :element-type etype ++ :initial-contents ++ (if fill (concatenate 'string string "ZZZZ") string) ++ :fill-pointer (if fill len nil) ++ :adjustable adjust)))) ++ ++(defmacro do-special-strings ((var string-form &optional ret-form) &body forms) ++ (let ((string (gensym)) ++ (fill (gensym "FILL")) ++ (adjust (gensym "ADJUST")) ++ (base (gensym "BASE")) ++ (displace (gensym "DISPLACE"))) ++ `(let ((,string ,string-form)) ++ (dolist (,fill '(nil t) ,ret-form) ++ (dolist (,adjust '(nil t)) ++ (dolist (,base '(nil t)) ++ (dolist (,displace '(nil t)) ++ (let ((,var (make-special-string ++ ,string ++ :fill ,fill :adjust ,adjust ++ :base ,base :displace ,displace))) ++ ,@forms)))))))) ++ + ;;; A scaffold is a structure that is used to remember the object + ;;; identities of the cons cells in a (noncircular) data structure. + ;;; This lets us check if the data structure has been changed by +@@ -1307,6 +1478,13 @@ the condition to go uncaught if it canno + (unuse-package package using-package))) + (delete-package package)))) + ++(defun delete-all-versions (pathspec) ++ "Replace the versions field of the pathname specified by pathspec with ++ :wild, and delete all the files this refers to." ++ (let* ((wild-pathname (make-pathname :version :wild :defaults (pathname pathspec))) ++ (truenames (directory wild-pathname))) ++ (mapc #'delete-file truenames))) ++ + (defconstant +fail-count-limit+ 20) + + (defmacro test-with-package-iterator (package-list-expr &rest symbol-types) +@@ -1455,3 +1633,5 @@ the condition to go uncaught if it canno + (list n1) + (random-partition n3 (- p 1 r)))))))))) + ++(defmacro expand-in-current-env (macro-form &environment env) ++ (macroexpand macro-form env)) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/broadcast-stream-streams.lsp +@@ -0,0 +1,30 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 29 22:06:28 2004 ++;;;; Contains: Tests of BROADCAST-STREAM-STREAMS ++ ++(in-package :cl-test) ++ ++(deftest broadcast-stream-streams.1 ++ (broadcast-stream-streams (make-broadcast-stream)) ++ nil) ++ ++(deftest broadcast-stream-streams.2 ++ (equalt ++ (broadcast-stream-streams (make-broadcast-stream *standard-output*)) ++ (list *standard-output*)) ++ t) ++ ++(deftest broadcast-stream-streams.error.1 ++ (signals-error (broadcast-stream-streams) program-error) ++ t) ++ ++(deftest broadcast-stream-streams.error.2 ++ (signals-error (broadcast-stream-streams (make-broadcast-stream) nil) ++ program-error) ++ t) ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/clear-input.lsp +@@ -0,0 +1,64 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 28 06:12:39 2004 ++;;;; Contains: Tests of CLEAR-INPUT ++ ++(in-package :cl-test) ++ ++;;; These tests are limited, since whether an input stream can be ++;;; cleared is not well specified. ++ ++(deftest clear-input.1 ++ (loop for s in (list *debug-io* *query-io* ++ *standard-input* *terminal-io*) ++ always (eq (clear-input s) nil)) ++ t) ++ ++(deftest clear-input.2 ++ (clear-input) ++ nil) ++ ++(deftest clear-input.3 ++ (clear-input nil) ++ nil) ++ ++(deftest clear-input.4 ++ (clear-input t) ++ nil) ++ ++(deftest clear-input.5 ++ (with-input-from-string ++ (is "!?*") ++ (let ((*terminal-io* (make-two-way-stream is (make-broadcast-stream)))) ++ (clear-input t))) ++ nil) ++ ++(deftest clear-input.6 ++ (with-input-from-string ++ (*standard-input* "345") ++ (clear-input nil)) ++ nil) ++ ++;;; Error cases ++ ++(deftest clear-input.error.1 ++ :notes (:assume-no-simple-streams) ++ (signals-error (clear-input t nil) program-error) ++ t) ++ ++(deftest clear-input.error.2 ++ :notes (:assume-no-simple-streams) ++ (signals-error (clear-input nil nil) program-error) ++ t) ++ ++(deftest clear-input.error.3 ++ (signals-error (clear-input t nil nil) program-error) ++ t) ++ ++(deftest clear-input.error.4 ++ (signals-error (clear-input nil nil nil) program-error) ++ t) ++ ++(deftest clear-input.error.5 ++ (check-type-error #'clear-input #'(lambda (x) (typep x '(or stream (member nil t))))) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/clear-output.lsp +@@ -0,0 +1,53 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 28 06:43:17 2004 ++;;;; Contains: Tests of CLEAR-OUTPUT ++ ++(in-package :cl-test) ++ ++(deftest clear-output.1 ++ (progn (finish-output) (clear-output)) ++ nil) ++ ++(deftest clear-output.2 ++ (progn (finish-output) (clear-output t)) ++ nil) ++ ++(deftest clear-output.3 ++ (progn (finish-output) (clear-output nil)) ++ nil) ++ ++(deftest clear-output.4 ++ (loop for s in (list *debug-io* *error-output* *query-io* ++ *standard-output* *trace-output* *terminal-io*) ++ for dummy = (finish-output s) ++ for results = (multiple-value-list (clear-output s)) ++ unless (equal results '(nil)) ++ collect s) ++ nil) ++ ++(deftest clear-output.5 ++ (let ((os (make-string-output-stream))) ++ (let ((*terminal-io* (make-two-way-stream (make-string-input-stream "") ++ os))) ++ (clear-output t))) ++ nil) ++ ++(deftest clear-output.6 ++ (let ((*standard-output* (make-string-output-stream))) ++ (clear-output nil)) ++ nil) ++ ++;;; Error tests ++ ++(deftest clear-output.error.1 ++ (signals-error (clear-output nil nil) program-error) ++ t) ++ ++(deftest clear-output.error.2 ++ (signals-error (clear-output t nil) program-error) ++ t) ++ ++(deftest clear-output.error.3 ++ (check-type-error #'clear-output #'(lambda (x) (typep x '(or stream (member nil t))))) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/compile-file-test-file.lsp +@@ -0,0 +1,3 @@ ++(in-package "CL-TEST") ++ ++(defun compile-file-test-fun.1 () nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/concatenated-stream-streams.lsp +@@ -0,0 +1,67 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 08:43:45 2004 ++;;;; Contains: Tests of CONCATENATED-STREAM-STREAMS ++ ++(in-package :cl-test) ++ ++(deftest concatenated-stream-streams.1 ++ (concatenated-stream-streams (make-concatenated-stream)) ++ nil) ++ ++(deftest concatenated-stream-streams.2 ++ (equalt (list (list *standard-input*)) ++ (multiple-value-list ++ (concatenated-stream-streams ++ (make-concatenated-stream *standard-input*)))) ++ t) ++ ++(deftest concatenated-stream-streams.3 ++ (with-input-from-string ++ (s1 "abc") ++ (with-input-from-string ++ (s2 "def") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (equalt (list (list s1 s2)) ++ (multiple-value-list ++ (concatenated-stream-streams s)))))) ++ t) ++ ++(deftest concatenated-stream-streams.4 ++ (with-input-from-string ++ (s1 "") ++ (with-input-from-string ++ (s2 "def") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (equalt (list (list s1 s2)) ++ (multiple-value-list ++ (concatenated-stream-streams s)))))) ++ t) ++ ++(deftest concatenated-stream-streams.5 ++ (with-input-from-string ++ (s1 "") ++ (with-input-from-string ++ (s2 "def") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (values ++ (read-char s) ++ (equalt (list (list s2)) ++ (multiple-value-list ++ (concatenated-stream-streams s))))))) ++ #\d t) ++ ++;;; Error cases ++ ++(deftest concatenated-stream-streams.error.1 ++ (signals-error (concatenated-stream-streams) program-error) ++ t) ++ ++(deftest concatenated-stream-streams.error.2 ++ (signals-error (concatenated-stream-streams ++ (make-concatenated-stream) ++ nil) ++ program-error) ++ t) ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/delete-file.lsp +@@ -0,0 +1,95 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 18:42:29 2004 ++;;;; Contains: Tests for DELETE-FILE ++ ++(in-package :cl-test) ++ ++(deftest delete-file.1 ++ (let ((pn "scratchfile.txt")) ++ (unless (probe-file pn) ++ (with-open-file (s pn :direction :output) ++ (format s "Contents~%"))) ++ (values ++ (notnot (probe-file pn)) ++ (multiple-value-list (delete-file pn)) ++ (probe-file pn))) ++ t (t) nil) ++ ++(deftest delete-file.2 ++ (let ((pn #p"scratchfile.txt")) ++ (unless (probe-file pn) ++ (with-open-file (s pn :direction :output) ++ (format s "Contents~%"))) ++ (values ++ (notnot (probe-file pn)) ++ (multiple-value-list (delete-file pn)) ++ (probe-file pn))) ++ t (t) nil) ++ ++(deftest delete-file.3 ++ (let ((pn "CLTEST:SCRATCHFILE.TXT")) ++ (assert (typep (pathname pn) 'logical-pathname)) ++ (unless (probe-file pn) ++ (with-open-file (s pn :direction :output) ++ (format s "Contents~%"))) ++ (values ++ (notnot (probe-file pn)) ++ (multiple-value-list (delete-file pn)) ++ (probe-file pn))) ++ t (t) nil) ++ ++(deftest delete-file.4 ++ (let ((pn "CLTEST:SCRATCHFILE.TXT")) ++ (assert (typep (pathname pn) 'logical-pathname)) ++ (unless (probe-file pn) ++ (with-open-file (s pn :direction :output) ++ (format s "Contents~%"))) ++ (let ((s (open pn :direction :input))) ++ (close s) ++ (values ++ (notnot (probe-file pn)) ++ (multiple-value-list (delete-file s)) ++ (probe-file pn)))) ++ t (t) nil) ++ ++;;; Specialized string tests ++ ++(deftest delete-file.5 ++ (do-special-strings ++ (pn "scratchfile.txt" nil) ++ (unless (probe-file pn) ++ (with-open-file (s pn :direction :output) ++ (format s "Contents~%"))) ++ (assert (probe-file pn)) ++ (assert (equal (multiple-value-list (delete-file pn)) '(t))) ++ (assert (not (probe-file pn)))) ++ nil) ++ ++;;; Error tests ++ ++(deftest delete-file.error.1 ++ (signals-error (delete-file) program-error) ++ t) ++ ++(deftest delete-file.error.2 ++ (let ((pn "scratch.txt")) ++ (unless (probe-file pn) ++ (with-open-file (s pn :direction :output) ++ (format s "Contents~%"))) ++ (values ++ (notnot (probe-file pn)) ++ (signals-error (delete-file "scratch.txt" nil) program-error) ++ (notnot (probe-file pn)) ++ (delete-file pn) ++ (probe-file pn))) ++ t t t t nil) ++ ++#| ++(deftest delete-file.error.3 ++ (let ((pn "nonexistent.txt")) ++ (when (probe-file pn) (delete-file pn)) ++ (signals-error (delete-file "nonexistent.txt") file-error)) ++ t) ++|# ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/directory-namestring.lsp +@@ -0,0 +1,50 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Sep 12 06:21:42 2004 ++;;;; Contains: Tests for DIRECTORY-NAMESTRING ++ ++(in-package :cl-test) ++ ++(deftest directory-namestring.1 ++ (let* ((vals (multiple-value-list ++ (directory-namestring "directory-namestring.lsp"))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (stringp s) ++ (equal (directory-namestring s) s)) ++ :good ++ vals)) ++ :good) ++ ++(deftest directory-namestring.2 ++ (do-special-strings ++ (s "directory-namestring.lsp" nil) ++ (let ((ns (directory-namestring s))) ++ (assert (stringp ns)) ++ (assert (string= (directory-namestring ns) ns)))) ++ nil) ++ ++;;; Lispworks makes another assumption about filename normalization ++;;; when using file streams as pathname designators, so this test ++;;; doesn't work there. ++;;; (This is another example of the difficulty of testing a feature ++;;; in which so much is left up to the implementation.) ++#-lispworks ++(deftest directory-namestring.3 ++ (let* ((name "directory-namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (with-open-file (s pn :direction :input) ++ (directory-namestring s))) ++ (name3 (directory-namestring pn))) ++ (or (equalt name2 name3) (list name2 name3))) ++ t) ++ ++;;; Error tests ++ ++(deftest directory-namestring.error.1 ++ (signals-error (directory-namestring) program-error) ++ t) ++ ++(deftest directory-namestring.error.2 ++ (signals-error (directory-namestring "directory-namestring.lsp" nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/directory.lsp +@@ -0,0 +1,71 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 1 12:00:18 2004 ++;;;; Contains: Tests of DIRECTORY ++ ++(in-package :cl-test) ++ ++(deftest directory.1 ++ (directory "nonexistent") ++ nil) ++ ++(deftest directory.2 ++ (directory #p"nonexistent") ++ nil) ++ ++(deftest directory.3 ++ (directory "nonexistent" :allow-other-keys nil) ++ nil) ++ ++(deftest directory.4 ++ (directory "nonexistent" :allow-other-keys t :foo 'bar) ++ nil) ++ ++(deftest directory.5 ++ (directory "nonexistent" :foo 0 :allow-other-keys t) ++ nil) ++ ++(deftest directory.6 ++ (let* ((pattern-pathname (make-pathname :name :wild :type :wild ++ :defaults *default-pathname-defaults*)) ++ (pathnames (directory pattern-pathname))) ++ (values ++ (remove-if #'pathnamep pathnames) ++ (loop for pn in pathnames ++ unless (equal pn (truename pn)) ++ collect pn) ++;; (loop for pn in pathnames ++;; unless (pathname-match-p pn pattern-pathname) ++;; collect pn)) ++ )) ++ nil nil ;; nil ++ ) ++ ++(deftest directory.7 ++ (let* ((pattern-pathname (make-pathname :name :wild :type :wild ++ :defaults *default-pathname-defaults*)) ++ (pathnames (directory pattern-pathname))) ++ (loop for pn in pathnames ++ unless (equal pn (probe-file pn)) ++ collect pn)) ++ nil) ++ ++(deftest directory.8 ++ (let* ((pathname-pattern "CLTEST:*.*") ++ (len (length (directory pathname-pattern)))) ++ (if (< len 300) len nil)) ++ nil) ++ ++;;; Specialized string tests ++ ++(deftest directory.9 ++ (do-special-strings ++ (s "nonexistent" nil) ++ (assert (null (directory s)))) ++ nil) ++ ++;;; Error tests ++ ++(deftest directory.error.1 ++ (signals-error (directory) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/echo-stream-input-stream.lsp +@@ -0,0 +1,27 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Feb 12 04:30:40 2004 ++;;;; Contains: Tests of ECHO-STREAM-INPUT-STREAM ++ ++(in-package :cl-test) ++ ++(deftest echo-stream-input-stream.1 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (equalt (multiple-value-list (echo-stream-input-stream s)) ++ (list is))) ++ t) ++ ++(deftest echo-stream-input-stream.error.1 ++ (signals-error (echo-stream-input-stream) program-error) ++ t) ++ ++(deftest echo-stream-input-stream.error.2 ++ (signals-error (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (echo-stream-input-stream s nil)) ++ program-error) ++ t) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/echo-stream-output-stream.lsp +@@ -0,0 +1,26 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Feb 12 04:32:33 2004 ++;;;; Contains: Tests off ECHO-STREAM-OUTPUT-STREAM ++ ++(in-package :cl-test) ++ ++(deftest echo-stream-output-stream.1 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (equalt (multiple-value-list (echo-stream-output-stream s)) ++ (list os))) ++ t) ++ ++(deftest echo-stream-output-stream.error.1 ++ (signals-error (echo-stream-output-stream) program-error) ++ t) ++ ++(deftest echo-stream-output-stream.error.2 ++ (signals-error (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (echo-stream-output-stream s nil)) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/enough-namestring.lsp +@@ -0,0 +1,84 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Sep 12 06:23:50 2004 ++;;;; Contains: Tests of ENOUGH-NAMESTRING ++ ++(in-package :cl-test) ++ ++(deftest enough-namestring.1 ++ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp"))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (stringp s) ++ (equal (enough-namestring s) s)) ++ :good ++ vals)) ++ :good) ++ ++(deftest enough-namestring.2 ++ (do-special-strings ++ (s "enough-namestring.lsp" nil) ++ (let ((ns (enough-namestring s))) ++ (assert (stringp ns)) ++ (assert (string= (enough-namestring ns) ns)))) ++ nil) ++ ++(deftest enough-namestring.3 ++ (let* ((name "enough-namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (enough-namestring pn)) ++ (name3 (enough-namestring name))) ++ (or (equalt name2 name3) (list name2 name3))) ++ t) ++ ++(deftest enough-namestring.4 ++ (let* ((name "enough-namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (with-open-file (s pn :direction :input) (enough-namestring s))) ++ (name3 (enough-namestring name))) ++ (or (equalt name2 name3) (list name2 name3))) ++ t) ++ ++(deftest enough-namestring.5 ++ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp" ++ *default-pathname-defaults*))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (stringp s) ++ (equal (enough-namestring s) s)) ++ :good ++ vals)) ++ :good) ++ ++(deftest enough-namestring.6 ++ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp" ++ (namestring *default-pathname-defaults*)))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (stringp s) ++ (equal (enough-namestring s) s)) ++ :good ++ vals)) ++ :good) ++ ++(deftest enough-namestring.7 ++ (do-special-strings ++ (s (namestring *default-pathname-defaults*) nil) ++ (let* ((vals (multiple-value-list (enough-namestring "enough-namestring.lsp" s))) ++ (s2 (first vals))) ++ (assert (null (cdr vals))) ++ (assert (stringp s2)) ++ (assert (equal (enough-namestring s2) s2)))) ++ nil) ++ ++;;; Error tests ++ ++(deftest enough-namestring.error.1 ++ (signals-error (enough-namestring) program-error) ++ t) ++ ++(deftest enough-namestring.error.2 ++ (signals-error ++ (enough-namestring "enough-namestring.lsp" *default-pathname-defaults* nil) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/ensure-directories-exist.lsp +@@ -0,0 +1,166 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Mon Jan 5 20:53:03 2004 ++;;;; Contains: Tests of ENSURE-DIRECTORIES-EXIST ++ ++(in-package :cl-test) ++ ++(deftest ensure-directories-exist.1 ++ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp" ++ :defaults *default-pathname-defaults*)) ++ (results nil) ++ (verbosity ++ (with-output-to-string ++ (*standard-output*) ++ (setq results (multiple-value-list (ensure-directories-exist pn)))))) ++ (values ++ (length results) ++ (equalt (truename pn) (truename (first results))) ++ (second results) ++ verbosity)) ++ 2 t nil "") ++ ++(deftest ensure-directories-exist.2 ++ (with-open-file ++ (s "ensure-directories-exist.lsp" :direction :input) ++ (let* ((results (multiple-value-list (ensure-directories-exist s)))) ++ (values ++ (length results) ++ (equalt (truename (first results)) (truename s)) ++ (second results)))) ++ 2 t nil) ++ ++(deftest ensure-directories-exist.3 ++ (let ((s (open "ensure-directories-exist.lsp" :direction :input))) ++ (close s) ++ (let* ((results (multiple-value-list (ensure-directories-exist s)))) ++ (values ++ (length results) ++ (equalt (truename (first results)) (truename s)) ++ (second results)))) ++ 2 t nil) ++ ++(deftest ensure-directories-exist.4 ++ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp" ++ :defaults *default-pathname-defaults*)) ++ (results nil) ++ (verbosity ++ (with-output-to-string ++ (*standard-output*) ++ (setq results (multiple-value-list ++ (ensure-directories-exist pn :verbose nil)))))) ++ (values ++ (length results) ++ (equalt (truename pn) (truename (first results))) ++ (second results) ++ verbosity)) ++ 2 t nil "") ++ ++(deftest ensure-directories-exist.5 ++ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp" ++ :defaults *default-pathname-defaults*)) ++ (results nil) ++ (verbosity ++ (with-output-to-string ++ (*standard-output*) ++ (setq results (multiple-value-list ++ (ensure-directories-exist pn :verbose t)))))) ++ (values ++ (length results) ++ (equalt (truename pn) (truename (first results))) ++ (second results) ++ verbosity)) ++ 2 t nil "") ++ ++(deftest ensure-directories-exist.6 ++ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp" ++ :defaults *default-pathname-defaults*)) ++ (results nil) ++ (verbosity ++ (with-output-to-string ++ (*standard-output*) ++ (setq results (multiple-value-list ++ (ensure-directories-exist ++ pn :allow-other-keys nil)))))) ++ (values ++ (length results) ++ (equalt (truename pn) (truename (first results))) ++ (second results) ++ verbosity)) ++ 2 t nil "") ++ ++(deftest ensure-directories-exist.7 ++ (let* ((pn (make-pathname :name "ensure-directories-exist.lsp" ++ :defaults *default-pathname-defaults*)) ++ (results nil) ++ (verbosity ++ (with-output-to-string ++ (*standard-output*) ++ (setq results (multiple-value-list ++ (ensure-directories-exist ++ pn :allow-other-keys t :nonsense t)))))) ++ (values ++ (length results) ++ (equalt (truename pn) (truename (first results))) ++ (second results) ++ verbosity)) ++ 2 t nil "") ++ ++;;; Case where directory shouldn't exist ++ ++;; The directort ansi-tests/scratch must not exist before this ++;; test is run ++(deftest ensure-directories-exist.8 ++ (let* ((subdir (make-pathname :directory '(:relative "scratch") ++ :defaults *default-pathname-defaults*)) ++ (pn (make-pathname :name "foo" :type "txt" ++ :defaults subdir))) ++ (ignore-errors (delete-file pn) (delete-file subdir)) ++ (assert (not (probe-file pn)) () ++ "Delete subdirectory scratch and its contents!") ++ (let* ((results nil) ++ (verbosity ++ (with-output-to-string ++ (*standard-output*) ++ (setq results (multiple-value-list (ensure-directories-exist pn))))) ++ (result-pn (first results)) ++ (created (second results))) ++ ;; Create the file and write to it ++ (with-open-file (*standard-output* ++ pn :direction :output :if-exists :error ++ :if-does-not-exist :create) ++ (print nil)) ++ (values ++ (length results) ++ (notnot created) ++ (equalt pn result-pn) ++ (notnot (probe-file pn)) ++ verbosity ++ ))) ++ 2 t t t "") ++ ++;;; Specialized string tests ++ ++(deftest ensure-directories-exist.9 ++ (do-special-strings ++ (str "ensure-directories-exist.lsp" nil) ++ (let* ((results (multiple-value-list (ensure-directories-exist str)))) ++ (assert (eql (length results) 2)) ++ (assert (equalt (truename (first results)) (truename str))) ++ (assert (null (second results))))) ++ nil) ++ ++;; FIXME ++;; Need to add a LPN test ++ ++(deftest ensure-directories-exist.error.1 ++ (signals-error-always ++ (ensure-directories-exist ++ (make-pathname :directory '(:relative :wild) ++ :defaults *default-pathname-defaults*)) ++ file-error) ++ t t) ++ ++(deftest ensure-directories-exist.error.2 ++ (signals-error (ensure-directories-exist) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-author.lsp +@@ -0,0 +1,88 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 6 05:41:06 2004 ++;;;; Contains: Tests of FILE-AUTHOR ++ ++(in-package :cl-test) ++ ++(deftest file-author.1 ++ (loop for pn in ++ (directory (make-pathname :name :wild :type :wild ++ :defaults *default-pathname-defaults*)) ++ for author = (file-author pn) ++ unless (or (null author) (stringp author)) ++ collect (list pn author)) ++ nil) ++ ++(deftest file-author.2 ++ (let ((author (file-author "file-author.lsp"))) ++ (if (or (null author) (stringp author)) ++ nil ++ author)) ++ nil) ++ ++(deftest file-author.3 ++ (let ((author (file-author #p"file-author.lsp"))) ++ (if (or (null author) (stringp author)) ++ nil ++ author)) ++ nil) ++ ++(deftest file-author.4 ++ (let ((author (file-author (truename "file-author.lsp")))) ++ (if (or (null author) (stringp author)) ++ nil ++ author)) ++ nil) ++ ++(deftest file-author.5 ++ (let ((author (with-open-file (s "file-author.lsp" :direction :input) ++ (file-author s)))) ++ (if (or (null author) (stringp author)) ++ nil ++ author)) ++ nil) ++ ++(deftest file-author.6 ++ (let ((author (let ((s (open "file-author.lsp" :direction :input))) ++ (close s) ++ (file-author s)))) ++ (if (or (null author) (stringp author)) ++ nil ++ author)) ++ nil) ++ ++;;; Specialized string tests ++ ++(deftest file-author.7 ++ (do-special-strings ++ (s "file-author.lsp" nil) ++ (assert (equal (file-author s) (file-author "file-author.lsp")))) ++ nil) ++ ++;;; FIXME ++;;; Add LPN test ++ ++;;; Error tests ++ ++(deftest file-author.error.1 ++ (signals-error (file-author) program-error) ++ t) ++ ++(deftest file-author.error.2 ++ (signals-error (file-author "file-author.lsp" nil) program-error) ++ t) ++ ++(deftest file-author.error.3 ++ (signals-error-always ++ (file-author (make-pathname :name :wild :type "lsp" ++ :defaults *default-pathname-defaults*)) ++ file-error) ++ t t) ++ ++(deftest file-author.error.4 ++ (signals-error-always ++ (file-author (make-pathname :name "file-author" :type :wild ++ :defaults *default-pathname-defaults*)) ++ file-error) ++ t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-error.lsp +@@ -0,0 +1,89 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 19:10:02 2004 ++;;;; Contains: Tests of the FILE-ERROR condition, and associated accessor function ++ ++(in-package :cl-test) ++ ++(deftest file-error.1 ++ (let ((pn (make-pathname :name :wild ++ :type "txt" ++ :version :newest ++ :defaults *default-pathname-defaults*))) ++ (handler-case ++ (probe-file pn) ++ (error (c) ++ (values ++ (notnot (typep c 'file-error)) ++ (if (equalp (file-error-pathname c) pn) ++ t ++ (list (file-error-pathname c) pn)))))) ++ t t) ++ ++(deftest file-error-pathname.1 ++ (let ((c (make-condition 'file-error :pathname "foo.txt"))) ++ (values ++ (notnot (typep c 'file-error)) ++ (eqlt (class-of c) (find-class 'file-error)) ++ (file-error-pathname c))) ++ t t "foo.txt") ++ ++(deftest file-error-pathname.2 ++ (let ((c (make-condition 'file-error :pathname #p"foo.txt"))) ++ (values ++ (notnot (typep c 'file-error)) ++ (eqlt (class-of c) (find-class 'file-error)) ++ (equalt #p"foo.txt" (file-error-pathname c)))) ++ t t t) ++ ++(deftest file-error-pathname.3 ++ (let ((c (make-condition 'file-error :pathname "CLTEST:FOO.TXT"))) ++ (values ++ (notnot (typep c 'file-error)) ++ (eqlt (class-of c) (find-class 'file-error)) ++ (equalpt "CLTEST:FOO.TXT" ++ (file-error-pathname c)))) ++ t t t) ++ ++(deftest file-error-pathname.4 ++ (let ((c (make-condition 'file-error :pathname (logical-pathname "CLTEST:FOO.TXT")))) ++ (values ++ (notnot (typep c 'file-error)) ++ (eqlt (class-of c) (find-class 'file-error)) ++ (equalpt (logical-pathname "CLTEST:FOO.TXT") ++ (file-error-pathname c)))) ++ t t t) ++ ++(deftest file-error-pathname.5 ++ (with-open-file (s "file-error.lsp" :direction :input) ++ (let ((c (make-condition 'file-error :pathname s))) ++ (values ++ (notnot (typep c 'file-error)) ++ (eqlt (class-of c) (find-class 'file-error)) ++ (equalpt s (file-error-pathname c))))) ++ t t t) ++ ++(deftest file-error-pathname.6 ++ (let ((s (open "file-error.lsp" :direction :input))) ++ (close s) ++ (let ((c (make-condition 'file-error :pathname s))) ++ (values ++ (notnot (typep c 'file-error)) ++ (eqlt (class-of c) (find-class 'file-error)) ++ (equalpt s (file-error-pathname c))))) ++ t t t) ++ ++(deftest file-error-pathname.error.1 ++ (signals-error (file-error-pathname) program-error) ++ t) ++ ++(deftest file-error-pathname.error.2 ++ (signals-error ++ (file-error-pathname (make-condition 'file-error :pathname "foo.txt") nil) ++ program-error) ++ t) ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-length.lsp +@@ -0,0 +1,176 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 21 06:21:11 2004 ++;;;; Contains: Tests of FILE-LENGTH ++ ++(in-package :cl-test) ++ ++(deftest file-length.error.1 ++ (signals-error (file-length) program-error) ++ t) ++ ++(deftest file-length.error.2 ++ (signals-error ++ (with-open-file (is "file-length.lsp" :direction :input) ++ (file-length is nil)) ++ program-error) ++ t) ++ ++(deftest file-length.error.3 ++ (loop for x in *mini-universe* ++ unless (or (typep x 'file-stream) ++ (typep x 'broadcast-stream) ++ (handler-case (progn (file-length x) nil) ++ (type-error (c) ++ (assert (not (typep x (type-error-expected-type c)))) ++ t) ++ (condition () nil))) ++ collect x) ++ nil) ++ ++(deftest file-length.error.4 ++ :notes (:assume-no-simple-streams :assume-no-gray-streams) ++ (signals-error (with-input-from-string (s "abc") (file-length s)) ++ type-error) ++ t) ++ ++(deftest file-length.error.5 ++ (signals-error ++ (with-open-file ++ (is "file-length.lsp" :direction :input) ++ (with-open-file ++ (os "tmp.txt" :direction :output :if-exists :supersede) ++ (let ((s (make-two-way-stream is os))) ++ (unwind-protect (file-length s) (close s))))) ++ type-error) ++ t) ++ ++(deftest file-length.error.6 ++ (signals-error ++ (with-open-file ++ (is "file-length.lsp" :direction :input) ++ (with-open-file ++ (os "tmp.txt" :direction :output :if-exists :supersede) ++ (let ((s (make-echo-stream is os))) ++ (unwind-protect (file-length s) (close s))))) ++ type-error) ++ t) ++ ++(deftest file-length.error.8 ++ (with-open-file ++ (os "tmp.txt" :direction :output :if-exists :supersede) ++ (let ((s (make-broadcast-stream os))) ++ (eqlt (file-length s) (file-length os)))) ++ t) ++ ++(deftest file-length.error.9 ++ (signals-type-error s (make-concatenated-stream) ++ (unwind-protect (file-length s) (close s))) ++ t) ++ ++(deftest file-length.error.10 ++ (signals-error ++ (with-open-file ++ (is "file-length.lsp" :direction :input) ++ (let ((s (make-concatenated-stream is))) ++ (unwind-protect (file-length s) (close s)))) ++ type-error) ++ t) ++ ++(deftest file-length.error.11 ++ :notes (:assume-no-simple-streams :assume-no-gray-streams) ++ (signals-type-error s (make-string-input-stream "abcde") ++ (unwind-protect (file-length s) (close s))) ++ t) ++ ++(deftest file-length.error.12 ++ :notes (:assume-no-simple-streams :assume-no-gray-streams) ++ (signals-type-error s (make-string-output-stream) ++ (unwind-protect (file-length s) (close s))) ++ t) ++ ++;;; Non-error tests ++ ++(deftest file-length.1 ++ (let ((results (multiple-value-list ++ (with-open-file ++ (is "file-length.lsp" :direction :input) ++ (file-length is))))) ++ (and (= (length results) 1) ++ (typep (car results) '(integer 1)) ++ t)) ++ t) ++ ++(deftest file-length.2 ++ (loop for i from 1 to 32 ++ for etype = `(unsigned-byte ,i) ++ for e = (max 0 (- (ash 1 i) 5)) ++ for os = (open "tmp.dat" :direction :output ++ :if-exists :supersede ++ :element-type etype) ++ do (loop repeat 17 do (write-byte e os)) ++ do (finish-output os) ++ unless (= (file-length os) 17) ++ collect (list i (file-length os)) ++ do (close os)) ++ nil) ++ ++(deftest file-length.3 ++ (loop for i from 1 to 32 ++ for etype = `(unsigned-byte ,i) ++ for e = (max 0 (- (ash 1 i) 5)) ++ for os = (open "tmp.dat" :direction :output ++ :if-exists :supersede ++ :element-type etype) ++ for len = 0 ++ do (loop repeat 17 do (write-byte e os)) ++ do (close os) ++ unless (let ((is (open "tmp.dat" :direction :input ++ :element-type etype))) ++ (prog1 ++ (= (file-length is) 17) ++ (close is))) ++ collect i) ++ nil) ++ ++(deftest file-length.4 ++ (loop for i from 33 to 100 ++ for etype = `(unsigned-byte ,i) ++ for e = (max 0 (- (ash 1 i) 5)) ++ for os = (open "tmp.dat" :direction :output ++ :if-exists :supersede ++ :element-type etype) ++ do (loop repeat 17 do (write-byte e os)) ++ do (finish-output os) ++ unless (= (file-length os) 17) ++ collect (list i (file-length os)) ++ do (close os)) ++ nil) ++ ++(deftest file-length.5 ++ (loop for i from 33 to 100 ++ for etype = `(unsigned-byte ,i) ++ for e = (max 0 (- (ash 1 i) 5)) ++ for os = (open "tmp.dat" :direction :output ++ :if-exists :supersede ++ :element-type etype) ++ for len = 0 ++ do (loop repeat 17 do (write-byte e os)) ++ do (close os) ++ unless (let ((is (open "tmp.dat" :direction :input ++ :element-type etype))) ++ (prog1 ++ (= (file-length is) 17) ++ (close is))) ++ collect i) ++ nil) ++ ++(deftest file-length.6 ++ (with-open-file ++ (*foo* "file-length.lsp" :direction :input) ++ (declare (special *foo*)) ++ (let ((s (make-synonym-stream '*foo*))) ++ (unwind-protect ++ (typep* (file-length s) '(integer 1)) ++ (close s)))) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-namestring.lsp +@@ -0,0 +1,44 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Sep 11 07:40:47 2004 ++;;;; Contains: Tests for FILE-NAMESTRING ++ ++(in-package :cl-test) ++ ++(deftest file-namestring.1 ++ (let* ((vals (multiple-value-list ++ (file-namestring "file-namestring.lsp"))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (stringp s) ++ (equal (file-namestring s) s)) ++ :good ++ vals)) ++ :good) ++ ++(deftest file-namestring.2 ++ (do-special-strings ++ (s "file-namestring.lsp" nil) ++ (let ((ns (file-namestring s))) ++ (assert (stringp ns)) ++ (assert (string= (file-namestring ns) ns)))) ++ nil) ++ ++(deftest file-namestring.3 ++ (let* ((name "file-namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (with-open-file (s pn :direction :input) ++ (file-namestring s))) ++ (name3 (file-namestring pn))) ++ (or (equalt name2 name3) (list name2 name3))) ++ t) ++ ++;;; Error tests ++ ++(deftest file-namestring.error.1 ++ (signals-error (file-namestring) program-error) ++ t) ++ ++(deftest file-namestring.error.2 ++ (signals-error (file-namestring "file-namestring.lsp" nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-position.lsp +@@ -0,0 +1,170 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 22 03:02:31 2004 ++;;;; Contains: Tests of FILE-POSITION ++ ++(in-package :cl-test) ++ ++(deftest file-position.1 ++ (with-open-file (is "file-position.lsp":direction :input) ++ (file-position is)) ++ 0) ++ ++(deftest file-position.2 ++ (with-open-file (is "file-position.lsp":direction :input) ++ (values ++ (multiple-value-list ++ (notnot-mv (file-position is :start))) ++ (file-position is))) ++ ++ (t) 0) ++ ++(deftest file-position.3 ++ (with-open-file (is "file-position.lsp":direction :input) ++ (values ++ (multiple-value-list ++ (notnot-mv (file-position is :end))) ++ (notnot (> (file-position is) 0)))) ++ (t) t) ++ ++(deftest file-position.4 ++ (with-open-file ++ (is "file-position.lsp":direction :input) ++ (values ++ (file-position is) ++ (read-char is) ++ (notnot (> (file-position is) 0)))) ++ 0 #\; t) ++ ++(deftest file-position.5 ++ (with-open-file ++ (os "tmp.dat":direction :output ++ :if-exists :supersede) ++ (values ++ (file-position os) ++ (write-char #\x os) ++ (notnot (> (file-position os) 0)))) ++ 0 #\x t) ++ ++(deftest file-position.6 ++ (with-open-file ++ (os "tmp.dat":direction :output ++ :if-exists :supersede) ++ (let ((p1 (file-position os)) ++ (delta (file-string-length os #\x))) ++ (write-char #\x os) ++ (let ((p2 (file-position os))) ++ (or (null p1) (null p2) (null delta) ++ (=t (+ p1 delta) p2))))) ++ t) ++ ++;;; Byte streams ++ ++(deftest file-position.7 ++ (loop for len from 1 to 32 ++ for n = (ash 1 len) ++ do (with-open-file ++ (os "tmp.dat" :direction :output ++ :if-exists :supersede ++ :element-type `(unsigned-byte ,len)) ++ (loop for i from 0 below 100 ++ for r = (logand (1- n) i) ++ for pos = (file-position os) ++ do (assert (or (not pos) (eql pos i))) ++ do (write-byte r os))) ++ do (with-open-file ++ (is "tmp.dat" :direction :input ++ :element-type `(unsigned-byte ,len)) ++ (loop for i from 0 below 100 ++ for pos = (file-position is) ++ do (assert (or (not pos) (eql pos i))) ++ do (let ((byte (read-byte is))) ++ (assert (eql byte (logand (1- n) i))))))) ++ nil) ++ ++(deftest file-position.8 ++ (loop for len from 33 to 100 ++ for n = (ash 1 len) ++ do (with-open-file ++ (os "tmp.dat" :direction :output ++ :if-exists :supersede ++ :element-type `(unsigned-byte ,len)) ++ (loop for i from 0 below 100 ++ for r = (logand (1- n) i) ++ for pos = (file-position os) ++ do (assert (or (not pos) (eql pos i))) ++ do (write-byte r os))) ++ do (with-open-file ++ (is "tmp.dat" :direction :input ++ :element-type `(unsigned-byte ,len)) ++ (loop for i from 0 below 100 ++ for pos = (file-position is) ++ do (assert (or (not pos) (eql pos i))) ++ do (let ((byte (read-byte is))) ++ (assert (eql byte (logand (1- n) i))))))) ++ nil) ++ ++(deftest file-position.9 ++ (with-input-from-string ++ (s "abcdefghijklmnopqrstuvwxyz") ++ (loop repeat 26 ++ for p = (file-position s) ++ unless (or (not p) ++ (progn ++ (file-position s p) ++ (eql (file-position s) p))) ++ collect p ++ do (read-char s))) ++ nil) ++ ++(deftest file-position.10 ++ (with-output-to-string ++ (s) ++ (loop repeat 26 ++ for p = (file-position s) ++ unless (or (not p) ++ (progn ++ (file-position s p) ++ (eql (file-position s) p))) ++ collect p ++ do (write-char #\x s))) ++ "xxxxxxxxxxxxxxxxxxxxxxxxxx") ++ ++;;; Error tests ++ ++(deftest file-position.error.1 ++ (signals-error (file-position) program-error) ++ t) ++ ++(deftest file-position.error.2 ++ (signals-error ++ (file-position (make-string-input-stream "abc") :start nil) ++ program-error) ++ t) ++ ++;;; It's not clear what 'too large' means -- can we set the ++;;; file position to a point where the file may later be extended ++;;; by some other writer? ++#| ++(deftest file-position.error.3 ++ (signals-error ++ (with-open-file ++ (is "file-position.lsp" :direction :input) ++ (flet ((%fail () (error 'type-error))) ++ (unless (file-position is :end) (%fail)) ++ (let ((fp (file-position is))) ++ (unless fp (%fail)) ++ (file-position is (+ 1000000 fp))))) ++ error) ++ t) ++ ++(deftest file-position.error.4 ++ (signals-error ++ (with-open-file ++ (is "file-position.lsp" :direction :input) ++ (file-position is 1000000000000000000000)) ++ error) ++ t) ++|# ++ ++ +\ No newline at end of file +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-string-length.lsp +@@ -0,0 +1,73 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 22 21:34:04 2004 ++;;;; Contains: Tests of FILE-STRING-LENGTH ++ ++(in-package :cl-test) ++ ++(deftest file-string-length.1 ++ (with-open-file ++ (s "tmp.dat" :direction :output ++ :if-exists :supersede) ++ (loop for x across +standard-chars+ ++ for len = (file-string-length s x) ++ do (assert (typep len '(or null (integer 0)))) ++ do (let ((pos1 (file-position s))) ++ (write-char x s) ++ (let ((pos2 (file-position s))) ++ (when (and pos1 pos2 len) ++ (assert (= (+ pos1 len) pos2))))))) ++ nil) ++ ++(deftest file-string-length.2 ++ (with-open-file ++ (s "tmp.dat" :direction :output ++ :if-exists :supersede) ++ (loop for x across +standard-chars+ ++ for len = (file-string-length s (string x)) ++ do (assert (typep len '(or null (integer 0)))) ++ do (let ((pos1 (file-position s))) ++ (write-sequence (string x) s) ++ (let ((pos2 (file-position s))) ++ (when (and pos1 pos2 len) ++ (assert (= (+ pos1 len) pos2))))))) ++ nil) ++ ++(deftest file-string-length.3 ++ (with-open-file ++ (stream "tmp.dat" :direction :output ++ :if-exists :supersede) ++ (let* ((s1 "abcde") ++ (n (file-string-length stream s1))) ++ (do-special-strings ++ (s2 s1 nil) ++ (assert (= (file-string-length stream s2) n))))) ++ nil) ++ ++;;; Error tests ++ ++(deftest file-string-length.error.1 ++ (signals-error (file-string-length) program-error) ++ t) ++ ++(deftest file-string-length.error.2 ++ (signals-error ++ (with-open-file ++ (s "tmp.dat" :direction :output ++ :if-exists :supersede) ++ (file-string-length s)) ++ program-error) ++ t) ++ ++(deftest file-string-length.error.3 ++ (signals-error ++ (with-open-file ++ (s "tmp.dat" :direction :output ++ :if-exists :supersede) ++ (file-string-length s #\x nil)) ++ program-error) ++ t) ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/file-write-date.lsp +@@ -0,0 +1,89 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 6 06:01:35 2004 ++;;;; Contains: Tests for FILE-WRITE-DATE ++ ++(in-package :cl-test) ++ ++(deftest file-write-date.1 ++ (let* ((pn "file-write-date.lsp") ++ (date (file-write-date pn)) ++ (time (get-universal-time))) ++ (or (null date) ++ (and (integerp date) ++ (<= 0 date time) ++ t))) ++ t) ++ ++(deftest file-write-date.2 ++ (let* ((pn #p"file-write-date.lsp") ++ (date (file-write-date pn)) ++ (time (get-universal-time))) ++ (or (null date) ++ (and (integerp date) ++ (<= 0 date time) ++ t))) ++ t) ++ ++(deftest file-write-date.3 ++ (let* ((pn (truename "file-write-date.lsp")) ++ (date (file-write-date pn)) ++ (time (get-universal-time))) ++ (or (null date) ++ (and (integerp date) ++ (<= 0 date time) ++ t))) ++ t) ++ ++(deftest file-write-date.4 ++ (loop for pn in (directory ++ (make-pathname :name :wild :type :wild ++ :defaults *default-pathname-defaults*)) ++ for date = (file-write-date pn) ++ for time = (get-universal-time) ++ unless (or (null date) ++ (<= 0 date time)) ++ collect (list pn date time)) ++ nil) ++ ++(deftest file-write-date.5 ++ (length (multiple-value-list (file-write-date "file-write-date.lsp"))) ++ 1) ++ ++;;; Specialized string tests ++ ++(deftest file-write-date.6 ++ (let* ((str "file-write-date.lsp") ++ (date (file-write-date str))) ++ (do-special-strings ++ (s str nil) ++ (assert (equal (file-write-date s) date)))) ++ nil) ++ ++;;; FIXME ++;;; Add LPN test ++ ++;;; Error tests ++ ++(deftest file-write-date.error.1 ++ (signals-error (file-write-date) program-error) ++ t) ++ ++(deftest file-write-date.error.2 ++ (signals-error (file-write-date "file-write-date.lsp" nil) ++ program-error) ++ t) ++ ++(deftest file-write-date.error.3 ++ (signals-error-always ++ (file-write-date (make-pathname :name :wild :type "lsp" ++ :defaults *default-pathname-defaults*)) ++ file-error) ++ t t) ++ ++(deftest file-write-date.error.4 ++ (signals-error-always ++ (file-write-date (make-pathname :name "file-write-date" :type :wild ++ :defaults *default-pathname-defaults*)) ++ file-error) ++ t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/finish-output.lsp +@@ -0,0 +1,54 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 28 06:38:20 2004 ++;;;; Contains: Tests of FINISH-OUTPUT ++ ++(in-package :cl-test) ++ ++(deftest finish-output.1 ++ (finish-output) ++ nil) ++ ++(deftest finish-output.2 ++ (finish-output t) ++ nil) ++ ++(deftest finish-output.3 ++ (finish-output nil) ++ nil) ++ ++(deftest finish-output.4 ++ (loop for s in (list *debug-io* *error-output* *query-io* ++ *standard-output* *trace-output* *terminal-io*) ++ for results = (multiple-value-list (finish-output s)) ++ unless (equal results '(nil)) ++ collect s) ++ nil) ++ ++(deftest finish-output.5 ++ (let ((os (make-string-output-stream))) ++ (let ((*terminal-io* (make-two-way-stream (make-string-input-stream "") ++ os))) ++ (finish-output t))) ++ nil) ++ ++(deftest finish-output.6 ++ (let ((*standard-output* (make-string-output-stream))) ++ (finish-output nil)) ++ nil) ++ ++;;; Error tests ++ ++(deftest finish-output.error.1 ++ (signals-error (finish-output nil nil) program-error) ++ t) ++ ++(deftest finish-output.error.2 ++ (signals-error (finish-output t nil) program-error) ++ t) ++ ++(deftest finish-output.error.3 ++ (check-type-error #'finish-output ++ #'(lambda (x) (typep x '(or stream (member nil t))))) ++ nil) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/force-output.lsp +@@ -0,0 +1,56 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 28 06:41:46 2004 ++;;;; Contains: Tests of FORCE-OUTPUT ++ ++(in-package :cl-test) ++ ++(deftest force-output.1 ++ (force-output) ++ nil) ++ ++(deftest force-output.2 ++ (force-output t) ++ nil) ++ ++(deftest force-output.3 ++ (force-output nil) ++ nil) ++ ++(deftest force-output.4 ++ (loop for s in (list *debug-io* *error-output* *query-io* ++ *standard-output* *trace-output* *terminal-io*) ++ for results = (multiple-value-list (force-output s)) ++ unless (equal results '(nil)) ++ collect s) ++ nil) ++ ++(deftest force-output.5 ++ (let ((os (make-string-output-stream))) ++ (let ((*terminal-io* (make-two-way-stream (make-string-input-stream "") ++ os))) ++ (force-output t))) ++ nil) ++ ++(deftest force-output.6 ++ (let ((*standard-output* (make-string-output-stream))) ++ (force-output nil)) ++ nil) ++ ++ ++;;; Error tests ++ ++(deftest force-output.error.1 ++ (signals-error (force-output nil nil) program-error) ++ t) ++ ++(deftest force-output.error.2 ++ (signals-error (force-output t nil) program-error) ++ t) ++ ++(deftest force-output.error.3 ++ (check-type-error #'force-output ++ #'(lambda (x) (typep x '(or stream (member nil t))))) ++ nil) ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/fresh-line.lsp +@@ -0,0 +1,87 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 20:41:18 2004 ++;;;; Contains: Tests of FRESH-LINE ++ ++(in-package :cl-test) ++ ++(deftest fresh-line.1 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (write-char #\a) ++ (setq result (notnot (fresh-line)))) ++ result)) ++ #.(concatenate 'string "a" (string #\Newline)) ++ t) ++ ++(deftest fresh-line.2 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (write-char #\a s) ++ (setq result (notnot (fresh-line s)))) ++ result)) ++ #.(concatenate 'string "a" (string #\Newline)) ++ t) ++ ++(deftest fresh-line.3 ++ (with-output-to-string ++ (s) ++ (write-char #\x s) ++ (fresh-line s) ++ (fresh-line s) ++ (write-char #\y s)) ++ #.(concatenate 'string "x" (string #\Newline) "y")) ++ ++(deftest fresh-line.4 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result (multiple-value-list (fresh-line)))) ++ result)) ++ "" (nil)) ++ ++(deftest fresh-line.5 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (write-char #\Space s) ++ (setq result ++ (list ++ (multiple-value-list (notnot-mv (fresh-line s))) ++ (multiple-value-list (fresh-line s)) ++ (multiple-value-list (fresh-line s))))) ++ result)) ++ " ++" ((t) (nil) (nil))) ++ ++(deftest fresh-line.6 ++ (with-output-to-string ++ (os) ++ (let ((*terminal-io* (make-two-way-stream *standard-input* os))) ++ (write-char #\a t) ++ (fresh-line t) ++ (finish-output t))) ++ #.(concatenate 'string (string #\a) (string #\Newline))) ++ ++(deftest fresh-line.7 ++ (with-output-to-string ++ (*standard-output*) ++ (write-char #\a nil) ++ (terpri nil)) ++ #.(concatenate 'string (string #\a) (string #\Newline))) ++ ++;;; Error tests ++ ++(deftest fresh-line.error.1 ++ (signals-error ++ (with-output-to-string ++ (s) ++ (fresh-line s nil)) ++ program-error) ++ t) +--- gcl-2.6.12.orig/ansi-tests/gclload2.lsp ++++ gcl-2.6.12/ansi-tests/gclload2.lsp +@@ -46,6 +46,15 @@ + ;;; Tests of strings + (load "load-strings.lsp") + ++;;; Tests of pathnames ++(load "load-pathnames.lsp") ++ ++;;; Tests of file operations ++(load "load-files.lsp") ++ ++;;; Tests of streams ++(load "load-streams.lsp") ++ + ;;; Tests for character functions + (compile-and-load "char-aux.lsp") + (load "character.lsp") +--- /dev/null ++++ gcl-2.6.12/ansi-tests/get-output-stream-string.lsp +@@ -0,0 +1,32 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 09:48:46 2004 ++;;;; Contains: Tests of GET-OUTPUT-STREAM-STRING ++ ++(in-package :cl-test) ++ ++;; this function is used extensively elsewhere in the test suite ++ ++(deftest get-output-stream-string.1 ++ (let ((s (make-string-output-stream))) ++ (values ++ (get-output-stream-string s) ++ (write-string "abc" s) ++ (write-string "def" s) ++ (get-output-stream-string s) ++ (get-output-stream-string s))) ++ "" "abc" "def" "abcdef" "") ++ ++;;; Error cases ++ ++(deftest get-output-stream-string.error.1 ++ (signals-error (get-output-stream-string) t) ++ t) ++ ++(deftest get-output-stream-string.error.2 ++ (signals-error (get-output-stream-string (make-string-output-stream) nil) t) ++ t) ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/host-namestring.lsp +@@ -0,0 +1,49 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Sep 12 06:22:40 2004 ++;;;; Contains: Tests of HOST-NAMESTRING ++ ++(in-package :cl-test) ++ ++(deftest host-namestring.1 ++ (let* ((vals (multiple-value-list ++ (host-namestring "host-namestring.lsp"))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (or (null s) ++ (stringp s) ++ ;; (equal (host-namestring s) s) ++ )) ++ :good ++ vals)) ++ :good) ++ ++(deftest host-namestring.2 ++ (do-special-strings ++ (s "host-namestring.lsp" nil) ++ (let ((ns (host-namestring s))) ++ (when ns ++ (assert (stringp ns)) ++ ;; (assert (string= (host-namestring ns) ns)) ++ ))) ++ nil) ++ ++(deftest host-namestring.3 ++ (let* ((name "host-namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (with-open-file (s pn :direction :input) ++ (host-namestring s))) ++ (name3 (host-namestring pn))) ++ (or (equalt name2 name3) (list name2 name3))) ++ t) ++ ++;;; Error tests ++ ++(deftest host-namestring.error.1 ++ (signals-error (host-namestring) program-error) ++ t) ++ ++(deftest host-namestring.error.2 ++ (signals-error (host-namestring "host-namestring.lsp" nil) program-error) ++ t) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/input-stream-p.lsp +@@ -0,0 +1,40 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 19:39:27 2004 ++;;;; Contains: Tests for INPUT-STREAM-P ++ ++(in-package :cl-test) ++ ++(deftest input-stream-p.1 ++ (notnot-mv (input-stream-p *standard-input*)) ++ t) ++ ++(deftest input-stream-p.2 ++ (notnot-mv (input-stream-p *terminal-io*)) ++ t) ++ ++(deftest input-stream-p.3 ++ (with-open-file (s "input-stream-p.lsp" :direction :input) ++ (notnot-mv (input-stream-p s))) ++ t) ++ ++(deftest input-stream-p.4 ++ (with-open-file (s "foo.txt" :direction :output ++ :if-exists :supersede) ++ (input-stream-p s)) ++ nil) ++ ++;;; Error tests ++ ++(deftest input-stream-p.error.1 ++ (signals-error (input-stream-p) program-error) ++ t) ++ ++(deftest input-stream-p.error.2 ++ (signals-error (input-stream-p *standard-input* nil) ++ program-error) ++ t) ++ ++(deftest input-stream-p.error.3 ++ (check-type-error #'input-stream-p #'streamp) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/interactive-stream-p.lsp +@@ -0,0 +1,28 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 19:47:59 2004 ++;;;; Contains: Tests of INTERACTIVE-STREAM-P ++ ++(in-package :cl-test) ++ ++(deftest interactive-stream-p.1 ++ (let ((streams (list *debug-io* *error-output* *query-io* ++ *standard-input* *standard-output* ++ *trace-output* *terminal-io*))) ++ (mapc #'interactive-stream-p streams) ++ ;; no error should occur ++ nil) ++ nil) ++ ++(deftest interactive-stream-p.error.1 ++ (check-type-error #'interactive-stream-p #'streamp) ++ nil) ++ ++(deftest interactive-stream-p.error.2 ++ (signals-error (interactive-stream-p) program-error) ++ t) ++ ++(deftest interactive-stream-p.error.3 ++ (signals-error (interactive-stream-p *terminal-io* nil) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/ldtest.lsp +@@ -0,0 +1 @@ ++(in-package :cl-test) (defun LOAD-TEST-FUN-3 () :foo) +\ No newline at end of file +--- /dev/null ++++ gcl-2.6.12/ansi-tests/listen.lsp +@@ -0,0 +1,73 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 27 21:16:39 2004 ++;;;; Contains: Tests of LISTEN ++ ++(in-package :cl-test) ++ ++(deftest listen.1 ++ (with-input-from-string (s "") (listen s)) ++ nil) ++ ++(deftest listen.2 ++ (with-input-from-string (s "x") (notnot-mv (listen s))) ++ t) ++ ++(deftest listen.3 ++ (with-input-from-string (*standard-input* "") (listen)) ++ nil) ++ ++(deftest listen.4 ++ (with-input-from-string (*standard-input* "A") (notnot-mv (listen))) ++ t) ++ ++;;; (deftest listen.5 ++;;; (when (interactive-stream-p *standard-input*) ++;;; (clear-input) (listen)) ++;;; nil) ++ ++(deftest listen.6 ++ (with-input-from-string ++ (s "x") ++ (values ++ (read-char s) ++ (listen s) ++ (unread-char #\x s) ++ (notnot (listen s)) ++ (read-char s))) ++ #\x nil nil t #\x) ++ ++(deftest listen.7 ++ (with-open-file ++ (s "listen.lsp") ++ (values ++ (notnot (listen s)) ++ (handler-case ++ (locally (declare (optimize safety)) ++ (loop (read-char s))) ++ (end-of-file () (listen s))))) ++ t nil) ++ ++(deftest listen.8 ++ (with-input-from-string ++ (is "abc") ++ (let ((*terminal-io* (make-two-way-stream is (make-broadcast-stream)))) ++ (notnot-mv (listen t)))) ++ t) ++ ++(deftest listen.9 ++ (with-input-from-string ++ (*standard-input* "345") ++ (notnot-mv (listen nil))) ++ t) ++ ++;;; Error tests ++ ++(deftest listen.error.1 ++ :notes (:assume-no-simple-streams) ++ (signals-error (listen *standard-input* nil) program-error) ++ t) ++ ++(deftest listen.error.2 ++ (signals-error (listen *standard-input* nil nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-files.lsp +@@ -0,0 +1,16 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 1 11:59:35 2004 ++;;;; Contains: Load tests of section 20, 'Files' ++ ++(in-package :cl-test) ++ ++(load "directory.lsp") ++(load "probe-file.lsp") ++(load "ensure-directories-exist.lsp") ++(load "truename.lsp") ++(load "file-author.lsp") ++(load "file-write-date.lsp") ++(load "rename-file.lsp") ++(load "delete-file.lsp") ++(load "file-error.lsp") +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-logical-pathname-translations.lsp +@@ -0,0 +1,34 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Dec 31 09:31:33 2003 ++;;;; Contains: Tests (such as they are) for LOAD-LOGICAL-PATHNAME-TRANSLATIONS ++ ++(in-package :cl-test) ++ ++;;; The function LOAD-LOGICAL-PATHNAME-TRANSLATIONS is almost entirely ++;;; untestable, since the basic behavior is implementation defined. ++ ++(deftest load-logical-pathname-translations.1 ++ (load-logical-pathname-translations "CLTESTROOT") ++ nil) ++ ++;;; Error cases ++ ++(deftest load-logical-pathname-translations.error.1 ++ (handler-case ++ (progn (load-logical-pathname-translations ++ "THEREHADBETTERNOTBEAHOSTCALLEDTHIS") ++ nil) ++ (error () :good)) ++ :good) ++ ++(deftest load-logical-pathname-translations.error.2 ++ (signals-error (load-logical-pathname-translations) ++ program-error) ++ t) ++ ++(deftest load-logical-pathname-translations.error.3 ++ (signals-error (load-logical-pathname-translations "CLTESTROOT" nil) ++ program-error) ++ t) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-pathnames.lsp +@@ -0,0 +1,36 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Nov 29 04:33:05 2003 ++;;;; Contains: Load tests for pathnames and logical pathnames ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(load "pathnames.lsp") ++(load "pathname.lsp") ++(load "pathnamep.lsp") ++(load "make-pathname.lsp") ++(load "pathname-host.lsp") ++(load "pathname-device.lsp") ++(load "pathname-directory.lsp") ++(load "pathname-name.lsp") ++(load "pathname-type.lsp") ++(load "pathname-version.lsp") ++ ++(load "load-logical-pathname-translations.lsp") ++(load "logical-pathname.lsp") ++(load "logical-pathname-translations.lsp") ++(load "translate-logical-pathname.lsp") ++ ++(load "namestring.lsp") ++(load "file-namestring.lsp") ++(load "directory-namestring.lsp") ++(load "host-namestring.lsp") ++(load "enough-namestring.lsp") ++ ++(load "wild-pathname-p.lsp") ++(load "merge-pathnames.lsp") ++(load "pathname-match-p.lsp") ++ ++(load "parse-namestring.lsp") +\ No newline at end of file +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-streams.lsp +@@ -0,0 +1,57 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 19:38:10 2004 ++;;;; Contains: Load files containing tests for section 21 (streams) ++ ++(in-package :cl-test) ++ ++(load "input-stream-p.lsp") ++(load "output-stream-p.lsp") ++(load "interactive-stream-p.lsp") ++(load "open-stream-p.lsp") ++(load "stream-element-type.lsp") ++(load "streamp.lsp") ++(load "read-byte.lsp") ++(load "peek-char.lsp") ++(load "read-char.lsp") ++(load "read-char-no-hang.lsp") ++(load "terpri.lsp") ++(load "fresh-line.lsp") ++(load "unread-char.lsp") ++(load "write-char.lsp") ++(load "read-line.lsp") ++(load "write-string.lsp") ++(load "write-line.lsp") ++(load "read-sequence.lsp") ++(load "write-sequence.lsp") ++(load "file-length.lsp") ++(load "file-position.lsp") ++(load "file-string-length.lsp") ++(load "open.lsp") ++(load "stream-external-format.lsp") ++(load "with-open-file.lsp") ++(load "with-open-stream.lsp") ++(load "listen.lsp") ++(load "clear-input.lsp") ++(load "finish-output.lsp") ++(load "force-output.lsp") ++(load "clear-output.lsp") ++(load "make-synonym-stream.lsp") ++(load "synonym-stream-symbol.lsp") ++(load "make-broadcast-stream.lsp") ++(load "broadcast-stream-streams.lsp") ++(load "make-two-way-stream.lsp") ++(load "two-way-stream-input-stream.lsp") ++(load "two-way-stream-output-stream.lsp") ++(load "echo-stream-input-stream.lsp") ++(load "echo-stream-output-stream.lsp") ++(load "make-echo-stream.lsp") ++(load "concatenated-stream-streams.lsp") ++(load "make-concatenated-stream.lsp") ++(load "get-output-stream-string.lsp") ++(load "make-string-input-stream.lsp") ++(load "make-string-output-stream.lsp") ++(load "with-input-from-string.lsp") ++(load "with-output-to-string.lsp") ++(load "stream-error-stream.lsp") ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-system-construction.lsp +@@ -0,0 +1,12 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Dec 12 19:44:29 2004 ++;;;; Contains: Load tests for system construction (section 24) ++ ++(in-package :cl-test) ++ ++(load "compile-file.lsp") ++(load "load.lsp") ++(load "with-compilation-unit.lsp") ++(load "features.lsp") ++(load "modules.lsp") +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-test-file-2.lsp +@@ -0,0 +1,7 @@ ++(in-package :cl-test) ++ ++(declaim (special *load-test-var.1* *load-test-var.2*)) ++(eval-when (:load-toplevel) ++ (setq *load-test-var.1* *load-pathname*) ++ (setq *load-test-var.2* *load-truename*)) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/load-test-file.lsp +@@ -0,0 +1,9 @@ ++(in-package :cl-test) ++ ++(defun load-file-test-fun.1 () ++ '#.*load-pathname*) ++ ++(defun load-file-test-fun.2 () ++ '#.*load-truename*) ++ ++ +--- gcl-2.6.12.orig/ansi-tests/load.lsp ++++ gcl-2.6.12/ansi-tests/load.lsp +@@ -1,15 +1,227 @@ +-;; Get the MK package +-;; I've hardwired a path here; fix for your system +-;; I assume the package is already compiled. +-(unless (find-package "MK") +- (load #.(concatenate 'string "../defsys30/defsystem." +- #+cmu (C::BACKEND-FASL-FILE-TYPE C::*TARGET-BACKEND*) +- #+allegro "fasl" +- #+(or akcl gcl) "o"))) +- +-(load "rt/rt.system") +-(mk::load-system "rt") +-(mk::compile-system "cltest") ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Apr 12 21:51:49 2005 ++;;;; Contains: Tests of LOAD ++ + (in-package :cl-test) + ++(defun load-file-test (file funname &rest args &key ++ if-does-not-exist ++ (print nil print-p) ++ (verbose nil verbose-p) ++ (*load-print* nil) ++ (*load-verbose* nil) ++ external-format) ++ (declare (ignorable external-format if-does-not-exist ++ print print-p verbose verbose-p)) ++ (fmakunbound funname) ++ (let* ((str (make-array '(0) :element-type 'character :adjustable t ++ :fill-pointer 0)) ++ (vals (multiple-value-list ++ (with-output-to-string ++ (*standard-output* str) ++ (apply #'load file :allow-other-keys t args)))) ++ (print? (if print-p print *load-print*)) ++ (verbose? (if verbose-p verbose *load-verbose*))) ++ (values ++ (let ((v1 (car vals)) ++ (v2 (or (and verbose-p (not verbose)) ++ (and (not verbose-p) (not *load-verbose*)) ++ (position #\; str))) ++ (v3 (or (and print-p (not print)) ++ (and (not print-p) (not *load-print*)) ++ (> (length str) 0))) ++ (v4 (if (or print? verbose?) ++ (> (length str) 0) ++ t))) ++ (if (and (= (length vals) 1) v1 v2 v3 v4) t (list vals v2 v3 v4 str))) ++ (funcall funname)))) ++ ++(deftest load.1 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1) ++ t nil) ++ ++(deftest load.2 ++ (load-file-test #p"compile-file-test-file.lsp" 'compile-file-test-fun.1) ++ t nil) ++ ++(deftest load.3 ++ (with-input-from-string ++ (s "(in-package :cl-test) (defun load-file-test-fun.2 () 'good)") ++ (load-file-test s 'load-file-test-fun.2)) ++ t good) ++ ++(deftest load.4 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :external-format :default) ++ t nil) ++ ++(deftest load.5 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :verbose t) ++ t nil) ++ ++(deftest load.6 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :*load-verbose* t) ++ t nil) ++ ++(deftest load.7 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :*load-verbose* t :verbose nil) ++ t nil) ++ ++(deftest load.8 ++ (with-input-from-string ++ (s "(in-package :cl-test) (defun load-file-test-fun.2 () 'good)") ++ (load-file-test s 'load-file-test-fun.2 :verbose t)) ++ t good) ++ ++(deftest load.9 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :print t) ++ t nil) ++ ++(deftest load.10 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :*load-print* t) ++ t nil) ++ ++(deftest load.11 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :*load-print* t :print nil) ++ t nil) ++ ++(deftest load.12 ++ (load-file-test "compile-file-test-file.lsp" 'compile-file-test-fun.1 ++ :*load-print* nil :print t) ++ t nil) ++ ++(deftest load.13 ++ (with-input-from-string ++ (s "(in-package :cl-test) (defun load-file-test-fun.2 () 'good)") ++ (load-file-test s 'load-file-test-fun.2 :print t)) ++ t good) ++ ++(deftest load.14 ++ (load "nonexistent-file.lsp" :if-does-not-exist nil) ++ nil) ++ ++(defpackage LOAD-TEST-PACKAGE (:use "COMMON-LISP")) ++ ++(deftest load.15 ++ (let ((*package* (find-package "LOAD-TEST-PACKAGE"))) ++ (with-input-from-string ++ (s "(defun f () 'good)") ++ (load-file-test s 'load-test-package::f))) ++ t load-test-package::good) ++ ++(deftest load.15a ++ (let ((*package* (find-package "CL-TEST"))) ++ (values ++ (with-input-from-string ++ (s "(eval-when (:load-toplevel :execute) (setq *package* (find-package \"LOAD-TEST-PACKAGE\"))) ++ (defun f () 'good)") ++ (multiple-value-list (load-file-test s 'load-test-package::f))) ++ (read-from-string "GOOD"))) ++ (t load-test-package::good) good) ++ ++(deftest load.16 ++ (let ((*readtable* (copy-readtable nil))) ++ (set-macro-character #\! (get-macro-character #\')) ++ (with-input-from-string ++ (s "(in-package :cl-test) (defun load-file-test-fun.3 () !good)") ++ (load-file-test s 'load-file-test-fun.3))) ++ t good) ++ ++(deftest load.16a ++ (let ((*readtable* *readtable*) ++ (*package* (find-package "CL-TEST"))) ++ (values ++ (with-input-from-string ++ (s "(in-package :cl-test) ++ (eval-when (:load-toplevel :execute) ++ (setq *readtable* (copy-readtable nil)) ++ (set-macro-character #\\! (get-macro-character #\\'))) ++ (defun load-file-test-fun.3 () !good)") ++ (multiple-value-list ++ (load-file-test s 'load-file-test-fun.3))) ++ (read-from-string "!FOO"))) ++ (t good) !FOO) ++ ++(deftest load.17 ++ (let ((file #p"load-test-file.lsp")) ++ (fmakunbound 'load-file-test-fun.1) ++ (fmakunbound 'load-file-test-fun.2) ++ (values ++ (notnot (load file)) ++ (let ((p1 (pathname (merge-pathnames file))) ++ (p2 (funcall 'load-file-test-fun.1))) ++ (equalpt-or-report p1 p2)) ++ (let ((p1 (truename file)) ++ (p2 (funcall 'load-file-test-fun.2))) ++ (equalpt-or-report p1 p2)))) ++ t t t) ++ ++;;; Test that the load pathname/truename variables are bound ++;;; properly when loading compiled files ++ ++(deftest load.18 ++ (let* ((file "load-test-file-2.lsp") ++ (target (enough-namestring (compile-file-pathname file)))) ++ (declare (special *load-test-var.1* *load-test-var.2*)) ++ (compile-file file) ++ (makunbound '*load-test-var.1*) ++ (makunbound '*load-test-var.2*) ++ (load target) ++ (values ++ (let ((p1 (pathname (merge-pathnames target))) ++ (p2 *load-test-var.1*)) ++ (equalpt-or-report p1 p2)) ++ (let ((p1 (truename target)) ++ (p2 *load-test-var.2*)) ++ (equalpt-or-report p1 p2)))) ++ t t) ++ ++(deftest load.19 ++ (let ((file (logical-pathname "CLTEST:LDTEST.LSP")) ++ (fn 'load-test-fun-3) ++ (*package* (find-package "CL-TEST"))) ++ (with-open-file ++ (s file :direction :output :if-exists :supersede ++ :if-does-not-exist :create) ++ (format s "(in-package :cl-test) (defun ~a () :foo)" fn)) ++ (fmakunbound fn) ++ (values ++ (notnot (load file)) ++ (funcall fn))) ++ t :foo) ++ ++;;; Defaults of the load variables ++ ++(deftest load-pathname.1 ++ *load-pathname* ++ nil) ++ ++(deftest load-truename.1 ++ *load-truename* ++ nil) ++ ++(deftest load-print.1 ++ *load-print* ++ nil) ++ ++;;; Error tests ++ ++(deftest load.error.1 ++ (signals-error (load "nonexistent-file.lsp") file-error) ++ t) ++ ++(deftest load.error.2 ++ (signals-error (load) program-error) ++ t) + ++(deftest load.error.3 ++ (signals-error (load "compile-file-test-file.lsp" :bad-key-arg t) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/logical-pathname-translations.lsp +@@ -0,0 +1,8 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Dec 31 09:46:08 2003 ++;;;; Contains: Tests of LOGICAL-PATHNAME-TRANSLATIONS ++ ++(in-package :cl-test) ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/logical-pathname.lsp +@@ -0,0 +1,93 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Dec 30 19:05:01 2003 ++;;;; Contains: Tests of LOGICAL-PATHNAME ++ ++(in-package :cl-test) ++ ++(deftest logical-pathname.1 ++ (loop for x in *logical-pathnames* ++ always (eql x (logical-pathname x))) ++ t) ++ ++(deftest logical-pathname.2 ++ (notnot-mv (typep (logical-pathname "CLTEST:FOO") 'logical-pathname)) ++ t) ++ ++(deftest logical-pathname.3 ++ (let ((name "CLTEST:TEMP.DAT.NEWEST")) ++ (with-open-file ++ (s (logical-pathname name) ++ :direction :output ++ :if-exists :supersede ++ :if-does-not-exist :create) ++ (or (equalt (logical-pathname s) (logical-pathname name)) ++ (list (logical-pathname s) (logical-pathname name))))) ++ t) ++ ++ ++;;; Error tests ++ ++(deftest logical-pathname.error.1 ++ (check-type-error #'logical-pathname ++ (typef '(or string stream logical-pathname))) ++ nil) ++ ++(deftest logical-pathname.error.2 ++ ;; Doesn't specify a host ++ (signals-error (logical-pathname "FOO.TXT") type-error) ++ t) ++ ++(deftest logical-pathname.error.3 ++ (signals-error ++ (with-open-file (s #p"logical-pathname.lsp" :direction :input) ++ (logical-pathname s)) ++ type-error) ++ t) ++ ++(deftest logical-pathname.error.4 ++ (signals-error ++ (with-open-stream ++ (is (make-concatenated-stream)) ++ (with-open-stream ++ (os (make-broadcast-stream)) ++ (with-open-stream ++ (s (make-two-way-stream is os)) ++ (logical-pathname s)))) ++ type-error) ++ t) ++ ++(deftest logical-pathname.error.5 ++ (signals-error ++ (with-open-stream ++ (is (make-concatenated-stream)) ++ (with-open-stream ++ (os (make-broadcast-stream)) ++ (with-open-stream ++ (s (make-echo-stream is os)) ++ (logical-pathname s)))) ++ type-error) ++ t) ++ ++(deftest logical-pathname.error.6 ++ (signals-error (with-open-stream (s (make-broadcast-stream)) (logical-pathname s)) type-error) ++ t) ++ ++(deftest logical-pathname.error.7 ++ (signals-error (with-open-stream (s (make-concatenated-stream)) (logical-pathname s)) type-error) ++ t) ++ ++(deftest logical-pathname.error.8 ++ (signals-error (with-open-stream (s (make-string-input-stream "foo")) ++ (logical-pathname s)) type-error) ++ t) ++ ++(deftest logical-pathname.error.9 ++ (signals-error (with-output-to-string (s) (logical-pathname s)) type-error) ++ t) ++ ++(deftest logical-pathname.error.10 ++ (handler-case ++ (progn (eval '(locally (declare (optimize safety)) (logical-pathname "CLROOT:%"))) t) ++ (type-error () t)) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-broadcast-stream.lsp +@@ -0,0 +1,99 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 29 21:28:25 2004 ++;;;; Contains: Tests of MAKE-BROADCAST-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-broadcast-stream.1 ++ (let ((s (make-broadcast-stream))) ++ (assert (typep s 'stream)) ++ (assert (typep s 'broadcast-stream)) ++ (assert (output-stream-p s)) ++ ;; (assert (not (input-stream-p s))) ++ (assert (open-stream-p s)) ++ (assert (streamp s)) ++ ;; (assert (eq (stream-element-type s) t)) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'broadcast-stream)) ++ (notnot (output-stream-p s)) ++ (progn (write-char #\x s) nil) ++ )) ++ t t t nil) ++ ++(deftest make-broadcast-stream.2 ++ (with-output-to-string ++ (s1) ++ (let ((s (make-broadcast-stream s1))) ++ (assert (typep s 'stream)) ++ (assert (typep s 'broadcast-stream)) ++ (assert (output-stream-p s)) ++ ;; (assert (not (input-stream-p s))) ++ (assert (open-stream-p s)) ++ (assert (streamp s)) ++ (assert (eql (stream-element-type s) ++ (stream-element-type s1))) ++ (write-char #\x s))) ++ "x") ++ ++(deftest make-broadcast-stream.3 ++ (let ((s1 (make-string-output-stream)) ++ (s2 (make-string-output-stream))) ++ (let ((s (make-broadcast-stream s1 s2))) ++ (assert (typep s 'stream)) ++ (assert (typep s 'broadcast-stream)) ++ (assert (output-stream-p s)) ++ ;; (assert (not (input-stream-p s))) ++ (assert (open-stream-p s)) ++ (assert (streamp s)) ++ (assert (eql (stream-element-type s) ++ (stream-element-type s2))) ++ (format s "This is a test")) ++ (values ++ (get-output-stream-string s1) ++ (get-output-stream-string s2))) ++ "This is a test" ++ "This is a test") ++ ++(deftest make-broadcast-stream.4 ++ (fresh-line (make-broadcast-stream)) ++ nil) ++ ++(deftest make-broadcast-stream.5 ++ (file-length (make-broadcast-stream)) ++ 0) ++ ++(deftest make-broadcast-stream.6 ++ (file-position (make-broadcast-stream)) ++ 0) ++ ++(deftest make-broadcast-stream.7 ++ (file-string-length (make-broadcast-stream) "antidisestablishmentarianism") ++ 1) ++ ++(deftest make-broadcast-stream.8 ++ (stream-external-format (make-broadcast-stream)) ++ :default) ++ ++ ++ ++;;; FIXME ++;;; Add tests for: close, ++;;; peek-char, read-char-no-hang, terpri, fresh-line, unread-char, ++;;; read-line, write-line, write-string, read-sequence, write-sequence, ++;;; read-byte, write-byte, listen, clear-input, finish-output, force-output, ++;;; clear-output, print, prin1 princ ++ ++;;; Error tests ++ ++(deftest make-broadcast-stream.error.1 ++ (check-type-error #'make-broadcast-stream ++ #'(lambda (x) (and (streamp x) (output-stream-p x)))) ++ nil) ++ ++(deftest make-broadcast-stream.error.2 ++ (check-type-error #'make-broadcast-stream ++ #'(lambda (x) (and (streamp x) (output-stream-p x))) ++ *streams*) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-concatenated-stream.lsp +@@ -0,0 +1,323 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 08:41:18 2004 ++;;;; Contains: Tests of MAKE-CONCATENATED-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-concatenated-stream.1 ++ (let ((s (make-concatenated-stream))) ++ (read s nil :eof)) ++ :eof) ++ ++(deftest make-concatenated-stream.2 ++ (let ((s (make-concatenated-stream))) ++ (notnot-mv (input-stream-p s))) ++ t) ++ ++(deftest make-concatenated-stream.3 ++ (let ((s (make-concatenated-stream))) ++ (output-stream-p s)) ++ nil) ++ ++(deftest make-concatenated-stream.4 ++ (let ((s (make-concatenated-stream))) ++ (notnot-mv (streamp s))) ++ t) ++ ++(deftest make-concatenated-stream.5 ++ (let ((s (make-concatenated-stream))) ++ (notnot-mv (typep s 'stream))) ++ t) ++ ++(deftest make-concatenated-stream.6 ++ (let ((s (make-concatenated-stream))) ++ (notnot-mv (typep s 'concatenated-stream))) ++ t) ++ ++(deftest make-concatenated-stream.7 ++ (let ((s (make-concatenated-stream))) ++ (notnot-mv (open-stream-p s))) ++ t) ++ ++(deftest make-concatenated-stream.8 ++ (let ((s (make-concatenated-stream *standard-input*))) ++ (notnot-mv (stream-element-type s))) ++ t) ++ ++(deftest make-concatenated-stream.9 ++ (let ((pn #p"tmp.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (s pn :direction :output :element-type element-type ++ :if-exists :supersede) ++ (dolist (b '(1 5 9 13)) (write-byte b s))) ++ (with-open-file ++ (s1 pn :direction :input :element-type element-type) ++ (with-open-file ++ (s2 pn :direction :input :element-type element-type) ++ (let ((s (make-concatenated-stream s1 s2))) ++ (loop repeat 8 collect (read-byte s)))))) ++ (1 5 9 13 1 5 9 13)) ++ ++(deftest make-concatenated-stream.10 ++ (let ((s (make-concatenated-stream))) ++ (read-byte s nil :eof)) ++ :eof) ++ ++(deftest make-concatenated-stream.11 ++ (let ((s (make-concatenated-stream))) ++ (peek-char nil s nil :eof)) ++ :eof) ++ ++(deftest make-concatenated-stream.12 ++ (with-input-from-string ++ (s1 "a") ++ (with-input-from-string ++ (s2 "b") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (values ++ (peek-char nil s) ++ (read-char s) ++ (peek-char nil s) ++ (read-char s) ++ (peek-char nil s nil :eof))))) ++ #\a #\a #\b #\b :eof) ++ ++(deftest make-concatenated-stream.13 ++ (with-input-from-string ++ (s1 " a ") ++ (with-input-from-string ++ (s2 " b ") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (values ++ (peek-char t s) ++ (read-char s) ++ (peek-char t s) ++ (read-char s) ++ (peek-char t s nil :eof))))) ++ #\a #\a #\b #\b :eof) ++ ++(deftest make-concatenated-stream.14 ++ (with-input-from-string ++ (s1 "a") ++ (with-input-from-string ++ (s2 "b") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (values ++ (read-char s) ++ (unread-char #\a s) ++ (read-char s) ++ (read-char s) ++ (unread-char #\b s) ++ (read-char s) ++ (read-char s nil :eof))))) ++ #\a nil #\a #\b nil #\b :eof) ++ ++(deftest make-concatenated-stream.15 ++ (let ((s (make-concatenated-stream))) ++ (read-char-no-hang s nil :eof)) ++ :eof) ++ ++(deftest make-concatenated-stream.16 ++ (with-input-from-string ++ (s1 "a") ++ (with-input-from-string ++ (s2 "b") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (values ++ (read-char-no-hang s) ++ (read-char-no-hang s) ++ (read-char-no-hang s nil :eof))))) ++ #\a #\b :eof) ++ ++(deftest make-concatenated-stream.17 ++ (with-input-from-string ++ (s1 "a") ++ (with-input-from-string ++ (s2 "b") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (multiple-value-bind (str mnp) ++ (read-line s) ++ (values str (notnot mnp)))))) ++ "ab" t) ++ ++(deftest make-concatenated-stream.18 ++ (with-input-from-string ++ (s1 "ab") ++ (with-input-from-string ++ (s2 "") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (multiple-value-bind (str mnp) ++ (read-line s) ++ (values str (notnot mnp)))))) ++ "ab" t) ++ ++(deftest make-concatenated-stream.19 ++ (with-input-from-string ++ (s1 "") ++ (with-input-from-string ++ (s2 "ab") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (multiple-value-bind (str mnp) ++ (read-line s) ++ (values str (notnot mnp)))))) ++ "ab" t) ++ ++(deftest make-concatenated-stream.20 ++ (with-input-from-string ++ (s1 "ab") ++ (with-input-from-string ++ (s2 (concatenate 'string (string #\Newline) "def")) ++ (let ((s (make-concatenated-stream s1 s2))) ++ (read-line s)))) ++ "ab" nil) ++ ++(deftest make-concatenated-stream.21 ++ (with-input-from-string ++ (s1 "") ++ (with-input-from-string ++ (s2 "") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (multiple-value-bind (str mnp) ++ (read-line s nil :eof) ++ (values str (notnot mnp)))))) ++ :eof t) ++ ++(deftest make-concatenated-stream.22 ++ (let ((pn #p"tmp.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (s pn :direction :output :element-type element-type ++ :if-exists :supersede) ++ (dolist (b '(1 5 9 13)) (write-byte b s))) ++ (with-open-file ++ (s1 pn :direction :input :element-type element-type) ++ (with-open-file ++ (s2 pn :direction :input :element-type element-type) ++ (let ((s (make-concatenated-stream s1 s2)) ++ (x (vector nil nil nil nil nil nil nil nil))) ++ (values ++ (read-sequence x s) ++ x))))) ++ 8 ++ #(1 5 9 13 1 5 9 13)) ++ ++(deftest make-concatenated-stream.23 ++ (let ((pn #p"tmp.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (s pn :direction :output :element-type element-type ++ :if-exists :supersede) ++ (dolist (b '(1 5 9 13)) (write-byte b s))) ++ (with-open-file ++ (s1 pn :direction :input :element-type element-type) ++ (with-open-file ++ (s2 pn :direction :input :element-type element-type) ++ (let ((s (make-concatenated-stream s1 s2)) ++ (x (vector nil nil nil nil nil nil))) ++ (values ++ (read-sequence x s) ++ x))))) ++ 6 ++ #(1 5 9 13 1 5)) ++ ++(deftest make-concatenated-stream.24 ++ (let ((pn #p"tmp.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (s pn :direction :output :element-type element-type ++ :if-exists :supersede) ++ (dolist (b '(1 5 9 13)) (write-byte b s))) ++ (with-open-file ++ (s1 pn :direction :input :element-type element-type) ++ (with-open-file ++ (s2 pn :direction :input :element-type element-type) ++ (let ((s (make-concatenated-stream s1 s2)) ++ (x (vector nil nil nil nil nil nil nil nil nil nil))) ++ (values ++ (read-sequence x s) ++ x))))) ++ 8 ++ #(1 5 9 13 1 5 9 13 nil nil)) ++ ++(deftest make-concatenated-stream.25 ++ (close (make-concatenated-stream)) ++ t) ++ ++(deftest make-concatenated-stream.26 ++ (let ((s (make-concatenated-stream))) ++ (values (prog1 (close s) (close s)) ++ (open-stream-p s))) ++ t nil) ++ ++(deftest make-concatenated-stream.27 ++ (with-input-from-string ++ (s1 "abc") ++ (let ((s (make-concatenated-stream s1))) ++ (values ++ (notnot (open-stream-p s1)) ++ (notnot (open-stream-p s)) ++ (close s) ++ (notnot (open-stream-p s1)) ++ (open-stream-p s)))) ++ t t t t nil) ++ ++(deftest make-concatenated-stream.28 ++ (with-input-from-string ++ (s1 "a") ++ (let ((s (make-concatenated-stream s1))) ++ (notnot-mv (listen s)))) ++ t) ++ ++(deftest make-concatenated-stream.28a ++ (listen (make-concatenated-stream)) ++ nil) ++ ++(deftest make-concatenated-stream.29 ++ (with-input-from-string ++ (s1 "") ++ (let ((s (make-concatenated-stream s1))) ++ (listen s))) ++ nil) ++ ++(deftest make-concatenated-stream.30 ++ (with-input-from-string ++ (s1 "") ++ (with-input-from-string ++ (s2 "a") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (notnot-mv (listen s))))) ++ t) ++ ++(deftest make-concatenated-stream.31 ++ (with-input-from-string ++ (s1 "") ++ (with-input-from-string ++ (s2 "") ++ (let ((s (make-concatenated-stream s1 s2))) ++ (listen s)))) ++ nil) ++ ++(deftest make-concatenated-stream.32 ++ (clear-input (make-concatenated-stream)) ++ nil) ++ ++(deftest make-concatenated-stream.33 ++ (with-input-from-string ++ (s1 "abc") ++ (clear-input (make-concatenated-stream s1))) ++ nil) ++ ++;;; Error cases ++ ++(deftest make-concatenated-stream.error.1 ++ (loop for x in *mini-universe* ++ unless (or (and (streamp x) (input-stream-p x)) ++ (eval `(signals-error (make-concatenated-stream ',x) t))) ++ collect x) ++ nil) ++ ++(deftest make-concatenated-stream.error.2 ++ (loop for x in *streams* ++ unless (or (and (streamp x) (input-stream-p x)) ++ (eval `(signals-error (make-concatenated-stream ',x) t))) ++ collect x) ++ nil) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-echo-stream.lsp +@@ -0,0 +1,332 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Feb 12 04:34:42 2004 ++;;;; Contains: Tests of MAKE-ECHO-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-echo-stream.1 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (read-char s) ++ (get-output-stream-string os))) ++ #\f "f") ++ ++(deftest make-echo-stream.2 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (get-output-stream-string os)) ++ "") ++ ++(deftest make-echo-stream.3 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values (read-line s nil) ++ (get-output-stream-string os))) ++ "foo" "foo") ++ ++;;; Tests of READ-BYTE on echo streams ++ ++(deftest make-echo-stream.4 ++ (let ((pn #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (os pn ++ :direction :output ++ :element-type element-type ++ :if-exists :supersede) ++ (loop for x in '(2 3 5 7 11) ++ do (write-byte x os))) ++ (with-open-file ++ (is pn :direction :input :element-type element-type) ++ (values ++ (with-open-file ++ (os pn2 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (let ((s (make-echo-stream is os))) ++ (loop repeat 6 collect (read-byte s nil :eof1)))) ++ (with-open-file ++ (s pn2 :direction :input :element-type element-type) ++ (loop repeat 6 collect (read-byte s nil :eof2)))))) ++ (2 3 5 7 11 :eof1) ++ (2 3 5 7 11 :eof2)) ++ ++(deftest make-echo-stream.5 ++ (let ((pn #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (os pn ++ :direction :output ++ :element-type element-type ++ :if-exists :supersede) ++ (loop for x in '(2 3 5 7 11) ++ do (write-byte x os))) ++ (with-open-file ++ (is pn :direction :input :element-type element-type) ++ (values ++ (with-open-file ++ (os pn2 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (let ((s (make-echo-stream is os))) ++ (loop repeat 6 collect (read-byte s nil 100)))) ++ (with-open-file ++ (s pn2 :direction :input :element-type element-type) ++ (loop repeat 6 collect (read-byte s nil 200)))))) ++ (2 3 5 7 11 100) ++ (2 3 5 7 11 200)) ++ ++(deftest make-echo-stream.6 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values (coerce (loop repeat 3 collect (read-char-no-hang s)) 'string) ++ (get-output-stream-string os))) ++ "foo" "foo") ++ ++(deftest make-echo-stream.7 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values (coerce (loop repeat 4 collect (read-char-no-hang s nil '#\z)) ++ 'string) ++ (get-output-stream-string os))) ++ "fooz" "foo") ++ ++;;; peek-char + echo streams is tested in peek-char.lsp ++;;; unread-char + echo streams is tested in unread-char.lsp ++ ++(deftest make-echo-stream.8 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os)) ++ (x (copy-seq "xxxxxx"))) ++ (values ++ (read-sequence x s) ++ x ++ (get-output-stream-string os))) ++ 3 ++ "fooxxx" ++ "foo") ++ ++(deftest make-echo-stream.9 ++ (let ((pn #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (os pn ++ :direction :output ++ :element-type element-type ++ :if-exists :supersede) ++ (loop for x in '(2 3 5 7 11) ++ do (write-byte x os))) ++ (with-open-file ++ (is pn :direction :input :element-type element-type) ++ (values ++ (with-open-file ++ (os pn2 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (let ((s (make-echo-stream is os)) ++ (x (vector 0 0 0 0 0 0 0 0))) ++ (list (read-sequence x s) ++ x))) ++ (with-open-file ++ (s pn2 :direction :input :element-type element-type) ++ (loop repeat 8 collect (read-byte s nil nil)))))) ++ (5 #(2 3 5 7 11 0 0 0)) ++ (2 3 5 7 11 nil nil nil)) ++ ++(deftest make-echo-stream.10 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (notnot (open-stream-p s)) ++ (close s) ++ (open-stream-p s) ++ (notnot (open-stream-p is)) ++ (notnot (open-stream-p os)))) ++ t t nil t t) ++ ++(deftest make-echo-stream.11 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (notnot (listen s)) ++ (read-char s) ++ (notnot (listen s)) ++ (read-char s) ++ (notnot (listen s)) ++ (read-char s) ++ (listen s))) ++ t #\f t #\o t #\o nil) ++ ++(deftest make-echo-stream.12 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (notnot (streamp s)) ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'echo-stream)) ++ (notnot (input-stream-p s)) ++ (notnot (output-stream-p s)) ++ (notnot (stream-element-type s)))) ++ t t t t t t) ++ ++;;; FIXME ++;;; Add tests for clear-input, file-position(?) ++;;; Also, add tests for output operations (since echo-streams are ++;;; bidirectional) ++ ++(deftest make-echo-stream.13 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (write-char #\0 s) ++ (close s) ++ (get-output-stream-string os))) ++ #\0 t "0") ++ ++(deftest make-echo-stream.14 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (terpri s) ++ (close s) ++ (get-output-stream-string os))) ++ nil t #.(string #\Newline)) ++ ++(deftest make-echo-stream.15 ++ (let ((pn #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (os pn ++ :direction :output ++ :element-type element-type ++ :if-exists :supersede)) ++ (with-open-file ++ (is pn :direction :input :element-type element-type) ++ (values ++ (with-open-file ++ (os pn2 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (let ((s (make-echo-stream is os)) ++ (x (mapcar #'char-code (coerce "abcdefg" 'list)))) ++ (loop for b in x do ++ (assert (equal (list b) ++ (multiple-value-list (write-byte b s))))) ++ (close s))))) ++ (with-open-file ++ (is pn2 :direction :input :element-type element-type) ++ (let ((x (vector 0 0 0 0 0 0 0))) ++ (read-sequence x is) ++ (values ++ (read-byte is nil :done) ++ (map 'string #'code-char x))))) ++ :done ++ "abcdefg") ++ ++(deftest make-echo-stream.16 ++ (let ((pn #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (os pn ++ :direction :output ++ :element-type element-type ++ :if-exists :supersede)) ++ (with-open-file ++ (is pn :direction :input :element-type element-type) ++ (values ++ (with-open-file ++ (os pn2 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (let ((s (make-echo-stream is os)) ++ (x (map 'vector #'char-code "abcdefg"))) ++ (assert (equal (multiple-value-list (write-sequence x s)) (list x))) ++ (close s))))) ++ (with-open-file ++ (is pn2 :direction :input :element-type element-type) ++ (let ((x (vector 0 0 0 0 0 0 0))) ++ (read-sequence x is) ++ (values ++ (read-byte is nil :done) ++ (map 'string #'code-char x))))) ++ :done ++ "abcdefg") ++ ++(deftest make-echo-stream.17 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (write-char #\X s) ++ (notnot (fresh-line s)) ++ (finish-output s) ++ (force-output s) ++ (close s) ++ (get-output-stream-string os))) ++ #\X t nil nil t #.(coerce '(#\X #\Newline) 'string)) ++ ++(deftest make-echo-stream.18 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (write-string "159" s) ++ (close s) ++ (get-output-stream-string os))) ++ "159" t "159") ++ ++(deftest make-echo-stream.20 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (write-string "0159X" s :start 1 :end 4) ++ (close s) ++ (get-output-stream-string os))) ++ "0159X" t "159") ++ ++(deftest make-echo-stream.21 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (write-line "159" s) ++ (close s) ++ (get-output-stream-string os))) ++ "159" t #.(concatenate 'string "159" (string #\Newline))) ++ ++(deftest make-echo-stream.22 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-echo-stream is os))) ++ (values ++ (write-char #\0 s) ++ (clear-output s))) ++ #\0 nil) ++ ++;;; Error tests ++ ++(deftest make-echo-stream.error.1 ++ (signals-error (make-echo-stream) program-error) ++ t) ++ ++(deftest make-echo-stream.error.2 ++ (signals-error (make-echo-stream *standard-input*) program-error) ++ t) ++ ++(deftest make-echo-stream.error.3 ++ (signals-error (make-echo-stream *standard-input* *standard-output* nil) ++ program-error) ++ t) ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-pathname.lsp +@@ -0,0 +1,171 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Nov 29 05:54:30 2003 ++;;;; Contains: Tests of MAKE-PATHNAME ++ ++(in-package :cl-test) ++ ++(defvar *null-pathname* ++ (make-pathname)) ++ ++(defun make-pathname-test ++ (&rest args &key (defaults nil) ++ (host (if defaults (pathname-host defaults) ++ (pathname-host *default-pathname-defaults*))) ++ (device (if defaults (pathname-device defaults) ++ (pathname-device *null-pathname*))) ++ (directory (if defaults (pathname-directory defaults) ++ (pathname-directory *null-pathname*))) ++ (name (if defaults (pathname-name defaults) ++ (pathname-name *null-pathname*))) ++ (type (if defaults (pathname-type defaults) ++ (pathname-type *null-pathname*))) ++ (version (if defaults (pathname-version defaults) ++ (pathname-version *null-pathname*))) ++ case) ++ (declare (ignorable case)) ++ (let* ((vals (multiple-value-list (apply #'make-pathname args))) ++ (pn (first vals))) ++ (and (= (length vals) 1) ++ (typep pn 'pathname) ++ (equalp (pathname-host pn) host) ++ (equalp (pathname-device pn) device) ++ ;; (equalp (pathname-directory pn) directory) ++ (let ((pnd (pathname-directory pn))) ++ (if (eq directory :wild) ++ (member pnd '((:absolute :wild-inferiors) ++ (:absolute :wild)) ++ :test #'equal) ++ (equalp pnd directory))) ++ (equalp (pathname-name pn) name) ++ (equalp (pathname-type pn) type) ++ (equalp (pathname-version pn) version) ++ t))) ++ ++ ++ ++(deftest make-pathname.1 ++ (make-pathname-test) ++ t) ++ ++(deftest make-pathname.2 ++ (make-pathname-test :name "foo") ++ t) ++ ++(deftest make-pathname.2a ++ (do-special-strings ++ (s "foo") ++ (assert (make-pathname-test :name s))) ++ nil) ++ ++(deftest make-pathname.3 ++ (make-pathname-test :name "foo" :type "txt") ++ t) ++ ++(deftest make-pathname.3a ++ (do-special-strings ++ (s "txt") ++ (assert (make-pathname-test :name "foo" :type s))) ++ nil) ++ ++(deftest make-pathname.4 ++ (make-pathname-test :type "lsp") ++ t) ++ ++(deftest make-pathname.5 ++ (make-pathname-test :directory :wild) ++ t) ++ ++(deftest make-pathname.6 ++ (make-pathname-test :name :wild) ++ t) ++ ++(deftest make-pathname.7 ++ (make-pathname-test :type :wild) ++ t) ++ ++(deftest make-pathname.8 ++ (make-pathname-test :version :wild) ++ t) ++ ++(deftest make-pathname.9 ++ (make-pathname-test :defaults *default-pathname-defaults*) ++ t) ++ ++(deftest make-pathname.10 ++ (make-pathname-test :defaults (make-pathname :name "foo" :type "bar")) ++ t) ++ ++(deftest make-pathname.11 ++ (make-pathname-test :version :newest) ++ t) ++ ++(deftest make-pathname.12 ++ (make-pathname-test :case :local) ++ t) ++ ++(deftest make-pathname.13 ++ (make-pathname-test :case :common) ++ t) ++ ++(deftest make-pathname.14 ++ (let ((*default-pathname-defaults* ++ (make-pathname :name "foo" :type "lsp" :version :newest))) ++ (make-pathname-test)) ++ t) ++ ++;;; Works on the components of actual pathnames ++(deftest make-pathname.rebuild ++ (loop for p in *pathnames* ++ for host = (pathname-host p) ++ for device = (pathname-device p) ++ for directory = (pathname-directory p) ++ for name = (pathname-name p) ++ for type = (pathname-type p) ++ for version = (pathname-version p) ++ for p2 = (make-pathname ++ :host host ++ :device device ++ :directory directory ++ :name name ++ :type type ++ :version version) ++ unless (equal p p2) ++ collect (list p p2)) ++ nil) ++ ++;;; Various constraints on :directory ++ ++(deftest make-pathname-error-absolute-up ++ (signals-error (directory (make-pathname :directory '(:absolute :up))) ++ file-error) ++ t) ++ ++(deftest make-pathname-error-absolute-back ++ (signals-error (directory (make-pathname :directory '(:absolute :back))) ++ file-error) ++ t) ++ ++;; The next test is correct, but was causing very large amounts of time to be spent ++;; in buggy implementations ++;;#| ++(deftest make-pathname-error-absolute-wild-inferiors-up ++ (signals-error (directory (make-pathname :directory '(:absolute :wild-inferiors :up))) ++ file-error) ++ t) ++;;|# ++ ++(deftest make-pathname-error-relative-wild-inferiors-up ++ (signals-error (length (directory (make-pathname :directory '(:relative :wild-inferiors :up)))) ++ file-error) ++ t) ++ ++(deftest make-pathname-error-absolute-wild-inferiors-back ++ (signals-error (directory (make-pathname :directory '(:absolute :wild-inferiors :back))) ++ file-error) ++ t) ++ ++(deftest make-pathname-error-relative-wild-inferiors-back ++ (signals-error (directory (make-pathname :directory '(:relative :wild-inferiors :back))) ++ file-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-string-input-stream.lsp +@@ -0,0 +1,93 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 18:36:48 2004 ++;;;; Contains: Tests for MAKE-STRING-INPUT-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-string-input-stream.1 ++ (let ((s (make-string-input-stream ""))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (streamp s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s))) ++ t t t nil) ++ ++(deftest make-string-input-stream.2 ++ (let ((s (make-string-input-stream "abcd"))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (streamp s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s))) ++ t t t nil) ++ ++ ++(deftest make-string-input-stream.3 ++ (let ((s (make-string-input-stream "abcd" 1))) ++ (values (read-line s))) ++ "bcd") ++ ++ ++(deftest make-string-input-stream.4 ++ (let ((s (make-string-input-stream "abcd" 0 2))) ++ (values (read-line s))) ++ "ab") ++ ++(deftest make-string-input-stream.5 ++ (let ((s (make-string-input-stream "abcd" 1 nil))) ++ (values (read-line s))) ++ "bcd") ++ ++(deftest make-string-input-stream.6 ++ (let ((str1 (make-array 6 :element-type 'character ++ :initial-contents "abcdef" ++ :fill-pointer 4))) ++ (let ((s (make-string-input-stream str1))) ++ (values (read-line s) (read-char s nil :eof)))) ++ "abcd" :eof) ++ ++(deftest make-string-input-stream.7 ++ (let* ((str1 (make-array 6 :element-type 'character ++ :initial-contents "abcdef")) ++ (str2 (make-array 4 :element-type 'character ++ :displaced-to str1))) ++ (let ((s (make-string-input-stream str2))) ++ (values (read-line s) (read-char s nil :eof)))) ++ "abcd" :eof) ++ ++(deftest make-string-input-stream.8 ++ (let* ((str1 (make-array 6 :element-type 'character ++ :initial-contents "abcdef")) ++ (str2 (make-array 4 :element-type 'character ++ :displaced-to str1 ++ :displaced-index-offset 1))) ++ (let ((s (make-string-input-stream str2))) ++ (values (read-line s) (read-char s nil :eof)))) ++ "bcde" :eof) ++ ++(deftest make-string-input-stream.9 ++ (let ((str1 (make-array 6 :element-type 'character ++ :initial-contents "abcdef" ++ :adjustable t))) ++ (let ((s (make-string-input-stream str1))) ++ (values (read-line s) (read-char s nil :eof)))) ++ "abcdef" :eof) ++ ++(deftest make-string-input-stream.10 ++ :notes (:allow-nil-arrays :nil-vectors-are-strings) ++ (let ((s (make-string-input-stream ++ (make-array 0 :element-type nil)))) ++ (read-char s nil :eof)) ++ :eof) ++ ++;;; Error tests ++ ++(deftest make-string-input-stream.error.1 ++ (signals-error (make-string-input-stream) program-error) ++ t) ++ ++(deftest make-string-input-stream.error.2 ++ (signals-error (make-string-input-stream "abc" 1 2 nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-string-output-stream.lsp +@@ -0,0 +1,139 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 19:42:07 2004 ++;;;; Contains: Tests of MAKE-STRING-OUTPUT-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-string-output-stream.1 ++ (let ((s (make-string-output-stream))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.2 ++ (let ((s (make-string-output-stream :element-type 'character))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.3 ++ (let ((s (make-string-output-stream :element-type 'base-char))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.4 ++ :notes (:nil-vectors-are-strings) ++ (let ((s (make-string-output-stream :element-type nil))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.5 ++ (let ((s (make-string-output-stream :allow-other-keys nil))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.6 ++ (let ((s (make-string-output-stream :allow-other-keys t :foo 'bar))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.7 ++ (let ((s (make-string-output-stream :foo 'bar :allow-other-keys t ++ :allow-other-keys nil ++ :foo2 'x))) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (input-stream-p s) ++ (notnot (output-stream-p s)) ++ (notnot (open-stream-p s)))) ++ t t nil t t) ++ ++(deftest make-string-output-stream.8 ++ (let ((s (make-string-output-stream))) ++ (write-string "abc" s) ++ (write-string "def" s) ++ (get-output-stream-string s)) ++ "abcdef") ++ ++(deftest make-string-output-stream.9 ++ (let ((s (make-string-output-stream :element-type 'character))) ++ (write-string "abc" s) ++ (write-string "def" s) ++ (get-output-stream-string s)) ++ "abcdef") ++ ++(deftest make-string-output-stream.10 ++ (let ((s (make-string-output-stream :element-type 'base-char))) ++ (write-string "abc" s) ++ (write-string "def" s) ++ (get-output-stream-string s)) ++ "abcdef") ++ ++(deftest make-string-output-stream.11 ++ :notes (:nil-vectors-are-strings) ++ (let ((s (make-string-output-stream :element-type nil))) ++ (get-output-stream-string s)) ++ "") ++ ++(deftest make-string-output-stream.12 ++ :notes (:nil-vectors-are-strings) ++ (let ((s (make-string-output-stream :element-type nil))) ++ (typep #\a (array-element-type (get-output-stream-string s)))) ++ nil) ++ ++(deftest make-string-output-stream.13 ++ (let ((s (make-string-output-stream))) ++ (values ++ (close s) ++ (open-stream-p s))) ++ t nil) ++ ++;;; Error tests ++ ++(deftest make-string-output-stream.error.1 ++ (signals-error (make-string-output-stream nil) program-error) ++ t) ++ ++(deftest make-string-output-stream.error.2 ++ (signals-error (make-string-output-stream :foo nil) program-error) ++ t) ++ ++(deftest make-string-output-stream.error.3 ++ (signals-error (make-string-output-stream :allow-other-keys nil ++ :foo 'bar) ++ program-error) ++ t) ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-synonym-stream.lsp +@@ -0,0 +1,97 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 28 06:54:33 2004 ++;;;; Contains: Tests of MAKE-SYNONYM-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-synonym-stream.1 ++ (with-input-from-string ++ (*s* "abcde") ++ (declare (special *s*)) ++ (let ((ss (make-synonym-stream '*s*))) ++ (assert (typep ss 'stream)) ++ (assert (typep ss 'synonym-stream)) ++ (assert (input-stream-p ss)) ++ (assert (not (output-stream-p ss))) ++ (assert (open-stream-p ss)) ++ (assert (streamp ss)) ++ (assert (stream-element-type ss)) ++ (values ++ (read-char *s*) ++ (read-char ss) ++ (read-char *s*) ++ (read-char ss) ++ (read-char ss)))) ++ #\a #\b #\c #\d #\e) ++ ++ ++;;; This test was wrong (section 21.1.4) ++#| ++(deftest make-synonym-stream.2 ++ (let ((ss (make-synonym-stream '*s*))) ++ (with-input-from-string ++ (*s* "z") ++ (declare (special *s*)) ++ (assert (typep ss 'stream)) ++ (assert (typep ss 'synonym-stream)) ++ (assert (input-stream-p ss)) ++ (assert (not (output-stream-p ss))) ++ (assert (open-stream-p ss)) ++ (assert (streamp ss)) ++ (assert (stream-element-type ss)) ++ (read-char ss))) ++ #\z) ++|# ++ ++(deftest make-synonym-stream.3 ++ (with-output-to-string ++ (*s*) ++ (declare (special *s*)) ++ (let ((ss (make-synonym-stream '*s*))) ++ (assert (typep ss 'stream)) ++ (assert (typep ss 'synonym-stream)) ++ (assert (output-stream-p ss)) ++ (assert (not (input-stream-p ss))) ++ (assert (open-stream-p ss)) ++ (assert (streamp ss)) ++ (assert (stream-element-type ss)) ++ (write-char #\a *s*) ++ (write-char #\b ss) ++ (write-char #\x *s*) ++ (write-char #\y ss))) ++ "abxy") ++ ++(deftest make-synonym-stream.4 ++ (let ((ss (make-synonym-stream '*terminal-io*))) ++ (assert (typep ss 'stream)) ++ (assert (typep ss 'synonym-stream)) ++ (assert (output-stream-p ss)) ++ (assert (input-stream-p ss)) ++ (assert (open-stream-p ss)) ++ (assert (streamp ss)) ++ (assert (stream-element-type ss)) ++ nil) ++ nil) ++ ++ ++;;; FIXME ++;;; Add tests for: close, ++;;; peek-char, read-char-no-hang, terpri, fresh-line, unread-char, ++;;; read-line, write-line, write-string, read-sequence, write-sequence, ++;;; read-byte, write-byte, listen, clear-input, finish-output, force-output, ++;;; clear-output, format, print, prin1, princ ++ ++;;; Error cases ++ ++(deftest make-synonym-stream.error.1 ++ (signals-error (make-synonym-stream) program-error) ++ t) ++ ++(deftest make-synonym-stream.error.2 ++ (signals-error (make-synonym-stream '*standard-input* nil) program-error) ++ t) ++ ++(deftest make-synonym-stream.error.3 ++ (check-type-error #'make-synonym-stream #'symbolp) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/make-two-way-stream.lsp +@@ -0,0 +1,244 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Fri Jan 30 05:39:56 2004 ++;;;; Contains: Tests for MAKE-TWO-WAY-STREAM ++ ++(in-package :cl-test) ++ ++(deftest make-two-way-stream.1 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (assert (typep s 'stream)) ++ (assert (typep s 'two-way-stream)) ++ (assert (streamp s)) ++ (assert (open-stream-p s)) ++ (assert (input-stream-p s)) ++ (assert (output-stream-p s)) ++ (assert (stream-element-type s)) ++ (values ++ (read-char s) ++ (write-char #\b s) ++ (read-char s) ++ (write-char #\a s) ++ (read-char s) ++ (write-char #\r s) ++ (get-output-stream-string os))) ++ #\f #\b #\o #\a #\o #\r "bar") ++ ++(deftest make-two-way-stream.2 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (close s) ++ (open-stream-p s) ++ (notnot (open-stream-p is)) ++ (notnot (open-stream-p os)) ++ (write-char #\8 os) ++ (get-output-stream-string os))) ++ t nil t t #\8 "8") ++ ++(deftest make-two-way-stream.3 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (peek-char nil s) ++ (read-char s) ++ (get-output-stream-string os))) ++ #\f #\f "") ++ ++(deftest make-two-way-stream.4 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (read-char-no-hang s) ++ (read-char-no-hang s nil) ++ (read-char-no-hang s t :eof) ++ (read-char-no-hang s nil :eof) ++ (get-output-stream-string os))) ++ #\f #\o #\o :eof "") ++ ++(deftest make-two-way-stream.5 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (terpri s) ++ (get-output-stream-string os))) ++ nil #.(string #\Newline)) ++ ++(deftest make-two-way-stream.6 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (write-char #\+ s) ++ (notnot (fresh-line s)) ++ (read-char s) ++ (get-output-stream-string os))) ++ #\+ t #\f #.(coerce (list #\+ #\Newline) 'string)) ++ ++(deftest make-two-way-stream.7 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (read-char s) ++ (unread-char #\f s) ++ (read-char s) ++ (read-char s) ++ (unread-char #\o s) ++ (get-output-stream-string os))) ++ #\f nil #\f #\o nil "") ++ ++(deftest make-two-way-stream.8 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (read-line s) ++ (get-output-stream-string os))) ++ "foo" "") ++ ++(deftest make-two-way-stream.9 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (write-string "bar" s) ++ (get-output-stream-string os))) ++ "bar" "bar") ++ ++(deftest make-two-way-stream.10 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (write-line "bar" s) ++ (get-output-stream-string os))) ++ "bar" #.(concatenate 'string "bar" '(#\Newline))) ++ ++(deftest make-two-way-stream.11 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (let ((x (vector nil nil nil))) ++ (values ++ (read-sequence x s) ++ x ++ (get-output-stream-string os)))) ++ 3 #(#\f #\o #\o) "") ++ ++(deftest make-two-way-stream.12 ++ (let ((pn1 #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 8))) ++ (with-open-file (s pn1 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (dolist (b '(3 8 19 41)) (write-byte b s))) ++ (with-open-file ++ (is pn1 :direction :input :element-type element-type) ++ (with-open-file ++ (os pn2 :direction :output :element-type element-type ++ :if-exists :supersede) ++ (let ((s (make-two-way-stream is os)) ++ (x (vector nil nil nil nil))) ++ (assert (eql (read-sequence x s) 4)) ++ (assert (equalp x #(3 8 19 41))) ++ (let ((y #(100 5 18 211 0 178))) ++ (assert (eql (write-sequence y s) y)) ++ (close s))))) ++ (with-open-file ++ (s pn2 :direction :input :element-type element-type) ++ (let ((x (vector nil nil nil nil nil nil nil))) ++ (values ++ (read-sequence x s) ++ x)))) ++ 6 ++ #(100 5 18 211 0 178 nil)) ++ ++(deftest make-two-way-stream.13 ++ (let ((pn1 #p"tmp.dat") ++ (pn2 #p"tmp2.dat") ++ (element-type '(unsigned-byte 32))) ++ (with-open-file (s pn1 :direction :output :if-exists :supersede ++ :element-type element-type) ++ (dolist (b '(3 8 19 41)) (write-byte b s))) ++ (with-open-file ++ (is pn1 :direction :input :element-type element-type) ++ (with-open-file ++ (os pn2 :direction :output :element-type element-type ++ :if-exists :supersede) ++ (let ((s (make-two-way-stream is os)) ++ (x (vector nil nil nil nil))) ++ (assert (eql (read-sequence x s) 4)) ++ (assert (equalp x #(3 8 19 41))) ++ (let ((y #(100 5 18 211 0 178))) ++ (assert (eql (write-sequence y s) y)) ++ (close s))))) ++ (with-open-file ++ (s pn2 :direction :input :element-type element-type) ++ (let ((x (vector nil nil nil nil nil nil nil))) ++ (values ++ (read-sequence x s) ++ x)))) ++ 6 ++ #(100 5 18 211 0 178 nil)) ++ ++(deftest make-two-way-stream.14 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (values ++ (write-string "abc" s) ++ (clear-input s) ++ (write-string "def" s) ++ (get-output-stream-string os))) ++ "abc" nil "def" "abcdef") ++ ++;;; Error tests ++ ++(deftest make-two-way-stream.error.1 ++ (signals-error (make-two-way-stream) program-error) ++ t) ++ ++(deftest make-two-way-stream.error.2 ++ (signals-error (make-two-way-stream (make-string-input-stream "foo")) ++ program-error) ++ t) ++ ++(deftest make-two-way-stream.error.3 ++ (signals-error (let ((os (make-string-output-stream))) ++ (make-two-way-stream (make-string-input-stream "foo") ++ os nil)) ++ program-error) ++ t) ++ ++(deftest make-two-way-stream.error.4 ++ (check-type-error #'(lambda (x) (make-two-way-stream x (make-string-output-stream))) ++ #'(lambda (x) (and (streamp x) (input-stream-p x)))) ++ nil) ++ ++(deftest make-two-way-stream.error.5 ++ (check-type-error #'(lambda (x) (make-two-way-stream x (make-string-output-stream))) ++ #'(lambda (x) (and (streamp x) (input-stream-p x))) ++ *streams*) ++ nil) ++ ++(deftest make-two-way-stream.error.6 ++ (check-type-error #'(lambda (x) (make-two-way-stream (make-string-input-stream "foo") x)) ++ #'(lambda (x) (and (streamp x) (output-stream-p x)))) ++ nil) ++ ++(deftest make-two-way-stream.error.7 ++ (check-type-error #'(lambda (x) (make-two-way-stream (make-string-input-stream "foo") x)) ++ #'(lambda (x) (and (streamp x) (output-stream-p x))) ++ *streams*) ++ nil) ++ ++ ++ ++ +\ No newline at end of file +--- /dev/null ++++ gcl-2.6.12/ansi-tests/merge-pathnames.lsp +@@ -0,0 +1,124 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Dec 31 11:25:55 2003 ++;;;; Contains: Tests of MERGE-PATHNAMES ++ ++(in-package :cl-test) ++ ++#| ++(defun merge-pathnames-test (&rest args) ++ (assert (<= 1 (length args) 3)) ++ (let* ((p1 (car args)) ++ (p2 (if (cdr args) (cadr args) *default-pathname-defaults*)) ++ (default-version (if (cddr args) (caddr args) :newest)) ++ (results (multiple-value-list (apply #'merge-pathnames args)))) ++ (assert (= (length results) 1)) ++ (let ((p3 (first results))) ++ ++|# ++ ++(deftest merge-pathnames.1 ++ (let* ((p1 (make-pathname :name "foo")) ++ (p2 (merge-pathnames p1 p1 nil))) ++ (values ++ (equalpt (pathname-name p1) "foo") ++ (if (equalpt p1 p2) t ++ (list p1 p2)))) ++ t t) ++ ++(deftest merge-pathnames.2 ++ (let* ((p1 (make-pathname :name "foo")) ++ (p2 (merge-pathnames p1 p1))) ++ (values ++ (equalpt (pathname-host p1) (pathname-host p2)) ++ (equalpt (pathname-device p1) (pathname-device p2)) ++ (equalpt (pathname-directory p1) (pathname-directory p2)) ++ (pathname-name p1) ++ (pathname-name p2) ++ (equalpt (pathname-type p1) (pathname-type p2)) ++ (if (pathname-version p1) ++ (equalpt (pathname-version p1) (pathname-version p2)) ++ (equalpt (pathname-version p2) :newest)))) ++ t t t "foo" "foo" t t) ++ ++(deftest merge-pathnames.3 ++ (let* ((p1 (make-pathname :name "foo")) ++ (p2 (make-pathname :name "bar")) ++ (p3 (merge-pathnames p1 p2))) ++ (values ++ (equalpt (pathname-host p1) (pathname-host p3)) ++ (equalpt (pathname-device p1) (pathname-device p3)) ++ (equalpt (pathname-directory p1) (pathname-directory p3)) ++ (pathname-name p1) ++ (pathname-name p3) ++ (equalpt (pathname-type p1) (pathname-type p3)) ++ (if (pathname-version p1) ++ (equalpt (pathname-version p1) (pathname-version p3)) ++ (equalpt (pathname-version p3) :newest)))) ++ t t t "foo" "foo" t t) ++ ++(deftest merge-pathnames.4 ++ (let* ((p1 (make-pathname :name "foo")) ++ (p2 (make-pathname :type "lsp")) ++ (p3 (merge-pathnames p1 p2))) ++ (values ++ (equalpt (pathname-host p1) (pathname-host p3)) ++ (equalpt (pathname-device p1) (pathname-device p3)) ++ (equalpt (pathname-directory p1) (pathname-directory p3)) ++ (pathname-name p1) ++ (pathname-type p2) ++ (pathname-type p3) ++ (equalpt (pathname-type p2) (pathname-type p3)) ++ (if (pathname-version p1) ++ (equalpt (pathname-version p1) (pathname-version p3)) ++ (equalpt (pathname-version p3) :newest)))) ++ t t t "foo" "lsp" "lsp" t t) ++ ++(deftest merge-pathnames.5 ++ (let* ((p1 (make-pathname :name "foo")) ++ (p2 (make-pathname :type "lsp" :version :newest)) ++ (p3 (merge-pathnames p1 p2 nil))) ++ (values ++ (equalpt (pathname-host p1) (pathname-host p3)) ++ (equalpt (pathname-device p1) (pathname-device p3)) ++ (equalpt (pathname-directory p1) (pathname-directory p3)) ++ (pathname-name p1) ++ (pathname-name p3) ++ (pathname-type p2) ++ (pathname-type p3) ++ (equalpt (pathname-version p1) (pathname-version p3)))) ++ t t t "foo" "foo" "lsp" "lsp" t) ++ ++(deftest merge-pathnames.6 ++ (let* ((p1 (make-pathname)) ++ (p2 (make-pathname :name "foo" :version :newest)) ++ (p3 (merge-pathnames p1 p2 nil))) ++ (values ++ (equalpt (pathname-host p1) (pathname-host p3)) ++ (equalpt (pathname-device p1) (pathname-device p3)) ++ (equalpt (pathname-directory p1) (pathname-directory p3)) ++ (pathname-name p2) ++ (pathname-name p3) ++ (equalpt (pathname-type p2) (pathname-type p3)) ++ (pathname-version p2) ++ (pathname-version p3))) ++ t t t "foo" "foo" t :newest :newest) ++ ++(deftest merge-pathnames.7 ++ (let* ((p1 (make-pathname)) ++ (p2 *default-pathname-defaults*) ++ (p3 (merge-pathnames p1))) ++ (values ++ (equalpt (pathname-host p1) (pathname-host p3)) ++ (equalpt (pathname-host p2) (pathname-host p3)) ++ (equalpt (pathname-device p2) (pathname-device p3)) ++ (equalpt (pathname-directory p2) (pathname-directory p3)) ++ (equalpt (pathname-name p2) (pathname-name p3)) ++ (equalpt (pathname-type p2) (pathname-type p3)) ++ (cond ++ ((pathname-version p1) (equalpt (pathname-version p1) ++ (pathname-version p3))) ++ ((pathname-version p2) (equalpt (pathname-version p2) ++ (pathname-version p3))) ++ (t (equalpt (pathname-version p3) :newest))))) ++ t t t t t t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/namestring.lsp +@@ -0,0 +1,64 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Sep 2 07:24:42 2004 ++;;;; Contains: Tests for NAMESTRING ++ ++(in-package :cl-test) ++ ++(deftest namestring.1 ++ (let* ((vals (multiple-value-list (namestring "namestring.lsp"))) ++ (s (first vals))) ++ (if (and (null (cdr vals)) ++ (stringp s) ++ (equal (namestring s) s)) ++ :good ++ vals)) ++ :good) ++ ++(deftest namestring.2 ++ (do-special-strings ++ (s "namestring.lsp" nil) ++ (let ((ns (namestring s))) ++ (assert (stringp ns)) ++ (assert (string= (namestring ns) ns)))) ++ nil) ++ ++;;; I'm not convinced these tested required behavior, so I'm commenting ++;;; them out for now. FIXME: determine if they are bogus ++#| ++(deftest namestring.3 ++ (let* ((name "namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (namestring pn)) ++ (pn2 (pathname name2))) ++ (or (equalt pn pn2) (list (list pn (pathname-host pn) (pathname-device pn) ++ (pathname-directory pn) (pathname-name pn) ++ (pathname-type pn) (pathname-version pn)) ++ (list pn2 (pathname-host pn2) (pathname-device pn2) ++ (pathname-directory pn2) (pathname-name pn2) ++ (pathname-type pn2) (pathname-version pn2))))) ++ t) ++ ++(deftest namestring.4 ++ (let* ((name "namestring.lsp") ++ (pn (merge-pathnames (pathname name))) ++ (name2 (with-open-file (s pn :direction :input) (namestring s))) ++ (pn2 (pathname name2))) ++ (or (equalt pn pn2) (list (list pn (pathname-host pn) (pathname-device pn) ++ (pathname-directory pn) (pathname-name pn) ++ (pathname-type pn) (pathname-version pn)) ++ (list pn2 (pathname-host pn2) (pathname-device pn2) ++ (pathname-directory pn2) (pathname-name pn2) ++ (pathname-type pn2) (pathname-version pn2))))) ++ t) ++|# ++ ++;;; Error tests ++ ++(deftest namestring.error.1 ++ (signals-error (namestring) program-error) ++ t) ++ ++(deftest namestring.error.2 ++ (signals-error (namestring "namestring.lsp" nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/open-stream-p.lsp +@@ -0,0 +1,54 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 19:52:30 2004 ++;;;; Contains: Tests of OPEN-STREAM-P ++ ++(in-package :cl-test) ++ ++(deftest open-stream-p.1 ++ (loop for s in (list *debug-io* *error-output* *query-io* ++ *standard-input* *standard-output* ++ *trace-output* *terminal-io*) ++ for results = (multiple-value-list (open-stream-p s)) ++ unless (and (eql (length results) 1) ++ (car results)) ++ collect s) ++ nil) ++ ++(deftest open-stream-p.2 ++ (with-open-file (s "open-stream-p.lsp" :direction :input) ++ (notnot-mv (open-stream-p s))) ++ t) ++ ++(deftest open-stream-p.3 ++ (with-open-file (s "foo.txt" :direction :output ++ :if-exists :supersede) ++ (notnot-mv (open-stream-p s))) ++ t) ++ ++(deftest open-stream-p.4 ++ (let ((s (open "open-stream-p.lsp" :direction :input))) ++ (close s) ++ (open-stream-p s)) ++ nil) ++ ++(deftest open-stream-p.5 ++ (let ((s (open "foo.txt" :direction :output ++ :if-exists :supersede))) ++ (close s) ++ (open-stream-p s)) ++ nil) ++ ++;;; error tests ++ ++(deftest open-stream-p.error.1 ++ (signals-error (open-stream-p) program-error) ++ t) ++ ++(deftest open-stream-p.error.2 ++ (signals-error (open-stream-p *standard-input* nil) program-error) ++ t) ++ ++(deftest open-stream-p.error.3 ++ (check-type-error #'open-stream-p #'streamp) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/open.lsp +@@ -0,0 +1,1238 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Fri Jan 23 05:36:55 2004 ++;;;; Contains: Tests of OPEN ++ ++(in-package :cl-test) ++ ++;;; Input streams ++ ++(defun generator-for-element-type (type) ++ (etypecase type ++ ((member character base-char) ++ #'(lambda (i) (aref "abcdefghijklmnopqrstuvwxyz" (mod i 26)))) ++ ((member signed-byte unsigned-byte bit) ++ #'(lambda (i) (logand i 1))) ++ (cons ++ (let ((op (car type)) ++ (arg1 (cadr type)) ++ (arg2 (caddr type))) ++ (ecase op ++ (unsigned-byte ++ (let ((mask (1- (ash 1 arg1)))) ++ #'(lambda (i) (logand i mask)))) ++ (signed-byte ++ (let ((mask (1- (ash 1 (1- arg1))))) ++ #'(lambda (i) (logand i mask)))) ++ (integer ++ (let* ((lo arg1) ++ (hi arg2) ++ (lower-bound ++ (etypecase lo ++ (integer lo) ++ (cons (1+ (car lo))))) ++ (upper-bound ++ (etypecase hi ++ (integer hi) ++ (cons (1- (car hi))))) ++ (range (1+ (- upper-bound lower-bound)))) ++ #'(lambda (i) (+ lower-bound (mod i range)))))))))) ++ ++(compile 'generator-for-element-type) ++ ++(defmacro def-open-test (name args form expected ++ &key ++ (notes nil notes-p) ++ (build-form nil build-form-p) ++ (element-type 'character element-type-p) ++ (pathname #p"tmp.dat")) ++ ++ (when element-type-p ++ (setf args (append args (list :element-type `',element-type)))) ++ ++ (unless build-form-p ++ (let ((write-element-form ++ (cond ++ ((subtypep element-type 'integer) ++ `(write-byte ++ (funcall (the function ++ (generator-for-element-type ',element-type)) i) ++ os)) ++ ((subtypep element-type 'character) ++ `(write-char ++ (funcall (the function ++ (generator-for-element-type ',element-type)) i) ++ os))))) ++ (setq build-form ++ `(with-open-file ++ (os pn :direction :output ++ ,@(if element-type-p ++ `(:element-type ',element-type)) ++ :if-exists :supersede) ++ (assert (open-stream-p os)) ++ (dotimes (i 10) ,write-element-form) ++ (finish-output os) ++ )))) ++ ++ `(deftest ,name ++ ,@(when notes-p `(:notes ,notes)) ++ (let ((pn ,pathname)) ++ (delete-all-versions pn) ++ ,build-form ++ (let ((s (open pn ,@args))) ++ (unwind-protect ++ (progn ++ (assert (open-stream-p s)) ++ (assert (typep s 'file-stream)) ++ ,@ ++ (unless (member element-type '(signed-byte unsigned-byte)) ++ #-allegro ++ `((assert (subtypep ',element-type ++ (stream-element-type s)))) ++ #+allegro nil ++ ) ++ ,form) ++ (close s)))) ++ ,@expected)) ++ ++;; (compile 'def-open-test) ++ ++(def-open-test open.1 () (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.2 (:direction :input) ++ (values (read-line s nil)) ("abcdefghij") :element-type character) ++(def-open-test open.3 (:direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.4 (:direction :input) ++ (values (read-line s nil)) ("abcdefghij") :element-type base-char) ++(def-open-test open.5 (:if-exists :error) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.6 (:if-exists :error :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.7 (:if-exists :new-version) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.8 (:if-exists :new-version :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.9 (:if-exists :rename) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.10 (:if-exists :rename :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.11 (:if-exists :rename-and-delete) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.12 (:if-exists :rename-and-delete :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.13 (:if-exists :overwrite) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.14 (:if-exists :overwrite :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.15 (:if-exists :append) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.16 (:if-exists :append :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.17 (:if-exists :supersede) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.18 (:if-exists :supersede :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.19 (:if-exists nil) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.20 (:if-exists nil :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++ ++(def-open-test open.21 (:if-does-not-exist nil) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.22 (:if-does-not-exist nil :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.23 (:if-does-not-exist :error) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.24 (:if-does-not-exist :error :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.25 (:if-does-not-exist :create) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.26 (:if-does-not-exist :create :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++ ++(def-open-test open.27 (:external-format :default) ++ (values (read-line s nil)) ("abcdefghij")) ++(def-open-test open.28 (:external-format :default :direction :input) ++ (values (read-line s nil)) ("abcdefghij")) ++ ++(def-open-test open.29 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 0 1 0 1 0 1 0 1)) :element-type (unsigned-byte 1)) ++(def-open-test open.30 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 0 1 0 1 0 1 0 1)) :element-type (unsigned-byte 1)) ++ ++(def-open-test open.31 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 0 1 2 3 0 1)) :element-type (unsigned-byte 2)) ++(def-open-test open.32 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 0 1 2 3 0 1)) :element-type (unsigned-byte 2)) ++ ++(def-open-test open.33 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 0 1)) :element-type (unsigned-byte 3)) ++(def-open-test open.34 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 0 1)) :element-type (unsigned-byte 3)) ++ ++(def-open-test open.35 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 4)) ++(def-open-test open.36 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 4)) ++ ++(def-open-test open.37 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 5)) ++(def-open-test open.38 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 5)) ++ ++(def-open-test open.39 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 6)) ++(def-open-test open.40 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 6)) ++ ++(def-open-test open.41 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 7)) ++(def-open-test open.42 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 7)) ++ ++(def-open-test open.43 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 8)) ++(def-open-test open.44 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 8)) ++ ++(def-open-test open.45 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 9)) ++(def-open-test open.46 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 9)) ++ ++(def-open-test open.47 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 10)) ++(def-open-test open.48 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 10)) ++ ++(def-open-test open.49 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 20)) ++(def-open-test open.50 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 20)) ++ ++(def-open-test open.51 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 25)) ++(def-open-test open.52 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 25)) ++ ++(def-open-test open.53 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 30)) ++(def-open-test open.54 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 30)) ++ ++(def-open-test open.55 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 32)) ++(def-open-test open.56 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 32)) ++ ++(def-open-test open.57 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 33)) ++(def-open-test open.58 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 2 3 4 5 6 7 8 9)) :element-type (unsigned-byte 33)) ++ ++(def-open-test open.59 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 0 1 0 1 0 1 0 1)) :element-type unsigned-byte) ++(def-open-test open.60 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 0 1 0 1 0 1 0 1)) :element-type unsigned-byte) ++ ++(def-open-test open.61 () ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 0 1 0 1 0 1 0 1)) :element-type signed-byte) ++(def-open-test open.62 (:direction :input) ++ (let ((seq (make-array 10))) (read-sequence seq s) seq) ++ (#(0 1 0 1 0 1 0 1 0 1)) :element-type signed-byte) ++ ++ ++(def-open-test open.63 () ++ (values (read-line s nil)) ("abcdefghij") ++ :pathname "tmp.dat") ++ ++(def-open-test open.64 () ++ (values (read-line s nil)) ("abcdefghij") ++ :pathname (logical-pathname "CLTEST:TMP.DAT")) ++ ++;;; It works on recognizable subtypes. ++(deftest open.65 ++ (let ((type '(or (integer 0 1) (integer 100 200))) ++ (pn #p"tmp.dat") ++ (vals '(0 1 100 120 130 190 200 1 0 150))) ++ (or ++ (not (subtypep type 'integer)) ++ (progn ++ (with-open-file ++ (os pn :direction :output ++ :element-type type ++ :if-exists :supersede) ++ (dolist (e vals) (write-byte e os))) ++ (let ((s (open pn :direction :input ++ :element-type type)) ++ (seq (make-array 10))) ++ (unwind-protect ++ (progn (read-sequence seq s) seq) ++ (close s)) ++ (notnot (every #'eql seq vals)))))) ++ t) ++ ++;;; FIXME: Add -- tests for when the filespec is a stream ++ ++(deftest open.66 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn :direction :io :if-exists :rename-and-delete ++ :if-does-not-exist :create) ++ (format s "some stuff~%") ++ (finish-output s) ++ (let ((is (open s :direction :input))) ++ (unwind-protect ++ (values ++ (read-char is) ++ (notnot (file-position s :start)) ++ (read-line is) ++ (read-line s)) ++ (close is))))) ++ #\s ++ t ++ "ome stuff" ++ "some stuff") ++ ++(deftest open.67 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (let ((s (open pn :direction :output))) ++ (unwind-protect ++ (progn ++ (format s "some stuff~%") ++ (finish-output s) ++ (close s) ++ (let ((is (open s :direction :input))) ++ (unwind-protect ++ (values (read-line is)) ++ (close is)))) ++ (when (open-stream-p s) (close s))))) ++ "some stuff") ++ ++;;; FIXME: Add -- tests for when element-type is :default ++ ++;;; Tests of file creation ++ ++(defmacro def-open-output-test ++ (name args form expected ++ &rest keyargs ++ &key ++ (element-type 'character) ++ (build-form ++ `(dotimes (i 10) ++ ,(cond ++ ((subtypep element-type 'integer) ++ `(write-byte ++ (funcall (the function ++ (generator-for-element-type ',element-type)) i) ++ s)) ++ ((subtypep element-type 'character) ++ `(write-char ++ (funcall (the function ++ (generator-for-element-type ',element-type)) i) ++ s))))) ++ &allow-other-keys) ++ `(def-open-test ,name (:direction :output ,@args) ++ (progn ++ ,build-form ++ (assert (output-stream-p s)) ++ ,form) ++ ,expected ++ :build-form nil ++ ,@keyargs)) ++ ++;; (compile 'def-open-output-test) ++ ++(def-open-output-test open.output.1 () ++ (progn (close s) ++ (with-open-file (is #p"tmp.dat") (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(def-open-output-test open.output.2 () ++ (progn (close s) ++ (with-open-file (is "tmp.dat") (values (read-line is nil)))) ++ ("abcdefghij") ++ :pathname "tmp.dat") ++ ++(def-open-output-test open.output.3 ++ () ++ (progn (close s) ++ (with-open-file (is (logical-pathname "CLTEST:TMP.DAT")) ++ (values (read-line is nil)))) ++ ("abcdefghij") ++ :pathname (logical-pathname "CLTEST:TMP.DAT")) ++ ++(def-open-output-test open.output.4 () ++ (progn (close s) ++ (with-open-file (is #p"tmp.dat" :element-type 'character) ++ (values (read-line is nil)))) ++ ("abcdefghij") ++ :element-type character) ++ ++(def-open-output-test open.output.5 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type 'base-char) ++ (values (read-line is nil)))) ++ ("abcdefghij") ++ :element-type base-char) ++ ++(def-open-output-test open.output.6 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(integer 0 1)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 0 1 0 1 0 1 0 1)) ++ :element-type (integer 0 1)) ++ ++(def-open-output-test open.output.7 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type 'bit) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 0 1 0 1 0 1 0 1)) ++ :element-type bit) ++ ++(def-open-output-test open.output.8 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 1)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 0 1 0 1 0 1 0 1)) ++ :element-type (unsigned-byte 1)) ++ ++(def-open-output-test open.output.9 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 2)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 0 1 2 3 0 1)) ++ :element-type (unsigned-byte 2)) ++ ++(def-open-output-test open.output.10 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 3)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 0 1)) ++ :element-type (unsigned-byte 3)) ++ ++(def-open-output-test open.output.11 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 4)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 4)) ++ ++ ++(def-open-output-test open.output.12 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 6)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 6)) ++ ++(def-open-output-test open.output.13 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 8)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 8)) ++ ++(def-open-output-test open.output.14 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 12)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 12)) ++ ++(def-open-output-test open.output.15 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 16)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 16)) ++ ++(def-open-output-test open.output.16 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 24)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 24)) ++ ++(def-open-output-test open.output.17 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 32)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 32)) ++ ++(def-open-output-test open.output.18 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 64)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 64)) ++ ++(def-open-output-test open.output.19 () ++ (progn (close s) (with-open-file (is #p"tmp.dat" ++ :element-type '(unsigned-byte 100)) ++ (let ((seq (make-array 10))) ++ (read-sequence seq is) ++ seq))) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 100)) ++ ++(deftest open.output.20 ++ (let ((pn #p"tmp.dat")) ++ (with-open-file (s pn :direction :output :if-exists :supersede)) ++ (open pn :direction :output :if-exists nil)) ++ nil) ++ ++(def-open-test open.output.21 (:if-exists :new-version :direction :output) ++ (progn (write-sequence "wxyz" s) ++ (close s) ++ (with-open-file ++ (s pn :direction :input) ++ (values (read-line s nil)))) ++ ("wxyz") ++ :notes (:open-if-exists-new-version-no-error) ++ ) ++ ++(def-open-test open.output.22 (:if-exists :rename :direction :output) ++ (progn (write-sequence "wxyz" s) ++ (close s) ++ (with-open-file ++ (s pn :direction :input) ++ (values (read-line s nil)))) ++ ("wxyz")) ++ ++(def-open-test open.output.23 (:if-exists :rename-and-delete ++ :direction :output) ++ (progn (write-sequence "wxyz" s) ++ (close s) ++ (with-open-file ++ (s pn :direction :input) ++ (values (read-line s nil)))) ++ ("wxyz")) ++ ++(def-open-test open.output.24 (:if-exists :overwrite ++ :direction :output) ++ (progn (write-sequence "wxyz" s) ++ (close s) ++ (with-open-file ++ (s pn :direction :input) ++ (values (read-line s nil)))) ++ ("wxyzefghij")) ++ ++(def-open-test open.output.25 (:if-exists :append ++ :direction :output) ++ (progn (write-sequence "wxyz" s) ++ (close s) ++ (with-open-file ++ (s pn :direction :input) ++ (values (read-line s nil)))) ++ ("abcdefghijwxyz")) ++ ++(def-open-test open.output.26 (:if-exists :supersede ++ :direction :output) ++ (progn (write-sequence "wxyz" s) ++ (close s) ++ (with-open-file ++ (s pn :direction :input) ++ (values (read-line s nil)))) ++ ("wxyz")) ++ ++(def-open-output-test open.output.27 (:if-does-not-exist :create ++ :direction :output) ++ (progn (close s) ++ (with-open-file ++ (is pn :direction :input) ++ (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(deftest open.output.28 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :output :if-does-not-exist nil)) ++ nil) ++ ++(def-open-output-test open.output.28a (:external-format :default) ++ (progn (close s) ++ (with-open-file (is #p"tmp.dat") (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(def-open-output-test open.output.29 ++ (:external-format (prog1 ++ (with-open-file (s "foo.dat" :direction :output ++ :if-exists :supersede) ++ (stream-external-format s)) ++ (delete-all-versions "foo.dat") ++ )) ++ (progn (close s) ++ (with-open-file (is #p"tmp.dat") (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++;;; Default behavior of open :if-exists is :create when the version ++;;; of the filespec is :newest ++ ++(deftest open.output.30 ++ :notes (:open-if-exists-new-version-no-error) ++ (let ((pn (make-pathname :name "tmp" :type "dat" :version :newest))) ++ (or (not (eql (pathname-version pn) :newest)) ++ (progn ++ ;; Create file ++ (let ((s1 (open pn :direction :output :if-exists :overwrite ++ :if-does-not-exist :create))) ++ (unwind-protect ++ ;; Now try again ++ (let ((s2 (open pn :direction :output))) ++ (unwind-protect ++ (write-line "abcdef" s2) ++ (close s2)) ++ (unwind-protect ++ (progn ++ (setq s2 (open s1 :direction :input)) ++ (equalt (read-line s2 nil) "abcdef")) ++ (close s2))) ++ (close s1) ++ (delete-all-versions pn) ++ ))))) ++ t) ++ ++(def-open-output-test open.output.31 (:if-exists :rename ++ :direction :output) ++ (progn (close s) ++ (with-open-file ++ (is pn :direction :input) ++ (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(def-open-output-test open.output.32 (:if-exists :rename-and-delete ++ :direction :output) ++ (progn (close s) ++ (with-open-file ++ (is pn :direction :input) ++ (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(def-open-output-test open.output.33 (:if-exists :new-version ++ :direction :output) ++ (progn (close s) ++ (with-open-file ++ (is pn :direction :input) ++ (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(def-open-output-test open.output.34 (:if-exists :supersede ++ :direction :output) ++ (progn (close s) ++ (with-open-file ++ (is pn :direction :input) ++ (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++(def-open-output-test open.output.35 (:if-exists nil ++ :direction :output) ++ (progn (close s) ++ (with-open-file ++ (is pn :direction :input) ++ (values (read-line is nil)))) ++ ("abcdefghij")) ++ ++;;; Add -- tests for when the filespec is a stream ++ ++ ++;;; Tests of bidirectional IO ++ ++(defmacro def-open-io-test ++ (name args form expected ++ &rest keyargs ++ &key ++ (element-type 'character) ++ (build-form ++ `(dotimes (i 10) ++ ,(cond ++ ((subtypep element-type 'integer) ++ `(write-byte ++ (funcall (the function ++ (generator-for-element-type ',element-type)) i) ++ s)) ++ ((subtypep element-type 'character) ++ `(write-char ++ (funcall (the function ++ (generator-for-element-type ',element-type)) i) ++ s))))) ++ &allow-other-keys) ++ `(def-open-test ,name (:direction :io ,@args) ++ (progn ++ ,build-form ++ (assert (input-stream-p s)) ++ (assert (output-stream-p s)) ++ ,form) ++ ,expected ++ :build-form nil ++ ,@keyargs)) ++ ++;; (compile 'def-open-io-test) ++ ++(def-open-io-test open.io.1 () ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(def-open-io-test open.io.2 () ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij") ++ :pathname "tmp.dat") ++ ++(def-open-io-test open.io.3 ++ () ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij") ++ :pathname (logical-pathname "CLTEST:TMP.DAT")) ++ ++(def-open-io-test open.io.4 () ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij") ++ :element-type character) ++ ++(def-open-io-test open.io.5 () ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij") ++ :element-type base-char) ++ ++(def-open-io-test open.io.6 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 0 1 0 1 0 1 0 1)) ++ :element-type (integer 0 1)) ++ ++(def-open-io-test open.io.7 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 0 1 0 1 0 1 0 1)) ++ :element-type bit) ++ ++(def-open-io-test open.io.8 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 0 1 0 1 0 1 0 1)) ++ :element-type (unsigned-byte 1)) ++ ++(def-open-io-test open.io.9 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 0 1 2 3 0 1)) ++ :element-type (unsigned-byte 2)) ++ ++(def-open-io-test open.io.10 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 0 1)) ++ :element-type (unsigned-byte 3)) ++ ++(def-open-io-test open.io.11 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 4)) ++ ++ ++(def-open-io-test open.io.12 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 6)) ++ ++(def-open-io-test open.io.13 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 8)) ++ ++(def-open-io-test open.io.14 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 12)) ++ ++(def-open-io-test open.io.15 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 16)) ++ ++(def-open-io-test open.io.16 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 24)) ++ ++(def-open-io-test open.io.17 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 32)) ++ ++(def-open-io-test open.io.18 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 64)) ++ ++(def-open-io-test open.io.19 () ++ (progn (file-position s :start) ++ (let ((seq (make-array 10))) ++ (read-sequence seq s) ++ seq)) ++ (#(0 1 2 3 4 5 6 7 8 9)) ++ :element-type (unsigned-byte 100)) ++ ++(deftest open.io.20 ++ (let ((pn #p"tmp.dat")) ++ (with-open-file (s pn :direction :io :if-exists :supersede)) ++ (open pn :direction :io :if-exists nil)) ++ nil) ++ ++(def-open-test open.io.21 (:if-exists :new-version :direction :io) ++ (progn (write-sequence "wxyz" s) ++ (file-position s :start) ++ (values (read-line s nil))) ++ ("wxyz") ++ :notes (:open-if-exists-new-version-no-error) ++ ) ++ ++(def-open-test open.io.22 (:if-exists :rename :direction :io) ++ (progn (write-sequence "wxyz" s) ++ (file-position s :start) ++ (values (read-line s nil))) ++ ("wxyz")) ++ ++(def-open-test open.io.23 (:if-exists :rename-and-delete ++ :direction :io) ++ (progn (write-sequence "wxyz" s) ++ (file-position s :start) ++ (values (read-line s nil))) ++ ("wxyz")) ++ ++(def-open-test open.io.24 (:if-exists :overwrite ++ :direction :io) ++ (progn (write-sequence "wxyz" s) ++ (file-position s :start) ++ (values (read-line s nil))) ++ ("wxyzefghij")) ++ ++(def-open-test open.io.25 (:if-exists :append ++ :direction :io) ++ (progn (write-sequence "wxyz" s) ++ (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghijwxyz")) ++ ++(def-open-test open.io.26 (:if-exists :supersede ++ :direction :io) ++ (progn (write-sequence "wxyz" s) ++ (file-position s :start) ++ (values (read-line s nil))) ++ ("wxyz")) ++ ++(def-open-io-test open.io.27 (:if-does-not-exist :create ++ :direction :io) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(deftest open.io.28 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :io :if-does-not-exist nil)) ++ nil) ++ ++(def-open-io-test open.io.28a (:external-format :default) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(def-open-io-test open.io.29 ++ (:external-format (prog1 ++ (with-open-file (s "foo.dat" :direction :io ++ :if-exists :supersede) ++ (stream-external-format s)) ++ (delete-all-versions "foo.dat") ++ )) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++;;; Default behavior of open :if-exists is :create when the version ++;;; of the filespec is :newest ++ ++(deftest open.io.30 ++ :notes (:open-if-exists-new-version-no-error) ++ (let ((pn (make-pathname :name "tmp" :type "dat" :version :newest))) ++ (or (not (eql (pathname-version pn) :newest)) ++ (progn ++ ;; Create file ++ (let ((s1 (open pn :direction :io :if-exists :overwrite ++ :if-does-not-exist :create))) ++ (unwind-protect ++ ;; Now try again ++ (let ((s2 (open pn :direction :io))) ++ (unwind-protect ++ (write-line "abcdef" s2) ++ (close s2)) ++ (unwind-protect ++ (progn ++ (setq s2 (open s1 :direction :input)) ++ (equalt (read-line s2 nil) "abcdef")) ++ (close s2))) ++ (close s1) ++ (delete-all-versions pn) ++ ))))) ++ t) ++ ++(def-open-io-test open.io.31 (:if-exists :rename ++ :direction :io) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(def-open-io-test open.io.32 (:if-exists :rename-and-delete ++ :direction :io) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(def-open-io-test open.io.33 (:if-exists :new-version ++ :direction :io) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(def-open-io-test open.io.34 (:if-exists :supersede ++ :direction :io) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++(def-open-io-test open.io.35 (:if-exists nil ++ :direction :io) ++ (progn (file-position s :start) ++ (values (read-line s nil))) ++ ("abcdefghij")) ++ ++;;;; :PROBE tests ++ ++(defmacro def-open-probe-test ++ (name args form ++ &key (build-form nil build-form-p) ++ (pathname #p"tmp.dat")) ++ (unless build-form-p ++ (setf build-form ++ `(with-open-file (s pn :direction :output ++ :if-exists :supersede)))) ++ `(deftest ,name ++ (let ((pn ,pathname)) ++ (delete-all-versions pn) ++ ,build-form ++ (let ((s (open pn :direction :probe ,@args))) ++ (values ++ ,(if build-form ++ `(and ++ (typep s 'file-stream) ++ (not (open-stream-p s)) ++ ) ++ `(not s)) ++ ,form))) ++ t t)) ++ ++(def-open-probe-test open.probe.1 () t) ++(def-open-probe-test open.probe.2 (:if-exists :error) t) ++(def-open-probe-test open.probe.3 (:if-exists :new-version) t) ++(def-open-probe-test open.probe.4 (:if-exists :rename) t) ++(def-open-probe-test open.probe.5 (:if-exists :rename-and-delete) t) ++(def-open-probe-test open.probe.6 (:if-exists :overwrite) t) ++(def-open-probe-test open.probe.7 (:if-exists :append) t) ++(def-open-probe-test open.probe.8 (:if-exists :supersede) t) ++ ++(def-open-probe-test open.probe.9 (:if-does-not-exist :error) t) ++(def-open-probe-test open.probe.10 (:if-does-not-exist nil) t) ++(def-open-probe-test open.probe.11 (:if-does-not-exist :create) t) ++ ++(def-open-probe-test open.probe.12 () t :build-form nil) ++(def-open-probe-test open.probe.13 (:if-exists :error) t :build-form nil) ++(def-open-probe-test open.probe.14 (:if-exists :new-version) t :build-form nil) ++(def-open-probe-test open.probe.15 (:if-exists :rename) t :build-form nil) ++(def-open-probe-test open.probe.16 (:if-exists :rename-and-delete) t ++ :build-form nil) ++(def-open-probe-test open.probe.17 (:if-exists :overwrite) t ++ :build-form nil) ++(def-open-probe-test open.probe.18 (:if-exists :append) t ++ :build-form nil) ++(def-open-probe-test open.probe.19 (:if-exists :supersede) t ++ :build-form nil) ++ ++(def-open-probe-test open.probe.20 (:if-does-not-exist nil) t ++ :build-form nil) ++ ++(deftest open.probe.21 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (let ((s (open pn :direction :probe :if-does-not-exist :create))) ++ (values ++ (notnot s) ++ (notnot (probe-file pn))))) ++ t t) ++ ++(deftest open.probe.22 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (let ((s (open pn :direction :probe :if-does-not-exist :create ++ :if-exists :error))) ++ (values ++ (notnot s) ++ (notnot (probe-file pn))))) ++ t t) ++ ++(def-open-probe-test open.probe.23 (:external-format :default) t) ++(def-open-probe-test open.probe.24 (:element-type 'character) t) ++(def-open-probe-test open.probe.25 (:element-type 'bit) t) ++(def-open-probe-test open.probe.26 (:element-type '(unsigned-byte 2)) t) ++(def-open-probe-test open.probe.27 (:element-type '(unsigned-byte 4)) t) ++(def-open-probe-test open.probe.28 (:element-type '(unsigned-byte 8)) t) ++(def-open-probe-test open.probe.29 (:element-type '(unsigned-byte 9)) t) ++(def-open-probe-test open.probe.30 (:element-type '(unsigned-byte 15)) t) ++(def-open-probe-test open.probe.31 (:element-type '(unsigned-byte 16)) t) ++(def-open-probe-test open.probe.32 (:element-type '(unsigned-byte 17)) t) ++(def-open-probe-test open.probe.33 (:element-type '(unsigned-byte 31)) t) ++(def-open-probe-test open.probe.34 (:element-type '(unsigned-byte 32)) t) ++(def-open-probe-test open.probe.35 (:element-type '(unsigned-byte 33)) t) ++(def-open-probe-test open.probe.36 (:element-type '(integer -1002 13112)) t) ++ ++;;;; Error tests ++ ++(deftest open.error.1 ++ (signals-error (open) program-error) ++ t) ++ ++(deftest open.error.2 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (close (open pn :direction :output :if-does-not-exist :create)) ++ (open pn :if-exists :error :direction :output)) ++ file-error) ++ t t) ++ ++(deftest open.error.3 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (close (open pn :direction :output :if-does-not-exist :create)) ++ (open pn :if-exists :error :direction :io)) ++ file-error) ++ t t) ++ ++(deftest open.error.4 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn)) ++ file-error) ++ t t) ++ ++(deftest open.error.5 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :if-does-not-exist :error)) ++ file-error) ++ t t) ++ ++(deftest open.error.6 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :input)) ++ file-error) ++ t t) ++ ++(deftest open.error.7 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :if-does-not-exist :error :direction :input)) ++ file-error) ++ t t) ++ ++(deftest open.error.8 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :output :if-does-not-exist :error)) ++ file-error) ++ t t) ++ ++(deftest open.error.9 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :io :if-does-not-exist :error)) ++ file-error) ++ t t) ++ ++(deftest open.error.10 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :probe :if-does-not-exist :error)) ++ file-error) ++ t t) ++ ++(deftest open.error.11 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :output :if-exists :overwrite)) ++ file-error) ++ t t) ++ ++(deftest open.error.12 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :output :if-exists :append)) ++ file-error) ++ t t) ++ ++(deftest open.error.13 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :io :if-exists :overwrite)) ++ file-error) ++ t t) ++ ++(deftest open.error.14 ++ (signals-error-always ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (open pn :direction :io :if-exists :append)) ++ file-error) ++ t t) ++ ++(deftest open.error.15 ++ (signals-error-always ++ (open (make-pathname :name :wild :type "lsp")) ++ file-error) ++ t t) ++ ++(deftest open.error.16 ++ (signals-error-always ++ (open (make-pathname :name "open" :type :wild)) ++ file-error) ++ t t) ++ ++(deftest open.error.17 ++ (signals-error-always ++ (let ((pn (make-pathname :name "open" :type "lsp" :version :wild))) ++ (if (wild-pathname-p pn) (open pn) ++ (error 'file-error))) ++ file-error) ++ t t) ++ ++(deftest open.error.18 ++ (signals-error-always ++ (open #p"tmp.dat" :direction :output :if-exists :supersede ++ :external-form (gensym)) ++ error) ++ t t) ++ ++ ++;;; FIXME -- add tests for :element-type :default ++ ++;;; FIXME -- add tests for filespec being a specialized string +--- /dev/null ++++ gcl-2.6.12/ansi-tests/output-stream-p.lsp +@@ -0,0 +1,39 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 19:46:12 2004 ++;;;; Contains: Tests of OUTPUT-STREAM-P ++ ++(in-package :cl-test) ++ ++(deftest output-stream-p.1 ++ (notnot-mv (output-stream-p *standard-output*)) ++ t) ++ ++(deftest output-stream-p.2 ++ (notnot-mv (output-stream-p *terminal-io*)) ++ t) ++ ++(deftest output-stream-p.3 ++ (with-open-file (s "output-stream-p.lsp" :direction :input) ++ (output-stream-p s)) ++ nil) ++ ++(deftest output-stream-p.4 ++ (with-open-file (s "foo.txt" :direction :output ++ :if-exists :supersede) ++ (notnot-mv (output-stream-p s))) ++ t) ++ ++;;; Error tests ++ ++(deftest output-stream-p.error.1 ++ (signals-error (output-stream-p) program-error) ++ t) ++ ++(deftest output-stream-p.error.2 ++ (signals-error (output-stream-p *standard-output* nil) program-error) ++ t) ++ ++(deftest output-stream-p.error.3 ++ (check-type-error #'output-stream-p #'streamp) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/parse-namestring.lsp +@@ -0,0 +1,89 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Aug 14 13:59:18 2004 ++;;;; Contains: Tests of PARSE-NAMESTRING ++ ++(in-package :cl-test) ++ ++;;; "Parsing a null string always succeeds, producing a pathname ++;;; with all components (except the host) equal to nil." ++ ++(deftest parse-namestring.1 ++ (let ((vals (multiple-value-list (parse-namestring "")))) ++ (assert (= (length vals) 2)) ++ (let ((pn (first vals)) ++ (pos (second vals))) ++ (values ++ (pathname-directory pn) ++ (pathname-device pn) ++ (pathname-name pn) ++ (pathname-type pn) ++ (pathname-version pn) ++ pos))) ++ nil nil nil nil nil 0) ++ ++(deftest parse-namestring.2 ++ (let ((vals (multiple-value-list (parse-namestring (make-array 0 :element-type 'base-char))))) ++ (assert (= (length vals) 2)) ++ (let ((pn (first vals)) ++ (pos (second vals))) ++ (values ++ (pathname-directory pn) ++ (pathname-device pn) ++ (pathname-name pn) ++ (pathname-type pn) ++ (pathname-version pn) ++ pos))) ++ nil nil nil nil nil 0) ++ ++(deftest parse-namestring.3 ++ (let ((vals (multiple-value-list (parse-namestring (make-array 4 :element-type 'base-char ++ :initial-element #\X ++ :fill-pointer 0))))) ++ (assert (= (length vals) 2)) ++ (let ((pn (first vals)) ++ (pos (second vals))) ++ (values ++ (pathname-directory pn) ++ (pathname-device pn) ++ (pathname-name pn) ++ (pathname-type pn) ++ (pathname-version pn) ++ pos))) ++ nil nil nil nil nil 0) ++ ++(deftest parse-namestring.4 ++ (loop for etype in '(standard-char base-char character) ++ for s0 = (make-array 4 :element-type etype :initial-element #\X) ++ for s = (make-array 0 :element-type etype :displaced-to s0 ++ :displaced-index-offset 1) ++ for vals = (multiple-value-list (parse-namestring s)) ++ for pn = (first vals) ++ for pos = (second vals) ++ do (assert (= (length vals) 2)) ++ nconc ++ (let ((result (list (pathname-directory pn) ++ (pathname-device pn) ++ (pathname-name pn) ++ (pathname-type pn) ++ (pathname-version pn) ++ pos))) ++ (unless (equal result '(nil nil nil nil nil 0)) ++ (list (list etype result))))) ++ nil) ++ ++;;; Error tests ++ ++(deftest parse-namestring.error.1 ++ (signals-error (parse-namestring) program-error) ++ t) ++ ++(deftest parse-name-string.error.2 ++ (signals-error (parse-namestring "" nil *default-pathname-defaults* :foo nil) program-error) ++ t) ++ ++(deftest parse-name-string.error.3 ++ (signals-error (parse-namestring "" nil *default-pathname-defaults* :start) program-error) ++ t) ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-device.lsp +@@ -0,0 +1,74 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 14:23:54 2003 ++;;;; Contains: Tests for PATHNAME-DEVICE ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest pathname-device.1 ++ (loop for p in *pathnames* ++ for device = (pathname-device p) ++ unless (or (stringp device) ++ (member device '(nil :wild :unspecific))) ++ collect (list p device)) ++ nil) ++ ++(deftest pathname-device.2 ++ (loop for p in *pathnames* ++ for device = (pathname-device p :case :local) ++ unless (or (stringp device) ++ (member device '(nil :wild :unspecific))) ++ collect (list p device)) ++ nil) ++ ++(deftest pathname-device.3 ++ (loop for p in *pathnames* ++ for device = (pathname-device p :case :common) ++ unless (or (stringp device) ++ (member device '(nil :wild :unspecific))) ++ collect (list p device)) ++ nil) ++ ++(deftest pathname-device.4 ++ (loop for p in *pathnames* ++ for device = (pathname-device p :allow-other-keys nil) ++ unless (or (stringp device) ++ (member device '(nil :wild :unspecific))) ++ collect (list p device)) ++ nil) ++ ++(deftest pathname-device.5 ++ (loop for p in *pathnames* ++ for device = (pathname-device p :foo 'bar :allow-other-keys t) ++ unless (or (stringp device) ++ (member device '(nil :wild :unspecific))) ++ collect (list p device)) ++ nil) ++ ++(deftest pathname-device.6 ++ (loop for p in *pathnames* ++ for device = (pathname-device p :allow-other-keys t :allow-other-keys nil :foo 'bar) ++ unless (or (stringp device) ++ (member device '(nil :wild :unspecific))) ++ collect (list p device)) ++ nil) ++ ++;;; section 19.3.2.1 ++(deftest pathname-device.7 ++ (loop for p in *logical-pathnames* ++ always (eq (pathname-device p) :unspecific)) ++ t) ++ ++(deftest pathname-device.8 ++ (do-special-strings (s "" nil) (pathname-device s)) ++ nil) ++ ++(deftest pathname-device.error.1 ++ (signals-error (pathname-device) program-error) ++ t) ++ ++(deftest pathname-device.error.2 ++ (check-type-error #'pathname-device #'could-be-pathname-designator) ++ nil) +\ No newline at end of file +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-directory.lsp +@@ -0,0 +1,89 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 14:24:39 2003 ++;;;; Contains: Tests for PATHNAME-DIRECTORY ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest pathname-directory.1 ++ (loop for p in *pathnames* ++ for directory = (pathname-directory p) ++ unless (or (stringp directory) ++ (member directory '(nil :wild :unspecific)) ++ (and (consp directory) ++ (member (car directory) '(:absolute :relative)))) ++ collect (list p directory)) ++ nil) ++ ++(deftest pathname-directory.2 ++ (loop for p in *pathnames* ++ for directory = (pathname-directory p :case :local) ++ unless (or (stringp directory) ++ (member directory '(nil :wild :unspecific)) ++ (and (consp directory) ++ (member (car directory) '(:absolute :relative)))) ++ collect (list p directory)) ++ nil) ++ ++(deftest pathname-directory.3 ++ (loop for p in *pathnames* ++ for directory = (pathname-directory p :case :common) ++ unless (or (stringp directory) ++ (member directory '(nil :wild :unspecific)) ++ (and (consp directory) ++ (member (car directory) '(:absolute :relative)))) ++ collect (list p directory)) ++ nil) ++ ++(deftest pathname-directory.4 ++ (loop for p in *pathnames* ++ for directory = (pathname-directory p :allow-other-keys nil) ++ unless (or (stringp directory) ++ (member directory '(nil :wild :unspecific)) ++ (and (consp directory) ++ (member (car directory) '(:absolute :relative)))) ++ collect (list p directory)) ++ nil) ++ ++(deftest pathname-directory.5 ++ (loop for p in *pathnames* ++ for directory = (pathname-directory p :foo 'bar :allow-other-keys t) ++ unless (or (stringp directory) ++ (member directory '(nil :wild :unspecific)) ++ (and (consp directory) ++ (member (car directory) '(:absolute :relative)))) ++ collect (list p directory)) ++ nil) ++ ++(deftest pathname-directory.6 ++ (loop for p in *pathnames* ++ for directory = (pathname-directory p :allow-other-keys t ++ :allow-other-keys nil ++ 'foo 'bar) ++ unless (or (stringp directory) ++ (member directory '(nil :wild :unspecific)) ++ (and (consp directory) ++ (member (car directory) '(:absolute :relative)))) ++ collect (list p directory)) ++ nil) ++ ++;;; section 19.3.2.1 ++(deftest pathname-directory.7 ++ (loop for p in *logical-pathnames* ++ when (eq (pathname-directory p) :unspecific) ++ collect p) ++ nil) ++ ++(deftest pathname-directory.8 ++ (do-special-strings (s "" nil) (pathname-directory s)) ++ nil) ++ ++(deftest pathname-directory.error.1 ++ (signals-error (pathname-directory) program-error) ++ t) ++ ++(deftest pathname-directory.error.2 ++ (check-type-error #'pathname-directory #'could-be-pathname-designator) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-host.lsp +@@ -0,0 +1,79 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 14:23:22 2003 ++;;;; Contains: Tests for PATHNAME-HOST ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest pathname-host.1 ++ (loop for p in *pathnames* ++ always (eql (length (multiple-value-list (pathname-host p))) 1)) ++ t) ++ ++(deftest pathname-host.2 ++ (loop for p in *pathnames* ++ always (eql (length (multiple-value-list (pathname-host p :case :local))) 1)) ++ t) ++ ++(deftest pathname-host.3 ++ (loop for p in *pathnames* ++ always (eql (length (multiple-value-list (pathname-host p :case :common))) 1)) ++ t) ++ ++(deftest pathname-host.4 ++ (loop for p in *pathnames* ++ always (eql (length (multiple-value-list (pathname-host p :allow-other-keys nil))) 1)) ++ t) ++ ++(deftest pathname-host.5 ++ (loop for p in *pathnames* ++ always (eql (length (multiple-value-list ++ (pathname-host p :foo t :allow-other-keys t))) 1)) ++ t) ++ ++(deftest pathname-host.6 ++ (loop for p in *pathnames* ++ always (eql (length (multiple-value-list ++ (pathname-host p :allow-other-keys t ++ :allow-other-keys nil ++ 'foo t))) 1)) ++ t) ++ ++;;; section 19.3.2.1 ++(deftest pathname-host.7 ++ (loop for p in *logical-pathnames* ++ when (eq (pathname-host p) :unspecific) ++ collect p) ++ nil) ++ ++(deftest pathname-host.8 ++ (do-special-strings (s "" nil) (pathname-host s)) ++ nil) ++ ++#| ++(deftest pathname-host.9 ++ (loop for p in *pathnames* ++ for host = (pathname-host p) ++ unless (or (stringp host) ++ (and (listp host) (every #'stringp host)) ++ (eql host :unspecific)) ++ collect (list p host)) ++ nil) ++|# ++ ++;;; Error cases ++ ++(deftest pathname-host.error.1 ++ (signals-error (pathname-host) program-error) ++ t) ++ ++(deftest pathname-host.error.2 ++ (check-type-error #'pathname-host #'could-be-pathname-designator) ++ nil) ++ ++(deftest pathname-host.error.3 ++ (signals-error (pathname-host *default-pathname-defaults* '#:bogus t) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-match-p.lsp +@@ -0,0 +1,103 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Aug 15 07:46:22 2004 ++;;;; Contains: Tests for PATHNAME-MATCH-P ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++;;; Much of the behavior cannot be tested portably. ++ ++(deftest pathname-match-p.1 ++ (let ((pn1 (make-pathname :name :wild)) ++ (pn2 (make-pathname :name "foo"))) ++ (pathname-match-p pn1 pn2)) ++ nil) ++ ++(deftest pathname-match-p.2 ++ (let ((pn1 (make-pathname :type :wild)) ++ (pn2 (make-pathname :type "txt"))) ++ (pathname-match-p pn1 pn2)) ++ nil) ++ ++(deftest pathname-match-p.3 ++ (let ((pn1 (make-pathname :directory '(:absolute :wild))) ++ (pn2 (make-pathname :directory '(:absolute)))) ++ (pathname-match-p pn1 pn2)) ++ nil) ++ ++(deftest pathname-match-p.4 ++ (let ((pn1 (make-pathname :directory '(:relative :wild))) ++ (pn2 (make-pathname :directory '(:relative)))) ++ (pathname-match-p pn1 pn2)) ++ nil) ++ ++(deftest pathname-match-p.5 ++ (let ((pn1 (make-pathname :directory '(:relative :wild))) ++ (pn2 (make-pathname :directory nil))) ++ (and (wild-pathname-p pn1) ++ (not (pathname-directory pn2)) ++ (not (pathname-match-p pn1 pn2)))) ++ nil) ++ ++(deftest pathname-match-p.6 ++ (let ((pn1 (make-pathname :version :wild)) ++ (pn2 (make-pathname))) ++ (and (wild-pathname-p pn1) ++ (not (pathname-version pn2)) ++ (not (pathname-match-p pn1 pn2)))) ++ nil) ++ ++;;; Specialized string tests ++ ++(deftest pathname-match-p.7 ++ (let ((wpn (parse-namestring "CLTEST:*.LSP"))) ++ (assert (wild-pathname-p wpn)) ++ (do-special-strings ++ (s "CLTEST:FOO.LSP" nil) ++ (assert (pathname-match-p s wpn)))) ++ nil) ++ ++(deftest pathname-match-p.8 ++ (do-special-strings ++ (s "CLTEST:*.LSP" nil) ++ (assert (pathname-match-p "CLTEST:FOO.LSP" s))) ++ nil) ++ ++ ++;;; Add more tests here ++ ++;;; Here are error tests ++ ++(deftest pathname-match-p.error.1 ++ (signals-error (pathname-match-p) program-error) ++ t) ++ ++(deftest pathname-match-p.error.2 ++ (signals-error (pathname-match-p #p"") program-error) ++ t) ++ ++(deftest pathname-match-p.error.3 ++ (signals-error (pathname-match-p #p"" #p"" nil) program-error) ++ t) ++ ++(deftest pathname-match-p.error.4 ++ (check-type-error #'(lambda (x) (pathname-match-p x #p"")) ++ #'could-be-pathname-designator) ++ nil) ++ ++(deftest pathname-match-p.error.5 ++ (check-type-error #'(lambda (x) (declare (optimize (safety 0))) (pathname-match-p x #p"")) ++ #'could-be-pathname-designator) ++ nil) ++ ++(deftest pathname-match-p.error.6 ++ (check-type-error #'(lambda (x) (pathname-match-p #p"" x)) ++ #'could-be-pathname-designator) ++ nil) ++ ++(deftest pathname-match-p.error.7 ++ (check-type-error #'(lambda (x) (declare (optimize (safety 0))) (pathname-match-p #p"" x)) ++ #'could-be-pathname-designator) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-name.lsp +@@ -0,0 +1,75 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 14:45:16 2003 ++;;;; Contains: Tests for PATHNAME-NAME ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest pathname-name.1 ++ (loop for p in *pathnames* ++ for name = (pathname-name p) ++ unless (or (stringp name) ++ (member name '(nil :wild :unspecific))) ++ collect (list p name)) ++ nil) ++ ++(deftest pathname-name.2 ++ (loop for p in *pathnames* ++ for name = (pathname-name p :case :local) ++ unless (or (stringp name) ++ (member name '(nil :wild :unspecific))) ++ collect (list p name)) ++ nil) ++ ++(deftest pathname-name.3 ++ (loop for p in *pathnames* ++ for name = (pathname-name p :case :common) ++ unless (or (stringp name) ++ (member name '(nil :wild :unspecific))) ++ collect (list p name)) ++ nil) ++ ++(deftest pathname-name.4 ++ (loop for p in *pathnames* ++ for name = (pathname-name p :allow-other-keys nil) ++ unless (or (stringp name) ++ (member name '(nil :wild :unspecific))) ++ collect (list p name)) ++ nil) ++ ++(deftest pathname-name.5 ++ (loop for p in *pathnames* ++ for name = (pathname-name p :foo 'bar :allow-other-keys t) ++ unless (or (stringp name) ++ (member name '(nil :wild :unspecific))) ++ collect (list p name)) ++ nil) ++ ++(deftest pathname-name.6 ++ (loop for p in *pathnames* ++ for name = (pathname-name p :allow-other-keys t :allow-other-keys nil :foo 'bar) ++ unless (or (stringp name) ++ (member name '(nil :wild :unspecific))) ++ collect (list p name)) ++ nil) ++ ++;;; section 19.3.2.1 ++(deftest pathname-name.7 ++ (loop for p in *logical-pathnames* ++ when (eq (pathname-name p) :unspecific) ++ collect p) ++ nil) ++ ++(deftest pathname-name.8 ++ (do-special-strings (s "" nil) (pathname-name s)) ++ nil) ++ ++(deftest pathname-name.error.1 ++ (signals-error (pathname-name) program-error) ++ t) ++ ++(deftest pathname-name.error.2 ++ (check-type-error #'pathname-name #'could-be-pathname-designator) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-type.lsp +@@ -0,0 +1,75 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 14:45:16 2003 ++;;;; Contains: Tests for PATHNAME-TYPE ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest pathname-type.1 ++ (loop for p in *pathnames* ++ for type = (pathname-type p) ++ unless (or (stringp type) ++ (member type '(nil :wild :unspecific))) ++ collect (list p type)) ++ nil) ++ ++(deftest pathname-type.2 ++ (loop for p in *pathnames* ++ for type = (pathname-type p :case :local) ++ unless (or (stringp type) ++ (member type '(nil :wild :unspecific))) ++ collect (list p type)) ++ nil) ++ ++(deftest pathname-type.3 ++ (loop for p in *pathnames* ++ for type = (pathname-type p :case :common) ++ unless (or (stringp type) ++ (member type '(nil :wild :unspecific))) ++ collect (list p type)) ++ nil) ++ ++(deftest pathname-type.4 ++ (loop for p in *pathnames* ++ for type = (pathname-type p :allow-other-keys nil) ++ unless (or (stringp type) ++ (member type '(nil :wild :unspecific))) ++ collect (list p type)) ++ nil) ++ ++(deftest pathname-type.5 ++ (loop for p in *pathnames* ++ for type = (pathname-type p :foo 'bar :allow-other-keys t) ++ unless (or (stringp type) ++ (member type '(nil :wild :unspecific))) ++ collect (list p type)) ++ nil) ++ ++(deftest pathname-type.6 ++ (loop for p in *pathnames* ++ for type = (pathname-type p :allow-other-keys t :allow-other-keys nil :foo 'bar) ++ unless (or (stringp type) ++ (member type '(nil :wild :unspecific))) ++ collect (list p type)) ++ nil) ++ ++;;; section 19.3.2.1 ++(deftest pathname-type.7 ++ (loop for p in *logical-pathnames* ++ when (eq (pathname-type p) :unspecific) ++ collect p) ++ nil) ++ ++(deftest pathname-type.8 ++ (do-special-strings (s "" nil) (pathname-type s)) ++ nil) ++ ++(deftest pathname-type.error.1 ++ (signals-error (pathname-type) program-error) ++ t) ++ ++(deftest pathname-type.error.2 ++ (check-type-error #'pathname-type #'could-be-pathname-designator) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname-version.lsp +@@ -0,0 +1,40 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 14:45:16 2003 ++;;;; Contains: Tests for PATHNAME-VERSION ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest pathname-version.1 ++ (loop for p in *pathnames* ++ for version = (pathname-version p) ++ unless (or (integerp version) (symbolp version)) ++ collect (list p version)) ++ nil) ++ ++;;; section 19.3.2.1 ++(deftest pathname-version.2 ++ (loop for p in *logical-pathnames* ++ when (eq (pathname-version p) :unspecific) ++ collect p) ++ nil) ++ ++(deftest pathname-version.3 ++ (do-special-strings (s "" nil) (pathname-version s)) ++ nil) ++ ++(deftest pathname-version.error.1 ++ (signals-error (pathname-version) program-error) ++ t) ++ ++(deftest pathname-version.error.2 ++ (signals-error (pathname-version *default-pathname-defaults* nil) ++ program-error) ++ t) ++ ++(deftest pathname-version.error.3 ++ (check-type-error #'pathname-version #'could-be-pathname-designator) ++ nil) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathname.lsp +@@ -0,0 +1,88 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Nov 29 05:06:57 2003 ++;;;; Contains: Tests of the function PATHNAME ++ ++(in-package :cl-test) ++ ++(deftest pathname.1 ++ (loop for x in *pathnames* ++ always (eq x (pathname x))) ++ t) ++ ++(deftest pathname.2 ++ (equalt #p"ansi-aux.lsp" (pathname "ansi-aux.lsp")) ++ t) ++ ++(deftest pathname.3 ++ (let ((s (open "ansi-aux.lsp" :direction :input))) ++ (prog1 (equalt (truename (pathname s)) (truename #p"ansi-aux.lsp")) ++ (close s))) ++ t) ++ ++(deftest pathname.4 ++ (let ((s (open "ansi-aux.lsp" :direction :input))) ++ (close s) ++ (equalt (truename (pathname s)) (truename #p"ansi-aux.lsp"))) ++ t) ++ ++(deftest pathname.5 ++ (loop for x in *logical-pathnames* ++ always (eq x (pathname x))) ++ t) ++ ++(deftest pathname.6 ++ (equalt #p"ansi-aux.lsp" ++ (pathname (make-array 12 :initial-contents "ansi-aux.lsp" ++ :element-type 'base-char))) ++ t) ++ ++(deftest pathname.7 ++ (equalt #p"ansi-aux.lsp" ++ (pathname (make-array 15 :initial-contents "ansi-aux.lspXXX" ++ :element-type 'base-char ++ :fill-pointer 12))) ++ t) ++ ++(deftest pathname.8 ++ (equalt #p"ansi-aux.lsp" ++ (pathname (make-array 12 :initial-contents "ansi-aux.lsp" ++ :element-type 'base-char ++ :adjustable t))) ++ t) ++ ++(deftest pathname.9 ++ (equalt #p"ansi-aux.lsp" ++ (pathname (make-array 15 :initial-contents "ansi-aux.lspXXX" ++ :element-type 'character ++ :fill-pointer 12))) ++ t) ++ ++(deftest pathname.10 ++ (equalt #p"ansi-aux.lsp" ++ (pathname (make-array 12 :initial-contents "ansi-aux.lsp" ++ :element-type 'character ++ :adjustable t))) ++ t) ++ ++(deftest pathname.11 ++ (loop for etype in '(standard-char base-char character) ++ collect ++ (equalt #p"ansi-aux.lsp" ++ (pathname ++ (let* ((s (make-array 15 :initial-contents "XXansi-aux.lspX" ++ :element-type etype))) ++ (make-array 12 :element-type etype ++ :displaced-to s ++ :displaced-index-offset 2))))) ++ (t t t)) ++ ++;;; Error tests ++ ++(deftest pathname.error.1 ++ (signals-error (pathname) program-error) ++ t) ++ ++(deftest pathname.error.2 ++ (signals-error (pathname (first *pathnames*) nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathnamep.lsp +@@ -0,0 +1,31 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 10:26:45 2003 ++;;;; Contains: Tests of PATHNAMEP ++ ++(in-package :cl-test) ++ ++(deftest pathnamep.1 ++ (check-type-predicate #'pathnamep 'pathname) ++ 0) ++ ++(deftest pathnamep.2 ++ (check-predicate #'(lambda (x) (eql (length (multiple-value-list (pathnamep x))) 1))) ++ nil) ++ ++(deftest pathnamep.3 ++ (check-predicate (typef '(not logical-pathname)) #'pathnamep) ++ nil) ++ ++(deftest pathnamep.error.1 ++ (signals-error (pathnamep) program-error) ++ t) ++ ++(deftest pathnamep.error.2 ++ (signals-error (pathnamep nil nil) program-error) ++ t) ++ ++(deftest pathnamep.error.3 ++ (signals-error (pathnamep *default-pathname-defaults* nil) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathnames-aux.lsp +@@ -0,0 +1,25 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Dec 6 15:05:05 2003 ++;;;; Contains: Functions associated with pathname tests ++ ++(in-package :cl-test) ++ ++(defun could-be-pathname-designator (x) ++ (or (stringp x) ++ (pathnamep x) ++ (typep x 'file-stream) ++ (and (typep x 'synonym-stream) ++ (could-be-pathname-designator ++ (symbol-value ++ (synonym-stream-symbol x)))))) ++ ++(defun explode-pathname (pn) ++ (list ++ :host (pathname-host pn) ++ :device (pathname-device pn) ++ :directory (pathname-directory pn) ++ :name (pathname-name pn) ++ :type (pathname-type pn) ++ :version (pathname-version pn))) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/pathnames.lsp +@@ -0,0 +1,19 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Nov 29 04:21:53 2003 ++;;;; Contains: Various tests on pathnames ++ ++(in-package :cl-test) ++ ++(deftest pathnames-print-and-read-properly ++ (with-standard-io-syntax ++ (loop ++ for p1 in *pathnames* ++ for s = (handler-case (write-to-string p1 :readably t) ++ (print-not-readable () :unreadable-error)) ++ unless (eql s :unreadable-error) ++ append ++ (let ((p2 (read-from-string s))) ++ (unless (equal p1 p2) ++ (list (list p1 s p2)))))) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/peek-char.lsp +@@ -0,0 +1,329 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Jan 17 21:02:13 2004 ++;;;; Contains: Tests of PEEK-CHAR ++ ++(in-package :cl-test) ++ ++(deftest peek-char.1 ++ (with-input-from-string ++ (*standard-input* "abc") ++ (values ++ (peek-char) ++ (read-char) ++ (read-char) ++ (peek-char) ++ (read-char))) ++ #\a #\a #\b #\c #\c) ++ ++(deftest peek-char.2 ++ (with-input-from-string ++ (*standard-input* " ab") ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char) ++ (peek-char t) ++ (read-char))) ++ #\Space #\Space #\a #\a #\b #\b) ++ ++(deftest peek-char.3 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ (string #\Newline) ++ (string #\Newline) ++ " " ++ (string #\Newline) ++ "ab")) ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char) ++ (peek-char t) ++ (read-char))) ++ #\Newline #\Newline #\a #\a #\b #\b) ++ ++(when (name-char "Linefeed") ++ (deftest peek-char.4 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ (string (name-char "Linefeed")) ++ (string (name-char "Linefeed")) ++ "abc")) ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char))) ++ #.(name-char "Linefeed") ++ #.(name-char "Linefeed") ++ #\a #\a)) ++ ++(when (name-char "Page") ++ (deftest peek-char.5 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ (string (name-char "Page")) ++ (string (name-char "Page")) ++ "abc")) ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char))) ++ #.(name-char "Page") ++ #.(name-char "Page") ++ #\a #\a)) ++ ++(when (name-char "Tab") ++ (deftest peek-char.6 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ (string (name-char "Tab")) ++ (string (name-char "Tab")) ++ "abc")) ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char))) ++ #.(name-char "Tab") ++ #.(name-char "Tab") ++ #\a #\a)) ++ ++(when (name-char "Return") ++ (deftest peek-char.7 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ (string (name-char "Return")) ++ (string (name-char "Return")) ++ "abc")) ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char))) ++ #.(name-char "Return") ++ #.(name-char "Return") ++ #\a #\a)) ++ ++(deftest peek-char.8 ++ (with-input-from-string ++ (s "a bcd") ++ (values ++ (peek-char nil s) ++ (read-char s) ++ (peek-char t s) ++ (read-char s) ++ (peek-char t s) ++ (read-char s))) ++ #\a #\a #\b #\b #\c #\c) ++ ++(deftest peek-char.9 ++ (with-input-from-string ++ (*standard-input* " a bCcde") ++ (values ++ (peek-char #\c) ++ (read-char) ++ (read-char))) ++ #\c #\c #\d) ++ ++(deftest peek-char.10 ++ (with-input-from-string ++ (*standard-input* " ; foo") ++ (values ++ (peek-char t) ++ (read-char))) ++ #\; #\;) ++ ++(deftest peek-char.11 ++ (with-input-from-string ++ (s "") ++ (peek-char nil s nil)) ++ nil) ++ ++(deftest peek-char.12 ++ (with-input-from-string ++ (s "") ++ (peek-char nil s nil 'foo)) ++ foo) ++ ++(deftest peek-char.13 ++ (with-input-from-string ++ (s " ") ++ (peek-char t s nil)) ++ nil) ++ ++(deftest peek-char.14 ++ (with-input-from-string ++ (s " ") ++ (peek-char t s nil 'foo)) ++ foo) ++ ++(deftest peek-char.15 ++ (with-input-from-string ++ (s "ab c d") ++ (peek-char #\z s nil)) ++ nil) ++ ++(deftest peek-char.16 ++ (with-input-from-string ++ (s "ab c d") ++ (peek-char #\z s nil 'foo)) ++ foo) ++ ++;;; Interaction with echo streams ++ ++(deftest peek-char.17 ++ (block done ++ (with-input-from-string ++ (is "ab") ++ (with-output-to-string ++ (os) ++ (let ((es (make-echo-stream is os))) ++ (let ((pos1 (file-position os))) ++ (unless (zerop pos1) (return-from done :good)) ++ (peek-char nil es nil) ++ (let ((pos2 (file-position os))) ++ (return-from done ++ (if (eql pos1 pos2) ++ :good ++ (list pos1 pos2))))))))) ++ :good) ++ ++(deftest peek-char.18 ++ (block done ++ (with-input-from-string ++ (is " ab") ++ (with-output-to-string ++ (os) ++ (let ((es (make-echo-stream is os))) ++ (let ((pos1 (file-position os))) ++ (unless (zerop pos1) (return-from done :good)) ++ (peek-char t es nil) ++ (let ((pos2 (file-position os))) ++ (return-from done ++ (if (eql pos1 pos2) ++ pos1 ++ :good)))))))) ++ :good) ++ ++(deftest peek-char.19 ++ (block done ++ (with-input-from-string ++ (is "abcde") ++ (with-output-to-string ++ (os) ++ (let ((es (make-echo-stream is os))) ++ (let ((pos1 (file-position os))) ++ (unless (zerop pos1) (return-from done :good)) ++ (peek-char #\c es nil) ++ (let ((pos2 (file-position os))) ++ (return-from done ++ (if (eql pos1 pos2) ++ pos1 ++ :good)))))))) ++ :good) ++ ++;;; Interactions with the readtable ++ ++(deftest peek-char.20 ++ (let ((*readtable* (copy-readtable))) ++ (set-syntax-from-char #\Space #\a) ++ (with-input-from-string ++ (*standard-input* " x") ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char)))) ++ #\Space #\Space ++ #\Space #\Space ; *not* #\x #\x ++ ) ++ ++(deftest peek-char.21 ++ (let ((*readtable* (copy-readtable))) ++ (set-syntax-from-char #\x #\Space) ++ (with-input-from-string ++ (*standard-input* "xxa") ++ (values ++ (peek-char) ++ (read-char) ++ (peek-char t) ++ (read-char)))) ++ #\x #\x ++ #\a #\a ; *not* #\x #\x ++ ) ++ ++;;; Stream designators are accepted for the stream argument ++ ++(deftest peek-char.22 ++ (with-input-from-string ++ (is "!?*") ++ (let ((*terminal-io* (make-two-way-stream is (make-string-output-stream)))) ++ (peek-char nil t))) ++ #\!) ++ ++(deftest peek-char.23 ++ (with-input-from-string ++ (*standard-input* "345") ++ (peek-char nil nil)) ++ #\3) ++ ++;;; Error tests ++ ++(deftest peek-char.error.1 ++ (signals-error ++ (with-input-from-string ++ (s "abc") ++ (peek-char s nil nil nil nil 'nonsense)) ++ program-error) ++ t) ++ ++ ++(deftest peek-char.error.2 ++ (signals-error-always ++ (with-input-from-string ++ (*standard-input* "") ++ (peek-char)) ++ end-of-file) ++ t t) ++ ++(deftest peek-char.error.3 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (peek-char nil s)) ++ end-of-file) ++ t t) ++ ++(deftest peek-char.error.4 ++ (signals-error-always ++ (with-input-from-string ++ (s " ") ++ (peek-char t s)) ++ end-of-file) ++ t t) ++ ++(deftest peek-char.error.5 ++ (signals-error-always ++ (with-input-from-string ++ (s "abcd") ++ (peek-char #\z s)) ++ end-of-file) ++ t t) ++ ++;;; There was a consensus on comp.lang.lisp that the requirement ++;;; that an end-of-file error be thrown in the following case ++;;; is a spec bug ++#| ++(deftest peek-char.error.6 ++ (signals-error ++ (with-input-from-string ++ (s "") ++ (peek-char nil s nil nil t)) ++ end-of-file) ++ t) ++|# +--- /dev/null ++++ gcl-2.6.12/ansi-tests/probe-file.lsp +@@ -0,0 +1,58 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Mon Jan 5 20:46:29 2004 ++;;;; Contains: Tests of PROBE-FILE ++ ++(in-package :cl-test) ++ ++(deftest probe-file.1 ++ (probe-file #p"nonexistent") ++ nil) ++ ++(deftest probe-file.2 ++ (let ((s (open #p"probe-file.lsp" :direction :input))) ++ (prog1 ++ (equalpt (truename #p"probe-file.lsp") ++ (probe-file s)) ++ (close s))) ++ t) ++ ++(deftest probe-file.3 ++ (let ((s (open #p"probe-file.lsp" :direction :input))) ++ (close s) ++ (equalpt (truename #p"probe-file.lsp") ++ (probe-file s))) ++ t) ++ ++(deftest probe-file.4 ++ (equalpt (truename #p"probe-file.lsp") ++ (probe-file "CLTEST:PROBE-FILE.LSP")) ++ t) ++ ++;;; Specialized string tests ++ ++(deftest probe-file.5 ++ (do-special-strings ++ (str "probe-file.lsp" nil) ++ (let ((s (open str :direction :input))) ++ (assert (equalpt (truename #p"probe-file.lsp") (probe-file s))) ++ (close s))) ++ nil) ++ ++;;; Error tests ++ ++(deftest probe-file.error.1 ++ (signals-error (probe-file) program-error) ++ t) ++ ++(deftest probe-file.error.2 ++ (signals-error (probe-file #p"probe-file.lsp" nil) program-error) ++ t) ++ ++(deftest probe-file.error.3 ++ (signals-error-always (probe-file (make-pathname :name :wild)) file-error) ++ t t) ++ ++(deftest probe-file.error.4 ++ (signals-error-always (probe-file "CLTEST:*.FOO") file-error) ++ t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/read-byte.lsp +@@ -0,0 +1,194 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Jan 17 17:30:49 2004 ++;;;; Contains: Tests of READ-BYTE, WRITE-BYTE ++ ++(in-package :cl-test) ++ ++(deftest read-byte.1 ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type '(unsigned-byte 8)))) ++ (values ++ (write-byte 17 s) ++ (close s) ++ (progn ++ (setq s (open "foo.txt" ++ :direction :input ++ :element-type '(unsigned-byte 8))) ++ (read-byte s)) ++ (close s))) ++ 17 t 17 t) ++ ++(deftest read-byte.2 ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type '(unsigned-byte 8)))) ++ (values ++ (close s) ++ (progn ++ (setq s (open "foo.txt" ++ :direction :input ++ :element-type '(unsigned-byte 8))) ++ (read-byte s nil 'foo)) ++ (read-byte s nil) ++ (close s))) ++ t foo nil t) ++ ++(deftest read-byte.3 ++ (loop with b1 = 0 ++ and b2 = 0 ++ for i from 1 to 32 ++ do (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type `(unsigned-byte ,i)))) ++ (write-byte (1- (ash 1 i)) s) ++ (write-byte 1 s) ++ (close s)) ++ unless (let ((s (open "foo.txt" ++ :direction :input ++ :element-type `(unsigned-byte ,i)))) ++ (prog1 ++ (and (eql (setq b1 (read-byte s)) (1- (ash 1 i))) ++ (eql (setq b2 (read-byte s)) 1)) ++ (close s))) ++ collect (list i b1 b2)) ++ nil) ++ ++(deftest read-byte.4 ++ (loop with b1 = 0 ++ and b2 = 0 ++ for i from 33 to 200 by 7 ++ do (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type `(unsigned-byte ,i)))) ++ (write-byte (1- (ash 1 i)) s) ++ (write-byte 1 s) ++ (close s)) ++ unless (let ((s (open "foo.txt" ++ :direction :input ++ :element-type `(unsigned-byte ,i)))) ++ (prog1 ++ (and (eql (setq b1 (read-byte s)) (1- (ash 1 i))) ++ (eql (setq b2 (read-byte s)) 1)) ++ (close s))) ++ collect (list i b1 b2)) ++ nil) ++ ++;;; Error tests ++ ++(deftest read-byte.error.1 ++ (signals-error (read-byte) program-error) ++ t) ++ ++(deftest read-byte.error.2 ++ (progn ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type `(unsigned-byte 8)))) ++ (close s)) ++ (signals-error ++ (let ((s (open "foo.txt" ++ :direction :input ++ :element-type '(unsigned-byte 8)))) ++ (read-byte s)) ++ end-of-file)) ++ t) ++ ++(deftest read-byte.error.3 ++ (progn ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede))) ++ (close s)) ++ (signals-error ++ (let ((s (open "foo.txt" :direction :input))) ++ (unwind-protect ++ (read-byte s) ++ (close s))) ++ error)) ++ t) ++ ++(deftest read-byte.error.4 ++ (signals-error-always ++ (progn ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type '(unsigned-byte 8)))) ++ (close s)) ++ (let ((s (open "foo.txt" ++ :direction :input ++ :element-type '(unsigned-byte 8)))) ++ (unwind-protect ++ (read-byte s t) ++ (close s)))) ++ end-of-file) ++ t t) ++ ++(deftest read-byte.error.5 ++ (check-type-error #'read-byte #'streamp) ++ nil) ++ ++(deftest read-byte.error.6 ++ (progn ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type '(unsigned-byte 8)))) ++ (close s)) ++ (signals-error ++ (let ((s (open "foo.txt" ++ :direction :input ++ :element-type '(unsigned-byte 8)))) ++ (unwind-protect ++ (read-byte s t t nil) ++ (close s))) ++ program-error)) ++ t) ++ ++ ++(deftest write-byte.error.1 ++ (signals-error (write-byte) program-error) ++ t) ++ ++(deftest write-byte.error.2 ++ (signals-error (write-byte 0) program-error) ++ t) ++ ++(deftest write-byte.error.3 ++ (signals-error ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede ++ :element-type '(unsigned-byte 8)))) ++ (unwind-protect ++ (write 1 s nil) ++ (close s))) ++ program-error) ++ t) ++ ++(deftest write-byte.error.4 ++ (check-type-error #'(lambda (x) (write-byte 0 x)) #'streamp) ++ nil) ++ ++(deftest write-byte.error.5 ++ (signals-error ++ (let ((s (open "foo.txt" ++ :direction :output ++ :if-exists :supersede))) ++ (unwind-protect ++ (write 1 s) ++ (close s))) ++ error) ++ t) ++ ++ ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/read-char-no-hang.lsp +@@ -0,0 +1,123 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 20:32:38 2004 ++;;;; Contains: Tests of READ-CHAR-NO-HANG ++ ++(in-package :cl-test) ++ ++(deftest read-char-no-hang.1 ++ (with-input-from-string ++ (*standard-input* "a") ++ (read-char-no-hang)) ++ #\a) ++ ++(deftest read-char-no-hang.2 ++ (with-input-from-string ++ (*standard-input* "abc") ++ (values ++ (read-char-no-hang) ++ (read-char-no-hang) ++ (read-char-no-hang))) ++ #\a #\b #\c) ++ ++(when (code-char 0) ++ (deftest read-char-no-hang.3 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ "a" ++ (string (code-char 0)) ++ "b")) ++ (values ++ (read-char-no-hang) ++ (read-char-no-hang) ++ (read-char-no-hang))) ++ #\a #.(code-char 0) #\b)) ++ ++(deftest read-char-no-hang.4 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char-no-hang s) ++ (read-char-no-hang s) ++ (read-char-no-hang s))) ++ #\a #\b #\c) ++ ++(deftest read-char-no-hang.5 ++ (with-input-from-string ++ (s "") ++ (read-char-no-hang s nil)) ++ nil) ++ ++(deftest read-char-no-hang.6 ++ (with-input-from-string ++ (s "") ++ (read-char-no-hang s nil 'foo)) ++ foo) ++ ++(deftest read-char-no-hang.7 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char-no-hang s nil nil) ++ (read-char-no-hang s nil nil) ++ (read-char-no-hang s nil nil))) ++ #\a #\b #\c) ++ ++(deftest read-char-no-hang.8 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char-no-hang s nil t) ++ (read-char-no-hang s nil t) ++ (read-char-no-hang s nil t))) ++ #\a #\b #\c) ++ ++(deftest read-char-no-hang.9 ++ (with-input-from-string ++ (is "!?*") ++ (let ((*terminal-io* (make-two-way-stream is (make-string-output-stream)))) ++ (read-char-no-hang t))) ++ #\!) ++ ++(deftest read-char-no-hang.10 ++ (with-input-from-string ++ (*standard-input* "345") ++ (read-char-no-hang nil)) ++ #\3) ++ ++;;; Need a test of the non-hanging. ++;;; This is hard to do portably. ++ ++;;; Error tests ++ ++(deftest read-char-no-hang.error.1 ++ (signals-error ++ (with-input-from-string ++ (s "abc") ++ (read-char-no-hang s nil nil nil nil)) ++ program-error) ++ t) ++ ++(deftest read-char-no-hang.error.2 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-char-no-hang s)) ++ end-of-file) ++ t t) ++ ++(deftest read-char-no-hang.error.3 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-char-no-hang s t)) ++ end-of-file) ++ t t) ++ ++(deftest read-char-no-hang.error.4 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-char-no-hang s t t)) ++ end-of-file) ++ t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/read-char.lsp +@@ -0,0 +1,121 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 08:53:56 2004 ++;;;; Contains: Tests of READ-CHAR ++ ++(in-package :cl-test) ++ ++(deftest read-char.1 ++ (with-input-from-string ++ (*standard-input* "a") ++ (read-char)) ++ #\a) ++ ++(deftest read-char.2 ++ (with-input-from-string ++ (*standard-input* "abc") ++ (values ++ (read-char) ++ (read-char) ++ (read-char))) ++ #\a #\b #\c) ++ ++(when (code-char 0) ++ (deftest read-char.3 ++ (with-input-from-string ++ (*standard-input* (concatenate 'string ++ "a" ++ (string (code-char 0)) ++ "b")) ++ (values ++ (read-char) ++ (read-char) ++ (read-char))) ++ #\a #.(code-char 0) #\b)) ++ ++(deftest read-char.4 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char s) ++ (read-char s) ++ (read-char s))) ++ #\a #\b #\c) ++ ++(deftest read-char.5 ++ (with-input-from-string ++ (s "") ++ (read-char s nil)) ++ nil) ++ ++(deftest read-char.6 ++ (with-input-from-string ++ (s "") ++ (read-char s nil 'foo)) ++ foo) ++ ++(deftest read-char.7 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char s nil nil) ++ (read-char s nil nil) ++ (read-char s nil nil))) ++ #\a #\b #\c) ++ ++(deftest read-char.8 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char s nil t) ++ (read-char s nil t) ++ (read-char s nil t))) ++ #\a #\b #\c) ++ ++(deftest read-char.9 ++ (with-input-from-string ++ (is "!?*") ++ (let ((*terminal-io* (make-two-way-stream is (make-string-output-stream)))) ++ (read-char t))) ++ #\!) ++ ++(deftest read-char.10 ++ (with-input-from-string ++ (*standard-input* "345") ++ (read-char nil)) ++ #\3) ++ ++ ++;;; Error tests ++ ++(deftest read-char.error.1 ++ (signals-error ++ (with-input-from-string ++ (s "abc") ++ (read-char s nil nil nil nil)) ++ program-error) ++ t) ++ ++(deftest read-char.error.2 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-char s)) ++ end-of-file) ++ t t) ++ ++(deftest read-char.error.3 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-char s t)) ++ end-of-file) ++ t t) ++ ++(deftest read-char.error.4 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-char s t t)) ++ end-of-file) ++ t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/read-line.lsp +@@ -0,0 +1,104 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 20:53:59 2004 ++;;;; Contains: Tests of READ-LINE ++ ++(in-package :cl-test) ++ ++(deftest read-line.1 ++ (with-input-from-string ++ (*standard-input* " abcd ") ++ (let ((vals (multiple-value-list (read-line)))) ++ (assert (= (length vals) 2)) ++ (values (first vals) (notnot (second vals))))) ++ " abcd " t) ++ ++(deftest read-line.2 ++ (with-input-from-string ++ (*standard-input* (string #\Newline)) ++ (read-line)) ++ "" nil) ++ ++(deftest read-line.3 ++ (with-input-from-string ++ (s (concatenate 'string "abc" (string #\Newline))) ++ (read-line s)) ++ "abc" nil) ++ ++(deftest read-line.4 ++ (with-input-from-string ++ (s "") ++ (let ((vals (multiple-value-list (read-line s nil)))) ++ (assert (= (length vals) 2)) ++ (values (first vals) (notnot (second vals))))) ++ nil t) ++ ++(deftest read-line.5 ++ (with-input-from-string ++ (s "") ++ (let ((vals (multiple-value-list (read-line s nil 'foo)))) ++ (assert (= (length vals) 2)) ++ (values (first vals) (notnot (second vals))))) ++ foo t) ++ ++(deftest read-line.6 ++ (with-input-from-string ++ (s " abcd ") ++ (let ((vals (multiple-value-list (read-line s t nil t)))) ++ (assert (= (length vals) 2)) ++ (values (first vals) (notnot (second vals))))) ++ " abcd " t) ++ ++(deftest read-line.7 ++ (with-input-from-string ++ (is "abc") ++ (let ((*terminal-io* (make-two-way-stream is *standard-output*))) ++ (let ((vals (multiple-value-list (read-line t)))) ++ (assert (= (length vals) 2)) ++ (assert (second vals)) ++ (first vals)))) ++ "abc") ++ ++(deftest read-line.8 ++ (with-input-from-string ++ (*standard-input* "abc") ++ (let ((vals (multiple-value-list (read-line nil)))) ++ (assert (= (length vals) 2)) ++ (assert (second vals)) ++ (first vals))) ++ "abc") ++ ++;;; Error tests ++ ++(deftest read-line.error.1 ++ (signals-error ++ (with-input-from-string ++ (s (concatenate 'string "abc" (string #\Newline))) ++ (read-line s t nil nil nil)) ++ program-error) ++ t) ++ ++(deftest read-line.error.2 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-line s)) ++ end-of-file) ++ t t) ++ ++(deftest read-line.error.3 ++ (signals-error-always ++ (with-input-from-string ++ (*standard-input* "") ++ (read-line)) ++ end-of-file) ++ t t) ++ ++(deftest read-line.error.4 ++ (signals-error-always ++ (with-input-from-string ++ (s "") ++ (read-line s t)) ++ end-of-file) ++ t t) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/read-sequence.lsp +@@ -0,0 +1,300 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Mon Jan 19 06:55:04 2004 ++;;;; Contains: Tests of READ-SEQUENCE ++ ++(in-package :cl-test) ++ ++;;; Read into a string ++ ++(defmacro def-read-sequence-test (name init args input &rest expected) ++ `(deftest ,name ++ (let ((s ,init)) ++ (with-input-from-string ++ (is ,input) ++ (values ++ (read-sequence s is ,@args) ++ s))) ++ ,@expected)) ++ ++(def-read-sequence-test read-sequence.string.1 (copy-seq " ") ++ () "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.string.2 (copy-seq " ") ++ () "abc" 3 "abc ") ++ ++(def-read-sequence-test read-sequence.string.3 (copy-seq " ") ++ (:start 1) "abcdefghijk" 5 " abcd") ++ ++(def-read-sequence-test read-sequence.string.4 (copy-seq " ") ++ (:end 3) "abcdefghijk" 3 "abc ") ++ ++(def-read-sequence-test read-sequence.string.5 (copy-seq " ") ++ (:start 1 :end 4) "abcdefghijk" 4 " abc ") ++ ++(def-read-sequence-test read-sequence.string.6 (copy-seq " ") ++ (:start 0 :end 0) "abcdefghijk" 0 " ") ++ ++(def-read-sequence-test read-sequence.string.7 (copy-seq " ") ++ (:end nil) "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.string.8 (copy-seq " ") ++ (:allow-other-keys nil) "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.string.9 (copy-seq " ") ++ (:allow-other-keys t :foo 'bar) "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.string.10 (copy-seq " ") ++ (:foo 'bar :allow-other-keys 'x) "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.string.11 (copy-seq " ") ++ (:foo 'bar :allow-other-keys 'x :allow-other-keys nil) ++ "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.string.12 (copy-seq " ") ++ (:end 5 :end 3 :start 0 :start 1) "abcdefghijk" 5 "abcde") ++ ++;;; Read into a base string ++ ++(def-read-sequence-test read-sequence.base-string.1 ++ (make-array 5 :element-type 'base-char) ++ () "abcdefghijk" 5 "abcde") ++ ++(def-read-sequence-test read-sequence.base-string.2 ++ (make-array 5 :element-type 'base-char :initial-element #\Space) ++ () "abc" 3 "abc ") ++ ++(def-read-sequence-test read-sequence.base-string.3 ++ (make-array 5 :element-type 'base-char :initial-element #\Space) ++ (:start 1) "abcdefghijk" 5 " abcd") ++ ++(def-read-sequence-test read-sequence.base-string.4 ++ (make-array 5 :element-type 'base-char :initial-element #\Space) ++ (:end 3) "abcdefghijk" 3 "abc ") ++ ++(def-read-sequence-test read-sequence.base-string.5 ++ (make-array 5 :element-type 'base-char :initial-element #\Space) ++ (:start 1 :end 4) "abcdefghijk" 4 " abc ") ++ ++(def-read-sequence-test read-sequence.base-string.6 ++ (make-array 5 :element-type 'base-char :initial-element #\Space) ++ (:start 0 :end 0) "abcdefghijk" 0 " ") ++ ++(def-read-sequence-test read-sequence.base-string.7 ++ (make-array 5 :element-type 'base-char :initial-element #\Space) ++ (:end nil) "abcdefghijk" 5 "abcde") ++ ++;;; Read into a list ++ ++(def-read-sequence-test read-sequence.list.1 (make-list 5) ++ () "abcdefghijk" 5 (#\a #\b #\c #\d #\e)) ++ ++(def-read-sequence-test read-sequence.list.2 (make-list 5) ++ () "abc" 3 (#\a #\b #\c nil nil)) ++ ++(def-read-sequence-test read-sequence.list.3 (make-list 5) ++ (:start 1) "abcdefghijk" 5 (nil #\a #\b #\c #\d)) ++ ++(def-read-sequence-test read-sequence.list.4 (make-list 5) ++ (:end 3) "abcdefghijk" 3 (#\a #\b #\c nil nil)) ++ ++(def-read-sequence-test read-sequence.list.5 (make-list 5) ++ (:end 4 :start 1) "abcdefghijk" 4 (nil #\a #\b #\c nil)) ++ ++(def-read-sequence-test read-sequence.list.6 (make-list 5) ++ (:start 0 :end 0) "abcdefghijk" 0 (nil nil nil nil nil)) ++ ++(def-read-sequence-test read-sequence.list.7 (make-list 5) ++ (:end nil) "abcdefghijk" 5 (#\a #\b #\c #\d #\e)) ++ ++;;; Read into a vector ++ ++(def-read-sequence-test read-sequence.vector.1 ++ (vector nil nil nil nil nil) ++ () "abcdefghijk" 5 #(#\a #\b #\c #\d #\e)) ++ ++(def-read-sequence-test read-sequence.vector.2 ++ (vector nil nil nil nil nil) ++ () "abc" 3 #(#\a #\b #\c nil nil)) ++ ++(def-read-sequence-test read-sequence.vector.3 ++ (vector nil nil nil nil nil) ++ (:start 2) "abcdefghijk" 5 #(nil nil #\a #\b #\c)) ++ ++(def-read-sequence-test read-sequence.vector.4 ++ (vector nil nil nil nil nil) ++ (:start 1 :end 4) "abcdefghijk" 4 #(nil #\a #\b #\c nil)) ++ ++(def-read-sequence-test read-sequence.vector.5 ++ (vector nil nil nil nil nil) ++ (:end 2) "abcdefghijk" 2 #(#\a #\b nil nil nil)) ++ ++(def-read-sequence-test read-sequence.vector.6 ++ (vector nil nil nil nil nil) ++ (:end 0 :start 0) "abcdefghijk" 0 #(nil nil nil nil nil)) ++ ++(def-read-sequence-test read-sequence.vector.7 ++ (vector nil nil nil nil nil) ++ (:end nil) "abcdefghijk" 5 #(#\a #\b #\c #\d #\e)) ++ ++;;; Read into a vector with a fill pointer ++ ++(def-read-sequence-test read-sequence.fill-vector.1 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ () "abcdefghijk" 5 #(#\a #\b #\c #\d #\e)) ++ ++(def-read-sequence-test read-sequence.fill-vector.2 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ () "ab" 2 #(#\a #\b nil nil nil)) ++ ++(def-read-sequence-test read-sequence.fill-vector.3 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ () "" 0 #(nil nil nil nil nil)) ++ ++(def-read-sequence-test read-sequence.fill-vector.4 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ (:start 2) "abcdefghijk" 5 #(nil nil #\a #\b #\c)) ++ ++(def-read-sequence-test read-sequence.fill-vector.5 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ (:start 1 :end 4) "abcdefghijk" 4 #(nil #\a #\b #\c nil)) ++ ++(def-read-sequence-test read-sequence.fill-vector.6 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ (:end 2) "abcdefghijk" 2 #(#\a #\b nil nil nil)) ++ ++(def-read-sequence-test read-sequence.fill-vector.7 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ (:end 0 :start 0) "abcdefghijk" 0 #(nil nil nil nil nil)) ++ ++(def-read-sequence-test read-sequence.fill-vector.8 ++ (make-array 10 :initial-element nil :fill-pointer 5) ++ (:end nil) "abcdefghijk" 5 #(#\a #\b #\c #\d #\e)) ++ ++;;; Nil vectors ++ ++(deftest read-sequence.nil-vector.1 ++ :notes (:nil-vectors-are-strings) ++ (let ((s (make-array 0 :element-type nil))) ++ (with-input-from-string ++ (is "abcde") ++ (values ++ (read-sequence s is) ++ s))) ++ 0 "") ++ ++;;; Read into a bit vector ++ ++(defmacro def-read-sequence-bv-test (name init args &rest expected) ++ `(deftest ,name ++ ;; Create output file ++ (progn ++ (let (os) ++ (unwind-protect ++ (progn ++ (setq os (open "temp.dat" :direction :output ++ :element-type '(unsigned-byte 8) ++ :if-exists :supersede)) ++ (loop for i in '(0 1 1 0 0 1 1 0 1 0 1 1 1 0) ++ do (write-byte i os))) ++ (when os (close os)))) ++ (let (is (bv (copy-seq ,init))) ++ (unwind-protect ++ (progn ++ (setq is (open "temp.dat" :direction :input ++ :element-type '(unsigned-byte 8))) ++ (values ++ (read-sequence bv is ,@args) ++ bv)) ++ (when is (close is))))) ++ ,@expected)) ++ ++(def-read-sequence-bv-test read-sequence.bv.1 #*00000000000000 () ++ 14 #*01100110101110) ++ ++(def-read-sequence-bv-test read-sequence.bv.2 #*00000000000000 (:start 0) ++ 14 #*01100110101110) ++ ++(def-read-sequence-bv-test read-sequence.bv.3 #*00000000000000 (:end 14) ++ 14 #*01100110101110) ++ ++(def-read-sequence-bv-test read-sequence.bv.4 #*00000000000000 (:end nil) ++ 14 #*01100110101110) ++ ++(def-read-sequence-bv-test read-sequence.bv.5 #*00000000000000 (:start 2) ++ 14 #*00011001101011) ++ ++(def-read-sequence-bv-test read-sequence.bv.6 #*00000000000000 ++ (:start 2 :end 13) ++ 13 #*00011001101010) ++ ++(def-read-sequence-bv-test read-sequence.bv.7 #*00000000000000 (:end 6) ++ 6 #*01100100000000) ++ ++;;; Error cases ++ ++(deftest read-sequence.error.1 ++ (signals-error (read-sequence) program-error) ++ t) ++ ++(deftest read-sequence.error.2 ++ (signals-error (read-sequence (make-string 10)) program-error) ++ t) ++ ++(deftest read-sequence.error.3 ++ (signals-error ++ (read-sequence (make-string 5) (make-string-input-stream "abc") :start) ++ program-error) ++ t) ++ ++(deftest read-sequence.error.4 ++ (signals-error ++ (read-sequence (make-string 5) (make-string-input-stream "abc") :foo 1) ++ program-error) ++ t) ++ ++(deftest read-sequence.error.5 ++ (signals-error ++ (read-sequence (make-string 5) (make-string-input-stream "abc") ++ :allow-other-keys nil :bar 2) ++ program-error) ++ t) ++ ++(deftest read-sequence.error.6 ++ (check-type-error #'(lambda (x) (read-sequence x (make-string-input-stream "abc"))) ++ #'sequencep) ++ nil) ++ ++(deftest read-sequence.error.7 ++ (signals-error ++ (read-sequence (cons 'a 'b) (make-string-input-stream "abc")) ++ type-error) ++ t) ++ ++;;; This test appears to cause Allegro CL to crash ++(deftest read-sequence.error.8 ++ (signals-type-error x -1 ++ (read-sequence (make-string 3) ++ (make-string-input-stream "abc") ++ :start x)) ++ t) ++ ++(deftest read-sequence.error.9 ++ (check-type-error #'(lambda (s) ++ (read-sequence (make-string 3) (make-string-input-stream "abc") ++ :start s)) ++ (typef 'unsigned-byte)) ++ nil) ++ ++(deftest read-sequence.error.10 ++ (signals-type-error x -1 ++ (read-sequence (make-string 3) (make-string-input-stream "abc") ++ :end x)) ++ t) ++ ++(deftest read-sequence.error.11 ++ (check-type-error #'(lambda (e) ++ (read-sequence (make-string 3) (make-string-input-stream "abc") ++ :end e)) ++ (typef '(or unsigned-byte null))) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/rename-file.lsp +@@ -0,0 +1,199 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 8 06:22:53 2004 ++;;;; Contains: Tests for RENAME-FILE ++ ++(in-package :cl-test) ++ ++(deftest rename-file.1 ++ (let ((pn1 #p"file-to-be-renamed.txt") ++ (pn2 #p"file-that-was-renamed.txt")) ++ (delete-all-versions pn1) ++ (delete-all-versions pn2) ++ (with-open-file (s pn1 :direction :output) (format s "Whatever~%")) ++ (let ((results (multiple-value-list (rename-file pn1 pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (values ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn2)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename)))))) ++ t nil t (t t t nil nil) t nil t) ++ ++(deftest rename-file.2 ++ (let ((pn1 "file-to-be-renamed.txt") ++ (pn2 "file-that-was-renamed.txt")) ++ (delete-all-versions pn1) ++ (delete-all-versions pn2) ++ (with-open-file (s pn1 :direction :output) (format s "Whatever~%")) ++ (let ((results (multiple-value-list (rename-file pn1 pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (values ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn2)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename)))))) ++ t nil t (t t t nil nil) t nil t) ++ ++ (deftest rename-file.3 ++ (let* ((pn1 (make-pathname :name "file-to-be-renamed" ++ :type "txt" ++ :version :newest ++ :defaults *default-pathname-defaults*)) ++ (pn2 (make-pathname :name "file-that-was-renamed")) ++ (pn3 (make-pathname :name "file-that-was-renamed" ++ :defaults pn1))) ++ (delete-all-versions pn1) ++ (delete-all-versions pn3) ++ (with-open-file (s pn1 :direction :output) (format s "Whatever~%")) ++ (let ((results (multiple-value-list (rename-file pn1 pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (values ++ (equalpt (pathname-type pn1) ++ (pathname-type defaulted-new-name)) ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn3)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename)))))) ++ t t nil t (t t t nil nil) t nil t) ++ ++(deftest rename-file.4 ++ (let ((pn1 "file-to-be-renamed.txt") ++ (pn2 "file-that-was-renamed.txt")) ++ (delete-all-versions pn1) ++ (delete-all-versions pn2) ++ (let ((s (open pn1 :direction :output))) ++ (format s "Whatever~%") ++ (close s) ++ (let ((results (multiple-value-list (rename-file s pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (values ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn2)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename))))))) ++ t nil t (t t t nil nil) t nil t) ++ ++(deftest rename-file.5 ++ (let ((pn1 "CLTEST:FILE-TO-BE-RENAMED.TXT") ++ (pn2 "CLTEST:FILE-THAT-WAS-RENAMED.TXT")) ++ (delete-all-versions pn1) ++ (delete-all-versions pn2) ++ (assert (typep (pathname pn1) 'logical-pathname)) ++ (assert (typep (pathname pn2) 'logical-pathname)) ++ (with-open-file (s pn1 :direction :output) (format s "Whatever~%")) ++ (let ((results (multiple-value-list (rename-file pn1 pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (values ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn2)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename)) ++ (notnot (typep defaulted-new-name 'logical-pathname)) ++ )))) ++ t nil t (t t t nil nil) t nil t t) ++ ++;;; Specialized string tests ++ ++(deftest rename-file.6 ++ (do-special-strings ++ (s "file-to-be-renamed.txt" nil) ++ (let ((pn1 s) ++ (pn2 "file-that-was-renamed.txt")) ++ (delete-all-versions pn1) ++ (delete-all-versions pn2) ++ (with-open-file (s pn1 :direction :output) (format s "Whatever~%")) ++ (let ((results (multiple-value-list (rename-file pn1 pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (assert ++ (equal ++ (list ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn2)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename))) ++ '(t nil t (t t t nil nil) t nil t))))))) ++ nil) ++ ++(deftest rename-file.7 ++ (do-special-strings ++ (s "file-that-was-renamed.txt" nil) ++ (let ((pn1 "file-to-be-renamed.txt") ++ (pn2 s)) ++ (delete-all-versions pn1) ++ (delete-all-versions pn2) ++ (with-open-file (s pn1 :direction :output) (format s "Whatever~%")) ++ (let ((results (multiple-value-list (rename-file pn1 pn2)))) ++ (destructuring-bind (defaulted-new-name old-truename new-truename) ++ results ++ (assert ++ (equal ++ (list ++ (=t (length results) 3) ++ (probe-file pn1) ++ (notnot (probe-file pn2)) ++ (list (notnot (pathnamep defaulted-new-name)) ++ (notnot (pathnamep old-truename)) ++ (notnot (pathnamep new-truename)) ++ (typep old-truename 'logical-pathname) ++ (typep new-truename 'logical-pathname)) ++ (notnot (probe-file defaulted-new-name)) ++ (probe-file old-truename) ++ (notnot (probe-file new-truename))) ++ '(t nil t (t t t nil nil) t nil t))))))) ++ nil) ++ ++;;; Error tests ++ ++(deftest rename-file.error.1 ++ (signals-error (rename-file) program-error) ++ t) ++ +--- gcl-2.6.12.orig/ansi-tests/rt.lsp ++++ gcl-2.6.12/ansi-tests/rt.lsp +@@ -21,81 +21,147 @@ + | SOFTWARE. | + |----------------------------------------------------------------------------|# + +-;This is the December 19, 1990 version of the regression tester. ++;This was the December 19, 1990 version of the regression tester, but ++;has since been modified. + + (in-package :regression-test) + ++(declaim (ftype (function (t) t) get-entry expanded-eval do-entries)) ++(declaim (type list *entries*)) ++(declaim (ftype (function (t &rest t) t) report-error)) ++(declaim (ftype (function (t &optional t) t) do-entry)) ++ + (defvar *test* nil "Current test name") + (defvar *do-tests-when-defined* nil) +-(defvar *entries* '(nil) "Test database") ++(defvar *entries* (list nil) "Test database. Has a leading dummy cell that does not contain an entry.") ++(defvar *entries-tail* *entries* "Tail of the *entries* list") ++(defvar *entries-table* (make-hash-table :test #'equal) ++ "Map the names of entries to the cons cell in *entries* that precedes the one whose car is the entry.") + (defvar *in-test* nil "Used by TEST") + (defvar *debug* nil "For debugging") + (defvar *catch-errors* t "When true, causes errors in a test to be caught.") + (defvar *print-circle-on-failure* nil + "Failure reports are printed with *PRINT-CIRCLE* bound to this value.") + +-(defvar *compile-tests* nil "When true, compile the tests before running +-them.") ++(defvar *compile-tests* nil "When true, compile the tests before running them.") ++(defvar *expanded-eval* nil "When true, convert the tests into a form that is less likely to have compiler optimizations.") + (defvar *optimization-settings* '((safety 3))) + ++(defvar *failed-tests* nil "After DO-TESTS, becomes the list of names of tests that have failed") ++(defvar *passed-tests* nil "After DO-TESTS, becomes the list of names of tests that have passed") ++ + (defvar *expected-failures* nil + "A list of test names that are expected to fail.") + +-(defstruct (entry (:conc-name nil) +- (:type list)) +- pend name form) +- +-(defmacro vals (entry) `(cdddr ,entry)) +- +-(defmacro defn (entry) `(cdr ,entry)) ++(defvar *notes* (make-hash-table :test 'equal) ++ "A mapping from names of notes to note objects.") ++ ++(defstruct (entry (:conc-name nil)) ++ pend name props form vals) ++ ++;;; Note objects are used to attach information to tests. ++;;; A typical use is to mark tests that depend on a particular ++;;; part of a set of requirements, or a particular interpretation ++;;; of the requirements. ++ ++(defstruct note ++ name ++ contents ++ disabled ;; When true, tests with this note are considered inactive ++ ) ++ ++;; (defmacro vals (entry) `(cdddr ,entry)) ++ ++(defmacro defn (entry) ++ (let ((var (gensym))) ++ `(let ((,var ,entry)) ++ (list* (name ,var) (form ,var) (vals ,var))))) ++ ++(defun entry-notes (entry) ++ (let* ((props (props entry)) ++ (notes (getf props :notes))) ++ (if (listp notes) ++ notes ++ (list notes)))) ++ ++(defun has-disabled-note (entry) ++ (let ((notes (entry-notes entry))) ++ (loop for n in notes ++ for note = (if (note-p n) n ++ (gethash n *notes*)) ++ thereis (and note (note-disabled note))))) ++ ++(defun has-note (entry note) ++ (unless (note-p note) ++ (let ((new-note (gethash note *notes*))) ++ (setf note new-note))) ++ (and note (not (not (member note (entry-notes entry)))))) + + (defun pending-tests () +- (do ((l (cdr *entries*) (cdr l)) +- (r nil)) +- ((null l) (nreverse r)) +- (when (pend (car l)) +- (push (name (car l)) r)))) ++ (loop for entry in (cdr *entries*) ++ when (and (pend entry) (not (has-disabled-note entry))) ++ collect (name entry))) + + (defun rem-all-tests () + (setq *entries* (list nil)) ++ (setq *entries-tail* *entries*) ++ (clrhash *entries-table*) + nil) + + (defun rem-test (&optional (name *test*)) +- (do ((l *entries* (cdr l))) +- ((null (cdr l)) nil) +- (when (equal (name (cadr l)) name) +- (setf (cdr l) (cddr l)) +- (return name)))) ++ (let ((pred (gethash name *entries-table*))) ++ (when pred ++ (if (null (cddr pred)) ++ (setq *entries-tail* pred) ++ (setf (gethash (name (caddr pred)) *entries-table*) pred)) ++ (setf (cdr pred) (cddr pred)) ++ (remhash name *entries-table*) ++ name))) + + (defun get-test (&optional (name *test*)) + (defn (get-entry name))) + + (defun get-entry (name) +- (let ((entry (find name (cdr *entries*) +- :key #'name +- :test #'equal))) ++ (let ((entry ;; (find name (the list (cdr *entries*)) ++ ;; :key #'name :test #'equal) ++ (cadr (gethash name *entries-table*)) ++ )) + (when (null entry) + (report-error t + "~%No test with name ~:@(~S~)." + name)) + entry)) + +-(defmacro deftest (name form &rest values) +- `(add-entry '(t ,name ,form .,values))) ++(defmacro deftest (name &rest body) ++ (let* ((p body) ++ (properties ++ (loop while (keywordp (first p)) ++ unless (cadr p) ++ do (error "Poorly formed deftest: ~A~%" ++ (list* 'deftest name body)) ++ append (list (pop p) (pop p)))) ++ (form (pop p)) ++ (vals p)) ++ `(add-entry (make-entry :pend t ++ :name ',name ++ :props ',properties ++ :form ',form ++ :vals ',vals)))) + + (defun add-entry (entry) +- (setq entry (copy-list entry)) +- (do ((l *entries* (cdr l))) (nil) +- (when (null (cdr l)) +- (setf (cdr l) (list entry)) +- (return nil)) +- (when (equal (name (cadr l)) +- (name entry)) +- (setf (cadr l) entry) ++ (setq entry (copy-entry entry)) ++ (let* ((pred (gethash (name entry) *entries-table*))) ++ (cond ++ (pred ++ (setf (cadr pred) entry) + (report-error nil + "Redefining test ~:@(~S~)" +- (name entry)) +- (return nil))) ++ (name entry))) ++ (t ++ (setf (gethash (name entry) *entries-table*) *entries-tail*) ++ (setf (cdr *entries-tail*) (cons entry nil)) ++ (setf *entries-tail* (cdr *entries-tail*)) ++ ))) + (when *do-tests-when-defined* + (do-entry entry)) + (setq *test* (name entry))) +@@ -105,53 +171,59 @@ them.") + (apply #'format t args) + (if error? (throw '*debug* nil))) + (error? (apply #'error args)) +- (t (apply #'warn args)))) ++ (t (apply #'warn args))) ++ nil) + +-(defun do-test (&optional (name *test*)) +- (do-entry (get-entry name))) ++(defun do-test (&optional (name *test*) &rest key-args) ++ (flet ((%parse-key-args ++ (&key ++ ((:catch-errors *catch-errors*) *catch-errors*) ++ ((:compile *compile-tests*) *compile-tests*)) ++ (do-entry (get-entry name)))) ++ (apply #'%parse-key-args key-args))) ++ ++(defun my-aref (a &rest args) ++ (apply #'aref a args)) ++ ++(defun my-row-major-aref (a index) ++ (row-major-aref a index)) + + (defun equalp-with-case (x y) + "Like EQUALP, but doesn't do case conversion of characters. + Currently doesn't work on arrays of dimension > 2." + (cond ++ ((eq x y) t) + ((consp x) + (and (consp y) + (equalp-with-case (car x) (car y)) + (equalp-with-case (cdr x) (cdr y)))) + ((and (typep x 'array) + (= (array-rank x) 0)) +- (equalp-with-case (aref x) (aref y))) ++ (equalp-with-case (my-aref x) (my-aref y))) + ((typep x 'vector) + (and (typep y 'vector) + (let ((x-len (length x)) + (y-len (length y))) + (and (eql x-len y-len) + (loop +- for e1 across x +- for e2 across y ++ for i from 0 below x-len ++ for e1 = (my-aref x i) ++ for e2 = (my-aref y i) + always (equalp-with-case e1 e2)))))) + ((and (typep x 'array) + (typep y 'array) + (not (equal (array-dimensions x) + (array-dimensions y)))) + nil) +- #| +- ((and (typep x 'array) +- (= (array-rank x) 2)) +- (let ((dim (array-dimensions x))) +- (loop for i from 0 below (first dim) +- always (loop for j from 0 below (second dim) +- always (equalp-with-case (aref x i j) +- (aref y i j)))))) +- |# + + ((typep x 'array) + (and (typep y 'array) + (let ((size (array-total-size x))) + (loop for i from 0 below size +- always (equalp-with-case (row-major-aref x i) +- (row-major-aref y i)))))) +- ++ always (equalp-with-case (my-row-major-aref x i) ++ (my-row-major-aref y i)))))) ++ ((typep x 'pathname) ++ (equal x y)) + (t (eql x y)))) + + (defun do-entry (entry &optional +@@ -165,49 +237,110 @@ them.") + r) + ;; (declare (special *break-on-warnings*)) + +- (flet ((%do +- () +- (setf r +- (multiple-value-list +- (if *compile-tests* +- (funcall (compile +- nil +- `(lambda () +- (declare +- (optimize ,@*optimization-settings*)) +- ,(form entry)))) +- (eval (form entry))))))) +- (block aborted +- (if *catch-errors* +- (handler-bind (#-ecl (style-warning #'muffle-warning) +- (error #'(lambda (c) +- (setf aborted t) +- (setf r (list c)) +- (return-from aborted nil)))) +- (%do)) +- (%do)))) +- ++ (block aborted ++ (setf r ++ (flet ((%do () ++ (handler-bind ++ #-sbcl nil ++ #+sbcl ((sb-ext:code-deletion-note #'(lambda (c) ++ (if (has-note entry :do-not-muffle) ++ nil ++ (muffle-warning c))))) ++ (cond ++ (*compile-tests* ++ (multiple-value-list ++ (funcall (compile ++ nil ++ `(lambda () ++ (declare ++ (optimize ,@*optimization-settings*)) ++ ,(form entry)))))) ++ (*expanded-eval* ++ (multiple-value-list ++ (expanded-eval (form entry)))) ++ (t ++ (multiple-value-list ++ (eval (form entry)))))))) ++ (if *catch-errors* ++ (handler-bind ++ (#-ecl (style-warning #'(lambda (c) (if (has-note entry :do-not-muffle-warnings) ++ c ++ (muffle-warning c)))) ++ (error #'(lambda (c) ++ (setf aborted t) ++ (setf r (list c)) ++ (return-from aborted nil)))) ++ (%do)) ++ (%do))))) ++ + (setf (pend entry) + (or aborted + (not (equalp-with-case r (vals entry))))) ++ + (when (pend entry) + (let ((*print-circle* *print-circle-on-failure*)) +- (format s "~&Test ~:@(~S~) failed~%Form: ~S~%Expected value~P:~%" +- *test* (form entry) (length (vals entry))) +- (dolist (v (vals entry)) (format s "~10t~S~%" v)) +- (format s "Actual value~P:~%" (length r)) +- (dolist (v r) +- (format s "~10t~S~:[~; [~2:*~A]~]~%" +- v (typep v 'condition))))))) ++ (format s "~&Test ~:@(~S~) failed~ ++ ~%Form: ~S~ ++ ~%Expected value~P: ~ ++ ~{~S~^~%~17t~}~%" ++ *test* (form entry) ++ (length (vals entry)) ++ (vals entry)) ++ (handler-case ++ (let ((st (format nil "Actual value~P: ~ ++ ~{~S~^~%~15t~}.~%" ++ (length r) r))) ++ (format s "~A" st)) ++ (error () (format s "Actual value: #~%"))) ++ (finish-output s))))) + (when (not (pend entry)) *test*)) + ++(defun expanded-eval (form) ++ "Split off top level of a form and eval separately. This reduces the chance that ++ compiler optimizations will fold away runtime computation." ++ (if (not (consp form)) ++ (eval form) ++ (let ((op (car form))) ++ (cond ++ ((eq op 'let) ++ (let* ((bindings (loop for b in (cadr form) ++ collect (if (consp b) b (list b nil)))) ++ (vars (mapcar #'car bindings)) ++ (binding-forms (mapcar #'cadr bindings))) ++ (apply ++ (the function ++ (eval `(lambda ,vars ,@(cddr form)))) ++ (mapcar #'eval binding-forms)))) ++ ((and (eq op 'let*) (cadr form)) ++ (let* ((bindings (loop for b in (cadr form) ++ collect (if (consp b) b (list b nil)))) ++ (vars (mapcar #'car bindings)) ++ (binding-forms (mapcar #'cadr bindings))) ++ (funcall ++ (the function ++ (eval `(lambda (,(car vars) &aux ,@(cdr bindings)) ,@(cddr form)))) ++ (eval (car binding-forms))))) ++ ((eq op 'progn) ++ (loop for e on (cdr form) ++ do (if (null (cdr e)) (return (eval (car e))) ++ (eval (car e))))) ++ ((and (symbolp op) (fboundp op) ++ (not (macro-function op)) ++ (not (special-operator-p op))) ++ (apply (symbol-function op) ++ (mapcar #'eval (cdr form)))) ++ (t (eval form)))))) ++ + (defun continue-testing () + (if *in-test* + (throw '*in-test* nil) + (do-entries *standard-output*))) + +-(defun do-tests (&optional +- (out *standard-output*)) ++(defun do-tests (&key (out *standard-output*) ++ ((:catch-errors *catch-errors*) *catch-errors*) ++ ((:compile *compile-tests*) *compile-tests*)) ++ (setq *failed-tests* nil ++ *passed-tests* nil) + (dolist (entry (cdr *entries*)) + (setf (pend entry) t)) + (if (streamp out) +@@ -219,13 +352,19 @@ them.") + (defun do-entries (s) + (format s "~&Doing ~A pending test~:P ~ + of ~A tests total.~%" +- (count t (cdr *entries*) +- :key #'pend) ++ (count t (the list (cdr *entries*)) :key #'pend) + (length (cdr *entries*))) ++ (finish-output s) + (dolist (entry (cdr *entries*)) +- (when (pend entry) +- (format s "~@[~<~%~:; ~:@(~S~)~>~]" +- (do-entry entry s)))) ++ (when (and (pend entry) ++ (not (has-disabled-note entry))) ++ (let ((success? (do-entry entry s))) ++ (if success? ++ (push (name entry) *passed-tests*) ++ (push (name entry) *failed-tests*)) ++ (format s "~@[~<~%~:; ~:@(~S~)~>~]" success?)) ++ (finish-output s) ++ )) + (let ((pending (pending-tests)) + (expected-table (make-hash-table :test #'equal))) + (dolist (ex *expected-failures*) +@@ -252,19 +391,46 @@ them.") + ~^, ~}~)." + (length new-failures) + new-failures))) +- (when *expected-failures* +- (let ((pending-table (make-hash-table :test #'equal))) +- (dolist (ex pending) +- (setf (gethash ex pending-table) t)) +- (let ((unexpected-successes +- (loop :for ex :in *expected-failures* +- :unless (gethash ex pending-table) :collect ex))) +- (if unexpected-successes +- (format t "~&~:D unexpected successes: ~ +- ~:@(~{~<~% ~1:;~S~>~ +- ~^, ~}~)." +- (length unexpected-successes) +- unexpected-successes) +- (format t "~&No unexpected successes."))))) + )) ++ (finish-output s) + (null pending)))) ++ ++;;; Note handling functions and macros ++ ++(defmacro defnote (name contents &optional disabled) ++ `(eval-when (:load-toplevel :execute) ++ (let ((note (make-note :name ',name ++ :contents ',contents ++ :disabled ',disabled))) ++ (setf (gethash (note-name note) *notes*) note) ++ note))) ++ ++(defun disable-note (n) ++ (let ((note (if (note-p n) n ++ (setf n (gethash n *notes*))))) ++ (unless note (error "~A is not a note or note name." n)) ++ (setf (note-disabled note) t) ++ note)) ++ ++(defun enable-note (n) ++ (let ((note (if (note-p n) n ++ (setf n (gethash n *notes*))))) ++ (unless note (error "~A is not a note or note name." n)) ++ (setf (note-disabled note) nil) ++ note)) ++ ++;;; Extended random regression ++ ++(defun do-extended-tests (&key (tests *passed-tests*) (count nil) ++ ((:catch-errors *catch-errors*) *catch-errors*) ++ ((:compile *compile-tests*) *compile-tests*)) ++ "Execute randomly chosen tests from TESTS until one fails or until ++ COUNT is an integer and that many tests have been executed." ++ (let ((test-vector (coerce tests 'simple-vector))) ++ (let ((n (length test-vector))) ++ (when (= n 0) (error "Must provide at least one test.")) ++ (loop for i from 0 ++ for name = (svref test-vector (random n)) ++ until (eql i count) ++ do (print name) ++ unless (do-test name) return (values name (1+ i)))))) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/stream-element-type.lsp +@@ -0,0 +1,102 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 13 20:09:50 2004 ++;;;; Contains: Tests for STREAM-ELEMENT-TYPE ++ ++(in-package :cl-test) ++ ++(deftest stream-element-type.1 ++ (loop for s in (list *debug-io* *error-output* *query-io* ++ *standard-input* *standard-output* ++ *trace-output* *terminal-io*) ++ for results = (multiple-value-list (stream-element-type s)) ++ unless (and (eql (length results) 1) ++ (car results)) ++ collect s) ++ nil) ++ ++(deftest stream-element-type.2 ++ (let ((pn "foo.txt")) ++ (loop for i from 1 to 100 ++ for etype = `(unsigned-byte ,i) ++ for s = (progn (delete-all-versions pn) ++ (open pn :direction :output ++ :element-type etype)) ++ unless ++ (multiple-value-bind (sub good) ++ (subtypep etype (stream-element-type s)) ++ (close s) ++ (or sub (not good))) ++ collect i)) ++ nil) ++ ++(deftest stream-element-type.3 ++ (let ((pn "foo.txt")) ++ (loop for i from 1 to 100 ++ for etype = `(signed-byte ,i) ++ for s = (progn (delete-all-versions pn) ++ (open pn :direction :output ++ :element-type etype)) ++ unless ++ (multiple-value-bind (sub good) ++ (subtypep etype (stream-element-type s)) ++ (close s) ++ (or sub (not good))) ++ collect i)) ++ nil) ++ ++(deftest stream-element-type.4 ++ (let ((pn "foo.txt")) ++ (loop for i from 1 to 100 ++ for etype = `(integer 0 ,i) ++ for s = (progn (delete-all-versions pn) ++ (open pn :direction :output ++ :element-type etype)) ++ unless ++ (multiple-value-bind (sub good) ++ (subtypep etype (stream-element-type s)) ++ (close s) ++ (or sub (not good))) ++ collect i)) ++ nil) ++ ++ ++(deftest stream-element-type.5 ++ :notes (:assume-no-simple-streams) ++ (let ((pn "foo.txt")) ++ (delete-all-versions pn) ++ (let ((s (open pn :direction :output))) ++ (let ((etype (stream-element-type s))) ++ (unwind-protect ++ (equalt (multiple-value-list (subtypep* 'character etype)) ++ '(nil t)) ++ (close s))))) ++ nil) ++ ++(deftest stream-element-type.6 ++ :notes (:assume-no-simple-streams) ++ (let ((pn "foo.txt")) ++ (delete-all-versions pn) ++ (let ((s (open pn :direction :output ++ :element-type :default))) ++ (let ((etype (stream-element-type s))) ++ (unwind-protect ++ (multiple-value-bind (sub1 good1) (subtypep* etype 'integer) ++ (multiple-value-bind (sub2 good2) (subtypep* etype 'character) ++ (or (not good1) ++ (not good2) ++ sub1 sub2))) ++ (close s))))) ++ t) ++ ++(deftest stream-element-type.error.1 ++ (signals-error (stream-element-type) program-error) ++ t) ++ ++(deftest stream-element-type.error.2 ++ (signals-error (stream-element-type *standard-input* nil) program-error) ++ t) ++ ++(deftest stream-element-type.error.3 ++ (check-type-error #'stream-element-type #'streamp) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/stream-error-stream.lsp +@@ -0,0 +1,34 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 20:51:33 2004 ++;;;; Contains: Tests of STREAM-ERROR-STREAM ++ ++(in-package :cl-test) ++ ++(deftest stream-error-stream.1 ++ (with-input-from-string ++ (s "") ++ (handler-case ++ (read-char s) ++ (stream-error (c) (eqlt (stream-error-stream c) s)))) ++ t) ++ ++;;; Error tests ++ ++(deftest stream-error-stream.error.1 ++ (signals-error (stream-error-stream) program-error) ++ t) ++ ++ ++(deftest stream-error-stream.error.2 ++ (signals-error ++ (with-input-from-string ++ (s "") ++ (handler-case ++ (read-char s) ++ (stream-error (c) (stream-error-stream c nil)))) ++ program-error) ++ t) ++ ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/stream-external-format.lsp +@@ -0,0 +1,24 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 27 20:53:21 2004 ++;;;; Contains: Tests of STREAM-EXTERNAL-FORMAT ++ ++(in-package :cl-test) ++ ++;;; This is tested in open.lsp ++ ++;;; Error tests ++ ++(deftest stream-external-format.error.1 ++ (signals-error (stream-external-format) program-error) ++ t) ++ ++(deftest stream-external-format.error.2 ++ (signals-error ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn :direction :output :if-exists :supersede) ++ (stream-external-format s nil))) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/streamp.lsp +@@ -0,0 +1,44 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Jan 17 17:12:38 2004 ++;;;; Contains: Tests for STREAMP ++ ++(in-package :cl-test) ++ ++(deftest streamp.1 ++ (loop for s in (list *debug-io* *error-output* *query-io* ++ *standard-input* *standard-output* ++ *trace-output* *terminal-io*) ++ unless (equal (multiple-value-list (notnot-mv (streamp s))) ++ '(t)) ++ collect s) ++ nil) ++ ++(deftest streamp.2 ++ (check-type-predicate #'streamp 'stream) ++ 0) ++ ++(deftest streamp.3 ++ (let ((s (open "foo.txt" :direction :output ++ :if-exists :supersede))) ++ (close s) ++ (notnot-mv (streamp s))) ++ t) ++ ++(deftest streamp.4 ++ (let ((s (open "foo.txt" :direction :output ++ :if-exists :supersede))) ++ (unwind-protect ++ (notnot-mv (streamp s)) ++ (close s))) ++ t) ++ ++;;; Error tests ++ ++(deftest streamp.error.1 ++ (signals-error (streamp) program-error) ++ t) ++ ++(deftest streamp.error.2 ++ (signals-error (streamp *standard-input* nil) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/synonym-stream-symbol.lsp +@@ -0,0 +1,23 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Jan 29 21:21:06 2004 ++;;;; Contains: Tests of SYNONYM-STREAM-SYMBOL ++ ++(in-package :cl-test) ++ ++(deftest synonym-stream-symbol.1 ++ (synonym-stream-symbol (make-synonym-stream '*standard-input*)) ++ *standard-input*) ++ ++(deftest synonym-stream-symbol.error.1 ++ (signals-error (synonym-stream-symbol) program-error) ++ t) ++ ++(deftest synonym-stream-symbol.error.2 ++ (signals-error (synonym-stream-symbol ++ (make-synonym-stream '*terminal-io*) ++ nil) ++ program-error) ++ t) ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/terpri.lsp +@@ -0,0 +1,62 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 20:35:57 2004 ++;;;; Contains: Tests of TERPRI ++ ++(in-package :cl-test) ++ ++(deftest terpri.1 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (write-char #\a) ++ (setq result (terpri))) ++ result)) ++ #.(concatenate 'string "a" (string #\Newline)) ++ nil) ++ ++(deftest terpri.2 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (write-char #\a s) ++ (setq result (terpri s))) ++ result)) ++ #.(concatenate 'string "a" (string #\Newline)) ++ nil) ++ ++(deftest terpri.3 ++ (with-output-to-string ++ (s) ++ (write-char #\x s) ++ (terpri s) ++ (terpri s) ++ (write-char #\y s)) ++ #.(concatenate 'string "x" (string #\Newline) (string #\Newline) "y")) ++ ++(deftest terpri.4 ++ (with-output-to-string ++ (os) ++ (let ((*terminal-io* (make-two-way-stream *standard-input* os))) ++ (terpri t) ++ (finish-output t))) ++ #.(string #\Newline)) ++ ++(deftest terpri.5 ++ (with-output-to-string ++ (*standard-output*) ++ (terpri nil)) ++ #.(string #\Newline)) ++ ++;;; Error tests ++ ++(deftest terpri.error.1 ++ (signals-error ++ (with-output-to-string ++ (s) ++ (terpri s nil)) ++ program-error) ++ t) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/translate-logical-pathname.lsp +@@ -0,0 +1,48 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Mon Dec 29 14:45:50 2003 ++;;;; Contains: Tests for TRANSLATE-LOGICAL-PATHNAME ++ ++(in-package :cl-test) ++ ++;; On physical pathnames, t-l-p returns the pathname itself ++ ++;;; Every physical pathname is converted to itself ++(deftest translate-logical-pathname.1 ++ (loop for p in *pathnames* ++ unless (or (typep p 'logical-pathname) ++ (eq p (translate-logical-pathname p))) ++ collect p) ++ nil) ++ ++;;; &key arguments are allowed ++(deftest translate-logical-pathname.2 ++ (loop for p in *pathnames* ++ unless (or (typep p 'logical-pathname) ++ (eq p (translate-logical-pathname ++ p :allow-other-keys t))) ++ collect p) ++ nil) ++ ++(deftest translate-logical-pathname.3 ++ (loop for p in *pathnames* ++ unless (or (typep p 'logical-pathname) ++ (eq p (translate-logical-pathname ++ p :allow-other-keys nil))) ++ collect p) ++ nil) ++ ++(deftest translate-logical-pathname.4 ++ (loop for p in *pathnames* ++ unless (or (typep p 'logical-pathname) ++ (eq p (translate-logical-pathname ++ p :foo 1 :allow-other-keys t :bar 2))) ++ collect p) ++ nil) ++ ++ ++;;; errors ++ ++(deftest translate-logical-pathname.error.1 ++ (signals-error (translate-logical-pathname) program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/translate-pathname.lsp +@@ -0,0 +1,50 @@ ++;-*- Mode: Lisp -*- ++ ++(in-package :cl-test) ++ ++(deftest translate-pathname.1 (translate-pathname "foobar" "foobar" "foobar") #P"foobar") ++(deftest translate-pathname.2 (translate-pathname "foobar" "foobar" "foo*") #P"foo") ++(deftest translate-pathname.3 (translate-pathname "foobar" "foobar" "*") #P"foobar") ++(deftest translate-pathname.4 (translate-pathname "foobar" "foobar" "") #P"foobar") ++ ++(deftest translate-pathname.5 (translate-pathname "foobar" "foo*r" "foobar") #P"foobar") ++(deftest translate-pathname.6 (translate-pathname "foobar" "foo*r" "foo*") #P"fooba") ++(deftest translate-pathname.7 (translate-pathname "foobar" "foo*r" "*") #P"foobar") ++(deftest translate-pathname.8 (translate-pathname "foobar" "foo*r" "") #P"foobar") ++ ++(deftest translate-pathname.9 (translate-pathname "foobar" "*" "foobar") #P"foobar") ++(deftest translate-pathname.10 (translate-pathname "foobar" "*" "foo*") #P"foofoobar") ++(deftest translate-pathname.11 (translate-pathname "foobar" "*" "*") #P"foobar") ++(deftest translate-pathname.12 (translate-pathname "foobar" "*" "") #P"foobar") ++ ++(deftest translate-pathname.13 (translate-pathname "foobar" "" "foobar") #P"foobar") ++(deftest translate-pathname.14 (translate-pathname "foobar" "" "foo*") #P"foofoobar") ++(deftest translate-pathname.15 (translate-pathname "foobar" "" "*") #P"foobar") ++(deftest translate-pathname.16 (translate-pathname "foobar" "" "") #P"foobar") ++ ++(deftest translate-pathname.17 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/qc/c/d/") #P"/a/qc/c/d/") ++(deftest translate-pathname.18 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/q*c*/c/d/") #P"/a/qc/c/d/") ++(deftest translate-pathname.19 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/*/c/d/") #P"/a/c/d/") ++(deftest translate-pathname.20 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "/a/**/d/") #P"/a/d/") ++ ++(deftest translate-pathname.21 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/qc/c/d/") #P"/a/qc/c/d/") ++(deftest translate-pathname.22 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/q*c*/c/d/") #P"/a/qbcb/c/d/") ++(deftest translate-pathname.23 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/*/c/d/") #P"/a/bbfb/c/d/") ++(deftest translate-pathname.24 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "/a/**/d/") #P"/a/bbfb/d/") ++ ++(deftest translate-pathname.25 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/qc/c/d/") #P"/a/qc/c/d/") ++(deftest translate-pathname.26 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/q*c*/c/d/") #P"/a/qc/c/d/") ++(deftest translate-pathname.27 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/*/d/") #P"/a/bbfb/d/") ++(deftest translate-pathname.28 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "/a/**/d/") #P"/a/bbfb/c/d/") ++ ++(deftest translate-pathname.29 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/qc/c/d/") #P"a/qc/c/d/") ++(deftest translate-pathname.30 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/q*c*/c/d/") #P"a/qc/c/d/") ++(deftest translate-pathname.31 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/*/d/") #P"a/bbfb/d/") ++(deftest translate-pathname.32 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a/**/d/") #P"a/bbfb/c/d/") ++ ++(deftest translate-pathname.33 (translate-pathname "/a/bbfb/c/d/" "/a/bbfb/c/d/" "a") #P"/a/bbfb/c/d/a") ++(deftest translate-pathname.34 (translate-pathname "/a/bbfb/c/d/" "/a/b*f*/c/d/" "a") #P"/a/bbfb/c/d/a") ++(deftest translate-pathname.35 (translate-pathname "/a/bbfb/c/d/" "/a/*/c/d/" "a") #P"/a/bbfb/c/d/a") ++(deftest translate-pathname.36 (translate-pathname "/a/bbfb/c/d/" "/a/**/d/" "a") #P"/a/bbfb/c/d/a") ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/truename.lsp +@@ -0,0 +1,108 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 6 05:32:37 2004 ++;;;; Contains: Tests of TRUENAME ++ ++(in-package :cl-test) ++ ++(deftest truename.1 ++ (let* ((pn #p"truename.lsp") ++ (tn (truename pn))) ++ (values ++ (notnot (pathnamep pn)) ++ (typep pn 'logical-pathname) ++ (equalt (pathname-name pn) (pathname-name tn)) ++ (equalt (pathname-type pn) (pathname-type tn)) ++ )) ++ t nil t t) ++ ++(deftest truename.2 ++ (let* ((name "truename.lsp") ++ (pn (pathname name)) ++ (tn (truename name))) ++ (values ++ (notnot (pathnamep pn)) ++ (typep pn 'logical-pathname) ++ (equalt (pathname-name pn) (pathname-name tn)) ++ (equalt (pathname-type pn) (pathname-type tn)) ++ )) ++ t nil t t) ++ ++(deftest truename.3 ++ (let* ((pn #p"truename.lsp")) ++ (with-open-file ++ (s pn :direction :input) ++ (let ((tn (truename s))) ++ (values ++ (notnot (pathnamep pn)) ++ (typep pn 'logical-pathname) ++ (equalt (pathname-name pn) (pathname-name tn)) ++ (equalt (pathname-type pn) (pathname-type tn)) ++ )))) ++ t nil t t) ++ ++(deftest truename.4 ++ (let* ((pn #p"truename.lsp")) ++ (let ((s (open pn :direction :input))) ++ (close s) ++ (let ((tn (truename s))) ++ (values ++ (notnot (pathnamep pn)) ++ (typep pn 'logical-pathname) ++ (equalt (pathname-name pn) (pathname-name tn)) ++ (equalt (pathname-type pn) (pathname-type tn)) ++ )))) ++ t nil t t) ++ ++(deftest truename.5 ++ (let* ((lpn "CLTEST:foo.txt") ++ (pn (translate-logical-pathname lpn))) ++ (unless (probe-file lpn) ++ (with-open-file (s lpn :direction :output) (format s "Stuff~%"))) ++ (let ((tn (truename lpn))) ++ (values ++ (notnot (pathnamep pn)) ++ (if (equalt (pathname-name pn) (pathname-name tn)) ++ t (list (pathname-name pn) (pathname-name tn))) ++ (if (equalt (pathname-type pn) (pathname-type tn)) ++ t (list (pathname-type pn) (pathname-type tn))) ++ ))) ++ t t t) ++ ++;;; Specialized string tests ++ ++(deftest truename.6 ++ (do-special-strings ++ (s "truename.lsp" nil) ++ (assert (equalp (truename s) (truename "truename.lsp")))) ++ nil) ++ ++;;; Error tests ++ ++(deftest truename.error.1 ++ (signals-error (truename) program-error) ++ t) ++ ++(deftest truename.error.2 ++ (signals-error (truename "truename.lsp" nil) program-error) ++ t) ++ ++(deftest truename.error.3 ++ (signals-error-always (truename "nonexistent") file-error) ++ t t) ++ ++(deftest truename.error.4 ++ (signals-error-always (truename #p"nonexistent") file-error) ++ t t) ++ ++(deftest truename.error.5 ++ (signals-error-always (truename (logical-pathname "CLTESTROOT:NONEXISTENT")) file-error) ++ t t) ++ ++(deftest truename.error.6 ++ (signals-error-always ++ (let ((pn (make-pathname :name :wild ++ :defaults *default-pathname-defaults*))) ++ (truename pn)) ++ file-error) ++ t t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/two-way-stream-input-stream.lsp +@@ -0,0 +1,26 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Feb 12 04:22:50 2004 ++;;;; Contains: Tests of TWO-WAY-STREAM-INPUT-STREAM ++ ++(in-package :cl-test) ++ ++(deftest two-way-stream-input-stream.1 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (equalt (multiple-value-list (two-way-stream-input-stream s)) ++ (list is))) ++ t) ++ ++(deftest two-way-stream-input-stream.error.1 ++ (signals-error (two-way-stream-input-stream) program-error) ++ t) ++ ++(deftest two-way-stream-input-stream.error.2 ++ (signals-error (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (two-way-stream-input-stream s nil)) ++ program-error) ++ t) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/two-way-stream-output-stream.lsp +@@ -0,0 +1,26 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Thu Feb 12 04:25:59 2004 ++;;;; Contains: Tests off TWO-WAY-STREAM-OUTPUT-STREAM ++ ++(in-package :cl-test) ++ ++(deftest two-way-stream-output-stream.1 ++ (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (equalt (multiple-value-list (two-way-stream-output-stream s)) ++ (list os))) ++ t) ++ ++(deftest two-way-stream-output-stream.error.1 ++ (signals-error (two-way-stream-output-stream) program-error) ++ t) ++ ++(deftest two-way-stream-output-stream.error.2 ++ (signals-error (let* ((is (make-string-input-stream "foo")) ++ (os (make-string-output-stream)) ++ (s (make-two-way-stream is os))) ++ (two-way-stream-output-stream s nil)) ++ program-error) ++ t) +--- gcl-2.6.12.orig/ansi-tests/universe.lsp ++++ gcl-2.6.12/ansi-tests/universe.lsp +@@ -307,15 +307,50 @@ + #-(or GCL CMU ECL) (make-hash-table :test #'equalp) + )) + +-(defvar *pathnames* +- (list +- (make-pathname :name "foo") +- (make-pathname :name "bar") +- (make-pathname :name "foo" :type "txt") +- (make-pathname :name "bar" :type "txt") +- (make-pathname :name :wild) +- (make-pathname :name :wild :type "txt") +- )) ++(defparameter *pathnames* ++ (locally ++ (declare (optimize safety)) ++ (loop for form in '((make-pathname :name "foo") ++ (make-pathname :name "FOO" :case :common) ++ (make-pathname :name "bar") ++ (make-pathname :name "foo" :type "txt") ++ (make-pathname :name "bar" :type "txt") ++ (make-pathname :name "XYZ" :type "TXT" :case :common) ++ (make-pathname :name nil) ++ (make-pathname :name :wild) ++ (make-pathname :name nil :type "txt") ++ (make-pathname :name :wild :type "txt") ++ (make-pathname :name :wild :type "TXT" :case :common) ++ (make-pathname :name :wild :type "abc" :case :common) ++ (make-pathname :directory :wild) ++ (make-pathname :type :wild) ++ (make-pathname :version :wild) ++ (make-pathname :version :newest)) ++ append (ignore-errors (eval `(list ,form)))))) ++ ++(eval-when (:compile-toplevel :load-toplevel :execute) ++ (locally ++ (declare (optimize safety)) ++ (ignore-errors ++ (setf (logical-pathname-translations "CLTESTROOT") ++ `(("**;*.*.*" ,(make-pathname :directory '(:absolute :wild-inferiors) ++ :name :wild :type :wild))))) ++ (ignore-errors ++ (setf (logical-pathname-translations "CLTEST") ++ `(("**;*.*.*" ,(make-pathname ++ :directory (append ++ (pathname-directory ++ (truename (make-pathname))) ++ '(:wild-inferiors)) ++ :name :wild :type :wild))))) ++ )) ++ ++(defparameter *logical-pathnames* ++ (locally ++ (declare (optimize safety)) ++ (append ++ (ignore-errors (list (logical-pathname "CLTESTROOT:"))) ++ ))) + + (defvar *streams* + (remove-duplicates +--- /dev/null ++++ gcl-2.6.12/ansi-tests/unread-char.lsp +@@ -0,0 +1,92 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 20:05:36 2004 ++;;;; Contains: Tests of UNREAD-CHAR ++ ++(in-package :cl-test) ++ ++(deftest unread-char.1 ++ (with-input-from-string ++ (*standard-input* "abc") ++ (values ++ (read-char) ++ (unread-char #\a) ++ (read-char) ++ (read-char) ++ (unread-char #\b) ++ (read-char) ++ (read-char))) ++ #\a nil #\a #\b nil #\b #\c) ++ ++(deftest unread-char.2 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (read-char s) ++ (unread-char #\a s) ++ (read-char s) ++ (read-char s) ++ (unread-char #\b s) ++ (read-char s) ++ (read-char s))) ++ #\a nil #\a #\b nil #\b #\c) ++ ++(deftest unread-char.3 ++ (with-input-from-string ++ (is "abc") ++ (with-output-to-string ++ (os) ++ (let ((s (make-echo-stream is os))) ++ (read-char s) ++ (unread-char #\a s) ++ (read-char s) ++ (read-char s) ++ (read-char s) ++ (unread-char #\c s) ++ (read-char s)))) ++ "abc") ++ ++(deftest unread-char.4 ++ (with-input-from-string ++ (*standard-input* "abc") ++ (values ++ (read-char) ++ (unread-char #\a nil) ++ (read-char) ++ (read-char) ++ (unread-char #\b nil) ++ (read-char) ++ (read-char))) ++ #\a nil #\a #\b nil #\b #\c) ++ ++(deftest unread-char.5 ++ (with-input-from-string ++ (is "abc") ++ (let ((*terminal-io* (make-two-way-stream ++ is (make-string-output-stream)))) ++ (values ++ (read-char t) ++ (unread-char #\a t) ++ (read-char t) ++ (read-char t) ++ (unread-char #\b t) ++ (read-char t) ++ (read-char t)))) ++ #\a nil #\a #\b nil #\b #\c) ++ ++;;; Error tests ++ ++(deftest unread-char.error.1 ++ (signals-error (unread-char) program-error) ++ t) ++ ++(deftest unread-char.error.2 ++ (signals-error ++ (with-input-from-string ++ (s "abc") ++ (read-char s) ++ (unread-char #\a s nil)) ++ program-error) ++ t) ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/wild-pathname-p.lsp +@@ -0,0 +1,234 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Dec 31 16:54:55 2003 ++;;;; Contains: Tests of WILD-PATHNAME-P ++ ++(in-package :cl-test) ++ ++(compile-and-load "pathnames-aux.lsp") ++ ++(deftest wild-pathname-p.1 ++ (wild-pathname-p (make-pathname)) ++ nil) ++ ++(deftest wild-pathname-p.2 ++ (loop for key in '(:host :device :directory :name :type :version nil) ++ when (wild-pathname-p (make-pathname) key) ++ collect key) ++ nil) ++ ++(deftest wild-pathname-p.3 ++ (let ((p (make-pathname :directory :wild))) ++ (notnot-mv (wild-pathname-p p))) ++ t) ++ ++(deftest wild-pathname-p.4 ++ (let ((p (make-pathname :directory :wild))) ++ (notnot-mv (wild-pathname-p p nil))) ++ t) ++ ++(deftest wild-pathname-p.5 ++ (let ((p (make-pathname :directory :wild))) ++ (notnot-mv (wild-pathname-p p :directory))) ++ t) ++ ++(deftest wild-pathname-p.6 ++ (let ((p (make-pathname :directory :wild))) ++ (loop for key in '(:host :device :name :type :version) ++ when (wild-pathname-p p key) ++ collect key)) ++ nil) ++ ++ ++(deftest wild-pathname-p.7 ++ (let ((p (make-pathname :directory '(:absolute :wild)))) ++ (notnot-mv (wild-pathname-p p))) ++ t) ++ ++(deftest wild-pathname-p.8 ++ (let ((p (make-pathname :directory '(:absolute :wild)))) ++ (notnot-mv (wild-pathname-p p nil))) ++ t) ++ ++(deftest wild-pathname-p.9 ++ (let ((p (make-pathname :directory '(:absolute :wild)))) ++ (notnot-mv (wild-pathname-p p :directory))) ++ t) ++ ++(deftest wild-pathname-p.10 ++ (let ((p (make-pathname :directory '(:absolute :wild)))) ++ (loop for key in '(:host :device :name :type :version) ++ when (wild-pathname-p p key) ++ collect key)) ++ nil) ++ ++ ++(deftest wild-pathname-p.11 ++ (let ((p (make-pathname :directory '(:relative :wild)))) ++ (notnot-mv (wild-pathname-p p))) ++ t) ++ ++(deftest wild-pathname-p.12 ++ (let ((p (make-pathname :directory '(:relative :wild)))) ++ (notnot-mv (wild-pathname-p p nil))) ++ t) ++ ++(deftest wild-pathname-p.13 ++ (let ((p (make-pathname :directory '(:relative :wild)))) ++ (notnot-mv (wild-pathname-p p :directory))) ++ t) ++ ++(deftest wild-pathname-p.14 ++ (let ((p (make-pathname :directory '(:relative :wild)))) ++ (loop for key in '(:host :device :name :type :version) ++ when (wild-pathname-p p key) ++ collect key)) ++ nil) ++ ++;;; ++ ++(deftest wild-pathname-p.15 ++ (let ((p (make-pathname :name :wild))) ++ (notnot-mv (wild-pathname-p p))) ++ t) ++ ++(deftest wild-pathname-p.16 ++ (let ((p (make-pathname :name :wild))) ++ (notnot-mv (wild-pathname-p p nil))) ++ t) ++ ++(deftest wild-pathname-p.17 ++ (let ((p (make-pathname :name :wild))) ++ (notnot-mv (wild-pathname-p p :name))) ++ t) ++ ++(deftest wild-pathname-p.18 ++ (let ((p (make-pathname :name :wild))) ++ (loop for key in '(:host :device :directory :type :version) ++ when (wild-pathname-p p key) ++ collect key)) ++ nil) ++ ++;;; ++ ++(deftest wild-pathname-p.19 ++ (let ((p (make-pathname :type :wild))) ++ (notnot-mv (wild-pathname-p p))) ++ t) ++ ++(deftest wild-pathname-p.20 ++ (let ((p (make-pathname :type :wild))) ++ (notnot-mv (wild-pathname-p p nil))) ++ t) ++ ++(deftest wild-pathname-p.21 ++ (let ((p (make-pathname :type :wild))) ++ (notnot-mv (wild-pathname-p p :type))) ++ t) ++ ++(deftest wild-pathname-p.22 ++ (let ((p (make-pathname :type :wild))) ++ (loop for key in '(:host :device :directory :name :version) ++ when (wild-pathname-p p key) ++ collect key)) ++ nil) ++ ++;;; ++ ++ (deftest wild-pathname-p.23 ++ (let ((p (make-pathname :version :wild))) ++ (notnot-mv (wild-pathname-p p))) ++ t) ++ ++(deftest wild-pathname-p.24 ++ (let ((p (make-pathname :version :wild))) ++ (notnot-mv (wild-pathname-p p nil))) ++ t) ++ ++(deftest wild-pathname-p.25 ++ (let ((p (make-pathname :version :wild))) ++ (notnot-mv (wild-pathname-p p :version))) ++ t) ++ ++(deftest wild-pathname-p.26 ++ (let ((p (make-pathname :version :wild))) ++ (loop for key in '(:host :device :directory :name :type) ++ when (wild-pathname-p p key) ++ collect key)) ++ nil) ++ ++;;; ++ ++(deftest wild-pathname-p.27 ++ (loop for p in (append *pathnames* *logical-pathnames*) ++ unless (if (wild-pathname-p p) (wild-pathname-p p nil) ++ (not (wild-pathname-p p nil))) ++ collect p) ++ nil) ++ ++(deftest wild-pathname-p.28 ++ (loop for p in (append *pathnames* *logical-pathnames*) ++ when (and (loop for key in '(:host :device :directory ++ :name :type :version) ++ thereis (wild-pathname-p p key)) ++ (not (wild-pathname-p p))) ++ collect p) ++ nil) ++ ++;;; On streams associated with files ++ ++(deftest wild-pathname-p.29 ++ (with-open-file (s "foo.lsp" ++ :direction :output ++ :if-exists :append ++ :if-does-not-exist :create) ++ (wild-pathname-p s)) ++ nil) ++ ++(deftest wild-pathname-p.30 ++ (let ((s (open "foo.lsp" ++ :direction :output ++ :if-exists :append ++ :if-does-not-exist :create))) ++ (close s) ++ (wild-pathname-p s)) ++ nil) ++ ++;;; logical pathname designators ++ ++(deftest wild-pathname-p.31 ++ (wild-pathname-p "CLTEST:FOO.LISP") ++ nil) ++ ++;;; Odd strings ++ ++(deftest wild-pathname-p.32 ++ (do-special-strings ++ (s "CLTEST:FOO.LISP" nil) ++ (let ((vals (multiple-value-list (wild-pathname-p s)))) ++ (assert (equal vals '(nil))))) ++ nil) ++ ++;;; ++ ++(deftest wild-pathname-p.error.1 ++ (signals-error (wild-pathname-p) program-error) ++ t) ++ ++(deftest wild-pathname-p.error.2 ++ (signals-error (wild-pathname-p *default-pathname-defaults* nil nil) ++ program-error) ++ t) ++ ++(deftest wild-pathname-p.error.3 ++ (check-type-error #'wild-pathname-p ++ (typef '(or pathname string file-stream ++ synonym-stream))) ++ nil) ++ ++(deftest wild-pathname-p.error.4 ++ (check-type-error #'(lambda (x) (declare (optimize (safety 0))) ++ (wild-pathname-p x)) ++ (typef '(or pathname string file-stream ++ synonym-stream))) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/with-input-from-string.lsp +@@ -0,0 +1,245 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 20:13:02 2004 ++;;;; Contains: Tests of WITH-INPUT-FROM-STRING ++ ++(in-package :cl-test) ++ ++(deftest with-input-from-string.1 ++ (with-input-from-string ++ (s "abc") ++ (values (read-char s) (read-char s) (read-char s) (read-char s nil :eof))) ++ #\a #\b #\c :eof) ++ ++(deftest with-input-from-string.2 ++ (with-input-from-string (s "abc")) ++ nil) ++ ++(deftest with-input-from-string.3 ++ (with-input-from-string (s "abc") (declare (optimize speed))) ++ nil) ++ ++(deftest with-input-from-string.3a ++ (with-input-from-string (s "abc") ++ (declare (optimize speed)) ++ (declare (optimize space))) ++ nil) ++ ++(deftest with-input-from-string.4 ++ (with-input-from-string ++ (s "abc") ++ (declare (optimize safety)) ++ (read-char s) ++ (read-char s)) ++ #\b) ++ ++(deftest with-input-from-string.5 ++ (let ((i nil)) ++ (values ++ (with-input-from-string ++ (s "abc" :index i)) ++ i)) ++ nil 0) ++ ++(deftest with-input-from-string.6 ++ (let ((i (list nil))) ++ (values ++ (with-input-from-string ++ (s "abc" :index (car i))) ++ i)) ++ nil (0)) ++ ++(deftest with-input-from-string.7 ++ (let ((i nil)) ++ (values ++ (with-input-from-string ++ (s "abc" :index i) ++ (list i (read-char s) i (read-char s) i)) ++ i)) ++ (nil #\a nil #\b nil) 2) ++ ++(deftest with-input-from-string.9 ++ (with-input-from-string ++ (s "abc") ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s))) ++ t t t t nil) ++ ++(deftest with-input-from-string.10 ++ :notes (:nil-vectors-are-strings) ++ (with-input-from-string ++ (s (make-array 0 :element-type nil)) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s))) ++ t t t t nil) ++ ++(deftest with-input-from-string.11 ++ (with-input-from-string ++ (s (make-array 3 :element-type 'character :initial-contents "abc")) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s) ++ (read-line s))) ++ t t t t nil "abc") ++ ++(deftest with-input-from-string.12 ++ (with-input-from-string ++ (s (make-array 3 :element-type 'base-char :initial-contents "abc")) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s) ++ (read-line s))) ++ t t t t nil "abc") ++ ++(deftest with-input-from-string.13 ++ (with-input-from-string ++ (s "abcdef" :start 2) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s) ++ (read-line s))) ++ t t t t nil "cdef") ++ ++(deftest with-input-from-string.14 ++ (with-input-from-string ++ (s "abcdef" :end 3) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s) ++ (read-line s))) ++ t t t t nil "abc") ++ ++(deftest with-input-from-string.15 ++ (with-input-from-string ++ (s "abcdef" :start 1 :end 5) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s) ++ (read-line s))) ++ t t t t nil "bcde") ++ ++(deftest with-input-from-string.16 ++ (with-input-from-string ++ (s "abcdef" :start 1 :end nil) ++ (values ++ (notnot (typep s 'stream)) ++ (notnot (typep s 'string-stream)) ++ (notnot (open-stream-p s)) ++ (notnot (input-stream-p s)) ++ (output-stream-p s) ++ (read-line s))) ++ t t t t nil "bcdef") ++ ++(deftest with-input-from-string.17 ++ (let ((i 2)) ++ (values ++ (with-input-from-string ++ (s "abcdef" :index i :start i) ++ (read-char s)) ++ i)) ++ #\c 3) ++ ++;;; Test that there is no implicit tagbody ++ ++(deftest with-input-from-string.18 ++ (block done ++ (tagbody ++ (with-input-from-string ++ (s "abc") ++ (go 1) ++ 1 ++ (return-from done :bad)) ++ 1 ++ (return-from done :good))) ++ :good) ++ ++;;; Free declaration scope ++ ++(deftest with-input-from-string.19 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-input-from-string (s (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ ++(deftest with-input-from-string.20 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-input-from-string (s "abc" :start (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ ++(deftest with-input-from-string.21 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-input-from-string (s "abc" :end (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ ++;;; index is not updated if the form exits abnormally ++ ++(deftest with-input-from-string.22 ++ (let ((i nil)) ++ (values ++ (block done ++ (with-input-from-string (s "abcde" :index i) (return-from done (read-char s)))) ++ i)) ++ #\a nil) ++ ++;;; Test that explicit calls to macroexpand in subforms ++;;; are done in the correct environment ++ ++(deftest with-input-from-string.23 ++ (macrolet ++ ((%m (z) z)) ++ (with-input-from-string (s (expand-in-current-env (%m "123"))) ++ (read-char s))) ++ #\1) ++ ++(deftest with-input-from-string.24 ++ (macrolet ++ ((%m (z) z)) ++ (with-input-from-string (s "123" :start (expand-in-current-env (%m 1))) ++ (read-char s))) ++ #\2) ++ ++(deftest with-input-from-string.25 ++ (macrolet ++ ((%m (z) z)) ++ (with-input-from-string (s "123" :start 0 ++ :end (expand-in-current-env (%m 0))) ++ (read-char s nil nil))) ++ nil) ++ ++ ++;;; FIXME: Add more tests on specialized strings. ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/with-open-file.lsp +@@ -0,0 +1,98 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Tue Jan 27 20:57:05 2004 ++;;;; Contains: Tests of WITH-OPEN-FILE ++ ++(in-package :cl-test) ++ ++;;; For now, omit most of the options combinations, assuming they will ++;;; be tested in OPEN. The tests of OPEN should be ported to here at some ++;;; point. ++ ++(deftest with-open-file.1 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file (s pn :direction :output))) ++ nil) ++ ++(deftest with-open-file.2 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn :direction :output) ++ (notnot-mv (output-stream-p s)))) ++ t) ++ ++(deftest with-open-file.3 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn :direction :output) ++ (values)))) ++ ++(deftest with-open-file.4 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn :direction :output) ++ (values 1 2 3 4 5 6 7 8))) ++ 1 2 3 4 5 6 7 8) ++ ++(deftest with-open-file.5 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn :direction :output) ++ (declare (ignore s)) ++ (declare (optimize)))) ++ nil) ++ ++(deftest with-open-file.6 ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file ++ (s pn (cdr '(nil . :direction)) (car '(:output))) ++ (format s "foo!~%")) ++ (with-open-file (s pn) (read-line s))) ++ "foo!" nil) ++ ++;;; Free declaration scope tests ++ ++(deftest with-open-file.7 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-open-file (s (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ ++(deftest with-open-file.8 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-open-file (s "with-open-file.lsp" (return-from done x) :input) ++ (declare (special x)))))) ++ :good) ++ ++(deftest with-open-file.9 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-open-file (s "with-open-file.lsp" :direction (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ ++;;; Test that explicit calls to macroexpand in subforms ++;;; are done in the correct environment ++ ++(deftest with-open-file.10 ++ (macrolet ++ ((%m (z) z)) ++ (let ((pn #p"tmp.dat")) ++ (delete-all-versions pn) ++ (with-open-file (s (expand-in-current-env (%m pn)) ++ :direction :output)))) ++ nil) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/with-open-stream.lsp +@@ -0,0 +1,77 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Mon Dec 13 01:42:59 2004 ++;;;; Contains: Tests of WITH-OPEN-STREAM ++ ++(in-package :cl-test) ++ ++(deftest with-open-stream.1 ++ (with-open-stream (os (make-string-output-stream))) ++ nil) ++ ++(deftest with-open-stream.2 ++ (with-open-stream (os (make-string-output-stream)) ++ (declare (ignore os))) ++ nil) ++ ++(deftest with-open-stream.3 ++ (with-open-stream (os (make-string-output-stream)) ++ (declare (ignore os)) ++ (declare (type string-stream os))) ++ nil) ++ ++(deftest with-open-stream.4 ++ (with-open-stream (os (make-string-output-stream)) ++ (declare (ignore os)) ++ (values))) ++ ++(deftest with-open-stream.5 ++ (with-open-stream (os (make-string-output-stream)) ++ (declare (ignore os)) ++ (values 'a 'b)) ++ a b) ++ ++(deftest with-open-stream.6 ++ (let ((s (make-string-output-stream))) ++ (values ++ (with-open-stream (os s)) ++ (notnot (typep s 'string-stream)) ++ (open-stream-p s))) ++ nil t nil) ++ ++(deftest with-open-stream.7 ++ (let ((s (make-string-input-stream "123"))) ++ (values ++ (with-open-stream (is s) (read-char s)) ++ (notnot (typep s 'string-stream)) ++ (open-stream-p s))) ++ #\1 t nil) ++ ++(deftest with-open-stream.8 ++ (let ((s (make-string-output-stream))) ++ (values ++ (block done ++ (with-open-stream (os s) (return-from done nil))) ++ (notnot (typep s 'string-stream)) ++ (open-stream-p s))) ++ nil t nil) ++ ++(deftest with-open-stream.9 ++ (let ((s (make-string-output-stream))) ++ (values ++ (catch 'done ++ (with-open-stream (os s) (throw 'done nil))) ++ (notnot (typep s 'string-stream)) ++ (open-stream-p s))) ++ nil t nil) ++ ++;;; Free declaration scope ++ ++(deftest with-open-stream.10 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-open-stream (s (return-from done x)) ++ (declare (special x)))))) ++ :good) +--- /dev/null ++++ gcl-2.6.12/ansi-tests/with-output-to-string.lsp +@@ -0,0 +1,129 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sat Feb 14 20:33:51 2004 ++;;;; Contains: Tests of WITH-OUTPUT-TO-STRING ++ ++(in-package :cl-test) ++ ++ ++(deftest with-output-to-string.1 ++ (with-output-to-string (s)) ++ "") ++ ++(deftest with-output-to-string.2 ++ (with-output-to-string (s) (write-char #\3 s)) ++ "3") ++ ++(deftest with-output-to-string.3 ++ (with-output-to-string (s (make-array 10 :fill-pointer 0 ++ :element-type 'character))) ++ nil) ++ ++(deftest with-output-to-string.4 ++ :notes (:allow-nil-arrays :nil-vectors-are-strings) ++ (let ((str (make-array 10 :fill-pointer 0 :element-type 'character))) ++ (values ++ (with-output-to-string ++ (s str :element-type nil) ++ (write-string "abcdef" s)) ++ str)) ++ "abcdef" "abcdef") ++ ++(deftest with-output-to-string.5 ++ (with-output-to-string (s (make-array 10 :fill-pointer 0 ++ :element-type 'character)) ++ (values))) ++ ++(deftest with-output-to-string.6 ++ (with-output-to-string (s (make-array 10 :fill-pointer 0 ++ :element-type 'character)) ++ (values 'a 'b 'c 'd)) ++ a b c d) ++ ++(deftest with-output-to-string.7 ++ (with-output-to-string (s nil :element-type 'character) ++ (write-char #\& s)) ++ "&") ++ ++(deftest with-output-to-string.8 ++ (let ((str (with-output-to-string (s nil :element-type 'base-char) ++ (write-char #\8 s)))) ++ (assert (typep str 'simple-base-string)) ++ str) ++ "8") ++ ++(deftest with-output-to-string.9 ++ :notes (:allow-nil-arrays :nil-vectors-are-strings) ++ (with-output-to-string (s nil :element-type nil)) ++ "") ++ ++(deftest with-output-to-string.10 ++ (let* ((s1 (make-array 20 :element-type 'character ++ :initial-element #\.)) ++ (s2 (make-array 10 :element-type 'character ++ :displaced-to s1 ++ :displaced-index-offset 5 ++ :fill-pointer 0))) ++ ++ (values ++ (with-output-to-string ++ (s s2) ++ (write-string "0123456789" s)) ++ s1 ++ s2)) ++ "0123456789" ++ ".....0123456789....." ++ "0123456789") ++ ++(deftest with-output-to-string.11 ++ (with-output-to-string (s) (declare (optimize safety))) ++ "") ++ ++(deftest with-output-to-string.12 ++ (with-output-to-string (s) (declare (optimize safety)) ++ (declare (optimize (speed 0)))) ++ "") ++ ++(deftest with-output-to-string.13 ++ (with-output-to-string ++ (s) ++ (write-char #\0 s) ++ (write-char #\4 s) ++ (write-char #\9 s)) ++ "049") ++ ++(deftest with-output-to-string.14 ++ (let* ((str1 (make-array '(256) :element-type 'base-char :fill-pointer 0)) ++ (str2 (with-output-to-string ++ (s nil :element-type 'base-char) ++ (loop for i below 256 ++ for c = (code-char i) ++ when (typep c 'base-char) ++ do (progn (write-char c s) ++ (vector-push c str1)))))) ++ (if (string= str1 str2) :good ++ (list str1 str2))) ++ :good) ++ ++;;; Free declaration scope ++ ++(deftest with-output-to-string.15 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good)) ++ (with-output-to-string (s (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ ++(deftest with-output-to-string.16 ++ (block done ++ (let ((x :bad)) ++ (declare (special x)) ++ (let ((x :good) ++ (str (make-array '(10) :element-type 'character ++ :fill-pointer 0))) ++ (with-output-to-string (s str :element-type (return-from done x)) ++ (declare (special x)))))) ++ :good) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/write-char.lsp +@@ -0,0 +1,51 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 20:50:31 2004 ++;;;; Contains: Tests of WRITE-CHAR ++ ++(in-package :cl-test) ++ ++(deftest write-char.1 ++ (loop for i from 0 to 255 ++ for c = (code-char i) ++ when c ++ unless (string= (with-output-to-string ++ (*standard-output*) ++ (write-char c)) ++ (string c)) ++ collect c) ++ nil) ++ ++(deftest write-char.2 ++ (with-input-from-string ++ (is "abcd") ++ (with-output-to-string ++ (os) ++ (let ((*terminal-io* (make-two-way-stream is os))) ++ (write-char #\$ t) ++ (close *terminal-io*)))) ++ "$") ++ ++(deftest write-char.3 ++ (with-output-to-string ++ (*standard-output*) ++ (write-char #\: nil)) ++ ":") ++ ++;;; Error tests ++ ++(deftest write-char.error.1 ++ (signals-error (write-char) program-error) ++ t) ++ ++(deftest write-char.error.2 ++ (signals-error ++ (with-output-to-string ++ (s) ++ (write-char #\a s nil)) ++ program-error) ++ t) ++ ++;;; More tests in other files ++ ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/write-line.lsp +@@ -0,0 +1,165 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Mon Jan 19 06:49:26 2004 ++;;;; Contains: Tests of WRITE-LINE ++ ++(in-package :cl-test) ++ ++(deftest write-line.1 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result (multiple-value-list (write-line "")))) ++ result)) ++ #.(string #\Newline) ++ ("")) ++ ++(deftest write-line.2 ++ :notes (:nil-vectors-are-strings) ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result ++ (multiple-value-list ++ (write-line (make-array '(0) :element-type nil))))) ++ result)) ++ #.(string #\Newline) ++ ("")) ++ ++(deftest write-line.3 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result (multiple-value-list (write-line "abcde")))) ++ result)) ++ #.(concatenate 'string "abcde" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.4 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list (write-line "abcde" s :start 1)))) ++ result)) ++ #.(concatenate 'string "bcde" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.5 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-line "abcde" s :start 1 :end 3)))) ++ result)) ++ #.(concatenate 'string "bc" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.6 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-line "abcde" s :start 1 :end nil)))) ++ result)) ++ #.(concatenate 'string "bcde" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.7 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list (write-line "abcde" s :end 3)))) ++ result)) ++ #.(concatenate 'string "abc" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.8 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-line "abcde" s :end 3 :allow-other-keys nil)))) ++ result)) ++ #.(concatenate 'string "abc" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.9 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result ++ (multiple-value-list ++ (write-line "abcde" s :end 3 :allow-other-keys t :foo 'bar)))) ++ result)) ++ #.(concatenate 'string "abc" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.10 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-line "abcde" s :end 3 :end 2)))) ++ result)) ++ #.(concatenate 'string "abc" (string #\Newline)) ++ ("abcde")) ++ ++(deftest write-line.11 ++ (with-input-from-string ++ (is "abcd") ++ (with-output-to-string ++ (os) ++ (let ((*terminal-io* (make-two-way-stream is os))) ++ (write-line "951" t) ++ (close *terminal-io*)))) ++ #.(concatenate 'string "951" (string #\Newline))) ++ ++(deftest write-line.12 ++ (with-output-to-string ++ (*standard-output*) ++ (write-line "-=|!" nil)) ++ #.(concatenate 'string "-=|!" (string #\Newline))) ++ ++;;; Specialized string tests ++ ++(deftest write-line.13 ++ (do-special-strings ++ (s "abcde" nil) ++ (assert (equal ++ (with-output-to-string ++ (*standard-output*) ++ (multiple-value-list (write-line "abcde"))) ++ #.(concatenate 'string "abcde" (string #\Newline))))) ++ nil) ++ ++;;; Error tests ++ ++(deftest write-line.error.1 ++ (signals-error (write-line) program-error) ++ t) ++ ++(deftest write-line.error.2 ++ (signals-error (write-line "" *standard-output* :start) program-error) ++ t) ++ ++(deftest write-line.error.3 ++ (signals-error (write-line "" *standard-output* :foo nil) program-error) ++ t) ++ ++(deftest write-line.error.4 ++ (signals-error (write-line "" *standard-output* ++ :allow-other-keys nil ++ :foo nil) ++ program-error) ++ t) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/write-sequence.lsp +@@ -0,0 +1,225 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Wed Jan 21 04:07:58 2004 ++;;;; Contains: Tests of WRITE-SEQUENCE ++ ++(in-package :cl-test) ++ ++(defmacro def-write-sequence-test (name input args &rest expected) ++ `(deftest ,name ++ (let ((s ,input)) ++ (with-output-to-string ++ (os) ++ (assert (eq (write-sequence s os ,@args) s)))) ++ ,@expected)) ++ ++;;; on strings ++ ++(def-write-sequence-test write-sequence.string.1 "abcde" () "abcde") ++(def-write-sequence-test write-sequence.string.2 "abcde" (:start 1) "bcde") ++(def-write-sequence-test write-sequence.string.3 "abcde" (:end 3) "abc") ++(def-write-sequence-test write-sequence.string.4 "abcde" ++ (:start 1 :end 4) "bcd") ++(def-write-sequence-test write-sequence.string.5 "abcde" (:end nil) "abcde") ++(def-write-sequence-test write-sequence.string.6 "abcde" (:start 3 :end 3) "") ++(def-write-sequence-test write-sequence.string.7 "abcde" ++ (:end nil :start 1) "bcde") ++(def-write-sequence-test write-sequence.string.8 "abcde" ++ (:allow-other-keys nil) "abcde") ++(def-write-sequence-test write-sequence.string.9 "abcde" ++ (:allow-other-keys t :foo nil) "abcde") ++(def-write-sequence-test write-sequence.string.10 "abcde" ++ (:allow-other-keys t :allow-other-keys nil :foo nil) "abcde") ++(def-write-sequence-test write-sequence.string.11 "abcde" ++ (:bar 'x :allow-other-keys t) "abcde") ++(def-write-sequence-test write-sequence.string.12 "abcde" ++ (:start 1 :end 4 :start 2 :end 3) "bcd") ++(def-write-sequence-test write-sequence.string.13 "" () "") ++ ++(defmacro def-write-sequence-special-test (name string args expected) ++ `(deftest ,name ++ (let ((str ,string) ++ (expected ,expected)) ++ (do-special-strings ++ (s str nil) ++ (let ((out (with-output-to-string ++ (os) ++ (assert (eq (write-sequence s os ,@args) s))))) ++ (assert (equal out expected))))) ++ nil)) ++ ++(def-write-sequence-special-test write-sequence.string.14 "12345" () "12345") ++(def-write-sequence-special-test write-sequence.string.15 "12345" (:start 1 :end 3) "23") ++ ++;;; on lists ++ ++(def-write-sequence-test write-sequence.list.1 (coerce "abcde" 'list) ++ () "abcde") ++(def-write-sequence-test write-sequence.list.2 (coerce "abcde" 'list) ++ (:start 1) "bcde") ++(def-write-sequence-test write-sequence.list.3 (coerce "abcde" 'list) ++ (:end 3) "abc") ++(def-write-sequence-test write-sequence.list.4 (coerce "abcde" 'list) ++ (:start 1 :end 4) "bcd") ++(def-write-sequence-test write-sequence.list.5 (coerce "abcde" 'list) ++ (:end nil) "abcde") ++(def-write-sequence-test write-sequence.list.6 (coerce "abcde" 'list) ++ (:start 3 :end 3) "") ++(def-write-sequence-test write-sequence.list.7 (coerce "abcde" 'list) ++ (:end nil :start 1) "bcde") ++(def-write-sequence-test write-sequence.list.8 () () "") ++ ++ ++;;; on vectors ++ ++(def-write-sequence-test write-sequence.simple-vector.1 ++ (coerce "abcde" 'simple-vector) () "abcde") ++(def-write-sequence-test write-sequence.simple-vector.2 ++ (coerce "abcde" 'simple-vector) (:start 1) "bcde") ++(def-write-sequence-test write-sequence.simple-vector.3 ++ (coerce "abcde" 'simple-vector) (:end 3) "abc") ++(def-write-sequence-test write-sequence.simple-vector.4 ++ (coerce "abcde" 'simple-vector) (:start 1 :end 4) "bcd") ++(def-write-sequence-test write-sequence.simple-vector.5 ++ (coerce "abcde" 'simple-vector) (:end nil) "abcde") ++(def-write-sequence-test write-sequence.simple-vector.6 ++ (coerce "abcde" 'simple-vector) (:start 3 :end 3) "") ++(def-write-sequence-test write-sequence.simple-vector.7 ++ (coerce "abcde" 'simple-vector) (:end nil :start 1) "bcde") ++(def-write-sequence-test write-sequence.simple-vector.8 #() () "") ++ ++;;; on vectors with fill pointers ++ ++(def-write-sequence-test write-sequence.fill-vector.1 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) () "abcde") ++(def-write-sequence-test write-sequence.fill-vector.2 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) ++ (:start 1) "bcde") ++(def-write-sequence-test write-sequence.fill-vector.3 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) ++ (:end 3) "abc") ++(def-write-sequence-test write-sequence.fill-vector.4 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) ++ (:start 1 :end 4) "bcd") ++(def-write-sequence-test write-sequence.fill-vector.5 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) ++ (:end nil) "abcde") ++(def-write-sequence-test write-sequence.fill-vector.6 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) ++ (:start 3 :end 3) "") ++(def-write-sequence-test write-sequence.fill-vector.7 ++ (make-array 10 :initial-contents "abcde " :fill-pointer 5) ++ (:end nil :start 1) "bcde") ++ ++;;; on bit vectors ++ ++(defmacro def-write-sequence-bv-test (name input args expected) ++ `(deftest ,name ++ (let ((s ,input) ++ (expected ,expected)) ++ (with-open-file ++ (os "tmp.dat" :direction :output ++ :element-type '(unsigned-byte 8) ++ :if-exists :supersede) ++ (assert (eq (write-sequence s os ,@args) s))) ++ (with-open-file ++ (is "tmp.dat" :direction :input ++ :element-type '(unsigned-byte 8)) ++ (loop for i from 0 below (length expected) ++ for e = (elt expected i) ++ always (eql (read-byte is) e)))) ++ t)) ++ ++(def-write-sequence-bv-test write-sequence.bv.1 #*00111010 ++ () #*00111010) ++(def-write-sequence-bv-test write-sequence.bv.2 #*00111010 ++ (:start 1) #*0111010) ++(def-write-sequence-bv-test write-sequence.bv.3 #*00111010 ++ (:end 5) #*00111) ++(def-write-sequence-bv-test write-sequence.bv.4 #*00111010 ++ (:start 1 :end 6) #*01110) ++(def-write-sequence-bv-test write-sequence.bv.5 #*00111010 ++ (:start 1 :end nil) #*0111010) ++(def-write-sequence-bv-test write-sequence.bv.6 #*00111010 ++ (:start 1 :end nil :end 4) #*0111010) ++ ++ ++;;; Error tests ++ ++(deftest write-sequence.error.1 ++ (signals-error (write-sequence) program-error) ++ t) ++ ++(deftest write-sequence.error.2 ++ (signals-error (write-sequence "abcde") program-error) ++ t) ++ ++(deftest write-sequence.error.3 ++ (signals-error (write-sequence '(#\a . #\b) *standard-output*) type-error) ++ t) ++ ++(deftest write-sequence.error.4 ++ (signals-error (write-sequence #\a *standard-output*) type-error) ++ t) ++ ++(deftest write-sequence.error.5 ++ (signals-error (write-sequence "ABC" *standard-output* :start -1) type-error) ++ t) ++ ++(deftest write-sequence.error.6 ++ (signals-error (write-sequence "ABC" *standard-output* :start 'x) type-error) ++ t) ++ ++(deftest write-sequence.error.7 ++ (signals-error (write-sequence "ABC" *standard-output* :start 0.0) ++ type-error) ++ t) ++ ++(deftest write-sequence.error.8 ++ (signals-error (write-sequence "ABC" *standard-output* :end -1) ++ type-error) ++ t) ++ ++(deftest write-sequence.error.9 ++ (signals-error (write-sequence "ABC" *standard-output* :end 'x) ++ type-error) ++ t) ++ ++(deftest write-sequence.error.10 ++ (signals-error (write-sequence "ABC" *standard-output* :end 2.0) ++ type-error) ++ t) ++ ++(deftest write-sequence.error.11 ++ (signals-error (write-sequence "abcde" *standard-output* ++ :foo nil) program-error) ++ t) ++ ++(deftest write-sequence.error.12 ++ (signals-error (write-sequence "abcde" *standard-output* ++ :allow-other-keys nil :foo t) ++ program-error) ++ t) ++ ++(deftest write-sequence.error.13 ++ (signals-error (write-sequence "abcde" *standard-output* :start) ++ program-error) ++ t) ++ ++(deftest write-sequence.error.14 ++ (check-type-error #'(lambda (x) (write-sequence x *standard-output*)) ++ #'sequencep) ++ nil) ++ ++(deftest write-sequence.error.15 ++ (check-type-error #'(lambda (x) (write-sequence "abcde" *standard-output* ++ :start x)) ++ (typef 'unsigned-byte)) ++ nil) ++ ++(deftest write-sequence.error.16 ++ (check-type-error #'(lambda (x) (write-sequence "abcde" *standard-output* ++ :end x)) ++ (typef '(or null unsigned-byte))) ++ nil) ++ +--- /dev/null ++++ gcl-2.6.12/ansi-tests/write-string.lsp +@@ -0,0 +1,156 @@ ++;-*- Mode: Lisp -*- ++;;;; Author: Paul Dietz ++;;;; Created: Sun Jan 18 21:13:32 2004 ++;;;; Contains: Tests of WRITE-STRING ++ ++(in-package :cl-test) ++ ++(deftest write-string.1 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result (multiple-value-list (write-string "")))) ++ result)) ++ "" ("")) ++ ++(deftest write-string.2 ++ :notes (:nil-vectors-are-strings) ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result ++ (multiple-value-list ++ (write-string (make-array '(0) :element-type nil))))) ++ result)) ++ "" ("")) ++ ++(deftest write-string.3 ++ (let (result) ++ (values ++ (with-output-to-string ++ (*standard-output*) ++ (setq result (multiple-value-list (write-string "abcde")))) ++ result)) ++ "abcde" ("abcde")) ++ ++(deftest write-string.4 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list (write-string "abcde" s :start 1)))) ++ result)) ++ "bcde" ("abcde")) ++ ++(deftest write-string.5 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-string "abcde" s :start 1 :end 3)))) ++ result)) ++ "bc" ("abcde")) ++ ++(deftest write-string.6 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-string "abcde" s :start 1 :end nil)))) ++ result)) ++ "bcde" ("abcde")) ++ ++(deftest write-string.7 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list (write-string "abcde" s :end 3)))) ++ result)) ++ "abc" ("abcde")) ++ ++(deftest write-string.8 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-string "abcde" s :end 3 :allow-other-keys nil)))) ++ result)) ++ "abc" ("abcde")) ++ ++(deftest write-string.9 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result ++ (multiple-value-list ++ (write-string "abcde" s :end 3 :allow-other-keys t :foo 'bar)))) ++ result)) ++ "abc" ("abcde")) ++ ++(deftest write-string.10 ++ (let (result) ++ (values ++ (with-output-to-string ++ (s) ++ (setq result (multiple-value-list ++ (write-string "abcde" s :end 3 :end 2)))) ++ result)) ++ "abc" ("abcde")) ++ ++(deftest write-string.11 ++ (with-input-from-string ++ (is "abcd") ++ (with-output-to-string ++ (os) ++ (let ((*terminal-io* (make-two-way-stream is os))) ++ (write-string "951" t) ++ (close *terminal-io*)))) ++ "951") ++ ++(deftest write-string.12 ++ (with-output-to-string ++ (*standard-output*) ++ (write-string "-=|!" nil)) ++ "-=|!") ++ ++;;; Specialized string tests ++ ++(deftest write-string.13 ++ (let (result) ++ (do-special-strings ++ (s "abcde" nil) ++ (assert (equal ++ (with-output-to-string ++ (*standard-output*) ++ (setq result (multiple-value-list (write-string "abcde")))) ++ "abcde")) ++ (assert (equal result '("abcde"))))) ++ nil) ++ ++;;; Error tests ++ ++(deftest write-string.error.1 ++ (signals-error (write-string) program-error) ++ t) ++ ++(deftest write-string.error.2 ++ (signals-error (write-string "" *standard-output* :start) program-error) ++ t) ++ ++(deftest write-string.error.3 ++ (signals-error (write-string "" *standard-output* :foo nil) program-error) ++ t) ++ ++(deftest write-string.error.4 ++ (signals-error (write-string "" *standard-output* ++ :allow-other-keys nil ++ :foo nil) ++ program-error) ++ t) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpfun.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpfun.lsp +@@ -556,6 +556,14 @@ + ((null type) nil) + ((setq f (assoc type *type-alist* :test 'equal)) + (list (cdr f) x)) ++ ((setq f (when (symbolp type) (get type 'si::type-predicate))) ++ (list f x)) ++ ((and (consp type) (eq (car type) 'or)) ++ `(or ,@(mapcar (lambda (y) `(typep ,x ',y)) (cdr type)))) ++ ((and (consp type) (eq (car type) 'member)) ++ `(or ,@(mapcar (lambda (y) `(eql ,x ',y)) (cdr type)))) ++ ((and (consp type) (eq (car type) 'eql)) ++ `(eql ,x ',(cadr type))) + ((and (consp type) + (or (and (eq (car type) 'vector) + (null (cddr type))) +--- gcl-2.6.12.orig/cmpnew/gcl_cmplabel.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmplabel.lsp +@@ -44,7 +44,7 @@ + `(when (cdr ,label) (wt-nl "goto T" (car ,label) ";")(wt-nl1 "T" (car ,label) ":;"))) + + (defmacro wt-go (label) +- `(progn (rplacd ,label t) (wt "goto T" (car ,label) ";"))) ++ `(progn (rplacd ,label t) (wt "goto T" (car ,label) ";")(wt-nl))) + + + (defvar *restore-avma* nil) +--- gcl-2.6.12.orig/cmpnew/gcl_cmplam.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmplam.lsp +@@ -407,6 +407,12 @@ + (c2lambda-expr-without-key lambda-list body))) + )) + ++(defun decl-body-safety (body) ++ (case (car body) ++ (decl-body (or (cadr (assoc 'safety (caddr body))) 0)) ++ ((let let*) (decl-body-safety (car (last body)))) ++ (otherwise 0))) ++ + (defun c2lambda-expr-without-key + (lambda-list body + &aux (requireds (car lambda-list)) +@@ -439,7 +445,7 @@ + (when rest (do-decl rest)) + ) + ;;; check arguments +- (when (or *safe-compile* *compiler-check-args*) ++ (when (or *safe-compile* *compiler-check-args* (plusp (decl-body-safety body)));FIXME + (cond ((or rest optionals) + (when requireds + (wt-nl "if(vs_top-vs_base<" (length requireds) +@@ -448,7 +454,7 @@ + (wt-nl "if(vs_top-vs_base>" + (+ (length requireds) (length optionals)) + ") too_many_arguments();"))) +- (t (wt-nl "check_arg(" (length requireds) ");")))) ++ (t (when requireds (wt-nl "check_arg(" (length requireds) ");"))))) + + ;;; Allocate the parameters. + (dolist** (var requireds) (setf (var-ref var) (vs-push))) +@@ -562,7 +568,7 @@ + (when (cadddr kwd) (do-decl (cadddr kwd)))) + ) + ;;; Check arguments. +- (when (and (or *safe-compile* *compiler-check-args*) requireds) ++ (when (and (or *safe-compile* *compiler-check-args* (plusp (decl-body-safety body))) requireds);FIXME + (when requireds + (wt-nl "if(vs_top-vs_base<" (length requireds) + ") too_few_arguments();"))) +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -52,7 +52,7 @@ + (defvar *cmpinclude-string* + (si::file-to-string + (namestring +- (make-pathname :directory (append (pathname-directory si::*system-directory*) (list :parent "h")) ++ (make-pathname :directory (append (pathname-directory si::*system-directory*) (list :back "h")) + :name "cmpinclude" :type "h")))) + + +@@ -160,7 +160,7 @@ + + + (defun compile-file1 (input-pathname +- &key (output-file (truename input-pathname)) ++ &key (output-file (merge-pathnames ".o" (truename input-pathname))) + (o-file t) + (c-file *default-c-file*) + (h-file *default-h-file*) +@@ -175,7 +175,7 @@ + (*c-debug* c-debug) + (*compile-print* (or print *compile-print*)) + (*package* *package*) +- (*DEFAULT-PATHNAME-DEFAULTS* #"") ++ (*DEFAULT-PATHNAME-DEFAULTS* #p"") + (*data* (list (make-array 50 :fill-pointer 0 :adjustable t) nil nil)) + *init-name* + (*fasd-data* *fasd-data*) +@@ -186,25 +186,25 @@ + (cond (*compiler-in-use* + (format t "~&The compiler was called recursively.~%~ + Cannot compile ~a.~%" +- (namestring (merge-pathnames input-pathname #".lsp"))) ++ (namestring (merge-pathnames input-pathname #p".lsp"))) + (setq *error-p* t) + (return-from compile-file1 (values))) + (t (setq *error-p* nil) + (setq *compiler-in-use* t))) + +- (unless (probe-file (merge-pathnames input-pathname #".lsp")) ++ (unless (probe-file (merge-pathnames input-pathname #p".lsp")) + (format t "~&The source file ~a is not found.~%" +- (namestring (merge-pathnames input-pathname #".lsp"))) ++ (namestring (merge-pathnames input-pathname #p".lsp"))) + (setq *error-p* t) + (return-from compile-file1 (values))) + + (when *compile-verbose* +- (format t "~&Compiling ~a.~%" (namestring (merge-pathnames input-pathname #".lsp")))) ++ (format t "~&Compiling ~a.~%" (namestring (merge-pathnames input-pathname #p".lsp")))) + + (and *record-call-info* (clear-call-table)) + + (with-open-file +- (*compiler-input* (merge-pathnames input-pathname #".lsp")) ++ (*compiler-input* (merge-pathnames input-pathname #p".lsp")) + + + (cond ((numberp *split-files*) +@@ -232,8 +232,11 @@ Cannot compile ~a.~%" + (device (or (and (not (null output-file)) + (pathname-device output-file)) + (pathname-device input-pathname))) ++ (typ (or (and (not (null output-file)) ++ (pathname-type output-file)) ++ "o")) + +- (o-pathname (get-output-pathname o-file "o" name dir device)) ++ (o-pathname (get-output-pathname o-file typ name dir device)) + (c-pathname (get-output-pathname c-file "c" name dir device)) + (h-pathname (get-output-pathname h-file "h" name dir device)) + (data-pathname (get-output-pathname data-file "data" name dir device))) +@@ -351,7 +354,7 @@ Cannot compile ~a.~%" + (wt-data1 form) ;; this binds all the print stuff + )) + +-(defun compile (name &optional def &aux tem gaz (*default-pathname-defaults* #".")) ++(defun compile (name &optional def &aux tem gaz (*default-pathname-defaults* #p".")) + + (cond ((not(symbolp name)) (error "Must be a name")) + ((and (consp def) +@@ -797,7 +800,7 @@ Cannot compile ~a.~%" + + (with-open-file (st (namestring map) :direction :output)) + (safe-system +- (let* ((par (namestring (make-pathname :directory '(:parent)))) ++ (let* ((par (namestring (make-pathname :directory '(:back)))) + (i (concatenate 'string " " par)) + (j (concatenate 'string " " si::*system-directory* par))) + (format nil "~a ~a ~a ~a -L~a ~a ~a ~a" +--- gcl-2.6.12.orig/cmpnew/gcl_cmpopt.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpopt.lsp +@@ -1170,6 +1170,14 @@ type_of(#0)==t_complex") + (push '((t) t #.(flags ans)"coerce_to_string(#0)") + (get 'string 'inline-always)) + ++;;PATHNAME-DESIGNATORP ++(push '((t) boolean #.(flags)"pathname_designatorp(#0)") ++ (get 'si::pathname-designatorp 'inline-always)) ++ ++;;PATHNAMEP ++(push '((t) boolean #.(flags)"pathnamep(#0)") ++ (get 'pathnamep 'inline-always)) ++ + ;;STRINGP + (push '((t) boolean #.(flags)"type_of(#0)==t_string") + (get 'stringp 'inline-always)) +--- gcl-2.6.12.orig/cmpnew/gcl_cmptop.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmptop.lsp +@@ -209,7 +209,7 @@ + + (cond ((not sp) "code") + ((not (pathnamep p)) (init-name (pathname p) sp gp dc nt)) +- (gp (init-name (truename (merge-pathnames p #".lsp")) sp nil dc nt)) ++ (gp (init-name (truename (merge-pathnames p #p".lsp")) sp nil dc nt)) + ((pathname-type p) + (init-name (make-pathname + :host (pathname-host p) +--- gcl-2.6.12.orig/cmpnew/gcl_collectfn.lsp ++++ gcl-2.6.12/cmpnew/gcl_collectfn.lsp +@@ -240,22 +240,20 @@ + + (defvar *warn-on-multiple-fn-definitions* t) + +-(defun add-fn-data (lis &aux tem file) +- (let ((file (and (setq file (si::fp-input-stream *standard-input*)) +- (truename file)))) ++(defun add-fn-data (lis &aux tem (file *load-truename*)) + (dolist (v lis) +- (cond ((eql (fn-name v) 'other-form) +- (setf (fn-name v) (intern +- (concatenate 'string "OTHER-FORM-" +- (namestring file)))) +- (setf (get (fn-name v) 'other-form) t))) +- (setf (gethash (fn-name v) *call-table*) v) +- (when *warn-on-multiple-fn-definitions* +- (when (setq tem (gethash (fn-name v) *file-table*)) +- (unless (equal tem file) +- (warn 'simple-warning :format-control "~% ~a redefined in ~a. Originally in ~a." +- :format-arguments (list (fn-name v) file tem))))) +- (setf (gethash (fn-name v) *file-table*) file)))) ++ (cond ((eql (fn-name v) 'other-form) ++ (setf (fn-name v) (intern ++ (concatenate 'string "OTHER-FORM-" ++ (namestring file)))) ++ (setf (get (fn-name v) 'other-form) t))) ++ (setf (gethash (fn-name v) *call-table*) v) ++ (when *warn-on-multiple-fn-definitions* ++ (when (setq tem (gethash (fn-name v) *file-table*)) ++ (unless (equal tem file) ++ (warn 'simple-warning :format-control "~% ~a redefined in ~a. Originally in ~a." ++ :format-arguments (list (fn-name v) file tem))))) ++ (setf (gethash (fn-name v) *file-table*) file))) + + (defun dump-fn-data (&optional (file "fn-data.lsp") + &aux (*package* (find-package "COMPILER")) +--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp ++++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp +@@ -20,7 +20,6 @@ + (DEFSYSFUN 'CHAR-NAME "Lchar_name" '(T) 'T NIL NIL) + (DEFSYSFUN 'RASSOC-IF "Lrassoc_if" '(T T) 'T NIL NIL) + (DEFSYSFUN 'MAKE-LIST "Lmake_list" '(T *) 'T NIL NIL) +-(DEFSYSFUN 'HOST-NAMESTRING "Lhost_namestring" '(T) 'STRING NIL NIL) + (DEFSYSFUN 'MAKE-ECHO-STREAM "Lmake_echo_stream" '(T T) 'T NIL NIL) + ;(DEFSYSFUN 'NTH "Lnth" '(T T) 'T NIL NIL) + (DEFSYSFUN 'SIN "Lsin" '(T) 'T NIL NIL) +@@ -31,8 +30,6 @@ + ;#-clcs (DEFSYSFUN 'OPEN "Lopen" '(T *) 'T NIL NIL) + (DEFSYSFUN 'BOTH-CASE-P "Lboth_case_p" '(T) 'T NIL T) + (DEFSYSFUN 'NULL "Lnull" '(T) 'T NIL T) +-(DEFSYSFUN 'RENAME-FILE "Lrename_file" '(T T) 'T NIL NIL) +-(DEFSYSFUN 'FILE-AUTHOR "Lfile_author" '(T) 'T NIL NIL) + (DEFSYSFUN 'STRING-CAPITALIZE "Lstring_capitalize" '(T *) 'STRING NIL + NIL) + (DEFSYSFUN 'MACROEXPAND "Lmacroexpand" '(T *) '(VALUES T T) NIL NIL) +@@ -45,7 +42,6 @@ + (DEFSYSFUN 'LENGTH "Llength" '(T) 'FIXNUM T NIL) + (DEFSYSFUN 'RASSOC "Lrassoc" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'PPRINT "Lpprint" '(T *) 'T NIL NIL) +-(DEFSYSFUN 'PATHNAME-HOST "Lpathname_host" '(T) 'T NIL NIL) + (DEFSYSFUN 'NSUBST-IF-NOT "Lnsubst_if_not" '(T T T *) 'T NIL NIL) + (DEFSYSFUN 'FILE-POSITION "Lfile_position" '(T *) 'T NIL NIL) + (DEFSYSFUN 'STRING< "Lstring_l" '(T T *) 'T NIL NIL) +@@ -58,14 +54,11 @@ + (DEFSYSFUN 'STRING>= "Lstring_ge" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'REALPART "Lrealpart" '(T) 'T NIL NIL) + ;;broken on suns.. +-;(DEFSYSFUN 'USER-HOMEDIR-PATHNAME "Luser_homedir_pathname" '(*) 'T NIL +-; NIL) + (DEFSYSFUN 'NBUTLAST "Lnbutlast" '(T *) 'T NIL NIL) + (DEFSYSFUN 'ARRAY-DIMENSION "Larray_dimension" '(T T) 'FIXNUM NIL NIL) + (DEFSYSFUN 'CDR "Lcdr" '(T) 'T NIL NIL) + ;(DEFSYSFUN 'EQL "Leql" '(T T) 'T NIL T) + (DEFSYSFUN 'LOG "Llog" '(T *) 'T NIL NIL) +-(DEFSYSFUN 'DIRECTORY "Ldirectory" '(T) 'T NIL NIL) + (DEFSYSFUN 'STRING-NOT-EQUAL "Lstring_not_equal" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'SHADOWING-IMPORT "Lshadowing_import" '(T *) 'T NIL NIL) + (DEFSYSFUN 'MAPC "Lmapc" '(T T *) 'T NIL NIL) +@@ -78,8 +71,6 @@ + (DEFSYSFUN 'MAKE-SYMBOL "Lmake_symbol" '(T) 'T NIL NIL) + (DEFSYSFUN 'STRING-RIGHT-TRIM "Lstring_right_trim" '(T T) 'STRING NIL + NIL) +-(DEFSYSFUN 'ENOUGH-NAMESTRING "Lenough_namestring" '(T *) 'STRING NIL +- NIL) + (DEFSYSFUN 'PRINT "Lprint" '(T *) 'T NIL NIL) + (DEFSYSFUN 'CDDAAR "Lcddaar" '(T) 'T NIL NIL) + (DEFSYSFUN 'CDADAR "Lcdadar" '(T) 'T NIL NIL) +@@ -187,7 +178,6 @@ + NIL) + (DEFSYSFUN 'COPY-ALIST "Lcopy_alist" '(T) 'T NIL NIL) + (DEFSYSFUN 'ATAN "Latan" '(T *) 'T NIL NIL) +-(DEFSYSFUN 'DELETE-FILE "Ldelete_file" '(T) 'T NIL NIL) + (DEFSYSFUN 'FLOAT-RADIX "Lfloat_radix" '(T) 'FIXNUM NIL NIL) + (DEFSYSFUN 'SYMBOL-NAME "Lsymbol_name" '(T) 'STRING NIL NIL) + (DEFSYSFUN 'CLEAR-INPUT "Lclear_input" '(*) 'T NIL NIL) +@@ -215,8 +205,6 @@ + (DEFSYSFUN 'SXHASH "Lsxhash" '(T) 'FIXNUM NIL NIL) + (DEFSYSFUN 'LISTEN "Llisten" '(*) 'T NIL NIL) + (DEFSYSFUN 'ARRAYP "Larrayp" '(T) 'T NIL T) +-(DEFSYSFUN 'MAKE-PATHNAME "Lmake_pathname" '(*) 'T NIL NIL) +-(DEFSYSFUN 'PATHNAME-TYPE "Lpathname_type" '(T) 'T NIL NIL) + (DEFSYSFUN 'FUNCALL "Lfuncall" '(T *) 'T NIL NIL) + (DEFSYSFUN 'CLRHASH "Lclrhash" '(T) 'T NIL NIL) + (DEFSYSFUN 'GRAPHIC-CHAR-P "Lgraphic_char_p" '(T) 'T NIL T) +@@ -227,14 +215,12 @@ + (DEFSYSFUN 'SUBST-IF "Lsubst_if" '(T T T *) 'T NIL NIL) + (DEFSYSFUN 'COMPLEXP "Lcomplexp" '(T) 'T NIL T) + (DEFSYSFUN 'READ-LINE "Lread_line" '(*) '(VALUES T T) NIL NIL) +-(DEFSYSFUN 'PATHNAMEP "Lpathnamep" '(T) 'T NIL T) + (DEFSYSFUN 'MAX "Lmax" '(T *) 'T NIL NIL) + (DEFSYSFUN 'IN-PACKAGE "Lin_package" '(T *) 'T NIL NIL) + (DEFSYSFUN 'READTABLEP "Lreadtablep" '(T) 'T NIL T) + (DEFSYSFUN 'FLOAT-SIGN "Lfloat_sign" '(T *) 'T NIL NIL) + (DEFSYSFUN 'CHARACTERP "Lcharacterp" '(T) 'T NIL T) + (DEFSYSFUN 'READ "Lread" '(*) 'T NIL NIL) +-(DEFSYSFUN 'NAMESTRING "Lnamestring" '(T) 'T NIL NIL) + (DEFSYSFUN 'UNREAD-CHAR "Lunread_char" '(T *) 'T NIL NIL) + (DEFSYSFUN 'CDAAR "Lcdaar" '(T) 'T NIL NIL) + (DEFSYSFUN 'CADAR "Lcadar" '(T) 'T NIL NIL) +@@ -267,10 +253,8 @@ + (DEFSYSFUN 'PACKAGEP "Lpackagep" '(T) 'T NIL T) + (DEFSYSFUN 'INPUT-STREAM-P "Linput_stream_p" '(T) 'T NIL T) + (DEFSYSFUN '>= "Lmonotonically_nonincreasing" '(T *) 'T NIL T) +-(DEFSYSFUN 'PATHNAME "Lpathname" '(T) 'T NIL NIL) + ;(DEFSYSFUN 'EQ "Leq" '(T T) 'T NIL T) + (DEFSYSFUN 'MAKE-CHAR "Lmake_char" '(T *) 'CHARACTER NIL NIL) +-(DEFSYSFUN 'FILE-NAMESTRING "Lfile_namestring" '(T) 'STRING NIL NIL) + (DEFSYSFUN 'CHARACTER "Lcharacter" '(T) 'CHARACTER NIL NIL) + (DEFSYSFUN 'SYMBOL-FUNCTION "Lsymbol_function" '(T) 'T NIL NIL) + (DEFSYSFUN 'CONSTANTP "Lconstantp" '(T) 'T NIL T) +@@ -307,13 +291,9 @@ + (DEFSYSFUN 'NUMBERP "Lnumberp" '(T) 'T NIL T) + (DEFSYSFUN 'COPY-READTABLE "Lcopy_readtable" '(*) 'T NIL NIL) + (DEFSYSFUN 'RANDOM-STATE-P "Lrandom_state_p" '(T) 'T NIL T) +-(DEFSYSFUN 'DIRECTORY-NAMESTRING "Ldirectory_namestring" '(T) 'STRING +- NIL NIL) + (DEFSYSFUN 'STANDARD-CHAR-P "Lstandard_char_p" '(T) 'T NIL T) +-(DEFSYSFUN 'TRUENAME "Ltruename" '(T) 'T NIL NIL) + (DEFSYSFUN 'IDENTITY "Lidentity" '(T) 'T NIL NIL) + (DEFSYSFUN 'NREVERSE "Lnreverse" '(T) 'T NIL NIL) +-(DEFSYSFUN 'PATHNAME-DEVICE "Lpathname_device" '(T) 'T NIL NIL) + (DEFSYSFUN 'UNINTERN "Lunintern" '(T *) 'T NIL NIL) + (DEFSYSFUN 'UNEXPORT "Lunexport" '(T *) 'T NIL NIL) + (DEFSYSFUN 'FLOAT-PRECISION "Lfloat_precision" '(T) 'FIXNUM NIL NIL) +@@ -324,7 +304,7 @@ + (DEFSYSFUN 'READ-CHAR-NO-HANG "Lread_char_no_hang" '(*) 'T NIL NIL) + (DEFSYSFUN 'FRESH-LINE "Lfresh_line" '(*) 'T NIL NIL) + (DEFSYSFUN 'WRITE-CHAR "Lwrite_char" '(T *) 'T NIL NIL) +-(DEFSYSFUN 'PARSE-NAMESTRING "Lparse_namestring" '(T *) 'T NIL NIL) ++;(DEFSYSFUN 'PARSE-NAMESTRING "Lparse_namestring" '(T *) 'T NIL NIL) + (DEFSYSFUN 'STRING-NOT-LESSP "Lstring_not_lessp" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'CHAR "Lchar" '(T T) 'CHARACTER NIL NIL) + (DEFSYSFUN 'AREF "Laref" '(T *) 'T NIL NIL) +@@ -338,7 +318,6 @@ + (DEFSYSFUN 'DIGIT-CHAR-P "Ldigit_char_p" '(T *) 'T NIL NIL) + ;; #-clcs (DEFSYSFUN 'ERROR "Lerror" '(T *) 'T NIL NIL) + (DEFSYSFUN 'CHAR/= "Lchar_neq" '(T *) 'T NIL T) +-(DEFSYSFUN 'PATHNAME-DIRECTORY "Lpathname_directory" '(T) 'T NIL NIL) + (DEFSYSFUN 'CDAAAR "Lcdaaar" '(T) 'T NIL NIL) + (DEFSYSFUN 'CADAAR "Lcadaar" '(T) 'T NIL NIL) + (DEFSYSFUN 'CAADAR "Lcaadar" '(T) 'T NIL NIL) +@@ -349,7 +328,6 @@ + (DEFSYSFUN 'FORMAT "Lformat" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'COMPILED-FUNCTION-P "Lcompiled_function_p" '(T) 'T NIL T) + (DEFSYSFUN 'SUBLIS "Lsublis" '(T T *) 'T NIL NIL) +-(DEFSYSFUN 'PATHNAME-NAME "Lpathname_name" '(T) 'T NIL NIL) + (DEFSYSFUN 'IMPORT "Limport" '(T *) 'T NIL NIL) + (DEFSYSFUN 'LOGXOR "Llogxor" '(*) 'T NIL NIL) + (DEFSYSFUN 'RASSOC-IF-NOT "Lrassoc_if_not" '(T T) 'T NIL NIL) +@@ -366,9 +344,7 @@ + (DEFSYSFUN 'GET-PROPERTIES "Lget_properties" '(T T) '* NIL NIL) + (DEFSYSFUN 'STRING<= "Lstring_le" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'EVALHOOK "siLevalhook" '(T T T *) 'T NIL NIL) +-(DEFSYSFUN 'FILE-WRITE-DATE "Lfile_write_date" '(T) 'T NIL NIL) + (DEFSYSFUN 'LOGCOUNT "Llogcount" '(T) 'T NIL NIL) +-(DEFSYSFUN 'MERGE-PATHNAMES "Lmerge_pathnames" '(T *) 'T NIL NIL) + (DEFSYSFUN 'MEMBER-IF "Lmember_if" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'READ-BYTE "Lread_byte" '(T *) 'T NIL NIL) + (DEFSYSFUN 'SIMPLE-VECTOR-P "Lsimple_vector_p" '(T) 'T NIL T) +@@ -381,10 +357,8 @@ + (DEFSYSFUN 'GET "Lget" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'MOD "Lmod" '(T T) 'T NIL NIL) + (DEFSYSFUN 'DIGIT-CHAR "Ldigit_char" '(T *) 'CHARACTER NIL NIL) +-(DEFSYSFUN 'PROBE-FILE "Lprobe_file" '(T) 'T NIL NIL) + (DEFSYSFUN 'STRING-LEFT-TRIM "Lstring_left_trim" '(T T) 'STRING NIL + NIL) +-(DEFSYSFUN 'PATHNAME-VERSION "Lpathname_version" '(T) 'T NIL NIL) + (DEFSYSFUN 'WRITE-LINE "Lwrite_line" '(T *) 'T NIL NIL) + (DEFSYSFUN 'EVAL "Leval" '(T) 'T NIL NIL) + (DEFSYSFUN 'ATOM "Latom" '(T) 'T NIL T) +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -4183,7 +4183,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu + #fi + # subst GCC not only under 386-linux, but where available -- CM + +-TCFLAGS="-fsigned-char" ++TCFLAGS="-fsigned-char -fno-builtin-malloc -fno-builtin-free" + + if test "$GCC" = "yes" ; then + +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -483,7 +483,7 @@ AC_SUBST(CC) + #fi + # subst GCC not only under 386-linux, but where available -- CM + +-TCFLAGS="-fsigned-char" ++TCFLAGS="-fsigned-char -fno-builtin-malloc -fno-builtin-free" + + if test "$GCC" = "yes" ; then + +--- gcl-2.6.12.orig/h/att_ext.h ++++ gcl-2.6.12/h/att_ext.h +@@ -116,25 +116,14 @@ float object_to_float(); + double object_to_double(); + + /* error.c */ +-EXTER object sKerror; +-EXTER object sKwrong_type_argument; + EXTER object sKcatch; + EXTER object sKprotect; + EXTER object sKcatchall; +-EXTER object sKtoo_few_arguments; +-EXTER object sKtoo_many_arguments; +-EXTER object sKunexpected_keyword; +-EXTER object sKinvalid_form; +-EXTER object sKunbound_variable; +-EXTER object sKinvalid_variable; +-EXTER object sKundefined_function; +-EXTER object sKinvalid_function; + EXTER object sKdatum; + EXTER object sKexpected_type; + EXTER object sKpackage; + EXTER object sKformat_control; + EXTER object sKformat_arguments; +-EXTER object sKpackage_error; + object wrong_type_argument(); + EXTER object sSuniversal_error_handler; + +@@ -394,10 +383,11 @@ EXTER object sKname; + EXTER object sKtype; + EXTER object sKversion; + EXTER object sKdefaults; +-EXTER object sKroot; +-EXTER object sKcurrent; +-EXTER object sKparent; +-EXTER object sKper; ++ ++EXTER object sKabsolute; ++EXTER object sKrelative; ++EXTER object sKup; ++ + /* object parse_namestring(); */ + object coerce_to_pathname(); + /* object default_device(); */ +--- gcl-2.6.12.orig/h/compdefs.h ++++ gcl-2.6.12/h/compdefs.h +@@ -115,3 +115,5 @@ SIGNED_CHAR(x) + FEerror(x,y...) + FEwrong_type_argument(x,y) + BIT_ENDIAN(x) ++pathname_designatorp(x) ++pathnamep(x) +--- gcl-2.6.12.orig/h/error.h ++++ gcl-2.6.12/h/error.h +@@ -22,6 +22,7 @@ PFN(numberp) + PFN(characterp) + PFN(symbolp) + PFN(stringp) ++PFN(pathnamep) + PFN(string_symbolp) + PFN(packagep) + PFN(consp) +@@ -52,6 +53,7 @@ PFN(functionp) + #define check_type_character(a_) TPE(a_,characterp_fn,sLcharacter) + #define check_type_sym(a_) TPE(a_,symbolp_fn,sLsymbol) + #define check_type_string(a_) TPE(a_,stringp_fn,sLstring) ++#define check_type_pathname(a_) TPE(a_,pathnamep_fn,sLpathname) + #define check_type_or_string_symbol(a_) TPE(a_,string_symbolp_fn,TSor_symbol_string) + #define check_type_or_symbol_string(a_) TPE(a_,string_symbolp_fn,TSor_symbol_string) + #define check_type_or_pathname_string_symbol_stream(a_) TPE(a_,pathname_string_symbol_streamp_fn,TSor_pathname_string_symbol_stream) +@@ -79,12 +81,6 @@ PFN(functionp) + set_type_of((a_),t_fixnum);\ + (a_)->FIX.FIXVAL=(b_);} + +-/*FIXME the stack stuff is dangerous It works for error handling, but +- simple errors may evan pass the format tring up the stack as a slot +- in ansi*/ +-/* #define TYPE_ERROR(a_,b_) {stack_string(tp_err,"~S is not of type ~S.");\ */ +-/* Icall_error_handler(sKwrong_type_argument,tp_err,2,(a_),(b_));} */ +- + object ihs_top_function_name(ihs_ptr h); + #define FEerror(a_,b_...) Icall_error_handler(sLerror,null_string,\ + 4,sKformat_control,make_simple_string(a_),sKformat_arguments,list(b_)) +--- gcl-2.6.12.orig/h/lu.h ++++ gcl-2.6.12/h/lu.h +@@ -301,7 +301,7 @@ struct pathname { + object pn_name; + object pn_type; + object pn_version; +- SPAD; ++ object pn_namestring; + }; + + struct cfun { +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -47,12 +47,6 @@ EXTER object user_package; + else *__p++ = va_arg(ap,object);} \ + va_end(ap) + +-/* #undef endp */ +- +-/* #define endp(obje) ((enum type)((endp_temp = (obje))->d.t) == t_cons ? \ */ +-/* FALSE : endp_temp == Cnil ? TRUE : \ */ +-/* endp1(endp_temp)) */ +- + #ifndef NO_DEFUN + #undef DEFUN + #define DEFUN(string,ret,fname,pack,min,max, flags, ret0a0,a12,a34,a56,doc) ret fname +@@ -234,7 +228,7 @@ EXTER bool left_trim; + EXTER bool right_trim; + int (*casefun)(); + +-#define Q_SIZE 128 ++#define Q_SIZE 256 + #define IS_SIZE 256 + + struct printStruct { +@@ -300,6 +294,8 @@ gcl_init_cmp_anon(void); + + #include "gmp_wrappers.h" + ++char FN1[PATH_MAX],FN2[PATH_MAX],FN3[PATH_MAX],FN4[PATH_MAX],FN5[PATH_MAX]; ++ + #include + #define massert(a_) ({errno=0;if (!(a_)||errno) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__);}) + +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -163,24 +163,6 @@ enum aelttype { /* array element type + #define STREF(type,x,i) (*((type *)(((char *)((x)->str.str_self))+(i)))) + #define STSET(type,x,i,val) do{SGC_TOUCH(x);STREF(type,x,i) = (val);} while(0) + +- +- +-enum smmode { /* stream mode */ +- smm_input, /* input */ +- smm_output, /* output */ +- smm_io, /* input-output */ +- smm_probe, /* probe */ +- smm_synonym, /* synonym */ +- smm_broadcast, /* broadcast */ +- smm_concatenated, /* concatenated */ +- smm_two_way, /* two way */ +- smm_echo, /* echo */ +- smm_string_input, /* string input */ +- smm_string_output, /* string output */ +- smm_user_defined, /* for user defined */ +- smm_socket /* Socket stream */ +-}; +- + /* for any stream that takes writec_char, directly (not two_way or echo) + ie. smm_output,smm_io, smm_string_output, smm_socket + */ +@@ -217,9 +199,9 @@ enum gcl_sm_flags { + gcl_sm_tcp_async, + gcl_sm_input, + gcl_sm_output, ++ gcl_sm_closed, + gcl_sm_had_error + +- + }; + + enum chattrib { /* character attribute */ +@@ -496,8 +478,11 @@ object make_si_sfun(); + Used by the C function to set optionals */ + + #define VFUN_NARGS fcall.argd ++#define RETURN4(x,y,z,w) do{/* object _x = (void *) x; */ \ ++ fcall.values[1]=y;fcall.values[2]=z;fcall.values[3]=w;fcall.nvalues=4; \ ++ return (x) ;} while(0) + #define RETURN2(x,y) do{/* object _x = (void *) x; */\ +- fcall.values[2]=y;fcall.nvalues=2; \ ++ fcall.values[1]=y;fcall.nvalues=2; \ + return (x) ;} while(0) + #define RETURN1(x) do{fcall.nvalues=1; return (x) ;} while(0) + #define RETURN0 do{fcall.nvalues=0; return Cnil ;} while(0) +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -88,7 +88,7 @@ + /* big.c:85:OF */ extern void zero_big (object x); /* (x) object x; */ + /* bind.c:74:OF */ extern void lambda_bind (object *arg_top); /* (arg_top) object *arg_top; */ + /* bind.c:564:OF */ extern void bind_var (object var, object val, object spp); /* (var, val, spp) object var; object val; object spp; */ +-/* bind.c:610:OF */ extern object find_special (object body, struct bind_temp *start, struct bind_temp *end); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */ ++/* bind.c:610:OF */ extern object find_special (object body, struct bind_temp *start, struct bind_temp *end,object *s); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */ + /* bind.c:670:OF */ extern object let_bind (object body, struct bind_temp *start, struct bind_temp *end); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */ + /* bind.c:688:OF */ extern object letA_bind (object body, struct bind_temp *start, struct bind_temp *end); /* (body, start, end) object body; struct bind_temp *start; struct bind_temp *end; */ + /* bind.c:712:OF */ extern void parse_key (object *base, bool rest, bool allow_other_keys, register int n, ... ); +--- gcl-2.6.12.orig/h/type.h ++++ gcl-2.6.12/h/type.h +@@ -7,6 +7,7 @@ enum type { + t_shortfloat, + t_longfloat, + t_complex, ++ t_stream, + t_pathname, + t_string, + t_bitvector, +@@ -17,7 +18,6 @@ enum type { + t_character, + t_symbol, + t_package, +- t_stream, + t_random, + t_readtable, + t_cfun, +@@ -36,6 +36,23 @@ enum type { + }; + + ++enum smmode { /* stream mode */ ++ smm_input, /* input */ ++ smm_output, /* output */ ++ smm_io, /* input-output */ ++ smm_probe, /* probe */ ++ smm_file_synonym, /* synonym stream to file_stream */ ++ smm_synonym, /* synonym */ ++ smm_broadcast, /* broadcast */ ++ smm_concatenated, /* concatenated */ ++ smm_two_way, /* two way */ ++ smm_echo, /* echo */ ++ smm_string_input, /* string input */ ++ smm_string_output, /* string output */ ++ smm_user_defined, /* for user defined */ ++ smm_socket /* Socket stream */ ++}; ++ + #define Zcdr(a_) (*(object *)(a_))/* ((a_)->c.c_cdr) */ /*FIXME*/ + + #ifndef WIDE_CONS +@@ -82,7 +99,7 @@ enum type { + #else + #define TYPEWORD_TYPE_P(y_) (y_!=t_cons) + #endif +- ++ + /*Note preserve sgc flag here VVV*/ + #define set_type_of(x,y) ({object _x=(object)(x);enum type _y=(y);_x->d.f=0;\ + if (TYPEWORD_TYPE_P(_y)) {_x->d.e=1;_x->d.t=_y;_x->fw|=(fixnum)OBJNULL;}}) +@@ -113,6 +130,7 @@ enum type { + #define randomp(a_) SPP(a_,random) + #define characterp(a_) SPP(a_,character) + #define symbolp(a_) SPP(a_,symbol) ++#define pathnamep(a_) SPP(a_,pathname) + #define stringp(a_) SPP(a_,string) + #define fixnump(a_) SPP(a_,fixnum) + #define readtablep(a_) SPP(a_,readtable) +@@ -133,3 +151,6 @@ enum type { + || _tp == t_symbol;}) + #define pathname_string_symbol_streamp(a_) ({enum type _tp=type_of(a_); _tp==t_pathname || _tp == t_string\ + || _tp == t_symbol || _tp==t_stream;}) ++ ++#define pathname_designatorp(a_) ({object _a=(a_);enum type _tp=type_of(a_);\ ++ _tp==t_pathname||_tp==t_string||(_tp==t_stream && _a->sm.sm_mode>=smm_input && _a->sm.sm_mode<=smm_file_synonym);}) +--- gcl-2.6.12.orig/lsp/gcl_autoload.lsp ++++ gcl-2.6.12/lsp/gcl_autoload.lsp +@@ -410,10 +410,3 @@ Good luck! The GCL Development Team" + (setf (get 'with-open-file 'si:pretty-print-format) 1) + (setf (get 'with-open-stream 'si:pretty-print-format) 1) + (setf (get 'with-output-to-string 'si:pretty-print-format) 1) +- +- +-(in-package :si) +- +-(defvar *lib-directory* (namestring (truename "../"))) +- +-(import '(*lib-directory* *load-path* *system-directory*) :user) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -0,0 +1,67 @@ ++(in-package :si) ++ ++(defconstant +d-type-alist+ (d-type-list)) ++ ++(defun ?push (x tp) ++ (when (and x (eq tp :directory)) (vector-push-extend #\/ x)) ++ x) ++ ++(defun wreaddir (x s &optional y (ls (length s) lsp) &aux (y (if (rassoc y +d-type-alist+) y :unknown))) ++ (when lsp (setf (fill-pointer s) ls)) ++ (let ((r (readdir x (car (rassoc y +d-type-alist+)) s))) ++ (typecase r ++ (fixnum (wreaddir x (adjust-array s (+ 100 (ash (array-dimension s 0) 1))) y)) ++ (cons (let ((tp (cdr (assoc (cdr r) +d-type-alist+)))) (cons (?push (car r) tp) tp))) ++ (otherwise (?push r y))))) ++ ++(defun dot-dir-p (r l) (member-if (lambda (x) (string= x r :start2 l)) '("./" "../"))) ++ ++(defun vector-push-string (x s &optional (ss 0) (lx (length x)) &aux (ls (- (length s) ss))) ++ (let ((x (if (> ls (- (array-dimension x 0) lx)) (adjust-array x (+ ls (ash lx 1))) x))) ++ (setf (fill-pointer x) (+ lx ls)) ++ (replace x s :start1 lx :start2 ss))) ++ ++(defun walk-dir (s e f &optional (y :unknown) (d (opendir s)) (l (length s)) (le (length e)) ++ &aux (r (wreaddir d s y l))) ++ (cond (r (unless (dot-dir-p r l) (funcall f r (vector-push-string e r l le) l)) ++ (walk-dir s e f y d l le)) ++ ((setf (fill-pointer s) l (fill-pointer e) le) (closedir d)))) ++ ++(defun recurse-dir (x y f) ++ (funcall f x y) ++ (walk-dir x y (lambda (x y l) (declare (ignore l)) (recurse-dir x y f)) :directory)) ++ ++(defun make-frame (s &aux (l (length s))) ++ (replace (make-array l :element-type 'character :adjustable t :fill-pointer l) s)) ++ ++(defun expand-wild-directory (l f zz &optional (yy (make-frame zz))) ++ (let* ((x (member-if 'wild-dir-element-p l)) ++ (s (namestring (make-pathname :directory (ldiff l x)))) ++ (z (vector-push-string zz s)) ++ (l (length yy)) ++ (y (link-expand (vector-push-string yy s) l)) ++ (y (if (eq y yy) y (make-frame y)))) ++ (when (or (eq (stat z) :directory) (zerop (length z))) ++ (cond ((eq (car x) :wild-inferiors) (recurse-dir z y f)) ++ (x (walk-dir z y (lambda (q e l) ++ (declare (ignore l)) ++ (expand-wild-directory (cons :relative (cdr x)) f q e)) :directory));FIXME ++ ((funcall f z y)))))) ++ ++(defun directory (p &key &aux (p (translate-logical-pathname p))(d (pathname-directory p)) ++ (c (unless (eq (car d) :absolute) (make-frame (concatenate 'string (getcwd) "/")))) ++ (lc (when c (length c))) ++ (filesp (or (pathname-name p) (pathname-type p))) ++ (v (compile-regexp (to-regexp p)))(*up-key* :back) r) ++ (expand-wild-directory d ++ (lambda (dir exp &aux (pexp (pathname (if c (vector-push-string c exp 0 lc) exp)))) ++ (if filesp ++ (walk-dir dir exp ++ (lambda (dir exp pos) ++ (declare (ignore exp)) ++ (when (pathname-match-p dir v) ++ (push (merge-pathnames (parse-namestring dir nil *default-pathname-defaults* :start pos) pexp nil) r))) ++ :file) ++ (when (pathname-match-p dir v) (push pexp r)))) ++ (make-frame (if c "./" ""))) ++ r) +--- gcl-2.6.12.orig/lsp/gcl_fpe.lsp ++++ gcl-2.6.12/lsp/gcl_fpe.lsp +@@ -60,7 +60,7 @@ + + + (defun rf (addr w) +- (ecase w (4 (*float addr)) (8 (*double addr)))) ++ (ecase w (4 (*float addr 0 nil nil)) (8 (*double addr 0 nil nil)))) + + (defun ref (addr p w &aux (i -1)) + (if p +@@ -71,7 +71,7 @@ + (f (eql #\F (aref z 0)))) + (ref addr (unless f (eql (aref z (- lz 2)) #\P)) (if (or f (eql (aref z (1- lz)) #\D)) 8 4))) + +-(defun reg-lookup (x) (*fixnum (+ (car *context*) (symbol-value x)))) ++(defun reg-lookup (x) (*fixnum (+ (car *context*) (symbol-value x)) 0 nil nil)) + + (defun st-lookup (x) (fld (+ (cadr *context*) (symbol-value x)))) + (defun xmm-lookup (x) (gref (+ (caddr *context*) (symbol-value x)))) +--- gcl-2.6.12.orig/lsp/gcl_fpe_test.lsp ++++ gcl-2.6.12/lsp/gcl_fpe_test.lsp +@@ -1,6 +1,6 @@ +-#.`(defun test-fpe (f a r &optional chk &aux cc (o (mapcan (lambda (x) (list x t)) (si::break-on-floating-point-exceptions)))) ++#.`(defun test-fpe (f a r &optional chk &aux cc (o (mapcan (lambda (x) (list x t)) (break-on-floating-point-exceptions)))) + (flet ((set-break (x) (when (keywordp r) +- (apply 'si::break-on-floating-point-exceptions (append (unless x o) (list r x)))))) ++ (apply 'break-on-floating-point-exceptions (append (unless x o) (list r x)))))) + (let* ((rr (handler-case (unwind-protect (progn (set-break t) (apply f a)) (set-break nil)) + ,@(mapcar (lambda (x &aux (x (car x))) `(,x (c) (setq cc c) ,(intern (symbol-name x) :keyword))) + (append si::+fe-list+ '((arithmetic-error)(error))))))) +--- gcl-2.6.12.orig/lsp/gcl_info.lsp ++++ gcl-2.6.12/lsp/gcl_info.lsp +@@ -8,28 +8,6 @@ + (,op (the fixnum ,x) (the fixnum ,y)))) + (defmacro fcr (x) `(load-time-value (compile-regexp ,x)))) + +-(eval-when (compile eval load) +-(defun sharp-u-reader (stream subchar arg) +- subchar arg +- (let ((tem (make-array 10 :element-type 'character :fill-pointer 0))) +- (or (eql (read-char stream) #\") +- (error "sharp-u-reader reader needs a \" right after it")) +- (loop +- (let ((ch (read-char stream))) +- (cond ((eql ch #\") (return tem)) +- ((eql ch #\\) +- (setq ch (read-char stream)) +- (setq ch (or (cdr (assoc ch '((#\n . #\newline) +- (#\t . #\tab) +- (#\r . #\return)))) +- ch)))) +- (vector-push-extend ch tem))) +- tem)) +- +-(set-dispatch-macro-character #\# #\u 'sharp-u-reader) +- +-) +- + (defconstant +crlu+ (compile-regexp #u"")) + (defconstant +crnp+ (compile-regexp #u"[ ]")) + +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -1,3 +1,4 @@ ++;; -*-Lisp-*- + ;; Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa + + ;; This file is part of GNU Common Lisp, herein referred to as GCL +@@ -24,130 +25,229 @@ + + (in-package :si) + +-(proclaim '(optimize (safety 2) (space 3))) ++(defun concatenated-stream-streams (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream concatenated-stream) ++ (c-stream-object0 stream)) ++(defun broadcast-stream-streams (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream broadcast-stream) ++ (c-stream-object0 stream)) ++(defun two-way-stream-input-stream (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream two-way-stream) ++ (c-stream-object0 stream)) ++(defun echo-stream-input-stream (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream echo-stream) ++ (c-stream-object0 stream)) ++(defun two-way-stream-output-stream (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream two-way-stream) ++ (c-stream-object1 stream)) ++(defun echo-stream-output-stream (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream echo-stream) ++ (c-stream-object1 stream)) ++(defun synonym-stream-symbol (stream) ++ (declare (optimize (safety 2))) ++ (check-type stream synonym-stream) ++ (c-stream-object0 stream)) + ++(defun maybe-clear-input (&optional (x *standard-input*)) ++ (typecase x ++ (synonym-stream (maybe-clear-input (symbol-value (synonym-stream-symbol x)))) ++ (two-way-stream (maybe-clear-input (two-way-stream-input-stream x))) ++ (stream (when (terminal-input-stream-p x) (clear-input t))))) + + (defmacro with-open-stream ((var stream) . body) +- (multiple-value-bind (ds b) +- (find-declarations body) ++ (declare (optimize (safety 1))) ++ (multiple-value-bind (ds b) (find-declarations body) + `(let ((,var ,stream)) + ,@ds + (unwind-protect +- (progn ,@b) ++ (progn ,@b) + (close ,var))))) + +- + (defmacro with-input-from-string ((var string &key index start end) . body) +- (let ((x (sgen "X"))) +- (multiple-value-bind (ds b) +- (find-declarations body) +- `(let ((,var (make-string-input-stream ,string ,start ,end))) +- ,@ds +- (unwind-protect +- ,(let ((f `(progn ,@b))) +- (if index +- `(let ((,x (multiple-value-list ,f))) (setf ,index (get-string-input-stream-index ,var)) (values-list ,x)) +- f)) +- (close ,var)))))) ++ (declare (optimize (safety 1))) ++ (multiple-value-bind (ds b) (find-declarations body) ++ `(let ((,var (make-string-input-stream ,string ,start ,end))) ++ ,@ds ++ (unwind-protect ++ (multiple-value-prog1 ++ (progn ,@b) ++ ,@(when index `((setf ,index (get-string-input-stream-index ,var))))) ++ (close ,var))))) + + (defmacro with-output-to-string ((var &optional string &key element-type) . body) +- (let ((s (sgen "STRING"))(bl (sgen "BLOCK"))(e (sgen "ELEMENT-TYPE"))(x (sgen "X"))) +- (multiple-value-bind (ds b) +- (find-declarations body) +- `(let* ((,s ,string)(,e ,element-type) +- (,var (if ,s (make-string-output-stream-from-string ,s) (make-string-output-stream :element-type ,e)))) ++ (declare (optimize (safety 1))) ++ (let ((s (sgen "STRING"))) ++ (multiple-value-bind (ds b) (find-declarations body) ++ `(let* ((,s ,string) ++ (,var (if ,s (make-string-output-stream-from-string ,s) (make-string-output-stream :element-type ,element-type)))) + ,@ds + (unwind-protect +- (let ((,x (multiple-value-list (progn ,@b)))) (if ,s (values-list ,x) (get-output-stream-string ,var))) ++ (block nil ++ (multiple-value-prog1 ++ (progn ,@b) ++ (unless ,s (return (get-output-stream-string ,var))))) + (close ,var)))))) + + +-(defun read-from-string (string +- &optional (eof-error-p t) eof-value +- &key (start 0) (end (length string)) +- preserve-whitespace) +- (let ((stream (make-string-input-stream string start end))) +- (if preserve-whitespace +- (values (read-preserving-whitespace stream eof-error-p eof-value) +- (si:get-string-input-stream-index stream)) +- (values (read stream eof-error-p eof-value) +- (si:get-string-input-stream-index stream))))) +- ++(defun read-from-string (string &optional (eof-error-p t) eof-value ++ &key (start 0) end preserve-whitespace) ++ (declare (optimize (safety 1))) ++ (check-type string string) ++ (check-type start seqind) ++ (check-type end (or null seqind)) ++ (let ((stream (make-string-input-stream string start (or end (length string))))) ++ (values (if preserve-whitespace ++ (read-preserving-whitespace stream eof-error-p eof-value) ++ (read stream eof-error-p eof-value)) ++ (get-string-input-stream-index stream)))) ++ ++;; (defun write (x &key stream ++;; (array *print-array*) ++;; (base *print-base*) ++;; (case *print-case*) ++;; (circle *print-circle*) ++;; (escape *print-escape*) ++;; (gensym *print-gensym*) ++;; (length *print-length*) ++;; (level *print-level*) ++;; (lines *print-lines*) ++;; (miser-width *print-miser-width*) ++;; (pprint-dispatch *print-pprint-dispatch*) ++;; (pretty *print-pretty*) ++;; (radix *print-radix*) ++;; (readably *print-readably*) ++;; (right-margin *print-right-margin*)) ++;; (write-int x stream array base case circle escape gensym ++;; length level lines miser-width pprint-dispatch ++;; pretty radix readably right-margin)) + + (defun write-to-string (object &rest rest +- &key escape radix base +- circle pretty level length +- case gensym array +- &aux (stream (make-string-output-stream))) +- (declare (ignore escape radix base +- circle pretty level length +- case gensym array)) ++ &key (escape *print-escape*)(radix *print-radix*)(base *print-base*) ++ (circle *print-circle*)(pretty *print-pretty*)(level *print-level*) ++ (length *print-length*)(case *print-case*)(gensym *print-gensym*) ++ (array *print-array*)(lines *print-lines*)(miser-width *print-miser-width*) ++ (pprint-dispatch *print-pprint-dispatch*)(readably *print-readably*) ++ (right-margin *print-right-margin*) ++ &aux (stream (make-string-output-stream)) ++ (*print-escape* escape)(*print-radix* radix)(*print-base* base) ++ (*print-circle* circle)(*print-pretty* pretty)(*print-level* level) ++ (*print-length* length)(*print-case* case)(*print-gensym* gensym) ++ (*print-array* array)(*print-lines* lines)(*print-miser-width* miser-width) ++ (*print-pprint-dispatch* pprint-dispatch)(*print-readably* readably ) ++ (*print-right-margin* right-margin)) ++ (declare (optimize (safety 1))(dynamic-extent rest)) + (apply #'write object :stream stream rest) + (get-output-stream-string stream)) + ++(defun prin1-to-string (object &aux (stream (make-string-output-stream))) ++ (declare (optimize (safety 1))) ++ (prin1 object stream) ++ (get-output-stream-string stream)) + +-(defun prin1-to-string (object +- &aux (stream (make-string-output-stream))) +- (prin1 object stream) +- (get-output-stream-string stream)) +- +- +-(defun princ-to-string (object +- &aux (stream (make-string-output-stream))) ++(defun princ-to-string (object &aux (stream (make-string-output-stream))) ++ (declare (optimize (safety 1))) + (princ object stream) + (get-output-stream-string stream)) + ++;; (defun file-string-length (ostream object) ++;; (declare (optimize (safety 2))) ++;; (let ((ostream (if (typep ostream 'broadcast-stream) ++;; (car (last (broadcast-stream-streams ostream))) ++;; ostream))) ++;; (cond ((not ostream) 1) ++;; ((subtypep1 (stream-element-type ostream) 'character) ++;; (length (let ((*print-escape* nil)) (write-to-string object))))))) ++ ++;; (defmacro with-temp-file ((s pn) (tmp ext) &rest body) ++;; (multiple-value-bind ++;; (doc decls ctps body) ++;; (parse-body-header body) ++;; (declare (ignore doc)) ++;; `(let* ((,s (temp-stream ,tmp ,ext)) ++;; (,pn (stream-object1 ,s))) ++;; ,@decls ++;; ,@ctps ++;; (unwind-protect (progn ,@body) (progn (close ,s) (delete-file ,s)))))) ++ + + (defmacro with-open-file ((stream . filespec) . body) +- (multiple-value-bind (ds b) +- (find-declarations body) ++ (declare (optimize (safety 1))) ++ (multiple-value-bind (ds b) (find-declarations body) + `(let ((,stream (open ,@filespec))) + ,@ds + (unwind-protect +- (progn ,@b) +- (if ,stream (close ,stream)))))) ++ (progn ,@b) ++ (when ,stream (close ,stream)))))) + ++;; (defun pprint-dispatch (obj &optional (table *print-pprint-dispatch*)) ++;; (declare (optimize (safety 2))) ++;; (let ((fun (si:get-pprint-dispatch obj table))) ++;; (if fun (values fun t) (values 'si:default-pprint-object nil)))) ++ ++;; (setq *print-pprint-dispatch* '(pprint-dispatch . nil)) ++ ++;; (defun set-pprint-dispatch (type-spec function &optional ++;; (priority 0) ++;; (table *print-pprint-dispatch*)) ++;; (declare (optimize (safety 2))) ++;; (unless (typep priority 'real) ++;; (error 'type-error :datum priority :expected-type 'real)) ++;; (let ((a (assoc type-spec (cdr table) :test 'equal))) ++;; (if a (setf (cdr a) (list function priority)) ++;; (rplacd (last table) `((,type-spec ,function ,priority))))) ++;; nil) ++ ++;; (defun copy-pprint-dispatch (&optional table) ++;; (declare (optimize (safety 2))) ++;; (unless table ++;; (setq table *print-pprint-dispatch*)) ++;; (unless (and (eq (type-of table) 'cons) ++;; (eq (car table) 'pprint-dispatch)) ++;; (error 'type-error :datum table :expected-type 'pprint-dispatch)) ++;; (copy-seq table )) + +-(defun y-or-n-p (&optional string &rest args) +- (do ((reply)) +- (nil) +- (when string (format *query-io* "~&~? (Y or N) " string args)) +- (setq reply (read *query-io*)) +- (cond ((string-equal (symbol-name reply) "Y") +- (return-from y-or-n-p t)) +- ((string-equal (symbol-name reply) "N") +- (return-from y-or-n-p nil))))) + ++(defun y-or-n-p (&optional string &rest args) ++ (declare (optimize (safety 1))) ++ (when string (format *query-io* "~&~? (Y or N) " string args)) ++ (let ((reply (symbol-name (read *query-io*)))) ++ (cond ((string-equal reply "Y") t) ++ ((string-equal reply "N") nil) ++ ((apply 'y-or-n-p string args))))) + + (defun yes-or-no-p (&optional string &rest args) +- (do ((reply)) +- (nil) +- (when string (format *query-io* "~&~? (Yes or No) " string args)) +- (setq reply (read *query-io*)) +- (cond ((string-equal (symbol-name reply) "YES") +- (return-from yes-or-no-p t)) +- ((string-equal (symbol-name reply) "NO") +- (return-from yes-or-no-p nil))))) +- ++ (declare (optimize (safety 1))) ++ (when string (format *query-io* "~&~? (Yes or No) " string args)) ++ (let ((reply (symbol-name (read *query-io*)))) ++ (cond ((string-equal reply "YES") t) ++ ((string-equal reply "NO") nil) ++ ((apply 'yes-or-no-p string args))))) + + (defun sharp-a-reader (stream subchar arg) + (declare (ignore subchar)) + (let ((initial-contents (read stream nil nil t))) +- (if *read-suppress* +- nil +- (do ((i 0 (1+ i)) +- (d nil (cons (length ic) d)) +- (ic initial-contents (if (zerop (length ic)) ic (elt ic 0)))) +- ((>= i arg) +- (make-array (nreverse d) +- :initial-contents initial-contents)))))) ++ (unless *read-suppress* ++ (do ((i 0 (1+ i)) ++ (d nil (cons (length ic) d)) ++ (ic initial-contents (if (zerop (length ic)) ic (elt ic 0)))) ++ ((>= i arg) (make-array (nreverse d) :initial-contents initial-contents)))))) + + (set-dispatch-macro-character #\# #\a 'sharp-a-reader) ++(set-dispatch-macro-character #\# #\a 'sharp-a-reader (standard-readtable)) + (set-dispatch-macro-character #\# #\A 'sharp-a-reader) ++(set-dispatch-macro-character #\# #\A 'sharp-a-reader (standard-readtable)) + + ;; defined in defstruct.lsp + (set-dispatch-macro-character #\# #\s 'sharp-s-reader) ++(set-dispatch-macro-character #\# #\s 'sharp-s-reader (standard-readtable)) + (set-dispatch-macro-character #\# #\S 'sharp-s-reader) ++(set-dispatch-macro-character #\# #\S 'sharp-s-reader (standard-readtable)) + + (defvar *dribble-stream* nil) + (defvar *dribble-io* nil) +@@ -155,6 +255,7 @@ + (defvar *dribble-saved-terminal-io* nil) + + (defun dribble (&optional (pathname "DRIBBLE.LOG" psp) (f :supersede)) ++ (declare (optimize (safety 1))) + (cond ((not psp) + (when (null *dribble-stream*) (error "Not in dribble.")) + (if (eq *dribble-io* *terminal-io*) +@@ -183,73 +284,18 @@ + (format t "~&Starts dribbling to ~A (~d/~d/~d, ~d:~d:~d)." + namestring year month day hour min sec)))))) + +-(defconstant char-length 8) +- +-(defun get-byte-stream-nchars (s) +- (check-type s stream) +- (let* ((tp (stream-element-type s)) +- (tp (if (consp tp) (cadr tp) char-length)) +- (nc (ceiling tp char-length))) +- nc)) +- +-(defun write-byte (j s) +- (declare (optimize (safety 1))) +- (let ((nc (get-byte-stream-nchars s)) +- (ff (1- (expt 2 char-length)))) +- (do ((k 0 (1+ k))(i j (ash i (- char-length)))) ((>= k nc) j) +- (write-char (code-char (logand i ff)) s)))) +- +-(defun read-byte (s &optional (eof-error-p t) eof-value) +- (declare (optimize (safety 1))) +- (let ((nc (get-byte-stream-nchars s))) +- (do ((j 0 (1+ j)) +- (i 0 (logior i +- (ash (char-code (let ((ch (read-char s eof-error-p eof-value))) +- (if (and (not eof-error-p) (eq ch eof-value)) +- (return-from read-byte ch) +- ch))) (* j char-length))))) +- ((>= j nc) i)))) +- +- +-(defun read-sequence (seq strm &key (start 0) end) +- (declare (optimize (safety 1))) +- (check-type seq sequence) +- (check-type start (integer 0)) +- (check-type end (or null (integer 0))) +- (let* ((start (min start array-dimension-limit)) +- (end (if end (min end array-dimension-limit) (length seq))) +- (l (listp seq)) +- (seq (if (and l (> start 0)) (nthcdr start seq) seq)) +- (tp (subtypep (stream-element-type strm) 'character))) +- (do ((i start (1+ i))(seq seq (if l (cdr seq) seq))) +- ((or (>= i end) (when l (endp seq))) i) +- (declare (fixnum i)) +- (let ((el (if tp (read-char strm nil 'eof) (read-byte strm nil 'eof)))) +- (when (eq el 'eof) (return i)) +- (if l (setf (car seq) el) (setf (aref seq i) el)))))) +- ++;; (defmacro formatter ( control-string ) ++;; (declare (optimize (safety 2))) ++;; `(progn ++;; (lambda (*standard-output* &rest arguments) ++;; (let ((*format-unused-args* nil)) ++;; (apply 'format t ,control-string arguments) ++;; *format-unused-args*)))) + +-(defun write-sequence (seq strm &key (start 0) end) ++(defun stream-external-format (s) + (declare (optimize (safety 1))) +- (check-type seq sequence) +- (check-type start (integer 0)) +- (check-type end (or null (integer 0))) +- (let* ((start (min start array-dimension-limit)) +- (end (if end (min end array-dimension-limit) (length seq))) +- (l (listp seq)) +- (tp (subtypep (stream-element-type strm) 'character))) +- (do ((i start (1+ i)) +- (seq (if (and l (> start 0)) (nthcdr start seq) seq) (if l (cdr seq) seq))) +- ((or (>= i end) (when l (endp seq)))) +- (declare (fixnum i)) +- (let ((el (if l (car seq) (aref seq i)))) +- (if tp (write-char el strm) (write-byte el strm)))) +- seq)) +- +-(defmacro with-compilation-unit (opt &rest body) +- (declare (optimize (safety 2))) +- (declare (ignore opt)) +- `(progn ,@body)) ++ (check-type s stream) ++ :default) + + (defvar *print-lines* nil) + (defvar *print-miser-width* nil) +@@ -257,7 +303,7 @@ + (defvar *print-right-margin* nil) + + (defmacro with-standard-io-syntax (&body body) +- (declare (optimize (safety 2))) ++ (declare (optimize (safety 1))) + `(let* ((*package* (find-package :cl-user)) + (*print-array* t) + (*print-base* 10) +@@ -269,7 +315,7 @@ + (*print-level* nil) + (*print-lines* nil) + (*print-miser-width* nil) +- (*print-pprint-dispatch* *print-pprint-dispatch*) ++ (*print-pprint-dispatch* *print-pprint-dispatch*);FIXME + (*print-pretty* nil) + (*print-radix* nil) + (*print-readably* t) +@@ -278,37 +324,163 @@ + (*read-default-float-format* 'single-float) + (*read-eval* t) + (*read-suppress* nil) +- (*readtable* (copy-readtable (si::standard-readtable))));FIXME copy? ++ (*readtable* (copy-readtable (standard-readtable)))) + ,@body)) + ++;; (defmacro print-unreadable-object ++;; ((object stream &key type identity) &body body) ++;; (declare (optimize (safety 2))) ++;; (let ((q `(princ " " ,stream))) ++;; `(if *print-readably* ++;; (error 'print-not-readable :object ,object) ++;; (progn ++;; (princ "#<" ,stream) ++;; ,@(when type `((prin1 (type-of ,object) ,stream) ,q)) ++;; ,@body ++;; ,@(when identity ++;; (let ((z `(princ (address ,object) ,stream))) ++;; (if (and (not body) type) (list z) (list q z)))) ++;; (princ ">" ,stream) ++;; nil)))) ++ ++;; (defmacro with-compile-file-syntax (&body body) ++;; `(let ((*print-radix* nil) ++;; (*print-base* 10) ++;; (*print-circle* t) ++;; (*print-pretty* nil) ++;; (*print-level* nil) ++;; (*print-length* nil) ++;; (*print-case* :downcase) ++;; (*print-gensym* t) ++;; (*print-array* t) ++;; (*print-package* t) ++;; (*print-structure* t)) ++;; ,@body)) ++ ++(defmacro with-compilation-unit (opt &rest body) ++ (declare (optimize (safety 1))) ++ (declare (ignore opt)) ++ `(progn ,@body)) ++ ++(defconstant char-length 8) ++ ++(defun get-byte-stream-nchars (s) ++ (let* ((tp (stream-element-type s))) ++ (ceiling (if (consp tp) (cadr tp) char-length) char-length))) ++ ++;; (defun parse-integer (s &key start end (radix 10) junk-allowed) ++;; (declare (optimize (safety 1))) ++;; (parse-integer-int s start end radix junk-allowed)) ++ ++(defun write-byte (j s &aux (i j)) ++ (declare (optimize (safety 1))) ++ (check-type j integer) ++ (check-type s stream) ++ (dotimes (k (get-byte-stream-nchars s) j) ++ (write-char (code-char (logand i #.(1- (ash 1 char-length)))) s) ++ (setq i (ash i #.(- char-length))))) ++ ++ ++(defun read-byte (s &optional (eof-error-p t) eof-value &aux (i 0)) ++ (declare (optimize (safety 1))) ++ (check-type s stream) ++ (dotimes (k (get-byte-stream-nchars s) i) ++ (setq i (logior i (ash (let ((ch (read-char s eof-error-p eof-value))) ++ (if (eq ch eof-value) (return ch) (char-code ch))) ++ (* k char-length)))))) ++ ++ ++(defun read-sequence (seq strm &rest r &key (start 0) end ++ &aux (l (listp seq))(seqp (when l (nthcdr start seq))) ++ (cp (eq (stream-element-type strm) 'character))) ++ (declare (optimize (safety 1))(dynamic-extent r)) ++ (check-type seq sequence) ++ (check-type strm stream) ++ (check-type start (integer 0)) ++ (check-type end (or null (integer 0))) ++ (apply 'reduce (lambda (y x &aux (z (if cp (read-char strm nil 'eof) (read-byte strm nil 'eof)))) ++ (declare (seqind y)(ignorable x)) ++ (when (eq z 'eof) (return-from read-sequence y)) ++ (if l (setf (car seqp) z seqp (cdr seqp)) (setf (aref seq y) z)) ++ (1+ y)) seq :initial-value start r)) ++ ++ ++(defun write-sequence (seq strm &rest r &key (start 0) end ++ &aux (l (listp seq))(cp (eq (stream-element-type strm) 'character))) ++ (declare (optimize (safety 1))(dynamic-extent r)) ++ (check-type seq sequence) ++ (check-type strm stream) ++ (check-type start (integer 0)) ++ (check-type end (or null (integer 0))) ++ (apply 'reduce (lambda (y x) ++ (declare (seqind y)) ++ (if cp (write-char x strm) (write-byte x strm)) ++ (1+ y)) seq :initial-value start r) ++ seq) ++ ++(defun restrict-stream-element-type (tp) ++ (cond ((or (member tp '(character :default)) (subtypep tp 'character)) 'character) ++ ((subtypep tp 'integer) ++ (let* ((ntp (car (expand-ranges (normalize-type tp)))) ++ (min (or (cadr ntp) '*))(max (or (caddr ntp) '*)) ++ (s (if (or (eq min '*) (< min 0)) 'signed-byte 'unsigned-byte)) ++ (lim (unless (or (eq min '*) (eq max '*)) (max (integer-length min) (integer-length max)))) ++ (lim (if (and lim (eq s 'signed-byte)) (1+ lim) lim))) ++ (if lim `(,s ,lim) s))) ++ ((check-type tp (member character integer))))) ++ ++(defun open (f &key (direction :input) ++ (element-type 'character) ++ (if-exists nil iesp) ++ (if-does-not-exist nil idnesp) ++ (external-format :default) &aux (pf (pathname f))) ++ (declare (optimize (safety 1))) ++ (check-type f pathname-designator) ++ (when (wild-pathname-p pf) ++ (error 'file-error :pathname pf :format-control "Pathname is wild.")) ++ (let* ((s (open-int (namestring (translate-logical-pathname pf)) direction ++ (restrict-stream-element-type element-type) ++ if-exists iesp if-does-not-exist idnesp external-format))) ++ (when (typep s 'stream) (c-set-stream-object1 s pf) s))) ++ ++(defun load-pathname (p print if-does-not-exist external-format ++ &aux (pp (merge-pathnames p)) ++ (epp (reduce (lambda (y x) (or y (probe-file (translate-pathname x "" p)))) ++ '(#P".o" #P".lsp" #P".lisp" #P"") :initial-value nil)));FIXME newest? ++ (if epp ++ (let* ((*load-pathname* pp)(*load-truename* epp)) ++ (with-open-file ++ (s epp :external-format external-format) ++ (if (member (peek-char nil s nil 'eof) '#.(mapcar 'code-char (list 127 #xfe #xff #x4c))) ++ (load-fasl s print) ++ (let ((*standard-input* s)) (load-stream s print))))) ++ (when if-does-not-exist ++ (error 'file-error :pathname pp :format-control "File does not exist.")))) ++ ++(defun load (p &key (verbose *load-verbose*) (print *load-print*) (if-does-not-exist :error) ++ (external-format :default) &aux (*readtable* *readtable*)(*package* *package*)) ++ (declare (optimize (safety 1))) ++ (check-type p (or stream pathname-designator)) ++ (when verbose (format t ";; Loading ~s~%" p)) ++ (prog1 ++ (typecase p ++ (pathname-designator (load-pathname (pathname p) print if-does-not-exist external-format)) ++ (stream (load-stream p print))) ++ (when verbose (format t ";; Finished loading ~s~%" p)))) ++ + (defun ensure-directories-exist (ps &key verbose &aux created) ++ (declare (optimize (safety 1))) ++ (check-type ps pathname-designator) + (when (wild-pathname-p ps) + (error 'file-error :pathname ps :format-control "Pathname is wild")) +- (labels ((d (x y &aux (z (ldiff x y)) (p (make-pathname :directory z))) ++ (labels ((d (x y &aux (z (ldiff x y)) (n (namestring (make-pathname :directory z)))) + (when (when z (stringp (car (last z)))) +- (unless (eq :directory (car (stat p))) +- (mkdir (namestring p)) ++ (unless (eq :directory (stat n)) ++ (mkdir n) + (setq created t) +- (when verbose (format *standard-output* "Creating directory ~s~%" p)))) ++ (when verbose (format *standard-output* "Creating directory ~s~%" n)))) + (when y (d x (cdr y))))) + (let ((pd (pathname-directory ps))) + (d pd (cdr pd))) + (values ps created))) + +-#.(let ((g '(:host :device :directory :name :type :version))) +- `(defun wild-pathname-p (pd &optional f &aux (p (pathname pd))) +- (declare (optimize (safety 1))) +- (check-type f (or null (member ,@g))) +- (labels ((w-f (x) +- (case x +- ,@(mapcar (lambda (x &aux (f (intern (string-concatenate "PATHNAME-" (string-upcase x))))) +- `(,x ,(if (eq x :directory) `(when (member :wild (,f p)) t) `(eq :wild (,f p))))) g)))) +- (if f +- (w-f f) +- (reduce (lambda (z x) (or z (w-f x))) ',g :initial-value nil))))) +- +-(defun maybe-clear-input (&optional (x *standard-input*)) +- (cond ((not (typep x 'stream)) nil) +- ((typep x 'synonym-stream) (maybe-clear-input (symbol-value (synonym-stream-symbol x)))) +- ((typep x 'two-way-stream) (maybe-clear-input (two-way-stream-input-stream x))) +- ((terminal-input-stream-p x) (clear-input t)))) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_logical_pathname_translations.lsp +@@ -0,0 +1,28 @@ ++(in-package :si) ++ ++(defvar *pathname-logical* nil) ++ ++(defun setf-logical-pathname-translations (v k) ++ (declare (optimize (safety 1))) ++ (check-type v list) ++ (check-type k string) ++ (setf (cdr (or (assoc k *pathname-logical* :test 'string-equal) (car (push (cons k t) *pathname-logical*)))) ;(cons k nil) ++ (mapcar (lambda (x) (list (parse-namestring (car x) k) (parse-namestring (cadr x)))) v))) ++ ++(defsetf logical-pathname-translations (x) (y) `(setf-logical-pathname-translations ,y ,x)) ++(remprop 'logical-pathname-translations 'si::setf-update-fn) ++ ++(defun logical-pathname-translations (k) ++ (declare (optimize (safety 1))) ++ (check-type k string) ++ (cdr (assoc k *pathname-logical* :test 'string-equal))) ++ ++ ++(defun load-logical-pathname-translations (k) ++ (declare (optimize (safety 1))) ++ (unless (logical-pathname-translations k) ++ (error "No translations found for ~s" k))) ++ ++(defun logical-pathname-host-p (host) ++ (when host ++ (logical-pathname-translations host))) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_make_pathname.lsp +@@ -0,0 +1,155 @@ ++(in-package :si) ++ ++;; (defun pathnamep (x) ++;; (declare (optimize (safety 1))) ++;; (when (typep x 'pathname) t)) ++ ++(defun msub (a x) (if a (msub (cdr a) (substitute (caar a) (cdar a) x)) x)) ++ ++(defvar *glob-to-regexp-alist* (list (cons #v"{[^}]*}" (lambda (x) (msub '((#\| . #\,)(#\( . #\{)(#\) . #\})) x))) ++ (cons #v"\\[[^\\]*\\]" (lambda (x) ++ (concatenate 'string "(" ++ (substitute #\^ #\! (subseq x 0 2)) ++ (subseq x 2) ")"))) ++ (cons #v"\\*" (lambda (x) "([^/.]*)")) ++ (cons #v"\\?" (lambda (x) "([^/.])")) ++ (cons #v"\\." (lambda (x) "\\.")))) ++ ++(defun mglist (x &optional (b 0)) ++ (let* ((y (mapcan (lambda (z &aux (w (string-match (car z) x b))) ++ (unless (eql w -1) ++ (list (list w (match-end 0) z)))) ++ *glob-to-regexp-alist*)) ++ (z (when y (reduce (lambda (y x) (if (< (car x) (car y)) x y)) y)))) ++ (when z ++ (cons z (mglist x (cadr z)))))) ++ ++(defun mgsub (x &optional (l (mglist x)) (b 0) &aux (w (pop l))) ++ (if w ++ (concatenate 'string ++ (subseq x b (car w)) ++ (funcall (cdaddr w) (subseq x (car w) (cadr w))) ++ (mgsub x l (cadr w))) ++ (subseq x b))) ++ ++ ++(defun elsub (el x rp lp &aux (y x) (pref (pop y))(dflt (pop y))(post (pop y))) ++; (destructuring-bind (pref dflt post &rest y) x ++ (etypecase el ++ (string (let ((x (list pref el post))) (unless (zerop (length dflt)) (if rp (mapcar 'mgsub x) x)))) ++ (integer (elsub (write-to-string el) x rp lp)) ++ ((eql :wild-inferiors) (if rp (list "(" dflt "*)") (elsub "**" x rp lp))) ++ ((eql :wild) (if rp (list dflt) (elsub "*" x rp lp))) ++ ((eql :newest) (elsub (if rp "(newest|NEWEST)" "NEWEST") x rp lp)) ++ ((member :up :back) (elsub ".." x rp lp)) ++ ((member nil :unspecific) (when rp (list dflt))) ++ (cons (cons ++ (if (eq (car el) :absolute) (if lp "" "/") (if lp ";" "")) ++ (mapcan (lambda (z) (elsub z y rp lp)) (cdr el))))) ++; ) ++) ++ ++(defconstant +physical-pathname-defaults+ '(("" "" "") ++ ("" "" "") ++ ("" "(/?([^/]+/)*)" "" "" "([^/]+/)" "/") ++ ("" "([^/.]*)" "") ++ ("." "(\\.[^/]*)?" "") ++ ("" "" ""))) ++(defconstant +logical-pathname-defaults+ '(("" "([-0-9A-Z]+:)?" ":") ++ ("" "" "") ++ ("" "(;?((\\*?([-0-9A-Z]+\\*?)+|\\*|\\*\\*);)*)" "" "" "((\\*?([-0-9A-Z]+\\*?)+|\\*);)" ";") ++ ("" "(\\*?([-0-9A-Z]+\\*?)+|\\*)?" "") ++ ("." "(\\.(\\*?([-0-9A-Z]+\\*?)+|\\*))?" "") ++ ("." "(\\.([1-9][0-9]*|newest|NEWEST|\\*))?" ""))) ++ ++(defun to-regexp-or-namestring (x rp lp) ++ (apply 'concatenate 'string ++ (mapcan (lambda (x y) (elsub x y rp lp)) ++ x (if lp +logical-pathname-defaults+ +physical-pathname-defaults+)))) ++ ++(defun directory-list-check (l) ++ (when (listp l) ++ (when (member (car l) '(:absolute :relative)) ++ (mapl (lambda (x &aux (c (car x))(d (cadr x))) ++ (when (and (member d '(:up :back)) (member c '(:absolute :wild-inferiors))) ++ (return-from directory-list-check nil))) l)))) ++ ++(defun canonicalize-pathname-directory (l) ++ (cond ((eq l :wild) (canonicalize-pathname-directory '(:absolute :wild-inferiors))) ++ ((stringp l) (canonicalize-pathname-directory (list :absolute l))) ++ ((mapl (lambda (x &aux (c (car x))) ++ (when (and (or (stringp c) (eq c :wild)) (eq (cadr x) :back)) ++ (return-from canonicalize-pathname-directory ++ (canonicalize-pathname-directory (nconc (ldiff l x) (cddr x)))))) l)))) ++ ++(defvar *default-pathname-defaults* (init-pathname nil nil nil nil nil nil "")) ++(declaim (type pathname *default-pathname-defaults*)) ++ ++(defun toggle-case (x) ++ (cond ((symbolp x) x) ++ ((listp x) (mapcar 'toggle-case x)) ++ ((find-if 'upper-case-p x) (if (find-if 'lower-case-p x) x (string-downcase x))) ++ ((find-if 'lower-case-p x) (string-upcase x)) ++ (x))) ++ ++(defun logical-pathname (spec &aux (p (pathname spec))) ++ (declare (optimize (safety 1))) ++ (check-type spec pathname-designator) ++ (check-type p logical-pathname) ++ p) ++ ++(eval-when (compile eval) ++ (defun strsym (p &rest r) ++ (declare (:dynamic-extent r)) ++ (intern (apply 'concatenate 'string (mapcar 'string-upcase r)) p))) ++ ++#.`(defun make-pathname (&key (host nil hostp) (device nil devicep) (directory nil directoryp) ++ (name nil namep) (type nil typep) (version nil versionp) ++ defaults (case :local) namestring &aux defaulted (def (when defaults (pathname defaults)))) ++ (declare (optimize (safety 1))) ++ (check-type host (or (member nil :unspecific) string)) ++ (check-type device (member nil :unspecific)) ++ (check-type directory (or (member nil :unspecific :wild) string list)) ++ (check-type name (or string (member nil :unspecific :wild))) ++ (check-type type (or string (member nil :unspecific :wild))) ++ (check-type version (or (integer 1) (member nil :unspecific :wild :newest))) ++ (check-type defaults (or null pathname-designator)) ++ (check-type case (member :common :local)) ++ ,(flet ((def? (k) `(let* (,@(when (eq k 'host) `((def (or def *default-pathname-defaults*)))) ++ (nk (if ,(strsym :si k "P") ,k (progn (setq defaulted t) (when def (,(strsym :si "C-PATHNAME-" k) def))))) ++ (nk (if (eq case :local) nk (progn (setq defaulted t) (toggle-case nk))))) ++ nk))) ++ `(let* ((h ,(def? 'host)) ++ (h (let ((h1 (when (logical-pathname-host-p h) h))) (unless (eq h h1) (setq defaulted t)) h1)) ++ (dev ,(def? 'device)) ++ (d ,(def? 'directory)) ++ (d (let ((d1 (canonicalize-pathname-directory d))) (unless (eq d d1) (setq defaulted t)) d1)) ++ (n ,(def? 'name)) ++ (typ ,(def? 'type)) ++ (v ,(def? 'version)) ++ (p (init-pathname h dev d n typ v ++ (or (unless defaulted namestring) (to-regexp-or-namestring (list h dev d n typ v) nil h))))) ++ (when h (c-set-t-tt p 1)) ++ (unless (eq d (directory-list-check d)) ++ (error 'file-error :pathname p :format-control "Bad directory list")) ++ p))) ++ ++(macrolet ((pn-accessor (k &aux (f (strsym :si "PATHNAME-" k)) (c (strsym :si "C-PATHNAME-" k))) ++ `(defun ,f (p &key (case :local) &aux (pn (pathname p))) ++ (declare (optimize (safety 1))) ++ (check-type p pathname-designator) ++ (let ((x (,c pn))) (if (eq case :local) x (toggle-case x)))))) ++ (pn-accessor host) ++ (pn-accessor device) ++ (pn-accessor directory) ++ (pn-accessor name) ++ (pn-accessor type) ++ (pn-accessor version)) ++ ++(defconstant +pathname-keys+ '(:host :device :directory :name :type :version)) ++ ++#.`(defun mlp (p) ++ (list ,@(mapcar (lambda (x) `(,(strsym :si "C-PATHNAME-" x) p)) +pathname-keys+))) ++ ++(defun pnl1 (x) (list* (pop x) (pop x) (append (pop x) x))) ++(defun lnp (x) (list* (pop x) (pop x) (let ((q (last x 3))) (cons (ldiff x q) q)))) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_merge_pathnames.lsp +@@ -0,0 +1,18 @@ ++(in-package :si) ++ ++(defun merge-pathnames (p &optional (def *default-pathname-defaults*) (def-v :newest) ++ &aux dflt (pn (pathname p))(def-pn (pathname def))) ++ (declare (optimize (safety 1))) ++ (check-type p pathname-designator) ++ (check-type def pathname-designator) ++ (check-type def-v (or null (eql :newest) seqind)) ++ (labels ((def (x) (when x (setq dflt t) x))) ++ (make-pathname ++ :host (or (pathname-host pn) (def (pathname-host def-pn))) ++ :device (or (pathname-device pn) (def (pathname-device def-pn))) ++ :directory (let ((d (pathname-directory pn))(defd (pathname-directory def-pn))) ++ (or (def (when (and defd (eq (car d) :relative)) (append defd (cdr d)))) d (def defd))) ++ :name (or (pathname-name pn) (def (pathname-name def-pn))) ++ :type (or (pathname-type pn) (def (pathname-type def-pn))) ++ :version (or (pathname-version pn) (def (unless (pathname-name pn) (pathname-version def-pn))) (def def-v)) ++ :version (unless dflt (return-from merge-pathnames pn))))) +--- gcl-2.6.12.orig/lsp/gcl_mislib.lsp ++++ gcl-2.6.12/lsp/gcl_mislib.lsp +@@ -114,13 +114,15 @@ + (* (+ h tz) 3600) (* min 60) sec)) + + (defun compile-file-pathname (pathname) +-(make-pathname :defaults pathname :type "o")) ++ (make-pathname :defaults pathname :type "o")) ++ + (defun constantly (x) +-#'(lambda (&rest args) ++ (lambda (&rest args) + (declare (ignore args) (:dynamic-extent args)) +-x)) ++ x)) ++ + (defun complement (fn) +-#'(lambda (&rest args) (not (apply fn args)))) ++ (lambda (&rest args) (not (apply fn args)))) + + (defun default-system-banner () + (let (gpled-modules) +--- gcl-2.6.12.orig/lsp/gcl_module.lsp ++++ gcl-2.6.12/lsp/gcl_module.lsp +@@ -40,13 +40,13 @@ + + (defun require (module-name + &optional (pathname (string-downcase (string module-name)))) +- (let ((*default-pathname-defaults* #"")) ++ (let ((*default-pathname-defaults* (make-pathname))) + (unless (member (string module-name) + *modules* + :test #'string=) + (if (atom pathname) + (load pathname) +- (do ((p pathname (cdr p))) ++ (do ((p pathname (cdr p))) + ((endp p)) + (load (car p))))))) + +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_namestring.lsp +@@ -0,0 +1,39 @@ ++(in-package :si) ++ ++(defun namestring (x) ++ (declare (optimize (safety 1))) ++ (check-type x pathname-designator) ++ (typecase x ++ (string x) ++ (pathname (c-pathname-namestring x)) ++ (stream (namestring (c-stream-object1 x))))) ++ ++(defun file-namestring (x &aux (px (pathname x))) ++ (declare (optimize (safety 1))) ++ (check-type x pathname-designator) ++ (namestring (make-pathname :name (pathname-name px) :type (pathname-type px) :version (pathname-version px)))) ++ ++(defun directory-namestring (x &aux (px (pathname x))) ++ (declare (optimize (safety 1))) ++ (check-type x pathname-designator) ++ (namestring (make-pathname :directory (pathname-directory px)))) ++ ++(defun host-namestring (x &aux (px (pathname x))) ++ (declare (optimize (safety 1))) ++ (check-type x pathname-designator) ++ (or (pathname-host px) "")) ++ ++#.`(defun enough-namestring (x &optional (def *default-pathname-defaults*) &aux (px (pathname x))(pdef (pathname def))) ++ (declare (optimize (safety 1))) ++ (check-type x pathname-designator) ++ (check-type def pathname-designator) ++ ,(labels ((new? (k &aux (f (intern (concatenate 'string "PATHNAME-" (string k)) :si))) ++ `(let ((k (,f px))) (unless (equal k (,f pdef)) k)))) ++ `(namestring (make-pathname ++ ,@(mapcan (lambda (x) (list x (new? x))) +pathname-keys+))))) ++ ++(defun faslink (file name &aux (pfile (namestring (merge-pathnames (make-pathname :type "o") (pathname file))))(*package* *package*));FIXME ++ (declare (optimize (safety 1))) ++ (check-type file pathname-designator) ++ (check-type name string) ++ (faslink-int pfile name)) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_parse_namestring.lsp +@@ -0,0 +1,139 @@ ++(in-package :si) ++ ++(deftype seqind nil `fixnum) ++ ++(defun match-beginning (i &aux (v *match-data*)) ++ (declare ((vector fixnum) v)(seqind i)) ++ (the (or (integer -1 -1 ) seqind) (aref v i))) ++(defun match-end (i &aux (v *match-data*)) ++ (declare ((vector fixnum) v)(seqind i)) ++ (the (or (integer -1 -1 ) seqind) (aref v (+ i (ash (length v) -1))))) ++ ++(declaim (inline match-beginning match-end)) ++ ++(defun dir-conj (x) (if (eq x :relative) :absolute :relative)) ++ ++(defvar *up-key* :up) ++ ++(defun mfr (x b i) (subseq x b i)); (make-array (- i b) :element-type 'character :displaced-to x :displaced-index-offset b) ++ ++(defvar *sym-sub-alist* '((:host . nil) ++ (:device . nil) ++ (:directory . (("." . nil)(".." . :up)("*" . :wild)("**" . :wild-inferiors))) ++ (:name . (("*" . :wild))) ++ (:type . (("*" . :wild))) ++ (:version . (("*" . :wild)("NEWEST" . :newest))))) ++ ++(defun element (x b i key) ++ (let* ((z (when (> i b) (mfr x b i))) ++ (w (assoc z (cdr (assoc key *sym-sub-alist*)) :test 'string-equal)) ++ (z (if w (cdr w) z))) ++ (if (eq z :up) *up-key* z))) ++ ++(defun dir-parse (x sep sepfirst &optional (b 0)) ++ (when (stringp x) ++ (let ((i (search sep x :start2 b)));string-match spoils outer match results ++ (when i ++ (let* ((y (dir-parse x sep sepfirst (1+ i))) ++ (z (element x b i :directory)) ++ (y (if z (cons z y) y))) ++ (if (zerop b) ++ (cons (if (zerop i) sepfirst (dir-conj sepfirst)) y) ++ y)))))) ++ ++(defun match-component (x i k &optional (boff 0) (eoff 0)) ++ (element x (+ (match-beginning i) boff) (+ (match-end i) eoff) k)) ++ ++(defun version-parse (x) ++ (typecase x ++ (string (version-parse (parse-integer x))) ++; (integer (locally (check-type x (integer 1)) x)) ++ (otherwise x))) ++ ++(defconstant +generic-logical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +logical-pathname-defaults+)) t t))) ++ ++(defun expand-home-dir (dir) ++ (cond ((and (eq (car dir) :relative) (stringp (cadr dir)) (eql #\~ (aref (cadr dir) 0))) ++ (append (dir-parse (home-namestring (cadr dir)) "/" :absolute) (cddr dir))) ++ (dir))) ++ ++(defun logical-pathname-parse (x &optional host def (b 0) (e (length x))) ++ (when (and (eql b (string-match +generic-logical-pathname-regexp+ x b e)) (eql (match-end 0) e)) ++ (let ((mhost (match-component x 1 :host 0 -1))) ++ (when (and host mhost) ++ (unless (string-equal host mhost) ++ (error 'error :format-control "Host part of ~s does not match ~s" :format-arguments (list x host)))) ++ (let ((host (or host mhost (pathname-host def)))) ++ (when (logical-pathname-host-p host) ++ (let* ((dir (dir-parse (match-component x 2 :none) ";" :relative)) ++ (edir (expand-home-dir dir))) ++ (make-pathname :host host ++ :device :unspecific ++ :directory edir ++ :name (match-component x 6 :name) ++ :type (match-component x 8 :type 1) ++ :version (version-parse (match-component x 11 :version 1)) ++ :namestring (when (and mhost (eql b 0) (eql e (length x)) (eq dir edir)) x)))))))) ++ ++(defconstant +generic-physical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +physical-pathname-defaults+)) t nil))) ++ ++(defun pathname-parse (x b e) ++ (when (and (eql b (string-match +generic-physical-pathname-regexp+ x b e)) (eql (match-end 0) e)) ++ (let* ((dir (dir-parse (match-component x 1 :none) "/" :absolute)) ++ (edir (expand-home-dir dir))) ++ (make-pathname :directory edir ++ :name (match-component x 3 :name) ++ :type (match-component x 4 :type 1) ++ :namestring (when (and (eql b 0) (eql e (length x)) (eq dir edir)) x))))) ++ ++ ++(defun path-stream-name (x) ++ (check-type x pathname-designator) ++ (typecase x ++ (synonym-stream (path-stream-name (symbol-value (synonym-stream-symbol x)))) ++ (stream (path-stream-name (c-stream-object1 x))) ++ (otherwise x))) ++ ++(defun parse-namestring (thing &optional host (default-pathname *default-pathname-defaults*) &rest r &key (start 0) end junk-allowed) ++ (declare (optimize (safety 1))(dynamic-extent r)) ++ (check-type thing pathname-designator) ++ (check-type host (or null (satisfies logical-pathname-translations))) ++ (check-type default-pathname pathname-designator) ++ (check-type start seqind) ++ (check-type end (or null seqind)) ++ ++ (typecase thing ++ (string (let* ((e (or end (length thing))) ++ (l (logical-pathname-parse thing host default-pathname start e)) ++ (l (or l (unless host (pathname-parse thing start e))))) ++ (cond (junk-allowed (values l (max 0 (match-end 0)))) ++ (l (values l e)) ++ ((error 'parse-error :format-control "~s is not a valid pathname on host ~s" :format-arguments (list thing host)))))) ++ (stream (apply 'parse-namestring (path-stream-name thing) host default-pathname r)) ++ (pathname ++ (when host ++ (unless (string-equal host (pathname-host thing)) ++ (error 'file-error :pathname thing :format-control "Host does not match ~s" :format-arguments (list host)))) ++ (values thing start)))) ++ ++(defun pathname (spec) ++ (declare (optimize (safety 1))) ++ (check-type spec pathname-designator) ++ (if (typep spec 'pathname) spec (values (parse-namestring spec)))) ++ ++(defun sharp-p-reader (stream subchar arg) ++ (declare (ignore subchar arg)) ++ (let ((x (parse-namestring (read stream)))) x)) ++ ++(defun sharp-dq-reader (stream subchar arg);FIXME arg && read-suppress ++ (declare (ignore subchar arg)) ++ (unread-char #\" stream) ++ (let ((x (parse-namestring (read stream)))) x)) ++ ++(set-dispatch-macro-character #\# #\p 'sharp-p-reader) ++(set-dispatch-macro-character #\# #\p 'sharp-p-reader (standard-readtable)) ++(set-dispatch-macro-character #\# #\P 'sharp-p-reader) ++(set-dispatch-macro-character #\# #\P 'sharp-p-reader (standard-readtable)) ++(set-dispatch-macro-character #\# #\" 'sharp-dq-reader) ++(set-dispatch-macro-character #\# #\" 'sharp-dq-reader (standard-readtable)) ++ +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_pathname_match_p.lsp +@@ -0,0 +1,14 @@ ++(in-package :si) ++ ++(defun to-regexp (x &optional (rp t) &aux (px (pathname x))(lp (typep px 'logical-pathname))) ++ (to-regexp-or-namestring (mlp px) rp lp)) ++ ++(deftype compiled-regexp nil `(vector unsigned-char)) ++ ++(defun pathname-match-p (p w &aux (s (namestring p))) ++ (declare (optimize (safety 1))) ++ (check-type p pathname-designator) ++ (check-type w (or compiled-regexp pathname-designator)) ++ (and (zerop (string-match (if (typep w 'compiled-regexp) w (to-regexp w)) s)) ++ (eql (match-end 0) (length s)))) ++ +--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp ++++ gcl-2.6.12/lsp/gcl_predlib.lsp +@@ -110,6 +110,7 @@ + (not (array-has-fill-pointer-p x)) + (not (si:displaced-array-p x)))) + ++(defun logical-pathnamep (x) (when (pathnamep x) (eql (c-t-tt x) 1))) + + (do ((l '((null . null) + (symbol . symbolp) +@@ -124,7 +125,15 @@ + (character . characterp) + (package . packagep) + (stream . streamp) ++ (file-stream . file-stream-p) ++ (synonym-stream . synonym-stream-p) ++ (broadcast-stream . broadcast-stream-p) ++ (concatenated-stream . concatenated-stream-p) ++ (two-way-stream . two-way-stream-p) ++ (echo-stream . echo-stream-p) + (pathname . pathnamep) ++ (pathname-designator . pathname-designatorp) ++ (logical-pathname . logical-pathnamep) + (readtable . readtablep) + (hash-table . hash-table-p) + (random-state . random-state-p) +@@ -196,6 +205,8 @@ + ((null l) t) + (unless (typep object (car l)) (return nil)))) + (satisfies (funcall (car i) object)) ++ (eql (eql (car i) object)) ++ (member (member object i)) + ((t) t) + ((nil) nil) + (boolean (or (eq object 't) (eq object 'nil))) +@@ -280,6 +291,40 @@ + (typep object (apply tem i))))))) + + ++ ++(defun minmax (i1 i2 low-p e &aux (fn (if low-p (if e '< '>) (if e '> '<)))) ++ (cond ((eq i1 '*) (if e i1 i2)) ++ ((eq i2 '*) (if e i2 i1)) ++ ((funcall fn i1 i2) i1) ++ (i2))) ++ ++(defun expand-range (low high bottom top) ++ (let ((low (minmax low bottom t t))(high (minmax high top nil t))) ++ (when (or (eq low '*) (eq high '*) (<= low high)) (list low high)))) ++ ++(defun nc (tp) ++ (when (consp tp) ++ (case (car tp) ++ ;; (immfix (let ((m (cadr tp))(x (caddr tp)) ++ ;; (list (list 'integer (if (eq m '*) most-negative-immfix m) (if (eq x '*) most-positive-immfix x))))) ++ ;; (bfix (let* ((m (cadr tp))(x (caddr tp))(m (if (eq m '*) most-negative-fixnum m))(x (if (eq x '*) most-positive-fixnum x))) ++ ;; (if (< (* m x) 0) ++ ;; `((integer ,m ,(1- most-negative-immfix))(integer ,(1+ most-positive-immfix) ,x)) ++ ;; `((integer ,m ,x))))) ++ ;; (bignum (let* ((m (cadr tp))(x (caddr tp))(sm (or (eq m '*) (< m 0)))(sx (or (eq x '*) (>= x 0)))) ++ ;; (if (and sm sx) ++ ;; `((integer ,m ,(1- most-negative-fixnum))(integer ,(1+ most-positive-fixnum) ,x)) ++ ;; `((integer ,m ,x))))) ++ ((integer ratio short-float long-float) (list tp)) ++ (otherwise (append (nc (car tp)) (nc (cdr tp))))))) ++ ++ ++(defun expand-ranges (type) ++ (reduce (lambda (y x &aux (z (assoc (car x) y))) ++ (if z (subst (cons (car z) (apply 'expand-range (cadr x) (caddr x) (cdr z))) z y) ++ (cons x y))) (nc type) :initial-value nil)) ++ ++ + ;;; NORMALIZE-TYPE normalizes the type using the DEFTYPE definitions. + ;;; The result is always a list. + (defun normalize-type (type &aux tp i ) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_rename_file.lsp +@@ -0,0 +1,47 @@ ++(in-package :si) ++ ++(defun set-path-stream-name (x y) ++ (check-type x pathname-designator) ++ (typecase x ++ (synonym-stream (set-path-stream-name (symbol-value (synonym-stream-symbol x)) y)) ++ (stream (c-set-stream-object1 x y)))) ++ ++(defun rename-file (f n &aux (pf (pathname f))(pn (merge-pathnames n pf nil)) ++ (tpf (truename pf))(nf (namestring tpf)) ++ (tpn (translate-logical-pathname pn))(nn (namestring tpn))) ++ (declare (optimize (safety 1))) ++ (check-type f pathname-designator) ++ (check-type n (and pathname-designator (not stream))) ++ (unless (rename nf nn) ++ (error 'file-error :pathname pf :format-control "Cannot rename ~s to ~s." :format-arguments (list nf nn))) ++ (set-path-stream-name f pn) ++ (values pn tpf (truename tpn))) ++ ++(defun user-homedir-pathname (&optional (host :unspecific hostp)) ++ (declare (optimize (safety 1))) ++ (check-type host (or string list (eql :unspecific))) ++ (unless hostp ++ (pathname (home-namestring "~")))) ++ ++(defun delete-file (f &aux (pf (truename f))(nf (namestring pf))) ++ (declare (optimize (safety 1))) ++ (check-type f pathname-designator) ++ (unless (if (eq :directory (stat nf)) (rmdir nf) (unlink nf)) ++ (error 'file-error :pathname (pathname nf) :format-control "Cannot delete pathname.")) ++ t) ++ ++(defun file-write-date (spec) ++ (declare (optimize (safety 1))) ++ (check-type spec pathname-designator) ++ (multiple-value-bind ++ (tp sz tm) (stat (namestring (truename spec))) ++ (+ tm (* (+ 17 (* 70 365)) (* 24 60 60))))) ++ ++ ++(defun file-author (spec) ++ (declare (optimize (safety 1))) ++ (check-type spec pathname-designator) ++ (multiple-value-bind ++ (tp sz tm uid) (stat (namestring (truename spec))) ++ (uid-to-name uid))) ++ +--- gcl-2.6.12.orig/lsp/gcl_sharp.lsp ++++ gcl-2.6.12/lsp/gcl_sharp.lsp +@@ -61,4 +61,6 @@ + (otherwise x))) + + (set-dispatch-macro-character #\# #\= #'sharp-eq-reader) ++(set-dispatch-macro-character #\# #\= #'sharp-eq-reader (standard-readtable)) + (set-dispatch-macro-character #\# #\# #'sharp-sharp-reader) ++(set-dispatch-macro-character #\# #\# #'sharp-sharp-reader (standard-readtable)) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_sharp_uv.lsp +@@ -0,0 +1,29 @@ ++(in-package :si) ++ ++(defun regexp-conv (stream) ++ ++ (let ((tem (make-array 10 :element-type 'character :fill-pointer 0))) ++ (or (eql (read-char stream) #\") ++ (error "sharp-u-reader reader needs a \" right after it")) ++ (loop ++ (let ((ch (read-char stream))) ++ (cond ((eql ch #\") (return tem)) ++ ((eql ch #\\) ++ (setq ch (read-char stream)) ++ (setq ch (or (cdr (assoc ch '((#\n . #\newline) ++ (#\t . #\tab) ++ (#\r . #\return)))) ++ ch)))) ++ (vector-push-extend ch tem))) ++ tem)) ++ ++(defun sharp-u-reader (stream subchar arg) ++ (declare (ignore subchar arg)) ++ (regexp-conv stream)) ++ ++(defun sharp-v-reader (stream subchar arg) ++ (declare (ignore subchar arg)) ++ `(load-time-value (compile-regexp ,(regexp-conv stream)))) ++ ++(set-dispatch-macro-character #\# #\u 'sharp-u-reader) ++(set-dispatch-macro-character #\# #\v 'sharp-v-reader) +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -83,7 +83,7 @@ + (progn + (cond + (*multiply-stacks* (setq *multiply-stacks* nil)) +- ((probe-file "init.lsp") (load "init.lsp")))) ++ ((when (fboundp 'probe-file) (probe-file "init.lsp")) (load "init.lsp")))) + (when (if (symbolp *top-level-hook*) (fboundp *top-level-hook*) (functionp *top-level-hook*)) + (funcall *top-level-hook*))) + +@@ -122,6 +122,8 @@ + + (defvar *error-p* nil) + ++(defvar *lib-directory* nil) ++ + (defun process-some-args (args &optional compile &aux *load-verbose*) + (when args + (let ((x (pop args))) +@@ -148,7 +150,7 @@ + (file (cdr (assoc :compile compile))) + (o (cdr (assoc :o compile))) + (compile (remove :o (remove :compile compile :key 'car) :key 'car)) +- (compile (cons (cons :output-file (or o file)) compile)) +++ (compile (cons (cons :output-file (or o (merge-pathnames ".o" file))) compile)) + (result (system:error-set `(apply 'compile-file ,file ',(mapcan (lambda (x) (list (car x) (cdr x))) compile))))) + (bye (if (or *error-p* (equal result '(nil))) 1 0))))) + +@@ -520,15 +522,12 @@ add a new one, add a 'si::break-command + + ;;make sure '/' terminated + +-(defun coerce-slash-terminated (v ) +- (declare (string v)) +- (or (stringp v) (error "not a string ~a" v)) ++(defun coerce-slash-terminated (v) + (let ((n (length v))) +- (declare (fixnum n)) +- (unless (and (> n 0) (eql +- (the character(aref v (the fixnum (- n 1)))) #\/)) +- (setf v (format nil "~a/" v)))) +- v) ++ (if (and (> n 0) (eql (aref v (1- n)) #\/)) ++ v ++ (string-concatenate v "/")))) ++ + (defun fix-load-path (l) + (when (not (equal l *fixed-load-path*)) + (do ((x l (cdr x)) ) +@@ -587,19 +586,17 @@ First directory is checked for first nam + (when (and s (symbol-value s)) + (list *system-directory*)))) + +- +-(defun get-temp-dir nil +- (dolist (x `(,@(wine-tmp-redirect) ,@(mapcar 'getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" "")) +- (when (or (stringp x) (pathnamep x)) +- (let* ((x (truename (pathname x))) +- (y (namestring (make-pathname :name (pathname-name x) :type (pathname-type x) :version (pathname-version x)))) +- (y (unless (zerop (length y)) (list y)))) +- (when (eq :directory (car (stat x))) +- (return-from get-temp-dir +- (namestring +- (make-pathname +- :device (pathname-device x) +- :directory (append (pathname-directory x) y))))))))) ++(defun ensure-dir-string (str) ++ (if (eq (stat str) :directory) ++ (coerce-slash-terminated str) ++ str)) ++ ++(defun get-temp-dir () ++ (dolist (x `(,@(wine-tmp-redirect) ,@(mapcar 'si::getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" "")) ++ (when x ++ (let ((x (coerce-slash-terminated x))) ++ (when (eq (stat x) :directory) ++ (return-from get-temp-dir x)))))) + + (defun get-path (s &aux (m (string-match "([^/ ]*)( |$)" s))(b (match-beginning 1))(e (match-end 1)) + (r (with-open-file (s (concatenate 'string "|which " (subseq s b e))) (read s nil 'eof)))) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_translate_pathname.lsp +@@ -0,0 +1,90 @@ ++(in-package :si) ++ ++(defun lenel (x lp) ++ (case x (:wild 1)(:wild-inferiors 2)(:absolute (if lp -1 0))(:relative (if lp 0 -1)) ++ ((:unspecific nil :newest) -1)(otherwise (length x)))) ++ ++(defun next-match (&optional (i 1) (k -1) (m (1- (ash (length *match-data*) -1)))) ++ (cond ((< k (match-beginning i) (match-end i)) i) ++ ((< i m) (next-match (1+ i) k m)) ++ (i))) ++ ++(defun mme2 (s lel lp &optional (b 0) (i (next-match)) r el ++ &aux (e (+ b (lenel (car lel) lp)))(j (match-beginning i))(k (match-end i))) ++ (cond ++ ((< (- b 2) j k (+ e 2)) ++ (let* ((z (car lel))(b1 (max b j))(e1 (min k e)) ++ (z (if (or (< b b1) (< e1 e)) (subseq z (- b1 b) (- e1 b)) z)) ++ (r (if el r (cons nil r)))) ++ (mme2 s lel lp b (next-match i k) (cons (cons z (car r)) (cdr r)) (or el (car lel))))) ++ ((< (1- j) b e (1+ k)) ++ (let ((r (if el r (cons nil r)))) ++ (mme2 s (cdr lel) lp (1+ e) i (cons (cons (car lel) (car r)) (cdr r)) (or el (list (car lel)))))) ++ ((consp el) ++ (let* ((cr (nreverse (car r)))) ++ (mme2 s lel lp b (next-match i k) (cons (cons (car el) (list cr)) (cdr r))))) ++ (el ++ (let* ((cr (nreverse (car r)))) ++ (mme2 s (cdr lel) lp (1+ e) i (cons (cons el cr) (cdr r))))) ++ (lel (mme2 s (cdr lel) lp (1+ e) i (cons (car lel) r))) ++ ((nreverse r)))) ++ ++(defun do-repl (x y) ++ (labels ((r (x l &optional (b 0) &aux (f (string-match #v"\\*" x b))) ++ (if (eql f -1) (if (eql b 0) x (subseq x b)) ++ (concatenate 'string (subseq x b f) (or (car l) "") (r x (cdr l) (1+ f)))))) ++ (r y x))) ++ ++(defun dir-p (x) (when (consp x) (member (car x) '(:absolute :relative)))) ++ ++(defun source-portion (x y) ++ (cond ++ ((or (dir-p x) (dir-p y)) ++ (mapcan (lambda (z &aux (w (source-portion ++ (if y (when (wild-dir-element-p z) (setf x (member-if 'listp x)) (pop x)) z) ++ (when y z)))) ++ (if (listp w) w (list w))) (or y x))) ++ ((if y (eq y :wild-inferiors) t) (if (listp x) (if (listp (cadr x)) (cadr x) (car x)) x));(or y) ++ ((eq y :wild) (if (listp x) (car x) x));(or y) ++ ((stringp y) (do-repl (when (listp x) (unless (listp (cadr x)) (cdr x))) y)) ++ (y))) ++ ++(defun list-toggle-case (x f) ++ (typecase x ++ (string (funcall f x)) ++ (cons (mapcar (lambda (x) (list-toggle-case x f)) x)) ++ (otherwise x))) ++ ++(defun mme3 (sx px flp tlp) ++ (list-toggle-case ++ (lnp (mme2 sx (pnl1 (mlp px)) flp)) ++ (cond ((eq flp tlp) 'identity) ++ (flp 'string-downcase) ++ (tlp 'string-upcase)))) ++ ++(defun translate-pathname (source from to &key ++ &aux (psource (pathname source)) ++ (pto (pathname to)) ++ (match (pathname-match-p source from))) ++ (declare (optimize (safety 1))) ++ (check-type source pathname-designator) ++ (check-type from pathname-designator) ++ (check-type to pathname-designator) ++ (check-type match (not null)) ++ (apply 'make-pathname :host (pathname-host pto) :device (pathname-device pto) ++ (mapcan 'list +pathname-keys+ ++ (mapcar 'source-portion ++ (mme3 (namestring source) psource (typep psource 'logical-pathname) (typep pto 'logical-pathname)) ++ (mlp pto))))) ++ ++(defun translate-logical-pathname (spec &key &aux (p (pathname spec))) ++ (declare (optimize (safety 1))) ++ (check-type spec pathname-designator) ++ (typecase p ++ (logical-pathname ++ (let ((rules (assoc p (logical-pathname-translations (pathname-host p)) :test 'pathname-match-p))) ++ (unless rules ++ (error 'file-error :pathname p :format-control "No matching translations")) ++ (translate-logical-pathname (apply 'translate-pathname p rules)))) ++ (otherwise p))) ++ +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_truename.lsp +@@ -0,0 +1,43 @@ ++(in-package :si) ++ ++(defun link-expand (str &optional (b 0) (n (length str)) fr) ++ (labels ((frame (b e) (make-array (- n b) :element-type 'character ++ :displaced-to str :displaced-index-offset b :fill-pointer (- e b))) ++ (set-fr (fr e &aux (fr (or fr (frame 0 b)))) (setf (fill-pointer fr) e) fr)) ++ (let* ((i (string-match #v"/" str b)) ++ (fr (set-fr fr (if (eql i -1) n i))) ++ (l (when (eq (stat fr) :link) (readlinkat 0 fr)))) ++ (cond (l (let ((b (if (eql #\/ (aref l 0)) 0 b))) ++ (link-expand (concatenate 'string (set-fr fr b) l (frame (if (eql i -1) n i) n)) b))) ++ ((eql i -1) str) ++ ((link-expand str (1+ i) n fr)))))) ++ ++(defun logical-pathname-designator-p (x) ++ (typecase x ++ (string (logical-pathname-parse x)) ++ (pathname (typep x 'logical-pathname)) ++ (stream (logical-pathname-designator-p (pathname x))))) ++ ++;(defvar *current-dir* (pathname (concatenate 'string (getcwd) "/"))) FIXME sync with chdir ++ ++(defun truename (pd &aux (ppd (translate-logical-pathname pd))(ns (namestring ppd))) ++ (declare (optimize (safety 1))) ++ (check-type pd pathname-designator) ++ (when (wild-pathname-p ns) ++ (error 'file-error :pathname pd :format-control "Pathname is wild")) ++ (let* ((ns (ensure-dir-string (link-expand ns)))) ++ (unless (or (zerop (length ns)) (stat ns)) ++ (error 'file-error :pathname ns :format-control "Pathname does not exist")) ++ (let* ((d (pathname-directory ppd)) ++ (d1 (subst :back :up d)) ++ (ppd (if (eq d d1) ppd (make-pathname :directory d1 :defaults ppd)))) ++ (if (eq (car d) :absolute) ppd (merge-pathnames ppd (concatenate 'string (getcwd) "/") nil))))) ++ ++ ++(defun probe-file (pd &aux (pn (translate-logical-pathname pd))) ++ (declare (optimize (safety 1))) ++ (check-type pd pathname-designator) ++ (when (wild-pathname-p pn) ++ (error 'file-error :pathname pn :format-control "Pathname is wild")) ++ (when (eq (stat (namestring pn)) :file) ++ (truename pn))) +--- /dev/null ++++ gcl-2.6.12/lsp/gcl_wild_pathname_p.lsp +@@ -0,0 +1,28 @@ ++(in-package :si) ++ ++(defun wild-namestring-p (x) ++ (when (stringp x) (>= (string-match #v"(\\*|\\?|\\[|\\{)" x) 0))) ++ ++(defun wild-dir-element-p (x) ++ (or (eq x :wild) (eq x :wild-inferiors) (wild-namestring-p x))) ++ ++(defun wild-path-element-p (x) ++ (or (eq x :wild) (wild-namestring-p x))) ++ ++#.`(defun wild-pathname-p (pd &optional f) ++ (declare (optimize (safety 1))) ++ (check-type pd pathname-designator) ++ (check-type f (or null (member ,@+pathname-keys+))) ++ (case f ++ ((nil) (or (wild-namestring-p (namestring pd)) ++ (when (typep pd 'pathname);FIXME stream ++ (eq :wild (pathname-version pd))))) ++ ;; ((nil) (if (stringp pd) (wild-namestring-p pd) ++ ;; (let ((p (pathname pd))) ++ ;; (when (member-if (lambda (x) (wild-pathname-p p x)) +pathname-keys+) t)))) ++ ((:host :device) nil) ++ (:directory (when (member-if 'wild-dir-element-p (pathname-directory pd)) t)) ++ (:name (wild-path-element-p (pathname-name pd))) ++ (:type (wild-path-element-p (pathname-type pd))) ++ (:version (wild-path-element-p (pathname-version pd))))) ++ +--- gcl-2.6.12.orig/lsp/makefile ++++ gcl-2.6.12/lsp/makefile +@@ -13,9 +13,12 @@ OBJS = gcl_sharp.o gcl_arraylib.o gcl_as + gcl_describe.o gcl_evalmacros.o gcl_fpe.o \ + gcl_iolib.o gcl_listlib.o gcl_mislib.o gcl_module.o gcl_numlib.o \ + gcl_packlib.o gcl_predlib.o \ ++ gcl_parse_namestring.o gcl_make_pathname.o gcl_namestring.o gcl_translate_pathname.o\ ++ gcl_logical_pathname_translations.o gcl_directory.o gcl_merge_pathnames.o gcl_truename.o gcl_sharp_uv.o\ + gcl_seq.o gcl_seqlib.o gcl_setf.o gcl_top.o gcl_trace.o gcl_sloop.o \ + gcl_debug.o gcl_info.o gcl_serror.o gcl_restart.o \ +- gcl_destructuring_bind.o gcl_defpackage.o gcl_make_defpackage.o gcl_loop.o $(EXTRA_LOBJS) ++ gcl_rename_file.o gcl_pathname_match_p.o gcl_wild_pathname_p.o \ ++ gcl_destructuring_bind.o gcl_defpackage.o gcl_make_defpackage.o gcl_loop.o $(EXTRA_LOBJS) + # export.o autoload.o auto_new.o + + LISP=$(PORTDIR)/saved_pre_gcl$(EXE) +--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp ++++ gcl-2.6.12/lsp/sys-proclaim.lisp +@@ -2,361 +2,223 @@ + (COMMON-LISP::IN-PACKAGE "SYSTEM") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- ANSI-LOOP::LOOP-EMIT-FINAL-VALUE SYSTEM::INSPECT-CHARACTER +- SYSTEM::INSPECT-STRUCTURE SYSTEM::PRINT-IHS SYSTEM::DBL-RPL-LOOP +- SYSTEM::RESTART-FUNCTION COMMON-LISP::TANH COMMON-LISP::FIFTH +- SLOOP::PARSE-LOOP-INITIALLY SYSTEM::NEXT-STACK-FRAME +- SYSTEM::IDESCRIBE SYSTEM::PROCESS-ARGS SYSTEM::LEAP-YEAR-P +- SLOOP::AVERAGING-SLOOP-MACRO SYSTEM::FIX-LOAD-PATH +- SLOOP::SUBSTITUTE-SLOOP-BODY SYSTEM::RESTART-REPORT-FUNCTION +- COMMON-LISP::NINTH SLOOP::SLOOP-SLOOP-MACRO +- SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::FREEZE-DEFSTRUCT +- COMMON-LISP::EIGHTH SYSTEM::FIND-DOCUMENTATION +- ANSI-LOOP::LOOP-PSEUDO-BODY COMMON-LISP::RATIONAL +- ANSI-LOOP::LOOP-EMIT-BODY COMMON-LISP::ASIN +- COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::S-DATA-P +- SYSTEM::BKPT-FUNCTION SYSTEM::TRACE-ONE-PREPROCESS +- COMMON-LISP::LOGNOT SYSTEM::SIMPLE-ARRAY-P SYSTEM::BKPT-FILE +- SYSTEM::S-DATA-STATICP COMMON-LISP::ISQRT SYSTEM::INSTREAM-P +- COMMON-LISP::SEVENTH SYSTEM::S-DATA-NAMED +- ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::INSPECT-NUMBER +- COMMON-LISP::ATANH SYSTEM::RESTART-TEST-FUNCTION +- SYSTEM::S-DATA-INCLUDES SYSTEM::S-DATA-HAS-HOLES +- SYSTEM::CONTEXT-VEC FPE::XMM-LOOKUP SYSTEM::S-DATA-RAW +- ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS +- SYSTEM::RESTART-INTERACTIVE-FUNCTION +- ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS +- ANSI-LOOP::LOOP-COLLECTOR-NAME ANSI-LOOP::LOOP-PATH-NAMES +- ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE +- SYSTEM::S-DATA-INCLUDED SYSTEM::S-DATA-SLOT-DESCRIPTIONS +- SYSTEM::S-DATA-OFFSET SLOOP::REPEAT-SLOOP-MACRO +- SYSTEM::S-DATA-PRINT-FUNCTION ANSI-LOOP::LOOP-PATH-USER-DATA +- COMMON-LISP::FIND-ALL-SYMBOLS COMMON-LISP::FIRST +- SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::BKPT-FORM +- SYSTEM::NODES-FROM-INDEX SYSTEM::INSPECT-SYMBOL +- SYSTEM::KNOWN-TYPE-P ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE +- SYSTEM::MAKE-DEFPACKAGE-FORM COMMON-LISP::ARRAY-DIMENSIONS +- SYSTEM::INSERT-BREAK-POINT SLOOP::PARSE-LOOP +- ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED +- ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS SYSTEM::SHORT-NAME +- SYSTEM::CHECK-TRACE-SPEC ANSI-LOOP::DESTRUCTURING-SIZE +- SYSTEM::BEST-ARRAY-ELEMENT-TYPE SYSTEM::CONTEXT-HASH +- COMMON-LISP::SIXTH SYSTEM::IHS-VISIBLE SYSTEM::INSPECT-ARRAY +- COMMON-LISP::BYTE-SIZE ANSI-LOOP::LOOP-COLLECTOR-CLASS +- ANSI-LOOP::LOOP-HACK-ITERATION +- ANSI-LOOP::LOOP-CONSTRUCT-RETURN SYSTEM::S-DATA-SLOT-POSITION +- ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE SYSTEM::INSPECT-STRING +- COMMON-LISP::PROVIDE COMMON-LISP::CIS +- ANSI-LOOP::LOOP-MINIMAX-OPERATIONS +- SYSTEM::BREAK-BACKWARD-SEARCH-STACK +- ANSI-LOOP::LOOP-COLLECTOR-DTYPE +- SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::SEARCH-STACK +- COMMON-LISP::TENTH ANSI-LOOP::LOOP-DO-THEREIS +- ANSI-LOOP::LOOP-MAXMIN-COLLECTION +- ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA +- ANSI-LOOP::LOOP-MAKE-PSETQ SYSTEM::ADD-TO-HOTLIST +- SYSTEM::INSPECT-CONS ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS +- SYSTEM::INSPECT-VECTOR COMMON-LISP::CONSTANTLY +- SYSTEM::REWRITE-RESTART-CASE-CLAUSE SYSTEM::DM-BAD-KEY +- SYSTEM::PRINT-SYMBOL-APROPOS SYSTEM::FRS-KIND FPE::ST-LOOKUP +- COMMON-LISP::FOURTH SYSTEM::TERMINAL-INTERRUPT +- SYSTEM::DM-KEY-NOT-ALLOWED SYSTEM::UNIQUE-ID +- SYSTEM::S-DATA-FROZEN SLOOP::POINTER-FOR-COLLECT +- SYSTEM::INSPECT-PACKAGE SYSTEM::DBL-EVAL +- ANSI-LOOP::LOOP-MINIMAX-TYPE ANSI-LOOP::LOOP-UNIVERSE-ANSI +- ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS SYSTEM::DWIM +- SYSTEM::INSTREAM-STREAM-NAME SLOOP::RETURN-SLOOP-MACRO +- SYSTEM::PATCH-SHARP SYSTEM::CONTEXT-P SYSTEM::INFO-GET-FILE +- SYSTEM::RESTART-P COMMON-LISP::COSH COMMON-LISP::SINH +- SYSTEM::GET-NEXT-VISIBLE-FUN SYSTEM::CHECK-DECLARATIONS +- SYSTEM::GET-INSTREAM +- ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD SYSTEM::S-DATA-NAME +- ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS +- SYSTEM::S-DATA-DOCUMENTATION SYSTEM::SHOW-BREAK-POINT +- COMMON-LISP::ACOS COMMON-LISP::INVOKE-DEBUGGER +- SYSTEM::BKPT-FILE-LINE ANSI-LOOP::LOOP-COLLECTOR-DATA +- COMMON-LISP::THIRD SYSTEM::S-DATA-CONC-NAME +- COMMON-LISP::SIGNUM +- ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED +- SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-TYPED-INIT +- ANSI-LOOP::LOOP-PATH-FUNCTION SYSTEM::INFO-NODE-FROM-POSITION +- COMMON-LISP::ASINH SYSTEM::RE-QUOTE-STRING +- SLOOP::LOOP-COLLECT-KEYWORD-P SYSTEM::PRINT-FRS +- SYSTEM::EVAL-FEATURE ANSI-LOOP::LOOP-COLLECTOR-P +- ANSI-LOOP::LOOP-COLLECTOR-HISTORY +- ANSI-LOOP::LOOP-LIST-COLLECTION +- SYSTEM::BREAK-FORWARD-SEARCH-STACK COMMON-LISP::RESTART-NAME +- SLOOP::PARSE-NO-BODY ANSI-LOOP::LOOP-UNIVERSE-P +- SYSTEM::NUMBER-OF-DAYS-FROM-1900 SYSTEM::NODE-OFFSET +- ANSI-LOOP::LOOP-MINIMAX-P SYSTEM::IHS-FNAME FPE::LOOKUP +- SLOOP::LOOP-LET-BINDINGS FPE::GREF COMMON-LISP::PHASE +- COMMON-LISP::BYTE-POSITION SYSTEM::INSTREAM-STREAM +- ANSI-LOOP::LOOP-PATH-P SYSTEM::SEQTYPE COMMON-LISP::ACOSH +- COMMON-LISP::ABS COMMON-LISP::COMPLEMENT +- ANSI-LOOP::LOOP-CONSTANTP SYSTEM::WALK-THROUGH +- SYSTEM::SETUP-INFO SYSTEM::COMPUTING-ARGS-P +- SYSTEM::CONTEXT-SPICE SYSTEM::MAKE-KCL-TOP-RESTART +- COMMON-LISP::COMPILER-MACRO-FUNCTION +- ANSI-LOOP::LOOP-MAKE-DESETQ SYSTEM::SHOW-ENVIRONMENT +- SLOOP::TRANSLATE-NAME SYSTEM::INFO-GET-TAGS +- COMMON-LISP::SECOND SYSTEM::RESET-TRACE-DECLARATIONS +- SYSTEM::S-DATA-TYPE SYSTEM::FIND-KCL-TOP-RESTART +- ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::DO-F +- ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS COMMON-LISP::VECTOR-POP)) ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ATOI)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- SYSTEM::IHS-BACKTRACE SYSTEM::BREAK-NEXT SYSTEM::BREAK-QUIT +- SYSTEM::SHOW-BREAK-VARIABLES SYSTEM::BREAK-BDS +- COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-PREVIOUS +- SYSTEM::INFO-ERROR ANSI-LOOP::LOOP-OPTIONAL-TYPE +- SYSTEM::DBL-BACKTRACE SYSTEM::BREAK-LOCAL SYSTEM::BREAK-VS +- COMMON-LISP::CONTINUE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR COMMON-LISP::NULL ++ COMMON-LISP::HASH-TABLE)) ++ SYSTEM::CONTEXT-HASH)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) +- COMMON-LISP::FIXNUM) +- SYSTEM::DBL-WHAT-FRAME FPE::FE-ENABLE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- COMMON-LISP::SUBTYPEP COMMON-LISP::REDUCE SYSTEM::PARSE-BODY +- COMMON-LISP::STABLE-SORT COMMON-LISP::SORT +- SLOOP::FIND-IN-ORDERED-LIST)) ++ COMMON-LISP::SUBTYPEP COMMON-LISP::REDUCE ++ SLOOP::FIND-IN-ORDERED-LIST SYSTEM::PARSE-BODY ++ COMMON-LISP::STABLE-SORT COMMON-LISP::SORT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- SYSTEM::VERIFY-KEYWORDS SYSTEM::RESTART-PRINT +- ANSI-LOOP::LOOP-GET-COLLECTION-INFO SYSTEM::LIST-MERGE-SORT +- SYSTEM::READ-INSPECT-COMMAND SYSTEM::SHARP---READER +- SYSTEM::SHARP-+-READER SYSTEM::SHARP-S-READER)) ++ SYSTEM::SHARP-+-READER SYSTEM::SHARP---READER ++ SYSTEM::SHARP-S-READER ANSI-LOOP::LOOP-GET-COLLECTION-INFO ++ SYSTEM::VERIFY-KEYWORDS SYSTEM::LIST-MERGE-SORT ++ SYSTEM::RESTART-PRINT SYSTEM::READ-INSPECT-COMMAND)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) + COMMON-LISP::*) +- SYSTEM::PUSH-OPTIONAL-BINDING)) ++ SYSTEM::TRACE-CALL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) + COMMON-LISP::*) +- SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO)) ++ SYSTEM::EXPAND-WILD-DIRECTORY SYSTEM::MASET)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::*) +- SYSTEM::TRACE-CALL)) ++ SYSTEM::MME3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::MASET)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE SYSTEM::THE-START +- SYSTEM::S-DATA-LENGTH SYSTEM::S-DATA-SIZE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) +- SYSTEM::PUSH-CONTEXT SYSTEM::GET-CONTEXT)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- SYSTEM::BREAK-CURRENT SYSTEM::GCL-TOP-LEVEL +- SYSTEM::BREAK-MESSAGE SYSTEM::BREAK-RESUME +- ANSI-LOOP::LOOP-DO-FOR SYSTEM::SIMPLE-BACKTRACE +- SYSTEM::BREAK-HELP)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::STRING) COMMON-LISP::T) +- SYSTEM::COERCE-SLASH-TERMINATED SYSTEM::RESET-SYS-PATHS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMMON-LISP::BIT COMMON-LISP::READ-BYTE +- COMMON-LISP::CONCATENATE SYSTEM::INFO-SEARCH +- COMMON-LISP::ARRAY-IN-BOUNDS-P ANSI-LOOP::LOOP-ERROR +- ANSI-LOOP::LOOP-WARN COMMON-LISP::REMOVE-DUPLICATES +- SYSTEM::BAD-SEQ-LIMIT SYSTEM::PROCESS-SOME-ARGS +- ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES +- SLOOP::LOOP-ADD-TEMPS COMMON-LISP::BIT-NOT COMMON-LISP::SIGNAL +- SYSTEM::NTH-STACK-FRAME COMMON-LISP::ARRAY-ROW-MAJOR-INDEX +- COMMON-LISP::MAKE-ARRAY SYSTEM::FILE-SEARCH +- SYSTEM::LIST-MATCHES COMMON-LISP::FIND-RESTART +- SYSTEM::BREAK-LEVEL COMMON-LISP::DELETE-DUPLICATES +- SLOOP::ADD-FROM-DATA COMMON-LISP::ERROR COMMON-LISP::WARN +- SYSTEM::FILE-TO-STRING +- COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE COMMON-LISP::SBIT)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::*) +- SYSTEM::FIND-DOC SYSTEM::RESTART-REPORT +- ANSI-LOOP::ESTIMATE-CODE-SIZE-1 SYSTEM::NEWLINE +- ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEW-SEMI-COLON-READER)) ++ SYSTEM::PUSH-OPTIONAL-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) + (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) + SYSTEM::MAKE-KEYWORD)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASSP +- SYSTEM::SIMPLE-CONDITION-CLASS-P SYSTEM::UNTRACE-ONE +- SYSTEM::CONDITIONP SYSTEM::CONDITION-CLASS-P +- SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SI-CLASS-NAME +- SYSTEM::AUTOLOAD-MACRO SYSTEM::AUTOLOAD SYSTEM::SI-CLASS-OF +- SYSTEM::WARNINGP SYSTEM::DEFINE-STRUCTURE +- FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS SYSTEM::SI-FIND-CLASS +- SYSTEM::TRACE-ONE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) + SYSTEM::QUICK-SORT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::T +- COMMON-LISP::T) ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) + SYSTEM::BIGNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::EVERY COMMON-LISP::SET-DIFFERENCE ++ SYSTEM::VECTOR-PUSH-STRING SYSTEM::PROCESS-ERROR ++ COMMON-LISP::POSITION-IF-NOT COMMON-LISP::FIND-IF ++ SLOOP::LOOP-ADD-BINDING COMMON-LISP::BIT-ORC1 ++ COMMON-LISP::READ-SEQUENCE SYSTEM::INTERNAL-COUNT-IF ++ COMMON-LISP::COUNT COMMON-LISP::MISMATCH ++ COMMON-LISP::ADJUST-ARRAY COMMON-LISP::INTERSECTION ++ COMMON-LISP::UNION COMMON-LISP::DELETE-IF-NOT ++ COMMON-LISP::NINTERSECTION COMMON-LISP::BIT-ANDC1 ++ COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::TYPEP ++ COMMON-LISP::NUNION COMMON-LISP::WRITE-SEQUENCE ++ COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::REMOVE ++ COMMON-LISP::BIT-IOR SLOOP::PARSE-LOOP-MACRO ++ COMMON-LISP::SEARCH COMMON-LISP::SUBSETP ++ COMMON-LISP::SET-EXCLUSIVE-OR SYSTEM::WREADDIR ++ COMMON-LISP::POSITION-IF COMMON-LISP::DELETE ++ COMMON-LISP::BIT-EQV COMMON-LISP::BIT-ANDC2 ++ COMMON-LISP::BIT-AND COMMON-LISP::NSET-EXCLUSIVE-OR ++ SLOOP::IN-ARRAY-SLOOP-FOR ANSI-LOOP::LOOP-CHECK-DATA-TYPE ++ COMMON-LISP::POSITION COMMON-LISP::MAKE-SEQUENCE ++ COMMON-LISP::NOTEVERY COMMON-LISP::MAP-INTO ++ COMMON-LISP::REPLACE COMMON-LISP::NSET-DIFFERENCE ++ COMMON-LISP::FIND-IF-NOT COMMON-LISP::BIT-ORC2 ++ COMMON-LISP::DELETE-IF COMMON-LISP::CERROR ++ COMMON-LISP::BIT-XOR COMMON-LISP::FIND COMMON-LISP::FILL ++ SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::REMOVE-IF ++ COMMON-LISP::BIT-NAND COMMON-LISP::BIT-NOR COMMON-LISP::SOME ++ COMMON-LISP::COUNT-IF SYSTEM::BREAK-CALL ++ COMMON-LISP::COUNT-IF-NOT SYSTEM::FIND-IHS COMMON-LISP::NOTANY ++ SYSTEM::INTERNAL-COUNT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE ANSI-LOOP::LOOP-FOR-IN +- SYSTEM::DEFMACRO* SYSTEM::APPLY-DISPLAY-FUN +- SYSTEM::WARN-VERSION ANSI-LOOP::HIDE-VARIABLE-REFERENCE +- SYSTEM::SHARP-U-READER ANSI-LOOP::LOOP-FOR-ACROSS +- SYSTEM::DM-VL SYSTEM::GET-SLOT-POS ++ SYSTEM::PATHNAME-PARSE ANSI-LOOP::LOOP-TRANSLATE ++ SYSTEM::CHECK-S-DATA SYSTEM::MFR FPE::REF ++ ANSI-LOOP::LOOP-STANDARD-EXPANSION ANSI-LOOP::LOOP-FOR-ON ++ ANSI-LOOP::LOOP-SUM-COLLECTION SYSTEM::SHARP-DQ-READER ++ COMMON-LISP::DPB SYSTEM::CHECK-TRACE-ARGS ++ SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS SYSTEM::RECURSE-DIR ++ SYSTEM::SHARP-U-READER SYSTEM::FLOATING-POINT-ERROR ++ ANSI-LOOP::LOOP-FOR-IN ANSI-LOOP::HIDE-VARIABLE-REFERENCE ++ SYSTEM::GET-SLOT-POS SYSTEM::APPLY-DISPLAY-FUN + SYSTEM::RESTART-CASE-EXPRESSION-CONDITION +- SYSTEM::CHECK-TRACE-ARGS ANSI-LOOP::LOOP-FOR-ON FPE::REF +- ANSI-LOOP::PRINT-LOOP-UNIVERSE ANSI-LOOP::LOOP-ANSI-FOR-EQUALS +- SYSTEM::SETF-EXPAND-1 ANSI-LOOP::LOOP-SUM-COLLECTION +- ANSI-LOOP::LOOP-STANDARD-EXPANSION SYSTEM::MAKE-T-TYPE +- COMMON-LISP::DEPOSIT-FIELD SYSTEM::MAKE-BREAK-POINT +- ANSI-LOOP::LOOP-FOR-BEING ANSI-LOOP::LOOP-TRANSLATE +- SYSTEM::SHARP-A-READER COMMON-LISP::DPB +- SYSTEM::FLOATING-POINT-ERROR SYSTEM::CHECK-S-DATA +- SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS)) ++ SYSTEM::MAKE-BREAK-POINT SYSTEM::TO-REGEXP-OR-NAMESTRING ++ COMMON-LISP::DEPOSIT-FIELD SYSTEM::SHARP-V-READER ++ SYSTEM::MAKE-T-TYPE ANSI-LOOP::LOOP-FOR-ACROSS ++ ANSI-LOOP::LOOP-ANSI-FOR-EQUALS ANSI-LOOP::PRINT-LOOP-UNIVERSE ++ ANSI-LOOP::LOOP-FOR-BEING SYSTEM::SHARP-P-READER SYSTEM::DM-VL ++ SYSTEM::SHARP-A-READER ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE ++ SYSTEM::DEFMACRO* SYSTEM::SETF-EXPAND-1 SYSTEM::WARN-VERSION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::*) + COMMON-LISP::T) +- SLOOP::FIRST-USE-SLOOP-FOR SYSTEM::COERCE-TO-CONDITION SYSTEM::DO-BREAK-LEVEL +- SLOOP::FIRST-SLOOP-FOR ANSI-LOOP::LOOP-FOR-ARITHMETIC +- SYSTEM::MAYBE-BREAK SYSTEM::SETF-STRUCTURE-ACCESS +- SYSTEM::CALL-TEST SYSTEM::FIND-LINE-IN-FUN)) ++ SYSTEM::MME2 COMMON-LISP::NSUBSTITUTE SYSTEM::MATCH-COMPONENT ++ SYSTEM::COMPLETE-PROP SYSTEM::WALK-DIR ++ COMMON-LISP::TRANSLATE-PATHNAME ANSI-LOOP::ADD-LOOP-PATH ++ SYSTEM::DIR-PARSE ANSI-LOOP::LOOP-MAKE-VARIABLE ++ COMMON-LISP::SUBSTITUTE-IF COMMON-LISP::NSUBSTITUTE-IF ++ SYSTEM::PUSH-LET-BINDING COMMON-LISP::SUBSTITUTE ++ ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH COMMON-LISP::MAP ++ COMMON-LISP::SUBSTITUTE-IF-NOT COMMON-LISP::NSUBSTITUTE-IF-NOT ++ ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH ++ SLOOP::LOOP-DECLARE-BINDING ++ ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH ++ SYSTEM::CHECK-TYPE-SYMBOL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- COMMON-LISP::COUNT-IF COMMON-LISP::BIT-ANDC2 +- COMMON-LISP::REMOVE SYSTEM::INTERNAL-COUNT-IF +- SLOOP::LOOP-ADD-BINDING COMMON-LISP::MAP-INTO +- COMMON-LISP::FIND-IF COMMON-LISP::NSET-DIFFERENCE +- COMMON-LISP::UNION COMMON-LISP::NUNION +- COMMON-LISP::MAKE-SEQUENCE COMMON-LISP::NOTANY +- COMMON-LISP::POSITION COMMON-LISP::DELETE-IF +- COMMON-LISP::BIT-ORC2 COMMON-LISP::REPLACE COMMON-LISP::DELETE +- SYSTEM::BREAK-CALL COMMON-LISP::NINTERSECTION +- COMMON-LISP::POSITION-IF SYSTEM::FIND-IHS COMMON-LISP::BIT-AND +- COMMON-LISP::DELETE-IF-NOT ANSI-LOOP::LOOP-CHECK-DATA-TYPE +- COMMON-LISP::REMOVE-IF COMMON-LISP::READ-SEQUENCE +- SLOOP::PARSE-LOOP-MACRO COMMON-LISP::BIT-NAND +- SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::SUBSETP +- COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::EVERY +- COMMON-LISP::SOME COMMON-LISP::WRITE-SEQUENCE +- COMMON-LISP::MISMATCH COMMON-LISP::SET-EXCLUSIVE-OR +- COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::BIT-NOR +- COMMON-LISP::BIT-XOR COMMON-LISP::BIT-EQV COMMON-LISP::SEARCH +- COMMON-LISP::SET-DIFFERENCE COMMON-LISP::FILL +- COMMON-LISP::CERROR COMMON-LISP::ADJUST-ARRAY +- COMMON-LISP::BIT-ORC1 SYSTEM::INTERNAL-COUNT +- COMMON-LISP::TYPEP SYSTEM::PROCESS-ERROR +- COMMON-LISP::COUNT-IF-NOT COMMON-LISP::INTERSECTION +- SLOOP::IN-ARRAY-SLOOP-FOR COMMON-LISP::FIND-IF-NOT +- COMMON-LISP::BIT-ANDC1 COMMON-LISP::POSITION-IF-NOT +- COMMON-LISP::NOTEVERY COMMON-LISP::NSET-EXCLUSIVE-OR +- COMMON-LISP::FIND COMMON-LISP::COUNT COMMON-LISP::BIT-IOR)) ++ SYSTEM::SHARP-EQ-READER SYSTEM::SHARP-SHARP-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::PUSH-SUB-LIST-BINDING SYSTEM::DO-ARG-COUNT-ERROR)) ++ SYSTEM::ELSUB SLOOP::FIRST-USE-SLOOP-FOR ++ SLOOP::FIRST-SLOOP-FOR SYSTEM::SETF-STRUCTURE-ACCESS ++ SYSTEM::FIND-LINE-IN-FUN SYSTEM::COERCE-TO-CONDITION ++ ANSI-LOOP::LOOP-FOR-ARITHMETIC SYSTEM::MAYBE-BREAK ++ SYSTEM::ELEMENT SYSTEM::DO-BREAK-LEVEL SYSTEM::CALL-TEST)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- ANSI-LOOP::ADD-LOOP-PATH COMMON-LISP::MAP +- ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH +- ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH +- COMMON-LISP::SUBSTITUTE COMMON-LISP::NSUBSTITUTE +- COMMON-LISP::NSUBSTITUTE-IF-NOT ANSI-LOOP::LOOP-MAKE-VARIABLE +- COMMON-LISP::SUBSTITUTE-IF-NOT +- ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH +- SYSTEM::PUSH-LET-BINDING COMMON-LISP::SUBSTITUTE-IF +- SYSTEM::CHECK-TYPE-SYMBOL SLOOP::LOOP-DECLARE-BINDING +- SYSTEM::COMPLETE-PROP COMMON-LISP::NSUBSTITUTE-IF)) ++ ANSI-LOOP::LOOP-SEQUENCER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::MAKE-PREDICATE +- SYSTEM::MAKE-CONSTRUCTOR)) ++ SYSTEM::MAKE-CONSTRUCTOR SYSTEM::MAKE-PREDICATE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- SYSTEM::UNIVERSAL-ERROR-HANDLER)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::FIXNUM) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::SHARP-SHARP-READER SYSTEM::SHARP-EQ-READER)) ++ SYSTEM::PUSH-SUB-LIST-BINDING SYSTEM::DO-ARG-COUNT-ERROR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- SLOOP::DEF-LOOP-INTERNAL SYSTEM::PRINT-STACK-FRAME +- COMMON-LISP::MERGE)) ++ SLOOP::DEF-LOOP-INTERNAL COMMON-LISP::MERGE ++ SYSTEM::PRINT-STACK-FRAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -369,154 +231,389 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- ANSI-LOOP::LOOP-SEQUENCER)) ++ SYSTEM::UNIVERSAL-ERROR-HANDLER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::MERGE-PATHNAMES ++ COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME ANSI-LOOP::LOOP-ERROR ++ COMMON-LISP::WILD-PATHNAME-P SLOOP::LOOP-ADD-TEMPS ++ SYSTEM::FILE-SEARCH SYSTEM::INFO-SEARCH ++ COMMON-LISP::PATHNAME-VERSION COMMON-LISP::WARN SYSTEM::MGSUB ++ COMMON-LISP::ARRAY-ROW-MAJOR-INDEX ++ COMMON-LISP::REMOVE-DUPLICATES COMMON-LISP::PATHNAME-NAME ++ COMMON-LISP::BIT COMMON-LISP::FIND-RESTART SYSTEM::TO-REGEXP ++ SYSTEM::PROCESS-SOME-ARGS COMMON-LISP::ERROR ++ COMMON-LISP::REQUIRE COMMON-LISP::OPEN ++ COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE SLOOP::ADD-FROM-DATA ++ SYSTEM::BREAK-LEVEL SYSTEM::LIST-MATCHES ++ COMMON-LISP::DELETE-DUPLICATES ANSI-LOOP::LOOP-WARN ++ COMMON-LISP::PATHNAME-DEVICE COMMON-LISP::LOAD ++ COMMON-LISP::PATHNAME-HOST COMMON-LISP::SBIT SYSTEM::NLOAD ++ COMMON-LISP::BIT-NOT COMMON-LISP::ENOUGH-NAMESTRING ++ COMMON-LISP::SIGNAL COMMON-LISP::ARRAY-IN-BOUNDS-P ++ COMMON-LISP::PATHNAME-TYPE SYSTEM::FILE-TO-STRING ++ SYSTEM::LOGICAL-PATHNAME-PARSE SYSTEM::NTH-STACK-FRAME ++ ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES SYSTEM::MGLIST ++ COMMON-LISP::DIRECTORY SYSTEM::BAD-SEQ-LIMIT ++ COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::READ-BYTE ++ SYSTEM::LINK-EXPAND COMMON-LISP::CONCATENATE ++ COMMON-LISP::MAKE-ARRAY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::NEWLINE SYSTEM::LIST-TOGGLE-CASE ++ COMMON-LISP::RENAME-FILE ANSI-LOOP::ESTIMATE-CODE-SIZE ++ SYSTEM::SOURCE-PORTION SYSTEM::RESTART-REPORT SYSTEM::DO-REPL ++ SYSTEM::FIND-DOC ANSI-LOOP::ESTIMATE-CODE-SIZE-1 ++ SYSTEM::NEW-SEMI-COLON-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::STRING COMMON-LISP::FIXNUM) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::FIXNUM) +- SYSTEM::ATOI)) ++ FPE::FE-ENABLE SYSTEM::DBL-WHAT-FRAME)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::INFO SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE ++ COMMON-LISP::FTRUNCATE COMMON-LISP::USE-VALUE ++ COMMON-LISP::INVOKE-RESTART COMMON-LISP::WRITE-TO-STRING ++ COMMON-LISP::FCEILING COMMON-LISP::FROUND ++ COMMON-LISP::READ-FROM-STRING COMMON-LISP::FFLOOR ++ SYSTEM::PARSE-BODY-HEADER SYSTEM::BREAK-FUNCTION ++ SYSTEM::APROPOS-DOC COMMON-LISP::APROPOS ++ COMMON-LISP::APROPOS-LIST ++ ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE ++ COMMON-LISP::GET-SETF-EXPANSION SYSTEM::PRINT-DOC ++ COMMON-LISP::PARSE-NAMESTRING ++ COMMON-LISP::ENSURE-DIRECTORIES-EXIST ++ COMMON-LISP::DECODE-UNIVERSAL-TIME SYSTEM::SHOW-INFO ++ COMMON-LISP::STORE-VALUE SYSTEM::STEPPER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ COMMON-LISP::VECTOR-PUSH SYSTEM::DM-NTH COMMON-LISP::LOGORC1 ++ SLOOP::L-EQUAL SLOOP::NEVER-SLOOP-COLLECT ++ COMMON-LISP::LDB-TEST COMMON-LISP::LDB COMMON-LISP::LOGORC2 ++ SLOOP::COUNT-SLOOP-COLLECT SLOOP::MAXIMIZE-SLOOP-COLLECT ++ SYSTEM::ALL-MATCHES ANSI-LOOP::LOOP-TMEMBER SLOOP::THE-TYPE ++ SYSTEM::?PUSH SYSTEM::INCREMENT-CURSOR SYSTEM::SET-DIR ++ SYSTEM::DM-NTH-CDR SYSTEM::IN-INTERVAL-P SLOOP::MAKE-VALUE ++ SYSTEM::DBL-UP COMMON-LISP::COERCE SYSTEM::MATCH-DIMENSIONS ++ COMMON-LISP::LOGNAND SLOOP::=-SLOOP-FOR ++ SYSTEM::KEYWORD-SUPPLIED-P SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS ++ SYSTEM::LEFT-PARENTHESIS-READER ++ ANSI-LOOP::LOOP-MAYBE-BIND-FORM SYSTEM::COERCE-TO-STRING ++ SYSTEM::ADD-FILE SLOOP::PARSE-LOOP-MAP COMMON-LISP::LOGNOR ++ SYSTEM::MSUB SYSTEM::SET-BACK SYSTEM::SUPER-GO ++ SYSTEM::SUBSTRINGP ANSI-LOOP::LOOP-TEQUAL ++ ANSI-LOOP::LOOP-DO-WHILE SYSTEM::GET-LINE-OF-FORM ++ FPE::READ-INSTRUCTION SYSTEM::SUB-INTERVAL-P ++ SYSTEM::CHECK-SEQ-START-END SYSTEM::*BREAK-POINTS* ++ ANSI-LOOP::MAKE-LOOP-MINIMAX SLOOP::IN-PACKAGE-SLOOP-MAP ++ SYSTEM::DM-V SYSTEM::INFO-AUX ++ ANSI-LOOP::HIDE-VARIABLE-REFERENCES ++ SLOOP::COLLATE-SLOOP-COLLECT COMMON-LISP::PATHNAME-MATCH-P ++ SYSTEM::SET-PATH-STREAM-NAME SLOOP::SUM-SLOOP-COLLECT ++ ANSI-LOOP::LOOP-LOOKUP-KEYWORD ++ ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::BREAK-STEP-NEXT ++ FPE::RF SLOOP::IN-TABLE-SLOOP-MAP SYSTEM::OBJLT ++ FPE::READ-OPERANDS SYSTEM::BREAK-STEP-INTO COMMON-LISP::BYTE ++ SYSTEM::SEQUENCE-CURSOR SYSTEM::LIST-DELQ ++ SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS ++ SYSTEM::CONDITION-PASS SYSTEM::SETF-HELPER FPE::0-READER ++ SYSTEM::DISPLAY-COMPILED-ENV COMMON-LISP::NTH ++ COMPILER::COMPILER-DEF-HOOK SYSTEM::DOT-DIR-P ++ COMMON-LISP::LOGTEST SYSTEM::QUOTATION-READER ++ SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::LOGANDC1 ++ SLOOP::ALWAYS-SLOOP-COLLECT SLOOP::DESETQ1 ++ SYSTEM::GET-INFO-CHOICES COMMON-LISP::WRITE-BYTE ++ ANSI-LOOP::LOOP-DO-IF ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION ++ ANSI-LOOP::LOOP-TASSOC SLOOP::IN-CAREFULLY-SLOOP-FOR ++ COMMON-LISP::DOCUMENTATION FPE::PAREN-READER SYSTEM::GET-NODES ++ SYSTEM::PARSE-SLOT-DESCRIPTION SLOOP::IN-FRINGE-SLOOP-MAP ++ SYSTEM::SAFE-EVAL SYSTEM::DISPLAY-ENV FPE::%-READER ++ SLOOP::THEREIS-SLOOP-COLLECT SYSTEM::LOOKUP-KEYWORD ++ COMMON-LISP::LOGANDC2 COMMON-LISP::NTHCDR ++ SLOOP::MINIMIZE-SLOOP-COLLECT SYSTEM::GET-MATCH ++ SYSTEM::SETF-EXPAND SLOOP::LOGXOR-SLOOP-COLLECT ++ ANSI-LOOP::LOOP-DO-ALWAYS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ROUND-UP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::STEP-NEXT +- COMMON-LISP::BREAK COMMON-LISP::ABORT SYSTEM::MAKE-S-DATA +- ANSI-LOOP::MAKE-LOOP-COLLECTOR SLOOP::PARSE-LOOP-DECLARE +- ANSI-LOOP::LOOP-GENTEMP SYSTEM::MAKE-INSTREAM +- SYSTEM::MAYBE-CLEAR-INPUT +- ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL COMMON-LISP::Y-OR-N-P +- SYSTEM::CURRENT-STEP-FUN ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL +- COMMON-LISP::DRIBBLE SYSTEM::MAKE-RESTART +- SLOOP::PARSE-LOOP-WITH SYSTEM::LOC COMMON-LISP::YES-OR-NO-P +- SYSTEM::TRANSFORM-KEYWORDS SYSTEM::MAKE-CONTEXT +- COMMON-LISP::COMPUTE-RESTARTS SYSTEM::DBL-READ +- SYSTEM::STEP-INTO ANSI-LOOP::MAKE-LOOP-UNIVERSE +- SYSTEM::BREAK-LOCALS ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE +- COMMON-LISP::VECTOR ANSI-LOOP::MAKE-LOOP-PATH)) ++ COMMON-LISP::Y-OR-N-P COMMON-LISP::YES-OR-NO-P ++ COMMON-LISP::DRIBBLE COMMON-LISP::VECTOR SYSTEM::NEXT-MATCH ++ SYSTEM::MAKE-S-DATA SYSTEM::LOC SYSTEM::BREAK-LOCALS ++ SLOOP::PARSE-LOOP-WITH COMMON-LISP::USER-HOMEDIR-PATHNAME ++ SYSTEM::STEP-INTO SYSTEM::MAYBE-CLEAR-INPUT ++ ANSI-LOOP::MAKE-LOOP-PATH SYSTEM::STEP-NEXT ++ ANSI-LOOP::LOOP-GENTEMP COMMON-LISP::COMPUTE-RESTARTS ++ SYSTEM::CURRENT-STEP-FUN SYSTEM::MAKE-INSTREAM ++ ANSI-LOOP::MAKE-LOOP-COLLECTOR SYSTEM::MAKE-RESTART ++ SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::TRANSFORM-KEYWORDS ++ COMMON-LISP::ABORT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE ++ ANSI-LOOP::MAKE-LOOP-UNIVERSE SLOOP::PARSE-LOOP-DECLARE ++ COMMON-LISP::BREAK ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL ++ SYSTEM::MAKE-CONTEXT SYSTEM::DBL-READ ++ COMMON-LISP::MAKE-PATHNAME ++ ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- ANSI-LOOP::LOOP-LIST-STEP SYSTEM::INSPECT-OBJECT +- COMMON-LISP::DESCRIBE ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES +- SYSTEM::BREAK-GO SYSTEM::GET-&ENVIRONMENT +- COMMON-LISP::PRINC-TO-STRING SYSTEM::WAITING +- SYSTEM::INSTREAM-NAME ANSI-LOOP::NAMED-VARIABLE +- COMMON-LISP::PRIN1-TO-STRING SYSTEM::INFO-SUBFILE +- COMMON-LISP::INSPECT SYSTEM::END-WAITING +- SYSTEM::FIND-DECLARATIONS +- COMMON-LISP::INVOKE-RESTART-INTERACTIVELY +- SYSTEM::BREAK-LEVEL-INVOKE-RESTART SYSTEM::ALOAD)) ++ ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES SYSTEM::BREAK-GO ++ COMMON-LISP::FILE-AUTHOR SYSTEM::ENSURE-DIR-STRING ++ SYSTEM::INFO-SUBFILE COMMON-LISP::DESCRIBE SYSTEM::END-WAITING ++ COMMON-LISP::PRIN1-TO-STRING SYSTEM::FIND-DECLARATIONS ++ COMMON-LISP::INSPECT ANSI-LOOP::NAMED-VARIABLE ++ SYSTEM::GET-&ENVIRONMENT SYSTEM::INSPECT-OBJECT ++ COMMON-LISP::PRINC-TO-STRING ANSI-LOOP::LOOP-LIST-STEP ++ SYSTEM::INSTREAM-NAME SYSTEM::BREAK-LEVEL-INVOKE-RESTART ++ SYSTEM::WAITING COMMON-LISP::INVOKE-RESTART-INTERACTIVELY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ SYSTEM::IHS-NOT-INTERPRETED-ENV COMMON-LISP::NINTH ++ SYSTEM::FIND-KCL-TOP-RESTART COMMON-LISP::TRUENAME ++ SYSTEM::DIRECTORY-LIST-CHECK SYSTEM::REAL-ASINH ++ SYSTEM::SHOW-ENVIRONMENT SYSTEM::PRINT-FRS ++ SYSTEM::REWRITE-RESTART-CASE-CLAUSE ++ COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM ++ ANSI-LOOP::LOOP-COLLECTOR-DATA SLOOP::POINTER-FOR-COLLECT ++ SYSTEM::MLP SYSTEM::WILD-PATH-ELEMENT-P SYSTEM::LNP ++ ANSI-LOOP::LOOP-MINIMAX-OPERATIONS SYSTEM::FRS-KIND ++ SYSTEM::BKPT-FILE COMMON-LISP::FIFTH ++ ANSI-LOOP::LOOP-COLLECTOR-P ANSI-LOOP::LOOP-UNIVERSE-ANSI ++ ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::IDESCRIBE ++ ANSI-LOOP::LOOP-CONSTANTP ++ ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS COMMON-LISP::PROBE-FILE ++ ANSI-LOOP::LOOP-UNIVERSE-P COMMON-LISP::SINH SYSTEM::RESTART-P ++ SYSTEM::S-DATA-DOCUMENTATION ++ COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM ++ SYSTEM::FIND-DOCUMENTATION SYSTEM::INFO-GET-FILE ++ SLOOP::PARSE-NO-BODY COMMON-LISP::FILE-NAMESTRING ++ COMMON-LISP::COMPILER-MACRO-FUNCTION SYSTEM::PROCESS-ARGS ++ ANSI-LOOP::LOOP-COLLECTOR-DTYPE COMMON-LISP::PHASE ++ SYSTEM::MAKE-FRAME SYSTEM::INSTREAM-STREAM ++ ANSI-LOOP::LOOP-COLLECTOR-HISTORY SYSTEM::FIX-LOAD-PATH ++ SYSTEM::COMPUTING-ARGS-P ++ ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE COMMON-LISP::TENTH ++ ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::WILD-NAMESTRING-P ++ SYSTEM::BEST-ARRAY-ELEMENT-TYPE SYSTEM::DM-BAD-KEY ++ SYSTEM::TERMINAL-INTERRUPT SYSTEM::REGEXP-CONV ++ COMMON-LISP::FILE-WRITE-DATE SLOOP::PARSE-LOOP ++ ANSI-LOOP::LOOP-CONSTRUCT-RETURN SYSTEM::DWIM ++ ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS ++ SLOOP::RETURN-SLOOP-MACRO SLOOP::AVERAGING-SLOOP-MACRO ++ SYSTEM::S-DATA-NAME SYSTEM::CHECK-TRACE-SPEC ++ SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE SLOOP::TRANSLATE-NAME ++ SYSTEM::ADD-TO-HOTLIST SYSTEM::S-DATA-CONC-NAME ++ ANSI-LOOP::LOOP-MINIMAX-TYPE SYSTEM::PRINT-IHS ++ SYSTEM::DBL-RPL-LOOP SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY ++ SYSTEM::INSPECT-CONS SYSTEM::INSTREAM-STREAM-NAME ++ SYSTEM::S-DATA-P SYSTEM::EVAL-FEATURE ++ COMMON-LISP::ARRAY-DIMENSIONS SYSTEM::IHS-VISIBLE ++ ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE ++ SYSTEM::CHECK-DECLARATIONS COMMON-LISP::TANH ++ ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS ++ COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::INSPECT-PACKAGE ++ SLOOP::LOOP-LET-BINDINGS COMMON-LISP::CIS SYSTEM::SETUP-INFO ++ SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-PSEUDO-BODY ++ SYSTEM::PATH-STREAM-NAME SYSTEM::INFO-GET-TAGS FPE::ST-LOOKUP ++ SYSTEM::BREAK-BACKWARD-SEARCH-STACK ++ ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE SYSTEM::SIMPLE-ARRAY-P ++ SYSTEM::S-DATA-TYPE COMMON-LISP::CONCATENATED-STREAM-STREAMS ++ SYSTEM::INSPECT-CHARACTER ANSI-LOOP::DESTRUCTURING-SIZE ++ SYSTEM::GET-BYTE-STREAM-NCHARS ANSI-LOOP::LOOP-PATH-P ++ COMMON-LISP::FIRST COMMON-LISP::SECOND ++ COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM ++ SYSTEM::MAKE-DEFPACKAGE-FORM SYSTEM::INSPECT-SYMBOL ++ SYSTEM::INSPECT-VECTOR ++ COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS ++ SYSTEM::RESTART-INTERACTIVE-FUNCTION SYSTEM::INSPECT-STRING ++ SYSTEM::DIR-P ANSI-LOOP::LOOP-COLLECTOR-CLASS ++ SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::NODES-FROM-INDEX ++ SYSTEM::VERSION-PARSE SYSTEM::BKPT-FILE-LINE COMMON-LISP::ABS ++ SYSTEM::IHS-FNAME ANSI-LOOP::LOOP-MAKE-PSETQ ++ SYSTEM::LEAP-YEAR-P ANSI-LOOP::LOOP-EMIT-FINAL-VALUE ++ SYSTEM::GET-PATH SYSTEM::ALOAD SYSTEM::DM-KEY-NOT-ALLOWED ++ SYSTEM::MAKE-KCL-TOP-RESTART SYSTEM::S-DATA-SLOT-DESCRIPTIONS ++ COMMON-LISP::VECTOR-POP ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS ++ ANSI-LOOP::LOOP-PATH-USER-DATA SYSTEM::S-DATA-SLOT-POSITION ++ COMMON-LISP::BROADCAST-STREAM-STREAMS ++ SYSTEM::LOGICAL-PATHNAMEP SYSTEM::BREAK-FORWARD-SEARCH-STACK ++ SLOOP::SLOOP-SLOOP-MACRO COMMON-LISP::SIGNUM ++ SYSTEM::RESET-TRACE-DECLARATIONS SYSTEM::CONTEXT-P ++ SYSTEM::S-DATA-FROZEN SYSTEM::NUMBER-OF-DAYS-FROM-1900 ++ SYSTEM::S-DATA-STATICP ANSI-LOOP::LOOP-PATH-FUNCTION ++ SYSTEM::KNOWN-TYPE-P COMMON-LISP::PROVIDE SYSTEM::PNL1 ++ ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD ++ SYSTEM::COERCE-SLASH-TERMINATED COMMON-LISP::LOGICAL-PATHNAME ++ SYSTEM::DIR-CONJ SYSTEM::BKPT-FORM ++ SYSTEM::LOGICAL-PATHNAME-HOST-P SYSTEM::INSPECT-STRUCTURE ++ ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED ++ COMMON-LISP::FIND-ALL-SYMBOLS ++ ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS ++ ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED ++ COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS ++ SYSTEM::TRACE-ONE-PREPROCESS COMMON-LISP::CONSTANTLY ++ COMMON-LISP::ACOS SYSTEM::S-DATA-OFFSET COMMON-LISP::ASINH ++ SYSTEM::SHORT-NAME SYSTEM::S-DATA-INCLUDED SYSTEM::DBL-EVAL ++ SYSTEM::BKPT-FUNCTION SYSTEM::INSPECT-NUMBER ++ SYSTEM::GET-INSTREAM SYSTEM::SHOW-BREAK-POINT FPE::LOOKUP ++ SYSTEM::NEXT-STACK-FRAME SYSTEM::INSPECT-ARRAY ++ SYSTEM::S-DATA-RAW ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA ++ SYSTEM::RESTART-REPORT-FUNCTION SYSTEM::TOGGLE-CASE ++ SYSTEM::NODE-OFFSET SYSTEM::INSTREAM-P ++ ANSI-LOOP::LOOP-PATH-NAMES SYSTEM::FREEZE-DEFSTRUCT ++ COMMON-LISP::SEVENTH SYSTEM::SEARCH-STACK COMMON-LISP::SIXTH ++ ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS FPE::GREF ++ FPE::XMM-LOOKUP COMMON-LISP::HOST-NAMESTRING ++ ANSI-LOOP::LOOP-TYPED-INIT ++ SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P ++ ANSI-LOOP::LOOP-DO-THEREIS COMMON-LISP::EIGHTH ++ SYSTEM::UNIQUE-ID COMMON-LISP::THIRD ++ COMMON-LISP::BYTE-POSITION COMMON-LISP::SYNONYM-STREAM-SYMBOL ++ SYSTEM::PATCH-SHARP SYSTEM::PRINT-SYMBOL-APROPOS ++ COMMON-LISP::LOGNOT SLOOP::REPEAT-SLOOP-MACRO ++ COMMON-LISP::FOURTH SLOOP::SUBSTITUTE-SLOOP-BODY ++ COMMON-LISP::ATANH SLOOP::LOOP-COLLECT-KEYWORD-P ++ SYSTEM::SEQTYPE SYSTEM::RE-QUOTE-STRING COMMON-LISP::ISQRT ++ SYSTEM::DO-F SYSTEM::S-DATA-HAS-HOLES ++ ANSI-LOOP::LOOP-HACK-ITERATION ANSI-LOOP::LOOP-COLLECTOR-NAME ++ COMMON-LISP::RESTART-NAME COMMON-LISP::DIRECTORY-NAMESTRING ++ ANSI-LOOP::LOOP-EMIT-BODY COMMON-LISP::ACOSH ++ SYSTEM::RESTART-FUNCTION SYSTEM::INFO-NODE-FROM-POSITION ++ COMMON-LISP::ASIN ANSI-LOOP::LOOP-LIST-COLLECTION ++ SYSTEM::S-DATA-INCLUDES SYSTEM::GET-NEXT-VISIBLE-FUN ++ COMMON-LISP::BYTE-SIZE COMMON-LISP::PATHNAME ++ ANSI-LOOP::LOOP-MINIMAX-P SLOOP::PARSE-LOOP-INITIALLY ++ COMMON-LISP::COSH SYSTEM::EXPAND-HOME-DIR ++ COMMON-LISP::ECHO-STREAM-INPUT-STREAM ++ SYSTEM::INSERT-BREAK-POINT SYSTEM::RESTART-TEST-FUNCTION ++ SYSTEM::S-DATA-PRINT-FUNCTION SYSTEM::WILD-DIR-ELEMENT-P ++ SYSTEM::S-DATA-NAMED COMMON-LISP::INVOKE-DEBUGGER ++ COMMON-LISP::NAMESTRING ANSI-LOOP::LOOP-MAKE-DESETQ ++ COMMON-LISP::COMPLEMENT SYSTEM::WALK-THROUGH ++ COMMON-LISP::RATIONAL ANSI-LOOP::LOOP-MAXMIN-COLLECTION ++ COMMON-LISP::DELETE-FILE ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ SYSTEM::BREAK-QUIT SYSTEM::BREAK-BDS SYSTEM::DBL-BACKTRACE ++ SYSTEM::BREAK-LOCAL SYSTEM::INFO-ERROR ++ SYSTEM::SHOW-BREAK-VARIABLES SYSTEM::BREAK-VS ++ COMMON-LISP::CONTINUE COMMON-LISP::MUFFLE-WARNING ++ SYSTEM::IHS-BACKTRACE ANSI-LOOP::LOOP-OPTIONAL-TYPE ++ SYSTEM::BREAK-PREVIOUS SYSTEM::BREAK-NEXT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T) + COMMON-LISP::T) +- ANSI-LOOP::MAKE-LOOP-MINIMAX COMMON-LISP::LDB +- SYSTEM::LIST-DELQ FPE::RF SLOOP::L-EQUAL +- ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::DISPLAY-COMPILED-ENV +- SYSTEM::SET-BACK ANSI-LOOP::HIDE-VARIABLE-REFERENCES +- SYSTEM::GET-LINE-OF-FORM SYSTEM::BREAK-STEP-INTO +- SLOOP::THE-TYPE SLOOP::COUNT-SLOOP-COLLECT +- SYSTEM::KEYWORD-SUPPLIED-P COMMON-LISP::LOGANDC2 +- ANSI-LOOP::LOOP-MAYBE-BIND-FORM SYSTEM::SET-DIR +- SYSTEM::COERCE-TO-STRING COMMON-LISP::VECTOR-PUSH +- SYSTEM::DM-NTH-CDR SLOOP::IN-FRINGE-SLOOP-MAP +- SLOOP::MAXIMIZE-SLOOP-COLLECT SYSTEM::ADD-FILE +- SYSTEM::ALL-MATCHES SYSTEM::DM-NTH +- SLOOP::IN-CAREFULLY-SLOOP-FOR SYSTEM::PARSE-SLOT-DESCRIPTION +- ANSI-LOOP::LOOP-LOOKUP-KEYWORD FPE::0-READER +- ANSI-LOOP::LOOP-TMEMBER COMPILER::COMPILER-DEF-HOOK +- SYSTEM::INFO-AUX COMMON-LISP::NTH SYSTEM::QUOTATION-READER +- SYSTEM::CHECK-SEQ-START-END COMMON-LISP::LOGNAND +- SYSTEM::SUBSTRINGP COMMON-LISP::LOGORC2 +- ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION SYSTEM::SAFE-EVAL +- ANSI-LOOP::LOOP-DO-IF SLOOP::THEREIS-SLOOP-COLLECT +- SYSTEM::MATCH-DIMENSIONS SYSTEM::GET-MATCH +- SYSTEM::SUB-INTERVAL-P FPE::PAREN-READER +- SLOOP::IN-TABLE-SLOOP-MAP COMMON-LISP::LOGTEST +- SLOOP::LOGXOR-SLOOP-COLLECT SYSTEM::DM-V +- SYSTEM::GET-INFO-CHOICES SLOOP::COLLATE-SLOOP-COLLECT +- SYSTEM::BREAK-STEP-NEXT ANSI-LOOP::LOOP-TEQUAL +- COMMON-LISP::WRITE-BYTE COMMON-LISP::NTHCDR +- SYSTEM::SETF-HELPER SLOOP::NEVER-SLOOP-COLLECT SLOOP::DESETQ1 +- ANSI-LOOP::LOOP-DO-WHILE COMMON-LISP::DOCUMENTATION +- FPE::%-READER SYSTEM::IN-INTERVAL-P SLOOP::SUM-SLOOP-COLLECT +- SYSTEM::OBJLT COMMON-LISP::LDB-TEST SLOOP::PARSE-LOOP-MAP +- SYSTEM::GET-NODES SLOOP::MAKE-VALUE SYSTEM::CONDITION-PASS +- SLOOP::IN-PACKAGE-SLOOP-MAP SYSTEM::INCREMENT-CURSOR +- ANSI-LOOP::LOOP-DO-ALWAYS SYSTEM::DISPLAY-ENV SYSTEM::SUPER-GO +- SLOOP::MINIMIZE-SLOOP-COLLECT COMMON-LISP::LOGNOR +- COMMON-LISP::LOGANDC1 COMMON-LISP::BYTE SYSTEM::DBL-UP +- SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::LOGORC1 +- FPE::READ-OPERANDS SLOOP::ALWAYS-SLOOP-COLLECT +- SYSTEM::SETF-EXPAND SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS +- SYSTEM::*BREAK-POINTS* SYSTEM::LOOKUP-KEYWORD +- ANSI-LOOP::LOOP-TASSOC SYSTEM::LEFT-PARENTHESIS-READER +- SLOOP::=-SLOOP-FOR FPE::READ-INSTRUCTION COMMON-LISP::COERCE +- SYSTEM::SEQUENCE-CURSOR)) ++ SYSTEM::SMALLNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMMON-LISP::FFLOOR SYSTEM::BREAK-FUNCTION +- COMMON-LISP::APROPOS-LIST COMMON-LISP::DECODE-UNIVERSAL-TIME +- SYSTEM::STEPPER COMMON-LISP::REQUIRE SYSTEM::APROPOS-DOC +- SYSTEM::PRINT-DOC SYSTEM::INFO COMMON-LISP::USE-VALUE +- COMMON-LISP::WRITE-TO-STRING COMMON-LISP::FCEILING +- SYSTEM::GET-SETF-METHOD +- ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE SYSTEM::NLOAD +- COMMON-LISP::ENSURE-DIRECTORIES-EXIST +- COMMON-LISP::WILD-PATHNAME-P COMMON-LISP::FTRUNCATE +- COMMON-LISP::FROUND SYSTEM::PARSE-BODY-HEADER +- COMMON-LISP::INVOKE-RESTART SYSTEM::SHOW-INFO +- COMMON-LISP::READ-FROM-STRING +- SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE COMMON-LISP::APROPOS +- COMMON-LISP::STORE-VALUE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ COMMON-LISP::HASH-TABLE) ++ SYSTEM::CONTEXT-SPICE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- ANSI-LOOP::LOOP-DO-WITH SYSTEM::WINE-TMP-REDIRECT +- SLOOP::PARSE-ONE-WHEN-CLAUSE COMMON-LISP::TYPE-ERROR +- SYSTEM::INSPECT-INDENT SYSTEM::SET-CURRENT SYSTEM::TEST-ERROR +- SLOOP::LOOP-POP ANSI-LOOP::LOOP-DO-REPEAT +- ANSI-LOOP::LOOP-GET-PROGN SYSTEM::DM-TOO-FEW-ARGUMENTS +- ANSI-LOOP::LOOP-CONTEXT SYSTEM::READ-EVALUATED-FORM +- SYSTEM::ALL-TRACE-DECLARATIONS +- COMMON-LISP::LISP-IMPLEMENTATION-VERSION +- SYSTEM::DEFAULT-SYSTEM-BANNER ANSI-LOOP::LOOP-DO-RETURN +- SYSTEM::INSPECT-INDENT-1 SYSTEM::STEP-READ-LINE +- SYSTEM::SET-ENV SYSTEM::DM-TOO-MANY-ARGUMENTS +- ANSI-LOOP::LOOP-BIND-BLOCK SLOOP::PARSE-LOOP1 +- ANSI-LOOP::LOOP-DO-NAMED SLOOP::PARSE-LOOP-COLLECT +- SYSTEM::KCL-TOP-RESTARTS SYSTEM::INSPECT-READ-LINE +- SYSTEM::SET-UP-TOP-LEVEL SYSTEM::SHOW-RESTARTS SYSTEM::DBL +- SLOOP::PARSE-LOOP-FOR ANSI-LOOP::LOOP-ITERATION-DRIVER +- ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ANSI-LOOP::LOOP-DO-DO +- SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::GET-TEMP-DIR +- ANSI-LOOP::LOOP-POP-SOURCE SLOOP::LOOP-UN-POP +- SYSTEM::TOP-LEVEL ANSI-LOOP::LOOP-DO-FINALLY +- ANSI-LOOP::LOOP-DO-INITIALLY SYSTEM::GET-INDEX-NODE +- SYSTEM::SETUP-LINEINFO SLOOP::PARSE-LOOP-WHEN SYSTEM::CLEANUP +- ANSI-LOOP::LOOP-GET-FORM SLOOP::PARSE-LOOP-DO +- SYSTEM::INIT-BREAK-POINTS SLOOP::LOOP-PEEK +- SYSTEM::GET-SIG-FN-NAME SYSTEM::ILLEGAL-BOA)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE ++ SYSTEM::S-DATA-LENGTH SYSTEM::THE-START)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ SYSTEM::MATCH-BEGINNING SYSTEM::MATCH-END)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(SYSTEM::CONDITION-CLASS-P SYSTEM::WARNINGP SYSTEM::SI-CLASS-OF ++ SYSTEM::SI-FIND-CLASS SYSTEM::DEFINE-STRUCTURE ++ FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS ++ SYSTEM::SIMPLE-CONDITION-CLASS-P SYSTEM::AUTOLOAD ++ SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASS-NAME ++ SYSTEM::TRACE-ONE SYSTEM::MAKE-ACCESS-FUNCTION ++ SYSTEM::UNTRACE-ONE SYSTEM::SI-CLASSP SYSTEM::CONDITIONP ++ SYSTEM::AUTOLOAD-MACRO)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- SYSTEM::SMALLNTHCDR)) ++ SYSTEM::GET-CONTEXT SYSTEM::PUSH-CONTEXT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::FIXNUM) +- SYSTEM::THE-END ANSI-LOOP::DUPLICATABLE-CODE-P +- SYSTEM::RELATIVE-LINE SYSTEM::GET-NODE-INDEX)) ++ SYSTEM::RELATIVE-LINE SYSTEM::LENEL SYSTEM::THE-END ++ ANSI-LOOP::DUPLICATABLE-CODE-P SYSTEM::FASLINK ++ SYSTEM::GET-NODE-INDEX)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ SLOOP::PARSE-ONE-WHEN-CLAUSE ANSI-LOOP::LOOP-DO-FINALLY ++ SLOOP::LOOP-PEEK ANSI-LOOP::LOOP-DO-INITIALLY SLOOP::LOOP-POP ++ ANSI-LOOP::LOOP-GET-PROGN SYSTEM::KCL-TOP-RESTARTS ++ SYSTEM::INSPECT-READ-LINE SLOOP::PARSE-LOOP-WHEN ++ ANSI-LOOP::LOOP-GET-FORM SYSTEM::DEFAULT-SYSTEM-BANNER ++ SYSTEM::SET-UP-TOP-LEVEL SYSTEM::GET-INDEX-NODE ++ ANSI-LOOP::LOOP-DO-DO ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ++ SYSTEM::SETUP-LINEINFO COMMON-LISP::TYPE-ERROR ++ SYSTEM::READ-EVALUATED-FORM SYSTEM::INSPECT-INDENT-1 ++ SLOOP::LOOP-UN-POP SLOOP::PARSE-LOOP-DO ++ ANSI-LOOP::LOOP-DO-WITH SYSTEM::INSPECT-INDENT ++ SYSTEM::GET-TEMP-DIR ANSI-LOOP::LOOP-ITERATION-DRIVER ++ SYSTEM::WINE-TMP-REDIRECT SLOOP::PARSE-LOOP-COLLECT ++ SYSTEM::DEFAULT-INFO-HOTLIST SLOOP::PARSE-LOOP1 ++ SYSTEM::CLEANUP ANSI-LOOP::LOOP-DO-NAMED SYSTEM::DBL ++ SYSTEM::ALL-TRACE-DECLARATIONS SYSTEM::TEST-ERROR ++ ANSI-LOOP::LOOP-BIND-BLOCK ANSI-LOOP::LOOP-DO-REPEAT ++ SYSTEM::ILLEGAL-BOA SYSTEM::SET-ENV SYSTEM::SET-CURRENT ++ SYSTEM::INIT-BREAK-POINTS SYSTEM::GET-SIG-FN-NAME ++ ANSI-LOOP::LOOP-DO-RETURN ANSI-LOOP::LOOP-CONTEXT ++ SYSTEM::SHOW-RESTARTS SYSTEM::STEP-READ-LINE ++ SLOOP::PARSE-LOOP-FOR SYSTEM::DM-TOO-MANY-ARGUMENTS ++ COMMON-LISP::LISP-IMPLEMENTATION-VERSION SYSTEM::TOP-LEVEL ++ ANSI-LOOP::LOOP-POP-SOURCE SYSTEM::DM-TOO-FEW-ARGUMENTS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM) +- COMMON-LISP::FIXNUM) +- SYSTEM::ROUND-UP)) ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) ++ COMMON-LISP::T) ++ SYSTEM::RESET-SYS-PATHS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VECTOR COMMON-LISP::T)) ++ SYSTEM::CONTEXT-VEC)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ SYSTEM::BREAK-HELP SYSTEM::BREAK-MESSAGE ++ SYSTEM::SIMPLE-BACKTRACE ANSI-LOOP::LOOP-DO-FOR ++ SYSTEM::BREAK-CURRENT SYSTEM::GCL-TOP-LEVEL ++ SYSTEM::BREAK-RESUME)) +\ No newline at end of file +--- gcl-2.6.12.orig/o/alloc.c ++++ gcl-2.6.12/o/alloc.c +@@ -447,7 +447,6 @@ set_tm_maxpage(struct typemanager *tm,fi + + fixnum r=tm->tm_type==t_relocatable,j=tm->tm_maxpage,z=(n-j)*(r ? 2 : 1); + if (z>available_pages) return 0; +- if (r && 2*n+page(rb_start)>real_maxpage) return 0; + available_pages-=z; + tm->tm_adjgbccnt*=((double)j+1)/(n+1); + tm->tm_maxpage=n; +@@ -909,7 +908,7 @@ alloc_after_reclaiming_pages(struct type + + fixnum m=tpage(tm,n),reloc_min; + +- if (tm->tm_type>=t_end) return NULL; ++ if (tm->tm_type>t_end) return NULL; + + reloc_min=npage(rb_pointer-rb_start); + +@@ -925,6 +924,8 @@ alloc_after_reclaiming_pages(struct type + + } + ++ if (tm->tm_type>=t_end) return NULL; ++ + maybe_reallocate_page(tm,tm->tm_percent_free*tm->tm_npage); + + return alloc_from_freelist(tm,n); +@@ -1093,8 +1094,7 @@ DEFUNM_NEW("ALLOCATED",object,fSallocate + RV(make_fixnum(tm->tm_maxpage)), + RV(make_fixnum(tm->tm_nppage)), + RV(make_fixnum(tm->tm_gbccount)), +- RV(make_fixnum(tm->tm_npage*tm->tm_nppage-tm->tm_nfree)) +- )); ++ RV(make_fixnum(tm->tm_npage*tm->tm_nppage-tm->tm_nfree)))); + } + + #ifdef SGC_CONT_DEBUG +@@ -1658,7 +1658,7 @@ DEFUN_NEW("GPROF-QUIT",object,fSgprof_qu + massert(getcwd(b,sizeof(b))); + massert(!chdir(P_tmpdir)); + _mcleanup(); +- massert(snprintf(b1,sizeof(b1),"gprof %s",kcl_self)>0); ++ massert(snprintf(b1,sizeof(b1),"gprof '%s'",kcl_self)>0); + massert((pp=popen(b1,"r"))); + while ((n=fread(b1,1,sizeof(b1),pp))) + massert(fwrite(b1,1,n,stdout)); +--- gcl-2.6.12.orig/o/array.c ++++ gcl-2.6.12/o/array.c +@@ -1139,9 +1139,9 @@ Icheck_displaced(object displaced_list, + /* } */ + /* } */ + +-DEFUNO_NEW("REPLACE-ARRAY",object,fSreplace_array,SI,2,2,NONE, +- OO,OO,OO,OO,void,siLreplace_array,(object old,object new),"") +-{ struct dummy fw ; ++DEFUN_NEW("REPLACE-ARRAY",object,fSreplace_array,SI,2,2,NONE,OO,OO,OO,OO,(object old,object new),"") { ++ ++ struct dummy fw; + fw = old->d; + + old = IisArray(old); +--- gcl-2.6.12.orig/o/bind.c ++++ gcl-2.6.12/o/bind.c +@@ -24,7 +24,6 @@ Foundation, 675 Mass Ave, Cambridge, MA + */ + + #include "include.h" +-#include + + static void + illegal_lambda(void); +@@ -95,17 +94,19 @@ lambda_bind(object *arg_top) + struct aux *aux=NULL; + int naux; + bool special_processed; ++ object s[1],ss; + vs_mark; + + bds_check; + lambda = vs_head; +- if (type_of(lambda) != t_cons) ++ if (!consp(lambda)) + FEerror("No lambda list.", 0); + lambda_list = lambda->c.c_car; + body = lambda->c.c_cdr; + + required = (struct required *)vs_top; + nreq = 0; ++ s[0]=Cnil; + for (;;) { + if (endp(lambda_list)) + goto REQUIRED_ONLY; +@@ -152,7 +153,7 @@ OPTIONAL: + goto SEARCH_DECLARE; + x = lambda_list->c.c_car; + lambda_list = lambda_list->c.c_cdr; +- if (type_of(x) == t_cons) { ++ if (consp(x)) { + check_symbol(x->c.c_car); + check_var(x->c.c_car); + vs_push(x->c.c_car); +@@ -226,9 +227,9 @@ KEYWORD: + goto SEARCH_DECLARE; + x = lambda_list->c.c_car; + lambda_list = lambda_list->c.c_cdr; +- if (type_of(x) == t_cons) { +- if (type_of(x->c.c_car) == t_cons) { +- if (!keywordp(x->c.c_car->c.c_car)) ++ if (consp(x)) { ++ if (consp(x->c.c_car)) { ++ if (type_of(x->c.c_car->c.c_car)!=t_symbol) + /* FIXME better message */ + FEunexpected_keyword(x->c.c_car->c.c_car); + vs_push(x->c.c_car->c.c_car); +@@ -296,7 +297,7 @@ AUX_L: + goto SEARCH_DECLARE; + x = lambda_list->c.c_car; + lambda_list = lambda_list->c.c_cdr; +- if (type_of(x) == t_cons) { ++ if (consp(x)) { + check_symbol(x->c.c_car); + check_var(x->c.c_car); + vs_push(x->c.c_car); +@@ -336,10 +337,10 @@ SEARCH_DECLARE: + break; + continue; + } +- if (type_of(form)!=t_cons || !isdeclare(form->c.c_car)) ++ if (!consp(form) || !isdeclare(form->c.c_car)) + break; + for (ds = form->c.c_cdr; !endp(ds); ds = ds->c.c_cdr) { +- if (type_of(ds->c.c_car) != t_cons) ++ if (!consp(ds->c.c_car)) + illegal_declare(form); + if (ds->c.c_car->c.c_car == sLspecial) { + vs = ds->c.c_car->c.c_cdr; +@@ -381,8 +382,7 @@ SEARCH_DECLARE: + } + if (special_processed) + continue; +- /* lex_special_bind(v); */ +- lex_env[0] = MMcons(MMcons(v, Cnil), lex_env[0]); ++ s[0] = MMcons(MMcons(v, Cnil), s[0]); + + /**/ + } +@@ -437,17 +437,20 @@ SEARCH_DECLARE: + bind_var(rest->rest_var, vs_head, rest->rest_spp); + } + if (key_flag) { ++ int allow_other_keys_found=0; + i = narg - nreq - nopt; + if (i >= 0 && i%2 != 0) + /* FIXME better message */ + FEunexpected_keyword(Cnil); + other_keys_appeared = FALSE; + for (i = nreq + nopt; i < narg; i += 2) { +- if (!keywordp(base[i])) ++ if (type_of(base[i])!=t_symbol) + FEunexpected_keyword(base[i]); +- if (base[i] == sKallow_other_keys && +- base[i+1] != Cnil) ++ if (base[i] == sKallow_other_keys && !allow_other_keys_found) { ++ allow_other_keys_found=1; ++ if (base[i+1] != Cnil) + allow_other_keys_flag = TRUE; ++ } + for (j = 0; j < nkey; j++) { + if (keyword[j].key_word == base[i]) { + if (keyword[j].key_svar_val +@@ -460,7 +463,8 @@ SEARCH_DECLARE: + goto NEXT_ARG; + } + } +- other_keys_appeared = TRUE; ++ if (base[i] != sKallow_other_keys) ++ other_keys_appeared = TRUE; + + NEXT_ARG: + continue; +@@ -492,7 +496,7 @@ SEARCH_DECLARE: + eval_assign(temporary, aux[i].aux_init); + bind_var(aux[i].aux_var, temporary, aux[i].aux_spp); + } +- if (type_of(body) != t_cons || body->c.c_car == form) { ++ if (!consp(body) || body->c.c_car == form) { + vs_reset; + vs_head = body; + } else { +@@ -500,6 +504,13 @@ SEARCH_DECLARE: + vs_reset; + vs_head = body; + } ++ ++ if (s[0]!=Cnil) { ++ for (ss=s[0];ss->c.c_cdr!=Cnil;ss=ss->c.c_cdr); ++ ss->c.c_cdr=lex_env[0]; ++ lex_env[0]=s[0]; ++ } ++ + return; + + REQUIRED_ONLY: +@@ -515,10 +526,10 @@ REQUIRED_ONLY: + break; + continue; + } +- if (type_of(form)!=t_cons || !isdeclare(form->c.c_car)) ++ if (!consp(form) || !isdeclare(form->c.c_car)) + break; + for (ds = form->c.c_cdr; !endp(ds); ds = ds->c.c_cdr) { +- if (type_of(ds->c.c_car) != t_cons) ++ if (!consp(ds->c.c_car)) + illegal_declare(form); + if (ds->c.c_car->c.c_car == sLspecial) { + vs = ds->c.c_car->c.c_cdr; +@@ -537,7 +548,7 @@ REQUIRED_ONLY: + continue; + /* lex_special_bind(v); */ + temporary = MMcons(v, Cnil); +- lex_env[0] = MMcons(temporary, lex_env[0]); ++ s[0] = MMcons(temporary, s[0]); + + /**/ + } +@@ -555,7 +566,7 @@ REQUIRED_ONLY: + bind_var(required[i].req_var, + base[i], + required[i].req_spp); +- if (type_of(body) != t_cons || body->c.c_car == form) { ++ if (!consp(body) || body->c.c_car == form) { + vs_reset; + vs_head = body; + } else { +@@ -563,6 +574,13 @@ REQUIRED_ONLY: + vs_reset; + vs_head = body; + } ++ ++ if (s[0]!=Cnil) { ++ for (ss=s[0];ss->c.c_cdr!=Cnil;ss=ss->c.c_cdr); ++ ss->c.c_cdr=lex_env[0]; ++ lex_env[0]=s[0]; ++ } ++ + } + + void +@@ -612,7 +630,7 @@ struct bind_temp { + */ + + object +-find_special(object body, struct bind_temp *start, struct bind_temp *end) ++find_special(object body, struct bind_temp *start, struct bind_temp *end,object *s) + { + object temporary; + object form=Cnil; +@@ -622,6 +640,7 @@ find_special(object body, struct bind_te + vs_mark; + + vs_push(Cnil); ++ s=s ? s : lex_env; + for (; !endp(body); body = body->c.c_cdr) { + form = body->c.c_car; + +@@ -634,10 +653,10 @@ find_special(object body, struct bind_te + break; + continue; + } +- if (type_of(form)!=t_cons || !isdeclare(form->c.c_car)) ++ if (!consp(form) || !isdeclare(form->c.c_car)) + break; + for (ds = form->c.c_cdr; !endp(ds); ds = ds->c.c_cdr) { +- if (type_of(ds->c.c_car) != t_cons) ++ if (!consp(ds->c.c_car)) + illegal_declare(form); + if (ds->c.c_car->c.c_car == sLspecial) { + vs = ds->c.c_car->c.c_cdr; +@@ -655,14 +674,14 @@ find_special(object body, struct bind_te + continue; + /* lex_special_bind(v); */ + temporary = MMcons(v, Cnil); +- lex_env[0] = MMcons(temporary, lex_env[0]); ++ s[0] = MMcons(temporary, s[0]); + /**/ + } + } + } + } + +- if (body != Cnil && body->c.c_car != form) ++ if (body != Cnil && body->c.c_car != form && type_of(form)==t_cons && isdeclare(form->c.c_car))/*FIXME*/ + body = make_cons(form, body->c.c_cdr); + vs_reset; + return(body); +@@ -674,10 +693,10 @@ let_bind(object body, struct bind_temp * + struct bind_temp *bt; + + bds_check; +- vs_push(find_special(body, start, end)); + for (bt = start; bt < end; bt++) { + eval_assign(bt->bt_init, bt->bt_init); + } ++ vs_push(find_special(body, start, end,NULL)); + for (bt = start; bt < end; bt++) { + bind_var(bt->bt_var, bt->bt_init, bt->bt_spp); + } +@@ -688,13 +707,20 @@ object + letA_bind(object body, struct bind_temp *start, struct bind_temp *end) + { + struct bind_temp *bt; +- ++ object s[1],ss; ++ + bds_check; +- vs_push(find_special(body, start, end)); ++ s[0]=Cnil; ++ vs_push(find_special(body, start, end,s)); + for (bt = start; bt < end; bt++) { + eval_assign(bt->bt_init, bt->bt_init); + bind_var(bt->bt_var, bt->bt_init, bt->bt_spp); + } ++ if (s[0]!=Cnil) { ++ for (ss=s[0];ss->c.c_cdr!=Cnil;ss=ss->c.c_cdr); ++ ss->c.c_cdr=lex_env[0]; ++ lex_env[0]=s[0]; ++ } + return(vs_pop); + } + +@@ -703,12 +729,12 @@ letA_bind(object body, struct bind_temp + + #endif + +-#define NOT_YET 10 +-#define FOUND 11 ++#define NOT_YET stp_ordinary ++#define FOUND stp_special + #define NOT_KEYWORD 1 + + void +-parse_key(object *base, bool rest, bool allow_other_keys,int n, ...) ++parse_key(object *base, bool rest, bool allow_other_keys, int n, ...) + { + object temporary; + va_list ap; +@@ -735,7 +761,7 @@ parse_key(object *base, bool rest, bool + FEunexpected_keyword(Cnil); + if (narg == 2) { + k = base[0]; +- if (!keywordp(k)) ++ if (type_of(k)!=t_symbol) + FEunexpected_keyword(k); + if (k == sKallow_other_keys && ! allow_other_keys_found) { + allow_other_keys_found=1; +@@ -777,7 +803,7 @@ parse_key(object *base, bool rest, bool + va_end(ap); + for (v = base; v < vs_top; v += 2) { + k = v[0]; +- if (!keywordp(k)) { ++ if (type_of(k)!=t_symbol) { + error_flag = NOT_KEYWORD; + other_key = k; + continue; +@@ -827,16 +853,19 @@ check_other_key(object l, int n, ...) + object k; + int i; + bool allow_other_keys = FALSE; ++ int allow_other_keys_found=0; + + for (; !endp(l); l = l->c.c_cdr->c.c_cdr) { + k = l->c.c_car; +- if (!keywordp(k)) ++ if (type_of(k)!=t_symbol) + FEunexpected_keyword(k); + if (endp(l->c.c_cdr)) + /* FIXME better message */ + FEunexpected_keyword(Cnil); +- if (k == sKallow_other_keys && l->c.c_cdr->c.c_car != Cnil) { +- allow_other_keys = TRUE; ++ if (k == sKallow_other_keys && !allow_other_keys_found) { ++ allow_other_keys_found=1; ++ if (l->c.c_cdr->c.c_car != Cnil) ++ allow_other_keys = TRUE; + } else { + char buf [100]; + bzero(buf,n); +@@ -1110,7 +1139,7 @@ gcl_init_bind(void) + make_cons(make_ordinary("&BODY"), Cnil))))))))); + + make_constant("LAMBDA-PARAMETERS-LIMIT", +- make_fixnum(64)); ++ make_fixnum(MAX_ARGS+1)); + + + +--- gcl-2.6.12.orig/o/error.c ++++ gcl-2.6.12/o/error.c +@@ -490,49 +490,78 @@ vfun_wrong_number_of_args(object x) + + + void +-check_arg_range(int n, int m) +-{ +- object x,x1; ++check_arg_range(int n, int m) { + +- x=make_fixnum(n); +- x1=make_fixnum(VFUN_NARGS); + if (VFUN_NARGS < n) +- Icall_error_handler( +- sKtoo_few_arguments, +- make_simple_string("Needed at least ~D args, but received ~d"), +- 2,x,x1); +- else if (VFUN_NARGS > m) +- Icall_error_handler( +- sKtoo_many_arguments, +- make_simple_string("Needed no more than ~D args, but received ~d"), +- 2,x,x1); +- } ++ FEtoo_few_arguments(0,VFUN_NARGS); ++ if (VFUN_NARGS > m) ++ FEtoo_many_arguments(0,VFUN_NARGS); ++ ++} + + + DEF_ORDINARY("TERMINAL-INTERRUPT",sSterminal_interrupt,SI,""); +-DEF_ORDINARY("WRONG-TYPE-ARGUMENT",sKwrong_type_argument,KEYWORD,""); +-DEF_ORDINARY("TOO-FEW-ARGUMENTS",sKtoo_few_arguments,KEYWORD,""); +-DEF_ORDINARY("TOO-MANY-ARGUMENTS",sKtoo_many_arguments,KEYWORD,""); +-DEF_ORDINARY("UNEXPECTED-KEYWORD",sKunexpected_keyword,KEYWORD,""); +-DEF_ORDINARY("INVALID-FORM",sKinvalid_form,KEYWORD,""); +-DEF_ORDINARY("UNBOUND-VARIABLE",sKunbound_variable,KEYWORD,""); +-DEF_ORDINARY("INVALID-VARIABLE",sKinvalid_variable,KEYWORD,""); +-DEF_ORDINARY("UNDEFINED-FUNCTION",sKundefined_function,KEYWORD,""); +-DEF_ORDINARY("INVALID-FUNCTION",sKinvalid_function,KEYWORD,""); +-DEF_ORDINARY("PACKAGE-ERROR",sKpackage_error,KEYWORD,""); +-DEF_ORDINARY("DATUM",sKdatum,KEYWORD,""); +-DEF_ORDINARY("EXPECTED-TYPE",sKexpected_type,KEYWORD,""); +-DEF_ORDINARY("PACKAGE",sKpackage,KEYWORD,""); +-DEF_ORDINARY("FORMAT-CONTROL",sKformat_control,KEYWORD,""); +-DEF_ORDINARY("FORMAT-ARGUMENTS",sKformat_arguments,KEYWORD,""); + DEF_ORDINARY("CATCH",sKcatch,KEYWORD,""); + DEF_ORDINARY("PROTECT",sKprotect,KEYWORD,""); + DEF_ORDINARY("CATCHALL",sKcatchall,KEYWORD,""); + + ++DEF_ORDINARY("CONDITION",sLcondition,LISP,""); ++DEF_ORDINARY("SERIOUS-CONDITION",sLserious_condition,LISP,""); ++DEF_ORDINARY("SIMPLE-CONDITION",sLsimple_condition,LISP,""); ++ ++DEF_ORDINARY("ERROR",sLerror,LISP,""); ++DEF_ORDINARY("SIMPLE-ERROR",sLsimple_error,LISP,""); ++DEF_ORDINARY("FORMAT-CONTROL",sKformat_control,KEYWORD,""); ++DEF_ORDINARY("FORMAT-ARGUMENTS",sKformat_arguments,KEYWORD,""); ++ ++DEF_ORDINARY("TYPE-ERROR",sLtype_error,LISP,""); ++DEF_ORDINARY("DATUM",sKdatum,KEYWORD,""); ++DEF_ORDINARY("EXPECTED-TYPE",sKexpected_type,KEYWORD,""); ++DEF_ORDINARY("SIMPLE-TYPE-ERROR",sLsimple_type_error,LISP,""); ++ ++DEF_ORDINARY("PROGRAM-ERROR",sLprogram_error,LISP,""); ++DEF_ORDINARY("CONTROL-ERROR",sLcontrol_error,LISP,""); ++DEF_ORDINARY("PACKAGE-ERROR",sLpackage_error,LISP,""); ++DEF_ORDINARY("PACKAGE",sKpackage,KEYWORD,""); ++ ++DEF_ORDINARY("STREAM-ERROR",sLstream_error,LISP,""); ++DEF_ORDINARY("STREAM",sKstream,KEYWORD,""); ++DEF_ORDINARY("END-OF-FILE",sLend_of_file,LISP,""); ++ ++DEF_ORDINARY("FILE-ERROR",sLfile_error,LISP,""); ++DEF_ORDINARY("PATHNAME",sKpathname,KEYWORD,""); ++ ++DEF_ORDINARY("CELL-ERROR",sLcell_error,LISP,""); ++DEF_ORDINARY("NAME",sKname,KEYWORD,""); ++DEF_ORDINARY("UNBOUND-SLOT",sLunbound_slot,LISP,""); ++DEF_ORDINARY("UNBOUND-VARIABLE",sLunbound_variable,LISP,""); ++DEF_ORDINARY("UNDEFINED-FUNCTION",sLundefined_function,LISP,""); ++ ++DEF_ORDINARY("ARITHMETIC-ERROR",sLarithmetic_error,LISP,""); ++DEF_ORDINARY("OPERATION",sKoperation,KEYWORD,""); ++DEF_ORDINARY("OPERANDS",sKoperands,KEYWORD,""); ++DEF_ORDINARY("DIVISION-BY-ZERO",sLdivision_by_zero,LISP,""); ++DEF_ORDINARY("FLOATING-POINT-OVERFLOW",sLfloating_point_overflow,LISP,""); ++DEF_ORDINARY("FLOATING-POINT-UNDERFLOW",sLfloating_point_underflow,LISP,""); ++DEF_ORDINARY("FLOATING-POINT-INEXACT",sLfloating_point_inexact,LISP,""); ++DEF_ORDINARY("FLOATING-POINT-INVALID-OPERATION",sLfloating_point_invalid_operation,LISP,""); ++ ++DEF_ORDINARY("PARSE-ERROR",sLparse_error,LISP,""); ++ ++DEF_ORDINARY("PRINT-NOT-READABLE",sLprint_not_readable,LISP,""); ++ ++DEF_ORDINARY("READER-ERROR",sLreader_error,LISP,""); ++DEF_ORDINARY("PATHNAME-ERROR",sLpathname_error,SI,""); ++ ++DEF_ORDINARY("STORAGE-CONDITION",sLstorage_condition,LISP,""); ++ ++DEF_ORDINARY("WARNING",sLwarning,LISP,""); ++DEF_ORDINARY("SIMPLE-WARNING",sLsimple_warning,LISP,""); ++DEF_ORDINARY("STYLE-WARNING",sLstyle_warning,LISP,""); ++ + void +-gcl_init_error(void) +-{ +- null_string = make_simple_string(""); +- enter_mark_origin(&null_string); ++gcl_init_error(void) { ++ null_string = make_simple_string(""); ++ enter_mark_origin(&null_string); + } +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -1501,14 +1501,12 @@ read_fasl_vector(object in) + object d; + int tem; + if (((tem=getc(((FILE *)in->sm.sm_fp))) == EOF) && feof(((FILE *)in->sm.sm_fp))) +- { d = coerce_to_pathname(in); +- d = make_pathname(d->pn.pn_host, +- d->pn.pn_device, +- d->pn.pn_directory, +- d->pn.pn_name, +- make_simple_string("data"), +- d->pn.pn_version); +- d = coerce_to_namestring(d); ++ { char *pf; ++ coerce_to_filename(in,FN1); ++ for (pf=FN1+strlen(FN1);pf>FN1 && pf[-1]!='.';pf--); ++ if (pf==FN1) {pf=FN1+strlen(FN1);*pf++='.';} ++ snprintf(pf,sizeof(FN1)-(pf-FN1),"data"); ++ d=make_simple_string(FN1); + in = open_stream(d,smm_input,Cnil,Cnil); + if (in == Cnil) + FEerror("Can't open file ~s",1,d); +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -138,7 +138,7 @@ void + end_of_stream(strm) + object strm; + { +- FEerror("Unexpected end of ~S.", 1, strm); ++ END_OF_FILE(strm); + } + + /* +@@ -167,6 +167,7 @@ BEGIN: + case smm_probe: + return(FALSE); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -223,6 +224,7 @@ BEGIN: + case smm_probe: + return(FALSE); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -270,6 +272,7 @@ BEGIN: + case smm_socket: + return (sLcharacter); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -341,220 +344,208 @@ cannot_create(object); + Fn is a namestring. + */ + object +-open_stream(fn, smm, if_exists, if_does_not_exist) +-object fn; +-enum smmode smm; +-object if_exists, if_does_not_exist; +-{ +- object x; +- FILE *fp=NULL; +- char fname[PATH_MAX]; +- object unzipped = 0; +- vs_mark; ++open_stream(object fn,enum smmode smm, object if_exists, object if_does_not_exist) { + +-/* +- if (type_of(fn) != t_string) +- FEwrong_type_argument(sLstring, fn); +-*/ +- /* if (fn->st.st_fillp > BUFSIZ - 1) */ +- /* too_long_file_name(fn); */ +- /* for (i = 0; i < fn->st.st_fillp; i++) */ +- /* fname[i] = fn->st.st_self[i]; */ +- +- /* fname[i] = '\0'; */ +- coerce_to_filename(fn,fname); +- if (smm == smm_input || smm == smm_probe) { +- if(fname[0]=='|') +- fp = popen(fname+1,"r"); +- else +- fp = fopen_not_dir(fname, "r"); +- +- AGAIN: +- if (fp == NULL) { +- if (sSAallow_gzipped_fileA->s.s_dbind != sLnil) +- { +- static struct string st; +- char buf[256]; +- if (snprintf(buf,sizeof(buf),"%s.gz",fname)<=0) +- FEerror("Cannot write .gz filename",0); +- st.st_self=buf; +- st.st_dim=st.st_fillp=strlen(buf); +- set_type_of(&st,t_string); +- if (file_exists((object)&st)) { +- FILE *pp; +- int n; +- if (!(fp=tmpfile())) +- FEerror("Cannot create temporary file",0); +- if (snprintf(buf,sizeof(buf),"zcat %s.gz",fname)<=0) +- FEerror("Cannot write zcat pipe name",0); +- if (!(pp=popen(buf,"r"))) +- FEerror("Cannot open zcat pipe",0); +- while((n=fread(buf,1,sizeof(buf),pp))) +- if (!fwrite(buf,1,n,fp)) +- FEerror("Cannot write pipe output to temporary file",0); +- if (pclose(pp)<0) +- FEerror("Cannot close zcat pipe",0); +- if (fseek(fp,0,SEEK_SET)) +- FEerror("Cannot rewind temporary file\n",0); +- goto AGAIN; +- } +- } +- +-/* fp = fopen_not_dir(buf,"r"); */ +-/* if (fp) */ +-/* { */ +-/* #ifdef NO_MKSTEMP */ +-/* char *tmp; */ +-/* #else */ +-/* char tmp[200]; */ +-/* #endif */ +-/* char command [500]; */ +-/* fclose(fp); */ +-/* #ifdef NO_MKSTEMP */ +-/* tmp = tmpnam(0); */ +-/* #else */ +-/* snprintf(tmp,sizeof(tmp),"uzipXXXXXX"); */ +- /* mkstemp(tmp); */ /* fixme: catch errors */ +-/* #endif */ +-/* unzipped = make_simple_string(tmp); */ +-/* sprintf(command,"gzip -dc %s > %s",buf,tmp); */ +-/* fp = 0; */ +-/* if (0 == system(command)) */ +-/* { */ +-/* fp = fopen_not_dir(tmp,"r"); */ +-/* if (fp) */ +-/* goto AGAIN; */ +-/* /\* should not get here *\/ */ +-/* else { unlink(tmp);}} */ +-/* }} */ +- if (if_does_not_exist == sKerror) +- cannot_open(fn); +- else if (if_does_not_exist == sKcreate) { +- fp = fopen_not_dir(fname, "w"); +- if (fp == NULL) +- cannot_create(fn); +- fclose(fp); +- fp = fopen_not_dir(fname, "r"); +- if (fp == NULL) +- cannot_open(fn); +- } else if (if_does_not_exist == Cnil) +- return(Cnil); +- else +- FEerror("~S is an illegal IF-DOES-NOT-EXIST option.", +- 1, if_does_not_exist); +- } +- } else if (smm == smm_output || smm == smm_io) { +- if (if_exists == sKnew_version && if_does_not_exist == sKcreate) +- goto CREATE; +- fp = fopen_not_dir(fname, "r"); +- if (fp != NULL) { +- fclose(fp); +- if (if_exists == sKerror) +- FEerror("The file ~A already exists.", 1, fn); +- else if (if_exists == sKrename) { +- if (smm == smm_output) +- fp = backup_fopen(fname, "w"); +- else +- fp = backup_fopen(fname, "w+"); +- if (fp == NULL) +- cannot_create(fn); +- } else if (if_exists == sKrename_and_delete || +- if_exists == sKnew_version || +- if_exists == sKsupersede) { +- if (smm == smm_output) +- fp = fopen_not_dir(fname, "w"); +- else +- fp = fopen_not_dir(fname, "w+"); +- if (fp == NULL) +- cannot_create(fn); +- } else if (if_exists == sKoverwrite) { +- fp = fopen_not_dir(fname, "r+"); +- if (fp == NULL) +- cannot_open(fn); +- } else if (if_exists == sKappend) { +- if (smm == smm_output) +- fp = fopen_not_dir(fname, "a"); +- else +- fp = fopen_not_dir(fname, "a+"); +- if (fp == NULL) +- FEerror("Cannot append to the file ~A.",1,fn); +- } else if (if_exists == Cnil) +- return(Cnil); +- else +- FEerror("~S is an illegal IF-EXISTS option.", +- 1, if_exists); +- } else { +- if (if_does_not_exist == sKerror) +- FEerror("The file ~A does not exist.", 1, fn); +- else if (if_does_not_exist == sKcreate) { +- CREATE: +- if (smm == smm_output) +- { +- if(fname[0]=='|') +- fp = popen(fname+1,"w"); +- else +- fp = fopen_not_dir(fname, "w"); +- } +- else +- fp = fopen_not_dir(fname, "w+"); +- if (fp == NULL) +- cannot_create(fn); +- } else if (if_does_not_exist == Cnil) +- return(Cnil); +- else +- FEerror("~S is an illegal IF-DOES-NOT-EXIST option.", +- 1, if_does_not_exist); +- } ++ object x; ++ FILE *fp=NULL; ++ vs_mark; ++ ++ coerce_to_filename(fn,FN1); ++ if (smm == smm_input || smm == smm_probe) { ++ if(FN1[0]=='|') ++ fp = popen(FN1+1,"r"); ++ else ++ fp = fopen_not_dir(FN1, "r"); ++ ++ if ((fp == NULL) && ++ (sSAallow_gzipped_fileA->s.s_dbind != sLnil)) { ++ union lispunion st; ++ char buf[256]; ++ if (snprintf(buf,sizeof(buf),"%s.gz",FN1)<=0) ++ FEerror("Cannot write .gz filename",0); ++ st.st.st_self=buf; ++ st.st.st_dim=st.st.st_fillp=strlen(buf); ++ set_type_of(&st,t_string); ++ if (fSstat((object)&st)!=Cnil) { ++ FILE *pp; ++ int n; ++ if (!(fp=tmpfile())) ++ FEerror("Cannot create temporary file",0); ++ if (snprintf(buf,sizeof(buf),"zcat %s.gz",FN1)<=0) ++ FEerror("Cannot write zcat pipe name",0); ++ if (!(pp=popen(buf,"r"))) ++ FEerror("Cannot open zcat pipe",0); ++ while((n=fread(buf,1,sizeof(buf),pp))) ++ if (!fwrite(buf,1,n,fp)) ++ FEerror("Cannot write pipe output to temporary file",0); ++ if (pclose(pp)<0) ++ FEerror("Cannot close zcat pipe",0); ++ if (fseek(fp,0,SEEK_SET)) ++ FEerror("Cannot rewind temporary file\n",0); ++ } ++ } ++ if (fp == NULL) { ++ if (if_does_not_exist == sKerror) ++ cannot_open(fn); ++ else if (if_does_not_exist == sKcreate) { ++ fp = fopen_not_dir(FN1, "w"); ++ if (fp == NULL) ++ cannot_create(fn); ++ fclose(fp); ++ fp = fopen_not_dir(FN1, "r"); ++ if (fp == NULL) ++ cannot_open(fn); ++ } else if (if_does_not_exist == Cnil) ++ return(Cnil); ++ else ++ FEerror("~S is an illegal IF-DOES-NOT-EXIST option.", ++ 1, if_does_not_exist); ++ } ++ } else if (smm == smm_output || smm == smm_io) { ++ if (FN1[0] == '|') ++ fp = NULL; ++ else ++ fp = fopen_not_dir(FN1, "r"); ++ if (fp != NULL) { ++ fclose(fp); ++ if (if_exists == sKerror) ++ FILE_ERROR(fn,"File exists"); ++ else if (if_exists == sKrename) { ++ massert(snprintf(FN2,sizeof(FN2),"%s.BAK",FN1)>=0); ++ massert(!rename(FN1,FN2)); ++ if (smm == smm_output) ++ fp = fopen(FN1, "w"); ++ else ++ fp = fopen(FN1, "w+"); ++ if (fp == NULL) ++ cannot_create(fn); ++ } else if (if_exists == sKrename_and_delete || ++ if_exists == sKnew_version || ++ if_exists == sKsupersede) { ++ if (smm == smm_output) ++ fp = fopen_not_dir(FN1, "w"); ++ else ++ fp = fopen_not_dir(FN1, "w+"); ++ if (fp == NULL) ++ cannot_create(fn); ++ } else if (if_exists == sKoverwrite) { ++ fp = fopen_not_dir(FN1, "r+"); ++ if (fp == NULL) ++ cannot_open(fn); ++ } else if (if_exists == sKappend) { ++ if (smm == smm_output) ++ fp = fopen_not_dir(FN1, "a"); ++ else ++ fp = fopen_not_dir(FN1, "a+"); ++ if (fp == NULL) ++ FEerror("Cannot append to the file ~A.",1,fn); ++ } else if (if_exists == Cnil) ++ return(Cnil); ++ else ++ FEerror("~S is an illegal IF-EXISTS option.", ++ 1, if_exists); ++ } else { ++ if (if_does_not_exist == sKerror) ++ FILE_ERROR(fn,"The file does not exist"); ++ else if (if_does_not_exist == sKcreate) { ++ if (smm == smm_output) { ++ if(FN1[0]=='|') ++ fp = popen(FN1+1,"w"); ++ else ++ fp = fopen_not_dir(FN1, "w"); + } else +- error("illegal stream mode"); +- x = alloc_object(t_stream); +- x->sm.sm_mode = (short)smm; +- x->sm.sm_fp = fp; ++ fp = fopen_not_dir(FN1, "w+"); ++ if (fp == NULL) ++ cannot_create(fn); ++ } else if (if_does_not_exist == Cnil) ++ return(Cnil); ++ else ++ FEerror("~S is an illegal IF-DOES-NOT-EXIST option.", ++ 1, if_does_not_exist); ++ } ++ } else ++ FEerror("Illegal open mode for ~S.",1,fn); ++ ++ vs_push(make_simple_string(FN1)); ++ x = alloc_object(t_stream); ++ x->sm.sm_mode = (short)smm; ++ x->sm.sm_fp = fp; ++ x->sm.sm_buffer = 0; ++ x->sm.sm_object0 = sLcharacter; ++ x->sm.sm_object1 = vs_head; ++ x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_flags=0; ++ vs_push(x); ++ ++ setup_stream_buffer(x); ++ vs_reset; ++ ++ if (smm==smm_probe) ++ close_stream(x); ++ ++ return(x); + +- x->sm.sm_buffer = 0; +- x->sm.sm_object0 = (unzipped ? make_cons(sSAallow_gzipped_fileA,unzipped) : sLcharacter); +- x->sm.sm_object1 = fn; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; +- vs_push(x); +- setup_stream_buffer(x); +- vs_reset; +- return(x); + } + + static void + gclFlushSocket(object); + ++DEFUN_NEW("OPEN-INT",object,fSopen_int,SI,8,8,NONE,OO,OO,OO,OO, ++ (object fn,object direction,object element_type,object if_exists, ++ object iesp,object if_does_not_exist,object idnesp, ++ object external_format),"") { ++ ++ enum smmode smm=0; ++ vs_mark; ++ object strm,filename; ++ ++ filename=fn; ++ if (direction == sKinput) { ++ smm = smm_input; ++ if (idnesp==Cnil) ++ if_does_not_exist = sKerror; ++ } else if (direction == sKoutput) { ++ smm = smm_output; ++ if (iesp==Cnil) ++ if_exists = sKnew_version; ++ if (idnesp==Cnil) { ++ if (if_exists == sKoverwrite || ++ if_exists == sKappend) ++ if_does_not_exist = sKerror; ++ else ++ if_does_not_exist = sKcreate; ++ } ++ } else if (direction == sKio) { ++ smm = smm_io; ++ if (iesp==Cnil) ++ if_exists = sKnew_version; ++ if (idnesp==Cnil) { ++ if (if_exists == sKoverwrite || ++ if_exists == sKappend) ++ if_does_not_exist = sKerror; ++ else ++ if_does_not_exist = sKcreate; ++ } ++ } else if (direction == sKprobe) { ++ smm = smm_probe; ++ if (idnesp==Cnil) ++ if_does_not_exist = Cnil; ++ } else ++ FEerror("~S is an illegal DIRECTION for OPEN.", 1, direction); ++ strm = open_stream(filename, smm, if_exists, if_does_not_exist); ++ if (type_of(strm) == t_stream) { ++ strm->sm.sm_object0 = element_type; ++ strm->sm.sm_object1 = fn; ++ } ++ vs_reset; ++ RETURN1(strm); ++} + + DEFUN_NEW("OPEN-STREAM-P",object,fLopen_stream_p,LISP,1,1,NONE,OO,OO,OO,OO,(object x),"") { + + check_type_stream(&x); + +- switch(x->sm.sm_mode) { +- case smm_output: +- case smm_input: +- case smm_io: +- case smm_probe: +- case smm_socket: +- case smm_string_input: +- case smm_string_output: +- return x->d.tt==1 ? Cnil : Ct; +- case smm_synonym: +- return FFN(fLopen_stream_p)(symbol_value(x->sm.sm_object0)); +- case smm_broadcast: +- case smm_concatenated: +- for (x=x->sm.sm_object0;!endp(x);x=x->c.c_cdr) +- if (!FFN(fLopen_stream_p)(x)) +- return Cnil; +- return Ct; +- case smm_two_way: +- case smm_echo: +- if (FFN(fLopen_stream_p)(STREAM_INPUT_STREAM(x))==Cnil) +- return Cnil; +- return FFN(fLopen_stream_p)(STREAM_OUTPUT_STREAM(x)); +- default: +- error("illegal stream mode"); +- return Cnil; +- } ++ return GET_STREAM_FLAG(x,gcl_sm_closed) ? Cnil : Ct; + + } + /* +@@ -562,94 +553,132 @@ DEFUN_NEW("OPEN-STREAM-P",object,fLopen_ + The abort_flag is not used now. + */ + void +-close_stream(strm) +-object strm; +-/*bool abort_flag; */ /* Not used now! */ +-{ +- object x; ++close_stream(object strm) { + +-BEGIN: +- strm->d.tt=1; ++ object x; + +- switch (strm->sm.sm_mode) { +- case smm_output: +- if (strm->sm.sm_fp == stdout) +- FEerror("Cannot close the standard output.", 0); +- if (strm->sm.sm_fp == NULL) break; +- fflush(strm->sm.sm_fp); +- deallocate_stream_buffer(strm); +- fclose(strm->sm.sm_fp); +- strm->sm.sm_fp = NULL; +- break; ++ if (FFN(fLopen_stream_p)(strm)==Cnil) ++ return; + ++ switch (strm->sm.sm_mode) { ++ case smm_output: ++ if (strm->sm.sm_fp == stdout) ++ FEerror("Cannot close the standard output.", 0); ++ fflush(strm->sm.sm_fp); ++ deallocate_stream_buffer(strm); ++ fclose(strm->sm.sm_fp); ++ strm->sm.sm_fp = NULL; ++ strm->sm.sm_fd = -1; ++ break; + +- case smm_socket: +- if (SOCKET_STREAM_FD(strm) < 2) +- emsg("tried Closing %d ! as socket \n",SOCKET_STREAM_FD(strm)); +- else { ++ case smm_socket: ++ if (SOCKET_STREAM_FD(strm) < 2) ++ emsg("tried Closing %d ! as socket \n",SOCKET_STREAM_FD(strm)); ++ else { + #ifdef HAVE_NSOCKET +- if (GET_STREAM_FLAG(strm,gcl_sm_output)) +- { +- gclFlushSocket(strm); +- /* there are two for one fd so close only one */ +- tcpCloseSocket(SOCKET_STREAM_FD(strm)); +- } ++ if (GET_STREAM_FLAG(strm,gcl_sm_output)) { ++ gclFlushSocket(strm); ++ /* there are two for one fd so close only one */ ++ tcpCloseSocket(SOCKET_STREAM_FD(strm)); ++ } + #endif +- SOCKET_STREAM_FD(strm)=-1; +- } ++ SOCKET_STREAM_FD(strm)=-1; ++ } + +- case smm_input: +- if (strm->sm.sm_fp == stdin) +- FEerror("Cannot close the standard input.", 0); +- +- case smm_io: +- case smm_probe: +- if (strm->sm.sm_fp == NULL) break; +- deallocate_stream_buffer(strm); +- if (strm->sm.sm_object1 && +- type_of(strm->sm.sm_object1)==t_string && +- strm->sm.sm_object1->st.st_self[0] =='|') +- pclose(strm->sm.sm_fp); +- else +- fclose(strm->sm.sm_fp); +- strm->sm.sm_fp = NULL; +- if (strm->sm.sm_object0 && +- type_of(strm->sm.sm_object0 ) == t_cons && +- Mcar(strm->sm.sm_object0 ) == sSAallow_gzipped_fileA) +- fLdelete_file(Mcdr(strm->sm.sm_object0)); +- break; ++ case smm_input: ++ if (strm->sm.sm_fp == stdin) ++ FEerror("Cannot close the standard input.", 0); + +- case smm_synonym: +- strm = symbol_value(strm->sm.sm_object0); +- if (type_of(strm) != t_stream) +- FEwrong_type_argument(sLstream, strm); +- goto BEGIN; ++ case smm_io: ++ case smm_probe: ++ deallocate_stream_buffer(strm); ++ if (strm->sm.sm_object1 && ++ type_of(strm->sm.sm_object1)==t_string && ++ strm->sm.sm_object1->st.st_self[0] =='|') ++ pclose(strm->sm.sm_fp); ++ else ++ fclose(strm->sm.sm_fp); ++ strm->sm.sm_fp = NULL; ++ strm->sm.sm_fd = -1; ++ if (strm->sm.sm_object0 && ++ type_of(strm->sm.sm_object0 )==t_cons && ++ Mcar(strm->sm.sm_object0)==sSAallow_gzipped_fileA) ++ ifuncall1(sLdelete_file,Mcdr(strm->sm.sm_object0)); ++ break; + +- case smm_broadcast: +- for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr) +- close_stream(x->c.c_car); +- break; ++ case smm_file_synonym: ++ case smm_synonym: ++ strm = symbol_value(strm->sm.sm_object0); ++ if (type_of(strm) != t_stream) ++ TYPE_ERROR(strm,sLstream); ++ close_stream(strm); ++ break; + +- case smm_concatenated: +- for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr) +- close_stream(x->c.c_car); +- break; ++ case smm_broadcast: ++ case smm_concatenated: ++ for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr) ++ close_stream(x->c.c_car); ++ break; + +- case smm_two_way: +- case smm_echo: +- close_stream(STREAM_INPUT_STREAM(strm)); +- close_stream(STREAM_OUTPUT_STREAM(strm)); +- break; ++ case smm_two_way: ++ case smm_echo: ++ close_stream(STREAM_INPUT_STREAM(strm)); ++ close_stream(STREAM_OUTPUT_STREAM(strm)); ++ break; + +- case smm_string_input: +- break; /* There is nothing to do. */ ++ case smm_string_input: ++ case smm_string_output: ++ break; + +- case smm_string_output: +- break; /* There is nothing to do. */ ++ default: ++ error("Illegal stream mode"); ++ } ++ ++ SET_STREAM_FLAG(strm,gcl_sm_closed,1); ++ ++} ++ ++DEFUN_NEW("INTERACTIVE-STREAM-P",object,fLinteractive_stream_p,LISP,1,1,NONE,OO,OO,OO,OO,(object strm),"") { ++ ++ check_type_stream(&strm); ++ ++ switch (strm->sm.sm_mode) { ++ case smm_output: ++ case smm_input: ++ case smm_io: ++ case smm_probe: ++ if ((strm->sm.sm_fp == stdin) || ++ (strm->sm.sm_fp == stdout) || ++ (strm->sm.sm_fp == stderr)) ++ return Ct; ++ return Cnil; ++ break; ++ case smm_file_synonym: ++ case smm_synonym: ++ strm = symbol_value(strm->sm.sm_object0); ++ if (type_of(strm) != t_stream) ++ FEwrong_type_argument(sLstream, strm); ++ break; ++ ++ case smm_broadcast: ++ case smm_concatenated: ++ if (( consp(strm->sm.sm_object0) ) && ++ ( type_of(strm->sm.sm_object0->c.c_car) == t_stream )) ++ strm=strm->sm.sm_object0->c.c_car; ++ else ++ return Cnil; ++ break; ++ ++ case smm_two_way: ++ case smm_echo: ++ strm=STREAM_INPUT_STREAM(strm); ++ break; ++ default: ++ return Cnil; ++ } ++ ++ return Cnil; + +- default: +- error("illegal stream mode"); +- } + } + + object +@@ -665,6 +694,7 @@ object istrm, ostrm; + STREAM_INPUT_STREAM(strm) = istrm; + STREAM_OUTPUT_STREAM(strm) = ostrm; + strm->sm.sm_int0 = strm->sm.sm_int1 = 0; ++ strm->sm.sm_flags=0; + return(strm); + } + +@@ -694,6 +724,7 @@ int istart, iend; + strm->sm.sm_object1 = OBJNULL; + STRING_INPUT_STREAM_NEXT(strm)= istart; + STRING_INPUT_STREAM_END(strm)= iend; ++ strm->sm.sm_flags=0; + return(strm); + } + +@@ -729,6 +760,7 @@ int line_length; + STRING_STREAM_STRING(strm) = strng; + strm->sm.sm_object1 = OBJNULL; + strm->sm.sm_int0 = STREAM_FILE_COLUMN(strm) = 0; ++ strm->sm.sm_flags=0; + vs_reset; + return(strm); + } +@@ -782,6 +814,7 @@ BEGIN: + /* strm->sm.sm_int0++; */ + return(c==EOF ? c : (c&0377)); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -884,6 +917,7 @@ BEGIN: + /* --strm->sm.sm_int0; */ /* use ftell now for position */ + break; + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -985,6 +1019,7 @@ BEGIN: + + break; + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1095,6 +1130,7 @@ BEGIN: + #endif + closed_stream(strm); + break; ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1183,6 +1219,7 @@ BEGIN: + case smm_probe: + return(FALSE); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + check_stream(strm); +@@ -1308,6 +1345,7 @@ BEGIN: + #endif + return TRUE; + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1363,6 +1401,7 @@ BEGIN: + case smm_string_output: + return(STRING_STREAM_STRING(strm)->st.st_fillp); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1412,6 +1451,7 @@ BEGIN: + } + return(0); + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1448,6 +1488,7 @@ BEGIN: + + + ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1487,6 +1528,7 @@ BEGIN: + case smm_two_way: + strm=STREAM_OUTPUT_STREAM(strm); + goto BEGIN; ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1553,6 +1595,22 @@ load(const char *s) { + + + ++static int ++file_synonym_stream_p(object x) { ++ switch(x->sm.sm_mode) { ++ case smm_input: ++ case smm_output: ++ case smm_io: ++ case smm_probe: ++ case smm_file_synonym: ++ return 1; ++ case smm_synonym: ++ return file_synonym_stream_p(x->sm.sm_object0->s.s_dbind); ++ default: ++ return 0; ++ } ++} ++ + LFD(Lmake_synonym_stream)() + { + object x; +@@ -1560,12 +1618,13 @@ LFD(Lmake_synonym_stream)() + check_arg(1); + check_type_sym(&vs_base[0]); + x = alloc_object(t_stream); +- x->sm.sm_mode = (short)smm_synonym; ++ x->sm.sm_mode = file_synonym_stream_p(vs_base[0]) ? (short)smm_file_synonym : (short)smm_synonym; + x->sm.sm_fp = NULL; + x->sm.sm_buffer = 0; + x->sm.sm_object0 = vs_base[0]; + x->sm.sm_object1 = OBJNULL; + x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_flags=0; + vs_base[0] = x; + } + +@@ -1589,6 +1648,7 @@ LFD(Lmake_broadcast_stream)() + x->sm.sm_object0 = vs_base[0]; + x->sm.sm_object1 = OBJNULL; + x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_flags=0; + vs_base[0] = x; + } + +@@ -1612,6 +1672,7 @@ LFD(Lmake_concatenated_stream)() + x->sm.sm_object0 = vs_base[0]; + x->sm.sm_object1 = OBJNULL; + x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_flags=0; + vs_base[0] = x; + } + +@@ -1700,6 +1761,38 @@ LFD(siLoutput_stream_string)() + vs_base[0] = vs_base[0]->sm.sm_object0; + } + ++DEFUN_NEW("FILE-STREAM-P",object,fSfile_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && ++ (x->sm.sm_mode==smm_input || x->sm.sm_mode==smm_output || x->sm.sm_mode==smm_io || x->sm.sm_mode==smm_probe) ++ ? Ct : Cnil); ++} ++ ++DEFUN_NEW("SYNONYM-STREAM-P",object,fSsynonym_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && (x->sm.sm_mode==smm_file_synonym || x->sm.sm_mode==smm_synonym) ? Ct : Cnil); ++} ++ ++DEFUN_NEW("TERMINAL-INPUT-STREAM-P",object,fSterminal_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_input && x->sm.sm_fp && isatty(fileno((FILE *)x->sm.sm_fp)) ? Ct : Cnil); ++} ++ ++DEFUN_NEW("BROADCAST-STREAM-P",object,fSbroadcast_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_broadcast ? Ct : Cnil); ++} ++ ++DEFUN_NEW("ECHO-STREAM-P",object,fSecho_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_echo ? Ct : Cnil); ++} ++ ++DEFUN_NEW("TWO-WAY-STREAM-P",object,fStwo_way_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_two_way ? Ct : Cnil); ++} ++ ++DEFUN_NEW("CONCATENATED-STREAM-P",object,fSconcatenated_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_concatenated ? Ct : Cnil); ++} ++ ++ ++ + LFD(Lstreamp)() + { + check_arg(1); +@@ -1747,54 +1840,6 @@ LFD(Lstream_element_type)() + @(return Ct) + @) + +-@(static defun open (filename +- &key (direction sKinput) +- (element_type sLcharacter) +- (if_exists Cnil iesp) +- (if_does_not_exist Cnil idnesp) +- &aux strm) +- enum smmode smm=0; +-@ +- check_type_or_pathname_string_symbol_stream(&filename); +- filename = coerce_to_namestring(filename); +- if (direction == sKinput) { +- smm = smm_input; +- if (!idnesp) +- if_does_not_exist = sKerror; +- } else if (direction == sKoutput) { +- smm = smm_output; +- if (!iesp) +- if_exists = sKnew_version; +- if (!idnesp) { +- if (if_exists == sKoverwrite || +- if_exists == sKappend) +- if_does_not_exist = sKerror; +- else +- if_does_not_exist = sKcreate; +- } +- } else if (direction == sKio) { +- smm = smm_io; +- if (!iesp) +- if_exists = sKnew_version; +- if (!idnesp) { +- if (if_exists == sKoverwrite || +- if_exists == sKappend) +- if_does_not_exist = sKerror; +- else +- if_does_not_exist = sKcreate; +- } +- } else if (direction == sKprobe) { +- smm = smm_probe; +- if (!idnesp) +- if_does_not_exist = Cnil; +- } else +- FEerror("~S is an illegal DIRECTION for OPEN.", +- 1, direction); +- strm = open_stream(filename, smm, if_exists, if_does_not_exist); +- if (type_of(strm) == t_stream) +- strm->sm.sm_object0 = element_type; +- @(return strm) +-@) + + @(defun file_position (file_stream &o position) + int i=0; +@@ -1838,175 +1883,72 @@ object sLAload_pathnameA; + DEFVAR("*COLLECT-BINARY-MODULES*",sSAcollect_binary_modulesA,SI,sLnil,""); + DEFVAR("*BINARY-MODULES*",sSAbinary_modulesA,SI,Cnil,""); + +-@(static defun load (pathname +- &key (verbose `symbol_value(sLAload_verboseA)`) +- print +- (if_does_not_exist sKerror) +- &aux pntype fasl_filename lsp_filename filename +- defaults strm stdoutput x +- package) +- bds_ptr old_bds_top; +- int i; +- object strm1; +-@ +- check_type_or_pathname_string_symbol_stream(&pathname); +- pathname = coerce_to_pathname(pathname); +- defaults = symbol_value(Vdefault_pathname_defaults); +- defaults = coerce_to_pathname(defaults); +- pathname = merge_pathnames(pathname, defaults, sKnewest); +- pntype = pathname->pn.pn_type; +- filename = coerce_to_namestring(pathname); +- if (user_match(filename->st.st_self,filename->st.st_fillp)) +- @(return Cnil) +- old_bds_top=bds_top; +- if (pntype == Cnil || pntype == sKwild || +- (type_of(pntype) == t_string && +-#ifdef UNIX +- string_eq(pntype, FASL_string))) { +-#endif +-#ifdef AOSVS ++DEFUN_NEW("LOAD-STREAM",object,fSload_stream,SI,2,2,NONE,OO,OO,OO,OO,(object strm,object print),"") { + +-#endif +- pathname->pn.pn_type = FASL_string; +- fasl_filename = coerce_to_namestring(pathname); +- } +- if (pntype == Cnil || pntype == sKwild || +- (type_of(pntype) == t_string && +-#ifdef UNIX +- string_eq(pntype, LSP_string))) { +-#endif +-#ifdef AOSVS ++ object x; + +-#endif +- pathname->pn.pn_type = LSP_string; +- lsp_filename = coerce_to_namestring(pathname); +- } +- if (fasl_filename != Cnil && file_exists(fasl_filename)) { +- if (verbose != Cnil) { +- SETUP_PRINT_DEFAULT(fasl_filename); +- if (file_column(PRINTstream) != 0) +- write_str("\n"); +- write_str("Loading "); +- PRINTescape = FALSE; +- write_object(fasl_filename, 0); +- write_str("\n"); +- CLEANUP_PRINT_DEFAULT; +- flush_stream(PRINTstream); +- } +- package = symbol_value(sLApackageA); +- bds_bind(sLApackageA, package); +- bds_bind(sLAload_pathnameA,fasl_filename); +- if (sSAcollect_binary_modulesA->s.s_dbind==Ct) { +- object _x=sSAbinary_modulesA->s.s_dbind; +- object _y=Cnil; +- while (_x!=Cnil) { +- _y=_x; +- _x=_x->c.c_cdr; +- } +- if (_y==Cnil) +- sSAbinary_modulesA->s.s_dbind=make_cons(fasl_filename,Cnil); +- else +- _y->c.c_cdr=make_cons(fasl_filename,Cnil); +- } +- i = fasload(fasl_filename); +- if (print != Cnil) { +- SETUP_PRINT_DEFAULT(Cnil); +- vs_top = PRINTvs_top; +- if (file_column(PRINTstream) != 0) +- write_str("\n"); +- write_str("Fasload successfully ended."); +- write_str("\n"); +- CLEANUP_PRINT_DEFAULT; +- flush_stream(PRINTstream); +- } +- bds_unwind(old_bds_top); +- if (verbose != Cnil) { +- SETUP_PRINT_DEFAULT(fasl_filename); +- if (file_column(PRINTstream) != 0) +- write_str("\n"); +- write_str("Finished loading "); +- PRINTescape = FALSE; +- write_object(fasl_filename, 0); +- write_str("\n"); +- CLEANUP_PRINT_DEFAULT; +- flush_stream(PRINTstream); +- } +- @(return `make_fixnum(i)`) +- } +- if (lsp_filename != Cnil && file_exists(lsp_filename)) { +- filename = lsp_filename; +- } +- if (if_does_not_exist != Cnil) +- if_does_not_exist = sKerror; +- strm1 = strm +- = open_stream(filename, smm_input, Cnil, if_does_not_exist); +- if (strm == Cnil) +- @(return Cnil) +- if (verbose != Cnil) { +- SETUP_PRINT_DEFAULT(filename); +- if (file_column(PRINTstream) != 0) +- write_str("\n"); +- write_str("Loading "); +- PRINTescape = FALSE; +- write_object(filename, 0); +- write_str("\n"); +- CLEANUP_PRINT_DEFAULT; +- flush_stream(PRINTstream); +- } +- package = symbol_value(sLApackageA); +- bds_bind(sLAload_pathnameA,pathname); +- bds_bind(sLApackageA, package); +- bds_bind(sLAstandard_inputA, strm); +- frs_push(FRS_PROTECT, Cnil); +- if (nlj_active) { +- close_stream(strm1); +- nlj_active = FALSE; +- frs_pop(); +- bds_unwind(old_bds_top); +- unwind(nlj_fr, nlj_tag); +- } +- for (;;) { +- preserving_whitespace_flag = FALSE; +- detect_eos_flag = TRUE; +- x = read_object_non_recursive(strm); +- if (x == OBJNULL) +- break; +- { +- object *base = vs_base, *top = vs_top, *lex = lex_env; +- object xx; +- +- lex_new(); +- eval(x); +- xx = vs_base[0]; +- lex_env = lex; +- vs_top = top; +- vs_base = base; +- x = xx; +- } +- if (print != Cnil) { +- SETUP_PRINT_DEFAULT(x); +- write_object(x, 0); +- write_str("\n"); +- CLEANUP_PRINT_DEFAULT; +- flush_stream(PRINTstream); +- } +- } +- close_stream(strm); +- frs_pop(); +- bds_unwind(old_bds_top); +- if (verbose != Cnil) { +- SETUP_PRINT_DEFAULT(filename); +- if (file_column(PRINTstream) != 0) +- write_str("\n"); +- write_str("Finished loading "); +- PRINTescape = FALSE; +- write_object(filename, 0); +- write_str("\n"); +- CLEANUP_PRINT_DEFAULT; +- flush_stream(PRINTstream); +- } +- @(return Ct) +-@) ++ for (;;) { ++ preserving_whitespace_flag = FALSE; ++ detect_eos_flag = TRUE; ++ x = read_object_non_recursive(strm); ++ if (x == OBJNULL) ++ break; ++ { ++ object *base = vs_base, *top = vs_top, *lex = lex_env; ++ object xx; ++ ++ lex_new(); ++ eval(x); ++ xx = vs_base[0]; ++ lex_env = lex; ++ vs_top = top; ++ vs_base = base; ++ x = xx; ++ } ++ if (print != Cnil) { ++ SETUP_PRINT_DEFAULT(x); ++ write_object(x, 0); ++ write_str("\n"); ++ CLEANUP_PRINT_DEFAULT; ++ flush_stream(PRINTstream); ++ } ++ } ++ ++ RETURN1(Ct); ++ ++} ++ ++DEFUN_NEW("LOAD-FASL",object,fSload_fasl,SI,2,2,NONE,OO,OO,OO,OO,(object fasl_filename,object print),"") { ++ ++ int i; ++ ++ if (sSAcollect_binary_modulesA->s.s_dbind==Ct) { ++ object _x=sSAbinary_modulesA->s.s_dbind; ++ object _y=Cnil; ++ while (_x!=Cnil) { ++ _y=_x; ++ _x=_x->c.c_cdr; ++ } ++ if (_y==Cnil) ++ sSAbinary_modulesA->s.s_dbind=make_cons(fasl_filename,Cnil); ++ else ++ _y->c.c_cdr=make_cons(fasl_filename,Cnil); ++ } ++ i = fasload(fasl_filename); ++ if (print != Cnil) { ++ SETUP_PRINT_DEFAULT(Cnil); ++ vs_top = PRINTvs_top; ++ if (file_column(PRINTstream) != 0) ++ write_str("\n"); ++ write_str(";; Fasload successfully ended."); ++ write_str("\n"); ++ CLEANUP_PRINT_DEFAULT; ++ flush_stream(PRINTstream); ++ } ++ ++ RETURN1(make_fixnum(i)); ++ ++} + + static void + FFN(siLget_string_input_stream_index)() +@@ -2018,9 +1960,6 @@ FFN(siLget_string_input_stream_index)() + vs_base[0] = make_fixnum(STRING_INPUT_STREAM_NEXT(vs_base[0])); + } + +-DEFUN_NEW("TERMINAL-INPUT-STREAM-P",object,fSterminal_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +- RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_input && x->sm.sm_fp && isatty(fileno((FILE *)x->sm.sm_fp)) ? Ct : Cnil); +-} + + LFD(siLmake_string_output_stream_from_string)() + { +@@ -2038,6 +1977,7 @@ LFD(siLmake_string_output_stream_from_st + strm->sm.sm_object1 = OBJNULL; + /* strm->sm.sm_int0 = strng->st.st_fillp; */ + STREAM_FILE_COLUMN(strm) = 0; ++ strm->sm.sm_flags=0; + vs_base[0] = strm; + } + +@@ -2071,14 +2011,14 @@ static void + cannot_open(fn) + object fn; + { +- FEerror("Cannot open the file ~A.", 1, fn); ++ FILE_ERROR(fn,"Cannot open"); + } + + static void + cannot_create(fn) + object fn; + { +- FEerror("Cannot create the file ~A.", 1, fn); ++ FILE_ERROR(fn,"Cannot create"); + } + + static void +@@ -2141,6 +2081,7 @@ int out; + if (type_of(strm) != t_stream) + FEwrong_type_argument(sLstream, strm); + switch (strm->sm.sm_mode){ ++ case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -2566,6 +2507,7 @@ gcl_init_file(void) + #endif + standard_input->sm.sm_int0 = 0; /* unused */ + standard_input->sm.sm_int1 = 0; /* unused */ ++ standard_input->sm.sm_flags=0; + + standard_output = alloc_object(t_stream); + standard_output->sm.sm_mode = (short)smm_output; +@@ -2578,18 +2520,20 @@ gcl_init_file(void) + #endif + standard_output->sm.sm_int0 = 0; /* unused */ + STREAM_FILE_COLUMN(standard_output) = 0; ++ standard_output->sm.sm_flags=0; + + terminal_io = standard + = make_two_way_stream(standard_input, standard_output); + enter_mark_origin(&terminal_io); + + x = alloc_object(t_stream); +- x->sm.sm_mode = (short)smm_synonym; ++ x->sm.sm_mode = (short)smm_file_synonym; + x->sm.sm_fp = NULL; + x->sm.sm_buffer = 0; + x->sm.sm_object0 = sLAterminal_ioA; + x->sm.sm_object1 = OBJNULL; + x->sm.sm_int0 = x->sm.sm_int1 = 0; /* unused */ ++ x->sm.sm_flags=0; + standard_io = x; + enter_mark_origin(&standard_io); + +@@ -2597,7 +2541,9 @@ gcl_init_file(void) + + DEFVAR("*IGNORE-EOF-ON-TERMINAL-IO*",sSAignore_eof_on_terminal_ioA,SI,Cnil,""); + DEFVAR("*LOAD-PATHNAME*",sLAload_pathnameA,LISP,Cnil,""); ++DEFVAR("*LOAD-TRUENAME*",sSAload_truenameA,LISP,Cnil,""); + DEFVAR("*LOAD-VERBOSE*",sLAload_verboseA,LISP,Ct,""); ++DEFVAR("*LOAD-PRINT*",sLAload_printA,LISP,Cnil,""); + + DEF_ORDINARY("ABORT",sKabort,KEYWORD,""); + DEF_ORDINARY("APPEND",sKappend,KEYWORD,""); +@@ -2622,6 +2568,7 @@ DEF_ORDINARY("SUPERSEDE",sKsupersede,KEY + DEF_ORDINARY("VERBOSE",sKverbose,KEYWORD,""); + + ++DEF_ORDINARY("DELETE-FILE",sLdelete_file,LISP,""); + + + void +@@ -2673,13 +2620,9 @@ gcl_init_file_function() + make_function("STREAM-ELEMENT-TYPE", Lstream_element_type); + make_function("CLOSE", Lclose); + +- make_function("OPEN", Lopen); +- + make_function("FILE-POSITION", Lfile_position); + make_function("FILE-LENGTH", Lfile_length); + +- make_function("LOAD", Lload); +- + make_si_function("GET-STRING-INPUT-STREAM-INDEX", + siLget_string_input_stream_index); + make_si_function("MAKE-STRING-OUTPUT-STREAM-FROM-STRING", +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -57,7 +57,7 @@ mark_contblock(void *, int); + since this is more portable and faster lets use them --W. Schelter + These assume that DBEGIN is divisible by 32, or else we should have + #define Shamt(x) (((((int) x -DBEGIN) >> 2) & ~(~0 << 5))) +-*/ ++*/ + #define LOG_BITS_CHAR 3 + + #if CPTR_SIZE == 8 +@@ -72,7 +72,7 @@ void * + cb_in(void *p) { + struct contblock **cbpp; + int i; +- ++ + for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) { + if ((void *)*cbpp<=p && ((void *)(*cbpp)+(*cbpp)->cb_size) >p) + return *cbpp; +@@ -84,7 +84,7 @@ int + cb_print(void) { + struct contblock **cbpp; + int i; +- ++ + for (cbpp=&cb_pointer,i=0;*cbpp;cbpp=&((*cbpp)->cb_link),i++) + emsg("%lu at %p\n",(*cbpp)->cb_size,*cbpp); + emsg("%u blocks\n",i); +@@ -146,7 +146,7 @@ pageinfo_p(void *v) { + (!pi->next || (void *)pi->next>=v+(pi->type==t_contiguous ? pi->in_use : 1)*PAGESIZE); + + } +- ++ + static inline char + get_bit(char *v,struct pageinfo *pi,void *x) { + void *ve=CB_DATA_START(pi); +@@ -157,16 +157,6 @@ get_bit(char *v,struct pageinfo *pi,void + return (v[i]>>s)&0x1; + } + +-/* static inline void */ +-/* set_bit(char *v,struct pageinfo *pi,void *x) { */ +-/* void *ve=CB_DATA_START(pi); */ +-/* fixnum off=(x-ve)>>LOG_BYTES_CONTBLOCK,i=off>>LOG_BITS_CHAR,s=off&~(~0UL<>s)&0x1) + #define bit_set(v,i,s) (v[i]|=(1UL<d.st>=ngc_thresh && + (dp=alloc_contblock_no_gc(s,static_promotion_limit))) { +- ++ + *pp=memcpy(dp,p,s); + x->d.st=0; + + return; + +- } ++ } + + if (x && x->d.std.st++; + +@@ -460,7 +440,7 @@ mark_leaf_data(object x,void **pp,ufixnu + + static void mark_object1(object); + #define mark_object(x) if (marking(x)) mark_object1(x) +- ++ + static inline void + mark_object_address(object *o,int f) { + +@@ -468,7 +448,7 @@ mark_object_address(object *o,int f) { + static ufixnum lr; + + ufixnum p=page(o); +- ++ + if (lp!=p || !f) { + lp=p; + lr= +@@ -496,7 +476,7 @@ mark_object_array(object *o,object *oe) + + static void + mark_object1(object x) { +- ++ + fixnum i,j=0;/*FIXME*/ + + if (is_marked_or_free(x)) +@@ -567,7 +547,7 @@ mark_object1(object x) { + break; + + case t_array: +- MARK_LEAF_DATA(x,x->a.a_dims,sizeof(int)*x->a.a_rank); ++ MARK_LEAF_DATA(x,x->a.a_dims,sizeof(*x->a.a_dims)*x->a.a_rank); + + case t_vector: + case t_bitvector: +@@ -615,7 +595,7 @@ mark_object1(object x) { + x->v.v_self=p; + adjust_displaced(x,j); + } +- } ++ } + mark_object(x->v.v_displaced); + break; + +@@ -627,7 +607,7 @@ mark_object1(object x) { + mark_object(x->str.str_def); + if (x->str.str_self) + for (i=0,j=S_DATA(def)->length;istr.str_self,S_DATA(def)->size); + } +@@ -646,7 +626,8 @@ mark_object1(object x) { + MARK_LEAF_DATA(x,x->sm.sm_buffer,BUFSIZ); + } + break; +- ++ ++ case smm_file_synonym: + case smm_synonym: + mark_object(x->sm.sm_object0); + break; +@@ -676,7 +657,7 @@ mark_object1(object x) { + error("mark stream botch"); + } + break; +- ++ + case t_random: + MARK_LEAF_DATA_ALIGNED(x,x->rnd.rnd_state._mp_seed->_mp_d,x->rnd.rnd_state._mp_seed->_mp_alloc*MP_LIMB_SIZE,MP_LIMB_SIZE); + break; +@@ -700,6 +681,7 @@ mark_object1(object x) { + mark_object(x->pn.pn_name); + mark_object(x->pn.pn_type); + mark_object(x->pn.pn_version); ++ mark_object(x->pn.pn_namestring); + break; + + case t_closure: +@@ -854,24 +836,6 @@ mark_phase(void) { + } + #endif + +- /* +- if (what_to_collect != t_symbol && +- (int)what_to_collect < (int)t_contiguous) { +- */ +- +- /* {int size; */ +- +- /* for (pp = pack_pointer; pp != NULL; pp = pp->p_link) { */ +- /* size = pp->p_internal_size; */ +- /* if (pp->p_internal != NULL) */ +- /* for (i = 0; i < size; i++) */ +- /* mark_object(pp->p_internal[i]); */ +- /* size = pp->p_external_size; */ +- /* if (pp->p_external != NULL) */ +- /* for (i = 0; i < size; i++) */ +- /* mark_object(pp->p_external[i]); */ +- /* }} */ +- + /* mark the c stack */ + #ifndef N_RECURSION_REQD + #define N_RECURSION_REQD 2 +@@ -979,15 +943,15 @@ mark_c_stack(jmp_buf env1, int n, void ( + extern void * __libc_ia64_register_backing_store_base; + void * bst=GC_save_regs_in_stack(); + void * bsb=__libc_ia64_register_backing_store_base; +- ++ + if (bsb>bst) + (*fn)(bsb,bst,C_GC_OFFSET); + else + (*fn)(bst,bsb,C_GC_OFFSET); +- ++ + } + #endif +- ++ + } + + static void +@@ -1035,7 +999,7 @@ contblock_sweep_phase(void) { + struct pageinfo *v; + STATIC char *s, *e, *p, *q; + ufixnum i; +- ++ + reset_contblock_freelist(); + + for (i=0;iv.v_fillp && (v=(void *)contblock_array->v.v_self[i]);i++) { +@@ -1045,7 +1009,7 @@ contblock_sweep_phase(void) { + #ifdef SGC + if (sgc_enabled && !(v->sgc_flags&SGC_PAGE_FLAG)) continue; + #endif +- ++ + s=CB_DATA_START(v); + e=(void *)v+v->in_use*PAGESIZE; + +@@ -1070,25 +1034,6 @@ contblock_sweep_phase(void) { + int (*GBC_enter_hook)() = NULL; + int (*GBC_exit_hook)() = NULL; + +-/* void */ +-/* ttss(void) { */ +- +-/* struct typemanager *tm; */ +-/* void *x,*y; */ +- +-/* for (tm=tm_table;tmtm_free;x!=OBJNULL;x=(void *)((struct freelist *)x)->f_link) { */ +-/* if (x==Cnil) */ +-/* printf("barr\n"); */ +-/* /\* for (y=(void *)((struct freelist *)x)->f_link;y!=OBJNULL && y!=x;y=(void *)((struct freelist *)y)->f_link); *\/ */ +-/* /\* if (y==x) *\/ */ +-/* /\* printf("circle\n"); *\/ */ +-/* } */ +-/* } */ +- +-/* } */ +- + fixnum fault_pages=0; + + static ufixnum +@@ -1102,7 +1047,7 @@ count_contblocks(void) { + return ncb; + + } +- ++ + + void + GBC(enum type t) { +@@ -1120,7 +1065,7 @@ GBC(enum type t) { + + ngc_thresh=fix(sSAleaf_collection_thresholdA->s.s_dbind); + recent_allocation=0; +- ++ + if (in_signal_handler && t == t_relocatable) + error("cant gc relocatable in signal handler"); + +@@ -1146,7 +1091,6 @@ GBC(enum type t) { + close_stream(o); + } + +- /* t = t_relocatable; */ + gc_time = -1; + } + +@@ -1265,54 +1209,6 @@ GBC(enum type t) { + #endif + } + +- +-/* { */ +-/* static int promoting; */ +-/* if (!promoting && promotion_pointer>promotion_pointer1) { */ +-/* object *p,st; */ +-/* promoting=1; */ +-/* st=alloc_simple_string(""); */ +-/* for (p=promotion_pointer1;pst.st_dim; */ +- +-/* else switch (x->v.v_elttype) { */ +- +-/* case aet_lf: */ +-/* j=sizeof(longfloat)*x->v.v_dim; */ +-/* break; */ +-/* case aet_bit: */ +-/* #define W_SIZE (8*sizeof(fixnum)) */ +-/* j=sizeof(fixnum)*((BV_OFFSET(x) + x->bv.bv_dim + W_SIZE -1)/W_SIZE); */ +-/* break; */ +-/* case aet_char: */ +-/* case aet_uchar: */ +-/* j=sizeof(char)*x->v.v_dim; */ +-/* break; */ +-/* case aet_short: */ +-/* case aet_ushort: */ +-/* j=sizeof(short)*x->v.v_dim; */ +-/* break; */ +-/* default: */ +-/* j=sizeof(fixnum)*x->v.v_dim; */ +-/* } */ +- +-/* st->st.st_dim=j; */ +-/* st->st.st_self=alloc_contblock(st->st.st_dim); */ +-/* fprintf(stderr,"Promoting vector leaf bytes %lu at %p, %p -> %p\n",j,x,x->v.v_self,st->st.st_self); */ +-/* fflush(stderr); */ +-/* memcpy(st->st.st_self,x->v.v_self,st->st.st_dim); */ +-/* x->v.v_self=(void *)st->st.st_self; */ +-/* } */ +-/* promoting=0; */ +-/* } */ +-/* } */ +- +- + #ifdef DEBUG + if (debug) { + int i,j; +@@ -1361,8 +1257,6 @@ GBC(enum type t) { + + CHECK_INTERRUPT; + +- /* ttss(); */ +- + } + + static void +@@ -1472,7 +1366,7 @@ mark_contblock(void *p, int s) { + STATIC char *q; + STATIC char *x, *y; + struct pageinfo *v; +- ++ + if (NULL_OR_ON_C_STACK(p)) + return; + +@@ -1495,17 +1389,17 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc + ufixnum i,j,k,s; + struct typemanager *tm=tm_of(t_cfdata); + void *p; +- ++ + for (i=j=0,cbpp=&cb_pointer;(*cbpp);) { + for (k=0,s=(*cbpp)->cb_size,p=*cbpp;*cbpp && (*cbpp)->cb_size==s;i+=(*cbpp)->cb_size,j++,k++,cbpp=&(*cbpp)->cb_link); + emsg("%lu %lu starting at %p\n",k,s,p); + } + emsg("\nTotal free %lu in %lu pieces\n\n",i,j); +- +- for (i=j=k=0;kv.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++) ++ ++ for (i=j=k=0;kv.v_fillp && (v=(void *)contblock_array->v.v_self[k]);k++,i+=v->in_use,j++) + emsg("%lu pages at %p\n",(unsigned long)v->in_use,v); + emsg("\nTotal pages %lu in %lu pieces\n\n",i,j); +- ++ + for (i=j=0,v=cell_list_head;v;v=v->next) + if (tm->tm_type==v->type) { + void *p; +@@ -1520,7 +1414,7 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc + } + } + emsg("\nTotal code bytes %lu in %lu pieces\n",i,j); +- ++ + for (i=j=0,v=cell_list_head;v;v=v->next) { + struct typemanager *tm=tm_of(v->type); + void *p; +@@ -1589,15 +1483,13 @@ DEFUN_NEW("CONTIGUOUS-REPORT",object,fSc + } + } + emsg("\nTotal leaf bytes %lu in %lu pieces\n",i,j); +- ++ + return Cnil; + + } + + DEFUN_NEW("GBC",object,fSgbc,SI,1,1,NONE,OO,OO,OO,OO,(object x0),"") { + +- /* 1 args */ +- + if (x0 == Ct) { + tm_table[t_contiguous].tm_adjgbccnt--; + GBC(t_other); +@@ -1644,5 +1536,5 @@ gcl_init_GBC(void) { + #ifdef SGC + make_si_function("SGC-ON",siLsgc_on); + #endif +- ++ + } +--- gcl-2.6.12.orig/o/iteration.c ++++ gcl-2.6.12/o/iteration.c +@@ -95,7 +95,7 @@ do_var_list(object var_list) + + + +- if (type_of(x) != t_cons) ++ if (!consp(x)) + FEinvalid_form("The index, ~S, is illegal.", x); + y = MMcar(x); + check_var(y); +@@ -326,7 +326,7 @@ FFN(Fdolist)(VOL object arg) + } + + eval_assign(start->bt_init, listform); +- body = find_special(MMcdr(arg), start, start+1); ++ body = find_special(MMcdr(arg), start, start+1,NULL); /*?*/ + vs_push(body); + bind_var(start->bt_var, Cnil, start->bt_spp); + if ((enum stype)start->bt_var->s.s_stype != stp_ordinary) +@@ -410,7 +410,7 @@ FFN(Fdotimes)(VOL object arg) + if (type_of(start->bt_init) != t_fixnum && + type_of(start->bt_init) != t_bignum) + FEwrong_type_argument(sLinteger, start->bt_init); +- body = find_special(MMcdr(arg), start, start+1); ++ body = find_special(MMcdr(arg), start, start+1,NULL); /*?*/ + vs_push(body); + bind_var(start->bt_var, make_fixnum(0), start->bt_spp); + if ((enum stype)start->bt_var->s.s_stype != stp_ordinary) { +--- gcl-2.6.12.orig/o/let.c ++++ gcl-2.6.12/o/let.c +@@ -151,7 +151,7 @@ FFN(Fmultiple_value_bind)(object form) + } + { + object *vt = vs_top; +- vs_push(find_special(body, start, (struct bind_temp *)vt)); ++ vs_push(find_special(body, start, (struct bind_temp *)vt,NULL)); /*?*/ + } + for (i = 0; i < n; i++) + bind_var(start[i].bt_var, +@@ -230,7 +230,7 @@ is an illegal function definition in FLE + lex_fun_bind(MMcar(def), top[0]); + def_list = MMcdr(def_list); + } +- vs_push(find_special(MMcdr(args), NULL, NULL)); ++ vs_push(find_special(MMcdr(args), NULL, NULL,NULL)); + Fprogn(vs_head); + lex_env = lex; + } +@@ -271,7 +271,7 @@ is an illegal function definition in LAB + MMcaar(closure_list) = lex_env[1]; + closure_list = MMcdr(closure_list); + } +- vs_push(find_special(MMcdr(args), NULL, NULL)); ++ vs_push(find_special(MMcdr(args), NULL, NULL,NULL)); + Fprogn(vs_head); + lex_env = lex; + } +@@ -304,7 +304,7 @@ is an illegal macro definition in MACROF + lex_macro_bind(MMcar(def), MMcaddr(top[0])); + def_list = MMcdr(def_list); + } +- vs_push(find_special(MMcdr(args), NULL, NULL)); ++ vs_push(find_special(MMcdr(args), NULL, NULL,NULL)); + Fprogn(vs_head); + lex_env = lex; + } +--- gcl-2.6.12.orig/o/pathname.d ++++ gcl-2.6.12/o/pathname.d +@@ -28,744 +28,93 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include + #include "include.h" + ++DEFUN_NEW("C-SET-T-TT",object,fSc_set_t_tt,SI,2,2,NONE,OO,IO,OO,OO,(object x,fixnum y),"") { ++ x->d.tt=y; ++ RETURN1(x); ++} ++ ++ ++DEFUN_NEW("C-T-TT",object,fSc_t_tt,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") { ++ RETURN1((object)(fixnum)x->d.tt); ++} ++ ++ ++DEFUN_NEW("C-SET-PATHNAME-NAMESTRING",object,fSc_set_pathname_namestring,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { ++ check_type_pathname(&x); ++ x->pn.pn_namestring=y; ++ RETURN1(x); ++} ++ ++DEFUN_NEW("C-PATHNAME-HOST",object,fSc_pathname_host,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_host); ++} ++DEFUN_NEW("C-PATHNAME-DEVICE",object,fSc_pathname_device,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_device); ++} ++DEFUN_NEW("C-PATHNAME-DIRECTORY",object,fSc_pathname_directory,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_directory); ++} ++DEFUN_NEW("C-PATHNAME-NAME",object,fSc_pathname_name,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_name); ++} ++DEFUN_NEW("C-PATHNAME-TYPE",object,fSc_pathname_type,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_type); ++} ++DEFUN_NEW("C-PATHNAME-VERSION",object,fSc_pathname_version,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_version); ++} ++DEFUN_NEW("C-PATHNAME-NAMESTRING",object,fSc_pathname_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_pathname(&x); ++ RETURN1(x->pn.pn_namestring); ++} + +-object +-make_pathname(host, device, directory, name, type, version) +-object host, device, directory, name, type, version; +-{ +- object x; +- +- x = alloc_object(t_pathname); +- x->pn.pn_host = host; +- x->pn.pn_device = device; +- x->pn.pn_directory = directory; +- x->pn.pn_name = name; +- x->pn.pn_type = type; +- x->pn.pn_version = version; +- return(x); +-} +- +-static void +-make_one(s, end) +-char *s; +-int end; +-{ +- int i; +- +-#ifdef UNIX +- for (i = 0; i < end; i++) +- token->st.st_self[i] = s[i]; +-#endif +-#ifdef AOSVS +- +- +- +-#endif +- token->st.st_fillp = end; +- vs_push(copy_simple_string(token)); +-} +- +-/* The function below does not attempt to handle DOS pathnames +- which use backslashes as directory separators. It needs +- TLC from someone who feels pedantic. MJT */ +- +-/* !!!!! Bug Fix. NLG */ +-object +-parse_namestring(s, start, end, ep) +-object s; +-int start, end, *ep; +-{ +- int i, j, k, founddosdev = FALSE, oldstart=start, oldend=end, justdevice = FALSE; +- int d; +- object *vsp; +- object x; +- vs_mark; +- +-#ifndef IS_DIR_SEPARATOR +-#define IS_DIR_SEPARATOR(x) (x == '/') +-#endif +- +- *ep=oldend; +- vsp = vs_top + 1; +- for (;--end >= start && isspace((int)s->st.st_self[end]);); +- +- /* Check for a DOS path and process later */ +- if ( ( (start+1) <= end) && (s->st.st_self[start+1] == ':' )) { +- start+=2; +- founddosdev = TRUE; +- } +- if ( start > end ) { +- make_one(&s->st.st_self[0], 0); +- justdevice = TRUE; +- } else { +- for (i = j = start; i <= end; ) { +-#ifdef UNIX +- if (IS_DIR_SEPARATOR(s->st.st_self[i])) { +-#endif +- if (j == start && i == start) { +- i++; +- vs_push(sKroot); +- j = i; +- continue; +- } +-#ifdef UNIX +- if (i-j == 1 && s->st.st_self[j] == '.') { +- vs_push(sKcurrent); +- } else if (i-j == 1 && s->st.st_self[j] == '*') { +- vs_push(sKwild); +- } else if (i-j==2 && s->st.st_self[j]=='.' && s->st.st_self[j+1]=='.') { +- vs_push(sKparent); +- } else { +- make_one(&s->st.st_self[j], i-j); +- } +-#endif +- i++; +- j = i; +- } else { +- i++; +- } +- } +- *ep = i; +- vs_push(Cnil); +- while (vs_top > vsp) +- stack_cons(); +- if (i == j) { +- /* no file and no type */ +- vs_push(Cnil); +- vs_push(Cnil); +- goto L; +- } +- for (k = j, d = -1; k < i; k++) +- if (s->st.st_self[k] == '.') +- d = k; +- if (d == -1) { +- /* no file type */ +-#ifdef UNIX +- if (i-j == 1 && s->st.st_self[j] == '*') +-#endif +- vs_push(sKwild); +- else +- make_one(&s->st.st_self[j], i-j); +- +- vs_push(Cnil); +- } else if (d == j) { +- /* no file name */ +- vs_push(Cnil); +-#ifdef UNIX +- if (i-d-1 == 1 && s->st.st_self[d+1] == '*') +-#endif +- vs_push(sKwild); +- else +- make_one(&s->st.st_self[d+1], i-d-1); +- } else { +- /* file name and file type */ +-#ifdef UNIX +- if (d-j == 1 && s->st.st_self[j] == '*') +-#endif +- vs_push(sKwild); +- else { +- make_one(&s->st.st_self[j], d-j); +- } +-#ifdef UNIX +- if (i-d-1 == 1 && s->st.st_self[d+1] == '*') +-#endif +- vs_push(sKwild); +- else +- make_one(&s->st.st_self[d+1], i-d-1); +- } +- } +-L: +- /* Process DOS device name found earlier, build a string in a list and push it */ +- if ( founddosdev ) { +- /* Drive letter */ +- token->st.st_self[0] = s->st.st_self[oldstart]; +- /* Colon */ +- token->st.st_self[1] = s->st.st_self[oldstart+1]; +- /* Fill pointer */ +- token->st.st_fillp = 2; +- /* Push */ +- vs_push(make_cons(copy_simple_string(token),Cnil)); +- } else { +- /* No device name */ +- vs_push(Cnil); +- } +- if ( justdevice ) { +- x = make_pathname ( Cnil, vs_top[-1], Cnil, Cnil, Cnil, Cnil ); +- } else { +- x = make_pathname ( Cnil, vs_top[-1], vs_top[-4], vs_top[-3], vs_top[-2], Cnil ); +- } +- vs_reset; +- return(x); +-} +- +-object +-coerce_to_pathname(x) +-object x; +-{ +- object y; +- int e; +- +-L: +- switch (type_of(x)) { +- case t_symbol: +- case t_string: +- /* !!!!! Bug Fix. NLG */ +- y = parse_namestring(x, 0, x->st.st_fillp, &e); +- if (y == OBJNULL || e != x->st.st_fillp) +- goto CANNOT_COERCE; +- return(y); +- +- case t_pathname: +- return(x); +- +- case t_stream: +- switch (x->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_probe: +- case smm_io: +- x = x->sm.sm_object1; +- /* +- The file was stored in sm.sm_object1. +- See open. +- */ +- goto L; +- +- case smm_synonym: +- x = symbol_value(x->sm.sm_object0); +- goto L; +- +- default: +- goto CANNOT_COERCE; +- } +- +- default: +- CANNOT_COERCE: +- FEerror("~S cannot be coerced to a pathname.", 1, x); +- return(Cnil); +- } +-} +- +-static object +-default_device(host) +-object host; +-{ +- return(Cnil); +- /* not implemented yet */ +-} +- +-object +-merge_pathnames(path, defaults, default_version) +-object path, defaults, default_version; +-{ +- object host, device, directory, name, type, version; +- +- if (path->pn.pn_host == Cnil) +- host = defaults->pn.pn_host; +- else +- host = path->pn.pn_host; +- if (path->pn.pn_device == Cnil) +- if (path->pn.pn_host == Cnil) +- device = defaults->pn.pn_device; +- else if (path->pn.pn_host == defaults->pn.pn_host) +- device = defaults->pn.pn_device; +- else +- device = default_device(path->pn.pn_host); +- else +- device = path->pn.pn_device; +- +- if (defaults->pn.pn_directory==Cnil || +- (type_of(path->pn.pn_directory)==t_cons +- && path->pn.pn_directory->c.c_car==sKroot)) +- directory=path->pn.pn_directory; +- else +- directory=path->pn.pn_directory==Cnil ? +- defaults->pn.pn_directory : +- append(defaults->pn.pn_directory,path->pn.pn_directory); +- +- if (path->pn.pn_name == Cnil) +- name = defaults->pn.pn_name; +- else +- name = path->pn.pn_name; +- if (path->pn.pn_type == Cnil) +- type = defaults->pn.pn_type; +- else +- type = path->pn.pn_type; +- version = Cnil; +- /* +- In this implimentation, version is not counted +- */ +- return(make_pathname(host,device,directory,name,type,version)); +-} +- +-/* +- Namestring(x) converts a pathname to a namestring. +-*/ +-object +-namestring(x) +-object x; +-{ +- +- int i, j; +- object l, y; +- +- i = 0; +- +- l = x->pn.pn_device; +- if (endp(l)) { +- goto D; +- } +- y = l->c.c_car; +- y = coerce_to_string(y); +- for (j = 0; j < y->st.st_fillp; j++) { +- token->st.st_self[i++] = y->st.st_self[j]; +- } +- +-D: l = x->pn.pn_directory; +- if (endp(l)) +- goto L; +- y = l->c.c_car; +- if (y == sKroot) { +-#ifdef UNIX +- token->st.st_self[i++] = '/'; +-#endif +- l = l->c.c_cdr; +- } +- for (; !endp(l); l = l->c.c_cdr) { +- y = l->c.c_car; +-#ifdef UNIX +- if (y == sKcurrent) { +- token->st.st_self[i++] = '.'; +- token->st.st_self[i++] = '/'; +- continue; +- } else if (y == sKwild) { +- token->st.st_self[i++] = '*'; +- token->st.st_self[i++] = '/'; +- continue; +- } else if (y == sKparent) { +- token->st.st_self[i++] = '.'; +- token->st.st_self[i++] = '.'; +- token->st.st_self[i++] = '/'; +- continue; +- } +-#endif +- y = coerce_to_string(y); +- for (j = 0; j < y->st.st_fillp; j++) +- token->st.st_self[i++] +- = y->st.st_self[j]; +-#ifdef UNIX +- token->st.st_self[i++] = '/'; +-#endif +-#ifdef AOSVS +- +-#endif +- } +-L: +- y = x->pn.pn_name; +- if (y == Cnil) +- goto M; +- if (y == sKwild) { +-#ifdef UNIX +- token->st.st_self[i++] = '*'; +-#endif +-#ifdef AOSVS +- +-#endif +- goto M; +- } +- if (type_of(y) != t_string) +- FEerror("~S is an illegal pathname name.", 1, y); +- for (j = 0; j < y->st.st_fillp; j++) +- token->st.st_self[i++] = y->st.st_self[j]; +-M: +- y = x->pn.pn_type; +- if (y == Cnil) +- goto N; +- if (y == sKwild) { +- token->st.st_self[i++] = '.'; +-#ifdef UNIX +- token->st.st_self[i++] = '*'; +-#endif +-#ifdef AOSVS +- +-#endif +- goto N; +- } +- if (type_of(y) != t_string) +- FEerror("~S is an illegal pathname name.", 1, y); +- token->st.st_self[i++] = '.'; +- for (j = 0; j < y->st.st_fillp; j++) +- token->st.st_self[i++] = y->st.st_self[j]; +-N: +- token->st.st_fillp = i; +-#ifdef FIX_FILENAME +- {char buf[MAXPATHLEN]; +- if (i > MAXPATHLEN-1) i =MAXPATHLEN-1; +- memcpy(buf,token->st.st_self,i); +- buf[i]=0; +- FIX_FILENAME(x,buf); +- return (make_simple_string(buf)); +- } +-#endif +- return(copy_simple_string(token)); +-} +- +-object +-coerce_to_namestring(x) +-object x; +-{ +- +-L: +- switch (type_of(x)) { +- case t_symbol: +- {BEGIN_NO_INTERRUPT; +- vs_push(alloc_simple_string(x->s.s_fillp)); +- /* By Nick Gall */ +- vs_head->st.st_self = alloc_relblock(x->s.s_fillp); +- { +- int i; +- for (i = 0; i < x->s.s_fillp; i++) +- vs_head->st.st_self[i] = x->s.s_self[i]; +- } +- END_NO_INTERRUPT;} +- return(vs_pop); +- +- case t_string: +- return(x); +- +- case t_pathname: +- return(namestring(x)); +- +- case t_stream: +- switch (x->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_probe: +- case smm_io: +- x = x->sm.sm_object1; +- /* +- The file was stored in sm.sm_object1. +- See open. +- */ +- goto L; +- +- case smm_synonym: +- x = symbol_value(x->sm.sm_object0); +- goto L; +- +- default: +- goto CANNOT_COERCE; +- } +- +- default: +- CANNOT_COERCE: +- FEerror("~S cannot be coerced to a namestring.", 1, x); +- return(Cnil); +- } +-} +- +-LFD(Lpathname)(void) +-{ +- check_arg(1); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +-} +- +-@(defun parse_namestring (thing +- &o host +- (defaults `symbol_value(Vdefault_pathname_defaults)`) +- &k start end junk_allowed +- &a x y) +- int s, e, ee; +-@ +- check_type_or_pathname_string_symbol_stream(&thing); +- check_type_or_pathname_string_symbol_stream(&defaults); +- defaults = coerce_to_pathname(defaults); +- x = thing; +-L: +- switch (type_of(x)) { +- case t_symbol: +- case t_string: +- get_string_start_end(x, start, end, &s, &e); +- for (; s < e && isspace((int)x->st.st_self[s]); s++) +- ; +- y +- /* !!!!! Bug Fix. NLG */ +- = parse_namestring(x, +- s, +- e - s, +- &ee); +- if (junk_allowed == Cnil) { +- for (; ee < e - s; ee++) +- if (!isspace((int)x->st.st_self[s + ee])) +- break; +- if (y == OBJNULL || ee != e - s) +- FEerror("Cannot parse the namestring ~S~%\ +-from ~S to ~S.", +- 3, x, start, end); +- } else +- if (y == OBJNULL) +- @(return Cnil `make_fixnum(s + ee)`) +- start = make_fixnum(s + ee); +- break; +- +- case t_pathname: +- y = x; +- break; +- +- case t_stream: +- switch (x->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_probe: +- case smm_io: +- x = x->sm.sm_object1; +- /* +- The file was stored in sm.sm_object1. +- See open. +- */ +- goto L; +- +- case smm_synonym: +- x = symbol_value(x->sm.sm_object0); +- goto L; +- +- default: +- goto CANNOT_PARSE; +- } +- +- default: +- CANNOT_PARSE: +- FEerror("Cannot parse the namestring ~S.", 1, x); +- } +- if (host != Cnil && y->pn.pn_host != Cnil && +- host != y->pn.pn_host) +- FEerror("The hosts ~S and ~S do not match.", +- 2, host, y->pn.pn_host); +- @(return y start) +-@) +- +-@(defun merge_pathnames (path +- &o (defaults `symbol_value(Vdefault_pathname_defaults)`) +- (default_version sKnewest)) +-@ +- check_type_or_pathname_string_symbol_stream(&path); +- check_type_or_pathname_string_symbol_stream(&defaults); +- path = coerce_to_pathname(path); +- defaults = coerce_to_pathname(defaults); +- @(return `merge_pathnames(path, defaults, default_version)`) +-@) +- +-@(defun make_pathname (&key +- (host `Cnil` host_supplied_p) +- (device `Cnil` device_supplied_p) +- (directory `Cnil` directory_supplied_p) +- (name `Cnil` name_supplied_p) +- (type `Cnil` type_supplied_p) +- (version `Cnil` version_supplied_p) +- defaults +- &aux x) +-@ +- if ( defaults == Cnil ) { +- defaults = symbol_value ( Vdefault_pathname_defaults ); +- defaults = coerce_to_pathname ( defaults ); +- defaults = make_pathname ( defaults->pn.pn_host, +- Cnil, Cnil, Cnil, Cnil, Cnil); +- } else { +- defaults = coerce_to_pathname(defaults); +- } +- x = make_pathname(host, device, directory, name, type, version); +- x = merge_pathnames(x, defaults, Cnil); +- if ( host_supplied_p) x->pn.pn_host = host; +- if (device_supplied_p) x->pn.pn_device = device; +- if (directory_supplied_p) x->pn.pn_directory = directory; +- if (name_supplied_p) x->pn.pn_name = name; +- if (type_supplied_p) x->pn.pn_type = type; +- if (version_supplied_p) x->pn.pn_version = version; +- @(return x) +-@) +- +-LFD(Lpathnamep)(void) +-{ +- check_arg(1); +- +- if (type_of(vs_base[0]) == t_pathname) +- vs_base[0] = Ct; +- else +- vs_base[0] = Cnil; +-} +- +-LFD(Lpathname_host)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_host; +-} +- +-LFD(Lpathname_device)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_device; +-} +- +-LFD(Lpathname_directory)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_directory; +-} +- +-LFD(Lpathname_name)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_name; +-} +- +-LFD(Lpathname_type)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_type; +-} +- +-LFD(Lpathname_version)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_version; +-} +- +-LFD(Lnamestring)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_namestring(vs_base[0]); +-} +- +-LFD(Lfile_namestring)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] +- = make_pathname(Cnil, Cnil, Cnil, +- vs_base[0]->pn.pn_name, +- vs_base[0]->pn.pn_type, +- vs_base[0]->pn.pn_version); +- vs_base[0] = namestring(vs_base[0]); +-} +- +-LFD(Ldirectory_namestring)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] +- = make_pathname(Cnil, Cnil, +- vs_base[0]->pn.pn_directory, +- Cnil, Cnil, Cnil); +- vs_base[0] = namestring(vs_base[0]); +-} +- +-LFD(Lhost_namestring)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0] = vs_base[0]->pn.pn_host; +- if (vs_base[0] == Cnil || vs_base[0] == sKwild) +- vs_base[0] = make_simple_string(""); +-} +- +-@(defun enough_namestring (path +- &o (defaults `symbol_value(Vdefault_pathname_defaults)`)) +-@ +- check_type_or_pathname_string_symbol_stream(&path); +- check_type_or_pathname_string_symbol_stream(&defaults); +- defaults = coerce_to_pathname(defaults); +- path = coerce_to_pathname(path); +- path +- = make_pathname(equalp(path->pn.pn_host, defaults->pn.pn_host) ? +- Cnil : path->pn.pn_host, +- equalp(path->pn.pn_device, +- defaults->pn.pn_device) ? +- Cnil : path->pn.pn_device, +- equalp(path->pn.pn_directory, +- defaults->pn.pn_directory) ? +- Cnil : path->pn.pn_directory, +- equalp(path->pn.pn_name, defaults->pn.pn_name) ? +- Cnil : path->pn.pn_name, +- equalp(path->pn.pn_type, defaults->pn.pn_type) ? +- Cnil : path->pn.pn_type, +- equalp(path->pn.pn_version, +- defaults->pn.pn_version) ? +- Cnil : path->pn.pn_version); +- @(return `namestring(path)`) +-@) ++ ++DEFUN_NEW("C-STREAM-OBJECT0",object,fSc_stream_object0,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(x->sm.sm_object0); ++} ++ ++DEFUN_NEW("C-STREAM-OBJECT1",object,fSc_stream_object1,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(x->sm.sm_object1); ++} ++ ++DEFUN_NEW("C-SET-STREAM-OBJECT1",object,fSc_set_stream_object1,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { ++ x->sm.sm_object1=y; ++ RETURN1(x); ++} ++ ++DEFUN_NEW("INIT-PATHNAME",object,fSinit_pathname,SI,7,7,NONE,OO,OO,OO,OO, ++ (object host,object device,object directory,object name,object type,object version,object namestring),"") { ++ ++ object x=alloc_object(t_pathname); ++ ++ x->pn.pn_host=host; ++ x->pn.pn_device=device; ++ x->pn.pn_directory=directory; ++ x->pn.pn_name=name; ++ x->pn.pn_type=type; ++ x->pn.pn_version=version; ++ x->pn.pn_namestring=namestring; ++ ++ RETURN1(x); ++ ++} ++ ++DEFUN_NEW("PATHNAMEP",object,fLpathnamep,LISP,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(type_of(x)==t_pathname ? Ct : Cnil); ++} + + void +-gcl_init_pathname(void) +-{ +- Vdefault_pathname_defaults = +- make_special("*DEFAULT-PATHNAME-DEFAULTS*", +- make_pathname(Cnil, Cnil, Cnil, Cnil, Cnil, Cnil)); +- +- sKwild = make_keyword("WILD"); +- sKnewest = make_keyword("NEWEST"); +- +- sKstart = make_keyword("START"); +- sKend = make_keyword("END"); +- sKjunk_allowed = make_keyword("JUNK-ALLOWED"); +- +- sKhost = make_keyword("HOST"); +- sKdevice = make_keyword("DEVICE"); +- sKdirectory = make_keyword("DIRECTORY"); +- sKname = make_keyword("NAME"); +- sKtype = make_keyword("TYPE"); +- sKversion = make_keyword("VERSION"); +- sKdefaults = make_keyword("DEFAULTS"); +- +- sKroot = make_keyword("ROOT"); +- sKcurrent = make_keyword("CURRENT"); +- sKparent = make_keyword("PARENT"); +- sKper = make_keyword("PER"); ++gcl_init_pathname(void) { ++ + } + + void +-gcl_init_pathname_function() +-{ +- make_function("PATHNAME", Lpathname); +- make_function("PARSE-NAMESTRING", Lparse_namestring); +- make_function("MERGE-PATHNAMES", Lmerge_pathnames); +- make_function("MAKE-PATHNAME", Lmake_pathname); +- make_function("PATHNAMEP", Lpathnamep); +- make_function("PATHNAME-HOST", Lpathname_host); +- make_function("PATHNAME-DEVICE", Lpathname_device); +- make_function("PATHNAME-DIRECTORY", Lpathname_directory); +- make_function("PATHNAME-NAME", Lpathname_name); +- make_function("PATHNAME-TYPE", Lpathname_type); +- make_function("PATHNAME-VERSION", Lpathname_version); +- make_function("NAMESTRING", Lnamestring); +- make_function("FILE-NAMESTRING", Lfile_namestring); +- make_function("DIRECTORY-NAMESTRING", Ldirectory_namestring); +- make_function("HOST-NAMESTRING", Lhost_namestring); +- make_function("ENOUGH-NAMESTRING", Lenough_namestring); ++gcl_init_pathname_function(void) { ++ + } +--- gcl-2.6.12.orig/o/predicate.c ++++ gcl-2.6.12/o/predicate.c +@@ -29,6 +29,10 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include + #include "include.h" + ++DEFUN_NEW("PATHNAME-DESIGNATORP",object,fSpathname_designatorp,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ RETURN1(pathname_designatorp(x) ? Ct : Cnil); ++} ++ + DEFUNO_NEW("NULL",object,fLnull,LISP + ,1,1,NONE,OO,OO,OO,OO,void,Lnull,(object x0),"") + { +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -1260,6 +1260,7 @@ int level; + write_ch('>'); + break; + ++ case smm_file_synonym: + case smm_synonym: + write_str("#sm.sm_object0, level); +@@ -1381,7 +1382,7 @@ int level; + if (1 || PRINTescape) { + write_ch('#'); + write_ch('p'); +- vs_push(namestring(x)); ++ vs_push(x->pn.pn_namestring==Cnil ? make_simple_string("") : x->pn.pn_namestring); + write_object(vs_head, level); + vs_popp; + } else { +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -1564,38 +1564,6 @@ Ldefault_dispatch_macro() + } + + /* +- #p" ... " returns the pathname with namestring ... . +-*/ +-static void +-Lsharp_p_reader() +-{ +- check_arg(3); +- if (vs_base[2] != Cnil && !READsuppress) +- extra_argument('p'); +- vs_popp; +- vs_popp; +- vs_base[0] = read_object(vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +-} +- +-/* +- #" ... " returns the pathname with namestring ... . +-*/ +-static void +-Lsharp_double_quote_reader() +-{ +- check_arg(3); +- +- if (vs_base[2] != Cnil && !READsuppress) +- extra_argument('"'); +- vs_popp; +- unread_char(vs_base[1], vs_base[0]); +- vs_popp; +- vs_base[0] = read_object(vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +-} +- +-/* + #$ fixnum returns a random-state with the fixnum + as its content. + */ +@@ -2369,9 +2337,6 @@ gcl_init_read() + dtab['<'] = make_cf(Lsharp_less_than_reader); + */ + dtab['|'] = make_cf(Lsharp_vertical_bar_reader); +- dtab['"'] = make_cf(Lsharp_double_quote_reader); +- dtab['p'] = make_cf(Lsharp_p_reader); +- dtab['P'] = make_cf(Lsharp_p_reader); + /* This is specific to this implimentation */ + dtab['$'] = make_cf(Lsharp_dollar_reader); + /* This is specific to this implimentation */ +--- gcl-2.6.12.orig/o/regexp.c ++++ gcl-2.6.12/o/regexp.c +@@ -117,7 +117,7 @@ min_initial_branch_length(regexp *, unsi + #define PLUS 11 /* node Match this (simple) thing 1 or more times. */ + #define OPEN 20 /* no Mark this point in input as start of #n. */ + /* OPEN+1 is number 1, etc. */ +-#define CLOSE 30 /* no Analogous to OPEN. */ ++#define CLOSE (OPEN+NSUBEXP) /* no Analogous to OPEN. */ + + /* + * Opcode notes: +@@ -1083,15 +1083,8 @@ regmatch(char *prog) + break; + case BACK: + break; +- case OPEN+1: +- case OPEN+2: +- case OPEN+3: +- case OPEN+4: +- case OPEN+5: +- case OPEN+6: +- case OPEN+7: +- case OPEN+8: +- case OPEN+9: { ++ case OPEN+1 ... OPEN+NSUBEXP-1: ++ { + register int no; + register char *save; + +@@ -1112,15 +1105,8 @@ regmatch(char *prog) + } + /* NOTREACHED */ + break; +- case CLOSE+1: +- case CLOSE+2: +- case CLOSE+3: +- case CLOSE+4: +- case CLOSE+5: +- case CLOSE+6: +- case CLOSE+7: +- case CLOSE+8: +- case CLOSE+9: { ++ case CLOSE+1 ... CLOSE+NSUBEXP-1: ++ { + register int no; + register char *save; + +@@ -1394,27 +1380,11 @@ char *op; + case END: + p = "END"; + break; +- case OPEN+1: +- case OPEN+2: +- case OPEN+3: +- case OPEN+4: +- case OPEN+5: +- case OPEN+6: +- case OPEN+7: +- case OPEN+8: +- case OPEN+9: ++ case OPEN+1 ... OPEN+NSUBEXP-1: + sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); + p = NULL; + break; +- case CLOSE+1: +- case CLOSE+2: +- case CLOSE+3: +- case CLOSE+4: +- case CLOSE+5: +- case CLOSE+6: +- case CLOSE+7: +- case CLOSE+8: +- case CLOSE+9: ++ case CLOSE+1 ... CLOSE+NSUBEXP-1: + sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); + p = NULL; + break; +--- gcl-2.6.12.orig/o/regexp.h ++++ gcl-2.6.12/o/regexp.h +@@ -1,7 +1,7 @@ + #ifndef _REGEXP + #define _REGEXP 1 + +-#define NSUBEXP 10 ++#define NSUBEXP 19 + typedef struct regexp { + char *startp[NSUBEXP]; + char *endp[NSUBEXP]; +--- gcl-2.6.12.orig/o/regexpr.c ++++ gcl-2.6.12/o/regexpr.c +@@ -81,6 +81,7 @@ DEFUN_NEW("COMPILE-REGEXP",object,fScomp + res->v.v_elttype=aet_uchar; + res->v.v_adjustable=0; + res->v.v_offset=0; ++ res->v.v_self=NULL; + if (!(res->v.v_self=(void *)regcomp(tmp,&res->v.v_dim))) + FEerror("regcomp failure",0); + res->v.v_fillp=res->v.v_dim; +--- gcl-2.6.12.orig/o/run_process.c ++++ gcl-2.6.12/o/run_process.c +@@ -177,10 +177,12 @@ void run_process ( char *name ) + stream_in->sm.sm_mode = smm_input; + stream_in->sm.sm_fp = ofp; + stream_in->sm.sm_buffer = 0; ++ stream_in->sm.sm_flags=0; + stream_out = (object) alloc_object(t_stream); + stream_out->sm.sm_mode = smm_output; + stream_out->sm.sm_fp = ifp; + stream_out->sm.sm_buffer = 0; ++ stream_out->sm.sm_flags=0; + setup_stream_buffer ( stream_in ); + setup_stream_buffer ( stream_out ); + stream = make_two_way_stream ( stream_in, stream_out ); +@@ -433,6 +435,7 @@ enum smmode smm; + stream->sm.sm_object0 = sLcharacter; + stream->sm.sm_object1 = host_l; + stream->sm.sm_int0 = stream->sm.sm_int1 = 0; ++ stream->sm.sm_flags=0; + vs_push(stream); + setup_stream_buffer(stream); + vs_reset; +@@ -503,6 +506,7 @@ make_socket_pair() + stream_in->sm.sm_int0 = sockets_in[1]; + stream_in->sm.sm_int1 = 0; + stream_in->sm.sm_object0=stream_in->sm.sm_object1=OBJNULL; ++ stream_in->sm.sm_flags = 0; + stream_out = (object) alloc_object(t_stream); + stream_out->sm.sm_mode = smm_output; + stream_out->sm.sm_fp = fp2; +@@ -511,6 +515,7 @@ make_socket_pair() + setup_stream_buffer(stream_out); + stream_out->sm.sm_int0 = sockets_out[1]; + stream_out->sm.sm_int1 = 0; ++ stream_out->sm.sm_flags = 0; + stream_out->sm.sm_object0=stream_out->sm.sm_object1=OBJNULL; + stream = make_two_way_stream(stream_in, stream_out); + return(stream); +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -151,6 +151,16 @@ find_init_address(struct syment *sym,str + + } + ++static ul ++get_sym_value(const char *name) { ++ ++ struct node *answ; ++ ++ return (answ=find_sym_ptable(name)) ? answ->address : ++ ({massert(!emsg("Unrelocated non-local symbol: %s\n",name));0;}); ++ ++} ++ + static void + relocate_symbols(struct syment *sym,struct syment *sye,struct scnhdr *sec1,char *st1) { + +@@ -163,22 +173,10 @@ relocate_symbols(struct syment *sym,stru + + else if (!sym->n_scnum) { + +- char c=0,*s; +- +- if (sym->n.n.n_zeroes) { +- c=sym->n.n_name[8]; +- sym->n.n_name[8]=0; +- s=sym->n.n_name; +- } else +- s=st1+sym->n.n.n_offset; +- +- if ((answ=find_sym_ptable(s))) +- sym->n_value=answ->address; ++ if (sym->n.n.n_zeroes) ++ STOP(sym->n.n_name,sym->n_value=get_sym_value(sym->n.n_name)); + else +- massert(!emsg("Unrelocated non-local symbol: %s\n",s)); +- +- if (c) +- sym->n.n_name[8]=c; ++ sym->n_value=get_sym_value(st1+sym->n.n.n_offset); + + } + +@@ -391,13 +389,11 @@ fasload(object faslfile) { + struct reloc *rel,*rele; + object memory, data; + FILE *fp; +- char filename[MAXPATHLEN],*st1,*ste; ++ char *st1,*ste; + int i; + ul init_address=0; + void *st,*est; + +- coerce_to_filename(faslfile, filename); +- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror); + fp = faslfile->sm.sm_fp; + + massert(st=get_mmap(fp,&est)); +@@ -427,7 +423,6 @@ fasload(object faslfile) { + data = read_fasl_vector(faslfile); + + massert(!un_mmap(st,est)); +- close_stream(faslfile); + + #ifdef CLEAR_CACHE + CLEAR_CACHE; +--- gcl-2.6.12.orig/o/sfaslelf.c ++++ gcl-2.6.12/o/sfaslelf.c +@@ -542,15 +542,13 @@ int + fasload(object faslfile) { + + FILE *fp; +- char filename[256],*sn,*st1,*dst1; ++ char *sn,*st1,*dst1; + ul init_address=0,end,gs=0,*got=&gs,*gote=got+1; + object memory,data; + Shdr *sec1,*sece; + Sym *sym1,*syme,*dsym1,*dsyme; + void *v1,*ve; + +- coerce_to_filename(faslfile, filename); +- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror); + fp = faslfile->sm.sm_fp; + + massert(v1=get_mmap(fp,&ve)); +@@ -573,7 +571,6 @@ fasload(object faslfile) { + data=feof(fp) ? 0 : read_fasl_vector(faslfile); + + massert(!un_mmap(v1,ve)); +- close_stream(faslfile); + + massert(!clear_protect_memory(memory)); + +--- gcl-2.6.12.orig/o/sfaslmacho.c ++++ gcl-2.6.12/o/sfaslmacho.c +@@ -524,7 +524,6 @@ fasload(object faslfile) { + + FILE *fp; + object data; +- char filename[256]; + ul init_address=-1; + object memory; + void *v1,*ve,*p; +@@ -533,8 +532,6 @@ fasload(object faslfile) { + char *st1=NULL,*ste=NULL; + ul gs,*got=&gs,*gote,*io1=NULL,rls,start; + +- coerce_to_filename(faslfile, filename); +- faslfile = open_stream(faslfile, smm_input, Cnil, sKerror); + fp = faslfile->sm.sm_fp; + + massert(v1=get_mmap(fp,&ve)); +@@ -563,7 +560,6 @@ fasload(object faslfile) { + #endif + + massert(!un_mmap(v1,ve)); +- close_stream(faslfile); + + init_address-=(ul)memory->cfd.cfd_start; + call_init(init_address,memory,data,0); +--- gcl-2.6.12.orig/o/sgbc.c ++++ gcl-2.6.12/o/sgbc.c +@@ -717,7 +717,7 @@ sgc_start(void) { + void *p=NULL,*pe; + struct pageinfo *pi; + ufixnum i; +- ++ + old_cb_pointer=cb_pointer; + reset_contblock_freelist(); + +@@ -774,6 +774,8 @@ sgc_start(void) { + object v=sSAwritableA->s.s_dbind; + for (i=page(v->v.v_self);i<=page(v->v.v_self+CEI(v->bv.bv_offset+v->v.v_dim-1,8*sizeof(fixnum))/(8*sizeof(fixnum)));i++) + SET_WRITABLE(i); ++ SET_WRITABLE(page(v)); ++ SET_WRITABLE(page(sSAwritableA)); + } + + tm_of(t_relocatable)->tm_alt_npage=0; +@@ -787,7 +789,7 @@ sgc_start(void) { + Turn memory protection on for the pages which are writable. + */ + sgc_enabled=1; +- if (memory_protect(1)) ++ if (memory_protect(1)) + sgc_quit(); + if (sSAnotify_gbcA->s.s_dbind != Cnil) + emsg("[SGC on]"); +@@ -897,7 +899,7 @@ sgc_quit(void) { + for (p=pagetochar(page(v)),j=tm->tm_nppage;j>0;--j,p+=tm->tm_size) + ((object) p)->d.s=SGC_NORMAL; + #endif +- ++ + for (i=0;iv.v_fillp &&(v=(void *)contblock_array->v.v_self[i]);i++) + if (v->sgc_flags&SGC_PAGE_FLAG) + bzero(CB_SGCF_START(v),CB_DATA_START(v)-CB_SGCF_START(v)); +@@ -931,7 +933,7 @@ memprotect_handler(int sig, long code, v + #endif + if (faddr >= (void *)core_end || faddr < data_start) { + static void *old_faddr; +- if (old_faddr==faddr) ++ if (old_faddr==faddr) + if (fault_count++ > 300) error("fault count too high"); + old_faddr=faddr; + INSTALL_MPROTECT_HANDLER; +@@ -1017,7 +1019,7 @@ memory_protect(int on) { + + if (writable==WRITABLE_PAGE_P(i) && ism.sm_fp); + + #endif + +-static void +-FFN(siLfaslink)(void) +-{ +- bds_ptr old_bds_top; +- int i; +- object package; +- +- check_arg(2); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- check_type_string(&vs_base[1]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[0]->pn.pn_type = FASL_string; +- vs_base[0] = namestring(vs_base[0]); +- package = symbol_value(sLApackageA); +- old_bds_top = bds_top; +- bds_bind(sLApackageA, package); +- i = faslink(vs_base[0], vs_base[1]); +- bds_unwind(old_bds_top); +- vs_top = vs_base; +- vs_push(make_fixnum(i)); +-} +- + #endif + #endif/* svr4 */ + #endif /* UNIXFASL */ + + void +-gcl_init_unixfasl(void) +-{ +-#ifdef FASLINK +- make_si_function("FASLINK", siLfaslink); +-#endif ++gcl_init_unixfasl(void) { + } +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -44,10 +44,6 @@ Foundation, 675 Mass Ave, Cambridge, MA + #define HAVE_RENAME + #endif + +-void Ldirectory(void); +- +- +- + #ifdef NEED_GETWD + #include + +@@ -168,17 +164,41 @@ getwd(char *buffer) { + b_[_c+_d]=0;\ + }) + ++static object ++get_string(object x) { ++ switch(type_of(x)) { ++ case t_symbol: ++ case t_string: ++ return x; ++ case t_pathname: ++ return x->pn.pn_namestring; ++ case t_stream: ++ switch(x->sm.sm_mode) { ++ case smm_input: ++ case smm_output: ++ case smm_probe: ++ case smm_io: ++ return get_string(x->sm.sm_object1); ++ case smm_file_synonym: ++ case smm_synonym: ++ return get_string(x->sm.sm_object0->s.s_dbind); ++ } ++ } ++ return Cnil; ++} ++ ++ + void + coerce_to_filename(object pathname,char *p) { + +- object namestring=coerce_to_namestring(pathname); ++ object namestring=get_string(pathname); + unsigned e=namestring->st.st_fillp; +- char *q=namestring->st.st_self,*qe=q+e;; ++ char *q=namestring->st.st_self,*qe=q+e; + +- if (pathname==Cnil) ++ if (pathname==Cnil||namestring==Cnil) + FEerror ( "NIL argument.", 1, pathname ); + +- if (*q=='~') { ++ if (*q=='~' && e) { + + unsigned m=0; + char *s=++q,*c; +@@ -224,134 +244,6 @@ coerce_to_filename(object pathname,char + + } + +-object +-truename(object pathname) +-{ +- register char *p, *q; +- char filename[MAXPATHLEN]; +- char truefilename[MAXPATHLEN]; +- char current_directory[MAXPATHLEN]; +- char directory[MAXPATHLEN]; +-#ifdef __MINGW32__ +- DWORD current_directory_length = +- GetCurrentDirectory ( MAXPATHLEN, current_directory ); +- if ( MAXPATHLEN < current_directory_length ) { +- FEerror ( "truename got a current directory name larger than MAXPATHLEN", 1, "" ); +- } +- if ( 0 == current_directory_length ) { +- FEerror ( "truename could not determine the current directory.", 1, "" ); +- } +-#else +- massert(current_directory==getcwd(current_directory,sizeof(current_directory))); +-#endif +- +- coerce_to_filename(pathname, filename); +- +-#ifdef S_IFLNK +- { +- +- struct stat filestatus; +- int islinkcount=8; +- +- if (lstat(filename, &filestatus) >= 0) +- +- while (((filestatus.st_mode&S_IFMT) == S_IFLNK) && (--islinkcount>0)) { +- +- char newname[MAXPATHLEN]; +- int newlen; +- +- newlen=readlink(filename,newname,MAXPATHLEN-1); +- if (newlen < 0) +- return((FEerror("Symlink broken at ~S.",1,pathname),Cnil)); +- +- for (p = filename, q = 0; *p != '\0'; p++) +- if (*p == '/') q = p; +- if (q == 0 || *newname == '/') +- q = filename; +- else +- q++; +- +- memcpy(q,newname,newlen); +- q[newlen]=0; +- if (lstat(filename, &filestatus) < 0) +- islinkcount=0; /* It would be ANSI to do the following : +- return(file_error("Symlink broken at ~S.",pathname)); +- but this would break DIRECTORY if a file points to nowhere */ +- } +- } +-#endif +- +- for (p = filename, q = 0; *p != '\0'; p++) +- if (*p == '/') +- q = p; +- if (q == filename) { +- q++; +- p = "/"; +- } else if (q == 0) { +- q = filename; +- p = current_directory; +- } else +-#ifdef __MINGW32__ +- if ( ( q > filename ) && ( q[-1] == ':' ) ) { +- int current = (q++, q[0]); +- q[0]=0; +- if (chdir(filename) < 0) +- FEerror("Cannot get the truename of ~S.", 1, pathname); +- current_directory_length = +- GetCurrentDirectory ( MAXPATHLEN, directory ); +- if ( MAXPATHLEN < current_directory_length ) { +- FEerror ( "truename got a current directory name larger than MAXPATHLEN", 1, "" ); +- } +- if ( 0 == current_directory_length ) { +- FEerror ( "truename could not determine the current directory.", 1, "" ); +- } +- p = directory; +- if ( p[1]==':' && ( p[2]=='\\' || p[2]=='/' ) && p[3]==0 ) p[2]=0; +- q[0]=current; +- } +- else +-#endif +- { +- *q++ = '\0'; +- if (chdir(filename) < 0) +- FEerror("Cannot get the truename of ~S.", 1, pathname); +-#ifdef __MINGW32__ +- current_directory_length = GetCurrentDirectory ( MAXPATHLEN, directory ); +- if ( MAXPATHLEN < current_directory_length ) { +- FEerror ( "truename got a current directory name larger than MAXPATHLEN", 1, "" ); +- } +- if ( 0 == current_directory_length ) { +- FEerror ( "truename could not determine the current directory.", 1, "" ); +- } +- p = directory; +-#else +- p = getcwd(directory,sizeof(directory)); +-#endif +- } +- if (p[0] == '/' && p[1] == '\0') { +- if (strcmp(q, "..") == 0) +- strcpy(truefilename, "/."); +- else +- sprintf(truefilename, "/%s", q); +- } else if (strcmp(q, ".") == 0) +- strcpy(truefilename, p); +- else if (strcmp(q, "..") == 0) { +- for (q = p + strlen(p); *--q != '/';) ; +- if (p == q) +- strcpy(truefilename, "/."); +- else { +- *q = '\0'; +- strcpy(truefilename, p); +- *q = '/'; +- } +- } else +- sprintf(truefilename, "%s/%s", p, q); +- massert(!chdir(current_directory)); +- vs_push(make_simple_string(truefilename)); +- pathname = coerce_to_pathname(vs_head); +- vs_popp; +- return(pathname); +-} + object sSAallow_gzipped_fileA; + + bool +@@ -429,41 +321,6 @@ file_len(FILE *fp) + else return 0; + } + +-LFD(Ltruename)(void) +-{ +- check_arg(1); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = truename(vs_base[0]); +-} +- +-LFD(Lrename_file)(void) +-{ +- char filename[MAXPATHLEN]; +- char newfilename[MAXPATHLEN]; +- +- check_arg(2); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- check_type_or_Pathname_string_symbol(&vs_base[1]); +- coerce_to_filename(vs_base[0], filename); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_base[1] = coerce_to_pathname(vs_base[1]); +- vs_base[1] = merge_pathnames(vs_base[1], vs_base[0], Cnil); +- coerce_to_filename(vs_base[1], newfilename); +-#ifdef HAVE_RENAME +- if (rename(filename, newfilename) < 0) +- FEerror("Cannot rename the file ~S to ~S.", +- 2, vs_base[0], vs_base[1]); +-#else +- sprintf(command, "mv %s %s", filename, newfilename); +- msystem(command); +-#endif +- vs_push(vs_base[1]); +- vs_push(truename(vs_base[0])); +- vs_push(truename(vs_base[1])); +- vs_base += 2; +-} +- +- + DEF_ORDINARY("DIRECTORY",sKdirectory,KEYWORD,""); + DEF_ORDINARY("LINK",sKlink,KEYWORD,""); + DEF_ORDINARY("FILE",sKfile,KEYWORD,""); +@@ -500,33 +357,28 @@ int gcl_putc(int i,void *v) {return putc + + + +-DEFUN_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object path),"") { ++DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + +- char filename[4096]; + struct stat ss; +- + +- bzero(filename,sizeof(filename)); +- coerce_to_filename(path,filename); ++ check_type_string(&x); ++ coerce_to_filename(x,FN1); ++ + #ifdef __MINGW32__ + { +- char *p=filename+strlen(filename)-1; +- for (;p>filename && *p=='/';p--) ++ char *p=FN1+strlen(FN1)-1; ++ for (;p>FN1 && *p=='/';p--) + *p=0; + } + #endif +- if (lstat(filename,&ss)) ++ if (lstat(FN1,&ss)) + RETURN1(Cnil); +- else {/* ctime_r insufficiently portable */ +- /* int j; +- ctime_r(&ss.st_ctime,filename); +- j=strlen(filename); +- if (isspace(filename[j-1])) +- filename[j-1]=0;*/ +- RETURN1(list(3,S_ISDIR(ss.st_mode) ? sKdirectory : +- (S_ISLNK(ss.st_mode) ? sKlink : sKfile), +- make_fixnum(ss.st_size),make_fixnum(ss.st_ctime))); +- } ++ else ++ RETURN4(S_ISDIR(ss.st_mode) ? sKdirectory : ++ (S_ISLNK(ss.st_mode) ? sKlink : sKfile), ++ make_fixnum(ss.st_size), ++ make_fixnum(ss.st_ctime), ++ make_fixnum(ss.st_uid)); + } + + DEFUN_NEW("SETENV",object,fSsetenv,SI,2,2,NONE,OO,OO,OO,OO,(object variable,object value),"Set environment VARIABLE to VALUE") +@@ -551,266 +403,6 @@ DEFUN_NEW("SETENV",object,fSsetenv,SI,2, + RETURN1((res == 0 ? Ct : Cnil )); + } + +-DEFUNO_NEW("DELETE-FILE",object,fLdelete_file,LISP +- ,1,1,NONE,OO,OO,OO,OO,void,Ldelete_file,(object path),"") +- +-{ +- char filename[MAXPATHLEN]; +- +- /* 1 args */ +- check_type_or_pathname_string_symbol_stream(&path); +- coerce_to_filename(path, filename); +- if (unlink(filename) < 0 && rmdir(filename) < 0) +- FEerror("Cannot delete the file ~S: ~s.", 2, path, make_simple_string(strerror(errno))); +- path = Ct; +- RETURN1(path); +-} +-#ifdef STATIC_FUNCTION_POINTERS +-object +-fLdelete_file(object path) { +- return FFN(fLdelete_file)(path); +-} +-#endif +- +-LFD(Lprobe_file)(void) +-{ +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- if (file_exists(vs_base[0])) +- vs_base[0] = truename(vs_base[0]); +- else +- vs_base[0] = Cnil; +-} +- +-LFD(Lfile_write_date)(void) +-{ +- char filename[MAXPATHLEN]; +- struct stat filestatus; +- +- check_arg(1); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- coerce_to_filename(vs_base[0], filename); +- if (stat(filename, &filestatus) < 0 || S_ISDIR(filestatus.st_mode)) +- { vs_base[0] = Cnil; return;} +- vs_base[0] = unix_time_to_universal_time(filestatus.st_mtime); +-} +- +-LFD(Lfile_author)(void) +-{ +-#if !defined(NO_PWD_H) && !defined(STATIC_LINKING) +- char filename[MAXPATHLEN]; +- struct stat filestatus; +- struct passwd *pwent; +-#ifndef __STDC__ +- extern struct passwd *getpwuid(); +-#endif +- +- check_arg(1); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- coerce_to_filename(vs_base[0], filename); +- if (stat(filename, &filestatus) < 0 || S_ISDIR(filestatus.st_mode)) +- { vs_base[0] = Cnil; return;} +- pwent = getpwuid(filestatus.st_uid); +- vs_base[0] = make_simple_string(pwent->pw_name); +-#else +- vs_base[0] = Cnil; return; +-#endif +- +-} +- +-static void +-FFN(Luser_homedir_pathname)(void) +-{ +- +- char filename[MAXPATHLEN]; +- +- coerce_to_filename(make_simple_string("~/"),filename); +- vs_base[0]=coerce_to_pathname(make_simple_string(filename)); +- vs_top = vs_base+1; +- +-} +- +- +-#ifdef BSD +-LFD(Ldirectory)(void) +-{ +- char filename[MAXPATHLEN]; +- char command[MAXPATHLEN * 2]; +- FILE *fp; +- register int i, c; +- object *top = vs_top; +- char iobuffer[BUFSIZ]; +- extern FILE *popen(const char *, const char *); +- +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- if (vs_base[0]->pn.pn_name==Cnil && vs_base[0]->pn.pn_type==Cnil) { +- coerce_to_filename(vs_base[0], filename); +- strcat(filename, "*"); +- } else if (vs_base[0]->pn.pn_name==Cnil) { +- vs_base[0]->pn.pn_name = sKwild; +- coerce_to_filename(vs_base[0], filename); +- vs_base[0]->pn.pn_name = Cnil; +- } else if (vs_base[0]->pn.pn_type==Cnil) { +- coerce_to_filename(vs_base[0], filename); +- strcat(filename, "*"); +- } else +- coerce_to_filename(vs_base[0], filename); +- sprintf(command, "ls -d %s 2> /dev/null", filename); +- fp = popen(command, "r"); +- setbuf(fp, iobuffer); +- for (;;) { +- for (i = 0; (c = getc(fp)); i++) +- if (c <= 0) +- goto L; +- else if (c == '\n') +- break; +- else +- filename[i] = c; +- filename[i] = '\0'; +- vs_push(make_simple_string(filename)); +- vs_head = truename(vs_head); +- } +-L: +- pclose(fp); +- vs_push(Cnil); +- while (vs_top > top + 1) +- stack_cons(); +- vs_base = top; +-} +-#endif +- +- +-#ifdef ATT +-LFD(Ldirectory)() +-{ +- object name, type; +- char filename[MAXPATHLEN]; +- FILE *fp; +- object *top = vs_top; +- char iobuffer[BUFSIZ]; +- struct direct dir; +- int i; +- +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_push(vs_base[0]->pn.pn_name); +- vs_push(vs_base[0]->pn.pn_type); +- vs_base[0]->pn.pn_name = Cnil; +- vs_base[0]->pn.pn_type = Cnil; +- coerce_to_filename(vs_base[0], filename); +- type = vs_base[0]->pn.pn_type = vs_pop; +- name = vs_base[0]->pn.pn_name = vs_pop; +- i = strlen(filename); +- if (i > 1 && filename[i-1] == '/') +- filename[i-1] = '\0'; +- if (i == 0) +- strcpy(filename, "."); +- fp = fopen(filename, "r"); +- if (fp == NULL) { +- vs_push(make_simple_string(filename)); +- FEerror("Can't open the directory ~S.", 1, vs_head); +- } +- setbuf(fp, iobuffer); +- fread(&dir, sizeof(struct direct), 1, fp); +- fread(&dir, sizeof(struct direct), 1, fp); +- filename[DIRSIZ] = '\0'; +- for (;;) { +- if (fread(&dir, sizeof(struct direct), 1, fp) <=0) +- break; +- if (dir.d_ino == 0) +- continue; +- strncpy(filename, dir.d_name, DIRSIZ); +- vs_push(make_simple_string(filename)); +- vs_head = coerce_to_pathname(vs_head); +- if ((name == Cnil || name == sKwild || +- equal(name, vs_head->pn.pn_name)) && +- (type == Cnil || type == sKwild || +- equal(type, vs_head->pn.pn_type))) { +- vs_head->pn.pn_directory +- = vs_base[0]->pn.pn_directory; +- vs_head = truename(vs_head); +- } else +- vs_pop; +- } +- fclose(fp); +- vs_push(Cnil); +- while (vs_top > top + 1) +- stack_cons(); +- vs_base = top; +-} +-#endif +- +- +-#ifdef E15 +-#include +- +-LFD(Ldirectory)() +-{ +- object name, type; +- char filename[MAXPATHLEN]; +- FILE *fp; +- object *top = vs_top; +- char iobuffer[BUFSIZ]; +- struct direct dir; +- int i; +- +- check_arg(1); +- +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- vs_base[0] = coerce_to_pathname(vs_base[0]); +- vs_push(vs_base[0]->pn.pn_name); +- vs_push(vs_base[0]->pn.pn_type); +- vs_base[0]->pn.pn_name = Cnil; +- vs_base[0]->pn.pn_type = Cnil; +- coerce_to_filename(vs_base[0], filename); +- type = vs_base[0]->pn.pn_type = vs_pop; +- name = vs_base[0]->pn.pn_name = vs_pop; +- i = strlen(filename); +- if (i > 1 && filename[i-1] == '/') +- filename[i-1] = '\0'; +- if (i == 0) +- strcpy(filename, "."); +- fp = fopen(filename, "r"); +- if (fp == NULL) { +- vs_push(make_simple_string(filename)); +- FEerror("Can't open the directory ~S.", 1, vs_head); +- } +- setbuf(fp, iobuffer); +- fread(&dir, sizeof(struct direct), 1, fp); +- fread(&dir, sizeof(struct direct), 1, fp); +- filename[DIRSIZ] = '\0'; +- for (;;) { +- if (fread(&dir, sizeof(struct direct), 1, fp) <=0) +- break; +- if (dir.d_ino == 0) +- continue; +- strncpy(filename, dir.d_name, DIRSIZ); +- vs_push(make_simple_string(filename)); +- vs_head = coerce_to_pathname(vs_head); +- if ((name == Cnil || name == sKwild || +- equal(name, vs_head->pn.pn_name)) && +- (type == Cnil || type == sKwild || +- equal(type, vs_head->pn.pn_type))) { +- vs_head->pn.pn_directory +- = vs_base[0]->pn.pn_directory; +- vs_head = truename(vs_head); +- } else +- vs_pop; +- } +- fclose(fp); +- vs_push(Cnil); +- while (vs_top > top + 1) +- stack_cons(); +- vs_base = top; +-} +-#endif +- + #include + #include + +@@ -840,17 +432,31 @@ DEFUN_NEW("D-TYPE-LIST",object,fSd_type_ + } + #endif + +-DEFUN_NEW("READDIR",object,fSreaddir,SI,2,2,NONE,OI,IO,OO,OO,(fixnum x,fixnum y),"") { ++DEFUN_NEW("READDIR",object,fSreaddir,SI,3,3,NONE,OI,IO,OO,OO,(fixnum x,fixnum y,object s),"") { + struct dirent *e; + object z; ++ long tl; ++ size_t l; + if (!x) RETURN1(Cnil); +- e=readdir((DIR *)x); +- RETURN1(e ? make_simple_string(e->d_name) : Cnil); ++ tl=telldir((DIR *)x); + #ifdef HAVE_D_TYPE + for (;(e=readdir((DIR *)x)) && y!=DT_UNKNOWN && e->d_type!=y;); + #endif + if (!e) RETURN1(Cnil); +- z=make_simple_string(e->d_name); ++ if (s==Cnil) ++ z=make_simple_string(e->d_name); ++ else { ++ check_type_string(&s); ++ l=strlen(e->d_name); ++ if (s->st.st_dim-s->st.st_fillp>=l) { ++ memcpy(s->st.st_self+s->st.st_fillp,e->d_name,l); ++ s->st.st_fillp+=l; ++ z=s; ++ } else { ++ seekdir((DIR *)x,tl); ++ RETURN1(make_fixnum(l)); ++ } ++ } + #ifdef HAVE_D_TYPE + if (y==DT_UNKNOWN) z=MMcons(z,make_fixnum(e->d_type)); + #endif +@@ -882,7 +488,126 @@ DEFUN_NEW("MKDIR",object,fSmkdir,SI,1,1, + + } + ++DEFUN_NEW("RMDIR",object,fSrmdir,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_string(&x); ++ ++ coerce_to_filename(x,FN1); ++ ++ RETURN1(rmdir(FN1) ? Cnil : Ct); ++ ++} ++ ++ ++ ++#include ++#include ++#include ++#include ++ ++DEFUN_NEW("READLINKAT",object,fSreadlinkat,SI,2,2,NONE,OI,OO,OO,OO,(fixnum d,object s),"") { ++ char *b1,*b2=NULL; ++ ssize_t l,z1,z2; ++ check_type_string(&s); ++ /* l=s->st.st_hasfillp ? s->st.st_fillp : s->st.st_dim; */ ++ z1=length(s); ++ massert((b1=alloca(z1+1))); ++ memcpy(b1,s->st.st_self,z1); ++ b1[z1]=0; ++ for (l=z2=0;l>=z2;) { ++ memset(b2,0,z2); ++ z2+=z2+10; ++ massert((b2=alloca(z2))); ++ massert((l=readlinkat(d ? dirfd((DIR *)d) : AT_FDCWD,b1,b2,z2))>=0); ++ } ++ b2[l]=0; ++ s=make_simple_string(b2); ++ memset(b1,0,z1); ++ memset(b2,0,z2); ++ RETURN1(s); ++} ++ ++DEFUN_NEW("GETCWD",object,fSgetcwd,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { ++ char *b=NULL; ++ size_t z; ++ object s; ++ ++ for (z=0;!(errno=0) && !getcwd(b,z) && errno==ERANGE;b=memset(b,0,z),z+=z+10,({massert((b=alloca(z)));})); ++ massert((b=getcwd(b,z))); ++ s=make_simple_string(b); ++ memset(b,0,z); ++ RETURN1(s); ++ ++} ++ ++DEFUN_NEW("UID-TO-NAME",object,fSuid_to_name,SI,1,1,NONE,OI,OO,OO,OO,(fixnum uid),"") { ++ struct passwd *pwent,pw; ++ char *b; ++ long r; ++ ++ massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); ++ massert(b=alloca(r)); ++ ++ massert(!getpwuid_r(uid,&pw,b,r,&pwent)); ++ ++ RETURN1(make_simple_string(pwent->pw_name)); ++ ++} ++ ++DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") { ++ ++ struct passwd *pwent,pw; ++ char *b; ++ long r; ++ ++ massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); ++ massert(b=alloca(r)); + ++ if (nm->st.st_fillp==1) ++ ++ if ((pw.pw_dir=getenv("HOME"))) ++ pwent=&pw; ++ else ++ massert(!getpwuid_r(getuid(),&pw,b,r,&pwent)); ++ ++ else { ++ ++ char *name; ++ ++ massert(name=alloca(nm->st.st_fillp)); ++ memcpy(name,nm->st.st_self+1,nm->st.st_fillp-1); ++ name[nm->st.st_fillp-1]=0; ++ ++ massert(!getpwnam_r(name,&pw,b,r,&pwent)); ++ ++ } ++ ++ massert((b=alloca(strlen(pwent->pw_dir)+2))); ++ memcpy(b,pwent->pw_dir,strlen(pwent->pw_dir)); ++ b[strlen(pwent->pw_dir)]='/'; ++ b[strlen(pwent->pw_dir)+1]=0; ++ RETURN1(make_simple_string(b)); ++ ++} ++ ++DEFUN_NEW("RENAME",object,fSrename,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { ++ ++ check_type_string(&x); ++ check_type_string(&y); ++ ++ coerce_to_filename(x,FN1); ++ coerce_to_filename(y,FN2); ++ ++ RETURN1(rename(FN1,FN2) ? Cnil : Ct); ++ ++} ++ ++DEFUN_NEW("UNLINK",object,fSunlink,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ ++ coerce_to_filename(x,FN1); ++ ++ RETURN1(unlink(FN1) ? Cnil : Ct); ++ ++} + + + static void +@@ -900,16 +625,8 @@ FFN(siLchdir)(void) + } + + void +-gcl_init_unixfsys(void) +-{ +- make_function("TRUENAME", Ltruename); +- make_function("RENAME-FILE", Lrename_file); +- make_function("DELETE-FILE", Ldelete_file); +- make_function("PROBE-FILE", Lprobe_file); +- make_function("FILE-WRITE-DATE", Lfile_write_date); +- make_function("FILE-AUTHOR", Lfile_author); +- make_function("USER-HOMEDIR-PATHNAME", Luser_homedir_pathname); +- make_function("DIRECTORY", Ldirectory); ++gcl_init_unixfsys(void) { ++ ++ make_si_function("CHDIR", siLchdir); + +- make_si_function("CHDIR", siLchdir); + } +--- gcl-2.6.12.orig/o/usig.c ++++ gcl-2.6.12/o/usig.c +@@ -148,13 +148,15 @@ DEFUN_NEW("FLD",object,fSfld,SI,1,1,NONE + + #endif + +-DEFUN_NEW("*FIXNUM",fixnum,fSAfixnum,SI,1,1,NONE,II,OO,OO,OO,(fixnum addr),"") { +- RETURN1(*(fixnum *)addr); ++/* For now ignore last three args governing offsets and data modification, just to ++ support fpe sync with master*/ ++DEFUN_NEW("*FIXNUM",object,fSAfixnum,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") { ++ RETURN1((object)*(fixnum *)addr); + } +-DEFUN_NEW("*FLOAT",object,fSAfloat,SI,1,1,NONE,OI,OO,OO,OO,(fixnum addr),"") { ++DEFUN_NEW("*FLOAT",object,fSAfloat,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") { + RETURN1(make_shortfloat(*(float *)addr)); + } +-DEFUN_NEW("*DOUBLE",object,fSAdouble,SI,1,1,NONE,OI,OO,OO,OO,(fixnum addr),"") { ++DEFUN_NEW("*DOUBLE",object,fSAdouble,SI,4,4,NONE,OI,OO,OO,OO,(fixnum addr,object x,object y,object z),"") { + RETURN1(make_longfloat(*(double *)addr)); + } + +@@ -264,7 +266,6 @@ sigpipe(void) + FEerror("Broken pipe", 0); + } + +- + void + sigint(void) + { +@@ -272,8 +273,6 @@ sigint(void) + terminal_interrupt(1); + } + +- +- + static void + sigalrm(void) + { +--- gcl-2.6.12.orig/unixport/sys_ansi_gcl.c ++++ gcl-2.6.12/unixport/sys_ansi_gcl.c +@@ -41,7 +41,6 @@ gcl_init_system(object no_init) + #ifdef HAVE_JAPI_H + ar_check_init(gcl_japi,no_init); + #endif +- ar_check_init(gcl_iolib,no_init); + ar_check_init(gcl_listlib,no_init); + ar_check_init(gcl_mislib,no_init); + ar_check_init(gcl_numlib,no_init); +@@ -56,9 +55,23 @@ gcl_init_system(object no_init) + ar_check_init(gcl_defpackage,no_init); + ar_check_init(gcl_make_defpackage,no_init); + ar_check_init(gcl_sharp,no_init); +- ar_check_init(gcl_fpe,no_init); + ++ ar_check_init(gcl_sharp_uv,no_init); ++ ar_check_init(gcl_namestring,no_init); ++ ar_check_init(gcl_logical_pathname_translations,no_init); ++ ar_check_init(gcl_make_pathname,no_init); ++ ar_check_init(gcl_parse_namestring,no_init); ++ ar_check_init(gcl_translate_pathname,no_init); ++ ar_check_init(gcl_directory,no_init); ++ ar_check_init(gcl_merge_pathnames,no_init); ++ ar_check_init(gcl_truename,no_init); ++ ar_check_init(gcl_rename_file,no_init); ++ ar_check_init(gcl_wild_pathname_p,no_init); ++ ar_check_init(gcl_pathname_match_p,no_init); + ++ ar_check_init(gcl_iolib,no_init); ++ ar_check_init(gcl_fpe,no_init); ++ + ar_check_init(gcl_cmpinline,no_init); + ar_check_init(gcl_cmputil,no_init); + +@@ -107,6 +120,7 @@ gcl_init_system(object no_init) + ar_check_init(gcl_index,no_init); + #endif + ++ lsp_init("../pcl/package.lisp"); + ar_check_init(gcl_pcl_pkg,no_init); + ar_check_init(gcl_pcl_walk,no_init); + ar_check_init(gcl_pcl_iterate,no_init); +@@ -142,6 +156,7 @@ gcl_init_system(object no_init) + ar_check_init(gcl_pcl_precom1,no_init); + ar_check_init(gcl_pcl_precom2,no_init); + ++ lsp_init("../clcs/package.lisp"); + ar_check_init(gcl_clcs_precom,no_init); + ar_check_init(gcl_clcs_handler,no_init); + ar_check_init(gcl_clcs_conditions,no_init); +--- gcl-2.6.12.orig/unixport/sys_gcl.c ++++ gcl-2.6.12/unixport/sys_gcl.c +@@ -34,7 +34,6 @@ gcl_init_system(object no_init) { + #ifdef HAVE_JAPI_H + ar_check_init(gcl_japi,no_init); + #endif +- ar_check_init(gcl_iolib,no_init); + ar_check_init(gcl_listlib,no_init); + ar_check_init(gcl_mislib,no_init); + ar_check_init(gcl_numlib,no_init); +@@ -49,9 +48,23 @@ gcl_init_system(object no_init) { + ar_check_init(gcl_defpackage,no_init); + ar_check_init(gcl_make_defpackage,no_init); + ar_check_init(gcl_sharp,no_init); +- ar_check_init(gcl_fpe,no_init); + ++ ar_check_init(gcl_sharp_uv,no_init); ++ ar_check_init(gcl_namestring,no_init); ++ ar_check_init(gcl_logical_pathname_translations,no_init); ++ ar_check_init(gcl_make_pathname,no_init); ++ ar_check_init(gcl_parse_namestring,no_init); ++ ar_check_init(gcl_translate_pathname,no_init); ++ ar_check_init(gcl_directory,no_init); ++ ar_check_init(gcl_merge_pathnames,no_init); ++ ar_check_init(gcl_truename,no_init); ++ ar_check_init(gcl_rename_file,no_init); ++ ar_check_init(gcl_wild_pathname_p,no_init); ++ ar_check_init(gcl_pathname_match_p,no_init); + ++ ar_check_init(gcl_iolib,no_init); ++ ar_check_init(gcl_fpe,no_init); ++ + ar_check_init(gcl_cmpinline,no_init); + ar_check_init(gcl_cmputil,no_init); + +--- gcl-2.6.12.orig/unixport/sys_init.lsp.in ++++ gcl-2.6.12/unixport/sys_init.lsp.in +@@ -9,9 +9,6 @@ + (in-package :system) + (use-package :fpe) + +-#+(or pcl ansi-cl)(load "../pcl/package.lisp") +-#+ansi-cl(load "../clcs/package.lisp") +- + (init-system) + (in-package :si) + (gbc t) +@@ -20,7 +17,7 @@ + (setq *link-array* (make-array (ash 1 11) :element-type 'character :fill-pointer 0))) + (use-fast-links t) + +-(let* ((x (append (pathname-directory *system-directory*) (list :parent))) ++(let* ((x (append (pathname-directory *system-directory*) (list :back))) + (lsp (append x (list "lsp"))) + (cmpnew (append x (list "cmpnew"))) + (h (append x (list "h"))) +@@ -59,6 +56,7 @@ + + (fmakunbound 'init-cmp-anon) + (when (fboundp 'user-init) (user-init)) ++ + (in-package :compiler) + (setq *cc* @LI-CC@ + *ld* @LI-LD@ +@@ -79,7 +77,9 @@ + #-ansi-cl(do-symbols (s :cltl1-compat) (export s :lisp))) + + #+ansi-cl (use-package :pcl :user) +-#+ansi-cl (import 'si::(clines defentry defcfun object void int double quit bye gbc system) :user) ++ ++(import 'si::(clines defentry defcfun object void int double quit bye gbc system ++ *lib-directory* *system-directory*) :user) + + (let* ((i 4096)(j (si::equal-tail-recursion-check i))) + (unless (<= (ash i -1) j) +--- gcl-2.6.12.orig/unixport/sys_pcl_gcl.c ++++ gcl-2.6.12/unixport/sys_pcl_gcl.c +@@ -41,7 +41,6 @@ gcl_init_system(object no_init) + #ifdef HAVE_JAPI_H + ar_check_init(gcl_japi,no_init); + #endif +- ar_check_init(gcl_iolib,no_init); + ar_check_init(gcl_listlib,no_init); + ar_check_init(gcl_mislib,no_init); + ar_check_init(gcl_numlib,no_init); +@@ -56,9 +55,23 @@ gcl_init_system(object no_init) + ar_check_init(gcl_defpackage,no_init); + ar_check_init(gcl_make_defpackage,no_init); + ar_check_init(gcl_sharp,no_init); +- ar_check_init(gcl_fpe,no_init); + ++ ar_check_init(gcl_sharp_uv,no_init); ++ ar_check_init(gcl_namestring,no_init); ++ ar_check_init(gcl_logical_pathname_translations,no_init); ++ ar_check_init(gcl_make_pathname,no_init); ++ ar_check_init(gcl_parse_namestring,no_init); ++ ar_check_init(gcl_translate_pathname,no_init); ++ ar_check_init(gcl_directory,no_init); ++ ar_check_init(gcl_merge_pathnames,no_init); ++ ar_check_init(gcl_truename,no_init); ++ ar_check_init(gcl_rename_file,no_init); ++ ar_check_init(gcl_wild_pathname_p,no_init); ++ ar_check_init(gcl_pathname_match_p,no_init); + ++ ar_check_init(gcl_iolib,no_init); ++ ar_check_init(gcl_fpe,no_init); ++ + ar_check_init(gcl_cmpinline,no_init); + ar_check_init(gcl_cmputil,no_init); + +@@ -107,6 +120,7 @@ gcl_init_system(object no_init) + ar_check_init(gcl_index,no_init); + #endif + ++ lsp_init("../pcl/package.lisp"); + ar_check_init(gcl_pcl_pkg,no_init); + ar_check_init(gcl_pcl_walk,no_init); + ar_check_init(gcl_pcl_iterate,no_init); +--- gcl-2.6.12.orig/unixport/sys_pre_gcl.c ++++ gcl-2.6.12/unixport/sys_pre_gcl.c +@@ -39,7 +39,6 @@ gcl_init_system(object no_init) + #ifdef HAVE_JAPI_H + lsp_init("../lsp/gcl_japi.lsp"); + #endif +- lsp_init("../lsp/gcl_iolib.lsp"); + /* lsp_init("../lsp/gcl_listlib.lsp"); */ + lsp_init("../lsp/gcl_mislib.lsp"); + lsp_init("../lsp/gcl_numlib.lsp"); +@@ -54,6 +53,21 @@ gcl_init_system(object no_init) + lsp_init("../lsp/gcl_defpackage.lsp"); + lsp_init("../lsp/gcl_make_defpackage.lsp"); + lsp_init("../lsp/gcl_sharp.lsp"); ++ ++ lsp_init("../lsp/gcl_sharp_uv.lsp"); ++ lsp_init("../lsp/gcl_logical_pathname_translations.lsp"); ++ lsp_init("../lsp/gcl_make_pathname.lsp"); ++ lsp_init("../lsp/gcl_parse_namestring.lsp"); ++ lsp_init("../lsp/gcl_namestring.lsp"); ++ lsp_init("../lsp/gcl_translate_pathname.lsp"); ++ lsp_init("../lsp/gcl_directory.lsp"); ++ lsp_init("../lsp/gcl_merge_pathnames.lsp"); ++ lsp_init("../lsp/gcl_truename.lsp"); ++ lsp_init("../lsp/gcl_rename_file.lsp"); ++ lsp_init("../lsp/gcl_wild_pathname_p.lsp"); ++ lsp_init("../lsp/gcl_pathname_match_p.lsp"); ++ ++ lsp_init("../lsp/gcl_iolib.lsp"); + lsp_init("../lsp/gcl_fpe.lsp"); + + lsp_init("../cmpnew/gcl_cmpinline.lsp"); +--- gcl-2.6.12.orig/xbin/make-fn ++++ gcl-2.6.12/xbin/make-fn +@@ -6,10 +6,13 @@ TMP=/tmp/tmpd$$ + mkdir ${TMP} + cp $@ ${TMP} + +-for v in $@ ; ++for v in $1 ; + do + echo '(load (format nil "~a~a" si::*system-directory* "../cmpnew/gcl_collectfn"))' \ + '(compiler::emit-fn t)'\ ++ "(compile-file \"${TMP}/$v\" :o-file nil)" ++echo '(load (format nil "~a~a" si::*system-directory* "../cmpnew/gcl_collectfn"))' \ ++ '(compiler::emit-fn t)'\ + "(compile-file \"${TMP}/$v\" :o-file nil)" | ${LISP} + done + diff --git a/debian/patches/pathnames1.11 b/debian/patches/pathnames1.11 new file mode 100644 index 0000000..71bab92 --- /dev/null +++ b/debian/patches/pathnames1.11 @@ -0,0 +1,246 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-45) unstable; urgency=high + . + * pathnames1.11 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-31 + +--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp ++++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp +@@ -144,7 +144,7 @@ + (DEFSYSFUN 'SVREF "Lsvref" '(T T) 'T NIL NIL) + (DEFSYSFUN 'APPLY "Lapply" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'DECODE-FLOAT "Ldecode_float" '(T) '(VALUES T T T) NIL NIL) +-(DEFSYSFUN 'SUBST-IF-NOT "Lsubst_if_not" '(T T T *) 'T NIL NIL) ++;(DEFSYSFUN 'SUBST-IF-NOT "Lsubst_if_not" '(T T T *) 'T NIL NIL) + (DEFSYSFUN 'RPLACA "Lrplaca" '(T T) 'T NIL NIL) + (DEFSYSFUN 'SYMBOL-PLIST "Lsymbol_plist" '(T) 'T NIL NIL) + (DEFSYSFUN 'WRITE-STRING "Lwrite_string" '(T *) 'T NIL NIL) +@@ -210,7 +210,7 @@ + (DEFSYSFUN 'NSUBLIS "Lnsublis" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'CHAR-NOT-EQUAL "Lchar_not_equal" '(T *) 'T NIL T) + (DEFSYSFUN 'MACRO-FUNCTION "Lmacro_function" '(T) 'T NIL NIL) +-(DEFSYSFUN 'SUBST-IF "Lsubst_if" '(T T T *) 'T NIL NIL) ++;(DEFSYSFUN 'SUBST-IF "Lsubst_if" '(T T T *) 'T NIL NIL) + (DEFSYSFUN 'COMPLEXP "Lcomplexp" '(T) 'T NIL T) + (DEFSYSFUN 'READ-LINE "Lread_line" '(*) '(VALUES T T) NIL NIL) + (DEFSYSFUN 'MAX "Lmax" '(T *) 'T NIL NIL) +@@ -232,7 +232,7 @@ + (DEFSYSFUN 'FLOAT "Lfloat" '(T *) 'T NIL NIL) + ;(DEFSYSFUN 'FIRST "Lcar" '(T) 'T NIL NIL) + (DEFSYSFUN 'ROUND "Lround" '(T *) '(VALUES T T) NIL NIL) +-(DEFSYSFUN 'SUBST "Lsubst" '(T T T *) 'T NIL NIL) ++;(DEFSYSFUN 'SUBST "Lsubst" '(T T T *) 'T NIL NIL) + (DEFSYSFUN 'UPPER-CASE-P "Lupper_case_p" '(T) 'T NIL T) + (DEFSYSFUN 'ARRAY-ELEMENT-TYPE "Larray_element_type" '(T) 'T NIL NIL) + (DEFSYSFUN 'ADJOIN "Ladjoin" '(T T *) 'T NIL NIL) +--- gcl-2.6.12.orig/lsp/gcl_arraylib.lsp ++++ gcl-2.6.12/lsp/gcl_arraylib.lsp +@@ -262,8 +262,6 @@ + (static (staticp array)) + &aux (fill-pointer (or fill-pointer (when (array-has-fill-pointer-p array) (fill-pointer array))))) + +- (declare (ignore element-type)) +- + (let ((x (if initial-contents-supplied-p + (make-array new-dimensions + :adjustable t +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -80,7 +80,7 @@ + 0 l))) + + (defun get-string-input-stream-index (stream &aux (s (c-stream-object0 stream))) +- (+ (fill-pointer s) (multiple-value-bind (a b) (array-displacement s) b))) ++ (+ (fill-pointer s) (multiple-value-bind (a b) (array-displacement s) (declare (ignore a)) b))) + + (defmacro with-input-from-string ((var string &key index (start 0) end) . body) + (declare (optimize (safety 1))) +@@ -457,10 +457,10 @@ + if-exists iesp if-does-not-exist idnesp external-format))) + (when (typep s 'stream) (c-set-stream-object1 s pf) s))) + +-(defun load-pathname-exists (z) +- (or (probe-file z) +- (when *allow-gzipped-file* +- (when (probe-file (string-concatenate (namestring z) ".gz")) ++(defun load-pathname-exists (z &aux (z (link-expand (namestring z)))) ++ (cond ((eq (stat z) :file) z) ++ (*allow-gzipped-file* ++ (when (eq (stat (string-concatenate (namestring z) ".gz")) :file) + z)))) + + (defun load-pathname (p print if-does-not-exist external-format +--- gcl-2.6.12.orig/lsp/gcl_listlib.lsp ++++ gcl-2.6.12/lsp/gcl_listlib.lsp +@@ -180,3 +180,34 @@ + (defmacro nth-value (n expr) + (declare (optimize (safety 1))) + `(nth ,n (multiple-value-list ,expr))) ++ ++(eval-when (compile eval) ++ ++ (defmacro repl-if (tc) `(labels ((l (tr &aux (k (if kf (funcall kf tr) tr))) ++ (cond (,tc n) ++ ((atom tr) tr) ++ ((let* ((ca (car tr))(a (l ca))(cd (cdr tr))(d (l cd))) ++ (if (and (eq a ca) (eq d cd)) tr (cons a d))))))) ++ (declare (ftype (function (t) t) l)) ++ (l tr)))) ++ ++(defun subst (n o tr &key key test test-not ++ &aux (kf (when key (coerce key 'function))) ++ (tf (when test (coerce test 'function))) ++ (ntf (when test-not (coerce test-not 'function)))) ++ (declare (optimize (safety 1))) ++ (check-type key (or null function)) ++ (check-type test (or null function)) ++ (check-type test-not (or null function)) ++ (repl-if (cond (tf (funcall tf o k))(ntf (not (funcall ntf o k)))((eql o k))))) ++ ++(defun subst-if (n p tr &key key &aux (kf (when key (coerce key 'function)))) ++ (declare (optimize (safety 1))) ++ (check-type p function) ++ (check-type key (or null function)) ++ (repl-if (funcall p k))) ++(defun subst-if-not (n p tr &key key &aux (kf (when key (coerce key 'function)))) ++ (declare (optimize (safety 1))) ++ (check-type p function) ++ (check-type key (or null function)) ++ (repl-if (not (funcall p k))))) +--- gcl-2.6.12.orig/lsp/gcl_truename.lsp ++++ gcl-2.6.12/lsp/gcl_truename.lsp +@@ -23,7 +23,8 @@ + (check-type pd pathname-designator) + (when (wild-pathname-p ns) + (error 'file-error :pathname pd :format-control "Pathname is wild")) +- (let* ((ns (ensure-dir-string (link-expand ns)))(ppd (pathname ns))) ++ (let* ((ns (ensure-dir-string (link-expand ns))) ++ (ppd (if (eq (namestring pd) ns) pd (pathname ns)))) + (unless (or (zerop (length ns)) (stat ns)) + (error 'file-error :pathname ns :format-control "Pathname does not exist")) + (let* ((d (pathname-directory ppd)) +--- gcl-2.6.12.orig/o/list.d ++++ gcl-2.6.12/o/list.d +@@ -528,26 +528,26 @@ object x; + vs_check_push(x); + } + +-/* +- Subst(new, tree) pushes +- the result of substituting new in tree +- onto vs. +-*/ +-static void +-subst(new, tree) +-object new, tree; +-{ +- cs_check(new); +- +- if (TEST(tree)) +- vs_check_push(new); +- else if (type_of(tree) == t_cons) { +- subst(new, tree->c.c_car); +- subst(new, tree->c.c_cdr); +- stack_cons(); +- } else +- vs_check_push(tree); +-} ++/* /\* */ ++/* Subst(new, tree) pushes */ ++/* the result of substituting new in tree */ ++/* onto vs. */ ++/* *\/ */ ++/* static void */ ++/* subst(new, tree) */ ++/* object new, tree; */ ++/* { */ ++/* cs_check(new); */ ++ ++/* if (TEST(tree)) */ ++/* vs_check_push(new); */ ++/* else if (type_of(tree) == t_cons) { */ ++/* subst(new, tree->c.c_car); */ ++/* subst(new, tree->c.c_cdr); */ ++/* stack_cons(); */ ++/* } else */ ++/* vs_check_push(tree); */ ++/* } */ + + /* static object */ + /* subst1(object new, object tree) { */ +@@ -1153,25 +1153,25 @@ LFD(Lrplacd)() + vs_popp; + } + +-@(defun subst (new old tree &key test test_not key) +- saveTEST; +-@ +- protectTEST; +- setupTEST(old, test, test_not, key); +- subst(new, tree); +- tree = vs_pop; +- /* if (kf==identity && */ +- /* tf==test_eql && */ +- /* (is_imm_fixnum(item_compared) || */ +- /* ({enum type tp=type_of(item_compared);tp>t_complex || tpt_complex || tp + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-46) unstable; urgency=high + . + * pathnames1.12 + * Bug fix: "maintainer script(s) do not start on #!", thanks to + treinen@debian.org; (Closes: #843303). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/843303 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-11-18 + +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -457,11 +457,10 @@ + if-exists iesp if-does-not-exist idnesp external-format))) + (when (typep s 'stream) (c-set-stream-object1 s pf) s))) + +-(defun load-pathname-exists (z &aux (z (link-expand (namestring z)))) +- (cond ((eq (stat z) :file) z) +- (*allow-gzipped-file* +- (when (eq (stat (string-concatenate (namestring z) ".gz")) :file) +- z)))) ++(defun load-pathname-exists (z) ++ (or (probe-file z) ++ (when *allow-gzipped-file* ++ (probe-file (string-concatenate (namestring z) ".gz"))))) + + (defun load-pathname (p print if-does-not-exist external-format + &aux (pp (merge-pathnames p)) +--- gcl-2.6.12.orig/lsp/gcl_listlib.lsp ++++ gcl-2.6.12/lsp/gcl_listlib.lsp +@@ -123,8 +123,8 @@ + + (defun smallnthcdr (n x) + (declare (fixnum n)) +- (cond ((atom x) (when x (tp-error x proper-list))) +- ((= n 0) x) ++ (cond ((= n 0) x) ++ ((atom x) (when x (tp-error x proper-list))) + ((smallnthcdr (1- n) (cdr x))))) + + (defun bignthcdr (n i s f) +--- gcl-2.6.12.orig/lsp/gcl_truename.lsp ++++ gcl-2.6.12/lsp/gcl_truename.lsp +@@ -38,5 +38,5 @@ + (check-type pd pathname-designator) + (when (wild-pathname-p pn) + (error 'file-error :pathname pn :format-control "Pathname is wild")) +- (when (eq (stat (namestring pn)) :file) ++ (when (eq (stat (link-expand (namestring pn))) :file) + (truename pn))) diff --git a/debian/patches/pathnames1.13 b/debian/patches/pathnames1.13 new file mode 100644 index 0000000..57073da --- /dev/null +++ b/debian/patches/pathnames1.13 @@ -0,0 +1,40 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-46) unstable; urgency=high + . + * pathnames1.12 + * Bug fix: "maintainer script(s) do not start on #!", thanks to + treinen@debian.org; (Closes: #843303). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/843303 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-11-22 + +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -460,7 +460,8 @@ + (defun load-pathname-exists (z) + (or (probe-file z) + (when *allow-gzipped-file* +- (probe-file (string-concatenate (namestring z) ".gz"))))) ++ (when (probe-file (string-concatenate (namestring z) ".gz")) ++ z)))) + + (defun load-pathname (p print if-does-not-exist external-format + &aux (pp (merge-pathnames p)) diff --git a/debian/patches/pathnames1.2 b/debian/patches/pathnames1.2 new file mode 100644 index 0000000..f7bb111 --- /dev/null +++ b/debian/patches/pathnames1.2 @@ -0,0 +1,1196 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-39) unstable; urgency=medium + . + * pathnames1.1 + * ansi-test clean target +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-12 + +--- gcl-2.6.12.orig/h/notcomp.h ++++ gcl-2.6.12/h/notcomp.h +@@ -296,6 +296,8 @@ gcl_init_cmp_anon(void); + + char FN1[PATH_MAX],FN2[PATH_MAX],FN3[PATH_MAX],FN4[PATH_MAX],FN5[PATH_MAX]; + ++#define coerce_to_filename(a_,b_) coerce_to_filename1(a_,b_,sizeof(b_)) ++ + #include + #define massert(a_) ({errno=0;if (!(a_)||errno) assert_error(#a_,__LINE__,__FILE__,__FUNCTION__);}) + +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -508,7 +508,7 @@ typedef void (*funcvoid)(void); + /* unexlin.c:808:OF */ extern int write_segment (int new, register char *ptr, register char *end); /* (new, ptr, end) int new; register char *ptr; register char *end; */ + /* unixfasl.c:409:OF */ extern void gcl_init_unixfasl (void); /* () */ + /* unixfsys.c:145:OF */ extern char *getwd (char *buffer); /* (buffer) char *buffer; */ +-/* unixfsys.c:209:OF */ extern void coerce_to_filename (object pathname, char *p); /* (pathname, p) object pathname; char *p; */ ++/* unixfsys.c:209:OF */ extern void coerce_to_filename1 (object pathname, char *p,unsigned sz); /* (pathname, p) object pathname; char *p; */ + /* unixfsys.c:329:OF */ extern bool file_exists (object file); /* (file) object file; */ + /* unixfsys.c:359:OF */ extern FILE *backup_fopen (char *filename, char *option); /* (filename, option) char *filename; char *option; */ + /* unixfsys.c:359:OF */ extern FILE *fopen_not_dir (char *filename, char *option); /* (filename, option) char *filename; char *option; */ +--- gcl-2.6.12.orig/lsp/gcl_directory.lsp ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -48,8 +48,12 @@ + (expand-wild-directory (cons :relative (cdr x)) f q e)) :directory));FIXME + ((funcall f z y)))))) + ++(defun chdir (s) ++ (when (chdir1 (namestring (pathname s)));to expand ~/ ++ (setq *current-directory* (current-directory-pathname)))) ++ + (defun directory (p &key &aux (p (translate-logical-pathname p))(d (pathname-directory p)) +- (c (unless (eq (car d) :absolute) (make-frame (concatenate 'string (getcwd) "/")))) ++ (c (unless (eq (car d) :absolute) (make-frame (namestring *current-directory*)))) + (lc (when c (length c))) + (filesp (or (pathname-name p) (pathname-type p))) + (v (compile-regexp (to-regexp p)))(*up-key* :back) r) +--- gcl-2.6.12.orig/lsp/gcl_rename_file.lsp ++++ gcl-2.6.12/lsp/gcl_rename_file.lsp +@@ -35,6 +35,7 @@ + (check-type spec pathname-designator) + (multiple-value-bind + (tp sz tm) (stat (namestring (truename spec))) ++ (declare (ignore tp sz)) + (+ tm (* (+ 17 (* 70 365)) (* 24 60 60))))) + + +@@ -43,5 +44,6 @@ + (check-type spec pathname-designator) + (multiple-value-bind + (tp sz tm uid) (stat (namestring (truename spec))) ++ (declare (ignore tp sz tm)) + (uid-to-name uid))) + +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -607,8 +607,13 @@ First directory is checked for first nam + (defvar *ld* "ld") + (defvar *objdump* "objdump --source ") + ++(defvar *current-directory* *system-directory*) ++ ++(defun current-directory-pathname nil (pathname (concatenate 'string (getcwd) "/"))) ++ + (defun set-up-top-level (&aux (i (argc)) tem) + (declare (fixnum i)) ++ (setq *current-directory* (current-directory-pathname)) + (setq *tmp-dir* (get-temp-dir) + *cc* (get-path *cc*) + *ld* (get-path *ld*) +--- gcl-2.6.12.orig/lsp/gcl_truename.lsp ++++ gcl-2.6.12/lsp/gcl_truename.lsp +@@ -18,20 +18,18 @@ + (pathname (typep x 'logical-pathname)) + (stream (logical-pathname-designator-p (pathname x))))) + +-;(defvar *current-dir* (pathname (concatenate 'string (getcwd) "/"))) FIXME sync with chdir +- +-(defun truename (pd &aux (ppd (translate-logical-pathname pd))(ns (namestring ppd))) ++(defun truename (pd &aux (ns (namestring (translate-logical-pathname pd)))) + (declare (optimize (safety 1))) + (check-type pd pathname-designator) + (when (wild-pathname-p ns) + (error 'file-error :pathname pd :format-control "Pathname is wild")) +- (let* ((ns (ensure-dir-string (link-expand ns)))) ++ (let* ((ns (ensure-dir-string (link-expand ns)))(ppd (pathname ns))) + (unless (or (zerop (length ns)) (stat ns)) + (error 'file-error :pathname ns :format-control "Pathname does not exist")) + (let* ((d (pathname-directory ppd)) + (d1 (subst :back :up d)) + (ppd (if (eq d d1) ppd (make-pathname :directory d1 :defaults ppd)))) +- (if (eq (car d) :absolute) ppd (merge-pathnames ppd (concatenate 'string (getcwd) "/") nil))))) ++ (if (eq (car d) :absolute) ppd (merge-pathnames ppd *current-directory* nil))))) + + + (defun probe-file (pd &aux (pn (translate-logical-pathname pd))) +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -351,120 +351,86 @@ open_stream(object fn,enum smmode smm, o + vs_mark; + + coerce_to_filename(fn,FN1); +- if (smm == smm_input || smm == smm_probe) { +- if(FN1[0]=='|') +- fp = popen(FN1+1,"r"); +- else +- fp = fopen_not_dir(FN1, "r"); + +- if ((fp == NULL) && +- (sSAallow_gzipped_fileA->s.s_dbind != sLnil)) { +- union lispunion st; +- char buf[256]; +- if (snprintf(buf,sizeof(buf),"%s.gz",FN1)<=0) +- FEerror("Cannot write .gz filename",0); +- st.st.st_self=buf; +- st.st.st_dim=st.st.st_fillp=strlen(buf); +- set_type_of(&st,t_string); +- if (fSstat((object)&st)!=Cnil) { ++ switch(smm) { ++ ++ case smm_input: ++ case smm_probe: ++ ++ if (!(fp=*FN1=='|' ? popen(FN1+1,"r") : fopen_not_dir(FN1,"r")) && sSAallow_gzipped_fileA->s.s_dbind!=Cnil) { ++ ++ struct stat ss; ++ massert(snprintf(FN2,sizeof(FN2),"%s.gz",FN1)>0); ++ ++ if (!stat(FN2,&ss)) { ++ + FILE *pp; + int n; +- if (!(fp=tmpfile())) +- FEerror("Cannot create temporary file",0); +- if (snprintf(buf,sizeof(buf),"zcat %s.gz",FN1)<=0) +- FEerror("Cannot write zcat pipe name",0); +- if (!(pp=popen(buf,"r"))) +- FEerror("Cannot open zcat pipe",0); +- while((n=fread(buf,1,sizeof(buf),pp))) +- if (!fwrite(buf,1,n,fp)) +- FEerror("Cannot write pipe output to temporary file",0); +- if (pclose(pp)<0) +- FEerror("Cannot close zcat pipe",0); +- if (fseek(fp,0,SEEK_SET)) +- FEerror("Cannot rewind temporary file\n",0); ++ ++ massert((fp=tmpfile())); ++ massert(snprintf(FN3,sizeof(FN2),"zcat %s",FN2)>0); ++ massert(pp=popen(FN3,"r")); ++ while ((n=fread(FN4,1,sizeof(FN3),pp))) ++ massert(fwrite(FN4,1,n,fp)==n); ++ massert(pclose(pp)>=0); ++ massert(!fseek(fp,0,SEEK_SET)); ++ + } ++ + } +- if (fp == NULL) { +- if (if_does_not_exist == sKerror) +- cannot_open(fn); +- else if (if_does_not_exist == sKcreate) { +- fp = fopen_not_dir(FN1, "w"); +- if (fp == NULL) +- cannot_create(fn); ++ ++ if (!fp) { ++ ++ if (if_does_not_exist==sKerror) cannot_open(fn); ++ else if (if_does_not_exist==sKcreate) { ++ if (!(fp=fopen_not_dir(FN1,"w"))) cannot_create(fn); + fclose(fp); +- fp = fopen_not_dir(FN1, "r"); +- if (fp == NULL) +- cannot_open(fn); +- } else if (if_does_not_exist == Cnil) +- return(Cnil); +- else +- FEerror("~S is an illegal IF-DOES-NOT-EXIST option.", +- 1, if_does_not_exist); ++ if (!(fp=fopen_not_dir(FN1,"r"))) cannot_open(fn); ++ } else if (if_does_not_exist==Cnil) return(Cnil); ++ else FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",1,if_does_not_exist); ++ + } +- } else if (smm == smm_output || smm == smm_io) { +- if (FN1[0] == '|') +- fp = NULL; +- else +- fp = fopen_not_dir(FN1, "r"); +- if (fp != NULL) { ++ break; ++ ++ case smm_output: ++ case smm_io: ++ ++ if ((fp=*FN1=='|' ? NULL : fopen_not_dir(FN1,"r"))) { ++ + fclose(fp); +- if (if_exists == sKerror) +- FILE_ERROR(fn,"File exists"); +- else if (if_exists == sKrename) { ++ if (if_exists==sKerror) FILE_ERROR(fn,"File exists"); ++ else if (if_exists==sKrename) { + massert(snprintf(FN2,sizeof(FN2),"%s.BAK",FN1)>=0); + massert(!rename(FN1,FN2)); +- if (smm == smm_output) +- fp = fopen(FN1, "w"); +- else +- fp = fopen(FN1, "w+"); +- if (fp == NULL) +- cannot_create(fn); +- } else if (if_exists == sKrename_and_delete || +- if_exists == sKnew_version || +- if_exists == sKsupersede) { +- if (smm == smm_output) +- fp = fopen_not_dir(FN1, "w"); +- else +- fp = fopen_not_dir(FN1, "w+"); +- if (fp == NULL) +- cannot_create(fn); +- } else if (if_exists == sKoverwrite) { +- fp = fopen_not_dir(FN1, "r+"); +- if (fp == NULL) +- cannot_open(fn); +- } else if (if_exists == sKappend) { +- if (smm == smm_output) +- fp = fopen_not_dir(FN1, "a"); +- else +- fp = fopen_not_dir(FN1, "a+"); +- if (fp == NULL) ++ if (!(fp=fopen(FN1,smm==smm_output ? "w" : "w+"))) cannot_create(fn); ++ } else if (if_exists==sKrename_and_delete || ++ if_exists==sKnew_version || ++ if_exists==sKsupersede) { ++ if (!(fp=fopen(FN1,smm==smm_output ? "w" : "w+"))) cannot_create(fn); ++ } else if (if_exists==sKoverwrite) { ++ if (!(fp=fopen_not_dir(FN1,"r+"))) cannot_open(fn); ++ } else if (if_exists==sKappend) { ++ if (!(fp = fopen_not_dir(FN1,smm==smm_output ? "a" : "a+"))) + FEerror("Cannot append to the file ~A.",1,fn); +- } else if (if_exists == Cnil) +- return(Cnil); +- else +- FEerror("~S is an illegal IF-EXISTS option.", +- 1, if_exists); ++ } else if (if_exists == Cnil) return(Cnil); ++ else FEerror("~S is an illegal IF-EXISTS option.",1,if_exists); ++ + } else { ++ + if (if_does_not_exist == sKerror) + FILE_ERROR(fn,"The file does not exist"); + else if (if_does_not_exist == sKcreate) { +- if (smm == smm_output) { +- if(FN1[0]=='|') +- fp = popen(FN1+1,"w"); +- else +- fp = fopen_not_dir(FN1, "w"); +- } else +- fp = fopen_not_dir(FN1, "w+"); +- if (fp == NULL) ++ if (!(fp=smm==smm_output ? (*FN1=='|' ? popen(FN1+1,"w") : fopen_not_dir(FN1, "w")) : fopen_not_dir(FN1, "w+"))) + cannot_create(fn); +- } else if (if_does_not_exist == Cnil) +- return(Cnil); +- else +- FEerror("~S is an illegal IF-DOES-NOT-EXIST option.", +- 1, if_does_not_exist); ++ } else if (if_does_not_exist==Cnil) return(Cnil); ++ else FEerror("~S is an illegal IF-DOES-NOT-EXIST option.",1,if_does_not_exist); + } +- } else ++ break; ++ ++ default: + FEerror("Illegal open mode for ~S.",1,fn); ++ break; ++ } + + vs_push(make_simple_string(FN1)); + x = alloc_object(t_stream); +@@ -600,10 +566,6 @@ close_stream(object strm) { + fclose(strm->sm.sm_fp); + strm->sm.sm_fp = NULL; + strm->sm.sm_fd = -1; +- if (strm->sm.sm_object0 && +- type_of(strm->sm.sm_object0 )==t_cons && +- Mcar(strm->sm.sm_object0)==sSAallow_gzipped_fileA) +- ifuncall1(sLdelete_file,Mcdr(strm->sm.sm_object0)); + break; + + case smm_file_synonym: +@@ -1762,9 +1724,7 @@ LFD(siLoutput_stream_string)() + } + + DEFUN_NEW("FILE-STREAM-P",object,fSfile_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +- RETURN1(type_of(x)==t_stream && +- (x->sm.sm_mode==smm_input || x->sm.sm_mode==smm_output || x->sm.sm_mode==smm_io || x->sm.sm_mode==smm_probe) +- ? Ct : Cnil); ++ RETURN1(type_of(x)==t_stream && file_synonym_stream_p(x) ? Ct : Cnil); + } + + DEFUN_NEW("SYNONYM-STREAM-P",object,fSsynonym_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -19,8 +19,6 @@ Foundation, 675 Mass Ave, Cambridge, MA + + */ + +-#include +-#include + #include + #include + +@@ -32,140 +30,17 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include + #endif + +-#ifdef __MINGW32__ +-# include ++#ifdef __MINGW32__ ++# include + /* Windows has no symlink, therefore no lstat. Without symlinks lstat + is equivalent to stat anyway. */ + # define S_ISLNK(a) 0 + # define lstat stat +-#endif +- +-#ifdef BSD +-#define HAVE_RENAME + #endif + +-#ifdef NEED_GETWD +-#include +- +- +-#ifndef HAVE_GETCWD +-char dotdot[3*16+2] = "../../../../../../../../../../../../../../../../."; +-#include +-static char *getwd_buf; +-static int getwd_bufp; +- +-static char * +-getwd(buffer) +-char *buffer; +-{ +- getwd_buf = buffer; +- getwd1(0); +- if (getwd_bufp == 0) +- getwd_buf[getwd_bufp++] = '/'; +- getwd_buf[getwd_bufp] = '\0'; +- return(getwd_buf); +-} +- +-getwd1(n) +-int n; +-{ +- struct stat st, dev_st; +- struct direct dir; +- ino_t ino; +- struct mnttab mnt; +- FILE *fp; +- register int i; +- char buf[BUFSIZ]; +- static char dev_name[64]; +- +- if (stat(dotdot+(16-n)*3, &st) < 0) +- FEerror("Can't get the current working directory.", 0); +- ino = st.st_ino; +- if (ino == 2) +- goto ROOT; +- getwd1(n+1); +- fp = fopen(dotdot+(16-n-1)*3, "r"); +- if (fp == NULL) +- FEerror("Can't get the current working directory.", 0); +- setbuf(fp, buf); +- fread(&dir, sizeof(struct direct), 1, fp); +- fread(&dir, sizeof(struct direct), 1, fp); +- for (;;) { +- if (fread(&dir, sizeof(struct direct), 1, fp) <= 0) +- break; +- if (dir.d_ino == ino) +- goto FOUND; +- } +- fclose(fp); +- FEerror("Can't get the current working directory.", 0); +- +-FOUND: +- fclose(fp); +- getwd_buf[getwd_bufp++] = '/'; +- for (i = 0; i < DIRSIZ && dir.d_name[i] != '\0'; i++) +- getwd_buf[getwd_bufp++] = dir.d_name[i]; +- return; +- +-ROOT: +- fp = fopen("/etc/mnttab", "r"); +- if (fp == NULL) +- FEerror("Can't get the current working directory.", 0); +- setbuf(fp, buf); +- for (;;) { +- if (fread(&mnt, sizeof(struct mnttab), 1, fp) <= 0) +- break; +- if (mnt.mt_dev[0] != '/') { +- strcpy(dev_name, "/dev/dsk/"); +- strcat(dev_name, mnt.mt_dev); +- stat(dev_name, &dev_st); +- } else +- stat(mnt.mt_dev, &dev_st); +- if (dev_st.st_rdev == st.st_dev) +- goto DEV_FOUND; +- } +- fclose(fp); +- getwd_bufp = 0; +- return; +- +-DEV_FOUND: +- fclose(fp); +- getwd_bufp = 0; +- for (i = 0; mnt.mt_filsys[i] != '\0'; i++) +- getwd_buf[i] = mnt.mt_filsys[i]; +- /* BUG FIX by Grant J. Munsey */ +- if (i == 1 && *getwd_buf == '/') +- i = 0; /* don't add an empty directory name */ +- /* END OF BUG FIX */ +- getwd_bufp = i; +-} +-#endif /* not HAVE_GETCWD */ +-#endif +- +-#ifndef MAXPATHLEN +-#define MAXPATHLEN 512 +-#endif +- +- +-#ifdef HAVE_GETCWD +-char * +-getwd(char *buffer) { +-#ifndef _WIN32 +- char *getcwd(char *, size_t); +-#endif +- return(getcwd(buffer, MAXPATHLEN)); +-} +-#endif +- +- +-#define pcopy(a_,b_,c_,d_) ({\ +- unsigned _c=c_,_d=d_;\ +- if (_c+_d>=MAXPATHLEN-16) FEerror("Can't expand pathname ~a",1,namestring);\ +- bcopy(a_,b_+_c,_d);\ +- b_[_c+_d]=0;\ +- }) +- + static object + get_string(object x) { ++ + switch(type_of(x)) { + case t_symbol: + case t_string: +@@ -180,182 +55,110 @@ get_string(object x) { + case smm_io: + return get_string(x->sm.sm_object1); + case smm_file_synonym: +- case smm_synonym: + return get_string(x->sm.sm_object0->s.s_dbind); + } + } ++ + return Cnil; +-} + ++} + + void +-coerce_to_filename(object pathname,char *p) { ++coerce_to_filename1(object spec, char *p,unsigned sz) { + +- object namestring=get_string(pathname); +- unsigned e=namestring->st.st_fillp; +- char *q=namestring->st.st_self,*qe=q+e; ++ object namestring=get_string(spec); + +- if (pathname==Cnil||namestring==Cnil) +- FEerror ( "NIL argument.", 1, pathname ); +- +- if (*q=='~' && e) { ++ massert(namestring->st.st_fillpst.st_self,namestring->st.st_fillp); ++ p[namestring->st.st_fillp]=0; + +- unsigned m=0; +- char *s=++q,*c; ++#ifdef FIX_FILENAME ++ FIX_FILENAME(spec,p); ++#endif + +- for (;spw_dir,p,0,m=strlen(pwent->pw_dir)); +- +- } +-#endif ++ massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); ++ massert(rpw_name)); + +- pcopy(q,p,0,e); +- +-#ifdef FIX_FILENAME +- FIX_FILENAME(pathname,p); +-#endif +- + } + +-object sSAallow_gzipped_fileA; ++DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") { + +-bool +-file_exists(object file) +-{ +- char filename[MAXPATHLEN]; +- struct stat filestatus; ++ struct passwd *pwent,pw; ++ long r; + +- coerce_to_filename(file, filename); ++ massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); ++ massert(r filename) && +- ( ( *(p-1) == '/' ) || ( *(p-1) == '\\' ) ) ) { +- *(p-1) = '\0'; +- } +- } +-#endif +- +- if (stat(filename, &filestatus) >= 0 && !S_ISDIR(filestatus.st_mode)) +- { +-#ifdef AIX +- /* if /tmp/foo is not a directory /tmp/foo/ should not exist */ +- if (filename[strlen(filename)-1] == '/' && +- !( filestatus.st_mode & S_IFDIR)) +- return(FALSE); +-#endif +- +- return TRUE; +- } +- else +- if (sSAallow_gzipped_fileA->s.s_dbind != sLnil +- && (strcat(filename,".gz"), +- stat(filename, &filestatus) >= 0 && !S_ISDIR(filestatus.st_mode))) +- +- return TRUE; ++ if (nm->st.st_fillp==1) + +- else +- return(FALSE); +-} ++ if ((pw.pw_dir=getenv("HOME"))) ++ pwent=&pw; ++ else ++ massert(!getpwuid_r(getuid(),&pw,FN1,r,&pwent) && pwent); + +-FILE * +-fopen_not_dir(char *filename,char * option) { ++ else { + +- struct stat ss; ++ massert(nm->st.st_fillpst.st_self+1,nm->st.st_fillp-1); ++ FN2[nm->st.st_fillp-1]=0; + +- if (!stat(filename,&ss) && S_ISDIR(ss.st_mode)) +- return NULL; +- else +- return fopen(filename,option); ++ massert(!getpwnam_r(FN2,&pw,FN1,r,&pwent) && pwent); ++ ++ } ++ ++ massert(strlen(pwent->pw_dir)+2pw_dir,strlen(pwent->pw_dir)); ++ FN3[strlen(pwent->pw_dir)]='/'; ++ FN3[strlen(pwent->pw_dir)+1]=0; ++ RETURN1(make_simple_string(FN3)); + + } + ++#define FILE_EXISTS_P(a_,b_) !stat(a_,&b_) && S_ISREG(b_.st_mode) ++#define DIR_EXISTS_P(a_,b_) !stat(a_,&b_) && S_ISDIR(b_.st_mode) ++ + FILE * +-backup_fopen(char *filename, char *option) +-{ +- char backupfilename[MAXPATHLEN]; +- char command[MAXPATHLEN * 2]; ++fopen_not_dir(char *filename,char *option) { ++ ++ struct stat ss; ++ ++ return DIR_EXISTS_P(filename,ss) ? NULL : fopen(filename,option); + +- strcat(strcpy(backupfilename, filename), ".BAK"); +- sprintf(command, "mv %s %s", filename, backupfilename); +- msystem(command); +- return(fopen(filename, option)); + } + + int +-file_len(FILE *fp) +-{ +- struct stat filestatus; ++file_len(FILE *fp) {/*FIXME dir*/ + +- if (fstat(fileno(fp), &filestatus)==0) +- return(filestatus.st_size); +- else return 0; +-} ++ struct stat filestatus; + +-DEF_ORDINARY("DIRECTORY",sKdirectory,KEYWORD,""); +-DEF_ORDINARY("LINK",sKlink,KEYWORD,""); +-DEF_ORDINARY("FILE",sKfile,KEYWORD,""); ++ return fstat(fileno(fp), &filestatus) ? 0 : filestatus.st_size; + +-/* export these for AXIOM */ +-int gcl_putenv(char *s) {return putenv(s);} +-char *gcl_strncpy(char *d,const char *s,size_t z) {return strncpy(d,s,z);} +-char *gcl_strncpy_chk(size_t z) {char a[10],b[10];return strncpy(a,b,z);}/*compile in __strncpy_chk with FORTIFY_SOURCE*/ +-#ifdef __MINGW32__ +-#define uid_t int +-#endif +-uid_t gcl_geteuid(void) { +-#ifndef __MINGW32__ +- return geteuid(); +-#else +- return 0; +-#endif +-} +-uid_t gcl_getegid(void) { +-#ifndef __MINGW32__ +- return getegid(); +-#else +- return 0; +-#endif + } +-int gcl_dup2(int o,int n) {return dup2(o,n);} +-char *gcl_gets(char *s,int z) {return fgets(s,z,stdin);} +-int gcl_puts(const char *s) {int i=fputs(s,stdout);fflush(stdout);return i;} + ++bool ++file_exists(object x) { + +-int gcl_feof(void *v) {return feof(((FILE *)v));} +-int gcl_getc(void *v) {return getc(((FILE *)v));} +-int gcl_putc(int i,void *v) {return putc(i,((FILE *)v));} ++ struct stat ss; ++ ++ coerce_to_filename(x,FN1); + ++ return FILE_EXISTS_P(FN1,ss) ? TRUE : FALSE; + ++} ++ ++DEF_ORDINARY("DIRECTORY",sKdirectory,KEYWORD,""); ++DEF_ORDINARY("LINK",sKlink,KEYWORD,""); ++DEF_ORDINARY("FILE",sKfile,KEYWORD,""); + + DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + +@@ -381,6 +184,31 @@ DEFUNM_NEW("STAT",object,fSstat,SI,1,1,N + make_fixnum(ss.st_uid)); + } + ++#include ++#include ++#include ++#include ++ ++DEFUN_NEW("READLINKAT",object,fSreadlinkat,SI,2,2,NONE,OI,OO,OO,OO,(fixnum d,object s),"") { ++ ssize_t l,z1; ++ ++ check_type_string(&s); ++ /* l=s->st.st_hasfillp ? s->st.st_fillp : s->st.st_dim; */ ++ z1=length(s); ++ massert(z1st.st_self,z1); ++ FN1[z1]=0; ++ massert((l=readlinkat(d ? dirfd((DIR *)d) : AT_FDCWD,FN1,FN2,sizeof(FN2)))>=0 && l + + DEFUN_NEW("OPENDIR",object,fSopendir,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") { +- DIR *d; +- char filename[MAXPATHLEN]; + check_type_string(&x); +- memcpy(filename,x->st.st_self,x->st.st_fillp); +- filename[x->st.st_fillp]=0; +- d=opendir(filename); +- return (object)d; ++ coerce_to_filename(x,FN1); ++ return (object)opendir(FN1); + } + + #ifdef HAVE_D_TYPE +@@ -430,19 +254,27 @@ DEFUN_NEW("D-TYPE-LIST",object,fSd_type_ + MMcons(make_fixnum(DT_UNKNOWN),make_keyword("UNKNOWN")) + )); + } ++#else ++#define DT_UNKNOWN 0 + #endif + + DEFUN_NEW("READDIR",object,fSreaddir,SI,3,3,NONE,OI,IO,OO,OO,(fixnum x,fixnum y,object s),"") { ++ + struct dirent *e; + object z; + long tl; + size_t l; ++ + if (!x) RETURN1(Cnil); ++ + tl=telldir((DIR *)x); +-#ifdef HAVE_D_TYPE +- for (;(e=readdir((DIR *)x)) && y!=DT_UNKNOWN && e->d_type!=y;); ++ ++#ifndef HAVE_D_TYPE ++ y=DT_UNKNOWN; + #endif ++ for (;(e=readdir((DIR *)x)) && y!=DT_UNKNOWN && e->d_type!=y;); + if (!e) RETURN1(Cnil); ++ + if (s==Cnil) + z=make_simple_string(e->d_name); + else { +@@ -457,10 +289,13 @@ DEFUN_NEW("READDIR",object,fSreaddir,SI, + RETURN1(make_fixnum(l)); + } + } ++ + #ifdef HAVE_D_TYPE + if (y==DT_UNKNOWN) z=MMcons(z,make_fixnum(e->d_type)); + #endif ++ + RETURN1(z); ++ + } + + DEFUN_NEW("CLOSEDIR",object,fSclosedir,SI,1,1,NONE,OI,OO,OO,OO,(fixnum x),"") { +@@ -468,165 +303,174 @@ DEFUN_NEW("CLOSEDIR",object,fSclosedir,S + return Cnil; + } + +-DEFUN_NEW("MKDIR",object,fSmkdir,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +- +- char filename[MAXPATHLEN]; ++DEFUN_NEW("RENAME",object,fSrename,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { + + check_type_string(&x); ++ check_type_string(&y); + +- memcpy(filename,x->st.st_self,x->st.st_fillp); +- filename[x->st.st_fillp]=0; +- +-#ifdef __MINGW32__ +- if (mkdir(filename) < 0) +-#else +- if (mkdir(filename,01777) < 0) +-#endif +- FEerror("Cannot make the directory ~S.", 1, vs_base[0]); ++ coerce_to_filename(x,FN1); ++ coerce_to_filename(y,FN2); + +- RETURN1(x); ++ RETURN1(rename(FN1,FN2) ? Cnil : Ct); + + } + +-DEFUN_NEW("RMDIR",object,fSrmdir,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++DEFUN_NEW("UNLINK",object,fSunlink,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ + check_type_string(&x); + + coerce_to_filename(x,FN1); + +- RETURN1(rmdir(FN1) ? Cnil : Ct); ++ RETURN1(unlink(FN1) ? Cnil : Ct); + + } + + ++DEFUN_NEW("CHDIR1",object,fSchdir1,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + +-#include +-#include +-#include +-#include ++ check_type_string(&x); + +-DEFUN_NEW("READLINKAT",object,fSreadlinkat,SI,2,2,NONE,OI,OO,OO,OO,(fixnum d,object s),"") { +- char *b1,*b2=NULL; +- ssize_t l,z1,z2; +- check_type_string(&s); +- /* l=s->st.st_hasfillp ? s->st.st_fillp : s->st.st_dim; */ +- z1=length(s); +- massert((b1=alloca(z1+1))); +- memcpy(b1,s->st.st_self,z1); +- b1[z1]=0; +- for (l=z2=0;l>=z2;) { +- memset(b2,0,z2); +- z2+=z2+10; +- massert((b2=alloca(z2))); +- massert((l=readlinkat(d ? dirfd((DIR *)d) : AT_FDCWD,b1,b2,z2))>=0); +- } +- b2[l]=0; +- s=make_simple_string(b2); +- memset(b1,0,z1); +- memset(b2,0,z2); +- RETURN1(s); +-} ++ coerce_to_filename(x,FN1); + +-DEFUN_NEW("GETCWD",object,fSgetcwd,SI,0,0,NONE,OO,OO,OO,OO,(void),"") { +- char *b=NULL; +- size_t z; +- object s; +- +- for (z=0;!(errno=0) && !getcwd(b,z) && errno==ERANGE;b=memset(b,0,z),z+=z+10,({massert((b=alloca(z)));})); +- massert((b=getcwd(b,z))); +- s=make_simple_string(b); +- memset(b,0,z); +- RETURN1(s); ++ RETURN1(chdir(FN1) ? Cnil : Ct); + + } + +-DEFUN_NEW("UID-TO-NAME",object,fSuid_to_name,SI,1,1,NONE,OI,OO,OO,OO,(fixnum uid),"") { +- struct passwd *pwent,pw; +- char *b; +- long r; ++DEFUN_NEW("MKDIR",object,fSmkdir,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + +- massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); +- massert(b=alloca(r)); ++ check_type_string(&x); + +- massert(!getpwuid_r(uid,&pw,b,r,&pwent)); ++ coerce_to_filename(x,FN1); + +- RETURN1(make_simple_string(pwent->pw_name)); ++ RETURN1(mkdir(FN1 ++#ifndef __MINGW32__ ++ ,01777 ++#endif ++ ) ? Cnil : Ct); + + } + +-DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") { ++DEFUN_NEW("RMDIR",object,fSrmdir,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { ++ check_type_string(&x); + +- struct passwd *pwent,pw; +- char *b; +- long r; ++ coerce_to_filename(x,FN1); + +- massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); +- massert(b=alloca(r)); ++ RETURN1(rmdir(FN1) ? Cnil : Ct); + +- if (nm->st.st_fillp==1) ++} + +- if ((pw.pw_dir=getenv("HOME"))) +- pwent=&pw; +- else +- massert(!getpwuid_r(getuid(),&pw,b,r,&pwent)); ++DEFVAR("*LOAD-WITH-FREAD*",sSAload_with_freadA,SI,Cnil,""); + +- else { ++#ifdef _WIN32 + +- char *name; ++void * ++get_mmap(FILE *fp,void **ve) { + +- massert(name=alloca(nm->st.st_fillp)); +- memcpy(name,nm->st.st_self+1,nm->st.st_fillp-1); +- name[nm->st.st_fillp-1]=0; ++ int n; ++ void *st; ++ size_t sz; ++ HANDLE handle; ++ ++ massert((sz=file_len(fp))>0); ++ if (sSAload_with_freadA->s.s_dbind==Cnil) { ++ n=fileno(fp); ++ massert((n=fileno(fp))>2); ++ massert(handle = CreateFileMapping((HANDLE)_get_osfhandle(n), NULL, PAGE_WRITECOPY, 0, 0, NULL)); ++ massert(st=MapViewOfFile(handle,FILE_MAP_COPY,0,0,sz)); ++ CloseHandle(handle); ++ } else { ++ massert(st=malloc(sz)); ++ massert(fread(st,sz,1,fp)==1); ++ } + +- massert(!getpwnam_r(name,&pw,b,r,&pwent)); ++ *ve=st+sz; + +- } ++ return st; ++ ++} + +- massert((b=alloca(strlen(pwent->pw_dir)+2))); +- memcpy(b,pwent->pw_dir,strlen(pwent->pw_dir)); +- b[strlen(pwent->pw_dir)]='/'; +- b[strlen(pwent->pw_dir)+1]=0; +- RETURN1(make_simple_string(b)); ++int ++un_mmap(void *v1,void *ve) { ++ ++ if (sSAload_with_freadA->s.s_dbind==Cnil) ++ return UnmapViewOfFile(v1) ? 0 : -1; ++ else { ++ free(v1); ++ return 0; ++ } + + } + +-DEFUN_NEW("RENAME",object,fSrename,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { + +- check_type_string(&x); +- check_type_string(&y); ++#else + +- coerce_to_filename(x,FN1); +- coerce_to_filename(y,FN2); ++#include + +- RETURN1(rename(FN1,FN2) ? Cnil : Ct); ++void * ++get_mmap(FILE *fp,void **ve) { ++ ++ int n; ++ void *v1; ++ struct stat ss; ++ ++ massert((n=fileno(fp))>2); ++ massert(!fstat(n,&ss)); ++ if (sSAload_with_freadA->s.s_dbind==Cnil) { ++ massert((v1=mmap(0,ss.st_size,PROT_READ|PROT_WRITE,MAP_PRIVATE,n,0))!=(void *)-1); ++ } else { ++ massert(v1=malloc(ss.st_size)); ++ massert(fread(v1,ss.st_size,1,fp)==1); ++ } ++ ++ *ve=v1+ss.st_size; ++ return v1; + + } + +-DEFUN_NEW("UNLINK",object,fSunlink,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + +- coerce_to_filename(x,FN1); ++int ++un_mmap(void *v1,void *ve) { + +- RETURN1(unlink(FN1) ? Cnil : Ct); ++ if (sSAload_with_freadA->s.s_dbind==Cnil) ++ return munmap(v1,ve-v1); ++ else { ++ free(v1); ++ return 0; ++ } + + } + ++#endif + +-static void +-FFN(siLchdir)(void) +-{ +- char filename[MAXPATHLEN]; +- +- check_arg(1); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- coerce_to_filename(vs_base[0], filename); +- +- if (chdir(filename) < 0) +- FEerror("Can't change the current directory to ~S.", +- 1, vs_base[0]); ++/* export these for AXIOM */ ++int gcl_putenv(char *s) {return putenv(s);} ++char *gcl_strncpy(char *d,const char *s,size_t z) {return strncpy(d,s,z);} ++char *gcl_strncpy_chk(size_t z) {char a[10],b[10];return strncpy(a,b,z);}/*compile in __strncpy_chk with FORTIFY_SOURCE*/ ++#ifdef __MINGW32__ ++#define uid_t int ++#endif ++uid_t gcl_geteuid(void) { ++#ifndef __MINGW32__ ++ return geteuid(); ++#else ++ return 0; ++#endif ++} ++uid_t gcl_getegid(void) { ++#ifndef __MINGW32__ ++ return getegid(); ++#else ++ return 0; ++#endif + } ++int gcl_dup2(int o,int n) {return dup2(o,n);} ++char *gcl_gets(char *s,int z) {return fgets(s,z,stdin);} ++int gcl_puts(const char *s) {int i=fputs(s,stdout);fflush(stdout);return i;} ++ ++int gcl_feof(void *v) {return feof(((FILE *)v));} ++int gcl_getc(void *v) {return getc(((FILE *)v));} ++int gcl_putc(int i,void *v) {return putc(i,((FILE *)v));} + + void + gcl_init_unixfsys(void) { +- +- make_si_function("CHDIR", siLchdir); +- + } +--- gcl-2.6.12.orig/o/unixsys.c ++++ gcl-2.6.12/o/unixsys.c +@@ -235,89 +235,6 @@ DEFUN_NEW("GETPID",object,fSgetpid,SI,0, + } + + +-DEFVAR("*LOAD-WITH-FREAD*",sSAload_with_freadA,SI,Cnil,""); +- +-#ifdef _WIN32 +- +-void * +-get_mmap(FILE *fp,void **ve) { +- +- int n; +- void *st; +- size_t sz; +- HANDLE handle; +- +- massert((sz=file_len(fp))>0); +- if (sSAload_with_freadA->s.s_dbind==Cnil) { +- n=fileno(fp); +- massert((n=fileno(fp))>2); +- massert(handle = CreateFileMapping((HANDLE)_get_osfhandle(n), NULL, PAGE_WRITECOPY, 0, 0, NULL)); +- massert(st=MapViewOfFile(handle,FILE_MAP_COPY,0,0,sz)); +- CloseHandle(handle); +- } else { +- massert(st=malloc(sz)); +- massert(fread(st,sz,1,fp)==1); +- } +- +- *ve=st+sz; +- +- return st; +- +-} +- +-int +-un_mmap(void *v1,void *ve) { +- +- if (sSAload_with_freadA->s.s_dbind==Cnil) +- return UnmapViewOfFile(v1) ? 0 : -1; +- else { +- free(v1); +- return 0; +- } +- +-} +- +- +-#else +- +-#include +- +-void * +-get_mmap(FILE *fp,void **ve) { +- +- int n; +- void *v1; +- struct stat ss; +- +- massert((n=fileno(fp))>2); +- massert(!fstat(n,&ss)); +- if (sSAload_with_freadA->s.s_dbind==Cnil) { +- massert((v1=mmap(0,ss.st_size,PROT_READ|PROT_WRITE,MAP_PRIVATE,n,0))!=(void *)-1); +- } else { +- massert(v1=malloc(ss.st_size)); +- massert(fread(v1,ss.st_size,1,fp)==1); +- } +- +- *ve=v1+ss.st_size; +- return v1; +- +-} +- +- +-int +-un_mmap(void *v1,void *ve) { +- +- if (sSAload_with_freadA->s.s_dbind==Cnil) +- return munmap(v1,ve-v1); +- else { +- free(v1); +- return 0; +- } +- +-} +- +-#endif +- + void + gcl_init_unixsys(void) { + diff --git a/debian/patches/pathnames1.3 b/debian/patches/pathnames1.3 new file mode 100644 index 0000000..311c627 --- /dev/null +++ b/debian/patches/pathnames1.3 @@ -0,0 +1,48 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-40) unstable; urgency=medium + . + * pathnames1.2 + * Bug fix: "popen arguments not quoted causes trouble and security + issues", thanks to axel (Closes: #802203). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/802203 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-14 + +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -83,7 +83,7 @@ DEFUN_NEW("UID-TO-NAME",object,fSuid_to_ + long r; + + massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); +- massert(r=0); +- massert(rst.st_fillp==1) + diff --git a/debian/patches/pathnames1.4 b/debian/patches/pathnames1.4 new file mode 100644 index 0000000..e52d891 --- /dev/null +++ b/debian/patches/pathnames1.4 @@ -0,0 +1,36 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-41) unstable; urgency=medium + . + * pathnames1.3, kfreebsd fix +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-14 + +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -180,7 +180,7 @@ DEFUNM_NEW("STAT",object,fSstat,SI,1,1,N + RETURN4(S_ISDIR(ss.st_mode) ? sKdirectory : + (S_ISLNK(ss.st_mode) ? sKlink : sKfile), + make_fixnum(ss.st_size), +- make_fixnum(ss.st_ctime), ++ make_fixnum(ss.st_mtime), + make_fixnum(ss.st_uid)); + } + diff --git a/debian/patches/pathnames1.5 b/debian/patches/pathnames1.5 new file mode 100644 index 0000000..66b8ac0 --- /dev/null +++ b/debian/patches/pathnames1.5 @@ -0,0 +1,10494 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-41) unstable; urgency=medium + . + * pathnames1.4, kfreebsd fix +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-26 + +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -488,20 +488,6 @@ Cannot compile ~a.~%" + (t (setq dir "."))) + (setq na (namestring + (make-pathname :name name :type (pathname-type(first args))))) +- #+(or dos winnt) +- (format nil "~a -I~a ~a ~a -c -w ~a -o ~a" +- *cc* +- (concatenate 'string si::*system-directory* "../h") +- (if (and (boundp '*c-debug*) *c-debug*) " -g " "") +- (case *speed* +- (3 *opt-three* ) +- (2 *opt-two*) +- (t "")) +- (namestring (make-pathname :type "c" :defaults (first args))) +- (namestring (make-pathname :type "o" :defaults (first args))) +- ) +- +- #-(or dos winnt) + (format nil "~a -I~a ~a ~a -c ~a -o ~a ~a" + *cc* + (concatenate 'string si::*system-directory* "../h") +@@ -527,8 +513,8 @@ Cannot compile ~a.~%" + #+expect-unresolved "-expect_unresolved '*'" + na na na)) + +- #+bsd ""; "-w" +- #-(or aix3 bsd irix3) " 2> /dev/null ") ++ #+(or winnt bsd) ""; "-w" ++ #-(or aix3 bsd winnt irix3) " 2> /dev/null ") + + + ) +@@ -543,30 +529,14 @@ Cannot compile ~a.~%" + (prep-win-path-acc finish (concatenate 'string acc start "~"))) + (concatenate 'string acc s)))) + +-#+winnt +-(defun no-device (c) +- (let* ((c (namestring (truename c))) +- (p (search ":" c))) +- (if p (subseq c (1+ p)) c))) +- +-;; #+winnt +-;; (defun prep-win-path (c o) +-;; (let* ((w si::*wine-detected*) +-;; (c (if w (no-device c) c)) +-;; (o (if w (no-device o) o))) +-;; (prep-win-path-acc (compiler-command c o) ""))) +- + (defun compiler-cc (c-pathname o-pathname) + (safe-system + (format + nil +- (prog1 +- #+irix5 (compiler-command c-pathname o-pathname ) +- #+vax "~a ~@[~*-O ~]-S -I. -w ~a ; as -J -W -o ~A ~A" +- #+(or system-v e15 dgux sgi ) "~a ~@[~*-O ~]-c -I. ~a 2> /dev/null" +- #+winnt (prep-win-path-acc (compiler-command c-pathname o-pathname) "") +- #-winnt (compiler-command c-pathname o-pathname) +- ) ++ #+vax "~a ~@[~*-O ~]-S -I. -w ~a ; as -J -W -o ~A ~A" ++ #+(or system-v e15 dgux sgi ) "~a ~@[~*-O ~]-c -I. ~a 2> /dev/null" ++ #+winnt (prep-win-path-acc (compiler-command c-pathname o-pathname) "") ++ #-(or vax system-v e15 dgux sgi) (compiler-command c-pathname o-pathname) + *cc* + (if (or (= *speed* 2) (= *speed* 3)) t nil) + (namestring c-pathname) +@@ -763,20 +733,9 @@ Cannot compile ~a.~%" + `(let ((,q (si::string-match ,x ,y ,@(when z (list z))))) + (if (= ,q -1) (length ,y) ,q))))) + +-(defun ts (s &optional (r "")) +- (declare (string s) (ignorable r)) +- #+winnt +- (if (not si::*wine-detected*) s +- (let* ((x (sml (fcr #u"[^ \n\t]") s)) +- (y (sml (fcr #u"[ \n\t]") s x)) +- (f (subseq s x y)) +- (l (subseq s y)) +- (k (when (> (length f) 0) (aref f 0))) +- (q (if (eql k #\") (string k) "")) +- (f (if (eql k #\") (subseq f 1 (1- (length f))) f)) +- (f (if (and k (not (eql k #\-))) (namestring (no-device f)) f))) +- (if k (concatenate 'string r q f q (ts l " ")) ""))) +- #-winnt s) ++(defun ts (s) ++ (declare (string s)) ++ s) + + (defun mdelete-file (x) + (delete-file (ts (namestring x)))) +@@ -795,8 +754,7 @@ Cannot compile ~a.~%" + raw)) + (map (merge-pathnames (make-pathname + :name (concatenate 'string (pathname-name raw) "_map")) raw)) +- #+winnt (raw (merge-pathnames (make-pathname :type "exe") raw)) +- ) ++ #+winnt (raw (merge-pathnames (make-pathname :type "exe") raw))) + + (with-open-file (st (namestring map) :direction :output)) + (safe-system +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -624,7 +624,6 @@ use + GNU_LD + LEADING_UNDERSCORE + EXTRA_LOBJS +-PRELINK_CHECK + O2FLAGS + O3FLAGS + NIFLAGS +@@ -678,6 +677,7 @@ EGREP + GREP + MAKEINFO + AWK ++GCL_CC + CPP + OBJEXT + EXEEXT +@@ -686,7 +686,7 @@ CPPFLAGS + LDFLAGS + CFLAGS + CC +-PROCESSOR_FLAGS ++PRELINK_CHECK + host_os + host_vendor + host_cpu +@@ -738,41 +738,38 @@ SHELL' + ac_subst_files='' + ac_user_opts=' + enable_option_checking ++enable_machine + enable_widecons + enable_safecdr + enable_safecdrdbg + enable_prelink +-enable_fastimmfix +-enable_holepage + enable_vssize + enable_bdssize + enable_ihssize + enable_frssize +-enable_machine +-enable_immfix +-enable_notify +-enable_tcltk +-enable_tkconfig +-enable_tclconfig + enable_infodir + enable_emacsdir +-enable_common_binary +-enable_japi +-enable_xdr + enable_xgcl + enable_dlopen + enable_statsysbfd + enable_dynsysbfd + enable_custreloc + enable_debug +-enable_gprof + enable_static + enable_pic +-enable_oldgmp ++enable_gprof + enable_dynsysgmp + with_x +-enable_readline ++enable_xdr ++enable_immfix ++enable_fastimmfix + enable_ansi ++enable_japi ++enable_readline ++enable_tcltk ++enable_tkconfig ++enable_tclconfig ++enable_notify + ' + ac_precious_vars='build_alias + host_alias +@@ -1410,51 +1407,37 @@ Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +-use a three word cons with simplified typing +-protect cdr from immfix and speed up type processing +-debug safecdr code +---enable-prelink will insist that the produced images may be prelinked +---enable-fastimmfix=XXXX will reject low immediate fixnums unless 1<&6; } + + } # ac_fn_c_check_member + ++# ac_fn_c_try_link LINENO ++# ----------------------- ++# Try to link conftest.$ac_ext, and return whether this succeeded. ++ac_fn_c_try_link () ++{ ++ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack ++ rm -f conftest.$ac_objext conftest$ac_exeext ++ if { { ac_try="$ac_link" ++case "(($ac_try" in ++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; ++ *) ac_try_echo=$ac_try;; ++esac ++eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" ++$as_echo "$ac_try_echo"; } >&5 ++ (eval "$ac_link") 2>conftest.err ++ ac_status=$? ++ if test -s conftest.err; then ++ grep -v '^ *+' conftest.err >conftest.er1 ++ cat conftest.er1 >&5 ++ mv -f conftest.er1 conftest.err ++ fi ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; } && { ++ test -z "$ac_c_werror_flag" || ++ test ! -s conftest.err ++ } && test -s conftest$ac_exeext && { ++ test "$cross_compiling" = yes || ++ test -x conftest$ac_exeext ++ }; then : ++ ac_retval=0 ++else ++ $as_echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ ac_retval=1 ++fi ++ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information ++ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would ++ # interfere with the next link command; also delete a directory that is ++ # left behind by Apple's compiler. We do this before executing the actions. ++ rm -rf conftest.dSYM conftest_ipa8_conftest.oo ++ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno ++ as_fn_set_status $ac_retval ++ ++} # ac_fn_c_try_link ++ + # ac_fn_c_check_func LINENO FUNC VAR + # ---------------------------------- + # Tests whether FUNC exists, setting the cache variable VAR accordingly +@@ -2506,226 +2535,6 @@ ac_config_headers="$ac_config_headers h/ + VERSION=`cat majvers`.`cat minvers` + + +-# some parts of this configure script are taken from the tcl configure.in +- +-# +-# Arguments +-# +- +- +- +- +-# Check whether --enable-widecons was given. +-if test "${enable_widecons+set}" = set; then : +- enableval=$enable_widecons; +-$as_echo "#define WIDE_CONS 1" >>confdefs.h +- +-fi +- +- +- +-# Check whether --enable-safecdr was given. +-if test "${enable_safecdr+set}" = set; then : +- enableval=$enable_safecdr; +-else +- enable_safecdr="no" +-fi +- +-if test "$enable_safecdr" = "yes" ; then +- +-$as_echo "#define USE_SAFE_CDR 1" >>confdefs.h +- +-fi +-# Check whether --enable-safecdrdbg was given. +-if test "${enable_safecdrdbg+set}" = set; then : +- enableval=$enable_safecdrdbg; +-$as_echo "#define DEBUG_SAFE_CDR 1" >>confdefs.h +- +-fi +- +- +-# Check whether --enable-prelink was given. +-if test "${enable_prelink+set}" = set; then : +- enableval=$enable_prelink; PRELINK_CHECK=t +-else +- PRELINK_CHECK= +-fi +- +- +-# Check whether --enable-fastimmfix was given. +-if test "${enable_fastimmfix+set}" = set; then : +- enableval=$enable_fastimmfix; +-else +- enable_fastimmfix=64 +-fi +- +- +- +-# Check whether --enable-holepage was given. +-if test "${enable_holepage+set}" = set; then : +- enableval=$enable_holepage; +-cat >>confdefs.h <<_ACEOF +-#define HOLEPAGE $enable_holepage +-_ACEOF +- +-fi +- +- +-# Check whether --enable-vssize was given. +-if test "${enable_vssize+set}" = set; then : +- enableval=$enable_vssize; +-else +- enable_vssize=262144 +-fi +- +- +-cat >>confdefs.h <<_ACEOF +-#define VSSIZE $enable_vssize +-_ACEOF +- +- +-# Check whether --enable-bdssize was given. +-if test "${enable_bdssize+set}" = set; then : +- enableval=$enable_bdssize; +-else +- enable_bdssize=2048 +-fi +- +- +-cat >>confdefs.h <<_ACEOF +-#define BDSSIZE $enable_bdssize +-_ACEOF +- +- +-# Check whether --enable-ihssize was given. +-if test "${enable_ihssize+set}" = set; then : +- enableval=$enable_ihssize; +-else +- enable_ihssize=4096 +-fi +- +- +-cat >>confdefs.h <<_ACEOF +-#define IHSSIZE $enable_ihssize +-_ACEOF +- +- +-# Check whether --enable-frssize was given. +-if test "${enable_frssize+set}" = set; then : +- enableval=$enable_frssize; +-else +- enable_frssize=4096 +-fi +- +- +-cat >>confdefs.h <<_ACEOF +-#define FRSSIZE $enable_frssize +-_ACEOF +- +- +-# Check whether --enable-machine was given. +-if test "${enable_machine+set}" = set; then : +- enableval=$enable_machine; enable_machine=$enableval +-else +- enable_machine="" +-fi +- +- +-# Check whether --enable-immfix was given. +-if test "${enable_immfix+set}" = set; then : +- enableval=$enable_immfix; +-else +- enable_immfix=yes +-fi +- +- +-#AC_ARG_ENABLE(gmp,[ --enable-gmp=no will disable use of GMP gnu multiprecision arithmetic, (default is =yes)] , +-#[use_gmp=$enableval],[use_gmp="yes"]) +- +-use_gmp="yes" +- +-# Check whether --enable-notify was given. +-if test "${enable_notify+set}" = set; then : +- enableval=$enable_notify; enable_notify=$enableval +-else +- enable_notify="yes" +-fi +- +- +-# Check whether --enable-tcltk was given. +-if test "${enable_tcltk+set}" = set; then : +- enableval=$enable_tcltk; enable_tcltk=$enableval +-else +- enable_tcltk="yes" +-fi +- +- +-# Check whether --enable-tkconfig was given. +-if test "${enable_tkconfig+set}" = set; then : +- enableval=$enable_tkconfig; TK_CONFIG_PREFIX=$enableval +-else +- TK_CONFIG_PREFIX="unknown" +-fi +- +- +- +-# Check whether --enable-tclconfig was given. +-if test "${enable_tclconfig+set}" = set; then : +- enableval=$enable_tclconfig; TCL_CONFIG_PREFIX=$enableval +-else +- TCL_CONFIG_PREFIX="unknown" +-fi +- +- +-# Check whether --enable-infodir was given. +-if test "${enable_infodir+set}" = set; then : +- enableval=$enable_infodir; INFO_DIR=$enableval +-else +- INFO_DIR=$prefix/share/info +-fi +- +-INFO_DIR=`eval echo $INFO_DIR/` +- +-# Check whether --enable-emacsdir was given. +-if test "${enable_emacsdir+set}" = set; then : +- enableval=$enable_emacsdir; EMACS_SITE_LISP=$enableval +-else +- EMACS_SITE_LISP=$prefix/share/emacs/site-lisp +-fi +- +-EMACS_SITE_LISP=`eval echo $EMACS_SITE_LISP/` +- +-# Check whether --enable-common-binary was given. +-if test "${enable_common_binary+set}" = set; then : +- enableval=$enable_common_binary; use_common_binary=$enableval +-else +- use_common_binary="yes" +-fi +- +- +-# Check whether --enable-japi was given. +-if test "${enable_japi+set}" = set; then : +- enableval=$enable_japi; try_japi=$enableval +-else +- try_japi="no" +-fi +- +- +-# Check whether --enable-xdr was given. +-if test "${enable_xdr+set}" = set; then : +- enableval=$enable_xdr; enable_xdr=$enableval +-else +- enable_xdr="yes" +-fi +- +- +-# Check whether --enable-xgcl was given. +-if test "${enable_xgcl+set}" = set; then : +- enableval=$enable_xgcl; enable_xgcl=$enableval +-else +- enable_xgcl="yes" +-fi +- + + # + # Host information +@@ -2856,380 +2665,247 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: host=$host" >&5 + $as_echo "host=$host" >&6; } + +-PROCESSOR_FLAGS=${PROCESSOR_FLAGS:-""} +- + use=unknown +-TLDFLAGS="" + case $canonical in +- older) +- use=386-bsd;; +- +- sh4*linux*) +- use=sh4-linux;; +- +- *x86_64*linux*) +- use=amd64-linux;; +- +- *x86_64*kfreebsd*) +- use=amd64-kfreebsd;; +- +- *86*linux*) +- use=386-linux;; +- +- *86*kfreebsd*) +- use=386-kfreebsd;; +- +- *86*gnu*) +- use=386-gnu;; +- +-# m6800 not working with gcc-3.2 +- m68k*linux*) +- if test "$use_common_binary" = "yes"; then +- host=m68020-unknown-linux-gnu +- echo "The host is canonicalised to $host" +- fi +- use=m68k-linux;; +- +- alpha*linux*) +- use=alpha-linux;; +- +- mips*linux*) +- use=mips-linux;; +- +- mipsel*linux*) +- use=mipsel-linux;; +- +- sparc*linux*) +- use=sparc-linux;; +- +- aarch64*linux*) +- use=aarch64-linux;; +- +- arm*linux*) +- use=arm-linux;; +- +- s390*linux*) +- use=s390-linux;; +- +- ia64*linux*) +- use=ia64-linux;; +- +- hppa*linux*) +- use=hppa-linux;; +- +- powerpc*linux*) +- use=powerpc-linux;; +- +- powerpc-*-darwin*) +- use=powerpc-macosx;; +- +- *86*darwin*) +- use=386-macosx +- if test "$build_cpu" = "x86_64" ; then +- CFLAGS="-m64 $CFLAGS"; +- LDFLAGS="-m64 -Wl,-headerpad,72 -Wl,-no_pie $LDFLAGS"; +- else +- CFLAGS="-m32 $CFLAGS"; +- LDFLAGS="-m32 -Wl,-headerpad,56 -Wl,-no_pie $LDFLAGS"; ++ sh4*linux*) use=sh4-linux;; ++ *x86_64*linux*) use=amd64-linux;; ++ *x86_64*kfreebsd*) use=amd64-kfreebsd;; ++ *86*linux*) use=386-linux;; ++ *86*kfreebsd*) use=386-kfreebsd;; ++ *86*gnu*) use=386-gnu;; ++ m68k*linux*) use=m68k-linux;; ++ alpha*linux*) use=alpha-linux;; ++ mips*linux*) use=mips-linux;; ++ mipsel*linux*) use=mipsel-linux;; ++ sparc*linux*) use=sparc-linux;; ++ aarch64*linux*) use=aarch64-linux;; ++ arm*linux*) use=arm-linux;; ++ s390*linux*) use=s390-linux;; ++ ia64*linux*) use=ia64-linux;; ++ hppa*linux*) use=hppa-linux;; ++ powerpc*linux*) use=powerpc-linux;; ++ powerpc-*-darwin*) use=powerpc-macosx;; ++ *86*darwin*) use=386-macosx;; ++ i*mingw*|i*msys*) use=mingw;; ++ i*cygwin*) ++ if $CC -v 2>&1 | fgrep ming > /dev/null ; ++ then use=mingw ++ else use=gnuwin95 + fi;; ++ *openbsd*) use=FreeBSD;; ++ sparc-sun-solaris*) use=solaris;; ++ i?86-pc-solaris*) use=solaris-i386;; ++esac + +- alpha-dec-osf) +- use=alpha-osf1;; +- +- mips-dec-ultrix) +- use=dec3100;; +- +- old) +- use=dos-go32;; +- +- *86*-freebsd*) +- use=FreeBSD;; +- +- hp3*-*hpux*) +- use=hp300;; +- +- hp3*-*-*bsd*) +- use=hp300-bsd;; +- +- hppa*-*hpux*) +- use=hp800;; +- +- mips-sgi-irix) +- case $system in +- IRIX5*) +- use=irix5;; +- IRIX6*) +- use=irix6;; +- IRIX3*) +- use=sgi4d;; +- esac ;; +- +- +- m68k-apple-aux*) +- use=mac2;; +- +- old) +- use=mp386;; ++# Check whether --enable-machine was given. ++if test "${enable_machine+set}" = set; then : ++ enableval=$enable_machine; echo enable_machine=$enableval ; use=$enableval ++fi + +- *86-ncr-sysv4) +- use=ncr;; + +- *3-986-*netbsd*) +- use=NetBSD;; ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: use=$use" >&5 ++$as_echo "use=$use" >&6; } + +- old) +- use=NeXT;; ++def_dlopen="no" ++def_statsysbfd="no" ++def_custreloc="yes" ++def_oldgmp="no" ++def_pic="no"; ++def_static="no"; ++def_debug="no"; ++case $use in ++ *kfreebsd) ++ ln -snf linux.defs h/$use.defs;; ++ *gnu) ++ ln -snf linux.defs h/$use.defs;; ++ *linux) ++ ln -snf linux.defs h/$use.defs; ++ case $use in ++ ia64*) ++ def_dlopen="yes" ; def_custreloc="no" ;; ++ hppa*) ++ def_pic="yes" ;; ++ esac;; ++esac + +- old) +- use=NeXT30-m68k;; ++# Check whether --enable-widecons was given. ++if test "${enable_widecons+set}" = set; then : ++ enableval=$enable_widecons; if test "$enableval" = "yes" ; then ++$as_echo "#define WIDE_CONS 1" >>confdefs.h ++ fi ++fi + +- *86-*nextstep*) +- use=NeXT32-i386;; + +- *m68*-*nextstep*) +- use=NeXT32-m68k;; ++# Check whether --enable-safecdr was given. ++if test "${enable_safecdr+set}" = set; then : ++ enableval=$enable_safecdr; if test "$enableval" = "yes" ; then + +- *rs6000-*-aix4*) +- use=rios;; ++$as_echo "#define USE_SAFE_CDR 1" >>confdefs.h + +- *rs6000-*-aix3*) +- use=rios-aix3;; ++ # Check whether --enable-safecdrdbg was given. ++if test "${enable_safecdrdbg+set}" = set; then : ++ enableval=$enable_safecdrdbg; if test "$enableval" = "yes" ; then ++$as_echo "#define DEBUG_SAFE_CDR 1" >>confdefs.h ++ fi ++fi + +- old) +- use=rt_aix;; ++ fi ++fi + +- old) +- use=sgi;; + +- sparc-sun-solaris*) +- use=solaris;; ++# Check whether --enable-prelink was given. ++if test "${enable_prelink+set}" = set; then : ++ enableval=$enable_prelink; if test "$enable_prelink" = "yes" ; then PRELINK_CHECK=t; fi ++fi + +- i?86-pc-solaris*) +- use=solaris-i386;; + +- old) +- use=sun2r3;; + +- old) +- use=sun3;; ++# Check whether --enable-vssize was given. ++if test "${enable_vssize+set}" = set; then : ++ enableval=$enable_vssize; ++cat >>confdefs.h <<_ACEOF ++#define VSSIZE $enableval ++_ACEOF + +- m68*-sunos*) +- use=sun3-os4;; ++fi + +- old) +- use=sun386i;; ++# Check whether --enable-bdssize was given. ++if test "${enable_bdssize+set}" = set; then : ++ enableval=$enable_bdssize; ++cat >>confdefs.h <<_ACEOF ++#define BDSSIZE $enableval ++_ACEOF + +- sparc*sunos*) +- use=sun4;; ++fi + +- *86-sequent-dynix) +- use=symmetry;; ++# Check whether --enable-ihssize was given. ++if test "${enable_ihssize+set}" = set; then : ++ enableval=$enable_ihssize; ++cat >>confdefs.h <<_ACEOF ++#define IHSSIZE $enableval ++_ACEOF + +- u370*aix) +- use=u370_aix;; ++fi + +- old) +- use=vax;; ++# Check whether --enable-frssize was given. ++if test "${enable_frssize+set}" = set; then : ++ enableval=$enable_frssize; ++cat >>confdefs.h <<_ACEOF ++#define FRSSIZE $enableval ++_ACEOF + +- i*mingw*) +- if test "$use_common_binary" = "yes"; then +- host=i386-pc-mingw32 +- PROCESSOR_FLAGS="-march=i386 " +- echo "The host is canonicalised to $host" +- fi +- use=mingw;; ++fi + +- i*cygwin*) +- if $CC -v 2>&1 | fgrep ming > /dev/null ; +- then use=mingw +- else use=gnuwin95 +- fi;; + +- *openbsd*) +- # 'ld -Z' means disable W^X +- TLDFLAGS="$TLDFLAGS -Z" +- use=FreeBSD;; ++# Check whether --enable-infodir was given. ++if test "${enable_infodir+set}" = set; then : ++ enableval=$enable_infodir; INFO_DIR=$enableval ++else ++ INFO_DIR=$prefix/share/info ++fi + +-esac ++INFO_DIR=`eval echo $INFO_DIR/` + ++# Check whether --enable-emacsdir was given. ++if test "${enable_emacsdir+set}" = set; then : ++ enableval=$enable_emacsdir; EMACS_SITE_LISP=$enableval ++else ++ EMACS_SITE_LISP=$prefix/share/emacs/site-lisp ++fi + ++EMACS_SITE_LISP=`eval echo $EMACS_SITE_LISP/` + +-echo enable_machine=$enable_machine +-if test "x$enable_machine" != "x" ; then +- use=$enable_machine ++# Check whether --enable-xgcl was given. ++if test "${enable_xgcl+set}" = set; then : ++ enableval=$enable_xgcl; ++else ++ enable_xgcl=yes + fi + +-def_dlopen="no" +-def_statsysbfd="no" +-def_custreloc="yes" +-#def_statsysbfd="yes" +-#def_custreloc="no" +-def_locbfd="no" +-def_oldgmp="no" +-def_pic="no"; +-def_static="no"; +-def_debug="no"; +-case $use in +- *kfreebsd) +- ln -snf linux.defs h/$use.defs;; +- *gnu) +- ln -snf linux.defs h/$use.defs;; +- *linux) +- ln -snf linux.defs h/$use.defs; +- case $use in +-# def_static -- Function descriptors are currently realized at runtime in a non-reproducible fashion +-# on these architectures -- CM +- powerpc*) +-# if test "$host_cpu" = "powerpc64" ; then def_dlopen="yes" ; def_custreloc="no" ; fi +- ;; +- ia64*) +- def_dlopen="yes" ; def_custreloc="no" ;; +- hppa*) +- def_pic="yes" ;; +-# def_dlopen="yes" ; def_custreloc="no" ; def_pic="yes" ;; +- esac;; +-esac + + # Check whether --enable-dlopen was given. + if test "${enable_dlopen+set}" = set; then : + enableval=$enable_dlopen; + else +- enable_dlopen="$def_dlopen" ++ enable_dlopen=$def_dlopen + fi + + # Check whether --enable-statsysbfd was given. + if test "${enable_statsysbfd+set}" = set; then : + enableval=$enable_statsysbfd; + else +- enable_statsysbfd="$def_statsysbfd" ++ enable_statsysbfd=$def_statsysbfd + fi + + # Check whether --enable-dynsysbfd was given. + if test "${enable_dynsysbfd+set}" = set; then : + enableval=$enable_dynsysbfd; + else +- enable_dynsysbfd="no" ++ enable_dynsysbfd=no + fi + +-#AC_ARG_ENABLE(locbfd, +-# [ --enable-locbfd uses a static bfd library built from this source tree for loading and relocationing object files ] +-# ,,enable_locbfd="$def_locbfd") + # Check whether --enable-custreloc was given. + if test "${enable_custreloc+set}" = set; then : + enableval=$enable_custreloc; + else +- enable_custreloc="$def_custreloc" ++ enable_custreloc=$def_custreloc + fi + ++ + # Check whether --enable-debug was given. + if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; + else +- enable_debug="$def_debug" +-fi +- +-# Check whether --enable-gprof was given. +-if test "${enable_gprof+set}" = set; then : +- enableval=$enable_gprof; +-else +- enable_gprof="no" ++ enable_debug=$def_debug + fi + + # Check whether --enable-static was given. + if test "${enable_static+set}" = set; then : +- enableval=$enable_static; enable_static=$enableval ++ enableval=$enable_static; + else +- enable_static="$def_static" ++ enable_static=$def_static + fi + + # Check whether --enable-pic was given. + if test "${enable_pic+set}" = set; then : + enableval=$enable_pic; + else +- enable_pic="$def_pic" +-fi +- +- +-# Check whether --enable-oldgmp was given. +-if test "${enable_oldgmp+set}" = set; then : +- enableval=$enable_oldgmp; +-else +- enable_oldgmp="$def_oldgmp" ++ enable_pic=$def_pic + fi + + +-# Check whether --enable-dynsysgmp was given. +-if test "${enable_dynsysgmp+set}" = set; then : +- enableval=$enable_dynsysgmp; +-else +- enable_dynsysgmp="yes" +-fi +- +- +-load_opt="0" ++load_opt=0 + if test "$enable_dlopen" = "yes" ; then +- load_opt=1 ++ load_opt=1 + fi + if test "$enable_statsysbfd" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- esac ++ case $load_opt in ++ 0) load_opt=1;; ++ 1) load_opt=2;; ++ esac + fi + if test "$enable_dynsysbfd" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- 2) load_opt=3;; +- esac +-fi +-if test "$enable_locbfd" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- 2) load_opt=3;; +- 3) load_opt=4;; +- esac ++ case $load_opt in ++ 0) load_opt=1;; ++ 1) load_opt=2;; ++ 2) load_opt=3;; ++ esac + fi + if test "$enable_custreloc" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- 2) load_opt=3;; +- 3) load_opt=4;; +- 4) load_opt=5;; +- esac ++ case $load_opt in ++ 0) load_opt=1;; ++ 1) load_opt=2;; ++ 2) load_opt=3;; ++ 3) load_opt=4;; ++ 4) load_opt=5;; ++ esac + fi + + if test "$load_opt" != "1" ; then +- echo "Exactly one loader option must be chosen: dlopen=$enable_dlopen statsysbfd=$enable_statsysbfd dynsysbfd=$enable_dynsysbfd locbfd=$enable_locbfd custreloc=$enable_custreloc" +- exit 1 ++ echo "Exactly one loader option must be chosen: dlopen=$enable_dlopen statsysbfd=$enable_statsysbfd dynsysbfd=$enable_dynsysbfd custreloc=$enable_custreloc" ++ as_fn_error $? "loader option failure" "$LINENO" 5 + fi + +-TLDFLAGS="" +-if test "$enable_static" = "yes" ; then +- TLDFLAGS="-static -Wl,-zmuldefs $TLDFLAGS"; #FIXME should be in unixport/makefile +- +-$as_echo "#define STATIC_LINKING 1" >>confdefs.h +- +-fi +-case $use in +- *gnuwin*) +- TLDFLAGS="$TLDFLAGS -Wl,--stack,8000000";; +-esac +- +-## finally warn if we did not find a recognized machine.s +-## +-#if test "$use" = "unknown" ; then +-#types=`echo h/*.defs` | sed -e "s:h/::g" -e "s:\.defs:g"` +-#echo got canonical=$canonical, but was not recognized. +-#echo Unable to guess type to use. Try one of +-#exit(1) +-#fi +- +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: use=$use" >&5 +-$as_echo "use=$use" >&6; } +- + + # + # System programs +@@ -3238,10 +2914,10 @@ $as_echo "use=$use" >&6; } + # We set the default CFLAGS below, and don't want the autoconf default + # CM 20040106 + if test "$CFLAGS" = "" ; then +- CFLAGS=" " ++ CFLAGS=" " + fi + if test "$LDFLAGS" = "" ; then +- LDFLAGS=" " ++ LDFLAGS=" " + fi + + ac_ext=c +@@ -4171,74 +3847,90 @@ ac_link='$CC -o conftest$ac_exeext $CFLA + ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ++GCL_CC=`basename $CC` ++if echo $GCL_CC |grep gcc |grep -q win; then ++ GCL_CC=gcc ++fi + + +-# can only test for numbers -- CM +-# if test "${GCC}" -eq "yes" ; then +-#if [[ "${GCC}" = "yes" ]] ; then +-# Allog for environment variable overrides on compiler selection -- CM +-#GCC=$CC +-#else +-#GCC="" +-#fi +-# subst GCC not only under 386-linux, but where available -- CM +- +-TCFLAGS="-fsigned-char -fno-builtin-malloc -fno-builtin-free" +- +-if test "$GCC" = "yes" ; then +- +- TCFLAGS="$TCFLAGS -Wall" ++add_arg_to_tcflags() { + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 +-$as_echo_n "checking for clang... " >&6; } ++ local i=1 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAG $1" >&5 ++$as_echo_n "checking for CFLAG $1... " >&6; } ++ CFLAGS_ORI=$CFLAGS ++ CFLAGS="$CFLAGS -Werror $1 `echo $1|sed 's,-Wno-,-W,1'`" + + if test "$cross_compiling" = yes; then : +- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-as_fn_error $? "cannot run test program while cross compiling +-See \`config.log' for more details" "$LINENO" 5; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + ++int ++main () ++{ + +- int main() { +- return +- #ifdef __clang__ +- 0 +- #else +- 1 +- #endif +- ;} ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- clang="yes" +- TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign" +- +-$as_echo "#define CLANG 1" >>confdefs.h +- ++ TCFLAGS="$TCFLAGS $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; };i=0 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +- #FIXME -Wno-unused-but-set-variable when time +- TMPF=-Wno-unused-but-set-variable +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAG $TMPF" >&5 +-$as_echo_n "checking for CFLAG $TMPF... " >&6; } +- CFLAGS_ORI=$CFLAGS +- CFLAGS="$CFLAGS $TMPF" +- if test "$cross_compiling" = yes; then : ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++ CFLAGS=$CFLAGS_ORI ++ return $i ++ ++} ++ ++assert_arg_to_tcflags() { ++ if ! add_arg_to_tcflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5 ++$as_echo "cannot add $1 to CFLAGS" >&6; }; exit 1 ; fi ++ return 0 ++} ++ ++add_args_to_tcflags() { ++ ++ while test "$#" -ge 1 ; do ++ add_arg_to_tcflags $1 ++ shift ++ done ++} ++ ++add_arg_to_tldflags() { ++ ++ local i=1 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LDFLAG $1" >&5 ++$as_echo_n "checking for LDFLAG $1... " >&6; } ++ LDFLAGS_ORI=$LDFLAGS ++ LDFLAGS="$LDFLAGS -Werror $1" ++ if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-int main() {return 0;} ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +- TCFLAGS="$TCFLAGS $TMPF";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } ++ TLDFLAGS="$TLDFLAGS $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; };i=0 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +@@ -4247,48 +3939,136 @@ rm -f core *.core core.conftest.* gmon.o + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- CFLAGS=$CFLAGS_ORI ++ LDFLAGS=$LDFLAGS_ORI ++ return $i ++ ++} ++ ++assert_arg_to_tldflags() { ++ if ! add_arg_to_tldflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to LDFLAGS" >&5 ++$as_echo "cannot add $1 to LDFLAGS" >&6; }; exit 1 ; fi ++ return 0 ++} ++ ++add_args_to_tldflags() { ++ ++ while test "$#" -ge 1 ; do ++ add_arg_to_tldflags $1 ++ shift ++ done ++} ++ ++remove_arg_from_ldflags() { ++ ++ NEW_LDFLAGS="" ++ for i in $LDFLAGS; do ++ if ! test "$i" = "$1" ; then ++ NEW_LDFLAGS="$NEW_LDFLAGS $i" ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: removing $1 from LDFLAGS" >&5 ++$as_echo "removing $1 from LDFLAGS" >&6; } ++ fi ++ done ++ LDFLAGS=$NEW_LDFLAGS ++ ++ return 0 ++ ++} ++ ++TCFLAGS="" ++add_args_to_tcflags -fsigned-char -pipe \ ++ -fno-builtin-malloc -fno-builtin-free \ ++ -fno-PIE -fno-pie -fno-PIC -fno-pic \ ++ -Wall \ ++ -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ ++ -Wno-unused-but-set-variable -Wno-misleading-indentation ++ ++TLDFLAGS="" ++add_args_to_tldflags -Wl,-no_pie -no-pie -Wl,-z,lazy ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 ++$as_echo_n "checking for clang... " >&6; } ++if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++ #ifdef __clang__ ++ #define RET 0 ++ #else ++ #define RET 1 ++ #endif ++ ++int ++main () ++{ ++ ++ return RET; ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ clang="yes" ++ remove_arg_from_ldflags -pie ++ ++$as_echo "#define CLANG 1" >>confdefs.h ++ ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-fi + +-if test "$GCC" = "yes" ; then +- TCFLAGS="$TCFLAGS -pipe" +- case $use in +- *mingw*) +-# echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." +-# echo " It is otherwise needed for the Unexec stuff to work." +-# if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi +- TCFLAGS="$TCFLAGS -fno-zero-initialized-in-bss -mms-bitfields";; +- *gnuwin*) +-# echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." +-# echo " It is otherwise needed for the Unexec stuff to work." +-# if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi +- TCFLAGS="$TCFLAGS -fno-zero-initialized-in-bss -mms-bitfields";; +- esac +-fi +-#if test -f /proc/sys/kernel/exec-shield ; then +-# exec_stat=`cat /proc/sys/kernel/exec-shield` +-# if test "$exec_stat" != "0" ; then +-# # CFLAGS here to hopefully cover the DBEGIN routine below +-# CFLAGS="$CFLAGS -Wa,--execstack" +-# fi +-#fi ++case $use in ++ *mingw*) ++ assert_arg_to_tcflags -fno-zero-initialized-in-bss ++ assert_arg_to_tcflags -mms-bitfields;; ++ *gnuwin*) ++ assert_arg_to_tcflags -fno-zero-initialized-in-bss ++ assert_arg_to_tcflags -mms-bitfields ++ assert_arg_to_tldflags -Wl,--stack,8000000;; ++ 386-macosx) ++ assert_arg_to_tldflags -Wl,-no_pie ++ if test "$build_cpu" = "x86_64" ; then ++ assert_arg_to_tcflags -m64 ++ assert_arg_to_tldflags -m64 ++ assert_arg_to_tldflags -Wl,-headerpad,72 ++ else ++ assert_arg_to_tcflags -m32 ++ assert_arg_to_tldflags -m32 ++ assert_arg_to_tldflags -Wl,-headerpad,56 ++ fi;; ++ FreeBSD) assert_arg_to_tldflags -Z;; ++esac ++ ++if test "$enable_static" = "yes" ; then ++ assert_arg_to_tldflags -static ++ assert_arg_to_tldflags -Wl,-zmuldefs ++ ++$as_echo "#define STATIC_LINKING 1" >>confdefs.h ++ ++fi + + TO3FLAGS="" + TO2FLAGS="" + +-#TFPFLAG="-fomit-frame-pointer" +-# FIXME -- remove when mingw compiler issues are fixed + case "$use" in +- *mingw*) ++ *mingw*) + TFPFLAG="";; +- m68k*)#FIXME gcc 4.x bug workaround ++ m68k*)#FIXME gcc 4.x bug workaround + TFPFLAG="";; +- *) ++ *) + TFPFLAG="-fomit-frame-pointer";; + esac + +@@ -4335,143 +4115,104 @@ fi + done + + +-# Work around system/gprof mips/hppa hang +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking working gprof" >&5 ++# Check whether --enable-gprof was given. ++if test "${enable_gprof+set}" = set; then : ++ enableval=$enable_gprof; if test "$enableval" = "yes" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking working gprof" >&5 + $as_echo_n "checking working gprof... " >&6; } +-old_enable_gprof=$enable_gprof +-case $use in +- powerpc*) if test "$host_cpu" = "powerpc64le" ; then enable_gprof="no"; fi;; +- sh4*) enable_gprof="no";; +- ia64*) enable_gprof="no";; +-# mips*) enable_gprof="no";; +- hppa*) enable_gprof="no";; +- arm*) enable_gprof="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible +- *gnu) enable_gprof="no";; +-esac +-if test "$enable_gprof" = "$old_enable_gprof" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +-$as_echo "ok" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 ++ case $use in ++ powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; ++ sh4*) enableval="no";; ++ ia64*) enableval="no";; ++ hppa*) enableval="no";; ++ arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++ *gnu) enableval="no";; ++ esac ++ if test "$enableval" != "yes" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 + $as_echo "disabled" >&6; } +-fi +- +-if test "$enable_gprof" = "yes" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text start" >&5 ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 ++$as_echo "ok" >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for text start" >&5 + $as_echo_n "checking for text start... " >&6; } +- echo 'int main () {return(0);}' >foo.c +- $CC foo.c -o foo +- GCL_GPROF_START=`nm foo | $AWK '/ *[TD] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc +- rm -f foo.c foo +- if test "$GCL_GPROF_START" != "" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCL_GPROF_START" >&5 ++ echo 'int main () {return(0);}' >foo.c ++ $CC foo.c -o foo ++ GCL_GPROF_START=`nm foo | $AWK '/ *[TD] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc ++ rm -f foo.c foo ++ if test "$GCL_GPROF_START" != "" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCL_GPROF_START" >&5 + $as_echo "$GCL_GPROF_START" >&6; } + + cat >>confdefs.h <<_ACEOF + #define GCL_GPROF_START $GCL_GPROF_START + _ACEOF + +- case "$use" in +- arm*) +- #FIXME report and remove this when done +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Reducing optimization on profiling arm build to workaround gcc bug" >&5 +-$as_echo "Reducing optimization on profiling arm build to workaround gcc bug" >&6; } +- enable_debug=yes;; +- esac +- TCFLAGS="$TCFLAGS -pg"; +- case $use in +- s390*) ;; # relocation truncation bug in gcc +- *) TLIBS="$TLIBS -pg";; +- esac +- TFPFLAG="" ++ assert_arg_to_tcflags -pg ++ case $use in ++ s390*) ;; # relocation truncation bug in gcc ++ *) TLIBS="$TLIBS -pg";; ++ esac ++ TFPFLAG="" + + $as_echo "#define GCL_GPROF 1" >>confdefs.h + +- else +- enable_gprof="no"; +- fi +-fi +- +-if $CC -v 2>&1 | tail -1 | grep "gcc version 4.6.1" >/dev/null ; then +- case "$use" in +- arm*) +- #FIXME report and remove this when done +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Reducing optimization on arm build to workaround gcc 4.6 bug" >&5 +-$as_echo "Reducing optimization on arm build to workaround gcc 4.6 bug" >&6; } +- enable_debug=yes;; +- esac ++ fi ++ fi ++ fi + fi + + + if test "$enable_debug" = "yes" ; then +- TCFLAGS="$TCFLAGS -g" +- # for subconfigurations +- CFLAGS="$CFLAGS -g" ++ assert_arg_to_tcflags -g ++ # for subconfigurations ++ CFLAGS="$CFLAGS -g" + else +- TO3FLAGS="-O3 $TFPFLAG" +- TO2FLAGS="-O" ++ TO3FLAGS="-O3 $TFPFLAG" ++ TO2FLAGS="-O" + fi + + # gcc on ppc cannot compile our new_init.c with full opts --CM + TONIFLAGS="" + case $use in +- powerpc*macosx) +- TCFLAGS="$TCFLAGS -mlongcall";; +- *linux) ++ powerpc*macosx) assert_arg_to_tcflags -mlongcall;; ++ *linux) + case $use in +-# amd64*) # stack-boundary option does not work +-# TCFLAGS="$TCFLAGS -m64 -mpreferred-stack-boundary=8";; +- alpha*) +- TCFLAGS="$TCFLAGS -mieee" +- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1 +- ;; +-# m68k*) +-# TCFLAGS="$TCFLAGS -ffloat-store";; +- aarch64*) +- TLIBS="$TLIBS -lgcc_s";; +- hppa*) +- TCFLAGS="$TCFLAGS -mlong-calls " +- TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags +- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O2" ; TFPFLAG=""; fi #FIXME needed asof gcc 4.8.1 +-# TCFLAGS="$TCFLAGS -ffunction-sections" +-# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O $TFPFLAG" ; fi +-# if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi +- ;; +- mips*) +- case $canonical in +- mips64*linux*) +- TLIBS="$TLIBS -Wl,-z -Wl,now";; +- esac +-# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 +- ;; +- ia64*) +- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 +- ;; +- arm*) +- TCFLAGS="$TCFLAGS -mlong-calls -fdollars-in-identifiers -g " +-# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.6.2 +-# if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi +- ;; +- powerpc*) +- TCFLAGS="$TCFLAGS -mlongcall" +- ;; +-# if $CC -v 2>&1 | grep -q "gcc version 3.2" ; then +-# echo Reducing optimization for buggy gcc-3.2 +-# if test "$enable_debug" != "yes" ; then TONIFLAGS="-O $TFPFLAG" ; fi +-# fi; +-# echo Probing for longcall +-# if ! $CC -v 2>&1 | $AWK '/^gcc version / {split($3,A,".");if (A[[1]]+0>3 || (A[[1]]+0>=3 && A[[2]]+0>=3)) exit 1;}'; then +-# echo Enabling longcall on gcc 3.3 or later +-# TCFLAGS="$TCFLAGS -mlongcall" +-# echo Reducing optimization for buggy gcc 3.3 or later +-# if test "$enable_debug" != "yes" ; then TONIFLAGS="-O $TFPFLAG" ; fi +-# fi;; ++ alpha*) ++ assert_arg_to_tcflags -mieee ++ if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1 ++ ;; ++ aarch64*) ++ TLIBS="$TLIBS -lgcc_s";; ++ hppa*) ++ assert_arg_to_tcflags -mlong-calls ++ TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags ++ if test "$enable_debug" != "yes" ; then TO3FLAGS="-O2" ; TFPFLAG=""; fi #FIXME needed asof gcc 4.8.1 ++ ;; ++ mips*) ++ case $canonical in ++ mips64*linux*) ++ assert_arg_to_tldflags -Wl,-z,now;; ++ esac ++ ;; ++ ia64*) ++ if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 ++ ;; ++ arm*) ++ assert_arg_to_tcflags -mlong-calls ++ assert_arg_to_tcflags -fdollars-in-identifiers ++ assert_arg_to_tcflags -g #? ++ ;; ++ powerpc*) ++ assert_arg_to_tcflags -mlongcall ++ ;; + esac;; + esac + if test "$enable_pic" = "yes" ; then +- TCFLAGS="$TCFLAGS -fPIC" ++ assert_arg_to_tcflags -fPIC + fi + ++ + FDEBUG=`echo $CFLAGS | tr ' ' '\012' |grep "^\-g$"|tr '\012' ' '` + #CFLAGS=`echo $CFLAGS | tr ' ' '\012' |grep -v "^\-g$"` + FOMITF=`echo $CFLAGS | tr ' ' '\012' |grep "^\-fomit-frame-pointer$"|tr '\012' ' '` +@@ -4488,27 +4229,27 @@ FOOPT0=`echo $CFLAGS | tr ' ' '\012' |gr + CFLAGS=`echo $CFLAGS | tr ' ' '\012' |grep -v "^\-O0$"|tr '\012' ' '` + + if test "$FOOPT0" != "" ; then +- TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[123 ],-O0 ,g' | sed 's,\-O$,-O0 ,g'` +- TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[123 ],-O0 ,g' | sed 's,\-O$,-O0 ,g'` ++ TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[123 ],-O0 ,g' | sed 's,\-O$,-O0 ,g'` ++ TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[123 ],-O0 ,g' | sed 's,\-O$,-O0 ,g'` + else +-if test "$FOOPT1" != "" ; then +- TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[2-3],-O1,g'` +- TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[2-3],-O1,g'` +-else +-if test "$FOOPT2" != "" ; then +- TO3FLAGS=`echo "$TO3FLAGS" | sed 's,\-O3,-O2,g'` +- TO2FLAGS=`echo "$TO2FLAGS" | sed 's,\-O3,-O2,g'` +-fi +-fi ++ if test "$FOOPT1" != "" ; then ++ TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[2-3],-O1,g'` ++ TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[2-3],-O1,g'` ++ else ++ if test "$FOOPT2" != "" ; then ++ TO3FLAGS=`echo "$TO3FLAGS" | sed 's,\-O3,-O2,g'` ++ TO2FLAGS=`echo "$TO2FLAGS" | sed 's,\-O3,-O2,g'` ++ fi ++ fi + fi + + if test "$FDEBUG" != "" ; then +- TO3FLAGS=`echo $TO3FLAGS | sed 's,\-fomit-frame-pointer,,g'` +- TO2FLAGS=`echo $TO2FLAGS | sed 's,\-fomit-frame-pointer,,g'` ++ TO3FLAGS=`echo $TO3FLAGS | sed 's,\-fomit-frame-pointer,,g'` ++ TO2FLAGS=`echo $TO2FLAGS | sed 's,\-fomit-frame-pointer,,g'` + fi + + if test "$FOMITF" != "" ; then +- TO3FLAGS="$TO3FLAGS $FOMITF" ++ TO3FLAGS="$TO3FLAGS $FOMITF" + fi + + # Step 1: set the variable "system" to hold the name and version number +@@ -4569,8 +4310,8 @@ if test -f /usr/lib/NextStep/software_ve + else + system=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown (can't find uname command)" >&5 +-$as_echo "unknown (can't find uname command)" >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown (cannot find uname command)" >&5 ++$as_echo "unknown (cannot find uname command)" >&6; } + system=unknown + else + # Special check for weird MP-RAS system (uname returns weird +@@ -4588,7 +4329,7 @@ $as_echo "$system" >&6; } + fi + + case $use in +- *macosx) ++ *macosx) + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 + $as_echo_n "checking for grep that handles long lines and -e... " >&6; } +@@ -4864,7 +4605,7 @@ fi + done + + ac_fn_c_check_member "$LINENO" "struct _malloc_zone_t" "memalign" "ac_cv_member_struct__malloc_zone_t_memalign" " +- #include ++ #include + + " + if test "x$ac_cv_member_struct__malloc_zone_t_memalign" = xyes; then : +@@ -4877,7 +4618,6 @@ fi + ;; + esac + +- + for ac_header in setjmp.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "setjmp.h" "ac_cv_header_setjmp_h" "$ac_includes_default" +@@ -4887,7 +4627,7 @@ if test "x$ac_cv_header_setjmp_h" = xyes + _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof jmp_buf" >&5 + $as_echo_n "checking sizeof jmp_buf... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -4896,19 +4636,24 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + ++ #include ++ #include + +- #include +- #include +- int main() { +- FILE *fp=fopen("conftest1","w"); +- fprintf(fp,"%lu\n",sizeof(jmp_buf)); +- fclose(fp); +- return 0; +- } ++int ++main () ++{ ++ ++ FILE *fp=fopen("conftest1","w"); ++ fprintf(fp,"%lu\n",sizeof(jmp_buf)); ++ fclose(fp); ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + sizeof_jmp_buf=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_jmp_buf" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_jmp_buf" >&5 + $as_echo "$sizeof_jmp_buf" >&6; } + + cat >>confdefs.h <<_ACEOF +@@ -4929,7 +4674,6 @@ done + + + # sysconf +- + for ac_header in unistd.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +@@ -4944,52 +4688,6 @@ if ${ac_cv_lib_c_sysconf+:} false; then + else + ac_check_lib_save_LIBS=$LIBS + LIBS="-lc $LIBS" +- +-# ac_fn_c_try_link LINENO +-# ----------------------- +-# Try to link conftest.$ac_ext, and return whether this succeeded. +-ac_fn_c_try_link () +-{ +- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack +- rm -f conftest.$ac_objext conftest$ac_exeext +- if { { ac_try="$ac_link" +-case "(($ac_try" in +- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; +- *) ac_try_echo=$ac_try;; +-esac +-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +-$as_echo "$ac_try_echo"; } >&5 +- (eval "$ac_link") 2>conftest.err +- ac_status=$? +- if test -s conftest.err; then +- grep -v '^ *+' conftest.err >conftest.er1 +- cat conftest.er1 >&5 +- mv -f conftest.er1 conftest.err +- fi +- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 +- test $ac_status = 0; } && { +- test -z "$ac_c_werror_flag" || +- test ! -s conftest.err +- } && test -s conftest$ac_exeext && { +- test "$cross_compiling" = yes || +- test -x conftest$ac_exeext +- }; then : +- ac_retval=0 +-else +- $as_echo "$as_me: failed program was:" >&5 +-sed 's/^/| /' conftest.$ac_ext >&5 +- +- ac_retval=1 +-fi +- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information +- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would +- # interfere with the next link command; also delete a directory that is +- # left behind by Apple's compiler. We do this before executing the actions. +- rm -rf conftest.dSYM conftest_ipa8_conftest.oo +- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno +- as_fn_set_status $ac_retval +- +-} # ac_fn_c_try_link + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5022,39 +4720,40 @@ $as_echo "$ac_cv_lib_c_sysconf" >&6; } + if test "x$ac_cv_lib_c_sysconf" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking _SC_CLK_TCK" >&5 + $as_echo_n "checking _SC_CLK_TCK... " >&6; } +- if test "$cross_compiling" = yes; then : +- hz=0 ++ hz=0 ++ if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- #include +- int +- main() { +- FILE *fp=fopen("conftest1","w"); +- fprintf(fp,"%lu\n",sysconf(_SC_CLK_TCK)); +- fclose(fp); +- return 0; +- } +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- hz=`cat conftest1` + +-cat >>confdefs.h <<_ACEOF +-#define HZ $hz +-_ACEOF ++ #include ++ #include + ++int ++main () ++{ ++ ++ FILE *fp=fopen("conftest1","w"); ++ fprintf(fp,"%lu\n",sysconf(_SC_CLK_TCK)); ++ fclose(fp); ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : + +-else +- hz=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hz" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hz" >&5 + $as_echo "$hz" >&6; } +- + fi + + fi +@@ -5063,20 +4762,16 @@ done + + + +-#MY_SUBDIRS= +- +-# +-# GMP +-# +- + rm -f makedefsafter + +-MP_INCLUDE="" +-if test $use_gmp = yes ; then ++# Check whether --enable-dynsysgmp was given. ++if test "${enable_dynsysgmp+set}" = set; then : ++ enableval=$enable_dynsysgmp; ++fi ++ + +- PATCHED_SYMBOLS="" +- if test "$enable_dynsysgmp" = "yes" ; then +- for ac_header in gmp.h ++if test "$enable_dynsysgmp" != "no" ; then ++ for ac_header in gmp.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default" + if test "x$ac_cv_header_gmp_h" = xyes; then : +@@ -5120,100 +4815,97 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_init" >&5 + $as_echo "$ac_cv_lib_gmp___gmpz_init" >&6; } + if test "x$ac_cv_lib_gmp___gmpz_init" = xyes; then : +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking \"for external gmp version\"" >&5 +-$as_echo_n "checking \"for external gmp version\"... " >&6; } +- if test "$cross_compiling" = yes; then : +- echo "Cannot use dynamic gmp lib" ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for external gmp version" >&5 ++$as_echo_n "checking for external gmp version... " >&6; } ++ if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- int main() { +- #if __GNU_MP_VERSION > 3 +- return 0; +- #else +- return -1; +- #endif +- } ++ ++ #include ++ ++int ++main () ++{ ++ ++ #if __GNU_MP_VERSION > 3 ++ return 0; ++ #else ++ return -1; ++ #endif ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +- # MPFILES=$GMPDIR/mpn/mul_n.o +-# PATCHED_SYMBOLS=__gmpn_toom3_mul_n +- MPFILES= +- PATCHED_SYMBOLS= +-# if test "$use" = "m68k-linux" ; then +-# MPFILES="$MPFILES $GMPDIR/mpn/lshift.o $GMPDIR/mpn/rshift.o" +-# PATCHED_SYMBOLS="$PATCHED_SYMBOLS __gmpn_lshift __gmpn_rshift" +-# fi +- TLIBS="$TLIBS -lgmp" +- echo "#include \"gmp.h\"" >foo.c +- echo "int main() {return 0;}" >>foo.c +- MP_INCLUDE=`cpp foo.c | $AWK '/(\/|\\\\)gmp.h/ {if (!i) print $3;i=1}' | tr -d '"'` +- rm -f foo.c +-else +- echo "Cannot use dynamic gmp lib" ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: good" >&5 ++$as_echo "good" >&6; } ++ TLIBS="$TLIBS -lgmp" ++ echo "#include \"gmp.h\"" >foo.c ++ echo "int main() {return 0;}" >>foo.c ++ MP_INCLUDE=`cpp foo.c | $AWK '/(\/|\\\\)gmp.h/ {if (!i) print $3;i=1}' | tr -d '"'` ++ rm -f foo.c + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-else +- echo "Cannot use dynamic gmp lib" + fi + +-else +- echo "Cannot use dynamic gmp lib" + fi + + done + ++ ++ if test "$MP_INCLUDE" = "" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cannot use dynamic gmp lib" >&5 ++$as_echo "Cannot use dynamic gmp lib" >&6; } ++ fi ++ + fi + +-NEED_LOCAL_GMP='' ++ + if test "$MP_INCLUDE" = "" ; then +- NEED_LOCAL_GMP=1; +-fi +-if test "$PATCHED_SYMBOLS" != "" ; then +- NEED_LOCAL_GMP=1; +-fi + +-if test "$NEED_LOCAL_GMP" != "" ; then ++ GMPDIR=gmp4 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking doing configure in gmp directory" >&5 ++$as_echo_n "checking doing configure in gmp directory... " >&6; } ++ echo ++ echo "#" ++ echo "#" ++ echo "# -------------------" ++ echo "# Subconfigure of GMP" ++ echo "#" ++ echo "#" + +- GMPDIR=gmp4 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking use_gmp=yes, doing configure in gmp directory" >&5 +-$as_echo_n "checking use_gmp=yes, doing configure in gmp directory... " >&6; } +- echo +- echo "#" +- echo "#" +- echo "# -------------------" +- echo "# Subconfigure of GMP" +- echo "#" +- echo "#" +- +- if test "$use_common_binary" = "yes"; then +- cd $GMPDIR && ./configure --build=$host && cd .. +- else +- cd $GMPDIR && ./configure && cd .. +- fi +- #MY_SUBDIRS="$MY_SUBDIRS $GMPDIR" +- +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of GMP done" +- echo "# ------------------------" +- echo "#" +- +- if test "$MP_INCLUDE" = "" ; then +- cp $GMPDIR/gmp.h h/gmp.h +- MP_INCLUDE=h/gmp.h +- MPFILES=gmp_all +- fi ++ if test "$use_common_binary" = "yes"; then ++ cd $GMPDIR && ./configure --build=$host && cd .. ++ else ++ cd $GMPDIR && ./configure --host=$host --build=$build && cd .. ++ fi ++ #MY_SUBDIRS="$MY_SUBDIRS $GMPDIR" + ++ echo "#" ++ echo "#" ++ echo "#" ++ echo "# Subconfigure of GMP done" ++ echo "# ------------------------" ++ echo "#" ++ ++ if test "$MP_INCLUDE" = "" ; then ++ cp $GMPDIR/gmp.h h/gmp.h ++ MP_INCLUDE=h/gmp.h ++ MPFILES=gmp_all ++ fi + fi + +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking \"for leading underscore in object symbols\"" >&5 +-$as_echo_n "checking \"for leading underscore in object symbols\"... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for leading underscore in object symbols" >&5 ++$as_echo_n "checking for leading underscore in object symbols... " >&6; } + cat>foo.c < + #include +@@ -5221,15 +4913,15 @@ int main() {FILE *f;double d=0.0;getc(f) + EOFF + $CC -c foo.c -o foo.o + if nm foo.o |grep " U " | grep "_cos" >/dev/null || nm foo.o |grep " U " | grep " _getc" >/dev/null ; then +- LEADING_UNDERSCORE=1 ++ LEADING_UNDERSCORE=1 + + $as_echo "#define LEADING_UNDERSCORE 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 + $as_echo "\"yes\"" >&6; } + else +- LEADING_UNDERSCORE="" +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 ++ LEADING_UNDERSCORE="" ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 + $as_echo "\"no\"" >&6; } + fi + +@@ -5239,16 +4931,16 @@ $as_echo_n "checking \"for GNU ld option + touch map + $CC -o foo -Wl,-Map map foo.o >/dev/null 2>&1 + if test `cat map | wc -l` != "0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"yes\"" >&5 + $as_echo "\"yes\"" >&6; } + + $as_echo "#define HAVE_GNU_LD 1" >>confdefs.h + +- GNU_LD=1 ++ GNU_LD=1 + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"no\"" >&5 + $as_echo "\"no\"" >&6; } +- GNU_LD= ++ GNU_LD= + fi + rm -f foo.c foo.o foo map + +@@ -5263,17 +4955,16 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include "$MP_INCLUDE" ++ #include ++ #include "$MP_INCLUDE" + + int + main () + { + +- FILE *fp=fopen("conftest1","w"); +- fprintf(fp,"%u",sizeof(mp_limb_t)); +- fclose(fp); +- return 0; ++ FILE *fp=fopen("conftest1","w"); ++ fprintf(fp,"%u",sizeof(mp_limb_t)); ++ fclose(fp); + + ; + return 0; +@@ -5307,18 +4998,18 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include "$MP_INCLUDE" ++ #include ++ #include "$MP_INCLUDE" + + int + main () + { + +- #ifdef _SHORT_LIMB +- return 0; +- #else +- return 1; +- #endif ++ #ifdef _SHORT_LIMB ++ return 0; ++ #else ++ return 1; ++ #endif + + ; + return 0; +@@ -5349,18 +5040,18 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include "$MP_INCLUDE" ++ #include ++ #include "$MP_INCLUDE" + + int + main () + { + +- #ifdef _LONG_LONG_LIMB +- return 0; +- #else +- return 1; +- #endif ++ #ifdef _LONG_LONG_LIMB ++ return 0; ++ #else ++ return 1; ++ #endif + + ; + return 0; +@@ -5380,17 +5071,17 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- GMP=1 ++GMP=1 + + $as_echo "#define GMP 1" >>confdefs.h + + + +- echo > makedefsafter +- echo "MPFILES=$MPFILES" >> makedefsafter +- echo "PATCHED_SYMBOLS=$PATCHED_SYMBOLS" >> makedefsafter +- echo >> makedefsafter +-fi ++echo > makedefsafter ++echo "MPFILES=$MPFILES" >> makedefsafter ++echo "PATCHED_SYMBOLS=$PATCHED_SYMBOLS" >> makedefsafter ++echo >> makedefsafter ++ + + + # +@@ -5399,7 +5090,7 @@ fi + + if test "$enable_xgcl" = "yes" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 + $as_echo_n "checking for X... " >&6; } + + +@@ -5592,24 +5283,14 @@ else + $as_echo "libraries $x_libraries, headers $x_includes" >&6; } + fi + +-# AC_PATH_XTRA +-# echo $X_CFLAGS +-# echo $X_LIBS +-# echo $X_EXTRA_LIBS +-# echo $X_PRE_LIBS +- +- miss=0 +-# AC_CHECK_LIB(Xmu,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS)#FIXME remove these +-# AC_CHECK_LIB(Xt,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS) +-# AC_CHECK_LIB(Xext,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS) +-# AC_CHECK_LIB(Xaw,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS)#until here +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 + $as_echo_n "checking for main in -lX11... " >&6; } + if ${ac_cv_lib_X11_main+:} false; then : + $as_echo_n "(cached) " >&6 + else + ac_check_lib_save_LIBS=$LIBS +-LIBS="-lX11 $X_LIBS $LIBS" ++LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +@@ -5635,22 +5316,14 @@ fi + $as_echo "$ac_cv_lib_X11_main" >&6; } + if test "x$ac_cv_lib_X11_main" = xyes; then : + X_LIBS="$X_LIBS -lX11" ++$as_echo "#define HAVE_XGCL 1" >>confdefs.h ++ + else +- miss=1 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: missing x libraries -- cannot compile xgcl" >&5 ++$as_echo "missing x libraries -- cannot compile xgcl" >&6; } + fi + + +- if test "$miss" = "1" ; then +- X_CFLAGS= +- X_LIBS= +- X_EXTRA_LIBS= +- X_PRE_LIBS= +- echo missing x libraries -- cannot compile xgcl +- else +- +-$as_echo "#define HAVE_XGCL 1" >>confdefs.h +- +- fi + fi + + +@@ -5663,7 +5336,7 @@ fi + + if test "$enable_dlopen" = "yes" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + $as_echo_n "checking for dlopen in -ldl... " >&6; } + if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -5700,25 +5373,27 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 + $as_echo "$ac_cv_lib_dl_dlopen" >&6; } + if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +- have_dl=1 ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_LIBDL 1 ++_ACEOF ++ ++ LIBS="-ldl $LIBS" ++ + else +- have_dl=0 ++ as_fn_error $? "Cannot find dlopen" "$LINENO" 5 + fi + +- if test "$have_dl" = "0" ; then +- echo "Cannot find dlopen in -dl" +- exit 1 +- fi + +- TLIBS="$TLIBS -ldl -rdynamic" +- TCFLAGS="-fPIC $TCFLAGS" ++ TLIBS="$TLIBS -ldl -rdynamic" ++ assert_arg_to_tcflags -fPIC + + $as_echo "#define USE_DLOPEN 1" >>confdefs.h + ++ + fi + + if test "$enable_statsysbfd" = "yes" || test "$enable_dynsysbfd" = "yes" ; then +- for ac_header in bfd.h ++ for ac_header in bfd.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "bfd.h" "ac_cv_header_bfd_h" "$ac_includes_default" + if test "x$ac_cv_header_bfd_h" = xyes; then : +@@ -5763,18 +5438,28 @@ fi + $as_echo "$ac_cv_lib_bfd_bfd_init" >&6; } + if test "x$ac_cv_lib_bfd_bfd_init" = xyes; then : + # +- # Old binutils appear to need CONST defined to const +- # +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if need to define CONST for bfd" >&5 +-$as_echo_n "checking if need to define CONST for bfd... " >&6; } +- if test "$cross_compiling" = yes; then : ++ # Old binutils appear to need CONST defined to const ++ # ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking need to define CONST for bfd" >&5 ++$as_echo_n "checking need to define CONST for bfd... " >&6; } ++ if test "$cross_compiling" = yes; then : + as_fn_error $? "cannot use bfd" "$LINENO" 5 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#define IN_GCC +- #include +- int main() { symbol_info t; return 0;} ++ ++ #define IN_GCC ++ #include ++ ++int ++main () ++{ ++ ++ symbol_info t; ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -5785,10 +5470,20 @@ else + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#define CONST const +- #define IN_GCC +- #include +- int main() {symbol_info t; return 0;} ++ ++ #define CONST const ++ #define IN_GCC ++ #include ++ ++int ++main () ++{ ++ ++ symbol_info t; ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +@@ -5820,13 +5515,13 @@ done + $as_echo "#define HAVE_LIBBFD 1" >>confdefs.h + + +-# +-# BFD boolean syntax +-# ++ # ++ # BFD boolean syntax ++ # + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for useable bfd_boolean" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for useable bfd_boolean" >&5 + $as_echo_n "checking for useable bfd_boolean... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -5835,14 +5530,14 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #define IN_GCC +- #include +- bfd_boolean foo() {return FALSE;} ++ #define IN_GCC ++ #include ++ bfd_boolean foo() {return FALSE;} + + int + main () + { +-return 0; ++ + ; + return 0; + } +@@ -5862,13 +5557,13 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +-# +-# bfd_link_info.output_bfd minimal configure change check +-# +- +- ac_fn_c_check_member "$LINENO" "struct bfd_link_info" "output_bfd" "ac_cv_member_struct_bfd_link_info_output_bfd" " +- #include +- #include ++ # ++ # bfd_link_info.output_bfd minimal configure change check ++ # ++ ++ ac_fn_c_check_member "$LINENO" "struct bfd_link_info" "output_bfd" "ac_cv_member_struct_bfd_link_info_output_bfd" " ++ #include ++ #include + + " + if test "x$ac_cv_member_struct_bfd_link_info_output_bfd" = xyes; then : +@@ -5879,25 +5574,25 @@ fi + + + +-# +-# FIXME: Need to workaround mingw before this point -- CM +-# +- if test "$enable_statsysbfd" = "yes" && ! $CC -v 2>&1 | fgrep ming > /dev/null ; then +- echo 'int main() {bfd_init();bfd_openr("/dev/null",0);return 0;}' >foo.c +- MP=`$CC -Wl,-M -static -o foo foo.c -lbfd -liberty -ldl 2>&1 | grep -v : | tr '()' '\012\012' | $AWK '{print $NF}' | sort | uniq` +- rm -f foo.c foo +- if echo $MP | tr ' ' '\012' | grep libbfd.a >/dev/null; then +- LIBBFD="`echo $MP | tr ' ' '\012' | grep libbfd.a | $AWK '{i=split($1,A,"/");for (j=1;j<=i;j++) if (j>1 && A[j]=="..") {j--;i-=2;for (k=j;k<=i;k++) A[k]=A[k+2];j--;}} END {for (j=1;j<=i;j++) printf("%s%s",A[j],j!=i ? "/" : "")}'`" +- else +- as_fn_error $? "cannot locate external libbfd.a" "$LINENO" 5 +- fi +- if echo $MP | tr ' ' '\012' | grep libiberty.a >/dev/null ; then +- LIBIBERTY="`echo $MP | tr ' ' '\012' | grep libiberty.a | $AWK '{i=split($1,A,"/");for (j=1;j<=i;j++) if (j>1 && A[j]=="..") {j--;i-=2;for (k=j;k<=i;k++) A[k]=A[k+2];j--;}} END {for (j=1;j<=i;j++) printf("%s%s",A[j],j!=i ? "/" : "")}'`" +- else +- as_fn_error $? "cannot locate external libiberty.a" "$LINENO" 5 +- fi +- BUILD_BFD=copy_bfd +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 ++ # ++ # FIXME: Need to workaround mingw before this point -- CM ++ # ++ if test "$enable_statsysbfd" = "yes" && ! $CC -v 2>&1 | fgrep ming > /dev/null ; then ++ echo 'int main() {bfd_init();bfd_openr("/dev/null",0);return 0;}' >foo.c ++ MP=`$CC -Wl,-M -static -o foo foo.c -lbfd -liberty -ldl 2>&1 | grep -v : | tr '()' '\012\012' | $AWK '{print $NF}' | sort | uniq` ++ rm -f foo.c foo ++ if echo $MP | tr ' ' '\012' | grep libbfd.a >/dev/null; then ++ LIBBFD="`echo $MP | tr ' ' '\012' | grep libbfd.a | $AWK '{i=split($1,A,\"/\");for (j=1;j<=i;j++) if (j>1 && A[j]==\"..\") {j--;i-=2;for (k=j;k<=i;k++) A[k]=A[k+2];j--;}} END {for (j=1;j<=i;j++) printf(\"%s%s\",A[j],j!=i ? \"/\" : \"\")}'`" ++ else ++ as_fn_error $? "cannot locate external libbfd.a" "$LINENO" 5 ++ fi ++ if echo $MP | tr ' ' '\012' | grep libiberty.a >/dev/null ; then ++ LIBIBERTY="`echo $MP | tr ' ' '\012' | grep libiberty.a | $AWK '{i=split($1,A,\"/\");for (j=1;j<=i;j++) if (j>1 && A[j]==\"..\") {j--;i-=2;for (k=j;k<=i;k++) A[k]=A[k+2];j--;}} END {for (j=1;j<=i;j++) printf(\"%s%s\",A[j],j!=i ? \"/\" : \"\")}'`" ++ else ++ as_fn_error $? "cannot locate external libiberty.a" "$LINENO" 5 ++ fi ++ BUILD_BFD=copy_bfd ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5 + $as_echo_n "checking for inflate in -lz... " >&6; } + if ${ac_cv_lib_z_inflate+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -5939,7 +5634,7 @@ else + as_fn_error $? "Need zlib for bfd linking" "$LINENO" 5 + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 + $as_echo_n "checking for dlsym in -ldl... " >&6; } + if ${ac_cv_lib_dl_dlsym+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -5985,76 +5680,22 @@ fi + + + +- else +- TLIBS="$TLIBS -lbfd -liberty -ldl" +- fi ++ else ++ TLIBS="$TLIBS -lbfd -liberty -ldl" ++ fi + fi + +-if test "$enable_locbfd" = "yes" ; then +- +- # check for gettext. It is part of glibc, but others +- # need GNU gettext separately. +-# AC_CHECK_HEADERS(libintl.h, true, +-# AC_MSG_ERROR(libintl.h (gettext) not found)) +-# AC_SEARCH_LIBS(dgettext, intl, true, AC_MSG_ERROR(gettext library not found)) +- +- echo "#" +- echo "#" +- echo "# -------------------------" +- echo "# Subconfigure of LIBINTL" +- echo "#" +- echo "#" +- cd binutils/intl && chmod +x configure && ./configure --disable-nls && cd ../.. +-# MY_SUBDIRS="$MY_SUBDIRS binutils/libiberty " +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of LIBINTL done" +- echo "# ------------------------------" +- echo "#" +- echo "#" +- echo "#" +- echo "# -------------------------" +- echo "# Subconfigure of LIBIBERTY" +- echo "#" +- echo "#" +- cd binutils/libiberty && chmod +x configure && ./configure --disable-nls && cd ../.. +-# MY_SUBDIRS="$MY_SUBDIRS binutils/libiberty " +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of LIBIBERTY done" +- echo "# ------------------------------" +- echo "#" +- echo "#" +- echo "#" +- echo "# -------------------" +- echo "# Subconfigure of BFD" +- echo "#" +- echo "#" +- cd binutils/bfd && chmod +x configure && ./configure --with-included-gettext --disable-nls && cd ../.. +-# MY_SUBDIRS="$MY_SUBDIRS binutils/bfd " +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of BFD done" +- echo "# ------------------------" +- echo "#" +-# TLIBS="$TLIBS `pwd`/binutils/bfd/libbfd.a `pwd`/binutils/libiberty/libiberty.a" +- +-$as_echo "#define HAVE_LIBBFD 1" >>confdefs.h +- +- BUILD_BFD="h/bfd.h h/bfdlink.h h/ansidecl.h h/symcat.h" +- ++# Check whether --enable-xdr was given. ++if test "${enable_xdr+set}" = set; then : ++ enableval=$enable_xdr; + fi + + +-if test "$enable_xdr" = "yes" ; then +- ac_fn_c_check_func "$LINENO" "xdr_double" "ac_cv_func_xdr_double" ++if test "$enable_xdr" != "no" ; then ++ XDR_LIB="" ++ ac_fn_c_check_func "$LINENO" "xdr_double" "ac_cv_func_xdr_double" + if test "x$ac_cv_func_xdr_double" = xyes; then : +- +-$as_echo "#define HAVE_XDR 1" >>confdefs.h +- ++ XDR_LIB=" " + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -ltirpc" >&5 + $as_echo_n "checking for xdr_double in -ltirpc... " >&6; } +@@ -6093,10 +5734,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tirpc_xdr_double" >&5 + $as_echo "$ac_cv_lib_tirpc_xdr_double" >&6; } + if test "x$ac_cv_lib_tirpc_xdr_double" = xyes; then : +- +-$as_echo "#define HAVE_XDR 1" >>confdefs.h +- +- TLIBS="$TLIBS -ltirpc" TCFLAGS="$TCFLAGS -I/usr/include/tirpc" ++ XDR_LIB=tirpc + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lgssrpc" >&5 + $as_echo_n "checking for xdr_double in -lgssrpc... " >&6; } +@@ -6135,10 +5773,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssrpc_xdr_double" >&5 + $as_echo "$ac_cv_lib_gssrpc_xdr_double" >&6; } + if test "x$ac_cv_lib_gssrpc_xdr_double" = xyes; then : +- +-$as_echo "#define HAVE_XDR 1" >>confdefs.h +- +- TLIBS="$TLIBS -lgssrpc" TCFLAGS="$TCFLAGS -I/usr/include/gssrpc" ++ XDR_LIB=gssrpc + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -lrpc" >&5 + $as_echo_n "checking for xdr_double in -lrpc... " >&6; } +@@ -6177,10 +5812,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rpc_xdr_double" >&5 + $as_echo "$ac_cv_lib_rpc_xdr_double" >&6; } + if test "x$ac_cv_lib_rpc_xdr_double" = xyes; then : +- +-$as_echo "#define HAVE_XDR 1" >>confdefs.h +- +- TLIBS="$TLIBS -lrpc" TCFLAGS="$TCFLAGS -I/usr/include/rpc" ++ XDR_LIB=rpc + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xdr_double in -loncrpc" >&5 + $as_echo_n "checking for xdr_double in -loncrpc... " >&6; } +@@ -6219,10 +5851,7 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_oncrpc_xdr_double" >&5 + $as_echo "$ac_cv_lib_oncrpc_xdr_double" >&6; } + if test "x$ac_cv_lib_oncrpc_xdr_double" = xyes; then : +- +-$as_echo "#define HAVE_XDR 1" >>confdefs.h +- +- TLIBS="$TLIBS -loncrpc" TCFLAGS="$TCFLAGS -I/usr/include/oncrpc" ++ XDR_LIB=oncrpc + fi + + fi +@@ -6233,6 +5862,16 @@ fi + + fi + ++ ++ if test "$XDR_LIB" != ""; then ++ ++$as_echo "#define HAVE_XDR 1" >>confdefs.h ++ ++ if test "$XDR_LIB" != " "; then ++ TLIBS="$TLIBS -l$XDR_LIB" ++ add_arg_to_tcflags -I/usr/include/$XDR_LIB ++ fi ++ fi + fi + + +@@ -6247,18 +5886,24 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- int main() { +- unsigned long u; +- long j; +- if (__builtin_clzl(0)!=sizeof(long)*8) +- return -1; +- for (u=1,j=sizeof(long)*8-1;j>=0;j--,u<<=1) +- if (__builtin_clzl(u)!=j) +- return -1; +- return 0; +- } ++ #include ++ #include ++ ++int ++main () ++{ ++ ++ unsigned long u; ++ long j; ++ if (__builtin_clzl(0)!=sizeof(long)*8) ++ return -1; ++ for (u=1,j=sizeof(long)*8-1;j>=0;j--,u<<=1) ++ if (__builtin_clzl(u)!=j) ++ return -1; ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +@@ -6286,18 +5931,24 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- int main() { +- unsigned long u; +- long j; +- if (__builtin_ctzl(0)!=sizeof(long)*8) +- return -1; +- for (u=1,j=0;j ++ #include ++ ++int ++main () ++{ ++ ++ unsigned long u; ++ long j; ++ if (__builtin_ctzl(0)!=sizeof(long)*8) ++ return -1; ++ for (u=1,j=0;j&5 +@@ -6316,13 +5967,13 @@ fi + + + case $use in +- sh4*) ;; #FIXME, these exceptions needed as of gcc 4.7 +- hppa*) ;; #FIXME +- powerpc*) ;; #FIXME +- alpha*) ;; #FIXME +- ia64*) ;; #FIXME +- *) +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking __builtin___clear_cache" >&5 ++ sh4*) ;; #FIXME, these exceptions needed as of gcc 4.7 ++ hppa*) ;; #FIXME ++ powerpc*) ;; #FIXME ++ alpha*) ;; #FIXME ++ ia64*) ;; #FIXME ++ *) ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking __builtin___clear_cache" >&5 + $as_echo_n "checking __builtin___clear_cache... " >&6; } + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +@@ -6333,7 +5984,6 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- + int + main () + { +@@ -6349,7 +5999,7 @@ if ac_fn_c_try_run "$LINENO"; then : + + $as_echo "#define HAVE_BUILTIN_CLEAR_CACHE 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -6414,13 +6064,10 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- + int + main () + { + +- + /* Are we little or big endian? Adapted from Harbison&Steele. */ + union {long l;char c[sizeof(long)];} u; + u.l = 1; +@@ -6459,8 +6106,6 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- + int + main () + { +@@ -6494,8 +6139,8 @@ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pagewidth" >&5 + $as_echo_n "checking for pagewidth... " >&6; } + case $use in +- mips*) min_pagewidth=14;; +- *) min_pagewidth=12;; ++ mips*) min_pagewidth=14;; ++ *) min_pagewidth=12;; + esac + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +@@ -6506,23 +6151,21 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- #include +- #include +- #ifdef __CYGWIN__ +- #define getpagesize() 4096 +- #endif ++ #include ++ #include ++ #ifdef __CYGWIN__ ++ #define getpagesize() 4096 ++ #endif + + int + main () + { + +- size_t i=getpagesize(),j; +- FILE *fp=fopen("conftest1","w"); +- for (j=0;i>>=1;j++); +- j=j<$min_pagewidth ? $min_pagewidth : j; +- fprintf(fp,"%u",j); +- return 0; ++ size_t i=getpagesize(),j; ++ FILE *fp=fopen("conftest1","w"); ++ for (j=0;i>>=1;j++); ++ j=j<$min_pagewidth ? $min_pagewidth : j; ++ fprintf(fp,"%u",j); + + ; + return 0; +@@ -6557,27 +6200,27 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #define EXTER +- #define INLINE +- #include "$MP_INCLUDE" +- #include "./h/enum.h" +- #define OBJ_ALIGN +- #include "./h/type.h" +- #include "./h/lu.h" +- #include "./h/object.h" ++ #include ++ #define EXTER ++ #define INLINE ++ #include "$MP_INCLUDE" ++ #include "./h/enum.h" ++ #define OBJ_ALIGN ++ #include "./h/type.h" ++ #include "./h/lu.h" ++ #include "./h/object.h" + + int + main () + { + +- unsigned long i; +- FILE *fp=fopen("conftest1","w"); +- for (i=1;i && NOT_OBJECT_ALIGNED(i); i<<=1); +- if (!i) return -1; +- fprintf(fp,"%lu",i); +- fclose(fp); +- return 0; ++ unsigned long i; ++ FILE *fp=fopen("conftest1","w"); ++ for (i=1;i && NOT_OBJECT_ALIGNED(i); i<<=1); ++ if (!i) return -1; ++ fprintf(fp,"%lu",i); ++ fclose(fp); ++ return 0; + + ; + return 0; +@@ -6585,7 +6228,7 @@ main () + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + obj_align=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $obj_align" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $obj_align" >&5 + $as_echo "$obj_align" >&6; } + + cat >>confdefs.h <<_ACEOF +@@ -6615,8 +6258,8 @@ int + main () + { + +- char *v __attribute__ ((aligned ($obj_align))); +- return 0; ++ char *v __attribute__ ((aligned ($obj_align))); ++ + ; + return 0; + } +@@ -6653,8 +6296,8 @@ int + main () + { + +- extern int v() __attribute__ ((noreturn)); +- return 0; ++ extern int v() __attribute__ ((noreturn)); ++ + ; + return 0; + } +@@ -6679,68 +6322,43 @@ _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof struct contblock" >&5 + $as_echo_n "checking sizeof struct contblock... " >&6; } + +-# work around MSYS pwd result incompatibility +-if test "$use" = "mingw" ; then + if test "$cross_compiling" = yes; then : +- echo Cannot find sizeof struct contblock;exit 1 ++ as_fn_error $? "Cannot find sizeof struct contblock" "$LINENO" 5 + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- #define EXTER +- #define INLINE +- #include "$MP_INCLUDE" +- #include "h/enum.h" +- #include "h/type.h" +- #include "h/lu.h" +- #include "h/object.h" +- int main(int argc,char **argv,char **envp) { +- FILE *f=fopen("conftest1","w"); +- fprintf(f,"%u",sizeof(struct contblock)); +- fclose(f); +- return 0; +- } +-_ACEOF +-if ac_fn_c_try_run "$LINENO"; then : +- sizeof_contblock=`cat conftest1` +-else +- echo Cannot find sizeof struct contblock;exit 1 +-fi +-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ +- conftest.$ac_objext conftest.beam conftest.$ac_ext +-fi + +-else +-if test "$cross_compiling" = yes; then : +- echo Cannot find sizeof struct contblock;exit 1 +-else +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +-/* end confdefs.h. */ +-#include +- #define EXTER +- #define INLINE +- #include "$MP_INCLUDE" +- #include "`pwd`/h/enum.h" +- #include "`pwd`/h/type.h" +- #include "`pwd`/h/lu.h" +- #include "`pwd`/h/object.h" +- int main(int argc,char **argv,char **envp) { +- FILE *f=fopen("conftest1","w"); +- fprintf(f,"%u",sizeof(struct contblock)); +- fclose(f); +- return 0; +- } ++ #include ++ #define EXTER ++ #define INLINE ++ #include "$MP_INCLUDE" ++ #include "h/enum.h" ++ #include "h/type.h" ++ #include "h/lu.h" ++ #include "h/object.h" ++ ++int ++main () ++{ ++ ++ FILE *f=fopen("conftest1","w"); ++ fprintf(f,"%u",sizeof(struct contblock)); ++ fclose(f); ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + sizeof_contblock=`cat conftest1` + else +- echo Cannot find sizeof struct contblock;exit 1 ++ as_fn_error $? "Cannot find sizeof struct contblock" "$LINENO" 5 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +-fi ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sizeof_contblock" >&5 + $as_echo "$sizeof_contblock" >&6; } + +@@ -6758,19 +6376,25 @@ $as_echo "no: WARNING you must be able t + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- #include +- int main() { ++ ++ #include ++ #include ++ ++int ++main () ++{ ++ + FILE *f; + if (!(f=fopen("conftest1","w"))) +- return -1; +- fprintf(f,"%u",sbrk(0)); +- return 0; +- } ++ return -1; ++ fprintf(f,"%u",sbrk(0)); ++ ++ ; ++ return 0; ++} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +- HAVE_SBRK=1 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ HAVE_SBRK=1;{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no: WARNING you must be able to emulate sbrk: as on mingw or macosx" >&5 +@@ -6782,16 +6406,16 @@ fi + + + if test "$use" = "386-macosx" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: emulating sbrk for mac" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: emulating sbrk for mac" >&5 + $as_echo "emulating sbrk for mac" >&6; }; +- HAVE_SBRK=0 ++ HAVE_SBRK=0 + fi + + if test "$HAVE_SBRK" = "1" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_NO_RANDOMIZE constant" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_NO_RANDOMIZE constant" >&5 + $as_echo_n "checking for ADDR_NO_RANDOMIZE constant... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -6800,18 +6424,16 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- #include +- #include ++ #include ++ #include + + int + main () + { + +- FILE *f; +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%x",ADDR_NO_RANDOMIZE); +- return 0; ++ FILE *f; ++ if (!(f=fopen("conftest1","w"))) return -1; ++ fprintf(f,"%x",ADDR_NO_RANDOMIZE); + + ; + return 0; +@@ -6819,11 +6441,11 @@ main () + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + ADDR_NO_RANDOMIZE=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_NO_RANDOMIZE" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_NO_RANDOMIZE" >&5 + $as_echo "yes $ADDR_NO_RANDOMIZE" >&6; } + else + ADDR_NO_RANDOMIZE=0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no assuming 0x40000" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no assuming 0x40000" >&5 + $as_echo "no assuming 0x40000" >&6; } + + cat >>confdefs.h <<_ACEOF +@@ -6836,9 +6458,9 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_COMPAT_LAYOUT constant" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_COMPAT_LAYOUT constant" >&5 + $as_echo_n "checking for ADDR_COMPAT_LAYOUT constant... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -6847,18 +6469,16 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- #include +- #include ++ #include ++ #include + + int + main () + { + +- FILE *f; +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%x",ADDR_COMPAT_LAYOUT); +- return 0; ++ FILE *f; ++ if (!(f=fopen("conftest1","w"))) return -1; ++ fprintf(f,"%x",ADDR_COMPAT_LAYOUT); + + ; + return 0; +@@ -6866,11 +6486,11 @@ main () + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + ADDR_COMPAT_LAYOUT=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_COMPAT_LAYOUT" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_COMPAT_LAYOUT" >&5 + $as_echo "yes $ADDR_COMPAT_LAYOUT" >&6; } + else + ADDR_COMPAT_LAYOUT=0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + + cat >>confdefs.h <<_ACEOF +@@ -6883,9 +6503,9 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_LIMIT_3GB constant" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ADDR_LIMIT_3GB constant" >&5 + $as_echo_n "checking for ADDR_LIMIT_3GB constant... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -6894,18 +6514,16 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- #include +- #include ++ #include ++ #include + + int + main () + { + +- FILE *f; +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%x",ADDR_LIMIT_3GB); +- return 0; ++ FILE *f; ++ if (!(f=fopen("conftest1","w"))) return -1; ++ fprintf(f,"%x",ADDR_LIMIT_3GB); + + ; + return 0; +@@ -6913,11 +6531,11 @@ main () + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + ADDR_LIMIT_3GB=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_LIMIT_3GB" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $ADDR_LIMIT_3GB" >&5 + $as_echo "yes $ADDR_LIMIT_3GB" >&6; } + else + ADDR_LIMIT_3GB=0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + + cat >>confdefs.h <<_ACEOF +@@ -6930,9 +6548,9 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for personality(ADDR_NO_RANDOMIZE) support" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for personality(ADDR_NO_RANDOMIZE) support" >&5 + $as_echo_n "checking for personality(ADDR_NO_RANDOMIZE) support... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -6941,12 +6559,13 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + ++ #include ++ #include ++ int main(int argc,char *argv[],char *envp[]) { ++ #include "h/unrandomize.h" ++ return 0; ++ } + +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- #include "h/unrandomize.h" +- return 0;} + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +@@ -6963,92 +6582,89 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking that sbrk is (now) non-random" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking that sbrk is (now) non-random" >&5 + $as_echo_n "checking that sbrk is (now) non-random... " >&6; } +- if test "$cross_compiling" = yes; then : +- SBRK=0 ++ SBRK=0 ++ if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- #include ++ ++ #include ++ #include + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" + #endif +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%u",sbrk(0)); +- return 0;} ++ if (!(f=fopen("conftest1","w"))) ++ return -1; ++ fprintf(f,"%u",sbrk(0)); ++ return 0; ++ } ++ + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + SBRK=`cat conftest1` +-else +- SBRK=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- if test "$SBRK" = "0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot trap sbrk" >&5 +-$as_echo "cannot trap sbrk" >&6; } +- exit 1 +- fi +- if test "$cross_compiling" = yes; then : +- SBRK1=0 ++ if test "$SBRK" = "0" ; then ++ as_fn_error $? "cannot trap sbrk" "$LINENO" 5 ++ fi ++ ++ SBRK1=0 ++ if test "$cross_compiling" = yes; then : ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error $? "cannot run test program while cross compiling ++See \`config.log' for more details" "$LINENO" 5; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- #include ++ ++ #include ++ #include + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" + #endif + if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%u",sbrk(0)); +- return 0;} ++ fprintf(f,"%u",sbrk(0)); ++ return 0; ++ } ++ + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + SBRK1=`cat conftest1` +-else +- SBRK1=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- if test "$SBRK1" = "0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot trap sbrk" >&5 +-$as_echo "cannot trap sbrk" >&6; } +- exit 1 +- fi +- if test "$SBRK" = "$SBRK1" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ if test "$SBRK1" = "0" ; then ++ as_fn_error $? "cannot trap sbrk" "$LINENO" 5 ++ fi ++ if test "$SBRK" = "$SBRK1" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +- echo "Cannot build with randomized sbrk. Your options:" +- echo " - upgrade to a kernel/libc that knows about personality(ADDR_NO_RANDOMIZE)" +- echo " - recompile your kernel with CONFIG_COMPAT_BRK (if it has that option)" +- echo " - run sysctl kernel.randomize_va_space=0 before using gcl" +- exit 1 +- fi ++ echo "Cannot build with randomized sbrk. Your options:" ++ echo " - upgrade to a kernel/libc that knows about personality(ADDR_NO_RANDOMIZE)" ++ echo " - recompile your kernel with CONFIG_COMPAT_BRK (if it has that option)" ++ echo " - run sysctl kernel.randomize_va_space=0 before using gcl" ++ as_fn_error $? "exiting" "$LINENO" 5 ++ fi + fi +- +- +- +- +- +- +- +- +- +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking CSTACK_ADDRESS" >&5 + $as_echo_n "checking CSTACK_ADDRESS... " >&6; } + if test "$cross_compiling" = yes; then : +@@ -7060,34 +6676,35 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- void * +- foo() { +- int i; +- return (void *)&i; +- } +- +- int main(int argc,char **argv,char **envp) { +- void *v ; +- FILE *fp = fopen("conftest1","w"); +- unsigned long i,j; +- +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- j=1; +- j<<=$PAGEWIDTH; +- j<<=16; +- i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- fprintf(fp,"0x%lx",i-1); +- fclose(fp); +- return 0; +-} ++ #include ++ #include ++ void * ++ foo() { ++ int i; ++ return (void *)&i; ++ } ++ ++ int ++ main(int argc,char **argv,char **envp) { ++ void *v ; ++ FILE *fp = fopen("conftest1","w"); ++ unsigned long i,j; ++ ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ j=1; ++ j<<=$PAGEWIDTH; ++ j<<=16; ++ i=(unsigned long)&v; ++ if (foo()>i) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ fprintf(fp,"0x%lx",i-1); ++ fclose(fp); ++ return 0; ++ } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + cstack_address=`cat conftest1` +@@ -7117,35 +6734,36 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- void * +- foo() { +- int i; +- return (void *)&i; +- } +- +- int main(int argc,char **argv,char **envp) { +- void *v ; +- FILE *fp = fopen("conftest1","w"); +- unsigned long i,j; +- +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- j=1; +- j<<=$PAGEWIDTH; +- j<<=16; +- i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); +- fprintf(fp,"%d",j); +- fclose(fp); +- return 0; +-} ++ #include ++ #include ++ void * ++ foo() { ++ int i; ++ return (void *)&i; ++ } ++ ++ int ++ main(int argc,char **argv,char **envp) { ++ void *v ; ++ FILE *fp = fopen("conftest1","w"); ++ unsigned long i,j; ++ ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ j=1; ++ j<<=$PAGEWIDTH; ++ j<<=16; ++ i=(unsigned long)&v; ++ if (foo()>i) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); ++ fprintf(fp,"%d",j); ++ fclose(fp); ++ return 0; ++ } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + cstack_bits=`cat conftest1` +@@ -7175,33 +6793,33 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- return (long)$cstack_address<0 ? 0 : -1; +-} ++ #include ++ #include ++ int ++ main(int argc,char **argv,char **envp) { ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ return (long)$cstack_address<0 ? 0 : -1; ++ } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } +- neg_cstack_address=1 ++ neg_cstack_address=1 + + $as_echo "#define NEG_CSTACK_ADDRESS 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +- neg_cstack_address=0 ++ neg_cstack_address=0 + fi + rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + + +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding CSTACK_ALIGNMENT" >&5 + $as_echo_n "checking finding CSTACK_ALIGNMENT... " >&6; } + if test "$cross_compiling" = yes; then : +@@ -7213,23 +6831,23 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- void *b,*c; +- FILE *fp = fopen("conftest1","w"); +- long n; +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- b=alloca(sizeof(b)); +- c=alloca(sizeof(c)); +- n=b>c ? b-c : c-b; +- n=n>sizeof(c) ? n : 1; +- fprintf(fp,"%ld",n); +- fclose(fp); +- return 0; +-} ++ #include ++ #include ++ int main(int argc,char **argv,char **envp) { ++ void *b,*c; ++ FILE *fp = fopen("conftest1","w"); ++ long n; ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ b=alloca(sizeof(b)); ++ c=alloca(sizeof(c)); ++ n=b>c ? b-c : c-b; ++ n=n>sizeof(c) ? n : 1; ++ fprintf(fp,"%ld",n); ++ fclose(fp); ++ return 0; ++ } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + cstack_alignment=`cat conftest1` +@@ -7259,24 +6877,25 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include +- void * +- foo(void) { +- int i; +- return (void *)&i; +- } +- +- int main(int argc,char **argv,char **envp) { +- char *b; +- FILE *fp = fopen("conftest1","w"); +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- fprintf(fp,"%d",((long) &b) > ((long) foo()) ? -1 : 1); +- fclose(fp); +- return 0; +-} ++ #include ++ #include ++ void * ++ foo(void) { ++ int i; ++ return (void *)&i; ++ } ++ ++ int ++ main(int argc,char **argv,char **envp) { ++ char *b; ++ FILE *fp = fopen("conftest1","w"); ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ fprintf(fp,"%d",((long) &b) > ((long) foo()) ? -1 : 1); ++ fclose(fp); ++ return 0; ++ } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : + cstack_direction=`cat conftest1` +@@ -7295,62 +6914,74 @@ _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cstack_direction" >&5 + $as_echo "$cstack_direction" >&6; } + ++# Check whether --enable-immfix was given. ++if test "${enable_immfix+set}" = set; then : ++ enableval=$enable_immfix; ++fi ++ ++ ++# Check whether --enable-fastimmfix was given. ++if test "${enable_fastimmfix+set}" = set; then : ++ enableval=$enable_fastimmfix; ++else ++ enable_fastimmfix=64 ++fi + + + + if test "$use" != "386-gnu" ; then #hurd can push .data below C stack, but sbrk(0) remains above, foiling unexec + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding default linker script" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding default linker script" >&5 + $as_echo_n "checking finding default linker script... " >&6; } +- touch unixport/gcl.script +- echo "int main() {return 0;}" >foo.c +- $CC -Wl,--verbose foo.c -o foo 2>&1 | \ +- $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script +- rm -rf foo.c foo ++ touch unixport/gcl.script ++ echo "int main() {return 0;}" >foo.c ++ $CC $TLDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ ++ $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script ++ rm -rf foo.c foo + +- if test "`cat gcl.script | wc -l`" != "0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: got it" >&5 ++ if test "`cat gcl.script | wc -l`" != "0" ; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: got it" >&5 + $as_echo "got it" >&6; } +- { $as_echo "$as_me:${as_lineno-$LINENO}: trying to adjust text start" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: trying to adjust text start" >&5 + $as_echo "$as_me: trying to adjust text start" >&6;} +- cp gcl.script gcl.script.def ++ cp gcl.script gcl.script.def + +- n=-1; +- k=0; +- lim=`$AWK 'END {printf("%d\n",m*8-2)}' m=$ac_cv_sizeof_long`; +- max=0; +- min=$lim; +- while test $n -lt $lim ; do +- j=`$AWK 'END {for (i=j=0;j<=n;j++) i=i ? i*2 : 1;printf("%x\n",3*i)}' n=$n gcl.script +-# diff -u gcl.script.def gcl.script +- echo "int main() {return 0;}" >foo.c +- if ( $CC -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then +- if test $n -lt $min ; then min=$n; fi; +- if test $n -gt $max; then max=$n; fi; +- elif test $max -gt 0 ; then +- break; +- fi; +- n=`$AWK 'END {print n+1}' n=$n gcl.script ++ # diff -u gcl.script.def gcl.script ++ echo "int main() {return 0;}" >foo.c ++ if ( $CC $TLDFLAGS -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then ++ if test $n -lt $min ; then min=$n; fi; ++ if test $n -gt $max; then max=$n; fi; ++ elif test $max -gt 0 ; then ++ break; ++ fi; ++ n=`$AWK 'END {print n+1}' n=$n &5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: min log text start $min" >&5 + $as_echo "$as_me: min log text start $min" >&6;} +- { $as_echo "$as_me:${as_lineno-$LINENO}: max log text start $max" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: max log text start $max" >&5 + $as_echo "$as_me: max log text start $max" >&6;} + +- if test $neg_cstack_address -eq 1 ; then #FIXME test this +- if test $cstack_bits -lt $max ; then +- max=$cstack_bits; +- { $as_echo "$as_me:${as_lineno-$LINENO}: max log text start reduced to $max considering c stack address" >&5 ++ if test $neg_cstack_address -eq 1 ; then #FIXME test this ++ if test $cstack_bits -lt $max ; then ++ max=$cstack_bits; ++ { $as_echo "$as_me:${as_lineno-$LINENO}: max log text start reduced to $max considering c stack address" >&5 + $as_echo "$as_me: max log text start reduced to $max considering c stack address" >&6;} +- fi +- fi ++ fi ++ fi + +- j=-1; +- low_shft=""; +- if test $min -le $max ; then +- if test $max -ge $enable_fastimmfix && test "$enable_immfix" = "yes" ; then ++ j=-1; ++ low_shft=""; ++ if test $min -le $max ; then ++ if test $max -ge $enable_fastimmfix && test "$enable_immfix" != "no" ; then + j=`$AWK 'END {for (i=j=0;j<=n;j++) i=i ? i*2 : 1;printf("%x\n",3*i)}' n=$max &5 +@@ -7360,9 +6991,9 @@ $as_echo "$as_me: raising log text to $j + { $as_echo "$as_me:${as_lineno-$LINENO}: lowering log text to $j to maximize data area" >&5 + $as_echo "$as_me: lowering log text to $j to maximize data area" >&6;} + fi +- fi ++ fi + +- if test "$low_shft" != "" ; then ++ if test "$low_shft" != "" ; then + + cat >>confdefs.h <<_ACEOF + #define LOW_SHFT $low_shft +@@ -7373,34 +7004,34 @@ cat >>confdefs.h <<_ACEOF + #define OBJNULL (object)0x$j + _ACEOF + +- else ++ else + + cat >>confdefs.h <<_ACEOF + #define OBJNULL NULL + _ACEOF + +- fi ++ fi + +-# echo $j; +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking our linker script" >&5 ++ # echo $j; ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking our linker script" >&5 + $as_echo_n "checking our linker script... " >&6; } +- if test "$j" -ne "-1" ; then ++ if test "$j" -ne "-1" ; then + cat gcl.script.def | $AWK '/SIZEOF_HEADERS/ {gsub("0x[0-9]*","0x" j,$0);} {print}' j=$j >gcl.script + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 + $as_echo "done" >&6; } + rm -f gcl.script.def + LDFLAGS="$LDFLAGS -Wl,-T gcl.script " + cp gcl.script unixport +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none found or not needed" >&5 ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none found or not needed" >&5 + $as_echo "none found or not needed" >&6; } +- rm -f gcl.script gcl.script.def +- fi +- rm -rf foo.c foo +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 ++ rm -f gcl.script gcl.script.def ++ fi ++ rm -rf foo.c foo ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + $as_echo "not found" >&6; } +- fi ++ fi + + else + +@@ -7412,19 +7043,6 @@ _ACEOF + + fi + +- +- +- +- +- +- +- +- +- +- +- +- +- + mem_top=0 + mem_range=0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking mem top" >&5 +@@ -7438,30 +7056,30 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include ++ #include + + int + main () + { + +- void *v; +- unsigned long i,j,k,l,m; +- FILE *fp = fopen("conftest1","w"); +- +- for (i=2,k=1;i;k=i,i<<=1); +- l=$cstack_address; +- l=$cstack_direction==1 ? (l>=1,i|=j); +- if (j<(k>>3)) i=0; +- j=1; +- j<<=$PAGEWIDTH; +- j<<=4; +- j--; +- i+=j; +- i&=~j; +- fprintf(fp,"0x%lx",i); +- fclose(fp); +- return 0; ++ void *v; ++ unsigned long i,j,k,l,m; ++ FILE *fp = fopen("conftest1","w"); ++ ++ for (i=2,k=1;i;k=i,i<<=1); ++ l=$cstack_address; ++ l=$cstack_direction==1 ? (l>=1,i|=j); ++ if (j<(k>>3)) i=0; ++ j=1; ++ j<<=$PAGEWIDTH; ++ j<<=4; ++ j--; ++ i+=j; ++ i&=~j; ++ fprintf(fp,"0x%lx",i); ++ fclose(fp); ++ return 0; + + ; + return 0; +@@ -7478,10 +7096,11 @@ fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mem_top" >&5 + $as_echo "$mem_top" >&6; } ++ + if test "$mem_top" != "0x0" ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding upper mem half range" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking finding upper mem half range" >&5 + $as_echo_n "checking finding upper mem half range... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -7490,19 +7109,19 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include ++ #include + + int + main () + { + +- unsigned long j; +- FILE *fp = fopen("conftest1","w"); ++ unsigned long j; ++ FILE *fp = fopen("conftest1","w"); + +- for (j=1;j && !(j& $mem_top);j<<=1); +- fprintf(fp,"0x%lx",j>>1); +- fclose(fp); +- return 0; ++ for (j=1;j && !(j& $mem_top);j<<=1); ++ fprintf(fp,"0x%lx",j>>1); ++ fclose(fp); ++ return 0; + + ; + return 0; +@@ -7517,9 +7136,9 @@ rm -f core *.core core.conftest.* gmon.o + conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mem_range" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mem_range" >&5 + $as_echo "$mem_range" >&6; } +- if test "$mem_range" != "0x0" ; then ++ if test "$mem_range" != "0x0" ; then + + cat >>confdefs.h <<_ACEOF + #define MEM_TOP $mem_top +@@ -7530,12 +7149,12 @@ cat >>confdefs.h <<_ACEOF + #define MEM_RANGE $mem_range + _ACEOF + +- fi ++ fi + fi + +-if test "$enable_immfix" = "yes" ; then +- if test "$mem_top" != "0x0" ; then +- if test "$mem_range" != "0x0" ; then ++if test "$enable_immfix" != "no" ; then ++ if test "$mem_top" != "0x0" ; then ++ if test "$mem_range" != "0x0" ; then + + cat >>confdefs.h <<_ACEOF + #define IM_FIX_BASE $mem_top +@@ -7546,24 +7165,10 @@ cat >>confdefs.h <<_ACEOF + #define IM_FIX_LIM $mem_range + _ACEOF + +- fi +- fi ++ fi ++ fi + fi + +- +- +- +-# On systems with execshield, brk is randomized. We need to catch +-# this and restore the traditional behavior here +- +- +- +- +- +- +- +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof long long int" >&5 + $as_echo_n "checking sizeof long long int... " >&6; } + if test "$cross_compiling" = yes; then : +@@ -7575,14 +7180,14 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include ++ #include + + int + main () + { + +- if (sizeof(long long int) == 2*sizeof(long)) return 0; +- return 1; ++ if (sizeof(long long int) == 2*sizeof(long)) return 0; ++ return 1; + + ; + return 0; +@@ -7604,7 +7209,6 @@ fi + + + +- + for ac_header in dirent.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +@@ -7614,21 +7218,21 @@ if test "x$ac_cv_header_dirent_h" = xyes + _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for d_type" >&5 + $as_echo_n "checking for d_type... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include ++ #include + + int + main () + { + +- struct dirent d; +- return d.d_type=0; ++ struct dirent d; ++ return d.d_type=0; + + ; + return 0; +@@ -7652,32 +7256,18 @@ fi + done + + +-# readline +-# Check whether --enable-readline was given. +-if test "${enable_readline+set}" = set; then : +- enableval=$enable_readline; +-else +- enable_readline="yes" +-fi +- +- + # ansi lisp ++SYSTEM=ansi_gcl ++CLSTANDARD=ANSI + # Check whether --enable-ansi was given. + if test "${enable_ansi+set}" = set; then : +- enableval=$enable_ansi; +-else +- enable_ansi="yes" ++ enableval=$enable_ansi; if test "$enable_ansi" = "no" ; then ++ SYSTEM=gcl ++ CLSTANDARD=CLtL1 ++ fi + fi + + +-if test "$enable_ansi" = "yes" ; then +- SYSTEM=ansi_gcl +- CLSTANDARD=ANSI +-else +- SYSTEM=gcl +- CLSTANDARD=CLtL1 +-fi +- + FLISP="saved_$SYSTEM" + + +@@ -7913,23 +7503,22 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- +- #include ++ #include + + int + main () + { + +- char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404"; +- int n, m; +- double f; +- char *endptr; +- FILE *fp=fopen("conftest1","w"); ++ char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404"; ++ int n, m; ++ double f; ++ char *endptr; ++ FILE *fp=fopen("conftest1","w"); + +- n=sscanf(s,"%lf%n",&f,&m); +- fprintf(fp,"%d",m); +- fclose(fp); +- return s[m]; ++ n=sscanf(s,"%lf%n",&f,&m); ++ fprintf(fp,"%d",m); ++ fclose(fp); ++ return s[m]; + + ; + return 0; +@@ -7940,7 +7529,7 @@ if ac_fn_c_try_run "$LINENO"; then : + $as_echo "none" >&6; } + else + buggy_maximum_sscanf_length=`cat conftest1` +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $buggy_maximum_sscanf_length" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $buggy_maximum_sscanf_length" >&5 + $as_echo "$buggy_maximum_sscanf_length" >&6; } + + cat >>confdefs.h <<_ACEOF +@@ -7955,8 +7544,10 @@ fi + + + EXTRA_LOBJS= +-if test "$try_japi" = "yes" ; then +- for ac_header in japi.h ++# Check whether --enable-japi was given. ++if test "${enable_japi+set}" = set; then : ++ enableval=$enable_japi; if test "$enable_japi" = "yes" ; then ++ for ac_header in japi.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "japi.h" "ac_cv_header_japi_h" "$ac_includes_default" + if test "x$ac_cv_header_japi_h" = xyes; then : +@@ -7965,14 +7556,16 @@ if test "x$ac_cv_header_japi_h" = xyes; + _ACEOF + $as_echo "#define HAVE_JAPI_H 1" >>confdefs.h + +- EXTRA_LOBJS="${EXTRA_LOBJS} gcl_japi.o" +- LIBS="${LIBS} -ljapi -lwsock32" ++ EXTRA_LOBJS="${EXTRA_LOBJS} gcl_japi.o" ++ LIBS="${LIBS} -ljapi -lwsock32" + fi + + done + ++ fi + fi + ++ + # Should really find a way to check for prototypes, but this + # basically works for now. CM + # +@@ -8057,15 +7650,15 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #define _GNU_SOURCE +- #include ++ #define _GNU_SOURCE ++ #include + + int + main () + { + +- float f; +- return isnormal(f) || !isnormal(f) ? 0 : 1; ++ float f; ++ return isnormal(f) || !isnormal(f) ? 0 : 1; + + ; + return 0; +@@ -8077,9 +7670,9 @@ $as_echo "#define HAVE_ISNORMAL 1" >>con + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass in ieeefp.h" >&5 +-$as_echo_n "checking for fpclass in ieeefp.h... " >&6; } +- if test "$cross_compiling" = yes; then : ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass of ieeefp.h" >&5 ++$as_echo_n "checking for fpclass of ieeefp.h... " >&6; } ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -8088,14 +7681,14 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include ++ #include + + int + main () + { + +- float f; +- return fpclass(f)>=FP_NZERO || fpclass(f)=FP_NZERO || fpclass(f)conftest.$ac_ext + /* end confdefs.h. */ + +- #define _GNU_SOURCE +- #include ++ #define _GNU_SOURCE ++ #include + + int + main () + { + +- float f; +- return isfinite(f) || !isfinite(f) ? 0 : 1; ++ float f; ++ return isfinite(f) || !isfinite(f) ? 0 : 1; + + ; + return 0; +@@ -8153,7 +7746,7 @@ $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite()" >&5 + $as_echo_n "checking for finite()... " >&6; } +- if test "$cross_compiling" = yes; then : ++ if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 + $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + as_fn_error $? "cannot run test program while cross compiling +@@ -8162,15 +7755,15 @@ else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +- #include +- #include ++ #include ++ #include + + int + main () + { + +- float f; +- return finite(f) || !finite(f) ? 0 : 1; ++ float f; ++ return finite(f) || !finite(f) ? 0 : 1; + + ; + return 0; +@@ -8194,8 +7787,6 @@ rm -f core *.core core.conftest.* gmon.o + fi + + +- +- + #-------------------------------------------------------------------- + # Check for the existence of the -lsocket and -lnsl libraries. + # The order here is important, so that they end up in the right +@@ -8315,10 +7906,19 @@ fi + fi + + +-RL_OBJS="" +-RL_LIB="" +-if test "$enable_readline" = "yes" ; then +- for ac_header in readline/readline.h ++# readline ++# Check whether --enable-readline was given. ++if test "${enable_readline+set}" = set; then : ++ enableval=$enable_readline; ++fi ++ ++ ++if test "$use" = "mingw" ; then ++ enable_readline=no ++fi ++ ++if test "$enable_readline" != "no" ; then ++ for ac_header in readline/readline.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" + if test "x$ac_cv_header_readline_readline_h" = xyes; then : +@@ -8365,12 +7965,8 @@ if test "x$ac_cv_lib_readline_rl_initial + + $as_echo "#define HAVE_READLINE 1" >>confdefs.h + +- TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware +- RL_OBJS=gcl_readline.o +-# Readline support now initialized automatically when compiled in, this lisp +-# object no longer needed -- 20040102 CM +-# RL_LIB=lsp/gcl_readline.o +- ++ TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware ++ RL_OBJS=gcl_readline.o + fi + + fi +@@ -8378,8 +7974,8 @@ fi + done + + +-# These tests discover differences between readline 4.1 and 4.3 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 ++ # These tests discover differences between readline 4.1 and 4.3 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 + $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } + if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -8429,34 +8025,37 @@ fi + + + ++# sockets ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking For network code for nsocket.c" >&5 + $as_echo_n "checking For network code for nsocket.c... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ + +-#include +-#include +-#include +- +-#include +-#include +-#include +- +-/************* for the sockets ******************/ +-#include /* struct sockaddr, SOCK_STREAM, ... */ +-#ifndef NO_UNAME +-# include /* uname system call. */ +-#endif +-#include /* struct in_addr, struct sockaddr_in */ +-#include /* inet_ntoa() */ +-#include /* gethostbyname() */ ++ #include ++ #include ++ #include ++ ++ #include ++ #include ++ #include ++ ++ /************* for the sockets ******************/ ++ #include /* struct sockaddr, SOCK_STREAM, ... */ ++ #ifndef NO_UNAME ++ # include /* uname system call. */ ++ #endif ++ #include /* struct in_addr, struct sockaddr_in */ ++ #include /* inet_ntoa() */ ++ #include /* gethostbyname() */ + + int + main () + { +- connect(0,(struct sockaddr *)0,0); +- gethostbyname("jil"); +- socket(AF_INET, SOCK_STREAM, 0); ++ ++ connect(0,(struct sockaddr *)0,0); ++ gethostbyname("jil"); ++ socket(AF_INET, SOCK_STREAM, 0); + + ; + return 0; +@@ -8466,7 +8065,7 @@ if ac_fn_c_try_link "$LINENO"; then : + + $as_echo "#define HAVE_NSOCKET 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -8480,16 +8079,18 @@ rm -f core conftest.err conftest.$ac_obj + $as_echo_n "checking check for listen using fcntl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +-#include ++ ++ #include ++ #include + + int + main () + { +-FILE *fp=fopen("configure.in","r"); +- int orig; +- orig = fcntl(fileno(fp), F_GETFL); +- if (! (orig & O_NONBLOCK )) return 0; ++ ++ FILE *fp=fopen("configure.in","r"); ++ int orig; ++ orig = fcntl(fileno(fp), F_GETFL); ++ if (! (orig & O_NONBLOCK )) return 0; + + ; + return 0; +@@ -8499,7 +8100,7 @@ if ac_fn_c_try_compile "$LINENO"; then : + + $as_echo "#define LISTEN_USE_FCNTL 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -8508,8 +8109,6 @@ fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + +- +- + ac_fn_c_check_func "$LINENO" "profil" "ac_cv_func_profil" + if test "x$ac_cv_func_profil" = xyes; then : + +@@ -8531,7 +8130,7 @@ fi + + + if test "$no_setenv" = "1" ; then +-ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" ++ ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" + if test "x$ac_cv_func_putenv" = xyes; then : + + $as_echo "#define HAVE_PUTENV 1" >>confdefs.h +@@ -8551,17 +8150,11 @@ fi + + gcl_ok=no + +- +- +- +- +- +-# if test "x$enable_machine" = "x" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5 + $as_echo_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O... " >&6; } + + case $system in +- OSF*) ++ OSF*) + + $as_echo "#define USE_FIONBIO 1" >>confdefs.h + +@@ -8593,8 +8186,9 @@ esac + $as_echo_n "checking check for SV_ONSTACK... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +-int joe=SV_ONSTACK; ++ ++ #include ++ int joe=SV_ONSTACK; + + int + main () +@@ -8609,7 +8203,7 @@ if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define HAVE_SV_ONSTACK 1" >>confdefs.h + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -8621,8 +8215,9 @@ rm -f core conftest.err conftest.$ac_obj + $as_echo_n "checking check for SIGSYS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +-int joe=SIGSYS; ++ ++ #include ++ int joe=SIGSYS; + + int + main () +@@ -8637,7 +8232,7 @@ if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define HAVE_SIGSYS 1" >>confdefs.h + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -8650,8 +8245,9 @@ rm -f core conftest.err conftest.$ac_obj + $as_echo_n "checking check for SIGEMT... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +-int joe=SIGEMT; ++ ++ #include ++ int joe=SIGEMT; + + int + main () +@@ -8666,7 +8262,7 @@ if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define HAVE_SIGEMT 1" >>confdefs.h + + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 + $as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +@@ -8705,7 +8301,7 @@ if test "x$ac_cv_header_dis_asm_h" = xye + #define HAVE_DIS_ASM_H 1 + _ACEOF + MLIBS=$LIBS +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for init_disassemble_info in -lopcodes" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for init_disassemble_info in -lopcodes" >&5 + $as_echo_n "checking for init_disassemble_info in -lopcodes... " >&6; } + if ${ac_cv_lib_opcodes_init_disassemble_info+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -8750,7 +8346,7 @@ _ACEOF + + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 + $as_echo_n "checking for dlopen in -ldl... " >&6; } + if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -8788,7 +8384,7 @@ fi + $as_echo "$ac_cv_lib_dl_dlopen" >&6; } + if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + #opcodes changes too quickly to link directly +- for ac_func in print_insn_i386 ++ for ac_func in print_insn_i386 + do : + ac_fn_c_check_func "$LINENO" "print_insn_i386" "ac_cv_func_print_insn_i386" + if test "x$ac_cv_func_print_insn_i386" = xyes; then : +@@ -8807,7 +8403,7 @@ done + + + #if test $use = "386-linux" ; then +- for ac_header in asm/sigcontext.h ++for ac_header in asm/sigcontext.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "asm/sigcontext.h" "ac_cv_header_asm_sigcontext_h" "$ac_includes_default" + if test "x$ac_cv_header_asm_sigcontext_h" = xyes; then : +@@ -8819,7 +8415,7 @@ fi + + done + +- for ac_header in asm/signal.h ++for ac_header in asm/signal.h + do : + ac_fn_c_check_header_mongrel "$LINENO" "asm/signal.h" "ac_cv_header_asm_signal_h" "$ac_includes_default" + if test "x$ac_cv_header_asm_signal_h" = xyes; then : +@@ -8831,17 +8427,18 @@ fi + + done + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 + $as_echo_n "checking for sigcontext...... " >&6; } +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include ++ ++ #include + + int + main () + { + +- struct sigcontext foo; ++ struct sigcontext foo; + + ; + return 0; +@@ -8849,38 +8446,31 @@ main () + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + +- sigcontext_works=1; +- + $as_echo "#define SIGNAL_H_HAS_SIGCONTEXT 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext in signal.h" >&5 +-$as_echo "sigcontext in signal.h" >&6; } +- ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext of signal.h" >&5 ++$as_echo "sigcontext of signal.h" >&6; } + else +- sigcontext_works=0; +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext NOT in signal.h" >&5 +-$as_echo "sigcontext NOT in signal.h" >&6; } +- +-fi +-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- if test "$sigcontext_works" = 0 ; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext NOT of signal.h" >&5 ++$as_echo "sigcontext NOT of signal.h" >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigcontext..." >&5 + $as_echo_n "checking for sigcontext...... " >&6; } +- cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext + /* end confdefs.h. */ +-#include +- #ifdef HAVE_ASM_SIGCONTEXT_H +- #include +- #endif +- #ifdef HAVE_ASM_SIGNAL_H +- #include +- #endif ++ ++ #include ++ #ifdef HAVE_ASM_SIGCONTEXT_H ++ #include ++ #endif ++ #ifdef HAVE_ASM_SIGNAL_H ++ #include ++ #endif + + int + main () + { + +- struct sigcontext foo; ++ struct sigcontext foo; + + ; + return 0; +@@ -8888,39 +8478,17 @@ main () + _ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + +- + $as_echo "#define HAVE_SIGCONTEXT 1" >>confdefs.h + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext in asm files" >&5 +-$as_echo "sigcontext in asm files" >&6; } +- ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: sigcontext asm files" >&5 ++$as_echo "sigcontext asm files" >&6; } + else +- +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no sigcontext found" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no sigcontext found" >&5 + $as_echo "no sigcontext found" >&6; } +- + fi + rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +- +- +- fi +-# echo 'foo() {}' > conftest1.c +-# $CC -S conftest1.c +-# use_underscore=0 +-# if fgrep _foo conftest1.s ; then use_underscore=1 ; fi +-# if test $use_underscore = 0 ; then +-# MPI_FILE=mpi-386_no_under.o +-# else +-# MPI_FILE=mpi-386d.o +-# fi +-# AC_SUBST(MPI_FILE) +-# GCC=$CC +-# if test -x /usr/bin/i386-glibc20-linux-gcc ; then +-# GCC=/usr/bin/i386-glibc20-linux-gcc +-# fi +-# AC_SUBST(GCC) +- +-#fi ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + # Extract the first word of "emacs", so it can be a program name with args. + set dummy emacs; ac_word=$2 +@@ -8980,11 +8548,11 @@ EOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking emacs site lisp directory" >&5 + $as_echo_n "checking emacs site lisp directory... " >&6; } + if [ "$EMACS_SITE_LISP" = "unknown" ] ; then +- if [ "$EMACS" != "" ] ; then +- EMACS_SITE_LISP=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` +- else +- EMACS_SITE_LISP="" +- fi ++ if [ "$EMACS" != "" ] ; then ++ EMACS_SITE_LISP=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` ++ else ++ EMACS_SITE_LISP="" ++ fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EMACS_SITE_LISP" >&5 + $as_echo "$EMACS_SITE_LISP" >&6; } +@@ -9005,14 +8573,14 @@ EOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking emacs default.el" >&5 + $as_echo_n "checking emacs default.el... " >&6; } + if [ "$EMACS" != "" ] ; then +- EMACS_DEFAULT_EL=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` ++ EMACS_DEFAULT_EL=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` + else +- EMACS_DEFAULT_EL="" ++ EMACS_DEFAULT_EL="" + fi + if test -f "${EMACS_DEFAULT_EL}" ; then true;else +- if test -d $EMACS_SITE_LISP ; then +- EMACS_DEFAULT_EL=${EMACS_SITE_LISP}/default.el +- fi ++ if test -d $EMACS_SITE_LISP ; then ++ EMACS_DEFAULT_EL=${EMACS_SITE_LISP}/default.el ++ fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EMACS_DEFAULT_EL" >&5 + $as_echo "$EMACS_DEFAULT_EL" >&6; } +@@ -9046,14 +8614,34 @@ fi + $as_echo "$INFO_DIR" >&6; } + + +-if test "$enable_tcltk" = "yes" ; then ++# Check whether --enable-tcltk was given. ++if test "${enable_tcltk+set}" = set; then : ++ enableval=$enable_tcltk; ++fi ++ ++# Check whether --enable-tkconfig was given. ++if test "${enable_tkconfig+set}" = set; then : ++ enableval=$enable_tkconfig; TK_CONFIG_PREFIX=$enableval ++else ++ TK_CONFIG_PREFIX=unknown ++fi ++ ++# Check whether --enable-tclconfig was given. ++if test "${enable_tclconfig+set}" = set; then : ++ enableval=$enable_tclconfig; TCL_CONFIG_PREFIX=$enableval ++else ++ TCL_CONFIG_PREFIX=unknown ++fi ++ ++ ++if test "$enable_tcltk" != "no" ; then + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tcl/tk" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tcl/tk" >&5 + $as_echo_n "checking for tcl/tk... " >&6; } + +- if test -d "${TCL_CONFIG_PREFIX}" ; then true ; else ++ if test -d "${TCL_CONFIG_PREFIX}" ; then true ; else + +- # Extract the first word of "tclsh", so it can be a program name with args. ++ # Extract the first word of "tclsh", so it can be a program name with args. + set dummy tclsh; ac_word=$2 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 + $as_echo_n "checking for $ac_word... " >&6; } +@@ -9092,76 +8680,76 @@ fi + + + +- if test "${TCLSH}" = "" ; then true ; else ++ if test "${TCLSH}" = "" ; then true ; else + +- rm -f conftest.tcl +- cat >> conftest.tcl <> conftest.tcl <&5 ++ TCL_VERSION_DOT_FREE=`echo ${TCL_VERSION} | tr -d .` ++ if test -f ${TK_CONFIG_PREFIX}/../bin/tcl${TCL_VERSION_DOT_FREE}.dll ; then ++ TCL_LIBS="-L${TK_CONFIG_PREFIX}/../bin -ltk${TCL_VERSION_DOT_FREE} -ltcl${TCL_VERSION_DOT_FREE}" ++ TCL_STUB_LIBS="-L${TK_CONFIG_PREFIX}/lib -ltkstub${TCL_VERSION_DOT_FREE} -ltclstub${TCL_VERSION_DOT_FREE}" ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -llieee" >&5 + $as_echo_n "checking for main in -llieee... " >&6; } + if ${ac_cv_lib_lieee_main+:} false; then : + $as_echo_n "(cached) " >&6 +@@ -9197,14 +8785,11 @@ else + have_ieee=0 + fi + +- if test "$have_ieee" = "0" ; then +- TCL_LIBS=`echo ${TCL_LIBS} | sed -e "s:-lieee::g" ` +- fi +- if test "$have_dl" = "0" ; then +- TCL_LIBS=`echo ${TCL_LIBS} | sed -e "s:-ldl::g"` +- fi +- TCL_STUB_LIBS="" +- fi ++ if test "$have_ieee" = "0" ; then ++ TCL_LIBS=`echo ${TCL_LIBS} | sed -e "s:-lieee::g" ` ++ fi ++ TCL_STUB_LIBS="" ++ fi + + fi + +@@ -9229,16 +8814,18 @@ fi + + + if test -d "${TK_CONFIG_PREFIX}" ; then +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using TK_VERSION=${TK_VERSION} in ${TK_CONFIG_PREFIX}" >&5 +-$as_echo "using TK_VERSION=${TK_VERSION} in ${TK_CONFIG_PREFIX}" >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&5 ++$as_echo "using TK_VERSION=${TK_VERSION} of ${TK_CONFIG_PREFIX}" >&6; } + else +-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 + $as_echo "not found" >&6; } + fi + +-NOTIFY=$enable_notify +- ++# Check whether --enable-notify was given. ++if test "${enable_notify+set}" = set; then : ++ enableval=$enable_notify; NOTIFY=$enable_notify + ++fi + + + +@@ -9477,42 +9064,17 @@ _ACEOF + fi + + +-# alloca +- +-# dlopen etc +-# idea make it so you do something dlopen(libX.so,RTLD_GLOBAL) +-# then dlload("foo.o") a lisp file can refer to things in libX.so +-# +- +-# what machine this is, and include then a machine specific hdr. +-# and machine specific defs. +- +-# check bzero, +- +-# check getcwd, getwd etc.. +- + ++LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'` $TLDFLAGS" + ++LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $LIBS $TLIBS" + +-# check socket stuff.. +- +-# getrlimit +- +-# fionread or block +- +-# redhat/cygnus released for some reason a buggy version of gcc, +-# which no one else released. Catch that here. +- +-LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'`" +- +-LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $TLDFLAGS $LIBS $TLIBS" +- +-FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS $TCFLAGS $PROCESSOR_FLAGS" ++FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS $TCFLAGS" + + # Work around bug with gcc on ppc -- CM +-NIFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TONIFLAGS $PROCESSOR_FLAGS -I\$(GCLDIR)/o" ++NIFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TONIFLAGS -I\$(GCLDIR)/o" + +-CFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TO3FLAGS $PROCESSOR_FLAGS -I\$(GCLDIR)/o" ++CFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TO3FLAGS -I\$(GCLDIR)/o" + + O3FLAGS=$TO3FLAGS + +@@ -9522,12 +9084,10 @@ O2FLAGS=$TO2FLAGS + + + +- +- + if test -f h/$use.defs ; then + + +- ac_config_files="$ac_config_files makedefc windows/gcl.iss windows/sysdir.bat windows/install.lsp" ++ ac_config_files="$ac_config_files makedefc windows/gcl.iss windows/sysdir.bat windows/install.lsp" + + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure +@@ -10804,13 +10364,13 @@ if test -n "$ac_unrecognized_opts" && te + $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + fi + +- echo makedefc +- cat makedefc ++ echo makedefc ++ cat makedefc + +- echo add-defs1 $use +- CC=$CC ./add-defs1 $use ++ echo add-defs1 $use ++ CC=$CC ./add-defs1 $use + + else +- echo "Unable to guess machine type" +- echo use configure --enable-machine=XXX, for XXX such that h/XXX.defs exists, ie in h/*.defs ++ echo "Unable to guess machine type" ++ echo use configure --enable-machine=XXX, for XXX such that h/XXX.defs exists, ie in h/*.defs + fi +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -5,107 +5,6 @@ AC_CONFIG_HEADER(h/gclincl.h) + VERSION=`cat majvers`.`cat minvers` + AC_SUBST(VERSION) + +-# some parts of this configure script are taken from the tcl configure.in +- +-# +-# Arguments +-# +- +-dnl help="--enable-maxpage=XXXX will compile in a page table of size XXX (default ${default_maxpage})" +- +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl #include +-dnl ]],[[ +-dnl FILE *fp=fopen("conftest1","w"); +-dnl fprintf(fp,"%u",262144*( SIZEOF_LONG >>2)/(1<<($PAGEWIDTH-12))); +-dnl return 0;]])],[def_maxpage=`cat conftest1`],[def_maxpage=262144]) +- +-dnl AC_ARG_ENABLE(maxpage, +-dnl [ --enable-maxpage=XXXX will compile in a page table of size XXX +-dnl (eg '--enable-maxpage=64*1024' would produce +-dnl 64K pages allowing 256 MB if pages are 4K each)], +-dnl ,enable_maxpage=$def_maxpage) +- +-AC_ARG_ENABLE(widecons,[use a three word cons with simplified typing],[AC_DEFINE([WIDE_CONS],[1],[three word cons])]) +- +- +-AC_ARG_ENABLE(safecdr,[protect cdr from immfix and speed up type processing],,[enable_safecdr="no"]) +-if test "$enable_safecdr" = "yes" ; then +- AC_DEFINE([USE_SAFE_CDR],[1],[protect cdr from immfix and speed up type processing]) +-fi +-AC_ARG_ENABLE(safecdrdbg,[debug safecdr code],[AC_DEFINE([DEBUG_SAFE_CDR],[1],[debug safecdr code])]) +- +-AC_ARG_ENABLE([prelink],[--enable-prelink will insist that the produced images may be prelinked],[PRELINK_CHECK=t],[PRELINK_CHECK=]) +- +-AC_ARG_ENABLE([fastimmfix],[--enable-fastimmfix=XXXX will reject low immediate fixnums unless 1<&1 | fgrep ming > /dev/null ; +- then use=mingw +- else use=gnuwin95 ++ sh4*linux*) use=sh4-linux;; ++ *x86_64*linux*) use=amd64-linux;; ++ *x86_64*kfreebsd*) use=amd64-kfreebsd;; ++ *86*linux*) use=386-linux;; ++ *86*kfreebsd*) use=386-kfreebsd;; ++ *86*gnu*) use=386-gnu;; ++ m68k*linux*) use=m68k-linux;; ++ alpha*linux*) use=alpha-linux;; ++ mips*linux*) use=mips-linux;; ++ mipsel*linux*) use=mipsel-linux;; ++ sparc*linux*) use=sparc-linux;; ++ aarch64*linux*) use=aarch64-linux;; ++ arm*linux*) use=arm-linux;; ++ s390*linux*) use=s390-linux;; ++ ia64*linux*) use=ia64-linux;; ++ hppa*linux*) use=hppa-linux;; ++ powerpc*linux*) use=powerpc-linux;; ++ powerpc-*-darwin*) use=powerpc-macosx;; ++ *86*darwin*) use=386-macosx;; ++ i*mingw*|i*msys*) use=mingw;; ++ i*cygwin*) ++ if $CC -v 2>&1 | fgrep ming > /dev/null ; ++ then use=mingw ++ else use=gnuwin95 + fi;; +- +- *openbsd*) +- # 'ld -Z' means disable W^X +- TLDFLAGS="$TLDFLAGS -Z" +- use=FreeBSD;; +- ++ *openbsd*) use=FreeBSD;; ++ sparc-sun-solaris*) use=solaris;; ++ i?86-pc-solaris*) use=solaris-i386;; + esac + +-AC_SUBST(PROCESSOR_FLAGS) ++AC_ARG_ENABLE([machine],[ --enable-machine=XXXX will force the use of one of the definitions in h/XXXX.defs], ++ [echo enable_machine=$enableval ; use=$enableval]) + +-echo enable_machine=$enable_machine +-if test "x$enable_machine" != "x" ; then +- use=$enable_machine +-fi ++AC_MSG_RESULT([use=$use]) + + def_dlopen="no" + def_statsysbfd="no" + def_custreloc="yes" +-#def_statsysbfd="yes" +-#def_custreloc="no" +-def_locbfd="no" + def_oldgmp="no" + def_pic="no"; + def_static="no"; + def_debug="no"; + case $use in +- *kfreebsd) ++ *kfreebsd) + ln -snf linux.defs h/$use.defs;; +- *gnu) ++ *gnu) + ln -snf linux.defs h/$use.defs;; +- *linux) ++ *linux) + ln -snf linux.defs h/$use.defs; + case $use in +-# def_static -- Function descriptors are currently realized at runtime in a non-reproducible fashion +-# on these architectures -- CM +- powerpc*) +-# if test "$host_cpu" = "powerpc64" ; then def_dlopen="yes" ; def_custreloc="no" ; fi +- ;; +- ia64*) +- def_dlopen="yes" ; def_custreloc="no" ;; +- hppa*) +- def_pic="yes" ;; +-# def_dlopen="yes" ; def_custreloc="no" ; def_pic="yes" ;; ++ ia64*) ++ def_dlopen="yes" ; def_custreloc="no" ;; ++ hppa*) ++ def_pic="yes" ;; + esac;; + esac + +-AC_ARG_ENABLE(dlopen, +- [ --enable-dlopen uses dlopen for loading objects, which can then not be retained in saved images ] +- ,,enable_dlopen="$def_dlopen") +-AC_ARG_ENABLE(statsysbfd, +- [ --enable-statsysbfd uses a static sytem bfd library for loading and relocationing object files ] +- ,,enable_statsysbfd="$def_statsysbfd") +-AC_ARG_ENABLE(dynsysbfd, +- [ --enable-dynsysbfd uses a dynamic shared sytem bfd library for loading and relocationing object files ] +- ,,enable_dynsysbfd="no") +-#AC_ARG_ENABLE(locbfd, +-# [ --enable-locbfd uses a static bfd library built from this source tree for loading and relocationing object files ] +-# ,,enable_locbfd="$def_locbfd") +-AC_ARG_ENABLE(custreloc, +- [ --enable-custreloc uses custom gcl code if available for loading and relocationing object files ] +- ,,enable_custreloc="$def_custreloc") +-AC_ARG_ENABLE(debug, +- [ --enable-debug builds gcl with -g in CFLAGS to enable running under gdb ] +- ,,enable_debug="$def_debug") +-AC_ARG_ENABLE(gprof, +- [ --enable-gprof builds gcl with -pg in CFLAGS to enable profiling with gprof ] +- ,,enable_gprof="no") +-AC_ARG_ENABLE(static,[ --enable-static will link your GCL against static as opposed to shared system libraries ] , +- [enable_static=$enableval],[enable_static="$def_static"]) +-AC_ARG_ENABLE(pic, +- [ --enable-pic builds gcl with -fPIC in CFLAGS ] +- ,,enable_pic="$def_pic") +- +-AC_ARG_ENABLE(oldgmp, +- [ --enable-oldgmp will link against gmp2 instead of gmp3 ] +- ,,enable_oldgmp="$def_oldgmp") +- +-AC_ARG_ENABLE(dynsysgmp, +- [ --enable-dynsysgmp will link against the system libgmp3 overriding certain functions with patched versions from the local source ] +- ,,enable_dynsysgmp="yes") ++AC_ARG_ENABLE([widecons],[ --enable-widecons will use a three word cons with simplified typing], ++ [if test "$enableval" = "yes" ; then AC_DEFINE([WIDE_CONS],[1],[three word cons]) fi]) ++ ++AC_ARG_ENABLE([safecdr],[ --enable-safecdr will protect cdr from immfix and speed up type processing], ++ [if test "$enableval" = "yes" ; then ++ AC_DEFINE([USE_SAFE_CDR],[1],[protect cdr from immfix and speed up type processing]) ++ AC_ARG_ENABLE([safecdrdbg],[ --enable-safecdrdbg will debug safecdr code], ++ [if test "$enableval" = "yes" ; then AC_DEFINE([DEBUG_SAFE_CDR],[1],[debug safecdr code]) fi]) ++ fi]) ++ ++AC_ARG_ENABLE([prelink],[ --enable-prelink will insist that the produced images may be prelinked], ++ [if test "$enable_prelink" = "yes" ; then PRELINK_CHECK=t; fi]) ++AC_SUBST(PRELINK_CHECK) ++ ++AC_ARG_ENABLE([vssize],[ --enable-vssize=XXXX will compile in a value stack of size XXX], ++ [AC_DEFINE_UNQUOTED(VSSIZE,$enableval,[value stack size])]) ++AC_ARG_ENABLE([bdssize],[ --enable-bdssize=XXXX will compile in a binding stack of size XXX], ++ [AC_DEFINE_UNQUOTED(BDSSIZE,$enableval,[binding stack size])]) ++AC_ARG_ENABLE([ihssize],[ --enable-ihssize=XXXX will compile in a invocation history stack of size XXX], ++ [AC_DEFINE_UNQUOTED(IHSSIZE,$enableval,[invocation history stack size])]) ++AC_ARG_ENABLE([frssize],[ --enable-frssize=XXXX will compile in a frame stack of size XXX], ++ [AC_DEFINE_UNQUOTED(FRSSIZE,$enableval,[frame stack size])]) ++ ++AC_ARG_ENABLE([infodir],[ --enable-infodir=XXXX will force the use of a INFO_DIR=XXXXX as place to look for info], ++ [INFO_DIR=$enableval],[INFO_DIR=$prefix/share/info]) ++INFO_DIR=`eval echo $INFO_DIR/` ++ ++AC_ARG_ENABLE([emacsdir],[ --enable-emacsdir=XXXX will manually specify the location for elisp files], ++ [EMACS_SITE_LISP=$enableval],[EMACS_SITE_LISP=$prefix/share/emacs/site-lisp]) ++EMACS_SITE_LISP=`eval echo $EMACS_SITE_LISP/` ++ ++AC_ARG_ENABLE([xgcl],[ --enable-xgcl=yes will compile in support for XGCL],,[enable_xgcl=yes]) + +-load_opt="0" ++AC_ARG_ENABLE([dlopen],[ --enable-dlopen uses dlopen for loading objects, which can then not be retained in saved images], ++ ,[enable_dlopen=$def_dlopen]) ++AC_ARG_ENABLE([statsysbfd],[ --enable-statsysbfd uses a static sytem bfd library for loading and relocationing object files], ++ ,[enable_statsysbfd=$def_statsysbfd]) ++AC_ARG_ENABLE([dynsysbfd],[ --enable-dynsysbfd uses a dynamic shared sytem bfd library for loading and relocationing object files], ++ ,[enable_dynsysbfd=no]) ++AC_ARG_ENABLE([custreloc],[ --enable-custreloc uses custom gcl code if available for loading and relocationing object files], ++ ,[enable_custreloc=$def_custreloc]) ++ ++AC_ARG_ENABLE([debug],[ --enable-debug builds gcl with -g in CFLAGS to enable running under gdb], ++ ,[enable_debug=$def_debug]) ++AC_ARG_ENABLE([static],[ --enable-static will link your GCL against static as opposed to shared system libraries], ++ ,[enable_static=$def_static]) ++AC_ARG_ENABLE([pic],[ --enable-pic builds gcl with -fPIC in CFLAGS],,[enable_pic=$def_pic]) ++ ++load_opt=0 + if test "$enable_dlopen" = "yes" ; then +- load_opt=1 ++ load_opt=1 + fi + if test "$enable_statsysbfd" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- esac ++ case $load_opt in ++ 0) load_opt=1;; ++ 1) load_opt=2;; ++ esac + fi + if test "$enable_dynsysbfd" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- 2) load_opt=3;; +- esac +-fi +-if test "$enable_locbfd" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- 2) load_opt=3;; +- 3) load_opt=4;; +- esac ++ case $load_opt in ++ 0) load_opt=1;; ++ 1) load_opt=2;; ++ 2) load_opt=3;; ++ esac + fi + if test "$enable_custreloc" = "yes" ; then +- case $load_opt in +- 0) load_opt=1;; +- 1) load_opt=2;; +- 2) load_opt=3;; +- 3) load_opt=4;; +- 4) load_opt=5;; +- esac ++ case $load_opt in ++ 0) load_opt=1;; ++ 1) load_opt=2;; ++ 2) load_opt=3;; ++ 3) load_opt=4;; ++ 4) load_opt=5;; ++ esac + fi + + if test "$load_opt" != "1" ; then +- echo "Exactly one loader option must be chosen: dlopen=$enable_dlopen statsysbfd=$enable_statsysbfd dynsysbfd=$enable_dynsysbfd locbfd=$enable_locbfd custreloc=$enable_custreloc" +- exit 1 ++ echo "Exactly one loader option must be chosen: dlopen=$enable_dlopen statsysbfd=$enable_statsysbfd dynsysbfd=$enable_dynsysbfd custreloc=$enable_custreloc" ++ AC_MSG_ERROR([loader option failure]) + fi + +-TLDFLAGS="" +-if test "$enable_static" = "yes" ; then +- TLDFLAGS="-static -Wl,-zmuldefs $TLDFLAGS"; #FIXME should be in unixport/makefile +- AC_DEFINE(STATIC_LINKING,1,[staticly linked images]) +-fi +-case $use in +- *gnuwin*) +- TLDFLAGS="$TLDFLAGS -Wl,--stack,8000000";; +-esac +- +-## finally warn if we did not find a recognized machine.s +-## +-#if test "$use" = "unknown" ; then +-#types=`echo h/*.defs` | sed -e "s:h/::g" -e "s:\.defs:g"` +-#echo got canonical=$canonical, but was not recognized. +-#echo Unable to guess type to use. Try one of +-#exit(1) +-#fi +- +-AC_MSG_RESULT([use=$use]) +- + + # + # System programs +@@ -462,221 +170,250 @@ AC_MSG_RESULT([use=$use]) + # We set the default CFLAGS below, and don't want the autoconf default + # CM 20040106 + if test "$CFLAGS" = "" ; then +- CFLAGS=" " ++ CFLAGS=" " + fi + if test "$LDFLAGS" = "" ; then +- LDFLAGS=" " ++ LDFLAGS=" " + fi + + AC_PROG_CC + AC_PROG_CPP + AC_SUBST(CC) ++GCL_CC=`basename $CC` ++if echo $GCL_CC |grep gcc |grep -q win; then ++ GCL_CC=gcc ++fi ++AC_SUBST(GCL_CC) + ++add_arg_to_tcflags() { ++ ++ local i=1 ++ AC_MSG_CHECKING([for CFLAG $1]) ++ CFLAGS_ORI=$CFLAGS ++ CFLAGS="$CFLAGS -Werror $1 `echo $1|sed 's,-Wno-,-W,1'`" ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM([[]],[[]])], ++ [TCFLAGS="$TCFLAGS $1";AC_MSG_RESULT([yes]);i=0], ++ [AC_MSG_RESULT([no])], ++ [AC_MSG_RESULT([no])]) ++ CFLAGS=$CFLAGS_ORI ++ return $i ++ ++} + +-# can only test for numbers -- CM +-# if test "${GCC}" -eq "yes" ; then +-#if [[ "${GCC}" = "yes" ]] ; then +-# Allog for environment variable overrides on compiler selection -- CM +-#GCC=$CC +-#else +-#GCC="" +-#fi +-# subst GCC not only under 386-linux, but where available -- CM +- +-TCFLAGS="-fsigned-char -fno-builtin-malloc -fno-builtin-free" +- +-if test "$GCC" = "yes" ; then +- +- TCFLAGS="$TCFLAGS -Wall" +- +- AC_MSG_CHECKING([for clang]) +- AC_RUN_IFELSE([ +- AC_LANG_SOURCE([[ +- int main() { +- return +- #ifdef __clang__ +- 0 +- #else +- 1 +- #endif +- ;}]])], +- [AC_MSG_RESULT([yes]) +- clang="yes" +- TCFLAGS="$TCFLAGS -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign" +- AC_DEFINE([CLANG],[1],[running clang compiler])], +- [AC_MSG_RESULT([no]) +- #FIXME -Wno-unused-but-set-variable when time +- TMPF=-Wno-unused-but-set-variable +- AC_MSG_CHECKING([for CFLAG $TMPF]) +- CFLAGS_ORI=$CFLAGS +- CFLAGS="$CFLAGS $TMPF" +- AC_TRY_RUN([int main() {return 0;}],TCFLAGS="$TCFLAGS $TMPF";AC_MSG_RESULT(yes),AC_MSG_RESULT(no),AC_MSG_RESULT(no)) +- CFLAGS=$CFLAGS_ORI]) +-fi ++assert_arg_to_tcflags() { ++ if ! add_arg_to_tcflags $1 ; then AC_MSG_RESULT([cannot add $1 to CFLAGS]); exit 1 ; fi ++ return 0 ++} + +-if test "$GCC" = "yes" ; then +- TCFLAGS="$TCFLAGS -pipe" +- case $use in +- *mingw*) +-# echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." +-# echo " It is otherwise needed for the Unexec stuff to work." +-# if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi +- TCFLAGS="$TCFLAGS -fno-zero-initialized-in-bss -mms-bitfields";; +- *gnuwin*) +-# echo "WARNING: Remove -fno-zero-initialized-in-bss from makedefs if gcc less than 3.3.1." +-# echo " It is otherwise needed for the Unexec stuff to work." +-# if test "$enable_debug" = "yes" ; then TCFLAGS="$TCFLAGS -gstabs" ; fi +- TCFLAGS="$TCFLAGS -fno-zero-initialized-in-bss -mms-bitfields";; +- esac +-fi +-#if test -f /proc/sys/kernel/exec-shield ; then +-# exec_stat=`cat /proc/sys/kernel/exec-shield` +-# if test "$exec_stat" != "0" ; then +-# # CFLAGS here to hopefully cover the DBEGIN routine below +-# CFLAGS="$CFLAGS -Wa,--execstack" +-# fi +-#fi ++add_args_to_tcflags() { ++ ++ while test "$#" -ge 1 ; do ++ add_arg_to_tcflags $1 ++ shift ++ done ++} ++ ++add_arg_to_tldflags() { ++ ++ local i=1 ++ AC_MSG_CHECKING([for LDFLAG $1]) ++ LDFLAGS_ORI=$LDFLAGS ++ LDFLAGS="$LDFLAGS -Werror $1" ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM([[]],[[]])], ++ [TLDFLAGS="$TLDFLAGS $1";AC_MSG_RESULT([yes]);i=0], ++ [AC_MSG_RESULT([no])], ++ [AC_MSG_RESULT([no])]) ++ LDFLAGS=$LDFLAGS_ORI ++ return $i ++ ++} ++ ++assert_arg_to_tldflags() { ++ if ! add_arg_to_tldflags $1 ; then AC_MSG_RESULT([cannot add $1 to LDFLAGS]); exit 1 ; fi ++ return 0 ++} ++ ++add_args_to_tldflags() { ++ ++ while test "$#" -ge 1 ; do ++ add_arg_to_tldflags $1 ++ shift ++ done ++} ++ ++remove_arg_from_ldflags() { ++ ++ NEW_LDFLAGS="" ++ for i in $LDFLAGS; do ++ if ! test "$i" = "$1" ; then ++ NEW_LDFLAGS="$NEW_LDFLAGS $i" ++ else ++ AC_MSG_RESULT([removing $1 from LDFLAGS]) ++ fi ++ done ++ LDFLAGS=$NEW_LDFLAGS ++ ++ return 0 ++ ++} ++ ++TCFLAGS="" ++add_args_to_tcflags -fsigned-char -pipe \ ++ -fno-builtin-malloc -fno-builtin-free \ ++ -fno-PIE -fno-pie -fno-PIC -fno-pic \ ++ -Wall \ ++ -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ ++ -Wno-unused-but-set-variable -Wno-misleading-indentation ++ ++TLDFLAGS="" ++add_args_to_tldflags -Wl,-no_pie -no-pie -Wl,-z,lazy ++ ++AC_MSG_CHECKING([for clang]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM([[ ++ #ifdef __clang__ ++ #define RET 0 ++ #else ++ #define RET 1 ++ #endif ++ ]], ++ [[ ++ return RET; ++ ]])], ++ [AC_MSG_RESULT([yes]) ++ clang="yes" ++ remove_arg_from_ldflags -pie ++ AC_DEFINE([CLANG],[1],[running clang compiler])], ++ [AC_MSG_RESULT([no])]) ++ ++case $use in ++ *mingw*) ++ assert_arg_to_tcflags -fno-zero-initialized-in-bss ++ assert_arg_to_tcflags -mms-bitfields;; ++ *gnuwin*) ++ assert_arg_to_tcflags -fno-zero-initialized-in-bss ++ assert_arg_to_tcflags -mms-bitfields ++ assert_arg_to_tldflags -Wl,--stack,8000000;; ++ 386-macosx) ++ assert_arg_to_tldflags -Wl,-no_pie ++ if test "$build_cpu" = "x86_64" ; then ++ assert_arg_to_tcflags -m64 ++ assert_arg_to_tldflags -m64 ++ assert_arg_to_tldflags -Wl,-headerpad,72 ++ else ++ assert_arg_to_tcflags -m32 ++ assert_arg_to_tldflags -m32 ++ assert_arg_to_tldflags -Wl,-headerpad,56 ++ fi;; ++ FreeBSD) assert_arg_to_tldflags -Z;; ++esac ++ ++if test "$enable_static" = "yes" ; then ++ assert_arg_to_tldflags -static ++ assert_arg_to_tldflags -Wl,-zmuldefs ++ AC_DEFINE(STATIC_LINKING,1,[staticly linked images]) ++fi + + TO3FLAGS="" + TO2FLAGS="" + +-#TFPFLAG="-fomit-frame-pointer" +-# FIXME -- remove when mingw compiler issues are fixed + case "$use" in +- *mingw*) ++ *mingw*) + TFPFLAG="";; +- m68k*)#FIXME gcc 4.x bug workaround ++ m68k*)#FIXME gcc 4.x bug workaround + TFPFLAG="";; +- *) ++ *) + TFPFLAG="-fomit-frame-pointer";; + esac + + AC_CHECK_PROGS(AWK,[gawk nawk awk]) + +-# Work around system/gprof mips/hppa hang +-AC_MSG_CHECKING([working gprof]) +-old_enable_gprof=$enable_gprof +-case $use in +- powerpc*) if test "$host_cpu" = "powerpc64le" ; then enable_gprof="no"; fi;; +- sh4*) enable_gprof="no";; +- ia64*) enable_gprof="no";; +-# mips*) enable_gprof="no";; +- hppa*) enable_gprof="no";; +- arm*) enable_gprof="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible +- *gnu) enable_gprof="no";; +-esac +-if test "$enable_gprof" = "$old_enable_gprof" ; then +- AC_MSG_RESULT([ok]) +-else +- AC_MSG_RESULT([disabled]) +-fi +- +-if test "$enable_gprof" = "yes" ; then +- AC_MSG_CHECKING(for text start) +- echo 'int main () {return(0);}' >foo.c +- $CC foo.c -o foo +- GCL_GPROF_START=`nm foo | $AWK '/ *[[TD]] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc +- rm -f foo.c foo +- if test "$GCL_GPROF_START" != "" ; then +- AC_MSG_RESULT($GCL_GPROF_START) +- AC_DEFINE_UNQUOTED(GCL_GPROF_START,$GCL_GPROF_START,[starting address for gprof]) +- case "$use" in +- arm*) +- #FIXME report and remove this when done +- AC_MSG_RESULT(Reducing optimization on profiling arm build to workaround gcc bug) +- enable_debug=yes;; +- esac +- TCFLAGS="$TCFLAGS -pg"; +- case $use in +- s390*) ;; # relocation truncation bug in gcc +- *) TLIBS="$TLIBS -pg";; +- esac +- TFPFLAG="" +- AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) +- else +- enable_gprof="no"; +- fi +-fi +- +-if $CC -v 2>&1 | tail -1 | grep "gcc version 4.6.1" >/dev/null ; then +- case "$use" in +- arm*) +- #FIXME report and remove this when done +- AC_MSG_RESULT(Reducing optimization on arm build to workaround gcc 4.6 bug) +- enable_debug=yes;; +- esac +-fi +- ++AC_ARG_ENABLE([gprof],[ --enable-gprof builds gcl with -pg in CFLAGS to enable profiling with gprof], ++ [if test "$enableval" = "yes" ; then ++ AC_MSG_CHECKING([working gprof]) ++ case $use in ++ powerpc*) if test "$host_cpu" = "powerpc64le" ; then enableval="no"; fi;; ++ sh4*) enableval="no";; ++ ia64*) enableval="no";; ++ hppa*) enableval="no";; ++ arm*) enableval="no";;#FIXME mcount compiled as a 24/22 bit reloc even with -mlong-calls, marginally accessible ++ *gnu) enableval="no";; ++ esac ++ if test "$enableval" != "yes" ; then ++ AC_MSG_RESULT([disabled]) ++ else ++ AC_MSG_RESULT([ok]) ++ AC_MSG_CHECKING([for text start]) ++ echo 'int main () {return(0);}' >foo.c ++ $CC foo.c -o foo ++ GCL_GPROF_START=`nm foo | $AWK '/ *[[TD]] *__*start$/ {print $NF}'` # D for ppc64 -- FIXME custreloc ++ rm -f foo.c foo ++ if test "$GCL_GPROF_START" != "" ; then ++ AC_MSG_RESULT($GCL_GPROF_START) ++ AC_DEFINE_UNQUOTED(GCL_GPROF_START,$GCL_GPROF_START,[starting address for gprof]) ++ assert_arg_to_tcflags -pg ++ case $use in ++ s390*) ;; # relocation truncation bug in gcc ++ *) TLIBS="$TLIBS -pg";; ++ esac ++ TFPFLAG="" ++ AC_DEFINE(GCL_GPROF,1,[use gprof profiling]) ++ fi ++ fi ++ fi]) + + if test "$enable_debug" = "yes" ; then +- TCFLAGS="$TCFLAGS -g" +- # for subconfigurations +- CFLAGS="$CFLAGS -g" ++ assert_arg_to_tcflags -g ++ # for subconfigurations ++ CFLAGS="$CFLAGS -g" + else +- TO3FLAGS="-O3 $TFPFLAG" +- TO2FLAGS="-O" ++ TO3FLAGS="-O3 $TFPFLAG" ++ TO2FLAGS="-O" + fi + + # gcc on ppc cannot compile our new_init.c with full opts --CM + TONIFLAGS="" + case $use in +- powerpc*macosx) +- TCFLAGS="$TCFLAGS -mlongcall";; +- *linux) ++ powerpc*macosx) assert_arg_to_tcflags -mlongcall;; ++ *linux) + case $use in +-# amd64*) # stack-boundary option does not work +-# TCFLAGS="$TCFLAGS -m64 -mpreferred-stack-boundary=8";; +- alpha*) +- TCFLAGS="$TCFLAGS -mieee" +- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1 +- ;; +-# m68k*) +-# TCFLAGS="$TCFLAGS -ffloat-store";; +- aarch64*) +- TLIBS="$TLIBS -lgcc_s";; +- hppa*) +- TCFLAGS="$TCFLAGS -mlong-calls " +- TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags +- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O2" ; TFPFLAG=""; fi #FIXME needed asof gcc 4.8.1 +-# TCFLAGS="$TCFLAGS -ffunction-sections" +-# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O $TFPFLAG" ; fi +-# if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi +- ;; +- mips*) +- case $canonical in +- mips64*linux*) +- TLIBS="$TLIBS -Wl,-z -Wl,now";; +- esac +-# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.6.2 +- ;; +- ia64*) +- if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 +- ;; +- arm*) +- TCFLAGS="$TCFLAGS -mlong-calls -fdollars-in-identifiers -g " +-# if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.6.2 +-# if test "$enable_debug" != "yes" ; then TO2FLAGS="-O" ; fi +- ;; +- powerpc*) +- TCFLAGS="$TCFLAGS -mlongcall" +- ;; +-# if $CC -v 2>&1 | grep -q "gcc version 3.2" ; then +-# echo Reducing optimization for buggy gcc-3.2 +-# if test "$enable_debug" != "yes" ; then TONIFLAGS="-O $TFPFLAG" ; fi +-# fi; +-# echo Probing for longcall +-# if ! $CC -v 2>&1 | $AWK '/^gcc version / {split($3,A,".");if (A[[1]]+0>3 || (A[[1]]+0>=3 && A[[2]]+0>=3)) exit 1;}'; then +-# echo Enabling longcall on gcc 3.3 or later +-# TCFLAGS="$TCFLAGS -mlongcall" +-# echo Reducing optimization for buggy gcc 3.3 or later +-# if test "$enable_debug" != "yes" ; then TONIFLAGS="-O $TFPFLAG" ; fi +-# fi;; ++ alpha*) ++ assert_arg_to_tcflags -mieee ++ if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1 ++ ;; ++ aarch64*) ++ TLIBS="$TLIBS -lgcc_s";; ++ hppa*) ++ assert_arg_to_tcflags -mlong-calls ++ TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags ++ if test "$enable_debug" != "yes" ; then TO3FLAGS="-O2" ; TFPFLAG=""; fi #FIXME needed asof gcc 4.8.1 ++ ;; ++ mips*) ++ case $canonical in ++ mips64*linux*) ++ assert_arg_to_tldflags -Wl,-z,now;; ++ esac ++ ;; ++ ia64*) ++ if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 ++ ;; ++ arm*) ++ assert_arg_to_tcflags -mlong-calls ++ assert_arg_to_tcflags -fdollars-in-identifiers ++ assert_arg_to_tcflags -g #? ++ ;; ++ powerpc*) ++ assert_arg_to_tcflags -mlongcall ++ ;; + esac;; + esac + if test "$enable_pic" = "yes" ; then +- TCFLAGS="$TCFLAGS -fPIC" ++ assert_arg_to_tcflags -fPIC + fi + ++ + FDEBUG=`echo $CFLAGS | tr ' ' '\012' |grep "^\-g$"|tr '\012' ' '` + #CFLAGS=`echo $CFLAGS | tr ' ' '\012' |grep -v "^\-g$"` + FOMITF=`echo $CFLAGS | tr ' ' '\012' |grep "^\-fomit-frame-pointer$"|tr '\012' ' '` +@@ -693,27 +430,27 @@ FOOPT0=`echo $CFLAGS | tr ' ' '\012' |gr + CFLAGS=`echo $CFLAGS | tr ' ' '\012' |grep -v "^\-O0$"|tr '\012' ' '` + + if test "$FOOPT0" != "" ; then +- TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[[123 ]],-O0 ,g' | sed 's,\-O$,-O0 ,g'` +- TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[[123 ]],-O0 ,g' | sed 's,\-O$,-O0 ,g'` +-else +-if test "$FOOPT1" != "" ; then +- TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[[2-3]],-O1,g'` +- TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[[2-3]],-O1,g'` ++ TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[[123 ]],-O0 ,g' | sed 's,\-O$,-O0 ,g'` ++ TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[[123 ]],-O0 ,g' | sed 's,\-O$,-O0 ,g'` + else +-if test "$FOOPT2" != "" ; then +- TO3FLAGS=`echo "$TO3FLAGS" | sed 's,\-O3,-O2,g'` +- TO2FLAGS=`echo "$TO2FLAGS" | sed 's,\-O3,-O2,g'` +-fi +-fi ++ if test "$FOOPT1" != "" ; then ++ TO3FLAGS=`echo $TO3FLAGS | sed 's,\-O[[2-3]],-O1,g'` ++ TO2FLAGS=`echo $TO2FLAGS | sed 's,\-O[[2-3]],-O1,g'` ++ else ++ if test "$FOOPT2" != "" ; then ++ TO3FLAGS=`echo "$TO3FLAGS" | sed 's,\-O3,-O2,g'` ++ TO2FLAGS=`echo "$TO2FLAGS" | sed 's,\-O3,-O2,g'` ++ fi ++ fi + fi + + if test "$FDEBUG" != "" ; then +- TO3FLAGS=`echo $TO3FLAGS | sed 's,\-fomit-frame-pointer,,g'` +- TO2FLAGS=`echo $TO2FLAGS | sed 's,\-fomit-frame-pointer,,g'` ++ TO3FLAGS=`echo $TO3FLAGS | sed 's,\-fomit-frame-pointer,,g'` ++ TO2FLAGS=`echo $TO2FLAGS | sed 's,\-fomit-frame-pointer,,g'` + fi + + if test "$FOMITF" != "" ; then +- TO3FLAGS="$TO3FLAGS $FOMITF" ++ TO3FLAGS="$TO3FLAGS $FOMITF" + fi + + # Step 1: set the variable "system" to hold the name and version number +@@ -731,12 +468,12 @@ if test -f /usr/lib/NextStep/software_ve + else + system=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then +- AC_MSG_RESULT([unknown (can't find uname command)]) ++ AC_MSG_RESULT([unknown (cannot find uname command)]) + system=unknown + else + # Special check for weird MP-RAS system (uname returns weird + # results, and the version is kept in special file). +- ++ + if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then + system="MP-RAS-`${AWK} '{print $3}' '/etc/.relid'`" + fi +@@ -748,156 +485,130 @@ else + fi + + case $use in +- *macosx) ++ *macosx) + AC_CHECK_HEADERS(malloc/malloc.h,,[AC_MSG_ERROR([need malloc.h on macosx])]) + AC_CHECK_MEMBER([struct _malloc_zone_t.memalign], +- AC_DEFINE(HAVE_MALLOC_ZONE_MEMALIGN,1,[memalign element present]), [], +- [ +- #include +- ]) ++ AC_DEFINE(HAVE_MALLOC_ZONE_MEMALIGN,1,[memalign element present]), [], ++ [ ++ #include ++ ]) + AC_SUBST(HAVE_MALLOC_ZONE_MEMALIGN) + ;; + esac + +- +-AC_CHECK_HEADERS(setjmp.h, +- AC_MSG_CHECKING([sizeof jmp_buf]) +- AC_RUN_IFELSE([ +- AC_LANG_SOURCE([[ +- #include +- #include +- int main() { +- FILE *fp=fopen("conftest1","w"); +- fprintf(fp,"%lu\n",sizeof(jmp_buf)); +- fclose(fp); +- return 0; +- }]])], +- [sizeof_jmp_buf=`cat conftest1` +- AC_MSG_RESULT($sizeof_jmp_buf) +- AC_DEFINE_UNQUOTED(SIZEOF_JMP_BUF,$sizeof_jmp_buf,[sizeof jmp_buf])], +- [AC_MSG_RESULT(no)])) ++AC_CHECK_HEADERS( ++ [setjmp.h], ++ [AC_MSG_CHECKING([sizeof jmp_buf]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ FILE *fp=fopen("conftest1","w"); ++ fprintf(fp,"%lu\n",sizeof(jmp_buf)); ++ fclose(fp); ++ ]])], ++ [sizeof_jmp_buf=`cat conftest1` ++ AC_MSG_RESULT($sizeof_jmp_buf) ++ AC_DEFINE_UNQUOTED(SIZEOF_JMP_BUF,$sizeof_jmp_buf,[sizeof jmp_buf])], ++ [AC_MSG_RESULT([no])])]) + + # sysconf ++AC_CHECK_HEADERS( ++ [unistd.h], ++ [AC_CHECK_LIB( ++ [c],[sysconf], ++ [AC_MSG_CHECKING([_SC_CLK_TCK]) ++ hz=0 ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ FILE *fp=fopen("conftest1","w"); ++ fprintf(fp,"%lu\n",sysconf(_SC_CLK_TCK)); ++ fclose(fp); ++ ]], ++ [hz=`cat conftest1` ++ AC_DEFINE_UNQUOTED(HZ,$hz,[time system constant])])]) ++ AC_MSG_RESULT($hz)])]) + +-AC_CHECK_HEADERS(unistd.h, +- AC_CHECK_LIB(c,sysconf, +- AC_MSG_CHECKING(_SC_CLK_TCK) +- AC_TRY_RUN([#include +- #include +- int +- main() { +- FILE *fp=fopen("conftest1","w"); +- fprintf(fp,"%lu\n",sysconf(_SC_CLK_TCK)); +- fclose(fp); +- return 0; +- }], +- hz=`cat conftest1` +- AC_DEFINE_UNQUOTED(HZ,$hz,[time system constant]) +- ,hz=0,hz=0) +- [AC_MSG_RESULT($hz)] +- dnl AC_MSG_CHECKING(_SC_PHYS_PAGES) +- dnl AC_RUN_IFELSE([ +- dnl AC_LANG_SOURCE([[ +- dnl #include +- dnl #include +- dnl int main() { +- dnl FILE *fp=fopen("conftest1","w"); +- dnl fprintf(fp,"%lu\n",sysconf(_SC_PHYS_PAGES)); +- dnl fclose(fp); +- dnl return 0; +- dnl }]])], +- dnl [phys=`cat conftest1` +- dnl AC_MSG_RESULT($phys) +- dnl AC_DEFINE(HAVE_SYSCONF_PHYS_PAGES,$phys,[probe runtime phys pages for gc performance])], +- dnl [AC_MSG_RESULT(no)]) +- )) +- +- +-#MY_SUBDIRS= +- +-# +-# GMP +-# + + rm -f makedefsafter + +-MP_INCLUDE="" +-if test $use_gmp = yes ; then ++AC_ARG_ENABLE([dynsysgmp], ++ [ --enable-dynsysgmp will link against the system libgmp3 overriding certain functions with patched versions from the local source]) + +- PATCHED_SYMBOLS="" +- if test "$enable_dynsysgmp" = "yes" ; then +- AC_CHECK_HEADERS(gmp.h, +- AC_CHECK_LIB(gmp,__gmpz_init, +- AC_MSG_CHECKING("for external gmp version") +- AC_TRY_RUN([#include +- int main() { +- #if __GNU_MP_VERSION > 3 +- return 0; +- #else +- return -1; +- #endif +- }], +-# MPFILES=$GMPDIR/mpn/mul_n.o +-# PATCHED_SYMBOLS=__gmpn_toom3_mul_n +- MPFILES= +- PATCHED_SYMBOLS= +-# if test "$use" = "m68k-linux" ; then +-# MPFILES="$MPFILES $GMPDIR/mpn/lshift.o $GMPDIR/mpn/rshift.o" +-# PATCHED_SYMBOLS="$PATCHED_SYMBOLS __gmpn_lshift __gmpn_rshift" +-# fi +- TLIBS="$TLIBS -lgmp" +- echo "#include \"gmp.h\"" >foo.c +- echo "int main() {return 0;}" >>foo.c +- MP_INCLUDE=`cpp foo.c | $AWK '/(\/|\\\\)gmp.h/ {if (!i) print $3;i=1}' | tr -d '"'` +- rm -f foo.c, +- echo "Cannot use dynamic gmp lib" , echo "Cannot use dynamic gmp lib" ), +- echo "Cannot use dynamic gmp lib" ,), +- echo "Cannot use dynamic gmp lib" ,) +-fi +- +-NEED_LOCAL_GMP='' +-if test "$MP_INCLUDE" = "" ; then +- NEED_LOCAL_GMP=1; +-fi +-if test "$PATCHED_SYMBOLS" != "" ; then +- NEED_LOCAL_GMP=1; ++if test "$enable_dynsysgmp" != "no" ; then ++ AC_CHECK_HEADERS( ++ [gmp.h], ++ [AC_CHECK_LIB( ++ [gmp],[__gmpz_init], ++ [AC_MSG_CHECKING([for external gmp version]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ #if __GNU_MP_VERSION > 3 ++ return 0; ++ #else ++ return -1; ++ #endif ++ ]])], ++ [AC_MSG_RESULT([good]) ++ TLIBS="$TLIBS -lgmp" ++ echo "#include \"gmp.h\"" >foo.c ++ echo "int main() {return 0;}" >>foo.c ++ MP_INCLUDE=`cpp foo.c | $AWK '/(\/|\\\\)gmp.h/ {if (!i) print $3;i=1}' | tr -d '"'` ++ rm -f foo.c])])]) ++ ++ if test "$MP_INCLUDE" = "" ; then ++ AC_MSG_RESULT([Cannot use dynamic gmp lib]) ++ fi ++ + fi + +-if test "$NEED_LOCAL_GMP" != "" ; then +- +- GMPDIR=gmp4 +- AC_MSG_CHECKING([use_gmp=yes, doing configure in gmp directory]) +- echo +- echo "#" +- echo "#" +- echo "# -------------------" +- echo "# Subconfigure of GMP" +- echo "#" +- echo "#" +- +- if test "$use_common_binary" = "yes"; then +- cd $GMPDIR && ./configure --build=$host && cd .. +- else +- cd $GMPDIR && ./configure && cd .. +- fi +- #MY_SUBDIRS="$MY_SUBDIRS $GMPDIR" +- +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of GMP done" +- echo "# ------------------------" +- echo "#" +- +- if test "$MP_INCLUDE" = "" ; then +- cp $GMPDIR/gmp.h h/gmp.h +- MP_INCLUDE=h/gmp.h +- MPFILES=gmp_all +- fi + ++if test "$MP_INCLUDE" = "" ; then ++ ++ GMPDIR=gmp4 ++ AC_MSG_CHECKING([doing configure in gmp directory]) ++ echo ++ echo "#" ++ echo "#" ++ echo "# -------------------" ++ echo "# Subconfigure of GMP" ++ echo "#" ++ echo "#" ++ ++ if test "$use_common_binary" = "yes"; then ++ cd $GMPDIR && ./configure --build=$host && cd .. ++ else ++ cd $GMPDIR && ./configure --host=$host --build=$build && cd .. ++ fi ++ #MY_SUBDIRS="$MY_SUBDIRS $GMPDIR" ++ ++ echo "#" ++ echo "#" ++ echo "#" ++ echo "# Subconfigure of GMP done" ++ echo "# ------------------------" ++ echo "#" ++ ++ if test "$MP_INCLUDE" = "" ; then ++ cp $GMPDIR/gmp.h h/gmp.h ++ MP_INCLUDE=h/gmp.h ++ MPFILES=gmp_all ++ fi + fi + +-AC_MSG_CHECKING("for leading underscore in object symbols") ++AC_MSG_CHECKING([for leading underscore in object symbols]) + cat>foo.c < + #include +@@ -905,12 +616,12 @@ int main() {FILE *f;double d=0.0;getc(f) + EOFF + $CC -c foo.c -o foo.o + if nm foo.o |grep " U " | grep "_cos" >/dev/null || nm foo.o |grep " U " | grep " _getc" >/dev/null ; then +- LEADING_UNDERSCORE=1 +- AC_DEFINE(LEADING_UNDERSCORE,1,[symbol name mangling convention]) +- AC_MSG_RESULT("yes") ++ LEADING_UNDERSCORE=1 ++ AC_DEFINE(LEADING_UNDERSCORE,1,[symbol name mangling convention]) ++ AC_MSG_RESULT("yes") + else +- LEADING_UNDERSCORE="" +- AC_MSG_RESULT("no") ++ LEADING_UNDERSCORE="" ++ AC_MSG_RESULT("no") + fi + + +@@ -918,61 +629,63 @@ AC_MSG_CHECKING("for GNU ld option -Map" + touch map + $CC -o foo [ -Wl,-Map ] map foo.o >/dev/null 2>&1 + if test `cat map | wc -l` != "0" ; then +- AC_MSG_RESULT("yes") +- AC_DEFINE(HAVE_GNU_LD,1,[gnu linker present]) +- GNU_LD=1 ++ AC_MSG_RESULT("yes") ++ AC_DEFINE(HAVE_GNU_LD,1,[gnu linker present]) ++ GNU_LD=1 + else +- AC_MSG_RESULT("no") +- GNU_LD= ++ AC_MSG_RESULT("no") ++ GNU_LD= + fi + rm -f foo.c foo.o foo map + + AC_MSG_CHECKING([for size of gmp limbs]) + AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- #include "$MP_INCLUDE" +- ]],[[ +- FILE *fp=fopen("conftest1","w"); +- fprintf(fp,"%u",sizeof(mp_limb_t)); +- fclose(fp); +- return 0; +- ]])],[mpsize=`cat conftest1`],[AC_MSG_ERROR([Cannot determine mpsize])]) ++ #include ++ #include "$MP_INCLUDE" ++ ]], ++ [[ ++ FILE *fp=fopen("conftest1","w"); ++ fprintf(fp,"%u",sizeof(mp_limb_t)); ++ fclose(fp); ++ ]])],[mpsize=`cat conftest1`],[AC_MSG_ERROR([Cannot determine mpsize])]) + AC_DEFINE_UNQUOTED(MP_LIMB_BYTES,$mpsize,[sizeof mp_limb in gmp library]) + AC_MSG_RESULT($mpsize) + + AC_MSG_CHECKING([_SHORT_LIMB]) + AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- #include "$MP_INCLUDE" +- ]],[[ +- #ifdef _SHORT_LIMB +- return 0; +- #else +- return 1; +- #endif +- ]])],[AC_DEFINE(__SHORT_LIMB,1,[short gmp3 limbs]) AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)]) ++ #include ++ #include "$MP_INCLUDE" ++ ]], ++ [[ ++ #ifdef _SHORT_LIMB ++ return 0; ++ #else ++ return 1; ++ #endif ++ ]])],[AC_DEFINE(__SHORT_LIMB,1,[short gmp3 limbs]) AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)]) + + AC_MSG_CHECKING([_LONG_LONG_LIMB]) + AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- #include "$MP_INCLUDE" +- ]],[[ +- #ifdef _LONG_LONG_LIMB +- return 0; +- #else +- return 1; +- #endif +- ]])],[AC_DEFINE(__LONG_LONG_LIMB,1,[long gmp3 limbs]) AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)]) +- +- GMP=1 +- AC_DEFINE(GMP,1,[using gmp]) +- AC_SUBST(GMP) +- AC_SUBST(GMPDIR) +- echo > makedefsafter +- echo "MPFILES=$MPFILES" >> makedefsafter +- echo "PATCHED_SYMBOLS=$PATCHED_SYMBOLS" >> makedefsafter +- echo >> makedefsafter +-fi ++ #include ++ #include "$MP_INCLUDE" ++ ]], ++ [[ ++ #ifdef _LONG_LONG_LIMB ++ return 0; ++ #else ++ return 1; ++ #endif ++ ]])],[AC_DEFINE(__LONG_LONG_LIMB,1,[long gmp3 limbs]) AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)]) ++ ++GMP=1 ++AC_DEFINE(GMP,1,[using gmp]) ++AC_SUBST(GMP) ++AC_SUBST(GMPDIR) ++echo > makedefsafter ++echo "MPFILES=$MPFILES" >> makedefsafter ++echo "PATCHED_SYMBOLS=$PATCHED_SYMBOLS" >> makedefsafter ++echo >> makedefsafter ++ + + + # +@@ -980,30 +693,13 @@ fi + # + + if test "$enable_xgcl" = "yes" ; then +- +- AC_PATH_X +-# AC_PATH_XTRA +-# echo $X_CFLAGS +-# echo $X_LIBS +-# echo $X_EXTRA_LIBS +-# echo $X_PRE_LIBS +- +- miss=0 +-# AC_CHECK_LIB(Xmu,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS)#FIXME remove these +-# AC_CHECK_LIB(Xt,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS) +-# AC_CHECK_LIB(Xext,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS) +-# AC_CHECK_LIB(Xaw,main,X_LIBS="$X_LIBS",miss=1,$X_LIBS)#until here +- AC_CHECK_LIB(X11,main,X_LIBS="$X_LIBS -lX11",miss=1,$X_LIBS) +- +- if test "$miss" = "1" ; then +- X_CFLAGS= +- X_LIBS= +- X_EXTRA_LIBS= +- X_PRE_LIBS= +- echo missing x libraries -- cannot compile xgcl +- else +- AC_DEFINE(HAVE_XGCL,1,[using xgcl]) +- fi ++ ++ AC_PATH_X ++ ++ AC_CHECK_LIB(X11,main, ++ [X_LIBS="$X_LIBS -lX11" AC_DEFINE(HAVE_XGCL,1,[using xgcl])], ++ [AC_MSG_RESULT([missing x libraries -- cannot compile xgcl])]) ++ + fi + + +@@ -1015,225 +711,194 @@ AC_SUBST(X_CFLAGS) + # + + if test "$enable_dlopen" = "yes" ; then ++ ++ AC_CHECK_LIB([dl],[dlopen],,AC_MSG_ERROR([Cannot find dlopen])) ++ ++ TLIBS="$TLIBS -ldl -rdynamic" ++ assert_arg_to_tcflags -fPIC ++ AC_DEFINE(USE_DLOPEN,1,[link compiled objects via libdl]) + +- AC_CHECK_LIB(dl,dlopen,have_dl=1,have_dl=0) +- if test "$have_dl" = "0" ; then +- echo "Cannot find dlopen in -dl" +- exit 1 +- fi +-dnl AC_SEARCH_LIBS(dlopen, dl, have_dl=1, AC_ERROR(dlopen not found)) +-dnl LIBS and TLIBS - why not merged from the beginning? +- +- TLIBS="$TLIBS -ldl -rdynamic" +- TCFLAGS="-fPIC $TCFLAGS" +-dnl TLIBS="$TLIBS -rdynamic" +- AC_DEFINE(USE_DLOPEN,1,[link compiled objects via libdl]) + fi + + if test "$enable_statsysbfd" = "yes" || test "$enable_dynsysbfd" = "yes" ; then +- AC_CHECK_HEADERS(bfd.h, +- AC_CHECK_LIB(bfd,bfd_init, +- # +- # Old binutils appear to need CONST defined to const +- # +- AC_MSG_CHECKING(if need to define CONST for bfd) +- AC_TRY_RUN([#define IN_GCC +- #include +- int main() { symbol_info t; return 0;}], +- AC_MSG_RESULT(no), +- AC_TRY_RUN([#define CONST const +- #define IN_GCC +- #include +- int main() {symbol_info t; return 0;}], +- AC_MSG_RESULT(yes) +- AC_DEFINE(NEED_CONST,1,[binutils requires CONST definition]), +- AC_MSG_ERROR([cannot use bfd]), +- AC_MSG_ERROR([cannot use bfd])), +- AC_MSG_ERROR([cannot use bfd])) +- ,,-liberty)) +- +- AC_DEFINE(HAVE_LIBBFD,1,[use libbfd]) +- +-# +-# BFD boolean syntax +-# +- +- AC_MSG_CHECKING(for useable bfd_boolean) +- AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #define IN_GCC +- #include +- bfd_boolean foo() {return FALSE;} +- ]],[[return 0;]])], +- [AC_MSG_RESULT(yes) +- AC_DEFINE(HAVE_BFD_BOOLEAN,1,[bfd_boolean defined])], +- [AC_MSG_RESULT(no)]) +- +-# +-# bfd_link_info.output_bfd minimal configure change check +-# +- +- AC_CHECK_MEMBER([struct bfd_link_info.output_bfd], +- AC_DEFINE(HAVE_OUTPUT_BFD,1,[output_bfd element present]), [], +- [ +- #include +- #include +- ]) +- AC_SUBST(HAVE_OUTPUT_BFD) +- +-# +-# FIXME: Need to workaround mingw before this point -- CM +-# +- if test "$enable_statsysbfd" = "yes" && ! $CC -v 2>&1 | fgrep ming > /dev/null ; then +- echo 'int main() {bfd_init();bfd_openr("/dev/null",0);return 0;}' >foo.c +- MP=`$CC [ -Wl,-M ] -static -o foo foo.c -lbfd -liberty -ldl 2>&1 | grep -v : | tr '()' '\012\012' | $AWK '{print $NF}' | sort | uniq` +- rm -f foo.c foo +- if echo $MP | tr ' ' '\012' | grep libbfd.a >/dev/null; then +- LIBBFD="`echo $MP | tr ' ' '\012' | grep libbfd.a | $AWK '{i=split($1,A,"/");for (j=1;j<=i;j++) if (j>1 && A[[j]]=="..") {j--;i-=2;for (k=j;k<=i;k++) A[[k]]=A[[k+2]];j--;}} END {for (j=1;j<=i;j++) printf("%s%s",A[[j]],j!=i ? "/" : "")}'`" +- else +- AC_MSG_ERROR([cannot locate external libbfd.a]) +- fi +- if echo $MP | tr ' ' '\012' | grep libiberty.a >/dev/null ; then +- LIBIBERTY="`echo $MP | tr ' ' '\012' | grep libiberty.a | $AWK '{i=split($1,A,"/");for (j=1;j<=i;j++) if (j>1 && A[[j]]=="..") {j--;i-=2;for (k=j;k<=i;k++) A[[k]]=A[[k+2]];j--;}} END {for (j=1;j<=i;j++) printf("%s%s",A[[j]],j!=i ? "/" : "")}'`" +- else +- AC_MSG_ERROR([cannot locate external libiberty.a]) +- fi +- BUILD_BFD=copy_bfd +- AC_CHECK_LIB(z,inflate, +- [TLIBS="$TLIBS -lz"], +- AC_MSG_ERROR([Need zlib for bfd linking]),[]) +- AC_CHECK_LIB(dl,dlsym, +- [TLIBS="$TLIBS -ldl"], +- AC_MSG_ERROR([Need libdl for bfd linking]),[]) +- AC_SUBST(BUILD_BFD) +- AC_SUBST(LIBBFD) +- AC_SUBST(LIBIBERTY) +- ++ AC_CHECK_HEADERS( ++ [bfd.h], ++ AC_CHECK_LIB( ++ [bfd],[bfd_init], ++ # ++ # Old binutils appear to need CONST defined to const ++ # ++ AC_MSG_CHECKING([need to define CONST for bfd]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #define IN_GCC ++ #include ++ ]], ++ [[ ++ symbol_info t; ++ ]])], ++ AC_MSG_RESULT([no]), ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #define CONST const ++ #define IN_GCC ++ #include ++ ]], ++ [[ ++ symbol_info t; ++ ]])], ++ AC_MSG_RESULT([yes]) ++ AC_DEFINE(NEED_CONST,1,[binutils requires CONST definition]), ++ AC_MSG_ERROR([cannot use bfd]), ++ AC_MSG_ERROR([cannot use bfd])), ++ AC_MSG_ERROR([cannot use bfd])) ++ ,,-liberty)) ++ ++ AC_DEFINE(HAVE_LIBBFD,1,[use libbfd]) ++ ++ # ++ # BFD boolean syntax ++ # ++ ++ AC_MSG_CHECKING(for useable bfd_boolean) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #define IN_GCC ++ #include ++ bfd_boolean foo() {return FALSE;} ++ ]], ++ [[]])], ++ [AC_MSG_RESULT(yes) ++ AC_DEFINE(HAVE_BFD_BOOLEAN,1,[bfd_boolean defined])], ++ [AC_MSG_RESULT(no)]) ++ ++ # ++ # bfd_link_info.output_bfd minimal configure change check ++ # ++ ++ AC_CHECK_MEMBER([struct bfd_link_info.output_bfd], ++ AC_DEFINE(HAVE_OUTPUT_BFD,1,[output_bfd element present]), [], ++ [[ ++ #include ++ #include ++ ]]) ++ AC_SUBST(HAVE_OUTPUT_BFD) ++ ++ # ++ # FIXME: Need to workaround mingw before this point -- CM ++ # ++ if test "$enable_statsysbfd" = "yes" && ! $CC -v 2>&1 | fgrep ming > /dev/null ; then ++ echo 'int main() {bfd_init();bfd_openr("/dev/null",0);return 0;}' >foo.c ++ MP=`$CC [ -Wl,-M ] -static -o foo foo.c -lbfd -liberty -ldl 2>&1 | grep -v : | tr '()' '\012\012' | $AWK '{print $NF}' | sort | uniq` ++ rm -f foo.c foo ++ if echo $MP | tr ' ' '\012' | grep libbfd.a >/dev/null; then ++ LIBBFD="`echo $MP | tr ' ' '\012' | grep libbfd.a | $AWK '{i=split($1,A,\"/\");for (j=1;j<=i;j++) if (j>1 && A[[j]]==\"..\") {j--;i-=2;for (k=j;k<=i;k++) A[[k]]=A[[k+2]];j--;}} END {for (j=1;j<=i;j++) printf(\"%s%s\",A[[j]],j!=i ? \"/\" : \"\")}'`" + else +- TLIBS="$TLIBS -lbfd -liberty -ldl" +- fi +-fi +- +-if test "$enable_locbfd" = "yes" ; then +- +- # check for gettext. It is part of glibc, but others +- # need GNU gettext separately. +-# AC_CHECK_HEADERS(libintl.h, true, +-# AC_MSG_ERROR(libintl.h (gettext) not found)) +-# AC_SEARCH_LIBS(dgettext, intl, true, AC_MSG_ERROR(gettext library not found)) +- +- echo "#" +- echo "#" +- echo "# -------------------------" +- echo "# Subconfigure of LIBINTL" +- echo "#" +- echo "#" +- cd binutils/intl && chmod +x configure && ./configure --disable-nls && cd ../.. +-# MY_SUBDIRS="$MY_SUBDIRS binutils/libiberty " +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of LIBINTL done" +- echo "# ------------------------------" +- echo "#" +- echo "#" +- echo "#" +- echo "# -------------------------" +- echo "# Subconfigure of LIBIBERTY" +- echo "#" +- echo "#" +- cd binutils/libiberty && chmod +x configure && ./configure --disable-nls && cd ../.. +-# MY_SUBDIRS="$MY_SUBDIRS binutils/libiberty " +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of LIBIBERTY done" +- echo "# ------------------------------" +- echo "#" +- echo "#" +- echo "#" +- echo "# -------------------" +- echo "# Subconfigure of BFD" +- echo "#" +- echo "#" +- cd binutils/bfd && chmod +x configure && ./configure --with-included-gettext --disable-nls && cd ../.. +-# MY_SUBDIRS="$MY_SUBDIRS binutils/bfd " +- echo "#" +- echo "#" +- echo "#" +- echo "# Subconfigure of BFD done" +- echo "# ------------------------" +- echo "#" +-# TLIBS="$TLIBS `pwd`/binutils/bfd/libbfd.a `pwd`/binutils/libiberty/libiberty.a" +- AC_DEFINE(HAVE_LIBBFD,1,[use libbfd]) +- BUILD_BFD="h/bfd.h h/bfdlink.h h/ansidecl.h h/symcat.h" ++ AC_MSG_ERROR([cannot locate external libbfd.a]) ++ fi ++ if echo $MP | tr ' ' '\012' | grep libiberty.a >/dev/null ; then ++ LIBIBERTY="`echo $MP | tr ' ' '\012' | grep libiberty.a | $AWK '{i=split($1,A,\"/\");for (j=1;j<=i;j++) if (j>1 && A[[j]]==\"..\") {j--;i-=2;for (k=j;k<=i;k++) A[[k]]=A[[k+2]];j--;}} END {for (j=1;j<=i;j++) printf(\"%s%s\",A[[j]],j!=i ? \"/\" : \"\")}'`" ++ else ++ AC_MSG_ERROR([cannot locate external libiberty.a]) ++ fi ++ BUILD_BFD=copy_bfd ++ AC_CHECK_LIB(z,inflate, ++ [TLIBS="$TLIBS -lz"], ++ AC_MSG_ERROR([Need zlib for bfd linking]),[]) ++ AC_CHECK_LIB(dl,dlsym, ++ [TLIBS="$TLIBS -ldl"], ++ AC_MSG_ERROR([Need libdl for bfd linking]),[]) + AC_SUBST(BUILD_BFD) ++ AC_SUBST(LIBBFD) ++ AC_SUBST(LIBIBERTY) ++ ++ else ++ TLIBS="$TLIBS -lbfd -liberty -ldl" ++ fi + fi + ++AC_ARG_ENABLE([xdr],[ --enable-xdr=yes will compile in support for XDR]) + +-if test "$enable_xdr" = "yes" ; then +- AC_CHECK_FUNC(xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]), +- AC_CHECK_LIB(tirpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) +- TLIBS="$TLIBS -ltirpc" TCFLAGS="$TCFLAGS -I/usr/include/tirpc", +- AC_CHECK_LIB(gssrpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) +- TLIBS="$TLIBS -lgssrpc" TCFLAGS="$TCFLAGS -I/usr/include/gssrpc", +- AC_CHECK_LIB(rpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) +- TLIBS="$TLIBS -lrpc" TCFLAGS="$TCFLAGS -I/usr/include/rpc", +- AC_CHECK_LIB(oncrpc,xdr_double,AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) +- TLIBS="$TLIBS -loncrpc" TCFLAGS="$TCFLAGS -I/usr/include/oncrpc"))))) ++if test "$enable_xdr" != "no" ; then ++ XDR_LIB="" ++ AC_CHECK_FUNC([xdr_double],XDR_LIB=" ", ++ [AC_CHECK_LIB([tirpc],[xdr_double],[XDR_LIB=tirpc], ++ [AC_CHECK_LIB([gssrpc],[xdr_double],[XDR_LIB=gssrpc], ++ [AC_CHECK_LIB([rpc],[xdr_double],[XDR_LIB=rpc], ++ [AC_CHECK_LIB([oncrpc],[xdr_double],[XDR_LIB=oncrpc])])])])]) ++ ++ if test "$XDR_LIB" != ""; then ++ AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) ++ if test "$XDR_LIB" != " "; then ++ TLIBS="$TLIBS -l$XDR_LIB" ++ add_arg_to_tcflags -I/usr/include/$XDR_LIB ++ fi ++ fi + fi + + + AC_MSG_CHECKING([__builtin_clzl]) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- int main() { +- unsigned long u; +- long j; +- if (__builtin_clzl(0)!=sizeof(long)*8) +- return -1; +- for (u=1,j=sizeof(long)*8-1;j>=0;j--,u<<=1) +- if (__builtin_clzl(u)!=j) +- return -1; +- return 0; +- }]])],[AC_MSG_RESULT([yes]) +- AC_DEFINE(HAVE_CLZL,[1],[clzl instruction])], +- [AC_MSG_RESULT([no])]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ unsigned long u; ++ long j; ++ if (__builtin_clzl(0)!=sizeof(long)*8) ++ return -1; ++ for (u=1,j=sizeof(long)*8-1;j>=0;j--,u<<=1) ++ if (__builtin_clzl(u)!=j) ++ return -1; ++ ]])], ++ [AC_MSG_RESULT([yes]) ++ AC_DEFINE(HAVE_CLZL,[1],[clzl instruction])], ++ [AC_MSG_RESULT([no])]) + + AC_MSG_CHECKING([__builtin_ctzl]) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- int main() { +- unsigned long u; +- long j; +- if (__builtin_ctzl(0)!=sizeof(long)*8) +- return -1; +- for (u=1,j=0;j ++ #include ++ ]], ++ [[ ++ unsigned long u; ++ long j; ++ if (__builtin_ctzl(0)!=sizeof(long)*8) ++ return -1; ++ for (u=1,j=0;j +- #include +- #ifdef __CYGWIN__ +- #define getpagesize() 4096 +- #endif +- ]],[[ +- size_t i=getpagesize(),j; +- FILE *fp=fopen("conftest1","w"); +- for (j=0;i>>=1;j++); +- j=j<$min_pagewidth ? $min_pagewidth : j; +- fprintf(fp,"%u",j); +- return 0; +- ]])], +- [PAGEWIDTH=`cat conftest1`], +- [PAGEWIDTH=0]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ #ifdef __CYGWIN__ ++ #define getpagesize() 4096 ++ #endif ++ ]], ++ [[ ++ size_t i=getpagesize(),j; ++ FILE *fp=fopen("conftest1","w"); ++ for (j=0;i>>=1;j++); ++ j=j<$min_pagewidth ? $min_pagewidth : j; ++ fprintf(fp,"%u",j); ++ ]])], ++ [PAGEWIDTH=`cat conftest1`], ++ [PAGEWIDTH=0]) + AC_MSG_RESULT($PAGEWIDTH) + AC_DEFINE_UNQUOTED(PAGEWIDTH,$PAGEWIDTH,[system pagewidth]) + AC_SUBST(PAGEWIDTH) + + AC_MSG_CHECKING([for required object alignment]) +-AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- #define EXTER +- #define INLINE +- #include "$MP_INCLUDE" +- #include "./h/enum.h" +- #define OBJ_ALIGN +- #include "./h/type.h" +- #include "./h/lu.h" +- #include "./h/object.h" +- ]],[[ +- unsigned long i; +- FILE *fp=fopen("conftest1","w"); +- for (i=1;i && NOT_OBJECT_ALIGNED(i); i<<=1); +- if (!i) return -1; +- fprintf(fp,"%lu",i); +- fclose(fp); +- return 0; +- ]])], +- [obj_align=`cat conftest1` +- AC_MSG_RESULT($obj_align) +- AC_DEFINE_UNQUOTED(OBJ_ALIGNMENT,$obj_align,[needed object alignment in bytes])], +- [AC_MSG_ERROR([Cannot find object alignent])]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #define EXTER ++ #define INLINE ++ #include "$MP_INCLUDE" ++ #include "./h/enum.h" ++ #define OBJ_ALIGN ++ #include "./h/type.h" ++ #include "./h/lu.h" ++ #include "./h/object.h" ++ ]], ++ [[ ++ unsigned long i; ++ FILE *fp=fopen("conftest1","w"); ++ for (i=1;i && NOT_OBJECT_ALIGNED(i); i<<=1); ++ if (!i) return -1; ++ fprintf(fp,"%lu",i); ++ fclose(fp); ++ return 0; ++ ]])], ++ [obj_align=`cat conftest1` ++ AC_MSG_RESULT($obj_align) ++ AC_DEFINE_UNQUOTED(OBJ_ALIGNMENT,$obj_align,[needed object alignment bytes])], ++ [AC_MSG_ERROR([Cannot find object alignent])]) + + AC_MSG_CHECKING([for C extension variable alignment]) +-AC_RUN_IFELSE([AC_LANG_PROGRAM([[]],[[ +- char *v __attribute__ ((aligned ($obj_align))); +- return 0;]])],[obj_align="__attribute__ ((aligned ($obj_align)))"],[AC_MSG_ERROR([Need alignment attributes])]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM([[]], ++ [[ ++ char *v __attribute__ ((aligned ($obj_align))); ++ ]])],[obj_align="__attribute__ ((aligned ($obj_align)))"],[AC_MSG_ERROR([Need alignment attributes])]) + AC_MSG_RESULT($obj_align) + AC_DEFINE_UNQUOTED(OBJ_ALIGN,$obj_align,[can use C extension for object alignment]) + + AC_MSG_CHECKING([for C extension noreturn function attribute]) +-AC_RUN_IFELSE([AC_LANG_PROGRAM([[]],[[ +- extern int v() __attribute__ ((noreturn)); +- return 0;]])],[no_return="__attribute__ ((noreturn))"],[no_return=]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM([[]], ++ [[ ++ extern int v() __attribute__ ((noreturn)); ++ ]])], ++ [no_return="__attribute__ ((noreturn))"],[no_return=]) + AC_MSG_RESULT($no_return) + AC_DEFINE_UNQUOTED(NO_RETURN,$no_return,[can use C extension for functions that do not return]) + +-AC_MSG_CHECKING(sizeof struct contblock) ++AC_MSG_CHECKING([sizeof struct contblock]) ++ ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #define EXTER ++ #define INLINE ++ #include "$MP_INCLUDE" ++ #include "h/enum.h" ++ #include "h/type.h" ++ #include "h/lu.h" ++ #include "h/object.h" ++ ]], ++ [[ ++ FILE *f=fopen("conftest1","w"); ++ fprintf(f,"%u",sizeof(struct contblock)); ++ fclose(f); ++ ]])], ++ [sizeof_contblock=`cat conftest1`], ++ [AC_MSG_ERROR([Cannot find sizeof struct contblock])], ++ [AC_MSG_ERROR([Cannot find sizeof struct contblock])]) + +-# work around MSYS pwd result incompatibility +-if test "$use" = "mingw" ; then +-AC_TRY_RUN([#include +- #define EXTER +- #define INLINE +- #include "$MP_INCLUDE" +- #include "h/enum.h" +- #include "h/type.h" +- #include "h/lu.h" +- #include "h/object.h" +- int main(int argc,char **argv,char **envp) { +- FILE *f=fopen("conftest1","w"); +- fprintf(f,"%u",sizeof(struct contblock)); +- fclose(f); +- return 0; +- }],sizeof_contblock=`cat conftest1`, +- echo Cannot find sizeof struct contblock;exit 1, +- echo Cannot find sizeof struct contblock;exit 1) +-else +-AC_TRY_RUN([#include +- #define EXTER +- #define INLINE +- #include "$MP_INCLUDE" +- #include "`pwd`/h/enum.h" +- #include "`pwd`/h/type.h" +- #include "`pwd`/h/lu.h" +- #include "`pwd`/h/object.h" +- int main(int argc,char **argv,char **envp) { +- FILE *f=fopen("conftest1","w"); +- fprintf(f,"%u",sizeof(struct contblock)); +- fclose(f); +- return 0; +- }],sizeof_contblock=`cat conftest1`, +- echo Cannot find sizeof struct contblock;exit 1, +- echo Cannot find sizeof struct contblock;exit 1) +-fi + AC_MSG_RESULT($sizeof_contblock) + AC_DEFINE_UNQUOTED(SIZEOF_CONTBLOCK,$sizeof_contblock,[sizeof linked list for contiguous pages]) + + AC_MSG_CHECKING([for sbrk]) + HAVE_SBRK="" +-AC_TRY_RUN([#include +- #include +- int main() { ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ + FILE *f; + if (!(f=fopen("conftest1","w"))) +- return -1; +- fprintf(f,"%u",sbrk(0)); +- return 0; +- }], +- HAVE_SBRK=1 +- AC_MSG_RESULT(yes), +- AC_MSG_RESULT([no: WARNING you must be able to emulate sbrk: as on mingw or macosx]), +- AC_MSG_RESULT([no: WARNING you must be able to emulate sbrk: as on mingw or macosx])) ++ return -1; ++ fprintf(f,"%u",sbrk(0)); ++ ]])], ++ [HAVE_SBRK=1;AC_MSG_RESULT([yes])], ++ AC_MSG_RESULT([no: WARNING you must be able to emulate sbrk: as on mingw or macosx]), ++ AC_MSG_RESULT([no: WARNING you must be able to emulate sbrk: as on mingw or macosx])) + + if test "$use" = "386-macosx" ; then +- AC_MSG_RESULT(emulating sbrk for mac); +- HAVE_SBRK=0 ++ AC_MSG_RESULT([emulating sbrk for mac]); ++ HAVE_SBRK=0 + fi + + if test "$HAVE_SBRK" = "1" ; then +- +- AC_MSG_CHECKING([for ADDR_NO_RANDOMIZE constant]) +- AC_RUN_IFELSE([ +- AC_LANG_PROGRAM([[ +- #include +- #include +- ]],[[ +- FILE *f; +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%x",ADDR_NO_RANDOMIZE); +- return 0; +- ]])], ++ ++ AC_MSG_CHECKING([for ADDR_NO_RANDOMIZE constant]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ FILE *f; ++ if (!(f=fopen("conftest1","w"))) return -1; ++ fprintf(f,"%x",ADDR_NO_RANDOMIZE); ++ ]])], + [ADDR_NO_RANDOMIZE=`cat conftest1` +- AC_MSG_RESULT([yes $ADDR_NO_RANDOMIZE])], ++ AC_MSG_RESULT([yes $ADDR_NO_RANDOMIZE])], + [ADDR_NO_RANDOMIZE=0 +- AC_MSG_RESULT([no assuming 0x40000]) +- AC_DEFINE_UNQUOTED(ADDR_NO_RANDOMIZE,0x40000,[punt guess for no randomize value])]) +- +- AC_MSG_CHECKING([for ADDR_COMPAT_LAYOUT constant]) +- AC_RUN_IFELSE([ +- AC_LANG_PROGRAM([[ +- #include +- #include +- ]],[[ +- FILE *f; +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%x",ADDR_COMPAT_LAYOUT); +- return 0; +- ]])], ++ AC_MSG_RESULT([no assuming 0x40000]) ++ AC_DEFINE_UNQUOTED(ADDR_NO_RANDOMIZE,0x40000,[punt guess for no randomize value])]) ++ ++ AC_MSG_CHECKING([for ADDR_COMPAT_LAYOUT constant]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ FILE *f; ++ if (!(f=fopen("conftest1","w"))) return -1; ++ fprintf(f,"%x",ADDR_COMPAT_LAYOUT); ++ ]])], + [ADDR_COMPAT_LAYOUT=`cat conftest1` +- AC_MSG_RESULT([yes $ADDR_COMPAT_LAYOUT])], ++ AC_MSG_RESULT([yes $ADDR_COMPAT_LAYOUT])], + [ADDR_COMPAT_LAYOUT=0 +- AC_MSG_RESULT([no])] ++ AC_MSG_RESULT([no])] + AC_DEFINE_UNQUOTED(ADDR_COMPAT_LAYOUT,0,[constant to reserve upper 3Gb for C stack])) +- +- AC_MSG_CHECKING([for ADDR_LIMIT_3GB constant]) +- AC_RUN_IFELSE([ +- AC_LANG_PROGRAM([[ +- #include +- #include +- ]],[[ +- FILE *f; +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%x",ADDR_LIMIT_3GB); +- return 0; +- ]])], ++ ++ AC_MSG_CHECKING([for ADDR_LIMIT_3GB constant]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ FILE *f; ++ if (!(f=fopen("conftest1","w"))) return -1; ++ fprintf(f,"%x",ADDR_LIMIT_3GB); ++ ]])], + [ADDR_LIMIT_3GB=`cat conftest1` +- AC_MSG_RESULT([yes $ADDR_LIMIT_3GB])], ++ AC_MSG_RESULT([yes $ADDR_LIMIT_3GB])], + [ADDR_LIMIT_3GB=0 +- AC_MSG_RESULT([no])] ++ AC_MSG_RESULT([no])] + AC_DEFINE_UNQUOTED(ADDR_LIMIT_3GB,0,[only 3Gb of address space])) +- +- AC_MSG_CHECKING([for personality(ADDR_NO_RANDOMIZE) support]) +- AC_RUN_IFELSE([ +- AC_LANG_SOURCE([[ +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- #include "h/unrandomize.h" +- return 0;}]])], ++ ++ AC_MSG_CHECKING([for personality(ADDR_NO_RANDOMIZE) support]) ++ AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ int main(int argc,char *argv[],char *envp[]) { ++ #include "h/unrandomize.h" ++ return 0; ++ } ++ ]])], + [AC_MSG_RESULT(yes) +- AC_DEFINE(CAN_UNRANDOMIZE_SBRK,1,[can prevent sbrk from returning random values])], ++ AC_DEFINE(CAN_UNRANDOMIZE_SBRK,1,[can prevent sbrk from returning random values])], + [AC_MSG_RESULT(no)]) + +- AC_MSG_CHECKING([that sbrk is (now) non-random]) +- AC_TRY_RUN([#include +- #include ++ AC_MSG_CHECKING([that sbrk is (now) non-random]) ++ SBRK=0 ++ AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" + #endif +- if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%u",sbrk(0)); +- return 0;}],SBRK=`cat conftest1`,SBRK=0,SBRK=0) +- if test "$SBRK" = "0" ; then +- AC_MSG_RESULT(cannot trap sbrk) +- exit 1 +- fi +- AC_TRY_RUN([#include +- #include ++ if (!(f=fopen("conftest1","w"))) ++ return -1; ++ fprintf(f,"%u",sbrk(0)); ++ return 0; ++ } ++ ]])],[SBRK=`cat conftest1`]) ++ if test "$SBRK" = "0" ; then ++ AC_MSG_ERROR([cannot trap sbrk]) ++ fi ++ ++ SBRK1=0 ++ AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include + int main(int argc,char * argv[],char * envp[]) { + FILE *f; + #ifdef CAN_UNRANDOMIZE_SBRK + #include "h/unrandomize.h" + #endif + if (!(f=fopen("conftest1","w"))) return -1; +- fprintf(f,"%u",sbrk(0)); +- return 0;}],SBRK1=`cat conftest1`,SBRK1=0,SBRK1=0) +- if test "$SBRK1" = "0" ; then +- AC_MSG_RESULT(cannot trap sbrk) +- exit 1 +- fi +- if test "$SBRK" = "$SBRK1" ; then +- AC_MSG_RESULT(yes) +- else +- AC_MSG_RESULT(no) +- echo "Cannot build with randomized sbrk. Your options:" +- echo " - upgrade to a kernel/libc that knows about personality(ADDR_NO_RANDOMIZE)" +- echo " - recompile your kernel with CONFIG_COMPAT_BRK (if it has that option)" +- echo " - run sysctl kernel.randomize_va_space=0 before using gcl" +- exit 1 +- fi ++ fprintf(f,"%u",sbrk(0)); ++ return 0; ++ } ++ ]])],[SBRK1=`cat conftest1`]) ++ if test "$SBRK1" = "0" ; then ++ AC_MSG_ERROR([cannot trap sbrk]) ++ fi ++ if test "$SBRK" = "$SBRK1" ; then ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++ echo "Cannot build with randomized sbrk. Your options:" ++ echo " - upgrade to a kernel/libc that knows about personality(ADDR_NO_RANDOMIZE)" ++ echo " - recompile your kernel with CONFIG_COMPAT_BRK (if it has that option)" ++ echo " - run sysctl kernel.randomize_va_space=0 before using gcl" ++ AC_MSG_ERROR([exiting]) ++ fi + fi +- +-dnl AC_MSG_CHECKING(DBEGIN) +-dnl AC_RUN_IFELSE([AC_LANG_SOURCE([[ +-dnl #include +-dnl #include +-dnl #include +-dnl void gprof_cleanup() {}; +- +-dnl int main(int argc,char **argv,char **envp) { +- +-dnl void *b; +-dnl FILE *fp; +- +-dnl #ifdef CAN_UNRANDOMIZE_SBRK +-dnl #include "h/unrandomize.h" +-dnl #endif +- +-dnl fp = fopen("conftest1","w"); +- +-dnl #ifdef _WIN32 +-dnl fprintf ( fp,"0x%lx", 0x3000000 ); /* Windows custom allocation from this point up */ +-dnl #else +-dnl #if defined (__APPLE__) && defined (__MACH__) +-dnl fprintf(fp,"0x0"); +-dnl #else +-dnl b = sbrk(0); +-dnl fprintf(fp,"0x%lx",((unsigned long) b) & ~(unsigned long)((1< +-dnl #include +-dnl ]],[[ +-dnl FILE *fp=fopen("conftest1","w"); +-dnl fprintf(fp,"%u",262144*( SIZEOF_LONG >>2)/(1<<($PAGEWIDTH-12))); +-dnl return 0;]])],[def_maxpage=`cat conftest1`],[def_maxpage=262144]) +- +-dnl AC_ARG_ENABLE(maxpage, +-dnl [ --enable-maxpage=XXXX will compile in a page table of size XXX +-dnl (eg '--enable-maxpage=64*1024' would produce +-dnl 64K pages allowing 256 MB if pages are 4K each)], +-dnl ,enable_maxpage=$def_maxpage) +- +- + AC_MSG_CHECKING(CSTACK_ADDRESS) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- void * +- foo() { +- int i; +- return (void *)&i; +- } +- +- int main(int argc,char **argv,char **envp) { +- void *v ; +- FILE *fp = fopen("conftest1","w"); +- unsigned long i,j; +- +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- j=1; +- j<<=$PAGEWIDTH; +- j<<=16; +- i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- fprintf(fp,"0x%lx",i-1); +- fclose(fp); +- return 0; +-}]])],[cstack_address=`cat conftest1`],[cstack_address=0]) ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ void * ++ foo() { ++ int i; ++ return (void *)&i; ++ } ++ ++ int ++ main(int argc,char **argv,char **envp) { ++ void *v ; ++ FILE *fp = fopen("conftest1","w"); ++ unsigned long i,j; ++ ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ j=1; ++ j<<=$PAGEWIDTH; ++ j<<=16; ++ i=(unsigned long)&v; ++ if (foo()>i) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ fprintf(fp,"0x%lx",i-1); ++ fclose(fp); ++ return 0; ++ }]])], ++ [cstack_address=`cat conftest1`],[cstack_address=0]) + AC_DEFINE_UNQUOTED(CSTACK_ADDRESS,$cstack_address,[starting C stack address]) + AC_MSG_RESULT($cstack_address) + + AC_MSG_CHECKING([cstack bits]) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- void * +- foo() { +- int i; +- return (void *)&i; +- } +- +- int main(int argc,char **argv,char **envp) { +- void *v ; +- FILE *fp = fopen("conftest1","w"); +- unsigned long i,j; +- +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- j=1; +- j<<=$PAGEWIDTH; +- j<<=16; +- i=(unsigned long)&v; +- if (foo()>i) i-=j; +- j--; +- i+=j; +- i&=~j; +- for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); +- fprintf(fp,"%d",j); +- fclose(fp); +- return 0; +-}]])],[cstack_bits=`cat conftest1`],[cstack_bits=0]) ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ void * ++ foo() { ++ int i; ++ return (void *)&i; ++ } ++ ++ int ++ main(int argc,char **argv,char **envp) { ++ void *v ; ++ FILE *fp = fopen("conftest1","w"); ++ unsigned long i,j; ++ ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ j=1; ++ j<<=$PAGEWIDTH; ++ j<<=16; ++ i=(unsigned long)&v; ++ if (foo()>i) i-=j; ++ j--; ++ i+=j; ++ i&=~j; ++ for (j=0;(i>>j)!=(i>>(sizeof(long)*8-1));j++); ++ fprintf(fp,"%d",j); ++ fclose(fp); ++ return 0; ++ }]])], ++ [cstack_bits=`cat conftest1`],[cstack_bits=0]) + AC_DEFINE_UNQUOTED(CSTACK_BITS,$cstack_bits,[log starting C stack address]) + AC_MSG_RESULT($cstack_bits) + + AC_MSG_CHECKING(NEG_CSTACK_ADDRESS) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- return (long)$cstack_address<0 ? 0 : -1; +-}]])],[AC_MSG_RESULT(yes) +- neg_cstack_address=1 +- AC_DEFINE(NEG_CSTACK_ADDRESS,1,[C stack address is negative])], +- [AC_MSG_RESULT(no) +- neg_cstack_address=0]) +- ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ int ++ main(int argc,char **argv,char **envp) { ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ return (long)$cstack_address<0 ? 0 : -1; ++ }]])], ++ [AC_MSG_RESULT(yes) ++ neg_cstack_address=1 ++ AC_DEFINE(NEG_CSTACK_ADDRESS,1,[C stack address is negative])], ++ [AC_MSG_RESULT(no) ++ neg_cstack_address=0]) + + AC_MSG_CHECKING([finding CSTACK_ALIGNMENT]) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- int main(int argc,char **argv,char **envp) { +- void *b,*c; +- FILE *fp = fopen("conftest1","w"); +- long n; +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- b=alloca(sizeof(b)); +- c=alloca(sizeof(c)); +- n=b>c ? b-c : c-b; +- n=n>sizeof(c) ? n : 1; +- fprintf(fp,"%ld",n); +- fclose(fp); +- return 0; +-}]])],[cstack_alignment=`cat conftest1`],[cstack_alignment=0]) ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ int main(int argc,char **argv,char **envp) { ++ void *b,*c; ++ FILE *fp = fopen("conftest1","w"); ++ long n; ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ b=alloca(sizeof(b)); ++ c=alloca(sizeof(c)); ++ n=b>c ? b-c : c-b; ++ n=n>sizeof(c) ? n : 1; ++ fprintf(fp,"%ld",n); ++ fclose(fp); ++ return 0; ++ }]])], ++ [cstack_alignment=`cat conftest1`],[cstack_alignment=0]) + AC_DEFINE_UNQUOTED(CSTACK_ALIGNMENT,$cstack_alignment,[C stack alignment]) + AC_MSG_RESULT($cstack_alignment) + + AC_MSG_CHECKING(CSTACK_DIRECTION) +-AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- #include +- #include +- void * +- foo(void) { +- int i; +- return (void *)&i; +- } +- +- int main(int argc,char **argv,char **envp) { +- char *b; +- FILE *fp = fopen("conftest1","w"); +- #ifdef CAN_UNRANDOMIZE_SBRK +- #include "h/unrandomize.h" +- #endif +- fprintf(fp,"%d",((long) &b) > ((long) foo()) ? -1 : 1); +- fclose(fp); +- return 0; +-}]])],[cstack_direction=`cat conftest1`],[cstack_direction=0]) ++AC_RUN_IFELSE( ++ [AC_LANG_SOURCE( ++ [[ ++ #include ++ #include ++ void * ++ foo(void) { ++ int i; ++ return (void *)&i; ++ } ++ ++ int ++ main(int argc,char **argv,char **envp) { ++ char *b; ++ FILE *fp = fopen("conftest1","w"); ++ #ifdef CAN_UNRANDOMIZE_SBRK ++ #include "h/unrandomize.h" ++ #endif ++ fprintf(fp,"%d",((long) &b) > ((long) foo()) ? -1 : 1); ++ fclose(fp); ++ return 0; ++ }]])], ++ [cstack_direction=`cat conftest1`],[cstack_direction=0]) + AC_DEFINE_UNQUOTED(CSTACK_DIRECTION,$cstack_direction,[whether C stack grows up or down]) + AC_MSG_RESULT($cstack_direction) + ++AC_ARG_ENABLE([immfix],[ --enable-immfix will enable an immediate fixnum table above the C stack]) + +-dnl AC_MSG_CHECKING(for shared library/C stack ceiling to heap) +-dnl if test "$use" = "mingw" ; then +-dnl heap_ceiling=2000000000 +-dnl else +-dnl if test "$use" = "solaris-i386" ; then +-dnl heap_ceiling=0x0 +-dnl else +-dnl if test "$enable_static" = "yes" ; then +-dnl heap_ceiling=0x0 +-dnl else +-dnl if ! test -x `which ldd` && ! test -f /proc/self/maps ; then +-dnl heap_ceiling=0x0 +-dnl else +-dnl if test -f /proc/self/maps ; then +-dnl heap_ceiling=0x`/bin/cat /proc/self/maps | grep "/lib.*/ld-" | cut -f1 -d- | head -1` +-dnl else +-dnl if test "`which ldd`" = "" ; then +-dnl heap_ceiling=0x0 +-dnl else +-dnl #echo -e "#include \n int main() {printf(\"foo\");return 0;}" >foo.c +-dnl #$CC foo.c -o foo +-dnl AAWK=`which awk` +-dnl # | grep -v ld-kfreebsd needed on some strange bsd amd64 boxes +-dnl heap_ceiling=`ldd $AAWK | tail -n 1 | $AWK '{print $NF}' | tr -d '()'` +-dnl fi +-dnl fi +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl ]],[[ +-dnl FILE *fp=fopen("conftest1","w"); +-dnl unsigned long h=$heap_ceiling,d=$dbegin,c=$cstack_address; +-dnl h=hd && cfoo.c +-dnl else +-dnl echo "int main() {return !($heap_ceiling && (unsigned long)$dbegin < (unsigned long)$cstack_address);}" >foo.c +-dnl fi +-dnl $CC foo.c -o foo +-dnl if ./foo ; then ++AC_ARG_ENABLE([fastimmfix],[ --enable-fastimmfix=XXXX will reject low immediate fixnums unless 2^XXX can be attained],,[enable_fastimmfix=64]) + +-if test "$use" != "386-gnu" ; then #hurd can push .data below C stack, but sbrk(0) remains above, foiling unexec + +- AC_MSG_CHECKING([finding default linker script]) +- touch unixport/gcl.script +- echo "int main() {return 0;}" >foo.c +- $CC -Wl,--verbose foo.c -o foo 2>&1 | \ +- $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script +- rm -rf foo.c foo +- +- if test "`cat gcl.script | wc -l`" != "0" ; then +- AC_MSG_RESULT(got it) +- AC_MSG_NOTICE([trying to adjust text start]) +- cp gcl.script gcl.script.def +- +- n=-1; +- k=0; +- lim=`$AWK 'END {printf("%d\n",m*8-2)}' m=$ac_cv_sizeof_long`; +- max=0; +- min=$lim; +- while test $n -lt $lim ; do +- j=`$AWK 'END {for (i=j=0;j<=n;j++) i=i ? i*2 : 1;printf("%x\n",3*i)}' n=$n gcl.script +-# diff -u gcl.script.def gcl.script +- echo "int main() {return 0;}" >foo.c +- if ( $CC -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then +- if test $n -lt $min ; then min=$n; fi; +- if test $n -gt $max; then max=$n; fi; +- elif test $max -gt 0 ; then +- break; +- fi; +- n=`$AWK 'END {print n+1}' n=$n foo.c ++ $CC $TLDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ ++ $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script ++ rm -rf foo.c foo ++ ++ if test "`cat gcl.script | wc -l`" != "0" ; then ++ AC_MSG_RESULT(got it) ++ AC_MSG_NOTICE([trying to adjust text start]) ++ cp gcl.script gcl.script.def ++ ++ n=-1; ++ k=0; ++ lim=`$AWK 'END {printf("%d\n",m*8-2)}' m=$ac_cv_sizeof_long`; ++ max=0; ++ min=$lim; ++ while test $n -lt $lim ; do ++ j=`$AWK 'END {for (i=j=0;j<=n;j++) i=i ? i*2 : 1;printf("%x\n",3*i)}' n=$n gcl.script ++ # diff -u gcl.script.def gcl.script ++ echo "int main() {return 0;}" >foo.c ++ if ( $CC $TLDFLAGS -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then ++ if test $n -lt $min ; then min=$n; fi; ++ if test $n -gt $max; then max=$n; fi; ++ elif test $max -gt 0 ; then ++ break; ++ fi; ++ n=`$AWK 'END {print n+1}' n=$n gcl.script + AC_MSG_RESULT([done]) + rm -f gcl.script.def + LDFLAGS="$LDFLAGS -Wl,-T gcl.script " + cp gcl.script unixport +- else +- AC_MSG_RESULT([none found or not needed]) +- rm -f gcl.script gcl.script.def +- fi +- rm -rf foo.c foo +- else +- AC_MSG_RESULT([not found]) +- fi +- ++ else ++ AC_MSG_RESULT([none found or not needed]) ++ rm -f gcl.script gcl.script.def ++ fi ++ rm -rf foo.c foo ++ else ++ AC_MSG_RESULT([not found]) ++ fi ++ + else +- +- AC_DEFINE_UNQUOTED(OBJNULL,NULL,[lowest address non-object]) +- ++ ++ AC_DEFINE_UNQUOTED(OBJNULL,NULL,[lowest address non-object]) ++ + fi + +- dnl old_LDFLAGS="$LDFLAGS" +- dnl LDFLAGS="$LDFLAGS $TLDFLAGS" +- dnl AC_MSG_CHECKING([revised DBEGIN]) +- dnl AC_RUN_IFELSE([AC_LANG_SOURCE([[ +- dnl #include +- dnl #include +- dnl #include +- +- dnl int main(int argc,char **argv,char **envp) { +- +- dnl void *b; +- dnl FILE *fp; +- +- dnl #ifdef CAN_UNRANDOMIZE_SBRK +- dnl #include "h/unrandomize.h" +- dnl #endif +- dnl fp = fopen("conftest1","w"); +- +- dnl #ifdef _WIN32 +- dnl fprintf ( fp,"0x%lx", 0x1a000000 ); /* Windows custom allocation from this point up */ +- dnl #else +- dnl #if defined (__APPLE__) && defined (__MACH__) +- dnl fprintf(fp,"((unsigned long)get_dbegin())"); +- dnl #else +- dnl b = sbrk(0); +- dnl fprintf(fp,"0x%lx",((unsigned long) b) & ~(unsigned long)0xffffff); +- dnl #endif +- dnl #endif +- dnl fclose(fp); +- dnl return 0;}]])],[dbegin=`cat conftest1`],[dbegin=0]) +- dnl AC_MSG_RESULT($dbegin) +- dnl LDFLAGS="$old_LDFLAGS" +-dnl fi +-dnl dnl AC_DEFINE_UNQUOTED(DBEGIN,$dbegin,[down-rounded beginning address of lisp data]) +-dnl rm -rf foo* +- +-dnl AC_MSG_CHECKING(for maxpage revision) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl ]],[[ +-dnl char *b; +-dnl unsigned long i,j; +-dnl FILE *fp = fopen("conftest1","w"); +-dnl j=((unsigned long)$enable_maxpage <<$PAGEWIDTH) + $dbegin; +-dnl j=$heap_ceiling && j>$heap_ceiling ? $heap_ceiling : j; +-dnl j-=$dbegin; +-dnl /* for (i=1;i<<1 && i<=j;i<<=1); */ +-dnl /* if (i>j) i>>=1; */ +-dnl i=j; +-dnl fprintf(fp,"%ld",i>>$PAGEWIDTH); +-dnl fclose(fp); +-dnl return 0; +-dnl ]])],[tmp_maxpage=`cat conftest1`],[tmp_maxpage=0]) +-dnl if test "$tmp_maxpage" != "$enable_maxpage" ; then +-dnl enable_maxpage=$tmp_maxpage +-dnl AC_MSG_RESULT($enable_maxpage) +-dnl else +-dnl AC_MSG_RESULT($enable_maxpage is OK) +-dnl fi +-dnl AC_DEFINE_UNQUOTED(MAXPAGE,$enable_maxpage,[maximum number of pages to be allocated]) +- +-dnl AC_MSG_CHECKING(for C stack size floor from heap) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl ]],[[ +-dnl char *b; +-dnl FILE *fp = fopen("conftest1","w"); +-dnl unsigned long j,k; +- +-dnl j=$cstack_address + $cstack_direction * $enable_cssize; +-dnl k=($dbegin + ((unsigned long)$enable_maxpage << $PAGEWIDTH)); +-dnl j=abs(j-$cstack_address)!=$enable_cssize || (j +-dnl ]],[[ +-dnl char *b; +-dnl FILE *fp = fopen("conftest1","w"); +-dnl unsigned long j,k; +- +-dnl j=$cstack_address + $cstack_direction * $enable_cssize; +-dnl if ($cstack_direction>0) { +-dnl k=$cstack_address + ((-(unsigned long)$cstack_address)>>1); +-dnl j=j<$cstack_address || j > k ? k : j; +-dnl j=$cstack_address < $dbegin && j > $dbegin ? $dbegin : j; +-dnl } +-dnl j-=$cstack_address; +-dnl j*=$cstack_direction; +-dnl fprintf(fp,"%lu",j); +-dnl fclose(fp); +-dnl return 0; +-dnl ]])],[tmp_cssize=`cat conftest1`],[tmp_cssize=0]) +-dnl if test "$tmp_cssize" != "$enable_cssize" ; then +-dnl enable_cssize=$tmp_cssize; +-dnl AC_MSG_RESULT($enable_cssize) +-dnl else +-dnl AC_MSG_RESULT($enable_cssize is OK) +-dnl fi +- +-dnl AC_MSG_CHECKING(for C stack size limit from address wrap) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl ]],[[ +-dnl char *b; +-dnl FILE *fp = fopen("conftest1","w"); +-dnl unsigned long j,k; +- +-dnl j=-$cstack_address * $cstack_direction; +-dnl j=j>$enable_cssize ? $enable_cssize : j; +-dnl fprintf(fp,"%lu",j); +-dnl fclose(fp); +-dnl return 0; +-dnl ]])],[tmp_cssize=`cat conftest1`],[tmp_cssize=0]) +-dnl if test "$tmp_cssize" != "$enable_cssize" ; then +-dnl enable_cssize=$tmp_cssize; +-dnl AC_MSG_RESULT($enable_cssize) +-dnl else +-dnl AC_MSG_RESULT($enable_cssize is OK) +-dnl fi +-dnl AC_DEFINE_UNQUOTED(CSSIZE,$enable_cssize,[maximum C stack size]) +- +-dnl AC_MSG_CHECKING(for fast NULL_OR_ON_CSTACK macro) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl ]],[[ +-dnl return ((long)$dbegin>=0 && +-dnl ((long)$dbegin+(long)($enable_maxpage<<$PAGEWIDTH)) >=0 && +-dnl ((long)$cstack_address<0)) ? 0 : 1; +-dnl ]])],[tmp_fnocm=yes],[tmp_fnocm=no]) +-dnl if test "$tmp_fnocm" = "yes" ; then +-dnl AC_MSG_RESULT(yes) +-dnl AC_DEFINE(USE_FAST_NULL_OR_ON_CSTACK_MACRO,1,[whether one instruction heap address check can be used]) +-dnl else +-dnl AC_MSG_RESULT(no) +-dnl fi +- + mem_top=0 + mem_range=0 + AC_MSG_CHECKING(mem top) +-AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- ]],[[ +- void *v; +- unsigned long i,j,k,l,m; +- FILE *fp = fopen("conftest1","w"); +- +- for (i=2,k=1;i;k=i,i<<=1); +- l=$cstack_address; +- l=$cstack_direction==1 ? (l>=1,i|=j); +- if (j<(k>>3)) i=0; +- j=1; +- j<<=$PAGEWIDTH; +- j<<=4; +- j--; +- i+=j; +- i&=~j; +- fprintf(fp,"0x%lx",i); +- fclose(fp); +- return 0; +-]])],[mem_top=`cat conftest1`],[mem_top="0x0"]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ void *v; ++ unsigned long i,j,k,l,m; ++ FILE *fp = fopen("conftest1","w"); ++ ++ for (i=2,k=1;i;k=i,i<<=1); ++ l=$cstack_address; ++ l=$cstack_direction==1 ? (l>=1,i|=j); ++ if (j<(k>>3)) i=0; ++ j=1; ++ j<<=$PAGEWIDTH; ++ j<<=4; ++ j--; ++ i+=j; ++ i&=~j; ++ fprintf(fp,"0x%lx",i); ++ fclose(fp); ++ return 0; ++ ]])], ++ [mem_top=`cat conftest1`],[mem_top="0x0"]) + AC_MSG_RESULT($mem_top) ++ + if test "$mem_top" != "0x0" ; then +- AC_MSG_CHECKING(finding upper mem half range) +- AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- ]],[[ +- unsigned long j; +- FILE *fp = fopen("conftest1","w"); +- +- for (j=1;j && !(j& $mem_top);j<<=1); +- fprintf(fp,"0x%lx",j>>1); +- fclose(fp); +- return 0; +- ]])],[mem_range=`cat conftest1`],[mem_range="0x0"]) +- AC_MSG_RESULT($mem_range) +- if test "$mem_range" != "0x0" ; then ++ AC_MSG_CHECKING(finding upper mem half range) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ unsigned long j; ++ FILE *fp = fopen("conftest1","w"); ++ ++ for (j=1;j && !(j& $mem_top);j<<=1); ++ fprintf(fp,"0x%lx",j>>1); ++ fclose(fp); ++ return 0; ++ ]])], ++ [mem_range=`cat conftest1`],[mem_range="0x0"]) ++ AC_MSG_RESULT($mem_range) ++ if test "$mem_range" != "0x0" ; then + AC_DEFINE_UNQUOTED(MEM_TOP,$mem_top,[beginning address for immediate fixnum range]) + AC_DEFINE_UNQUOTED(MEM_RANGE,$mem_range,[size of immediate fixnum address space]) +- fi ++ fi + fi + +-if test "$enable_immfix" = "yes" ; then +- if test "$mem_top" != "0x0" ; then +- if test "$mem_range" != "0x0" ; then +- AC_DEFINE_UNQUOTED(IM_FIX_BASE,$mem_top,[beginning address for immediate fixnum range]) +- AC_DEFINE_UNQUOTED(IM_FIX_LIM,$mem_range,[size of immediate fixnum address space]) +- fi +- fi +-fi +- +- +-dnl AC_MSG_CHECKING(for word order) +-dnl AC_TRY_RUN([int main () { +-dnl /* Are we little or big endian? Adapted from Harbison&Steele. */ +-dnl union +-dnl { +-dnl double d; +-dnl int l[sizeof(double)/sizeof(int)]; +-dnl } u; +-dnl u.d = 1.0; +-dnl return u.l[sizeof(double)/sizeof(int)-1] ? 0 : 1; +-dnl }],AC_MSG_RESULT(little) +-dnl AC_DEFINE(LITTLE_END), +-dnl AC_MSG_RESULT(big), +-dnl AC_MSG_RESULT([WARNING: ASSUMING LITTLE ENDIAN FOR CROSS COMPILING !!!] +-dnl AC_DEFINE(LITTLE_END))) +-dnl AC_SUBST(LITTLE_END) +- +- +-# On systems with execshield, brk is randomized. We need to catch +-# this and restore the traditional behavior here +- +-dnl old_LDFLAGS="$LDFLAGS" +-dnl LDFLAGS="$TLDFLAGS" +-dnl AC_MSG_CHECKING("finding DBEGIN") +-dnl AC_TRY_RUN([#include +-dnl #include +- +-dnl void gprof_cleanup() {}; +-dnl int +-dnl main(int argc,char * argv[],char *envp[]) +-dnl { +-dnl char *b,*b1; +-dnl FILE *fp; +- +-dnl #ifdef CAN_UNRANDOMIZE_SBRK +-dnl #include "h/unrandomize.h" +-dnl #endif +-dnl b = (void *) malloc(1000); +-dnl fp = fopen("conftest1","w"); +- +-dnl #ifdef _WIN32 +-dnl fprintf(fp,"_dbegin"); +-dnl #else +-dnl #if defined (__APPLE__) && defined (__MACH__) +-dnl fprintf(fp,"mach_mapstart"); +-dnl #else +-dnl b1=((unsigned long) b) & ~(unsigned long)0xffffff;b=(void *)b1<(void *)&b1 && (void *)b>(void *)&b ? ((unsigned long) b) & ~(unsigned long)((1< +-dnl main() +-dnl { +-dnl char *b ; +-dnl FILE *fp = fopen("conftest1","w"); +-dnl fprintf(fp,"%ld",((long) &b)); +-dnl fclose(fp); +-dnl return 0; +-dnl }],cstack_address=`cat conftest1`,cstack_address=0,cstack_address=0) +-dnl AC_DEFINE_UNQUOTED(CSTACK_ADDRESS,$cstack_address \ +-dnl ) +-dnl AC_MSG_RESULT(got $cstack_address) +- +- ++if test "$enable_immfix" != "no" ; then ++ if test "$mem_top" != "0x0" ; then ++ if test "$mem_range" != "0x0" ; then ++ AC_DEFINE_UNQUOTED(IM_FIX_BASE,$mem_top,[beginning address for immediate fixnum range]) ++ AC_DEFINE_UNQUOTED(IM_FIX_LIM,$mem_range,[size of immediate fixnum address space]) ++ fi ++ fi ++fi + + AC_MSG_CHECKING([sizeof long long int]) +-AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- ]],[[ +- if (sizeof(long long int) == 2*sizeof(long)) return 0; +- return 1; +-]])],[AC_DEFINE(HAVE_LONG_LONG,1,[long long is available]) AC_MSG_RESULT(yes)], ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ if (sizeof(long long int) == 2*sizeof(long)) return 0; ++ return 1; ++ ]])], ++ [AC_DEFINE(HAVE_LONG_LONG,1,[long long is available]) AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)]) + + AC_SUBST(HAVE_LONG_LONG) + +- +-AC_CHECK_HEADERS(dirent.h, +- AC_MSG_CHECKING([for d_type]) +- AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- ]],[[ +- struct dirent d; +- return d.d_type=0; +- ]])], +- [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_D_TYPE,1,[have struct dirent d_type field])], +- AC_MSG_RESULT([no]),AC_MSG_RESULT([no]))) +- +-# readline +-AC_ARG_ENABLE(readline, +- [--enable-readline enables command line completion via the readline library ],, +- enable_readline="yes") ++AC_CHECK_HEADERS([dirent.h], ++ AC_MSG_CHECKING([for d_type]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ struct dirent d; ++ return d.d_type=0; ++ ]])], ++ [AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_D_TYPE,1,[have struct dirent d_type field])], ++ AC_MSG_RESULT([no]),AC_MSG_RESULT([no]))) + + # ansi lisp +-AC_ARG_ENABLE(ansi,[--enable-ansi builds a large gcl aiming for ansi compliance, +- --disable-ansi builds the smaller traditional CLtL1 image],,enable_ansi="yes") +- +-if test "$enable_ansi" = "yes" ; then +- SYSTEM=ansi_gcl +- CLSTANDARD=ANSI +-else +- SYSTEM=gcl +- CLSTANDARD=CLtL1 +-fi ++SYSTEM=ansi_gcl ++CLSTANDARD=ANSI ++AC_ARG_ENABLE([ansi],[ --enable-ansi builds a large gcl aiming for ansi compliance], ++ [if test "$enable_ansi" = "no" ; then ++ SYSTEM=gcl ++ CLSTANDARD=CLtL1 ++ fi]) + + FLISP="saved_$SYSTEM" + AC_SUBST(FLISP) +@@ -2192,51 +1574,44 @@ AC_EGREP_HEADER([gettimeofday], + [sys/time.h], + [AC_MSG_RESULT([present])], + [AC_MSG_RESULT([missing]) +- AC_DEFINE(GETTOD_NOT_DECLARED,1,[No gettimeofday call -- fixme])]) ++ AC_DEFINE(GETTOD_NOT_DECLARED,1,[No gettimeofday call -- fixme])]) + + + AC_CHECK_LIB(m,sin,LIBS="${LIBS} -lm",true) + AC_CHECK_LIB(mingwex,main,LIBS="${LIBS} -lmingwex",true) + + AC_MSG_CHECKING([for buggy maximum sscanf length]) +-AC_RUN_IFELSE([ +- AC_LANG_PROGRAM([[ +- #include +- ]],[[ +- char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404"; +- int n, m; +- double f; +- char *endptr; +- FILE *fp=fopen("conftest1","w"); +- +- n=sscanf(s,"%lf%n",&f,&m); +- fprintf(fp,"%d",m); +- fclose(fp); +- return s[m]; +- ]])], +- [AC_MSG_RESULT([none])], +- [buggy_maximum_sscanf_length=`cat conftest1` +- AC_MSG_RESULT([$buggy_maximum_sscanf_length]) +- AC_DEFINE_UNQUOTED(BUGGY_MAXIMUM_SSCANF_LENGTH,$buggy_maximum_sscanf_length,[sscanf terminates prematurely (Windows XP)])]) ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ char *s= "2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161404"; ++ int n, m; ++ double f; ++ char *endptr; ++ FILE *fp=fopen("conftest1","w"); ++ ++ n=sscanf(s,"%lf%n",&f,&m); ++ fprintf(fp,"%d",m); ++ fclose(fp); ++ return s[m]; ++ ]])], ++ [AC_MSG_RESULT([none])], ++ [buggy_maximum_sscanf_length=`cat conftest1` ++ AC_MSG_RESULT([$buggy_maximum_sscanf_length]) ++ AC_DEFINE_UNQUOTED(BUGGY_MAXIMUM_SSCANF_LENGTH,$buggy_maximum_sscanf_length,[sscanf terminates prematurely (Windows XP)])]) + + + EXTRA_LOBJS= +-if test "$try_japi" = "yes" ; then +- AC_CHECK_HEADERS(japi.h,[AC_DEFINE(HAVE_JAPI_H) +- EXTRA_LOBJS="${EXTRA_LOBJS} gcl_japi.o" +- LIBS="${LIBS} -ljapi -lwsock32"] ) +-fi +-dnl if test "$use" = "mingw" ; then +-dnl if test "$try_xdr" = "yes" ; then +-dnl AC_CHECK_HEADERS(rpc/rpc.h,[AC_DEFINE(HAVE_XDR) +-dnl LIBS="${LIBS} -loncrpc"] ) +-dnl fi +-dnl else +-dnl if test "$try_xdr" = "yes" ; then +-dnl AC_CHECK_HEADERS(rpc/rpc.h,[AC_DEFINE(HAVE_XDR) +-dnl LIBS="${LIBS} -lrpc"] ) +-dnl fi +-dnl fi ++AC_ARG_ENABLE([japi],[ --enable-japi=yes will compile in support for the JAPI graphical interface if present on your system], ++ [if test "$enable_japi" = "yes" ; then ++ AC_CHECK_HEADERS([japi.h], ++ [AC_DEFINE(HAVE_JAPI_H) ++ EXTRA_LOBJS="${EXTRA_LOBJS} gcl_japi.o" ++ LIBS="${LIBS} -ljapi -lwsock32"]) ++ fi]) + + # Should really find a way to check for prototypes, but this + # basically works for now. CM +@@ -2260,76 +1635,53 @@ AC_CHECK_HEADERS(float.h,AC_DEFINE(HAVE_ + # test makes sense. CM + # + AC_MSG_CHECKING([for isnormal]) +-AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #define _GNU_SOURCE +- #include +- ]],[[ +- float f; +- return isnormal(f) || !isnormal(f) ? 0 : 1; ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #define _GNU_SOURCE ++ #include ++ ]], ++ [[ ++ float f; ++ return isnormal(f) || !isnormal(f) ? 0 : 1; + ]])], +- [AC_DEFINE(HAVE_ISNORMAL,1,[Have isnormal function]) AC_MSG_RESULT(yes)], +- [AC_MSG_CHECKING([for fpclass in ieeefp.h]) +- AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +- #include +- ]],[[ +- float f; +- return fpclass(f)>=FP_NZERO || fpclass(f) ++ ]], ++ [[ ++ float f; ++ return fpclass(f)>=FP_NZERO || fpclass(f) +- ]],[[ +- float f; +- return isfinite(f) || !isfinite(f) ? 0 : 1; +- ]])],[AC_DEFINE(HAVE_ISFINITE,1,[Have isfinite function]) AC_MSG_RESULT(yes)], +- [AC_MSG_CHECKING([for finite()]) +- AC_RUN_IFELSE([AC_LANG_PROGRAM([[ ++AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #define _GNU_SOURCE + #include +- #include +- ]],[[ ++ ]], ++ [[ + float f; +- return finite(f) || !finite(f) ? 0 : 1; +- ]])],[AC_DEFINE(HAVE_FINITE,1,[Have finite function]) AC_MSG_RESULT(yes)], +- [AC_MSG_ERROR(no)])]) +- +-dnl AC_MSG_CHECKING([for INFINITY]) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #define _GNU_SOURCE +-dnl #include +-dnl ]],[[ +-dnl double d=INFINITY; +-dnl return 0; +-dnl ]])],[AC_MSG_RESULT(yes)], +-dnl [AC_MSG_CHECKING([for builtin_inf()]) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl #include +-dnl ]],[[ +-dnl double d=__builtin_inf(); +-dnl return 0; +-dnl ]])],[AC_DEFINE_UNQUOTED(INFINITY,__builtin_inf(),[Have builtin_inf]) AC_MSG_RESULT(yes)], +-dnl [AC_MSG_ERROR(no)])]) +- +-dnl AC_MSG_CHECKING([for NAN]) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #define _GNU_SOURCE +-dnl #include +-dnl ]],[[ +-dnl double d=NAN; +-dnl return 0; +-dnl ]])],[AC_MSG_RESULT(yes)], +-dnl [AC_MSG_CHECKING([for builtin_nan()]) +-dnl AC_RUN_IFELSE([AC_LANG_PROGRAM([[ +-dnl #include +-dnl #include +-dnl ]],[[ +-dnl double d=__builtin_nan("0x0"); +-dnl return 0; +-dnl ]])],[AC_DEFINE_UNQUOTED(NAN,__builtin_nan("0x0"),[Have builtin_nan]) AC_MSG_RESULT(yes)], +-dnl [AC_MSG_ERROR(no)])]) ++ return isfinite(f) || !isfinite(f) ? 0 : 1; ++ ]])],[AC_DEFINE(HAVE_ISFINITE,1,[Have isfinite function]) AC_MSG_RESULT(yes)], ++ [AC_MSG_CHECKING([for finite()]) ++ AC_RUN_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ float f; ++ return finite(f) || !finite(f) ? 0 : 1; ++ ]])], ++ [AC_DEFINE(HAVE_FINITE,1,[Have finite function]) AC_MSG_RESULT(yes)], ++ [AC_MSG_ERROR(no)])]) + + #-------------------------------------------------------------------- + # Check for the existence of the -lsocket and -lnsl libraries. +@@ -2363,69 +1715,78 @@ if test "$tcl_checkBoth" = 1; then + fi + AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [TLIBS="$TLIBS -lnsl"])) + +-RL_OBJS="" +-RL_LIB="" +-if test "$enable_readline" = "yes" ; then +- AC_CHECK_HEADERS(readline/readline.h, +- AC_CHECK_LIB(readline,rl_initialize, +- AC_DEFINE(HAVE_READLINE,1,[have readline library]) +- TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware +- RL_OBJS=gcl_readline.o +-# Readline support now initialized automatically when compiled in, this lisp +-# object no longer needed -- 20040102 CM +-# RL_LIB=lsp/gcl_readline.o +- )) +- +-# These tests discover differences between readline 4.1 and 4.3 +- AC_CHECK_LIB(readline,rl_completion_matches, +- AC_DEFINE(HAVE_DECL_RL_COMPLETION_MATCHES,1,[have readline completion matches]) +- AC_DEFINE(HAVE_RL_COMPENTRY_FUNC_T,1,[have readline completion matches]),,) ++# readline ++AC_ARG_ENABLE(readline,[ --enable-readline enables command line completion via the readline library ]) ++ ++if test "$use" = "mingw" ; then ++ enable_readline=no ++fi ++ ++if test "$enable_readline" != "no" ; then ++ AC_CHECK_HEADERS([readline/readline.h], ++ AC_CHECK_LIB([readline],[rl_initialize], ++ [AC_DEFINE(HAVE_READLINE,1,[have readline library]) ++ TLIBS="$TLIBS -lreadline" #some machines don't link this, e.g. Slackware ++ RL_OBJS=gcl_readline.o])) ++ ++ # These tests discover differences between readline 4.1 and 4.3 ++ AC_CHECK_LIB([readline],[rl_completion_matches], ++ [AC_DEFINE(HAVE_DECL_RL_COMPLETION_MATCHES,1,[have readline completion matches]) ++ AC_DEFINE(HAVE_RL_COMPENTRY_FUNC_T,1,[have readline completion matches])]) + fi + + AC_SUBST(RL_OBJS) + AC_SUBST(RL_LIB) + +-AC_MSG_CHECKING(For network code for nsocket.c) +-AC_TRY_LINK([ +-#include +-#include +-#include +- +-#include +-#include +-#include +- +-/************* for the sockets ******************/ +-#include /* struct sockaddr, SOCK_STREAM, ... */ +-#ifndef NO_UNAME +-# include /* uname system call. */ +-#endif +-#include /* struct in_addr, struct sockaddr_in */ +-#include /* inet_ntoa() */ +-#include /* gethostbyname() */ +-],[ connect(0,(struct sockaddr *)0,0); +- gethostbyname("jil"); +- socket(AF_INET, SOCK_STREAM, 0); +- ], +-[AC_DEFINE(HAVE_NSOCKET,1,[can use nsocket library]) +- AC_MSG_RESULT(yes)], +-AC_MSG_RESULT(no)) +- +- +-AC_MSG_CHECKING(check for listen using fcntl) +-AC_TRY_COMPILE([#include +-#include +-], +-[FILE *fp=fopen("configure.in","r"); +- int orig; +- orig = fcntl(fileno(fp), F_GETFL); +- if (! (orig & O_NONBLOCK )) return 0; +-], +-[AC_DEFINE(LISTEN_USE_FCNTL,1,[can use fcntl for listen function]) +- AC_MSG_RESULT(yes)], +-AC_MSG_RESULT(no)) +- ++# sockets + ++AC_MSG_CHECKING([For network code for nsocket.c]) ++AC_LINK_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ #include ++ ++ #include ++ #include ++ #include ++ ++ /************* for the sockets ******************/ ++ #include /* struct sockaddr, SOCK_STREAM, ... */ ++ #ifndef NO_UNAME ++ # include /* uname system call. */ ++ #endif ++ #include /* struct in_addr, struct sockaddr_in */ ++ #include /* inet_ntoa() */ ++ #include /* gethostbyname() */ ++ ]], ++ [[ ++ connect(0,(struct sockaddr *)0,0); ++ gethostbyname("jil"); ++ socket(AF_INET, SOCK_STREAM, 0); ++ ]])], ++ [AC_DEFINE(HAVE_NSOCKET,1,[can use nsocket library]) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no])]) ++ ++ ++AC_MSG_CHECKING([check for listen using fcntl]) ++AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #include ++ ]], ++ [[ ++ FILE *fp=fopen("configure.in","r"); ++ int orig; ++ orig = fcntl(fileno(fp), F_GETFL); ++ if (! (orig & O_NONBLOCK )) return 0; ++ ]])], ++ [AC_DEFINE(LISTEN_USE_FCNTL,1,[can use fcntl for listen function]) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no])]) + + + AC_CHECK_FUNC(profil, ,[AC_DEFINE(NO_PROFILE,1,[no profil system call])]) +@@ -2433,29 +1794,18 @@ AC_SUBST(NO_PROFILE) + AC_CHECK_FUNC(setenv,[AC_DEFINE(HAVE_SETENV,1,[have setenv call])],no_setenv=1 ) + AC_SUBST(HAVE_SETENV) + if test "$no_setenv" = "1" ; then +-AC_CHECK_FUNC(putenv,[AC_DEFINE(HAVE_PUTENV,1,[have putenv call])],) +-AC_SUBST(HAVE_PUTENV) ++ AC_CHECK_FUNC(putenv,[AC_DEFINE(HAVE_PUTENV,1,[have putenv call])],) ++ AC_SUBST(HAVE_PUTENV) + fi + + AC_CHECK_FUNC(_cleanup, [AC_DEFINE(USE_CLEANUP,1,[have _cleanup function])],) + AC_SUBST(USE_CLEANUP) + gcl_ok=no + +-dnl AC_HEADER_EGREP(LITTLE_ENDIAN, ctype.h, gcl_ok=yes, gcl_ok=noo) +-dnl if test $gcl_ok = yes ; then +-dnl AC_DEFINE(ENDIAN_ALREADY_DEFINED) +-dnl fi +- +-dnl AC_SUBST(ENDIAN_ALREADY_DEFINED) +- +- +- +- +-# if test "x$enable_machine" = "x" ; then + AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) + + case $system in +- OSF*) ++ OSF*) + AC_DEFINE(USE_FIONBIO,1,[use fionbio for non-blocking io]) + AC_MSG_RESULT(FIONBIO) + ;; +@@ -2474,103 +1824,85 @@ esac + + + AC_MSG_CHECKING(check for SV_ONSTACK) +-AC_TRY_COMPILE([#include +-int joe=SV_ONSTACK; +-], +-[], +-[AC_DEFINE(HAVE_SV_ONSTACK,1,[have sv_onstack]) +- AC_SUBST(HAVE_SV_ONSTACK) +- AC_MSG_RESULT(yes)], +-AC_MSG_RESULT(no)) ++AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ int joe=SV_ONSTACK; ++ ]], ++ [[]])], ++ [AC_DEFINE(HAVE_SV_ONSTACK,1,[have sv_onstack]) ++ AC_SUBST(HAVE_SV_ONSTACK) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no])]) + + AC_MSG_CHECKING(check for SIGSYS) +-AC_TRY_COMPILE([#include +-int joe=SIGSYS; +-], +-[], +-[AC_DEFINE(HAVE_SIGSYS,1,[have SIGSYS signal]) +- AC_SUBST(HAVE_SIGSYS) +- AC_MSG_RESULT(yes)], +-AC_MSG_RESULT(no)) ++AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ int joe=SIGSYS; ++ ]],[[]])], ++ [AC_DEFINE(HAVE_SIGSYS,1,[have SIGSYS signal]) ++ AC_SUBST(HAVE_SIGSYS) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no])]) + + + AC_MSG_CHECKING(check for SIGEMT) +-AC_TRY_COMPILE([#include +-int joe=SIGEMT; +-], +-[], +-[AC_DEFINE(HAVE_SIGEMT,1,[have SIGEMT signal]) +- AC_SUBST(HAVE_SIGEMT) +- AC_MSG_RESULT(yes)], +-AC_MSG_RESULT(no)) ++AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ int joe=SIGEMT; ++ ]],[[]])], ++ [AC_DEFINE(HAVE_SIGEMT,1,[have SIGEMT signal]) ++ AC_SUBST(HAVE_SIGEMT) ++ AC_MSG_RESULT([yes])], ++ [AC_MSG_RESULT([no])]) + + AC_CHECK_FUNCS(sigaltstack) + AC_CHECK_FUNCS(feenableexcept) + + AC_CHECK_HEADERS(dis-asm.h, +- MLIBS=$LIBS +- AC_CHECK_LIB(opcodes,init_disassemble_info) +- AC_CHECK_LIB(dl,dlopen,#opcodes changes too quickly to link directly +- AC_CHECK_FUNCS(print_insn_i386,LIBS="$MLIBS -ldl"))) ++ MLIBS=$LIBS ++ AC_CHECK_LIB(opcodes,init_disassemble_info) ++ AC_CHECK_LIB(dl,dlopen,#opcodes changes too quickly to link directly ++ AC_CHECK_FUNCS(print_insn_i386,LIBS="$MLIBS -ldl"))) + + #if test $use = "386-linux" ; then +- AC_CHECK_HEADERS(asm/sigcontext.h) +- AC_CHECK_HEADERS(asm/signal.h) +- AC_MSG_CHECKING([for sigcontext...]) +- AC_TRY_COMPILE([#include +- ], +- [ +- struct sigcontext foo; +- ], +- [ +- sigcontext_works=1; +- AC_DEFINE(SIGNAL_H_HAS_SIGCONTEXT,1,[have sigcontext in signal.h]) +- AC_MSG_RESULT(sigcontext in signal.h) +- ], +- +- [sigcontext_works=0; +- AC_MSG_RESULT(sigcontext NOT in signal.h)] +- ) +- if test "$sigcontext_works" = 0 ; then +- AC_MSG_CHECKING([for sigcontext...]) +- AC_TRY_COMPILE([#include +- #ifdef HAVE_ASM_SIGCONTEXT_H +- #include +- #endif +- #ifdef HAVE_ASM_SIGNAL_H +- #include +- #endif +- ], +- [ +- struct sigcontext foo; +- ], +- [ +- AC_DEFINE(HAVE_SIGCONTEXT,1,[have sigcontext]) +- AC_MSG_RESULT(sigcontext in asm files) +- ], +- [ +- AC_MSG_RESULT(no sigcontext found) +- ]) +- +- +- fi +-# echo 'foo() {}' > conftest1.c +-# $CC -S conftest1.c +-# use_underscore=0 +-# if fgrep _foo conftest1.s ; then use_underscore=1 ; fi +-# if test $use_underscore = 0 ; then +-# MPI_FILE=mpi-386_no_under.o +-# else +-# MPI_FILE=mpi-386d.o +-# fi +-# AC_SUBST(MPI_FILE) +-# GCC=$CC +-# if test -x /usr/bin/i386-glibc20-linux-gcc ; then +-# GCC=/usr/bin/i386-glibc20-linux-gcc +-# fi +-# AC_SUBST(GCC) +- +-#fi ++AC_CHECK_HEADERS(asm/sigcontext.h) ++AC_CHECK_HEADERS(asm/signal.h) ++AC_MSG_CHECKING([for sigcontext...]) ++AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ ]], ++ [[ ++ struct sigcontext foo; ++ ]])], ++ [AC_DEFINE(SIGNAL_H_HAS_SIGCONTEXT,1,[have sigcontext of signal.h]) ++ AC_MSG_RESULT([sigcontext of signal.h])], ++ [AC_MSG_RESULT([sigcontext NOT of signal.h]) ++ AC_MSG_CHECKING([for sigcontext...]) ++ AC_COMPILE_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[ ++ #include ++ #ifdef HAVE_ASM_SIGCONTEXT_H ++ #include ++ #endif ++ #ifdef HAVE_ASM_SIGNAL_H ++ #include ++ #endif ++ ]], ++ [[ ++ struct sigcontext foo; ++ ]])], ++ [AC_DEFINE(HAVE_SIGCONTEXT,1,[have sigcontext]) ++ AC_MSG_RESULT(sigcontext asm files)], ++ [AC_MSG_RESULT([no sigcontext found])])]) + + AC_PATH_PROG(EMACS,emacs) + +@@ -2590,11 +1922,11 @@ EOF + + AC_MSG_CHECKING([emacs site lisp directory]) + if [[ "$EMACS_SITE_LISP" = "unknown" ]] ; then +- if [[ "$EMACS" != "" ]] ; then +- EMACS_SITE_LISP=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` +- else +- EMACS_SITE_LISP="" +- fi ++ if [[ "$EMACS" != "" ]] ; then ++ EMACS_SITE_LISP=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` ++ else ++ EMACS_SITE_LISP="" ++ fi + fi + AC_MSG_RESULT($EMACS_SITE_LISP) + AC_SUBST(EMACS_SITE_LISP) +@@ -2613,14 +1945,14 @@ EOF + + AC_MSG_CHECKING([emacs default.el]) + if [[ "$EMACS" != "" ]] ; then +- EMACS_DEFAULT_EL=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` ++ EMACS_DEFAULT_EL=`$EMACS -q -batch --no-site-file -l conftest.el 2>&1 | sed -e /Loading/d | sed -e /load/d |sed -e /Warning:/d` + else +- EMACS_DEFAULT_EL="" ++ EMACS_DEFAULT_EL="" + fi + if test -f "${EMACS_DEFAULT_EL}" ; then true;else +- if test -d $EMACS_SITE_LISP ; then +- EMACS_DEFAULT_EL=${EMACS_SITE_LISP}/default.el +- fi ++ if test -d $EMACS_SITE_LISP ; then ++ EMACS_DEFAULT_EL=${EMACS_SITE_LISP}/default.el ++ fi + fi + AC_MSG_RESULT($EMACS_DEFAULT_EL) + AC_SUBST(EMACS_DEFAULT_EL) +@@ -2651,93 +1983,98 @@ fi + AC_MSG_RESULT($INFO_DIR) + AC_SUBST(INFO_DIR) + +-if test "$enable_tcltk" = "yes" ; then ++AC_ARG_ENABLE([tcltk],[ --enable-tcltk will try to build gcl-tk]) ++AC_ARG_ENABLE([tkconfig], ++ [ --enable-tkconfig=XXXX will force the use of a TK_CONFIG_PREFIX=XXXXX as place to look for tkConfig.sh and tclConfig.sh], ++ [TK_CONFIG_PREFIX=$enableval],[TK_CONFIG_PREFIX=unknown]) ++AC_ARG_ENABLE([tclconfig], ++ [ --enable-tclconfig=XXXX will force the use of a TCL_CONFIG_PREFIX=XXXXX as place to look for tclConfig.sh and tclConfig.sh], ++ [TCL_CONFIG_PREFIX=$enableval],[TCL_CONFIG_PREFIX=unknown]) + +- AC_MSG_CHECKING([for tcl/tk]) ++if test "$enable_tcltk" != "no" ; then + +- if test -d "${TCL_CONFIG_PREFIX}" ; then true ; else ++ AC_MSG_CHECKING([for tcl/tk]) + +- AC_CHECK_PROG(TCLSH,tclsh,tclsh,${TCLSH}) +- +- if test "${TCLSH}" = "" ; then true ; else +- +- rm -f conftest.tcl +- cat >> conftest.tcl <> conftest.tcl <&1 $CC -v | fgrep "gcc version 2.96" > /dev/null +-dnl then +-dnl BROKEN_O4_OPT=1 +-dnl AC_DEFINE(BROKEN_O4_OPT) +-dnl AC_SUBST(BROKEN_O4_OPT) +-dnl echo ODIR_DEBUG=-O >> makedefsafter +-dnl echo >> makedefsafter +-dnl AC_MSG_RESULT([yes .. turning off -O4]) +-dnl else +-dnl AC_MSG_RESULT([no]) +-dnl fi +- +-LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'`" ++LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'` $TLDFLAGS" + AC_SUBST(LDFLAGS) +-LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $TLDFLAGS $LIBS $TLIBS" ++LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $LIBS $TLIBS" + AC_SUBST(LIBS) +-FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS $TCFLAGS $PROCESSOR_FLAGS" ++FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS $TCFLAGS" + AC_SUBST(FINAL_CFLAGS) + # Work around bug with gcc on ppc -- CM +-NIFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TONIFLAGS $PROCESSOR_FLAGS -I\$(GCLDIR)/o" ++NIFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TONIFLAGS -I\$(GCLDIR)/o" + AC_SUBST(NIFLAGS) +-CFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TO3FLAGS $PROCESSOR_FLAGS -I\$(GCLDIR)/o" ++CFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TO3FLAGS -I\$(GCLDIR)/o" + AC_SUBST(CFLAGS) + O3FLAGS=$TO3FLAGS + AC_SUBST(O3FLAGS) + O2FLAGS=$TO2FLAGS + AC_SUBST(O2FLAGS) + +-AC_SUBST(PRELINK_CHECK) +- + AC_SUBST(EXTRA_LOBJS) + AC_SUBST(LEADING_UNDERSCORE) + AC_SUBST(GNU_LD) + if test -f h/$use.defs ; then +- +- AC_SUBST(use) +- AC_OUTPUT(makedefc windows/gcl.iss windows/sysdir.bat windows/install.lsp ) +- echo makedefc +- cat makedefc +- +- echo add-defs1 $use +- CC=$CC ./add-defs1 $use +- ++ ++ AC_SUBST(use) ++ AC_OUTPUT(makedefc windows/gcl.iss windows/sysdir.bat windows/install.lsp ) ++ echo makedefc ++ cat makedefc ++ ++ echo add-defs1 $use ++ CC=$CC ./add-defs1 $use ++ + else +- echo "Unable to guess machine type" +- echo use configure --enable-machine=XXX, for XXX such that h/XXX.defs exists, ie in h/*.defs ++ echo "Unable to guess machine type" ++ echo use configure --enable-machine=XXX, for XXX such that h/XXX.defs exists, ie in h/*.defs + fi +--- gcl-2.6.12.orig/gcl-tk/sheader.h ++++ gcl-2.6.12/gcl-tk/sheader.h +@@ -45,7 +45,7 @@ struct message_header { + + + #define BYTE_S 8 +-#define BYTE_MASK (~(~0 << BYTE_S)) ++#define BYTE_MASK (~(~0UL << BYTE_S)) + + #define GET_3BYTES(p,ans) do{ unsigned char* __p = (unsigned char *) p; \ + ans = BYTE_MASK&(*__p++); \ +--- gcl-2.6.12.orig/h/compprotos.h ++++ gcl-2.6.12/h/compprotos.h +@@ -170,6 +170,7 @@ int gcl_putc(int,void *); + #ifdef CMPINCLUDE + int setjmp(); + int _setjmp(); ++int _setjmp3(); + #endif + void vfun_wrong_number_of_args(object); + void ihs_overflow (void); +@@ -179,4 +180,3 @@ char *gcl_gets(char *,int); + int gcl_puts(const char *); + int endp_error(object); + object Icall_gen_error_handler(object,object,object,object,ufixnum,...); +- +--- gcl-2.6.12.orig/h/funlink.h ++++ gcl-2.6.12/h/funlink.h +@@ -54,7 +54,7 @@ enum F_arg_types + }; + + /* Make a mask for bits i < j, masking j-i bits */ +-#define MASK_RANGE(i,j) ((~(~0 << (j-i)))<< i) ++#define MASK_RANGE(i,j) ((~(~0UL << (j-i)))<< i) + + #define F_PLAIN(x) (((x) & MASK_RANGE( F_START_TYPES_POS,31)) == 0) + #define ARG_LIMIT 63 +--- gcl-2.6.12.orig/h/mingw.defs ++++ gcl-2.6.12/h/mingw.defs +@@ -54,7 +54,7 @@ TCL_LIB_SPEC= + TCL_DL_LIBS= + TCL_LIBS= + +-PWD_CMD=pwd -W ++#PWD_CMD=pwd -W + + # + # End h/mingw.defs +--- gcl-2.6.12.orig/h/mingw.h ++++ gcl-2.6.12/h/mingw.h +@@ -26,21 +26,6 @@ + #define f_nsyms NumberOfSymbols + #define NO_PWD_H + +-#define MAXPATHLEN 512 +- +-/* alter pathToAlter to fit in with the Clibrary of the system. +- and report error using name 'x' if you cant do it. +- The result in pathToAlter should be less +-*/ +-#define FIX_FILENAME(x,pathToAlter) fix_filename(x,pathToAlter) +- +-#define MEMORY_SAVE(self,filename) \ +- do { char buf[MAXPATHLEN]; \ +- strcpy(buf,self); \ +- fix_filename(Cnil,buf); \ +- memory_save(buf,filename); \ +- } while (0) +- + #define signals_pending *signalsPendingPtr + + #undef DBEGIN_TY +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -371,6 +371,9 @@ emsg(const char *s,...) { + va_list args; + ufixnum n=0; + void *v=NULL; ++#ifndef vsnprintf ++ extern int vsnprintf(); ++#endif + va_start(args,s); + n=vsnprintf(v,n,s,args)+1; + va_end(args); +--- gcl-2.6.12.orig/h/protoize.h ++++ gcl-2.6.12/h/protoize.h +@@ -1777,6 +1777,7 @@ void gcl_init_shared_memory ( void ); + void fix_filename ( object pathname, char *filename1 ); + void alarm ( int n ); + void *sbrk ( ptrdiff_t increment ); ++#define sigset_t int + void sigemptyset( sigset_t *set); + void sigaddset ( sigset_t *set, int n); + int sigismember ( sigset_t *set, int n ); +@@ -1798,19 +1799,12 @@ msystem(const char *); + void + assert_error(const char *,unsigned,const char *,const char *); + +-#ifdef _WIN32 +-void +-detect_wine(void); +- ++#ifdef __MINGW32__ + void + init_shared_memory(void); + +-void * +-alloca(size_t); +- + object + find_init_string(const char *); +- + #endif + + void * +@@ -1964,3 +1958,6 @@ gcl_cleanup(int); + + void + do_gcl_abort(void); ++ ++int ++vsystem(const char *); +--- gcl-2.6.12.orig/h/wincoff.h ++++ gcl-2.6.12/h/wincoff.h +@@ -10,6 +10,7 @@ + in this */ + #undef va_start + ++#include "winsock2.h" + #include "windows.h" + #ifdef __MINGW32__ + #include "minglacks.h" +--- gcl-2.6.12.orig/lsp/gcl_auto_new.lsp ++++ gcl-2.6.12/lsp/gcl_auto_new.lsp +@@ -206,14 +206,8 @@ + ;; So to stop users from invoking this + #+sun + (defun user-homedir-pathname () +- (let* ((tem (si::getenv "HOME")) +- (l (- (length tem) 1))) +- (cond ((null tem) nil) +- (t +- (or (and (>= l 0) +- (eql (aref tem l) #\/)) +- (setq tem (concatenate 'string tem "/"))) +- (pathname tem))))) +- ++ (let* ((tem (si::getenv "HOME"))) ++ (when tem ++ (pathname (coerce-slash-terminated tem))))) + + (AUTOLOAD 'init-readline '|gcl_readline|) +--- gcl-2.6.12.orig/lsp/gcl_directory.lsp ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -34,9 +34,9 @@ + (defun make-frame (s &aux (l (length s))) + (replace (make-array l :element-type 'character :adjustable t :fill-pointer l) s)) + +-(defun expand-wild-directory (l f zz &optional (yy (make-frame zz))) ++(defun expand-wild-directory (d l f zz &optional (yy (make-frame zz))) + (let* ((x (member-if 'wild-dir-element-p l)) +- (s (namestring (make-pathname :directory (ldiff l x)))) ++ (s (namestring (make-pathname :device d :directory (ldiff l x)))) + (z (vector-push-string zz s)) + (l (length yy)) + (y (link-expand (vector-push-string yy s) l)) +@@ -45,19 +45,15 @@ + (cond ((eq (car x) :wild-inferiors) (recurse-dir z y f)) + (x (walk-dir z y (lambda (q e l) + (declare (ignore l)) +- (expand-wild-directory (cons :relative (cdr x)) f q e)) :directory));FIXME ++ (expand-wild-directory d (cons :relative (cdr x)) f q e)) :directory));FIXME + ((funcall f z y)))))) + +-(defun chdir (s) +- (when (chdir1 (namestring (pathname s)));to expand ~/ +- (setq *current-directory* (current-directory-pathname)))) +- + (defun directory (p &key &aux (p (translate-logical-pathname p))(d (pathname-directory p)) + (c (unless (eq (car d) :absolute) (make-frame (namestring *current-directory*)))) + (lc (when c (length c))) + (filesp (or (pathname-name p) (pathname-type p))) + (v (compile-regexp (to-regexp p)))(*up-key* :back) r) +- (expand-wild-directory d ++ (expand-wild-directory (pathname-device p) d + (lambda (dir exp &aux (pexp (pathname (if c (vector-push-string c exp 0 lc) exp)))) + (if filesp + (walk-dir dir exp +@@ -67,5 +63,15 @@ + (push (merge-pathnames (parse-namestring dir nil *default-pathname-defaults* :start pos) pexp nil) r))) + :file) + (when (pathname-match-p dir v) (push pexp r)))) +- (make-frame (if c "./" ""))) ++ (make-frame "")) + r) ++ ++(defun chdir (s) ++ (when (chdir1 (namestring (pathname s)));to expand ~/ ++ (setq *current-directory* (current-directory-pathname)))) ++ ++(defun which (s) ++ (let ((r (with-open-file (s (apply 'string-concatenate "|" #-winnt "which " ++ #+winnt "for %i in (" s #+winnt ".exe) do @echo.%~$PATH:i" nil)) ++ (read-line s nil 'eof)))) ++ (if (eq r 'eof) s (string-downcase r)))) +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -451,7 +451,7 @@ + (let* ((*load-pathname* pp)(*load-truename* epp)) + (with-open-file + (s epp :external-format external-format) +- (if (member (peek-char nil s nil 'eof) '#.(mapcar 'code-char (list 127 #xfe #xff #x4c))) ++ (if (member (peek-char nil s nil 'eof) '#.(mapcar 'code-char (list 127 #xcf #xce #x4c))) + (load-fasl s print) + (let ((*standard-input* s)) (load-stream s print))))) + (when if-does-not-exist +--- gcl-2.6.12.orig/lsp/gcl_make_pathname.lsp ++++ gcl-2.6.12/lsp/gcl_make_pathname.lsp +@@ -4,29 +4,58 @@ + ;; (declare (optimize (safety 1))) + ;; (when (typep x 'pathname) t)) + ++ ++(eval-when (compile eval) ++ (defun add-dir-sep (s &optional (i 0) (bp 0) (l (length s))) ++ (when (< i l) ++ (let ((x (aref s i))) ++ (append ++ (if (eql x #\/) ++ (if (zerop bp) (list #\[ x #\\ #\]) (list x #\\)) ++ (list x)) ++ (add-dir-sep s (1+ i) (case x (#\[ (1+ bp))(#\] (1- bp))(otherwise bp)) l))))) ++ ++ (defun ads (s) #+winnt (coerce (add-dir-sep s) 'string) #-winnt s)) ++ ++(defconstant +dirsep+ (compile-regexp #.(ads "/"))) ++ ++(defconstant +glob-to-regexp-alist+ (list (cons #v"{[^}]*}" (lambda (x) (msub '((#\| . #\,)(#\( . #\{)(#\) . #\})) x))) ++ (cons #v"\\[[^\\]*\\]" ++ (lambda (x) ++ (string-concatenate "(" (substitute #\^ #\! (subseq x 0 2)) (subseq x 2) ")"))) ++ (cons #v"\\*" (lambda (x) #.(ads "([^/.]*)"))) ++ (cons #v"\\?" (lambda (x) #.(ads "([^/.])"))) ++ (cons #v"\\." (lambda (x) "\\.")))) ++ ++(defconstant +physical-pathname-defaults+ '(("" "" "") ++ #+winnt("" "([A-Za-z]:)?" ":") #-winnt("" "()" "") ++ ("" #.(ads "(/?([^/]+/)*)") "" "" #.(ads "([^/]+/)") "/") ++ ("" #.(ads "([^/.]*)") "") ++ ("." #.(ads "(\\.[^/]*)?") "") ++ ("" "" ""))) ++ ++(defconstant +logical-pathname-defaults+ '(("" "([-0-9A-Z]+:)?" ":") ++ ("" "" "") ++ ("" "(;?((\\*?([-0-9A-Z]+\\*?)+|\\*|\\*\\*);)*)" "" "" "((\\*?([-0-9A-Z]+\\*?)+|\\*);)" ";") ++ ("" "(\\*?([-0-9A-Z]+\\*?)+|\\*)?" "") ++ ("." "(\\.(\\*?([-0-9A-Z]+\\*?)+|\\*))?" "") ++ ("." "(\\.([1-9][0-9]*|newest|NEWEST|\\*))?" ""))) ++ + (defun msub (a x) (if a (msub (cdr a) (substitute (caar a) (cdar a) x)) x)) + +-(defvar *glob-to-regexp-alist* (list (cons #v"{[^}]*}" (lambda (x) (msub '((#\| . #\,)(#\( . #\{)(#\) . #\})) x))) +- (cons #v"\\[[^\\]*\\]" (lambda (x) +- (concatenate 'string "(" +- (substitute #\^ #\! (subseq x 0 2)) +- (subseq x 2) ")"))) +- (cons #v"\\*" (lambda (x) "([^/.]*)")) +- (cons #v"\\?" (lambda (x) "([^/.])")) +- (cons #v"\\." (lambda (x) "\\.")))) + + (defun mglist (x &optional (b 0)) + (let* ((y (mapcan (lambda (z &aux (w (string-match (car z) x b))) + (unless (eql w -1) + (list (list w (match-end 0) z)))) +- *glob-to-regexp-alist*)) ++ +glob-to-regexp-alist+)) + (z (when y (reduce (lambda (y x) (if (< (car x) (car y)) x y)) y)))) + (when z + (cons z (mglist x (cadr z)))))) + + (defun mgsub (x &optional (l (mglist x)) (b 0) &aux (w (pop l))) + (if w +- (concatenate 'string ++ (string-concatenate + (subseq x b (car w)) + (funcall (cdaddr w) (subseq x (car w) (cadr w))) + (mgsub x l (cadr w))) +@@ -49,21 +78,10 @@ + ; ) + ) + +-(defconstant +physical-pathname-defaults+ '(("" "" "") +- ("" "" "") +- ("" "(/?([^/]+/)*)" "" "" "([^/]+/)" "/") +- ("" "([^/.]*)" "") +- ("." "(\\.[^/]*)?" "") +- ("" "" ""))) +-(defconstant +logical-pathname-defaults+ '(("" "([-0-9A-Z]+:)?" ":") +- ("" "" "") +- ("" "(;?((\\*?([-0-9A-Z]+\\*?)+|\\*|\\*\\*);)*)" "" "" "((\\*?([-0-9A-Z]+\\*?)+|\\*);)" ";") +- ("" "(\\*?([-0-9A-Z]+\\*?)+|\\*)?" "") +- ("." "(\\.(\\*?([-0-9A-Z]+\\*?)+|\\*))?" "") +- ("." "(\\.([1-9][0-9]*|newest|NEWEST|\\*))?" ""))) ++ + + (defun to-regexp-or-namestring (x rp lp) +- (apply 'concatenate 'string ++ (apply 'string-concatenate + (mapcan (lambda (x y) (elsub x y rp lp)) + x (if lp +logical-pathname-defaults+ +physical-pathname-defaults+)))) + +@@ -101,14 +119,14 @@ + (eval-when (compile eval) + (defun strsym (p &rest r) + (declare (:dynamic-extent r)) +- (intern (apply 'concatenate 'string (mapcar 'string-upcase r)) p))) ++ (intern (apply 'string-concatenate (mapcar 'string-upcase r)) p))) + + #.`(defun make-pathname (&key (host nil hostp) (device nil devicep) (directory nil directoryp) + (name nil namep) (type nil typep) (version nil versionp) + defaults (case :local) namestring &aux defaulted (def (when defaults (pathname defaults)))) + (declare (optimize (safety 1))) + (check-type host (or (member nil :unspecific) string)) +- (check-type device (member nil :unspecific)) ++ (check-type device (or (member nil :unspecific) string)) + (check-type directory (or (member nil :unspecific :wild) string list)) + (check-type name (or string (member nil :unspecific :wild))) + (check-type type (or string (member nil :unspecific :wild))) +@@ -116,7 +134,8 @@ + (check-type defaults (or null pathname-designator)) + (check-type case (member :common :local)) + ,(flet ((def? (k) `(let* (,@(when (eq k 'host) `((def (or def *default-pathname-defaults*)))) +- (nk (if ,(strsym :si k "P") ,k (progn (setq defaulted t) (when def (,(strsym :si "C-PATHNAME-" k) def))))) ++ (nk (if ,(strsym :si k "P") ,k (when def (,(strsym :si "C-PATHNAME-" k) def)))) ++ (nk (progn (unless (eq ,k nk) (setq defaulted t)) nk)) + (nk (if (eq case :local) nk (progn (setq defaulted t) (toggle-case nk))))) + nk))) + `(let* ((h ,(def? 'host)) +--- gcl-2.6.12.orig/lsp/gcl_parse_namestring.lsp ++++ gcl-2.6.12/lsp/gcl_parse_namestring.lsp +@@ -14,6 +14,7 @@ + (defun dir-conj (x) (if (eq x :relative) :absolute :relative)) + + (defvar *up-key* :up) ++(defvar *canonicalized* nil) + + (defun mfr (x b i) (subseq x b i)); (make-array (- i b) :element-type 'character :displaced-to x :displaced-index-offset b) + +@@ -30,15 +31,15 @@ + (z (if w (cdr w) z))) + (if (eq z :up) *up-key* z))) + +-(defun dir-parse (x sep sepfirst &optional (b 0)) ++(defun dir-parse (x &optional lp (b 0)) + (when (stringp x) +- (let ((i (search sep x :start2 b)));string-match spoils outer match results +- (when i +- (let* ((y (dir-parse x sep sepfirst (1+ i))) ++ (let ((i (string-match (if lp #v";" +dirsep+) x b))) ++ (unless (minusp i) ++ (let* ((y (dir-parse x lp (1+ i))) + (z (element x b i :directory)) +- (y (if z (cons z y) y))) ++ (y (if z (cons z y) (progn (when (> i b) (setq *canonicalized* t)) y)))) + (if (zerop b) +- (cons (if (zerop i) sepfirst (dir-conj sepfirst)) y) ++ (cons (if (if lp (plusp i) (zerop i)) :absolute :relative) y) + y)))))) + + (defun match-component (x i k &optional (boff 0) (eoff 0)) +@@ -52,40 +53,37 @@ + + (defconstant +generic-logical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +logical-pathname-defaults+)) t t))) + +-(defun expand-home-dir (dir) +- (cond ((and (eq (car dir) :relative) (stringp (cadr dir)) (eql #\~ (aref (cadr dir) 0))) +- (append (dir-parse (home-namestring (cadr dir)) "/" :absolute) (cddr dir))) +- (dir))) +- + (defun logical-pathname-parse (x &optional host def (b 0) (e (length x))) +- (when (and (eql b (string-match +generic-logical-pathname-regexp+ x b e)) (eql (match-end 0) e)) +- (let ((mhost (match-component x 1 :host 0 -1))) +- (when (and host mhost) +- (unless (string-equal host mhost) ++ (when *pathname-logical* ;;accelerator ++ (when (and (eql b (string-match +generic-logical-pathname-regexp+ x b e)) (eql (match-end 0) e)) ++ (let ((mhost (match-component x 1 :host 0 -1))) ++ (when (and host mhost) ++ (unless (string-equal host mhost) + (error 'error :format-control "Host part of ~s does not match ~s" :format-arguments (list x host)))) +- (let ((host (or host mhost (pathname-host def)))) +- (when (logical-pathname-host-p host) +- (let* ((dir (dir-parse (match-component x 2 :none) ";" :relative)) +- (edir (expand-home-dir dir))) +- (make-pathname :host host +- :device :unspecific +- :directory edir +- :name (match-component x 6 :name) +- :type (match-component x 8 :type 1) +- :version (version-parse (match-component x 11 :version 1)) +- :namestring (when (and mhost (eql b 0) (eql e (length x)) (eq dir edir)) x)))))))) +- ++ (let ((host (or host mhost (pathname-host def)))) ++ (when (logical-pathname-host-p host) ++ (make-pathname :host host ++ :device :unspecific ++ :name (match-component x 6 :name) ++ :type (match-component x 8 :type 1) ++ :version (version-parse (match-component x 11 :version 1)) ++ :directory (dir-parse (match-component x 2 :none) t);must be last ++ :namestring (when (and mhost (eql b 0) (eql e (length x))) x)))))))) ++ + (defconstant +generic-physical-pathname-regexp+ (compile-regexp (to-regexp-or-namestring (make-list (length +physical-pathname-defaults+)) t nil))) + +-(defun pathname-parse (x b e) +- (when (and (eql b (string-match +generic-physical-pathname-regexp+ x b e)) (eql (match-end 0) e)) +- (let* ((dir (dir-parse (match-component x 1 :none) "/" :absolute)) +- (edir (expand-home-dir dir))) +- (make-pathname :directory edir +- :name (match-component x 3 :name) +- :type (match-component x 4 :type 1) +- :namestring (when (and (eql b 0) (eql e (length x)) (eq dir edir)) x))))) ++(defun expand-home-dir (dir) ++ (if (and (eq (car dir) :relative) (stringp (cadr dir)) (eql #\~ (aref (cadr dir) 0))) ++ (prog1 (append (dir-parse (home-namestring (cadr dir))) (cddr dir)) (setq *canonicalized* t)) ++ dir)) + ++(defun pathname-parse (x b e &aux (*canonicalized* nil)) ++ (when (and (eql b (string-match +generic-physical-pathname-regexp+ x b e)) (eql (match-end 0) e)) ++ (make-pathname :device (match-component x 1 :none 0 -1) ++ :name (match-component x 4 :name) ++ :type (match-component x 5 :type 1) ++ :directory (expand-home-dir (dir-parse (match-component x 2 :none)));must be last ++ :namestring (unless *canonicalized* (when (and (eql b 0) (eql e (length x))) x))))) + + (defun path-stream-name (x) + (check-type x pathname-designator) +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -581,27 +581,20 @@ First directory is checked for first nam + + (defvar *tmp-dir*) + +-(defun wine-tmp-redirect () +- (let* ((s (find-symbol "*WINE-DETECTED*" (find-package "SYSTEM")))) +- (when (and s (symbol-value s)) +- (list *system-directory*)))) +- + (defun ensure-dir-string (str) + (if (eq (stat str) :directory) + (coerce-slash-terminated str) + str)) + + (defun get-temp-dir () +- (dolist (x `(,@(wine-tmp-redirect) ,@(mapcar 'si::getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" "")) ++ (dolist (x `(,@(mapcar 'si::getenv '("TMPDIR" "TMP" "TEMP")) "/tmp" "")) + (when x + (let ((x (coerce-slash-terminated x))) + (when (eq (stat x) :directory) + (return-from get-temp-dir x)))))) + +-(defun get-path (s &aux (m (string-match "([^/ ]*)( |$)" s))(b (match-beginning 1))(e (match-end 1)) +- (r (with-open-file (s (concatenate 'string "|which " (subseq s b e))) (read s nil 'eof)))) +- (if (eq r 'eof) s (concatenate 'string (string-downcase r) (subseq s e)))) +- ++(defun get-path (s &aux (m (string-match "([^ ]*)( |$)" s))(b (match-beginning 1))(e (match-end 1))) ++ (string-concatenate (which (pathname-name (subseq s b e))) (subseq s e))) + + (defvar *cc* "cc") + (defvar *ld* "ld") +@@ -609,7 +602,7 @@ First directory is checked for first nam + + (defvar *current-directory* *system-directory*) + +-(defun current-directory-pathname nil (pathname (concatenate 'string (getcwd) "/"))) ++(defun current-directory-pathname nil (pathname (coerce-slash-terminated (getcwd)))) + + (defun set-up-top-level (&aux (i (argc)) tem) + (declare (fixnum i)) +@@ -627,9 +620,7 @@ First directory is checked for first nam + (when dir + (setq *lib-directory* (coerce-slash-terminated dir))))) + (unless (and *load-path* (equal tem *lib-directory*)) +- (setq *load-path* (cons (string-concatenate *lib-directory* "lsp/") *load-path*)) +- (setq *load-path* (cons (string-concatenate *lib-directory* "gcl-tk/") *load-path*)) +- (setq *load-path* (cons (string-concatenate *lib-directory* "xgcl-2/") *load-path*))) ++ (mapc (lambda (x) (push (string-concatenate *lib-directory* x) *load-path*)) '("lsp/" "gcl-tk/" "xgcl-2/"))) + (unless (boundp '*system-directory*) + (setq *system-directory* (namestring (truename (make-pathname :name nil :type nil :defaults (argv 0)))))))) + +--- gcl-2.6.12.orig/lsp/gcl_truename.lsp ++++ gcl-2.6.12/lsp/gcl_truename.lsp +@@ -4,11 +4,11 @@ + (labels ((frame (b e) (make-array (- n b) :element-type 'character + :displaced-to str :displaced-index-offset b :fill-pointer (- e b))) + (set-fr (fr e &aux (fr (or fr (frame 0 b)))) (setf (fill-pointer fr) e) fr)) +- (let* ((i (string-match #v"/" str b)) ++ (let* ((i (string-match +dirsep+ str b)) + (fr (set-fr fr (if (eql i -1) n i))) + (l (when (eq (stat fr) :link) (readlinkat 0 fr)))) + (cond (l (let ((b (if (eql #\/ (aref l 0)) 0 b))) +- (link-expand (concatenate 'string (set-fr fr b) l (frame (if (eql i -1) n i) n)) b))) ++ (link-expand (string-concatenate (set-fr fr b) l (frame (if (eql i -1) n i) n)) b))) + ((eql i -1) str) + ((link-expand str (1+ i) n fr)))))) + +--- gcl-2.6.12.orig/makedefc.in ++++ gcl-2.6.12/makedefc.in +@@ -45,6 +45,7 @@ PRELINK_CHECK=@PRELINK_CHECK@ + + NOTIFY=@NOTIFY@ + CC=@CC@ ++GCL_CC=@GCL_CC@ + CFLAGS=@CFLAGS@ + LDFLAGS=@LDFLAGS@ + FINAL_CFLAGS=@FINAL_CFLAGS@ +--- gcl-2.6.12.orig/o/bind.c ++++ gcl-2.6.12/o/bind.c +@@ -23,6 +23,8 @@ Foundation, 675 Mass Ave, Cambridge, MA + bind.c + */ + ++#include ++ + #include "include.h" + + static void +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -149,7 +149,7 @@ enum dump_type { + + /* given SHORT extract top code (say 4 bits) and bottom byte */ + #define TOP(i) (i >> SIZE_BYTE) +-#define BOTTOM(i) (i & ~(~0 << SIZE_BYTE)) ++#define BOTTOM(i) (i & ~(~0UL << SIZE_BYTE)) + + #define FASD_VERSION 2 + +@@ -328,7 +328,7 @@ getd(str) + + + #define D_TYPE_OF(byt) \ +- ((enum dump_type )((unsigned int) byt & ~(~0 << SIZE_D_CODE))) ++ ((enum dump_type )((unsigned int) byt & ~(~0UL << SIZE_D_CODE))) + + /* this field may be the top of a short for length, or part of an extended + code */ +@@ -379,7 +379,7 @@ getd(str) + + + +-#define MASK ~(~0 << 8) ++#define MASK ~(~0UL << 8) + #define WRITE_BYTEI(x,i) putc((((x) >> (i*SIZE_BYTE)) & MASK),fas_stream) + + #define PUTFIX(v_) Join(PUT,SIZEOF_LONG)(v_) +@@ -398,7 +398,7 @@ getd(str) + WRITE_BYTEI(var,7);} while(0) + + #define PUT4(varx ) \ +- do{int var= varx ; \ ++ do{unsigned long var= varx ; \ + DPRINTF("{4byte:varx= %d}", var); \ + WRITE_BYTEI(var,0); \ + WRITE_BYTEI(var,1); \ +@@ -406,14 +406,14 @@ getd(str) + WRITE_BYTEI(var,3);} while(0) + + #define PUT2(var ) \ +- do{int v=var; \ ++ do{unsigned long v=var; \ + DPRINTF("{2byte:var= %d}", v); \ + WRITE_BYTEI(v,0); \ + WRITE_BYTEI(v,1); \ + } while(0) + + #define PUT3(var ) \ +- do{int v=var; \ ++ do{unsigned long v=var; \ + DPRINTF("{3byte:var= %d}", v); \ + WRITE_BYTEI(v,0); \ + WRITE_BYTEI(v,1); \ +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -89,8 +89,8 @@ Foundation, 675 Mass Ave, Cambridge, MA + # include + # include + #else +-# include + # include ++# include + #endif + #include + +@@ -400,7 +400,8 @@ open_stream(object fn,enum smmode smm, o + fclose(fp); + if (if_exists==sKerror) FILE_ERROR(fn,"File exists"); + else if (if_exists==sKrename) { +- massert(snprintf(FN2,sizeof(FN2),"%s.BAK",FN1)>=0); ++ massert(snprintf(FN2,sizeof(FN2),"%-*.*s~",(int)strlen(FN1)-1,(int)strlen(FN1)-1,FN1)>=0); ++ massert(!unlink(FN2));/*MinGW*/ + massert(!rename(FN1,FN2)); + if (!(fp=fopen(FN1,smm==smm_output ? "w" : "w+"))) cannot_create(fn); + } else if (if_exists==sKrename_and_delete || +--- gcl-2.6.12.orig/o/funlink.c ++++ gcl-2.6.12/o/funlink.c +@@ -322,10 +322,11 @@ call_proc(object sym, void **link, int a + + } else if (type_of(fun)==t_afun) { + +- ufixnum at=F_TYPES(fun->sfn.sfn_argd)>>F_TYPE_WIDTH; +- ufixnum ma=F_MIN_ARGS(fun->sfn.sfn_argd); +- ufixnum xa=F_MAX_ARGS(fun->sfn.sfn_argd); +- ufixnum rt=F_RESULT_TYPE(fun->sfn.sfn_argd); ++ ufixnum ad=fun->sfn.sfn_argd; ++ ufixnum at=F_TYPES(ad)>>F_TYPE_WIDTH; ++ ufixnum ma=F_MIN_ARGS(ad); ++ ufixnum xa=F_MAX_ARGS(ad); ++ ufixnum rt=F_RESULT_TYPE(ad); + + nargs=SFUN_NARGS(argd); + if (nargs xa || ((argd>>8)&0x3)!=rt || (argd>>12)!=at) +--- gcl-2.6.12.orig/o/hash.d ++++ gcl-2.6.12/o/hash.d +@@ -48,7 +48,7 @@ typedef unsigned char uchar; + + static ufixnum rtb[256]; + +-#define MASK(n) (~(~0L << (n))) ++#define MASK(n) (~(~0UL << (n))) + + static ufixnum + ufixhash(ufixnum g) { +--- gcl-2.6.12.orig/o/main.c ++++ gcl-2.6.12/o/main.c +@@ -148,7 +148,7 @@ mbrk(void *v) { + + #if defined(__CYGWIN__)||defined(__MINGW32__) + +-#include ++#include + + static ufixnum + get_phys_pages_no_malloc(char n) { +@@ -470,12 +470,6 @@ main(int argc, char **argv, char **envp) + kcl_self = argv[0]; + #endif + +-#ifdef __MINGW32__ +- { +- char *s=kcl_self; +- for (;*s;s++) if (*s=='\\') *s='/'; +- } +-#endif + *argv=kcl_self; + + #ifdef CAN_UNRANDOMIZE_SBRK +@@ -537,10 +531,6 @@ main(int argc, char **argv, char **envp) + + } + +-#ifdef _WIN32 +- detect_wine(); +-#endif +- + sSAlisp_maxpagesA->s.s_dbind = make_fixnum(real_maxpage); + + ihs_push(Cnil); +--- gcl-2.6.12.orig/o/mingfile.c ++++ gcl-2.6.12/o/mingfile.c +@@ -1,57 +1,6 @@ + #include "include.h" +-#include "windows.h" + #include "winsock2.h" +- +-extern object truename(object); +-extern object make_pathname(); +-void Ldirectory ( void ) +-{ +- char filename[MAXPATHLEN]; +- object *top=vs_top; +- object path; +- check_arg(1); +- check_type_or_pathname_string_symbol_stream(&vs_base[0]); +- path = vs_base[0] = coerce_to_pathname(vs_base[0]); +- +- if (vs_base[0]->pn.pn_name==Cnil && vs_base[0]->pn.pn_type==Cnil) { +- coerce_to_filename(vs_base[0], filename); +- strcat(filename, "*.*"); +- } else if (vs_base[0]->pn.pn_name==Cnil) { +- vs_base[0]->pn.pn_name = sKwild; +- coerce_to_filename(vs_base[0], filename); +- vs_base[0]->pn.pn_name = Cnil; +- } else if (vs_base[0]->pn.pn_type==Cnil) { +- coerce_to_filename(vs_base[0], filename); +- strcat(filename, ".*"); +- } else +- coerce_to_filename(vs_base[0], filename); +- { WIN32_FIND_DATA data; +- HANDLE dirHandle = FindFirstFile(filename,&data); +- +- if (dirHandle== INVALID_HANDLE_VALUE) { +- vs_base[0]=Cnil; return; +- } else { +- do { +- if (strcmp(data.cFileName,"..") != 0 && strcmp(data.cFileName,".") != 0 ) { +- object name = make_simple_string(data.cFileName); +- object new = coerce_to_pathname(name); +- vs_push(make_pathname(path->pn.pn_host, +- path->pn.pn_device, +- path->pn.pn_directory, +- new->pn.pn_name, +- new->pn.pn_type, +- new->pn.pn_version)); +- } +- } while (FindNextFile(dirHandle,&data)); +- FindClose(dirHandle); +- } +- vs_push(Cnil); +- while (vs_top > top + 1) +- stack_cons(); +- vs_base = top; +- +- } +-} ++#include "windows.h" + + int + mingwlisten(FILE *fp) { +--- gcl-2.6.12.orig/o/mingwin.c ++++ gcl-2.6.12/o/mingwin.c +@@ -2,6 +2,7 @@ + + + ++#include "winsock2.h" + #include "windows.h" + #include "errno.h" + #include "signal.h" +@@ -923,20 +924,6 @@ sigprocmask (int how , const sigset_t *s + return 0; + } + +-void +-fix_filename(object pathname, char *filename1) { +- +- char *filename=filename1,*p=filename; +- extern char *getwd(); +- +- while (*p) { +- if (*p=='\\') *p='/'; +- p++; +- } +- +-} +- +- + char *GCLExeName ( void ) + { + static char module_name_buf[128]; +@@ -948,3 +935,35 @@ char *GCLExeName ( void ) + } + return ( (char *) rv ); + } ++ ++int ++vsystem(const char *command) { ++ ++ STARTUPINFO s={0}; ++ PROCESS_INFORMATION p={0}; ++ long unsigned int e; ++ char *cmd=NULL,*r; ++ ++ if (!strpbrk(command,"\"'$<>")) { ++ ++ cmd=FN1; ++ massert((r=strpbrk(command," \n\t"))-command=0); ++ command=FN1; ++ ++ } ++ ++ massert(CreateProcess(cmd,(void *)command,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,NULL,NULL,&s,&p)); ++ massert(!WaitForSingleObject(p.hProcess,INFINITE)); ++ massert(GetExitCodeProcess(p.hProcess,&e)); ++ massert(CloseHandle(p.hProcess)); ++ massert(CloseHandle(p.hThread)); ++ ++ return e; ++ ++} +--- gcl-2.6.12.orig/o/sfaslcoff.c ++++ gcl-2.6.12/o/sfaslcoff.c +@@ -47,7 +47,16 @@ struct scnhdr { + #define ALLOC_SEC(sec) (sec->s_flags&(SEC_CODE|SEC_DATA|SEC_BSS)) + #define LOAD_SEC(sec) (sec->s_flags&(SEC_CODE|SEC_DATA)) + +-#define STOP(s_,op_) ({char *_s=s_,_c=_s[8];_s[8]=0;op_;_s[8]=_c;}) ++#define NM(sym_,tab_,nm_,op_) \ ++ ({char _c=0,*nm_; \ ++ if ((sym_)->n.n.n_zeroes) \ ++ {(nm_)=(sym_)->n.n_name;_c=(nm_)[8];(nm_)[8]=0;} \ ++ else \ ++ (nm_)=(tab_)+(sym_)->n.n.n_offset; \ ++ op_; \ ++ if (_c) (nm_)[8]=_c; \ ++ }) ++ + + struct reloc { + union { +@@ -164,7 +173,7 @@ get_sym_value(const char *name) { + static void + relocate_symbols(struct syment *sym,struct syment *sye,struct scnhdr *sec1,char *st1) { + +- struct node *answ; ++ long value; + + for (;symn_scnum) { + +- if (sym->n.n.n_zeroes) +- STOP(sym->n.n_name,sym->n_value=get_sym_value(sym->n.n_name)); +- else +- sym->n_value=get_sym_value(st1+sym->n.n.n_offset); ++ NM(sym,st1,s,value=get_sym_value(s)); ++ ++ sym->n_value=value; + + } + +@@ -256,10 +264,7 @@ load_self_symbols() { + + ns++; + +- if (sym->n.n.n_zeroes) +- STOP(sym->n.n_name,sl+=strlen(sym->n.n_name)+1); +- else +- sl+=strlen(st1+sym->n.n.n_offset)+1; ++ NM(sym,st1,s,sl+=strlen(s)+1); + + sym+=sym->n_numaux; + +@@ -274,10 +279,7 @@ load_self_symbols() { + if (sym->n_sclass!=2 || sym->n_scnum<1) + continue; + +- if (sym->n.n.n_zeroes) +- STOP(sym->n.n_name,strcpy(st,sym->n.n_name)); +- else +- strcpy(st,st1+sym->n.n.n_offset); ++ NM(sym,st1,s,strcpy(st,s)); + + sec=sec1+sym->n_scnum-1; + jj=sym->n_value+sec->s_vaddr+h->h_ibase; +@@ -343,7 +345,7 @@ find_init_string(const char *s) { + struct syment *sy1,*sym,*sye; + char *st1,*ste; + void *st,*est; +- object o; ++ object o=OBJNULL; + + massert(f=fopen(s,"r")); + massert(st=get_mmap(f,&est)); +@@ -358,13 +360,9 @@ find_init_string(const char *s) { + + for (sym=sy1;symn.n.n_zeroes ? sym->n.n_name : st1+sym->n.n.n_offset; +- +- if (!strncmp(s,"_init_",6)) { +- if (sym->n.n.n_zeroes) +- STOP((char *)s,o=make_simple_string(s)); +- else +- o=make_simple_string(s); ++ NM(sym,st1,s,if (!strncmp(s,"_init_",6)) o=make_simple_string(s)); ++ ++ if (o!=OBJNULL) { + massert(!un_mmap(st,&est)); + massert(!fclose(f)); + return o; +--- gcl-2.6.12.orig/o/sockets.c ++++ gcl-2.6.12/o/sockets.c +@@ -33,8 +33,8 @@ Foundation, 675 Mass Ave, Cambridge, MA + # include + # include + #else +-# include + # include ++# include + #endif + + #ifdef __STDC__ +--- gcl-2.6.12.orig/o/unexnt.c ++++ gcl-2.6.12/o/unexnt.c +@@ -780,7 +780,7 @@ map_in_heap (char *filename) + } + + size = get_committed_heap_size (); +- file_base = MapViewOfFileEx (file_mapping, FILE_MAP_COPY, 0, ++ file_base = MapViewOfFileEx (file_mapping, FILE_MAP_COPY|FILE_MAP_EXECUTE, 0, + heap_index_in_executable, size, + get_heap_start ()); + if (file_base != 0) +@@ -794,7 +794,7 @@ map_in_heap (char *filename) + CloseHandle (file_mapping); + + if (VirtualAlloc (get_heap_start (), get_committed_heap_size (), +- MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE) == NULL) ++ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE) == NULL) + { + i = GetLastError (); + do_gcl_abort(); +@@ -1057,7 +1057,7 @@ sbrk (ptrdiff_t increment) + + /* Commit more of our heap. */ + if (VirtualAlloc (data_region_end, size, MEM_COMMIT, +- PAGE_READWRITE) == NULL) ++ PAGE_EXECUTE_READWRITE) == NULL) + return NULL; + data_region_end += size; + +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -21,6 +21,7 @@ Foundation, 675 Mass Ave, Cambridge, MA + + #include + #include ++#include + + #define IN_UNIXFSYS + #include "include.h" +@@ -72,39 +73,43 @@ coerce_to_filename1(object spec, char *p + memcpy(p,namestring->st.st_self,namestring->st.st_fillp); + p[namestring->st.st_fillp]=0; + +-#ifdef FIX_FILENAME +- FIX_FILENAME(spec,p); +-#endif +- + } + ++#ifndef __MINGW32__ ++static char GETPW_BUF[4096]; ++#endif ++ + DEFUN_NEW("UID-TO-NAME",object,fSuid_to_name,SI,1,1,NONE,OI,OO,OO,OO,(fixnum uid),"") { ++#ifndef __MINGW32__ + struct passwd *pwent,pw; + long r; + + massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); +- massert(r<=sizeof(FN1));/*FIXME maybe once at image startup*/ ++ massert(r<=sizeof(GETPW_BUF));/*FIXME maybe once at image startup*/ + +- massert(!getpwuid_r(uid,&pw,FN1,r,&pwent)); ++ massert(!getpwuid_r(uid,&pw,GETPW_BUF,r,&pwent)); + + RETURN1(make_simple_string(pwent->pw_name)); +- ++#else ++ RETURN1(Cnil); ++#endif + } + + DEFUN_NEW("HOME-NAMESTRING",object,fShome_namestring,SI,1,1,NONE,OO,OO,OO,OO,(object nm),"") { + ++#ifndef __MINGW32__ + struct passwd *pwent,pw; + long r; + + massert((r=sysconf(_SC_GETPW_R_SIZE_MAX))>=0); +- massert(r<=sizeof(FN1));/*FIXME maybe once at image startup*/ ++ massert(r<=sizeof(GETPW_BUF));/*FIXME maybe once at image startup*/ + + if (nm->st.st_fillp==1) + + if ((pw.pw_dir=getenv("HOME"))) + pwent=&pw; + else +- massert(!getpwuid_r(getuid(),&pw,FN1,r,&pwent) && pwent); ++ massert(!getpwuid_r(getuid(),&pw,GETPW_BUF,r,&pwent) && pwent); + + else { + +@@ -112,15 +117,19 @@ DEFUN_NEW("HOME-NAMESTRING",object,fShom + memcpy(FN2,nm->st.st_self+1,nm->st.st_fillp-1); + FN2[nm->st.st_fillp-1]=0; + +- massert(!getpwnam_r(FN2,&pw,FN1,r,&pwent) && pwent); ++ massert(!getpwnam_r(FN2,&pw,GETPW_BUF,r,&pwent) && pwent); + + } + +- massert(strlen(pwent->pw_dir)+2pw_dir,strlen(pwent->pw_dir)); +- FN3[strlen(pwent->pw_dir)]='/'; +- FN3[strlen(pwent->pw_dir)+1]=0; ++ massert((r=strlen(pwent->pw_dir))+2pw_dir,r); ++ FN3[r]='/'; ++ FN3[r+1]=0; + RETURN1(make_simple_string(FN3)); ++#else ++ massert(snprintf(FN1,sizeof(FN1)-1,"%s%s",getenv("SystemDrive"),getenv("HOMEPATH"))>=0); ++ RETURN1(make_simple_string(FN1)); ++#endif + + } + +@@ -160,28 +169,61 @@ DEF_ORDINARY("DIRECTORY",sKdirectory,KEY + DEF_ORDINARY("LINK",sKlink,KEYWORD,""); + DEF_ORDINARY("FILE",sKfile,KEYWORD,""); + ++object ++file_stream(object x) { ++ if (type_of(x)==t_stream) ++ switch(x->sm.sm_mode) { ++ case smm_input: ++ case smm_output: ++ case smm_io: ++ case smm_probe: ++ return x; ++ case smm_synonym: ++ return file_stream(x->sm.sm_object0->s.s_dbind); ++ default: ++ break; ++ } ++ return Cnil; ++} ++ ++ + DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + + struct stat ss; + +- check_type_string(&x); +- coerce_to_filename(x,FN1); ++ if (type_of(x)==t_string) { ++ ++ coerce_to_filename(x,FN1); + + #ifdef __MINGW32__ +- { +- char *p=FN1+strlen(FN1)-1; +- for (;p>FN1 && *p=='/';p--) +- *p=0; +- } ++ {char *p=FN1+strlen(FN1)-1;for (;p>FN1 && *p=='/';p--) *p=0;} + #endif +- if (lstat(FN1,&ss)) ++ if (lstat(FN1,&ss)) ++ RETURN1(Cnil); ++ } else if ((x=file_stream(x))!=Cnil&&x->sm.sm_fp) { ++ if (fstat(fileno(x->sm.sm_fp),&ss)) ++ RETURN1(Cnil); ++ } else + RETURN1(Cnil); +- else +- RETURN4(S_ISDIR(ss.st_mode) ? sKdirectory : +- (S_ISLNK(ss.st_mode) ? sKlink : sKfile), +- make_fixnum(ss.st_size), +- make_fixnum(ss.st_mtime), +- make_fixnum(ss.st_uid)); ++ ++ RETURN4(S_ISDIR(ss.st_mode) ? sKdirectory : ++ (S_ISLNK(ss.st_mode) ? sKlink : sKfile), ++ make_fixnum(ss.st_size), ++ make_fixnum(ss.st_mtime), ++ make_fixnum(ss.st_uid)); ++ ++} ++ ++DEFUN_NEW("FTELL",object,fSftell,SI,1,1,NONE,IO,OO,OO,OO,(object x),"") { ++ ++ RETURN1((x=file_stream(x))!=Cnil&&x->sm.sm_fp ? (object)ftell(x->sm.sm_fp) : (object)0); ++ ++} ++ ++DEFUN_NEW("FSEEK",object,fSfseek,SI,2,2,NONE,OO,IO,OO,OO,(object x,fixnum pos),"") { ++ ++ RETURN1((x=file_stream(x))!=Cnil&&x->sm.sm_fp&&!fseek(x->sm.sm_fp,pos,SEEK_SET) ? Ct : Cnil); ++ + } + + #include +@@ -198,7 +240,11 @@ DEFUN_NEW("READLINKAT",object,fSreadlink + massert(z1st.st_self,z1); + FN1[z1]=0; ++#ifndef __MINGW32__ + massert((l=readlinkat(d ? dirfd((DIR *)d) : AT_FDCWD,FN1,FN2,sizeof(FN2)))>=0 && ld_type ++#else ++#define get_d_type(e,s) \ ++ ({struct stat ss;\ ++ massert(snprintf(FN1,sizeof(FN1),"%-*.*s%s",s->st.st_fillp,s->st.st_fillp,s->st.st_self,e->d_name)>=0);\ ++ lstat(FN1,&ss);S_ISDIR(ss.st_mode) ? DT_DIR : DT_REG;}) ++#endif + + if (!x) RETURN1(Cnil); + + tl=telldir((DIR *)x); + +-#ifndef HAVE_D_TYPE +- y=DT_UNKNOWN; +-#endif +- for (;(e=readdir((DIR *)x)) && y!=DT_UNKNOWN && e->d_type!=y;); ++ for (;(e=readdir((DIR *)x)) && y!=DT_UNKNOWN && y!=(d_type=get_d_type(e,s));); + if (!e) RETURN1(Cnil); + + if (s==Cnil) +@@ -290,9 +354,7 @@ DEFUN_NEW("READDIR",object,fSreaddir,SI, + } + } + +-#ifdef HAVE_D_TYPE +- if (y==DT_UNKNOWN) z=MMcons(z,make_fixnum(e->d_type)); +-#endif ++ if (y==DT_UNKNOWN) z=MMcons(z,make_fixnum(d_type)); + + RETURN1(z); + +--- gcl-2.6.12.orig/o/unixsys.c ++++ gcl-2.6.12/o/unixsys.c +@@ -24,10 +24,14 @@ Foundation, 675 Mass Ave, Cambridge, MA + #include + #include + #include ++#ifndef __MINGW32__ + #include ++#endif + + #include "include.h" + ++#ifndef __MINGW32__ ++ + int + vsystem(const char *command) { + +@@ -43,12 +47,13 @@ vsystem(const char *command) { + + else { + +- z=alloca(n); +- memcpy(z,command,n); ++ massert(ns.s_dbind=Cnil; +- +- if (stat(s,&ss)) +- return; +- +- massert(f=fopen(s,"r")); +- massert(fscanf(f,"%s",b)==1); +- massert(fscanf(f,"%s",b)==1); +- massert(!fclose(f)); +- +- if (strncmp("wineserver",b,9)) +- return; +- +- massert(o=sSAsystem_directoryA->s.s_dbind); +- massert(o!=Cnil); +- mpid=getpid(); +- +- massert(snprintf(b,sizeof(b),"%-.*smsys /tmp/ out%0d tmp%0d log%0d", +- o->st.st_fillp,o->st.st_self,mpid,mpid,mpid)>0); +- massert(!psystem(b)); +- +- sSAwine_detectedA->s.s_dbind=Ct; +- +- massert(!atexit(close_msys)); +- +-} +-#endif +- + int + msystem(const char *s) { + +- int r; +- +-#ifdef _WIN32 +- +- if (sSAwine_detectedA->s.s_dbind==Ct) { +- +- char b[4096],b1[4096],c; +- FILE *fp; +- +- massert(snprintf(b,sizeof(b),"/tmp/out%0d",mpid)>0); +- massert(snprintf(b1,sizeof(b1),"%s1",b)>0); +- +- massert(fp=fopen(b1,"w")); +- massert(fprintf(fp,"%s",s)>=0); +- massert(!fclose(fp)); +- +- massert(MoveFileEx(b1,b,MOVEFILE_REPLACE_EXISTING)); +- +- if (!*s) +- return 0; +- +- for (;;Sleep(100)) { +- +- massert(fp=fopen(b,"r")); +- massert((c=fgetc(fp))!=EOF); +- if (c!=s[0]) { +- massert(ungetc(c,fp)!=EOF); +- break; +- } +- massert(!fclose(fp)); +- +- } +- +- massert(fscanf(fp,"%d",&r)==1); +- massert(!fclose(fp)); +- +- } else +- +-#endif +- +- r=psystem(s); +- +- return r; ++ return psystem(s); + + } + +--- gcl-2.6.12.orig/unixport/makefile ++++ gcl-2.6.12/unixport/makefile +@@ -77,8 +77,8 @@ sys_init.lsp: sys_init.lsp.in + -e "s#@LI-MINVERS@#`cat ../minvers | cut -f1 -d.`#1" \ + -e "s#@LI-MAJVERS@#`cat ../majvers`#1" \ + -e "s#@LI-RELEASE@#`cat ../release`#1" \ +- -e "s#@LI-CC@#\"$(CC) -c $(FINAL_CFLAGS)\"#1" \ +- -e "s#@LI-LD@#\"$(CC) $(LD_FLAGS) -o \"#1" \ ++ -e "s#@LI-CC@#\"$(GCL_CC) -c $(FINAL_CFLAGS)\"#1" \ ++ -e "s#@LI-LD@#\"$(GCL_CC) $(LD_FLAGS) -o \"#1" \ + -e "s#@LI-LD-LIBS@#\" $(LD_LIBS_PRE) -l$* $(LD_LIBS_POST)\"#1" \ + -e "s#@LI-OPT-THREE@#\"$(O3FLAGS)\"#1" \ + -e "s#@LI-OPT-TWO@#\"$(O2FLAGS)\"#1" \ +@@ -92,7 +92,7 @@ saved_%:raw_% $(RSYM) sys_init.lsp raw_% + + cp sys_init.lsp foo + echo "(unless si::*quit-tags* (in-package \"USER\")(system:save-system \"$@\"))" >>foo +- ar x lib$*.a $$(ar t lib$*.a |grep ^gcl_) ++ j=$$(ar t lib$*.a |grep ^gcl_);[ "$$j" = "" ] || ar x lib$*.a $$j #accelerator + $(PORTDIR)/raw_$*$(EXE) $(PORTDIR)/ -libdir $(GCLDIR)/ < foo + # check that saved image can be prelinked + [ "$(PRELINK_CHECK)" = "" ] || \ +--- gcl-2.6.12.orig/unixport/sys.c ++++ gcl-2.6.12/unixport/sys.c +@@ -15,16 +15,6 @@ ar_init_fn(void (fn)(void),const char *s + if (stat(s,&ss)) { + assert(snprintf(b,sizeof(b),"ar x %-.*slib%sgcl.a %s",sysd->st.st_fillp,sysd->st.st_self,FLAVOR,s)>0); + assert(!msystem(b)); +-#ifdef _WIN32 +- if (sSAwine_detectedA->s.s_dbind!=Cnil) { +- char *n; +- unsigned l; +- l=strlen(s)+6; +- n=alloca(l); +- snprintf(n,l,"/tmp/%s",s); +- s=(void *)n; +- } +-#endif + } + gcl_init_or_load1(fn,s); + assert(!unlink(s)); diff --git a/debian/patches/pathnames1.6 b/debian/patches/pathnames1.6 new file mode 100644 index 0000000..a5aab6c --- /dev/null +++ b/debian/patches/pathnames1.6 @@ -0,0 +1,42 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-42) unstable; urgency=medium + . + * pathnames1.6 + * Bug fix: "FTBFS with bindnow and PIE enabled", thanks to Balint Reczey + (Closes: #837481). + * Bug fix: "FTBFS with compilers that default to -fPIE (patch + attached)", thanks to Adam Conrad (Closes: #822820). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/822820 +Bug-Debian: https://bugs.debian.org/837481 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-26 + +--- gcl-2.6.12.orig/o/makefile ++++ gcl-2.6.12/o/makefile +@@ -34,7 +34,7 @@ boot.o: boot.c $(DECL) boot.h + $(CC) -c $(CFLAGS) $(DEFS) -fPIC $*.c $(AUX_INFO) + + prelink.o: prelink.c $(DECL) +- $(CC) -fPIE -c $(filter-out -pg,$(CFLAGS)) $(DEFS) $*.c $(AUX_INFO) ++ $(CC) -c $(filter-out -pg,$(CFLAGS)) -fPIE $(DEFS) $*.c $(AUX_INFO) + + %.o: %.c $(DECL) + $(CC) -c $(CFLAGS) $(DEFS) $*.c $(AUX_INFO) diff --git a/debian/patches/pathnames1.7 b/debian/patches/pathnames1.7 new file mode 100644 index 0000000..64d424a --- /dev/null +++ b/debian/patches/pathnames1.7 @@ -0,0 +1,601 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-42) unstable; urgency=medium + . + * pathnames1.6 + * Bug fix: "FTBFS with bindnow and PIE enabled", thanks to Balint Reczey + (Closes: #837481). + * Bug fix: "FTBFS with compilers that default to -fPIE (patch + attached)", thanks to Adam Conrad (Closes: #822820). +Author: Camm Maguire +Bug-Debian: https://bugs.debian.org/822820 +Bug-Debian: https://bugs.debian.org/837481 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-27 + +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -3853,9 +3853,8 @@ if echo $GCL_CC |grep gcc |grep -q win; + fi + + +-add_arg_to_tcflags() { ++add_arg_to_cflags() { + +- local i=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLAG $1" >&5 + $as_echo_n "checking for CFLAG $1... " >&6; } + CFLAGS_ORI=$CFLAGS +@@ -3877,8 +3876,8 @@ main () + } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +- TCFLAGS="$TCFLAGS $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; };i=0 ++ CFLAGS="$CFLAGS_ORI $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; };return 0 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +@@ -3888,27 +3887,26 @@ rm -f core *.core core.conftest.* gmon.o + fi + + CFLAGS=$CFLAGS_ORI +- return $i ++ return 1 + + } + +-assert_arg_to_tcflags() { +- if ! add_arg_to_tcflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5 ++assert_arg_to_cflags() { ++ if ! add_arg_to_cflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5 + $as_echo "cannot add $1 to CFLAGS" >&6; }; exit 1 ; fi + return 0 + } + +-add_args_to_tcflags() { ++add_args_to_cflags() { + + while test "$#" -ge 1 ; do +- add_arg_to_tcflags $1 ++ add_arg_to_cflags $1 + shift + done + } + +-add_arg_to_tldflags() { ++add_arg_to_ldflags() { + +- local i=1 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LDFLAG $1" >&5 + $as_echo_n "checking for LDFLAG $1... " >&6; } + LDFLAGS_ORI=$LDFLAGS +@@ -3929,8 +3927,8 @@ main () + } + _ACEOF + if ac_fn_c_try_run "$LINENO"; then : +- TLDFLAGS="$TLDFLAGS $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; };i=0 ++ LDFLAGS="$LDFLAGS_ORI $1";{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; };return 0 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + $as_echo "no" >&6; } +@@ -3940,20 +3938,20 @@ rm -f core *.core core.conftest.* gmon.o + fi + + LDFLAGS=$LDFLAGS_ORI +- return $i ++ return 1 + + } + +-assert_arg_to_tldflags() { +- if ! add_arg_to_tldflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to LDFLAGS" >&5 ++assert_arg_to_ldflags() { ++ if ! add_arg_to_ldflags $1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to LDFLAGS" >&5 + $as_echo "cannot add $1 to LDFLAGS" >&6; }; exit 1 ; fi + return 0 + } + +-add_args_to_tldflags() { ++add_args_to_ldflags() { + + while test "$#" -ge 1 ; do +- add_arg_to_tldflags $1 ++ add_arg_to_ldflags $1 + shift + done + } +@@ -3975,16 +3973,14 @@ $as_echo "removing $1 from LDFLAGS" >&6; + + } + +-TCFLAGS="" +-add_args_to_tcflags -fsigned-char -pipe \ ++add_args_to_cflags -fsigned-char -pipe \ + -fno-builtin-malloc -fno-builtin-free \ + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ + -Wno-unused-but-set-variable -Wno-misleading-indentation + +-TLDFLAGS="" +-add_args_to_tldflags -Wl,-no_pie -no-pie -Wl,-z,lazy ++add_args_to_ldflags -Wl,-no_pie -no-pie -Wl,-z,lazy + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 + $as_echo_n "checking for clang... " >&6; } +@@ -4032,29 +4028,29 @@ fi + + case $use in + *mingw*) +- assert_arg_to_tcflags -fno-zero-initialized-in-bss +- assert_arg_to_tcflags -mms-bitfields;; ++ assert_arg_to_cflags -fno-zero-initialized-in-bss ++ assert_arg_to_cflags -mms-bitfields;; + *gnuwin*) +- assert_arg_to_tcflags -fno-zero-initialized-in-bss +- assert_arg_to_tcflags -mms-bitfields +- assert_arg_to_tldflags -Wl,--stack,8000000;; ++ assert_arg_to_cflags -fno-zero-initialized-in-bss ++ assert_arg_to_cflags -mms-bitfields ++ assert_arg_to_ldflags -Wl,--stack,8000000;; + 386-macosx) +- assert_arg_to_tldflags -Wl,-no_pie ++ assert_arg_to_ldflags -Wl,-no_pie + if test "$build_cpu" = "x86_64" ; then +- assert_arg_to_tcflags -m64 +- assert_arg_to_tldflags -m64 +- assert_arg_to_tldflags -Wl,-headerpad,72 ++ assert_arg_to_cflags -m64 ++ assert_arg_to_ldflags -m64 ++ assert_arg_to_ldflags -Wl,-headerpad,72 + else +- assert_arg_to_tcflags -m32 +- assert_arg_to_tldflags -m32 +- assert_arg_to_tldflags -Wl,-headerpad,56 ++ assert_arg_to_cflags -m32 ++ assert_arg_to_ldflags -m32 ++ assert_arg_to_ldflags -Wl,-headerpad,56 + fi;; +- FreeBSD) assert_arg_to_tldflags -Z;; ++ FreeBSD) assert_arg_to_ldflags -Z;; + esac + + if test "$enable_static" = "yes" ; then +- assert_arg_to_tldflags -static +- assert_arg_to_tldflags -Wl,-zmuldefs ++ assert_arg_to_ldflags -static ++ assert_arg_to_ldflags -Wl,-zmuldefs + + $as_echo "#define STATIC_LINKING 1" >>confdefs.h + +@@ -4148,7 +4144,7 @@ cat >>confdefs.h <<_ACEOF + #define GCL_GPROF_START $GCL_GPROF_START + _ACEOF + +- assert_arg_to_tcflags -pg ++ assert_arg_to_cflags -pg + case $use in + s390*) ;; # relocation truncation bug in gcc + *) TLIBS="$TLIBS -pg";; +@@ -4164,7 +4160,7 @@ fi + + + if test "$enable_debug" = "yes" ; then +- assert_arg_to_tcflags -g ++ assert_arg_to_cflags -g + # for subconfigurations + CFLAGS="$CFLAGS -g" + else +@@ -4175,41 +4171,41 @@ fi + # gcc on ppc cannot compile our new_init.c with full opts --CM + TONIFLAGS="" + case $use in +- powerpc*macosx) assert_arg_to_tcflags -mlongcall;; ++ powerpc*macosx) assert_arg_to_cflags -mlongcall;; + *linux) + case $use in + alpha*) +- assert_arg_to_tcflags -mieee ++ assert_arg_to_cflags -mieee + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1 + ;; + aarch64*) + TLIBS="$TLIBS -lgcc_s";; + hppa*) +- assert_arg_to_tcflags -mlong-calls ++ assert_arg_to_cflags -mlong-calls + TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O2" ; TFPFLAG=""; fi #FIXME needed asof gcc 4.8.1 + ;; + mips*) + case $canonical in + mips64*linux*) +- assert_arg_to_tldflags -Wl,-z,now;; ++ assert_arg_to_ldflags -Wl,-z,now;; + esac + ;; + ia64*) + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; + arm*) +- assert_arg_to_tcflags -mlong-calls +- assert_arg_to_tcflags -fdollars-in-identifiers +- assert_arg_to_tcflags -g #? ++ assert_arg_to_cflags -mlong-calls ++ assert_arg_to_cflags -fdollars-in-identifiers ++ assert_arg_to_cflags -g #? + ;; + powerpc*) +- assert_arg_to_tcflags -mlongcall ++ assert_arg_to_cflags -mlongcall + ;; + esac;; + esac + if test "$enable_pic" = "yes" ; then +- assert_arg_to_tcflags -fPIC ++ assert_arg_to_cflags -fPIC + fi + + +@@ -5385,7 +5381,7 @@ fi + + + TLIBS="$TLIBS -ldl -rdynamic" +- assert_arg_to_tcflags -fPIC ++ assert_arg_to_cflags -fPIC + + $as_echo "#define USE_DLOPEN 1" >>confdefs.h + +@@ -5869,7 +5865,7 @@ $as_echo "#define HAVE_XDR 1" >>confdefs + + if test "$XDR_LIB" != " "; then + TLIBS="$TLIBS -l$XDR_LIB" +- add_arg_to_tcflags -I/usr/include/$XDR_LIB ++ add_arg_to_cflags -I/usr/include/$XDR_LIB + fi + fi + fi +@@ -6935,7 +6931,7 @@ if test "$use" != "386-gnu" ; then #hurd + $as_echo_n "checking finding default linker script... " >&6; } + touch unixport/gcl.script + echo "int main() {return 0;}" >foo.c +- $CC $TLDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ ++ $CC $LDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ + $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script + rm -rf foo.c foo + +@@ -6956,7 +6952,7 @@ $as_echo "$as_me: trying to adjust text + cat gcl.script.def | $AWK '/SIZEOF_HEADERS/ {gsub("0x[0-9]*","0x" j,$0);} {print}' j=$j >gcl.script + # diff -u gcl.script.def gcl.script + echo "int main() {return 0;}" >foo.c +- if ( $CC $TLDFLAGS -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then ++ if ( $CC $LDFLAGS -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then + if test $n -lt $min ; then min=$n; fi; + if test $n -gt $max; then max=$n; fi; + elif test $max -gt 0 ; then +@@ -7020,7 +7016,7 @@ $as_echo_n "checking our linker script.. + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 + $as_echo "done" >&6; } + rm -f gcl.script.def +- LDFLAGS="$LDFLAGS -Wl,-T gcl.script " ++ assert_arg_to_ldflags -Wl,-T,gcl.script + cp gcl.script unixport + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none found or not needed" >&5 +@@ -9065,16 +9061,16 @@ fi + + + +-LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'` $TLDFLAGS" ++LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'`" + + LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $LIBS $TLIBS" + +-FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS $TCFLAGS" ++FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS" + + # Work around bug with gcc on ppc -- CM +-NIFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TONIFLAGS -I\$(GCLDIR)/o" ++NIFLAGS="$CFLAGS $CPPFLAGS $TONIFLAGS -I\$(GCLDIR)/o" + +-CFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TO3FLAGS -I\$(GCLDIR)/o" ++CFLAGS="$CFLAGS $CPPFLAGS $TO3FLAGS -I\$(GCLDIR)/o" + + O3FLAGS=$TO3FLAGS + +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -185,60 +185,58 @@ if echo $GCL_CC |grep gcc |grep -q win; + fi + AC_SUBST(GCL_CC) + +-add_arg_to_tcflags() { ++add_arg_to_cflags() { + +- local i=1 + AC_MSG_CHECKING([for CFLAG $1]) + CFLAGS_ORI=$CFLAGS + CFLAGS="$CFLAGS -Werror $1 `echo $1|sed 's,-Wno-,-W,1'`" + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([[]],[[]])], +- [TCFLAGS="$TCFLAGS $1";AC_MSG_RESULT([yes]);i=0], ++ [CFLAGS="$CFLAGS_ORI $1";AC_MSG_RESULT([yes]);return 0], + [AC_MSG_RESULT([no])], + [AC_MSG_RESULT([no])]) + CFLAGS=$CFLAGS_ORI +- return $i ++ return 1 + + } + +-assert_arg_to_tcflags() { +- if ! add_arg_to_tcflags $1 ; then AC_MSG_RESULT([cannot add $1 to CFLAGS]); exit 1 ; fi ++assert_arg_to_cflags() { ++ if ! add_arg_to_cflags $1 ; then AC_MSG_RESULT([cannot add $1 to CFLAGS]); exit 1 ; fi + return 0 + } + +-add_args_to_tcflags() { ++add_args_to_cflags() { + + while test "$#" -ge 1 ; do +- add_arg_to_tcflags $1 ++ add_arg_to_cflags $1 + shift + done + } + +-add_arg_to_tldflags() { ++add_arg_to_ldflags() { + +- local i=1 + AC_MSG_CHECKING([for LDFLAG $1]) + LDFLAGS_ORI=$LDFLAGS + LDFLAGS="$LDFLAGS -Werror $1" + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([[]],[[]])], +- [TLDFLAGS="$TLDFLAGS $1";AC_MSG_RESULT([yes]);i=0], ++ [LDFLAGS="$LDFLAGS_ORI $1";AC_MSG_RESULT([yes]);return 0], + [AC_MSG_RESULT([no])], + [AC_MSG_RESULT([no])]) + LDFLAGS=$LDFLAGS_ORI +- return $i ++ return 1 + + } + +-assert_arg_to_tldflags() { +- if ! add_arg_to_tldflags $1 ; then AC_MSG_RESULT([cannot add $1 to LDFLAGS]); exit 1 ; fi ++assert_arg_to_ldflags() { ++ if ! add_arg_to_ldflags $1 ; then AC_MSG_RESULT([cannot add $1 to LDFLAGS]); exit 1 ; fi + return 0 + } + +-add_args_to_tldflags() { ++add_args_to_ldflags() { + + while test "$#" -ge 1 ; do +- add_arg_to_tldflags $1 ++ add_arg_to_ldflags $1 + shift + done + } +@@ -259,16 +257,14 @@ remove_arg_from_ldflags() { + + } + +-TCFLAGS="" +-add_args_to_tcflags -fsigned-char -pipe \ ++add_args_to_cflags -fsigned-char -pipe \ + -fno-builtin-malloc -fno-builtin-free \ + -fno-PIE -fno-pie -fno-PIC -fno-pic \ + -Wall \ + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ + -Wno-unused-but-set-variable -Wno-misleading-indentation + +-TLDFLAGS="" +-add_args_to_tldflags -Wl,-no_pie -no-pie -Wl,-z,lazy ++add_args_to_ldflags -Wl,-no_pie -no-pie -Wl,-z,lazy + + AC_MSG_CHECKING([for clang]) + AC_RUN_IFELSE( +@@ -290,29 +286,29 @@ AC_RUN_IFELSE( + + case $use in + *mingw*) +- assert_arg_to_tcflags -fno-zero-initialized-in-bss +- assert_arg_to_tcflags -mms-bitfields;; ++ assert_arg_to_cflags -fno-zero-initialized-in-bss ++ assert_arg_to_cflags -mms-bitfields;; + *gnuwin*) +- assert_arg_to_tcflags -fno-zero-initialized-in-bss +- assert_arg_to_tcflags -mms-bitfields +- assert_arg_to_tldflags -Wl,--stack,8000000;; ++ assert_arg_to_cflags -fno-zero-initialized-in-bss ++ assert_arg_to_cflags -mms-bitfields ++ assert_arg_to_ldflags -Wl,--stack,8000000;; + 386-macosx) +- assert_arg_to_tldflags -Wl,-no_pie ++ assert_arg_to_ldflags -Wl,-no_pie + if test "$build_cpu" = "x86_64" ; then +- assert_arg_to_tcflags -m64 +- assert_arg_to_tldflags -m64 +- assert_arg_to_tldflags -Wl,-headerpad,72 ++ assert_arg_to_cflags -m64 ++ assert_arg_to_ldflags -m64 ++ assert_arg_to_ldflags -Wl,-headerpad,72 + else +- assert_arg_to_tcflags -m32 +- assert_arg_to_tldflags -m32 +- assert_arg_to_tldflags -Wl,-headerpad,56 ++ assert_arg_to_cflags -m32 ++ assert_arg_to_ldflags -m32 ++ assert_arg_to_ldflags -Wl,-headerpad,56 + fi;; +- FreeBSD) assert_arg_to_tldflags -Z;; ++ FreeBSD) assert_arg_to_ldflags -Z;; + esac + + if test "$enable_static" = "yes" ; then +- assert_arg_to_tldflags -static +- assert_arg_to_tldflags -Wl,-zmuldefs ++ assert_arg_to_ldflags -static ++ assert_arg_to_ldflags -Wl,-zmuldefs + AC_DEFINE(STATIC_LINKING,1,[staticly linked images]) + fi + +@@ -353,7 +349,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + if test "$GCL_GPROF_START" != "" ; then + AC_MSG_RESULT($GCL_GPROF_START) + AC_DEFINE_UNQUOTED(GCL_GPROF_START,$GCL_GPROF_START,[starting address for gprof]) +- assert_arg_to_tcflags -pg ++ assert_arg_to_cflags -pg + case $use in + s390*) ;; # relocation truncation bug in gcc + *) TLIBS="$TLIBS -pg";; +@@ -365,7 +361,7 @@ AC_ARG_ENABLE([gprof],[ --enable-gprof + fi]) + + if test "$enable_debug" = "yes" ; then +- assert_arg_to_tcflags -g ++ assert_arg_to_cflags -g + # for subconfigurations + CFLAGS="$CFLAGS -g" + else +@@ -376,41 +372,41 @@ fi + # gcc on ppc cannot compile our new_init.c with full opts --CM + TONIFLAGS="" + case $use in +- powerpc*macosx) assert_arg_to_tcflags -mlongcall;; ++ powerpc*macosx) assert_arg_to_cflags -mlongcall;; + *linux) + case $use in + alpha*) +- assert_arg_to_tcflags -mieee ++ assert_arg_to_cflags -mieee + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O0" ; fi #FIXME needed asof gcc 4.8.1 + ;; + aarch64*) + TLIBS="$TLIBS -lgcc_s";; + hppa*) +- assert_arg_to_tcflags -mlong-calls ++ assert_arg_to_cflags -mlong-calls + TLIBS="$TLIBS -lgcc_s" # workaround hppa __moddi3 local func symbols with default linker flags + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O2" ; TFPFLAG=""; fi #FIXME needed asof gcc 4.8.1 + ;; + mips*) + case $canonical in + mips64*linux*) +- assert_arg_to_tldflags -Wl,-z,now;; ++ assert_arg_to_ldflags -Wl,-z,now;; + esac + ;; + ia64*) + if test "$enable_debug" != "yes" ; then TO3FLAGS="-O" ; fi #FIXME needed asof gcc 4.8.1 + ;; + arm*) +- assert_arg_to_tcflags -mlong-calls +- assert_arg_to_tcflags -fdollars-in-identifiers +- assert_arg_to_tcflags -g #? ++ assert_arg_to_cflags -mlong-calls ++ assert_arg_to_cflags -fdollars-in-identifiers ++ assert_arg_to_cflags -g #? + ;; + powerpc*) +- assert_arg_to_tcflags -mlongcall ++ assert_arg_to_cflags -mlongcall + ;; + esac;; + esac + if test "$enable_pic" = "yes" ; then +- assert_arg_to_tcflags -fPIC ++ assert_arg_to_cflags -fPIC + fi + + +@@ -715,7 +711,7 @@ if test "$enable_dlopen" = "yes" ; then + AC_CHECK_LIB([dl],[dlopen],,AC_MSG_ERROR([Cannot find dlopen])) + + TLIBS="$TLIBS -ldl -rdynamic" +- assert_arg_to_tcflags -fPIC ++ assert_arg_to_cflags -fPIC + AC_DEFINE(USE_DLOPEN,1,[link compiled objects via libdl]) + + fi +@@ -834,7 +830,7 @@ if test "$enable_xdr" != "no" ; then + AC_DEFINE(HAVE_XDR,1,[have xdr extensions]) + if test "$XDR_LIB" != " "; then + TLIBS="$TLIBS -l$XDR_LIB" +- add_arg_to_tcflags -I/usr/include/$XDR_LIB ++ add_arg_to_cflags -I/usr/include/$XDR_LIB + fi + fi + fi +@@ -1345,7 +1341,7 @@ if test "$use" != "386-gnu" ; then #hurd + AC_MSG_CHECKING([finding default linker script]) + touch unixport/gcl.script + echo "int main() {return 0;}" >foo.c +- $CC $TLDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ ++ $CC $LDFLAGS -Wl,--verbose foo.c -o foo 2>&1 | \ + $AWK '/\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=/ {i=1-i;next} {if (i) print}' >gcl.script + rm -rf foo.c foo + +@@ -1364,7 +1360,7 @@ if test "$use" != "386-gnu" ; then #hurd + cat gcl.script.def | $AWK '/SIZEOF_HEADERS/ {gsub("0x[[0-9]]*","0x" j,$0);} {print}' j=$j >gcl.script + # diff -u gcl.script.def gcl.script + echo "int main() {return 0;}" >foo.c +- if ( $CC $TLDFLAGS -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then ++ if ( $CC $LDFLAGS -Wl,-T gcl.script foo.c -o foo && ./foo ) >/dev/null 2>&1 ; then + if test $n -lt $min ; then min=$n; fi; + if test $n -gt $max; then max=$n; fi; + elif test $max -gt 0 ; then +@@ -1409,7 +1405,7 @@ if test "$use" != "386-gnu" ; then #hurd + cat gcl.script.def | $AWK '/SIZEOF_HEADERS/ {gsub("0x[[0-9]]*","0x" j,$0);} {print}' j=$j >gcl.script + AC_MSG_RESULT([done]) + rm -f gcl.script.def +- LDFLAGS="$LDFLAGS -Wl,-T gcl.script " ++ assert_arg_to_ldflags -Wl,-T,gcl.script + cp gcl.script unixport + else + AC_MSG_RESULT([none found or not needed]) +@@ -2116,16 +2112,16 @@ AC_CHECK_HEADERS(alloca.h) + AC_FUNC_ALLOCA + + +-LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'` $TLDFLAGS" ++LDFLAGS="`echo $LDFLAGS | sed 's,gcl.script,../unixport/gcl.script,g'`" + AC_SUBST(LDFLAGS) + LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS $LIBS $TLIBS" + AC_SUBST(LIBS) +-FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS $TCFLAGS" ++FINAL_CFLAGS="$CFLAGS $CPPFLAGS $X_CFLAGS" + AC_SUBST(FINAL_CFLAGS) + # Work around bug with gcc on ppc -- CM +-NIFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TONIFLAGS -I\$(GCLDIR)/o" ++NIFLAGS="$CFLAGS $CPPFLAGS $TONIFLAGS -I\$(GCLDIR)/o" + AC_SUBST(NIFLAGS) +-CFLAGS="$CFLAGS $CPPFLAGS $TCFLAGS $TO3FLAGS -I\$(GCLDIR)/o" ++CFLAGS="$CFLAGS $CPPFLAGS $TO3FLAGS -I\$(GCLDIR)/o" + AC_SUBST(CFLAGS) + O3FLAGS=$TO3FLAGS + AC_SUBST(O3FLAGS) diff --git a/debian/patches/pathnames1.9 b/debian/patches/pathnames1.9 new file mode 100644 index 0000000..71ee3bd --- /dev/null +++ b/debian/patches/pathnames1.9 @@ -0,0 +1,5609 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-43) unstable; urgency=medium + . + * pathnames1.7 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2016-10-28 + +--- gcl-2.6.12.orig/ansi-tests/ansi-aux.lsp ++++ gcl-2.6.12/ansi-tests/ansi-aux.lsp +@@ -1635,3 +1635,6 @@ the condition to go uncaught if it canno + + (defmacro expand-in-current-env (macro-form &environment env) + (macroexpand macro-form env)) ++ ++(defun typep* (element type) ++ (not (not (typep element type)))) +--- gcl-2.6.12.orig/clcs/sys-proclaim.lisp ++++ gcl-2.6.12/clcs/sys-proclaim.lisp +@@ -2,30 +2,14 @@ + (COMMON-LISP::IN-PACKAGE "CONDITIONS") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- CONDITIONS::IS-WARNING CONDITIONS::DEFAULT-REPORT +- CONDITIONS::IS-CONDITION CONDITIONS::CONDITIONP)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ CONDITIONS::COERCE-TO-FN CONDITIONS::SLOT-SYM)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (FILE-ERROR T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| +- CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))|)) ++ COMMON-LISP::MAKE-CONDITION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -36,11 +20,27 @@ + CONDITIONS::|(PCL::FAST-METHOD MAKE-LOAD-FORM (CONDITION))|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- CONDITIONS::COERCE-TO-FN CONDITIONS::SLOT-SYM)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ CONDITIONS::IS-CONDITION CONDITIONS::DEFAULT-REPORT ++ CONDITIONS::IS-WARNING CONDITIONS::CONDITIONP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::*) +- COMMON-LISP::MAKE-CONDITION)) +\ No newline at end of file ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PACKAGE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CASE-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ABORT-FAILURE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (FILE-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-VARIABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (ARITHMETIC-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (END-OF-FILE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (STREAM-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (CELL-ERROR T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (SIMPLE-CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNBOUND-SLOT T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (UNDEFINED-FUNCTION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (INTERNAL-CONDITION T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (PRINT-NOT-READABLE T))| ++ CONDITIONS::|(PCL::FAST-METHOD PRINT-OBJECT (TYPE-ERROR T))|)) +\ No newline at end of file +--- gcl-2.6.12.orig/cmpnew/gcl_cmpmain.lsp ++++ gcl-2.6.12/cmpnew/gcl_cmpmain.lsp +@@ -430,7 +430,7 @@ Cannot compile ~a.~%" + (si::copy-stream st *standard-output*)) + (with-open-file (st hn) + (si::copy-stream st *standard-output*)) +- (when (eql (aref *objdump* 0) #\/);program found at startup in path ++ (when *objdump* + (safe-system (si::string-concatenate *objdump* (namestring on)))) + (mdelete-file cn) + (mdelete-file dn) +--- gcl-2.6.12.orig/cmpnew/gcl_lfun_list.lsp ++++ gcl-2.6.12/cmpnew/gcl_lfun_list.lsp +@@ -43,7 +43,6 @@ + (DEFSYSFUN 'RASSOC "Lrassoc" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'PPRINT "Lpprint" '(T *) 'T NIL NIL) + (DEFSYSFUN 'NSUBST-IF-NOT "Lnsubst_if_not" '(T T T *) 'T NIL NIL) +-(DEFSYSFUN 'FILE-POSITION "Lfile_position" '(T *) 'T NIL NIL) + (DEFSYSFUN 'STRING< "Lstring_l" '(T T *) 'T NIL NIL) + (DEFSYSFUN 'REVERSE "Lreverse" '(T) 'T NIL NIL) + (DEFSYSFUN 'STREAMP "Lstreamp" '(T) 'T NIL T) +@@ -67,7 +66,6 @@ + (DEFSYSFUN 'CONS "Lcons" '(T T) 'T NIL NIL) + (DEFSYSFUN 'LIST "Llist" '(*) 'T NIL NIL) + (DEFSYSFUN 'USE-PACKAGE "Luse_package" '(T *) 'T NIL NIL) +-(DEFSYSFUN 'FILE-LENGTH "Lfile_length" '(T) 'T NIL NIL) + (DEFSYSFUN 'MAKE-SYMBOL "Lmake_symbol" '(T) 'T NIL NIL) + (DEFSYSFUN 'STRING-RIGHT-TRIM "Lstring_right_trim" '(T T) 'STRING NIL + NIL) +--- gcl-2.6.12.orig/cmpnew/sys-proclaim.lisp ++++ gcl-2.6.12/cmpnew/sys-proclaim.lisp +@@ -2,376 +2,394 @@ + (COMMON-LISP::IN-PACKAGE "COMPILER") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::STRING COMMON-LISP::*) +- COMMON-LISP::T) +- COMPILER::TS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C1VALUES +- COMPILER::C1RPLACA COMPILER::FUN-P +- COMPILER::FUNCTION-ARG-TYPES COMPILER::C1STRUCTURE-REF +- COMPILER::GET-RETURN-TYPE COMPILER::WT-FUNCALL-C +- COMPILER::MACRO-DEF-P COMPILER::T1DEFUN COMPILER::C1ASSOC +- COMPILER::SET-UP-VAR-CVS COMPILER::C2FUNCTION +- COMPILER::C1DM-BAD-KEY COMPILER::ADD-OBJECT +- COMPILER::WT-SWITCH-CASE COMPILER::VARARG-P +- COMPILER::C1TAGBODY COMPILER::C2GET COMPILER::VAR-REF +- COMPILER::SCH-LOCAL-FUN COMPILER::ADD-SYMBOL +- COMPILER::TAG-UNWIND-EXIT COMPILER::C1MULTIPLE-VALUE-SETQ +- COMPILER::C1PRINC COMPILER::WT-VAR-DECL COMPILER::C1QUOTE +- COMPILER::C2RPLACD COMPILER::CHECK-VREF +- COMPILER::PUSH-ARGS-LISPCALL COMPILER::C1MAPLIST +- COMPILER::ADD-REG1 COMPILER::C1OR COMPILER::WT-SYMBOL-FUNCTION +- COMPILER::TAG-P COMPILER::SAFE-SYSTEM COMPILER::C1ECASE +- COMPILER::LTVP COMPILER::GET-INCLUDED COMPILER::INFO-P +- COMPILER::FUN-INFO COMPILER::C1LOAD-TIME-VALUE +- COMPILER::GET-LOCAL-ARG-TYPES COMPILER::BLK-P +- COMPILER::BLK-EXIT COMPILER::C2VAR-KIND COMPILER::C2LOCATION +- COMPILER::WT1 COMPILER::WT-CCB-VS +- COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::BLK-REF-CCB +- COMPILER::UNDEFINED-VARIABLE COMPILER::C1MULTIPLE-VALUE-CALL +- COMPILER::VAR-LOC COMPILER::C1SETQ COMPILER::C1NTH-CONDITION +- COMPILER::C2RPLACA COMPILER::FUN-REF COMPILER::C2VAR +- COMPILER::WT-CAR COMPILER::WT-LIST COMPILER::WRITE-BLOCK-OPEN +- COMPILER::INFO-VOLATILE COMPILER::GET-LOCAL-RETURN-TYPE +- COMPILER::AET-C-TYPE COMPILER::PUSH-ARGS COMPILER::TAG-REF-CLB +- COMPILER::BLK-REF COMPILER::VAR-P COMPILER::C1ADD-GLOBALS +- COMPILER::T3ORDINARY COMPILER::ADD-OBJECT2 COMPILER::SET-TOP +- COMPILER::T1DEFLA COMPILER::C1FUNCTION COMPILER::T3CLINES +- COMPILER::T1DEFCFUN COMPILER::C1VREF COMPILER::C1ASH +- COMPILER::BLK-NAME COMPILER::WT-CADR COMPILER::WT-DOWN +- COMPILER::C1TERPRI COMPILER::C2GETHASH COMPILER::C2GO-CCB +- COMPILER::SAVE-FUNOB COMPILER::T2DECLARE COMPILER::FUN-REF-CCB +- COMPILER::C1MAPCAR COMPILER::T1DEFMACRO +- COMPILER::C2TAGBODY-LOCAL COMPILER::C1STACK-LET +- COMPILER::INFO-TYPE COMPILER::T1MACROLET COMPILER::C1LET* +- COMPILER::C1RPLACD COMPILER::DECLARATION-TYPE +- COMPILER::T1ORDINARY COMPILER::C2EXPR* COMPILER::C1LOCAL-FUN +- COMPILER::WT-DATA-PACKAGE-OPERATION +- COMPILER::C1BOOLE-CONDITION SYSTEM::UNDEF-COMPILER-MACRO +- COMPILER::C2TAGBODY-BODY COMPILER::C1NTHCDR COMPILER::C1VAR +- COMPILER::C1MULTIPLE-VALUE-PROG1 COMPILER::C1NTHCDR-CONDITION +- COMPILER::CONSTANT-FOLD-P COMPILER::C1UNWIND-PROTECT +- COMPILER::PROCLAMATION COMPILER::C1NTH COMPILER::C1RETURN-FROM +- COMPILER::INFO-SP-CHANGE COMPILER::C1LENGTH +- COMPILER::CMP-MACRO-FUNCTION COMPILER::BLK-REF-CLB +- COMPILER::NAME-TO-SD COMPILER::CTOP-WRITE COMPILER::C1MAPCON +- COMPILER::C1FUNOB COMPILER::FIX-OPT COMPILER::C1RPLACA-NTHCDR +- COMPILER::C1FLET COMPILER::RESULT-TYPE COMPILER::C1CATCH +- COMPILER::C2DM-RESERVE-V COMPILER::VAR-NAME +- COMPILER::CMP-MACROEXPAND COMPILER::VERIFY-DATA-VECTOR +- COMPILER::T1CLINES COMPILER::C1MAPL COMPILER::T1DEFENTRY +- COMPILER::TAG-REF-CCB COMPILER::WT-VS +- COMPILER::LONG-FLOAT-LOC-P COMPILER::C1MAPCAN +- COMPILER::OBJECT-TYPE COMPILER::ADD-ADDRESS +- COMPILER::RESET-INFO-TYPE COMPILER::C1BOOLE3 COMPILER::C1MEMQ +- COMPILER::C1DEFINE-STRUCTURE COMPILER::TYPE-FILTER +- COMPILER::UNWIND-NO-EXIT COMPILER::C1FMLA-CONSTANT +- COMPILER::C2DM-RESERVE-VL COMPILER::C1FSET COMPILER::LTVP-EVAL +- COMPILER::C1GO COMPILER::WT-VV COMPILER::INFO-CHANGED-ARRAY +- COMPILER::C1FUNCALL COMPILER::C2TAGBODY-CCB +- COMPILER::TAG-LABEL COMPILER::VAR-KIND COMPILER::WT-VS* +- COMPILER::VAR-TYPE COMPILER::C2GO-LOCAL COMPILER::REGISTER +- COMPILER::T1PROGN COMPILER::C1BLOCK COMPILER::TAG-SWITCH +- COMPILER::VAR-REP-LOC COMPILER::C2BIND +- COMPILER::SET-PUSH-CATCH-FRAME COMPILER::COPY-INFO +- COMPILER::C1LIST-NTH COMPILER::CONS-TO-LISTA +- COMPILER::FUN-LEVEL COMPILER::C1DOWNWARD-FUNCTION +- COMPILER::THE-PARAMETER COMPILER::C2VALUES COMPILER::C1LABELS +- COMPILER::MAXARGS COMPILER::VAR-REF-CCB COMPILER::MDELETE-FILE +- COMPILER::WT-FUNCTION-LINK COMPILER::SAVE-AVMA +- COMPILER::VOLATILE COMPILER::ADD-CONSTANT COMPILER::C1APPLY +- COMPILER::C1GETHASH COMPILER::FUN-NAME COMPILER::DEFAULT-INIT +- COMPILER::CLINK COMPILER::WT-CDR COMPILER::PARSE-CVSPECS +- COMPILER::REP-TYPE COMPILER::C2GO-CLB +- COMPILER::ARGS-CAUSE-SIDE-EFFECT COMPILER::PUSH-DATA-INCF +- COMPILER::SCH-GLOBAL COMPILER::C1STRUCTURE-SET +- COMPILER::TAG-NAME COMPILER::INFO-REFERRED-ARRAY +- COMPILER::C1EXPR COMPILER::C1GET COMPILER::BLK-VAR +- COMPILER::TAG-REF COMPILER::C1MAPC COMPILER::SET-RETURN +- COMPILER::SHORT-FLOAT-LOC-P COMPILER::C1DECLARE +- COMPILER::WT-DATA1 COMPILER::FLAGS-POS +- COMPILER::BLK-VALUE-TO-GO COMPILER::NAME-SD1 +- COMPILER::C2DOWNWARD-FUNCTION COMPILER::C1SHARP-COMMA +- COMPILER::INLINE-POSSIBLE COMPILER::WT-H1 +- COMPILER::FIXNUM-LOC-P COMPILER::C1LET COMPILER::C1IF +- COMPILER::C1THE COMPILER::FUNCTION-RETURN-TYPE +- COMPILER::GET-ARG-TYPES COMPILER::INLINE-TYPE +- COMPILER::FUN-CFUN COMPILER::TAG-VAR COMPILER::CHARACTER-LOC-P +- COMPILER::CHECK-DOWNWARD COMPILER::C1PSETQ +- COMPILER::INLINE-BOOLE3-STRING COMPILER::C1THROW +- COMPILER::FSET-FN-NAME COMPILER::T1DEFINE-STRUCTURE +- COMPILER::NEED-TO-SET-VS-POINTERS COMPILER::C1PROGN +- COMPILER::C2FUNCALL-AUX COMPILER::C1MACROLET COMPILER::C1AND +- COMPILER::WT-VS-BASE COMPILER::ADD-LOOP-REGISTERS +- COMPILER::VAR-REGISTER COMPILER::C1PROGV COMPILER::C1SWITCH +- COMPILER::C1MEMBER COMPILER::C2TAGBODY-CLB +- COMPILER::CMP-MACROEXPAND-1 COMMON-LISP::PROCLAIM +- COMPILER::C1ASH-CONDITION COMPILER::C1EVAL-WHEN +- COMPILER::C1LOCAL-CLOSURE COMPILER::REPLACE-CONSTANT)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- COMPILER::INLINE-BOOLE3)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::*) +- COMPILER::C2DM COMPILER::C1DM-V COMPILER::C1DM-VL +- COMPILER::C2RETURN-FROM COMPILER::C2APPLY-OPTIMIZE)) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ COMPILER::MLIN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- COMPILER::WT-INLINE COMPILER::C2IF COMPILER::C2LABELS +- COMPILER::C2FLET)) ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ COMPILER::DASH-TO-UNDERSCORE-INT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMPILER::T3DEFUN-AUX)) ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) ++ COMMON-LISP::T) ++ COMPILER::TS COMPILER::DASH-TO-UNDERSCORE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- COMPILER::F-TYPE)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ COMPILER::C1NIL COMPILER::WT-DATA-FILE ++ COMPILER::CLOSE-INLINE-BLOCKS COMPILER::WT-NEXT-VAR-ARG ++ COMPILER::RESET-TOP COMPILER::VS-PUSH COMPILER::BABOON ++ COMPILER::GAZONK-NAME COMPILER::PRINT-COMPILER-INFO ++ COMPILER::ADD-LOAD-TIME-SHARP-COMMA COMPILER::INIT-ENV ++ COMPILER::PRINT-CURRENT-FORM COMPILER::WT-C-PUSH COMPILER::C1T ++ COMPILER::WT-FIRST-VAR-ARG COMPILER::CCB-VS-PUSH ++ COMPILER::INC-INLINE-BLOCKS COMPILER::WT-CVARS ++ COMPILER::WT-FASD-DATA-FILE COMPILER::WFS-ERROR ++ COMPILER::WT-DATA-END COMPILER::TAIL-RECURSION-POSSIBLE ++ COMPILER::CVS-PUSH COMPILER::WT-DATA-BEGIN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::STRING) COMMON-LISP::T) +- COMPILER::DASH-TO-UNDERSCORE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::ANALYZE-REGS1 COMPILER::ANALYZE-REGS ++ COMPILER::PROCLAIMED-ARGD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::INIT-NAME COMPILER::ADD-INIT COMPILER::C1LAMBDA-EXPR +- COMPILER::WT-CVAR COMPILER::C1CASE COMPILER::WT-COMMENT +- COMPILER::CMPERR COMPILER::WT-INTEGER-LOC COMPILER::CMPNOTE +- COMPILER::FAST-LINK-PROCLAIMED-TYPE-P COMPILER::UNWIND-EXIT +- COMPILER::CMPWARN)) ++ COMPILER::CHECK-FNAME-ARGS COMPILER::COERCE-LOC ++ COMPILER::TYPE>= COMPILER::C2BIND-LOC ++ COMPILER::RESULT-TYPE-FROM-ARGS COMPILER::ADD-DEBUG-INFO ++ COMPILER::MAKE-USER-INIT COMPILER::CO1EQL COMPILER::C2ASSOC!2 ++ COMPILER::WT-VAR COMPILER::CFAST-WRITE COMPILER::C2STACK-LET ++ COMPILER::C2DM-BIND-INIT COMPILER::IS-REP-REFERRED ++ COMPILER::CO1CONS COMPILER::SHIFT<< ++ COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::C2CALL-LOCAL ++ COMPILER::CO1SCHAR COMPILER::C1CONSTANT-VALUE ++ COMPILER::WT-CHARACTER-VALUE COMPILER::CONVERT-CASE-TO-SWITCH ++ COMPILER::C2MULTIPLE-VALUE-CALL COMPILER::C2EXPR-TOP ++ COMPILER::CO1READ-BYTE COMPILER::PRIN1-CMP ++ COMPILER::STRUCT-TYPE-OPT COMPILER::C1DECL-BODY ++ COMPILER::COERCE-LOC-STRUCTURE-REF ++ COMPILER::CO1STRUCTURE-PREDICATE COMPILER::WT-MAKE-DCLOSURE ++ COMPILER::ARGS-INFO-CHANGED-VARS ++ COMPILER::C2LIST-NTH-IMMEDIATE COMPILER::CO1LDB ++ COMPILER::CO1WRITE-BYTE COMPILER::C1PROGN* ++ COMPILER::CO1CONSTANT-FOLD COMPILER::SET-JUMP-TRUE ++ COMPILER::C1SETQ1 COMPILER::CO1READ-CHAR COMPILER::C2BIND-INIT ++ COMPILER::CO1TYPEP COMPILER::WT-FIXNUM-VALUE ++ COMPILER::MULTIPLE-VALUE-CHECK COMPILER::SHIFT>> ++ COMPILER::CO1SUBLIS COMPILER::DO-MACRO-EXPANSION ++ COMPILER::C2UNWIND-PROTECT COMPILER::C2CALL-LAMBDA ++ COMPILER::C2MEMBER!2 COMPILER::GET-INLINE-LOC ++ COMPILER::C1LAMBDA-FUN COMPILER::JUMPS-TO-P COMPILER::C1EXPR* ++ COMPILER::C2SETQ COMPILER::C2APPLY COMPILER::UNWIND-BDS ++ COMPILER::SET-BDS-BIND COMPILER::NEED-TO-PROTECT ++ COMPILER::C1FMLA COMPILER::TYPE-AND COMPILER::CMPFIX-ARGS ++ COMPILER::MAYBE-EVAL COMPILER::C2BLOCK-CLB COMPILER::SET-DBIND ++ COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY ++ COMPILER::WT-LONG-FLOAT-VALUE COMPILER::C2DM-BIND-VL ++ COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::T3SHARP-COMMA ++ COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES COMPILER::C2CATCH ++ COMPILER::C2EXPR-TOP* COMPILER::SET-JUMP-FALSE ++ COMPILER::CO1VECTOR-PUSH COMPILER::WT-V*-MACROS ++ COMPILER::ARGS-INFO-REFERRED-VARS COMPILER::SET-VS ++ COMPILER::WT-REQUIREDS COMPILER::C2RETURN-CCB ++ COMPILER::C2THROW COMPILER::CHECK-END ++ COMPILER::PUSH-CHANGED-VARS COMPILER::C2BLOCK-CCB ++ SYSTEM::ADD-DEBUG COMPILER::C2PSETQ COMPILER::C1ARGS ++ COMPILER::COMPILER-CC COMPILER::INLINE-PROC ++ COMPILER::CO1WRITE-CHAR COMPILER::COMPILER-DEF-HOOK ++ COMPILER::CAN-BE-REPLACED COMPILER::C2MULTIPLE-VALUE-PROG1 ++ COMPILER::C2DM-BIND-LOC COMPILER::ADD-INFO ++ COMPILER::CO1SPECIAL-FIX-DECL COMPILER::C2LAMBDA-EXPR-WITH-KEY ++ COMPILER::FAST-READ COMPILER::C2RETURN-CLB ++ COMPILER::PROCLAIM-VAR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- COMPILER::C2RETURN-LOCAL COMPILER::C2BLOCK-LOCAL +- COMPILER::NCONC-FILES COMPILER::C1SYMBOL-FUN COMPILER::C2BLOCK +- COMPILER::C1BODY COMPILER::COMPILER-BUILD +- COMPILER::C2DECL-BODY COMPILER::WT-INLINE-LOC)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(COMPILER::CMP-ANON COMMON-LISP::COMPILE COMPILER::CMP-TMP-MACRO +- COMMON-LISP::DISASSEMBLE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T (COMMON-LISP::VECTOR COMMON-LISP::T) +- COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM +- COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::BSEARCHLEQ)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T (COMMON-LISP::VECTOR COMMON-LISP::T) +- COMMON-LISP::FIXNUM COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- COMPILER::PUSH-ARRAY)) ++ COMPILER::COMPILE-FILE1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::AND-FORM-TYPE COMPILER::SET-VAR COMPILER::C2LET* +- COMPILER::COMPILER-PASS2 COMPILER::ADD-FUNCTION-DECLARATION +- COMPILER::BOOLE3 COMPILER::C1MAP-FUNCTIONS +- COMPILER::TOO-MANY-ARGS COMPILER::CHECK-FORM-TYPE +- COMPILER::C2LET COMPILER::C-FUNCTION-NAME +- COMPILER::WT-INLINE-SHORT-FLOAT COMPILER::FIX-DOWN-ARGS +- COMPILER::C2PRINC COMPILER::WT-IF-PROCLAIMED +- COMPILER::ADD-FAST-LINK COMPILER::C2MULTIPLE-VALUE-BIND +- COMPILER::C2MAPCAN COMPILER::CJT COMPILER::CHECK-VDECL +- COMPILER::INLINE-TYPE-MATCHES COMPILER::WT-INLINE-LONG-FLOAT +- COMPILER::C2GO COMPILER::CAN-BE-REPLACED* COMPILER::MYSUB +- COMPILER::ASSIGN-DOWN-VARS COMPILER::C2MAPC +- COMPILER::WT-INLINE-INTEGER COMPILER::GET-INLINE-INFO +- COMPILER::CJF COMPILER::TOO-FEW-ARGS COMPILER::T3DEFCFUN +- COMPILER::CMP-EXPAND-MACRO COMPILER::WT-MAKE-CCLOSURE +- COMPILER::C2FUNCALL-SFUN COMPILER::C1DM +- COMPILER::WT-INLINE-COND COMPILER::C2TAGBODY +- COMPILER::WT-INLINE-CHARACTER COMPILER::C2PROGV +- COMPILER::C2MAPCAR COMPILER::C1STRUCTURE-REF1 COMPILER::C2CASE +- COMPILER::ADD-FUNCTION-PROCLAMATION +- COMPILER::MAKE-INLINE-STRING COMPILER::SUBLIS1-INLINE +- COMPILER::WT-INLINE-FIXNUM)) ++ COMPILER::MAKE-INLINE-STRING COMPILER::GET-INLINE-INFO ++ COMPILER::C1STRUCTURE-REF1 COMPILER::CJF COMPILER::SET-VAR ++ COMPILER::CHECK-FORM-TYPE COMPILER::AND-FORM-TYPE ++ COMPILER::SUBLIS1-INLINE COMPILER::T3DEFCFUN ++ COMPILER::WT-INLINE-INTEGER COMPILER::C-FUNCTION-NAME ++ COMPILER::FIX-DOWN-ARGS COMPILER::ASSIGN-DOWN-VARS ++ COMPILER::WT-INLINE-FIXNUM COMPILER::C2GO COMPILER::CJT ++ COMPILER::TOO-FEW-ARGS COMPILER::C2PRINC COMPILER::C2CASE ++ COMPILER::C2LET* COMPILER::BOOLE3 COMPILER::COMPILER-PASS2 ++ COMPILER::C1DM COMPILER::CHECK-VDECL COMPILER::C2LET ++ COMPILER::MYSUB COMPILER::CAN-BE-REPLACED* ++ COMPILER::ADD-FUNCTION-PROCLAMATION COMPILER::WT-IF-PROCLAIMED ++ COMPILER::C1MAP-FUNCTIONS COMPILER::ADD-FAST-LINK ++ COMPILER::WT-INLINE-LONG-FLOAT COMPILER::TOO-MANY-ARGS ++ COMPILER::C2MULTIPLE-VALUE-BIND COMPILER::C2PROGV ++ COMPILER::WT-INLINE-CHARACTER ++ COMPILER::ADD-FUNCTION-DECLARATION COMPILER::CMP-EXPAND-MACRO ++ COMPILER::C2MAPCAR COMPILER::INLINE-TYPE-MATCHES ++ COMPILER::C2FUNCALL-SFUN COMPILER::WT-MAKE-CCLOSURE ++ COMPILER::C2MAPCAN COMPILER::C2TAGBODY ++ COMPILER::WT-INLINE-COND COMPILER::C2MAPC ++ COMPILER::WT-INLINE-SHORT-FLOAT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL COMPILER::LINK +- COMPILER::INLINE-ARGS)) ++ COMPILER::T3LOCAL-FUN COMPILER::T3LOCAL-DCFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::C2STRUCTURE-REF COMPILER::WT-GLOBAL-ENTRY +- COMPILER::T3DEFUN-VARARG COMPILER::T3DEFUN-NORMAL +- COMPILER::C2CALL-GLOBAL COMPILER::C1MAKE-VAR +- COMPILER::C2CALL-UNKNOWN-GLOBAL COMPILER::C2SWITCH +- COMPILER::T3INIT-FUN COMPILER::MY-CALL)) ++ COMPILER::T3DEFMACRO COMPILER::T3DEFENTRY COMPILER::T2DEFENTRY ++ COMPILER::DEFSYSFUN COMPILER::T2DEFMACRO)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::DEFSYSFUN COMPILER::T2DEFMACRO COMPILER::T2DEFENTRY +- COMPILER::T3DEFMACRO COMPILER::T3DEFENTRY)) ++ COMPILER::T3DEFUN COMPILER::T3DEFUN-LOCAL-ENTRY ++ COMPILER::C2STRUCTURE-SET COMPILER::T2DEFUN ++ COMPILER::C1APPLY-OPTIMIZE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::T2DEFUN COMPILER::C1APPLY-OPTIMIZE COMPILER::T3DEFUN +- COMPILER::C2STRUCTURE-SET COMPILER::T3DEFUN-LOCAL-ENTRY)) ++ COMPILER::C2LAMBDA-EXPR COMPILER::C2FUNCALL ++ COMPILER::INLINE-ARGS COMPILER::LINK)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T) + COMMON-LISP::T) +- COMPILER::WT-SIMPLE-CALL COMPILER::GET-OUTPUT-PATHNAME)) ++ COMPILER::T3INIT-FUN COMPILER::C2STRUCTURE-REF ++ COMPILER::WT-GLOBAL-ENTRY COMPILER::T3DEFUN-NORMAL ++ COMPILER::T3DEFUN-VARARG COMPILER::C1MAKE-VAR ++ COMPILER::C2SWITCH COMPILER::MY-CALL COMPILER::C2CALL-GLOBAL ++ COMPILER::C2CALL-UNKNOWN-GLOBAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::T3LOCAL-FUN COMPILER::T3LOCAL-DCFUN)) ++ COMPILER::GET-OUTPUT-PATHNAME COMPILER::WT-SIMPLE-CALL)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(COMPILER::CMP-ANON COMMON-LISP::COMPILE COMPILER::CMP-TMP-MACRO ++ COMMON-LISP::DISASSEMBLE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMPILER::MAKE-VAR COMPILER::COMPILER-COMMAND ++ COMPILER::LIST*-INLINE COMMON-LISP::COMPILE-FILE ++ COMPILER::CS-PUSH COMPILER::MAKE-INFO COMPILER::FCALLN-INLINE ++ COMPILER::C2FSET COMPILER::MAKE-TAG COMPILER::WT-CLINK ++ COMPILER::LIST-INLINE COMPILER::MAKE-FUN COMPILER::MAKE-BLK)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- COMPILER::C2PROGN COMPILER::WT-LONG-FLOAT-LOC COMPILER::C2EXPR +- COMPILER::WT-FIXNUM-LOC COMPILER::WT-CHARACTER-LOC +- COMPILER::C2AND COMPILER::T1EXPR COMPILER::CMP-TOPLEVEL-EVAL +- COMPILER::WT-SHORT-FLOAT-LOC COMPILER::C2OR COMPILER::WT-LOC +- COMPILER::CMP-EVAL COMPILER::T1EVAL-WHEN COMPILER::SET-LOC +- COMPILER::VV-STR COMPILER::WT-TO-STRING)) ++ COMPILER::T1EVAL-WHEN COMPILER::T1EXPR ++ COMPILER::WT-CHARACTER-LOC COMPILER::SET-LOC ++ COMPILER::CMP-TOPLEVEL-EVAL COMPILER::C2PROGN ++ COMPILER::WT-TO-STRING COMPILER::MEXPAND-DEFTYPE ++ COMPILER::WT-SHORT-FLOAT-LOC COMPILER::CMP-EVAL ++ COMPILER::WT-LOC COMPILER::C2AND COMPILER::C2EXPR ++ COMPILER::WT-LONG-FLOAT-LOC COMPILER::C2OR ++ COMPILER::WT-FIXNUM-LOC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- COMPILER::MAKE-FUN COMPILER::MAKE-BLK +- COMMON-LISP::COMPILE-FILE COMPILER::FCALLN-INLINE +- COMPILER::MAKE-INFO COMPILER::CS-PUSH COMPILER::MAKE-VAR +- COMPILER::LIST-INLINE COMPILER::C2FSET COMPILER::WT-CLINK +- COMPILER::COMPILER-COMMAND COMPILER::MAKE-TAG +- COMPILER::LIST*-INLINE)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ COMPILER::LTVP-EVAL COMPILER::FSET-FN-NAME COMPILER::C1MAPCON ++ COMPILER::FUNCTION-ARG-TYPES COMPILER::C1SHARP-COMMA ++ COMPILER::SAVE-AVMA COMPILER::C2TAGBODY-CCB COMPILER::VAR-LOC ++ COMPILER::WT-DOWN COMPILER::C1SETQ COMPILER::TAG-REF-CCB ++ COMPILER::T1DEFINE-STRUCTURE COMPILER::SAVE-FUNOB ++ COMPILER::C1VAR COMPILER::VV-STR COMPILER::C1RPLACA ++ COMPILER::INFO-SP-CHANGE COMPILER::BLK-REF-CCB ++ COMPILER::T1ORDINARY COMPILER::FIXNUM-LOC-P ++ COMPILER::FUN-REF-CCB COMPILER::C2GET COMPILER::FUN-NAME ++ COMPILER::FUN-P COMPILER::SCH-GLOBAL COMPILER::C1LET ++ COMPILER::C2TAGBODY-CLB COMPILER::C1UNWIND-PROTECT ++ COMPILER::SET-RETURN COMPILER::WT-VAR-DECL ++ COMPILER::VAR-REGISTER COMPILER::C1DEFINE-STRUCTURE ++ COMPILER::LTVP COMPILER::INLINE-POSSIBLE COMPILER::CHECK-VREF ++ COMPILER::TAG-NAME COMPILER::C2DM-RESERVE-VL ++ COMPILER::VAR-TYPE COMPILER::WT-LIST COMPILER::C1LET* ++ COMPILER::VARARG-P COMPILER::C1LOAD-TIME-VALUE ++ COMPILER::C2FUNCALL-AUX COMPILER::INFO-TYPE COMPILER::C1GET ++ COMPILER::C1NTHCDR-CONDITION COMPILER::C1AND ++ COMPILER::C1MULTIPLE-VALUE-CALL COMPILER::C1RPLACA-NTHCDR ++ COMPILER::INFO-VOLATILE COMPILER::INLINE-TYPE ++ COMPILER::LONG-FLOAT-LOC-P COMPILER::INFO-CHANGED-ARRAY ++ SYSTEM::UNDEF-COMPILER-MACRO COMPILER::DECL-BODY-SAFETY ++ COMPILER::TAG-VAR COMPILER::CHARACTER-LOC-P COMPILER::C2BIND ++ COMPILER::C1DECLARE COMPILER::CONS-TO-LISTA ++ COMPILER::C1MULTIPLE-VALUE-SETQ COMPILER::NAME-SD1 ++ COMPILER::BLK-NAME COMPILER::PARSE-CVSPECS COMPILER::C1MAPL ++ COMPILER::AET-C-TYPE COMPILER::C2VAR COMPILER::COPY-INFO ++ COMPILER::C1PSETQ COMPILER::C1VREF COMPILER::FUN-REF ++ COMPILER::WT-H1 COMPILER::T1DEFCFUN COMPILER::T1PROGN ++ COMPILER::C1EVAL-WHEN COMPILER::FLAGS-POS COMPILER::WT-VS ++ COMPILER::C2VAR-KIND COMPILER::C1LENGTH ++ COMPILER::C1MULTIPLE-VALUE-BIND COMPILER::C2LOCATION ++ COMPILER::C2DM-RESERVE-V COMPILER::C2FUNCTION ++ COMPILER::WT-SWITCH-CASE COMPILER::C2TAGBODY-LOCAL ++ COMPILER::CONSTANT-FOLD-P COMPILER::NEED-TO-SET-VS-POINTERS ++ COMPILER::C1MAPCAN COMPILER::WT-FUNCALL-C COMPILER::WT-CCB-VS ++ COMPILER::C1RETURN-FROM COMPILER::GET-INCLUDED ++ COMPILER::C1BLOCK COMPILER::ADD-CONSTANT COMPILER::WT-VS-BASE ++ COMPILER::C1NTH-CONDITION COMPILER::FUN-LEVEL ++ COMPILER::UNWIND-NO-EXIT COMMON-LISP::PROCLAIM ++ COMPILER::C1PRINC COMPILER::C2EXPR* COMPILER::RESULT-TYPE ++ COMPILER::TAG-REF COMPILER::C1FUNCALL COMPILER::C1PROGN ++ COMPILER::MAXARGS COMPILER::UNDEFINED-VARIABLE COMPILER::C1THE ++ COMPILER::CMP-MACROEXPAND COMPILER::C1MAPCAR ++ COMPILER::DEFAULT-INIT COMPILER::C1STRUCTURE-SET ++ COMPILER::WT-SYMBOL-FUNCTION COMPILER::T1DEFUN ++ COMPILER::WT-DATA1 COMPILER::PUSH-DATA-INCF COMPILER::C1IF ++ COMPILER::C1NTHCDR COMPILER::ADD-SYMBOL ++ COMPILER::C1MULTIPLE-VALUE-PROG1 COMPILER::BLK-REF ++ COMPILER::WT-FUNCTION-LINK COMPILER::INFO-P COMPILER::C1FSET ++ COMPILER::C1PROGV COMPILER::C1ASSOC COMPILER::VAR-REF ++ COMPILER::ARGS-CAUSE-SIDE-EFFECT COMPILER::MDELETE-FILE ++ COMPILER::CMP-MACRO-FUNCTION COMPILER::C2DOWNWARD-FUNCTION ++ COMPILER::C2GO-LOCAL COMPILER::T1DEFLA COMPILER::VAR-REF-CCB ++ COMPILER::C1FLET COMPILER::C1LIST-NTH ++ COMPILER::ADD-LOOP-REGISTERS COMPILER::INFO-REFERRED-ARRAY ++ COMPILER::BLK-VALUE-TO-GO COMPILER::WT-VS* ++ COMPILER::NAME-TO-SD COMPILER::C1RPLACD ++ COMPILER::WT-DATA-PACKAGE-OPERATION COMPILER::C1SWITCH ++ COMPILER::C1CATCH COMPILER::WT-CAR COMPILER::C1MACROLET ++ COMPILER::OBJECT-TYPE COMPILER::C1MAPC COMPILER::T1CLINES ++ COMPILER::C1COMPILER-LET COMPILER::CMP-MACROEXPAND-1 ++ COMPILER::C1TAGBODY COMPILER::C1MAPLIST COMPILER::PUSH-ARGS ++ COMPILER::T3ORDINARY COMPILER::C1MEMBER COMPILER::T1MACROLET ++ COMPILER::WT-CDR COMPILER::C1BOOLE3 COMPILER::PROCLAMATION ++ COMPILER::GET-LOCAL-RETURN-TYPE COMPILER::C1LOCAL-FUN ++ COMPILER::VAR-KIND COMPILER::WT1 COMPILER::TAG-SWITCH ++ COMPILER::C1OR COMPILER::C1STRUCTURE-REF ++ COMPILER::THE-PARAMETER COMPILER::VAR-REP-LOC ++ COMPILER::DECLARATION-TYPE COMPILER::TAG-P COMPILER::C2GETHASH ++ COMPILER::C1EXPR COMPILER::REPLACE-CONSTANT COMPILER::C1ECASE ++ COMPILER::FUN-CFUN COMPILER::SET-TOP COMPILER::TAG-LABEL ++ COMPILER::C1DM-BAD-KEY COMPILER::C1THROW COMPILER::C2GO-CCB ++ COMPILER::REP-TYPE COMPILER::C2VALUES ++ COMPILER::SHORT-FLOAT-LOC-P COMPILER::FUNCTION-RETURN-TYPE ++ COMPILER::ADD-OBJECT COMPILER::CTOP-WRITE COMPILER::C1MEMQ ++ COMPILER::WT-DOWNWARD-CLOSURE-MACRO COMPILER::C1TERPRI ++ COMPILER::T1DEFMACRO COMPILER::T3CLINES COMPILER::ADD-REG1 ++ COMPILER::C1NTH COMPILER::C1ASH COMPILER::C1FMLA-CONSTANT ++ COMPILER::C2GO-CLB COMPILER::WT-CADR ++ COMPILER::C1BOOLE-CONDITION COMPILER::CLINK COMPILER::VAR-NAME ++ COMPILER::PUSH-ARGS-LISPCALL COMPILER::GET-ARG-TYPES ++ COMPILER::BLK-VAR COMPILER::C1APPLY COMPILER::CHECK-DOWNWARD ++ COMPILER::C1QUOTE COMPILER::TAG-REF-CLB ++ COMPILER::GET-LOCAL-ARG-TYPES COMPILER::REGISTER ++ COMPILER::BLK-P COMPILER::FUN-INFO COMPILER::C2RPLACD ++ COMPILER::ADD-OBJECT2 COMPILER::C2TAGBODY-BODY ++ COMPILER::T1DEFENTRY COMPILER::C1FUNCTION ++ COMPILER::C1DOWNWARD-FUNCTION COMPILER::SAFE-SYSTEM ++ COMPILER::C1GO COMPILER::BLK-EXIT COMPILER::VERIFY-DATA-VECTOR ++ COMPILER::C2RPLACA COMPILER::T2DECLARE COMPILER::MACRO-DEF-P ++ COMPILER::C1LABELS COMPILER::C1GETHASH COMPILER::FIX-OPT ++ COMPILER::SCH-LOCAL-FUN COMPILER::C1FUNOB ++ COMPILER::SET-PUSH-CATCH-FRAME COMPILER::GET-RETURN-TYPE ++ COMPILER::SET-UP-VAR-CVS COMPILER::TAG-UNWIND-EXIT ++ COMPILER::VAR-P COMPILER::C1ADD-GLOBALS COMPILER::TYPE-FILTER ++ COMPILER::WT-VV COMPILER::C1ASH-CONDITION COMPILER::VOLATILE ++ COMPILER::INLINE-BOOLE3-STRING COMPILER::C1LOCAL-CLOSURE ++ COMPILER::WRITE-BLOCK-OPEN COMPILER::ADD-ADDRESS ++ COMPILER::RESET-INFO-TYPE COMPILER::C1VALUES ++ COMPILER::BLK-REF-CLB COMPILER::C1STACK-LET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ COMPILER::INLINE-BOOLE3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION ((COMMON-LISP::VECTOR COMMON-LISP::T)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- COMPILER::COPY-ARRAY)) ++ COMPILER::MEMOIZED-HASH-EQUAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::WT-INLINE-LOC COMPILER::NCONC-FILES ++ COMPILER::COMPILER-BUILD COMPILER::C2BLOCK-LOCAL ++ COMPILER::C2DECL-BODY COMPILER::C1SYMBOL-FUN COMPILER::C2BLOCK ++ COMPILER::C1BODY COMPILER::C2RETURN-LOCAL)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMPILER::C2EXPR-TOP COMPILER::CO1SUBLIS +- COMPILER::C2CALL-LAMBDA COMPILER::GET-INLINE-LOC +- COMPILER::CHECK-END COMPILER::C2PSETQ COMPILER::TYPE-AND +- COMPILER::TYPE>= COMPILER::C2MULTIPLE-VALUE-PROG1 +- COMPILER::CO1SCHAR SYSTEM::ADD-DEBUG COMPILER::C2BLOCK-CCB +- COMPILER::C2DM-BIND-VL COMPILER::MAKE-USER-INIT +- COMPILER::NEED-TO-PROTECT COMPILER::FAST-READ +- COMPILER::RESULT-TYPE-FROM-ARGS COMPILER::C2BIND-INIT +- COMPILER::JUMPS-TO-P COMPILER::C2MEMBER!2 +- COMPILER::C2CALL-LOCAL COMPILER::C2BLOCK-CLB +- COMPILER::ARGS-INFO-CHANGED-VARS COMPILER::INLINE-PROC +- COMPILER::C2THROW COMPILER::C1DECL-BODY +- COMPILER::WT-MAKE-DCLOSURE COMPILER::CO1WRITE-CHAR +- COMPILER::C1SETQ1 COMPILER::SET-JUMP-FALSE COMPILER::CO1CONS +- COMPILER::CO1VECTOR-PUSH COMPILER::SET-VS COMPILER::SHIFT>> +- COMPILER::COERCE-LOC-STRUCTURE-REF COMPILER::WT-FIXNUM-VALUE +- COMPILER::C2CATCH COMPILER::C2RETURN-CCB COMPILER::MAYBE-EVAL +- COMPILER::C2ASSOC!2 COMPILER::C2DM-BIND-INIT +- COMPILER::C2STACK-LET COMPILER::C2LAMBDA-EXPR-WITH-KEY +- COMPILER::ARGS-INFO-REFERRED-VARS +- COMPILER::C2MULTIPLE-VALUE-SETQ COMPILER::C1PROGN* +- COMPILER::WT-LONG-FLOAT-VALUE COMPILER::C2MULTIPLE-VALUE-CALL +- COMPILER::WT-SHORT-FLOAT-VALUE COMPILER::CO1CONSTANT-FOLD +- COMPILER::C1CONSTANT-VALUE COMPILER::C1EXPR* +- COMPILER::CO1SPECIAL-FIX-DECL COMPILER::C2RETURN-CLB +- COMPILER::CMPFIX-ARGS COMPILER::PROCLAIM-VAR COMPILER::C2APPLY +- COMPILER::DO-MACRO-EXPANSION COMPILER::CFAST-WRITE +- COMPILER::PRIN1-CMP COMPILER::SHIFT<< COMPILER::WT-REQUIREDS +- COMPILER::C2EXPR-TOP* COMPILER::UNWIND-BDS +- COMPILER::MULTIPLE-VALUE-CHECK COMPILER::COERCE-LOC +- COMPILER::STRUCT-TYPE-OPT COMPILER::CO1READ-CHAR +- COMPILER::ADD-DEBUG-INFO COMPILER::C2LIST-NTH-IMMEDIATE +- COMPILER::WT-VAR COMPILER::C2LAMBDA-EXPR-WITHOUT-KEY +- COMPILER::CHECK-FNAME-ARGS COMPILER::CAN-BE-REPLACED +- COMPILER::WT-CHARACTER-VALUE COMPILER::C2UNWIND-PROTECT +- COMPILER::SET-DBIND COMPILER::T3SHARP-COMMA +- COMPILER::IS-REP-REFERRED COMPILER::C1FMLA +- COMPILER::WT-V*-MACROS COMPILER::C2DM-BIND-LOC +- COMPILER::C2BIND-LOC +- COMPILER::COMPILER-CLEAR-COMPILER-PROPERTIES +- COMPILER::ADD-INFO COMPILER::C2SETQ +- COMPILER::PUSH-CHANGED-VARS COMPILER::CO1STRUCTURE-PREDICATE +- COMPILER::SET-BDS-BIND COMPILER::SET-JUMP-TRUE +- COMPILER::CO1READ-BYTE COMPILER::C1LAMBDA-FUN +- COMPILER::CO1TYPEP COMPILER::CONVERT-CASE-TO-SWITCH +- COMPILER::COMPILER-DEF-HOOK COMPILER::CO1LDB COMPILER::C1ARGS +- COMPILER::CO1WRITE-BYTE COMPILER::CO1EQL +- COMPILER::COMPILER-CC)) ++ COMPILER::C1LAMBDA-EXPR COMPILER::CMPWARN COMPILER::ADD-INIT ++ COMPILER::UNWIND-EXIT COMPILER::CMPNOTE COMPILER::CMPERR ++ COMPILER::C1CASE COMPILER::WT-COMMENT COMPILER::INIT-NAME ++ COMPILER::FAST-LINK-PROCLAIMED-TYPE-P COMPILER::WT-INTEGER-LOC ++ COMPILER::WT-CVAR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM) COMMON-LISP::T) +- COMPILER::MLIN)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ COMPILER::C2IF COMPILER::WT-INLINE COMPILER::C2COMPILER-LET ++ COMPILER::C2FLET COMPILER::C2LABELS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::*) +- COMPILER::COMPILE-FILE1)) ++ COMPILER::C2RETURN-FROM COMPILER::C2APPLY-OPTIMIZE ++ COMPILER::C2DM COMPILER::C1DM-V COMPILER::C1DM-VL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- COMPILER::WT-DATA-BEGIN COMPILER::WT-C-PUSH COMPILER::WT-CVARS +- COMPILER::C1T COMPILER::CVS-PUSH COMPILER::WT-DATA-FILE +- COMPILER::ADD-LOAD-TIME-SHARP-COMMA +- COMPILER::CLOSE-INLINE-BLOCKS COMPILER::WT-FASD-DATA-FILE +- COMPILER::GAZONK-NAME COMPILER::WFS-ERROR +- COMPILER::WT-NEXT-VAR-ARG COMPILER::WT-FIRST-VAR-ARG +- COMPILER::C1NIL COMPILER::WT-DATA-END COMPILER::RESET-TOP +- COMPILER::TAIL-RECURSION-POSSIBLE +- COMPILER::PRINT-COMPILER-INFO COMPILER::CCB-VS-PUSH +- COMPILER::BABOON COMPILER::INIT-ENV +- COMPILER::PRINT-CURRENT-FORM COMPILER::VS-PUSH +- COMPILER::INC-INLINE-BLOCKS)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMPILER::T3DEFUN-AUX)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::FIXNUM) ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*))) + COMMON-LISP::T) +- COMPILER::MEMOIZED-HASH-EQUAL)) ++ COMPILER::COPY-ARRAY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T ++ (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T) + COMMON-LISP::FIXNUM) +- COMPILER::PROCLAIMED-ARGD COMPILER::ANALYZE-REGS1 +- COMPILER::ANALYZE-REGS)) ++ COMPILER::BSEARCHLEQ)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::STRING COMMON-LISP::FIXNUM +- COMMON-LISP::FIXNUM) +- COMMON-LISP::T) +- COMPILER::DASH-TO-UNDERSCORE-INT)) +\ No newline at end of file ++ (COMMON-LISP::T ++ (COMMON-LISP::ARRAY COMMON-LISP::T (COMMON-LISP::*)) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ COMPILER::PUSH-ARRAY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ COMPILER::F-TYPE)) +\ No newline at end of file +--- gcl-2.6.12.orig/configure ++++ gcl-2.6.12/configure +@@ -3980,7 +3980,7 @@ add_args_to_cflags -fsigned-char -pipe \ + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ + -Wno-unused-but-set-variable -Wno-misleading-indentation + +-add_args_to_ldflags -Wl,-no_pie -no-pie -Wl,-z,lazy ++add_args_to_ldflags -no-pie -Wl,-z,lazy + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang" >&5 + $as_echo_n "checking for clang... " >&6; } +--- gcl-2.6.12.orig/configure.in ++++ gcl-2.6.12/configure.in +@@ -264,7 +264,7 @@ add_args_to_cflags -fsigned-char -pipe \ + -Wno-builtin-requires-header -Wno-empty-body -Wno-self-assign \ + -Wno-unused-but-set-variable -Wno-misleading-indentation + +-add_args_to_ldflags -Wl,-no_pie -no-pie -Wl,-z,lazy ++add_args_to_ldflags -no-pie -Wl,-z,lazy + + AC_MSG_CHECKING([for clang]) + AC_RUN_IFELSE( +--- gcl-2.6.12.orig/gcl-tk/socketsl.lisp ++++ gcl-2.6.12/gcl-tk/socketsl.lisp +@@ -12,10 +12,6 @@ + (defentry our-write (int object int ) (int "our_write_object")) + (defentry print-to-string1 (object object object) (object print_to_string1)) + +-(clines "#define reset_string_input_stream1(strm,string,start,end) reset_string_input_stream(strm,string,fix(start),fix(end))") +-(defentry reset-string-input-stream (object object object object) (object "reset_string_input_stream1")) +- +- + ;(clines "#define symbol_value_any(x) ((x)->s.s_dbind)") + ;(defentry symbol-value-any (object) (object symbol_value_any)) + +--- gcl-2.6.12.orig/gcl-tk/tkl.lisp ++++ gcl-2.6.12/gcl-tk/tkl.lisp +@@ -293,6 +293,9 @@ + (let () + (send-tcl-cmd *tk-connection* tk-command nil)))) + ++(defun fsubseq (s &optional (b 0) (e (length s))) ++ (make-array (- e b) :element-type (array-element-type s) :displaced-to s :displaced-index-offset b :fill-pointer (- e b))) ++ + (defun send-tcl-cmd (c str send-and-wait ) + ;(notice-text-variables) + (or send-and-wait (setq send-and-wait *send-and-wait*)) +@@ -308,7 +311,7 @@ + + (cond (send-and-wait + (if *debugging* +- (store-circle *requests* (subseq str #.(length *header*)) ++ (store-circle *requests* (fsubseq str #.(length *header*)) + msg-id)) + (store-circle *replies* nil msg-id) + (execute-tcl-cmd c str)) +@@ -932,7 +935,7 @@ + #.(+ 1 (length *header*)) + 3)) + (values +- (subseq str #.(+ 4 (length *header*))) ++ (fsubseq str #.(+ 4 (length *header*))) + (eql (aref str #.(+ 1 (length *header*))) #\0) + reply-from + (get-circle *requests* reply-from))) +@@ -1082,7 +1085,7 @@ + (store-circle *replies* + (cons success + (if (eql (length tk-command) #.(+ 4 (length *header*))) "" +- (subseq tk-command #.(+ 4 (length *header*))))) ++ (fsubseq tk-command #.(+ 4 (length *header*))))) + from-id)) + (#.(pos m_call *mtypes*) + ;; Can play a game of if read-and-act called with request-id: +@@ -1114,7 +1117,7 @@ + (var (aref *text-variable-locations* lisp-var-id)) + (type (get var 'linked-variable-type)) + val) +- (setq val (coerce-result (subseq tk-command #.(+ 3 (length *header*))) type)) ++ (setq val (coerce-result (fsubseq tk-command #.(+ 3 (length *header*))) type)) + (setf (aref *text-variable-locations* (the fixnum + ( + lisp-var-id 1))) + val) +@@ -1130,7 +1133,9 @@ + (let* ((s (car *string-streams*)) + (*string-streams* (cdr *string-streams*))) + (or s (setq s (make-string-input-stream ""))) +- (si::reset-string-input-stream s string start (length string)) ++ (assert (array-has-fill-pointer-p string)) ++ (setf (fill-pointer string) start) ++ (si::c-set-stream-object0 s string) + (read s nil nil))) + + +@@ -1196,7 +1201,7 @@ + (cond (skipping nil) + ((eql brace-level 0) + (if (> i beg) +- (setq ans (cons (subseq x beg i) ans))) ++ (setq ans (cons (fsubseq x beg i) ans))) + + (setq beg (+ i 1)) + ))) +@@ -1207,12 +1212,12 @@ + (setq beg (+ i 1)))) + (incf brace-level)) + (#\} (cond ((eql brace-level 1) +- (setq ans (cons (subseq x beg i) ans)) ++ (setq ans (cons (fsubseq x beg i) ans)) + (setq skipping t))) + (incf brace-level -1))))) + finally + (unless skipping +- (setq ans (cons (subseq x beg i) ans))) ++ (setq ans (cons (fsubseq x beg i) ans))) + (return (nreverse ans)) + )) + +@@ -1394,7 +1399,7 @@ + (cond (start (pp v no_leading_space) (setq start nil)) + (t (pp v normal))) + (setf x (cdr x))) +- (subseq tk-command #.(length *header*)))) ++ (fsubseq tk-command #.(length *header*)))) + + + +@@ -1409,7 +1414,6 @@ + (setq gcltksrv + (cond (host "gcltksrv") + ((si::getenv "GCL_TK_SERVER")) +- ((probe-file (tk-conc si::*lib-directory* "/gcl-tk/gcltksrv"))) + ((probe-file (tk-conc si::*lib-directory* "gcl-tk/gcltksrv"))) + (t (error "Must setenv GCL_TK_SERVER "))))) + (let ((pid (if host -1 (si::getpid))) +@@ -1427,9 +1431,9 @@ + args + ))) + (print command) +- (cond ((not host) (system command)) ++ (cond ((not host) (si::system command)) + (can-rsh +- (system (tk-conc "rsh " host " " command ++ (si::system (tk-conc "rsh " host " " command + " < /dev/null &"))) + (t (format t "Waiting for you to invoke GCL_TK_SERVER, + on ~a as in: ~s~%" host command ))) +--- gcl-2.6.12.orig/h/compprotos.h ++++ gcl-2.6.12/h/compprotos.h +@@ -180,3 +180,4 @@ char *gcl_gets(char *,int); + int gcl_puts(const char *); + int endp_error(object); + object Icall_gen_error_handler(object,object,object,object,ufixnum,...); ++object file_stream(object); +--- gcl-2.6.12.orig/h/lu.h ++++ gcl-2.6.12/h/lu.h +@@ -271,15 +271,14 @@ struct structure { + + struct stream { + FIRSTWORD; +- void *sm_fp; +- object sm_object0; +- object sm_object1; +- int sm_int0; +- int sm_int1; +- char *sm_buffer; +- char sm_mode; +- unsigned char sm_flags; +- short sm_fd; ++ void *sm_fp; ++ object sm_object0; ++ object sm_object1; ++ char *sm_buffer; ++ ufixnum sm_mode:4; ++ ufixnum sm_flags:6; ++ ufixnum sm_fd:6; ++ ufixnum sm_int:LM(16); + }; + + struct random { +--- gcl-2.6.12.orig/h/object.h ++++ gcl-2.6.12/h/object.h +@@ -166,18 +166,18 @@ enum aelttype { /* array element type + /* for any stream that takes writec_char, directly (not two_way or echo) + ie. smm_output,smm_io, smm_string_output, smm_socket + */ +-#define STREAM_FILE_COLUMN(str) ((str)->sm.sm_int1) ++#define STREAM_FILE_COLUMN(str) ((str)->sm.sm_int) + + /* for smm_echo */ +-#define ECHO_STREAM_N_UNREAD(strm) ((strm)->sm.sm_int0) ++#define ECHO_STREAM_N_UNREAD(strm) ((strm)->sm.sm_int) + + /* file fd for socket */ + #define SOCKET_STREAM_FD(strm) ((strm)->sm.sm_fd) + #define SOCKET_STREAM_BUFFER(strm) ((strm)->sm.sm_object1) + + /* for smm_string_input */ +-#define STRING_INPUT_STREAM_NEXT(strm) ((strm)->sm.sm_int0) +-#define STRING_INPUT_STREAM_END(strm) ((strm)->sm.sm_int1) ++#define STRING_INPUT_STREAM_NEXT(strm) ((strm)->sm.sm_object0->st.st_fillp) ++#define STRING_INPUT_STREAM_END(strm) ((strm)->sm.sm_object0->st.st_dim) + + /* for smm_two_way and smm_echo */ + #define STREAM_OUTPUT_STREAM(strm) ((strm)->sm.sm_object1) +--- gcl-2.6.12.orig/h/type.h ++++ gcl-2.6.12/h/type.h +@@ -41,7 +41,6 @@ enum smmode { /* stream mode */ + smm_output, /* output */ + smm_io, /* input-output */ + smm_probe, /* probe */ +- smm_file_synonym, /* synonym stream to file_stream */ + smm_synonym, /* synonym */ + smm_broadcast, /* broadcast */ + smm_concatenated, /* concatenated */ +@@ -152,5 +151,4 @@ enum smmode { /* stream mode */ + #define pathname_string_symbol_streamp(a_) ({enum type _tp=type_of(a_); _tp==t_pathname || _tp == t_string\ + || _tp == t_symbol || _tp==t_stream;}) + +-#define pathname_designatorp(a_) ({object _a=(a_);enum type _tp=type_of(a_);\ +- _tp==t_pathname||_tp==t_string||(_tp==t_stream && _a->sm.sm_mode>=smm_input && _a->sm.sm_mode<=smm_file_synonym);}) ++#define pathname_designatorp(a_) ({object _a=(a_);enum type _tp=type_of(a_);_tp==t_pathname||_tp==t_string||file_stream(_a)!=Cnil;}) +--- gcl-2.6.12.orig/lsp/gcl_directory.lsp ++++ gcl-2.6.12/lsp/gcl_directory.lsp +@@ -74,4 +74,12 @@ + (let ((r (with-open-file (s (apply 'string-concatenate "|" #-winnt "which " + #+winnt "for %i in (" s #+winnt ".exe) do @echo.%~$PATH:i" nil)) + (read-line s nil 'eof)))) +- (if (eq r 'eof) s (string-downcase r)))) ++ (unless (eq r 'eof) ++ (string-downcase r)))) ++ ++(defun get-path (s &aux ++ (e (unless (minusp (string-match #v"([^\n\t\r ]+)([\n\t\r ]|$)" s))(match-end 1))) ++ (w (when e (which (pathname-name (subseq s (match-beginning 1) e)))))) ++ (when w ++ (string-concatenate w (subseq s e)))) ++ +--- gcl-2.6.12.orig/lsp/gcl_iolib.lsp ++++ gcl-2.6.12/lsp/gcl_iolib.lsp +@@ -69,7 +69,20 @@ + (progn ,@b) + (close ,var))))) + +-(defmacro with-input-from-string ((var string &key index start end) . body) ++(defun make-string-input-stream (string &optional (start 0) end) ++ (declare (optimize (safety 1))) ++ (check-type string string) ++ (check-type start seqind) ++ (check-type end (or null seqind)) ++ (let ((l (- (or end (length string)) start))) ++ (make-string-input-stream-int ++ (make-array l :element-type (array-element-type string) :displaced-to string :displaced-index-offset start :fill-pointer 0) ++ 0 l))) ++ ++(defun get-string-input-stream-index (stream &aux (s (c-stream-object0 stream))) ++ (+ (fill-pointer s) (multiple-value-bind (a b) (array-displacement s) b))) ++ ++(defmacro with-input-from-string ((var string &key index (start 0) end) . body) + (declare (optimize (safety 1))) + (multiple-value-bind (ds b) (find-declarations body) + `(let ((,var (make-string-input-stream ,string ,start ,end))) +@@ -77,7 +90,8 @@ + (unwind-protect + (multiple-value-prog1 + (progn ,@b) +- ,@(when index `((setf ,index (get-string-input-stream-index ,var))))) ++ ,@(when index ++ `((setf ,index (get-string-input-stream-index ,var))))) + (close ,var))))) + + (defmacro with-output-to-string ((var &optional string &key element-type) . body) +@@ -406,7 +420,7 @@ + + + (defun write-sequence (seq strm &rest r &key (start 0) end +- &aux (l (listp seq))(cp (eq (stream-element-type strm) 'character))) ++ &aux (cp (eq (stream-element-type strm) 'character))) + (declare (optimize (safety 1))(dynamic-extent r)) + (check-type seq sequence) + (check-type strm stream) +@@ -443,9 +457,15 @@ + if-exists iesp if-does-not-exist idnesp external-format))) + (when (typep s 'stream) (c-set-stream-object1 s pf) s))) + ++(defun load-pathname-exists (z) ++ (or (probe-file z) ++ (when *allow-gzipped-file* ++ (when (probe-file (string-concatenate (namestring z) ".gz")) ++ z)))) ++ + (defun load-pathname (p print if-does-not-exist external-format + &aux (pp (merge-pathnames p)) +- (epp (reduce (lambda (y x) (or y (probe-file (translate-pathname x "" p)))) ++ (epp (reduce (lambda (y x) (or y (load-pathname-exists (translate-pathname x "" p)))) + '(#P".o" #P".lsp" #P".lisp" #P"") :initial-value nil)));FIXME newest? + (if epp + (let* ((*load-pathname* pp)(*load-truename* epp)) +@@ -484,3 +504,36 @@ + (d pd (cdr pd))) + (values ps created))) + ++(defun file-length (x) ++ (declare (optimize (safety 1))) ++ (check-type x (or broadcast-stream file-stream)) ++ (if (typep x 'broadcast-stream) ++ (let ((s (broadcast-stream-streams x))) (if s (file-length (car (last s))) 0)) ++ (multiple-value-bind (tp sz) (stat x) ++ (declare (ignore tp)) ++ (/ sz (get-byte-stream-nchars x))))) ++ ++(defun file-position (x &optional (pos :start pos-p)) ++ (declare (optimize (safety 1))) ++ (check-type x (or broadcast-stream file-stream string-stream)) ++ (check-type pos (or (member :start :end) (integer 0))) ++ (typecase x ++ (broadcast-stream ++ (let ((s (car (last (broadcast-stream-streams x))))) ++ (if s (if pos-p (file-position s pos) (file-position s)) 0))) ++ (string-stream ++ (let* ((st (c-stream-object0 x))(l (length st))(d (array-dimension st 0)) ++ (p (case pos (:start 0) (:end l) (otherwise pos)))) ++ (if pos-p (when (<= p d) (setf (fill-pointer st) p)) l))) ++ (otherwise ++ (let ((n (get-byte-stream-nchars x)) ++ (p (case pos (:start 0) (:end (file-length x)) (otherwise pos)))) ++ (if pos-p (when (fseek x (* p n)) p) (/ (ftell x) n)))))) ++ ++(defun file-string-length (strm obj) ++ (let* ((pos (file-position strm)) ++ (w (write obj :stream strm :escape nil :readably nil)) ++ (pos1 (file-position strm)));(break) ++ (declare (ignore w)) ++ (file-position strm pos) ++ (- pos1 pos))) +--- gcl-2.6.12.orig/lsp/gcl_namestring.lsp ++++ gcl-2.6.12/lsp/gcl_namestring.lsp +@@ -27,7 +27,7 @@ + (declare (optimize (safety 1))) + (check-type x pathname-designator) + (check-type def pathname-designator) +- ,(labels ((new? (k &aux (f (intern (concatenate 'string "PATHNAME-" (string k)) :si))) ++ ,(labels ((new? (k &aux (f (intern (string-concatenate "PATHNAME-" (string k)) :si))) + `(let ((k (,f px))) (unless (equal k (,f pdef)) k)))) + `(namestring (make-pathname + ,@(mapcan (lambda (x) (list x (new? x))) +pathname-keys+))))) +--- gcl-2.6.12.orig/lsp/gcl_predlib.lsp ++++ gcl-2.6.12/lsp/gcl_predlib.lsp +@@ -125,6 +125,8 @@ + (character . characterp) + (package . packagep) + (stream . streamp) ++ (string-input-stream . string-input-stream-p) ++ (string-output-stream . string-output-stream-p) + (file-stream . file-stream-p) + (synonym-stream . synonym-stream-p) + (broadcast-stream . broadcast-stream-p) +--- gcl-2.6.12.orig/lsp/gcl_restart.lsp ++++ gcl-2.6.12/lsp/gcl_restart.lsp +@@ -73,7 +73,7 @@ + &aux rr (report (if (stringp report) `(lambda (s) (write-string ,report s)) report))) + (macrolet ((do-setf (x) + `(when ,x +- (setf (getf rr ,(intern (concatenate 'string (symbol-name x) "-FUNCTION") :keyword)) ++ (setf (getf rr ,(intern (string-concatenate (symbol-name x) "-FUNCTION") :keyword)) + (list 'function ,x))))) + (do-setf report) + (do-setf interactive) +--- gcl-2.6.12.orig/lsp/gcl_serror.lsp ++++ gcl-2.6.12/lsp/gcl_serror.lsp +@@ -2,11 +2,11 @@ + (in-package :si) + + (macrolet +- ((make-conditionp (condition &aux (n (intern (concatenate 'string (string condition) "P")))) ++ ((make-conditionp (condition &aux (n (intern (string-concatenate (string condition) "P")))) + `(defun ,n (x &aux (z (si-find-class ',condition))) + (when z + (funcall (setf (symbol-function ',n) (lambda (x) (typep x z))) x)))) +- (make-condition-classp (class &aux (n (intern (concatenate 'string (string class) "-CLASS-P")))) ++ (make-condition-classp (class &aux (n (intern (string-concatenate (string class) "-CLASS-P")))) + `(defun ,n (x &aux (s (si-find-class 'standard-class)) (z (si-find-class ',class))) + (when (and s z) + (funcall (setf (symbol-function ',n) +@@ -124,9 +124,9 @@ + + (defun process-error (datum args &optional (default-type 'simple-error)) + (let ((internal (cond ((simple-condition-class-p datum) +- (find-symbol (concatenate 'string "INTERNAL-" (string datum)) :conditions)) ++ (find-symbol (string-concatenate "INTERNAL-" (string datum)) :conditions)) + ((condition-class-p datum) +- (find-symbol (concatenate 'string "INTERNAL-SIMPLE-" (string datum)) :conditions))))) ++ (find-symbol (string-concatenate "INTERNAL-SIMPLE-" (string datum)) :conditions))))) + (coerce-to-condition (or internal datum) (if internal (list* :function-name *sig-fn-name* args) args) default-type 'process-error))) + + (defun universal-error-handler (n cp fn cs es &rest args &aux (*sig-fn-name* fn)) +--- gcl-2.6.12.orig/lsp/gcl_top.lsp ++++ gcl-2.6.12/lsp/gcl_top.lsp +@@ -593,12 +593,11 @@ First directory is checked for first nam + (when (eq (stat x) :directory) + (return-from get-temp-dir x)))))) + +-(defun get-path (s &aux (m (string-match "([^ ]*)( |$)" s))(b (match-beginning 1))(e (match-end 1))) +- (string-concatenate (which (pathname-name (subseq s b e))) (subseq s e))) ++ + + (defvar *cc* "cc") + (defvar *ld* "ld") +-(defvar *objdump* "objdump --source ") ++(defvar *objdump* nil) + + (defvar *current-directory* *system-directory*) + +@@ -608,9 +607,9 @@ First directory is checked for first nam + (declare (fixnum i)) + (setq *current-directory* (current-directory-pathname)) + (setq *tmp-dir* (get-temp-dir) +- *cc* (get-path *cc*) +- *ld* (get-path *ld*) +- *objdump* (get-path *objdump*)) ++ *cc* (or (get-path *cc*) *cc*) ++ *ld* (or (get-path *ld*) *ld*) ++ *objdump* (get-path "objdump --source ")) + (dotimes (j i) (push (argv j) tem)) + (setq *command-args* (nreverse tem)) + (setq tem *lib-directory*) +--- gcl-2.6.12.orig/lsp/gcl_translate_pathname.lsp ++++ gcl-2.6.12/lsp/gcl_translate_pathname.lsp +@@ -32,7 +32,7 @@ + (defun do-repl (x y) + (labels ((r (x l &optional (b 0) &aux (f (string-match #v"\\*" x b))) + (if (eql f -1) (if (eql b 0) x (subseq x b)) +- (concatenate 'string (subseq x b f) (or (car l) "") (r x (cdr l) (1+ f)))))) ++ (string-concatenate (subseq x b f) (or (car l) "") (r x (cdr l) (1+ f)))))) + (r y x))) + + (defun dir-p (x) (when (consp x) (member (car x) '(:absolute :relative)))) +--- gcl-2.6.12.orig/lsp/sys-proclaim.lisp ++++ gcl-2.6.12/lsp/sys-proclaim.lisp +@@ -4,229 +4,269 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::FIXNUM) +- SYSTEM::ATOI)) ++ COMMON-LISP::*)) ++ COMMON-LISP::T) ++ SYSTEM::RESET-SYS-PATHS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::OR COMMON-LISP::NULL +- COMMON-LISP::HASH-TABLE)) +- SYSTEM::CONTEXT-HASH)) ++ (COMMON-LISP::VECTOR COMMON-LISP::T)) ++ SYSTEM::CONTEXT-VEC)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST SYSTEM::PARSE-DEFMACRO)) ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::T) ++ SYSTEM::PUSH-CONTEXT SYSTEM::GET-CONTEXT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- COMMON-LISP::SUBTYPEP COMMON-LISP::REDUCE +- SLOOP::FIND-IN-ORDERED-LIST SYSTEM::PARSE-BODY +- COMMON-LISP::STABLE-SORT COMMON-LISP::SORT)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ SLOOP::PARSE-LOOP-DO ANSI-LOOP::LOOP-WHEN-IT-VARIABLE ++ SYSTEM::GET-INDEX-NODE SLOOP::LOOP-PEEK ++ ANSI-LOOP::LOOP-POP-SOURCE SYSTEM::STEP-READ-LINE ++ SYSTEM::SET-UP-TOP-LEVEL SLOOP::LOOP-POP SYSTEM::SET-ENV ++ SYSTEM::DBL COMMON-LISP::TYPE-ERROR SYSTEM::INSPECT-INDENT ++ SLOOP::PARSE-LOOP-COLLECT SYSTEM::CLEANUP ++ SYSTEM::DEFAULT-SYSTEM-BANNER ++ SYSTEM::CURRENT-DIRECTORY-PATHNAME ANSI-LOOP::LOOP-DO-WITH ++ SYSTEM::INIT-BREAK-POINTS SYSTEM::TEST-ERROR ++ SYSTEM::GET-SIG-FN-NAME SLOOP::PARSE-ONE-WHEN-CLAUSE ++ ANSI-LOOP::LOOP-DO-DO SYSTEM::READ-EVALUATED-FORM ++ SYSTEM::INSPECT-INDENT-1 ANSI-LOOP::LOOP-DO-NAMED ++ SLOOP::PARSE-LOOP-FOR SYSTEM::ALL-TRACE-DECLARATIONS ++ ANSI-LOOP::LOOP-GET-FORM ANSI-LOOP::LOOP-BIND-BLOCK ++ SLOOP::PARSE-LOOP-WHEN SYSTEM::TOP-LEVEL ++ SYSTEM::DM-TOO-FEW-ARGUMENTS SYSTEM::KCL-TOP-RESTARTS ++ SYSTEM::DEFAULT-INFO-HOTLIST SYSTEM::SHOW-RESTARTS ++ SYSTEM::DM-TOO-MANY-ARGUMENTS SYSTEM::SETUP-LINEINFO ++ SYSTEM::GET-TEMP-DIR ANSI-LOOP::LOOP-ITERATION-DRIVER ++ SLOOP::PARSE-LOOP1 SLOOP::LOOP-UN-POP ++ ANSI-LOOP::LOOP-DO-FINALLY SYSTEM::INSPECT-READ-LINE ++ ANSI-LOOP::LOOP-CONTEXT SYSTEM::SET-CURRENT ++ ANSI-LOOP::LOOP-DO-REPEAT SYSTEM::ILLEGAL-BOA ++ COMMON-LISP::LISP-IMPLEMENTATION-VERSION ++ ANSI-LOOP::LOOP-DO-RETURN ANSI-LOOP::LOOP-DO-INITIALLY ++ ANSI-LOOP::LOOP-GET-PROGN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::SHARP-+-READER SYSTEM::SHARP---READER +- SYSTEM::SHARP-S-READER ANSI-LOOP::LOOP-GET-COLLECTION-INFO +- SYSTEM::VERIFY-KEYWORDS SYSTEM::LIST-MERGE-SORT +- SYSTEM::RESTART-PRINT SYSTEM::READ-INSPECT-COMMAND)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ COMMON-LISP::HASH-TABLE) ++ SYSTEM::CONTEXT-SPICE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::TRACE-CALL)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR COMMON-LISP::NULL ++ COMMON-LISP::HASH-TABLE)) ++ SYSTEM::CONTEXT-HASH)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::EXPAND-WILD-DIRECTORY SYSTEM::MASET)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ ANSI-LOOP::DUPLICATABLE-CODE-P SYSTEM::RELATIVE-LINE ++ SYSTEM::LENEL SYSTEM::GET-NODE-INDEX SYSTEM::FASLINK ++ SYSTEM::THE-END)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::MME3)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SLOOP::IN-PACKAGE-SLOOP-MAP SLOOP::DESETQ1 ++ COMMON-LISP::LOGANDC2 ANSI-LOOP::MAKE-LOOP-MINIMAX ++ COMMON-LISP::WRITE-BYTE SYSTEM::MATCH-DIMENSIONS ++ SLOOP::IN-CAREFULLY-SLOOP-FOR SLOOP::SUM-SLOOP-COLLECT ++ SYSTEM::DOT-DIR-P SLOOP::IN-FRINGE-SLOOP-MAP ++ SLOOP::COLLATE-SLOOP-COLLECT ANSI-LOOP::LOOP-TMEMBER ++ FPE::READ-OPERANDS SYSTEM::IN-INTERVAL-P SYSTEM::SUBSTRINGP ++ FPE::PAREN-READER ANSI-LOOP::HIDE-VARIABLE-REFERENCES ++ SYSTEM::QUOTATION-READER SYSTEM::ALL-MATCHES SYSTEM::GET-MATCH ++ SYSTEM::ADD-FILE ANSI-LOOP::LOOP-DO-ALWAYS SLOOP::THE-TYPE ++ SYSTEM::?PUSH SYSTEM::INCREMENT-CURSOR ++ SYSTEM::CHECK-SEQ-START-END SLOOP::MAKE-VALUE ++ SLOOP::THEREIS-SLOOP-COLLECT ANSI-LOOP::LOOP-DO-WHILE ++ COMMON-LISP::COERCE ANSI-LOOP::LOOP-TEQUAL ++ ANSI-LOOP::LOOP-DECLARE-VARIABLE COMMON-LISP::LOGNAND ++ COMMON-LISP::LOGORC1 SYSTEM::BREAK-STEP-NEXT ++ SLOOP::LOGXOR-SLOOP-COLLECT COMMON-LISP::LOGNOR ++ COMPILER::COMPILER-DEF-HOOK ANSI-LOOP::LOOP-TASSOC ++ SYSTEM::GET-LINE-OF-FORM SLOOP::MAXIMIZE-SLOOP-COLLECT ++ ANSI-LOOP::LOOP-DO-IF SYSTEM::SETF-EXPAND SYSTEM::DM-V ++ SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::NTHCDR ++ SYSTEM::CONDITION-PASS SYSTEM::DISPLAY-COMPILED-ENV ++ COMMON-LISP::LDB-TEST ANSI-LOOP::LOOP-MAYBE-BIND-FORM ++ SYSTEM::SUPER-GO SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS ++ FPE::RF SYSTEM::SUB-INTERVAL-P SYSTEM::LEFT-PARENTHESIS-READER ++ COMMON-LISP::FILE-STRING-LENGTH SYSTEM::OBJLT SYSTEM::MSUB ++ SYSTEM::COERCE-TO-STRING SYSTEM::SAFE-EVAL ++ SYSTEM::SET-PATH-STREAM-NAME SYSTEM::SET-BACK ++ ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION COMMON-LISP::LOGTEST ++ SYSTEM::*BREAK-POINTS* SLOOP::=-SLOOP-FOR ++ SLOOP::MINIMIZE-SLOOP-COLLECT SYSTEM::KEYWORD-SUPPLIED-P ++ SLOOP::COUNT-SLOOP-COLLECT FPE::%-READER COMMON-LISP::LOGORC2 ++ SYSTEM::SEQUENCE-CURSOR SYSTEM::LOOKUP-KEYWORD ++ COMMON-LISP::BYTE SYSTEM::PARSE-SLOT-DESCRIPTION ++ COMMON-LISP::LOGANDC1 SYSTEM::DM-NTH-CDR FPE::0-READER ++ SLOOP::L-EQUAL SYSTEM::LIST-DELQ SYSTEM::DM-NTH ++ COMMON-LISP::LDB SYSTEM::SETF-HELPER ++ SLOOP::NEVER-SLOOP-COLLECT SLOOP::PARSE-LOOP-MAP ++ COMMON-LISP::NTH SYSTEM::BREAK-STEP-INTO ++ SYSTEM::GET-INFO-CHOICES SLOOP::IN-TABLE-SLOOP-MAP ++ SYSTEM::GET-NODES COMMON-LISP::VECTOR-PUSH ++ COMMON-LISP::PATHNAME-MATCH-P SYSTEM::DBL-UP ++ ANSI-LOOP::LOOP-LOOKUP-KEYWORD FPE::READ-INSTRUCTION ++ SLOOP::ALWAYS-SLOOP-COLLECT SYSTEM::SET-DIR SYSTEM::INFO-AUX ++ SYSTEM::DISPLAY-ENV COMMON-LISP::DOCUMENTATION ++ SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- SYSTEM::PUSH-OPTIONAL-BINDING)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- SYSTEM::MAKE-KEYWORD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- SYSTEM::QUICK-SORT)) ++ COMMON-LISP::APROPOS ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE ++ COMMON-LISP::FFLOOR SYSTEM::PRINT-DOC SYSTEM::INFO ++ SYSTEM::PARSE-BODY-HEADER COMMON-LISP::INVOKE-RESTART ++ SYSTEM::BREAK-FUNCTION SYSTEM::SHOW-INFO COMMON-LISP::FROUND ++ COMMON-LISP::GET-SETF-EXPANSION COMMON-LISP::PARSE-NAMESTRING ++ SYSTEM::APROPOS-DOC COMMON-LISP::ENSURE-DIRECTORIES-EXIST ++ COMMON-LISP::USE-VALUE COMMON-LISP::READ-FROM-STRING ++ COMMON-LISP::FTRUNCATE COMMON-LISP::STORE-VALUE ++ SYSTEM::STEPPER SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE ++ COMMON-LISP::APROPOS-LIST COMMON-LISP::FCEILING ++ COMMON-LISP::WRITE-TO-STRING ++ COMMON-LISP::DECODE-UNIVERSAL-TIME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::BIGNTHCDR)) ++ SYSTEM::SETF-EXPAND-1 SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS ++ SYSTEM::WARN-VERSION ANSI-LOOP::LOOP-TRANSLATE ++ ANSI-LOOP::LOOP-FOR-IN ANSI-LOOP::PRINT-LOOP-UNIVERSE ++ ANSI-LOOP::LOOP-STANDARD-EXPANSION ++ ANSI-LOOP::LOOP-ANSI-FOR-EQUALS SYSTEM::DM-VL ++ SYSTEM::SHARP-A-READER COMMON-LISP::DEPOSIT-FIELD ++ SYSTEM::RESTART-CASE-EXPRESSION-CONDITION ++ SYSTEM::APPLY-DISPLAY-FUN ANSI-LOOP::HIDE-VARIABLE-REFERENCE ++ SYSTEM::FLOATING-POINT-ERROR SYSTEM::GET-SLOT-POS ++ ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE ++ SYSTEM::MAKE-BREAK-POINT SYSTEM::SHARP-V-READER ++ SYSTEM::TO-REGEXP-OR-NAMESTRING ANSI-LOOP::LOOP-FOR-ON ++ SYSTEM::SHARP-U-READER ANSI-LOOP::LOOP-SUM-COLLECTION ++ SYSTEM::SHARP-P-READER SYSTEM::MAKE-T-TYPE ++ ANSI-LOOP::LOOP-FOR-ACROSS SYSTEM::MFR SYSTEM::RECURSE-DIR ++ SYSTEM::PATHNAME-PARSE ANSI-LOOP::LOOP-FOR-BEING ++ COMMON-LISP::DPB SYSTEM::SHARP-DQ-READER ++ SYSTEM::CHECK-TRACE-ARGS SYSTEM::DEFMACRO* ++ SYSTEM::CHECK-S-DATA FPE::REF)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- COMMON-LISP::EVERY COMMON-LISP::SET-DIFFERENCE +- SYSTEM::VECTOR-PUSH-STRING SYSTEM::PROCESS-ERROR +- COMMON-LISP::POSITION-IF-NOT COMMON-LISP::FIND-IF +- SLOOP::LOOP-ADD-BINDING COMMON-LISP::BIT-ORC1 +- COMMON-LISP::READ-SEQUENCE SYSTEM::INTERNAL-COUNT-IF +- COMMON-LISP::COUNT COMMON-LISP::MISMATCH +- COMMON-LISP::ADJUST-ARRAY COMMON-LISP::INTERSECTION +- COMMON-LISP::UNION COMMON-LISP::DELETE-IF-NOT +- COMMON-LISP::NINTERSECTION COMMON-LISP::BIT-ANDC1 +- COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::TYPEP +- COMMON-LISP::NUNION COMMON-LISP::WRITE-SEQUENCE +- COMMON-LISP::VECTOR-PUSH-EXTEND COMMON-LISP::REMOVE +- COMMON-LISP::BIT-IOR SLOOP::PARSE-LOOP-MACRO +- COMMON-LISP::SEARCH COMMON-LISP::SUBSETP +- COMMON-LISP::SET-EXCLUSIVE-OR SYSTEM::WREADDIR +- COMMON-LISP::POSITION-IF COMMON-LISP::DELETE +- COMMON-LISP::BIT-EQV COMMON-LISP::BIT-ANDC2 +- COMMON-LISP::BIT-AND COMMON-LISP::NSET-EXCLUSIVE-OR +- SLOOP::IN-ARRAY-SLOOP-FOR ANSI-LOOP::LOOP-CHECK-DATA-TYPE +- COMMON-LISP::POSITION COMMON-LISP::MAKE-SEQUENCE +- COMMON-LISP::NOTEVERY COMMON-LISP::MAP-INTO +- COMMON-LISP::REPLACE COMMON-LISP::NSET-DIFFERENCE ++ SYSTEM::FIND-IHS COMMON-LISP::NSET-DIFFERENCE ++ COMMON-LISP::BIT-NAND SYSTEM::BREAK-CALL ++ COMMON-LISP::COUNT-IF-NOT COMMON-LISP::DELETE ++ SYSTEM::INTERNAL-COUNT COMMON-LISP::BIT-ORC1 ++ COMMON-LISP::DELETE-IF COMMON-LISP::BIT-ANDC1 ++ SYSTEM::VECTOR-PUSH-STRING COMMON-LISP::MISMATCH ++ COMMON-LISP::NOTEVERY SYSTEM::PROCESS-ERROR COMMON-LISP::TYPEP ++ COMMON-LISP::BIT-IOR COMMON-LISP::BIT-EQV ++ COMMON-LISP::COUNT-IF COMMON-LISP::REMOVE-IF ++ COMMON-LISP::EVERY COMMON-LISP::POSITION-IF-NOT ++ COMMON-LISP::ADJUST-ARRAY COMMON-LISP::VECTOR-PUSH-EXTEND ++ SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::COUNT ++ COMMON-LISP::DELETE-IF-NOT COMMON-LISP::NINTERSECTION + COMMON-LISP::FIND-IF-NOT COMMON-LISP::BIT-ORC2 +- COMMON-LISP::DELETE-IF COMMON-LISP::CERROR +- COMMON-LISP::BIT-XOR COMMON-LISP::FIND COMMON-LISP::FILL +- SYSTEM::INTERNAL-COUNT-IF-NOT COMMON-LISP::REMOVE-IF +- COMMON-LISP::BIT-NAND COMMON-LISP::BIT-NOR COMMON-LISP::SOME +- COMMON-LISP::COUNT-IF SYSTEM::BREAK-CALL +- COMMON-LISP::COUNT-IF-NOT SYSTEM::FIND-IHS COMMON-LISP::NOTANY +- SYSTEM::INTERNAL-COUNT)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- SYSTEM::PATHNAME-PARSE ANSI-LOOP::LOOP-TRANSLATE +- SYSTEM::CHECK-S-DATA SYSTEM::MFR FPE::REF +- ANSI-LOOP::LOOP-STANDARD-EXPANSION ANSI-LOOP::LOOP-FOR-ON +- ANSI-LOOP::LOOP-SUM-COLLECTION SYSTEM::SHARP-DQ-READER +- COMMON-LISP::DPB SYSTEM::CHECK-TRACE-ARGS +- SLOOP::LOOP-PARSE-ADDITIONAL-COLLECTIONS SYSTEM::RECURSE-DIR +- SYSTEM::SHARP-U-READER SYSTEM::FLOATING-POINT-ERROR +- ANSI-LOOP::LOOP-FOR-IN ANSI-LOOP::HIDE-VARIABLE-REFERENCE +- SYSTEM::GET-SLOT-POS SYSTEM::APPLY-DISPLAY-FUN +- SYSTEM::RESTART-CASE-EXPRESSION-CONDITION +- SYSTEM::MAKE-BREAK-POINT SYSTEM::TO-REGEXP-OR-NAMESTRING +- COMMON-LISP::DEPOSIT-FIELD SYSTEM::SHARP-V-READER +- SYSTEM::MAKE-T-TYPE ANSI-LOOP::LOOP-FOR-ACROSS +- ANSI-LOOP::LOOP-ANSI-FOR-EQUALS ANSI-LOOP::PRINT-LOOP-UNIVERSE +- ANSI-LOOP::LOOP-FOR-BEING SYSTEM::SHARP-P-READER SYSTEM::DM-VL +- SYSTEM::SHARP-A-READER ANSI-LOOP::LOOP-MAKE-ITERATION-VARIABLE +- SYSTEM::DEFMACRO* SYSTEM::SETF-EXPAND-1 SYSTEM::WARN-VERSION)) ++ COMMON-LISP::SUBSETP COMMON-LISP::SOME SYSTEM::WREADDIR ++ COMMON-LISP::SET-DIFFERENCE COMMON-LISP::UNION ++ COMMON-LISP::BIT-XOR SLOOP::PARSE-LOOP-MACRO ++ COMMON-LISP::REPLACE COMMON-LISP::REMOVE ++ SLOOP::LOOP-ADD-BINDING COMMON-LISP::BIT-ANDC2 ++ COMMON-LISP::READ-SEQUENCE COMMON-LISP::CERROR ++ COMMON-LISP::INTERSECTION COMMON-LISP::POSITION-IF ++ ANSI-LOOP::LOOP-CHECK-DATA-TYPE SYSTEM::INTERNAL-COUNT-IF ++ COMMON-LISP::NUNION COMMON-LISP::WRITE-SEQUENCE ++ COMMON-LISP::MAP-INTO COMMON-LISP::MAKE-SEQUENCE ++ COMMON-LISP::SET-EXCLUSIVE-OR SLOOP::IN-ARRAY-SLOOP-FOR ++ COMMON-LISP::FIND-IF COMMON-LISP::SEARCH COMMON-LISP::FILL ++ COMMON-LISP::FIND COMMON-LISP::NOTANY ++ COMMON-LISP::NSET-EXCLUSIVE-OR COMMON-LISP::BIT-NOR ++ COMMON-LISP::REMOVE-IF-NOT COMMON-LISP::POSITION ++ COMMON-LISP::BIT-AND)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::MME2 COMMON-LISP::NSUBSTITUTE SYSTEM::MATCH-COMPONENT +- SYSTEM::COMPLETE-PROP SYSTEM::WALK-DIR +- COMMON-LISP::TRANSLATE-PATHNAME ANSI-LOOP::ADD-LOOP-PATH +- SYSTEM::DIR-PARSE ANSI-LOOP::LOOP-MAKE-VARIABLE +- COMMON-LISP::SUBSTITUTE-IF COMMON-LISP::NSUBSTITUTE-IF +- SYSTEM::PUSH-LET-BINDING COMMON-LISP::SUBSTITUTE +- ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH COMMON-LISP::MAP +- COMMON-LISP::SUBSTITUTE-IF-NOT COMMON-LISP::NSUBSTITUTE-IF-NOT +- ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH +- SLOOP::LOOP-DECLARE-BINDING +- ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH +- SYSTEM::CHECK-TYPE-SYMBOL)) ++ SYSTEM::FIND-LINE-IN-FUN ANSI-LOOP::LOOP-FOR-ARITHMETIC ++ SYSTEM::EXPAND-RANGE SYSTEM::MAYBE-BREAK SYSTEM::MINMAX ++ SLOOP::FIRST-USE-SLOOP-FOR SLOOP::FIRST-SLOOP-FOR ++ SYSTEM::SETF-STRUCTURE-ACCESS SYSTEM::DO-BREAK-LEVEL ++ SYSTEM::CALL-TEST SYSTEM::ELEMENT SYSTEM::LOAD-PATHNAME ++ SYSTEM::COERCE-TO-CONDITION SYSTEM::ELSUB)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T +- (COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- SYSTEM::SHARP-EQ-READER SYSTEM::SHARP-SHARP-READER)) ++ SLOOP::DEF-LOOP-INTERNAL COMMON-LISP::MERGE ++ SYSTEM::PRINT-STACK-FRAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) + COMMON-LISP::T) +- SYSTEM::ELSUB SLOOP::FIRST-USE-SLOOP-FOR +- SLOOP::FIRST-SLOOP-FOR SYSTEM::SETF-STRUCTURE-ACCESS +- SYSTEM::FIND-LINE-IN-FUN SYSTEM::COERCE-TO-CONDITION +- ANSI-LOOP::LOOP-FOR-ARITHMETIC SYSTEM::MAYBE-BREAK +- SYSTEM::ELEMENT SYSTEM::DO-BREAK-LEVEL SYSTEM::CALL-TEST)) ++ COMMON-LISP::ENCODE-UNIVERSAL-TIME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) ++ COMMON-LISP::*) + COMMON-LISP::T) +- ANSI-LOOP::LOOP-SEQUENCER)) ++ ANSI-LOOP::LOOP-PACKAGE-SYMBOLS-ITERATION-PATH ++ SYSTEM::COMPLETE-PROP SYSTEM::CHECK-TYPE-SYMBOL ++ COMMON-LISP::NSUBSTITUTE ++ ANSI-LOOP::LOOP-SEQUENCE-ELEMENTS-PATH COMMON-LISP::SUBSTITUTE ++ COMMON-LISP::TRANSLATE-PATHNAME COMMON-LISP::NSUBSTITUTE-IF ++ COMMON-LISP::MAP SLOOP::LOOP-DECLARE-BINDING SYSTEM::WALK-DIR ++ SYSTEM::MATCH-COMPONENT ANSI-LOOP::LOOP-MAKE-VARIABLE ++ ANSI-LOOP::ADD-LOOP-PATH COMMON-LISP::SUBSTITUTE-IF ++ COMMON-LISP::NSUBSTITUTE-IF-NOT SYSTEM::MME2 ++ ANSI-LOOP::LOOP-HASH-TABLE-ITERATION-PATH ++ COMMON-LISP::SUBSTITUTE-IF-NOT SYSTEM::PUSH-LET-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- SYSTEM::MAKE-CONSTRUCTOR SYSTEM::MAKE-PREDICATE)) ++ SYSTEM::SHARP-SHARP-READER SYSTEM::SHARP-EQ-READER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::PUSH-SUB-LIST-BINDING SYSTEM::DO-ARG-COUNT-ERROR)) ++ SYSTEM::DO-ARG-COUNT-ERROR SYSTEM::PUSH-SUB-LIST-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SLOOP::DEF-LOOP-INTERNAL COMMON-LISP::MERGE +- SYSTEM::PRINT-STACK-FRAME)) ++ SYSTEM::MAKE-CONSTRUCTOR SYSTEM::MAKE-PREDICATE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) + COMMON-LISP::T) +- COMMON-LISP::ENCODE-UNIVERSAL-TIME)) ++ ANSI-LOOP::LOOP-SEQUENCER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -234,43 +274,50 @@ + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) + SYSTEM::UNIVERSAL-ERROR-HANDLER)) ++(COMMON-LISP::MAPC ++ (COMMON-LISP::LAMBDA (COMPILER::X) ++ (COMMON-LISP::SETF ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) ++ COMMON-LISP::T)) ++ '(SYSTEM::SI-FIND-CLASS SYSTEM::WARNINGP SYSTEM::SI-CLASS-OF ++ SYSTEM::CONDITION-CLASS-P SYSTEM::UNTRACE-ONE ++ SYSTEM::MAKE-ACCESS-FUNCTION SYSTEM::SIMPLE-CONDITION-CLASS-P ++ SYSTEM::CONDITIONP SYSTEM::AUTOLOAD ++ SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASSP ++ FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS SYSTEM::TRACE-ONE ++ SYSTEM::AUTOLOAD-MACRO SYSTEM::DEFINE-STRUCTURE ++ SYSTEM::SI-CLASS-NAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- COMMON-LISP::MERGE-PATHNAMES +- COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME ANSI-LOOP::LOOP-ERROR +- COMMON-LISP::WILD-PATHNAME-P SLOOP::LOOP-ADD-TEMPS +- SYSTEM::FILE-SEARCH SYSTEM::INFO-SEARCH +- COMMON-LISP::PATHNAME-VERSION COMMON-LISP::WARN SYSTEM::MGSUB +- COMMON-LISP::ARRAY-ROW-MAJOR-INDEX +- COMMON-LISP::REMOVE-DUPLICATES COMMON-LISP::PATHNAME-NAME +- COMMON-LISP::BIT COMMON-LISP::FIND-RESTART SYSTEM::TO-REGEXP +- SYSTEM::PROCESS-SOME-ARGS COMMON-LISP::ERROR +- COMMON-LISP::REQUIRE COMMON-LISP::OPEN +- COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE SLOOP::ADD-FROM-DATA +- SYSTEM::BREAK-LEVEL SYSTEM::LIST-MATCHES +- COMMON-LISP::DELETE-DUPLICATES ANSI-LOOP::LOOP-WARN +- COMMON-LISP::PATHNAME-DEVICE COMMON-LISP::LOAD +- COMMON-LISP::PATHNAME-HOST COMMON-LISP::SBIT SYSTEM::NLOAD +- COMMON-LISP::BIT-NOT COMMON-LISP::ENOUGH-NAMESTRING +- COMMON-LISP::SIGNAL COMMON-LISP::ARRAY-IN-BOUNDS-P +- COMMON-LISP::PATHNAME-TYPE SYSTEM::FILE-TO-STRING +- SYSTEM::LOGICAL-PATHNAME-PARSE SYSTEM::NTH-STACK-FRAME +- ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES SYSTEM::MGLIST +- COMMON-LISP::DIRECTORY SYSTEM::BAD-SEQ-LIMIT +- COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::READ-BYTE +- SYSTEM::LINK-EXPAND COMMON-LISP::CONCATENATE +- COMMON-LISP::MAKE-ARRAY)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ SYSTEM::INSTREAM-NAME ANSI-LOOP::LOOP-LIST-STEP ++ COMMON-LISP::PRIN1-TO-STRING ANSI-LOOP::NAMED-VARIABLE ++ SYSTEM::WAITING SYSTEM::FIND-DECLARATIONS COMMON-LISP::INSPECT ++ SYSTEM::END-WAITING SYSTEM::BREAK-GO SYSTEM::INFO-SUBFILE ++ COMMON-LISP::INVOKE-RESTART-INTERACTIVELY ++ ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES SYSTEM::INSPECT-OBJECT ++ SYSTEM::BREAK-LEVEL-INVOKE-RESTART SYSTEM::EXPAND-RANGES ++ SYSTEM::GET-&ENVIRONMENT COMMON-LISP::DESCRIBE ++ COMMON-LISP::PRINC-TO-STRING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- SYSTEM::NEWLINE SYSTEM::LIST-TOGGLE-CASE +- COMMON-LISP::RENAME-FILE ANSI-LOOP::ESTIMATE-CODE-SIZE +- SYSTEM::SOURCE-PORTION SYSTEM::RESTART-REPORT SYSTEM::DO-REPL +- SYSTEM::FIND-DOC ANSI-LOOP::ESTIMATE-CODE-SIZE-1 +- SYSTEM::NEW-SEMI-COLON-READER)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ COMMON-LISP::ABORT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE ++ SYSTEM::MAKE-S-DATA ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL ++ ANSI-LOOP::MAKE-LOOP-PATH SYSTEM::CURRENT-STEP-FUN SYSTEM::LOC ++ SYSTEM::DBL-READ SYSTEM::MAKE-RESTART ++ SYSTEM::TRANSFORM-KEYWORDS COMMON-LISP::Y-OR-N-P ++ SYSTEM::NEXT-MATCH COMMON-LISP::COMPUTE-RESTARTS ++ SLOOP::PARSE-LOOP-WITH COMMON-LISP::VECTOR SYSTEM::STEP-NEXT ++ ANSI-LOOP::MAKE-LOOP-COLLECTOR ++ COMMON-LISP::USER-HOMEDIR-PATHNAME SLOOP::PARSE-LOOP-DECLARE ++ COMMON-LISP::YES-OR-NO-P SYSTEM::STEP-INTO ++ SYSTEM::MAKE-CONTEXT SYSTEM::BREAK-LOCALS ++ SYSTEM::DESCRIBE-ENVIRONMENT COMMON-LISP::DRIBBLE ++ ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL SYSTEM::MAYBE-CLEAR-INPUT ++ COMMON-LISP::BREAK ANSI-LOOP::LOOP-GENTEMP ++ ANSI-LOOP::MAKE-LOOP-UNIVERSE SYSTEM::MAKE-INSTREAM ++ COMMON-LISP::MAKE-PATHNAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -280,74 +327,6 @@ + FPE::FE-ENABLE SYSTEM::DBL-WHAT-FRAME)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- SYSTEM::INFO SYSTEM::GET-SETF-METHOD-MULTIPLE-VALUE +- COMMON-LISP::FTRUNCATE COMMON-LISP::USE-VALUE +- COMMON-LISP::INVOKE-RESTART COMMON-LISP::WRITE-TO-STRING +- COMMON-LISP::FCEILING COMMON-LISP::FROUND +- COMMON-LISP::READ-FROM-STRING COMMON-LISP::FFLOOR +- SYSTEM::PARSE-BODY-HEADER SYSTEM::BREAK-FUNCTION +- SYSTEM::APROPOS-DOC COMMON-LISP::APROPOS +- COMMON-LISP::APROPOS-LIST +- ANSI-LOOP::LOOP-CONSTANT-FOLD-IF-POSSIBLE +- COMMON-LISP::GET-SETF-EXPANSION SYSTEM::PRINT-DOC +- COMMON-LISP::PARSE-NAMESTRING +- COMMON-LISP::ENSURE-DIRECTORIES-EXIST +- COMMON-LISP::DECODE-UNIVERSAL-TIME SYSTEM::SHOW-INFO +- COMMON-LISP::STORE-VALUE SYSTEM::STEPPER)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::T) +- COMMON-LISP::VECTOR-PUSH SYSTEM::DM-NTH COMMON-LISP::LOGORC1 +- SLOOP::L-EQUAL SLOOP::NEVER-SLOOP-COLLECT +- COMMON-LISP::LDB-TEST COMMON-LISP::LDB COMMON-LISP::LOGORC2 +- SLOOP::COUNT-SLOOP-COLLECT SLOOP::MAXIMIZE-SLOOP-COLLECT +- SYSTEM::ALL-MATCHES ANSI-LOOP::LOOP-TMEMBER SLOOP::THE-TYPE +- SYSTEM::?PUSH SYSTEM::INCREMENT-CURSOR SYSTEM::SET-DIR +- SYSTEM::DM-NTH-CDR SYSTEM::IN-INTERVAL-P SLOOP::MAKE-VALUE +- SYSTEM::DBL-UP COMMON-LISP::COERCE SYSTEM::MATCH-DIMENSIONS +- COMMON-LISP::LOGNAND SLOOP::=-SLOOP-FOR +- SYSTEM::KEYWORD-SUPPLIED-P SYSTEM::OVERWRITE-SLOT-DESCRIPTIONS +- SYSTEM::LEFT-PARENTHESIS-READER +- ANSI-LOOP::LOOP-MAYBE-BIND-FORM SYSTEM::COERCE-TO-STRING +- SYSTEM::ADD-FILE SLOOP::PARSE-LOOP-MAP COMMON-LISP::LOGNOR +- SYSTEM::MSUB SYSTEM::SET-BACK SYSTEM::SUPER-GO +- SYSTEM::SUBSTRINGP ANSI-LOOP::LOOP-TEQUAL +- ANSI-LOOP::LOOP-DO-WHILE SYSTEM::GET-LINE-OF-FORM +- FPE::READ-INSTRUCTION SYSTEM::SUB-INTERVAL-P +- SYSTEM::CHECK-SEQ-START-END SYSTEM::*BREAK-POINTS* +- ANSI-LOOP::MAKE-LOOP-MINIMAX SLOOP::IN-PACKAGE-SLOOP-MAP +- SYSTEM::DM-V SYSTEM::INFO-AUX +- ANSI-LOOP::HIDE-VARIABLE-REFERENCES +- SLOOP::COLLATE-SLOOP-COLLECT COMMON-LISP::PATHNAME-MATCH-P +- SYSTEM::SET-PATH-STREAM-NAME SLOOP::SUM-SLOOP-COLLECT +- ANSI-LOOP::LOOP-LOOKUP-KEYWORD +- ANSI-LOOP::LOOP-DECLARE-VARIABLE SYSTEM::BREAK-STEP-NEXT +- FPE::RF SLOOP::IN-TABLE-SLOOP-MAP SYSTEM::OBJLT +- FPE::READ-OPERANDS SYSTEM::BREAK-STEP-INTO COMMON-LISP::BYTE +- SYSTEM::SEQUENCE-CURSOR SYSTEM::LIST-DELQ +- SYSTEM::SETF-LOGICAL-PATHNAME-TRANSLATIONS +- SYSTEM::CONDITION-PASS SYSTEM::SETF-HELPER FPE::0-READER +- SYSTEM::DISPLAY-COMPILED-ENV COMMON-LISP::NTH +- COMPILER::COMPILER-DEF-HOOK SYSTEM::DOT-DIR-P +- COMMON-LISP::LOGTEST SYSTEM::QUOTATION-READER +- SYSTEM::ITERATE-OVER-BKPTS COMMON-LISP::LOGANDC1 +- SLOOP::ALWAYS-SLOOP-COLLECT SLOOP::DESETQ1 +- SYSTEM::GET-INFO-CHOICES COMMON-LISP::WRITE-BYTE +- ANSI-LOOP::LOOP-DO-IF ANSI-LOOP::LOOP-NOTE-MINIMAX-OPERATION +- ANSI-LOOP::LOOP-TASSOC SLOOP::IN-CAREFULLY-SLOOP-FOR +- COMMON-LISP::DOCUMENTATION FPE::PAREN-READER SYSTEM::GET-NODES +- SYSTEM::PARSE-SLOT-DESCRIPTION SLOOP::IN-FRINGE-SLOOP-MAP +- SYSTEM::SAFE-EVAL SYSTEM::DISPLAY-ENV FPE::%-READER +- SLOOP::THEREIS-SLOOP-COLLECT SYSTEM::LOOKUP-KEYWORD +- COMMON-LISP::LOGANDC2 COMMON-LISP::NTHCDR +- SLOOP::MINIMIZE-SLOOP-COLLECT SYSTEM::GET-MATCH +- SYSTEM::SETF-EXPAND SLOOP::LOGXOR-SLOOP-COLLECT +- ANSI-LOOP::LOOP-DO-ALWAYS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + ((COMMON-LISP::INTEGER -9223372036854775808 + 9223372036854775807) +@@ -357,263 +336,300 @@ + SYSTEM::ROUND-UP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- COMMON-LISP::Y-OR-N-P COMMON-LISP::YES-OR-NO-P +- COMMON-LISP::DRIBBLE COMMON-LISP::VECTOR SYSTEM::NEXT-MATCH +- SYSTEM::MAKE-S-DATA SYSTEM::LOC SYSTEM::BREAK-LOCALS +- SLOOP::PARSE-LOOP-WITH COMMON-LISP::USER-HOMEDIR-PATHNAME +- SYSTEM::STEP-INTO SYSTEM::MAYBE-CLEAR-INPUT +- ANSI-LOOP::MAKE-LOOP-PATH SYSTEM::STEP-NEXT +- ANSI-LOOP::LOOP-GENTEMP COMMON-LISP::COMPUTE-RESTARTS +- SYSTEM::CURRENT-STEP-FUN SYSTEM::MAKE-INSTREAM +- ANSI-LOOP::MAKE-LOOP-COLLECTOR SYSTEM::MAKE-RESTART +- SYSTEM::DESCRIBE-ENVIRONMENT SYSTEM::TRANSFORM-KEYWORDS +- COMMON-LISP::ABORT ANSI-LOOP::MAKE-STANDARD-LOOP-UNIVERSE +- ANSI-LOOP::MAKE-LOOP-UNIVERSE SLOOP::PARSE-LOOP-DECLARE +- COMMON-LISP::BREAK ANSI-LOOP::LOOP-DISALLOW-CONDITIONAL +- SYSTEM::MAKE-CONTEXT SYSTEM::DBL-READ +- COMMON-LISP::MAKE-PATHNAME +- ANSI-LOOP::MAKE-LOOP-MINIMAX-INTERNAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- ANSI-LOOP::LOOP-OPTIMIZATION-QUANTITIES SYSTEM::BREAK-GO +- COMMON-LISP::FILE-AUTHOR SYSTEM::ENSURE-DIR-STRING +- SYSTEM::INFO-SUBFILE COMMON-LISP::DESCRIBE SYSTEM::END-WAITING +- COMMON-LISP::PRIN1-TO-STRING SYSTEM::FIND-DECLARATIONS +- COMMON-LISP::INSPECT ANSI-LOOP::NAMED-VARIABLE +- SYSTEM::GET-&ENVIRONMENT SYSTEM::INSPECT-OBJECT +- COMMON-LISP::PRINC-TO-STRING ANSI-LOOP::LOOP-LIST-STEP +- SYSTEM::INSTREAM-NAME SYSTEM::BREAK-LEVEL-INVOKE-RESTART +- SYSTEM::WAITING COMMON-LISP::INVOKE-RESTART-INTERACTIVELY)) ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) ++ COMMON-LISP::FIXNUM) ++ SYSTEM::ATOI)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- SYSTEM::IHS-NOT-INTERPRETED-ENV COMMON-LISP::NINTH +- SYSTEM::FIND-KCL-TOP-RESTART COMMON-LISP::TRUENAME +- SYSTEM::DIRECTORY-LIST-CHECK SYSTEM::REAL-ASINH +- SYSTEM::SHOW-ENVIRONMENT SYSTEM::PRINT-FRS +- SYSTEM::REWRITE-RESTART-CASE-CLAUSE +- COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM +- ANSI-LOOP::LOOP-COLLECTOR-DATA SLOOP::POINTER-FOR-COLLECT +- SYSTEM::MLP SYSTEM::WILD-PATH-ELEMENT-P SYSTEM::LNP +- ANSI-LOOP::LOOP-MINIMAX-OPERATIONS SYSTEM::FRS-KIND +- SYSTEM::BKPT-FILE COMMON-LISP::FIFTH +- ANSI-LOOP::LOOP-COLLECTOR-P ANSI-LOOP::LOOP-UNIVERSE-ANSI +- ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::IDESCRIBE +- ANSI-LOOP::LOOP-CONSTANTP +- ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS COMMON-LISP::PROBE-FILE +- ANSI-LOOP::LOOP-UNIVERSE-P COMMON-LISP::SINH SYSTEM::RESTART-P +- SYSTEM::S-DATA-DOCUMENTATION ++ SYSTEM::REGEXP-CONV SYSTEM::DIR-CONJ SYSTEM::DIR-P ++ ANSI-LOOP::LOOP-LIST-COLLECTION COMMON-LISP::COSH ++ SYSTEM::GET-BYTE-STREAM-NCHARS SYSTEM::INSPECT-CONS ++ SYSTEM::KNOWN-TYPE-P SYSTEM::LNP COMMON-LISP::SEVENTH ++ SYSTEM::BKPT-FUNCTION SYSTEM::WILD-DIR-ELEMENT-P ++ COMMON-LISP::COMPILER-MACRO-FUNCTION ++ ANSI-LOOP::LOOP-HACK-ITERATION + COMMON-LISP::ECHO-STREAM-OUTPUT-STREAM +- SYSTEM::FIND-DOCUMENTATION SYSTEM::INFO-GET-FILE +- SLOOP::PARSE-NO-BODY COMMON-LISP::FILE-NAMESTRING +- COMMON-LISP::COMPILER-MACRO-FUNCTION SYSTEM::PROCESS-ARGS +- ANSI-LOOP::LOOP-COLLECTOR-DTYPE COMMON-LISP::PHASE +- SYSTEM::MAKE-FRAME SYSTEM::INSTREAM-STREAM +- ANSI-LOOP::LOOP-COLLECTOR-HISTORY SYSTEM::FIX-LOAD-PATH +- SYSTEM::COMPUTING-ARGS-P +- ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE COMMON-LISP::TENTH +- ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::WILD-NAMESTRING-P +- SYSTEM::BEST-ARRAY-ELEMENT-TYPE SYSTEM::DM-BAD-KEY +- SYSTEM::TERMINAL-INTERRUPT SYSTEM::REGEXP-CONV +- COMMON-LISP::FILE-WRITE-DATE SLOOP::PARSE-LOOP +- ANSI-LOOP::LOOP-CONSTRUCT-RETURN SYSTEM::DWIM ++ SYSTEM::DIRECTORY-LIST-CHECK COMMON-LISP::FILE-WRITE-DATE ++ SYSTEM::NORMALIZE-TYPE COMMON-LISP::EIGHTH SYSTEM::TOGGLE-CASE ++ SYSTEM::SHOW-ENVIRONMENT ++ COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM SYSTEM::GET-PATH ++ COMMON-LISP::ASINH SYSTEM::FIND-KCL-TOP-RESTART ++ SYSTEM::RESTART-P SYSTEM::EVAL-FEATURE SYSTEM::ALOAD ++ COMMON-LISP::PHASE SLOOP::SUBSTITUTE-SLOOP-BODY ++ COMMON-LISP::ASIN SYSTEM::NODES-FROM-INDEX ++ SYSTEM::MAKE-DEFPACKAGE-FORM ANSI-LOOP::LOOP-COLLECTOR-DTYPE ++ SYSTEM::LOGICAL-PATHNAMEP SYSTEM::INSPECT-VECTOR + ANSI-LOOP::LOOP-UNIVERSE-TYPE-KEYWORDS +- SLOOP::RETURN-SLOOP-MACRO SLOOP::AVERAGING-SLOOP-MACRO +- SYSTEM::S-DATA-NAME SYSTEM::CHECK-TRACE-SPEC +- SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE SLOOP::TRANSLATE-NAME +- SYSTEM::ADD-TO-HOTLIST SYSTEM::S-DATA-CONC-NAME +- ANSI-LOOP::LOOP-MINIMAX-TYPE SYSTEM::PRINT-IHS +- SYSTEM::DBL-RPL-LOOP SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY +- SYSTEM::INSPECT-CONS SYSTEM::INSTREAM-STREAM-NAME +- SYSTEM::S-DATA-P SYSTEM::EVAL-FEATURE +- COMMON-LISP::ARRAY-DIMENSIONS SYSTEM::IHS-VISIBLE +- ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE +- SYSTEM::CHECK-DECLARATIONS COMMON-LISP::TANH +- ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS +- COMMON-LISP::COMPILE-FILE-PATHNAME SYSTEM::INSPECT-PACKAGE +- SLOOP::LOOP-LET-BINDINGS COMMON-LISP::CIS SYSTEM::SETUP-INFO +- SYSTEM::NORMALIZE-TYPE ANSI-LOOP::LOOP-PSEUDO-BODY +- SYSTEM::PATH-STREAM-NAME SYSTEM::INFO-GET-TAGS FPE::ST-LOOKUP +- SYSTEM::BREAK-BACKWARD-SEARCH-STACK +- ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE SYSTEM::SIMPLE-ARRAY-P +- SYSTEM::S-DATA-TYPE COMMON-LISP::CONCATENATED-STREAM-STREAMS +- SYSTEM::INSPECT-CHARACTER ANSI-LOOP::DESTRUCTURING-SIZE +- SYSTEM::GET-BYTE-STREAM-NCHARS ANSI-LOOP::LOOP-PATH-P +- COMMON-LISP::FIRST COMMON-LISP::SECOND +- COMMON-LISP::TWO-WAY-STREAM-INPUT-STREAM +- SYSTEM::MAKE-DEFPACKAGE-FORM SYSTEM::INSPECT-SYMBOL +- SYSTEM::INSPECT-VECTOR +- COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS +- SYSTEM::RESTART-INTERACTIVE-FUNCTION SYSTEM::INSPECT-STRING +- SYSTEM::DIR-P ANSI-LOOP::LOOP-COLLECTOR-CLASS +- SYSTEM::S-DATA-CONSTRUCTORS SYSTEM::NODES-FROM-INDEX +- SYSTEM::VERSION-PARSE SYSTEM::BKPT-FILE-LINE COMMON-LISP::ABS +- SYSTEM::IHS-FNAME ANSI-LOOP::LOOP-MAKE-PSETQ +- SYSTEM::LEAP-YEAR-P ANSI-LOOP::LOOP-EMIT-FINAL-VALUE +- SYSTEM::GET-PATH SYSTEM::ALOAD SYSTEM::DM-KEY-NOT-ALLOWED +- SYSTEM::MAKE-KCL-TOP-RESTART SYSTEM::S-DATA-SLOT-DESCRIPTIONS +- COMMON-LISP::VECTOR-POP ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS +- ANSI-LOOP::LOOP-PATH-USER-DATA SYSTEM::S-DATA-SLOT-POSITION +- COMMON-LISP::BROADCAST-STREAM-STREAMS +- SYSTEM::LOGICAL-PATHNAMEP SYSTEM::BREAK-FORWARD-SEARCH-STACK +- SLOOP::SLOOP-SLOOP-MACRO COMMON-LISP::SIGNUM +- SYSTEM::RESET-TRACE-DECLARATIONS SYSTEM::CONTEXT-P +- SYSTEM::S-DATA-FROZEN SYSTEM::NUMBER-OF-DAYS-FROM-1900 +- SYSTEM::S-DATA-STATICP ANSI-LOOP::LOOP-PATH-FUNCTION +- SYSTEM::KNOWN-TYPE-P COMMON-LISP::PROVIDE SYSTEM::PNL1 +- ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD +- SYSTEM::COERCE-SLASH-TERMINATED COMMON-LISP::LOGICAL-PATHNAME +- SYSTEM::DIR-CONJ SYSTEM::BKPT-FORM +- SYSTEM::LOGICAL-PATHNAME-HOST-P SYSTEM::INSPECT-STRUCTURE +- ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED +- COMMON-LISP::FIND-ALL-SYMBOLS ++ SYSTEM::RESTART-REPORT-FUNCTION SYSTEM::IHS-VISIBLE ++ SLOOP::LOOP-COLLECT-KEYWORD-P ANSI-LOOP::LOOP-TYPED-INIT ++ COMMON-LISP::VECTOR-POP SYSTEM::UNIQUE-ID + ANSI-LOOP::LOOP-UNIVERSE-ITERATION-KEYWORDS +- ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED ++ SYSTEM::SIMPLE-ARRAY-P COMMON-LISP::ACOS SYSTEM::DBL-EVAL ++ SYSTEM::INSPECT-STRING SYSTEM::MLP ++ SYSTEM::INSTREAM-STREAM-NAME SYSTEM::WILD-NAMESTRING-P ++ ANSI-LOOP::LOOP-PATH-FUNCTION ++ SYSTEM::GET-STRING-INPUT-STREAM-INDEX ++ ANSI-LOOP::LOOP-MINIMAX-TEMP-VARIABLE SYSTEM::SEQTYPE ++ ANSI-LOOP::LOOP-UNIVERSE-KEYWORDS ++ SYSTEM::BEST-ARRAY-ELEMENT-TYPE ++ ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA SYSTEM::S-DATA-FROZEN ++ SYSTEM::S-DATA-DOCUMENTATION SYSTEM::DWIM COMMON-LISP::SIGNUM ++ SYSTEM::FIND-DOCUMENTATION ANSI-LOOP::LOOP-COLLECTOR-HISTORY ++ ANSI-LOOP::LOOP-MAKE-PSETQ FPE::GREF SYSTEM::S-DATA-OFFSET ++ SYSTEM::WILD-PATH-ELEMENT-P SYSTEM::INSTREAM-P ++ COMMON-LISP::DIRECTORY-NAMESTRING SYSTEM::INSPECT-ARRAY ++ COMMON-LISP::ARRAY-DIMENSIONS ++ ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS ANSI-LOOP::LOOP-MINIMAX-P ++ SLOOP::RETURN-SLOOP-MACRO SYSTEM::WALK-THROUGH ++ SYSTEM::NEXT-STACK-FRAME SYSTEM::S-DATA-NAME COMMON-LISP::TANH ++ SYSTEM::BREAK-BACKWARD-SEARCH-STACK COMMON-LISP::TENTH ++ SYSTEM::INFO-NODE-FROM-POSITION FPE::ST-LOOKUP ++ COMMON-LISP::RESTART-NAME SYSTEM::S-DATA-TYPE ++ SYSTEM::BKPT-FILE-LINE COMMON-LISP::FIND-ALL-SYMBOLS ++ COMMON-LISP::FIFTH SLOOP::LOOP-LET-BINDINGS ++ COMMON-LISP::ECHO-STREAM-INPUT-STREAM ++ ANSI-LOOP::LOOP-UNIVERSE-IMPLICIT-FOR-REQUIRED ++ COMMON-LISP::PROBE-FILE SYSTEM::MAKE-FRAME ++ SYSTEM::IHS-NOT-INTERPRETED-ENV SYSTEM::SEARCH-STACK ++ COMMON-LISP::COMPILE-FILE-PATHNAME ++ SYSTEM::PRINT-SYMBOL-APROPOS COMMON-LISP::LOGNOT ++ SYSTEM::INFO-GET-TAGS SYSTEM::SHORT-NAME ++ ANSI-LOOP::LOOP-MINIMAX-TYPE COMMON-LISP::SIXTH ++ COMMON-LISP::SECOND ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS ++ COMMON-LISP::TWO-WAY-STREAM-OUTPUT-STREAM ++ SYSTEM::S-DATA-INCLUDES SYSTEM::RESTART-INTERACTIVE-FUNCTION ++ SLOOP::TRANSLATE-NAME SYSTEM::PATCH-SHARP COMMON-LISP::ABS ++ ANSI-LOOP::LOOP-CONSTANTP SYSTEM::LEAP-YEAR-P ++ ANSI-LOOP::LOOP-UNIVERSE-ANSI ANSI-LOOP::LOOP-EMIT-BODY ++ COMMON-LISP::HOST-NAMESTRING COMMON-LISP::FIRST ++ SYSTEM::INSERT-BREAK-POINT ++ COMMON-LISP::LOAD-LOGICAL-PATHNAME-TRANSLATIONS ++ COMMON-LISP::DELETE-FILE ANSI-LOOP::LOOP-PSEUDO-BODY ++ SYSTEM::GET-NEXT-VISIBLE-FUN SYSTEM::S-DATA-HAS-HOLES ++ ANSI-LOOP::LOOP-COLLECTOR-NAME COMMON-LISP::FOURTH ++ SYSTEM::BKPT-FILE SYSTEM::CANONICALIZE-PATHNAME-DIRECTORY ++ SYSTEM::INSTREAM-STREAM SYSTEM::PNL1 SYSTEM::IHS-FNAME ++ SYSTEM::S-DATA-SLOT-POSITION SLOOP::PARSE-LOOP ++ SYSTEM::CHECK-TRACE-SPEC SYSTEM::S-DATA-CONSTRUCTORS ++ SYSTEM::S-DATA-STATICP SYSTEM::CONTEXT-P + COMMON-LISP::LOGICAL-PATHNAME-TRANSLATIONS +- SYSTEM::TRACE-ONE-PREPROCESS COMMON-LISP::CONSTANTLY +- COMMON-LISP::ACOS SYSTEM::S-DATA-OFFSET COMMON-LISP::ASINH +- SYSTEM::SHORT-NAME SYSTEM::S-DATA-INCLUDED SYSTEM::DBL-EVAL +- SYSTEM::BKPT-FUNCTION SYSTEM::INSPECT-NUMBER +- SYSTEM::GET-INSTREAM SYSTEM::SHOW-BREAK-POINT FPE::LOOKUP +- SYSTEM::NEXT-STACK-FRAME SYSTEM::INSPECT-ARRAY +- SYSTEM::S-DATA-RAW ANSI-LOOP::LOOP-MINIMAX-INFINITY-DATA +- SYSTEM::RESTART-REPORT-FUNCTION SYSTEM::TOGGLE-CASE +- SYSTEM::NODE-OFFSET SYSTEM::INSTREAM-P +- ANSI-LOOP::LOOP-PATH-NAMES SYSTEM::FREEZE-DEFSTRUCT +- COMMON-LISP::SEVENTH SYSTEM::SEARCH-STACK COMMON-LISP::SIXTH +- ANSI-LOOP::LOOP-UNIVERSE-TYPE-SYMBOLS FPE::GREF +- FPE::XMM-LOOKUP COMMON-LISP::HOST-NAMESTRING +- ANSI-LOOP::LOOP-TYPED-INIT ++ SYSTEM::INFO-GET-FILE COMMON-LISP::COMPLEMENT ++ SYSTEM::INSPECT-NUMBER SYSTEM::RESET-TRACE-DECLARATIONS ++ ANSI-LOOP::LOOP-PATH-P SLOOP::REPEAT-SLOOP-MACRO SYSTEM::DO-F ++ SYSTEM::INSPECT-PACKAGE SYSTEM::PATH-STREAM-NAME ++ SYSTEM::GET-INSTREAM COMMON-LISP::BYTE-SIZE ++ SYSTEM::RESTART-FUNCTION FPE::LOOKUP SYSTEM::S-DATA-CONC-NAME ++ COMMON-LISP::PROVIDE SYSTEM::S-DATA-NAMED SYSTEM::PRINT-FRS ++ ANSI-LOOP::LOOP-MINIMAX-ANSWER-VARIABLE SYSTEM::NODE-OFFSET ++ ANSI-LOOP::MAKE-ANSI-LOOP-UNIVERSE SYSTEM::PRINT-IHS ++ ANSI-LOOP::LOOP-UNIVERSE-PATH-KEYWORDS COMMON-LISP::TRUENAME ++ SYSTEM::BREAK-FORWARD-SEARCH-STACK ++ COMMON-LISP::CONCATENATED-STREAM-STREAMS SYSTEM::VERSION-PARSE ++ SYSTEM::INSPECT-CHARACTER SYSTEM::LOGICAL-PATHNAME-HOST-P ++ SYSTEM::DM-BAD-KEY SYSTEM::EXPAND-HOME-DIR ++ ANSI-LOOP::LOOP-PATH-USER-DATA ++ ANSI-LOOP::LOOP-PATH-PREPOSITION-GROUPS SYSTEM::INSPECT-SYMBOL ++ COMMON-LISP::INVOKE-DEBUGGER + SYSTEM::LOGICAL-PATHNAME-DESIGNATOR-P +- ANSI-LOOP::LOOP-DO-THEREIS COMMON-LISP::EIGHTH +- SYSTEM::UNIQUE-ID COMMON-LISP::THIRD +- COMMON-LISP::BYTE-POSITION COMMON-LISP::SYNONYM-STREAM-SYMBOL +- SYSTEM::PATCH-SHARP SYSTEM::PRINT-SYMBOL-APROPOS +- COMMON-LISP::LOGNOT SLOOP::REPEAT-SLOOP-MACRO +- COMMON-LISP::FOURTH SLOOP::SUBSTITUTE-SLOOP-BODY +- COMMON-LISP::ATANH SLOOP::LOOP-COLLECT-KEYWORD-P +- SYSTEM::SEQTYPE SYSTEM::RE-QUOTE-STRING COMMON-LISP::ISQRT +- SYSTEM::DO-F SYSTEM::S-DATA-HAS-HOLES +- ANSI-LOOP::LOOP-HACK-ITERATION ANSI-LOOP::LOOP-COLLECTOR-NAME +- COMMON-LISP::RESTART-NAME COMMON-LISP::DIRECTORY-NAMESTRING +- ANSI-LOOP::LOOP-EMIT-BODY COMMON-LISP::ACOSH +- SYSTEM::RESTART-FUNCTION SYSTEM::INFO-NODE-FROM-POSITION +- COMMON-LISP::ASIN ANSI-LOOP::LOOP-LIST-COLLECTION +- SYSTEM::S-DATA-INCLUDES SYSTEM::GET-NEXT-VISIBLE-FUN +- COMMON-LISP::BYTE-SIZE COMMON-LISP::PATHNAME +- ANSI-LOOP::LOOP-MINIMAX-P SLOOP::PARSE-LOOP-INITIALLY +- COMMON-LISP::COSH SYSTEM::EXPAND-HOME-DIR +- COMMON-LISP::ECHO-STREAM-INPUT-STREAM +- SYSTEM::INSERT-BREAK-POINT SYSTEM::RESTART-TEST-FUNCTION +- SYSTEM::S-DATA-PRINT-FUNCTION SYSTEM::WILD-DIR-ELEMENT-P +- SYSTEM::S-DATA-NAMED COMMON-LISP::INVOKE-DEBUGGER +- COMMON-LISP::NAMESTRING ANSI-LOOP::LOOP-MAKE-DESETQ +- COMMON-LISP::COMPLEMENT SYSTEM::WALK-THROUGH +- COMMON-LISP::RATIONAL ANSI-LOOP::LOOP-MAXMIN-COLLECTION +- COMMON-LISP::DELETE-FILE ANSI-LOOP::LOOP-COLLECTOR-TEMPVARS)) ++ COMMON-LISP::BYTE-POSITION COMMON-LISP::ISQRT COMMON-LISP::CIS ++ ANSI-LOOP::LOOP-COLLECTOR-CLASS ++ COMMON-LISP::SYNONYM-STREAM-SYMBOL ANSI-LOOP::LOOP-PATH-NAMES ++ SYSTEM::RE-QUOTE-STRING SYSTEM::INSPECT-STRUCTURE ++ COMMON-LISP::RATIONAL FPE::XMM-LOOKUP ++ SYSTEM::REWRITE-RESTART-CASE-CLAUSE ++ SYSTEM::S-DATA-PRINT-FUNCTION ++ SYSTEM::RESTRICT-STREAM-ELEMENT-TYPE SLOOP::SLOOP-SLOOP-MACRO ++ COMMON-LISP::NAMESTRING SYSTEM::ENSURE-DIR-STRING ++ COMMON-LISP::CONSTANTLY SLOOP::PARSE-LOOP-INITIALLY ++ SYSTEM::S-DATA-RAW SYSTEM::ADD-TO-HOTLIST SYSTEM::FRS-KIND ++ ANSI-LOOP::LOOP-MAXMIN-COLLECTION ++ ANSI-LOOP::LOOP-COLLECTOR-DATA SYSTEM::PROCESS-ARGS ++ SYSTEM::COERCE-SLASH-TERMINATED SYSTEM::MAKE-KCL-TOP-RESTART ++ COMMON-LISP::ATANH ANSI-LOOP::LOOP-CODE-DUPLICATION-THRESHOLD ++ COMMON-LISP::SINH ANSI-LOOP::LOOP-UNIVERSE-P ++ ANSI-LOOP::LOOP-PATH-INCLUSIVE-PERMITTED ++ SYSTEM::S-DATA-INCLUDED COMMON-LISP::STREAM-EXTERNAL-FORMAT ++ SYSTEM::COMPUTING-ARGS-P SYSTEM::REAL-ASINH ++ ANSI-LOOP::LOOP-CONSTRUCT-RETURN ++ SYSTEM::S-DATA-SLOT-DESCRIPTIONS SYSTEM::FIX-LOAD-PATH ++ SYSTEM::CHECK-DECLARATIONS ++ ANSI-LOOP::LOOP-UNIVERSE-FOR-KEYWORDS ++ SLOOP::POINTER-FOR-COLLECT COMMON-LISP::LOGICAL-PATHNAME ++ SYSTEM::CHDIR SYSTEM::IDESCRIBE ++ ANSI-LOOP::LOOP-MINIMAX-OPERATIONS COMMON-LISP::ACOSH ++ COMMON-LISP::NINTH ANSI-LOOP::LOOP-MINIMAX-FLAG-VARIABLE ++ ANSI-LOOP::LOOP-COLLECTOR-P SYSTEM::S-DATA-P SYSTEM::BKPT-FORM ++ COMMON-LISP::FILE-NAMESTRING SYSTEM::TERMINAL-INTERRUPT ++ SYSTEM::SETUP-INFO SLOOP::PARSE-NO-BODY ++ SYSTEM::DM-KEY-NOT-ALLOWED ANSI-LOOP::LOOP-EMIT-FINAL-VALUE ++ SYSTEM::FREEZE-DEFSTRUCT SYSTEM::DBL-RPL-LOOP ++ SYSTEM::TRACE-ONE-PREPROCESS ++ COMMON-LISP::BROADCAST-STREAM-STREAMS COMMON-LISP::THIRD ++ SLOOP::AVERAGING-SLOOP-MACRO SYSTEM::SHOW-BREAK-POINT ++ COMMON-LISP::PATHNAME ANSI-LOOP::LOOP-DO-THEREIS ++ COMMON-LISP::FILE-AUTHOR ANSI-LOOP::LOOP-MAKE-DESETQ ++ SYSTEM::NC SYSTEM::NUMBER-OF-DAYS-FROM-1900 ++ SYSTEM::RESTART-TEST-FUNCTION SYSTEM::WHICH ++ ANSI-LOOP::DESTRUCTURING-SIZE COMMON-LISP::FILE-LENGTH)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- SYSTEM::BREAK-QUIT SYSTEM::BREAK-BDS SYSTEM::DBL-BACKTRACE +- SYSTEM::BREAK-LOCAL SYSTEM::INFO-ERROR +- SYSTEM::SHOW-BREAK-VARIABLES SYSTEM::BREAK-VS +- COMMON-LISP::CONTINUE COMMON-LISP::MUFFLE-WARNING +- SYSTEM::IHS-BACKTRACE ANSI-LOOP::LOOP-OPTIONAL-TYPE +- SYSTEM::BREAK-PREVIOUS SYSTEM::BREAK-NEXT)) ++ SYSTEM::BREAK-VS ANSI-LOOP::LOOP-OPTIONAL-TYPE ++ SYSTEM::BREAK-BDS SYSTEM::IHS-BACKTRACE SYSTEM::INFO-ERROR ++ SYSTEM::BREAK-LOCAL SYSTEM::SHOW-BREAK-VARIABLES ++ COMMON-LISP::MUFFLE-WARNING SYSTEM::BREAK-PREVIOUS ++ SYSTEM::BREAK-QUIT SYSTEM::DBL-BACKTRACE COMMON-LISP::CONTINUE ++ SYSTEM::BREAK-NEXT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ SYSTEM::MAKE-KEYWORD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807) +- COMMON-LISP::T) ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- SYSTEM::SMALLNTHCDR)) ++ SYSTEM::QUICK-SORT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- COMMON-LISP::HASH-TABLE) +- SYSTEM::CONTEXT-SPICE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::BIGNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP SYSTEM::INSTREAM-LINE +- SYSTEM::S-DATA-LENGTH SYSTEM::THE-START)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ COMMON-LISP::FIND-RESTART COMMON-LISP::PATHNAME-HOST ++ SYSTEM::LINK-EXPAND COMMON-LISP::CONCATENATE COMMON-LISP::WARN ++ COMMON-LISP::FILE-POSITION ANSI-LOOP::LOOP-WARN ++ COMMON-LISP::PATHNAME-DIRECTORY COMMON-LISP::SBIT ++ COMMON-LISP::BIT ANSI-LOOP::LOOP-COLLECT-PREPOSITIONAL-PHRASES ++ COMMON-LISP::PATHNAME-TYPE COMMON-LISP::MAKE-ARRAY ++ ANSI-LOOP::LOOP-ERROR COMMON-LISP::DIRECTORY SYSTEM::DIR-PARSE ++ COMMON-LISP::TRANSLATE-LOGICAL-PATHNAME ++ SYSTEM::NTH-STACK-FRAME COMMON-LISP::REQUIRE COMMON-LISP::LOAD ++ SYSTEM::MGLIST COMMON-LISP::DELETE-DUPLICATES ++ COMMON-LISP::PATHNAME-VERSION COMMON-LISP::ENOUGH-NAMESTRING ++ SYSTEM::BAD-SEQ-LIMIT COMMON-LISP::REMOVE-DUPLICATES ++ COMMON-LISP::PATHNAME-NAME ++ COMMON-LISP::MAKE-STRING-INPUT-STREAM SLOOP::LOOP-ADD-TEMPS ++ SYSTEM::NLOAD SYSTEM::LIST-MATCHES ++ COMMON-LISP::ARRAY-ROW-MAJOR-INDEX ++ COMMON-LISP::ARRAY-IN-BOUNDS-P SYSTEM::BREAK-LEVEL ++ SYSTEM::PROCESS-SOME-ARGS SYSTEM::TO-REGEXP ++ COMMON-LISP::UPGRADED-ARRAY-ELEMENT-TYPE COMMON-LISP::OPEN ++ SYSTEM::FILE-SEARCH COMMON-LISP::READ-BYTE ++ SYSTEM::FILE-TO-STRING SLOOP::ADD-FROM-DATA COMMON-LISP::ERROR ++ COMMON-LISP::SIGNAL SYSTEM::MGSUB COMMON-LISP::WILD-PATHNAME-P ++ COMMON-LISP::PATHNAME-DEVICE SYSTEM::LOGICAL-PATHNAME-PARSE ++ COMMON-LISP::MERGE-PATHNAMES SYSTEM::INFO-SEARCH ++ COMMON-LISP::BIT-NOT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) +- SYSTEM::MATCH-BEGINNING SYSTEM::MATCH-END)) +-(COMMON-LISP::MAPC +- (COMMON-LISP::LAMBDA (COMPILER::X) +- (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) +- COMMON-LISP::T)) +- '(SYSTEM::CONDITION-CLASS-P SYSTEM::WARNINGP SYSTEM::SI-CLASS-OF +- SYSTEM::SI-FIND-CLASS SYSTEM::DEFINE-STRUCTURE +- FPE::BREAK-ON-FLOATING-POINT-EXCEPTIONS +- SYSTEM::SIMPLE-CONDITION-CLASS-P SYSTEM::AUTOLOAD +- SYSTEM::SI-CLASS-PRECEDENCE-LIST SYSTEM::SI-CLASS-NAME +- SYSTEM::TRACE-ONE SYSTEM::MAKE-ACCESS-FUNCTION +- SYSTEM::UNTRACE-ONE SYSTEM::SI-CLASSP SYSTEM::CONDITIONP +- SYSTEM::AUTOLOAD-MACRO)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ ANSI-LOOP::ESTIMATE-CODE-SIZE-1 SYSTEM::DO-REPL ++ SYSTEM::SOURCE-PORTION SYSTEM::RESTART-REPORT ++ SYSTEM::NEW-SEMI-COLON-READER SYSTEM::FIND-DOC ++ ANSI-LOOP::ESTIMATE-CODE-SIZE SYSTEM::NEWLINE ++ COMMON-LISP::RENAME-FILE SYSTEM::LIST-TOGGLE-CASE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::INTEGER -9223372036854775808 +- 9223372036854775807)) +- COMMON-LISP::T) +- SYSTEM::GET-CONTEXT SYSTEM::PUSH-CONTEXT)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ COMMON-LISP::REDUCE COMMON-LISP::STABLE-SORT ++ SYSTEM::PARSE-BODY SLOOP::FIND-IN-ORDERED-LIST ++ COMMON-LISP::SUBTYPEP COMMON-LISP::SORT)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- SYSTEM::RELATIVE-LINE SYSTEM::LENEL SYSTEM::THE-END +- ANSI-LOOP::DUPLICATABLE-CODE-P SYSTEM::FASLINK +- SYSTEM::GET-NODE-INDEX)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::LIST-MERGE-SORT ANSI-LOOP::LOOP-GET-COLLECTION-INFO ++ SYSTEM::SHARP---READER SYSTEM::SHARP-S-READER ++ SYSTEM::VERIFY-KEYWORDS SYSTEM::RESTART-PRINT ++ SYSTEM::SHARP-+-READER SYSTEM::READ-INSPECT-COMMAND)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- SLOOP::PARSE-ONE-WHEN-CLAUSE ANSI-LOOP::LOOP-DO-FINALLY +- SLOOP::LOOP-PEEK ANSI-LOOP::LOOP-DO-INITIALLY SLOOP::LOOP-POP +- ANSI-LOOP::LOOP-GET-PROGN SYSTEM::KCL-TOP-RESTARTS +- SYSTEM::INSPECT-READ-LINE SLOOP::PARSE-LOOP-WHEN +- ANSI-LOOP::LOOP-GET-FORM SYSTEM::DEFAULT-SYSTEM-BANNER +- SYSTEM::SET-UP-TOP-LEVEL SYSTEM::GET-INDEX-NODE +- ANSI-LOOP::LOOP-DO-DO ANSI-LOOP::LOOP-WHEN-IT-VARIABLE +- SYSTEM::SETUP-LINEINFO COMMON-LISP::TYPE-ERROR +- SYSTEM::READ-EVALUATED-FORM SYSTEM::INSPECT-INDENT-1 +- SLOOP::LOOP-UN-POP SLOOP::PARSE-LOOP-DO +- ANSI-LOOP::LOOP-DO-WITH SYSTEM::INSPECT-INDENT +- SYSTEM::GET-TEMP-DIR ANSI-LOOP::LOOP-ITERATION-DRIVER +- SYSTEM::WINE-TMP-REDIRECT SLOOP::PARSE-LOOP-COLLECT +- SYSTEM::DEFAULT-INFO-HOTLIST SLOOP::PARSE-LOOP1 +- SYSTEM::CLEANUP ANSI-LOOP::LOOP-DO-NAMED SYSTEM::DBL +- SYSTEM::ALL-TRACE-DECLARATIONS SYSTEM::TEST-ERROR +- ANSI-LOOP::LOOP-BIND-BLOCK ANSI-LOOP::LOOP-DO-REPEAT +- SYSTEM::ILLEGAL-BOA SYSTEM::SET-ENV SYSTEM::SET-CURRENT +- SYSTEM::INIT-BREAK-POINTS SYSTEM::GET-SIG-FN-NAME +- ANSI-LOOP::LOOP-DO-RETURN ANSI-LOOP::LOOP-CONTEXT +- SYSTEM::SHOW-RESTARTS SYSTEM::STEP-READ-LINE +- SLOOP::PARSE-LOOP-FOR SYSTEM::DM-TOO-MANY-ARGUMENTS +- COMMON-LISP::LISP-IMPLEMENTATION-VERSION SYSTEM::TOP-LEVEL +- ANSI-LOOP::LOOP-POP-SOURCE SYSTEM::DM-TOO-FEW-ARGUMENTS)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::PUSH-OPTIONAL-BINDING)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- ((COMMON-LISP::VECTOR COMMON-LISP::CHARACTER +- COMMON-LISP::*)) +- COMMON-LISP::T) +- SYSTEM::RESET-SYS-PATHS)) ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::TRACE-CALL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::VECTOR COMMON-LISP::T)) +- SYSTEM::CONTEXT-VEC)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::MASET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::EXPAND-WILD-DIRECTORY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ SYSTEM::PARSE-DEFMACRO SYSTEM::PARSE-DEFMACRO-LAMBDA-LIST)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ SYSTEM::MME3)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ ((COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807) ++ COMMON-LISP::T) ++ COMMON-LISP::T) ++ SYSTEM::SMALLNTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- SYSTEM::BREAK-HELP SYSTEM::BREAK-MESSAGE +- SYSTEM::SIMPLE-BACKTRACE ANSI-LOOP::LOOP-DO-FOR +- SYSTEM::BREAK-CURRENT SYSTEM::GCL-TOP-LEVEL +- SYSTEM::BREAK-RESUME)) +\ No newline at end of file ++ SYSTEM::GCL-TOP-LEVEL SYSTEM::BREAK-MESSAGE ++ SYSTEM::BREAK-RESUME SYSTEM::SIMPLE-BACKTRACE ++ SYSTEM::BREAK-HELP ANSI-LOOP::LOOP-DO-FOR ++ SYSTEM::BREAK-CURRENT)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ SYSTEM::S-DATA-LENGTH SYSTEM::THE-START SYSTEM::INSTREAM-LINE ++ SYSTEM::S-DATA-SIZE FPE::REG-LOOKUP)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ SYSTEM::MATCH-BEGINNING SYSTEM::MATCH-END)) +\ No newline at end of file +--- gcl-2.6.12.orig/o/fasdump.c ++++ gcl-2.6.12/o/fasdump.c +@@ -598,7 +598,7 @@ DEFUN_NEW("OPEN-FASD",object,fSopen_fasd + if(tabl==Cnil) tabl=funcall_cfun(Lmake_hash_table,2,sKtest,sLeq); + else + check_type(tabl,t_hashtable);} +- check_type(str,t_stream); ++ massert(str==stream); + result=alloc_simple_vector(sizeof(struct fasd)/sizeof(int),aet_object); + array_allocself(result,1,Cnil); + {struct fasd *fd= (struct fasd *)result->v.v_self; +@@ -608,7 +608,7 @@ DEFUN_NEW("OPEN-FASD",object,fSopen_fasd + fd->eof=eof; + fd->index=small_fixnum(0); + fd->package=symbol_value(sLApackageA); +- fd->filepos = make_fixnum(file_position(stream)); ++ fd->filepos = make_fixnum(ftell(stream->sm.sm_fp)); + + SETUP_FASD_IN(fd); + if (direction==sKoutput){ +@@ -649,13 +649,13 @@ DEFUN_NEW("CLOSE-FASD",object,fSclose_fa + {clrhash(fd->table); + SETUP_FASD_IN(fd); + PUT_OP(d_end_of_file); +- {int i = file_position(fd->stream); ++ {int i = ftell(fd->stream->sm.sm_fp); + if(type_of(fd->filepos) == t_fixnum) +- { file_position_set(fd->stream,fix(fd->filepos) +2); ++ { fseek(fd->stream->sm.sm_fp,fix(fd->filepos)+2,SEEK_SET); + /* record the length of array needed to read the indices */ + PUT4(fix(fd->index)); + /* move back to where we were */ +- file_position_set(fd->stream,i); ++ fseek(fd->stream->sm.sm_fp,i,SEEK_SET); + }} + + } +--- gcl-2.6.12.orig/o/file.d ++++ gcl-2.6.12/o/file.d +@@ -167,7 +167,6 @@ BEGIN: + case smm_probe: + return(FALSE); + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -224,7 +223,6 @@ BEGIN: + case smm_probe: + return(FALSE); + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -272,7 +270,6 @@ BEGIN: + case smm_socket: + return (sLcharacter); + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -440,7 +437,7 @@ open_stream(object fn,enum smmode smm, o + x->sm.sm_buffer = 0; + x->sm.sm_object0 = sLcharacter; + x->sm.sm_object1 = vs_head; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_int = 0; + x->sm.sm_flags=0; + vs_push(x); + +@@ -522,8 +519,6 @@ DEFUN_NEW("OPEN-STREAM-P",object,fLopen_ + void + close_stream(object strm) { + +- object x; +- + if (FFN(fLopen_stream_p)(strm)==Cnil) + return; + +@@ -569,24 +564,15 @@ close_stream(object strm) { + strm->sm.sm_fd = -1; + break; + +- case smm_file_synonym: + case smm_synonym: +- strm = symbol_value(strm->sm.sm_object0); +- if (type_of(strm) != t_stream) +- TYPE_ERROR(strm,sLstream); +- close_stream(strm); + break; + + case smm_broadcast: + case smm_concatenated: +- for (x = strm->sm.sm_object0; !endp(x); x = x->c.c_cdr) +- close_stream(x->c.c_car); + break; + + case smm_two_way: + case smm_echo: +- close_stream(STREAM_INPUT_STREAM(strm)); +- close_stream(STREAM_OUTPUT_STREAM(strm)); + break; + + case smm_string_input: +@@ -616,7 +602,6 @@ DEFUN_NEW("INTERACTIVE-STREAM-P",object, + return Ct; + return Cnil; + break; +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -656,7 +641,7 @@ object istrm, ostrm; + strm->sm.sm_buffer = 0; + STREAM_INPUT_STREAM(strm) = istrm; + STREAM_OUTPUT_STREAM(strm) = ostrm; +- strm->sm.sm_int0 = strm->sm.sm_int1 = 0; ++ strm->sm.sm_int = 0; + strm->sm.sm_flags=0; + return(strm); + } +@@ -672,24 +657,30 @@ object istrm, ostrm; + return(strm); + } + +-object +-make_string_input_stream(strng, istart, iend) +-object strng; +-int istart, iend; +-{ +- object strm; ++DEFUN_NEW("MAKE-STRING-INPUT-STREAM-INT",object,fSmake_string_input_stream_int,SI,3,3,NONE,OO,II,OO,OO, ++ (object strng,fixnum istart,fixnum iend),"") { ++ ++ object strm; ++ ++ strm = alloc_object(t_stream); ++ strm->sm.sm_mode = (short)smm_string_input; ++ strm->sm.sm_fp = NULL; ++ strm->sm.sm_buffer = 0; ++ STRING_STREAM_STRING(strm) = strng; ++ strm->sm.sm_object1 = OBJNULL; ++ STRING_INPUT_STREAM_NEXT(strm)= istart; ++ STRING_INPUT_STREAM_END(strm)= iend; ++ strm->sm.sm_flags=0; ++ ++ RETURN1(strm); + +- strm = alloc_object(t_stream); +- strm->sm.sm_mode = (short)smm_string_input; +- strm->sm.sm_fp = NULL; +- strm->sm.sm_buffer = 0; +- STRING_STREAM_STRING(strm) = strng; +- strm->sm.sm_object1 = OBJNULL; +- STRING_INPUT_STREAM_NEXT(strm)= istart; +- STRING_INPUT_STREAM_END(strm)= iend; +- strm->sm.sm_flags=0; +- return(strm); + } ++#ifdef STATIC_FUNCTION_POINTERS ++object ++fSmake_string_input_stream_int(object x,fixnum y,fixnum z) { ++ return FFN(fSmake_string_input_stream_int)(x,y,z); ++} ++#endif + + DEFUN_NEW("STRING-INPUT-STREAM-P",object,fSstring_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + return type_of(x)==t_stream && x->sm.sm_mode == (short)smm_string_input ? Ct : Cnil; +@@ -722,7 +713,7 @@ int line_length; + strm->sm.sm_buffer = 0; + STRING_STREAM_STRING(strm) = strng; + strm->sm.sm_object1 = OBJNULL; +- strm->sm.sm_int0 = STREAM_FILE_COLUMN(strm) = 0; ++ strm->sm.sm_int = 0; + strm->sm.sm_flags=0; + vs_reset; + return(strm); +@@ -777,7 +768,6 @@ BEGIN: + /* strm->sm.sm_int0++; */ + return(c==EOF ? c : (c&0377)); + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -880,7 +870,6 @@ BEGIN: + /* --strm->sm.sm_int0; */ /* use ftell now for position */ + break; + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -982,7 +971,6 @@ BEGIN: + + break; + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1093,7 +1081,6 @@ BEGIN: + #endif + closed_stream(strm); + break; +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1182,7 +1169,6 @@ BEGIN: + case smm_probe: + return(FALSE); + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + check_stream(strm); +@@ -1308,7 +1294,6 @@ BEGIN: + #endif + return TRUE; + +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1345,136 +1330,6 @@ BEGIN: + } + + int +-file_position(strm) +-object strm; +-{ +-BEGIN: +- switch (strm->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_io: +- /* return(strm->sm.sm_int0); */ +- if (strm->sm.sm_fp == NULL) +- closed_stream(strm); +- return(ftell(strm->sm.sm_fp)); +- case smm_socket: +- return -1; +- +- +- case smm_string_output: +- return(STRING_STREAM_STRING(strm)->st.st_fillp); +- +- case smm_file_synonym: +- case smm_synonym: +- strm = symbol_value(strm->sm.sm_object0); +- if (type_of(strm) != t_stream) +- FEwrong_type_argument(sLstream, strm); +- goto BEGIN; +- +- case smm_probe: +- case smm_broadcast: +- case smm_concatenated: +- case smm_two_way: +- case smm_echo: +- case smm_string_input: +- return(-1); +- +- default: +- error("illegal stream mode"); +- return(-1); +- } +-} +- +-int +-file_position_set(strm, disp) +-object strm; +-int disp; +-{ +-BEGIN: +- switch (strm->sm.sm_mode) { +- case smm_socket: +- return -1; +- case smm_input: +- case smm_output: +- case smm_io: +- +- if (fseek(strm->sm.sm_fp, disp, 0) < 0) +- return(-1); +- /* strm->sm.sm_int0 = disp; */ +- return(0); +- +- case smm_string_output: +- if (disp < STRING_STREAM_STRING(strm)->st.st_fillp) { +- STRING_STREAM_STRING(strm)->st.st_fillp = disp; +- /* strm->sm.sm_int0 = disp; */ +- } else { +- disp -= STRING_STREAM_STRING(strm)->st.st_fillp; +- while (disp-- > 0) +- writec_stream(' ', strm); +- } +- return(0); +- +- case smm_file_synonym: +- case smm_synonym: +- strm = symbol_value(strm->sm.sm_object0); +- if (type_of(strm) != t_stream) +- FEwrong_type_argument(sLstream, strm); +- goto BEGIN; +- +- case smm_probe: +- case smm_broadcast: +- case smm_concatenated: +- case smm_two_way: +- case smm_echo: +- case smm_string_input: +- return(-1); +- +- default: +- error("illegal stream mode"); +- return(-1); +- } +-} +- +-static int +-file_length(strm) +-object strm; +-{ +-BEGIN: +- switch (strm->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_io: +- +- if (strm->sm.sm_fp == NULL) +- closed_stream(strm); +- return(file_len(strm->sm.sm_fp)); +- +- +- +- case smm_file_synonym: +- case smm_synonym: +- strm = symbol_value(strm->sm.sm_object0); +- if (type_of(strm) != t_stream) +- FEwrong_type_argument(sLstream, strm); +- goto BEGIN; +- +- case smm_socket: +- case smm_probe: +- case smm_broadcast: +- case smm_concatenated: +- case smm_two_way: +- case smm_echo: +- case smm_string_input: +- case smm_string_output: +- return(-1); +- +- default: +- error("illegal stream mode"); +- return(-1); +- } +-} +- +-int + file_column(object strm) { + int i; + object x; +@@ -1491,7 +1346,6 @@ BEGIN: + case smm_two_way: + strm=STREAM_OUTPUT_STREAM(strm); + goto BEGIN; +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -1558,22 +1412,6 @@ load(const char *s) { + + + +-static int +-file_synonym_stream_p(object x) { +- switch(x->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_io: +- case smm_probe: +- case smm_file_synonym: +- return 1; +- case smm_synonym: +- return file_synonym_stream_p(x->sm.sm_object0->s.s_dbind); +- default: +- return 0; +- } +-} +- + LFD(Lmake_synonym_stream)() + { + object x; +@@ -1581,12 +1419,12 @@ LFD(Lmake_synonym_stream)() + check_arg(1); + check_type_sym(&vs_base[0]); + x = alloc_object(t_stream); +- x->sm.sm_mode = file_synonym_stream_p(vs_base[0]) ? (short)smm_file_synonym : (short)smm_synonym; ++ x->sm.sm_mode = (short)smm_synonym; + x->sm.sm_fp = NULL; + x->sm.sm_buffer = 0; + x->sm.sm_object0 = vs_base[0]; + x->sm.sm_object1 = OBJNULL; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_int = 0; + x->sm.sm_flags=0; + vs_base[0] = x; + } +@@ -1610,7 +1448,7 @@ LFD(Lmake_broadcast_stream)() + x->sm.sm_buffer = 0; + x->sm.sm_object0 = vs_base[0]; + x->sm.sm_object1 = OBJNULL; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_int = 0; + x->sm.sm_flags=0; + vs_base[0] = x; + } +@@ -1634,7 +1472,7 @@ LFD(Lmake_concatenated_stream)() + x->sm.sm_buffer = 0; + x->sm.sm_object0 = vs_base[0]; + x->sm.sm_object1 = OBJNULL; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_int = 0; + x->sm.sm_flags=0; + vs_base[0] = x; + } +@@ -1667,32 +1505,6 @@ LFD(Lmake_echo_stream)() + vs_popp; + } + +-@(static defun make_string_input_stream (strng &o istart iend) +- int s, e; +-@ +- check_type_string(&strng); +- if (istart == Cnil) +- s = 0; +- else if (type_of(istart) != t_fixnum) +- goto E; +- else +- s = fix(istart); +- if (iend == Cnil) +- e = strng->st.st_fillp; +- else if (type_of(iend) != t_fixnum) +- goto E; +- else +- e = fix(iend); +- if (s < 0 || e > strng->st.st_fillp || s > e) +- goto E; +- @(return `make_string_input_stream(strng, s, e)`) +- +-E: +- FEerror("~S and ~S are illegal as :START and :END~%\ +-for the string ~S.", +- 3, istart, iend, strng); +-@) +- + @(static defun make_string_output_stream (&k element_type) + @ + element_type=Cnil;/*FIXME*/ +@@ -1724,12 +1536,29 @@ LFD(siLoutput_stream_string)() + vs_base[0] = vs_base[0]->sm.sm_object0; + } + ++object ++file_stream(object x) { ++ if (type_of(x)==t_stream) ++ switch(x->sm.sm_mode) { ++ case smm_input: ++ case smm_output: ++ case smm_io: ++ case smm_probe: ++ return x; ++ case smm_synonym: ++ return file_stream(x->sm.sm_object0->s.s_dbind); ++ default: ++ break; ++ } ++ return Cnil; ++} ++ + DEFUN_NEW("FILE-STREAM-P",object,fSfile_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +- RETURN1(type_of(x)==t_stream && file_synonym_stream_p(x) ? Ct : Cnil); ++ RETURN1(file_stream(x)!=Cnil ? Ct : Cnil); + } + + DEFUN_NEW("SYNONYM-STREAM-P",object,fSsynonym_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +- RETURN1(type_of(x)==t_stream && (x->sm.sm_mode==smm_file_synonym || x->sm.sm_mode==smm_synonym) ? Ct : Cnil); ++ RETURN1(type_of(x)==t_stream && x->sm.sm_mode==smm_synonym ? Ct : Cnil); + } + + DEFUN_NEW("TERMINAL-INPUT-STREAM-P",object,fSterminal_input_stream_p,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { +@@ -1802,43 +1631,6 @@ LFD(Lstream_element_type)() + @) + + +-@(defun file_position (file_stream &o position) +- int i=0; +-@ +- check_type_stream(&file_stream); +- if (position == Cnil) { +- i = file_position(file_stream); +- if (i < 0) +- @(return Cnil) +- @(return `make_fixnum(i)`) +- } else { +- if (position == sKstart) +- i = 0; +- else if (position == sKend) +- i = file_length(file_stream); +- else if (type_of(position) != t_fixnum || +- (i = fix((position))) < 0) +- FEerror("~S is an illegal file position~%\ +-for the file-stream ~S.", +- 2, position, file_stream); +- if (file_position_set(file_stream, i) < 0) +- @(return Cnil) +- @(return Ct) +- } +-@) +- +-LFD(Lfile_length)() +-{ +- int i; +- +- check_arg(1); +- check_type_stream(&vs_base[0]); +- i = file_length(vs_base[0]); +- if (i < 0) +- vs_base[0] = Cnil; +- else +- vs_base[0] = make_fixnum(i); +-} + + object sLAload_pathnameA; + DEFVAR("*COLLECT-BINARY-MODULES*",sSAcollect_binary_modulesA,SI,sLnil,""); +@@ -1911,17 +1703,6 @@ DEFUN_NEW("LOAD-FASL",object,fSload_fasl + + } + +-static void +-FFN(siLget_string_input_stream_index)() +-{ +- check_arg(1); +- check_type_stream(&vs_base[0]); +- if ((enum smmode)vs_base[0]->sm.sm_mode != smm_string_input) +- FEerror("~S is not a string-input stream.", 1, vs_base[0]); +- vs_base[0] = make_fixnum(STRING_INPUT_STREAM_NEXT(vs_base[0])); +-} +- +- + LFD(siLmake_string_output_stream_from_string)() + { + object strng, strm; +@@ -2042,7 +1823,6 @@ int out; + if (type_of(strm) != t_stream) + FEwrong_type_argument(sLstream, strm); + switch (strm->sm.sm_mode){ +- case smm_file_synonym: + case smm_synonym: + strm = symbol_value(strm->sm.sm_object0); + if (type_of(strm) != t_stream) +@@ -2203,7 +1983,7 @@ object async; + x->sm.sm_buffer = 0; + x->sm.sm_object0 = list(3,server,host,port); + x->sm.sm_object1 = 0; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; ++ x->sm.sm_int = 0; + x->sm.sm_flags=0; + SOCKET_STREAM_FD(x)= fd; + SET_STREAM_FLAG(x,mode,1); +@@ -2466,8 +2246,7 @@ gcl_init_file(void) + #ifdef UNIX + = make_simple_string("stdin"); + #endif +- standard_input->sm.sm_int0 = 0; /* unused */ +- standard_input->sm.sm_int1 = 0; /* unused */ ++ standard_input->sm.sm_int = 0; /* unused */ + standard_input->sm.sm_flags=0; + + standard_output = alloc_object(t_stream); +@@ -2479,8 +2258,7 @@ gcl_init_file(void) + #ifdef UNIX + = make_simple_string("stdout"); + #endif +- standard_output->sm.sm_int0 = 0; /* unused */ +- STREAM_FILE_COLUMN(standard_output) = 0; ++ standard_output->sm.sm_int = 0; /* unused */ + standard_output->sm.sm_flags=0; + + terminal_io = standard +@@ -2488,12 +2266,12 @@ gcl_init_file(void) + enter_mark_origin(&terminal_io); + + x = alloc_object(t_stream); +- x->sm.sm_mode = (short)smm_file_synonym; ++ x->sm.sm_mode = (short)smm_synonym; + x->sm.sm_fp = NULL; + x->sm.sm_buffer = 0; + x->sm.sm_object0 = sLAterminal_ioA; + x->sm.sm_object1 = OBJNULL; +- x->sm.sm_int0 = x->sm.sm_int1 = 0; /* unused */ ++ x->sm.sm_int = 0; /* unused */ + x->sm.sm_flags=0; + standard_io = x; + enter_mark_origin(&standard_io); +@@ -2561,8 +2339,6 @@ gcl_init_file_function() + Lmake_concatenated_stream); + make_function("MAKE-TWO-WAY-STREAM", Lmake_two_way_stream); + make_function("MAKE-ECHO-STREAM", Lmake_echo_stream); +- make_function("MAKE-STRING-INPUT-STREAM", +- Lmake_string_input_stream); + make_function("MAKE-STRING-OUTPUT-STREAM", + Lmake_string_output_stream); + make_function("GET-OUTPUT-STREAM-STRING", +@@ -2581,11 +2357,6 @@ gcl_init_file_function() + make_function("STREAM-ELEMENT-TYPE", Lstream_element_type); + make_function("CLOSE", Lclose); + +- make_function("FILE-POSITION", Lfile_position); +- make_function("FILE-LENGTH", Lfile_length); +- +- make_si_function("GET-STRING-INPUT-STREAM-INDEX", +- siLget_string_input_stream_index); + make_si_function("MAKE-STRING-OUTPUT-STREAM-FROM-STRING", + siLmake_string_output_stream_from_string); + make_si_function("COPY-STREAM", siLcopy_stream); +--- gcl-2.6.12.orig/o/gbc.c ++++ gcl-2.6.12/o/gbc.c +@@ -627,7 +627,6 @@ mark_object1(object x) { + } + break; + +- case smm_file_synonym: + case smm_synonym: + mark_object(x->sm.sm_object0); + break; +--- gcl-2.6.12.orig/o/pathname.d ++++ gcl-2.6.12/o/pathname.d +@@ -83,6 +83,11 @@ DEFUN_NEW("C-STREAM-OBJECT1",object,fSc_ + RETURN1(x->sm.sm_object1); + } + ++DEFUN_NEW("C-SET-STREAM-OBJECT0",object,fSc_set_stream_object0,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { ++ x->sm.sm_object0=y; ++ RETURN1(x); ++} ++ + DEFUN_NEW("C-SET-STREAM-OBJECT1",object,fSc_set_stream_object1,SI,2,2,NONE,OO,OO,OO,OO,(object x,object y),"") { + x->sm.sm_object1=y; + RETURN1(x); +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -1260,7 +1260,6 @@ int level; + write_ch('>'); + break; + +- case smm_file_synonym: + case smm_synonym: + write_str("#sm.sm_object0, level); +--- gcl-2.6.12.orig/o/read.d ++++ gcl-2.6.12/o/read.d +@@ -2204,7 +2204,7 @@ object x; + object in; + vs_mark; + +- in = make_string_input_stream(x, 0, x->st.st_fillp); ++ in = fSmake_string_input_stream_int(x, 0, x->st.st_fillp); + vs_push(in); + preserving_whitespace_flag = FALSE; + detect_eos_flag = FALSE; +--- gcl-2.6.12.orig/o/run_process.c ++++ gcl-2.6.12/o/run_process.c +@@ -434,7 +434,7 @@ enum smmode smm; + + stream->sm.sm_object0 = sLcharacter; + stream->sm.sm_object1 = host_l; +- stream->sm.sm_int0 = stream->sm.sm_int1 = 0; ++ stream->sm.sm_int = 0; + stream->sm.sm_flags=0; + vs_push(stream); + setup_stream_buffer(stream); +@@ -503,8 +503,7 @@ make_socket_pair() + stream_in->sm.sm_mode = smm_input; + stream_in->sm.sm_fp = fp1; + stream_in->sm.sm_buffer = 0; +- stream_in->sm.sm_int0 = sockets_in[1]; +- stream_in->sm.sm_int1 = 0; ++ stream_in->sm.sm_int = sockets_in[1]; + stream_in->sm.sm_object0=stream_in->sm.sm_object1=OBJNULL; + stream_in->sm.sm_flags = 0; + stream_out = (object) alloc_object(t_stream); +@@ -513,8 +512,7 @@ make_socket_pair() + stream_out->sm.sm_buffer = 0; + setup_stream_buffer(stream_in); + setup_stream_buffer(stream_out); +- stream_out->sm.sm_int0 = sockets_out[1]; +- stream_out->sm.sm_int1 = 0; ++ stream_out->sm.sm_int = sockets_out[1]; + stream_out->sm.sm_flags = 0; + stream_out->sm.sm_object0=stream_out->sm.sm_object1=OBJNULL; + stream = make_two_way_stream(stream_in, stream_out); +@@ -538,8 +536,8 @@ char **argv; + int fdout; + if (istream->sm.sm_fp == NULL || ostream->sm.sm_fp == NULL) + FEerror("Cannot spawn process with given stream", 0); +- fdin = istream->sm.sm_int0; +- fdout = ostream->sm.sm_int0; ++ fdin = istream->sm.sm_int; ++ fdout = ostream->sm.sm_int; + if (pfork() == 0) + { /* the child --- replace standard in and out with descriptors given */ + close(0); +--- gcl-2.6.12.orig/o/sockets.c ++++ gcl-2.6.12/o/sockets.c +@@ -518,16 +518,6 @@ DEFUN_NEW("SET-SIGIO-FOR-FD",object,fSse + + } + +-DEFUN_NEW("RESET-STRING-INPUT-STREAM",object,fSreset_string_input_stream,SI,4,4,NONE,OO,OI,IO,OO,(object strm,object string,fixnum start,fixnum end), +- "Reuse a string output STREAM by setting its output to STRING \ +-and positioning the ouput/input to start at START and end at END") +- +-{ strm->sm.sm_object0 = string; +- strm->sm.sm_int0 = start; +- strm->sm.sm_int1 = end; +- return strm; +-} +- + DEFUN_NEW("CHECK-STATE-INPUT",object,fScheck_state_input,SI,2,2,NONE,OO,IO,OO,OO,(object osfd,fixnum timeout), + "") + { +--- gcl-2.6.12.orig/o/string.d ++++ gcl-2.6.12/o/string.d +@@ -564,28 +564,33 @@ LFD(Lnstring_capitalize)() { casefun = c + @(return `coerce_to_string(x)`) + @) + +-static void +-FFN(siLstring_concatenate)() +-{ +- int narg, i, l, m; +- object *v; ++DEFUN_NEW("STRING-CONCATENATE",object,fLstring_concatenate,SI,0,63,NONE,OO,OO,OO,OO,(object first,...),"") { ++ ++ fixnum i,l,m,narg=VFUN_NARGS; ++ object x; ++ va_list ap; ++ ++ va_start(ap,first); ++ vs_base=vs_top; ++ for (l=i=0;ist.st_fillp; ++ } ++ va_end(ap); ++ ++ { ++ object *p; ++ BEGIN_NO_INTERRUPT; ++ x=alloc_simple_string(l); ++ (x)->st.st_self = alloc_relblock(l); ++ for (l=0,p=vs_base;pst.st_fillp)>=0;p++,l+=m) ++ memcpy(x->st.st_self+l,(*p)->st.st_self,m); ++ END_NO_INTERRUPT; ++ ++ } ++ ++ RETURN1(x); + +- narg = vs_top - vs_base; +- for (i = 0, l = 0; i < narg; i++) { +- vs_base[i] = coerce_to_string(vs_base[i]); +- l += vs_base[i]->st.st_fillp; +- } +- v = vs_top; +- {BEGIN_NO_INTERRUPT; +- vs_push(alloc_simple_string(l)); +- (*v)->st.st_self = alloc_relblock(l); +- for (i = 0, l = 0; i < narg; i++) +- for (m = 0; m < vs_base[i]->st.st_fillp; m++) +- (*v)->st.st_self[l++] +- = vs_base[i]->st.st_self[m]; +- vs_base[0] = *v; +- vs_top = vs_base + 1; +- END_NO_INTERRUPT;} + } + + void +@@ -628,6 +633,4 @@ gcl_init_string_function() + make_function("NSTRING-CAPITALIZE", Lnstring_capitalize); + make_function("STRING", Lstring); + +- make_si_function("STRING-CONCATENATE", +- siLstring_concatenate); + } +--- gcl-2.6.12.orig/o/unixfsys.c ++++ gcl-2.6.12/o/unixfsys.c +@@ -55,7 +55,7 @@ get_string(object x) { + case smm_probe: + case smm_io: + return get_string(x->sm.sm_object1); +- case smm_file_synonym: ++ case smm_synonym: + return get_string(x->sm.sm_object0->s.s_dbind); + } + } +@@ -169,24 +169,6 @@ DEF_ORDINARY("DIRECTORY",sKdirectory,KEY + DEF_ORDINARY("LINK",sKlink,KEYWORD,""); + DEF_ORDINARY("FILE",sKfile,KEYWORD,""); + +-object +-file_stream(object x) { +- if (type_of(x)==t_stream) +- switch(x->sm.sm_mode) { +- case smm_input: +- case smm_output: +- case smm_io: +- case smm_probe: +- return x; +- case smm_synonym: +- return file_stream(x->sm.sm_object0->s.s_dbind); +- default: +- break; +- } +- return Cnil; +-} +- +- + DEFUNM_NEW("STAT",object,fSstat,SI,1,1,NONE,OO,OO,OO,OO,(object x),"") { + + struct stat ss; +--- gcl-2.6.12.orig/pcl/sys-proclaim.lisp ++++ gcl-2.6.12/pcl/sys-proclaim.lisp +@@ -2,29 +2,19 @@ + (COMMON-LISP::IN-PACKAGE "PCL") + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) +- PCL::CACHE-LIMIT-FN PCL::FAST-METHOD-CALL-FUNCTION +- PCL::METHOD-CALL-FUNCTION)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::T) ++ PCL::%CCLOSURE-ENV-NTHCDR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) +- PCL::DISPATCH-DFUN-INFO PCL::DEFAULT-METHOD-ONLY-DFUN-INFO +- PCL::MAKE-CACHE PCL::BOOTSTRAP-BUILT-IN-CLASSES +- PCL::RENEW-SYS-FILES PCL::SHOW-EMF-CALL-TRACE PCL::MAKE-CPD +- PCL::BOOTSTRAP-META-BRAID PCL::CACHES-TO-ALLOCATE +- PCL::LIST-ALL-DFUNS PCL::INITIAL-DISPATCH-DFUN-INFO +- PCL::INITIAL-DFUN-INFO PCL::%%ALLOCATE-INSTANCE--CLASS +- PCL::MAKE-ARG-INFO PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2 +- PCL::SHOW-FREE-CACHE-VECTORS PCL::UPDATE-DISPATCH-DFUNS +- PCL::GET-EFFECTIVE-METHOD-GENSYM PCL::IN-THE-COMPILER-P +- PCL::SHOW-DFUN-CONSTRUCTORS PCL::NO-METHODS-DFUN-INFO +- PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 +- PCL::STRUCTURE-FUNCTIONS-EXIST-P)) ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) ++ PCL::GET-WRAPPER-CACHE-NUMBER)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) +- PCL::CACHE-FIELD)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ PCL::NON-NEGATIVE-FIXNUM) ++ PCL::CACHE-NLINES PCL::CACHE-MASK PCL::CACHE-SIZE ++ PCL::CACHE-MAX-LOCATION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +@@ -32,296 +22,344 @@ + PCL::CACHE-VECTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::INTEGER 1 256)) +- PCL::CACHE-LINE-SIZE)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::ACCESSOR-VALUES-INTERNAL ++ PCL::MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION ++ PCL::|(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| ++ PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| ++ PCL::CHECK-METHOD-ARG-INFO ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION ++ PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ PCL::MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION ++ PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P ++ ITERATE::WALK-GATHERING-BODY ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER ++ PCL::|(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ PCL::SLOT-BOUNDP-USING-CLASS-DFUN WALKER::WALK-FORM-INTERNAL ++ PCL::LOAD-LONG-DEFCOMBIN PCL::MAKE-FINAL-CACHING-DFUN ++ PCL::EMIT-READER/WRITER ++ PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION ++ PCL::SLOT-VALUE-USING-CLASS-DFUN PCL::CACHING-MISS ++ PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ PCL::EMIT-READER/WRITER-FUNCTION PCL::ACCESSOR-VALUES1 ++ PCL::GENERATING-LISP PCL::GET-CLASS-SLOT-VALUE-1 ++ PCL::MAKE-FINAL-CONSTANT-VALUE-DFUN PCL::CACHE-MISS-VALUES ++ WALKER::WALK-LET-IF ++ PCL::|(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| ++ PCL::|(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ PCL::CHECKING-MISS ITERATE::EXPAND-INTO-LET ++ PCL::MAKE-OPTIMIZED-STD-WRITER-METHOD-FUNCTION ++ PCL::CONSTANT-VALUE-MISS ITERATE::RENAME-VARIABLES ++ PCL::|(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ PCL::SET-SLOT-VALUE ++ PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| ++ PCL::|(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| ++ PCL::CONVERT-METHODS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::INTEGER 1 255)) +- PCL::CACHE-NKEYS)) ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| ++ PCL::|(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| ++ PCL::MAKE-TWO-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| ++ PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::ADD-METHOD-DECLARATIONS ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ PCL::WALK-METHOD-LAMBDA ++ PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::GET-ACCESSOR-METHOD-FUNCTION ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| ++ PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| ++ PCL::GENERATE-DISCRIMINATION-NET ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| ++ PCL::LOAD-SHORT-DEFCOMBIN ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::REAL-MAKE-METHOD-LAMBDA PCL::SET-CLASS-SLOT-VALUE-1 ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITION ++ PCL::MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ PCL::ACCESSOR-MISS PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| ++ PCL::ACCESSOR-VALUES ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (T T))| ++ PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ PCL::EMIT-CHECKING-OR-CACHING-FUNCTION ++ PCL::INITIALIZE-INSTANCE-SIMPLE-FUNCTION ++ PCL::MAKE-FINAL-CHECKING-DFUN ++ PCL::MAKE-SHARED-INITIALIZE-FORM-LIST ++ PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| ++ PCL::EMIT-CHECKING-OR-CACHING ++ PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ PCL::|(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| ++ PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN ++ PCL::GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION ++ PCL::|(FAST-METHOD NO-APPLICABLE-METHOD (T))| ++ PCL::ORDER-SPECIALIZERS ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::MAKE-N-N-ACCESSOR-DFUN ++ PCL::GET-SIMPLE-INITIALIZATION-FUNCTION ++ PCL::MAKE-FINAL-ACCESSOR-DFUN ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION PCL::MAKE-ACCESSOR-TABLE ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION PCL::MAKE-CHECKING-DFUN ++ PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS ++ PCL::MAKE-DEFAULT-INITARGS-FORM-LIST PCL::REAL-ADD-METHOD ++ PCL::SLOT-VALUE-OR-DEFAULT PCL::LOAD-DEFGENERIC PCL::CPL-ERROR ++ WALKER::NESTED-WALK-FORM PCL::TYPES-FROM-ARGUMENTS ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION ++ PCL::GENERATE-DISCRIMINATION-NET-INTERNAL ++ PCL::CACHE-MISS-VALUES-INTERNAL ++ PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::DO-SHORT-METHOD-COMBINATION PCL::MEMF-CODE-CONVERTER)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::MAKE-ONE-INDEX-ACCESSOR-DFUN WALKER::WALK-DECLARATIONS ++ PCL::GET-SECONDARY-DISPATCH-FUNCTION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| ++ PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| ++ ITERATE::ITERATE-TRANSFORM-BODY)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ ITERATE::RENAME-LET-BINDINGS ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE1)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::REAL-MAKE-A-METHOD)) + (COMMON-LISP::MAPC + (COMMON-LISP::LAMBDA (COMPILER::X) + (COMMON-LISP::SETF +- (COMMON-LISP::GET COMPILER::X 'SYSTEM::PROCLAIMED-CLOSURE) ++ (COMMON-LISP::GET COMPILER::X 'COMPILER::PROCLAIMED-CLOSURE) + COMMON-LISP::T)) + '(PCL::REDEFINE-FUNCTION PCL::DO-STANDARD-DEFSETF-1 +- PCL::FDEFINE-CAREFULLY PCL::TRACE-METHOD-INTERNAL)) ++ PCL::TRACE-METHOD-INTERNAL PCL::FDEFINE-CAREFULLY)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) +- PCL::SYMBOL-APPEND)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) ++ PCL::ANALYZE-LAMBDA-LIST PCL::GET-DISPATCH-FUNCTION ++ PCL::PARSE-DEFMETHOD PCL::MAKE-DISPATCH-DFUN ++ PCL::EMIT-IN-CHECKING-CACHE-P PCL::EMIT-ONE-INDEX-READERS ++ PCL::METHOD-PROTOTYPE-FOR-GF PCL::EMIT-ONE-CLASS-READER ++ PCL::GENERIC-FUNCTION-NAME-P PCL::DEFAULT-CODE-CONVERTER ++ PCL::CLASS-EQ-TYPE PCL::CONVERT-TO-SYSTEM-TYPE ++ PCL::COMPILE-IIS-FUNCTIONS PCL::EMIT-CONSTANT-VALUE ++ PCL::GET-GENERIC-FUNCTION-INFO PCL::EARLY-METHOD-FUNCTION ++ PCL::FIND-STRUCTURE-CLASS PCL::PCL-DESCRIBE ++ PCL::NET-CODE-CONVERTER PCL::PARSE-METHOD-GROUP-SPECIFIER ++ PCL::TYPE-FROM-SPECIALIZER PCL::EMIT-TWO-CLASS-WRITER ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF PCL::EMIT-ONE-CLASS-WRITER ++ PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA ++ PCL::SPECIALIZER-FROM-TYPE PCL::EARLY-COLLECT-INHERITANCE ++ PCL::EMIT-TWO-CLASS-READER PCL::FIND-WRAPPER ++ PCL::*NORMALIZE-TYPE PCL::EMIT-ONE-INDEX-WRITERS ++ PCL::STRUCTURE-WRAPPER PCL::MAKE-FINAL-DISPATCH-DFUN)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) +- PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL +- PCL::GENERIC-CLOBBERS-FUNCTION PCL::STRUCTURE-SLOTD-TYPE +- WALKER::GET-WALKER-TEMPLATE PCL::COMPILE-LAMBDA-UNCOMPILED +- PCL::EXTRACT-LAMBDA-LIST PCL::DEFAULT-METHOD-ONLY-P +- PCL::DISPATCH-CACHE PCL::STRUCTURE-SLOTD-NAME +- PCL::FAST-METHOD-CALL-P PCL::SFUN-P +- PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST +- PCL::EARLY-CLASS-DEFINITION PCL::CONSTANT-SYMBOL-P +- PCL::ARG-INFO-LAMBDA-LIST WALKER::ENV-LEXICAL-VARIABLES +- PCL::INTERN-EQL-SPECIALIZER PCL::PARSE-SPECIALIZERS +- PCL::%STD-INSTANCE-WRAPPER PCL::UPDATE-ALL-C-A-M-GF-INFO +- PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION +- PCL::STORE-FGEN PCL::COMPUTE-MCASE-PARAMETERS +- PCL::INTERNED-SYMBOL-P PCL::MAKE-CALL-METHODS +- PCL::USE-CACHING-DFUN-P PCL::LEGAL-CLASS-NAME-P +- WALKER::VARIABLE-GLOBALLY-SPECIAL-P PCL::FUNCTION-RETURNING-T +- PCL::METHOD-FUNCTION-METHOD PCL::GET-BUILT-IN-CLASS-SYMBOL +- PCL::DEFAULT-STRUCTURE-TYPE PCL::GF-DFUN-INFO PCL::CACHING-P +- PCL::FREE-CACHE-VECTOR PCL::ONE-CLASS-CACHE +- PCL::DEFAULT-TEST-CONVERTER PCL::UNDEFMETHOD-1 +- PCL::MAKE-INITFUNCTION PCL::GET-CACHE-VECTOR +- PCL::CLASS-PRECEDENCE-DESCRIPTION-P PCL::GF-INFO-FAST-MF-P +- PCL::ECD-SOURCE PCL::INITIAL-P PCL::ARG-INFO-APPLYP +- PCL::ARG-INFO-KEYWORDS +- PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION +- PCL::CACHING-DFUN-COST PCL::INITIAL-DISPATCH-P PCL::EVAL-FORM +- PCL::MAKE-CONSTANT-FUNCTION PCL::FUNCTION-RETURNING-NIL +- PCL::INITIALIZE-INFO-BOUND-SLOTS PCL::FGEN-GENSYMS +- PCL::EXPAND-SHORT-DEFCOMBIN WALKER::ENV-LOCK +- PCL::INITIALIZE-INFO-CACHED-CONSTANTS +- PCL::INITIALIZE-INFO-WRAPPER +- PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME PCL::TWO-CLASS-INDEX +- PCL::ONE-INDEX-ACCESSOR-TYPE +- PCL::EARLY-COLLECT-DEFAULT-INITARGS WALKER::ENV-WALK-FORM +- PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS PCL::MAKE-FUNCTION-INLINE +- PCL::FLUSH-CACHE-VECTOR-INTERNAL +- PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION +- PCL::FGEN-GENERATOR PCL::CONSTANT-VALUE-P +- PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION +- PCL::EARLY-CLASS-PRECEDENCE-LIST PCL::SLOT-BOUNDP-SYMBOL +- PCL::ARG-INFO-NUMBER-OPTIONAL +- PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P PCL::GET-PV-CELL-FOR-CLASS +- PCL::CHECKING-FUNCTION PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P +- PCL::INITIAL-DISPATCH-CACHE PCL::STRUCTURE-SVUC-METHOD +- PCL::NO-METHODS-CACHE PCL::GF-DFUN-CACHE PCL::%CCLOSURE-ENV +- PCL::CONSTANT-VALUE-CACHE PCL::BUILT-IN-WRAPPER-OF +- PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P +- PCL::EARLY-COLLECT-CPL COMMON-LISP::CLASS-OF +- PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL PCL::SYMBOL-PKG-NAME +- PCL::GDEFINITION +- PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION +- PCL::ACCESSOR-DFUN-INFO-CACHE PCL::EXTRACT-SPECIALIZER-NAMES +- PCL::CHECK-WRAPPER-VALIDITY PCL::MAKE-INITIAL-DFUN +- PCL::WRAPPER-FIELD PCL::EARLY-SLOT-DEFINITION-LOCATION +- PCL::EARLY-GF-P PCL::GF-INFO-STATIC-C-A-M-EMF PCL::LOOKUP-FGEN +- PCL::MAKE-PV-TYPE-DECLARATION +- PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS +- PCL::EARLY-METHOD-CLASS +- PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION +- WALKER::ENV-DECLARATIONS PCL::ALLOCATE-CACHE-VECTOR +- PCL::FUNCTION-PRETTY-ARGLIST +- PCL::EARLY-CLASS-DIRECT-SUBCLASSES +- PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P +- PCL::MAKE-CLASS-EQ-PREDICATE PCL::ECD-OTHER-INITARGS +- PCL::GBOUNDP PCL::METHOD-FUNCTION-PV-TABLE +- WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE +- PCL::MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::FIND-CYCLE-REASONS PCL::FGEN-TEST +- PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD PCL::FREE-CACHE +- PCL::TYPE-CLASS PCL::INITIAL-CACHE +- PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS +- PCL::STRUCTURE-SLOTD-WRITER-FUNCTION +- PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION +- PCL::EARLY-COLLECT-SLOTS PCL::LIST-DFUN +- PCL::EXPAND-MAKE-INSTANCE-FORM PCL::N-N-CACHE +- PCL::MAKE-TYPE-PREDICATE PCL::INTERN-FUNCTION-NAME +- PCL::GET-MAKE-INSTANCE-FUNCTIONS WALKER::ENV-WALK-FUNCTION +- PCL::TWO-CLASS-CACHE PCL::MAKE-CALLS-TYPE-DECLARATION +- PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION +- PCL::INITIALIZE-INFO-KEY PCL::GF-LAMBDA-LIST +- ITERATE::VARIABLES-FROM-LET PCL::COMPUTE-CLASS-SLOTS +- PCL::DFUN-ARG-SYMBOL PCL::CHECKING-P PCL::ARG-INFO-P +- PCL::INITIALIZE-INFO-CACHED-RI-VALID-P PCL::CHECKING-CACHE +- PCL::METHOD-FUNCTION-PLIST PCL::STRUCTURE-OBJECT-P +- PCL::ARG-INFO-PRECEDENCE PCL::ONE-CLASS-INDEX +- PCL::STD-INSTANCE-P PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST +- PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::EARLY-SLOT-DEFINITION-NAME PCL::UNPARSE-SPECIALIZERS +- PCL::STRUCTURE-TYPE-P PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE +- PCL::PV-TABLEP PCL::CLASS-FROM-TYPE +- PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE PCL::STRUCTURE-TYPE +- PCL::MAKE-EQL-PREDICATE PCL::TWO-CLASS-ACCESSOR-TYPE +- PCL::DEFAULT-STRUCTURE-INSTANCE-P +- PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME +- PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE PCL::GFS-OF-TYPE +- PCL::DEFAULT-STRUCTUREP PCL::EARLY-CLASS-NAME-OF +- PCL::%STD-INSTANCE-SLOTS PCL::ONE-INDEX-INDEX PCL::WRAPPER-OF +- PCL::ARG-INFO-VALID-P PCL::KEYWORD-SPEC-NAME +- PCL::METHOD-CALL-P PCL::SHOW-DFUN-COSTS PCL::DFUN-INFO-CACHE +- PCL::DEFAULT-CONSTANT-CONVERTER ITERATE::SEQUENCE-ACCESSOR +- PCL::COUNT-DFUN PCL::EXPAND-LONG-DEFCOMBIN +- PCL::CACHING-DFUN-INFO PCL::INITIALIZE-INFO-CACHED-VALID-P +- PCL::FAST-INSTANCE-BOUNDP-P PCL::ARG-INFO-METATYPES +- PCL::EXTRACT-PARAMETERS PCL::GF-INFO-C-A-M-EMF-STD-P +- PCL::FINAL-ACCESSOR-DFUN-TYPE PCL::GMAKUNBOUND +- PCL::FAST-METHOD-CALL-ARG-INFO PCL::COMPUTE-LINE-SIZE +- PCL::ONE-INDEX-CACHE PCL::NO-METHODS-P +- PCL::COMPUTE-STD-CPL-PHASE-2 +- PCL::COMPLICATED-INSTANCE-CREATION-METHOD +- PCL::MAKE-PERMUTATION-VECTOR PCL::CONSTANT-VALUE-DFUN-INFO +- PCL::TWO-CLASS-WRAPPER1 PCL::MAP-ALL-GENERIC-FUNCTIONS +- PCL::CLASS-PREDICATE SYSTEM::%STRUCTURE-NAME +- PCL::RESET-CLASS-INITIALIZE-INFO +- PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 PCL::EARLY-CLASS-NAME +- PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::UPDATE-PV-TABLE-CACHE-INFO PCL::SLOT-READER-SYMBOL +- PCL::ARG-INFO-NKEYS PCL::METHOD-CALL-CALL-METHOD-ARGS +- PCL::CCLOSUREP PCL::DEFAULT-METHOD-ONLY-CACHE +- PCL::NEXT-WRAPPER-FIELD PCL::SLOT-WRITER-SYMBOL +- PCL::ACCESSOR-DFUN-INFO-P +- PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL +- PCL::EXTRACT-REQUIRED-PARAMETERS PCL::FORMAT-CYCLE-REASONS +- PCL::UNENCAPSULATED-FDEFINITION +- PCL::GET-BUILT-IN-WRAPPER-SYMBOL PCL::ONE-CLASS-P +- PCL::ECD-METACLASS PCL::METHOD-LL->GENERIC-FUNCTION-LL +- PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES PCL::ONE-INDEX-P +- PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST +- PCL::ECD-CANONICAL-SLOTS +- PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P +- PCL::INITIALIZE-INFO-CACHED-NEW-KEYS +- PCL::STRUCTURE-SLOTD-READER-FUNCTION +- PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST +- PCL::DISPATCH-P PCL::LIST-LARGE-CACHE +- PCL::FAST-METHOD-CALL-PV-CELL PCL::GET-MAKE-INSTANCE-FUNCTION +- PCL::DNET-METHODS-P PCL::STRUCTURE-SLOTD-INIT-FORM +- PCL::UPDATE-CLASS-CAN-PRECEDE-P PCL::ONE-CLASS-ACCESSOR-TYPE +- PCL::RESET-INITIALIZE-INFO PCL::STANDARD-SVUC-METHOD +- PCL::DEFAULT-CONSTANTP PCL::UPDATE-C-A-M-GF-INFO +- PCL::ONE-INDEX-DFUN-INFO-CACHE PCL::EARLY-CLASS-SLOTS +- PCL::CPD-SUPERS PCL::FGEN-GENERATOR-LAMBDA +- PCL::ECD-SUPERCLASS-NAMES PCL::ECD-CLASS-NAME PCL::SETFBOUNDP +- PCL::GET-SETF-FUNCTION-NAME PCL::DFUN-INFO-P +- PCL::SLOT-VECTOR-SYMBOL PCL::INITIALIZE-INFO-P +- PCL::TWO-CLASS-P PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE +- PCL::COPY-CACHE PCL::MAKE-PV-TABLE-TYPE-DECLARATION +- PCL::SORT-CALLS PCL::STRUCTURE-SLOT-BOUNDP PCL::%FBOUNDP +- PCL::RESET-CLASS-INITIALIZE-INFO-1 PCL::UPDATE-GF-INFO +- PCL::WRAPPER-FOR-STRUCTURE PCL::FUNCALLABLE-INSTANCE-P +- PCL::CPD-CLASS PCL::EARLY-METHOD-STANDARD-ACCESSOR-P +- PCL::SORT-SLOTS PCL::CANONICAL-SLOT-NAME +- PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME PCL::%SYMBOL-FUNCTION +- PCL::EARLY-METHOD-LAMBDA-LIST PCL::ONE-INDEX-DFUN-INFO-INDEX +- PCL::N-N-ACCESSOR-TYPE PCL::CACHING-CACHE +- PCL::EARLY-CLASS-SLOTDS PCL::ONE-INDEX-DFUN-INFO-P +- SYSTEM::%COMPILED-FUNCTION-NAME +- PCL::BOOTSTRAP-CLASS-PREDICATES PCL::NET-TEST-CONVERTER +- PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS PCL::TWO-CLASS-WRAPPER0 +- PCL::MAP-SPECIALIZERS PCL::EARLY-GF-NAME PCL::N-N-P +- PCL::FGEN-SYSTEM PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P +- PCL::UPDATE-GFS-OF-CLASS PCL::ONE-CLASS-WRAPPER0 +- PCL::CPD-AFTER +- PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION +- PCL::CACHE-P PCL::EARLY-METHOD-QUALIFIERS PCL::CHECK-CACHE +- PCL::FORCE-CACHE-FLUSHES PCL::CACHE-OWNER +- PCL::COMPILE-LAMBDA-DEFERRED PCL::ARG-INFO-KEY/REST-P)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) ++ PCL::|__si::MAKE-INITIAL| PCL::|__si::MAKE-ARG-INFO| ++ PCL::STRING-APPEND PCL::|__si::MAKE-ONE-INDEX| ++ PCL::MAKE-INITIALIZE-INFO PCL::MAKE-FAST-METHOD-CALL ++ PCL::|__si::MAKE-STD-INSTANCE| ++ PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| ++ PCL::|__si::MAKE-CONSTANT-VALUE| PCL::|__si::MAKE-N-N| ++ PCL::FIX-EARLY-GENERIC-FUNCTIONS PCL::INTERN-PV-TABLE ++ PCL::FALSE PCL::|__si::MAKE-DFUN-INFO| ++ PCL::|__si::MAKE-CACHING| PCL::MAKE-PV-TABLE ++ PCL::MAKE-METHOD-CALL PCL::TRUE PCL::MAKE-PROGN ++ PCL::|__si::MAKE-CACHE| ++ PCL::|STRUCTURE-OBJECT class constructor| ++ PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| ++ PCL::|__si::MAKE-NO-METHODS| PCL::|__si::MAKE-ONE-CLASS| ++ PCL::|__si::MAKE-PV-TABLE| PCL::PV-WRAPPERS-FROM-PV-ARGS ++ WALKER::UNBOUND-LEXICAL-FUNCTION PCL::|__si::MAKE-TWO-CLASS| ++ PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| ++ PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| ++ PCL::MAKE-FAST-INSTANCE-BOUNDP ++ PCL::CALLED-FIN-WITHOUT-FUNCTION PCL::USE-PACKAGE-PCL ++ PCL::|__si::MAKE-CHECKING| PCL::|__si::MAKE-INITIAL-DISPATCH| ++ PCL::|__si::MAKE-DISPATCH|)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) +- COMMON-LISP::INVALID-METHOD-ERROR PCL::LIST-LARGE-CACHES +- PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::UNTRACE-METHOD +- COMMON-LISP::METHOD-COMBINATION-ERROR)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FUNCTION) ++ PCL::METHOD-CALL-FUNCTION PCL::FAST-METHOD-CALL-FUNCTION ++ PCL::CACHE-LIMIT-FN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) ++ PCL::CACHE-VALUEP)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- PCL::NON-NEGATIVE-FIXNUM) +- PCL::CACHE-MAX-LOCATION PCL::CACHE-NLINES PCL::CACHE-SIZE +- PCL::CACHE-MASK)) ++ (COMMON-LISP::INTEGER 1 255)) ++ PCL::CACHE-NKEYS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::INTEGER 1 256)) ++ PCL::CACHE-LINE-SIZE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::VALUES COMMON-LISP::T COMMON-LISP::T)) ++ PCL::SYMBOL-APPEND)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) ++ (COMMON-LISP::*)) ++ PCL::SORT-APPLICABLE-METHODS PCL::SORT-METHODS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION +- ITERATE::SIMPLE-EXPAND-ITERATE-FORM PCL::ADD-DIRECT-SUBCLASSES +- PCL::PROCLAIM-DEFMETHOD PCL::UPDATE-INITIALIZE-INFO-INTERNAL +- PCL::RAISE-METATYPE PCL::CLASS-CAN-PRECEDE-P +- WALKER::VARIABLE-SPECIAL-P PCL::GF-MAKE-FUNCTION-FROM-EMF +- PCL::|SETF PCL METHOD-FUNCTION-PLIST| ++ PCL::COMPUTE-CALLS PCL::SET-STRUCTURE-SVUC-METHOD ++ PCL::UPDATE-STD-OR-STR-METHODS PCL::SET-METHODS ++ WALKER::NOTE-LEXICAL-BINDING ++ ITERATE::SIMPLE-EXPAND-ITERATE-FORM ++ PCL::|SETF PCL METHOD-FUNCTION-PLIST| PCL::SAUT-NOT-PROTOTYPE ++ PCL::VALUE-FOR-CACHING PCL::PROCLAIM-DEFMETHOD ++ PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST ++ PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION PCL::METHODS-CONVERTER ++ PCL::DEAL-WITH-ARGUMENTS-OPTION ++ PCL::UPDATE-ALL-PV-TABLE-CACHES ++ PCL::MAP-PV-TABLE-REFERENCES-OF PCL::UPDATE-CLASS ++ PCL::FIND-STANDARD-II-METHOD ++ PCL::METHOD-FUNCTION-RETURNING-NIL ++ PCL::REDIRECT-EARLY-FUNCTION-INTERNAL PCL::UPDATE-CPL ++ PCL::QUALIFIER-CHECK-RUNTIME PCL::COMPUTE-STD-CPL ++ PCL::COMPUTE-CONSTANTS PCL::ADD-FORMS PCL::AUGMENT-TYPE ++ PCL::MEMF-CONSTANT-CONVERTER PCL::SWAP-WRAPPERS-AND-SLOTS ++ PCL::SET-WRAPPER PCL::GET-KEY-ARG PCL::MAKE-PLIST ++ PCL::MAKE-PV-TABLE-INTERNAL ITERATE::EXTRACT-SPECIAL-BINDINGS ++ PCL::SAUT-NOT-EQL WALKER::VARIABLE-SYMBOL-MACRO-P ++ PCL::EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION + PCL::SET-FUNCTION-PRETTY-ARGLIST ++ PCL::GF-MAKE-FUNCTION-FROM-EMF PCL::FIND-SLOT-DEFINITION ++ PCL::SET-STANDARD-SVUC-METHOD PCL::ADD-TO-CVECTOR ++ PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS COMMON-LISP::REMOVE-METHOD ++ PCL::CHECKING-DFUN-INFO PCL::PARSE-QUALIFIER-PATTERN ++ PCL::%SET-CCLOSURE-ENV PCL::MAKE-CDXR + PCL::FUNCALLABLE-STANDARD-INSTANCE-ACCESS ++ PCL::NET-CONSTANT-CONVERTER PCL::|SETF PCL FIND-CLASS| ++ PCL::METHOD-FUNCTION-RETURNING-T PCL::CHANGE-CLASS-INTERNAL ++ PCL::MAKE-DFUN-ARG-LIST PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER ++ PCL::MAKE-STD-WRITER-METHOD-FUNCTION ITERATE::MV-SETQ ++ PCL::MAKE-EARLY-ACCESSOR PCL::GET-KEY-ARG1 ++ PCL::ADD-DIRECT-SUBCLASSES PCL::DO-SATISFIES-DEFTYPE ++ PCL::N-N-DFUN-INFO PCL::CLASSES-HAVE-COMMON-SUBCLASS-P ++ PCL::SAUT-NOT-CLASS PCL::CANONICALIZE-DEFCLASS-OPTION + PCL::MAKE-DISCRIMINATING-FUNCTION-ARGLIST +- PCL::DEAL-WITH-ARGUMENTS-OPTION WALKER::NOTE-DECLARATION +- PCL::MAKE-CLASS-PREDICATE PCL::VALUE-FOR-CACHING +- PCL::EMIT-1-NIL-DLAP PCL::MAKE-CAXR PCL::SYMBOL-LESSP +- PCL::GET-KEY-ARG1 PCL::ADD-FORMS +- PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- PCL::DOCTOR-DFUN-FOR-THE-DEBUGGER +- PCL::CLASSES-HAVE-COMMON-SUBCLASS-P PCL::N-N-DFUN-INFO +- PCL::CANONICALIZE-SLOT-SPECIFICATION +- PCL::REDIRECT-EARLY-FUNCTION-INTERNAL +- PCL::UPDATE-STD-OR-STR-METHODS PCL::%SET-CCLOSURE-ENV +- PCL::QUALIFIER-CHECK-RUNTIME +- PCL::MAKE-STD-READER-METHOD-FUNCTION +- PCL::ADD-SLOT-ACCESSORS PCL::ADD-TO-CVECTOR +- PCL::COMPUTE-LAYOUT PCL::DESTRUCTURE-INTERNAL +- PCL::SUPERCLASSES-COMPATIBLE-P +- PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION ITERATE::MV-SETQ +- PCL::COMPUTE-STD-CPL PCL::SET-METHODS PCL::CHECKING-DFUN-INFO +- ITERATE::EXTRACT-SPECIAL-BINDINGS PCL::SWAP-WRAPPERS-AND-SLOTS +- PCL::CANONICALIZE-DEFCLASS-OPTION PCL::MAKE-CDXR +- PCL::PRINTING-RANDOM-THING-INTERNAL COMMON-LISP::ADD-METHOD ++ WALKER::VARIABLE-LEXICAL-P WALKER::ENVIRONMENT-FUNCTION ++ PCL::PV-TABLE-LOOKUP PCL::DESTRUCTURE-INTERNAL ++ PCL::MAKE-INTERNAL-READER-METHOD-FUNCTION ++ PCL::REMOVE-SLOT-ACCESSORS ++ PCL::|SETF PCL FIND-CLASS-PREDICATE| ++ PCL::|SETF PCL GDEFINITION| PCL::MAKE-DFUN-LAMBDA-LIST ++ PCL::CANONICALIZE-SLOT-SPECIFICATION WALKER::WALK-REPEAT-EVAL + PCL::STANDARD-INSTANCE-ACCESS +- SYSTEM::%SET-COMPILED-FUNCTION-NAME PCL::FIND-SLOT-DEFINITION ++ PCL::PRINTING-RANDOM-THING-INTERNAL PCL::REMTAIL ++ PCL::ACCESSOR-MISS-FUNCTION PCL::COMPUTE-LAYOUT + PCL::CLASS-MIGHT-PRECEDE-P +- PCL::MAKE-STD-BOUNDP-METHOD-FUNCTION PCL::SAUT-NOT-EQL +- PCL::SET-WRAPPER PCL::SET-STANDARD-SVUC-METHOD +- PCL::SAUT-NOT-PROTOTYPE PCL::ACCESSOR-MISS-FUNCTION +- PCL::NO-SLOT PCL::REMTAIL PCL::PV-WRAPPERS-FROM-ALL-ARGS +- PCL::UPDATE-CLASS PCL::AUGMENT-TYPE PCL::MAKE-EARLY-ACCESSOR +- PCL::MAKE-PLIST PCL::MEC-ALL-CLASSES-INTERNAL +- PCL::MAKE-STD-WRITER-METHOD-FUNCTION +- PCL::PARSE-QUALIFIER-PATTERN PCL::MEMF-CONSTANT-CONVERTER +- PCL::|SETF PCL FIND-CLASS-PREDICATE| +- PCL::MAKE-UNORDERED-METHODS-EMF WALKER::ENVIRONMENT-FUNCTION +- PCL::MEC-ALL-CLASS-LISTS PCL::SAUT-NOT-CLASS-EQ +- PCL::DO-SATISFIES-DEFTYPE PCL::SET-STRUCTURE-SVUC-METHOD +- PCL::MAKE-DLAP-LAMBDA-LIST PCL::METHOD-FUNCTION-RETURNING-T +- PCL::COMPUTE-CALLS PCL::REMOVE-SLOT-ACCESSORS +- PCL::UPDATE-ALL-PV-TABLE-CACHES PCL::MAKE-DFUN-LAMBDA-LIST +- WALKER::NOTE-LEXICAL-BINDING PCL::REMOVE-DIRECT-SUBCLASSES +- PCL::MAP-PV-TABLE-REFERENCES-OF PCL::COMPUTE-CONSTANTS +- PCL::METHOD-FUNCTION-RETURNING-NIL PCL::METHODS-CONVERTER +- PCL::PV-TABLE-LOOKUP PCL::DESCRIBE-PACKAGE +- COMMON-LISP::SLOT-EXISTS-P PCL::MAKE-PV-TABLE-INTERNAL +- PCL::SAUT-NOT-CLASS PCL::|SETF PCL FIND-CLASS| +- PCL::UPDATE-INITS PCL::UPDATE-CPL +- PCL::EMIT-1-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION +- PCL::COMPUTE-PV WALKER::VARIABLE-LEXICAL-P +- PCL::PROCLAIM-DEFGENERIC PCL::MAKE-DFUN-ARG-LIST +- PCL::GET-KEY-ARG COMMON-LISP::REMOVE-METHOD +- PCL::PV-WRAPPERS-FROM-ALL-WRAPPERS PCL::VARIABLE-CLASS +- PCL::UPDATE-SLOTS PCL::SYMBOL-OR-CONS-LESSP +- PCL::MEC-ALL-CLASSES PCL::LIST-EQ +- PCL::SET-FUNCALLABLE-INSTANCE-FUNCTION +- WALKER::WALK-REPEAT-EVAL WALKER::ENVIRONMENT-MACRO +- WALKER::VARIABLE-SYMBOL-MACRO-P +- PCL::MAKE-FAST-METHOD-CALL-LAMBDA-LIST +- PCL::BOOTSTRAP-SLOT-INDEX PCL::PLIST-VALUE +- PCL::CHANGE-CLASS-INTERNAL PCL::NET-CONSTANT-CONVERTER +- PCL::|SETF PCL GDEFINITION| PCL::FIND-STANDARD-II-METHOD)) ++ PCL::EMIT-N-WRAPPER-COMPUTE-PRIMARY-CACHE-LOCATION ++ SYSTEM::%SET-COMPILED-FUNCTION-NAME PCL::PLIST-VALUE ++ PCL::MAKE-CAXR PCL::MAKE-DLAP-LAMBDA-LIST ++ PCL::MAKE-STD-READER-METHOD-FUNCTION WALKER::ENVIRONMENT-MACRO ++ PCL::UPDATE-SLOTS PCL::VARIABLE-CLASS ++ PCL::SET-FUNCALLABLE-INSTANCE-FUNCTION PCL::LIST-EQ ++ PCL::ADD-SLOT-ACCESSORS PCL::SAUT-NOT-CLASS-EQ PCL::COMPUTE-PV ++ PCL::PV-WRAPPERS-FROM-ALL-ARGS PCL::UPDATE-INITS ++ PCL::MEC-ALL-CLASS-LISTS PCL::RAISE-METATYPE ++ WALKER::NOTE-DECLARATION PCL::EMIT-1-NIL-DLAP ++ PCL::BOOTSTRAP-SLOT-INDEX PCL::SUPERCLASSES-COMPATIBLE-P ++ PCL::MEC-ALL-CLASSES-INTERNAL COMMON-LISP::SLOT-EXISTS-P ++ PCL::DESCRIBE-PACKAGE PCL::NO-SLOT PCL::PROCLAIM-DEFGENERIC ++ COMMON-LISP::ADD-METHOD PCL::MAKE-UNORDERED-METHODS-EMF ++ PCL::MEC-ALL-CLASSES PCL::SYMBOL-OR-CONS-LESSP ++ PCL::UPDATE-INITIALIZE-INFO-INTERNAL PCL::CLASS-CAN-PRECEDE-P ++ PCL::SYMBOL-LESSP PCL::COMPUTE-APPLICABLE-METHODS-FUNCTION ++ PCL::MAKE-CLASS-PREDICATE WALKER::VARIABLE-SPECIAL-P ++ PCL::REMOVE-DIRECT-SUBCLASSES)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::*) +- WALKER::WALK-FORM PCL::MAKE-INSTANCE-1 +- PCL::EXTRACT-DECLARATIONS PCL::GET-FUNCTION +- WALKER::MACROEXPAND-ALL PCL::ALLOCATE-STRUCTURE-INSTANCE +- PCL::MAKE-FINAL-DFUN-INTERNAL PCL::GET-METHOD-FUNCTION +- PCL::COERCE-TO-CLASS PCL::MAP-ALL-CLASSES PCL::ENSURE-CLASS +- PCL::PARSE-METHOD-OR-SPEC COMMON-LISP::ENSURE-GENERIC-FUNCTION +- PCL::MAKE-CACHING-DFUN PCL::GET-FUNCTION1 +- PCL::GET-DFUN-CONSTRUCTOR PCL::MAKE-CONSTANT-VALUE-DFUN +- PCL::MAKE-METHOD-FUNCTION-INTERNAL PCL::COMPILE-LAMBDA +- PCL::PARSE-SPECIALIZED-LAMBDA-LIST PCL::DISPATCH-DFUN-COST +- PCL::MAKE-METHOD-LAMBDA-INTERNAL)) ++ PCL::MAKE-METHOD-FUNCTION-INTERNAL ++ PCL::MAKE-FINAL-DFUN-INTERNAL WALKER::MACROEXPAND-ALL ++ COMMON-LISP::ENSURE-GENERIC-FUNCTION ++ PCL::MAKE-METHOD-LAMBDA-INTERNAL PCL::MAKE-CONSTANT-VALUE-DFUN ++ PCL::GET-FUNCTION PCL::EXTRACT-DECLARATIONS ++ PCL::COERCE-TO-CLASS PCL::PARSE-METHOD-OR-SPEC ++ PCL::DISPATCH-DFUN-COST PCL::PARSE-SPECIALIZED-LAMBDA-LIST ++ PCL::MAP-ALL-CLASSES PCL::COMPILE-LAMBDA PCL::ENSURE-CLASS ++ PCL::GET-METHOD-FUNCTION WALKER::WALK-FORM ++ PCL::ALLOCATE-STRUCTURE-INSTANCE PCL::GET-FUNCTION1 ++ PCL::MAKE-CACHING-DFUN PCL::MAKE-INSTANCE-1 ++ PCL::GET-DFUN-CONSTRUCTOR)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION (COMMON-LISP::T) +@@ -329,270 +367,405 @@ + PCL::MAKE-CLASS-PREDICATE-NAME PCL::MAKE-KEYWORD)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::VECTOR COMMON-LISP::CHARACTER ++ COMMON-LISP::*)) ++ PCL::CAPITALIZE-WORDS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::T) ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-1 PCL::SHOW-EMF-CALL-TRACE ++ PCL::CACHES-TO-ALLOCATE PCL::MAKE-CACHE ++ PCL::SHOW-FREE-CACHE-VECTORS PCL::MAKE-ARG-INFO ++ PCL::NO-METHODS-DFUN-INFO PCL::STRUCTURE-FUNCTIONS-EXIST-P ++ PCL::INITIALIZE-CHECKING-OR-CACHING-FUNCTION-LIST ++ PCL::BOOTSTRAP-BUILT-IN-CLASSES ++ PCL::%%ALLOCATE-INSTANCE--CLASS PCL::DISPATCH-DFUN-INFO ++ PCL::INITIAL-DISPATCH-DFUN-INFO PCL::BOOTSTRAP-META-BRAID ++ PCL::UPDATE-DISPATCH-DFUNS PCL::LIST-ALL-DFUNS ++ PCL::DEFAULT-METHOD-ONLY-DFUN-INFO PCL::RENEW-SYS-FILES ++ PCL::IN-THE-COMPILER-P PCL::GET-EFFECTIVE-METHOD-GENSYM ++ PCL::MAKE-CPD PCL::INITIAL-DFUN-INFO ++ PCL::SHOW-DFUN-CONSTRUCTORS ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE-2)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::FIXNUM) ++ PCL::ZERO)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) + COMMON-LISP::T) +- PCL::FIND-CLASS-FROM-CELL PCL::GET-METHOD-FUNCTION-PV-CELL +- PCL::PROBE-CACHE PCL::NAMED-OBJECT-PRINT-FUNCTION +- PCL::PRECOMPUTE-EFFECTIVE-METHODS +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE +- PCL::GET-EFFECTIVE-METHOD-FUNCTION1 PCL::MAKE-EMF-FROM-METHOD +- PCL::EMIT-MISS PCL::REAL-ENSURE-GF-USING-CLASS--NULL +- PCL::RECORD-DEFINITION WALKER::CONVERT-MACRO-TO-LAMBDA +- PCL::INITIALIZE-INFO PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION +- PCL::METHOD-FUNCTION-GET PCL::FIND-CLASS-PREDICATE-FROM-CELL +- PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS +- PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 PCL::GET-DECLARATION +- PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION +- PCL::MAP-CACHE)) ++ PCL::PRINT-DFUN-INFO)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::*) ++ PCL::FIND-FREE-CACHE-LINE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::COMPUTE-CACHE-PARAMETERS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) ++ PCL::COUNT-ALL-DFUNS PCL::EMIT-N-N-WRITERS ++ PCL::EMIT-N-N-READERS)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::MAKE-FINAL-DFUN PCL::SET-ARG-INFO PCL::TRACE-METHOD ++ PCL::MAKE-SPECIALIZABLE WALKER::WALKER-ENVIRONMENT-BIND-1 ++ ITERATE::FUNCTION-LAMBDA-P COMMON-LISP::FIND-CLASS ++ PCL::MAKE-WRAPPER PCL::UPDATE-DFUN ++ PCL::MAKE-TYPE-PREDICATE-NAME PCL::PV-TABLE-LOOKUP-PV-ARGS ++ PCL::USE-CONSTANT-VALUE-DFUN-P WALKER::RELIST ++ PCL::MAKE-EARLY-GF PCL::INITIALIZE-METHOD-FUNCTION ++ PCL::FIND-CLASS-CELL PCL::USE-DISPATCH-DFUN-P ++ PCL::FIND-CLASS-PREDICATE PCL::ALLOCATE-STANDARD-INSTANCE ++ PCL::INITIALIZE-INTERNAL-SLOT-GFS ITERATE::MAYBE-WARN ++ PCL::ALLOCATE-FUNCALLABLE-INSTANCE ++ PCL::EARLY-METHOD-SPECIALIZERS WALKER::RELIST* PCL::SET-DFUN)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) ++ COMMON-LISP::*) ++ PCL::SLOT-UNBOUND-INTERNAL ITERATE::PARSE-DECLARATIONS ++ PCL::EMIT-CACHING PCL::COMPUTE-STD-CPL-PHASE-1 ++ PCL::INITIAL-DFUN PCL::INSURE-DFUN PCL::EMIT-CHECKING ++ PCL::COMPUTE-TEST PCL::COMPUTE-CODE PCL::MAKE-DIRECT-SLOTD ++ PCL::SAUT-CLASS COMMON-LISP::SLOT-MAKUNBOUND ++ PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR PCL::INVOKE-EMF ++ PCL::*SUBTYPEP PCL::SPECIALIZER-APPLICABLE-USING-TYPE-P ++ PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES ++ PCL::REAL-REMOVE-METHOD PCL::SAUT-PROTOTYPE ++ PCL::MUTATE-SLOTS-AND-CALLS PCL::FIND-SUPERCLASS-CHAIN ++ COMMON-LISP::SLOT-BOUNDP PCL::FORM-LIST-TO-LISP ++ PCL::CPL-INCONSISTENT-ERROR PCL::EMIT-DEFAULT-ONLY-FUNCTION ++ PCL::ENSURE-CLASS-VALUES PCL::CHECK-INITARGS-VALUES ++ PCL::SAUT-EQL PCL::SPLIT-DECLARATIONS ++ PCL::UPDATE-SLOT-VALUE-GF-INFO PCL::SAUT-AND ++ PCL::SLOT-NAME-LISTS-FROM-SLOTS ++ PCL::MAKE-INSTANCE-FUNCTION-TRAP PCL::EMIT-DEFAULT-ONLY ++ PCL::SAUT-NOT PCL::SAUT-CLASS-EQ COMMON-LISP::SLOT-VALUE ++ PCL::DESTRUCTURE PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P ++ PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL ++ PCL::CLASS-APPLICABLE-USING-CLASS-P PCL::SDFUN-FOR-CACHING ++ PCL::SET-FUNCTION-NAME)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) ++ PCL::ARG-INFO-NUMBER-REQUIRED PCL::CACHING-LIMIT-FN ++ PCL::PV-CACHE-LIMIT-FN PCL::ONE-INDEX-LIMIT-FN ++ PCL::PV-TABLE-PV-SIZE PCL::CACHE-COUNT PCL::DEFAULT-LIMIT-FN ++ PCL::CPD-COUNT PCL::CHECKING-LIMIT-FN ++ PCL::N-N-ACCESSORS-LIMIT-FN PCL::EARLY-CLASS-SIZE ++ PCL::FAST-INSTANCE-BOUNDP-INDEX)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) ++ PCL::POWER-OF-TWO-CEILING)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::GET-CACHE-FROM-CACHE)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM COMMON-LISP::T) ++ COMMON-LISP::FIXNUM) ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) PCL::FIELD-TYPE) ++ PCL::CACHE-FIELD)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) ++ (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) ++ PCL::PV-TABLE-CACHE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) + COMMON-LISP::T) +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| +- PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| + PCL::|(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| +- WALKER::WALK-PROG/PROG* +- PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- WALKER::WALK-BINDINGS-2 +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- WALKER::WALK-DO/DO* +- PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- PCL::|(FAST-METHOD DOCUMENTATION (T))| ++ WALKER::WALK-TEMPLATE PCL::|(FAST-METHOD PRINT-OBJECT (T T))| ++ WALKER::WALK-DO/DO* PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR + PCL::|(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| +- PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ WALKER::WALK-LET/LET* ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| + PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| +- PCL::INITIALIZE-INSTANCE-SIMPLE PCL::BOOTSTRAP-SET-SLOT +- PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| +- PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| +- PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| +- PCL::FILL-CACHE-P +- PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| ++ PCL::INITIALIZE-INSTANCE-SIMPLE ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| ++ PCL::EXPAND-SYMBOL-MACROLET-INTERNAL + PCL::|(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- PCL::OPTIMIZE-WRITER PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-TYPE +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL +- PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| + PCL::MAKE-EFFECTIVE-METHOD-FUNCTION1 +- PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| +- PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| + PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- PCL::ADJUST-CACHE +- PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- PCL::LOAD-PRECOMPILED-DFUN-CONSTRUCTOR +- PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| + PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- PCL::MEMF-TEST-CONVERTER + PCL::|(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- WALKER::WALK-TEMPLATE PCL::TWO-CLASS-DFUN-INFO +- PCL::EXPAND-CACHE ++ PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| ++ PCL::|(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::|(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| + PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::MAKE-DISPATCH-LAMBDA ++ PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::EXPAND-DEFCLASS ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ PCL::OPTIMIZE-WRITER ++ PCL::|(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD DOCUMENTATION (T))| ++ PCL::|(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| + PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- PCL::|(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- PCL::GET-WRAPPERS-FROM-CLASSES +- PCL::|(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- PCL::LOAD-PRECOMPILED-IIS-ENTRY +- PCL::|(FAST-METHOD PRINT-OBJECT (T T))| +- PCL::EXPAND-SYMBOL-MACROLET-INTERNAL +- PCL::MAYBE-EXPAND-ACCESSOR-FORM ++ PCL::OPTIMIZE-READER WALKER::WALK-PROG/PROG* ++ PCL::BOOTSTRAP-SET-SLOT + PCL::EMIT-CHECKING-OR-CACHING-FUNCTION-PRELIMINARY +- PCL::|(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| +- PCL::|(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ PCL::TWO-CLASS-DFUN-INFO ++ PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))| ++ PCL::|(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ PCL::ADJUST-CACHE ++ PCL::|(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ PCL::EXPAND-CACHE ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| ++ PCL::|(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD PRINT-OBJECT (CLASS T))| ++ PCL::|(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| ++ PCL::|(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ PCL::|(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| ++ PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| + PCL::|(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| +- PCL::EXPAND-DEFCLASS +- PCL::|(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- WALKER::WALK-LET/LET* PCL::MAKE-DISPATCH-LAMBDA ++ PCL::GET-WRAPPERS-FROM-CLASSES ++ PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ PCL::MAYBE-EXPAND-ACCESSOR-FORM WALKER::WALK-BINDINGS-2 ++ PCL::FILL-CACHE-P PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-INTERNAL + PCL::|(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| +- PCL::OPTIMIZE-READER +- PCL::|(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- PCL::|(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- PCL::|(FAST-METHOD MAKE-INSTANCE (CLASS))|)) ++ PCL::|(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ PCL::|(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ PCL::|(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| ++ PCL::LOAD-PRECOMPILED-IIS-ENTRY PCL::MEMF-TEST-CONVERTER ++ PCL::|(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))|)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::REAL-ADD-NAMED-METHOD PCL::EARLY-ADD-NAMED-METHOD ++ PCL::FILL-DFUN-CACHE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- PCL::OPTIMIZE-SET-SLOT-VALUE +- PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- PCL::PRINT-CACHE WALKER::WALK-UNEXPECTED-DECLARE +- ITERATE::OPTIMIZE-ITERATE-FORM +- PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- WALKER::WALK-MULTIPLE-VALUE-SETQ PCL::FIRST-FORM-TO-LISP +- PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| +- WALKER::WALK-LABELS +- PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- PCL::ONE-CLASS-DFUN-INFO PCL::GET-FUNCTION-GENERATOR +- WALKER::RELIST-INTERNAL PCL::NOTE-PV-TABLE-REFERENCE +- WALKER::WALK-LAMBDA PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS +- PCL::ONE-INDEX-DFUN-INFO PCL::MAP-ALL-ORDERS +- PCL::OPTIMIZE-GF-CALL-INTERNAL PCL::COMPUTE-PRECEDENCE +- WALKER::WALK-DO PCL::PRINT-STD-INSTANCE +- PCL::OBSOLETE-INSTANCE-TRAP PCL::SORT-APPLICABLE-METHODS +- PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- PCL::EMIT-GREATER-THAN-1-DLAP +- PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- WALKER::WALK-FLET +- PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| +- PCL::|SETF PCL PLIST-VALUE| WALKER::WALK-PROG* +- WALKER::VARIABLE-DECLARATION +- PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| +- PCL::SKIP-FAST-SLOT-ACCESS-P PCL::SET-FUNCTION-NAME-1 +- WALKER::WALK-MACROLET PCL::CAN-OPTIMIZE-ACCESS +- WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL +- PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P +- PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- PCL::EMIT-BOUNDP-CHECK PCL::|SETF PCL METHOD-FUNCTION-GET| ++ PCL::OBSOLETE-INSTANCE-TRAP + PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| +- PCL::MAKE-METHOD-SPEC PCL::FLUSH-CACHE-TRAP WALKER::WALK-IF +- PCL::OPTIMIZE-SLOT-BOUNDP +- PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD +- WALKER::WALK-MULTIPLE-VALUE-BIND +- ITERATE::RENAME-AND-CAPTURE-VARIABLES WALKER::WALK-LET* +- WALKER::WALK-DO* +- PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- PCL::INVALIDATE-WRAPPER +- PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ WALKER::WALK-TAGBODY ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ PCL::ENTRY-IN-CACHE-P WALKER::WALK-COMPILER-LET + PCL::|(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| +- PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION +- ITERATE::SIMPLE-EXPAND-GATHERING-FORM PCL::ENTRY-IN-CACHE-P +- WALKER::WALK-LOCALLY PCL::OPTIMIZE-SLOT-VALUE ++ PCL::NOTE-PV-TABLE-REFERENCE PCL::COMPUTE-EFFECTIVE-METHOD ++ PCL::MAKE-DFUN-CALL PCL::|SETF PCL PLIST-VALUE| ++ PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| ++ PCL::|(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ WALKER::WALK-UNEXPECTED-DECLARE + PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL ++ PCL::SKIP-FAST-SLOT-ACCESS-P PCL::SET-FUNCTION-NAME-1 ++ WALKER::WALK-DO PCL::EMIT-1-T-DLAP PCL::PRINT-STD-INSTANCE ++ PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ WALKER::WALK-LAMBDA PCL::MAKE-METHOD-SPEC ++ PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| ++ PCL::OPTIMIZE-SET-SLOT-VALUE ++ PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::EXPAND-DEFGENERIC WALKER::VARIABLE-DECLARATION ++ ITERATE::RENAME-AND-CAPTURE-VARIABLES ++ PCL::|(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ PCL::MAP-ALL-ORDERS ++ PCL::|(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| ++ PCL::DECLARE-STRUCTURE WALKER::WALK-PROG ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ PCL::OPTIMIZE-SLOT-VALUE WALKER::WALK-MULTIPLE-VALUE-BIND + PCL::|(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| ++ PCL::STANDARD-COMPUTE-EFFECTIVE-METHOD WALKER::WALK-LOCALLY ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| ++ WALKER::WALK-DO* + PCL::|(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ PCL::MAKE-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::EMIT-BOUNDP-CHECK WALKER::RECONS ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| ++ PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| ++ WALKER::WALK-LET* WALKER::WALK-TAGBODY-1 PCL::FLUSH-CACHE-TRAP ++ WALKER::WALK-FLET ++ PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| ++ PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ PCL::PRINT-CACHE + PCL::|(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| +- PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- PCL::TRACE-EMF-CALL-INTERNAL WALKER::WALK-SYMBOL-MACROLET +- PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| +- PCL::CONVERT-TABLE ++ PCL::INVALIDATE-WRAPPER PCL::GET-NEW-FUNCTION-GENERATOR ++ ITERATE::OPTIMIZE-ITERATE-FORM WALKER::RELIST-INTERNAL ++ PCL::CAN-OPTIMIZE-ACCESS PCL::MAKE-TOP-LEVEL-FORM + PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ WALKER::WALK-MULTIPLE-VALUE-SETQ WALKER::WALK-LABELS ++ PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ PCL::|(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| ++ PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| ++ WALKER::WALK-SETQ WALKER::WALK-LET ++ PCL::|SETF PCL METHOD-FUNCTION-GET| WALKER::WALK-IF ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| ++ ITERATE::SIMPLE-EXPAND-GATHERING-FORM ++ PCL::|(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ WALKER::WALK-NAMED-LAMBDA PCL::FIRST-FORM-TO-LISP ++ PCL::ONE-CLASS-DFUN-INFO ++ WALKER::WITH-AUGMENTED-ENVIRONMENT-INTERNAL ++ PCL::EMIT-GREATER-THAN-1-DLAP PCL::CONVERT-TABLE ++ PCL::|(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| + PCL::INITIALIZE-INTERNAL-SLOT-GFS* ++ ITERATE::OPTIMIZE-GATHERING-FORM ++ PCL::|(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ PCL::OPTIMIZE-SLOT-BOUNDP ++ PCL::|(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| ++ PCL::WRAP-METHOD-GROUP-SPECIFIER-BINDINGS ++ WALKER::WALK-SYMBOL-MACROLET ITERATE::VARIABLE-SAME-P ++ PCL::EMIT-SLOT-READ-FORM ++ PCL::SKIP-OPTIMIZE-SLOT-VALUE-BY-CLASS-P ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ PCL::GET-FUNCTION-GENERATOR ++ PCL::MAKE-OPTIMIZED-STD-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::FIX-SLOT-ACCESSORS + PCL::|(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| +- PCL::|(FAST-METHOD CLASS-PREDICATE-NAME (T))| +- PCL::|(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- PCL::MAKE-OPTIMIZED-STD-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION + PCL::|(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| +- PCL::|(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| +- PCL::|(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- WALKER::WALK-SETQ PCL::EXPAND-DEFGENERIC +- PCL::|(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| +- ITERATE::OPTIMIZE-GATHERING-FORM PCL::FIX-SLOT-ACCESSORS +- PCL::EMIT-SLOT-READ-FORM WALKER::WALK-PROG +- PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- WALKER::WALK-NAMED-LAMBDA PCL::GET-NEW-FUNCTION-GENERATOR +- PCL::|(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- WALKER::WALK-TAGBODY +- PCL::|(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| +- WALKER::WALK-COMPILER-LET PCL::DECLARE-STRUCTURE +- WALKER::WALK-LET ITERATE::VARIABLE-SAME-P +- PCL::|(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- PCL::EMIT-1-T-DLAP PCL::MAKE-DFUN-CALL +- PCL::COMPUTE-EFFECTIVE-METHOD PCL::SORT-METHODS +- WALKER::WALK-TAGBODY-1 ++ PCL::OPTIMIZE-GF-CALL-INTERNAL ++ PCL::|(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| + PCL::|(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| ++ PCL::|(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ PCL::|(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| + PCL::|(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- PCL::|(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| +- PCL::MAKE-TOP-LEVEL-FORM +- PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- WALKER::RECONS)) ++ PCL::|(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ WALKER::WALK-PROG* PCL::ONE-INDEX-DFUN-INFO ++ PCL::COMPUTE-PRECEDENCE PCL::TRACE-EMF-CALL-INTERNAL ++ WALKER::WALK-MACROLET)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::MAKE-DEFMETHOD-FORM-INTERNAL PCL::LOAD-DEFMETHOD ++ PCL::EARLY-MAKE-A-METHOD PCL::MAKE-DEFMETHOD-FORM)) ++(COMMON-LISP::PROCLAIM ++ '(COMMON-LISP::FTYPE ++ (COMMON-LISP::FUNCTION ++ (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::T) ++ PCL::GET-EFFECTIVE-METHOD-FUNCTION1 ++ PCL::ENSURE-GENERIC-FUNCTION-USING-CLASS ++ PCL::MAKE-EMF-FROM-METHOD ++ PCL::REAL-ENSURE-GF-USING-CLASS--NULL PCL::PROBE-CACHE ++ PCL::MAP-CACHE PCL::GET-DECLARATION ++ PCL::REAL-ENSURE-GF-USING-CLASS--GENERIC-FUNCTION ++ WALKER::CONVERT-MACRO-TO-LAMBDA ++ PCL::EXPAND-EFFECTIVE-METHOD-FUNCTION PCL::EMIT-MISS ++ PCL::GET-METHOD-FUNCTION-PV-CELL PCL::METHOD-FUNCTION-GET ++ PCL::FIND-CLASS-FROM-CELL PCL::RECORD-DEFINITION ++ PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION1 ++ PCL::FIND-CLASS-PREDICATE-FROM-CELL ++ PCL::NAMED-OBJECT-PRINT-FUNCTION ++ PCL::PRECOMPUTE-EFFECTIVE-METHODS PCL::INITIALIZE-INFO ++ PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) +- PCL::UPDATE-SLOTS-IN-PV PCL::MAKE-INSTANCE-FUNCTION-COMPLEX +- PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 + PCL::GET-MAKE-INSTANCE-FUNCTION-INTERNAL +- PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| +- PCL::MAKE-INSTANCE-FUNCTION-SIMPLE +- PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| +- PCL::COMPUTE-PV-SLOT PCL::MAKE-METHOD-INITARGS-FORM-INTERNAL1 +- PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| +- PCL::OPTIMIZE-INSTANCE-ACCESS +- PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 PCL::MAKE-EMF-CACHE ++ PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| ++ PCL::MAKE-FGEN + PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| +- PCL::REAL-MAKE-METHOD-INITARGS-FORM ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS ++ PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::OPTIMIZE-ACCESSOR-CALL ++ PCL::MAKE-INSTANCE-FUNCTION-COMPLEX PCL::UPDATE-SLOTS-IN-PV ++ PCL::COMPUTE-PV-SLOT + PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| ++ PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| + PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T T))| ++ PCL::OPTIMIZE-INSTANCE-ACCESS ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ PCL::MAKE-INSTANCE-FUNCTION-SIMPLE ++ PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ PCL::OPTIMIZE-GENERIC-FUNCTION-CALL ++ PCL::LOAD-FUNCTION-GENERATOR WALKER::WALK-BINDINGS-1 + PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL +- PCL::BOOTSTRAP-MAKE-SLOT-DEFINITIONS +- PCL::|(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| ++ PCL::REAL-MAKE-METHOD-INITARGS-FORM ++ PCL::|(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| ++ PCL::|(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ WALKER::WALK-TEMPLATE-HANDLE-REPEAT + PCL::MAKE-PARAMETER-REFERENCES +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ PCL::|(FAST-METHOD SLOT-UNBOUND (T T T))| + PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| ++ PCL::EXPAND-EMF-CALL-METHOD ++ PCL::|(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| ++ PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| + PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| + PCL::|(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::OPTIMIZE-ACCESSOR-CALL +- WALKER::WALK-TEMPLATE-HANDLE-REPEAT WALKER::WALK-BINDINGS-1 + PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS1 +- PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::MAKE-FGEN +- PCL::|(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- PCL::|(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- PCL::OPTIMIZE-GENERIC-FUNCTION-CALL +- PCL::LOAD-FUNCTION-GENERATOR PCL::MAKE-EMF-CACHE +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- PCL::|(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::EXPAND-EMF-CALL-METHOD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::EXPAND-DEFMETHOD PCL::LOAD-DEFMETHOD-INTERNAL)) ++ PCL::MAKE-FINAL-ORDINARY-DFUN-INTERNAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::*) + COMMON-LISP::T) +- PCL::FILL-CACHE PCL::CAN-OPTIMIZE-ACCESS1 PCL::MAKE-EMF-CALL ++ PCL::GET-METHOD WALKER::WALK-ARGLIST PCL::REAL-GET-METHOD + PCL::EMIT-FETCH-WRAPPER PCL::CHECK-INITARGS-2-LIST +- PCL::GET-METHOD PCL::CHECK-INITARGS-2-PLIST +- PCL::CHECK-INITARGS-1 PCL::REAL-GET-METHOD +- WALKER::WALK-ARGLIST)) ++ PCL::FILL-CACHE PCL::CHECK-INITARGS-2-PLIST PCL::MAKE-EMF-CALL ++ PCL::CHECK-INITARGS-1 PCL::CAN-OPTIMIZE-ACCESS1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +@@ -605,394 +778,250 @@ + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::LOAD-DEFMETHOD PCL::MAKE-DEFMETHOD-FORM +- PCL::EARLY-MAKE-A-METHOD PCL::MAKE-DEFMETHOD-FORM-INTERNAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) + COMMON-LISP::T) ++ PCL::REAL-LOAD-DEFCLASS PCL::LOAD-DEFCLASS PCL::SET-ARG-INFO1 ++ PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION PCL::EMIT-SLOT-ACCESS ++ WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 PCL::OPTIMIZE-GF-CALL + PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::SET-ARG-INFO1 PCL::BOOTSTRAP-MAKE-SLOT-DEFINITION +- PCL::LOAD-DEFCLASS PCL::REAL-LOAD-DEFCLASS +- PCL::OPTIMIZE-GF-CALL WALKER::WALK-TEMPLATE-HANDLE-REPEAT-1 +- PCL::EMIT-SLOT-ACCESS PCL::MAKE-EARLY-CLASS-DEFINITION)) ++ PCL::MAKE-EARLY-CLASS-DEFINITION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) ++ COMMON-LISP::FIXNUM) + COMMON-LISP::T) +- PCL::EMIT-DLAP PCL::GET-SECONDARY-DISPATCH-FUNCTION1)) ++ PCL::GET-CACHE PCL::FILL-CACHE-FROM-CACHE-P)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::EARLY-ADD-NAMED-METHOD PCL::FILL-DFUN-CACHE +- PCL::REAL-ADD-NAMED-METHOD)) ++ (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) ++ COMMON-LISP::FIXNUM) ++ PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::BOOTSTRAP-INITIALIZE-CLASS)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::T) ++ PCL::EVAL-FORM PCL::EARLY-CLASS-NAME-OF PCL::DFUN-INFO-CACHE ++ PCL::MAKE-CONSTANT-FUNCTION PCL::EXPAND-SHORT-DEFCOMBIN ++ PCL::COPY-CACHE PCL::PROCLAIM-INCOMPATIBLE-SUPERCLASSES ++ PCL::MAKE-INITIAL-DFUN PCL::ECD-METACLASS ++ PCL::EXTRACT-SPECIALIZER-NAMES PCL::GBOUNDP ++ PCL::GET-SETF-FUNCTION-NAME PCL::USE-CACHING-DFUN-P ++ PCL::INITIALIZE-INFO-CACHED-CONSTANTS ++ PCL::STRUCTURE-TYPE-INTERNAL-SLOTDS COMMON-LISP::CLASS-OF ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-NIL-FUNCTION ++ PCL::ARG-INFO-KEY/REST-P PCL::METHOD-CALL-CALL-METHOD-ARGS ++ PCL::FGEN-GENSYMS PCL::EARLY-CLASS-PRECEDENCE-LIST ++ PCL::EARLY-SLOT-DEFINITION-LOCATION ++ PCL::EXPAND-MAKE-INSTANCE-FORM PCL::INTERN-EQL-SPECIALIZER ++ PCL::METHOD-FUNCTION-METHOD PCL::FGEN-GENERATOR-LAMBDA ++ PCL::SLOT-READER-SYMBOL PCL::CACHING-P ++ PCL::EARLY-METHOD-QUALIFIERS ++ PCL::EARLY-COLLECT-DEFAULT-INITARGS PCL::KEYWORD-SPEC-NAME ++ PCL::ONE-INDEX-P PCL::COMPLICATED-INSTANCE-CREATION-METHOD ++ PCL::DFUN-ARG-SYMBOL PCL::N-N-CACHE ++ PCL::ONE-INDEX-DFUN-INFO-INDEX PCL::INITIAL-DISPATCH-CACHE ++ PCL::CPD-CLASS PCL::FAST-METHOD-CALL-ARG-INFO ++ PCL::MAKE-PV-TYPE-DECLARATION PCL::COMPUTE-STD-CPL-PHASE-2 ++ PCL::GET-BUILT-IN-CLASS-SYMBOL ++ PCL::INITIALIZE-INFO-CACHED-RI-VALID-P ++ PCL::UPDATE-GFS-OF-CLASS PCL::STRUCTURE-SVUC-METHOD ++ PCL::SLOT-BOUNDP-SYMBOL PCL::FGEN-SYSTEM ++ PCL::FIND-CYCLE-REASONS ITERATE::SEQUENCE-ACCESSOR ++ PCL::GF-INFO-C-A-M-EMF-STD-P PCL::STRUCTURE-TYPE-P ++ PCL::TWO-CLASS-CACHE PCL::METHOD-LL->GENERIC-FUNCTION-LL ++ PCL::ONE-CLASS-ACCESSOR-TYPE PCL::WRAPPER-FOR-STRUCTURE ++ PCL::ACCESSOR-DFUN-INFO-CACHE PCL::%SYMBOL-FUNCTION ++ PCL::STRUCTURE-TYPE PCL::NET-TEST-CONVERTER ++ PCL::CONSTANT-SYMBOL-P PCL::GMAKUNBOUND PCL::INITIAL-P ++ PCL::GF-DFUN-CACHE PCL::STRUCTURE-SLOTD-TYPE ++ PCL::%STD-INSTANCE-WRAPPER PCL::INITIALIZE-INFO-P ++ PCL::CACHING-DFUN-INFO ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::FAST-METHOD-CALL-P PCL::GF-DFUN-INFO ++ PCL::INITIALIZE-INFO-BOUND-SLOTS PCL::ECD-CLASS-NAME ++ PCL::MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::INITIALIZE-INFO-CACHED-DEFAULT-INITARGS-FUNCTION ++ PCL::STD-INSTANCE-P PCL::EXTRACT-PARAMETERS ++ WALKER::GET-WALKER-TEMPLATE PCL::SYMBOL-PKG-NAME ++ PCL::CCLOSUREP PCL::LOOKUP-FGEN PCL::CPD-SUPERS ++ PCL::ARG-INFO-KEYWORDS PCL::DISPATCH-P ++ PCL::INITIALIZE-INFO-CACHED-NEW-KEYS ++ PCL::MAKE-CALLS-TYPE-DECLARATION PCL::INITIALIZE-INFO-WRAPPER ++ PCL::%FBOUNDP PCL::DEFAULT-STRUCTURE-INSTANCE-P ++ WALKER::ENV-WALK-FORM PCL::EARLY-CLASS-DEFINITION ++ PCL::SORT-CALLS PCL::EARLY-METHOD-STANDARD-ACCESSOR-SLOT-NAME ++ PCL::DISPATCH-CACHE PCL::INITIALIZE-INFO-KEY ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SLOT-BOUNDP-USING-CLASS-METHOD-FUNCTION ++ PCL::ARG-INFO-METATYPES PCL::GF-LAMBDA-LIST ++ WALKER::ENV-LEXICAL-VARIABLES PCL::ACCESSOR-DFUN-INFO-P ++ PCL::GF-PRECOMPUTE-DFUN-AND-EMF-P PCL::COMPUTE-LINE-SIZE ++ PCL::INITIALIZE-INFO-CACHED-SHARED-INITIALIZE-T-FUNCTION ++ PCL::FORCE-CACHE-FLUSHES PCL::TWO-CLASS-P PCL::DFUN-INFO-P ++ PCL::MAP-SPECIALIZERS PCL::MAKE-PERMUTATION-VECTOR ++ WALKER::ENV-LOCK PCL::CPD-AFTER PCL::EARLY-CLASS-SLOTS ++ PCL::GET-PV-CELL-FOR-CLASS PCL::ARG-INFO-P ++ PCL::EXTRACT-REQUIRED-PARAMETERS ++ PCL::STRUCTURE-SLOTD-READER-FUNCTION PCL::COMPUTE-CLASS-SLOTS ++ PCL::INFORM-TYPE-SYSTEM-ABOUT-STD-CLASS ++ PCL::TWO-CLASS-WRAPPER0 ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::COMPILE-LAMBDA-UNCOMPILED PCL::EARLY-CLASS-NAME ++ PCL::SFUN-P PCL::EXTRACT-LAMBDA-LIST PCL::UNDEFMETHOD-1 ++ PCL::ONE-INDEX-DFUN-INFO-ACCESSOR-TYPE PCL::WRAPPER-OF ++ PCL::ARG-INFO-LAMBDA-LIST PCL::LIST-DFUN ++ PCL::NEXT-WRAPPER-FIELD PCL::CHECK-WRAPPER-VALIDITY ++ PCL::STRUCTURE-SLOTD-NAME PCL::BUILT-IN-WRAPPER-OF ++ PCL::GET-MAKE-INSTANCE-FUNCTIONS ++ PCL::GENERIC-CLOBBERS-FUNCTION PCL::NO-METHODS-P ++ PCL::CONSTANT-VALUE-P WALKER::ENV-WALK-FUNCTION ++ PCL::INITIAL-CACHE PCL::SLOT-INITARGS-FROM-STRUCTURE-SLOTD ++ PCL::MAKE-CLASS-EQ-PREDICATE ++ PCL::GET-MAKE-INSTANCE-FUNCTION-SYMBOL ++ PCL::BOOTSTRAP-ACCESSOR-DEFINITIONS ++ PCL::FUNCTION-PRETTY-ARGLIST ++ PCL::MAKE-OPTIMIZED-STRUCTURE-SETF-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION ++ PCL::FTYPE-DECLARATION-FROM-LAMBDA-LIST PCL::TYPE-CLASS ++ PCL::CHECK-CACHE PCL::STANDARD-SVUC-METHOD ++ PCL::STRUCTURE-SLOTD-ACCESSOR-SYMBOL PCL::GF-INFO-FAST-MF-P ++ PCL::STRUCTURE-SLOTD-WRITER-FUNCTION ++ PCL::BOOTSTRAP-CLASS-PREDICATES PCL::DEFAULT-METHOD-ONLY-CACHE ++ PCL::GET-CACHE-VECTOR PCL::SLOT-WRITER-SYMBOL ++ PCL::FGEN-GENERATOR PCL::DNET-METHODS-P ++ PCL::DEFAULT-STRUCTURE-TYPE ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITARGS-FORM-LIST ++ PCL::N-N-ACCESSOR-TYPE ++ PCL::STRUCTURE-TYPE-SLOT-DESCRIPTION-LIST ++ WALKER::ENV-DECLARATIONS WALKER::VARIABLE-GLOBALLY-SPECIAL-P ++ PCL::ONE-INDEX-INDEX PCL::ONE-INDEX-DFUN-INFO-CACHE ++ PCL::EARLY-ACCESSOR-METHOD-SLOT-NAME PCL::EARLY-CLASS-SLOTDS ++ PCL::CANONICAL-SLOT-NAME PCL::EARLY-COLLECT-CPL ++ PCL::RESET-CLASS-INITIALIZE-INFO-1 ++ PCL::BUILT-IN-OR-STRUCTURE-WRAPPER1 PCL::ONE-INDEX-CACHE ++ PCL::MAKE-STRUCTURE-SLOT-BOUNDP-FUNCTION ++ PCL::MAKE-TYPE-PREDICATE PCL::FREE-CACHE ++ ITERATE::VARIABLES-FROM-LET ++ PCL::EARLY-METHOD-STANDARD-ACCESSOR-P ++ PCL::DEFAULT-CONSTANT-CONVERTER PCL::CLASS-PREDICATE ++ PCL::CHECKING-CACHE PCL::ARG-INFO-PRECEDENCE ++ PCL::METHOD-FUNCTION-NEEDS-NEXT-METHODS-P ++ PCL::DEFAULT-METHOD-ONLY-P ++ PCL::COMPUTE-APPLICABLE-METHODS-EMF-STD-P ++ PCL::STRUCTURE-SLOT-BOUNDP PCL::ONE-INDEX-ACCESSOR-TYPE ++ PCL::TWO-CLASS-ACCESSOR-TYPE ++ PCL::USE-DEFAULT-METHOD-ONLY-DFUN-P PCL::METHOD-CALL-P ++ PCL::UPDATE-CLASS-CAN-PRECEDE-P PCL::CONSTANT-VALUE-DFUN-INFO ++ PCL::COMPILE-LAMBDA-DEFERRED PCL::SETFBOUNDP ++ PCL::CLASS-HAS-A-FORWARD-REFERENCED-SUPERCLASS-P ++ PCL::PV-TABLEP PCL::STRUCTURE-OBJECT-P PCL::TWO-CLASS-INDEX ++ PCL::METHOD-FUNCTION-PV-TABLE PCL::ECD-OTHER-INITARGS ++ WALKER::GET-IMPLEMENTATION-DEPENDENT-WALKER-TEMPLATE ++ PCL::EARLY-GF-P PCL::STRUCTURE-SLOTD-INIT-FORM ++ PCL::FUNCALLABLE-INSTANCE-P PCL::CHECKING-FUNCTION ++ PCL::FUNCTION-RETURNING-NIL PCL::FUNCTION-RETURNING-T ++ PCL::UPDATE-C-A-M-GF-INFO PCL::COUNT-DFUN ++ PCL::UNPARSE-SPECIALIZERS PCL::CACHE-OWNER ++ PCL::EARLY-METHOD-CLASS ++ PCL::INITIALIZE-INFO-CACHED-COMBINED-INITIALIZE-FUNCTION ++ PCL::EARLY-SLOT-DEFINITION-NAME ++ PCL::GET-MAKE-INSTANCE-FUNCTION ++ PCL::STRUCTURE-TYPE-INCLUDED-TYPE-NAME ++ PCL::ECD-SUPERCLASS-NAMES PCL::GFS-OF-TYPE PCL::SORT-SLOTS ++ PCL::DO-STANDARD-DEFSETFS-FOR-DEFCLASS ++ PCL::COMPUTE-MCASE-PARAMETERS PCL::METHOD-FUNCTION-PLIST ++ PCL::ARG-INFO-NKEYS PCL::FINAL-ACCESSOR-DFUN-TYPE ++ PCL::EARLY-COLLECT-SLOTS PCL::EARLY-METHOD-LAMBDA-LIST ++ PCL::FAST-INSTANCE-BOUNDP-P PCL::GDEFINITION ++ PCL::%CCLOSURE-ENV SYSTEM::%COMPILED-FUNCTION-NAME ++ PCL::RESET-INITIALIZE-INFO PCL::ARG-INFO-NUMBER-OPTIONAL ++ PCL::RESET-CLASS-INITIALIZE-INFO ++ PCL::INITIALIZE-INFO-CACHED-VALID-P PCL::INTERNED-SYMBOL-P ++ PCL::EARLY-GF-NAME PCL::FGEN-TEST PCL::MAKE-INITFUNCTION ++ PCL::MAP-ALL-GENERIC-FUNCTIONS PCL::SHOW-DFUN-COSTS ++ PCL::CLASS-FROM-TYPE PCL::EXPAND-LONG-DEFCOMBIN ++ PCL::MAKE-DEFAULT-METHOD-GROUP-DESCRIPTION ++ PCL::FREE-CACHE-VECTOR PCL::%STD-INSTANCE-SLOTS ++ PCL::ALLOCATE-CACHE-VECTOR PCL::ONE-CLASS-P ++ PCL::CLASS-PRECEDENCE-DESCRIPTION-P PCL::SLOT-VECTOR-SYMBOL ++ PCL::INITIALIZE-INFO-CACHED-MAKE-INSTANCE-FUNCTION ++ PCL::ONE-CLASS-WRAPPER0 PCL::N-N-P ++ PCL::UPDATE-ALL-C-A-M-GF-INFO PCL::CHECKING-P ++ PCL::TWO-CLASS-WRAPPER1 PCL::PARSE-SPECIALIZERS ++ PCL::FORMAT-CYCLE-REASONS PCL::FLUSH-CACHE-VECTOR-INTERNAL ++ PCL::UNENCAPSULATED-FDEFINITION PCL::ONE-CLASS-INDEX ++ PCL::DEFAULT-CONSTANTP PCL::UPDATE-GF-INFO ++ PCL::ACCESSOR-DFUN-INFO-ACCESSOR-TYPE ++ PCL::INITIALIZE-INFO-CACHED-INITARGS-FORM-LIST ++ PCL::MAKE-EQL-PREDICATE PCL::ARG-INFO-VALID-P ++ PCL::CACHING-CACHE PCL::METHOD-FUNCTION-FROM-FAST-FUNCTION ++ PCL::FAST-METHOD-CALL-NEXT-METHOD-CALL ++ PCL::DEFAULT-SECONDARY-DISPATCH-FUNCTION ++ PCL::MAKE-FUNCTION-INLINE PCL::STORE-FGEN ++ PCL::LIST-LARGE-CACHE PCL::METHODS-CONTAIN-EQL-SPECIALIZER-P ++ PCL::ARG-INFO-APPLYP SYSTEM::%STRUCTURE-NAME ++ PCL::GF-INFO-SIMPLE-ACCESSOR-TYPE PCL::ECD-SOURCE ++ PCL::EARLY-CLASS-DIRECT-SUBCLASSES ++ PCL::UPDATE-PV-TABLE-CACHE-INFO PCL::DEFAULT-TEST-CONVERTER ++ PCL::MAKE-CALL-METHODS PCL::GET-BUILT-IN-WRAPPER-SYMBOL ++ PCL::GF-INFO-STATIC-C-A-M-EMF PCL::DEFAULT-STRUCTUREP ++ PCL::CONSTANT-VALUE-CACHE PCL::INITIAL-DISPATCH-P ++ PCL::ECD-CANONICAL-SLOTS PCL::WRAPPER-FIELD ++ PCL::UPDATE-GF-SIMPLE-ACCESSOR-TYPE PCL::ONE-CLASS-CACHE ++ PCL::CACHING-DFUN-COST PCL::LEGAL-CLASS-NAME-P ++ PCL::INTERN-FUNCTION-NAME PCL::FAST-METHOD-CALL-PV-CELL ++ PCL::CACHE-P PCL::ONE-INDEX-DFUN-INFO-P ++ PCL::MAKE-PV-TABLE-TYPE-DECLARATION PCL::NO-METHODS-CACHE)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::FIXNUM) +- COMMON-LISP::T) +- PCL::COMPUTE-STD-CPL-PHASE-3)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::*) ++ PCL::UPDATE-MAKE-INSTANCE-FUNCTION-TABLE PCL::UNTRACE-METHOD ++ COMMON-LISP::METHOD-COMBINATION-ERROR ++ COMMON-LISP::INVALID-METHOD-ERROR PCL::LIST-LARGE-CACHES)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::FIXNUM) ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) + COMMON-LISP::T) +- PCL::FILL-CACHE-FROM-CACHE-P PCL::GET-CACHE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) +- PCL::PV-TABLE-CALL-LIST PCL::CACHE-OVERFLOW +- PCL::PV-TABLE-SLOT-NAME-LISTS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::COMPUTE-CACHE-PARAMETERS)) ++ PCL::EMIT-DLAP PCL::GET-SECONDARY-DISPATCH-FUNCTION1)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- PCL::FIND-FREE-CACHE-LINE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::BOOLEAN) +- PCL::CACHE-VALUEP)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::*) +- PCL::DEFAULT-CODE-CONVERTER PCL::EMIT-IN-CHECKING-CACHE-P +- PCL::METHOD-PROTOTYPE-FOR-GF PCL::EMIT-TWO-CLASS-WRITER +- PCL::PARSE-METHOD-GROUP-SPECIFIER PCL::EMIT-ONE-CLASS-WRITER +- PCL::EMIT-ONE-INDEX-WRITERS PCL::FIND-STRUCTURE-CLASS +- PCL::PROTOTYPES-FOR-MAKE-METHOD-LAMBDA PCL::MAKE-DISPATCH-DFUN +- PCL::COMPUTE-APPLICABLE-METHODS-EMF PCL::EARLY-METHOD-FUNCTION +- PCL::NET-CODE-CONVERTER PCL::GET-DISPATCH-FUNCTION +- PCL::STRUCTURE-WRAPPER PCL::FIND-WRAPPER PCL::CLASS-EQ-TYPE +- PCL::TYPE-FROM-SPECIALIZER PCL::SPECIALIZER-FROM-TYPE +- PCL::PCL-DESCRIBE PCL::PARSE-DEFMETHOD +- PCL::ANALYZE-LAMBDA-LIST PCL::EMIT-ONE-CLASS-READER +- PCL::EARLY-COLLECT-INHERITANCE PCL::GET-GENERIC-FUNCTION-INFO +- PCL::COMPILE-IIS-FUNCTIONS PCL::EMIT-CONSTANT-VALUE +- PCL::EMIT-ONE-INDEX-READERS PCL::GENERIC-FUNCTION-NAME-P +- PCL::CONVERT-TO-SYSTEM-TYPE PCL::MAKE-FINAL-DISPATCH-DFUN +- PCL::EMIT-TWO-CLASS-READER PCL::*NORMALIZE-TYPE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::*) COMMON-LISP::T) +- PCL::|__si::MAKE-CLASS-PRECEDENCE-DESCRIPTION| +- PCL::MAKE-FAST-INSTANCE-BOUNDP PCL::MAKE-INITIALIZE-INFO +- PCL::|STRUCTURE-OBJECT class constructor| +- PCL::|__si::MAKE-CACHE| PCL::|__si::MAKE-DEFAULT-METHOD-ONLY| +- PCL::TRUE PCL::|__si::MAKE-PV-TABLE| +- PCL::|__si::MAKE-ONE-INDEX| WALKER::UNBOUND-LEXICAL-FUNCTION +- PCL::|__si::MAKE-CHECKING| PCL::MAKE-PV-TABLE +- PCL::|__si::MAKE-NO-METHODS| PCL::MAKE-METHOD-CALL +- PCL::CALLED-FIN-WITHOUT-FUNCTION PCL::USE-PACKAGE-PCL +- PCL::INTERN-PV-TABLE PCL::|__si::MAKE-ACCESSOR-DFUN-INFO| +- PCL::|__si::MAKE-DISPATCH| +- PCL::|__si::MAKE-ONE-INDEX-DFUN-INFO| +- PCL::|__si::MAKE-ARG-INFO| PCL::FIX-EARLY-GENERIC-FUNCTIONS +- PCL::ZERO PCL::MAKE-PROGN PCL::|__si::MAKE-INITIAL| +- PCL::|__si::MAKE-ONE-CLASS| PCL::|__si::MAKE-DFUN-INFO| +- PCL::|__si::MAKE-CONSTANT-VALUE| +- PCL::|__si::MAKE-STD-INSTANCE| PCL::PV-WRAPPERS-FROM-PV-ARGS +- PCL::|__si::MAKE-TWO-CLASS| PCL::|__si::MAKE-N-N| +- PCL::|__si::MAKE-CACHING| PCL::FALSE PCL::STRING-APPEND +- PCL::|__si::MAKE-INITIAL-DISPATCH| PCL::MAKE-FAST-METHOD-CALL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::FIXNUM) +- PCL::ARG-INFO-NUMBER-REQUIRED PCL::PV-TABLE-PV-SIZE +- PCL::CACHE-COUNT PCL::PV-CACHE-LIMIT-FN PCL::CHECKING-LIMIT-FN +- PCL::CACHING-LIMIT-FN PCL::N-N-ACCESSORS-LIMIT-FN +- PCL::DEFAULT-LIMIT-FN PCL::EARLY-CLASS-SIZE PCL::CPD-COUNT +- PCL::ONE-INDEX-LIMIT-FN PCL::FAST-INSTANCE-BOUNDP-INDEX)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM) COMMON-LISP::T) +- PCL::POWER-OF-TWO-CEILING)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::*) ++ (COMMON-LISP::T COMMON-LISP::T ++ (COMMON-LISP::INTEGER -9223372036854775808 ++ 9223372036854775807)) + COMMON-LISP::T) +- PCL::MAKE-TYPE-PREDICATE-NAME PCL::MAKE-FINAL-DFUN +- PCL::CAPITALIZE-WORDS PCL::SET-DFUN ITERATE::MAYBE-WARN +- PCL::MAKE-EARLY-GF PCL::USE-DISPATCH-DFUN-P WALKER::RELIST +- PCL::MAKE-SPECIALIZABLE PCL::PV-TABLE-LOOKUP-PV-ARGS +- PCL::ALLOCATE-STANDARD-INSTANCE +- PCL::ALLOCATE-FUNCALLABLE-INSTANCE +- PCL::USE-CONSTANT-VALUE-DFUN-P ITERATE::FUNCTION-LAMBDA-P +- PCL::UPDATE-DFUN PCL::SET-ARG-INFO +- PCL::EARLY-METHOD-SPECIALIZERS PCL::MAKE-WRAPPER +- PCL::FIND-CLASS-CELL WALKER::WALKER-ENVIRONMENT-BIND-1 +- PCL::TRACE-METHOD WALKER::RELIST* COMMON-LISP::FIND-CLASS +- PCL::INITIALIZE-INTERNAL-SLOT-GFS PCL::FIND-CLASS-PREDICATE +- PCL::INITIALIZE-METHOD-FUNCTION)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::SAUT-NOT PCL::INVOKE-EMF PCL::SAUT-PROTOTYPE +- PCL::COMPUTE-CODE ITERATE::PARSE-DECLARATIONS +- PCL::SDFUN-FOR-CACHING +- PCL::COMPUTE-APPLICABLE-METHODS-USING-TYPES +- PCL::GET-NEW-FUNCTION-GENERATOR-INTERNAL +- PCL::SLOT-NAME-LISTS-FROM-SLOTS PCL::DESTRUCTURE +- PCL::SPLIT-DECLARATIONS PCL::MAKE-DIRECT-SLOTD +- PCL::FORM-LIST-TO-LISP PCL::EMIT-CHECKING +- PCL::CPL-FORWARD-REFERENCED-CLASS-ERROR PCL::COMPUTE-TEST +- PCL::SET-FUNCTION-NAME COMMON-LISP::SLOT-BOUNDP PCL::SAUT-AND +- PCL::EMIT-CACHING PCL::INITIAL-DFUN +- COMMON-LISP::SLOT-MAKUNBOUND COMMON-LISP::SLOT-VALUE +- PCL::UPDATE-SLOT-VALUE-GF-INFO +- PCL::CLASS-APPLICABLE-USING-CLASS-P +- PCL::CPL-INCONSISTENT-ERROR PCL::*SUBTYPEP +- PCL::SLOT-UNBOUND-INTERNAL +- PCL::GENERATE-FAST-CLASS-SLOT-ACCESS-P +- PCL::CHECK-INITARGS-VALUES PCL::ENSURE-CLASS-VALUES +- PCL::SAUT-EQL PCL::REAL-REMOVE-METHOD PCL::EMIT-DEFAULT-ONLY +- PCL::INSURE-DFUN PCL::EMIT-DEFAULT-ONLY-FUNCTION +- PCL::MUTATE-SLOTS-AND-CALLS PCL::FIND-SUPERCLASS-CHAIN +- PCL::SAUT-CLASS PCL::MAKE-INSTANCE-FUNCTION-TRAP +- PCL::SAUT-CLASS-EQ PCL::COMPUTE-STD-CPL-PHASE-1 +- PCL::SPECIALIZER-APPLICABLE-USING-TYPE-P)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::T) +- (COMMON-LISP::OR PCL::CACHE COMMON-LISP::NULL)) +- PCL::PV-TABLE-CACHE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::*) +- WALKER::WALK-DECLARATIONS PCL::GET-SECONDARY-DISPATCH-FUNCTION +- PCL::MAKE-ONE-INDEX-ACCESSOR-DFUN)) ++ PCL::COMPUTE-STD-CPL-PHASE-3)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T ++ COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::MAKE-SHARED-INITIALIZE-FORM-LIST PCL::ACCESSOR-MISS +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- PCL::|(FAST-METHOD NO-APPLICABLE-METHOD (T))| +- PCL::SET-CLASS-SLOT-VALUE-1 +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- PCL::|(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| +- PCL::GET-ACCESSOR-FROM-SVUC-METHOD-FUNCTION +- PCL::SETF-SLOT-VALUE-USING-CLASS-DFUN +- PCL::|(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- PCL::EMIT-CHECKING-OR-CACHING-FUNCTION +- PCL::MAKE-FINAL-ONE-INDEX-ACCESSOR-DFUN +- PCL::LOAD-SHORT-DEFCOMBIN PCL::EMIT-CHECKING-OR-CACHING +- PCL::|(FAST-METHOD MAKE-INSTANCE (SYMBOL))| +- PCL::MAKE-FINAL-CHECKING-DFUN +- PCL::|(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| +- PCL::ACCESSOR-VALUES +- PCL::|(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| +- PCL::REAL-MAKE-METHOD-LAMBDA +- PCL::|(FAST-METHOD CHANGE-CLASS (T SYMBOL))| +- PCL::GET-ACCESSOR-METHOD-FUNCTION +- PCL::|(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| +- PCL::ORDER-SPECIALIZERS +- PCL::|(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- PCL::GENERATE-DISCRIMINATION-NET +- PCL::|(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| +- PCL::|(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- PCL::MAKE-ONE-CLASS-ACCESSOR-DFUN +- PCL::|(FAST-METHOD DESCRIBE-OBJECT (T T))| +- PCL::BOOTSTRAP-ACCESSOR-DEFINITION +- PCL::INITIALIZE-INSTANCE-SIMPLE-FUNCTION)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::GET-OPTIMIZED-STD-ACCESSOR-METHOD-FUNCTION +- PCL::MAKE-OPTIMIZED-STD-WRITER-METHOD-FUNCTION +- PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| +- PCL::|(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- PCL::MAKE-OPTIMIZED-STD-BOUNDP-METHOD-FUNCTION +- PCL::CONVERT-METHODS WALKER::WALK-LET-IF +- PCL::EMIT-READER/WRITER-FUNCTION PCL::ACCESSOR-VALUES-INTERNAL +- PCL::|(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| +- PCL::LOAD-LONG-DEFCOMBIN PCL::CHECK-METHOD-ARG-INFO +- PCL::ACCESSOR-VALUES1 +- PCL::|(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- PCL::GENERATING-LISP PCL::MAKE-FINAL-N-N-ACCESSOR-DFUN +- WALKER::WALK-FORM-INTERNAL PCL::CONSTANT-VALUE-MISS +- PCL::SLOT-VALUE-USING-CLASS-DFUN PCL::CACHING-MISS +- PCL::|(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| +- PCL::SLOT-BOUNDP-USING-CLASS-DFUN PCL::CHECKING-MISS +- PCL::|(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| +- PCL::EMIT-READER/WRITER ITERATE::EXPAND-INTO-LET +- PCL::GET-CLASS-SLOT-VALUE-1 +- PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER-FUNCTION +- PCL::MAKE-FINAL-CACHING-DFUN +- PCL::|(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| +- PCL::|(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| +- PCL::GET-OPTIMIZED-STD-SLOT-VALUE-USING-CLASS-METHOD-FUNCTION +- PCL::|(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| +- PCL::OPTIMIZE-SLOT-VALUE-BY-CLASS-P PCL::SET-SLOT-VALUE +- PCL::EMIT-ONE-OR-N-INDEX-READER/WRITER +- ITERATE::RENAME-VARIABLES +- PCL::|(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- PCL::|(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| +- ITERATE::WALK-GATHERING-BODY PCL::CACHE-MISS-VALUES +- PCL::MAKE-OPTIMIZED-STD-READER-METHOD-FUNCTION +- PCL::MAKE-FINAL-CONSTANT-VALUE-DFUN)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::DO-SHORT-METHOD-COMBINATION PCL::MEMF-CODE-CONVERTER +- PCL::GENERATE-DISCRIMINATION-NET-INTERNAL +- PCL::|(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::MAKE-LONG-METHOD-COMBINATION-FUNCTION +- PCL::CACHE-MISS-VALUES-INTERNAL)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::T) +- COMMON-LISP::*) +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| +- PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| +- PCL::ADD-METHOD-DECLARATIONS +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| +- PCL::|(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- PCL::COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO-INTERNAL +- PCL::|(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- PCL::|(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| +- PCL::MAKE-TWO-CLASS-ACCESSOR-DFUN +- PCL::|(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- PCL::|(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- PCL::|(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| +- PCL::|(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| +- PCL::|(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- PCL::|(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- PCL::WALK-METHOD-LAMBDA +- PCL::|(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))|)) ++ COMMON-LISP::T) ++ PCL::EXPAND-DEFMETHOD PCL::LOAD-DEFMETHOD-INTERNAL)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE + (COMMON-LISP::FUNCTION + (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::*) +- COMMON-LISP::*) +- PCL::REAL-MAKE-A-METHOD)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- PCL::MAKE-DEFAULT-INITARGS-FORM-LIST +- PCL::GET-COMPLEX-INITIALIZATION-FUNCTIONS +- PCL::SLOT-VALUE-OR-DEFAULT +- PCL::GET-SIMPLE-INITIALIZATION-FUNCTION PCL::REAL-ADD-METHOD +- PCL::LOAD-DEFGENERIC PCL::CPL-ERROR +- PCL::MAKE-FINAL-ACCESSOR-DFUN PCL::MAKE-N-N-ACCESSOR-DFUN +- PCL::TYPES-FROM-ARGUMENTS PCL::MAKE-ACCESSOR-TABLE +- PCL::MAKE-CHECKING-DFUN WALKER::NESTED-WALK-FORM +- PCL::GET-EFFECTIVE-METHOD-FUNCTION +- PCL::COMPUTE-SECONDARY-DISPATCH-FUNCTION +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T + COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T) +- COMMON-LISP::*) +- ITERATE::ITERATE-TRANSFORM-BODY +- PCL::|(FAST-METHOD SLOT-MISSING (T T T T))| +- PCL::|(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))|)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::T COMMON-LISP::T +- COMMON-LISP::T COMMON-LISP::*) +- COMMON-LISP::*) +- PCL::MAKE-EFFECTIVE-METHOD-FUNCTION-SIMPLE1 +- ITERATE::RENAME-LET-BINDINGS)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::FIXNUM COMMON-LISP::FIXNUM COMMON-LISP::T) +- COMMON-LISP::FIXNUM) +- PCL::COMPUTE-PRIMARY-CACHE-LOCATION)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::FIXNUM COMMON-LISP::*) +- COMMON-LISP::T) +- PCL::COMPUTE-PRIMARY-CACHE-LOCATION-FROM-LOCATION +- PCL::GET-CACHE-FROM-CACHE)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION (COMMON-LISP::FIXNUM COMMON-LISP::T) +- COMMON-LISP::T) +- PCL::%CCLOSURE-ENV-NTHCDR)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION +- (COMMON-LISP::T COMMON-LISP::STREAM COMMON-LISP::T) ++ COMMON-LISP::*) + COMMON-LISP::T) +- PCL::PRINT-DFUN-INFO)) +-(COMMON-LISP::PROCLAIM +- '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::*) +- PCL::COUNT-ALL-DFUNS PCL::EMIT-N-N-WRITERS +- PCL::EMIT-N-N-READERS)) ++ PCL::BOOTSTRAP-INITIALIZE-CLASS)) + (COMMON-LISP::PROCLAIM + '(COMMON-LISP::FTYPE +- (COMMON-LISP::FUNCTION COMMON-LISP::NIL COMMON-LISP::FIXNUM) +- PCL::GET-WRAPPER-CACHE-NUMBER)) ++ (COMMON-LISP::FUNCTION (COMMON-LISP::T) COMMON-LISP::LIST) ++ PCL::PV-TABLE-CALL-LIST PCL::CACHE-OVERFLOW ++ PCL::PV-TABLE-SLOT-NAME-LISTS)) + (IN-PACKAGE "PCL") + +-(DOLIST (V '(|(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| +- |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-METHODS)| ++(DOLIST (V '(|(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT SLOTS)| + |(FAST-WRITER-METHOD SLOT-CLASS SLOTS)| + |(FAST-WRITER-METHOD SLOT-OBJECT DIRECT-SLOTS)| + |(FAST-WRITER-METHOD SLOT-CLASS DIRECT-SLOTS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-WRITER-METHOD SLOT-OBJECT METHODS)| + |(FAST-WRITER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT OPTIONS)| +@@ -1034,17 +1063,16 @@ + COMPATIBLE-META-CLASS-CHANGE-P + |(FAST-READER-METHOD SLOT-OBJECT CLASS-EQ-SPECIALIZER)| + |(FAST-READER-METHOD CLASS CLASS-EQ-SPECIALIZER)| +- |(BOUNDP READER-FUNCTION)| TRACE-METHOD-INTERNAL +- |(BOUNDP PREDICATE-NAME)| |(BOUNDP READERS)| +- UPDATE-GF-DFUN |(BOUNDP CLASS-PRECEDENCE-LIST)| ++ |(BOUNDP READER-FUNCTION)| |(BOUNDP PREDICATE-NAME)| ++ |(BOUNDP READERS)| UPDATE-GF-DFUN ++ |(BOUNDP CLASS-PRECEDENCE-LIST)| + |(BOUNDP ACCESSOR-FLAGS)| |(BOUNDP LOCATION)| + |(BOUNDP DOCUMENTATION)| SPECIALIZER-OBJECT + |(BOUNDP INCOMPATIBLE-SUPERCLASS-LIST)| + ACCESSOR-METHOD-SLOT-NAME |(BOUNDP SPECIALIZERS)| + |(BOUNDP IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DEFSTRUCT-ACCESSOR-SYMBOL)| +- REDEFINE-FUNCTION SPECIALIZER-CLASS +- |(BOUNDP PRETTY-ARGLIST)| ++ SPECIALIZER-CLASS |(BOUNDP PRETTY-ARGLIST)| + |PCL::PCL-CLASS class predicate| + |PCL::STD-CLASS class predicate| + |(BOUNDP DEFSTRUCT-FORM)| +@@ -1082,104 +1110,104 @@ + |(BOUNDP OPTIONS)| |(WRITER METHOD)| + |PCL::DEPENDENT-UPDATE-MIXIN class predicate| + GENERIC-FUNCTION-PRETTY-ARGLIST |(WRITER SOURCE)| ++ |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| + |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (SPECIALIZER-WITH-OBJECT))| + |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (SPECIALIZER-WITH-OBJECT))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| + |(FAST-METHOD UPDATE-INSTANCE-FOR-DIFFERENT-CLASS (STANDARD-OBJECT STANDARD-OBJECT))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE (SLOT-OBJECT))| + |(FAST-METHOD INITIALIZE-INSTANCE (SLOT-OBJECT))| +- |(FAST-METHOD SLOTS-TO-INSPECT (SLOT-CLASS SLOT-OBJECT))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| +- |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| + |(FAST-METHOD SPECIALIZER-CLASS (EQL-SPECIALIZER))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| + |(FAST-METHOD SAME-SPECIALIZER-P (EQL-SPECIALIZER EQL-SPECIALIZER))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS-EQ-SPECIALIZER CLASS-EQ-SPECIALIZER))| + |(FAST-METHOD SAME-SPECIALIZER-P (SPECIALIZER SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (CLASS-EQ-SPECIALIZER))| ++ |(FAST-METHOD SPECIALIZER-METHOD-TABLE (EQL-SPECIALIZER))| + MAKE-BOUNDP-METHOD-FUNCTION + |(FAST-METHOD (SETF DOCUMENTATION) (T DOCUMENTATION-MIXIN))| + |(FAST-METHOD DOCUMENTATION (DOCUMENTATION-MIXIN))| + |PCL::METAOBJECT class predicate| +- |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| ++ |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| + |(FAST-METHOD GENERIC-FUNCTION-PRETTY-ARGLIST (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| + |(FAST-METHOD GENERIC-FUNCTION-LAMBDA-LIST (GENERIC-FUNCTION))| ++ |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| + |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-WRITER-METHOD))| +- |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| +- |(FAST-METHOD GF-FAST-METHOD-FUNCTION-P (STANDARD-GENERIC-FUNCTION))| + |(FAST-METHOD ACCESSOR-METHOD-CLASS (STANDARD-ACCESSOR-METHOD))| +- |(FAST-METHOD METHOD-QUALIFIERS (STANDARD-METHOD))| +- |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| ++ |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| ++ |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| + |(FAST-METHOD REMOVE-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| + |(FAST-METHOD ADD-DIRECT-METHOD (SPECIALIZER-WITH-OBJECT METHOD))| +- |(FAST-METHOD INITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| ++ |(FAST-METHOD REMOVE-DIRECT-METHOD (CLASS METHOD))| + |(FAST-METHOD ADD-DIRECT-METHOD (CLASS METHOD))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD REINITIALIZE-INSTANCE (STANDARD-METHOD))| +- |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD METHOD-FUNCTION (STANDARD-METHOD))| +- |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (SYMBOL))| +- |(FAST-METHOD METHOD-SPECIALIZERS (TRACED-METHOD))| +- |(FAST-METHOD METHOD-LAMBDA-LIST (TRACED-METHOD))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD METHOD-PRETTY-ARGLIST (STANDARD-METHOD))| +- |(FAST-METHOD ACCESSOR-METHOD-SLOT-NAME (TRACED-METHOD))| +- |(FAST-METHOD COMPUTE-DISCRIMINATING-FUNCTION-ARGLIST-INFO (STANDARD-GENERIC-FUNCTION))| +- |(FAST-METHOD METHOD-QUALIFIERS (TRACED-METHOD))| +- |(FAST-METHOD FUNCTION-KEYWORDS (STANDARD-METHOD))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD (SETF DOCUMENTATION) (T STANDARD-SLOT-DEFINITION))| +- |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD CHANGE-CLASS (T SYMBOL))| + |(FAST-METHOD DOCUMENTATION (STANDARD-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-DEFINITION-ALLOCATION (STRUCTURE-SLOT-DEFINITION))| ++ |(FAST-METHOD INITIALIZE-INTERNAL-SLOT-FUNCTIONS (EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD MAKE-INSTANCE (SYMBOL))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| + |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| +- |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| +- |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| +- |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| +- |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| +- |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STRUCTURE-CLASS STRUCTURE-OBJECT STRUCTURE-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-MAKUNBOUND-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-BOUNDP-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD (SETF SLOT-VALUE-USING-CLASS) (T STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SLOT-VALUE-USING-CLASS (STD-CLASS STANDARD-OBJECT STANDARD-EFFECTIVE-SLOT-DEFINITION))| ++ |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| ++ |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| + |(FAST-METHOD WRAPPER-FETCHER (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| ++ |(FAST-METHOD CLASS-DEFAULT-INITARGS (BUILT-IN-CLASS))| + |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (BUILT-IN-CLASS))| ++ |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| + |(FAST-METHOD CLASS-DIRECT-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| + |(FAST-METHOD MAKE-INSTANCES-OBSOLETE (STD-CLASS))| +- |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| ++ |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| + |(FAST-METHOD COMPUTE-SLOTS :AROUND (STRUCTURE-CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| +- |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STRUCTURE-CLASS))| + |(FAST-METHOD COMPUTE-SLOTS :AROUND (STD-CLASS))| +- |(FAST-METHOD COMPUTE-CLASS-PRECEDENCE-LIST (SLOT-CLASS))| +- |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| +- |(FAST-METHOD SLOTS-FETCHER (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD SPECIALIZER-CLASS (CLASS))| +- |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| +- |(FAST-METHOD CLASS-SLOTS (BUILT-IN-CLASS))| +- |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (FUNCALLABLE-STANDARD-CLASS))| ++ |(FAST-METHOD COMPUTE-SLOTS (STD-CLASS))| ++ |(FAST-METHOD COMPUTE-DEFAULT-INITARGS (SLOT-CLASS))| + |(FAST-METHOD FINALIZE-INHERITANCE (STD-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS BUILT-IN-CLASS))| +- |(FAST-METHOD SAME-SPECIALIZER-P (CLASS CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT STANDARD-CLASS))| +- |(FAST-METHOD CHANGE-CLASS (STANDARD-OBJECT FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (FUNCALLABLE-STANDARD-CLASS STANDARD-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (FUNCALLABLE-STANDARD-CLASS))| +- |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| +- |(FAST-METHOD MAKE-INSTANCE (CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (CLASS CLASS))| +- |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| +- |(FAST-METHOD VALIDATE-SUPERCLASS (SLOT-CLASS FORWARD-REFERENCED-CLASS))| +- |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD FINALIZE-INHERITANCE (STRUCTURE-CLASS))| ++ |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| + |(FAST-METHOD REINITIALIZE-INSTANCE :BEFORE (SLOT-CLASS))| ++ |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T PCL-CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-GENERIC-FUNCTIONS (CLASS))| ++ |(FAST-METHOD SPECIALIZER-DIRECT-METHODS (CLASS))| ++ |(FAST-METHOD REMOVE-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD ADD-DIRECT-SUBCLASS (CLASS CLASS))| ++ |(FAST-METHOD CLASS-SLOT-CELLS (STD-CLASS))| ++ |(FAST-METHOD CLASS-CONSTRUCTORS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-DEFAULT-INITARGS (SLOT-CLASS))| ++ |(FAST-METHOD CLASS-DIRECT-DEFAULT-INITARGS (SLOT-CLASS))| + |(FAST-METHOD CLASS-PROTOTYPE (STRUCTURE-CLASS))| + |(FAST-METHOD CLASS-PROTOTYPE (STD-CLASS))| ++ |(FAST-METHOD CLASS-FINALIZED-P (PCL-CLASS))| ++ |(FAST-METHOD MAKE-INSTANCE (CLASS))| + |(FAST-METHOD ALLOCATE-INSTANCE (STRUCTURE-CLASS))| +- |(FAST-METHOD REINITIALIZE-INSTANCE :AFTER (SLOT-CLASS))| ++ |(FAST-METHOD ALLOCATE-INSTANCE (STANDARD-CLASS))| ++ |(FAST-METHOD RAW-INSTANCE-ALLOCATOR (STANDARD-CLASS))| ++ |(FAST-METHOD SLOTS-FETCHER (STANDARD-CLASS))| ++ |(FAST-METHOD WRAPPER-FETCHER (STANDARD-CLASS))| + CLASS-PREDICATE-NAME + |PCL::STRUCTURE-SLOT-DEFINITION class predicate| + |PCL::STRUCTURE-DIRECT-SLOT-DEFINITION class predicate| +@@ -1205,8 +1233,8 @@ + |(WRITER PREDICATE-NAME)| |(WRITER READERS)| + |(READER WRITER-FUNCTION)| |(READER INITFUNCTION)| + INITIALIZE-INTERNAL-SLOT-FUNCTIONS +- |SETF PCL SLOT-DEFINITION-TYPE| |(READER WRITERS)| +- |(WRITER CLASS-PRECEDENCE-LIST)| ++ |SETF PCL SLOT-DEFINITION-TYPE| ++ |(WRITER CLASS-PRECEDENCE-LIST)| |(READER WRITERS)| + |(WRITER ACCESSOR-FLAGS)| |(READER INITFORM)| + METHOD-COMBINATION-P |(WRITER LOCATION)| + |(WRITER DOCUMENTATION)| +@@ -1220,11 +1248,11 @@ + |(READER ALLOCATION)| |(WRITER SPECIALIZERS)| + |(CALL REAL-ENSURE-GF-USING-CLASS--NULL)| + |(WRITER IDENTITY-WITH-ONE-ARGUMENT)| +- |(SETF METHOD-GENERIC-FUNCTION)| +- |(WRITER PRETTY-ARGLIST)| LEGAL-SPECIALIZERS-P +- |SETF PCL OBJECT-PLIST| |(WRITER DEFSTRUCT-FORM)| +- |(READER FUNCTION)| |(READER GENERIC-FUNCTION)| +- |(READER LAMBDA-LIST)| |(READER SLOT-DEFINITION)| ++ |(SETF METHOD-GENERIC-FUNCTION)| LEGAL-SPECIALIZERS-P ++ |(WRITER PRETTY-ARGLIST)| |SETF PCL OBJECT-PLIST| ++ |(WRITER DEFSTRUCT-FORM)| |(READER FUNCTION)| ++ |(READER GENERIC-FUNCTION)| |(READER LAMBDA-LIST)| ++ |(READER SLOT-DEFINITION)| + |PCL::CLASS-PROTOTYPE-SPECIALIZER class predicate| + |SETF PCL SLOT-DEFINITION-INITFORM| + |SETF PCL CLASS-DEFSTRUCT-FORM| +@@ -1245,16 +1273,17 @@ + |SETF PCL SLOT-DEFINITION-ALLOCATION| + |SETF PCL SLOT-DEFINITION-INITFUNCTION| + |(WRITER SLOT-NAME)| |(BOUNDP NAME)| +- |(READER FAST-FUNCTION)| |(WRITER ALLOCATION)| ++ |(WRITER ALLOCATION)| |(READER FAST-FUNCTION)| + |(READER METHOD-CLASS)| |(SETF OBJECT-PLIST)| + |(READER INTERNAL-WRITER-FUNCTION)| + |(READER INTERNAL-READER-FUNCTION)| + |(READER METHOD-COMBINATION)| + METHOD-COMBINATION-OPTIONS |(READER DIRECT-SLOTS)| + |(READER DIRECT-METHODS)| +- |SETF PCL SLOT-DEFINITION-READERS| |(WRITER FUNCTION)| +- |(WRITER GENERIC-FUNCTION)| |(READER BOUNDP-FUNCTION)| +- |SETF PCL DOCUMENTATION| |(READER DIRECT-SUBCLASSES)| ++ |SETF PCL SLOT-DEFINITION-READERS| ++ |(READER BOUNDP-FUNCTION)| |(WRITER FUNCTION)| ++ |(WRITER GENERIC-FUNCTION)| |SETF PCL DOCUMENTATION| ++ |(READER DIRECT-SUBCLASSES)| + |(READER DIRECT-SUPERCLASSES)| |(WRITER LAMBDA-LIST)| + FUNCALLABLE-STANDARD-CLASS-P + |(FAST-WRITER-METHOD SLOT-OBJECT METHOD)| +@@ -1265,7 +1294,7 @@ + |SETF PCL SLOT-VALUE-USING-CLASS| + |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-ACCESSOR-SYMBOL)| + |(FAST-WRITER-METHOD STRUCTURE-SLOT-DEFINITION DEFSTRUCT-ACCESSOR-SYMBOL)| +- |(WRITER PROTOTYPE)| |(BOUNDP TYPE)| |(BOUNDP OBJECT)| ++ |(WRITER PROTOTYPE)| |(BOUNDP OBJECT)| |(BOUNDP TYPE)| + CLASS-CAN-PRECEDE-LIST |SETF PCL CLASS-DIRECT-SLOTS| + |SETF PCL CLASS-SLOTS| SLOT-ACCESSOR-FUNCTION + |(BOUNDP PLIST)| +@@ -1280,11 +1309,11 @@ + |(FAST-WRITER-METHOD SLOT-OBJECT ARG-INFO)| + |PCL::PLIST-MIXIN class predicate| + |(WRITER FAST-FUNCTION)| |(WRITER METHOD-CLASS)| +- |(FAST-WRITER-METHOD SLOT-OBJECT WRAPPER)| GET-METHOD ++ |(FAST-WRITER-METHOD SLOT-OBJECT WRAPPER)| + |(WRITER INTERNAL-WRITER-FUNCTION)| + |(WRITER INTERNAL-READER-FUNCTION)| +- |(WRITER METHOD-COMBINATION)| |(WRITER DIRECT-SLOTS)| +- |(WRITER DIRECT-METHODS)| ++ |(WRITER METHOD-COMBINATION)| GET-METHOD ++ |(WRITER DIRECT-SLOTS)| |(WRITER DIRECT-METHODS)| + |(FAST-WRITER-METHOD SLOT-OBJECT INITARGS)| + |(FAST-WRITER-METHOD SLOT-DEFINITION INITARGS)| + |(FAST-WRITER-METHOD SLOT-OBJECT OPERATOR)| +@@ -1354,18 +1383,18 @@ + |(FAST-READER-METHOD SLOT-DEFINITION READERS)| + |(FAST-READER-METHOD SLOT-OBJECT SPECIALIZERS)| + |(FAST-READER-METHOD STANDARD-METHOD SPECIALIZERS)| ++ |(FAST-READER-METHOD SHORT-METHOD-COMBINATION IDENTITY-WITH-ONE-ARGUMENT)| ++ |(FAST-READER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-READER-METHOD SPECIALIZER TYPE)| + |(FAST-READER-METHOD SLOT-OBJECT PROTOTYPE)| + |(FAST-READER-METHOD PCL-CLASS PROTOTYPE)| +- |(FAST-READER-METHOD SLOT-DEFINITION TYPE)| +- |(FAST-READER-METHOD SLOT-OBJECT TYPE)| +- |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION TYPE)| +- |(FAST-READER-METHOD SHORT-METHOD-COMBINATION IDENTITY-WITH-ONE-ARGUMENT)| +- |(FAST-READER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-READER-METHOD CLASS-EQ-SPECIALIZER OBJECT)| + |(FAST-READER-METHOD CLASS-PROTOTYPE-SPECIALIZER OBJECT)| + |(FAST-READER-METHOD SLOT-OBJECT OBJECT)| + |(FAST-READER-METHOD EQL-SPECIALIZER OBJECT)| ++ |(FAST-READER-METHOD SLOT-DEFINITION TYPE)| ++ |(FAST-READER-METHOD SLOT-OBJECT TYPE)| ++ |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION TYPE)| + |(FAST-READER-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| + |(FAST-READER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| + |(FAST-READER-METHOD SLOT-OBJECT INITFORM)| +@@ -1387,11 +1416,11 @@ + |(FAST-READER-METHOD SLOT-CLASS SLOTS)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SLOTS)| + |(FAST-READER-METHOD SLOT-CLASS DIRECT-SLOTS)| ++ |(FAST-READER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-READER-METHOD SLOT-OBJECT METHODS)| + |(FAST-READER-METHOD STANDARD-GENERIC-FUNCTION METHODS)| + |(FAST-READER-METHOD SLOT-OBJECT OPTIONS)| + |(FAST-READER-METHOD STANDARD-METHOD-COMBINATION OPTIONS)| +- |(FAST-READER-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| + |(FAST-READER-METHOD CLASS DIRECT-SUBCLASSES)| + |(FAST-READER-METHOD SLOT-OBJECT DIRECT-SUPERCLASSES)| +@@ -1429,8 +1458,8 @@ + |(FAST-BOUNDP-METHOD SLOT-OBJECT READERS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT SPECIALIZERS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT PROTOTYPE)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT TYPE)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT OBJECT)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT TYPE)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT INITFORM)| + |(SETF SLOT-VALUE-USING-CLASS)| +@@ -1456,10 +1485,10 @@ + |(SETF SLOT-DEFINITION-TYPE)| + |(SETF SLOT-DEFINITION-INITFORM)| + |(BOUNDP INITIALIZE-INFO)| +- |(FAST-BOUNDP-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-METHODS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT SLOTS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SLOTS)| ++ |(FAST-BOUNDP-METHOD SLOT-OBJECT FROM-DEFCLASS-P)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT METHODS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT OPTIONS)| + |(FAST-BOUNDP-METHOD SLOT-OBJECT DIRECT-SUBCLASSES)| +@@ -1468,94 +1497,95 @@ + |(BOUNDP INITARGS)| LONG-METHOD-COMBINATION-FUNCTION + GENERIC-FUNCTION-P + |PCL::SLOT-DEFINITION class predicate| |(READER NAME)| +- |(READER CLASS)| |(FAST-METHOD SLOT-UNBOUND (T T T))| +- |(FAST-METHOD (SETF DOCUMENTATION) (T T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| +- |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| +- |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| +- |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ |(READER CLASS)| ++ |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| ++ |(FAST-METHOD DESCRIBE-OBJECT (T T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| ++ |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| ++ |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| ++ |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| + |(FAST-METHOD REMOVE-NAMED-METHOD (T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| ++ |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION SHORT-METHOD-COMBINATION T))| + |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD FIND-METHOD-COMBINATION (GENERIC-FUNCTION (EQL STANDARD) T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| +- |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| + |(FAST-METHOD LEGAL-SLOT-NAME-P (STANDARD-METHOD T))| +- |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| ++ |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-ACCESSOR-METHOD T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| ++ |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| ++ |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| ++ |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| + |(FAST-METHOD PRINT-OBJECT (CLASS T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS (GENERIC-FUNCTION T))| + |(FAST-METHOD PRINT-OBJECT (T T))| +- |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD T))| +- |(FAST-METHOD PRINT-OBJECT (GENERIC-FUNCTION T))| ++ |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| ++ |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| + |(FAST-METHOD MAP-DEPENDENTS (DEPENDENT-UPDATE-MIXIN T))| + |(FAST-METHOD REMOVE-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| +- |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (FUNCALLABLE-STANDARD-CLASS T))| +- |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| +- |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| +- |(FAST-METHOD PRINT-OBJECT (STANDARD-METHOD-COMBINATION T))| +- |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD PRINT-OBJECT (SLOT-DEFINITION T))| +- |(FAST-METHOD UPDATE-GF-DFUN (STD-CLASS T))| ++ |(FAST-METHOD ADD-DEPENDENT (DEPENDENT-UPDATE-MIXIN T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (BUILT-IN-CLASS T))| ++ |(FAST-METHOD COMPATIBLE-META-CLASS-CHANGE-P (T T))| + |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STD-CLASS T))| +- |(FAST-METHOD LEGAL-DOCUMENTATION-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-LAMBDA-LIST-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-SPECIALIZER-P (STANDARD-METHOD T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ |(FAST-METHOD MAKE-BOUNDP-METHOD-FUNCTION (SLOT-CLASS T))| + |(FAST-METHOD MAKE-WRITER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD INFORM-TYPE-SYSTEM-ABOUT-CLASS (STRUCTURE-CLASS T))| +- |(FAST-METHOD LEGAL-QUALIFIER-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-METHOD-FUNCTION-P (STANDARD-METHOD T))| + |(FAST-METHOD MAKE-READER-METHOD-FUNCTION (SLOT-CLASS T))| +- |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD REMOVE-BOUNDP-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD REMOVE-WRITER-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD REMOVE-READER-METHOD (SLOT-CLASS T))| ++ |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| + |(FAST-METHOD ADD-WRITER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-METHOD (GENERIC-FUNCTION LONG-METHOD-COMBINATION T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-METHOD T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| +- |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD WRITER-METHOD-CLASS (SLOT-CLASS T))| + |(FAST-METHOD ADD-READER-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD SHARED-INITIALIZE :BEFORE (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ |(FAST-METHOD READER-METHOD-CLASS (SLOT-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS :AROUND (STRUCTURE-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION-INITARGS (SLOT-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD EFFECTIVE-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STD-CLASS T))| ++ |(FAST-METHOD DIRECT-SLOT-DEFINITION-CLASS (STRUCTURE-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STRUCTURE-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :BEFORE (CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (STD-CLASS T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| + |(FAST-METHOD SHARED-INITIALIZE :AFTER (CLASS-EQ-SPECIALIZER T))| ++ |(FAST-METHOD (SETF DOCUMENTATION) (T T))| ++ |(FAST-METHOD SHARED-INITIALIZE :AFTER (DOCUMENTATION-MIXIN T))| ++ |(FAST-METHOD COMPUTE-SLOT-ACCESSOR-INFO (EFFECTIVE-SLOT-DEFINITION T T))| ++ |(FAST-METHOD (SETF SLOT-ACCESSOR-STD-P) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SLOT-ACCESSOR-STD-P (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD (SETF SLOT-ACCESSOR-FUNCTION) (T EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| + |(FAST-METHOD SHARED-INITIALIZE (SLOT-OBJECT T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (EQL-SPECIALIZER T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-SLOT-DEFINITION T))| +- |(FAST-METHOD SHARED-INITIALIZE :AFTER (STANDARD-ACCESSOR-METHOD T))| +- |(FAST-METHOD ADD-BOUNDP-METHOD (SLOT-CLASS T T))| +- |(FAST-METHOD DESCRIBE-OBJECT (CLASS T))| +- |(FAST-METHOD LEGAL-SPECIALIZERS-P (STANDARD-METHOD T))| +- |(FAST-METHOD LEGAL-QUALIFIERS-P (STANDARD-METHOD T))| ++ |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| + |(FAST-METHOD DEFAULT-INITARGS (SLOT-CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (T T))| +- |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| +- |(FAST-METHOD COMPUTE-EFFECTIVE-SLOT-DEFINITION (SLOT-CLASS T))| +- |(FAST-METHOD DESCRIBE-OBJECT (SLOT-OBJECT T))| +- |(FAST-METHOD DESCRIBE-OBJECT (STANDARD-GENERIC-FUNCTION T))| +- |(FAST-METHOD COMPUTE-APPLICABLE-METHODS-USING-CLASSES (GENERIC-FUNCTION T))| +- |(FAST-METHOD SLOT-ACCESSOR-FUNCTION (EFFECTIVE-SLOT-DEFINITION T))| ++ |(FAST-METHOD SLOT-UNBOUND (T T T))| + |(FAST-METHOD SLOT-MISSING (T T T T))| +- |(FAST-METHOD UPDATE-INSTANCE-FOR-REDEFINED-CLASS (STANDARD-OBJECT T T T))| +- LEGAL-SLOT-NAME-P |(READER TYPE)| |(READER OBJECT)| ++ |(FAST-METHOD (SETF CLASS-SLOT-VALUE) (T STD-CLASS T))| ++ |(FAST-METHOD CLASS-SLOT-VALUE (STD-CLASS T))| ++ LEGAL-SLOT-NAME-P |(READER OBJECT)| |(READER TYPE)| + CLASS-WRAPPER |(READER PLIST)| + |(FAST-METHOD CLASS-PREDICATE-NAME (T))| + |(FAST-METHOD DOCUMENTATION (T))| + |(FAST-METHOD NO-APPLICABLE-METHOD (T))| + |(READER SLOTS)| |(WRITER NAME)| DEFINITION-SOURCE + |PCL::SLOT-OBJECT class predicate| DEFAULT-INITARGS +- |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER TYPE)| +- |(WRITER OBJECT)| ++ |(WRITER CLASS)| CLASS-SLOT-VALUE |(WRITER OBJECT)| ++ |(WRITER TYPE)| + |(FAST-METHOD ENSURE-CLASS-USING-CLASS (T NULL))| + |(WRITER PLIST)| |(WRITER SLOTS)| + |PCL::DOCUMENTATION-MIXIN class predicate| +@@ -1595,10 +1625,10 @@ + |COMMON-LISP::STANDARD-OBJECT class predicate| + |COMMON-LISP::BUILT-IN-CLASS class predicate| + |SETF PCL CLASS-SLOT-VALUE| |(SETF CLASS-SLOTS)| +- |(SETF CLASS-DIRECT-SLOTS)| DO-STANDARD-DEFSETF-1 +- |(READER OPERATOR)| |(CALL REAL-GET-METHOD)| +- |(CALL REAL-REMOVE-METHOD)| |(CALL REAL-ADD-METHOD)| +- |(READER ARG-INFO)| METHOD-COMBINATION-TYPE ++ |(SETF CLASS-DIRECT-SLOTS)| |(READER OPERATOR)| ++ |(CALL REAL-GET-METHOD)| |(CALL REAL-REMOVE-METHOD)| ++ |(CALL REAL-ADD-METHOD)| |(READER ARG-INFO)| ++ METHOD-COMBINATION-TYPE + |(READER DEFSTRUCT-CONSTRUCTOR)| + |(INTERNAL-READER-METHOD STANDARD-GENERIC-FUNCTION ARG-INFO)| + |(READER INITIALIZE-INFO)| |(WRITER WRAPPER)| +@@ -1607,8 +1637,8 @@ + |(WRITER DEFSTRUCT-ACCESSOR-SYMBOL)| + COMPUTE-SLOT-ACCESSOR-INFO |(READER INITARGS)| + |(WRITER CLASS-EQ-SPECIALIZER)| +- STANDARD-BOUNDP-METHOD-P FDEFINE-CAREFULLY +- |(SETF DOCUMENTATION)| RAW-INSTANCE-ALLOCATOR ++ STANDARD-BOUNDP-METHOD-P |(SETF DOCUMENTATION)| ++ RAW-INSTANCE-ALLOCATOR + |SETF PCL SLOT-DEFINITION-DEFSTRUCT-ACCESSOR-SYMBOL| + |SETF PCL CLASS-INITIALIZE-INFO| |(WRITER OPERATOR)| + |(WRITER ARG-INFO)| +@@ -1621,8 +1651,9 @@ + METHOD-COMBINATION-DOCUMENTATION + |SETF PCL SLOT-DEFINITION-INITARGS| + REMOVE-BOUNDP-METHOD ADD-NAMED-METHOD ++ |(WRITER INITARGS)| + |SETF PCL CLASS-DEFSTRUCT-CONSTRUCTOR| +- |(WRITER INITARGS)| |(BOUNDP METHOD)| ++ |(BOUNDP METHOD)| + |(FAST-WRITER-METHOD SLOT-OBJECT PREDICATE-NAME)| + |(FAST-WRITER-METHOD CLASS NAME)| + |(FAST-WRITER-METHOD SLOT-DEFINITION NAME)| +@@ -1668,11 +1699,11 @@ + |(FAST-WRITER-METHOD SLOT-OBJECT READERS)| + |(FAST-WRITER-METHOD SLOT-DEFINITION READERS)| + |(FAST-WRITER-METHOD SLOT-OBJECT SPECIALIZERS)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| + |(FAST-WRITER-METHOD SLOT-OBJECT PROTOTYPE)| ++ |(FAST-WRITER-METHOD SLOT-OBJECT OBJECT)| + |(FAST-WRITER-METHOD SLOT-DEFINITION TYPE)| + |(FAST-WRITER-METHOD SLOT-OBJECT TYPE)| +- |(FAST-WRITER-METHOD SLOT-OBJECT IDENTITY-WITH-ONE-ARGUMENT)| +- |(FAST-WRITER-METHOD SLOT-OBJECT OBJECT)| + REMOVE-NAMED-METHOD + |(FAST-WRITER-METHOD SLOT-OBJECT DEFSTRUCT-FORM)| + |(FAST-WRITER-METHOD STRUCTURE-CLASS DEFSTRUCT-FORM)| +@@ -1725,6 +1756,5 @@ + ENSURE-CLASS-USING-CLASS NO-APPLICABLE-METHOD + SLOT-DEFINITION-WRITERS + COMPUTE-APPLICABLE-METHODS-USING-CLASSES +- CLASS-PRECEDENCE-LIST DISASSEMBLE DESCRIBE-OBJECT +- COMPILE)) +- (SETF (GET V 'SYSTEM::PROCLAIMED-CLOSURE) T)) ++ CLASS-PRECEDENCE-LIST DESCRIBE-OBJECT)) ++ (SETF (GET V 'COMPILER::PROCLAIMED-CLOSURE) T)) diff --git a/debian/patches/real_list_order.12 b/debian/patches/real_list_order.12 new file mode 100644 index 0000000..9da00c3 --- /dev/null +++ b/debian/patches/real_list_order.12 @@ -0,0 +1,159 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gcl (2.6.12-56) unstable; urgency=medium + . + * list_order.12 +Author: Camm Maguire + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2017-08-25 + +--- gcl-2.6.12.orig/o/print.d ++++ gcl-2.6.12/o/print.d +@@ -702,18 +702,18 @@ print_symbol_name_body(object x) { + #define FOUND -1 + + static int +-write_sharp_eq(object *vp,bool dot) { ++do_write_sharp_eq(object x,bool dot) { + +- bool defined=vp[1]!=Cnil; ++ bool defined=x->c.c_cdr!=Cnil; + + if (dot) { + write_str(" . "); + if (!defined) return FOUND; + } + +- vp[1]=Ct; ++ x->c.c_cdr=Ct; + write_ch('#'); +- write_decimal((vp-PRINTvs_top)/2); ++ write_decimal(fix(x->c.c_car)); + write_ch(defined ? '#' : '='); + + return defined ? DONE : FOUND; +@@ -721,15 +721,12 @@ write_sharp_eq(object *vp,bool dot) { + } + + static int +-write_sharp_eqs(object x,bool dot) { ++write_sharp_eq(object x,bool dot) { + +- object *vp; ++ struct htent *e; + +- for (vp = PRINTvs_top; vp < PRINTvs_limit; vp += 2) +- if (x == *vp) +- return write_sharp_eq(vp,dot); +- +- return 0; ++ return PRINTvs_top[0]!=Cnil && (e=gethash(x,PRINTvs_top[0]))->hte_key!=OBJNULL ? ++ do_write_sharp_eq(e->hte_value,dot) : 0; + + } + +@@ -916,7 +913,7 @@ int level; + if (PRINTescape) { + if (x->s.s_hpack == Cnil) { + if (PRINTcircle) +- if (write_sharp_eqs(x,FALSE)==DONE) return; ++ if (write_sharp_eq(x,FALSE)==DONE) return; + if (PRINTgensym) + write_str("#:"); + } else if (x->s.s_hpack == keyword_package) { +@@ -952,7 +949,7 @@ int level; + break; + } + if (PRINTcircle) +- if (write_sharp_eqs(x,FALSE)==DONE) return; ++ if (write_sharp_eq(x,FALSE)==DONE) return; + if (PRINTlevel >= 0 && level >= PRINTlevel) { + write_ch('#'); + break; +@@ -1028,7 +1025,7 @@ int level; + break; + } + if (PRINTcircle) +- if (write_sharp_eqs(x,FALSE)==DONE) return; ++ if (write_sharp_eq(x,FALSE)==DONE) return; + if (PRINTlevel >= 0 && level >= PRINTlevel) { + write_ch('#'); + break; +@@ -1099,7 +1096,7 @@ int level; + break; + } + if (PRINTcircle) +- if (write_sharp_eqs(x,FALSE)==DONE) return; ++ if (write_sharp_eq(x,FALSE)==DONE) return; + if (PRINTpretty) { + if (x->c.c_car == sLquote && + type_of(x->c.c_cdr) == t_cons && +@@ -1146,7 +1143,7 @@ int level; + break; + } + if (PRINTcircle) +- switch (write_sharp_eqs(x,TRUE)) { ++ switch (write_sharp_eq(x,TRUE)) { + case FOUND: + write_object(x, level); + case DONE: +@@ -1316,7 +1313,7 @@ int level; + + case t_structure: + if (PRINTcircle) +- if (write_sharp_eqs(x,FALSE)==DONE) return; ++ if (write_sharp_eq(x,FALSE)==DONE) return; + if (PRINTlevel >= 0 && level >= PRINTlevel) { + write_ch('#'); + break; +@@ -1415,7 +1412,6 @@ travel_push(object x) { + + if (!travel_pushed(x)) { + vs_check_push(x); +- vs_check_push(Cnil); + travel_pushed(x)=1; + } + +@@ -1519,10 +1515,13 @@ travel_clear(object x) { + + } + ++object sLeq; + + static void + setupPRINTcircle(object x,int dogensyms) { + ++ object *xp; ++ + BEGIN_NO_INTERRUPT; + dgs=dogensyms; + travel_push(x); +@@ -1531,6 +1530,12 @@ setupPRINTcircle(object x,int dogensyms) + travel_clear(x); + END_NO_INTERRUPT; + ++ vs_check_push(PRINTvs_limit>PRINTvs_top ? funcall_cfun(Lmake_hash_table,2,sKtest,sLeq) : Cnil); ++ for (xp=PRINTvs_top;xp\n" +"Language-Team: Czech \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Používat implicitně ANSI verzi (stále ve vývoji)?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL se nachází ve fázi, kdy kromě tradičního obrazu CLtL1 (který se stále " +"používá) poskytuje i obraz kompatibilní s ANSI." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Pro stručný popis těchto termínů si prosím přečtěte soubor README.Debian. " +"Touto odpovědí určujete, který obraz se spustí po zadání „gcl@EXT@“. " + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Toto nastavení můžete přebít nastavením proměnné prostředí GCL_ANSI na " +"neprázdný řetězec (použije ANSI verzi) nebo na prázdnou hodnotu (použije " +"CLtL1 verzi). Například GCL_ANSI=t gcl@EXT@. Aktuálně použitá verze se " +"zobrazí na úvodní obrazovce." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Používat implicitně profilování?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL nyní podporuje profilování přes gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Podrobnosti naleznete v dokumentaci si::gprof-start a si::gprof-quit. Tato " +"verze je pomalejší než verze bez podpory gprof, tudíž ji nedoporučujeme pro " +"koncové produkční nasazení." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Toto nastavení můžete přebít nastavením proměnné prostředí GCL_PROF na " +"neprázdný řetězec (zapne profilování) nebo na prázdnou hodnotu (povolí lepší " +"optimalizace). Například GCL_PROF=t gcl@EXT@. Pokud je profilování zapnuto, " +"dozvíte se o tom z úvodní obrazovky." + +#~ msgid "" +#~ "GCL is one of the oldest free common lisp systems still in use. Several " +#~ "production systems have used it for over a decade. The common lisp " +#~ "standard in effect when GCL was first released is known as \"Common Lisp, " +#~ "the Language\" (CLtL1) after a book by Steele of the same name providing " +#~ "this specification. Subsequently, a much expanded standard was adopted " +#~ "by the American National Standards Institute (ANSI), which is still " +#~ "considered the definitive common lisp language specification to this " +#~ "day. GCL is in the process of providing an ANSI compliant image in " +#~ "addition to its traditional CLtL1 image still in production use. Setting " +#~ "this variable will determine which image you will use by default on " +#~ "executing 'gcl'. You can locally override this choice by setting the " +#~ "GCL_ANSI environment variable to any non-empty string for the ANSI build, " +#~ "and to the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl. You " +#~ "may be interested in reviewing the ANSI test results sketching the level " +#~ "of compliance achieved thus far in /usr/share/doc/gcl/test_results.gz. " +#~ "The flavor of the build in force will be reported in the initial startup " +#~ "banner." +#~ msgstr "" +#~ "GCL je jedním z nejstarších svobodných systémů common lispu, který se " +#~ "dosud používá. Několik produkčních systémů jej používá déle než dekádu. " +#~ "Při prvním vydání GCL byl v platnosti standard common lispu známý jako " +#~ "\"Common Lisp, the Language\" (CLtL1) pojmenovaný podle Steelovy knihy " +#~ "stejného jména, která tento standard definovala. Americkým národním " +#~ "institutem pro standardizaci (ANSI) pak byl přijat podstatně rozšířený " +#~ "standard, který se do dnešní doby považuje za konečnou specifikaci common " +#~ "lispu. Kromě tradičního CLtL1 se GCL snaží nabídnout i verzi odpovídající " +#~ "ANSI standardu. Nastavením této proměnné určíte, jakým způsobem se má " +#~ "binárka 'gcl' chovat. Lokálně můžete toto nastavení přepsat nastavením " +#~ "proměnné prostředí GCL_ANSI na neprázdný řetězec (zapne ANSI chování) " +#~ "nebo na prázdnou hodnotu (zapne CLtL1 chování). Například GCL_ANSI-t gcl. " +#~ "Aktuálně vybraný standard bude zobrazen v úvodní obrazovce prostředí. " +#~ "Zajímavé může být porovnání dosud dosažené shody s ANSI standardem v " +#~ "souboru /usr/share/doc/gcl/test_results.gz." diff --git a/debian/po/da.po b/debian/po/da.po new file mode 100644 index 0000000..11d3fc6 --- /dev/null +++ b/debian/po/da.po @@ -0,0 +1,97 @@ +# Danish translation gcl. +# Copyright (C) 2012 gcl & nedenstående oversættere. +# This file is distributed under the same license as the gcl package. +# Joe Hansen (joedalton2@yahoo.dk), 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2012-03-31 12:42+0000\n" +"Last-Translator: Joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Brug den foreløbige ANSI bygget som standard?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL er i gang med at tilbyde et ANSI-overholdende aftryk udover det " +"traditionelle CLtL1-aftryk som stadig er i produktionsbrug." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Se venligst filen README.Debian for en kort beskrivelse af disse termer. " +"Valg af denne indstilling vil bestemme hvilket aftryk som vil blive brugt " +"som standard, når der køres »gcl@EXT@«." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Denne indstilling kan overskrives ved at angive miljøvariablen GCL_ANSI til " +"enhver streng der ikke er tom for ANSI-bygningen, og til den tomme streng " +"for CLtL1-bygningen, f.eks. GCL_ANSI=t gcl@EXT@. Den aktuelt tvungne " +"byggevariant vil blive rapporteret i det oprindelige opstartsbanner." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Brug profileringen bygget som standard?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL har valgfri understøttelse for profilering via gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Se venligst dokumentationen for si::gprof-start og si::gprof-quit for " +"detaljer. Da denne bygning er langsommere end bygninger uden gprof-" +"understøttelse, så anbefales den ikke for endelig produktionsbrug." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Angiv miljøvariablen GCL_PROF til den tomme streng for bedre optimerede " +"bygninger, eller enhver streng der ikke er tom for " +"profileringsunderstøttelse; f.eks. GCL_PROF=t gcl@EXT@. Hvis profilering er " +"aktiveret, vil denne blive rapporteret i det oprindelige opstartsbanner." diff --git a/debian/po/de.po b/debian/po/de.po new file mode 100644 index 0000000..dafd73d --- /dev/null +++ b/debian/po/de.po @@ -0,0 +1,139 @@ +# Translation of gcl debconf templates to German +# Copyright (C) Stefan Bauer , 2007. +# Copyright (C) Helge Kreutzmann , 2007, 2008. +# This file is distributed under the same license as the gcl package. +# +msgid "" +msgstr "" +"Project-Id-Version: gcl 2.6.7-36\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-01-09 11:49+0100\n" +"Last-Translator: Stefan Bauer \n" +"Language-Team: de \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Verwende standardmig den sich in Arbeit befindlichen ANSI-Build?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL ist derzeit dabei, zustzlich zu dem noch im Einsatz befindlichen " +"traditionellen CLtL1-Image ein ANSI-konformes Image bereitzustellen." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Bitte lesen Sie die Datei README.Debian fr eine kurze Beschreibung dieser " +"Begriffe. Die Wahl dieser Option bestimmen, welches Image standardmig " +"verwendet wird, wenn gcl@EXT@ ausgefhrt wird." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Diese Einstellung kann mit der Umgebungsvariablen GCL_ANSI berschrieben " +"werden. Jede nicht-leere Zeichenkette fhrt zur ANSI-Erstellung, und die " +"leere Zeichenkette fhrt zum CLtL1-Bau, z.B. GCL_ANSI=t gcl@EXT@. In der " +"Startmeldung wird die derzeit erzwungene Bauart berichtet." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Verwende standardmig den Profiling-Build?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL besitzt optionale Untersttzung fr Profiling mittels Gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Bitte lesen Sie die Dokumentation fr si::gprof-start und si::gprof-quit fr " +"Details. Da ein solches Programm langsamer ist als ein Programm ohne Gprof-" +"Untersttzung, wird dies fr den Produktiveinsatz nicht empfohlen." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Setzen Sie die Umgebungsvariable GCL_PROF auf die leere Zeichenkette, um ein " +"optimiertes Programm zu erhalten oder auf irgendeine nicht-leere " +"Zeichenkette, fr Profiling-Untersttzung; z.B. GCL_PROF=t gcl@EXT@. Falls " +"Profiling aktiviert ist, wird dies in der Startmeldung angezeigt." + +#~ msgid "" +#~ "GCL is in the process of providing an ANSI compliant image in addition to " +#~ "its traditional CLtL1 image still in production use. Please see the " +#~ "README.Debian file for a brief description of these terms. Setting this " +#~ "variable will determine which image you will use by default on executing " +#~ "'gcl@EXT@'. You can locally override this choice by setting the GCL_ANSI " +#~ "environment variable to any non-empty string for the ANSI build, and to " +#~ "the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The " +#~ "flavor of the build in force will be reported in the initial startup " +#~ "banner." +#~ msgstr "" +#~ "GCL arbeitet neben dem traditionellen CLtL1-Image fr den " +#~ "Produktiveinsatz zustzlich an der Bereitstellung eines kompatiblen ANSI-" +#~ "Images. Bitte beachten Sie die README.Debian-Datei fr eine kurze " +#~ "Beschreibung dieses Themas. Durch diese Variable definieren Sie, welches " +#~ "Image voreingestellt bei der Ausfhrung von gcl@EXT@ verwendet wird. " +#~ "Diese Auswahl kann lokal, durch einen nicht leeren Wert in der " +#~ "Umgebungsvariable GCL_ANSI fr den ANSI-Build, bzw. einen leeren Wert " +#~ "fr den CLtL1-Build, z.B. GCL_ANSI=t gcl@EXT@ definiert werden. Es " +#~ "erfolgt eine Meldung ber die aktive Erstellung im einfhrenden Start-" +#~ "Banner." + +#~ msgid "" +#~ "GCL now has optional support for profiling via gprof. Please see the " +#~ "documentation for si::gprof-start and si::gprof-quit for details. As this " +#~ "build is slower than builds without gprof support, it is not recommended " +#~ "for final production use. You can locally override the default choice " +#~ "made here by setting the GCL_PROF environment variable to any non-empty " +#~ "string for profiling support, and to the empty string for the more " +#~ "optimized builds, e.g. GCL_PROF=t gcl@EXT@. If profiling is enabled, " +#~ "this will be reported in the initial startup banner." +#~ msgstr "" +#~ "GCL besitzt optionale Untersttzung fr Profiling mit gprof. Bitte lesen " +#~ "Sie hierzu die Dokumentation von si::gprof-start und si::gprof-quit fr " +#~ "weiterfhrende Informationen. Da dieser Build langsamer ist als ohne " +#~ "gprof-Untersttzung, wird dieser Weg nicht fr den endgltig produktiven " +#~ "Einsatz empfohlen. Sie knnen die hier gemachten Angaben lokal ber die " +#~ "GCL_PROF-Umgebungsvariable durch einen beliebigen Wert ndern, bzw. durch " +#~ "einen leeren Wert fr das weitaus anpassungsfhigere Build, z.B. " +#~ "GCL_PROF=t gcl@EXT@. Falls Profiling aktiviert ist, erfolgt eine Meldung " +#~ "im einfhrenden Start-Banner." diff --git a/debian/po/es.po b/debian/po/es.po new file mode 100644 index 0000000..e4cb113 --- /dev/null +++ b/debian/po/es.po @@ -0,0 +1,209 @@ +# gcl po-debconf translation to Spanish +# Copyright (C) 2005, 2007, 2008 Software in the Public Interest +# This file is distributed under the same license as the gcl package. +# +# Changes: +# - Initial translation +# César Gómez Martín , 2005 +# +# - Updates +# Rudy Godoy Guillén , 2007 +# Francisco Javier Cuadrado , 2008 +# +# Traductores, si no conoce el formato PO, merece la pena leer la +# documentación de gettext, especialmente las secciones dedicadas a este +# formato, por ejemplo ejecutando: +# +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Equipo de traducción al español, por favor, lean antes de traducir +# los siguientes documentos: +# +# - El proyecto de traducción de Debian al español +# http://www.debian.org/intl/spanish/ +# especialmente las notas de traducción en +# http://www.debian.org/intl/spanish/notas +# +# - La guía de traducción de po's de debconf: +# /usr/share/doc/po-debconf/README-trans +# o http://www.debian.org/intl/l10n/po-debconf/README-trans +# +msgid "" +msgstr "" +"Project-Id-Version: gcl 2.6.7-45\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-12-04 20:00+0100\n" +"Last-Translator: Francisco Javier Cuadrado \n" +"Language-Team: Debian l10n spanish \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Spanish\n" +"X-Poedit-Country: SPAIN\n" +"X-Poedit-SourceCharset: utf-8\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "" +"¿Utilizar la generación ANSI todavía en desarrollo de manera predeterminada?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GL está en el proceso de proporcionar una imagen ANSI, además de su imagen " +"CLtL1 tradicional que todavía se usa." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Por favor, véase el archivo README.Debian para una descripción corta de " +"estos términos. Eligiendo esta opción determinará que imagen se usará de " +"manera predeterminada al ejecutar «gcl@EXT@»." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Esta configuración se puede sobrescribir cambiando la variable de entorno " +"GCL_ANSI a cualquier cadena de caracteres no vacía para la generación ANSI, " +"y a una cadena de caracteres vacía para la generación CLtL1, por ejemplo: " +"«GCL_ANSI=t gcl@EXT@». El actual tipo de generación se mostrará en la " +"información inicial del arranque." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "¿Utilizar la generación con «profiling» de manera predeterminada?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL permite usar «profiling», de manera opcional, mediante gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Por favor, véase la documentación para los detalles de «si::gprof-start» y " +"«si::gprof-quit». Ya que esta generación es más lenta que sin el uso de " +"gprof, no se recomienda para su uso final." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Cambie el valor de la variable de entorno GCL_PROF a una cadena de " +"caracteres vacía para generación más optimizadas, o a una cadena de " +"caracteres no vacía para usar el «profiling», por ejemplo: «GCL_PROF=t " +"gcl@EXT@». Si el «profiling» está activado, se mostrará en la información " +"inicial del arranque." + +#~ msgid "" +#~ "GCL is in the process of providing an ANSI compliant image in addition to " +#~ "its traditional CLtL1 image still in production use. Please see the " +#~ "README.Debian file for a brief description of these terms. Setting this " +#~ "variable will determine which image you will use by default on executing " +#~ "'gcl@EXT@'. You can locally override this choice by setting the GCL_ANSI " +#~ "environment variable to any non-empty string for the ANSI build, and to " +#~ "the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The " +#~ "flavor of the build in force will be reported in the initial startup " +#~ "banner." +#~ msgstr "" +#~ "GCL está en proceso de incorporar una imagen compatible con ANSI en " +#~ "adición a su imagen CLtL1 tradicional que todavía se usa en producción. " +#~ "Por favor, véase el fichero README de Debian para una breve descripción " +#~ "acerca de estos términos. El definir esta variable determinará qué imagen " +#~ "utilizar de manera predeterminada cuando ejecute «gcl@EXT@».\n" +#~ "Puede anular esta elección localmente definiendo la variable de entorno " +#~ "GCL_ANSI a una cadena no vacía para la compilación ANSI, y a una vacía " +#~ "para la compilación CLtL1, ejemplo: GCL_ANSI=t gcl@EXT@. La versión de la " +#~ "compilación se indicará en el anuncio inicial de arranque." + +#~ msgid "" +#~ "GCL now has optional support for profiling via gprof. Please see the " +#~ "documentation for si::gprof-start and si::gprof-quit for details. As this " +#~ "build is slower than builds without gprof support, it is not recommended " +#~ "for final production use. You can locally override the default choice " +#~ "made here by setting the GCL_PROF environment variable to any non-empty " +#~ "string for profiling support, and to the empty string for the more " +#~ "optimized builds, e.g. GCL_PROF=t gcl@EXT@. If profiling is enabled, " +#~ "this will be reported in the initial startup banner." +#~ msgstr "" +#~ "Ahora GCL tiene soporte opcional para perfilado a través de gprof. Por " +#~ "favor, mire la documentación de «si::gprof-start» y de «si::gprof-quit» y " +#~ "«si::gprof-quit» si desea más detalles. Dado que esta compilación es más " +#~ "lenta que otras sin soporte para gprof, no se recomienda usarlo en " +#~ "producción. Puede anular esta elección de forma local mediante el " +#~ "establecimiento de la variable de entorno GCL_PROF a cualquier cadena no " +#~ "vacía para soporte de perfiles, y a la cadena vacía para los paquetes más " +#~ "optimizados, es decir GCL_PROF=t gcl. Si el perfilado está activo se " +#~ "indicará en el anuncio inicial de arranque." + +#~ msgid "" +#~ "GCL is one of the oldest free common lisp systems still in use. Several " +#~ "production systems have used it for over a decade. The common lisp " +#~ "standard in effect when GCL was first released is known as \"Common Lisp, " +#~ "the Language\" (CLtL1) after a book by Steele of the same name providing " +#~ "this specification. Subsequently, a much expanded standard was adopted " +#~ "by the American National Standards Institute (ANSI), which is still " +#~ "considered the definitive common lisp language specification to this " +#~ "day. GCL is in the process of providing an ANSI compliant image in " +#~ "addition to its traditional CLtL1 image still in production use. Setting " +#~ "this variable will determine which image you will use by default on " +#~ "executing 'gcl'. You can locally override this choice by setting the " +#~ "GCL_ANSI environment variable to any non-empty string for the ANSI build, " +#~ "and to the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl. You " +#~ "may be interested in reviewing the ANSI test results sketching the level " +#~ "of compliance achieved thus far in /usr/share/doc/gcl/test_results.gz. " +#~ "The flavor of the build in force will be reported in the initial startup " +#~ "banner." +#~ msgstr "" +#~ "GCL es uno de los sistemas libres de «common lisp» más antiguos que " +#~ "todavía se usan. Varios sistemas en producción han estado usándolo " +#~ "durante más de una década. Cuando GCL se liberó por primera vez, el " +#~ "estándar «common lisp» se conocía como «Common Lisp, the " +#~ "Language» (CLtL1) después de un libro escrito por Steele que llevaba el " +#~ "mismo nombre y que proporcionaba esta especificación. Posteriormente se " +#~ "adoptó en el Instituto Nacional de Estándares Americano (ANSI) un " +#~ "estándar más extendido, que todavía se considera la especificación " +#~ "definitiva del lenguaje «common lisp» hasta hoy. GCL está en el proceso " +#~ "de proporcionar una imagen conforme a ANSI además de su imagen CltL1 " +#~ "tradicional que todavía se usa en producción. Al establecer esta variable " +#~ "se determinará la imagen por omisión que usará al ejecutar «gcl». Puede " +#~ "anular esta elección de forma local mediante el establecimiento de la " +#~ "variable de entorno GCL_ANSI a cualquier cadena no vacía para el paquete " +#~ "ANSI, y a la cadena vacía para el paquete CLtL1, i.e. GCL_ANSI=t gcl. " +#~ "Quizás esté interesado en revisar los resultados de las pruebas ANSI " +#~ "describiendo el nivel de conformidad logrado hasta ahora en /usr/share/" +#~ "doc/gcl/test_results.gz. Se informará del tipo de paquete usado en el " +#~ "anuncio inicial de arranque." diff --git a/debian/po/fi.po b/debian/po/fi.po new file mode 100644 index 0000000..e9dc116 --- /dev/null +++ b/debian/po/fi.po @@ -0,0 +1,95 @@ +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2007-12-29 23:28+0200\n" +"Last-Translator: Esko Arajärvi \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Finnish\n" +"X-Poedit-Country: Finland\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Käytetäänkö kehitettävää ANSI-käännöstä oletuksena?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL:n on tarkoitus tarjota ANSI-yhteensopiva kuva perinteisen, vielä " +"tuotantokäytössä olevan CLtL1-kuvan lisäksi." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Tiedostosta README.Debian löytyy (englanniksi) näiden termien lyhyet " +"kuvaukset. Tämä valinta vaikuttaa siihen mitä kuvaa käytetään oletuksena " +"ajettaessa ”gcl@EXT@”." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Tämä asetus voidaan ohittaa asettamalla GCL_ANSI-ympäristömuuttuja. Jos " +"muuttujan arvo on mikä tahansa ei-tyhjä merkkijono, käytetään ANSI-" +"käännöstä, ja jos muuttujan arvo on tyhjä merkkijono, käytetään CLtL1-" +"käännöstä. Esimerkiksi: GCL_ANSI=t gcl@EXT@. Käytetty pakotettu käännöstapa " +"raportoidaan käynnistysruudussa." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Käytetäänkö profilointia oletuksena?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL tukee valinnaisesti profilointia gprofin avulla." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Katso yksityiskohdat (englanniksi) dokumentaatiosta kohdista si::gprof-start " +"ja si::gprof-quit. Koska tämä käännös on hitaampi kuin käännökset ilman " +"gprof-tukea, tätä ei suositella tuotantokäyttöön." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Aseta GCL_PROF-ympäristömuuttuja tyhjäksi merkkijonoksi käyttääksesi " +"optimoidumpia käännöksiä ja miksi tahansa ei-tyhjäksi merkkijonoksi " +"käyttääksesi profilointia. Esimerkiksi: GCL_PROF=t gcl@EXT@. Jos profilointi " +"on aktivoituna, se raportoidaan käynnistysruudussa." diff --git a/debian/po/fr.po b/debian/po/fr.po new file mode 100644 index 0000000..0a513f4 --- /dev/null +++ b/debian/po/fr.po @@ -0,0 +1,141 @@ +# Translation of gcl debconf templates to French +# Copyright (C) 2007 Sylvain Archenault +# This file is distributed under the same license as the iodine package. +# +# Sylvain Archenault , 2007. +msgid "" +msgstr "" +"Project-Id-Version: gcl 2.6.7-1\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2007-12-23 13:03+0100\n" +"Last-Translator: Sylvain Archenault \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Faut-il utiliser la compilation ANSI par dfaut?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL est en passe de fournir une image respectant la norme ANSI en plus de " +"l'image traditionnelle CLtL1, toujours utilise en production." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Veuillez lire le fichier README.Debian pour une brve description de ces " +"termes. Le choix de cette option dterminera quelle image sera utilise par " +"dfaut en excutant gcl@EXT@." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Ce rglage peut tre chang en affectant la variable d'environnement " +"GCL_ANSI une chane non vide pour la compilation ANSI, et une chane vide " +"pour la compilation CLtL1, par exemple GCL_ANSI=t gcl@EXT@. Le type de " +"compilation sera affich dans le bandeau de dmarrage." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Faut-il utiliser le profilage par dfaut?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL permet optionnellement la gestion du profilage via gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Veuillez vous reporter la documentation de si::gprof-start et si::" +"gprof-quit pour plus de dtails. Comme cet excutable est plus lent que " +"les excutables sans la gestion de gprof, il n'est pas recommand de " +"l'utiliser en production." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Veuillez affecter une chane vide la variable d'environnement GCL_PROF " +"pour des compilations optimises, ou une chane non vide pour avoir la " +"gestion du profilage; par exemple GCL_PROF=t gcl@EXT@. Si le profilage est " +"activ, cela sera affich dans le bandeau de dmarrage." + +#~ msgid "" +#~ "GCL is in the process of providing an ANSI compliant image in addition to " +#~ "its traditional CLtL1 image still in production use. Please see the " +#~ "README.Debian file for a brief description of these terms. Setting this " +#~ "variable will determine which image you will use by default on executing " +#~ "'gcl@EXT@'. You can locally override this choice by setting the GCL_ANSI " +#~ "environment variable to any non-empty string for the ANSI build, and to " +#~ "the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The " +#~ "flavor of the build in force will be reported in the initial startup " +#~ "banner." +#~ msgstr "" +#~ "GCL a pour but de fournir une image conforme la dfinition de " +#~ "l'ANSI en plus de son image traditionnelle CLtL1 qui est toujours " +#~ "utilise en production. Veuillez consulter le fichier README.Debian " +#~ "pour plus d'informations sur ces normes. Ce choix dterminera quelle " +#~ "norme vous allez utiliser par dfaut lors de l'excution de " +#~ "gcl@EXT@. Vous pouvez localement modifier ce choix en " +#~ "affectant une chane non vide la variable d'environnement GCL_ANSI " +#~ "pour une compilation respectant la norme dfinie par l'ANSI, et une " +#~ "chane vide pour une compilation en accord avec la norme CLtL1, par " +#~ "exemple GCL_ANSI=t gcl@EXT@. Le type de compilation sera affich dans " +#~ "le bandeau de dmarrage." + +#~ msgid "" +#~ "GCL now has optional support for profiling via gprof. Please see the " +#~ "documentation for si::gprof-start and si::gprof-quit for details. As this " +#~ "build is slower than builds without gprof support, it is not recommended " +#~ "for final production use. You can locally override the default choice " +#~ "made here by setting the GCL_PROF environment variable to any non-empty " +#~ "string for profiling support, and to the empty string for the more " +#~ "optimized builds, e.g. GCL_PROF=t gcl@EXT@. If profiling is enabled, " +#~ "this will be reported in the initial startup banner." +#~ msgstr "" +#~ "GCL gre dsormais le profilage via gprof. Veuillez consulter la " +#~ "documentation de si::gprof-start et de si::gprof-quit pour plus " +#~ "d'informations. La construction produite avec cette option est plus lente " +#~ "que la construction classique. Par consquent il n'est pas recommand " +#~ "de l'utiliser en production. Vous pouvez localement modifier ce choix en " +#~ "affectant la variable d'environnement GCL_PROF, une chane non vide " +#~ "pour activer le profilage, ou une chane vide pour une compilation " +#~ "optimise, par exemple GCL_PROF=t gcl@EXT@. Si le profilage est " +#~ "activ, cela sera affich dans le bandeau de dmarrage." diff --git a/debian/po/gl.po b/debian/po/gl.po new file mode 100644 index 0000000..951ca9f --- /dev/null +++ b/debian/po/gl.po @@ -0,0 +1,138 @@ +# Galician translation of gclcvs's debconf templates +# This file is distributed under the same license as the gclcvs package. +# Jacobo Tarrio , 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: gclcvs\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-01-01 13:38+0000\n" +"Last-Translator: Jacobo Tarrio \n" +"Language-Team: Galician \n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "¿Empregar por defecto a versión ANSI que se está a facer?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"Estase a traballar para que GCL forneza unha imaxe ANSI ademáis da imaxe " +"CLtL1 que aínda se emprega en produción." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Consulte o ficheiro README.Debian para ver unha descrición breve deses " +"termos. Ao establecer esa variable ha determinar a imaxe que ha empregar por " +"defecto ao executar \"gcl@EXT@\"." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Pode empregar a outra imaxe establecendo a variable de ambiente GCL_ANSI a " +"calquera cadea non baleira para empregar a versión ANSI, e á cadea baleira " +"para empregar a versión CLtL1; por exemplo, GCL_ANSI=t gcl@EXT@. Hase " +"informar da versión en uso no cartel que aparece ao iniciar o programa." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "¿Empregar por defecto a versión con cronometrado?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL agora ten soporte opcional de cronometrado mediante gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Consulte a documentación de si::gprof-start e si::gprof-quit para máis " +"detalles. Xa que esta versión é máis lenta que as que non teñen soporte de " +"gprof, non se recomenda que a empregue para o uso en produción." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Pode empregar unha versión distinta á seleccionada establecendo a variable " +"de ambiente GCL_PROF a calquera cadea non baleira para empregar o soporte de " +"cronometrado, ou á cadea baleira para as versións máis optimizadas; por " +"exemplo, GCL_PROF=t gcl@EXT@. Se está activado o cronometrado, hase informar " +"diso no cartel que aparece ao iniciar o programa." + +#~ msgid "" +#~ "GCL is in the process of providing an ANSI compliant image in addition to " +#~ "its traditional CLtL1 image still in production use. Please see the " +#~ "README.Debian file for a brief description of these terms. Setting this " +#~ "variable will determine which image you will use by default on executing " +#~ "'gcl@EXT@'. You can locally override this choice by setting the GCL_ANSI " +#~ "environment variable to any non-empty string for the ANSI build, and to " +#~ "the empty string for the CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The " +#~ "flavor of the build in force will be reported in the initial startup " +#~ "banner." +#~ msgstr "" +#~ "Estase a traballar para que GCL forneza unha imaxe ANSI ademáis da imaxe " +#~ "CLtL1 que aínda se emprega en produción. Consulte o ficheiro README." +#~ "Debian para ver unha descrición breve deses termos. Ao estabrecer esa " +#~ "variable ha determinar a imaxe que ha empregar por defecto ao executar " +#~ "\"gcl@EXT@\". Pode empregar a outra imaxe estabrecendo a variable de " +#~ "ambiente GCL_ANSI a calquera cadea non baleira para empregar a versión " +#~ "ANSI, e á cadea baleira para empregar a versión CLtL1; por exemplo, " +#~ "GCL_ANSI=t gcl@EXT@. Hase informar da versión en uso no cartel que " +#~ "aparece ao iniciar o programa." + +#~ msgid "" +#~ "GCL now has optional support for profiling via gprof. Please see the " +#~ "documentation for si::gprof-start and si::gprof-quit for details. As this " +#~ "build is slower than builds without gprof support, it is not recommended " +#~ "for final production use. You can locally override the default choice " +#~ "made here by setting the GCL_PROF environment variable to any non-empty " +#~ "string for profiling support, and to the empty string for the more " +#~ "optimized builds, e.g. GCL_PROF=t gcl@EXT@. If profiling is enabled, " +#~ "this will be reported in the initial startup banner." +#~ msgstr "" +#~ "GCL agora ten soporte opcional de cronometrado mediante gprof. Consulte a " +#~ "documentación de si::gprof-start e si::gprof-quit para máis detalles. Xa " +#~ "que esta versión é máis lenta que as que non teñen soporte de gprof, non " +#~ "se recomenda que a empregue para o uso en produción. Pode empregar unha " +#~ "versión distinta á seleccionada estabrecendo a variable de ambiente " +#~ "GCL_PROF a calquera cadea non baleira para empregar o soporte de " +#~ "cronometrado, ou á cadea baleira para as versións máis optimizadas; por " +#~ "exemplo, GCL_PROF=t gcl@EXT@. Se está activado o cronometrado, hase " +#~ "informar diso no cartel que aparece ao iniciar o programa." diff --git a/debian/po/it.po b/debian/po/it.po new file mode 100644 index 0000000..a488561 --- /dev/null +++ b/debian/po/it.po @@ -0,0 +1,102 @@ +# ITALIAN TRANSLATION OF GCL'S PO-DEBCONF FILE. +# COPYRIGHT (C) 2009 THE GCL'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gcl package. +# +# Vincenzo Campanella , 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2009-11-29 08:39+0100\n" +"Last-Translator: Vincenzo Campanella \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "" +"Usare in modo predefinito la compilazione ANSI, che è in fase di " +"approntamento?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"Accanto all'immagine tradizionale CLtL1, in uso in realtà produttive, GCL " +"sta preparando un'immagine conforme ad ANSI." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Per maggiori informazioni consultare il file «README.Debian». La scelta di " +"questa opzione determinerà quale immagine verrà utilizzata in modo " +"predefinito durante l'esecuzione di «gcl@EXT@»." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Questa impostazione può essere sovrascritta impostando la variabile " +"d'ambiente «GCL_ANSI» con una stringa non vuota per la compilazione ANSI e " +"con una stringa vuota per la compilazione CLtL1, per esempio: «GCL_ANSI=t " +"gcl@EXT@». Il tipo di compilazione attualmente in uso viene mostrato nella " +"schermata di avvio." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Usare il profiling in modo predefinito?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL possiede un supporto opzionale per il profiling tramite gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Per maggiori dettagli consultare la documentazione per «si::gprof-start» e " +"«si::gprof-quit». Poiché questa compilazione è più lenta, rispetto a quella " +"senza supporto per gprof, non è raccomandata per un utilizzo in realtà " +"produttive." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Per compilazioni ottimizzate impostare la variabile d'ambiente «GCL_PROF» a " +"una stringa vuota, oppure per impostare il supporto al profiling impostarla " +"a una stringa non vuota, per esempio «GCL_PROF=t gcl@EXT@». La schermata " +"d'avvio indicherà se il profiling è abilitato." diff --git a/debian/po/ja.po b/debian/po/ja.po new file mode 100644 index 0000000..169782b --- /dev/null +++ b/debian/po/ja.po @@ -0,0 +1,96 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gcl package. +# victory , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2013-07-27 14:28+0000\n" +"PO-Revision-Date: 2013-07-27 23:28+0900\n" +"Last-Translator: victory \n" +"Language-Team: Japanese \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "未完成の ANSI ビルドをデフォルトで使用しますか?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL は未だに生産利用されている従来の CLtL1 イメージに加えて ANSI 準拠のイメー" +"ジを提供する過程にあります。" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"用語については README.Debian ファイルに簡単な説明があります。このオプションの" +"選択「gcl@EXT@」を実行するときにどのイメージをデフォルトで利用するのか決定する" +"ことになります。" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"この設定は、GCL_ANSI 環境変数に ANSI ビルドでは空白ではない任意の文字列、" +"CLtL1 ビルドでは空白文字列をセットすることで上書きできます。例えば GCL_ANSI=t " +"gcl@EXT@。現在実行しているビルドの種類は初期の開始時バナーで報告されます。" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "デフォルトで profiling ビルドを使いますか?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "" +"GCL にはオプションで gprof 経由の profiling サポートがあります。" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"詳細については si::gprof-start や si::gprof-quit の文書を見てください。このビ" +"ルドは gprof サポートのないビルドより遅いため、最終的な生産利用にはお勧めしま" +"せん。" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"ビルドをもっと最適化する場合は GCL_PROF 環境変数に空白文字列を、profiling をサ" +"ポートさせる場合は空白ではない任意の文字列をセットしてください。例えば GCL_" +"PROF=t gcl@EXT@。profiling が有効な場合、初期の開始時バナーで報告されます。" diff --git a/debian/po/nl.po b/debian/po/nl.po new file mode 100644 index 0000000..c46d99f --- /dev/null +++ b/debian/po/nl.po @@ -0,0 +1,101 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-01-01 21:15+0100\n" +"Last-Translator: Bart Cornelis \n" +"Language-Team: debian-l10n-dutch \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Dutch\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Wilt u standaard de in-ontwikkeling-zijnde ansi-compilatie gebruiken?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL is bezig om, aanvullend op het traditionele CLtL1-compilatie dat nog " +"steeds in gebruik is, een aan ANSI voldoend compilatie te voorzien." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Meer informatie hierover vindt u in het bestand /usr/share/doc/gcl/README." +"Debian . Deze optie bepaalt welk compilatie standaard gebruikt wordt wanneer " +"u 'gcl@EXT@' uitvoert. " + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Deze instelling kan altijd overstegen worden door de omgevingsvariabele " +"GCL_ANSI in te stellen op een niet-lege string om de ANSI-compilatie te " +"bekomen, en op een lege string om de CLtL1-compilatie te bekomen (bv. " +"GCL_ANSI=t gcl@EXT@). De momenteel afgedwongen compilatie-soort wordt " +"weergegeven in de initiële opstartbanier." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "" +"Wilt u standaard een compilatie met ondersteuning voor profilering gebruiken?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL heeft optionele ondersteuning voor profilering via gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Meer informatie vindt u in de documentatie voor si::gprof-start en si::gprof-" +"quit . Aangezien compilaties met gprof-ondersteuning trager zijn dan deze " +"zonder is dit niet aan te raden voor productie-gebruik." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Om een geoptimaliseerde compilatie te verkrijgen stelt u de " +"omgevingsvariabele GCL_PROF in op een lege string, of op een niet-lege " +"string als u profilering wilt ondersteunen (bv. GCL_PROF=t gcl@EXT@). Als " +"profilering geactiveerd is wordt dit weergegeven in de initiële " +"opstartbanier ." diff --git a/debian/po/pt.po b/debian/po/pt.po new file mode 100644 index 0000000..fb8b56b --- /dev/null +++ b/debian/po/pt.po @@ -0,0 +1,99 @@ +# translation of gcl debconf to Portuguese +# Copyright (C) 2007 Américo Monteiro +# This file is distributed under the same license as the gcl package. +# +# Américo Monteiro , 2007. +msgid "" +msgstr "" +"Project-Id-Version: gcl 2.6.7-36\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2007-12-23 16:44+0000\n" +"Last-Translator: Américo Monteiro \n" +"Language-Team: Portuguese \n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Usar a compilação 'ainda em desenvolvimento' ANSI por prédefinição? " + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL está no processo de disponibilizar uma imagem compatível com ANSI como " +"adição à sua imagem tradicional CLtL1 ainda em utilização de produção." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Por favor veja o ficheiro README.Debian para uma breve descrição destes " +"termos. Escolher esta opção irá determinar qual imagem será usada por " +"prédefinição ao executar 'gcl@EXT@'." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Esta opção pode ser sobreposta ao regular a variável de ambiente GCL_ANSI " +"para qualquer string não-vazia para a compilação ANSI, e para uma string " +"vazia para a compilação CLtL1, como por exemplo GCL_ANSI=t gcl@EXT@. O tipo " +"de compilação actualmente imposto será reportado no banner inicial de " +"arranque." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Usar, como pré-definição, a compilação com 'profiling'?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "O GCL tem suporte opcional para 'profiling' via gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Por favor veja a documentação de si::gprof-start e si::gprof-quit para mais " +"detalhes. Como esta compilação é mais lenta do que as compilações sem o " +"suporte para gprof, não é recomendada para utilização de produção final." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Regule a variável de ambiente GCL_PROF para uma string vazia para mais " +"compilações optimizadas, ou para qualquer string não-vazia para suporte de " +"'profiling'; como por exemplo GCL_PROF=t gcl@EXT@. Se o 'profiling' estiver " +"activo, isto será reportado no banner inicial de arranque." diff --git a/debian/po/pt_BR.po b/debian/po/pt_BR.po new file mode 100644 index 0000000..74f2f03 --- /dev/null +++ b/debian/po/pt_BR.po @@ -0,0 +1,98 @@ +# Debconf translations for gcl. +# Copyright (C) 2016 THE gcl'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gcl package. +# Adriano Rafael Gomes , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2016-01-05 11:09-0200\n" +"Last-Translator: Adriano Rafael Gomes \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Usar a versão ANSI em desenvolvimento por padrão?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"O GCL está em processo de fornecer uma imagem de acordo com o padrão ANSI em " +"adição à sua imagem CLtL1 tradicional, ainda em uso em produção." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Por favor, veja o arquivo README.Debian para uma breve descrição desses " +"termos. Escolher essa opção determinará qual imagem será usada por padrão ao " +"executar \"gcl@EXT@\"." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Essa configuração pode ser sobreposta definindo a variável de ambiente " +"GCL_ANSI para qualquer texto não vazio para a versão ANSI, e para um texto " +"vazio para a versão CLtL1, por exemplo, GCL_ANSI=t gcl@EXT@. O sabor da " +"versão atualmente definida será exibida na mensagem de inicialização." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Usar a versão de \"profiling\" por padrão?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "O GCL tem suporte opcional a \"profiling\" via gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Por favor, veja a documentação para si::gprof-start e si::gprof-quit para " +"detalhes. Como essa versão é mais lenta que versões sem suporte a gprof, ela " +"não é recomendada para uso final em produção." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Defina a variável de ambiente GCL_PROF para um texto vazio para versões mais " +"otimizadas, ou para qualquer texto não vazio para ter suporte a \"profiling" +"\"; por exemplo, GCL_PROF=t gcl@EXT@. Se o \"profiling\" estiver habilitado, " +"isso será exibido na mensagem de inicialização." diff --git a/debian/po/ru.po b/debian/po/ru.po new file mode 100644 index 0000000..dfd56cb --- /dev/null +++ b/debian/po/ru.po @@ -0,0 +1,100 @@ +# translation of ru.po to Russian +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Yuri Kozlov , 2008. +msgid "" +msgstr "" +"Project-Id-Version: 2.6.7-36\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-01-03 10:22+0300\n" +"Last-Translator: Yuri Kozlov \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Использовать разрабатываемую ANSI сборку по умолчанию?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"Помимо обычного образа CLtL1, используемого в повсеместной работе, GCL имеет " +"практически готовый образ, соответствующий ANSI." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Краткое описание приведено в файле README.Debian. Данным выбором " +"определяется, какой из образов будет использован по умолчанию при выполнении " +"'gcl@EXT@'." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Эта настройка может быть переопределена установкой переменной окружения " +"GCL_ANSI в непустое значение для ANSI сборки, а пустым значением выбирается " +"CLtL1 сборка, например GCL_ANSI=t gcl@EXT@. Текущий используемый тип сборки " +"будет показан при первом запуске." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Использовать по умолчанию профилируемую сборку?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL поддерживает необязательное профилирование через gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Подробней об этом смотрите в документации на si::gprof-start и si::gprof-" +"quit. Так как данная сборка работает медленнее чем без поддержки gprof, её " +"не рекомендуется использовать в реальной работе." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Задание переменной окружения GCL_PROF пустого значения включает более " +"оптимизированную сборку, а любое непустое -- поддержку профилирования; " +"например GCL_PROF=t gcl@EXT@. Если профилирование включено, то об этом будет " +"написано при первом запуске." diff --git a/debian/po/sv.po b/debian/po/sv.po new file mode 100644 index 0000000..9545624 --- /dev/null +++ b/debian/po/sv.po @@ -0,0 +1,106 @@ +# translation of gcl_2.6.7-36.1_sv.po to Swedish +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# Developers do not need to manually edit POT or PO files. +# +# Martin gren , 2008. +msgid "" +msgstr "" +"Project-Id-Version: gcl_2.6.7-36.1_sv\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-07-24 18:21+0200\n" +"Last-Translator: Martin gren \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Anvnd det nnu inte frdiga ANSI-bygget som standard?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL arbetar p att tillhandahlla en ANSI-godknd bild frutom dess " +"traditionella CLtL1-bild som fortfarande anvnds i produktionsmiljn." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Se README.Debian-filen fr en versiktlig beskrivning av dessa termer. Nr " +"du vljer det hr alternativet avgrs vilken bild som kommer anvndas som " +"standard nr 'gcl@EXT@' krs." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Denna instllning kan verskridas genom att stta miljvariabeln GCL_ANSI " +"till en icke-tom strng fr ANSI-bygget, och till den tomma strngen fr " +"CLtL1-bygget, t. ex. GCL_ANSI=t gcl@EXT@. Det bygge som fr tillfllet " +"anvnds kommer anges i uppstartsutskriften." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Anvnd profileringsbygget som standard?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL har valfritt std fr profilering via gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Se dokumentationen fr si::gprof-start och si::gprof-quit fr detaljer. " +"Eftersom detta bygge r lngsammare n byggen utan std fr gprof, " +"rekommenderas det inte fr slutlig anvndning i produktionsmilj." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Stt miljvariabeln GCL_PROF till den tomma strngen fr mer optimiserade " +"byggen, eller en icke-tom strng fr profileringsstd; t. ex. GCL_PROF=t " +"gcl@EXT@. Om profilering r aktiverad, kommer denna rapporteras i den " +"ursprungliga uppstartsutskriften." diff --git a/debian/po/templates.pot b/debian/po/templates.pot new file mode 100644 index 0000000..86276ce --- /dev/null +++ b/debian/po/templates.pot @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gcl\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" diff --git a/debian/po/vi.po b/debian/po/vi.po new file mode 100644 index 0000000..d1fa6de --- /dev/null +++ b/debian/po/vi.po @@ -0,0 +1,98 @@ +# Vietnamese translation for GCL. +# Copyright © 2007 Free Software Foundation, Inc. +# Clytie Siddall , 2007 +# +msgid "" +msgstr "" +"Project-Id-Version: gcl 2.6.7-36\n" +"Report-Msgid-Bugs-To: gcl@packages.debian.org\n" +"POT-Creation-Date: 2012-12-30 11:53-0400\n" +"PO-Revision-Date: 2008-01-04 16:27+1030\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: LocFactoryEditor 1.7b1\n" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "Use the work-in-progress ANSI build by default?" +msgstr "Dùng bản xây dựng đang phát triển ANSI theo mặc định không?" + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"GCL is in the process of providing an ANSI compliant image in addition to " +"its traditional CLtL1 image still in production use." +msgstr "" +"GCL đang phát triển chức năng cung cấp ảnh tùy theo ANSI thêm vào ảnh CLtL1 " +"truyền thống vẫn còn được sử dụng trong trường hợp sản xuất." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"Please see the README.Debian file for a brief description of these terms. " +"Choosing this option will determine which image will be used by default when " +"executing 'gcl@EXT@'." +msgstr "" +"Xem tài liệu Đọc Đi (README.Debian) để tìm mô tả ngắn về các thuật ngữ này. " +"Bật tùy chọn này thì xác định ảnh nào cần dùng theo mặc định khi thực hiện " +"lệnh « gcl@EXT@ »." + +#. Type: boolean +#. Description +#: ../gcl.templates:2001 +msgid "" +"This setting may be overridden by setting the GCL_ANSI environment variable " +"to any non-empty string for the ANSI build, and to the empty string for the " +"CLtL1 build, e.g. GCL_ANSI=t gcl@EXT@. The currently enforced build flavor " +"will be reported in the initial startup banner." +msgstr "" +"Vẫn còn có thể ghi đè lên thiết lập này bằng cách đặt biến môi trường « " +"GCL_ANSI » thành bắt cứ chuỗi không rỗng cho bản xây dựng ANSI, và cho chuỗi " +"rỗng cho bản xây dựng CLtL1, v.d. « GCL_ANSI=t gcl@EXT@ ». Kiểu bản xây dựng " +"hiện thời được chọn sẽ được thông báo trên băng cờ khởi chạy đầu tiên." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "Use the profiling build by default?" +msgstr "Dùng bản xây dựng đo hiệu năng sử dụng theo mặc định không?" + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "GCL has optional support for profiling via gprof." +msgstr "GCL có hỗ trợ tùy chọn để đo hiệu năng sử dụng thông qua gprof." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Please see the documentation for si::gprof-start and si::gprof-quit for " +"details. As this build is slower than builds without gprof support, it is " +"not recommended for final production use." +msgstr "" +"Xem tài liệu hướng dẫn về « si::gprof-start » và « si::gprof-quit » để tìm " +"chi tiết. Vì bản xây dựng này chạy chậm hơn các bản xây dựng không hỗ trợ " +"gprof, không khuyên bạn sử dụng nó trong trường hợp sản xuất cuối cùng." + +#. Type: boolean +#. Description +#: ../gcl.templates:3001 +msgid "" +"Set the GCL_PROF environment variable to the empty string for more optimized " +"builds, or any non-empty string for profiling support; e.g. GCL_PROF=t " +"gcl@EXT@. If profiling is enabled, this will be reported in the initial " +"startup banner." +msgstr "" +"Đặt biến môi trường « GCL_PROF » thành chuỗi rỗng cho các bản xây dựng tối " +"ưu hơn, hoặc cho bất cứ chuỗi không rỗng nào để hỗ trợ chức năng đo hiệu " +"năng sử dụng, v.d. « GCL_PROF=t gcl@EXT@ ». Hiệu lực chức năng đo hiệu năng " +"sử dụng thì nó được thông báo trên băng cờ khởi chạy đầu tiên." diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..01ae061 --- /dev/null +++ b/debian/rules @@ -0,0 +1,281 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 by Joey Hess. +# +# This version is for a hypothetical package that builds an +# architecture-dependant package, as well as an architecture-independent +# package. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +export GCL_MEM_MULTIPLE=0.1 + +# This is the debhelper compatability version to use. +ARCHT:=$(shell dpkg-architecture -qDEB_HOST_ARCH) + +MCC?=gcc-11 +# ifeq ($(ARCHT),alpha) +# MCC:=gcc-4.6 +# endif +# ifeq ($(ARCHT),mips) +# MCC:=gcc-4.6 +# endif +# ifeq ($(ARCHT),mipsel) +# MCC:=gcc-4.6 +# endif +# ifeq ($(ARCHT),ia64) +# MCC:=gcc-4.6 +# endif +# ifeq ($(ARCHT),armel) +# MCC:=gcc-4.6 +# endif +# ifeq ($(ARCHT),armhf) +# MCC:=gcc-4.6 +# endif + +#RELOC=locbfd +#RELOC?=statsysbfd +RELOC?=custreloc +ifeq ($(ARCHT),ia64) +RELOC=dlopen +endif +# ifeq ($(ARCHT),ppc64) +# RELOC=dlopen +# endif +#ifeq ($(ARCHT),hppa) +#RELOC=dlopen +#endif + +GMP?= + +DEBUG= + +ARCHCONF?= +ifeq ($(ARCHT),armhf) +ARCHCONF=--enable-cstackmax=0xc0000000 +endif +ifeq ($(ARCHT),armel) +ARCHCONF=--enable-cstackmax=0xc0000000 +endif + + +#ifeq ($(ARCHT),hppa) +#DEBUG=--enable-debug +#endif + +VERS=$(shell echo $$(cat majvers).$$(cat minvers)) +#EXT:=cvs + +CFG:=$(addsuffix /config.,.)# gmp4/configfsf. +# Bug in autoconf dependency on emacsen-common workaround +#CFGS:=$(addsuffix .ori,configure $(addsuffix guess,$(CFG)) $(addsuffix sub,$(CFG))) +CFGS:=$(addsuffix .ori,$(addsuffix guess,$(CFG)) $(addsuffix sub,$(CFG))) + +$(filter %.guess.ori,$(CFGS)): %.ori: /usr/share/misc/config.guess % + ! [ -e $* ] || [ -e $@ ] || cp $* $@ + [ $$($< -t | tr -d '-') -le $$(./$* -t | tr -d '-') ] || cp $< $* + touch $@ + +$(filter %.sub.ori,$(CFGS)): %.ori: /usr/share/misc/config.sub % + ! [ -e $* ] || [ -e $@ ] || cp $* $@ + [ $$($< -t | tr -d '-') -le $$(./$* -t | tr -d '-') ] || cp $< $* + touch $@ + +configure.ori: %.ori: configure.in + ! [ -e $* ] || [ -e $@ ] || cp $* $@ + cd $(@D) && autoconf + touch $@ + +configure-%-stamp: $(CFGS) + + dh_testdir + + ! [ -e unixport/saved_pre_gcl ] || $(MAKE) clean + +# chmod -R +x gmp4/* + + [ "$*" != "trad" ] || FLAGS="--disable-ansi" ; \ + [ "$*" != "gprof" ] || FLAGS="--disable-ansi --enable-gprof" ; \ + [ "$*" != "ansi-gprof" ] || FLAGS="--enable-gprof" ; \ + eval `dpkg-buildflags --export=sh` && CC=$(MCC) ./configure \ + --host=$$(dpkg-architecture -qDEB_HOST_GNU_TYPE) \ + --disable-statsysbfd \ + --disable-custreloc \ + --disable-dlopen \ + --enable-prelink \ + --enable-$(RELOC) \ + $(GMP) \ + $(DEBUG) \ + $(ARCHCONF) \ + $$FLAGS \ + --prefix=/usr \ + --mandir=\$${prefix}/share/man \ + --enable-infodir=\$${prefix}/share/info \ + --enable-emacsdir=\$${prefix}/share/emacs/site-lisp + + touch $@ + + +build-%-stamp: configure-%-stamp + dh_testdir + + $(MAKE) + + rm -rf debian/$* + mkdir -p debian/$* + $(MAKE) install DESTDIR=$$(pwd)/debian/$* + [ "$(findstring gprof,$*)" = "" ] || (\ + tmp=debian/$*; old=/usr/lib/gcl-$(VERS); new=$$old-prof;\ + if [ "$(findstring ansi,$*)" = "" ] ; then i=saved_gcl ; else i=saved_ansi_gcl ; fi;\ + mv $$tmp/$$old $$tmp/$$new ;\ + echo "(si::reset-sys-paths \"$$new/\")(si::save-system \"debian/tmp-image\")" | $$tmp/$$new/unixport/$$i &&\ + mv debian/tmp-image $$tmp/$$new/unixport/$$i;) + + touch $@ + +bclean-stamp: + $(MAKE) clean + touch $@ + +ansi-tests/test_results: build-ansi-stamp + $(MAKE) $@ + +build: build-arch build-indep +build-arch: build-stamp +build-indep: build-stamp +build-stamp: build-gprof-stamp build-ansi-gprof-stamp build-trad-stamp build-ansi-stamp ansi-tests/test_results + touch $@ + +debian/control.rm: + rm -f `echo $@ | sed 's,\.rm$$,,1'` + +debian/control: debian/control.rm + cp debian/control.$(EXT) debian/control + +clean: debian/control debian/gcl.templates + dh_testdir + dh_testroot + rm -f *stamp + debconf-updatepo + + $(MAKE) clean + + dh_clean + rm -rf debian/gprof debian/ansi-gprof debian/trad debian/ansi $(INS) debian/substvars debian.upstream + rm -rf *stamp + for i in $(CFGS) ; do ! [ -e $$i ] || mv $$i $${i%.ori} ; done + +INS:=$(shell for i in debian/in.* ; do echo $$i | sed 's,in.,,1' ; done |sed "s,gcl,gcl$(EXT),g") + +$(INS): debian/gcl$(EXT)% : debian/in.gcl% + cat $< | sed 's,@EXT@,$(EXT),g' >$@ + +install: install-stamp +install-stamp: build-stamp debian/control $(INS) + dh_testdir + dh_testroot +# dh_clean -k + dh_prep + dh_installdirs + + mkdir -p debian/tmp + cp -a debian/ansi/* debian/tmp/ + cp -a debian/trad/* debian/tmp/ + cp -a debian/gprof/* debian/tmp/ + cp -a debian/ansi-gprof/* debian/tmp/ + + mv debian/tmp/usr/share/emacs/site-lisp debian/tmp/usr/share/emacs/foo + mkdir -p debian/tmp/usr/share/emacs/site-lisp + mv debian/tmp/usr/share/emacs/foo debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT) + + cat debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT)/gcl.el |\ + sed "s,(provide 'gcl),(provide 'gcl$(EXT)),1" >tmp &&\ + mv tmp debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT)/gcl$(EXT).el + [ "$(EXT)" = "" ] || rm debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT)/gcl.el + + cat debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT)/dbl.el |\ + sed "s,(provide 'dbl),(provide 'dbl$(EXT)),1" >tmp &&\ + mv tmp debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT)/dbl$(EXT).el + [ "$(EXT)" = "" ] || rm debian/tmp/usr/share/emacs/site-lisp/gcl$(EXT)/dbl.el + + [ "$(EXT)" = "" ] || \ + for i in debian/tmp/usr/share/info/*.info*; do \ + mv $$i $$(echo $$i | sed "s,gcl,gcl$(EXT),g"); done + + mv debian/tmp/usr/share/doc debian/tmp/usr/share/foo + mkdir -p debian/tmp/usr/share/doc/gcl-doc + mv debian/tmp/usr/share/foo/* debian/tmp/usr/share/doc/gcl-doc + rmdir debian/tmp/usr/share/foo + + [ "$(EXT)" = "" ] || \ + mv debian/tmp/usr/share/doc/gcl-doc debian/tmp/usr/share/doc/gcl$(EXT)-doc + + [ "$(EXT)" = "" ] || \ + (cat debian/tmp/usr/share/man/man1/gcl.1 |sed -e 's, gcl , gcl$(EXT) ,g' 's, GCL , GCL$(EXT) ,g' >debian/foo && \ + mv debian/foo debian/tmp/usr/share/man/man1/gcl$(EXT).1) + + # cat debian/tmp/usr/lib/gcl-$(VERS)/gcl-tk/demos/index.lsp | \ + # sed "s,$$(pwd)/debian/tmp,,1" >debian/foo + # mv debian/foo debian/tmp/usr/lib/gcl-$(VERS)/gcl-tk/demos/index.lsp + + rm -f debian/tmp/usr/bin/*.exe debian/tmp/usr/bin/*.bat + + find debian/tmp -type f -name "*.lsp" -exec chmod ugo-x {} \; + find debian/tmp -type f -name "*.lisp" -exec chmod ugo-x {} \; + find debian/tmp -type f -name "*.el" -exec chmod ugo-x {} \; + find debian/tmp -type f -name "*.tcl" -exec chmod ugo-x {} \; + + rm -f debian/tmp/usr/bin/gcl + TKVERS=$$(cat bin/gcl | grep /tk | head -1l | sed "s,.*/tk\([0-9.]*\)\").*,\1,1"); \ + cat debian/gcl.sh | sed -e "s,@EXT@,$(EXT),g" \ + -e "s,@VERS@,$(VERS),g" \ + -e "s,@TKVERS@,$$TKVERS,g" >debian/tmp/usr/bin/gcl$(EXT) + chmod 0755 debian/tmp/usr/bin/gcl$(EXT) + + rm -rf debian/tmp/usr/lib/gcl-$(VERS)/info + + dh_install + + touch $@ + +# Build architecture-independent files here. +# Pass -i to all debhelper commands in this target to reduce clutter. +binary-indep: build install + dh_testdir -i + dh_testroot -i + dh_installdocs -i + dh_installinfo -i + dh_installchangelogs ChangeLog -i + dh_link -i + dh_compress -i + dh_fixperms -i + dh_installdeb -i + dh_gencontrol -i + dh_md5sums -i + dh_builddeb -i + +binary-arch: build install #debian/substvars + dh_testdir -a + dh_testroot -a + dh_installdocs -a -XRELEASE-2.6.2.html + dh_installemacsen -a + dh_installman -a + dh_installdebconf -a + sed -i -e 's,@EXT@,$(EXT),g' debian/gcl$(EXT)/DEBIAN/templates + dh_installchangelogs ChangeLog -a + dh_strip -a -Xlibgcl -Xlibansi_gcl +# -Xgcl-$(VERS)-prof/unixport/saved_gcl -Xgcl-$(VERS)-prof/unixport/saved_ansi_gcl + dh_lintian -a + dh_link -a + dh_compress -a + dh_fixperms -a + dh_installdeb -a + dh_shlibdeps -a + dh_gencontrol -a -u"-Vgcc=$(MCC)" + dh_md5sums -a + dh_builddeb -a + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure +.PRECIOUS: configure-trad-stamp configure-ansi-stamp configure-gprof-stamp configure-ansi-gprof-stamp diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/source/include-binaries b/debian/source/include-binaries new file mode 100644 index 0000000..091df7a --- /dev/null +++ b/debian/source/include-binaries @@ -0,0 +1,4 @@ +info/gcl.pdf +info/gcl-si.pdf +info/gcl-tk.pdf +xgcl-2/dwdoc.pdf diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides new file mode 100644 index 0000000..02ee68d --- /dev/null +++ b/debian/source/lintian-overrides @@ -0,0 +1,11 @@ +gcl source: source-is-missing [info/gcl/Constraints-on-the-COMMON_002dLISP-Package-for-Conforming-Programs.html] +gcl source: source-is-missing [info/gcl/Defsetf-Lambda-Lists.html] +gcl source: source-is-missing [info/gcl/Destructuring-Lambda-Lists.html] +gcl source: source-is-missing [info/gcl/Generic-Function-Lambda-Lists.html] +gcl source: source-is-missing [info/gcl/Macro-Lambda-Lists.html] +gcl source: source-is-missing [info/gcl/Ordinary-Lambda-Lists.html] +gcl source: source-is-missing [info/gcl/Specialized-Lambda-Lists.html] +gcl source: source-is-missing [info/gcl/The-_0022Compound-Type-Specifier-Arguments_0022-Section-of-a-Dictionary-Entry.html] +gcl source: source-is-missing [info/gcl/The-_0022Compound-Type-Specifier-Syntax_0022-Section-of-a-Dictionary-Entry.html] +gcl source: source-is-missing [info/gcl/defmethod.html] +gcl source: source-is-missing [info/gcl/loop.html] diff --git a/debian/texi.awk b/debian/texi.awk new file mode 100755 index 0000000..ccf9cdb --- /dev/null +++ b/debian/texi.awk @@ -0,0 +1,27 @@ +#!/usr/bin/awk -f + +/^@defun/ { + a=split($0,A,"("); + b=split($0,B,")"); + if (a==b) + print ; + else { + i=1; + c=$0; + } + next; +} +{ + if (i) { + sub("^ *",""); + c=c " " $0; + a=split(c,A,"("); + b=split(c,B,")"); + if (a==b) { + print c; + c=""; + i=0; + } + } else + print; +} diff --git a/debian/upstream/signing-key.asc b/debian/upstream/signing-key.asc new file mode 100644 index 0000000..741d314 --- /dev/null +++ b/debian/upstream/signing-key.asc @@ -0,0 +1,88 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +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 +=tBlv +-----END PGP PUBLIC KEY BLOCK----- diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..4e862f2 --- /dev/null +++ b/debian/watch @@ -0,0 +1,2 @@ +version=4 +options=pasv,pgpsigurlmangle=s/$/.sig/ ftp://ftp.gnu.org/pub/gnu/gcl gcl-([0-9.]*).tar.gz debian uupdate diff --git a/info/gcl-si.pdf b/info/gcl-si.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ab2781a6373638f752eb9c74bc8ca48301c35d77 GIT binary patch literal 266557 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 DF-9}) literal 0 HcmV?d00001 diff --git a/info/gcl-tk.pdf b/info/gcl-tk.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c397e142cc670a1c2aabecc2492271405e6d7cf4 GIT binary patch literal 398098 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%0DH4~} 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 z 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%0A934YP?ML%F1mrAUnyy!23Vy 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

d>PKoqziumeNxn#*?0;!{k{*d4}2NysT6VNhJ_3 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 z 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μ-&cs4eVK0tT6IFrsE1G+wt~Kbs^i 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
  • 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 z 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

      q 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 zΠ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ℑ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�sK&X3ycP| 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
      1. )N)c=<;S-HfW;7YxZzbqxob)SpW!tL>R8O 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 {X(X08j}a6k*eSuk2#Hq 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℘5d%zVPfXlS^5Y2U0u<&4D)<^DmgUO^|a?lL%>Cx(s?UDszfg9frJD zt}7?94$mq50Vt=vIHFL{{3ImKPW{7y24=a_2avq|Nlf@)VEfPjns@#boC+Pn4vm>b zw1_$r;v5wTBJzUI*3&5C_F?S!c|}?8l+oIF4X!(0N{kuFOANKO)LF}pMcCJ*wGO1c z8G9gPxdXHI<0m9VNZx)r>hv93v$--%0su^L0b~#P^j2vl%|r)yRS#4Fzb#YKGobB5 zRXiRf#lh8YuM;%)_@zIy;wda{_i6m|a-Ks)E&ZmXsVmq)?N&l+L9(A5BNv*I=STp( zQ-NObCwG&rtIIpMmVkR9&BNmte&W~>3ROpd4eQD&6Yp9@o*5>ZMBv0pEm*9`gV+G^ zLEx@Hg0-D3w#M+r=m3?xVd^H8Rj{gEWBo`q;keF3lP)O;*u4g+4+H$GKrZ9c5M6<0 zC9l=y2U2xIxCA4M8SW!g19TAx`tS$@=@Sg;TZ`ix%}92Es2eWm&m|QiLEd8tlE>dv z;RcRJL1z&o4{N9m{OwG5G^?zjG?!ULF7>W{y8e3bHgHtjEz>o$u-M(ESf55bu$CzZ zvL}?;fgHv+8}dj04HCtX%Ai$p!a;q3zmhKPKYs^jrcfpKtQC~4pYh0ZvT*` zc_sypzgBHb3gh?Q0DPN7Bed2Idm2$fQ8(RSqzqjPL4jawrrOz+KVL1a7!m<3-nlcx z8>ouTx`KU|KPoDOHcFfW=h7DdxRQ$%To_(611Et3T%G=%2=iQL^jtpLrWSbG&jS{K zcmp*5PV(+^3NFBUZN>nu2zcr8vgtzft|E}88GFtG=mg477fVdnaG$h=>T+2lB`lsoKU(hULeD${%&8E zfgXfFi`9^cb+|()B$4|r?rjgIRJeWnzBq^*K(&mA0YEh0A-$Mja@^+Kw^zOH5of zjdIw>W5DqM0=a+nCzNB3qEJ2_-UGb9W%ni&mX>5#yEd$c*eF=Ks;lNza;cJn=K*64 zzX=B=AK2kkyS=^O{_KGLc0=|0$O2;}@yuG-x4@dCDabh{fU0M~A5?W2@+a?59cG8I z^l69+h2OcTrpY!?f3A#G-2w}eO1eXNT!>_rc|LEgH6Wn~*CJte=q8LyiiPY-I}JkU zi82`+#F@Bhv$oAAPu}fBju|j+&q&2qM+b$M#*ejRzgr`P3Ex|cEFzo{(LL7JkBuDM z(~wCHR*!t96w77Er$s}~ICj1FV%RlwUd;_110e_@W9rZ6(h{k{;~Sm|w;E zZr@%?VTao3sVRku@^T5c*_hGWuf3cInWD8Ow9*vvkYyBK02jDZB{g?0mmkq=yI#+} zRVlzDzFe=@NH;Cp&NwOCMm6Ah7LF(ZhCxHf?q{k%`xLQ}MWhCdS%)vZu=~Jr>J3>} zXLr33m8TOhW}7frS8j$en*=jizILkw5crESW;gbq*LlA7{;iVTz;xSpv0AljmX~Vc z_>3mF0O9wM4QnfgIGB!V6Z3Bb1xm&ax}$lj1=o8!VU#S1DlfGm3V~oEf!xZ{n@R~j z0>>AMAYqz=M<}$=V7>I*Evb;u}O$(%bYL7to)Y;x~ z2INJB@`S~c#w=!r&Q0a@0uJE(JQP9r`|DRJv~FzR}}It&UdYw0D?y@5K@l7DqXK?^cxLy z$J;ihlzMug@b>(SVN~K`u*VXnm|=@NgBYr;N31vyq0R3+%<(Jy9&g$fbyGbiuG;E(~(=A{B$j_EzaR`V;I$S14aZdxTF=MnTyO>hX z|LiInN7v`5%OV#kw~L?+5X^6jfO_?^@mAIa;64X{V-A81ADCu|89-V=>!xzIB|@H} zoMvbj$MhEn46x5EgSXrv>gCK*mn>X{?5r-lt^0w6ltuI^z``UIFIinkHlXKA>*}SY zmaV+L6Jh_oE=5%mlUlth7~{ z>M2;lzECGFNY@%W<@y5oVK@yB<~dugqgaJ7KWvbs6JDv-3qgDFmJ0in3qh17p3@OC zoUF1_m-Wp&wF>zug9RE+{#|gB*|xz5=cH*v#matu)Y}C>mF!>{sWW0j-{)z`$kndj=92!<<;cXaLz0ih@)q za>&u;n}VNsqF9TLZ>GxhUTA7S9I^N9Uv|cgzE)kUvarl}!YcRCkdJ-{T|KQ&=b-z; z$c`i}1S|z?1r=Yxz``(Nz|8|CBbZ!J1cA~st6|2KeLotey*~IZoev)U!^~eW?@0K> zBVR+|_f~+DAetYM=@-!%W=`+x>*c#^O5N^Hp9kw2o?v@FM2Sd|xSY|`ILrpNS?$w$ z$4%G^TC`do9YYisn$ynd(T@R>C@}(gYPiC?fHs5VzrmQH5@U0;S(8R?@QiV)8`2@9q~jVz z1)4Ob>iU_E9%FBT&Od>5+qJ$dJ8lh=tM$c25~-C-L{65(Q*SBjb3?gJ6WsU2LU9x2 zr;GZv?!O*?sZ45xUES4sr@1q_S{52|TBRu?JP3D%CE{`{n6`7gCBZX)>}p|lWGT6$ zaOlrBG04ly$ytL4>0iCfclcKhoTsA^P=Nb(yivKaFg!1K)SPPJWYhk^XIE3QqV$Pw z!r)z<(c1hZ%92X8i9!(E5UD4XfvI`+(?u6dbidy_bw60r36vN&8+d1suOdFt zuEI|c9G^zYiIS>re09ZClL9@y{EV(OxeOgc^UB_Q$+~IvAk{72?1eJK+4bW2Aq|Ou z;ST*vn|{H5IJmlseAKfv@m5Nea?M!zOqw))c@mNKgU=Vrpy^^q4^(eB1{Bj|@Yetk z3#f!ZhJj=too;RoAOfUpJ@DJ0JRbfjMoS4z$Ca1#$`dyQp+gHT4pgZNDoM63?UF(8 zTOH?ka0)i8A!b`y1r(!unLG}UKfs)b%0WK|kb-)Xwc=uV4b&t1oX?Tu*M-s^yTKz{Ok<%tVV3E z#kIZzS-w`j7FyQZW3#xWyh#ZKv&4)PFY2^@Sx{G7)?5bH0+8 zB(9_TcH)v;xomJtNl9zh3D|*_YB^tTc-!vk{*+`3o?Zlyj{Y#GUZ<0bHdIZ6H(|BN zLA~zHn}ZwhH@B{jt(A+c+lfg13jl%T!! z4ZA(v-VNjE2A73o-@Bo%ys!P+Yu`OK*XcDoE2q1ry_T%#i|3d2x=dKr%iWrfnOE;l z7qJMT%+spqGYRCImkYMQ>MGrZwYhGFwyREhz;a2)iy(+qDHhzc&3CmU?4CJ=O zTTx5pcyYFF!%Cl?mZ&yv4q-z@Iz&}Z9c0ouK^E~25(b3ugzcVpq;o9d(MN(S(e*db z_#;DT_XAu>m;OuEJ$@XVU1o+5A*qYA0h%qo3KFc2)JZoQWIlvKOWn;n)Nus=)5fs_vSnRe>9JeY%>w_05Q` zLh4rDY_w7e^Y1pJ73(2-K3|xrr42w3(PZ(g?~AJD1OhsD_Y<_NE`guTlp8 z3bwvXlIN?71W$Z+3qmHSQMz@Ra9J0K>LqMo>O$%6XgiEZLGyjBRS(bi_Vx*N7p)bavKxz^>eOyrOz#c6XiZ%@FirC%Ul{PX#Zz?v>VrPglfL$D0SP)ni z@f zcd{5j9tayJf{QQhrjYiVWgCE_rK*lpVAuafg9Y7d~qd0&2hzC#V_b&NP+k>lxG z+n(8ew)wAbGYxO$$%~^@{Xqufjk@rvUb>%aK5ko9pQ z>7qBY0G9Pq5Bg!UtaFhlic{ieq(*Tdx@;!-1MMQ9I<1xxz%Ym{SaN$*Uls_*kcc9C zzKySE4F@fKt~IqaBaC|Js^Ze`N~yk=27|4jpaGT3gmv~>VrlqVoSE#ak)2YqPixo? z=93=3R;Y9Y1gc}en`tu<&;2`}QqM~(bok$vaAzpA*yODV9Egl1{6Di$(xZc7447Wy zuVoztBRO#8Z<=#)2L+pYsj-@zc-a1mAkqlW)quY&Bh3G$>7+~WCjjKLE~mtc$hEw0 zJ|BP?SRGRuU7##NP$uKgFhc^V_S$|qeAr7vms|tT#6hsv*`!*c+g2^T=>DYqo{o7g zcHLJZpgQi{#dlSu`N)P@0AnfYCfsDNoMROUW<(yuNZ_%Y84J)bzNsp_pB?17&RQ;5 zW?Al!_?Jv14U7^kg=R%|Q~Ik#I7$R+mBd1UF?z)pIS@q<<=TN!4iT-HoA*2pV@^#F zYP>I6zN~CECYQbAwo>M)?E~pHM!aN0auUqhxLzfTdbPp>Lg)SR8q4Gw?<&Ri=hRqI z6=yI4I`51oh?q~M!UQ2$Sc%=?{M-_J>1@jtf6y8^3yncOXPx5!+TZCWliZ>|_5ddc zsUh>dqzn$QmFh0o7IQ5>cc&*rRpa+pUum`fQF8M0Vm)2BrN$0Gj*2%{4OmVa0zn=% zAw1*SoaOF^E@My-CVcj8JsOds0WB{T+@(=O%=@mI|93e(KE=kW>tZ!BU_CY|@5M9m za(7bvZyEj1$l_fA!IQ!wMnwWhyd2roG z6#n3I_WzKUFQ2Q0p}I7Z_T{hFd?yr|nM=jM4Rry-F;VGva<~L&WV&=3nM_~ocC2=*Skowv^#Q@sW_8VCpfY=l3`?lLO;CY!*tTlXiU})himJs$9?Nz-MVXgvu)_p*eoUV4VgU(dKI~# z1_qL$Q6rHD95+iJ%bJYG$-ovnrj0z9#}PGyO*V^|yK4ADwx*a&(%@DV8r+C`jY#!A!_%Go z!2NlN@II%1?TtGqvSA3-2N*e+Zwadn%?k#XZB}^w+V>(LyPE=4tV#e(D{18^ zc+WU%a7m43bAb&_I}&nKUr)Z=$pQH zQ)#0UR}!TQO|^E!zUxh#cd}6lX^uR&tg+(Zt@J%!G9^Kbu_s$`$d`MwG>GlJyf#}( zz~2fD&_Xe3tTxLedSjQ~x!5Yb&JI(HTKFR&@ph~e4lO1Ql7o>mUbH}Y0oBn7#r~ah z*-mx10WNd9xmCOVnPs!!4mXOjY36!yh31?S?@%B;iekapp?L)Gaa32+&XhCkvRCtHWl z?tqW~l>gNz#3l}g`}eORKjvvaO9l`2C1EeI1-~DE?DHh|F#OB7sJiFt%Yf%dD|O7P zjmzWjYcSt%A6+12*>XVw7SCh{J!Cc!7FsyW&xvTBJBmXduuxs|Iq%iv z%GCB+fZ+q?{O&uEV)d`Ki%t69uN6Po`l5|9ZeTvavv;N4Bt%HQ)VZn8G@r7`gu(>* zDSSX97D?Z=5E8fe{SnHX4NWfT*gNRIJhaS-_|bv|!kB#&QN|+5FWOElI&Q(okf*tL z#GKB%rFr0Z>})5Jn%^Im&vSiW@TcMPrvGVL#Q0x1f*9HUA9#?)j@=d;g5RDV;gcj7 zk=hs1#8rh=8lZ5!i9{%GvxkBS+3Kl8EeShwJ-_c5{YC>Nx6K;dzY}SqxUs#R?;E*^ zFc5Oiub~KnyEO6@;Ar2#-`5Fv_K7Lz?0uXHorB|3x&fvE6iTwBtoN;_=RzIW&McGU zMU<*X%~1?#`im0VN${OHTRUGljMMUbpyLc&AxiGg2O{=B$9St@Qv=mel*IIn77fBk zhQy|5bdnxxGZuM#v*hB=s>we?6@evbo&d0(%=;EQ?R$&gI<2oRs&qU1lh*WMAq&$s z-y`Q7&Mr>3s-BKZJQMW*Ipr%SaUr(btm-Cfc5U@Lv_#^k6FW~0*QPjSk9=g=hQk!E z)KjK-Nn#8{=^z%*j(;#cN|G{hQS~T>`;}}jGnTwIX2Su#!nY62O2xnQ6^e2qyHG7w*m{2IS7l4CTSPZ^JJ_wPG`LkU>(NZq)c|pGTmRU&^U_R?USp!w z1Su8wjFndIouqS~N20vEy|(NrjaJKYf~xjR^sDJ>w|BO*claihRblRN)hEQi^J3=5 zb?mI;fCfX~b?)aC)vV3*9?sTc5{FAdNJ7X~yrGE{uH%J^I6xPA90{^0`y=MJGXiJ& zW;=knX0V_EekR_0B?21B_I1b>Mi*W!P;pX5JYu@)QirvGmalEs3Q_7Fx0GO=_2YIE) zZBHR4<~q2=aF`}%JUC<_15toQs$3**d7bq$viHX%QO*Mt=i!duHU{^=fF{K9)uit^ z)72(=tmwJwn-04#`(Vg7ls#Dvs2sY#(1al-jE6#cqNerR>h0q#mf^nj zKC4_x$;~o8%_+MHdvvM;%y~&(K{QSm2o7I3MAWoTBBH@48~}RPrE0~dwsY2Vd7ji~ zp>iKi(G$%;wY+HH($TcS?*Jp=BXyHp_DuQ?2-i>_>Rej*PzAsYHZ1b_En@>$9TH)s zv9})@6TOb4KU>fF*ql*80@a~+6^znH8|{M# ziyF9eTi2QKYE&({Fv|TsN4LGOm~+-YC)nm!2y|@}-?sj=gow>6=wJ>PDSyr@ha}9O zV1B$HBTxd+gzlB$AHq}b43hiJpWtKf+3h$zX6(&0*vF=>57rVu@#EA;5PtfVVGKAc zZDLP*o?x8=PTB1CRC|~JZ3Af%Kq=?S00q8x%N~oWb4xJ_Tyjw1?o~T1VFF)O;yXX1 zfaT5s`wRs{^x5EufQCbr23i$Izu2#l~;Bt5O|M!xnnAY68vFZM!<1`-h8 zwR6=SdXAflE#G6a>;Z5Egg@`gpCUhVxI>S;w%Mjxm+HeU2ALO|D9Ykr5DVqp0X82) zG?R|@{>Q69wLNxKB^o^tk8d1xHp5VOW+Uvr0vSuYmD&Sq!2i~^1NW`^w^@ik}6ka=DQtPd;L<^fZr2Z zG7&4<{Bwm9nZV9zs2yPCJHnx24^Uw%%_)C2qIrvq+co6D3yn8(&YgUF55eI(Mc(SS za>DkdTtOsA9Y?vOdGl0zI_2Z@m@7?NL+_n=TmQ@Cm5m?9qV=uBHrnh0bk=AjX}H2z z+O6rmOaKRh2OAyt_#yu;NuSRv{mBBz=l@^37&#dK$EHKY!`_5m-q2Fn*@j+@fQf;D zUd+PL$(ewOk%95wueGy@BfXflfwPH-iIJVL3B8Pot(mhq0VC)CUV~igOjT}+A?%z{ zf56+StMU(Qiz317W{`Bni$ai9ts~qJ<>fh99!4KP6%1UYnkI&vr3#9#Jag&p&`M?| zBLuOG#8H7lXCj3l(V#=|7H<-yhi-c`oG1{}x1wb}9Fi1}|B*4L>E>D?I7~D9O27NC z7EDC!=Qiu}xe<)q>$^*o5Sb9{B(|rHi7iJ`(GiywWJOf8QlJ)T4mU6(!h#vM6{L>W zDq9XprHk(bt7!*Of}6ybm|x%y-6{f!>QR;&PzhFoHNE@iIt(f~7H0kkg=n9Ha&i7U zkV(8Rekm4w8gED@q%ENo!2l_#3qCD1fv6@t87sk9d>C$Q-*xG~P|*<^tl+%4U|<=m zMsX4^idBNvxaij-F@AIZM`=8Q@SmT<{d0vcnpc`gB3CI=9m#RbG=K?ZRm*f9Yj#2;!Qki{}V z#$uX+78wz_f(3(kOM&eO{|el9;Rzr^aS=)hSJJ|#`6fib6n`W|r*l^1fa06n^aes> zdq~13p>-ITdj%efMCOH$KzSYI2k6aVb=_KgK&kB84KSXd)uuzu+?I zN<_|q5Y2*`rQ@C~#+gu2xGw9ILfB9VEg^y8%?4y5=1H3n!V6L8fFkBWzmP_B=2KYpt0Hu)jX8d(*%_-J6Tn|WurGBV5 zfV(9{D4g*4%m&H9%3RXQg2?vlmtq6R1SEq9*n%@iq16dmPzL4L z!KFxIizb#L+Rm1Ru*RYgqc)DyCLCqLFHZEC4JJBe!6%v^ zjDTn46r}Hi!3i$@^FAo-qk#2eJe~vAA6g$U+(9hP+f=1ll21cRZnJ$TjQ78d6+UWX z4F#*PM*gvw2EY8nq!On&9#y1Fllv)@@GkgAOvs~iFan|J%)Degd;v6*&O;n}2W5s~ ze5G#Iax05ZEDsp+XnrqFv$`S88rf{`U9lX)6x@kFT%i z@Ap<&9^cpV!_!Ti-oGLG&dFR`8vm`YhwqQ681If7z6PcXsz0y4cWa* zZQlYr3x>R%yOqq}6~~^}#4Wcb=Yc%oXWX+5*^EaMp<6X}Y$MN=?yNR--Y(N`-^{fu zZLBqj8TG6*mbmI2Nz7I)RcVx-tW#2D^hR4_TY60X{zc^D6;Il0H9={{p3LVtb5o}! z2_It2pH(mT;(S2S-^mK$M7t7I4Czf^2+!hMwhg9Y51k9M7d^0QHYL_%j%c3LD{alY zD~X>=+~L?^CvD{hlmKw^VzuioOJ82Zx!RqE>ygB`Ft)fVqjW~Q87(;4llg2dEz8)j zS?8vAOXX|4?bz$QLASOeXN|o+zKrRNQPZWF;`Cbjh%%PWx@+u46ptOJXmjVdEmB^K zE>5!x;b?bMncna1`p)uYb- zr9JV)>=AE{e@=9kt zri>Ohp8ui#cx>eMeA1;M85)n{ykc(p$1vc$imevApqsQ`IGr0CRyulF8TIunmL{JY z*ha>#xORq?64`HBXC?2%-;nyRUbW-A`PrWtI`^_%Z@Yvse zHAm|Hp0D=ZF*FWkKB?v@yATM=o7;Ma-TThH!0{k!`e1#xGe-haCvhTAU?E;}_*8ex z-61R;U5KBD(z%k!PfLSvd4d0y+wJiTAG$mCUY*YM0dhyYy#D_+o{5F=zcNBGaFhKob5pW|mHtp5|N0%|S4*@xteM@x-l97vb8g=NSgV3Q=z2OWj0~)G zQGdax_0Lwg*6Q2q20d5<g=gcDGy?9Ff$5+fqj^=(=7h4PZ5+uS%?2{_Zh%_6XDk;Vz?#Z&7c-|PG zfP|%5ZZ<`b95>n&Lqi46^jjD%+C% z3_#Ll+-Y@mnuUgmXx_Cy5fIIInqr;>GB=1v05~){r=b0wY@Ftp@G$WnV8H`wc3iPmXw1E^=jC96N1B)uwsxQknCo5 ziRMT$lU@7n%?D099zxIMzMzZ3ao5gMI!AqcjAU426KK0zV8OmMv?ko{*_JcSD3*CD zpe8X|P?^x~xT6PoN*j|4r&MF&jNW))l(yJ8MU`42@?j^0@JSYd&J~p(DYXa7-8LJR zm$(?33k$8+)2Y@tyfZ z3*2{yq@k{5-=^?CVsJ4mcX2%0w!_+4WE>Fpx&>HH^m};c4Im`5&BgdB9mGJ*aLcB@ zMzS_?S3G5DoCO5dyAVa#TooYXXR@mkVKM2k^>tE{6>&|fy&~fYY3;J2DA_ZWnW2Vj zUdGtPs3|Fi)y`&gfa*KXM&sra4n8Pe@0t_D^hkkH$vEN9Zm!W#x=;R@f0t?CJwV6M zZnNQe@_?-x?OA*^Qg8*DnM%C^i_?t+tCI%zR`l>+M|_wmp=9&a#ON;F(S*BPdl9y| zkQRCAUU=TUjaFfyo_`sIhkEXPsrge4265UxWze`x8!hF|vnP4;=SYlsk;tPb?e^KE zRkaA`kH#RKLpReWX!CkH2Qg;zv1oeTgKT_Z4-H4lW5?Nj5#AKq<9jQO;RD(1;gy{3 z_$EVK^*|Zl$?L*~2-@)<>ykfm8|)pN&0L&|`cf|`sM+j4G|GgO3b2#ShJSUu4r~;4 zWD~K9!L<_4{0242GeNhU@71xExMXf$^e3AdqeZhBsa*v0)MREGVo5vXt;>)?^;1U` z(}(@8iPYL3>dOzy4rB)dUpW-NxXd)IKTKZE(?LwSFOr!c$DtlKHFr zFC-=iRS134r+0N_cJng7`f5!DZF%UmwodpA3u!_O>9Sx}JN`&Qym|&rySGUU*%%1A zuq&Fg758Jy?wo%g{GD!R#X(W9#>Rg0eMq<#{tSXee$X%Kw$%;fJRKY}H)e7GLFrXan{;zP`fp{tS`Z0$Xj-54Khyo%eHZ$`&Zy5 zuI(OX$Un5rMuGO%UX!`E%E6;`;zESfazcp@tU0(zrOr0}2D!@x87|Ej^Pj$C&UL?} z6ZOm^;e=t9YPGJ-JW5s=z+(v6Wm&~uSgU5zP&}9q0Qh=94zt&rc2aa*=Yi3B?K?~q zLa%UO_G@>zGl&1v-_yM#v_Na8a@OBP+4AM#|1kEB&7lBlvTkhKwr$&3v2EM7ZQHhO z+gY)#73XB`rxa^aaaD(JJRKa|{CU~o(E+(S>y@p86BifUMDNL? ze?x@|nabob5@C)7Pr=_@;T~&_7<+6(V^Gc}x~9%$EF8JIGQB-KJYAlv{>)6c;^9Iv ze(6zeL4O>dzil;5gls_cf%j0cKP!PHyo6b%ewJstgju@QF9!mb2>$q#z#?7aOR@L_ zZn{gI%B$miFWtWYTMDlU)`n^NK`O|9PTTVX+0}g;ls5G$7+eY=j(o#my!4wNpS|DT z=WRs%=m9xXWIMO_#L<(-*4S|O5|_?`XhT4=!-GX?t#Ub>sg-QA!H z3cY4iLkT&17$~~+<_(m@Q%4;F1HfI&oG<)kFb>OZJalq1N|1mKh6zMM9l0-Kdc9sBbyI%b9yz*S zPcIkOb7|~#^uFFr_`Wz*1|qV&R|;CZ{jc2AbV^#|0=c>wM#*N52}poQ8L6+emHN`0 z(sWq`UG4RC3l(S^L?fIOhPvx1hpN}>voJKHjw0b(-&N@}0m1gjnK!MvDYBk&g~Jp> zpCUwgN$oLIArQo_gS|Rx_)OEAzf|`TkV%kMr_1zu97zsF=KUTn??d=oxFPkOjC+-} z+R7acZ*P-Yw__VrEg0tL^dtESxjunsr%ZX1p3M6x7)dbS2vWnqo?uZwjYOV?8wQHU zgkqd%OrK)Ru11fp2MdJnA9e=R7b+}Qkv}3n+Zht0poZbJN^}yAYQDOQG!?N4`NR)j z&yD%{e=V!KUW{Py2ggAeS2pw~NzaT~zn08QE-v&>8vtDQJ~Oh~uR{@^_B|SFZ!T97 zg9=|dZ)Q-(CM>VsgF0!Ex&Y~t?(4H;`s&^R*$nY&s$@ItMhAEn|4b2jW>d}r&{+Ti z2SU*ZwHq6V5Y~RKVSAJ*L&GBFMtd1KGNgT7f7e>3p^$6xa)dYPQ~}C=*T5B9zpU&f zB+lf8wQ3(>NQ6q-nlc-q@xqLLn;6}mLEkdjo7qara88DB|1ox4 zQ*mpv0tgthv=N%dliJzMg!pKdNr|(bB1N3=*?IP3Bji*@dszm_P?jz8J_j6eO*8~V z& z+({4V&uB_>$iyjE8~_5IDZm=0Lw=xMH?{@LHVBSNYXD}T616LJoiFD?=89K&;Q4`S zy_?6?CAkUrK=G^3E2qw#L9Irh0P9_V18#BpN#i+2(M>9>eDi}wIy+qJRG7Iw@3uxdO%_=tSHHaB`rT$nB!vW` z)MG9Z3|IjFsEPoCWrSmKQVB_{V(Y~&zgck+n`3VS=9Sw;*A-B!Cn^YVddlbPGAKAZ z8x_^I3tbi*^bW>Z(IJqEEH&2LFuxejaO&u7p?pr4)Krbgaackfg%34Zff-RSH>^v3 z^1xr>NMr;V2_8nEzP|h2inaRPvy6&de&wD=B`nhiVfRRUa)=;Xu4kR-RiZ!{{Y2I8?2PD+bbx~=~lTAXSeaJUZ418FHHymOr ze>u$wtaQxRzzbiN7(TD|O05(Sjs`hkx0}juRc3UTg-RaG7vx&@%7Q`FnWJrl9^nvBybFG$DUOQci8EJbQR1q+D2|W1858EBJC#L;? zs&GipbP>9vT0e6URqPk&0xoTrT{?PYXcK$uBybjB zcjgiSKhSW4&ubHzb*%j3iTC`bYFnb9$|Ec= zQ2e$;n46eqH1Ng+ezglep z9-1}oq;AicB!!2ZAr{C&l3e}_@wFoFx8hQrGk**08kSV+DIPYQIF~d|6*3o-gX6r5W_k_>qZKiV;XU|+s=hZhC(=F;JCavNAbn3``IJE2LHt(2M0NNMJpb0{O zrWQ7oFWaXY%>h1-$ocSWX&DMQK>$A6YrT-pXZkA0whb}@KDXl~6Cok_1NK|0*uj-r zq|FV3PlTM9>zVI_lceuSyT&swfg>i$#zH8w_OK9;_1#>4kb)DlQFWG_I~mBPuQ>IQ zf?ps+!Gx_ob*04K4CGhzoPyJW6=<(EjKWWdzFC}Qew}S=fjFHP#f0b}n&5^-eIM## zm?y19TGF9uJlrf$%0A=4xm`5Nirr+MH6maEeeg{P?^G8N2m`cip!_XqV~4+@t?424 zI1*w@I#DQVqEyz@oH4tG(WUp<;b?K1gk+W~bLpyh@4O6azh*F#n3qh71A3o(DkBhn z(?-*?F^z#4<>PNNl`nZ)7|Gl@+54^n*{6HZZ@!6c@m5MDAQ~*K9t70$#`IkjhXrF* zyV?3Ce~Bnnh7-mVc)iRT;s3egUgt+L`%kwNrvL8O&&>9JKtVI=Hu8sJ2){#{K}m`| zN%wv42t7F=B3!LSfTI)#E?2x|BI)mdrG14%@I2|^U5Bi z5Qq~N7~}2f&WGhnD^>CPY-M$K^Q{0Ax4IZDiOlUbv8M*DxT8GkG$M=Px#9GN6`@KL4k$b~f$?)L+x({%ski6q z6FQyI>_8!sv`r-8qN((ReP2{75ih`SX`bpr@=0e6IOl#7`sMvDJZyZ}FdlTJqdfyS z{pLl6teD}xkyeSuPmvllJ^ZlfMo8q- zuoib)&cWL>uxcD*YMRt{#P*AeZcUjsW?k9@E*&AxR;AACeB8*K2!hz29>+w_9Xz$T z&T{T#ms7(KuYoHV`$v61ySBtkh5UzohJ=D23^(V{b8>|?sR>>p_aKB&PZFQkN9Ngm zL~K53KEVG*eyw1YWrjF(Zf}6%&x&2k#`jc1vrIMZ@azKS8@sJQTlum>dh?^tOfc!@ z+)8G$pNO23glA6EFDwthv|LjmYt)>VQqr`(uuB#(eKcNWsDn)9AKA|jt0tmUcFP>5 zqP#T9meb~JxFNU{XLiCFD!ZCK4?8SCb0K@t8DB0h>C|~Gwcw?yT!+%MFP6)8$1_u+b{k>TmY_b7m(oj#E_U8bVoiAAf8iMp-$imk$KBYbQie9*o>1s=0&;!TkAk=g_vfF6=aU=*&-Pm*3cpMxX`-mgde%6 zEuk02w?g-esdGLL%S9G1imP1Q43%!eg zzm~#Pi+^*K7%IDy6Ts>kNk7&tuh^ohen+#EKg1+X|a!FTG2_>oYXB`JnmauHpCho zjk6;=Bpf2T1a`MFf__7Kcsr+ax>wJ-wJep_#JOJ3aI8iyavQ)BL^JrXfsV;UQXR*l zt+4gk_g|@zm7}%@$Io1piwjY-hbgA2`oFpMKd!EaGZYHfC04|T|K>eJv9F4|;$L|YS4r6N<$ zSUH{bLoQbEw6;4U27QHQB9t^Cu0YGf6|@HE|Xuudw=hu|hH= z+)$MUX^&B(e;2QdkHgavi+X%fg2i4%b?*gy;xwgz!|3wU{lvM?lL><8hUc!O0UINK z26effw}Dx2s4Q>K?);O(B{vr_OdsVSo?{6+ z3^G$<{2?wxaQ%$t&;Vjhhx&TP39|-3__s(WJ03wQt!)+{QHDk_R(+sLsBmDPfxxMoSfLX(J~c(5z#N* zo}8P3KRJ5vK>3nx_gzUB`q;EJ9EyW2n|jdXyZ2CyVvMj555fS6zr=*)WD*gahyZeL zh^cbzifMqZ43wL#Cc$xmI*$zFEH}39ERH&)gYWyuWbAQhkwCGZt1r8I0R%VQO&Jpq z$#F)JjQQoJfEdDj>UR6?RBKE-g0%pvWHLX?7wFp_Qr$~b}tn{fmggi}@qm3#MG zdN->(9%9=HB4I~&cSS;{8h=Gb`@Ek|`|n!~tM(W$h$%8M{+4&lPxH06xcVfBHpUR^ zX`a8})7}b*i=b0|0Xc*W!+Y!bD}O8bYWrHl0R=*w1=09~R1t{C#)lZ;90q_*hhL-G z(@!TyoJSTfSL)q~LSk7aToY0EnKOjKhD zl0&)|u57E)*)|*S2+3g$k{VY%i4bj~j+-=HJ0c(BBoWtI==ot(C=}M&aw%x96cXg_ z)^R8MnF;qpg~k0uE^Rg^_=>0)%VF}}*Gib%!l&RBjw#%pv+VmqZghONR?&)pLM|i? zDg;7tqyi>ymGdJ@$etla!levZYBbsgEmf`#fMFC(sr|o$4!S6?BZWMa{9l|mgpYK2 zkqNsJbLT4nLIb@%5A`dv?~R$9==0?Da{2vOD@kDWbY)6c`c4n^E}GDbF7MCHZ=Jna zxpH*1d(QnF=4xDn*laj_oHq6gma%1X;OA+E0GKX`MLhh0#0a~E%wzdnR&$B~?gCxo zxsXp?SZ%O=p;Kr8l`!+L4klZ7p3bb8df94=g2pis;DQt0FRViaO1XI9p+f`lrc=gv zCA#z!WOigj6YgA|uC5LNdqd7o7g3`UB@0Q?Rry?P#kr*4m^5BNz(IcmixqRGNA~U) zm-Dh?->YVwAZ4-cOC z<$7{fly<*V<1k$9Rv2J(c~#r3q&evJ%NShx(&UE+58ts&FD?4n=e}TEStU<-vOUV; zrtGk3DAa1|o%Q}GD1|{rvI9@M^;Pwd^)}5S1Huf$u63MfuCL)x_|BhhUVNW5>n6BF zpR1H1fN>acTyt)W;(-Y-WImfPLhwNciL$-MuI{)zcqsl`Iu{sN#mpG z{PZCp?+gG~SI*A^-}l(?s{3=BF5(g4V*jLYK4@Uuhz|^LE=EDCH2kmwJiVkBL62PT z55ibMraUnq6oQK&faT?^mA>xw6BHD@i6wm?vBQ3Hj18XLE*-kM1f}UNqB|teup^R` zKI0Lb0a*396Zn@w#I#?7#&qBq4yz-F<~7Q0Z~4tA0>9|3R!`_dFd3Rw{IwYI5-sOxf#W5v;x*wxUF7DSk7knbX{Wh*cTT#*c5Xn2p@qG<^# z6Od1IcG2f~@;t>O!%|5+7SO&ym;%_o{1|{Oj^zU|ntS1+&}yTI<;7Ddct(16@H=5B z2(s{CdH_>CfM-^HDtR{eWBt!~guzWe@cBOz0_(vr+wVZOVT4%jxP`YKD&+A}yh!`b z7~SA&b7uq??E|xD)-;vCq0CvYcR1)wX@n;f>v`_DYLXlN>*vk#3~2xMGAD1}BGE>m` ziz6Cj4g6#TyVQ29r*o5S^3u%4uc6U=yCzAhFklQSrpd(%nMrZGx=2}iew2eqclkJF z*W3tfnD8>SXK448NQ9Y6OIi7!npkMP_!geYaP68&2AMaZ&OkHu*@=VFeYv8uQhXI3 zI#Wwc8Q69uJ3+oUroyH7K*$%T#C5_b4?{nM^n36d#V@AP5p5zE zj5tx-fCrh*x0?ITxK;8n0tyM-2$!I8B3-|GS202HHz6KAGc4h-;b&&HwLTz`!VrA5 zlB5!=?T2=9GI=e_Q=%=hL;6cjvAfY~cRPlh&ZPCz-hevldq2rhxM)4QHnLN3YT>r) zQSS$<;?5=bUk_V>5(Z>D7HIME!qwVN)8P)X3!qz~lO;-jL($S)n7xEW5Lp>&oN3uu zQPurQdz@JOF)>njrlg_-kI7>DoU7D;DL`a-k^Q%KDNKeOJ?o$qBp_r6m2x;@FXPQ5 zTeA!dVZRnXhoTPL`y$Dn}! z{@eod{aBpTC0<;SOU9jqRM-OITg1hrF4V30JCOU44+0_WL<|Q*;`VO zM)DCs3wb0gTy2t_blnxHZyw+mWwsnfA4mrC8Iv$ohL}z#73LfABUbFbI;0J)WU-FK zWb%_PP&SW9AXP2-;TQpbJn7aZt`*Zr9SelGHR#f2%JGSo@jNh@g)U#bU;uT~D z16dT3msN~^{+bbB8rn}GM+x=nw+S0VDwS&AQRwml8~&zncezX)8bi{La?$Mxu5y|2 z5i06Ux-zdq5PUdY&LYt>4L9^^PJ=68=#pZ{R1!MxSGOFyL+ExXU2eY@`Zk^^Q>0ab zO=@GT?P;&gDK4Ed8@I=&M7iF4dU$`c*lVV^RHa0ctJGBba<_@6ftQt?p*OdEj6Lt( z{5?DSv~D*UbiV1dvq)Eaadx}?d^$7ity>9H-KiJP_bfhk-Xil*%X)H05GUg=ZTLi$ zsM>XP_6G{n6oQB1QRCXQMr>JmaCQ@TM0^?H9232Je;4++u&_Y)c&H%{3$?(ZjRGnu z3i!VCsJrR2k(PstV_78dzrltPt$3x3>H`CZ9yquSW$fYLZ^XqUdN?Kj1E|C~DEgoJ74v_Eux4ao`ajWiGruaIL$?1> z`9Sz428Hjd6m|;$kXza59JRJKi8f3G8B)hWX*_5;ZqdBo<3=VDmp##@*(PA5QaU=H zOiyF}S!It>$M_CER(u^>HHYfs8!$7>fvG8?Yk&~rdx>D}ZVPXQ5avr;wf|h<^MNq+ z;IQM0X3To6DIMZ$>r%ua8(^8vY#Y*}kppqe__ZfOMTjzbE|<78!6ktp8gg!nC*B!e z#PC8tfSZg@;F}pNAtrCde6WZ*2!A2CTA>&lcwm+l5%gN5j*9MZkfH$E{?7lQS!58& zKr(BNsY_UQ7_4&z(ZCe#pt;ERK-NXhT(U_ndpzwgFXC>h1&0`rvr^8+%-x}wAO&=V zcpH$xYQPJfy%^dqa$Y;T6=1^c!5fa^3|>qjI>Vqoyb@AA!6kiKJZp@j5Dz|nKlLe! z#DPP&4cLn2x7nT=gV>K>dh4SLJUGYapNhcBZYLUND5!aJMaG4QY_R}u3pxy8b8aZ& z8#0O=4Yu6EzqiH&ddQ~l=Jrd%lM3xXBtpKn(iXz%FheVSpH-%oL4bb6j0vcyFcC*Z?jv%dgx2&Yc8u|1bZ#v{d&#w+_K|(d{3R- zH-2gc{Z?+^xneunFI8bVc#e>1w(9Ng}TL2r}Jt(c3St!}RlYnlF` z&0eRWrj#nev%of2k~uA-LKt=OQj;K@KCY!KE2%C+GE?GRRbb@*G3E1~e}cg)bF;vS zVd}ZM>gJ|c-BY_bWUTk{wzr3Q!t1M3u$99vb6dE6@=E&}=z5mEzJUMdoaJYCxjO}t zEE!Glasf2S!`ob=oF10|E%YG<)LEmvS}gJ^&I08|Xl+HtFs(05t?T2;abf84JyI`# zucf1YRWUn^;N;TKX2)QFaAgm3Y8bag9#^B<;eJdJ1O2n}$08KofHQ($c$ktNer~}T zEo_NlB8W!{IZ0Mt=u@4OS7P+tI5+6};DB((aY;!VY@s&x3?OgJGT`p&ig9YF;#|^R z!7Z&nJ^@Dx<=inOdseT=zH}bE!PE@lIBGD*8a)*Z{+x)eXR1%_flw@#o!*k7cXWcX6EtcO-x=@8FY3Ms?q`CH&=uCL?s{1uCcS zMcgWA<|XhqxZ8G0!gxW1L`_zi;JlMRaDiHd#DvSZQ#G(rHMI_lwa%NjuJ9Y};S0AM zo13MoDA;qT>O#VMH~~CorbGc^VBJF(R*nxok!CfpLP}X+kktpwU)=I)b$LaV)ET^s zY~$V}pz-LoA}-u4)515c!xEZ}xVzWo)hFQ?pklt!p}cq0bW-3$8NE(grE6JH>`KT? zu-W-9uw^fWX`nkI-!ocoZhEGY@pDg+FMFl3+RVpR`4mbtZCNrmN)ltsVS)T;`~=#S zwLs!mN~YG_f+aXnyt2x1wP>ZC{2)m-I@sZvmqp{*yPIsl^?{;=b~O0tOz0CLvT;dA zzueQ~uTG>Z5c1D|EbRXkzm}1co$Y@wA~ot-PFwB&lQ1#g4qsv_MB_jV;8luiQ)s>Y zOxBg^%ALaj9}Ti$O}Ri?;ljIv|JMm19u0F+bu))U7y)SR>j78ho3$Vb;=0WvT-VaoiT2k zwxL0I>EOMm(WOetUv`fUZhm;ZXAn6uMir9dZCt(eYE8m0ZY^Nx6p^gPLD0uWCefn8 z>D89MRyWmuwYIW?BXwfEKjn`{e-c4U3(ZJ}Af;XE#TDg9V{9K$`5J+gQ-Rv{`HyrdtHI~+|eUL>czLs!xK7cVw+QSAg`OXz#5+eAW zqj_gy(ZOEBO&uyD6gy9sWmT75m4}iUGVv_SO_Vk48=(_9WYgP<`79-eB&ZhCXepok zW1tmDK8+Q5>&qDzPJO&4{aEYaKljc{6npe)taa>OL=nwxCVlD^WkAWb>-AB|#nqFLrQp~VAe>IyJ*XHwJfcjW~K0V*4RQ1GE?)2aHV@+<4Ra1F>96#;u z>|MEiguBarS#znkCu@1VIXZr?2EEyONmV0p=o1>_r;K0UZT9YR$R3%@N9Zc8dCiGP zDQALMeeIL++V<0XD@lLvyF4x)D|QGdZy#P!kfZ5DB$TCJh~ z9`dpssj~A?_yW~u@t>W?rbxiv7zQD|c^4STB#Qi_-Wk-itJY9V%gK0kVD>>gCC*O7 zi~48cq#!xsu&8F9NFPr?KxS6O*OyDn;*Ywzc`$Eho*FC$@1gj*Viwo`IR%wT!s6!* zc?akA(@>Z7!XRBVrf7B%tUwnUUR8a;cn`og-^_c}WfwTPVlpNk^9WdO<@|B%^K6XY zHr?s~kb_mPMg&Lwwi-J%=nnp5SmDefj68s>*)x=ZvAW4|7q#W_imB|JN?k<;{Rn;_T^%MIV|7EZx>aF{w*Uxw+2w!$`xCvJpqQ?8(v@1{m9H$y0ji-HyaCax!oX7D>(Yk_%UQm1klav_Q!{SB&HdV6ClqBLO3D+f&$1{ph#s5g#P|@MK1M~J2z%fG7!wv?2l>=(O z4t$oElqx^Q-nP>!7IBeMa*3^=M_#wIk|jY0_0?vXhsHuS3BQ5_sMLg4q4U-YYDSi{ zG3}B3uZ0J;PS-@k4J*|l&tuv9I6&>6_r$Z%J36!N8CWF#a1(2jOtHtS3hWm+cS`Rt z-c5D@L^t03Dw2Dj4Uv$Ui+XE?*f7dg2fxuywDWge-b`{vaB#(1xP+0>p?DjZa?5Ms z9xl%gka=;J0GA_A&_x+Hb~0HHB%R%%bN3#W{G_7D!ydS5j=PFq9c7Qj>JR&rZXp0=y}%% zn$6HF2HHCC@xu87;gZLoMfDiT2(%L`TjMx&g{ss^BwBaFVGR2!jtwE&6JLV|1b{S< z%fC5}83+~1by9xat$imifQNIc-*o6>MD(KR%-c7pAhxbqIUn4$Ya6vah_<4>K=X3n z_B&`d{&(hEtv?5Vv)-I<=kPzE7&TfH|FQr7cl1XV=KphuT=|t8Y)c@0`}PeUs74Ap z9QwAvB9Xf?SC8K(f;MKUjDs^T4ZX4$VQ(Sp`+ceOtsBAf!X(@{b0wH>x^{I|T~wS_ zwEo*OpbzH15(W7V*>wk0>l^&>x;@3V`vLLd5RpvRzcszsUmrptrFpR>)BDmhwb&T9 zWY152=ipq2#W4DoWJ~ktjDNmq%ZkGr!hysJ;C&Xu5qrP+hCI)LRmUJoP{1Ie7?qjp zdA8b+aRZjah&~!sTSE{h{9KkZ`#Mi1l9HIa=w3fw z4_hzKbB3!Ei_p7ym=6;G-4qcZ4jl~l0z86q`pSeVu;OMBVIgGGqB6X-JY{1j^ao|O z$#n_9?Mx-Wf#j}8@4V6vB-*B1Q{D`FE{C&rjHQshf|dvfdM~qGf|N4fejGN5We7&L zB{xBEpG0=sg9J!!Wxgz(eDE^+gb=}MgPU0#P0ucwY=!vhHlN+r z1h`j{h^EOf_L$>gq}Jmqyg-n0ofnKp@g(7l`MNOhpbK%|=@#0HA`6Px>j-x=GdnF1 zgTy0%Sd8mw=kDnFyiVw(g2mLY6?CtLh&-l`5fMeb%nsK&B;oUHuZPPw@+pc}TQ;21 z!GaM%Uf7IMe}fel$*vI_O-%#L6=@-TtTVEis8E7+hA9;SH`soI*j;MTQW{Q8Nka?m zi=3j9u4fsOo#W>@Shh>oKmb;mda|UQJjx#4uaLN_MUq>n{H%0gJWsR(q4uGZ(xRcl zqn)Sbld5PpaeImC`{Rmt(uF8u2*Vl^XRn6yYqt`Czu@guU|$OpSy7-tN*7RRHmM@M znrW&Es~ejWY`GNQ*AFV&Khl&vu({Dedt$gw79s_TP&qS?!8S1CgAu~RU8k`BG{w4O zJu9aIw#4XCTJ7{PuJk=yw7M(l0F#g8$Yph+6{@XOA}`+i*qVk$fPg!)%vCv*E>xJZ zhP=mYhXi^+Z10Q++*&v(_8TvrZ&H_^h8t}IfAt>#T=58zTwvj1XEbMWaErg23RJ;` z+g$kPn-GdruQpeQ7@?30i+W4v`ipbgE>s@kSG-d182a;}`aEAo_x`?@?oBf{X9pAm z&AX|Lz{iaUl2phoe)C5z$H2_;Dl4h2A0ZkPyb7hJVMj|vTNq{qJF>j=Jq;%!0gA$! zV>Ie=NE!c`lxC7KuWlEE ziIqvvIOi4QP&rN+T|`!d>db8`$Ypi$eS(RG_>W1-@3GN|>@A~;ZEe{`t4gftw7D|1 z5Y}543f0l64O{$y2+O4~4T_Z5a-Hs=3{;=~k@m^Q>=8Oa%(mj%P$oAAi zs>SWWFvvmPl3yFjG^iKiu_pZ|FZAp}pd48(62MfD1;kNIAO`CwE`MH_J@vlVZ^9ak zLvhWH574VSkO47^n`ur!<8Yvd62n3a5r4O0KpFeh_y97)ijQ6qDWXPF!bgL|b zywj|@!(CI}|J8Z+huNAE1cy-+JDs=r)R|wX{qbAJX4=f7tq}7pr~$9Sa4{}4hPfN$ z=-`t`2!JRX7Tz_lmd?+`RI6WkcOu2q)SndO>>mHG_9~!I{fF2vc7AJ&V;pZGK>A`swz?nmKiBKRf&^pJ>}|aQIiY z(PghEjAg7C0V+ulTn~wE(Oa~B62SXBueDvf6X^|tVVp&Aloz9tHOWggt~_iv80m_V zrpN2 zff}2IMYCj%7}hbbAt2aLI0GW7OnLpJj-s>y-&CPcCHeEw%&09ls^t>FwlP>CMR>9I z@P4<;SvwhMBeBZGZJPR8_(Z!XVV3vbhi7at^JnukV6>iJ ziYp1O{L>SP0rvZ8CfuuM`~0~qZ)=V5E*>xdid%E{RBR3|=W6fp#zJ`hXuaq&ORDAQ z6jD$z6-=g!yty~JFN81w^;GDJnqNf>(qOOz(?s6x^Pt{nVqs<#_Y&OVh zbzOM7Ki^Q`oqwCt`^Ili4v4mA-1~z@4sm2oo%X;WsA}$)Ej3ly?&e5&lW@LrX6@|F z`+mn&;@ivdPAG5DROjZ8`uJBwWk{iN#TNdRPmV^ID!=ykg9f~v96i0Z+>@Sa)wl2G z@!tE~WgcI)?$6`i<=7M=5b|H&@q}4a9Va_`6V!6p8a(iI$m}OAUc4-=EC7i3k_&%2 zA($ZBvPuZ}mhZ}iQtw`vz|0ussyKxA)-tFz`mswFVgwwMl}!-A1{zg2cOgZR#2OP~ zi0tE`2VIjxlRRE zGS}?*WclV2R4>p@XdOjb>Kthpk;yHx0@|PN>~%0C^E%$0-Ce4hbc~M-GoHC<*jF$F zhSwkg>_>j!Y2k0znV+;hZy-%I2m;{F(5QZ6zV&IH3;8>mptEO(M~{qq4Z%o8GvMVH3`M{4>ZNT^Al&pm#=t5 zm^8Zu8|kbib6Oe+|krsWsY+(Q1Pj8;Az4^bd8~MKv zucpEj;o&;Ju-!i_oMFdy=6dSBrgYt4z)zLr3Wiq{v5CL|aku7K>?2mrojvDRWPmWk zp_b!{sxcaxMYExTBIAe_lS2mI|bFDDpaZW@m;onOU!p3$o%?gCe}i%#0L$|d%j z<=Vg2R|IE{M14k-BI(JgbP@V6GXys#i;M_ zH9-}kh*9HE5~cOAwVw6Iyo5BXnunu0l}S7($uS3Xg+|aRr`9Y;uEepb^(6B1ApLyz zJ*yCRj3A?UzMgYi>JgKX=*D@vAA-&*JKRP-)u%E$_?@0QwpirSgR@z|v2ptd(F9}qh^C@#WxN~K@ zRp9&pr2H@^6y=E=^9$|VCb5+fFpIX2pEhvCy|B>Eg{owq&{Pi19y07_cXRbD=F}Tb zT)(Gc$Dg)#!00tSFbvIvBrtBD%v~(aM30 z)Z`i2>Jmu5ILzu1YFQwRWyO^A%;&iAmgTnimHhn_DZBWo*^gg~Q^Dx=#NTDZ^?>e{ zI4|Axvex*!@=bhWTR2p%iZ}uE?=yMkk>k0|r@|a)Qq}EBJk?Z`GwSPFwx3-f|B?Wi z2k-z3ftyEY>Lev*lVBUWktVzW7Ki~1e}ukr@l8j`LD0SuccLSVqK^L5Aaj=yl@$vH{ zD}&Wj043y3SaEufUE~e!hHv06SdU)elvSj;#3Dn9d50K_U~-Z&iMhu1KKxeoxe7Nt z$7ygn}dyUJ!3hLU4tLr^k%kOdz17`lKSkpF{-%V>J#d ztQPucpb`;@2%tN;5)U62R(KL*_YKpJ+R69EUAOm$;mghzz0UXflS$s-a%+)-CZU`( zoz)`^tC${-u0fU7kE-$NRVe=26ESKjiRnVK%9IOm&h`rSp_xu=?tfrUIiPe9al;l+ z)Z5m1)rY7z%DTdh;-qD045bd9HyzDz!IFD+s4NM^$KoaC+cvbr)@d6DNEN1qUb#AZ<Wl`}M-7Na=XF&;{Gp@47h8)gxwVpP0Uu>7+fyo}K z9T3_`#&BXL;b~fBYn9*godb`wRdAESz;_y4P|2Ima@SrXUmL)T>LgL~&ES-6*3Tjv#jh50X4+TV4M`&A`_eyvqjiMPL9+V|zBleY#Z#=|w}xSyknlCVJYkS1>+udkX(A&{jv zIs2ojhbUjE>^D*N8;gL8c#j$;4g-__+TUjBAc66RGJ+gtH($n{Jfeo%NRPL;HLL;5AGzBz^uNULVGg^n5mkX&}^8JomQJ9p3L-SsQ-;72j z#^i^EUGufq8536!xg;V2?0In3&u6N^WU_i)c+P^S$D6S6$muXy?}ro9P|aadoEIAj zKoOY{>mJyg*~;i#5VN2R=fp3KoCPhUy8A&4%W4TZhmMUqwlzS}YME6$P}rPWh*JgXM*;KKzlu$~;aph9!l?74~WD zwufXSfh@Zr=lX^yR#Xw`_FqSs^PQGJ5XSccfzcf@_%YUvum4Zmz+bu`JKZJ!QIa?( zEbUzoWiS>(&a{E!2O|oL?pNnGqkbf@Mw$RS`j z*jSI()(dvimuejmnb2d`noQ8CLBYEBnM;h25dv&c@uKALQ;|Qm#x8B|MZuxM@KGk) zP%|R0bE0rm%UUaa-WKRbN?Hd5g_x2_B6ZCg5LjqKm21EueNrDQ)4-B)iOQNvKNQ~3 zP3wHMTG}VARL`5N<)lm~C`I|D>ePAuGKnM;*HHA;#6E`Q1R3MGG*kx;Xb0u^os}KW z5v36Xl*mpSHf|!|smPP*UjS&Xz0|9^r;13@wtD2fpp48CL=?kf{jC2m(PJ98&V=Tr zj((~z5batQvk_-8i)n$mpQ6kv>ANhMm2D20nC?wT+A;%F&94zfNysU2o${?+p0{c9 zQe)6gPfMu4B(}P{^J%kD=kYl_KvP&>!=YV z)vM<~oPe_>LOcx%OhI1j%f+bHdTiYC&gaDJz z+Q5!kV`$eC3q>bi&5Ml1(RMd;et8TgXYz`KlIuK|rie1Yo9 zf9#Sqip0S>d!dOF6o7gSmfAxN%2>p}@(6QSjO(tT1MI}v@NldwLs)fAywEIWC)}6K z;NvAOV8T&RNA(g*$)N&srqy(X&p4myz@TxQtclWFNTI@tU)?^eV_QrEI>jfNmwa<6 za1b(XEn39WnC~NX%#tK_1X79kqk4@9iIkmGG6q5*>9&5G+IzEUsDbunFXJTznR2x- zlJqrFz@N5v494qY?URc5{}{W+=1RjQT)?rjV%xUuWMWTj+qUgYY}>YNb7I?0&YV+q zKJ2RfVgH3y^;UO3tNXeW`29Qv32|Kvxf4pnbl5VlmJuRWb^#f&<`>#MrE1v(~Oi&h~r`#av+Zo(~|_v~7?` zG@Jes&rn@bOQhl9TR**PCn8>B59QGS^^2WUqVHSn3GQSQRDgcnza3Jku%qxm!$J)xd4&vb9WPeK7x7_Ac&VI_hN*&2|| zrn7Sy_{v@#X{yr~(lAsfeMh~u=zZ=GItnxPrw3XGGD(p)E+Xu@SIt@|u4~mmc!8xq z6s?|dD5QTCl*zXgAl90Iw4x34k{WI=iaV%Uo_3We8c@Dgk2x<3xezWY_B(#(HX)V~ z?`Bf5s2T6EmWY;+DzQdI$4#ac%ej4$faua?TjZ_ ziaM=DO>@H}|>0_vAig?ogN-{))~6#_%F zM2E*a~{3~lF-&gGooE|<0Oxm`oxYcNf=tTT~gc;-lyF)qc+O$6w9P_7ez z(+L_6BiLc}C2cn?W2f4hAVIX9>_nDHSyD6O(as;wW!yEYf?#OT@T%)vcO0U1F& zOds6S#?|P6ql)j4X^@ZOG-7Th0eMhfua!m}FEzU51oshlai|y}s5Q}I^E=x}mTn8L zCBv=K!||zoEx~ZW*}tXg=_ObU{IQAVN!H9=o*-bZxhI) zbn-fAr`oThuknwl)Sd2cd*A1;2r*wuzm$24H@y(6;^|P>~%8*5~5?3%v+S|0)v&K9Im92<+2;(}u5*9n%kY;T0;@Vhc!lh5k+8Vi@ zkF&?Y-kw!gb#Q~lX>h+K>HTzF?p+Ff45$XZW6HwMEolV^0lz0ZmQlC=>b|i3Pwop7 z$A2zrE~{((1T`n%WLI3+Fk6I|_ucE%Ssh-ZU zrUJmRd2On8LOlXzYHEXHm8-;(zYH9gP~+Xz&tZ=plKV(9l89B~NB zNpmUlO4CM#MMY$rohdz$cn`g>Y@k?>Yi#mgU`;E<0WuTVvx#>65~u#@`SEk{N=~Uh zoL1%K{Aa;+-$=_QWbI>uKE_`7(bg}$<}drM%;E|Qx7NyW?rj5pt_+T-h zFkX9?2^wTh6Vp!plAC@=W^+~5Il~-0i1+Ri?wy++CtWLPYBfg>9i!_WUmF!BEnD&5 z%LE)r$#^CS_LBvKtx1qcG~DeQzugzNuYs7%P)qY7`*SKZ)S*6XelIj>-lzzGutov1 z^32L2f(d2a`TbU8oHe4KrA*ze?&-0iE=y0lY!DPpB+)lBU=~bs$NFu686Zgf2WoL& zZxP)QO%nvLw1_wBtY2E{Q|9&I7ydF>APD}D?o}IvvFMNb%TvW7)fODy(P~4j*Ad%T z%gp3h=S5Y9y9D=KE(;D4sZKoj&ONy&K!ws&N9Lje>&t?X+FKwrkeLcG|G=l63ki{bic)p*-=VW65G-{`FC z_OM+-P+?l5{dl5!0M_%en z67W3GpPR6ls@ie;vNz5{e_GgJOIzC7sPH`-yhwzKlooV&dQSmG0gJRPOhvcYY(u@d zifZ!;r$ijx&vilw=^>%wPdyC9N@O&}pU zlq_ya7TMY_?t}W> zRuq)(3;9NK+&qcVn(s1+VcVg5t>ZQ+tq=6X?4{w7WFfNs{sdzv|*vIZPcTS+FV8p|T z1y3Y1Z&Gq#UEXD>)9fkrrXj|>%d#Cm|)SQoKQO#5K zwJBiuy<-z1M8K8SBK6Q1Dq*=}awBIve5G7_KD-fzSS?jMXBl<~AV5)Q3`yQes=w?C zsDBQH6z?1Xvh~T$PbH%V@A^QfTPc(?0a&(IZg9Z(EJ}+F?gK;KAJo~iMiL-IHW#$J z2+H+-Nqzdb7=&`+8N#YpT@{v%-;I4;1>uIz#lCz3nzJ?zyQ%ziJ8b5DKx+64Fe0+l z!D$cD2sRkWSh0Gx*W-HPkfEUh@iyK_2N#RViXO2?vq6~dhV2`>46m3pE@+eSEuTJ zu$;exKRg#YI~#lh=&p)~;%nz|w78mS1>qsT{oGB$(wuGI3Fw5OVL)K4hA#g~-n1Pk zNL_K_O!R*w!E&w5QY7)B7@7LXO_XQxjqw1WullVA8UfIk6)PQHqUf?bJyC(-nt&*U za1EP^%wd$j4!i@G)jYbY57ielE)vzxnw3l>w}=BkzV&JhcA{FLP(u7qbdX5Y!@gHK zn`T~L2ozp=fDoqHYhTW*rz86d{+f{oIyOIhcaN^xV7XXhhBdc(Qk`KMvoc?xR-W$B!9M;81h%jbR zpN$1Co4CZ}RrQIAUkyAK2bt-{(O7Ndb=b%3r0OCyiu%}n&#Z7E1+tUm3YgW+ykYyb zAq~JkYcB~n;?le^4-K9!IVx3jcc^)kq|JSst#%9(Bky7<-l=l*CmLv#4%x|u3jgjq zdCAZ05iu-1Y~Q0f6tFQg!RCg8(job z$4M2_fgN%f$PBzQ1?)u*cV;Tc;r|qzE7IYU7a}nbY8(|(3LV9Au`qNXPYG98Xx}+% zvZL)ce9#J{qU-pc<;Mo;%r?v4M>1SVhDA^Ui>ow{*1g9oN*^ot1QW}Z9=xWA7$}kv z(!Vt-h2%&~@4y{JT}uaP)T(Qs7Ok1IzBIpV_B-4tzx+F<@7~<}adrsh?~}g~=kL;$ zX|?v_;=mT*7VrtbCGfa~Dcpt((2mAK3?;N|lPN2!Kz+hcz;fn^D&qGE42NF8H zbRdj@nEER{*|o_gBAzmq#5ku@CT&3lxS6l{U`^{S@SeZ}>R@8U50b zth>WYGUid->mV5R2%#r*Q0$cMu_qLN%f?x!Cr&UwmnDj0#0}fwf@@Tia7pVXDp1k@ z5E3#wHhcvyD$u=grT7MNDKU3rnBach>WOE^w7f+ zAO<5*(Gnm-iR;iRf%W?+fq%Fwf(v5-&TiyKB#V47#M~0wnyGO@a7Y0WBC~_sT28wk zkk!HFb>@kJFO;@m=F5zGUbk5?KbE*O#-MSVfA~^o_w_xgcc0MR_Frqq|0I1db8`Mi zI(N0Ew9`QwQqPInDWy$Jo4Wvct2J}^G@0ZdI|l%61U^f`F9yl#)$*^qO?ZDoD$s(g zq7mf+N<{O=gNs_6t9FU(=ah6w-%t5T4FRX9B&Cfl9hcAqd{Gz&{h3Ub?&r=H^H2U~{VHQ#c1Rpp#Y-&NY7j#**fxAgYM>|VQ6ga{T@8WM|# zFTH%~;WsBuc+OR=4@}{!p|FOzk=cU}$N6l`Une8jYN0`W0qSmuf$J9o;~yPMk4acM z**d+1rX2PebFT^*sy3W81QU*;5~C(Y@z68=;*!OXcwV@&45J0~4o0P5re5+V*i=@y z*T@uGhUt3So`5K&hU!eCCs^H?n7A?XF@saAJ^q86cM+GNcR0Q{Ol{Fi@L zF!$ENyo=}06_w|%A)d4lDw^pSjXDM^bzAg1%BpyH=EP}QePFD}gzckDizsNC=@PS~ zYy*Z28f^z&H*%yN^zeS9tdCR%Xh^}l7w)aI>QBQaOJg-aagP;S=7D$EyIIf?}=&FB#er^vwUP6b3B64SBD4~0zoiBcg?qRoZ( z{o!@0Eb@wV|AA&m*zX&Lx)Uh2EZE=-6-*2N;oDbbkMl|yR;5Ba2oB{EMCi|5)6i1TVe<3`@Jc;TqQJ9`3`$G+veK=kKdzMDPx=j;|VfR2*;o-g`&C_Lgk zq*PNna3)Yp{Fn@JXhg4pbg%ibI6}aLemF;$|Ii?-E-LTgp}_C2{7O9qgj|8rW3oIB zc<7yrD@X;5Arde$Q8NzGFVst`V4Xj!s8g{TWv-0?I&RQS^5y9h{d*#ehY6rAkoF?o zwtf-rR8S=tcFm*qtFY(+IxLPkJzZTnmt`+I`mZpr1sxBm!2B;wgxMR#nVq|jFs9ij z;HSIGWu|D%J0;id7beW54l{%>>D4fJ;pl%^^wz}qZt2xyIz5o^s`8Yy_|K@EeC3*2viqKtGg-^Wn!WLOBh!0y~h zBC;?L(@6;?+cL2G96YA;cHVc%-gmMQwm_p$f{TAM<~=5^IF)|dJ$@Kb$lePWYi1{` zvV~iIyc0>4AEySPoN>W#kc#@JGPbFivE-!1Fih>>_>f8wujduZ%!xvjzo{A{P)ul& z8?tzcJO}y?RIiTCS^oL(;`x6;mcvdcSI}8-R4k{3~Hvi8`dktf2TlY^Uk{XVt@Fq`9ow-3X0A< z%4mimAn)NOLXWGGl(xYb)M!%`b(&jynBwyukA2Bpb;YI-EpO1}nDaOxf^X zpS&}!%_pq)YshdWVlP-t1xC!>SS)vuEcwYg$Gap0tE?Qf$rovlzZ8(9q!`%J@CycC zMdn&!^zN6_Si!L|?xavF@dNd}I(IKh;Ozv1k$Tz^TC57P@I*-0Z6HD9&_omKZ3YL& zjsc@>55ahRUi&~5wy`65%P|P4OtHygzh5Bj-S<8hI8=dXG1Jyj&6noL{}tct=u4ch z`$q5yHo+>j`UwVgNLydBKq!MkmuAIcE|{+BSymd~F| zAu+SNDtK^i#I2N95);_{00*4zc!s4k<}&NgMVE&uWzh*>KqgflMFzBVXJSMhr$+VyE+iQe3cV#vw{FGv8Sdp=~-n604I{l^Rck zywRKbDeZV&T^Vud;!svZ))alf2y*bMUo102B2&6_svA5zWNJPxuSN#BT^*D>g z)Y%rjqRVXlEut_z)LvW~^5dF)0Bly96CcLwzNPq&6@jlnvVw7eZgdVlj1G3p{1Mzv zJOB3+u7%mLG7pJR@e;KRmUWXv2jg42*0NjjZULa%;g=GsQj_-Urf4yRQ$*zfI`Sqk zq+dfae;E+JP`IXZvUVX7no`b)IKd&pNG**}ywf8aUgmN}?_xO=cQ(APEf2z?de(4g zKOH&4t0AoCrBO?bP_(eiE^<9WnCQBdX4_0$QaSwn2YZ}jHk0j|J9ewYqI7eUsP*UV z2adpcL5QfeyWjV(g@8i${D=;`RQ2LmZrqMX8gSG}9zLri7&c@^eeZPjcrdBywVAVX zr*+`7;7I15^FWAe`lGH`Bw`#(^s!CIjx*8~%>=@MLz|P9LZ1hGTh{8Itk?TjVX)*G zf3Alv^mJA^d-G1ftR^#f%C~<}z1c$~F(&{P=BBbjl6@mMK;jhg6~{FY_?9`xG~hGs zXJj#0`+;?0Doid-U^pkni4BDiq)EraSGCh!{Aj9!YakjKXfN~kl+=*?%*Ssm5wcH0R9xgd8mlDB3!JtF&;fjHJ46tI_p z{572Gaxp*T1vyZ&nuwt7y#a6HR;e})$&(%)&x%u0#pPhVjnXrWEvWQ^1=X;3CiZpR zi^cK9?)$@faCzsyo_^X$E%o{l1MM=u3@o}B^&{4Hx<8gNf#572x09LTFyJsJoROJE zf&#HK=??bnYzG7G8@8f=Ua6&ck*w(rD9V6b3fF0|mI4zfbk5LM&lw=y45Rxg#CXN{ zbpb+IQyy?fp3mQ#)PiXPq9(5gcA=PIzel59nq?4gkScmao|t*I_NBTIBJY}mMs+yX z-p`aE!XoRte#wqZ#R^?Z%X03^BV_jeTyrGP#QOc$hWvk`l9-v8|3k7r(y*~RVE?}t zO2VhWkXY*V-hV_76bMtftD|(;bvj{Dr+pQy$>*0-x)QrGao-Pkyc1}-l9L`I@d05z zOk#0igXv)`vkLvA{$QBj@r3!e7?728ygr~m*MWYtK@1GP1Q`?66ZJiC;#mpdBy%7p zpJolDUJnQFJN=m>6NCHh9xvCA4EZB4jSPNQUF~L05?t+eZP`u=$9cT^=-ymjt{#yV zShQ`}sWRnDu3=UqkwHt9!x7UX(V8UB+D*IZ>D~rt;3Cn21T!%yP5bC>arFm$MHAAC zA-W`1F4UwQiSb1kQumpEVTGL=w2rHJ6y_%0_Eh2U=oxF7NSJ!PPZoH;Cvj?5%D+i* zLBG!9U`j!^P_+tI^3?ixMH)tfod|&eC{WhOUp;DWn|{a|^*Yiw%pW5Tk-B~~&$rXjM8zNTTV0Mp4CGa|a5lj9i(c6C z>HgWw23FN*N@IRFvZenH_Dq?HIH-~9tN9Gy;}9oB5gFGnooVa^XG!xxc} z{`1c{VyK~5MJd&SBZPo}<%AC=mNcyN+Ghz=QpXhrrL6z;d9lyk#jWM*1U^v<7Y_B!DIXP*hXnb&Md^p;46TtIxm@~a%FXK@z z(%JS!Abu5t_i%TLH>cNn%HU={!Pg&vn3&u~@^*W>>y*TT#v}ip4G;#v?yKVed~~f{ z;rxp~=}}y{7E>;_jzWB&xK3oO&gq82e)>VA=0!44s5DXI78gcVgf7k<`fBS1@UMa9 zrs8saToCWz!j~uvQ)5V+mn7HxpjV=Y{xj7w=2An+xRB8CL3BI5koGFbm$73TGu`}J zO(NL)+P`0$99`zFsyzeqz)B^=?2278hK)10N$pARP3_F5^8tWJ8dtJgQh3r|n9-nLg{cLmm8bJ69IngtVKx*A-rZ|wT_YE8bT)D+Ae2@xc9 za%4hmnM{) zGw#}1v8C#i-Mv{gX7|S;Yj?a^!IPkcu33DIDz)r! zF1L(QFxf@+s9XlkK?m&BzdNRcI^$VA%|U?GEKH?1_uk-UWLi9{XomlNu?X*Lo85{w zT&qsdTK%25Zfqvrp;yFIcC1hPOkNZfR7%UuM(V1%a|_qh3D>YB35EYpmQvYRRg6P# zRVEueIakZy0Qn0%%r?fsF_VUgV!3NaYd!Zo^c)FBXfr@s#W7Vkn9IJXpl_UI1 z3|mQiYh3q|ud@X!z7o8KIGwRjUI=Y?v>*=rT>AZwu{`g(WgVan^srxGwY)6CQ4kz_)dp#*WJlDofFs0DbX^CpXb z)vA3uI2mJOgWsHmMByIT)qd?bju<*rR#|XzvZ<#Q7_B5N_3U10xav&H}phHKr#IQEwhUzOm`p#RAbi96XG#3;xWP}Y2lCUWnTu@XEZp_I7uTRUj_FRVOLUK3wZk*#bPIJKH^i4 zjiW+Pi(cOxcsx@ntl+T@OH6@r0cXsoCx#WZS*tqtk&jlvqJqEEenA{pJ7<6F4n8nu z2SegrpG9zMT$cMt{AmQ_l%ii5tIUweUDreK z1`%Ey60?GT8>7X(V{A!s^k9{+Q3kiCQ~DA7-rz&dEbIPTOTzxYX;@qw|FIZ9tnvRd z@1Q&iK%5%Ybgc;mGls;XSS4`^J?g#$rD>v|#HdM+mc#^lSURO6oqsoE9S3SRC5JV# zn34Opu#JK}(a%#H)}eHNJV= zdZ$-w>Bx%^iS{iVSWp(j$vp_Cu1j$&PB!k4CsH9tU_S2QKr0__Qk0^iDb7V%4$4s{ zQ%R<=HZVA|R6e+5svX_cdr8B^tBB!{PG<8_u zP>_WwX(ORY$XW8K(%MV;P|yEmbr^`6Fqo%r)~T}EK6NzBF;<|vY&Acptvq?Q_+7oS z7*8RjdhR%JkY^LVPHn7|mh`HB->isPd=^k4N&Shf)@I3o(cQRWL1Bg?tKR)-X40{Ia${49=}(zQEzNzeORb zh`Yp5%UqdI*FZ{EwZdrrZX35Uie?;9f1BU5H42}v+BObZ)b|PaGff@mbBd8 z8mrjC@bCrV8kQA2?haHESUm;f&2t;tS?C%+T-%RBNI-Z!`&>K-qZv7b26Al31El z9iZVmDJ$eXJYwRg=j2j-CM<0*M!2=BDm$iYWX{Y~6wAKi`;6A*UH-PLG2H@Ba`~=g zE?`Q8N#I|;Cbvpkjd53QdbdzDZ1mIv0Zi1UZ5Gc}&6K#@QnnIyR{kAWsUF49Cvb9+ z3rUy{&e#!ZH*a%Gq^c3-q+@vcgy`s;nYbQUr=LWH)Ce`T;R(*2>YRGC&Pex})ttD# z019YI!JfBSZQxtB^gnR={nXHTx=q44I$n|_L=}!X$F@OjTDtt@zJy-%v~)&;$a-9u zz)cNMq+((XNc|Jbq4$Jcz=k5lNSFX`5XJ=w^2~3EWc@A4 z^kyM}FNu#G)3)`7L!MoIdSUMwF{;*xX);8-+b94=9|UZp@))X5k9P;9ajwTP!7bwj zwV_-pePs-{6t(xJ-HyEMM-b@@w?>Fz5~XoFm(OC9Ys6pTJ)gR4)ijY}?29pOx^CUux0Trt^ET$211$&uBTPy z{vP2uQ~nEhMmP%mEAl}Kvi1EQk9TQx!EsON(5|WVxZE5VTHWTg?BcbE4(2+v6w(3JZY(*Fx`t;d42q@6NykF`aEW zx!9V)WxXs-V>P*IWI3P5_hW#8i%ZRqXG7#NFM?h>+c$+&j8O$rPH8HR?8-0GJIJ(Q zfcPVwY0qTnh^~$?ef@`5mzRU;AWe_mO`pPg!pqW~C=e`eYuKu4C4wbbZN2^jW(BsR zzP2-}2h34^={Rr6an0Zice7V1$$pGiXG;kgk4pPE@wPerzn5@!%|L}#H2RfoqZue6@=F0C_={K|aEtzk{?$_>! zB!nH(T@9QzJ{PqG{rhYD$_+>^D4XJWnEuU8=lE-if3YYsd4QUD*G=gjwUwE&P!Jij z;pNy#>7t6i2SlCp4%e-lX`#jX4rWZ6WCc`FPuzY#QMgUN;7l?W_YpW4rO#A)m|dI( zfhcUIB!g?Uv`w<9*mvBX#ltO(0QG~OLAlmhZC)}8*$CRBhEI1tHDy}2W}MB)pm0AE z`0j0*t#s8^(58UeDFAoi< z*haDkni6nBW6f}IHfWqLzPl5X1%t3WUhb{$NB=pPWmqCX|F!b}Ph1)^JI8+{v#DGLG*>OPCHXH!sg>T>=<$8k^OUGvQw&p|?pTuMx)06iQnt>|1QW|NgX z7$(0Z%5ibQ(^GYNm<+W=eih-s3hEs%*&1AryS;IE82y-byEzRdCzW^XX!l!FXwJ_% z6t=mpj7umudw%%J<%niUG{ODbUuoy}e(Q_lG*ehmec2x;@U@NqS-yGGi5@5RnCi*7 zR=MN0nO0uLd+pL`qQQz?vC}ObuL07P;KJ(=Atr~47P|W4N%`^4xT5oM9OD%=3oggb zH2rI$-Q!asy0c~N!d)+#%yDBF@?}MMIxB&X}8AQ@?b{GZ!HtB${YlO@&#;qqaw8{4iTI)}RAk3wC}c2W-v zZ$z))iKn89NJUQm^gU;O8&%&Y7EAL*m0z%2X{k&Nos{%fFSgKx?Xts2dHsN4WRo?g zuIzFnAAe;0ZdViJ7|)FeR*@)TEVxi-xto5p#t%SGM-lmup09-V)r=3p8gtMofXUUd zwhq%3Ku^2Ooj<3UCAK{nsmDm*+4>6pYou}fjQUFfH*-F8Z>{}geSi-6k1ooW|=d{~`zpoL=Ir8mXAjz7!mr zM|!Q6gPHEKIh`KX7I|pe_BaJOMXu%D^>rErsg6%63a~I}}r7LbB}@ovpLQ zqeW&``PWoqFw|Mr1TWk^^n}^|UOEPX{O_TIV6t_qEg3}e646&Gm=1bgCXHJ146s3s zL{X{SVGyD81R2lH?Tj6w<@z%+X9<fsf_>$nR(e&j~$sqbqsXc8BRwG;$l)N-Lqrhf3kVkhDOxBVNdA zu(tdV5P{Fmr4l#{c&OxvQxQIV*$I4agOdCK>xkpYi|9Q5=vYe`j{W(4LN4|W15jUmfchsLMU~?r2Ls6 zLa1}7i-ribl4E*O81B@3Y~#XQ7|5NZpW?@xQ&h=*|- zBtrqLQK9xOpj||~#dmM|!|=wyBf#dbkW8Mr^<5uP zJp+u#u(LmT%}=kb({ukuz6(NUjK^RNdfpb4iE`nkymM0gtQ8_d1<& zFw$`eyn;%~@y4z07HU$zkoZ*NtVPGb?GPpm6-JMgoggrl0d?1QB}TiH60fSsf(Qmh zuprXMuIDkf$e#lfAGOZipbpTua4|+7cL>qWT+JGE9t>dVZ%}v*RtX;vNyF{fT1$y<<={!bv6_-9wTR>8xo3U@mzK$%74KdM9i4 zN$FKh`9xCkH z_8@)ItmMG$i{*knGM9^M2vcy5Q^$a?N!OAdx`)Nz^iD>}X{C~^YpmcBVcEbhpbd=( z(~&4!4EW+Iv$z`{HHu8Ba1&vAl?7f?IxIclvue$qcTFOby9udAE005RmtxX(K!dEc znN?PF(CJhd`@@1Vil#+M$(g^Q{cJ`J0T+KpFu9F9tYW~xgx{uO5=`3MWb^C}ICwID zg^x-d)Nm@7T(Y@~o5=sBs8B&lcM%-_BHPS1Z zE0mP8ApK|rybh`Df z6qh3zw5~q)MjO5mtf~$ZW4F!NWQ_QWy1b7&h++z%QLYXu%5XxPJ20~2BGjRx z+LR$*B3i%J8R7T9p8;W(OOVrAB;+xtvbD*pY^+eNYv7eat8DxZh&3i$Dvvxj_7df_ zxen@3WEa_0h!fqns_T8*M1#2ty;v8&3jO`6>LJ5v^uKoxf6kLzb#Z;_d5+2r~G5>Y=T^%I$?$b4Uz z%o~y|ewiUN9TGBAwpCUwuLBmLI1G(Kfvt&V&yqS>u>Z+mKgC@ldBmx+%4qbMTKHoU z0N_NkWWyD8WW!}frOoYEtB|wwh!Zlwz$vy5@gh~_5r9P5UGtxIx+yKAoUEz6l=g7k zsMR`Nj6Q^t?i)X=WEVrVtvtc`!FL`Djgchf(vc?h2XWl`^K#S8n3J~}18Kj8Vy{8x zW)H895hkL1aSqrNjkx|**w42Y{9y@8_!{hOao-N@$LJq?hUt44^KCHnvycX zH`iHD;CjmpJn*;S@ zY;)(wz*XWb0o=IqSE<}yeq5XPAzqsf414O6yUE)X2c~sC(^D_=dm!ud*`dP#@!uoy zzaWYl|JBPoAbix|BVr7OrIK z={nX77kfw_^6Jyo)ioT+Jj_7;oi-C8P)P%_ak%kh$P+2gZ?ob~W@x_~^P+IS=R-_y zlNeTb+}~+Fd-XowJnz0BJMy@w?gQy-ZqS!#DJeo2qb{bW@55}`39MTuI8UTCwQHD( zhVDgFH%qqGeV^{$?O=t-6tzM5UPAIW;!GVlQNWp0UQ;*G7AM2LR@nLCjjg$w-1%5> zHlHq98o$ByTJUrcKE9}pOf5QH*0pdeuYh<%A`*nRYtl4*bz__&4%qZ`*?eWQmIzj^ zEu!R)OqJnPHrP@M~O=4i_3l*PqUse%(eg~x;h+&!ty;`=`Ud^xvQ6$=2 z+Q^9+sU^~L>>Y5e*)t5Zg4KT&Z)*heAUokA1kn5#F77u&ucqT_PaP7rVWA!>O!UPN z8!*(gqLWSp8|$+A9Z+^y-3YEqch+P9xds*XatB`pjkaBV5{B5_AS8_Ahh6JGD5&$J zrQBs6QZh`Y@@J#jJ$r@^vKS1tSLXc8WWQ>+4q~-;F0!zlNiQ9M96v zGlZLpQJOvbU?@f@?(LEZ*j-W#lHL3MGPHp)(L~f0jhD}##{U;aFhfi+QKv|Tf*S;L zM7m1Ni2tg)`BfH(-PDE+Xq%80eY>N#(D-JrYj9(K3=ZU^P);)s?N_LP;FU6475VZ9 z1h)cy}a!r7z(mdINaz`x%{0b$>C+<24$U-dt~p z-I!B-;U|R0Ft`ZsPHxt=Nt7g0#6fS8kz5EgPRX7iLvZi zk%V)gIjIIh6SFE390R#PXHvcxz>o@`c4iAk^?LvHp%;;NB>T2Fy;jz!r zI|+-42b+D|FV9o<15PY1FYyrp{WOet!{lez=GcfZq~=={{?w%!JQ#?e&^!dl$j*u7 zNgybZmOHIsGa)x@Be&7g-CaQm-s{&5v#Q;93=@D!)E`fCg5FhUf@WLznTWRv*y#sEhz-3C$aSIT!!;?b)%n0C(69t8)7 zw#RY4%Yoi)^5iFjM31NkFZ)0<5R5Ws%s7~b9cHn_qw=Yhpx%0Z66^&k6=3jE{^>ch zqJBCDWErFGE~kSkRRrw>{_sI z^C}lT60r#>A1Qul!C33w zzQ3fL8=PORT-KAoT1ZJSl+Dqmq7h}Mb{t5zM!wAz4p#6sr_sB^sd;=YSQ{f8a7rD6 zSfFuart5o^k-Dhw>d$9R!k`zSv46H<;iHiGQkwI%sg10P8VB`g6>7N%04G4ja&80i&B?MqQ9CUzsM!AIgK$IUL+ ziS^h-XhzBBD4cmog$z)miMy%p7`;G4_+-`qShzcDC!68r^MywixFI`VZ2F9}P)wmw zHuP;UG9VcfuVKr)3tnb%$b)dh8zjRT$5PdP{XDx8r&1O`-P~5+!1tM_i+A{YJ>OSP zs#c+|Tmif?ZH(qMx4F3uZ`2;)K3ft8O2J-zMT4d<_-~bs@_L;?$P^iOsg{R4wP)GH z7*Gh)7p#xLXA(p9GcU?`pVw$yag|4zv^B7Wh6xqKWX>xH7S{0$nB^vb5YK?u3BP2I zxUFnXGN=M6{JZ-wboD}KG>G)7mku3Hc2r{i*us_O7&kp$sVbmrwM^eaRhZDR(M!*;{J63r=FOL3 z*QbMPg<#s^88_D(&zUhbV5S`7$C4IbwchFLUXaow=w5k0lXC?G`y2XCtUk_1H8qN^f=q&& zo&CeDWwObZ9tsopo6ViSLoVt_9%d`(N+MEny=dMUT>VcS`v0 z9?y9lgq@*Lr(RtX+VmUExm+lIP3NAlU%NRA+!nj-DJ!j=NEmk8Z9NH@ANous$ zvMuZ&@=AQF`GuE)GCO~(*3qG%Xt`ui_m8EMpxTggKZ5)@K&difXD}m+CZKefmwX;7 zh2Hh>EqaW&$EnDUreVy@k_!^qoii65!z5VPLQ4qD#Fw^8LuS0F1j6p3{YY9z35XtP z0v3b&6X(ig*Hi)SSDR_F>Y(xLpux`p z>m{ey=(12&VS1YcT|(zOk4YD~mTnnvnOOc0WB1ghS+uN+I&B+Y+O}=mHY#n~wr$(aN@t~Qv(mOs z?R{E1ZLQPh#TH^vN5u2~uL`bLQ_A^}9iwly-jFI>vJQzD!|wTyV>fC!N;hhC zwYgOesN4XCMF%CR*_iLRef~>>Lt>>Hk7Jn^5fq61+fERolb>_N;Q+yT2;8@qy!P)+ z_uHGDH@9QjU6pVz(r4rInri^gzqu(*(HX0+8&A>Vk@{)^z$iAf2!i)Nn&$r9c;9K} zRH}0&_=aBKd_YSLO)b)d>7V=C=Jl-C>Y&A{;2uhgNt@FyeSY7IRpnNTp)pKaBz(3( z@58OIA(x4^V1u)MF~k^$ci^d7t56N%5)@U{Ql$&rrs}RjEfRk#$!XW#Tj|DTC41K| z6-rAU)TF=9LAV=#s#g1CTI$z^8wu*4M;?1At2k>qfpQKl%!QkgWFg062J{5|;AtQ5 z(Qy0anRIi6bNukeU2V3Z{*=yqvUcv?Ck1lW|Yq|VIb zxTg8uZv#3$#Lsl$r~ni>vS^Jqsk4PksD&*;^sf*`Krxb*?xUSXvH0psCIklLuhtP; zg>B4X%=}0{ERzfNAs<%QvY0q9Q(Ttko*W=vpij_d-o-MFih$=fVD;`Ez5wN^NC{t( zz0yw%e&j(M$UxX0hrF6qY_HU#WV2xrAyK6GgG_WCaF^^oad$d8_9{R!kY+_vol7PGA|vQyze)xDe*ZA4 z6?s}fj4zjQ!dEi$SzV`{#jTy9S?w(0igh0gRWmY^QRo z0_KHja&=?ioiGfz0C_DhGS^9%yEw$Pb5-4dbQLiI$~KX#OZe>*!RV;!6Ihb|qV8+| zsLX0(6bG%TX3`7MYi_4=A*y|&Txo$~TgWUY z_ZNl2H|=dOO&5`hus&o6l@J|6*|H*>@JWjFpnbgUxCP{|J}-tp(Z1^5?|dEb1gSn0 zuZhBn(79{Q+z4$J>^7{h75HHK(*SA8FzD_L$<$YTHgurirUeCOSs_;wi2)U4i=XO^ zu|*R8Ds4HhhL^r#(%8In(4nzV9MqZO-Z0ATD+^^L9KK_r-EOYO>rK7tt42J}fgn$7 z?doTYtl~AExNd5Wx@EDIwgm?UT;w-z8a4t@oP`a_edJ0Ngn0PN%GX{A5@t)nY}_KD zGQ|RrihW8Xg9xyWBQ4S>(`e1HIT|-P9du}B^rxx{l(?op>av-T6c)ExVT&*2-zB5+ z4uUL;bj0iuTnJTq-P?G3)k181>U*bL0AyJ=perYjL!K@Be4f^GY9kgOeSEv^4bAB%u!m_) zZ9>K#&DT1Wwk^Bl4?i~Y@1C*Wm{M=7wre8F7HO7L)$CeUQ_{=J)Eu}pq+Dgvz5fmq zEbXa(t4LKLwq?<)l32Q{t2RsWp6n&ud|a}9vbJgMFv!n79Tx`Jkgc*9?H=jNoKTDK z1QA`j%~%w}oXVZRpuod}Az-4Dpa|(8RQmF~m?VU;LgsZy9FZVa7i7eZae82&s^u9F zMr*-`J?9x~H2P&L%Tq%3o?(RwfDvAT7@L>G{Bce142Ix^OdL>Iq53?(1D1%Kys5y_ zxq7rZ0CCj&u(E}A6N@SgrAUy>62$_Lp`$|GKmI@mNHA4a!qa3Rvo|o%mCD}6k0_yO6#{_v1$=n}-)${rQrj-a z_J}vd#(s^vZj>X|UfF8R6<4#kvUM}FxW4bxfSuYnhQI&h-{!{7TrYct2N#S;z9YMU zl%*BECCG)T@clpa{ct&WFYOl8<)9QN%`X}nV-^}WGYWlty?vY{0{XiCb8lkUPPwilY5CgmmE zhGaIhpVQZ_*!01kZ2xGe8s^9Z+o{QmdeYP`b}N^3z$a?Cdf`r zCv@nV$C3i2Y0(lf3P(usn_k-sc9qY!W~pS*4ZW#LARk;# zw)I$6)7nIVA+PH~FWbbv{6GkgqWkDB>l@Gfl7H!E64vgd@Dp;)AqbBn0l)gy56?yO z1LOs%DFqZ0-Z(D?nGu$?5c_!Q|A|<2#IE)q>y!Tq3uR_wWBZ>3aWD3tq|J_}yn4mA z1VwsOV)dZB#bGlFmedK;gF0Osf;ALU$1q|x(&ekViLp~YTD0{rFUNH%1`vY4@OFFM z&&GmixbHc!nLYb9O@h5M`&;|=*NbK2r#N~`@u-@D=<2JWbMWI5BrnI-f9Z7V>0<*f zlPS)5a|ch%=)$BoRU53w1CNsm8UhSpsiJp)+kI#`SXjMY6O|S!4R9r8I%Op!xzO#8 zA%$t?R9SLgZ$`UT@Fje=Rm79I!(hp<-f*`vf#qNwf~xHuhWf7y^c?NwWmgS1cbZK6 ziEg#+ousbw__V4NW#Wtv{&9h7o@77lnBFRE3gDrZ|LP-c1>4%)7AUXt#2&V+EJHNYXmfXxZbO}JT zsx@&+A1Pc(2R-5{OA(1vWCDI%Cy7B4JqrvN2)LNIOJGSn(iLHRqP$Um(TGS3!RGZ# zeE}c9JH;&vItiMetj{4qBC zxAr_%Oj~=LJWLy!SbP`>-*v&Q5f+O=7Txc3jvu;xN=gVcUG1i1u_YK&MU@c{6Y)VJ z5$(TL%rtTfD-~ksd|s?sNiK%$Br4#d)*Ky$JteltP~w=WJrl`q;(9KUgh-zj1=ps` z23uyf+pfN@#)U=EnKH@SSsTVzmjL?lfE=WcXO?XqBZ=n%ykh=PeAcy6KG88PCA4QY zx3}$RW&4>|1r9IHq^ZMCuTqAR+$CdNWxki-RAg0BT<^9gZ7x#8l^Lk+5obpoiNU`J z=#puGbpaXL-|68Y3hUF9_O%oAqaqlE{r$9Z9joPR)W&!X%+!;O z8CgSiCRoj{;cbNbp29(Oj!JXpUz{Ok(j0G2wIQ>Jw>up`H73SIuHLqZJH#bx*jG{^08u9|Z+B;@$la&*ovlYP+Rf~5UTLu=U{mhf582tIL4nNy-b$3d!LUrn@zDIqr@b_O?`s*fRk=_qlmU~d zqX#qwsL}z}usWM}obyu1UIcg{u-cl*QH-qQ?Cqg4ZNvcRDtdBek7H`r(bkK5=CNbQp*7fr<-i5iLToRo10{VpMIACx5v}U zgK^h(l}t^gHG6+X0o!-x!EDvr=2DA()PVsi@hm91YHbf#vh8%MqgUGP7;YvEHn;wp zvmNP#KHhes$I|(MRc{9iV~wx-UdI0~<26n{C^L?wn!19kuZG z+wk)FfwxMz1FRwHmZRZSji#`<6lJ=HlfB;D>JXu^GAR__+MY16?914wwZM%M(7Dy{W9{~aamx&2Mvz?ItW7Sg#%66Gd}$8hRWti?)}SgbYMA<-xu zc0HyCd~>>Hpo5KC3_@9%?+rA*kZfIGltZu#XTkz4StzWdcXl8~_I|+=3zZ8uluOT6 zP9%MUb*ZSk--ZNw1(_NID!JH!ntQhYQgJosYx$c&OSGfUEZvcpzUq%y{@{>xarVoj zM1|k0z0j&CN{R4{_NOYXk5D?gk#9?M(-Q`r$lsi&z91TZQ=XO66bhGZl35!64LUB^ zno;%^TtNHiuW5`zE}Z^GF7qC!&hwW}JQXUA1McYE2wT<2H3k-@ZTF>d-d8Jscy#9P zWv%kR4Tgy9J;nek7@o$=+$X!>(*vu0m?przU{eggGe(k70CqgzQaK*aVty<;jjk1P z%KJVv?d^od3@;60lb<|GgU{aJ%?os)tG%w~zbH17U?kPLt+l9yhfO4&zhs*sD`}>e z>&=8SuRT&NRLR z`1~Fn+|G1(fsJ%$j(lvL1M~6sXlc^fu~tu-gJVH)K1>fAr%QQHvEog_h#cv!r92vK zH`AZ1C1W%xi^p1wdm(NdP=dq~kZ2E4f?858>SH_CIbpZj%QtrUki(;G1zrs)*%GL4 zz(v-|I_mW|W-tXOP7$98dIlD+$tI;YlsvL3< zXA0SS=FP+&AeNOu6+5Tx@rI(QjT zUGgOg0H7p)h+Kp40J7~oFDAXkcSGG|taRn(v4bCI&c~kl9t2WTB+-#_yzfEDL=91^|_vW5z!AS&gmF*8XZkp+WE;o{)Z>)Yv51`U3mGSNHER@O>%Pgr0HAi(dZn zBioXuOtWt9+Wj)QBJKY;{mR!+mNKsma&LG+?Em~a?T%Hp(qrYZ`h1+MUwZB1!{3D1 z^!iG#5>UE9yxJD;dV2Pu&F1;F8l3M+5^5%YQXM;!iMpZS=TCW-tJlde^CZZjcC-6> zEy0Dk;xx+AXq*H4bNx}~L;FDlr*|ncq^M~Lm>4AFBWOW(Ac+YGGnzT_J8HbVj?olI zdHu0-9+Y7MWF2UhVK_xe(Fc`%>y)G=^74Lf=x#99nqdLRPAmx#L?jPnnGR|HDl?gV z{wA34+f*wrw90XnPe#WE%BSiBa-k}THvqUSA3 zO=PmsV>Qb8ic0(!I#lf5e)hKy_p(}N@rSK9nC9R^n-HtH z^+u<*fcj8i7#t*u35gSPlfD-jLA*}4NI#5sS=5Kfo+^cn9QW&I*E{|?<)>nSiKN>~0_sJ@vy zuIBx zo7ltsWE<~3XF4RFQZ*brB4-kp%TxHX?nl7y)d0YGP8`6eGItha2&MTIepVyu{>1s^ zH)Q^d(MH`ZW2_ACZgjrPgO6U$@8|M5YKTiD9~4A;`jP?qcsd)=)(`o5)t^zK7}$h& zAomS9`&5Id!%B!RyB09;)Z<6(!AeznEjtt0o&4-8#!&25hki~MWYPHYDteBP_USWl z4YV!Bv#kY8B5A7lt$9rUo#HK+7^&4+ep$uK2fV*U9v%D~(ZbjbL5hb8E%6lzIM1*g$^BASkZdft@9Ya9Nzy6%13cT8 z6(OUL;?A*#2DJ?4g#0Z(h+I6Vv#XKd50H)u^Q&uLV6MxQmhQ$FSq9RY^JU z9N=l^{|)eAXU8X1j~%-^Cgs0fuolCLN(=gJ)MOoKLegPK+zcDLwTGW2!E&wb1gYAK zJImjf7x&J`ji6W?gkKrq&s= zFhhn$jLZ0oxI;#GUWmlb1S^iu2LnAE+0nb8A;l5GJo&I%EF#H+&&#i?AE_S4RcG&- z0?1-ELP*G;0*!DJ8yLB97>X&3xeRND3i@{^o*=Gmz5`jsY_G z)V;dZ1-r5UK3FghEZA?Triyi9bbqEhhp+y=*g|Zv(o>QxNd1Cn6e1OvaFr6l#xv81 zNim!1)EUAy6bM!sp#y!G(vH|FO$?gVG7<%55(#wo z)Ex31&rs&dSEHTX3AvHVK%>>M0VDyZO8b-SX1kEmK*OO7i~C))ye`*_9)|KL z!M!1d{cBYGTVmo9^9@t@{*^s$xGjFmNg>jgm!3V~dghfW^brT={z97wba{)J z;XKe8=v4CLb%&k7YU-u(s%))CGQ_IRB3&sp)XuVxJ_yv%OmlR{MO3RVC}hq*M8bM} zmj*{#Nb>-D3}#?_e>ZlNm8$_eG})6rp~H|2^p4Iji(o}3n%7~TB&i*k%dhD<35!fr z_R%#svR^mmnkNs^hiykZCI_qA5`yV6l@m(g z?@YL(jV8ah3wg~M&nqHj7)(>tQ73BEP_?_81*wf{-@asoJXdb#ltCe~50Mb%939R^ z&f7-7+q-}bxu}Mkl?ds#+XyVXno!YrR(V4F7(})bejThc3_~(&w5Yqsx^G}wX_Gw> zK0^p6fSpyuboth+iP!3nHr1Io2h%U4k%b{1D^u2masC~I^AS(>+D7Q zaFC6CBq5{_5jVydEo9Cv{t~9?7x&-WW~%hpN`z3KX}W8U5a=MNDl0!ba~9Vf=NK1W z6E4|rEto`@1>P<(No-h1r>qkctd5a}`vonB&*#0n(ps(*pGSKwNpNQk)V7$WoEf@h zuT=gV-R_!&AUz$U{Lllh95g8l{j&Kqv~}~j$j?h4E~G=u)MrRAmCbT^@A;JIks1w7 zW)n)=h8wXdgy_r3r16U({8v3sRziB5`IZLWbfXOz6f$2z@jZb`0TZ@qmLX9RXx@P_ zn!na*+}T|ULsvoUihn4rRazY^DBEpn{i+z_mLtE$v(hl>PTojXby%nM zG~jw@XL-J>StHaTn6@KF&9%R$N7Q8{4ezA7%IG!8x7ASh%7?)lTsctl0Xw*BE|ZYNbVFf1u-Fg=j> zZd{R_(Y+W`iN3BzUNp*YfsisL<1XD3T_j1g`0sbAlGkM)$enN=4ajq($@A3JHt_Qqr2V4Gr&IC^64l&A-V(sSTNvq5Pag$#@BLRLNu%UXKD zbDUI|yBpPK{N@N5j#x;vdY9QjM48_2U(kt`I&I9`e!`an{+PFS=e?yfb-xKL5t{OlEqbAWPwOylnyWNYhilPwXpeLg?y)=9Uw>h*prbxtnvT(;Z2yG5t=(<*h2yImSG52 zS#&!pi;yElCbdn+Qceq>A9(tt(Rn$h;Os}nN#uyLZ+*@tj~b%HZ~~;#RG$Zyoq_AK zx9*r1L(vZ{qFE zv(W~`@?c4{;GQQTMZ$<|>+3>Celmj+O592N z?vny32hc-FCbq6ZyH9o;N?K$JlE8=XCTj9y=;6Pb`km{4i>7$=__z(#UDcLHBf_!O z8r_spI76^BVS12_5O=cp;*%#zBKGsD-)#FnnIm&S#7lQw`DH=|30VSpF6`h{!VbO6 z_#=sI55+x;w+rTRtB-o$%3)b$pv;-|YbKvPf)gC|LqTx$F5AVfJF=Jq%>z^>$Zhr{ zE*%6HuilFY2m$cT`IGj9vgvMX;o#X8dQC;PfSbaCw#bg>#Cuj)} zpPgLlN9u4!>Gx)p7gJNw$7vfF9AWW!JmF#x%QjaFEM8>w7-C6y{V7zYXtCM#NJ|u` z>sNBa5P>H&LS4Zo>3qN);HK(z4_jNt1DuZBHQ;6%od4NP^rAMX4O6`dbV(qSF9V8>JLFt~WQL6$N`EUJ9 zG8Dj$8Oqa39rAip^j!-u>yR1x$c+SjrJH|W^b<`$v>OLLstWg(5bA<3Wo}z10z?(e z=}QGucW^o05Iz&voPH+-oMH%uYgJi?j8UYXpG$@yoNq6o6?8oQK%4)(@ER|k6nsdh9e{pb1!{Z zkf}ZCbxu_uQANTqGjpxT0c0*Gue_A0L?O#V>cn>q2ivXQDQB2`H_e?b@ z8GL|bCVNn5L5L}L0sj0@tf`bN)Qo*ikammQvYfmNfS%n_J7GN}W1%wnF@C*3#DwN5 zK=7-EbRp0iWt*hCZ$XBGE^(?UD_P|uuxe{ds;a&Ol>LF zuYWAj2g|EJe+75ADV3`rElfeIh3=8+I5?3qwhzv8v(4*!7T%4eP+U@^25s@ek339_ z$>wKqHBCyG>O&211x-JtE*QUg_(TSc;RQ-Qz{h%>00k{p`OO$e6!+F|N_!R``?2*d zAAB8a&AdZjwA=TA+wY|(_#eOB{}p@9^1qxU6-re`RYo9T5pZV`LS{wD8Swk9Ku$fP z1Xv&gYY4>u_?rJtNM&K?_@AA=5iObI!?yn`q)MvMA@@iPQ&{B6sZmEJXLWM%J5a?8 zi;|ipZB#mb`*htEjAJ{9r>9I_pg;wE2@CXHuYWa}@WA{u>J97@Y%kOC{u5FKuD@S9 zKE5#9Oj59{)~@eJTa#pHw*g&E9D@?cJv?JVwOEiqll zJ$A{bnQms7UXN?9|2G%w{26uaq?7=X*?AbU&A&E8lgif-`Tw7jt^EosS_cZ6TecCf_!^xOiW8ibWxk5nO+|PbEa>KrjkD%b@ zQDx<>XrXdr@D_&`pQ3>2>718bADvZ#hGEpK} zB<2ATOi{{4XE5(NCJq9)g6PqN#%$tf?4 z;9fYlmVumb591X&%pTI?iD#)wIArp3pLLovwZ%V?sWOF4-xvK?`tvn;%ElN-)K0&^ z;M>;=Su8PX0;^3P;PHlv2&}q@AjrBDskl&l(8&@n!ntD?1D0w?*2^lO#U@f~mB!as zDg?LP1y8hjcUyz|-vW09h(KqVl!i}L1U5?i z9S5cT^8KZR%~}*$JfSu4!If@UjnOKUAz-IMcH;XkWfGr2J)lsL<`ll>)cFba#gFAy z4JdxL40@=#%Xq?2{}Lztso{Sixh|sx#V85$2izFqdOiqJncovzSJ!pw&Jt#y#vof| z6LRPRxQ|2L(+cW8GDNImAyj1Oxze*FYrxvG`N-(HBO2Qi!R~9g8*lVRbTi3v3ASPsgyxRzR_{O2% z4i#gBTol)w1R@q4Qh;V~t5iC}NQCjl`7xHSu5&6OcszP70dIdTidII({#bh5jsAvr zXG)A^mAdO9Q&!c!B}KiaU}dLb7?z<6q~YMmsA~nWFJ1#d9jL;d!rQegnkc%Le066E zvv!OS%TB7W=dgD~wqqCKa7ZG|&Ul#Zzcuh=g|Sxee1llDw=WNb9y8s~mW zuELb?t(%=sy#0Z<&!7TetMnqAI*`T!(Oo%hEJ9utT=KM1*(|J=-pEF+%3FzE3*!Jm zFLiuA{E<8IWGrTrS2=c=B*`pxfKx9v{m432(Gv)3u@DYoJ#dEQAWY-TSlb1KO*|=$ zo=G|iloQ(VOYv#aSO^NM_yXT|md(uYw_~u07SiaoU>!=8dkEt$uoz@sc7dGEo8Jf@ z*sd6W9N6FcRr9?XnCmx`pGiZ%E>R;vkcaR21*OXjHU*g;ZcA0Uwd*qzN)MhoeLQSu zX+3fsl5a&l5ToG=6Y#Zcr+(P5$c?U8=H=N&r~1x-0w|X)f|C!=Sgq#W9^s^o_g|Sy z9*$bE#sG3?t2Kt%H=9^;)zNTW)sW(!@7HOijXSRfi$R0y2iTRnd_0Xry_ zf@1!4BZpo{{Kt&nA?t9oK?G%1_*ing%NS|S`M6~F$ia^mOA&a%g$b_Nok71F+qm*D zsJn>a47S^Rfqqro886RwNgh?{PLZf8!eSyr?L{g&J8nwg)b%h)_#0y^#4rh$?rWtO@3%ng>$8T@(@ys)W-O6C>!kU8L{NPX;fF z{4KaLiWL+H$@KqcoM2}ZM7vqf$m^gscp9VjC}3!Tt#hJFrcsL(wD*s-r|P!&UhCVH z3AJb*ZY{CEOR`1gO^OLaf0?9T9;B6yNF}fxaA5R zBSV*P1vg*_2Jqo08n_3yu;k%?bNxsMIV6Y^SfCQ#=q!knf^fMF-LoSH0o z4JMeO|K}2UlfvDoT1&iRuakfJ>9^Q)k=W;c?6IP-B<0)_1KsnSi|b`lqMrAVPy;w2 z*LJKX49$A4!`W>fysL9u}4yx{EXo*$GoNC zJ2JFs(u{ZBcJ@<)o99W{UATk)V&)!-D)`<9UpSQ1nQJk4GUME|U7WNB){Ql5 zh#tBecxL_rlX7&d#hXk)Ks}xGVby=ABp36k|MCR6Aa$;PB1c8GMEQ~KxtKZLJjehp zBCVF?vw7R+uBPI8jBh($Xup@H(DRdqXL#y~cRe}qu%X}yQF%2Zg|9yCC?qk&+YF`1K7QVc_`3J65L$m9?Z!Y6yq!%} z5%hqO1{HxJ7l5&6&OvF9Myj${{-R1@G=!I@;J6qh{ialc9-LPt&)HY-hjK#+#-_@F z<7W|uJO8XS7))fvln=F^(`_m_M|k?3#MvSgV;BS?qM>RoQ9DIwog^Wu_Rqo5qqL!_vY2~+hS&l5|wloR{CQk#7#kbWLIX6MoyUO zV~2iGFB7NRch>yKwrYHCNu?fh$%%r5NT~655*8!|;W0eOMzijUf#P6+l7qmfKaJ1l^hlAQ-L0_{@3p1`~mJu>jLaoEJI^#}>r_ zXp8_Wrkza8)ObJ5|D$~9Z)YXt$;wE6>xb7QQeS;`{1-Y+_I~XJA0Q*d=GH^7Y@>*puO$D|@gIWW<%*m$JhREEQnTU_Xx- zXyEj3gT+_*t;xO&!jh7K&p!Cn!n-E?ql=3{9S)sF!^b8}^^h*47ba-MwiC~*|9~BA zz9YcN7e*nUDE}cM>{n3V_)Uw0y57mI`mu^Lcp)7p{t~^m@5UYDE>zsuI<4e22D4U* zIgFbJ;Gh2h0Z`qnx|ysS?NOr8pv^W>`Ejf92tA!5SL@7awgM+IYNW)C&obuwBxvQjlWAd zUPM9#=a51pTv5e`J{V9Dq1G_9IGJZS=+DmF_k4y`YhmpAeXf^bll22Lf_;lySDJW7 zYi1C*J3AFE0S^qwmh!BNQLjMCX#2Bj-&cfex^3_8)jq#4>n(6-FSW!}X)69#b@mYh zYmw!P8tRP*`TK19qTm1Jd0L=uw-24;r!$acOqFgvR{`B7=6sYI%GN8dG*@NS@f?Y7 z%<4*zO;(&OCWYSuo~nNd5bZFhksx_}fLsrhs&D+8S#6Qlpi0UUMn{lM(-p6jxTD!X zS-eymEAhljsEWBwAQX=!nh3XgzQrPAcNIRgZR)joXz%L-3zmxWea$lBrgEu-@jECI zI3blEbhcqC(1P77wFl>~YFTWC` zoQ$A70D8=fsQTYbMkN>qVqx_NVergWy-!kMbT8r+Og&q12jVp}q)}Kp@Yy(6IvI-C z;AkY0p)FRq}Yse567)*NzFq4+?!OTBb7e>Td$XLUjX&>fZN@(nhDH;;5J zWx_Up8lz!W0awO(V6_DVX0z&9=20$0SgB|>495%sNV`kuHB3?%3TbaG0NsbLw_7Pa z?$%I!530PT!z(#2lQjquC4TuM)W(RRq&1!;Y~B6)k83{d7>_|+&A)^@lb+zwaecP3 zDm`vNF%bI*SsS8}ObCIerp1<3xSw_Kzn0OjH^V-FOmipXId`GWdR9fmjATo6fHHRm zNRly?&y$*VK6F57@9c-*^?P1)pa5ZIJD@8LNXN;3e;Z)xR}|S(l?1lF6H2Iunj$rdw%Dd%SVYjKrtDc}jY0>^+H}_Vdz!1>*iTH(n5yDa@6@#4t z0$0M)ONeX`|1{(2L?JNut1730BP{$KNS+X;&BAA2@EZFA?LgDvygHzG&}y+x*d>t6 zys53TX9v{xgN@U(h6}Kx7Ttshj5o4vPR1Y=NL#+LNXFXJ?@K;8suax&DK{m~G$0ngWclcBZw+oDDI14)juqCpt0#?ZLBUzO45YSB`_ z3(>y$RPn=i4$eKTgFGtWuAS8L6pWlhCQ0Y^5eWYTh^~>^#g_? zeTxujJ~o3!5l0aAV#mDb6t7g?aikPt$DtakiH6y?QMfV>+k1FpnOoM}FJPZm_EjTT zW=;%}L2w>fnYQ>-7)U2BlV;^FBZ5^&==wXY6s)~wxjC^5)W6bAvc_S3^E9!aoEj@e z1q5D`Tj6kJf7XPB)()+8r(j;cBmrfTs^yQN188|)yNpQie}Y2SwOEGp%ApupYDbG} z@i~t&VEV$0zg?hxR&40eQY2MoAN=u+cu{?-FA2rjRG|d*7h~{81#w0=j~AgwPpB2f)s9Zy;yWDL}8T&1Eq`nsoD83eLLgQDAS4- zqfvZ4JJTcRS3weok`yFrPIjdpH2l_ZbtRZBVEwavU`i_@OI?4S?DN6*i;!4o(aMHDzc7ZN;SnFBhm|I^F^Kxyp&3>|+kS-^Q7(^j< zJy8W^D~T;lbr-#2+p9xHSa18gs9|!hIAJYBI+9bW_D!|y+ii)zCG|Juw0w(>+Ovox zgpy?C6oZw0@I)n?)RSQQRUae?4miyz#2kh|m2H?2#kISz5GM+4LJ`aqa6^h+Ie|<6 z^~APf+jI;U${^rnl8E}e2^f!%xZ$NWrhU(w-b{BV%TsZ)%d=k@P7&FOby|@+Q{x2& zRX;Rdj0>dotIH@G(QdbA(XLpp-2000cn7HAGTP`ugLB_*>*hmf)vjlHS|eXwb!5Z$ z+{W5qM7dBk!EBBbAwZ}+ywMtth0!pKG0VuB7nrpUyCkluo1T>6f<`s~Q*I^DbJGeHF|I2clE7m^MyEGw_lt?1yF*l9f_UB;(I+e-Y>k3 zk%3Jn$p!Lj*2!9(_WZaOfnRjl!Q7a~jN0LkurH!(JNP~Ud1G8;*O}&ln zRk@SfOT9){#Y7;O;SD91+op?NTwhQL=O3Gm%)0Uo`wrd0?s}V@Y({B@NRil?LDp;D z@30+sYXF+Ah{54VL{EKfcP~J?1`{uNKIEFq0+{@+=kM(f{*NVscu#UdX_9Tdz=kz7@5A2789 zD({MEtF)HN(uU(da)Hw_QOoMGheJ zVe+S~jlEBZp-X~>UXtQtTfn5lp&sX-kLz2Bl7S5gv$BK@8r){&H~uWY26GfPOo?9F zYaBCk`~3FnHV$=-sV^S|S}&Nff&0RL>tks3w*~Wml?mhlMCM6PNuQUjKv5`pAGFWl zZS210N%KO<293tO@kW^c^0nW#sfCdbWi9xbimPlS@yWhv)l2#|AJ3SLi9p}`S(Bo!(k{p z_r2Gyt88H!iU;Dlqrd8C3X!Tbc7#f}lR2P-<7(0Jtqrg{ZJe~R<)WfuDGztgu)1hJ zn1hNG^l|IP8^>vKJ1ZZugXgaW>@WShm3VTbeNw#ICN&+dWh%o~sKxRC;=~l=!X&=E z4=nbkxM&Er$l}Uv2ir$OekwRie3`*OD&$y{FT37+r~b9tnoVE-73J7LL8u`b%Y&I^ z%K=D6EfOZ5hg(IpvJE>bW+M$A31ZO9HU>N6*^^XuhWZT#nkRPx!-$@slM#2dRx{nV zN|eA)Ng)^`Zzm^=!kOGMRDPxh_7_j-#Q4h!-3CU`#W~=%$L72y1UIw{mUyYi<(=TA zc8Jde)Gd>ar36x)1W_ADI0|*yx24~^rI+WatBdeLc!$YdHM33`}85C3D@?D2!c zANa;hoc=%liT^uUmYMN?wQv7*Rh^IiZ&!7SYF{;z@s3z<_o#KXwKC-@B}Mm$PZ1z# zY!(Jc&Pk<6CAhKUrE~&|Bgd^*{vd=PosYe)@3&*s=&$=r9W3BdiuF0IzKr1a1@v$H zeRrp(&rd;vl|)Q^Zh87E>Ky(5EK#~PcgnF&t`gXPcNym(mvZ(5H){y!`)iixJe1h5 z+uaVu|2PD@U)im)b7K72J@@;67`vw?OQS4Y)X7TQwrv}gwr$(CZQHhO+gWMb_Q`#- z&+dr6=vcqun{%##=e;rMwOplG6n9=rHFV@=$c zvv)E&UzIO?rfgZbB@Hx+wBRX`PZN+-PA8q?G2%I2I-E?{ouqGakrq$f1k4by?R0HE zPA#MmCZK+lynAJWClEIi?FTzXsiZSjzF<2C?G>-5NJ%po#gU;ZuU8XDk8amC{QG|@ z(kQi%NCM+~HA)$gU}?#FMY40ww`@skNe^*#6j?XNzipJyuNoWRLPA!41Gg>5s}h>2_wVz_k4=bmS5(Se1Jf& zyVH}bZs>Hfv1n@}EzmDAEEU@dL+c;h7J2KY$cvPC$#5f+d(Oc~h8j6P{318Er#ZKS zGIy`O?ix1bVrMpW8hvVzJnFzJH)0U&v6vX>!SfSE)_EU@@s8(6#UueP3P(@|^g`-O zh!Lk~(O=1&-rWc|d#?dI;tI(-3P1Vgi~vESK9l$(3_ZJ`pJ4nrBzSPvd?^94Fh{;G zr)F!<#yh&Dz)YuzerZ$FMP-u%laLi{G$j>b2z!GBrWiUwx1?>vv52)n?wK5pfMlcn*_`!oR*l@9=X0_v*qWHcx3__vS%ehhqF=gf7eVz_&47^HnW(<&4Inj80$}AzF#=pGWbk#cY4ey80du=46;>H8c7)Hg zPfjn^t%Dfm!T&U~-<|-Hb5C6I@I@fO8_kPa_ne{58xi)be66D*gDS0eVi@pKg&r6z z1P6p~C-Z;zEd`j4@!busPUgxCBhCB%-fmfs#pA_CvVetn(AOKYSeZ|$>*|c28R#_D z8c@jt5PC{eegD;JL}SuEk1Ucx6oYK6V=ttqzfJotc&98F z6}(wt{>o=ME4jumZPvDaU&^VgihgT|rZAb6-)QY8%SBJ;!%ELh^02#ExU3yPF&q^y z(K?hV_uk-LQf`-?rK!#rExb26TlZ1?8GEd{N986~QoDTiwvL3UPOuz3qhA^CZ0Qdu z`1=wWm1EzVM!eMO;%fu}`gR8g^EOL=DBJVs(q7?;`XoY$kGh@UggVRzD(a}bvo_{# z8tKf|gUhLS?SU3+uujn6_TXk@N+1IT6a0_cqo+%U$>9TILyK3=I(U2&0%R&er*W|s zOGU6e@4GgH=WNb=w@qrc0+(9^u}8*uCV@m^v_T9=XBAZT^X;qwZ>k4(uvV)$9&6FyBw4EqR-KSlmeE`pf9Z z4@1yB_qt_YRGGVa;I6F;Di}KHH8Ede50lcPa~OX}TM5xT|Ke&!KYi3#g3 z+Z(9LSDg2B^#KUH;$9OFxfr4&;oo^$Rg&q5);aB3DFbmszcn)N?(v^y4LqB8Sy`H z>@s}`biA{HD3lw7Y#z&SJPeo}wS~T;6$dQ+H1Bks$C@o>kt1}Dwx~Q2oCG|#=WwaI z*z&RTV+eIvILbV62W6DOthv=m6T@Rz`O-wi@{gW~GnMI)nYSc+6m{^O zG{)Qx()Sx&@n!~jPHO8l*o|%U=@{Y zW+3Wl+l_s7CWiIeM)}?Ur|r<^QAl+KE*4cK%)J1(3KxC4F$NvU6SWc-nbEmjbjXt^^y z-vNHvtg(+m?yP4=99tk3Z8bW&yn=Km*17^dfMm>m>TBvA8vNHM;6KMgu2HFZ?SFZE z9f|YY{s*aUpX`PZAhxj}0hQjqjqe}1K41ZbWm1l9$X{uu|ji;}v=+reodKqKI$3H<_U2 z!0!0_8$1*eOvLsvD?tA|7Vi$;j=gow_VUc}`idZBCNtJqIQ*o{=giMa5+pmha6NO) zv|!87Pqv>?OySct77Tk-Uc~J5@cmXKEF%V`<4?(~PQNeI?VZSu!#3iKUuUL5BAHiu zZKtDin2_elU;$Sp{Cd8AbJXgZBa>yU&|`V2oM9t9Z8*C^*KqFLx)KdR$T-eN*PtV6+8oC-Y^8*3oH!j>j0^PeA2d*2-3o$%bkj?CY%L zd)wKic8V9D3jt690MEoOO*y!KF1S?XB6Of(r+Qoe0kjC1`}sD0z_P6 zuh(#~5_s1G@39Qd+l(bNs(;Dbi3@hwQxn~+`tdvkGuAX#x!~ktT8B!KY@LQDDv#V%swP zWCFVLMk`6DUm!Exgp1{De3B1|=HhKCmvYsbpYA#8xT9hn$)!tU6z)Wi_dN3F+OFWv zOKx8JD5+iDog~ZqZ9ugGQ?S$e21xr+N8NOJcesDf8d%gd|EeV_3*{)oOrACd097nF z35h2x0a=RL>n@GFd_|Z%W@+eis&xcJ!ejlP4=Is*MilG(ba&S;|D=gk>R`IUV9rnE z&fu6e74p5{88Qw8dov64c3okKlvs-)@8B>tTYH&b*JxK}${=nBoA=aP zvH~>dg9d+zJ6Ll&{e$BI?-C&d}i z!msZJ)~_OXL%&4A{@-_^35`s+VJ zS7c9KbRW)H-?<*d0gH)*kP$GhL*VI#DtLn%H~R>>crwnJgy<)RP0k*~RY`)Ty)U=%k}MJ7}@J<>2l2VR!38|N_( z*}%hqbY8?C3_3|c$NI5aTo;5kbfZShfLo))Dk zcE9!h!f$<~?^KM^T(rD^rJ}S;>BgS!^Z&%9(rI}m1R8``8(KS_NdlmEXYl0WF_0O` z23h$i+*SR~S78M`x8T8ZM!FkrvHO+}>Mi;MZItUd!`h?d*g4rlDv9Qsl-?)uXDes* zfuBlu@$26=h=w-64Pwu{?cGZVgwsF#Lt663vaKPv@x~3q*!7x2k0xP{&69-?HJgxy z73CbY)dO-SM0dyAnT=(R2h~)&! z`RySUhF_b+iFn{z_@HmA>=isD)=xcXX_TaTLc^Z}3wvSXXB{+xGiwcR>jl%uVe#Je zt#>nlxICkHq;X;d)&jgN4plt>*Lp(hzEoV*@Q6X6Q7{B5_{5|1xB<4aAbl&#GNxzL zaXV#Pm)P27Tyr|vPU(5)wac{b=m_G;6>%8J^Suz!Lek;p2MgKxI2+ajw;uWQvGT%x z+2wfoz2_~(xo-ZBmnWN@~+WXC=4S z5_W~7@?|f_nZ@QvHZ-qekh^g<9l9(w9gme&x|=2FkB)TjyA8T1qUSV7OA_jx&ao=P z!&bRZu#Q1!0VRbm%zJ^W{P-lcZ#9VH-J<*@`g1y1d4HLiIU*QvKW%m?Ci-w9#_0%k zWvbTL)~OaT_)-`7IFgDY&6~nH1Dd z$elQ5>q(!;Q5>WJoh?1`M5CRm?cYCTb|5!_qlcdpO=NkN3x0^t)Lf z>Kr4(8OTfiMM{Lx`H?t=#QX7R@FRC?H>-h} z2Z^Bt=9TY7%F>b=Pt_#F9zjpLVh^dEu=D=<2mtfUQoEQ4xQs&2%T!69O~R1pnyk80 z$Tku8`58ROMY7T%^eRxwG5V3R4;53(Kr|QuJy~kbTp`Om zxLL}HgtI1X7?q)fswo2SP71rt*{ILrIV=+v-0Z!aT)1n2&-P5!=PnjqwXHA8TS$S= zhv-^6*gt^6HhfxIF*1K|YG`GtIRwMpWi?W(ce)?&B3&?*^6c$&r>Y)qsy?dqOz~`H zV`7`#PFnG5=y((Oc68yY8YxHwBcvNQ-{97**2{fP=o(!9?Mc+w8S9`T-lkeXJTkFI z`M`(DOs{|sjqYSRd#B0q)=dfG%n{fz8Hh_50LzKH1ypEzEwTdznMd8Ky|RgPGRIlQ z#L~p;#LU^m2$)65MO)$m)m&ie>81E_dr4dMkP-S=b{RUdmF>u=ZN%O;?v@G zL6xVK1C(gyAwZ3fubprU!N)WCD8r>~4SX{-& zhz5$9jIN_y@i8oOOc*F|oft!sF5w9RDCb%Q40-+X9KiF_&&54i!`orp%&S7)igjHf=+*PbF6jlnr65>5p(Frtf?22(#|B7SAOWQ1 z1R!6MFXSNpdAjuo^-#O!_qM`zf&WF(LJN9A-Sm3=-I%K#+!E)_{gtx#tF(rWx7 zsMmfpsr|eW5F`Z2n#f1A5sIa90Ohb-lH?cv4vH~5&BD!q1%o5iq!QX3FH6}?jS(BFe<#9VzTZc z8>=AHQWYgF>$P&~0HXM68Q@aSQI+JvPs1uPNhh;o1EQ><2HBf7Uy{t?A_0CHro>oP zU!SU*7og2F1~M+hcOc{4Qm-a3B5Yr#=SSJ|lt5V{hdtZwB3CPTxG3>d6GM-m0~4*H zLRfFe&VWRg1pm^X0OV|6Icuz3zswq|Cm~+}(Rw0e%r@`UVebHFx89d?o12dCS?n}s zBm`yccB>*2*?~=h5KJsH4O{duFcF89F|SkDrG`{_{fpJ#^iG8z$rEhYs`GVCO2U19 zzSo-`Ne`vny!=RQXbkCeQFBZI@*6MGhu>miX!5=}O}*BruB#@o0BjsAAR3!%LukKn zbc}+xeWTb#P%O`{43S}+fk>OlkgLH zppf@;MC>$^vFSb|xd?2K^aM34jvk7(&KtA+jg53~&eyd@ID~(#PfEdt<(u((kba~f zLCX8(YD!Fqj?#ud|4B*6NC=IhCHk-&`a0dQX|YT~VMtx# zmQs}U@LE-&oU1jnBa#K4R1a;HzMg>ke07JxDoVe`OuDGAG66*l(dsB`n`%*6*+OAi zm-Fyiu+X{Cb!y6FYrKyhqmU4YVUn85JVUnZTaMCvq2g#G$CvB zfkYvcMbBsN4^gXpUImu5HyB^JZN06!YKPeDAger=97Q+|)jP+jaPEA=6W}|!E8|CW z{L%?}nW2Aex~cR;X%r%+6sC{Zz@#wYI20C~Y{)w>L4l{oGDu&AA(}RS(l=3kcQOzW z5pXGBiQN{u!VTE;tXQi&Mn@4xerUvn)JS}N<5A6;FCFYB9crnbBE4wQI?O6=4lDPY z2|Ch+;G+1UT*`ZejIQNQY#b9I1(XDhAW&88qGl6_8H@-lm;ov5ppT|Se#E#}biKg< zrbZ67X>3j4mElkrAa)$Ku-6kS*ut1(JQ&o`U6W#*&1)i$7!=N4M~>Uj2Fn>tj%Q%9 zT9wqED_Sksf{%E;*aC?$89x=O`JsnCUc4RLY0BlZ$QokwK1uY_MN_M6#xwx2ufTo8 z>FIwF>)vBa1#UD!{HFpwap`j;EQbufix-=EbiVCT%e1eh7N_P@Un_X;%N7msVvHfL1b7UW`8JN|AV5=ZEK}Odc=!u1cmh~Y*=3m^a;!| z+e5N%a6X>Kp?aWttKG}q$vFK8xVQ%DWXAYWDr2Z1Sk)v!!i+`nEiQT({Jtl&b>j7B zcp^nUIo60EGOaC^Wz*#+l^ws_4#)=!8GxKSagGR&GNV<8yp3Qo0M3c@68?8n^} zP$e?%?yJ@cU6*7OgV;&h(8*khn~ss7U;tk5a~gCLY5>5XSt9sbga8?9u4N$rg+O&j z>u186d&d4OnAUEWT(%2~^f~BP<17q`2t7h@{wC3=w=CB2^VUa5JX7b>8JmgdHq-(cyh*mzn9*F*Y$lg1e7{}ZcKw|4xM#=f_8^X+@(m`GviKp;4o(#7dy&Sf&TmpfWHcECgf zsAWhN{wla|FXH(^QS-+`3U5en*cg`y5jXU?wDGM?uAY>!v36EwFj2I-2S*c zrw(6cx>}8pkDJe!L_S58V;~XBE?L#TvnT}2_-cMykARY?lkVa$eHjn!u3Pf z!xaAG?$nC7EFF|CoIUx}>lW}?7VF8*Pnn4mp?~Jprx+6;^@lkSE)YR> z_l?@vrS*-^r-r=yK*kBJeQ5M$(?ybf!lIGM_+dfIvg|UZ!O_aTr@5P8B*UZ*sjpM3 zA3N4;xjH8)pRuwIe4boTT&Hzj6elWnO9N_*Fh~R`Zp(=|4AEPTSKf8&$}FQl5YhN< z4`N56hh1tnA|vBQwj;+WW_P)W$RPxXAJX1j5fCTKKmJ8fc0{v`X>>1GyKACoZv`2h zMBL)W5)*Tp5Ry>t(aQyeZ`N=_ZiyKc0C-*c7Sa~NV;wzJcShULGjvGHw<|&JBj`NX zS#_4YxYk2)X7!UgEKqQRavySV8bf*tl#&sTzxnPGG}4*87Q2)mdG(ewFRd2EMd zj<#t1({4pal=F{KVo#`1NVqk^6rxZf?C>-YPD`>YtBYCo5kxJ{!d`8iYY1gBliC^ERV<_||%0UyYGE)^&#(sX@sY8FWyjFXTG3b%j7b7GB`7Sw|b>49RGqt6^Emq9*eO;=6X z+OI(uet2Hwp9g3-59|bRpgV#v8-R0bMe1FUb_Y40C{F#Lwv1Erx4&aO*@m!;K^B0t z+%06rUF`%qaA09f5S&@RLE^eN zlNSrHe0!XbiyaCqmvDFONTU2nkjYuT)o8%I-JSt_)Mn)73h8!hV9nG6S*Jq@I0`QJ z34yA>MoG^(&z81y;_UnKR!@1!V<@z#mQVC|1h9eEH=0dtgJocNLjT>|hR14BXMwvD z07!tCGUvprr(+rTvwx7CyOfbAZ6pD;;rSExs69n2&M3;^LCHL3=!;|euKFlK`Jc$Qx9(rUu zEy2+zvbFDtxKUDyeXkNzBD>&+!h_Wokfl$?~G{Ace00!Vy*@{`?+bCn6)CZ3|^85cWKv- z_T{^5$r9Ey>D|{MQ^l(dC;c(DgwJjk$|2jSbplU@-ZQF5X>EGo1888dVpMnToL9IRG!vy#_HZnGW(cZUq{aRm*)6TxE$X@rd_A!a_1wXa?o z3E6$>;vO%6MP$K@ig6+R5YJpl-n~y`(7bw6th#!~I6nJ;qZoUzuqBrOTs$bmfTQia zjhtIfBrDlT(n~miOJtdlAWEDf_jdxv7=N`g%Jlhzpu*C?$M!bgmH5f=K!v41f?lBQ z7zqhq5GYo%d%f;9P2i#I!$21hlL6%?W6U6${(4A|9Y{Ydq3k22Y9`eY9Sh!(|HW8A zD$`WHbsHBOxKGtaCkbR%i1cn3?&(3i4kCil43Et!Q-UIyfSCEQVa#P*c;)0xTK4YlZiSiV zwz13$2>Fu{+GCk-!9VqO+Gc0Cg|X_|F+kqtz+=QbWeNk?b>=Hw<*#d^JE&g++pgeyjL@AIP&FuB(NEs zueH2jUicFIt!f`4TUP3sj@#{gL!PVdw%ECUD)M5jnLt=Z7_=`O&l^X=r`&Cc}~M{n;1 zt+xNAHu^^Q#fI#1s-2PupqeN%)c3lshYyFx>4fIdAd6kUBIs7a)cjpJrRQff)KIdT zKsV1};PHXKC^qE<)m;{c%m@fxkrz*!leW2=vU#+WI=p7m#`bK3KxqAJaHr-w$egQelSXxDl<^^iUNopEeLSM5X}4*lmK zVJ6Ge-O&d0&f-el)4j8wk2?T%bAjoaVAD$m!w$09$x}7^7n2LXWxeG?T_>Qpz-}Hhd8(>BvpdeH6kI>K-@lK z`(}?!?)7Bh{1>TVR57xy72}NidzZ~)ox9_k<3Kn+$D}~Y77Yf5Djwgc3izLN6(dv^ zV=V&l*S44B75wJivqY0qTG~%ngBnN~Muommt53a~R_dmsFo$zlzGhADU-R*P$v~e6oH7a{59(THsVXC}!@Wwn+5@e$)l074SenhTI3=H* zdS*{c2_+qW^5n$6up;aLfmax5S8Y|}L~p4AVsIpTQu!)zEs-c5fO=1^SkX(_uxRh0&S@c4oVR4Gmm24JC%?It*b;7sj44kPuiNtNJBRRD54Z3h!8 z-%94D@o^Nw##2@iNst`OX+E5-+``f!3Z%nb{}e1$l$bA*C3v9cf$DdGQ`vA^=HtR8 zcH6N-Y?v!6B$+(WP;D(5U1ggk)z|Xy1;z?0lDm@y>@))SOQ>Er2+ou>ZZ;FS7HETs z^grM$2&z2AK7_18Dx*OI!kTQh=xm>zjSsADdMYOf&Rrq(t4Zl^AmF_M+J6q^bZ@RW zMzSAPK)V+6e}$AaWjt69OMMGoE8-`o9C=WfcqK_Q>SHC3DM0SO{c#i5)-DBGPb>Mm zK5W_hIs|f~JotH=bJz(pHc$JqSLDSu`)zhZco`9LkPf_(0G<&(zEk=qCHX|AD%K8!2 zge^{fh{mSN$SU(6<(vaA`9)eB3dM_SKn1};C;B#&(b`*jTfxy_PMgxJ17vrz{Jd5q zMGTo3(m3JaCH9@AX_w*3gdk~USG#H8ATP`INi|=Gn^|QpVi9iB+ zK%E1NdGGJno+fPf4FkFns6W{}zkt^B8jI1Ee5=je7zil&LO*ZVW4viA?=7#*S}Z&gVD)DoG4WZ!I5p^t~fEl*+hn51b>-J zdd&oza&aA!-u6fedlyB2sI^fB_+aW3r0D@0iQj20=K0U}eYDwmdiZf;Uyv5dhnYP) zCsM8A(H_rAGQaD6#&p*bqUI;4ydEwGZ>@e?UEcSv{STa_h?`V0g8MNvOLT+3x-%@f zvQaaBZ5nc?C{s0X%jXM$tTJIP3SZuL5uexqD<& z9K^l3wQmEf^&oGfJ*Y1a&20x4On-vDV+1R^jQBle!E~swR@1sGrp+(WLO-Ss=w`Uq zHz4$^%m)q?Ls)j+wopUd;ZAIuuOGRsicj)^*rVfTcOLMg#=Ur3G-9;Vw?k+{;fd+h zoj7E#D_fPh$aJfeGi5#GI#OX8*#j4g$lyrUZ5NtR$t(SH~u~FcIn!n%lKd52P=M&Dt+(tyg}JFh{6BY z>->Mxy%-oc{-a4c{QoyepNRocCb^2cjLj9T&?Bnvp7)Oh;?soFXxtOJSOi;x3drxqt)*mlT%OU$$x7Fu1NKa*{37ONL643@Y*YA>00 zXPLjXSJc#vW*fwc{eBB?@91a-=$7cSB~5Yn7{-C>>PqGLmptLS*HW3(js@xR>2CV- z&`7A#aA`LG!X$EHj7Cacg8@~}W$jfL8IKlY8HB{mt1D%(Tww(XvN~0mBeCBPk@N>6gYMu5o}q8KKn72IVJj>5s5%F8*ganStAq;lkBLlQmn-s{U)hAwDO zh!Ml+GsA^0f?gpw0t(=^pXQ0+h!=5*NrdCwyYqdJ!WizNrJ+IoS_KIsSKaN5XwsdV z{j0GrgN6)IREb@bw3F3|RV~_E+))<=_N%{%@zI|8W?PY1A0;k~T#}V7c&@1?9EiIH zkn~9UU)1>R9L}De#x_OX@pqsK5W9 z(m?^!+^!ib!?wpT-fg5PA{d@E<4H$D%>s=#yh&TwL_H6!>}m1NaSmzVFP0CwE9Oj zO}Lt`M-{fR=12mrUaN?W@CM%Z7RSF?0|6(=G;G?QYy+t=({V=_ zK-=_JA%=wLPL6~x0aOf8I`%Et^b@B{9V3nSZB7BB7>tPpTJHn8DlB!y`BynH`l*UT zXY!Y)s{Jup)743Xc4%>su9Sp^3dv| z_nun-14{VOPk>dUQv2ydUtIVPAKcfUlPfVk)5PrN8E?XK?YU^=Kq`-{lx~E;d>sa6tc1^n&UJYs9{RABenu21+O;2!N}xE zO^~?OW?+A_L02a0kvt({ftzFNt5qsLE>=s`KRfiGB7D~f!9FF?GKqS+2YqED*^R)v&3l8qL65o_U%6u3)pqPKVNwy3KFsaCWDftKqs@zD4FG@*wytW znG@r@PB9g+Hzs)n+T!$H=0zy|&9XybjGBzo@3|#=$}6KeoCCkI-^t=!Q4tj*@s`w$2uJ`D=j;h3RyhY9#Bc>LWu8 z$6qT|dA@B)-?c4Uap1k9j>M??2aT2yGDzY%HUC7Ie!26w?^p{dT2m2#u*fzV@4S!& zzgH$?#g`jZax4+;V}RD#T(y9?WO-hNe0F|+qE=r(+r^u@vW@!;UhiQz$J+3$%V_fQn;GI8oTEWUN_36N<=E0lsEvaa}S=8lKA4DN$G4YL{g=4AOezIli3_pXtO2LtSbXVpd&3tF7 zU$82A3-rGl%S-b$YvbZ1f%WmL{KBwg9X7$pukS>jK4{jBZqyoP(LBgVq>RtkHY->} zHFltl>f}?!=no~&+t~b=+q3NQxj3Qs!FGszt7tfvSva}#FXiU-Ks%Qc1Qp%vo6c_Q zI<1QE`y@`{XzgmPgx%6Yii!r0`|yC98d7-!!;Bj8(!Xr8zmZSGpsXUqcUvY|tD1U67e?WjrPz?+C%SR*TWm#nxL$e~Y!oGu;s~E&2d* zTTDdK%d|8FH(eK*l*|W^r=pkzYCS%RE+qE+k_A9pf+*nPcK`$PLoHS7veU7}Gx$qt zMuwwIKWS%=N0qtQYSXZlKT*7;L8rqN#4_8P(pvgXcY;*)mxiJj5*!6 zGv$WT``(!B#Y%2X82(lhcgAW^l+y*-e^Y0DW^BV_0J>rmGC^}jWjiKq;kxAic|IJc zO(a->kBynqF8h!P@iD0;w7hQ=BO0C#EgUpXUKnpVjaWv!LUx)V9FJQbK7B?5Be~Xh zjxzc}F+mZ>!o5&$DLHspwYgo|;_dpIugsY3%npbzXg!9M&gd_m@Z!eVy-BKx!dyFm zi|&keC__m)A*4&KrW;2BH8Owk)XaiV-X(xWm|sW#O3(e?rg~{p2kHt zN}I>iKd#p-JGw(iJy;?-GEf1Afenw& z!tP1KS!4OEr>>4MQ_ALQDQ$&0cW&*`U3VYlR4FKizQj=l9d2IZ!&}plJeJ%R#uA6y z-J!;Y2QW7?chCFQZt%b=rfB<9k`VkS66^ClJ2s3c(uX`gj9H-WFGCk+)DK+Z%Y9@@ zX9Jo!Xy~2D{>JEVtnMd-e;)Mff4!CdCwuJ|Ql|fZZ>4H=&Bl!ugkO7Yj%b-de_s$$ zDi@n=rf5-|>>#nU1CASc24RGdB2g)ZCHu_wh88tX48!5D>0oFeI&#?HWy5xFx)f%| z=r+_=0`SK;v*iD5GWCLwKMOYszanRDipSZgRNJ78OlZaL6Os*DX#-7&6>$EDE&!i+dxm+%>B zIlFAmHbfNQtDh~E9)MJvVpEIDy@y$3cMn;SoR{NaJ_O55S0Q2Bl`HLqF<19yVc)?JA+28*0coLvVfg!q8Kr{Rfr-PH2_ z!y_;L0Unqbpwf`rV7W)$%l#W@RCva-+|!p3!25(F^|sOPQ>ja6X#tdZL1k(vRIW99 z2Q*l$wX#r(ai^M32edJ#$R?$#YdS;yJ>PO8>IyVQdvZQ;A-E1&Z`~y0oovU z2Wjj^#W#ji8>*A^j6)D0N1zPs`@nv6D-_PcMh}0&j5(Fqk3k@yD2(q>E>k8B-%%(x zw2h{qn5F50S|&48FH`PhE&7OYg}IJW&Y1Bqb<}SM@;^6gmGy9-`NWnoKA882h1c#F zi)}EnhcZFGBG<9-8>K`}d~gi%Au@^(Y|bEB1=%PZ=Zpv(T;;pUL|gX?Ox=$CjdMUS z_3QzyU zh2-ulrf&@s1lEMv1PBS)D0^W1!;~Gu&d}$idPjZ~t^?IpHU{LhnUYx{MW262Id^R7 zzy4td>7~~LZmT_ZsM_MaR_F?_v@)|%Uu}aA50E=nIXwM`_noA1(c!s=T&7Xt7wNSaWd-|_hG)tz1*e`XewXuH(-#Cig3CO`A;LVgR4 z^J!5!5vrO@nm+*5fsAJcFj6k29V^qmIpftGm`Q*Xxjl6Bl0Rxb_`^EXV{$SOG-YZz zk}#*F2fg>YCgn&SRUhH(2MxMy!FA6_`%X*Jy!{uENa5YnMZaow+hw6V>Ph*>`?N6D}W-I&~O)GF^3!4wI=}K3m5bx#4OgXsk|8- zRi6WEeleI}1$*i2Jc;(>UU?y?5oKrPpAyIjI+FVfwtBgORosG+NcEaUC;22_>YDc& z221=+F!;yfwD1f8p~kMr2SBL{g<7?7mh=#ZTw}3PP~`k#odt6dC(H?&bo~aQh5HTE z1|SRV3M$xXTgOwjdBaI1N!EK)QwfsxBqc5uliyMb5VaL?&#aS{{RXQQ)lSl zO3sa*si|PeOMVzMU$4j6wRg4bD^OTOxf^>{_=oAfbVo#C81{+yr;P;2@ATFsvm zGn+rUPxrVsw{qhq%-t6VU0J#LTfp^IaZk=A`D8+;1>JY8CAqs=MDGN!UUn!^3VIQ; zWB`8Lvgg3tK{6$9ni_^*|0H=;6u81~G3>Rqd`s+qFyR#atx82kgqtOpjS^pznCR%OQ zG5i03Q?+^?`_2&o#KZ!&<|SuMsZwM;%RG8HpSV}RS|Ik^zd?+ZDCjzeLkH~m=JC&? zFIP2LpP9GBp?EpyfIs&|XL^rRpE(J+wh3%E?gNf0M<}v3*GM{~S`8KCiJ1qvXPu5; z^y_zV;uMPgzMMuP@wr$(#IB#s*JpJ9BJ;uJ+e`400YgIiJnbLjRCULI6{ebNIFb!H3Ex8SM@Ms*I{8E&6>W2OdJY0 zUNGAr3>KewMR!1MmQ~V7d0d@EHBKUCYx!MBb@m6oj-(2Aw;ukKv;&C+KU!Oviw|z+v|Fw8& z?6n0pAF-4LjM6G-KIH43^{{WO&85Ut^Gxs@PA$}wbafT3Oh*H3?Io!FJNc9WO=$Vn zv)1VGz~**GB;-QNDLzg3+un(#a#7d%`Yzfr-n46 zKcN-4jc)-ZeRJtxVGMyxiT;NhNV+T!$+#I!1#wc>8qw0{YiUEW{zno^SjA~*HWJB7 zanm&kw=^E>Bi?U!WmEg8gYyJrKixCXA0X%>-T4IxD)V*JjfoHU4)dy48F5UfH9 zlew}6ni4I{yna*siUWc~nfv9&_KA|&-<@rraNxy5x>b_IDUFpWrkXms_&KCu;Vnsa z)W|!P?qLEo+qvBIShIoXeWSP$U~Y|ZJTad{O!RgkkquNO4(O0T)=%YrW%|Eu9*zij zuogHey*eE`ORBt&v8BF+!6&WFAXNPj{R{4@@>#tOjL%bywat=h!cGZj>2Zu?9Lmhp zZx;`lYI5kZ8X#D*Ic4Jr-qBYKvZHS*JK?$IZJzSyD&$F}8+l+UTZ`5F??fVJmN*yl zQ8M&aS27_o_1%ZO=!Ii+#5|MX|I%9PivGVbG^O zL;){0Rjr}V>fJQ?jnEI9ry+p|>Ue0JU9KYZhQJdWE%0u}qL$hcbNN*a4%%=t;2hq{ zZ8rJO1gTC^<2|@_`yh2C+J$Wd_y8FwjSToy;NiFv_n9rjJ@twNW2>ai)k~nX40K}~ zw0{H~Wu?Rj^zpWeCJrKSB;%!jFmp<}0~lDpApN>AN*u^)I#EJMMvH>K2AfyF?P`vq zf6!#;{)lA|qh*oDcfn^)?UpMC#1*zq>9TgTYJDuBn~|dIX5CH4=&y5eeTdM-FwJ!s zn-D5?bz+CDZO1?N*L7~N+&1LQu198FnvtEuh%^?k*_I~sy*z|$^9MCN`bj`Q0#{z# z2J$DB!I*A8uNeo0E~>dd;)Dy~q(|`R0vW?l8;E8(yRk95R82eSXUOvWUXr#vaUp;1 zp%Q)zwu_f2elZEM7qPvrr$uOMNx;~jrzv39>4JeoP?~!lbFMKg)QuG| zR@8g^&IE$l+?!B*L`ZXx9P5ln&y;V2>KIK2>FisK=5$6w{S-tWgo}|bc>!~_=$z_s zf0pq_jwVF&?_hSuS)hm0h^fF z+5dyTo}(%40FXfYhfYM|SC-&9z8u>A+l-)shVZMZgN=V4%?>q%3r2dx@#Eyfe6JE2 zA5B{-!6EO)_lEf$WsfREkSh`FyHwdJz~E+Y$K>&VqqBDaSwT6~oNGfsOiMhyFuKCB z>w{H8&Gvia8wFV=J{iq*daUR#ZC1=S#)cU)iENB2L&e4M0Bwe7tEr^4%d zs6vudw{zgua(cUiYcK76tL#QC^}`UwfJpdj{Er<7O;Xd#Xf0YeOsDmjfiB*J+`uGe zCj-&*#;{;}t|x-Dt|I}G-rbGs-Jakqg_LKb-;N|;r@q!9tIYb;1BP`xK= zhOER~qsv(tC9OK*dy%#}<5rcPBA?&x=(X&nGR?!CjP177;>t>0(L`_iJ|PwLj!w{; zIw|u2pGvK<+nLnVZX0?xeB9{jy>;JC4%$APXA2iuOG>sd4ed%u2^1)&tVdGuhQY|| zWV%Ro&>CcMf_5zVo28RCFJ=x=@{2NdT`=d?sDo2(>25!Z0W79y<%G2R zCB4TVs%uy!;Y{nQk=%KzfQ-wC5!_@l(`=(+)8m%iZVtR4qEAi@8v^G@m38llj|1zc zf=e2ICN_rqF9I4u$1v4s7Hn6@N?j2@+9wsqs1L)03j!hJeJ!CqaFjvfGre_JPj$$s zig?3I5g@Xm3t%ZB+JVK(i2gf!F)HNJjnb2?s_P2ttws0#668=~l?-Y-GuOHkg^BOe z+|QYY1xZ;G^8CB%2R<;)uwaurCP!~`YUl5C_NuMwd=pquo3pQ9RWj|&V6lE3z!`P2TR_X}0ZOzt}-P!Dbj#f%e3r5qB zMdZi&rX!9f{M)1+5v0IQAJrsAr>p#N9vo(qdMX4*zIU;QQa9#x($EW`Y9J0G4Pa@P z!TqbGIf&HE)=y`ei@}dSJ@a^7nX|^TC^>v-0w$74ufOXc=QF z_6$9azRngBZo)3&3heZ8W-qySCnqUWdSSE`x-V@(?dUe>q5q&NiVzE;pj;!K!YsKS za7MuPW`8bW=C5g3kYh)%Y%4C(()x2_Q}R-;G<)Y{C3s=RPS+cMW$1g3YBE!(dT?l+Eahpd!9rsF-E%Tz63~@!XNzxap#S&!1t`0kt3SERoL#)wgtLv zciaIonDP6^IfG;s+5xMGM=D3v!$(V=AkPCjdsu}4#{()G%Etp`VFqdG$jM|vAikb{ zNr2y)Ms)f5T*oDUP)Fz_y@>FRy=Y2dz8JXgA?1_++n19gHX4PJP1(D_9LqXDvB|BY zYp741Frs&X&$vxyfI+8=0oq9AKk2_?W)=2@mxD_=xpjmG0~RXp1*1(5KFhDiu{K0? zhPL>jG)fte9A&co)Od-(mVIr%j#eZt)3auJ2>Q~_b5`m-z z#^NN@7bPEs4}6zNU->w`!DPqpdReZ;@faOs%OqxL+Vd4PGF%?foejO61Dv+qe1lT& zQxg7HdHJ7UIm}F)|MBseq9Ges{O?dY(R3`f|Hdi9g?1ck zXU(|GQ+xxC@m}L&L+n@cRexHJ+J6be0Q0jX#{Nv)XB%Afxb zZ~(W1nRKGf++X|B_3JLLT6_-RIw3D2M390~_H)*#auWFT`s_t&9%Qcro|)p*4OJzB z8gQH1EggYJ-#b!t5lU?C{^in2K+G3&-f#MbgSI0WQNw8$L~RC65exyvKKJD*lbErS zeIUUB{!2V&3p9AGxcWL^?rZ64paF)JnA6evy)Y@-SmX%b#ohWmnP08>^1aWs9mGkc zAD4@q9Irto2FZ77QZV^y`62(MJ3r7+`z{9eeJ-iDlWd9=1guurHN^+g6ZbMr8C}1nFrOtH&V_swe$DAtEH!BmO?G(V)qFyFaU)n7BXurYI_E1s2ZIb$mI!p zo|teFy9<_<%syYYNJ8)rYjmpO*PFRpx5Z=Aqep!EA_cgoQvwd^D5{JU2fgUGNuybX z$TujV{c2q4fXHOpN^*v5x@JN;1!Tk+;Xf#|VPFlvT<@J%Aq$&mmL% zRyJqo6$N0$AaJH&;LX2D-!G)yQBMvsxRzQh}9&ofq%~8#76=jJ2eJ5mo46ix4+{p+nl6Bnwo*zwOSRpz*PIeH07shr*hL%j@4tHl=>m7n9!oGK0e{;0s|2BD8 z|2G;37u$dM#{Xfu60;z$GhpEkILBr?6JWT#8r z)i4BtV7t{*Tg*VW(qx$3DW2&xI_TD0d-X6tb!Q91=LNB;xCxK5kvumcGjhet9}Tno zCq0M1^pQ}eM;O>?HhLIcg^L&UbieXY*JLU(xjsn?3zv*4ssQ#jsTIld$(~^!rC0-n zVA3TxAJkDYU9M=9$|5;W4NkajTNrx4ueiKG_CD97Y>dh7(1EPdRy(H}oOzMw9Njx2 z)>i^k-aE-;$}DNvOQ1WB(4lZP0{2>KHr3weD5lCHrkOl#wW*y;xp+olHgUBG1R5W+ z6%Un`ZHp=}hxeW<;RRJ>K%@t%FaGYG6^$&LOEU}?Hq=sygWQhk?UF2)~bU+sMe^uE8WbM$v@Bgu%K2mybJpWKY2;kH75u48GgA$q9o`XmB z;IEaCDc^4@r`33^rThCCxCV65Dj#tapG1&FWahh9bvbsr(VJBB$ob;SV6vEiINp_X zI|Rh&b6f^F(MT{s=rQFhohJc*EFJfUp~Z|ihQ!A8SQW?dHQ0(Q%BOmaP@0w!oFU35 z4zJDOx0DEbUhXv`IIBT6!HtM&`rRC0;0_W@3~E8v93?OmI~T)p-0Hc9IfzEe=hQq@ zKfQ7xAe66GnPH6$K<0G8Pa2!pT~47-qZ9RB($`h-1^KWniQhP$&!MpC{Be%f!)3u6 z!XevCVZs?&@}B3`Fw%Kh`JgZ?Dsv@Ul6+9Gsa~12Jx!aYm?x;(C|`Es1X^j!fHo-f zgq7&KzSG3djGOLeGqD?lACL~*il;4SW2LBz1c(;VvqXQV2sEYDy_DvGP;! zxwYPyd)B^extf{v>1RQ0;<~95#2l1qBD;S1qwb)#>z?&t-R;Dnqw)3AO<0S4cMLZtq3_izbOGB?((y4y84(ZaR(@EEiFHQX`Ioq1yky(Nl_1?OjvJsu2i38X zLn(luaUxbM5B7jdX_qQf8>EyX|LhKjh%YQlK#m}#$%JX#4)qnh| zaBNU_<2=cbBunt+NA?f*ZM}~kUaGsaPIF|R(kZVw$F{FL|D{A_h|PjW-sqTEfjLz#3@&Rpjjxx)1L&nEF^wu;^A*|qa?SJFS013>Z+VJLHFJDf@2%*J= z-_x%_45j}q+KW?z9vl^nU2`N<#Rjq*))L9W*g7q9mA{%_%vf`5K2vQSl-?K|F7-qK z)gtju0mreeM`*O>XrQ004d{Kzfh(ms`c>l@U?X;0y3nD20MU5UUr_7)JPqE@SoLN} z!e>!Yoa?1{Oh;~h?#`Bbr8G~%9f=hbMB0YtTLI{%ehyb6+yUJ>ezUbx#yxXn`5pa$ zbZUwUTgq_5$#wPq)%tE&eY{2P6Z$BxDcQx1g#aEGT`VfuW`Iz07VH>;+R<|ldqupV zyAt!!42fyt=u+<7MSlxD8R9vCw~VrekVRT6>nlPWf)ye+Myd@_p5Sj{hY z`_=FZZ6wGmy#a`9pVDAS!YnIhWY;?5U01ul>Z+L{|KakvAeuj% z=QlX8AOxSF@>N7ga`9!BIIHkYjG%U=AT<;^cwIqF(IGWPH^Dz7W5xO?9|(8qgw`ZO z0US}8(|g{$H-?$?JM@hK@Y{eTP)TxbK{YNZ3`-AG=5Wr7AZUzVlOsiWPl!n`q#Qrk zTK~yhxy`BM)9@xi+&LlyqJ`+la+=)(p#w&r?+d5vg#g5VmEZpfAi~1Q#`6DrOGbXl zCjHB%|6BY|sY>MN?jU-~W+)UmQbb$%I02Bc!`KZPg{F!3mzQ;locbixN`KpFq~C<& z!T$KYtisdx{uAFYLDvH8&l$`M{>?A^Z+^z_`})^CP`&wVG*4knL`7I@jN~Md^pTGCE%7?MdqKM+&Z-An7D^;NGWLEMkzxu(PJtBIDOphyqrRe? zt{cK$NZ#sF$U~zv3#FP6f{RAe&-SnBbkiaHc%K(bJ>#1ae4{ol_K|Q_eyt${q!dqq zenSp6q}57x&>Y&6KbV;jmX?e_Ckg*zuat~5TQBA?iul(eD{bLxV6#rS={+xxCfuvM=)81Z^E+L)R(*c$P4K@KStEW+ zU*ujQ+NBti6@jmXQyca}r?^fl37D13I+KORvtTVyvxto}?xgnM{=v)m)!Ug>4;6Y4!&THmc;_xP&!YV1#!p8 zK%U%{gDXaRxP865p1pOHiRDW>Ddn3NEEiqEG1=dm)v1$qRk{&BM>__xoM`!nPY44g zHVo26B-1l&brTy?KW?S4vUON%qa$ql&9IqqfyiKMERIQ?k@khc=f&0XW#!VTVN@@v zbP!BRecs7Bcg!l{|?W3&n=>f_^~eQ7(UNB)JUlKQL113;LG@(lkj=AYoIMF zJ(#z83Y0>uBTHwyS*)~|k&8|gMT^|%nc4LTAc6$X98l>^S9`A_o{le`8KuZgdiBqd zd`W1`YREIwF|IQr?_Snb_E}fwr7|_-{n8Ii=+TQPs~TSw@)Q!n(CS9-ZO$H*iTnHc zy(C-%CTAoJk%dm0gmlV}`3!g%0`ZyJnBcY=N}i)EmcKQt5gTzgmDn4}FPH@2+J)`d zM@RanKdTxxvPqbzp_o@Z?Fw?@VFa%do2Nh;e>v$`gD6R+x7Ovgt%y6?K_ef!C~yzz z0~?L=0NH!aivJGd`z?}4atKb{o*p+Ya`GZ}2of!HYw4fCv>}4AiGz<{2cN%POAFAH zbo9SPKp?Z^2_?miLYXs)()q3A9eiWA5ZhOSg!bq47Gtn@bsoozbOq_v0Cdt+H5s}+ zkhNvkG_b5BW8${8cc{8L6Je}xp5zP~9;ZvG=Q$AU*vlM2e&P;TkTeJsJ z)tf{K5bT}#rcKb2nzG_YBm!kJ=1MH%xzU3(wwN7ScOFuANHM0_?93L~UlnAa3u2JG zB8Z#n>$TRo1(DLUvNnGFR_Ne_j3@HdRit9+DD-_M>PQ+}d<;1SYHQk0yt|pDn`R0*)$#cftj_eqCT4%RJ3zqlB_(3OlpGqEupm&{pE&rl_v~;a zq`m)~#Qr7JlO5bB{OEn6R>BNaT?p-~3ehQ_A$5#fgC%E|AZ2S?22bru#^{p)(B-9dMKp z@TK?C$xr|?m!WPT)oBM_J8e&m2f8MTkj_(EuwM37!cr$xd6K7CDWu_-096(j5$a(R z(Ov4}X69c@O6LYOp!|hJt-_qqkS4CVqn*z4Qc_i|0pLcH08~u|2QmiHXsA3qzG|CV z8ZlPKhBcrX9vzQC0Y(5!QE6AkpDhU#j2YkB!sEx@ZICDdU5_&b2xXaEPf>O*-Z#L| z{sl-Px=(Ak!O!8kIV?aBomuntcUk-rB7zhmo;{oBwBl}b8dyi956KJhv-C=g!R zC))J&>^beyYT4_l^jtq*IOtY8cqRVzQOus`Q3-f>y2{$y0lsvuIv1vMNbfpW#n&tx!@ZC>e9t!wNg2>Nw1u^X z-NHw+7+T3$XStMb5DY?m z{ydnNUTt=rzZ}%+uYO%GZ^hxdS@Ne+P)gXK>}b@!SxngY`t!5t6dh=G)q35D(==H? zJ#RQ%-GM}Nd?W3m{qi_PmTL!9|15NQ5d~P>k%i3UA~I8X!S~eN%q&wCh4K>&A;Y&1 z^p|5vfJiQBp8$s^>PmTaKmUBz zX3aR{L4ICN@(!tIBsUr&&RL-Cv68r{parswz_Rx5cGpcu%OUQhx>jaQI#%%+!YFD- z%e%4dvfl}5?GTI~1=^2gGJ^g%NZ={$Y8YqZ^1bxmCdN%j+8h>;x$rJLX_}bd`BTZu zDcbjOIMQx~+yppeBho{pW`2#B1_Uwq_$~xs z{alBLYMrP>`@P&ZRBp!k`)#;|y-s0r|4gO1j-mA5m*=+;j_9)bOoM|E@S+`)rL^Iw=(!PchPjm zsC*$Ur&uPtMOp~0q^@h6CD5jTKiwO-~Wxw#LWF4WTqMItvCP& zihp09NE`=J((o#%uRF zP5p>`&u=iEL~C~bPRT! zra_MzcM@Wp`DZfL@JecaqVcFUTj^{zdc#`^i(k!6(yW{hbs`r+O-z{_&DjaD_pZ)+ z@3fPs7-?MMw2I2*jx>zC5cBHdFb3}&AU=aEJH-k){}Ya>iPR9u&F=X5-LPFqDL_K+Qkp>ueSMmo9^v&nQdINBh=f$~-uX}W zs$86Axi68|5BylF`BlQGs5hKdi9g&Jp5X5itTc@1;&dkCN|>V8U`#dfwB-<^?e~Qy zj*UPF#UP1hma6ZDb0>2n49mYE9+aJ|udw3%PMS~XGZZ`{sI7+m?S6>&?do3eKE9Go zVJ6;Os^jAo?SH0h^zWH{Q0*HGXR9(~^xdJ&(joYBzZ9f}@Ar$V5UeytB=0{@@u1GJ zt_-1{kPQqRhOPNXDyp+?h;#NLP;;m!_BI#&B)zXq#^p}pS8hYf*-gSGhjh_x0E8rcG}xq20z55glch+Tk7Tphf_vK#r0&)!M*p8)4*r&8Jr_DTql_ zX@7+{#g2gyOR71wOC8|q~I1G@piz}_F0T$u^0U3cs6=+7w;BHoa; zxx<3!>4madXvf5Rvr}|e$&U0Bzk;By+5>NCf+!KadMN0oxpN~p|KP1F{Sd-Oinl+T zW)ge6idEY@4d-#~kH*H7!8weizn`wo7uv^V`|^a8V0AHc%QZ%;t8j3by$b(U2_dI3 z>A5=|xmSw>x*N%ELITAcQq6EaqzC>FOih;WYAku^L<&|iDS=D3%{WoeQkgmCd|W2;?zBQs^U#%+ z&>;e7Y7Vx0_bi&T)#9=+VPK3uEbq3)M@?&&d>$mD_ zr+z_LGDn!w@Y|sb{qk(NwODynCInGMiKjHln-yD5O(}5+h*ajg*QJu>xl-^I&UxLK z``?`TydqxVG^+U!JHfvhOtHSyzR`Z#1Xsa2JBq+5gv}bq-!qy_tT0M-Iu*{MXvOT?%_}Uc`Q%DU6<#dIk?M}vFpEZfHOnC~xizFhQ z=(-XUZY{-;*$@-!(t0OYSX3JeMF*Jf7vyc*BUoqMW8aIueQFDUcsQ?{-phh|sAww{ z`ovzt74TM?2)?9Ic1F8wa32n4C>uaD494jk)nU6_9B-L7wQMJ2hhHT7o~P_y$)!lSRfU&=xycB=8<5q)hm+=$#Bx5 z)TsokG%0cbUA7s<32*@KNxptr88}=BaBS{+oC6&XvQE$0-;3p!OellLmwo0#2lsGG z{yEDJd2#z`$5z~=yO>46!B>_3?4Ku-M#7pNU3YDgjl#J{e0=&O&NS6 zE^9Mj{I}JH?SJDjad7>|!`_j$Y|_7fwg3Ck7gL}5y^XkoN2x%bBC4_t*nlK!prt{f z3T%=25#UEe8V@4tvaP97ae@mh=sLMrT|GG52`0n(CXFb(g`|vv|9pr4_LuSNRn+ex zg&r6;6ixgX3qB2IGHqA5PD4BcsQ21MZPEQBF(r5Bnq@yc`gYOY%d>v`{*nC0VoH>b zH(#|;*j&`SsYeeIu0+ptt75T_r`W9VH9#ZMynCGKtT5<9*oi1$=9&l(M9lawL{E*r z{KsO#X%^I++6SfRrb%VC(j}pj*3uabwi>pgyfo4~nTqo;EJQxz@TV~*2@%F?x*d6G zbD*Nra>q;(<4O$OoTh`-Y1=K>o@J^0TX?@VA$>_E9-Q#Q>yBLpLtQ}p7n>yTH`0q) z*Q6I2Yn726mk@RySh8X0?iVaEj;uEc+TTes>=dZTI6W!oLaA96Vylhju12p(98CpV zdZe?V579-8y)l5>HXC7%X*rmhP%X4U>LsiJ-}eT3l(Dv2)S&-^#d@vqHtGyu|2D!eBTIve9(+bpyr7)mKX4Z1czv&2&^OhO{E2!-|`+K>W?0{{F&y(3*1 zqPp5A6J&5Izp}b@uBOj-a~aoP^XAj7j}|aUe`xi!`AiGoSb)sq)(G|ft{cW)()Oces&~ituvcqF*N)S~{N(5d(`TduOx-a1G zEiSs%xKqjdareYe121Ev(zh-_2#F;iO2wee*QrTbw9o#k_K71;`eknj5pv6?yMSJx*mERs{ZVSmsKdeB#+f zL%xB}U?hbAp%`3`J7!XZEULT5IfSeZU#+@>9xV|o{*o@#$N~Sy(`(j96K?8+QRnF! zYBo>Mrpfr7zPmHKkwHF`;}<>qq>(}rL!ydLb^$sgqN7k>^P)t}wemmdy9jH(9s1t1 z$M(b2-77Ue4MCr4LihyQY{0mG_QY`B$WgP;ho&g2*o$nv=ue&ocy(;n;`!uHV4Cy& zbX~tWt^fYiBa$dIg`j#0=#ZVC2;zRr)|qU-dH%{H34dJQ{`h;&3-9`JDU#1hcI(tX zO{RKwbMi7}*F%C?6(b(6AC_MQ4O3cUB+ms&klz1WkiYKyq$OldVbkxsGB=Xvp zLjIS)`;O{>6d1~{=d5>_Wj%pmB-UGbN+0_kRZyFZ^p_B3&{4S3u<=|DeM86%OtQq& zxl~aBo#IZsSpW%NMP~&lDgBt-KTk!ZvHB%t;Gq`UTnibyLKE%OB{w2-`POtcegkw6 zM$M~c>{{EqCTKf9#E>D$qpc$0dal`0Vjg#Y2-L!G_tF~W+i(KcE!?2JCfpESHRZ0QFu-hzb5?E^PXUFGgw10_FNT(Gb4VroV11?|rK&c?M9*b%CGTPE@UW7**5z_Y zqss`834kE9v80S1;!KMPd6RpgjOZo(^2+=CTJ+C}C_ntK%J#pZiCDS*BMyC~sr`Q~ z^8ez{NcUveI0*1|OF{96!rR;$$Y;O9ubD{NQYpFDGjO82My zN~(g*oGi)(e5E1G!G0rFFN}jn;L*~+)uGn>5u?~YFw+tAKAxTE7$*~98=^ir?vDZN zTah!NPD}4-!ul$dmp_t-$rq;=FI~}#4ztMpKIX`-i4=qgVLL}rx^-_~8sCgG`a)>Y zD~ehkSv3rZ9=_QB71pjIe0wY9e$kIOZ7EiA#Ec#oHV^m5Vz_2{me4KoxayddvQL< zY*L`xJaM7w{xRayw;z8tX$6CeDs95AOQFYy8bqODj$BSW6Y)SMmJCBDj#FR-XsK-` z)}x#1gL?z_V%@ZM(f$>yE=4R>G3c2(AQ~xd9b~h}MLgmhFHBIHj)R68M@Wl8!2u;w1+D!rc#XNz;V&JAwbVu#l59XELBX z4~bCZE#h0ZEls|I0L9%ISCGlXH$F9>fi#@G^CGJfo_h9=r9h$Q>LZU>v=h`vgHN*N zKsx2e#|}k8(Ml}6%sf4Hsp>6u2`U+o20SVYlaWq(F`7cG*(L5&(Y3v+i%#ptpLc|& zLli}g4w_WEHM)LLGu+J5MOBZejQ`?qpfH(Clh1gs2 zwkj{HdViFhDx$Z+r*`$q6n3YVTR5mz)AWVw9A^`{G{t^VE9f{wW{6!vY^lsXr+Y`g zCjkvtMHvjJ{aN+ywDACA()6G4Zb$%$VOf^CHoC0Z3ZQt3#S-?fP>w&99!J#!poA0* zcH$-enlCg~A2G_z?TS|K=m_Y7;DkfuC^Uu!6{6kRBzHzQtBQGM}`$s#LS0b zPwBV{!5q=0mwVmf6I_nu*~9VZ;BYE8D6_^_@V^G(eqH7Z+Z302D3A{^iK6?)HHckv zrj8>L%I1q($oyXU*dI+C8WjH)OyuK8yacK@Xl*kIoOOPgvR9Q4#c8CFt;xChShl-F ztIwkNGq+lI4@};HXa)ILRm(Hl#u-0cd+BF$aUp|gw{sfetCL#Q=t3k4d1B9zEW5Ry zb8_oaGWFNyy!Ti1PV6XTb5xXPL9iTLh?U4O-quP5s8I5)_Rc}^Ic>ctuM7zDaXX~Z zx(}}x;NsYR1qm3&lu6@#WBUwa8NTwoLC4eCtBC$jRjF3Z{ynJ zM%9RMRg)vkn1RQ}VpkPUu34BRr~KIV;`DC`u^dY(6+#$^mY<;5x$n73O4>n9G<^NP zJ0vd28rDOw-zKNKT_Lxd7r zd2bFTgoNi+)577~QlQgCL7&Cz}S$F^hyUFzE^rvY9P=VyVg@1^4zOmSJdIPKI(BBNvFM+3wWv zhQLA+%sn}LPN1+l$VKn1TMc`Yzv)6Ehegc;-fQj@?RZJEFvB73x}d_p8!^R2$Dt&} z8nuz?nx6-}x8b(XIGlKFv(la8$E@ai9Maw)P`A&`AYU6zC+QSnGGBHSkk`v7bm z5iFkdBOb4^#0UBZCsUWZw5l>C%K-S1;if5*1C=h)?O*&n!*EM%I04lZM<8U+|h~)>ro}F`dV5p3NGMjY~T>YV*vS{^GPr#=*>*__*>XlxWkOv9NWJd5fg^D5Kq;$1SerMISFu`J%9wilC}cYS9w4ljh-| zqD1OT>zl&-vZ7m3XTecN_#+MBPEd(pguL6#5>tzoefA!H# zVwg>AQT{#$qNq>NdGfKI)!Zqjt3lGw6kxq7k0s*Fvc)Q#!b35v)}Fb(?Cpy8F8 zmKCoI@XO$lS}xPEGW-JTVNuWWAzGjULW zjUg`5Kb&dtNRSWK9CO%ks#1bGUs{H54-MCA-$eucaC9FfV|NQ|nI~#c@2u*>3XTGK zyZ7VBA9Bg^00f*fW!95c_~}ni1nmJ=GhG?chVJ$(K9e$?ce5uC(05h=%Zyt3Z)UF;$Xh?a?#28JIp^Y-7KW+ zJ#J0ZsTG05?yqVG>uPMyC=nk9#u6HNU2H+A1pb!$SPN&EY4a6!e`I)tvG^ zQn@vf7*&yulhIy}U5lU9OIPpIEKty$@t_3e$@JAz(G@`b)^>7PalBFr?|saJxTYD1 zFtFS3p-dU{&)U=mbQjA}@uur@i~V7*kLqOJ04F{lR}StH$r6H4~id zE^SL9nHA-uCh`5ABzaO~o?acYCpDmiYC!Ic=O@*!HNFm=QR%*O$@Xb(G z$*@sYg1rm$8}v22qlDZM@rjv zG~eFbKXa6~7Q(G~5;u2;?3@f7TE*2+*!+KT}3{0%bIp!8eB{ z%dWYlGl1OJ*>09+Y^kk!pKobW*N-yG(xecxP+zt0T9FEkVK&Z=^;vks#>3g5Ge16@ zf)%I^0+MuwR}56av*Kp87(pse8HYtG*ckNCe0Z38Ks0wSl@6J)N{9P;dkd1~AEhB7 zO3G2%0<^34+zJ9G>FVe7!Eb+Z2(AhbEnGj2r;F(bY+-%Z#YmT~1?Fw1bKV?}J&me9 zQ7D3f2!M<5F%!i#lqkxZjg(XUc$@03(D|@XNq1#AQQ2jX29t=CTbau?q?i(M$Ba(@ zq_^o&7+ij2Eysv1Zn|pw{_71KWZR_ZTToHMTv416u6zOsvUZxjk2FLRZ?HP(r)7=x zHF8&pqM$Nvzj>*#U9aa32!nc-<77z%)gjx=p4fs2J~qkcs=@UWrgfJp!gI=f{EKr% z{3v+PD9a=NNAArP9xDWz6_CIhipCmDY7CCdLDw&@%kM_ zTO(qlb%w~RYovA;+FH~3t=G|Ds|O8lKa5l@5zadE;RT4H3K5~Ay%$V*Rd=K( zOnFzg+?AoElZHuXRsC@DEehq0^j$|abH3O^a(q)COhn%@j5HZ*`s~-?%X}Sdhdi#! z@lEAJDPS5L>;Hd@y<>MK;Igh8JL%ZAZQHhO+qT_FCvR-CW7|o`wr%TV?K8&NXN@sG z%s=r|)l+v}SL4tSrKxEuXj&a%G!VY6(%lR72yomA?Tg0vixzg5N(h z`G4R>1-QAgjv!ur$kt(Z)s|^)HJ;WmG=7M78tHK?F}Hby>+LAhh>Dc1+;Qykkn^g+ za#;4{V8yIvzsQ7LoE*!^K^JRd&AD2(596}Z54Rtk@|5G}_{*2IW?O^$6S;3Gvs@Rz zQ3SKJ#;hA-$&!!;36X4j+nIGj|MV|V%htB3f7C8}vLi$~f+wcc?B;-jZdr|WGa1f8u;vVpkjkeM8G868+ z%-SWQj!Dwq}h3- zW|UDkW4kaRM9^|o;fF9O=k37IZvt}4z$TNq6SY00$F+mp=h5mMG#)BZCVz9;<0pkU z!yY0P3dDBgv4)aRs*SGV0lbH&p;529aX#3{uCashP!pYw#K40h7oA+WK0UtA91WJq zqW`I8u>E&n7`FdytC;$~cmYp%q-X}VJSI(a7! z+q+^72ea|ZkIbY&Sg$8HH~YID-2(@5!pLv}q)9*G#D@nU0R{f)Sfizx5Pq@!Jtc?@AC{p=_)X*aB)SM2YYD? zZxH#b4`)jBSPz?j{%Y=+JBNmA>ivGzJ)QI+&^9i!P|uSvg3PIw)iEr!Kg!Tm6cezP zth1?kYHJK5cyhOfep|L%pUJ^t5|bi}f?eA!YwF^14w1v~3u!(c;itqZN3$LXLtv5C z8!X;=!M79ENE2XlHk!6P_0;}5{ zNO5CU&>x-#3A(=g3c)*Ekdpz`Z;Y*QtzTgy(Ig={#%1?};xbLJ!qs<6u`@A*j%PjG z&2EU>`z3-!t3K2oXAVRbS;h}aFHg>m776Q*cyvpOA$jggutS+W$((Z=dmu@P%)FH{ zvDjhUs0VPD^x&4liU<3hlGP)(owg~W?jZNOT6*PNRuMr#hX?UAW!knmqxknz)V(Cs z%MSYhCUHN(=!DtopD;eNugeMVWjl}T#*w}`oXn=xKNS=0&+Cly&m9$X*G6&n$?F+2 zCUi&>tER|Mf2nx(Cw*s*nF&jB?=LQqS3#g$(VmE1nfM~IF(t8f?-s@y zd^DS$Xs^{vnD?D3vq^%pP3{G3fZ%k@vHLSL?a2f~3o1Sd7hxUmwFWfwsRkBR9O6%d z!QqN#d(Oz3kxMq*P8z@2nI8OI9%@Z_CmMk~-c5BO z5mW*bPxaXY^x0k&eZ+U7DJ{sPeH4*@hqAANVv~353nPHi%Ny@h3KMQ(1Z!vVQFj8V zh6k$vGib?xgo{BSq{PfW+9s!@ZsvCVnYPGiVG9DDG(aVQvy02Lb$y1U1xnSR0dzc$ z4HT87&L)^20&|+VS^os|Yr(_FW9GOS{Kry(H|&CQfN8Q9yD;5KCc#g4PRPZgc`Rv( zPmeTRMh-c4`fHcT2vt8L6&|HxxY14Lmn=;@%cY2F5!cw6$f}x*NntoK{{8SsdwVQb zisTr7h<+P$R~_xUBC7{Rx5^6oGx?E@QW?#s*XLc3wuLRV7em2gE@dnj>)?LlJDsEL z6d=1C{fJ)F2TnqfEs-!`ca)zZ{s9-43d#pMl$Tz}0Ba<#No4=cQuv7E^q~obc^C*a zRA8bs9k{m^)e@4_R{mYzc-YZ$G6-8=Z-zDGM3=$^1EoeK8uO8aN!xWm3HmPE?JuSL z5(6qF5Zb9$NvHifBh%c!LQVvFam>2Y3`)*8JPGizmVdldtFjHQFq3jC?d@)eDO_YM#N< z9@VUmJexmT=SuR3xiEQ+A7?^0zLC=G(In1vu4jx(7L&q^;#r3j0Q_W;>-e$K&4K#c zK5i!@NMfg4u4!NI`w}0&Zr#5(1 z8**b9-AhE>x8K9d+!`EX6W3o5tNha;|FL}hS2Px84wnCw8(h?uNjPZ!KUXuTWkE=E z{9@dreeoV~@VKDE^2r0B^sxUPek^5XszBST;NA;(8N~{+1cnYd$V& z49WXTIVKMXa8f~i04Ub^J|6i#o)dk20KSjN6r2*&8k}ui3U#uKV$ov^^XX+axm*uXrYPS7h zr1$gnS`+R7XV@xqbZDJgcNzn1btoTs{Tl`*Lbflfa_#|8M`dq=cF;SSF@Ah_7Hq^Ce z&SJN(>ZrM#RQy9H;U3-hrvXvl!$tu2LIOj*RPx3tCB#YjPgY;V^aeFj7?)TmYT>UT zv{57@jX#-%VG8~D0C!9d{G=J@&_g$hv3@CY++!A=nBr`l=gq(Gu|I~m;65g$(AN_y zrN$ZE7pzJaTwlMbY0-Z2F&6jk;o;+?>ndA9I&4N5CjJU94K}l9s}!c-`6o`?_z2z%NE8#*_)u5%Pl?By6G!BDLHQA4XAjyNEM0@@Y~VCW7~fSQR4#rO zzuT;Hj03IZbQ9MNKkS0KCe8J>&bx?RcAR^!AWNkF8my`z0#{W9ZNdWdI;gv4qk1Tq z+$?i(G6chmV4>cx$cMf_6ZK(>8hHx2rT*{$d)5(0EvOqwRh7uxy=^f&{u9K zf#D@H7D*m<9=l{S&~gT1_;~7H{F+0dXn`~13ZC<)&gq+4zi=PcaZr*-`BHyzlk3c7 zTx{#lw$MB-~CQ1ge-JSdPf?3mI95#=Xw%=Pr)H3%b3Y^f%XWD zNA$m)7p9hYi1nICrilziZy~*mv!q<=c9IK`34g-vl5ZfoAnsr*1=~T5|28;d2EsTP zIHH5YbwuX3yjM-LEeNWh?!9Rx93|KH<-a!Kbs0f?aY=AB*NA%YM-d{ep&b_mo2O`* zk60|jDV`FZwn%At&Kg8K69JId6K^NQu|J*&$@XsVS|j@d!pNOSsNaNpeK*H)sDFw4 zSaM8_)+TW&!a%`r>2DgGPw;J(z)G1OuHbZ))NUROj%Z`oW>R@Cpc{uaAn$%-H%`_n zb&H6zn>`y(!Zpb~#0EXf@DI!7!91WMiV=p;)R(T@GmGC?R&bBk^mak>OGU)k31xt& zAydFwX1p$>tfJ5H!T-HoM(a0;=gu9(Hl~~(GmyGj&TcNUk8Gr|0#b)Mb( zC%>IO;_WEL?pP8@Ef$2T798An`2SQkT4EygKI(Yv;>E^foc z84ZpKys1{Fk_v>9LOkr*_MY&&EiQ*5D433PbAnb#PXrxS7bt#s<2^-XCCL(&R$tI z&CF}3A9y&x^_wrX&UtXO&9uqV4Je?_>zyrES(J}*rX_99U&FVVXa|;) z_nn+{^`lDLYEh(rkw=2?C4NN~GpKITM@>?=JJr;MLQPz%7H}sp`bY39qP-ykJYYx* z`$ng{#>k3;i3$W9y&=+~9({(l0+YvvraP)0=)Ifu9cM}m350oP}Q1Ypp)&r3Tje{PZ4h> zYxXE85N#Q|l_8N4=q-JQrDnsjaEpe`4z`P#58VFdV_P$aDmFD3H&6ar#bG`}6=5LgsI`s%Xd|Hy~eRAT-* z(}+a;RlE@w64g;i5rB^Z+_L`ZnZNoj^(CI#R#;yc;!=Orefi|)+3H!c{mMHu=bmNn zFwT3Uf39E!HD1X1joBb+&z2kfA}!d5!RBmZgSV z`98f+d+Enu1CPzP-p>3#z(=h^h!?`+YWp`I0kU%U9r32X^AZ~2435wvz{yXEXnpgX zfNt#xP)v4!NeUF{pD?IgsH*s{5sH#2#!p+af~G*hyi&AF7dtu#*>~E;+@#yRikez(@ z7M=B`6I(SzybeVT=cT_5zePlbg2T3p!W%{f9}cXo4wY$4CvfIHcP+FgX)hHwsb{S?EOFMS zl7>>vyWt=NMbu|{_X7fnH^a2mmO3)Yblo(-J7uIb7 z1@XP`=#H8Qe4Yl(<vHmXz;i8sS!n!!J|F(gUXOP}FBaa_}zb4_> z8Z1LFP!MFtuMA$tqNPY1sjS4*OX%Q_Csl$X$+mKnq;x_2#>J|dnwqzEdNTnF(t#VI zjDnkA787{B?-(C^=Gz-)23=%W{}U~3=x`Hv6~|=OweYAUxOd<xZloi_OQrQJXewq1_`Lmicj^%* z3Cmr>8Oi<0Y+I<)U@PwARtLdR%G(5EZ>uoXJA>&`Cnr9sFBX?}wbbBRK;rH!LatAC`xaSgJVJiEf@eR>@>)!?IXaK)rg5t()G}nDAw0W{rrm|3mLvd%k zR^C$}(3nXO^I2(n@kPOcUAXfwp%-yL#9%I}qJjpMP?L)C;Ha#5cL6hpSJ3jGZ*ICm z6d=x|WgtkXnklc~&#$Ew>!^!gr~lB-OSaJLmQ~+J#E2*(T6V?GiS~{}zd-(qF-}Xp zNDqXBLH_!6yXU_P9+(|To+7e+eEy@s*2{}c!074v6|#RX22=#pdx`>~u;fpfChsJH z?@MgGfuC#evi$Dj?_}qF+Pzky-mXyBQZ$OmviiLoKnoMx=JcLi4(5bvOFqm_1GXm& zM6e@aifEq1OkcbkO*|evx!vNQG}6L8N9WEt#;TaUuq zD+765qr`xS#~ycTA|8f~y8z*5BdG6B=J`J~?|? zt_hicgAFb6k2+Ck?_r9+@?bsQeH<*wapqLG05uhfv8@< z3^DeS?cvr?B|+)-amgayTqS9x{`-8+=S1?v=0e*Gj~8RiOGovQMx5s>ezxgt)NOwt z97+%Q>)q-NK4K0*oW~qafw&v$6&Xl=Ow=C;8d?-A9mYzAK#W)oL_Sik6$_LB`rkGQ--y3L962Tw-F}okN$(>9t`Bj%R*lg3xd64#cbc$$<6_< zcVDrp=(OXCXo?heC0C8GGRxU9f*CTu)hE^bb4P}tEKMEnImV5Gnr z9mM<+{P--wJ=Sn$v)%y(6UrC-=*ZwfiMeiU!xf8u{-UoJci+~s#%Hl? zrZI}#4{hs-dva4SuRIuqs1B}2DAgiU#qfXy2m_9Uh@ZTlVM7gkG(w9|)Q5oluKa}w z@_@>l`F*>TnI@)?J|f!NxojuU2-7T=r(j^0Mf^x~`s=uNnVZ|(^kAEyad>FWPS&vp z4$j8Xc+JE>Gpv@-+K&Ms9Dtaj)Z!!S9Bf-IVx4=Ua6gJdF-4fh!hM^(41v{3{Z`gr z1mWcSY5B|^dTaL>gE#iI6Li|L3K4gea@qv!k|ZD=q#@Svx48_csGMJH4#h64^0%}i z<*0p4g!bo6k0V_Qd-2X+t_~@b3ssb=^x@ypRC0l^MF&;nk>RKz@;^zp3(`@`+v9<$ z_KoIKN`z^zRw$NU;DCXAUMx@xdTJn^fmgS;wk$lGBFLM?`ko~_Tjqhh!nJ+os_cD6 zix^c9;4~ICr^oNVmks5`S9m{Jw3UkbJviMB!9B=wVSKX z(Sno%LoJIFr`=x-qf%zwn7N^UtKiVlF zDCx+)nd&uxDqBlxioo;nh4~!I@8(oD`5e0vR=+lvS`Jj$@2|zik8(tBE_7e@@5Bu7 zG`w!n(+Y{$1x)!N6+L%5Ie28YHc+Bg)!Lqn+$a#PnoUPWcaku4w zR(hiMw8E(<#C>WmMj+C`>}54!FSkxOcf=u-$-D36R~TJb+e9HX7rG=)XEdCzvHqz5 z!0NDhKCVs!<9BYXno7sh^QQwL2XqmENsu`uJ+nOBt1!x6Jlq*dJjbfXxbl=%M_4wf zDd=1dG{PmwJwgT2HnVGPUk{0Ql*oz1;hT|9vzMo!Z9Kv*{0-QWSZcTyy{Nb}oV6k= zMZ)Qy=0;DJnr9&mw_nU}s()VCn9mtQ4zt0%kLac@t!c z9Jy6J^JwHpE@OW=fD9Lv7VfHi5_pE!3wH+Fm!RSj2Lp0S?Jh9LDco9sfn9$}juSyB z{gpt^(X#@o%u$?Bn>2@jtw_26wO_x#08V7ck`nN^mO z=bdDu0wMMJM(b(7gk(rTmCo^x58ErA>_I?;k1`OdL{AX#i~q~S^@4e5@qcPo*#A4Q z92X1A|DSC0f0~v5Hzur|ml%RJp@NK(C%8r`7ELHvx87}fpVxHS1f%8bN-Br*(Bk14 znTBh;1N1t~G66s?qNQ=B9| zQaI^MVdd1%PUrP(aWMhO4Al%PgwOkF_kN2#+%6~8L0><#f_=p@Z}c!WjEux*F~A{>qs#Un5AOHs}pM^(cRa&nlNMft;X{5 zihU5$EyFDQ|kJffU&T5lXFV|$d9sYI}W zH3?;)x4V5=G(B+!5Oj$1qCE6VREr}`Yb;mw2K=>Y`Her&;DqYl#4)fuJxk)OnZW>R z>kiTDG2@nQwV@-B@K9_W_$Y_e>q7%*kOqnhyQwlc1fowEgmFA0C3m8BM%hLrOh2A7 zL_Ff%i^&1l7t&iw$hv=j-J#NvIDr!xGt)R;zBYyKtA!=O1)ciiF|q@*QqK9%l7MU; zC<}x{G`2t>7Rli@V@ZOB;M&rqwFddC+J{ZlXieNO_QFWUCDg;c3t5+&)mo z%px_z?_}G-8QA!fapFomy1a`W0%uv*awl?_=eo^fW&W!0>3tn8vvxfd8fD z%Ee`S^ObpDE{vitLe(Ffs9<23eYay%l`+icXjC$N(|Y^KktJ&CWY0uwr50eKXC@&l_R)9!L!94C32cm0HJ8qbX;c}3E{x&tR=g(4xCzm@h=v2 z=27$2)@?L6?ZG&{O=b*a^_-O`$~@{`I%V%tYADTyJlkkM;cE6;Tw?#H)dBV7f(XCIk|!Q&F;%lLpBW)W<&|2`YfV( z2`LI$<$7TM?^Y@2R`V1;CTd@9(W{;i4{pYt33f|UgnJ0zQclZc6jeMG80qIC;J4&{ zK~*$B8f(X7)4#r&tt_FQYCgWJsom+vwXHS!W;Zn@K#F54g4FA9=2EXP+j-SC#YR9l zv!mXX!oTf9mTD1s<7*wL(6VbI^2hsW=E2esAAb;550miRZ*Wx)Gbi{r)@R7JHpcI( zb|<6+mb2xMOQyDP65mCRr%IE1X!1qLt3{xlotxb6VDy9>-Zz0 zoxxCnSD($Pacsi#{@Y)ly-lfU ztKp5p$*`vn)+S<=nS&P!wg7r66*J47UyM%j8*7}D=QJMUU4)HF?Z^QQ$f&XGVJFBB z$JvZ_qZ7!AeLOz8CM0uI?p(aeKP{76Roc(U#)9QI$HC*!`#5b~qIyf+?D8az;)H`U zlY^ISFeypB3x8Z4Cr-bDFUo681Nu{P3|+|Ek~mkdQKb;fZTTdy@E33`RE{gQS&iE? z+rkxH;@Ml#gF~vW6*S^eaP9@RwSjWN#Aj%LS?DoCRz<_PfF^G^VM~}(%KPMxLI`f@ zc`rr)82fXE{y!G={|Z;f#L4`>ejvL3Z*GIzFfk??&7u9TSdgnsIGjij@v#0GKP9^f zN(z}q^06t+)4B(O)R^-4hPth!jS{Mt=hZO}96uy$6q8_VUZSDI21##Fxrmio%NdxQ8hV~ zLJ)r0f|#R`VP@qIrEPlXA#J3nJTvv=ni!O-`mD1GtCE@opg^0!{NSXMn!c+d%?V0 zmKbCDa18b7uzGzJ z#;d0S-fN5Y*JV$-ZaB|&S{inG)W#=L$qfs$t}s`s>tgLL(V6%!hnKVk^`k~N&7Sv1 zF$U+NlBcOTyke&@H}69Q8jG*B1HE>+Yr8@$oj#dZUj~;vThZ2!XepZ|C%nEt@8n5E zS42YXH1_Rm=E=J|fQKi#9xp8PW>S|i;6W=Bg}zAVW>})X!4%`;u#hlH_TBfkMMv}U}~jVg#V}t zQg?^f_k;e#1JnDG@QU!LHIU@pWftR~B%-1QYONG<$WPnRUnBf6+M%xis3 zEfGqjAtO#6t#f*XF3&j1W?Xvnj;_ojI;nF-f;PbqC458)*GFMmh6=zWLNt#a)NA|H zWEpz_+cTcnAz!bgvGl18UvA3Hk2_j-_A_fQn#iHhN1SUKG+~n(y|EFQnD04HNHRfV zoeIgt_B?8S&eq##HislILTPa1Z`WL+#w{#^)rk-q7&|`uiT(y6x1O@e4ZU{5bB19SmqGEM3ep{XsoSsHTpnTuA2=Iw9T zmpHYmXXBwh0V|VHqLmdJv_r)#`FC2MU79v6F2g%R>xvX>PIig~GQmKc$9NUXIGhDq z<2Kd@?SOS{R{Vx2GK~e>V69l^_#LJ9;`?v2WQzw0VU&kbSi>ejmL&(7nw$temPy#9 ztQ=ZIv)P7qjpjFDl{H5aUF*x&t!*i6j#N;Uv36XzB^&a+<_>G zNYsvCo)br6FI3H2JJb2WM}0`blfF-R!IDhk*b*tS05WP8AT6kKRC2 zu$13%f#nkXPPM)^YE&X^l#jXLZ`AFqhyOlOpL)ly*-$ajjFWTZGavD>L$FGXme(>3 z1v$9K9Zo33+6WFAc3n`u@^&6<`g|CD2n?}G9c1vm%_K>VVlih7J;VE$Xw0IGG<@zc zixZ!mxqz7Goo6`4@q3gthPqk3BsPGt=1|`}S~l~g3Vk69XkEG+ARuH9=?E!H{5oTS zsmxH8eKRv0(jhY+gIIdo^VaT+eJV5ebv)Y=&vK%;B+-jefL}i%H3BjQIrzO zW1mS0r3VoUm!J@^UU}+qsU@!!e{%~q6z%HWGUQDjb>ZiazZ9Tgb4(K;y{LSrlbA~R z?n$tQWKtZUG@wNeD>GGa2@7jfwzPvugry%)_M;*|DN0@EK2v4_3v?BwlOqIu99cNWukS}`Yz4DM9&5^Mvbk{OfH zZo&zImcWQ#%7GvdlCauOKd4NCz?z$}osu_iV#(@dYyo>L>a-A8ws`Ud;dI0W!7+Bw zQoFo{?UVQilhK&HD>U^Z&ww#2ue#~e+~BSSWbnhg{%kP9`OPx%@Cu^5c|c49iO5CCik$AlIVuV2{8$&tz6H1MdNgyE`7=y z;v3EBQVv1Iipim6rh9rg`Z!%pH#TwfKxLoYW+)v8$bn(bGF)1htH_R*aP zdS{59)dKt7Q@Rg5I{j?Ac!iT-^P)-VcFqpnf5t*wRATj0*=q^8EOJ^3$%K2G@l8*i`2|EExT@8RMq?yv&m5_A|u=;f;hj9(y?o&z459*1u;+Y&-O7wBsk}D z(lIT3-TV}W;hH&r8x9@7n*R(HFayQ6l{}&5v&R<)jLUj_H}>F!P(r1v9XFnVcy8+z z4uzP1W6^~cmdyCA)R8nH=&q%hkS;m+7}q^u3jo1>t4r!I%`)z0H-f>?zobRi7I|QZ zMf_@8JV5L;BX*H_GN7eqM181Neh##f_~wPk5Un-oI)~_x1ckxcE0eS1I@v-l}3t(v4(wq-5biL`SUmus_P3G9}U-Q6rQvxm!Vpl6t#q3B3II$^o zz%4!PD-P=Ou4E#@kSR&l$?{W!w`1$nED?@87^rBFOgchN7anFaT}xofB`#n7ECb~7 z4}HQlUmVU-;s27-GhB!~&O!!;Icf!IC9wjmNg#GI1?{>8BGCW!tK!UGvqTDJKMwa+ zgV*%i&dtp|1MtYVRf0y2*Bl)q?F37XASVgK_H{L)MN<(2a<$6=tfO&H^$%RApYz8ImKm&pxN%{lDmjR8X^&-PwCM$t$cL< z6|!dp$B$1dg$XFz&!v{mUhPZr=r7ryNC=|GD`_bd6E*O>f(x_Jz`pIO5yzR=MTN8p zzalD)Zpgp#+QTZuR%!{sJnO)HV=t*i^P$+Vkej_O#t)z+k^`7-ZTOZ#ZXf-i2(JIYFgi)Fy6{kr z4XMHd+|!^QWT>Yp1HK@xNiaKfAQL?=XnbA4~8E19+`8xrz$-_gc@Jy} zKi*hJC?u};fStf|`?QZa9+G^zz$csU0LP@?wpW{x@?H>@{Y@pVez`Nm$SvrO65u}E zW#h)i)3B3j7n=19?})-Cq%(zfPBY!4pC7GaTAVskX>_}Xw`#kJ#lhQ37C$<#Ewr9E&d zxvXPT$Gy~IDYXqgp^jaRSE)Wye?*_@y6i*{f~7&az1!ypITsNQcL9PnbLtP_TQ<%+ z2!0p+lV|I6VGMi z0%FzlCS5M8Ln{L>H5>BM+|Js>&v&K* zlJ;TfZXi=vN0d^TsGL(A^!sTVzeviAY+a0jvtHw1`eL$WTNj2OlC<|mBsjER0QUgr z4Km0Se*>8 zcdGwj+Y!zCGn6NHtpLuXKoZXs%>okxR~!mRzdi?->t}$?44*1(=w|0J=roz%_lk9t z1`TCmVqO;mW0v-dz5|aNXtK>-n6wm9%rX~Zjb^J>;M%3^(17Ph)wXd~q!9<9K&kd> zTut?ZBqZfcRWrj_SNEd=Wc%<^rgH5p<%^{bJGJW4e5wbAx2xoOR80R4V<47_h62w6 zawD#~)u_v;tE+077`a7;?gel^csz#i4}qCQt#2(n;aW|%EfQFA_S#;wT=(_qqOAel z*Beae*Lr$3(qFpMXuCf-Rle!zRQCI~FDz}m*_JXXTKqk7;=rp{CCq_|NbgEV6a1~g zV?#_r^=HL(oW7;u{4Z6ksS(TFj3V|HK6^Y=G$)AyGeT>QnS6gi(TwKAG<{LZ?)$=2 zC`tu@yFzA)MtVm!NTdmoG}PpMy;|!vUJhFNwl`?8A8&~p$la~98Z!6ZISg6@d`>CW zjT0M!nOsr)6>hfL_MLfKt%0wpe%l7(d?>c>CKRXrjN_1`A7Hvs_etfuNYi1UZzccs zhg31Sq`QL~ePd0lwAF3vwYQ;Pvs4UjE-frJkW-ZIkg|F8@=~L1RlUOJbx!KvsZ%V8 z5DMN^B3;`L`((AYuwm=!?WDqvU1_-`yg%4^>Quf~)H4{`jKZ;2n{G5E^`gGV^3Az$ z!yWN&j3**dWXxw^xvD@`WAGo329B*8-kaAbr__rrK$mDF(pRe}WGxT#y%HmRm@S z%u|P1YIv``wJ;j!X!UY@=7GdKWi?Crvzemz^OXf66xULlstOuzD`K#aZ}X-Jz_}%q znVzp@sm@m_D{RD<2aT4Owq&CzduEWs=IYC6q9p)VnBqJ#xeaj8CxRE@_t%XBL**sl z;aMKlzK}(RGz7^LLN==?Rea_bs_85j3#CwqxJYm5L|J5ZA@~bRAtytT2}SSQd63}f zB-jd#g95*Z|5}gz!_QjBUsKQKfLEQj+tzC}_JNWSW}bilpfG$x1~N+of&!2QCddg; z1xq-unN$e4?wEv>ofFBaEL%LlbkaPaXmUJF71M1#fx0#w)rJ#J%a|2c^@_KtoHwkm zNGMih>8i1{k905CTqhVMN;Rt-6IiEEIe ztH*<3rFf3F>$De2%NwDA2qPvN?jGY7hn}Miwv4m#oKNd=4>THpR*{nzNllIPCha@CJC(u*^id3RxR?VbGUo@>MrW{HerL4WZtZ zvoQBB%gCG!J2Q(uxlU2fOK+n4)>~AP8|yvsQ`?MdQZuYQxuc?GUv2f(Rw^*vHgJ$F zVr{5D=c?)+jVNzUavpR*4#b6a;eyJ|UtMo2E&OZ5g$EG6Q~w%MKx)Lo*cE@aYDio8 zi-kL7*Rcp8RhU9z8 zNSuJvmxB$9y_BUgq}t(0d};cB*ncMdIVS4a%L287tLjJN3~rhy&Zw9~e@wu&NLWx# zQhrVi=yh}cTsoxpIS70}KNHK#{KtayUqOqQ85#cb}b?U&w z2%1N^K7O!2=wIFt-?ix52DIHi0 zAg*^dB^V6&3`(@p$i%vyFlK)24GjJ(b}b#)wPJS#whkYgBOPYrZVhV=c3lTvb6n-y ze8sI;VO>t=f49ld!Y#=+^lQhPz_HpSb99x{R@IjIeKEIkDCIGzCZfifpVx+(;9~|o zk&Zv7DLvnr@3!^Dja2)ts0PM6d)U>Y( z_Eg1-jE&qj_{rI@F7D$4%tTu8)h_KB<)#7dcXBQc$9O*{@s|!%Qq!B63D1-A^BX+slrwYK^{x)hYt4DT(5DH(ak+ z(h*I%z7TKa_beoNPJzMzq_;A1i4SP^ z=4RexK{Rl;Y3N}EM^pTcU*;I@cixzN%GxmBI@{^gL*IMBS|OP-8T^*BL+z8CPIpTk zdzwisH3;!eFv@^$vL3yOG_z2VVoYkF$|m#Q_aF^Jon|{NgW{%7Ab+!~*}7dMY)GcU zNM7q2-H9p9xhDK{zlre3k7!__Mg(}Z$q|yX4$b8}L)Tv!0qAajVNJf`Od4dtACxJw z;z0|Oo9rek+fUr(Y*`?VSj@xmf5Q;zo_h@aZ3Y+{xaGtMZpT|DAFuR$oaYbiUD;gw z)as-n;x>sfiKWLPd4VxZR}{j?Aj~$IRd`{;TU#@t|PqAGWeI0@3uU zp&-w-MVjyJlM!L_-z1H4hSHpd&vmUDY1U&aK0hfv=G{*7hsZ=EZ;)$T7pDRe&1qCY zCFK9WoKIKT<$yAUsBs4%y1g@zdVA=(e(4JkhTo3=@~-PwF;_@0%&}+#W_a-VIUbop zgPGJOXka8qw|Ifzixb(Ie!P#{h>XVhiJq#yBm_C?wJjWqs_%Y)HL zIugS zXw&s%1H5Vdt@V;{es{LUZe_N;Z+-qW9-Y|U0?@!{>Fs%&uN6@}VbSmVT zH5@;Yz`C=Jx)_TJDAuJ&J2WjXwohO>F!^&e{0PtfL3R-Lif|0S;O+tBoSo?D61(&s zDe5=t>K~>=Tiaw?7f5cb-2p|n`PB7-*HGIz(niWk)Y&u3=8R?v$>DA|i*+dkUO9Yb zIiP{zD&$EXD0<<`a2=>$o`)Dr7?#iY^3oh}b_0Ew-nh9KMw@VwHpFGE9coTMKX-qS`SUqxpb}#zpc>NqeatXfXc$nW8!YvBV)ipD75#TAXh_)iGrc5n!axNa01AN! z7CH%33KEa9EwN=0V&(8iqx%;{6d%b>=}3OG5i4y&e+2Xg1f+@_^A$LzzmFA@$J|Hw zG~Wp3_e>pMv|Z$<9Om!TsYHIu$ko7U7hY&w(F}YpsKu-hHcXH3CYLuO9DL+!+mXqO zQJ|}Xo3NM=<@}5g<&UfgWv=isEXpv&w`*GQq>rk6LAcAmr3Qybq!m!$YBX2Qgq~V; zBsZA~tG*}F$JwcHxQ1LTQA)hGzf+_x#zu^NRN~|zUzNy+VKHZn(}65Ec_ihpDC-ZH z+m5La^_eNc;=_wGNrMu920k;Z(hr8F9GA`WHT{=U5=lYjZ zKo8KSU&ntmyL0?^h%9!d|9wlSxo-c1GxWRGfTBmV#6Tz65*_~qp4?2Oj0y~b;}>;L zc zS;iQf;Na}zqP|C_zyN?vfT^f5XXsW56!mPWz6-g<#42YZ`!qz@lWIM0Wv2be?fRkwZ-?o$_XrH~ zCv&v6lW;TnCa~YgZFVb^XNwk{U{R?!Uz?`$uy}rC3#{%;l!I%PJz7F{Bsf~x`+pca zhu}=ZwOhxwZQJPBwr$%^I_kKCFSc#lX2-T|>txp%?W#Ta2ha4adPld`x>m~$R_%mf zA-3Bp{}JJ|qEzcZ=atFaW9^MSc6)H-SRXl(1n(#%v_zk=3?**Fv9uOW*V@yiBoV(t zZpO+g9J2VvY?yf!n+lE~9Z3v26`_^ENC-4pDCbk~)7FSe2G!GIQ)I*eN{~T2e#6_W z#mRG=w~AKDZ7n*MlRB8udo}(7DX=x_Y$!3MW`}i${G*S^N3+)QR8y7%A}ARZ&lX;K z5`y37(BFeRqoc>{w#zdiv-Ah04la}+{!v2V5G_{rXhSfmNCp;tBoAQ$*W4;-I)1(d z-vG}BDyy@Huam#T_r4jC(L;ZTp!zq<@abSH3$WOpl%Db*vDrxCOhQ5}euL`})`+Z# zx;90byFlk1YQ66P^mdNAx)y#>tX;Q z=Vl;Fc92uHw+pV(?@vM%Vw%6Og|B*qyo}w9ANT3-L+kTHI$)8awZe+AO4k1bxeds( z!$!{MwVXDy459DsI^ZKLJ~53U*z)5X%|Z?^-=BWlpbt?5EQBHLjQ9rTCn2mDUS#|` z#%2)RIDe^;Gh&SyZOng(9w9Fijy+zx?G2;ogh#y;K( z6+6|l1ff;nB!vwMmNvXxai0{?6|{bUQYQ_%$i@{HVkNRs@B(uq#E}|EPt=zt007%E z5^>Jv7V(ygUS~>TEwcL3f7mm8L?PFYkR zuj3w5wbf})bM`)F$2e~1?P_{i9KA(4mnG#o&#W!3@Kc(%pY&a8mo0#F0x$tGad}b2 z6~=kLWqlJ#yO2H!Br2wnc|b+;=R(d3BL2R)qdCK=_h7CYbMVR0dh_}tWeV)__Q7;) zGt5W*sN?jwYK|es@UNn1(qXsNFdjaJesgLj1VttV7L$ep_GO!HM=#Z5AnTiq zjOpU$oqvc&ba>oUx(Z6?3{hh`7l9LC z`LnI-?xCX{4Z^sE6)O-kl2_rQ~z^d{XbE)SlIr%EDdSf{S2%qU;aJ9C%}*$;aazHX!lji z6k?Gat;Wy%X3xRKHeJGIWAO*J&aH$2tYl&;2xdOP9eD1bDrhMp(-W*S(Ewjb%Y=SJ zIkezyHm&QOQ_PnZxi9~WkDGJ~Hu7JKY;As$mf4E(jiZ3|sSYuQp}ViAKYJ9Xy!%bPmA7?cUxzi>2YH%KyIOCbv zlD`)tR7Qzy?Cu@@C*|h2>x$O-NjmFE19>(-2J-5?Oh@{S`q!yc5;j8eo?054wLXMD zBXbCE1Mg!Ps8Z?3NAM5+)TjA;Y#At!8KuHlnX>PXhJcwmyD~CWmVm%~-2CI2@WfTj zHS~rx`izr2OK~*ZCg}|rjA~6Ma75+cQ*zA(@6*i%ZQ8LAm8Z=)I}*wasD7|k>=%M0 z_prp-R4$|hFV<~(j!VVMaRPEl&&pvTJ&yI=S$;V%6&p?32zi7Kf4W~j3mrpT1mA0a zD>}%(Qe%j`d*@kSCZQBcc(8KdH^1>l{DBc`c! zLy(DCNI~>K5g>6*;eyImD&Ot~@@$t*UZfeey7aBPx!BJ0tTWzMA|$Ag7zhUFNxDm& z_xf@@cR{~)3!`(#3b7q-h($&kaQuNYg#Y{&HTftYZ63`zM@s7X8w8uac9JQ7oal3m=?JO=E)m2#8gA@6EJk!aRv8Q>UZmPG?Dd3 zC8gAkkHGb?QYP`j@$M~5b&?s37K$Eda7b?|gvWpDC1K4`5tA+n6(5lyg>xUq!h6^P zH4d792q(GOq}fEWUYejW=*Hr@O(15LTR4O{RksC}XvOR2zx1x;%JhyGD1vtdzy)vj zESRj>upuI2)NH=ML?yGu;ZL5Ngmw}qrRja1gUuJ_PX*qpml#C2cMu>ZFd-$D7o~2j zK!;+N`pr-G24>59n?;UfXh&!D634)48g_w$G?B|NwQjNj3{4UYwJ6k-uTs*XT(^bv z!;m8P{_LLesO9;8vGGvPX3To7%K6ggR4jhwFdDu7!xtU_hTM(HBEQTyV<^hM*tY~7 zyY#{Y!RcR2^uV#wYpaQB0;YlB4iFEFYl{ukTOwaT6%in%)Hv>oLP=`y!XRSXv+xd- zI2N?v9S|5OAT}VR9-*`CGf&J3qyLSI+&cySfZ`1nSu);nyRa#wv_}&o{gVJpuCPnf z6IQ)B^pr$xx@B_c!ktpWzdC8E16>K9U@-dOP<_ha1noT5i1W#qJM!r|iJ zq=-wu#pm7>l}7d<>=DOsyvBk=2Slu13+ zeOifS?)IjC0NXv8@4NYbVri|4%i>q1H^qb6E_0f-&HKg>ROqcmVez!g{4-X)>BaCd z!DckLqc0h0ip$)EJJfYwBiQyNT*%U3M;7U8=exa5`gr+bK^{vo9sc3RVQfGMCEICu zF>Xttx&>VU`enk*e=y?G`Uu{kyPBAuWvcj{I2I_|)zTTV324vX+)u05_!+d0*6eAM zg#sB%s{hpG$!>uPIEs$HNM@dz5i_v>TG z2}yt6hX0ZE6HI%E+t$YN3|6ckh>+CU4FD)5FBGo~>lnaFGwVz-Wu17`C^^Rnn>%=| z>?Oq$msY@x<9J>g`}&HtP}wSiARvnvFS@?HA$vToc9>{BOP>pVYKLDPe^35>!FVi= zfU{h6i-SK8YxtQIkj51Ez(jwhFdu$NNEXZko0C*zyK29p%z#UI%xP%E5N$XRf|z~) zeBE~!yOPJ>K2TQzA3qIpZR&dqSMP5bF@#X|HiGp(bD<~gZ0vujF9bO`7age__h=3` zc$>p;c0$cwN8v682&9omwXe`wn37LJt&$hq5u#*1=sJF!7QTGJ?`;r|e>HIVuSM{0 zPy;lwZ{YqUUC^6WS0-W|7|jGU>Y?)iDb5@h+m~CWO6{g|%h;tTZSBqpK`5m6zgR0vAO*IrJK+xwmb(+sIgjWYvozV4uFppvI8URQvk6YWHV$n z0oDF`Gm|vMq|5a)LTv$(%MsEk{|f2E*mueOu$6x$Zq~OCE9$mCF+Ky*BU}$#ZiE=q z)Fk4`PB`6$Cmy^uvg6zcMfp4XH|SNde^>V&Q-!T#I8M;K$k&_-I-wqDeYj!hE{26{ zmqh{c`{}O*E>>$9b=ef(vA4Y7)*`F55|!R3XT^yC)!+-_I8~+++lGPy^-J|ep8b{% z;kB=ndvzXEtJjDBK!c>|yHo*gR!n`o%oS&N-kJ=z(MkV4Yu%MjPS2t5 z*Iy2^Tbb$G+LacOz4^pj#x)89_$g79VF{V;_p;5)3Y^P)AOwdLZcx(8^5UxX%VQs+ zk~WYlMcau~CKzy3jeY&^_kysDu5bdVEAd56o>-+rNtCTN#(2F$=kNZZkb_~D{?ycY zO4Cu&LSGxVbjJuAbf)wu2X{JjU(Baz)!>%^;HypOW7m?#Q^N0WUF5Sufv-D40)Al5 z|JAl}{hz>gEX-X01>Ek^{;_Ct{l}thG&vwlAd0tDcvstdVO!q|($GutnfwsEX6^xN zBJ-E*80cuk;TB1*jk<+L5&{r`pfdEUr`*`=(Me4GC;Nw1Y!^}A?&;>i;pN-taVBGt z(P1poP<1!5(*8o4{z9&caH)m!Tg&M` z*zMBQM{TI*r<9hJgg(JV6#5c1@|ypo|9m=drtdzU*Jc;V?x;zj`SxxIuh{A!9PQ6G z;-V(cc&cMb$$`R78Mcv&HLzc%j~m-^JTi1zUnXH3fl^G`ihsLbe5^x&RgDz;-Na^n zzRahe^-mze63S_=+6SIkHh(#BZHZlNM76{BXin1$O}JpU(g`t&B8}KA%irCo5=0`W z4KnjIa9*aOW}pu4wXaEoHkW;x***<#Z$5AGw?r6A-rU?WJ=qAsn0%K%w{>ByD4bd` zQWE|n7_NSX2@a!h{O8%^(I!V56rP@G=J?J%^t$Q7Vmx>{ctqO~NOSeqsKl?UxctSM zP}8Y}p{nX4nCeN7aImF0Ib--Oh^7-q<_~qgv3bO8UGub3o#7!&_lKt~e^n^e+2#X# zXUR~t3y&LQBLlhQn+@*LjED1J`e)zjOc%)USwF?J)Gp3TNR7u7p?mzQAH1z=;8}_} z*5{?)a!y@q8DtGRUWik@uRq&gntNJSb0n<38b)SN3GEq>=)jUgJxm!Cb${nX&K)wX z6p%l4Ffsz1`}+}Q9;^%RboWRSNx!20CO|9REDvb!bOI$1Pvw6jU^Wd___N?3b0pD505AZQ{V z9|E`6w*tA*Gg*6@5iGVgfqn{JnpIFJ$ac0&4>{r7nHk@gR+?(jRB0hhkvDtZ%S@`| z!AdK383n#Pgu~pf3H0OEz~x^FjSY^d4A%4*B>9t3G349=N;V@z1oQ>fP=%@6+P@tw}AcW1lz}rf>s+GUoF&mc0;PA3fQe0W+mP zg%-&cJ^tR6*Ca=niurJ^&Vt{JwS)-R(&)Xn5Xl=dD;?ZSzZ2STRZ7E@8zP{^jBCdn zl+cOw;9?>T_Tk#nU?{$xZ)36>cmMZ*TN=?&hdFP%@;43h7N7eFzGk$vpS97&KprO~ z(B=)m4zjcoCZ);!E9+A8V)3Et67FIKcDI^VaS$!AT9&_v%H3QcbYB>A7P7=#H+W+;AAcuUUg~;BcGHWy%9`fzX=vuc#>bfV z8Ayj|)t@vbXTh8@ShbI65gmdU2brOUUGmX6*z&GY=%67SPApfmR@e*?=c4Fxt)3n6 zG12q>6hh<`le($EB@hze02}yTD4x%zc%=U*}gbbhqfRb zWplFc$viz<<90#kQ=%ZEzCkaZeK@Gy-dz?@_H;;g_%VnXc?mBl6H2*S1v8#*w!|lM zha}hItW9v#XE?^3Od$X4U(*dC=RV)_UNPOC`YJ+JQex%Bu*d9H>omK=;K zvZc!YoA7#*7slKT0_Ib(R5_YW&5c7cHg}LDR_|K}9jc<`)W==lRqKT5Sxt$>t*u%% zH(~zUjhodzFW#_K%0pI8rG&EftR%#iq_TAN)B3${^0^uPD8EdX9M6nTI$q4s`n#3n&}S7RFC-8PT1@X z)4<7Ny^vL}6zL;9({zvc*UqR+e3q5%Pu}nslZ*Mz3753NiM!UQ5j1~pw{cJZqa(e@ zc4f&rtF59H;R?i?;T6s!sB?6nV*d*;p3GtS+Hb3i!aXj?t8BPnL#tHgGOJ;ulqm~Y zZ|(Hy)DTnm;R9Fc5PH@lkwHowsrbpP1FI|3Z5@kvYh$!4a~DeLE{|TfbRH@6BYDUD z)jx!r8)IGR=5o8sy6%7SmCG^R0!X++p7ADztN?S1YV#C6I7i;=s%`;e3sRr0W%GwL z5G*+Tih$x0bpJE5&xNu6BLu_AMnrkUZ6?=t2YE1OBTB$ewl}(Trd(QRt33o+0=8oP zcSgqI_t#TEGAWtL|LkY}Poza=PPYHjpf765{3q<`M>j#YF~MNSyeCuW3$?@H^e-Q3 zZOsnR3E_^xLr##^?$HwPLw6rYp`&i}$jYUPBx@E{8u0SHpMt~eVZ0#;74Rg6`jEps z=li&Z|5&H*Zqw>)?T5|G=bgIUGwnGzjo+0K$4C_LhEL(NO7p? z(IHQqGgGqL7|3YpX$^BY|Lm@wWYzh~T@TjrQ>#HCNjdkgDMv@1n3nc)N=hG4=32+g z3Q<8xCXGnrsaRc&rP6n&heDksqRM^~n$3IHZ-6~E^ zqA7+bMl;%*5oD(CrTa&kauY{9UAL)KZVhQ63WgGKm&vzcCZfEkrd*~sdnzC+s(OJp zhGay1*6s{(sfy~BEf{QaRvRpTDa;0It=b;FCg1DI+u#?8l37B9irpJZES-5-quOEr zkT>tf{u5`AyCZn$o5Op>{1-WRKNBbB?5)^3YrWm)kl5E(qmQdYw^OZh=TzIT8euQ*iHRrQCgea zNT6;M!pozbCOuX@oJd~A>WB6&?1J3 z2oG~6D#m_c?I0fDtn|E@cb!=X+ay@o76v3qvra&`vG65!b3jN4t2vJDut37V3=qY*krr4N9<67CW$-{sKcYu zXXs)KqqQd=QTNN!UQ+TC$|5Iwt2dOFNy4x$P_keXbP5>cL*RtKyb@Hgzb#YspG}eO zAmc2Kdy?eu-O^MItp@M7cWX{g*|KrHpB zL9u_O?qT@R$BU$xfJtFG_LSkx^eS0U?5>}5fa6zhfQ0OJnY30ddeN7S?#5LmVI@EY zaZv&&$ScsqtKnNwq@qN83GJzUgurNagGISS#V%oP@dW(`odK9Qc?*KQckn{LBz?t4lN~g~Sc8fxxd| z*wi~n4qOl#d6-fxO>K?aQ_wMBdrEkqpqn=IanCehb?cUYo0v+b<{QnSIaZSY?l>ly zp*_LJhg`eipqI`%lsBst;dJ246Y{3~#f|5*w1kPeU2$Od)(~ou_8NuKjp`8!siwaGTS>< zmvF~XPM1Xcgt!4&fx6g=SY7KFjD3b*GGc9_|LF?$ZXI?F^!00aIjsl)3bdE}_@71b z|HNTqX5;)Xv`Llb&yfHB(I#_YbAp5DjQANPWTP0=L1>paCnB4WRdVYfm8AKZo1f44 z&Qw}=@s*{;)(^ zW;$V+vYE}(cv`$JX|P?#S2x3wFC>oxo2~)DK5-jQBfPn@pf3C!cg6KCQ^gh$0DvxbX?zP zOophB$5QLqseu7^)ups-rIYkw7L5T}gfZf<9enASFc|Y}WPIg6?@gyTV5uHNela7b<0wP@n2EcfSMX<<%r))V3@t(5Ih7==gZ~`5r5O z8p~yHY^QU;gP)JvrpShDZ0uIiVWP9C8QNdfT)kUHA|AkfW?iKL%M;tBi?v|r9mUpm zyIOY@y}hxA&<_eLwuY({H#)31wI`z-?z>OIBKR zKiAdkX(y;HV+gYvv|2g#Ius8TO?VJs7^Jsf3Kp}s)pk5aK1h86zh#Vo%Y%g?*(po3 zn=nvRh?L26MlPY=0VS$4M%>_G0F#m#UMg);(ic{;VQg>ja4f7OS$<*Hi_*#le#E?b za)}&5gV0tI1Is?t2M(6$;Kd|flmN)piVv3KP!KO~r(NQ3z369r%8kM0S;c_F*GA&e zi&-sWb=R3u`1|tsk>hPnJBK$#Frx5so8S{kN%baXd^2X%d@6?Vj|fwE=n0vq(SU^wYV6T6+}z*vRLpncsb? zE~9|1InSR))`GXle!cxsb|586*|j7=ct-xvtFgai1TMJF7ISf9)Io^rvSk$xe`@BLfUldx4J9ue|3 zguS1|&~*K8jcZsItYd8l(dB;j?36e1)?G40M)UArW}_kBoX6pBfp|)B(CCGuNUzYk zQy-8d22;XZ(9^-y?wkH7MEgb8kqW$AU{<^-*nX-{3n|d$mzvZZKt^aLtk+l+Oc(HZsTttdm;*ZQYvt(So`mkVYj-cZI_P~%s`uLpT zHtTbP{z(f$H)jw1wbA{>$d=T_kt5*WADDVVL(x9`o#!0s82$Sz$L&db9MHZD3A%3u zT!=zbm0$fOwDmkRyrddIMwr`+(#(M`P3*4Exkdx!Gti@p;XD?WeS9RJ&2Gv3f;iD> zo~LP06*@fC_}P?=iUt~~wViu(d9|`UpiV#-%5F3WgxQLSzoG0Xxj2lu1h0wJuK*4dyE!D-_gzn`<|i{F$j zX`XjVXIn4&+i}+9(+Kj2-ZT|8s!^2e!RhbN2Z_{3b%|J;WCcehLB36mv z{_%LdrxMG8Y=Xl>+f;`rtc+kY20jmU9hIbfX#C^AzPOvoCdVOg^SJ0k9)UtpHkQ5p1p_O1 zf|@LAg0nsUx0TH{GAlW1LjPB(TuU;Wb(r=wHsX=g>9?J5M@i;^n0ZenB$sl6_(0h? zLR0xxFR9t=rq!TV3xEC-JwN`qf5`(=)EYs_np4eNn786nNAX2__vKqVUeacxt)tvy z*E>whOn%;0pqr{#koXi>d}5Fjd7hN@^rsMY+xp;uUh zw*~GJpVim%!MO>Eek#)MGyq+p)?KgEf|>Vg!&Zw`Imrg~pRK6Y2;Njxdl9$7 zl=&194SstqOpoawbB}81T5I%U-vN~$KS2mo*FmvMo&0bv4VdjfWBIkz!AC)I-#WYR zXH(sTf5C&(>;)XRZj01Q+fu918dSbx8kWx-yQ9keI{*skx+>5%RVlWpIllv+qlrTS zh2-+l@7<2cPKl&YM(2}E=@iU7yP}mF|9VoIFd_aZg!!0s+Yht-AuVn@j3fT09~Qxz zj*w6FKy*6ZSP0fdiFo$6a@oW2w}>Y1M4y#jscrB3L-8=^ewg>hvK$@;Zi1u{9aWb- ziw8~p-+NK<7N4x_&;#Tzw6%=K*!L!|8LkENYVG6ke3)LGZ9z))jJra zVxT47ZZ$3yQiAi{fG0f_rboWC12IguV-jN$P@>z~CW*&_#L~52e#2H_t zNxLir3y9w3ZOg@u|6|H_HZ-P=5~h=DaK`rYZGkArN{{JYnITq8Z@9PnT;%UdrzFRA zDTS)>DWQuc(g>p6{6x(L#vUe037jF$gxW8iEOAqWQN<D}!zA0CS|PiiVzG&2IZw)GkImeU=`~0n`?=1}xHLfNP03 zI##0ls!d?TzrW&LcqxJfkDgd#oBoE>=_*cDfC@0i*&8c`aKJn5k~|GT#qE z9T%tW)qnA%WU9*LhTb8w9Z&RoO0!55Ow_kJ9&vEz@!`|(RxN@?pv|}>oVK6HijG%- z``C}pa4Qdr@r3(8`u<{bQ+&+^TxTpo9I`!fJ$9YPq(M)hDii~QQBz*HCJIBn%ms{H zl8qHcb$FjA=wFJa#27jKMKHP@W@iS%#XBEvN|yahEpf%jYN6mfE_);b4DF5)8VCpn zE(UpXbT!8?tUt)4rmJLZ8!hg zaN!_X7}wKUpFRsduCcfZ zN}j8@eCott!VY7RO@U`*N_)6!VB8#wLuccR^;>Kh1akI@Xa(-DyZaKU2Uz$N z^l-VkF8(yo=4jG*t*5gLSB_q!`Ja}&uIu9wA3l_M%8&z{1Ux>%Nrb|mWzO<-LyECn zRXt;o3tEnY!A(JEzY>f^9)mFI4+s20HEW%01Pf8P@UeQSH=knkftG1An3j|&dq0dx zHW=$TijY^1frN&Hjd}ha%mw7KYA(Gj!>H-pb828Ju~Io~`U%NIM9Z{;og z%!B!?ky6D>AdfqYdjj9pL_-40V=?E{4~uN)Z>4S5$jc%!#AS?j-usO+HFeP6(mM>N zbRrq$IYq0&LIwC{2|VfEjae5Z^y85i>0;CuS;}5ka}&c>M;S58XDC2%vYGJXcO=4_ zY(vWKwL>|usz4v*xeVE1j4QwF5k*egy@1v7eq4c?YC|jgxWRAIyX&hC!tX+6dWBya zgflBl;J=Msz~-B{sE_dfF%g_1q(2|yhS3oVgj$ClF$$A)hf6X>MTWY9d1Kz&x)!7E zc9+Br@xq$fQo}+E!uP6$U*`nAgE5L4&@36_Iwr*VZB(UD6>k>JA}k?0q+&g z+J*&Ktung6jbUBU6zOn!>-U+CLJE3Be?*8f;$n96mjX{4A3CXda+?=z(4W3}cg?xn z9HGm#`Pa#kVB1tpSRe!eU8N1k7QN_l3sCBr1>yoB_n!Rs1GHZNCz9zNm`!5|d)K+E zBJe`G4ZAv2b$#mu<00TMDq>jNW~$QRP+;rn+0V?_^twg1bcdUQe%hVA1^r?L4E7GpYnB6;c#{f z#0**KwlA-f^1Bs>ultvoBvWoB;XZq=?SoMK&)tS-&MC4YQFJ^47~|ANm-A!WWqar5 z>bFX(u*x_6=U@XqQYl)JJM_H7RkxldIdCxQCi|RER|18UgnzsSW=4G?i*9x)Yg&>d ziK)$BiE9d|5W*47>mbh}NoxwqK?<|}Y5$z@5ioB}rqwlR$>c^a^ zmtuWr!MnE9W)5GOxZ)T5BEdzV3p^qRe@l{JoE;|$?;=~s;a;6hm!o{IBe<=T4FLco zv21A+8~|OEq6ZpK5z{uxR(tv5LN_S**n&^+?4t#k{-zvYbqn|^1(Z=by9XGz8_NgJ z4UzY%GyRTVcJMI8^&bf=-J+`^Ucc0)t|Il?yaJ@`3d8fAH%=l0VI0+wMdMM_kt6Q) ztBwd!*Ss|U9Y%NZkg2ywg#pL1lM0;#=~hh;t;iV84fe*@Rc*4xljO8EjjpIZ*489E zNHZz;)wJ~%LMZ}FJcSa69p}Hjp8jqNkAkcqS10;}fil%=QxTDIj*l~v9 zh}}7!t(90K4@;EA6=s8j5zqsJV0%W^qgGrat)}0_@wIH$$x0Bcv@-ecZ;!L>M=G*M zdT*eT{TQn>#t(p%esS6ag!^r&`F+kMir@rdLomfdy4#MrSt4p@{?i`?FSBB5GbG*r zXas>{T^=fi+vScOT0#WaPnamU@A`ty*;~3^%!cpCpaxR(4o(dB|ONlaWu5fjOobgsYeT%q_RvmS!sjZR43bi39h| zcJr$1d3TL)RX%*VR(pb6aM?aH{msKlEg>~I96&=3QZoA>szFvdV1xD|D>Q~ua~oXD zz{UV`IHVZ~seo#SYbY$nVyXzN8JLmc9oNmok#TsTFDr=+S}dsK=-?_`ALk&)V4;RZ z1biK|bH-T$DT%R&g(2B2);r?9Ne3WlAu0O@a2~6D;5ax<_mlz^Qjy#t?6^*BI8XT) z0CABfs?x6Gh!GNlvkSK8dLN%HqFt=|pVDyUvo~TRw|k{tKPL??t~l{h;8Rw;hqpDmm{GOo~8L?DIpJcB0)7>)X5s5izYP;WywoGGQ{k zYC)L(g_ugU1Yc>L8cG)9aa|=&%UA6j!Xk9>dlw4t2_%&(`7q4eU)PS$3bGa zy@cJ>@T74dJi-sf+u44$s?TnX#yFX}Nf zQeBPoT-t(T0$T&s)-!a>`j%o8*eqolb@aLduu)&yA=z4dXSouh*FnTH$BnK*ne%&C z30c!(V-VxG+z772m;<9!i?ARRF-+Mvl_-qk#~JBH2RaxWLXh0N`mBtvxpND5 z)8V3zsWRPB!IFkH03(H>;Fs`Ty>q>6XQ1^qr>Dz0oTsH+a{AvX^$r<#V}HoRtEzTN z29P~}U(8EGO4GIUi+6ZJoH#iun4~WzO`AAQu40<%Nl!c;!xyiHSE3dBF)Dq8xAgB- zZg#s)bVdv}pPW8FjfV>HUwU=DTQ{H}+^pp&Y%z57%{0n)K3)em3}lQxesHK~E;oB* zbY-6VUvF{!b86+kG!a58(Fmgv9Y{0b9+E=H=gP{!Tw&dWRvS$9DFC5lDYO}RGrLyO zlQdT`w)+wKIM+h$&v@9=1ZVUsra@RyOV&8^q+U=3acLpHaiZjJO4EA}sKf1%cQHgqqF=ZM z$i_-?t2dMD`Y{@-&w&h^QoZ_$ttl`in|uht@eD_p`*{?%mlaG(Uz*2+uEJavI~?yj z|2?T?hX31XWu!I@xuq(Wk?wLathKH4^>ecT@pH&FHISY>fncO3{;U#?b4C6gR29LE zz(9Wf=VZs0u=203D+DaoIoYzo3LhDJs>l*`l3H%UP>ks^%?$p%iq{owfM6}ZPePP| zVIl|0>VZI3qm1ORu$)EgAjn-XJ~8~RR&9lNB(cI>|GlOCW8Qaw>>FzUWC{dO>=~{u zjqq)@Me*1Z;sMhbQEE8~shPqfkHmm`DVp^XLe_1E(K*>fG;>1K-me*P)GEeGkGfvz zx~y1uyh0D-_2v0~6w4m}&$UJ^!REW0V^>&kn%%wnZ;HlNks%Z$HYk*iC$C*+bKN5) zhywX+#ys)ix*2-UdbnQei)!hdFw^Cw2;QBr_dRP~hM!4%`~3-)Kc{`oTwS*vl} zdg#o|AZ%mkYeO3*TAc1>Y;0dmS(%Bp>=yzp2+PNrGJdor!qJ&kjtflN_-78D9=Uot zpD&BE(B7A9w$gL?rVd{PjTd0zoKZ6)$Ja`n^4wohZTmJC%EEJFJ9LFfE{9s^wfY&D zX(p;87p~J*PV`txR2)yuw0Ejjty@s1c8`qZGDym&H*B7{p*8LtAv61 z$9EMdVY%{UiM=G=dzGzhIkM1@wE(`q;n5T4u*|*o1Dur-79)}Vvk)jqL+BM!$1}B6 z*Y1dEwCEL|bB4vbf$`}EOJ%txn;VRd&n7g_*B2S?0K*(OJ+xx2=mwjNUzB~S^BlZr zap-V$$~^=a4?iWO872En7RXoo*gCJp8is`Y-O_>mWy;xsoyn=F<*k}@T<ffLO@s= z5>9}AdI2+_3hmIPIf-M7K-cEDFa5Oti-b2S$`b+D{>WmLgq#_njRnu)0Ac@gu7hn* za$P&4?>Q!Uyrcbfz#{%{<+chb%C|)caoVYxpPs zcHJo+Ye0bR=efc+sH{J9*#GR8|4+z77IwD(y3AevU_Lfl{}T-QK#yZsh)%6cb~%4k z7X=SODMT?!JSH@6tN?qJY);-Z($K@NMyDK0Fm4YiBp*mvNX4N=r|$QtX7zmk_tN=g zz&&zc+qXqv;Ab0qZS|ZHw&@{Ii$B2%z-{*7x=7usBViT3CO8WqYoEOSdb|n4XY?#q z1@7say%zX*Ea_;ZiY&CYIs16oby#?{^WgWOe-gVJG50K<-FEY!ULN~$Zob6V7&}q_ zyn^iB_+=(-4(BcvI>v@-U*pkbSJCizuaPgEl+-~tla}$~*yvFjI4f-z`PXd>mN4Q=kHnV`VNCwXxZZAcwp$eO!q-s{Z|sT=KF0Bdb{wWe++ z!?xSmZjzr2He1$nm06vNiA|Y+D(g_%x#eRE8Tl98YR2e`v`w;URKV8Ammn;D20d5Y z9n5}WbOI3~vzMoDNHIIqGDSXt736AC$9V9wPsIAwXCV|Gnz8&!30lm8r{x8s1Jdc4 z>vtWtx10+n+@0OnmC5Rr(v_hJo+eE@QJHU+m&H3r&;UqQKi?SM9Y~J2Q9%5GD8IaR zdjIg|f868~JkMOIS~FPlbGy7dxLqVj`3(1$#)|UyslNoMP`+F-Ha{0I0%mwb13iG5 zFgd@}2uu97)n;azt2ps_zZu(`-zb*Vj{n3<6i>$GLCUT`a?-p7%*;v!y%%bFBN30CLW5ZP(n94w9ra zpAX#atP1DksCFe?$*9aI$ild%cHGrO?;G$~qqZ*1LkGV*&={-U-TEP<##GAP{`ePv z-%=q}A7&Ub?*YF%UO~egn8G#}1YV(aEe*t~y0mn6YDI?So$oPCj}DMXtg-?+(& z)3f;n1&UCTuv(`1hB8q1reYwiB>vrdB2u1zfB`OGZGCf&i|>Dr1;{tP9l2vb`CP+N z?UH2*$5pdWBN(=Qzsp0gc*O=vl|Wv> z66z^bny)FZH=SRv`8*2Rz#PNi&!;AKg7+(Wj>3hxbxBZZ3nV$okq^;J;ipi+w(0vv z8%LeVm!~DToCml=f#PRoNb5^Ad?zgmQMDFHz$)dVW9WnWrd$WJH%*lEFqGYlN!sw7uwr$4xuz)GRA(_SE^ijT=`}jho{l zMiwF}WBEB;Xv&Z3mhtdv%#Ian;L!JdS<<~If>l#misywY}Ug6>$EWyg;RWNYy@Zqq2}kO6dZ6AkV8!$>P?;1GdggOg-H zpB_O^qqPwW$EmxB1X7gRie~^BR4Clg6E66vZ+@F*0=-+f7}h0aVxkllX#L7#2p0lK zK8s*#D%Ep3;^6;d?47zZ3$!-MsAAi$*tTukwr!(g+qP}n&Ksv<+eue<-<)rZb8-H| z9(z4|?Ptw-CYLK|r$z*c?$62Q{WqpI^HM6u1xd#I7s^HRY(_@mmS{lU%=2?@p>MMj z4%)VfPvQ}q2c0L!MMq|JhmO$oqb)^js}&UsSdw$7q&bx5_{t7gFYc$8F8o7flAh}y z74mYa?)D)~ZjU2GB44y#kyPIGJo?scZT>ZJ+zg$~0f?NhWX}#!1V5usn8=`|yR4ao z{*_7B3?^Es>EPwXhx!oqFl>&LX&ui}D_>U0kOMy6$7ig2CH-XL(<5N7wUSbDeG|Jw zg>gJ^9dR*{L&~T$eNt_j!#7s+Gy~wEn)SC`-OxPcCxooGhuEKLpsT`muN&oO4$+WD zg;e$Oi4|nlw(?FB17jm#<92%NNb2z=^WRtHEUm#;lHRZ76owf4+LJ3pVd@62C;DBK z;O^nOylO)VEBMNU57R`$bxgSGx{L+u=6`MnaKoyrmi?{XYh72w*PnSsQ}RpSyhHaN zdj?Upc`&L%OFH3MqIV0K5>kTdUNZ;m4eS3rdJ^05Xc9pGvmrpsw5KBS69&59Ud0{T zJ~n}P0##(uT)!Z6^?jc2qW=3Q^Iu{k8^iyED`n!~_&>3+N6Xg!pIGzXv3=0EF9$TF z=CzZ)#G!*gCYL%vtt2)M+@DSY3rpKOsstv zK_3CXpgs))k8jzbj;-52$UnPadV8RIJ;y*&hdmRU_RiT1H2W7hFf<)nUVr;^(Xi!M znki|-CEfQrDZ4(h~&WFs1 zs%IU&qZmWJ;{Y}r$Dg8P6q)|z4hFC?R8U1bwK8HYI1phJ*OsFN7bYtydOdd+IYgtl$Q0{%=PIc z(j2RXW{iq|E5@JXlaP-0x5KxB0R9~R&hFRSo$Vg}A0I!@qiSfs=| z&GO2waUV*+EF%*H#6>J;YfvGmm`{hXzDkzuOEq&9j~N#MS$zThi=4L%il))Za~ZMr zW5Sn>P1KSK;kSWJp8l_wc-n{Pk^x~tCkL7P^0h*Cue}TyKyW4?QFLhWsA~V%0oolE zIS~PF@h^}ct8FYRZy2ep$KpOLb!+*^OP@8aACU^pb%Ys_?8kHpEktn5bntjm{dQ=Sl1SB}hh3LkppV<&EAfvfZh-wl+i`B{eb^%)f zUfDzidv|QjMa^^`CzQ#hX$^0q&ToW=1iXfUen44J<*&5o_PEvKBCCMp>@%Fa)WWs1?4eEw<(K|+J-1^q)3m6=!m zM>Oc6{&K5j#2P!*nhUcW(Aqsv9GTQcfv!|g9BXB|8Ww%>?rY&$lX3Tk+{oE8J=Ch# zrPy&J5{1XoYO~huZ4RG%5ygGSVj`}7kfWv2&UP9nfuHlJ0r8EZoT#MT zh3UwPYxXw|FbjimHmPwFQYR{OBMV4SX?0r?CX&~w$VoV&A~`&<+yOk)6UU9L@&aFL za=MjW+e(4*a^dYHaH44gJr2u*0^KPM#^^I5J1d+jmxhtvKb4u2s#^)~FIm%rJw~3U zv*bol$h;=SEWPGy4fojJsz5uUkhDPkc#Lu2ai}&9%NJ-wEZ!j0MPt@2{IYb2BZq8s zSyu{M*qZ40V8qN`w(QBj+ zNtn(Ud1&`OD|Xn%^?)<@2`1cd3xKRvLvs$`2Y~uzH{Uys#9?MI(u|x*S9jYZ*!qU> z`oskopCdU4=ONNqrx*v>`NkROQ>-0TI>@}E*-GyPG&S#jg9AGmrNt+L7iep|{K8f6 ziW0gGi*PS2A(UBsq4Jiv$NG%Yu$|Ujpb4{i5KNAZx8>t&BSI4gqMt!REBo4jqP%1M z1!g3=c<}G)5@P%YsIyUgEM$Z5D~aVrTbPy!Du@;jfY&Z-S`Vu~W#C`ac{o5W#mqxx!OgVIRWD6Rca$72wFu7%PPL-M z{K_p>hCZ^;0`K<(+#EsbQ7(`Il%U`b+f{slzI+Kd&9BWW4{KS+wY{GakftFQH8Z0K zfTQclZoCpjA+M6!JmrK-@jm;jRIY|@|F1-a4zcGp>r98EZT9za&hlVP!q?`|><+E@ z_8X(SutjFl63>Na{1h;@q`l>&XSMnJqaq*U z&}<%xSkcnaS(X$hqTM^->oRa~e=^4R={T?DjU@vXRmaLNCA!LncPr>V6RywvV6_Yc zdzeUvB2`2Grl29vmUH8$jNcPLMahqx3@c}pTC&C!uL@OM4<(o&mOl%}x0pgteOVq# zLtJUWv**hrNqj)vOuE}i1{;oio>V<>a{}GQ#zy}2IWiA8DZroSK&sc^QozgW>;43v zcl1A?1qH$k|22yLPoQQ-c4mhEl-|r}{)^&lh~K^XL^k>+21di~i&1t_LBjvrRSWI{^HZsWY!9o<|xVkygX z6KVIm<827{JE~oq`)R$VTN>J%?WMIhQer9{8+NiRL@c$Im7=6|IrO0|xAXFx-$vM! z)8`#@F~BH^p-rwC@?|sL-8W9SA{xYkmS2Oq%qI0zVUQ#-F8~|MTH|S^rbkUblUs2sKN#RoqDICvvhe86JMMa1YZq^Q7tN+F!JeY1%%cQc|K z2hr|Ho@T(>g*hfUb&H~nv6m*s=xAb$=-%iMkRn<{g_y5pi0GFY3Mmqj+hJcdlxmi( zPE2<@R>Dn%i%x+`Ot~V-#B_OSu#be9VA1ohqWidnr?=8l5Z98OY`g|zNwCiFR#f^F zQ{AD0ia=@uzr-`S40exFD7%6Le18qVT@G(#xyGyHfYUm&H@du93Pt2tt1}^)3>FC7 zb3UqX_)ul4wO(d61w3mC&;NN459h0(K>A~~QzWm1LLpJ|ERjhn00~FW$MLF_NTXNl zpR3df3Y)Id!J(#Sx=N%`lc;)945S34ICzctNpAb0lBtT;OV)BEn@HGRsYTtl8^s`! z3ru&)32Mjrs_=!gn`kSB=uF*?s7~yF#tEoX0}fcTV5xZa=~GCRbf>P`YHY6qB31f1 z?n+0jR8_`(Mj5CDNw%FM>SD>R&sY<%in2yn5;)&|^?F#Yarm1|)9C2NXooM6RA3O9 z%ckh7hUg?VGE23U{OV8K;4Px?sjJv})*(9@j9wM9Xv0rQSmR81Ot##KJxTbiG#8~8Z^smks4bS`14b6MBaE< zmPOpUnEH1H7nBs16Bb9!2+ zOV;rCYY>)Xg(~?@T{Mvq(yZ}))tidU(j+IfwdUSsl@?!Z$dQOS%t4muy-A=F>-T2eVQsJQs2Hhy zst{L@p=?=IKuG6Khh7IQllfQ>kX?qL5Mk{G6^6=%I0jp{nhlk0ov7<7onKV|Dp2%3 zZHmOF*0rAcU*bD!-@=O1eRqrs8U)EuMg?Y!I<AYLlr zmw@Z83(2&nAvj$0XKX$w79OK=gy2vl1E#Bsp~t7YiOZplZY-Lx4^kyoUY(7CTjAQg08 zT~l=dR*GoRBNVKkTP@MM#i0XWynC0F1$qHrI<93zl9A@1Kr1fj)Ba}hQ-r&f=oUwfLWGKSXjc~|3`?rI~W@RsZog>tc507vT( z?y)gwyJ#>Rx6~oyI?xF|f{hWxb-YHP5k|jiZIlS3@|x}W!fQ{N2ZFq2OTSL##%UTE zO)}B**>R0_MoDn(41lfkv1!t--?2dN;0?}c>DF87=IY?Nlu=6lBa;MC*UFjR9jN5h zjvB?>&abW>=`mi5b?$3cZ48`|tt-vglL7nPFHjD{GRFTp3I8WBF%uID$A3=35=}*C zKs%D(P2GGkGi?f#BN!xdF`y%ZMUn2hd4g5V*;)A|5S=KBH&R7{Dz=RM?Ml}G_)omx zRGJ(v3Tax@_DI_<-QGqSR*vXx+$>mdo<-~Cz&66|kK1$F(PbCAix^3wIA;#+8gu51 zg^W|~OzKfzkb0KU?vxw;s3R_e7b61a$$;waq|w^UPtWH?^ioK%BlKpnPwMFVnY%r4 z2^mO@l%++9P;OGR6Ro$a{+u!P<49T*%mWgRHu8)R)n1i`^sed`nay(}{Mw2dw&&PA z4fsk1<6kZYVjr48sKaRq7hi693&NE;BM5vl;`UgI-AOxsd19XiCauHDA|39e2GawvH-B16Z* z5k!G)Lx8*9G5`S+Vy5H!uc^29x+It%L_P`+#kmq(;@%-oT(FUM{B}IzRvO|~xIO|K zke;NG@u&XuJ_vo@36#v1+Q^I=@~#e1lmv8SrCD(pZ0v^M_N9Y)jHHk;^F>{#JZIGO z1#h8^G6r`fmd0dlXH8VErElj0>?+`3)}CEf#f>a>-wwKS)r{2GCL%%HSZ;YQLbwi_ z3`iI~!haA`8q%q7wdvIKj9raXM8V8vX3m5#XS$zgvVncFMCH7AE(r6|EOqj4T92R$ zJ0o?yJ5vM>`$Z}L`xL=T8kxY4;yKOiA>#}V_!4i?GfC%4QkpD?|;-PDw(H!LGrj+I-LB;(bA#1&}?=M@oaLv6QpjBjyRn zFms}iDUL8W*>eg?IXh^EtaykS=^xsBR7EN=_BRy@f33_^9An z_7%?<+(m=El}h0xG=-=BTi)o*r->?}Eu@iOOSNG%FqatK-BsigVbF3$W}N$9EKk9a z(b}_WpXDo{$5OO-qnsk51G!Y~il`TeY<=Z>Qy*QN8jHD4gyb z!aSC+j3#ljZ<|hp-EN_H3xnFqhgzoJK&T{6MX2oIo!R|tan--G2J7IMM$xCdfyg~D zgH9BXyfwXrNsNH72-F98%Dw8G#3cD#5SOrp@dZzY(}USH)4(0waeyN5WfypZXTZGI z8TbvnGozQ3(5~rM%8j@s;F$BjhiL02L?9<9u~>=b6)Z z6zBzzif9n9D*(rsc2Tziyg!RA@3gks=jwv5>y?;o9pK@9@rGK)8^C7UC0F}8Ml!E6 z!Ln@FZ;JVPpTxkR8hdTo_w~;UC=|rZW>2s5I*Ek`m5x#!F1K(z&cJ(ppuG=Z1;_TC zsUU|DPXrA^3R77F3^WclTLW;lCdL!UvqjlzLs#pqnGnr7A@I z23c|vwcF+vzoVnM@Dy$9FJZx=)i^|pOS=_A{Xjl~&bl-h)IyqmTbgerH znynfTw_e96@LN(Q{DZUJD8R@#82Z+$6-UOy>Y|(+TePk(87&wEYkFXr@gjHu9OF2< zo!qW64MN4z5yaqUbUCCB%96oQ8VF{j($V;g7p5p`G-P*Ls1@G7nPbI_JR01&DVH4) zdB~}9u>#{tV?@$oO45b+>{9-t`1A(}c_2>aineAx5P|25)b8(Fxgq=8NWauIA+o13 zv87!6sbp@Mi;4!BFGz10-GiWb-ick`)0|vu>GA6tOy*ReKp#aA)MV2Ev!W~Uaj^}#I#XUJM?=UTU_mK$?E3$0K2 zKvdg$agErz`@GZQ-KBJ>y06ht%+`a}lwQ3Ee}3afe0J3Tt|S27%0*;C?w}ezVpQ9o zV!rVwBx1Kp8YIrGu_tAJ2lvbM^%ct{?5pXb;|G^}xJc)Qk(T>R_c0GU%y@J6=WQ%) zs_jPa+c)q*r`y-RWq7}9sxQO54ugPRpEkO8*|a_xHmgO+uU3s|8AoGo%aV;tzRSb+ z&G63Z?R#jBuZ8lJ5%=HM01V80^Gi}@ff-bOor_KlT`ZsBWi8ThG}gVG{HC-sAh@4XxLk0p*={Q!Iu>D;LeMHz4m6r%Y_X*L@w-QYs%< zhwY}ha+f|D944x*F@=LB3|LQX2Dtup<#05q+haPuu|cB;zSV7gvJkdS)wcRnU|<-h zn<8v2n19l&CcxH=<-^~7^g_T-$nt~)B?O^S!xq)Ol3O$FG>VH)5h2|q_fEG8b{7WLu7Q-UNHBKRL~;?5-=Aw>g#=H#e?-lJGV9O-*%#Q8CH z^9^ykg**6P^U(iB#Aak;|Ia-1Z!_Th{}Zu;p2A^Rjfue^5lt2?$7C-@bCxZww`XRC zzXhb@hdKYKNK)0>-yhmz&^Mn3Rq!~kbwwHr{xxc-o4Xzyr~`&GdKCwq*dvEW*M5EG z{nUrpoe56EV995kILrorP!(tjAR|4|WYG76ZAzZAJK+bTF%+2ud)`}Ws=AocOeU4o zSe9;j{XVxhyDQzW%fepc@zHnVet5KHj?zGagPi9OcvqVHng_L!>kD@}y`Lzg1CZq}wZDPu+YE=3w;{3u_M=&Y&9r$RC3h3mh2F|PQCS@B^>X35d#bdh zI|%P2QZN`)K~O9y=If0L;A(QDcf-9bb)(l^=O$`3vK2V^e5IHAqD8Z}vpZtPkE1WP zmT$V~!CyyjZswtC>P4TUa~JhXIVUyd{2b%?u5|rs%d$uHr(h#Xv_T_TdY&MKJml0F zEJ0?oDVllcqj6URu0C@9_winq!-|F*xhsn6$B0-TZ^LGC735JwKU>0k&1E%*tLDaD zezL=WxYTw?4OR7Az{kvVq8R?>-0n0n_5&{Zu8oQ+>#pC|lev8W^g6Y{KUAb_9E^PJ z#7<71|IfZQ$?V0O!H&FWi+e21WfN!z!0ZCosKRT-P8za)Ns;Bg-UIfbZd7qrDZ+`( z>5+S-663iUM8ihqg4l-l+3v1_GVRCEo^DEwmO=LN#ccOR$KYVPFU<3R2ymbAx* z$oM-^dD^s}#^Ik~PSFZqb-?wu3Ai&M?$$NT1&iF$3{8s&=uvoGgLTJHAsd$Qk%h|Q z&&5e-s3`5w#^}gMxV|4xQ$?p6hk^z-+75L)xcuSnWN zJz+l(Y-#-5-C-7Ba+f;2jhP~3L~9$FBoTXWP~Z(}$h43#MDws*g2jKGXVRvYf(t-K ze!-yr$m$p$Qa>QUxR}T|+5y3uf}6(K6r%Vz<-Va9YoDpb#I<3BD?sPQj0TRtCt6g- zgGwygF)xnuB&0ErWlLBx7`oIN7eZ8)*P6i2tn4*pBNMU?U3H0bNcQxfP+fSk$tKO) zWPx+8z|V|@AP~ny(Vv+Fk&X$TUeO{WOtS~xkRe4I!*xCqe zIl*+*M+`W%PHInqpup(O%q*^wb@0NilWCP$ZlX#oEccP3MA)U~1Yrotn$l^l)nG`n zqV%~!QgHKoGN!yCN?CD`iEwk?rf~Nn=s1jLbXFqIQ#++0gk6v@IyO)0aFilTFzIy2 zFG|n>bM(w??mq8VCb5iruHE$qHrcg*C$_Yh5-s%AvNcSd^jG+udbT}6BP8QIKeh#K zr6tS z-P!jJ>eVT6_LGE#?c2}0829lRsWgEI2;>q~9u&s@jaM#coh^&L19s6%KM-BNliUDk zUuKPB(u3)^99|kkN=8<=LLMvCQ=*EZ`UlyH$jWyi5A8qFg8GtI0vTVDWXYsSwMeh8 zNpy~4k+b~{hK@IdEIG37-d6qgRAA-(J3`-aM*ZO`^KX{H_{3;MAqgRZu5uZc^)mb4 z9*k2-^FpUJb#M5f=^I=Nj_??G;>-5gqS*`IR$NH-Lr@E29nKn#;ka3=-f$qv#Hj-e z-0)4q?MlwXulo^}q*u?XH{re%Y)qyk#<>|8Myd1lH!{EsGt`*>Ad>R9@&wd)d9^O$ zn12$pIsN^g*$8O-^Z+c6lm%2zh!@Uf925--VqiH`*_4LMZ)KKWGhC8N>N+w&z+EM2 z+Hwa4%%jhMA^6MiCQmMq*s=u1<4K~kGe zBvX>ar}L5`*$-oE))i{Mz%#*<8y{kk6aUVtRTZ9h??G?KG?iUVu1nAWS3UTc6z_(< zE6bZro8Fq+Yc5E$2YTUbrAHL3(K)WC`ZPuzlKx{)&5xAMp`kKodBBb5pG-9w6JwZ> zT^q^j>uG4t6mD&*TIz2fDpcENnIN}X6->(81q_lO!{uQL)tj3OBcp0*dNVRIav=;M zE)xVqMQ#P*13Bj4?a;?S%v)4cBc-C0DUNfc!f{5&JLtPv6~eU+hkLxLxkj}v!~Fnx zO|YEet;RQqlOkv?WG{4JP#4aL3g5^1tGn0fLdnL1sV% zu~}4%IzHA(JsEP?$%KLxgsLA8P{Iu#DP)f_JEBilU|f3ar?%keg9>qRd)`E)qQu$7 z8yJXJi3@&B_WVV17Qc)*k+V=u;Bw04-Jpnm9E+N_lW|ryHrz871sl3{YggnR9S*Ep zU(|zt$Fb_32C-4b4Gb+^K*`DeHfNWJT^*oRSM55Tf$vC%>~GYG!m{ zT7HWsvUl~r-Qn#t7pC3+7Ntw2@RXSKVSbpIkFtm9rr1N!g9P!98nJ?K|98(B7nNs+ zal^m=i!PoDRd0)rre4S34{A~r;3@6$M7D*%rEQwB1Z#jGmD8B!gU6+F^J%KC?MLgM zYD!W%-fSoBcUuuBHM9y92nMv|^yQF0-@5q?e}ly!h++wPIYqs1Rj0mFcFXpjeyo}} zn35FD{oPe(Uc$ty$niX$ixjR}dBkv!_OZxawbh>TpK5II9st5Mcxlia6F}AaN-S(O zrn;5O=dj*g*g<~sa%Ahax^9U5Q8%zc4^B_zV=s(-B{AZ%!VbSjVE!h5t)fP8dR|5M zYaYwj@eI(@#@+A zvoBPjG(RrJjzG3qnoNa6xy&j-hTC^dUH0pRjG1thqY8o@6CY%=Rone6U;$huo#>)M z6pOPN$8i>@j;9%5Yn^@E6>K}uXb-X7)4sNOD_hmD1Lw8Z8lxN$pAUiVJ%2l3A1C(i z6Lr0FTV_U3>hNPL3S}i$^=(aBB3?1&snBhr}wg_ zhGrfz1=hjuUKdM2m0rsaQlnowO0G4t{V2KTs!l_V0zo+}Lc~NplQrDqnY8(oL|TE) zc&2wD9?*hNeaAD3kJ+IjQ0q!3#n8hB>h>k@qbPc?y;C%_x&2;#D(_2+BOjYxv)VKi zgLSBO39K%oo+!jbNlN))YmqLN)Gsce+33>99WSEJ=w-*$p5wSABKJ#5j10;|bAR9@ z2RO#DB84<8bSV_rul60C#fq7-rFE#7z}84HBP1Quq&D5JdXiG)$7cZRBOGxeqrDfA zK2376;ta&;xHz<&2%?FN9G3SW`#~ZJKdWYhm10hC?$r!iT#VjOOyXjv9CA|Tdmk*9 z^|slsR2gYlg-jtWDK$FS3>Sv1>z6j=_zHAc^-;=D+JPygS!6cp3ue0Oe@={!7fZC; z%R9$F84yt*!&t1->Y3c&j42|q+hBQAloY&X4c_wi>E?AHqfC*K3KHVI&fl%T+nqPF zep@RA@h&%fp93?U#7{e$0_#H_nPt&wK!VJoPi$!htv){)RCIAPN^li{42zX}yb4Z& zvW{e5B`v4`I6ExkDMD6MOXEq{(^YuFwBWL^R2~?MuPT2wALF}j6TALUyMs~A$OU@H zVzmcW(>sZ*a^AzPIn9=#s@x7h;6EYGoeuGvVpb0pK{68jNd)N0zXg(+H&?-GvRnR9y^&-0sac_SCDK5 z&Nm)zhZ0dg-z0F?tP8hS=tL~vn1%=^Vo066>1x#y)Wi#PodVAf>`*~in|LJ`@I?0-AdpiN_^6h-SyCayFU#TL6Uv)J+GGEBhhrkSD z^?Bj7*{S6RX&hKWc1#(KU&_zM21-hlm+r{v=VtpY{^DY)17aN?@65BE3WHAdg{93} zm`C#ZGd|kJ90Lgw)n4gUWIVtG*he;YaR+ZYBhx)(!oT%RTR|uVqG=MVbJ#xzI=Co3rB`y*D z+vQY?u{?Xs43-3g)D0?Y|CL6w5`y4wWpA7Ah>hx83y?IhK8#mxnPnJIdH#j&SG%Lm zKx@{uE^f@G^4UCuW;`>}N7!?%W78F2f%>&u-6ru89toYz(PA}>wcc#Yfixzi9Mc-W zB{@JI_&p^N-q-8AWvtJ8p1ifF2VThECgC+gEMMbDb+IjjTbSRZu@Oc`A|*Q(wf>ox zb)~pu3r&e_6ZCq@6z41?%=0BJ6(VF4vOdHK)ykiW2vQI; z{$q{BNme6$wruI6jsS@c;Bn;4?kwS~Eq?@4SVvHQCCOTeZm z*MM&lG}>REDk2at6r$eXNrSUjLaYx3MOywA$MTzAuR&YAb#4MWV}>=D@Gp8ap5t)4 zENlvFu%xbOKmCnwRl<3m<{6l>2fVWX)9>}AMCYPWD;_sYA6Ia+-k7h8p~>(cDqX%x zNhDWO6#g1QXF5U$6|Na?`rM}-MQN6bk`}guMHNArh+e-P@7p=oh4e;LKBa1Y7e{O} z!J)G+quTh87&-P!_`yYpETJADwi$^+7RV9to)JJNKT2mCoMXI zzj-y!k(Nq%pf&nV{Z>}ILFW)A9wJP_o=E?SWTp(VH6@yt6el0+Ec-lmR<+y{6t6(+k zbfEBXp3Up|^!q{smR*KT!LD}GK+65umyq&#&iU#EG62CdDh@Z9&IO7fphU#$+B|Dn zAlc=2C&+6!!Hw}W+sl$s&i&3JqQ}{3ak6qKOjmS|O?r4bs|L$>0YesCgp~6ra$v=c zK5!Bye1wq;+YA3x(s!QorsA&&`~9Qg1>1pH)s;28y5^=F-C@@I*vSl~c~_hJ=LOd8 z6UySi%^o&tde=ubLY_5HDHkb&f4LuEl4fN;e2WJ1zekIt+D$njK-BE~A`;$11wqAX zTYC@B{cDxCyA;c|;@YBqKF|DNn-9?cYa;v~+1hOXr|NR0p`EnEhWalNI-JQ|D9}`A znSu_%qNWxM%@=e%nl>S9YHWBoTq1IJWx@0Jieqp;7t#dE1%}V+RgW(&EV$e4O5XDI z3&QeqAcFZF8nlMU)9>97dw3yl@ecyWDx#ZnaAZJmz%htoNe3r=vdAQvIJw<>3s49O zDXbTn=XLY>aYj;<6jVELd)&R(;C-smr@5Al(fFvcP;-A&=ZcWRnP-($l8J=WBw!=a zC`dID8evH>G7rk5Pj+|v4~Kan1z{Qj|1q{nWxetmbS!`5?{MK3V=usU%mr8MGbO^w zGsz|zeUo$Qt@+!S9(bS=a^9(`dVxYuK}?Ak;cro=)x4t&DOMrjUUrEgLpkU}sIKa1 zEUHhdVk%xkKq`nRH*p>B+4C$UjGVl0;vlv!r?4hk-uN-VVO_c&*AKB`SPto3Jwd%0CGTCpXH@$vtYr*JGCK z;_|+AjJJ-(7+6#I+(1=DW(#+<_;Hjt!*1@_!JM?w9fg#+={7~$Ke4Wvsgt$tm5>M5 zoj1Z3UGOKvZLaar^>eY!`L~wOPYXI9Ef#TgRH5OccX0#Q2-G#*U)kz-3g))GWu2$X z+@4J-J&L?(QZY&5t<)dAfr9#fq<%(Jh)U;Sc#H8LFh%h1?D%?`%++G2fuW@$Nio3+ zP3`5Cj5+r)a0hSS-o>|xxhE-@q>?#cPB9IaigJYOxNV1M28Ez$Ff0OyjrK&LM#C+z z3|+SZDpQfE##cbZT#@rv`ApwpuEraq3>b1J;x&U$V=n_(&_TUzH9!jlgyFkHG5N?W z9&*DE(Y}MdcVDv^p%0;_^ipg!R@_7AE5L(g@KBGVK9Y1grBJ?-;a1S zqqalK!-*9gyQy`C>i!WX$e?$c77(`Ob(%JnvFn2_)2~A__DT4EwU|Ez*ND=;7U}D+ zPWx%X-s^=|V5~0nyki^IIM+`7-m6(aVGgvdset=TGbgWjt}?95E(S#wh&sOISL{|( z*2rL?<>$m!agJ&}V4*g#`s06xu_iHu{85xnz=SICon{Hv8*j;O0gBPop-H2nH>sMm zZ9`qvk?TJ(QRGqry*R$`It$GbTs7S&Ya0AM^(ePgMqbsrsVY=_!Hq;!7+5rs0AKxB zC`5el#m<^)ygLkq_%1pOdALPT{tg+9SY)X_hfa^OWK9OIY|j>u@uFr5V?;VL-^no- zsJ@M%5)eNXct1zn&TEdm=G&?i4&1m97YKa^%da)JTG3MI92Hcyw?B{onwNtyRk8wc zWNjleVRS%`7LQiPm|vv2`y}-sAWStOZeN^%AxD&ASrAbLn+gDd$J(7q9&o%JUGf-& z;}pr$B+pk~DKlWO8*I8QiH%GT{|1BooB7coa%O%tBGH(=6*$|5`b;_YE+uV@Nm2p zFKxl()vA1P}6~3*K*Vb6h^~^2fZx*}WZAMk(!m^I> zSsSZ|&dhGdrk4J}G=xWZb+{cuTCiyaL|8N7dR>Q)#d!STj<;c@E6jeeSub0{oo4~= zj@v3^HrOm^rv&ieP+MttKWFD?MUSg~+P@|lS$2P54+9U<=4o!^*GOeH6PTHIChBst-Yy# z<-R#KNZ+Hg&+#f;^ld?`aY;+7H?dC(w+v&tkLl!@mw7bJjmx0ocv4@of-Q@2N<%2B zj74wkx<3r!7=9=8T!fl%5_uBitLcHFHAOF`m`M=?|896xrb91tyuI-%t|INw0ia?nJ zq{McPj2z2NS+X2C!1Q&JG=a%HwyXwW|2y0FT?$7~D689+%*VXrB_v1M&4-H%hlW0l zjpsRpc0t{@r&_1FI>GWy%9EXSPR|(nv%=-b`sOtau4a0Ey4Wh)$I>_Di7Pqw*zb^a zK0bFHsfwO6?17h>hqY&nD5EeCkV)D@H-V1yk)#<9qb~=rJZNU6 zZq1aFlTmB%ktQ8nDs~VB=z%Qs_}j%h;SV|eS2p+0{$4i?182?KDWQH_&DC%@`idUw z${tApa~&)}qA1wsodMgfQNwlgcZ6N~0V75uJ~p}XHU~#sBB69G22{l@{`Yp~9h1~1 zee4?*XD8q@C9>aIe{lfSPCBAm&HWYCT=PbA{ML-H7i!5h4AoU;3C)YBaf*GBj|lM{ zQ=%Or2?oOqAL~AJ#A&^5V~?KMiF&q zyUhDlEWIqW{5c9Ty9iAvW<$Ho{1 zq)<_2r3j*DU|@C;)n5h0QNEr*Qp_NsTU)cAK^djS=)G2%eM zos-9%sHl$^yW}=pj5D~;vUzI&fb-fGsh2G(ufG&gDpK-C%={t(9qC9Ul9)@oCoZa5 z!-wO8)+jrH=j1jfhu6>Dt5JgE#BrnA;r4i&faA4g`)YGER`j#={DtGAQJ1tjA}u_} z4xJ`0Ch7gr)heYVA5bX=P8+FEoIiNRwSq13mzb~i<9UPm2QM!(TMTMOaaK=Yze zdNX)~AV|xA)mY?xB^p`GqgBFW^xz@+Pw9Ev_XSCn#^^<>_W9egOn8>(k5_?*k40*! zRThFCJ&b0gT}@Raai32sf+sM#cQ-+sH+5_Emk^^a1!aNfv3g;5G5faAq6Xk+GUrE1 zu5S`G!BYe??Yiqh6jFmK0+mT>)KpeATt~W`Dq@clmJ}(mFdSt)2wrRJE$)Cw+VG}0 z-4oMb6X9sTWv@xG;E$#Yt~(A!L-uIt7{hP`#ORMDl>REjcAO%mUF;+vJ2Nm+F~~&9OA~Au5-HD?wX`Nh zFD-o2fUW91p4Joo89s0mC!oxQu2$iL_A(#_>m?hk4QyRlgUU?%Ug>43)=8(67sn{K zBXuz-LV0ir_^v2^JR0>dbqj4(2}!G7QEO0ip92MP3fjQ;I&B9{28%=pF6s$mo3?7_ zIx)az%SiTY6PsM?{yEjgN5PE~}7ggH2XU`!#<(H_PT9Y+UBDA~+IgO^LBeb0(c?wC5ItUgt2r^bVT4NKkPJ8`q~5WOA}E@QOpDwad2# zB?Q$80Rm8l+Y;d^=GH6fjOcHpqu^8fWOe9OPs|q4akPY%=^pIaXAw$6X1gM(>=iSl zV_L2p=#Me`*2>JmZ)Bk_&^c9xnPoLy!Vxx#oO)jSh(Dxrl=o4)?b7+u8Me`?eP%Z- zOUY__03@Wj7J*`<{4CMi$yBm|cv<;Hhf*|5#7RT~?*-3w{9A*Mh{sMa zpr71YTRB9S(wSmF`hr|AaVlJim~A9LHZBPzcSC)QnR`8jpvDlpL_iI*xOyyza}EmR z96b$T21;RdiP0AjKf6ejD5!2qCU&e$(pLWgDKUtpHch!bCe?G(Ob;1*AAIQ6x9TU1 zD*zlvkw!WN4p{9CzY*4hw3ysb*qWrHsU?htujp!AfW9-^QX{4Aapz#APKRzK*)tY< z0Ca&^_>-zO)$XmNEn0P2jjXo_WpVfFKN-*E4JCw6yqcI1&f;-nCH}2W5A?kzo}xv* zF0o2|9U;*MzsesJuXBBvBC(Lz2E5VeX48*~xvtKTrJlw!QIPyGdx&+rh6ANs=mxJ>~ZFf_S@xwkxlodBwB09HC36ZsN&vG^kSiHcNK zMm|ur9_hCzAMVVKv5gvB{`dYkMvPODa3ahvPQ(6BG3GbW>F$}yit3`<1s>CMu-=aL z$-9GdCd;m3$>(pcbEkoQ#I65_v3Kgy1WMW{)3$Bf=9{){+h(P$O53(sX1D1CG-x4 z64bivbZ6V-cv#4+4~O3`M#;5qqLd&0;(G(Y`#IhFSJ^M1F4l?d|Jup^H+C%x%YQ%> zYBc}tYqkHM9HHPYt;n7v#PdMLJ4wFQ&G{PAV8fFqiF*rDyO8dgN}0IA#Vx60XIqa> z2${pS%5LNy2`q5f_+`xkGuB5g4ZO(r{s>*K5!Ls6kX@>dq8dVZ!g z_ACY;c;tel_B4C^y7}o;Q!DBpJE`$v$(mGys03N$joGZ$4RlbdLKQUpULqbTt;*({ zNkAedpF9>OHXBN+G>e^)C=M!|pCm)NH0_Zp!gz_fkWDhaASLglCe5RjxuW+#;%3Gr z9x5zFZW|!Cfoo|QrUKhbgQMiP*54%ua*pL_ohAr+)6OW0W_<$IT(gr7wt6_N^X1o< z;g-g1scFK?neg`As0vwt2s3_C{EzZ;RqZ;W+C~i5F)^Ns=%(#t4_J451V^}e=pqvn zR|w!I+HUTERTRR%HHX61aJlCnX@#qv_T$T!nB_L-qw#DVAD*za^BQOuTunjJ*zLl<+PfkjNIuGFiaf)JO$2iXsC^fBKJ!W(@Hdiw6KzL zpE{LU0cmTg&gHl05$*dYm@Ricok!0)nj7IV0+iKe&^!VLN$_q|E`{^oV(J@7*w;ft zBEJM!D0)i;VSnA`twOEKV5M3t1#x~u>=Y-|-*ZT(FO?ld@9D>-q~{j2iI+O z4ifThfqB`VjUYzqBhFrIBJZ&8%W+?FllhF3_ovqX%0%`ZSCas*Rkf=s`)Njj?ebBk zcNl#ma*HB<3Q*zm(>%K%VdczoJm}?2eN{Vw>99YD)0HsP7c0%zx$3ASN^hu*>|FBJ`SNc1&wwKax7nVv`W5zXIUsQSp z)rKGifYmX1rPh$ijC5-c0yi^}G5G;e5<*y`J+7ws8EmFJHnNFU#ZW$fbkeL$a<_|H z9R?fQiRE{ld4aSCku)@Z`E}6-j|;5OrO9_#x7Ep1|AGlw2y$d(KRn$et#|7fZH}L_ z4>RO4iSyX|Lz_8rT10+50t*X{#NJ$j-fkq^K9c6Y;SM^@oPmSeJ&(wlCpBOe)Gmr0 zA%ho0L43bLk%Oxg;<&wF^C+=veMhUaGSP9ae{5x{XdX=h6ZwakM z3whf?j#y)vy@DIV|8_hKkpo_5s%3WsfWP|ODtN>O`dwcm_MK2+y8r3y+~ zG<`r5HbM;#;IoN@C({Z$CEZWPO24aif^!Jr;P<;}ReW8kr6QhKKZwWGavUqri}8!W}sSRl;)Xe;y~#sE6xat8T-lR|}__UmfHm6CL9G+i|0U@nxKZMP36+Q0FYRj^it&HFUW<}9x;ulOhe`tt>U8(j-1sghp$V9 zN{tt2qt(jJn(U;zn~X3<3=4pwhR~689(FGIV{*-_!Jsj{eW-WFg2qOKx*^YGXF+Q# z7*KH&z%KvFB2jM}1H*;sCebwY#U|r=y|t#RoGPHl_g;bmhgRWX z)5O<5o&IeMT@u0E;{sAo<=M|hOvH@U;N|nDzUL0H*kF5RFQD}P)Rz0PnP`zyy?En> z@XU((Eoi%E&2?!DLmISi;6c36c>Cwzd=QZ{ZAD{+kk6~gii)Y35Nn1<&L_?*@nNcn zK#woSgpd&M>tg-M$gHKV%AaY8xW~4#^K%il&&%lf0QAAiTo0o=Cqg5fK8&$v&JU)Q zASfoM`V~F4oDh3HUYCycj=~zHoiMUf1znH9gh7UCXST!j%ZZG_>S7k!CRVoebe&BT z(p1*biGyAkx>EeOD^Q_4(_|X|vwfdvFH_A5-na zPO;llc|A<6L41ugqJb)sZ4Yi;M}mhcwjN%y}#d;TW`DKjhEe<1sh zG`0S*q>%ni^@tY2l><7~vP>1x98q{B=h`icF`#S(6&KbiND^VBN-*XKch-WNEg8)^ zBpK1-g2_F&UVK>(c3p%(-~`Dcs6Pk$3j@kHZ+-CpWP{HtNC`1XJ4pwvsR<>f@8cj=%2c!nQQsO&MiFK5U<<#$#A^a$#Wpk2YI#neZ}~-qDCnTNcs#;< z+c|cw5X;}1LT>4h>{lTDBIR~O)tTj{hkmiF&taF7wj%K^93p4N77c|8HK|I7gglf{ zVYdomG%-+OeXnixU9qZ0eI!oqQ)%sE5V*VEqwO#u)-}#!o#3frr!M2e%~_!KEWA~# z@kZjHp(B%?7QJL%foF9s&_>Z8t-iIc+6P)9+~UnEr5WMt1=5^MLSws0Y>3ui`cHP- zAEkgACW6ksf#Pb$wuyoKDs2W1731aU&m(13J`JqHfbVfWNt5N@H^FTuF@P z)DIfc(2~D~@eoO5)Z%<-oR%#mS^|gUrp!R0U;59k8w@oTVzPcw;6?joP&Zqj9APRR z@`To6rel!xZbD{@dx4YFfVL&Z&;C-d+(!ak#N6VuzKGGivLJG^RPr zSYmzKv<5thg;w?8c63xvT9oQc+8Orn4P;CV&wu=!FRLzDK{H4RZl=kAn9$&sd`_rA zLX=2+?0^{?Dx&{aHo-aO;F7hS=0SHgxpe)XvXAZ%N#!AB9;%#`O0BN+C|%549n(=y)@7FvhC@IgmV6NdVyorPtbO>dfz_iNz;?R>1u0hW zO8T{&SG(U@65msM@T2)zp!$P8-)#O5y#D+_@Qw`oASi$Us3>KUa7|98Wb3Kb;ZBF% zJe&^ozdH1r1ZCofh_wg92?(ZhyzXC%o>$m~9UbrXdjt~n$VeSCNOz(l0=ZwV&v$-o zIeuK+{tn>!XAD({b(#wg zn41+L1wfO55@pg_3IuhTl`jQYFMF{HToTQBxEx2ydWHisEsstIC>R0ukK^4%AkzEx z6Wn?3Nex+mB+67)*XD1%ZdG2sin8onqXu^BD;KQ}3In_?ZhaIK z{Da&Ztl5}2iBATQWR9^tvS6H6hX;tO)E@z{ zF!L>G>iolqp!x6A5%Cx%1V$a{nKHqhwz{7(*`DHEl8*-))3!3{IMZQk1$@2YMg8NnFrV-lKiXoz5*K=P&o0=pck%pSL(??u!xXQ5@f1vNco0USiwISs z<9Ku#8`YN&#(Izn{*}*G{#G|cV(I|uYgbj)@*|s z1I$c@=Xnz~5Yl{_C!^Kc4cAQuy`4^F@Zaqh1ugK_nFJu@!|50IR?smcU?X5s5QCLO zcz*S)S*X?9a`lT&B%M9XY4&}SHCWP>6*TxVU=Rqi&1+h(jcD|;h$@uBM8W$AHIhJ? z!JsZ(S@E)A$RZM@$3|$N*pMrTFp2gdT?^m-xHRJt*921hK2}RuZnfqKic&7uc#zC{ zj#&Fm{zv=kR-<#v4r1w_yFFaMDDq^{Ox5g(-Vidl^11-P0{zP>lTaTRYq)l19o`Oe z{g{pZTmqHec^Bti*YjMV5g!gN4q1IErr9tOm$5|M5i18!;zVAwYE55Kid+F>e(Qq6v)IeGnkX`QF;SA2w$gHUZU79hMY;D| z2nMASp(muL;UBcwrm2$WuTq+i;)%QB+F(=cYmzPgJw>`E8GzVt`rsj3Nx=Os*dWiD z`2FxI`}cWG^Z|pOnQ*=GbME}`!6Ys}+B3(dA+$pXpZV@(MBoam&r*GJLrfNVOYij$ zKVjXCkfHZY)1AZ$88P@k2$$hxG{$_`(zfDn$aS1oqntkZ6xX1n^#KB3o>zqW-h4?_!#&i{t^DE2`dx3;@2vikD)Ih5@}0|8h@T) z0V<*34Aabxn!n>Q*yiE)vXGrGZ~rXUzb)kd>v|gN|3+eB{r^v*{@)UcbWaA1I>=km z<7T7ciWOz&^s?~S@0hHqNmr7}S10uA6G2J|Lr+_s<2vLiFK%6d70%2qu}p_XO*N!#Y%=K!ocbg@FPK6ydEqS-jb-M|kBATn}@1+|Uyb&pRw8R*#JHZM2wwevP6RM-8yek6)Pt6F0S;B`H4N2YfYX60k_cGj;v)(_Dqe@j5w^IMMy+qP zV?R=CQ1aqQ|Dz=x%;|&tEW)!Mo7OC|lOf0@Oorp%23#?<^j(bdu87^~8g>XH4&4Uf z?3S(waPqqPk@@JbaZv!ui1%WPhI2(2wZL;YV^YK#U-?i#R9FVAZ#0$$UaO>u&Q#OY z(Dtv_s{;@^3EX(5AXlfqo>dD2WB0&JQg@G?=k78O!o2Ww_8(83Yy7K=VT-MuZQ5Lc zO-fxW&Ruq`_G_EN@m)Y^A&~KP@zTTF6l_^x_=yYDf8A0*@GyW5(58ZhPw! zj};MW;zYuS4Z`K*jt>Pqk8Ha(;}Yrz7V*M|C^G_c+_q}!i72AT7ITn^01#~X7wjTx zLvx6sE;a=M-iHGAz3KSt^4zuglWA|0Q$2tcG!c%6MBC`0qySc^aPawV{;$r7WLb}= z38BFgEVLt88qp3bkyx^l11S;=(dJ74X{97r*bpsYPzeB>>z!XQd_7RS0}J?R$O%!T z2!xdUeN2tQz3)}fKpD>AW*Ijk1O8V=st=~F?ZurU)Sbm8$%=z>k>>Yz z2D)PcfqRirXdXqxxX?KA-n^0HI|jZowE%%)hN26EY9EakTVg0FVIXKBG%O8Y795i? z05ML27{WQ)EaHoG9-Oo?+G?jm6sD^0r7WhZw0nm42JwisPf1pOP*nIF{wn63(Y@OU zRnENKA}>$^0&369Dz{XT^3SHzDdHvQ=6e^)5zxd1i?_~x1ZL0SNs{gH3o-2TzDdf> z%F={qPh4hz49K3#E{UxhG?1WZBTZFrZ0JImi0(y!Ccp)vO{Uf}!fDYf)<{2H6L^lr zbtOTQVt9OL!0w1TGW43Ctb)1n$W=S=LPF*6pP`KLP4BB_L3G~JKNK5IJM-)gjzijQ z?yfx#_|Xz#*B*jOBWz)18te=gnFZyo2MW0s@)=?-*Yw6{Wltm68U2M!UI+~2lGPM- z%|SrKA;7`>$$2U^u!9|b-5YPkYa7CKN%SjiZ0OI}kV<5h)C=oyG}6mI+Mg`r)eT4! z^juZ0%nnd!;;9uv2&&lB((|wWolEFXKM?H_@qII`EJ*oYJ+j`PTgCu?UBmzS!2O@- zK+Np_xfIo+DU+1Vf%MOGq9`CdG3Fg~n02sPF+qQ)&d?>0fPICK0zA?;u|{@5h(^uovg!0HbNFk zBx>@|-Y2hTOD$aKMQa92hT1FVDEr}YaP^`RyD{FQmm(WVwH~B8<)Fa<5-KG5tbNfR!e9mooMa%rZJAgbprT2F%C(e1WaV2CG$_3=>wDQX zLPxqd+qM4or%_W$wq9!k7c+~SzbREwlD=^L^xdH;?72XzR|#%9+bI%ebtM}uqJpb@ z%jr)5jY)aJuts^RDf$u$GvE`e0EHT(~&h7@xOoN=vmv2(IzdTopD3ELR=J zwd;vFu(tz0k5%e-BG{Y>h0Iht_=0e&$hNXQKW7n@Fq+fvqr!YEm9G@$u@bxhi$`qF zCLD#E9gC>aQFjyT{US~|6Y@RTV0M$UHEA$pa-$N3i5bxh0f*0(4u%0RAUre$ zBr}B2aJp8yJxRykhY$4+S;+3N6V$HI`$n!A@1?(ZI69}X$kumvE7xndktpQy`A~dSF7Nx&dB<~gAg-18#d5Xqb`JqXL`I@O0=1X`)lM~; zpJ`Gow(N36pL|sA$9nfBooa^)6c;8Qz(k!2J&>L~Qg-SFO+nm$zt-1YCB9Q$04q}(wg(y{!(EN|0-+)!_N>dDl)4-Lp;+5%@1|xQ3v!YimOnHIsiH!o380TcsUMy z=Q7-0Uany~%Do|I7pi@EWw2rE98%U3)?d8(j$G%jl3j$|q%-OD?AcR1BQQwGg2+>G z5eXfhlf|klhyWT%Iwx^0Wwj8&iLGc7pc<)aSutHiA zT89H4_n`@d^lsDJ%F(l8#)kn0@0d`3?KKf)dHVQUmhD~%zA5EcuB9~a7L>G+mWX^N zrhKMDr#q*v(ac%HZ@&yw#_|8{R6u(~uHUvS9w8LI+y2(hQ zW7?b(Cp#7eFUd2;z&}SB@W` zvLl)=+B!M4`!?~L348W2#ysOFv+Jbrz;9wq-Nozv0_6!pS7YR?IMzohLxi|?;9&m^ zrL!oz_}U(#TGV52NBy9Oq-BJd#(y|Aq6!5fGg*pPFU)`xf9vcg5X!KR^FxG(T(xxN z>|7SCkl<{7zQFp}PHdDR8go!D_DG`6Vt%$dIGvWb0?`!zvPi|%*0m~emIvCx8(~yZ z%x7E8Hj1y6XvyK_&?Efu6vuSv*RT~FeU5c|=UGv8yTHKu0#LwZSbG@lI<>&!Xb36a z<|}X~8)i$HeVvtW#QIsVb+^34rw+k$zT&M}Uq_lX$j3gn2Le1oF>ct!#`7*-HbLOH z{8HoENYp=Wn?Fj|d1Dt{F`Dh{K$Zv^JUqr71V0f2;ZHjLYxDV^P%O-B-2btpHmxc1 ze;Ieriw2Sa8XA)Q^SIt|DhFaS6-cwXkCd}vdCQPE34UTFZoXho6XJrdm(`>_Lg+!d zzS9Z+j_<*t3;+erfb2Kg_g*nipM%4mPu6F>d~Po>bbomtxYV)+v=X#Y`7Vu?!*-eU z{nF^uEVLP#)c9^3x8K|KeVN(_mdvF20l{|9#}@zRDglC>Nv_ws%$7mdqQ(_X5lu}T z6Qxe(UO(}?K-#H~RyEOd%A!<+6LTy9!C?EHA+w^Ph z>>enJOkt;23!RRiV@a`XTB0s=27gFOoNNNSXnEDW`NX>|8P{-p@h_Zwpn z3if)ZGV9{NP_!0Is^zVY@9{e|eP;q4WtX{ds^iNDJxPuWMVD;tQQJ&3=t;ftp^wjA zUUj61o~tlDqn>mIHf_z`MrBBn=aHe1VOY8NSNd4$N71#xp9pMDh*U;z0$A%fWYmf9 zi@e52sZ#ENH@?EE7!h`@y;WF)->y;uY94v^NfJuo z^*^3c@S?h7bN%fMz|>O;e|V)>MdQ)fBp+zEH1z!JyiF&_wPubSyt&-r|AHpV;F85A+F23a zxp~v;z4EbrplR2lO=^E`WC3m#1E_(vf`LKa1B06{-X+4V`(Z#_`Owk<_Z-eYserq` zBL0C2c(WMK5p;>@+-s^|_usQtWgLa)!hxG?pjff_) zpA&gsXP35Qx2XB`Sf7+le-S)XGM>H07me1AwsVtrx3fCj#0ufv#ro5Eh2X_M{po30 z(#d00%B>I9#41zj8Jz;}b1vh$vo-n*84X=J2HlMvLEdNW6R@~Y#4s&f%3tC0qP>V< zpF9%yTM?n?UBI+>vfc+1V~~i|lBnNIu`*4&Yqw|fL)+DK+W7_2* zD-+Zd_Yn&>NOj&pe_IiY#Vh6vV5VGx2y&I8c@R^pa0{&+!=&|`Ua}5Um?#5?u}Sfbw8@MCEs*_{ynt3} zf!l$*+cub5Do!Y@XX5hdHk%|s5LS{MrDzw7);m>i~2&Ecf&p5 z&wdrb+b9}2V^B+r8!BWYCNC;}yB97cR5sSEUl4`*=}l0^Z$GSrV{@c*8&af1xY+pr z(s!hH#WA6wdm1Ib$=2poCRa_H%aVWL`(net@SWUCF7W%6Kwngb=7?vQ!%z~Jmd(wx zcIOSD2oX7w=`(?<=oV3;ivRNo=UY%zkf8{(PEwRPn5fl1^&wquza!=Qy5~PF<+{(LmDn!fg4#tKVtJu0gs+V?;J251y zn=_u)?R27(#+^tIw86}S?h){DUy{V43@-saE(FI~$JjPe*%E~LH@v7)y|RT??4XB7 z-Nr2%y6&$w<8AvUSHG{ROD2hQc~ikvW++j^LT{9xGGW(XgN$KIH37gHIYx;h!>7wO zn6l60*uC1_%_gKyWWh4bG_|W{>{8MaVJG+w#VIj2rVLIYrYuJD;AwEovzy6+4~CQi0Epea3Dja)UQOs2VxiKFKhbsWqu}iY0L-RyQcfb(0kwk9P(I#5m9!oo?mG>nRw7kxiV)zE4HzK6Q^5KI2p7ViWpc~ z(W&fwEB7il)pzL*@MR=f5)L7>RQ@D0)HG6j&4$Q6 zR3gD#9bkX=PjmbOwW;a)ttjK+10MCQlv`b}ib#nSDr%}oS6HP_bG*$`Dx%u_k{m7{ zOecA2H|B-oX#U){?WD*64#N-i%wU|X{r0Ag0QSQ$1d!T+kw|)0_$!9Mogs8J^v7CoyWVLcqB$SM1+(ye zQWqit8DMDRbszl&+4$*D`aa?KFRhlUQZ_2D+&djKuc}TH72#(mkO{CF6lbC6Y$=ek zZ88MC}|(Adn}m zs*!47C#}G&BUdVQrZ(_-025VaQhYT?w=Iz^+O0Er zYxu1CzhIj5)8z!^ir4lupEF8uR4psQeX1W1IiSCOxtI`cf8J;LXh=ve^5PqZorxNJ zU#;Tdv``ZQGZCn+5OCgpPWdOTBLYt77RXaYc=^w~GPox%+Uguq_o|rSL;#sTbzyR> zb2_8;ncg?LekZHbm&xOy#Ogms$>TE$8GVRsa@gn7dJBF$n%~H`gh(RerbJ06;*xiNkx?SVU}(M;Ny&IE zNHQFeqQ=bzi_=UtcKbd0)hd#hHcR#bva{{qr_9=W!`&BucUjttJcy(gWIw63EcAox zGtEMCP51)BDZwYmWixzTIY0j@0UIz;?Dh|DdB8&pO}xIUf0$!`-3?;8oYVXK*9Q1M zo%XXZbN$C@f47#7%f<-$za^mELt;?(820BVvHL>`r_zjN*4U+W)eakUT%>*R&RR+?T5 zVP)&vHE*vCg=4FpB1qPJGDq$@@+{a+O zJomAbpsSiouRM0jvDdUy;WT4Qv{Vplm}5U*&YmzZx_F~#O35~&UrbZJ4S6=AYj z!Gy4fUkoVZB$|JVS~qd8$`1$468~ppv}jGFB*BU6zI zm}6b|Un`=PXqC*9845$HsRli;$~o&a?<>(mw0tNOv`#G_11&{AWKYJ$BCMmt88jQJ z)EXBGwZP#$_`n<2nCQa@!*?8Zi%VL2gX&b?E3W?Q;K~b&lQVgd<`NA*t)d zfJvOJ;$?_I=-^Sgg)9jK#DJ9b1N8uINb{_gHzzAl(vh{P<*Y*)4S1t6(&y>?58!VA z)Enk?(TgdILO<&2p!}t}AwbL5ZkI!Nk9#>x&wpp*#kUd)luJC8TC=NNymduYM+D|Lg=m;M<6tfs8Vs=A$e-RgmXarm z>+Rjr5owhl3M_2uexe|<=T9}0xL+$Rqe7+J3IbnxDS98=82JxCnnWln0@Q{YigOf^ z1<#MF@rtm4-1n^1iNX95Q{T%=nX~i8;v^$Md$fvQDnvCrNzGivL*}?9zfFeTiuGew zCl0?HtGg^KK+EwlZ0%C?mwV<|r$u5YR3&_6zh7iTMZBI*up&Vk{+=R2;rcVQvl z;*!X&0xlbE9coP5{2Sj zjIvUWQEDQuK=q^4=S`hMLSis`gAg4_$6nf~0JzRHv1%UlkcR*&wU{q+Q;M`bb9x4%AA4Oi$)i*Mz=aSWARUU5cn`!GI@%|j)mB?o^5m9Xg_!CdPv*+UcONM7 zudC_^){*NuY9-*Umt;&blnMMvf7dSzE?};2T~CPixZ<9Wa-{uge#s~@*qwkm{dVg64L%PnEN8-x{#C^njrnjnIj}mE>~jEgHD5Y*nhx3s0$XBlVNpzsx{1T+ zBfu*#c~oqyyWD0aaJIIcYicMcaC22haNBwK4f<#joa4QA=YlrYll!s0z7`{M#I^V& zR@ZQykzpT*tV+U~ukh7XK`w^_&Mu&?!y7iuLW<*?SiIF0VBfVj7ofsz)&#eKW~-il zGi^9;?%F$QBxEtz_QHtUYuAq)lI|Lu7QQq$yg09odxL7f3NP!wl9Pr&wCR7n&IMA8 z7Bff(h40g0Cc*aYP4~Eyy-Cuy_PHdi)#g`!KM?73JW|~h;#Q(n5X<*mF0%>~7kxA} zML0W+j9r$*O=9%ge9clP%enppikE$BOkJ}Vlh2pcYS{p%tT~k7^2e>m-I9;@;GeNG z12Hjqo&8TSuP?wmM#|U%Ls9<@}r$l7?tWi16Pl^ z0+JU(pp=!v+RUEJhTwhBuI?A_X=yWKJHDm7x?_?fuz$RGjt%K7GWQds;z5lZw0XN> zakNMCE@DxUPeiN;IyFNYAi)^MzW^<$Fv_4jv@glUnJ!4BJVNixTy)D3iY?_OfS zoS9Yns7P7x?4IcvwbH{0SHg5W0jn=(9(Ks;{y$I^O(d>!>0uqyVZ9zmpw;xKx@vg6$j&d2~d`1 zN>-58{Pm9b zS{L=}zrJPuC;S2nEBk+VNV>IT;y1WZdj5ecow3GvnZq5Fb5uCS=*%&ER*RXT5)S)T z&s)uH$4SS}><#@t)qf|`aVKwaUlyWj7M2?~5E%H0(SPgKgNF*XGU0vC4|^ke{Dl0x zME}}k@PE&s$0FyRUfX}R@4pO!PL%0t-}0T>w%sbA%{-EZ`t9W2q$@?;^rENI?$`C{ z`*8ta5o?|!f(V}MU@z5Y)A;BF1ZMYEJQC6RaEV%l{ALib?7@M+1;s|>uDp(MKa$P zk7}$WUr*NdO{@Hosi|;YEyb$QYNcLt98c#S{|@RZk6)r7R|ybal{{Q7G1D%j798K? zQ?p0JeOjg==qfx{UVx`$X(PR>yM<3p(Q`(Zk5na{J^>G&1y{oJMF1XB&DOVDN8(4^ zD1^~qeTE!PKVnX}KBqV{sg;^h%~lnkA2wM-$3-ETmDa@L8-Uv*x>nwW9&qb5)Ut~j zE#}-!Y?_ZsoSzEK1I=WpnuIBuJc%s!dRBDT!MbNPf1XGuo0y!iM08olVrW{CHW^$OQZbJsh}{z_C=I75G%x9?+-N-DFpWfxJuH5U zc)Lh7bEs(eFa}7(jL|seZCvH1rdlu>jd|B;oc)~>&C~VnhmWcf{@P-oYj(4IubVVP zGV(lTqUwWTy|ZOA+7#zD*t*sv8>D;Lh;rY-FlxxxO(4+K4~JycpP_D$<{ur;j)zmM z)jKhApz|hg4jP)Kr1%ldu+;{Wp=|uSY=XOy2IXO_a2e2N9tzjL(h8!Gn5+> z&=fH1D(t*zbt)y8O@`UsDsAOLrXoYue!NeWdL$@Y(^K5=;tcOTGjgy~{OafJrXGkf zxi~O5S}yA%(I1MK2COd`!6ED2xNeIOyb zY!^(3eN-$cE;TkJ4L336EFEm|m`fuSQIF2jEMOz~j{r9jWZpX5XP)+;mY7qEE4}(J z={X>0pc?!UYO{VVj2yQYG;x6XK51LLMnDJ>Yk@WCxg!3c-iIS(MUQcxET(_YutWCW zgSLEMh9>Y3WcGJ!YZ3m01fn;tYd%Y%B^X}1foZG}gRlauTzEw$gA=CcB6KESCWN4L zOSb-|*5}fIiVL30@f5WH6wl78L3c!AkbJNsWqCdV7RZo+3%k3M1|T=%ST{Leu;P-w zkP5!#L1h6gCvm!)+KZ^Kf@s8p3!k>go55$5J&^Wlh~Umv`kN{;br_O@>+Aq-xtJJ! zVc*$(vX&+~1dKMn*o%i?668`Qa-Kwxkid?15>;@QZa>$L!CFfPdvhiQr-Q4i&=^S` z6;F*Q8PE0o&tD&>~t%T;DDNOHSHkT=4}EG z8IO>sE(}mANjC2+vh9kZdEZ(_U&HZI0LV#=sXAm!w5mCGOTa8pcyoLccW-3kwfkPS zK@KC0w{o2QNb=+td~0_CW}+vn{-VxBKZ%z2bgi;LyNVeI{Jt{O$w;-1VEKDJwQb&NQfh~ zU`0fh{ja%~vaehOKuUkUo=cY%#Cm~17n6puIK%_(!mQneJ>dzJpAuz4z!0>uZ_fcrv#P7i(TQK}TTD#r22I4ne>W9r$DJT@1Alg6XEi zBpwhH&3h!_*jsbfI6^6K@cZrOWJ%Y#sZKCBKe-Yv;E4Mw9JQ zb4Zb7;~N*RhN455YSgbz!MiJw-C2FxOszI6Ff@hg*gmsTf*kfGval7rW!`LFpTxn^3?G!K0QMj z#*g`+;tD-`56!bp49yHwbeWj;yay!`7q6G4k zBYd{Lro1a_u!+&Ws$v@*EIf~=#O~YM4BroJKOnoWEB|$r!u~(;U|5(r{^OA0Uy_ux z(fWT$(%dU~@~CJ8t?%gkWU`l&`^SY30+2Epd`*e_h=~uF zFwo2wFX8TV8T=O6ZMeNM#IGbdrw|9h{@&5)ookMrA4yI&Vy(pa=`DMar!eP4=#A0kb$ z8F5j2mgn>`MccXWU-8f|GC~|taT3%GV-ckT6Yu@5VmdkRl@&WZPhGFNd#0$1$y75} z_kvaagq$M3aNgS;_G=xg-sc^3)-xnYgle10E#G*eWy2UT$jGM+DN?4biQ;d}#qr9b)>mykfqJT9yL<^2>w1d>!koX! z^0U59Wp%XNn&_fGMhv=$YVlbN9x(*uLo&H@JdpDF)bsp?c43vI7N?GX+_v`WEOY+G9xmAG?6EL9wMM{PkwxXfnIby6w?x_eI6yC0T5y@TW^t&{hXvSu z4mz>kG-P4c3l~lS#FFJ) zDMFfOcEuw+IQoZb>=?j$EV>=e7V=y~0V%6J{@AHsSo&G(`~NWZ4#A>D+qUJlZQHhO z+xFSEZQHi3vu)e9ZF~Ro;%6aW<}KX9s?O4i87;<`y><0Vnjhf}K^OO{nhTFXZ7+zZ zVA|s_qj;ps^#x!U1Y*;5B2d4bkOGK&((g(H4ta8CLxiWLeGrR36YPTKpnq*cY-x{$ zf}{VvR z&uPMlD@GOe-D67J*}|uiw@nirSb+%npc2BM)%X%Zfwv$I;R))gAcDY~X;Vom6igMg zWr)|;G_4$x0DaP|T>lszJP3uWa|t-#)`P2R)1WucWgJ{(%QZp)wBOM2sgDmn7fe=M zrcHwncoKN9+REDEsUHM&&c+Nzs+^|sgJBqLOpYMyPlUs}f$ge$a@C}*RPIMMCm=kq@`MVrkB z=Vp-oT&A!2W!h7Lg;-*;?xA%X&6F*=dshe!j*1H;!bVtzGnB5YP;|qjCst+wxj2@{ zFF6%7T!}Yg6hqXQL}?uXq5$`Dwg^Lku2KbK1yBWuNTBTWUFa(48D^5)sYZavsb)fs z-Ok(a2QJ_AX$?rJ14h0R;SrrH&I6qUYDK8TV_gb!*8a+wK_q7t8eI=|7VOT@R9XMh z@DszrM;-v*w2zSJb$W5S#)vaxpqwjDjps5W{q&HJ@Lv2txAVoJ$Exc7C$N96g0f$` z{phkk!N;Un;+b@e$N{iS%iZjUj}(dfzP}z+8Zwj(lzNZf#QuwM$GJl!tqQ70<5I5z z=kJbq&N)9PQ@wDye?suO@sAzysZADtXU6SK(UI@vh}|EUmA5?nhnb<_9c2$)nM?qgK5qu;i#xi$3fNQM;=L;XgvYQIssO!^Z<`Stx+#?lm$`*99D2 zqTc5z2Dw(I*kRI6ZWCb>E4EaHuL^HCbRehEWd)}i_bFkljCLulbN=`3B|-pL6=NGf z_SC>oT&;WG$So_C6|}lw!h9;su7yBzCe%N%sU0_vuH$J()8ODOtgdXd01ymNn=};4Rf|wJ# z@(pNUOMKm61Hv7~jL+-EdmKjw!7R0bCD)U1@;LbQ=p7HW{s-dzw;Q?(vI4?JXfy4Q z6aIY!v2)WB?=L4`9OvT3%yyOL)24kohQc*u+^BGR=G|S<>-KQHnY9|rE?0HI#DRU9 zZ2jjHRg~gD_|Y5*N|avOiJ^OR)d}lH>crV!3+?bW=~D}&xq2VhD(@)Mw>+zxzEuI1 z3nshCwHK{c$*Iz^LHpa!&T0PN2Ym!XLFoT9I%56r6hJJD|0@fhqbcij$cEH?Tc_|Y zGA+i?139(h%AO=er(Mz37{>8W|6{r$RUBGuHuC8{7vWE7}jp$6Z%+vwMgQr2U= zicKgovOfAOCYABM&}!;%wbIM~)to4UNXsHI_)gYp`}Bh>%7{{2I5*8;MNG>m)6tIq z(Xy7Bb+VN=^Bq<%6YGK~hE(;q9C}=@)u!6}-7({$)~tH(OyMVQi9Hm+K&<}v$(Npdw+PSIn ze5Qds9*Rsg@MSPxD3_BrSO5aeoWqkoExYo3tu^dK)}n>&>c)rA2Ov z!x4fj!l&8^B{MKbLbLgzs*Db&2Eg<@q_&DUg<71iBS-W$+Hpa>1$u}+ zkkM%$+d!?{aOt3rD*1>N z$iwYs_yqZKy_1Tbl7~!9(|gj3VU;hsMmT@42U1 z`n2Of;d|e8t6vE^)~hD#;~Ar#8buKy7W)oLd8)=)t5I9)fXEh%78}Nh3*9nQf-n7T z^z*k*r=*c~t%+03k3;;ufSz#KO;SE08-gu=wH>1M2@ENIGj90@^c&^JUvFYw`mMFN zrke2IQ7u9xVA}6#?A_ome?jm@S41A|!_$611&JT7Cb3N3p+XL)oA7TkjWbkK61O57 z0NdGC!Hzb>fJ+lg4L_GThUOl}BXfuVWW}#%= zn|Hwtq(-5b_H}BPISm=Z*n*IzWlf8T7GOrS&;lo9kU*hEMfQC^>DnP18x5DyPmhDG zC8BgHvLdvV-~?KehQ4nbH(Qn=5!-_;0KYnlNkP=Q%MW9!30MuC?WN|8+N85=vIYx+ zm7YNjwej>EP=HGP715WSXMk&QhAgq#qJb|+DJ2ZR_@a)#qqB2p!Vd6Z^dND=CW#$tTa#X~z{?p1NAEl8F1lau&$n{7$Yj~uG6b8bj)};DaSA_A za$r=5!G5BXMg!4Yy$%kbAwj%%=8?)RtC0vcOYj)-my+hXz>)}8#?JB1>?r?e1m}~) z(VhYMT_WlV`AJta)zPQO3+n>#>}mZ7vbaDKBxEPi4muw43dLCyWdfpIIacGbo} zK~J*C#$&`mh?t>8Qv*cHWsUd38=bY}YXfM(d!GwiZq}k*94A@aGgQg##n3 zj2e4%&fD(VPul^kMbjDctUbtjgb!wUO{JOu(xgrLwV@R5@_386)0wVY3bzfNzn}!3 zYeY+2?w$iUM{SHGwS_MrlnwkXiwZwwQ&d})TW0(SyUF@(CT-`B{0Z-dJ6D-bov`Ec zps)iY%6wl6Kl#g2%3pUict;iKZ z9wEUdw(UV7MiiH5sBT~^9e>EWoFLGBv3HFH{mw5?F{WsPh22a|k@j)0(%zBcRtp$e z2H1Xpq^AsYkW#XaF-EZys;HR|UH1SFIG6-*#CQGMNQC6L>PjGHOE8JIh%7=*+?O`r z($+TL0B2bYUAufr3+CF$LAZYC06T!#BlvaAwA=GxfOaR18_NTKh>OEEZMuwG7O@8) zKXwJJF&WJyUk93fpg++Cp?hJXmAG3E*zR0N$nau@SB#N>zRB7{c0|h0`QXyTW^}m# zo@iKa$8VEG7vgwZ5sf{g>Sl1bdoLf`cRb~g9#BGfSOq_b5f+%l z4Wp1R$lNyd{HpDNhtTPn-BXWJ=E~bP<2BW({v!FeooB(mEj9=blYTjD_y^SJ+%e4Q z%HcksdLru-H*$+VY#oZG(w|Z^4Z>sFf=Ckn$i23C>4e$b@K>Dw5k~V=?;2SQdPEup zVJij2Sp>u`+x}j4lf&B%9j z{*o6&Kl7cxVvSQieqJXGC?qve#ca&;>f6-$R_z_xE+&kx*cw%D&)XxuXYkMOq{jby z{i~j$L-Ze+?Z5IDF)_3KFJ>Foly>^R>pp{bl6Dyod7!Z?(k#i+#=l8d)?H;3{|~ec zh~vml$K{Pg5#cJdxRvr87egc({KGb%Z~sJkNJ)mT1QDgTu%u_a8{fd+%_ID@@u*f3 zLJW&)Nk@+ygcO8O7WMJtlSLuQt}pNR*L}6ks_P(_@=VQN(jYS7me&ET&v}gl3}C#S(;#jvqwX3z0S{aI843Dff9tu8W0x@91A`{giKj9g zOx=sOlQ{LEB0*9{w2&+=4BIGcKPRrAx%5ACYS2*E=HVwV89q8!cXiFvg$6z!$3K@v z47fbRaTLJob002~44z(=|5X>G)S&4m)kPiJ;x~LGDg14`{2XVr|Go>-{t9Y6@3_fo zX@j7k>KWC#{-ZU`yM>dv)%H|R{TikVs8~MP*;uj2<9K-<^>K~i%%+R{ebi48y1 zT%`=oS%%lPP>XJV=_Ue!5$eTA7!Av3*0e*Cf%(gSlU+vXkl9nwQRr}~y~-_nrS4vR zW@pRgf?TLSKdw&VEf#!4;PAu!5PsW}vVA^lBqhcdd5%GYn30>~L2aD$RqqgZ4<78z zKo*jIF#Xj4aKt$Gx?EeM-}8ju&|p<>sxqSU!3EBJHA%HwV(N2KCcj`a5`_RdF!%#>>IDiX<=z|IJXqlicLBoK!hJPoCRnlMaQ3WrTm zbU{!WoOgHLxP_h+O!&{8`bh)6CmbS3PS1OYJs@%N%u6<6G?Dn$OJPb#|h%ZF^q2I`qZlDGAcb5 zC6EHz%t4Fe9Wi0|3*Aez)_0fv9nbeyHV|rm zr=Z!o2}@+w1Obf@Nf%_)q5NxDn6b^4Ej30-7%VR&n6($H!%gfmOFUK%agn6{kePDD zGo&%QfSOWv=a$SzBe9{NHidu5|B(>I#!5l+C7?N)%)vxrwk~c=r51Lsjz>Jb^my`C zG5b)18OE$kCzQpgbiCaifZNaQ9BlTGbLo{F3)w>7iTp|E(99PBW>ONoSTBN>@B?iR z)f)h>(l;Hd9sxdN13*C4b~Yv_(Od4hII{(!C7snDiLvMcQ>UP=$aBaX57+2&_$o-% zL;~Vh?D5YpKe5SyEmJxZ4Vx3;P^Jd|*aSpU2IfD~)@MxQ! zuyvlIlX6o^25;&yq8&FAj0D0(o%HbVZ@>c0sd(j>ZsQwo0seDbA;PipE5lcS<8+>D zJTrLzF2ShMimd%HN-+9zU8ZOMD2So!{=-2*welo_O8LuTQ+c}BiVN`|R= z<6FvVynV`o1Pq<444LpysTg;%D8-A=JI8HxD{UrmZWUgt`x~Wtixj*z&ow=CV&ydgS$2x{A8^Xw zF2V?KK{E~39AFH*U?iT}#vyLw<@19gKJl5pBe`hDp|-Zfbvj7lR7l;+@!aggyN)4m zRQcx}&e&p|V*3&#J!V3Zq3$^@6>5q5OI^QrUixJjv*mo_3($_J!`;x{$r=XMIlyaK zP`75&1wmi=yjX`LP;?WhQ*l(DkR3pT0iOt-^)vJIed~+J4YYowfRLUS!f_9Fkmw2Q z0ptK_z$lvI)k?p?wky&P#JXR%)+&x3xE2nT;^4Np^!-9s$(|Zt1GI?$GfyZ?1^wB~uQOt0 z%9}mUH-Hfj7^*e}s(cc)*3l}8bi%BLj^G`d{oSlDqc#bR-ePArv9AI+^{>Jl0Q{c{ zxj}08<(=+nx;56awA^ajMY-8j*;?UE_C2ll8xHP;o%%l!7~6m6F5~3l@&AIXt<1u#Vl;2RV_1L$B5folVOi$~lQvbs_w8 zQM>lss5_Fp5WaUhna+sTeXFf$-FZB^Tn8P>DP;k*#p07{`1rD(CDJ76UuA~nRhfQF zF*r4c6b*4;jro`?qHaH-wmeLxHjRoy?*6o2XDU}zs5(3?=F4K8Br1b3!EA)FcAM3` z^hBdYOBoBt?cSH*{j)XBs0jCB3>c^Z2qiu+Lc+NKT{Rt3snU7WC-FDwLMA}zo&hEN-lEpMP-dPYAZ)~fvt&r^5uY;L=$2A!b`KjqI9AzvPp_K-{WLw$AW5ZgBQsK zVGwA3lg=gwG8Z}z%^+<^PiX7pr|z!FMJ>I}Q4p9KG|f?D`>3_DkY2l1PJc24)pBCc zCcM1_?#1QKDvpEfpFlL#ux?R2bXvTWC2>+>?QBoNY!DB_ctGg;d4)UYh?nC3r%6>m zy5Op6c4oFSzoc9MrEtWfge`$@0Z62OyVcUC?D~k$oEp-G^qcnT7*h(9FDwOZ!q^la z?=Rk77O_U`eDj?`ylUuCK8WGL@td^~XCH6WOSC52zA?s{bo-%%n=GgJ`}40u@vIH`DcnYaQCWX{KQ!YoUFs8JkI z?tw9z!JdR^!}^#dm?@cey4Om5#1Ysdf?pt$l-QSp5m1&P4yz65r}kgYwbT4rGlboP zgr%u_QVXyx7Hkz(MUzHA?r{)P<<-V3?$dr^dA2AY^3Adv;&|6-F(PezbuKh`?vj0O z8s^I7l4Oxr+M^dwp9y&vL2?8I{0#P8Q_YA^9EUnm^Ovj%JRLNGtBAMhp51jBBa?=A z21&)#H;5Kd$JVCx;yGP`31VcvJMA-kG}X#Yn@Cd0q99+uyR@3*zbhJZXDt@A8DC{{ z$K%~}7ZXeYe1(nS0Mj;`*4LNq)(H$ENZ}mGB>D-}kHZ4|BcLX<6G}IpUZs_+IA~yC zwWYI|oI%KNQoU-~k!N<(Qh3(2Hjyn0BVj!6Ev>t%r@mH687{cBG{AYSF6e*~eQNUO zFhqr$J~rMP_h&C9W{#&IXF~mO&f)MiQDAK8tQbhb>V?w?d&StydFF_m*(4O>Z^w-O;zt{+8vj~~aENP&VxBoh zY-kxzrKuCy12iqm*c2z;5{w|Q*H$VfdT|+{h8;77KtIKJ=V;2Q@h7!4m*|kU)3=OQ zU)?Uw*oO*Xs875X-~50LD>}F@vpTln{*f05;RVS@iyU*-g>ZpCDGP82hXHXc6l1p7 z16MzaW1Y{!*@gaT*z*Pkf>|VI7vmGEMXtVr&|*PNCT)T9*)v^L!66bEAA3hgD zhZ^|1nP?lh$WO9R6(gg5OV8uWh@v(}aU+<4dSp3xLriKc z0#A@a4*Lm!B{z}r$QO`&KO|?u*aV5j2=MN-o5;Q4QY$d_!bhKXRZ_c`%XW%Y@;hs# z2Ow0GPZ4|4%@&JpNg){7GI6>;Zx-~MgVoOC6w0&AkCI1c%%v}&nr0wOtUWqC%Iq)? zOU&DvIl`#7m3C1|xpz5h{23ZMJB$uqqe~f9Rcq;kx{TeH1j`)>2)XLg7@kw8NK^2O z)Z|{H50=1~%O4B3H8i9uT}m6>y%n{+L#<>=!M6g9U)A4A$#9Uqsjv{!n7zrc(M*-= zZVsG#h)kFgsdLhrxu(PU5;^dM(-Yh(__@6W`@f3e4q9IspqZQcg$5N{TpM40YfzG<rAxHp7Ayc_xWPq?mvb+91GHJqHPRM#~%?Xo^YYCr`eZg7wREeZCQjdAL+D`Pg;gF z$}Uf|SrzaLCtHjDDXh%EogyFh7glF$33CD%@s-9n3=TZB0px<`n{0@Q89t3X1?Nv6 z$M@*Mhsv35t#%L92yJOXntW1J1Rn+AuN6NK=6;Hp&ucX%=OEoNn*W%V>`JS>i;V3Az+vQwGP!ne^E$n5kiN0@Au`}&K^XZds9sJs zu^&G%d^%(Gw)P>2DH4X}J+b#`22i9@MK2%tW|$Irs(a%gNEIL~XV$jWZ`F25{gtpz zWzW&N11F+whxv+Jsjym|AKq7_Ba>@M5NNzsVj=l0X)LQ#|7(YPcZf}t!4~>1R$4Xo7+hAdoJ+cS!_GU>sA$43L;#YRpW3WqfH8`UBxB zVMP>-t_tV);Ov!fUUNbM-t94Xd>ibKo)ul_^+UZe<_*Z{TO^=H3?h}_2lG56hy`c! zgMUL8(xp7HgU9;h#MVCH!NKE@i=nGfn0TOOg0PsfiPFavF+#6^Xr^T=7@|;&sN}=` z6r>wbK=#1oMl}~i^E)_Yz$pog`!K;6)v2mCFZT=af#T%By~$Vdx5%DaHtkZj&S3{v zFeO;w1qliQA<5A7f`?`Q@f%)86hpv);XL`B{n7*rC4!Xfpjh1GfA}uQMLh^iEhhvf zLfdMN@T>d4EzcZm0N+%*r4?LH2l#gnZmxsI)v?`gf4-{c8Z+R9Lt*@37}cAdxf86> zQaH+S3}b6(H#%S0{-W^vSEd0tr(IuT$+|%+RND2X*817ymME+01<&v6vgvNj_VdC? z#ljuq<*U6|aDGnoDSqyZdqGYqqr4C5+OLF>8HmimR>A~2g{2DSr3|IW<*0(HL}ox% zjNaCZNnP*N=9=O)hOa8&Kvs}G@%8A%sqTskm(9@LpDKD*3b9`bk+-=LqxJr7*irY{ zBS#U*zqSuLJTZ+-))p)rs$*|=(e)_%8m5L?sUo}Yl2K9COTwRO8(d2jI-s+Y!Y3R5 zv|GO_X=B`xqawWZf zJFv=)dgTOyL_%*Rtsz&ykw(6?M{aiKOa^FUYjm+eXU3O3xDu>?s`s~Y#!Iy$ts9Ts zskaDz@Thjf+qHC8v$3`AQLVj3iG3o^Jg_K52DZ{f@SlRA5E^W0sWJWFcnXVY835W7DG9>&E5MZK7*-PO)E!gVGdB7Bl=yhl<>?ST55T-N zedIshBL9^zj){?x{r~M`i1{asJ8VJxCyXnnLbtSnM7CStyKXyBQF8D&lpzfp1CJd_ zz>qGMQF^R@9WBF#RoH_ubDO+G3Ks|d{`k1m{BAj@0{S_mrry(U*vQ?xtoxTob#dza zI05fD0IiCQth2pUmy$9o)^r%BQmwUh`<TCDNGQZHmhi8aZHx>fwH303%z_BXF0hvNC zI+mPiokMNYh`&-YMz@VtCbq$?*V1*g6zmivh(Sd%kV8B@C}97rY`0Y>FAl=MG2s^tEv@^;0t5g4&|~|siaXpN$yW&ql`_jdKuSH~Ln&C=@!-Mt zub21`xX4(hV+>49(HZAmla$@_=%SIju!-Ipa^O&SS--O{d{*VsbcH=G4M3E)3> z!kjVqPK_V;P7Tuhxt8V|xPj0=?$96&H+TwU#i#@msqn8VbGH57bUOXG+5 zV=F!0n?SjF(q+We71(tTc&KeQ>Y8odeC@;2jN6|Bi(r{k0E>y0&=+a#&9`scXzquj zTiOY*P7am_ux=a4Pil8clp_#CT;rx@ z9;VDS)GmE^4FoEN&_7R|rIqoO0dIP@2u7UR-~!VPHKXaqR8A|%k|V)jjpQ8wt^5xf zMpYu6y8r8k3mJV>AdqKCaBNYn@NeK!k#P`Yzk&Lh9vWn<>HgKV3Ouu3*%)ZNlW$4m zUG2vFIxgtw+m`IJ@`YMedImfbK8o5$a%Rv0Ke)PaHQ5})dbgdNIn#x#y>w!(1Y0xUNRo1vC2)Odnm{Ev*ID6#P>8_iPf+n|QJEB--8fA6h1QT< zb%2iWumWg!CUhy#!d+naUMQ#Y{o(VZSb6w}JvgZxo)RU7Av-4-9F{_yw-}Zrtc17Vpt&F@kZzv_bD(v4p0&1=raH=zM0 zL=OkHr6r#Ix+1$<3x7_*WKmpg9yU0~5oZ_L()*m}!MENx&a<%YjXlH-JjQz@xAHn+kqi$FrHM6%|fzwKDPD~71`OF-*kjw<}u}!Bgv=Fc22tT>I zhs46R%-Z>Ry`~xVgw)@_9}}oQ(plCIBdr}>LL)V73NNmHm|xn#Z$XQXBfx*hiM!8Z z3L!@-^4+ws$V10pUPlH?n8+L{NBXJL298d3q3!|g9%p~yzK?${_OmUIh-{{&_NP(? zON?s$^-^b9Q9e_Y7ZcVWb(<*LE|jPcGN?)OyP^}ORNF$-6v+6hQb2$IWsz7~L6Hjw zpaJT~D{swAW-kp1G9gTQ0_g~}fDS;0uueb|^WB`RkN;o=c0b_SXL)WMjP7p(A?oQl zgU^99x|2Yc#mTnj!8u1nqZ8PcjrU%$E{I^a+Ci4KT!uHoYH({|U+8{5kv3e{^A;Ky zJ6Crdf{`fGn;@O=`t3kXx7ExJxo4YW(*sRfhJH0{a|U&JH$h7@zgOVB*oeR0CEh0r z->3*Ahjh{&5o{nk-DzX}L@_}&nTtEW96sO54mtJ4B|yx6VRPS!c6}eaKF{)h<42l8 z8UIHZ`L6_mOsxOEC3Di|$p64dy(45BY3yl8zW^6y!?Bh+5%=-5>MWQ=FKlGw8m z&9t0d+e#3HfbeNcX6rYoWBILnx!6y$Ub~eA5&SC8DB*ho`U1&NtxMRLTbhg4|Y zGzt~Lz?F4Fz1(2tif4)JmaRX$7Dh!LQz+_HF~}R=(Hla4*=yL5aY`n-%Gli?n`d*F zrP?RwNa9eZQx%>3GTGgdFzgcD_3zkXlLSwhA4XFnmOfDHy06;}9H`W>?P>k0s={c* z6@4{F4SsDrj?K8H9S+s?|C*{_8SVT9qZghOq`Gv(k!luSyDgM1}j%37N|0pH}ii|FN@ zon_I@;>~gXx#~9@1fdf{bYr&r1L-NPRQG~F=Ua#+zl8KXll7-05nV>)m~w%#pw*`$`ctTj*rfN^Ke2-L^D&bt_-j9 zd4-^YYr^#cKbmW%f*X@^vy#8rHSzK}i^p36NG?HkriN?&&)HwR`Xk*Nq0IjLi3KlH zv)C@9T!)HbPsS*xNtu0)EH2(Oa3%Z#UBatTkCKTts0}06#-HkRk&qft^{H9^9i0R< z2EWm@BuU!DB_Mn^&B@5R7=Zy`C@3K^U?B7d&F!|D|J>H>QiBOoelB9+FM>cxsmD2x zQNPuV4%`;<(vfCXfJ4C$)x9wn}cjb#w>2zZDzZ+)u4MePk};$ zkQsCmMxiTKx3)GBjeCrL2gdu`O;Bd7j(WOELPE)iv?!B{roFD!7#|9CzOZR2Rvm&> z@UsRmya0vsQ5T9H@&FMAT@|8~%yy!%2I)hIZ-rp6L4=vFv467)4K}srOquJLjVgPb z^;9W66P&pw_36R$Rw&dNV%n)h1!|#MEJnM8APpLdvSB}LvvDdhOK&%=Rq*J+tQ`fu z@Vrht3`|NNAl3-3R2~*9f{#fO=NcZ1Z`D~Yuf05>I-0t-O_$&04PB0+o zQCWaF7d*<#JXLRRwUg^V6qYejTQ$Ig1Fcr~BIESFr!_4QC=RQuw;Bn}vO4p0RWn|j zAVIU`K+++sm(!Z;-Cwy7wv$T~nqo8upTCERa2(rXmzkOP@O5km4}ihwIZ2Y+TJpY&vaI} zZ-AqXHnL?V0V4C)X0@U>3;TE&gg4O^ayTC3YU{=d{7^C9uBH_MUbxBAd-sH-F2j@@ ziZ@5QE!MLylUB#N9S&>&kxofpup>dmuYy}dLKxGYP?=O&5P~(FPD)4tG9XPOhQ<+# zN)tzW=zF5HGz3FTdxWv~zyrE-jkywfON6Q06(9@EEAQv%Ar768lsw|0~A&+9_+M@89o z;s6BdT0y$XRW4n@N^(nUO`#v;!YV=<_&y`;H)ZZt#mR-2hLoI#VZD+5+JKv9c(9^h z^WkuYR9%9c?!e=)JV{hg{JzLqKtbzcJ9M5P{+xxU({+JfZp6be-zoN;Ku0q@h+b@W zjw-(SzV{ElnZZQ({L@C8E;AzI#JeLzXXBuI2$l`-MGUsT|vLokE#nR6is+mBCj{3nvq9lh9sE-NwqThzA-|=K^KRQu`hA z&3N-UTFPdWN_YKkjxE2h+U;+*WMQ-~1l3@78I_gA5-Z{TJ{^nBy{SnQI|lkV!~pqx znG8&qPc3XDxIXPuLI~5MNL|U{o^grJZrH3zlQ(9+gE@81mrViePzV=w&V?hinTNA! zXxMY~56&5sI6tDSkbLvglp?wQgU4|avPtr?A5(lesM85-pOxi^Y$W(mktlDLTj+6d@s(L%Heib0JHCpLNxs-72g;d7 zeJeAWU6*`6fT23s!@hVDb@mSB&PY1`q zByEioDRcYbKC2ZSNJh}9R+z0UW}9Tp>fX?Q_0uq>Hxh*ZwjDU{|(bGV#Lg zR7|#CgDNY_=w)h&8?Wx2|FB}Zin1p?_X@W%YU-;>f}*pv(%{{|AGW3By@eIC8MrWc z(%-<^!@Pz*B6$iH4FZ>yiqp2SEyLmcMAq)J&q%Me`8g4AaKFbAU0&)k!#$G|3rLq_ z;!f!ZD-C@I$x%ge9M#Sd?Dtzc(Id*#t4xRkf}O+w@zc?^;fhhusj6S&N}hn8;i1N0 zTb>0#6CB_sqa$KOR{N3YxWbc^ZifO=VxtBgM^8#q%i?m1br>B0BF)@XEAU=I-MfM8 zekL=dK$8lEDK}NjWoB9?A(cjEqw+k}C=U=srZxH+QN1earZ>jHXuu>@Ua1EfY%Xix%y7|q`Ko)%yQMP7nk9FF5TV}6E?MgAUA z0t>nBooGGuMb*a@HDE&kfVaX|5fDHrzY|&u3Hq==T|x``W}~xDnBBBqZ(#|-g%HQ( zKT8RQhN%N_nS)4(zPq8MaLM!WY@Z8}^H6nlbhn~~b>n*_UI!le9Di^~B9GWy=<@Ov zSskxX9OQz%K9_bh*1L1byNS;;GAHL@H?k$RU7~!yOd~@d%6u^1tRLcWcpm9N_+Kd992C!`^lJan9 zLv^PBiNug(mYC^LDjp4ttydt0feD?w^iA^uW*t?XxyA2fkE1zP<8AG?y{>SV*tn%X zyrr@yVHPCOe~cq63t*uq!kyAz}u!Ij4MtLuJa3sMZF zy67ely31%K0Rtt!F9Gog19R-g8$(G5#_BGs6Ba;>gFn4)G!S{#OYGBk6VQx$Z1dIj z1+-RPBZB;1_yee3pntrzhWV7Y$|mSLJgTAvlvp98+fVLHRHfjsj0lc}3k=!p z-9E-&QO-EQPPm%YBNOK6&KPP9&nG5p=8n|-y?E)Mg|@iH4!@Kzt{j&E*o!j&y??mD z8EAz|+}4BFUqHE_#o|~i>QErc3HKFW{c!9_91+Bz;H;l2_GAP6EtPt5FY-*FE z96d=YHYjj8z0-%f+lI@GD1)-xygWw)g% zUm5iQ0EWZFRlM--zN3Q#?3un4-3MN?T27R;!!rdx?>rf>f+)4c1=`fcvn+M&0o^uU zp$m}{fP#h_;XjV3t{I7gM6)pS*_cGoU$|gP!t$`;QJ)Txgz3m(Te9fha^Zo>c-tS6 zTx|SElnaaUjjWk?*zq<1iEeSh1YK4xr~r@ zX6eE3rRl}aUvkj&rRl-1Jz8bgs4|H}>c(bofi;3s%#5I>b?W!BbTQtn;9x(TW?IZL zKwXfV^oQzH7VdgF-X%~!AJ4KXYFMe!8AExiAte$0C2^aX52(a_9P4SbueIDt%ZTW2 zKPAjGQR-o??=;QQUxDVzcX|k2ewJbJNcp3N|A(=Ah!P|~)&*R)ZQHh8UAAr8wr$(C zZL7<+ZQp*oH|NY^Ho4DDX2gjP~3Xvh3 zUrXpMe2a@4tXDqI(Zwk@<%(y~a~K}GWNR1C`HBbuc%3(*EWY3+;>d$he&Y0l#d`g+ z<<(v<7`c%1_$j}QYE|QZbx`Ted{p`=*DCrKspnu?KcaInI_l$7C+srT9ipnp5UYI!zVl zil7rfg|Zoc>Yt3|(3>33x0s3&F;sfJv5j*9hp3O?foG-Zl65+%VMnLw(Lo8K~T|8x}4D#thY$A1lg~Mc&N)i zPjCOV0k7suHFzbuuHsm{aU31gomg9GT389s9_9D7&))|3tn*(h_W#L7W@h5}kK-{T zni_G3qlmt9bqEJx=FuuyK5k=je6FzE0Y+Zr3_x-C97txN>XC_(7Gub7V`Y`}iJ7G= zU@LImFmbAGDlW@vdMZx$Q-O3)Z((#SL4Hvqp3rW31Aebjb9Lx>-38E^2wLi$?Y&y^ zP5IgC2575Ud8wo2Re5!N8Vs}HD>%MEa{Qk!*Q;vOv+s@8>^}!pcE8v3y=yjYU1)V9 z4|y(quX24`IyLDUwQ-x3J%*kh_D!`I%fk#^>X1?}sJ0J7z%T=CdEEv^1L*`{#YCcl z+wF0-wuAK*Ux|CmR56!%Uy;Xk6i`|#J?Q6aYS;%Od#UPhiuo+6U3%Z)iv7@$4{uRE zYM&XEaQG(t(2IpC8 zQx%jTFl+|T)YPaI#!Y95ntAS8JAcT(|80d>YM-4kZfUe~ZAS>eHJx{Yk*E`prl^-gw zRSjbu`ruEjw;!6RF%>D4NulgmWjX%bOf?jep6X195=9u>$%|dl?M$s znNt%4$fn^JDnSE->tUX!qm48{6ey5CybNr;eBGm0J9|)dBGPcW?+aC{8g)dt^V#2m z0&J(Sv&zW_jqENU&79BCEZL*37?S67cL9QO_MCHPPQZ+fkd*&q$OHlC4#94 z%pc=@uX%u5@x;97(l-dmh>c@3A7wxw!@}{9D57VIZ5H;W%kn*C{`U%FXpYp95OjAN z1|{D8N+Xc;^3Il!LDmf+;*k?Xf=PVt_4J7y!JF$$SI+BYe?@_SG>_ZVWcmBSrHerC>Cb;5)GKpu{O#M-fYq4IbA zr~r|Qx!k~z1;NNpEs2q|eM9M|qR}3-sdjm-YT0yl3s6%!Ng<7c9VG{b1SK8AG66Rt zazgg^C@Ms>I^5M;hm{%cuqV{qlWG{HS)Jk^jULC>5#`nH;qY}EwKln5>T?YHgEll* zuKp&k(}=o!S+EosQ)lg-zs)@^FbxwYY+$Mo#J?+MW8_<=E z+)xi()7?AoEnPZG?KB{Bwqwm1azttg!4&x99ctwlV;!WVTw={9W#zT$K?D$gpuC;2 zlA8!;e8Eu`9@SaiR^{ppsB~-Km3F@hsMr%~jNUI^Q6ts#hGThnRGS9J8tXuC!v$41 z!3|-`vD*%W1L=E$m92+Als3vXq=nwNDwkC@8*P0SGlr|ffVUP~sF}Q>c5kyfBkyAv z{Halr+&!`bC`12h`7)$eYKAE?#-PiOSTHUyqTG)#kE)#UpfjS#hxWn5=X21#ar}y@ zVbY(X1TSB-)^!3y>8c}myLJ1G8)5`^9xaIQLTrNANuxdR5Q;;96jTrc6u&3wq|Km4 z&Yux%8ab7}((3_TGz4NW@5hz-lhJ_pPb2ZdTCfp4)tn~gLLN0dVB`3l{(cPN*8$n_4M>U#CSZi%?unzt1!O7m-B>86+s*S_ zE*3G?-l^l`9aP@5JoRKwH|}xoIVs9AJRQ;;D(#}l++?&^MM8vDKz%pNeH0!ClNvMt zf^9)z>&x~Pgao(!6L(y%l}Ya0%ekLe2xDmcptPmO(*^=vC9rXzamSx)yN$V;L0DES z))4@+Wm&-USG?@&;T7os9XzdZ9a~W~&5~{h1vIRd*LnoO^s=n1vyTTMQf0fCGzXWr zk;0=_yV4i1TZJG04nE4_P7=4BWm^C$VxW8@OE^>vkcV=%0;>-yrZ_Zh8Q9%5+*Bn$ zfY_5s1Rq+*M{)tacYd@CqhWEyHv49sL{x?tasCQ7lIl-;yC#AC3Y6XtB5{z4wBMTIR?`7s^utaVWzUb$pWAk6kCHfCqH ziO{&P>z$VLFz$0Iz&pl;NK5e_=3AAS|#hJW~(NMj7ICH0_xRwkT zLh(iS6v#lWA=0dp+AJktaq{u7I2;6&hCQ<6J-6xVKBF|c_<6HM2;M2xT-|KE?;g5d zcZlL`s?Q0C+@T>q+|iTla2`0tXhW)&54U-%<XDF$vp0@crA@rXX$pqrX06+5|sF=v2(39EHA?tPWZ=hFtB_EL;~ zEnB9XJ{Z8+ZN2Ma*0GH3fiF_ZwBAn0qUa~hdr9YfV1d8eCA-$4tTvM}NQWf~k!^Yj z7Sdm|muZ@pdMweYWdUiHoheb<@v3*{JrxV=Y8p8c)8WnZ{!?6TMaehh;f(P%qqL%@ ziUMC)o_;QJuwdfVcG+rDJ-XJ69no++i-z|-)lmzrT5OReq`=*X^@uypV^JERauuMV z=CcDYmWsQ!xRnr+BY-u|yE=jbZ1v^D1 z2lvCeN+KYXtqI`QZF@MO3w!#;nH7iqFLK&ty2a(Xi^|gVl1NBt4@r3ZJCaDE*CePB z8?uN|yxEz-IlgdCW2v>vKio?Ara9fJ`w2OBkI9yH@ElIJrH>g8iuRz*Aw;q^E$8x`B<~KH|LbFt(CA5JbHC*mjuP z2g~bc{g!q~z1HuhW*?_}srkF>GJEUm62n3}G(n)<&Kxk91BpUBjncskc%%ANtKH}H z$Q0s34u0Tp)1Aq)Y*7n5+n(u(a=3U;>Aj$OS$R8k0}1aIL0_PAilFB@28P-{)#Ys$ zYAD62GW$9I_>OyEDN|ivc93eZTzZdL2j5tNjAR@ll9T_SEjHZzIarI&U^q3ZYZ%q= zyp_fg5UZKlJ03xN`SOL%j?$+Sj&K*Z`ul#b$M2m%N+b_iERT`JO8)?Ib1zjO{MK2) zk#N@>$`tX_F_$_BaThUzAgUBNN`ivstvOTE!~3{fu?N|Wmq%D%km+Xj`d2Fni@wUP z@W`_b&0HoBysh*T|ILnf2=IQ~GyHvJj_;5p8z~cGAlVVBck7cL>EuN~xNzR{OH`0bL5j@3)@7EXhWUs7Z)`m$(#H^RO2bf-8DRyN;68PMt10k2HW@ zgakC-v&sE5At1_g>Q4e#2X&UW6%N5NmcxcU*SBp_N9exA=CiObN4`IQ6y-B)#Hn>e zP5a090w*>Fa3mK2R1i;VHx_$&D4C)N+bgZwvP#1n->xALKTc%38E?cCq!3Aq>(MzN!648s zefA`9r0T^KB_?v;KWi?sBxI5jgM2hN7_(5;t82MjE|iy=cFnBC_TjTI;eHp^9}s7M zpnm-_zunnCe|WPP|KPY-yS_3QxsHN3EY9Aj{?__xu7(*c&7up1M?SVah9ozBbZlRp zY$?A@`Q7}mCH+4*YdU;R-Rf&Oq&V4p%wR9vWbyaSsHs{`hgr{lpz^Tu-p%(n_f0~v|m!xuu&d7MRdhq~k2L}Ce2yoVB`L7MS zomH-ZOChI)Vjq? zB#3ffo|eM(CX4vD`x=|w0nFta%Cy%8-jMTW7?OJkNo0{vq{KLT^Q}>f%^v0mDGa}= z9EUQ4do@2h^xXt+ClI~Q>(5ZwE#K_DTqijJ@YsC=`L7ir1N2FFqv732UHjm-MbuAO z=P7{Y2OLD-ijD=Z>^~Ztf=`H!@9K2`iJxZE5WrfQv>ui4Dje|7n-~al7TGhk)kbNs z5gp(~L=4`AjT#tJ&^b~f<7~9rYnhR~>^k}&V(t1m`qkVzF4C-S42T#77$1&M>lw0G z-!kFi)&V>y^|9Im*1WLOLsGi6@+SwF1n86>M8td!9zO5>KBTb_zYK{!G={^m#@|!T z9+5}Bxs=KaxgWgPSMOqJzL8-rn}qWFeTkvckBuH$QG)@JzvPhO`9SECP$K)+KCm5A zEGqBS&C-()DKFDOCEEUKby+$SDPqE|R8v#7#k)B&P^3S?oi>O+(Y2aD+^keo|S z_$>ijckVQftqyxp%8)CcV<`R|g(^K?(K~c&rMLu)w7`fwrdikwycp=zV?q)#>GI!1 zp`fkGDmcn1$>#td_UXUSm><4c!$fDGmB{+YU3nve`kn*fh8C1lN}C@YZs}u_C|?Xm zl+{I^03TBIf+b)f2D#=1VHJB{`Rqe!;HDua#Fy6G%Lhn&go zDMY`oZoePbLv?vFK!qE9Ne&CN8@%CXBYyi&*6e3-pi$S`^(#Bp8v_^!4{2mDBu*3^j91 z;(^M5IQ17%YB1c|(GM9!0Xw|G_V(p*m*1|x7ERT{E54tN5+LuAm(+kfmOdm1^bUtc*_q*9W;|zZDSi}_}?6PQ#ld+H(^fha` z2cD2MY~y6via<$T>prpSbmX~Y$}8*yO<)~ujU2Ppw@o^liG#C#U7y$EL>SaXdO7+> z<348uYR`26f_6)6U)E)v8?2)>;@`)V^f*T*s zZq56H>%u>9dAIy_W{G#m38u|v5@Qe@?ei>|Y5b*KR*xreoq zT^?Fo77Qg?LOl>zKGZHj9HpeP3+f_{T?0Jsl@Oln3$5tb_cd4}G-K#bn4^|kq08EP zP(Tk;-~mdK*^Q&$QPgx=z^WT;GuWM*>@23Yu~fQ@8pa-spO&AWQt0B&Er6Dl--dQ2 zv6EM2U-@C8InjpckJY@FemlZmRfo9}o>Od4KBc?jTnj~6Fan?)U$MHDVGb>wz%RhL zI>~!)68SM6Si?QN)Ytlq*u-X;$Vaw0@RR_*2#M=l!9M}sda88Ax%Gu)-Nj;quqUW( z&8=Pa3LH9XC7{_BN_1(PNQr7zScz_|Srv~sj-=Obpj)h5rnSU+fUS)20J9g_4v!u+GwG4w^&|9t{SDovyd0~am_6Kqjlvi1%clSi8@4kj z{5UGiwlFZ4MuSxLqXNcRs&CvbIaGtzfJV)1lbmH4GbOA!&l%3L(w95KPjy z2FziyYyx^xdxx`g#i0I&U4~sDpg2cyK6V?0V&zj{zv<}cmlC)c`?PLm`e=T@T!oGn z$coc#=;8sqxPbv#bX1d5#dvs`h|03M+-F^H{qg@7)R`3d;2Pl{~O(@3t{-b)sY2O=!*;eWtx;#lrnoyFhFRdlZ*W5d=+9KSXnk9RIRcc=Y39In{?b#A z9={;DP#K%6P88>2XL~2FW#ME+=4dm|yZe(UJZ+LG6Qn6d<~sECKT`Bbc#XVHox1-D z=`PdS>fT@d)dGcx!1OrYK@?TLlt}5~UD1LC`_!&AMua!1cFnJ6#A#wNA7(!qRCVEj z(cWuRgJND;X+r#c8u(jcz{>2bCA_w21}ji!NLOCPGy29>itrdn+BBS(T>V-1h6gzS zHymc!jjdKpQea^)lxFX-Y`)Nn2hYqX7ONqm)F4SweVSqE({tT>B4V>t zN~U6GL{hvL-Z}|d1+FE8c94rHO8Hywd>i02Gz!UKtWTIiQQGn};!`h9qhJFW+sgN+!ojWq7pKt9A5vfW&l(^6~ zyN8~HPPFO6pX*2zV3p6M;&7l!Xxxy3N(-etlj#odKu1M4cEG%?hY%3g$ds$3r!&&) z0E0JSo*HpVN~q1Dbn{WyrqS<%vlprEmcnf_dY1CY&!U80B>q7ceDRs8Vy}tdlv^}OM<1{_c01hPW5USRgI^fg zb5&QziK(*%A_agk9DwWm?&y{yLJ5;nkl?F(T;}pqH5U!5@T$}!u+}J+sbx`L>d`== zZ5-^0SeNd0y^4!i*Q;xN{GoYATrE{W|Er{9s3NN=IVr-&52A4hJ58bBq+zhN(Xa_) zDz)GcAkahmz@TX@()H>^;K*+hSp>CrZtKp6$8-L^l+!LZMXL`x|Hj8%MYIm34auK4Sr|L#ZdIZrok?5}Uo;MG?D zk#ljZV#V-K|J!BTFW@H5pvHgwvi(n}G$Si3=l{RR+M~Yd_-`HF=T_}5VKNxv2H^XI zLv}1j`jEqtDQOCrRxq`+xjbI^;^?xgJs!fKH;2zkb@BFSetbI<>c8+!&Xy4j%h?w@}!^WFuSzm z*^(=tvO%s_=0}nZL6Q+1{(@WMoWBiY!uy1?Wd%Al2zF!YBdJRQ$ zbqQo3`#IMu6A!x`VvY_clU(8dvY5Rb95)MI0y)L0r+<^xQ;Zoc-+nz>8&YTgLMqYjYx)7XO-~fKyaiz8xW)iNBUY z6a_zYIfmbNK^E45Po>Zhu7-83+yxKlCpu!RG*r4i^8Dsp~v#RA>4?v(*)E zrYiL3#1b0XyM#A`P=kPw%VE7kJfnzM{2~nv^#y>s&E`z&^J;uAaOFiuMS>km0Fl97 zr*+4ZOCHUE$5pr+u*RDtow8--y2xJhTC_3P#jMNgN#*@Sx{HHu=DSm#m~8y)GeHzl zst8>5nI>ahD+1wXYmFvyPzZ3~h1<>mmBTiCJ0G~D;7imbE3_@jrANEEfWzFr=2T9W z3FdXwG@=4mqH;2ZB5@^GRZ{~oA*G;VrR`WjRf!Bk+GvxxwPMKV?sRaB@yMvx9gK z0in$Ve!yR-;c~F#IJ7B}L?7mFv`c557QC9bKuG5N=8oU@Eg?73MqZv6?rt-mR1Jlo z82OwZcQ!GGMzxDgm-nHfm~l)FP;Qa4TJ9k1>R#a}j+F|^nG%h*`yLgEaaoBSwlxg6 zHNfj6uX3v=T!zOT@;!Ok34ww-ax9q9On@HG|a-RSQUnmx@MTB=eaNS30BHKrcFJ9WA>Cey&8nHr)l#95t`oAYpT& z8q5`gleIEc#2Z6}l#;YRCC2G0g4m}I=?#!8u@SvJ|dR-gPB zyNfJU?eBnQtlQk8BGHjf?x4|;hI{Q#&YcMxEH}b03?d`8YLVra@i-2(FVSz7?Tmb^ z9Z8ySc9d95N;f*L#7)T9ut|(%#aPE4y;=L-G{V{NOu^}DKSL(w{F|f6HwzF_#Uh35 zIa-o|f;!x_5vU-q0o?Uc_IL6c$NY0S7t<~sw%^v!g-~BHNbKUg(6%xWz;m4;dW-5b zR#G}E)W-77arsHU3?YlP-lh9*9948dm&P!ivXGeLtvYB6LKH!%6`v?V@n@XxCP-Vk zUK)W&`$vPe+zgvh46ogbIOkD}JnC}omQQ=a!GD|-_R@BBai>}_wv8_w`}bH;UtV;O(brPKIhg6 zq|oL6u`Xa|(LW{{NtL2YvldS}%3lB^@d_>X2LbhGPMpHed-VhatS5}UYA7;UGiTfB zeHFnc#v;8-6N?<^BhkFwJNJ6?!|v&f%En-R>P}%3mC0|tJTv`^+_x5Kc3fjBHW7!u2>u?kti=bwj`{ishJig=7wAN z`SrJl3n{}e_@rOtmujzVY*?Z(86q_oVGBj2O85?glw}I+ZrqS^iRWhy<~$H-!ad%R z+BEkx*b$Xhut|ACIF_7s2pK$tq+{uohW|%k6=x_Lf{4kEb=6^;CNO)P9r5(8@scZdv{n#nZ25-s1d%c6@y=wHf|TCcKz&%Xry8Os0q~HWAEV~ z7on0L<=V;0t84*IGd3`RBf%b}aiyUXf$~ zmW06i9@w-2dqJj@4&YnA7qMDwsn<3H<|x}3FRl5rFtgMcVFzq7JfO#jR&l}~sb+Ws zM6<-b$UlMP^C$-a5qm0aHF0hEE(z^>w23Ti8y#c#E#G2(Lac51J1e&8N{cEsa+y7a z4t1AtV-L23jB75Hw_vv&z=;x$PR&s~__%aA0eNzlA$m0dy7q&g9uL z8gUOA*Yj)LEu6J2P2^co`U_~>xNuPbt>A` zOF9w#)74Hdq)ql(Rq^R8<&^Uk2b~xf{B6w|wW-bs<}iB#ft`A8nwb|3*0G^@ehn=kA1ni#v7o;4yf}lU#+%}V&5*R9B)qnK^^Y}h@Gq3$Vz8z zy0l!IG3lkhGZ-pbJ3>Pf@ ze7TX&^+K@U@G{_Kj_?n&wfp%^a-!4Iq<<*a@a5$vyaenMGFI?B(~~3ns+;BnuzvbK@taWLa#{$bie~ ztO~wY3ky4mI6ZTx%ZA19H0Y#UknwK1khERXBzq<#V!dAHr{(XntEm< zbSAc}?oo0OI_NB_kFvrUGxGvK#2ZoRyG z3kP0{-)$?Ht~~#GhV6LI2#Ktw*C(O>s@Z zQVJybHlCt7B=;g6G?S5*C@fBMZ@8J{W>%h(ji6&$RMt1#(X>A0iSieAkXo1ERn%eI z?|$v+HNfYnJ;bmcnF;fW`ufTHsQqi|9Gb);`A;p|&e+O%nho!&>u+>f^=VQ!RUWZx zv4FNm)7xy~fEv~+TVw&a8DqpTcaGN@XS*d5b-rSOWP4ALPg z-upiN?y_0HsaLCi>aiZc`I5oYOv?;j{nhOx0jR~d7r!&Fh6$MYhyD>mEd^KLo|U`C zJGBhSxw`(ME(i6N z1~a-O2t4NxSCs;9?iXuB55en>KNuYKFwgR#FK`lX1=ZCUYDC7sfcvY zz^XmUzOO>Z@^tk@gP!}q+m=GQVghCv$OBJ^_1aJa5Ug>cL-tOx(fG>Uv;$5(RI zX&`cqBt!7~E=pZrAp~0_;ZR%Q`Os-#2IVKqav3n25jS?@csgQ-()bYm$i8}vJOANb znrQbB2<;uG_%RGLan`#{3teBL9}K_mdFlQ)hdKFn83QE*=pH`hwj%s!ZDvOsjP(b0 z43MS?;h8u#9EpqxMo_1#Z^A~?8jHPU2i@6-D!tyCiK3*vzV(Em(>vMB=LtF4cazAs zHlrH5tu561dEv+5XXXEI#VhCkLOB9hiT?9@rSRgC-2^H)I_(^(6#G}^K-Lu1J=cjIZe@2$lHlo z?T-n+vy2z9b*P+g$M=}DLk_kD08y_}^44|^^{Ar~lzOtqK#JGfHm^Se6}GC2+EQaA zH24#w-?()Y_nB``Ejud@^ZL9WXxpElI)2=qo+t@gNT9Fcq8FV@-KO<0Q+1E@Wgx&> zbE`hRy{aFz7Hu}+CYvhOg#pw%;Q^HsZEh+cF?+1~(LWsBx__m3G&ECso}KqP9T|Fk zi^!x;a5xNkhd#DrPA~~T{H*$Xh>#Uds2bZkUbT)uh^A7Y0Q#c4(}4|#?1>|<&Zkg} zsU3Bb0Uh&3S=D%OeD!KRSt4-&P<_$uwa}qsxu3GWq&U>*FQCCr7g_x zO%*e=Eubxxk6QPdV7Dlps1IYFugccrAXQSa(iN%7{9q*dfjK3QL6E1qY5tz-A813S zU>o%yIkdT)y-4Z;VO7I4PWR9bXbCW4WF8x5)+G)ibu@1EZLq>q3+ynqIZfLP*nWiX zAI%G$Xo751c`O2G2ly1a%UDz%)qe?uS>B;cLxq-`DuvKEG8!IeOXh5Ib*nq{S6SfS#R`HTodPKpqu`D2cas2@ z%wRTw(*o49Ro!5uJqMnJ?b;>Wl_lR`=2&U*toFEkhi9tQB~_XM2qG)jS*B5r18JlI zZSlcWu_*85q$uqa9Ez>v#K*IEOhlPw{}BvpCvckjE0SJSSw@ibltv(36F3KuTKPPK zBkSL%xCz6OZL(PkyMK1ZQ}2sf^Fhr8T5fL9VzYWyK^j_Yqqj7Z5X#*Q0%3boTtAY9 zPZVDayFrvD?Mu|E8L$JUsAE4=Bo=yv8%RNTg64UElpU?lP6&<2QUXUn=`1q$RB+LG z(HzIjmR8xGZ_b0xQ(&Q^LtE8$$)eA|_%AK7gCZ`7-{EcmK}1KHh3+|7qGSkMNByLN zMKf@bjF;89qS1wG&gkNar3lbxr12V6d!N}{?3I#++A9zmi)E?);(9w^fOY7)cW)qz-x(P(RYD!;*XKPON5q5e}&` z&us`u(>-jpxSY-}!@`Q{Cm4|K(E(&pKwrW@RQaW%unIYltB7jgNO#myS*X6}P(1F? zO0s|z8)0{VGURAFR5fFI>Wu_C^WG@dx7b;fX0aZa4MfeZvbnOINBMkyN${u2iBCpC zwQPD$Y{;{^6HGKKG4G&*<{A3fY)U)LJM-FpJT=my^YNrKK3zeGY{cKe7>v$OKG1Bx z6Y2-kEr&?FA-k%7?G{^tpKuUWBP@2^p;@!khxrf5#&_+7r?mT*BnB5kP#1TlHWGLm z8~cWKhD`X@#o6>vxJz1i;paz8?$vQUjF;L3LOL|+*J&^8WRo;tka1Q9K`a?=Ux>?i zjLPY0o~laQWfnNTYG2)L*gHH0%-uOH7uz3Rzk5J;HC_^n{dn*U^HB1LgkM_2(d>zD zuuxQnAlz6@z;|Rk4s`pacqXXvHz$G}0e$ws3xf$EE=aK#`byn_;YKwKHPX44XT=XfBfURl(DcN-{U&Pig%s0IyOj3he5(NL)`TR)kD%10uyt6C-=U=(c11^_N< zv7Dwuj-vc}iZao6T2-)$V5sq!hU+NfaTEE0m?k0Xl$hdhUW%!TCkY&R{if(VqjqkB z)UzM|NV+M{1?x)IZ}alrTKtQf!2+BEX+$^~DmaV?42`tL0}=+5dKx-K1oh_aghl-` zRjk7b`VNNlm;9WS%&WZTv4Jw`crmmP%(i{mQ)*By>+-SpavgRO-1@*y>~7DkOQ~9- zOZ0SB+Vilfzs4CZ$$Hc5{jTFzyEfdNeb=e6tL=E3=YQkS)01KlKj&G6eG0t{{KwlD zo+Sa`S6iDI>11UJrlC#ql5(Cnz!FV;{cjb-e`SYP31Tfd5SX3|d(5*WbgKEm1? z;seFbnb9SrOI-7>C$<|r~^%lT&4ZRj7 z$_JY%{}$d=FiW=SvO%0TmBJOKaZY^}_xyuYw*j6;y&v_e0&h5MZ=5`#%YP8sNsK>R z`V49RGVkdC4Ud`jY8-t*;9op8L`3Rpwo?L}#bSvQv&|Vr_Y#~AOcxx#gPN>g zjR8I+(3;xo6l9a$i)Vh05PWIp()O%Fd3xzmPf9z65bp31NGo`rtfit`Xn2%Pc80r- zvV*dY8v`aD^UxtLT3emb4wT33oIaTdWsW#$uj$&N7wER$fjq#v9Objheq^{J=f*y+ zZj&Faz3P)kf|!Vf_t+an@)P0_{ z5VO@fH5kGbMAE<{!D?a*>hfybOKq2(gjo@sIWcWoB6foWy(G!ilIqfJnMi*z&%B-g z@o&jY#%15{4UbE@^;P-Omag+^fHrd`y@0~RaB$~l%BBscn$9gJM!$3*j|ae(`S%o3ZhQq8IVqCFMqh_d2H zfsl0fkwO_XQeTne@~HTo@FyvyOGaE-oT}y|M#|B8=XnBed-bzFU8BG4;7)ig0 z3&kCk4kSNG>m)5v108pYd|4rsrn675N31%)5qSvX4hnKZhV7baUPC3Xp{)QpR=!a= z=ESv~{S;dEg>fMk zRCx69TEh?RJlpGPER2|^@fV{0*4CWhdENGp8kFL5&9P8epqaePd=1NO1^teu61*?iIlI8!)cGX$X8v6$&Y~#<^8~Buyuub{QGIQN( zp1oI?LSdGLmWN|0t>etwtySsw#o}EjOOfT%Bk{Ml>-UH2%OU;`EcTc4e+{f~{!hv| z6B|3ne~fiCw465EQGIXg_Bi1GnT%-ci2|7u(QT5hZA+!=YdNxJJ@CyUTGAv6Qi}JT zY2Vkp;OI!n1sqFZvUEU%cYAx2yh3PC_4zd`C!6{KR z^zI)gtCn56e|f`cADeqx@@~6K+YnfAGq-VP$Dax>D?{|pg>PLC_6b8sIO&t3Q;HD= zubgshF92WmkV022LWXd_HZPQNR0ysIX1{*8P+duC(ci|#!2=2bM)p}~%w+c-dCOUi zKWp(q!%kIS_H^^_TTF{ADzvf#5a-2SP+vzYaWiSL1~1m5|Ga1D1LmF|7J>TkZhbf` zFWX+p-W>U4r|!0Hw_;r_)vm7%tWWLg=Ka2WEU({d1vufMlB6zy`q6c<5Iy z{d)+gp6q;LMern#3rB4I`D&DQTdCtXEj~k!W4Qha)@>jtj7~-}DnLPChAA@7rXty= ziZ0}dCelEH5=dtx1+>-<208*Ep8(DGd(Y(;p`P{gb!e_StHspRe)s~XU05V3O7k(tlRGhpf#-Pzu~#A ztwff_QL*$haA5aL&6k$`*Om1o{2i>VRcl;BCte>mx69qqj&CI@yJU*6GHyJA&gTkH zV(iF4K>9cp2Hq=KwJXH%1k~PMw>>0>QGBI{)DRneZ)=cx{prQL%Qal1ST{kGtVE*E z?tbs}P4C+S@bcnjtJgn{VV!qa76261yKJ3C0jpY8{zzZ|Y*JrjL=m~NUCANp0iO4a z9I+1|#nr9FM*tD-688r$ndI$uI1xSg|F5K}O!xvtezIaal) zAR?7JE(GWhbbo8JwyH|y3MF2rao%>JabtZZ^|}_n6PS$Z#(guRIxs=0ESo7`cU`R$ z>yI10rO7FEm+$(`_PfKPJR&(A8VyZZF$YxYyaEyZ(vpD=LPaFwYk!)&5$qWT(u!8+ z^45l#7ZC;qEOb%9-g&2^_VuWJL+8%=m`zJ%jX$nZ7j@L%ku7Kx&lX+XZ_NRaOQcl0X=kf6{z|Ev`N zFresl?@^h{nV_895t2|4SuW^|`vP_fo4?PVc2%Uc{&(W@3{waOM)j%CL?zCh)fZam zIfylY9^{*OU05@y0#`Jd)tk_;k+_wxsW6$E1!1#3%))-|t?Pim?rvtg_5=H*8QT69 zTIBkc!9~a}foc7C?XezWOHWe$GvZbth&#W4y2?~GZn7mdPHnkd;nEW2b;sErcACJC z*W}pCK3z44@i*4(c39Zma!;UqEO|P*W%zVEJwKOvjZ;-oRqUx)z3x5^E(TJ33`Att z@?5g{DJY_~TS^uA45zNue+c)n2ez?;5yqs@iNOt=w&p=r=9D}2R&~B9mfO4zIT@0l z9qgL$!hO08DHP@5DIY6SYAm&4-Kf(e(V+U*0xL8O`7KYNMAZ>ZxIa)fJ>qD!SgYNZ zU#!AscNr~-!;k?~i(Es$R&zwxI`s_St6r3zW{;>bsBj;^>uq|fY}uYCO>*fXs7~M< z&gF)_B1O;*SJZoQd-#D*^F$wUt0~L~M3-6)DfCrwPXQ7W9goaL{bu7AXj%57ajzMv z{oChaYVZ)Bs4y0Yy}E8Q-4&e}mfbD%YoYA37Bp$2xwyM|uTn8Q#gJ1C{k^~jSV0F# zguohr*j;C0NS#tgj?b65G8ajoV0O~UY3VrjN%qaT4JT3mJg{*SS9 z*b*#Slx^C!ZQHhORI1XpZQHhO+qP}ndUapx-Z4(&^!69*6(d%xIgLA9@$8b}D+ot} z`o<`G$owFSuY6*M&rOl2 z#y!^u04x!{-o74LW${8Ww<)UzMgY=>qBT_mid11wqE{yky8agdC@olrRFz ztq!xyuu?j}+kIACif3hm=P?j`t{HtpvdkyNf{-S{l!;xl<~r~8?J?3^FF31UAOO-| z0-!=@H|ussKqiU`&}W*_rG4^t?v+kDFJFJ2%(Rk0J;dK5XzcuY*$lerZHq30Q>CO1 z|H^(VXmm{ou^MKHM$nX&MqCx22I(mp^ok-;Lmiba8wA4Q%}%-{2oGEgghria8>sX1 zYsx(^!Xa?jr*d9~mNRuX;g^Vn7vjO{)syffbiv3edeFGJU>Y+zR5U6dk2nlqBq8^f z8Vy-4Ui;WE_}iNfW(VGG)37{Vx4f4=a=Zm2)jVMGKbw)oGit1;(PwUg9};Rl%=dhq z?Fc}@i_>2@*VAVzS{VZH5EtGQuq6n3yAa)n5bT8b0kyx(&EMcU2sX2^qvpMUs5MR~ zDe2c;h!ir{B1g={4-oL=Q1CkF1hvA|5C%L1k0D`gnC4c>rqZ>`QX75jm2W%lf}t5?%VZr^$uZokZtzA z<8Fs+%0^yJ_gHjyrv%E*?YIC&Kz5HC3js`raBa1odF%NGCpWr8KpR<&Ht*;D-9-2s zl%u6CBRm~2GV8_51<(sh=WYkw)jV)qnKtG5Bqu(?GM8uC=o=% zjVJK(J`UF!wOn|mqOKyOm_T$Dp}+bTTuG!=W>!B5Qg}X&i*eWDM`=I3xUr2X+K5vz zszD}xJG`I(zMU%!(^X3oPnOS)>y8Dgprvg9yAB*?@%C5o4#`u5c*3%lBHk)GqGfG4l6ILs4 z-`^Q8fS7BNj3YABTC!uM~n+$Us8pv)IvJp%mk@@@3 z%zi&4onMDwjuK0M`_Qtedxj%cuYbOuR%81r+UsiSM0l)|L($6+Q&hGXNNh+Y*AK4| zy$O0qNqDYW{y zCBk&lvf2x6J1zSstUZ&xauAPhts#O(HFR%=*}QZL0KUeI?MOlZ#43tcF}BK9v@~X_ zbdbfg)M;(lkUN;`5fAOo=!w4)Bowv6;3YVfijvLS)=z4y-L#Ev)vjo52yY$mngV7a z?Kl?hnXAnh z4hZd(a!Uk!Vxx5^!H1c25*R}I{l*0FjCZN~QGfTMyqe!pcv6hW7Kz)2StJ?9Io>Gl zabqSa7VsSpXGF({wABK!jdzkqQ0@R`;F%-+++uvdRjHlKBGiSvleea1!-6!T9gME25@u0
        IRImybQU%R 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

        )hnAlHf4wmoc#ERR(yK^tzMw;fLJQaxGYU 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 xBfX5%FLLb)PjBY7Kj47ywi`8pk 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

        ~l709C4iU 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

        X~+} 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­R<9qu0EBTd_>Fe5bag43o6#Vs{rl= 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 literal 0 HcmV?d00001 -- 2.30.2

        x4vw0Jc~Q&dZ-?` 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

      2. M+X-Y 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 ~ttJ_CTZZThW>^*^Z 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 ^6brZikCNpUyRe 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Ý~vVt9KY6hH~-in~rY&@4hfkQhV;)wuo@5 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